From d45b9ba98c81f39a97a4dca604c41e658976707d Mon Sep 17 00:00:00 2001 From: Simon1511 Date: Fri, 9 Dec 2022 17:43:13 +0100 Subject: [PATCH] A525FXXU4CVJB Change-Id: I6078d2da0596f8d72b3d9edab12520ddd67b4e21 --- arch/arm64/boot/dts/samsung/Makefile | 34 + .../a71/sm7150-sec-a71-battery-can-r00.dtsi | 26 - .../a71/sm7150-sec-a71-can-pinctrl-r00.dtsi | 48 - .../a71/sm7150-sec-a71-can-pinctrl-r01.dtsi | 28 - .../a71/sm7150-sec-a71-can-pinctrl-r02.dtsi | 28 - .../a71/sm7150-sec-a71-can-pinctrl-r03.dtsi | 28 - .../a71/sm7150-sec-a71-can-pinctrl-r04.dtsi | 28 - .../a71/sm7150-sec-a71-can-pinctrl-r05.dtsi | 28 - .../a71/sm7150-sec-a71-can-pinctrl-r06.dtsi | 54 - .../samsung/a71/sm7150-sec-a71-can-r00.dtsi | 46 - .../samsung/a71/sm7150-sec-a71-can-r01.dtsi | 17 - .../samsung/a71/sm7150-sec-a71-can-r02.dtsi | 17 - .../samsung/a71/sm7150-sec-a71-can-r03.dtsi | 17 - .../samsung/a71/sm7150-sec-a71-can-r04.dtsi | 16 - .../samsung/a71/sm7150-sec-a71-can-r05.dtsi | 25 - .../samsung/a71/sm7150-sec-a71-can-r06.dtsi | 94 - .../sm7150-sec-a71-eur-ldu-pinctrl-r00.dtsi | 48 - .../sm7150-sec-a71-eur-ldu-pinctrl-r01.dtsi | 28 - .../sm7150-sec-a71-eur-ldu-pinctrl-r02.dtsi | 28 - .../sm7150-sec-a71-eur-ldu-pinctrl-r03.dtsi | 28 - .../sm7150-sec-a71-eur-ldu-pinctrl-r04.dtsi | 28 - .../sm7150-sec-a71-eur-ldu-pinctrl-r05.dtsi | 26 - .../sm7150-sec-a71-eur-ldu-pinctrl-r06.dtsi | 53 - .../a71/sm7150-sec-a71-eur-ldu-r00.dtsi | 36 - .../a71/sm7150-sec-a71-eur-ldu-r01.dtsi | 17 - .../a71/sm7150-sec-a71-eur-ldu-r02.dtsi | 17 - .../a71/sm7150-sec-a71-eur-ldu-r03.dtsi | 17 - .../a71/sm7150-sec-a71-eur-ldu-r04.dtsi | 17 - .../a71/sm7150-sec-a71-eur-ldu-r05.dtsi | 18 - .../a71/sm7150-sec-a71-eur-ldu-r06.dtsi | 46 - .../a71/sm7150-sec-a71-eur-pinctrl-r00.dtsi | 46 - .../a71/sm7150-sec-a71-eur-pinctrl-r01.dtsi | 28 - .../a71/sm7150-sec-a71-eur-pinctrl-r02.dtsi | 28 - .../a71/sm7150-sec-a71-eur-pinctrl-r03.dtsi | 28 - .../a71/sm7150-sec-a71-eur-pinctrl-r04.dtsi | 28 - .../a71/sm7150-sec-a71-eur-pinctrl-r05.dtsi | 26 - .../a71/sm7150-sec-a71-eur-pinctrl-r06.dtsi | 54 - .../a71/sm7150-sec-a71-eur-pinctrl-r07.dtsi | 27 - .../samsung/a71/sm7150-sec-a71-eur-r00.dtsi | 36 - .../samsung/a71/sm7150-sec-a71-eur-r01.dtsi | 17 - .../samsung/a71/sm7150-sec-a71-eur-r02.dtsi | 17 - .../samsung/a71/sm7150-sec-a71-eur-r03.dtsi | 17 - .../samsung/a71/sm7150-sec-a71-eur-r04.dtsi | 16 - .../samsung/a71/sm7150-sec-a71-eur-r05.dtsi | 20 - .../samsung/a71/sm7150-sec-a71-eur-r06.dtsi | 86 - .../samsung/a71/sm7150-sec-a71-eur-r07.dtsi | 32 - .../a71/sm7150-sec-a71-swa-pinctrl-r00.dtsi | 48 - .../a71/sm7150-sec-a71-swa-pinctrl-r01.dtsi | 28 - .../a71/sm7150-sec-a71-swa-pinctrl-r02.dtsi | 28 - .../a71/sm7150-sec-a71-swa-pinctrl-r03.dtsi | 28 - .../samsung/a71/sm7150-sec-a71-swa-r00.dtsi | 36 - .../samsung/a71/sm7150-sec-a71-swa-r01.dtsi | 17 - .../samsung/a71/sm7150-sec-a71-swa-r02.dtsi | 17 - .../samsung/a71/sm7150-sec-a71-swa-r03.dtsi | 17 - .../atoll-sec-a52q-eur-overlay-r00.dts | 7140 +++++- .../atoll-sec-a52q-eur-overlay-r01.dts | 7155 +++++- .../atoll-sec-a52q-eur-overlay-r02.dts | 7175 +++++- .../atoll-sec-a52q-eur-overlay-r04.dts | 7239 +++++- .../atoll-sec-a52q-eur-overlay-r05.dts | 7254 +++++- .../atoll-sec-a52q-eur-overlay-r06.dts | 7268 +++++- .../samsung/atoll-sec-a52q-input-common.dtsi | 170 - .../atoll-sec-a52q-ltn-overlay-r04.dts | 25 - .../atoll-sec-a52q-ltn-overlay-r05.dts | 25 - .../atoll-sec-a52q-ltn-overlay-r06.dts | 25 - .../samsung/atoll-sec-a52q-pinctrl-r00.dtsi | 687 - .../samsung/atoll-sec-a52q-pinctrl-r01.dtsi | 73 - .../samsung/atoll-sec-a52q-pinctrl-r02.dtsi | 99 - .../samsung/atoll-sec-a52q-pinctrl-r04.dtsi | 74 - .../samsung/atoll-sec-a52q-pinctrl-r05.dtsi | 74 - .../samsung/atoll-sec-a52q-pinctrl-r06.dtsi | 74 - .../dts/samsung/atoll-sec-a52q-pm-common.dtsi | 169 - .../boot/dts/samsung/atoll-sec-a52q-r00.dtsi | 104 - .../boot/dts/samsung/atoll-sec-a52q-r01.dtsi | 23 - .../boot/dts/samsung/atoll-sec-a52q-r02.dtsi | 24 - .../boot/dts/samsung/atoll-sec-a52q-r04.dtsi | 26 - .../boot/dts/samsung/atoll-sec-a52q-r05.dtsi | 18 - .../boot/dts/samsung/atoll-sec-a52q-r06.dtsi | 25 - .../dts/samsung/atoll-sec-a72q-common.dtsi | 28 - .../atoll-sec-a72q-eur-overlay-r00.dts | 7044 +++++- .../atoll-sec-a72q-eur-overlay-r01.dts | 7059 +++++- .../atoll-sec-a72q-eur-overlay-r02.dts | 7176 +++++- .../atoll-sec-a72q-eur-overlay-r04.dts | 7190 +++++- .../atoll-sec-a72q-eur-overlay-r05.dts | 7204 +++++- .../samsung/atoll-sec-a72q-input-common.dtsi | 139 - .../atoll-sec-a72q-ltn-overlay-r00.dts | 25 - .../atoll-sec-a72q-ltn-overlay-r01.dts | 25 - .../atoll-sec-a72q-ltn-overlay-r02.dts | 25 - .../atoll-sec-a72q-ltn-overlay-r04.dts | 25 - .../atoll-sec-a72q-ltn-overlay-r05.dts | 25 - .../samsung/atoll-sec-a72q-pinctrl-r00.dtsi | 653 - .../samsung/atoll-sec-a72q-pinctrl-r01.dtsi | 56 - .../samsung/atoll-sec-a72q-pinctrl-r02.dtsi | 57 - .../samsung/atoll-sec-a72q-pinctrl-r04.dtsi | 15 - .../samsung/atoll-sec-a72q-pinctrl-r05.dtsi | 57 - .../dts/samsung/atoll-sec-a72q-pm-common.dtsi | 169 - .../boot/dts/samsung/atoll-sec-a72q-r00.dtsi | 99 - .../boot/dts/samsung/atoll-sec-a72q-r01.dtsi | 18 - .../boot/dts/samsung/atoll-sec-a72q-r02.dtsi | 19 - .../boot/dts/samsung/atoll-sec-a72q-r04.dtsi | 18 - .../boot/dts/samsung/atoll-sec-a72q-r05.dtsi | 25 - .../boot/dts/samsung/atoll-sec-common.dtsi | 430 - .../dts/samsung/atoll-sec-dcc-common.dtsi | 1328 -- .../dts/samsung/atoll-sec-m42q-common.dtsi | 21 - .../atoll-sec-m42q-eur-overlay-r00.dts | 26 - .../atoll-sec-m42q-eur-overlay-r01.dts | 26 - .../atoll-sec-m42q-eur-overlay-r02.dts | 26 - .../atoll-sec-m42q-eur-overlay-r04.dts | 26 - .../atoll-sec-m42q-eur-overlay-r05.dts | 26 - .../atoll-sec-m42q-eur-overlay-r06.dts | 26 - .../samsung/atoll-sec-m42q-input-common.dtsi | 115 - .../atoll-sec-m42q-jpn-overlay-r00.dts | 26 - .../atoll-sec-m42q-jpn-overlay-r01.dts | 27 - .../atoll-sec-m42q-jpn-overlay-r02.dts | 27 - .../atoll-sec-m42q-jpn-overlay-r04.dts | 26 - .../samsung/atoll-sec-m42q-pinctrl-r00.dtsi | 621 - .../samsung/atoll-sec-m42q-pinctrl-r01.dtsi | 73 - .../samsung/atoll-sec-m42q-pinctrl-r02.dtsi | 15 - .../samsung/atoll-sec-m42q-pinctrl-r04.dtsi | 80 - .../samsung/atoll-sec-m42q-pinctrl-r05.dtsi | 15 - .../samsung/atoll-sec-m42q-pinctrl-r06.dtsi | 41 - .../dts/samsung/atoll-sec-m42q-pm-common.dtsi | 183 - .../boot/dts/samsung/atoll-sec-m42q-r00.dtsi | 102 - .../boot/dts/samsung/atoll-sec-m42q-r01.dtsi | 18 - .../boot/dts/samsung/atoll-sec-m42q-r02.dtsi | 25 - .../boot/dts/samsung/atoll-sec-m42q-r04.dtsi | 28 - .../boot/dts/samsung/atoll-sec-m42q-r05.dtsi | 18 - .../boot/dts/samsung/atoll-sec-m42q-r06.dtsi | 19 - .../atoll-sec-m42q-usa-overlay-r01.dts | 36 - .../atoll-sec-m42q-usa-overlay-r02.dts | 26 - .../atoll-sec-m42q-usa-overlay-r04.dts | 26 - .../atoll-sec-m42q-usa-overlay-r06.dts | 26 - .../boot/dts/samsung/atoll-sec-pm-common.dtsi | 53 - .../dts/samsung/atoll-sec-uart-common.dtsi | 93 - .../common/sm7150-sec-a71-battery-common.dtsi | 691 - .../samsung/common/sm7150-sec-a71-common.dtsi | 195 - .../common/sm7150-sec-a71-input-common.dtsi | 194 - .../common/sm7150-sec-a71-pinctrl-common.dtsi | 541 - .../common/sm7150-sec-a71-pm-common.dtsi | 298 - .../dts/samsung/common/sm7150-sec-common.dtsi | 563 - .../dts/samsung/common/sm7150-sec-dcc.dtsi | 1614 -- .../common/sm7150-sec-m41-battery-common.dtsi | 660 - .../samsung/common/sm7150-sec-m41-common.dtsi | 182 - .../common/sm7150-sec-m41-input-common.dtsi | 146 - .../common/sm7150-sec-m41-pinctrl-common.dtsi | 517 - .../common/sm7150-sec-m41-pm-common.dtsi | 311 - .../common/sm7150-sec-m51-battery-common.dtsi | 701 - .../samsung/common/sm7150-sec-m51-common.dtsi | 182 - .../common/sm7150-sec-m51-input-common.dtsi | 145 - .../common/sm7150-sec-m51-pinctrl-common.dtsi | 517 - .../common/sm7150-sec-m51-pm-common.dtsi | 311 - .../drivers/atoll-sec-a52q-abc-r00.dtsi | 49 - .../drivers/atoll-sec-a52q-audio-common.dtsi | 207 - .../atoll-sec-a52q-audio-pinctrl-common.dtsi | 63 - .../atoll-sec-a52q-battery-common.dtsi | 408 - .../drivers/atoll-sec-a52q-battery-r04.dtsi | 78 - .../atoll-sec-a52q-camera-sensor-common.dtsi | 727 - .../atoll-sec-a52q-camera-sensor-r02.dtsi | 62 - .../drivers/atoll-sec-a52q-display-r00.dtsi | 199 - .../atoll-sec-a52q-fingerprint_00.dtsi | 77 - .../drivers/atoll-sec-a52q-hall-r00.dtsi | 37 - .../drivers/atoll-sec-a52q-nfc_r00.dtsi | 117 - .../drivers/atoll-sec-a52q-usb-r00.dtsi | 132 - .../drivers/atoll-sec-a52q-vibrator-r00.dtsi | 19 - .../drivers/atoll-sec-a72q-audio-common.dtsi | 207 - .../atoll-sec-a72q-audio-pinctrl-common.dtsi | 62 - .../atoll-sec-a72q-battery-common.dtsi | 438 - .../drivers/atoll-sec-a72q-battery-r02.dtsi | 58 - .../atoll-sec-a72q-camera-sensor-common.dtsi | 722 - .../atoll-sec-a72q-camera-sensor-r02.dtsi | 171 - .../drivers/atoll-sec-a72q-display-r00.dtsi | 178 - .../atoll-sec-a72q-fingerprint-r00.dtsi | 57 - .../drivers/atoll-sec-a72q-hall-r00.dtsi | 64 - .../drivers/atoll-sec-a72q-usb-r00.dtsi | 132 - .../drivers/atoll-sec-a72q-vibrator-r00.dtsi | 19 - .../drivers/atoll-sec-m42q-abc-r00.dtsi | 49 - .../drivers/atoll-sec-m42q-audio-common.dtsi | 206 - .../atoll-sec-m42q-audio-pinctrl-common.dtsi | 36 - .../atoll-sec-m42q-battery-common.dtsi | 515 - .../drivers/atoll-sec-m42q-battery-r02.dtsi | 58 - .../atoll-sec-m42q-camera-sensor-common.dtsi | 705 - .../atoll-sec-m42q-camera-sensor-r00.dtsi | 694 - .../atoll-sec-m42q-camera-sensor-r04.dtsi | 118 - .../atoll-sec-m42q-camera-sensor-r06.dtsi | 78 - .../drivers/atoll-sec-m42q-display-r00.dtsi | 224 - .../atoll-sec-m42q-fingerprint-r00.dtsi | 84 - .../drivers/atoll-sec-m42q-usb-r00.dtsi | 132 - .../drivers/atoll-sec-m42q-vibrator-r00.dtsi | 19 - .../drivers/sm7150-camera-sensor-a71-r00.dtsi | 577 - .../drivers/sm7150-camera-sensor-a71-r01.dtsi | 577 - .../drivers/sm7150-camera-sensor-m41-r01.dtsi | 595 - .../drivers/sm7150-camera-sensor-m51-r01.dtsi | 579 - .../drivers/sm7150-sec-a71-audio-pinctrl.dtsi | 158 - .../samsung/drivers/sm7150-sec-a71-audio.dtsi | 169 - .../drivers/sm7150-sec-a71-battery-r02.dtsi | 18 - .../drivers/sm7150-sec-a71-battery-r03.dtsi | 34 - .../drivers/sm7150-sec-a71-battery-r04.dtsi | 34 - .../drivers/sm7150-sec-a71-battery-r05.dtsi | 13 - .../drivers/sm7150-sec-a71-battery-r06.dtsi | 115 - .../drivers/sm7150-sec-a71-display-r00.dtsi | 100 - .../drivers/sm7150-sec-a71-display-r01.dtsi | 125 - .../drivers/sm7150-sec-a71-display-r02.dtsi | 180 - .../drivers/sm7150-sec-a71-display-r04.dtsi | 259 - .../drivers/sm7150-sec-a71-eif-common.dtsi | 129 - .../drivers/sm7150-sec-a71-eif-r00.dtsi | 34 - .../drivers/sm7150-sec-a71-eif-r05.dtsi | 14 - .../drivers/sm7150-sec-a71-eif-r06.dtsi | 35 - .../sm7150-sec-a71-fingerprint_00.dtsi | 59 - .../drivers/sm7150-sec-a71-mst-r00.dtsi | 52 - .../drivers/sm7150-sec-a71-nfc-r00.dtsi | 99 - .../drivers/sm7150-sec-m41-audio-pinctrl.dtsi | 32 - .../samsung/drivers/sm7150-sec-m41-audio.dtsi | 142 - .../drivers/sm7150-sec-m41-battery-r00.dtsi | 12 - .../drivers/sm7150-sec-m41-display-r00.dtsi | 260 - .../drivers/sm7150-sec-m41-eif-common.dtsi | 107 - .../drivers/sm7150-sec-m41-eif-r00.dtsi | 35 - .../sm7150-sec-m41-fingerprint_00.dtsi | 59 - .../drivers/sm7150-sec-m41-mst-r00.dtsi | 52 - .../drivers/sm7150-sec-m41-nfc-r00.dtsi | 99 - .../drivers/sm7150-sec-m51-audio-pinctrl.dtsi | 32 - .../samsung/drivers/sm7150-sec-m51-audio.dtsi | 146 - .../drivers/sm7150-sec-m51-battery-r00.dtsi | 12 - .../drivers/sm7150-sec-m51-battery-r02.dtsi | 235 - .../drivers/sm7150-sec-m51-display-r00.dtsi | 299 - .../drivers/sm7150-sec-m51-display-r02.dtsi | 341 - .../drivers/sm7150-sec-m51-display-r03.dtsi | 290 - .../drivers/sm7150-sec-m51-display-r04.dtsi | 341 - .../drivers/sm7150-sec-m51-display-r05.dtsi | 344 - .../drivers/sm7150-sec-m51-eif-common.dtsi | 107 - .../drivers/sm7150-sec-m51-eif-r00.dtsi | 36 - .../sm7150-sec-m51-fingerprint_00.dtsi | 85 - .../drivers/sm7150-sec-m51-mst-r00.dtsi | 52 - .../drivers/sm7150-sec-m51-nfc-r00.dtsi | 99 - .../drivers/sm7150-sec-m51-nfc-r02.dtsi | 123 - .../m41/sm7150-sec-m41-swa-pinctrl-r00.dtsi | 71 - .../samsung/m41/sm7150-sec-m41-swa-r00.dtsi | 59 - .../m51/sm7150-sec-m51-eur-pinctrl-r00.dtsi | 55 - .../m51/sm7150-sec-m51-eur-pinctrl-r01.dtsi | 31 - .../m51/sm7150-sec-m51-eur-pinctrl-r02.dtsi | 31 - .../m51/sm7150-sec-m51-eur-pinctrl-r04.dtsi | 31 - .../m51/sm7150-sec-m51-eur-pinctrl-r05.dtsi | 31 - .../samsung/m51/sm7150-sec-m51-eur-r00.dtsi | 43 - .../samsung/m51/sm7150-sec-m51-eur-r01.dtsi | 31 - .../samsung/m51/sm7150-sec-m51-eur-r02.dtsi | 32 - .../samsung/m51/sm7150-sec-m51-eur-r04.dtsi | 31 - .../samsung/m51/sm7150-sec-m51-eur-r05.dtsi | 31 - .../m51/sm7150-sec-m51-swa-pinctrl-r00.dtsi | 71 - .../m51/sm7150-sec-m51-swa-pinctrl-r01.dtsi | 31 - .../m51/sm7150-sec-m51-swa-pinctrl-r02.dtsi | 31 - .../samsung/m51/sm7150-sec-m51-swa-r00.dtsi | 59 - .../samsung/m51/sm7150-sec-m51-swa-r01.dtsi | 31 - .../samsung/m51/sm7150-sec-m51-swa-r02.dtsi | 31 - .../sm6150-camera-sensor-a70q-eur-r00.dtsi | 413 - .../sm6150-camera-sensor-a70q-eur-r02.dtsi | 423 - .../sm6150-camera-sensor-a70s-eur-r02.dtsi | 423 - .../sm6150-camera-sensor-a70s-eur-r03.dtsi | 423 - .../sm6150-sec-a60q-audio-pinctrl.dtsi | 116 - .../dts/samsung/sm6150-sec-a60q-audio.dtsi | 134 - .../sm6150-sec-a60q-battery-common.dtsi | 234 - .../samsung/sm6150-sec-a60q-camera-r01.dtsi | 417 - .../dts/samsung/sm6150-sec-a60q-camera.dtsi | 413 - .../sm6150-sec-a60q-chn-overlay-r00.dts | 48 - .../sm6150-sec-a60q-chn-overlay-r01.dts | 38 - .../sm6150-sec-a60q-chn-overlay-r02.dts | 38 - .../sm6150-sec-a60q-chn-overlay-r03.dts | 38 - .../sm6150-sec-a60q-chn-overlay-r04.dts | 38 - .../sm6150-sec-a60q-chn-overlay-r05.dts | 38 - .../sm6150-sec-a60q-chn-overlay-r06.dts | 38 - .../sm6150-sec-a60q-chn-overlay-r08.dts | 38 - .../sm6150-sec-a60q-chn-pinctrl-r00.dtsi | 17 - .../sm6150-sec-a60q-chn-pinctrl-r01.dtsi | 17 - .../sm6150-sec-a60q-chn-pinctrl-r02.dtsi | 17 - .../sm6150-sec-a60q-chn-pinctrl-r03.dtsi | 17 - .../sm6150-sec-a60q-chn-pinctrl-r04.dtsi | 17 - .../sm6150-sec-a60q-chn-pinctrl-r05.dtsi | 17 - .../sm6150-sec-a60q-chn-pinctrl-r06.dtsi | 17 - .../sm6150-sec-a60q-chn-pinctrl-r08.dtsi | 17 - .../dts/samsung/sm6150-sec-a60q-chn-r00.dtsi | 107 - .../dts/samsung/sm6150-sec-a60q-chn-r01.dtsi | 46 - .../dts/samsung/sm6150-sec-a60q-chn-r02.dtsi | 19 - .../dts/samsung/sm6150-sec-a60q-chn-r03.dtsi | 19 - .../dts/samsung/sm6150-sec-a60q-chn-r04.dtsi | 19 - .../dts/samsung/sm6150-sec-a60q-chn-r05.dtsi | 19 - .../dts/samsung/sm6150-sec-a60q-chn-r06.dtsi | 22 - .../dts/samsung/sm6150-sec-a60q-chn-r08.dtsi | 19 - .../dts/samsung/sm6150-sec-a60q-common.dtsi | 128 - .../samsung/sm6150-sec-a60q-display-r00.dtsi | 217 - .../samsung/sm6150-sec-a60q-display-r01.dtsi | 253 - .../dts/samsung/sm6150-sec-a60q-eif-r00.dtsi | 72 - .../sm6150-sec-a60q-fingerprint_00.dtsi | 90 - .../sm6150-sec-a60q-fingerprint_01.dtsi | 90 - .../samsung/sm6150-sec-a60q-input-common.dtsi | 117 - .../dts/samsung/sm6150-sec-a60q-nfc-r00.dtsi | 85 - .../sm6150-sec-a60q-pinctrl-common.dtsi | 450 - .../samsung/sm6150-sec-a60q-pm-common.dtsi | 191 - .../sm6150-sec-a60q-swa-overlay-r00.dts | 48 - .../sm6150-sec-a60q-swa-overlay-r01.dts | 38 - .../sm6150-sec-a60q-swa-overlay-r02.dts | 38 - .../sm6150-sec-a60q-swa-overlay-r03.dts | 38 - .../sm6150-sec-a60q-swa-overlay-r04.dts | 38 - .../sm6150-sec-a60q-swa-overlay-r05.dts | 38 - .../sm6150-sec-a60q-swa-pinctrl-r00.dtsi | 17 - .../sm6150-sec-a60q-swa-pinctrl-r01.dtsi | 17 - .../sm6150-sec-a60q-swa-pinctrl-r02.dtsi | 17 - .../sm6150-sec-a60q-swa-pinctrl-r03.dtsi | 17 - .../sm6150-sec-a60q-swa-pinctrl-r04.dtsi | 17 - .../sm6150-sec-a60q-swa-pinctrl-r05.dtsi | 17 - .../dts/samsung/sm6150-sec-a60q-swa-r00.dtsi | 107 - .../dts/samsung/sm6150-sec-a60q-swa-r01.dtsi | 38 - .../dts/samsung/sm6150-sec-a60q-swa-r02.dtsi | 19 - .../dts/samsung/sm6150-sec-a60q-swa-r03.dtsi | 19 - .../dts/samsung/sm6150-sec-a60q-swa-r04.dtsi | 19 - .../dts/samsung/sm6150-sec-a60q-swa-r05.dtsi | 19 - .../sm6150-sec-a70q-audio-pinctrl.dtsi | 1 - .../dts/samsung/sm6150-sec-a70q-audio.dtsi | 139 - .../sm6150-sec-a70q-battery-common.dtsi | 237 - .../sm6150-sec-a70q-battery-sm5713.dtsi | 391 - .../sm6150-sec-a70q-can-overlay-r00.dts | 43 - .../sm6150-sec-a70q-can-overlay-r01.dts | 44 - .../sm6150-sec-a70q-can-overlay-r02.dts | 43 - .../sm6150-sec-a70q-can-overlay-r03.dts | 43 - .../sm6150-sec-a70q-can-overlay-r05.dts | 45 - .../sm6150-sec-a70q-can-overlay-r06.dts | 45 - .../sm6150-sec-a70q-can-overlay-r09.dts | 44 - .../sm6150-sec-a70q-can-overlay-r10.dts | 44 - .../sm6150-sec-a70q-can-overlay-r11.dts | 44 - .../sm6150-sec-a70q-can-overlay-r12.dts | 44 - .../sm6150-sec-a70q-can-overlay-r13.dts | 44 - .../sm6150-sec-a70q-can-overlay-r14.dts | 44 - .../sm6150-sec-a70q-can-pinctrl-r00.dtsi | 17 - .../sm6150-sec-a70q-can-pinctrl-r01.dtsi | 17 - .../sm6150-sec-a70q-can-pinctrl-r02.dtsi | 17 - .../sm6150-sec-a70q-can-pinctrl-r03.dtsi | 17 - .../sm6150-sec-a70q-can-pinctrl-r05.dtsi | 17 - .../sm6150-sec-a70q-can-pinctrl-r06.dtsi | 29 - .../sm6150-sec-a70q-can-pinctrl-r09.dtsi | 17 - .../sm6150-sec-a70q-can-pinctrl-r10.dtsi | 17 - .../sm6150-sec-a70q-can-pinctrl-r11.dtsi | 17 - .../sm6150-sec-a70q-can-pinctrl-r12.dtsi | 17 - .../sm6150-sec-a70q-can-pinctrl-r13.dtsi | 17 - .../sm6150-sec-a70q-can-pinctrl-r14.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-can-r00.dtsi | 116 - .../dts/samsung/sm6150-sec-a70q-can-r01.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-can-r02.dtsi | 46 - .../dts/samsung/sm6150-sec-a70q-can-r03.dtsi | 18 - .../dts/samsung/sm6150-sec-a70q-can-r05.dtsi | 18 - .../dts/samsung/sm6150-sec-a70q-can-r06.dtsi | 28 - .../dts/samsung/sm6150-sec-a70q-can-r09.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-can-r10.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-can-r11.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-can-r12.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-can-r13.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-can-r14.dtsi | 17 - .../sm6150-sec-a70q-chn-overlay-r00.dts | 43 - .../sm6150-sec-a70q-chn-overlay-r01.dts | 44 - .../sm6150-sec-a70q-chn-overlay-r02.dts | 43 - .../sm6150-sec-a70q-chn-overlay-r03.dts | 45 - .../sm6150-sec-a70q-chn-overlay-r05.dts | 45 - .../sm6150-sec-a70q-chn-overlay-r06.dts | 45 - .../sm6150-sec-a70q-chn-overlay-r09.dts | 44 - .../sm6150-sec-a70q-chn-overlay-r10.dts | 44 - .../sm6150-sec-a70q-chn-overlay-r11.dts | 44 - .../sm6150-sec-a70q-chn-overlay-r12.dts | 44 - .../dts/samsung/sm6150-sec-a70q-chn-r00.dtsi | 116 - .../dts/samsung/sm6150-sec-a70q-chn-r01.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-chn-r02.dtsi | 46 - .../dts/samsung/sm6150-sec-a70q-chn-r03.dtsi | 18 - .../dts/samsung/sm6150-sec-a70q-chn-r05.dtsi | 18 - .../dts/samsung/sm6150-sec-a70q-chn-r06.dtsi | 28 - .../dts/samsung/sm6150-sec-a70q-chn-r09.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-chn-r10.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-chn-r11.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-chn-r12.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-common.dtsi | 202 - .../samsung/sm6150-sec-a70q-display-r00.dtsi | 265 - .../samsung/sm6150-sec-a70q-display-r01.dtsi | 167 - .../dts/samsung/sm6150-sec-a70q-eif-r00.dtsi | 93 - .../dts/samsung/sm6150-sec-a70q-eif-r09.dtsi | 94 - .../sm6150-sec-a70q-eur-ldu-overlay-r00.dts | 43 - .../sm6150-sec-a70q-eur-ldu-overlay-r01.dts | 44 - .../sm6150-sec-a70q-eur-ldu-overlay-r02.dts | 43 - .../sm6150-sec-a70q-eur-ldu-overlay-r03.dts | 45 - .../sm6150-sec-a70q-eur-ldu-overlay-r05.dts | 45 - .../sm6150-sec-a70q-eur-ldu-overlay-r06.dts | 45 - .../sm6150-sec-a70q-eur-ldu-overlay-r09.dts | 44 - .../sm6150-sec-a70q-eur-ldu-overlay-r10.dts | 44 - .../sm6150-sec-a70q-eur-ldu-overlay-r11.dts | 44 - .../sm6150-sec-a70q-eur-ldu-overlay-r12.dts | 44 - .../sm6150-sec-a70q-eur-ldu-overlay-r13.dts | 44 - .../sm6150-sec-a70q-eur-ldu-overlay-r14.dts | 44 - .../sm6150-sec-a70q-eur-ldu-pinctrl-r00.dtsi | 17 - .../sm6150-sec-a70q-eur-ldu-pinctrl-r01.dtsi | 17 - .../sm6150-sec-a70q-eur-ldu-pinctrl-r02.dtsi | 17 - .../sm6150-sec-a70q-eur-ldu-pinctrl-r03.dtsi | 17 - .../sm6150-sec-a70q-eur-ldu-pinctrl-r05.dtsi | 17 - .../sm6150-sec-a70q-eur-ldu-pinctrl-r06.dtsi | 17 - .../sm6150-sec-a70q-eur-ldu-pinctrl-r09.dtsi | 17 - .../sm6150-sec-a70q-eur-ldu-pinctrl-r10.dtsi | 17 - .../sm6150-sec-a70q-eur-ldu-pinctrl-r11.dtsi | 17 - .../sm6150-sec-a70q-eur-ldu-pinctrl-r12.dtsi | 17 - .../sm6150-sec-a70q-eur-ldu-pinctrl-r13.dtsi | 17 - .../sm6150-sec-a70q-eur-ldu-pinctrl-r14.dtsi | 17 - .../samsung/sm6150-sec-a70q-eur-ldu-r00.dtsi | 105 - .../samsung/sm6150-sec-a70q-eur-ldu-r01.dtsi | 17 - .../samsung/sm6150-sec-a70q-eur-ldu-r02.dtsi | 46 - .../samsung/sm6150-sec-a70q-eur-ldu-r03.dtsi | 18 - .../samsung/sm6150-sec-a70q-eur-ldu-r05.dtsi | 18 - .../samsung/sm6150-sec-a70q-eur-ldu-r06.dtsi | 17 - .../samsung/sm6150-sec-a70q-eur-ldu-r09.dtsi | 17 - .../samsung/sm6150-sec-a70q-eur-ldu-r10.dtsi | 17 - .../samsung/sm6150-sec-a70q-eur-ldu-r11.dtsi | 17 - .../samsung/sm6150-sec-a70q-eur-ldu-r12.dtsi | 17 - .../samsung/sm6150-sec-a70q-eur-ldu-r13.dtsi | 17 - .../samsung/sm6150-sec-a70q-eur-ldu-r14.dtsi | 17 - .../samsung/sm6150-sec-a70q-eur-nfc-r00.dtsi | 112 - .../sm6150-sec-a70q-eur-overlay-r00.dts | 43 - .../sm6150-sec-a70q-eur-overlay-r01.dts | 44 - .../sm6150-sec-a70q-eur-overlay-r02.dts | 43 - .../sm6150-sec-a70q-eur-overlay-r03.dts | 45 - .../sm6150-sec-a70q-eur-overlay-r05.dts | 45 - .../sm6150-sec-a70q-eur-overlay-r06.dts | 45 - .../sm6150-sec-a70q-eur-overlay-r09.dts | 44 - .../sm6150-sec-a70q-eur-overlay-r10.dts | 44 - .../sm6150-sec-a70q-eur-overlay-r11.dts | 44 - .../sm6150-sec-a70q-eur-overlay-r12.dts | 44 - .../sm6150-sec-a70q-eur-overlay-r13.dts | 44 - .../sm6150-sec-a70q-eur-overlay-r14.dts | 44 - .../sm6150-sec-a70q-eur-pinctrl-r00.dtsi | 17 - .../sm6150-sec-a70q-eur-pinctrl-r01.dtsi | 17 - .../sm6150-sec-a70q-eur-pinctrl-r02.dtsi | 17 - .../sm6150-sec-a70q-eur-pinctrl-r03.dtsi | 17 - .../sm6150-sec-a70q-eur-pinctrl-r05.dtsi | 17 - .../sm6150-sec-a70q-eur-pinctrl-r06.dtsi | 29 - .../sm6150-sec-a70q-eur-pinctrl-r09.dtsi | 17 - .../sm6150-sec-a70q-eur-pinctrl-r10.dtsi | 17 - .../sm6150-sec-a70q-eur-pinctrl-r11.dtsi | 17 - .../sm6150-sec-a70q-eur-pinctrl-r12.dtsi | 17 - .../sm6150-sec-a70q-eur-pinctrl-r13.dtsi | 17 - .../sm6150-sec-a70q-eur-pinctrl-r14.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-eur-r00.dtsi | 105 - .../dts/samsung/sm6150-sec-a70q-eur-r01.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-eur-r02.dtsi | 46 - .../dts/samsung/sm6150-sec-a70q-eur-r03.dtsi | 18 - .../dts/samsung/sm6150-sec-a70q-eur-r05.dtsi | 18 - .../dts/samsung/sm6150-sec-a70q-eur-r06.dtsi | 28 - .../dts/samsung/sm6150-sec-a70q-eur-r09.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-eur-r10.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-eur-r11.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-eur-r12.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-eur-r13.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-eur-r14.dtsi | 17 - .../sm6150-sec-a70q-fingerprint_00.dtsi | 62 - .../sm6150-sec-a70q-fingerprint_02.dtsi | 62 - .../samsung/sm6150-sec-a70q-input-common.dtsi | 98 - .../samsung/sm6150-sec-a70q-kor-nfc-r00.dtsi | 60 - .../sm6150-sec-a70q-kor-overlay-r00.dts | 45 - .../sm6150-sec-a70q-kor-overlay-r01.dts | 45 - .../sm6150-sec-a70q-kor-overlay-r02.dts | 44 - .../sm6150-sec-a70q-kor-overlay-r03.dts | 46 - .../sm6150-sec-a70q-kor-pinctrl-r00.dtsi | 17 - .../sm6150-sec-a70q-kor-pinctrl-r01.dtsi | 17 - .../sm6150-sec-a70q-kor-pinctrl-r02.dtsi | 17 - .../sm6150-sec-a70q-kor-pinctrl-r03.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-kor-r00.dtsi | 105 - .../dts/samsung/sm6150-sec-a70q-kor-r01.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-kor-r02.dtsi | 46 - .../dts/samsung/sm6150-sec-a70q-kor-r03.dtsi | 46 - .../samsung/sm6150-sec-a70q-kor-tdmb-r00.dtsi | 99 - .../dts/samsung/sm6150-sec-a70q-mst-r00.dtsi | 52 - .../dts/samsung/sm6150-sec-a70q-nfc-r00.dtsi | 100 - .../sm6150-sec-a70q-pinctrl-common.dtsi | 508 - .../samsung/sm6150-sec-a70q-pm-common.dtsi | 238 - .../sm6150-sec-a70q-sea-overlay-r00.dts | 42 - .../sm6150-sec-a70q-sea-overlay-r01.dts | 43 - .../sm6150-sec-a70q-sea-overlay-r02.dts | 42 - .../sm6150-sec-a70q-sea-overlay-r03.dts | 42 - .../sm6150-sec-a70q-sea-overlay-r05.dts | 44 - .../sm6150-sec-a70q-sea-overlay-r06.dts | 44 - .../sm6150-sec-a70q-sea-overlay-r09.dts | 43 - .../sm6150-sec-a70q-sea-overlay-r10.dts | 43 - .../sm6150-sec-a70q-sea-overlay-r11.dts | 43 - .../sm6150-sec-a70q-sea-overlay-r12.dts | 43 - .../sm6150-sec-a70q-sea-overlay-r13.dts | 43 - .../sm6150-sec-a70q-sea-overlay-r14.dts | 43 - .../sm6150-sec-a70q-sea-pinctrl-r00.dtsi | 17 - .../sm6150-sec-a70q-sea-pinctrl-r01.dtsi | 17 - .../sm6150-sec-a70q-sea-pinctrl-r02.dtsi | 17 - .../sm6150-sec-a70q-sea-pinctrl-r03.dtsi | 17 - .../sm6150-sec-a70q-sea-pinctrl-r05.dtsi | 17 - .../sm6150-sec-a70q-sea-pinctrl-r06.dtsi | 29 - .../sm6150-sec-a70q-sea-pinctrl-r09.dtsi | 17 - .../sm6150-sec-a70q-sea-pinctrl-r10.dtsi | 17 - .../sm6150-sec-a70q-sea-pinctrl-r11.dtsi | 17 - .../sm6150-sec-a70q-sea-pinctrl-r12.dtsi | 17 - .../sm6150-sec-a70q-sea-pinctrl-r13.dtsi | 17 - .../sm6150-sec-a70q-sea-pinctrl-r14.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-sea-r00.dtsi | 105 - .../dts/samsung/sm6150-sec-a70q-sea-r01.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-sea-r02.dtsi | 46 - .../dts/samsung/sm6150-sec-a70q-sea-r03.dtsi | 18 - .../dts/samsung/sm6150-sec-a70q-sea-r05.dtsi | 18 - .../dts/samsung/sm6150-sec-a70q-sea-r06.dtsi | 28 - .../dts/samsung/sm6150-sec-a70q-sea-r09.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-sea-r10.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-sea-r11.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-sea-r12.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-sea-r13.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-sea-r14.dtsi | 17 - .../sm6150-sec-a70q-sea-xsa-overlay-r00.dts | 43 - .../sm6150-sec-a70q-sea-xsa-overlay-r01.dts | 44 - .../sm6150-sec-a70q-sea-xsa-overlay-r02.dts | 43 - .../sm6150-sec-a70q-sea-xsa-overlay-r03.dts | 43 - .../sm6150-sec-a70q-sea-xsa-overlay-r05.dts | 45 - .../sm6150-sec-a70q-sea-xsa-overlay-r06.dts | 45 - .../sm6150-sec-a70q-sea-xsa-overlay-r09.dts | 44 - .../sm6150-sec-a70q-sea-xsa-overlay-r10.dts | 44 - .../sm6150-sec-a70q-sea-xsa-overlay-r11.dts | 44 - .../sm6150-sec-a70q-sea-xsa-overlay-r12.dts | 44 - .../sm6150-sec-a70q-sea-xsa-overlay-r13.dts | 44 - .../sm6150-sec-a70q-sea-xsa-overlay-r14.dts | 44 - .../sm6150-sec-a70q-sea-xsa-overlay-r15.dts | 44 - .../sm6150-sec-a70q-sea-xsa-pinctrl-r00.dtsi | 17 - .../sm6150-sec-a70q-sea-xsa-pinctrl-r01.dtsi | 17 - .../sm6150-sec-a70q-sea-xsa-pinctrl-r02.dtsi | 17 - .../sm6150-sec-a70q-sea-xsa-pinctrl-r03.dtsi | 17 - .../sm6150-sec-a70q-sea-xsa-pinctrl-r05.dtsi | 17 - .../sm6150-sec-a70q-sea-xsa-pinctrl-r06.dtsi | 29 - .../sm6150-sec-a70q-sea-xsa-pinctrl-r09.dtsi | 17 - .../sm6150-sec-a70q-sea-xsa-pinctrl-r10.dtsi | 17 - .../sm6150-sec-a70q-sea-xsa-pinctrl-r11.dtsi | 17 - .../sm6150-sec-a70q-sea-xsa-pinctrl-r12.dtsi | 17 - .../sm6150-sec-a70q-sea-xsa-pinctrl-r13.dtsi | 17 - .../sm6150-sec-a70q-sea-xsa-pinctrl-r14.dtsi | 17 - .../sm6150-sec-a70q-sea-xsa-pinctrl-r15.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xsa-r00.dtsi | 105 - .../samsung/sm6150-sec-a70q-sea-xsa-r01.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xsa-r02.dtsi | 46 - .../samsung/sm6150-sec-a70q-sea-xsa-r03.dtsi | 18 - .../samsung/sm6150-sec-a70q-sea-xsa-r05.dtsi | 18 - .../samsung/sm6150-sec-a70q-sea-xsa-r06.dtsi | 28 - .../samsung/sm6150-sec-a70q-sea-xsa-r09.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xsa-r10.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xsa-r11.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xsa-r12.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xsa-r13.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xsa-r14.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xsa-r15.dtsi | 17 - .../sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi | 68 - .../sm6150-sec-a70q-sea-xtc-overlay-r00.dts | 43 - .../sm6150-sec-a70q-sea-xtc-overlay-r01.dts | 44 - .../sm6150-sec-a70q-sea-xtc-overlay-r02.dts | 43 - .../sm6150-sec-a70q-sea-xtc-overlay-r03.dts | 43 - .../sm6150-sec-a70q-sea-xtc-overlay-r05.dts | 45 - .../sm6150-sec-a70q-sea-xtc-overlay-r06.dts | 45 - .../sm6150-sec-a70q-sea-xtc-overlay-r09.dts | 44 - .../sm6150-sec-a70q-sea-xtc-overlay-r10.dts | 44 - .../sm6150-sec-a70q-sea-xtc-overlay-r11.dts | 44 - .../sm6150-sec-a70q-sea-xtc-overlay-r12.dts | 44 - .../sm6150-sec-a70q-sea-xtc-overlay-r13.dts | 44 - .../sm6150-sec-a70q-sea-xtc-overlay-r14.dts | 44 - .../sm6150-sec-a70q-sea-xtc-pinctrl-r00.dtsi | 17 - .../sm6150-sec-a70q-sea-xtc-pinctrl-r01.dtsi | 17 - .../sm6150-sec-a70q-sea-xtc-pinctrl-r02.dtsi | 17 - .../sm6150-sec-a70q-sea-xtc-pinctrl-r03.dtsi | 17 - .../sm6150-sec-a70q-sea-xtc-pinctrl-r05.dtsi | 17 - .../sm6150-sec-a70q-sea-xtc-pinctrl-r06.dtsi | 29 - .../sm6150-sec-a70q-sea-xtc-pinctrl-r09.dtsi | 17 - .../sm6150-sec-a70q-sea-xtc-pinctrl-r10.dtsi | 17 - .../sm6150-sec-a70q-sea-xtc-pinctrl-r11.dtsi | 17 - .../sm6150-sec-a70q-sea-xtc-pinctrl-r12.dtsi | 17 - .../sm6150-sec-a70q-sea-xtc-pinctrl-r13.dtsi | 17 - .../sm6150-sec-a70q-sea-xtc-pinctrl-r14.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xtc-r00.dtsi | 105 - .../samsung/sm6150-sec-a70q-sea-xtc-r01.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xtc-r02.dtsi | 46 - .../samsung/sm6150-sec-a70q-sea-xtc-r03.dtsi | 18 - .../samsung/sm6150-sec-a70q-sea-xtc-r05.dtsi | 18 - .../samsung/sm6150-sec-a70q-sea-xtc-r06.dtsi | 28 - .../samsung/sm6150-sec-a70q-sea-xtc-r09.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xtc-r10.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xtc-r11.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xtc-r12.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xtc-r13.dtsi | 17 - .../samsung/sm6150-sec-a70q-sea-xtc-r14.dtsi | 17 - .../samsung/sm6150-sec-a70q-swa-nfc-r00.dtsi | 68 - .../sm6150-sec-a70q-swa-overlay-r00.dts | 43 - .../sm6150-sec-a70q-swa-overlay-r01.dts | 44 - .../sm6150-sec-a70q-swa-overlay-r02.dts | 43 - .../sm6150-sec-a70q-swa-overlay-r03.dts | 45 - .../sm6150-sec-a70q-swa-overlay-r05.dts | 45 - .../sm6150-sec-a70q-swa-overlay-r06.dts | 45 - .../sm6150-sec-a70q-swa-overlay-r09.dts | 44 - .../sm6150-sec-a70q-swa-overlay-r10.dts | 44 - .../sm6150-sec-a70q-swa-overlay-r11.dts | 44 - .../sm6150-sec-a70q-swa-overlay-r12.dts | 44 - .../sm6150-sec-a70q-swa-overlay-r13.dts | 44 - .../sm6150-sec-a70q-swa-overlay-r14.dts | 44 - .../sm6150-sec-a70q-swa-pinctrl-r00.dtsi | 17 - .../sm6150-sec-a70q-swa-pinctrl-r01.dtsi | 17 - .../sm6150-sec-a70q-swa-pinctrl-r02.dtsi | 17 - .../sm6150-sec-a70q-swa-pinctrl-r03.dtsi | 17 - .../sm6150-sec-a70q-swa-pinctrl-r05.dtsi | 17 - .../sm6150-sec-a70q-swa-pinctrl-r06.dtsi | 29 - .../sm6150-sec-a70q-swa-pinctrl-r09.dtsi | 17 - .../sm6150-sec-a70q-swa-pinctrl-r10.dtsi | 17 - .../sm6150-sec-a70q-swa-pinctrl-r11.dtsi | 17 - .../sm6150-sec-a70q-swa-pinctrl-r12.dtsi | 17 - .../sm6150-sec-a70q-swa-pinctrl-r13.dtsi | 17 - .../sm6150-sec-a70q-swa-pinctrl-r14.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-swa-r00.dtsi | 105 - .../dts/samsung/sm6150-sec-a70q-swa-r01.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-swa-r02.dtsi | 46 - .../dts/samsung/sm6150-sec-a70q-swa-r03.dtsi | 18 - .../dts/samsung/sm6150-sec-a70q-swa-r05.dtsi | 18 - .../dts/samsung/sm6150-sec-a70q-swa-r06.dtsi | 28 - .../dts/samsung/sm6150-sec-a70q-swa-r09.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-swa-r10.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-swa-r11.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-swa-r12.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-swa-r13.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-swa-r14.dtsi | 17 - .../sm6150-sec-a70q-usa-overlay-r00.dts | 43 - .../sm6150-sec-a70q-usa-overlay-r02.dts | 44 - .../sm6150-sec-a70q-usa-overlay-r03.dts | 44 - .../sm6150-sec-a70q-usa-pinctrl-r00.dtsi | 17 - .../sm6150-sec-a70q-usa-pinctrl-r02.dtsi | 29 - .../sm6150-sec-a70q-usa-pinctrl-r03.dtsi | 17 - .../dts/samsung/sm6150-sec-a70q-usa-r00.dtsi | 146 - .../dts/samsung/sm6150-sec-a70q-usa-r02.dtsi | 86 - .../dts/samsung/sm6150-sec-a70q-usa-r03.dtsi | 46 - .../sm6150-sec-a70s-audio-pinctrl.dtsi | 1 - .../dts/samsung/sm6150-sec-a70s-audio.dtsi | 139 - .../sm6150-sec-a70s-battery-common.dtsi | 232 - .../samsung/sm6150-sec-a70s-chn-nfc-r00.dtsi | 109 - .../sm6150-sec-a70s-chn-overlay-r00.dts | 44 - .../sm6150-sec-a70s-chn-pinctrl-r00.dtsi | 30 - .../dts/samsung/sm6150-sec-a70s-chn-r00.dtsi | 127 - .../dts/samsung/sm6150-sec-a70s-common.dtsi | 161 - .../samsung/sm6150-sec-a70s-display-r01.dtsi | 167 - .../dts/samsung/sm6150-sec-a70s-eif-r00.dtsi | 91 - .../sm6150-sec-a70s-fingerprint_02.dtsi | 62 - .../samsung/sm6150-sec-a70s-input-common.dtsi | 98 - .../dts/samsung/sm6150-sec-a70s-mst-r00.dtsi | 52 - .../sm6150-sec-a70s-pinctrl-common.dtsi | 497 - .../samsung/sm6150-sec-a70s-pm-common.dtsi | 238 - .../samsung/sm6150-sec-a70s-swa-nfc-r00.dtsi | 68 - .../sm6150-sec-a70s-swa-overlay-r00.dts | 44 - .../sm6150-sec-a70s-swa-overlay-r01.dts | 44 - .../sm6150-sec-a70s-swa-pinctrl-r00.dtsi | 30 - .../sm6150-sec-a70s-swa-pinctrl-r01.dtsi | 17 - .../dts/samsung/sm6150-sec-a70s-swa-r00.dtsi | 116 - .../dts/samsung/sm6150-sec-a70s-swa-r01.dtsi | 17 - .../boot/dts/samsung/sm6150-sec-common.dtsi | 485 - .../boot/dts/samsung/sm6150-sec-dcc.dtsi | 1614 -- .../samsung/sm6150-sec-m40-audio-pinctrl.dtsi | 116 - .../dts/samsung/sm6150-sec-m40-audio.dtsi | 134 - .../sm6150-sec-m40-battery-common.dtsi | 188 - .../samsung/sm6150-sec-m40-camera-r01.dtsi | 417 - .../dts/samsung/sm6150-sec-m40-camera.dtsi | 413 - .../dts/samsung/sm6150-sec-m40-common.dtsi | 153 - .../samsung/sm6150-sec-m40-display-r00.dtsi | 217 - .../samsung/sm6150-sec-m40-display-r01.dtsi | 253 - .../dts/samsung/sm6150-sec-m40-eif-r00.dtsi | 72 - .../sm6150-sec-m40-fingerprint_00.dtsi | 90 - .../sm6150-sec-m40-fingerprint_01.dtsi | 90 - .../samsung/sm6150-sec-m40-input-common.dtsi | 117 - .../dts/samsung/sm6150-sec-m40-nfc-r00.dtsi | 85 - .../sm6150-sec-m40-pinctrl-common.dtsi | 450 - .../dts/samsung/sm6150-sec-m40-pm-common.dtsi | 191 - .../sm6150-sec-m40-swa-overlay-r00.dts | 48 - .../sm6150-sec-m40-swa-overlay-r01.dts | 38 - .../sm6150-sec-m40-swa-overlay-r02.dts | 38 - .../sm6150-sec-m40-swa-overlay-r03.dts | 38 - .../sm6150-sec-m40-swa-overlay-r04.dts | 38 - .../sm6150-sec-m40-swa-overlay-r05.dts | 38 - .../sm6150-sec-m40-swa-overlay-r06.dts | 38 - .../sm6150-sec-m40-swa-overlay-r08.dts | 38 - .../sm6150-sec-m40-swa-pinctrl-r00.dtsi | 17 - .../sm6150-sec-m40-swa-pinctrl-r01.dtsi | 17 - .../sm6150-sec-m40-swa-pinctrl-r02.dtsi | 17 - .../sm6150-sec-m40-swa-pinctrl-r03.dtsi | 17 - .../sm6150-sec-m40-swa-pinctrl-r04.dtsi | 17 - .../sm6150-sec-m40-swa-pinctrl-r05.dtsi | 17 - .../sm6150-sec-m40-swa-pinctrl-r06.dtsi | 17 - .../sm6150-sec-m40-swa-pinctrl-r08.dtsi | 17 - .../dts/samsung/sm6150-sec-m40-swa-r00.dtsi | 107 - .../dts/samsung/sm6150-sec-m40-swa-r01.dtsi | 46 - .../dts/samsung/sm6150-sec-m40-swa-r02.dtsi | 19 - .../dts/samsung/sm6150-sec-m40-swa-r03.dtsi | 19 - .../dts/samsung/sm6150-sec-m40-swa-r04.dtsi | 19 - .../dts/samsung/sm6150-sec-m40-swa-r05.dtsi | 19 - .../dts/samsung/sm6150-sec-m40-swa-r06.dtsi | 22 - .../dts/samsung/sm6150-sec-m40-swa-r08.dtsi | 19 - .../sm6150-sec-qg-batterydata-a60q.dtsi | 1067 - .../sm6150-sec-qg-batterydata-a70q.dtsi | 1067 - .../sm7150-camera-sensor-a70sq-r00.dtsi | 428 - .../samsung/sm7150-camera-sensor-r1q-r00.dtsi | 619 - .../samsung/sm7150-camera-sensor-r1q-r02.dtsi | 619 - .../samsung/sm7150-camera-sensor-r1q-r07.dtsi | 614 - .../sm7150-sec-a70sq-audio-pinctrl.dtsi | 171 - .../dts/samsung/sm7150-sec-a70sq-audio.dtsi | 177 - .../sm7150-sec-a70sq-battery-common.dtsi | 622 - .../samsung/sm7150-sec-a70sq-battery-r02.dtsi | 18 - .../samsung/sm7150-sec-a70sq-battery-r03.dtsi | 17 - .../dts/samsung/sm7150-sec-a70sq-common.dtsi | 172 - .../samsung/sm7150-sec-a70sq-display-r00.dtsi | 100 - .../samsung/sm7150-sec-a70sq-display-r01.dtsi | 125 - .../dts/samsung/sm7150-sec-a70sq-eif-r00.dtsi | 154 - .../sm7150-sec-a70sq-eur-overlay-r00.dts | 46 - .../sm7150-sec-a70sq-eur-overlay-r01.dts | 46 - .../sm7150-sec-a70sq-eur-pinctrl-r00.dtsi | 59 - .../sm7150-sec-a70sq-eur-pinctrl-r01.dtsi | 18 - .../dts/samsung/sm7150-sec-a70sq-eur-r00.dtsi | 26 - .../dts/samsung/sm7150-sec-a70sq-eur-r01.dtsi | 18 - .../sm7150-sec-a70sq-fingerprint_00.dtsi | 58 - .../sm7150-sec-a70sq-input-common.dtsi | 138 - .../dts/samsung/sm7150-sec-a70sq-mst-r00.dtsi | 52 - .../dts/samsung/sm7150-sec-a70sq-nfc-r00.dtsi | 99 - .../sm7150-sec-a70sq-pinctrl-common.dtsi | 408 - .../samsung/sm7150-sec-a70sq-pm-common.dtsi | 320 - .../sm7150-sec-a70sq-swa-overlay-r00.dts | 46 - .../sm7150-sec-a70sq-swa-overlay-r01.dts | 46 - .../sm7150-sec-a70sq-swa-pinctrl-r00.dtsi | 59 - .../sm7150-sec-a70sq-swa-pinctrl-r01.dtsi | 18 - .../dts/samsung/sm7150-sec-a70sq-swa-r00.dtsi | 52 - .../dts/samsung/sm7150-sec-a70sq-swa-r01.dtsi | 19 - .../sm7150-sec-a71-can-overlay-r00.dts | 36 - .../sm7150-sec-a71-can-overlay-r01.dts | 37 - .../sm7150-sec-a71-can-overlay-r02.dts | 36 - .../sm7150-sec-a71-can-overlay-r03.dts | 38 - .../sm7150-sec-a71-can-overlay-r04.dts | 41 - .../sm7150-sec-a71-can-overlay-r05.dts | 41 - .../sm7150-sec-a71-can-overlay-r06.dts | 41 - .../sm7150-sec-a71-eur-ldu-overlay-r00.dts | 36 - .../sm7150-sec-a71-eur-ldu-overlay-r01.dts | 37 - .../sm7150-sec-a71-eur-ldu-overlay-r02.dts | 36 - .../sm7150-sec-a71-eur-ldu-overlay-r03.dts | 38 - .../sm7150-sec-a71-eur-ldu-overlay-r04.dts | 41 - .../sm7150-sec-a71-eur-ldu-overlay-r05.dts | 41 - .../sm7150-sec-a71-eur-ldu-overlay-r06.dts | 41 - .../sm7150-sec-a71-eur-overlay-r00.dts | 36 - .../sm7150-sec-a71-eur-overlay-r01.dts | 37 - .../sm7150-sec-a71-eur-overlay-r02.dts | 37 - .../sm7150-sec-a71-eur-overlay-r03.dts | 38 - .../sm7150-sec-a71-eur-overlay-r04.dts | 41 - .../sm7150-sec-a71-eur-overlay-r05.dts | 41 - .../sm7150-sec-a71-eur-overlay-r06.dts | 41 - .../sm7150-sec-a71-eur-overlay-r07.dts | 41 - .../sm7150-sec-a71-swa-overlay-r00.dts | 35 - .../sm7150-sec-a71-swa-overlay-r01.dts | 36 - .../sm7150-sec-a71-swa-overlay-r02.dts | 36 - .../sm7150-sec-a71-swa-overlay-r03.dts | 36 - .../sm7150-sec-m41-swa-overlay-r00.dts | 29 - .../sm7150-sec-m51-eur-overlay-r00.dts | 30 - .../sm7150-sec-m51-eur-overlay-r01.dts | 30 - .../sm7150-sec-m51-eur-overlay-r02.dts | 30 - .../sm7150-sec-m51-eur-overlay-r04.dts | 30 - .../sm7150-sec-m51-eur-overlay-r05.dts | 30 - .../sm7150-sec-m51-swa-overlay-r00.dts | 30 - .../sm7150-sec-m51-swa-overlay-r01.dts | 30 - .../sm7150-sec-m51-swa-overlay-r02.dts | 30 - .../sm7150-sec-qg-batterydata-r1q.dtsi | 1068 - .../samsung/sm7150-sec-r1q-audio-pinctrl.dtsi | 326 - .../dts/samsung/sm7150-sec-r1q-audio.dtsi | 282 - .../sm7150-sec-r1q-battery-common.dtsi | 242 - .../samsung/sm7150-sec-r1q-battery-r02.dtsi | 18 - .../samsung/sm7150-sec-r1q-battery-r03.dtsi | 17 - .../sm7150-sec-r1q-chn-overlay-r00.dts | 44 - .../sm7150-sec-r1q-chn-overlay-r01.dts | 43 - .../sm7150-sec-r1q-chn-overlay-r02.dts | 43 - .../sm7150-sec-r1q-chn-overlay-r03.dts | 43 - .../sm7150-sec-r1q-chn-overlay-r04.dts | 43 - .../sm7150-sec-r1q-chn-overlay-r05.dts | 43 - .../sm7150-sec-r1q-chn-overlay-r06.dts | 44 - .../sm7150-sec-r1q-chn-overlay-r07.dts | 44 - .../sm7150-sec-r1q-chn-overlay-r08.dts | 44 - .../sm7150-sec-r1q-chn-pinctrl-r00.dtsi | 97 - .../sm7150-sec-r1q-chn-pinctrl-r01.dtsi | 17 - .../sm7150-sec-r1q-chn-pinctrl-r02.dtsi | 98 - .../sm7150-sec-r1q-chn-pinctrl-r03.dtsi | 17 - .../sm7150-sec-r1q-chn-pinctrl-r04.dtsi | 17 - .../sm7150-sec-r1q-chn-pinctrl-r05.dtsi | 17 - .../sm7150-sec-r1q-chn-pinctrl-r06.dtsi | 29 - .../sm7150-sec-r1q-chn-pinctrl-r07.dtsi | 17 - .../sm7150-sec-r1q-chn-pinctrl-r08.dtsi | 17 - .../dts/samsung/sm7150-sec-r1q-chn-r00.dtsi | 14 - .../dts/samsung/sm7150-sec-r1q-chn-r01.dtsi | 30 - .../dts/samsung/sm7150-sec-r1q-chn-r02.dtsi | 17 - .../dts/samsung/sm7150-sec-r1q-chn-r03.dtsi | 17 - .../dts/samsung/sm7150-sec-r1q-chn-r04.dtsi | 50 - .../dts/samsung/sm7150-sec-r1q-chn-r05.dtsi | 13 - .../dts/samsung/sm7150-sec-r1q-chn-r06.dtsi | 24 - .../dts/samsung/sm7150-sec-r1q-chn-r07.dtsi | 13 - .../dts/samsung/sm7150-sec-r1q-chn-r08.dtsi | 13 - .../dts/samsung/sm7150-sec-r1q-common.dtsi | 165 - .../samsung/sm7150-sec-r1q-display-r00.dtsi | 161 - .../samsung/sm7150-sec-r1q-display-r01.dtsi | 103 - .../dts/samsung/sm7150-sec-r1q-eif-r00.dtsi | 228 - .../dts/samsung/sm7150-sec-r1q-eif-r01.dtsi | 185 - .../dts/samsung/sm7150-sec-r1q-eif-r04.dtsi | 335 - .../dts/samsung/sm7150-sec-r1q-eif-r05.dtsi | 335 - .../sm7150-sec-r1q-eur-overlay-r00.dts | 47 - .../sm7150-sec-r1q-eur-overlay-r01.dts | 43 - .../sm7150-sec-r1q-eur-overlay-r02.dts | 43 - .../sm7150-sec-r1q-eur-overlay-r03.dts | 43 - .../sm7150-sec-r1q-eur-overlay-r04.dts | 43 - .../sm7150-sec-r1q-eur-overlay-r05.dts | 43 - .../sm7150-sec-r1q-eur-overlay-r06.dts | 44 - .../sm7150-sec-r1q-eur-overlay-r07.dts | 44 - .../sm7150-sec-r1q-eur-overlay-r08.dts | 44 - .../sm7150-sec-r1q-eur-pinctrl-r00.dtsi | 97 - .../sm7150-sec-r1q-eur-pinctrl-r01.dtsi | 17 - .../sm7150-sec-r1q-eur-pinctrl-r02.dtsi | 98 - .../sm7150-sec-r1q-eur-pinctrl-r03.dtsi | 17 - .../sm7150-sec-r1q-eur-pinctrl-r04.dtsi | 17 - .../sm7150-sec-r1q-eur-pinctrl-r05.dtsi | 17 - .../sm7150-sec-r1q-eur-pinctrl-r06.dtsi | 29 - .../sm7150-sec-r1q-eur-pinctrl-r07.dtsi | 17 - .../sm7150-sec-r1q-eur-pinctrl-r08.dtsi | 17 - .../dts/samsung/sm7150-sec-r1q-eur-r00.dtsi | 14 - .../dts/samsung/sm7150-sec-r1q-eur-r01.dtsi | 30 - .../dts/samsung/sm7150-sec-r1q-eur-r02.dtsi | 17 - .../dts/samsung/sm7150-sec-r1q-eur-r03.dtsi | 17 - .../dts/samsung/sm7150-sec-r1q-eur-r04.dtsi | 50 - .../dts/samsung/sm7150-sec-r1q-eur-r05.dtsi | 13 - .../dts/samsung/sm7150-sec-r1q-eur-r06.dtsi | 24 - .../dts/samsung/sm7150-sec-r1q-eur-r07.dtsi | 13 - .../dts/samsung/sm7150-sec-r1q-eur-r08.dtsi | 13 - .../sm7150-sec-r1q-fingerprint_00.dtsi | 32 - .../sm7150-sec-r1q-fingerprint_04.dtsi | 38 - .../samsung/sm7150-sec-r1q-input-common.dtsi | 80 - .../samsung/sm7150-sec-r1q-kor-nfc-r00.dtsi | 71 - .../sm7150-sec-r1q-kor-overlay-r00.dts | 44 - .../sm7150-sec-r1q-kor-overlay-r01.dts | 43 - .../sm7150-sec-r1q-kor-overlay-r02.dts | 43 - .../sm7150-sec-r1q-kor-overlay-r03.dts | 43 - .../sm7150-sec-r1q-kor-overlay-r04.dts | 43 - .../sm7150-sec-r1q-kor-overlay-r05.dts | 43 - .../sm7150-sec-r1q-kor-overlay-r06.dts | 44 - .../sm7150-sec-r1q-kor-overlay-r07.dts | 44 - .../sm7150-sec-r1q-kor-overlay-r08.dts | 44 - .../sm7150-sec-r1q-kor-overlay-r09.dts | 44 - .../sm7150-sec-r1q-kor-pinctrl-r00.dtsi | 97 - .../sm7150-sec-r1q-kor-pinctrl-r01.dtsi | 17 - .../sm7150-sec-r1q-kor-pinctrl-r02.dtsi | 17 - .../sm7150-sec-r1q-kor-pinctrl-r03.dtsi | 17 - .../sm7150-sec-r1q-kor-pinctrl-r04.dtsi | 17 - .../sm7150-sec-r1q-kor-pinctrl-r05.dtsi | 17 - .../sm7150-sec-r1q-kor-pinctrl-r06.dtsi | 30 - .../sm7150-sec-r1q-kor-pinctrl-r07.dtsi | 17 - .../sm7150-sec-r1q-kor-pinctrl-r08.dtsi | 17 - .../sm7150-sec-r1q-kor-pinctrl-r09.dtsi | 17 - .../dts/samsung/sm7150-sec-r1q-kor-r00.dtsi | 14 - .../dts/samsung/sm7150-sec-r1q-kor-r01.dtsi | 30 - .../dts/samsung/sm7150-sec-r1q-kor-r02.dtsi | 17 - .../dts/samsung/sm7150-sec-r1q-kor-r03.dtsi | 17 - .../dts/samsung/sm7150-sec-r1q-kor-r04.dtsi | 50 - .../dts/samsung/sm7150-sec-r1q-kor-r05.dtsi | 13 - .../dts/samsung/sm7150-sec-r1q-kor-r06.dtsi | 24 - .../dts/samsung/sm7150-sec-r1q-kor-r07.dtsi | 13 - .../dts/samsung/sm7150-sec-r1q-kor-r08.dtsi | 13 - .../dts/samsung/sm7150-sec-r1q-kor-r09.dtsi | 13 - .../dts/samsung/sm7150-sec-r1q-mst-r00.dtsi | 52 - .../dts/samsung/sm7150-sec-r1q-nfc-r00.dtsi | 86 - .../dts/samsung/sm7150-sec-r1q-nfc-r02.dtsi | 103 - .../sm7150-sec-r1q-pinctrl-common.dtsi | 235 - .../dts/samsung/sm7150-sec-r1q-pm-common.dtsi | 336 - .../configs/vendor/lineage-a52q_defconfig | 50 +- .../configs/vendor/lineage-a72q_defconfig | 50 +- arch/arm64/kernel/armv8_deprecated.c | 9 +- arch/arm64/kernel/process.c | 60 - block/elevator.c | 3 + drivers/Makefile | 2 +- drivers/adsp_factory/Kconfig | 11 +- drivers/adsp_factory/Makefile | 3 +- drivers/adsp_factory/ssc_core.c | 47 + drivers/adsp_factory/veml3328_light.c | 118 + drivers/android/binder.c | 69 +- drivers/battery/charger/sm5440_charger.c | 18 +- drivers/battery/charger/sm5714_charger.c | 94 +- drivers/battery/charger/sm5714_charger_oper.c | 218 +- drivers/battery/common/sec_battery.c | 49 +- drivers/battery/common/sec_battery.h | 8 +- drivers/battery/common/sec_battery_thermal.c | 9 +- drivers/battery/common/sec_battery_ttf.c | 7 +- drivers/battery/common/sec_step_charging.c | 6 +- drivers/battery/fuelgauge/sm5714_fuelgauge.c | 5 +- drivers/battery_v2/include/sec_battery.h | 2 + .../battery_v2/include/sec_battery_sysfs.h | 1 + drivers/battery_v2/sec_battery.c | 93 +- drivers/battery_v2/sec_battery_sysfs.c | 40 +- drivers/battery_v2/sec_battery_ttf.c | 53 +- drivers/block/loop.c | 3 +- drivers/block/zram/zram_drv.c | 59 +- drivers/block/zram/zram_drv.h | 2 + drivers/char/adsprpc.c | 42 + drivers/fingerprint/et5xx-spi.c | 1 + drivers/gpu/drm/msm/dsi-staging/dsi_panel.c | 163 +- drivers/gpu/drm/msm/dsi-staging/dsi_pwr.c | 61 + drivers/gpu/drm/msm/msm_drv.c | 31 +- .../samsung_lego/HX83102_TV104WUM/Makefile | 9 + ...si_panel_HX83102_TV104WUM_wuxga_video.dtsi | 355 + .../HX83102_TV104WUM/ss_buck_isl98609_i2c.c | 249 + .../HX83102_TV104WUM/ss_buck_isl98609_i2c.h | 22 + .../ss_dsi_panel_HX83102_TV104WUM.c | 372 + .../ss_dsi_panel_HX83102_TV104WUM.h | 51 + drivers/gpu/drm/msm/samsung_lego/Kconfig | 8 + drivers/gpu/drm/msm/samsung_lego/Makefile | 5 +- ...panel_S6E3FC3_AMS646YD04_fhd_octa_cmd.dtsi | 24 +- .../ss_dsi_panel_S6E3FC3_AMS646YD04.c | 23 +- ...panel_S6E3FC3_AMS667YM01_fhd_octa_cmd.dtsi | 18 + .../ss_dsi_panel_S6E3FC3_AMS667YM01.c | 21 +- .../msm/samsung_lego/ss_dsi_panel_common.c | 21 + .../msm/samsung_lego/ss_dsi_panel_common.h | 35 + drivers/gpu/drm/msm/sde_dbg.c | 16 +- drivers/gpu/msm/a6xx_reg.h | 3 + drivers/gpu/msm/adreno.c | 3 + drivers/gpu/msm/adreno.h | 14 + drivers/gpu/msm/adreno_a6xx_preempt.c | 49 +- drivers/gpu/msm/adreno_compat.c | 9 + drivers/gpu/msm/adreno_dispatch.c | 5 +- drivers/gpu/msm/adreno_ioctl.c | 9 + drivers/gpu/msm/adreno_iommu.c | 19 + drivers/gpu/msm/adreno_perfcounter.c | 7 +- drivers/gpu/msm/adreno_pm4types.h | 7 + drivers/gpu/msm/adreno_ringbuffer.c | 3 +- drivers/gpu/msm/adreno_sysfs.c | 33 +- drivers/gpu/msm/kgsl.c | 24 +- drivers/gpu/msm/kgsl_drawobj.c | 35 +- drivers/gpu/msm/kgsl_iommu.c | 11 +- drivers/gpu/msm/kgsl_mmu.c | 9 +- drivers/gpu/msm/kgsl_mmu.h | 8 +- drivers/hid/Kconfig | 10 +- drivers/hid/hid-chicony.c | 8 +- drivers/hid/hid-corsair.c | 7 +- drivers/hid/hid-elo.c | 3 + drivers/hid/hid-holtek-kbd.c | 9 +- drivers/hid/hid-holtek-mouse.c | 9 + drivers/hid/hid-lg.c | 10 +- drivers/hid/hid-prodikeys.c | 10 +- drivers/hid/hid-qvr.c | 22 +- drivers/hid/hid-roccat-arvo.c | 3 + drivers/hid/hid-roccat-isku.c | 3 + drivers/hid/hid-roccat-kone.c | 3 + drivers/hid/hid-roccat-koneplus.c | 3 + drivers/hid/hid-roccat-konepure.c | 3 + drivers/hid/hid-roccat-kovaplus.c | 3 + drivers/hid/hid-roccat-lua.c | 3 + drivers/hid/hid-roccat-pyra.c | 3 + drivers/hid/hid-roccat-ryos.c | 3 + drivers/hid/hid-roccat-savu.c | 3 + drivers/hid/wacom_sys.c | 19 +- drivers/input/Kconfig | 14 + drivers/input/Makefile | 5 +- drivers/input/keyboard/Kconfig | 7 + drivers/input/keyboard/Makefile | 1 + drivers/input/keyboard/gpio_keys.c | 14 +- drivers/input/keyboard/hall.c | 628 + drivers/input/misc/qpnp-power-on.c | 4 +- drivers/input/sec_input/Kconfig | 45 + drivers/input/sec_input/Makefile | 12 + drivers/input/sec_input/sec_cmd.c | 1110 + drivers/input/sec_input/sec_cmd.h | 129 + drivers/input/sec_input/sec_common_fn.c | 1515 ++ drivers/input/sec_input/sec_input.h | 783 + drivers/input/sec_input/sec_input_notifier.c | 73 + drivers/input/sec_input/sec_secure_touch.c | 399 + drivers/input/sec_input/sec_secure_touch.h | 91 + drivers/input/sec_input/sec_tclm_v2.c | 614 + drivers/input/sec_input/sec_tclm_v2.h | 115 + drivers/input/sec_input/sec_tsp_dumpkey.c | 368 + drivers/input/sec_input/sec_tsp_dumpkey.h | 11 + drivers/input/sec_input/sec_tsp_log.c | 689 + drivers/input/sec_input/sec_tsp_log.h | 49 + drivers/input/sec_input/sec_virtual_tsp.c | 435 + drivers/input/touchscreen/Kconfig | 21 +- drivers/input/touchscreen/Makefile | 4 +- .../input/touchscreen/himax/hx831xx/Kconfig | 137 + .../input/touchscreen/himax/hx831xx/Makefile | 12 + .../touchscreen/himax/hx831xx/himax_common.c | 3543 +++ .../touchscreen/himax/hx831xx/himax_common.h | 632 + .../touchscreen/himax/hx831xx/himax_debug.c | 2878 +++ .../touchscreen/himax/hx831xx/himax_debug.h | 159 + .../himax/hx831xx/himax_ic_HX83102.c | 1557 ++ .../himax/hx831xx/himax_ic_HX83102.h | 65 + .../touchscreen/himax/hx831xx/himax_ic_core.h | 972 + .../himax/hx831xx/himax_ic_incell_core.c | 3931 ++++ .../himax/hx831xx/himax_inspection.c | 5605 +++++ .../himax/hx831xx/himax_inspection.h | 312 + .../touchscreen/himax/hx831xx/himax_modular.h | 106 + .../himax/hx831xx/himax_platform.c | 982 + .../himax/hx831xx/himax_platform.h | 149 + .../himax/hx831xx/himax_platform_SPI.c | 1265 ++ .../himax/hx831xx/himax_platform_SPI.h | 170 + drivers/input/w9019/Kconfig | 15 + drivers/input/w9019/Makefile | 4 + drivers/input/w9019/w9019_flash.c | 713 + drivers/input/w9019/w9019_flash.h | 149 + drivers/input/w9019/wacom_dev.h | 624 + drivers/input/w9019/wacom_i2c.c | 3082 +++ drivers/input/w9019/wacom_i2c.h | 41 + drivers/input/w9019/wacom_i2c_elec.c | 776 + drivers/input/w9019/wacom_i2c_sec.c | 3308 +++ drivers/input/w9019/wacom_reg.h | 125 + drivers/input/wacom/Kconfig | 15 + drivers/input/wacom/Makefile | 4 + drivers/input/wacom/wacom_dev.h | 608 + drivers/input/wacom/wacom_i2c.c | 3250 +++ drivers/input/wacom/wacom_i2c_elec.c | 609 + drivers/input/wacom/wacom_i2c_sec.c | 3225 +++ drivers/input/wacom/wacom_reg.h | 119 + drivers/input/wacom/wez01_flash.c | 630 + drivers/input/wacom/wez01_flash.h | 122 + drivers/media/platform/msm/camera/Kconfig | 7 + .../cam_actuator/cam_actuator_core.c | 16 +- .../cam_sensor_module/cam_cci/cam_cci_core.c | 1 + .../cam_eeprom/cam_eeprom_core.c | 10 +- .../cam_eeprom/cam_eeprom_dev.h | 18 + .../cam_sensor/cam_sensor_core.c | 21 + .../cam_sensor_utils/cam_sensor_util.c | 4 +- .../cam_sensor_utils/cam_sensor_util.h | 2 + .../cam_sensor_utils/cam_sysfs_init.c | 17 + drivers/media/platform/msm/vidc/msm_vidc.c | 22 + .../media/platform/msm/vidc/msm_vidc_common.c | 19 +- .../platform/msm/vidc/msm_vidc_internal.h | 1 + drivers/misc/qseecom.c | 4 + drivers/mmc/core/core.c | 24 + drivers/muic/common/muic-core.c | 50 + drivers/muic/s2mu106-muic.c | 2 +- drivers/muic/sm/sm5714/sm5714-muic-afc.c | 29 +- drivers/muic/sm/sm5714/sm5714-muic.c | 1 + drivers/net/ethernet/broadcom/Makefile | 1 - drivers/net/ethernet/broadcom/tg3.c | 18330 ---------------- drivers/net/ethernet/broadcom/tg3.h | 3431 --- .../net/ethernet/qualcomm/rmnet/rmnet_vnd.c | 42 + .../wifi_pos/src/target_if_wifi_pos.c | 13 +- .../cmn_defs/inc/wlan_cmn_ieee80211.h | 8 + .../crypto/inc/wlan_crypto_global_api.h | 10 + .../crypto/inc/wlan_crypto_global_def.h | 6 + .../crypto/src/wlan_crypto_global_api.c | 21 + .../umac/scan/core/src/wlan_scan_bss_score.c | 44 +- .../dispatcher/inc/wlan_scan_public_structs.h | 5 + .../scan/dispatcher/inc/wlan_scan_utils_api.h | 16 +- .../scan/dispatcher/src/wlan_scan_utils_api.c | 22 +- .../umac/wifi_pos/src/wifi_pos_utils_i.h | 4 +- .../utils/fwlog/dbglog_host.c | 2 +- .../wmi/src/wmi_unified_tlv.c | 11 + .../components/mlme/core/src/wlan_mlme_main.c | 7 +- .../mlme/dispatcher/inc/cfg_mlme_scoring.h | 31 + .../dispatcher/inc/wlan_mlme_public_struct.h | 2 + .../core/hdd/src/wlan_hdd_cfg80211.h | 2 - .../core/hdd/src/wlan_hdd_hostapd.c | 54 +- .../qcacld-3.0/core/mac/src/include/dot11f.h | 2 +- .../qcacld-3.0/core/mac/src/pe/lim/lim_api.c | 5 +- .../core/mac/src/pe/lim/lim_assoc_utils.c | 57 +- .../mac/src/sys/legacy/src/utils/src/dot11f.c | 20 +- .../src/sys/legacy/src/utils/src/parser_api.c | 19 +- .../wcn39xx/qcacld-3.0/core/sap/inc/sap_api.h | 1 + .../wcn39xx/qcacld-3.0/core/sap/src/sap_fsm.c | 2 + .../wcn39xx/qcacld-3.0/core/sme/inc/csr_api.h | 1 + .../core/sme/src/csr/csr_api_roam.c | 41 + .../qcacld-3.0/core/wma/src/wma_scan_roam.c | 5 +- drivers/nfc/pn547.c | 13 +- drivers/samsung/Kconfig | 6 + drivers/samsung/Makefile | 3 +- drivers/samsung/debug/Makefile | 1 - drivers/samsung/debug/kunit_test/Makefile | 2 - .../samsung/debug/kunit_test/sec_debug_test.c | 105 - drivers/samsung/debug/sec_bootstat.c | 7 + drivers/samsung/debug/sec_debug.c | 7 +- drivers/samsung/debug/sec_debug_force_err.c | 4 +- drivers/samsung/debug/sec_debug_sched_log.c | 29 +- drivers/samsung/debug/sec_debug_user_reset.c | 48 +- drivers/samsung/debug/sec_log_buf.c | 4 +- drivers/samsung/kunit_test/Makefile | 2 - drivers/samsung/kunit_test/sec_class_test.c | 108 - drivers/samsung/lmkd_debug.c | 147 + drivers/samsung/quest/sec_quest.c | 16 + drivers/scsi/ufs/ufshcd.c | 113 +- .../security/samsung/five_tee_driver/Kconfig | 2 +- drivers/security/samsung/icdrv/Kconfig | 2 +- drivers/security/samsung/icdrv/test/Makefile | 1 - drivers/security/samsung/tzic/Kconfig | 1 + drivers/sensors/Kconfig | 32 + drivers/sensors/Makefile | 1 + drivers/sensors/isg6320.c | 3389 +++ drivers/sensors/isg6320_reg.h | 258 + drivers/sensors/sx9360.c | 323 +- drivers/sensors/sx9360_reg.h | 2 +- drivers/soc/qcom/hgsl/hgsl.c | 2 +- drivers/soc/qcom/icnss.c | 22 +- drivers/staging/sti/abc/abc_common.c | 110 +- drivers/staging/sti/abc/abc_hub.c | 38 + drivers/staging/sti/abc/abc_hub_bootc.c | 83 +- drivers/usb/gadget/composite.c | 17 +- drivers/usb/gadget/function/f_mtp_samsung.c | 6 +- drivers/usb/gadget/function/rndis.c | 10 +- drivers/usb/notify_v34/usb_notify_sysfs.c | 63 + drivers/usb/notify_v34/usb_notify_sysfs.h | 1 + drivers/usb/phy/phy-msm-qusb-v2.c | 5 + .../manager/lego/usb_typec_manager_notifier.c | 4 +- drivers/usb/typec/sm/sm5714/sm5714_policy.c | 11 +- drivers/usb/typec/sm/sm5714/sm5714_typec.c | 51 +- firmware/Makefile | 4 + firmware/epen/w9019_gts6lite.bin | Bin 0 -> 131092 bytes firmware/epen/w9021_gts6lite.bin | Bin 0 -> 262164 bytes .../tsp_himax/hx83102e_gts6litereresh.bin | Bin 0 -> 131072 bytes firmware/tsp_stm/fts5cu56a_a52.bin | Bin 122292 -> 122292 bytes firmware/tsp_stm/fts5cu56a_a52xq.bin | Bin 0 -> 122292 bytes fs/crypto/keysetup.c | 21 +- fs/crypto/policy.c | 64 +- fs/crypto/sdp/sdp_dek.c | 112 + fs/f2fs/checkpoint.c | 2 +- fs/f2fs/compress.c | 30 +- fs/f2fs/data.c | 5 +- fs/f2fs/debug.c | 11 +- fs/f2fs/f2fs.h | 33 +- fs/f2fs/file.c | 67 +- fs/f2fs/inode.c | 11 +- fs/f2fs/node.c | 29 +- fs/f2fs/node.h | 4 +- fs/f2fs/segment.c | 3 + fs/f2fs/shrinker.c | 4 +- fs/f2fs/super.c | 3 + fs/fuse/dev.c | 2 +- fs/fuse/file.c | 10 +- fs/quota/quota_tree.c | 8 +- fs/quota/quota_v2.c | 19 + fs/signalfd.c | 12 +- include/linux/adsp/adsp_ft_common.h | 14 + include/linux/blk-mq.h | 6 + include/linux/dbmdx.h | 133 + include/linux/defex.h | 2 +- include/linux/f2fs_fs.h | 1 + include/linux/hid.h | 5 + include/linux/lsm_hooks.h | 28 +- include/linux/mmc/host.h | 4 +- include/linux/muic/common/muic.h | 9 + include/linux/olog.pb.h | 82 + include/linux/ologk.h | 8 +- include/linux/perflog.h | 137 + include/linux/samsung/debug/sec_debug.h | 3 + .../samsung/debug/sec_debug_summary_type.h | 9 + include/linux/samsung/sec_param.h | 8 + include/linux/security.h | 28 +- include/linux/sizes.h | 4 + include/linux/sti/abc_common.h | 26 +- include/linux/sti/abc_hub.h | 1 + .../linux/usb/typec/sm/sm5714/sm5714_typec.h | 4 +- include/linux/wait.h | 26 + include/linux/zsmalloc.h | 3 + include/net/af_unix.h | 1 + include/net/sctp/structs.h | 2 +- include/sound/dbmdx-export.h | 26 + include/uapi/linux/android/binderfs.h | 4 +- include/uapi/linux/input.h | 3 +- kernel/fork.c | 54 + kernel/sched/wait.c | 8 + lib/iov_iter.c | 2 + mm/page_alloc.c | 12 +- mm/rbincache.c | 4 + mm/zsmalloc.c | 53 + net/Makefile | 2 +- net/ipv4/igmp.c | 2 + net/packet/af_packet.c | 5 +- net/sctp/bind_addr.c | 19 +- net/sctp/input.c | 11 +- net/sctp/ipv6.c | 7 +- net/sctp/protocol.c | 7 +- net/sctp/sm_make_chunk.c | 42 +- net/unix/Kconfig | 5 + net/unix/Makefile | 2 + net/unix/af_unix.c | 102 +- net/unix/garbage.c | 68 +- net/unix/scm.c | 149 + net/unix/scm.h | 10 + scripts/basic/.fixdep.cmd | 105 + scripts/basic/fixdep | Bin 0 -> 13832 bytes scripts/kconfig/.conf.cmd | 1 + scripts/kconfig/.conf.o.cmd | 114 + scripts/kconfig/.zconf.tab.o.cmd | 126 + scripts/kconfig/conf | Bin 0 -> 121816 bytes scripts/kconfig/conf.o | Bin 0 -> 24136 bytes scripts/kconfig/zconf.lex.c | 2473 +++ scripts/kconfig/zconf.tab.c | 2471 +++ scripts/kconfig/zconf.tab.o | Bin 0 -> 170400 bytes security/Kconfig | 2 +- security/samsung/defex_lsm/Makefile | 28 +- .../catch_engine/kunit_test/Makefile | 125 - .../kunit_test/defex_caches_test.c | 90 - .../kunit_test/defex_catch_list_compat_test.c | 1030 - .../kunit_test/defex_catch_list_test.c | 1235 -- .../catch_engine/kunit_test/defex_ht_test.c | 623 - security/samsung/defex_lsm/cert/defex_sign.c | 30 +- .../defex_lsm/cert/kunit_test/Makefile | 121 - .../cert/kunit_test/defex_sign_test.c | 92 - .../samsung/defex_lsm/core/defex_common.c | 6 +- .../samsung/defex_lsm/core/defex_get_mode.c | 22 + security/samsung/defex_lsm/core/defex_main.c | 130 +- .../samsung/defex_lsm/core/defex_rules_proc.c | 32 +- .../samsung/defex_lsm/core/defex_tailer.c | 98 + .../defex_lsm/core/kunit_test/Makefile | 126 - .../core/kunit_test/defex_common_test.c | 280 - .../core/kunit_test/defex_get_mode_test.c | 165 - .../core/kunit_test/defex_lsm_test.c | 70 - .../core/kunit_test/defex_main_test.c | 590 - .../core/kunit_test/defex_rules_proc_test.c | 535 - .../core/kunit_test/defex_sysfs_test.c | 534 - .../samsung/defex_lsm/debug/defex_debug.c | 8 +- .../defex_lsm/debug/kunit_test/Makefile | 121 - .../debug/kunit_test/defex_debug_test.c | 161 - .../samsung/defex_lsm/defex_packed_rules.bin | Bin 0 -> 12449 bytes .../samsung/defex_lsm/defex_packed_rules.inc | 787 + security/samsung/defex_lsm/defex_rules.c | 231 + .../feature_immutable/kunit_test/Makefile | 121 - .../kunit_test/defex_immutable_test.c | 51 - .../kunit_test/Makefile | 121 - .../kunit_test/defex_priv_test.c | 51 - .../feature_safeplace/defex_integrity.c | 37 + .../feature_safeplace/kunit_test/Makefile | 121 - .../kunit_test/defex_safeplace_test.c | 51 - .../feature_trusted_map/defex_trusted_map.c | 16 + .../defex_lsm/feature_trusted_map/dtm.c | 206 + .../feature_trusted_map/dtm_engine.c | 193 + .../dtm_engine_defaultpolicy.h | 4 + .../defex_lsm/feature_trusted_map/dtm_log.c | 115 + .../defex_lsm/feature_trusted_map/dtm_utils.c | 137 + .../feature_trusted_map/include/dtm.h | 84 + .../feature_trusted_map/include/dtm_engine.h | 21 + .../feature_trusted_map/include/dtm_log.h | 43 + .../feature_trusted_map/include/dtm_utils.h | 45 + .../feature_trusted_map/kunit_test/Makefile | 2 - .../defex_lsm/feature_trusted_map/ptree.c | 476 + .../samsung/defex_lsm/include/defex_config.h | 16 +- .../samsung/defex_lsm/include/defex_debug.h | 1 + .../defex_lsm/include/defex_internal.h | 33 + .../samsung/defex_lsm/include/defex_rules.h | 13 +- .../samsung/defex_lsm/include/defex_tailer.h | 57 + security/samsung/defex_lsm/include/ptree.h | 171 + security/samsung/defex_lsm/pack_rules | Bin 0 -> 19248 bytes security/samsung/defex_lsm/pack_rules.c | 1 + security/samsung/dsms/Makefile | 1 - security/samsung/dsms/dsms_policy.c | 3 + security/samsung/dsms/kunit_test/Makefile | 24 - .../samsung/dsms/kunit_test/dsms_test_utils.c | 59 - .../samsung/dsms/kunit_test/dsms_test_utils.h | 22 - .../security_dsms_access_control_test.c | 141 - .../kunit_test/security_dsms_debug_test.c | 45 - .../dsms/kunit_test/security_dsms_init_test.c | 86 - .../security_dsms_kernel_api_test.c | 113 - .../kunit_test/security_dsms_netlink_test.c | 77 - .../kunit_test/security_dsms_policy_test.c | 49 - .../security_dsms_preboot_buffer_test.c | 249 - .../security_dsms_rate_limit_test.c | 175 - .../security_dsms_test_utils_test.c | 72 - security/samsung/five/Makefile | 2 - security/samsung/five/five_appraise.c | 3 +- security/samsung/five/five_cache.h | 2 +- security/samsung/five/five_crypto.c | 2 +- security/samsung/five/five_dmverity.c | 2 +- security/samsung/five/five_main.c | 24 +- security/samsung/five/five_porting.h | 20 +- security/samsung/five/five_testing.h | 10 +- security/samsung/five/gki/five_appraise.c | 8 +- security/samsung/five/kunit_test/Makefile | 17 - .../samsung/five/kunit_test/five_audit_test.c | 121 - .../samsung/five/kunit_test/five_cache_test.c | 73 - .../samsung/five/kunit_test/five_cert_test.c | 285 - .../five/kunit_test/five_crypto_test.c | 131 - .../five/kunit_test/five_dmverity_test.c | 703 - .../samsung/five/kunit_test/five_dsms_test.c | 285 - security/samsung/five/kunit_test/five_file.c | 13 - security/samsung/five/kunit_test/five_file.h | 7 - .../five/kunit_test/five_keyring_test.c | 312 - .../samsung/five/kunit_test/five_lv_test.c | 108 - .../samsung/five/kunit_test/five_pa_test.c | 275 - .../samsung/five/kunit_test/five_state_test.c | 612 - .../five/kunit_test/task_integrity_test.c | 285 - .../samsung/five/kunit_test/test_helpers.h | 23 - security/samsung/five/s_os/five_appraise.c | 3 +- security/samsung/five/s_os/five_main.c | 7 + security/samsung/mz/Kconfig | 26 + security/samsung/mz/Makefile | 21 + security/samsung/mz/include/linux/mz.h | 31 + security/samsung/mz/mz.c | 441 + security/samsung/mz/mz.h | 31 + security/samsung/mz/mz_crypto.c | 68 + security/samsung/mz/mz_internal.h | 100 + security/samsung/mz/mz_ioctl.c | 222 + security/samsung/mz/mz_log.c | 58 + security/samsung/mz/mz_log.h | 18 + security/samsung/mz/mz_mem.c | 147 + security/samsung/mz/mz_page.c | 290 + security/samsung/mz/mz_page.h | 34 + security/samsung/mz/mz_page_v5_10.c | 291 + security/samsung/mz/test/Makefile | 1 + security/samsung/mz/test/security_mz_test.c | 152 + security/samsung/mz_tee_driver/Kconfig | 48 + security/samsung/mz_tee_driver/Makefile | 18 + .../samsung/mz_tee_driver/mz_tee_driver.c | 397 + .../samsung/mz_tee_driver/mz_tee_driver_qc.c | 393 + .../mz_tee_driver/mz_tee_driver_teegris.c | 495 + .../mz_tee_driver/security_mz_tee_driver.py | 50 + security/samsung/proca/Makefile | 8 +- security/samsung/proca/gaf/Makefile | 7 + security/samsung/proca/gaf/gaf_v6.c | 6 +- security/samsung/proca/proca_certificate.c | 15 +- security/samsung/proca/proca_config.c | 4 + security/samsung/proca/proca_porting.h | 12 +- security/samsung/proca/security_proca.py | 95 + security/security.c | 14 +- security/selinux/hooks.c | 58 +- security/selinux/include/classmap.h | 3 +- security/selinux/include/security.h | 8 + security/selinux/nlmsgtab.c | 25 +- security/selinux/ss/policydb.c | 6 +- security/selinux/ss/policydb.h | 2 + security/selinux/ss/services.c | 1 + sound/core/pcm_lib.c | 4 + sound/soc/codecs/Kconfig | 3 + sound/soc/codecs/Makefile | 3 + sound/soc/codecs/dbmdx/Kconfig | 124 + sound/soc/codecs/dbmdx/Makefile | 75 + sound/soc/codecs/dbmdx/dbmdx-cdev.c | 225 + sound/soc/codecs/dbmdx/dbmdx-customer-def.h | 53 + sound/soc/codecs/dbmdx/dbmdx-customer.c | 58 + sound/soc/codecs/dbmdx/dbmdx-customer.h | 24 + sound/soc/codecs/dbmdx/dbmdx-i2c-d2.c | 360 + sound/soc/codecs/dbmdx/dbmdx-i2c-d4.c | 302 + sound/soc/codecs/dbmdx/dbmdx-i2c-sbl-d2.h | 60 + sound/soc/codecs/dbmdx/dbmdx-i2c.c | 921 + sound/soc/codecs/dbmdx/dbmdx-i2c.h | 62 + sound/soc/codecs/dbmdx/dbmdx-i2s.c | 239 + sound/soc/codecs/dbmdx/dbmdx-i2s.h | 33 + sound/soc/codecs/dbmdx/dbmdx-interface.h | 694 + sound/soc/codecs/dbmdx/dbmdx-snd-pcm.c | 787 + sound/soc/codecs/dbmdx/dbmdx-snd.c | 223 + sound/soc/codecs/dbmdx/dbmdx-spi-d2.c | 371 + sound/soc/codecs/dbmdx/dbmdx-spi-d4.c | 719 + sound/soc/codecs/dbmdx/dbmdx-spi.c | 1222 ++ sound/soc/codecs/dbmdx/dbmdx-spi.h | 69 + sound/soc/codecs/dbmdx/dbmdx-uart-d2.c | 684 + sound/soc/codecs/dbmdx/dbmdx-uart-d4.c | 699 + sound/soc/codecs/dbmdx/dbmdx-uart-sbl-d2.h | 398 + sound/soc/codecs/dbmdx/dbmdx-uart.c | 1491 ++ sound/soc/codecs/dbmdx/dbmdx-uart.h | 81 + sound/soc/codecs/dbmdx/dbmdx-va-regmap.h | 135 + sound/soc/codecs/dbmdx/dbmdx-vqe-regmap.h | 80 + sound/soc/codecs/dbmdx/dbmdx.c | 16979 ++++++++++++++ techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.c | 16 +- techpack/audio/4.0/asoc/codecs/wcd-mbhc-v2.c | 3 +- .../audio/4.0/asoc/codecs/wcd938x/internal.h | 5 +- .../4.0/asoc/codecs/wcd938x/wcd938x-mbhc.c | 9 - .../audio/4.0/asoc/codecs/wcd938x/wcd938x.c | 229 +- .../audio/4.0/config/sm7125_gta4xlve.conf | 52 + techpack/audio/4.0/config/sm7125_gta4xlve.h | 58 + techpack/audio/4.0/dsp/q6audio_adaptation.c | 121 + .../audio/4.0/include/dsp/sec_adaptation.h | 6 + techpack/audio/Makefile | 5 + 1358 files changed, 174299 insertions(+), 108268 deletions(-) delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-battery-can-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r07.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r07.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-input-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-ltn-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-ltn-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-ltn-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-pm-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a52q-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-common.dtsi mode change 100755 => 100644 arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r00.dts mode change 100755 => 100644 arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r01.dts mode change 100755 => 100644 arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r02.dts mode change 100755 => 100644 arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r04.dts mode change 100755 => 100644 arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-input-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-pm-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-a72q-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-dcc-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-input-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-pm-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-pm-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/atoll-sec-uart-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-battery-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-input-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-pinctrl-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-pm-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-dcc.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-battery-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-input-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-pinctrl-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-pm-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-battery-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-input-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-pinctrl-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-pm-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-abc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-audio-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-audio-pinctrl-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-battery-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-battery-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-camera-sensor-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-camera-sensor-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-display-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-fingerprint_00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-hall-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-nfc_r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-usb-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-vibrator-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-audio-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-audio-pinctrl-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-battery-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-battery-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-camera-sensor-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-camera-sensor-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-display-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-fingerprint-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-hall-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-usb-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-vibrator-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-abc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-audio-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-audio-pinctrl-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-battery-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-battery-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-display-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-fingerprint-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-usb-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-vibrator-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-a71-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-a71-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-m41-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-m51-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-audio-pinctrl.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-audio.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-fingerprint_00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-mst-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-audio-pinctrl.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-audio.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-battery-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-display-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-eif-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-eif-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-fingerprint_00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-mst-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-audio-pinctrl.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-audio.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-battery-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-battery-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-eif-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-eif-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-fingerprint_00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-mst-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-nfc-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m41/sm7150-sec-m41-swa-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m41/sm7150-sec-m41-swa-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70q-eur-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70q-eur-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70s-eur-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70s-eur-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-audio-pinctrl.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-audio.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-battery-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-camera-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-camera.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r08.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r08.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r08.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-display-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-display-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-eif-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-fingerprint_00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-fingerprint_01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-input-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-pinctrl-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-pm-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-audio-pinctrl.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-audio.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-battery-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-battery-sm5713.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r09.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r10.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r11.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r12.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r13.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r14.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r13.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r14.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r13.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r14.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r09.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r10.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r11.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r12.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-display-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-display-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eif-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eif-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r09.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r10.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r11.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r12.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r13.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r14.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r13.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r14.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r13.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r14.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r09.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r10.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r11.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r12.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r13.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r14.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r13.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r14.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r13.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r14.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-fingerprint_00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-fingerprint_02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-input-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-tdmb-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-mst-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-pinctrl-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-pm-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r09.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r10.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r11.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r12.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r13.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r14.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r13.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r14.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r13.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r14.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r09.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r10.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r11.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r12.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r13.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r14.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r15.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r13.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r14.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r15.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r13.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r14.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r15.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r09.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r10.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r11.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r12.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r13.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r14.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r13.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r14.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r13.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r14.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r09.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r10.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r11.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r12.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r13.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r14.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r13.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r14.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r10.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r11.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r12.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r13.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r14.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-audio-pinctrl.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-audio.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-battery-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-display-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-eif-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-fingerprint_02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-input-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-mst-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-pinctrl-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-pm-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-dcc.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-audio-pinctrl.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-audio.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-battery-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-camera-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-camera.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-display-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-display-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-eif-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-fingerprint_00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-fingerprint_01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-input-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-pinctrl-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-pm-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r08.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r08.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r08.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-qg-batterydata-a60q.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm6150-sec-qg-batterydata-a70q.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-camera-sensor-a70sq-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-camera-sensor-r1q-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-camera-sensor-r1q-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-camera-sensor-r1q-r07.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-audio-pinctrl.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-audio.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-battery-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-battery-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-battery-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-display-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-display-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eif-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-fingerprint_00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-input-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-mst-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-pinctrl-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-pm-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r07.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-m41-swa-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-m51-swa-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-m51-swa-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-m51-swa-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-qg-batterydata-r1q.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-audio-pinctrl.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-audio.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-battery-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-battery-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-battery-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r07.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r08.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r07.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r08.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r07.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r08.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-display-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-display-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r07.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r08.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r07.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r08.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r07.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r08.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-fingerprint_00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-fingerprint_04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-input-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r00.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r01.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r02.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r03.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r04.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r05.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r06.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r07.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r08.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r09.dts delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r07.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r08.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r01.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r03.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r04.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r05.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r06.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r07.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r08.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r09.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-mst-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-nfc-r00.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-nfc-r02.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-pinctrl-common.dtsi delete mode 100755 arch/arm64/boot/dts/samsung/sm7150-sec-r1q-pm-common.dtsi create mode 100755 drivers/adsp_factory/veml3328_light.c create mode 100755 drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/Makefile create mode 100755 drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/dsi_panel_HX83102_TV104WUM_wuxga_video.dtsi create mode 100755 drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_buck_isl98609_i2c.c create mode 100755 drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_buck_isl98609_i2c.h create mode 100755 drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_dsi_panel_HX83102_TV104WUM.c create mode 100755 drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_dsi_panel_HX83102_TV104WUM.h create mode 100755 drivers/input/keyboard/hall.c create mode 100755 drivers/input/sec_input/Kconfig create mode 100755 drivers/input/sec_input/Makefile create mode 100755 drivers/input/sec_input/sec_cmd.c create mode 100755 drivers/input/sec_input/sec_cmd.h create mode 100755 drivers/input/sec_input/sec_common_fn.c create mode 100755 drivers/input/sec_input/sec_input.h create mode 100755 drivers/input/sec_input/sec_input_notifier.c create mode 100755 drivers/input/sec_input/sec_secure_touch.c create mode 100755 drivers/input/sec_input/sec_secure_touch.h create mode 100755 drivers/input/sec_input/sec_tclm_v2.c create mode 100755 drivers/input/sec_input/sec_tclm_v2.h create mode 100755 drivers/input/sec_input/sec_tsp_dumpkey.c create mode 100755 drivers/input/sec_input/sec_tsp_dumpkey.h create mode 100755 drivers/input/sec_input/sec_tsp_log.c create mode 100755 drivers/input/sec_input/sec_tsp_log.h create mode 100755 drivers/input/sec_input/sec_virtual_tsp.c create mode 100755 drivers/input/touchscreen/himax/hx831xx/Kconfig create mode 100755 drivers/input/touchscreen/himax/hx831xx/Makefile create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_common.c create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_common.h create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_debug.c create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_debug.h create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_ic_HX83102.c create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_ic_HX83102.h create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_ic_core.h create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_ic_incell_core.c create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_inspection.c create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_inspection.h create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_modular.h create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_platform.c create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_platform.h create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_platform_SPI.c create mode 100755 drivers/input/touchscreen/himax/hx831xx/himax_platform_SPI.h create mode 100755 drivers/input/w9019/Kconfig create mode 100755 drivers/input/w9019/Makefile create mode 100755 drivers/input/w9019/w9019_flash.c create mode 100755 drivers/input/w9019/w9019_flash.h create mode 100755 drivers/input/w9019/wacom_dev.h create mode 100755 drivers/input/w9019/wacom_i2c.c create mode 100755 drivers/input/w9019/wacom_i2c.h create mode 100755 drivers/input/w9019/wacom_i2c_elec.c create mode 100755 drivers/input/w9019/wacom_i2c_sec.c create mode 100755 drivers/input/w9019/wacom_reg.h create mode 100755 drivers/input/wacom/Kconfig create mode 100755 drivers/input/wacom/Makefile create mode 100755 drivers/input/wacom/wacom_dev.h create mode 100755 drivers/input/wacom/wacom_i2c.c create mode 100755 drivers/input/wacom/wacom_i2c_elec.c create mode 100755 drivers/input/wacom/wacom_i2c_sec.c create mode 100755 drivers/input/wacom/wacom_reg.h create mode 100755 drivers/input/wacom/wez01_flash.c create mode 100755 drivers/input/wacom/wez01_flash.h delete mode 100755 drivers/net/ethernet/broadcom/tg3.c delete mode 100755 drivers/net/ethernet/broadcom/tg3.h delete mode 100755 drivers/samsung/debug/kunit_test/Makefile delete mode 100755 drivers/samsung/debug/kunit_test/sec_debug_test.c delete mode 100755 drivers/samsung/kunit_test/Makefile delete mode 100755 drivers/samsung/kunit_test/sec_class_test.c create mode 100755 drivers/samsung/lmkd_debug.c create mode 100755 drivers/sensors/isg6320.c create mode 100755 drivers/sensors/isg6320_reg.h create mode 100755 firmware/epen/w9019_gts6lite.bin create mode 100755 firmware/epen/w9021_gts6lite.bin create mode 100755 firmware/tsp_himax/hx83102e_gts6litereresh.bin create mode 100755 firmware/tsp_stm/fts5cu56a_a52xq.bin create mode 100755 include/linux/dbmdx.h create mode 100755 include/linux/olog.pb.h create mode 100755 include/linux/perflog.h create mode 100755 include/sound/dbmdx-export.h create mode 100755 net/unix/scm.c create mode 100755 net/unix/scm.h create mode 100755 scripts/basic/.fixdep.cmd create mode 100755 scripts/basic/fixdep create mode 100755 scripts/kconfig/.conf.cmd create mode 100755 scripts/kconfig/.conf.o.cmd create mode 100755 scripts/kconfig/.zconf.tab.o.cmd create mode 100755 scripts/kconfig/conf create mode 100755 scripts/kconfig/conf.o create mode 100755 scripts/kconfig/zconf.lex.c create mode 100755 scripts/kconfig/zconf.tab.c create mode 100755 scripts/kconfig/zconf.tab.o delete mode 100755 security/samsung/defex_lsm/catch_engine/kunit_test/Makefile delete mode 100755 security/samsung/defex_lsm/catch_engine/kunit_test/defex_caches_test.c delete mode 100755 security/samsung/defex_lsm/catch_engine/kunit_test/defex_catch_list_compat_test.c delete mode 100755 security/samsung/defex_lsm/catch_engine/kunit_test/defex_catch_list_test.c delete mode 100755 security/samsung/defex_lsm/catch_engine/kunit_test/defex_ht_test.c delete mode 100755 security/samsung/defex_lsm/cert/kunit_test/Makefile delete mode 100755 security/samsung/defex_lsm/cert/kunit_test/defex_sign_test.c create mode 100755 security/samsung/defex_lsm/core/defex_tailer.c delete mode 100755 security/samsung/defex_lsm/core/kunit_test/Makefile delete mode 100755 security/samsung/defex_lsm/core/kunit_test/defex_common_test.c delete mode 100755 security/samsung/defex_lsm/core/kunit_test/defex_get_mode_test.c delete mode 100755 security/samsung/defex_lsm/core/kunit_test/defex_lsm_test.c delete mode 100755 security/samsung/defex_lsm/core/kunit_test/defex_main_test.c delete mode 100755 security/samsung/defex_lsm/core/kunit_test/defex_rules_proc_test.c delete mode 100755 security/samsung/defex_lsm/core/kunit_test/defex_sysfs_test.c delete mode 100755 security/samsung/defex_lsm/debug/kunit_test/Makefile delete mode 100755 security/samsung/defex_lsm/debug/kunit_test/defex_debug_test.c create mode 100755 security/samsung/defex_lsm/defex_packed_rules.bin create mode 100755 security/samsung/defex_lsm/defex_packed_rules.inc delete mode 100755 security/samsung/defex_lsm/feature_immutable/kunit_test/Makefile delete mode 100755 security/samsung/defex_lsm/feature_immutable/kunit_test/defex_immutable_test.c delete mode 100755 security/samsung/defex_lsm/feature_privilege_escalation_detection/kunit_test/Makefile delete mode 100755 security/samsung/defex_lsm/feature_privilege_escalation_detection/kunit_test/defex_priv_test.c create mode 100755 security/samsung/defex_lsm/feature_safeplace/defex_integrity.c delete mode 100755 security/samsung/defex_lsm/feature_safeplace/kunit_test/Makefile delete mode 100755 security/samsung/defex_lsm/feature_safeplace/kunit_test/defex_safeplace_test.c create mode 100755 security/samsung/defex_lsm/feature_trusted_map/defex_trusted_map.c create mode 100755 security/samsung/defex_lsm/feature_trusted_map/dtm.c create mode 100755 security/samsung/defex_lsm/feature_trusted_map/dtm_engine.c create mode 100755 security/samsung/defex_lsm/feature_trusted_map/dtm_engine_defaultpolicy.h create mode 100755 security/samsung/defex_lsm/feature_trusted_map/dtm_log.c create mode 100755 security/samsung/defex_lsm/feature_trusted_map/dtm_utils.c create mode 100755 security/samsung/defex_lsm/feature_trusted_map/include/dtm.h create mode 100755 security/samsung/defex_lsm/feature_trusted_map/include/dtm_engine.h create mode 100755 security/samsung/defex_lsm/feature_trusted_map/include/dtm_log.h create mode 100755 security/samsung/defex_lsm/feature_trusted_map/include/dtm_utils.h delete mode 100755 security/samsung/defex_lsm/feature_trusted_map/kunit_test/Makefile create mode 100755 security/samsung/defex_lsm/feature_trusted_map/ptree.c create mode 100755 security/samsung/defex_lsm/include/defex_tailer.h create mode 100755 security/samsung/defex_lsm/include/ptree.h create mode 100755 security/samsung/defex_lsm/pack_rules delete mode 100755 security/samsung/dsms/kunit_test/Makefile delete mode 100755 security/samsung/dsms/kunit_test/dsms_test_utils.c delete mode 100755 security/samsung/dsms/kunit_test/dsms_test_utils.h delete mode 100755 security/samsung/dsms/kunit_test/security_dsms_access_control_test.c delete mode 100755 security/samsung/dsms/kunit_test/security_dsms_debug_test.c delete mode 100755 security/samsung/dsms/kunit_test/security_dsms_init_test.c delete mode 100755 security/samsung/dsms/kunit_test/security_dsms_kernel_api_test.c delete mode 100755 security/samsung/dsms/kunit_test/security_dsms_netlink_test.c delete mode 100755 security/samsung/dsms/kunit_test/security_dsms_policy_test.c delete mode 100755 security/samsung/dsms/kunit_test/security_dsms_preboot_buffer_test.c delete mode 100755 security/samsung/dsms/kunit_test/security_dsms_rate_limit_test.c delete mode 100755 security/samsung/dsms/kunit_test/security_dsms_test_utils_test.c delete mode 100755 security/samsung/five/kunit_test/Makefile delete mode 100755 security/samsung/five/kunit_test/five_audit_test.c delete mode 100755 security/samsung/five/kunit_test/five_cache_test.c delete mode 100755 security/samsung/five/kunit_test/five_cert_test.c delete mode 100755 security/samsung/five/kunit_test/five_crypto_test.c delete mode 100755 security/samsung/five/kunit_test/five_dmverity_test.c delete mode 100755 security/samsung/five/kunit_test/five_dsms_test.c delete mode 100755 security/samsung/five/kunit_test/five_file.c delete mode 100755 security/samsung/five/kunit_test/five_file.h delete mode 100755 security/samsung/five/kunit_test/five_keyring_test.c delete mode 100755 security/samsung/five/kunit_test/five_lv_test.c delete mode 100755 security/samsung/five/kunit_test/five_pa_test.c delete mode 100755 security/samsung/five/kunit_test/five_state_test.c delete mode 100755 security/samsung/five/kunit_test/task_integrity_test.c delete mode 100755 security/samsung/five/kunit_test/test_helpers.h create mode 100755 security/samsung/mz/Kconfig create mode 100755 security/samsung/mz/Makefile create mode 100755 security/samsung/mz/include/linux/mz.h create mode 100755 security/samsung/mz/mz.c create mode 100755 security/samsung/mz/mz.h create mode 100755 security/samsung/mz/mz_crypto.c create mode 100755 security/samsung/mz/mz_internal.h create mode 100755 security/samsung/mz/mz_ioctl.c create mode 100755 security/samsung/mz/mz_log.c create mode 100755 security/samsung/mz/mz_log.h create mode 100755 security/samsung/mz/mz_mem.c create mode 100755 security/samsung/mz/mz_page.c create mode 100755 security/samsung/mz/mz_page.h create mode 100755 security/samsung/mz/mz_page_v5_10.c create mode 100755 security/samsung/mz/test/Makefile create mode 100755 security/samsung/mz/test/security_mz_test.c create mode 100755 security/samsung/mz_tee_driver/Kconfig create mode 100755 security/samsung/mz_tee_driver/Makefile create mode 100755 security/samsung/mz_tee_driver/mz_tee_driver.c create mode 100755 security/samsung/mz_tee_driver/mz_tee_driver_qc.c create mode 100755 security/samsung/mz_tee_driver/mz_tee_driver_teegris.c create mode 100755 security/samsung/mz_tee_driver/security_mz_tee_driver.py create mode 100755 security/samsung/proca/security_proca.py create mode 100755 sound/soc/codecs/dbmdx/Kconfig create mode 100755 sound/soc/codecs/dbmdx/Makefile create mode 100755 sound/soc/codecs/dbmdx/dbmdx-cdev.c create mode 100755 sound/soc/codecs/dbmdx/dbmdx-customer-def.h create mode 100755 sound/soc/codecs/dbmdx/dbmdx-customer.c create mode 100755 sound/soc/codecs/dbmdx/dbmdx-customer.h create mode 100755 sound/soc/codecs/dbmdx/dbmdx-i2c-d2.c create mode 100755 sound/soc/codecs/dbmdx/dbmdx-i2c-d4.c create mode 100755 sound/soc/codecs/dbmdx/dbmdx-i2c-sbl-d2.h create mode 100755 sound/soc/codecs/dbmdx/dbmdx-i2c.c create mode 100755 sound/soc/codecs/dbmdx/dbmdx-i2c.h create mode 100755 sound/soc/codecs/dbmdx/dbmdx-i2s.c create mode 100755 sound/soc/codecs/dbmdx/dbmdx-i2s.h create mode 100755 sound/soc/codecs/dbmdx/dbmdx-interface.h create mode 100755 sound/soc/codecs/dbmdx/dbmdx-snd-pcm.c create mode 100755 sound/soc/codecs/dbmdx/dbmdx-snd.c create mode 100755 sound/soc/codecs/dbmdx/dbmdx-spi-d2.c create mode 100755 sound/soc/codecs/dbmdx/dbmdx-spi-d4.c create mode 100755 sound/soc/codecs/dbmdx/dbmdx-spi.c create mode 100755 sound/soc/codecs/dbmdx/dbmdx-spi.h create mode 100755 sound/soc/codecs/dbmdx/dbmdx-uart-d2.c create mode 100755 sound/soc/codecs/dbmdx/dbmdx-uart-d4.c create mode 100755 sound/soc/codecs/dbmdx/dbmdx-uart-sbl-d2.h create mode 100755 sound/soc/codecs/dbmdx/dbmdx-uart.c create mode 100755 sound/soc/codecs/dbmdx/dbmdx-uart.h create mode 100755 sound/soc/codecs/dbmdx/dbmdx-va-regmap.h create mode 100755 sound/soc/codecs/dbmdx/dbmdx-vqe-regmap.h create mode 100755 sound/soc/codecs/dbmdx/dbmdx.c create mode 100755 techpack/audio/4.0/config/sm7125_gta4xlve.conf create mode 100755 techpack/audio/4.0/config/sm7125_gta4xlve.h diff --git a/arch/arm64/boot/dts/samsung/Makefile b/arch/arm64/boot/dts/samsung/Makefile index 41b0827beb85..b0c381585fe4 100755 --- a/arch/arm64/boot/dts/samsung/Makefile +++ b/arch/arm64/boot/dts/samsung/Makefile @@ -318,6 +318,25 @@ SEC_M42Q_USA_DTBO := \ atoll-sec-m42q-usa-overlay-r02.dtbo \ atoll-sec-m42q-usa-overlay-r04.dtbo \ atoll-sec-m42q-usa-overlay-r06.dtbo +# GTA4XLVE EUR +SEC_GTA4XLVE_EUR_DTBO := \ + atoll-sec-gta4xlve-eur-overlay-r00.dtbo + +# GTA4XLVEWIFI EUR +SEC_GTA4XLVEWIFI_EUR_DTBO := \ + atoll-sec-gta4xlvewifi-eur-overlay-r00.dtbo +# GTA4XLVE KOR +SEC_GTA4XLVE_KOR_DTBO := \ + atoll-sec-gta4xlve-kor-overlay-r00.dtbo + +# GTA4XLVE CHN +SEC_GTA4XLVE_CHN_DTBO := \ + atoll-sec-gta4xlve-chn-overlay-r00.dtbo + + +# GTA4XLVEWIFI CHN +SEC_GTA4XLVEWIFI_CHN_DTBO := \ + atoll-sec-gta4xlvewifi-chn-overlay-r00.dtbo define __sec_dtbo_build dtbo-$(2) += $(1) @@ -444,6 +463,21 @@ $(eval $(call sec_dtbo_build, \ $(eval $(call sec_dtbo_build, \ $(SEC_M42Q_USA_DTBO),$(CONFIG_SEC_M42Q_USA_OPEN),$(SEC_ATOLL_BASE_DTB))) + +$(eval $(call sec_dtbo_build, \ + $(SEC_GTA4XLVE_EUR_DTBO),$(CONFIG_SEC_GTA4XLVE_EUR_OPEN),$(SEC_ATOLL_BASE_DTB))) + +$(eval $(call sec_dtbo_build, \ + $(SEC_GTA4XLVEWIFI_EUR_DTBO),$(CONFIG_SEC_GTA4XLVEWIFI_EUR_OPEN),$(SEC_ATOLL_BASE_DTB))) + +$(eval $(call sec_dtbo_build, \ + $(SEC_GTA4XLVE_KOR_DTBO),$(CONFIG_SEC_GTA4XLVE_KOR_OPEN),$(SEC_ATOLL_BASE_DTB))) + +$(eval $(call sec_dtbo_build, \ + $(SEC_GTA4XLVE_CHN_DTBO),$(CONFIG_SEC_GTA4XLVE_CHN_OPEN),$(SEC_ATOLL_BASE_DTB))) + +$(eval $(call sec_dtbo_build, \ + $(SEC_GTA4XLVEWIFI_CHN_DTBO),$(CONFIG_SEC_GTA4XLVEWIFI_CHN_OPEN),$(SEC_ATOLL_BASE_DTB))) endif ifeq ($(CONFIG_ARM64),y) diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-battery-can-r00.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-battery-can-r00.dtsi deleted file mode 100755 index 60024e542475..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-battery-can-r00.dtsi +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../common/sm7150-sec-a71-battery-common.dtsi" - -&soc { - battery { - /* direct step charging option */ - battery,dc_step_chg_step = <4>; - battery,dc_step_chg_cond_vol = <4090 4190 4320 4350>; /* STEP_CHARGING_CONDITION_VOLTAGE */ - battery,dc_step_chg_cond_iin = <1950 1575 1050 0>; /* STEP_CHARGING_CONDITION_INPUT_CURRENT */ - battery,dc_step_chg_iin_check_cnt = <3>; - battery,dc_step_chg_cond_soc = <9 48 80 100>; /* STEP_CHARGING_CONDITION_SOC */ - battery,dc_step_chg_val_vfloat = <4090 4190 4320 4350>; /* STEP_CHARGING_CONDITION_FLOAT_VOLTAGE */ - battery,dc_step_chg_val_iout = <4600 3900 3100 2100>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r00.dtsi deleted file mode 100755 index e8779616cd29..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r00.dtsi +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - - - -&soc { - -}; - -&tlmm { - usbpd_irq: usbpd_irq { - mux { - pins = "gpio32"; - function = "gpio"; - }; - config { - pins = "gpio32"; - drive-strength = <2>; - bias-disable; - input-enable; - }; - }; - - if_pmic_irq: if_pmic_irq { - mux { - pins = "gpio68"; - function = "gpio"; - }; - config { - pins = "gpio68"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; - - -}; diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r01.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r01.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r02.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r02.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r03.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r03.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r04.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r04.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r04.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r05.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r05.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r06.dtsi deleted file mode 100755 index f83779b76d59..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-pinctrl-r06.dtsi +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - -&tlmm { - /* s2mu106_fg i2c */ - s2mu106_fg_i2c: s2mu106_fg_i2c { - s2mu106_fg_active: s2mu106_fg_active { - mux { - pins = "gpio102", "gpio101"; - function = "gpio"; - }; - - config { - pins = "gpio102", "gpio101"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - - dc_irq_default: dc_irq_default { - config { - pins = "gpio57"; - drive-strength = <2>; - bias-disable; - input-enable; - }; - }; -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r00.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r00.dtsi deleted file mode 100755 index 90c7c6adfd18..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r00.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a71-can-pinctrl-r00.dtsi" - -#include "../common/sm7150-sec-a71-common.dtsi" -// #include "sm6150-sec-a70q-input-common.dtsi" -#include "../common/sm7150-sec-a71-pm-common.dtsi" -#include "sm7150-sec-a71-battery-can-r00.dtsi" -#include "../drivers/sm7150-sec-a71-eif-common.dtsi" -#include "../drivers/sm7150-sec-a71-fingerprint_00.dtsi" -#include "../drivers/sm7150-sec-a71-nfc-r00.dtsi" -#include "../drivers/sm7150-camera-sensor-a71-r01.dtsi" -//#include "../drivers/sm7150-sec-a71-display-r00.dtsi" - -&wcd937x_codec { - imp-table = <&imp_list 0 5 6>, - <&imp_list 6 21 6>, - <&imp_list 22 36 6>, - <&imp_list 37 100 6>, - <&imp_list 101 160 7>, - <&imp_list 161 400 8>, - <&imp_list 401 2000 8>, - <&imp_list 2001 0x7fffffff 6>; -}; - -&soc { - sec_thermistor@0 { - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - }; -}; - -&pm6150l_vadc { - sdm_therm { - reg = ; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r01.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r01.dtsi deleted file mode 100755 index 2ace88159747..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-can-r00.dtsi" #include "sm7150-sec-a71-can-pinctrl-r01.dtsi" //#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r02.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r02.dtsi deleted file mode 100755 index bab40ea98e1e..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-can-r01.dtsi" #include "sm7150-sec-a71-can-pinctrl-r02.dtsi" //#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r03.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r03.dtsi deleted file mode 100755 index ff80ca7f2289..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-can-r02.dtsi" #include "sm7150-sec-a71-can-pinctrl-r03.dtsi" //#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r04.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r04.dtsi deleted file mode 100755 index c3eafc4a7ce7..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r04.dtsi +++ /dev/null @@ -1,16 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-can-r03.dtsi" #include "sm7150-sec-a71-can-pinctrl-r04.dtsi" //#include "../drivers/sm7150-sec-a71-display-r01.dtsi" -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r05.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r05.dtsi deleted file mode 100755 index 1ef237c70dc4..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r05.dtsi +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -#include "sm7150-sec-a71-can-r04.dtsi" -#include "sm7150-sec-a71-can-pinctrl-r05.dtsi" - -//#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -&soc { - - - -}; - - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r06.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r06.dtsi deleted file mode 100755 index 1f49ea9bb9a0..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-can-r06.dtsi +++ /dev/null @@ -1,94 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - -#include "sm7150-sec-a71-can-r05.dtsi" -#include "sm7150-sec-a71-can-pinctrl-r06.dtsi" -//#include "../drivers/sm7150-camera-sensor-a71-r01.dtsi" - -//#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -/delete-node/ &i2c_17; - -&soc { - i2c_14: 12c@14 { - status = "ok"; - - cell-index = <14>; - compatible = "i2c-gpio"; - gpios = <&tlmm 101 0 /*sda*/ - &tlmm 102 0 /*scl*/ - >; - - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default"; - pinctrl-0 = <&s2mu106_fg_active>; - }; - - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = <&tlmm 25 0 /* sda */ - &tlmm 26 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&grip_i2c_active>; - pinctrl-1 = <&grip_i2c_suspend>; - - a96t3x6@21 { - compatible = "a96t3x6"; - reg = <0x21>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_int_active>; - pinctrl-1 = <&grip_int_suspend>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - a96t3x6,irq_gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_LOW>; - a96t3x6,dvdd_vreg_name = "pm6150l_l11"; - a96t3x6,fw_path = "abov/a96t356_a71_can.bin"; - a96t3x6,firmup_cmd = <0x3b>; - }; - - a96t3x6_sub@20 { - compatible = "a96t3x6_sub"; - reg = <0x20>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_sub_int_active>; - pinctrl-1 = <&grip_sub_int_suspend>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - a96t3x6,irq_gpio = <&pm6150l_gpios 6 GPIO_ACTIVE_LOW>; - a96t3x6,dvdd_vreg_name = "pm6150_l16"; - a96t3x6,fw_path = "abov/a96t356_a71_sub_can.bin"; - a96t3x6,firmup_cmd = <0x3b>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r00.dtsi deleted file mode 100755 index e8779616cd29..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r00.dtsi +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - - - -&soc { - -}; - -&tlmm { - usbpd_irq: usbpd_irq { - mux { - pins = "gpio32"; - function = "gpio"; - }; - config { - pins = "gpio32"; - drive-strength = <2>; - bias-disable; - input-enable; - }; - }; - - if_pmic_irq: if_pmic_irq { - mux { - pins = "gpio68"; - function = "gpio"; - }; - config { - pins = "gpio68"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; - - -}; diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r01.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r01.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r02.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r02.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r03.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r03.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r04.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r04.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r04.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r05.dtsi deleted file mode 100755 index 7ca1c7d1b76d..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r05.dtsi +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r06.dtsi deleted file mode 100755 index eaeb285d3a11..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-pinctrl-r06.dtsi +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - -&tlmm { - /* s2mu106_fg i2c */ - s2mu106_fg_i2c: s2mu106_fg_i2c { - s2mu106_fg_active: s2mu106_fg_active { - mux { - pins = "gpio102", "gpio101"; - function = "gpio"; - }; - - config { - pins = "gpio102", "gpio101"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - - dc_irq_default: dc_irq_default { - config { - pins = "gpio57"; - drive-strength = <2>; - bias-disable; - input-enable; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r00.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r00.dtsi deleted file mode 100755 index 02d63ba22878..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r00.dtsi +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a71-eur-ldu-pinctrl-r00.dtsi" - -#include "../common/sm7150-sec-a71-common.dtsi" -// #include "sm6150-sec-a70q-input-common.dtsi" -#include "../common/sm7150-sec-a71-pm-common.dtsi" -#include "../common/sm7150-sec-a71-battery-common.dtsi" -#include "../drivers/sm7150-sec-a71-eif-common.dtsi" -#include "../drivers/sm7150-sec-a71-fingerprint_00.dtsi" -#include "../drivers/sm7150-sec-a71-nfc-r00.dtsi" -#include "../drivers/sm7150-camera-sensor-a71-r01.dtsi" -//#include "../drivers/sm7150-sec-a71-display-r00.dtsi" - - -&soc { - sec_thermistor@0 { - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - }; -}; - -&pm6150l_vadc { - sdm_therm { - reg = ; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r01.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r01.dtsi deleted file mode 100755 index 5ba4d85e0a45..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-eur-ldu-r00.dtsi" #include "sm7150-sec-a71-eur-ldu-pinctrl-r01.dtsi" //#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r02.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r02.dtsi deleted file mode 100755 index 2c4495c20653..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-eur-ldu-r01.dtsi" #include "sm7150-sec-a71-eur-ldu-pinctrl-r02.dtsi" //#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r03.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r03.dtsi deleted file mode 100755 index c462905a8d6d..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-eur-ldu-r02.dtsi" #include "sm7150-sec-a71-eur-ldu-pinctrl-r03.dtsi" //#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r04.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r04.dtsi deleted file mode 100755 index c60e8a2ce8e3..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r04.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-eur-ldu-r03.dtsi" #include "sm7150-sec-a71-eur-ldu-pinctrl-r04.dtsi" //#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r05.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r05.dtsi deleted file mode 100755 index dbe94ed42a21..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r05.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-eur-ldu-r04.dtsi" -#include "sm7150-sec-a71-eur-ldu-pinctrl-r05.dtsi" - -&soc { - - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r06.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r06.dtsi deleted file mode 100755 index b3999cf90603..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-ldu-r06.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - -#include "sm7150-sec-a71-eur-ldu-r05.dtsi" -#include "sm7150-sec-a71-eur-ldu-pinctrl-r06.dtsi" -//#include "../drivers/sm7150-camera-sensor-a71-r01.dtsi" - -//#include "../drivers/sm7150-sec-a71-display-r00.dtsi" - - -&soc { - i2c_14: 12c@14 { - status = "ok"; - - cell-index = <14>; - compatible = "i2c-gpio"; - gpios = <&tlmm 101 0 /*sda*/ - &tlmm 102 0 /*scl*/ - >; - - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default"; - pinctrl-0 = <&s2mu106_fg_active>; - }; -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r00.dtsi deleted file mode 100755 index ba4073f08d33..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r00.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -&soc { - -}; - -&tlmm { - usbpd_irq: usbpd_irq { - mux { - pins = "gpio32"; - function = "gpio"; - }; - config { - pins = "gpio32"; - drive-strength = <2>; - bias-disable; - input-enable; - }; - }; - - if_pmic_irq: if_pmic_irq { - mux { - pins = "gpio68"; - function = "gpio"; - }; - config { - pins = "gpio68"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; - - -}; diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r01.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r01.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r02.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r02.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r03.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r03.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r04.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r04.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r04.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r05.dtsi deleted file mode 100755 index 7ca1c7d1b76d..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r05.dtsi +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r06.dtsi deleted file mode 100755 index f83779b76d59..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r06.dtsi +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - -&tlmm { - /* s2mu106_fg i2c */ - s2mu106_fg_i2c: s2mu106_fg_i2c { - s2mu106_fg_active: s2mu106_fg_active { - mux { - pins = "gpio102", "gpio101"; - function = "gpio"; - }; - - config { - pins = "gpio102", "gpio101"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - - dc_irq_default: dc_irq_default { - config { - pins = "gpio57"; - drive-strength = <2>; - bias-disable; - input-enable; - }; - }; -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r07.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r07.dtsi deleted file mode 100755 index ec0a1d76257f..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-pinctrl-r07.dtsi +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r00.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r00.dtsi deleted file mode 100755 index 8484e0c05350..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r00.dtsi +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a71-eur-pinctrl-r00.dtsi" - -#include "../common/sm7150-sec-a71-common.dtsi" -// #include "sm6150-sec-a70q-input-common.dtsi" -#include "../common/sm7150-sec-a71-pm-common.dtsi" -#include "../common/sm7150-sec-a71-battery-common.dtsi" -#include "../drivers/sm7150-sec-a71-eif-common.dtsi" -#include "../drivers/sm7150-sec-a71-fingerprint_00.dtsi" -#include "../drivers/sm7150-sec-a71-nfc-r00.dtsi" -#include "../drivers/sm7150-camera-sensor-a71-r00.dtsi" -//#include "../drivers/sm7150-sec-a71-display-r00.dtsi" - - -&soc { - sec_thermistor@0 { - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - }; -}; - -&pm6150l_vadc { - sdm_therm { - reg = ; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r01.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r01.dtsi deleted file mode 100755 index 26a93568ee72..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-eur-r00.dtsi" #include "sm7150-sec-a71-eur-pinctrl-r01.dtsi" //#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r02.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r02.dtsi deleted file mode 100755 index 3ef4de81f587..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-eur-r01.dtsi" #include "sm7150-sec-a71-eur-pinctrl-r02.dtsi" //#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r03.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r03.dtsi deleted file mode 100755 index df9adb746c0c..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-eur-r02.dtsi" #include "sm7150-sec-a71-eur-pinctrl-r03.dtsi" //#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r04.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r04.dtsi deleted file mode 100755 index f97bb15b892a..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r04.dtsi +++ /dev/null @@ -1,16 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-eur-r03.dtsi" #include "sm7150-sec-a71-eur-pinctrl-r04.dtsi" -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r05.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r05.dtsi deleted file mode 100755 index 34ddc0ed740e..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r05.dtsi +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-eur-r04.dtsi" -#include "sm7150-sec-a71-eur-pinctrl-r05.dtsi" - -&soc { - - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r06.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r06.dtsi deleted file mode 100755 index bebb9d213cb8..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r06.dtsi +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -#include "sm7150-sec-a71-eur-pinctrl-r00.dtsi" -#include "sm7150-sec-a71-eur-pinctrl-r01.dtsi" -#include "sm7150-sec-a71-eur-pinctrl-r02.dtsi" -#include "sm7150-sec-a71-eur-pinctrl-r03.dtsi" -#include "sm7150-sec-a71-eur-pinctrl-r04.dtsi" -#include "sm7150-sec-a71-eur-pinctrl-r05.dtsi" -#include "sm7150-sec-a71-eur-pinctrl-r06.dtsi" - -#include "../common/sm7150-sec-a71-common.dtsi" -// #include "sm6150-sec-a70q-input-common.dtsi" -#include "../common/sm7150-sec-a71-pm-common.dtsi" -#include "../common/sm7150-sec-a71-battery-common.dtsi" -#include "../drivers/sm7150-sec-a71-eif-common.dtsi" -#include "../drivers/sm7150-sec-a71-fingerprint_00.dtsi" -#include "../drivers/sm7150-sec-a71-nfc-r00.dtsi" -#include "../drivers/sm7150-camera-sensor-a71-r01.dtsi" -//#include "../drivers/sm7150-sec-a71-display-r00.dtsi" - - -&soc { - sec_thermistor@0 { - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - }; - - i2c_14: 12c@14 { - status = "ok"; - - cell-index = <14>; - compatible = "i2c-gpio"; - gpios = <&tlmm 101 0 /*sda*/ - &tlmm 102 0 /*scl*/ - >; - - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default"; - pinctrl-0 = <&s2mu106_fg_active>; - }; -}; - -&pm6150l_vadc { - sdm_therm { - reg = ; - }; -}; - -&flash_led { - reg = <0x74>; - compatible = "qcom,s2mu106-fled"; - enable = <1 1>; - flash-gpio = <&tlmm 22 0>; - torch-gpio = <&tlmm 24 0>; - pinctrl-names = "fled_default", "fled_suspend"; - pinctrl-0 = <&cam_flash_active &cam_torch_active>; - pinctrl-1 = <&cam_flash_suspend &cam_torch_suspend>; - flash_current = <1400>; - preflash_current = <200>; - torch_current = <300>; - movie_current = <200>; - factory_current = <300>; - flashlight_current = <25 75 100 150 200>; - status = "okay"; -}; diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r07.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r07.dtsi deleted file mode 100755 index 30b8377dccc1..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-eur-r07.dtsi +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -#include "sm7150-sec-a71-eur-r06.dtsi" -#include "sm7150-sec-a71-eur-pinctrl-r07.dtsi" - -&soc { - - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r00.dtsi deleted file mode 100755 index e8779616cd29..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r00.dtsi +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - - - -&soc { - -}; - -&tlmm { - usbpd_irq: usbpd_irq { - mux { - pins = "gpio32"; - function = "gpio"; - }; - config { - pins = "gpio32"; - drive-strength = <2>; - bias-disable; - input-enable; - }; - }; - - if_pmic_irq: if_pmic_irq { - mux { - pins = "gpio68"; - function = "gpio"; - }; - config { - pins = "gpio68"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; - - -}; diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r01.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r01.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r02.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r02.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r03.dtsi deleted file mode 100755 index ec2476a82bff..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-pinctrl-r03.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r00.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r00.dtsi deleted file mode 100755 index 35cfcc36c068..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r00.dtsi +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a71-swa-pinctrl-r00.dtsi" - -#include "../common/sm7150-sec-a71-common.dtsi" -// #include "sm6150-sec-a70q-input-common.dtsi" -#include "../common/sm7150-sec-a71-pm-common.dtsi" -#include "../drivers/sm7150-sec-a71-eif-r00.dtsi" -#include "../common/sm7150-sec-a71-battery-common.dtsi" -#include "../drivers/sm7150-sec-a71-fingerprint_00.dtsi" -#include "../drivers/sm7150-sec-a71-nfc-r00.dtsi" -#include "../drivers/sm7150-camera-sensor-a71-r00.dtsi" -//#include "../drivers/sm7150-sec-a71-display-r00.dtsi" - - -&soc { - sec_thermistor@0 { - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - }; -}; - -&pm6150l_vadc { - sdm_therm { - reg = ; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r01.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r01.dtsi deleted file mode 100755 index 7cffb715c519..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-swa-r00.dtsi" #include "sm7150-sec-a71-swa-pinctrl-r01.dtsi" //#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r02.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r02.dtsi deleted file mode 100755 index eda0743bd4a2..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-swa-r01.dtsi" #include "sm7150-sec-a71-swa-pinctrl-r02.dtsi" //#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r03.dtsi b/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r03.dtsi deleted file mode 100755 index 72b7c27ec3a2..000000000000 --- a/arch/arm64/boot/dts/samsung/a71/sm7150-sec-a71-swa-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ -#include "sm7150-sec-a71-swa-r02.dtsi" #include "sm7150-sec-a71-swa-pinctrl-r03.dtsi" //#include "../drivers/sm7150-sec-a71-display-r01.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r00.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r00.dts index 9ca8cf74342c..5693a56db141 100755 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r00.dts +++ b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r00.dts @@ -1,25 +1,7127 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - /dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a52q-r00.dtsi" -#include "drivers/atoll-sec-a52q-battery-common.dtsi" / { model = "Samsung A52Q PROJECT (board-id,00)"; compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 0>; - dtbo-version = <0>; + qcom,board-id = <0x22 0x0>; + dtbo-version = <0x0>; + + fragment@0 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ video mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x37 0x30>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x38ae2bc0 0x37bc55b0 0x37f8cb38 0x383540b8 0x3871b640>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x3>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@1 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ cmd mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x3da58d80 0x3c9e86e0 0x3ce04888 0x3d220a30 0x3d63cbd8>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x4>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@2 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,mdss-dsi-panel-name = "Simulator video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-mode-switch; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x0 0x0 0x0 0x1 0x0>; + qcom,panel-ack-disabled; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x5>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-video-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,cmd-to-video-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,cmd-to-video-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1 0x2 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-cmd-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,video-to-cmd-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,video-to-cmd-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@3 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-t-clk-post = <0xc>; + qcom,mdss-dsi-t-clk-pre = <0x29>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-ack-disabled; + qcom,ulps-enabled; + phandle = <0x6>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x64>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x64>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x2d0 0x28 0x2d0 0x28 0x2d0 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x1cc>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x2e4>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x21c 0x28 0x21c 0x28 0x21c 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@2 { + qcom,mdss-dsi-panel-width = <0x2d0>; + qcom,mdss-dsi-panel-height = <0x500>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x348>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x564>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x168>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x168 0x28 0x168 0x28 0x168 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + }; + }; + }; + }; + + fragment@4 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_dsc_375_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode DSC 3.75:1 dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,panel-ack-disabled; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,ulps-enabled; + phandle = <0x7>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-pulse-width = <0x10>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x8>; + qcom,mdss-dsi-v-front-porch = <0xa>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-on-command = <0x15010000 0x2ff 0x20150100 0x2 0xfb011501 0x0 0x2000115 0x1000000 0x20155 0x15010000 0x202 0x45150100 0x2 0x5401501 0x0 0x2061915 0x1000000 0x2071e 0x15010000 0x20b 0x73150100 0x2 0xc731501 0x0 0x20eb015 0x1000000 0x20fae 0x15010000 0x211 0xb8150100 0x2 0x13001501 0x0 0x2588015 0x1000000 0x25901 0x15010000 0x25a 0x150100 0x2 0x5b011501 0x0 0x25c8015 0x1000000 0x25d81 0x15010000 0x25e 0x150100 0x2 0x5f011501 0x0 0x2723115 0x1000000 0x26803 0x15010000 0x2ff 0x24150100 0x2 0xfb011501 0x0 0x2001c15 0x1000000 0x2010b 0x15010000 0x202 0xc150100 0x2 0x3011501 0x0 0x2040f15 0x1000000 0x20510 0x15010000 0x206 0x10150100 0x2 0x7101501 0x0 0x2088915 0x1000000 0x2098a 0x15010000 0x20a 0x13150100 0x2 0xb131501 0x0 0x20c1515 0x1000000 0x20d15 0x15010000 0x20e 0x17150100 0x2 0xf171501 0x0 0x2101c15 0x1000000 0x2110b 0x15010000 0x212 0xc150100 0x2 0x13011501 0x0 0x2140f15 0x1000000 0x21510 0x15010000 0x216 0x10150100 0x2 0x17101501 0x0 0x2188915 0x1000000 0x2198a 0x15010000 0x21a 0x13150100 0x2 0x1b131501 0x0 0x21c1515 0x1000000 0x21d15 0x15010000 0x21e 0x17150100 0x2 0x1f171501 0x0 0x2204015 0x1000000 0x22101 0x15010000 0x222 0x150100 0x2 0x23401501 0x0 0x2244015 0x1000000 0x2256d 0x15010000 0x226 0x40150100 0x2 0x27401501 0x0 0x2e00015 0x1000000 0x2dc21 0x15010000 0x2dd 0x22150100 0x2 0xde071501 0x0 0x2df0715 0x1000000 0x2e36d 0x15010000 0x2e1 0x7150100 0x2 0xe2071501 0x0 0x229d815 0x1000000 0x22a2a 0x15010000 0x24b 0x3150100 0x2 0x4c111501 0x0 0x24d1015 0x1000000 0x24e01 0x15010000 0x24f 0x1150100 0x2 0x50101501 0x0 0x2510015 0x1000000 0x25280 0x15010000 0x253 0x150100 0x2 0x56001501 0x0 0x2540715 0x1000000 0x25807 0x15010000 0x255 0x25150100 0x2 0x5b431501 0x0 0x25c0015 0x1000000 0x25f73 0x15010000 0x260 0x73150100 0x2 0x63221501 0x0 0x2640015 0x1000000 0x26708 0x15010000 0x268 0x4150100 0x2 0x72021501 0x0 0x27a8015 0x1000000 0x27b91 0x15010000 0x27c 0xd8150100 0x2 0x7d601501 0x0 0x27f1515 0x1000000 0x27515 0x15010000 0x2b3 0xc0150100 0x2 0xb4001501 0x0 0x2b50015 0x1000000 0x27800 0x15010000 0x279 0x150100 0x2 0x80001501 0x0 0x2830015 0x1000000 0x2930a 0x15010000 0x294 0xa150100 0x2 0x8a001501 0x0 0x29bff15 0x1000000 0x29db0 0x15010000 0x29f 0x63150100 0x2 0x98101501 0x0 0x2ec0015 0x1000000 0x2ff10 0x39010000 0x11c1 0x9200010 0x2000268 0x1bb000a 0x66704c5 0x39010000 0x3c2 0x10f01501 0x0 0x2c00315 0x1000000 0x43b03 0xa0a1501 0x0 0x2350015 0x1000000 0x2e501 0x15010000 0x2bb 0x10150100 0x2 0xfb010501 0x7800 0x2110005 0x1000078 0x22900>; + qcom,mdss-dsi-off-command = [05 01 00 00 78 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x0>; + qcom,mdss-dsi-h-back-porch = <0x0>; + qcom,mdss-dsi-h-pulse-width = <0x0>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x0>; + qcom,mdss-dsi-v-front-porch = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x0>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = <0x15010000 0x2bb 0x10150100 0x2 0xb0030501 0x7800 0x1111501 0x0 0x251ff15 0x1000000 0x25324 0x15010000 0x2ff 0x23150100 0x2 0x8051501 0x0 0x2469015 0x1000000 0x2ff10 0x15010000 0x2ff 0xf0150100 0x2 0x92011501 0x0 0x2ff1015 0x1000000 0x23500 0x5010000 0x28000129>; + qcom,mdss-dsi-off-command = <0x5010000 0x10000128 0x5010000 0x40000110>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x150505 0x201f0505 0x3020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1 0x2 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@5 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,mdss-dsi-panel-name = "nt36672c fhd plus video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x14 0x0 0x14 0x1 0x14>; + qcom,mdss-pan-physical-width-dimension = <0x4a>; + qcom,mdss-pan-physical-height-dimension = <0x83>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-cphy-mode; + qcom,mdss-dsi-t-clk-post = <0x0>; + qcom,mdss-dsi-t-clk-pre = <0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x5a 0x32>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-skip-timing-update; + qcom,dsi-dyn-clk-list = <0x3eb54a94 0x3e726713 0x3e2f838b 0x3deca00a 0x3da9bc89>; + qcom,dsi-dyn-clk-type = "constant-fps-adjust-hfp"; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,platform-bklight-en-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-en-gpio = <0xffffffff 0x4 0x0>; + phandle = <0x8>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-front-porch = <0xca>; + qcom,mdss-dsi-h-back-porch = <0x38>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0xa>; + qcom,mdss-dsi-v-front-porch = <0x50b>; + qcom,mdss-dsi-v-pulse-width = <0xa>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 b0 00 29 01 00 00 00 00 02 c0 00 29 01 00 00 00 00 03 c2 1b a0 29 01 00 00 00 00 02 ff 25 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 18 20 15 01 00 00 00 00 02 ff 2a 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 27 80 15 01 00 00 00 00 02 28 fd 29 01 00 00 00 00 02 ff f0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 5a 00 29 01 00 00 00 00 02 a0 08 29 01 00 00 00 00 02 ff d0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 09 ad 15 01 00 00 00 00 02 ff 10 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 51 ff 15 01 00 00 00 00 02 53 2c 15 01 00 00 00 00 02 ff 23 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 0a 00 15 01 00 00 00 00 02 0b 00 15 01 00 00 00 00 02 0c 00 15 01 00 00 00 00 02 0d 00 15 01 00 00 00 00 02 11 01 15 01 00 00 00 00 02 12 95 15 01 00 00 00 00 02 15 68 15 01 00 00 00 00 02 16 0b 15 01 00 00 00 00 02 6f 00 15 01 00 00 00 00 02 70 00 15 01 00 00 00 00 02 71 00 15 01 00 00 00 00 02 a0 11 15 01 00 00 00 00 02 ff f0 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 d2 52 29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 35 00 05 01 00 00 78 00 02 11 00 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x230909 0x26240909 0x9060204>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@6 { + target = <0xffffffff>; + + __overlay__ { + + dsi_panel_pwr_supply { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xab>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + }; + + qcom,panel-supply-entry@2 { + reg = <0x2>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-post-on-sleep = <0x14>; + }; + }; + + dsi_panel_pwr_supply_no_labibb { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x2>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + }; + + dsi_panel_pwr_supply_labibb_amoled { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x1>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vdda-3p3"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x3390>; + qcom,supply-disable-load = <0x50>; + }; + }; + + qcom,dsi-display@0 { + label = "dsi_rm69299_visionox_amoled_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0"; + qcom,dsi-panel = <0x3>; + qcom,dsi-display-active; + phandle = <0xac>; + }; + + qcom,dsi-display@1 { + label = "dsi_rm69299_visionox_amoled_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x4>; + phandle = <0xad>; + }; + + qcom,dsi-display@2 { + label = "dsi_sim_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x5>; + phandle = <0xae>; + }; + + qcom,dsi-display@3 { + label = "dsi_sim_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x6>; + phandle = <0xaf>; + }; + + qcom,dsi-display@4 { + label = "dsi_sim_dsc_375_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x7>; + phandle = <0xb0>; + }; + + qcom,dsi-display@5 { + label = "dsi_nt36672c_video_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + qcom,dsi-panel = <0x8>; + phandle = <0xb1>; + }; + + qcom,dsi-display { + compatible = "qcom,dsi-display"; + qcom,dsi-ctrl = <0xffffffff>; + qcom,dsi-phy = <0xffffffff>; + clocks = <0xffffffff 0x6 0xffffffff 0x9 0xffffffff 0x3 0xffffffff 0x8 0xffffffff 0xa 0xffffffff 0xd 0xffffffff 0x11 0xffffffff 0x15 0xffffffff 0x16 0xffffffff 0x19>; + clock-names = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + pinctrl-names = "panel_active", "panel_suspend"; + pinctrl-0 = <0x9 0xa 0xb 0xc>; + pinctrl-1 = <0xd 0xe 0xb 0xc>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,panel-te-source = <0x0>; + vddio-supply = <0xffffffff>; + vdda-3p3-supply = <0xffffffff>; + lab-supply = <0xffffffff>; + ibb-supply = <0xffffffff>; + qcom,dsi-display-list = <0xf 0x10>; + vci-supply = <0xffffffff>; + vddi-supply = <0xffffffff>; + phandle = <0x13>; + }; + + qcom,wb-display@0 { + compatible = "qcom,wb-display"; + cell-index = <0x0>; + label = "wb_display"; + phandle = <0x12>; + }; + + qcom,msm-ext-disp { + compatible = "qcom,msm-ext-disp"; + phandle = <0x11>; + + qcom,msm-ext-disp-audio-codec-rx { + compatible = "qcom,msm-ext-disp-audio-codec-rx"; + phandle = <0x2c>; + }; + }; + }; + }; + + fragment@7 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-usbpd-detection = <0xffffffff>; + qcom,ext-disp = <0x11>; + qcom,usbplug-cc-gpio = <0xffffffff 0x68 0x0>; + pinctrl-name = "mdss_dp_active", "mdss_dp_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + }; + }; + + fragment@8 { + target = <0xffffffff>; + + __overlay__ { + connectors = <0x12 0x13 0xffffffff 0xffffffff>; + }; + }; + + fragment@9 { + target = <0xffffffff>; + + __overlay__ { + + pm6150-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150l-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_cpu0 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl0 { + disable-thermal-zone; + + cooling-maps { + + vbat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + vbat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl1 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl2 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + soc { + disable-thermal-zone; + + cooling-maps { + + soc_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + soc_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + }; + }; + + fragment@10 { + target = <0xffffffff>; + + __overlay__ { + #cooling-cells = <0x2>; + }; + }; + + fragment@11 { + target = <0xffffffff>; + + __overlay__ { + + qcom,battery-data { + qcom,batt-id-range-pct = <0xf>; + phandle = <0x14>; + + qcom,alium_860_89032_0000_3600mAh { + qcom,max-voltage-uv = <0x426030>; + qcom,fg-cc-cv-threshold-uv = <0x423920>; + qcom,fastchg-current-ma = <0x1518>; + qcom,batt-id-kohm = <0x6b>; + qcom,battery-beta = <0x109a>; + qcom,battery-therm-kohm = <0x64>; + qcom,battery-type = "Alium_860_89032_0000_3600mAh_Jun15th2018"; + qcom,qg-batt-profile-ver = <0x64>; + qcom,jeita-fcc-ranges = <0x0 0x32 0x2625a0 0x33 0x190 0x5265c0 0x191 0x1c2 0x2625a0>; + qcom,jeita-fv-ranges = <0x0 0x32 0x40d990 0x33 0x190 0x426030 0x191 0x1c2 0x40d990>; + qcom,step-chg-ranges = <0x36ee80 0x39fbc0 0x5265c0 0x39fbc1 0x419ce0 0x36ee80 0x419ce1 0x426030 0x2625a0>; + qcom,ocv-based-step-chg; + qcom,jeita-soft-thresholds = <0x5314 0x25e3>; + qcom,jeita-hard-thresholds = <0x58cd 0x20b8>; + qcom,jeita-soft-hys-thresholds = <0x4f5e 0x2943>; + qcom,jeita-soft-fcc-ua = <0x2625a0 0x2625a0>; + qcom,jeita-soft-fv-uv = <0x40d990 0x40d990>; + + qcom,fcc1-temp-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xd62 0xdbf 0xdfd 0xe1d 0xe2e>; + }; + + qcom,fcc2-temp-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xdda 0xdf8 0xe02 0xe04 0xdff 0xdff>; + }; + + qcom,pc-temp-v1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa846 0xa903 0xa965 0xa982 0xa987 0xa757 0xa82c 0xa88b 0xa8b2 0xa8bc 0xa671 0xa747 0xa7a8 0xa7d4 0xa7e5 0xa598 0xa65f 0xa6c5 0xa6f2 0xa707 0xa4ca 0xa582 0xa5e5 0xa611 0xa627 0xa3ff 0xa4af 0xa508 0xa531 0xa546 0xa330 0xa3e1 0xa430 0xa452 0xa465 0xa25d 0xa311 0xa35c 0xa377 0xa387 0xa1a0 0xa23e 0xa287 0xa29e 0xa2ad 0xa10a 0xa17a 0xa1b1 0xa1c4 0xa1d2 0xa07e 0xa0e5 0xa0f6 0xa0f5 0xa0fc 0x9fa9 0xa061 0xa067 0xa048 0xa036 0x9e4b 0x9f9a 0x9fd6 0x9fae 0x9f81 0x9cdb 0x9e3d 0x9ee8 0x9ee6 0x9ebf 0x9bed 0x9cd1 0x9d85 0x9dc6 0x9dd7 0x9b4d 0x9bf5 0x9c67 0x9cb4 0x9cf4 0x9ad6 0x9b65 0x9bd6 0x9c18 0x9c4a 0x9a75 0x9af5 0x9b63 0x9baa 0x9bc5 0x9a1f 0x9a9b 0x9ade 0x9b13 0x9b23 0x99c4 0x9a41 0x9a3f 0x9a2d 0x9a41 0x9962 0x99c6 0x998a 0x9943 0x9959 0x98fd 0x992a 0x98b8 0x9892 0x98a0 0x9894 0x9882 0x97f4 0x9800 0x9807 0x982b 0x97c6 0x976f 0x9780 0x9781 0x97cb 0x9713 0x970f 0x970c 0x970c 0x9775 0x9697 0x96b5 0x96a2 0x96a2 0x9724 0x963e 0x965a 0x9642 0x963e 0x96db 0x95fa 0x9603 0x95e9 0x95e1 0x9698 0x95c7 0x95b7 0x9598 0x958b 0x965b 0x959d 0x9571 0x954e 0x953b 0x9627 0x9575 0x9533 0x950c 0x94f4 0x95f8 0x9550 0x94fe 0x94d1 0x94b3 0x95cc 0x952e 0x94cf 0x949b 0x947a 0x95a2 0x9511 0x94a4 0x9465 0x9440 0x9579 0x94f7 0x947f 0x9432 0x9407 0x954f 0x94d6 0x9458 0x93fe 0x93cc 0x9525 0x94b2 0x942f 0x93c6 0x938b 0x94f0 0x9484 0x9402 0x938b 0x9345 0x94a6 0x943e 0x93bf 0x9343 0x92f7 0x944c 0x93da 0x935f 0x92ed 0x92a2 0x93e6 0x936c 0x92f1 0x9288 0x923f 0x936b 0x92f1 0x9276 0x920e 0x91c6 0x92e1 0x926f 0x91f1 0x9188 0x9141 0x9248 0x91ea 0x9165 0x90ff 0x90bc 0x91cf 0x9176 0x9100 0x909b 0x905b 0x9179 0x9129 0x90c1 0x9060 0x9022 0x9159 0x910e 0x90ab 0x904f 0x9011 0x913e 0x90f9 0x909a 0x903f 0x9001 0x911a 0x90de 0x907f 0x9020 0x8fdd 0x90ac 0x9070 0x8ff7 0x8f74 0x8f1a 0x8f68 0x8f1c 0x8e9e 0x8e14 0x8db6 0x8d9d 0x8d55 0x8cd8 0x8c4c 0x8beb 0x8b59 0x8b10 0x8a94 0x8a02 0x899f 0x8849 0x87fb 0x877d 0x86e5 0x867d 0x836c 0x8325 0x82aa 0x8209 0x8197 0x7530 0x7530 0x7530 0x7530 0x7530>; + }; + + qcom,pc-temp-v2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa98d 0xa97e 0xa974 0xa960 0xa92e 0xa910 0xa7fb 0xa83a 0xa854 0xa856 0xa82f 0xa819 0xa6a3 0xa712 0xa747 0xa757 0xa738 0xa728 0xa594 0xa609 0xa64d 0xa665 0xa64a 0xa63c 0xa4c7 0xa51d 0xa566 0xa581 0xa565 0xa558 0xa3f4 0xa43e 0xa489 0xa4a2 0xa484 0xa478 0xa2af 0xa364 0xa3b3 0xa3c8 0xa3a5 0xa397 0xa162 0xa292 0xa2e4 0xa2f3 0xa2ca 0xa2b9 0xa11a 0xa1c1 0xa210 0xa21b 0xa1ef 0xa1de 0xa14f 0xa0ea 0xa131 0xa139 0xa110 0xa103 0xa17a 0xa03c 0xa071 0xa077 0xa047 0xa035 0xa046 0x9fd6 0x9ff5 0x9ff5 0x9fb3 0x9f87 0x9d6d 0x9f7f 0x9f85 0x9f81 0x9f2b 0x9ee2 0x9b88 0x9eab 0x9ea9 0x9ead 0x9e5e 0x9e1a 0x9a81 0x9c78 0x9cde 0x9d1e 0x9d16 0x9d22 0x99b8 0x9a96 0x9b46 0x9bd5 0x9bfe 0x9c3f 0x9913 0x99e8 0x9a78 0x9b4d 0x9b70 0x9b9c 0x9887 0x9977 0x99df 0x9aeb 0x9b04 0x9b0e 0x97f7 0x98f2 0x9948 0x9a53 0x9a64 0x9a58 0x975c 0x9856 0x98b5 0x9965 0x9971 0x9967 0x96c8 0x97b8 0x9827 0x987f 0x9885 0x9883 0x9649 0x9720 0x9799 0x97d3 0x97d8 0x97d6 0x95d8 0x968d 0x9711 0x9743 0x9748 0x9745 0x957d 0x9608 0x9697 0x96c6 0x96cb 0x96c8 0x9533 0x9591 0x9629 0x9658 0x965c 0x9658 0x94f4 0x952a 0x95c3 0x95f3 0x95f6 0x95f1 0x94bc 0x94d6 0x9565 0x9595 0x9598 0x9592 0x948a 0x9491 0x950e 0x953e 0x9540 0x9538 0x9458 0x9459 0x94bd 0x94f0 0x94ef 0x94e6 0x9429 0x942b 0x9471 0x94aa 0x94a5 0x949b 0x93fa 0x9403 0x942c 0x9467 0x9461 0x9456 0x93cb 0x93dc 0x93ed 0x9426 0x9422 0x9418 0x939a 0x93b7 0x93b6 0x93e7 0x93e7 0x93dd 0x9366 0x9390 0x9384 0x93a6 0x93a1 0x9392 0x9330 0x9367 0x935a 0x9364 0x9348 0x932b 0x92f5 0x933c 0x9330 0x9322 0x92ea 0x92bd 0x92b6 0x9309 0x9301 0x92e2 0x9296 0x925d 0x9274 0x92ce 0x92cf 0x92a2 0x9248 0x9208 0x922d 0x9289 0x9294 0x925e 0x91fe 0x91bc 0x91e4 0x9235 0x924a 0x9214 0x91b6 0x9173 0x919a 0x91d4 0x91f2 0x91c0 0x9166 0x9124 0x9151 0x916d 0x918d 0x9158 0x9101 0x90c0 0x910a 0x9104 0x9119 0x90da 0x9085 0x9045 0x90be 0x90a5 0x90a4 0x9064 0x9011 0x8fd4 0x9066 0x9055 0x9058 0x9026 0x8fde 0x8fa3 0x8ff1 0x9009 0x9027 0x900b 0x8fc1 0x8f87 0x8fa0 0x8fd7 0x9010 0x8ff6 0x8fb0 0x8f76 0x8f3a 0x8f9b 0x8ff2 0x8fd7 0x8f94 0x8f5b 0x8e9d 0x8f3c 0x8fa7 0x8f84 0x8f3f 0x8efc 0x8dbc 0x8e73 0x8ecd 0x8e86 0x8e46 0x8df2 0x8c72 0x8d0b 0x8d41 0x8ce7 0x8ca5 0x8c4f 0x8a95 0x8b0d 0x8b2a 0x8ad3 0x8a9a 0x8a45 0x87f8 0x8865 0x887d 0x881c 0x87ec 0x879d 0x841a 0x8496 0x84d3 0x8488 0x847e 0x8426 0x7eca 0x7f24 0x801b 0x8028 0x7f97 0x7ef0 0x6fcb 0x6e6e 0x6d71 0x6d74 0x6d50 0x6d1a>; + }; + + qcom,pc-temp-z1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x38d1 0x33b6 0x2f09 0x2da0 0x2d49 0x38bb 0x337f 0x2f0d 0x2d9e 0x2d52 0x38c3 0x3376 0x2f0b 0x2da5 0x2d5c 0x38c7 0x337e 0x2f07 0x2da7 0x2d60 0x38d3 0x3382 0x2f03 0x2da8 0x2d62 0x38eb 0x337d 0x2f01 0x2da8 0x2d64 0x38ff 0x336c 0x2f02 0x2da9 0x2d67 0x38f6 0x335e 0x2f03 0x2dac 0x2d6a 0x38d7 0x335d 0x2f05 0x2dae 0x2d6d 0x38b6 0x3362 0x2f09 0x2db1 0x2d6f 0x3896 0x3360 0x2f0d 0x2db5 0x2d72 0x3874 0x334e 0x2f0f 0x2db8 0x2d77 0x3843 0x333c 0x2f0f 0x2dbb 0x2d7b 0x3810 0x332e 0x2f0b 0x2dbb 0x2d7c 0x37ee 0x3328 0x2f04 0x2db9 0x2d7c 0x37d3 0x3329 0x2f01 0x2db7 0x2d7c 0x37b6 0x3329 0x2f04 0x2dbb 0x2d7f 0x3792 0x332c 0x2f0a 0x2dc2 0x2d85 0x3772 0x3337 0x2f14 0x2dc9 0x2d8b 0x3765 0x3349 0x2f21 0x2dce 0x2d8f 0x3763 0x335e 0x2f2c 0x2dd3 0x2d93 0x376a 0x3374 0x2f35 0x2dd8 0x2d98 0x3773 0x3384 0x2f3d 0x2ddd 0x2d9c 0x377f 0x338b 0x2f45 0x2de1 0x2da1 0x3787 0x3391 0x2f4d 0x2de7 0x2da6 0x378c 0x339a 0x2f54 0x2dec 0x2daa 0x378f 0x33a6 0x2f5b 0x2df0 0x2daf 0x3794 0x33ad 0x2f62 0x2df4 0x2db3 0x379f 0x33b2 0x2f69 0x2df8 0x2db7 0x37af 0x33ba 0x2f6f 0x2dfc 0x2dbb 0x37c7 0x33c2 0x2f75 0x2e00 0x2dbf 0x37de 0x33c9 0x2f7a 0x2e04 0x2dc4 0x37e6 0x33d1 0x2f80 0x2e08 0x2dc8 0x37ea 0x33de 0x2f86 0x2e0d 0x2dcd 0x37f0 0x33f1 0x2f8e 0x2e12 0x2dd1 0x3807 0x3403 0x2f95 0x2e17 0x2dd5 0x383b 0x3415 0x2f9d 0x2e1a 0x2dd8 0x386b 0x3422 0x2fa5 0x2e1c 0x2dda 0x3891 0x3427 0x2faa 0x2e1f 0x2ddc 0x38b0 0x3429 0x2fad 0x2e21 0x2ddd 0x38b2 0x342d 0x2fb1 0x2e23 0x2dde 0x3888 0x3439 0x2fb9 0x2e25 0x2de0 0x3873 0x3448 0x2fbf 0x2e27 0x2de1 0x386e 0x3457 0x2fc0 0x2e28 0x2de2 0x3861 0x3449 0x2fc4 0x2e29 0x2de2 0x386f 0x3454 0x2fc7 0x2e2b 0x2de2 0x3869 0x3454 0x2fc8 0x2e2b 0x2de1 0x3868 0x345b 0x2fc9 0x2e2b 0x2de2 0x385f 0x3457 0x2fcf 0x2e2c 0x2de3 0x387c 0x3452 0x2fd1 0x2e30 0x2de6 0x3886 0x346f 0x2fdb 0x2e36 0x2deb 0x38aa 0x3476 0x2ff3 0x2e3f 0x2df0 0x3895 0x349e 0x3007 0x2e4a 0x2dfa 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06>; + }; + + qcom,pc-temp-z2-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2bb8 0x2632 0x2811 0x296b 0x2a9e 0x280d 0x2a3d 0x2824 0x28fa 0x293e 0x25fe 0x2926 0x282f 0x28bc 0x28c4 0x2606 0x274d 0x282a 0x28ad 0x28ac 0x2620 0x26d2 0x281d 0x2898 0x28a6 0x262f 0x26c3 0x2815 0x288c 0x28a4 0x2631 0x26b5 0x2811 0x2887 0x28a8 0x262c 0x26aa 0x2812 0x2882 0x28ac 0x2625 0x26a2 0x2816 0x2880 0x28ac 0x261b 0x269c 0x2819 0x2884 0x28b5 0x2612 0x2698 0x2813 0x2887 0x28cc 0x2616 0x2696 0x27f3 0x288e 0x28d4 0x2626 0x2699 0x27d7 0x28ae 0x28d3 0x262c 0x26a7 0x27e8 0x28bd 0x28d4 0x2618 0x26b3 0x2814 0x289f 0x28d2 0x25f5 0x26b6 0x282a 0x2883 0x28c7 0x25e5 0x26ba 0x2827 0x288f 0x28d1 0x25e1 0x26c3 0x281d 0x28b2 0x290a 0x25dd 0x26dd 0x2837 0x28e1 0x2937 0x25d6 0x26fd 0x2894 0x2931 0x293f 0x25c9 0x271e 0x28ce 0x296a 0x293f 0x25be 0x2742 0x28b3 0x2939 0x2923 0x25b7 0x2760 0x2883 0x28bd 0x28ee 0x25b1 0x2775 0x2863 0x288b 0x28cc 0x259f 0x2784 0x284c 0x289e 0x28b4 0x2574 0x278c 0x283f 0x28b6 0x28a5 0x2552 0x2793 0x283c 0x28a9 0x28a6 0x2544 0x2797 0x283d 0x2890 0x28af 0x250b 0x2796 0x2845 0x2888 0x28ba 0x24d2 0x2793 0x2859 0x2888 0x28cd 0x24c0 0x2792 0x286f 0x288c 0x28e8 0x24b3 0x2793 0x2885 0x289f 0x290a 0x24aa 0x2795 0x289c 0x28c5 0x2934 0x24a2 0x2799 0x28b4 0x28ea 0x2962 0x249c 0x27a2 0x28ce 0x290a 0x299b 0x2498 0x27aa 0x28df 0x2925 0x29c7 0x249e 0x27b2 0x28e4 0x293c 0x29d8 0x24a4 0x27b7 0x28e7 0x2954 0x29e2 0x24ad 0x27bb 0x28ef 0x2961 0x29ed 0x24b6 0x27c0 0x28fb 0x2964 0x29f9 0x24b5 0x27c2 0x2901 0x2965 0x2a01 0x24a8 0x27b9 0x28fa 0x2971 0x2a03 0x24a4 0x279c 0x28f3 0x2981 0x2a07 0x24aa 0x26ec 0x28f1 0x2987 0x2a1d 0x246c 0x26c6 0x28d6 0x2992 0x2a3b 0x2459 0x26cc 0x28c6 0x29ad 0x2a38 0x2447 0x26dc 0x28df 0x29c9 0x2a6a 0x2449 0x26cd 0x293d 0x29ca 0x2a89 0x243a 0x26ed 0x297e 0x2a06 0x2aa5 0x243e 0x26c3 0x2925 0x29d7 0x2a55 0x2464 0x269c 0x28de 0x298a 0x29c5 0x246e 0x264f 0x28b9 0x2971 0x29af 0x2445 0x25fc 0x289b 0x2927 0x295f 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904>; + }; + + qcom,pc-temp-z3-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4c45 0x4be7 0x4bad 0x4bb7 0x4b9b 0x4d48 0x4c26 0x4bd0 0x4baa 0x4b96 0x4dd0 0x4c76 0x4bee 0x4bac 0x4b97 0x4de1 0x4cc3 0x4bfa 0x4bb4 0x4b9c 0x4dce 0x4cd9 0x4bff 0x4bb6 0x4b9f 0x4db7 0x4cdc 0x4c00 0x4bb7 0x4ba2 0x4dac 0x4cdd 0x4bfe 0x4bb5 0x4ba2 0x4da7 0x4cdd 0x4bfb 0x4bb0 0x4b9f 0x4da5 0x4ce0 0x4bf8 0x4bac 0x4b9b 0x4da2 0x4ce2 0x4bf6 0x4bac 0x4b99 0x4da0 0x4cd4 0x4bf0 0x4bac 0x4b98 0x4da5 0x4cac 0x4bdf 0x4ba7 0x4b98 0x4db6 0x4c9a 0x4bc8 0x4b9b 0x4b95 0x4dc5 0x4cb6 0x4bce 0x4b96 0x4b91 0x4db4 0x4cd7 0x4bef 0x4ba3 0x4b93 0x4d83 0x4cd1 0x4c01 0x4bb3 0x4b97 0x4d54 0x4cac 0x4bec 0x4bad 0x4b94 0x4d30 0x4c8a 0x4bd0 0x4b9c 0x4b8a 0x4d0e 0x4c6f 0x4bcf 0x4b98 0x4b87 0x4cf1 0x4c5e 0x4be1 0x4ba6 0x4b8e 0x4cd8 0x4c62 0x4bee 0x4bb3 0x4b97 0x4cc6 0x4c75 0x4bef 0x4bb3 0x4b9d 0x4cbc 0x4c87 0x4bef 0x4bae 0x4ba1 0x4cb4 0x4c93 0x4bed 0x4bad 0x4ba2 0x4cac 0x4c9c 0x4bea 0x4bb4 0x4ba0 0x4ca3 0x4c9d 0x4be9 0x4bba 0x4b9e 0x4c97 0x4c9b 0x4bef 0x4bb7 0x4b9c 0x4c8c 0x4c97 0x4bf5 0x4bb2 0x4b9a 0x4c7f 0x4c91 0x4bf6 0x4bae 0x4b98 0x4c6f 0x4c8a 0x4bf4 0x4ba9 0x4b96 0x4c5d 0x4c84 0x4bf2 0x4ba5 0x4b94 0x4c4a 0x4c7f 0x4bef 0x4ba2 0x4b91 0x4c3a 0x4c7a 0x4bea 0x4ba0 0x4b8e 0x4c2b 0x4c73 0x4be7 0x4b9f 0x4b8a 0x4c1e 0x4c6b 0x4be5 0x4b9e 0x4b86 0x4c17 0x4c65 0x4be2 0x4b9e 0x4b84 0x4c1b 0x4c5f 0x4bde 0x4b9e 0x4b84 0x4c23 0x4c5a 0x4bda 0x4b9d 0x4b86 0x4c39 0x4c56 0x4bd7 0x4b9c 0x4b86 0x4c4f 0x4c53 0x4bd6 0x4b97 0x4b83 0x4c46 0x4c4f 0x4bd4 0x4b93 0x4b81 0x4c28 0x4c4a 0x4bd2 0x4b93 0x4b82 0x4c1b 0x4c3f 0x4bd0 0x4b93 0x4b82 0x4c19 0x4bfb 0x4bcc 0x4b93 0x4b83 0x4bac 0x4bb3 0x4bb6 0x4b90 0x4b7f 0x4b91 0x4b94 0x4ba0 0x4b89 0x4b78 0x4b89 0x4b8c 0x4b9e 0x4b80 0x4b70 0x4b8b 0x4b87 0x4b8e 0x4b7e 0x4b70 0x4b74 0x4b76 0x4b83 0x4b7c 0x4b6d 0x4b78 0x4b75 0x4b98 0x4b87 0x4b7c 0x4bab 0x4b91 0x4b9b 0x4b8b 0x4b83 0x4bda 0x4b96 0x4b9d 0x4b8e 0x4b84 0x4bf2 0x4b94 0x4b99 0x4b92 0x4b87 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c>; + }; + + qcom,pc-temp-z4-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4001 0x3c8d 0x3a72 0x3978 0x397b 0x40ed 0x3c83 0x3a6f 0x39c6 0x39b9 0x40da 0x3c60 0x3a4a 0x39d2 0x39c2 0x4086 0x3c0a 0x3a21 0x39c0 0x39b5 0x4000 0x3ba1 0x39fb 0x39a7 0x399e 0x3f71 0x3b4a 0x39dc 0x3990 0x3986 0x3ef7 0x3b02 0x39c2 0x3981 0x3976 0x3e89 0x3acb 0x39ac 0x3976 0x396c 0x3e16 0x3aa0 0x39a0 0x3970 0x3966 0x3d82 0x3a79 0x399a 0x396d 0x3961 0x3cf4 0x3a50 0x3998 0x396a 0x395d 0x3cc5 0x3a2f 0x3998 0x3965 0x3959 0x3cdb 0x3a29 0x3999 0x395f 0x3951 0x3cf0 0x3a35 0x399d 0x3961 0x394e 0x3cc2 0x3a3c 0x39a2 0x3970 0x395b 0x3c4c 0x3a29 0x39a0 0x397b 0x3968 0x3beb 0x39fe 0x398c 0x396b 0x395e 0x3bb2 0x39dd 0x3979 0x394d 0x3947 0x3b8d 0x39c9 0x3978 0x394f 0x3946 0x3b7e 0x39bd 0x3982 0x3988 0x3974 0x3b75 0x39bc 0x3996 0x39ba 0x39a6 0x3b71 0x39bf 0x39ca 0x39be 0x39ab 0x3b75 0x39c9 0x39fe 0x39b9 0x399f 0x3b7b 0x39fa 0x39fe 0x39ae 0x3991 0x3b80 0x3a38 0x39df 0x3993 0x3982 0x3b85 0x3a46 0x39bf 0x397d 0x3975 0x3b8c 0x3a43 0x39a7 0x3973 0x396c 0x3b92 0x3a3e 0x3994 0x396e 0x3965 0x3b9e 0x3a2f 0x3989 0x3969 0x395f 0x3bab 0x3a18 0x3982 0x3965 0x395a 0x3bb3 0x3a05 0x397d 0x3962 0x3955 0x3bba 0x39f5 0x397b 0x395e 0x3951 0x3bbe 0x39e5 0x397a 0x395a 0x394e 0x3bbc 0x39d6 0x3979 0x395a 0x394d 0x3bb5 0x39c8 0x3979 0x395c 0x3950 0x3ba1 0x39ba 0x3978 0x395e 0x3955 0x3b72 0x39ac 0x3976 0x3961 0x395b 0x3b43 0x39a1 0x3973 0x3963 0x3961 0x3afc 0x399e 0x3970 0x3963 0x3963 0x3abc 0x399c 0x396d 0x3963 0x3960 0x3ab4 0x3999 0x396a 0x3962 0x395d 0x3abb 0x3994 0x3967 0x3960 0x395c 0x3ab9 0x3995 0x3962 0x395d 0x395b 0x3aa3 0x39d0 0x395a 0x3959 0x3958 0x3abd 0x39eb 0x3957 0x394b 0x394c 0x3ac6 0x39f6 0x3953 0x3935 0x3934 0x3acb 0x39f8 0x394d 0x3931 0x392d 0x3ac3 0x39fa 0x3959 0x3929 0x3920 0x3ad0 0x3a03 0x3961 0x3925 0x391e 0x3ac0 0x39ff 0x394e 0x392e 0x392c 0x3a9b 0x39f7 0x3956 0x3935 0x3930 0x3a8e 0x39fe 0x3959 0x3936 0x3935 0x3a94 0x3a0e 0x3963 0x3937 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936>; + }; + + qcom,pc-temp-z5-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2b3c 0x2daa 0x3498 0x4a8d 0x45cc 0x2ef0 0x3052 0x39fb 0x4721 0x484e 0x3117 0x343d 0x3f9f 0x4802 0x4a61 0x31df 0x385f 0x430e 0x4b83 0x4d9f 0x326a 0x3a69 0x44ec 0x4e02 0x5124 0x32f3 0x3bab 0x4673 0x5049 0x55e1 0x33c6 0x3ce5 0x4810 0x514c 0x5936 0x34d0 0x3e95 0x49be 0x511b 0x5a23 0x35db 0x4119 0x4b35 0x5160 0x5a1d 0x36fa 0x4312 0x4c4c 0x5327 0x5b6b 0x3859 0x42b6 0x4bad 0x5424 0x5e2c 0x3a2d 0x3f5c 0x45e6 0x5167 0x6138 0x3c44 0x3ed3 0x3ee4 0x49ed 0x6100 0x3d63 0x47a6 0x4250 0x472f 0x5e7d 0x3d9a 0x506d 0x5049 0x50b3 0x5f98 0x3db5 0x5016 0x57f1 0x5c40 0x639a 0x3dda 0x4c6d 0x532f 0x5d14 0x64bc 0x3dd6 0x4a75 0x4bb9 0x59b9 0x646c 0x3d86 0x49e6 0x55e6 0x5b90 0x6454 0x3cdc 0x49b6 0x76e4 0x6b24 0x646b 0x3bcd 0x5034 0x875d 0x7705 0x6492 0x3ad1 0x649b 0x78a4 0x6a60 0x5e9c 0x3a04 0x7968 0x6282 0x5014 0x511e 0x3939 0x8c1a 0x56c4 0x4873 0x4bc7 0x3846 0x9a39 0x4fd8 0x5026 0x4d8e 0x3716 0x9aa6 0x4dfb 0x5780 0x5074 0x35e9 0x91df 0x53c1 0x5aa0 0x53ba 0x34ed 0x87db 0x5d83 0x5d20 0x57f1 0x33ea 0x7eb5 0x65eb 0x5e8b 0x5cc6 0x32dd 0x764e 0x6eb9 0x601d 0x628a 0x31ca 0x720c 0x75c6 0x61b9 0x67fc 0x30bf 0x6fd5 0x79eb 0x63f1 0x6c9c 0x2ffa 0x6e15 0x7d26 0x6810 0x7085 0x2f5e 0x6c28 0x8068 0x6dc5 0x7165 0x2ed6 0x6a83 0x83d1 0x7653 0x6fdc 0x2e78 0x6a47 0x8529 0x7b5b 0x6e81 0x2ea9 0x6b32 0x8003 0x7adf 0x6f61 0x2f11 0x6ca0 0x7890 0x796f 0x710e 0x303e 0x6e9b 0x7749 0x7672 0x709c 0x317f 0x7119 0x77a9 0x6cad 0x6a94 0x3162 0x71bd 0x77df 0x65cc 0x65f5 0x300b 0x6c45 0x7771 0x66c4 0x66af 0x2fb0 0x60cd 0x7669 0x680b 0x6789 0x3015 0x4018 0x70b0 0x6813 0x6600 0x2ca4 0x3328 0x596b 0x6764 0x62b7 0x2bbe 0x3022 0x477d 0x6688 0x6215 0x2b68 0x2f70 0x4725 0x57da 0x5967 0x2b6c 0x2f09 0x3dd8 0x58e5 0x64be 0x2ab7 0x2db9 0x398d 0x5bd2 0x6460 0x2ae0 0x2ded 0x457f 0x6bcd 0x75c0 0x2cb0 0x2ff3 0x438f 0x6311 0x7110 0x2d80 0x2fa5 0x439f 0x6129 0x668d 0x2d89 0x2ebe 0x3ec3 0x61e3 0x62ca 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005>; + }; + + qcom,pc-temp-z6-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x409a 0x3c2e 0x39dd 0x392f 0x3913 0x416d 0x3c48 0x39ee 0x394b 0x392d 0x419b 0x3c57 0x39ee 0x3952 0x3933 0x4181 0x3c50 0x39e4 0x394f 0x3931 0x413b 0x3c33 0x39d5 0x3947 0x392a 0x40e4 0x3c0c 0x39c7 0x393d 0x3921 0x409c 0x3be5 0x39bb 0x3935 0x391b 0x4062 0x3bcb 0x39b0 0x392e 0x3915 0x4027 0x3bb9 0x39aa 0x392a 0x3910 0x3fe0 0x3ba7 0x39a7 0x3929 0x390e 0x3f9a 0x3b8a 0x39a3 0x3928 0x390c 0x3f73 0x3b64 0x399a 0x3924 0x390b 0x3f65 0x3b56 0x398e 0x391c 0x3906 0x3f55 0x3b62 0x3992 0x3919 0x3903 0x3f1e 0x3b70 0x39a4 0x3927 0x390a 0x3ec0 0x3b64 0x39ac 0x3933 0x3912 0x3e70 0x3b3f 0x3999 0x392a 0x390c 0x3e3a 0x3b22 0x3982 0x3915 0x38fe 0x3e0f 0x3b10 0x3982 0x3914 0x38fc 0x3df2 0x3b06 0x3991 0x3936 0x3915 0x3ddc 0x3b09 0x39a5 0x3953 0x3930 0x3dd2 0x3b19 0x39c1 0x3956 0x3934 0x3dd2 0x3b2e 0x39d7 0x3953 0x3934 0x3dd7 0x3b4e 0x39d6 0x394f 0x3932 0x3ddc 0x3b6d 0x39c9 0x3948 0x392b 0x3de1 0x3b75 0x39be 0x3942 0x3924 0x3de6 0x3b75 0x39b8 0x393d 0x391f 0x3dea 0x3b74 0x39b4 0x3938 0x391c 0x3dee 0x3b6e 0x39b1 0x3935 0x3919 0x3df0 0x3b64 0x39ae 0x3931 0x3916 0x3df0 0x3b5c 0x39ab 0x392e 0x3913 0x3df0 0x3b54 0x39a9 0x392b 0x3910 0x3def 0x3b4c 0x39a8 0x3928 0x390d 0x3ded 0x3b46 0x39a7 0x3928 0x390c 0x3deb 0x3b40 0x39a7 0x3929 0x390c 0x3deb 0x3b3c 0x39a6 0x392a 0x390c 0x3ded 0x3b38 0x39a4 0x392c 0x390f 0x3def 0x3b35 0x39a2 0x392d 0x3913 0x3def 0x3b35 0x39a0 0x392d 0x3914 0x3dee 0x3b36 0x399f 0x392a 0x3912 0x3deb 0x3b36 0x399e 0x3928 0x3910 0x3de2 0x3b35 0x399d 0x3927 0x3910 0x3dd8 0x3b34 0x399b 0x3927 0x390f 0x3dcd 0x3b2c 0x3997 0x3926 0x390f 0x3da1 0x3b16 0x398b 0x391d 0x3908 0x3d94 0x3b10 0x397f 0x3911 0x38f9 0x3d93 0x3b0a 0x397c 0x390a 0x38f2 0x3d8f 0x3b0c 0x3979 0x3906 0x38ec 0x3d8d 0x3b07 0x3977 0x3903 0x38ea 0x3d95 0x3b0c 0x397c 0x390d 0x38f8 0x3da1 0x3b20 0x3983 0x3914 0x38ff 0x3dbd 0x3b30 0x398c 0x3918 0x3902 0x3de0 0x3b45 0x3993 0x391d 0x3906 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d>; + }; + + qcom,pc-temp-y1-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1dae 0x1a6c 0x17b7 0x1540 0x1467 0x143b 0x1db4 0x1a6f 0x17c3 0x153f 0x1466 0x143d 0x1dc0 0x1a74 0x17ca 0x153e 0x1466 0x143e 0x1dcd 0x1a7a 0x17ce 0x153c 0x1466 0x1440 0x1dd8 0x1a7e 0x17d0 0x153b 0x1467 0x1441 0x1ddd 0x1a80 0x17d0 0x153a 0x1467 0x1443 0x1ddc 0x1a80 0x17cc 0x153a 0x1468 0x1443 0x1dda 0x1a80 0x17c6 0x153a 0x146a 0x1444 0x1dd3 0x1a7d 0x17c5 0x153b 0x146c 0x1445 0x1dbc 0x1a76 0x17c8 0x153c 0x146d 0x1446 0x1daa 0x1a70 0x17ca 0x153d 0x146f 0x1448 0x1db3 0x1a6e 0x17c6 0x153d 0x1470 0x1449 0x1dc8 0x1a6f 0x17c0 0x153d 0x1472 0x144b 0x1ddc 0x1a74 0x17c1 0x153e 0x1474 0x144d 0x1df4 0x1a85 0x17d0 0x1545 0x1479 0x1452 0x1e03 0x1a97 0x17db 0x154d 0x147c 0x1454 0x1dfa 0x1aa4 0x17df 0x154f 0x147c 0x1455 0x1de7 0x1aaf 0x17e3 0x1552 0x147d 0x1455 0x1dd8 0x1ab0 0x17e4 0x1554 0x147e 0x1456 0x1dca 0x1aa1 0x17e2 0x1555 0x1480 0x1459 0x1dc3 0x1a95 0x17e2 0x1558 0x1483 0x145c 0x1dd6 0x1a97 0x17ed 0x155c 0x1487 0x1460 0x1df9 0x1a9f 0x17fb 0x1560 0x148b 0x1463 0x1e01 0x1aa5 0x17fd 0x1565 0x148e 0x1467 0x1e00 0x1aa8 0x17f8 0x1569 0x1491 0x146a 0x1e04 0x1aac 0x17f7 0x156d 0x1493 0x146e 0x1e09 0x1ab8 0x1800 0x1571 0x1496 0x1472 0x1e0c 0x1acc 0x180b 0x1576 0x149a 0x1475 0x1e0a 0x1ad7 0x180e 0x157b 0x149d 0x1478 0x1df8 0x1adc 0x1812 0x1581 0x14a0 0x147a 0x1de0 0x1ade 0x1817 0x1586 0x14a3 0x147d 0x1dd9 0x1adb 0x181b 0x158b 0x14a7 0x1480 0x1ddb 0x1ad7 0x181f 0x1590 0x14aa 0x1484 0x1ddd 0x1ad7 0x1820 0x1593 0x14ad 0x1487 0x1de1 0x1ad5 0x1821 0x1596 0x14b0 0x1489 0x1de8 0x1ad3 0x1823 0x1599 0x14b2 0x148b 0x1df7 0x1adf 0x1827 0x159b 0x14b4 0x148c 0x1e0a 0x1aef 0x182c 0x159d 0x14b5 0x148d 0x1e0d 0x1aef 0x1831 0x159e 0x14b5 0x148e 0x1dff 0x1ae3 0x1835 0x159f 0x14b6 0x148e 0x1df5 0x1adf 0x183a 0x15a1 0x14b7 0x148f 0x1df6 0x1ae5 0x1841 0x15a5 0x14b9 0x1491 0x1df6 0x1aeb 0x184c 0x15a8 0x14ba 0x1492 0x1df6 0x1af2 0x1849 0x15aa 0x14bb 0x1493 0x1dfa 0x1af8 0x1850 0x15af 0x14be 0x1495 0x1e04 0x1b0b 0x1850 0x15b1 0x14be 0x1496 0x1e09 0x1b08 0x1859 0x15b4 0x14be 0x1496 0x1e26 0x1b0e 0x1863 0x15b4 0x14be 0x1496 0x1e37 0x1b0b 0x186b 0x15b6 0x14bf 0x1496 0x1e2c 0x1b1e 0x1867 0x15b9 0x14c2 0x1498 0x1e29 0x1b3f 0x1879 0x15c2 0x14c5 0x149b 0x1e38 0x1b5b 0x1895 0x15d1 0x14cc 0x14a0 0x1e61 0x1b5f 0x18a8 0x15e4 0x14d3 0x14a6 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac>; + }; + + qcom,pc-temp-y2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x25d6 0x28a1 0x29b8 0x2b2a 0x2b60 0x2c89 0x2638 0x287f 0x299b 0x2b15 0x2b62 0x2c51 0x2674 0x286a 0x297a 0x2afb 0x2b61 0x2bfc 0x2693 0x285f 0x2959 0x2ade 0x2b5e 0x2ba2 0x269f 0x285b 0x293d 0x2abd 0x2b58 0x2b5a 0x26a2 0x285a 0x292b 0x2a9a 0x2b51 0x2b3c 0x266c 0x2867 0x2922 0x2a6d 0x2b48 0x2b43 0x260b 0x287d 0x291b 0x2a3f 0x2b3b 0x2b4e 0x25f2 0x2878 0x2916 0x2a29 0x2b28 0x2b4d 0x25fe 0x283e 0x2912 0x2a1c 0x2b09 0x2b3a 0x2615 0x2814 0x2910 0x2a13 0x2ae5 0x2b24 0x2698 0x2862 0x291a 0x2a04 0x2ab6 0x2afb 0x2784 0x28ea 0x2933 0x29f0 0x2a85 0x2ac3 0x27ba 0x2909 0x295a 0x29f2 0x2a7a 0x2abc 0x26d8 0x28f6 0x29a8 0x2a1d 0x2a90 0x2af0 0x2601 0x28e9 0x29e0 0x2a53 0x2ab0 0x2b19 0x25e5 0x28ff 0x29fa 0x2a91 0x2aec 0x2b1b 0x25de 0x2924 0x2a0e 0x2ad0 0x2b33 0x2b18 0x25d8 0x292d 0x2a1d 0x2aef 0x2b47 0x2b23 0x25d2 0x292c 0x2a2b 0x2afc 0x2b48 0x2b59 0x25cd 0x2929 0x2a36 0x2b0a 0x2b4a 0x2b9b 0x25ca 0x28f3 0x2a3f 0x2b29 0x2b78 0x2bd9 0x25c8 0x2849 0x2a48 0x2b54 0x2bc0 0x2c13 0x25c6 0x27d1 0x2a4b 0x2b74 0x2be2 0x2c3d 0x25c3 0x275f 0x2a50 0x2b8f 0x2bf6 0x2c5c 0x25c0 0x271c 0x2a54 0x2ba1 0x2c07 0x2c71 0x25bf 0x270e 0x2a52 0x2bac 0x2c19 0x2c83 0x25be 0x2700 0x2a4a 0x2bb0 0x2c2d 0x2c96 0x25bd 0x26ed 0x2a46 0x2ba7 0x2c35 0x2cb5 0x25bc 0x26d4 0x2a44 0x2b8e 0x2c41 0x2cec 0x25bb 0x26b9 0x2a3f 0x2b80 0x2c4d 0x2d11 0x25bb 0x26a1 0x29e9 0x2b83 0x2c40 0x2d02 0x25ba 0x268b 0x294e 0x2b8f 0x2c2f 0x2cda 0x25b9 0x2672 0x290b 0x2b9c 0x2c33 0x2cca 0x25b8 0x2655 0x28fa 0x2b99 0x2c39 0x2cd1 0x25b8 0x263a 0x28ee 0x2b84 0x2c35 0x2cd6 0x25b7 0x2622 0x28e6 0x2b68 0x2c34 0x2cdc 0x25b7 0x2604 0x290b 0x2b59 0x2c39 0x2ce8 0x25b6 0x25ec 0x293c 0x2b5f 0x2c3b 0x2ce7 0x25b6 0x25de 0x291d 0x2b60 0x2c36 0x2cd1 0x25b6 0x25d4 0x28ba 0x2b5f 0x2c32 0x2cc5 0x25b6 0x25cb 0x289c 0x2b62 0x2c34 0x2ccc 0x25b6 0x25c4 0x28a6 0x2b5d 0x2c32 0x2ccf 0x25b5 0x25be 0x281b 0x2b46 0x2c13 0x2cc8 0x25b5 0x25bb 0x27d7 0x2b34 0x2c13 0x2cb0 0x25b5 0x25bb 0x27c4 0x2b11 0x2c20 0x2c82 0x25b5 0x25ba 0x2810 0x2b0d 0x2c0a 0x2c51 0x25b5 0x25b9 0x2851 0x2b23 0x2be8 0x2c48 0x25b5 0x25b8 0x2853 0x2b28 0x2bef 0x2c50 0x25b4 0x25b8 0x2837 0x2ae6 0x2c1e 0x2c3a 0x25b4 0x25b6 0x2800 0x2acc 0x2bf7 0x2bfd 0x25b4 0x25b5 0x27bc 0x2aa1 0x2b7e 0x2ba7 0x25b4 0x25b4 0x2786 0x2a49 0x2b0f 0x2b35 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a>; + }; + + qcom,pc-temp-y3-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x347a 0x3456 0x3421 0x33e5 0x33e0 0x33d8 0x356b 0x345f 0x341a 0x33e4 0x33e0 0x33da 0x35ff 0x346c 0x3416 0x33e3 0x33e0 0x33db 0x364d 0x3479 0x3416 0x33e3 0x33e0 0x33dd 0x366b 0x3484 0x3418 0x33e3 0x33e0 0x33de 0x3670 0x3489 0x341c 0x33e5 0x33e0 0x33de 0x35ec 0x3489 0x3423 0x33e8 0x33e0 0x33de 0x34fc 0x3488 0x342b 0x33ed 0x33e1 0x33de 0x34bb 0x348b 0x342e 0x33ef 0x33e1 0x33de 0x34ba 0x349e 0x342f 0x33f0 0x33e1 0x33dd 0x34bb 0x34ac 0x3430 0x33f0 0x33e1 0x33dd 0x34d3 0x349e 0x343d 0x33f7 0x33e4 0x33df 0x3504 0x3481 0x3450 0x3401 0x33e9 0x33e2 0x3510 0x3471 0x3451 0x3402 0x33ea 0x33e3 0x34ec 0x3468 0x343b 0x33fe 0x33e8 0x33e2 0x34cc 0x3462 0x3427 0x33fb 0x33e6 0x33e2 0x34d0 0x345f 0x3422 0x33fd 0x33e8 0x33e2 0x34e0 0x345d 0x341f 0x3401 0x33ec 0x33e3 0x34e7 0x345a 0x341b 0x3401 0x33ec 0x33e3 0x34e9 0x3455 0x3416 0x33f9 0x33e7 0x33e0 0x34ea 0x344f 0x3411 0x33f0 0x33e3 0x33dd 0x34ec 0x3445 0x340c 0x33e8 0x33e1 0x33dc 0x34f0 0x3435 0x3407 0x33e3 0x33e0 0x33db 0x34f5 0x3427 0x3406 0x33e2 0x33df 0x33db 0x3500 0x341c 0x3405 0x33e3 0x33de 0x33db 0x3512 0x3417 0x3405 0x33e4 0x33de 0x33da 0x3525 0x3418 0x3405 0x33e3 0x33de 0x33da 0x3539 0x341b 0x3405 0x33e3 0x33dd 0x33da 0x354f 0x341f 0x3405 0x33e5 0x33dd 0x33da 0x356b 0x3423 0x3405 0x33e9 0x33dd 0x33d9 0x358d 0x3428 0x3405 0x33ec 0x33dd 0x33d9 0x35b2 0x342d 0x3400 0x33ed 0x33de 0x33d9 0x35da 0x3434 0x33f9 0x33ec 0x33de 0x33da 0x360a 0x343c 0x33f6 0x33ec 0x33df 0x33da 0x3641 0x3449 0x33f7 0x33ea 0x33de 0x33da 0x3680 0x3458 0x33f8 0x33e8 0x33de 0x33d9 0x36c1 0x3468 0x33fb 0x33e6 0x33de 0x33d9 0x3702 0x347a 0x3402 0x33e4 0x33dd 0x33d9 0x3742 0x3490 0x3408 0x33e3 0x33dd 0x33d9 0x3781 0x34b0 0x340c 0x33e3 0x33dd 0x33d9 0x37c1 0x34dc 0x340f 0x33e3 0x33dd 0x33d9 0x3803 0x3511 0x3415 0x33e3 0x33de 0x33da 0x3845 0x3550 0x341e 0x33e3 0x33de 0x33da 0x3892 0x35a3 0x3421 0x33e4 0x33de 0x33da 0x38ea 0x3613 0x3429 0x33e3 0x33de 0x33da 0x390d 0x3642 0x3430 0x33eb 0x33df 0x33dc 0x393f 0x363e 0x3435 0x33ec 0x33e1 0x33dd 0x395c 0x3658 0x3442 0x33f0 0x33e3 0x33e0 0x398d 0x36b9 0x3451 0x33f2 0x33e2 0x33e0 0x3a0b 0x3718 0x3452 0x33ee 0x33e1 0x33dd 0x3a97 0x37a6 0x345a 0x33f0 0x33e0 0x33dd 0x3b31 0x3888 0x346f 0x33f5 0x33e3 0x33e1 0x3c10 0x3978 0x3492 0x33f9 0x33e6 0x33e4 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6>; + }; + + qcom,pc-temp-y4-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x45b5 0x41d2 0x40f2 0x406d 0x4045 0x4044 0x452b 0x41db 0x40ef 0x4073 0x4045 0x4042 0x44eb 0x41eb 0x40ef 0x4078 0x4047 0x4041 0x44e9 0x4200 0x40f2 0x407b 0x4048 0x4040 0x4515 0x421b 0x40f7 0x407d 0x404a 0x4040 0x4561 0x4239 0x40fe 0x407e 0x404b 0x4040 0x4627 0x4263 0x4106 0x407c 0x404d 0x4041 0x478b 0x428e 0x4111 0x407a 0x404e 0x4044 0x4914 0x42a4 0x411c 0x407a 0x4051 0x4046 0x4b24 0x42ad 0x4127 0x4081 0x4055 0x4049 0x4c74 0x42bc 0x4138 0x408c 0x405b 0x404d 0x4a3e 0x4407 0x419f 0x409e 0x4069 0x4059 0x4560 0x4626 0x4237 0x40b4 0x407d 0x4068 0x437a 0x4642 0x4251 0x40bd 0x4081 0x406c 0x4347 0x43a8 0x4203 0x40bf 0x407d 0x406b 0x432d 0x41b1 0x41aa 0x40c3 0x407b 0x406a 0x4320 0x41b5 0x416e 0x40ec 0x4091 0x407a 0x430d 0x41e2 0x413b 0x4129 0x40ba 0x4098 0x42ef 0x41ed 0x4117 0x412a 0x40c0 0x409d 0x42b4 0x41c5 0x40fa 0x40d1 0x4094 0x407d 0x4274 0x4198 0x40e3 0x4085 0x4066 0x405b 0x4249 0x4180 0x40d4 0x4078 0x4054 0x404d 0x4228 0x416e 0x40c8 0x4072 0x4049 0x4043 0x421f 0x416b 0x40c2 0x406f 0x4048 0x4042 0x4223 0x415f 0x40be 0x406b 0x4048 0x4042 0x422b 0x414f 0x40bb 0x4069 0x4049 0x4043 0x4231 0x4143 0x40ba 0x406b 0x404b 0x4045 0x423b 0x4137 0x40ba 0x406d 0x404e 0x4048 0x4246 0x4136 0x40b9 0x406e 0x4051 0x404c 0x4252 0x4142 0x40b4 0x4070 0x4057 0x4051 0x425e 0x4154 0x40b0 0x4072 0x405e 0x4058 0x426a 0x4167 0x40b4 0x4074 0x4068 0x4063 0x4276 0x417f 0x40bd 0x4076 0x4073 0x4070 0x4283 0x4198 0x40c4 0x4074 0x4075 0x4072 0x4290 0x41b2 0x40c9 0x4069 0x4064 0x4061 0x429c 0x41cd 0x40cd 0x405e 0x404f 0x404c 0x42a8 0x41ef 0x40d2 0x405b 0x4044 0x4043 0x42b5 0x421f 0x40d8 0x4059 0x403e 0x403f 0x42c7 0x4244 0x40dc 0x405a 0x403e 0x4040 0x42e1 0x4252 0x40e9 0x405d 0x4042 0x4045 0x4308 0x425c 0x40fd 0x4060 0x4047 0x404a 0x433b 0x4262 0x410c 0x4063 0x4048 0x404b 0x437e 0x4270 0x4118 0x4064 0x4046 0x4048 0x43d3 0x4287 0x4129 0x4061 0x403d 0x403b 0x442a 0x42c2 0x4147 0x406b 0x4041 0x403e 0x441b 0x42ef 0x4160 0x4075 0x4057 0x405a 0x441e 0x4307 0x4166 0x4084 0x4070 0x4078 0x43ed 0x432a 0x4193 0x40a2 0x4099 0x40a2 0x43d0 0x436e 0x41e6 0x40be 0x409c 0x4098 0x43e5 0x4383 0x41de 0x409e 0x406e 0x4064 0x43f6 0x4384 0x41d8 0x409e 0x4060 0x4059 0x4411 0x43a0 0x41fb 0x40bd 0x4070 0x4067 0x4463 0x43f1 0x4266 0x40fb 0x4090 0x4085 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118>; + }; + + qcom,pc-temp-y5-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2208 0x348a 0x3ab0 0x3545 0x4573 0x3634 0x2208 0x34aa 0x3839 0x3326 0x4393 0x3e82 0x269f 0x34e2 0x3660 0x31db 0x419b 0x43da 0x2f8b 0x3522 0x3519 0x3130 0x3fbf 0x46e0 0x3428 0x3557 0x345a 0x30f0 0x3e34 0x4838 0x3590 0x3572 0x341a 0x30e7 0x3d2f 0x4884 0x30ee 0x3576 0x34b3 0x32d3 0x3ca4 0x46c7 0x2869 0x3578 0x35a4 0x35e5 0x3c3f 0x4385 0x267f 0x34b6 0x35c2 0x3648 0x3b81 0x4119 0x2a54 0x3032 0x3545 0x34d0 0x3996 0x3e92 0x2ff6 0x2cf8 0x3494 0x33cf 0x387f 0x3ce5 0x37e1 0x2fd6 0x333d 0x3525 0x3964 0x3cfd 0x4112 0x360e 0x319c 0x3768 0x3acb 0x3dbd 0x4280 0x3a64 0x326c 0x37dc 0x3b0d 0x3dbf 0x373b 0x3dd4 0x395e 0x3745 0x3a7a 0x3cb2 0x2cf9 0x3f72 0x3eca 0x36d1 0x3a41 0x3bb0 0x2d03 0x3ec5 0x3f83 0x384b 0x3ae8 0x3b5d 0x2edc 0x3dc2 0x3fc3 0x3b9d 0x3c38 0x3b2b 0x2f8c 0x3d9a 0x3f92 0x3dc7 0x3e57 0x3b93 0x2f1e 0x3df3 0x3ecf 0x3f34 0x4225 0x3e9f 0x2e5c 0x3e54 0x3de6 0x3fc8 0x445b 0x4233 0x2d64 0x3c6d 0x3c08 0x3c17 0x4527 0x44e0 0x2c30 0x3697 0x3971 0x3578 0x4604 0x471b 0x2b6b 0x3248 0x38a0 0x33d2 0x4627 0x47ff 0x2b06 0x2f1a 0x38d8 0x353a 0x4512 0x484d 0x2ad4 0x2d6f 0x3925 0x3660 0x43d2 0x484f 0x2add 0x2d4c 0x3975 0x3678 0x4315 0x4790 0x2aec 0x2d55 0x39cc 0x366c 0x4294 0x45bc 0x2af3 0x2d44 0x3a34 0x38ed 0x427b 0x43ff 0x2b16 0x2d12 0x3b09 0x40ee 0x4270 0x426f 0x2b4e 0x2d07 0x3ba6 0x465a 0x4280 0x41aa 0x2b80 0x2d07 0x38cb 0x47e5 0x43ef 0x42bb 0x2ba9 0x2cec 0x3382 0x48db 0x472c 0x45f6 0x2bd0 0x2ce9 0x319e 0x48b8 0x4a98 0x495f 0x2bf8 0x2d41 0x31a4 0x45bb 0x4e8c 0x4c69 0x2c20 0x2daa 0x31b5 0x4185 0x51da 0x4ea9 0x2c45 0x2dd9 0x3221 0x3e14 0x52fb 0x508e 0x2c64 0x2d8a 0x34af 0x3aee 0x5257 0x524a 0x2c6c 0x2d32 0x3713 0x3918 0x50bc 0x5292 0x2c5a 0x2d52 0x36de 0x38bf 0x4e90 0x50e7 0x2c45 0x2d99 0x34f7 0x3913 0x4dbc 0x4f8f 0x2c53 0x2da9 0x354f 0x3906 0x4ea8 0x5136 0x2cb7 0x2d71 0x370b 0x3898 0x515e 0x56c7 0x2d6c 0x2d2c 0x33cd 0x3962 0x555b 0x5c52 0x2e6e 0x2cc8 0x325a 0x3610 0x4cc2 0x4ea4 0x2fc4 0x2d10 0x320a 0x3e49 0x4394 0x4373 0x30b0 0x2d1b 0x3431 0x3e08 0x42cc 0x40b6 0x322c 0x2e86 0x370e 0x4092 0x40be 0x3f21 0x3256 0x3099 0x3915 0x3fe1 0x3e27 0x3e5b 0x322c 0x3127 0x38b1 0x3e5f 0x428d 0x410e 0x3117 0x3039 0x38e1 0x4283 0x4414 0x4431 0x2f77 0x2f18 0x37f8 0x4528 0x4741 0x4a06 0x2e6f 0x2e5e 0x37ca 0x4396 0x477b 0x4ab1 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b>; + }; + + qcom,pc-temp-y6-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1af4 0x1607 0x1492 0x13c9 0x139d 0x1392 0x1afb 0x160e 0x148d 0x13c8 0x139d 0x1393 0x1aff 0x1616 0x148a 0x13c7 0x139d 0x1394 0x1aff 0x161e 0x148a 0x13c8 0x139d 0x1395 0x1afc 0x1626 0x148c 0x13c9 0x139e 0x1395 0x1af7 0x162e 0x148e 0x13ca 0x139f 0x1396 0x1ac7 0x1636 0x1494 0x13cc 0x139f 0x1397 0x1a78 0x163e 0x149c 0x13cf 0x13a1 0x1397 0x1a74 0x1646 0x14a1 0x13d2 0x13a2 0x1398 0x1aff 0x164c 0x14a3 0x13d4 0x13a3 0x1399 0x1b70 0x1657 0x14a8 0x13d7 0x13a5 0x139a 0x1af4 0x16ac 0x14cc 0x13e2 0x13ac 0x139f 0x19d3 0x172c 0x1503 0x13ef 0x13b5 0x13a6 0x1941 0x172c 0x150b 0x13f2 0x13b7 0x13a8 0x190e 0x1670 0x14e5 0x13f1 0x13b5 0x13a7 0x18f6 0x15e2 0x14be 0x13f0 0x13b3 0x13a7 0x18fb 0x15e4 0x14ab 0x13fd 0x13bb 0x13ac 0x1909 0x15f5 0x149c 0x1412 0x13c9 0x13b5 0x190d 0x15f9 0x148f 0x1412 0x13cb 0x13b7 0x190c 0x15ed 0x1483 0x13f3 0x13bb 0x13ab 0x190a 0x15e0 0x147a 0x13d6 0x13ab 0x139f 0x190d 0x15d6 0x1473 0x13cd 0x13a4 0x139a 0x191a 0x15ce 0x146e 0x13c8 0x13a1 0x1397 0x192c 0x15c9 0x146d 0x13c7 0x13a0 0x1397 0x1945 0x15c7 0x146e 0x13c7 0x13a0 0x1397 0x1964 0x15c6 0x146f 0x13c8 0x13a0 0x1398 0x1982 0x15cb 0x1470 0x13c9 0x13a1 0x1398 0x19a0 0x15d5 0x1473 0x13ca 0x13a2 0x1399 0x19c0 0x15e2 0x1475 0x13cc 0x13a3 0x139a 0x19e6 0x15f3 0x1476 0x13d0 0x13a5 0x139c 0x1a11 0x1607 0x1477 0x13d4 0x13a7 0x139e 0x1a3f 0x161d 0x1478 0x13d6 0x13ab 0x13a2 0x1a72 0x1638 0x1479 0x13d7 0x13af 0x13a6 0x1aa7 0x1655 0x147b 0x13d6 0x13b0 0x13a7 0x1ae0 0x1676 0x147f 0x13d2 0x13ab 0x13a2 0x1b1c 0x169b 0x1483 0x13ce 0x13a5 0x139c 0x1b59 0x16c6 0x1488 0x13cc 0x13a2 0x139a 0x1b96 0x16f8 0x1490 0x13cb 0x13a0 0x1398 0x1bd4 0x1732 0x149a 0x13ca 0x13a0 0x1399 0x1c13 0x1772 0x14a5 0x13cb 0x13a1 0x139a 0x1c51 0x17bc 0x14b0 0x13cd 0x13a3 0x139c 0x1c90 0x1811 0x14bf 0x13ce 0x13a4 0x139d 0x1cd3 0x1875 0x14d0 0x13cf 0x13a3 0x139c 0x1d22 0x18ef 0x14e0 0x13d0 0x13a1 0x1399 0x1d80 0x1984 0x14f9 0x13d2 0x13a3 0x139a 0x1da5 0x19b9 0x150c 0x13db 0x13a9 0x13a3 0x1dcf 0x19c4 0x1513 0x13e1 0x13b2 0x13ad 0x1dde 0x19e7 0x152f 0x13ec 0x13bf 0x13bb 0x1e04 0x1a57 0x155a 0x13f6 0x13c0 0x13b8 0x1e6d 0x1abf 0x1560 0x13eb 0x13b2 0x13a7 0x1edf 0x1b41 0x1573 0x13ee 0x13ae 0x13a5 0x1f66 0x1c0d 0x15ab 0x13fd 0x13b6 0x13ac 0x2034 0x1cdf 0x160e 0x1415 0x13c2 0x13b7 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4>; + }; + }; + }; + }; + }; + + fragment@12 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm1 { + reg = <0x4f>; + label = "pa_therm1"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@13 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x4d 0xffffffff 0x4e 0xffffffff 0x4f 0xffffffff 0x52>; + + pa_therm1 { + reg = <0x4f>; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + }; + }; + }; + + fragment@14 { + target = <0xffffffff>; + + __overlay__ { + compatible = "qcom,ufs-phy-qmp-v3"; + vdda-phy-supply = <0xffffffff>; + vdda-pll-supply = <0xffffffff>; + vdda-phy-max-microamp = <0xf5b4>; + vdda-pll-max-microamp = <0x477c>; + status = "ok"; + }; + }; + + fragment@15 { + target = <0xffffffff>; + + __overlay__ { + vdd-hba-supply = <0xffffffff>; + vdd-hba-fixed-regulator; + vcc-supply = <0xffffffff>; + vcc-voltage-level = <0x2d2a80 0x2d2a80>; + vcc-max-microamp = <0x927c0>; + vccq2-supply = <0xffffffff>; + vccq2-voltage-level = <0x1ab3f0 0x1dc130>; + vccq2-max-microamp = <0x927c0>; + qcom,vddp-ref-clk-supply = <0xffffffff>; + qcom,vddp-ref-clk-max-microamp = <0x64>; + status = "ok"; + }; + }; + + fragment@16 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0x8b290>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <0x1b7740 0x1b7740>; + qcom,vdd-io-current-level = <0x0 0x4f588>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + status = "ok"; + }; + }; + + fragment@17 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0xc3500>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-voltage-level = <0x1b7740 0x2d0370>; + qcom,vdd-io-current-level = <0x0 0x55f0>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + cd-gpios = <0xffffffff 0x45 0x1>; + status = "ok"; + }; + }; + + fragment@18 { + target = <0xffffffff>; + + __overlay__ { + + pa-therm1 { + polling-delay-passive = <0x0>; + polling-delay = <0x0>; + thermal-governor = "user_space"; + thermal-sensors = <0xffffffff 0x4f>; + wake-capable-sensor; + + trips { + + active-config0 { + temperature = <0x1e848>; + hysteresis = <0x3e8>; + type = "passive"; + }; + }; + }; + + quiet-therm-step { + status = "disabled"; + }; + }; + }; + + fragment@19 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@20 { + target = <0xffffffff>; + + __overlay__ { + qcom,battery-data = <0x14>; + qcom,qg-iterm-ma = <0x64>; + qcom,hold-soc-while-full; + qcom,linearize-soc; + qcom,cl-feedback-on; + }; + }; + + fragment@21 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x8 0xffffffff 0x7 0xffffffff 0x9 0xffffffff 0x6 0xffffffff 0x4f 0xffffffff 0x99 0xffffffff 0x83>; + io-channel-names = "usb_in_voltage", "usb_in_current", "chg_temp", "die_temp", "conn_temp", "sbux_res", "vph_voltage"; + qcom,battery-data = <0x14>; + qcom,auto-recharge-soc = <0x62>; + qcom,step-charging-enable; + qcom,sw-jeita-enable; + qcom,fcc-stepping-enable; + qcom,suspend-input-on-debug-batt; + qcom,sec-charger-config = <0x3>; + qcom,thermal-mitigation = <0x401640 0x3567e0 0x2dc6c0 0x2625a0 0x1e8480 0x16e360 0xf4240 0x7a120>; + dpdm-supply = <0xffffffff>; + qcom,charger-temp-max = <0x320>; + qcom,smb-temp-max = <0x320>; + qcom,fcc-step-delay-ms = <0x64>; + qcom,fcc-step-size-ua = <0x186a0>; + qcom,disable-sw-thermal-regulation; + qcom,disable-fcc-restriction; + qcom,smb-internal-pull-kohm = <0x0>; + }; + }; + + fragment@22 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + }; + }; + }; + + fragment@23 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@24 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,i2c-touch-active = "synaptics,tcm-i2c"; + + synaptics_tcm@20 { + compatible = "synaptics,tcm-i2c"; + reg = <0x20>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend", "pmx_ts_release"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + pinctrl-2 = <0xffffffff>; + vdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + synaptics,pwr-reg-name = "avdd"; + synaptics,bus-reg-name = "vdd"; + synaptics,irq-gpio = <0xffffffff 0x9 0x2008>; + synaptics,irq-on-state = <0x0>; + synaptics,reset-gpio = <0xffffffff 0x8 0x0>; + synaptics,reset-on-state = <0x0>; + synaptics,reset-active-ms = <0x14>; + synaptics,reset-delay-ms = <0xc8>; + synaptics,power-delay-ms = <0xc8>; + synaptics,ubl-i2c-addr = <0x20>; + }; + + atmel_mxt_ts@4a { + compatible = "atmel,maxtouch"; + reg = <0x4a>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + avdd-supply = <0xffffffff>; + vdd-supply = <0xffffffff>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + reset-gpios = <0xffffffff 0x8 0x0>; + irq-gpios = <0xffffffff 0x9 0x2008>; + atmel,xy_switch; + atmel,panel-coords = <0x0 0x0 0x1df 0x31f>; + atmel,display-coords = <0x0 0x0 0x153 0x301>; + }; + }; + }; + + fragment@25 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,clk-freq-out = <0xf4240>; + #address-cells = <0x1>; + #size-cells = <0x0>; + + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <0xffffffff 0x25 0x0>; + qcom,nq-ven = <0xffffffff 0xc 0x0>; + qcom,nq-firm = <0xffffffff 0x24 0x0>; + qcom,nq-clkreq = <0xffffffff 0x1f 0x0>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff>; + }; + }; + }; + + fragment@26 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-aux-switch = <0xffffffff>; + }; + }; + + fragment@27 { + target = <0xffffffff>; + + __overlay__ { + + lpi_pinctrl@627C0000 { + compatible = "qcom,lpi-pinctrl"; + reg = <0x627c0000 0x0>; + qcom,num-gpios = <0xf>; + gpio-controller; + #gpio-cells = <0x2>; + qcom,slew-reg = <0x6295a000 0x0>; + qcom,lpi-offset-tbl = <0x0 0x1000 0x2000 0x3000 0x4000 0x5000 0x6000 0x7000 0x8000 0x9000 0xa000 0xb000 0xc000 0xd000 0xe000>; + qcom,lpi-slew-offset-tbl = <0x0 0x2 0x4 0x8 0xa 0xc 0x0 0x0 0x0 0x0 0x10 0x12 0x0 0x0 0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + phandle = <0x32>; + + dmic01_clk_active { + phandle = <0x33>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic01_clk_sleep { + phandle = <0x35>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic01_data_active { + phandle = <0x34>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic01_data_sleep { + phandle = <0x36>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic23_clk_active { + phandle = <0x37>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic23_clk_sleep { + phandle = <0x39>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic23_data_active { + phandle = <0x38>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic23_data_sleep { + phandle = <0x3a>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic45_clk_active { + phandle = <0x3b>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic45_clk_sleep { + phandle = <0x3d>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic45_data_active { + phandle = <0x3c>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic45_data_sleep { + phandle = <0x3e>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + tx_swr_clk_sleep { + phandle = <0x4b>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_clk_active { + phandle = <0x47>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + tx_swr_data0_sleep { + phandle = <0x4c>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data0_active { + phandle = <0x48>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_sleep { + phandle = <0x41>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_active { + phandle = <0x3f>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_data_sleep { + phandle = <0x42>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_data_active { + phandle = <0x40>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data1_sleep { + phandle = <0x4d>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data1_active { + phandle = <0x49>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data2_sleep { + phandle = <0x4e>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data2_active { + phandle = <0x4a>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + rx_swr_clk_sleep { + phandle = <0x45>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_clk_active { + phandle = <0x43>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + rx_swr_data_sleep { + phandle = <0x46>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_data_active { + phandle = <0x44>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + lpi_i2s1_sck_active { + phandle = <0x55>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sck_sleep { + phandle = <0x59>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_ws_active { + phandle = <0x56>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_ws_sleep { + phandle = <0x5a>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd0_active { + phandle = <0x57>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd0_sleep { + phandle = <0x5b>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd1_active { + phandle = <0x58>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd1_sleep { + phandle = <0x5c>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + }; + + fragment@28 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x4>; + + bolero-clk-rsc-mngr { + compatible = "qcom,bolero-clk-rsc-mngr"; + qcom,fs-gen-sequence = <0x3000 0x1 0x3004 0x1 0x3080 0x2>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,va_mclk_mode_muxsel = <0x627a0000>; + clock-names = "tx_core_clk", "tx_npl_clk", "rx_core_clk", "rx_npl_clk", "wsa_core_clk", "wsa_npl_clk", "va_core_clk", "va_npl_clk"; + clocks = <0x15 0x0 0x16 0x0 0x17 0x0 0x18 0x0 0x19 0x0 0x1a 0x0 0x1b 0x0 0x1c 0x0>; + }; + + tx-macro@62620000 { + compatible = "qcom,tx-macro"; + reg = <0x62620000 0x0>; + clock-names = "tx_core_clk", "tx_npl_clk"; + clocks = <0x15 0x0 0x16 0x0>; + qcom,tx-swr-gpios = <0x1d>; + qcom,tx-dmic-sample-rate = <0x249f00>; + phandle = <0xb2>; + + tx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x3>; + swrm-io-base = <0x62630000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x1>; + interrupts = <0x0 0x128 0x0 0x0 0x22b 0x0>; + interrupt-names = "swr_master_irq", "swr_wake_irq"; + qcom,swr-wakeup-required = <0x0>; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x21 0xf 0x2 0x12 0x1 0x2 0x13 0x2 0x3 0x14 0x1 0x3 0x15 0x2 0x4 0x16 0x1 0x4 0x17 0x2 0x4 0x18 0x4 0x4 0x19 0x8 0x5 0x1a 0x1 0x5 0x1b 0x2 0x5 0x1c 0x4 0x5 0x1d 0x8>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + qcom,swr-mstr-irq-wakeup-capable = <0x1>; + phandle = <0xb3>; + + wcd938x-tx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170223>; + phandle = <0x24>; + }; + + wcd937x-tx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170223>; + phandle = <0x28>; + }; + }; + }; + + rx-macro@62600000 { + compatible = "qcom,rx-macro"; + reg = <0x62600000 0x0>; + clock-names = "rx_core_clk", "rx_npl_clk"; + clocks = <0x17 0x0 0x18 0x0>; + qcom,rx-swr-gpios = <0x1e>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,rx-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + phandle = <0xb4>; + + rx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x2>; + swrm-io-base = <0x62610000 0x0>; + interrupts = <0x0 0x129 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x9 0x1 0x1 0xa 0x2 0x2 0xd 0x1 0x3 0xb 0x1 0x3 0xc 0x2 0x4 0xe 0x1 0x5 0xf 0x1 0x5 0x10 0x2>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + phandle = <0xb5>; + + wcd938x-rx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170224>; + phandle = <0x23>; + }; + + wcd937x-rx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170224>; + phandle = <0x27>; + }; + }; + }; + + wsa-macro@62640000 { + compatible = "qcom,wsa-macro"; + reg = <0x62640000 0x0>; + clock-names = "wsa_core_clk", "wsa_npl_clk"; + clocks = <0x19 0x0 0x1a 0x0>; + qcom,wsa-swr-gpios = <0x1f>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,wsa-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + status = "disabled"; + phandle = <0xb6>; + + wsa_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + qcom,swr_master_id = <0x1>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + swrm-io-base = <0x62650000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x0>; + interrupts = <0x0 0x127 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x8>; + qcom,swr-port-mapping = <0x1 0x1 0x1 0x2 0x3 0xf 0x3 0x2 0x3 0x4 0x5 0x1 0x5 0x7 0xf 0x6 0x6 0x3 0x7 0x4 0x3 0x8 0x8 0x3>; + qcom,swr-num-dev = <0x2>; + phandle = <0xb7>; + + wsa881x@20170211 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170211>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2d>; + }; + + wsa881x@20170212 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170212>; + qcom,spkr-sd-n-node = <0x21>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2e>; + }; + + wsa881x@21170213 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170213>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2f>; + }; + + wsa881x@21170214 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170214>; + qcom,spkr-sd-n-node = <0x21>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x30>; + }; + }; + }; + + va-macro@62770000 { + compatible = "qcom,va-macro"; + reg = <0x62770000 0x0>; + clock-names = "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0>; + qcom,va-clk-mux-select = <0x1>; + qcom,va-island-mode-muxsel = <0x627a0000>; + qcom,va-dmic-sample-rate = <0x927c0>; + qcom,default-clk-id = <0x0>; + phandle = <0xb8>; + }; + + wcd938x-codec { + compatible = "qcom,wcd938x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x0 0x13 0x2 0x0 0x13 0x1 0x14 0x1 0x0 0x14 0x1 0x15 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x2 0x18 0x4 0x0 0x18 0x2 0x19 0x8 0x0 0x19 0x3 0x1a 0x1 0x0 0x1a 0x3 0x1b 0x2 0x0 0x1b 0x3 0x1c 0x4 0x0 0x1c 0x3 0x1d 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x22>; + qcom,rx-slave = <0x23>; + qcom,tx-slave = <0x24>; + cdc-vdd-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-rxtx-current = <0x7530>; + cdc-vddio-supply = <0xffffffff>; + qcom,cdc-vddio-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddio-current = <0x7530>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0xaf0>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-micbias4-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-rxtx", "cdc-vddio", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + mbhc-button-thres = <0x25 0xd 0x3f 0x25 0x58 0x8a 0x25 0x8a 0x8a 0x25 0xe1 0xe1 0x25 0x1c2 0x1c2 0x25 0x1c2 0x26c 0x25 0x1c2 0x26c 0x25 0x1c2 0x26c>; + imp-table = <0x26 0x0 0x5 0x6 0x26 0x6 0x17 0x8 0x26 0x18 0x26 0x7 0x26 0x27 0x64 0x6 0x26 0x65 0xa0 0xa 0x26 0xa1 0x190 0xb 0x26 0x191 0x7d0 0xb 0x26 0x7d1 0x7fffffff 0x6>; + phandle = <0x31>; + }; + + wcd937x-codec { + status = "disabled"; + compatible = "qcom,wcd937x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x1 0x13 0x1 0x0 0x14 0x1 0x14 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x3 0x18 0x1 0x0 0x1a 0x3 0x19 0x2 0x0 0x1b 0x3 0x1a 0x4 0x0 0x1c 0x3 0x1b 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x22>; + qcom,rx-slave = <0x27>; + qcom,tx-slave = <0x28>; + cdc-vdd-ldo-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-ldo-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-ldo-rxtx-current = <0x61a8>; + cdc-vddpx-1-supply = <0xffffffff>; + qcom,cdc-vddpx-1-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddpx-1-current = <0x2710>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0x708>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-ldo-rxtx", "cdc-vddpx-1", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + phandle = <0xb9>; + }; + }; + }; + + fragment@29 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,msm-mi2s-master = <0x1 0x1 0x1 0x1 0x1 0x1>; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS4", "MIC BIAS4", "Analog Mic4", "TX DMIC0", "MIC BIAS1", "MIC BIAS1", "Digital Mic0", "TX DMIC1", "MIC BIAS1", "MIC BIAS1", "Digital Mic1", "TX DMIC2", "MIC BIAS3", "MIC BIAS3", "Digital Mic2", "TX DMIC3", "MIC BIAS3", "MIC BIAS3", "Digital Mic3", "TX DMIC4", "MIC BIAS4", "MIC BIAS4", "Digital Mic4", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "IN3_AUX", "AUX_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "TX SWR_DMIC0", "DMIC1_OUTPUT", "TX SWR_DMIC1", "DMIC2_OUTPUT", "TX SWR_DMIC2", "DMIC3_OUTPUT", "TX SWR_DMIC3", "DMIC4_OUTPUT", "TX SWR_DMIC4", "DMIC5_OUTPUT", "TX SWR_DMIC5", "DMIC6_OUTPUT", "TX SWR_DMIC6", "DMIC7_OUTPUT", "TX SWR_DMIC7", "DMIC8_OUTPUT", "WSA SRC0_INP", "SRC0", "WSA_TX DEC0_INP", "TX DEC0 MUX", "WSA_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "SpkrLeft IN", "WSA_SPK1 OUT", "SpkrRight IN", "WSA_SPK2 OUT", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA MIC BIAS1", "Digital Mic0", "VA MIC BIAS1", "Digital Mic1", "VA MIC BIAS3", "Digital Mic2", "VA MIC BIAS3", "Digital Mic3", "VA MIC BIAS4", "Digital Mic4", "VA DMIC0", "VA MIC BIAS1", "VA DMIC1", "VA MIC BIAS1", "VA DMIC2", "VA MIC BIAS3", "VA DMIC3", "VA MIC BIAS3", "VA DMIC4", "VA MIC BIAS4", "VA SWR_ADC0", "VA_SWR_CLK", "VA SWR_ADC1", "VA_SWR_CLK", "VA SWR_ADC2", "VA_SWR_CLK", "VA SWR_ADC3", "VA_SWR_CLK", "VA SWR_MIC0", "VA_SWR_CLK", "VA SWR_MIC1", "VA_SWR_CLK", "VA SWR_MIC2", "VA_SWR_CLK", "VA SWR_MIC3", "VA_SWR_CLK", "VA SWR_MIC4", "VA_SWR_CLK", "VA SWR_MIC5", "VA_SWR_CLK", "VA SWR_MIC6", "VA_SWR_CLK", "VA SWR_MIC7", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT", "VA SWR_MIC0", "DMIC1_OUTPUT", "VA SWR_MIC1", "DMIC2_OUTPUT", "VA SWR_MIC2", "DMIC3_OUTPUT", "VA SWR_MIC3", "DMIC4_OUTPUT", "VA SWR_MIC4", "DMIC5_OUTPUT", "VA SWR_MIC5", "DMIC6_OUTPUT", "VA SWR_MIC6", "DMIC7_OUTPUT", "VA SWR_MIC7", "DMIC8_OUTPUT"; + qcom,msm-mbhc-hphl-swh = <0x1>; + qcom,msm-mbhc-gnd-swh = <0x1>; + qcom,cdc-dmic01-gpios = <0x29>; + qcom,cdc-dmic23-gpios = <0x2a>; + qcom,cdc-dmic45-gpios = <0x2b>; + asoc-codec = <0xffffffff 0xffffffff 0x2c>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec", "msm-ext-disp-audio-codec-rx"; + qcom,wsa-max-devs = <0x2>; + qcom,wsa-devs = <0x2d 0x2e 0x2f 0x30>; + qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight", "SpkrLeft", "SpkrRight"; + qcom,codec-max-aux-devs = <0x1>; + qcom,codec-aux-devs = <0x31>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x32 0xffffffff>; + }; + }; + + fragment@30 { + target = <0xffffffff>; + + __overlay__ { + + cdc_dmic01_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x33 0x34>; + pinctrl-1 = <0x35 0x36>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x29>; + }; + + cdc_dmic23_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x37 0x38>; + pinctrl-1 = <0x39 0x3a>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2a>; + }; + + cdc_dmic45_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3b 0x3c>; + pinctrl-1 = <0x3d 0x3e>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2b>; + }; + + wsa_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3f 0x40>; + pinctrl-1 = <0x41 0x42>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x1f>; + }; + + rx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x43 0x44>; + pinctrl-1 = <0x45 0x46>; + qcom,lpi-gpios; + phandle = <0x1e>; + }; + + tx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x47 0x48 0x49 0x4a>; + pinctrl-1 = <0x4b 0x4c 0x4d 0x4e>; + qcom,lpi-gpios; + qcom,chip-wakeup-reg = <0x1ffb000>; + qcom,chip-wakeup-maskbit = <0x0>; + qcom,chip-wakeup-default-val = <0x1>; + phandle = <0x1d>; + }; + }; + }; + + fragment@31 { + target = <0xffffffff>; + + __overlay__ { + + wsa_spkr_en1_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x20>; + }; + + wsa_spkr_en2_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x21>; + }; + + msm_cdc_pinctrl@58 { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + phandle = <0x22>; + }; + + wsa_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x3>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x309>; + #clock-cells = <0x1>; + phandle = <0x19>; + }; + + wsa_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x4>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30a>; + #clock-cells = <0x1>; + phandle = <0x1a>; + }; + + rx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x5>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30e>; + #clock-cells = <0x1>; + phandle = <0x17>; + }; + + rx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x6>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30f>; + #clock-cells = <0x1>; + phandle = <0x18>; + }; + + tx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x7>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30c>; + #clock-cells = <0x1>; + phandle = <0x15>; + }; + + tx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x8>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30d>; + #clock-cells = <0x1>; + phandle = <0x16>; + }; + + va_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x2>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30b>; + #clock-cells = <0x1>; + phandle = <0x1b>; + }; + + va_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0xa>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x310>; + #clock-cells = <0x1>; + phandle = <0x1c>; + }; + }; + }; + + fragment@32 { + target = <0xffffffff>; + + __overlay__ { + qcom,msm-dai-is-island-supported = <0x1>; + }; + }; + + fragment@33 { + target = <0xffffffff>; + + __overlay__ { + hsuart8 = "/soc/qcom,qup_hsuart@a88000"; + }; + }; + + fragment@34 { + target = <0xffffffff>; + + __overlay__ { + + qcom,qup_hsuart@a88000 { + compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; + reg = <0xa88000 0x4000>; + reg-names = "se_phys"; + clock-names = "se-clk", "m-ahb", "s-ahb"; + clocks = <0xffffffff 0x50 0xffffffff 0x5a 0xffffffff 0x5b>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4f 0x50>; + pinctrl-1 = <0x51 0x52>; + interrupts = <0x0 0x163 0x0>; + qcom,wrapper-core = <0xffffffff>; + always-on-clock; + status = "ok"; + phandle = <0xba>; + }; + }; + }; + + fragment@35 { + target = <0xffffffff>; + + __overlay__ { + + qupv3_se8_2hsuart_pins { + phandle = <0xbb>; + + qupv3_se8_2uart_tx_active { + phandle = <0x4f>; + + mux { + pins = "gpio44"; + function = "qup12"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_rx_active { + phandle = <0x50>; + + mux { + pins = "gpio45"; + function = "qup12"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_tx_sleep { + phandle = <0x51>; + + mux { + pins = "gpio44"; + function = "gpio"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + input-enable; + }; + }; + + qupv3_se8_2uart_rx_sleep { + phandle = <0x52>; + + mux { + pins = "gpio45"; + function = "gpio"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@36 { + target = <0xffffffff>; + + __overlay__ { + + dcc_curr_link@3 { + qcom,curr-link-list = <0x3>; + qcom,data-sink = "sram"; + qcom,link-list = <0x0 0x18000024 0x1 0x0 0x0 0x18000040 0x1 0x0 0x0 0x18010024 0x1 0x0 0x0 0x18010040 0x1 0x0 0x0 0x18020024 0x1 0x0 0x0 0x18020040 0x1 0x0 0x0 0x18030024 0x1 0x0 0x0 0x18030040 0x1 0x0 0x0 0x18040024 0x1 0x0 0x0 0x18040040 0x1 0x0 0x0 0x18050024 0x1 0x0 0x0 0x18050040 0x1 0x0 0x0 0x18060024 0x1 0x0 0x0 0x18060040 0x1 0x0 0x0 0x18070024 0x1 0x0 0x0 0x18070040 0x1 0x0 0x0 0x18080024 0x1 0x0 0x0 0x18080040 0x1 0x0 0x0 0x180800f8 0x1 0x0 0x0 0x18080104 0x1 0x0 0x0 0x1808011c 0x1 0x0 0x0 0x18080128 0x1 0x0 0x0 0x18321700 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18325f00 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x18321818 0x1 0x0 0x0 0x18323818 0x1 0x0 0x0 0x18326018 0x1 0x0 0x0 0x18321920 0x1 0x0 0x0 0x1832102c 0x1 0x0 0x0 0x18321044 0x1 0x0 0x0 0x18321710 0x1 0x0 0x0 0x1832176c 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18323920 0x1 0x0 0x0 0x1832302c 0x1 0x0 0x0 0x18323044 0x1 0x0 0x0 0x18323710 0x1 0x0 0x0 0x1832376c 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18326120 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18325844 0x1 0x0 0x0 0x18325f10 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280000 0x2 0x0 0x0 0x18282000 0x2 0x0 0x0 0x18284000 0x2 0x0 0x0 0x9680000 0x1 0x0 0x0 0x9680004 0x1 0x0 0x2 0x8 0x0 0x0 0x0 0x9681000 0x1 0x0 0x2 0x1 0x0 0x0 0x0 0x9681004 0x1 0x0 0x0 0x9681008 0x1 0x0 0x0 0x968100c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9698500 0x1 0x0 0x0 0x9698504 0x1 0x0 0x0 0x9698508 0x1 0x0 0x0 0x969850c 0x1 0x0 0x0 0x9698510 0x1 0x0 0x0 0x9698514 0x1 0x0 0x0 0x9698518 0x1 0x0 0x0 0x969851c 0x1 0x0 0x0 0x9698700 0x1 0x0 0x0 0x9698704 0x1 0x0 0x0 0x9698708 0x1 0x0 0x0 0x969870c 0x1 0x0 0x0 0x9698714 0x1 0x0 0x0 0x9698718 0x1 0x0 0x0 0x969871c 0x1 0x0 0x0 0x1620204 0x1 0x0 0x0 0x1620240 0x1 0x0 0x0 0x1620248 0x1 0x0 0x0 0x1620288 0x1 0x0 0x0 0x162028c 0x1 0x0 0x0 0x1620290 0x1 0x0 0x0 0x1620294 0x1 0x0 0x0 0x16202a8 0x1 0x0 0x0 0x16202ac 0x1 0x0 0x0 0x16202b0 0x1 0x0 0x0 0x16202b4 0x1 0x0 0x0 0x1620300 0x1 0x0 0x0 0x16e0404 0x1 0x0 0x0 0x16e0408 0x1 0x0 0x0 0x16e0410 0x1 0x0 0x0 0x16e0420 0x1 0x0 0x0 0x16e0424 0x1 0x0 0x0 0x16e0428 0x1 0x0 0x0 0x16e042c 0x1 0x0 0x0 0x16e0430 0x1 0x0 0x0 0x16e0434 0x1 0x0 0x0 0x16e0438 0x1 0x0 0x0 0x16e043c 0x1 0x0 0x0 0x16e0300 0x1 0x0 0x0 0x16e0304 0x1 0x0 0x0 0x16e0700 0x1 0x0 0x0 0x16e0704 0x1 0x0 0x0 0x1700c00 0x1 0x0 0x0 0x1700c08 0x1 0x0 0x0 0x1700c10 0x1 0x0 0x0 0x1700c20 0x1 0x0 0x0 0x1700c24 0x1 0x0 0x0 0x1700c28 0x1 0x0 0x0 0x1700c2c 0x1 0x0 0x0 0x1700c30 0x1 0x0 0x0 0x1700c34 0x1 0x0 0x0 0x1700c38 0x1 0x0 0x0 0x1700c3c 0x1 0x0 0x0 0x1700300 0x1 0x0 0x0 0x1700304 0x1 0x0 0x0 0x1700308 0x1 0x0 0x0 0x170030c 0x1 0x0 0x0 0x1700310 0x1 0x0 0x0 0x1700500 0x1 0x0 0x0 0x1700504 0x1 0x0 0x0 0x1700508 0x1 0x0 0x0 0x170050c 0x1 0x0 0x0 0x1700900 0x1 0x0 0x0 0x1700904 0x1 0x0 0x0 0x1700908 0x1 0x0 0x0 0x1740004 0x1 0x0 0x0 0x1740008 0x1 0x0 0x0 0x1740010 0x1 0x0 0x0 0x1740020 0x1 0x0 0x0 0x1740024 0x1 0x0 0x0 0x1740028 0x1 0x0 0x0 0x174002c 0x1 0x0 0x0 0x1740030 0x1 0x0 0x0 0x1740034 0x1 0x0 0x0 0x1740038 0x1 0x0 0x0 0x174003c 0x1 0x0 0x0 0x1740300 0x1 0x0 0x0 0x1740304 0x1 0x0 0x0 0x1740308 0x1 0x0 0x0 0x174030c 0x1 0x0 0x0 0x1740310 0x1 0x0 0x0 0x1740314 0x1 0x0 0x0 0x9698204 0x1 0x0 0x0 0x9698240 0x1 0x0 0x0 0x9698244 0x1 0x0 0x0 0x9698248 0x1 0x0 0x0 0x969824c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x9681018 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9160204 0x1 0x0 0x0 0x9160240 0x1 0x0 0x0 0x9160248 0x1 0x0 0x0 0x9160288 0x1 0x0 0x0 0x9160290 0x1 0x0 0x0 0x9160300 0x1 0x0 0x0 0x9160304 0x1 0x0 0x0 0x9160308 0x1 0x0 0x0 0x916030c 0x1 0x0 0x0 0x9160310 0x1 0x0 0x0 0x9160314 0x1 0x0 0x0 0x9160318 0x1 0x0 0x0 0x9160008 0x1 0x0 0x0 0x9160010 0x1 0x0 0x0 0x9160020 0x1 0x0 0x0 0x9160024 0x1 0x0 0x0 0x9160028 0x1 0x0 0x0 0x916002c 0x1 0x0 0x0 0x9160030 0x1 0x0 0x0 0x9160034 0x1 0x0 0x0 0x9160038 0x1 0x0 0x0 0x916003c 0x1 0x0 0x0 0x63042680 0x1 0x0 0x0 0x63042684 0x1 0x0 0x0 0x63042688 0x1 0x0 0x0 0x63042690 0x1 0x0 0x0 0x630426a0 0x1 0x0 0x0 0x630426a4 0x1 0x0 0x0 0x630426a8 0x1 0x0 0x0 0x630426ac 0x1 0x0 0x0 0x630426b0 0x1 0x0 0x0 0x630426b4 0x1 0x0 0x0 0x630426b8 0x1 0x0 0x0 0x630426bc 0x1 0x0 0x0 0x63041900 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x1620500 0x4 0x0 0x0 0x1620700 0x4 0x0 0x0 0x1620300 0x1 0x0 0x0 0x1620f00 0x2 0x0 0x0 0x1620b00 0x2 0x0 0x0 0x1700b00 0x2 0x0 0x0 0x1700700 0x3 0x0 0x0 0x9163100 0x1 0x0 0x0 0x96aa100 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x9991500 0x8 0x0 0x0 0x9050008 0x1 0x0 0x0 0x9050078 0x1 0x0 0x0 0x9236028 0x1 0x0 0x0 0x923602c 0x1 0x0 0x0 0x9236030 0x1 0x0 0x0 0x9236034 0x1 0x0 0x0 0x9236038 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x92360b0 0x1 0x0 0x0 0x9236044 0x1 0x0 0x0 0x9236048 0x1 0x0 0x0 0x923604c 0x1 0x0 0x0 0x9236050 0x1 0x0 0x0 0x923e030 0x1 0x0 0x0 0x923e034 0x1 0x0 0x0 0x9241000 0x1 0x0 0x0 0x9248058 0x1 0x0 0x0 0x924805c 0x1 0x0 0x0 0x9248060 0x1 0x0 0x0 0x9248064 0x1 0x0 0x0 0x9260410 0x1 0x0 0x0 0x92e0410 0x1 0x0 0x0 0x9260414 0x1 0x0 0x0 0x92e0414 0x1 0x0 0x0 0x9260418 0x1 0x0 0x0 0x92e0418 0x1 0x0 0x0 0x9260420 0x1 0x0 0x0 0x9260424 0x1 0x0 0x0 0x9260430 0x1 0x0 0x0 0x9260440 0x1 0x0 0x0 0x9260448 0x1 0x0 0x0 0x92604a0 0x1 0x0 0x0 0x92604b0 0x1 0x0 0x0 0x92604d0 0x2 0x0 0x0 0x9261440 0x1 0x0 0x0 0x92e0420 0x1 0x0 0x0 0x92e0424 0x1 0x0 0x0 0x92e0430 0x1 0x0 0x0 0x92e0440 0x1 0x0 0x0 0x92e0448 0x1 0x0 0x0 0x92e04a0 0x1 0x0 0x0 0x92e04b0 0x1 0x0 0x0 0x92e04d0 0x2 0x0 0x0 0x9600000 0x1 0x0 0x0 0x9601000 0x1 0x0 0x0 0x9602000 0x1 0x0 0x0 0x9603000 0x1 0x0 0x0 0x9604000 0x1 0x0 0x0 0x9605000 0x1 0x0 0x0 0x9606000 0x1 0x0 0x0 0x9607000 0x1 0x0 0x0 0x9608000 0x1 0x0 0x0 0x9609000 0x1 0x0 0x0 0x960a000 0x1 0x0 0x0 0x960b000 0x1 0x0 0x0 0x960c000 0x1 0x0 0x0 0x960d000 0x1 0x0 0x0 0x960e000 0x1 0x0 0x0 0x960f000 0x1 0x0 0x0 0x9610000 0x1 0x0 0x0 0x9611000 0x1 0x0 0x0 0x9612000 0x1 0x0 0x0 0x9613000 0x1 0x0 0x0 0x9614000 0x1 0x0 0x0 0x9615000 0x1 0x0 0x0 0x9616000 0x1 0x0 0x0 0x9617000 0x1 0x0 0x0 0x9618000 0x1 0x0 0x0 0x9619000 0x1 0x0 0x0 0x961a000 0x1 0x0 0x0 0x961b000 0x1 0x0 0x0 0x961c000 0x1 0x0 0x0 0x961d000 0x1 0x0 0x0 0x961e000 0x1 0x0 0x0 0x961f000 0x1 0x0 0x0 0x9600004 0x1 0x0 0x0 0x9601004 0x1 0x0 0x0 0x9602004 0x1 0x0 0x0 0x9603004 0x1 0x0 0x0 0x9604004 0x1 0x0 0x0 0x9605004 0x1 0x0 0x0 0x9606004 0x1 0x0 0x0 0x9607004 0x1 0x0 0x0 0x9608004 0x1 0x0 0x0 0x9609004 0x1 0x0 0x0 0x960a004 0x1 0x0 0x0 0x960b004 0x1 0x0 0x0 0x960c004 0x1 0x0 0x0 0x960d004 0x1 0x0 0x0 0x960e004 0x1 0x0 0x0 0x960f004 0x1 0x0 0x0 0x9610004 0x1 0x0 0x0 0x9611004 0x1 0x0 0x0 0x9612004 0x1 0x0 0x0 0x9613004 0x1 0x0 0x0 0x9614004 0x1 0x0 0x0 0x9615004 0x1 0x0 0x0 0x9616004 0x1 0x0 0x0 0x9617004 0x1 0x0 0x0 0x9618004 0x1 0x0 0x0 0x9619004 0x1 0x0 0x0 0x961a004 0x1 0x0 0x0 0x961b004 0x1 0x0 0x0 0x961c004 0x1 0x0 0x0 0x961d004 0x1 0x0 0x0 0x961e004 0x1 0x0 0x0 0x961f004 0x1 0x0 0x0 0x9266418 0x1 0x0 0x0 0x92e6418 0x1 0x0 0x0 0x9265804 0x1 0x0 0x0 0x92e5804 0x1 0x0 0x0 0x92604b8 0x1 0x0 0x0 0x92e04b8 0x1 0x0 0x0 0xc201244 0x1 0x0 0x0 0xc202244 0x1 0x0 0x0 0x18100c18 0x1 0x0 0x0 0x18101c18 0x1 0x0 0x0 0x18300000 0x1 0x0 0x0 0x183a3a84 0x2 0x0 0x0 0x18393a84 0x1 0x0 0x0 0x100000 0x1 0x0 0x0 0x100004 0x1 0x0 0x0 0x100008 0x1 0x0 0x0 0x10000c 0x1 0x0 0x0 0x100010 0x1 0x0 0x0 0x100014 0x1 0x0 0x0 0x100018 0x1 0x0 0x0 0x10001c 0x1 0x0 0x0 0x100020 0x1 0x0 0x0 0x100024 0x1 0x0 0x0 0x100028 0x1 0x0 0x0 0x10002c 0x1 0x0 0x0 0x100030 0x1 0x0 0x0 0x100034 0x1 0x0 0x0 0x100100 0x1 0x0 0x0 0x100104 0x1 0x0 0x0 0x100108 0x1 0x0 0x0 0x10010c 0x1 0x0 0x0 0x101000 0x1 0x0 0x0 0x101004 0x1 0x0 0x0 0x101008 0x1 0x0 0x0 0x10100c 0x1 0x0 0x0 0x101010 0x1 0x0 0x0 0x101014 0x1 0x0 0x0 0x101018 0x1 0x0 0x0 0x10101c 0x1 0x0 0x0 0x101020 0x1 0x0 0x0 0x101024 0x1 0x0 0x0 0x101028 0x1 0x0 0x0 0x10102c 0x1 0x0 0x0 0x101030 0x1 0x0 0x0 0x101034 0x1 0x0 0x0 0x102000 0x1 0x0 0x0 0x102004 0x1 0x0 0x0 0x102008 0x1 0x0 0x0 0x10200c 0x1 0x0 0x0 0x102010 0x1 0x0 0x0 0x102014 0x1 0x0 0x0 0x102018 0x1 0x0 0x0 0x10201c 0x1 0x0 0x0 0x102020 0x1 0x0 0x0 0x102024 0x1 0x0 0x0 0x102028 0x1 0x0 0x0 0x10202c 0x1 0x0 0x0 0x102030 0x1 0x0 0x0 0x102034 0x1 0x0 0x0 0x103000 0x1 0x0 0x0 0x103004 0x1 0x0 0x0 0x103008 0x1 0x0 0x0 0x10300c 0x1 0x0 0x0 0x103010 0x1 0x0 0x0 0x103014 0x1 0x0 0x0 0x103018 0x1 0x0 0x0 0x10301c 0x1 0x0 0x0 0x103020 0x1 0x0 0x0 0x103024 0x1 0x0 0x0 0x103028 0x1 0x0 0x0 0x10302c 0x1 0x0 0x0 0x103030 0x1 0x0 0x0 0x103034 0x1 0x0 0x0 0x113000 0x1 0x0 0x0 0x113004 0x1 0x0 0x0 0x113008 0x1 0x0 0x0 0x11300c 0x1 0x0 0x0 0x113010 0x1 0x0 0x0 0x113014 0x1 0x0 0x0 0x113018 0x1 0x0 0x0 0x11301c 0x1 0x0 0x0 0x113020 0x1 0x0 0x0 0x113024 0x1 0x0 0x0 0x113028 0x1 0x0 0x0 0x11302c 0x1 0x0 0x0 0x113030 0x1 0x0 0x0 0x113034 0x1 0x0 0x0 0x11a000 0x1 0x0 0x0 0x11a004 0x1 0x0 0x0 0x11a008 0x1 0x0 0x0 0x11a00c 0x1 0x0 0x0 0x11a010 0x1 0x0 0x0 0x11a014 0x1 0x0 0x0 0x11a018 0x1 0x0 0x0 0x11a01c 0x1 0x0 0x0 0x11a020 0x1 0x0 0x0 0x11a024 0x1 0x0 0x0 0x11a028 0x1 0x0 0x0 0x11a02c 0x1 0x0 0x0 0x11a030 0x1 0x0 0x0 0x11a034 0x1 0x0 0x0 0x11b000 0x1 0x0 0x0 0x11b004 0x1 0x0 0x0 0x11b008 0x1 0x0 0x0 0x11b00c 0x1 0x0 0x0 0x11b010 0x1 0x0 0x0 0x11b014 0x1 0x0 0x0 0x11b018 0x1 0x0 0x0 0x11b01c 0x1 0x0 0x0 0x11b020 0x1 0x0 0x0 0x11b024 0x1 0x0 0x0 0x11b028 0x1 0x0 0x0 0x11b02c 0x1 0x0 0x0 0x11b030 0x1 0x0 0x0 0x11b034 0x1 0x0 0x0 0x174000 0x1 0x0 0x0 0x174004 0x1 0x0 0x0 0x174008 0x1 0x0 0x0 0x17400c 0x1 0x0 0x0 0x174010 0x1 0x0 0x0 0x174014 0x1 0x0 0x0 0x174018 0x1 0x0 0x0 0x17401c 0x1 0x0 0x0 0x174020 0x1 0x0 0x0 0x174024 0x1 0x0 0x0 0x174028 0x1 0x0 0x0 0x17402c 0x1 0x0 0x0 0x174030 0x1 0x0 0x0 0x174034 0x1 0x0 0x0 0x176000 0x1 0x0 0x0 0x176004 0x1 0x0 0x0 0x176008 0x1 0x0 0x0 0x17600c 0x1 0x0 0x0 0x176010 0x1 0x0 0x0 0x176014 0x1 0x0 0x0 0x176018 0x1 0x0 0x0 0x17601c 0x1 0x0 0x0 0x176020 0x1 0x0 0x0 0x176024 0x1 0x0 0x0 0x176028 0x1 0x0 0x0 0x17602c 0x1 0x0 0x0 0x176030 0x1 0x0 0x0 0x176034 0x1 0x0 0x0 0x10401c 0x1 0x0 0x0 0x183024 0x1 0x0 0x0 0x144168 0x1 0x0 0x0 0x11702c 0x1 0x0 0x0 0x10904c 0x1 0x0 0x0 0x189038 0x1 0x0 0x0 0x1443e8 0x1 0x0 0x0 0x1442b8 0x1 0x0 0x0 0x105060 0x1 0x0 0x0 0x141024 0x1 0x0 0x0 0x145038 0x1 0x0 0x0 0x109004 0x1 0x0 0x0 0x189004 0x1 0x0 0x0 0x190004 0x1 0x0 0x0 0xc2a0000 0x1 0x0 0x0 0xc2a0004 0x1 0x0 0x0 0xc2a0008 0x1 0x0 0x0 0xc2a000c 0x1 0x0 0x0 0xc2a0010 0x1 0x0 0x0 0xc2a0014 0x1 0x0 0x0 0xc2a0018 0x1 0x0 0x0 0xc2a001c 0x1 0x0 0x0 0xc2a0020 0x1 0x0 0x0 0xc2a0024 0x1 0x0 0x0 0xc2a0028 0x1 0x0 0x0 0xc2a002c 0x1 0x0 0x0 0xc2a0030 0x1 0x0 0x0 0xc2a0034 0x1 0x0 0x0 0xc2a1000 0x1 0x0 0x0 0xc2a1004 0x1 0x0 0x0 0xc2a1008 0x1 0x0 0x0 0xc2a100c 0x1 0x0 0x0 0xc2a1010 0x1 0x0 0x0 0xc2a1014 0x1 0x0 0x0 0xc2a1018 0x1 0x0 0x0 0xc2a101c 0x1 0x0 0x0 0xc2a1020 0x1 0x0 0x0 0xc2a1024 0x1 0x0 0x0 0xc2a1028 0x1 0x0 0x0 0xc2a102c 0x1 0x0 0x0 0xc2a1030 0x1 0x0 0x0 0xc2a2260 0x1 0x0 0x0 0xc2a2264 0x1 0x0 0x0 0xc2a3008 0x1 0x0 0x0 0xc2a300c 0x1 0x0 0x0 0xc2a3010 0x1 0x0 0x0 0xc2a3014 0x1 0x0 0x0 0xc2a3024 0x1 0x0 0x0 0xc2a2034 0x1 0x0 0x0 0xc2a214c 0x1 0x0 0x0 0xc2a2150 0x1 0x0 0x0 0xc2a2154 0x1 0x0 0x0 0x28206c 0x1 0x0 0x0 0x18282004 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x1808012c 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280004 0x1 0x0 0x0 0x18284038 0x1 0x0 0x0 0x18284000 0x2 0x0 0x0 0x90c012c 0x1 0x0 0x0 0x9222408 0x1 0x0 0x0 0x9220344 0x2 0x0 0x0 0x9220480 0x1 0x0 0x0 0x922358c 0x1 0x0 0x0 0x9222398 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x923201c 0x5 0x0 0x0 0x9232050 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x9186048 0x1 0x0 0x0 0x9186054 0x1 0x0 0x0 0x9186164 0x1 0x0 0x0 0x9186170 0x1 0x0 0x0 0xc2630a0 0x4 0x0 0x0 0xc2630b0 0x4 0x0 0x0 0xc2630c0 0x4 0x0 0x0 0xc2630d0 0x4 0x0 0x0 0x18200400 0x1 0x0 0x0 0x18200404 0x1 0x0 0x0 0x18200408 0x1 0x0 0x0 0x18200038 0x1 0x0 0x0 0x18200040 0x1 0x0 0x0 0x18200048 0x1 0x0 0x0 0x18220038 0x1 0x0 0x0 0x18220040 0x1 0x0 0x0 0x182200d0 0x1 0x0 0x0 0x18200030 0x1 0x0 0x0 0x18200010 0x1 0x0 0x0 0x1822000c 0x1 0x0 0x0 0x18220d14 0x1 0x0 0x0 0x18220fb4 0x1 0x0 0x0 0x18221254 0x1 0x0 0x0 0x182214f4 0x1 0x0 0x0 0x18221794 0x1 0x0 0x0 0x18221a34 0x1 0x0 0x0 0x18221cd4 0x1 0x0 0x0 0x18221f74 0x1 0x0 0x0 0x18220d18 0x1 0x0 0x0 0x18220fb8 0x1 0x0 0x0 0x18221258 0x1 0x0 0x0 0x182214f8 0x1 0x0 0x0 0x18221798 0x1 0x0 0x0 0x18221a38 0x1 0x0 0x0 0x18221cd8 0x1 0x0 0x0 0x18221f78 0x1 0x0 0x0 0x18220d00 0x1 0x0 0x0 0x18220d04 0x1 0x0 0x0 0x18220d1c 0x1 0x0 0x0 0x18220fbc 0x1 0x0 0x0 0x1822125c 0x1 0x0 0x0 0x182214fc 0x1 0x0 0x0 0x1822179c 0x1 0x0 0x0 0x18221a3c 0x1 0x0 0x0 0x18221cdc 0x1 0x0 0x0 0x18221f7c 0x1 0x0 0x0 0x18221274 0x1 0x0 0x0 0x18221288 0x1 0x0 0x0 0x1822129c 0x1 0x0 0x0 0x182212b0 0x1 0x0 0x0 0x182212c4 0x1 0x0 0x0 0x182212d8 0x1 0x0 0x0 0x182212ec 0x1 0x0 0x0 0x18221300 0x1 0x0 0x0 0x18221314 0x1 0x0 0x0 0x18221328 0x1 0x0 0x0 0x1822133c 0x1 0x0 0x0 0x18221350 0x1 0x0 0x0 0x18221364 0x1 0x0 0x0 0x18221378 0x1 0x0 0x0 0x1822138c 0x1 0x0 0x0 0x182213a0 0x1 0x0 0x0 0x18221514 0x1 0x0 0x0 0x18221528 0x1 0x0 0x0 0x1822153c 0x1 0x0 0x0 0x18221550 0x1 0x0 0x0 0x18221564 0x1 0x0 0x0 0x18221578 0x1 0x0 0x0 0x1822158c 0x1 0x0 0x0 0x182215a0 0x1 0x0 0x0 0x182215b4 0x1 0x0 0x0 0x182215c8 0x1 0x0 0x0 0x182215dc 0x1 0x0 0x0 0x182215f0 0x1 0x0 0x0 0x18221604 0x1 0x0 0x0 0x18221618 0x1 0x0 0x0 0x1822162c 0x1 0x0 0x0 0x18221640 0x1 0x0 0x0 0x182217b4 0x1 0x0 0x0 0x182217c8 0x1 0x0 0x0 0x182217dc 0x1 0x0 0x0 0x182217f0 0x1 0x0 0x0 0x18221804 0x1 0x0 0x0 0x18221818 0x1 0x0 0x0 0x1822182c 0x1 0x0 0x0 0x18221840 0x1 0x0 0x0 0x18221854 0x1 0x0 0x0 0x18221868 0x1 0x0 0x0 0x1822187c 0x1 0x0 0x0 0x18221890 0x1 0x0 0x0 0x182218a4 0x1 0x0 0x0 0x182218b8 0x1 0x0 0x0 0x182218cc 0x1 0x0 0x0 0x182218e0 0x1 0x0 0x0 0x18221a54 0x1 0x0 0x0 0x18221a68 0x1 0x0 0x0 0x18221a7c 0x1 0x0 0x0 0x18221a90 0x1 0x0 0x0 0x18221aa4 0x1 0x0 0x0 0x18221ab8 0x1 0x0 0x0 0x18221acc 0x1 0x0 0x0 0x18221ae0 0x1 0x0 0x0 0x18221af4 0x1 0x0 0x0 0x18221b08 0x1 0x0 0x0 0x18221b1c 0x1 0x0 0x0 0x18221b30 0x1 0x0 0x0 0x18221b44 0x1 0x0 0x0 0x18221b58 0x1 0x0 0x0 0x18221b6c 0x1 0x0 0x0 0x18221b80 0x1 0x0 0x0 0x18221cf4 0x1 0x0 0x0 0x18221d08 0x1 0x0 0x0 0x18221d1c 0x1 0x0 0x0 0x18221d30 0x1 0x0 0x0 0x18221d44 0x1 0x0 0x0 0x18221d58 0x1 0x0 0x0 0x18221d6c 0x1 0x0 0x0 0x18221d80 0x1 0x0 0x0 0x18221d94 0x1 0x0 0x0 0x18221da8 0x1 0x0 0x0 0x18221dbc 0x1 0x0 0x0 0x18221dd0 0x1 0x0 0x0 0x18221de4 0x1 0x0 0x0 0x18221df8 0x1 0x0 0x0 0x18221e0c 0x1 0x0 0x0 0x18221e20 0x1 0x0 0x0 0x18221f94 0x1 0x0 0x0 0x18221fa8 0x1 0x0 0x0 0x18221fbc 0x1 0x0 0x0 0x18221fd0 0x1 0x0 0x0 0x18221fe4 0x1 0x0 0x0 0x18221ff8 0x1 0x0 0x0 0x1822200c 0x1 0x0 0x0 0x18222020 0x1 0x0 0x0 0x18222034 0x1 0x0 0x0 0x18222048 0x1 0x0 0x0 0x1822205c 0x1 0x0 0x0 0x18222070 0x1 0x0 0x0 0x18222084 0x1 0x0 0x0 0x18222098 0x1 0x0 0x0 0x182220ac 0x1 0x0 0x0 0x182220c0 0x1 0x0 0x0 0x18221278 0x1 0x0 0x0 0x1822128c 0x1 0x0 0x0 0x182212a0 0x1 0x0 0x0 0x182212b4 0x1 0x0 0x0 0x182212c8 0x1 0x0 0x0 0x182212dc 0x1 0x0 0x0 0x182212f0 0x1 0x0 0x0 0x18221304 0x1 0x0 0x0 0x18221318 0x1 0x0 0x0 0x1822132c 0x1 0x0 0x0 0x18221340 0x1 0x0 0x0 0x18221354 0x1 0x0 0x0 0x18221368 0x1 0x0 0x0 0x1822137c 0x1 0x0 0x0 0x18221390 0x1 0x0 0x0 0x182213a4 0x1 0x0 0x0 0x18221518 0x1 0x0 0x0 0x1822152c 0x1 0x0 0x0 0x18221540 0x1 0x0 0x0 0x18221554 0x1 0x0 0x0 0x18221568 0x1 0x0 0x0 0x1822157c 0x1 0x0 0x0 0x18221590 0x1 0x0 0x0 0x182215a4 0x1 0x0 0x0 0x182215b8 0x1 0x0 0x0 0x182215cc 0x1 0x0 0x0 0x182215e0 0x1 0x0 0x0 0x182215f4 0x1 0x0 0x0 0x18221608 0x1 0x0 0x0 0x1822161c 0x1 0x0 0x0 0x18221630 0x1 0x0 0x0 0x18221644 0x1 0x0 0x0 0x182217b8 0x1 0x0 0x0 0x182217cc 0x1 0x0 0x0 0x182217e0 0x1 0x0 0x0 0x182217f4 0x1 0x0 0x0 0x18221808 0x1 0x0 0x0 0x1822181c 0x1 0x0 0x0 0x18221830 0x1 0x0 0x0 0x18221844 0x1 0x0 0x0 0x18221858 0x1 0x0 0x0 0x1822186c 0x1 0x0 0x0 0x18221880 0x1 0x0 0x0 0x18221894 0x1 0x0 0x0 0x182218a8 0x1 0x0 0x0 0x182218bc 0x1 0x0 0x0 0x182218d0 0x1 0x0 0x0 0x182218e4 0x1 0x0 0x0 0x18221a58 0x1 0x0 0x0 0x18221a6c 0x1 0x0 0x0 0x18221a80 0x1 0x0 0x0 0x18221a94 0x1 0x0 0x0 0x18221aa8 0x1 0x0 0x0 0x18221abc 0x1 0x0 0x0 0x18221ad0 0x1 0x0 0x0 0x18221ae4 0x1 0x0 0x0 0x18221af8 0x1 0x0 0x0 0x18221b0c 0x1 0x0 0x0 0x18221b20 0x1 0x0 0x0 0x18221b34 0x1 0x0 0x0 0x18221b48 0x1 0x0 0x0 0x18221b5c 0x1 0x0 0x0 0x18221b70 0x1 0x0 0x0 0x18221b84 0x1 0x0 0x0 0x18221cf8 0x1 0x0 0x0 0x18221d0c 0x1 0x0 0x0 0x18221d20 0x1 0x0 0x0 0x18221d34 0x1 0x0 0x0 0x18221d48 0x1 0x0 0x0 0x18221d5c 0x1 0x0 0x0 0x18221d70 0x1 0x0 0x0 0x18221d84 0x1 0x0 0x0 0x18221d98 0x1 0x0 0x0 0x18221dac 0x1 0x0 0x0 0x18221dc0 0x1 0x0 0x0 0x18221dd4 0x1 0x0 0x0 0x18221de8 0x1 0x0 0x0 0x18221dfc 0x1 0x0 0x0 0x18221e10 0x1 0x0 0x0 0x18221e24 0x1 0x0 0x0 0x18221f98 0x1 0x0 0x0 0x18221fac 0x1 0x0 0x0 0x18221fc0 0x1 0x0 0x0 0x18221fd4 0x1 0x0 0x0 0x18221fe8 0x1 0x0 0x0 0x18221ffc 0x1 0x0 0x0 0x18222010 0x1 0x0 0x0 0x18222024 0x1 0x0 0x0 0x18222038 0x1 0x0 0x0 0x1822204c 0x1 0x0 0x0 0x18222060 0x1 0x0 0x0 0x18222074 0x1 0x0 0x0 0x18222088 0x1 0x0 0x0 0x1822209c 0x1 0x0 0x0 0x182220b0 0x1 0x0 0x0 0x182220c4 0x1 0x0 0x0 0x105050 0x1 0x0 0x0 0x171004 0x1 0x0 0x0 0x171154 0x1 0x0 0x0 0x17100c 0x1 0x0 0x0 0x171018 0x1 0x0 0x0 0x5091004 0x1 0x0 0x0 0x509100c 0x1 0x0 0x0 0x5091010 0x1 0x0 0x0 0x5091014 0x1 0x0 0x0 0x5091054 0x1 0x0 0x0 0x5091060 0x1 0x0 0x0 0x509106c 0x1 0x0 0x0 0x5091070 0x1 0x0 0x0 0x5091074 0x1 0x0 0x0 0x5091078 0x1 0x0 0x0 0x509107c 0x1 0x0 0x0 0x509108c 0x1 0x0 0x0 0x5091098 0x1 0x0 0x0 0x509109c 0x1 0x0 0x0 0x1800005c 0x1 0x0 0x0 0x1801005c 0x1 0x0 0x0 0x1802005c 0x1 0x0 0x0 0x1803005c 0x1 0x0 0x0 0x1804005c 0x1 0x0 0x0 0x1805005c 0x1 0x0 0x0 0x1806005c 0x1 0x0 0x0 0x1807005c 0x1 0x0 0x0 0x17c0003c 0x1 0x0 0x1 0x6004fb0 0xc5acce55 0x0 0x1 0x600408c 0xff 0x0 0x1 0x6004fb0 0x0 0x0 0x0 0x62900010 0x1 0x0 0x0 0x62900014 0x1 0x0 0x0 0x62900018 0x1 0x0 0x0 0x62900030 0x1 0x0 0x0 0x62900038 0x1 0x0 0x0 0x62900040 0x1 0x0 0x0 0x62900048 0x1 0x0 0x0 0x629000d0 0x1 0x0 0x0 0x62900210 0x1 0x0 0x0 0x62900230 0x1 0x0 0x0 0x62900250 0x1 0x0 0x0 0x62900270 0x1 0x0 0x0 0x62900290 0x1 0x0 0x0 0x629002b0 0x1 0x0 0x0 0x62900208 0x1 0x0 0x0 0x62900228 0x1 0x0 0x0 0x62900248 0x1 0x0 0x0 0x62900268 0x1 0x0 0x0 0x62900288 0x1 0x0 0x0 0x629002a8 0x1 0x0 0x0 0x6290020c 0x1 0x0 0x0 0x6290022c 0x1 0x0 0x0 0x6290024c 0x1 0x0 0x0 0x6290026c 0x1 0x0 0x0 0x6290028c 0x1 0x0 0x0 0x629002ac 0x1 0x0 0x0 0x62900404 0x1 0x0 0x0 0x62900408 0x1 0x0 0x0 0x62900400 0x1 0x0 0x0 0x62900d04 0x1 0x0 0x0 0x624b0010 0x1 0x0 0x0 0x624b0014 0x1 0x0 0x0 0x624b0018 0x1 0x0 0x0 0x624b0210 0x1 0x0 0x0 0x624b0230 0x1 0x0 0x0 0x624b0250 0x1 0x0 0x0 0x624b0270 0x1 0x0 0x0 0x624b0290 0x1 0x0 0x0 0x624b02b0 0x1 0x0 0x0 0x624b0208 0x1 0x0 0x0 0x624b0228 0x1 0x0 0x0 0x624b0248 0x1 0x0 0x0 0x624b0268 0x1 0x0 0x0 0x624b0288 0x1 0x0 0x0 0x624b02a8 0x1 0x0 0x0 0x624b020c 0x1 0x0 0x0 0x624b022c 0x1 0x0 0x0 0x624b024c 0x1 0x0 0x0 0x624b026c 0x1 0x0 0x0 0x624b028c 0x1 0x0 0x0 0x624b02ac 0x1 0x0 0x0 0x624b0400 0x1 0x0 0x0 0x624b0404 0x1 0x0 0x0 0x624b0408 0x1 0x0 0x0 0x62402028 0x1 0x0 0x0 0xb254520 0x1 0x0 0x0 0xb251020 0x1 0x0 0x0 0xb251024 0x1 0x0 0x0 0xb251030 0x1 0x0 0x0 0xb251200 0x1 0x0 0x0 0xb251214 0x1 0x0 0x0 0xb251228 0x1 0x0 0x0 0xb25123c 0x1 0x0 0x0 0xb251250 0x1 0x0 0x0 0xb251204 0x1 0x0 0x0 0xb251218 0x1 0x0 0x0 0xb25122c 0x1 0x0 0x0 0xb251240 0x1 0x0 0x0 0xb251254 0x1 0x0 0x0 0xb251208 0x1 0x0 0x0 0xb25121c 0x1 0x0 0x0 0xb251230 0x1 0x0 0x0 0xb251244 0x1 0x0 0x0 0xb251258 0x1 0x0 0x0 0xb254510 0x1 0x0 0x0 0xb254514 0x1 0x0 0x0 0xb250010 0x1 0x0 0x0 0xb250014 0x1 0x0 0x0 0xb250900 0x1 0x0 0x0 0xb250904 0x1 0x0 0x0 0x4200010 0x1 0x0 0x0 0x4200014 0x1 0x0 0x0 0x4200018 0x1 0x0 0x0 0x4200030 0x1 0x0 0x0 0x4200038 0x1 0x0 0x0 0x4200040 0x1 0x0 0x0 0x4200048 0x1 0x0 0x0 0x42000d0 0x1 0x0 0x0 0x4200210 0x1 0x0 0x0 0x4200230 0x1 0x0 0x0 0x4200250 0x1 0x0 0x0 0x4200270 0x1 0x0 0x0 0x4200290 0x1 0x0 0x0 0x42002b0 0x1 0x0 0x0 0x4200208 0x1 0x0 0x0 0x4200228 0x1 0x0 0x0 0x4200248 0x1 0x0 0x0 0x4200268 0x1 0x0 0x0 0x4200288 0x1 0x0 0x0 0x42002a8 0x1 0x0 0x0 0x420020c 0x1 0x0 0x0 0x420022c 0x1 0x0 0x0 0x420024c 0x1 0x0 0x0 0x420026c 0x1 0x0 0x0 0x420028c 0x1 0x0 0x0 0x42002ac 0x1 0x0 0x0 0x4200404 0x1 0x0 0x0 0x4200408 0x1 0x0 0x0 0x4200400 0x1 0x0 0x0 0x4200d04 0x1 0x0 0x0 0x4130010 0x1 0x0 0x0 0x4130014 0x1 0x0 0x0 0x4130018 0x1 0x0 0x0 0x4130210 0x1 0x0 0x0 0x4130230 0x1 0x0 0x0 0x4130250 0x1 0x0 0x0 0x4130270 0x1 0x0 0x0 0x4130290 0x1 0x0 0x0 0x41302b0 0x1 0x0 0x0 0x4130208 0x1 0x0 0x0 0x4130228 0x1 0x0 0x0 0x4130248 0x1 0x0 0x0 0x4130268 0x1 0x0 0x0 0x4130288 0x1 0x0 0x0 0x41302a8 0x1 0x0 0x0 0x413020c 0x1 0x0 0x0 0x413022c 0x1 0x0 0x0 0x413024c 0x1 0x0 0x0 0x413026c 0x1 0x0 0x0 0x413028c 0x1 0x0 0x0 0x41302ac 0x1 0x0 0x0 0x4130400 0x1 0x0 0x0 0x4130404 0x1 0x0 0x0 0x4130408 0x1 0x0 0x0 0x4082028 0x1 0x0 0x0 0x18a008 0x1 0x0 0x0 0xb2c4520 0x1 0x0 0x0 0xb2c1020 0x1 0x0 0x0 0xb2c1024 0x1 0x0 0x0 0xb2c1030 0x1 0x0 0x0 0xb2c1200 0x1 0x0 0x0 0xb2c1214 0x1 0x0 0x0 0xb2c1228 0x1 0x0 0x0 0xb2c123c 0x1 0x0 0x0 0xb2c1250 0x1 0x0 0x0 0xb2c1204 0x1 0x0 0x0 0xb2c1218 0x1 0x0 0x0 0xb2c122c 0x1 0x0 0x0 0xb2c1240 0x1 0x0 0x0 0xb2c1254 0x1 0x0 0x0 0xb2c1208 0x1 0x0 0x0 0xb2c121c 0x1 0x0 0x0 0xb2c1230 0x1 0x0 0x0 0xb2c1244 0x1 0x0 0x0 0xb2c1258 0x1 0x0 0x0 0xb2c4510 0x1 0x0 0x0 0xb2c4514 0x1 0x0 0x0 0xb2c0010 0x1 0x0 0x0 0xb2c0014 0x1 0x0 0x0 0xb2c0900 0x1 0x0 0x0 0xb2c0904 0x1 0x0 0x0 0x80a4010 0x1 0x0 0x0 0x80a4014 0x1 0x0 0x0 0x80a4018 0x1 0x0 0x0 0x80a4030 0x1 0x0 0x0 0x80a4038 0x1 0x0 0x0 0x80a4040 0x1 0x0 0x0 0x80a4048 0x1 0x0 0x0 0x80a40d0 0x1 0x0 0x0 0x80a4210 0x1 0x0 0x0 0x80a4230 0x1 0x0 0x0 0x80a4250 0x1 0x0 0x0 0x80a4270 0x1 0x0 0x0 0x80a4290 0x1 0x0 0x0 0x80a42b0 0x1 0x0 0x0 0x80a4208 0x1 0x0 0x0 0x80a4228 0x1 0x0 0x0 0x80a4248 0x1 0x0 0x0 0x80a4268 0x1 0x0 0x0 0x80a4288 0x1 0x0 0x0 0x80a42a8 0x1 0x0 0x0 0x80a420c 0x1 0x0 0x0 0x80a422c 0x1 0x0 0x0 0x80a424c 0x1 0x0 0x0 0x80a426c 0x1 0x0 0x0 0x80a428c 0x1 0x0 0x0 0x80a42ac 0x1 0x0 0x0 0x80a4404 0x1 0x0 0x0 0x80a4408 0x1 0x0 0x0 0x80a4400 0x1 0x0 0x0 0x80a4d04 0x1 0x0 0x0 0x83b0010 0x1 0x0 0x0 0x83b0014 0x1 0x0 0x0 0x83b0018 0x1 0x0 0x0 0x83b0210 0x1 0x0 0x0 0x83b0230 0x1 0x0 0x0 0x83b0250 0x1 0x0 0x0 0x83b0270 0x1 0x0 0x0 0x83b0290 0x1 0x0 0x0 0x83b02b0 0x1 0x0 0x0 0x83b0208 0x1 0x0 0x0 0x83b0228 0x1 0x0 0x0 0x83b0248 0x1 0x0 0x0 0x83b0268 0x1 0x0 0x0 0x83b0288 0x1 0x0 0x0 0x83b02a8 0x1 0x0 0x0 0x83b020c 0x1 0x0 0x0 0x83b022c 0x1 0x0 0x0 0x83b024c 0x1 0x0 0x0 0x83b026c 0x1 0x0 0x0 0x83b028c 0x1 0x0 0x0 0x83b02ac 0x1 0x0 0x0 0x83b0400 0x1 0x0 0x0 0x83b0404 0x1 0x0 0x0 0x83b0408 0x1 0x0 0x0 0x8302028 0x1 0x0 0x0 0xb2b4520 0x1 0x0 0x0 0xb2b1020 0x1 0x0 0x0 0xb2b1024 0x1 0x0 0x0 0xb2b1030 0x1 0x0 0x0 0xb2b1200 0x1 0x0 0x0 0xb2b1214 0x1 0x0 0x0 0xb2b1228 0x1 0x0 0x0 0xb2b123c 0x1 0x0 0x0 0xb2b1250 0x1 0x0 0x0 0xb2b1204 0x1 0x0 0x0 0xb2b1218 0x1 0x0 0x0 0xb2b122c 0x1 0x0 0x0 0xb2b1240 0x1 0x0 0x0 0xb2b1254 0x1 0x0 0x0 0xb2b1208 0x1 0x0 0x0 0xb2b121c 0x1 0x0 0x0 0xb2b1230 0x1 0x0 0x0 0xb2b1244 0x1 0x0 0x0 0xb2b1258 0x1 0x0 0x0 0xb2b4510 0x1 0x0 0x0 0xb2b4514 0x1 0x0 0x0 0xb2b0010 0x1 0x0 0x0 0xb2b0014 0x1 0x0 0x0 0xb2b0900 0x1 0x0 0x0 0xb2b0904 0x1 0x0 0x0 0x17a00204 0x1d 0x0>; + }; + }; + }; + + fragment@37 { + target = <0xffffffff>; + + __overlay__ { + + ss_plog@B4400000 { + compatible = "ss_plog"; + no-map; + reg = <0x0 0xb4400000 0x0 0x200000>; + }; + + ramoops@B4600000 { + compatible = "ramoops"; + reg = <0x0 0xb4600000 0x0 0x100000>; + record-size = <0x40000>; + console-size = <0x40000>; + ftrace-size = <0x40000>; + pmsg-size = <0x40000>; + }; + + sec_debug_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4700000 0x0 0x800000>; + phandle = <0xbc>; + }; + + sec_debug_autocomment@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4f00000 0x0 0x1000>; + phandle = <0xbd>; + }; + + sec_debug_rdx_bootdev@0 { + no-ship; + reg = <0x1 0x0 0x0 0x5900000>; + phandle = <0xbe>; + }; + + kaslr_region@A0001000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xa0001000 0x0 0x1000>; + phandle = <0xbf>; + }; + + rkp_region@B0200000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xb0200000 0x0 0x200000>; + phandle = <0xc0>; + }; + + hdm_region@A1000000 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xa1000000 0x0 0x1000>; + phandle = <0x54>; + }; + + modem_shared_mem_region@B5000000 { + compatible = "modem-removed-dma-pool"; + no-map; + reg = <0x0 0xb5000000 0x0 0x6000000>; + phandle = <0x53>; + }; + }; + }; + + fragment@38 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x80b00000 0x0 0x7100000>; + }; + }; + + fragment@39 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x8b000000 0x0 0x8900000>; + }; + }; + + fragment@40 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x93c00000 0x0 0x3e00000>; + }; + }; + + fragment@41 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97a00000 0x0 0x500000>; + }; + }; + + fragment@42 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97f00000 0x0 0x500000>; + }; + }; + + fragment@43 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98400000 0x0 0x500000>; + }; + }; + + fragment@44 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98900000 0x0 0x1e00000>; + }; + }; + + fragment@45 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9e000000 0x0 0x2000000>; + }; + }; + + fragment@46 { + target = <0xffffffff>; + + __overlay__ { + size = <0x0 0x2000000>; + }; + }; + + fragment@47 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@48 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@49 { + target = <0xffffffff>; + + __overlay__ { + + upload_cause@66c { + compatible = "qcom,msm-imem-upload_cause"; + reg = <0x66c 0x4>; + }; + }; + }; + + fragment@50 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@51 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@52 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@53 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@54 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@55 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@56 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@57 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@58 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@59 { + target = <0xffffffff>; + + __overlay__ { + + dwc3@a600000 { + maximum-speed = "high-speed"; + }; + }; + }; + + fragment@60 { + target = <0xffffffff>; + + __overlay__ { + + input_booster { + status = "okay"; + compatible = "input_booster"; + #address-cells = <0x1>; + #size-cells = <0x0>; + + booster_key@1 { + input_booster,label = "KEY"; + input_booster,type = <0x0>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0xc8>; + input_booster,tail_times = <0x0>; + }; + + booster_key@2 { + input_booster,label = "TOUCHKEY"; + input_booster,type = <0x1>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x0>; + input_booster,tail_times = <0x12c>; + }; + + booster_key@3 { + input_booster,label = "TOUCH"; + input_booster,type = <0x2>; + input_booster,levels = <0x1 0x2 0x3>; + input_booster,cpu_freqs = <0x135600 0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2 0x2>; + input_booster,ddr_freqs = <0x3f9 0x3f9 0x3f9>; + input_booster,lpm_bias = <0x5 0x5 0x5>; + input_booster,head_times = <0xc8 0xc8 0x0>; + input_booster,tail_times = <0x0 0x0 0x12c>; + }; + + booster_key@4 { + input_booster,label = "MULTITOUCH"; + input_booster,type = <0x3>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x3e8 0x0>; + input_booster,tail_times = <0x0 0x1f4>; + }; + + booster_key@5 { + input_booster,label = "KEYBOARD"; + input_booster,type = <0x4>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x135600>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x82 0x82>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@6 { + input_booster,label = "MOUSE"; + input_booster,type = <0x5>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@7 { + input_booster,label = "MOUSE WHEEL"; + input_booster,type = <0x6>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@8 { + input_booster,label = "PEN HOVER"; + input_booster,type = <0x7>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@9 { + input_booster,label = "PEN"; + input_booster,type = <0x8>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x17bb00 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x258>; + }; + + booster_key@10 { + input_booster,label = "KEY_TWO"; + input_booster,type = <0x9>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x17bb00>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x2bc>; + input_booster,tail_times = <0x2bc>; + }; + }; + + sec_smem@0 { + compatible = "samsung,sec-smem"; + status = "okay"; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_4 { + compatible = "qcom,memshare-peripheral"; + memory-region = <0x53>; + qcom,peripheral-size = <0x2000000>; + qcom,reserved-size = <0x4000000>; + qcom,client-id = <0x3>; + qcom,allocate-boot-time; + label = "modem"; + }; + }; + + samsung,sec_misc { + qfprom_jtag,reg = <0x780180>; + }; + + usb-notifier { + compatible = "samsung,usb-notifier"; + qcom,disable_control_en = <0x1>; + qcom,unsupport_host_en = <0x0>; + phandle = <0xc1>; + }; + + samsung,sec_hdm { + memory-region = <0x54>; + }; + + argos { + compatible = "samsung,argos"; + #address-cells = <0x1>; + + boot_device@1 { + net_boost,label = "WIFI"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@2 { + net_boost,label = "WIFI TX"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0xc8 0x21b100 0x0 0x1b8a00 0x0 0x0 0x0 0x1 0x1 0x1>; + }; + + boot_device@3 { + net_boost,label = "WIFI RX"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@4 { + net_boost,label = "SWLAN"; + net_boost,node = "swlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@5 { + net_boost,label = "P2P"; + net_boost,node = "p2p-wlan0-0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@6 { + net_boost,label = "IPA"; + net_boost,node = "rmnet_ipa0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + }; + }; + }; + + fragment@61 { + target = <0xffffffff>; + + __overlay__ { + + android { + + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_system,recovery,dtbo,abl,xbl,tz,hyp"; + }; + }; + }; + }; + + fragment@62 { + target = <0xffffffff>; + + __overlay__ { + qcom,smem-states = <0xffffffff 0x0 0xffffffff 0x4 0xffffffff 0x5>; + qcom,smem-state-names = "qcom,force-stop", "qcom,stop-reason-0", "qcom,stop-reason-1"; + }; + }; + + fragment@63 { + target = <0xffffffff>; + + __overlay__ { + spm-level = <0x3>; + }; + }; + + fragment@64 { + target = <0xffffffff>; + + __overlay__ { + i2c18 = "/soc/i2c@18"; + }; + }; + + fragment@65 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x3>; + + imp_list { + #list-imp-cells = <0x3>; + phandle = <0x26>; + }; + }; + }; + + fragment@66 { + target = <0xffffffff>; + + __overlay__ { + + msm_cdc_pinctrl_quin { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x55 0x56 0x57 0x58>; + pinctrl-1 = <0x59 0x5a 0x5b 0x5c>; + qcom,lpi-gpios; + phandle = <0x60>; + }; + }; + }; + + fragment@67 { + target = <0xffffffff>; + + __overlay__ { + + sec-audio-sysfs { + compatible = "samsung,audio-sysfs"; + status = "okay"; + audio,num-amp = <0x2>; + }; + + samsung,q6audio-adaptation { + compatible = "samsung,q6audio-adaptation"; + adaptation,device-tx-port-id = <0xb037>; + adaptation,spk-rx-port-id = <0x1016>; + adaptation,usb-rx-port-id = <0x7000>; + adaptation,bt-rx-port-id = <0x400e>; + adaptation,headset-rx-port-id = <0xb030>; + phandle = <0x5f>; + }; + + det_zones { + #list-det-cells = <0x2>; + phandle = <0x25>; + }; + + i2c@18 { + status = "ok"; + cell-index = <0x12>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x58 0x0 0xffffffff 0x59 0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x5d 0x5e>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xc2>; + + tas256x@4c { + #sound-dai-cells = <0x0>; + compatible = "ti, tas256x"; + status = "ok"; + reg = <0x4c>; + ti,reset-gpio = <0xffffffff 0x5e 0x0>; + ti,irq-gpio = <0xffffffff 0x5a 0x0>; + ti,left-channel = <0x4d>; + ti,right-channel = <0x4c>; + ti,channels = <0x2>; + ti,iv-width = <0x8>; + ti,vbat-mon = <0x1>; + ti,port_id = <0x1016>; + phandle = <0xc3>; + }; + }; + }; + }; + + fragment@68 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,wcn-btfm = <0x1>; + qcom,ext-disp-audio-rx = <0x0>; + qcom,mi2s-audio-intf = <0x1>; + asoc-platform = <0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0x5f>; + asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-pcm-dsp.2", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-compress-dsp", "msm-pcm-hostless", "msm-pcm-afe", "msm-lsm-client", "msm-pcm-routing", "msm-compr-dsp", "msm-pcm-dsp-noirq", "q6audio-adaptation"; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS3", "MIC BIAS3", "Analog Mic4", "AMIC5", "MIC BIAS4", "MIC BIAS4", "Analog Mic5", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT"; + qcom,msm-mbhc-hs-mic-max-threshold-mv = <0x270f>; + qcom,msm-mbhc-hs-mic-min-threshold-mv = <0x280>; + qcom,cdc-dmic01-gpios; + qcom,cdc-dmic23-gpios; + qcom,cdc-dmic45-gpios; + qcom,quin-mi2s-gpios = <0x60>; + asoc-codec = <0xffffffff 0xffffffff>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec"; + qcom,wsa-max-devs = <0x0>; + qcom,wsa-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x32 0xffffffff>; + fsa4480-i2c-handle; + qcom,fm-lna-gpios = <0xffffffff 0x54 0x0>; + qcom,msm-mbhc-gnd-det = <0x1>; + }; + }; + + fragment@69 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@70 { + target = <0xffffffff>; + + __overlay__ { + + tas25xx_gpio_default { + phandle = <0x5d>; + + mux { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + function = "gpio"; + }; + + config { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + bias-disable; + }; + }; + + fm_lna_default { + phandle = <0x5e>; + + mux { + pins = "gpio84"; + function = "gpio"; + }; + + config { + pins = "gpio84"; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@71 { + target = <0xffffffff>; + + __overlay__ { + + grip_i2c { + + grip_i2c_active { + phandle = <0xa9>; + + grip_i2c_active { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + + grip_i2c_suspend { + phandle = <0xc4>; + + grip_i2c_suspend { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + }; + + s2mpb03_i2c_sda_default { + phandle = <0x61>; + + mux { + pins = "gpio25"; + function = "gpio"; + }; + + config { + pins = "gpio25"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + s2mpb03_i2c_scl_default { + phandle = <0x62>; + + mux { + pins = "gpio26"; + function = "gpio"; + }; + + config { + pins = "gpio26"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + cam_sensor_mclk0_active { + phandle = <0x7d>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk0_suspend { + phandle = <0x80>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk1_active { + phandle = <0x96>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk1_suspend { + phandle = <0x98>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk2_active { + phandle = <0x8d>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk2_suspend { + phandle = <0x90>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk3_active { + phandle = <0x84>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk3_suspend { + phandle = <0x88>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk4_active { + phandle = <0x9c>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk4_suspend { + phandle = <0x9f>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + rcam1_sensor_reset_active { + phandle = <0x7e>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_reset_suspend { + phandle = <0x81>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_active { + phandle = <0x97>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_suspend { + phandle = <0x99>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_active { + phandle = <0x85>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_suspend { + phandle = <0x89>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_active { + phandle = <0x8e>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_suspend { + phandle = <0x91>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_active { + phandle = <0x9d>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_suspend { + phandle = <0xa0>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_active { + phandle = <0x6f>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_suspend { + phandle = <0x70>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_active { + phandle = <0x8f>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_suspend { + phandle = <0x92>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_active { + phandle = <0x86>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_suspend { + phandle = <0x8a>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_active { + phandle = <0x9e>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_suspend { + phandle = <0xa1>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_active { + phandle = <0x87>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-disable; + output-high; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_suspend { + phandle = <0x8b>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vdig_active { + phandle = <0xc5>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vdig_suspend { + phandle = <0xc6>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_active { + phandle = <0xc7>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_suspend { + phandle = <0xc8>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + if_pmic_i2c_pins { + phandle = <0xc9>; + + if_pmic_i2c_sleep { + phandle = <0x68>; + + mux { + pins = "gpio115", "gpio116"; + function = "gpio"; + }; + + config { + pins = "gpio115", "gpio116"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + usbpd_i2c_pins { + phandle = <0xca>; + + usbpd_i2c_sleep { + phandle = <0x6a>; + + mux { + pins = "gpio53", "gpio54"; + function = "gpio"; + }; + + config { + pins = "gpio53", "gpio54"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + mcu_reset_active { + phandle = <0x72>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_reset_suspend { + phandle = <0x74>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + mcu_clk_active { + phandle = <0x73>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_clk_suspend { + phandle = <0x75>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + torch_en_active { + phandle = <0x7f>; + + mux { + pins = "gpio67", "gpio22"; + function = "gpio"; + }; + + config { + pins = "gpio67", "gpio22"; + bias-pull-down; + output-high; + drive-strength = <0x2>; + }; + }; + + torch_en_suspend { + phandle = <0x82>; + + mux { + pins = "gpio67", "gpio22"; + function = "gpio"; + }; + + config { + pins = "gpio67", "gpio22"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + }; + }; + + fragment@72 { + target = <0xffffffff>; + + __overlay__ { + + grip_int_active { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xaa>; + }; + + grip_int_suspend { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xcb>; + }; + }; + }; + + fragment@73 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x48 0x4a 0x4e 0x54 0x56 0x57 0x5b 0x5d 0x5f 0x62 0x6d 0x72 0x73 0x74 0x75 0x76>; + }; + }; + + fragment@74 { + target = <0xffffffff>; + + __overlay__ { + + qcom,pm6150@0 { + + qcom,power-on@800 { + interrupts = <0x0 0x8 0x0 0x0 0x0 0x8 0x1 0x0 0x0 0x8 0x4 0x0 0x0 0x8 0x5 0x0>; + interrupt-names = "kpdpwr", "resin", "resin-bark", "kpdpwr-resin-bark"; + qcom,s3-debounce = <0x80>; + + qcom,pon_1 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_2 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_3 { + qcom,pon-type = <0x3>; + qcom,support-reset = <0x1>; + qcom,pull-up = <0x1>; + qcom,s1-timer = <0x1a40>; + qcom,s2-timer = <0x3e8>; + qcom,s2-type = <0x8>; + qcom,use-bark; + }; + }; + }; + }; + }; + + fragment@75 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@76 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@77 { + target = <0xffffffff>; + + __overlay__ { + + sec_thermistor@0 { + compatible = "samsung,sec-ap-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "ap_therm"; + adc_array = <0x6a4 0x88e 0xa10 0xbe6 0xdff 0x1090 0x1381 0x16f4 0x1b1c 0x1fb9 0x247b 0x2a3c 0x309d 0x3706 0x3d9d 0x43e8 0x4aa6 0x50c4 0x564a 0x5b4e 0x5faf 0x6379 0x66aa>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@1 { + compatible = "samsung,sec-pa-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "pa_therm"; + adc_array = <0x708 0x8bf 0xa47 0xc19 0xe38 0x10c2 0x13c0 0x173d 0x1b5e 0x1fff 0x24cf 0x2a88 0x30de 0x3756 0x3dea 0x443d 0x4add 0x5100 0x5683 0x5b96 0x5fef 0x63ab 0x66d8>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@2 { + compatible = "samsung,sec-wf-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4f>; + io-channel-names = "wf_therm"; + adc_array = <0x708 0x8d5 0xa66 0xc35 0xe55 0x10d4 0x13e0 0x1766 0x1b81 0x2021 0x24f3 0x2aa3 0x30f4 0x376c 0x3e09 0x445e 0x4aec 0x5105 0x568c 0x5ba3 0x5ff9 0x63b4 0x66e0>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + i2c@2 { + cell-index = <0x2>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x19 0x0 0xffffffff 0x1a 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x61 0x62>; + phandle = <0xcc>; + + s2mpb03@56 { + compatible = "samsung,s2mpb03pmic"; + reg = <0x56>; + additional_reg_init; + + regulators { + + s2mpb03-ldo1 { + regulator-name = "s2mpb03-ldo1"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x100590>; + phandle = <0x95>; + }; + + s2mpb03-ldo2 { + regulator-name = "s2mpb03-ldo2"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x7c>; + }; + + s2mpb03-ldo3 { + regulator-name = "s2mpb03-ldo3"; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x7a>; + }; + + s2mpb03-ldo4 { + regulator-name = "s2mpb03-ldo4"; + regulator-min-microvolt = <0x124f80>; + regulator-max-microvolt = <0x124f80>; + phandle = <0x8c>; + }; + + s2mpb03-ldo5 { + regulator-name = "s2mpb03-ldo5"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x7b>; + }; + + s2mpb03-ldo6 { + regulator-name = "s2mpb03-ldo6"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x94>; + }; + + s2mpb03-ldo7 { + regulator-name = "s2mpb03-ldo7"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2ab980>; + phandle = <0x71>; + }; + }; + }; + }; + }; + }; + + fragment@78 { + target = <0xffffffff>; + + __overlay__ { + interrupts = <0x0 0xc0 0x0 0x0 0x0 0xc1 0x0 0x0 0x0 0xc2 0x0 0x0 0x0 0xc3 0x0 0x0 0x0 0xc4 0x0 0x0 0x0 0xc6 0x0 0x0 0x0 0xc7 0x0 0x0 0x0 0xc9 0x0 0x0>; + interrupt-names = "pm6150_gpio1", "pm6150_gpio2", "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio5", "pm6150_gpio7", "pm6150_gpio8", "pm6150_gpio10"; + qcom,gpios-disallowed = <0x6 0x9>; + }; + }; + + fragment@79 { + target = <0xffffffff>; + + __overlay__ { + + ap_therm { + reg = <0x4e>; + label = "ap_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@80 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm { + reg = <0x4e>; + label = "pa_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + + wf_therm { + reg = <0x4f>; + label = "wf_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@81 { + target = <0xffffffff>; + + __overlay__ { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x2dc6c0>; + regulator-boot-on; + }; + }; + + fragment@82 { + target = <0xffffffff>; + + __overlay__ { + + tsp_int { + phandle = <0x65>; + + mux { + pins = "gpio9"; + function = "gpio"; + }; + + config { + pins = "gpio9"; + input-enable; + bias-disable; + }; + }; + + qupv3_se7_i2c_pins_tsp { + phandle = <0xcd>; + + qupv3_se7_i2c_active_tsp { + phandle = <0x63>; + + mux { + pins = "gpio6", "gpio7"; + function = "qup11"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + qupv3_se7_i2c_sleep_tsp { + phandle = <0x64>; + + mux { + pins = "gpio6", "gpio7"; + function = "gpio"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <0x2>; + bias-disable; + }; + }; + }; + }; + }; + + fragment@83 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x63>; + pinctrl-1 = <0x64>; + + synaptics_tcm@20 { + status = "disabled"; + }; + + atmel_mxt_ts@4a { + status = "disabled"; + }; + + touchscreen@20 { + status = "okay"; + compatible = "zinitix,zt_ts_device"; + reg = <0x20>; + pinctrl-names = "on_state", "off_state"; + pinctrl-0 = <0x65>; + pinctrl-1 = <0x65>; + avdd-supply = <0xffffffff>; + zinitix,gpio_ldo_en; + zinitix,irq_type = <0x2008>; + zinitix,x_resolution = <0x438>; + zinitix,y_resolution = <0x960>; + zinitix,page_size = <0x80>; + zinitix,irq_gpio = <0xffffffff 0x9 0x2008>; + zinitix,chip_name = "ZT7650"; + zinitix,firmware_name = "tsp_zinitix/zt7650_a52.bin"; + zinitix,spay; + zinitix,aod; + zinitix,aot; + zinitix,mis_cal_check; + support_ear_detect_mode; + support_dex_mode; + zinitix,bringup = <0x1>; + zinitix,ss_touch_num = <0x1>; + phandle = <0xce>; + }; + + touchscreen@49 { + status = "disabled"; + compatible = "stm,fts_touch"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x65>; + dvdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + stm,irq_gpio = <0xffffffff 0x9 0x2008>; + stm,max_coords = <0xfff 0xfff>; + stm,firmware_name = "tsp_stm/fts5cu56a_a52.bin"; + stm,tclm_level = <0x2>; + stm,afe_base = <0x14>; + stm,bringup = <0x0>; + stm,support_fod; + stm,enable_settings_aot; + support_ear_detect; + support_mis_calibration_test; + support_dex_mode; + support_open_short_test; + support_sram_test; + stm,ss_touch_num = <0x1>; + phandle = <0xcf>; + }; + }; + }; + + fragment@84 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + + key_vol_up_default { + pins = "gpio8"; + function = "normal"; + input-enable; + bias-pull-up; + power-source = <0x0>; + phandle = <0x66>; + }; + }; + }; + }; + + fragment@85 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "default"; + pinctrl-0 = <0x66>; + + vol_up { + label = "volume_up"; + gpios = <0xffffffff 0x8 0x1>; + linux,input-type = <0x1>; + linux,code = <0x73>; + debounce-interval = <0xf>; + }; + }; + }; + + fragment@86 { + target = <0xffffffff>; + + __overlay__ { + + ss_touch { + compatible = "samsung,ss_touch"; + ss_touch,numbers = <0x1>; + }; + }; + }; + + fragment@87 { + target = <0xffffffff>; + + __overlay__ { + + self_display_FC3_dtsi { + label = "self_display_FC3_dtsi"; + samsung,support_self_display; + samsung,self_mask_setting_pre_revA = [29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 02 75 10]; + samsung,self_mask_setting_post_revA = [29 01 00 00 00 00 02 75 00]; + samsung,self_mask_on_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 00 00 00 95 07 9e 09 5f 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_on_factory_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_off_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_disp_debug_rx_cmds_revA = [06 01 00 00 00 00 01 7f 04 01]; + samsung,self_mask_check_tx_pre1_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 04 b0 00 27 d8 29 01 00 00 00 00 02 d8 16 29 01 00 00 00 00 0a bf 01 07 00 00 00 10 00 00 00 29 01 00 00 11 00 02 7a 00 29 01 00 00 00 00 02 75 10 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,self_mask_check_tx_pre2_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 02 75 00 29 01 00 00 22 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 01 f4 02 33 09 60 09 61 00 00 ff ff ff 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,mask_crc_pass_data = [d3 9b]; + samsung,self_mask_check_rx_cmds_revA = [06 01 00 00 00 00 01 14 02 00]; + samsung,self_mask_check_tx_post_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 00 00 00 00 00 29 01 00 00 00 00 02 bf 00 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + phandle = <0x67>; + }; + }; + }; + + fragment@88 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + label = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0x1e6>; + qcom,mdss-brightness-max-level = <0x1e6>; + qcom,mdss-brightness-default-level = <0xff>; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-t-clk-pre = <0x3e>; + qcom,mdss-dsi-t-clk-post = <0x10>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x43>; + qcom,mdss-pan-physical-height-dimension = <0x96>; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-t-clk-pre-extend; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "irq_check"; + samsung,panel-vendor = "SDC"; + samsung,disp-model = "AMS646YD01"; + samsung,support_gamma_mode2; + samsung,skip_read_on_pre; + samsung,elvss_interpolation_temperature = <0xfffffff0>; + samsung,support_lpm; + samsung,support_gpara; + samsung,pointing_gpara; + samsung,two_byte_gpara; + samsung,rsc_4_frame_idle; + samsung,support_factory_panel_swap; + samsung,support-optical-fingerprint; + samsung,delayed-display-on = <0x1>; + samsung,support_vrr_based_bl; + samsung,esd-irq-trigger1 = "falling"; + ss,self_display = <0x67>; + samsung,level0_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 9f a5 a5]; + samsung,level0_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 9f 5a 5a]; + samsung,level1_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 5a 5a]; + samsung,level1_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 a5 a5]; + samsung,level2_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 fc 5a 5a]; + samsung,level2_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 fc a5 a5]; + samsung,brightness_tx_cmds_revA = <0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100>; + samsung,display_on_tx_cmds_revA = [29 00 00 00 00 00 03 9f a5 a5 05 00 00 00 00 00 02 29 00 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,display_off_tx_cmds_revA = [05 01 00 00 00 00 02 28 00]; + samsung,reg_read_pos_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 00 00]; + samsung,mtp_write_sysfs_tx_cmds_revA = <0x29000000 0x3d00 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + samsung,panel_ltps_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 50 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,smooth_dimming_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 91 63 29 00 00 00 00 00 02 63 20 29 01 00 00 11 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,gamma_mode2_normal_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26360 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x7290000 0x2 0x53202900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0002900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revE = <0x29000000 0x391 0x2012900 0x0 0x2532029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 1c 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,gamma_mode2_hbm_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26320 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x290000 0x2 0x53e02900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0072900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revE = <0x29000000 0x391 0x2002900 0x0 0x253e029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 14 29 00 00 00 00 00 02 53 e0 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,vrr_tx_cmds_revD = [29 00 00 00 00 00 03 60 00 04 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 b4 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a c0 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 02 29 00 00 00 00 00 02 f7 0f]; + samsung,vrr_tx_cmds_revA = [29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f]; + samsung,acl_on_tx_cmds_revA = [29 00 00 00 00 00 04 b0 03 b3 65 29 00 00 00 00 00 14 65 55 00 b0 51 66 98 15 55 55 55 08 f1 c6 48 40 00 20 10 09 29 00 00 00 00 00 02 55 03]; + samsung,acl_off_tx_cmds_revA = [29 01 00 00 00 00 02 55 00]; + samsung,manufacture_id0_rx_cmds_revA = [06 01 00 00 00 00 01 da 01 00 00]; + samsung,manufacture_id1_rx_cmds_revA = [06 01 00 00 00 00 01 db 01 00 00]; + samsung,manufacture_id2_rx_cmds_revA = [06 01 00 00 00 00 01 dc 01 00 00]; + samsung,module_info_rx_cmds_revA = [06 01 00 00 00 00 01 a1 0b 00 00]; + samsung,octa_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 04 00 0b]; + samsung,cell_id_rx_cmds_revA = [06 01 00 00 00 00 01 92 10 00 02]; + samsung,ddi_id_rx_cmds_revA = [06 01 00 00 00 00 01 d6 05 00 00]; + samsung,mtp_read_sysfs_rx_cmds_revA = [06 01 00 00 00 00 01 00 00 00 00]; + samsung,candela_map_table_revA = <0x0 0x0 0x0 0x2 0x2 0x1 0x1 0x1 0x3 0x2 0x2 0x2 0x2 0x4 0x3 0x3 0x3 0x3 0x5 0x3 0x4 0x4 0x4 0x7 0x4 0x5 0x5 0x5 0x8 0x5 0x6 0x6 0x6 0xa 0x5 0x7 0x7 0x7 0xc 0x6 0x8 0x8 0x8 0xd 0x7 0x9 0x9 0x9 0xf 0x7 0xa 0xa 0xa 0x11 0x8 0xb 0xb 0xb 0x13 0x9 0xc 0xc 0xc 0x15 0xa 0xd 0xd 0xd 0x18 0xb 0xe 0xe 0xe 0x1a 0xc 0xf 0xf 0xf 0x1c 0xd 0x10 0x10 0x10 0x1e 0xd 0x11 0x11 0x11 0x20 0xe 0x12 0x12 0x12 0x23 0xf 0x13 0x13 0x13 0x25 0x10 0x14 0x14 0x14 0x28 0x11 0x15 0x15 0x15 0x2a 0x12 0x16 0x16 0x16 0x2d 0x13 0x17 0x17 0x17 0x2f 0x14 0x18 0x18 0x18 0x32 0x15 0x19 0x19 0x19 0x34 0x16 0x1a 0x1a 0x1a 0x37 0x17 0x1b 0x1b 0x1b 0x3a 0x19 0x1c 0x1c 0x1c 0x3c 0x1a 0x1d 0x1d 0x1d 0x3f 0x1b 0x1e 0x1e 0x1e 0x42 0x1c 0x1f 0x1f 0x1f 0x45 0x1d 0x20 0x20 0x20 0x47 0x1e 0x21 0x21 0x21 0x4a 0x1f 0x22 0x22 0x22 0x4d 0x20 0x23 0x23 0x23 0x50 0x22 0x24 0x24 0x24 0x53 0x23 0x25 0x25 0x25 0x56 0x24 0x26 0x26 0x26 0x59 0x25 0x27 0x27 0x27 0x5c 0x26 0x28 0x28 0x28 0x5f 0x28 0x29 0x29 0x29 0x62 0x29 0x2a 0x2a 0x2a 0x65 0x2a 0x2b 0x2b 0x2b 0x68 0x2b 0x2c 0x2c 0x2c 0x6b 0x2d 0x2d 0x2d 0x2d 0x6e 0x2e 0x2e 0x2e 0x2e 0x71 0x2f 0x2f 0x2f 0x2f 0x74 0x30 0x30 0x30 0x30 0x77 0x32 0x31 0x31 0x31 0x7b 0x33 0x32 0x32 0x32 0x7e 0x34 0x33 0x33 0x33 0x81 0x36 0x34 0x34 0x34 0x84 0x37 0x35 0x35 0x35 0x88 0x38 0x36 0x36 0x36 0x8b 0x3a 0x37 0x37 0x37 0x8e 0x3b 0x38 0x38 0x38 0x92 0x3c 0x39 0x39 0x39 0x95 0x3e 0x3a 0x3a 0x3a 0x98 0x3f 0x3b 0x3b 0x3b 0x9c 0x40 0x3c 0x3c 0x3c 0x9f 0x42 0x3d 0x3d 0x3d 0xa2 0x43 0x3e 0x3e 0x3e 0xa6 0x44 0x3f 0x3f 0x3f 0xa9 0x46 0x40 0x40 0x40 0xad 0x47 0x41 0x41 0x41 0xb0 0x49 0x42 0x42 0x42 0xb4 0x4a 0x43 0x43 0x43 0xb7 0x4c 0x44 0x44 0x44 0xbb 0x4d 0x45 0x45 0x45 0xbe 0x4e 0x46 0x46 0x46 0xc2 0x50 0x47 0x47 0x47 0xc5 0x51 0x48 0x48 0x48 0xc9 0x53 0x49 0x49 0x49 0xcd 0x54 0x4a 0x4a 0x4a 0xd0 0x56 0x4b 0x4b 0x4b 0xd4 0x57 0x4c 0x4c 0x4c 0xd7 0x59 0x4d 0x4d 0x4d 0xdb 0x5a 0x4e 0x4e 0x4e 0xdf 0x5c 0x4f 0x4f 0x4f 0xe3 0x5d 0x50 0x50 0x50 0xe6 0x5f 0x51 0x51 0x51 0xea 0x60 0x52 0x52 0x52 0xee 0x62 0x53 0x53 0x53 0xf1 0x63 0x54 0x54 0x54 0xf5 0x65 0x55 0x55 0x55 0xf9 0x66 0x56 0x56 0x56 0xfd 0x68 0x57 0x57 0x57 0x101 0x69 0x58 0x58 0x58 0x104 0x6b 0x59 0x59 0x59 0x108 0x6c 0x5a 0x5a 0x5a 0x10c 0x6e 0x5b 0x5b 0x5b 0x110 0x70 0x5c 0x5c 0x5c 0x114 0x71 0x5d 0x5d 0x5d 0x118 0x73 0x5e 0x5e 0x5e 0x11b 0x74 0x5f 0x5f 0x5f 0x11f 0x76 0x60 0x60 0x60 0x123 0x77 0x61 0x61 0x61 0x127 0x79 0x62 0x62 0x62 0x12b 0x7b 0x63 0x63 0x63 0x12f 0x7c 0x64 0x64 0x64 0x133 0x7e 0x65 0x65 0x65 0x137 0x7f 0x66 0x66 0x66 0x13b 0x81 0x67 0x67 0x67 0x13f 0x83 0x68 0x68 0x68 0x143 0x84 0x69 0x69 0x69 0x147 0x86 0x6a 0x6a 0x6a 0x14b 0x88 0x6b 0x6b 0x6b 0x14f 0x89 0x6c 0x6c 0x6c 0x153 0x8b 0x6d 0x6d 0x6d 0x157 0x8c 0x6e 0x6e 0x6e 0x15b 0x8e 0x6f 0x6f 0x6f 0x15f 0x90 0x70 0x70 0x70 0x163 0x91 0x71 0x71 0x71 0x168 0x93 0x72 0x72 0x72 0x16c 0x95 0x73 0x73 0x73 0x170 0x96 0x74 0x74 0x74 0x174 0x98 0x75 0x75 0x75 0x178 0x9a 0x76 0x76 0x76 0x17c 0x9c 0x77 0x77 0x77 0x180 0x9d 0x78 0x78 0x78 0x185 0x9f 0x79 0x79 0x79 0x189 0xa1 0x7a 0x7a 0x7a 0x18d 0xa2 0x7b 0x7b 0x7b 0x191 0xa4 0x7c 0x7c 0x7c 0x195 0xa6 0x7d 0x7d 0x7d 0x19a 0xa7 0x7e 0x7e 0x7e 0x19e 0xa9 0x7f 0x7f 0x7f 0x1a2 0xab 0x80 0x80 0x80 0x1a6 0xad 0x81 0x81 0x81 0x1ab 0xae 0x82 0x82 0x82 0x1af 0xb0 0x83 0x83 0x83 0x1b3 0xb2 0x84 0x84 0x84 0x1b8 0xb4 0x85 0x85 0x85 0x1bc 0xb5 0x86 0x86 0x86 0x1c0 0xb7 0x87 0x87 0x87 0x1c5 0xb9 0x88 0x88 0x88 0x1c9 0xbb 0x89 0x89 0x89 0x1cd 0xbc 0x8a 0x8a 0x8a 0x1d1 0xbe 0x8b 0x8b 0x8b 0x1d6 0xc0 0x8c 0x8c 0x8c 0x1da 0xc2 0x8d 0x8d 0x8d 0x1de 0xc3 0x8e 0x8e 0x8e 0x1e3 0xc5 0x8f 0x8f 0x8f 0x1e7 0xc7 0x90 0x90 0x90 0x1eb 0xc9 0x91 0x91 0x91 0x1f0 0xcb 0x92 0x92 0x92 0x1f4 0xcc 0x93 0x93 0x93 0x1f8 0xce 0x94 0x94 0x94 0x1fd 0xd0 0x95 0x95 0x95 0x201 0xd2 0x96 0x96 0x96 0x206 0xd4 0x97 0x97 0x97 0x20a 0xd6 0x98 0x98 0x98 0x20e 0xd7 0x99 0x99 0x99 0x213 0xd9 0x9a 0x9a 0x9a 0x217 0xdb 0x9b 0x9b 0x9b 0x21c 0xdd 0x9c 0x9c 0x9c 0x220 0xdf 0x9d 0x9d 0x9d 0x225 0xe1 0x9e 0x9e 0x9e 0x229 0xe2 0x9f 0x9f 0x9f 0x22e 0xe4 0xa0 0xa0 0xa0 0x232 0xe6 0xa1 0xa1 0xa1 0x237 0xe8 0xa2 0xa2 0xa2 0x23b 0xea 0xa3 0xa3 0xa3 0x240 0xec 0xa4 0xa4 0xa4 0x244 0xed 0xa5 0xa5 0xa5 0x249 0xef 0xa6 0xa6 0xa6 0x24d 0xf1 0xa7 0xa7 0xa7 0x252 0xf3 0xa8 0xa8 0xa8 0x256 0xf5 0xa9 0xa9 0xa9 0x25b 0xf7 0xaa 0xaa 0xaa 0x260 0xf9 0xab 0xab 0xab 0x264 0xfb 0xac 0xac 0xac 0x269 0xfd 0xad 0xad 0xad 0x26d 0xfe 0xae 0xae 0xae 0x272 0x100 0xaf 0xaf 0xaf 0x277 0x102 0xb0 0xb0 0xb0 0x27b 0x104 0xb1 0xb1 0xb1 0x280 0x106 0xb2 0xb2 0xb2 0x284 0x108 0xb3 0xb3 0xb3 0x289 0x10a 0xb4 0xb4 0xb4 0x28e 0x10c 0xb5 0xb5 0xb5 0x292 0x10e 0xb6 0xb6 0xb6 0x297 0x110 0xb7 0xb7 0xb7 0x29c 0x112 0xb8 0xb8 0xb8 0x2a0 0x113 0xb9 0xb9 0xb9 0x2a5 0x115 0xba 0xba 0xba 0x2aa 0x117 0xbb 0xbb 0xbb 0x2ae 0x119 0xbc 0xbc 0xbc 0x2b3 0x11b 0xbd 0xbd 0xbd 0x2b8 0x11d 0xbe 0xbe 0xbe 0x2bd 0x11f 0xbf 0xbf 0xbf 0x2c1 0x121 0xc0 0xc0 0xc0 0x2c6 0x123 0xc1 0xc1 0xc1 0x2cb 0x125 0xc2 0xc2 0xc2 0x2d0 0x127 0xc3 0xc3 0xc3 0x2d4 0x129 0xc4 0xc4 0xc4 0x2d9 0x12b 0xc5 0xc5 0xc5 0x2de 0x12d 0xc6 0xc6 0xc6 0x2e3 0x12f 0xc7 0xc7 0xc7 0x2e8 0x131 0xc8 0xc8 0xc8 0x2ec 0x133 0xc9 0xc9 0xc9 0x2f1 0x135 0xca 0xca 0xca 0x2f6 0x137 0xcb 0xcb 0xcb 0x2fb 0x139 0xcc 0xcc 0xcc 0x300 0x13b 0xcd 0xcd 0xcd 0x304 0x13d 0xce 0xce 0xce 0x309 0x13f 0xcf 0xcf 0xcf 0x30e 0x141 0xd0 0xd0 0xd0 0x313 0x143 0xd1 0xd1 0xd1 0x318 0x145 0xd2 0xd2 0xd2 0x31d 0x147 0xd3 0xd3 0xd3 0x322 0x149 0xd4 0xd4 0xd4 0x327 0x14b 0xd5 0xd5 0xd5 0x32b 0x14d 0xd6 0xd6 0xd6 0x330 0x14f 0xd7 0xd7 0xd7 0x335 0x151 0xd8 0xd8 0xd8 0x33a 0x153 0xd9 0xd9 0xd9 0x33f 0x155 0xda 0xda 0xda 0x344 0x157 0xdb 0xdb 0xdb 0x349 0x159 0xdc 0xdc 0xdc 0x34e 0x15b 0xdd 0xdd 0xdd 0x353 0x15d 0xde 0xde 0xde 0x358 0x15f 0xdf 0xdf 0xdf 0x35d 0x161 0xe0 0xe0 0xe0 0x362 0x163 0xe1 0xe1 0xe1 0x367 0x165 0xe2 0xe2 0xe2 0x36c 0x167 0xe3 0xe3 0xe3 0x371 0x169 0xe4 0xe4 0xe4 0x376 0x16b 0xe5 0xe5 0xe5 0x37b 0x16d 0xe6 0xe6 0xe6 0x380 0x170 0xe7 0xe7 0xe7 0x385 0x172 0xe8 0xe8 0xe8 0x38a 0x174 0xe9 0xe9 0xe9 0x38f 0x176 0xea 0xea 0xea 0x394 0x178 0xeb 0xeb 0xeb 0x399 0x17a 0xec 0xec 0xec 0x39e 0x17c 0xed 0xed 0xed 0x3a3 0x17e 0xee 0xee 0xee 0x3a8 0x180 0xef 0xef 0xef 0x3ad 0x182 0xf0 0xf0 0xf0 0x3b2 0x184 0xf1 0xf1 0xf1 0x3b7 0x186 0xf2 0xf2 0xf2 0x3bc 0x189 0xf3 0xf3 0xf3 0x3c1 0x18b 0xf4 0xf4 0xf4 0x3c7 0x18d 0xf5 0xf5 0xf5 0x3cc 0x18f 0xf6 0xf6 0xf6 0x3d1 0x191 0xf7 0xf7 0xf7 0x3d6 0x193 0xf8 0xf8 0xf8 0x3db 0x195 0xf9 0xf9 0xf9 0x3e0 0x197 0xfa 0xfa 0xfa 0x3e5 0x199 0xfb 0xfb 0xfb 0x3ea 0x19b 0xfc 0xfc 0xfc 0x3f0 0x19e 0xfd 0xfd 0xfd 0x3f5 0x1a0 0xfe 0xfe 0xfe 0x3fa 0x1a2 0xff 0xff 0xff 0x3ff 0x1a4>; + samsung,hbm_candela_map_table_revG = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x2 0x1aa 0x2 0x102 0x102 0x4 0x1ac 0x3 0x103 0x103 0x6 0x1ae 0x4 0x104 0x104 0x8 0x1b0 0x5 0x105 0x105 0xa 0x1b1 0x6 0x106 0x106 0xc 0x1b3 0x7 0x107 0x107 0xe 0x1b4 0x8 0x108 0x108 0x10 0x1b6 0x9 0x109 0x109 0x12 0x1b8 0xa 0x10a 0x10a 0x14 0x1b9 0xb 0x10b 0x10b 0x16 0x1bb 0xc 0x10c 0x10c 0x18 0x1bc 0xd 0x10d 0x10d 0x1a 0x1be 0xe 0x10e 0x10e 0x1c 0x1c0 0xf 0x10f 0x10f 0x1e 0x1c2 0x10 0x110 0x110 0x20 0x1c3 0x11 0x111 0x111 0x22 0x1c5 0x12 0x112 0x112 0x24 0x1c6 0x13 0x113 0x113 0x25 0x1c8 0x14 0x114 0x114 0x26 0x1ca 0x15 0x115 0x115 0x27 0x1cb 0x16 0x116 0x116 0x28 0x1cd 0x17 0x117 0x117 0x29 0x1ce 0x18 0x118 0x118 0x2a 0x1d0 0x19 0x119 0x119 0x2b 0x1d2 0x1a 0x11a 0x11a 0x2c 0x1d4 0x1b 0x11b 0x11b 0x2d 0x1d5 0x1c 0x11c 0x11c 0x2e 0x1d7 0x1d 0x11d 0x11d 0x2f 0x1d8 0x1e 0x11e 0x11e 0x30 0x1da 0x1f 0x11f 0x11f 0x31 0x1dc 0x20 0x120 0x120 0x32 0x1dd 0x21 0x121 0x121 0x33 0x1df 0x22 0x122 0x122 0x34 0x1e0 0x23 0x123 0x123 0x35 0x1e2 0x24 0x124 0x124 0x36 0x1e4 0x25 0x125 0x125 0x37 0x1e5 0x26 0x126 0x126 0x38 0x1e7 0x27 0x127 0x127 0x39 0x1e8 0x28 0x128 0x128 0x3a 0x1ea 0x29 0x129 0x129 0x3b 0x1ec 0x2a 0x12a 0x12a 0x3c 0x1ee 0x2b 0x12b 0x12b 0x3d 0x1ef 0x2c 0x12c 0x12c 0x3e 0x1f1 0x2d 0x12d 0x12d 0x3f 0x1f2 0x2e 0x12e 0x12e 0x40 0x1f4 0x2f 0x12f 0x12f 0x41 0x1f6 0x30 0x130 0x130 0x42 0x1f7 0x31 0x131 0x131 0x43 0x1f9 0x32 0x132 0x132 0x44 0x1fa 0x33 0x133 0x133 0x45 0x1fc 0x34 0x134 0x134 0x46 0x1fe 0x35 0x135 0x135 0x47 0x200 0x36 0x136 0x136 0x48 0x201 0x37 0x137 0x137 0x49 0x203 0x38 0x138 0x138 0x4a 0x204 0x39 0x139 0x139 0x4b 0x206 0x3a 0x13a 0x13a 0x4c 0x208 0x3b 0x13b 0x13b 0x4d 0x209 0x3c 0x13c 0x13c 0x4e 0x20b 0x3d 0x13d 0x13d 0x4f 0x20c 0x3e 0x13e 0x13e 0x50 0x20e 0x3f 0x13f 0x13f 0x51 0x210 0x40 0x140 0x140 0x52 0x211 0x41 0x141 0x141 0x53 0x213 0x42 0x142 0x142 0x54 0x215 0x43 0x143 0x143 0x55 0x216 0x44 0x144 0x144 0x56 0x218 0x45 0x145 0x145 0x57 0x21a 0x46 0x146 0x146 0x58 0x21b 0x47 0x147 0x147 0x59 0x21d 0x48 0x148 0x148 0x5a 0x21e 0x49 0x149 0x149 0x5b 0x220 0x4a 0x14a 0x14a 0x5c 0x222 0x4b 0x14b 0x14b 0x5d 0x223 0x4c 0x14c 0x14c 0x5f 0x225 0x4d 0x14d 0x14d 0x61 0x226 0x4e 0x14e 0x14e 0x63 0x228 0x4f 0x14f 0x14f 0x65 0x22a 0x50 0x150 0x150 0x67 0x22b 0x51 0x151 0x151 0x69 0x22d 0x52 0x152 0x152 0x6b 0x22f 0x53 0x153 0x153 0x6d 0x230 0x54 0x154 0x154 0x6f 0x232 0x55 0x155 0x155 0x71 0x234 0x56 0x156 0x156 0x73 0x235 0x57 0x157 0x157 0x75 0x237 0x58 0x158 0x158 0x77 0x238 0x59 0x159 0x159 0x79 0x23a 0x5a 0x15a 0x15a 0x7b 0x23c 0x5b 0x15b 0x15b 0x7d 0x23d 0x5c 0x15c 0x15c 0x7f 0x23f 0x5d 0x15d 0x15d 0x81 0x241 0x5e 0x15e 0x15e 0x83 0x242 0x5f 0x15f 0x15f 0x85 0x244 0x60 0x160 0x160 0x87 0x246 0x61 0x161 0x161 0x89 0x247 0x62 0x162 0x162 0x8b 0x249 0x63 0x163 0x163 0x8d 0x24a 0x64 0x164 0x164 0x8f 0x24c 0x65 0x165 0x165 0x91 0x24e 0x66 0x166 0x166 0x93 0x24f 0x67 0x167 0x167 0x95 0x251 0x68 0x168 0x168 0x97 0x253 0x69 0x169 0x169 0x9a 0x254 0x6a 0x16a 0x16a 0x9d 0x256 0x6b 0x16b 0x16b 0xa0 0x257 0x6c 0x16c 0x16c 0xa3 0x259 0x6d 0x16d 0x16d 0xa6 0x25b 0x6e 0x16e 0x16e 0xa8 0x25c 0x6f 0x16f 0x16f 0xab 0x25e 0x70 0x170 0x170 0xae 0x260 0x71 0x171 0x171 0xb1 0x261 0x72 0x172 0x172 0xb4 0x263 0x73 0x173 0x173 0xb7 0x264 0x74 0x174 0x174 0xba 0x266 0x75 0x175 0x175 0xbd 0x268 0x76 0x176 0x176 0xc0 0x269 0x77 0x177 0x177 0xc3 0x26b 0x78 0x178 0x178 0xc6 0x26d 0x79 0x179 0x179 0xc9 0x26e 0x7a 0x17a 0x17a 0xcc 0x270 0x7b 0x17b 0x17b 0xcf 0x272 0x7c 0x17c 0x17c 0xd2 0x273 0x7d 0x17d 0x17d 0xd5 0x275 0x7e 0x17e 0x17e 0xd8 0x276 0x7f 0x17f 0x17f 0xdb 0x278 0x80 0x180 0x180 0xde 0x27a 0x81 0x181 0x181 0xe1 0x27b 0x82 0x182 0x182 0xe4 0x27d 0x83 0x183 0x183 0xe7 0x27f 0x84 0x184 0x184 0xea 0x280 0x85 0x185 0x185 0xed 0x282 0x86 0x186 0x186 0xf0 0x283 0x87 0x187 0x187 0xf3 0x285 0x88 0x188 0x188 0xf6 0x287 0x89 0x189 0x189 0xf9 0x288 0x8a 0x18a 0x18a 0xfc 0x28a 0x8b 0x18b 0x18b 0xff 0x28c 0x8c 0x18c 0x18c 0x102 0x28d 0x8d 0x18d 0x18d 0x105 0x28f 0x8e 0x18e 0x18e 0x108 0x291 0x8f 0x18f 0x18f 0x10b 0x292 0x90 0x190 0x190 0x10e 0x294 0x91 0x191 0x191 0x111 0x295 0x92 0x192 0x192 0x114 0x297 0x93 0x193 0x193 0x117 0x299 0x94 0x194 0x194 0x11a 0x29a 0x95 0x195 0x195 0x11d 0x29c 0x96 0x196 0x196 0x120 0x29e 0x97 0x197 0x197 0x123 0x29f 0x98 0x198 0x198 0x126 0x2a1 0x99 0x199 0x199 0x129 0x2a3 0x9a 0x19a 0x19a 0x12c 0x2a4 0x9b 0x19b 0x19b 0x12f 0x2a6 0x9c 0x19c 0x19c 0x132 0x2a7 0x9d 0x19d 0x19d 0x135 0x2a9 0x9e 0x19e 0x19e 0x138 0x2ab 0x9f 0x19f 0x19f 0x13b 0x2ac 0xa0 0x1a0 0x1a0 0x13e 0x2ae 0xa1 0x1a1 0x1a1 0x141 0x2af 0xa2 0x1a2 0x1a2 0x144 0x2b1 0xa3 0x1a3 0x1a3 0x147 0x2b3 0xa4 0x1a4 0x1a4 0x14a 0x2b4 0xa5 0x1a5 0x1a5 0x14d 0x2b6 0xa6 0x1a6 0x1a6 0x150 0x2b8 0xa7 0x1a7 0x1a7 0x153 0x2b9 0xa8 0x1a8 0x1a8 0x156 0x2bb 0xa9 0x1a9 0x1a9 0x159 0x2bd 0xaa 0x1aa 0x1aa 0x15c 0x2be 0xab 0x1ab 0x1ab 0x15f 0x2c0 0xac 0x1ac 0x1ac 0x162 0x2c1 0xad 0x1ad 0x1ad 0x165 0x2c3 0xae 0x1ae 0x1ae 0x168 0x2c5 0xaf 0x1af 0x1af 0x16b 0x2c6 0xb0 0x1b0 0x1b0 0x16e 0x2c8 0xb1 0x1b1 0x1b1 0x171 0x2c9 0xb2 0x1b2 0x1b2 0x174 0x2cb 0xb3 0x1b3 0x1b3 0x177 0x2cd 0xb4 0x1b4 0x1b4 0x17a 0x2cf 0xb5 0x1b5 0x1b5 0x17d 0x2d0 0xb6 0x1b6 0x1b6 0x180 0x2d2 0xb7 0x1b7 0x1b7 0x183 0x2d3 0xb8 0x1b8 0x1b8 0x186 0x2d5 0xb9 0x1b9 0x1b9 0x189 0x2d7 0xba 0x1ba 0x1ba 0x18c 0x2d8 0xbb 0x1bb 0x1bb 0x18f 0x2da 0xbc 0x1bc 0x1bc 0x192 0x2db 0xbd 0x1bd 0x1bd 0x195 0x2dd 0xbe 0x1be 0x1be 0x198 0x2df 0xbf 0x1bf 0x1bf 0x19b 0x2e1 0xc0 0x1c0 0x1c0 0x19e 0x2e2 0xc1 0x1c1 0x1c1 0x1a1 0x2e4 0xc2 0x1c2 0x1c2 0x1a4 0x2e5 0xc3 0x1c3 0x1c3 0x1a7 0x2e7 0xc4 0x1c4 0x1c4 0x1aa 0x2e9 0xc5 0x1c5 0x1c5 0x1ad 0x2ea 0xc6 0x1c6 0x1c6 0x1b0 0x2ec 0xc7 0x1c7 0x1c7 0x1b3 0x2ed 0xc8 0x1c8 0x1c8 0x1b6 0x2ef 0xc9 0x1c9 0x1c9 0x1b9 0x2f1 0xca 0x1ca 0x1ca 0x1bc 0x2f2 0xcb 0x1cb 0x1cb 0x1bf 0x2f4 0xcc 0x1cc 0x1cc 0x1c2 0x2f5 0xcd 0x1cd 0x1cd 0x1c5 0x2f7 0xce 0x1ce 0x1ce 0x1c8 0x2f9 0xcf 0x1cf 0x1cf 0x1cb 0x2fb 0xd0 0x1d0 0x1d0 0x1ce 0x2fc 0xd1 0x1d1 0x1d1 0x1d1 0x2fe 0xd2 0x1d2 0x1d2 0x1d4 0x2ff 0xd3 0x1d3 0x1d3 0x1d7 0x301 0xd4 0x1d4 0x1d4 0x1da 0x303 0xd5 0x1d5 0x1d5 0x1dd 0x304 0xd6 0x1d6 0x1d6 0x1e0 0x306 0xd7 0x1d7 0x1d7 0x1e3 0x307 0xd8 0x1d8 0x1d8 0x1e6 0x309 0xd9 0x1d9 0x1d9 0x1e9 0x30b 0xda 0x1da 0x1da 0x1ec 0x30d 0xdb 0x1db 0x1db 0x1ef 0x30e 0xdc 0x1dc 0x1dc 0x1f2 0x310 0xdd 0x1dd 0x1dd 0x1f5 0x311 0xde 0x1de 0x1de 0x1f8 0x313 0xdf 0x1df 0x1df 0x1fb 0x315 0xe0 0x1e0 0x1e0 0x1fe 0x316 0xe1 0x1e1 0x1e1 0x201 0x318 0xe2 0x1e2 0x1e2 0x204 0x319 0xe3 0x1e3 0x1e3 0x207 0x31b 0xe4 0x1e4 0x1e4 0x20a 0x31d 0xe5 0x1e5 0x1e5 0x20d 0x31f 0xe6 0x1e6 0x1e6 0x210 0x320>; + samsung,hbm_candela_map_table_revA = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x3 0x1aa 0x2 0x102 0x102 0x6 0x1ac 0x3 0x103 0x103 0x9 0x1ae 0x4 0x104 0x104 0xc 0x1b0 0x5 0x105 0x105 0xf 0x1b1 0x6 0x106 0x106 0x12 0x1b3 0x7 0x107 0x107 0x15 0x1b4 0x8 0x108 0x108 0x18 0x1b6 0x9 0x109 0x109 0x1b 0x1b8 0xa 0x10a 0x10a 0x1e 0x1b9 0xb 0x10b 0x10b 0x21 0x1bb 0xc 0x10c 0x10c 0x24 0x1bc 0xd 0x10d 0x10d 0x27 0x1be 0xe 0x10e 0x10e 0x2a 0x1c0 0xf 0x10f 0x10f 0x2d 0x1c2 0x10 0x110 0x110 0x30 0x1c3 0x11 0x111 0x111 0x33 0x1c5 0x12 0x112 0x112 0x36 0x1c6 0x13 0x113 0x113 0x39 0x1c8 0x14 0x114 0x114 0x3c 0x1ca 0x15 0x115 0x115 0x3f 0x1cb 0x16 0x116 0x116 0x42 0x1cd 0x17 0x117 0x117 0x45 0x1ce 0x18 0x118 0x118 0x48 0x1d0 0x19 0x119 0x119 0x4b 0x1d2 0x1a 0x11a 0x11a 0x4e 0x1d4 0x1b 0x11b 0x11b 0x51 0x1d5 0x1c 0x11c 0x11c 0x54 0x1d7 0x1d 0x11d 0x11d 0x56 0x1d8 0x1e 0x11e 0x11e 0x58 0x1da 0x1f 0x11f 0x11f 0x5a 0x1dc 0x20 0x120 0x120 0x5c 0x1dd 0x21 0x121 0x121 0x5e 0x1df 0x22 0x122 0x122 0x60 0x1e0 0x23 0x123 0x123 0x62 0x1e2 0x24 0x124 0x124 0x64 0x1e4 0x25 0x125 0x125 0x66 0x1e5 0x26 0x126 0x126 0x68 0x1e7 0x27 0x127 0x127 0x6a 0x1e8 0x28 0x128 0x128 0x6c 0x1ea 0x29 0x129 0x129 0x6e 0x1ec 0x2a 0x12a 0x12a 0x70 0x1ee 0x2b 0x12b 0x12b 0x72 0x1ef 0x2c 0x12c 0x12c 0x74 0x1f1 0x2d 0x12d 0x12d 0x76 0x1f2 0x2e 0x12e 0x12e 0x78 0x1f4 0x2f 0x12f 0x12f 0x7a 0x1f6 0x30 0x130 0x130 0x7c 0x1f7 0x31 0x131 0x131 0x7e 0x1f9 0x32 0x132 0x132 0x80 0x1fa 0x33 0x133 0x133 0x82 0x1fc 0x34 0x134 0x134 0x84 0x1fe 0x35 0x135 0x135 0x86 0x200 0x36 0x136 0x136 0x88 0x201 0x37 0x137 0x137 0x8a 0x203 0x38 0x138 0x138 0x8c 0x204 0x39 0x139 0x139 0x8e 0x206 0x3a 0x13a 0x13a 0x90 0x208 0x3b 0x13b 0x13b 0x92 0x209 0x3c 0x13c 0x13c 0x94 0x20b 0x3d 0x13d 0x13d 0x96 0x20c 0x3e 0x13e 0x13e 0x98 0x20e 0x3f 0x13f 0x13f 0x9a 0x210 0x40 0x140 0x140 0x9c 0x211 0x41 0x141 0x141 0x9e 0x213 0x42 0x142 0x142 0xa0 0x215 0x43 0x143 0x143 0xa2 0x216 0x44 0x144 0x144 0xa4 0x218 0x45 0x145 0x145 0xa6 0x21a 0x46 0x146 0x146 0xa8 0x21b 0x47 0x147 0x147 0xaa 0x21d 0x48 0x148 0x148 0xac 0x21e 0x49 0x149 0x149 0xae 0x220 0x4a 0x14a 0x14a 0xb0 0x222 0x4b 0x14b 0x14b 0xb2 0x223 0x4c 0x14c 0x14c 0xb6 0x225 0x4d 0x14d 0x14d 0xba 0x226 0x4e 0x14e 0x14e 0xbe 0x228 0x4f 0x14f 0x14f 0xc2 0x22a 0x50 0x150 0x150 0xc6 0x22b 0x51 0x151 0x151 0xcb 0x22d 0x52 0x152 0x152 0xd0 0x22f 0x53 0x153 0x153 0xd5 0x230 0x54 0x154 0x154 0xda 0x232 0x55 0x155 0x155 0xdf 0x234 0x56 0x156 0x156 0xe4 0x235 0x57 0x157 0x157 0xe9 0x237 0x58 0x158 0x158 0xee 0x238 0x59 0x159 0x159 0xf3 0x23a 0x5a 0x15a 0x15a 0xf8 0x23c 0x5b 0x15b 0x15b 0xfd 0x23d 0x5c 0x15c 0x15c 0x102 0x23f 0x5d 0x15d 0x15d 0x107 0x241 0x5e 0x15e 0x15e 0x10c 0x242 0x5f 0x15f 0x15f 0x111 0x244 0x60 0x160 0x160 0x116 0x246 0x61 0x161 0x161 0x11b 0x247 0x62 0x162 0x162 0x120 0x249 0x63 0x163 0x163 0x125 0x24a 0x64 0x164 0x164 0x12a 0x24c 0x65 0x165 0x165 0x12f 0x24e 0x66 0x166 0x166 0x134 0x24f 0x67 0x167 0x167 0x139 0x251 0x68 0x168 0x168 0x13e 0x253 0x69 0x169 0x169 0x143 0x254 0x6a 0x16a 0x16a 0x148 0x256 0x6b 0x16b 0x16b 0x14d 0x257 0x6c 0x16c 0x16c 0x152 0x259 0x6d 0x16d 0x16d 0x157 0x25b 0x6e 0x16e 0x16e 0x15c 0x25c 0x6f 0x16f 0x16f 0x161 0x25e 0x70 0x170 0x170 0x166 0x260 0x71 0x171 0x171 0x16b 0x261 0x72 0x172 0x172 0x170 0x263 0x73 0x173 0x173 0x175 0x264 0x74 0x174 0x174 0x17a 0x266 0x75 0x175 0x175 0x17f 0x268 0x76 0x176 0x176 0x184 0x269 0x77 0x177 0x177 0x189 0x26b 0x78 0x178 0x178 0x18e 0x26d 0x79 0x179 0x179 0x193 0x26e 0x7a 0x17a 0x17a 0x198 0x270 0x7b 0x17b 0x17b 0x19d 0x272 0x7c 0x17c 0x17c 0x1a2 0x273 0x7d 0x17d 0x17d 0x1a7 0x275 0x7e 0x17e 0x17e 0x1ac 0x276 0x7f 0x17f 0x17f 0x1b1 0x278 0x80 0x180 0x180 0x1b6 0x27a 0x81 0x181 0x181 0x1bb 0x27b 0x82 0x182 0x182 0x1c0 0x27d 0x83 0x183 0x183 0x1c5 0x27f 0x84 0x184 0x184 0x1ca 0x280 0x85 0x185 0x185 0x1cf 0x282 0x86 0x186 0x186 0x1d4 0x283 0x87 0x187 0x187 0x1d9 0x285 0x88 0x188 0x188 0x1de 0x287 0x89 0x189 0x189 0x1e3 0x288 0x8a 0x18a 0x18a 0x1e8 0x28a 0x8b 0x18b 0x18b 0x1ed 0x28c 0x8c 0x18c 0x18c 0x1f2 0x28d 0x8d 0x18d 0x18d 0x1f7 0x28f 0x8e 0x18e 0x18e 0x1fc 0x291 0x8f 0x18f 0x18f 0x201 0x292 0x90 0x190 0x190 0x206 0x294 0x91 0x191 0x191 0x20b 0x295 0x92 0x192 0x192 0x210 0x297 0x93 0x193 0x193 0x215 0x299 0x94 0x194 0x194 0x21a 0x29a 0x95 0x195 0x195 0x21f 0x29c 0x96 0x196 0x196 0x224 0x29e 0x97 0x197 0x197 0x229 0x29f 0x98 0x198 0x198 0x22e 0x2a1 0x99 0x199 0x199 0x233 0x2a3 0x9a 0x19a 0x19a 0x238 0x2a4 0x9b 0x19b 0x19b 0x23d 0x2a6 0x9c 0x19c 0x19c 0x242 0x2a7 0x9d 0x19d 0x19d 0x247 0x2a9 0x9e 0x19e 0x19e 0x24d 0x2ab 0x9f 0x19f 0x19f 0x253 0x2ac 0xa0 0x1a0 0x1a0 0x259 0x2ae 0xa1 0x1a1 0x1a1 0x25f 0x2af 0xa2 0x1a2 0x1a2 0x265 0x2b1 0xa3 0x1a3 0x1a3 0x26b 0x2b3 0xa4 0x1a4 0x1a4 0x271 0x2b4 0xa5 0x1a5 0x1a5 0x277 0x2b6 0xa6 0x1a6 0x1a6 0x27d 0x2b8 0xa7 0x1a7 0x1a7 0x283 0x2b9 0xa8 0x1a8 0x1a8 0x289 0x2bb 0xa9 0x1a9 0x1a9 0x28f 0x2bd 0xaa 0x1aa 0x1aa 0x295 0x2be 0xab 0x1ab 0x1ab 0x29b 0x2c0 0xac 0x1ac 0x1ac 0x2a1 0x2c1 0xad 0x1ad 0x1ad 0x2a7 0x2c3 0xae 0x1ae 0x1ae 0x2ad 0x2c5 0xaf 0x1af 0x1af 0x2b3 0x2c6 0xb0 0x1b0 0x1b0 0x2b9 0x2c8 0xb1 0x1b1 0x1b1 0x2bf 0x2c9 0xb2 0x1b2 0x1b2 0x2c5 0x2cb 0xb3 0x1b3 0x1b3 0x2cb 0x2cd 0xb4 0x1b4 0x1b4 0x2d1 0x2cf 0xb5 0x1b5 0x1b5 0x2d7 0x2d0 0xb6 0x1b6 0x1b6 0x2dd 0x2d2 0xb7 0x1b7 0x1b7 0x2e3 0x2d3 0xb8 0x1b8 0x1b8 0x2e9 0x2d5 0xb9 0x1b9 0x1b9 0x2ef 0x2d7 0xba 0x1ba 0x1ba 0x2f5 0x2d8 0xbb 0x1bb 0x1bb 0x2fb 0x2da 0xbc 0x1bc 0x1bc 0x301 0x2db 0xbd 0x1bd 0x1bd 0x307 0x2dd 0xbe 0x1be 0x1be 0x30d 0x2df 0xbf 0x1bf 0x1bf 0x313 0x2e1 0xc0 0x1c0 0x1c0 0x319 0x2e2 0xc1 0x1c1 0x1c1 0x31f 0x2e4 0xc2 0x1c2 0x1c2 0x325 0x2e5 0xc3 0x1c3 0x1c3 0x32b 0x2e7 0xc4 0x1c4 0x1c4 0x331 0x2e9 0xc5 0x1c5 0x1c5 0x337 0x2ea 0xc6 0x1c6 0x1c6 0x33d 0x2ec 0xc7 0x1c7 0x1c7 0x343 0x2ed 0xc8 0x1c8 0x1c8 0x349 0x2ef 0xc9 0x1c9 0x1c9 0x34f 0x2f1 0xca 0x1ca 0x1ca 0x355 0x2f2 0xcb 0x1cb 0x1cb 0x35b 0x2f4 0xcc 0x1cc 0x1cc 0x361 0x2f5 0xcd 0x1cd 0x1cd 0x367 0x2f7 0xce 0x1ce 0x1ce 0x36d 0x2f9 0xcf 0x1cf 0x1cf 0x373 0x2fb 0xd0 0x1d0 0x1d0 0x379 0x2fc 0xd1 0x1d1 0x1d1 0x37f 0x2fe 0xd2 0x1d2 0x1d2 0x385 0x2ff 0xd3 0x1d3 0x1d3 0x38b 0x301 0xd4 0x1d4 0x1d4 0x391 0x303 0xd5 0x1d5 0x1d5 0x397 0x304 0xd6 0x1d6 0x1d6 0x39d 0x306 0xd7 0x1d7 0x1d7 0x3a3 0x307 0xd8 0x1d8 0x1d8 0x3a9 0x309 0xd9 0x1d9 0x1d9 0x3af 0x30b 0xda 0x1da 0x1da 0x3b5 0x30d 0xdb 0x1db 0x1db 0x3bb 0x30e 0xdc 0x1dc 0x1dc 0x3c1 0x310 0xdd 0x1dd 0x1dd 0x3c7 0x311 0xde 0x1de 0x1de 0x3cd 0x313 0xdf 0x1df 0x1df 0x3d3 0x315 0xe0 0x1e0 0x1e0 0x3d9 0x316 0xe1 0x1e1 0x1e1 0x3df 0x318 0xe2 0x1e2 0x1e2 0x3e5 0x319 0xe3 0x1e3 0x1e3 0x3eb 0x31b 0xe4 0x1e4 0x1e4 0x3f1 0x31d 0xe5 0x1e5 0x1e5 0x3f7 0x31f 0xe6 0x1e6 0x1e6 0x3ff 0x320>; + samsung,aod_candela_map_table_revA = <0x0 0x0 0xb 0x1b 0x2 0x1 0xc 0x1f 0x1a 0xa 0x2 0x20 0x36 0x19 0x1e 0x3 0x37 0xff 0x18 0x3c>; + samsung,support_dynamic_mipi_clk; + samsung,ffc_tx_cmds_revD = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 2e c5 29 00 00 00 00 00 03 c5 36 41 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revD = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53641 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c535a8 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53741>; + samsung,ffc_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 32 b1 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revA = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b1 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53222 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c533a0>; + samsung,dynamic_mipi_clk_timing_table = <0x65fbc9c0 0x671db480 0x6422c400>; + samsung,dynamic_mipi_clk_sel_table = <0x1 0x1 0x0 0x0 0x0 0x1 0x2 0x0 0x0 0x2 0x1 0x3 0x0 0x0 0x2 0x1 0x4 0x0 0x0 0x1 0x2 0xb 0x2942 0x29a2 0x0 0x2 0xb 0x29a3 0x29e8 0x1 0x2 0xb 0x29e9 0x2a56 0x0 0x2 0xc 0x25be 0x26d2 0x0 0x2 0xd 0x48a 0x54d 0x0 0x2 0xd 0x54e 0x593 0x1 0x2 0xd 0x594 0x5e9 0x0 0x2 0xe 0x601 0x661 0x0 0x2 0xe 0x662 0x6a7 0x1 0x2 0xe 0x6a8 0x6ca 0x0 0x2 0xf 0x1105 0x116a 0x0 0x2 0x11 0x8bd 0x8e6 0x0 0x2 0x11 0x8e7 0x92c 0x1 0x2 0x11 0x92d 0xa03 0x0 0x2 0x12 0xb79 0xb86 0x1 0x2 0x12 0xb87 0xb98 0x2 0x2 0x12 0xb99 0xc10 0x0 0x3 0x5b 0x0 0xd9 0x0 0x3 0x5b 0xda 0x165 0x1 0x3 0x5b 0x166 0x257 0x0 0x3 0x5c 0x258 0x26a 0x1 0x3 0x5c 0x26b 0x4a7 0x0 0x3 0x5c 0x4a8 0x4af 0x1 0x3 0x5d 0x4b0 0x64f 0x0 0x3 0x5d 0x650 0x6db 0x1 0x3 0x5d 0x6dc 0x79d 0x0 0x3 0x5e 0x79e 0x877 0x0 0x3 0x5e 0x878 0x903 0x1 0x3 0x5e 0x904 0x95f 0x0 0x3 0x5f 0x960 0xa59 0x0 0x3 0x61 0xabe 0xb29 0x0 0x3 0x61 0xb2a 0xbb5 0x1 0x3 0x61 0xbb6 0xd79 0x0 0x3 0x62 0xd7a 0xdac 0x1 0x3 0x62 0xdad 0xdd1 0x2 0x3 0x62 0xdd2 0xed7 0x0 0x3 0x66 0x1392 0x143b 0x0 0x3 0x67 0x143c 0x149f 0x0 0x3 0x68 0x14a0 0x1503 0x0 0x3 0x6b 0x1662 0x16d9 0x0 0x3 0x6c 0x16da 0x16f2 0x2 0x3 0x6c 0x16f3 0x176f 0x0 0x3 0x6d 0x1770 0x1805 0x0 0x3 0x6e 0x1806 0x1808 0x2 0x3 0x6e 0x1809 0x1931 0x0 0x3 0x6f 0x1932 0x1984 0x1 0x3 0x6f 0x1985 0x19c7 0x0 0x3 0x73 0x1f68 0x1f7a 0x1 0x3 0x73 0x1f7b 0x21b7 0x0 0x3 0x73 0x21b8 0x21f1 0x1 0x3 0x74 0x21f2 0x2214 0x2 0x3 0x74 0x2215 0x234f 0x0 0x3 0x76 0x23fa 0x24ba 0x0 0x3 0x76 0x24bb 0x2511 0x1 0x3 0x76 0x2512 0x2546 0x2 0x3 0x76 0x2547 0x25bb 0x0 0x3 0x77 0x25bc 0x25d9 0x2 0x3 0x77 0x25da 0x2629 0x0 0x3 0x78 0x262a 0x268a 0x1 0x3 0x78 0x268b 0x268d 0x0 0x3 0x7a 0x26c0 0x283d 0x0 0x3 0x7a 0x283e 0x2877 0x1 0x3 0x7c 0x8d68 0x8dfd 0x0 0x3 0x80 0x9376 0x9398 0x1 0x3 0x80 0x9399 0x9569 0x0 0x3 0x81 0x956a 0x96e4 0x0 0x3 0x81 0x96e5 0x96f9 0x1 0x3 0x82 0x96fa 0x98c2 0x0 0x3 0x82 0x98c3 0x994e 0x1 0x3 0x82 0x994f 0x9ae1 0x0 0x3 0x83 0x9ae2 0x9b20 0x1 0x3 0x83 0x9b21 0x9d5c 0x0 0x3 0x83 0x9d5d 0x9de8 0x1 0x3 0x83 0x9de9 0xa025 0x0 0x3 0x83 0xa026 0xa0b1 0x1 0x3 0x83 0xa0b2 0xa275 0x0 0x3 0x84 0xa276 0xa30c 0x0 0x3 0x84 0xa30d 0xa398 0x1 0x3 0x84 0xa399 0xa5d4 0x0 0x3 0x84 0xa5d5 0xa660 0x1 0x3 0x84 0xa661 0xa89d 0x0 0x3 0x84 0xa89e 0xa929 0x1 0x3 0x84 0xa92a 0xaa45 0x0 0x3 0x8a 0xd7c8 0xd813 0x0 0x3 0x8a 0xd814 0xd89f 0x1 0x3 0x8a 0xd8a0 0xdadc 0x0 0x3 0x8a 0xdadd 0xdb68 0x1 0x3 0x8a 0xdb69 0xdda3 0x0 0x3 0x9c 0x10384 0x1045d 0x0 0x3 0x9c 0x1045e 0x104e9 0x1 0x3 0x9c 0x104ea 0x10707 0x0 0x3 0xa1 0x10bea 0x10c9a 0x0 0x3 0xa1 0x10c9b 0x10ce1 0x1 0x3 0xa1 0x10ce2 0x10d26 0x2 0x3 0xa1 0x10d27 0x10d47 0x0 0x4 0x33 0x0 0x0 0x0 0x4 0x34 0x0 0x0 0x0 0x4 0x35 0x0 0x0 0x1 0x4 0x36 0x0 0x0 0x0 0x4 0x37 0x0 0x0 0x2 0x4 0x38 0x0 0x0 0x1 0x5 0x3d 0x0 0x0 0x2 0x5 0x3e 0x0 0x0 0x0 0x5 0x47 0x0 0x0 0x2>; + samsung,fd_on_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 40 40 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,fd_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 80 40 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_grid_on_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 bf 01 00 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,self_grid_off_revA = [29 01 00 00 11 00 03 f0 5a 5a 29 00 00 00 00 00 03 bf 00 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 4c f4 29 00 00 00 00 00 02 f4 28 29 00 00 00 00 00 03 91 01 01 29 00 00 00 00 00 02 53 27 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 40 0a 00 00 00 00 40 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 38 00 00 00 18 03 38 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 24 a4 29 01 00 00 00 00 02 f7 0f 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revA = <0x29000000 0x3f0 0x5a5a2900 0x0 0x4b0004c 0xf4290000 0x2 0xf4282900 0x0 0x3910101 0x29010000 0x253 0x26290000 0x2 0xf70f2901 0x1100 0x3f0a5a5>; + samsung,lpm_off_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 45 0a 00 00 00 00 45 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 3d 00 00 00 18 03 3d 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 26 f0 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_60nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 24]; + samsung,lpm_30nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 25]; + samsung,lpm_10nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 26]; + samsung,lpm_2nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 27]; + samsung,lpm_brightnes_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 02 53 26 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xf>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + samsung,ub-con-det = <0xffffffff 0x5 0x0>; + samsung,esd-irq-gpio1 = <0xffffffff 0x3 0x0>; + phandle = <0xf>; + + qcom,mdss-dsi-display-timings { + + fhd90 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0xf>; + qcom,mdss-dsi-panel-framerate = <0x5a>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x2847>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 0a 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 54 01 0c 00 b4 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 04 b0 00 04 f2 29 00 00 00 00 00 02 f2 54 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 01 00 00 11 00 02 f2 00 29 00 00 00 00 00 04 b0 01 b4 65 29 00 00 00 00 00 21 65 0c 94 0c 5a 0c 30 0b b8 0b 46 0a f6 09 ea 09 08 08 1a 07 12 06 2a 05 12 03 82 02 08 02 08 00 18 29 00 00 00 00 00 04 b0 00 2a 6a 29 00 00 00 00 00 04 6a 07 00 c0 29 01 00 00 11 00 02 f7 0f 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 04 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a 80 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 22 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 02 f7 0f 29 01 00 00 6e 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,panel-roi-alignment = <0x168 0x78 0x168 0x78 0x168 0x78>; + }; + + fhd60 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0x10>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x3dfa>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 0a 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 54 01 0c 00 b4 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 04 b0 00 04 f2 29 00 00 00 00 00 02 f2 54 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 01 00 00 11 00 02 f2 00 29 00 00 00 00 00 04 b0 01 b4 65 29 00 00 00 00 00 21 65 0c 94 0c 5a 0c 30 0b b8 0b 46 0a f6 09 ea 09 08 08 1a 07 12 06 2a 05 12 03 82 02 08 02 08 00 18 29 00 00 00 00 00 04 b0 00 2a 6a 29 00 00 00 00 00 04 6a 07 00 c0 29 01 00 00 11 00 02 f7 0f 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 04 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a 80 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 22 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 02 f7 0f 29 01 00 00 6e 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,panel-roi-alignment = <0x168 0x78 0x168 0x78 0x168 0x78>; + }; + }; + + qcom,panel-supply-entries { + #address-cells = <0x1>; + #size-cells = <0x0>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vci"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vddi"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1b7740>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + }; + }; + }; + }; + + fragment@89 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_PBA_BOOTING_FHD"; + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x0>; + qcom,mdss-dsi-bl-max-level = <0x639c>; + qcom,mdss-brightness-max-level = <0x639c>; + qcom,mdss-dsi-interleave-mode = <0x0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x3c>; + qcom,mdss-pan-physical-height-dimension = <0x6a>; + qcom,mdss-dsi-panel-mode-gpio-state = "invalid"; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + samsung,candela_map_table_revA = <0x0 0x0 0x2 0x5 0x1 0x2 0x2 0x6 0x2 0x3 0x3 0x7 0x3 0x4 0x4 0x8 0x4 0x5 0x5 0x9 0x5 0x6 0x6 0xa 0x6 0x7 0x7 0xb 0x7 0x8 0x8 0xc 0x8 0x9 0x9 0xd 0x9 0xa 0xa 0xe 0xa 0xb 0xb 0xf 0xb 0xc 0xc 0x10 0xc 0xd 0xd 0x11 0xd 0xe 0xe 0x13 0xe 0xf 0xf 0x14 0xf 0x10 0x10 0x15 0x10 0x11 0x11 0x16 0x11 0x12 0x12 0x18 0x12 0x13 0x13 0x19 0x13 0x14 0x14 0x1b 0x14 0x15 0x15 0x1d 0x15 0x16 0x16 0x1e 0x16 0x17 0x18 0x20 0x17 0x19 0x1a 0x22 0x18 0x1b 0x1c 0x25 0x19 0x1d 0x1d 0x27 0x1a 0x1e 0x20 0x29 0x1b 0x21 0x22 0x2c 0x1c 0x23 0x24 0x2f 0x1d 0x25 0x26 0x32 0x1e 0x27 0x28 0x35 0x1f 0x29 0x2b 0x38 0x20 0x2c 0x2e 0x3c 0x21 0x2f 0x31 0x40 0x22 0x32 0x34 0x44 0x23 0x35 0x38 0x48 0x24 0x39 0x3b 0x4d 0x25 0x3c 0x3f 0x52 0x26 0x40 0x43 0x57 0x27 0x44 0x47 0x5d 0x28 0x48 0x4c 0x62 0x29 0x4d 0x50 0x69 0x2a 0x51 0x56 0x6f 0x2b 0x57 0x5b 0x77 0x2c 0x5c 0x61 0x7e 0x2d 0x62 0x68 0x86 0x2e 0x69 0x6e 0x8f 0x2f 0x6f 0x76 0x98 0x30 0x77 0x7d 0xa2 0x31 0x7e 0x85 0xac 0x32 0x86 0x8e 0xb7 0x33 0x8f 0x96 0xc3 0x34 0x97 0xa0 0xcf 0x35 0xa1 0xaa 0xdc 0x36 0xab 0xb5 0xea 0x37 0xb6 0xc1 0xf9 0x38 0xc2 0xcd 0x109 0x39 0xce 0xda 0x11a 0x3a 0xdb 0xe6 0x12c 0x3b 0xe7 0xf2 0x13c 0x3c 0xf3 0xfe 0x14d 0x3d 0xff 0xff 0x168>; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x10>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + phandle = <0x10>; + + qcom,mdss-dsi-display-timings { + + fhd@0 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-front-porch = <0xa4>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-v-back-porch = <0x3>; + qcom,mdss-dsi-v-front-porch = <0x9>; + qcom,mdss-dsi-panel-clockrate = <0x35866480>; + qcom,mdss-dsi-panel-phy-timings = <0x1e0808 0x24220808 0x8020400>; + qcom,mdss-dsi-on-command = [39 01 00 00 78 00 02 11 00]; + qcom,mdss-dsi-off-command = <0x5010000 0x24000128 0x5010000 0x78000110>; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + }; + }; + }; + + fragment@90 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_te { + + sde_te_active { + phandle = <0x9>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + + sde_te_suspend { + phandle = <0xd>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + + pmx_sde { + phandle = <0xd0>; + + sde_dsi_active { + phandle = <0xa>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + bias-disable = <0x0>; + }; + }; + + sde_dsi_suspend { + phandle = <0xe>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable = <0x0>; + }; + }; + }; + }; + }; + + fragment@91 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_ub_det { + + sde_ub_det_default { + pins = "gpio5"; + function = "normal"; + input-enable; + power-source = <0x1>; + bias-disable; + phandle = <0xb>; + }; + }; + }; + }; + + fragment@92 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_fg_err { + + sde_fg_err_default { + pins = "gpio3"; + function = "normal"; + input-enable; + power-source = <0x0>; + bias-disable; + phandle = <0xc>; + }; + }; + }; + }; + + fragment@93 { + target = <0xffffffff>; + + __overlay__ { + + qcom,dsi-display@9 { + label = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + qcom,display-type = "primary"; + phandle = <0xd1>; + }; + + qcom,dsi-display@10 { + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,display-type = "primary"; + phandle = <0xd2>; + }; + }; + }; + + fragment@94 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c000000 0x0 0x9e4000>; + label = "cont_splash_region"; + }; + }; + + fragment@95 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c9e4000 0x0 0x100000>; + label = "dfps_data_region"; + }; + }; + + fragment@96 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c000000 0x0 0x9e4000>; + label = "disp_rdump_region"; + }; + }; + + fragment@97 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x68>; + status = "okay"; + + sm5714@49 { + status = "okay"; + compatible = "siliconmitus,sm5714mfd"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x69>; + sm5714,irq-gpio = <0xffffffff 0x21 0x0>; + sm5714,wakeup; + }; + }; + }; + + fragment@98 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x6a>; + status = "okay"; + + usbpd-sm5714@33 { + status = "okay"; + compatible = "sm5714-usbpd"; + reg = <0x33>; + pinctrl-names = "default"; + pinctrl-0 = <0x6b>; + usbpd,usbpd_int = <0xffffffff 0x68 0x0>; + support_pd_role_swap; + + pdic-manager { + pdic,max_power = <0x1388>; + pdic_op_power = <0x9c4>; + pdic_max_voltage = <0x1770>; + pdic_max_current = <0x7d0>; + pdic,min_current = <0x1f4>; + pdic,giveback = <0x0>; + pdic,usb_com_capable = <0x1>; + pdic,no_usb_suspend = <0x1>; + source,max_voltage = <0x1388>; + source,min_voltage = <0xfa0>; + source,max_power = <0x9c4>; + }; + }; + }; + }; + + fragment@99 { + target = <0xffffffff>; + + __overlay__ { + + if_pmic_irq { + + if_pmic_irq_default { + phandle = <0x69>; + + mux { + pins = "gpio33"; + function = "gpio"; + }; + + config { + pins = "gpio33"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + + usbpd_irq { + + usbpd_irq_default { + phandle = <0x6b>; + + mux { + pins = "gpio104"; + function = "gpio"; + }; + + config { + pins = "gpio104"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + }; + }; + + fragment@100 { + target = <0xffffffff>; + + __overlay__ { + qcom,qusb-phy-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x18 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x46 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + qcom,qusb-phy-host-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x18 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x46 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + }; + }; + + fragment@101 { + target = <0xffffffff>; + + __overlay__ { + + fps_rst { + phandle = <0x6c>; + + mux { + pins = "gpio91"; + function = "gpio"; + }; + + config { + pins = "gpio91"; + bias-pull-down; + }; + }; + }; + }; + + fragment@102 { + target = <0xffffffff>; + + __overlay__ { + regulator-name = "VDD_BTP_3P3"; + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + }; + }; + + fragment@103 { + target = <0xffffffff>; + + __overlay__ { + qcom,set-miso-sampling; + qcom,miso-sampling-ctrl-val = <0x2>; + status = "okay"; + + gw9558-spi@0 { + compatible = "goodix,gw9558x_factory"; + reg = <0x0>; + spi-max-frequency = <0x17d7840>; + pinctrl-names = "default"; + pinctrl-0 = <0x6c>; + gpio-controller; + #gpio-cells = <0x2>; + goodix,btp-regulator = "VDD_BTP_3P3"; + goodix,gpio_reset = <0xffffffff 0x5b 0x0>; + goodix,chip_id = "GW9558"; + goodix,position = "11.81,-0.02,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + goodix,modelinfo = "A525"; + goodix,rb = "547,215,-1,FFFFFF,A9A9A9"; + }; + }; + }; + + fragment@104 { + target = <0xffffffff>; + + __overlay__ { + + gw9558@0 { + compatible = "goodix,gw9558x"; + reg = <0x0>; + spi-max-frequency = <0x17d7840>; + pinctrl-names = "default"; + pinctrl-0 = <0x6c>; + gpio-controller; + #gpio-cells = <0x2>; + goodix,btp-regulator = "VDD_BTP_3P3"; + goodix,gpio_reset = <0xffffffff 0x5b 0x0>; + goodix,chip_id = "GW9558"; + goodix,position = "11.81,-0.02,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + goodix,modelinfo = "A525"; + goodix,rb = "547,215,-1,FFFFFF,A9A9A9"; + }; + }; + }; + + fragment@105 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@106 { + target = <0xffffffff>; + + __overlay__ { + + qcom,flash_0 { + label = "flash"; + qcom,led-name = "led:flash_0"; + qcom,max-current = <0x5dc>; + qcom,default-led-trigger = "flash0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x5dc>; + qcom,duration-ms = <0x500>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + qcom,record-current-ma = <0x12c>; + phandle = <0x6d>; + }; + + qcom,torch_0 { + label = "torch"; + qcom,led-name = "led:torch_0"; + qcom,max-current = <0x1f4>; + qcom,default-led-trigger = "torch0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x12c>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + phandle = <0x6e>; + }; + + qcom,camera-flash@0 { + cell-index = <0x0>; + compatible = "qcom,camera-flash"; + flash-source = <0x6d>; + torch-source = <0x6e>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x77>; + }; + + qcom,cam-res-mgr { + compatible = "qcom,cam-res-mgr"; + shared-gpios = <0x3f>; + pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; + status = "ok"; + pinctrl-0 = <0x6f>; + pinctrl-1 = <0x70>; + }; + }; + }; + + fragment@107 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + sm5714-fled { + compatible = "siliconmitus,sm5714-fled"; + reg = <0x49>; + status = "okay"; + slave-addr = <0x92>; + flash-en-gpio = <0xffffffff 0x16 0x0>; + torch-en-gpio = <0xffffffff 0x43 0x0>; + flash-brightness = <0xf>; + preflash-brightness = <0x7>; + torch-brightness = <0x7>; + factory_current = <0x0>; + timeout = <0xff>; + }; + }; + }; + + fragment@108 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + qcom,ois@62 { + compatible = "qcom,ois"; + cell-index = <0x0>; + reg = <0x62>; + slave-addr = <0xc4>; + slave-id = <0x460>; + cam_vaf-supply = <0x71>; + regulator-names = "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x2ab980>; + rgltr-max-voltage = <0x2ab980>; + rgltr-load-current = <0x30d40>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x72 0x73>; + pinctrl-1 = <0x74 0x75>; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x20 0x0 0xffffffff 0x2b 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x0>; + gpio-custom1 = <0x1>; + gpio-vio = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x0 0x0 0x0>; + gpio-req-tbl-label = "MCU_RESET0", "MCU_BOOT0", "MCU_VIO"; + status = "ok"; + phandle = <0x79>; + }; + }; + }; + + fragment@109 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@0 { + cell-index = <0x0>; + compatible = "qcom,cam-sensor"; + reg = <0x0>; + slave-addr = <0x34>; + csiphy-sd-index = <0x0>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x76>; + led-flash-src = <0x77>; + eeprom-src = <0x78>; + ois-src = <0x79>; + cam_vio-supply = <0x7a>; + cam_vaf-supply = <0x71>; + cam_vana-supply = <0x7b>; + cam_vdig-supply = <0x7c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vaf", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x2ab980 0xf4240 0x0>; + rgltr-max-voltage = <0x1b7740 0x2ab980 0x2c4020 0x10c8e0 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x7d 0x7e 0x7f>; + pinctrl-1 = <0x80 0x81 0x82>; + gpios = <0xffffffff 0xd 0x0 0xffffffff 0x1e 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x1>; + gpio-custom1 = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_VANA0"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x41>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@2 { + cell-index = <0x2>; + compatible = "qcom,cam-sensor"; + reg = <0x3>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x83>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x84 0x85 0x86 0x87>; + pinctrl-1 = <0x88 0x89 0x8a 0x8b>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x2D { + cell-index = <0x2>; + compatible = "qcom,eeprom"; + reg = <0x2d>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x84 0x85 0x86 0x87>; + pinctrl-1 = <0x88 0x89 0x8a 0x8b>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x83>; + }; + + qcom,eeprom@37 { + cell-index = <0x3>; + compatible = "qcom,eeprom"; + reg = <0x37>; + slave-addr = <0x6e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_vdig-supply = <0x8c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x8d 0x8e 0x8f>; + pinctrl-1 = <0x90 0x91 0x92>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x9a>; + }; + }; + }; + + fragment@110 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@1 { + cell-index = <0x1>; + compatible = "qcom,cam-sensor"; + reg = <0x1>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x93>; + cam_vio-supply = <0x7a>; + cam_vana-supply = <0x94>; + cam_vdig-supply = <0x95>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x96 0x97>; + pinctrl-1 = <0x98 0x99>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@8 { + cell-index = <0x8>; + compatible = "qcom,cam-sensor"; + reg = <0x8>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x93>; + cam_vio-supply = <0x7a>; + cam_vana-supply = <0x94>; + cam_vdig-supply = <0x95>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x96 0x97>; + pinctrl-1 = <0x98 0x99>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@3 { + cell-index = <0x3>; + compatible = "qcom,cam-sensor"; + reg = <0x2>; + slave-addr = <0x6e>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x9a>; + cam_vio-supply = <0x7a>; + cam_vdig-supply = <0x8c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x8d 0x8e 0x8f>; + pinctrl-1 = <0x90 0x91 0x92>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@4 { + cell-index = <0x4>; + compatible = "qcom,cam-sensor"; + reg = <0x4>; + slave-addr = <0x7e>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + led-flash-src = <0x77>; + eeprom-src = <0x9b>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x9c 0x9d 0x9e 0x87 0x7f>; + pinctrl-1 = <0x9f 0xa0 0xa1 0x8b 0x82>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x4a 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0xd3>; + }; + + qcom,eeprom@0x3F { + cell-index = <0x4>; + compatible = "qcom,eeprom"; + reg = <0x3f>; + slave-addr = <0x7e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x9c 0x9d 0x9e 0x87>; + pinctrl-1 = <0x9f 0xa0 0xa1 0x8b>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x4a 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x9b>; + }; + }; + }; + + fragment@111 { + target = <0xffffffff>; + + __overlay__ { + + qcom,actuator@0xC { + cell-index = <0x0>; + reg = <0xc>; + slave-addr = <0x18>; + compatible = "i2c_actuator"; + rgltr-cntrl-support; + cam_vio-supply = <0x7a>; + cam_vaf-supply = <0x71>; + regulator-names = "cam_vio", "cam_vaf"; + rgltr-min-voltage = <0x1b7740 0x2ab980>; + rgltr-max-voltage = <0x1b7740 0x2ab980>; + rgltr-load-current = <0x30d40 0x30d40>; + phandle = <0x76>; + }; + + qcom,eeprom@50 { + cell-index = <0x0>; + reg = <0x50>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa0>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1 0x1>; + qcom,cam-power-seq-delay = <0x2 0x2>; + cam_vaf-supply = <0x71>; + cam_vio-supply = <0x7a>; + regulator-names = "cam_vaf", "cam_vio"; + rgltr-min-voltage = <0x2ab980 0x1b7740>; + rgltr-max-voltage = <0x2ab980 0x1b7740>; + rgltr-load-current = <0x30d40 0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + phandle = <0x78>; + }; + + qcom,eeprom@51 { + cell-index = <0x1>; + reg = <0x51>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa2>; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x2>; + cam_vio-supply = <0x7a>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-mode = <0x0>; + sensor-position = <0x1>; + rgltr-cntrl-support; + phandle = <0x93>; + }; + }; + }; + + fragment@112 { + target = <0xffffffff>; + + __overlay__ { + + samsung,vibrator { + compatible = "samsung_vib"; + samsung,vib_type = "COINDC"; + status = "ok"; + phandle = <0xd4>; + }; + }; + }; + + fragment@113 { + target = <0xffffffff>; + + __overlay__ { + + nfc_qupv3_se0_i2c_sleep { + phandle = <0xa2>; + + mux { + pins = "gpio34", "gpio35"; + function = "gpio"; + }; + + config { + pins = "gpio34", "gpio35"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + nfc_clk_req_gpio { + phandle = <0xa3>; + + mux { + pins = "gpio31"; + function = "gpio"; + }; + + config { + pins = "gpio31"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_irq_gpio { + phandle = <0xa4>; + + mux { + pins = "gpio37"; + function = "gpio"; + }; + + config { + pins = "gpio37"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_ven_gpio { + phandle = <0xa5>; + + mux { + pins = "gpio12"; + function = "gpio"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-high; + }; + }; + + nfc_firm_gpio { + phandle = <0xa6>; + + mux { + pins = "gpio36"; + function = "gpio"; + }; + + config { + pins = "gpio36"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + nfc_ldo_en_gpio { + phandle = <0xa7>; + + mux { + pins = "gpio68"; + function = "gpio"; + }; + + config { + pins = "gpio68"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@114 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + pinctrl-1 = <0xa2>; + qcom,clk-freq-out = <0x61a80>; + + sec-nfc@27 { + compatible = "sec-nfc"; + reg = <0x27>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + sec-nfc,ven-gpio = <0xffffffff 0xc 0x0>; + sec-nfc,irq-gpio = <0xffffffff 0x25 0x0>; + sec-nfc,firm-gpio = <0xffffffff 0x24 0x0>; + sec-nfc,clk_req-gpio = <0xffffffff 0x1f 0x0>; + sec-nfc,pvdd-gpio = <0xffffffff 0x44 0x0>; + sec-nfc,clk_req_wake; + sec-nfc,bootloader_ver = <0x6>; + pinctrl-names = "default"; + pinctrl-0 = <0xa3 0xa4 0xa5 0xa6 0xa7>; + }; + }; + }; + + fragment@115 { + target = <0xffffffff>; + + __overlay__ { + + hall { + status = "okay"; + compatible = "hall"; + linux,input-type = <0x1>; + linux,code = <0x15>; + hall,gpio_flip_cover = <0xffffffff 0xa 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa8>; + }; + }; + }; + + fragment@116 { + target = <0xffffffff>; + + __overlay__ { + + hall { + + hall_default { + pins = "gpio10"; + function = "normal"; + output-disable; + input-enable; + bias-disable; + power-source = <0x0>; + phandle = <0xa8>; + }; + }; + }; + }; + + fragment@abc { + target-path = [2f 00]; + + __overlay__ { + + sec_abc { + compatible = "samsung,sec_abc"; + status = "okay"; + + gpu { + gpu,label = "GPU fault"; + gpu,threshold_count = <0x4>; + gpu,threshold_time = <0x4b0>; + }; + + gpu_page { + gpu_page,label = "GPU page fault"; + gpu_page,threshold_count = <0x14>; + gpu_page,threshold_time = <0x4b0>; + }; + + aicl { + aicl,label = "battery aicl"; + aicl,threshold_count = <0x5>; + aicl,threshold_time = <0x12c>; + }; + }; + + abc_hub { + compatible = "samsung,abc_hub"; + status = "okay"; + + bootc { + bootc,time_spec_user = <0x186a0>; + bootc,time_spec_eng = <0x186a0>; + bootc,time_spec_fac = <0x186a0>; + }; + }; + }; + }; + + fragment@117 { + target = <0xffffffff>; + + __overlay__ { + + rpmh-regulator-ldoc8 { + compatible = "qcom,rpmh-vrm-regulator"; + mboxes = <0xffffffff 0x0>; + qcom,resource-name = "ldoc8"; + qcom,regulator-type = "pmic5-ldo"; + qcom,supported-modes = <0x2 0x4>; + qcom,mode-threshold-currents = <0x0 0x1>; + + regulator-pm6150l-l8 { + regulator-name = "pm6150l_l8"; + qcom,set = <0x3>; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + qcom,init-voltage = <0x1b7740>; + regulator-always-on; + qcom,init-mode = <0x2>; + phandle = <0xd5>; + }; + }; + + rpmh-regulator-ldoa5 { + + regulator-pm6150-l5 { + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + regulator-always-on; + phandle = <0xd6>; + }; + }; + + i2c@17 { + status = "ok"; + cell-index = <0x11>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x33 0x0 0xffffffff 0x34 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0xa9>; + phandle = <0xd7>; + + sx9360-i2c@28 { + compatible = "sx9360"; + reg = <0x28>; + pinctrl-names = "default"; + pinctrl-0 = <0xaa>; + interrupt-parent = <0xffffffff>; + interrupts = <0x4 0xc4 0x0 0x2>; + sx9360,nirq-gpio = <0xffffffff 0x5 0x1>; + sx9360,reggnrlctrl2_reg = <0x32>; + sx9360,againfreq_reg = <0x38>; + sx9360,refagainfreq_reg = <0x36>; + sx9360,gainrawfilt_reg = <0x1a>; + sx9360,refgainrawfilt_reg = <0x22>; + sx9360,proxthresh_reg = <0x1d>; + sx9360,hyst_reg = <0x35>; + sx9360,regproxctrl3_reg = <0xd>; + sx9360,resolution_reg = <0xf>; + sx9360,refresolution_reg = <0xf>; + sx9360,hallic_cert_detect = <0x1>; + }; + }; + }; + }; + + fragment@118 { + target = <0xffffffff>; + + __overlay__ { + + bat_thm { + label = "bat_thm"; + reg = <0x4f>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + + chg_thm { + label = "chg_thm"; + reg = <0x4d>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + }; + }; + + fragment@119 { + target = <0xffffffff>; + + __overlay__ { + + battery { + pinctrl-names = "default"; + battery,chip_vendor = "QCOM"; + status = "okay"; + compatible = "samsung,sec-battery"; + battery,vendor = "Battery"; + battery,charger_name = "sm5714-charger"; + battery,fuelgauge_name = "sm5714-fuelgauge"; + battery,fgsrc_switch_name = "sm5714-fuelgauge"; + battery,technology = <0x2>; + battery,batt_data_version = <0x1>; + battery,temp_adc_type = <0x1>; + battery,temp_channel_raw = <0x1>; + battery,adc_check_count = <0x5>; + battery,temp_check_type = <0x1>; + battery,chg_temp_check_type = <0x1>; + battery,thermal_source = <0x2>; + battery,chg_thermal_source = <0x2>; + battery,temp_table_adc = <0x76c 0x923 0xab2 0xc97 0xec8 0x114f 0x146a 0x1803 0x1c2e 0x20e2 0x25c4 0x2b7f 0x31eb 0x386a 0x3f07 0x45a1 0x4be0 0x51ec 0x5774 0x5c67 0x609d 0x6442 0x6755>; + battery,temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,chg_temp_table_adc = <0x6d6 0x889 0xa14 0xbe2 0xe04 0x107c 0x137e 0x170b 0x1b0d 0x1f93 0x2479 0x2a3c 0x3072 0x3719 0x3da0 0x43e4 0x4aa7 0x50aa 0x5651 0x5b61 0x5fd6 0x637c 0x66ca>; + battery,chg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,polling_time = <0xa 0x1e 0x1e 0x1e 0xe10>; + battery,cable_check_type = <0x4>; + battery,cable_source_type = <0x1>; + battery,polling_type = <0x1>; + battery,monitor_initial_count = <0x0>; + battery,battery_check_type = <0x0>; + battery,ovp_uvlo_check_type = <0x3>; + battery,temp_check_count = <0x1>; + battery,overheatlimit_threshold = <0x2bc>; + battery,overheatlimit_recovery = <0x2a8>; + battery,wire_warm_overheat_thresh = <0x1f4>; + battery,wire_normal_warm_thresh = <0x1a4>; + battery,wire_cool1_normal_thresh = <0xb4>; + battery,wire_cool2_cool1_thresh = <0x96>; + battery,wire_cool3_cool2_thresh = <0x32>; + battery,wire_cold_cool3_thresh = <0x0>; + battery,wire_warm_current = <0x61b>; + battery,wire_cool1_current = <0xaf0>; + battery,wire_cool2_current = <0x417>; + battery,wire_cool3_current = <0x1b5>; + battery,low_temp_topoff = <0xe1>; + battery,high_temp_topoff = <0xe1>; + battery,low_temp_float = <0x111c>; + battery,high_temp_float = <0x1036>; + battery,full_check_type = <0x7>; + battery,full_check_type_2nd = <0x7>; + battery,full_check_count = <0x1>; + battery,chg_gpio_full_check = <0x0>; + battery,chg_polarity_full_check = <0x1>; + battery,chg_high_temp = <0x22b>; + battery,chg_high_temp_recovery = <0x212>; + battery,chg_input_limit_current = <0x3e8>; + battery,chg_charging_limit_current = <0x578>; + battery,wpc_temp_control_source = <0x1>; + battery,wpc_high_temp = <0x17c>; + battery,wpc_high_temp_recovery = <0x168>; + battery,wpc_input_limit_current = <0x258>; + battery,wpc_charging_limit_current = <0x3e8>; + battery,wpc_temp_lcd_on_control_source = <0x1>; + battery,wpc_lcd_on_high_temp = <0x17c>; + battery,wpc_lcd_on_high_temp_rec = <0x168>; + battery,wpc_lcd_on_input_limit_current = <0x1c2>; + battery,wpc_store_high_temp = <0x168>; + battery,wpc_store_high_temp_recovery = <0x154>; + battery,wpc_store_charging_limit_current = <0x190>; + battery,wpc_store_lcd_on_high_temp = <0x168>; + battery,wpc_store_lcd_on_high_temp_rec = <0x12c>; + battery,wpc_store_lcd_on_charging_limit_current = <0x190>; + battery,sleep_mode_limit_current = <0x1f4>; + battery,wc_full_input_limit_current = <0x64>; + battery,mix_high_temp = <0x1a4>; + battery,mix_high_chg_temp = <0x1f4>; + battery,mix_high_temp_recovery = <0x186>; + battery,full_condition_type = <0x9>; + battery,full_condition_soc = <0x5d>; + battery,full_condition_vcell = <0x10ea>; + battery,recharge_check_count = <0x1>; + battery,recharge_condition_type = <0x4>; + battery,recharge_condition_soc = <0x62>; + battery,recharge_condition_vcell = <0x10d6>; + battery,charging_total_time = <0x3840>; + battery,hv_charging_total_time = <0x2a30>; + battery,normal_charging_total_time = <0x4650>; + battery,usb_charging_total_time = <0x8ca0>; + battery,recharging_total_time = <0x1518>; + battery,charging_reset_time = <0x0>; + battery,chg_float_voltage = <0x111c>; + battery,pre_afc_work_delay = <0x7d0>; + battery,pre_wc_afc_work_delay = <0xfa0>; + battery,pre_afc_input_current = <0x1f4>; + battery,pre_wc_afc_input_current = <0x1f4>; + battery,prepare_ta_delay = <0x0>; + battery,swelling_high_rechg_voltage = <0xfa0>; + battery,swelling_low_rechg_voltage = <0x1086>; + battery,siop_input_limit_current = <0x4b0>; + battery,siop_charging_limit_current = <0x3e8>; + battery,siop_hv_input_limit_current = <0x2bc>; + battery,siop_hv_input_limit_current_2nd = <0x226>; + battery,siop_hv_charging_limit_current = <0x3e8>; + battery,ttf_hv_charge_current = <0xa28>; + battery,ttf_dc25_charge_current = <0xed8>; + battery,rp_current_rp1 = <0x1f4>; + battery,rp_current_rp2 = <0x5dc>; + battery,rp_current_rp3 = <0xbb8>; + battery,rp_current_rdu_rp3 = <0x834>; + battery,rp_current_abnormal_rp3 = <0x708>; + battery,pd_charging_charge_power = <0x3a98>; + battery,max_charging_current = <0xaf0>; + battery,wireless_cc_cv = <0x55>; + battery,wireless_otg_input_current = <0x384>; + battery,age_data = <0x0 0x111c 0x10d6 0x10b8 0x5d 0x12c 0x1108 0x10c2 0x10a4 0x5c 0x190 0x10f4 0x10ae 0x1090 0x5b 0x2bc 0x10e0 0x109a 0x107c 0x5a 0x3e8 0x10ae 0x1068 0x104a 0x59>; + battery,health_condition = <0x384 0x0 0x4b0 0x0 0x5dc 0x0>; + battery,standard_curr = <0xe42>; + battery,expired_time = <0x23a0>; + battery,recharging_expired_time = <0x1518>; + battery,battery_full_capacity = <0x1388>; + battery,cisd_max_voltage_thr = <0x1388>; + battery,max_input_voltage = <0x2328>; + battery,max_input_current = <0xbb8>; + battery,cisd_alg_index = <0x8>; + battery,ignore_cisd_index = <0x0 0x3c0>; + battery,ignore_cisd_index_d = <0x0 0x78>; + battery,ttf_capacity = <0xf28>; + battery,cv_data = <0xe36 0x358 0x51b 0xd81 0x362 0x4f2 0xcc6 0x36b 0x4ca 0xc27 0x371 0x4ab 0xb78 0x379 0x483 0xac8 0x380 0x45a 0xa4a 0x387 0x433 0x9b2 0x38c 0x413 0x93e 0x393 0x3ea 0x89d 0x399 0x3c1 0x84b 0x39e 0x39c 0x7e3 0x3a2 0x37e 0x78a 0x3a6 0x35c 0x708 0x3ab 0x334 0x6ae 0x3b0 0x305 0x667 0x3b4 0x2e2 0x60b 0x3b8 0x2ba 0x5a7 0x3bc 0x291 0x562 0x3be 0x26f 0x543 0x3c2 0x24a 0x4a4 0x3c5 0x221 0x496 0x3cb 0x1d8 0x43e 0x3ce 0x1b2 0x427 0x3d1 0x189 0x3f0 0x3d4 0x160 0x3d1 0x3dc 0xda 0x36e 0x3e0 0x9b 0x366 0x3e2 0x7c 0x300 0x3e6 0x3e 0x2f5 0x3e8 0x0>; + io-channels = <0xffffffff 0x4f 0xffffffff 0x4d>; + io-channel-names = "adc-temp", "adc-chg-temp"; + }; + + sm5714-fuelgauge { + status = "okay"; + fuelgauge,fuel_alert_soc = <0x1>; + fuelgauge,capacity_max = <0x3e8>; + fuelgauge,capacity_max_margin = <0x12c>; + fuelgauge,capacity_min = <0x0>; + fuelgauge,capacity_calculation_type = <0x1f>; + fuelgauge,using_temp_compensation; + fuelgauge,low_temp_limit = <0x64>; + fuelgauge,using_hw_vempty; + fuelgauge,sw_v_empty_voltage = <0xc80>; + fuelgauge,sw_v_empty_voltage_cisd = <0xc1c>; + fuelgauge,sw_v_empty_recover_voltage = <0xd98>; + fuelgauge,capacity = <0x1388>; + + battery_params { + battery,id = <0x0>; + battery0,battery_type = <0x114e 0x1f20>; + battery0,battery_table0 = <0x1400 0x1b73 0x1c4b 0x1d38 0x1d68 0x1d7a 0x1d88 0x1d8f 0x1db4 0x1dea 0x1e0d 0x1e42 0x1e88 0x1eb4 0x1f01 0x1f3d 0x1f76 0x1fc7 0x2023 0x207f 0x2116 0x2190 0x2272 0x2400>; + battery0,battery_table1 = <0x0 0x99 0x219 0x4b3 0x5cc 0x74c 0xb80 0xd19 0xfb3 0x14e6 0x1a19 0x1f4c 0x29b3 0x2ee6 0x36b3 0x3be6 0x3e80 0x4119 0x464c 0x4b80 0x534c 0x5880 0x6400 0x6419>; + battery0,battery_table2 = <0x4b4b 0x4444 0x4040 0x3e3e 0x3c3c 0x3b3b 0x3838 0x3737 0x3535 0x3434 0x3434 0x3333 0x3333 0x3333 0x3333 0x3232>; + battery0,rs_value = <0x66 0x66 0x3800 0x199 0x599 0x599 0x100>; + battery0,v_alarm = <0xce4 0x0>; + battery0,topoff = <0x28a>; + battery0,i_cal = <0x0 0x0 0x800 0x800 0x0 0x0 0x7f0 0x81b>; + battery0,v_cal = <0x1 0x0 0x0 0x1 0x0 0x0 0x0>; + battery0,temp_std = <0x19>; + battery0,tem_poff = <0xd7a 0x32 0xd16 0x32>; + battery0,aux_ctrl = <0x322 0x5800>; + battery0,data_ver = <0x7>; + battery0,v_max_table = <0x2272 0x2250 0x222e 0x220c 0x21b7>; + battery0,q_max_table = <0x1f20 0x1e9f 0x1e1e 0x1d9d 0x1c5b>; + }; + }; + + cable-info { + default_input_current = <0x708>; + default_charging_current = <0x834>; + full_check_current_1st = <0x28a>; + full_check_current_2nd = <0xe1>; + + current_group_1 { + cable_number = <0x2 0x13 0x15 0x16 0x17 0x1e>; + input_current = <0x1f4>; + charging_current = <0x1f4>; + }; + + current_group_2 { + cable_number = <0x19 0x1f>; + input_current = <0x3e8>; + charging_current = <0x3e8>; + }; + + current_group_3 { + cable_number = <0x5 0x20>; + input_current = <0x5dc>; + charging_current = <0x5dc>; + }; + + current_group_4 { + cable_number = <0x6 0x7 0x8 0x11 0x12>; + input_current = <0x672>; + charging_current = <0xaf0>; + }; + + current_group_5 { + cable_number = <0x9>; + input_current = <0x672>; + charging_current = <0xc4e>; + }; + + current_group_6 { + cable_number = <0xa 0xc 0xf 0x1b 0x21 0x24>; + input_current = <0x320>; + charging_current = <0x960>; + }; + + current_group_7 { + cable_number = <0xd>; + input_current = <0x2bc>; + charging_current = <0x960>; + }; + + current_group_8 { + cable_number = <0x18>; + input_current = <0x3e8>; + charging_current = <0x1c2>; + }; + + current_group_9 { + cable_number = <0x23>; + input_current = <0x708>; + charging_current = <0x708>; + }; + + current_group_10 { + cable_number = <0xb 0xe 0x10 0x1c 0x23>; + input_current = <0x28a>; + charging_current = <0x960>; + }; + + current_group_11 { + cable_number = <0x1d 0x25>; + input_current = <0x1f4>; + charging_current = <0x4b0>; + }; + + current_group_12 { + cable_number = <0x1 0x4>; + input_current = <0x1db>; + charging_current = <0x226>; + }; + + current_group_13 { + cable_number = <0x22>; + input_current = <0x4b0>; + charging_current = <0x960>; + }; + }; + }; + }; + + __symbols__ { + dsi_rm69299_visionox_amoled_video = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video"; + dsi_rm69299_visionox_amoled_cmd = "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd"; + dsi_sim_vid = "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video"; + dsi_sim_cmd = "/fragment@3/__overlay__/qcom,mdss_dsi_sim_cmd"; + dsi_sim_dsc_375_cmd = "/fragment@4/__overlay__/qcom,mdss_dsi_sim_dsc_375_cmd"; + dsi_nt36672c_video = "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video"; + dsi_panel_pwr_supply = "/fragment@6/__overlay__/dsi_panel_pwr_supply"; + dsi_panel_pwr_supply_no_labibb = "/fragment@6/__overlay__/dsi_panel_pwr_supply_no_labibb"; + dsi_panel_pwr_supply_labibb_amoled = "/fragment@6/__overlay__/dsi_panel_pwr_supply_labibb_amoled"; + dsi_rm69299_visionox_amoled_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@0"; + dsi_rm69299_visionox_amoled_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@1"; + dsi_sim_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@2"; + dsi_sim_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@3"; + dsi_sim_dsc_375_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@4"; + dsi_nt36672c_video_display = "/fragment@6/__overlay__/qcom,dsi-display@5"; + sde_dsi = "/fragment@6/__overlay__/qcom,dsi-display"; + sde_wb = "/fragment@6/__overlay__/qcom,wb-display@0"; + ext_disp = "/fragment@6/__overlay__/qcom,msm-ext-disp"; + ext_disp_audio_codec = "/fragment@6/__overlay__/qcom,msm-ext-disp/qcom,msm-ext-disp-audio-codec-rx"; + mtp_batterydata = "/fragment@11/__overlay__/qcom,battery-data"; + lpi_tlmm = "/fragment@27/__overlay__/lpi_pinctrl@627C0000"; + cdc_dmic01_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_active"; + cdc_dmic01_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_sleep"; + cdc_dmic01_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_active"; + cdc_dmic01_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_sleep"; + cdc_dmic23_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_active"; + cdc_dmic23_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_sleep"; + cdc_dmic23_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_active"; + cdc_dmic23_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_sleep"; + cdc_dmic45_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_active"; + cdc_dmic45_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_sleep"; + cdc_dmic45_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_active"; + cdc_dmic45_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_sleep"; + tx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_sleep"; + tx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_active"; + tx_swr_data0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_sleep"; + tx_swr_data0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_active"; + wsa_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_sleep"; + wsa_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_active"; + wsa_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_sleep"; + wsa_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_active"; + tx_swr_data1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_sleep"; + tx_swr_data1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_active"; + tx_swr_data2_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_sleep"; + tx_swr_data2_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_active"; + rx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_sleep"; + rx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_active"; + rx_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_sleep"; + rx_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_active"; + lpi_i2s1_sck_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_active"; + lpi_i2s1_sck_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_sleep"; + lpi_i2s1_ws_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_active"; + lpi_i2s1_ws_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_sleep"; + lpi_i2s1_sd0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_active"; + lpi_i2s1_sd0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_sleep"; + lpi_i2s1_sd1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_active"; + lpi_i2s1_sd1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_sleep"; + tx_macro = "/fragment@28/__overlay__/tx-macro@62620000"; + swr2 = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master"; + wcd938x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd938x-tx-slave"; + wcd937x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd937x-tx-slave"; + rx_macro = "/fragment@28/__overlay__/rx-macro@62600000"; + swr1 = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master"; + wcd938x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd938x-rx-slave"; + wcd937x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd937x-rx-slave"; + wsa_macro = "/fragment@28/__overlay__/wsa-macro@62640000"; + swr0 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master"; + wsa881x_0211 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211"; + wsa881x_0212 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212"; + wsa881x_0213 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213"; + wsa881x_0214 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214"; + va_macro = "/fragment@28/__overlay__/va-macro@62770000"; + wcd938x_codec = "/fragment@28/__overlay__/wcd938x-codec"; + wcd937x_codec = "/fragment@28/__overlay__/wcd937x-codec"; + cdc_dmic01_gpios = "/fragment@30/__overlay__/cdc_dmic01_pinctrl"; + cdc_dmic23_gpios = "/fragment@30/__overlay__/cdc_dmic23_pinctrl"; + cdc_dmic45_gpios = "/fragment@30/__overlay__/cdc_dmic45_pinctrl"; + wsa_swr_gpios = "/fragment@30/__overlay__/wsa_swr_clk_data_pinctrl"; + rx_swr_gpios = "/fragment@30/__overlay__/rx_swr_clk_data_pinctrl"; + tx_swr_gpios = "/fragment@30/__overlay__/tx_swr_clk_data_pinctrl"; + wsa_spkr_en1 = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl"; + wsa_spkr_en2 = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl"; + wcd_rst_gpio = "/fragment@31/__overlay__/msm_cdc_pinctrl@58"; + clock_audio_wsa_1 = "/fragment@31/__overlay__/wsa_core_clk"; + clock_audio_wsa_2 = "/fragment@31/__overlay__/wsa_npl_clk"; + clock_audio_rx_1 = "/fragment@31/__overlay__/rx_core_clk"; + clock_audio_rx_2 = "/fragment@31/__overlay__/rx_npl_clk"; + clock_audio_tx_1 = "/fragment@31/__overlay__/tx_core_clk"; + clock_audio_tx_2 = "/fragment@31/__overlay__/tx_npl_clk"; + clock_audio_va_1 = "/fragment@31/__overlay__/va_core_clk"; + clock_audio_va_2 = "/fragment@31/__overlay__/va_npl_clk"; + qupv3_se8_2hsuart = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000"; + qupv3_se8_2hsuart_pins = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins"; + qupv3_se8_2uart_tx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_active"; + qupv3_se8_2uart_rx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_active"; + qupv3_se8_2uart_tx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_sleep"; + qupv3_se8_2uart_rx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_sleep"; + sec_debug_region = "/fragment@37/__overlay__/sec_debug_region@0"; + sec_debug_autocomment = "/fragment@37/__overlay__/sec_debug_autocomment@0"; + sec_debug_rdx_bootdev = "/fragment@37/__overlay__/sec_debug_rdx_bootdev@0"; + kaslr_region = "/fragment@37/__overlay__/kaslr_region@A0001000"; + rkp_region = "/fragment@37/__overlay__/rkp_region@B0200000"; + hdm_region = "/fragment@37/__overlay__/hdm_region@A1000000"; + modem_shared_mem = "/fragment@37/__overlay__/modem_shared_mem_region@B5000000"; + usb_noti = "/fragment@60/__overlay__/usb-notifier"; + imp_list = "/fragment@65/__overlay__/imp_list"; + cdc_quin_mi2s_gpios = "/fragment@66/__overlay__/msm_cdc_pinctrl_quin"; + samsung_q6audio_adaptation = "/fragment@67/__overlay__/samsung,q6audio-adaptation"; + det_zones = "/fragment@67/__overlay__/det_zones"; + i2c_18 = "/fragment@67/__overlay__/i2c@18"; + tas256x = "/fragment@67/__overlay__/i2c@18/tas256x@4c"; + tas25xx_gpio_default = "/fragment@70/__overlay__/tas25xx_gpio_default"; + fm_lna_default = "/fragment@70/__overlay__/fm_lna_default"; + grip_i2c_active = "/fragment@71/__overlay__/grip_i2c/grip_i2c_active"; + grip_i2c_suspend = "/fragment@71/__overlay__/grip_i2c/grip_i2c_suspend"; + s2mpb03_i2c_sda_default = "/fragment@71/__overlay__/s2mpb03_i2c_sda_default"; + s2mpb03_i2c_scl_default = "/fragment@71/__overlay__/s2mpb03_i2c_scl_default"; + cam_sensor_mclk0_active = "/fragment@71/__overlay__/cam_sensor_mclk0_active"; + cam_sensor_mclk0_suspend = "/fragment@71/__overlay__/cam_sensor_mclk0_suspend"; + cam_sensor_mclk1_active = "/fragment@71/__overlay__/cam_sensor_mclk1_active"; + cam_sensor_mclk1_suspend = "/fragment@71/__overlay__/cam_sensor_mclk1_suspend"; + cam_sensor_mclk2_active = "/fragment@71/__overlay__/cam_sensor_mclk2_active"; + cam_sensor_mclk2_suspend = "/fragment@71/__overlay__/cam_sensor_mclk2_suspend"; + cam_sensor_mclk3_active = "/fragment@71/__overlay__/cam_sensor_mclk3_active"; + cam_sensor_mclk3_suspend = "/fragment@71/__overlay__/cam_sensor_mclk3_suspend"; + cam_sensor_mclk4_active = "/fragment@71/__overlay__/cam_sensor_mclk4_active"; + cam_sensor_mclk4_suspend = "/fragment@71/__overlay__/cam_sensor_mclk4_suspend"; + rcam1_sensor_reset_active = "/fragment@71/__overlay__/rcam1_sensor_reset_active"; + rcam1_sensor_reset_suspend = "/fragment@71/__overlay__/rcam1_sensor_reset_suspend"; + front_sensor_reset_active = "/fragment@71/__overlay__/front_sensor_reset_active"; + front_sensor_reset_suspend = "/fragment@71/__overlay__/front_sensor_reset_suspend"; + rcam3_sensor_reset_active = "/fragment@71/__overlay__/rcam3_sensor_reset_active"; + rcam3_sensor_reset_suspend = "/fragment@71/__overlay__/rcam3_sensor_reset_suspend"; + rcam2_sensor_reset_active = "/fragment@71/__overlay__/rcam2_sensor_reset_active"; + rcam2_sensor_reset_suspend = "/fragment@71/__overlay__/rcam2_sensor_reset_suspend"; + rcam4_sensor_reset_active = "/fragment@71/__overlay__/rcam4_sensor_reset_active"; + rcam4_sensor_reset_suspend = "/fragment@71/__overlay__/rcam4_sensor_reset_suspend"; + rcam1_sensor_vana_active = "/fragment@71/__overlay__/rcam1_sensor_vana_active"; + rcam1_sensor_vana_suspend = "/fragment@71/__overlay__/rcam1_sensor_vana_suspend"; + rcam2_sensor_vana_active = "/fragment@71/__overlay__/rcam2_sensor_vana_active"; + rcam2_sensor_vana_suspend = "/fragment@71/__overlay__/rcam2_sensor_vana_suspend"; + rcam3_sensor_vana_active = "/fragment@71/__overlay__/rcam3_sensor_vana_active"; + rcam3_sensor_vana_suspend = "/fragment@71/__overlay__/rcam3_sensor_vana_suspend"; + rcam4_sensor_vana_active = "/fragment@71/__overlay__/rcam4_sensor_vana_active"; + rcam4_sensor_vana_suspend = "/fragment@71/__overlay__/rcam4_sensor_vana_suspend"; + cam_mipi_sel_active = "/fragment@71/__overlay__/cam_mipi_sel_active"; + cam_mipi_sel_suspend = "/fragment@71/__overlay__/cam_mipi_sel_suspend"; + rcam2_sensor_vdig_active = "/fragment@71/__overlay__/rcam2_sensor_vdig_active"; + rcam2_sensor_vdig_suspend = "/fragment@71/__overlay__/rcam2_sensor_vdig_suspend"; + rcam4_sensor_vdig_active = "/fragment@71/__overlay__/rcam4_sensor_vdig_active"; + rcam4_sensor_vdig_suspend = "/fragment@71/__overlay__/rcam4_sensor_vdig_suspend"; + if_pmic_i2c_pins = "/fragment@71/__overlay__/if_pmic_i2c_pins"; + if_pmic_i2c_sleep = "/fragment@71/__overlay__/if_pmic_i2c_pins/if_pmic_i2c_sleep"; + usbpd_i2c_pins = "/fragment@71/__overlay__/usbpd_i2c_pins"; + usbpd_i2c_sleep = "/fragment@71/__overlay__/usbpd_i2c_pins/usbpd_i2c_sleep"; + mcu_reset_active = "/fragment@71/__overlay__/mcu_reset_active"; + mcu_reset_suspend = "/fragment@71/__overlay__/mcu_reset_suspend"; + mcu_clk_active = "/fragment@71/__overlay__/mcu_clk_active"; + mcu_clk_suspend = "/fragment@71/__overlay__/mcu_clk_suspend"; + torch_en_active = "/fragment@71/__overlay__/torch_en_active"; + torch_en_suspend = "/fragment@71/__overlay__/torch_en_suspend"; + grip_int_active = "/fragment@72/__overlay__/grip_int_active"; + grip_int_suspend = "/fragment@72/__overlay__/grip_int_suspend"; + i2c2 = "/fragment@77/__overlay__/i2c@2"; + s2mpb03_l1 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo1"; + s2mpb03_l2 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo2"; + s2mpb03_l3 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo3"; + s2mpb03_l4 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo4"; + s2mpb03_l5 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo5"; + s2mpb03_l6 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo6"; + s2mpb03_l7 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo7"; + tsp_int = "/fragment@82/__overlay__/tsp_int"; + qupv3_se7_i2c_pins_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp"; + qupv3_se7_i2c_active_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp/qupv3_se7_i2c_active_tsp"; + qupv3_se7_i2c_sleep_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp/qupv3_se7_i2c_sleep_tsp"; + tsp_zt = "/fragment@83/__overlay__/touchscreen@20"; + tsp_stm = "/fragment@83/__overlay__/touchscreen@49"; + key_vol_up_default = "/fragment@84/__overlay__/key_vol_up/key_vol_up_default"; + self_display_FC3_dtsi = "/fragment@87/__overlay__/self_display_FC3_dtsi"; + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD = "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + ss_dsi_panel_PBA_BOOTING_FHD = "/fragment@89/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD"; + sde_te_active = "/fragment@90/__overlay__/pmx_sde_te/sde_te_active"; + sde_te_suspend = "/fragment@90/__overlay__/pmx_sde_te/sde_te_suspend"; + pmx_sde = "/fragment@90/__overlay__/pmx_sde"; + sde_dsi_active = "/fragment@90/__overlay__/pmx_sde/sde_dsi_active"; + sde_dsi_suspend = "/fragment@90/__overlay__/pmx_sde/sde_dsi_suspend"; + sde_ub_det_default = "/fragment@91/__overlay__/pmx_sde_ub_det/sde_ub_det_default"; + sde_fg_err_default = "/fragment@92/__overlay__/pmx_sde_fg_err/sde_fg_err_default"; + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD_display = "/fragment@93/__overlay__/qcom,dsi-display@9"; + ss_dsi_panel_PBA_BOOTING_FHD_display = "/fragment@93/__overlay__/qcom,dsi-display@10"; + if_pmic_irq_default = "/fragment@99/__overlay__/if_pmic_irq/if_pmic_irq_default"; + usbpd_irq_default = "/fragment@99/__overlay__/usbpd_irq/usbpd_irq_default"; + fps_rst = "/fragment@101/__overlay__/fps_rst"; + sm5714_flash0 = "/fragment@106/__overlay__/qcom,flash_0"; + sm5714_torch0 = "/fragment@106/__overlay__/qcom,torch_0"; + led_flash0 = "/fragment@106/__overlay__/qcom,camera-flash@0"; + ois_rear = "/fragment@108/__overlay__/qcom,ois@62"; + eeprom2 = "/fragment@109/__overlay__/qcom,eeprom@0x2D"; + eeprom3 = "/fragment@109/__overlay__/qcom,eeprom@37"; + sensor_rear_macro = "/fragment@110/__overlay__/qcom,cam-sensor@4"; + eeprom4 = "/fragment@110/__overlay__/qcom,eeprom@0x3F"; + actuator_rear0 = "/fragment@111/__overlay__/qcom,actuator@0xC"; + eeprom0 = "/fragment@111/__overlay__/qcom,eeprom@50"; + eeprom1 = "/fragment@111/__overlay__/qcom,eeprom@51"; + vibrator = "/fragment@112/__overlay__/samsung,vibrator"; + nfc_qupv3_se0_i2c_sleep = "/fragment@113/__overlay__/nfc_qupv3_se0_i2c_sleep"; + nfc_clk_req_gpio = "/fragment@113/__overlay__/nfc_clk_req_gpio"; + nfc_irq_gpio = "/fragment@113/__overlay__/nfc_irq_gpio"; + nfc_ven_gpio = "/fragment@113/__overlay__/nfc_ven_gpio"; + nfc_firm_gpio = "/fragment@113/__overlay__/nfc_firm_gpio"; + nfc_ldo_en_gpio = "/fragment@113/__overlay__/nfc_ldo_en_gpio"; + hall_default = "/fragment@116/__overlay__/hall/hall_default"; + L8C = "/fragment@117/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150l_l8 = "/fragment@117/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150_l5 = "/fragment@117/__overlay__/rpmh-regulator-ldoa5/regulator-pm6150-l5"; + i2c_17 = "/fragment@117/__overlay__/i2c@17"; + }; + + __fixups__ { + mdss_mdp = "/fragment@0:target:0", "/fragment@1:target:0", "/fragment@2:target:0", "/fragment@3:target:0", "/fragment@4:target:0", "/fragment@5:target:0", "/fragment@8:target:0", "/fragment@10:target:0", "/fragment@88:target:0", "/fragment@89:target:0"; + tlmm = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-te-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-te-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-te-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-te-gpio:0", "/fragment@7/__overlay__:qcom,usbplug-cc-gpio:0", "/fragment@17/__overlay__:cd-gpios:0", "/fragment@24/__overlay__/synaptics_tcm@20:interrupt-parent:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,irq-gpio:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,reset-gpio:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:interrupt-parent:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:reset-gpios:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:irq-gpios:0", "/fragment@25/__overlay__/nq@28:qcom,nq-irq:0", "/fragment@25/__overlay__/nq@28:qcom,nq-ven:0", "/fragment@25/__overlay__/nq@28:qcom,nq-firm:0", "/fragment@25/__overlay__/nq@28:qcom,nq-clkreq:0", "/fragment@25/__overlay__/nq@28:interrupt-parent:0", "/fragment@35:target:0", "/fragment@67/__overlay__/i2c@18:gpios:0", "/fragment@67/__overlay__/i2c@18:gpios:12", "/fragment@67/__overlay__/i2c@18/tas256x@4c:ti,reset-gpio:0", "/fragment@67/__overlay__/i2c@18/tas256x@4c:ti,irq-gpio:0", "/fragment@68/__overlay__:qcom,fm-lna-gpios:0", "/fragment@70:target:0", "/fragment@71:target:0", "/fragment@73:target:0", "/fragment@77/__overlay__/i2c@2:gpios:0", "/fragment@77/__overlay__/i2c@2:gpios:12", "/fragment@82:target:0", "/fragment@83/__overlay__/touchscreen@20:zinitix,irq_gpio:0", "/fragment@83/__overlay__/touchscreen@49:stm,irq_gpio:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:qcom,platform-reset-gpio:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:qcom,platform-te-gpio:0", "/fragment@89/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD:qcom,platform-reset-gpio:0", "/fragment@90:target:0", "/fragment@97/__overlay__/sm5714@49:sm5714,irq-gpio:0", "/fragment@98/__overlay__/usbpd-sm5714@33:usbpd,usbpd_int:0", "/fragment@99:target:0", "/fragment@101:target:0", "/fragment@103/__overlay__/gw9558-spi@0:goodix,gpio_reset:0", "/fragment@104/__overlay__/gw9558@0:goodix,gpio_reset:0", "/fragment@107/__overlay__/sm5714-fled:flash-en-gpio:0", "/fragment@107/__overlay__/sm5714-fled:torch-en-gpio:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:12", "/fragment@108/__overlay__/qcom,ois@62:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:24", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:36", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:12", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:24", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:36", "/fragment@113:target:0", "/fragment@114/__overlay__/sec-nfc@27:interrupt-parent:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,ven-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,irq-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,firm-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,clk_req-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,pvdd-gpio:0", "/fragment@117/__overlay__/i2c@17:gpios:0", "/fragment@117/__overlay__/i2c@17:gpios:12"; + pm6150l_gpios = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-reset-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-reset-gpio:0", "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-bklight-en-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-en-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-reset-gpio:0", "/fragment@22:target:0", "/fragment@72:target:0", "/fragment@84:target:0", "/fragment@85/__overlay__/vol_up:gpios:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:samsung,esd-irq-gpio1:0", "/fragment@92:target:0", "/fragment@117/__overlay__/i2c@17/sx9360-i2c@28:sx9360,nirq-gpio:0"; + soc = "/fragment@6:target:0", "/fragment@11:target:0", "/fragment@23:target:0", "/fragment@31:target:0", "/fragment@34:target:0", "/fragment@60:target:0", "/fragment@67:target:0", "/fragment@77:target:0", "/fragment@86:target:0", "/fragment@87:target:0", "/fragment@93:target:0", "/fragment@104:target:0", "/fragment@106:target:0", "/fragment@112:target:0", "/fragment@115:target:0", "/fragment@117:target:0", "/fragment@119:target:0"; + mdss_dsi0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-ctrl:0"; + mdss_dsi_phy0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-phy:0"; + mdss_dsi0_pll = "/fragment@6/__overlay__/qcom,dsi-display:clocks:0", "/fragment@6/__overlay__/qcom,dsi-display:clocks:8", "/fragment@6/__overlay__/qcom,dsi-display:clocks:16", "/fragment@6/__overlay__/qcom,dsi-display:clocks:24", "/fragment@6/__overlay__/qcom,dsi-display:clocks:32", "/fragment@6/__overlay__/qcom,dsi-display:clocks:40", "/fragment@6/__overlay__/qcom,dsi-display:clocks:48", "/fragment@6/__overlay__/qcom,dsi-display:clocks:56", "/fragment@6/__overlay__/qcom,dsi-display:clocks:64", "/fragment@6/__overlay__/qcom,dsi-display:clocks:72"; + L13A = "/fragment@6/__overlay__/qcom,dsi-display:vddio-supply:0"; + L18A = "/fragment@6/__overlay__/qcom,dsi-display:vdda-3p3-supply:0"; + lcdb_ldo_vreg = "/fragment@6/__overlay__/qcom,dsi-display:lab-supply:0"; + lcdb_ncp_vreg = "/fragment@6/__overlay__/qcom,dsi-display:ibb-supply:0"; + pm6150_l18 = "/fragment@6/__overlay__/qcom,dsi-display:vci-supply:0"; + pm6150_l13 = "/fragment@6/__overlay__/qcom,dsi-display:vddi-supply:0"; + sde_dp = "/fragment@7:target:0", "/fragment@8/__overlay__:connectors:8", "/fragment@26:target:0"; + pm6150_pdphy = "/fragment@7/__overlay__:qcom,dp-usbpd-detection:0"; + sde_dp_usbplug_cc_active = "/fragment@7/__overlay__:pinctrl-0:0"; + sde_dp_usbplug_cc_suspend = "/fragment@7/__overlay__:pinctrl-1:0"; + sde_rscc = "/fragment@8/__overlay__:connectors:12"; + thermal_zones = "/fragment@9:target:0", "/fragment@18:target:0"; + pm6150_trip0 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:trip:0"; + pm6150_charger = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:cooling-device:0", "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:cooling-device:0", "/fragment@21:target:0"; + pm6150_trip1 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:trip:0"; + pm6150l_trip0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:trip:0"; + CPU0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:cooling-device:0"; + CPU1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:cooling-device:0"; + CPU2 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:cooling-device:0"; + CPU3 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:cooling-device:0"; + CPU4 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:cooling-device:0"; + CPU5 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:cooling-device:0"; + CPU6 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:cooling-device:0"; + CPU7 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:cooling-device:0"; + pm6150l_trip1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:trip:0"; + bcl_lvl0 = "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:trip:0"; + bcl_lvl1 = "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:trip:0"; + bcl_lvl2 = "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:trip:0"; + soc_trip = "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:trip:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:trip:0"; + pm6150l_vadc = "/fragment@12:target:0", "/fragment@13/__overlay__:io-channels:0", "/fragment@13/__overlay__:io-channels:8", "/fragment@13/__overlay__:io-channels:16", "/fragment@13/__overlay__:io-channels:24", "/fragment@77/__overlay__/sec_thermistor@1:io-channels:0", "/fragment@77/__overlay__/sec_thermistor@2:io-channels:0", "/fragment@80:target:0"; + pm6150l_adc_tm = "/fragment@13:target:0", "/fragment@18/__overlay__/pa-therm1:thermal-sensors:0"; + ufsphy_mem = "/fragment@14:target:0"; + pm6150_l4 = "/fragment@14/__overlay__:vdda-phy-supply:0"; + pm6150l_l3 = "/fragment@14/__overlay__:vdda-pll-supply:0", "/fragment@15/__overlay__:qcom,vddp-ref-clk-supply:0"; + ufshc_mem = "/fragment@15:target:0", "/fragment@63:target:0"; + ufs_phy_gdsc = "/fragment@15/__overlay__:vdd-hba-supply:0"; + pm6150_l19 = "/fragment@15/__overlay__:vcc-supply:0", "/fragment@16/__overlay__:vdd-supply:0"; + pm6150_l12 = "/fragment@15/__overlay__:vccq2-supply:0", "/fragment@16/__overlay__:vdd-io-supply:0"; + sdhc_1 = "/fragment@16:target:0"; + sdc1_clk_on = "/fragment@16/__overlay__:pinctrl-0:0"; + sdc1_cmd_on = "/fragment@16/__overlay__:pinctrl-0:4"; + sdc1_data_on = "/fragment@16/__overlay__:pinctrl-0:8"; + sdc1_rclk_on = "/fragment@16/__overlay__:pinctrl-0:12"; + sdc1_clk_off = "/fragment@16/__overlay__:pinctrl-1:0"; + sdc1_cmd_off = "/fragment@16/__overlay__:pinctrl-1:4"; + sdc1_data_off = "/fragment@16/__overlay__:pinctrl-1:8"; + sdc1_rclk_off = "/fragment@16/__overlay__:pinctrl-1:12"; + sdhc_2 = "/fragment@17:target:0"; + pm6150l_l9 = "/fragment@17/__overlay__:vdd-supply:0"; + pm6150l_l6 = "/fragment@17/__overlay__:vdd-io-supply:0"; + sdc2_clk_on = "/fragment@17/__overlay__:pinctrl-0:0"; + sdc2_cmd_on = "/fragment@17/__overlay__:pinctrl-0:4"; + sdc2_data_on = "/fragment@17/__overlay__:pinctrl-0:8"; + sdc2_cd_on = "/fragment@17/__overlay__:pinctrl-0:12"; + sdc2_clk_off = "/fragment@17/__overlay__:pinctrl-1:0"; + sdc2_cmd_off = "/fragment@17/__overlay__:pinctrl-1:4"; + sdc2_data_off = "/fragment@17/__overlay__:pinctrl-1:8"; + sdc2_cd_off = "/fragment@17/__overlay__:pinctrl-1:12"; + pm6150a_amoled = "/fragment@19:target:0"; + pm6150_qg = "/fragment@20:target:0"; + pm6150_vadc = "/fragment@21/__overlay__:io-channels:0", "/fragment@21/__overlay__:io-channels:8", "/fragment@21/__overlay__:io-channels:16", "/fragment@21/__overlay__:io-channels:24", "/fragment@21/__overlay__:io-channels:32", "/fragment@21/__overlay__:io-channels:40", "/fragment@21/__overlay__:io-channels:48", "/fragment@77/__overlay__/sec_thermistor@0:io-channels:0", "/fragment@79:target:0", "/fragment@118:target:0", "/fragment@119/__overlay__/battery:io-channels:0", "/fragment@119/__overlay__/battery:io-channels:8"; + qusb_phy0 = "/fragment@21/__overlay__:dpdm-supply:0", "/fragment@100:target:0"; + qupv3_se7_i2c = "/fragment@24:target:0", "/fragment@83:target:0", "/fragment@107:target:0"; + ts_active = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-0:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-0:0"; + ts_int_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:0"; + ts_reset_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:4", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:4"; + ts_release = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-2:0"; + pm6150_l10 = "/fragment@24/__overlay__/synaptics_tcm@20:vdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:vdd-supply:0", "/fragment@83/__overlay__/touchscreen@49:dvdd-supply:0"; + pm6150l_l7 = "/fragment@24/__overlay__/synaptics_tcm@20:avdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:avdd-supply:0", "/fragment@81:target:0", "/fragment@83/__overlay__/touchscreen@20:avdd-supply:0", "/fragment@83/__overlay__/touchscreen@49:avdd-supply:0"; + qupv3_se0_i2c = "/fragment@25:target:0", "/fragment@114:target:0"; + nfc_int_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:0"; + nfc_enable_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:4"; + nfc_clk_req_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:8"; + nfc_int_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:0"; + nfc_enable_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:4"; + nfc_clk_req_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:8"; + fsa4480 = "/fragment@26/__overlay__:qcom,dp-aux-switch:0", "/fragment@69:target:0"; + q6core = "/fragment@27:target:0", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:4", "/fragment@30:target:0", "/fragment@66:target:0", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:4"; + lpass_core_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:0", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:0", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:0"; + lpass_audio_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:8", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:8", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:8", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:8", "/fragment@28/__overlay__/va-macro@62770000:clocks:0"; + bolero = "/fragment@28:target:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214:qcom,bolero-handle:0", "/fragment@29/__overlay__:asoc-codec:4", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:12", "/fragment@65:target:0", "/fragment@68/__overlay__:asoc-codec:4", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:12"; + L10A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-rxtx-supply:0", "/fragment@28/__overlay__/wcd938x-codec:cdc-vddio-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-ldo-rxtx-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vddpx-1-supply:0"; + L15A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-buck-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-buck-supply:0"; + BOB = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-mic-bias-supply:0"; + atoll_snd = "/fragment@29:target:0", "/fragment@68:target:0"; + stub_codec = "/fragment@29/__overlay__:asoc-codec:0", "/fragment@68/__overlay__:asoc-codec:0"; + audio_apr = "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:0", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:0"; + spkr_1_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-0:0"; + spkr_1_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-1:0"; + spkr_2_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-0:0"; + spkr_2_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-1:0"; + wcd_reset_active = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-0:0"; + wcd_reset_sleep = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-1:0"; + va_cdc_dma_0_tx = "/fragment@32:target:0"; + aliases = "/fragment@33:target:0", "/fragment@64:target:0"; + clock_gcc = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:0", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:8", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:16"; + qupv3_1 = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:qcom,wrapper-core:0"; + dcc = "/fragment@36:target:0"; + reserved_memory = "/fragment@37:target:0", "/fragment@105:target:0"; + removed_region = "/fragment@38:target:0"; + pil_modem_mem = "/fragment@39:target:0"; + pil_adsp_mem = "/fragment@40:target:0"; + pil_camera_mem = "/fragment@41:target:0"; + pil_npu_mem = "/fragment@42:target:0"; + pil_video_mem = "/fragment@43:target:0"; + pil_cdsp_mem = "/fragment@44:target:0"; + qseecom_mem = "/fragment@45:target:0"; + qseecom_ta_mem = "/fragment@46:target:0"; + secure_carveout_heap = "/fragment@47:target:0"; + cdsp_sec_mem = "/fragment@48:target:0"; + msm_imem = "/fragment@49:target:0"; + camera = "/fragment@50:target:0"; + cam_vfe0 = "/fragment@51:target:0"; + cam_vfe1 = "/fragment@52:target:0"; + cam_vfe_lite = "/fragment@53:target:0"; + cam_lrme = "/fragment@54:target:0"; + shared_meta = "/fragment@55:target:0"; + android_q_fstab = "/fragment@56:target:0"; + pm8008_8 = "/fragment@57:target:0", "/fragment@75:target:0"; + pm8008_9 = "/fragment@58:target:0", "/fragment@76:target:0"; + usb0 = "/fragment@59:target:0"; + firmware = "/fragment@61:target:0"; + pil_modem = "/fragment@62:target:0"; + modem_smp2p_out = "/fragment@62/__overlay__:qcom,smem-states:0", "/fragment@62/__overlay__:qcom,smem-states:8", "/fragment@62/__overlay__:qcom,smem-states:16"; + pcm0 = "/fragment@68/__overlay__:asoc-platform:0"; + pcm1 = "/fragment@68/__overlay__:asoc-platform:4"; + pcm2 = "/fragment@68/__overlay__:asoc-platform:8"; + voip = "/fragment@68/__overlay__:asoc-platform:12"; + voice = "/fragment@68/__overlay__:asoc-platform:16"; + loopback = "/fragment@68/__overlay__:asoc-platform:20"; + compress = "/fragment@68/__overlay__:asoc-platform:24"; + hostless = "/fragment@68/__overlay__:asoc-platform:28"; + afe = "/fragment@68/__overlay__:asoc-platform:32"; + lsm = "/fragment@68/__overlay__:asoc-platform:36"; + routing = "/fragment@68/__overlay__:asoc-platform:40"; + compr = "/fragment@68/__overlay__:asoc-platform:44"; + pcm_noirq = "/fragment@68/__overlay__:asoc-platform:48"; + spmi_bus = "/fragment@74:target:0", "/fragment@117/__overlay__/i2c@17/sx9360-i2c@28:interrupt-parent:0"; + pm6150_gpios = "/fragment@78:target:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:samsung,ub-con-det:0", "/fragment@91:target:0", "/fragment@115/__overlay__/hall:hall,gpio_flip_cover:0", "/fragment@116:target:0"; + gpio_key = "/fragment@85:target:0"; + cont_splash_memory = "/fragment@94:target:0"; + dfps_data_memory = "/fragment@95:target:0"; + disp_rdump_memory = "/fragment@96:target:0"; + qupv3_se4_i2c = "/fragment@97:target:0"; + qupv3_se11_i2c = "/fragment@98:target:0"; + pm6150l_l11 = "/fragment@102:target:0"; + qupv3_se6_spi = "/fragment@103:target:0"; + pm6150l_switch2 = "/fragment@106/__overlay__/qcom,camera-flash@0:switch-source:0"; + qupv3_se10_i2c = "/fragment@108:target:0"; + cam_cci0 = "/fragment@109:target:0"; + titan_top_gdsc = "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@37:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:cam_clk-supply:0"; + clock_camcc = "/fragment@109/__overlay__/qcom,cam-sensor@0:clocks:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@37:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:clocks:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:clocks:0"; + cam_cci1 = "/fragment@110:target:0"; + qupv3_se9_i2c = "/fragment@111:target:0"; + apps_rsc = "/fragment@117/__overlay__/rpmh-regulator-ldoc8:mboxes:0"; + }; + + __local_fixups__ { + + fragment@0 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@1 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@2 { + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@5 { + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@6 { + + __overlay__ { + + qcom,dsi-display@0 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@1 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@2 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@3 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@4 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@5 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + qcom,dsi-display-list = <0x0 0x4>; + }; + }; + }; + + fragment@7 { + + __overlay__ { + qcom,ext-disp = <0x0>; + }; + }; + + fragment@8 { + + __overlay__ { + connectors = <0x0 0x4>; + }; + }; + + fragment@20 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@21 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@28 { + + __overlay__ { + + bolero-clk-rsc-mngr { + clocks = <0x0 0x8 0x10 0x18 0x20 0x28 0x30 0x38>; + }; + + tx-macro@62620000 { + clocks = <0x0 0x8>; + qcom,tx-swr-gpios = <0x0>; + }; + + rx-macro@62600000 { + clocks = <0x0 0x8>; + qcom,rx-swr-gpios = <0x0>; + }; + + wsa-macro@62640000 { + clocks = <0x0 0x8>; + qcom,wsa-swr-gpios = <0x0>; + + wsa_swr_master { + + wsa881x@20170211 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@20170212 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170213 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170214 { + qcom,spkr-sd-n-node = <0x0>; + }; + }; + }; + + wcd938x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + mbhc-button-thres = <0x0 0xc 0x18 0x24 0x30 0x3c 0x48 0x54>; + imp-table = <0x0 0x10 0x20 0x30 0x40 0x50 0x60 0x70>; + }; + + wcd937x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + }; + }; + }; + + fragment@29 { + + __overlay__ { + qcom,cdc-dmic01-gpios = <0x0>; + qcom,cdc-dmic23-gpios = <0x0>; + qcom,cdc-dmic45-gpios = <0x0>; + asoc-codec = <0x8>; + qcom,wsa-devs = <0x0 0x4 0x8 0xc>; + qcom,codec-aux-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@30 { + + __overlay__ { + + cdc_dmic01_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic23_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic45_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + wsa_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + rx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + tx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@34 { + + __overlay__ { + + qcom,qup_hsuart@a88000 { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@60 { + + __overlay__ { + + qcom,memshare { + + qcom,client_4 { + memory-region = <0x0>; + }; + }; + + samsung,sec_hdm { + memory-region = <0x0>; + }; + }; + }; + + fragment@66 { + + __overlay__ { + + msm_cdc_pinctrl_quin { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@67 { + + __overlay__ { + + i2c@18 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@68 { + + __overlay__ { + asoc-platform = <0x34>; + qcom,quin-mi2s-gpios = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@77 { + + __overlay__ { + + i2c@2 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@83 { + + __overlay__ { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + + touchscreen@20 { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + + touchscreen@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@85 { + + __overlay__ { + pinctrl-0 = <0x0>; + }; + }; + + fragment@88 { + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD { + ss,self_display = <0x0>; + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@89 { + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@97 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sm5714@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@98 { + + __overlay__ { + pinctrl-1 = <0x0>; + + usbpd-sm5714@33 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@103 { + + __overlay__ { + + gw9558-spi@0 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@104 { + + __overlay__ { + + gw9558@0 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@106 { + + __overlay__ { + + qcom,camera-flash@0 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,cam-res-mgr { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + }; + }; + + fragment@108 { + + __overlay__ { + + qcom,ois@62 { + cam_vaf-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@109 { + + __overlay__ { + + qcom,cam-sensor@0 { + actuator-src = <0x0>; + led-flash-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@2 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x2D { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@37 { + cam_vio-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + }; + }; + + fragment@110 { + + __overlay__ { + + qcom,cam-sensor@1 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@8 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@3 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@4 { + led-flash-src = <0x0>; + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc 0x10>; + pinctrl-1 = <0x0 0x4 0x8 0xc 0x10>; + }; + + qcom,eeprom@0x3F { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@111 { + + __overlay__ { + + qcom,actuator@0xC { + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + }; + + qcom,eeprom@50 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@51 { + cam_vio-supply = <0x0>; + }; + }; + }; + + fragment@114 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sec-nfc@27 { + pinctrl-0 = <0x0 0x4 0x8 0xc 0x10>; + }; + }; + }; + + fragment@115 { + + __overlay__ { + + hall { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@117 { + + __overlay__ { + + i2c@17 { + pinctrl-0 = <0x0>; + + sx9360-i2c@28 { + pinctrl-0 = <0x0>; + }; + }; + }; + }; + }; }; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r01.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r01.dts index 1ae382c7124c..6e70c4daac8f 100755 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r01.dts +++ b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r01.dts @@ -1,25 +1,7142 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - /dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a52q-r01.dtsi" -#include "drivers/atoll-sec-a52q-battery-common.dtsi" / { model = "Samsung A52Q PROJECT (board-id,01)"; compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 1>; - dtbo-version = <0>; + qcom,board-id = <0x22 0x1>; + dtbo-version = <0x0>; + + fragment@0 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ video mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x37 0x30>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x38ae2bc0 0x37bc55b0 0x37f8cb38 0x383540b8 0x3871b640>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x3>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@1 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ cmd mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x3da58d80 0x3c9e86e0 0x3ce04888 0x3d220a30 0x3d63cbd8>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x4>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@2 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,mdss-dsi-panel-name = "Simulator video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-mode-switch; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x0 0x0 0x0 0x1 0x0>; + qcom,panel-ack-disabled; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x5>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-video-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,cmd-to-video-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,cmd-to-video-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1 0x2 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-cmd-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,video-to-cmd-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,video-to-cmd-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@3 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-t-clk-post = <0xc>; + qcom,mdss-dsi-t-clk-pre = <0x29>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-ack-disabled; + qcom,ulps-enabled; + phandle = <0x6>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x64>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x64>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x2d0 0x28 0x2d0 0x28 0x2d0 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x1cc>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x2e4>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x21c 0x28 0x21c 0x28 0x21c 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@2 { + qcom,mdss-dsi-panel-width = <0x2d0>; + qcom,mdss-dsi-panel-height = <0x500>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x348>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x564>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x168>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x168 0x28 0x168 0x28 0x168 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + }; + }; + }; + }; + + fragment@4 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_dsc_375_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode DSC 3.75:1 dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,panel-ack-disabled; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,ulps-enabled; + phandle = <0x7>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-pulse-width = <0x10>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x8>; + qcom,mdss-dsi-v-front-porch = <0xa>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-on-command = <0x15010000 0x2ff 0x20150100 0x2 0xfb011501 0x0 0x2000115 0x1000000 0x20155 0x15010000 0x202 0x45150100 0x2 0x5401501 0x0 0x2061915 0x1000000 0x2071e 0x15010000 0x20b 0x73150100 0x2 0xc731501 0x0 0x20eb015 0x1000000 0x20fae 0x15010000 0x211 0xb8150100 0x2 0x13001501 0x0 0x2588015 0x1000000 0x25901 0x15010000 0x25a 0x150100 0x2 0x5b011501 0x0 0x25c8015 0x1000000 0x25d81 0x15010000 0x25e 0x150100 0x2 0x5f011501 0x0 0x2723115 0x1000000 0x26803 0x15010000 0x2ff 0x24150100 0x2 0xfb011501 0x0 0x2001c15 0x1000000 0x2010b 0x15010000 0x202 0xc150100 0x2 0x3011501 0x0 0x2040f15 0x1000000 0x20510 0x15010000 0x206 0x10150100 0x2 0x7101501 0x0 0x2088915 0x1000000 0x2098a 0x15010000 0x20a 0x13150100 0x2 0xb131501 0x0 0x20c1515 0x1000000 0x20d15 0x15010000 0x20e 0x17150100 0x2 0xf171501 0x0 0x2101c15 0x1000000 0x2110b 0x15010000 0x212 0xc150100 0x2 0x13011501 0x0 0x2140f15 0x1000000 0x21510 0x15010000 0x216 0x10150100 0x2 0x17101501 0x0 0x2188915 0x1000000 0x2198a 0x15010000 0x21a 0x13150100 0x2 0x1b131501 0x0 0x21c1515 0x1000000 0x21d15 0x15010000 0x21e 0x17150100 0x2 0x1f171501 0x0 0x2204015 0x1000000 0x22101 0x15010000 0x222 0x150100 0x2 0x23401501 0x0 0x2244015 0x1000000 0x2256d 0x15010000 0x226 0x40150100 0x2 0x27401501 0x0 0x2e00015 0x1000000 0x2dc21 0x15010000 0x2dd 0x22150100 0x2 0xde071501 0x0 0x2df0715 0x1000000 0x2e36d 0x15010000 0x2e1 0x7150100 0x2 0xe2071501 0x0 0x229d815 0x1000000 0x22a2a 0x15010000 0x24b 0x3150100 0x2 0x4c111501 0x0 0x24d1015 0x1000000 0x24e01 0x15010000 0x24f 0x1150100 0x2 0x50101501 0x0 0x2510015 0x1000000 0x25280 0x15010000 0x253 0x150100 0x2 0x56001501 0x0 0x2540715 0x1000000 0x25807 0x15010000 0x255 0x25150100 0x2 0x5b431501 0x0 0x25c0015 0x1000000 0x25f73 0x15010000 0x260 0x73150100 0x2 0x63221501 0x0 0x2640015 0x1000000 0x26708 0x15010000 0x268 0x4150100 0x2 0x72021501 0x0 0x27a8015 0x1000000 0x27b91 0x15010000 0x27c 0xd8150100 0x2 0x7d601501 0x0 0x27f1515 0x1000000 0x27515 0x15010000 0x2b3 0xc0150100 0x2 0xb4001501 0x0 0x2b50015 0x1000000 0x27800 0x15010000 0x279 0x150100 0x2 0x80001501 0x0 0x2830015 0x1000000 0x2930a 0x15010000 0x294 0xa150100 0x2 0x8a001501 0x0 0x29bff15 0x1000000 0x29db0 0x15010000 0x29f 0x63150100 0x2 0x98101501 0x0 0x2ec0015 0x1000000 0x2ff10 0x39010000 0x11c1 0x9200010 0x2000268 0x1bb000a 0x66704c5 0x39010000 0x3c2 0x10f01501 0x0 0x2c00315 0x1000000 0x43b03 0xa0a1501 0x0 0x2350015 0x1000000 0x2e501 0x15010000 0x2bb 0x10150100 0x2 0xfb010501 0x7800 0x2110005 0x1000078 0x22900>; + qcom,mdss-dsi-off-command = [05 01 00 00 78 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x0>; + qcom,mdss-dsi-h-back-porch = <0x0>; + qcom,mdss-dsi-h-pulse-width = <0x0>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x0>; + qcom,mdss-dsi-v-front-porch = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x0>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = <0x15010000 0x2bb 0x10150100 0x2 0xb0030501 0x7800 0x1111501 0x0 0x251ff15 0x1000000 0x25324 0x15010000 0x2ff 0x23150100 0x2 0x8051501 0x0 0x2469015 0x1000000 0x2ff10 0x15010000 0x2ff 0xf0150100 0x2 0x92011501 0x0 0x2ff1015 0x1000000 0x23500 0x5010000 0x28000129>; + qcom,mdss-dsi-off-command = <0x5010000 0x10000128 0x5010000 0x40000110>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x150505 0x201f0505 0x3020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1 0x2 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@5 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,mdss-dsi-panel-name = "nt36672c fhd plus video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x14 0x0 0x14 0x1 0x14>; + qcom,mdss-pan-physical-width-dimension = <0x4a>; + qcom,mdss-pan-physical-height-dimension = <0x83>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-cphy-mode; + qcom,mdss-dsi-t-clk-post = <0x0>; + qcom,mdss-dsi-t-clk-pre = <0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x5a 0x32>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-skip-timing-update; + qcom,dsi-dyn-clk-list = <0x3eb54a94 0x3e726713 0x3e2f838b 0x3deca00a 0x3da9bc89>; + qcom,dsi-dyn-clk-type = "constant-fps-adjust-hfp"; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,platform-bklight-en-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-en-gpio = <0xffffffff 0x4 0x0>; + phandle = <0x8>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-front-porch = <0xca>; + qcom,mdss-dsi-h-back-porch = <0x38>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0xa>; + qcom,mdss-dsi-v-front-porch = <0x50b>; + qcom,mdss-dsi-v-pulse-width = <0xa>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 b0 00 29 01 00 00 00 00 02 c0 00 29 01 00 00 00 00 03 c2 1b a0 29 01 00 00 00 00 02 ff 25 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 18 20 15 01 00 00 00 00 02 ff 2a 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 27 80 15 01 00 00 00 00 02 28 fd 29 01 00 00 00 00 02 ff f0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 5a 00 29 01 00 00 00 00 02 a0 08 29 01 00 00 00 00 02 ff d0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 09 ad 15 01 00 00 00 00 02 ff 10 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 51 ff 15 01 00 00 00 00 02 53 2c 15 01 00 00 00 00 02 ff 23 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 0a 00 15 01 00 00 00 00 02 0b 00 15 01 00 00 00 00 02 0c 00 15 01 00 00 00 00 02 0d 00 15 01 00 00 00 00 02 11 01 15 01 00 00 00 00 02 12 95 15 01 00 00 00 00 02 15 68 15 01 00 00 00 00 02 16 0b 15 01 00 00 00 00 02 6f 00 15 01 00 00 00 00 02 70 00 15 01 00 00 00 00 02 71 00 15 01 00 00 00 00 02 a0 11 15 01 00 00 00 00 02 ff f0 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 d2 52 29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 35 00 05 01 00 00 78 00 02 11 00 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x230909 0x26240909 0x9060204>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@6 { + target = <0xffffffff>; + + __overlay__ { + + dsi_panel_pwr_supply { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xab>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + }; + + qcom,panel-supply-entry@2 { + reg = <0x2>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-post-on-sleep = <0x14>; + }; + }; + + dsi_panel_pwr_supply_no_labibb { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x2>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + }; + + dsi_panel_pwr_supply_labibb_amoled { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x1>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vdda-3p3"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x3390>; + qcom,supply-disable-load = <0x50>; + }; + }; + + qcom,dsi-display@0 { + label = "dsi_rm69299_visionox_amoled_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0"; + qcom,dsi-panel = <0x3>; + qcom,dsi-display-active; + phandle = <0xac>; + }; + + qcom,dsi-display@1 { + label = "dsi_rm69299_visionox_amoled_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x4>; + phandle = <0xad>; + }; + + qcom,dsi-display@2 { + label = "dsi_sim_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x5>; + phandle = <0xae>; + }; + + qcom,dsi-display@3 { + label = "dsi_sim_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x6>; + phandle = <0xaf>; + }; + + qcom,dsi-display@4 { + label = "dsi_sim_dsc_375_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x7>; + phandle = <0xb0>; + }; + + qcom,dsi-display@5 { + label = "dsi_nt36672c_video_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + qcom,dsi-panel = <0x8>; + phandle = <0xb1>; + }; + + qcom,dsi-display { + compatible = "qcom,dsi-display"; + qcom,dsi-ctrl = <0xffffffff>; + qcom,dsi-phy = <0xffffffff>; + clocks = <0xffffffff 0x6 0xffffffff 0x9 0xffffffff 0x3 0xffffffff 0x8 0xffffffff 0xa 0xffffffff 0xd 0xffffffff 0x11 0xffffffff 0x15 0xffffffff 0x16 0xffffffff 0x19>; + clock-names = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + pinctrl-names = "panel_active", "panel_suspend"; + pinctrl-0 = <0x9 0xa 0xb 0xc>; + pinctrl-1 = <0xd 0xe 0xb 0xc>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,panel-te-source = <0x0>; + vddio-supply = <0xffffffff>; + vdda-3p3-supply = <0xffffffff>; + lab-supply = <0xffffffff>; + ibb-supply = <0xffffffff>; + qcom,dsi-display-list = <0xf 0x10>; + vci-supply = <0xffffffff>; + vddi-supply = <0xffffffff>; + phandle = <0x13>; + }; + + qcom,wb-display@0 { + compatible = "qcom,wb-display"; + cell-index = <0x0>; + label = "wb_display"; + phandle = <0x12>; + }; + + qcom,msm-ext-disp { + compatible = "qcom,msm-ext-disp"; + phandle = <0x11>; + + qcom,msm-ext-disp-audio-codec-rx { + compatible = "qcom,msm-ext-disp-audio-codec-rx"; + phandle = <0x2c>; + }; + }; + }; + }; + + fragment@7 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-usbpd-detection = <0xffffffff>; + qcom,ext-disp = <0x11>; + qcom,usbplug-cc-gpio = <0xffffffff 0x68 0x0>; + pinctrl-name = "mdss_dp_active", "mdss_dp_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + }; + }; + + fragment@8 { + target = <0xffffffff>; + + __overlay__ { + connectors = <0x12 0x13 0xffffffff 0xffffffff>; + }; + }; + + fragment@9 { + target = <0xffffffff>; + + __overlay__ { + + pm6150-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150l-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_cpu0 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl0 { + disable-thermal-zone; + + cooling-maps { + + vbat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + vbat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl1 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl2 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + soc { + disable-thermal-zone; + + cooling-maps { + + soc_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + soc_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + }; + }; + + fragment@10 { + target = <0xffffffff>; + + __overlay__ { + #cooling-cells = <0x2>; + }; + }; + + fragment@11 { + target = <0xffffffff>; + + __overlay__ { + + qcom,battery-data { + qcom,batt-id-range-pct = <0xf>; + phandle = <0x14>; + + qcom,alium_860_89032_0000_3600mAh { + qcom,max-voltage-uv = <0x426030>; + qcom,fg-cc-cv-threshold-uv = <0x423920>; + qcom,fastchg-current-ma = <0x1518>; + qcom,batt-id-kohm = <0x6b>; + qcom,battery-beta = <0x109a>; + qcom,battery-therm-kohm = <0x64>; + qcom,battery-type = "Alium_860_89032_0000_3600mAh_Jun15th2018"; + qcom,qg-batt-profile-ver = <0x64>; + qcom,jeita-fcc-ranges = <0x0 0x32 0x2625a0 0x33 0x190 0x5265c0 0x191 0x1c2 0x2625a0>; + qcom,jeita-fv-ranges = <0x0 0x32 0x40d990 0x33 0x190 0x426030 0x191 0x1c2 0x40d990>; + qcom,step-chg-ranges = <0x36ee80 0x39fbc0 0x5265c0 0x39fbc1 0x419ce0 0x36ee80 0x419ce1 0x426030 0x2625a0>; + qcom,ocv-based-step-chg; + qcom,jeita-soft-thresholds = <0x5314 0x25e3>; + qcom,jeita-hard-thresholds = <0x58cd 0x20b8>; + qcom,jeita-soft-hys-thresholds = <0x4f5e 0x2943>; + qcom,jeita-soft-fcc-ua = <0x2625a0 0x2625a0>; + qcom,jeita-soft-fv-uv = <0x40d990 0x40d990>; + + qcom,fcc1-temp-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xd62 0xdbf 0xdfd 0xe1d 0xe2e>; + }; + + qcom,fcc2-temp-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xdda 0xdf8 0xe02 0xe04 0xdff 0xdff>; + }; + + qcom,pc-temp-v1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa846 0xa903 0xa965 0xa982 0xa987 0xa757 0xa82c 0xa88b 0xa8b2 0xa8bc 0xa671 0xa747 0xa7a8 0xa7d4 0xa7e5 0xa598 0xa65f 0xa6c5 0xa6f2 0xa707 0xa4ca 0xa582 0xa5e5 0xa611 0xa627 0xa3ff 0xa4af 0xa508 0xa531 0xa546 0xa330 0xa3e1 0xa430 0xa452 0xa465 0xa25d 0xa311 0xa35c 0xa377 0xa387 0xa1a0 0xa23e 0xa287 0xa29e 0xa2ad 0xa10a 0xa17a 0xa1b1 0xa1c4 0xa1d2 0xa07e 0xa0e5 0xa0f6 0xa0f5 0xa0fc 0x9fa9 0xa061 0xa067 0xa048 0xa036 0x9e4b 0x9f9a 0x9fd6 0x9fae 0x9f81 0x9cdb 0x9e3d 0x9ee8 0x9ee6 0x9ebf 0x9bed 0x9cd1 0x9d85 0x9dc6 0x9dd7 0x9b4d 0x9bf5 0x9c67 0x9cb4 0x9cf4 0x9ad6 0x9b65 0x9bd6 0x9c18 0x9c4a 0x9a75 0x9af5 0x9b63 0x9baa 0x9bc5 0x9a1f 0x9a9b 0x9ade 0x9b13 0x9b23 0x99c4 0x9a41 0x9a3f 0x9a2d 0x9a41 0x9962 0x99c6 0x998a 0x9943 0x9959 0x98fd 0x992a 0x98b8 0x9892 0x98a0 0x9894 0x9882 0x97f4 0x9800 0x9807 0x982b 0x97c6 0x976f 0x9780 0x9781 0x97cb 0x9713 0x970f 0x970c 0x970c 0x9775 0x9697 0x96b5 0x96a2 0x96a2 0x9724 0x963e 0x965a 0x9642 0x963e 0x96db 0x95fa 0x9603 0x95e9 0x95e1 0x9698 0x95c7 0x95b7 0x9598 0x958b 0x965b 0x959d 0x9571 0x954e 0x953b 0x9627 0x9575 0x9533 0x950c 0x94f4 0x95f8 0x9550 0x94fe 0x94d1 0x94b3 0x95cc 0x952e 0x94cf 0x949b 0x947a 0x95a2 0x9511 0x94a4 0x9465 0x9440 0x9579 0x94f7 0x947f 0x9432 0x9407 0x954f 0x94d6 0x9458 0x93fe 0x93cc 0x9525 0x94b2 0x942f 0x93c6 0x938b 0x94f0 0x9484 0x9402 0x938b 0x9345 0x94a6 0x943e 0x93bf 0x9343 0x92f7 0x944c 0x93da 0x935f 0x92ed 0x92a2 0x93e6 0x936c 0x92f1 0x9288 0x923f 0x936b 0x92f1 0x9276 0x920e 0x91c6 0x92e1 0x926f 0x91f1 0x9188 0x9141 0x9248 0x91ea 0x9165 0x90ff 0x90bc 0x91cf 0x9176 0x9100 0x909b 0x905b 0x9179 0x9129 0x90c1 0x9060 0x9022 0x9159 0x910e 0x90ab 0x904f 0x9011 0x913e 0x90f9 0x909a 0x903f 0x9001 0x911a 0x90de 0x907f 0x9020 0x8fdd 0x90ac 0x9070 0x8ff7 0x8f74 0x8f1a 0x8f68 0x8f1c 0x8e9e 0x8e14 0x8db6 0x8d9d 0x8d55 0x8cd8 0x8c4c 0x8beb 0x8b59 0x8b10 0x8a94 0x8a02 0x899f 0x8849 0x87fb 0x877d 0x86e5 0x867d 0x836c 0x8325 0x82aa 0x8209 0x8197 0x7530 0x7530 0x7530 0x7530 0x7530>; + }; + + qcom,pc-temp-v2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa98d 0xa97e 0xa974 0xa960 0xa92e 0xa910 0xa7fb 0xa83a 0xa854 0xa856 0xa82f 0xa819 0xa6a3 0xa712 0xa747 0xa757 0xa738 0xa728 0xa594 0xa609 0xa64d 0xa665 0xa64a 0xa63c 0xa4c7 0xa51d 0xa566 0xa581 0xa565 0xa558 0xa3f4 0xa43e 0xa489 0xa4a2 0xa484 0xa478 0xa2af 0xa364 0xa3b3 0xa3c8 0xa3a5 0xa397 0xa162 0xa292 0xa2e4 0xa2f3 0xa2ca 0xa2b9 0xa11a 0xa1c1 0xa210 0xa21b 0xa1ef 0xa1de 0xa14f 0xa0ea 0xa131 0xa139 0xa110 0xa103 0xa17a 0xa03c 0xa071 0xa077 0xa047 0xa035 0xa046 0x9fd6 0x9ff5 0x9ff5 0x9fb3 0x9f87 0x9d6d 0x9f7f 0x9f85 0x9f81 0x9f2b 0x9ee2 0x9b88 0x9eab 0x9ea9 0x9ead 0x9e5e 0x9e1a 0x9a81 0x9c78 0x9cde 0x9d1e 0x9d16 0x9d22 0x99b8 0x9a96 0x9b46 0x9bd5 0x9bfe 0x9c3f 0x9913 0x99e8 0x9a78 0x9b4d 0x9b70 0x9b9c 0x9887 0x9977 0x99df 0x9aeb 0x9b04 0x9b0e 0x97f7 0x98f2 0x9948 0x9a53 0x9a64 0x9a58 0x975c 0x9856 0x98b5 0x9965 0x9971 0x9967 0x96c8 0x97b8 0x9827 0x987f 0x9885 0x9883 0x9649 0x9720 0x9799 0x97d3 0x97d8 0x97d6 0x95d8 0x968d 0x9711 0x9743 0x9748 0x9745 0x957d 0x9608 0x9697 0x96c6 0x96cb 0x96c8 0x9533 0x9591 0x9629 0x9658 0x965c 0x9658 0x94f4 0x952a 0x95c3 0x95f3 0x95f6 0x95f1 0x94bc 0x94d6 0x9565 0x9595 0x9598 0x9592 0x948a 0x9491 0x950e 0x953e 0x9540 0x9538 0x9458 0x9459 0x94bd 0x94f0 0x94ef 0x94e6 0x9429 0x942b 0x9471 0x94aa 0x94a5 0x949b 0x93fa 0x9403 0x942c 0x9467 0x9461 0x9456 0x93cb 0x93dc 0x93ed 0x9426 0x9422 0x9418 0x939a 0x93b7 0x93b6 0x93e7 0x93e7 0x93dd 0x9366 0x9390 0x9384 0x93a6 0x93a1 0x9392 0x9330 0x9367 0x935a 0x9364 0x9348 0x932b 0x92f5 0x933c 0x9330 0x9322 0x92ea 0x92bd 0x92b6 0x9309 0x9301 0x92e2 0x9296 0x925d 0x9274 0x92ce 0x92cf 0x92a2 0x9248 0x9208 0x922d 0x9289 0x9294 0x925e 0x91fe 0x91bc 0x91e4 0x9235 0x924a 0x9214 0x91b6 0x9173 0x919a 0x91d4 0x91f2 0x91c0 0x9166 0x9124 0x9151 0x916d 0x918d 0x9158 0x9101 0x90c0 0x910a 0x9104 0x9119 0x90da 0x9085 0x9045 0x90be 0x90a5 0x90a4 0x9064 0x9011 0x8fd4 0x9066 0x9055 0x9058 0x9026 0x8fde 0x8fa3 0x8ff1 0x9009 0x9027 0x900b 0x8fc1 0x8f87 0x8fa0 0x8fd7 0x9010 0x8ff6 0x8fb0 0x8f76 0x8f3a 0x8f9b 0x8ff2 0x8fd7 0x8f94 0x8f5b 0x8e9d 0x8f3c 0x8fa7 0x8f84 0x8f3f 0x8efc 0x8dbc 0x8e73 0x8ecd 0x8e86 0x8e46 0x8df2 0x8c72 0x8d0b 0x8d41 0x8ce7 0x8ca5 0x8c4f 0x8a95 0x8b0d 0x8b2a 0x8ad3 0x8a9a 0x8a45 0x87f8 0x8865 0x887d 0x881c 0x87ec 0x879d 0x841a 0x8496 0x84d3 0x8488 0x847e 0x8426 0x7eca 0x7f24 0x801b 0x8028 0x7f97 0x7ef0 0x6fcb 0x6e6e 0x6d71 0x6d74 0x6d50 0x6d1a>; + }; + + qcom,pc-temp-z1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x38d1 0x33b6 0x2f09 0x2da0 0x2d49 0x38bb 0x337f 0x2f0d 0x2d9e 0x2d52 0x38c3 0x3376 0x2f0b 0x2da5 0x2d5c 0x38c7 0x337e 0x2f07 0x2da7 0x2d60 0x38d3 0x3382 0x2f03 0x2da8 0x2d62 0x38eb 0x337d 0x2f01 0x2da8 0x2d64 0x38ff 0x336c 0x2f02 0x2da9 0x2d67 0x38f6 0x335e 0x2f03 0x2dac 0x2d6a 0x38d7 0x335d 0x2f05 0x2dae 0x2d6d 0x38b6 0x3362 0x2f09 0x2db1 0x2d6f 0x3896 0x3360 0x2f0d 0x2db5 0x2d72 0x3874 0x334e 0x2f0f 0x2db8 0x2d77 0x3843 0x333c 0x2f0f 0x2dbb 0x2d7b 0x3810 0x332e 0x2f0b 0x2dbb 0x2d7c 0x37ee 0x3328 0x2f04 0x2db9 0x2d7c 0x37d3 0x3329 0x2f01 0x2db7 0x2d7c 0x37b6 0x3329 0x2f04 0x2dbb 0x2d7f 0x3792 0x332c 0x2f0a 0x2dc2 0x2d85 0x3772 0x3337 0x2f14 0x2dc9 0x2d8b 0x3765 0x3349 0x2f21 0x2dce 0x2d8f 0x3763 0x335e 0x2f2c 0x2dd3 0x2d93 0x376a 0x3374 0x2f35 0x2dd8 0x2d98 0x3773 0x3384 0x2f3d 0x2ddd 0x2d9c 0x377f 0x338b 0x2f45 0x2de1 0x2da1 0x3787 0x3391 0x2f4d 0x2de7 0x2da6 0x378c 0x339a 0x2f54 0x2dec 0x2daa 0x378f 0x33a6 0x2f5b 0x2df0 0x2daf 0x3794 0x33ad 0x2f62 0x2df4 0x2db3 0x379f 0x33b2 0x2f69 0x2df8 0x2db7 0x37af 0x33ba 0x2f6f 0x2dfc 0x2dbb 0x37c7 0x33c2 0x2f75 0x2e00 0x2dbf 0x37de 0x33c9 0x2f7a 0x2e04 0x2dc4 0x37e6 0x33d1 0x2f80 0x2e08 0x2dc8 0x37ea 0x33de 0x2f86 0x2e0d 0x2dcd 0x37f0 0x33f1 0x2f8e 0x2e12 0x2dd1 0x3807 0x3403 0x2f95 0x2e17 0x2dd5 0x383b 0x3415 0x2f9d 0x2e1a 0x2dd8 0x386b 0x3422 0x2fa5 0x2e1c 0x2dda 0x3891 0x3427 0x2faa 0x2e1f 0x2ddc 0x38b0 0x3429 0x2fad 0x2e21 0x2ddd 0x38b2 0x342d 0x2fb1 0x2e23 0x2dde 0x3888 0x3439 0x2fb9 0x2e25 0x2de0 0x3873 0x3448 0x2fbf 0x2e27 0x2de1 0x386e 0x3457 0x2fc0 0x2e28 0x2de2 0x3861 0x3449 0x2fc4 0x2e29 0x2de2 0x386f 0x3454 0x2fc7 0x2e2b 0x2de2 0x3869 0x3454 0x2fc8 0x2e2b 0x2de1 0x3868 0x345b 0x2fc9 0x2e2b 0x2de2 0x385f 0x3457 0x2fcf 0x2e2c 0x2de3 0x387c 0x3452 0x2fd1 0x2e30 0x2de6 0x3886 0x346f 0x2fdb 0x2e36 0x2deb 0x38aa 0x3476 0x2ff3 0x2e3f 0x2df0 0x3895 0x349e 0x3007 0x2e4a 0x2dfa 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06>; + }; + + qcom,pc-temp-z2-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2bb8 0x2632 0x2811 0x296b 0x2a9e 0x280d 0x2a3d 0x2824 0x28fa 0x293e 0x25fe 0x2926 0x282f 0x28bc 0x28c4 0x2606 0x274d 0x282a 0x28ad 0x28ac 0x2620 0x26d2 0x281d 0x2898 0x28a6 0x262f 0x26c3 0x2815 0x288c 0x28a4 0x2631 0x26b5 0x2811 0x2887 0x28a8 0x262c 0x26aa 0x2812 0x2882 0x28ac 0x2625 0x26a2 0x2816 0x2880 0x28ac 0x261b 0x269c 0x2819 0x2884 0x28b5 0x2612 0x2698 0x2813 0x2887 0x28cc 0x2616 0x2696 0x27f3 0x288e 0x28d4 0x2626 0x2699 0x27d7 0x28ae 0x28d3 0x262c 0x26a7 0x27e8 0x28bd 0x28d4 0x2618 0x26b3 0x2814 0x289f 0x28d2 0x25f5 0x26b6 0x282a 0x2883 0x28c7 0x25e5 0x26ba 0x2827 0x288f 0x28d1 0x25e1 0x26c3 0x281d 0x28b2 0x290a 0x25dd 0x26dd 0x2837 0x28e1 0x2937 0x25d6 0x26fd 0x2894 0x2931 0x293f 0x25c9 0x271e 0x28ce 0x296a 0x293f 0x25be 0x2742 0x28b3 0x2939 0x2923 0x25b7 0x2760 0x2883 0x28bd 0x28ee 0x25b1 0x2775 0x2863 0x288b 0x28cc 0x259f 0x2784 0x284c 0x289e 0x28b4 0x2574 0x278c 0x283f 0x28b6 0x28a5 0x2552 0x2793 0x283c 0x28a9 0x28a6 0x2544 0x2797 0x283d 0x2890 0x28af 0x250b 0x2796 0x2845 0x2888 0x28ba 0x24d2 0x2793 0x2859 0x2888 0x28cd 0x24c0 0x2792 0x286f 0x288c 0x28e8 0x24b3 0x2793 0x2885 0x289f 0x290a 0x24aa 0x2795 0x289c 0x28c5 0x2934 0x24a2 0x2799 0x28b4 0x28ea 0x2962 0x249c 0x27a2 0x28ce 0x290a 0x299b 0x2498 0x27aa 0x28df 0x2925 0x29c7 0x249e 0x27b2 0x28e4 0x293c 0x29d8 0x24a4 0x27b7 0x28e7 0x2954 0x29e2 0x24ad 0x27bb 0x28ef 0x2961 0x29ed 0x24b6 0x27c0 0x28fb 0x2964 0x29f9 0x24b5 0x27c2 0x2901 0x2965 0x2a01 0x24a8 0x27b9 0x28fa 0x2971 0x2a03 0x24a4 0x279c 0x28f3 0x2981 0x2a07 0x24aa 0x26ec 0x28f1 0x2987 0x2a1d 0x246c 0x26c6 0x28d6 0x2992 0x2a3b 0x2459 0x26cc 0x28c6 0x29ad 0x2a38 0x2447 0x26dc 0x28df 0x29c9 0x2a6a 0x2449 0x26cd 0x293d 0x29ca 0x2a89 0x243a 0x26ed 0x297e 0x2a06 0x2aa5 0x243e 0x26c3 0x2925 0x29d7 0x2a55 0x2464 0x269c 0x28de 0x298a 0x29c5 0x246e 0x264f 0x28b9 0x2971 0x29af 0x2445 0x25fc 0x289b 0x2927 0x295f 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904>; + }; + + qcom,pc-temp-z3-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4c45 0x4be7 0x4bad 0x4bb7 0x4b9b 0x4d48 0x4c26 0x4bd0 0x4baa 0x4b96 0x4dd0 0x4c76 0x4bee 0x4bac 0x4b97 0x4de1 0x4cc3 0x4bfa 0x4bb4 0x4b9c 0x4dce 0x4cd9 0x4bff 0x4bb6 0x4b9f 0x4db7 0x4cdc 0x4c00 0x4bb7 0x4ba2 0x4dac 0x4cdd 0x4bfe 0x4bb5 0x4ba2 0x4da7 0x4cdd 0x4bfb 0x4bb0 0x4b9f 0x4da5 0x4ce0 0x4bf8 0x4bac 0x4b9b 0x4da2 0x4ce2 0x4bf6 0x4bac 0x4b99 0x4da0 0x4cd4 0x4bf0 0x4bac 0x4b98 0x4da5 0x4cac 0x4bdf 0x4ba7 0x4b98 0x4db6 0x4c9a 0x4bc8 0x4b9b 0x4b95 0x4dc5 0x4cb6 0x4bce 0x4b96 0x4b91 0x4db4 0x4cd7 0x4bef 0x4ba3 0x4b93 0x4d83 0x4cd1 0x4c01 0x4bb3 0x4b97 0x4d54 0x4cac 0x4bec 0x4bad 0x4b94 0x4d30 0x4c8a 0x4bd0 0x4b9c 0x4b8a 0x4d0e 0x4c6f 0x4bcf 0x4b98 0x4b87 0x4cf1 0x4c5e 0x4be1 0x4ba6 0x4b8e 0x4cd8 0x4c62 0x4bee 0x4bb3 0x4b97 0x4cc6 0x4c75 0x4bef 0x4bb3 0x4b9d 0x4cbc 0x4c87 0x4bef 0x4bae 0x4ba1 0x4cb4 0x4c93 0x4bed 0x4bad 0x4ba2 0x4cac 0x4c9c 0x4bea 0x4bb4 0x4ba0 0x4ca3 0x4c9d 0x4be9 0x4bba 0x4b9e 0x4c97 0x4c9b 0x4bef 0x4bb7 0x4b9c 0x4c8c 0x4c97 0x4bf5 0x4bb2 0x4b9a 0x4c7f 0x4c91 0x4bf6 0x4bae 0x4b98 0x4c6f 0x4c8a 0x4bf4 0x4ba9 0x4b96 0x4c5d 0x4c84 0x4bf2 0x4ba5 0x4b94 0x4c4a 0x4c7f 0x4bef 0x4ba2 0x4b91 0x4c3a 0x4c7a 0x4bea 0x4ba0 0x4b8e 0x4c2b 0x4c73 0x4be7 0x4b9f 0x4b8a 0x4c1e 0x4c6b 0x4be5 0x4b9e 0x4b86 0x4c17 0x4c65 0x4be2 0x4b9e 0x4b84 0x4c1b 0x4c5f 0x4bde 0x4b9e 0x4b84 0x4c23 0x4c5a 0x4bda 0x4b9d 0x4b86 0x4c39 0x4c56 0x4bd7 0x4b9c 0x4b86 0x4c4f 0x4c53 0x4bd6 0x4b97 0x4b83 0x4c46 0x4c4f 0x4bd4 0x4b93 0x4b81 0x4c28 0x4c4a 0x4bd2 0x4b93 0x4b82 0x4c1b 0x4c3f 0x4bd0 0x4b93 0x4b82 0x4c19 0x4bfb 0x4bcc 0x4b93 0x4b83 0x4bac 0x4bb3 0x4bb6 0x4b90 0x4b7f 0x4b91 0x4b94 0x4ba0 0x4b89 0x4b78 0x4b89 0x4b8c 0x4b9e 0x4b80 0x4b70 0x4b8b 0x4b87 0x4b8e 0x4b7e 0x4b70 0x4b74 0x4b76 0x4b83 0x4b7c 0x4b6d 0x4b78 0x4b75 0x4b98 0x4b87 0x4b7c 0x4bab 0x4b91 0x4b9b 0x4b8b 0x4b83 0x4bda 0x4b96 0x4b9d 0x4b8e 0x4b84 0x4bf2 0x4b94 0x4b99 0x4b92 0x4b87 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c>; + }; + + qcom,pc-temp-z4-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4001 0x3c8d 0x3a72 0x3978 0x397b 0x40ed 0x3c83 0x3a6f 0x39c6 0x39b9 0x40da 0x3c60 0x3a4a 0x39d2 0x39c2 0x4086 0x3c0a 0x3a21 0x39c0 0x39b5 0x4000 0x3ba1 0x39fb 0x39a7 0x399e 0x3f71 0x3b4a 0x39dc 0x3990 0x3986 0x3ef7 0x3b02 0x39c2 0x3981 0x3976 0x3e89 0x3acb 0x39ac 0x3976 0x396c 0x3e16 0x3aa0 0x39a0 0x3970 0x3966 0x3d82 0x3a79 0x399a 0x396d 0x3961 0x3cf4 0x3a50 0x3998 0x396a 0x395d 0x3cc5 0x3a2f 0x3998 0x3965 0x3959 0x3cdb 0x3a29 0x3999 0x395f 0x3951 0x3cf0 0x3a35 0x399d 0x3961 0x394e 0x3cc2 0x3a3c 0x39a2 0x3970 0x395b 0x3c4c 0x3a29 0x39a0 0x397b 0x3968 0x3beb 0x39fe 0x398c 0x396b 0x395e 0x3bb2 0x39dd 0x3979 0x394d 0x3947 0x3b8d 0x39c9 0x3978 0x394f 0x3946 0x3b7e 0x39bd 0x3982 0x3988 0x3974 0x3b75 0x39bc 0x3996 0x39ba 0x39a6 0x3b71 0x39bf 0x39ca 0x39be 0x39ab 0x3b75 0x39c9 0x39fe 0x39b9 0x399f 0x3b7b 0x39fa 0x39fe 0x39ae 0x3991 0x3b80 0x3a38 0x39df 0x3993 0x3982 0x3b85 0x3a46 0x39bf 0x397d 0x3975 0x3b8c 0x3a43 0x39a7 0x3973 0x396c 0x3b92 0x3a3e 0x3994 0x396e 0x3965 0x3b9e 0x3a2f 0x3989 0x3969 0x395f 0x3bab 0x3a18 0x3982 0x3965 0x395a 0x3bb3 0x3a05 0x397d 0x3962 0x3955 0x3bba 0x39f5 0x397b 0x395e 0x3951 0x3bbe 0x39e5 0x397a 0x395a 0x394e 0x3bbc 0x39d6 0x3979 0x395a 0x394d 0x3bb5 0x39c8 0x3979 0x395c 0x3950 0x3ba1 0x39ba 0x3978 0x395e 0x3955 0x3b72 0x39ac 0x3976 0x3961 0x395b 0x3b43 0x39a1 0x3973 0x3963 0x3961 0x3afc 0x399e 0x3970 0x3963 0x3963 0x3abc 0x399c 0x396d 0x3963 0x3960 0x3ab4 0x3999 0x396a 0x3962 0x395d 0x3abb 0x3994 0x3967 0x3960 0x395c 0x3ab9 0x3995 0x3962 0x395d 0x395b 0x3aa3 0x39d0 0x395a 0x3959 0x3958 0x3abd 0x39eb 0x3957 0x394b 0x394c 0x3ac6 0x39f6 0x3953 0x3935 0x3934 0x3acb 0x39f8 0x394d 0x3931 0x392d 0x3ac3 0x39fa 0x3959 0x3929 0x3920 0x3ad0 0x3a03 0x3961 0x3925 0x391e 0x3ac0 0x39ff 0x394e 0x392e 0x392c 0x3a9b 0x39f7 0x3956 0x3935 0x3930 0x3a8e 0x39fe 0x3959 0x3936 0x3935 0x3a94 0x3a0e 0x3963 0x3937 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936>; + }; + + qcom,pc-temp-z5-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2b3c 0x2daa 0x3498 0x4a8d 0x45cc 0x2ef0 0x3052 0x39fb 0x4721 0x484e 0x3117 0x343d 0x3f9f 0x4802 0x4a61 0x31df 0x385f 0x430e 0x4b83 0x4d9f 0x326a 0x3a69 0x44ec 0x4e02 0x5124 0x32f3 0x3bab 0x4673 0x5049 0x55e1 0x33c6 0x3ce5 0x4810 0x514c 0x5936 0x34d0 0x3e95 0x49be 0x511b 0x5a23 0x35db 0x4119 0x4b35 0x5160 0x5a1d 0x36fa 0x4312 0x4c4c 0x5327 0x5b6b 0x3859 0x42b6 0x4bad 0x5424 0x5e2c 0x3a2d 0x3f5c 0x45e6 0x5167 0x6138 0x3c44 0x3ed3 0x3ee4 0x49ed 0x6100 0x3d63 0x47a6 0x4250 0x472f 0x5e7d 0x3d9a 0x506d 0x5049 0x50b3 0x5f98 0x3db5 0x5016 0x57f1 0x5c40 0x639a 0x3dda 0x4c6d 0x532f 0x5d14 0x64bc 0x3dd6 0x4a75 0x4bb9 0x59b9 0x646c 0x3d86 0x49e6 0x55e6 0x5b90 0x6454 0x3cdc 0x49b6 0x76e4 0x6b24 0x646b 0x3bcd 0x5034 0x875d 0x7705 0x6492 0x3ad1 0x649b 0x78a4 0x6a60 0x5e9c 0x3a04 0x7968 0x6282 0x5014 0x511e 0x3939 0x8c1a 0x56c4 0x4873 0x4bc7 0x3846 0x9a39 0x4fd8 0x5026 0x4d8e 0x3716 0x9aa6 0x4dfb 0x5780 0x5074 0x35e9 0x91df 0x53c1 0x5aa0 0x53ba 0x34ed 0x87db 0x5d83 0x5d20 0x57f1 0x33ea 0x7eb5 0x65eb 0x5e8b 0x5cc6 0x32dd 0x764e 0x6eb9 0x601d 0x628a 0x31ca 0x720c 0x75c6 0x61b9 0x67fc 0x30bf 0x6fd5 0x79eb 0x63f1 0x6c9c 0x2ffa 0x6e15 0x7d26 0x6810 0x7085 0x2f5e 0x6c28 0x8068 0x6dc5 0x7165 0x2ed6 0x6a83 0x83d1 0x7653 0x6fdc 0x2e78 0x6a47 0x8529 0x7b5b 0x6e81 0x2ea9 0x6b32 0x8003 0x7adf 0x6f61 0x2f11 0x6ca0 0x7890 0x796f 0x710e 0x303e 0x6e9b 0x7749 0x7672 0x709c 0x317f 0x7119 0x77a9 0x6cad 0x6a94 0x3162 0x71bd 0x77df 0x65cc 0x65f5 0x300b 0x6c45 0x7771 0x66c4 0x66af 0x2fb0 0x60cd 0x7669 0x680b 0x6789 0x3015 0x4018 0x70b0 0x6813 0x6600 0x2ca4 0x3328 0x596b 0x6764 0x62b7 0x2bbe 0x3022 0x477d 0x6688 0x6215 0x2b68 0x2f70 0x4725 0x57da 0x5967 0x2b6c 0x2f09 0x3dd8 0x58e5 0x64be 0x2ab7 0x2db9 0x398d 0x5bd2 0x6460 0x2ae0 0x2ded 0x457f 0x6bcd 0x75c0 0x2cb0 0x2ff3 0x438f 0x6311 0x7110 0x2d80 0x2fa5 0x439f 0x6129 0x668d 0x2d89 0x2ebe 0x3ec3 0x61e3 0x62ca 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005>; + }; + + qcom,pc-temp-z6-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x409a 0x3c2e 0x39dd 0x392f 0x3913 0x416d 0x3c48 0x39ee 0x394b 0x392d 0x419b 0x3c57 0x39ee 0x3952 0x3933 0x4181 0x3c50 0x39e4 0x394f 0x3931 0x413b 0x3c33 0x39d5 0x3947 0x392a 0x40e4 0x3c0c 0x39c7 0x393d 0x3921 0x409c 0x3be5 0x39bb 0x3935 0x391b 0x4062 0x3bcb 0x39b0 0x392e 0x3915 0x4027 0x3bb9 0x39aa 0x392a 0x3910 0x3fe0 0x3ba7 0x39a7 0x3929 0x390e 0x3f9a 0x3b8a 0x39a3 0x3928 0x390c 0x3f73 0x3b64 0x399a 0x3924 0x390b 0x3f65 0x3b56 0x398e 0x391c 0x3906 0x3f55 0x3b62 0x3992 0x3919 0x3903 0x3f1e 0x3b70 0x39a4 0x3927 0x390a 0x3ec0 0x3b64 0x39ac 0x3933 0x3912 0x3e70 0x3b3f 0x3999 0x392a 0x390c 0x3e3a 0x3b22 0x3982 0x3915 0x38fe 0x3e0f 0x3b10 0x3982 0x3914 0x38fc 0x3df2 0x3b06 0x3991 0x3936 0x3915 0x3ddc 0x3b09 0x39a5 0x3953 0x3930 0x3dd2 0x3b19 0x39c1 0x3956 0x3934 0x3dd2 0x3b2e 0x39d7 0x3953 0x3934 0x3dd7 0x3b4e 0x39d6 0x394f 0x3932 0x3ddc 0x3b6d 0x39c9 0x3948 0x392b 0x3de1 0x3b75 0x39be 0x3942 0x3924 0x3de6 0x3b75 0x39b8 0x393d 0x391f 0x3dea 0x3b74 0x39b4 0x3938 0x391c 0x3dee 0x3b6e 0x39b1 0x3935 0x3919 0x3df0 0x3b64 0x39ae 0x3931 0x3916 0x3df0 0x3b5c 0x39ab 0x392e 0x3913 0x3df0 0x3b54 0x39a9 0x392b 0x3910 0x3def 0x3b4c 0x39a8 0x3928 0x390d 0x3ded 0x3b46 0x39a7 0x3928 0x390c 0x3deb 0x3b40 0x39a7 0x3929 0x390c 0x3deb 0x3b3c 0x39a6 0x392a 0x390c 0x3ded 0x3b38 0x39a4 0x392c 0x390f 0x3def 0x3b35 0x39a2 0x392d 0x3913 0x3def 0x3b35 0x39a0 0x392d 0x3914 0x3dee 0x3b36 0x399f 0x392a 0x3912 0x3deb 0x3b36 0x399e 0x3928 0x3910 0x3de2 0x3b35 0x399d 0x3927 0x3910 0x3dd8 0x3b34 0x399b 0x3927 0x390f 0x3dcd 0x3b2c 0x3997 0x3926 0x390f 0x3da1 0x3b16 0x398b 0x391d 0x3908 0x3d94 0x3b10 0x397f 0x3911 0x38f9 0x3d93 0x3b0a 0x397c 0x390a 0x38f2 0x3d8f 0x3b0c 0x3979 0x3906 0x38ec 0x3d8d 0x3b07 0x3977 0x3903 0x38ea 0x3d95 0x3b0c 0x397c 0x390d 0x38f8 0x3da1 0x3b20 0x3983 0x3914 0x38ff 0x3dbd 0x3b30 0x398c 0x3918 0x3902 0x3de0 0x3b45 0x3993 0x391d 0x3906 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d>; + }; + + qcom,pc-temp-y1-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1dae 0x1a6c 0x17b7 0x1540 0x1467 0x143b 0x1db4 0x1a6f 0x17c3 0x153f 0x1466 0x143d 0x1dc0 0x1a74 0x17ca 0x153e 0x1466 0x143e 0x1dcd 0x1a7a 0x17ce 0x153c 0x1466 0x1440 0x1dd8 0x1a7e 0x17d0 0x153b 0x1467 0x1441 0x1ddd 0x1a80 0x17d0 0x153a 0x1467 0x1443 0x1ddc 0x1a80 0x17cc 0x153a 0x1468 0x1443 0x1dda 0x1a80 0x17c6 0x153a 0x146a 0x1444 0x1dd3 0x1a7d 0x17c5 0x153b 0x146c 0x1445 0x1dbc 0x1a76 0x17c8 0x153c 0x146d 0x1446 0x1daa 0x1a70 0x17ca 0x153d 0x146f 0x1448 0x1db3 0x1a6e 0x17c6 0x153d 0x1470 0x1449 0x1dc8 0x1a6f 0x17c0 0x153d 0x1472 0x144b 0x1ddc 0x1a74 0x17c1 0x153e 0x1474 0x144d 0x1df4 0x1a85 0x17d0 0x1545 0x1479 0x1452 0x1e03 0x1a97 0x17db 0x154d 0x147c 0x1454 0x1dfa 0x1aa4 0x17df 0x154f 0x147c 0x1455 0x1de7 0x1aaf 0x17e3 0x1552 0x147d 0x1455 0x1dd8 0x1ab0 0x17e4 0x1554 0x147e 0x1456 0x1dca 0x1aa1 0x17e2 0x1555 0x1480 0x1459 0x1dc3 0x1a95 0x17e2 0x1558 0x1483 0x145c 0x1dd6 0x1a97 0x17ed 0x155c 0x1487 0x1460 0x1df9 0x1a9f 0x17fb 0x1560 0x148b 0x1463 0x1e01 0x1aa5 0x17fd 0x1565 0x148e 0x1467 0x1e00 0x1aa8 0x17f8 0x1569 0x1491 0x146a 0x1e04 0x1aac 0x17f7 0x156d 0x1493 0x146e 0x1e09 0x1ab8 0x1800 0x1571 0x1496 0x1472 0x1e0c 0x1acc 0x180b 0x1576 0x149a 0x1475 0x1e0a 0x1ad7 0x180e 0x157b 0x149d 0x1478 0x1df8 0x1adc 0x1812 0x1581 0x14a0 0x147a 0x1de0 0x1ade 0x1817 0x1586 0x14a3 0x147d 0x1dd9 0x1adb 0x181b 0x158b 0x14a7 0x1480 0x1ddb 0x1ad7 0x181f 0x1590 0x14aa 0x1484 0x1ddd 0x1ad7 0x1820 0x1593 0x14ad 0x1487 0x1de1 0x1ad5 0x1821 0x1596 0x14b0 0x1489 0x1de8 0x1ad3 0x1823 0x1599 0x14b2 0x148b 0x1df7 0x1adf 0x1827 0x159b 0x14b4 0x148c 0x1e0a 0x1aef 0x182c 0x159d 0x14b5 0x148d 0x1e0d 0x1aef 0x1831 0x159e 0x14b5 0x148e 0x1dff 0x1ae3 0x1835 0x159f 0x14b6 0x148e 0x1df5 0x1adf 0x183a 0x15a1 0x14b7 0x148f 0x1df6 0x1ae5 0x1841 0x15a5 0x14b9 0x1491 0x1df6 0x1aeb 0x184c 0x15a8 0x14ba 0x1492 0x1df6 0x1af2 0x1849 0x15aa 0x14bb 0x1493 0x1dfa 0x1af8 0x1850 0x15af 0x14be 0x1495 0x1e04 0x1b0b 0x1850 0x15b1 0x14be 0x1496 0x1e09 0x1b08 0x1859 0x15b4 0x14be 0x1496 0x1e26 0x1b0e 0x1863 0x15b4 0x14be 0x1496 0x1e37 0x1b0b 0x186b 0x15b6 0x14bf 0x1496 0x1e2c 0x1b1e 0x1867 0x15b9 0x14c2 0x1498 0x1e29 0x1b3f 0x1879 0x15c2 0x14c5 0x149b 0x1e38 0x1b5b 0x1895 0x15d1 0x14cc 0x14a0 0x1e61 0x1b5f 0x18a8 0x15e4 0x14d3 0x14a6 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac>; + }; + + qcom,pc-temp-y2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x25d6 0x28a1 0x29b8 0x2b2a 0x2b60 0x2c89 0x2638 0x287f 0x299b 0x2b15 0x2b62 0x2c51 0x2674 0x286a 0x297a 0x2afb 0x2b61 0x2bfc 0x2693 0x285f 0x2959 0x2ade 0x2b5e 0x2ba2 0x269f 0x285b 0x293d 0x2abd 0x2b58 0x2b5a 0x26a2 0x285a 0x292b 0x2a9a 0x2b51 0x2b3c 0x266c 0x2867 0x2922 0x2a6d 0x2b48 0x2b43 0x260b 0x287d 0x291b 0x2a3f 0x2b3b 0x2b4e 0x25f2 0x2878 0x2916 0x2a29 0x2b28 0x2b4d 0x25fe 0x283e 0x2912 0x2a1c 0x2b09 0x2b3a 0x2615 0x2814 0x2910 0x2a13 0x2ae5 0x2b24 0x2698 0x2862 0x291a 0x2a04 0x2ab6 0x2afb 0x2784 0x28ea 0x2933 0x29f0 0x2a85 0x2ac3 0x27ba 0x2909 0x295a 0x29f2 0x2a7a 0x2abc 0x26d8 0x28f6 0x29a8 0x2a1d 0x2a90 0x2af0 0x2601 0x28e9 0x29e0 0x2a53 0x2ab0 0x2b19 0x25e5 0x28ff 0x29fa 0x2a91 0x2aec 0x2b1b 0x25de 0x2924 0x2a0e 0x2ad0 0x2b33 0x2b18 0x25d8 0x292d 0x2a1d 0x2aef 0x2b47 0x2b23 0x25d2 0x292c 0x2a2b 0x2afc 0x2b48 0x2b59 0x25cd 0x2929 0x2a36 0x2b0a 0x2b4a 0x2b9b 0x25ca 0x28f3 0x2a3f 0x2b29 0x2b78 0x2bd9 0x25c8 0x2849 0x2a48 0x2b54 0x2bc0 0x2c13 0x25c6 0x27d1 0x2a4b 0x2b74 0x2be2 0x2c3d 0x25c3 0x275f 0x2a50 0x2b8f 0x2bf6 0x2c5c 0x25c0 0x271c 0x2a54 0x2ba1 0x2c07 0x2c71 0x25bf 0x270e 0x2a52 0x2bac 0x2c19 0x2c83 0x25be 0x2700 0x2a4a 0x2bb0 0x2c2d 0x2c96 0x25bd 0x26ed 0x2a46 0x2ba7 0x2c35 0x2cb5 0x25bc 0x26d4 0x2a44 0x2b8e 0x2c41 0x2cec 0x25bb 0x26b9 0x2a3f 0x2b80 0x2c4d 0x2d11 0x25bb 0x26a1 0x29e9 0x2b83 0x2c40 0x2d02 0x25ba 0x268b 0x294e 0x2b8f 0x2c2f 0x2cda 0x25b9 0x2672 0x290b 0x2b9c 0x2c33 0x2cca 0x25b8 0x2655 0x28fa 0x2b99 0x2c39 0x2cd1 0x25b8 0x263a 0x28ee 0x2b84 0x2c35 0x2cd6 0x25b7 0x2622 0x28e6 0x2b68 0x2c34 0x2cdc 0x25b7 0x2604 0x290b 0x2b59 0x2c39 0x2ce8 0x25b6 0x25ec 0x293c 0x2b5f 0x2c3b 0x2ce7 0x25b6 0x25de 0x291d 0x2b60 0x2c36 0x2cd1 0x25b6 0x25d4 0x28ba 0x2b5f 0x2c32 0x2cc5 0x25b6 0x25cb 0x289c 0x2b62 0x2c34 0x2ccc 0x25b6 0x25c4 0x28a6 0x2b5d 0x2c32 0x2ccf 0x25b5 0x25be 0x281b 0x2b46 0x2c13 0x2cc8 0x25b5 0x25bb 0x27d7 0x2b34 0x2c13 0x2cb0 0x25b5 0x25bb 0x27c4 0x2b11 0x2c20 0x2c82 0x25b5 0x25ba 0x2810 0x2b0d 0x2c0a 0x2c51 0x25b5 0x25b9 0x2851 0x2b23 0x2be8 0x2c48 0x25b5 0x25b8 0x2853 0x2b28 0x2bef 0x2c50 0x25b4 0x25b8 0x2837 0x2ae6 0x2c1e 0x2c3a 0x25b4 0x25b6 0x2800 0x2acc 0x2bf7 0x2bfd 0x25b4 0x25b5 0x27bc 0x2aa1 0x2b7e 0x2ba7 0x25b4 0x25b4 0x2786 0x2a49 0x2b0f 0x2b35 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a>; + }; + + qcom,pc-temp-y3-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x347a 0x3456 0x3421 0x33e5 0x33e0 0x33d8 0x356b 0x345f 0x341a 0x33e4 0x33e0 0x33da 0x35ff 0x346c 0x3416 0x33e3 0x33e0 0x33db 0x364d 0x3479 0x3416 0x33e3 0x33e0 0x33dd 0x366b 0x3484 0x3418 0x33e3 0x33e0 0x33de 0x3670 0x3489 0x341c 0x33e5 0x33e0 0x33de 0x35ec 0x3489 0x3423 0x33e8 0x33e0 0x33de 0x34fc 0x3488 0x342b 0x33ed 0x33e1 0x33de 0x34bb 0x348b 0x342e 0x33ef 0x33e1 0x33de 0x34ba 0x349e 0x342f 0x33f0 0x33e1 0x33dd 0x34bb 0x34ac 0x3430 0x33f0 0x33e1 0x33dd 0x34d3 0x349e 0x343d 0x33f7 0x33e4 0x33df 0x3504 0x3481 0x3450 0x3401 0x33e9 0x33e2 0x3510 0x3471 0x3451 0x3402 0x33ea 0x33e3 0x34ec 0x3468 0x343b 0x33fe 0x33e8 0x33e2 0x34cc 0x3462 0x3427 0x33fb 0x33e6 0x33e2 0x34d0 0x345f 0x3422 0x33fd 0x33e8 0x33e2 0x34e0 0x345d 0x341f 0x3401 0x33ec 0x33e3 0x34e7 0x345a 0x341b 0x3401 0x33ec 0x33e3 0x34e9 0x3455 0x3416 0x33f9 0x33e7 0x33e0 0x34ea 0x344f 0x3411 0x33f0 0x33e3 0x33dd 0x34ec 0x3445 0x340c 0x33e8 0x33e1 0x33dc 0x34f0 0x3435 0x3407 0x33e3 0x33e0 0x33db 0x34f5 0x3427 0x3406 0x33e2 0x33df 0x33db 0x3500 0x341c 0x3405 0x33e3 0x33de 0x33db 0x3512 0x3417 0x3405 0x33e4 0x33de 0x33da 0x3525 0x3418 0x3405 0x33e3 0x33de 0x33da 0x3539 0x341b 0x3405 0x33e3 0x33dd 0x33da 0x354f 0x341f 0x3405 0x33e5 0x33dd 0x33da 0x356b 0x3423 0x3405 0x33e9 0x33dd 0x33d9 0x358d 0x3428 0x3405 0x33ec 0x33dd 0x33d9 0x35b2 0x342d 0x3400 0x33ed 0x33de 0x33d9 0x35da 0x3434 0x33f9 0x33ec 0x33de 0x33da 0x360a 0x343c 0x33f6 0x33ec 0x33df 0x33da 0x3641 0x3449 0x33f7 0x33ea 0x33de 0x33da 0x3680 0x3458 0x33f8 0x33e8 0x33de 0x33d9 0x36c1 0x3468 0x33fb 0x33e6 0x33de 0x33d9 0x3702 0x347a 0x3402 0x33e4 0x33dd 0x33d9 0x3742 0x3490 0x3408 0x33e3 0x33dd 0x33d9 0x3781 0x34b0 0x340c 0x33e3 0x33dd 0x33d9 0x37c1 0x34dc 0x340f 0x33e3 0x33dd 0x33d9 0x3803 0x3511 0x3415 0x33e3 0x33de 0x33da 0x3845 0x3550 0x341e 0x33e3 0x33de 0x33da 0x3892 0x35a3 0x3421 0x33e4 0x33de 0x33da 0x38ea 0x3613 0x3429 0x33e3 0x33de 0x33da 0x390d 0x3642 0x3430 0x33eb 0x33df 0x33dc 0x393f 0x363e 0x3435 0x33ec 0x33e1 0x33dd 0x395c 0x3658 0x3442 0x33f0 0x33e3 0x33e0 0x398d 0x36b9 0x3451 0x33f2 0x33e2 0x33e0 0x3a0b 0x3718 0x3452 0x33ee 0x33e1 0x33dd 0x3a97 0x37a6 0x345a 0x33f0 0x33e0 0x33dd 0x3b31 0x3888 0x346f 0x33f5 0x33e3 0x33e1 0x3c10 0x3978 0x3492 0x33f9 0x33e6 0x33e4 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6>; + }; + + qcom,pc-temp-y4-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x45b5 0x41d2 0x40f2 0x406d 0x4045 0x4044 0x452b 0x41db 0x40ef 0x4073 0x4045 0x4042 0x44eb 0x41eb 0x40ef 0x4078 0x4047 0x4041 0x44e9 0x4200 0x40f2 0x407b 0x4048 0x4040 0x4515 0x421b 0x40f7 0x407d 0x404a 0x4040 0x4561 0x4239 0x40fe 0x407e 0x404b 0x4040 0x4627 0x4263 0x4106 0x407c 0x404d 0x4041 0x478b 0x428e 0x4111 0x407a 0x404e 0x4044 0x4914 0x42a4 0x411c 0x407a 0x4051 0x4046 0x4b24 0x42ad 0x4127 0x4081 0x4055 0x4049 0x4c74 0x42bc 0x4138 0x408c 0x405b 0x404d 0x4a3e 0x4407 0x419f 0x409e 0x4069 0x4059 0x4560 0x4626 0x4237 0x40b4 0x407d 0x4068 0x437a 0x4642 0x4251 0x40bd 0x4081 0x406c 0x4347 0x43a8 0x4203 0x40bf 0x407d 0x406b 0x432d 0x41b1 0x41aa 0x40c3 0x407b 0x406a 0x4320 0x41b5 0x416e 0x40ec 0x4091 0x407a 0x430d 0x41e2 0x413b 0x4129 0x40ba 0x4098 0x42ef 0x41ed 0x4117 0x412a 0x40c0 0x409d 0x42b4 0x41c5 0x40fa 0x40d1 0x4094 0x407d 0x4274 0x4198 0x40e3 0x4085 0x4066 0x405b 0x4249 0x4180 0x40d4 0x4078 0x4054 0x404d 0x4228 0x416e 0x40c8 0x4072 0x4049 0x4043 0x421f 0x416b 0x40c2 0x406f 0x4048 0x4042 0x4223 0x415f 0x40be 0x406b 0x4048 0x4042 0x422b 0x414f 0x40bb 0x4069 0x4049 0x4043 0x4231 0x4143 0x40ba 0x406b 0x404b 0x4045 0x423b 0x4137 0x40ba 0x406d 0x404e 0x4048 0x4246 0x4136 0x40b9 0x406e 0x4051 0x404c 0x4252 0x4142 0x40b4 0x4070 0x4057 0x4051 0x425e 0x4154 0x40b0 0x4072 0x405e 0x4058 0x426a 0x4167 0x40b4 0x4074 0x4068 0x4063 0x4276 0x417f 0x40bd 0x4076 0x4073 0x4070 0x4283 0x4198 0x40c4 0x4074 0x4075 0x4072 0x4290 0x41b2 0x40c9 0x4069 0x4064 0x4061 0x429c 0x41cd 0x40cd 0x405e 0x404f 0x404c 0x42a8 0x41ef 0x40d2 0x405b 0x4044 0x4043 0x42b5 0x421f 0x40d8 0x4059 0x403e 0x403f 0x42c7 0x4244 0x40dc 0x405a 0x403e 0x4040 0x42e1 0x4252 0x40e9 0x405d 0x4042 0x4045 0x4308 0x425c 0x40fd 0x4060 0x4047 0x404a 0x433b 0x4262 0x410c 0x4063 0x4048 0x404b 0x437e 0x4270 0x4118 0x4064 0x4046 0x4048 0x43d3 0x4287 0x4129 0x4061 0x403d 0x403b 0x442a 0x42c2 0x4147 0x406b 0x4041 0x403e 0x441b 0x42ef 0x4160 0x4075 0x4057 0x405a 0x441e 0x4307 0x4166 0x4084 0x4070 0x4078 0x43ed 0x432a 0x4193 0x40a2 0x4099 0x40a2 0x43d0 0x436e 0x41e6 0x40be 0x409c 0x4098 0x43e5 0x4383 0x41de 0x409e 0x406e 0x4064 0x43f6 0x4384 0x41d8 0x409e 0x4060 0x4059 0x4411 0x43a0 0x41fb 0x40bd 0x4070 0x4067 0x4463 0x43f1 0x4266 0x40fb 0x4090 0x4085 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118>; + }; + + qcom,pc-temp-y5-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2208 0x348a 0x3ab0 0x3545 0x4573 0x3634 0x2208 0x34aa 0x3839 0x3326 0x4393 0x3e82 0x269f 0x34e2 0x3660 0x31db 0x419b 0x43da 0x2f8b 0x3522 0x3519 0x3130 0x3fbf 0x46e0 0x3428 0x3557 0x345a 0x30f0 0x3e34 0x4838 0x3590 0x3572 0x341a 0x30e7 0x3d2f 0x4884 0x30ee 0x3576 0x34b3 0x32d3 0x3ca4 0x46c7 0x2869 0x3578 0x35a4 0x35e5 0x3c3f 0x4385 0x267f 0x34b6 0x35c2 0x3648 0x3b81 0x4119 0x2a54 0x3032 0x3545 0x34d0 0x3996 0x3e92 0x2ff6 0x2cf8 0x3494 0x33cf 0x387f 0x3ce5 0x37e1 0x2fd6 0x333d 0x3525 0x3964 0x3cfd 0x4112 0x360e 0x319c 0x3768 0x3acb 0x3dbd 0x4280 0x3a64 0x326c 0x37dc 0x3b0d 0x3dbf 0x373b 0x3dd4 0x395e 0x3745 0x3a7a 0x3cb2 0x2cf9 0x3f72 0x3eca 0x36d1 0x3a41 0x3bb0 0x2d03 0x3ec5 0x3f83 0x384b 0x3ae8 0x3b5d 0x2edc 0x3dc2 0x3fc3 0x3b9d 0x3c38 0x3b2b 0x2f8c 0x3d9a 0x3f92 0x3dc7 0x3e57 0x3b93 0x2f1e 0x3df3 0x3ecf 0x3f34 0x4225 0x3e9f 0x2e5c 0x3e54 0x3de6 0x3fc8 0x445b 0x4233 0x2d64 0x3c6d 0x3c08 0x3c17 0x4527 0x44e0 0x2c30 0x3697 0x3971 0x3578 0x4604 0x471b 0x2b6b 0x3248 0x38a0 0x33d2 0x4627 0x47ff 0x2b06 0x2f1a 0x38d8 0x353a 0x4512 0x484d 0x2ad4 0x2d6f 0x3925 0x3660 0x43d2 0x484f 0x2add 0x2d4c 0x3975 0x3678 0x4315 0x4790 0x2aec 0x2d55 0x39cc 0x366c 0x4294 0x45bc 0x2af3 0x2d44 0x3a34 0x38ed 0x427b 0x43ff 0x2b16 0x2d12 0x3b09 0x40ee 0x4270 0x426f 0x2b4e 0x2d07 0x3ba6 0x465a 0x4280 0x41aa 0x2b80 0x2d07 0x38cb 0x47e5 0x43ef 0x42bb 0x2ba9 0x2cec 0x3382 0x48db 0x472c 0x45f6 0x2bd0 0x2ce9 0x319e 0x48b8 0x4a98 0x495f 0x2bf8 0x2d41 0x31a4 0x45bb 0x4e8c 0x4c69 0x2c20 0x2daa 0x31b5 0x4185 0x51da 0x4ea9 0x2c45 0x2dd9 0x3221 0x3e14 0x52fb 0x508e 0x2c64 0x2d8a 0x34af 0x3aee 0x5257 0x524a 0x2c6c 0x2d32 0x3713 0x3918 0x50bc 0x5292 0x2c5a 0x2d52 0x36de 0x38bf 0x4e90 0x50e7 0x2c45 0x2d99 0x34f7 0x3913 0x4dbc 0x4f8f 0x2c53 0x2da9 0x354f 0x3906 0x4ea8 0x5136 0x2cb7 0x2d71 0x370b 0x3898 0x515e 0x56c7 0x2d6c 0x2d2c 0x33cd 0x3962 0x555b 0x5c52 0x2e6e 0x2cc8 0x325a 0x3610 0x4cc2 0x4ea4 0x2fc4 0x2d10 0x320a 0x3e49 0x4394 0x4373 0x30b0 0x2d1b 0x3431 0x3e08 0x42cc 0x40b6 0x322c 0x2e86 0x370e 0x4092 0x40be 0x3f21 0x3256 0x3099 0x3915 0x3fe1 0x3e27 0x3e5b 0x322c 0x3127 0x38b1 0x3e5f 0x428d 0x410e 0x3117 0x3039 0x38e1 0x4283 0x4414 0x4431 0x2f77 0x2f18 0x37f8 0x4528 0x4741 0x4a06 0x2e6f 0x2e5e 0x37ca 0x4396 0x477b 0x4ab1 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b>; + }; + + qcom,pc-temp-y6-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1af4 0x1607 0x1492 0x13c9 0x139d 0x1392 0x1afb 0x160e 0x148d 0x13c8 0x139d 0x1393 0x1aff 0x1616 0x148a 0x13c7 0x139d 0x1394 0x1aff 0x161e 0x148a 0x13c8 0x139d 0x1395 0x1afc 0x1626 0x148c 0x13c9 0x139e 0x1395 0x1af7 0x162e 0x148e 0x13ca 0x139f 0x1396 0x1ac7 0x1636 0x1494 0x13cc 0x139f 0x1397 0x1a78 0x163e 0x149c 0x13cf 0x13a1 0x1397 0x1a74 0x1646 0x14a1 0x13d2 0x13a2 0x1398 0x1aff 0x164c 0x14a3 0x13d4 0x13a3 0x1399 0x1b70 0x1657 0x14a8 0x13d7 0x13a5 0x139a 0x1af4 0x16ac 0x14cc 0x13e2 0x13ac 0x139f 0x19d3 0x172c 0x1503 0x13ef 0x13b5 0x13a6 0x1941 0x172c 0x150b 0x13f2 0x13b7 0x13a8 0x190e 0x1670 0x14e5 0x13f1 0x13b5 0x13a7 0x18f6 0x15e2 0x14be 0x13f0 0x13b3 0x13a7 0x18fb 0x15e4 0x14ab 0x13fd 0x13bb 0x13ac 0x1909 0x15f5 0x149c 0x1412 0x13c9 0x13b5 0x190d 0x15f9 0x148f 0x1412 0x13cb 0x13b7 0x190c 0x15ed 0x1483 0x13f3 0x13bb 0x13ab 0x190a 0x15e0 0x147a 0x13d6 0x13ab 0x139f 0x190d 0x15d6 0x1473 0x13cd 0x13a4 0x139a 0x191a 0x15ce 0x146e 0x13c8 0x13a1 0x1397 0x192c 0x15c9 0x146d 0x13c7 0x13a0 0x1397 0x1945 0x15c7 0x146e 0x13c7 0x13a0 0x1397 0x1964 0x15c6 0x146f 0x13c8 0x13a0 0x1398 0x1982 0x15cb 0x1470 0x13c9 0x13a1 0x1398 0x19a0 0x15d5 0x1473 0x13ca 0x13a2 0x1399 0x19c0 0x15e2 0x1475 0x13cc 0x13a3 0x139a 0x19e6 0x15f3 0x1476 0x13d0 0x13a5 0x139c 0x1a11 0x1607 0x1477 0x13d4 0x13a7 0x139e 0x1a3f 0x161d 0x1478 0x13d6 0x13ab 0x13a2 0x1a72 0x1638 0x1479 0x13d7 0x13af 0x13a6 0x1aa7 0x1655 0x147b 0x13d6 0x13b0 0x13a7 0x1ae0 0x1676 0x147f 0x13d2 0x13ab 0x13a2 0x1b1c 0x169b 0x1483 0x13ce 0x13a5 0x139c 0x1b59 0x16c6 0x1488 0x13cc 0x13a2 0x139a 0x1b96 0x16f8 0x1490 0x13cb 0x13a0 0x1398 0x1bd4 0x1732 0x149a 0x13ca 0x13a0 0x1399 0x1c13 0x1772 0x14a5 0x13cb 0x13a1 0x139a 0x1c51 0x17bc 0x14b0 0x13cd 0x13a3 0x139c 0x1c90 0x1811 0x14bf 0x13ce 0x13a4 0x139d 0x1cd3 0x1875 0x14d0 0x13cf 0x13a3 0x139c 0x1d22 0x18ef 0x14e0 0x13d0 0x13a1 0x1399 0x1d80 0x1984 0x14f9 0x13d2 0x13a3 0x139a 0x1da5 0x19b9 0x150c 0x13db 0x13a9 0x13a3 0x1dcf 0x19c4 0x1513 0x13e1 0x13b2 0x13ad 0x1dde 0x19e7 0x152f 0x13ec 0x13bf 0x13bb 0x1e04 0x1a57 0x155a 0x13f6 0x13c0 0x13b8 0x1e6d 0x1abf 0x1560 0x13eb 0x13b2 0x13a7 0x1edf 0x1b41 0x1573 0x13ee 0x13ae 0x13a5 0x1f66 0x1c0d 0x15ab 0x13fd 0x13b6 0x13ac 0x2034 0x1cdf 0x160e 0x1415 0x13c2 0x13b7 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4>; + }; + }; + }; + }; + }; + + fragment@12 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm1 { + reg = <0x4f>; + label = "pa_therm1"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@13 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x4d 0xffffffff 0x4e 0xffffffff 0x4f 0xffffffff 0x52>; + + pa_therm1 { + reg = <0x4f>; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + }; + }; + }; + + fragment@14 { + target = <0xffffffff>; + + __overlay__ { + compatible = "qcom,ufs-phy-qmp-v3"; + vdda-phy-supply = <0xffffffff>; + vdda-pll-supply = <0xffffffff>; + vdda-phy-max-microamp = <0xf5b4>; + vdda-pll-max-microamp = <0x477c>; + status = "ok"; + }; + }; + + fragment@15 { + target = <0xffffffff>; + + __overlay__ { + vdd-hba-supply = <0xffffffff>; + vdd-hba-fixed-regulator; + vcc-supply = <0xffffffff>; + vcc-voltage-level = <0x2d2a80 0x2d2a80>; + vcc-max-microamp = <0x927c0>; + vccq2-supply = <0xffffffff>; + vccq2-voltage-level = <0x1ab3f0 0x1dc130>; + vccq2-max-microamp = <0x927c0>; + qcom,vddp-ref-clk-supply = <0xffffffff>; + qcom,vddp-ref-clk-max-microamp = <0x64>; + status = "ok"; + }; + }; + + fragment@16 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0x8b290>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <0x1b7740 0x1b7740>; + qcom,vdd-io-current-level = <0x0 0x4f588>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + status = "ok"; + }; + }; + + fragment@17 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0xc3500>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-voltage-level = <0x1b7740 0x2d0370>; + qcom,vdd-io-current-level = <0x0 0x55f0>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + cd-gpios = <0xffffffff 0x45 0x1>; + status = "ok"; + }; + }; + + fragment@18 { + target = <0xffffffff>; + + __overlay__ { + + pa-therm1 { + polling-delay-passive = <0x0>; + polling-delay = <0x0>; + thermal-governor = "user_space"; + thermal-sensors = <0xffffffff 0x4f>; + wake-capable-sensor; + + trips { + + active-config0 { + temperature = <0x1e848>; + hysteresis = <0x3e8>; + type = "passive"; + }; + }; + }; + + quiet-therm-step { + status = "disabled"; + }; + }; + }; + + fragment@19 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@20 { + target = <0xffffffff>; + + __overlay__ { + qcom,battery-data = <0x14>; + qcom,qg-iterm-ma = <0x64>; + qcom,hold-soc-while-full; + qcom,linearize-soc; + qcom,cl-feedback-on; + }; + }; + + fragment@21 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x8 0xffffffff 0x7 0xffffffff 0x9 0xffffffff 0x6 0xffffffff 0x4f 0xffffffff 0x99 0xffffffff 0x83>; + io-channel-names = "usb_in_voltage", "usb_in_current", "chg_temp", "die_temp", "conn_temp", "sbux_res", "vph_voltage"; + qcom,battery-data = <0x14>; + qcom,auto-recharge-soc = <0x62>; + qcom,step-charging-enable; + qcom,sw-jeita-enable; + qcom,fcc-stepping-enable; + qcom,suspend-input-on-debug-batt; + qcom,sec-charger-config = <0x3>; + qcom,thermal-mitigation = <0x401640 0x3567e0 0x2dc6c0 0x2625a0 0x1e8480 0x16e360 0xf4240 0x7a120>; + dpdm-supply = <0xffffffff>; + qcom,charger-temp-max = <0x320>; + qcom,smb-temp-max = <0x320>; + qcom,fcc-step-delay-ms = <0x64>; + qcom,fcc-step-size-ua = <0x186a0>; + qcom,disable-sw-thermal-regulation; + qcom,disable-fcc-restriction; + qcom,smb-internal-pull-kohm = <0x0>; + }; + }; + + fragment@22 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + }; + }; + }; + + fragment@23 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@24 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,i2c-touch-active = "synaptics,tcm-i2c"; + + synaptics_tcm@20 { + compatible = "synaptics,tcm-i2c"; + reg = <0x20>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend", "pmx_ts_release"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + pinctrl-2 = <0xffffffff>; + vdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + synaptics,pwr-reg-name = "avdd"; + synaptics,bus-reg-name = "vdd"; + synaptics,irq-gpio = <0xffffffff 0x9 0x2008>; + synaptics,irq-on-state = <0x0>; + synaptics,reset-gpio = <0xffffffff 0x8 0x0>; + synaptics,reset-on-state = <0x0>; + synaptics,reset-active-ms = <0x14>; + synaptics,reset-delay-ms = <0xc8>; + synaptics,power-delay-ms = <0xc8>; + synaptics,ubl-i2c-addr = <0x20>; + }; + + atmel_mxt_ts@4a { + compatible = "atmel,maxtouch"; + reg = <0x4a>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + avdd-supply = <0xffffffff>; + vdd-supply = <0xffffffff>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + reset-gpios = <0xffffffff 0x8 0x0>; + irq-gpios = <0xffffffff 0x9 0x2008>; + atmel,xy_switch; + atmel,panel-coords = <0x0 0x0 0x1df 0x31f>; + atmel,display-coords = <0x0 0x0 0x153 0x301>; + }; + }; + }; + + fragment@25 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,clk-freq-out = <0xf4240>; + #address-cells = <0x1>; + #size-cells = <0x0>; + + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <0xffffffff 0x25 0x0>; + qcom,nq-ven = <0xffffffff 0xc 0x0>; + qcom,nq-firm = <0xffffffff 0x24 0x0>; + qcom,nq-clkreq = <0xffffffff 0x1f 0x0>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff>; + }; + }; + }; + + fragment@26 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-aux-switch = <0xffffffff>; + }; + }; + + fragment@27 { + target = <0xffffffff>; + + __overlay__ { + + lpi_pinctrl@627C0000 { + compatible = "qcom,lpi-pinctrl"; + reg = <0x627c0000 0x0>; + qcom,num-gpios = <0xf>; + gpio-controller; + #gpio-cells = <0x2>; + qcom,slew-reg = <0x6295a000 0x0>; + qcom,lpi-offset-tbl = <0x0 0x1000 0x2000 0x3000 0x4000 0x5000 0x6000 0x7000 0x8000 0x9000 0xa000 0xb000 0xc000 0xd000 0xe000>; + qcom,lpi-slew-offset-tbl = <0x0 0x2 0x4 0x8 0xa 0xc 0x0 0x0 0x0 0x0 0x10 0x12 0x0 0x0 0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + phandle = <0x32>; + + dmic01_clk_active { + phandle = <0x33>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic01_clk_sleep { + phandle = <0x35>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic01_data_active { + phandle = <0x34>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic01_data_sleep { + phandle = <0x36>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic23_clk_active { + phandle = <0x37>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic23_clk_sleep { + phandle = <0x39>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic23_data_active { + phandle = <0x38>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic23_data_sleep { + phandle = <0x3a>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic45_clk_active { + phandle = <0x3b>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic45_clk_sleep { + phandle = <0x3d>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic45_data_active { + phandle = <0x3c>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic45_data_sleep { + phandle = <0x3e>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + tx_swr_clk_sleep { + phandle = <0x4b>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_clk_active { + phandle = <0x47>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + tx_swr_data0_sleep { + phandle = <0x4c>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data0_active { + phandle = <0x48>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_sleep { + phandle = <0x41>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_active { + phandle = <0x3f>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_data_sleep { + phandle = <0x42>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_data_active { + phandle = <0x40>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data1_sleep { + phandle = <0x4d>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data1_active { + phandle = <0x49>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data2_sleep { + phandle = <0x4e>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data2_active { + phandle = <0x4a>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + rx_swr_clk_sleep { + phandle = <0x45>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_clk_active { + phandle = <0x43>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + rx_swr_data_sleep { + phandle = <0x46>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_data_active { + phandle = <0x44>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + lpi_i2s1_sck_active { + phandle = <0x55>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sck_sleep { + phandle = <0x59>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_ws_active { + phandle = <0x56>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_ws_sleep { + phandle = <0x5a>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd0_active { + phandle = <0x57>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd0_sleep { + phandle = <0x5b>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd1_active { + phandle = <0x58>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd1_sleep { + phandle = <0x5c>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + }; + + fragment@28 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x4>; + + bolero-clk-rsc-mngr { + compatible = "qcom,bolero-clk-rsc-mngr"; + qcom,fs-gen-sequence = <0x3000 0x1 0x3004 0x1 0x3080 0x2>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,va_mclk_mode_muxsel = <0x627a0000>; + clock-names = "tx_core_clk", "tx_npl_clk", "rx_core_clk", "rx_npl_clk", "wsa_core_clk", "wsa_npl_clk", "va_core_clk", "va_npl_clk"; + clocks = <0x15 0x0 0x16 0x0 0x17 0x0 0x18 0x0 0x19 0x0 0x1a 0x0 0x1b 0x0 0x1c 0x0>; + }; + + tx-macro@62620000 { + compatible = "qcom,tx-macro"; + reg = <0x62620000 0x0>; + clock-names = "tx_core_clk", "tx_npl_clk"; + clocks = <0x15 0x0 0x16 0x0>; + qcom,tx-swr-gpios = <0x1d>; + qcom,tx-dmic-sample-rate = <0x249f00>; + phandle = <0xb2>; + + tx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x3>; + swrm-io-base = <0x62630000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x1>; + interrupts = <0x0 0x128 0x0 0x0 0x22b 0x0>; + interrupt-names = "swr_master_irq", "swr_wake_irq"; + qcom,swr-wakeup-required = <0x0>; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x21 0xf 0x2 0x12 0x1 0x2 0x13 0x2 0x3 0x14 0x1 0x3 0x15 0x2 0x4 0x16 0x1 0x4 0x17 0x2 0x4 0x18 0x4 0x4 0x19 0x8 0x5 0x1a 0x1 0x5 0x1b 0x2 0x5 0x1c 0x4 0x5 0x1d 0x8>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + qcom,swr-mstr-irq-wakeup-capable = <0x1>; + phandle = <0xb3>; + + wcd938x-tx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170223>; + phandle = <0x24>; + }; + + wcd937x-tx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170223>; + phandle = <0x28>; + }; + }; + }; + + rx-macro@62600000 { + compatible = "qcom,rx-macro"; + reg = <0x62600000 0x0>; + clock-names = "rx_core_clk", "rx_npl_clk"; + clocks = <0x17 0x0 0x18 0x0>; + qcom,rx-swr-gpios = <0x1e>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,rx-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + phandle = <0xb4>; + + rx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x2>; + swrm-io-base = <0x62610000 0x0>; + interrupts = <0x0 0x129 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x9 0x1 0x1 0xa 0x2 0x2 0xd 0x1 0x3 0xb 0x1 0x3 0xc 0x2 0x4 0xe 0x1 0x5 0xf 0x1 0x5 0x10 0x2>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + phandle = <0xb5>; + + wcd938x-rx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170224>; + phandle = <0x23>; + }; + + wcd937x-rx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170224>; + phandle = <0x27>; + }; + }; + }; + + wsa-macro@62640000 { + compatible = "qcom,wsa-macro"; + reg = <0x62640000 0x0>; + clock-names = "wsa_core_clk", "wsa_npl_clk"; + clocks = <0x19 0x0 0x1a 0x0>; + qcom,wsa-swr-gpios = <0x1f>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,wsa-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + status = "disabled"; + phandle = <0xb6>; + + wsa_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + qcom,swr_master_id = <0x1>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + swrm-io-base = <0x62650000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x0>; + interrupts = <0x0 0x127 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x8>; + qcom,swr-port-mapping = <0x1 0x1 0x1 0x2 0x3 0xf 0x3 0x2 0x3 0x4 0x5 0x1 0x5 0x7 0xf 0x6 0x6 0x3 0x7 0x4 0x3 0x8 0x8 0x3>; + qcom,swr-num-dev = <0x2>; + phandle = <0xb7>; + + wsa881x@20170211 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170211>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2d>; + }; + + wsa881x@20170212 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170212>; + qcom,spkr-sd-n-node = <0x21>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2e>; + }; + + wsa881x@21170213 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170213>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2f>; + }; + + wsa881x@21170214 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170214>; + qcom,spkr-sd-n-node = <0x21>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x30>; + }; + }; + }; + + va-macro@62770000 { + compatible = "qcom,va-macro"; + reg = <0x62770000 0x0>; + clock-names = "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0>; + qcom,va-clk-mux-select = <0x1>; + qcom,va-island-mode-muxsel = <0x627a0000>; + qcom,va-dmic-sample-rate = <0x927c0>; + qcom,default-clk-id = <0x0>; + phandle = <0xb8>; + }; + + wcd938x-codec { + compatible = "qcom,wcd938x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x0 0x13 0x2 0x0 0x13 0x1 0x14 0x1 0x0 0x14 0x1 0x15 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x2 0x18 0x4 0x0 0x18 0x2 0x19 0x8 0x0 0x19 0x3 0x1a 0x1 0x0 0x1a 0x3 0x1b 0x2 0x0 0x1b 0x3 0x1c 0x4 0x0 0x1c 0x3 0x1d 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x22>; + qcom,rx-slave = <0x23>; + qcom,tx-slave = <0x24>; + cdc-vdd-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-rxtx-current = <0x7530>; + cdc-vddio-supply = <0xffffffff>; + qcom,cdc-vddio-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddio-current = <0x7530>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0xaf0>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-micbias4-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-rxtx", "cdc-vddio", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + mbhc-button-thres = <0x25 0xd 0x3f 0x25 0x58 0x8a 0x25 0x8a 0x8a 0x25 0xe1 0xe1 0x25 0x1c2 0x1c2 0x25 0x1c2 0x26c 0x25 0x1c2 0x26c 0x25 0x1c2 0x26c>; + imp-table = <0x26 0x0 0x5 0x6 0x26 0x6 0x17 0x8 0x26 0x18 0x26 0x7 0x26 0x27 0x64 0x6 0x26 0x65 0xa0 0xa 0x26 0xa1 0x190 0xb 0x26 0x191 0x7d0 0xb 0x26 0x7d1 0x7fffffff 0x6>; + phandle = <0x31>; + }; + + wcd937x-codec { + status = "disabled"; + compatible = "qcom,wcd937x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x1 0x13 0x1 0x0 0x14 0x1 0x14 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x3 0x18 0x1 0x0 0x1a 0x3 0x19 0x2 0x0 0x1b 0x3 0x1a 0x4 0x0 0x1c 0x3 0x1b 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x22>; + qcom,rx-slave = <0x27>; + qcom,tx-slave = <0x28>; + cdc-vdd-ldo-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-ldo-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-ldo-rxtx-current = <0x61a8>; + cdc-vddpx-1-supply = <0xffffffff>; + qcom,cdc-vddpx-1-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddpx-1-current = <0x2710>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0x708>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-ldo-rxtx", "cdc-vddpx-1", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + phandle = <0xb9>; + }; + }; + }; + + fragment@29 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,msm-mi2s-master = <0x1 0x1 0x1 0x1 0x1 0x1>; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS4", "MIC BIAS4", "Analog Mic4", "TX DMIC0", "MIC BIAS1", "MIC BIAS1", "Digital Mic0", "TX DMIC1", "MIC BIAS1", "MIC BIAS1", "Digital Mic1", "TX DMIC2", "MIC BIAS3", "MIC BIAS3", "Digital Mic2", "TX DMIC3", "MIC BIAS3", "MIC BIAS3", "Digital Mic3", "TX DMIC4", "MIC BIAS4", "MIC BIAS4", "Digital Mic4", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "IN3_AUX", "AUX_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "TX SWR_DMIC0", "DMIC1_OUTPUT", "TX SWR_DMIC1", "DMIC2_OUTPUT", "TX SWR_DMIC2", "DMIC3_OUTPUT", "TX SWR_DMIC3", "DMIC4_OUTPUT", "TX SWR_DMIC4", "DMIC5_OUTPUT", "TX SWR_DMIC5", "DMIC6_OUTPUT", "TX SWR_DMIC6", "DMIC7_OUTPUT", "TX SWR_DMIC7", "DMIC8_OUTPUT", "WSA SRC0_INP", "SRC0", "WSA_TX DEC0_INP", "TX DEC0 MUX", "WSA_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "SpkrLeft IN", "WSA_SPK1 OUT", "SpkrRight IN", "WSA_SPK2 OUT", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA MIC BIAS1", "Digital Mic0", "VA MIC BIAS1", "Digital Mic1", "VA MIC BIAS3", "Digital Mic2", "VA MIC BIAS3", "Digital Mic3", "VA MIC BIAS4", "Digital Mic4", "VA DMIC0", "VA MIC BIAS1", "VA DMIC1", "VA MIC BIAS1", "VA DMIC2", "VA MIC BIAS3", "VA DMIC3", "VA MIC BIAS3", "VA DMIC4", "VA MIC BIAS4", "VA SWR_ADC0", "VA_SWR_CLK", "VA SWR_ADC1", "VA_SWR_CLK", "VA SWR_ADC2", "VA_SWR_CLK", "VA SWR_ADC3", "VA_SWR_CLK", "VA SWR_MIC0", "VA_SWR_CLK", "VA SWR_MIC1", "VA_SWR_CLK", "VA SWR_MIC2", "VA_SWR_CLK", "VA SWR_MIC3", "VA_SWR_CLK", "VA SWR_MIC4", "VA_SWR_CLK", "VA SWR_MIC5", "VA_SWR_CLK", "VA SWR_MIC6", "VA_SWR_CLK", "VA SWR_MIC7", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT", "VA SWR_MIC0", "DMIC1_OUTPUT", "VA SWR_MIC1", "DMIC2_OUTPUT", "VA SWR_MIC2", "DMIC3_OUTPUT", "VA SWR_MIC3", "DMIC4_OUTPUT", "VA SWR_MIC4", "DMIC5_OUTPUT", "VA SWR_MIC5", "DMIC6_OUTPUT", "VA SWR_MIC6", "DMIC7_OUTPUT", "VA SWR_MIC7", "DMIC8_OUTPUT"; + qcom,msm-mbhc-hphl-swh = <0x1>; + qcom,msm-mbhc-gnd-swh = <0x1>; + qcom,cdc-dmic01-gpios = <0x29>; + qcom,cdc-dmic23-gpios = <0x2a>; + qcom,cdc-dmic45-gpios = <0x2b>; + asoc-codec = <0xffffffff 0xffffffff 0x2c>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec", "msm-ext-disp-audio-codec-rx"; + qcom,wsa-max-devs = <0x2>; + qcom,wsa-devs = <0x2d 0x2e 0x2f 0x30>; + qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight", "SpkrLeft", "SpkrRight"; + qcom,codec-max-aux-devs = <0x1>; + qcom,codec-aux-devs = <0x31>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x32 0xffffffff>; + }; + }; + + fragment@30 { + target = <0xffffffff>; + + __overlay__ { + + cdc_dmic01_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x33 0x34>; + pinctrl-1 = <0x35 0x36>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x29>; + }; + + cdc_dmic23_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x37 0x38>; + pinctrl-1 = <0x39 0x3a>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2a>; + }; + + cdc_dmic45_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3b 0x3c>; + pinctrl-1 = <0x3d 0x3e>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2b>; + }; + + wsa_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3f 0x40>; + pinctrl-1 = <0x41 0x42>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x1f>; + }; + + rx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x43 0x44>; + pinctrl-1 = <0x45 0x46>; + qcom,lpi-gpios; + phandle = <0x1e>; + }; + + tx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x47 0x48 0x49 0x4a>; + pinctrl-1 = <0x4b 0x4c 0x4d 0x4e>; + qcom,lpi-gpios; + qcom,chip-wakeup-reg = <0x1ffb000>; + qcom,chip-wakeup-maskbit = <0x0>; + qcom,chip-wakeup-default-val = <0x1>; + phandle = <0x1d>; + }; + }; + }; + + fragment@31 { + target = <0xffffffff>; + + __overlay__ { + + wsa_spkr_en1_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x20>; + }; + + wsa_spkr_en2_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x21>; + }; + + msm_cdc_pinctrl@58 { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + phandle = <0x22>; + }; + + wsa_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x3>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x309>; + #clock-cells = <0x1>; + phandle = <0x19>; + }; + + wsa_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x4>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30a>; + #clock-cells = <0x1>; + phandle = <0x1a>; + }; + + rx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x5>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30e>; + #clock-cells = <0x1>; + phandle = <0x17>; + }; + + rx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x6>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30f>; + #clock-cells = <0x1>; + phandle = <0x18>; + }; + + tx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x7>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30c>; + #clock-cells = <0x1>; + phandle = <0x15>; + }; + + tx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x8>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30d>; + #clock-cells = <0x1>; + phandle = <0x16>; + }; + + va_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x2>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30b>; + #clock-cells = <0x1>; + phandle = <0x1b>; + }; + + va_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0xa>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x310>; + #clock-cells = <0x1>; + phandle = <0x1c>; + }; + }; + }; + + fragment@32 { + target = <0xffffffff>; + + __overlay__ { + qcom,msm-dai-is-island-supported = <0x1>; + }; + }; + + fragment@33 { + target = <0xffffffff>; + + __overlay__ { + hsuart8 = "/soc/qcom,qup_hsuart@a88000"; + }; + }; + + fragment@34 { + target = <0xffffffff>; + + __overlay__ { + + qcom,qup_hsuart@a88000 { + compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; + reg = <0xa88000 0x4000>; + reg-names = "se_phys"; + clock-names = "se-clk", "m-ahb", "s-ahb"; + clocks = <0xffffffff 0x50 0xffffffff 0x5a 0xffffffff 0x5b>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4f 0x50>; + pinctrl-1 = <0x51 0x52>; + interrupts = <0x0 0x163 0x0>; + qcom,wrapper-core = <0xffffffff>; + always-on-clock; + status = "ok"; + phandle = <0xba>; + }; + }; + }; + + fragment@35 { + target = <0xffffffff>; + + __overlay__ { + + qupv3_se8_2hsuart_pins { + phandle = <0xbb>; + + qupv3_se8_2uart_tx_active { + phandle = <0x4f>; + + mux { + pins = "gpio44"; + function = "qup12"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_rx_active { + phandle = <0x50>; + + mux { + pins = "gpio45"; + function = "qup12"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_tx_sleep { + phandle = <0x51>; + + mux { + pins = "gpio44"; + function = "gpio"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + input-enable; + }; + }; + + qupv3_se8_2uart_rx_sleep { + phandle = <0x52>; + + mux { + pins = "gpio45"; + function = "gpio"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@36 { + target = <0xffffffff>; + + __overlay__ { + + dcc_curr_link@3 { + qcom,curr-link-list = <0x3>; + qcom,data-sink = "sram"; + qcom,link-list = <0x0 0x18000024 0x1 0x0 0x0 0x18000040 0x1 0x0 0x0 0x18010024 0x1 0x0 0x0 0x18010040 0x1 0x0 0x0 0x18020024 0x1 0x0 0x0 0x18020040 0x1 0x0 0x0 0x18030024 0x1 0x0 0x0 0x18030040 0x1 0x0 0x0 0x18040024 0x1 0x0 0x0 0x18040040 0x1 0x0 0x0 0x18050024 0x1 0x0 0x0 0x18050040 0x1 0x0 0x0 0x18060024 0x1 0x0 0x0 0x18060040 0x1 0x0 0x0 0x18070024 0x1 0x0 0x0 0x18070040 0x1 0x0 0x0 0x18080024 0x1 0x0 0x0 0x18080040 0x1 0x0 0x0 0x180800f8 0x1 0x0 0x0 0x18080104 0x1 0x0 0x0 0x1808011c 0x1 0x0 0x0 0x18080128 0x1 0x0 0x0 0x18321700 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18325f00 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x18321818 0x1 0x0 0x0 0x18323818 0x1 0x0 0x0 0x18326018 0x1 0x0 0x0 0x18321920 0x1 0x0 0x0 0x1832102c 0x1 0x0 0x0 0x18321044 0x1 0x0 0x0 0x18321710 0x1 0x0 0x0 0x1832176c 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18323920 0x1 0x0 0x0 0x1832302c 0x1 0x0 0x0 0x18323044 0x1 0x0 0x0 0x18323710 0x1 0x0 0x0 0x1832376c 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18326120 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18325844 0x1 0x0 0x0 0x18325f10 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280000 0x2 0x0 0x0 0x18282000 0x2 0x0 0x0 0x18284000 0x2 0x0 0x0 0x9680000 0x1 0x0 0x0 0x9680004 0x1 0x0 0x2 0x8 0x0 0x0 0x0 0x9681000 0x1 0x0 0x2 0x1 0x0 0x0 0x0 0x9681004 0x1 0x0 0x0 0x9681008 0x1 0x0 0x0 0x968100c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9698500 0x1 0x0 0x0 0x9698504 0x1 0x0 0x0 0x9698508 0x1 0x0 0x0 0x969850c 0x1 0x0 0x0 0x9698510 0x1 0x0 0x0 0x9698514 0x1 0x0 0x0 0x9698518 0x1 0x0 0x0 0x969851c 0x1 0x0 0x0 0x9698700 0x1 0x0 0x0 0x9698704 0x1 0x0 0x0 0x9698708 0x1 0x0 0x0 0x969870c 0x1 0x0 0x0 0x9698714 0x1 0x0 0x0 0x9698718 0x1 0x0 0x0 0x969871c 0x1 0x0 0x0 0x1620204 0x1 0x0 0x0 0x1620240 0x1 0x0 0x0 0x1620248 0x1 0x0 0x0 0x1620288 0x1 0x0 0x0 0x162028c 0x1 0x0 0x0 0x1620290 0x1 0x0 0x0 0x1620294 0x1 0x0 0x0 0x16202a8 0x1 0x0 0x0 0x16202ac 0x1 0x0 0x0 0x16202b0 0x1 0x0 0x0 0x16202b4 0x1 0x0 0x0 0x1620300 0x1 0x0 0x0 0x16e0404 0x1 0x0 0x0 0x16e0408 0x1 0x0 0x0 0x16e0410 0x1 0x0 0x0 0x16e0420 0x1 0x0 0x0 0x16e0424 0x1 0x0 0x0 0x16e0428 0x1 0x0 0x0 0x16e042c 0x1 0x0 0x0 0x16e0430 0x1 0x0 0x0 0x16e0434 0x1 0x0 0x0 0x16e0438 0x1 0x0 0x0 0x16e043c 0x1 0x0 0x0 0x16e0300 0x1 0x0 0x0 0x16e0304 0x1 0x0 0x0 0x16e0700 0x1 0x0 0x0 0x16e0704 0x1 0x0 0x0 0x1700c00 0x1 0x0 0x0 0x1700c08 0x1 0x0 0x0 0x1700c10 0x1 0x0 0x0 0x1700c20 0x1 0x0 0x0 0x1700c24 0x1 0x0 0x0 0x1700c28 0x1 0x0 0x0 0x1700c2c 0x1 0x0 0x0 0x1700c30 0x1 0x0 0x0 0x1700c34 0x1 0x0 0x0 0x1700c38 0x1 0x0 0x0 0x1700c3c 0x1 0x0 0x0 0x1700300 0x1 0x0 0x0 0x1700304 0x1 0x0 0x0 0x1700308 0x1 0x0 0x0 0x170030c 0x1 0x0 0x0 0x1700310 0x1 0x0 0x0 0x1700500 0x1 0x0 0x0 0x1700504 0x1 0x0 0x0 0x1700508 0x1 0x0 0x0 0x170050c 0x1 0x0 0x0 0x1700900 0x1 0x0 0x0 0x1700904 0x1 0x0 0x0 0x1700908 0x1 0x0 0x0 0x1740004 0x1 0x0 0x0 0x1740008 0x1 0x0 0x0 0x1740010 0x1 0x0 0x0 0x1740020 0x1 0x0 0x0 0x1740024 0x1 0x0 0x0 0x1740028 0x1 0x0 0x0 0x174002c 0x1 0x0 0x0 0x1740030 0x1 0x0 0x0 0x1740034 0x1 0x0 0x0 0x1740038 0x1 0x0 0x0 0x174003c 0x1 0x0 0x0 0x1740300 0x1 0x0 0x0 0x1740304 0x1 0x0 0x0 0x1740308 0x1 0x0 0x0 0x174030c 0x1 0x0 0x0 0x1740310 0x1 0x0 0x0 0x1740314 0x1 0x0 0x0 0x9698204 0x1 0x0 0x0 0x9698240 0x1 0x0 0x0 0x9698244 0x1 0x0 0x0 0x9698248 0x1 0x0 0x0 0x969824c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x9681018 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9160204 0x1 0x0 0x0 0x9160240 0x1 0x0 0x0 0x9160248 0x1 0x0 0x0 0x9160288 0x1 0x0 0x0 0x9160290 0x1 0x0 0x0 0x9160300 0x1 0x0 0x0 0x9160304 0x1 0x0 0x0 0x9160308 0x1 0x0 0x0 0x916030c 0x1 0x0 0x0 0x9160310 0x1 0x0 0x0 0x9160314 0x1 0x0 0x0 0x9160318 0x1 0x0 0x0 0x9160008 0x1 0x0 0x0 0x9160010 0x1 0x0 0x0 0x9160020 0x1 0x0 0x0 0x9160024 0x1 0x0 0x0 0x9160028 0x1 0x0 0x0 0x916002c 0x1 0x0 0x0 0x9160030 0x1 0x0 0x0 0x9160034 0x1 0x0 0x0 0x9160038 0x1 0x0 0x0 0x916003c 0x1 0x0 0x0 0x63042680 0x1 0x0 0x0 0x63042684 0x1 0x0 0x0 0x63042688 0x1 0x0 0x0 0x63042690 0x1 0x0 0x0 0x630426a0 0x1 0x0 0x0 0x630426a4 0x1 0x0 0x0 0x630426a8 0x1 0x0 0x0 0x630426ac 0x1 0x0 0x0 0x630426b0 0x1 0x0 0x0 0x630426b4 0x1 0x0 0x0 0x630426b8 0x1 0x0 0x0 0x630426bc 0x1 0x0 0x0 0x63041900 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x1620500 0x4 0x0 0x0 0x1620700 0x4 0x0 0x0 0x1620300 0x1 0x0 0x0 0x1620f00 0x2 0x0 0x0 0x1620b00 0x2 0x0 0x0 0x1700b00 0x2 0x0 0x0 0x1700700 0x3 0x0 0x0 0x9163100 0x1 0x0 0x0 0x96aa100 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x9991500 0x8 0x0 0x0 0x9050008 0x1 0x0 0x0 0x9050078 0x1 0x0 0x0 0x9236028 0x1 0x0 0x0 0x923602c 0x1 0x0 0x0 0x9236030 0x1 0x0 0x0 0x9236034 0x1 0x0 0x0 0x9236038 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x92360b0 0x1 0x0 0x0 0x9236044 0x1 0x0 0x0 0x9236048 0x1 0x0 0x0 0x923604c 0x1 0x0 0x0 0x9236050 0x1 0x0 0x0 0x923e030 0x1 0x0 0x0 0x923e034 0x1 0x0 0x0 0x9241000 0x1 0x0 0x0 0x9248058 0x1 0x0 0x0 0x924805c 0x1 0x0 0x0 0x9248060 0x1 0x0 0x0 0x9248064 0x1 0x0 0x0 0x9260410 0x1 0x0 0x0 0x92e0410 0x1 0x0 0x0 0x9260414 0x1 0x0 0x0 0x92e0414 0x1 0x0 0x0 0x9260418 0x1 0x0 0x0 0x92e0418 0x1 0x0 0x0 0x9260420 0x1 0x0 0x0 0x9260424 0x1 0x0 0x0 0x9260430 0x1 0x0 0x0 0x9260440 0x1 0x0 0x0 0x9260448 0x1 0x0 0x0 0x92604a0 0x1 0x0 0x0 0x92604b0 0x1 0x0 0x0 0x92604d0 0x2 0x0 0x0 0x9261440 0x1 0x0 0x0 0x92e0420 0x1 0x0 0x0 0x92e0424 0x1 0x0 0x0 0x92e0430 0x1 0x0 0x0 0x92e0440 0x1 0x0 0x0 0x92e0448 0x1 0x0 0x0 0x92e04a0 0x1 0x0 0x0 0x92e04b0 0x1 0x0 0x0 0x92e04d0 0x2 0x0 0x0 0x9600000 0x1 0x0 0x0 0x9601000 0x1 0x0 0x0 0x9602000 0x1 0x0 0x0 0x9603000 0x1 0x0 0x0 0x9604000 0x1 0x0 0x0 0x9605000 0x1 0x0 0x0 0x9606000 0x1 0x0 0x0 0x9607000 0x1 0x0 0x0 0x9608000 0x1 0x0 0x0 0x9609000 0x1 0x0 0x0 0x960a000 0x1 0x0 0x0 0x960b000 0x1 0x0 0x0 0x960c000 0x1 0x0 0x0 0x960d000 0x1 0x0 0x0 0x960e000 0x1 0x0 0x0 0x960f000 0x1 0x0 0x0 0x9610000 0x1 0x0 0x0 0x9611000 0x1 0x0 0x0 0x9612000 0x1 0x0 0x0 0x9613000 0x1 0x0 0x0 0x9614000 0x1 0x0 0x0 0x9615000 0x1 0x0 0x0 0x9616000 0x1 0x0 0x0 0x9617000 0x1 0x0 0x0 0x9618000 0x1 0x0 0x0 0x9619000 0x1 0x0 0x0 0x961a000 0x1 0x0 0x0 0x961b000 0x1 0x0 0x0 0x961c000 0x1 0x0 0x0 0x961d000 0x1 0x0 0x0 0x961e000 0x1 0x0 0x0 0x961f000 0x1 0x0 0x0 0x9600004 0x1 0x0 0x0 0x9601004 0x1 0x0 0x0 0x9602004 0x1 0x0 0x0 0x9603004 0x1 0x0 0x0 0x9604004 0x1 0x0 0x0 0x9605004 0x1 0x0 0x0 0x9606004 0x1 0x0 0x0 0x9607004 0x1 0x0 0x0 0x9608004 0x1 0x0 0x0 0x9609004 0x1 0x0 0x0 0x960a004 0x1 0x0 0x0 0x960b004 0x1 0x0 0x0 0x960c004 0x1 0x0 0x0 0x960d004 0x1 0x0 0x0 0x960e004 0x1 0x0 0x0 0x960f004 0x1 0x0 0x0 0x9610004 0x1 0x0 0x0 0x9611004 0x1 0x0 0x0 0x9612004 0x1 0x0 0x0 0x9613004 0x1 0x0 0x0 0x9614004 0x1 0x0 0x0 0x9615004 0x1 0x0 0x0 0x9616004 0x1 0x0 0x0 0x9617004 0x1 0x0 0x0 0x9618004 0x1 0x0 0x0 0x9619004 0x1 0x0 0x0 0x961a004 0x1 0x0 0x0 0x961b004 0x1 0x0 0x0 0x961c004 0x1 0x0 0x0 0x961d004 0x1 0x0 0x0 0x961e004 0x1 0x0 0x0 0x961f004 0x1 0x0 0x0 0x9266418 0x1 0x0 0x0 0x92e6418 0x1 0x0 0x0 0x9265804 0x1 0x0 0x0 0x92e5804 0x1 0x0 0x0 0x92604b8 0x1 0x0 0x0 0x92e04b8 0x1 0x0 0x0 0xc201244 0x1 0x0 0x0 0xc202244 0x1 0x0 0x0 0x18100c18 0x1 0x0 0x0 0x18101c18 0x1 0x0 0x0 0x18300000 0x1 0x0 0x0 0x183a3a84 0x2 0x0 0x0 0x18393a84 0x1 0x0 0x0 0x100000 0x1 0x0 0x0 0x100004 0x1 0x0 0x0 0x100008 0x1 0x0 0x0 0x10000c 0x1 0x0 0x0 0x100010 0x1 0x0 0x0 0x100014 0x1 0x0 0x0 0x100018 0x1 0x0 0x0 0x10001c 0x1 0x0 0x0 0x100020 0x1 0x0 0x0 0x100024 0x1 0x0 0x0 0x100028 0x1 0x0 0x0 0x10002c 0x1 0x0 0x0 0x100030 0x1 0x0 0x0 0x100034 0x1 0x0 0x0 0x100100 0x1 0x0 0x0 0x100104 0x1 0x0 0x0 0x100108 0x1 0x0 0x0 0x10010c 0x1 0x0 0x0 0x101000 0x1 0x0 0x0 0x101004 0x1 0x0 0x0 0x101008 0x1 0x0 0x0 0x10100c 0x1 0x0 0x0 0x101010 0x1 0x0 0x0 0x101014 0x1 0x0 0x0 0x101018 0x1 0x0 0x0 0x10101c 0x1 0x0 0x0 0x101020 0x1 0x0 0x0 0x101024 0x1 0x0 0x0 0x101028 0x1 0x0 0x0 0x10102c 0x1 0x0 0x0 0x101030 0x1 0x0 0x0 0x101034 0x1 0x0 0x0 0x102000 0x1 0x0 0x0 0x102004 0x1 0x0 0x0 0x102008 0x1 0x0 0x0 0x10200c 0x1 0x0 0x0 0x102010 0x1 0x0 0x0 0x102014 0x1 0x0 0x0 0x102018 0x1 0x0 0x0 0x10201c 0x1 0x0 0x0 0x102020 0x1 0x0 0x0 0x102024 0x1 0x0 0x0 0x102028 0x1 0x0 0x0 0x10202c 0x1 0x0 0x0 0x102030 0x1 0x0 0x0 0x102034 0x1 0x0 0x0 0x103000 0x1 0x0 0x0 0x103004 0x1 0x0 0x0 0x103008 0x1 0x0 0x0 0x10300c 0x1 0x0 0x0 0x103010 0x1 0x0 0x0 0x103014 0x1 0x0 0x0 0x103018 0x1 0x0 0x0 0x10301c 0x1 0x0 0x0 0x103020 0x1 0x0 0x0 0x103024 0x1 0x0 0x0 0x103028 0x1 0x0 0x0 0x10302c 0x1 0x0 0x0 0x103030 0x1 0x0 0x0 0x103034 0x1 0x0 0x0 0x113000 0x1 0x0 0x0 0x113004 0x1 0x0 0x0 0x113008 0x1 0x0 0x0 0x11300c 0x1 0x0 0x0 0x113010 0x1 0x0 0x0 0x113014 0x1 0x0 0x0 0x113018 0x1 0x0 0x0 0x11301c 0x1 0x0 0x0 0x113020 0x1 0x0 0x0 0x113024 0x1 0x0 0x0 0x113028 0x1 0x0 0x0 0x11302c 0x1 0x0 0x0 0x113030 0x1 0x0 0x0 0x113034 0x1 0x0 0x0 0x11a000 0x1 0x0 0x0 0x11a004 0x1 0x0 0x0 0x11a008 0x1 0x0 0x0 0x11a00c 0x1 0x0 0x0 0x11a010 0x1 0x0 0x0 0x11a014 0x1 0x0 0x0 0x11a018 0x1 0x0 0x0 0x11a01c 0x1 0x0 0x0 0x11a020 0x1 0x0 0x0 0x11a024 0x1 0x0 0x0 0x11a028 0x1 0x0 0x0 0x11a02c 0x1 0x0 0x0 0x11a030 0x1 0x0 0x0 0x11a034 0x1 0x0 0x0 0x11b000 0x1 0x0 0x0 0x11b004 0x1 0x0 0x0 0x11b008 0x1 0x0 0x0 0x11b00c 0x1 0x0 0x0 0x11b010 0x1 0x0 0x0 0x11b014 0x1 0x0 0x0 0x11b018 0x1 0x0 0x0 0x11b01c 0x1 0x0 0x0 0x11b020 0x1 0x0 0x0 0x11b024 0x1 0x0 0x0 0x11b028 0x1 0x0 0x0 0x11b02c 0x1 0x0 0x0 0x11b030 0x1 0x0 0x0 0x11b034 0x1 0x0 0x0 0x174000 0x1 0x0 0x0 0x174004 0x1 0x0 0x0 0x174008 0x1 0x0 0x0 0x17400c 0x1 0x0 0x0 0x174010 0x1 0x0 0x0 0x174014 0x1 0x0 0x0 0x174018 0x1 0x0 0x0 0x17401c 0x1 0x0 0x0 0x174020 0x1 0x0 0x0 0x174024 0x1 0x0 0x0 0x174028 0x1 0x0 0x0 0x17402c 0x1 0x0 0x0 0x174030 0x1 0x0 0x0 0x174034 0x1 0x0 0x0 0x176000 0x1 0x0 0x0 0x176004 0x1 0x0 0x0 0x176008 0x1 0x0 0x0 0x17600c 0x1 0x0 0x0 0x176010 0x1 0x0 0x0 0x176014 0x1 0x0 0x0 0x176018 0x1 0x0 0x0 0x17601c 0x1 0x0 0x0 0x176020 0x1 0x0 0x0 0x176024 0x1 0x0 0x0 0x176028 0x1 0x0 0x0 0x17602c 0x1 0x0 0x0 0x176030 0x1 0x0 0x0 0x176034 0x1 0x0 0x0 0x10401c 0x1 0x0 0x0 0x183024 0x1 0x0 0x0 0x144168 0x1 0x0 0x0 0x11702c 0x1 0x0 0x0 0x10904c 0x1 0x0 0x0 0x189038 0x1 0x0 0x0 0x1443e8 0x1 0x0 0x0 0x1442b8 0x1 0x0 0x0 0x105060 0x1 0x0 0x0 0x141024 0x1 0x0 0x0 0x145038 0x1 0x0 0x0 0x109004 0x1 0x0 0x0 0x189004 0x1 0x0 0x0 0x190004 0x1 0x0 0x0 0xc2a0000 0x1 0x0 0x0 0xc2a0004 0x1 0x0 0x0 0xc2a0008 0x1 0x0 0x0 0xc2a000c 0x1 0x0 0x0 0xc2a0010 0x1 0x0 0x0 0xc2a0014 0x1 0x0 0x0 0xc2a0018 0x1 0x0 0x0 0xc2a001c 0x1 0x0 0x0 0xc2a0020 0x1 0x0 0x0 0xc2a0024 0x1 0x0 0x0 0xc2a0028 0x1 0x0 0x0 0xc2a002c 0x1 0x0 0x0 0xc2a0030 0x1 0x0 0x0 0xc2a0034 0x1 0x0 0x0 0xc2a1000 0x1 0x0 0x0 0xc2a1004 0x1 0x0 0x0 0xc2a1008 0x1 0x0 0x0 0xc2a100c 0x1 0x0 0x0 0xc2a1010 0x1 0x0 0x0 0xc2a1014 0x1 0x0 0x0 0xc2a1018 0x1 0x0 0x0 0xc2a101c 0x1 0x0 0x0 0xc2a1020 0x1 0x0 0x0 0xc2a1024 0x1 0x0 0x0 0xc2a1028 0x1 0x0 0x0 0xc2a102c 0x1 0x0 0x0 0xc2a1030 0x1 0x0 0x0 0xc2a2260 0x1 0x0 0x0 0xc2a2264 0x1 0x0 0x0 0xc2a3008 0x1 0x0 0x0 0xc2a300c 0x1 0x0 0x0 0xc2a3010 0x1 0x0 0x0 0xc2a3014 0x1 0x0 0x0 0xc2a3024 0x1 0x0 0x0 0xc2a2034 0x1 0x0 0x0 0xc2a214c 0x1 0x0 0x0 0xc2a2150 0x1 0x0 0x0 0xc2a2154 0x1 0x0 0x0 0x28206c 0x1 0x0 0x0 0x18282004 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x1808012c 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280004 0x1 0x0 0x0 0x18284038 0x1 0x0 0x0 0x18284000 0x2 0x0 0x0 0x90c012c 0x1 0x0 0x0 0x9222408 0x1 0x0 0x0 0x9220344 0x2 0x0 0x0 0x9220480 0x1 0x0 0x0 0x922358c 0x1 0x0 0x0 0x9222398 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x923201c 0x5 0x0 0x0 0x9232050 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x9186048 0x1 0x0 0x0 0x9186054 0x1 0x0 0x0 0x9186164 0x1 0x0 0x0 0x9186170 0x1 0x0 0x0 0xc2630a0 0x4 0x0 0x0 0xc2630b0 0x4 0x0 0x0 0xc2630c0 0x4 0x0 0x0 0xc2630d0 0x4 0x0 0x0 0x18200400 0x1 0x0 0x0 0x18200404 0x1 0x0 0x0 0x18200408 0x1 0x0 0x0 0x18200038 0x1 0x0 0x0 0x18200040 0x1 0x0 0x0 0x18200048 0x1 0x0 0x0 0x18220038 0x1 0x0 0x0 0x18220040 0x1 0x0 0x0 0x182200d0 0x1 0x0 0x0 0x18200030 0x1 0x0 0x0 0x18200010 0x1 0x0 0x0 0x1822000c 0x1 0x0 0x0 0x18220d14 0x1 0x0 0x0 0x18220fb4 0x1 0x0 0x0 0x18221254 0x1 0x0 0x0 0x182214f4 0x1 0x0 0x0 0x18221794 0x1 0x0 0x0 0x18221a34 0x1 0x0 0x0 0x18221cd4 0x1 0x0 0x0 0x18221f74 0x1 0x0 0x0 0x18220d18 0x1 0x0 0x0 0x18220fb8 0x1 0x0 0x0 0x18221258 0x1 0x0 0x0 0x182214f8 0x1 0x0 0x0 0x18221798 0x1 0x0 0x0 0x18221a38 0x1 0x0 0x0 0x18221cd8 0x1 0x0 0x0 0x18221f78 0x1 0x0 0x0 0x18220d00 0x1 0x0 0x0 0x18220d04 0x1 0x0 0x0 0x18220d1c 0x1 0x0 0x0 0x18220fbc 0x1 0x0 0x0 0x1822125c 0x1 0x0 0x0 0x182214fc 0x1 0x0 0x0 0x1822179c 0x1 0x0 0x0 0x18221a3c 0x1 0x0 0x0 0x18221cdc 0x1 0x0 0x0 0x18221f7c 0x1 0x0 0x0 0x18221274 0x1 0x0 0x0 0x18221288 0x1 0x0 0x0 0x1822129c 0x1 0x0 0x0 0x182212b0 0x1 0x0 0x0 0x182212c4 0x1 0x0 0x0 0x182212d8 0x1 0x0 0x0 0x182212ec 0x1 0x0 0x0 0x18221300 0x1 0x0 0x0 0x18221314 0x1 0x0 0x0 0x18221328 0x1 0x0 0x0 0x1822133c 0x1 0x0 0x0 0x18221350 0x1 0x0 0x0 0x18221364 0x1 0x0 0x0 0x18221378 0x1 0x0 0x0 0x1822138c 0x1 0x0 0x0 0x182213a0 0x1 0x0 0x0 0x18221514 0x1 0x0 0x0 0x18221528 0x1 0x0 0x0 0x1822153c 0x1 0x0 0x0 0x18221550 0x1 0x0 0x0 0x18221564 0x1 0x0 0x0 0x18221578 0x1 0x0 0x0 0x1822158c 0x1 0x0 0x0 0x182215a0 0x1 0x0 0x0 0x182215b4 0x1 0x0 0x0 0x182215c8 0x1 0x0 0x0 0x182215dc 0x1 0x0 0x0 0x182215f0 0x1 0x0 0x0 0x18221604 0x1 0x0 0x0 0x18221618 0x1 0x0 0x0 0x1822162c 0x1 0x0 0x0 0x18221640 0x1 0x0 0x0 0x182217b4 0x1 0x0 0x0 0x182217c8 0x1 0x0 0x0 0x182217dc 0x1 0x0 0x0 0x182217f0 0x1 0x0 0x0 0x18221804 0x1 0x0 0x0 0x18221818 0x1 0x0 0x0 0x1822182c 0x1 0x0 0x0 0x18221840 0x1 0x0 0x0 0x18221854 0x1 0x0 0x0 0x18221868 0x1 0x0 0x0 0x1822187c 0x1 0x0 0x0 0x18221890 0x1 0x0 0x0 0x182218a4 0x1 0x0 0x0 0x182218b8 0x1 0x0 0x0 0x182218cc 0x1 0x0 0x0 0x182218e0 0x1 0x0 0x0 0x18221a54 0x1 0x0 0x0 0x18221a68 0x1 0x0 0x0 0x18221a7c 0x1 0x0 0x0 0x18221a90 0x1 0x0 0x0 0x18221aa4 0x1 0x0 0x0 0x18221ab8 0x1 0x0 0x0 0x18221acc 0x1 0x0 0x0 0x18221ae0 0x1 0x0 0x0 0x18221af4 0x1 0x0 0x0 0x18221b08 0x1 0x0 0x0 0x18221b1c 0x1 0x0 0x0 0x18221b30 0x1 0x0 0x0 0x18221b44 0x1 0x0 0x0 0x18221b58 0x1 0x0 0x0 0x18221b6c 0x1 0x0 0x0 0x18221b80 0x1 0x0 0x0 0x18221cf4 0x1 0x0 0x0 0x18221d08 0x1 0x0 0x0 0x18221d1c 0x1 0x0 0x0 0x18221d30 0x1 0x0 0x0 0x18221d44 0x1 0x0 0x0 0x18221d58 0x1 0x0 0x0 0x18221d6c 0x1 0x0 0x0 0x18221d80 0x1 0x0 0x0 0x18221d94 0x1 0x0 0x0 0x18221da8 0x1 0x0 0x0 0x18221dbc 0x1 0x0 0x0 0x18221dd0 0x1 0x0 0x0 0x18221de4 0x1 0x0 0x0 0x18221df8 0x1 0x0 0x0 0x18221e0c 0x1 0x0 0x0 0x18221e20 0x1 0x0 0x0 0x18221f94 0x1 0x0 0x0 0x18221fa8 0x1 0x0 0x0 0x18221fbc 0x1 0x0 0x0 0x18221fd0 0x1 0x0 0x0 0x18221fe4 0x1 0x0 0x0 0x18221ff8 0x1 0x0 0x0 0x1822200c 0x1 0x0 0x0 0x18222020 0x1 0x0 0x0 0x18222034 0x1 0x0 0x0 0x18222048 0x1 0x0 0x0 0x1822205c 0x1 0x0 0x0 0x18222070 0x1 0x0 0x0 0x18222084 0x1 0x0 0x0 0x18222098 0x1 0x0 0x0 0x182220ac 0x1 0x0 0x0 0x182220c0 0x1 0x0 0x0 0x18221278 0x1 0x0 0x0 0x1822128c 0x1 0x0 0x0 0x182212a0 0x1 0x0 0x0 0x182212b4 0x1 0x0 0x0 0x182212c8 0x1 0x0 0x0 0x182212dc 0x1 0x0 0x0 0x182212f0 0x1 0x0 0x0 0x18221304 0x1 0x0 0x0 0x18221318 0x1 0x0 0x0 0x1822132c 0x1 0x0 0x0 0x18221340 0x1 0x0 0x0 0x18221354 0x1 0x0 0x0 0x18221368 0x1 0x0 0x0 0x1822137c 0x1 0x0 0x0 0x18221390 0x1 0x0 0x0 0x182213a4 0x1 0x0 0x0 0x18221518 0x1 0x0 0x0 0x1822152c 0x1 0x0 0x0 0x18221540 0x1 0x0 0x0 0x18221554 0x1 0x0 0x0 0x18221568 0x1 0x0 0x0 0x1822157c 0x1 0x0 0x0 0x18221590 0x1 0x0 0x0 0x182215a4 0x1 0x0 0x0 0x182215b8 0x1 0x0 0x0 0x182215cc 0x1 0x0 0x0 0x182215e0 0x1 0x0 0x0 0x182215f4 0x1 0x0 0x0 0x18221608 0x1 0x0 0x0 0x1822161c 0x1 0x0 0x0 0x18221630 0x1 0x0 0x0 0x18221644 0x1 0x0 0x0 0x182217b8 0x1 0x0 0x0 0x182217cc 0x1 0x0 0x0 0x182217e0 0x1 0x0 0x0 0x182217f4 0x1 0x0 0x0 0x18221808 0x1 0x0 0x0 0x1822181c 0x1 0x0 0x0 0x18221830 0x1 0x0 0x0 0x18221844 0x1 0x0 0x0 0x18221858 0x1 0x0 0x0 0x1822186c 0x1 0x0 0x0 0x18221880 0x1 0x0 0x0 0x18221894 0x1 0x0 0x0 0x182218a8 0x1 0x0 0x0 0x182218bc 0x1 0x0 0x0 0x182218d0 0x1 0x0 0x0 0x182218e4 0x1 0x0 0x0 0x18221a58 0x1 0x0 0x0 0x18221a6c 0x1 0x0 0x0 0x18221a80 0x1 0x0 0x0 0x18221a94 0x1 0x0 0x0 0x18221aa8 0x1 0x0 0x0 0x18221abc 0x1 0x0 0x0 0x18221ad0 0x1 0x0 0x0 0x18221ae4 0x1 0x0 0x0 0x18221af8 0x1 0x0 0x0 0x18221b0c 0x1 0x0 0x0 0x18221b20 0x1 0x0 0x0 0x18221b34 0x1 0x0 0x0 0x18221b48 0x1 0x0 0x0 0x18221b5c 0x1 0x0 0x0 0x18221b70 0x1 0x0 0x0 0x18221b84 0x1 0x0 0x0 0x18221cf8 0x1 0x0 0x0 0x18221d0c 0x1 0x0 0x0 0x18221d20 0x1 0x0 0x0 0x18221d34 0x1 0x0 0x0 0x18221d48 0x1 0x0 0x0 0x18221d5c 0x1 0x0 0x0 0x18221d70 0x1 0x0 0x0 0x18221d84 0x1 0x0 0x0 0x18221d98 0x1 0x0 0x0 0x18221dac 0x1 0x0 0x0 0x18221dc0 0x1 0x0 0x0 0x18221dd4 0x1 0x0 0x0 0x18221de8 0x1 0x0 0x0 0x18221dfc 0x1 0x0 0x0 0x18221e10 0x1 0x0 0x0 0x18221e24 0x1 0x0 0x0 0x18221f98 0x1 0x0 0x0 0x18221fac 0x1 0x0 0x0 0x18221fc0 0x1 0x0 0x0 0x18221fd4 0x1 0x0 0x0 0x18221fe8 0x1 0x0 0x0 0x18221ffc 0x1 0x0 0x0 0x18222010 0x1 0x0 0x0 0x18222024 0x1 0x0 0x0 0x18222038 0x1 0x0 0x0 0x1822204c 0x1 0x0 0x0 0x18222060 0x1 0x0 0x0 0x18222074 0x1 0x0 0x0 0x18222088 0x1 0x0 0x0 0x1822209c 0x1 0x0 0x0 0x182220b0 0x1 0x0 0x0 0x182220c4 0x1 0x0 0x0 0x105050 0x1 0x0 0x0 0x171004 0x1 0x0 0x0 0x171154 0x1 0x0 0x0 0x17100c 0x1 0x0 0x0 0x171018 0x1 0x0 0x0 0x5091004 0x1 0x0 0x0 0x509100c 0x1 0x0 0x0 0x5091010 0x1 0x0 0x0 0x5091014 0x1 0x0 0x0 0x5091054 0x1 0x0 0x0 0x5091060 0x1 0x0 0x0 0x509106c 0x1 0x0 0x0 0x5091070 0x1 0x0 0x0 0x5091074 0x1 0x0 0x0 0x5091078 0x1 0x0 0x0 0x509107c 0x1 0x0 0x0 0x509108c 0x1 0x0 0x0 0x5091098 0x1 0x0 0x0 0x509109c 0x1 0x0 0x0 0x1800005c 0x1 0x0 0x0 0x1801005c 0x1 0x0 0x0 0x1802005c 0x1 0x0 0x0 0x1803005c 0x1 0x0 0x0 0x1804005c 0x1 0x0 0x0 0x1805005c 0x1 0x0 0x0 0x1806005c 0x1 0x0 0x0 0x1807005c 0x1 0x0 0x0 0x17c0003c 0x1 0x0 0x1 0x6004fb0 0xc5acce55 0x0 0x1 0x600408c 0xff 0x0 0x1 0x6004fb0 0x0 0x0 0x0 0x62900010 0x1 0x0 0x0 0x62900014 0x1 0x0 0x0 0x62900018 0x1 0x0 0x0 0x62900030 0x1 0x0 0x0 0x62900038 0x1 0x0 0x0 0x62900040 0x1 0x0 0x0 0x62900048 0x1 0x0 0x0 0x629000d0 0x1 0x0 0x0 0x62900210 0x1 0x0 0x0 0x62900230 0x1 0x0 0x0 0x62900250 0x1 0x0 0x0 0x62900270 0x1 0x0 0x0 0x62900290 0x1 0x0 0x0 0x629002b0 0x1 0x0 0x0 0x62900208 0x1 0x0 0x0 0x62900228 0x1 0x0 0x0 0x62900248 0x1 0x0 0x0 0x62900268 0x1 0x0 0x0 0x62900288 0x1 0x0 0x0 0x629002a8 0x1 0x0 0x0 0x6290020c 0x1 0x0 0x0 0x6290022c 0x1 0x0 0x0 0x6290024c 0x1 0x0 0x0 0x6290026c 0x1 0x0 0x0 0x6290028c 0x1 0x0 0x0 0x629002ac 0x1 0x0 0x0 0x62900404 0x1 0x0 0x0 0x62900408 0x1 0x0 0x0 0x62900400 0x1 0x0 0x0 0x62900d04 0x1 0x0 0x0 0x624b0010 0x1 0x0 0x0 0x624b0014 0x1 0x0 0x0 0x624b0018 0x1 0x0 0x0 0x624b0210 0x1 0x0 0x0 0x624b0230 0x1 0x0 0x0 0x624b0250 0x1 0x0 0x0 0x624b0270 0x1 0x0 0x0 0x624b0290 0x1 0x0 0x0 0x624b02b0 0x1 0x0 0x0 0x624b0208 0x1 0x0 0x0 0x624b0228 0x1 0x0 0x0 0x624b0248 0x1 0x0 0x0 0x624b0268 0x1 0x0 0x0 0x624b0288 0x1 0x0 0x0 0x624b02a8 0x1 0x0 0x0 0x624b020c 0x1 0x0 0x0 0x624b022c 0x1 0x0 0x0 0x624b024c 0x1 0x0 0x0 0x624b026c 0x1 0x0 0x0 0x624b028c 0x1 0x0 0x0 0x624b02ac 0x1 0x0 0x0 0x624b0400 0x1 0x0 0x0 0x624b0404 0x1 0x0 0x0 0x624b0408 0x1 0x0 0x0 0x62402028 0x1 0x0 0x0 0xb254520 0x1 0x0 0x0 0xb251020 0x1 0x0 0x0 0xb251024 0x1 0x0 0x0 0xb251030 0x1 0x0 0x0 0xb251200 0x1 0x0 0x0 0xb251214 0x1 0x0 0x0 0xb251228 0x1 0x0 0x0 0xb25123c 0x1 0x0 0x0 0xb251250 0x1 0x0 0x0 0xb251204 0x1 0x0 0x0 0xb251218 0x1 0x0 0x0 0xb25122c 0x1 0x0 0x0 0xb251240 0x1 0x0 0x0 0xb251254 0x1 0x0 0x0 0xb251208 0x1 0x0 0x0 0xb25121c 0x1 0x0 0x0 0xb251230 0x1 0x0 0x0 0xb251244 0x1 0x0 0x0 0xb251258 0x1 0x0 0x0 0xb254510 0x1 0x0 0x0 0xb254514 0x1 0x0 0x0 0xb250010 0x1 0x0 0x0 0xb250014 0x1 0x0 0x0 0xb250900 0x1 0x0 0x0 0xb250904 0x1 0x0 0x0 0x4200010 0x1 0x0 0x0 0x4200014 0x1 0x0 0x0 0x4200018 0x1 0x0 0x0 0x4200030 0x1 0x0 0x0 0x4200038 0x1 0x0 0x0 0x4200040 0x1 0x0 0x0 0x4200048 0x1 0x0 0x0 0x42000d0 0x1 0x0 0x0 0x4200210 0x1 0x0 0x0 0x4200230 0x1 0x0 0x0 0x4200250 0x1 0x0 0x0 0x4200270 0x1 0x0 0x0 0x4200290 0x1 0x0 0x0 0x42002b0 0x1 0x0 0x0 0x4200208 0x1 0x0 0x0 0x4200228 0x1 0x0 0x0 0x4200248 0x1 0x0 0x0 0x4200268 0x1 0x0 0x0 0x4200288 0x1 0x0 0x0 0x42002a8 0x1 0x0 0x0 0x420020c 0x1 0x0 0x0 0x420022c 0x1 0x0 0x0 0x420024c 0x1 0x0 0x0 0x420026c 0x1 0x0 0x0 0x420028c 0x1 0x0 0x0 0x42002ac 0x1 0x0 0x0 0x4200404 0x1 0x0 0x0 0x4200408 0x1 0x0 0x0 0x4200400 0x1 0x0 0x0 0x4200d04 0x1 0x0 0x0 0x4130010 0x1 0x0 0x0 0x4130014 0x1 0x0 0x0 0x4130018 0x1 0x0 0x0 0x4130210 0x1 0x0 0x0 0x4130230 0x1 0x0 0x0 0x4130250 0x1 0x0 0x0 0x4130270 0x1 0x0 0x0 0x4130290 0x1 0x0 0x0 0x41302b0 0x1 0x0 0x0 0x4130208 0x1 0x0 0x0 0x4130228 0x1 0x0 0x0 0x4130248 0x1 0x0 0x0 0x4130268 0x1 0x0 0x0 0x4130288 0x1 0x0 0x0 0x41302a8 0x1 0x0 0x0 0x413020c 0x1 0x0 0x0 0x413022c 0x1 0x0 0x0 0x413024c 0x1 0x0 0x0 0x413026c 0x1 0x0 0x0 0x413028c 0x1 0x0 0x0 0x41302ac 0x1 0x0 0x0 0x4130400 0x1 0x0 0x0 0x4130404 0x1 0x0 0x0 0x4130408 0x1 0x0 0x0 0x4082028 0x1 0x0 0x0 0x18a008 0x1 0x0 0x0 0xb2c4520 0x1 0x0 0x0 0xb2c1020 0x1 0x0 0x0 0xb2c1024 0x1 0x0 0x0 0xb2c1030 0x1 0x0 0x0 0xb2c1200 0x1 0x0 0x0 0xb2c1214 0x1 0x0 0x0 0xb2c1228 0x1 0x0 0x0 0xb2c123c 0x1 0x0 0x0 0xb2c1250 0x1 0x0 0x0 0xb2c1204 0x1 0x0 0x0 0xb2c1218 0x1 0x0 0x0 0xb2c122c 0x1 0x0 0x0 0xb2c1240 0x1 0x0 0x0 0xb2c1254 0x1 0x0 0x0 0xb2c1208 0x1 0x0 0x0 0xb2c121c 0x1 0x0 0x0 0xb2c1230 0x1 0x0 0x0 0xb2c1244 0x1 0x0 0x0 0xb2c1258 0x1 0x0 0x0 0xb2c4510 0x1 0x0 0x0 0xb2c4514 0x1 0x0 0x0 0xb2c0010 0x1 0x0 0x0 0xb2c0014 0x1 0x0 0x0 0xb2c0900 0x1 0x0 0x0 0xb2c0904 0x1 0x0 0x0 0x80a4010 0x1 0x0 0x0 0x80a4014 0x1 0x0 0x0 0x80a4018 0x1 0x0 0x0 0x80a4030 0x1 0x0 0x0 0x80a4038 0x1 0x0 0x0 0x80a4040 0x1 0x0 0x0 0x80a4048 0x1 0x0 0x0 0x80a40d0 0x1 0x0 0x0 0x80a4210 0x1 0x0 0x0 0x80a4230 0x1 0x0 0x0 0x80a4250 0x1 0x0 0x0 0x80a4270 0x1 0x0 0x0 0x80a4290 0x1 0x0 0x0 0x80a42b0 0x1 0x0 0x0 0x80a4208 0x1 0x0 0x0 0x80a4228 0x1 0x0 0x0 0x80a4248 0x1 0x0 0x0 0x80a4268 0x1 0x0 0x0 0x80a4288 0x1 0x0 0x0 0x80a42a8 0x1 0x0 0x0 0x80a420c 0x1 0x0 0x0 0x80a422c 0x1 0x0 0x0 0x80a424c 0x1 0x0 0x0 0x80a426c 0x1 0x0 0x0 0x80a428c 0x1 0x0 0x0 0x80a42ac 0x1 0x0 0x0 0x80a4404 0x1 0x0 0x0 0x80a4408 0x1 0x0 0x0 0x80a4400 0x1 0x0 0x0 0x80a4d04 0x1 0x0 0x0 0x83b0010 0x1 0x0 0x0 0x83b0014 0x1 0x0 0x0 0x83b0018 0x1 0x0 0x0 0x83b0210 0x1 0x0 0x0 0x83b0230 0x1 0x0 0x0 0x83b0250 0x1 0x0 0x0 0x83b0270 0x1 0x0 0x0 0x83b0290 0x1 0x0 0x0 0x83b02b0 0x1 0x0 0x0 0x83b0208 0x1 0x0 0x0 0x83b0228 0x1 0x0 0x0 0x83b0248 0x1 0x0 0x0 0x83b0268 0x1 0x0 0x0 0x83b0288 0x1 0x0 0x0 0x83b02a8 0x1 0x0 0x0 0x83b020c 0x1 0x0 0x0 0x83b022c 0x1 0x0 0x0 0x83b024c 0x1 0x0 0x0 0x83b026c 0x1 0x0 0x0 0x83b028c 0x1 0x0 0x0 0x83b02ac 0x1 0x0 0x0 0x83b0400 0x1 0x0 0x0 0x83b0404 0x1 0x0 0x0 0x83b0408 0x1 0x0 0x0 0x8302028 0x1 0x0 0x0 0xb2b4520 0x1 0x0 0x0 0xb2b1020 0x1 0x0 0x0 0xb2b1024 0x1 0x0 0x0 0xb2b1030 0x1 0x0 0x0 0xb2b1200 0x1 0x0 0x0 0xb2b1214 0x1 0x0 0x0 0xb2b1228 0x1 0x0 0x0 0xb2b123c 0x1 0x0 0x0 0xb2b1250 0x1 0x0 0x0 0xb2b1204 0x1 0x0 0x0 0xb2b1218 0x1 0x0 0x0 0xb2b122c 0x1 0x0 0x0 0xb2b1240 0x1 0x0 0x0 0xb2b1254 0x1 0x0 0x0 0xb2b1208 0x1 0x0 0x0 0xb2b121c 0x1 0x0 0x0 0xb2b1230 0x1 0x0 0x0 0xb2b1244 0x1 0x0 0x0 0xb2b1258 0x1 0x0 0x0 0xb2b4510 0x1 0x0 0x0 0xb2b4514 0x1 0x0 0x0 0xb2b0010 0x1 0x0 0x0 0xb2b0014 0x1 0x0 0x0 0xb2b0900 0x1 0x0 0x0 0xb2b0904 0x1 0x0 0x0 0x17a00204 0x1d 0x0>; + }; + }; + }; + + fragment@37 { + target = <0xffffffff>; + + __overlay__ { + + ss_plog@B4400000 { + compatible = "ss_plog"; + no-map; + reg = <0x0 0xb4400000 0x0 0x200000>; + }; + + ramoops@B4600000 { + compatible = "ramoops"; + reg = <0x0 0xb4600000 0x0 0x100000>; + record-size = <0x40000>; + console-size = <0x40000>; + ftrace-size = <0x40000>; + pmsg-size = <0x40000>; + }; + + sec_debug_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4700000 0x0 0x800000>; + phandle = <0xbc>; + }; + + sec_debug_autocomment@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4f00000 0x0 0x1000>; + phandle = <0xbd>; + }; + + sec_debug_rdx_bootdev@0 { + no-ship; + reg = <0x1 0x0 0x0 0x5900000>; + phandle = <0xbe>; + }; + + kaslr_region@A0001000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xa0001000 0x0 0x1000>; + phandle = <0xbf>; + }; + + rkp_region@B0200000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xb0200000 0x0 0x200000>; + phandle = <0xc0>; + }; + + hdm_region@A1000000 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xa1000000 0x0 0x1000>; + phandle = <0x54>; + }; + + modem_shared_mem_region@B5000000 { + compatible = "modem-removed-dma-pool"; + no-map; + reg = <0x0 0xb5000000 0x0 0x6000000>; + phandle = <0x53>; + }; + }; + }; + + fragment@38 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x80b00000 0x0 0x7100000>; + }; + }; + + fragment@39 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x8b000000 0x0 0x8900000>; + }; + }; + + fragment@40 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x93c00000 0x0 0x3e00000>; + }; + }; + + fragment@41 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97a00000 0x0 0x500000>; + }; + }; + + fragment@42 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97f00000 0x0 0x500000>; + }; + }; + + fragment@43 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98400000 0x0 0x500000>; + }; + }; + + fragment@44 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98900000 0x0 0x1e00000>; + }; + }; + + fragment@45 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9e000000 0x0 0x2000000>; + }; + }; + + fragment@46 { + target = <0xffffffff>; + + __overlay__ { + size = <0x0 0x2000000>; + }; + }; + + fragment@47 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@48 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@49 { + target = <0xffffffff>; + + __overlay__ { + + upload_cause@66c { + compatible = "qcom,msm-imem-upload_cause"; + reg = <0x66c 0x4>; + }; + }; + }; + + fragment@50 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@51 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@52 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@53 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@54 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@55 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@56 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@57 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@58 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@59 { + target = <0xffffffff>; + + __overlay__ { + + dwc3@a600000 { + maximum-speed = "high-speed"; + }; + }; + }; + + fragment@60 { + target = <0xffffffff>; + + __overlay__ { + + input_booster { + status = "okay"; + compatible = "input_booster"; + #address-cells = <0x1>; + #size-cells = <0x0>; + + booster_key@1 { + input_booster,label = "KEY"; + input_booster,type = <0x0>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0xc8>; + input_booster,tail_times = <0x0>; + }; + + booster_key@2 { + input_booster,label = "TOUCHKEY"; + input_booster,type = <0x1>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x0>; + input_booster,tail_times = <0x12c>; + }; + + booster_key@3 { + input_booster,label = "TOUCH"; + input_booster,type = <0x2>; + input_booster,levels = <0x1 0x2 0x3>; + input_booster,cpu_freqs = <0x135600 0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2 0x2>; + input_booster,ddr_freqs = <0x3f9 0x3f9 0x3f9>; + input_booster,lpm_bias = <0x5 0x5 0x5>; + input_booster,head_times = <0xc8 0xc8 0x0>; + input_booster,tail_times = <0x0 0x0 0x12c>; + }; + + booster_key@4 { + input_booster,label = "MULTITOUCH"; + input_booster,type = <0x3>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x3e8 0x0>; + input_booster,tail_times = <0x0 0x1f4>; + }; + + booster_key@5 { + input_booster,label = "KEYBOARD"; + input_booster,type = <0x4>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x135600>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x82 0x82>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@6 { + input_booster,label = "MOUSE"; + input_booster,type = <0x5>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@7 { + input_booster,label = "MOUSE WHEEL"; + input_booster,type = <0x6>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@8 { + input_booster,label = "PEN HOVER"; + input_booster,type = <0x7>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@9 { + input_booster,label = "PEN"; + input_booster,type = <0x8>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x17bb00 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x258>; + }; + + booster_key@10 { + input_booster,label = "KEY_TWO"; + input_booster,type = <0x9>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x17bb00>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x2bc>; + input_booster,tail_times = <0x2bc>; + }; + }; + + sec_smem@0 { + compatible = "samsung,sec-smem"; + status = "okay"; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_4 { + compatible = "qcom,memshare-peripheral"; + memory-region = <0x53>; + qcom,peripheral-size = <0x2000000>; + qcom,reserved-size = <0x4000000>; + qcom,client-id = <0x3>; + qcom,allocate-boot-time; + label = "modem"; + }; + }; + + samsung,sec_misc { + qfprom_jtag,reg = <0x780180>; + }; + + usb-notifier { + compatible = "samsung,usb-notifier"; + qcom,disable_control_en = <0x1>; + qcom,unsupport_host_en = <0x0>; + phandle = <0xc1>; + }; + + samsung,sec_hdm { + memory-region = <0x54>; + }; + + argos { + compatible = "samsung,argos"; + #address-cells = <0x1>; + + boot_device@1 { + net_boost,label = "WIFI"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@2 { + net_boost,label = "WIFI TX"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0xc8 0x21b100 0x0 0x1b8a00 0x0 0x0 0x0 0x1 0x1 0x1>; + }; + + boot_device@3 { + net_boost,label = "WIFI RX"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@4 { + net_boost,label = "SWLAN"; + net_boost,node = "swlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@5 { + net_boost,label = "P2P"; + net_boost,node = "p2p-wlan0-0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@6 { + net_boost,label = "IPA"; + net_boost,node = "rmnet_ipa0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + }; + }; + }; + + fragment@61 { + target = <0xffffffff>; + + __overlay__ { + + android { + + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_system,recovery,dtbo,abl,xbl,tz,hyp"; + }; + }; + }; + }; + + fragment@62 { + target = <0xffffffff>; + + __overlay__ { + qcom,smem-states = <0xffffffff 0x0 0xffffffff 0x4 0xffffffff 0x5>; + qcom,smem-state-names = "qcom,force-stop", "qcom,stop-reason-0", "qcom,stop-reason-1"; + }; + }; + + fragment@63 { + target = <0xffffffff>; + + __overlay__ { + spm-level = <0x3>; + }; + }; + + fragment@64 { + target = <0xffffffff>; + + __overlay__ { + i2c18 = "/soc/i2c@18"; + }; + }; + + fragment@65 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x3>; + + imp_list { + #list-imp-cells = <0x3>; + phandle = <0x26>; + }; + }; + }; + + fragment@66 { + target = <0xffffffff>; + + __overlay__ { + + msm_cdc_pinctrl_quin { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x55 0x56 0x57 0x58>; + pinctrl-1 = <0x59 0x5a 0x5b 0x5c>; + qcom,lpi-gpios; + phandle = <0x60>; + }; + }; + }; + + fragment@67 { + target = <0xffffffff>; + + __overlay__ { + + sec-audio-sysfs { + compatible = "samsung,audio-sysfs"; + status = "okay"; + audio,num-amp = <0x2>; + }; + + samsung,q6audio-adaptation { + compatible = "samsung,q6audio-adaptation"; + adaptation,device-tx-port-id = <0xb037>; + adaptation,spk-rx-port-id = <0x1016>; + adaptation,usb-rx-port-id = <0x7000>; + adaptation,bt-rx-port-id = <0x400e>; + adaptation,headset-rx-port-id = <0xb030>; + phandle = <0x5f>; + }; + + det_zones { + #list-det-cells = <0x2>; + phandle = <0x25>; + }; + + i2c@18 { + status = "ok"; + cell-index = <0x12>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x58 0x0 0xffffffff 0x59 0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x5d 0x5e>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xc2>; + + tas256x@4c { + #sound-dai-cells = <0x0>; + compatible = "ti, tas256x"; + status = "ok"; + reg = <0x4c>; + ti,reset-gpio = <0xffffffff 0x5e 0x0>; + ti,irq-gpio = <0xffffffff 0x5a 0x0>; + ti,left-channel = <0x4d>; + ti,right-channel = <0x4c>; + ti,channels = <0x2>; + ti,iv-width = <0x8>; + ti,vbat-mon = <0x1>; + ti,port_id = <0x1016>; + phandle = <0xc3>; + }; + }; + }; + }; + + fragment@68 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,wcn-btfm = <0x1>; + qcom,ext-disp-audio-rx = <0x0>; + qcom,mi2s-audio-intf = <0x1>; + asoc-platform = <0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0x5f>; + asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-pcm-dsp.2", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-compress-dsp", "msm-pcm-hostless", "msm-pcm-afe", "msm-lsm-client", "msm-pcm-routing", "msm-compr-dsp", "msm-pcm-dsp-noirq", "q6audio-adaptation"; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS3", "MIC BIAS3", "Analog Mic4", "AMIC5", "MIC BIAS4", "MIC BIAS4", "Analog Mic5", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT"; + qcom,msm-mbhc-hs-mic-max-threshold-mv = <0x270f>; + qcom,msm-mbhc-hs-mic-min-threshold-mv = <0x280>; + qcom,cdc-dmic01-gpios; + qcom,cdc-dmic23-gpios; + qcom,cdc-dmic45-gpios; + qcom,quin-mi2s-gpios = <0x60>; + asoc-codec = <0xffffffff 0xffffffff>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec"; + qcom,wsa-max-devs = <0x0>; + qcom,wsa-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x32 0xffffffff>; + fsa4480-i2c-handle; + qcom,fm-lna-gpios = <0xffffffff 0x54 0x0>; + qcom,msm-mbhc-gnd-det = <0x1>; + }; + }; + + fragment@69 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@70 { + target = <0xffffffff>; + + __overlay__ { + + tas25xx_gpio_default { + phandle = <0x5d>; + + mux { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + function = "gpio"; + }; + + config { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + bias-disable; + }; + }; + + fm_lna_default { + phandle = <0x5e>; + + mux { + pins = "gpio84"; + function = "gpio"; + }; + + config { + pins = "gpio84"; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@71 { + target = <0xffffffff>; + + __overlay__ { + + grip_i2c { + + grip_i2c_active { + phandle = <0xa9>; + + grip_i2c_active { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + + grip_i2c_suspend { + phandle = <0xc4>; + + grip_i2c_suspend { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + }; + + s2mpb03_i2c_sda_default { + phandle = <0x61>; + + mux { + pins = "gpio25"; + function = "gpio"; + }; + + config { + pins = "gpio25"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + s2mpb03_i2c_scl_default { + phandle = <0x62>; + + mux { + pins = "gpio26"; + function = "gpio"; + }; + + config { + pins = "gpio26"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + cam_sensor_mclk0_active { + phandle = <0x7d>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk0_suspend { + phandle = <0x80>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk1_active { + phandle = <0x96>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk1_suspend { + phandle = <0x98>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk2_active { + phandle = <0x8d>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk2_suspend { + phandle = <0x90>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk3_active { + phandle = <0x84>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk3_suspend { + phandle = <0x88>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk4_active { + phandle = <0x9c>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk4_suspend { + phandle = <0x9f>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + rcam1_sensor_reset_active { + phandle = <0x7e>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_reset_suspend { + phandle = <0x81>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_active { + phandle = <0x97>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_suspend { + phandle = <0x99>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_active { + phandle = <0x85>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_suspend { + phandle = <0x89>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_active { + phandle = <0x8e>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_suspend { + phandle = <0x91>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_active { + phandle = <0x9d>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_suspend { + phandle = <0xa0>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_active { + phandle = <0x6f>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_suspend { + phandle = <0x70>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_active { + phandle = <0x8f>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_suspend { + phandle = <0x92>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_active { + phandle = <0x86>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_suspend { + phandle = <0x8a>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_active { + phandle = <0x9e>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_suspend { + phandle = <0xa1>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_active { + phandle = <0x87>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-disable; + output-high; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_suspend { + phandle = <0x8b>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vdig_active { + phandle = <0xc5>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vdig_suspend { + phandle = <0xc6>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_active { + phandle = <0xc7>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_suspend { + phandle = <0xc8>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + if_pmic_i2c_pins { + phandle = <0xc9>; + + if_pmic_i2c_sleep { + phandle = <0x68>; + + mux { + pins = "gpio115", "gpio116"; + function = "gpio"; + }; + + config { + pins = "gpio115", "gpio116"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + usbpd_i2c_pins { + phandle = <0xca>; + + usbpd_i2c_sleep { + phandle = <0x6a>; + + mux { + pins = "gpio53", "gpio54"; + function = "gpio"; + }; + + config { + pins = "gpio53", "gpio54"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + mcu_reset_active { + phandle = <0x72>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_reset_suspend { + phandle = <0x74>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + mcu_clk_active { + phandle = <0x73>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_clk_suspend { + phandle = <0x75>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + torch_en_active { + phandle = <0x7f>; + + mux { + pins = "gpio67", "gpio22"; + function = "gpio"; + }; + + config { + pins = "gpio67", "gpio22"; + bias-pull-down; + output-high; + drive-strength = <0x2>; + }; + }; + + torch_en_suspend { + phandle = <0x82>; + + mux { + pins = "gpio67", "gpio22"; + function = "gpio"; + }; + + config { + pins = "gpio67", "gpio22"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + }; + }; + + fragment@72 { + target = <0xffffffff>; + + __overlay__ { + + grip_int_active { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xaa>; + }; + + grip_int_suspend { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xcb>; + }; + }; + }; + + fragment@73 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x48 0x4a 0x4e 0x54 0x56 0x57 0x5b 0x5d 0x5f 0x62 0x6d 0x72 0x73 0x74 0x75 0x76>; + }; + }; + + fragment@74 { + target = <0xffffffff>; + + __overlay__ { + + qcom,pm6150@0 { + + qcom,power-on@800 { + interrupts = <0x0 0x8 0x0 0x0 0x0 0x8 0x1 0x0 0x0 0x8 0x4 0x0 0x0 0x8 0x5 0x0>; + interrupt-names = "kpdpwr", "resin", "resin-bark", "kpdpwr-resin-bark"; + qcom,s3-debounce = <0x80>; + + qcom,pon_1 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_2 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_3 { + qcom,pon-type = <0x3>; + qcom,support-reset = <0x1>; + qcom,pull-up = <0x1>; + qcom,s1-timer = <0x1a40>; + qcom,s2-timer = <0x3e8>; + qcom,s2-type = <0x8>; + qcom,use-bark; + }; + }; + }; + }; + }; + + fragment@75 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@76 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@77 { + target = <0xffffffff>; + + __overlay__ { + + sec_thermistor@0 { + compatible = "samsung,sec-ap-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "ap_therm"; + adc_array = <0x6a4 0x88e 0xa10 0xbe6 0xdff 0x1090 0x1381 0x16f4 0x1b1c 0x1fb9 0x247b 0x2a3c 0x309d 0x3706 0x3d9d 0x43e8 0x4aa6 0x50c4 0x564a 0x5b4e 0x5faf 0x6379 0x66aa>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@1 { + compatible = "samsung,sec-pa-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "pa_therm"; + adc_array = <0x708 0x8bf 0xa47 0xc19 0xe38 0x10c2 0x13c0 0x173d 0x1b5e 0x1fff 0x24cf 0x2a88 0x30de 0x3756 0x3dea 0x443d 0x4add 0x5100 0x5683 0x5b96 0x5fef 0x63ab 0x66d8>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@2 { + compatible = "samsung,sec-wf-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4f>; + io-channel-names = "wf_therm"; + adc_array = <0x708 0x8d5 0xa66 0xc35 0xe55 0x10d4 0x13e0 0x1766 0x1b81 0x2021 0x24f3 0x2aa3 0x30f4 0x376c 0x3e09 0x445e 0x4aec 0x5105 0x568c 0x5ba3 0x5ff9 0x63b4 0x66e0>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + i2c@2 { + cell-index = <0x2>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x19 0x0 0xffffffff 0x1a 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x61 0x62>; + phandle = <0xcc>; + + s2mpb03@56 { + compatible = "samsung,s2mpb03pmic"; + reg = <0x56>; + additional_reg_init; + + regulators { + + s2mpb03-ldo1 { + regulator-name = "s2mpb03-ldo1"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x100590>; + phandle = <0x95>; + }; + + s2mpb03-ldo2 { + regulator-name = "s2mpb03-ldo2"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x7c>; + }; + + s2mpb03-ldo3 { + regulator-name = "s2mpb03-ldo3"; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x7a>; + }; + + s2mpb03-ldo4 { + regulator-name = "s2mpb03-ldo4"; + regulator-min-microvolt = <0x124f80>; + regulator-max-microvolt = <0x124f80>; + phandle = <0x8c>; + }; + + s2mpb03-ldo5 { + regulator-name = "s2mpb03-ldo5"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x7b>; + }; + + s2mpb03-ldo6 { + regulator-name = "s2mpb03-ldo6"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x94>; + }; + + s2mpb03-ldo7 { + regulator-name = "s2mpb03-ldo7"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2ab980>; + phandle = <0x71>; + }; + }; + }; + }; + }; + }; + + fragment@78 { + target = <0xffffffff>; + + __overlay__ { + interrupts = <0x0 0xc0 0x0 0x0 0x0 0xc1 0x0 0x0 0x0 0xc2 0x0 0x0 0x0 0xc3 0x0 0x0 0x0 0xc4 0x0 0x0 0x0 0xc6 0x0 0x0 0x0 0xc7 0x0 0x0 0x0 0xc9 0x0 0x0>; + interrupt-names = "pm6150_gpio1", "pm6150_gpio2", "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio5", "pm6150_gpio7", "pm6150_gpio8", "pm6150_gpio10"; + qcom,gpios-disallowed = <0x6 0x9>; + }; + }; + + fragment@79 { + target = <0xffffffff>; + + __overlay__ { + + ap_therm { + reg = <0x4e>; + label = "ap_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@80 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm { + reg = <0x4e>; + label = "pa_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + + wf_therm { + reg = <0x4f>; + label = "wf_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@81 { + target = <0xffffffff>; + + __overlay__ { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x2dc6c0>; + regulator-boot-on; + }; + }; + + fragment@82 { + target = <0xffffffff>; + + __overlay__ { + + tsp_int { + phandle = <0x65>; + + mux { + pins = "gpio9"; + function = "gpio"; + }; + + config { + pins = "gpio9"; + input-enable; + bias-disable; + }; + }; + + qupv3_se7_i2c_pins_tsp { + phandle = <0xcd>; + + qupv3_se7_i2c_active_tsp { + phandle = <0x63>; + + mux { + pins = "gpio6", "gpio7"; + function = "qup11"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + qupv3_se7_i2c_sleep_tsp { + phandle = <0x64>; + + mux { + pins = "gpio6", "gpio7"; + function = "gpio"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <0x2>; + bias-disable; + }; + }; + }; + }; + }; + + fragment@83 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x63>; + pinctrl-1 = <0x64>; + + synaptics_tcm@20 { + status = "disabled"; + }; + + atmel_mxt_ts@4a { + status = "disabled"; + }; + + touchscreen@20 { + status = "okay"; + compatible = "zinitix,zt_ts_device"; + reg = <0x20>; + pinctrl-names = "on_state", "off_state"; + pinctrl-0 = <0x65>; + pinctrl-1 = <0x65>; + avdd-supply = <0xffffffff>; + zinitix,gpio_ldo_en; + zinitix,irq_type = <0x2008>; + zinitix,x_resolution = <0x438>; + zinitix,y_resolution = <0x960>; + zinitix,page_size = <0x80>; + zinitix,irq_gpio = <0xffffffff 0x9 0x2008>; + zinitix,chip_name = "ZT7650"; + zinitix,firmware_name = "tsp_zinitix/zt7650_a52.bin"; + zinitix,spay; + zinitix,aod; + zinitix,aot; + zinitix,mis_cal_check; + support_ear_detect_mode; + support_dex_mode; + zinitix,bringup = <0x0>; + zinitix,ss_touch_num = <0x1>; + phandle = <0xce>; + }; + + touchscreen@49 { + status = "disabled"; + compatible = "stm,fts_touch"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x65>; + dvdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + stm,irq_gpio = <0xffffffff 0x9 0x2008>; + stm,max_coords = <0xfff 0xfff>; + stm,firmware_name = "tsp_stm/fts5cu56a_a52.bin"; + stm,tclm_level = <0x2>; + stm,afe_base = <0x14>; + stm,bringup = <0x0>; + stm,support_fod; + stm,enable_settings_aot; + support_ear_detect; + support_mis_calibration_test; + support_dex_mode; + support_open_short_test; + support_sram_test; + stm,ss_touch_num = <0x1>; + phandle = <0xcf>; + }; + }; + }; + + fragment@84 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + + key_vol_up_default { + pins = "gpio8"; + function = "normal"; + input-enable; + bias-pull-up; + power-source = <0x0>; + phandle = <0x66>; + }; + }; + }; + }; + + fragment@85 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "default"; + pinctrl-0 = <0x66>; + + vol_up { + label = "volume_up"; + gpios = <0xffffffff 0x8 0x1>; + linux,input-type = <0x1>; + linux,code = <0x73>; + debounce-interval = <0xf>; + }; + }; + }; + + fragment@86 { + target = <0xffffffff>; + + __overlay__ { + + ss_touch { + compatible = "samsung,ss_touch"; + ss_touch,numbers = <0x1>; + }; + }; + }; + + fragment@87 { + target = <0xffffffff>; + + __overlay__ { + + self_display_FC3_dtsi { + label = "self_display_FC3_dtsi"; + samsung,support_self_display; + samsung,self_mask_setting_pre_revA = [29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 02 75 10]; + samsung,self_mask_setting_post_revA = [29 01 00 00 00 00 02 75 00]; + samsung,self_mask_on_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 00 00 00 95 07 9e 09 5f 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_on_factory_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_off_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_disp_debug_rx_cmds_revA = [06 01 00 00 00 00 01 7f 04 01]; + samsung,self_mask_check_tx_pre1_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 04 b0 00 27 d8 29 01 00 00 00 00 02 d8 16 29 01 00 00 00 00 0a bf 01 07 00 00 00 10 00 00 00 29 01 00 00 11 00 02 7a 00 29 01 00 00 00 00 02 75 10 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,self_mask_check_tx_pre2_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 02 75 00 29 01 00 00 22 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 01 f4 02 33 09 60 09 61 00 00 ff ff ff 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,mask_crc_pass_data = [d3 9b]; + samsung,self_mask_check_rx_cmds_revA = [06 01 00 00 00 00 01 14 02 00]; + samsung,self_mask_check_tx_post_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 00 00 00 00 00 29 01 00 00 00 00 02 bf 00 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + phandle = <0x67>; + }; + }; + }; + + fragment@88 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + label = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0x1e6>; + qcom,mdss-brightness-max-level = <0x1e6>; + qcom,mdss-brightness-default-level = <0xff>; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-t-clk-pre = <0x3e>; + qcom,mdss-dsi-t-clk-post = <0x10>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x43>; + qcom,mdss-pan-physical-height-dimension = <0x96>; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-t-clk-pre-extend; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "irq_check"; + samsung,panel-vendor = "SDC"; + samsung,disp-model = "AMS646YD01"; + samsung,support_gamma_mode2; + samsung,skip_read_on_pre; + samsung,elvss_interpolation_temperature = <0xfffffff0>; + samsung,support_lpm; + samsung,support_gpara; + samsung,pointing_gpara; + samsung,two_byte_gpara; + samsung,rsc_4_frame_idle; + samsung,support_factory_panel_swap; + samsung,support-optical-fingerprint; + samsung,delayed-display-on = <0x1>; + samsung,support_vrr_based_bl; + samsung,esd-irq-trigger1 = "falling"; + ss,self_display = <0x67>; + samsung,level0_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 9f a5 a5]; + samsung,level0_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 9f 5a 5a]; + samsung,level1_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 5a 5a]; + samsung,level1_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 a5 a5]; + samsung,level2_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 fc 5a 5a]; + samsung,level2_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 fc a5 a5]; + samsung,brightness_tx_cmds_revA = <0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100>; + samsung,display_on_tx_cmds_revA = [29 00 00 00 00 00 03 9f a5 a5 05 00 00 00 00 00 02 29 00 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,display_off_tx_cmds_revA = [05 01 00 00 00 00 02 28 00]; + samsung,reg_read_pos_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 00 00]; + samsung,mtp_write_sysfs_tx_cmds_revA = <0x29000000 0x3d00 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + samsung,panel_ltps_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 50 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,smooth_dimming_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 91 63 29 00 00 00 00 00 02 63 20 29 01 00 00 11 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,gamma_mode2_normal_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26360 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x7290000 0x2 0x53202900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0002900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revE = <0x29000000 0x391 0x2012900 0x0 0x2532029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 1c 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,gamma_mode2_hbm_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26320 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x290000 0x2 0x53e02900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0072900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revE = <0x29000000 0x391 0x2002900 0x0 0x253e029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 14 29 00 00 00 00 00 02 53 e0 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,vrr_tx_cmds_revD = [29 00 00 00 00 00 03 60 00 04 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 b4 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a c0 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 02 29 00 00 00 00 00 02 f7 0f]; + samsung,vrr_tx_cmds_revA = [29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f]; + samsung,acl_on_tx_cmds_revA = [29 00 00 00 00 00 04 b0 03 b3 65 29 00 00 00 00 00 14 65 55 00 b0 51 66 98 15 55 55 55 08 f1 c6 48 40 00 20 10 09 29 00 00 00 00 00 02 55 03]; + samsung,acl_off_tx_cmds_revA = [29 01 00 00 00 00 02 55 00]; + samsung,manufacture_id0_rx_cmds_revA = [06 01 00 00 00 00 01 da 01 00 00]; + samsung,manufacture_id1_rx_cmds_revA = [06 01 00 00 00 00 01 db 01 00 00]; + samsung,manufacture_id2_rx_cmds_revA = [06 01 00 00 00 00 01 dc 01 00 00]; + samsung,module_info_rx_cmds_revA = [06 01 00 00 00 00 01 a1 0b 00 00]; + samsung,octa_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 04 00 0b]; + samsung,cell_id_rx_cmds_revA = [06 01 00 00 00 00 01 92 10 00 02]; + samsung,ddi_id_rx_cmds_revA = [06 01 00 00 00 00 01 d6 05 00 00]; + samsung,mtp_read_sysfs_rx_cmds_revA = [06 01 00 00 00 00 01 00 00 00 00]; + samsung,candela_map_table_revA = <0x0 0x0 0x0 0x2 0x2 0x1 0x1 0x1 0x3 0x2 0x2 0x2 0x2 0x4 0x3 0x3 0x3 0x3 0x5 0x3 0x4 0x4 0x4 0x7 0x4 0x5 0x5 0x5 0x8 0x5 0x6 0x6 0x6 0xa 0x5 0x7 0x7 0x7 0xc 0x6 0x8 0x8 0x8 0xd 0x7 0x9 0x9 0x9 0xf 0x7 0xa 0xa 0xa 0x11 0x8 0xb 0xb 0xb 0x13 0x9 0xc 0xc 0xc 0x15 0xa 0xd 0xd 0xd 0x18 0xb 0xe 0xe 0xe 0x1a 0xc 0xf 0xf 0xf 0x1c 0xd 0x10 0x10 0x10 0x1e 0xd 0x11 0x11 0x11 0x20 0xe 0x12 0x12 0x12 0x23 0xf 0x13 0x13 0x13 0x25 0x10 0x14 0x14 0x14 0x28 0x11 0x15 0x15 0x15 0x2a 0x12 0x16 0x16 0x16 0x2d 0x13 0x17 0x17 0x17 0x2f 0x14 0x18 0x18 0x18 0x32 0x15 0x19 0x19 0x19 0x34 0x16 0x1a 0x1a 0x1a 0x37 0x17 0x1b 0x1b 0x1b 0x3a 0x19 0x1c 0x1c 0x1c 0x3c 0x1a 0x1d 0x1d 0x1d 0x3f 0x1b 0x1e 0x1e 0x1e 0x42 0x1c 0x1f 0x1f 0x1f 0x45 0x1d 0x20 0x20 0x20 0x47 0x1e 0x21 0x21 0x21 0x4a 0x1f 0x22 0x22 0x22 0x4d 0x20 0x23 0x23 0x23 0x50 0x22 0x24 0x24 0x24 0x53 0x23 0x25 0x25 0x25 0x56 0x24 0x26 0x26 0x26 0x59 0x25 0x27 0x27 0x27 0x5c 0x26 0x28 0x28 0x28 0x5f 0x28 0x29 0x29 0x29 0x62 0x29 0x2a 0x2a 0x2a 0x65 0x2a 0x2b 0x2b 0x2b 0x68 0x2b 0x2c 0x2c 0x2c 0x6b 0x2d 0x2d 0x2d 0x2d 0x6e 0x2e 0x2e 0x2e 0x2e 0x71 0x2f 0x2f 0x2f 0x2f 0x74 0x30 0x30 0x30 0x30 0x77 0x32 0x31 0x31 0x31 0x7b 0x33 0x32 0x32 0x32 0x7e 0x34 0x33 0x33 0x33 0x81 0x36 0x34 0x34 0x34 0x84 0x37 0x35 0x35 0x35 0x88 0x38 0x36 0x36 0x36 0x8b 0x3a 0x37 0x37 0x37 0x8e 0x3b 0x38 0x38 0x38 0x92 0x3c 0x39 0x39 0x39 0x95 0x3e 0x3a 0x3a 0x3a 0x98 0x3f 0x3b 0x3b 0x3b 0x9c 0x40 0x3c 0x3c 0x3c 0x9f 0x42 0x3d 0x3d 0x3d 0xa2 0x43 0x3e 0x3e 0x3e 0xa6 0x44 0x3f 0x3f 0x3f 0xa9 0x46 0x40 0x40 0x40 0xad 0x47 0x41 0x41 0x41 0xb0 0x49 0x42 0x42 0x42 0xb4 0x4a 0x43 0x43 0x43 0xb7 0x4c 0x44 0x44 0x44 0xbb 0x4d 0x45 0x45 0x45 0xbe 0x4e 0x46 0x46 0x46 0xc2 0x50 0x47 0x47 0x47 0xc5 0x51 0x48 0x48 0x48 0xc9 0x53 0x49 0x49 0x49 0xcd 0x54 0x4a 0x4a 0x4a 0xd0 0x56 0x4b 0x4b 0x4b 0xd4 0x57 0x4c 0x4c 0x4c 0xd7 0x59 0x4d 0x4d 0x4d 0xdb 0x5a 0x4e 0x4e 0x4e 0xdf 0x5c 0x4f 0x4f 0x4f 0xe3 0x5d 0x50 0x50 0x50 0xe6 0x5f 0x51 0x51 0x51 0xea 0x60 0x52 0x52 0x52 0xee 0x62 0x53 0x53 0x53 0xf1 0x63 0x54 0x54 0x54 0xf5 0x65 0x55 0x55 0x55 0xf9 0x66 0x56 0x56 0x56 0xfd 0x68 0x57 0x57 0x57 0x101 0x69 0x58 0x58 0x58 0x104 0x6b 0x59 0x59 0x59 0x108 0x6c 0x5a 0x5a 0x5a 0x10c 0x6e 0x5b 0x5b 0x5b 0x110 0x70 0x5c 0x5c 0x5c 0x114 0x71 0x5d 0x5d 0x5d 0x118 0x73 0x5e 0x5e 0x5e 0x11b 0x74 0x5f 0x5f 0x5f 0x11f 0x76 0x60 0x60 0x60 0x123 0x77 0x61 0x61 0x61 0x127 0x79 0x62 0x62 0x62 0x12b 0x7b 0x63 0x63 0x63 0x12f 0x7c 0x64 0x64 0x64 0x133 0x7e 0x65 0x65 0x65 0x137 0x7f 0x66 0x66 0x66 0x13b 0x81 0x67 0x67 0x67 0x13f 0x83 0x68 0x68 0x68 0x143 0x84 0x69 0x69 0x69 0x147 0x86 0x6a 0x6a 0x6a 0x14b 0x88 0x6b 0x6b 0x6b 0x14f 0x89 0x6c 0x6c 0x6c 0x153 0x8b 0x6d 0x6d 0x6d 0x157 0x8c 0x6e 0x6e 0x6e 0x15b 0x8e 0x6f 0x6f 0x6f 0x15f 0x90 0x70 0x70 0x70 0x163 0x91 0x71 0x71 0x71 0x168 0x93 0x72 0x72 0x72 0x16c 0x95 0x73 0x73 0x73 0x170 0x96 0x74 0x74 0x74 0x174 0x98 0x75 0x75 0x75 0x178 0x9a 0x76 0x76 0x76 0x17c 0x9c 0x77 0x77 0x77 0x180 0x9d 0x78 0x78 0x78 0x185 0x9f 0x79 0x79 0x79 0x189 0xa1 0x7a 0x7a 0x7a 0x18d 0xa2 0x7b 0x7b 0x7b 0x191 0xa4 0x7c 0x7c 0x7c 0x195 0xa6 0x7d 0x7d 0x7d 0x19a 0xa7 0x7e 0x7e 0x7e 0x19e 0xa9 0x7f 0x7f 0x7f 0x1a2 0xab 0x80 0x80 0x80 0x1a6 0xad 0x81 0x81 0x81 0x1ab 0xae 0x82 0x82 0x82 0x1af 0xb0 0x83 0x83 0x83 0x1b3 0xb2 0x84 0x84 0x84 0x1b8 0xb4 0x85 0x85 0x85 0x1bc 0xb5 0x86 0x86 0x86 0x1c0 0xb7 0x87 0x87 0x87 0x1c5 0xb9 0x88 0x88 0x88 0x1c9 0xbb 0x89 0x89 0x89 0x1cd 0xbc 0x8a 0x8a 0x8a 0x1d1 0xbe 0x8b 0x8b 0x8b 0x1d6 0xc0 0x8c 0x8c 0x8c 0x1da 0xc2 0x8d 0x8d 0x8d 0x1de 0xc3 0x8e 0x8e 0x8e 0x1e3 0xc5 0x8f 0x8f 0x8f 0x1e7 0xc7 0x90 0x90 0x90 0x1eb 0xc9 0x91 0x91 0x91 0x1f0 0xcb 0x92 0x92 0x92 0x1f4 0xcc 0x93 0x93 0x93 0x1f8 0xce 0x94 0x94 0x94 0x1fd 0xd0 0x95 0x95 0x95 0x201 0xd2 0x96 0x96 0x96 0x206 0xd4 0x97 0x97 0x97 0x20a 0xd6 0x98 0x98 0x98 0x20e 0xd7 0x99 0x99 0x99 0x213 0xd9 0x9a 0x9a 0x9a 0x217 0xdb 0x9b 0x9b 0x9b 0x21c 0xdd 0x9c 0x9c 0x9c 0x220 0xdf 0x9d 0x9d 0x9d 0x225 0xe1 0x9e 0x9e 0x9e 0x229 0xe2 0x9f 0x9f 0x9f 0x22e 0xe4 0xa0 0xa0 0xa0 0x232 0xe6 0xa1 0xa1 0xa1 0x237 0xe8 0xa2 0xa2 0xa2 0x23b 0xea 0xa3 0xa3 0xa3 0x240 0xec 0xa4 0xa4 0xa4 0x244 0xed 0xa5 0xa5 0xa5 0x249 0xef 0xa6 0xa6 0xa6 0x24d 0xf1 0xa7 0xa7 0xa7 0x252 0xf3 0xa8 0xa8 0xa8 0x256 0xf5 0xa9 0xa9 0xa9 0x25b 0xf7 0xaa 0xaa 0xaa 0x260 0xf9 0xab 0xab 0xab 0x264 0xfb 0xac 0xac 0xac 0x269 0xfd 0xad 0xad 0xad 0x26d 0xfe 0xae 0xae 0xae 0x272 0x100 0xaf 0xaf 0xaf 0x277 0x102 0xb0 0xb0 0xb0 0x27b 0x104 0xb1 0xb1 0xb1 0x280 0x106 0xb2 0xb2 0xb2 0x284 0x108 0xb3 0xb3 0xb3 0x289 0x10a 0xb4 0xb4 0xb4 0x28e 0x10c 0xb5 0xb5 0xb5 0x292 0x10e 0xb6 0xb6 0xb6 0x297 0x110 0xb7 0xb7 0xb7 0x29c 0x112 0xb8 0xb8 0xb8 0x2a0 0x113 0xb9 0xb9 0xb9 0x2a5 0x115 0xba 0xba 0xba 0x2aa 0x117 0xbb 0xbb 0xbb 0x2ae 0x119 0xbc 0xbc 0xbc 0x2b3 0x11b 0xbd 0xbd 0xbd 0x2b8 0x11d 0xbe 0xbe 0xbe 0x2bd 0x11f 0xbf 0xbf 0xbf 0x2c1 0x121 0xc0 0xc0 0xc0 0x2c6 0x123 0xc1 0xc1 0xc1 0x2cb 0x125 0xc2 0xc2 0xc2 0x2d0 0x127 0xc3 0xc3 0xc3 0x2d4 0x129 0xc4 0xc4 0xc4 0x2d9 0x12b 0xc5 0xc5 0xc5 0x2de 0x12d 0xc6 0xc6 0xc6 0x2e3 0x12f 0xc7 0xc7 0xc7 0x2e8 0x131 0xc8 0xc8 0xc8 0x2ec 0x133 0xc9 0xc9 0xc9 0x2f1 0x135 0xca 0xca 0xca 0x2f6 0x137 0xcb 0xcb 0xcb 0x2fb 0x139 0xcc 0xcc 0xcc 0x300 0x13b 0xcd 0xcd 0xcd 0x304 0x13d 0xce 0xce 0xce 0x309 0x13f 0xcf 0xcf 0xcf 0x30e 0x141 0xd0 0xd0 0xd0 0x313 0x143 0xd1 0xd1 0xd1 0x318 0x145 0xd2 0xd2 0xd2 0x31d 0x147 0xd3 0xd3 0xd3 0x322 0x149 0xd4 0xd4 0xd4 0x327 0x14b 0xd5 0xd5 0xd5 0x32b 0x14d 0xd6 0xd6 0xd6 0x330 0x14f 0xd7 0xd7 0xd7 0x335 0x151 0xd8 0xd8 0xd8 0x33a 0x153 0xd9 0xd9 0xd9 0x33f 0x155 0xda 0xda 0xda 0x344 0x157 0xdb 0xdb 0xdb 0x349 0x159 0xdc 0xdc 0xdc 0x34e 0x15b 0xdd 0xdd 0xdd 0x353 0x15d 0xde 0xde 0xde 0x358 0x15f 0xdf 0xdf 0xdf 0x35d 0x161 0xe0 0xe0 0xe0 0x362 0x163 0xe1 0xe1 0xe1 0x367 0x165 0xe2 0xe2 0xe2 0x36c 0x167 0xe3 0xe3 0xe3 0x371 0x169 0xe4 0xe4 0xe4 0x376 0x16b 0xe5 0xe5 0xe5 0x37b 0x16d 0xe6 0xe6 0xe6 0x380 0x170 0xe7 0xe7 0xe7 0x385 0x172 0xe8 0xe8 0xe8 0x38a 0x174 0xe9 0xe9 0xe9 0x38f 0x176 0xea 0xea 0xea 0x394 0x178 0xeb 0xeb 0xeb 0x399 0x17a 0xec 0xec 0xec 0x39e 0x17c 0xed 0xed 0xed 0x3a3 0x17e 0xee 0xee 0xee 0x3a8 0x180 0xef 0xef 0xef 0x3ad 0x182 0xf0 0xf0 0xf0 0x3b2 0x184 0xf1 0xf1 0xf1 0x3b7 0x186 0xf2 0xf2 0xf2 0x3bc 0x189 0xf3 0xf3 0xf3 0x3c1 0x18b 0xf4 0xf4 0xf4 0x3c7 0x18d 0xf5 0xf5 0xf5 0x3cc 0x18f 0xf6 0xf6 0xf6 0x3d1 0x191 0xf7 0xf7 0xf7 0x3d6 0x193 0xf8 0xf8 0xf8 0x3db 0x195 0xf9 0xf9 0xf9 0x3e0 0x197 0xfa 0xfa 0xfa 0x3e5 0x199 0xfb 0xfb 0xfb 0x3ea 0x19b 0xfc 0xfc 0xfc 0x3f0 0x19e 0xfd 0xfd 0xfd 0x3f5 0x1a0 0xfe 0xfe 0xfe 0x3fa 0x1a2 0xff 0xff 0xff 0x3ff 0x1a4>; + samsung,hbm_candela_map_table_revG = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x2 0x1aa 0x2 0x102 0x102 0x4 0x1ac 0x3 0x103 0x103 0x6 0x1ae 0x4 0x104 0x104 0x8 0x1b0 0x5 0x105 0x105 0xa 0x1b1 0x6 0x106 0x106 0xc 0x1b3 0x7 0x107 0x107 0xe 0x1b4 0x8 0x108 0x108 0x10 0x1b6 0x9 0x109 0x109 0x12 0x1b8 0xa 0x10a 0x10a 0x14 0x1b9 0xb 0x10b 0x10b 0x16 0x1bb 0xc 0x10c 0x10c 0x18 0x1bc 0xd 0x10d 0x10d 0x1a 0x1be 0xe 0x10e 0x10e 0x1c 0x1c0 0xf 0x10f 0x10f 0x1e 0x1c2 0x10 0x110 0x110 0x20 0x1c3 0x11 0x111 0x111 0x22 0x1c5 0x12 0x112 0x112 0x24 0x1c6 0x13 0x113 0x113 0x25 0x1c8 0x14 0x114 0x114 0x26 0x1ca 0x15 0x115 0x115 0x27 0x1cb 0x16 0x116 0x116 0x28 0x1cd 0x17 0x117 0x117 0x29 0x1ce 0x18 0x118 0x118 0x2a 0x1d0 0x19 0x119 0x119 0x2b 0x1d2 0x1a 0x11a 0x11a 0x2c 0x1d4 0x1b 0x11b 0x11b 0x2d 0x1d5 0x1c 0x11c 0x11c 0x2e 0x1d7 0x1d 0x11d 0x11d 0x2f 0x1d8 0x1e 0x11e 0x11e 0x30 0x1da 0x1f 0x11f 0x11f 0x31 0x1dc 0x20 0x120 0x120 0x32 0x1dd 0x21 0x121 0x121 0x33 0x1df 0x22 0x122 0x122 0x34 0x1e0 0x23 0x123 0x123 0x35 0x1e2 0x24 0x124 0x124 0x36 0x1e4 0x25 0x125 0x125 0x37 0x1e5 0x26 0x126 0x126 0x38 0x1e7 0x27 0x127 0x127 0x39 0x1e8 0x28 0x128 0x128 0x3a 0x1ea 0x29 0x129 0x129 0x3b 0x1ec 0x2a 0x12a 0x12a 0x3c 0x1ee 0x2b 0x12b 0x12b 0x3d 0x1ef 0x2c 0x12c 0x12c 0x3e 0x1f1 0x2d 0x12d 0x12d 0x3f 0x1f2 0x2e 0x12e 0x12e 0x40 0x1f4 0x2f 0x12f 0x12f 0x41 0x1f6 0x30 0x130 0x130 0x42 0x1f7 0x31 0x131 0x131 0x43 0x1f9 0x32 0x132 0x132 0x44 0x1fa 0x33 0x133 0x133 0x45 0x1fc 0x34 0x134 0x134 0x46 0x1fe 0x35 0x135 0x135 0x47 0x200 0x36 0x136 0x136 0x48 0x201 0x37 0x137 0x137 0x49 0x203 0x38 0x138 0x138 0x4a 0x204 0x39 0x139 0x139 0x4b 0x206 0x3a 0x13a 0x13a 0x4c 0x208 0x3b 0x13b 0x13b 0x4d 0x209 0x3c 0x13c 0x13c 0x4e 0x20b 0x3d 0x13d 0x13d 0x4f 0x20c 0x3e 0x13e 0x13e 0x50 0x20e 0x3f 0x13f 0x13f 0x51 0x210 0x40 0x140 0x140 0x52 0x211 0x41 0x141 0x141 0x53 0x213 0x42 0x142 0x142 0x54 0x215 0x43 0x143 0x143 0x55 0x216 0x44 0x144 0x144 0x56 0x218 0x45 0x145 0x145 0x57 0x21a 0x46 0x146 0x146 0x58 0x21b 0x47 0x147 0x147 0x59 0x21d 0x48 0x148 0x148 0x5a 0x21e 0x49 0x149 0x149 0x5b 0x220 0x4a 0x14a 0x14a 0x5c 0x222 0x4b 0x14b 0x14b 0x5d 0x223 0x4c 0x14c 0x14c 0x5f 0x225 0x4d 0x14d 0x14d 0x61 0x226 0x4e 0x14e 0x14e 0x63 0x228 0x4f 0x14f 0x14f 0x65 0x22a 0x50 0x150 0x150 0x67 0x22b 0x51 0x151 0x151 0x69 0x22d 0x52 0x152 0x152 0x6b 0x22f 0x53 0x153 0x153 0x6d 0x230 0x54 0x154 0x154 0x6f 0x232 0x55 0x155 0x155 0x71 0x234 0x56 0x156 0x156 0x73 0x235 0x57 0x157 0x157 0x75 0x237 0x58 0x158 0x158 0x77 0x238 0x59 0x159 0x159 0x79 0x23a 0x5a 0x15a 0x15a 0x7b 0x23c 0x5b 0x15b 0x15b 0x7d 0x23d 0x5c 0x15c 0x15c 0x7f 0x23f 0x5d 0x15d 0x15d 0x81 0x241 0x5e 0x15e 0x15e 0x83 0x242 0x5f 0x15f 0x15f 0x85 0x244 0x60 0x160 0x160 0x87 0x246 0x61 0x161 0x161 0x89 0x247 0x62 0x162 0x162 0x8b 0x249 0x63 0x163 0x163 0x8d 0x24a 0x64 0x164 0x164 0x8f 0x24c 0x65 0x165 0x165 0x91 0x24e 0x66 0x166 0x166 0x93 0x24f 0x67 0x167 0x167 0x95 0x251 0x68 0x168 0x168 0x97 0x253 0x69 0x169 0x169 0x9a 0x254 0x6a 0x16a 0x16a 0x9d 0x256 0x6b 0x16b 0x16b 0xa0 0x257 0x6c 0x16c 0x16c 0xa3 0x259 0x6d 0x16d 0x16d 0xa6 0x25b 0x6e 0x16e 0x16e 0xa8 0x25c 0x6f 0x16f 0x16f 0xab 0x25e 0x70 0x170 0x170 0xae 0x260 0x71 0x171 0x171 0xb1 0x261 0x72 0x172 0x172 0xb4 0x263 0x73 0x173 0x173 0xb7 0x264 0x74 0x174 0x174 0xba 0x266 0x75 0x175 0x175 0xbd 0x268 0x76 0x176 0x176 0xc0 0x269 0x77 0x177 0x177 0xc3 0x26b 0x78 0x178 0x178 0xc6 0x26d 0x79 0x179 0x179 0xc9 0x26e 0x7a 0x17a 0x17a 0xcc 0x270 0x7b 0x17b 0x17b 0xcf 0x272 0x7c 0x17c 0x17c 0xd2 0x273 0x7d 0x17d 0x17d 0xd5 0x275 0x7e 0x17e 0x17e 0xd8 0x276 0x7f 0x17f 0x17f 0xdb 0x278 0x80 0x180 0x180 0xde 0x27a 0x81 0x181 0x181 0xe1 0x27b 0x82 0x182 0x182 0xe4 0x27d 0x83 0x183 0x183 0xe7 0x27f 0x84 0x184 0x184 0xea 0x280 0x85 0x185 0x185 0xed 0x282 0x86 0x186 0x186 0xf0 0x283 0x87 0x187 0x187 0xf3 0x285 0x88 0x188 0x188 0xf6 0x287 0x89 0x189 0x189 0xf9 0x288 0x8a 0x18a 0x18a 0xfc 0x28a 0x8b 0x18b 0x18b 0xff 0x28c 0x8c 0x18c 0x18c 0x102 0x28d 0x8d 0x18d 0x18d 0x105 0x28f 0x8e 0x18e 0x18e 0x108 0x291 0x8f 0x18f 0x18f 0x10b 0x292 0x90 0x190 0x190 0x10e 0x294 0x91 0x191 0x191 0x111 0x295 0x92 0x192 0x192 0x114 0x297 0x93 0x193 0x193 0x117 0x299 0x94 0x194 0x194 0x11a 0x29a 0x95 0x195 0x195 0x11d 0x29c 0x96 0x196 0x196 0x120 0x29e 0x97 0x197 0x197 0x123 0x29f 0x98 0x198 0x198 0x126 0x2a1 0x99 0x199 0x199 0x129 0x2a3 0x9a 0x19a 0x19a 0x12c 0x2a4 0x9b 0x19b 0x19b 0x12f 0x2a6 0x9c 0x19c 0x19c 0x132 0x2a7 0x9d 0x19d 0x19d 0x135 0x2a9 0x9e 0x19e 0x19e 0x138 0x2ab 0x9f 0x19f 0x19f 0x13b 0x2ac 0xa0 0x1a0 0x1a0 0x13e 0x2ae 0xa1 0x1a1 0x1a1 0x141 0x2af 0xa2 0x1a2 0x1a2 0x144 0x2b1 0xa3 0x1a3 0x1a3 0x147 0x2b3 0xa4 0x1a4 0x1a4 0x14a 0x2b4 0xa5 0x1a5 0x1a5 0x14d 0x2b6 0xa6 0x1a6 0x1a6 0x150 0x2b8 0xa7 0x1a7 0x1a7 0x153 0x2b9 0xa8 0x1a8 0x1a8 0x156 0x2bb 0xa9 0x1a9 0x1a9 0x159 0x2bd 0xaa 0x1aa 0x1aa 0x15c 0x2be 0xab 0x1ab 0x1ab 0x15f 0x2c0 0xac 0x1ac 0x1ac 0x162 0x2c1 0xad 0x1ad 0x1ad 0x165 0x2c3 0xae 0x1ae 0x1ae 0x168 0x2c5 0xaf 0x1af 0x1af 0x16b 0x2c6 0xb0 0x1b0 0x1b0 0x16e 0x2c8 0xb1 0x1b1 0x1b1 0x171 0x2c9 0xb2 0x1b2 0x1b2 0x174 0x2cb 0xb3 0x1b3 0x1b3 0x177 0x2cd 0xb4 0x1b4 0x1b4 0x17a 0x2cf 0xb5 0x1b5 0x1b5 0x17d 0x2d0 0xb6 0x1b6 0x1b6 0x180 0x2d2 0xb7 0x1b7 0x1b7 0x183 0x2d3 0xb8 0x1b8 0x1b8 0x186 0x2d5 0xb9 0x1b9 0x1b9 0x189 0x2d7 0xba 0x1ba 0x1ba 0x18c 0x2d8 0xbb 0x1bb 0x1bb 0x18f 0x2da 0xbc 0x1bc 0x1bc 0x192 0x2db 0xbd 0x1bd 0x1bd 0x195 0x2dd 0xbe 0x1be 0x1be 0x198 0x2df 0xbf 0x1bf 0x1bf 0x19b 0x2e1 0xc0 0x1c0 0x1c0 0x19e 0x2e2 0xc1 0x1c1 0x1c1 0x1a1 0x2e4 0xc2 0x1c2 0x1c2 0x1a4 0x2e5 0xc3 0x1c3 0x1c3 0x1a7 0x2e7 0xc4 0x1c4 0x1c4 0x1aa 0x2e9 0xc5 0x1c5 0x1c5 0x1ad 0x2ea 0xc6 0x1c6 0x1c6 0x1b0 0x2ec 0xc7 0x1c7 0x1c7 0x1b3 0x2ed 0xc8 0x1c8 0x1c8 0x1b6 0x2ef 0xc9 0x1c9 0x1c9 0x1b9 0x2f1 0xca 0x1ca 0x1ca 0x1bc 0x2f2 0xcb 0x1cb 0x1cb 0x1bf 0x2f4 0xcc 0x1cc 0x1cc 0x1c2 0x2f5 0xcd 0x1cd 0x1cd 0x1c5 0x2f7 0xce 0x1ce 0x1ce 0x1c8 0x2f9 0xcf 0x1cf 0x1cf 0x1cb 0x2fb 0xd0 0x1d0 0x1d0 0x1ce 0x2fc 0xd1 0x1d1 0x1d1 0x1d1 0x2fe 0xd2 0x1d2 0x1d2 0x1d4 0x2ff 0xd3 0x1d3 0x1d3 0x1d7 0x301 0xd4 0x1d4 0x1d4 0x1da 0x303 0xd5 0x1d5 0x1d5 0x1dd 0x304 0xd6 0x1d6 0x1d6 0x1e0 0x306 0xd7 0x1d7 0x1d7 0x1e3 0x307 0xd8 0x1d8 0x1d8 0x1e6 0x309 0xd9 0x1d9 0x1d9 0x1e9 0x30b 0xda 0x1da 0x1da 0x1ec 0x30d 0xdb 0x1db 0x1db 0x1ef 0x30e 0xdc 0x1dc 0x1dc 0x1f2 0x310 0xdd 0x1dd 0x1dd 0x1f5 0x311 0xde 0x1de 0x1de 0x1f8 0x313 0xdf 0x1df 0x1df 0x1fb 0x315 0xe0 0x1e0 0x1e0 0x1fe 0x316 0xe1 0x1e1 0x1e1 0x201 0x318 0xe2 0x1e2 0x1e2 0x204 0x319 0xe3 0x1e3 0x1e3 0x207 0x31b 0xe4 0x1e4 0x1e4 0x20a 0x31d 0xe5 0x1e5 0x1e5 0x20d 0x31f 0xe6 0x1e6 0x1e6 0x210 0x320>; + samsung,hbm_candela_map_table_revA = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x3 0x1aa 0x2 0x102 0x102 0x6 0x1ac 0x3 0x103 0x103 0x9 0x1ae 0x4 0x104 0x104 0xc 0x1b0 0x5 0x105 0x105 0xf 0x1b1 0x6 0x106 0x106 0x12 0x1b3 0x7 0x107 0x107 0x15 0x1b4 0x8 0x108 0x108 0x18 0x1b6 0x9 0x109 0x109 0x1b 0x1b8 0xa 0x10a 0x10a 0x1e 0x1b9 0xb 0x10b 0x10b 0x21 0x1bb 0xc 0x10c 0x10c 0x24 0x1bc 0xd 0x10d 0x10d 0x27 0x1be 0xe 0x10e 0x10e 0x2a 0x1c0 0xf 0x10f 0x10f 0x2d 0x1c2 0x10 0x110 0x110 0x30 0x1c3 0x11 0x111 0x111 0x33 0x1c5 0x12 0x112 0x112 0x36 0x1c6 0x13 0x113 0x113 0x39 0x1c8 0x14 0x114 0x114 0x3c 0x1ca 0x15 0x115 0x115 0x3f 0x1cb 0x16 0x116 0x116 0x42 0x1cd 0x17 0x117 0x117 0x45 0x1ce 0x18 0x118 0x118 0x48 0x1d0 0x19 0x119 0x119 0x4b 0x1d2 0x1a 0x11a 0x11a 0x4e 0x1d4 0x1b 0x11b 0x11b 0x51 0x1d5 0x1c 0x11c 0x11c 0x54 0x1d7 0x1d 0x11d 0x11d 0x56 0x1d8 0x1e 0x11e 0x11e 0x58 0x1da 0x1f 0x11f 0x11f 0x5a 0x1dc 0x20 0x120 0x120 0x5c 0x1dd 0x21 0x121 0x121 0x5e 0x1df 0x22 0x122 0x122 0x60 0x1e0 0x23 0x123 0x123 0x62 0x1e2 0x24 0x124 0x124 0x64 0x1e4 0x25 0x125 0x125 0x66 0x1e5 0x26 0x126 0x126 0x68 0x1e7 0x27 0x127 0x127 0x6a 0x1e8 0x28 0x128 0x128 0x6c 0x1ea 0x29 0x129 0x129 0x6e 0x1ec 0x2a 0x12a 0x12a 0x70 0x1ee 0x2b 0x12b 0x12b 0x72 0x1ef 0x2c 0x12c 0x12c 0x74 0x1f1 0x2d 0x12d 0x12d 0x76 0x1f2 0x2e 0x12e 0x12e 0x78 0x1f4 0x2f 0x12f 0x12f 0x7a 0x1f6 0x30 0x130 0x130 0x7c 0x1f7 0x31 0x131 0x131 0x7e 0x1f9 0x32 0x132 0x132 0x80 0x1fa 0x33 0x133 0x133 0x82 0x1fc 0x34 0x134 0x134 0x84 0x1fe 0x35 0x135 0x135 0x86 0x200 0x36 0x136 0x136 0x88 0x201 0x37 0x137 0x137 0x8a 0x203 0x38 0x138 0x138 0x8c 0x204 0x39 0x139 0x139 0x8e 0x206 0x3a 0x13a 0x13a 0x90 0x208 0x3b 0x13b 0x13b 0x92 0x209 0x3c 0x13c 0x13c 0x94 0x20b 0x3d 0x13d 0x13d 0x96 0x20c 0x3e 0x13e 0x13e 0x98 0x20e 0x3f 0x13f 0x13f 0x9a 0x210 0x40 0x140 0x140 0x9c 0x211 0x41 0x141 0x141 0x9e 0x213 0x42 0x142 0x142 0xa0 0x215 0x43 0x143 0x143 0xa2 0x216 0x44 0x144 0x144 0xa4 0x218 0x45 0x145 0x145 0xa6 0x21a 0x46 0x146 0x146 0xa8 0x21b 0x47 0x147 0x147 0xaa 0x21d 0x48 0x148 0x148 0xac 0x21e 0x49 0x149 0x149 0xae 0x220 0x4a 0x14a 0x14a 0xb0 0x222 0x4b 0x14b 0x14b 0xb2 0x223 0x4c 0x14c 0x14c 0xb6 0x225 0x4d 0x14d 0x14d 0xba 0x226 0x4e 0x14e 0x14e 0xbe 0x228 0x4f 0x14f 0x14f 0xc2 0x22a 0x50 0x150 0x150 0xc6 0x22b 0x51 0x151 0x151 0xcb 0x22d 0x52 0x152 0x152 0xd0 0x22f 0x53 0x153 0x153 0xd5 0x230 0x54 0x154 0x154 0xda 0x232 0x55 0x155 0x155 0xdf 0x234 0x56 0x156 0x156 0xe4 0x235 0x57 0x157 0x157 0xe9 0x237 0x58 0x158 0x158 0xee 0x238 0x59 0x159 0x159 0xf3 0x23a 0x5a 0x15a 0x15a 0xf8 0x23c 0x5b 0x15b 0x15b 0xfd 0x23d 0x5c 0x15c 0x15c 0x102 0x23f 0x5d 0x15d 0x15d 0x107 0x241 0x5e 0x15e 0x15e 0x10c 0x242 0x5f 0x15f 0x15f 0x111 0x244 0x60 0x160 0x160 0x116 0x246 0x61 0x161 0x161 0x11b 0x247 0x62 0x162 0x162 0x120 0x249 0x63 0x163 0x163 0x125 0x24a 0x64 0x164 0x164 0x12a 0x24c 0x65 0x165 0x165 0x12f 0x24e 0x66 0x166 0x166 0x134 0x24f 0x67 0x167 0x167 0x139 0x251 0x68 0x168 0x168 0x13e 0x253 0x69 0x169 0x169 0x143 0x254 0x6a 0x16a 0x16a 0x148 0x256 0x6b 0x16b 0x16b 0x14d 0x257 0x6c 0x16c 0x16c 0x152 0x259 0x6d 0x16d 0x16d 0x157 0x25b 0x6e 0x16e 0x16e 0x15c 0x25c 0x6f 0x16f 0x16f 0x161 0x25e 0x70 0x170 0x170 0x166 0x260 0x71 0x171 0x171 0x16b 0x261 0x72 0x172 0x172 0x170 0x263 0x73 0x173 0x173 0x175 0x264 0x74 0x174 0x174 0x17a 0x266 0x75 0x175 0x175 0x17f 0x268 0x76 0x176 0x176 0x184 0x269 0x77 0x177 0x177 0x189 0x26b 0x78 0x178 0x178 0x18e 0x26d 0x79 0x179 0x179 0x193 0x26e 0x7a 0x17a 0x17a 0x198 0x270 0x7b 0x17b 0x17b 0x19d 0x272 0x7c 0x17c 0x17c 0x1a2 0x273 0x7d 0x17d 0x17d 0x1a7 0x275 0x7e 0x17e 0x17e 0x1ac 0x276 0x7f 0x17f 0x17f 0x1b1 0x278 0x80 0x180 0x180 0x1b6 0x27a 0x81 0x181 0x181 0x1bb 0x27b 0x82 0x182 0x182 0x1c0 0x27d 0x83 0x183 0x183 0x1c5 0x27f 0x84 0x184 0x184 0x1ca 0x280 0x85 0x185 0x185 0x1cf 0x282 0x86 0x186 0x186 0x1d4 0x283 0x87 0x187 0x187 0x1d9 0x285 0x88 0x188 0x188 0x1de 0x287 0x89 0x189 0x189 0x1e3 0x288 0x8a 0x18a 0x18a 0x1e8 0x28a 0x8b 0x18b 0x18b 0x1ed 0x28c 0x8c 0x18c 0x18c 0x1f2 0x28d 0x8d 0x18d 0x18d 0x1f7 0x28f 0x8e 0x18e 0x18e 0x1fc 0x291 0x8f 0x18f 0x18f 0x201 0x292 0x90 0x190 0x190 0x206 0x294 0x91 0x191 0x191 0x20b 0x295 0x92 0x192 0x192 0x210 0x297 0x93 0x193 0x193 0x215 0x299 0x94 0x194 0x194 0x21a 0x29a 0x95 0x195 0x195 0x21f 0x29c 0x96 0x196 0x196 0x224 0x29e 0x97 0x197 0x197 0x229 0x29f 0x98 0x198 0x198 0x22e 0x2a1 0x99 0x199 0x199 0x233 0x2a3 0x9a 0x19a 0x19a 0x238 0x2a4 0x9b 0x19b 0x19b 0x23d 0x2a6 0x9c 0x19c 0x19c 0x242 0x2a7 0x9d 0x19d 0x19d 0x247 0x2a9 0x9e 0x19e 0x19e 0x24d 0x2ab 0x9f 0x19f 0x19f 0x253 0x2ac 0xa0 0x1a0 0x1a0 0x259 0x2ae 0xa1 0x1a1 0x1a1 0x25f 0x2af 0xa2 0x1a2 0x1a2 0x265 0x2b1 0xa3 0x1a3 0x1a3 0x26b 0x2b3 0xa4 0x1a4 0x1a4 0x271 0x2b4 0xa5 0x1a5 0x1a5 0x277 0x2b6 0xa6 0x1a6 0x1a6 0x27d 0x2b8 0xa7 0x1a7 0x1a7 0x283 0x2b9 0xa8 0x1a8 0x1a8 0x289 0x2bb 0xa9 0x1a9 0x1a9 0x28f 0x2bd 0xaa 0x1aa 0x1aa 0x295 0x2be 0xab 0x1ab 0x1ab 0x29b 0x2c0 0xac 0x1ac 0x1ac 0x2a1 0x2c1 0xad 0x1ad 0x1ad 0x2a7 0x2c3 0xae 0x1ae 0x1ae 0x2ad 0x2c5 0xaf 0x1af 0x1af 0x2b3 0x2c6 0xb0 0x1b0 0x1b0 0x2b9 0x2c8 0xb1 0x1b1 0x1b1 0x2bf 0x2c9 0xb2 0x1b2 0x1b2 0x2c5 0x2cb 0xb3 0x1b3 0x1b3 0x2cb 0x2cd 0xb4 0x1b4 0x1b4 0x2d1 0x2cf 0xb5 0x1b5 0x1b5 0x2d7 0x2d0 0xb6 0x1b6 0x1b6 0x2dd 0x2d2 0xb7 0x1b7 0x1b7 0x2e3 0x2d3 0xb8 0x1b8 0x1b8 0x2e9 0x2d5 0xb9 0x1b9 0x1b9 0x2ef 0x2d7 0xba 0x1ba 0x1ba 0x2f5 0x2d8 0xbb 0x1bb 0x1bb 0x2fb 0x2da 0xbc 0x1bc 0x1bc 0x301 0x2db 0xbd 0x1bd 0x1bd 0x307 0x2dd 0xbe 0x1be 0x1be 0x30d 0x2df 0xbf 0x1bf 0x1bf 0x313 0x2e1 0xc0 0x1c0 0x1c0 0x319 0x2e2 0xc1 0x1c1 0x1c1 0x31f 0x2e4 0xc2 0x1c2 0x1c2 0x325 0x2e5 0xc3 0x1c3 0x1c3 0x32b 0x2e7 0xc4 0x1c4 0x1c4 0x331 0x2e9 0xc5 0x1c5 0x1c5 0x337 0x2ea 0xc6 0x1c6 0x1c6 0x33d 0x2ec 0xc7 0x1c7 0x1c7 0x343 0x2ed 0xc8 0x1c8 0x1c8 0x349 0x2ef 0xc9 0x1c9 0x1c9 0x34f 0x2f1 0xca 0x1ca 0x1ca 0x355 0x2f2 0xcb 0x1cb 0x1cb 0x35b 0x2f4 0xcc 0x1cc 0x1cc 0x361 0x2f5 0xcd 0x1cd 0x1cd 0x367 0x2f7 0xce 0x1ce 0x1ce 0x36d 0x2f9 0xcf 0x1cf 0x1cf 0x373 0x2fb 0xd0 0x1d0 0x1d0 0x379 0x2fc 0xd1 0x1d1 0x1d1 0x37f 0x2fe 0xd2 0x1d2 0x1d2 0x385 0x2ff 0xd3 0x1d3 0x1d3 0x38b 0x301 0xd4 0x1d4 0x1d4 0x391 0x303 0xd5 0x1d5 0x1d5 0x397 0x304 0xd6 0x1d6 0x1d6 0x39d 0x306 0xd7 0x1d7 0x1d7 0x3a3 0x307 0xd8 0x1d8 0x1d8 0x3a9 0x309 0xd9 0x1d9 0x1d9 0x3af 0x30b 0xda 0x1da 0x1da 0x3b5 0x30d 0xdb 0x1db 0x1db 0x3bb 0x30e 0xdc 0x1dc 0x1dc 0x3c1 0x310 0xdd 0x1dd 0x1dd 0x3c7 0x311 0xde 0x1de 0x1de 0x3cd 0x313 0xdf 0x1df 0x1df 0x3d3 0x315 0xe0 0x1e0 0x1e0 0x3d9 0x316 0xe1 0x1e1 0x1e1 0x3df 0x318 0xe2 0x1e2 0x1e2 0x3e5 0x319 0xe3 0x1e3 0x1e3 0x3eb 0x31b 0xe4 0x1e4 0x1e4 0x3f1 0x31d 0xe5 0x1e5 0x1e5 0x3f7 0x31f 0xe6 0x1e6 0x1e6 0x3ff 0x320>; + samsung,aod_candela_map_table_revA = <0x0 0x0 0xb 0x1b 0x2 0x1 0xc 0x1f 0x1a 0xa 0x2 0x20 0x36 0x19 0x1e 0x3 0x37 0xff 0x18 0x3c>; + samsung,support_dynamic_mipi_clk; + samsung,ffc_tx_cmds_revD = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 2e c5 29 00 00 00 00 00 03 c5 36 41 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revD = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53641 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c535a8 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53741>; + samsung,ffc_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 32 b1 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revA = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b1 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53222 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c533a0>; + samsung,dynamic_mipi_clk_timing_table = <0x65fbc9c0 0x671db480 0x6422c400>; + samsung,dynamic_mipi_clk_sel_table = <0x1 0x1 0x0 0x0 0x0 0x1 0x2 0x0 0x0 0x2 0x1 0x3 0x0 0x0 0x2 0x1 0x4 0x0 0x0 0x1 0x2 0xb 0x2942 0x29a2 0x0 0x2 0xb 0x29a3 0x29e8 0x1 0x2 0xb 0x29e9 0x2a56 0x0 0x2 0xc 0x25be 0x26d2 0x0 0x2 0xd 0x48a 0x54d 0x0 0x2 0xd 0x54e 0x593 0x1 0x2 0xd 0x594 0x5e9 0x0 0x2 0xe 0x601 0x661 0x0 0x2 0xe 0x662 0x6a7 0x1 0x2 0xe 0x6a8 0x6ca 0x0 0x2 0xf 0x1105 0x116a 0x0 0x2 0x11 0x8bd 0x8e6 0x0 0x2 0x11 0x8e7 0x92c 0x1 0x2 0x11 0x92d 0xa03 0x0 0x2 0x12 0xb79 0xb86 0x1 0x2 0x12 0xb87 0xb98 0x2 0x2 0x12 0xb99 0xc10 0x0 0x3 0x5b 0x0 0xd9 0x0 0x3 0x5b 0xda 0x165 0x1 0x3 0x5b 0x166 0x257 0x0 0x3 0x5c 0x258 0x26a 0x1 0x3 0x5c 0x26b 0x4a7 0x0 0x3 0x5c 0x4a8 0x4af 0x1 0x3 0x5d 0x4b0 0x64f 0x0 0x3 0x5d 0x650 0x6db 0x1 0x3 0x5d 0x6dc 0x79d 0x0 0x3 0x5e 0x79e 0x877 0x0 0x3 0x5e 0x878 0x903 0x1 0x3 0x5e 0x904 0x95f 0x0 0x3 0x5f 0x960 0xa59 0x0 0x3 0x61 0xabe 0xb29 0x0 0x3 0x61 0xb2a 0xbb5 0x1 0x3 0x61 0xbb6 0xd79 0x0 0x3 0x62 0xd7a 0xdac 0x1 0x3 0x62 0xdad 0xdd1 0x2 0x3 0x62 0xdd2 0xed7 0x0 0x3 0x66 0x1392 0x143b 0x0 0x3 0x67 0x143c 0x149f 0x0 0x3 0x68 0x14a0 0x1503 0x0 0x3 0x6b 0x1662 0x16d9 0x0 0x3 0x6c 0x16da 0x16f2 0x2 0x3 0x6c 0x16f3 0x176f 0x0 0x3 0x6d 0x1770 0x1805 0x0 0x3 0x6e 0x1806 0x1808 0x2 0x3 0x6e 0x1809 0x1931 0x0 0x3 0x6f 0x1932 0x1984 0x1 0x3 0x6f 0x1985 0x19c7 0x0 0x3 0x73 0x1f68 0x1f7a 0x1 0x3 0x73 0x1f7b 0x21b7 0x0 0x3 0x73 0x21b8 0x21f1 0x1 0x3 0x74 0x21f2 0x2214 0x2 0x3 0x74 0x2215 0x234f 0x0 0x3 0x76 0x23fa 0x24ba 0x0 0x3 0x76 0x24bb 0x2511 0x1 0x3 0x76 0x2512 0x2546 0x2 0x3 0x76 0x2547 0x25bb 0x0 0x3 0x77 0x25bc 0x25d9 0x2 0x3 0x77 0x25da 0x2629 0x0 0x3 0x78 0x262a 0x268a 0x1 0x3 0x78 0x268b 0x268d 0x0 0x3 0x7a 0x26c0 0x283d 0x0 0x3 0x7a 0x283e 0x2877 0x1 0x3 0x7c 0x8d68 0x8dfd 0x0 0x3 0x80 0x9376 0x9398 0x1 0x3 0x80 0x9399 0x9569 0x0 0x3 0x81 0x956a 0x96e4 0x0 0x3 0x81 0x96e5 0x96f9 0x1 0x3 0x82 0x96fa 0x98c2 0x0 0x3 0x82 0x98c3 0x994e 0x1 0x3 0x82 0x994f 0x9ae1 0x0 0x3 0x83 0x9ae2 0x9b20 0x1 0x3 0x83 0x9b21 0x9d5c 0x0 0x3 0x83 0x9d5d 0x9de8 0x1 0x3 0x83 0x9de9 0xa025 0x0 0x3 0x83 0xa026 0xa0b1 0x1 0x3 0x83 0xa0b2 0xa275 0x0 0x3 0x84 0xa276 0xa30c 0x0 0x3 0x84 0xa30d 0xa398 0x1 0x3 0x84 0xa399 0xa5d4 0x0 0x3 0x84 0xa5d5 0xa660 0x1 0x3 0x84 0xa661 0xa89d 0x0 0x3 0x84 0xa89e 0xa929 0x1 0x3 0x84 0xa92a 0xaa45 0x0 0x3 0x8a 0xd7c8 0xd813 0x0 0x3 0x8a 0xd814 0xd89f 0x1 0x3 0x8a 0xd8a0 0xdadc 0x0 0x3 0x8a 0xdadd 0xdb68 0x1 0x3 0x8a 0xdb69 0xdda3 0x0 0x3 0x9c 0x10384 0x1045d 0x0 0x3 0x9c 0x1045e 0x104e9 0x1 0x3 0x9c 0x104ea 0x10707 0x0 0x3 0xa1 0x10bea 0x10c9a 0x0 0x3 0xa1 0x10c9b 0x10ce1 0x1 0x3 0xa1 0x10ce2 0x10d26 0x2 0x3 0xa1 0x10d27 0x10d47 0x0 0x4 0x33 0x0 0x0 0x0 0x4 0x34 0x0 0x0 0x0 0x4 0x35 0x0 0x0 0x1 0x4 0x36 0x0 0x0 0x0 0x4 0x37 0x0 0x0 0x2 0x4 0x38 0x0 0x0 0x1 0x5 0x3d 0x0 0x0 0x2 0x5 0x3e 0x0 0x0 0x0 0x5 0x47 0x0 0x0 0x2>; + samsung,fd_on_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 40 40 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,fd_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 80 40 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_grid_on_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 bf 01 00 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,self_grid_off_revA = [29 01 00 00 11 00 03 f0 5a 5a 29 00 00 00 00 00 03 bf 00 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 4c f4 29 00 00 00 00 00 02 f4 28 29 00 00 00 00 00 03 91 01 01 29 00 00 00 00 00 02 53 27 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 40 0a 00 00 00 00 40 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 38 00 00 00 18 03 38 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 24 a4 29 01 00 00 00 00 02 f7 0f 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revA = <0x29000000 0x3f0 0x5a5a2900 0x0 0x4b0004c 0xf4290000 0x2 0xf4282900 0x0 0x3910101 0x29010000 0x253 0x26290000 0x2 0xf70f2901 0x1100 0x3f0a5a5>; + samsung,lpm_off_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 45 0a 00 00 00 00 45 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 3d 00 00 00 18 03 3d 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 26 f0 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_60nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 24]; + samsung,lpm_30nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 25]; + samsung,lpm_10nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 26]; + samsung,lpm_2nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 27]; + samsung,lpm_brightnes_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 02 53 26 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xf>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + samsung,ub-con-det = <0xffffffff 0x5 0x0>; + samsung,esd-irq-gpio1 = <0xffffffff 0x3 0x0>; + phandle = <0xf>; + + qcom,mdss-dsi-display-timings { + + fhd90 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0xf>; + qcom,mdss-dsi-panel-framerate = <0x5a>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x2847>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 0a 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 54 01 0c 00 b4 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 04 b0 00 04 f2 29 00 00 00 00 00 02 f2 54 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 01 00 00 11 00 02 f2 00 29 00 00 00 00 00 04 b0 01 b4 65 29 00 00 00 00 00 21 65 0c 94 0c 5a 0c 30 0b b8 0b 46 0a f6 09 ea 09 08 08 1a 07 12 06 2a 05 12 03 82 02 08 02 08 00 18 29 00 00 00 00 00 04 b0 00 2a 6a 29 00 00 00 00 00 04 6a 07 00 c0 29 01 00 00 11 00 02 f7 0f 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 04 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a 80 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 22 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 02 f7 0f 29 01 00 00 6e 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,panel-roi-alignment = <0x168 0x78 0x168 0x78 0x168 0x78>; + }; + + fhd60 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0x10>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x3dfa>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 0a 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 54 01 0c 00 b4 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 04 b0 00 04 f2 29 00 00 00 00 00 02 f2 54 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 01 00 00 11 00 02 f2 00 29 00 00 00 00 00 04 b0 01 b4 65 29 00 00 00 00 00 21 65 0c 94 0c 5a 0c 30 0b b8 0b 46 0a f6 09 ea 09 08 08 1a 07 12 06 2a 05 12 03 82 02 08 02 08 00 18 29 00 00 00 00 00 04 b0 00 2a 6a 29 00 00 00 00 00 04 6a 07 00 c0 29 01 00 00 11 00 02 f7 0f 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 04 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a 80 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 22 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 02 f7 0f 29 01 00 00 6e 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,panel-roi-alignment = <0x168 0x78 0x168 0x78 0x168 0x78>; + }; + }; + + qcom,panel-supply-entries { + #address-cells = <0x1>; + #size-cells = <0x0>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vci"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vddi"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1b7740>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + }; + }; + }; + }; + + fragment@89 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_PBA_BOOTING_FHD"; + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x0>; + qcom,mdss-dsi-bl-max-level = <0x639c>; + qcom,mdss-brightness-max-level = <0x639c>; + qcom,mdss-dsi-interleave-mode = <0x0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x3c>; + qcom,mdss-pan-physical-height-dimension = <0x6a>; + qcom,mdss-dsi-panel-mode-gpio-state = "invalid"; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + samsung,candela_map_table_revA = <0x0 0x0 0x2 0x5 0x1 0x2 0x2 0x6 0x2 0x3 0x3 0x7 0x3 0x4 0x4 0x8 0x4 0x5 0x5 0x9 0x5 0x6 0x6 0xa 0x6 0x7 0x7 0xb 0x7 0x8 0x8 0xc 0x8 0x9 0x9 0xd 0x9 0xa 0xa 0xe 0xa 0xb 0xb 0xf 0xb 0xc 0xc 0x10 0xc 0xd 0xd 0x11 0xd 0xe 0xe 0x13 0xe 0xf 0xf 0x14 0xf 0x10 0x10 0x15 0x10 0x11 0x11 0x16 0x11 0x12 0x12 0x18 0x12 0x13 0x13 0x19 0x13 0x14 0x14 0x1b 0x14 0x15 0x15 0x1d 0x15 0x16 0x16 0x1e 0x16 0x17 0x18 0x20 0x17 0x19 0x1a 0x22 0x18 0x1b 0x1c 0x25 0x19 0x1d 0x1d 0x27 0x1a 0x1e 0x20 0x29 0x1b 0x21 0x22 0x2c 0x1c 0x23 0x24 0x2f 0x1d 0x25 0x26 0x32 0x1e 0x27 0x28 0x35 0x1f 0x29 0x2b 0x38 0x20 0x2c 0x2e 0x3c 0x21 0x2f 0x31 0x40 0x22 0x32 0x34 0x44 0x23 0x35 0x38 0x48 0x24 0x39 0x3b 0x4d 0x25 0x3c 0x3f 0x52 0x26 0x40 0x43 0x57 0x27 0x44 0x47 0x5d 0x28 0x48 0x4c 0x62 0x29 0x4d 0x50 0x69 0x2a 0x51 0x56 0x6f 0x2b 0x57 0x5b 0x77 0x2c 0x5c 0x61 0x7e 0x2d 0x62 0x68 0x86 0x2e 0x69 0x6e 0x8f 0x2f 0x6f 0x76 0x98 0x30 0x77 0x7d 0xa2 0x31 0x7e 0x85 0xac 0x32 0x86 0x8e 0xb7 0x33 0x8f 0x96 0xc3 0x34 0x97 0xa0 0xcf 0x35 0xa1 0xaa 0xdc 0x36 0xab 0xb5 0xea 0x37 0xb6 0xc1 0xf9 0x38 0xc2 0xcd 0x109 0x39 0xce 0xda 0x11a 0x3a 0xdb 0xe6 0x12c 0x3b 0xe7 0xf2 0x13c 0x3c 0xf3 0xfe 0x14d 0x3d 0xff 0xff 0x168>; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x10>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + phandle = <0x10>; + + qcom,mdss-dsi-display-timings { + + fhd@0 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-front-porch = <0xa4>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-v-back-porch = <0x3>; + qcom,mdss-dsi-v-front-porch = <0x9>; + qcom,mdss-dsi-panel-clockrate = <0x35866480>; + qcom,mdss-dsi-panel-phy-timings = <0x1e0808 0x24220808 0x8020400>; + qcom,mdss-dsi-on-command = [39 01 00 00 78 00 02 11 00]; + qcom,mdss-dsi-off-command = <0x5010000 0x24000128 0x5010000 0x78000110>; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + }; + }; + }; + + fragment@90 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_te { + + sde_te_active { + phandle = <0x9>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + + sde_te_suspend { + phandle = <0xd>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + + pmx_sde { + phandle = <0xd0>; + + sde_dsi_active { + phandle = <0xa>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + bias-disable = <0x0>; + }; + }; + + sde_dsi_suspend { + phandle = <0xe>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable = <0x0>; + }; + }; + }; + }; + }; + + fragment@91 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_ub_det { + + sde_ub_det_default { + pins = "gpio5"; + function = "normal"; + input-enable; + power-source = <0x1>; + bias-disable; + phandle = <0xb>; + }; + }; + }; + }; + + fragment@92 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_fg_err { + + sde_fg_err_default { + pins = "gpio3"; + function = "normal"; + input-enable; + power-source = <0x0>; + bias-disable; + phandle = <0xc>; + }; + }; + }; + }; + + fragment@93 { + target = <0xffffffff>; + + __overlay__ { + + qcom,dsi-display@9 { + label = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + qcom,display-type = "primary"; + phandle = <0xd1>; + }; + + qcom,dsi-display@10 { + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,display-type = "primary"; + phandle = <0xd2>; + }; + }; + }; + + fragment@94 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c000000 0x0 0x9e4000>; + label = "cont_splash_region"; + }; + }; + + fragment@95 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c9e4000 0x0 0x100000>; + label = "dfps_data_region"; + }; + }; + + fragment@96 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c000000 0x0 0x9e4000>; + label = "disp_rdump_region"; + }; + }; + + fragment@97 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x68>; + status = "okay"; + + sm5714@49 { + status = "okay"; + compatible = "siliconmitus,sm5714mfd"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x69>; + sm5714,irq-gpio = <0xffffffff 0x21 0x0>; + sm5714,wakeup; + }; + }; + }; + + fragment@98 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x6a>; + status = "okay"; + + usbpd-sm5714@33 { + status = "okay"; + compatible = "sm5714-usbpd"; + reg = <0x33>; + pinctrl-names = "default"; + pinctrl-0 = <0x6b>; + usbpd,usbpd_int = <0xffffffff 0x68 0x0>; + support_pd_role_swap; + + pdic-manager { + pdic,max_power = <0x1388>; + pdic_op_power = <0x9c4>; + pdic_max_voltage = <0x1770>; + pdic_max_current = <0x7d0>; + pdic,min_current = <0x1f4>; + pdic,giveback = <0x0>; + pdic,usb_com_capable = <0x1>; + pdic,no_usb_suspend = <0x1>; + source,max_voltage = <0x1388>; + source,min_voltage = <0xfa0>; + source,max_power = <0x9c4>; + }; + }; + }; + }; + + fragment@99 { + target = <0xffffffff>; + + __overlay__ { + + if_pmic_irq { + + if_pmic_irq_default { + phandle = <0x69>; + + mux { + pins = "gpio33"; + function = "gpio"; + }; + + config { + pins = "gpio33"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + + usbpd_irq { + + usbpd_irq_default { + phandle = <0x6b>; + + mux { + pins = "gpio104"; + function = "gpio"; + }; + + config { + pins = "gpio104"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + }; + }; + + fragment@100 { + target = <0xffffffff>; + + __overlay__ { + qcom,qusb-phy-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x18 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x46 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + qcom,qusb-phy-host-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x18 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x46 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + }; + }; + + fragment@101 { + target = <0xffffffff>; + + __overlay__ { + + fps_rst { + phandle = <0x6c>; + + mux { + pins = "gpio91"; + function = "gpio"; + }; + + config { + pins = "gpio91"; + bias-pull-down; + }; + }; + }; + }; + + fragment@102 { + target = <0xffffffff>; + + __overlay__ { + regulator-name = "VDD_BTP_3P3"; + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + }; + }; + + fragment@103 { + target = <0xffffffff>; + + __overlay__ { + qcom,set-miso-sampling; + qcom,miso-sampling-ctrl-val = <0x2>; + status = "okay"; + + gw9558-spi@0 { + compatible = "goodix,gw9558x_factory"; + reg = <0x0>; + spi-max-frequency = <0x17d7840>; + pinctrl-names = "default"; + pinctrl-0 = <0x6c>; + gpio-controller; + #gpio-cells = <0x2>; + goodix,btp-regulator = "VDD_BTP_3P3"; + goodix,gpio_reset = <0xffffffff 0x5b 0x0>; + goodix,chip_id = "GW9558"; + goodix,position = "11.81,-0.02,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + goodix,modelinfo = "A525"; + goodix,rb = "547,215,-1,FFFFFF,A9A9A9"; + }; + }; + }; + + fragment@104 { + target = <0xffffffff>; + + __overlay__ { + + gw9558@0 { + compatible = "goodix,gw9558x"; + reg = <0x0>; + spi-max-frequency = <0x17d7840>; + pinctrl-names = "default"; + pinctrl-0 = <0x6c>; + gpio-controller; + #gpio-cells = <0x2>; + goodix,btp-regulator = "VDD_BTP_3P3"; + goodix,gpio_reset = <0xffffffff 0x5b 0x0>; + goodix,chip_id = "GW9558"; + goodix,position = "11.81,-0.02,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + goodix,modelinfo = "A525"; + goodix,rb = "547,215,-1,FFFFFF,A9A9A9"; + }; + }; + }; + + fragment@105 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@106 { + target = <0xffffffff>; + + __overlay__ { + + qcom,flash_0 { + label = "flash"; + qcom,led-name = "led:flash_0"; + qcom,max-current = <0x5dc>; + qcom,default-led-trigger = "flash0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x5dc>; + qcom,duration-ms = <0x500>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + qcom,record-current-ma = <0x12c>; + phandle = <0x6d>; + }; + + qcom,torch_0 { + label = "torch"; + qcom,led-name = "led:torch_0"; + qcom,max-current = <0x1f4>; + qcom,default-led-trigger = "torch0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x12c>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + phandle = <0x6e>; + }; + + qcom,camera-flash@0 { + cell-index = <0x0>; + compatible = "qcom,camera-flash"; + flash-source = <0x6d>; + torch-source = <0x6e>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x77>; + }; + + qcom,cam-res-mgr { + compatible = "qcom,cam-res-mgr"; + shared-gpios = <0x3f>; + pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; + status = "ok"; + pinctrl-0 = <0x6f>; + pinctrl-1 = <0x70>; + }; + }; + }; + + fragment@107 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + sm5714-fled { + compatible = "siliconmitus,sm5714-fled"; + reg = <0x49>; + status = "okay"; + slave-addr = <0x92>; + flash-en-gpio = <0xffffffff 0x16 0x0>; + torch-en-gpio = <0xffffffff 0x43 0x0>; + flash-brightness = <0xf>; + preflash-brightness = <0x7>; + torch-brightness = <0x7>; + factory_current = <0x0>; + timeout = <0xff>; + }; + }; + }; + + fragment@108 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + qcom,ois@62 { + compatible = "qcom,ois"; + cell-index = <0x0>; + reg = <0x62>; + slave-addr = <0xc4>; + slave-id = <0x460>; + cam_vaf-supply = <0x71>; + regulator-names = "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x2ab980>; + rgltr-max-voltage = <0x2ab980>; + rgltr-load-current = <0x30d40>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x72 0x73>; + pinctrl-1 = <0x74 0x75>; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x20 0x0 0xffffffff 0x2b 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x0>; + gpio-custom1 = <0x1>; + gpio-vio = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x0 0x0 0x0>; + gpio-req-tbl-label = "MCU_RESET0", "MCU_BOOT0", "MCU_VIO"; + status = "ok"; + phandle = <0x79>; + }; + }; + }; + + fragment@109 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@0 { + cell-index = <0x0>; + compatible = "qcom,cam-sensor"; + reg = <0x0>; + slave-addr = <0x34>; + csiphy-sd-index = <0x0>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x76>; + led-flash-src = <0x77>; + eeprom-src = <0x78>; + ois-src = <0x79>; + cam_vio-supply = <0x7a>; + cam_vaf-supply = <0x71>; + cam_vana-supply = <0x7b>; + cam_vdig-supply = <0x7c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vaf", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x2ab980 0xf4240 0x0>; + rgltr-max-voltage = <0x1b7740 0x2ab980 0x2c4020 0x10c8e0 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x7d 0x7e 0x7f>; + pinctrl-1 = <0x80 0x81 0x82>; + gpios = <0xffffffff 0xd 0x0 0xffffffff 0x1e 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x1>; + gpio-custom1 = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_VANA0"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x41>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@2 { + cell-index = <0x2>; + compatible = "qcom,cam-sensor"; + reg = <0x3>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x83>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x84 0x85 0x86 0x87>; + pinctrl-1 = <0x88 0x89 0x8a 0x8b>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x2D { + cell-index = <0x2>; + compatible = "qcom,eeprom"; + reg = <0x2d>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x84 0x85 0x86 0x87>; + pinctrl-1 = <0x88 0x89 0x8a 0x8b>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x83>; + }; + + qcom,eeprom@37 { + cell-index = <0x3>; + compatible = "qcom,eeprom"; + reg = <0x37>; + slave-addr = <0x6e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_vdig-supply = <0x8c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x8d 0x8e 0x8f>; + pinctrl-1 = <0x90 0x91 0x92>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x9a>; + }; + }; + }; + + fragment@110 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@1 { + cell-index = <0x1>; + compatible = "qcom,cam-sensor"; + reg = <0x1>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x93>; + cam_vio-supply = <0x7a>; + cam_vana-supply = <0x94>; + cam_vdig-supply = <0x95>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x96 0x97>; + pinctrl-1 = <0x98 0x99>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@8 { + cell-index = <0x8>; + compatible = "qcom,cam-sensor"; + reg = <0x8>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x93>; + cam_vio-supply = <0x7a>; + cam_vana-supply = <0x94>; + cam_vdig-supply = <0x95>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x96 0x97>; + pinctrl-1 = <0x98 0x99>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@3 { + cell-index = <0x3>; + compatible = "qcom,cam-sensor"; + reg = <0x2>; + slave-addr = <0x6e>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x9a>; + cam_vio-supply = <0x7a>; + cam_vdig-supply = <0x8c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x8d 0x8e 0x8f>; + pinctrl-1 = <0x90 0x91 0x92>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@4 { + cell-index = <0x4>; + compatible = "qcom,cam-sensor"; + reg = <0x4>; + slave-addr = <0x7e>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + led-flash-src = <0x77>; + eeprom-src = <0x9b>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x9c 0x9d 0x9e 0x87 0x7f>; + pinctrl-1 = <0x9f 0xa0 0xa1 0x8b 0x82>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x4a 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0xd3>; + }; + + qcom,eeprom@0x3F { + cell-index = <0x4>; + compatible = "qcom,eeprom"; + reg = <0x3f>; + slave-addr = <0x7e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x9c 0x9d 0x9e 0x87>; + pinctrl-1 = <0x9f 0xa0 0xa1 0x8b>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x4a 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x9b>; + }; + }; + }; + + fragment@111 { + target = <0xffffffff>; + + __overlay__ { + + qcom,actuator@0xC { + cell-index = <0x0>; + reg = <0xc>; + slave-addr = <0x18>; + compatible = "i2c_actuator"; + rgltr-cntrl-support; + cam_vio-supply = <0x7a>; + cam_vaf-supply = <0x71>; + regulator-names = "cam_vio", "cam_vaf"; + rgltr-min-voltage = <0x1b7740 0x2ab980>; + rgltr-max-voltage = <0x1b7740 0x2ab980>; + rgltr-load-current = <0x30d40 0x30d40>; + phandle = <0x76>; + }; + + qcom,eeprom@50 { + cell-index = <0x0>; + reg = <0x50>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa0>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1 0x1>; + qcom,cam-power-seq-delay = <0x2 0x2>; + cam_vaf-supply = <0x71>; + cam_vio-supply = <0x7a>; + regulator-names = "cam_vaf", "cam_vio"; + rgltr-min-voltage = <0x2ab980 0x1b7740>; + rgltr-max-voltage = <0x2ab980 0x1b7740>; + rgltr-load-current = <0x30d40 0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + phandle = <0x78>; + }; + + qcom,eeprom@51 { + cell-index = <0x1>; + reg = <0x51>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa2>; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x2>; + cam_vio-supply = <0x7a>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-mode = <0x0>; + sensor-position = <0x1>; + rgltr-cntrl-support; + phandle = <0x93>; + }; + }; + }; + + fragment@112 { + target = <0xffffffff>; + + __overlay__ { + + samsung,vibrator { + compatible = "samsung_vib"; + samsung,vib_type = "COINDC"; + status = "ok"; + phandle = <0xd4>; + }; + }; + }; + + fragment@113 { + target = <0xffffffff>; + + __overlay__ { + + nfc_qupv3_se0_i2c_sleep { + phandle = <0xa2>; + + mux { + pins = "gpio34", "gpio35"; + function = "gpio"; + }; + + config { + pins = "gpio34", "gpio35"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + nfc_clk_req_gpio { + phandle = <0xa3>; + + mux { + pins = "gpio31"; + function = "gpio"; + }; + + config { + pins = "gpio31"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_irq_gpio { + phandle = <0xa4>; + + mux { + pins = "gpio37"; + function = "gpio"; + }; + + config { + pins = "gpio37"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_ven_gpio { + phandle = <0xa5>; + + mux { + pins = "gpio12"; + function = "gpio"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-high; + }; + }; + + nfc_firm_gpio { + phandle = <0xa6>; + + mux { + pins = "gpio36"; + function = "gpio"; + }; + + config { + pins = "gpio36"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + nfc_ldo_en_gpio { + phandle = <0xa7>; + + mux { + pins = "gpio68"; + function = "gpio"; + }; + + config { + pins = "gpio68"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@114 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + pinctrl-1 = <0xa2>; + qcom,clk-freq-out = <0x61a80>; + + sec-nfc@27 { + compatible = "sec-nfc"; + reg = <0x27>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + sec-nfc,ven-gpio = <0xffffffff 0xc 0x0>; + sec-nfc,irq-gpio = <0xffffffff 0x25 0x0>; + sec-nfc,firm-gpio = <0xffffffff 0x24 0x0>; + sec-nfc,clk_req-gpio = <0xffffffff 0x1f 0x0>; + sec-nfc,pvdd-gpio = <0xffffffff 0x44 0x0>; + sec-nfc,clk_req_wake; + sec-nfc,bootloader_ver = <0x6>; + pinctrl-names = "default"; + pinctrl-0 = <0xa3 0xa4 0xa5 0xa6 0xa7>; + }; + }; + }; + + fragment@115 { + target = <0xffffffff>; + + __overlay__ { + + hall { + status = "okay"; + compatible = "hall"; + linux,input-type = <0x1>; + linux,code = <0x15>; + hall,gpio_flip_cover = <0xffffffff 0xa 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa8>; + }; + }; + }; + + fragment@116 { + target = <0xffffffff>; + + __overlay__ { + + hall { + + hall_default { + pins = "gpio10"; + function = "normal"; + output-disable; + input-enable; + bias-disable; + power-source = <0x0>; + phandle = <0xa8>; + }; + }; + }; + }; + + fragment@abc { + target-path = [2f 00]; + + __overlay__ { + + sec_abc { + compatible = "samsung,sec_abc"; + status = "okay"; + + gpu { + gpu,label = "GPU fault"; + gpu,threshold_count = <0x4>; + gpu,threshold_time = <0x4b0>; + }; + + gpu_page { + gpu_page,label = "GPU page fault"; + gpu_page,threshold_count = <0x14>; + gpu_page,threshold_time = <0x4b0>; + }; + + aicl { + aicl,label = "battery aicl"; + aicl,threshold_count = <0x5>; + aicl,threshold_time = <0x12c>; + }; + }; + + abc_hub { + compatible = "samsung,abc_hub"; + status = "okay"; + + bootc { + bootc,time_spec_user = <0x186a0>; + bootc,time_spec_eng = <0x186a0>; + bootc,time_spec_fac = <0x186a0>; + }; + }; + }; + }; + + fragment@117 { + target = <0xffffffff>; + + __overlay__ { + + rpmh-regulator-ldoc8 { + compatible = "qcom,rpmh-vrm-regulator"; + mboxes = <0xffffffff 0x0>; + qcom,resource-name = "ldoc8"; + qcom,regulator-type = "pmic5-ldo"; + qcom,supported-modes = <0x2 0x4>; + qcom,mode-threshold-currents = <0x0 0x1>; + + regulator-pm6150l-l8 { + regulator-name = "pm6150l_l8"; + qcom,set = <0x3>; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + qcom,init-voltage = <0x1b7740>; + regulator-always-on; + qcom,init-mode = <0x2>; + phandle = <0xd5>; + }; + }; + + rpmh-regulator-ldoa5 { + + regulator-pm6150-l5 { + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + regulator-always-on; + phandle = <0xd6>; + }; + }; + + i2c@17 { + status = "ok"; + cell-index = <0x11>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x33 0x0 0xffffffff 0x34 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0xa9>; + phandle = <0xd7>; + + sx9360-i2c@28 { + compatible = "sx9360"; + reg = <0x28>; + pinctrl-names = "default"; + pinctrl-0 = <0xaa>; + interrupt-parent = <0xffffffff>; + interrupts = <0x4 0xc4 0x0 0x2>; + sx9360,nirq-gpio = <0xffffffff 0x5 0x1>; + sx9360,reggnrlctrl2_reg = <0x32>; + sx9360,againfreq_reg = <0x38>; + sx9360,refagainfreq_reg = <0x36>; + sx9360,gainrawfilt_reg = <0x1a>; + sx9360,refgainrawfilt_reg = <0x22>; + sx9360,proxthresh_reg = <0x1d>; + sx9360,hyst_reg = <0x35>; + sx9360,regproxctrl3_reg = <0xd>; + sx9360,resolution_reg = <0xf>; + sx9360,refresolution_reg = <0xf>; + sx9360,hallic_cert_detect = <0x1>; + }; + }; + }; + }; + + fragment@118 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x48 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6d 0x72 0x73 0x74 0x75 0x76>; + }; + }; + + fragment@119 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@120 { + target = <0xffffffff>; + + __overlay__ { + + bat_thm { + label = "bat_thm"; + reg = <0x4f>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + + chg_thm { + label = "chg_thm"; + reg = <0x4d>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + }; + }; + + fragment@121 { + target = <0xffffffff>; + + __overlay__ { + + battery { + pinctrl-names = "default"; + battery,chip_vendor = "QCOM"; + status = "okay"; + compatible = "samsung,sec-battery"; + battery,vendor = "Battery"; + battery,charger_name = "sm5714-charger"; + battery,fuelgauge_name = "sm5714-fuelgauge"; + battery,fgsrc_switch_name = "sm5714-fuelgauge"; + battery,technology = <0x2>; + battery,batt_data_version = <0x1>; + battery,temp_adc_type = <0x1>; + battery,temp_channel_raw = <0x1>; + battery,adc_check_count = <0x5>; + battery,temp_check_type = <0x1>; + battery,chg_temp_check_type = <0x1>; + battery,thermal_source = <0x2>; + battery,chg_thermal_source = <0x2>; + battery,temp_table_adc = <0x76c 0x923 0xab2 0xc97 0xec8 0x114f 0x146a 0x1803 0x1c2e 0x20e2 0x25c4 0x2b7f 0x31eb 0x386a 0x3f07 0x45a1 0x4be0 0x51ec 0x5774 0x5c67 0x609d 0x6442 0x6755>; + battery,temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,chg_temp_table_adc = <0x6d6 0x889 0xa14 0xbe2 0xe04 0x107c 0x137e 0x170b 0x1b0d 0x1f93 0x2479 0x2a3c 0x3072 0x3719 0x3da0 0x43e4 0x4aa7 0x50aa 0x5651 0x5b61 0x5fd6 0x637c 0x66ca>; + battery,chg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,polling_time = <0xa 0x1e 0x1e 0x1e 0xe10>; + battery,cable_check_type = <0x4>; + battery,cable_source_type = <0x1>; + battery,polling_type = <0x1>; + battery,monitor_initial_count = <0x0>; + battery,battery_check_type = <0x0>; + battery,ovp_uvlo_check_type = <0x3>; + battery,temp_check_count = <0x1>; + battery,overheatlimit_threshold = <0x2bc>; + battery,overheatlimit_recovery = <0x2a8>; + battery,wire_warm_overheat_thresh = <0x1f4>; + battery,wire_normal_warm_thresh = <0x1a4>; + battery,wire_cool1_normal_thresh = <0xb4>; + battery,wire_cool2_cool1_thresh = <0x96>; + battery,wire_cool3_cool2_thresh = <0x32>; + battery,wire_cold_cool3_thresh = <0x0>; + battery,wire_warm_current = <0x61b>; + battery,wire_cool1_current = <0xaf0>; + battery,wire_cool2_current = <0x417>; + battery,wire_cool3_current = <0x1b5>; + battery,low_temp_topoff = <0xe1>; + battery,high_temp_topoff = <0xe1>; + battery,low_temp_float = <0x111c>; + battery,high_temp_float = <0x1036>; + battery,full_check_type = <0x7>; + battery,full_check_type_2nd = <0x7>; + battery,full_check_count = <0x1>; + battery,chg_gpio_full_check = <0x0>; + battery,chg_polarity_full_check = <0x1>; + battery,chg_high_temp = <0x22b>; + battery,chg_high_temp_recovery = <0x212>; + battery,chg_input_limit_current = <0x3e8>; + battery,chg_charging_limit_current = <0x578>; + battery,wpc_temp_control_source = <0x1>; + battery,wpc_high_temp = <0x17c>; + battery,wpc_high_temp_recovery = <0x168>; + battery,wpc_input_limit_current = <0x258>; + battery,wpc_charging_limit_current = <0x3e8>; + battery,wpc_temp_lcd_on_control_source = <0x1>; + battery,wpc_lcd_on_high_temp = <0x17c>; + battery,wpc_lcd_on_high_temp_rec = <0x168>; + battery,wpc_lcd_on_input_limit_current = <0x1c2>; + battery,wpc_store_high_temp = <0x168>; + battery,wpc_store_high_temp_recovery = <0x154>; + battery,wpc_store_charging_limit_current = <0x190>; + battery,wpc_store_lcd_on_high_temp = <0x168>; + battery,wpc_store_lcd_on_high_temp_rec = <0x12c>; + battery,wpc_store_lcd_on_charging_limit_current = <0x190>; + battery,sleep_mode_limit_current = <0x1f4>; + battery,wc_full_input_limit_current = <0x64>; + battery,mix_high_temp = <0x1a4>; + battery,mix_high_chg_temp = <0x1f4>; + battery,mix_high_temp_recovery = <0x186>; + battery,full_condition_type = <0x9>; + battery,full_condition_soc = <0x5d>; + battery,full_condition_vcell = <0x10ea>; + battery,recharge_check_count = <0x1>; + battery,recharge_condition_type = <0x4>; + battery,recharge_condition_soc = <0x62>; + battery,recharge_condition_vcell = <0x10d6>; + battery,charging_total_time = <0x3840>; + battery,hv_charging_total_time = <0x2a30>; + battery,normal_charging_total_time = <0x4650>; + battery,usb_charging_total_time = <0x8ca0>; + battery,recharging_total_time = <0x1518>; + battery,charging_reset_time = <0x0>; + battery,chg_float_voltage = <0x111c>; + battery,pre_afc_work_delay = <0x7d0>; + battery,pre_wc_afc_work_delay = <0xfa0>; + battery,pre_afc_input_current = <0x1f4>; + battery,pre_wc_afc_input_current = <0x1f4>; + battery,prepare_ta_delay = <0x0>; + battery,swelling_high_rechg_voltage = <0xfa0>; + battery,swelling_low_rechg_voltage = <0x1086>; + battery,siop_input_limit_current = <0x4b0>; + battery,siop_charging_limit_current = <0x3e8>; + battery,siop_hv_input_limit_current = <0x2bc>; + battery,siop_hv_input_limit_current_2nd = <0x226>; + battery,siop_hv_charging_limit_current = <0x3e8>; + battery,ttf_hv_charge_current = <0xa28>; + battery,ttf_dc25_charge_current = <0xed8>; + battery,rp_current_rp1 = <0x1f4>; + battery,rp_current_rp2 = <0x5dc>; + battery,rp_current_rp3 = <0xbb8>; + battery,rp_current_rdu_rp3 = <0x834>; + battery,rp_current_abnormal_rp3 = <0x708>; + battery,pd_charging_charge_power = <0x3a98>; + battery,max_charging_current = <0xaf0>; + battery,wireless_cc_cv = <0x55>; + battery,wireless_otg_input_current = <0x384>; + battery,age_data = <0x0 0x111c 0x10d6 0x10b8 0x5d 0x12c 0x1108 0x10c2 0x10a4 0x5c 0x190 0x10f4 0x10ae 0x1090 0x5b 0x2bc 0x10e0 0x109a 0x107c 0x5a 0x3e8 0x10ae 0x1068 0x104a 0x59>; + battery,health_condition = <0x384 0x0 0x4b0 0x0 0x5dc 0x0>; + battery,standard_curr = <0xe42>; + battery,expired_time = <0x23a0>; + battery,recharging_expired_time = <0x1518>; + battery,battery_full_capacity = <0x1388>; + battery,cisd_max_voltage_thr = <0x1388>; + battery,max_input_voltage = <0x2328>; + battery,max_input_current = <0xbb8>; + battery,cisd_alg_index = <0x8>; + battery,ignore_cisd_index = <0x0 0x3c0>; + battery,ignore_cisd_index_d = <0x0 0x78>; + battery,ttf_capacity = <0xf28>; + battery,cv_data = <0xe36 0x358 0x51b 0xd81 0x362 0x4f2 0xcc6 0x36b 0x4ca 0xc27 0x371 0x4ab 0xb78 0x379 0x483 0xac8 0x380 0x45a 0xa4a 0x387 0x433 0x9b2 0x38c 0x413 0x93e 0x393 0x3ea 0x89d 0x399 0x3c1 0x84b 0x39e 0x39c 0x7e3 0x3a2 0x37e 0x78a 0x3a6 0x35c 0x708 0x3ab 0x334 0x6ae 0x3b0 0x305 0x667 0x3b4 0x2e2 0x60b 0x3b8 0x2ba 0x5a7 0x3bc 0x291 0x562 0x3be 0x26f 0x543 0x3c2 0x24a 0x4a4 0x3c5 0x221 0x496 0x3cb 0x1d8 0x43e 0x3ce 0x1b2 0x427 0x3d1 0x189 0x3f0 0x3d4 0x160 0x3d1 0x3dc 0xda 0x36e 0x3e0 0x9b 0x366 0x3e2 0x7c 0x300 0x3e6 0x3e 0x2f5 0x3e8 0x0>; + io-channels = <0xffffffff 0x4f 0xffffffff 0x4d>; + io-channel-names = "adc-temp", "adc-chg-temp"; + }; + + sm5714-fuelgauge { + status = "okay"; + fuelgauge,fuel_alert_soc = <0x1>; + fuelgauge,capacity_max = <0x3e8>; + fuelgauge,capacity_max_margin = <0x12c>; + fuelgauge,capacity_min = <0x0>; + fuelgauge,capacity_calculation_type = <0x1f>; + fuelgauge,using_temp_compensation; + fuelgauge,low_temp_limit = <0x64>; + fuelgauge,using_hw_vempty; + fuelgauge,sw_v_empty_voltage = <0xc80>; + fuelgauge,sw_v_empty_voltage_cisd = <0xc1c>; + fuelgauge,sw_v_empty_recover_voltage = <0xd98>; + fuelgauge,capacity = <0x1388>; + + battery_params { + battery,id = <0x0>; + battery0,battery_type = <0x114e 0x1f20>; + battery0,battery_table0 = <0x1400 0x1b73 0x1c4b 0x1d38 0x1d68 0x1d7a 0x1d88 0x1d8f 0x1db4 0x1dea 0x1e0d 0x1e42 0x1e88 0x1eb4 0x1f01 0x1f3d 0x1f76 0x1fc7 0x2023 0x207f 0x2116 0x2190 0x2272 0x2400>; + battery0,battery_table1 = <0x0 0x99 0x219 0x4b3 0x5cc 0x74c 0xb80 0xd19 0xfb3 0x14e6 0x1a19 0x1f4c 0x29b3 0x2ee6 0x36b3 0x3be6 0x3e80 0x4119 0x464c 0x4b80 0x534c 0x5880 0x6400 0x6419>; + battery0,battery_table2 = <0x4b4b 0x4444 0x4040 0x3e3e 0x3c3c 0x3b3b 0x3838 0x3737 0x3535 0x3434 0x3434 0x3333 0x3333 0x3333 0x3333 0x3232>; + battery0,rs_value = <0x66 0x66 0x3800 0x199 0x599 0x599 0x100>; + battery0,v_alarm = <0xce4 0x0>; + battery0,topoff = <0x28a>; + battery0,i_cal = <0x0 0x0 0x800 0x800 0x0 0x0 0x7f0 0x81b>; + battery0,v_cal = <0x1 0x0 0x0 0x1 0x0 0x0 0x0>; + battery0,temp_std = <0x19>; + battery0,tem_poff = <0xd7a 0x32 0xd16 0x32>; + battery0,aux_ctrl = <0x322 0x5800>; + battery0,data_ver = <0x7>; + battery0,v_max_table = <0x2272 0x2250 0x222e 0x220c 0x21b7>; + battery0,q_max_table = <0x1f20 0x1e9f 0x1e1e 0x1d9d 0x1c5b>; + }; + }; + + cable-info { + default_input_current = <0x708>; + default_charging_current = <0x834>; + full_check_current_1st = <0x28a>; + full_check_current_2nd = <0xe1>; + + current_group_1 { + cable_number = <0x2 0x13 0x15 0x16 0x17 0x1e>; + input_current = <0x1f4>; + charging_current = <0x1f4>; + }; + + current_group_2 { + cable_number = <0x19 0x1f>; + input_current = <0x3e8>; + charging_current = <0x3e8>; + }; + + current_group_3 { + cable_number = <0x5 0x20>; + input_current = <0x5dc>; + charging_current = <0x5dc>; + }; + + current_group_4 { + cable_number = <0x6 0x7 0x8 0x11 0x12>; + input_current = <0x672>; + charging_current = <0xaf0>; + }; + + current_group_5 { + cable_number = <0x9>; + input_current = <0x672>; + charging_current = <0xc4e>; + }; + + current_group_6 { + cable_number = <0xa 0xc 0xf 0x1b 0x21 0x24>; + input_current = <0x320>; + charging_current = <0x960>; + }; + + current_group_7 { + cable_number = <0xd>; + input_current = <0x2bc>; + charging_current = <0x960>; + }; + + current_group_8 { + cable_number = <0x18>; + input_current = <0x3e8>; + charging_current = <0x1c2>; + }; + + current_group_9 { + cable_number = <0x23>; + input_current = <0x708>; + charging_current = <0x708>; + }; + + current_group_10 { + cable_number = <0xb 0xe 0x10 0x1c 0x23>; + input_current = <0x28a>; + charging_current = <0x960>; + }; + + current_group_11 { + cable_number = <0x1d 0x25>; + input_current = <0x1f4>; + charging_current = <0x4b0>; + }; + + current_group_12 { + cable_number = <0x1 0x4>; + input_current = <0x1db>; + charging_current = <0x226>; + }; + + current_group_13 { + cable_number = <0x22>; + input_current = <0x4b0>; + charging_current = <0x960>; + }; + }; + }; + }; + + __symbols__ { + dsi_rm69299_visionox_amoled_video = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video"; + dsi_rm69299_visionox_amoled_cmd = "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd"; + dsi_sim_vid = "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video"; + dsi_sim_cmd = "/fragment@3/__overlay__/qcom,mdss_dsi_sim_cmd"; + dsi_sim_dsc_375_cmd = "/fragment@4/__overlay__/qcom,mdss_dsi_sim_dsc_375_cmd"; + dsi_nt36672c_video = "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video"; + dsi_panel_pwr_supply = "/fragment@6/__overlay__/dsi_panel_pwr_supply"; + dsi_panel_pwr_supply_no_labibb = "/fragment@6/__overlay__/dsi_panel_pwr_supply_no_labibb"; + dsi_panel_pwr_supply_labibb_amoled = "/fragment@6/__overlay__/dsi_panel_pwr_supply_labibb_amoled"; + dsi_rm69299_visionox_amoled_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@0"; + dsi_rm69299_visionox_amoled_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@1"; + dsi_sim_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@2"; + dsi_sim_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@3"; + dsi_sim_dsc_375_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@4"; + dsi_nt36672c_video_display = "/fragment@6/__overlay__/qcom,dsi-display@5"; + sde_dsi = "/fragment@6/__overlay__/qcom,dsi-display"; + sde_wb = "/fragment@6/__overlay__/qcom,wb-display@0"; + ext_disp = "/fragment@6/__overlay__/qcom,msm-ext-disp"; + ext_disp_audio_codec = "/fragment@6/__overlay__/qcom,msm-ext-disp/qcom,msm-ext-disp-audio-codec-rx"; + mtp_batterydata = "/fragment@11/__overlay__/qcom,battery-data"; + lpi_tlmm = "/fragment@27/__overlay__/lpi_pinctrl@627C0000"; + cdc_dmic01_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_active"; + cdc_dmic01_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_sleep"; + cdc_dmic01_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_active"; + cdc_dmic01_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_sleep"; + cdc_dmic23_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_active"; + cdc_dmic23_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_sleep"; + cdc_dmic23_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_active"; + cdc_dmic23_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_sleep"; + cdc_dmic45_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_active"; + cdc_dmic45_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_sleep"; + cdc_dmic45_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_active"; + cdc_dmic45_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_sleep"; + tx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_sleep"; + tx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_active"; + tx_swr_data0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_sleep"; + tx_swr_data0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_active"; + wsa_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_sleep"; + wsa_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_active"; + wsa_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_sleep"; + wsa_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_active"; + tx_swr_data1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_sleep"; + tx_swr_data1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_active"; + tx_swr_data2_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_sleep"; + tx_swr_data2_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_active"; + rx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_sleep"; + rx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_active"; + rx_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_sleep"; + rx_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_active"; + lpi_i2s1_sck_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_active"; + lpi_i2s1_sck_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_sleep"; + lpi_i2s1_ws_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_active"; + lpi_i2s1_ws_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_sleep"; + lpi_i2s1_sd0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_active"; + lpi_i2s1_sd0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_sleep"; + lpi_i2s1_sd1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_active"; + lpi_i2s1_sd1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_sleep"; + tx_macro = "/fragment@28/__overlay__/tx-macro@62620000"; + swr2 = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master"; + wcd938x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd938x-tx-slave"; + wcd937x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd937x-tx-slave"; + rx_macro = "/fragment@28/__overlay__/rx-macro@62600000"; + swr1 = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master"; + wcd938x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd938x-rx-slave"; + wcd937x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd937x-rx-slave"; + wsa_macro = "/fragment@28/__overlay__/wsa-macro@62640000"; + swr0 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master"; + wsa881x_0211 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211"; + wsa881x_0212 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212"; + wsa881x_0213 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213"; + wsa881x_0214 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214"; + va_macro = "/fragment@28/__overlay__/va-macro@62770000"; + wcd938x_codec = "/fragment@28/__overlay__/wcd938x-codec"; + wcd937x_codec = "/fragment@28/__overlay__/wcd937x-codec"; + cdc_dmic01_gpios = "/fragment@30/__overlay__/cdc_dmic01_pinctrl"; + cdc_dmic23_gpios = "/fragment@30/__overlay__/cdc_dmic23_pinctrl"; + cdc_dmic45_gpios = "/fragment@30/__overlay__/cdc_dmic45_pinctrl"; + wsa_swr_gpios = "/fragment@30/__overlay__/wsa_swr_clk_data_pinctrl"; + rx_swr_gpios = "/fragment@30/__overlay__/rx_swr_clk_data_pinctrl"; + tx_swr_gpios = "/fragment@30/__overlay__/tx_swr_clk_data_pinctrl"; + wsa_spkr_en1 = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl"; + wsa_spkr_en2 = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl"; + wcd_rst_gpio = "/fragment@31/__overlay__/msm_cdc_pinctrl@58"; + clock_audio_wsa_1 = "/fragment@31/__overlay__/wsa_core_clk"; + clock_audio_wsa_2 = "/fragment@31/__overlay__/wsa_npl_clk"; + clock_audio_rx_1 = "/fragment@31/__overlay__/rx_core_clk"; + clock_audio_rx_2 = "/fragment@31/__overlay__/rx_npl_clk"; + clock_audio_tx_1 = "/fragment@31/__overlay__/tx_core_clk"; + clock_audio_tx_2 = "/fragment@31/__overlay__/tx_npl_clk"; + clock_audio_va_1 = "/fragment@31/__overlay__/va_core_clk"; + clock_audio_va_2 = "/fragment@31/__overlay__/va_npl_clk"; + qupv3_se8_2hsuart = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000"; + qupv3_se8_2hsuart_pins = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins"; + qupv3_se8_2uart_tx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_active"; + qupv3_se8_2uart_rx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_active"; + qupv3_se8_2uart_tx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_sleep"; + qupv3_se8_2uart_rx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_sleep"; + sec_debug_region = "/fragment@37/__overlay__/sec_debug_region@0"; + sec_debug_autocomment = "/fragment@37/__overlay__/sec_debug_autocomment@0"; + sec_debug_rdx_bootdev = "/fragment@37/__overlay__/sec_debug_rdx_bootdev@0"; + kaslr_region = "/fragment@37/__overlay__/kaslr_region@A0001000"; + rkp_region = "/fragment@37/__overlay__/rkp_region@B0200000"; + hdm_region = "/fragment@37/__overlay__/hdm_region@A1000000"; + modem_shared_mem = "/fragment@37/__overlay__/modem_shared_mem_region@B5000000"; + usb_noti = "/fragment@60/__overlay__/usb-notifier"; + imp_list = "/fragment@65/__overlay__/imp_list"; + cdc_quin_mi2s_gpios = "/fragment@66/__overlay__/msm_cdc_pinctrl_quin"; + samsung_q6audio_adaptation = "/fragment@67/__overlay__/samsung,q6audio-adaptation"; + det_zones = "/fragment@67/__overlay__/det_zones"; + i2c_18 = "/fragment@67/__overlay__/i2c@18"; + tas256x = "/fragment@67/__overlay__/i2c@18/tas256x@4c"; + tas25xx_gpio_default = "/fragment@70/__overlay__/tas25xx_gpio_default"; + fm_lna_default = "/fragment@70/__overlay__/fm_lna_default"; + grip_i2c_active = "/fragment@71/__overlay__/grip_i2c/grip_i2c_active"; + grip_i2c_suspend = "/fragment@71/__overlay__/grip_i2c/grip_i2c_suspend"; + s2mpb03_i2c_sda_default = "/fragment@71/__overlay__/s2mpb03_i2c_sda_default"; + s2mpb03_i2c_scl_default = "/fragment@71/__overlay__/s2mpb03_i2c_scl_default"; + cam_sensor_mclk0_active = "/fragment@71/__overlay__/cam_sensor_mclk0_active"; + cam_sensor_mclk0_suspend = "/fragment@71/__overlay__/cam_sensor_mclk0_suspend"; + cam_sensor_mclk1_active = "/fragment@71/__overlay__/cam_sensor_mclk1_active"; + cam_sensor_mclk1_suspend = "/fragment@71/__overlay__/cam_sensor_mclk1_suspend"; + cam_sensor_mclk2_active = "/fragment@71/__overlay__/cam_sensor_mclk2_active"; + cam_sensor_mclk2_suspend = "/fragment@71/__overlay__/cam_sensor_mclk2_suspend"; + cam_sensor_mclk3_active = "/fragment@71/__overlay__/cam_sensor_mclk3_active"; + cam_sensor_mclk3_suspend = "/fragment@71/__overlay__/cam_sensor_mclk3_suspend"; + cam_sensor_mclk4_active = "/fragment@71/__overlay__/cam_sensor_mclk4_active"; + cam_sensor_mclk4_suspend = "/fragment@71/__overlay__/cam_sensor_mclk4_suspend"; + rcam1_sensor_reset_active = "/fragment@71/__overlay__/rcam1_sensor_reset_active"; + rcam1_sensor_reset_suspend = "/fragment@71/__overlay__/rcam1_sensor_reset_suspend"; + front_sensor_reset_active = "/fragment@71/__overlay__/front_sensor_reset_active"; + front_sensor_reset_suspend = "/fragment@71/__overlay__/front_sensor_reset_suspend"; + rcam3_sensor_reset_active = "/fragment@71/__overlay__/rcam3_sensor_reset_active"; + rcam3_sensor_reset_suspend = "/fragment@71/__overlay__/rcam3_sensor_reset_suspend"; + rcam2_sensor_reset_active = "/fragment@71/__overlay__/rcam2_sensor_reset_active"; + rcam2_sensor_reset_suspend = "/fragment@71/__overlay__/rcam2_sensor_reset_suspend"; + rcam4_sensor_reset_active = "/fragment@71/__overlay__/rcam4_sensor_reset_active"; + rcam4_sensor_reset_suspend = "/fragment@71/__overlay__/rcam4_sensor_reset_suspend"; + rcam1_sensor_vana_active = "/fragment@71/__overlay__/rcam1_sensor_vana_active"; + rcam1_sensor_vana_suspend = "/fragment@71/__overlay__/rcam1_sensor_vana_suspend"; + rcam2_sensor_vana_active = "/fragment@71/__overlay__/rcam2_sensor_vana_active"; + rcam2_sensor_vana_suspend = "/fragment@71/__overlay__/rcam2_sensor_vana_suspend"; + rcam3_sensor_vana_active = "/fragment@71/__overlay__/rcam3_sensor_vana_active"; + rcam3_sensor_vana_suspend = "/fragment@71/__overlay__/rcam3_sensor_vana_suspend"; + rcam4_sensor_vana_active = "/fragment@71/__overlay__/rcam4_sensor_vana_active"; + rcam4_sensor_vana_suspend = "/fragment@71/__overlay__/rcam4_sensor_vana_suspend"; + cam_mipi_sel_active = "/fragment@71/__overlay__/cam_mipi_sel_active"; + cam_mipi_sel_suspend = "/fragment@71/__overlay__/cam_mipi_sel_suspend"; + rcam2_sensor_vdig_active = "/fragment@71/__overlay__/rcam2_sensor_vdig_active"; + rcam2_sensor_vdig_suspend = "/fragment@71/__overlay__/rcam2_sensor_vdig_suspend"; + rcam4_sensor_vdig_active = "/fragment@71/__overlay__/rcam4_sensor_vdig_active"; + rcam4_sensor_vdig_suspend = "/fragment@71/__overlay__/rcam4_sensor_vdig_suspend"; + if_pmic_i2c_pins = "/fragment@71/__overlay__/if_pmic_i2c_pins"; + if_pmic_i2c_sleep = "/fragment@71/__overlay__/if_pmic_i2c_pins/if_pmic_i2c_sleep"; + usbpd_i2c_pins = "/fragment@71/__overlay__/usbpd_i2c_pins"; + usbpd_i2c_sleep = "/fragment@71/__overlay__/usbpd_i2c_pins/usbpd_i2c_sleep"; + mcu_reset_active = "/fragment@71/__overlay__/mcu_reset_active"; + mcu_reset_suspend = "/fragment@71/__overlay__/mcu_reset_suspend"; + mcu_clk_active = "/fragment@71/__overlay__/mcu_clk_active"; + mcu_clk_suspend = "/fragment@71/__overlay__/mcu_clk_suspend"; + torch_en_active = "/fragment@71/__overlay__/torch_en_active"; + torch_en_suspend = "/fragment@71/__overlay__/torch_en_suspend"; + grip_int_active = "/fragment@72/__overlay__/grip_int_active"; + grip_int_suspend = "/fragment@72/__overlay__/grip_int_suspend"; + i2c2 = "/fragment@77/__overlay__/i2c@2"; + s2mpb03_l1 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo1"; + s2mpb03_l2 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo2"; + s2mpb03_l3 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo3"; + s2mpb03_l4 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo4"; + s2mpb03_l5 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo5"; + s2mpb03_l6 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo6"; + s2mpb03_l7 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo7"; + tsp_int = "/fragment@82/__overlay__/tsp_int"; + qupv3_se7_i2c_pins_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp"; + qupv3_se7_i2c_active_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp/qupv3_se7_i2c_active_tsp"; + qupv3_se7_i2c_sleep_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp/qupv3_se7_i2c_sleep_tsp"; + tsp_zt = "/fragment@83/__overlay__/touchscreen@20"; + tsp_stm = "/fragment@83/__overlay__/touchscreen@49"; + key_vol_up_default = "/fragment@84/__overlay__/key_vol_up/key_vol_up_default"; + self_display_FC3_dtsi = "/fragment@87/__overlay__/self_display_FC3_dtsi"; + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD = "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + ss_dsi_panel_PBA_BOOTING_FHD = "/fragment@89/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD"; + sde_te_active = "/fragment@90/__overlay__/pmx_sde_te/sde_te_active"; + sde_te_suspend = "/fragment@90/__overlay__/pmx_sde_te/sde_te_suspend"; + pmx_sde = "/fragment@90/__overlay__/pmx_sde"; + sde_dsi_active = "/fragment@90/__overlay__/pmx_sde/sde_dsi_active"; + sde_dsi_suspend = "/fragment@90/__overlay__/pmx_sde/sde_dsi_suspend"; + sde_ub_det_default = "/fragment@91/__overlay__/pmx_sde_ub_det/sde_ub_det_default"; + sde_fg_err_default = "/fragment@92/__overlay__/pmx_sde_fg_err/sde_fg_err_default"; + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD_display = "/fragment@93/__overlay__/qcom,dsi-display@9"; + ss_dsi_panel_PBA_BOOTING_FHD_display = "/fragment@93/__overlay__/qcom,dsi-display@10"; + if_pmic_irq_default = "/fragment@99/__overlay__/if_pmic_irq/if_pmic_irq_default"; + usbpd_irq_default = "/fragment@99/__overlay__/usbpd_irq/usbpd_irq_default"; + fps_rst = "/fragment@101/__overlay__/fps_rst"; + sm5714_flash0 = "/fragment@106/__overlay__/qcom,flash_0"; + sm5714_torch0 = "/fragment@106/__overlay__/qcom,torch_0"; + led_flash0 = "/fragment@106/__overlay__/qcom,camera-flash@0"; + ois_rear = "/fragment@108/__overlay__/qcom,ois@62"; + eeprom2 = "/fragment@109/__overlay__/qcom,eeprom@0x2D"; + eeprom3 = "/fragment@109/__overlay__/qcom,eeprom@37"; + sensor_rear_macro = "/fragment@110/__overlay__/qcom,cam-sensor@4"; + eeprom4 = "/fragment@110/__overlay__/qcom,eeprom@0x3F"; + actuator_rear0 = "/fragment@111/__overlay__/qcom,actuator@0xC"; + eeprom0 = "/fragment@111/__overlay__/qcom,eeprom@50"; + eeprom1 = "/fragment@111/__overlay__/qcom,eeprom@51"; + vibrator = "/fragment@112/__overlay__/samsung,vibrator"; + nfc_qupv3_se0_i2c_sleep = "/fragment@113/__overlay__/nfc_qupv3_se0_i2c_sleep"; + nfc_clk_req_gpio = "/fragment@113/__overlay__/nfc_clk_req_gpio"; + nfc_irq_gpio = "/fragment@113/__overlay__/nfc_irq_gpio"; + nfc_ven_gpio = "/fragment@113/__overlay__/nfc_ven_gpio"; + nfc_firm_gpio = "/fragment@113/__overlay__/nfc_firm_gpio"; + nfc_ldo_en_gpio = "/fragment@113/__overlay__/nfc_ldo_en_gpio"; + hall_default = "/fragment@116/__overlay__/hall/hall_default"; + L8C = "/fragment@117/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150l_l8 = "/fragment@117/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150_l5 = "/fragment@117/__overlay__/rpmh-regulator-ldoa5/regulator-pm6150-l5"; + i2c_17 = "/fragment@117/__overlay__/i2c@17"; + }; + + __fixups__ { + mdss_mdp = "/fragment@0:target:0", "/fragment@1:target:0", "/fragment@2:target:0", "/fragment@3:target:0", "/fragment@4:target:0", "/fragment@5:target:0", "/fragment@8:target:0", "/fragment@10:target:0", "/fragment@88:target:0", "/fragment@89:target:0"; + tlmm = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-te-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-te-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-te-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-te-gpio:0", "/fragment@7/__overlay__:qcom,usbplug-cc-gpio:0", "/fragment@17/__overlay__:cd-gpios:0", "/fragment@24/__overlay__/synaptics_tcm@20:interrupt-parent:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,irq-gpio:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,reset-gpio:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:interrupt-parent:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:reset-gpios:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:irq-gpios:0", "/fragment@25/__overlay__/nq@28:qcom,nq-irq:0", "/fragment@25/__overlay__/nq@28:qcom,nq-ven:0", "/fragment@25/__overlay__/nq@28:qcom,nq-firm:0", "/fragment@25/__overlay__/nq@28:qcom,nq-clkreq:0", "/fragment@25/__overlay__/nq@28:interrupt-parent:0", "/fragment@35:target:0", "/fragment@67/__overlay__/i2c@18:gpios:0", "/fragment@67/__overlay__/i2c@18:gpios:12", "/fragment@67/__overlay__/i2c@18/tas256x@4c:ti,reset-gpio:0", "/fragment@67/__overlay__/i2c@18/tas256x@4c:ti,irq-gpio:0", "/fragment@68/__overlay__:qcom,fm-lna-gpios:0", "/fragment@70:target:0", "/fragment@71:target:0", "/fragment@73:target:0", "/fragment@77/__overlay__/i2c@2:gpios:0", "/fragment@77/__overlay__/i2c@2:gpios:12", "/fragment@82:target:0", "/fragment@83/__overlay__/touchscreen@20:zinitix,irq_gpio:0", "/fragment@83/__overlay__/touchscreen@49:stm,irq_gpio:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:qcom,platform-reset-gpio:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:qcom,platform-te-gpio:0", "/fragment@89/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD:qcom,platform-reset-gpio:0", "/fragment@90:target:0", "/fragment@97/__overlay__/sm5714@49:sm5714,irq-gpio:0", "/fragment@98/__overlay__/usbpd-sm5714@33:usbpd,usbpd_int:0", "/fragment@99:target:0", "/fragment@101:target:0", "/fragment@103/__overlay__/gw9558-spi@0:goodix,gpio_reset:0", "/fragment@104/__overlay__/gw9558@0:goodix,gpio_reset:0", "/fragment@107/__overlay__/sm5714-fled:flash-en-gpio:0", "/fragment@107/__overlay__/sm5714-fled:torch-en-gpio:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:12", "/fragment@108/__overlay__/qcom,ois@62:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:24", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:36", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:12", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:24", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:36", "/fragment@113:target:0", "/fragment@114/__overlay__/sec-nfc@27:interrupt-parent:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,ven-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,irq-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,firm-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,clk_req-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,pvdd-gpio:0", "/fragment@117/__overlay__/i2c@17:gpios:0", "/fragment@117/__overlay__/i2c@17:gpios:12", "/fragment@118:target:0"; + pm6150l_gpios = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-reset-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-reset-gpio:0", "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-bklight-en-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-en-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-reset-gpio:0", "/fragment@22:target:0", "/fragment@72:target:0", "/fragment@84:target:0", "/fragment@85/__overlay__/vol_up:gpios:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:samsung,esd-irq-gpio1:0", "/fragment@92:target:0", "/fragment@117/__overlay__/i2c@17/sx9360-i2c@28:sx9360,nirq-gpio:0"; + soc = "/fragment@6:target:0", "/fragment@11:target:0", "/fragment@23:target:0", "/fragment@31:target:0", "/fragment@34:target:0", "/fragment@60:target:0", "/fragment@67:target:0", "/fragment@77:target:0", "/fragment@86:target:0", "/fragment@87:target:0", "/fragment@93:target:0", "/fragment@104:target:0", "/fragment@106:target:0", "/fragment@112:target:0", "/fragment@115:target:0", "/fragment@117:target:0", "/fragment@119:target:0", "/fragment@121:target:0"; + mdss_dsi0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-ctrl:0"; + mdss_dsi_phy0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-phy:0"; + mdss_dsi0_pll = "/fragment@6/__overlay__/qcom,dsi-display:clocks:0", "/fragment@6/__overlay__/qcom,dsi-display:clocks:8", "/fragment@6/__overlay__/qcom,dsi-display:clocks:16", "/fragment@6/__overlay__/qcom,dsi-display:clocks:24", "/fragment@6/__overlay__/qcom,dsi-display:clocks:32", "/fragment@6/__overlay__/qcom,dsi-display:clocks:40", "/fragment@6/__overlay__/qcom,dsi-display:clocks:48", "/fragment@6/__overlay__/qcom,dsi-display:clocks:56", "/fragment@6/__overlay__/qcom,dsi-display:clocks:64", "/fragment@6/__overlay__/qcom,dsi-display:clocks:72"; + L13A = "/fragment@6/__overlay__/qcom,dsi-display:vddio-supply:0"; + L18A = "/fragment@6/__overlay__/qcom,dsi-display:vdda-3p3-supply:0"; + lcdb_ldo_vreg = "/fragment@6/__overlay__/qcom,dsi-display:lab-supply:0"; + lcdb_ncp_vreg = "/fragment@6/__overlay__/qcom,dsi-display:ibb-supply:0"; + pm6150_l18 = "/fragment@6/__overlay__/qcom,dsi-display:vci-supply:0"; + pm6150_l13 = "/fragment@6/__overlay__/qcom,dsi-display:vddi-supply:0"; + sde_dp = "/fragment@7:target:0", "/fragment@8/__overlay__:connectors:8", "/fragment@26:target:0"; + pm6150_pdphy = "/fragment@7/__overlay__:qcom,dp-usbpd-detection:0"; + sde_dp_usbplug_cc_active = "/fragment@7/__overlay__:pinctrl-0:0"; + sde_dp_usbplug_cc_suspend = "/fragment@7/__overlay__:pinctrl-1:0"; + sde_rscc = "/fragment@8/__overlay__:connectors:12"; + thermal_zones = "/fragment@9:target:0", "/fragment@18:target:0"; + pm6150_trip0 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:trip:0"; + pm6150_charger = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:cooling-device:0", "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:cooling-device:0", "/fragment@21:target:0"; + pm6150_trip1 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:trip:0"; + pm6150l_trip0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:trip:0"; + CPU0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:cooling-device:0"; + CPU1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:cooling-device:0"; + CPU2 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:cooling-device:0"; + CPU3 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:cooling-device:0"; + CPU4 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:cooling-device:0"; + CPU5 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:cooling-device:0"; + CPU6 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:cooling-device:0"; + CPU7 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:cooling-device:0"; + pm6150l_trip1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:trip:0"; + bcl_lvl0 = "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:trip:0"; + bcl_lvl1 = "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:trip:0"; + bcl_lvl2 = "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:trip:0"; + soc_trip = "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:trip:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:trip:0"; + pm6150l_vadc = "/fragment@12:target:0", "/fragment@13/__overlay__:io-channels:0", "/fragment@13/__overlay__:io-channels:8", "/fragment@13/__overlay__:io-channels:16", "/fragment@13/__overlay__:io-channels:24", "/fragment@77/__overlay__/sec_thermistor@1:io-channels:0", "/fragment@77/__overlay__/sec_thermistor@2:io-channels:0", "/fragment@80:target:0"; + pm6150l_adc_tm = "/fragment@13:target:0", "/fragment@18/__overlay__/pa-therm1:thermal-sensors:0"; + ufsphy_mem = "/fragment@14:target:0"; + pm6150_l4 = "/fragment@14/__overlay__:vdda-phy-supply:0"; + pm6150l_l3 = "/fragment@14/__overlay__:vdda-pll-supply:0", "/fragment@15/__overlay__:qcom,vddp-ref-clk-supply:0"; + ufshc_mem = "/fragment@15:target:0", "/fragment@63:target:0"; + ufs_phy_gdsc = "/fragment@15/__overlay__:vdd-hba-supply:0"; + pm6150_l19 = "/fragment@15/__overlay__:vcc-supply:0", "/fragment@16/__overlay__:vdd-supply:0"; + pm6150_l12 = "/fragment@15/__overlay__:vccq2-supply:0", "/fragment@16/__overlay__:vdd-io-supply:0"; + sdhc_1 = "/fragment@16:target:0"; + sdc1_clk_on = "/fragment@16/__overlay__:pinctrl-0:0"; + sdc1_cmd_on = "/fragment@16/__overlay__:pinctrl-0:4"; + sdc1_data_on = "/fragment@16/__overlay__:pinctrl-0:8"; + sdc1_rclk_on = "/fragment@16/__overlay__:pinctrl-0:12"; + sdc1_clk_off = "/fragment@16/__overlay__:pinctrl-1:0"; + sdc1_cmd_off = "/fragment@16/__overlay__:pinctrl-1:4"; + sdc1_data_off = "/fragment@16/__overlay__:pinctrl-1:8"; + sdc1_rclk_off = "/fragment@16/__overlay__:pinctrl-1:12"; + sdhc_2 = "/fragment@17:target:0"; + pm6150l_l9 = "/fragment@17/__overlay__:vdd-supply:0"; + pm6150l_l6 = "/fragment@17/__overlay__:vdd-io-supply:0"; + sdc2_clk_on = "/fragment@17/__overlay__:pinctrl-0:0"; + sdc2_cmd_on = "/fragment@17/__overlay__:pinctrl-0:4"; + sdc2_data_on = "/fragment@17/__overlay__:pinctrl-0:8"; + sdc2_cd_on = "/fragment@17/__overlay__:pinctrl-0:12"; + sdc2_clk_off = "/fragment@17/__overlay__:pinctrl-1:0"; + sdc2_cmd_off = "/fragment@17/__overlay__:pinctrl-1:4"; + sdc2_data_off = "/fragment@17/__overlay__:pinctrl-1:8"; + sdc2_cd_off = "/fragment@17/__overlay__:pinctrl-1:12"; + pm6150a_amoled = "/fragment@19:target:0"; + pm6150_qg = "/fragment@20:target:0"; + pm6150_vadc = "/fragment@21/__overlay__:io-channels:0", "/fragment@21/__overlay__:io-channels:8", "/fragment@21/__overlay__:io-channels:16", "/fragment@21/__overlay__:io-channels:24", "/fragment@21/__overlay__:io-channels:32", "/fragment@21/__overlay__:io-channels:40", "/fragment@21/__overlay__:io-channels:48", "/fragment@77/__overlay__/sec_thermistor@0:io-channels:0", "/fragment@79:target:0", "/fragment@120:target:0", "/fragment@121/__overlay__/battery:io-channels:0", "/fragment@121/__overlay__/battery:io-channels:8"; + qusb_phy0 = "/fragment@21/__overlay__:dpdm-supply:0", "/fragment@100:target:0"; + qupv3_se7_i2c = "/fragment@24:target:0", "/fragment@83:target:0", "/fragment@107:target:0"; + ts_active = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-0:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-0:0"; + ts_int_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:0"; + ts_reset_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:4", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:4"; + ts_release = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-2:0"; + pm6150_l10 = "/fragment@24/__overlay__/synaptics_tcm@20:vdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:vdd-supply:0", "/fragment@83/__overlay__/touchscreen@49:dvdd-supply:0"; + pm6150l_l7 = "/fragment@24/__overlay__/synaptics_tcm@20:avdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:avdd-supply:0", "/fragment@81:target:0", "/fragment@83/__overlay__/touchscreen@20:avdd-supply:0", "/fragment@83/__overlay__/touchscreen@49:avdd-supply:0"; + qupv3_se0_i2c = "/fragment@25:target:0", "/fragment@114:target:0"; + nfc_int_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:0"; + nfc_enable_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:4"; + nfc_clk_req_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:8"; + nfc_int_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:0"; + nfc_enable_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:4"; + nfc_clk_req_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:8"; + fsa4480 = "/fragment@26/__overlay__:qcom,dp-aux-switch:0", "/fragment@69:target:0"; + q6core = "/fragment@27:target:0", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:4", "/fragment@30:target:0", "/fragment@66:target:0", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:4"; + lpass_core_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:0", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:0", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:0"; + lpass_audio_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:8", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:8", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:8", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:8", "/fragment@28/__overlay__/va-macro@62770000:clocks:0"; + bolero = "/fragment@28:target:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214:qcom,bolero-handle:0", "/fragment@29/__overlay__:asoc-codec:4", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:12", "/fragment@65:target:0", "/fragment@68/__overlay__:asoc-codec:4", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:12"; + L10A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-rxtx-supply:0", "/fragment@28/__overlay__/wcd938x-codec:cdc-vddio-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-ldo-rxtx-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vddpx-1-supply:0"; + L15A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-buck-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-buck-supply:0"; + BOB = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-mic-bias-supply:0"; + atoll_snd = "/fragment@29:target:0", "/fragment@68:target:0"; + stub_codec = "/fragment@29/__overlay__:asoc-codec:0", "/fragment@68/__overlay__:asoc-codec:0"; + audio_apr = "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:0", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:0"; + spkr_1_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-0:0"; + spkr_1_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-1:0"; + spkr_2_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-0:0"; + spkr_2_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-1:0"; + wcd_reset_active = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-0:0"; + wcd_reset_sleep = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-1:0"; + va_cdc_dma_0_tx = "/fragment@32:target:0"; + aliases = "/fragment@33:target:0", "/fragment@64:target:0"; + clock_gcc = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:0", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:8", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:16"; + qupv3_1 = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:qcom,wrapper-core:0"; + dcc = "/fragment@36:target:0"; + reserved_memory = "/fragment@37:target:0", "/fragment@105:target:0"; + removed_region = "/fragment@38:target:0"; + pil_modem_mem = "/fragment@39:target:0"; + pil_adsp_mem = "/fragment@40:target:0"; + pil_camera_mem = "/fragment@41:target:0"; + pil_npu_mem = "/fragment@42:target:0"; + pil_video_mem = "/fragment@43:target:0"; + pil_cdsp_mem = "/fragment@44:target:0"; + qseecom_mem = "/fragment@45:target:0"; + qseecom_ta_mem = "/fragment@46:target:0"; + secure_carveout_heap = "/fragment@47:target:0"; + cdsp_sec_mem = "/fragment@48:target:0"; + msm_imem = "/fragment@49:target:0"; + camera = "/fragment@50:target:0"; + cam_vfe0 = "/fragment@51:target:0"; + cam_vfe1 = "/fragment@52:target:0"; + cam_vfe_lite = "/fragment@53:target:0"; + cam_lrme = "/fragment@54:target:0"; + shared_meta = "/fragment@55:target:0"; + android_q_fstab = "/fragment@56:target:0"; + pm8008_8 = "/fragment@57:target:0", "/fragment@75:target:0"; + pm8008_9 = "/fragment@58:target:0", "/fragment@76:target:0"; + usb0 = "/fragment@59:target:0"; + firmware = "/fragment@61:target:0"; + pil_modem = "/fragment@62:target:0"; + modem_smp2p_out = "/fragment@62/__overlay__:qcom,smem-states:0", "/fragment@62/__overlay__:qcom,smem-states:8", "/fragment@62/__overlay__:qcom,smem-states:16"; + pcm0 = "/fragment@68/__overlay__:asoc-platform:0"; + pcm1 = "/fragment@68/__overlay__:asoc-platform:4"; + pcm2 = "/fragment@68/__overlay__:asoc-platform:8"; + voip = "/fragment@68/__overlay__:asoc-platform:12"; + voice = "/fragment@68/__overlay__:asoc-platform:16"; + loopback = "/fragment@68/__overlay__:asoc-platform:20"; + compress = "/fragment@68/__overlay__:asoc-platform:24"; + hostless = "/fragment@68/__overlay__:asoc-platform:28"; + afe = "/fragment@68/__overlay__:asoc-platform:32"; + lsm = "/fragment@68/__overlay__:asoc-platform:36"; + routing = "/fragment@68/__overlay__:asoc-platform:40"; + compr = "/fragment@68/__overlay__:asoc-platform:44"; + pcm_noirq = "/fragment@68/__overlay__:asoc-platform:48"; + spmi_bus = "/fragment@74:target:0", "/fragment@117/__overlay__/i2c@17/sx9360-i2c@28:interrupt-parent:0"; + pm6150_gpios = "/fragment@78:target:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:samsung,ub-con-det:0", "/fragment@91:target:0", "/fragment@115/__overlay__/hall:hall,gpio_flip_cover:0", "/fragment@116:target:0"; + gpio_key = "/fragment@85:target:0"; + cont_splash_memory = "/fragment@94:target:0"; + dfps_data_memory = "/fragment@95:target:0"; + disp_rdump_memory = "/fragment@96:target:0"; + qupv3_se4_i2c = "/fragment@97:target:0"; + qupv3_se11_i2c = "/fragment@98:target:0"; + pm6150l_l11 = "/fragment@102:target:0"; + qupv3_se6_spi = "/fragment@103:target:0"; + pm6150l_switch2 = "/fragment@106/__overlay__/qcom,camera-flash@0:switch-source:0"; + qupv3_se10_i2c = "/fragment@108:target:0"; + cam_cci0 = "/fragment@109:target:0"; + titan_top_gdsc = "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@37:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:cam_clk-supply:0"; + clock_camcc = "/fragment@109/__overlay__/qcom,cam-sensor@0:clocks:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@37:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:clocks:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:clocks:0"; + cam_cci1 = "/fragment@110:target:0"; + qupv3_se9_i2c = "/fragment@111:target:0"; + apps_rsc = "/fragment@117/__overlay__/rpmh-regulator-ldoc8:mboxes:0"; + }; + + __local_fixups__ { + + fragment@0 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@1 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@2 { + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@5 { + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@6 { + + __overlay__ { + + qcom,dsi-display@0 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@1 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@2 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@3 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@4 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@5 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + qcom,dsi-display-list = <0x0 0x4>; + }; + }; + }; + + fragment@7 { + + __overlay__ { + qcom,ext-disp = <0x0>; + }; + }; + + fragment@8 { + + __overlay__ { + connectors = <0x0 0x4>; + }; + }; + + fragment@20 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@21 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@28 { + + __overlay__ { + + bolero-clk-rsc-mngr { + clocks = <0x0 0x8 0x10 0x18 0x20 0x28 0x30 0x38>; + }; + + tx-macro@62620000 { + clocks = <0x0 0x8>; + qcom,tx-swr-gpios = <0x0>; + }; + + rx-macro@62600000 { + clocks = <0x0 0x8>; + qcom,rx-swr-gpios = <0x0>; + }; + + wsa-macro@62640000 { + clocks = <0x0 0x8>; + qcom,wsa-swr-gpios = <0x0>; + + wsa_swr_master { + + wsa881x@20170211 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@20170212 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170213 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170214 { + qcom,spkr-sd-n-node = <0x0>; + }; + }; + }; + + wcd938x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + mbhc-button-thres = <0x0 0xc 0x18 0x24 0x30 0x3c 0x48 0x54>; + imp-table = <0x0 0x10 0x20 0x30 0x40 0x50 0x60 0x70>; + }; + + wcd937x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + }; + }; + }; + + fragment@29 { + + __overlay__ { + qcom,cdc-dmic01-gpios = <0x0>; + qcom,cdc-dmic23-gpios = <0x0>; + qcom,cdc-dmic45-gpios = <0x0>; + asoc-codec = <0x8>; + qcom,wsa-devs = <0x0 0x4 0x8 0xc>; + qcom,codec-aux-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@30 { + + __overlay__ { + + cdc_dmic01_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic23_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic45_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + wsa_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + rx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + tx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@34 { + + __overlay__ { + + qcom,qup_hsuart@a88000 { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@60 { + + __overlay__ { + + qcom,memshare { + + qcom,client_4 { + memory-region = <0x0>; + }; + }; + + samsung,sec_hdm { + memory-region = <0x0>; + }; + }; + }; + + fragment@66 { + + __overlay__ { + + msm_cdc_pinctrl_quin { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@67 { + + __overlay__ { + + i2c@18 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@68 { + + __overlay__ { + asoc-platform = <0x34>; + qcom,quin-mi2s-gpios = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@77 { + + __overlay__ { + + i2c@2 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@83 { + + __overlay__ { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + + touchscreen@20 { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + + touchscreen@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@85 { + + __overlay__ { + pinctrl-0 = <0x0>; + }; + }; + + fragment@88 { + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD { + ss,self_display = <0x0>; + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@89 { + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@97 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sm5714@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@98 { + + __overlay__ { + pinctrl-1 = <0x0>; + + usbpd-sm5714@33 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@103 { + + __overlay__ { + + gw9558-spi@0 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@104 { + + __overlay__ { + + gw9558@0 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@106 { + + __overlay__ { + + qcom,camera-flash@0 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,cam-res-mgr { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + }; + }; + + fragment@108 { + + __overlay__ { + + qcom,ois@62 { + cam_vaf-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@109 { + + __overlay__ { + + qcom,cam-sensor@0 { + actuator-src = <0x0>; + led-flash-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@2 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x2D { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@37 { + cam_vio-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + }; + }; + + fragment@110 { + + __overlay__ { + + qcom,cam-sensor@1 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@8 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@3 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@4 { + led-flash-src = <0x0>; + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc 0x10>; + pinctrl-1 = <0x0 0x4 0x8 0xc 0x10>; + }; + + qcom,eeprom@0x3F { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@111 { + + __overlay__ { + + qcom,actuator@0xC { + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + }; + + qcom,eeprom@50 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@51 { + cam_vio-supply = <0x0>; + }; + }; + }; + + fragment@114 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sec-nfc@27 { + pinctrl-0 = <0x0 0x4 0x8 0xc 0x10>; + }; + }; + }; + + fragment@115 { + + __overlay__ { + + hall { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@117 { + + __overlay__ { + + i2c@17 { + pinctrl-0 = <0x0>; + + sx9360-i2c@28 { + pinctrl-0 = <0x0>; + }; + }; + }; + }; + }; }; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r02.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r02.dts index adeb448c2b0b..bdb9aa1f394c 100755 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r02.dts +++ b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r02.dts @@ -1,25 +1,7162 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - /dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a52q-r02.dtsi" -#include "drivers/atoll-sec-a52q-battery-common.dtsi" / { model = "Samsung A52Q PROJECT REV01 (board-id,02)"; compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 2>; - dtbo-version = <0>; + qcom,board-id = <0x22 0x2>; + dtbo-version = <0x0>; + + fragment@0 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ video mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x37 0x30>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x38ae2bc0 0x37bc55b0 0x37f8cb38 0x383540b8 0x3871b640>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x3>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@1 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ cmd mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x3da58d80 0x3c9e86e0 0x3ce04888 0x3d220a30 0x3d63cbd8>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x4>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@2 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,mdss-dsi-panel-name = "Simulator video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-mode-switch; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x0 0x0 0x0 0x1 0x0>; + qcom,panel-ack-disabled; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x5>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-video-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,cmd-to-video-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,cmd-to-video-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1 0x2 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-cmd-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,video-to-cmd-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,video-to-cmd-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@3 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-t-clk-post = <0xc>; + qcom,mdss-dsi-t-clk-pre = <0x29>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-ack-disabled; + qcom,ulps-enabled; + phandle = <0x6>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x64>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x64>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x2d0 0x28 0x2d0 0x28 0x2d0 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x1cc>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x2e4>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x21c 0x28 0x21c 0x28 0x21c 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@2 { + qcom,mdss-dsi-panel-width = <0x2d0>; + qcom,mdss-dsi-panel-height = <0x500>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x348>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x564>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x168>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x168 0x28 0x168 0x28 0x168 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + }; + }; + }; + }; + + fragment@4 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_dsc_375_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode DSC 3.75:1 dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,panel-ack-disabled; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,ulps-enabled; + phandle = <0x7>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-pulse-width = <0x10>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x8>; + qcom,mdss-dsi-v-front-porch = <0xa>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-on-command = <0x15010000 0x2ff 0x20150100 0x2 0xfb011501 0x0 0x2000115 0x1000000 0x20155 0x15010000 0x202 0x45150100 0x2 0x5401501 0x0 0x2061915 0x1000000 0x2071e 0x15010000 0x20b 0x73150100 0x2 0xc731501 0x0 0x20eb015 0x1000000 0x20fae 0x15010000 0x211 0xb8150100 0x2 0x13001501 0x0 0x2588015 0x1000000 0x25901 0x15010000 0x25a 0x150100 0x2 0x5b011501 0x0 0x25c8015 0x1000000 0x25d81 0x15010000 0x25e 0x150100 0x2 0x5f011501 0x0 0x2723115 0x1000000 0x26803 0x15010000 0x2ff 0x24150100 0x2 0xfb011501 0x0 0x2001c15 0x1000000 0x2010b 0x15010000 0x202 0xc150100 0x2 0x3011501 0x0 0x2040f15 0x1000000 0x20510 0x15010000 0x206 0x10150100 0x2 0x7101501 0x0 0x2088915 0x1000000 0x2098a 0x15010000 0x20a 0x13150100 0x2 0xb131501 0x0 0x20c1515 0x1000000 0x20d15 0x15010000 0x20e 0x17150100 0x2 0xf171501 0x0 0x2101c15 0x1000000 0x2110b 0x15010000 0x212 0xc150100 0x2 0x13011501 0x0 0x2140f15 0x1000000 0x21510 0x15010000 0x216 0x10150100 0x2 0x17101501 0x0 0x2188915 0x1000000 0x2198a 0x15010000 0x21a 0x13150100 0x2 0x1b131501 0x0 0x21c1515 0x1000000 0x21d15 0x15010000 0x21e 0x17150100 0x2 0x1f171501 0x0 0x2204015 0x1000000 0x22101 0x15010000 0x222 0x150100 0x2 0x23401501 0x0 0x2244015 0x1000000 0x2256d 0x15010000 0x226 0x40150100 0x2 0x27401501 0x0 0x2e00015 0x1000000 0x2dc21 0x15010000 0x2dd 0x22150100 0x2 0xde071501 0x0 0x2df0715 0x1000000 0x2e36d 0x15010000 0x2e1 0x7150100 0x2 0xe2071501 0x0 0x229d815 0x1000000 0x22a2a 0x15010000 0x24b 0x3150100 0x2 0x4c111501 0x0 0x24d1015 0x1000000 0x24e01 0x15010000 0x24f 0x1150100 0x2 0x50101501 0x0 0x2510015 0x1000000 0x25280 0x15010000 0x253 0x150100 0x2 0x56001501 0x0 0x2540715 0x1000000 0x25807 0x15010000 0x255 0x25150100 0x2 0x5b431501 0x0 0x25c0015 0x1000000 0x25f73 0x15010000 0x260 0x73150100 0x2 0x63221501 0x0 0x2640015 0x1000000 0x26708 0x15010000 0x268 0x4150100 0x2 0x72021501 0x0 0x27a8015 0x1000000 0x27b91 0x15010000 0x27c 0xd8150100 0x2 0x7d601501 0x0 0x27f1515 0x1000000 0x27515 0x15010000 0x2b3 0xc0150100 0x2 0xb4001501 0x0 0x2b50015 0x1000000 0x27800 0x15010000 0x279 0x150100 0x2 0x80001501 0x0 0x2830015 0x1000000 0x2930a 0x15010000 0x294 0xa150100 0x2 0x8a001501 0x0 0x29bff15 0x1000000 0x29db0 0x15010000 0x29f 0x63150100 0x2 0x98101501 0x0 0x2ec0015 0x1000000 0x2ff10 0x39010000 0x11c1 0x9200010 0x2000268 0x1bb000a 0x66704c5 0x39010000 0x3c2 0x10f01501 0x0 0x2c00315 0x1000000 0x43b03 0xa0a1501 0x0 0x2350015 0x1000000 0x2e501 0x15010000 0x2bb 0x10150100 0x2 0xfb010501 0x7800 0x2110005 0x1000078 0x22900>; + qcom,mdss-dsi-off-command = [05 01 00 00 78 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x0>; + qcom,mdss-dsi-h-back-porch = <0x0>; + qcom,mdss-dsi-h-pulse-width = <0x0>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x0>; + qcom,mdss-dsi-v-front-porch = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x0>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = <0x15010000 0x2bb 0x10150100 0x2 0xb0030501 0x7800 0x1111501 0x0 0x251ff15 0x1000000 0x25324 0x15010000 0x2ff 0x23150100 0x2 0x8051501 0x0 0x2469015 0x1000000 0x2ff10 0x15010000 0x2ff 0xf0150100 0x2 0x92011501 0x0 0x2ff1015 0x1000000 0x23500 0x5010000 0x28000129>; + qcom,mdss-dsi-off-command = <0x5010000 0x10000128 0x5010000 0x40000110>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x150505 0x201f0505 0x3020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1 0x2 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@5 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,mdss-dsi-panel-name = "nt36672c fhd plus video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x14 0x0 0x14 0x1 0x14>; + qcom,mdss-pan-physical-width-dimension = <0x4a>; + qcom,mdss-pan-physical-height-dimension = <0x83>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-cphy-mode; + qcom,mdss-dsi-t-clk-post = <0x0>; + qcom,mdss-dsi-t-clk-pre = <0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x5a 0x32>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-skip-timing-update; + qcom,dsi-dyn-clk-list = <0x3eb54a94 0x3e726713 0x3e2f838b 0x3deca00a 0x3da9bc89>; + qcom,dsi-dyn-clk-type = "constant-fps-adjust-hfp"; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,platform-bklight-en-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-en-gpio = <0xffffffff 0x4 0x0>; + phandle = <0x8>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-front-porch = <0xca>; + qcom,mdss-dsi-h-back-porch = <0x38>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0xa>; + qcom,mdss-dsi-v-front-porch = <0x50b>; + qcom,mdss-dsi-v-pulse-width = <0xa>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 b0 00 29 01 00 00 00 00 02 c0 00 29 01 00 00 00 00 03 c2 1b a0 29 01 00 00 00 00 02 ff 25 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 18 20 15 01 00 00 00 00 02 ff 2a 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 27 80 15 01 00 00 00 00 02 28 fd 29 01 00 00 00 00 02 ff f0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 5a 00 29 01 00 00 00 00 02 a0 08 29 01 00 00 00 00 02 ff d0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 09 ad 15 01 00 00 00 00 02 ff 10 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 51 ff 15 01 00 00 00 00 02 53 2c 15 01 00 00 00 00 02 ff 23 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 0a 00 15 01 00 00 00 00 02 0b 00 15 01 00 00 00 00 02 0c 00 15 01 00 00 00 00 02 0d 00 15 01 00 00 00 00 02 11 01 15 01 00 00 00 00 02 12 95 15 01 00 00 00 00 02 15 68 15 01 00 00 00 00 02 16 0b 15 01 00 00 00 00 02 6f 00 15 01 00 00 00 00 02 70 00 15 01 00 00 00 00 02 71 00 15 01 00 00 00 00 02 a0 11 15 01 00 00 00 00 02 ff f0 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 d2 52 29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 35 00 05 01 00 00 78 00 02 11 00 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x230909 0x26240909 0x9060204>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@6 { + target = <0xffffffff>; + + __overlay__ { + + dsi_panel_pwr_supply { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xab>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + }; + + qcom,panel-supply-entry@2 { + reg = <0x2>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-post-on-sleep = <0x14>; + }; + }; + + dsi_panel_pwr_supply_no_labibb { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x2>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + }; + + dsi_panel_pwr_supply_labibb_amoled { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x1>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vdda-3p3"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x3390>; + qcom,supply-disable-load = <0x50>; + }; + }; + + qcom,dsi-display@0 { + label = "dsi_rm69299_visionox_amoled_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0"; + qcom,dsi-panel = <0x3>; + qcom,dsi-display-active; + phandle = <0xac>; + }; + + qcom,dsi-display@1 { + label = "dsi_rm69299_visionox_amoled_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x4>; + phandle = <0xad>; + }; + + qcom,dsi-display@2 { + label = "dsi_sim_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x5>; + phandle = <0xae>; + }; + + qcom,dsi-display@3 { + label = "dsi_sim_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x6>; + phandle = <0xaf>; + }; + + qcom,dsi-display@4 { + label = "dsi_sim_dsc_375_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x7>; + phandle = <0xb0>; + }; + + qcom,dsi-display@5 { + label = "dsi_nt36672c_video_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + qcom,dsi-panel = <0x8>; + phandle = <0xb1>; + }; + + qcom,dsi-display { + compatible = "qcom,dsi-display"; + qcom,dsi-ctrl = <0xffffffff>; + qcom,dsi-phy = <0xffffffff>; + clocks = <0xffffffff 0x6 0xffffffff 0x9 0xffffffff 0x3 0xffffffff 0x8 0xffffffff 0xa 0xffffffff 0xd 0xffffffff 0x11 0xffffffff 0x15 0xffffffff 0x16 0xffffffff 0x19>; + clock-names = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + pinctrl-names = "panel_active", "panel_suspend"; + pinctrl-0 = <0x9 0xa 0xb 0xc>; + pinctrl-1 = <0xd 0xe 0xb 0xc>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,panel-te-source = <0x0>; + vddio-supply = <0xffffffff>; + vdda-3p3-supply = <0xffffffff>; + lab-supply = <0xffffffff>; + ibb-supply = <0xffffffff>; + qcom,dsi-display-list = <0xf 0x10>; + vci-supply = <0xffffffff>; + vddi-supply = <0xffffffff>; + phandle = <0x13>; + }; + + qcom,wb-display@0 { + compatible = "qcom,wb-display"; + cell-index = <0x0>; + label = "wb_display"; + phandle = <0x12>; + }; + + qcom,msm-ext-disp { + compatible = "qcom,msm-ext-disp"; + phandle = <0x11>; + + qcom,msm-ext-disp-audio-codec-rx { + compatible = "qcom,msm-ext-disp-audio-codec-rx"; + phandle = <0x2c>; + }; + }; + }; + }; + + fragment@7 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-usbpd-detection = <0xffffffff>; + qcom,ext-disp = <0x11>; + qcom,usbplug-cc-gpio = <0xffffffff 0x68 0x0>; + pinctrl-name = "mdss_dp_active", "mdss_dp_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + }; + }; + + fragment@8 { + target = <0xffffffff>; + + __overlay__ { + connectors = <0x12 0x13 0xffffffff 0xffffffff>; + }; + }; + + fragment@9 { + target = <0xffffffff>; + + __overlay__ { + + pm6150-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150l-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_cpu0 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl0 { + disable-thermal-zone; + + cooling-maps { + + vbat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + vbat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl1 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl2 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + soc { + disable-thermal-zone; + + cooling-maps { + + soc_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + soc_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + }; + }; + + fragment@10 { + target = <0xffffffff>; + + __overlay__ { + #cooling-cells = <0x2>; + }; + }; + + fragment@11 { + target = <0xffffffff>; + + __overlay__ { + + qcom,battery-data { + qcom,batt-id-range-pct = <0xf>; + phandle = <0x14>; + + qcom,alium_860_89032_0000_3600mAh { + qcom,max-voltage-uv = <0x426030>; + qcom,fg-cc-cv-threshold-uv = <0x423920>; + qcom,fastchg-current-ma = <0x1518>; + qcom,batt-id-kohm = <0x6b>; + qcom,battery-beta = <0x109a>; + qcom,battery-therm-kohm = <0x64>; + qcom,battery-type = "Alium_860_89032_0000_3600mAh_Jun15th2018"; + qcom,qg-batt-profile-ver = <0x64>; + qcom,jeita-fcc-ranges = <0x0 0x32 0x2625a0 0x33 0x190 0x5265c0 0x191 0x1c2 0x2625a0>; + qcom,jeita-fv-ranges = <0x0 0x32 0x40d990 0x33 0x190 0x426030 0x191 0x1c2 0x40d990>; + qcom,step-chg-ranges = <0x36ee80 0x39fbc0 0x5265c0 0x39fbc1 0x419ce0 0x36ee80 0x419ce1 0x426030 0x2625a0>; + qcom,ocv-based-step-chg; + qcom,jeita-soft-thresholds = <0x5314 0x25e3>; + qcom,jeita-hard-thresholds = <0x58cd 0x20b8>; + qcom,jeita-soft-hys-thresholds = <0x4f5e 0x2943>; + qcom,jeita-soft-fcc-ua = <0x2625a0 0x2625a0>; + qcom,jeita-soft-fv-uv = <0x40d990 0x40d990>; + + qcom,fcc1-temp-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xd62 0xdbf 0xdfd 0xe1d 0xe2e>; + }; + + qcom,fcc2-temp-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xdda 0xdf8 0xe02 0xe04 0xdff 0xdff>; + }; + + qcom,pc-temp-v1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa846 0xa903 0xa965 0xa982 0xa987 0xa757 0xa82c 0xa88b 0xa8b2 0xa8bc 0xa671 0xa747 0xa7a8 0xa7d4 0xa7e5 0xa598 0xa65f 0xa6c5 0xa6f2 0xa707 0xa4ca 0xa582 0xa5e5 0xa611 0xa627 0xa3ff 0xa4af 0xa508 0xa531 0xa546 0xa330 0xa3e1 0xa430 0xa452 0xa465 0xa25d 0xa311 0xa35c 0xa377 0xa387 0xa1a0 0xa23e 0xa287 0xa29e 0xa2ad 0xa10a 0xa17a 0xa1b1 0xa1c4 0xa1d2 0xa07e 0xa0e5 0xa0f6 0xa0f5 0xa0fc 0x9fa9 0xa061 0xa067 0xa048 0xa036 0x9e4b 0x9f9a 0x9fd6 0x9fae 0x9f81 0x9cdb 0x9e3d 0x9ee8 0x9ee6 0x9ebf 0x9bed 0x9cd1 0x9d85 0x9dc6 0x9dd7 0x9b4d 0x9bf5 0x9c67 0x9cb4 0x9cf4 0x9ad6 0x9b65 0x9bd6 0x9c18 0x9c4a 0x9a75 0x9af5 0x9b63 0x9baa 0x9bc5 0x9a1f 0x9a9b 0x9ade 0x9b13 0x9b23 0x99c4 0x9a41 0x9a3f 0x9a2d 0x9a41 0x9962 0x99c6 0x998a 0x9943 0x9959 0x98fd 0x992a 0x98b8 0x9892 0x98a0 0x9894 0x9882 0x97f4 0x9800 0x9807 0x982b 0x97c6 0x976f 0x9780 0x9781 0x97cb 0x9713 0x970f 0x970c 0x970c 0x9775 0x9697 0x96b5 0x96a2 0x96a2 0x9724 0x963e 0x965a 0x9642 0x963e 0x96db 0x95fa 0x9603 0x95e9 0x95e1 0x9698 0x95c7 0x95b7 0x9598 0x958b 0x965b 0x959d 0x9571 0x954e 0x953b 0x9627 0x9575 0x9533 0x950c 0x94f4 0x95f8 0x9550 0x94fe 0x94d1 0x94b3 0x95cc 0x952e 0x94cf 0x949b 0x947a 0x95a2 0x9511 0x94a4 0x9465 0x9440 0x9579 0x94f7 0x947f 0x9432 0x9407 0x954f 0x94d6 0x9458 0x93fe 0x93cc 0x9525 0x94b2 0x942f 0x93c6 0x938b 0x94f0 0x9484 0x9402 0x938b 0x9345 0x94a6 0x943e 0x93bf 0x9343 0x92f7 0x944c 0x93da 0x935f 0x92ed 0x92a2 0x93e6 0x936c 0x92f1 0x9288 0x923f 0x936b 0x92f1 0x9276 0x920e 0x91c6 0x92e1 0x926f 0x91f1 0x9188 0x9141 0x9248 0x91ea 0x9165 0x90ff 0x90bc 0x91cf 0x9176 0x9100 0x909b 0x905b 0x9179 0x9129 0x90c1 0x9060 0x9022 0x9159 0x910e 0x90ab 0x904f 0x9011 0x913e 0x90f9 0x909a 0x903f 0x9001 0x911a 0x90de 0x907f 0x9020 0x8fdd 0x90ac 0x9070 0x8ff7 0x8f74 0x8f1a 0x8f68 0x8f1c 0x8e9e 0x8e14 0x8db6 0x8d9d 0x8d55 0x8cd8 0x8c4c 0x8beb 0x8b59 0x8b10 0x8a94 0x8a02 0x899f 0x8849 0x87fb 0x877d 0x86e5 0x867d 0x836c 0x8325 0x82aa 0x8209 0x8197 0x7530 0x7530 0x7530 0x7530 0x7530>; + }; + + qcom,pc-temp-v2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa98d 0xa97e 0xa974 0xa960 0xa92e 0xa910 0xa7fb 0xa83a 0xa854 0xa856 0xa82f 0xa819 0xa6a3 0xa712 0xa747 0xa757 0xa738 0xa728 0xa594 0xa609 0xa64d 0xa665 0xa64a 0xa63c 0xa4c7 0xa51d 0xa566 0xa581 0xa565 0xa558 0xa3f4 0xa43e 0xa489 0xa4a2 0xa484 0xa478 0xa2af 0xa364 0xa3b3 0xa3c8 0xa3a5 0xa397 0xa162 0xa292 0xa2e4 0xa2f3 0xa2ca 0xa2b9 0xa11a 0xa1c1 0xa210 0xa21b 0xa1ef 0xa1de 0xa14f 0xa0ea 0xa131 0xa139 0xa110 0xa103 0xa17a 0xa03c 0xa071 0xa077 0xa047 0xa035 0xa046 0x9fd6 0x9ff5 0x9ff5 0x9fb3 0x9f87 0x9d6d 0x9f7f 0x9f85 0x9f81 0x9f2b 0x9ee2 0x9b88 0x9eab 0x9ea9 0x9ead 0x9e5e 0x9e1a 0x9a81 0x9c78 0x9cde 0x9d1e 0x9d16 0x9d22 0x99b8 0x9a96 0x9b46 0x9bd5 0x9bfe 0x9c3f 0x9913 0x99e8 0x9a78 0x9b4d 0x9b70 0x9b9c 0x9887 0x9977 0x99df 0x9aeb 0x9b04 0x9b0e 0x97f7 0x98f2 0x9948 0x9a53 0x9a64 0x9a58 0x975c 0x9856 0x98b5 0x9965 0x9971 0x9967 0x96c8 0x97b8 0x9827 0x987f 0x9885 0x9883 0x9649 0x9720 0x9799 0x97d3 0x97d8 0x97d6 0x95d8 0x968d 0x9711 0x9743 0x9748 0x9745 0x957d 0x9608 0x9697 0x96c6 0x96cb 0x96c8 0x9533 0x9591 0x9629 0x9658 0x965c 0x9658 0x94f4 0x952a 0x95c3 0x95f3 0x95f6 0x95f1 0x94bc 0x94d6 0x9565 0x9595 0x9598 0x9592 0x948a 0x9491 0x950e 0x953e 0x9540 0x9538 0x9458 0x9459 0x94bd 0x94f0 0x94ef 0x94e6 0x9429 0x942b 0x9471 0x94aa 0x94a5 0x949b 0x93fa 0x9403 0x942c 0x9467 0x9461 0x9456 0x93cb 0x93dc 0x93ed 0x9426 0x9422 0x9418 0x939a 0x93b7 0x93b6 0x93e7 0x93e7 0x93dd 0x9366 0x9390 0x9384 0x93a6 0x93a1 0x9392 0x9330 0x9367 0x935a 0x9364 0x9348 0x932b 0x92f5 0x933c 0x9330 0x9322 0x92ea 0x92bd 0x92b6 0x9309 0x9301 0x92e2 0x9296 0x925d 0x9274 0x92ce 0x92cf 0x92a2 0x9248 0x9208 0x922d 0x9289 0x9294 0x925e 0x91fe 0x91bc 0x91e4 0x9235 0x924a 0x9214 0x91b6 0x9173 0x919a 0x91d4 0x91f2 0x91c0 0x9166 0x9124 0x9151 0x916d 0x918d 0x9158 0x9101 0x90c0 0x910a 0x9104 0x9119 0x90da 0x9085 0x9045 0x90be 0x90a5 0x90a4 0x9064 0x9011 0x8fd4 0x9066 0x9055 0x9058 0x9026 0x8fde 0x8fa3 0x8ff1 0x9009 0x9027 0x900b 0x8fc1 0x8f87 0x8fa0 0x8fd7 0x9010 0x8ff6 0x8fb0 0x8f76 0x8f3a 0x8f9b 0x8ff2 0x8fd7 0x8f94 0x8f5b 0x8e9d 0x8f3c 0x8fa7 0x8f84 0x8f3f 0x8efc 0x8dbc 0x8e73 0x8ecd 0x8e86 0x8e46 0x8df2 0x8c72 0x8d0b 0x8d41 0x8ce7 0x8ca5 0x8c4f 0x8a95 0x8b0d 0x8b2a 0x8ad3 0x8a9a 0x8a45 0x87f8 0x8865 0x887d 0x881c 0x87ec 0x879d 0x841a 0x8496 0x84d3 0x8488 0x847e 0x8426 0x7eca 0x7f24 0x801b 0x8028 0x7f97 0x7ef0 0x6fcb 0x6e6e 0x6d71 0x6d74 0x6d50 0x6d1a>; + }; + + qcom,pc-temp-z1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x38d1 0x33b6 0x2f09 0x2da0 0x2d49 0x38bb 0x337f 0x2f0d 0x2d9e 0x2d52 0x38c3 0x3376 0x2f0b 0x2da5 0x2d5c 0x38c7 0x337e 0x2f07 0x2da7 0x2d60 0x38d3 0x3382 0x2f03 0x2da8 0x2d62 0x38eb 0x337d 0x2f01 0x2da8 0x2d64 0x38ff 0x336c 0x2f02 0x2da9 0x2d67 0x38f6 0x335e 0x2f03 0x2dac 0x2d6a 0x38d7 0x335d 0x2f05 0x2dae 0x2d6d 0x38b6 0x3362 0x2f09 0x2db1 0x2d6f 0x3896 0x3360 0x2f0d 0x2db5 0x2d72 0x3874 0x334e 0x2f0f 0x2db8 0x2d77 0x3843 0x333c 0x2f0f 0x2dbb 0x2d7b 0x3810 0x332e 0x2f0b 0x2dbb 0x2d7c 0x37ee 0x3328 0x2f04 0x2db9 0x2d7c 0x37d3 0x3329 0x2f01 0x2db7 0x2d7c 0x37b6 0x3329 0x2f04 0x2dbb 0x2d7f 0x3792 0x332c 0x2f0a 0x2dc2 0x2d85 0x3772 0x3337 0x2f14 0x2dc9 0x2d8b 0x3765 0x3349 0x2f21 0x2dce 0x2d8f 0x3763 0x335e 0x2f2c 0x2dd3 0x2d93 0x376a 0x3374 0x2f35 0x2dd8 0x2d98 0x3773 0x3384 0x2f3d 0x2ddd 0x2d9c 0x377f 0x338b 0x2f45 0x2de1 0x2da1 0x3787 0x3391 0x2f4d 0x2de7 0x2da6 0x378c 0x339a 0x2f54 0x2dec 0x2daa 0x378f 0x33a6 0x2f5b 0x2df0 0x2daf 0x3794 0x33ad 0x2f62 0x2df4 0x2db3 0x379f 0x33b2 0x2f69 0x2df8 0x2db7 0x37af 0x33ba 0x2f6f 0x2dfc 0x2dbb 0x37c7 0x33c2 0x2f75 0x2e00 0x2dbf 0x37de 0x33c9 0x2f7a 0x2e04 0x2dc4 0x37e6 0x33d1 0x2f80 0x2e08 0x2dc8 0x37ea 0x33de 0x2f86 0x2e0d 0x2dcd 0x37f0 0x33f1 0x2f8e 0x2e12 0x2dd1 0x3807 0x3403 0x2f95 0x2e17 0x2dd5 0x383b 0x3415 0x2f9d 0x2e1a 0x2dd8 0x386b 0x3422 0x2fa5 0x2e1c 0x2dda 0x3891 0x3427 0x2faa 0x2e1f 0x2ddc 0x38b0 0x3429 0x2fad 0x2e21 0x2ddd 0x38b2 0x342d 0x2fb1 0x2e23 0x2dde 0x3888 0x3439 0x2fb9 0x2e25 0x2de0 0x3873 0x3448 0x2fbf 0x2e27 0x2de1 0x386e 0x3457 0x2fc0 0x2e28 0x2de2 0x3861 0x3449 0x2fc4 0x2e29 0x2de2 0x386f 0x3454 0x2fc7 0x2e2b 0x2de2 0x3869 0x3454 0x2fc8 0x2e2b 0x2de1 0x3868 0x345b 0x2fc9 0x2e2b 0x2de2 0x385f 0x3457 0x2fcf 0x2e2c 0x2de3 0x387c 0x3452 0x2fd1 0x2e30 0x2de6 0x3886 0x346f 0x2fdb 0x2e36 0x2deb 0x38aa 0x3476 0x2ff3 0x2e3f 0x2df0 0x3895 0x349e 0x3007 0x2e4a 0x2dfa 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06>; + }; + + qcom,pc-temp-z2-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2bb8 0x2632 0x2811 0x296b 0x2a9e 0x280d 0x2a3d 0x2824 0x28fa 0x293e 0x25fe 0x2926 0x282f 0x28bc 0x28c4 0x2606 0x274d 0x282a 0x28ad 0x28ac 0x2620 0x26d2 0x281d 0x2898 0x28a6 0x262f 0x26c3 0x2815 0x288c 0x28a4 0x2631 0x26b5 0x2811 0x2887 0x28a8 0x262c 0x26aa 0x2812 0x2882 0x28ac 0x2625 0x26a2 0x2816 0x2880 0x28ac 0x261b 0x269c 0x2819 0x2884 0x28b5 0x2612 0x2698 0x2813 0x2887 0x28cc 0x2616 0x2696 0x27f3 0x288e 0x28d4 0x2626 0x2699 0x27d7 0x28ae 0x28d3 0x262c 0x26a7 0x27e8 0x28bd 0x28d4 0x2618 0x26b3 0x2814 0x289f 0x28d2 0x25f5 0x26b6 0x282a 0x2883 0x28c7 0x25e5 0x26ba 0x2827 0x288f 0x28d1 0x25e1 0x26c3 0x281d 0x28b2 0x290a 0x25dd 0x26dd 0x2837 0x28e1 0x2937 0x25d6 0x26fd 0x2894 0x2931 0x293f 0x25c9 0x271e 0x28ce 0x296a 0x293f 0x25be 0x2742 0x28b3 0x2939 0x2923 0x25b7 0x2760 0x2883 0x28bd 0x28ee 0x25b1 0x2775 0x2863 0x288b 0x28cc 0x259f 0x2784 0x284c 0x289e 0x28b4 0x2574 0x278c 0x283f 0x28b6 0x28a5 0x2552 0x2793 0x283c 0x28a9 0x28a6 0x2544 0x2797 0x283d 0x2890 0x28af 0x250b 0x2796 0x2845 0x2888 0x28ba 0x24d2 0x2793 0x2859 0x2888 0x28cd 0x24c0 0x2792 0x286f 0x288c 0x28e8 0x24b3 0x2793 0x2885 0x289f 0x290a 0x24aa 0x2795 0x289c 0x28c5 0x2934 0x24a2 0x2799 0x28b4 0x28ea 0x2962 0x249c 0x27a2 0x28ce 0x290a 0x299b 0x2498 0x27aa 0x28df 0x2925 0x29c7 0x249e 0x27b2 0x28e4 0x293c 0x29d8 0x24a4 0x27b7 0x28e7 0x2954 0x29e2 0x24ad 0x27bb 0x28ef 0x2961 0x29ed 0x24b6 0x27c0 0x28fb 0x2964 0x29f9 0x24b5 0x27c2 0x2901 0x2965 0x2a01 0x24a8 0x27b9 0x28fa 0x2971 0x2a03 0x24a4 0x279c 0x28f3 0x2981 0x2a07 0x24aa 0x26ec 0x28f1 0x2987 0x2a1d 0x246c 0x26c6 0x28d6 0x2992 0x2a3b 0x2459 0x26cc 0x28c6 0x29ad 0x2a38 0x2447 0x26dc 0x28df 0x29c9 0x2a6a 0x2449 0x26cd 0x293d 0x29ca 0x2a89 0x243a 0x26ed 0x297e 0x2a06 0x2aa5 0x243e 0x26c3 0x2925 0x29d7 0x2a55 0x2464 0x269c 0x28de 0x298a 0x29c5 0x246e 0x264f 0x28b9 0x2971 0x29af 0x2445 0x25fc 0x289b 0x2927 0x295f 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904>; + }; + + qcom,pc-temp-z3-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4c45 0x4be7 0x4bad 0x4bb7 0x4b9b 0x4d48 0x4c26 0x4bd0 0x4baa 0x4b96 0x4dd0 0x4c76 0x4bee 0x4bac 0x4b97 0x4de1 0x4cc3 0x4bfa 0x4bb4 0x4b9c 0x4dce 0x4cd9 0x4bff 0x4bb6 0x4b9f 0x4db7 0x4cdc 0x4c00 0x4bb7 0x4ba2 0x4dac 0x4cdd 0x4bfe 0x4bb5 0x4ba2 0x4da7 0x4cdd 0x4bfb 0x4bb0 0x4b9f 0x4da5 0x4ce0 0x4bf8 0x4bac 0x4b9b 0x4da2 0x4ce2 0x4bf6 0x4bac 0x4b99 0x4da0 0x4cd4 0x4bf0 0x4bac 0x4b98 0x4da5 0x4cac 0x4bdf 0x4ba7 0x4b98 0x4db6 0x4c9a 0x4bc8 0x4b9b 0x4b95 0x4dc5 0x4cb6 0x4bce 0x4b96 0x4b91 0x4db4 0x4cd7 0x4bef 0x4ba3 0x4b93 0x4d83 0x4cd1 0x4c01 0x4bb3 0x4b97 0x4d54 0x4cac 0x4bec 0x4bad 0x4b94 0x4d30 0x4c8a 0x4bd0 0x4b9c 0x4b8a 0x4d0e 0x4c6f 0x4bcf 0x4b98 0x4b87 0x4cf1 0x4c5e 0x4be1 0x4ba6 0x4b8e 0x4cd8 0x4c62 0x4bee 0x4bb3 0x4b97 0x4cc6 0x4c75 0x4bef 0x4bb3 0x4b9d 0x4cbc 0x4c87 0x4bef 0x4bae 0x4ba1 0x4cb4 0x4c93 0x4bed 0x4bad 0x4ba2 0x4cac 0x4c9c 0x4bea 0x4bb4 0x4ba0 0x4ca3 0x4c9d 0x4be9 0x4bba 0x4b9e 0x4c97 0x4c9b 0x4bef 0x4bb7 0x4b9c 0x4c8c 0x4c97 0x4bf5 0x4bb2 0x4b9a 0x4c7f 0x4c91 0x4bf6 0x4bae 0x4b98 0x4c6f 0x4c8a 0x4bf4 0x4ba9 0x4b96 0x4c5d 0x4c84 0x4bf2 0x4ba5 0x4b94 0x4c4a 0x4c7f 0x4bef 0x4ba2 0x4b91 0x4c3a 0x4c7a 0x4bea 0x4ba0 0x4b8e 0x4c2b 0x4c73 0x4be7 0x4b9f 0x4b8a 0x4c1e 0x4c6b 0x4be5 0x4b9e 0x4b86 0x4c17 0x4c65 0x4be2 0x4b9e 0x4b84 0x4c1b 0x4c5f 0x4bde 0x4b9e 0x4b84 0x4c23 0x4c5a 0x4bda 0x4b9d 0x4b86 0x4c39 0x4c56 0x4bd7 0x4b9c 0x4b86 0x4c4f 0x4c53 0x4bd6 0x4b97 0x4b83 0x4c46 0x4c4f 0x4bd4 0x4b93 0x4b81 0x4c28 0x4c4a 0x4bd2 0x4b93 0x4b82 0x4c1b 0x4c3f 0x4bd0 0x4b93 0x4b82 0x4c19 0x4bfb 0x4bcc 0x4b93 0x4b83 0x4bac 0x4bb3 0x4bb6 0x4b90 0x4b7f 0x4b91 0x4b94 0x4ba0 0x4b89 0x4b78 0x4b89 0x4b8c 0x4b9e 0x4b80 0x4b70 0x4b8b 0x4b87 0x4b8e 0x4b7e 0x4b70 0x4b74 0x4b76 0x4b83 0x4b7c 0x4b6d 0x4b78 0x4b75 0x4b98 0x4b87 0x4b7c 0x4bab 0x4b91 0x4b9b 0x4b8b 0x4b83 0x4bda 0x4b96 0x4b9d 0x4b8e 0x4b84 0x4bf2 0x4b94 0x4b99 0x4b92 0x4b87 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c>; + }; + + qcom,pc-temp-z4-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4001 0x3c8d 0x3a72 0x3978 0x397b 0x40ed 0x3c83 0x3a6f 0x39c6 0x39b9 0x40da 0x3c60 0x3a4a 0x39d2 0x39c2 0x4086 0x3c0a 0x3a21 0x39c0 0x39b5 0x4000 0x3ba1 0x39fb 0x39a7 0x399e 0x3f71 0x3b4a 0x39dc 0x3990 0x3986 0x3ef7 0x3b02 0x39c2 0x3981 0x3976 0x3e89 0x3acb 0x39ac 0x3976 0x396c 0x3e16 0x3aa0 0x39a0 0x3970 0x3966 0x3d82 0x3a79 0x399a 0x396d 0x3961 0x3cf4 0x3a50 0x3998 0x396a 0x395d 0x3cc5 0x3a2f 0x3998 0x3965 0x3959 0x3cdb 0x3a29 0x3999 0x395f 0x3951 0x3cf0 0x3a35 0x399d 0x3961 0x394e 0x3cc2 0x3a3c 0x39a2 0x3970 0x395b 0x3c4c 0x3a29 0x39a0 0x397b 0x3968 0x3beb 0x39fe 0x398c 0x396b 0x395e 0x3bb2 0x39dd 0x3979 0x394d 0x3947 0x3b8d 0x39c9 0x3978 0x394f 0x3946 0x3b7e 0x39bd 0x3982 0x3988 0x3974 0x3b75 0x39bc 0x3996 0x39ba 0x39a6 0x3b71 0x39bf 0x39ca 0x39be 0x39ab 0x3b75 0x39c9 0x39fe 0x39b9 0x399f 0x3b7b 0x39fa 0x39fe 0x39ae 0x3991 0x3b80 0x3a38 0x39df 0x3993 0x3982 0x3b85 0x3a46 0x39bf 0x397d 0x3975 0x3b8c 0x3a43 0x39a7 0x3973 0x396c 0x3b92 0x3a3e 0x3994 0x396e 0x3965 0x3b9e 0x3a2f 0x3989 0x3969 0x395f 0x3bab 0x3a18 0x3982 0x3965 0x395a 0x3bb3 0x3a05 0x397d 0x3962 0x3955 0x3bba 0x39f5 0x397b 0x395e 0x3951 0x3bbe 0x39e5 0x397a 0x395a 0x394e 0x3bbc 0x39d6 0x3979 0x395a 0x394d 0x3bb5 0x39c8 0x3979 0x395c 0x3950 0x3ba1 0x39ba 0x3978 0x395e 0x3955 0x3b72 0x39ac 0x3976 0x3961 0x395b 0x3b43 0x39a1 0x3973 0x3963 0x3961 0x3afc 0x399e 0x3970 0x3963 0x3963 0x3abc 0x399c 0x396d 0x3963 0x3960 0x3ab4 0x3999 0x396a 0x3962 0x395d 0x3abb 0x3994 0x3967 0x3960 0x395c 0x3ab9 0x3995 0x3962 0x395d 0x395b 0x3aa3 0x39d0 0x395a 0x3959 0x3958 0x3abd 0x39eb 0x3957 0x394b 0x394c 0x3ac6 0x39f6 0x3953 0x3935 0x3934 0x3acb 0x39f8 0x394d 0x3931 0x392d 0x3ac3 0x39fa 0x3959 0x3929 0x3920 0x3ad0 0x3a03 0x3961 0x3925 0x391e 0x3ac0 0x39ff 0x394e 0x392e 0x392c 0x3a9b 0x39f7 0x3956 0x3935 0x3930 0x3a8e 0x39fe 0x3959 0x3936 0x3935 0x3a94 0x3a0e 0x3963 0x3937 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936>; + }; + + qcom,pc-temp-z5-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2b3c 0x2daa 0x3498 0x4a8d 0x45cc 0x2ef0 0x3052 0x39fb 0x4721 0x484e 0x3117 0x343d 0x3f9f 0x4802 0x4a61 0x31df 0x385f 0x430e 0x4b83 0x4d9f 0x326a 0x3a69 0x44ec 0x4e02 0x5124 0x32f3 0x3bab 0x4673 0x5049 0x55e1 0x33c6 0x3ce5 0x4810 0x514c 0x5936 0x34d0 0x3e95 0x49be 0x511b 0x5a23 0x35db 0x4119 0x4b35 0x5160 0x5a1d 0x36fa 0x4312 0x4c4c 0x5327 0x5b6b 0x3859 0x42b6 0x4bad 0x5424 0x5e2c 0x3a2d 0x3f5c 0x45e6 0x5167 0x6138 0x3c44 0x3ed3 0x3ee4 0x49ed 0x6100 0x3d63 0x47a6 0x4250 0x472f 0x5e7d 0x3d9a 0x506d 0x5049 0x50b3 0x5f98 0x3db5 0x5016 0x57f1 0x5c40 0x639a 0x3dda 0x4c6d 0x532f 0x5d14 0x64bc 0x3dd6 0x4a75 0x4bb9 0x59b9 0x646c 0x3d86 0x49e6 0x55e6 0x5b90 0x6454 0x3cdc 0x49b6 0x76e4 0x6b24 0x646b 0x3bcd 0x5034 0x875d 0x7705 0x6492 0x3ad1 0x649b 0x78a4 0x6a60 0x5e9c 0x3a04 0x7968 0x6282 0x5014 0x511e 0x3939 0x8c1a 0x56c4 0x4873 0x4bc7 0x3846 0x9a39 0x4fd8 0x5026 0x4d8e 0x3716 0x9aa6 0x4dfb 0x5780 0x5074 0x35e9 0x91df 0x53c1 0x5aa0 0x53ba 0x34ed 0x87db 0x5d83 0x5d20 0x57f1 0x33ea 0x7eb5 0x65eb 0x5e8b 0x5cc6 0x32dd 0x764e 0x6eb9 0x601d 0x628a 0x31ca 0x720c 0x75c6 0x61b9 0x67fc 0x30bf 0x6fd5 0x79eb 0x63f1 0x6c9c 0x2ffa 0x6e15 0x7d26 0x6810 0x7085 0x2f5e 0x6c28 0x8068 0x6dc5 0x7165 0x2ed6 0x6a83 0x83d1 0x7653 0x6fdc 0x2e78 0x6a47 0x8529 0x7b5b 0x6e81 0x2ea9 0x6b32 0x8003 0x7adf 0x6f61 0x2f11 0x6ca0 0x7890 0x796f 0x710e 0x303e 0x6e9b 0x7749 0x7672 0x709c 0x317f 0x7119 0x77a9 0x6cad 0x6a94 0x3162 0x71bd 0x77df 0x65cc 0x65f5 0x300b 0x6c45 0x7771 0x66c4 0x66af 0x2fb0 0x60cd 0x7669 0x680b 0x6789 0x3015 0x4018 0x70b0 0x6813 0x6600 0x2ca4 0x3328 0x596b 0x6764 0x62b7 0x2bbe 0x3022 0x477d 0x6688 0x6215 0x2b68 0x2f70 0x4725 0x57da 0x5967 0x2b6c 0x2f09 0x3dd8 0x58e5 0x64be 0x2ab7 0x2db9 0x398d 0x5bd2 0x6460 0x2ae0 0x2ded 0x457f 0x6bcd 0x75c0 0x2cb0 0x2ff3 0x438f 0x6311 0x7110 0x2d80 0x2fa5 0x439f 0x6129 0x668d 0x2d89 0x2ebe 0x3ec3 0x61e3 0x62ca 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005>; + }; + + qcom,pc-temp-z6-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x409a 0x3c2e 0x39dd 0x392f 0x3913 0x416d 0x3c48 0x39ee 0x394b 0x392d 0x419b 0x3c57 0x39ee 0x3952 0x3933 0x4181 0x3c50 0x39e4 0x394f 0x3931 0x413b 0x3c33 0x39d5 0x3947 0x392a 0x40e4 0x3c0c 0x39c7 0x393d 0x3921 0x409c 0x3be5 0x39bb 0x3935 0x391b 0x4062 0x3bcb 0x39b0 0x392e 0x3915 0x4027 0x3bb9 0x39aa 0x392a 0x3910 0x3fe0 0x3ba7 0x39a7 0x3929 0x390e 0x3f9a 0x3b8a 0x39a3 0x3928 0x390c 0x3f73 0x3b64 0x399a 0x3924 0x390b 0x3f65 0x3b56 0x398e 0x391c 0x3906 0x3f55 0x3b62 0x3992 0x3919 0x3903 0x3f1e 0x3b70 0x39a4 0x3927 0x390a 0x3ec0 0x3b64 0x39ac 0x3933 0x3912 0x3e70 0x3b3f 0x3999 0x392a 0x390c 0x3e3a 0x3b22 0x3982 0x3915 0x38fe 0x3e0f 0x3b10 0x3982 0x3914 0x38fc 0x3df2 0x3b06 0x3991 0x3936 0x3915 0x3ddc 0x3b09 0x39a5 0x3953 0x3930 0x3dd2 0x3b19 0x39c1 0x3956 0x3934 0x3dd2 0x3b2e 0x39d7 0x3953 0x3934 0x3dd7 0x3b4e 0x39d6 0x394f 0x3932 0x3ddc 0x3b6d 0x39c9 0x3948 0x392b 0x3de1 0x3b75 0x39be 0x3942 0x3924 0x3de6 0x3b75 0x39b8 0x393d 0x391f 0x3dea 0x3b74 0x39b4 0x3938 0x391c 0x3dee 0x3b6e 0x39b1 0x3935 0x3919 0x3df0 0x3b64 0x39ae 0x3931 0x3916 0x3df0 0x3b5c 0x39ab 0x392e 0x3913 0x3df0 0x3b54 0x39a9 0x392b 0x3910 0x3def 0x3b4c 0x39a8 0x3928 0x390d 0x3ded 0x3b46 0x39a7 0x3928 0x390c 0x3deb 0x3b40 0x39a7 0x3929 0x390c 0x3deb 0x3b3c 0x39a6 0x392a 0x390c 0x3ded 0x3b38 0x39a4 0x392c 0x390f 0x3def 0x3b35 0x39a2 0x392d 0x3913 0x3def 0x3b35 0x39a0 0x392d 0x3914 0x3dee 0x3b36 0x399f 0x392a 0x3912 0x3deb 0x3b36 0x399e 0x3928 0x3910 0x3de2 0x3b35 0x399d 0x3927 0x3910 0x3dd8 0x3b34 0x399b 0x3927 0x390f 0x3dcd 0x3b2c 0x3997 0x3926 0x390f 0x3da1 0x3b16 0x398b 0x391d 0x3908 0x3d94 0x3b10 0x397f 0x3911 0x38f9 0x3d93 0x3b0a 0x397c 0x390a 0x38f2 0x3d8f 0x3b0c 0x3979 0x3906 0x38ec 0x3d8d 0x3b07 0x3977 0x3903 0x38ea 0x3d95 0x3b0c 0x397c 0x390d 0x38f8 0x3da1 0x3b20 0x3983 0x3914 0x38ff 0x3dbd 0x3b30 0x398c 0x3918 0x3902 0x3de0 0x3b45 0x3993 0x391d 0x3906 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d>; + }; + + qcom,pc-temp-y1-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1dae 0x1a6c 0x17b7 0x1540 0x1467 0x143b 0x1db4 0x1a6f 0x17c3 0x153f 0x1466 0x143d 0x1dc0 0x1a74 0x17ca 0x153e 0x1466 0x143e 0x1dcd 0x1a7a 0x17ce 0x153c 0x1466 0x1440 0x1dd8 0x1a7e 0x17d0 0x153b 0x1467 0x1441 0x1ddd 0x1a80 0x17d0 0x153a 0x1467 0x1443 0x1ddc 0x1a80 0x17cc 0x153a 0x1468 0x1443 0x1dda 0x1a80 0x17c6 0x153a 0x146a 0x1444 0x1dd3 0x1a7d 0x17c5 0x153b 0x146c 0x1445 0x1dbc 0x1a76 0x17c8 0x153c 0x146d 0x1446 0x1daa 0x1a70 0x17ca 0x153d 0x146f 0x1448 0x1db3 0x1a6e 0x17c6 0x153d 0x1470 0x1449 0x1dc8 0x1a6f 0x17c0 0x153d 0x1472 0x144b 0x1ddc 0x1a74 0x17c1 0x153e 0x1474 0x144d 0x1df4 0x1a85 0x17d0 0x1545 0x1479 0x1452 0x1e03 0x1a97 0x17db 0x154d 0x147c 0x1454 0x1dfa 0x1aa4 0x17df 0x154f 0x147c 0x1455 0x1de7 0x1aaf 0x17e3 0x1552 0x147d 0x1455 0x1dd8 0x1ab0 0x17e4 0x1554 0x147e 0x1456 0x1dca 0x1aa1 0x17e2 0x1555 0x1480 0x1459 0x1dc3 0x1a95 0x17e2 0x1558 0x1483 0x145c 0x1dd6 0x1a97 0x17ed 0x155c 0x1487 0x1460 0x1df9 0x1a9f 0x17fb 0x1560 0x148b 0x1463 0x1e01 0x1aa5 0x17fd 0x1565 0x148e 0x1467 0x1e00 0x1aa8 0x17f8 0x1569 0x1491 0x146a 0x1e04 0x1aac 0x17f7 0x156d 0x1493 0x146e 0x1e09 0x1ab8 0x1800 0x1571 0x1496 0x1472 0x1e0c 0x1acc 0x180b 0x1576 0x149a 0x1475 0x1e0a 0x1ad7 0x180e 0x157b 0x149d 0x1478 0x1df8 0x1adc 0x1812 0x1581 0x14a0 0x147a 0x1de0 0x1ade 0x1817 0x1586 0x14a3 0x147d 0x1dd9 0x1adb 0x181b 0x158b 0x14a7 0x1480 0x1ddb 0x1ad7 0x181f 0x1590 0x14aa 0x1484 0x1ddd 0x1ad7 0x1820 0x1593 0x14ad 0x1487 0x1de1 0x1ad5 0x1821 0x1596 0x14b0 0x1489 0x1de8 0x1ad3 0x1823 0x1599 0x14b2 0x148b 0x1df7 0x1adf 0x1827 0x159b 0x14b4 0x148c 0x1e0a 0x1aef 0x182c 0x159d 0x14b5 0x148d 0x1e0d 0x1aef 0x1831 0x159e 0x14b5 0x148e 0x1dff 0x1ae3 0x1835 0x159f 0x14b6 0x148e 0x1df5 0x1adf 0x183a 0x15a1 0x14b7 0x148f 0x1df6 0x1ae5 0x1841 0x15a5 0x14b9 0x1491 0x1df6 0x1aeb 0x184c 0x15a8 0x14ba 0x1492 0x1df6 0x1af2 0x1849 0x15aa 0x14bb 0x1493 0x1dfa 0x1af8 0x1850 0x15af 0x14be 0x1495 0x1e04 0x1b0b 0x1850 0x15b1 0x14be 0x1496 0x1e09 0x1b08 0x1859 0x15b4 0x14be 0x1496 0x1e26 0x1b0e 0x1863 0x15b4 0x14be 0x1496 0x1e37 0x1b0b 0x186b 0x15b6 0x14bf 0x1496 0x1e2c 0x1b1e 0x1867 0x15b9 0x14c2 0x1498 0x1e29 0x1b3f 0x1879 0x15c2 0x14c5 0x149b 0x1e38 0x1b5b 0x1895 0x15d1 0x14cc 0x14a0 0x1e61 0x1b5f 0x18a8 0x15e4 0x14d3 0x14a6 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac>; + }; + + qcom,pc-temp-y2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x25d6 0x28a1 0x29b8 0x2b2a 0x2b60 0x2c89 0x2638 0x287f 0x299b 0x2b15 0x2b62 0x2c51 0x2674 0x286a 0x297a 0x2afb 0x2b61 0x2bfc 0x2693 0x285f 0x2959 0x2ade 0x2b5e 0x2ba2 0x269f 0x285b 0x293d 0x2abd 0x2b58 0x2b5a 0x26a2 0x285a 0x292b 0x2a9a 0x2b51 0x2b3c 0x266c 0x2867 0x2922 0x2a6d 0x2b48 0x2b43 0x260b 0x287d 0x291b 0x2a3f 0x2b3b 0x2b4e 0x25f2 0x2878 0x2916 0x2a29 0x2b28 0x2b4d 0x25fe 0x283e 0x2912 0x2a1c 0x2b09 0x2b3a 0x2615 0x2814 0x2910 0x2a13 0x2ae5 0x2b24 0x2698 0x2862 0x291a 0x2a04 0x2ab6 0x2afb 0x2784 0x28ea 0x2933 0x29f0 0x2a85 0x2ac3 0x27ba 0x2909 0x295a 0x29f2 0x2a7a 0x2abc 0x26d8 0x28f6 0x29a8 0x2a1d 0x2a90 0x2af0 0x2601 0x28e9 0x29e0 0x2a53 0x2ab0 0x2b19 0x25e5 0x28ff 0x29fa 0x2a91 0x2aec 0x2b1b 0x25de 0x2924 0x2a0e 0x2ad0 0x2b33 0x2b18 0x25d8 0x292d 0x2a1d 0x2aef 0x2b47 0x2b23 0x25d2 0x292c 0x2a2b 0x2afc 0x2b48 0x2b59 0x25cd 0x2929 0x2a36 0x2b0a 0x2b4a 0x2b9b 0x25ca 0x28f3 0x2a3f 0x2b29 0x2b78 0x2bd9 0x25c8 0x2849 0x2a48 0x2b54 0x2bc0 0x2c13 0x25c6 0x27d1 0x2a4b 0x2b74 0x2be2 0x2c3d 0x25c3 0x275f 0x2a50 0x2b8f 0x2bf6 0x2c5c 0x25c0 0x271c 0x2a54 0x2ba1 0x2c07 0x2c71 0x25bf 0x270e 0x2a52 0x2bac 0x2c19 0x2c83 0x25be 0x2700 0x2a4a 0x2bb0 0x2c2d 0x2c96 0x25bd 0x26ed 0x2a46 0x2ba7 0x2c35 0x2cb5 0x25bc 0x26d4 0x2a44 0x2b8e 0x2c41 0x2cec 0x25bb 0x26b9 0x2a3f 0x2b80 0x2c4d 0x2d11 0x25bb 0x26a1 0x29e9 0x2b83 0x2c40 0x2d02 0x25ba 0x268b 0x294e 0x2b8f 0x2c2f 0x2cda 0x25b9 0x2672 0x290b 0x2b9c 0x2c33 0x2cca 0x25b8 0x2655 0x28fa 0x2b99 0x2c39 0x2cd1 0x25b8 0x263a 0x28ee 0x2b84 0x2c35 0x2cd6 0x25b7 0x2622 0x28e6 0x2b68 0x2c34 0x2cdc 0x25b7 0x2604 0x290b 0x2b59 0x2c39 0x2ce8 0x25b6 0x25ec 0x293c 0x2b5f 0x2c3b 0x2ce7 0x25b6 0x25de 0x291d 0x2b60 0x2c36 0x2cd1 0x25b6 0x25d4 0x28ba 0x2b5f 0x2c32 0x2cc5 0x25b6 0x25cb 0x289c 0x2b62 0x2c34 0x2ccc 0x25b6 0x25c4 0x28a6 0x2b5d 0x2c32 0x2ccf 0x25b5 0x25be 0x281b 0x2b46 0x2c13 0x2cc8 0x25b5 0x25bb 0x27d7 0x2b34 0x2c13 0x2cb0 0x25b5 0x25bb 0x27c4 0x2b11 0x2c20 0x2c82 0x25b5 0x25ba 0x2810 0x2b0d 0x2c0a 0x2c51 0x25b5 0x25b9 0x2851 0x2b23 0x2be8 0x2c48 0x25b5 0x25b8 0x2853 0x2b28 0x2bef 0x2c50 0x25b4 0x25b8 0x2837 0x2ae6 0x2c1e 0x2c3a 0x25b4 0x25b6 0x2800 0x2acc 0x2bf7 0x2bfd 0x25b4 0x25b5 0x27bc 0x2aa1 0x2b7e 0x2ba7 0x25b4 0x25b4 0x2786 0x2a49 0x2b0f 0x2b35 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a>; + }; + + qcom,pc-temp-y3-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x347a 0x3456 0x3421 0x33e5 0x33e0 0x33d8 0x356b 0x345f 0x341a 0x33e4 0x33e0 0x33da 0x35ff 0x346c 0x3416 0x33e3 0x33e0 0x33db 0x364d 0x3479 0x3416 0x33e3 0x33e0 0x33dd 0x366b 0x3484 0x3418 0x33e3 0x33e0 0x33de 0x3670 0x3489 0x341c 0x33e5 0x33e0 0x33de 0x35ec 0x3489 0x3423 0x33e8 0x33e0 0x33de 0x34fc 0x3488 0x342b 0x33ed 0x33e1 0x33de 0x34bb 0x348b 0x342e 0x33ef 0x33e1 0x33de 0x34ba 0x349e 0x342f 0x33f0 0x33e1 0x33dd 0x34bb 0x34ac 0x3430 0x33f0 0x33e1 0x33dd 0x34d3 0x349e 0x343d 0x33f7 0x33e4 0x33df 0x3504 0x3481 0x3450 0x3401 0x33e9 0x33e2 0x3510 0x3471 0x3451 0x3402 0x33ea 0x33e3 0x34ec 0x3468 0x343b 0x33fe 0x33e8 0x33e2 0x34cc 0x3462 0x3427 0x33fb 0x33e6 0x33e2 0x34d0 0x345f 0x3422 0x33fd 0x33e8 0x33e2 0x34e0 0x345d 0x341f 0x3401 0x33ec 0x33e3 0x34e7 0x345a 0x341b 0x3401 0x33ec 0x33e3 0x34e9 0x3455 0x3416 0x33f9 0x33e7 0x33e0 0x34ea 0x344f 0x3411 0x33f0 0x33e3 0x33dd 0x34ec 0x3445 0x340c 0x33e8 0x33e1 0x33dc 0x34f0 0x3435 0x3407 0x33e3 0x33e0 0x33db 0x34f5 0x3427 0x3406 0x33e2 0x33df 0x33db 0x3500 0x341c 0x3405 0x33e3 0x33de 0x33db 0x3512 0x3417 0x3405 0x33e4 0x33de 0x33da 0x3525 0x3418 0x3405 0x33e3 0x33de 0x33da 0x3539 0x341b 0x3405 0x33e3 0x33dd 0x33da 0x354f 0x341f 0x3405 0x33e5 0x33dd 0x33da 0x356b 0x3423 0x3405 0x33e9 0x33dd 0x33d9 0x358d 0x3428 0x3405 0x33ec 0x33dd 0x33d9 0x35b2 0x342d 0x3400 0x33ed 0x33de 0x33d9 0x35da 0x3434 0x33f9 0x33ec 0x33de 0x33da 0x360a 0x343c 0x33f6 0x33ec 0x33df 0x33da 0x3641 0x3449 0x33f7 0x33ea 0x33de 0x33da 0x3680 0x3458 0x33f8 0x33e8 0x33de 0x33d9 0x36c1 0x3468 0x33fb 0x33e6 0x33de 0x33d9 0x3702 0x347a 0x3402 0x33e4 0x33dd 0x33d9 0x3742 0x3490 0x3408 0x33e3 0x33dd 0x33d9 0x3781 0x34b0 0x340c 0x33e3 0x33dd 0x33d9 0x37c1 0x34dc 0x340f 0x33e3 0x33dd 0x33d9 0x3803 0x3511 0x3415 0x33e3 0x33de 0x33da 0x3845 0x3550 0x341e 0x33e3 0x33de 0x33da 0x3892 0x35a3 0x3421 0x33e4 0x33de 0x33da 0x38ea 0x3613 0x3429 0x33e3 0x33de 0x33da 0x390d 0x3642 0x3430 0x33eb 0x33df 0x33dc 0x393f 0x363e 0x3435 0x33ec 0x33e1 0x33dd 0x395c 0x3658 0x3442 0x33f0 0x33e3 0x33e0 0x398d 0x36b9 0x3451 0x33f2 0x33e2 0x33e0 0x3a0b 0x3718 0x3452 0x33ee 0x33e1 0x33dd 0x3a97 0x37a6 0x345a 0x33f0 0x33e0 0x33dd 0x3b31 0x3888 0x346f 0x33f5 0x33e3 0x33e1 0x3c10 0x3978 0x3492 0x33f9 0x33e6 0x33e4 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6>; + }; + + qcom,pc-temp-y4-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x45b5 0x41d2 0x40f2 0x406d 0x4045 0x4044 0x452b 0x41db 0x40ef 0x4073 0x4045 0x4042 0x44eb 0x41eb 0x40ef 0x4078 0x4047 0x4041 0x44e9 0x4200 0x40f2 0x407b 0x4048 0x4040 0x4515 0x421b 0x40f7 0x407d 0x404a 0x4040 0x4561 0x4239 0x40fe 0x407e 0x404b 0x4040 0x4627 0x4263 0x4106 0x407c 0x404d 0x4041 0x478b 0x428e 0x4111 0x407a 0x404e 0x4044 0x4914 0x42a4 0x411c 0x407a 0x4051 0x4046 0x4b24 0x42ad 0x4127 0x4081 0x4055 0x4049 0x4c74 0x42bc 0x4138 0x408c 0x405b 0x404d 0x4a3e 0x4407 0x419f 0x409e 0x4069 0x4059 0x4560 0x4626 0x4237 0x40b4 0x407d 0x4068 0x437a 0x4642 0x4251 0x40bd 0x4081 0x406c 0x4347 0x43a8 0x4203 0x40bf 0x407d 0x406b 0x432d 0x41b1 0x41aa 0x40c3 0x407b 0x406a 0x4320 0x41b5 0x416e 0x40ec 0x4091 0x407a 0x430d 0x41e2 0x413b 0x4129 0x40ba 0x4098 0x42ef 0x41ed 0x4117 0x412a 0x40c0 0x409d 0x42b4 0x41c5 0x40fa 0x40d1 0x4094 0x407d 0x4274 0x4198 0x40e3 0x4085 0x4066 0x405b 0x4249 0x4180 0x40d4 0x4078 0x4054 0x404d 0x4228 0x416e 0x40c8 0x4072 0x4049 0x4043 0x421f 0x416b 0x40c2 0x406f 0x4048 0x4042 0x4223 0x415f 0x40be 0x406b 0x4048 0x4042 0x422b 0x414f 0x40bb 0x4069 0x4049 0x4043 0x4231 0x4143 0x40ba 0x406b 0x404b 0x4045 0x423b 0x4137 0x40ba 0x406d 0x404e 0x4048 0x4246 0x4136 0x40b9 0x406e 0x4051 0x404c 0x4252 0x4142 0x40b4 0x4070 0x4057 0x4051 0x425e 0x4154 0x40b0 0x4072 0x405e 0x4058 0x426a 0x4167 0x40b4 0x4074 0x4068 0x4063 0x4276 0x417f 0x40bd 0x4076 0x4073 0x4070 0x4283 0x4198 0x40c4 0x4074 0x4075 0x4072 0x4290 0x41b2 0x40c9 0x4069 0x4064 0x4061 0x429c 0x41cd 0x40cd 0x405e 0x404f 0x404c 0x42a8 0x41ef 0x40d2 0x405b 0x4044 0x4043 0x42b5 0x421f 0x40d8 0x4059 0x403e 0x403f 0x42c7 0x4244 0x40dc 0x405a 0x403e 0x4040 0x42e1 0x4252 0x40e9 0x405d 0x4042 0x4045 0x4308 0x425c 0x40fd 0x4060 0x4047 0x404a 0x433b 0x4262 0x410c 0x4063 0x4048 0x404b 0x437e 0x4270 0x4118 0x4064 0x4046 0x4048 0x43d3 0x4287 0x4129 0x4061 0x403d 0x403b 0x442a 0x42c2 0x4147 0x406b 0x4041 0x403e 0x441b 0x42ef 0x4160 0x4075 0x4057 0x405a 0x441e 0x4307 0x4166 0x4084 0x4070 0x4078 0x43ed 0x432a 0x4193 0x40a2 0x4099 0x40a2 0x43d0 0x436e 0x41e6 0x40be 0x409c 0x4098 0x43e5 0x4383 0x41de 0x409e 0x406e 0x4064 0x43f6 0x4384 0x41d8 0x409e 0x4060 0x4059 0x4411 0x43a0 0x41fb 0x40bd 0x4070 0x4067 0x4463 0x43f1 0x4266 0x40fb 0x4090 0x4085 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118>; + }; + + qcom,pc-temp-y5-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2208 0x348a 0x3ab0 0x3545 0x4573 0x3634 0x2208 0x34aa 0x3839 0x3326 0x4393 0x3e82 0x269f 0x34e2 0x3660 0x31db 0x419b 0x43da 0x2f8b 0x3522 0x3519 0x3130 0x3fbf 0x46e0 0x3428 0x3557 0x345a 0x30f0 0x3e34 0x4838 0x3590 0x3572 0x341a 0x30e7 0x3d2f 0x4884 0x30ee 0x3576 0x34b3 0x32d3 0x3ca4 0x46c7 0x2869 0x3578 0x35a4 0x35e5 0x3c3f 0x4385 0x267f 0x34b6 0x35c2 0x3648 0x3b81 0x4119 0x2a54 0x3032 0x3545 0x34d0 0x3996 0x3e92 0x2ff6 0x2cf8 0x3494 0x33cf 0x387f 0x3ce5 0x37e1 0x2fd6 0x333d 0x3525 0x3964 0x3cfd 0x4112 0x360e 0x319c 0x3768 0x3acb 0x3dbd 0x4280 0x3a64 0x326c 0x37dc 0x3b0d 0x3dbf 0x373b 0x3dd4 0x395e 0x3745 0x3a7a 0x3cb2 0x2cf9 0x3f72 0x3eca 0x36d1 0x3a41 0x3bb0 0x2d03 0x3ec5 0x3f83 0x384b 0x3ae8 0x3b5d 0x2edc 0x3dc2 0x3fc3 0x3b9d 0x3c38 0x3b2b 0x2f8c 0x3d9a 0x3f92 0x3dc7 0x3e57 0x3b93 0x2f1e 0x3df3 0x3ecf 0x3f34 0x4225 0x3e9f 0x2e5c 0x3e54 0x3de6 0x3fc8 0x445b 0x4233 0x2d64 0x3c6d 0x3c08 0x3c17 0x4527 0x44e0 0x2c30 0x3697 0x3971 0x3578 0x4604 0x471b 0x2b6b 0x3248 0x38a0 0x33d2 0x4627 0x47ff 0x2b06 0x2f1a 0x38d8 0x353a 0x4512 0x484d 0x2ad4 0x2d6f 0x3925 0x3660 0x43d2 0x484f 0x2add 0x2d4c 0x3975 0x3678 0x4315 0x4790 0x2aec 0x2d55 0x39cc 0x366c 0x4294 0x45bc 0x2af3 0x2d44 0x3a34 0x38ed 0x427b 0x43ff 0x2b16 0x2d12 0x3b09 0x40ee 0x4270 0x426f 0x2b4e 0x2d07 0x3ba6 0x465a 0x4280 0x41aa 0x2b80 0x2d07 0x38cb 0x47e5 0x43ef 0x42bb 0x2ba9 0x2cec 0x3382 0x48db 0x472c 0x45f6 0x2bd0 0x2ce9 0x319e 0x48b8 0x4a98 0x495f 0x2bf8 0x2d41 0x31a4 0x45bb 0x4e8c 0x4c69 0x2c20 0x2daa 0x31b5 0x4185 0x51da 0x4ea9 0x2c45 0x2dd9 0x3221 0x3e14 0x52fb 0x508e 0x2c64 0x2d8a 0x34af 0x3aee 0x5257 0x524a 0x2c6c 0x2d32 0x3713 0x3918 0x50bc 0x5292 0x2c5a 0x2d52 0x36de 0x38bf 0x4e90 0x50e7 0x2c45 0x2d99 0x34f7 0x3913 0x4dbc 0x4f8f 0x2c53 0x2da9 0x354f 0x3906 0x4ea8 0x5136 0x2cb7 0x2d71 0x370b 0x3898 0x515e 0x56c7 0x2d6c 0x2d2c 0x33cd 0x3962 0x555b 0x5c52 0x2e6e 0x2cc8 0x325a 0x3610 0x4cc2 0x4ea4 0x2fc4 0x2d10 0x320a 0x3e49 0x4394 0x4373 0x30b0 0x2d1b 0x3431 0x3e08 0x42cc 0x40b6 0x322c 0x2e86 0x370e 0x4092 0x40be 0x3f21 0x3256 0x3099 0x3915 0x3fe1 0x3e27 0x3e5b 0x322c 0x3127 0x38b1 0x3e5f 0x428d 0x410e 0x3117 0x3039 0x38e1 0x4283 0x4414 0x4431 0x2f77 0x2f18 0x37f8 0x4528 0x4741 0x4a06 0x2e6f 0x2e5e 0x37ca 0x4396 0x477b 0x4ab1 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b>; + }; + + qcom,pc-temp-y6-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1af4 0x1607 0x1492 0x13c9 0x139d 0x1392 0x1afb 0x160e 0x148d 0x13c8 0x139d 0x1393 0x1aff 0x1616 0x148a 0x13c7 0x139d 0x1394 0x1aff 0x161e 0x148a 0x13c8 0x139d 0x1395 0x1afc 0x1626 0x148c 0x13c9 0x139e 0x1395 0x1af7 0x162e 0x148e 0x13ca 0x139f 0x1396 0x1ac7 0x1636 0x1494 0x13cc 0x139f 0x1397 0x1a78 0x163e 0x149c 0x13cf 0x13a1 0x1397 0x1a74 0x1646 0x14a1 0x13d2 0x13a2 0x1398 0x1aff 0x164c 0x14a3 0x13d4 0x13a3 0x1399 0x1b70 0x1657 0x14a8 0x13d7 0x13a5 0x139a 0x1af4 0x16ac 0x14cc 0x13e2 0x13ac 0x139f 0x19d3 0x172c 0x1503 0x13ef 0x13b5 0x13a6 0x1941 0x172c 0x150b 0x13f2 0x13b7 0x13a8 0x190e 0x1670 0x14e5 0x13f1 0x13b5 0x13a7 0x18f6 0x15e2 0x14be 0x13f0 0x13b3 0x13a7 0x18fb 0x15e4 0x14ab 0x13fd 0x13bb 0x13ac 0x1909 0x15f5 0x149c 0x1412 0x13c9 0x13b5 0x190d 0x15f9 0x148f 0x1412 0x13cb 0x13b7 0x190c 0x15ed 0x1483 0x13f3 0x13bb 0x13ab 0x190a 0x15e0 0x147a 0x13d6 0x13ab 0x139f 0x190d 0x15d6 0x1473 0x13cd 0x13a4 0x139a 0x191a 0x15ce 0x146e 0x13c8 0x13a1 0x1397 0x192c 0x15c9 0x146d 0x13c7 0x13a0 0x1397 0x1945 0x15c7 0x146e 0x13c7 0x13a0 0x1397 0x1964 0x15c6 0x146f 0x13c8 0x13a0 0x1398 0x1982 0x15cb 0x1470 0x13c9 0x13a1 0x1398 0x19a0 0x15d5 0x1473 0x13ca 0x13a2 0x1399 0x19c0 0x15e2 0x1475 0x13cc 0x13a3 0x139a 0x19e6 0x15f3 0x1476 0x13d0 0x13a5 0x139c 0x1a11 0x1607 0x1477 0x13d4 0x13a7 0x139e 0x1a3f 0x161d 0x1478 0x13d6 0x13ab 0x13a2 0x1a72 0x1638 0x1479 0x13d7 0x13af 0x13a6 0x1aa7 0x1655 0x147b 0x13d6 0x13b0 0x13a7 0x1ae0 0x1676 0x147f 0x13d2 0x13ab 0x13a2 0x1b1c 0x169b 0x1483 0x13ce 0x13a5 0x139c 0x1b59 0x16c6 0x1488 0x13cc 0x13a2 0x139a 0x1b96 0x16f8 0x1490 0x13cb 0x13a0 0x1398 0x1bd4 0x1732 0x149a 0x13ca 0x13a0 0x1399 0x1c13 0x1772 0x14a5 0x13cb 0x13a1 0x139a 0x1c51 0x17bc 0x14b0 0x13cd 0x13a3 0x139c 0x1c90 0x1811 0x14bf 0x13ce 0x13a4 0x139d 0x1cd3 0x1875 0x14d0 0x13cf 0x13a3 0x139c 0x1d22 0x18ef 0x14e0 0x13d0 0x13a1 0x1399 0x1d80 0x1984 0x14f9 0x13d2 0x13a3 0x139a 0x1da5 0x19b9 0x150c 0x13db 0x13a9 0x13a3 0x1dcf 0x19c4 0x1513 0x13e1 0x13b2 0x13ad 0x1dde 0x19e7 0x152f 0x13ec 0x13bf 0x13bb 0x1e04 0x1a57 0x155a 0x13f6 0x13c0 0x13b8 0x1e6d 0x1abf 0x1560 0x13eb 0x13b2 0x13a7 0x1edf 0x1b41 0x1573 0x13ee 0x13ae 0x13a5 0x1f66 0x1c0d 0x15ab 0x13fd 0x13b6 0x13ac 0x2034 0x1cdf 0x160e 0x1415 0x13c2 0x13b7 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4>; + }; + }; + }; + }; + }; + + fragment@12 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm1 { + reg = <0x4f>; + label = "pa_therm1"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@13 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x4d 0xffffffff 0x4e 0xffffffff 0x4f 0xffffffff 0x52>; + + pa_therm1 { + reg = <0x4f>; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + }; + }; + }; + + fragment@14 { + target = <0xffffffff>; + + __overlay__ { + compatible = "qcom,ufs-phy-qmp-v3"; + vdda-phy-supply = <0xffffffff>; + vdda-pll-supply = <0xffffffff>; + vdda-phy-max-microamp = <0xf5b4>; + vdda-pll-max-microamp = <0x477c>; + status = "ok"; + }; + }; + + fragment@15 { + target = <0xffffffff>; + + __overlay__ { + vdd-hba-supply = <0xffffffff>; + vdd-hba-fixed-regulator; + vcc-supply = <0xffffffff>; + vcc-voltage-level = <0x2d2a80 0x2d2a80>; + vcc-max-microamp = <0x927c0>; + vccq2-supply = <0xffffffff>; + vccq2-voltage-level = <0x1ab3f0 0x1dc130>; + vccq2-max-microamp = <0x927c0>; + qcom,vddp-ref-clk-supply = <0xffffffff>; + qcom,vddp-ref-clk-max-microamp = <0x64>; + status = "ok"; + }; + }; + + fragment@16 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0x8b290>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <0x1b7740 0x1b7740>; + qcom,vdd-io-current-level = <0x0 0x4f588>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + status = "ok"; + }; + }; + + fragment@17 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0xc3500>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-voltage-level = <0x1b7740 0x2d0370>; + qcom,vdd-io-current-level = <0x0 0x55f0>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + cd-gpios = <0xffffffff 0x45 0x1>; + status = "ok"; + }; + }; + + fragment@18 { + target = <0xffffffff>; + + __overlay__ { + + pa-therm1 { + polling-delay-passive = <0x0>; + polling-delay = <0x0>; + thermal-governor = "user_space"; + thermal-sensors = <0xffffffff 0x4f>; + wake-capable-sensor; + + trips { + + active-config0 { + temperature = <0x1e848>; + hysteresis = <0x3e8>; + type = "passive"; + }; + }; + }; + + quiet-therm-step { + status = "disabled"; + }; + }; + }; + + fragment@19 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@20 { + target = <0xffffffff>; + + __overlay__ { + qcom,battery-data = <0x14>; + qcom,qg-iterm-ma = <0x64>; + qcom,hold-soc-while-full; + qcom,linearize-soc; + qcom,cl-feedback-on; + }; + }; + + fragment@21 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x8 0xffffffff 0x7 0xffffffff 0x9 0xffffffff 0x6 0xffffffff 0x4f 0xffffffff 0x99 0xffffffff 0x83>; + io-channel-names = "usb_in_voltage", "usb_in_current", "chg_temp", "die_temp", "conn_temp", "sbux_res", "vph_voltage"; + qcom,battery-data = <0x14>; + qcom,auto-recharge-soc = <0x62>; + qcom,step-charging-enable; + qcom,sw-jeita-enable; + qcom,fcc-stepping-enable; + qcom,suspend-input-on-debug-batt; + qcom,sec-charger-config = <0x3>; + qcom,thermal-mitigation = <0x401640 0x3567e0 0x2dc6c0 0x2625a0 0x1e8480 0x16e360 0xf4240 0x7a120>; + dpdm-supply = <0xffffffff>; + qcom,charger-temp-max = <0x320>; + qcom,smb-temp-max = <0x320>; + qcom,fcc-step-delay-ms = <0x64>; + qcom,fcc-step-size-ua = <0x186a0>; + qcom,disable-sw-thermal-regulation; + qcom,disable-fcc-restriction; + qcom,smb-internal-pull-kohm = <0x0>; + }; + }; + + fragment@22 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + }; + }; + }; + + fragment@23 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@24 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,i2c-touch-active = "synaptics,tcm-i2c"; + + synaptics_tcm@20 { + compatible = "synaptics,tcm-i2c"; + reg = <0x20>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend", "pmx_ts_release"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + pinctrl-2 = <0xffffffff>; + vdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + synaptics,pwr-reg-name = "avdd"; + synaptics,bus-reg-name = "vdd"; + synaptics,irq-gpio = <0xffffffff 0x9 0x2008>; + synaptics,irq-on-state = <0x0>; + synaptics,reset-gpio = <0xffffffff 0x8 0x0>; + synaptics,reset-on-state = <0x0>; + synaptics,reset-active-ms = <0x14>; + synaptics,reset-delay-ms = <0xc8>; + synaptics,power-delay-ms = <0xc8>; + synaptics,ubl-i2c-addr = <0x20>; + }; + + atmel_mxt_ts@4a { + compatible = "atmel,maxtouch"; + reg = <0x4a>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + avdd-supply = <0xffffffff>; + vdd-supply = <0xffffffff>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + reset-gpios = <0xffffffff 0x8 0x0>; + irq-gpios = <0xffffffff 0x9 0x2008>; + atmel,xy_switch; + atmel,panel-coords = <0x0 0x0 0x1df 0x31f>; + atmel,display-coords = <0x0 0x0 0x153 0x301>; + }; + }; + }; + + fragment@25 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,clk-freq-out = <0xf4240>; + #address-cells = <0x1>; + #size-cells = <0x0>; + + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <0xffffffff 0x25 0x0>; + qcom,nq-ven = <0xffffffff 0xc 0x0>; + qcom,nq-firm = <0xffffffff 0x24 0x0>; + qcom,nq-clkreq = <0xffffffff 0x1f 0x0>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff>; + }; + }; + }; + + fragment@26 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-aux-switch = <0xffffffff>; + }; + }; + + fragment@27 { + target = <0xffffffff>; + + __overlay__ { + + lpi_pinctrl@627C0000 { + compatible = "qcom,lpi-pinctrl"; + reg = <0x627c0000 0x0>; + qcom,num-gpios = <0xf>; + gpio-controller; + #gpio-cells = <0x2>; + qcom,slew-reg = <0x6295a000 0x0>; + qcom,lpi-offset-tbl = <0x0 0x1000 0x2000 0x3000 0x4000 0x5000 0x6000 0x7000 0x8000 0x9000 0xa000 0xb000 0xc000 0xd000 0xe000>; + qcom,lpi-slew-offset-tbl = <0x0 0x2 0x4 0x8 0xa 0xc 0x0 0x0 0x0 0x0 0x10 0x12 0x0 0x0 0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + phandle = <0x32>; + + dmic01_clk_active { + phandle = <0x33>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic01_clk_sleep { + phandle = <0x35>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic01_data_active { + phandle = <0x34>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic01_data_sleep { + phandle = <0x36>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic23_clk_active { + phandle = <0x37>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic23_clk_sleep { + phandle = <0x39>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic23_data_active { + phandle = <0x38>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic23_data_sleep { + phandle = <0x3a>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic45_clk_active { + phandle = <0x3b>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic45_clk_sleep { + phandle = <0x3d>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic45_data_active { + phandle = <0x3c>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic45_data_sleep { + phandle = <0x3e>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + tx_swr_clk_sleep { + phandle = <0x4b>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_clk_active { + phandle = <0x47>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + tx_swr_data0_sleep { + phandle = <0x4c>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data0_active { + phandle = <0x48>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_sleep { + phandle = <0x41>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_active { + phandle = <0x3f>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_data_sleep { + phandle = <0x42>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_data_active { + phandle = <0x40>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data1_sleep { + phandle = <0x4d>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data1_active { + phandle = <0x49>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data2_sleep { + phandle = <0x4e>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data2_active { + phandle = <0x4a>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + rx_swr_clk_sleep { + phandle = <0x45>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_clk_active { + phandle = <0x43>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + rx_swr_data_sleep { + phandle = <0x46>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_data_active { + phandle = <0x44>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + lpi_i2s1_sck_active { + phandle = <0x55>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sck_sleep { + phandle = <0x59>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_ws_active { + phandle = <0x56>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_ws_sleep { + phandle = <0x5a>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd0_active { + phandle = <0x57>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd0_sleep { + phandle = <0x5b>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd1_active { + phandle = <0x58>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd1_sleep { + phandle = <0x5c>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + }; + + fragment@28 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x4>; + + bolero-clk-rsc-mngr { + compatible = "qcom,bolero-clk-rsc-mngr"; + qcom,fs-gen-sequence = <0x3000 0x1 0x3004 0x1 0x3080 0x2>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,va_mclk_mode_muxsel = <0x627a0000>; + clock-names = "tx_core_clk", "tx_npl_clk", "rx_core_clk", "rx_npl_clk", "wsa_core_clk", "wsa_npl_clk", "va_core_clk", "va_npl_clk"; + clocks = <0x15 0x0 0x16 0x0 0x17 0x0 0x18 0x0 0x19 0x0 0x1a 0x0 0x1b 0x0 0x1c 0x0>; + }; + + tx-macro@62620000 { + compatible = "qcom,tx-macro"; + reg = <0x62620000 0x0>; + clock-names = "tx_core_clk", "tx_npl_clk"; + clocks = <0x15 0x0 0x16 0x0>; + qcom,tx-swr-gpios = <0x1d>; + qcom,tx-dmic-sample-rate = <0x249f00>; + phandle = <0xb2>; + + tx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x3>; + swrm-io-base = <0x62630000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x1>; + interrupts = <0x0 0x128 0x0 0x0 0x22b 0x0>; + interrupt-names = "swr_master_irq", "swr_wake_irq"; + qcom,swr-wakeup-required = <0x0>; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x21 0xf 0x2 0x12 0x1 0x2 0x13 0x2 0x3 0x14 0x1 0x3 0x15 0x2 0x4 0x16 0x1 0x4 0x17 0x2 0x4 0x18 0x4 0x4 0x19 0x8 0x5 0x1a 0x1 0x5 0x1b 0x2 0x5 0x1c 0x4 0x5 0x1d 0x8>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + qcom,swr-mstr-irq-wakeup-capable = <0x1>; + phandle = <0xb3>; + + wcd938x-tx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170223>; + phandle = <0x24>; + }; + + wcd937x-tx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170223>; + phandle = <0x28>; + }; + }; + }; + + rx-macro@62600000 { + compatible = "qcom,rx-macro"; + reg = <0x62600000 0x0>; + clock-names = "rx_core_clk", "rx_npl_clk"; + clocks = <0x17 0x0 0x18 0x0>; + qcom,rx-swr-gpios = <0x1e>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,rx-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + phandle = <0xb4>; + + rx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x2>; + swrm-io-base = <0x62610000 0x0>; + interrupts = <0x0 0x129 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x9 0x1 0x1 0xa 0x2 0x2 0xd 0x1 0x3 0xb 0x1 0x3 0xc 0x2 0x4 0xe 0x1 0x5 0xf 0x1 0x5 0x10 0x2>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + phandle = <0xb5>; + + wcd938x-rx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170224>; + phandle = <0x23>; + }; + + wcd937x-rx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170224>; + phandle = <0x27>; + }; + }; + }; + + wsa-macro@62640000 { + compatible = "qcom,wsa-macro"; + reg = <0x62640000 0x0>; + clock-names = "wsa_core_clk", "wsa_npl_clk"; + clocks = <0x19 0x0 0x1a 0x0>; + qcom,wsa-swr-gpios = <0x1f>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,wsa-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + status = "disabled"; + phandle = <0xb6>; + + wsa_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + qcom,swr_master_id = <0x1>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + swrm-io-base = <0x62650000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x0>; + interrupts = <0x0 0x127 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x8>; + qcom,swr-port-mapping = <0x1 0x1 0x1 0x2 0x3 0xf 0x3 0x2 0x3 0x4 0x5 0x1 0x5 0x7 0xf 0x6 0x6 0x3 0x7 0x4 0x3 0x8 0x8 0x3>; + qcom,swr-num-dev = <0x2>; + phandle = <0xb7>; + + wsa881x@20170211 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170211>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2d>; + }; + + wsa881x@20170212 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170212>; + qcom,spkr-sd-n-node = <0x21>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2e>; + }; + + wsa881x@21170213 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170213>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2f>; + }; + + wsa881x@21170214 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170214>; + qcom,spkr-sd-n-node = <0x21>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x30>; + }; + }; + }; + + va-macro@62770000 { + compatible = "qcom,va-macro"; + reg = <0x62770000 0x0>; + clock-names = "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0>; + qcom,va-clk-mux-select = <0x1>; + qcom,va-island-mode-muxsel = <0x627a0000>; + qcom,va-dmic-sample-rate = <0x927c0>; + qcom,default-clk-id = <0x0>; + phandle = <0xb8>; + }; + + wcd938x-codec { + compatible = "qcom,wcd938x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x0 0x13 0x2 0x0 0x13 0x1 0x14 0x1 0x0 0x14 0x1 0x15 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x2 0x18 0x4 0x0 0x18 0x2 0x19 0x8 0x0 0x19 0x3 0x1a 0x1 0x0 0x1a 0x3 0x1b 0x2 0x0 0x1b 0x3 0x1c 0x4 0x0 0x1c 0x3 0x1d 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x22>; + qcom,rx-slave = <0x23>; + qcom,tx-slave = <0x24>; + cdc-vdd-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-rxtx-current = <0x7530>; + cdc-vddio-supply = <0xffffffff>; + qcom,cdc-vddio-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddio-current = <0x7530>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0xaf0>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-micbias4-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-rxtx", "cdc-vddio", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + mbhc-button-thres = <0x25 0xd 0x3f 0x25 0x58 0x8a 0x25 0x8a 0x8a 0x25 0xe1 0xe1 0x25 0x1c2 0x1c2 0x25 0x1c2 0x26c 0x25 0x1c2 0x26c 0x25 0x1c2 0x26c>; + imp-table = <0x26 0x0 0x5 0x6 0x26 0x6 0x17 0x8 0x26 0x18 0x26 0x7 0x26 0x27 0x64 0x6 0x26 0x65 0xa0 0xa 0x26 0xa1 0x190 0xb 0x26 0x191 0x7d0 0xb 0x26 0x7d1 0x7fffffff 0x6>; + phandle = <0x31>; + }; + + wcd937x-codec { + status = "disabled"; + compatible = "qcom,wcd937x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x1 0x13 0x1 0x0 0x14 0x1 0x14 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x3 0x18 0x1 0x0 0x1a 0x3 0x19 0x2 0x0 0x1b 0x3 0x1a 0x4 0x0 0x1c 0x3 0x1b 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x22>; + qcom,rx-slave = <0x27>; + qcom,tx-slave = <0x28>; + cdc-vdd-ldo-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-ldo-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-ldo-rxtx-current = <0x61a8>; + cdc-vddpx-1-supply = <0xffffffff>; + qcom,cdc-vddpx-1-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddpx-1-current = <0x2710>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0x708>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-ldo-rxtx", "cdc-vddpx-1", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + phandle = <0xb9>; + }; + }; + }; + + fragment@29 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,msm-mi2s-master = <0x1 0x1 0x1 0x1 0x1 0x1>; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS4", "MIC BIAS4", "Analog Mic4", "TX DMIC0", "MIC BIAS1", "MIC BIAS1", "Digital Mic0", "TX DMIC1", "MIC BIAS1", "MIC BIAS1", "Digital Mic1", "TX DMIC2", "MIC BIAS3", "MIC BIAS3", "Digital Mic2", "TX DMIC3", "MIC BIAS3", "MIC BIAS3", "Digital Mic3", "TX DMIC4", "MIC BIAS4", "MIC BIAS4", "Digital Mic4", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "IN3_AUX", "AUX_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "TX SWR_DMIC0", "DMIC1_OUTPUT", "TX SWR_DMIC1", "DMIC2_OUTPUT", "TX SWR_DMIC2", "DMIC3_OUTPUT", "TX SWR_DMIC3", "DMIC4_OUTPUT", "TX SWR_DMIC4", "DMIC5_OUTPUT", "TX SWR_DMIC5", "DMIC6_OUTPUT", "TX SWR_DMIC6", "DMIC7_OUTPUT", "TX SWR_DMIC7", "DMIC8_OUTPUT", "WSA SRC0_INP", "SRC0", "WSA_TX DEC0_INP", "TX DEC0 MUX", "WSA_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "SpkrLeft IN", "WSA_SPK1 OUT", "SpkrRight IN", "WSA_SPK2 OUT", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA MIC BIAS1", "Digital Mic0", "VA MIC BIAS1", "Digital Mic1", "VA MIC BIAS3", "Digital Mic2", "VA MIC BIAS3", "Digital Mic3", "VA MIC BIAS4", "Digital Mic4", "VA DMIC0", "VA MIC BIAS1", "VA DMIC1", "VA MIC BIAS1", "VA DMIC2", "VA MIC BIAS3", "VA DMIC3", "VA MIC BIAS3", "VA DMIC4", "VA MIC BIAS4", "VA SWR_ADC0", "VA_SWR_CLK", "VA SWR_ADC1", "VA_SWR_CLK", "VA SWR_ADC2", "VA_SWR_CLK", "VA SWR_ADC3", "VA_SWR_CLK", "VA SWR_MIC0", "VA_SWR_CLK", "VA SWR_MIC1", "VA_SWR_CLK", "VA SWR_MIC2", "VA_SWR_CLK", "VA SWR_MIC3", "VA_SWR_CLK", "VA SWR_MIC4", "VA_SWR_CLK", "VA SWR_MIC5", "VA_SWR_CLK", "VA SWR_MIC6", "VA_SWR_CLK", "VA SWR_MIC7", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT", "VA SWR_MIC0", "DMIC1_OUTPUT", "VA SWR_MIC1", "DMIC2_OUTPUT", "VA SWR_MIC2", "DMIC3_OUTPUT", "VA SWR_MIC3", "DMIC4_OUTPUT", "VA SWR_MIC4", "DMIC5_OUTPUT", "VA SWR_MIC5", "DMIC6_OUTPUT", "VA SWR_MIC6", "DMIC7_OUTPUT", "VA SWR_MIC7", "DMIC8_OUTPUT"; + qcom,msm-mbhc-hphl-swh = <0x1>; + qcom,msm-mbhc-gnd-swh = <0x1>; + qcom,cdc-dmic01-gpios = <0x29>; + qcom,cdc-dmic23-gpios = <0x2a>; + qcom,cdc-dmic45-gpios = <0x2b>; + asoc-codec = <0xffffffff 0xffffffff 0x2c>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec", "msm-ext-disp-audio-codec-rx"; + qcom,wsa-max-devs = <0x2>; + qcom,wsa-devs = <0x2d 0x2e 0x2f 0x30>; + qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight", "SpkrLeft", "SpkrRight"; + qcom,codec-max-aux-devs = <0x1>; + qcom,codec-aux-devs = <0x31>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x32 0xffffffff>; + }; + }; + + fragment@30 { + target = <0xffffffff>; + + __overlay__ { + + cdc_dmic01_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x33 0x34>; + pinctrl-1 = <0x35 0x36>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x29>; + }; + + cdc_dmic23_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x37 0x38>; + pinctrl-1 = <0x39 0x3a>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2a>; + }; + + cdc_dmic45_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3b 0x3c>; + pinctrl-1 = <0x3d 0x3e>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2b>; + }; + + wsa_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3f 0x40>; + pinctrl-1 = <0x41 0x42>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x1f>; + }; + + rx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x43 0x44>; + pinctrl-1 = <0x45 0x46>; + qcom,lpi-gpios; + phandle = <0x1e>; + }; + + tx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x47 0x48 0x49 0x4a>; + pinctrl-1 = <0x4b 0x4c 0x4d 0x4e>; + qcom,lpi-gpios; + qcom,chip-wakeup-reg = <0x1ffb000>; + qcom,chip-wakeup-maskbit = <0x0>; + qcom,chip-wakeup-default-val = <0x1>; + phandle = <0x1d>; + }; + }; + }; + + fragment@31 { + target = <0xffffffff>; + + __overlay__ { + + wsa_spkr_en1_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x20>; + }; + + wsa_spkr_en2_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x21>; + }; + + msm_cdc_pinctrl@58 { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + phandle = <0x22>; + }; + + wsa_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x3>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x309>; + #clock-cells = <0x1>; + phandle = <0x19>; + }; + + wsa_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x4>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30a>; + #clock-cells = <0x1>; + phandle = <0x1a>; + }; + + rx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x5>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30e>; + #clock-cells = <0x1>; + phandle = <0x17>; + }; + + rx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x6>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30f>; + #clock-cells = <0x1>; + phandle = <0x18>; + }; + + tx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x7>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30c>; + #clock-cells = <0x1>; + phandle = <0x15>; + }; + + tx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x8>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30d>; + #clock-cells = <0x1>; + phandle = <0x16>; + }; + + va_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x2>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30b>; + #clock-cells = <0x1>; + phandle = <0x1b>; + }; + + va_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0xa>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x310>; + #clock-cells = <0x1>; + phandle = <0x1c>; + }; + }; + }; + + fragment@32 { + target = <0xffffffff>; + + __overlay__ { + qcom,msm-dai-is-island-supported = <0x1>; + }; + }; + + fragment@33 { + target = <0xffffffff>; + + __overlay__ { + hsuart8 = "/soc/qcom,qup_hsuart@a88000"; + }; + }; + + fragment@34 { + target = <0xffffffff>; + + __overlay__ { + + qcom,qup_hsuart@a88000 { + compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; + reg = <0xa88000 0x4000>; + reg-names = "se_phys"; + clock-names = "se-clk", "m-ahb", "s-ahb"; + clocks = <0xffffffff 0x50 0xffffffff 0x5a 0xffffffff 0x5b>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4f 0x50>; + pinctrl-1 = <0x51 0x52>; + interrupts = <0x0 0x163 0x0>; + qcom,wrapper-core = <0xffffffff>; + always-on-clock; + status = "ok"; + phandle = <0xba>; + }; + }; + }; + + fragment@35 { + target = <0xffffffff>; + + __overlay__ { + + qupv3_se8_2hsuart_pins { + phandle = <0xbb>; + + qupv3_se8_2uart_tx_active { + phandle = <0x4f>; + + mux { + pins = "gpio44"; + function = "qup12"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_rx_active { + phandle = <0x50>; + + mux { + pins = "gpio45"; + function = "qup12"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_tx_sleep { + phandle = <0x51>; + + mux { + pins = "gpio44"; + function = "gpio"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + input-enable; + }; + }; + + qupv3_se8_2uart_rx_sleep { + phandle = <0x52>; + + mux { + pins = "gpio45"; + function = "gpio"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@36 { + target = <0xffffffff>; + + __overlay__ { + + dcc_curr_link@3 { + qcom,curr-link-list = <0x3>; + qcom,data-sink = "sram"; + qcom,link-list = <0x0 0x18000024 0x1 0x0 0x0 0x18000040 0x1 0x0 0x0 0x18010024 0x1 0x0 0x0 0x18010040 0x1 0x0 0x0 0x18020024 0x1 0x0 0x0 0x18020040 0x1 0x0 0x0 0x18030024 0x1 0x0 0x0 0x18030040 0x1 0x0 0x0 0x18040024 0x1 0x0 0x0 0x18040040 0x1 0x0 0x0 0x18050024 0x1 0x0 0x0 0x18050040 0x1 0x0 0x0 0x18060024 0x1 0x0 0x0 0x18060040 0x1 0x0 0x0 0x18070024 0x1 0x0 0x0 0x18070040 0x1 0x0 0x0 0x18080024 0x1 0x0 0x0 0x18080040 0x1 0x0 0x0 0x180800f8 0x1 0x0 0x0 0x18080104 0x1 0x0 0x0 0x1808011c 0x1 0x0 0x0 0x18080128 0x1 0x0 0x0 0x18321700 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18325f00 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x18321818 0x1 0x0 0x0 0x18323818 0x1 0x0 0x0 0x18326018 0x1 0x0 0x0 0x18321920 0x1 0x0 0x0 0x1832102c 0x1 0x0 0x0 0x18321044 0x1 0x0 0x0 0x18321710 0x1 0x0 0x0 0x1832176c 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18323920 0x1 0x0 0x0 0x1832302c 0x1 0x0 0x0 0x18323044 0x1 0x0 0x0 0x18323710 0x1 0x0 0x0 0x1832376c 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18326120 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18325844 0x1 0x0 0x0 0x18325f10 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280000 0x2 0x0 0x0 0x18282000 0x2 0x0 0x0 0x18284000 0x2 0x0 0x0 0x9680000 0x1 0x0 0x0 0x9680004 0x1 0x0 0x2 0x8 0x0 0x0 0x0 0x9681000 0x1 0x0 0x2 0x1 0x0 0x0 0x0 0x9681004 0x1 0x0 0x0 0x9681008 0x1 0x0 0x0 0x968100c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9698500 0x1 0x0 0x0 0x9698504 0x1 0x0 0x0 0x9698508 0x1 0x0 0x0 0x969850c 0x1 0x0 0x0 0x9698510 0x1 0x0 0x0 0x9698514 0x1 0x0 0x0 0x9698518 0x1 0x0 0x0 0x969851c 0x1 0x0 0x0 0x9698700 0x1 0x0 0x0 0x9698704 0x1 0x0 0x0 0x9698708 0x1 0x0 0x0 0x969870c 0x1 0x0 0x0 0x9698714 0x1 0x0 0x0 0x9698718 0x1 0x0 0x0 0x969871c 0x1 0x0 0x0 0x1620204 0x1 0x0 0x0 0x1620240 0x1 0x0 0x0 0x1620248 0x1 0x0 0x0 0x1620288 0x1 0x0 0x0 0x162028c 0x1 0x0 0x0 0x1620290 0x1 0x0 0x0 0x1620294 0x1 0x0 0x0 0x16202a8 0x1 0x0 0x0 0x16202ac 0x1 0x0 0x0 0x16202b0 0x1 0x0 0x0 0x16202b4 0x1 0x0 0x0 0x1620300 0x1 0x0 0x0 0x16e0404 0x1 0x0 0x0 0x16e0408 0x1 0x0 0x0 0x16e0410 0x1 0x0 0x0 0x16e0420 0x1 0x0 0x0 0x16e0424 0x1 0x0 0x0 0x16e0428 0x1 0x0 0x0 0x16e042c 0x1 0x0 0x0 0x16e0430 0x1 0x0 0x0 0x16e0434 0x1 0x0 0x0 0x16e0438 0x1 0x0 0x0 0x16e043c 0x1 0x0 0x0 0x16e0300 0x1 0x0 0x0 0x16e0304 0x1 0x0 0x0 0x16e0700 0x1 0x0 0x0 0x16e0704 0x1 0x0 0x0 0x1700c00 0x1 0x0 0x0 0x1700c08 0x1 0x0 0x0 0x1700c10 0x1 0x0 0x0 0x1700c20 0x1 0x0 0x0 0x1700c24 0x1 0x0 0x0 0x1700c28 0x1 0x0 0x0 0x1700c2c 0x1 0x0 0x0 0x1700c30 0x1 0x0 0x0 0x1700c34 0x1 0x0 0x0 0x1700c38 0x1 0x0 0x0 0x1700c3c 0x1 0x0 0x0 0x1700300 0x1 0x0 0x0 0x1700304 0x1 0x0 0x0 0x1700308 0x1 0x0 0x0 0x170030c 0x1 0x0 0x0 0x1700310 0x1 0x0 0x0 0x1700500 0x1 0x0 0x0 0x1700504 0x1 0x0 0x0 0x1700508 0x1 0x0 0x0 0x170050c 0x1 0x0 0x0 0x1700900 0x1 0x0 0x0 0x1700904 0x1 0x0 0x0 0x1700908 0x1 0x0 0x0 0x1740004 0x1 0x0 0x0 0x1740008 0x1 0x0 0x0 0x1740010 0x1 0x0 0x0 0x1740020 0x1 0x0 0x0 0x1740024 0x1 0x0 0x0 0x1740028 0x1 0x0 0x0 0x174002c 0x1 0x0 0x0 0x1740030 0x1 0x0 0x0 0x1740034 0x1 0x0 0x0 0x1740038 0x1 0x0 0x0 0x174003c 0x1 0x0 0x0 0x1740300 0x1 0x0 0x0 0x1740304 0x1 0x0 0x0 0x1740308 0x1 0x0 0x0 0x174030c 0x1 0x0 0x0 0x1740310 0x1 0x0 0x0 0x1740314 0x1 0x0 0x0 0x9698204 0x1 0x0 0x0 0x9698240 0x1 0x0 0x0 0x9698244 0x1 0x0 0x0 0x9698248 0x1 0x0 0x0 0x969824c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x9681018 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9160204 0x1 0x0 0x0 0x9160240 0x1 0x0 0x0 0x9160248 0x1 0x0 0x0 0x9160288 0x1 0x0 0x0 0x9160290 0x1 0x0 0x0 0x9160300 0x1 0x0 0x0 0x9160304 0x1 0x0 0x0 0x9160308 0x1 0x0 0x0 0x916030c 0x1 0x0 0x0 0x9160310 0x1 0x0 0x0 0x9160314 0x1 0x0 0x0 0x9160318 0x1 0x0 0x0 0x9160008 0x1 0x0 0x0 0x9160010 0x1 0x0 0x0 0x9160020 0x1 0x0 0x0 0x9160024 0x1 0x0 0x0 0x9160028 0x1 0x0 0x0 0x916002c 0x1 0x0 0x0 0x9160030 0x1 0x0 0x0 0x9160034 0x1 0x0 0x0 0x9160038 0x1 0x0 0x0 0x916003c 0x1 0x0 0x0 0x63042680 0x1 0x0 0x0 0x63042684 0x1 0x0 0x0 0x63042688 0x1 0x0 0x0 0x63042690 0x1 0x0 0x0 0x630426a0 0x1 0x0 0x0 0x630426a4 0x1 0x0 0x0 0x630426a8 0x1 0x0 0x0 0x630426ac 0x1 0x0 0x0 0x630426b0 0x1 0x0 0x0 0x630426b4 0x1 0x0 0x0 0x630426b8 0x1 0x0 0x0 0x630426bc 0x1 0x0 0x0 0x63041900 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x1620500 0x4 0x0 0x0 0x1620700 0x4 0x0 0x0 0x1620300 0x1 0x0 0x0 0x1620f00 0x2 0x0 0x0 0x1620b00 0x2 0x0 0x0 0x1700b00 0x2 0x0 0x0 0x1700700 0x3 0x0 0x0 0x9163100 0x1 0x0 0x0 0x96aa100 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x9991500 0x8 0x0 0x0 0x9050008 0x1 0x0 0x0 0x9050078 0x1 0x0 0x0 0x9236028 0x1 0x0 0x0 0x923602c 0x1 0x0 0x0 0x9236030 0x1 0x0 0x0 0x9236034 0x1 0x0 0x0 0x9236038 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x92360b0 0x1 0x0 0x0 0x9236044 0x1 0x0 0x0 0x9236048 0x1 0x0 0x0 0x923604c 0x1 0x0 0x0 0x9236050 0x1 0x0 0x0 0x923e030 0x1 0x0 0x0 0x923e034 0x1 0x0 0x0 0x9241000 0x1 0x0 0x0 0x9248058 0x1 0x0 0x0 0x924805c 0x1 0x0 0x0 0x9248060 0x1 0x0 0x0 0x9248064 0x1 0x0 0x0 0x9260410 0x1 0x0 0x0 0x92e0410 0x1 0x0 0x0 0x9260414 0x1 0x0 0x0 0x92e0414 0x1 0x0 0x0 0x9260418 0x1 0x0 0x0 0x92e0418 0x1 0x0 0x0 0x9260420 0x1 0x0 0x0 0x9260424 0x1 0x0 0x0 0x9260430 0x1 0x0 0x0 0x9260440 0x1 0x0 0x0 0x9260448 0x1 0x0 0x0 0x92604a0 0x1 0x0 0x0 0x92604b0 0x1 0x0 0x0 0x92604d0 0x2 0x0 0x0 0x9261440 0x1 0x0 0x0 0x92e0420 0x1 0x0 0x0 0x92e0424 0x1 0x0 0x0 0x92e0430 0x1 0x0 0x0 0x92e0440 0x1 0x0 0x0 0x92e0448 0x1 0x0 0x0 0x92e04a0 0x1 0x0 0x0 0x92e04b0 0x1 0x0 0x0 0x92e04d0 0x2 0x0 0x0 0x9600000 0x1 0x0 0x0 0x9601000 0x1 0x0 0x0 0x9602000 0x1 0x0 0x0 0x9603000 0x1 0x0 0x0 0x9604000 0x1 0x0 0x0 0x9605000 0x1 0x0 0x0 0x9606000 0x1 0x0 0x0 0x9607000 0x1 0x0 0x0 0x9608000 0x1 0x0 0x0 0x9609000 0x1 0x0 0x0 0x960a000 0x1 0x0 0x0 0x960b000 0x1 0x0 0x0 0x960c000 0x1 0x0 0x0 0x960d000 0x1 0x0 0x0 0x960e000 0x1 0x0 0x0 0x960f000 0x1 0x0 0x0 0x9610000 0x1 0x0 0x0 0x9611000 0x1 0x0 0x0 0x9612000 0x1 0x0 0x0 0x9613000 0x1 0x0 0x0 0x9614000 0x1 0x0 0x0 0x9615000 0x1 0x0 0x0 0x9616000 0x1 0x0 0x0 0x9617000 0x1 0x0 0x0 0x9618000 0x1 0x0 0x0 0x9619000 0x1 0x0 0x0 0x961a000 0x1 0x0 0x0 0x961b000 0x1 0x0 0x0 0x961c000 0x1 0x0 0x0 0x961d000 0x1 0x0 0x0 0x961e000 0x1 0x0 0x0 0x961f000 0x1 0x0 0x0 0x9600004 0x1 0x0 0x0 0x9601004 0x1 0x0 0x0 0x9602004 0x1 0x0 0x0 0x9603004 0x1 0x0 0x0 0x9604004 0x1 0x0 0x0 0x9605004 0x1 0x0 0x0 0x9606004 0x1 0x0 0x0 0x9607004 0x1 0x0 0x0 0x9608004 0x1 0x0 0x0 0x9609004 0x1 0x0 0x0 0x960a004 0x1 0x0 0x0 0x960b004 0x1 0x0 0x0 0x960c004 0x1 0x0 0x0 0x960d004 0x1 0x0 0x0 0x960e004 0x1 0x0 0x0 0x960f004 0x1 0x0 0x0 0x9610004 0x1 0x0 0x0 0x9611004 0x1 0x0 0x0 0x9612004 0x1 0x0 0x0 0x9613004 0x1 0x0 0x0 0x9614004 0x1 0x0 0x0 0x9615004 0x1 0x0 0x0 0x9616004 0x1 0x0 0x0 0x9617004 0x1 0x0 0x0 0x9618004 0x1 0x0 0x0 0x9619004 0x1 0x0 0x0 0x961a004 0x1 0x0 0x0 0x961b004 0x1 0x0 0x0 0x961c004 0x1 0x0 0x0 0x961d004 0x1 0x0 0x0 0x961e004 0x1 0x0 0x0 0x961f004 0x1 0x0 0x0 0x9266418 0x1 0x0 0x0 0x92e6418 0x1 0x0 0x0 0x9265804 0x1 0x0 0x0 0x92e5804 0x1 0x0 0x0 0x92604b8 0x1 0x0 0x0 0x92e04b8 0x1 0x0 0x0 0xc201244 0x1 0x0 0x0 0xc202244 0x1 0x0 0x0 0x18100c18 0x1 0x0 0x0 0x18101c18 0x1 0x0 0x0 0x18300000 0x1 0x0 0x0 0x183a3a84 0x2 0x0 0x0 0x18393a84 0x1 0x0 0x0 0x100000 0x1 0x0 0x0 0x100004 0x1 0x0 0x0 0x100008 0x1 0x0 0x0 0x10000c 0x1 0x0 0x0 0x100010 0x1 0x0 0x0 0x100014 0x1 0x0 0x0 0x100018 0x1 0x0 0x0 0x10001c 0x1 0x0 0x0 0x100020 0x1 0x0 0x0 0x100024 0x1 0x0 0x0 0x100028 0x1 0x0 0x0 0x10002c 0x1 0x0 0x0 0x100030 0x1 0x0 0x0 0x100034 0x1 0x0 0x0 0x100100 0x1 0x0 0x0 0x100104 0x1 0x0 0x0 0x100108 0x1 0x0 0x0 0x10010c 0x1 0x0 0x0 0x101000 0x1 0x0 0x0 0x101004 0x1 0x0 0x0 0x101008 0x1 0x0 0x0 0x10100c 0x1 0x0 0x0 0x101010 0x1 0x0 0x0 0x101014 0x1 0x0 0x0 0x101018 0x1 0x0 0x0 0x10101c 0x1 0x0 0x0 0x101020 0x1 0x0 0x0 0x101024 0x1 0x0 0x0 0x101028 0x1 0x0 0x0 0x10102c 0x1 0x0 0x0 0x101030 0x1 0x0 0x0 0x101034 0x1 0x0 0x0 0x102000 0x1 0x0 0x0 0x102004 0x1 0x0 0x0 0x102008 0x1 0x0 0x0 0x10200c 0x1 0x0 0x0 0x102010 0x1 0x0 0x0 0x102014 0x1 0x0 0x0 0x102018 0x1 0x0 0x0 0x10201c 0x1 0x0 0x0 0x102020 0x1 0x0 0x0 0x102024 0x1 0x0 0x0 0x102028 0x1 0x0 0x0 0x10202c 0x1 0x0 0x0 0x102030 0x1 0x0 0x0 0x102034 0x1 0x0 0x0 0x103000 0x1 0x0 0x0 0x103004 0x1 0x0 0x0 0x103008 0x1 0x0 0x0 0x10300c 0x1 0x0 0x0 0x103010 0x1 0x0 0x0 0x103014 0x1 0x0 0x0 0x103018 0x1 0x0 0x0 0x10301c 0x1 0x0 0x0 0x103020 0x1 0x0 0x0 0x103024 0x1 0x0 0x0 0x103028 0x1 0x0 0x0 0x10302c 0x1 0x0 0x0 0x103030 0x1 0x0 0x0 0x103034 0x1 0x0 0x0 0x113000 0x1 0x0 0x0 0x113004 0x1 0x0 0x0 0x113008 0x1 0x0 0x0 0x11300c 0x1 0x0 0x0 0x113010 0x1 0x0 0x0 0x113014 0x1 0x0 0x0 0x113018 0x1 0x0 0x0 0x11301c 0x1 0x0 0x0 0x113020 0x1 0x0 0x0 0x113024 0x1 0x0 0x0 0x113028 0x1 0x0 0x0 0x11302c 0x1 0x0 0x0 0x113030 0x1 0x0 0x0 0x113034 0x1 0x0 0x0 0x11a000 0x1 0x0 0x0 0x11a004 0x1 0x0 0x0 0x11a008 0x1 0x0 0x0 0x11a00c 0x1 0x0 0x0 0x11a010 0x1 0x0 0x0 0x11a014 0x1 0x0 0x0 0x11a018 0x1 0x0 0x0 0x11a01c 0x1 0x0 0x0 0x11a020 0x1 0x0 0x0 0x11a024 0x1 0x0 0x0 0x11a028 0x1 0x0 0x0 0x11a02c 0x1 0x0 0x0 0x11a030 0x1 0x0 0x0 0x11a034 0x1 0x0 0x0 0x11b000 0x1 0x0 0x0 0x11b004 0x1 0x0 0x0 0x11b008 0x1 0x0 0x0 0x11b00c 0x1 0x0 0x0 0x11b010 0x1 0x0 0x0 0x11b014 0x1 0x0 0x0 0x11b018 0x1 0x0 0x0 0x11b01c 0x1 0x0 0x0 0x11b020 0x1 0x0 0x0 0x11b024 0x1 0x0 0x0 0x11b028 0x1 0x0 0x0 0x11b02c 0x1 0x0 0x0 0x11b030 0x1 0x0 0x0 0x11b034 0x1 0x0 0x0 0x174000 0x1 0x0 0x0 0x174004 0x1 0x0 0x0 0x174008 0x1 0x0 0x0 0x17400c 0x1 0x0 0x0 0x174010 0x1 0x0 0x0 0x174014 0x1 0x0 0x0 0x174018 0x1 0x0 0x0 0x17401c 0x1 0x0 0x0 0x174020 0x1 0x0 0x0 0x174024 0x1 0x0 0x0 0x174028 0x1 0x0 0x0 0x17402c 0x1 0x0 0x0 0x174030 0x1 0x0 0x0 0x174034 0x1 0x0 0x0 0x176000 0x1 0x0 0x0 0x176004 0x1 0x0 0x0 0x176008 0x1 0x0 0x0 0x17600c 0x1 0x0 0x0 0x176010 0x1 0x0 0x0 0x176014 0x1 0x0 0x0 0x176018 0x1 0x0 0x0 0x17601c 0x1 0x0 0x0 0x176020 0x1 0x0 0x0 0x176024 0x1 0x0 0x0 0x176028 0x1 0x0 0x0 0x17602c 0x1 0x0 0x0 0x176030 0x1 0x0 0x0 0x176034 0x1 0x0 0x0 0x10401c 0x1 0x0 0x0 0x183024 0x1 0x0 0x0 0x144168 0x1 0x0 0x0 0x11702c 0x1 0x0 0x0 0x10904c 0x1 0x0 0x0 0x189038 0x1 0x0 0x0 0x1443e8 0x1 0x0 0x0 0x1442b8 0x1 0x0 0x0 0x105060 0x1 0x0 0x0 0x141024 0x1 0x0 0x0 0x145038 0x1 0x0 0x0 0x109004 0x1 0x0 0x0 0x189004 0x1 0x0 0x0 0x190004 0x1 0x0 0x0 0xc2a0000 0x1 0x0 0x0 0xc2a0004 0x1 0x0 0x0 0xc2a0008 0x1 0x0 0x0 0xc2a000c 0x1 0x0 0x0 0xc2a0010 0x1 0x0 0x0 0xc2a0014 0x1 0x0 0x0 0xc2a0018 0x1 0x0 0x0 0xc2a001c 0x1 0x0 0x0 0xc2a0020 0x1 0x0 0x0 0xc2a0024 0x1 0x0 0x0 0xc2a0028 0x1 0x0 0x0 0xc2a002c 0x1 0x0 0x0 0xc2a0030 0x1 0x0 0x0 0xc2a0034 0x1 0x0 0x0 0xc2a1000 0x1 0x0 0x0 0xc2a1004 0x1 0x0 0x0 0xc2a1008 0x1 0x0 0x0 0xc2a100c 0x1 0x0 0x0 0xc2a1010 0x1 0x0 0x0 0xc2a1014 0x1 0x0 0x0 0xc2a1018 0x1 0x0 0x0 0xc2a101c 0x1 0x0 0x0 0xc2a1020 0x1 0x0 0x0 0xc2a1024 0x1 0x0 0x0 0xc2a1028 0x1 0x0 0x0 0xc2a102c 0x1 0x0 0x0 0xc2a1030 0x1 0x0 0x0 0xc2a2260 0x1 0x0 0x0 0xc2a2264 0x1 0x0 0x0 0xc2a3008 0x1 0x0 0x0 0xc2a300c 0x1 0x0 0x0 0xc2a3010 0x1 0x0 0x0 0xc2a3014 0x1 0x0 0x0 0xc2a3024 0x1 0x0 0x0 0xc2a2034 0x1 0x0 0x0 0xc2a214c 0x1 0x0 0x0 0xc2a2150 0x1 0x0 0x0 0xc2a2154 0x1 0x0 0x0 0x28206c 0x1 0x0 0x0 0x18282004 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x1808012c 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280004 0x1 0x0 0x0 0x18284038 0x1 0x0 0x0 0x18284000 0x2 0x0 0x0 0x90c012c 0x1 0x0 0x0 0x9222408 0x1 0x0 0x0 0x9220344 0x2 0x0 0x0 0x9220480 0x1 0x0 0x0 0x922358c 0x1 0x0 0x0 0x9222398 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x923201c 0x5 0x0 0x0 0x9232050 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x9186048 0x1 0x0 0x0 0x9186054 0x1 0x0 0x0 0x9186164 0x1 0x0 0x0 0x9186170 0x1 0x0 0x0 0xc2630a0 0x4 0x0 0x0 0xc2630b0 0x4 0x0 0x0 0xc2630c0 0x4 0x0 0x0 0xc2630d0 0x4 0x0 0x0 0x18200400 0x1 0x0 0x0 0x18200404 0x1 0x0 0x0 0x18200408 0x1 0x0 0x0 0x18200038 0x1 0x0 0x0 0x18200040 0x1 0x0 0x0 0x18200048 0x1 0x0 0x0 0x18220038 0x1 0x0 0x0 0x18220040 0x1 0x0 0x0 0x182200d0 0x1 0x0 0x0 0x18200030 0x1 0x0 0x0 0x18200010 0x1 0x0 0x0 0x1822000c 0x1 0x0 0x0 0x18220d14 0x1 0x0 0x0 0x18220fb4 0x1 0x0 0x0 0x18221254 0x1 0x0 0x0 0x182214f4 0x1 0x0 0x0 0x18221794 0x1 0x0 0x0 0x18221a34 0x1 0x0 0x0 0x18221cd4 0x1 0x0 0x0 0x18221f74 0x1 0x0 0x0 0x18220d18 0x1 0x0 0x0 0x18220fb8 0x1 0x0 0x0 0x18221258 0x1 0x0 0x0 0x182214f8 0x1 0x0 0x0 0x18221798 0x1 0x0 0x0 0x18221a38 0x1 0x0 0x0 0x18221cd8 0x1 0x0 0x0 0x18221f78 0x1 0x0 0x0 0x18220d00 0x1 0x0 0x0 0x18220d04 0x1 0x0 0x0 0x18220d1c 0x1 0x0 0x0 0x18220fbc 0x1 0x0 0x0 0x1822125c 0x1 0x0 0x0 0x182214fc 0x1 0x0 0x0 0x1822179c 0x1 0x0 0x0 0x18221a3c 0x1 0x0 0x0 0x18221cdc 0x1 0x0 0x0 0x18221f7c 0x1 0x0 0x0 0x18221274 0x1 0x0 0x0 0x18221288 0x1 0x0 0x0 0x1822129c 0x1 0x0 0x0 0x182212b0 0x1 0x0 0x0 0x182212c4 0x1 0x0 0x0 0x182212d8 0x1 0x0 0x0 0x182212ec 0x1 0x0 0x0 0x18221300 0x1 0x0 0x0 0x18221314 0x1 0x0 0x0 0x18221328 0x1 0x0 0x0 0x1822133c 0x1 0x0 0x0 0x18221350 0x1 0x0 0x0 0x18221364 0x1 0x0 0x0 0x18221378 0x1 0x0 0x0 0x1822138c 0x1 0x0 0x0 0x182213a0 0x1 0x0 0x0 0x18221514 0x1 0x0 0x0 0x18221528 0x1 0x0 0x0 0x1822153c 0x1 0x0 0x0 0x18221550 0x1 0x0 0x0 0x18221564 0x1 0x0 0x0 0x18221578 0x1 0x0 0x0 0x1822158c 0x1 0x0 0x0 0x182215a0 0x1 0x0 0x0 0x182215b4 0x1 0x0 0x0 0x182215c8 0x1 0x0 0x0 0x182215dc 0x1 0x0 0x0 0x182215f0 0x1 0x0 0x0 0x18221604 0x1 0x0 0x0 0x18221618 0x1 0x0 0x0 0x1822162c 0x1 0x0 0x0 0x18221640 0x1 0x0 0x0 0x182217b4 0x1 0x0 0x0 0x182217c8 0x1 0x0 0x0 0x182217dc 0x1 0x0 0x0 0x182217f0 0x1 0x0 0x0 0x18221804 0x1 0x0 0x0 0x18221818 0x1 0x0 0x0 0x1822182c 0x1 0x0 0x0 0x18221840 0x1 0x0 0x0 0x18221854 0x1 0x0 0x0 0x18221868 0x1 0x0 0x0 0x1822187c 0x1 0x0 0x0 0x18221890 0x1 0x0 0x0 0x182218a4 0x1 0x0 0x0 0x182218b8 0x1 0x0 0x0 0x182218cc 0x1 0x0 0x0 0x182218e0 0x1 0x0 0x0 0x18221a54 0x1 0x0 0x0 0x18221a68 0x1 0x0 0x0 0x18221a7c 0x1 0x0 0x0 0x18221a90 0x1 0x0 0x0 0x18221aa4 0x1 0x0 0x0 0x18221ab8 0x1 0x0 0x0 0x18221acc 0x1 0x0 0x0 0x18221ae0 0x1 0x0 0x0 0x18221af4 0x1 0x0 0x0 0x18221b08 0x1 0x0 0x0 0x18221b1c 0x1 0x0 0x0 0x18221b30 0x1 0x0 0x0 0x18221b44 0x1 0x0 0x0 0x18221b58 0x1 0x0 0x0 0x18221b6c 0x1 0x0 0x0 0x18221b80 0x1 0x0 0x0 0x18221cf4 0x1 0x0 0x0 0x18221d08 0x1 0x0 0x0 0x18221d1c 0x1 0x0 0x0 0x18221d30 0x1 0x0 0x0 0x18221d44 0x1 0x0 0x0 0x18221d58 0x1 0x0 0x0 0x18221d6c 0x1 0x0 0x0 0x18221d80 0x1 0x0 0x0 0x18221d94 0x1 0x0 0x0 0x18221da8 0x1 0x0 0x0 0x18221dbc 0x1 0x0 0x0 0x18221dd0 0x1 0x0 0x0 0x18221de4 0x1 0x0 0x0 0x18221df8 0x1 0x0 0x0 0x18221e0c 0x1 0x0 0x0 0x18221e20 0x1 0x0 0x0 0x18221f94 0x1 0x0 0x0 0x18221fa8 0x1 0x0 0x0 0x18221fbc 0x1 0x0 0x0 0x18221fd0 0x1 0x0 0x0 0x18221fe4 0x1 0x0 0x0 0x18221ff8 0x1 0x0 0x0 0x1822200c 0x1 0x0 0x0 0x18222020 0x1 0x0 0x0 0x18222034 0x1 0x0 0x0 0x18222048 0x1 0x0 0x0 0x1822205c 0x1 0x0 0x0 0x18222070 0x1 0x0 0x0 0x18222084 0x1 0x0 0x0 0x18222098 0x1 0x0 0x0 0x182220ac 0x1 0x0 0x0 0x182220c0 0x1 0x0 0x0 0x18221278 0x1 0x0 0x0 0x1822128c 0x1 0x0 0x0 0x182212a0 0x1 0x0 0x0 0x182212b4 0x1 0x0 0x0 0x182212c8 0x1 0x0 0x0 0x182212dc 0x1 0x0 0x0 0x182212f0 0x1 0x0 0x0 0x18221304 0x1 0x0 0x0 0x18221318 0x1 0x0 0x0 0x1822132c 0x1 0x0 0x0 0x18221340 0x1 0x0 0x0 0x18221354 0x1 0x0 0x0 0x18221368 0x1 0x0 0x0 0x1822137c 0x1 0x0 0x0 0x18221390 0x1 0x0 0x0 0x182213a4 0x1 0x0 0x0 0x18221518 0x1 0x0 0x0 0x1822152c 0x1 0x0 0x0 0x18221540 0x1 0x0 0x0 0x18221554 0x1 0x0 0x0 0x18221568 0x1 0x0 0x0 0x1822157c 0x1 0x0 0x0 0x18221590 0x1 0x0 0x0 0x182215a4 0x1 0x0 0x0 0x182215b8 0x1 0x0 0x0 0x182215cc 0x1 0x0 0x0 0x182215e0 0x1 0x0 0x0 0x182215f4 0x1 0x0 0x0 0x18221608 0x1 0x0 0x0 0x1822161c 0x1 0x0 0x0 0x18221630 0x1 0x0 0x0 0x18221644 0x1 0x0 0x0 0x182217b8 0x1 0x0 0x0 0x182217cc 0x1 0x0 0x0 0x182217e0 0x1 0x0 0x0 0x182217f4 0x1 0x0 0x0 0x18221808 0x1 0x0 0x0 0x1822181c 0x1 0x0 0x0 0x18221830 0x1 0x0 0x0 0x18221844 0x1 0x0 0x0 0x18221858 0x1 0x0 0x0 0x1822186c 0x1 0x0 0x0 0x18221880 0x1 0x0 0x0 0x18221894 0x1 0x0 0x0 0x182218a8 0x1 0x0 0x0 0x182218bc 0x1 0x0 0x0 0x182218d0 0x1 0x0 0x0 0x182218e4 0x1 0x0 0x0 0x18221a58 0x1 0x0 0x0 0x18221a6c 0x1 0x0 0x0 0x18221a80 0x1 0x0 0x0 0x18221a94 0x1 0x0 0x0 0x18221aa8 0x1 0x0 0x0 0x18221abc 0x1 0x0 0x0 0x18221ad0 0x1 0x0 0x0 0x18221ae4 0x1 0x0 0x0 0x18221af8 0x1 0x0 0x0 0x18221b0c 0x1 0x0 0x0 0x18221b20 0x1 0x0 0x0 0x18221b34 0x1 0x0 0x0 0x18221b48 0x1 0x0 0x0 0x18221b5c 0x1 0x0 0x0 0x18221b70 0x1 0x0 0x0 0x18221b84 0x1 0x0 0x0 0x18221cf8 0x1 0x0 0x0 0x18221d0c 0x1 0x0 0x0 0x18221d20 0x1 0x0 0x0 0x18221d34 0x1 0x0 0x0 0x18221d48 0x1 0x0 0x0 0x18221d5c 0x1 0x0 0x0 0x18221d70 0x1 0x0 0x0 0x18221d84 0x1 0x0 0x0 0x18221d98 0x1 0x0 0x0 0x18221dac 0x1 0x0 0x0 0x18221dc0 0x1 0x0 0x0 0x18221dd4 0x1 0x0 0x0 0x18221de8 0x1 0x0 0x0 0x18221dfc 0x1 0x0 0x0 0x18221e10 0x1 0x0 0x0 0x18221e24 0x1 0x0 0x0 0x18221f98 0x1 0x0 0x0 0x18221fac 0x1 0x0 0x0 0x18221fc0 0x1 0x0 0x0 0x18221fd4 0x1 0x0 0x0 0x18221fe8 0x1 0x0 0x0 0x18221ffc 0x1 0x0 0x0 0x18222010 0x1 0x0 0x0 0x18222024 0x1 0x0 0x0 0x18222038 0x1 0x0 0x0 0x1822204c 0x1 0x0 0x0 0x18222060 0x1 0x0 0x0 0x18222074 0x1 0x0 0x0 0x18222088 0x1 0x0 0x0 0x1822209c 0x1 0x0 0x0 0x182220b0 0x1 0x0 0x0 0x182220c4 0x1 0x0 0x0 0x105050 0x1 0x0 0x0 0x171004 0x1 0x0 0x0 0x171154 0x1 0x0 0x0 0x17100c 0x1 0x0 0x0 0x171018 0x1 0x0 0x0 0x5091004 0x1 0x0 0x0 0x509100c 0x1 0x0 0x0 0x5091010 0x1 0x0 0x0 0x5091014 0x1 0x0 0x0 0x5091054 0x1 0x0 0x0 0x5091060 0x1 0x0 0x0 0x509106c 0x1 0x0 0x0 0x5091070 0x1 0x0 0x0 0x5091074 0x1 0x0 0x0 0x5091078 0x1 0x0 0x0 0x509107c 0x1 0x0 0x0 0x509108c 0x1 0x0 0x0 0x5091098 0x1 0x0 0x0 0x509109c 0x1 0x0 0x0 0x1800005c 0x1 0x0 0x0 0x1801005c 0x1 0x0 0x0 0x1802005c 0x1 0x0 0x0 0x1803005c 0x1 0x0 0x0 0x1804005c 0x1 0x0 0x0 0x1805005c 0x1 0x0 0x0 0x1806005c 0x1 0x0 0x0 0x1807005c 0x1 0x0 0x0 0x17c0003c 0x1 0x0 0x1 0x6004fb0 0xc5acce55 0x0 0x1 0x600408c 0xff 0x0 0x1 0x6004fb0 0x0 0x0 0x0 0x62900010 0x1 0x0 0x0 0x62900014 0x1 0x0 0x0 0x62900018 0x1 0x0 0x0 0x62900030 0x1 0x0 0x0 0x62900038 0x1 0x0 0x0 0x62900040 0x1 0x0 0x0 0x62900048 0x1 0x0 0x0 0x629000d0 0x1 0x0 0x0 0x62900210 0x1 0x0 0x0 0x62900230 0x1 0x0 0x0 0x62900250 0x1 0x0 0x0 0x62900270 0x1 0x0 0x0 0x62900290 0x1 0x0 0x0 0x629002b0 0x1 0x0 0x0 0x62900208 0x1 0x0 0x0 0x62900228 0x1 0x0 0x0 0x62900248 0x1 0x0 0x0 0x62900268 0x1 0x0 0x0 0x62900288 0x1 0x0 0x0 0x629002a8 0x1 0x0 0x0 0x6290020c 0x1 0x0 0x0 0x6290022c 0x1 0x0 0x0 0x6290024c 0x1 0x0 0x0 0x6290026c 0x1 0x0 0x0 0x6290028c 0x1 0x0 0x0 0x629002ac 0x1 0x0 0x0 0x62900404 0x1 0x0 0x0 0x62900408 0x1 0x0 0x0 0x62900400 0x1 0x0 0x0 0x62900d04 0x1 0x0 0x0 0x624b0010 0x1 0x0 0x0 0x624b0014 0x1 0x0 0x0 0x624b0018 0x1 0x0 0x0 0x624b0210 0x1 0x0 0x0 0x624b0230 0x1 0x0 0x0 0x624b0250 0x1 0x0 0x0 0x624b0270 0x1 0x0 0x0 0x624b0290 0x1 0x0 0x0 0x624b02b0 0x1 0x0 0x0 0x624b0208 0x1 0x0 0x0 0x624b0228 0x1 0x0 0x0 0x624b0248 0x1 0x0 0x0 0x624b0268 0x1 0x0 0x0 0x624b0288 0x1 0x0 0x0 0x624b02a8 0x1 0x0 0x0 0x624b020c 0x1 0x0 0x0 0x624b022c 0x1 0x0 0x0 0x624b024c 0x1 0x0 0x0 0x624b026c 0x1 0x0 0x0 0x624b028c 0x1 0x0 0x0 0x624b02ac 0x1 0x0 0x0 0x624b0400 0x1 0x0 0x0 0x624b0404 0x1 0x0 0x0 0x624b0408 0x1 0x0 0x0 0x62402028 0x1 0x0 0x0 0xb254520 0x1 0x0 0x0 0xb251020 0x1 0x0 0x0 0xb251024 0x1 0x0 0x0 0xb251030 0x1 0x0 0x0 0xb251200 0x1 0x0 0x0 0xb251214 0x1 0x0 0x0 0xb251228 0x1 0x0 0x0 0xb25123c 0x1 0x0 0x0 0xb251250 0x1 0x0 0x0 0xb251204 0x1 0x0 0x0 0xb251218 0x1 0x0 0x0 0xb25122c 0x1 0x0 0x0 0xb251240 0x1 0x0 0x0 0xb251254 0x1 0x0 0x0 0xb251208 0x1 0x0 0x0 0xb25121c 0x1 0x0 0x0 0xb251230 0x1 0x0 0x0 0xb251244 0x1 0x0 0x0 0xb251258 0x1 0x0 0x0 0xb254510 0x1 0x0 0x0 0xb254514 0x1 0x0 0x0 0xb250010 0x1 0x0 0x0 0xb250014 0x1 0x0 0x0 0xb250900 0x1 0x0 0x0 0xb250904 0x1 0x0 0x0 0x4200010 0x1 0x0 0x0 0x4200014 0x1 0x0 0x0 0x4200018 0x1 0x0 0x0 0x4200030 0x1 0x0 0x0 0x4200038 0x1 0x0 0x0 0x4200040 0x1 0x0 0x0 0x4200048 0x1 0x0 0x0 0x42000d0 0x1 0x0 0x0 0x4200210 0x1 0x0 0x0 0x4200230 0x1 0x0 0x0 0x4200250 0x1 0x0 0x0 0x4200270 0x1 0x0 0x0 0x4200290 0x1 0x0 0x0 0x42002b0 0x1 0x0 0x0 0x4200208 0x1 0x0 0x0 0x4200228 0x1 0x0 0x0 0x4200248 0x1 0x0 0x0 0x4200268 0x1 0x0 0x0 0x4200288 0x1 0x0 0x0 0x42002a8 0x1 0x0 0x0 0x420020c 0x1 0x0 0x0 0x420022c 0x1 0x0 0x0 0x420024c 0x1 0x0 0x0 0x420026c 0x1 0x0 0x0 0x420028c 0x1 0x0 0x0 0x42002ac 0x1 0x0 0x0 0x4200404 0x1 0x0 0x0 0x4200408 0x1 0x0 0x0 0x4200400 0x1 0x0 0x0 0x4200d04 0x1 0x0 0x0 0x4130010 0x1 0x0 0x0 0x4130014 0x1 0x0 0x0 0x4130018 0x1 0x0 0x0 0x4130210 0x1 0x0 0x0 0x4130230 0x1 0x0 0x0 0x4130250 0x1 0x0 0x0 0x4130270 0x1 0x0 0x0 0x4130290 0x1 0x0 0x0 0x41302b0 0x1 0x0 0x0 0x4130208 0x1 0x0 0x0 0x4130228 0x1 0x0 0x0 0x4130248 0x1 0x0 0x0 0x4130268 0x1 0x0 0x0 0x4130288 0x1 0x0 0x0 0x41302a8 0x1 0x0 0x0 0x413020c 0x1 0x0 0x0 0x413022c 0x1 0x0 0x0 0x413024c 0x1 0x0 0x0 0x413026c 0x1 0x0 0x0 0x413028c 0x1 0x0 0x0 0x41302ac 0x1 0x0 0x0 0x4130400 0x1 0x0 0x0 0x4130404 0x1 0x0 0x0 0x4130408 0x1 0x0 0x0 0x4082028 0x1 0x0 0x0 0x18a008 0x1 0x0 0x0 0xb2c4520 0x1 0x0 0x0 0xb2c1020 0x1 0x0 0x0 0xb2c1024 0x1 0x0 0x0 0xb2c1030 0x1 0x0 0x0 0xb2c1200 0x1 0x0 0x0 0xb2c1214 0x1 0x0 0x0 0xb2c1228 0x1 0x0 0x0 0xb2c123c 0x1 0x0 0x0 0xb2c1250 0x1 0x0 0x0 0xb2c1204 0x1 0x0 0x0 0xb2c1218 0x1 0x0 0x0 0xb2c122c 0x1 0x0 0x0 0xb2c1240 0x1 0x0 0x0 0xb2c1254 0x1 0x0 0x0 0xb2c1208 0x1 0x0 0x0 0xb2c121c 0x1 0x0 0x0 0xb2c1230 0x1 0x0 0x0 0xb2c1244 0x1 0x0 0x0 0xb2c1258 0x1 0x0 0x0 0xb2c4510 0x1 0x0 0x0 0xb2c4514 0x1 0x0 0x0 0xb2c0010 0x1 0x0 0x0 0xb2c0014 0x1 0x0 0x0 0xb2c0900 0x1 0x0 0x0 0xb2c0904 0x1 0x0 0x0 0x80a4010 0x1 0x0 0x0 0x80a4014 0x1 0x0 0x0 0x80a4018 0x1 0x0 0x0 0x80a4030 0x1 0x0 0x0 0x80a4038 0x1 0x0 0x0 0x80a4040 0x1 0x0 0x0 0x80a4048 0x1 0x0 0x0 0x80a40d0 0x1 0x0 0x0 0x80a4210 0x1 0x0 0x0 0x80a4230 0x1 0x0 0x0 0x80a4250 0x1 0x0 0x0 0x80a4270 0x1 0x0 0x0 0x80a4290 0x1 0x0 0x0 0x80a42b0 0x1 0x0 0x0 0x80a4208 0x1 0x0 0x0 0x80a4228 0x1 0x0 0x0 0x80a4248 0x1 0x0 0x0 0x80a4268 0x1 0x0 0x0 0x80a4288 0x1 0x0 0x0 0x80a42a8 0x1 0x0 0x0 0x80a420c 0x1 0x0 0x0 0x80a422c 0x1 0x0 0x0 0x80a424c 0x1 0x0 0x0 0x80a426c 0x1 0x0 0x0 0x80a428c 0x1 0x0 0x0 0x80a42ac 0x1 0x0 0x0 0x80a4404 0x1 0x0 0x0 0x80a4408 0x1 0x0 0x0 0x80a4400 0x1 0x0 0x0 0x80a4d04 0x1 0x0 0x0 0x83b0010 0x1 0x0 0x0 0x83b0014 0x1 0x0 0x0 0x83b0018 0x1 0x0 0x0 0x83b0210 0x1 0x0 0x0 0x83b0230 0x1 0x0 0x0 0x83b0250 0x1 0x0 0x0 0x83b0270 0x1 0x0 0x0 0x83b0290 0x1 0x0 0x0 0x83b02b0 0x1 0x0 0x0 0x83b0208 0x1 0x0 0x0 0x83b0228 0x1 0x0 0x0 0x83b0248 0x1 0x0 0x0 0x83b0268 0x1 0x0 0x0 0x83b0288 0x1 0x0 0x0 0x83b02a8 0x1 0x0 0x0 0x83b020c 0x1 0x0 0x0 0x83b022c 0x1 0x0 0x0 0x83b024c 0x1 0x0 0x0 0x83b026c 0x1 0x0 0x0 0x83b028c 0x1 0x0 0x0 0x83b02ac 0x1 0x0 0x0 0x83b0400 0x1 0x0 0x0 0x83b0404 0x1 0x0 0x0 0x83b0408 0x1 0x0 0x0 0x8302028 0x1 0x0 0x0 0xb2b4520 0x1 0x0 0x0 0xb2b1020 0x1 0x0 0x0 0xb2b1024 0x1 0x0 0x0 0xb2b1030 0x1 0x0 0x0 0xb2b1200 0x1 0x0 0x0 0xb2b1214 0x1 0x0 0x0 0xb2b1228 0x1 0x0 0x0 0xb2b123c 0x1 0x0 0x0 0xb2b1250 0x1 0x0 0x0 0xb2b1204 0x1 0x0 0x0 0xb2b1218 0x1 0x0 0x0 0xb2b122c 0x1 0x0 0x0 0xb2b1240 0x1 0x0 0x0 0xb2b1254 0x1 0x0 0x0 0xb2b1208 0x1 0x0 0x0 0xb2b121c 0x1 0x0 0x0 0xb2b1230 0x1 0x0 0x0 0xb2b1244 0x1 0x0 0x0 0xb2b1258 0x1 0x0 0x0 0xb2b4510 0x1 0x0 0x0 0xb2b4514 0x1 0x0 0x0 0xb2b0010 0x1 0x0 0x0 0xb2b0014 0x1 0x0 0x0 0xb2b0900 0x1 0x0 0x0 0xb2b0904 0x1 0x0 0x0 0x17a00204 0x1d 0x0>; + }; + }; + }; + + fragment@37 { + target = <0xffffffff>; + + __overlay__ { + + ss_plog@B4400000 { + compatible = "ss_plog"; + no-map; + reg = <0x0 0xb4400000 0x0 0x200000>; + }; + + ramoops@B4600000 { + compatible = "ramoops"; + reg = <0x0 0xb4600000 0x0 0x100000>; + record-size = <0x40000>; + console-size = <0x40000>; + ftrace-size = <0x40000>; + pmsg-size = <0x40000>; + }; + + sec_debug_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4700000 0x0 0x800000>; + phandle = <0xbc>; + }; + + sec_debug_autocomment@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4f00000 0x0 0x1000>; + phandle = <0xbd>; + }; + + sec_debug_rdx_bootdev@0 { + no-ship; + reg = <0x1 0x0 0x0 0x5900000>; + phandle = <0xbe>; + }; + + kaslr_region@A0001000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xa0001000 0x0 0x1000>; + phandle = <0xbf>; + }; + + rkp_region@B0200000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xb0200000 0x0 0x200000>; + phandle = <0xc0>; + }; + + hdm_region@A1000000 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xa1000000 0x0 0x1000>; + phandle = <0x54>; + }; + + modem_shared_mem_region@B5000000 { + compatible = "modem-removed-dma-pool"; + no-map; + reg = <0x0 0xb5000000 0x0 0x6000000>; + phandle = <0x53>; + }; + }; + }; + + fragment@38 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x80b00000 0x0 0x7100000>; + }; + }; + + fragment@39 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x8b000000 0x0 0x8900000>; + }; + }; + + fragment@40 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x93c00000 0x0 0x3e00000>; + }; + }; + + fragment@41 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97a00000 0x0 0x500000>; + }; + }; + + fragment@42 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97f00000 0x0 0x500000>; + }; + }; + + fragment@43 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98400000 0x0 0x500000>; + }; + }; + + fragment@44 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98900000 0x0 0x1e00000>; + }; + }; + + fragment@45 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9e000000 0x0 0x2000000>; + }; + }; + + fragment@46 { + target = <0xffffffff>; + + __overlay__ { + size = <0x0 0x2000000>; + }; + }; + + fragment@47 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@48 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@49 { + target = <0xffffffff>; + + __overlay__ { + + upload_cause@66c { + compatible = "qcom,msm-imem-upload_cause"; + reg = <0x66c 0x4>; + }; + }; + }; + + fragment@50 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@51 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@52 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@53 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@54 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@55 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@56 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@57 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@58 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@59 { + target = <0xffffffff>; + + __overlay__ { + + dwc3@a600000 { + maximum-speed = "high-speed"; + }; + }; + }; + + fragment@60 { + target = <0xffffffff>; + + __overlay__ { + + input_booster { + status = "okay"; + compatible = "input_booster"; + #address-cells = <0x1>; + #size-cells = <0x0>; + + booster_key@1 { + input_booster,label = "KEY"; + input_booster,type = <0x0>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0xc8>; + input_booster,tail_times = <0x0>; + }; + + booster_key@2 { + input_booster,label = "TOUCHKEY"; + input_booster,type = <0x1>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x0>; + input_booster,tail_times = <0x12c>; + }; + + booster_key@3 { + input_booster,label = "TOUCH"; + input_booster,type = <0x2>; + input_booster,levels = <0x1 0x2 0x3>; + input_booster,cpu_freqs = <0x135600 0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2 0x2>; + input_booster,ddr_freqs = <0x3f9 0x3f9 0x3f9>; + input_booster,lpm_bias = <0x5 0x5 0x5>; + input_booster,head_times = <0xc8 0xc8 0x0>; + input_booster,tail_times = <0x0 0x0 0x12c>; + }; + + booster_key@4 { + input_booster,label = "MULTITOUCH"; + input_booster,type = <0x3>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x3e8 0x0>; + input_booster,tail_times = <0x0 0x1f4>; + }; + + booster_key@5 { + input_booster,label = "KEYBOARD"; + input_booster,type = <0x4>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x135600>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x82 0x82>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@6 { + input_booster,label = "MOUSE"; + input_booster,type = <0x5>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@7 { + input_booster,label = "MOUSE WHEEL"; + input_booster,type = <0x6>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@8 { + input_booster,label = "PEN HOVER"; + input_booster,type = <0x7>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@9 { + input_booster,label = "PEN"; + input_booster,type = <0x8>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x17bb00 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x258>; + }; + + booster_key@10 { + input_booster,label = "KEY_TWO"; + input_booster,type = <0x9>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x17bb00>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x2bc>; + input_booster,tail_times = <0x2bc>; + }; + }; + + sec_smem@0 { + compatible = "samsung,sec-smem"; + status = "okay"; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_4 { + compatible = "qcom,memshare-peripheral"; + memory-region = <0x53>; + qcom,peripheral-size = <0x2000000>; + qcom,reserved-size = <0x4000000>; + qcom,client-id = <0x3>; + qcom,allocate-boot-time; + label = "modem"; + }; + }; + + samsung,sec_misc { + qfprom_jtag,reg = <0x780180>; + }; + + usb-notifier { + compatible = "samsung,usb-notifier"; + qcom,disable_control_en = <0x1>; + qcom,unsupport_host_en = <0x0>; + phandle = <0xc1>; + }; + + samsung,sec_hdm { + memory-region = <0x54>; + }; + + argos { + compatible = "samsung,argos"; + #address-cells = <0x1>; + + boot_device@1 { + net_boost,label = "WIFI"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@2 { + net_boost,label = "WIFI TX"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0xc8 0x21b100 0x0 0x1b8a00 0x0 0x0 0x0 0x1 0x1 0x1>; + }; + + boot_device@3 { + net_boost,label = "WIFI RX"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@4 { + net_boost,label = "SWLAN"; + net_boost,node = "swlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@5 { + net_boost,label = "P2P"; + net_boost,node = "p2p-wlan0-0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@6 { + net_boost,label = "IPA"; + net_boost,node = "rmnet_ipa0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + }; + }; + }; + + fragment@61 { + target = <0xffffffff>; + + __overlay__ { + + android { + + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_system,recovery,dtbo,abl,xbl,tz,hyp"; + }; + }; + }; + }; + + fragment@62 { + target = <0xffffffff>; + + __overlay__ { + qcom,smem-states = <0xffffffff 0x0 0xffffffff 0x4 0xffffffff 0x5>; + qcom,smem-state-names = "qcom,force-stop", "qcom,stop-reason-0", "qcom,stop-reason-1"; + }; + }; + + fragment@63 { + target = <0xffffffff>; + + __overlay__ { + spm-level = <0x3>; + }; + }; + + fragment@64 { + target = <0xffffffff>; + + __overlay__ { + i2c18 = "/soc/i2c@18"; + }; + }; + + fragment@65 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x3>; + + imp_list { + #list-imp-cells = <0x3>; + phandle = <0x26>; + }; + }; + }; + + fragment@66 { + target = <0xffffffff>; + + __overlay__ { + + msm_cdc_pinctrl_quin { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x55 0x56 0x57 0x58>; + pinctrl-1 = <0x59 0x5a 0x5b 0x5c>; + qcom,lpi-gpios; + phandle = <0x60>; + }; + }; + }; + + fragment@67 { + target = <0xffffffff>; + + __overlay__ { + + sec-audio-sysfs { + compatible = "samsung,audio-sysfs"; + status = "okay"; + audio,num-amp = <0x2>; + }; + + samsung,q6audio-adaptation { + compatible = "samsung,q6audio-adaptation"; + adaptation,device-tx-port-id = <0xb037>; + adaptation,spk-rx-port-id = <0x1016>; + adaptation,usb-rx-port-id = <0x7000>; + adaptation,bt-rx-port-id = <0x400e>; + adaptation,headset-rx-port-id = <0xb030>; + phandle = <0x5f>; + }; + + det_zones { + #list-det-cells = <0x2>; + phandle = <0x25>; + }; + + i2c@18 { + status = "ok"; + cell-index = <0x12>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x58 0x0 0xffffffff 0x59 0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x5d 0x5e>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xc2>; + + tas256x@4c { + #sound-dai-cells = <0x0>; + compatible = "ti, tas256x"; + status = "ok"; + reg = <0x4c>; + ti,reset-gpio = <0xffffffff 0x5e 0x0>; + ti,irq-gpio = <0xffffffff 0x5a 0x0>; + ti,left-channel = <0x4d>; + ti,right-channel = <0x4c>; + ti,channels = <0x2>; + ti,iv-width = <0x8>; + ti,vbat-mon = <0x1>; + ti,port_id = <0x1016>; + phandle = <0xc3>; + }; + }; + }; + }; + + fragment@68 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,wcn-btfm = <0x1>; + qcom,ext-disp-audio-rx = <0x0>; + qcom,mi2s-audio-intf = <0x1>; + asoc-platform = <0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0x5f>; + asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-pcm-dsp.2", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-compress-dsp", "msm-pcm-hostless", "msm-pcm-afe", "msm-lsm-client", "msm-pcm-routing", "msm-compr-dsp", "msm-pcm-dsp-noirq", "q6audio-adaptation"; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS3", "MIC BIAS3", "Analog Mic4", "AMIC5", "MIC BIAS4", "MIC BIAS4", "Analog Mic5", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT"; + qcom,msm-mbhc-hs-mic-max-threshold-mv = <0x270f>; + qcom,msm-mbhc-hs-mic-min-threshold-mv = <0x280>; + qcom,cdc-dmic01-gpios; + qcom,cdc-dmic23-gpios; + qcom,cdc-dmic45-gpios; + qcom,quin-mi2s-gpios = <0x60>; + asoc-codec = <0xffffffff 0xffffffff>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec"; + qcom,wsa-max-devs = <0x0>; + qcom,wsa-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x32 0xffffffff>; + fsa4480-i2c-handle; + qcom,fm-lna-gpios = <0xffffffff 0x54 0x0>; + qcom,msm-mbhc-gnd-det = <0x1>; + }; + }; + + fragment@69 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@70 { + target = <0xffffffff>; + + __overlay__ { + + tas25xx_gpio_default { + phandle = <0x5d>; + + mux { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + function = "gpio"; + }; + + config { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + bias-disable; + }; + }; + + fm_lna_default { + phandle = <0x5e>; + + mux { + pins = "gpio84"; + function = "gpio"; + }; + + config { + pins = "gpio84"; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@71 { + target = <0xffffffff>; + + __overlay__ { + + grip_i2c { + + grip_i2c_active { + phandle = <0xa9>; + + grip_i2c_active { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + + grip_i2c_suspend { + phandle = <0xc4>; + + grip_i2c_suspend { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + }; + + s2mpb03_i2c_sda_default { + phandle = <0x61>; + + mux { + pins = "gpio25"; + function = "gpio"; + }; + + config { + pins = "gpio25"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + s2mpb03_i2c_scl_default { + phandle = <0x62>; + + mux { + pins = "gpio26"; + function = "gpio"; + }; + + config { + pins = "gpio26"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + cam_sensor_mclk0_active { + phandle = <0x7d>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk0_suspend { + phandle = <0x80>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk1_active { + phandle = <0x96>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk1_suspend { + phandle = <0x98>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk2_active { + phandle = <0x8d>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk2_suspend { + phandle = <0x90>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk3_active { + phandle = <0x84>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk3_suspend { + phandle = <0x88>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk4_active { + phandle = <0x9c>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk4_suspend { + phandle = <0x9f>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + rcam1_sensor_reset_active { + phandle = <0x7e>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_reset_suspend { + phandle = <0x81>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_active { + phandle = <0x97>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_suspend { + phandle = <0x99>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_active { + phandle = <0x85>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_suspend { + phandle = <0x89>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_active { + phandle = <0x8e>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_suspend { + phandle = <0x91>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_active { + phandle = <0x9d>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_suspend { + phandle = <0xa0>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_active { + phandle = <0x6f>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_suspend { + phandle = <0x70>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_active { + phandle = <0x8f>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_suspend { + phandle = <0x92>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_active { + phandle = <0x86>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_suspend { + phandle = <0x8a>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_active { + phandle = <0x9e>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_suspend { + phandle = <0xa1>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_active { + phandle = <0x87>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-disable; + output-high; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_suspend { + phandle = <0x8b>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vdig_active { + phandle = <0xc5>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vdig_suspend { + phandle = <0xc6>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_active { + phandle = <0xc7>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_suspend { + phandle = <0xc8>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + if_pmic_i2c_pins { + phandle = <0xc9>; + + if_pmic_i2c_sleep { + phandle = <0x68>; + + mux { + pins = "gpio115", "gpio116"; + function = "gpio"; + }; + + config { + pins = "gpio115", "gpio116"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + usbpd_i2c_pins { + phandle = <0xca>; + + usbpd_i2c_sleep { + phandle = <0x6a>; + + mux { + pins = "gpio53", "gpio54"; + function = "gpio"; + }; + + config { + pins = "gpio53", "gpio54"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + mcu_reset_active { + phandle = <0x72>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_reset_suspend { + phandle = <0x74>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + mcu_clk_active { + phandle = <0x73>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_clk_suspend { + phandle = <0x75>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + torch_en_active { + phandle = <0x7f>; + + mux { + pins = "gpio67", "gpio22"; + function = "gpio"; + }; + + config { + pins = "gpio67", "gpio22"; + bias-pull-down; + output-high; + drive-strength = <0x2>; + }; + }; + + torch_en_suspend { + phandle = <0x82>; + + mux { + pins = "gpio67", "gpio22"; + function = "gpio"; + }; + + config { + pins = "gpio67", "gpio22"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + }; + }; + + fragment@72 { + target = <0xffffffff>; + + __overlay__ { + + grip_int_active { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xaa>; + }; + + grip_int_suspend { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xcb>; + }; + }; + }; + + fragment@73 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x48 0x4a 0x4e 0x54 0x56 0x57 0x5b 0x5d 0x5f 0x62 0x6d 0x72 0x73 0x74 0x75 0x76>; + }; + }; + + fragment@74 { + target = <0xffffffff>; + + __overlay__ { + + qcom,pm6150@0 { + + qcom,power-on@800 { + interrupts = <0x0 0x8 0x0 0x0 0x0 0x8 0x1 0x0 0x0 0x8 0x4 0x0 0x0 0x8 0x5 0x0>; + interrupt-names = "kpdpwr", "resin", "resin-bark", "kpdpwr-resin-bark"; + qcom,s3-debounce = <0x80>; + + qcom,pon_1 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_2 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_3 { + qcom,pon-type = <0x3>; + qcom,support-reset = <0x1>; + qcom,pull-up = <0x1>; + qcom,s1-timer = <0x1a40>; + qcom,s2-timer = <0x3e8>; + qcom,s2-type = <0x8>; + qcom,use-bark; + }; + }; + }; + }; + }; + + fragment@75 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@76 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@77 { + target = <0xffffffff>; + + __overlay__ { + + sec_thermistor@0 { + compatible = "samsung,sec-ap-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "ap_therm"; + adc_array = <0x6a4 0x88e 0xa10 0xbe6 0xdff 0x1090 0x1381 0x16f4 0x1b1c 0x1fb9 0x247b 0x2a3c 0x309d 0x3706 0x3d9d 0x43e8 0x4aa6 0x50c4 0x564a 0x5b4e 0x5faf 0x6379 0x66aa>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@1 { + compatible = "samsung,sec-pa-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "pa_therm"; + adc_array = <0x708 0x8bf 0xa47 0xc19 0xe38 0x10c2 0x13c0 0x173d 0x1b5e 0x1fff 0x24cf 0x2a88 0x30de 0x3756 0x3dea 0x443d 0x4add 0x5100 0x5683 0x5b96 0x5fef 0x63ab 0x66d8>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@2 { + compatible = "samsung,sec-wf-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4f>; + io-channel-names = "wf_therm"; + adc_array = <0x708 0x8d5 0xa66 0xc35 0xe55 0x10d4 0x13e0 0x1766 0x1b81 0x2021 0x24f3 0x2aa3 0x30f4 0x376c 0x3e09 0x445e 0x4aec 0x5105 0x568c 0x5ba3 0x5ff9 0x63b4 0x66e0>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + i2c@2 { + cell-index = <0x2>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x19 0x0 0xffffffff 0x1a 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x61 0x62>; + phandle = <0xcc>; + + s2mpb03@56 { + compatible = "samsung,s2mpb03pmic"; + reg = <0x56>; + additional_reg_init; + + regulators { + + s2mpb03-ldo1 { + regulator-name = "s2mpb03-ldo1"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x100590>; + phandle = <0x95>; + }; + + s2mpb03-ldo2 { + regulator-name = "s2mpb03-ldo2"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x7c>; + }; + + s2mpb03-ldo3 { + regulator-name = "s2mpb03-ldo3"; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x7a>; + }; + + s2mpb03-ldo4 { + regulator-name = "s2mpb03-ldo4"; + regulator-min-microvolt = <0x124f80>; + regulator-max-microvolt = <0x124f80>; + phandle = <0x8c>; + }; + + s2mpb03-ldo5 { + regulator-name = "s2mpb03-ldo5"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x7b>; + }; + + s2mpb03-ldo6 { + regulator-name = "s2mpb03-ldo6"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x94>; + }; + + s2mpb03-ldo7 { + regulator-name = "s2mpb03-ldo7"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2ab980>; + phandle = <0x71>; + }; + }; + }; + }; + }; + }; + + fragment@78 { + target = <0xffffffff>; + + __overlay__ { + interrupts = <0x0 0xc0 0x0 0x0 0x0 0xc1 0x0 0x0 0x0 0xc2 0x0 0x0 0x0 0xc3 0x0 0x0 0x0 0xc4 0x0 0x0 0x0 0xc6 0x0 0x0 0x0 0xc7 0x0 0x0 0x0 0xc9 0x0 0x0>; + interrupt-names = "pm6150_gpio1", "pm6150_gpio2", "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio5", "pm6150_gpio7", "pm6150_gpio8", "pm6150_gpio10"; + qcom,gpios-disallowed = <0x6 0x9>; + }; + }; + + fragment@79 { + target = <0xffffffff>; + + __overlay__ { + + ap_therm { + reg = <0x4e>; + label = "ap_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@80 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm { + reg = <0x4e>; + label = "pa_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + + wf_therm { + reg = <0x4f>; + label = "wf_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@81 { + target = <0xffffffff>; + + __overlay__ { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x2dc6c0>; + regulator-boot-on; + }; + }; + + fragment@82 { + target = <0xffffffff>; + + __overlay__ { + + tsp_int { + phandle = <0x65>; + + mux { + pins = "gpio9"; + function = "gpio"; + }; + + config { + pins = "gpio9"; + input-enable; + bias-disable; + }; + }; + + qupv3_se7_i2c_pins_tsp { + phandle = <0xcd>; + + qupv3_se7_i2c_active_tsp { + phandle = <0x63>; + + mux { + pins = "gpio6", "gpio7"; + function = "qup11"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + qupv3_se7_i2c_sleep_tsp { + phandle = <0x64>; + + mux { + pins = "gpio6", "gpio7"; + function = "gpio"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <0x2>; + bias-disable; + }; + }; + }; + }; + }; + + fragment@83 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x63>; + pinctrl-1 = <0x64>; + + synaptics_tcm@20 { + status = "disabled"; + }; + + atmel_mxt_ts@4a { + status = "disabled"; + }; + + touchscreen@20 { + status = "okay"; + compatible = "zinitix,zt_ts_device"; + reg = <0x20>; + pinctrl-names = "on_state", "off_state"; + pinctrl-0 = <0x65>; + pinctrl-1 = <0x65>; + avdd-supply = <0xffffffff>; + zinitix,gpio_ldo_en; + zinitix,irq_type = <0x2008>; + zinitix,x_resolution = <0x438>; + zinitix,y_resolution = <0x960>; + zinitix,page_size = <0x80>; + zinitix,irq_gpio = <0xffffffff 0x9 0x2008>; + zinitix,chip_name = "ZT7650"; + zinitix,firmware_name = "tsp_zinitix/zt7650_a52.bin"; + zinitix,spay; + zinitix,aod; + zinitix,aot; + zinitix,mis_cal_check; + support_ear_detect_mode; + support_dex_mode; + zinitix,bringup = <0x0>; + zinitix,ss_touch_num = <0x1>; + phandle = <0xce>; + }; + + touchscreen@49 { + status = "disabled"; + compatible = "stm,fts_touch"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x65>; + dvdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + stm,irq_gpio = <0xffffffff 0x9 0x2008>; + stm,max_coords = <0xfff 0xfff>; + stm,firmware_name = "tsp_stm/fts5cu56a_a52.bin"; + stm,tclm_level = <0x2>; + stm,afe_base = <0x14>; + stm,bringup = <0x0>; + stm,support_fod; + stm,enable_settings_aot; + support_ear_detect; + support_mis_calibration_test; + support_dex_mode; + support_open_short_test; + support_sram_test; + stm,ss_touch_num = <0x1>; + phandle = <0xcf>; + }; + }; + }; + + fragment@84 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + + key_vol_up_default { + pins = "gpio8"; + function = "normal"; + input-enable; + bias-pull-up; + power-source = <0x0>; + phandle = <0x66>; + }; + }; + }; + }; + + fragment@85 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "default"; + pinctrl-0 = <0x66>; + + vol_up { + label = "volume_up"; + gpios = <0xffffffff 0x8 0x1>; + linux,input-type = <0x1>; + linux,code = <0x73>; + debounce-interval = <0xf>; + }; + }; + }; + + fragment@86 { + target = <0xffffffff>; + + __overlay__ { + + ss_touch { + compatible = "samsung,ss_touch"; + ss_touch,numbers = <0x1>; + }; + }; + }; + + fragment@87 { + target = <0xffffffff>; + + __overlay__ { + + self_display_FC3_dtsi { + label = "self_display_FC3_dtsi"; + samsung,support_self_display; + samsung,self_mask_setting_pre_revA = [29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 02 75 10]; + samsung,self_mask_setting_post_revA = [29 01 00 00 00 00 02 75 00]; + samsung,self_mask_on_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 00 00 00 95 07 9e 09 5f 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_on_factory_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_off_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_disp_debug_rx_cmds_revA = [06 01 00 00 00 00 01 7f 04 01]; + samsung,self_mask_check_tx_pre1_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 04 b0 00 27 d8 29 01 00 00 00 00 02 d8 16 29 01 00 00 00 00 0a bf 01 07 00 00 00 10 00 00 00 29 01 00 00 11 00 02 7a 00 29 01 00 00 00 00 02 75 10 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,self_mask_check_tx_pre2_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 02 75 00 29 01 00 00 22 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 01 f4 02 33 09 60 09 61 00 00 ff ff ff 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,mask_crc_pass_data = [d3 9b]; + samsung,self_mask_check_rx_cmds_revA = [06 01 00 00 00 00 01 14 02 00]; + samsung,self_mask_check_tx_post_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 00 00 00 00 00 29 01 00 00 00 00 02 bf 00 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + phandle = <0x67>; + }; + }; + }; + + fragment@88 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + label = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0x1e6>; + qcom,mdss-brightness-max-level = <0x1e6>; + qcom,mdss-brightness-default-level = <0xff>; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-t-clk-pre = <0x3e>; + qcom,mdss-dsi-t-clk-post = <0x10>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x43>; + qcom,mdss-pan-physical-height-dimension = <0x96>; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-t-clk-pre-extend; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "irq_check"; + samsung,panel-vendor = "SDC"; + samsung,disp-model = "AMS646YD01"; + samsung,support_gamma_mode2; + samsung,skip_read_on_pre; + samsung,elvss_interpolation_temperature = <0xfffffff0>; + samsung,support_lpm; + samsung,support_gpara; + samsung,pointing_gpara; + samsung,two_byte_gpara; + samsung,rsc_4_frame_idle; + samsung,support_factory_panel_swap; + samsung,support-optical-fingerprint; + samsung,delayed-display-on = <0x1>; + samsung,support_vrr_based_bl; + samsung,esd-irq-trigger1 = "falling"; + ss,self_display = <0x67>; + samsung,level0_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 9f a5 a5]; + samsung,level0_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 9f 5a 5a]; + samsung,level1_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 5a 5a]; + samsung,level1_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 a5 a5]; + samsung,level2_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 fc 5a 5a]; + samsung,level2_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 fc a5 a5]; + samsung,brightness_tx_cmds_revA = <0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100>; + samsung,display_on_tx_cmds_revA = [29 00 00 00 00 00 03 9f a5 a5 05 00 00 00 00 00 02 29 00 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,display_off_tx_cmds_revA = [05 01 00 00 00 00 02 28 00]; + samsung,reg_read_pos_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 00 00]; + samsung,mtp_write_sysfs_tx_cmds_revA = <0x29000000 0x3d00 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + samsung,panel_ltps_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 50 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,smooth_dimming_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 91 63 29 00 00 00 00 00 02 63 20 29 01 00 00 11 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,gamma_mode2_normal_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26360 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x7290000 0x2 0x53202900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0002900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revE = <0x29000000 0x391 0x2012900 0x0 0x2532029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 1c 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,gamma_mode2_hbm_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26320 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x290000 0x2 0x53e02900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0072900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revE = <0x29000000 0x391 0x2002900 0x0 0x253e029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 14 29 00 00 00 00 00 02 53 e0 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,vrr_tx_cmds_revD = [29 00 00 00 00 00 03 60 00 04 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 b4 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a c0 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 02 29 00 00 00 00 00 02 f7 0f]; + samsung,vrr_tx_cmds_revA = [29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f]; + samsung,acl_on_tx_cmds_revA = [29 00 00 00 00 00 04 b0 03 b3 65 29 00 00 00 00 00 14 65 55 00 b0 51 66 98 15 55 55 55 08 f1 c6 48 40 00 20 10 09 29 00 00 00 00 00 02 55 03]; + samsung,acl_off_tx_cmds_revA = [29 01 00 00 00 00 02 55 00]; + samsung,manufacture_id0_rx_cmds_revA = [06 01 00 00 00 00 01 da 01 00 00]; + samsung,manufacture_id1_rx_cmds_revA = [06 01 00 00 00 00 01 db 01 00 00]; + samsung,manufacture_id2_rx_cmds_revA = [06 01 00 00 00 00 01 dc 01 00 00]; + samsung,module_info_rx_cmds_revA = [06 01 00 00 00 00 01 a1 0b 00 00]; + samsung,octa_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 04 00 0b]; + samsung,cell_id_rx_cmds_revA = [06 01 00 00 00 00 01 92 10 00 02]; + samsung,ddi_id_rx_cmds_revA = [06 01 00 00 00 00 01 d6 05 00 00]; + samsung,mtp_read_sysfs_rx_cmds_revA = [06 01 00 00 00 00 01 00 00 00 00]; + samsung,candela_map_table_revA = <0x0 0x0 0x0 0x2 0x2 0x1 0x1 0x1 0x3 0x2 0x2 0x2 0x2 0x4 0x3 0x3 0x3 0x3 0x5 0x3 0x4 0x4 0x4 0x7 0x4 0x5 0x5 0x5 0x8 0x5 0x6 0x6 0x6 0xa 0x5 0x7 0x7 0x7 0xc 0x6 0x8 0x8 0x8 0xd 0x7 0x9 0x9 0x9 0xf 0x7 0xa 0xa 0xa 0x11 0x8 0xb 0xb 0xb 0x13 0x9 0xc 0xc 0xc 0x15 0xa 0xd 0xd 0xd 0x18 0xb 0xe 0xe 0xe 0x1a 0xc 0xf 0xf 0xf 0x1c 0xd 0x10 0x10 0x10 0x1e 0xd 0x11 0x11 0x11 0x20 0xe 0x12 0x12 0x12 0x23 0xf 0x13 0x13 0x13 0x25 0x10 0x14 0x14 0x14 0x28 0x11 0x15 0x15 0x15 0x2a 0x12 0x16 0x16 0x16 0x2d 0x13 0x17 0x17 0x17 0x2f 0x14 0x18 0x18 0x18 0x32 0x15 0x19 0x19 0x19 0x34 0x16 0x1a 0x1a 0x1a 0x37 0x17 0x1b 0x1b 0x1b 0x3a 0x19 0x1c 0x1c 0x1c 0x3c 0x1a 0x1d 0x1d 0x1d 0x3f 0x1b 0x1e 0x1e 0x1e 0x42 0x1c 0x1f 0x1f 0x1f 0x45 0x1d 0x20 0x20 0x20 0x47 0x1e 0x21 0x21 0x21 0x4a 0x1f 0x22 0x22 0x22 0x4d 0x20 0x23 0x23 0x23 0x50 0x22 0x24 0x24 0x24 0x53 0x23 0x25 0x25 0x25 0x56 0x24 0x26 0x26 0x26 0x59 0x25 0x27 0x27 0x27 0x5c 0x26 0x28 0x28 0x28 0x5f 0x28 0x29 0x29 0x29 0x62 0x29 0x2a 0x2a 0x2a 0x65 0x2a 0x2b 0x2b 0x2b 0x68 0x2b 0x2c 0x2c 0x2c 0x6b 0x2d 0x2d 0x2d 0x2d 0x6e 0x2e 0x2e 0x2e 0x2e 0x71 0x2f 0x2f 0x2f 0x2f 0x74 0x30 0x30 0x30 0x30 0x77 0x32 0x31 0x31 0x31 0x7b 0x33 0x32 0x32 0x32 0x7e 0x34 0x33 0x33 0x33 0x81 0x36 0x34 0x34 0x34 0x84 0x37 0x35 0x35 0x35 0x88 0x38 0x36 0x36 0x36 0x8b 0x3a 0x37 0x37 0x37 0x8e 0x3b 0x38 0x38 0x38 0x92 0x3c 0x39 0x39 0x39 0x95 0x3e 0x3a 0x3a 0x3a 0x98 0x3f 0x3b 0x3b 0x3b 0x9c 0x40 0x3c 0x3c 0x3c 0x9f 0x42 0x3d 0x3d 0x3d 0xa2 0x43 0x3e 0x3e 0x3e 0xa6 0x44 0x3f 0x3f 0x3f 0xa9 0x46 0x40 0x40 0x40 0xad 0x47 0x41 0x41 0x41 0xb0 0x49 0x42 0x42 0x42 0xb4 0x4a 0x43 0x43 0x43 0xb7 0x4c 0x44 0x44 0x44 0xbb 0x4d 0x45 0x45 0x45 0xbe 0x4e 0x46 0x46 0x46 0xc2 0x50 0x47 0x47 0x47 0xc5 0x51 0x48 0x48 0x48 0xc9 0x53 0x49 0x49 0x49 0xcd 0x54 0x4a 0x4a 0x4a 0xd0 0x56 0x4b 0x4b 0x4b 0xd4 0x57 0x4c 0x4c 0x4c 0xd7 0x59 0x4d 0x4d 0x4d 0xdb 0x5a 0x4e 0x4e 0x4e 0xdf 0x5c 0x4f 0x4f 0x4f 0xe3 0x5d 0x50 0x50 0x50 0xe6 0x5f 0x51 0x51 0x51 0xea 0x60 0x52 0x52 0x52 0xee 0x62 0x53 0x53 0x53 0xf1 0x63 0x54 0x54 0x54 0xf5 0x65 0x55 0x55 0x55 0xf9 0x66 0x56 0x56 0x56 0xfd 0x68 0x57 0x57 0x57 0x101 0x69 0x58 0x58 0x58 0x104 0x6b 0x59 0x59 0x59 0x108 0x6c 0x5a 0x5a 0x5a 0x10c 0x6e 0x5b 0x5b 0x5b 0x110 0x70 0x5c 0x5c 0x5c 0x114 0x71 0x5d 0x5d 0x5d 0x118 0x73 0x5e 0x5e 0x5e 0x11b 0x74 0x5f 0x5f 0x5f 0x11f 0x76 0x60 0x60 0x60 0x123 0x77 0x61 0x61 0x61 0x127 0x79 0x62 0x62 0x62 0x12b 0x7b 0x63 0x63 0x63 0x12f 0x7c 0x64 0x64 0x64 0x133 0x7e 0x65 0x65 0x65 0x137 0x7f 0x66 0x66 0x66 0x13b 0x81 0x67 0x67 0x67 0x13f 0x83 0x68 0x68 0x68 0x143 0x84 0x69 0x69 0x69 0x147 0x86 0x6a 0x6a 0x6a 0x14b 0x88 0x6b 0x6b 0x6b 0x14f 0x89 0x6c 0x6c 0x6c 0x153 0x8b 0x6d 0x6d 0x6d 0x157 0x8c 0x6e 0x6e 0x6e 0x15b 0x8e 0x6f 0x6f 0x6f 0x15f 0x90 0x70 0x70 0x70 0x163 0x91 0x71 0x71 0x71 0x168 0x93 0x72 0x72 0x72 0x16c 0x95 0x73 0x73 0x73 0x170 0x96 0x74 0x74 0x74 0x174 0x98 0x75 0x75 0x75 0x178 0x9a 0x76 0x76 0x76 0x17c 0x9c 0x77 0x77 0x77 0x180 0x9d 0x78 0x78 0x78 0x185 0x9f 0x79 0x79 0x79 0x189 0xa1 0x7a 0x7a 0x7a 0x18d 0xa2 0x7b 0x7b 0x7b 0x191 0xa4 0x7c 0x7c 0x7c 0x195 0xa6 0x7d 0x7d 0x7d 0x19a 0xa7 0x7e 0x7e 0x7e 0x19e 0xa9 0x7f 0x7f 0x7f 0x1a2 0xab 0x80 0x80 0x80 0x1a6 0xad 0x81 0x81 0x81 0x1ab 0xae 0x82 0x82 0x82 0x1af 0xb0 0x83 0x83 0x83 0x1b3 0xb2 0x84 0x84 0x84 0x1b8 0xb4 0x85 0x85 0x85 0x1bc 0xb5 0x86 0x86 0x86 0x1c0 0xb7 0x87 0x87 0x87 0x1c5 0xb9 0x88 0x88 0x88 0x1c9 0xbb 0x89 0x89 0x89 0x1cd 0xbc 0x8a 0x8a 0x8a 0x1d1 0xbe 0x8b 0x8b 0x8b 0x1d6 0xc0 0x8c 0x8c 0x8c 0x1da 0xc2 0x8d 0x8d 0x8d 0x1de 0xc3 0x8e 0x8e 0x8e 0x1e3 0xc5 0x8f 0x8f 0x8f 0x1e7 0xc7 0x90 0x90 0x90 0x1eb 0xc9 0x91 0x91 0x91 0x1f0 0xcb 0x92 0x92 0x92 0x1f4 0xcc 0x93 0x93 0x93 0x1f8 0xce 0x94 0x94 0x94 0x1fd 0xd0 0x95 0x95 0x95 0x201 0xd2 0x96 0x96 0x96 0x206 0xd4 0x97 0x97 0x97 0x20a 0xd6 0x98 0x98 0x98 0x20e 0xd7 0x99 0x99 0x99 0x213 0xd9 0x9a 0x9a 0x9a 0x217 0xdb 0x9b 0x9b 0x9b 0x21c 0xdd 0x9c 0x9c 0x9c 0x220 0xdf 0x9d 0x9d 0x9d 0x225 0xe1 0x9e 0x9e 0x9e 0x229 0xe2 0x9f 0x9f 0x9f 0x22e 0xe4 0xa0 0xa0 0xa0 0x232 0xe6 0xa1 0xa1 0xa1 0x237 0xe8 0xa2 0xa2 0xa2 0x23b 0xea 0xa3 0xa3 0xa3 0x240 0xec 0xa4 0xa4 0xa4 0x244 0xed 0xa5 0xa5 0xa5 0x249 0xef 0xa6 0xa6 0xa6 0x24d 0xf1 0xa7 0xa7 0xa7 0x252 0xf3 0xa8 0xa8 0xa8 0x256 0xf5 0xa9 0xa9 0xa9 0x25b 0xf7 0xaa 0xaa 0xaa 0x260 0xf9 0xab 0xab 0xab 0x264 0xfb 0xac 0xac 0xac 0x269 0xfd 0xad 0xad 0xad 0x26d 0xfe 0xae 0xae 0xae 0x272 0x100 0xaf 0xaf 0xaf 0x277 0x102 0xb0 0xb0 0xb0 0x27b 0x104 0xb1 0xb1 0xb1 0x280 0x106 0xb2 0xb2 0xb2 0x284 0x108 0xb3 0xb3 0xb3 0x289 0x10a 0xb4 0xb4 0xb4 0x28e 0x10c 0xb5 0xb5 0xb5 0x292 0x10e 0xb6 0xb6 0xb6 0x297 0x110 0xb7 0xb7 0xb7 0x29c 0x112 0xb8 0xb8 0xb8 0x2a0 0x113 0xb9 0xb9 0xb9 0x2a5 0x115 0xba 0xba 0xba 0x2aa 0x117 0xbb 0xbb 0xbb 0x2ae 0x119 0xbc 0xbc 0xbc 0x2b3 0x11b 0xbd 0xbd 0xbd 0x2b8 0x11d 0xbe 0xbe 0xbe 0x2bd 0x11f 0xbf 0xbf 0xbf 0x2c1 0x121 0xc0 0xc0 0xc0 0x2c6 0x123 0xc1 0xc1 0xc1 0x2cb 0x125 0xc2 0xc2 0xc2 0x2d0 0x127 0xc3 0xc3 0xc3 0x2d4 0x129 0xc4 0xc4 0xc4 0x2d9 0x12b 0xc5 0xc5 0xc5 0x2de 0x12d 0xc6 0xc6 0xc6 0x2e3 0x12f 0xc7 0xc7 0xc7 0x2e8 0x131 0xc8 0xc8 0xc8 0x2ec 0x133 0xc9 0xc9 0xc9 0x2f1 0x135 0xca 0xca 0xca 0x2f6 0x137 0xcb 0xcb 0xcb 0x2fb 0x139 0xcc 0xcc 0xcc 0x300 0x13b 0xcd 0xcd 0xcd 0x304 0x13d 0xce 0xce 0xce 0x309 0x13f 0xcf 0xcf 0xcf 0x30e 0x141 0xd0 0xd0 0xd0 0x313 0x143 0xd1 0xd1 0xd1 0x318 0x145 0xd2 0xd2 0xd2 0x31d 0x147 0xd3 0xd3 0xd3 0x322 0x149 0xd4 0xd4 0xd4 0x327 0x14b 0xd5 0xd5 0xd5 0x32b 0x14d 0xd6 0xd6 0xd6 0x330 0x14f 0xd7 0xd7 0xd7 0x335 0x151 0xd8 0xd8 0xd8 0x33a 0x153 0xd9 0xd9 0xd9 0x33f 0x155 0xda 0xda 0xda 0x344 0x157 0xdb 0xdb 0xdb 0x349 0x159 0xdc 0xdc 0xdc 0x34e 0x15b 0xdd 0xdd 0xdd 0x353 0x15d 0xde 0xde 0xde 0x358 0x15f 0xdf 0xdf 0xdf 0x35d 0x161 0xe0 0xe0 0xe0 0x362 0x163 0xe1 0xe1 0xe1 0x367 0x165 0xe2 0xe2 0xe2 0x36c 0x167 0xe3 0xe3 0xe3 0x371 0x169 0xe4 0xe4 0xe4 0x376 0x16b 0xe5 0xe5 0xe5 0x37b 0x16d 0xe6 0xe6 0xe6 0x380 0x170 0xe7 0xe7 0xe7 0x385 0x172 0xe8 0xe8 0xe8 0x38a 0x174 0xe9 0xe9 0xe9 0x38f 0x176 0xea 0xea 0xea 0x394 0x178 0xeb 0xeb 0xeb 0x399 0x17a 0xec 0xec 0xec 0x39e 0x17c 0xed 0xed 0xed 0x3a3 0x17e 0xee 0xee 0xee 0x3a8 0x180 0xef 0xef 0xef 0x3ad 0x182 0xf0 0xf0 0xf0 0x3b2 0x184 0xf1 0xf1 0xf1 0x3b7 0x186 0xf2 0xf2 0xf2 0x3bc 0x189 0xf3 0xf3 0xf3 0x3c1 0x18b 0xf4 0xf4 0xf4 0x3c7 0x18d 0xf5 0xf5 0xf5 0x3cc 0x18f 0xf6 0xf6 0xf6 0x3d1 0x191 0xf7 0xf7 0xf7 0x3d6 0x193 0xf8 0xf8 0xf8 0x3db 0x195 0xf9 0xf9 0xf9 0x3e0 0x197 0xfa 0xfa 0xfa 0x3e5 0x199 0xfb 0xfb 0xfb 0x3ea 0x19b 0xfc 0xfc 0xfc 0x3f0 0x19e 0xfd 0xfd 0xfd 0x3f5 0x1a0 0xfe 0xfe 0xfe 0x3fa 0x1a2 0xff 0xff 0xff 0x3ff 0x1a4>; + samsung,hbm_candela_map_table_revG = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x2 0x1aa 0x2 0x102 0x102 0x4 0x1ac 0x3 0x103 0x103 0x6 0x1ae 0x4 0x104 0x104 0x8 0x1b0 0x5 0x105 0x105 0xa 0x1b1 0x6 0x106 0x106 0xc 0x1b3 0x7 0x107 0x107 0xe 0x1b4 0x8 0x108 0x108 0x10 0x1b6 0x9 0x109 0x109 0x12 0x1b8 0xa 0x10a 0x10a 0x14 0x1b9 0xb 0x10b 0x10b 0x16 0x1bb 0xc 0x10c 0x10c 0x18 0x1bc 0xd 0x10d 0x10d 0x1a 0x1be 0xe 0x10e 0x10e 0x1c 0x1c0 0xf 0x10f 0x10f 0x1e 0x1c2 0x10 0x110 0x110 0x20 0x1c3 0x11 0x111 0x111 0x22 0x1c5 0x12 0x112 0x112 0x24 0x1c6 0x13 0x113 0x113 0x25 0x1c8 0x14 0x114 0x114 0x26 0x1ca 0x15 0x115 0x115 0x27 0x1cb 0x16 0x116 0x116 0x28 0x1cd 0x17 0x117 0x117 0x29 0x1ce 0x18 0x118 0x118 0x2a 0x1d0 0x19 0x119 0x119 0x2b 0x1d2 0x1a 0x11a 0x11a 0x2c 0x1d4 0x1b 0x11b 0x11b 0x2d 0x1d5 0x1c 0x11c 0x11c 0x2e 0x1d7 0x1d 0x11d 0x11d 0x2f 0x1d8 0x1e 0x11e 0x11e 0x30 0x1da 0x1f 0x11f 0x11f 0x31 0x1dc 0x20 0x120 0x120 0x32 0x1dd 0x21 0x121 0x121 0x33 0x1df 0x22 0x122 0x122 0x34 0x1e0 0x23 0x123 0x123 0x35 0x1e2 0x24 0x124 0x124 0x36 0x1e4 0x25 0x125 0x125 0x37 0x1e5 0x26 0x126 0x126 0x38 0x1e7 0x27 0x127 0x127 0x39 0x1e8 0x28 0x128 0x128 0x3a 0x1ea 0x29 0x129 0x129 0x3b 0x1ec 0x2a 0x12a 0x12a 0x3c 0x1ee 0x2b 0x12b 0x12b 0x3d 0x1ef 0x2c 0x12c 0x12c 0x3e 0x1f1 0x2d 0x12d 0x12d 0x3f 0x1f2 0x2e 0x12e 0x12e 0x40 0x1f4 0x2f 0x12f 0x12f 0x41 0x1f6 0x30 0x130 0x130 0x42 0x1f7 0x31 0x131 0x131 0x43 0x1f9 0x32 0x132 0x132 0x44 0x1fa 0x33 0x133 0x133 0x45 0x1fc 0x34 0x134 0x134 0x46 0x1fe 0x35 0x135 0x135 0x47 0x200 0x36 0x136 0x136 0x48 0x201 0x37 0x137 0x137 0x49 0x203 0x38 0x138 0x138 0x4a 0x204 0x39 0x139 0x139 0x4b 0x206 0x3a 0x13a 0x13a 0x4c 0x208 0x3b 0x13b 0x13b 0x4d 0x209 0x3c 0x13c 0x13c 0x4e 0x20b 0x3d 0x13d 0x13d 0x4f 0x20c 0x3e 0x13e 0x13e 0x50 0x20e 0x3f 0x13f 0x13f 0x51 0x210 0x40 0x140 0x140 0x52 0x211 0x41 0x141 0x141 0x53 0x213 0x42 0x142 0x142 0x54 0x215 0x43 0x143 0x143 0x55 0x216 0x44 0x144 0x144 0x56 0x218 0x45 0x145 0x145 0x57 0x21a 0x46 0x146 0x146 0x58 0x21b 0x47 0x147 0x147 0x59 0x21d 0x48 0x148 0x148 0x5a 0x21e 0x49 0x149 0x149 0x5b 0x220 0x4a 0x14a 0x14a 0x5c 0x222 0x4b 0x14b 0x14b 0x5d 0x223 0x4c 0x14c 0x14c 0x5f 0x225 0x4d 0x14d 0x14d 0x61 0x226 0x4e 0x14e 0x14e 0x63 0x228 0x4f 0x14f 0x14f 0x65 0x22a 0x50 0x150 0x150 0x67 0x22b 0x51 0x151 0x151 0x69 0x22d 0x52 0x152 0x152 0x6b 0x22f 0x53 0x153 0x153 0x6d 0x230 0x54 0x154 0x154 0x6f 0x232 0x55 0x155 0x155 0x71 0x234 0x56 0x156 0x156 0x73 0x235 0x57 0x157 0x157 0x75 0x237 0x58 0x158 0x158 0x77 0x238 0x59 0x159 0x159 0x79 0x23a 0x5a 0x15a 0x15a 0x7b 0x23c 0x5b 0x15b 0x15b 0x7d 0x23d 0x5c 0x15c 0x15c 0x7f 0x23f 0x5d 0x15d 0x15d 0x81 0x241 0x5e 0x15e 0x15e 0x83 0x242 0x5f 0x15f 0x15f 0x85 0x244 0x60 0x160 0x160 0x87 0x246 0x61 0x161 0x161 0x89 0x247 0x62 0x162 0x162 0x8b 0x249 0x63 0x163 0x163 0x8d 0x24a 0x64 0x164 0x164 0x8f 0x24c 0x65 0x165 0x165 0x91 0x24e 0x66 0x166 0x166 0x93 0x24f 0x67 0x167 0x167 0x95 0x251 0x68 0x168 0x168 0x97 0x253 0x69 0x169 0x169 0x9a 0x254 0x6a 0x16a 0x16a 0x9d 0x256 0x6b 0x16b 0x16b 0xa0 0x257 0x6c 0x16c 0x16c 0xa3 0x259 0x6d 0x16d 0x16d 0xa6 0x25b 0x6e 0x16e 0x16e 0xa8 0x25c 0x6f 0x16f 0x16f 0xab 0x25e 0x70 0x170 0x170 0xae 0x260 0x71 0x171 0x171 0xb1 0x261 0x72 0x172 0x172 0xb4 0x263 0x73 0x173 0x173 0xb7 0x264 0x74 0x174 0x174 0xba 0x266 0x75 0x175 0x175 0xbd 0x268 0x76 0x176 0x176 0xc0 0x269 0x77 0x177 0x177 0xc3 0x26b 0x78 0x178 0x178 0xc6 0x26d 0x79 0x179 0x179 0xc9 0x26e 0x7a 0x17a 0x17a 0xcc 0x270 0x7b 0x17b 0x17b 0xcf 0x272 0x7c 0x17c 0x17c 0xd2 0x273 0x7d 0x17d 0x17d 0xd5 0x275 0x7e 0x17e 0x17e 0xd8 0x276 0x7f 0x17f 0x17f 0xdb 0x278 0x80 0x180 0x180 0xde 0x27a 0x81 0x181 0x181 0xe1 0x27b 0x82 0x182 0x182 0xe4 0x27d 0x83 0x183 0x183 0xe7 0x27f 0x84 0x184 0x184 0xea 0x280 0x85 0x185 0x185 0xed 0x282 0x86 0x186 0x186 0xf0 0x283 0x87 0x187 0x187 0xf3 0x285 0x88 0x188 0x188 0xf6 0x287 0x89 0x189 0x189 0xf9 0x288 0x8a 0x18a 0x18a 0xfc 0x28a 0x8b 0x18b 0x18b 0xff 0x28c 0x8c 0x18c 0x18c 0x102 0x28d 0x8d 0x18d 0x18d 0x105 0x28f 0x8e 0x18e 0x18e 0x108 0x291 0x8f 0x18f 0x18f 0x10b 0x292 0x90 0x190 0x190 0x10e 0x294 0x91 0x191 0x191 0x111 0x295 0x92 0x192 0x192 0x114 0x297 0x93 0x193 0x193 0x117 0x299 0x94 0x194 0x194 0x11a 0x29a 0x95 0x195 0x195 0x11d 0x29c 0x96 0x196 0x196 0x120 0x29e 0x97 0x197 0x197 0x123 0x29f 0x98 0x198 0x198 0x126 0x2a1 0x99 0x199 0x199 0x129 0x2a3 0x9a 0x19a 0x19a 0x12c 0x2a4 0x9b 0x19b 0x19b 0x12f 0x2a6 0x9c 0x19c 0x19c 0x132 0x2a7 0x9d 0x19d 0x19d 0x135 0x2a9 0x9e 0x19e 0x19e 0x138 0x2ab 0x9f 0x19f 0x19f 0x13b 0x2ac 0xa0 0x1a0 0x1a0 0x13e 0x2ae 0xa1 0x1a1 0x1a1 0x141 0x2af 0xa2 0x1a2 0x1a2 0x144 0x2b1 0xa3 0x1a3 0x1a3 0x147 0x2b3 0xa4 0x1a4 0x1a4 0x14a 0x2b4 0xa5 0x1a5 0x1a5 0x14d 0x2b6 0xa6 0x1a6 0x1a6 0x150 0x2b8 0xa7 0x1a7 0x1a7 0x153 0x2b9 0xa8 0x1a8 0x1a8 0x156 0x2bb 0xa9 0x1a9 0x1a9 0x159 0x2bd 0xaa 0x1aa 0x1aa 0x15c 0x2be 0xab 0x1ab 0x1ab 0x15f 0x2c0 0xac 0x1ac 0x1ac 0x162 0x2c1 0xad 0x1ad 0x1ad 0x165 0x2c3 0xae 0x1ae 0x1ae 0x168 0x2c5 0xaf 0x1af 0x1af 0x16b 0x2c6 0xb0 0x1b0 0x1b0 0x16e 0x2c8 0xb1 0x1b1 0x1b1 0x171 0x2c9 0xb2 0x1b2 0x1b2 0x174 0x2cb 0xb3 0x1b3 0x1b3 0x177 0x2cd 0xb4 0x1b4 0x1b4 0x17a 0x2cf 0xb5 0x1b5 0x1b5 0x17d 0x2d0 0xb6 0x1b6 0x1b6 0x180 0x2d2 0xb7 0x1b7 0x1b7 0x183 0x2d3 0xb8 0x1b8 0x1b8 0x186 0x2d5 0xb9 0x1b9 0x1b9 0x189 0x2d7 0xba 0x1ba 0x1ba 0x18c 0x2d8 0xbb 0x1bb 0x1bb 0x18f 0x2da 0xbc 0x1bc 0x1bc 0x192 0x2db 0xbd 0x1bd 0x1bd 0x195 0x2dd 0xbe 0x1be 0x1be 0x198 0x2df 0xbf 0x1bf 0x1bf 0x19b 0x2e1 0xc0 0x1c0 0x1c0 0x19e 0x2e2 0xc1 0x1c1 0x1c1 0x1a1 0x2e4 0xc2 0x1c2 0x1c2 0x1a4 0x2e5 0xc3 0x1c3 0x1c3 0x1a7 0x2e7 0xc4 0x1c4 0x1c4 0x1aa 0x2e9 0xc5 0x1c5 0x1c5 0x1ad 0x2ea 0xc6 0x1c6 0x1c6 0x1b0 0x2ec 0xc7 0x1c7 0x1c7 0x1b3 0x2ed 0xc8 0x1c8 0x1c8 0x1b6 0x2ef 0xc9 0x1c9 0x1c9 0x1b9 0x2f1 0xca 0x1ca 0x1ca 0x1bc 0x2f2 0xcb 0x1cb 0x1cb 0x1bf 0x2f4 0xcc 0x1cc 0x1cc 0x1c2 0x2f5 0xcd 0x1cd 0x1cd 0x1c5 0x2f7 0xce 0x1ce 0x1ce 0x1c8 0x2f9 0xcf 0x1cf 0x1cf 0x1cb 0x2fb 0xd0 0x1d0 0x1d0 0x1ce 0x2fc 0xd1 0x1d1 0x1d1 0x1d1 0x2fe 0xd2 0x1d2 0x1d2 0x1d4 0x2ff 0xd3 0x1d3 0x1d3 0x1d7 0x301 0xd4 0x1d4 0x1d4 0x1da 0x303 0xd5 0x1d5 0x1d5 0x1dd 0x304 0xd6 0x1d6 0x1d6 0x1e0 0x306 0xd7 0x1d7 0x1d7 0x1e3 0x307 0xd8 0x1d8 0x1d8 0x1e6 0x309 0xd9 0x1d9 0x1d9 0x1e9 0x30b 0xda 0x1da 0x1da 0x1ec 0x30d 0xdb 0x1db 0x1db 0x1ef 0x30e 0xdc 0x1dc 0x1dc 0x1f2 0x310 0xdd 0x1dd 0x1dd 0x1f5 0x311 0xde 0x1de 0x1de 0x1f8 0x313 0xdf 0x1df 0x1df 0x1fb 0x315 0xe0 0x1e0 0x1e0 0x1fe 0x316 0xe1 0x1e1 0x1e1 0x201 0x318 0xe2 0x1e2 0x1e2 0x204 0x319 0xe3 0x1e3 0x1e3 0x207 0x31b 0xe4 0x1e4 0x1e4 0x20a 0x31d 0xe5 0x1e5 0x1e5 0x20d 0x31f 0xe6 0x1e6 0x1e6 0x210 0x320>; + samsung,hbm_candela_map_table_revA = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x3 0x1aa 0x2 0x102 0x102 0x6 0x1ac 0x3 0x103 0x103 0x9 0x1ae 0x4 0x104 0x104 0xc 0x1b0 0x5 0x105 0x105 0xf 0x1b1 0x6 0x106 0x106 0x12 0x1b3 0x7 0x107 0x107 0x15 0x1b4 0x8 0x108 0x108 0x18 0x1b6 0x9 0x109 0x109 0x1b 0x1b8 0xa 0x10a 0x10a 0x1e 0x1b9 0xb 0x10b 0x10b 0x21 0x1bb 0xc 0x10c 0x10c 0x24 0x1bc 0xd 0x10d 0x10d 0x27 0x1be 0xe 0x10e 0x10e 0x2a 0x1c0 0xf 0x10f 0x10f 0x2d 0x1c2 0x10 0x110 0x110 0x30 0x1c3 0x11 0x111 0x111 0x33 0x1c5 0x12 0x112 0x112 0x36 0x1c6 0x13 0x113 0x113 0x39 0x1c8 0x14 0x114 0x114 0x3c 0x1ca 0x15 0x115 0x115 0x3f 0x1cb 0x16 0x116 0x116 0x42 0x1cd 0x17 0x117 0x117 0x45 0x1ce 0x18 0x118 0x118 0x48 0x1d0 0x19 0x119 0x119 0x4b 0x1d2 0x1a 0x11a 0x11a 0x4e 0x1d4 0x1b 0x11b 0x11b 0x51 0x1d5 0x1c 0x11c 0x11c 0x54 0x1d7 0x1d 0x11d 0x11d 0x56 0x1d8 0x1e 0x11e 0x11e 0x58 0x1da 0x1f 0x11f 0x11f 0x5a 0x1dc 0x20 0x120 0x120 0x5c 0x1dd 0x21 0x121 0x121 0x5e 0x1df 0x22 0x122 0x122 0x60 0x1e0 0x23 0x123 0x123 0x62 0x1e2 0x24 0x124 0x124 0x64 0x1e4 0x25 0x125 0x125 0x66 0x1e5 0x26 0x126 0x126 0x68 0x1e7 0x27 0x127 0x127 0x6a 0x1e8 0x28 0x128 0x128 0x6c 0x1ea 0x29 0x129 0x129 0x6e 0x1ec 0x2a 0x12a 0x12a 0x70 0x1ee 0x2b 0x12b 0x12b 0x72 0x1ef 0x2c 0x12c 0x12c 0x74 0x1f1 0x2d 0x12d 0x12d 0x76 0x1f2 0x2e 0x12e 0x12e 0x78 0x1f4 0x2f 0x12f 0x12f 0x7a 0x1f6 0x30 0x130 0x130 0x7c 0x1f7 0x31 0x131 0x131 0x7e 0x1f9 0x32 0x132 0x132 0x80 0x1fa 0x33 0x133 0x133 0x82 0x1fc 0x34 0x134 0x134 0x84 0x1fe 0x35 0x135 0x135 0x86 0x200 0x36 0x136 0x136 0x88 0x201 0x37 0x137 0x137 0x8a 0x203 0x38 0x138 0x138 0x8c 0x204 0x39 0x139 0x139 0x8e 0x206 0x3a 0x13a 0x13a 0x90 0x208 0x3b 0x13b 0x13b 0x92 0x209 0x3c 0x13c 0x13c 0x94 0x20b 0x3d 0x13d 0x13d 0x96 0x20c 0x3e 0x13e 0x13e 0x98 0x20e 0x3f 0x13f 0x13f 0x9a 0x210 0x40 0x140 0x140 0x9c 0x211 0x41 0x141 0x141 0x9e 0x213 0x42 0x142 0x142 0xa0 0x215 0x43 0x143 0x143 0xa2 0x216 0x44 0x144 0x144 0xa4 0x218 0x45 0x145 0x145 0xa6 0x21a 0x46 0x146 0x146 0xa8 0x21b 0x47 0x147 0x147 0xaa 0x21d 0x48 0x148 0x148 0xac 0x21e 0x49 0x149 0x149 0xae 0x220 0x4a 0x14a 0x14a 0xb0 0x222 0x4b 0x14b 0x14b 0xb2 0x223 0x4c 0x14c 0x14c 0xb6 0x225 0x4d 0x14d 0x14d 0xba 0x226 0x4e 0x14e 0x14e 0xbe 0x228 0x4f 0x14f 0x14f 0xc2 0x22a 0x50 0x150 0x150 0xc6 0x22b 0x51 0x151 0x151 0xcb 0x22d 0x52 0x152 0x152 0xd0 0x22f 0x53 0x153 0x153 0xd5 0x230 0x54 0x154 0x154 0xda 0x232 0x55 0x155 0x155 0xdf 0x234 0x56 0x156 0x156 0xe4 0x235 0x57 0x157 0x157 0xe9 0x237 0x58 0x158 0x158 0xee 0x238 0x59 0x159 0x159 0xf3 0x23a 0x5a 0x15a 0x15a 0xf8 0x23c 0x5b 0x15b 0x15b 0xfd 0x23d 0x5c 0x15c 0x15c 0x102 0x23f 0x5d 0x15d 0x15d 0x107 0x241 0x5e 0x15e 0x15e 0x10c 0x242 0x5f 0x15f 0x15f 0x111 0x244 0x60 0x160 0x160 0x116 0x246 0x61 0x161 0x161 0x11b 0x247 0x62 0x162 0x162 0x120 0x249 0x63 0x163 0x163 0x125 0x24a 0x64 0x164 0x164 0x12a 0x24c 0x65 0x165 0x165 0x12f 0x24e 0x66 0x166 0x166 0x134 0x24f 0x67 0x167 0x167 0x139 0x251 0x68 0x168 0x168 0x13e 0x253 0x69 0x169 0x169 0x143 0x254 0x6a 0x16a 0x16a 0x148 0x256 0x6b 0x16b 0x16b 0x14d 0x257 0x6c 0x16c 0x16c 0x152 0x259 0x6d 0x16d 0x16d 0x157 0x25b 0x6e 0x16e 0x16e 0x15c 0x25c 0x6f 0x16f 0x16f 0x161 0x25e 0x70 0x170 0x170 0x166 0x260 0x71 0x171 0x171 0x16b 0x261 0x72 0x172 0x172 0x170 0x263 0x73 0x173 0x173 0x175 0x264 0x74 0x174 0x174 0x17a 0x266 0x75 0x175 0x175 0x17f 0x268 0x76 0x176 0x176 0x184 0x269 0x77 0x177 0x177 0x189 0x26b 0x78 0x178 0x178 0x18e 0x26d 0x79 0x179 0x179 0x193 0x26e 0x7a 0x17a 0x17a 0x198 0x270 0x7b 0x17b 0x17b 0x19d 0x272 0x7c 0x17c 0x17c 0x1a2 0x273 0x7d 0x17d 0x17d 0x1a7 0x275 0x7e 0x17e 0x17e 0x1ac 0x276 0x7f 0x17f 0x17f 0x1b1 0x278 0x80 0x180 0x180 0x1b6 0x27a 0x81 0x181 0x181 0x1bb 0x27b 0x82 0x182 0x182 0x1c0 0x27d 0x83 0x183 0x183 0x1c5 0x27f 0x84 0x184 0x184 0x1ca 0x280 0x85 0x185 0x185 0x1cf 0x282 0x86 0x186 0x186 0x1d4 0x283 0x87 0x187 0x187 0x1d9 0x285 0x88 0x188 0x188 0x1de 0x287 0x89 0x189 0x189 0x1e3 0x288 0x8a 0x18a 0x18a 0x1e8 0x28a 0x8b 0x18b 0x18b 0x1ed 0x28c 0x8c 0x18c 0x18c 0x1f2 0x28d 0x8d 0x18d 0x18d 0x1f7 0x28f 0x8e 0x18e 0x18e 0x1fc 0x291 0x8f 0x18f 0x18f 0x201 0x292 0x90 0x190 0x190 0x206 0x294 0x91 0x191 0x191 0x20b 0x295 0x92 0x192 0x192 0x210 0x297 0x93 0x193 0x193 0x215 0x299 0x94 0x194 0x194 0x21a 0x29a 0x95 0x195 0x195 0x21f 0x29c 0x96 0x196 0x196 0x224 0x29e 0x97 0x197 0x197 0x229 0x29f 0x98 0x198 0x198 0x22e 0x2a1 0x99 0x199 0x199 0x233 0x2a3 0x9a 0x19a 0x19a 0x238 0x2a4 0x9b 0x19b 0x19b 0x23d 0x2a6 0x9c 0x19c 0x19c 0x242 0x2a7 0x9d 0x19d 0x19d 0x247 0x2a9 0x9e 0x19e 0x19e 0x24d 0x2ab 0x9f 0x19f 0x19f 0x253 0x2ac 0xa0 0x1a0 0x1a0 0x259 0x2ae 0xa1 0x1a1 0x1a1 0x25f 0x2af 0xa2 0x1a2 0x1a2 0x265 0x2b1 0xa3 0x1a3 0x1a3 0x26b 0x2b3 0xa4 0x1a4 0x1a4 0x271 0x2b4 0xa5 0x1a5 0x1a5 0x277 0x2b6 0xa6 0x1a6 0x1a6 0x27d 0x2b8 0xa7 0x1a7 0x1a7 0x283 0x2b9 0xa8 0x1a8 0x1a8 0x289 0x2bb 0xa9 0x1a9 0x1a9 0x28f 0x2bd 0xaa 0x1aa 0x1aa 0x295 0x2be 0xab 0x1ab 0x1ab 0x29b 0x2c0 0xac 0x1ac 0x1ac 0x2a1 0x2c1 0xad 0x1ad 0x1ad 0x2a7 0x2c3 0xae 0x1ae 0x1ae 0x2ad 0x2c5 0xaf 0x1af 0x1af 0x2b3 0x2c6 0xb0 0x1b0 0x1b0 0x2b9 0x2c8 0xb1 0x1b1 0x1b1 0x2bf 0x2c9 0xb2 0x1b2 0x1b2 0x2c5 0x2cb 0xb3 0x1b3 0x1b3 0x2cb 0x2cd 0xb4 0x1b4 0x1b4 0x2d1 0x2cf 0xb5 0x1b5 0x1b5 0x2d7 0x2d0 0xb6 0x1b6 0x1b6 0x2dd 0x2d2 0xb7 0x1b7 0x1b7 0x2e3 0x2d3 0xb8 0x1b8 0x1b8 0x2e9 0x2d5 0xb9 0x1b9 0x1b9 0x2ef 0x2d7 0xba 0x1ba 0x1ba 0x2f5 0x2d8 0xbb 0x1bb 0x1bb 0x2fb 0x2da 0xbc 0x1bc 0x1bc 0x301 0x2db 0xbd 0x1bd 0x1bd 0x307 0x2dd 0xbe 0x1be 0x1be 0x30d 0x2df 0xbf 0x1bf 0x1bf 0x313 0x2e1 0xc0 0x1c0 0x1c0 0x319 0x2e2 0xc1 0x1c1 0x1c1 0x31f 0x2e4 0xc2 0x1c2 0x1c2 0x325 0x2e5 0xc3 0x1c3 0x1c3 0x32b 0x2e7 0xc4 0x1c4 0x1c4 0x331 0x2e9 0xc5 0x1c5 0x1c5 0x337 0x2ea 0xc6 0x1c6 0x1c6 0x33d 0x2ec 0xc7 0x1c7 0x1c7 0x343 0x2ed 0xc8 0x1c8 0x1c8 0x349 0x2ef 0xc9 0x1c9 0x1c9 0x34f 0x2f1 0xca 0x1ca 0x1ca 0x355 0x2f2 0xcb 0x1cb 0x1cb 0x35b 0x2f4 0xcc 0x1cc 0x1cc 0x361 0x2f5 0xcd 0x1cd 0x1cd 0x367 0x2f7 0xce 0x1ce 0x1ce 0x36d 0x2f9 0xcf 0x1cf 0x1cf 0x373 0x2fb 0xd0 0x1d0 0x1d0 0x379 0x2fc 0xd1 0x1d1 0x1d1 0x37f 0x2fe 0xd2 0x1d2 0x1d2 0x385 0x2ff 0xd3 0x1d3 0x1d3 0x38b 0x301 0xd4 0x1d4 0x1d4 0x391 0x303 0xd5 0x1d5 0x1d5 0x397 0x304 0xd6 0x1d6 0x1d6 0x39d 0x306 0xd7 0x1d7 0x1d7 0x3a3 0x307 0xd8 0x1d8 0x1d8 0x3a9 0x309 0xd9 0x1d9 0x1d9 0x3af 0x30b 0xda 0x1da 0x1da 0x3b5 0x30d 0xdb 0x1db 0x1db 0x3bb 0x30e 0xdc 0x1dc 0x1dc 0x3c1 0x310 0xdd 0x1dd 0x1dd 0x3c7 0x311 0xde 0x1de 0x1de 0x3cd 0x313 0xdf 0x1df 0x1df 0x3d3 0x315 0xe0 0x1e0 0x1e0 0x3d9 0x316 0xe1 0x1e1 0x1e1 0x3df 0x318 0xe2 0x1e2 0x1e2 0x3e5 0x319 0xe3 0x1e3 0x1e3 0x3eb 0x31b 0xe4 0x1e4 0x1e4 0x3f1 0x31d 0xe5 0x1e5 0x1e5 0x3f7 0x31f 0xe6 0x1e6 0x1e6 0x3ff 0x320>; + samsung,aod_candela_map_table_revA = <0x0 0x0 0xb 0x1b 0x2 0x1 0xc 0x1f 0x1a 0xa 0x2 0x20 0x36 0x19 0x1e 0x3 0x37 0xff 0x18 0x3c>; + samsung,support_dynamic_mipi_clk; + samsung,ffc_tx_cmds_revD = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 2e c5 29 00 00 00 00 00 03 c5 36 41 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revD = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53641 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c535a8 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53741>; + samsung,ffc_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 32 b1 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revA = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b1 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53222 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c533a0>; + samsung,dynamic_mipi_clk_timing_table = <0x65fbc9c0 0x671db480 0x6422c400>; + samsung,dynamic_mipi_clk_sel_table = <0x1 0x1 0x0 0x0 0x0 0x1 0x2 0x0 0x0 0x2 0x1 0x3 0x0 0x0 0x2 0x1 0x4 0x0 0x0 0x1 0x2 0xb 0x2942 0x29a2 0x0 0x2 0xb 0x29a3 0x29e8 0x1 0x2 0xb 0x29e9 0x2a56 0x0 0x2 0xc 0x25be 0x26d2 0x0 0x2 0xd 0x48a 0x54d 0x0 0x2 0xd 0x54e 0x593 0x1 0x2 0xd 0x594 0x5e9 0x0 0x2 0xe 0x601 0x661 0x0 0x2 0xe 0x662 0x6a7 0x1 0x2 0xe 0x6a8 0x6ca 0x0 0x2 0xf 0x1105 0x116a 0x0 0x2 0x11 0x8bd 0x8e6 0x0 0x2 0x11 0x8e7 0x92c 0x1 0x2 0x11 0x92d 0xa03 0x0 0x2 0x12 0xb79 0xb86 0x1 0x2 0x12 0xb87 0xb98 0x2 0x2 0x12 0xb99 0xc10 0x0 0x3 0x5b 0x0 0xd9 0x0 0x3 0x5b 0xda 0x165 0x1 0x3 0x5b 0x166 0x257 0x0 0x3 0x5c 0x258 0x26a 0x1 0x3 0x5c 0x26b 0x4a7 0x0 0x3 0x5c 0x4a8 0x4af 0x1 0x3 0x5d 0x4b0 0x64f 0x0 0x3 0x5d 0x650 0x6db 0x1 0x3 0x5d 0x6dc 0x79d 0x0 0x3 0x5e 0x79e 0x877 0x0 0x3 0x5e 0x878 0x903 0x1 0x3 0x5e 0x904 0x95f 0x0 0x3 0x5f 0x960 0xa59 0x0 0x3 0x61 0xabe 0xb29 0x0 0x3 0x61 0xb2a 0xbb5 0x1 0x3 0x61 0xbb6 0xd79 0x0 0x3 0x62 0xd7a 0xdac 0x1 0x3 0x62 0xdad 0xdd1 0x2 0x3 0x62 0xdd2 0xed7 0x0 0x3 0x66 0x1392 0x143b 0x0 0x3 0x67 0x143c 0x149f 0x0 0x3 0x68 0x14a0 0x1503 0x0 0x3 0x6b 0x1662 0x16d9 0x0 0x3 0x6c 0x16da 0x16f2 0x2 0x3 0x6c 0x16f3 0x176f 0x0 0x3 0x6d 0x1770 0x1805 0x0 0x3 0x6e 0x1806 0x1808 0x2 0x3 0x6e 0x1809 0x1931 0x0 0x3 0x6f 0x1932 0x1984 0x1 0x3 0x6f 0x1985 0x19c7 0x0 0x3 0x73 0x1f68 0x1f7a 0x1 0x3 0x73 0x1f7b 0x21b7 0x0 0x3 0x73 0x21b8 0x21f1 0x1 0x3 0x74 0x21f2 0x2214 0x2 0x3 0x74 0x2215 0x234f 0x0 0x3 0x76 0x23fa 0x24ba 0x0 0x3 0x76 0x24bb 0x2511 0x1 0x3 0x76 0x2512 0x2546 0x2 0x3 0x76 0x2547 0x25bb 0x0 0x3 0x77 0x25bc 0x25d9 0x2 0x3 0x77 0x25da 0x2629 0x0 0x3 0x78 0x262a 0x268a 0x1 0x3 0x78 0x268b 0x268d 0x0 0x3 0x7a 0x26c0 0x283d 0x0 0x3 0x7a 0x283e 0x2877 0x1 0x3 0x7c 0x8d68 0x8dfd 0x0 0x3 0x80 0x9376 0x9398 0x1 0x3 0x80 0x9399 0x9569 0x0 0x3 0x81 0x956a 0x96e4 0x0 0x3 0x81 0x96e5 0x96f9 0x1 0x3 0x82 0x96fa 0x98c2 0x0 0x3 0x82 0x98c3 0x994e 0x1 0x3 0x82 0x994f 0x9ae1 0x0 0x3 0x83 0x9ae2 0x9b20 0x1 0x3 0x83 0x9b21 0x9d5c 0x0 0x3 0x83 0x9d5d 0x9de8 0x1 0x3 0x83 0x9de9 0xa025 0x0 0x3 0x83 0xa026 0xa0b1 0x1 0x3 0x83 0xa0b2 0xa275 0x0 0x3 0x84 0xa276 0xa30c 0x0 0x3 0x84 0xa30d 0xa398 0x1 0x3 0x84 0xa399 0xa5d4 0x0 0x3 0x84 0xa5d5 0xa660 0x1 0x3 0x84 0xa661 0xa89d 0x0 0x3 0x84 0xa89e 0xa929 0x1 0x3 0x84 0xa92a 0xaa45 0x0 0x3 0x8a 0xd7c8 0xd813 0x0 0x3 0x8a 0xd814 0xd89f 0x1 0x3 0x8a 0xd8a0 0xdadc 0x0 0x3 0x8a 0xdadd 0xdb68 0x1 0x3 0x8a 0xdb69 0xdda3 0x0 0x3 0x9c 0x10384 0x1045d 0x0 0x3 0x9c 0x1045e 0x104e9 0x1 0x3 0x9c 0x104ea 0x10707 0x0 0x3 0xa1 0x10bea 0x10c9a 0x0 0x3 0xa1 0x10c9b 0x10ce1 0x1 0x3 0xa1 0x10ce2 0x10d26 0x2 0x3 0xa1 0x10d27 0x10d47 0x0 0x4 0x33 0x0 0x0 0x0 0x4 0x34 0x0 0x0 0x0 0x4 0x35 0x0 0x0 0x1 0x4 0x36 0x0 0x0 0x0 0x4 0x37 0x0 0x0 0x2 0x4 0x38 0x0 0x0 0x1 0x5 0x3d 0x0 0x0 0x2 0x5 0x3e 0x0 0x0 0x0 0x5 0x47 0x0 0x0 0x2>; + samsung,fd_on_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 40 40 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,fd_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 80 40 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_grid_on_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 bf 01 00 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,self_grid_off_revA = [29 01 00 00 11 00 03 f0 5a 5a 29 00 00 00 00 00 03 bf 00 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 4c f4 29 00 00 00 00 00 02 f4 28 29 00 00 00 00 00 03 91 01 01 29 00 00 00 00 00 02 53 27 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 40 0a 00 00 00 00 40 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 38 00 00 00 18 03 38 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 24 a4 29 01 00 00 00 00 02 f7 0f 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revA = <0x29000000 0x3f0 0x5a5a2900 0x0 0x4b0004c 0xf4290000 0x2 0xf4282900 0x0 0x3910101 0x29010000 0x253 0x26290000 0x2 0xf70f2901 0x1100 0x3f0a5a5>; + samsung,lpm_off_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 45 0a 00 00 00 00 45 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 3d 00 00 00 18 03 3d 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 26 f0 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_60nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 24]; + samsung,lpm_30nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 25]; + samsung,lpm_10nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 26]; + samsung,lpm_2nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 27]; + samsung,lpm_brightnes_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 02 53 26 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xf>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + samsung,ub-con-det = <0xffffffff 0x5 0x0>; + samsung,esd-irq-gpio1 = <0xffffffff 0x3 0x0>; + phandle = <0xf>; + + qcom,mdss-dsi-display-timings { + + fhd90 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0xf>; + qcom,mdss-dsi-panel-framerate = <0x5a>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x2847>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 0a 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 54 01 0c 00 b4 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 04 b0 00 04 f2 29 00 00 00 00 00 02 f2 54 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 01 00 00 11 00 02 f2 00 29 00 00 00 00 00 04 b0 01 b4 65 29 00 00 00 00 00 21 65 0c 94 0c 5a 0c 30 0b b8 0b 46 0a f6 09 ea 09 08 08 1a 07 12 06 2a 05 12 03 82 02 08 02 08 00 18 29 00 00 00 00 00 04 b0 00 2a 6a 29 00 00 00 00 00 04 6a 07 00 c0 29 01 00 00 11 00 02 f7 0f 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 04 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a 80 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 22 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 02 f7 0f 29 01 00 00 6e 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,panel-roi-alignment = <0x168 0x78 0x168 0x78 0x168 0x78>; + }; + + fhd60 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0x10>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x3dfa>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 0a 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 54 01 0c 00 b4 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 04 b0 00 04 f2 29 00 00 00 00 00 02 f2 54 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 01 00 00 11 00 02 f2 00 29 00 00 00 00 00 04 b0 01 b4 65 29 00 00 00 00 00 21 65 0c 94 0c 5a 0c 30 0b b8 0b 46 0a f6 09 ea 09 08 08 1a 07 12 06 2a 05 12 03 82 02 08 02 08 00 18 29 00 00 00 00 00 04 b0 00 2a 6a 29 00 00 00 00 00 04 6a 07 00 c0 29 01 00 00 11 00 02 f7 0f 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 04 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a 80 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 22 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 02 f7 0f 29 01 00 00 6e 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,panel-roi-alignment = <0x168 0x78 0x168 0x78 0x168 0x78>; + }; + }; + + qcom,panel-supply-entries { + #address-cells = <0x1>; + #size-cells = <0x0>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vci"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vddi"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1b7740>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + }; + }; + }; + }; + + fragment@89 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_PBA_BOOTING_FHD"; + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x0>; + qcom,mdss-dsi-bl-max-level = <0x639c>; + qcom,mdss-brightness-max-level = <0x639c>; + qcom,mdss-dsi-interleave-mode = <0x0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x3c>; + qcom,mdss-pan-physical-height-dimension = <0x6a>; + qcom,mdss-dsi-panel-mode-gpio-state = "invalid"; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + samsung,candela_map_table_revA = <0x0 0x0 0x2 0x5 0x1 0x2 0x2 0x6 0x2 0x3 0x3 0x7 0x3 0x4 0x4 0x8 0x4 0x5 0x5 0x9 0x5 0x6 0x6 0xa 0x6 0x7 0x7 0xb 0x7 0x8 0x8 0xc 0x8 0x9 0x9 0xd 0x9 0xa 0xa 0xe 0xa 0xb 0xb 0xf 0xb 0xc 0xc 0x10 0xc 0xd 0xd 0x11 0xd 0xe 0xe 0x13 0xe 0xf 0xf 0x14 0xf 0x10 0x10 0x15 0x10 0x11 0x11 0x16 0x11 0x12 0x12 0x18 0x12 0x13 0x13 0x19 0x13 0x14 0x14 0x1b 0x14 0x15 0x15 0x1d 0x15 0x16 0x16 0x1e 0x16 0x17 0x18 0x20 0x17 0x19 0x1a 0x22 0x18 0x1b 0x1c 0x25 0x19 0x1d 0x1d 0x27 0x1a 0x1e 0x20 0x29 0x1b 0x21 0x22 0x2c 0x1c 0x23 0x24 0x2f 0x1d 0x25 0x26 0x32 0x1e 0x27 0x28 0x35 0x1f 0x29 0x2b 0x38 0x20 0x2c 0x2e 0x3c 0x21 0x2f 0x31 0x40 0x22 0x32 0x34 0x44 0x23 0x35 0x38 0x48 0x24 0x39 0x3b 0x4d 0x25 0x3c 0x3f 0x52 0x26 0x40 0x43 0x57 0x27 0x44 0x47 0x5d 0x28 0x48 0x4c 0x62 0x29 0x4d 0x50 0x69 0x2a 0x51 0x56 0x6f 0x2b 0x57 0x5b 0x77 0x2c 0x5c 0x61 0x7e 0x2d 0x62 0x68 0x86 0x2e 0x69 0x6e 0x8f 0x2f 0x6f 0x76 0x98 0x30 0x77 0x7d 0xa2 0x31 0x7e 0x85 0xac 0x32 0x86 0x8e 0xb7 0x33 0x8f 0x96 0xc3 0x34 0x97 0xa0 0xcf 0x35 0xa1 0xaa 0xdc 0x36 0xab 0xb5 0xea 0x37 0xb6 0xc1 0xf9 0x38 0xc2 0xcd 0x109 0x39 0xce 0xda 0x11a 0x3a 0xdb 0xe6 0x12c 0x3b 0xe7 0xf2 0x13c 0x3c 0xf3 0xfe 0x14d 0x3d 0xff 0xff 0x168>; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x10>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + phandle = <0x10>; + + qcom,mdss-dsi-display-timings { + + fhd@0 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-front-porch = <0xa4>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-v-back-porch = <0x3>; + qcom,mdss-dsi-v-front-porch = <0x9>; + qcom,mdss-dsi-panel-clockrate = <0x35866480>; + qcom,mdss-dsi-panel-phy-timings = <0x1e0808 0x24220808 0x8020400>; + qcom,mdss-dsi-on-command = [39 01 00 00 78 00 02 11 00]; + qcom,mdss-dsi-off-command = <0x5010000 0x24000128 0x5010000 0x78000110>; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + }; + }; + }; + + fragment@90 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_te { + + sde_te_active { + phandle = <0x9>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + + sde_te_suspend { + phandle = <0xd>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + + pmx_sde { + phandle = <0xd0>; + + sde_dsi_active { + phandle = <0xa>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + bias-disable = <0x0>; + }; + }; + + sde_dsi_suspend { + phandle = <0xe>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable = <0x0>; + }; + }; + }; + }; + }; + + fragment@91 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_ub_det { + + sde_ub_det_default { + pins = "gpio5"; + function = "normal"; + input-enable; + power-source = <0x1>; + bias-disable; + phandle = <0xb>; + }; + }; + }; + }; + + fragment@92 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_fg_err { + + sde_fg_err_default { + pins = "gpio3"; + function = "normal"; + input-enable; + power-source = <0x0>; + bias-disable; + phandle = <0xc>; + }; + }; + }; + }; + + fragment@93 { + target = <0xffffffff>; + + __overlay__ { + + qcom,dsi-display@9 { + label = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + qcom,display-type = "primary"; + phandle = <0xd1>; + }; + + qcom,dsi-display@10 { + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,display-type = "primary"; + phandle = <0xd2>; + }; + }; + }; + + fragment@94 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c000000 0x0 0x9e4000>; + label = "cont_splash_region"; + }; + }; + + fragment@95 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c9e4000 0x0 0x100000>; + label = "dfps_data_region"; + }; + }; + + fragment@96 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c000000 0x0 0x9e4000>; + label = "disp_rdump_region"; + }; + }; + + fragment@97 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x68>; + status = "okay"; + + sm5714@49 { + status = "okay"; + compatible = "siliconmitus,sm5714mfd"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x69>; + sm5714,irq-gpio = <0xffffffff 0x21 0x0>; + sm5714,wakeup; + }; + }; + }; + + fragment@98 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x6a>; + status = "okay"; + + usbpd-sm5714@33 { + status = "okay"; + compatible = "sm5714-usbpd"; + reg = <0x33>; + pinctrl-names = "default"; + pinctrl-0 = <0x6b>; + usbpd,usbpd_int = <0xffffffff 0x68 0x0>; + support_pd_role_swap; + + pdic-manager { + pdic,max_power = <0x1388>; + pdic_op_power = <0x9c4>; + pdic_max_voltage = <0x1770>; + pdic_max_current = <0x7d0>; + pdic,min_current = <0x1f4>; + pdic,giveback = <0x0>; + pdic,usb_com_capable = <0x1>; + pdic,no_usb_suspend = <0x1>; + source,max_voltage = <0x1388>; + source,min_voltage = <0xfa0>; + source,max_power = <0x9c4>; + }; + }; + }; + }; + + fragment@99 { + target = <0xffffffff>; + + __overlay__ { + + if_pmic_irq { + + if_pmic_irq_default { + phandle = <0x69>; + + mux { + pins = "gpio33"; + function = "gpio"; + }; + + config { + pins = "gpio33"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + + usbpd_irq { + + usbpd_irq_default { + phandle = <0x6b>; + + mux { + pins = "gpio104"; + function = "gpio"; + }; + + config { + pins = "gpio104"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + }; + }; + + fragment@100 { + target = <0xffffffff>; + + __overlay__ { + qcom,qusb-phy-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x18 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x46 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + qcom,qusb-phy-host-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x18 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x46 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + }; + }; + + fragment@101 { + target = <0xffffffff>; + + __overlay__ { + + fps_rst { + phandle = <0x6c>; + + mux { + pins = "gpio91"; + function = "gpio"; + }; + + config { + pins = "gpio91"; + bias-pull-down; + }; + }; + }; + }; + + fragment@102 { + target = <0xffffffff>; + + __overlay__ { + regulator-name = "VDD_BTP_3P3"; + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + }; + }; + + fragment@103 { + target = <0xffffffff>; + + __overlay__ { + qcom,set-miso-sampling; + qcom,miso-sampling-ctrl-val = <0x2>; + status = "okay"; + + gw9558-spi@0 { + compatible = "goodix,gw9558x_factory"; + reg = <0x0>; + spi-max-frequency = <0x17d7840>; + pinctrl-names = "default"; + pinctrl-0 = <0x6c>; + gpio-controller; + #gpio-cells = <0x2>; + goodix,btp-regulator = "VDD_BTP_3P3"; + goodix,gpio_reset = <0xffffffff 0x5b 0x0>; + goodix,chip_id = "GW9558"; + goodix,position = "11.81,-0.02,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + goodix,modelinfo = "A525"; + goodix,rb = "547,215,-1,FFFFFF,A9A9A9"; + }; + }; + }; + + fragment@104 { + target = <0xffffffff>; + + __overlay__ { + + gw9558@0 { + compatible = "goodix,gw9558x"; + reg = <0x0>; + spi-max-frequency = <0x17d7840>; + pinctrl-names = "default"; + pinctrl-0 = <0x6c>; + gpio-controller; + #gpio-cells = <0x2>; + goodix,btp-regulator = "VDD_BTP_3P3"; + goodix,gpio_reset = <0xffffffff 0x5b 0x0>; + goodix,chip_id = "GW9558"; + goodix,position = "11.81,-0.02,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + goodix,modelinfo = "A525"; + goodix,rb = "547,215,-1,FFFFFF,A9A9A9"; + }; + }; + }; + + fragment@105 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@106 { + target = <0xffffffff>; + + __overlay__ { + + qcom,flash_0 { + label = "flash"; + qcom,led-name = "led:flash_0"; + qcom,max-current = <0x5dc>; + qcom,default-led-trigger = "flash0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x5dc>; + qcom,duration-ms = <0x500>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + qcom,record-current-ma = <0x12c>; + phandle = <0x6d>; + }; + + qcom,torch_0 { + label = "torch"; + qcom,led-name = "led:torch_0"; + qcom,max-current = <0x1f4>; + qcom,default-led-trigger = "torch0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x12c>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + phandle = <0x6e>; + }; + + qcom,camera-flash@0 { + cell-index = <0x0>; + compatible = "qcom,camera-flash"; + flash-source = <0x6d>; + torch-source = <0x6e>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x77>; + }; + + qcom,cam-res-mgr { + compatible = "qcom,cam-res-mgr"; + shared-gpios = <0x3f>; + pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; + status = "ok"; + pinctrl-0 = <0x6f>; + pinctrl-1 = <0x70>; + }; + }; + }; + + fragment@107 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + sm5714-fled { + compatible = "siliconmitus,sm5714-fled"; + reg = <0x49>; + status = "okay"; + slave-addr = <0x92>; + flash-en-gpio = <0xffffffff 0x16 0x0>; + torch-en-gpio = <0xffffffff 0x43 0x0>; + flash-brightness = <0xf>; + preflash-brightness = <0x7>; + torch-brightness = <0x7>; + factory_current = <0x0>; + timeout = <0xff>; + }; + }; + }; + + fragment@108 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + qcom,ois@62 { + compatible = "qcom,ois"; + cell-index = <0x0>; + reg = <0x62>; + slave-addr = <0xc4>; + slave-id = <0x460>; + cam_vaf-supply = <0x71>; + regulator-names = "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x2ab980>; + rgltr-max-voltage = <0x2ab980>; + rgltr-load-current = <0x30d40>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x72 0x73>; + pinctrl-1 = <0x74 0x75>; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x20 0x0 0xffffffff 0x2b 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x0>; + gpio-custom1 = <0x1>; + gpio-vio = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x0 0x0 0x0>; + gpio-req-tbl-label = "MCU_RESET0", "MCU_BOOT0", "MCU_VIO"; + status = "ok"; + phandle = <0x79>; + }; + }; + }; + + fragment@109 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@0 { + cell-index = <0x0>; + compatible = "qcom,cam-sensor"; + reg = <0x0>; + slave-addr = <0x34>; + csiphy-sd-index = <0x0>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x76>; + led-flash-src = <0x77>; + eeprom-src = <0x78>; + ois-src = <0x79>; + cam_vio-supply = <0x7a>; + cam_vaf-supply = <0x71>; + cam_vana-supply = <0x7b>; + cam_vdig-supply = <0x7c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vaf", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x2ab980 0xf4240 0x0>; + rgltr-max-voltage = <0x1b7740 0x2ab980 0x2c4020 0x10c8e0 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x7d 0x7e 0x7f>; + pinctrl-1 = <0x80 0x81 0x82>; + gpios = <0xffffffff 0xd 0x0 0xffffffff 0x1e 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x1>; + gpio-custom1 = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_VANA0"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x41>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@2 { + cell-index = <0x2>; + compatible = "qcom,cam-sensor"; + reg = <0x3>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x83>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x84 0x85 0x86 0x87>; + pinctrl-1 = <0x88 0x89 0x8a 0x8b>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x2D { + cell-index = <0x2>; + compatible = "qcom,eeprom"; + reg = <0x2d>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x84 0x85 0x86 0x87>; + pinctrl-1 = <0x88 0x89 0x8a 0x8b>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x83>; + }; + + qcom,eeprom@37 { + cell-index = <0x3>; + compatible = "qcom,eeprom"; + reg = <0x37>; + slave-addr = <0x6e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_vdig-supply = <0x8c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x8d 0x8e 0x8f>; + pinctrl-1 = <0x90 0x91 0x92>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x9a>; + }; + }; + }; + + fragment@110 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@1 { + cell-index = <0x1>; + compatible = "qcom,cam-sensor"; + reg = <0x1>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x93>; + cam_vio-supply = <0x7a>; + cam_vana-supply = <0x94>; + cam_vdig-supply = <0x95>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x96 0x97>; + pinctrl-1 = <0x98 0x99>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@8 { + cell-index = <0x8>; + compatible = "qcom,cam-sensor"; + reg = <0x8>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x93>; + cam_vio-supply = <0x7a>; + cam_vana-supply = <0x94>; + cam_vdig-supply = <0x95>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x96 0x97>; + pinctrl-1 = <0x98 0x99>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@3 { + cell-index = <0x3>; + compatible = "qcom,cam-sensor"; + reg = <0x2>; + slave-addr = <0x6e>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x9a>; + cam_vio-supply = <0x7a>; + cam_vdig-supply = <0x8c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x8d 0x8e 0x8f>; + pinctrl-1 = <0x90 0x91 0x92>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@4 { + cell-index = <0x4>; + compatible = "qcom,cam-sensor"; + reg = <0x4>; + slave-addr = <0x7e>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + led-flash-src = <0x77>; + eeprom-src = <0x9b>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x9c 0x9d 0x9e 0x87>; + pinctrl-1 = <0x9f 0xa0 0xa1 0x8b>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x40 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + cam_vdig-supply = <0x8c>; + phandle = <0xd3>; + }; + + qcom,eeprom@0x3F { + cell-index = <0x4>; + compatible = "qcom,eeprom"; + reg = <0x3f>; + slave-addr = <0x7e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x9c 0x9d 0x9e 0x87>; + pinctrl-1 = <0x9f 0xa0 0xa1 0x8b>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x40 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + cam_vdig-supply = <0x8c>; + phandle = <0x9b>; + }; + }; + }; + + fragment@111 { + target = <0xffffffff>; + + __overlay__ { + + qcom,actuator@0xC { + cell-index = <0x0>; + reg = <0xc>; + slave-addr = <0x18>; + compatible = "i2c_actuator"; + rgltr-cntrl-support; + cam_vio-supply = <0x7a>; + cam_vaf-supply = <0x71>; + regulator-names = "cam_vio", "cam_vaf"; + rgltr-min-voltage = <0x1b7740 0x2ab980>; + rgltr-max-voltage = <0x1b7740 0x2ab980>; + rgltr-load-current = <0x30d40 0x30d40>; + phandle = <0x76>; + }; + + qcom,eeprom@50 { + cell-index = <0x0>; + reg = <0x50>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa0>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1 0x1>; + qcom,cam-power-seq-delay = <0x2 0x2>; + cam_vaf-supply = <0x71>; + cam_vio-supply = <0x7a>; + regulator-names = "cam_vaf", "cam_vio"; + rgltr-min-voltage = <0x2ab980 0x1b7740>; + rgltr-max-voltage = <0x2ab980 0x1b7740>; + rgltr-load-current = <0x30d40 0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + phandle = <0x78>; + }; + + qcom,eeprom@51 { + cell-index = <0x1>; + reg = <0x51>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa2>; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x2>; + cam_vio-supply = <0x7a>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-mode = <0x0>; + sensor-position = <0x1>; + rgltr-cntrl-support; + phandle = <0x93>; + }; + }; + }; + + fragment@112 { + target = <0xffffffff>; + + __overlay__ { + + samsung,vibrator { + compatible = "samsung_vib"; + samsung,vib_type = "COINDC"; + status = "ok"; + samsung,vib_en = <0xffffffff 0x39 0x0>; + phandle = <0xd4>; + }; + }; + }; + + fragment@113 { + target = <0xffffffff>; + + __overlay__ { + + nfc_qupv3_se0_i2c_sleep { + phandle = <0xa2>; + + mux { + pins = "gpio34", "gpio35"; + function = "gpio"; + }; + + config { + pins = "gpio34", "gpio35"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + nfc_clk_req_gpio { + phandle = <0xa3>; + + mux { + pins = "gpio31"; + function = "gpio"; + }; + + config { + pins = "gpio31"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_irq_gpio { + phandle = <0xa4>; + + mux { + pins = "gpio37"; + function = "gpio"; + }; + + config { + pins = "gpio37"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_ven_gpio { + phandle = <0xa5>; + + mux { + pins = "gpio12"; + function = "gpio"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-high; + }; + }; + + nfc_firm_gpio { + phandle = <0xa6>; + + mux { + pins = "gpio36"; + function = "gpio"; + }; + + config { + pins = "gpio36"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + nfc_ldo_en_gpio { + phandle = <0xa7>; + + mux { + pins = "gpio68"; + function = "gpio"; + }; + + config { + pins = "gpio68"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@114 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + pinctrl-1 = <0xa2>; + qcom,clk-freq-out = <0x61a80>; + + sec-nfc@27 { + compatible = "sec-nfc"; + reg = <0x27>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + sec-nfc,ven-gpio = <0xffffffff 0xc 0x0>; + sec-nfc,irq-gpio = <0xffffffff 0x25 0x0>; + sec-nfc,firm-gpio = <0xffffffff 0x24 0x0>; + sec-nfc,clk_req-gpio = <0xffffffff 0x1f 0x0>; + sec-nfc,pvdd-gpio = <0xffffffff 0x44 0x0>; + sec-nfc,clk_req_wake; + sec-nfc,bootloader_ver = <0x6>; + pinctrl-names = "default"; + pinctrl-0 = <0xa3 0xa4 0xa5 0xa6 0xa7>; + }; + }; + }; + + fragment@115 { + target = <0xffffffff>; + + __overlay__ { + + hall { + status = "okay"; + compatible = "hall"; + linux,input-type = <0x1>; + linux,code = <0x15>; + hall,gpio_flip_cover = <0xffffffff 0xa 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa8>; + }; + }; + }; + + fragment@116 { + target = <0xffffffff>; + + __overlay__ { + + hall { + + hall_default { + pins = "gpio10"; + function = "normal"; + output-disable; + input-enable; + bias-disable; + power-source = <0x0>; + phandle = <0xa8>; + }; + }; + }; + }; + + fragment@abc { + target-path = [2f 00]; + + __overlay__ { + + sec_abc { + compatible = "samsung,sec_abc"; + status = "okay"; + + gpu { + gpu,label = "GPU fault"; + gpu,threshold_count = <0x4>; + gpu,threshold_time = <0x4b0>; + }; + + gpu_page { + gpu_page,label = "GPU page fault"; + gpu_page,threshold_count = <0x14>; + gpu_page,threshold_time = <0x4b0>; + }; + + aicl { + aicl,label = "battery aicl"; + aicl,threshold_count = <0x5>; + aicl,threshold_time = <0x12c>; + }; + }; + + abc_hub { + compatible = "samsung,abc_hub"; + status = "okay"; + + bootc { + bootc,time_spec_user = <0x186a0>; + bootc,time_spec_eng = <0x186a0>; + bootc,time_spec_fac = <0x186a0>; + }; + }; + }; + }; + + fragment@117 { + target = <0xffffffff>; + + __overlay__ { + + rpmh-regulator-ldoc8 { + compatible = "qcom,rpmh-vrm-regulator"; + mboxes = <0xffffffff 0x0>; + qcom,resource-name = "ldoc8"; + qcom,regulator-type = "pmic5-ldo"; + qcom,supported-modes = <0x2 0x4>; + qcom,mode-threshold-currents = <0x0 0x1>; + + regulator-pm6150l-l8 { + regulator-name = "pm6150l_l8"; + qcom,set = <0x3>; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + qcom,init-voltage = <0x1b7740>; + regulator-always-on; + qcom,init-mode = <0x2>; + phandle = <0xd5>; + }; + }; + + rpmh-regulator-ldoa5 { + + regulator-pm6150-l5 { + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + regulator-always-on; + phandle = <0xd6>; + }; + }; + + i2c@17 { + status = "ok"; + cell-index = <0x11>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x33 0x0 0xffffffff 0x34 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0xa9>; + phandle = <0xd7>; + + sx9360-i2c@28 { + compatible = "sx9360"; + reg = <0x28>; + pinctrl-names = "default"; + pinctrl-0 = <0xaa>; + interrupt-parent = <0xffffffff>; + interrupts = <0x4 0xc4 0x0 0x2>; + sx9360,nirq-gpio = <0xffffffff 0x5 0x1>; + sx9360,reggnrlctrl2_reg = <0x32>; + sx9360,againfreq_reg = <0x38>; + sx9360,refagainfreq_reg = <0x36>; + sx9360,gainrawfilt_reg = <0x1a>; + sx9360,refgainrawfilt_reg = <0x22>; + sx9360,proxthresh_reg = <0x1d>; + sx9360,hyst_reg = <0x35>; + sx9360,regproxctrl3_reg = <0xd>; + sx9360,resolution_reg = <0xf>; + sx9360,refresolution_reg = <0xf>; + sx9360,hallic_cert_detect = <0x1>; + }; + }; + }; + }; + + fragment@118 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x48 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6d 0x72 0x73 0x74 0x75 0x76>; + }; + }; + + fragment@119 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@120 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0xb 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x37 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6b 0x6d 0x72 0x73 0x74 0x76>; + }; + }; + + fragment@121 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@122 { + target = <0xffffffff>; + + __overlay__ { + + bat_thm { + label = "bat_thm"; + reg = <0x4f>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + + chg_thm { + label = "chg_thm"; + reg = <0x4d>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + }; + }; + + fragment@123 { + target = <0xffffffff>; + + __overlay__ { + + battery { + pinctrl-names = "default"; + battery,chip_vendor = "QCOM"; + status = "okay"; + compatible = "samsung,sec-battery"; + battery,vendor = "Battery"; + battery,charger_name = "sm5714-charger"; + battery,fuelgauge_name = "sm5714-fuelgauge"; + battery,fgsrc_switch_name = "sm5714-fuelgauge"; + battery,technology = <0x2>; + battery,batt_data_version = <0x1>; + battery,temp_adc_type = <0x1>; + battery,temp_channel_raw = <0x1>; + battery,adc_check_count = <0x5>; + battery,temp_check_type = <0x1>; + battery,chg_temp_check_type = <0x1>; + battery,thermal_source = <0x2>; + battery,chg_thermal_source = <0x2>; + battery,temp_table_adc = <0x76c 0x923 0xab2 0xc97 0xec8 0x114f 0x146a 0x1803 0x1c2e 0x20e2 0x25c4 0x2b7f 0x31eb 0x386a 0x3f07 0x45a1 0x4be0 0x51ec 0x5774 0x5c67 0x609d 0x6442 0x6755>; + battery,temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,chg_temp_table_adc = <0x6d6 0x889 0xa14 0xbe2 0xe04 0x107c 0x137e 0x170b 0x1b0d 0x1f93 0x2479 0x2a3c 0x3072 0x3719 0x3da0 0x43e4 0x4aa7 0x50aa 0x5651 0x5b61 0x5fd6 0x637c 0x66ca>; + battery,chg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,polling_time = <0xa 0x1e 0x1e 0x1e 0xe10>; + battery,cable_check_type = <0x4>; + battery,cable_source_type = <0x1>; + battery,polling_type = <0x1>; + battery,monitor_initial_count = <0x0>; + battery,battery_check_type = <0x0>; + battery,ovp_uvlo_check_type = <0x3>; + battery,temp_check_count = <0x1>; + battery,overheatlimit_threshold = <0x2bc>; + battery,overheatlimit_recovery = <0x2a8>; + battery,wire_warm_overheat_thresh = <0x1f4>; + battery,wire_normal_warm_thresh = <0x1a4>; + battery,wire_cool1_normal_thresh = <0xb4>; + battery,wire_cool2_cool1_thresh = <0x96>; + battery,wire_cool3_cool2_thresh = <0x32>; + battery,wire_cold_cool3_thresh = <0x0>; + battery,wire_warm_current = <0x61b>; + battery,wire_cool1_current = <0xaf0>; + battery,wire_cool2_current = <0x417>; + battery,wire_cool3_current = <0x1b5>; + battery,low_temp_topoff = <0xe1>; + battery,high_temp_topoff = <0xe1>; + battery,low_temp_float = <0x111c>; + battery,high_temp_float = <0x1036>; + battery,full_check_type = <0x7>; + battery,full_check_type_2nd = <0x7>; + battery,full_check_count = <0x1>; + battery,chg_gpio_full_check = <0x0>; + battery,chg_polarity_full_check = <0x1>; + battery,chg_high_temp = <0x22b>; + battery,chg_high_temp_recovery = <0x212>; + battery,chg_input_limit_current = <0x3e8>; + battery,chg_charging_limit_current = <0x578>; + battery,wpc_temp_control_source = <0x1>; + battery,wpc_high_temp = <0x17c>; + battery,wpc_high_temp_recovery = <0x168>; + battery,wpc_input_limit_current = <0x258>; + battery,wpc_charging_limit_current = <0x3e8>; + battery,wpc_temp_lcd_on_control_source = <0x1>; + battery,wpc_lcd_on_high_temp = <0x17c>; + battery,wpc_lcd_on_high_temp_rec = <0x168>; + battery,wpc_lcd_on_input_limit_current = <0x1c2>; + battery,wpc_store_high_temp = <0x168>; + battery,wpc_store_high_temp_recovery = <0x154>; + battery,wpc_store_charging_limit_current = <0x190>; + battery,wpc_store_lcd_on_high_temp = <0x168>; + battery,wpc_store_lcd_on_high_temp_rec = <0x12c>; + battery,wpc_store_lcd_on_charging_limit_current = <0x190>; + battery,sleep_mode_limit_current = <0x1f4>; + battery,wc_full_input_limit_current = <0x64>; + battery,mix_high_temp = <0x1a4>; + battery,mix_high_chg_temp = <0x1f4>; + battery,mix_high_temp_recovery = <0x186>; + battery,full_condition_type = <0x9>; + battery,full_condition_soc = <0x5d>; + battery,full_condition_vcell = <0x10ea>; + battery,recharge_check_count = <0x1>; + battery,recharge_condition_type = <0x4>; + battery,recharge_condition_soc = <0x62>; + battery,recharge_condition_vcell = <0x10d6>; + battery,charging_total_time = <0x3840>; + battery,hv_charging_total_time = <0x2a30>; + battery,normal_charging_total_time = <0x4650>; + battery,usb_charging_total_time = <0x8ca0>; + battery,recharging_total_time = <0x1518>; + battery,charging_reset_time = <0x0>; + battery,chg_float_voltage = <0x111c>; + battery,pre_afc_work_delay = <0x7d0>; + battery,pre_wc_afc_work_delay = <0xfa0>; + battery,pre_afc_input_current = <0x1f4>; + battery,pre_wc_afc_input_current = <0x1f4>; + battery,prepare_ta_delay = <0x0>; + battery,swelling_high_rechg_voltage = <0xfa0>; + battery,swelling_low_rechg_voltage = <0x1086>; + battery,siop_input_limit_current = <0x4b0>; + battery,siop_charging_limit_current = <0x3e8>; + battery,siop_hv_input_limit_current = <0x2bc>; + battery,siop_hv_input_limit_current_2nd = <0x226>; + battery,siop_hv_charging_limit_current = <0x3e8>; + battery,ttf_hv_charge_current = <0xa28>; + battery,ttf_dc25_charge_current = <0xed8>; + battery,rp_current_rp1 = <0x1f4>; + battery,rp_current_rp2 = <0x5dc>; + battery,rp_current_rp3 = <0xbb8>; + battery,rp_current_rdu_rp3 = <0x834>; + battery,rp_current_abnormal_rp3 = <0x708>; + battery,pd_charging_charge_power = <0x3a98>; + battery,max_charging_current = <0xaf0>; + battery,wireless_cc_cv = <0x55>; + battery,wireless_otg_input_current = <0x384>; + battery,age_data = <0x0 0x111c 0x10d6 0x10b8 0x5d 0x12c 0x1108 0x10c2 0x10a4 0x5c 0x190 0x10f4 0x10ae 0x1090 0x5b 0x2bc 0x10e0 0x109a 0x107c 0x5a 0x3e8 0x10ae 0x1068 0x104a 0x59>; + battery,health_condition = <0x384 0x0 0x4b0 0x0 0x5dc 0x0>; + battery,standard_curr = <0xe42>; + battery,expired_time = <0x23a0>; + battery,recharging_expired_time = <0x1518>; + battery,battery_full_capacity = <0x1388>; + battery,cisd_max_voltage_thr = <0x1388>; + battery,max_input_voltage = <0x2328>; + battery,max_input_current = <0xbb8>; + battery,cisd_alg_index = <0x8>; + battery,ignore_cisd_index = <0x0 0x3c0>; + battery,ignore_cisd_index_d = <0x0 0x78>; + battery,ttf_capacity = <0xf28>; + battery,cv_data = <0xe36 0x358 0x51b 0xd81 0x362 0x4f2 0xcc6 0x36b 0x4ca 0xc27 0x371 0x4ab 0xb78 0x379 0x483 0xac8 0x380 0x45a 0xa4a 0x387 0x433 0x9b2 0x38c 0x413 0x93e 0x393 0x3ea 0x89d 0x399 0x3c1 0x84b 0x39e 0x39c 0x7e3 0x3a2 0x37e 0x78a 0x3a6 0x35c 0x708 0x3ab 0x334 0x6ae 0x3b0 0x305 0x667 0x3b4 0x2e2 0x60b 0x3b8 0x2ba 0x5a7 0x3bc 0x291 0x562 0x3be 0x26f 0x543 0x3c2 0x24a 0x4a4 0x3c5 0x221 0x496 0x3cb 0x1d8 0x43e 0x3ce 0x1b2 0x427 0x3d1 0x189 0x3f0 0x3d4 0x160 0x3d1 0x3dc 0xda 0x36e 0x3e0 0x9b 0x366 0x3e2 0x7c 0x300 0x3e6 0x3e 0x2f5 0x3e8 0x0>; + io-channels = <0xffffffff 0x4f 0xffffffff 0x4d>; + io-channel-names = "adc-temp", "adc-chg-temp"; + }; + + sm5714-fuelgauge { + status = "okay"; + fuelgauge,fuel_alert_soc = <0x1>; + fuelgauge,capacity_max = <0x3e8>; + fuelgauge,capacity_max_margin = <0x12c>; + fuelgauge,capacity_min = <0x0>; + fuelgauge,capacity_calculation_type = <0x1f>; + fuelgauge,using_temp_compensation; + fuelgauge,low_temp_limit = <0x64>; + fuelgauge,using_hw_vempty; + fuelgauge,sw_v_empty_voltage = <0xc80>; + fuelgauge,sw_v_empty_voltage_cisd = <0xc1c>; + fuelgauge,sw_v_empty_recover_voltage = <0xd98>; + fuelgauge,capacity = <0x1388>; + + battery_params { + battery,id = <0x0>; + battery0,battery_type = <0x114e 0x1f20>; + battery0,battery_table0 = <0x1400 0x1b73 0x1c4b 0x1d38 0x1d68 0x1d7a 0x1d88 0x1d8f 0x1db4 0x1dea 0x1e0d 0x1e42 0x1e88 0x1eb4 0x1f01 0x1f3d 0x1f76 0x1fc7 0x2023 0x207f 0x2116 0x2190 0x2272 0x2400>; + battery0,battery_table1 = <0x0 0x99 0x219 0x4b3 0x5cc 0x74c 0xb80 0xd19 0xfb3 0x14e6 0x1a19 0x1f4c 0x29b3 0x2ee6 0x36b3 0x3be6 0x3e80 0x4119 0x464c 0x4b80 0x534c 0x5880 0x6400 0x6419>; + battery0,battery_table2 = <0x4b4b 0x4444 0x4040 0x3e3e 0x3c3c 0x3b3b 0x3838 0x3737 0x3535 0x3434 0x3434 0x3333 0x3333 0x3333 0x3333 0x3232>; + battery0,rs_value = <0x66 0x66 0x3800 0x199 0x599 0x599 0x100>; + battery0,v_alarm = <0xce4 0x0>; + battery0,topoff = <0x28a>; + battery0,i_cal = <0x0 0x0 0x800 0x800 0x0 0x0 0x7f0 0x81b>; + battery0,v_cal = <0x1 0x0 0x0 0x1 0x0 0x0 0x0>; + battery0,temp_std = <0x19>; + battery0,tem_poff = <0xd7a 0x32 0xd16 0x32>; + battery0,aux_ctrl = <0x322 0x5800>; + battery0,data_ver = <0x7>; + battery0,v_max_table = <0x2272 0x2250 0x222e 0x220c 0x21b7>; + battery0,q_max_table = <0x1f20 0x1e9f 0x1e1e 0x1d9d 0x1c5b>; + }; + }; + + cable-info { + default_input_current = <0x708>; + default_charging_current = <0x834>; + full_check_current_1st = <0x28a>; + full_check_current_2nd = <0xe1>; + + current_group_1 { + cable_number = <0x2 0x13 0x15 0x16 0x17 0x1e>; + input_current = <0x1f4>; + charging_current = <0x1f4>; + }; + + current_group_2 { + cable_number = <0x19 0x1f>; + input_current = <0x3e8>; + charging_current = <0x3e8>; + }; + + current_group_3 { + cable_number = <0x5 0x20>; + input_current = <0x5dc>; + charging_current = <0x5dc>; + }; + + current_group_4 { + cable_number = <0x6 0x7 0x8 0x11 0x12>; + input_current = <0x672>; + charging_current = <0xaf0>; + }; + + current_group_5 { + cable_number = <0x9>; + input_current = <0x672>; + charging_current = <0xc4e>; + }; + + current_group_6 { + cable_number = <0xa 0xc 0xf 0x1b 0x21 0x24>; + input_current = <0x320>; + charging_current = <0x960>; + }; + + current_group_7 { + cable_number = <0xd>; + input_current = <0x2bc>; + charging_current = <0x960>; + }; + + current_group_8 { + cable_number = <0x18>; + input_current = <0x3e8>; + charging_current = <0x1c2>; + }; + + current_group_9 { + cable_number = <0x23>; + input_current = <0x708>; + charging_current = <0x708>; + }; + + current_group_10 { + cable_number = <0xb 0xe 0x10 0x1c 0x23>; + input_current = <0x28a>; + charging_current = <0x960>; + }; + + current_group_11 { + cable_number = <0x1d 0x25>; + input_current = <0x1f4>; + charging_current = <0x4b0>; + }; + + current_group_12 { + cable_number = <0x1 0x4>; + input_current = <0x1db>; + charging_current = <0x226>; + }; + + current_group_13 { + cable_number = <0x22>; + input_current = <0x4b0>; + charging_current = <0x960>; + }; + }; + }; + }; + + __symbols__ { + dsi_rm69299_visionox_amoled_video = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video"; + dsi_rm69299_visionox_amoled_cmd = "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd"; + dsi_sim_vid = "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video"; + dsi_sim_cmd = "/fragment@3/__overlay__/qcom,mdss_dsi_sim_cmd"; + dsi_sim_dsc_375_cmd = "/fragment@4/__overlay__/qcom,mdss_dsi_sim_dsc_375_cmd"; + dsi_nt36672c_video = "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video"; + dsi_panel_pwr_supply = "/fragment@6/__overlay__/dsi_panel_pwr_supply"; + dsi_panel_pwr_supply_no_labibb = "/fragment@6/__overlay__/dsi_panel_pwr_supply_no_labibb"; + dsi_panel_pwr_supply_labibb_amoled = "/fragment@6/__overlay__/dsi_panel_pwr_supply_labibb_amoled"; + dsi_rm69299_visionox_amoled_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@0"; + dsi_rm69299_visionox_amoled_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@1"; + dsi_sim_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@2"; + dsi_sim_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@3"; + dsi_sim_dsc_375_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@4"; + dsi_nt36672c_video_display = "/fragment@6/__overlay__/qcom,dsi-display@5"; + sde_dsi = "/fragment@6/__overlay__/qcom,dsi-display"; + sde_wb = "/fragment@6/__overlay__/qcom,wb-display@0"; + ext_disp = "/fragment@6/__overlay__/qcom,msm-ext-disp"; + ext_disp_audio_codec = "/fragment@6/__overlay__/qcom,msm-ext-disp/qcom,msm-ext-disp-audio-codec-rx"; + mtp_batterydata = "/fragment@11/__overlay__/qcom,battery-data"; + lpi_tlmm = "/fragment@27/__overlay__/lpi_pinctrl@627C0000"; + cdc_dmic01_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_active"; + cdc_dmic01_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_sleep"; + cdc_dmic01_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_active"; + cdc_dmic01_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_sleep"; + cdc_dmic23_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_active"; + cdc_dmic23_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_sleep"; + cdc_dmic23_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_active"; + cdc_dmic23_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_sleep"; + cdc_dmic45_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_active"; + cdc_dmic45_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_sleep"; + cdc_dmic45_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_active"; + cdc_dmic45_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_sleep"; + tx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_sleep"; + tx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_active"; + tx_swr_data0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_sleep"; + tx_swr_data0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_active"; + wsa_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_sleep"; + wsa_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_active"; + wsa_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_sleep"; + wsa_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_active"; + tx_swr_data1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_sleep"; + tx_swr_data1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_active"; + tx_swr_data2_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_sleep"; + tx_swr_data2_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_active"; + rx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_sleep"; + rx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_active"; + rx_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_sleep"; + rx_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_active"; + lpi_i2s1_sck_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_active"; + lpi_i2s1_sck_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_sleep"; + lpi_i2s1_ws_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_active"; + lpi_i2s1_ws_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_sleep"; + lpi_i2s1_sd0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_active"; + lpi_i2s1_sd0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_sleep"; + lpi_i2s1_sd1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_active"; + lpi_i2s1_sd1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_sleep"; + tx_macro = "/fragment@28/__overlay__/tx-macro@62620000"; + swr2 = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master"; + wcd938x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd938x-tx-slave"; + wcd937x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd937x-tx-slave"; + rx_macro = "/fragment@28/__overlay__/rx-macro@62600000"; + swr1 = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master"; + wcd938x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd938x-rx-slave"; + wcd937x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd937x-rx-slave"; + wsa_macro = "/fragment@28/__overlay__/wsa-macro@62640000"; + swr0 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master"; + wsa881x_0211 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211"; + wsa881x_0212 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212"; + wsa881x_0213 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213"; + wsa881x_0214 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214"; + va_macro = "/fragment@28/__overlay__/va-macro@62770000"; + wcd938x_codec = "/fragment@28/__overlay__/wcd938x-codec"; + wcd937x_codec = "/fragment@28/__overlay__/wcd937x-codec"; + cdc_dmic01_gpios = "/fragment@30/__overlay__/cdc_dmic01_pinctrl"; + cdc_dmic23_gpios = "/fragment@30/__overlay__/cdc_dmic23_pinctrl"; + cdc_dmic45_gpios = "/fragment@30/__overlay__/cdc_dmic45_pinctrl"; + wsa_swr_gpios = "/fragment@30/__overlay__/wsa_swr_clk_data_pinctrl"; + rx_swr_gpios = "/fragment@30/__overlay__/rx_swr_clk_data_pinctrl"; + tx_swr_gpios = "/fragment@30/__overlay__/tx_swr_clk_data_pinctrl"; + wsa_spkr_en1 = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl"; + wsa_spkr_en2 = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl"; + wcd_rst_gpio = "/fragment@31/__overlay__/msm_cdc_pinctrl@58"; + clock_audio_wsa_1 = "/fragment@31/__overlay__/wsa_core_clk"; + clock_audio_wsa_2 = "/fragment@31/__overlay__/wsa_npl_clk"; + clock_audio_rx_1 = "/fragment@31/__overlay__/rx_core_clk"; + clock_audio_rx_2 = "/fragment@31/__overlay__/rx_npl_clk"; + clock_audio_tx_1 = "/fragment@31/__overlay__/tx_core_clk"; + clock_audio_tx_2 = "/fragment@31/__overlay__/tx_npl_clk"; + clock_audio_va_1 = "/fragment@31/__overlay__/va_core_clk"; + clock_audio_va_2 = "/fragment@31/__overlay__/va_npl_clk"; + qupv3_se8_2hsuart = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000"; + qupv3_se8_2hsuart_pins = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins"; + qupv3_se8_2uart_tx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_active"; + qupv3_se8_2uart_rx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_active"; + qupv3_se8_2uart_tx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_sleep"; + qupv3_se8_2uart_rx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_sleep"; + sec_debug_region = "/fragment@37/__overlay__/sec_debug_region@0"; + sec_debug_autocomment = "/fragment@37/__overlay__/sec_debug_autocomment@0"; + sec_debug_rdx_bootdev = "/fragment@37/__overlay__/sec_debug_rdx_bootdev@0"; + kaslr_region = "/fragment@37/__overlay__/kaslr_region@A0001000"; + rkp_region = "/fragment@37/__overlay__/rkp_region@B0200000"; + hdm_region = "/fragment@37/__overlay__/hdm_region@A1000000"; + modem_shared_mem = "/fragment@37/__overlay__/modem_shared_mem_region@B5000000"; + usb_noti = "/fragment@60/__overlay__/usb-notifier"; + imp_list = "/fragment@65/__overlay__/imp_list"; + cdc_quin_mi2s_gpios = "/fragment@66/__overlay__/msm_cdc_pinctrl_quin"; + samsung_q6audio_adaptation = "/fragment@67/__overlay__/samsung,q6audio-adaptation"; + det_zones = "/fragment@67/__overlay__/det_zones"; + i2c_18 = "/fragment@67/__overlay__/i2c@18"; + tas256x = "/fragment@67/__overlay__/i2c@18/tas256x@4c"; + tas25xx_gpio_default = "/fragment@70/__overlay__/tas25xx_gpio_default"; + fm_lna_default = "/fragment@70/__overlay__/fm_lna_default"; + grip_i2c_active = "/fragment@71/__overlay__/grip_i2c/grip_i2c_active"; + grip_i2c_suspend = "/fragment@71/__overlay__/grip_i2c/grip_i2c_suspend"; + s2mpb03_i2c_sda_default = "/fragment@71/__overlay__/s2mpb03_i2c_sda_default"; + s2mpb03_i2c_scl_default = "/fragment@71/__overlay__/s2mpb03_i2c_scl_default"; + cam_sensor_mclk0_active = "/fragment@71/__overlay__/cam_sensor_mclk0_active"; + cam_sensor_mclk0_suspend = "/fragment@71/__overlay__/cam_sensor_mclk0_suspend"; + cam_sensor_mclk1_active = "/fragment@71/__overlay__/cam_sensor_mclk1_active"; + cam_sensor_mclk1_suspend = "/fragment@71/__overlay__/cam_sensor_mclk1_suspend"; + cam_sensor_mclk2_active = "/fragment@71/__overlay__/cam_sensor_mclk2_active"; + cam_sensor_mclk2_suspend = "/fragment@71/__overlay__/cam_sensor_mclk2_suspend"; + cam_sensor_mclk3_active = "/fragment@71/__overlay__/cam_sensor_mclk3_active"; + cam_sensor_mclk3_suspend = "/fragment@71/__overlay__/cam_sensor_mclk3_suspend"; + cam_sensor_mclk4_active = "/fragment@71/__overlay__/cam_sensor_mclk4_active"; + cam_sensor_mclk4_suspend = "/fragment@71/__overlay__/cam_sensor_mclk4_suspend"; + rcam1_sensor_reset_active = "/fragment@71/__overlay__/rcam1_sensor_reset_active"; + rcam1_sensor_reset_suspend = "/fragment@71/__overlay__/rcam1_sensor_reset_suspend"; + front_sensor_reset_active = "/fragment@71/__overlay__/front_sensor_reset_active"; + front_sensor_reset_suspend = "/fragment@71/__overlay__/front_sensor_reset_suspend"; + rcam3_sensor_reset_active = "/fragment@71/__overlay__/rcam3_sensor_reset_active"; + rcam3_sensor_reset_suspend = "/fragment@71/__overlay__/rcam3_sensor_reset_suspend"; + rcam2_sensor_reset_active = "/fragment@71/__overlay__/rcam2_sensor_reset_active"; + rcam2_sensor_reset_suspend = "/fragment@71/__overlay__/rcam2_sensor_reset_suspend"; + rcam4_sensor_reset_active = "/fragment@71/__overlay__/rcam4_sensor_reset_active"; + rcam4_sensor_reset_suspend = "/fragment@71/__overlay__/rcam4_sensor_reset_suspend"; + rcam1_sensor_vana_active = "/fragment@71/__overlay__/rcam1_sensor_vana_active"; + rcam1_sensor_vana_suspend = "/fragment@71/__overlay__/rcam1_sensor_vana_suspend"; + rcam2_sensor_vana_active = "/fragment@71/__overlay__/rcam2_sensor_vana_active"; + rcam2_sensor_vana_suspend = "/fragment@71/__overlay__/rcam2_sensor_vana_suspend"; + rcam3_sensor_vana_active = "/fragment@71/__overlay__/rcam3_sensor_vana_active"; + rcam3_sensor_vana_suspend = "/fragment@71/__overlay__/rcam3_sensor_vana_suspend"; + rcam4_sensor_vana_active = "/fragment@71/__overlay__/rcam4_sensor_vana_active"; + rcam4_sensor_vana_suspend = "/fragment@71/__overlay__/rcam4_sensor_vana_suspend"; + cam_mipi_sel_active = "/fragment@71/__overlay__/cam_mipi_sel_active"; + cam_mipi_sel_suspend = "/fragment@71/__overlay__/cam_mipi_sel_suspend"; + rcam2_sensor_vdig_active = "/fragment@71/__overlay__/rcam2_sensor_vdig_active"; + rcam2_sensor_vdig_suspend = "/fragment@71/__overlay__/rcam2_sensor_vdig_suspend"; + rcam4_sensor_vdig_active = "/fragment@71/__overlay__/rcam4_sensor_vdig_active"; + rcam4_sensor_vdig_suspend = "/fragment@71/__overlay__/rcam4_sensor_vdig_suspend"; + if_pmic_i2c_pins = "/fragment@71/__overlay__/if_pmic_i2c_pins"; + if_pmic_i2c_sleep = "/fragment@71/__overlay__/if_pmic_i2c_pins/if_pmic_i2c_sleep"; + usbpd_i2c_pins = "/fragment@71/__overlay__/usbpd_i2c_pins"; + usbpd_i2c_sleep = "/fragment@71/__overlay__/usbpd_i2c_pins/usbpd_i2c_sleep"; + mcu_reset_active = "/fragment@71/__overlay__/mcu_reset_active"; + mcu_reset_suspend = "/fragment@71/__overlay__/mcu_reset_suspend"; + mcu_clk_active = "/fragment@71/__overlay__/mcu_clk_active"; + mcu_clk_suspend = "/fragment@71/__overlay__/mcu_clk_suspend"; + torch_en_active = "/fragment@71/__overlay__/torch_en_active"; + torch_en_suspend = "/fragment@71/__overlay__/torch_en_suspend"; + grip_int_active = "/fragment@72/__overlay__/grip_int_active"; + grip_int_suspend = "/fragment@72/__overlay__/grip_int_suspend"; + i2c2 = "/fragment@77/__overlay__/i2c@2"; + s2mpb03_l1 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo1"; + s2mpb03_l2 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo2"; + s2mpb03_l3 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo3"; + s2mpb03_l4 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo4"; + s2mpb03_l5 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo5"; + s2mpb03_l6 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo6"; + s2mpb03_l7 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo7"; + tsp_int = "/fragment@82/__overlay__/tsp_int"; + qupv3_se7_i2c_pins_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp"; + qupv3_se7_i2c_active_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp/qupv3_se7_i2c_active_tsp"; + qupv3_se7_i2c_sleep_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp/qupv3_se7_i2c_sleep_tsp"; + tsp_zt = "/fragment@83/__overlay__/touchscreen@20"; + tsp_stm = "/fragment@83/__overlay__/touchscreen@49"; + key_vol_up_default = "/fragment@84/__overlay__/key_vol_up/key_vol_up_default"; + self_display_FC3_dtsi = "/fragment@87/__overlay__/self_display_FC3_dtsi"; + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD = "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + ss_dsi_panel_PBA_BOOTING_FHD = "/fragment@89/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD"; + sde_te_active = "/fragment@90/__overlay__/pmx_sde_te/sde_te_active"; + sde_te_suspend = "/fragment@90/__overlay__/pmx_sde_te/sde_te_suspend"; + pmx_sde = "/fragment@90/__overlay__/pmx_sde"; + sde_dsi_active = "/fragment@90/__overlay__/pmx_sde/sde_dsi_active"; + sde_dsi_suspend = "/fragment@90/__overlay__/pmx_sde/sde_dsi_suspend"; + sde_ub_det_default = "/fragment@91/__overlay__/pmx_sde_ub_det/sde_ub_det_default"; + sde_fg_err_default = "/fragment@92/__overlay__/pmx_sde_fg_err/sde_fg_err_default"; + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD_display = "/fragment@93/__overlay__/qcom,dsi-display@9"; + ss_dsi_panel_PBA_BOOTING_FHD_display = "/fragment@93/__overlay__/qcom,dsi-display@10"; + if_pmic_irq_default = "/fragment@99/__overlay__/if_pmic_irq/if_pmic_irq_default"; + usbpd_irq_default = "/fragment@99/__overlay__/usbpd_irq/usbpd_irq_default"; + fps_rst = "/fragment@101/__overlay__/fps_rst"; + sm5714_flash0 = "/fragment@106/__overlay__/qcom,flash_0"; + sm5714_torch0 = "/fragment@106/__overlay__/qcom,torch_0"; + led_flash0 = "/fragment@106/__overlay__/qcom,camera-flash@0"; + ois_rear = "/fragment@108/__overlay__/qcom,ois@62"; + eeprom2 = "/fragment@109/__overlay__/qcom,eeprom@0x2D"; + eeprom3 = "/fragment@109/__overlay__/qcom,eeprom@37"; + sensor_rear_macro = "/fragment@110/__overlay__/qcom,cam-sensor@4"; + eeprom4 = "/fragment@110/__overlay__/qcom,eeprom@0x3F"; + actuator_rear0 = "/fragment@111/__overlay__/qcom,actuator@0xC"; + eeprom0 = "/fragment@111/__overlay__/qcom,eeprom@50"; + eeprom1 = "/fragment@111/__overlay__/qcom,eeprom@51"; + vibrator = "/fragment@112/__overlay__/samsung,vibrator"; + nfc_qupv3_se0_i2c_sleep = "/fragment@113/__overlay__/nfc_qupv3_se0_i2c_sleep"; + nfc_clk_req_gpio = "/fragment@113/__overlay__/nfc_clk_req_gpio"; + nfc_irq_gpio = "/fragment@113/__overlay__/nfc_irq_gpio"; + nfc_ven_gpio = "/fragment@113/__overlay__/nfc_ven_gpio"; + nfc_firm_gpio = "/fragment@113/__overlay__/nfc_firm_gpio"; + nfc_ldo_en_gpio = "/fragment@113/__overlay__/nfc_ldo_en_gpio"; + hall_default = "/fragment@116/__overlay__/hall/hall_default"; + L8C = "/fragment@117/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150l_l8 = "/fragment@117/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150_l5 = "/fragment@117/__overlay__/rpmh-regulator-ldoa5/regulator-pm6150-l5"; + i2c_17 = "/fragment@117/__overlay__/i2c@17"; + }; + + __fixups__ { + mdss_mdp = "/fragment@0:target:0", "/fragment@1:target:0", "/fragment@2:target:0", "/fragment@3:target:0", "/fragment@4:target:0", "/fragment@5:target:0", "/fragment@8:target:0", "/fragment@10:target:0", "/fragment@88:target:0", "/fragment@89:target:0"; + tlmm = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-te-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-te-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-te-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-te-gpio:0", "/fragment@7/__overlay__:qcom,usbplug-cc-gpio:0", "/fragment@17/__overlay__:cd-gpios:0", "/fragment@24/__overlay__/synaptics_tcm@20:interrupt-parent:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,irq-gpio:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,reset-gpio:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:interrupt-parent:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:reset-gpios:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:irq-gpios:0", "/fragment@25/__overlay__/nq@28:qcom,nq-irq:0", "/fragment@25/__overlay__/nq@28:qcom,nq-ven:0", "/fragment@25/__overlay__/nq@28:qcom,nq-firm:0", "/fragment@25/__overlay__/nq@28:qcom,nq-clkreq:0", "/fragment@25/__overlay__/nq@28:interrupt-parent:0", "/fragment@35:target:0", "/fragment@67/__overlay__/i2c@18:gpios:0", "/fragment@67/__overlay__/i2c@18:gpios:12", "/fragment@67/__overlay__/i2c@18/tas256x@4c:ti,reset-gpio:0", "/fragment@67/__overlay__/i2c@18/tas256x@4c:ti,irq-gpio:0", "/fragment@68/__overlay__:qcom,fm-lna-gpios:0", "/fragment@70:target:0", "/fragment@71:target:0", "/fragment@73:target:0", "/fragment@77/__overlay__/i2c@2:gpios:0", "/fragment@77/__overlay__/i2c@2:gpios:12", "/fragment@82:target:0", "/fragment@83/__overlay__/touchscreen@20:zinitix,irq_gpio:0", "/fragment@83/__overlay__/touchscreen@49:stm,irq_gpio:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:qcom,platform-reset-gpio:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:qcom,platform-te-gpio:0", "/fragment@89/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD:qcom,platform-reset-gpio:0", "/fragment@90:target:0", "/fragment@97/__overlay__/sm5714@49:sm5714,irq-gpio:0", "/fragment@98/__overlay__/usbpd-sm5714@33:usbpd,usbpd_int:0", "/fragment@99:target:0", "/fragment@101:target:0", "/fragment@103/__overlay__/gw9558-spi@0:goodix,gpio_reset:0", "/fragment@104/__overlay__/gw9558@0:goodix,gpio_reset:0", "/fragment@107/__overlay__/sm5714-fled:flash-en-gpio:0", "/fragment@107/__overlay__/sm5714-fled:torch-en-gpio:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:12", "/fragment@108/__overlay__/qcom,ois@62:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:24", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:36", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:12", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:24", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:36", "/fragment@112/__overlay__/samsung,vibrator:samsung,vib_en:0", "/fragment@113:target:0", "/fragment@114/__overlay__/sec-nfc@27:interrupt-parent:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,ven-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,irq-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,firm-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,clk_req-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,pvdd-gpio:0", "/fragment@117/__overlay__/i2c@17:gpios:0", "/fragment@117/__overlay__/i2c@17:gpios:12", "/fragment@118:target:0", "/fragment@120:target:0"; + pm6150l_gpios = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-reset-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-reset-gpio:0", "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-bklight-en-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-en-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-reset-gpio:0", "/fragment@22:target:0", "/fragment@72:target:0", "/fragment@84:target:0", "/fragment@85/__overlay__/vol_up:gpios:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:samsung,esd-irq-gpio1:0", "/fragment@92:target:0", "/fragment@117/__overlay__/i2c@17/sx9360-i2c@28:sx9360,nirq-gpio:0"; + soc = "/fragment@6:target:0", "/fragment@11:target:0", "/fragment@23:target:0", "/fragment@31:target:0", "/fragment@34:target:0", "/fragment@60:target:0", "/fragment@67:target:0", "/fragment@77:target:0", "/fragment@86:target:0", "/fragment@87:target:0", "/fragment@93:target:0", "/fragment@104:target:0", "/fragment@106:target:0", "/fragment@112:target:0", "/fragment@115:target:0", "/fragment@117:target:0", "/fragment@119:target:0", "/fragment@123:target:0"; + mdss_dsi0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-ctrl:0"; + mdss_dsi_phy0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-phy:0"; + mdss_dsi0_pll = "/fragment@6/__overlay__/qcom,dsi-display:clocks:0", "/fragment@6/__overlay__/qcom,dsi-display:clocks:8", "/fragment@6/__overlay__/qcom,dsi-display:clocks:16", "/fragment@6/__overlay__/qcom,dsi-display:clocks:24", "/fragment@6/__overlay__/qcom,dsi-display:clocks:32", "/fragment@6/__overlay__/qcom,dsi-display:clocks:40", "/fragment@6/__overlay__/qcom,dsi-display:clocks:48", "/fragment@6/__overlay__/qcom,dsi-display:clocks:56", "/fragment@6/__overlay__/qcom,dsi-display:clocks:64", "/fragment@6/__overlay__/qcom,dsi-display:clocks:72"; + L13A = "/fragment@6/__overlay__/qcom,dsi-display:vddio-supply:0"; + L18A = "/fragment@6/__overlay__/qcom,dsi-display:vdda-3p3-supply:0"; + lcdb_ldo_vreg = "/fragment@6/__overlay__/qcom,dsi-display:lab-supply:0"; + lcdb_ncp_vreg = "/fragment@6/__overlay__/qcom,dsi-display:ibb-supply:0"; + pm6150_l18 = "/fragment@6/__overlay__/qcom,dsi-display:vci-supply:0"; + pm6150_l13 = "/fragment@6/__overlay__/qcom,dsi-display:vddi-supply:0"; + sde_dp = "/fragment@7:target:0", "/fragment@8/__overlay__:connectors:8", "/fragment@26:target:0"; + pm6150_pdphy = "/fragment@7/__overlay__:qcom,dp-usbpd-detection:0"; + sde_dp_usbplug_cc_active = "/fragment@7/__overlay__:pinctrl-0:0"; + sde_dp_usbplug_cc_suspend = "/fragment@7/__overlay__:pinctrl-1:0"; + sde_rscc = "/fragment@8/__overlay__:connectors:12"; + thermal_zones = "/fragment@9:target:0", "/fragment@18:target:0"; + pm6150_trip0 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:trip:0"; + pm6150_charger = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:cooling-device:0", "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:cooling-device:0", "/fragment@21:target:0"; + pm6150_trip1 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:trip:0"; + pm6150l_trip0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:trip:0"; + CPU0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:cooling-device:0"; + CPU1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:cooling-device:0"; + CPU2 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:cooling-device:0"; + CPU3 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:cooling-device:0"; + CPU4 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:cooling-device:0"; + CPU5 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:cooling-device:0"; + CPU6 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:cooling-device:0"; + CPU7 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:cooling-device:0"; + pm6150l_trip1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:trip:0"; + bcl_lvl0 = "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:trip:0"; + bcl_lvl1 = "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:trip:0"; + bcl_lvl2 = "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:trip:0"; + soc_trip = "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:trip:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:trip:0"; + pm6150l_vadc = "/fragment@12:target:0", "/fragment@13/__overlay__:io-channels:0", "/fragment@13/__overlay__:io-channels:8", "/fragment@13/__overlay__:io-channels:16", "/fragment@13/__overlay__:io-channels:24", "/fragment@77/__overlay__/sec_thermistor@1:io-channels:0", "/fragment@77/__overlay__/sec_thermistor@2:io-channels:0", "/fragment@80:target:0"; + pm6150l_adc_tm = "/fragment@13:target:0", "/fragment@18/__overlay__/pa-therm1:thermal-sensors:0"; + ufsphy_mem = "/fragment@14:target:0"; + pm6150_l4 = "/fragment@14/__overlay__:vdda-phy-supply:0"; + pm6150l_l3 = "/fragment@14/__overlay__:vdda-pll-supply:0", "/fragment@15/__overlay__:qcom,vddp-ref-clk-supply:0"; + ufshc_mem = "/fragment@15:target:0", "/fragment@63:target:0"; + ufs_phy_gdsc = "/fragment@15/__overlay__:vdd-hba-supply:0"; + pm6150_l19 = "/fragment@15/__overlay__:vcc-supply:0", "/fragment@16/__overlay__:vdd-supply:0"; + pm6150_l12 = "/fragment@15/__overlay__:vccq2-supply:0", "/fragment@16/__overlay__:vdd-io-supply:0"; + sdhc_1 = "/fragment@16:target:0"; + sdc1_clk_on = "/fragment@16/__overlay__:pinctrl-0:0"; + sdc1_cmd_on = "/fragment@16/__overlay__:pinctrl-0:4"; + sdc1_data_on = "/fragment@16/__overlay__:pinctrl-0:8"; + sdc1_rclk_on = "/fragment@16/__overlay__:pinctrl-0:12"; + sdc1_clk_off = "/fragment@16/__overlay__:pinctrl-1:0"; + sdc1_cmd_off = "/fragment@16/__overlay__:pinctrl-1:4"; + sdc1_data_off = "/fragment@16/__overlay__:pinctrl-1:8"; + sdc1_rclk_off = "/fragment@16/__overlay__:pinctrl-1:12"; + sdhc_2 = "/fragment@17:target:0"; + pm6150l_l9 = "/fragment@17/__overlay__:vdd-supply:0"; + pm6150l_l6 = "/fragment@17/__overlay__:vdd-io-supply:0"; + sdc2_clk_on = "/fragment@17/__overlay__:pinctrl-0:0"; + sdc2_cmd_on = "/fragment@17/__overlay__:pinctrl-0:4"; + sdc2_data_on = "/fragment@17/__overlay__:pinctrl-0:8"; + sdc2_cd_on = "/fragment@17/__overlay__:pinctrl-0:12"; + sdc2_clk_off = "/fragment@17/__overlay__:pinctrl-1:0"; + sdc2_cmd_off = "/fragment@17/__overlay__:pinctrl-1:4"; + sdc2_data_off = "/fragment@17/__overlay__:pinctrl-1:8"; + sdc2_cd_off = "/fragment@17/__overlay__:pinctrl-1:12"; + pm6150a_amoled = "/fragment@19:target:0"; + pm6150_qg = "/fragment@20:target:0"; + pm6150_vadc = "/fragment@21/__overlay__:io-channels:0", "/fragment@21/__overlay__:io-channels:8", "/fragment@21/__overlay__:io-channels:16", "/fragment@21/__overlay__:io-channels:24", "/fragment@21/__overlay__:io-channels:32", "/fragment@21/__overlay__:io-channels:40", "/fragment@21/__overlay__:io-channels:48", "/fragment@77/__overlay__/sec_thermistor@0:io-channels:0", "/fragment@79:target:0", "/fragment@122:target:0", "/fragment@123/__overlay__/battery:io-channels:0", "/fragment@123/__overlay__/battery:io-channels:8"; + qusb_phy0 = "/fragment@21/__overlay__:dpdm-supply:0", "/fragment@100:target:0"; + qupv3_se7_i2c = "/fragment@24:target:0", "/fragment@83:target:0", "/fragment@107:target:0"; + ts_active = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-0:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-0:0"; + ts_int_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:0"; + ts_reset_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:4", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:4"; + ts_release = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-2:0"; + pm6150_l10 = "/fragment@24/__overlay__/synaptics_tcm@20:vdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:vdd-supply:0", "/fragment@83/__overlay__/touchscreen@49:dvdd-supply:0"; + pm6150l_l7 = "/fragment@24/__overlay__/synaptics_tcm@20:avdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:avdd-supply:0", "/fragment@81:target:0", "/fragment@83/__overlay__/touchscreen@20:avdd-supply:0", "/fragment@83/__overlay__/touchscreen@49:avdd-supply:0"; + qupv3_se0_i2c = "/fragment@25:target:0", "/fragment@114:target:0"; + nfc_int_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:0"; + nfc_enable_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:4"; + nfc_clk_req_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:8"; + nfc_int_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:0"; + nfc_enable_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:4"; + nfc_clk_req_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:8"; + fsa4480 = "/fragment@26/__overlay__:qcom,dp-aux-switch:0", "/fragment@69:target:0"; + q6core = "/fragment@27:target:0", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:4", "/fragment@30:target:0", "/fragment@66:target:0", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:4"; + lpass_core_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:0", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:0", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:0"; + lpass_audio_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:8", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:8", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:8", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:8", "/fragment@28/__overlay__/va-macro@62770000:clocks:0"; + bolero = "/fragment@28:target:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214:qcom,bolero-handle:0", "/fragment@29/__overlay__:asoc-codec:4", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:12", "/fragment@65:target:0", "/fragment@68/__overlay__:asoc-codec:4", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:12"; + L10A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-rxtx-supply:0", "/fragment@28/__overlay__/wcd938x-codec:cdc-vddio-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-ldo-rxtx-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vddpx-1-supply:0"; + L15A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-buck-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-buck-supply:0"; + BOB = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-mic-bias-supply:0"; + atoll_snd = "/fragment@29:target:0", "/fragment@68:target:0"; + stub_codec = "/fragment@29/__overlay__:asoc-codec:0", "/fragment@68/__overlay__:asoc-codec:0"; + audio_apr = "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:0", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:0"; + spkr_1_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-0:0"; + spkr_1_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-1:0"; + spkr_2_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-0:0"; + spkr_2_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-1:0"; + wcd_reset_active = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-0:0"; + wcd_reset_sleep = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-1:0"; + va_cdc_dma_0_tx = "/fragment@32:target:0"; + aliases = "/fragment@33:target:0", "/fragment@64:target:0"; + clock_gcc = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:0", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:8", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:16"; + qupv3_1 = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:qcom,wrapper-core:0"; + dcc = "/fragment@36:target:0"; + reserved_memory = "/fragment@37:target:0", "/fragment@105:target:0", "/fragment@121:target:0"; + removed_region = "/fragment@38:target:0"; + pil_modem_mem = "/fragment@39:target:0"; + pil_adsp_mem = "/fragment@40:target:0"; + pil_camera_mem = "/fragment@41:target:0"; + pil_npu_mem = "/fragment@42:target:0"; + pil_video_mem = "/fragment@43:target:0"; + pil_cdsp_mem = "/fragment@44:target:0"; + qseecom_mem = "/fragment@45:target:0"; + qseecom_ta_mem = "/fragment@46:target:0"; + secure_carveout_heap = "/fragment@47:target:0"; + cdsp_sec_mem = "/fragment@48:target:0"; + msm_imem = "/fragment@49:target:0"; + camera = "/fragment@50:target:0"; + cam_vfe0 = "/fragment@51:target:0"; + cam_vfe1 = "/fragment@52:target:0"; + cam_vfe_lite = "/fragment@53:target:0"; + cam_lrme = "/fragment@54:target:0"; + shared_meta = "/fragment@55:target:0"; + android_q_fstab = "/fragment@56:target:0"; + pm8008_8 = "/fragment@57:target:0", "/fragment@75:target:0"; + pm8008_9 = "/fragment@58:target:0", "/fragment@76:target:0"; + usb0 = "/fragment@59:target:0"; + firmware = "/fragment@61:target:0"; + pil_modem = "/fragment@62:target:0"; + modem_smp2p_out = "/fragment@62/__overlay__:qcom,smem-states:0", "/fragment@62/__overlay__:qcom,smem-states:8", "/fragment@62/__overlay__:qcom,smem-states:16"; + pcm0 = "/fragment@68/__overlay__:asoc-platform:0"; + pcm1 = "/fragment@68/__overlay__:asoc-platform:4"; + pcm2 = "/fragment@68/__overlay__:asoc-platform:8"; + voip = "/fragment@68/__overlay__:asoc-platform:12"; + voice = "/fragment@68/__overlay__:asoc-platform:16"; + loopback = "/fragment@68/__overlay__:asoc-platform:20"; + compress = "/fragment@68/__overlay__:asoc-platform:24"; + hostless = "/fragment@68/__overlay__:asoc-platform:28"; + afe = "/fragment@68/__overlay__:asoc-platform:32"; + lsm = "/fragment@68/__overlay__:asoc-platform:36"; + routing = "/fragment@68/__overlay__:asoc-platform:40"; + compr = "/fragment@68/__overlay__:asoc-platform:44"; + pcm_noirq = "/fragment@68/__overlay__:asoc-platform:48"; + spmi_bus = "/fragment@74:target:0", "/fragment@117/__overlay__/i2c@17/sx9360-i2c@28:interrupt-parent:0"; + pm6150_gpios = "/fragment@78:target:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:samsung,ub-con-det:0", "/fragment@91:target:0", "/fragment@115/__overlay__/hall:hall,gpio_flip_cover:0", "/fragment@116:target:0"; + gpio_key = "/fragment@85:target:0"; + cont_splash_memory = "/fragment@94:target:0"; + dfps_data_memory = "/fragment@95:target:0"; + disp_rdump_memory = "/fragment@96:target:0"; + qupv3_se4_i2c = "/fragment@97:target:0"; + qupv3_se11_i2c = "/fragment@98:target:0"; + pm6150l_l11 = "/fragment@102:target:0"; + qupv3_se6_spi = "/fragment@103:target:0"; + pm6150l_switch2 = "/fragment@106/__overlay__/qcom,camera-flash@0:switch-source:0"; + qupv3_se10_i2c = "/fragment@108:target:0"; + cam_cci0 = "/fragment@109:target:0"; + titan_top_gdsc = "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@37:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:cam_clk-supply:0"; + clock_camcc = "/fragment@109/__overlay__/qcom,cam-sensor@0:clocks:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@37:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:clocks:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:clocks:0"; + cam_cci1 = "/fragment@110:target:0"; + qupv3_se9_i2c = "/fragment@111:target:0"; + apps_rsc = "/fragment@117/__overlay__/rpmh-regulator-ldoc8:mboxes:0"; + }; + + __local_fixups__ { + + fragment@0 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@1 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@2 { + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@5 { + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@6 { + + __overlay__ { + + qcom,dsi-display@0 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@1 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@2 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@3 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@4 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@5 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + qcom,dsi-display-list = <0x0 0x4>; + }; + }; + }; + + fragment@7 { + + __overlay__ { + qcom,ext-disp = <0x0>; + }; + }; + + fragment@8 { + + __overlay__ { + connectors = <0x0 0x4>; + }; + }; + + fragment@20 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@21 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@28 { + + __overlay__ { + + bolero-clk-rsc-mngr { + clocks = <0x0 0x8 0x10 0x18 0x20 0x28 0x30 0x38>; + }; + + tx-macro@62620000 { + clocks = <0x0 0x8>; + qcom,tx-swr-gpios = <0x0>; + }; + + rx-macro@62600000 { + clocks = <0x0 0x8>; + qcom,rx-swr-gpios = <0x0>; + }; + + wsa-macro@62640000 { + clocks = <0x0 0x8>; + qcom,wsa-swr-gpios = <0x0>; + + wsa_swr_master { + + wsa881x@20170211 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@20170212 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170213 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170214 { + qcom,spkr-sd-n-node = <0x0>; + }; + }; + }; + + wcd938x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + mbhc-button-thres = <0x0 0xc 0x18 0x24 0x30 0x3c 0x48 0x54>; + imp-table = <0x0 0x10 0x20 0x30 0x40 0x50 0x60 0x70>; + }; + + wcd937x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + }; + }; + }; + + fragment@29 { + + __overlay__ { + qcom,cdc-dmic01-gpios = <0x0>; + qcom,cdc-dmic23-gpios = <0x0>; + qcom,cdc-dmic45-gpios = <0x0>; + asoc-codec = <0x8>; + qcom,wsa-devs = <0x0 0x4 0x8 0xc>; + qcom,codec-aux-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@30 { + + __overlay__ { + + cdc_dmic01_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic23_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic45_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + wsa_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + rx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + tx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@34 { + + __overlay__ { + + qcom,qup_hsuart@a88000 { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@60 { + + __overlay__ { + + qcom,memshare { + + qcom,client_4 { + memory-region = <0x0>; + }; + }; + + samsung,sec_hdm { + memory-region = <0x0>; + }; + }; + }; + + fragment@66 { + + __overlay__ { + + msm_cdc_pinctrl_quin { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@67 { + + __overlay__ { + + i2c@18 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@68 { + + __overlay__ { + asoc-platform = <0x34>; + qcom,quin-mi2s-gpios = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@77 { + + __overlay__ { + + i2c@2 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@83 { + + __overlay__ { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + + touchscreen@20 { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + + touchscreen@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@85 { + + __overlay__ { + pinctrl-0 = <0x0>; + }; + }; + + fragment@88 { + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD { + ss,self_display = <0x0>; + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@89 { + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@97 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sm5714@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@98 { + + __overlay__ { + pinctrl-1 = <0x0>; + + usbpd-sm5714@33 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@103 { + + __overlay__ { + + gw9558-spi@0 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@104 { + + __overlay__ { + + gw9558@0 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@106 { + + __overlay__ { + + qcom,camera-flash@0 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,cam-res-mgr { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + }; + }; + + fragment@108 { + + __overlay__ { + + qcom,ois@62 { + cam_vaf-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@109 { + + __overlay__ { + + qcom,cam-sensor@0 { + actuator-src = <0x0>; + led-flash-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@2 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x2D { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@37 { + cam_vio-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + }; + }; + + fragment@110 { + + __overlay__ { + + qcom,cam-sensor@1 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@8 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@3 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@4 { + led-flash-src = <0x0>; + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + cam_vdig-supply = <0x0>; + }; + + qcom,eeprom@0x3F { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + cam_vdig-supply = <0x0>; + }; + }; + }; + + fragment@111 { + + __overlay__ { + + qcom,actuator@0xC { + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + }; + + qcom,eeprom@50 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@51 { + cam_vio-supply = <0x0>; + }; + }; + }; + + fragment@114 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sec-nfc@27 { + pinctrl-0 = <0x0 0x4 0x8 0xc 0x10>; + }; + }; + }; + + fragment@115 { + + __overlay__ { + + hall { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@117 { + + __overlay__ { + + i2c@17 { + pinctrl-0 = <0x0>; + + sx9360-i2c@28 { + pinctrl-0 = <0x0>; + }; + }; + }; + }; + }; }; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r04.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r04.dts index 43bfb79b2b36..6073befdeb17 100755 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r04.dts +++ b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r04.dts @@ -1,25 +1,7226 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - /dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a52q-r04.dtsi" -#include "drivers/atoll-sec-a52q-battery-r04.dtsi" / { model = "Samsung A52Q PROJECT REV02 (board-id,04)"; compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 4>; - dtbo-version = <0>; + qcom,board-id = <0x22 0x4>; + dtbo-version = <0x0>; + + fragment@0 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ video mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x37 0x30>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x38ae2bc0 0x37bc55b0 0x37f8cb38 0x383540b8 0x3871b640>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x3>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@1 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ cmd mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x3da58d80 0x3c9e86e0 0x3ce04888 0x3d220a30 0x3d63cbd8>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x4>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@2 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,mdss-dsi-panel-name = "Simulator video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-mode-switch; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x0 0x0 0x0 0x1 0x0>; + qcom,panel-ack-disabled; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x5>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-video-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,cmd-to-video-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,cmd-to-video-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1 0x2 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-cmd-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,video-to-cmd-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,video-to-cmd-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@3 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-t-clk-post = <0xc>; + qcom,mdss-dsi-t-clk-pre = <0x29>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-ack-disabled; + qcom,ulps-enabled; + phandle = <0x6>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x64>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x64>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x2d0 0x28 0x2d0 0x28 0x2d0 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x1cc>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x2e4>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x21c 0x28 0x21c 0x28 0x21c 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@2 { + qcom,mdss-dsi-panel-width = <0x2d0>; + qcom,mdss-dsi-panel-height = <0x500>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x348>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x564>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x168>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x168 0x28 0x168 0x28 0x168 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + }; + }; + }; + }; + + fragment@4 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_dsc_375_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode DSC 3.75:1 dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,panel-ack-disabled; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,ulps-enabled; + phandle = <0x7>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-pulse-width = <0x10>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x8>; + qcom,mdss-dsi-v-front-porch = <0xa>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-on-command = <0x15010000 0x2ff 0x20150100 0x2 0xfb011501 0x0 0x2000115 0x1000000 0x20155 0x15010000 0x202 0x45150100 0x2 0x5401501 0x0 0x2061915 0x1000000 0x2071e 0x15010000 0x20b 0x73150100 0x2 0xc731501 0x0 0x20eb015 0x1000000 0x20fae 0x15010000 0x211 0xb8150100 0x2 0x13001501 0x0 0x2588015 0x1000000 0x25901 0x15010000 0x25a 0x150100 0x2 0x5b011501 0x0 0x25c8015 0x1000000 0x25d81 0x15010000 0x25e 0x150100 0x2 0x5f011501 0x0 0x2723115 0x1000000 0x26803 0x15010000 0x2ff 0x24150100 0x2 0xfb011501 0x0 0x2001c15 0x1000000 0x2010b 0x15010000 0x202 0xc150100 0x2 0x3011501 0x0 0x2040f15 0x1000000 0x20510 0x15010000 0x206 0x10150100 0x2 0x7101501 0x0 0x2088915 0x1000000 0x2098a 0x15010000 0x20a 0x13150100 0x2 0xb131501 0x0 0x20c1515 0x1000000 0x20d15 0x15010000 0x20e 0x17150100 0x2 0xf171501 0x0 0x2101c15 0x1000000 0x2110b 0x15010000 0x212 0xc150100 0x2 0x13011501 0x0 0x2140f15 0x1000000 0x21510 0x15010000 0x216 0x10150100 0x2 0x17101501 0x0 0x2188915 0x1000000 0x2198a 0x15010000 0x21a 0x13150100 0x2 0x1b131501 0x0 0x21c1515 0x1000000 0x21d15 0x15010000 0x21e 0x17150100 0x2 0x1f171501 0x0 0x2204015 0x1000000 0x22101 0x15010000 0x222 0x150100 0x2 0x23401501 0x0 0x2244015 0x1000000 0x2256d 0x15010000 0x226 0x40150100 0x2 0x27401501 0x0 0x2e00015 0x1000000 0x2dc21 0x15010000 0x2dd 0x22150100 0x2 0xde071501 0x0 0x2df0715 0x1000000 0x2e36d 0x15010000 0x2e1 0x7150100 0x2 0xe2071501 0x0 0x229d815 0x1000000 0x22a2a 0x15010000 0x24b 0x3150100 0x2 0x4c111501 0x0 0x24d1015 0x1000000 0x24e01 0x15010000 0x24f 0x1150100 0x2 0x50101501 0x0 0x2510015 0x1000000 0x25280 0x15010000 0x253 0x150100 0x2 0x56001501 0x0 0x2540715 0x1000000 0x25807 0x15010000 0x255 0x25150100 0x2 0x5b431501 0x0 0x25c0015 0x1000000 0x25f73 0x15010000 0x260 0x73150100 0x2 0x63221501 0x0 0x2640015 0x1000000 0x26708 0x15010000 0x268 0x4150100 0x2 0x72021501 0x0 0x27a8015 0x1000000 0x27b91 0x15010000 0x27c 0xd8150100 0x2 0x7d601501 0x0 0x27f1515 0x1000000 0x27515 0x15010000 0x2b3 0xc0150100 0x2 0xb4001501 0x0 0x2b50015 0x1000000 0x27800 0x15010000 0x279 0x150100 0x2 0x80001501 0x0 0x2830015 0x1000000 0x2930a 0x15010000 0x294 0xa150100 0x2 0x8a001501 0x0 0x29bff15 0x1000000 0x29db0 0x15010000 0x29f 0x63150100 0x2 0x98101501 0x0 0x2ec0015 0x1000000 0x2ff10 0x39010000 0x11c1 0x9200010 0x2000268 0x1bb000a 0x66704c5 0x39010000 0x3c2 0x10f01501 0x0 0x2c00315 0x1000000 0x43b03 0xa0a1501 0x0 0x2350015 0x1000000 0x2e501 0x15010000 0x2bb 0x10150100 0x2 0xfb010501 0x7800 0x2110005 0x1000078 0x22900>; + qcom,mdss-dsi-off-command = [05 01 00 00 78 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x0>; + qcom,mdss-dsi-h-back-porch = <0x0>; + qcom,mdss-dsi-h-pulse-width = <0x0>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x0>; + qcom,mdss-dsi-v-front-porch = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x0>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = <0x15010000 0x2bb 0x10150100 0x2 0xb0030501 0x7800 0x1111501 0x0 0x251ff15 0x1000000 0x25324 0x15010000 0x2ff 0x23150100 0x2 0x8051501 0x0 0x2469015 0x1000000 0x2ff10 0x15010000 0x2ff 0xf0150100 0x2 0x92011501 0x0 0x2ff1015 0x1000000 0x23500 0x5010000 0x28000129>; + qcom,mdss-dsi-off-command = <0x5010000 0x10000128 0x5010000 0x40000110>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x150505 0x201f0505 0x3020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1 0x2 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@5 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,mdss-dsi-panel-name = "nt36672c fhd plus video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x14 0x0 0x14 0x1 0x14>; + qcom,mdss-pan-physical-width-dimension = <0x4a>; + qcom,mdss-pan-physical-height-dimension = <0x83>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-cphy-mode; + qcom,mdss-dsi-t-clk-post = <0x0>; + qcom,mdss-dsi-t-clk-pre = <0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x5a 0x32>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-skip-timing-update; + qcom,dsi-dyn-clk-list = <0x3eb54a94 0x3e726713 0x3e2f838b 0x3deca00a 0x3da9bc89>; + qcom,dsi-dyn-clk-type = "constant-fps-adjust-hfp"; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,platform-bklight-en-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-en-gpio = <0xffffffff 0x4 0x0>; + phandle = <0x8>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-front-porch = <0xca>; + qcom,mdss-dsi-h-back-porch = <0x38>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0xa>; + qcom,mdss-dsi-v-front-porch = <0x50b>; + qcom,mdss-dsi-v-pulse-width = <0xa>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 b0 00 29 01 00 00 00 00 02 c0 00 29 01 00 00 00 00 03 c2 1b a0 29 01 00 00 00 00 02 ff 25 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 18 20 15 01 00 00 00 00 02 ff 2a 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 27 80 15 01 00 00 00 00 02 28 fd 29 01 00 00 00 00 02 ff f0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 5a 00 29 01 00 00 00 00 02 a0 08 29 01 00 00 00 00 02 ff d0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 09 ad 15 01 00 00 00 00 02 ff 10 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 51 ff 15 01 00 00 00 00 02 53 2c 15 01 00 00 00 00 02 ff 23 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 0a 00 15 01 00 00 00 00 02 0b 00 15 01 00 00 00 00 02 0c 00 15 01 00 00 00 00 02 0d 00 15 01 00 00 00 00 02 11 01 15 01 00 00 00 00 02 12 95 15 01 00 00 00 00 02 15 68 15 01 00 00 00 00 02 16 0b 15 01 00 00 00 00 02 6f 00 15 01 00 00 00 00 02 70 00 15 01 00 00 00 00 02 71 00 15 01 00 00 00 00 02 a0 11 15 01 00 00 00 00 02 ff f0 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 d2 52 29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 35 00 05 01 00 00 78 00 02 11 00 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x230909 0x26240909 0x9060204>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@6 { + target = <0xffffffff>; + + __overlay__ { + + dsi_panel_pwr_supply { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xab>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + }; + + qcom,panel-supply-entry@2 { + reg = <0x2>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-post-on-sleep = <0x14>; + }; + }; + + dsi_panel_pwr_supply_no_labibb { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x2>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + }; + + dsi_panel_pwr_supply_labibb_amoled { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x1>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vdda-3p3"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x3390>; + qcom,supply-disable-load = <0x50>; + }; + }; + + qcom,dsi-display@0 { + label = "dsi_rm69299_visionox_amoled_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0"; + qcom,dsi-panel = <0x3>; + qcom,dsi-display-active; + phandle = <0xac>; + }; + + qcom,dsi-display@1 { + label = "dsi_rm69299_visionox_amoled_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x4>; + phandle = <0xad>; + }; + + qcom,dsi-display@2 { + label = "dsi_sim_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x5>; + phandle = <0xae>; + }; + + qcom,dsi-display@3 { + label = "dsi_sim_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x6>; + phandle = <0xaf>; + }; + + qcom,dsi-display@4 { + label = "dsi_sim_dsc_375_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x7>; + phandle = <0xb0>; + }; + + qcom,dsi-display@5 { + label = "dsi_nt36672c_video_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + qcom,dsi-panel = <0x8>; + phandle = <0xb1>; + }; + + qcom,dsi-display { + compatible = "qcom,dsi-display"; + qcom,dsi-ctrl = <0xffffffff>; + qcom,dsi-phy = <0xffffffff>; + clocks = <0xffffffff 0x6 0xffffffff 0x9 0xffffffff 0x3 0xffffffff 0x8 0xffffffff 0xa 0xffffffff 0xd 0xffffffff 0x11 0xffffffff 0x15 0xffffffff 0x16 0xffffffff 0x19>; + clock-names = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + pinctrl-names = "panel_active", "panel_suspend"; + pinctrl-0 = <0x9 0xa 0xb 0xc>; + pinctrl-1 = <0xd 0xe 0xb 0xc>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,panel-te-source = <0x0>; + vddio-supply = <0xffffffff>; + vdda-3p3-supply = <0xffffffff>; + lab-supply = <0xffffffff>; + ibb-supply = <0xffffffff>; + qcom,dsi-display-list = <0xf 0x10>; + vci-supply = <0xffffffff>; + vddi-supply = <0xffffffff>; + phandle = <0x13>; + }; + + qcom,wb-display@0 { + compatible = "qcom,wb-display"; + cell-index = <0x0>; + label = "wb_display"; + phandle = <0x12>; + }; + + qcom,msm-ext-disp { + compatible = "qcom,msm-ext-disp"; + phandle = <0x11>; + + qcom,msm-ext-disp-audio-codec-rx { + compatible = "qcom,msm-ext-disp-audio-codec-rx"; + phandle = <0x2c>; + }; + }; + }; + }; + + fragment@7 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-usbpd-detection = <0xffffffff>; + qcom,ext-disp = <0x11>; + qcom,usbplug-cc-gpio = <0xffffffff 0x68 0x0>; + pinctrl-name = "mdss_dp_active", "mdss_dp_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + }; + }; + + fragment@8 { + target = <0xffffffff>; + + __overlay__ { + connectors = <0x12 0x13 0xffffffff 0xffffffff>; + }; + }; + + fragment@9 { + target = <0xffffffff>; + + __overlay__ { + + pm6150-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150l-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_cpu0 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl0 { + disable-thermal-zone; + + cooling-maps { + + vbat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + vbat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl1 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl2 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + soc { + disable-thermal-zone; + + cooling-maps { + + soc_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + soc_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + }; + }; + + fragment@10 { + target = <0xffffffff>; + + __overlay__ { + #cooling-cells = <0x2>; + }; + }; + + fragment@11 { + target = <0xffffffff>; + + __overlay__ { + + qcom,battery-data { + qcom,batt-id-range-pct = <0xf>; + phandle = <0x14>; + + qcom,alium_860_89032_0000_3600mAh { + qcom,max-voltage-uv = <0x426030>; + qcom,fg-cc-cv-threshold-uv = <0x423920>; + qcom,fastchg-current-ma = <0x1518>; + qcom,batt-id-kohm = <0x6b>; + qcom,battery-beta = <0x109a>; + qcom,battery-therm-kohm = <0x64>; + qcom,battery-type = "Alium_860_89032_0000_3600mAh_Jun15th2018"; + qcom,qg-batt-profile-ver = <0x64>; + qcom,jeita-fcc-ranges = <0x0 0x32 0x2625a0 0x33 0x190 0x5265c0 0x191 0x1c2 0x2625a0>; + qcom,jeita-fv-ranges = <0x0 0x32 0x40d990 0x33 0x190 0x426030 0x191 0x1c2 0x40d990>; + qcom,step-chg-ranges = <0x36ee80 0x39fbc0 0x5265c0 0x39fbc1 0x419ce0 0x36ee80 0x419ce1 0x426030 0x2625a0>; + qcom,ocv-based-step-chg; + qcom,jeita-soft-thresholds = <0x5314 0x25e3>; + qcom,jeita-hard-thresholds = <0x58cd 0x20b8>; + qcom,jeita-soft-hys-thresholds = <0x4f5e 0x2943>; + qcom,jeita-soft-fcc-ua = <0x2625a0 0x2625a0>; + qcom,jeita-soft-fv-uv = <0x40d990 0x40d990>; + + qcom,fcc1-temp-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xd62 0xdbf 0xdfd 0xe1d 0xe2e>; + }; + + qcom,fcc2-temp-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xdda 0xdf8 0xe02 0xe04 0xdff 0xdff>; + }; + + qcom,pc-temp-v1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa846 0xa903 0xa965 0xa982 0xa987 0xa757 0xa82c 0xa88b 0xa8b2 0xa8bc 0xa671 0xa747 0xa7a8 0xa7d4 0xa7e5 0xa598 0xa65f 0xa6c5 0xa6f2 0xa707 0xa4ca 0xa582 0xa5e5 0xa611 0xa627 0xa3ff 0xa4af 0xa508 0xa531 0xa546 0xa330 0xa3e1 0xa430 0xa452 0xa465 0xa25d 0xa311 0xa35c 0xa377 0xa387 0xa1a0 0xa23e 0xa287 0xa29e 0xa2ad 0xa10a 0xa17a 0xa1b1 0xa1c4 0xa1d2 0xa07e 0xa0e5 0xa0f6 0xa0f5 0xa0fc 0x9fa9 0xa061 0xa067 0xa048 0xa036 0x9e4b 0x9f9a 0x9fd6 0x9fae 0x9f81 0x9cdb 0x9e3d 0x9ee8 0x9ee6 0x9ebf 0x9bed 0x9cd1 0x9d85 0x9dc6 0x9dd7 0x9b4d 0x9bf5 0x9c67 0x9cb4 0x9cf4 0x9ad6 0x9b65 0x9bd6 0x9c18 0x9c4a 0x9a75 0x9af5 0x9b63 0x9baa 0x9bc5 0x9a1f 0x9a9b 0x9ade 0x9b13 0x9b23 0x99c4 0x9a41 0x9a3f 0x9a2d 0x9a41 0x9962 0x99c6 0x998a 0x9943 0x9959 0x98fd 0x992a 0x98b8 0x9892 0x98a0 0x9894 0x9882 0x97f4 0x9800 0x9807 0x982b 0x97c6 0x976f 0x9780 0x9781 0x97cb 0x9713 0x970f 0x970c 0x970c 0x9775 0x9697 0x96b5 0x96a2 0x96a2 0x9724 0x963e 0x965a 0x9642 0x963e 0x96db 0x95fa 0x9603 0x95e9 0x95e1 0x9698 0x95c7 0x95b7 0x9598 0x958b 0x965b 0x959d 0x9571 0x954e 0x953b 0x9627 0x9575 0x9533 0x950c 0x94f4 0x95f8 0x9550 0x94fe 0x94d1 0x94b3 0x95cc 0x952e 0x94cf 0x949b 0x947a 0x95a2 0x9511 0x94a4 0x9465 0x9440 0x9579 0x94f7 0x947f 0x9432 0x9407 0x954f 0x94d6 0x9458 0x93fe 0x93cc 0x9525 0x94b2 0x942f 0x93c6 0x938b 0x94f0 0x9484 0x9402 0x938b 0x9345 0x94a6 0x943e 0x93bf 0x9343 0x92f7 0x944c 0x93da 0x935f 0x92ed 0x92a2 0x93e6 0x936c 0x92f1 0x9288 0x923f 0x936b 0x92f1 0x9276 0x920e 0x91c6 0x92e1 0x926f 0x91f1 0x9188 0x9141 0x9248 0x91ea 0x9165 0x90ff 0x90bc 0x91cf 0x9176 0x9100 0x909b 0x905b 0x9179 0x9129 0x90c1 0x9060 0x9022 0x9159 0x910e 0x90ab 0x904f 0x9011 0x913e 0x90f9 0x909a 0x903f 0x9001 0x911a 0x90de 0x907f 0x9020 0x8fdd 0x90ac 0x9070 0x8ff7 0x8f74 0x8f1a 0x8f68 0x8f1c 0x8e9e 0x8e14 0x8db6 0x8d9d 0x8d55 0x8cd8 0x8c4c 0x8beb 0x8b59 0x8b10 0x8a94 0x8a02 0x899f 0x8849 0x87fb 0x877d 0x86e5 0x867d 0x836c 0x8325 0x82aa 0x8209 0x8197 0x7530 0x7530 0x7530 0x7530 0x7530>; + }; + + qcom,pc-temp-v2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa98d 0xa97e 0xa974 0xa960 0xa92e 0xa910 0xa7fb 0xa83a 0xa854 0xa856 0xa82f 0xa819 0xa6a3 0xa712 0xa747 0xa757 0xa738 0xa728 0xa594 0xa609 0xa64d 0xa665 0xa64a 0xa63c 0xa4c7 0xa51d 0xa566 0xa581 0xa565 0xa558 0xa3f4 0xa43e 0xa489 0xa4a2 0xa484 0xa478 0xa2af 0xa364 0xa3b3 0xa3c8 0xa3a5 0xa397 0xa162 0xa292 0xa2e4 0xa2f3 0xa2ca 0xa2b9 0xa11a 0xa1c1 0xa210 0xa21b 0xa1ef 0xa1de 0xa14f 0xa0ea 0xa131 0xa139 0xa110 0xa103 0xa17a 0xa03c 0xa071 0xa077 0xa047 0xa035 0xa046 0x9fd6 0x9ff5 0x9ff5 0x9fb3 0x9f87 0x9d6d 0x9f7f 0x9f85 0x9f81 0x9f2b 0x9ee2 0x9b88 0x9eab 0x9ea9 0x9ead 0x9e5e 0x9e1a 0x9a81 0x9c78 0x9cde 0x9d1e 0x9d16 0x9d22 0x99b8 0x9a96 0x9b46 0x9bd5 0x9bfe 0x9c3f 0x9913 0x99e8 0x9a78 0x9b4d 0x9b70 0x9b9c 0x9887 0x9977 0x99df 0x9aeb 0x9b04 0x9b0e 0x97f7 0x98f2 0x9948 0x9a53 0x9a64 0x9a58 0x975c 0x9856 0x98b5 0x9965 0x9971 0x9967 0x96c8 0x97b8 0x9827 0x987f 0x9885 0x9883 0x9649 0x9720 0x9799 0x97d3 0x97d8 0x97d6 0x95d8 0x968d 0x9711 0x9743 0x9748 0x9745 0x957d 0x9608 0x9697 0x96c6 0x96cb 0x96c8 0x9533 0x9591 0x9629 0x9658 0x965c 0x9658 0x94f4 0x952a 0x95c3 0x95f3 0x95f6 0x95f1 0x94bc 0x94d6 0x9565 0x9595 0x9598 0x9592 0x948a 0x9491 0x950e 0x953e 0x9540 0x9538 0x9458 0x9459 0x94bd 0x94f0 0x94ef 0x94e6 0x9429 0x942b 0x9471 0x94aa 0x94a5 0x949b 0x93fa 0x9403 0x942c 0x9467 0x9461 0x9456 0x93cb 0x93dc 0x93ed 0x9426 0x9422 0x9418 0x939a 0x93b7 0x93b6 0x93e7 0x93e7 0x93dd 0x9366 0x9390 0x9384 0x93a6 0x93a1 0x9392 0x9330 0x9367 0x935a 0x9364 0x9348 0x932b 0x92f5 0x933c 0x9330 0x9322 0x92ea 0x92bd 0x92b6 0x9309 0x9301 0x92e2 0x9296 0x925d 0x9274 0x92ce 0x92cf 0x92a2 0x9248 0x9208 0x922d 0x9289 0x9294 0x925e 0x91fe 0x91bc 0x91e4 0x9235 0x924a 0x9214 0x91b6 0x9173 0x919a 0x91d4 0x91f2 0x91c0 0x9166 0x9124 0x9151 0x916d 0x918d 0x9158 0x9101 0x90c0 0x910a 0x9104 0x9119 0x90da 0x9085 0x9045 0x90be 0x90a5 0x90a4 0x9064 0x9011 0x8fd4 0x9066 0x9055 0x9058 0x9026 0x8fde 0x8fa3 0x8ff1 0x9009 0x9027 0x900b 0x8fc1 0x8f87 0x8fa0 0x8fd7 0x9010 0x8ff6 0x8fb0 0x8f76 0x8f3a 0x8f9b 0x8ff2 0x8fd7 0x8f94 0x8f5b 0x8e9d 0x8f3c 0x8fa7 0x8f84 0x8f3f 0x8efc 0x8dbc 0x8e73 0x8ecd 0x8e86 0x8e46 0x8df2 0x8c72 0x8d0b 0x8d41 0x8ce7 0x8ca5 0x8c4f 0x8a95 0x8b0d 0x8b2a 0x8ad3 0x8a9a 0x8a45 0x87f8 0x8865 0x887d 0x881c 0x87ec 0x879d 0x841a 0x8496 0x84d3 0x8488 0x847e 0x8426 0x7eca 0x7f24 0x801b 0x8028 0x7f97 0x7ef0 0x6fcb 0x6e6e 0x6d71 0x6d74 0x6d50 0x6d1a>; + }; + + qcom,pc-temp-z1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x38d1 0x33b6 0x2f09 0x2da0 0x2d49 0x38bb 0x337f 0x2f0d 0x2d9e 0x2d52 0x38c3 0x3376 0x2f0b 0x2da5 0x2d5c 0x38c7 0x337e 0x2f07 0x2da7 0x2d60 0x38d3 0x3382 0x2f03 0x2da8 0x2d62 0x38eb 0x337d 0x2f01 0x2da8 0x2d64 0x38ff 0x336c 0x2f02 0x2da9 0x2d67 0x38f6 0x335e 0x2f03 0x2dac 0x2d6a 0x38d7 0x335d 0x2f05 0x2dae 0x2d6d 0x38b6 0x3362 0x2f09 0x2db1 0x2d6f 0x3896 0x3360 0x2f0d 0x2db5 0x2d72 0x3874 0x334e 0x2f0f 0x2db8 0x2d77 0x3843 0x333c 0x2f0f 0x2dbb 0x2d7b 0x3810 0x332e 0x2f0b 0x2dbb 0x2d7c 0x37ee 0x3328 0x2f04 0x2db9 0x2d7c 0x37d3 0x3329 0x2f01 0x2db7 0x2d7c 0x37b6 0x3329 0x2f04 0x2dbb 0x2d7f 0x3792 0x332c 0x2f0a 0x2dc2 0x2d85 0x3772 0x3337 0x2f14 0x2dc9 0x2d8b 0x3765 0x3349 0x2f21 0x2dce 0x2d8f 0x3763 0x335e 0x2f2c 0x2dd3 0x2d93 0x376a 0x3374 0x2f35 0x2dd8 0x2d98 0x3773 0x3384 0x2f3d 0x2ddd 0x2d9c 0x377f 0x338b 0x2f45 0x2de1 0x2da1 0x3787 0x3391 0x2f4d 0x2de7 0x2da6 0x378c 0x339a 0x2f54 0x2dec 0x2daa 0x378f 0x33a6 0x2f5b 0x2df0 0x2daf 0x3794 0x33ad 0x2f62 0x2df4 0x2db3 0x379f 0x33b2 0x2f69 0x2df8 0x2db7 0x37af 0x33ba 0x2f6f 0x2dfc 0x2dbb 0x37c7 0x33c2 0x2f75 0x2e00 0x2dbf 0x37de 0x33c9 0x2f7a 0x2e04 0x2dc4 0x37e6 0x33d1 0x2f80 0x2e08 0x2dc8 0x37ea 0x33de 0x2f86 0x2e0d 0x2dcd 0x37f0 0x33f1 0x2f8e 0x2e12 0x2dd1 0x3807 0x3403 0x2f95 0x2e17 0x2dd5 0x383b 0x3415 0x2f9d 0x2e1a 0x2dd8 0x386b 0x3422 0x2fa5 0x2e1c 0x2dda 0x3891 0x3427 0x2faa 0x2e1f 0x2ddc 0x38b0 0x3429 0x2fad 0x2e21 0x2ddd 0x38b2 0x342d 0x2fb1 0x2e23 0x2dde 0x3888 0x3439 0x2fb9 0x2e25 0x2de0 0x3873 0x3448 0x2fbf 0x2e27 0x2de1 0x386e 0x3457 0x2fc0 0x2e28 0x2de2 0x3861 0x3449 0x2fc4 0x2e29 0x2de2 0x386f 0x3454 0x2fc7 0x2e2b 0x2de2 0x3869 0x3454 0x2fc8 0x2e2b 0x2de1 0x3868 0x345b 0x2fc9 0x2e2b 0x2de2 0x385f 0x3457 0x2fcf 0x2e2c 0x2de3 0x387c 0x3452 0x2fd1 0x2e30 0x2de6 0x3886 0x346f 0x2fdb 0x2e36 0x2deb 0x38aa 0x3476 0x2ff3 0x2e3f 0x2df0 0x3895 0x349e 0x3007 0x2e4a 0x2dfa 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06>; + }; + + qcom,pc-temp-z2-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2bb8 0x2632 0x2811 0x296b 0x2a9e 0x280d 0x2a3d 0x2824 0x28fa 0x293e 0x25fe 0x2926 0x282f 0x28bc 0x28c4 0x2606 0x274d 0x282a 0x28ad 0x28ac 0x2620 0x26d2 0x281d 0x2898 0x28a6 0x262f 0x26c3 0x2815 0x288c 0x28a4 0x2631 0x26b5 0x2811 0x2887 0x28a8 0x262c 0x26aa 0x2812 0x2882 0x28ac 0x2625 0x26a2 0x2816 0x2880 0x28ac 0x261b 0x269c 0x2819 0x2884 0x28b5 0x2612 0x2698 0x2813 0x2887 0x28cc 0x2616 0x2696 0x27f3 0x288e 0x28d4 0x2626 0x2699 0x27d7 0x28ae 0x28d3 0x262c 0x26a7 0x27e8 0x28bd 0x28d4 0x2618 0x26b3 0x2814 0x289f 0x28d2 0x25f5 0x26b6 0x282a 0x2883 0x28c7 0x25e5 0x26ba 0x2827 0x288f 0x28d1 0x25e1 0x26c3 0x281d 0x28b2 0x290a 0x25dd 0x26dd 0x2837 0x28e1 0x2937 0x25d6 0x26fd 0x2894 0x2931 0x293f 0x25c9 0x271e 0x28ce 0x296a 0x293f 0x25be 0x2742 0x28b3 0x2939 0x2923 0x25b7 0x2760 0x2883 0x28bd 0x28ee 0x25b1 0x2775 0x2863 0x288b 0x28cc 0x259f 0x2784 0x284c 0x289e 0x28b4 0x2574 0x278c 0x283f 0x28b6 0x28a5 0x2552 0x2793 0x283c 0x28a9 0x28a6 0x2544 0x2797 0x283d 0x2890 0x28af 0x250b 0x2796 0x2845 0x2888 0x28ba 0x24d2 0x2793 0x2859 0x2888 0x28cd 0x24c0 0x2792 0x286f 0x288c 0x28e8 0x24b3 0x2793 0x2885 0x289f 0x290a 0x24aa 0x2795 0x289c 0x28c5 0x2934 0x24a2 0x2799 0x28b4 0x28ea 0x2962 0x249c 0x27a2 0x28ce 0x290a 0x299b 0x2498 0x27aa 0x28df 0x2925 0x29c7 0x249e 0x27b2 0x28e4 0x293c 0x29d8 0x24a4 0x27b7 0x28e7 0x2954 0x29e2 0x24ad 0x27bb 0x28ef 0x2961 0x29ed 0x24b6 0x27c0 0x28fb 0x2964 0x29f9 0x24b5 0x27c2 0x2901 0x2965 0x2a01 0x24a8 0x27b9 0x28fa 0x2971 0x2a03 0x24a4 0x279c 0x28f3 0x2981 0x2a07 0x24aa 0x26ec 0x28f1 0x2987 0x2a1d 0x246c 0x26c6 0x28d6 0x2992 0x2a3b 0x2459 0x26cc 0x28c6 0x29ad 0x2a38 0x2447 0x26dc 0x28df 0x29c9 0x2a6a 0x2449 0x26cd 0x293d 0x29ca 0x2a89 0x243a 0x26ed 0x297e 0x2a06 0x2aa5 0x243e 0x26c3 0x2925 0x29d7 0x2a55 0x2464 0x269c 0x28de 0x298a 0x29c5 0x246e 0x264f 0x28b9 0x2971 0x29af 0x2445 0x25fc 0x289b 0x2927 0x295f 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904>; + }; + + qcom,pc-temp-z3-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4c45 0x4be7 0x4bad 0x4bb7 0x4b9b 0x4d48 0x4c26 0x4bd0 0x4baa 0x4b96 0x4dd0 0x4c76 0x4bee 0x4bac 0x4b97 0x4de1 0x4cc3 0x4bfa 0x4bb4 0x4b9c 0x4dce 0x4cd9 0x4bff 0x4bb6 0x4b9f 0x4db7 0x4cdc 0x4c00 0x4bb7 0x4ba2 0x4dac 0x4cdd 0x4bfe 0x4bb5 0x4ba2 0x4da7 0x4cdd 0x4bfb 0x4bb0 0x4b9f 0x4da5 0x4ce0 0x4bf8 0x4bac 0x4b9b 0x4da2 0x4ce2 0x4bf6 0x4bac 0x4b99 0x4da0 0x4cd4 0x4bf0 0x4bac 0x4b98 0x4da5 0x4cac 0x4bdf 0x4ba7 0x4b98 0x4db6 0x4c9a 0x4bc8 0x4b9b 0x4b95 0x4dc5 0x4cb6 0x4bce 0x4b96 0x4b91 0x4db4 0x4cd7 0x4bef 0x4ba3 0x4b93 0x4d83 0x4cd1 0x4c01 0x4bb3 0x4b97 0x4d54 0x4cac 0x4bec 0x4bad 0x4b94 0x4d30 0x4c8a 0x4bd0 0x4b9c 0x4b8a 0x4d0e 0x4c6f 0x4bcf 0x4b98 0x4b87 0x4cf1 0x4c5e 0x4be1 0x4ba6 0x4b8e 0x4cd8 0x4c62 0x4bee 0x4bb3 0x4b97 0x4cc6 0x4c75 0x4bef 0x4bb3 0x4b9d 0x4cbc 0x4c87 0x4bef 0x4bae 0x4ba1 0x4cb4 0x4c93 0x4bed 0x4bad 0x4ba2 0x4cac 0x4c9c 0x4bea 0x4bb4 0x4ba0 0x4ca3 0x4c9d 0x4be9 0x4bba 0x4b9e 0x4c97 0x4c9b 0x4bef 0x4bb7 0x4b9c 0x4c8c 0x4c97 0x4bf5 0x4bb2 0x4b9a 0x4c7f 0x4c91 0x4bf6 0x4bae 0x4b98 0x4c6f 0x4c8a 0x4bf4 0x4ba9 0x4b96 0x4c5d 0x4c84 0x4bf2 0x4ba5 0x4b94 0x4c4a 0x4c7f 0x4bef 0x4ba2 0x4b91 0x4c3a 0x4c7a 0x4bea 0x4ba0 0x4b8e 0x4c2b 0x4c73 0x4be7 0x4b9f 0x4b8a 0x4c1e 0x4c6b 0x4be5 0x4b9e 0x4b86 0x4c17 0x4c65 0x4be2 0x4b9e 0x4b84 0x4c1b 0x4c5f 0x4bde 0x4b9e 0x4b84 0x4c23 0x4c5a 0x4bda 0x4b9d 0x4b86 0x4c39 0x4c56 0x4bd7 0x4b9c 0x4b86 0x4c4f 0x4c53 0x4bd6 0x4b97 0x4b83 0x4c46 0x4c4f 0x4bd4 0x4b93 0x4b81 0x4c28 0x4c4a 0x4bd2 0x4b93 0x4b82 0x4c1b 0x4c3f 0x4bd0 0x4b93 0x4b82 0x4c19 0x4bfb 0x4bcc 0x4b93 0x4b83 0x4bac 0x4bb3 0x4bb6 0x4b90 0x4b7f 0x4b91 0x4b94 0x4ba0 0x4b89 0x4b78 0x4b89 0x4b8c 0x4b9e 0x4b80 0x4b70 0x4b8b 0x4b87 0x4b8e 0x4b7e 0x4b70 0x4b74 0x4b76 0x4b83 0x4b7c 0x4b6d 0x4b78 0x4b75 0x4b98 0x4b87 0x4b7c 0x4bab 0x4b91 0x4b9b 0x4b8b 0x4b83 0x4bda 0x4b96 0x4b9d 0x4b8e 0x4b84 0x4bf2 0x4b94 0x4b99 0x4b92 0x4b87 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c>; + }; + + qcom,pc-temp-z4-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4001 0x3c8d 0x3a72 0x3978 0x397b 0x40ed 0x3c83 0x3a6f 0x39c6 0x39b9 0x40da 0x3c60 0x3a4a 0x39d2 0x39c2 0x4086 0x3c0a 0x3a21 0x39c0 0x39b5 0x4000 0x3ba1 0x39fb 0x39a7 0x399e 0x3f71 0x3b4a 0x39dc 0x3990 0x3986 0x3ef7 0x3b02 0x39c2 0x3981 0x3976 0x3e89 0x3acb 0x39ac 0x3976 0x396c 0x3e16 0x3aa0 0x39a0 0x3970 0x3966 0x3d82 0x3a79 0x399a 0x396d 0x3961 0x3cf4 0x3a50 0x3998 0x396a 0x395d 0x3cc5 0x3a2f 0x3998 0x3965 0x3959 0x3cdb 0x3a29 0x3999 0x395f 0x3951 0x3cf0 0x3a35 0x399d 0x3961 0x394e 0x3cc2 0x3a3c 0x39a2 0x3970 0x395b 0x3c4c 0x3a29 0x39a0 0x397b 0x3968 0x3beb 0x39fe 0x398c 0x396b 0x395e 0x3bb2 0x39dd 0x3979 0x394d 0x3947 0x3b8d 0x39c9 0x3978 0x394f 0x3946 0x3b7e 0x39bd 0x3982 0x3988 0x3974 0x3b75 0x39bc 0x3996 0x39ba 0x39a6 0x3b71 0x39bf 0x39ca 0x39be 0x39ab 0x3b75 0x39c9 0x39fe 0x39b9 0x399f 0x3b7b 0x39fa 0x39fe 0x39ae 0x3991 0x3b80 0x3a38 0x39df 0x3993 0x3982 0x3b85 0x3a46 0x39bf 0x397d 0x3975 0x3b8c 0x3a43 0x39a7 0x3973 0x396c 0x3b92 0x3a3e 0x3994 0x396e 0x3965 0x3b9e 0x3a2f 0x3989 0x3969 0x395f 0x3bab 0x3a18 0x3982 0x3965 0x395a 0x3bb3 0x3a05 0x397d 0x3962 0x3955 0x3bba 0x39f5 0x397b 0x395e 0x3951 0x3bbe 0x39e5 0x397a 0x395a 0x394e 0x3bbc 0x39d6 0x3979 0x395a 0x394d 0x3bb5 0x39c8 0x3979 0x395c 0x3950 0x3ba1 0x39ba 0x3978 0x395e 0x3955 0x3b72 0x39ac 0x3976 0x3961 0x395b 0x3b43 0x39a1 0x3973 0x3963 0x3961 0x3afc 0x399e 0x3970 0x3963 0x3963 0x3abc 0x399c 0x396d 0x3963 0x3960 0x3ab4 0x3999 0x396a 0x3962 0x395d 0x3abb 0x3994 0x3967 0x3960 0x395c 0x3ab9 0x3995 0x3962 0x395d 0x395b 0x3aa3 0x39d0 0x395a 0x3959 0x3958 0x3abd 0x39eb 0x3957 0x394b 0x394c 0x3ac6 0x39f6 0x3953 0x3935 0x3934 0x3acb 0x39f8 0x394d 0x3931 0x392d 0x3ac3 0x39fa 0x3959 0x3929 0x3920 0x3ad0 0x3a03 0x3961 0x3925 0x391e 0x3ac0 0x39ff 0x394e 0x392e 0x392c 0x3a9b 0x39f7 0x3956 0x3935 0x3930 0x3a8e 0x39fe 0x3959 0x3936 0x3935 0x3a94 0x3a0e 0x3963 0x3937 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936>; + }; + + qcom,pc-temp-z5-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2b3c 0x2daa 0x3498 0x4a8d 0x45cc 0x2ef0 0x3052 0x39fb 0x4721 0x484e 0x3117 0x343d 0x3f9f 0x4802 0x4a61 0x31df 0x385f 0x430e 0x4b83 0x4d9f 0x326a 0x3a69 0x44ec 0x4e02 0x5124 0x32f3 0x3bab 0x4673 0x5049 0x55e1 0x33c6 0x3ce5 0x4810 0x514c 0x5936 0x34d0 0x3e95 0x49be 0x511b 0x5a23 0x35db 0x4119 0x4b35 0x5160 0x5a1d 0x36fa 0x4312 0x4c4c 0x5327 0x5b6b 0x3859 0x42b6 0x4bad 0x5424 0x5e2c 0x3a2d 0x3f5c 0x45e6 0x5167 0x6138 0x3c44 0x3ed3 0x3ee4 0x49ed 0x6100 0x3d63 0x47a6 0x4250 0x472f 0x5e7d 0x3d9a 0x506d 0x5049 0x50b3 0x5f98 0x3db5 0x5016 0x57f1 0x5c40 0x639a 0x3dda 0x4c6d 0x532f 0x5d14 0x64bc 0x3dd6 0x4a75 0x4bb9 0x59b9 0x646c 0x3d86 0x49e6 0x55e6 0x5b90 0x6454 0x3cdc 0x49b6 0x76e4 0x6b24 0x646b 0x3bcd 0x5034 0x875d 0x7705 0x6492 0x3ad1 0x649b 0x78a4 0x6a60 0x5e9c 0x3a04 0x7968 0x6282 0x5014 0x511e 0x3939 0x8c1a 0x56c4 0x4873 0x4bc7 0x3846 0x9a39 0x4fd8 0x5026 0x4d8e 0x3716 0x9aa6 0x4dfb 0x5780 0x5074 0x35e9 0x91df 0x53c1 0x5aa0 0x53ba 0x34ed 0x87db 0x5d83 0x5d20 0x57f1 0x33ea 0x7eb5 0x65eb 0x5e8b 0x5cc6 0x32dd 0x764e 0x6eb9 0x601d 0x628a 0x31ca 0x720c 0x75c6 0x61b9 0x67fc 0x30bf 0x6fd5 0x79eb 0x63f1 0x6c9c 0x2ffa 0x6e15 0x7d26 0x6810 0x7085 0x2f5e 0x6c28 0x8068 0x6dc5 0x7165 0x2ed6 0x6a83 0x83d1 0x7653 0x6fdc 0x2e78 0x6a47 0x8529 0x7b5b 0x6e81 0x2ea9 0x6b32 0x8003 0x7adf 0x6f61 0x2f11 0x6ca0 0x7890 0x796f 0x710e 0x303e 0x6e9b 0x7749 0x7672 0x709c 0x317f 0x7119 0x77a9 0x6cad 0x6a94 0x3162 0x71bd 0x77df 0x65cc 0x65f5 0x300b 0x6c45 0x7771 0x66c4 0x66af 0x2fb0 0x60cd 0x7669 0x680b 0x6789 0x3015 0x4018 0x70b0 0x6813 0x6600 0x2ca4 0x3328 0x596b 0x6764 0x62b7 0x2bbe 0x3022 0x477d 0x6688 0x6215 0x2b68 0x2f70 0x4725 0x57da 0x5967 0x2b6c 0x2f09 0x3dd8 0x58e5 0x64be 0x2ab7 0x2db9 0x398d 0x5bd2 0x6460 0x2ae0 0x2ded 0x457f 0x6bcd 0x75c0 0x2cb0 0x2ff3 0x438f 0x6311 0x7110 0x2d80 0x2fa5 0x439f 0x6129 0x668d 0x2d89 0x2ebe 0x3ec3 0x61e3 0x62ca 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005>; + }; + + qcom,pc-temp-z6-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x409a 0x3c2e 0x39dd 0x392f 0x3913 0x416d 0x3c48 0x39ee 0x394b 0x392d 0x419b 0x3c57 0x39ee 0x3952 0x3933 0x4181 0x3c50 0x39e4 0x394f 0x3931 0x413b 0x3c33 0x39d5 0x3947 0x392a 0x40e4 0x3c0c 0x39c7 0x393d 0x3921 0x409c 0x3be5 0x39bb 0x3935 0x391b 0x4062 0x3bcb 0x39b0 0x392e 0x3915 0x4027 0x3bb9 0x39aa 0x392a 0x3910 0x3fe0 0x3ba7 0x39a7 0x3929 0x390e 0x3f9a 0x3b8a 0x39a3 0x3928 0x390c 0x3f73 0x3b64 0x399a 0x3924 0x390b 0x3f65 0x3b56 0x398e 0x391c 0x3906 0x3f55 0x3b62 0x3992 0x3919 0x3903 0x3f1e 0x3b70 0x39a4 0x3927 0x390a 0x3ec0 0x3b64 0x39ac 0x3933 0x3912 0x3e70 0x3b3f 0x3999 0x392a 0x390c 0x3e3a 0x3b22 0x3982 0x3915 0x38fe 0x3e0f 0x3b10 0x3982 0x3914 0x38fc 0x3df2 0x3b06 0x3991 0x3936 0x3915 0x3ddc 0x3b09 0x39a5 0x3953 0x3930 0x3dd2 0x3b19 0x39c1 0x3956 0x3934 0x3dd2 0x3b2e 0x39d7 0x3953 0x3934 0x3dd7 0x3b4e 0x39d6 0x394f 0x3932 0x3ddc 0x3b6d 0x39c9 0x3948 0x392b 0x3de1 0x3b75 0x39be 0x3942 0x3924 0x3de6 0x3b75 0x39b8 0x393d 0x391f 0x3dea 0x3b74 0x39b4 0x3938 0x391c 0x3dee 0x3b6e 0x39b1 0x3935 0x3919 0x3df0 0x3b64 0x39ae 0x3931 0x3916 0x3df0 0x3b5c 0x39ab 0x392e 0x3913 0x3df0 0x3b54 0x39a9 0x392b 0x3910 0x3def 0x3b4c 0x39a8 0x3928 0x390d 0x3ded 0x3b46 0x39a7 0x3928 0x390c 0x3deb 0x3b40 0x39a7 0x3929 0x390c 0x3deb 0x3b3c 0x39a6 0x392a 0x390c 0x3ded 0x3b38 0x39a4 0x392c 0x390f 0x3def 0x3b35 0x39a2 0x392d 0x3913 0x3def 0x3b35 0x39a0 0x392d 0x3914 0x3dee 0x3b36 0x399f 0x392a 0x3912 0x3deb 0x3b36 0x399e 0x3928 0x3910 0x3de2 0x3b35 0x399d 0x3927 0x3910 0x3dd8 0x3b34 0x399b 0x3927 0x390f 0x3dcd 0x3b2c 0x3997 0x3926 0x390f 0x3da1 0x3b16 0x398b 0x391d 0x3908 0x3d94 0x3b10 0x397f 0x3911 0x38f9 0x3d93 0x3b0a 0x397c 0x390a 0x38f2 0x3d8f 0x3b0c 0x3979 0x3906 0x38ec 0x3d8d 0x3b07 0x3977 0x3903 0x38ea 0x3d95 0x3b0c 0x397c 0x390d 0x38f8 0x3da1 0x3b20 0x3983 0x3914 0x38ff 0x3dbd 0x3b30 0x398c 0x3918 0x3902 0x3de0 0x3b45 0x3993 0x391d 0x3906 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d>; + }; + + qcom,pc-temp-y1-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1dae 0x1a6c 0x17b7 0x1540 0x1467 0x143b 0x1db4 0x1a6f 0x17c3 0x153f 0x1466 0x143d 0x1dc0 0x1a74 0x17ca 0x153e 0x1466 0x143e 0x1dcd 0x1a7a 0x17ce 0x153c 0x1466 0x1440 0x1dd8 0x1a7e 0x17d0 0x153b 0x1467 0x1441 0x1ddd 0x1a80 0x17d0 0x153a 0x1467 0x1443 0x1ddc 0x1a80 0x17cc 0x153a 0x1468 0x1443 0x1dda 0x1a80 0x17c6 0x153a 0x146a 0x1444 0x1dd3 0x1a7d 0x17c5 0x153b 0x146c 0x1445 0x1dbc 0x1a76 0x17c8 0x153c 0x146d 0x1446 0x1daa 0x1a70 0x17ca 0x153d 0x146f 0x1448 0x1db3 0x1a6e 0x17c6 0x153d 0x1470 0x1449 0x1dc8 0x1a6f 0x17c0 0x153d 0x1472 0x144b 0x1ddc 0x1a74 0x17c1 0x153e 0x1474 0x144d 0x1df4 0x1a85 0x17d0 0x1545 0x1479 0x1452 0x1e03 0x1a97 0x17db 0x154d 0x147c 0x1454 0x1dfa 0x1aa4 0x17df 0x154f 0x147c 0x1455 0x1de7 0x1aaf 0x17e3 0x1552 0x147d 0x1455 0x1dd8 0x1ab0 0x17e4 0x1554 0x147e 0x1456 0x1dca 0x1aa1 0x17e2 0x1555 0x1480 0x1459 0x1dc3 0x1a95 0x17e2 0x1558 0x1483 0x145c 0x1dd6 0x1a97 0x17ed 0x155c 0x1487 0x1460 0x1df9 0x1a9f 0x17fb 0x1560 0x148b 0x1463 0x1e01 0x1aa5 0x17fd 0x1565 0x148e 0x1467 0x1e00 0x1aa8 0x17f8 0x1569 0x1491 0x146a 0x1e04 0x1aac 0x17f7 0x156d 0x1493 0x146e 0x1e09 0x1ab8 0x1800 0x1571 0x1496 0x1472 0x1e0c 0x1acc 0x180b 0x1576 0x149a 0x1475 0x1e0a 0x1ad7 0x180e 0x157b 0x149d 0x1478 0x1df8 0x1adc 0x1812 0x1581 0x14a0 0x147a 0x1de0 0x1ade 0x1817 0x1586 0x14a3 0x147d 0x1dd9 0x1adb 0x181b 0x158b 0x14a7 0x1480 0x1ddb 0x1ad7 0x181f 0x1590 0x14aa 0x1484 0x1ddd 0x1ad7 0x1820 0x1593 0x14ad 0x1487 0x1de1 0x1ad5 0x1821 0x1596 0x14b0 0x1489 0x1de8 0x1ad3 0x1823 0x1599 0x14b2 0x148b 0x1df7 0x1adf 0x1827 0x159b 0x14b4 0x148c 0x1e0a 0x1aef 0x182c 0x159d 0x14b5 0x148d 0x1e0d 0x1aef 0x1831 0x159e 0x14b5 0x148e 0x1dff 0x1ae3 0x1835 0x159f 0x14b6 0x148e 0x1df5 0x1adf 0x183a 0x15a1 0x14b7 0x148f 0x1df6 0x1ae5 0x1841 0x15a5 0x14b9 0x1491 0x1df6 0x1aeb 0x184c 0x15a8 0x14ba 0x1492 0x1df6 0x1af2 0x1849 0x15aa 0x14bb 0x1493 0x1dfa 0x1af8 0x1850 0x15af 0x14be 0x1495 0x1e04 0x1b0b 0x1850 0x15b1 0x14be 0x1496 0x1e09 0x1b08 0x1859 0x15b4 0x14be 0x1496 0x1e26 0x1b0e 0x1863 0x15b4 0x14be 0x1496 0x1e37 0x1b0b 0x186b 0x15b6 0x14bf 0x1496 0x1e2c 0x1b1e 0x1867 0x15b9 0x14c2 0x1498 0x1e29 0x1b3f 0x1879 0x15c2 0x14c5 0x149b 0x1e38 0x1b5b 0x1895 0x15d1 0x14cc 0x14a0 0x1e61 0x1b5f 0x18a8 0x15e4 0x14d3 0x14a6 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac>; + }; + + qcom,pc-temp-y2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x25d6 0x28a1 0x29b8 0x2b2a 0x2b60 0x2c89 0x2638 0x287f 0x299b 0x2b15 0x2b62 0x2c51 0x2674 0x286a 0x297a 0x2afb 0x2b61 0x2bfc 0x2693 0x285f 0x2959 0x2ade 0x2b5e 0x2ba2 0x269f 0x285b 0x293d 0x2abd 0x2b58 0x2b5a 0x26a2 0x285a 0x292b 0x2a9a 0x2b51 0x2b3c 0x266c 0x2867 0x2922 0x2a6d 0x2b48 0x2b43 0x260b 0x287d 0x291b 0x2a3f 0x2b3b 0x2b4e 0x25f2 0x2878 0x2916 0x2a29 0x2b28 0x2b4d 0x25fe 0x283e 0x2912 0x2a1c 0x2b09 0x2b3a 0x2615 0x2814 0x2910 0x2a13 0x2ae5 0x2b24 0x2698 0x2862 0x291a 0x2a04 0x2ab6 0x2afb 0x2784 0x28ea 0x2933 0x29f0 0x2a85 0x2ac3 0x27ba 0x2909 0x295a 0x29f2 0x2a7a 0x2abc 0x26d8 0x28f6 0x29a8 0x2a1d 0x2a90 0x2af0 0x2601 0x28e9 0x29e0 0x2a53 0x2ab0 0x2b19 0x25e5 0x28ff 0x29fa 0x2a91 0x2aec 0x2b1b 0x25de 0x2924 0x2a0e 0x2ad0 0x2b33 0x2b18 0x25d8 0x292d 0x2a1d 0x2aef 0x2b47 0x2b23 0x25d2 0x292c 0x2a2b 0x2afc 0x2b48 0x2b59 0x25cd 0x2929 0x2a36 0x2b0a 0x2b4a 0x2b9b 0x25ca 0x28f3 0x2a3f 0x2b29 0x2b78 0x2bd9 0x25c8 0x2849 0x2a48 0x2b54 0x2bc0 0x2c13 0x25c6 0x27d1 0x2a4b 0x2b74 0x2be2 0x2c3d 0x25c3 0x275f 0x2a50 0x2b8f 0x2bf6 0x2c5c 0x25c0 0x271c 0x2a54 0x2ba1 0x2c07 0x2c71 0x25bf 0x270e 0x2a52 0x2bac 0x2c19 0x2c83 0x25be 0x2700 0x2a4a 0x2bb0 0x2c2d 0x2c96 0x25bd 0x26ed 0x2a46 0x2ba7 0x2c35 0x2cb5 0x25bc 0x26d4 0x2a44 0x2b8e 0x2c41 0x2cec 0x25bb 0x26b9 0x2a3f 0x2b80 0x2c4d 0x2d11 0x25bb 0x26a1 0x29e9 0x2b83 0x2c40 0x2d02 0x25ba 0x268b 0x294e 0x2b8f 0x2c2f 0x2cda 0x25b9 0x2672 0x290b 0x2b9c 0x2c33 0x2cca 0x25b8 0x2655 0x28fa 0x2b99 0x2c39 0x2cd1 0x25b8 0x263a 0x28ee 0x2b84 0x2c35 0x2cd6 0x25b7 0x2622 0x28e6 0x2b68 0x2c34 0x2cdc 0x25b7 0x2604 0x290b 0x2b59 0x2c39 0x2ce8 0x25b6 0x25ec 0x293c 0x2b5f 0x2c3b 0x2ce7 0x25b6 0x25de 0x291d 0x2b60 0x2c36 0x2cd1 0x25b6 0x25d4 0x28ba 0x2b5f 0x2c32 0x2cc5 0x25b6 0x25cb 0x289c 0x2b62 0x2c34 0x2ccc 0x25b6 0x25c4 0x28a6 0x2b5d 0x2c32 0x2ccf 0x25b5 0x25be 0x281b 0x2b46 0x2c13 0x2cc8 0x25b5 0x25bb 0x27d7 0x2b34 0x2c13 0x2cb0 0x25b5 0x25bb 0x27c4 0x2b11 0x2c20 0x2c82 0x25b5 0x25ba 0x2810 0x2b0d 0x2c0a 0x2c51 0x25b5 0x25b9 0x2851 0x2b23 0x2be8 0x2c48 0x25b5 0x25b8 0x2853 0x2b28 0x2bef 0x2c50 0x25b4 0x25b8 0x2837 0x2ae6 0x2c1e 0x2c3a 0x25b4 0x25b6 0x2800 0x2acc 0x2bf7 0x2bfd 0x25b4 0x25b5 0x27bc 0x2aa1 0x2b7e 0x2ba7 0x25b4 0x25b4 0x2786 0x2a49 0x2b0f 0x2b35 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a>; + }; + + qcom,pc-temp-y3-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x347a 0x3456 0x3421 0x33e5 0x33e0 0x33d8 0x356b 0x345f 0x341a 0x33e4 0x33e0 0x33da 0x35ff 0x346c 0x3416 0x33e3 0x33e0 0x33db 0x364d 0x3479 0x3416 0x33e3 0x33e0 0x33dd 0x366b 0x3484 0x3418 0x33e3 0x33e0 0x33de 0x3670 0x3489 0x341c 0x33e5 0x33e0 0x33de 0x35ec 0x3489 0x3423 0x33e8 0x33e0 0x33de 0x34fc 0x3488 0x342b 0x33ed 0x33e1 0x33de 0x34bb 0x348b 0x342e 0x33ef 0x33e1 0x33de 0x34ba 0x349e 0x342f 0x33f0 0x33e1 0x33dd 0x34bb 0x34ac 0x3430 0x33f0 0x33e1 0x33dd 0x34d3 0x349e 0x343d 0x33f7 0x33e4 0x33df 0x3504 0x3481 0x3450 0x3401 0x33e9 0x33e2 0x3510 0x3471 0x3451 0x3402 0x33ea 0x33e3 0x34ec 0x3468 0x343b 0x33fe 0x33e8 0x33e2 0x34cc 0x3462 0x3427 0x33fb 0x33e6 0x33e2 0x34d0 0x345f 0x3422 0x33fd 0x33e8 0x33e2 0x34e0 0x345d 0x341f 0x3401 0x33ec 0x33e3 0x34e7 0x345a 0x341b 0x3401 0x33ec 0x33e3 0x34e9 0x3455 0x3416 0x33f9 0x33e7 0x33e0 0x34ea 0x344f 0x3411 0x33f0 0x33e3 0x33dd 0x34ec 0x3445 0x340c 0x33e8 0x33e1 0x33dc 0x34f0 0x3435 0x3407 0x33e3 0x33e0 0x33db 0x34f5 0x3427 0x3406 0x33e2 0x33df 0x33db 0x3500 0x341c 0x3405 0x33e3 0x33de 0x33db 0x3512 0x3417 0x3405 0x33e4 0x33de 0x33da 0x3525 0x3418 0x3405 0x33e3 0x33de 0x33da 0x3539 0x341b 0x3405 0x33e3 0x33dd 0x33da 0x354f 0x341f 0x3405 0x33e5 0x33dd 0x33da 0x356b 0x3423 0x3405 0x33e9 0x33dd 0x33d9 0x358d 0x3428 0x3405 0x33ec 0x33dd 0x33d9 0x35b2 0x342d 0x3400 0x33ed 0x33de 0x33d9 0x35da 0x3434 0x33f9 0x33ec 0x33de 0x33da 0x360a 0x343c 0x33f6 0x33ec 0x33df 0x33da 0x3641 0x3449 0x33f7 0x33ea 0x33de 0x33da 0x3680 0x3458 0x33f8 0x33e8 0x33de 0x33d9 0x36c1 0x3468 0x33fb 0x33e6 0x33de 0x33d9 0x3702 0x347a 0x3402 0x33e4 0x33dd 0x33d9 0x3742 0x3490 0x3408 0x33e3 0x33dd 0x33d9 0x3781 0x34b0 0x340c 0x33e3 0x33dd 0x33d9 0x37c1 0x34dc 0x340f 0x33e3 0x33dd 0x33d9 0x3803 0x3511 0x3415 0x33e3 0x33de 0x33da 0x3845 0x3550 0x341e 0x33e3 0x33de 0x33da 0x3892 0x35a3 0x3421 0x33e4 0x33de 0x33da 0x38ea 0x3613 0x3429 0x33e3 0x33de 0x33da 0x390d 0x3642 0x3430 0x33eb 0x33df 0x33dc 0x393f 0x363e 0x3435 0x33ec 0x33e1 0x33dd 0x395c 0x3658 0x3442 0x33f0 0x33e3 0x33e0 0x398d 0x36b9 0x3451 0x33f2 0x33e2 0x33e0 0x3a0b 0x3718 0x3452 0x33ee 0x33e1 0x33dd 0x3a97 0x37a6 0x345a 0x33f0 0x33e0 0x33dd 0x3b31 0x3888 0x346f 0x33f5 0x33e3 0x33e1 0x3c10 0x3978 0x3492 0x33f9 0x33e6 0x33e4 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6>; + }; + + qcom,pc-temp-y4-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x45b5 0x41d2 0x40f2 0x406d 0x4045 0x4044 0x452b 0x41db 0x40ef 0x4073 0x4045 0x4042 0x44eb 0x41eb 0x40ef 0x4078 0x4047 0x4041 0x44e9 0x4200 0x40f2 0x407b 0x4048 0x4040 0x4515 0x421b 0x40f7 0x407d 0x404a 0x4040 0x4561 0x4239 0x40fe 0x407e 0x404b 0x4040 0x4627 0x4263 0x4106 0x407c 0x404d 0x4041 0x478b 0x428e 0x4111 0x407a 0x404e 0x4044 0x4914 0x42a4 0x411c 0x407a 0x4051 0x4046 0x4b24 0x42ad 0x4127 0x4081 0x4055 0x4049 0x4c74 0x42bc 0x4138 0x408c 0x405b 0x404d 0x4a3e 0x4407 0x419f 0x409e 0x4069 0x4059 0x4560 0x4626 0x4237 0x40b4 0x407d 0x4068 0x437a 0x4642 0x4251 0x40bd 0x4081 0x406c 0x4347 0x43a8 0x4203 0x40bf 0x407d 0x406b 0x432d 0x41b1 0x41aa 0x40c3 0x407b 0x406a 0x4320 0x41b5 0x416e 0x40ec 0x4091 0x407a 0x430d 0x41e2 0x413b 0x4129 0x40ba 0x4098 0x42ef 0x41ed 0x4117 0x412a 0x40c0 0x409d 0x42b4 0x41c5 0x40fa 0x40d1 0x4094 0x407d 0x4274 0x4198 0x40e3 0x4085 0x4066 0x405b 0x4249 0x4180 0x40d4 0x4078 0x4054 0x404d 0x4228 0x416e 0x40c8 0x4072 0x4049 0x4043 0x421f 0x416b 0x40c2 0x406f 0x4048 0x4042 0x4223 0x415f 0x40be 0x406b 0x4048 0x4042 0x422b 0x414f 0x40bb 0x4069 0x4049 0x4043 0x4231 0x4143 0x40ba 0x406b 0x404b 0x4045 0x423b 0x4137 0x40ba 0x406d 0x404e 0x4048 0x4246 0x4136 0x40b9 0x406e 0x4051 0x404c 0x4252 0x4142 0x40b4 0x4070 0x4057 0x4051 0x425e 0x4154 0x40b0 0x4072 0x405e 0x4058 0x426a 0x4167 0x40b4 0x4074 0x4068 0x4063 0x4276 0x417f 0x40bd 0x4076 0x4073 0x4070 0x4283 0x4198 0x40c4 0x4074 0x4075 0x4072 0x4290 0x41b2 0x40c9 0x4069 0x4064 0x4061 0x429c 0x41cd 0x40cd 0x405e 0x404f 0x404c 0x42a8 0x41ef 0x40d2 0x405b 0x4044 0x4043 0x42b5 0x421f 0x40d8 0x4059 0x403e 0x403f 0x42c7 0x4244 0x40dc 0x405a 0x403e 0x4040 0x42e1 0x4252 0x40e9 0x405d 0x4042 0x4045 0x4308 0x425c 0x40fd 0x4060 0x4047 0x404a 0x433b 0x4262 0x410c 0x4063 0x4048 0x404b 0x437e 0x4270 0x4118 0x4064 0x4046 0x4048 0x43d3 0x4287 0x4129 0x4061 0x403d 0x403b 0x442a 0x42c2 0x4147 0x406b 0x4041 0x403e 0x441b 0x42ef 0x4160 0x4075 0x4057 0x405a 0x441e 0x4307 0x4166 0x4084 0x4070 0x4078 0x43ed 0x432a 0x4193 0x40a2 0x4099 0x40a2 0x43d0 0x436e 0x41e6 0x40be 0x409c 0x4098 0x43e5 0x4383 0x41de 0x409e 0x406e 0x4064 0x43f6 0x4384 0x41d8 0x409e 0x4060 0x4059 0x4411 0x43a0 0x41fb 0x40bd 0x4070 0x4067 0x4463 0x43f1 0x4266 0x40fb 0x4090 0x4085 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118>; + }; + + qcom,pc-temp-y5-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2208 0x348a 0x3ab0 0x3545 0x4573 0x3634 0x2208 0x34aa 0x3839 0x3326 0x4393 0x3e82 0x269f 0x34e2 0x3660 0x31db 0x419b 0x43da 0x2f8b 0x3522 0x3519 0x3130 0x3fbf 0x46e0 0x3428 0x3557 0x345a 0x30f0 0x3e34 0x4838 0x3590 0x3572 0x341a 0x30e7 0x3d2f 0x4884 0x30ee 0x3576 0x34b3 0x32d3 0x3ca4 0x46c7 0x2869 0x3578 0x35a4 0x35e5 0x3c3f 0x4385 0x267f 0x34b6 0x35c2 0x3648 0x3b81 0x4119 0x2a54 0x3032 0x3545 0x34d0 0x3996 0x3e92 0x2ff6 0x2cf8 0x3494 0x33cf 0x387f 0x3ce5 0x37e1 0x2fd6 0x333d 0x3525 0x3964 0x3cfd 0x4112 0x360e 0x319c 0x3768 0x3acb 0x3dbd 0x4280 0x3a64 0x326c 0x37dc 0x3b0d 0x3dbf 0x373b 0x3dd4 0x395e 0x3745 0x3a7a 0x3cb2 0x2cf9 0x3f72 0x3eca 0x36d1 0x3a41 0x3bb0 0x2d03 0x3ec5 0x3f83 0x384b 0x3ae8 0x3b5d 0x2edc 0x3dc2 0x3fc3 0x3b9d 0x3c38 0x3b2b 0x2f8c 0x3d9a 0x3f92 0x3dc7 0x3e57 0x3b93 0x2f1e 0x3df3 0x3ecf 0x3f34 0x4225 0x3e9f 0x2e5c 0x3e54 0x3de6 0x3fc8 0x445b 0x4233 0x2d64 0x3c6d 0x3c08 0x3c17 0x4527 0x44e0 0x2c30 0x3697 0x3971 0x3578 0x4604 0x471b 0x2b6b 0x3248 0x38a0 0x33d2 0x4627 0x47ff 0x2b06 0x2f1a 0x38d8 0x353a 0x4512 0x484d 0x2ad4 0x2d6f 0x3925 0x3660 0x43d2 0x484f 0x2add 0x2d4c 0x3975 0x3678 0x4315 0x4790 0x2aec 0x2d55 0x39cc 0x366c 0x4294 0x45bc 0x2af3 0x2d44 0x3a34 0x38ed 0x427b 0x43ff 0x2b16 0x2d12 0x3b09 0x40ee 0x4270 0x426f 0x2b4e 0x2d07 0x3ba6 0x465a 0x4280 0x41aa 0x2b80 0x2d07 0x38cb 0x47e5 0x43ef 0x42bb 0x2ba9 0x2cec 0x3382 0x48db 0x472c 0x45f6 0x2bd0 0x2ce9 0x319e 0x48b8 0x4a98 0x495f 0x2bf8 0x2d41 0x31a4 0x45bb 0x4e8c 0x4c69 0x2c20 0x2daa 0x31b5 0x4185 0x51da 0x4ea9 0x2c45 0x2dd9 0x3221 0x3e14 0x52fb 0x508e 0x2c64 0x2d8a 0x34af 0x3aee 0x5257 0x524a 0x2c6c 0x2d32 0x3713 0x3918 0x50bc 0x5292 0x2c5a 0x2d52 0x36de 0x38bf 0x4e90 0x50e7 0x2c45 0x2d99 0x34f7 0x3913 0x4dbc 0x4f8f 0x2c53 0x2da9 0x354f 0x3906 0x4ea8 0x5136 0x2cb7 0x2d71 0x370b 0x3898 0x515e 0x56c7 0x2d6c 0x2d2c 0x33cd 0x3962 0x555b 0x5c52 0x2e6e 0x2cc8 0x325a 0x3610 0x4cc2 0x4ea4 0x2fc4 0x2d10 0x320a 0x3e49 0x4394 0x4373 0x30b0 0x2d1b 0x3431 0x3e08 0x42cc 0x40b6 0x322c 0x2e86 0x370e 0x4092 0x40be 0x3f21 0x3256 0x3099 0x3915 0x3fe1 0x3e27 0x3e5b 0x322c 0x3127 0x38b1 0x3e5f 0x428d 0x410e 0x3117 0x3039 0x38e1 0x4283 0x4414 0x4431 0x2f77 0x2f18 0x37f8 0x4528 0x4741 0x4a06 0x2e6f 0x2e5e 0x37ca 0x4396 0x477b 0x4ab1 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b>; + }; + + qcom,pc-temp-y6-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1af4 0x1607 0x1492 0x13c9 0x139d 0x1392 0x1afb 0x160e 0x148d 0x13c8 0x139d 0x1393 0x1aff 0x1616 0x148a 0x13c7 0x139d 0x1394 0x1aff 0x161e 0x148a 0x13c8 0x139d 0x1395 0x1afc 0x1626 0x148c 0x13c9 0x139e 0x1395 0x1af7 0x162e 0x148e 0x13ca 0x139f 0x1396 0x1ac7 0x1636 0x1494 0x13cc 0x139f 0x1397 0x1a78 0x163e 0x149c 0x13cf 0x13a1 0x1397 0x1a74 0x1646 0x14a1 0x13d2 0x13a2 0x1398 0x1aff 0x164c 0x14a3 0x13d4 0x13a3 0x1399 0x1b70 0x1657 0x14a8 0x13d7 0x13a5 0x139a 0x1af4 0x16ac 0x14cc 0x13e2 0x13ac 0x139f 0x19d3 0x172c 0x1503 0x13ef 0x13b5 0x13a6 0x1941 0x172c 0x150b 0x13f2 0x13b7 0x13a8 0x190e 0x1670 0x14e5 0x13f1 0x13b5 0x13a7 0x18f6 0x15e2 0x14be 0x13f0 0x13b3 0x13a7 0x18fb 0x15e4 0x14ab 0x13fd 0x13bb 0x13ac 0x1909 0x15f5 0x149c 0x1412 0x13c9 0x13b5 0x190d 0x15f9 0x148f 0x1412 0x13cb 0x13b7 0x190c 0x15ed 0x1483 0x13f3 0x13bb 0x13ab 0x190a 0x15e0 0x147a 0x13d6 0x13ab 0x139f 0x190d 0x15d6 0x1473 0x13cd 0x13a4 0x139a 0x191a 0x15ce 0x146e 0x13c8 0x13a1 0x1397 0x192c 0x15c9 0x146d 0x13c7 0x13a0 0x1397 0x1945 0x15c7 0x146e 0x13c7 0x13a0 0x1397 0x1964 0x15c6 0x146f 0x13c8 0x13a0 0x1398 0x1982 0x15cb 0x1470 0x13c9 0x13a1 0x1398 0x19a0 0x15d5 0x1473 0x13ca 0x13a2 0x1399 0x19c0 0x15e2 0x1475 0x13cc 0x13a3 0x139a 0x19e6 0x15f3 0x1476 0x13d0 0x13a5 0x139c 0x1a11 0x1607 0x1477 0x13d4 0x13a7 0x139e 0x1a3f 0x161d 0x1478 0x13d6 0x13ab 0x13a2 0x1a72 0x1638 0x1479 0x13d7 0x13af 0x13a6 0x1aa7 0x1655 0x147b 0x13d6 0x13b0 0x13a7 0x1ae0 0x1676 0x147f 0x13d2 0x13ab 0x13a2 0x1b1c 0x169b 0x1483 0x13ce 0x13a5 0x139c 0x1b59 0x16c6 0x1488 0x13cc 0x13a2 0x139a 0x1b96 0x16f8 0x1490 0x13cb 0x13a0 0x1398 0x1bd4 0x1732 0x149a 0x13ca 0x13a0 0x1399 0x1c13 0x1772 0x14a5 0x13cb 0x13a1 0x139a 0x1c51 0x17bc 0x14b0 0x13cd 0x13a3 0x139c 0x1c90 0x1811 0x14bf 0x13ce 0x13a4 0x139d 0x1cd3 0x1875 0x14d0 0x13cf 0x13a3 0x139c 0x1d22 0x18ef 0x14e0 0x13d0 0x13a1 0x1399 0x1d80 0x1984 0x14f9 0x13d2 0x13a3 0x139a 0x1da5 0x19b9 0x150c 0x13db 0x13a9 0x13a3 0x1dcf 0x19c4 0x1513 0x13e1 0x13b2 0x13ad 0x1dde 0x19e7 0x152f 0x13ec 0x13bf 0x13bb 0x1e04 0x1a57 0x155a 0x13f6 0x13c0 0x13b8 0x1e6d 0x1abf 0x1560 0x13eb 0x13b2 0x13a7 0x1edf 0x1b41 0x1573 0x13ee 0x13ae 0x13a5 0x1f66 0x1c0d 0x15ab 0x13fd 0x13b6 0x13ac 0x2034 0x1cdf 0x160e 0x1415 0x13c2 0x13b7 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4>; + }; + }; + }; + }; + }; + + fragment@12 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm1 { + reg = <0x4f>; + label = "pa_therm1"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@13 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x4d 0xffffffff 0x4e 0xffffffff 0x4f 0xffffffff 0x52>; + + pa_therm1 { + reg = <0x4f>; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + }; + }; + }; + + fragment@14 { + target = <0xffffffff>; + + __overlay__ { + compatible = "qcom,ufs-phy-qmp-v3"; + vdda-phy-supply = <0xffffffff>; + vdda-pll-supply = <0xffffffff>; + vdda-phy-max-microamp = <0xf5b4>; + vdda-pll-max-microamp = <0x477c>; + status = "ok"; + }; + }; + + fragment@15 { + target = <0xffffffff>; + + __overlay__ { + vdd-hba-supply = <0xffffffff>; + vdd-hba-fixed-regulator; + vcc-supply = <0xffffffff>; + vcc-voltage-level = <0x2d2a80 0x2d2a80>; + vcc-max-microamp = <0x927c0>; + vccq2-supply = <0xffffffff>; + vccq2-voltage-level = <0x1ab3f0 0x1dc130>; + vccq2-max-microamp = <0x927c0>; + qcom,vddp-ref-clk-supply = <0xffffffff>; + qcom,vddp-ref-clk-max-microamp = <0x64>; + status = "ok"; + }; + }; + + fragment@16 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0x8b290>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <0x1b7740 0x1b7740>; + qcom,vdd-io-current-level = <0x0 0x4f588>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + status = "ok"; + }; + }; + + fragment@17 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0xc3500>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-voltage-level = <0x1b7740 0x2d0370>; + qcom,vdd-io-current-level = <0x0 0x55f0>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + cd-gpios = <0xffffffff 0x45 0x1>; + status = "ok"; + }; + }; + + fragment@18 { + target = <0xffffffff>; + + __overlay__ { + + pa-therm1 { + polling-delay-passive = <0x0>; + polling-delay = <0x0>; + thermal-governor = "user_space"; + thermal-sensors = <0xffffffff 0x4f>; + wake-capable-sensor; + + trips { + + active-config0 { + temperature = <0x1e848>; + hysteresis = <0x3e8>; + type = "passive"; + }; + }; + }; + + quiet-therm-step { + status = "disabled"; + }; + }; + }; + + fragment@19 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@20 { + target = <0xffffffff>; + + __overlay__ { + qcom,battery-data = <0x14>; + qcom,qg-iterm-ma = <0x64>; + qcom,hold-soc-while-full; + qcom,linearize-soc; + qcom,cl-feedback-on; + }; + }; + + fragment@21 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x8 0xffffffff 0x7 0xffffffff 0x9 0xffffffff 0x6 0xffffffff 0x4f 0xffffffff 0x99 0xffffffff 0x83>; + io-channel-names = "usb_in_voltage", "usb_in_current", "chg_temp", "die_temp", "conn_temp", "sbux_res", "vph_voltage"; + qcom,battery-data = <0x14>; + qcom,auto-recharge-soc = <0x62>; + qcom,step-charging-enable; + qcom,sw-jeita-enable; + qcom,fcc-stepping-enable; + qcom,suspend-input-on-debug-batt; + qcom,sec-charger-config = <0x3>; + qcom,thermal-mitigation = <0x401640 0x3567e0 0x2dc6c0 0x2625a0 0x1e8480 0x16e360 0xf4240 0x7a120>; + dpdm-supply = <0xffffffff>; + qcom,charger-temp-max = <0x320>; + qcom,smb-temp-max = <0x320>; + qcom,fcc-step-delay-ms = <0x64>; + qcom,fcc-step-size-ua = <0x186a0>; + qcom,disable-sw-thermal-regulation; + qcom,disable-fcc-restriction; + qcom,smb-internal-pull-kohm = <0x0>; + }; + }; + + fragment@22 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + }; + }; + }; + + fragment@23 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@24 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,i2c-touch-active = "synaptics,tcm-i2c"; + + synaptics_tcm@20 { + compatible = "synaptics,tcm-i2c"; + reg = <0x20>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend", "pmx_ts_release"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + pinctrl-2 = <0xffffffff>; + vdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + synaptics,pwr-reg-name = "avdd"; + synaptics,bus-reg-name = "vdd"; + synaptics,irq-gpio = <0xffffffff 0x9 0x2008>; + synaptics,irq-on-state = <0x0>; + synaptics,reset-gpio = <0xffffffff 0x8 0x0>; + synaptics,reset-on-state = <0x0>; + synaptics,reset-active-ms = <0x14>; + synaptics,reset-delay-ms = <0xc8>; + synaptics,power-delay-ms = <0xc8>; + synaptics,ubl-i2c-addr = <0x20>; + }; + + atmel_mxt_ts@4a { + compatible = "atmel,maxtouch"; + reg = <0x4a>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + avdd-supply = <0xffffffff>; + vdd-supply = <0xffffffff>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + reset-gpios = <0xffffffff 0x8 0x0>; + irq-gpios = <0xffffffff 0x9 0x2008>; + atmel,xy_switch; + atmel,panel-coords = <0x0 0x0 0x1df 0x31f>; + atmel,display-coords = <0x0 0x0 0x153 0x301>; + }; + }; + }; + + fragment@25 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,clk-freq-out = <0xf4240>; + #address-cells = <0x1>; + #size-cells = <0x0>; + + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <0xffffffff 0x25 0x0>; + qcom,nq-ven = <0xffffffff 0xc 0x0>; + qcom,nq-firm = <0xffffffff 0x24 0x0>; + qcom,nq-clkreq = <0xffffffff 0x1f 0x0>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff>; + }; + }; + }; + + fragment@26 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-aux-switch = <0xffffffff>; + }; + }; + + fragment@27 { + target = <0xffffffff>; + + __overlay__ { + + lpi_pinctrl@627C0000 { + compatible = "qcom,lpi-pinctrl"; + reg = <0x627c0000 0x0>; + qcom,num-gpios = <0xf>; + gpio-controller; + #gpio-cells = <0x2>; + qcom,slew-reg = <0x6295a000 0x0>; + qcom,lpi-offset-tbl = <0x0 0x1000 0x2000 0x3000 0x4000 0x5000 0x6000 0x7000 0x8000 0x9000 0xa000 0xb000 0xc000 0xd000 0xe000>; + qcom,lpi-slew-offset-tbl = <0x0 0x2 0x4 0x8 0xa 0xc 0x0 0x0 0x0 0x0 0x10 0x12 0x0 0x0 0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + phandle = <0x32>; + + dmic01_clk_active { + phandle = <0x33>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic01_clk_sleep { + phandle = <0x35>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic01_data_active { + phandle = <0x34>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic01_data_sleep { + phandle = <0x36>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic23_clk_active { + phandle = <0x37>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic23_clk_sleep { + phandle = <0x39>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic23_data_active { + phandle = <0x38>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic23_data_sleep { + phandle = <0x3a>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic45_clk_active { + phandle = <0x3b>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic45_clk_sleep { + phandle = <0x3d>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic45_data_active { + phandle = <0x3c>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic45_data_sleep { + phandle = <0x3e>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + tx_swr_clk_sleep { + phandle = <0x4b>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_clk_active { + phandle = <0x47>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + tx_swr_data0_sleep { + phandle = <0x4c>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data0_active { + phandle = <0x48>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_sleep { + phandle = <0x41>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_active { + phandle = <0x3f>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_data_sleep { + phandle = <0x42>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_data_active { + phandle = <0x40>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data1_sleep { + phandle = <0x4d>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data1_active { + phandle = <0x49>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data2_sleep { + phandle = <0x4e>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data2_active { + phandle = <0x4a>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + rx_swr_clk_sleep { + phandle = <0x45>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_clk_active { + phandle = <0x43>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + rx_swr_data_sleep { + phandle = <0x46>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_data_active { + phandle = <0x44>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + lpi_i2s1_sck_active { + phandle = <0x55>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sck_sleep { + phandle = <0x59>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_ws_active { + phandle = <0x56>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_ws_sleep { + phandle = <0x5a>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd0_active { + phandle = <0x57>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd0_sleep { + phandle = <0x5b>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd1_active { + phandle = <0x58>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd1_sleep { + phandle = <0x5c>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + }; + + fragment@28 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x4>; + + bolero-clk-rsc-mngr { + compatible = "qcom,bolero-clk-rsc-mngr"; + qcom,fs-gen-sequence = <0x3000 0x1 0x3004 0x1 0x3080 0x2>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,va_mclk_mode_muxsel = <0x627a0000>; + clock-names = "tx_core_clk", "tx_npl_clk", "rx_core_clk", "rx_npl_clk", "wsa_core_clk", "wsa_npl_clk", "va_core_clk", "va_npl_clk"; + clocks = <0x15 0x0 0x16 0x0 0x17 0x0 0x18 0x0 0x19 0x0 0x1a 0x0 0x1b 0x0 0x1c 0x0>; + }; + + tx-macro@62620000 { + compatible = "qcom,tx-macro"; + reg = <0x62620000 0x0>; + clock-names = "tx_core_clk", "tx_npl_clk"; + clocks = <0x15 0x0 0x16 0x0>; + qcom,tx-swr-gpios = <0x1d>; + qcom,tx-dmic-sample-rate = <0x249f00>; + phandle = <0xb2>; + + tx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x3>; + swrm-io-base = <0x62630000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x1>; + interrupts = <0x0 0x128 0x0 0x0 0x22b 0x0>; + interrupt-names = "swr_master_irq", "swr_wake_irq"; + qcom,swr-wakeup-required = <0x0>; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x21 0xf 0x2 0x12 0x1 0x2 0x13 0x2 0x3 0x14 0x1 0x3 0x15 0x2 0x4 0x16 0x1 0x4 0x17 0x2 0x4 0x18 0x4 0x4 0x19 0x8 0x5 0x1a 0x1 0x5 0x1b 0x2 0x5 0x1c 0x4 0x5 0x1d 0x8>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + qcom,swr-mstr-irq-wakeup-capable = <0x1>; + phandle = <0xb3>; + + wcd938x-tx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170223>; + phandle = <0x24>; + }; + + wcd937x-tx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170223>; + phandle = <0x28>; + }; + }; + }; + + rx-macro@62600000 { + compatible = "qcom,rx-macro"; + reg = <0x62600000 0x0>; + clock-names = "rx_core_clk", "rx_npl_clk"; + clocks = <0x17 0x0 0x18 0x0>; + qcom,rx-swr-gpios = <0x1e>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,rx-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + phandle = <0xb4>; + + rx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x2>; + swrm-io-base = <0x62610000 0x0>; + interrupts = <0x0 0x129 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x9 0x1 0x1 0xa 0x2 0x2 0xd 0x1 0x3 0xb 0x1 0x3 0xc 0x2 0x4 0xe 0x1 0x5 0xf 0x1 0x5 0x10 0x2>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + phandle = <0xb5>; + + wcd938x-rx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170224>; + phandle = <0x23>; + }; + + wcd937x-rx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170224>; + phandle = <0x27>; + }; + }; + }; + + wsa-macro@62640000 { + compatible = "qcom,wsa-macro"; + reg = <0x62640000 0x0>; + clock-names = "wsa_core_clk", "wsa_npl_clk"; + clocks = <0x19 0x0 0x1a 0x0>; + qcom,wsa-swr-gpios = <0x1f>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,wsa-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + status = "disabled"; + phandle = <0xb6>; + + wsa_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + qcom,swr_master_id = <0x1>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + swrm-io-base = <0x62650000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x0>; + interrupts = <0x0 0x127 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x8>; + qcom,swr-port-mapping = <0x1 0x1 0x1 0x2 0x3 0xf 0x3 0x2 0x3 0x4 0x5 0x1 0x5 0x7 0xf 0x6 0x6 0x3 0x7 0x4 0x3 0x8 0x8 0x3>; + qcom,swr-num-dev = <0x2>; + phandle = <0xb7>; + + wsa881x@20170211 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170211>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2d>; + }; + + wsa881x@20170212 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170212>; + qcom,spkr-sd-n-node = <0x21>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2e>; + }; + + wsa881x@21170213 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170213>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2f>; + }; + + wsa881x@21170214 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170214>; + qcom,spkr-sd-n-node = <0x21>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x30>; + }; + }; + }; + + va-macro@62770000 { + compatible = "qcom,va-macro"; + reg = <0x62770000 0x0>; + clock-names = "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0>; + qcom,va-clk-mux-select = <0x1>; + qcom,va-island-mode-muxsel = <0x627a0000>; + qcom,va-dmic-sample-rate = <0x927c0>; + qcom,default-clk-id = <0x0>; + phandle = <0xb8>; + }; + + wcd938x-codec { + compatible = "qcom,wcd938x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x0 0x13 0x2 0x0 0x13 0x1 0x14 0x1 0x0 0x14 0x1 0x15 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x2 0x18 0x4 0x0 0x18 0x2 0x19 0x8 0x0 0x19 0x3 0x1a 0x1 0x0 0x1a 0x3 0x1b 0x2 0x0 0x1b 0x3 0x1c 0x4 0x0 0x1c 0x3 0x1d 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x22>; + qcom,rx-slave = <0x23>; + qcom,tx-slave = <0x24>; + cdc-vdd-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-rxtx-current = <0x7530>; + cdc-vddio-supply = <0xffffffff>; + qcom,cdc-vddio-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddio-current = <0x7530>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0xaf0>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-micbias4-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-rxtx", "cdc-vddio", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + mbhc-button-thres = <0x25 0xd 0x3f 0x25 0x58 0x8a 0x25 0x8a 0x8a 0x25 0xe1 0xe1 0x25 0x1c2 0x1c2 0x25 0x1c2 0x26c 0x25 0x1c2 0x26c 0x25 0x1c2 0x26c>; + imp-table = <0x26 0x0 0x5 0x6 0x26 0x6 0x17 0x8 0x26 0x18 0x26 0x7 0x26 0x27 0x64 0x6 0x26 0x65 0xa0 0xa 0x26 0xa1 0x190 0xb 0x26 0x191 0x7d0 0xb 0x26 0x7d1 0x7fffffff 0x6>; + phandle = <0x31>; + }; + + wcd937x-codec { + status = "disabled"; + compatible = "qcom,wcd937x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x1 0x13 0x1 0x0 0x14 0x1 0x14 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x3 0x18 0x1 0x0 0x1a 0x3 0x19 0x2 0x0 0x1b 0x3 0x1a 0x4 0x0 0x1c 0x3 0x1b 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x22>; + qcom,rx-slave = <0x27>; + qcom,tx-slave = <0x28>; + cdc-vdd-ldo-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-ldo-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-ldo-rxtx-current = <0x61a8>; + cdc-vddpx-1-supply = <0xffffffff>; + qcom,cdc-vddpx-1-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddpx-1-current = <0x2710>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0x708>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-ldo-rxtx", "cdc-vddpx-1", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + phandle = <0xb9>; + }; + }; + }; + + fragment@29 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,msm-mi2s-master = <0x1 0x1 0x1 0x1 0x1 0x1>; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS4", "MIC BIAS4", "Analog Mic4", "TX DMIC0", "MIC BIAS1", "MIC BIAS1", "Digital Mic0", "TX DMIC1", "MIC BIAS1", "MIC BIAS1", "Digital Mic1", "TX DMIC2", "MIC BIAS3", "MIC BIAS3", "Digital Mic2", "TX DMIC3", "MIC BIAS3", "MIC BIAS3", "Digital Mic3", "TX DMIC4", "MIC BIAS4", "MIC BIAS4", "Digital Mic4", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "IN3_AUX", "AUX_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "TX SWR_DMIC0", "DMIC1_OUTPUT", "TX SWR_DMIC1", "DMIC2_OUTPUT", "TX SWR_DMIC2", "DMIC3_OUTPUT", "TX SWR_DMIC3", "DMIC4_OUTPUT", "TX SWR_DMIC4", "DMIC5_OUTPUT", "TX SWR_DMIC5", "DMIC6_OUTPUT", "TX SWR_DMIC6", "DMIC7_OUTPUT", "TX SWR_DMIC7", "DMIC8_OUTPUT", "WSA SRC0_INP", "SRC0", "WSA_TX DEC0_INP", "TX DEC0 MUX", "WSA_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "SpkrLeft IN", "WSA_SPK1 OUT", "SpkrRight IN", "WSA_SPK2 OUT", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA MIC BIAS1", "Digital Mic0", "VA MIC BIAS1", "Digital Mic1", "VA MIC BIAS3", "Digital Mic2", "VA MIC BIAS3", "Digital Mic3", "VA MIC BIAS4", "Digital Mic4", "VA DMIC0", "VA MIC BIAS1", "VA DMIC1", "VA MIC BIAS1", "VA DMIC2", "VA MIC BIAS3", "VA DMIC3", "VA MIC BIAS3", "VA DMIC4", "VA MIC BIAS4", "VA SWR_ADC0", "VA_SWR_CLK", "VA SWR_ADC1", "VA_SWR_CLK", "VA SWR_ADC2", "VA_SWR_CLK", "VA SWR_ADC3", "VA_SWR_CLK", "VA SWR_MIC0", "VA_SWR_CLK", "VA SWR_MIC1", "VA_SWR_CLK", "VA SWR_MIC2", "VA_SWR_CLK", "VA SWR_MIC3", "VA_SWR_CLK", "VA SWR_MIC4", "VA_SWR_CLK", "VA SWR_MIC5", "VA_SWR_CLK", "VA SWR_MIC6", "VA_SWR_CLK", "VA SWR_MIC7", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT", "VA SWR_MIC0", "DMIC1_OUTPUT", "VA SWR_MIC1", "DMIC2_OUTPUT", "VA SWR_MIC2", "DMIC3_OUTPUT", "VA SWR_MIC3", "DMIC4_OUTPUT", "VA SWR_MIC4", "DMIC5_OUTPUT", "VA SWR_MIC5", "DMIC6_OUTPUT", "VA SWR_MIC6", "DMIC7_OUTPUT", "VA SWR_MIC7", "DMIC8_OUTPUT"; + qcom,msm-mbhc-hphl-swh = <0x1>; + qcom,msm-mbhc-gnd-swh = <0x1>; + qcom,cdc-dmic01-gpios = <0x29>; + qcom,cdc-dmic23-gpios = <0x2a>; + qcom,cdc-dmic45-gpios = <0x2b>; + asoc-codec = <0xffffffff 0xffffffff 0x2c>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec", "msm-ext-disp-audio-codec-rx"; + qcom,wsa-max-devs = <0x2>; + qcom,wsa-devs = <0x2d 0x2e 0x2f 0x30>; + qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight", "SpkrLeft", "SpkrRight"; + qcom,codec-max-aux-devs = <0x1>; + qcom,codec-aux-devs = <0x31>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x32 0xffffffff>; + }; + }; + + fragment@30 { + target = <0xffffffff>; + + __overlay__ { + + cdc_dmic01_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x33 0x34>; + pinctrl-1 = <0x35 0x36>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x29>; + }; + + cdc_dmic23_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x37 0x38>; + pinctrl-1 = <0x39 0x3a>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2a>; + }; + + cdc_dmic45_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3b 0x3c>; + pinctrl-1 = <0x3d 0x3e>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2b>; + }; + + wsa_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3f 0x40>; + pinctrl-1 = <0x41 0x42>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x1f>; + }; + + rx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x43 0x44>; + pinctrl-1 = <0x45 0x46>; + qcom,lpi-gpios; + phandle = <0x1e>; + }; + + tx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x47 0x48 0x49 0x4a>; + pinctrl-1 = <0x4b 0x4c 0x4d 0x4e>; + qcom,lpi-gpios; + qcom,chip-wakeup-reg = <0x1ffb000>; + qcom,chip-wakeup-maskbit = <0x0>; + qcom,chip-wakeup-default-val = <0x1>; + phandle = <0x1d>; + }; + }; + }; + + fragment@31 { + target = <0xffffffff>; + + __overlay__ { + + wsa_spkr_en1_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x20>; + }; + + wsa_spkr_en2_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x21>; + }; + + msm_cdc_pinctrl@58 { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + phandle = <0x22>; + }; + + wsa_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x3>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x309>; + #clock-cells = <0x1>; + phandle = <0x19>; + }; + + wsa_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x4>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30a>; + #clock-cells = <0x1>; + phandle = <0x1a>; + }; + + rx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x5>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30e>; + #clock-cells = <0x1>; + phandle = <0x17>; + }; + + rx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x6>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30f>; + #clock-cells = <0x1>; + phandle = <0x18>; + }; + + tx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x7>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30c>; + #clock-cells = <0x1>; + phandle = <0x15>; + }; + + tx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x8>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30d>; + #clock-cells = <0x1>; + phandle = <0x16>; + }; + + va_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x2>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30b>; + #clock-cells = <0x1>; + phandle = <0x1b>; + }; + + va_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0xa>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x310>; + #clock-cells = <0x1>; + phandle = <0x1c>; + }; + }; + }; + + fragment@32 { + target = <0xffffffff>; + + __overlay__ { + qcom,msm-dai-is-island-supported = <0x1>; + }; + }; + + fragment@33 { + target = <0xffffffff>; + + __overlay__ { + hsuart8 = "/soc/qcom,qup_hsuart@a88000"; + }; + }; + + fragment@34 { + target = <0xffffffff>; + + __overlay__ { + + qcom,qup_hsuart@a88000 { + compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; + reg = <0xa88000 0x4000>; + reg-names = "se_phys"; + clock-names = "se-clk", "m-ahb", "s-ahb"; + clocks = <0xffffffff 0x50 0xffffffff 0x5a 0xffffffff 0x5b>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4f 0x50>; + pinctrl-1 = <0x51 0x52>; + interrupts = <0x0 0x163 0x0>; + qcom,wrapper-core = <0xffffffff>; + always-on-clock; + status = "ok"; + phandle = <0xba>; + }; + }; + }; + + fragment@35 { + target = <0xffffffff>; + + __overlay__ { + + qupv3_se8_2hsuart_pins { + phandle = <0xbb>; + + qupv3_se8_2uart_tx_active { + phandle = <0x4f>; + + mux { + pins = "gpio44"; + function = "qup12"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_rx_active { + phandle = <0x50>; + + mux { + pins = "gpio45"; + function = "qup12"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_tx_sleep { + phandle = <0x51>; + + mux { + pins = "gpio44"; + function = "gpio"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + input-enable; + }; + }; + + qupv3_se8_2uart_rx_sleep { + phandle = <0x52>; + + mux { + pins = "gpio45"; + function = "gpio"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@36 { + target = <0xffffffff>; + + __overlay__ { + + dcc_curr_link@3 { + qcom,curr-link-list = <0x3>; + qcom,data-sink = "sram"; + qcom,link-list = <0x0 0x18000024 0x1 0x0 0x0 0x18000040 0x1 0x0 0x0 0x18010024 0x1 0x0 0x0 0x18010040 0x1 0x0 0x0 0x18020024 0x1 0x0 0x0 0x18020040 0x1 0x0 0x0 0x18030024 0x1 0x0 0x0 0x18030040 0x1 0x0 0x0 0x18040024 0x1 0x0 0x0 0x18040040 0x1 0x0 0x0 0x18050024 0x1 0x0 0x0 0x18050040 0x1 0x0 0x0 0x18060024 0x1 0x0 0x0 0x18060040 0x1 0x0 0x0 0x18070024 0x1 0x0 0x0 0x18070040 0x1 0x0 0x0 0x18080024 0x1 0x0 0x0 0x18080040 0x1 0x0 0x0 0x180800f8 0x1 0x0 0x0 0x18080104 0x1 0x0 0x0 0x1808011c 0x1 0x0 0x0 0x18080128 0x1 0x0 0x0 0x18321700 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18325f00 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x18321818 0x1 0x0 0x0 0x18323818 0x1 0x0 0x0 0x18326018 0x1 0x0 0x0 0x18321920 0x1 0x0 0x0 0x1832102c 0x1 0x0 0x0 0x18321044 0x1 0x0 0x0 0x18321710 0x1 0x0 0x0 0x1832176c 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18323920 0x1 0x0 0x0 0x1832302c 0x1 0x0 0x0 0x18323044 0x1 0x0 0x0 0x18323710 0x1 0x0 0x0 0x1832376c 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18326120 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18325844 0x1 0x0 0x0 0x18325f10 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280000 0x2 0x0 0x0 0x18282000 0x2 0x0 0x0 0x18284000 0x2 0x0 0x0 0x9680000 0x1 0x0 0x0 0x9680004 0x1 0x0 0x2 0x8 0x0 0x0 0x0 0x9681000 0x1 0x0 0x2 0x1 0x0 0x0 0x0 0x9681004 0x1 0x0 0x0 0x9681008 0x1 0x0 0x0 0x968100c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9698500 0x1 0x0 0x0 0x9698504 0x1 0x0 0x0 0x9698508 0x1 0x0 0x0 0x969850c 0x1 0x0 0x0 0x9698510 0x1 0x0 0x0 0x9698514 0x1 0x0 0x0 0x9698518 0x1 0x0 0x0 0x969851c 0x1 0x0 0x0 0x9698700 0x1 0x0 0x0 0x9698704 0x1 0x0 0x0 0x9698708 0x1 0x0 0x0 0x969870c 0x1 0x0 0x0 0x9698714 0x1 0x0 0x0 0x9698718 0x1 0x0 0x0 0x969871c 0x1 0x0 0x0 0x1620204 0x1 0x0 0x0 0x1620240 0x1 0x0 0x0 0x1620248 0x1 0x0 0x0 0x1620288 0x1 0x0 0x0 0x162028c 0x1 0x0 0x0 0x1620290 0x1 0x0 0x0 0x1620294 0x1 0x0 0x0 0x16202a8 0x1 0x0 0x0 0x16202ac 0x1 0x0 0x0 0x16202b0 0x1 0x0 0x0 0x16202b4 0x1 0x0 0x0 0x1620300 0x1 0x0 0x0 0x16e0404 0x1 0x0 0x0 0x16e0408 0x1 0x0 0x0 0x16e0410 0x1 0x0 0x0 0x16e0420 0x1 0x0 0x0 0x16e0424 0x1 0x0 0x0 0x16e0428 0x1 0x0 0x0 0x16e042c 0x1 0x0 0x0 0x16e0430 0x1 0x0 0x0 0x16e0434 0x1 0x0 0x0 0x16e0438 0x1 0x0 0x0 0x16e043c 0x1 0x0 0x0 0x16e0300 0x1 0x0 0x0 0x16e0304 0x1 0x0 0x0 0x16e0700 0x1 0x0 0x0 0x16e0704 0x1 0x0 0x0 0x1700c00 0x1 0x0 0x0 0x1700c08 0x1 0x0 0x0 0x1700c10 0x1 0x0 0x0 0x1700c20 0x1 0x0 0x0 0x1700c24 0x1 0x0 0x0 0x1700c28 0x1 0x0 0x0 0x1700c2c 0x1 0x0 0x0 0x1700c30 0x1 0x0 0x0 0x1700c34 0x1 0x0 0x0 0x1700c38 0x1 0x0 0x0 0x1700c3c 0x1 0x0 0x0 0x1700300 0x1 0x0 0x0 0x1700304 0x1 0x0 0x0 0x1700308 0x1 0x0 0x0 0x170030c 0x1 0x0 0x0 0x1700310 0x1 0x0 0x0 0x1700500 0x1 0x0 0x0 0x1700504 0x1 0x0 0x0 0x1700508 0x1 0x0 0x0 0x170050c 0x1 0x0 0x0 0x1700900 0x1 0x0 0x0 0x1700904 0x1 0x0 0x0 0x1700908 0x1 0x0 0x0 0x1740004 0x1 0x0 0x0 0x1740008 0x1 0x0 0x0 0x1740010 0x1 0x0 0x0 0x1740020 0x1 0x0 0x0 0x1740024 0x1 0x0 0x0 0x1740028 0x1 0x0 0x0 0x174002c 0x1 0x0 0x0 0x1740030 0x1 0x0 0x0 0x1740034 0x1 0x0 0x0 0x1740038 0x1 0x0 0x0 0x174003c 0x1 0x0 0x0 0x1740300 0x1 0x0 0x0 0x1740304 0x1 0x0 0x0 0x1740308 0x1 0x0 0x0 0x174030c 0x1 0x0 0x0 0x1740310 0x1 0x0 0x0 0x1740314 0x1 0x0 0x0 0x9698204 0x1 0x0 0x0 0x9698240 0x1 0x0 0x0 0x9698244 0x1 0x0 0x0 0x9698248 0x1 0x0 0x0 0x969824c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x9681018 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9160204 0x1 0x0 0x0 0x9160240 0x1 0x0 0x0 0x9160248 0x1 0x0 0x0 0x9160288 0x1 0x0 0x0 0x9160290 0x1 0x0 0x0 0x9160300 0x1 0x0 0x0 0x9160304 0x1 0x0 0x0 0x9160308 0x1 0x0 0x0 0x916030c 0x1 0x0 0x0 0x9160310 0x1 0x0 0x0 0x9160314 0x1 0x0 0x0 0x9160318 0x1 0x0 0x0 0x9160008 0x1 0x0 0x0 0x9160010 0x1 0x0 0x0 0x9160020 0x1 0x0 0x0 0x9160024 0x1 0x0 0x0 0x9160028 0x1 0x0 0x0 0x916002c 0x1 0x0 0x0 0x9160030 0x1 0x0 0x0 0x9160034 0x1 0x0 0x0 0x9160038 0x1 0x0 0x0 0x916003c 0x1 0x0 0x0 0x63042680 0x1 0x0 0x0 0x63042684 0x1 0x0 0x0 0x63042688 0x1 0x0 0x0 0x63042690 0x1 0x0 0x0 0x630426a0 0x1 0x0 0x0 0x630426a4 0x1 0x0 0x0 0x630426a8 0x1 0x0 0x0 0x630426ac 0x1 0x0 0x0 0x630426b0 0x1 0x0 0x0 0x630426b4 0x1 0x0 0x0 0x630426b8 0x1 0x0 0x0 0x630426bc 0x1 0x0 0x0 0x63041900 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x1620500 0x4 0x0 0x0 0x1620700 0x4 0x0 0x0 0x1620300 0x1 0x0 0x0 0x1620f00 0x2 0x0 0x0 0x1620b00 0x2 0x0 0x0 0x1700b00 0x2 0x0 0x0 0x1700700 0x3 0x0 0x0 0x9163100 0x1 0x0 0x0 0x96aa100 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x9991500 0x8 0x0 0x0 0x9050008 0x1 0x0 0x0 0x9050078 0x1 0x0 0x0 0x9236028 0x1 0x0 0x0 0x923602c 0x1 0x0 0x0 0x9236030 0x1 0x0 0x0 0x9236034 0x1 0x0 0x0 0x9236038 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x92360b0 0x1 0x0 0x0 0x9236044 0x1 0x0 0x0 0x9236048 0x1 0x0 0x0 0x923604c 0x1 0x0 0x0 0x9236050 0x1 0x0 0x0 0x923e030 0x1 0x0 0x0 0x923e034 0x1 0x0 0x0 0x9241000 0x1 0x0 0x0 0x9248058 0x1 0x0 0x0 0x924805c 0x1 0x0 0x0 0x9248060 0x1 0x0 0x0 0x9248064 0x1 0x0 0x0 0x9260410 0x1 0x0 0x0 0x92e0410 0x1 0x0 0x0 0x9260414 0x1 0x0 0x0 0x92e0414 0x1 0x0 0x0 0x9260418 0x1 0x0 0x0 0x92e0418 0x1 0x0 0x0 0x9260420 0x1 0x0 0x0 0x9260424 0x1 0x0 0x0 0x9260430 0x1 0x0 0x0 0x9260440 0x1 0x0 0x0 0x9260448 0x1 0x0 0x0 0x92604a0 0x1 0x0 0x0 0x92604b0 0x1 0x0 0x0 0x92604d0 0x2 0x0 0x0 0x9261440 0x1 0x0 0x0 0x92e0420 0x1 0x0 0x0 0x92e0424 0x1 0x0 0x0 0x92e0430 0x1 0x0 0x0 0x92e0440 0x1 0x0 0x0 0x92e0448 0x1 0x0 0x0 0x92e04a0 0x1 0x0 0x0 0x92e04b0 0x1 0x0 0x0 0x92e04d0 0x2 0x0 0x0 0x9600000 0x1 0x0 0x0 0x9601000 0x1 0x0 0x0 0x9602000 0x1 0x0 0x0 0x9603000 0x1 0x0 0x0 0x9604000 0x1 0x0 0x0 0x9605000 0x1 0x0 0x0 0x9606000 0x1 0x0 0x0 0x9607000 0x1 0x0 0x0 0x9608000 0x1 0x0 0x0 0x9609000 0x1 0x0 0x0 0x960a000 0x1 0x0 0x0 0x960b000 0x1 0x0 0x0 0x960c000 0x1 0x0 0x0 0x960d000 0x1 0x0 0x0 0x960e000 0x1 0x0 0x0 0x960f000 0x1 0x0 0x0 0x9610000 0x1 0x0 0x0 0x9611000 0x1 0x0 0x0 0x9612000 0x1 0x0 0x0 0x9613000 0x1 0x0 0x0 0x9614000 0x1 0x0 0x0 0x9615000 0x1 0x0 0x0 0x9616000 0x1 0x0 0x0 0x9617000 0x1 0x0 0x0 0x9618000 0x1 0x0 0x0 0x9619000 0x1 0x0 0x0 0x961a000 0x1 0x0 0x0 0x961b000 0x1 0x0 0x0 0x961c000 0x1 0x0 0x0 0x961d000 0x1 0x0 0x0 0x961e000 0x1 0x0 0x0 0x961f000 0x1 0x0 0x0 0x9600004 0x1 0x0 0x0 0x9601004 0x1 0x0 0x0 0x9602004 0x1 0x0 0x0 0x9603004 0x1 0x0 0x0 0x9604004 0x1 0x0 0x0 0x9605004 0x1 0x0 0x0 0x9606004 0x1 0x0 0x0 0x9607004 0x1 0x0 0x0 0x9608004 0x1 0x0 0x0 0x9609004 0x1 0x0 0x0 0x960a004 0x1 0x0 0x0 0x960b004 0x1 0x0 0x0 0x960c004 0x1 0x0 0x0 0x960d004 0x1 0x0 0x0 0x960e004 0x1 0x0 0x0 0x960f004 0x1 0x0 0x0 0x9610004 0x1 0x0 0x0 0x9611004 0x1 0x0 0x0 0x9612004 0x1 0x0 0x0 0x9613004 0x1 0x0 0x0 0x9614004 0x1 0x0 0x0 0x9615004 0x1 0x0 0x0 0x9616004 0x1 0x0 0x0 0x9617004 0x1 0x0 0x0 0x9618004 0x1 0x0 0x0 0x9619004 0x1 0x0 0x0 0x961a004 0x1 0x0 0x0 0x961b004 0x1 0x0 0x0 0x961c004 0x1 0x0 0x0 0x961d004 0x1 0x0 0x0 0x961e004 0x1 0x0 0x0 0x961f004 0x1 0x0 0x0 0x9266418 0x1 0x0 0x0 0x92e6418 0x1 0x0 0x0 0x9265804 0x1 0x0 0x0 0x92e5804 0x1 0x0 0x0 0x92604b8 0x1 0x0 0x0 0x92e04b8 0x1 0x0 0x0 0xc201244 0x1 0x0 0x0 0xc202244 0x1 0x0 0x0 0x18100c18 0x1 0x0 0x0 0x18101c18 0x1 0x0 0x0 0x18300000 0x1 0x0 0x0 0x183a3a84 0x2 0x0 0x0 0x18393a84 0x1 0x0 0x0 0x100000 0x1 0x0 0x0 0x100004 0x1 0x0 0x0 0x100008 0x1 0x0 0x0 0x10000c 0x1 0x0 0x0 0x100010 0x1 0x0 0x0 0x100014 0x1 0x0 0x0 0x100018 0x1 0x0 0x0 0x10001c 0x1 0x0 0x0 0x100020 0x1 0x0 0x0 0x100024 0x1 0x0 0x0 0x100028 0x1 0x0 0x0 0x10002c 0x1 0x0 0x0 0x100030 0x1 0x0 0x0 0x100034 0x1 0x0 0x0 0x100100 0x1 0x0 0x0 0x100104 0x1 0x0 0x0 0x100108 0x1 0x0 0x0 0x10010c 0x1 0x0 0x0 0x101000 0x1 0x0 0x0 0x101004 0x1 0x0 0x0 0x101008 0x1 0x0 0x0 0x10100c 0x1 0x0 0x0 0x101010 0x1 0x0 0x0 0x101014 0x1 0x0 0x0 0x101018 0x1 0x0 0x0 0x10101c 0x1 0x0 0x0 0x101020 0x1 0x0 0x0 0x101024 0x1 0x0 0x0 0x101028 0x1 0x0 0x0 0x10102c 0x1 0x0 0x0 0x101030 0x1 0x0 0x0 0x101034 0x1 0x0 0x0 0x102000 0x1 0x0 0x0 0x102004 0x1 0x0 0x0 0x102008 0x1 0x0 0x0 0x10200c 0x1 0x0 0x0 0x102010 0x1 0x0 0x0 0x102014 0x1 0x0 0x0 0x102018 0x1 0x0 0x0 0x10201c 0x1 0x0 0x0 0x102020 0x1 0x0 0x0 0x102024 0x1 0x0 0x0 0x102028 0x1 0x0 0x0 0x10202c 0x1 0x0 0x0 0x102030 0x1 0x0 0x0 0x102034 0x1 0x0 0x0 0x103000 0x1 0x0 0x0 0x103004 0x1 0x0 0x0 0x103008 0x1 0x0 0x0 0x10300c 0x1 0x0 0x0 0x103010 0x1 0x0 0x0 0x103014 0x1 0x0 0x0 0x103018 0x1 0x0 0x0 0x10301c 0x1 0x0 0x0 0x103020 0x1 0x0 0x0 0x103024 0x1 0x0 0x0 0x103028 0x1 0x0 0x0 0x10302c 0x1 0x0 0x0 0x103030 0x1 0x0 0x0 0x103034 0x1 0x0 0x0 0x113000 0x1 0x0 0x0 0x113004 0x1 0x0 0x0 0x113008 0x1 0x0 0x0 0x11300c 0x1 0x0 0x0 0x113010 0x1 0x0 0x0 0x113014 0x1 0x0 0x0 0x113018 0x1 0x0 0x0 0x11301c 0x1 0x0 0x0 0x113020 0x1 0x0 0x0 0x113024 0x1 0x0 0x0 0x113028 0x1 0x0 0x0 0x11302c 0x1 0x0 0x0 0x113030 0x1 0x0 0x0 0x113034 0x1 0x0 0x0 0x11a000 0x1 0x0 0x0 0x11a004 0x1 0x0 0x0 0x11a008 0x1 0x0 0x0 0x11a00c 0x1 0x0 0x0 0x11a010 0x1 0x0 0x0 0x11a014 0x1 0x0 0x0 0x11a018 0x1 0x0 0x0 0x11a01c 0x1 0x0 0x0 0x11a020 0x1 0x0 0x0 0x11a024 0x1 0x0 0x0 0x11a028 0x1 0x0 0x0 0x11a02c 0x1 0x0 0x0 0x11a030 0x1 0x0 0x0 0x11a034 0x1 0x0 0x0 0x11b000 0x1 0x0 0x0 0x11b004 0x1 0x0 0x0 0x11b008 0x1 0x0 0x0 0x11b00c 0x1 0x0 0x0 0x11b010 0x1 0x0 0x0 0x11b014 0x1 0x0 0x0 0x11b018 0x1 0x0 0x0 0x11b01c 0x1 0x0 0x0 0x11b020 0x1 0x0 0x0 0x11b024 0x1 0x0 0x0 0x11b028 0x1 0x0 0x0 0x11b02c 0x1 0x0 0x0 0x11b030 0x1 0x0 0x0 0x11b034 0x1 0x0 0x0 0x174000 0x1 0x0 0x0 0x174004 0x1 0x0 0x0 0x174008 0x1 0x0 0x0 0x17400c 0x1 0x0 0x0 0x174010 0x1 0x0 0x0 0x174014 0x1 0x0 0x0 0x174018 0x1 0x0 0x0 0x17401c 0x1 0x0 0x0 0x174020 0x1 0x0 0x0 0x174024 0x1 0x0 0x0 0x174028 0x1 0x0 0x0 0x17402c 0x1 0x0 0x0 0x174030 0x1 0x0 0x0 0x174034 0x1 0x0 0x0 0x176000 0x1 0x0 0x0 0x176004 0x1 0x0 0x0 0x176008 0x1 0x0 0x0 0x17600c 0x1 0x0 0x0 0x176010 0x1 0x0 0x0 0x176014 0x1 0x0 0x0 0x176018 0x1 0x0 0x0 0x17601c 0x1 0x0 0x0 0x176020 0x1 0x0 0x0 0x176024 0x1 0x0 0x0 0x176028 0x1 0x0 0x0 0x17602c 0x1 0x0 0x0 0x176030 0x1 0x0 0x0 0x176034 0x1 0x0 0x0 0x10401c 0x1 0x0 0x0 0x183024 0x1 0x0 0x0 0x144168 0x1 0x0 0x0 0x11702c 0x1 0x0 0x0 0x10904c 0x1 0x0 0x0 0x189038 0x1 0x0 0x0 0x1443e8 0x1 0x0 0x0 0x1442b8 0x1 0x0 0x0 0x105060 0x1 0x0 0x0 0x141024 0x1 0x0 0x0 0x145038 0x1 0x0 0x0 0x109004 0x1 0x0 0x0 0x189004 0x1 0x0 0x0 0x190004 0x1 0x0 0x0 0xc2a0000 0x1 0x0 0x0 0xc2a0004 0x1 0x0 0x0 0xc2a0008 0x1 0x0 0x0 0xc2a000c 0x1 0x0 0x0 0xc2a0010 0x1 0x0 0x0 0xc2a0014 0x1 0x0 0x0 0xc2a0018 0x1 0x0 0x0 0xc2a001c 0x1 0x0 0x0 0xc2a0020 0x1 0x0 0x0 0xc2a0024 0x1 0x0 0x0 0xc2a0028 0x1 0x0 0x0 0xc2a002c 0x1 0x0 0x0 0xc2a0030 0x1 0x0 0x0 0xc2a0034 0x1 0x0 0x0 0xc2a1000 0x1 0x0 0x0 0xc2a1004 0x1 0x0 0x0 0xc2a1008 0x1 0x0 0x0 0xc2a100c 0x1 0x0 0x0 0xc2a1010 0x1 0x0 0x0 0xc2a1014 0x1 0x0 0x0 0xc2a1018 0x1 0x0 0x0 0xc2a101c 0x1 0x0 0x0 0xc2a1020 0x1 0x0 0x0 0xc2a1024 0x1 0x0 0x0 0xc2a1028 0x1 0x0 0x0 0xc2a102c 0x1 0x0 0x0 0xc2a1030 0x1 0x0 0x0 0xc2a2260 0x1 0x0 0x0 0xc2a2264 0x1 0x0 0x0 0xc2a3008 0x1 0x0 0x0 0xc2a300c 0x1 0x0 0x0 0xc2a3010 0x1 0x0 0x0 0xc2a3014 0x1 0x0 0x0 0xc2a3024 0x1 0x0 0x0 0xc2a2034 0x1 0x0 0x0 0xc2a214c 0x1 0x0 0x0 0xc2a2150 0x1 0x0 0x0 0xc2a2154 0x1 0x0 0x0 0x28206c 0x1 0x0 0x0 0x18282004 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x1808012c 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280004 0x1 0x0 0x0 0x18284038 0x1 0x0 0x0 0x18284000 0x2 0x0 0x0 0x90c012c 0x1 0x0 0x0 0x9222408 0x1 0x0 0x0 0x9220344 0x2 0x0 0x0 0x9220480 0x1 0x0 0x0 0x922358c 0x1 0x0 0x0 0x9222398 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x923201c 0x5 0x0 0x0 0x9232050 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x9186048 0x1 0x0 0x0 0x9186054 0x1 0x0 0x0 0x9186164 0x1 0x0 0x0 0x9186170 0x1 0x0 0x0 0xc2630a0 0x4 0x0 0x0 0xc2630b0 0x4 0x0 0x0 0xc2630c0 0x4 0x0 0x0 0xc2630d0 0x4 0x0 0x0 0x18200400 0x1 0x0 0x0 0x18200404 0x1 0x0 0x0 0x18200408 0x1 0x0 0x0 0x18200038 0x1 0x0 0x0 0x18200040 0x1 0x0 0x0 0x18200048 0x1 0x0 0x0 0x18220038 0x1 0x0 0x0 0x18220040 0x1 0x0 0x0 0x182200d0 0x1 0x0 0x0 0x18200030 0x1 0x0 0x0 0x18200010 0x1 0x0 0x0 0x1822000c 0x1 0x0 0x0 0x18220d14 0x1 0x0 0x0 0x18220fb4 0x1 0x0 0x0 0x18221254 0x1 0x0 0x0 0x182214f4 0x1 0x0 0x0 0x18221794 0x1 0x0 0x0 0x18221a34 0x1 0x0 0x0 0x18221cd4 0x1 0x0 0x0 0x18221f74 0x1 0x0 0x0 0x18220d18 0x1 0x0 0x0 0x18220fb8 0x1 0x0 0x0 0x18221258 0x1 0x0 0x0 0x182214f8 0x1 0x0 0x0 0x18221798 0x1 0x0 0x0 0x18221a38 0x1 0x0 0x0 0x18221cd8 0x1 0x0 0x0 0x18221f78 0x1 0x0 0x0 0x18220d00 0x1 0x0 0x0 0x18220d04 0x1 0x0 0x0 0x18220d1c 0x1 0x0 0x0 0x18220fbc 0x1 0x0 0x0 0x1822125c 0x1 0x0 0x0 0x182214fc 0x1 0x0 0x0 0x1822179c 0x1 0x0 0x0 0x18221a3c 0x1 0x0 0x0 0x18221cdc 0x1 0x0 0x0 0x18221f7c 0x1 0x0 0x0 0x18221274 0x1 0x0 0x0 0x18221288 0x1 0x0 0x0 0x1822129c 0x1 0x0 0x0 0x182212b0 0x1 0x0 0x0 0x182212c4 0x1 0x0 0x0 0x182212d8 0x1 0x0 0x0 0x182212ec 0x1 0x0 0x0 0x18221300 0x1 0x0 0x0 0x18221314 0x1 0x0 0x0 0x18221328 0x1 0x0 0x0 0x1822133c 0x1 0x0 0x0 0x18221350 0x1 0x0 0x0 0x18221364 0x1 0x0 0x0 0x18221378 0x1 0x0 0x0 0x1822138c 0x1 0x0 0x0 0x182213a0 0x1 0x0 0x0 0x18221514 0x1 0x0 0x0 0x18221528 0x1 0x0 0x0 0x1822153c 0x1 0x0 0x0 0x18221550 0x1 0x0 0x0 0x18221564 0x1 0x0 0x0 0x18221578 0x1 0x0 0x0 0x1822158c 0x1 0x0 0x0 0x182215a0 0x1 0x0 0x0 0x182215b4 0x1 0x0 0x0 0x182215c8 0x1 0x0 0x0 0x182215dc 0x1 0x0 0x0 0x182215f0 0x1 0x0 0x0 0x18221604 0x1 0x0 0x0 0x18221618 0x1 0x0 0x0 0x1822162c 0x1 0x0 0x0 0x18221640 0x1 0x0 0x0 0x182217b4 0x1 0x0 0x0 0x182217c8 0x1 0x0 0x0 0x182217dc 0x1 0x0 0x0 0x182217f0 0x1 0x0 0x0 0x18221804 0x1 0x0 0x0 0x18221818 0x1 0x0 0x0 0x1822182c 0x1 0x0 0x0 0x18221840 0x1 0x0 0x0 0x18221854 0x1 0x0 0x0 0x18221868 0x1 0x0 0x0 0x1822187c 0x1 0x0 0x0 0x18221890 0x1 0x0 0x0 0x182218a4 0x1 0x0 0x0 0x182218b8 0x1 0x0 0x0 0x182218cc 0x1 0x0 0x0 0x182218e0 0x1 0x0 0x0 0x18221a54 0x1 0x0 0x0 0x18221a68 0x1 0x0 0x0 0x18221a7c 0x1 0x0 0x0 0x18221a90 0x1 0x0 0x0 0x18221aa4 0x1 0x0 0x0 0x18221ab8 0x1 0x0 0x0 0x18221acc 0x1 0x0 0x0 0x18221ae0 0x1 0x0 0x0 0x18221af4 0x1 0x0 0x0 0x18221b08 0x1 0x0 0x0 0x18221b1c 0x1 0x0 0x0 0x18221b30 0x1 0x0 0x0 0x18221b44 0x1 0x0 0x0 0x18221b58 0x1 0x0 0x0 0x18221b6c 0x1 0x0 0x0 0x18221b80 0x1 0x0 0x0 0x18221cf4 0x1 0x0 0x0 0x18221d08 0x1 0x0 0x0 0x18221d1c 0x1 0x0 0x0 0x18221d30 0x1 0x0 0x0 0x18221d44 0x1 0x0 0x0 0x18221d58 0x1 0x0 0x0 0x18221d6c 0x1 0x0 0x0 0x18221d80 0x1 0x0 0x0 0x18221d94 0x1 0x0 0x0 0x18221da8 0x1 0x0 0x0 0x18221dbc 0x1 0x0 0x0 0x18221dd0 0x1 0x0 0x0 0x18221de4 0x1 0x0 0x0 0x18221df8 0x1 0x0 0x0 0x18221e0c 0x1 0x0 0x0 0x18221e20 0x1 0x0 0x0 0x18221f94 0x1 0x0 0x0 0x18221fa8 0x1 0x0 0x0 0x18221fbc 0x1 0x0 0x0 0x18221fd0 0x1 0x0 0x0 0x18221fe4 0x1 0x0 0x0 0x18221ff8 0x1 0x0 0x0 0x1822200c 0x1 0x0 0x0 0x18222020 0x1 0x0 0x0 0x18222034 0x1 0x0 0x0 0x18222048 0x1 0x0 0x0 0x1822205c 0x1 0x0 0x0 0x18222070 0x1 0x0 0x0 0x18222084 0x1 0x0 0x0 0x18222098 0x1 0x0 0x0 0x182220ac 0x1 0x0 0x0 0x182220c0 0x1 0x0 0x0 0x18221278 0x1 0x0 0x0 0x1822128c 0x1 0x0 0x0 0x182212a0 0x1 0x0 0x0 0x182212b4 0x1 0x0 0x0 0x182212c8 0x1 0x0 0x0 0x182212dc 0x1 0x0 0x0 0x182212f0 0x1 0x0 0x0 0x18221304 0x1 0x0 0x0 0x18221318 0x1 0x0 0x0 0x1822132c 0x1 0x0 0x0 0x18221340 0x1 0x0 0x0 0x18221354 0x1 0x0 0x0 0x18221368 0x1 0x0 0x0 0x1822137c 0x1 0x0 0x0 0x18221390 0x1 0x0 0x0 0x182213a4 0x1 0x0 0x0 0x18221518 0x1 0x0 0x0 0x1822152c 0x1 0x0 0x0 0x18221540 0x1 0x0 0x0 0x18221554 0x1 0x0 0x0 0x18221568 0x1 0x0 0x0 0x1822157c 0x1 0x0 0x0 0x18221590 0x1 0x0 0x0 0x182215a4 0x1 0x0 0x0 0x182215b8 0x1 0x0 0x0 0x182215cc 0x1 0x0 0x0 0x182215e0 0x1 0x0 0x0 0x182215f4 0x1 0x0 0x0 0x18221608 0x1 0x0 0x0 0x1822161c 0x1 0x0 0x0 0x18221630 0x1 0x0 0x0 0x18221644 0x1 0x0 0x0 0x182217b8 0x1 0x0 0x0 0x182217cc 0x1 0x0 0x0 0x182217e0 0x1 0x0 0x0 0x182217f4 0x1 0x0 0x0 0x18221808 0x1 0x0 0x0 0x1822181c 0x1 0x0 0x0 0x18221830 0x1 0x0 0x0 0x18221844 0x1 0x0 0x0 0x18221858 0x1 0x0 0x0 0x1822186c 0x1 0x0 0x0 0x18221880 0x1 0x0 0x0 0x18221894 0x1 0x0 0x0 0x182218a8 0x1 0x0 0x0 0x182218bc 0x1 0x0 0x0 0x182218d0 0x1 0x0 0x0 0x182218e4 0x1 0x0 0x0 0x18221a58 0x1 0x0 0x0 0x18221a6c 0x1 0x0 0x0 0x18221a80 0x1 0x0 0x0 0x18221a94 0x1 0x0 0x0 0x18221aa8 0x1 0x0 0x0 0x18221abc 0x1 0x0 0x0 0x18221ad0 0x1 0x0 0x0 0x18221ae4 0x1 0x0 0x0 0x18221af8 0x1 0x0 0x0 0x18221b0c 0x1 0x0 0x0 0x18221b20 0x1 0x0 0x0 0x18221b34 0x1 0x0 0x0 0x18221b48 0x1 0x0 0x0 0x18221b5c 0x1 0x0 0x0 0x18221b70 0x1 0x0 0x0 0x18221b84 0x1 0x0 0x0 0x18221cf8 0x1 0x0 0x0 0x18221d0c 0x1 0x0 0x0 0x18221d20 0x1 0x0 0x0 0x18221d34 0x1 0x0 0x0 0x18221d48 0x1 0x0 0x0 0x18221d5c 0x1 0x0 0x0 0x18221d70 0x1 0x0 0x0 0x18221d84 0x1 0x0 0x0 0x18221d98 0x1 0x0 0x0 0x18221dac 0x1 0x0 0x0 0x18221dc0 0x1 0x0 0x0 0x18221dd4 0x1 0x0 0x0 0x18221de8 0x1 0x0 0x0 0x18221dfc 0x1 0x0 0x0 0x18221e10 0x1 0x0 0x0 0x18221e24 0x1 0x0 0x0 0x18221f98 0x1 0x0 0x0 0x18221fac 0x1 0x0 0x0 0x18221fc0 0x1 0x0 0x0 0x18221fd4 0x1 0x0 0x0 0x18221fe8 0x1 0x0 0x0 0x18221ffc 0x1 0x0 0x0 0x18222010 0x1 0x0 0x0 0x18222024 0x1 0x0 0x0 0x18222038 0x1 0x0 0x0 0x1822204c 0x1 0x0 0x0 0x18222060 0x1 0x0 0x0 0x18222074 0x1 0x0 0x0 0x18222088 0x1 0x0 0x0 0x1822209c 0x1 0x0 0x0 0x182220b0 0x1 0x0 0x0 0x182220c4 0x1 0x0 0x0 0x105050 0x1 0x0 0x0 0x171004 0x1 0x0 0x0 0x171154 0x1 0x0 0x0 0x17100c 0x1 0x0 0x0 0x171018 0x1 0x0 0x0 0x5091004 0x1 0x0 0x0 0x509100c 0x1 0x0 0x0 0x5091010 0x1 0x0 0x0 0x5091014 0x1 0x0 0x0 0x5091054 0x1 0x0 0x0 0x5091060 0x1 0x0 0x0 0x509106c 0x1 0x0 0x0 0x5091070 0x1 0x0 0x0 0x5091074 0x1 0x0 0x0 0x5091078 0x1 0x0 0x0 0x509107c 0x1 0x0 0x0 0x509108c 0x1 0x0 0x0 0x5091098 0x1 0x0 0x0 0x509109c 0x1 0x0 0x0 0x1800005c 0x1 0x0 0x0 0x1801005c 0x1 0x0 0x0 0x1802005c 0x1 0x0 0x0 0x1803005c 0x1 0x0 0x0 0x1804005c 0x1 0x0 0x0 0x1805005c 0x1 0x0 0x0 0x1806005c 0x1 0x0 0x0 0x1807005c 0x1 0x0 0x0 0x17c0003c 0x1 0x0 0x1 0x6004fb0 0xc5acce55 0x0 0x1 0x600408c 0xff 0x0 0x1 0x6004fb0 0x0 0x0 0x0 0x62900010 0x1 0x0 0x0 0x62900014 0x1 0x0 0x0 0x62900018 0x1 0x0 0x0 0x62900030 0x1 0x0 0x0 0x62900038 0x1 0x0 0x0 0x62900040 0x1 0x0 0x0 0x62900048 0x1 0x0 0x0 0x629000d0 0x1 0x0 0x0 0x62900210 0x1 0x0 0x0 0x62900230 0x1 0x0 0x0 0x62900250 0x1 0x0 0x0 0x62900270 0x1 0x0 0x0 0x62900290 0x1 0x0 0x0 0x629002b0 0x1 0x0 0x0 0x62900208 0x1 0x0 0x0 0x62900228 0x1 0x0 0x0 0x62900248 0x1 0x0 0x0 0x62900268 0x1 0x0 0x0 0x62900288 0x1 0x0 0x0 0x629002a8 0x1 0x0 0x0 0x6290020c 0x1 0x0 0x0 0x6290022c 0x1 0x0 0x0 0x6290024c 0x1 0x0 0x0 0x6290026c 0x1 0x0 0x0 0x6290028c 0x1 0x0 0x0 0x629002ac 0x1 0x0 0x0 0x62900404 0x1 0x0 0x0 0x62900408 0x1 0x0 0x0 0x62900400 0x1 0x0 0x0 0x62900d04 0x1 0x0 0x0 0x624b0010 0x1 0x0 0x0 0x624b0014 0x1 0x0 0x0 0x624b0018 0x1 0x0 0x0 0x624b0210 0x1 0x0 0x0 0x624b0230 0x1 0x0 0x0 0x624b0250 0x1 0x0 0x0 0x624b0270 0x1 0x0 0x0 0x624b0290 0x1 0x0 0x0 0x624b02b0 0x1 0x0 0x0 0x624b0208 0x1 0x0 0x0 0x624b0228 0x1 0x0 0x0 0x624b0248 0x1 0x0 0x0 0x624b0268 0x1 0x0 0x0 0x624b0288 0x1 0x0 0x0 0x624b02a8 0x1 0x0 0x0 0x624b020c 0x1 0x0 0x0 0x624b022c 0x1 0x0 0x0 0x624b024c 0x1 0x0 0x0 0x624b026c 0x1 0x0 0x0 0x624b028c 0x1 0x0 0x0 0x624b02ac 0x1 0x0 0x0 0x624b0400 0x1 0x0 0x0 0x624b0404 0x1 0x0 0x0 0x624b0408 0x1 0x0 0x0 0x62402028 0x1 0x0 0x0 0xb254520 0x1 0x0 0x0 0xb251020 0x1 0x0 0x0 0xb251024 0x1 0x0 0x0 0xb251030 0x1 0x0 0x0 0xb251200 0x1 0x0 0x0 0xb251214 0x1 0x0 0x0 0xb251228 0x1 0x0 0x0 0xb25123c 0x1 0x0 0x0 0xb251250 0x1 0x0 0x0 0xb251204 0x1 0x0 0x0 0xb251218 0x1 0x0 0x0 0xb25122c 0x1 0x0 0x0 0xb251240 0x1 0x0 0x0 0xb251254 0x1 0x0 0x0 0xb251208 0x1 0x0 0x0 0xb25121c 0x1 0x0 0x0 0xb251230 0x1 0x0 0x0 0xb251244 0x1 0x0 0x0 0xb251258 0x1 0x0 0x0 0xb254510 0x1 0x0 0x0 0xb254514 0x1 0x0 0x0 0xb250010 0x1 0x0 0x0 0xb250014 0x1 0x0 0x0 0xb250900 0x1 0x0 0x0 0xb250904 0x1 0x0 0x0 0x4200010 0x1 0x0 0x0 0x4200014 0x1 0x0 0x0 0x4200018 0x1 0x0 0x0 0x4200030 0x1 0x0 0x0 0x4200038 0x1 0x0 0x0 0x4200040 0x1 0x0 0x0 0x4200048 0x1 0x0 0x0 0x42000d0 0x1 0x0 0x0 0x4200210 0x1 0x0 0x0 0x4200230 0x1 0x0 0x0 0x4200250 0x1 0x0 0x0 0x4200270 0x1 0x0 0x0 0x4200290 0x1 0x0 0x0 0x42002b0 0x1 0x0 0x0 0x4200208 0x1 0x0 0x0 0x4200228 0x1 0x0 0x0 0x4200248 0x1 0x0 0x0 0x4200268 0x1 0x0 0x0 0x4200288 0x1 0x0 0x0 0x42002a8 0x1 0x0 0x0 0x420020c 0x1 0x0 0x0 0x420022c 0x1 0x0 0x0 0x420024c 0x1 0x0 0x0 0x420026c 0x1 0x0 0x0 0x420028c 0x1 0x0 0x0 0x42002ac 0x1 0x0 0x0 0x4200404 0x1 0x0 0x0 0x4200408 0x1 0x0 0x0 0x4200400 0x1 0x0 0x0 0x4200d04 0x1 0x0 0x0 0x4130010 0x1 0x0 0x0 0x4130014 0x1 0x0 0x0 0x4130018 0x1 0x0 0x0 0x4130210 0x1 0x0 0x0 0x4130230 0x1 0x0 0x0 0x4130250 0x1 0x0 0x0 0x4130270 0x1 0x0 0x0 0x4130290 0x1 0x0 0x0 0x41302b0 0x1 0x0 0x0 0x4130208 0x1 0x0 0x0 0x4130228 0x1 0x0 0x0 0x4130248 0x1 0x0 0x0 0x4130268 0x1 0x0 0x0 0x4130288 0x1 0x0 0x0 0x41302a8 0x1 0x0 0x0 0x413020c 0x1 0x0 0x0 0x413022c 0x1 0x0 0x0 0x413024c 0x1 0x0 0x0 0x413026c 0x1 0x0 0x0 0x413028c 0x1 0x0 0x0 0x41302ac 0x1 0x0 0x0 0x4130400 0x1 0x0 0x0 0x4130404 0x1 0x0 0x0 0x4130408 0x1 0x0 0x0 0x4082028 0x1 0x0 0x0 0x18a008 0x1 0x0 0x0 0xb2c4520 0x1 0x0 0x0 0xb2c1020 0x1 0x0 0x0 0xb2c1024 0x1 0x0 0x0 0xb2c1030 0x1 0x0 0x0 0xb2c1200 0x1 0x0 0x0 0xb2c1214 0x1 0x0 0x0 0xb2c1228 0x1 0x0 0x0 0xb2c123c 0x1 0x0 0x0 0xb2c1250 0x1 0x0 0x0 0xb2c1204 0x1 0x0 0x0 0xb2c1218 0x1 0x0 0x0 0xb2c122c 0x1 0x0 0x0 0xb2c1240 0x1 0x0 0x0 0xb2c1254 0x1 0x0 0x0 0xb2c1208 0x1 0x0 0x0 0xb2c121c 0x1 0x0 0x0 0xb2c1230 0x1 0x0 0x0 0xb2c1244 0x1 0x0 0x0 0xb2c1258 0x1 0x0 0x0 0xb2c4510 0x1 0x0 0x0 0xb2c4514 0x1 0x0 0x0 0xb2c0010 0x1 0x0 0x0 0xb2c0014 0x1 0x0 0x0 0xb2c0900 0x1 0x0 0x0 0xb2c0904 0x1 0x0 0x0 0x80a4010 0x1 0x0 0x0 0x80a4014 0x1 0x0 0x0 0x80a4018 0x1 0x0 0x0 0x80a4030 0x1 0x0 0x0 0x80a4038 0x1 0x0 0x0 0x80a4040 0x1 0x0 0x0 0x80a4048 0x1 0x0 0x0 0x80a40d0 0x1 0x0 0x0 0x80a4210 0x1 0x0 0x0 0x80a4230 0x1 0x0 0x0 0x80a4250 0x1 0x0 0x0 0x80a4270 0x1 0x0 0x0 0x80a4290 0x1 0x0 0x0 0x80a42b0 0x1 0x0 0x0 0x80a4208 0x1 0x0 0x0 0x80a4228 0x1 0x0 0x0 0x80a4248 0x1 0x0 0x0 0x80a4268 0x1 0x0 0x0 0x80a4288 0x1 0x0 0x0 0x80a42a8 0x1 0x0 0x0 0x80a420c 0x1 0x0 0x0 0x80a422c 0x1 0x0 0x0 0x80a424c 0x1 0x0 0x0 0x80a426c 0x1 0x0 0x0 0x80a428c 0x1 0x0 0x0 0x80a42ac 0x1 0x0 0x0 0x80a4404 0x1 0x0 0x0 0x80a4408 0x1 0x0 0x0 0x80a4400 0x1 0x0 0x0 0x80a4d04 0x1 0x0 0x0 0x83b0010 0x1 0x0 0x0 0x83b0014 0x1 0x0 0x0 0x83b0018 0x1 0x0 0x0 0x83b0210 0x1 0x0 0x0 0x83b0230 0x1 0x0 0x0 0x83b0250 0x1 0x0 0x0 0x83b0270 0x1 0x0 0x0 0x83b0290 0x1 0x0 0x0 0x83b02b0 0x1 0x0 0x0 0x83b0208 0x1 0x0 0x0 0x83b0228 0x1 0x0 0x0 0x83b0248 0x1 0x0 0x0 0x83b0268 0x1 0x0 0x0 0x83b0288 0x1 0x0 0x0 0x83b02a8 0x1 0x0 0x0 0x83b020c 0x1 0x0 0x0 0x83b022c 0x1 0x0 0x0 0x83b024c 0x1 0x0 0x0 0x83b026c 0x1 0x0 0x0 0x83b028c 0x1 0x0 0x0 0x83b02ac 0x1 0x0 0x0 0x83b0400 0x1 0x0 0x0 0x83b0404 0x1 0x0 0x0 0x83b0408 0x1 0x0 0x0 0x8302028 0x1 0x0 0x0 0xb2b4520 0x1 0x0 0x0 0xb2b1020 0x1 0x0 0x0 0xb2b1024 0x1 0x0 0x0 0xb2b1030 0x1 0x0 0x0 0xb2b1200 0x1 0x0 0x0 0xb2b1214 0x1 0x0 0x0 0xb2b1228 0x1 0x0 0x0 0xb2b123c 0x1 0x0 0x0 0xb2b1250 0x1 0x0 0x0 0xb2b1204 0x1 0x0 0x0 0xb2b1218 0x1 0x0 0x0 0xb2b122c 0x1 0x0 0x0 0xb2b1240 0x1 0x0 0x0 0xb2b1254 0x1 0x0 0x0 0xb2b1208 0x1 0x0 0x0 0xb2b121c 0x1 0x0 0x0 0xb2b1230 0x1 0x0 0x0 0xb2b1244 0x1 0x0 0x0 0xb2b1258 0x1 0x0 0x0 0xb2b4510 0x1 0x0 0x0 0xb2b4514 0x1 0x0 0x0 0xb2b0010 0x1 0x0 0x0 0xb2b0014 0x1 0x0 0x0 0xb2b0900 0x1 0x0 0x0 0xb2b0904 0x1 0x0 0x0 0x17a00204 0x1d 0x0>; + }; + }; + }; + + fragment@37 { + target = <0xffffffff>; + + __overlay__ { + + ss_plog@B4400000 { + compatible = "ss_plog"; + no-map; + reg = <0x0 0xb4400000 0x0 0x200000>; + }; + + ramoops@B4600000 { + compatible = "ramoops"; + reg = <0x0 0xb4600000 0x0 0x100000>; + record-size = <0x40000>; + console-size = <0x40000>; + ftrace-size = <0x40000>; + pmsg-size = <0x40000>; + }; + + sec_debug_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4700000 0x0 0x800000>; + phandle = <0xbc>; + }; + + sec_debug_autocomment@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4f00000 0x0 0x1000>; + phandle = <0xbd>; + }; + + sec_debug_rdx_bootdev@0 { + no-ship; + reg = <0x1 0x0 0x0 0x5900000>; + phandle = <0xbe>; + }; + + kaslr_region@A0001000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xa0001000 0x0 0x1000>; + phandle = <0xbf>; + }; + + rkp_region@B0200000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xb0200000 0x0 0x200000>; + phandle = <0xc0>; + }; + + hdm_region@A1000000 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xa1000000 0x0 0x1000>; + phandle = <0x54>; + }; + + modem_shared_mem_region@B5000000 { + compatible = "modem-removed-dma-pool"; + no-map; + reg = <0x0 0xb5000000 0x0 0x6000000>; + phandle = <0x53>; + }; + }; + }; + + fragment@38 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x80b00000 0x0 0x7100000>; + }; + }; + + fragment@39 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x8b000000 0x0 0x8900000>; + }; + }; + + fragment@40 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x93c00000 0x0 0x3e00000>; + }; + }; + + fragment@41 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97a00000 0x0 0x500000>; + }; + }; + + fragment@42 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97f00000 0x0 0x500000>; + }; + }; + + fragment@43 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98400000 0x0 0x500000>; + }; + }; + + fragment@44 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98900000 0x0 0x1e00000>; + }; + }; + + fragment@45 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9e000000 0x0 0x2000000>; + }; + }; + + fragment@46 { + target = <0xffffffff>; + + __overlay__ { + size = <0x0 0x2000000>; + }; + }; + + fragment@47 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@48 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@49 { + target = <0xffffffff>; + + __overlay__ { + + upload_cause@66c { + compatible = "qcom,msm-imem-upload_cause"; + reg = <0x66c 0x4>; + }; + }; + }; + + fragment@50 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@51 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@52 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@53 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@54 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@55 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@56 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@57 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@58 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@59 { + target = <0xffffffff>; + + __overlay__ { + + dwc3@a600000 { + maximum-speed = "high-speed"; + }; + }; + }; + + fragment@60 { + target = <0xffffffff>; + + __overlay__ { + + input_booster { + status = "okay"; + compatible = "input_booster"; + #address-cells = <0x1>; + #size-cells = <0x0>; + + booster_key@1 { + input_booster,label = "KEY"; + input_booster,type = <0x0>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0xc8>; + input_booster,tail_times = <0x0>; + }; + + booster_key@2 { + input_booster,label = "TOUCHKEY"; + input_booster,type = <0x1>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x0>; + input_booster,tail_times = <0x12c>; + }; + + booster_key@3 { + input_booster,label = "TOUCH"; + input_booster,type = <0x2>; + input_booster,levels = <0x1 0x2 0x3>; + input_booster,cpu_freqs = <0x135600 0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2 0x2>; + input_booster,ddr_freqs = <0x3f9 0x3f9 0x3f9>; + input_booster,lpm_bias = <0x5 0x5 0x5>; + input_booster,head_times = <0xc8 0xc8 0x0>; + input_booster,tail_times = <0x0 0x0 0x12c>; + }; + + booster_key@4 { + input_booster,label = "MULTITOUCH"; + input_booster,type = <0x3>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x3e8 0x0>; + input_booster,tail_times = <0x0 0x1f4>; + }; + + booster_key@5 { + input_booster,label = "KEYBOARD"; + input_booster,type = <0x4>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x135600>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x82 0x82>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@6 { + input_booster,label = "MOUSE"; + input_booster,type = <0x5>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@7 { + input_booster,label = "MOUSE WHEEL"; + input_booster,type = <0x6>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@8 { + input_booster,label = "PEN HOVER"; + input_booster,type = <0x7>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@9 { + input_booster,label = "PEN"; + input_booster,type = <0x8>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x17bb00 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x258>; + }; + + booster_key@10 { + input_booster,label = "KEY_TWO"; + input_booster,type = <0x9>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x17bb00>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x2bc>; + input_booster,tail_times = <0x2bc>; + }; + }; + + sec_smem@0 { + compatible = "samsung,sec-smem"; + status = "okay"; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_4 { + compatible = "qcom,memshare-peripheral"; + memory-region = <0x53>; + qcom,peripheral-size = <0x2000000>; + qcom,reserved-size = <0x4000000>; + qcom,client-id = <0x3>; + qcom,allocate-boot-time; + label = "modem"; + }; + }; + + samsung,sec_misc { + qfprom_jtag,reg = <0x780180>; + }; + + usb-notifier { + compatible = "samsung,usb-notifier"; + qcom,disable_control_en = <0x1>; + qcom,unsupport_host_en = <0x0>; + phandle = <0xc1>; + }; + + samsung,sec_hdm { + memory-region = <0x54>; + }; + + argos { + compatible = "samsung,argos"; + #address-cells = <0x1>; + + boot_device@1 { + net_boost,label = "WIFI"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@2 { + net_boost,label = "WIFI TX"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0xc8 0x21b100 0x0 0x1b8a00 0x0 0x0 0x0 0x1 0x1 0x1>; + }; + + boot_device@3 { + net_boost,label = "WIFI RX"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@4 { + net_boost,label = "SWLAN"; + net_boost,node = "swlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@5 { + net_boost,label = "P2P"; + net_boost,node = "p2p-wlan0-0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@6 { + net_boost,label = "IPA"; + net_boost,node = "rmnet_ipa0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + }; + }; + }; + + fragment@61 { + target = <0xffffffff>; + + __overlay__ { + + android { + + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_system,recovery,dtbo,abl,xbl,tz,hyp"; + }; + }; + }; + }; + + fragment@62 { + target = <0xffffffff>; + + __overlay__ { + qcom,smem-states = <0xffffffff 0x0 0xffffffff 0x4 0xffffffff 0x5>; + qcom,smem-state-names = "qcom,force-stop", "qcom,stop-reason-0", "qcom,stop-reason-1"; + }; + }; + + fragment@63 { + target = <0xffffffff>; + + __overlay__ { + spm-level = <0x3>; + }; + }; + + fragment@64 { + target = <0xffffffff>; + + __overlay__ { + i2c18 = "/soc/i2c@18"; + }; + }; + + fragment@65 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x3>; + + imp_list { + #list-imp-cells = <0x3>; + phandle = <0x26>; + }; + }; + }; + + fragment@66 { + target = <0xffffffff>; + + __overlay__ { + + msm_cdc_pinctrl_quin { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x55 0x56 0x57 0x58>; + pinctrl-1 = <0x59 0x5a 0x5b 0x5c>; + qcom,lpi-gpios; + phandle = <0x60>; + }; + }; + }; + + fragment@67 { + target = <0xffffffff>; + + __overlay__ { + + sec-audio-sysfs { + compatible = "samsung,audio-sysfs"; + status = "okay"; + audio,num-amp = <0x2>; + }; + + samsung,q6audio-adaptation { + compatible = "samsung,q6audio-adaptation"; + adaptation,device-tx-port-id = <0xb037>; + adaptation,spk-rx-port-id = <0x1016>; + adaptation,usb-rx-port-id = <0x7000>; + adaptation,bt-rx-port-id = <0x400e>; + adaptation,headset-rx-port-id = <0xb030>; + phandle = <0x5f>; + }; + + det_zones { + #list-det-cells = <0x2>; + phandle = <0x25>; + }; + + i2c@18 { + status = "ok"; + cell-index = <0x12>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x58 0x0 0xffffffff 0x59 0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x5d 0x5e>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xc2>; + + tas256x@4c { + #sound-dai-cells = <0x0>; + compatible = "ti, tas256x"; + status = "ok"; + reg = <0x4c>; + ti,reset-gpio = <0xffffffff 0x5e 0x0>; + ti,irq-gpio = <0xffffffff 0x5a 0x0>; + ti,left-channel = <0x4d>; + ti,right-channel = <0x4c>; + ti,channels = <0x2>; + ti,iv-width = <0x8>; + ti,vbat-mon = <0x1>; + ti,port_id = <0x1016>; + phandle = <0xc3>; + }; + }; + }; + }; + + fragment@68 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,wcn-btfm = <0x1>; + qcom,ext-disp-audio-rx = <0x0>; + qcom,mi2s-audio-intf = <0x1>; + asoc-platform = <0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0x5f>; + asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-pcm-dsp.2", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-compress-dsp", "msm-pcm-hostless", "msm-pcm-afe", "msm-lsm-client", "msm-pcm-routing", "msm-compr-dsp", "msm-pcm-dsp-noirq", "q6audio-adaptation"; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS3", "MIC BIAS3", "Analog Mic4", "AMIC5", "MIC BIAS4", "MIC BIAS4", "Analog Mic5", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT"; + qcom,msm-mbhc-hs-mic-max-threshold-mv = <0x270f>; + qcom,msm-mbhc-hs-mic-min-threshold-mv = <0x280>; + qcom,cdc-dmic01-gpios; + qcom,cdc-dmic23-gpios; + qcom,cdc-dmic45-gpios; + qcom,quin-mi2s-gpios = <0x60>; + asoc-codec = <0xffffffff 0xffffffff>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec"; + qcom,wsa-max-devs = <0x0>; + qcom,wsa-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x32 0xffffffff>; + fsa4480-i2c-handle; + qcom,fm-lna-gpios = <0xffffffff 0x54 0x0>; + qcom,msm-mbhc-gnd-det = <0x1>; + }; + }; + + fragment@69 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@70 { + target = <0xffffffff>; + + __overlay__ { + + tas25xx_gpio_default { + phandle = <0x5d>; + + mux { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + function = "gpio"; + }; + + config { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + bias-disable; + }; + }; + + fm_lna_default { + phandle = <0x5e>; + + mux { + pins = "gpio84"; + function = "gpio"; + }; + + config { + pins = "gpio84"; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@71 { + target = <0xffffffff>; + + __overlay__ { + + grip_i2c { + + grip_i2c_active { + phandle = <0xa9>; + + grip_i2c_active { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + + grip_i2c_suspend { + phandle = <0xc4>; + + grip_i2c_suspend { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + }; + + s2mpb03_i2c_sda_default { + phandle = <0x61>; + + mux { + pins = "gpio25"; + function = "gpio"; + }; + + config { + pins = "gpio25"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + s2mpb03_i2c_scl_default { + phandle = <0x62>; + + mux { + pins = "gpio26"; + function = "gpio"; + }; + + config { + pins = "gpio26"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + cam_sensor_mclk0_active { + phandle = <0x7d>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk0_suspend { + phandle = <0x80>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk1_active { + phandle = <0x96>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk1_suspend { + phandle = <0x98>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk2_active { + phandle = <0x8d>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk2_suspend { + phandle = <0x90>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk3_active { + phandle = <0x84>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk3_suspend { + phandle = <0x88>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk4_active { + phandle = <0x9c>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk4_suspend { + phandle = <0x9f>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + rcam1_sensor_reset_active { + phandle = <0x7e>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_reset_suspend { + phandle = <0x81>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_active { + phandle = <0x97>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_suspend { + phandle = <0x99>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_active { + phandle = <0x85>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_suspend { + phandle = <0x89>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_active { + phandle = <0x8e>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_suspend { + phandle = <0x91>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_active { + phandle = <0x9d>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_suspend { + phandle = <0xa0>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_active { + phandle = <0x6f>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_suspend { + phandle = <0x70>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_active { + phandle = <0x8f>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_suspend { + phandle = <0x92>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_active { + phandle = <0x86>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_suspend { + phandle = <0x8a>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_active { + phandle = <0x9e>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_suspend { + phandle = <0xa1>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_active { + phandle = <0x87>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-disable; + output-high; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_suspend { + phandle = <0x8b>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vdig_active { + phandle = <0xc5>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vdig_suspend { + phandle = <0xc6>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_active { + phandle = <0xc7>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_suspend { + phandle = <0xc8>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + if_pmic_i2c_pins { + phandle = <0xc9>; + + if_pmic_i2c_sleep { + phandle = <0x68>; + + mux { + pins = "gpio115", "gpio116"; + function = "gpio"; + }; + + config { + pins = "gpio115", "gpio116"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + usbpd_i2c_pins { + phandle = <0xca>; + + usbpd_i2c_sleep { + phandle = <0x6a>; + + mux { + pins = "gpio53", "gpio54"; + function = "gpio"; + }; + + config { + pins = "gpio53", "gpio54"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + mcu_reset_active { + phandle = <0x72>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_reset_suspend { + phandle = <0x74>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + mcu_clk_active { + phandle = <0x73>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_clk_suspend { + phandle = <0x75>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + torch_en_active { + phandle = <0x7f>; + + mux { + pins = "gpio67", "gpio22"; + function = "gpio"; + }; + + config { + pins = "gpio67", "gpio22"; + bias-pull-down; + output-high; + drive-strength = <0x2>; + }; + }; + + torch_en_suspend { + phandle = <0x82>; + + mux { + pins = "gpio67", "gpio22"; + function = "gpio"; + }; + + config { + pins = "gpio67", "gpio22"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + }; + }; + + fragment@72 { + target = <0xffffffff>; + + __overlay__ { + + grip_int_active { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xaa>; + }; + + grip_int_suspend { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xcb>; + }; + }; + }; + + fragment@73 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x48 0x4a 0x4e 0x54 0x56 0x57 0x5b 0x5d 0x5f 0x62 0x6d 0x72 0x73 0x74 0x75 0x76>; + }; + }; + + fragment@74 { + target = <0xffffffff>; + + __overlay__ { + + qcom,pm6150@0 { + + qcom,power-on@800 { + interrupts = <0x0 0x8 0x0 0x0 0x0 0x8 0x1 0x0 0x0 0x8 0x4 0x0 0x0 0x8 0x5 0x0>; + interrupt-names = "kpdpwr", "resin", "resin-bark", "kpdpwr-resin-bark"; + qcom,s3-debounce = <0x80>; + + qcom,pon_1 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_2 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_3 { + qcom,pon-type = <0x3>; + qcom,support-reset = <0x1>; + qcom,pull-up = <0x1>; + qcom,s1-timer = <0x1a40>; + qcom,s2-timer = <0x3e8>; + qcom,s2-type = <0x8>; + qcom,use-bark; + }; + }; + }; + }; + }; + + fragment@75 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@76 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@77 { + target = <0xffffffff>; + + __overlay__ { + + sec_thermistor@0 { + compatible = "samsung,sec-ap-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "ap_therm"; + adc_array = <0x6a4 0x88e 0xa10 0xbe6 0xdff 0x1090 0x1381 0x16f4 0x1b1c 0x1fb9 0x247b 0x2a3c 0x309d 0x3706 0x3d9d 0x43e8 0x4aa6 0x50c4 0x564a 0x5b4e 0x5faf 0x6379 0x66aa>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@1 { + compatible = "samsung,sec-pa-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "pa_therm"; + adc_array = <0x708 0x8bf 0xa47 0xc19 0xe38 0x10c2 0x13c0 0x173d 0x1b5e 0x1fff 0x24cf 0x2a88 0x30de 0x3756 0x3dea 0x443d 0x4add 0x5100 0x5683 0x5b96 0x5fef 0x63ab 0x66d8>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@2 { + compatible = "samsung,sec-wf-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4f>; + io-channel-names = "wf_therm"; + adc_array = <0x708 0x8d5 0xa66 0xc35 0xe55 0x10d4 0x13e0 0x1766 0x1b81 0x2021 0x24f3 0x2aa3 0x30f4 0x376c 0x3e09 0x445e 0x4aec 0x5105 0x568c 0x5ba3 0x5ff9 0x63b4 0x66e0>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + i2c@2 { + cell-index = <0x2>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x19 0x0 0xffffffff 0x1a 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x61 0x62>; + phandle = <0xcc>; + + s2mpb03@56 { + compatible = "samsung,s2mpb03pmic"; + reg = <0x56>; + additional_reg_init; + + regulators { + + s2mpb03-ldo1 { + regulator-name = "s2mpb03-ldo1"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x100590>; + phandle = <0x95>; + }; + + s2mpb03-ldo2 { + regulator-name = "s2mpb03-ldo2"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x7c>; + }; + + s2mpb03-ldo3 { + regulator-name = "s2mpb03-ldo3"; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x7a>; + }; + + s2mpb03-ldo4 { + regulator-name = "s2mpb03-ldo4"; + regulator-min-microvolt = <0x124f80>; + regulator-max-microvolt = <0x124f80>; + phandle = <0x8c>; + }; + + s2mpb03-ldo5 { + regulator-name = "s2mpb03-ldo5"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x7b>; + }; + + s2mpb03-ldo6 { + regulator-name = "s2mpb03-ldo6"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x94>; + }; + + s2mpb03-ldo7 { + regulator-name = "s2mpb03-ldo7"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2ab980>; + phandle = <0x71>; + }; + }; + }; + }; + }; + }; + + fragment@78 { + target = <0xffffffff>; + + __overlay__ { + interrupts = <0x0 0xc0 0x0 0x0 0x0 0xc1 0x0 0x0 0x0 0xc2 0x0 0x0 0x0 0xc3 0x0 0x0 0x0 0xc4 0x0 0x0 0x0 0xc6 0x0 0x0 0x0 0xc7 0x0 0x0 0x0 0xc9 0x0 0x0>; + interrupt-names = "pm6150_gpio1", "pm6150_gpio2", "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio5", "pm6150_gpio7", "pm6150_gpio8", "pm6150_gpio10"; + qcom,gpios-disallowed = <0x6 0x9>; + }; + }; + + fragment@79 { + target = <0xffffffff>; + + __overlay__ { + + ap_therm { + reg = <0x4e>; + label = "ap_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@80 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm { + reg = <0x4e>; + label = "pa_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + + wf_therm { + reg = <0x4f>; + label = "wf_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@81 { + target = <0xffffffff>; + + __overlay__ { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x2dc6c0>; + regulator-boot-on; + }; + }; + + fragment@82 { + target = <0xffffffff>; + + __overlay__ { + + tsp_int { + phandle = <0x65>; + + mux { + pins = "gpio9"; + function = "gpio"; + }; + + config { + pins = "gpio9"; + input-enable; + bias-disable; + }; + }; + + qupv3_se7_i2c_pins_tsp { + phandle = <0xcd>; + + qupv3_se7_i2c_active_tsp { + phandle = <0x63>; + + mux { + pins = "gpio6", "gpio7"; + function = "qup11"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + qupv3_se7_i2c_sleep_tsp { + phandle = <0x64>; + + mux { + pins = "gpio6", "gpio7"; + function = "gpio"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <0x2>; + bias-disable; + }; + }; + }; + }; + }; + + fragment@83 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x63>; + pinctrl-1 = <0x64>; + + synaptics_tcm@20 { + status = "disabled"; + }; + + atmel_mxt_ts@4a { + status = "disabled"; + }; + + touchscreen@20 { + status = "disabled"; + compatible = "zinitix,zt_ts_device"; + reg = <0x20>; + pinctrl-names = "on_state", "off_state"; + pinctrl-0 = <0x65>; + pinctrl-1 = <0x65>; + avdd-supply = <0xffffffff>; + zinitix,gpio_ldo_en; + zinitix,irq_type = <0x2008>; + zinitix,x_resolution = <0x438>; + zinitix,y_resolution = <0x960>; + zinitix,page_size = <0x80>; + zinitix,irq_gpio = <0xffffffff 0x9 0x2008>; + zinitix,chip_name = "ZT7650"; + zinitix,firmware_name = "tsp_zinitix/zt7650_a52.bin"; + zinitix,spay; + zinitix,aod; + zinitix,aot; + zinitix,mis_cal_check; + support_ear_detect_mode; + support_dex_mode; + zinitix,bringup = <0x0>; + zinitix,ss_touch_num = <0x1>; + phandle = <0xce>; + }; + + touchscreen@49 { + status = "okay"; + compatible = "stm,fts_touch"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x65>; + dvdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + stm,irq_gpio = <0xffffffff 0x9 0x2008>; + stm,max_coords = <0xfff 0xfff>; + stm,firmware_name = "tsp_stm/fts5cu56a_a52.bin"; + stm,tclm_level = <0x2>; + stm,afe_base = <0x14>; + stm,bringup = <0x0>; + stm,support_fod; + stm,enable_settings_aot; + support_ear_detect; + support_mis_calibration_test; + support_dex_mode; + support_open_short_test; + support_sram_test; + stm,ss_touch_num = <0x1>; + phandle = <0xcf>; + }; + }; + }; + + fragment@84 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + + key_vol_up_default { + pins = "gpio8"; + function = "normal"; + input-enable; + bias-pull-up; + power-source = <0x0>; + phandle = <0x66>; + }; + }; + }; + }; + + fragment@85 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "default"; + pinctrl-0 = <0x66>; + + vol_up { + label = "volume_up"; + gpios = <0xffffffff 0x8 0x1>; + linux,input-type = <0x1>; + linux,code = <0x73>; + debounce-interval = <0xf>; + }; + }; + }; + + fragment@86 { + target = <0xffffffff>; + + __overlay__ { + + ss_touch { + compatible = "samsung,ss_touch"; + ss_touch,numbers = <0x1>; + }; + }; + }; + + fragment@87 { + target = <0xffffffff>; + + __overlay__ { + + self_display_FC3_dtsi { + label = "self_display_FC3_dtsi"; + samsung,support_self_display; + samsung,self_mask_setting_pre_revA = [29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 02 75 10]; + samsung,self_mask_setting_post_revA = [29 01 00 00 00 00 02 75 00]; + samsung,self_mask_on_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 00 00 00 95 07 9e 09 5f 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_on_factory_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_off_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_disp_debug_rx_cmds_revA = [06 01 00 00 00 00 01 7f 04 01]; + samsung,self_mask_check_tx_pre1_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 04 b0 00 27 d8 29 01 00 00 00 00 02 d8 16 29 01 00 00 00 00 0a bf 01 07 00 00 00 10 00 00 00 29 01 00 00 11 00 02 7a 00 29 01 00 00 00 00 02 75 10 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,self_mask_check_tx_pre2_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 02 75 00 29 01 00 00 22 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 01 f4 02 33 09 60 09 61 00 00 ff ff ff 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,mask_crc_pass_data = [d3 9b]; + samsung,self_mask_check_rx_cmds_revA = [06 01 00 00 00 00 01 14 02 00]; + samsung,self_mask_check_tx_post_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 00 00 00 00 00 29 01 00 00 00 00 02 bf 00 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + phandle = <0x67>; + }; + }; + }; + + fragment@88 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + label = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0x1e6>; + qcom,mdss-brightness-max-level = <0x1e6>; + qcom,mdss-brightness-default-level = <0xff>; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-t-clk-pre = <0x3e>; + qcom,mdss-dsi-t-clk-post = <0x10>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x43>; + qcom,mdss-pan-physical-height-dimension = <0x96>; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-t-clk-pre-extend; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "irq_check"; + samsung,panel-vendor = "SDC"; + samsung,disp-model = "AMS646YD01"; + samsung,support_gamma_mode2; + samsung,skip_read_on_pre; + samsung,elvss_interpolation_temperature = <0xfffffff0>; + samsung,support_lpm; + samsung,support_gpara; + samsung,pointing_gpara; + samsung,two_byte_gpara; + samsung,rsc_4_frame_idle; + samsung,support_factory_panel_swap; + samsung,support-optical-fingerprint; + samsung,delayed-display-on = <0x1>; + samsung,support_vrr_based_bl; + samsung,esd-irq-trigger1 = "falling"; + ss,self_display = <0x67>; + samsung,level0_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 9f a5 a5]; + samsung,level0_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 9f 5a 5a]; + samsung,level1_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 5a 5a]; + samsung,level1_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 a5 a5]; + samsung,level2_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 fc 5a 5a]; + samsung,level2_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 fc a5 a5]; + samsung,brightness_tx_cmds_revA = <0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100>; + samsung,display_on_tx_cmds_revA = [29 00 00 00 00 00 03 9f a5 a5 05 00 00 00 00 00 02 29 00 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,display_off_tx_cmds_revA = [05 01 00 00 00 00 02 28 00]; + samsung,reg_read_pos_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 00 00]; + samsung,mtp_write_sysfs_tx_cmds_revA = <0x29000000 0x3d00 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + samsung,panel_ltps_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 50 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,smooth_dimming_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 91 63 29 00 00 00 00 00 02 63 20 29 01 00 00 11 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,gamma_mode2_normal_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26360 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x7290000 0x2 0x53202900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0002900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revE = <0x29000000 0x391 0x2012900 0x0 0x2532029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 1c 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,gamma_mode2_hbm_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26320 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x290000 0x2 0x53e02900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0072900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revE = <0x29000000 0x391 0x2002900 0x0 0x253e029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 14 29 00 00 00 00 00 02 53 e0 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,vrr_tx_cmds_revD = [29 00 00 00 00 00 03 60 00 04 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 b4 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a c0 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 02 29 00 00 00 00 00 02 f7 0f]; + samsung,vrr_tx_cmds_revA = [29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f]; + samsung,acl_on_tx_cmds_revA = [29 00 00 00 00 00 04 b0 03 b3 65 29 00 00 00 00 00 14 65 55 00 b0 51 66 98 15 55 55 55 08 f1 c6 48 40 00 20 10 09 29 00 00 00 00 00 02 55 03]; + samsung,acl_off_tx_cmds_revA = [29 01 00 00 00 00 02 55 00]; + samsung,manufacture_id0_rx_cmds_revA = [06 01 00 00 00 00 01 da 01 00 00]; + samsung,manufacture_id1_rx_cmds_revA = [06 01 00 00 00 00 01 db 01 00 00]; + samsung,manufacture_id2_rx_cmds_revA = [06 01 00 00 00 00 01 dc 01 00 00]; + samsung,module_info_rx_cmds_revA = [06 01 00 00 00 00 01 a1 0b 00 00]; + samsung,octa_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 04 00 0b]; + samsung,cell_id_rx_cmds_revA = [06 01 00 00 00 00 01 92 10 00 02]; + samsung,ddi_id_rx_cmds_revA = [06 01 00 00 00 00 01 d6 05 00 00]; + samsung,mtp_read_sysfs_rx_cmds_revA = [06 01 00 00 00 00 01 00 00 00 00]; + samsung,candela_map_table_revA = <0x0 0x0 0x0 0x2 0x2 0x1 0x1 0x1 0x3 0x2 0x2 0x2 0x2 0x4 0x3 0x3 0x3 0x3 0x5 0x3 0x4 0x4 0x4 0x7 0x4 0x5 0x5 0x5 0x8 0x5 0x6 0x6 0x6 0xa 0x5 0x7 0x7 0x7 0xc 0x6 0x8 0x8 0x8 0xd 0x7 0x9 0x9 0x9 0xf 0x7 0xa 0xa 0xa 0x11 0x8 0xb 0xb 0xb 0x13 0x9 0xc 0xc 0xc 0x15 0xa 0xd 0xd 0xd 0x18 0xb 0xe 0xe 0xe 0x1a 0xc 0xf 0xf 0xf 0x1c 0xd 0x10 0x10 0x10 0x1e 0xd 0x11 0x11 0x11 0x20 0xe 0x12 0x12 0x12 0x23 0xf 0x13 0x13 0x13 0x25 0x10 0x14 0x14 0x14 0x28 0x11 0x15 0x15 0x15 0x2a 0x12 0x16 0x16 0x16 0x2d 0x13 0x17 0x17 0x17 0x2f 0x14 0x18 0x18 0x18 0x32 0x15 0x19 0x19 0x19 0x34 0x16 0x1a 0x1a 0x1a 0x37 0x17 0x1b 0x1b 0x1b 0x3a 0x19 0x1c 0x1c 0x1c 0x3c 0x1a 0x1d 0x1d 0x1d 0x3f 0x1b 0x1e 0x1e 0x1e 0x42 0x1c 0x1f 0x1f 0x1f 0x45 0x1d 0x20 0x20 0x20 0x47 0x1e 0x21 0x21 0x21 0x4a 0x1f 0x22 0x22 0x22 0x4d 0x20 0x23 0x23 0x23 0x50 0x22 0x24 0x24 0x24 0x53 0x23 0x25 0x25 0x25 0x56 0x24 0x26 0x26 0x26 0x59 0x25 0x27 0x27 0x27 0x5c 0x26 0x28 0x28 0x28 0x5f 0x28 0x29 0x29 0x29 0x62 0x29 0x2a 0x2a 0x2a 0x65 0x2a 0x2b 0x2b 0x2b 0x68 0x2b 0x2c 0x2c 0x2c 0x6b 0x2d 0x2d 0x2d 0x2d 0x6e 0x2e 0x2e 0x2e 0x2e 0x71 0x2f 0x2f 0x2f 0x2f 0x74 0x30 0x30 0x30 0x30 0x77 0x32 0x31 0x31 0x31 0x7b 0x33 0x32 0x32 0x32 0x7e 0x34 0x33 0x33 0x33 0x81 0x36 0x34 0x34 0x34 0x84 0x37 0x35 0x35 0x35 0x88 0x38 0x36 0x36 0x36 0x8b 0x3a 0x37 0x37 0x37 0x8e 0x3b 0x38 0x38 0x38 0x92 0x3c 0x39 0x39 0x39 0x95 0x3e 0x3a 0x3a 0x3a 0x98 0x3f 0x3b 0x3b 0x3b 0x9c 0x40 0x3c 0x3c 0x3c 0x9f 0x42 0x3d 0x3d 0x3d 0xa2 0x43 0x3e 0x3e 0x3e 0xa6 0x44 0x3f 0x3f 0x3f 0xa9 0x46 0x40 0x40 0x40 0xad 0x47 0x41 0x41 0x41 0xb0 0x49 0x42 0x42 0x42 0xb4 0x4a 0x43 0x43 0x43 0xb7 0x4c 0x44 0x44 0x44 0xbb 0x4d 0x45 0x45 0x45 0xbe 0x4e 0x46 0x46 0x46 0xc2 0x50 0x47 0x47 0x47 0xc5 0x51 0x48 0x48 0x48 0xc9 0x53 0x49 0x49 0x49 0xcd 0x54 0x4a 0x4a 0x4a 0xd0 0x56 0x4b 0x4b 0x4b 0xd4 0x57 0x4c 0x4c 0x4c 0xd7 0x59 0x4d 0x4d 0x4d 0xdb 0x5a 0x4e 0x4e 0x4e 0xdf 0x5c 0x4f 0x4f 0x4f 0xe3 0x5d 0x50 0x50 0x50 0xe6 0x5f 0x51 0x51 0x51 0xea 0x60 0x52 0x52 0x52 0xee 0x62 0x53 0x53 0x53 0xf1 0x63 0x54 0x54 0x54 0xf5 0x65 0x55 0x55 0x55 0xf9 0x66 0x56 0x56 0x56 0xfd 0x68 0x57 0x57 0x57 0x101 0x69 0x58 0x58 0x58 0x104 0x6b 0x59 0x59 0x59 0x108 0x6c 0x5a 0x5a 0x5a 0x10c 0x6e 0x5b 0x5b 0x5b 0x110 0x70 0x5c 0x5c 0x5c 0x114 0x71 0x5d 0x5d 0x5d 0x118 0x73 0x5e 0x5e 0x5e 0x11b 0x74 0x5f 0x5f 0x5f 0x11f 0x76 0x60 0x60 0x60 0x123 0x77 0x61 0x61 0x61 0x127 0x79 0x62 0x62 0x62 0x12b 0x7b 0x63 0x63 0x63 0x12f 0x7c 0x64 0x64 0x64 0x133 0x7e 0x65 0x65 0x65 0x137 0x7f 0x66 0x66 0x66 0x13b 0x81 0x67 0x67 0x67 0x13f 0x83 0x68 0x68 0x68 0x143 0x84 0x69 0x69 0x69 0x147 0x86 0x6a 0x6a 0x6a 0x14b 0x88 0x6b 0x6b 0x6b 0x14f 0x89 0x6c 0x6c 0x6c 0x153 0x8b 0x6d 0x6d 0x6d 0x157 0x8c 0x6e 0x6e 0x6e 0x15b 0x8e 0x6f 0x6f 0x6f 0x15f 0x90 0x70 0x70 0x70 0x163 0x91 0x71 0x71 0x71 0x168 0x93 0x72 0x72 0x72 0x16c 0x95 0x73 0x73 0x73 0x170 0x96 0x74 0x74 0x74 0x174 0x98 0x75 0x75 0x75 0x178 0x9a 0x76 0x76 0x76 0x17c 0x9c 0x77 0x77 0x77 0x180 0x9d 0x78 0x78 0x78 0x185 0x9f 0x79 0x79 0x79 0x189 0xa1 0x7a 0x7a 0x7a 0x18d 0xa2 0x7b 0x7b 0x7b 0x191 0xa4 0x7c 0x7c 0x7c 0x195 0xa6 0x7d 0x7d 0x7d 0x19a 0xa7 0x7e 0x7e 0x7e 0x19e 0xa9 0x7f 0x7f 0x7f 0x1a2 0xab 0x80 0x80 0x80 0x1a6 0xad 0x81 0x81 0x81 0x1ab 0xae 0x82 0x82 0x82 0x1af 0xb0 0x83 0x83 0x83 0x1b3 0xb2 0x84 0x84 0x84 0x1b8 0xb4 0x85 0x85 0x85 0x1bc 0xb5 0x86 0x86 0x86 0x1c0 0xb7 0x87 0x87 0x87 0x1c5 0xb9 0x88 0x88 0x88 0x1c9 0xbb 0x89 0x89 0x89 0x1cd 0xbc 0x8a 0x8a 0x8a 0x1d1 0xbe 0x8b 0x8b 0x8b 0x1d6 0xc0 0x8c 0x8c 0x8c 0x1da 0xc2 0x8d 0x8d 0x8d 0x1de 0xc3 0x8e 0x8e 0x8e 0x1e3 0xc5 0x8f 0x8f 0x8f 0x1e7 0xc7 0x90 0x90 0x90 0x1eb 0xc9 0x91 0x91 0x91 0x1f0 0xcb 0x92 0x92 0x92 0x1f4 0xcc 0x93 0x93 0x93 0x1f8 0xce 0x94 0x94 0x94 0x1fd 0xd0 0x95 0x95 0x95 0x201 0xd2 0x96 0x96 0x96 0x206 0xd4 0x97 0x97 0x97 0x20a 0xd6 0x98 0x98 0x98 0x20e 0xd7 0x99 0x99 0x99 0x213 0xd9 0x9a 0x9a 0x9a 0x217 0xdb 0x9b 0x9b 0x9b 0x21c 0xdd 0x9c 0x9c 0x9c 0x220 0xdf 0x9d 0x9d 0x9d 0x225 0xe1 0x9e 0x9e 0x9e 0x229 0xe2 0x9f 0x9f 0x9f 0x22e 0xe4 0xa0 0xa0 0xa0 0x232 0xe6 0xa1 0xa1 0xa1 0x237 0xe8 0xa2 0xa2 0xa2 0x23b 0xea 0xa3 0xa3 0xa3 0x240 0xec 0xa4 0xa4 0xa4 0x244 0xed 0xa5 0xa5 0xa5 0x249 0xef 0xa6 0xa6 0xa6 0x24d 0xf1 0xa7 0xa7 0xa7 0x252 0xf3 0xa8 0xa8 0xa8 0x256 0xf5 0xa9 0xa9 0xa9 0x25b 0xf7 0xaa 0xaa 0xaa 0x260 0xf9 0xab 0xab 0xab 0x264 0xfb 0xac 0xac 0xac 0x269 0xfd 0xad 0xad 0xad 0x26d 0xfe 0xae 0xae 0xae 0x272 0x100 0xaf 0xaf 0xaf 0x277 0x102 0xb0 0xb0 0xb0 0x27b 0x104 0xb1 0xb1 0xb1 0x280 0x106 0xb2 0xb2 0xb2 0x284 0x108 0xb3 0xb3 0xb3 0x289 0x10a 0xb4 0xb4 0xb4 0x28e 0x10c 0xb5 0xb5 0xb5 0x292 0x10e 0xb6 0xb6 0xb6 0x297 0x110 0xb7 0xb7 0xb7 0x29c 0x112 0xb8 0xb8 0xb8 0x2a0 0x113 0xb9 0xb9 0xb9 0x2a5 0x115 0xba 0xba 0xba 0x2aa 0x117 0xbb 0xbb 0xbb 0x2ae 0x119 0xbc 0xbc 0xbc 0x2b3 0x11b 0xbd 0xbd 0xbd 0x2b8 0x11d 0xbe 0xbe 0xbe 0x2bd 0x11f 0xbf 0xbf 0xbf 0x2c1 0x121 0xc0 0xc0 0xc0 0x2c6 0x123 0xc1 0xc1 0xc1 0x2cb 0x125 0xc2 0xc2 0xc2 0x2d0 0x127 0xc3 0xc3 0xc3 0x2d4 0x129 0xc4 0xc4 0xc4 0x2d9 0x12b 0xc5 0xc5 0xc5 0x2de 0x12d 0xc6 0xc6 0xc6 0x2e3 0x12f 0xc7 0xc7 0xc7 0x2e8 0x131 0xc8 0xc8 0xc8 0x2ec 0x133 0xc9 0xc9 0xc9 0x2f1 0x135 0xca 0xca 0xca 0x2f6 0x137 0xcb 0xcb 0xcb 0x2fb 0x139 0xcc 0xcc 0xcc 0x300 0x13b 0xcd 0xcd 0xcd 0x304 0x13d 0xce 0xce 0xce 0x309 0x13f 0xcf 0xcf 0xcf 0x30e 0x141 0xd0 0xd0 0xd0 0x313 0x143 0xd1 0xd1 0xd1 0x318 0x145 0xd2 0xd2 0xd2 0x31d 0x147 0xd3 0xd3 0xd3 0x322 0x149 0xd4 0xd4 0xd4 0x327 0x14b 0xd5 0xd5 0xd5 0x32b 0x14d 0xd6 0xd6 0xd6 0x330 0x14f 0xd7 0xd7 0xd7 0x335 0x151 0xd8 0xd8 0xd8 0x33a 0x153 0xd9 0xd9 0xd9 0x33f 0x155 0xda 0xda 0xda 0x344 0x157 0xdb 0xdb 0xdb 0x349 0x159 0xdc 0xdc 0xdc 0x34e 0x15b 0xdd 0xdd 0xdd 0x353 0x15d 0xde 0xde 0xde 0x358 0x15f 0xdf 0xdf 0xdf 0x35d 0x161 0xe0 0xe0 0xe0 0x362 0x163 0xe1 0xe1 0xe1 0x367 0x165 0xe2 0xe2 0xe2 0x36c 0x167 0xe3 0xe3 0xe3 0x371 0x169 0xe4 0xe4 0xe4 0x376 0x16b 0xe5 0xe5 0xe5 0x37b 0x16d 0xe6 0xe6 0xe6 0x380 0x170 0xe7 0xe7 0xe7 0x385 0x172 0xe8 0xe8 0xe8 0x38a 0x174 0xe9 0xe9 0xe9 0x38f 0x176 0xea 0xea 0xea 0x394 0x178 0xeb 0xeb 0xeb 0x399 0x17a 0xec 0xec 0xec 0x39e 0x17c 0xed 0xed 0xed 0x3a3 0x17e 0xee 0xee 0xee 0x3a8 0x180 0xef 0xef 0xef 0x3ad 0x182 0xf0 0xf0 0xf0 0x3b2 0x184 0xf1 0xf1 0xf1 0x3b7 0x186 0xf2 0xf2 0xf2 0x3bc 0x189 0xf3 0xf3 0xf3 0x3c1 0x18b 0xf4 0xf4 0xf4 0x3c7 0x18d 0xf5 0xf5 0xf5 0x3cc 0x18f 0xf6 0xf6 0xf6 0x3d1 0x191 0xf7 0xf7 0xf7 0x3d6 0x193 0xf8 0xf8 0xf8 0x3db 0x195 0xf9 0xf9 0xf9 0x3e0 0x197 0xfa 0xfa 0xfa 0x3e5 0x199 0xfb 0xfb 0xfb 0x3ea 0x19b 0xfc 0xfc 0xfc 0x3f0 0x19e 0xfd 0xfd 0xfd 0x3f5 0x1a0 0xfe 0xfe 0xfe 0x3fa 0x1a2 0xff 0xff 0xff 0x3ff 0x1a4>; + samsung,hbm_candela_map_table_revG = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x2 0x1aa 0x2 0x102 0x102 0x4 0x1ac 0x3 0x103 0x103 0x6 0x1ae 0x4 0x104 0x104 0x8 0x1b0 0x5 0x105 0x105 0xa 0x1b1 0x6 0x106 0x106 0xc 0x1b3 0x7 0x107 0x107 0xe 0x1b4 0x8 0x108 0x108 0x10 0x1b6 0x9 0x109 0x109 0x12 0x1b8 0xa 0x10a 0x10a 0x14 0x1b9 0xb 0x10b 0x10b 0x16 0x1bb 0xc 0x10c 0x10c 0x18 0x1bc 0xd 0x10d 0x10d 0x1a 0x1be 0xe 0x10e 0x10e 0x1c 0x1c0 0xf 0x10f 0x10f 0x1e 0x1c2 0x10 0x110 0x110 0x20 0x1c3 0x11 0x111 0x111 0x22 0x1c5 0x12 0x112 0x112 0x24 0x1c6 0x13 0x113 0x113 0x25 0x1c8 0x14 0x114 0x114 0x26 0x1ca 0x15 0x115 0x115 0x27 0x1cb 0x16 0x116 0x116 0x28 0x1cd 0x17 0x117 0x117 0x29 0x1ce 0x18 0x118 0x118 0x2a 0x1d0 0x19 0x119 0x119 0x2b 0x1d2 0x1a 0x11a 0x11a 0x2c 0x1d4 0x1b 0x11b 0x11b 0x2d 0x1d5 0x1c 0x11c 0x11c 0x2e 0x1d7 0x1d 0x11d 0x11d 0x2f 0x1d8 0x1e 0x11e 0x11e 0x30 0x1da 0x1f 0x11f 0x11f 0x31 0x1dc 0x20 0x120 0x120 0x32 0x1dd 0x21 0x121 0x121 0x33 0x1df 0x22 0x122 0x122 0x34 0x1e0 0x23 0x123 0x123 0x35 0x1e2 0x24 0x124 0x124 0x36 0x1e4 0x25 0x125 0x125 0x37 0x1e5 0x26 0x126 0x126 0x38 0x1e7 0x27 0x127 0x127 0x39 0x1e8 0x28 0x128 0x128 0x3a 0x1ea 0x29 0x129 0x129 0x3b 0x1ec 0x2a 0x12a 0x12a 0x3c 0x1ee 0x2b 0x12b 0x12b 0x3d 0x1ef 0x2c 0x12c 0x12c 0x3e 0x1f1 0x2d 0x12d 0x12d 0x3f 0x1f2 0x2e 0x12e 0x12e 0x40 0x1f4 0x2f 0x12f 0x12f 0x41 0x1f6 0x30 0x130 0x130 0x42 0x1f7 0x31 0x131 0x131 0x43 0x1f9 0x32 0x132 0x132 0x44 0x1fa 0x33 0x133 0x133 0x45 0x1fc 0x34 0x134 0x134 0x46 0x1fe 0x35 0x135 0x135 0x47 0x200 0x36 0x136 0x136 0x48 0x201 0x37 0x137 0x137 0x49 0x203 0x38 0x138 0x138 0x4a 0x204 0x39 0x139 0x139 0x4b 0x206 0x3a 0x13a 0x13a 0x4c 0x208 0x3b 0x13b 0x13b 0x4d 0x209 0x3c 0x13c 0x13c 0x4e 0x20b 0x3d 0x13d 0x13d 0x4f 0x20c 0x3e 0x13e 0x13e 0x50 0x20e 0x3f 0x13f 0x13f 0x51 0x210 0x40 0x140 0x140 0x52 0x211 0x41 0x141 0x141 0x53 0x213 0x42 0x142 0x142 0x54 0x215 0x43 0x143 0x143 0x55 0x216 0x44 0x144 0x144 0x56 0x218 0x45 0x145 0x145 0x57 0x21a 0x46 0x146 0x146 0x58 0x21b 0x47 0x147 0x147 0x59 0x21d 0x48 0x148 0x148 0x5a 0x21e 0x49 0x149 0x149 0x5b 0x220 0x4a 0x14a 0x14a 0x5c 0x222 0x4b 0x14b 0x14b 0x5d 0x223 0x4c 0x14c 0x14c 0x5f 0x225 0x4d 0x14d 0x14d 0x61 0x226 0x4e 0x14e 0x14e 0x63 0x228 0x4f 0x14f 0x14f 0x65 0x22a 0x50 0x150 0x150 0x67 0x22b 0x51 0x151 0x151 0x69 0x22d 0x52 0x152 0x152 0x6b 0x22f 0x53 0x153 0x153 0x6d 0x230 0x54 0x154 0x154 0x6f 0x232 0x55 0x155 0x155 0x71 0x234 0x56 0x156 0x156 0x73 0x235 0x57 0x157 0x157 0x75 0x237 0x58 0x158 0x158 0x77 0x238 0x59 0x159 0x159 0x79 0x23a 0x5a 0x15a 0x15a 0x7b 0x23c 0x5b 0x15b 0x15b 0x7d 0x23d 0x5c 0x15c 0x15c 0x7f 0x23f 0x5d 0x15d 0x15d 0x81 0x241 0x5e 0x15e 0x15e 0x83 0x242 0x5f 0x15f 0x15f 0x85 0x244 0x60 0x160 0x160 0x87 0x246 0x61 0x161 0x161 0x89 0x247 0x62 0x162 0x162 0x8b 0x249 0x63 0x163 0x163 0x8d 0x24a 0x64 0x164 0x164 0x8f 0x24c 0x65 0x165 0x165 0x91 0x24e 0x66 0x166 0x166 0x93 0x24f 0x67 0x167 0x167 0x95 0x251 0x68 0x168 0x168 0x97 0x253 0x69 0x169 0x169 0x9a 0x254 0x6a 0x16a 0x16a 0x9d 0x256 0x6b 0x16b 0x16b 0xa0 0x257 0x6c 0x16c 0x16c 0xa3 0x259 0x6d 0x16d 0x16d 0xa6 0x25b 0x6e 0x16e 0x16e 0xa8 0x25c 0x6f 0x16f 0x16f 0xab 0x25e 0x70 0x170 0x170 0xae 0x260 0x71 0x171 0x171 0xb1 0x261 0x72 0x172 0x172 0xb4 0x263 0x73 0x173 0x173 0xb7 0x264 0x74 0x174 0x174 0xba 0x266 0x75 0x175 0x175 0xbd 0x268 0x76 0x176 0x176 0xc0 0x269 0x77 0x177 0x177 0xc3 0x26b 0x78 0x178 0x178 0xc6 0x26d 0x79 0x179 0x179 0xc9 0x26e 0x7a 0x17a 0x17a 0xcc 0x270 0x7b 0x17b 0x17b 0xcf 0x272 0x7c 0x17c 0x17c 0xd2 0x273 0x7d 0x17d 0x17d 0xd5 0x275 0x7e 0x17e 0x17e 0xd8 0x276 0x7f 0x17f 0x17f 0xdb 0x278 0x80 0x180 0x180 0xde 0x27a 0x81 0x181 0x181 0xe1 0x27b 0x82 0x182 0x182 0xe4 0x27d 0x83 0x183 0x183 0xe7 0x27f 0x84 0x184 0x184 0xea 0x280 0x85 0x185 0x185 0xed 0x282 0x86 0x186 0x186 0xf0 0x283 0x87 0x187 0x187 0xf3 0x285 0x88 0x188 0x188 0xf6 0x287 0x89 0x189 0x189 0xf9 0x288 0x8a 0x18a 0x18a 0xfc 0x28a 0x8b 0x18b 0x18b 0xff 0x28c 0x8c 0x18c 0x18c 0x102 0x28d 0x8d 0x18d 0x18d 0x105 0x28f 0x8e 0x18e 0x18e 0x108 0x291 0x8f 0x18f 0x18f 0x10b 0x292 0x90 0x190 0x190 0x10e 0x294 0x91 0x191 0x191 0x111 0x295 0x92 0x192 0x192 0x114 0x297 0x93 0x193 0x193 0x117 0x299 0x94 0x194 0x194 0x11a 0x29a 0x95 0x195 0x195 0x11d 0x29c 0x96 0x196 0x196 0x120 0x29e 0x97 0x197 0x197 0x123 0x29f 0x98 0x198 0x198 0x126 0x2a1 0x99 0x199 0x199 0x129 0x2a3 0x9a 0x19a 0x19a 0x12c 0x2a4 0x9b 0x19b 0x19b 0x12f 0x2a6 0x9c 0x19c 0x19c 0x132 0x2a7 0x9d 0x19d 0x19d 0x135 0x2a9 0x9e 0x19e 0x19e 0x138 0x2ab 0x9f 0x19f 0x19f 0x13b 0x2ac 0xa0 0x1a0 0x1a0 0x13e 0x2ae 0xa1 0x1a1 0x1a1 0x141 0x2af 0xa2 0x1a2 0x1a2 0x144 0x2b1 0xa3 0x1a3 0x1a3 0x147 0x2b3 0xa4 0x1a4 0x1a4 0x14a 0x2b4 0xa5 0x1a5 0x1a5 0x14d 0x2b6 0xa6 0x1a6 0x1a6 0x150 0x2b8 0xa7 0x1a7 0x1a7 0x153 0x2b9 0xa8 0x1a8 0x1a8 0x156 0x2bb 0xa9 0x1a9 0x1a9 0x159 0x2bd 0xaa 0x1aa 0x1aa 0x15c 0x2be 0xab 0x1ab 0x1ab 0x15f 0x2c0 0xac 0x1ac 0x1ac 0x162 0x2c1 0xad 0x1ad 0x1ad 0x165 0x2c3 0xae 0x1ae 0x1ae 0x168 0x2c5 0xaf 0x1af 0x1af 0x16b 0x2c6 0xb0 0x1b0 0x1b0 0x16e 0x2c8 0xb1 0x1b1 0x1b1 0x171 0x2c9 0xb2 0x1b2 0x1b2 0x174 0x2cb 0xb3 0x1b3 0x1b3 0x177 0x2cd 0xb4 0x1b4 0x1b4 0x17a 0x2cf 0xb5 0x1b5 0x1b5 0x17d 0x2d0 0xb6 0x1b6 0x1b6 0x180 0x2d2 0xb7 0x1b7 0x1b7 0x183 0x2d3 0xb8 0x1b8 0x1b8 0x186 0x2d5 0xb9 0x1b9 0x1b9 0x189 0x2d7 0xba 0x1ba 0x1ba 0x18c 0x2d8 0xbb 0x1bb 0x1bb 0x18f 0x2da 0xbc 0x1bc 0x1bc 0x192 0x2db 0xbd 0x1bd 0x1bd 0x195 0x2dd 0xbe 0x1be 0x1be 0x198 0x2df 0xbf 0x1bf 0x1bf 0x19b 0x2e1 0xc0 0x1c0 0x1c0 0x19e 0x2e2 0xc1 0x1c1 0x1c1 0x1a1 0x2e4 0xc2 0x1c2 0x1c2 0x1a4 0x2e5 0xc3 0x1c3 0x1c3 0x1a7 0x2e7 0xc4 0x1c4 0x1c4 0x1aa 0x2e9 0xc5 0x1c5 0x1c5 0x1ad 0x2ea 0xc6 0x1c6 0x1c6 0x1b0 0x2ec 0xc7 0x1c7 0x1c7 0x1b3 0x2ed 0xc8 0x1c8 0x1c8 0x1b6 0x2ef 0xc9 0x1c9 0x1c9 0x1b9 0x2f1 0xca 0x1ca 0x1ca 0x1bc 0x2f2 0xcb 0x1cb 0x1cb 0x1bf 0x2f4 0xcc 0x1cc 0x1cc 0x1c2 0x2f5 0xcd 0x1cd 0x1cd 0x1c5 0x2f7 0xce 0x1ce 0x1ce 0x1c8 0x2f9 0xcf 0x1cf 0x1cf 0x1cb 0x2fb 0xd0 0x1d0 0x1d0 0x1ce 0x2fc 0xd1 0x1d1 0x1d1 0x1d1 0x2fe 0xd2 0x1d2 0x1d2 0x1d4 0x2ff 0xd3 0x1d3 0x1d3 0x1d7 0x301 0xd4 0x1d4 0x1d4 0x1da 0x303 0xd5 0x1d5 0x1d5 0x1dd 0x304 0xd6 0x1d6 0x1d6 0x1e0 0x306 0xd7 0x1d7 0x1d7 0x1e3 0x307 0xd8 0x1d8 0x1d8 0x1e6 0x309 0xd9 0x1d9 0x1d9 0x1e9 0x30b 0xda 0x1da 0x1da 0x1ec 0x30d 0xdb 0x1db 0x1db 0x1ef 0x30e 0xdc 0x1dc 0x1dc 0x1f2 0x310 0xdd 0x1dd 0x1dd 0x1f5 0x311 0xde 0x1de 0x1de 0x1f8 0x313 0xdf 0x1df 0x1df 0x1fb 0x315 0xe0 0x1e0 0x1e0 0x1fe 0x316 0xe1 0x1e1 0x1e1 0x201 0x318 0xe2 0x1e2 0x1e2 0x204 0x319 0xe3 0x1e3 0x1e3 0x207 0x31b 0xe4 0x1e4 0x1e4 0x20a 0x31d 0xe5 0x1e5 0x1e5 0x20d 0x31f 0xe6 0x1e6 0x1e6 0x210 0x320>; + samsung,hbm_candela_map_table_revA = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x3 0x1aa 0x2 0x102 0x102 0x6 0x1ac 0x3 0x103 0x103 0x9 0x1ae 0x4 0x104 0x104 0xc 0x1b0 0x5 0x105 0x105 0xf 0x1b1 0x6 0x106 0x106 0x12 0x1b3 0x7 0x107 0x107 0x15 0x1b4 0x8 0x108 0x108 0x18 0x1b6 0x9 0x109 0x109 0x1b 0x1b8 0xa 0x10a 0x10a 0x1e 0x1b9 0xb 0x10b 0x10b 0x21 0x1bb 0xc 0x10c 0x10c 0x24 0x1bc 0xd 0x10d 0x10d 0x27 0x1be 0xe 0x10e 0x10e 0x2a 0x1c0 0xf 0x10f 0x10f 0x2d 0x1c2 0x10 0x110 0x110 0x30 0x1c3 0x11 0x111 0x111 0x33 0x1c5 0x12 0x112 0x112 0x36 0x1c6 0x13 0x113 0x113 0x39 0x1c8 0x14 0x114 0x114 0x3c 0x1ca 0x15 0x115 0x115 0x3f 0x1cb 0x16 0x116 0x116 0x42 0x1cd 0x17 0x117 0x117 0x45 0x1ce 0x18 0x118 0x118 0x48 0x1d0 0x19 0x119 0x119 0x4b 0x1d2 0x1a 0x11a 0x11a 0x4e 0x1d4 0x1b 0x11b 0x11b 0x51 0x1d5 0x1c 0x11c 0x11c 0x54 0x1d7 0x1d 0x11d 0x11d 0x56 0x1d8 0x1e 0x11e 0x11e 0x58 0x1da 0x1f 0x11f 0x11f 0x5a 0x1dc 0x20 0x120 0x120 0x5c 0x1dd 0x21 0x121 0x121 0x5e 0x1df 0x22 0x122 0x122 0x60 0x1e0 0x23 0x123 0x123 0x62 0x1e2 0x24 0x124 0x124 0x64 0x1e4 0x25 0x125 0x125 0x66 0x1e5 0x26 0x126 0x126 0x68 0x1e7 0x27 0x127 0x127 0x6a 0x1e8 0x28 0x128 0x128 0x6c 0x1ea 0x29 0x129 0x129 0x6e 0x1ec 0x2a 0x12a 0x12a 0x70 0x1ee 0x2b 0x12b 0x12b 0x72 0x1ef 0x2c 0x12c 0x12c 0x74 0x1f1 0x2d 0x12d 0x12d 0x76 0x1f2 0x2e 0x12e 0x12e 0x78 0x1f4 0x2f 0x12f 0x12f 0x7a 0x1f6 0x30 0x130 0x130 0x7c 0x1f7 0x31 0x131 0x131 0x7e 0x1f9 0x32 0x132 0x132 0x80 0x1fa 0x33 0x133 0x133 0x82 0x1fc 0x34 0x134 0x134 0x84 0x1fe 0x35 0x135 0x135 0x86 0x200 0x36 0x136 0x136 0x88 0x201 0x37 0x137 0x137 0x8a 0x203 0x38 0x138 0x138 0x8c 0x204 0x39 0x139 0x139 0x8e 0x206 0x3a 0x13a 0x13a 0x90 0x208 0x3b 0x13b 0x13b 0x92 0x209 0x3c 0x13c 0x13c 0x94 0x20b 0x3d 0x13d 0x13d 0x96 0x20c 0x3e 0x13e 0x13e 0x98 0x20e 0x3f 0x13f 0x13f 0x9a 0x210 0x40 0x140 0x140 0x9c 0x211 0x41 0x141 0x141 0x9e 0x213 0x42 0x142 0x142 0xa0 0x215 0x43 0x143 0x143 0xa2 0x216 0x44 0x144 0x144 0xa4 0x218 0x45 0x145 0x145 0xa6 0x21a 0x46 0x146 0x146 0xa8 0x21b 0x47 0x147 0x147 0xaa 0x21d 0x48 0x148 0x148 0xac 0x21e 0x49 0x149 0x149 0xae 0x220 0x4a 0x14a 0x14a 0xb0 0x222 0x4b 0x14b 0x14b 0xb2 0x223 0x4c 0x14c 0x14c 0xb6 0x225 0x4d 0x14d 0x14d 0xba 0x226 0x4e 0x14e 0x14e 0xbe 0x228 0x4f 0x14f 0x14f 0xc2 0x22a 0x50 0x150 0x150 0xc6 0x22b 0x51 0x151 0x151 0xcb 0x22d 0x52 0x152 0x152 0xd0 0x22f 0x53 0x153 0x153 0xd5 0x230 0x54 0x154 0x154 0xda 0x232 0x55 0x155 0x155 0xdf 0x234 0x56 0x156 0x156 0xe4 0x235 0x57 0x157 0x157 0xe9 0x237 0x58 0x158 0x158 0xee 0x238 0x59 0x159 0x159 0xf3 0x23a 0x5a 0x15a 0x15a 0xf8 0x23c 0x5b 0x15b 0x15b 0xfd 0x23d 0x5c 0x15c 0x15c 0x102 0x23f 0x5d 0x15d 0x15d 0x107 0x241 0x5e 0x15e 0x15e 0x10c 0x242 0x5f 0x15f 0x15f 0x111 0x244 0x60 0x160 0x160 0x116 0x246 0x61 0x161 0x161 0x11b 0x247 0x62 0x162 0x162 0x120 0x249 0x63 0x163 0x163 0x125 0x24a 0x64 0x164 0x164 0x12a 0x24c 0x65 0x165 0x165 0x12f 0x24e 0x66 0x166 0x166 0x134 0x24f 0x67 0x167 0x167 0x139 0x251 0x68 0x168 0x168 0x13e 0x253 0x69 0x169 0x169 0x143 0x254 0x6a 0x16a 0x16a 0x148 0x256 0x6b 0x16b 0x16b 0x14d 0x257 0x6c 0x16c 0x16c 0x152 0x259 0x6d 0x16d 0x16d 0x157 0x25b 0x6e 0x16e 0x16e 0x15c 0x25c 0x6f 0x16f 0x16f 0x161 0x25e 0x70 0x170 0x170 0x166 0x260 0x71 0x171 0x171 0x16b 0x261 0x72 0x172 0x172 0x170 0x263 0x73 0x173 0x173 0x175 0x264 0x74 0x174 0x174 0x17a 0x266 0x75 0x175 0x175 0x17f 0x268 0x76 0x176 0x176 0x184 0x269 0x77 0x177 0x177 0x189 0x26b 0x78 0x178 0x178 0x18e 0x26d 0x79 0x179 0x179 0x193 0x26e 0x7a 0x17a 0x17a 0x198 0x270 0x7b 0x17b 0x17b 0x19d 0x272 0x7c 0x17c 0x17c 0x1a2 0x273 0x7d 0x17d 0x17d 0x1a7 0x275 0x7e 0x17e 0x17e 0x1ac 0x276 0x7f 0x17f 0x17f 0x1b1 0x278 0x80 0x180 0x180 0x1b6 0x27a 0x81 0x181 0x181 0x1bb 0x27b 0x82 0x182 0x182 0x1c0 0x27d 0x83 0x183 0x183 0x1c5 0x27f 0x84 0x184 0x184 0x1ca 0x280 0x85 0x185 0x185 0x1cf 0x282 0x86 0x186 0x186 0x1d4 0x283 0x87 0x187 0x187 0x1d9 0x285 0x88 0x188 0x188 0x1de 0x287 0x89 0x189 0x189 0x1e3 0x288 0x8a 0x18a 0x18a 0x1e8 0x28a 0x8b 0x18b 0x18b 0x1ed 0x28c 0x8c 0x18c 0x18c 0x1f2 0x28d 0x8d 0x18d 0x18d 0x1f7 0x28f 0x8e 0x18e 0x18e 0x1fc 0x291 0x8f 0x18f 0x18f 0x201 0x292 0x90 0x190 0x190 0x206 0x294 0x91 0x191 0x191 0x20b 0x295 0x92 0x192 0x192 0x210 0x297 0x93 0x193 0x193 0x215 0x299 0x94 0x194 0x194 0x21a 0x29a 0x95 0x195 0x195 0x21f 0x29c 0x96 0x196 0x196 0x224 0x29e 0x97 0x197 0x197 0x229 0x29f 0x98 0x198 0x198 0x22e 0x2a1 0x99 0x199 0x199 0x233 0x2a3 0x9a 0x19a 0x19a 0x238 0x2a4 0x9b 0x19b 0x19b 0x23d 0x2a6 0x9c 0x19c 0x19c 0x242 0x2a7 0x9d 0x19d 0x19d 0x247 0x2a9 0x9e 0x19e 0x19e 0x24d 0x2ab 0x9f 0x19f 0x19f 0x253 0x2ac 0xa0 0x1a0 0x1a0 0x259 0x2ae 0xa1 0x1a1 0x1a1 0x25f 0x2af 0xa2 0x1a2 0x1a2 0x265 0x2b1 0xa3 0x1a3 0x1a3 0x26b 0x2b3 0xa4 0x1a4 0x1a4 0x271 0x2b4 0xa5 0x1a5 0x1a5 0x277 0x2b6 0xa6 0x1a6 0x1a6 0x27d 0x2b8 0xa7 0x1a7 0x1a7 0x283 0x2b9 0xa8 0x1a8 0x1a8 0x289 0x2bb 0xa9 0x1a9 0x1a9 0x28f 0x2bd 0xaa 0x1aa 0x1aa 0x295 0x2be 0xab 0x1ab 0x1ab 0x29b 0x2c0 0xac 0x1ac 0x1ac 0x2a1 0x2c1 0xad 0x1ad 0x1ad 0x2a7 0x2c3 0xae 0x1ae 0x1ae 0x2ad 0x2c5 0xaf 0x1af 0x1af 0x2b3 0x2c6 0xb0 0x1b0 0x1b0 0x2b9 0x2c8 0xb1 0x1b1 0x1b1 0x2bf 0x2c9 0xb2 0x1b2 0x1b2 0x2c5 0x2cb 0xb3 0x1b3 0x1b3 0x2cb 0x2cd 0xb4 0x1b4 0x1b4 0x2d1 0x2cf 0xb5 0x1b5 0x1b5 0x2d7 0x2d0 0xb6 0x1b6 0x1b6 0x2dd 0x2d2 0xb7 0x1b7 0x1b7 0x2e3 0x2d3 0xb8 0x1b8 0x1b8 0x2e9 0x2d5 0xb9 0x1b9 0x1b9 0x2ef 0x2d7 0xba 0x1ba 0x1ba 0x2f5 0x2d8 0xbb 0x1bb 0x1bb 0x2fb 0x2da 0xbc 0x1bc 0x1bc 0x301 0x2db 0xbd 0x1bd 0x1bd 0x307 0x2dd 0xbe 0x1be 0x1be 0x30d 0x2df 0xbf 0x1bf 0x1bf 0x313 0x2e1 0xc0 0x1c0 0x1c0 0x319 0x2e2 0xc1 0x1c1 0x1c1 0x31f 0x2e4 0xc2 0x1c2 0x1c2 0x325 0x2e5 0xc3 0x1c3 0x1c3 0x32b 0x2e7 0xc4 0x1c4 0x1c4 0x331 0x2e9 0xc5 0x1c5 0x1c5 0x337 0x2ea 0xc6 0x1c6 0x1c6 0x33d 0x2ec 0xc7 0x1c7 0x1c7 0x343 0x2ed 0xc8 0x1c8 0x1c8 0x349 0x2ef 0xc9 0x1c9 0x1c9 0x34f 0x2f1 0xca 0x1ca 0x1ca 0x355 0x2f2 0xcb 0x1cb 0x1cb 0x35b 0x2f4 0xcc 0x1cc 0x1cc 0x361 0x2f5 0xcd 0x1cd 0x1cd 0x367 0x2f7 0xce 0x1ce 0x1ce 0x36d 0x2f9 0xcf 0x1cf 0x1cf 0x373 0x2fb 0xd0 0x1d0 0x1d0 0x379 0x2fc 0xd1 0x1d1 0x1d1 0x37f 0x2fe 0xd2 0x1d2 0x1d2 0x385 0x2ff 0xd3 0x1d3 0x1d3 0x38b 0x301 0xd4 0x1d4 0x1d4 0x391 0x303 0xd5 0x1d5 0x1d5 0x397 0x304 0xd6 0x1d6 0x1d6 0x39d 0x306 0xd7 0x1d7 0x1d7 0x3a3 0x307 0xd8 0x1d8 0x1d8 0x3a9 0x309 0xd9 0x1d9 0x1d9 0x3af 0x30b 0xda 0x1da 0x1da 0x3b5 0x30d 0xdb 0x1db 0x1db 0x3bb 0x30e 0xdc 0x1dc 0x1dc 0x3c1 0x310 0xdd 0x1dd 0x1dd 0x3c7 0x311 0xde 0x1de 0x1de 0x3cd 0x313 0xdf 0x1df 0x1df 0x3d3 0x315 0xe0 0x1e0 0x1e0 0x3d9 0x316 0xe1 0x1e1 0x1e1 0x3df 0x318 0xe2 0x1e2 0x1e2 0x3e5 0x319 0xe3 0x1e3 0x1e3 0x3eb 0x31b 0xe4 0x1e4 0x1e4 0x3f1 0x31d 0xe5 0x1e5 0x1e5 0x3f7 0x31f 0xe6 0x1e6 0x1e6 0x3ff 0x320>; + samsung,aod_candela_map_table_revA = <0x0 0x0 0xb 0x1b 0x2 0x1 0xc 0x1f 0x1a 0xa 0x2 0x20 0x36 0x19 0x1e 0x3 0x37 0xff 0x18 0x3c>; + samsung,support_dynamic_mipi_clk; + samsung,ffc_tx_cmds_revD = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 2e c5 29 00 00 00 00 00 03 c5 36 41 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revD = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53641 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c535a8 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53741>; + samsung,ffc_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 32 b1 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revA = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b1 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53222 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c533a0>; + samsung,dynamic_mipi_clk_timing_table = <0x65fbc9c0 0x671db480 0x6422c400>; + samsung,dynamic_mipi_clk_sel_table = <0x1 0x1 0x0 0x0 0x0 0x1 0x2 0x0 0x0 0x2 0x1 0x3 0x0 0x0 0x2 0x1 0x4 0x0 0x0 0x1 0x2 0xb 0x2942 0x29a2 0x0 0x2 0xb 0x29a3 0x29e8 0x1 0x2 0xb 0x29e9 0x2a56 0x0 0x2 0xc 0x25be 0x26d2 0x0 0x2 0xd 0x48a 0x54d 0x0 0x2 0xd 0x54e 0x593 0x1 0x2 0xd 0x594 0x5e9 0x0 0x2 0xe 0x601 0x661 0x0 0x2 0xe 0x662 0x6a7 0x1 0x2 0xe 0x6a8 0x6ca 0x0 0x2 0xf 0x1105 0x116a 0x0 0x2 0x11 0x8bd 0x8e6 0x0 0x2 0x11 0x8e7 0x92c 0x1 0x2 0x11 0x92d 0xa03 0x0 0x2 0x12 0xb79 0xb86 0x1 0x2 0x12 0xb87 0xb98 0x2 0x2 0x12 0xb99 0xc10 0x0 0x3 0x5b 0x0 0xd9 0x0 0x3 0x5b 0xda 0x165 0x1 0x3 0x5b 0x166 0x257 0x0 0x3 0x5c 0x258 0x26a 0x1 0x3 0x5c 0x26b 0x4a7 0x0 0x3 0x5c 0x4a8 0x4af 0x1 0x3 0x5d 0x4b0 0x64f 0x0 0x3 0x5d 0x650 0x6db 0x1 0x3 0x5d 0x6dc 0x79d 0x0 0x3 0x5e 0x79e 0x877 0x0 0x3 0x5e 0x878 0x903 0x1 0x3 0x5e 0x904 0x95f 0x0 0x3 0x5f 0x960 0xa59 0x0 0x3 0x61 0xabe 0xb29 0x0 0x3 0x61 0xb2a 0xbb5 0x1 0x3 0x61 0xbb6 0xd79 0x0 0x3 0x62 0xd7a 0xdac 0x1 0x3 0x62 0xdad 0xdd1 0x2 0x3 0x62 0xdd2 0xed7 0x0 0x3 0x66 0x1392 0x143b 0x0 0x3 0x67 0x143c 0x149f 0x0 0x3 0x68 0x14a0 0x1503 0x0 0x3 0x6b 0x1662 0x16d9 0x0 0x3 0x6c 0x16da 0x16f2 0x2 0x3 0x6c 0x16f3 0x176f 0x0 0x3 0x6d 0x1770 0x1805 0x0 0x3 0x6e 0x1806 0x1808 0x2 0x3 0x6e 0x1809 0x1931 0x0 0x3 0x6f 0x1932 0x1984 0x1 0x3 0x6f 0x1985 0x19c7 0x0 0x3 0x73 0x1f68 0x1f7a 0x1 0x3 0x73 0x1f7b 0x21b7 0x0 0x3 0x73 0x21b8 0x21f1 0x1 0x3 0x74 0x21f2 0x2214 0x2 0x3 0x74 0x2215 0x234f 0x0 0x3 0x76 0x23fa 0x24ba 0x0 0x3 0x76 0x24bb 0x2511 0x1 0x3 0x76 0x2512 0x2546 0x2 0x3 0x76 0x2547 0x25bb 0x0 0x3 0x77 0x25bc 0x25d9 0x2 0x3 0x77 0x25da 0x2629 0x0 0x3 0x78 0x262a 0x268a 0x1 0x3 0x78 0x268b 0x268d 0x0 0x3 0x7a 0x26c0 0x283d 0x0 0x3 0x7a 0x283e 0x2877 0x1 0x3 0x7c 0x8d68 0x8dfd 0x0 0x3 0x80 0x9376 0x9398 0x1 0x3 0x80 0x9399 0x9569 0x0 0x3 0x81 0x956a 0x96e4 0x0 0x3 0x81 0x96e5 0x96f9 0x1 0x3 0x82 0x96fa 0x98c2 0x0 0x3 0x82 0x98c3 0x994e 0x1 0x3 0x82 0x994f 0x9ae1 0x0 0x3 0x83 0x9ae2 0x9b20 0x1 0x3 0x83 0x9b21 0x9d5c 0x0 0x3 0x83 0x9d5d 0x9de8 0x1 0x3 0x83 0x9de9 0xa025 0x0 0x3 0x83 0xa026 0xa0b1 0x1 0x3 0x83 0xa0b2 0xa275 0x0 0x3 0x84 0xa276 0xa30c 0x0 0x3 0x84 0xa30d 0xa398 0x1 0x3 0x84 0xa399 0xa5d4 0x0 0x3 0x84 0xa5d5 0xa660 0x1 0x3 0x84 0xa661 0xa89d 0x0 0x3 0x84 0xa89e 0xa929 0x1 0x3 0x84 0xa92a 0xaa45 0x0 0x3 0x8a 0xd7c8 0xd813 0x0 0x3 0x8a 0xd814 0xd89f 0x1 0x3 0x8a 0xd8a0 0xdadc 0x0 0x3 0x8a 0xdadd 0xdb68 0x1 0x3 0x8a 0xdb69 0xdda3 0x0 0x3 0x9c 0x10384 0x1045d 0x0 0x3 0x9c 0x1045e 0x104e9 0x1 0x3 0x9c 0x104ea 0x10707 0x0 0x3 0xa1 0x10bea 0x10c9a 0x0 0x3 0xa1 0x10c9b 0x10ce1 0x1 0x3 0xa1 0x10ce2 0x10d26 0x2 0x3 0xa1 0x10d27 0x10d47 0x0 0x4 0x33 0x0 0x0 0x0 0x4 0x34 0x0 0x0 0x0 0x4 0x35 0x0 0x0 0x1 0x4 0x36 0x0 0x0 0x0 0x4 0x37 0x0 0x0 0x2 0x4 0x38 0x0 0x0 0x1 0x5 0x3d 0x0 0x0 0x2 0x5 0x3e 0x0 0x0 0x0 0x5 0x47 0x0 0x0 0x2>; + samsung,fd_on_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 40 40 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,fd_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 80 40 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_grid_on_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 bf 01 00 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,self_grid_off_revA = [29 01 00 00 11 00 03 f0 5a 5a 29 00 00 00 00 00 03 bf 00 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 4c f4 29 00 00 00 00 00 02 f4 28 29 00 00 00 00 00 03 91 01 01 29 00 00 00 00 00 02 53 27 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 40 0a 00 00 00 00 40 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 38 00 00 00 18 03 38 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 24 a4 29 01 00 00 00 00 02 f7 0f 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revA = <0x29000000 0x3f0 0x5a5a2900 0x0 0x4b0004c 0xf4290000 0x2 0xf4282900 0x0 0x3910101 0x29010000 0x253 0x26290000 0x2 0xf70f2901 0x1100 0x3f0a5a5>; + samsung,lpm_off_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 45 0a 00 00 00 00 45 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 3d 00 00 00 18 03 3d 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 26 f0 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_60nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 24]; + samsung,lpm_30nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 25]; + samsung,lpm_10nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 26]; + samsung,lpm_2nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 27]; + samsung,lpm_brightnes_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 02 53 26 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xf>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + samsung,ub-con-det = <0xffffffff 0x5 0x0>; + samsung,esd-irq-gpio1 = <0xffffffff 0x3 0x0>; + phandle = <0xf>; + + qcom,mdss-dsi-display-timings { + + fhd90 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0xf>; + qcom,mdss-dsi-panel-framerate = <0x5a>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x2847>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 0a 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 54 01 0c 00 b4 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 04 b0 00 04 f2 29 00 00 00 00 00 02 f2 54 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 01 00 00 11 00 02 f2 00 29 00 00 00 00 00 04 b0 01 b4 65 29 00 00 00 00 00 21 65 0c 94 0c 5a 0c 30 0b b8 0b 46 0a f6 09 ea 09 08 08 1a 07 12 06 2a 05 12 03 82 02 08 02 08 00 18 29 00 00 00 00 00 04 b0 00 2a 6a 29 00 00 00 00 00 04 6a 07 00 c0 29 01 00 00 11 00 02 f7 0f 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 04 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a 80 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 22 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 02 f7 0f 29 01 00 00 6e 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,panel-roi-alignment = <0x168 0x78 0x168 0x78 0x168 0x78>; + }; + + fhd60 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0x10>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x3dfa>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 0a 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 54 01 0c 00 b4 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 04 b0 00 04 f2 29 00 00 00 00 00 02 f2 54 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 01 00 00 11 00 02 f2 00 29 00 00 00 00 00 04 b0 01 b4 65 29 00 00 00 00 00 21 65 0c 94 0c 5a 0c 30 0b b8 0b 46 0a f6 09 ea 09 08 08 1a 07 12 06 2a 05 12 03 82 02 08 02 08 00 18 29 00 00 00 00 00 04 b0 00 2a 6a 29 00 00 00 00 00 04 6a 07 00 c0 29 01 00 00 11 00 02 f7 0f 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 04 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a 80 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 22 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 02 f7 0f 29 01 00 00 6e 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,panel-roi-alignment = <0x168 0x78 0x168 0x78 0x168 0x78>; + }; + }; + + qcom,panel-supply-entries { + #address-cells = <0x1>; + #size-cells = <0x0>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vci"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vddi"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1b7740>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + }; + }; + }; + }; + + fragment@89 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_PBA_BOOTING_FHD"; + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x0>; + qcom,mdss-dsi-bl-max-level = <0x639c>; + qcom,mdss-brightness-max-level = <0x639c>; + qcom,mdss-dsi-interleave-mode = <0x0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x3c>; + qcom,mdss-pan-physical-height-dimension = <0x6a>; + qcom,mdss-dsi-panel-mode-gpio-state = "invalid"; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + samsung,candela_map_table_revA = <0x0 0x0 0x2 0x5 0x1 0x2 0x2 0x6 0x2 0x3 0x3 0x7 0x3 0x4 0x4 0x8 0x4 0x5 0x5 0x9 0x5 0x6 0x6 0xa 0x6 0x7 0x7 0xb 0x7 0x8 0x8 0xc 0x8 0x9 0x9 0xd 0x9 0xa 0xa 0xe 0xa 0xb 0xb 0xf 0xb 0xc 0xc 0x10 0xc 0xd 0xd 0x11 0xd 0xe 0xe 0x13 0xe 0xf 0xf 0x14 0xf 0x10 0x10 0x15 0x10 0x11 0x11 0x16 0x11 0x12 0x12 0x18 0x12 0x13 0x13 0x19 0x13 0x14 0x14 0x1b 0x14 0x15 0x15 0x1d 0x15 0x16 0x16 0x1e 0x16 0x17 0x18 0x20 0x17 0x19 0x1a 0x22 0x18 0x1b 0x1c 0x25 0x19 0x1d 0x1d 0x27 0x1a 0x1e 0x20 0x29 0x1b 0x21 0x22 0x2c 0x1c 0x23 0x24 0x2f 0x1d 0x25 0x26 0x32 0x1e 0x27 0x28 0x35 0x1f 0x29 0x2b 0x38 0x20 0x2c 0x2e 0x3c 0x21 0x2f 0x31 0x40 0x22 0x32 0x34 0x44 0x23 0x35 0x38 0x48 0x24 0x39 0x3b 0x4d 0x25 0x3c 0x3f 0x52 0x26 0x40 0x43 0x57 0x27 0x44 0x47 0x5d 0x28 0x48 0x4c 0x62 0x29 0x4d 0x50 0x69 0x2a 0x51 0x56 0x6f 0x2b 0x57 0x5b 0x77 0x2c 0x5c 0x61 0x7e 0x2d 0x62 0x68 0x86 0x2e 0x69 0x6e 0x8f 0x2f 0x6f 0x76 0x98 0x30 0x77 0x7d 0xa2 0x31 0x7e 0x85 0xac 0x32 0x86 0x8e 0xb7 0x33 0x8f 0x96 0xc3 0x34 0x97 0xa0 0xcf 0x35 0xa1 0xaa 0xdc 0x36 0xab 0xb5 0xea 0x37 0xb6 0xc1 0xf9 0x38 0xc2 0xcd 0x109 0x39 0xce 0xda 0x11a 0x3a 0xdb 0xe6 0x12c 0x3b 0xe7 0xf2 0x13c 0x3c 0xf3 0xfe 0x14d 0x3d 0xff 0xff 0x168>; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x10>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + phandle = <0x10>; + + qcom,mdss-dsi-display-timings { + + fhd@0 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-front-porch = <0xa4>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-v-back-porch = <0x3>; + qcom,mdss-dsi-v-front-porch = <0x9>; + qcom,mdss-dsi-panel-clockrate = <0x35866480>; + qcom,mdss-dsi-panel-phy-timings = <0x1e0808 0x24220808 0x8020400>; + qcom,mdss-dsi-on-command = [39 01 00 00 78 00 02 11 00]; + qcom,mdss-dsi-off-command = <0x5010000 0x24000128 0x5010000 0x78000110>; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + }; + }; + }; + + fragment@90 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_te { + + sde_te_active { + phandle = <0x9>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + + sde_te_suspend { + phandle = <0xd>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + + pmx_sde { + phandle = <0xd0>; + + sde_dsi_active { + phandle = <0xa>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + bias-disable = <0x0>; + }; + }; + + sde_dsi_suspend { + phandle = <0xe>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable = <0x0>; + }; + }; + }; + }; + }; + + fragment@91 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_ub_det { + + sde_ub_det_default { + pins = "gpio5"; + function = "normal"; + input-enable; + power-source = <0x1>; + bias-disable; + phandle = <0xb>; + }; + }; + }; + }; + + fragment@92 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_fg_err { + + sde_fg_err_default { + pins = "gpio3"; + function = "normal"; + input-enable; + power-source = <0x0>; + bias-disable; + phandle = <0xc>; + }; + }; + }; + }; + + fragment@93 { + target = <0xffffffff>; + + __overlay__ { + + qcom,dsi-display@9 { + label = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + qcom,display-type = "primary"; + phandle = <0xd1>; + }; + + qcom,dsi-display@10 { + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,display-type = "primary"; + phandle = <0xd2>; + }; + }; + }; + + fragment@94 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c000000 0x0 0x9e4000>; + label = "cont_splash_region"; + }; + }; + + fragment@95 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c9e4000 0x0 0x100000>; + label = "dfps_data_region"; + }; + }; + + fragment@96 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c000000 0x0 0x9e4000>; + label = "disp_rdump_region"; + }; + }; + + fragment@97 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x68>; + status = "okay"; + + sm5714@49 { + status = "okay"; + compatible = "siliconmitus,sm5714mfd"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x69>; + sm5714,irq-gpio = <0xffffffff 0x21 0x0>; + sm5714,wakeup; + }; + }; + }; + + fragment@98 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x6a>; + status = "okay"; + + usbpd-sm5714@33 { + status = "okay"; + compatible = "sm5714-usbpd"; + reg = <0x33>; + pinctrl-names = "default"; + pinctrl-0 = <0x6b>; + usbpd,usbpd_int = <0xffffffff 0x68 0x0>; + support_pd_role_swap; + + pdic-manager { + pdic,max_power = <0x1388>; + pdic_op_power = <0x9c4>; + pdic_max_voltage = <0x1770>; + pdic_max_current = <0x7d0>; + pdic,min_current = <0x1f4>; + pdic,giveback = <0x0>; + pdic,usb_com_capable = <0x1>; + pdic,no_usb_suspend = <0x1>; + source,max_voltage = <0x1388>; + source,min_voltage = <0xfa0>; + source,max_power = <0x9c4>; + }; + }; + }; + }; + + fragment@99 { + target = <0xffffffff>; + + __overlay__ { + + if_pmic_irq { + + if_pmic_irq_default { + phandle = <0x69>; + + mux { + pins = "gpio33"; + function = "gpio"; + }; + + config { + pins = "gpio33"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + + usbpd_irq { + + usbpd_irq_default { + phandle = <0x6b>; + + mux { + pins = "gpio104"; + function = "gpio"; + }; + + config { + pins = "gpio104"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + }; + }; + + fragment@100 { + target = <0xffffffff>; + + __overlay__ { + qcom,qusb-phy-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x18 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x46 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + qcom,qusb-phy-host-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x18 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x46 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + }; + }; + + fragment@101 { + target = <0xffffffff>; + + __overlay__ { + + fps_rst { + phandle = <0x6c>; + + mux { + pins = "gpio91"; + function = "gpio"; + }; + + config { + pins = "gpio91"; + bias-pull-down; + }; + }; + }; + }; + + fragment@102 { + target = <0xffffffff>; + + __overlay__ { + regulator-name = "VDD_BTP_3P3"; + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + }; + }; + + fragment@103 { + target = <0xffffffff>; + + __overlay__ { + qcom,set-miso-sampling; + qcom,miso-sampling-ctrl-val = <0x2>; + status = "okay"; + + gw9558-spi@0 { + compatible = "goodix,gw9558x_factory"; + reg = <0x0>; + spi-max-frequency = <0x17d7840>; + pinctrl-names = "default"; + pinctrl-0 = <0x6c>; + gpio-controller; + #gpio-cells = <0x2>; + goodix,btp-regulator = "VDD_BTP_3P3"; + goodix,gpio_reset = <0xffffffff 0x5b 0x0>; + goodix,chip_id = "GW9558"; + goodix,position = "11.81,-0.02,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + goodix,modelinfo = "A525"; + goodix,rb = "547,215,-1,FFFFFF,A9A9A9"; + }; + }; + }; + + fragment@104 { + target = <0xffffffff>; + + __overlay__ { + + gw9558@0 { + compatible = "goodix,gw9558x"; + reg = <0x0>; + spi-max-frequency = <0x17d7840>; + pinctrl-names = "default"; + pinctrl-0 = <0x6c>; + gpio-controller; + #gpio-cells = <0x2>; + goodix,btp-regulator = "VDD_BTP_3P3"; + goodix,gpio_reset = <0xffffffff 0x5b 0x0>; + goodix,chip_id = "GW9558"; + goodix,position = "11.81,-0.02,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + goodix,modelinfo = "A525"; + goodix,rb = "547,215,-1,FFFFFF,A9A9A9"; + }; + }; + }; + + fragment@105 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@106 { + target = <0xffffffff>; + + __overlay__ { + + qcom,flash_0 { + label = "flash"; + qcom,led-name = "led:flash_0"; + qcom,max-current = <0x5dc>; + qcom,default-led-trigger = "flash0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x5dc>; + qcom,duration-ms = <0x500>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + qcom,record-current-ma = <0x12c>; + phandle = <0x6d>; + }; + + qcom,torch_0 { + label = "torch"; + qcom,led-name = "led:torch_0"; + qcom,max-current = <0x1f4>; + qcom,default-led-trigger = "torch0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x12c>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + phandle = <0x6e>; + }; + + qcom,camera-flash@0 { + cell-index = <0x0>; + compatible = "qcom,camera-flash"; + flash-source = <0x6d>; + torch-source = <0x6e>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x77>; + }; + + qcom,cam-res-mgr { + compatible = "qcom,cam-res-mgr"; + shared-gpios = <0x3f>; + pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; + status = "ok"; + pinctrl-0 = <0x6f>; + pinctrl-1 = <0x70>; + }; + }; + }; + + fragment@107 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + sm5714-fled { + compatible = "siliconmitus,sm5714-fled"; + reg = <0x49>; + status = "okay"; + slave-addr = <0x92>; + flash-en-gpio = <0xffffffff 0x16 0x0>; + torch-en-gpio = <0xffffffff 0x43 0x0>; + flash-brightness = <0xf>; + preflash-brightness = <0x7>; + torch-brightness = <0x7>; + factory_current = <0x0>; + timeout = <0xff>; + }; + }; + }; + + fragment@108 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + qcom,ois@62 { + compatible = "qcom,ois"; + cell-index = <0x0>; + reg = <0x62>; + slave-addr = <0xc4>; + slave-id = <0x460>; + cam_vaf-supply = <0x71>; + regulator-names = "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x2ab980>; + rgltr-max-voltage = <0x2ab980>; + rgltr-load-current = <0x30d40>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x72 0x73>; + pinctrl-1 = <0x74 0x75>; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x20 0x0 0xffffffff 0x2b 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x0>; + gpio-custom1 = <0x1>; + gpio-vio = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x0 0x0 0x0>; + gpio-req-tbl-label = "MCU_RESET0", "MCU_BOOT0", "MCU_VIO"; + status = "ok"; + phandle = <0x79>; + }; + }; + }; + + fragment@109 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@0 { + cell-index = <0x0>; + compatible = "qcom,cam-sensor"; + reg = <0x0>; + slave-addr = <0x34>; + csiphy-sd-index = <0x0>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x76>; + led-flash-src = <0x77>; + eeprom-src = <0x78>; + ois-src = <0x79>; + cam_vio-supply = <0x7a>; + cam_vaf-supply = <0x71>; + cam_vana-supply = <0x7b>; + cam_vdig-supply = <0x7c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vaf", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x2ab980 0xf4240 0x0>; + rgltr-max-voltage = <0x1b7740 0x2ab980 0x2c4020 0x10c8e0 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x7d 0x7e 0x7f>; + pinctrl-1 = <0x80 0x81 0x82>; + gpios = <0xffffffff 0xd 0x0 0xffffffff 0x1e 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x1>; + gpio-custom1 = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_VANA0"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x41>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@2 { + cell-index = <0x2>; + compatible = "qcom,cam-sensor"; + reg = <0x3>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x83>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x84 0x85 0x86 0x87>; + pinctrl-1 = <0x88 0x89 0x8a 0x8b>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x2D { + cell-index = <0x2>; + compatible = "qcom,eeprom"; + reg = <0x2d>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x84 0x85 0x86 0x87>; + pinctrl-1 = <0x88 0x89 0x8a 0x8b>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x83>; + }; + + qcom,eeprom@37 { + cell-index = <0x3>; + compatible = "qcom,eeprom"; + reg = <0x37>; + slave-addr = <0x6e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_vdig-supply = <0x8c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x8d 0x8e 0x8f>; + pinctrl-1 = <0x90 0x91 0x92>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x9a>; + }; + }; + }; + + fragment@110 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@1 { + cell-index = <0x1>; + compatible = "qcom,cam-sensor"; + reg = <0x1>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x93>; + cam_vio-supply = <0x7a>; + cam_vana-supply = <0x94>; + cam_vdig-supply = <0x95>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x96 0x97>; + pinctrl-1 = <0x98 0x99>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@8 { + cell-index = <0x8>; + compatible = "qcom,cam-sensor"; + reg = <0x8>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x93>; + cam_vio-supply = <0x7a>; + cam_vana-supply = <0x94>; + cam_vdig-supply = <0x95>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x96 0x97>; + pinctrl-1 = <0x98 0x99>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@3 { + cell-index = <0x3>; + compatible = "qcom,cam-sensor"; + reg = <0x2>; + slave-addr = <0x6e>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x9a>; + cam_vio-supply = <0x7a>; + cam_vdig-supply = <0x8c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x8d 0x8e 0x8f>; + pinctrl-1 = <0x90 0x91 0x92>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@4 { + cell-index = <0x4>; + compatible = "qcom,cam-sensor"; + reg = <0x4>; + slave-addr = <0x7e>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + led-flash-src = <0x77>; + eeprom-src = <0x9b>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x9c 0x9d 0x9e 0x87>; + pinctrl-1 = <0x9f 0xa0 0xa1 0x8b>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x40 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + cam_vdig-supply = <0x8c>; + phandle = <0xd3>; + }; + + qcom,eeprom@0x3F { + cell-index = <0x4>; + compatible = "qcom,eeprom"; + reg = <0x3f>; + slave-addr = <0x7e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x9c 0x9d 0x9e 0x87>; + pinctrl-1 = <0x9f 0xa0 0xa1 0x8b>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x40 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + cam_vdig-supply = <0x8c>; + phandle = <0x9b>; + }; + }; + }; + + fragment@111 { + target = <0xffffffff>; + + __overlay__ { + + qcom,actuator@0xC { + cell-index = <0x0>; + reg = <0xc>; + slave-addr = <0x18>; + compatible = "i2c_actuator"; + rgltr-cntrl-support; + cam_vio-supply = <0x7a>; + cam_vaf-supply = <0x71>; + regulator-names = "cam_vio", "cam_vaf"; + rgltr-min-voltage = <0x1b7740 0x2ab980>; + rgltr-max-voltage = <0x1b7740 0x2ab980>; + rgltr-load-current = <0x30d40 0x30d40>; + phandle = <0x76>; + }; + + qcom,eeprom@50 { + cell-index = <0x0>; + reg = <0x50>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa0>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1 0x1>; + qcom,cam-power-seq-delay = <0x2 0x2>; + cam_vaf-supply = <0x71>; + cam_vio-supply = <0x7a>; + regulator-names = "cam_vaf", "cam_vio"; + rgltr-min-voltage = <0x2ab980 0x1b7740>; + rgltr-max-voltage = <0x2ab980 0x1b7740>; + rgltr-load-current = <0x30d40 0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + phandle = <0x78>; + }; + + qcom,eeprom@51 { + cell-index = <0x1>; + reg = <0x51>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa2>; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x2>; + cam_vio-supply = <0x7a>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-mode = <0x0>; + sensor-position = <0x1>; + rgltr-cntrl-support; + phandle = <0x93>; + }; + }; + }; + + fragment@112 { + target = <0xffffffff>; + + __overlay__ { + + samsung,vibrator { + compatible = "samsung_vib"; + samsung,vib_type = "COINDC"; + status = "ok"; + phandle = <0xd4>; + }; + }; + }; + + fragment@113 { + target = <0xffffffff>; + + __overlay__ { + + nfc_qupv3_se0_i2c_sleep { + phandle = <0xa2>; + + mux { + pins = "gpio34", "gpio35"; + function = "gpio"; + }; + + config { + pins = "gpio34", "gpio35"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + nfc_clk_req_gpio { + phandle = <0xa3>; + + mux { + pins = "gpio31"; + function = "gpio"; + }; + + config { + pins = "gpio31"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_irq_gpio { + phandle = <0xa4>; + + mux { + pins = "gpio37"; + function = "gpio"; + }; + + config { + pins = "gpio37"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_ven_gpio { + phandle = <0xa5>; + + mux { + pins = "gpio12"; + function = "gpio"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-high; + }; + }; + + nfc_firm_gpio { + phandle = <0xa6>; + + mux { + pins = "gpio36"; + function = "gpio"; + }; + + config { + pins = "gpio36"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + nfc_ldo_en_gpio { + phandle = <0xa7>; + + mux { + pins = "gpio68"; + function = "gpio"; + }; + + config { + pins = "gpio68"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@114 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + pinctrl-1 = <0xa2>; + qcom,clk-freq-out = <0x61a80>; + + sec-nfc@27 { + compatible = "sec-nfc"; + reg = <0x27>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + sec-nfc,ven-gpio = <0xffffffff 0xc 0x0>; + sec-nfc,irq-gpio = <0xffffffff 0x25 0x0>; + sec-nfc,firm-gpio = <0xffffffff 0x24 0x0>; + sec-nfc,clk_req-gpio = <0xffffffff 0x1f 0x0>; + sec-nfc,pvdd-gpio = <0xffffffff 0x44 0x0>; + sec-nfc,clk_req_wake; + sec-nfc,bootloader_ver = <0x6>; + pinctrl-names = "default"; + pinctrl-0 = <0xa3 0xa4 0xa5 0xa6 0xa7>; + }; + }; + }; + + fragment@115 { + target = <0xffffffff>; + + __overlay__ { + + hall { + status = "okay"; + compatible = "hall"; + linux,input-type = <0x1>; + linux,code = <0x15>; + hall,gpio_flip_cover = <0xffffffff 0xa 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa8>; + }; + }; + }; + + fragment@116 { + target = <0xffffffff>; + + __overlay__ { + + hall { + + hall_default { + pins = "gpio10"; + function = "normal"; + output-disable; + input-enable; + bias-disable; + power-source = <0x0>; + phandle = <0xa8>; + }; + }; + }; + }; + + fragment@abc { + target-path = [2f 00]; + + __overlay__ { + + sec_abc { + compatible = "samsung,sec_abc"; + status = "okay"; + + gpu { + gpu,label = "GPU fault"; + gpu,threshold_count = <0x4>; + gpu,threshold_time = <0x4b0>; + }; + + gpu_page { + gpu_page,label = "GPU page fault"; + gpu_page,threshold_count = <0x14>; + gpu_page,threshold_time = <0x4b0>; + }; + + aicl { + aicl,label = "battery aicl"; + aicl,threshold_count = <0x5>; + aicl,threshold_time = <0x12c>; + }; + }; + + abc_hub { + compatible = "samsung,abc_hub"; + status = "okay"; + + bootc { + bootc,time_spec_user = <0x186a0>; + bootc,time_spec_eng = <0x186a0>; + bootc,time_spec_fac = <0x186a0>; + }; + }; + }; + }; + + fragment@117 { + target = <0xffffffff>; + + __overlay__ { + + rpmh-regulator-ldoc8 { + compatible = "qcom,rpmh-vrm-regulator"; + mboxes = <0xffffffff 0x0>; + qcom,resource-name = "ldoc8"; + qcom,regulator-type = "pmic5-ldo"; + qcom,supported-modes = <0x2 0x4>; + qcom,mode-threshold-currents = <0x0 0x1>; + + regulator-pm6150l-l8 { + regulator-name = "pm6150l_l8"; + qcom,set = <0x3>; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + qcom,init-voltage = <0x1b7740>; + regulator-always-on; + qcom,init-mode = <0x2>; + phandle = <0xd5>; + }; + }; + + rpmh-regulator-ldoa5 { + + regulator-pm6150-l5 { + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + regulator-always-on; + phandle = <0xd6>; + }; + }; + + i2c@17 { + status = "ok"; + cell-index = <0x11>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x33 0x0 0xffffffff 0x34 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0xa9>; + phandle = <0xd7>; + + sx9360-i2c@28 { + compatible = "sx9360"; + reg = <0x28>; + pinctrl-names = "default"; + pinctrl-0 = <0xaa>; + interrupt-parent = <0xffffffff>; + interrupts = <0x4 0xc4 0x0 0x2>; + sx9360,nirq-gpio = <0xffffffff 0x5 0x1>; + sx9360,reggnrlctrl2_reg = <0x32>; + sx9360,againfreq_reg = <0x38>; + sx9360,refagainfreq_reg = <0x36>; + sx9360,gainrawfilt_reg = <0x1a>; + sx9360,refgainrawfilt_reg = <0x22>; + sx9360,proxthresh_reg = <0x1d>; + sx9360,hyst_reg = <0x35>; + sx9360,regproxctrl3_reg = <0xd>; + sx9360,resolution_reg = <0xf>; + sx9360,refresolution_reg = <0xf>; + sx9360,hallic_cert_detect = <0x1>; + }; + }; + }; + }; + + fragment@118 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x48 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6d 0x72 0x73 0x74 0x75 0x76>; + }; + }; + + fragment@119 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@120 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0xb 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x37 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6b 0x6d 0x72 0x73 0x74 0x76>; + }; + }; + + fragment@121 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@122 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0xb 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6b 0x6d 0x72 0x73 0x74 0x76>; + }; + }; + + fragment@123 { + target = <0xffffffff>; + + __overlay__ { + + bat_thm { + label = "bat_thm"; + reg = <0x4f>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + + chg_thm { + label = "chg_thm"; + reg = <0x4d>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + }; + }; + + fragment@124 { + target = <0xffffffff>; + + __overlay__ { + + battery { + pinctrl-names = "default"; + battery,chip_vendor = "QCOM"; + status = "okay"; + compatible = "samsung,sec-battery"; + battery,vendor = "Battery"; + battery,charger_name = "sm5714-charger"; + battery,fuelgauge_name = "sm5714-fuelgauge"; + battery,fgsrc_switch_name = "sm5714-fuelgauge"; + battery,technology = <0x2>; + battery,batt_data_version = <0x1>; + battery,temp_adc_type = <0x1>; + battery,temp_channel_raw = <0x1>; + battery,adc_check_count = <0x5>; + battery,temp_check_type = <0x1>; + battery,chg_temp_check_type = <0x1>; + battery,thermal_source = <0x2>; + battery,chg_thermal_source = <0x2>; + battery,temp_table_adc = <0x76c 0x923 0xab2 0xc97 0xec8 0x114f 0x146a 0x1803 0x1c2e 0x20e2 0x25c4 0x2b7f 0x31eb 0x386a 0x3f07 0x45a1 0x4be0 0x51ec 0x5774 0x5c67 0x609d 0x6442 0x6755>; + battery,temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,chg_temp_table_adc = <0x6d6 0x889 0xa14 0xbe2 0xe04 0x107c 0x137e 0x170b 0x1b0d 0x1f93 0x2479 0x2a3c 0x3072 0x3719 0x3da0 0x43e4 0x4aa7 0x50aa 0x5651 0x5b61 0x5fd6 0x637c 0x66ca>; + battery,chg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,polling_time = <0xa 0x1e 0x1e 0x1e 0xe10>; + battery,cable_check_type = <0x4>; + battery,cable_source_type = <0x1>; + battery,polling_type = <0x1>; + battery,monitor_initial_count = <0x0>; + battery,battery_check_type = <0x0>; + battery,ovp_uvlo_check_type = <0x3>; + battery,temp_check_count = <0x1>; + battery,overheatlimit_threshold = <0x2bc>; + battery,overheatlimit_recovery = <0x2a8>; + battery,wire_warm_overheat_thresh = <0x1f4>; + battery,wire_normal_warm_thresh = <0x1a4>; + battery,wire_cool1_normal_thresh = <0xb4>; + battery,wire_cool2_cool1_thresh = <0x96>; + battery,wire_cool3_cool2_thresh = <0x32>; + battery,wire_cold_cool3_thresh = <0x0>; + battery,wire_warm_current = <0x61b>; + battery,wire_cool1_current = <0xaf0>; + battery,wire_cool2_current = <0x417>; + battery,wire_cool3_current = <0x1b5>; + battery,low_temp_topoff = <0xe1>; + battery,high_temp_topoff = <0xe1>; + battery,low_temp_float = <0x111c>; + battery,high_temp_float = <0x1036>; + battery,full_check_type = <0x7>; + battery,full_check_type_2nd = <0x7>; + battery,full_check_count = <0x1>; + battery,chg_gpio_full_check = <0x0>; + battery,chg_polarity_full_check = <0x1>; + battery,chg_high_temp = <0x22b>; + battery,chg_high_temp_recovery = <0x212>; + battery,chg_input_limit_current = <0x3e8>; + battery,chg_charging_limit_current = <0x578>; + battery,wpc_temp_control_source = <0x1>; + battery,wpc_high_temp = <0x17c>; + battery,wpc_high_temp_recovery = <0x168>; + battery,wpc_input_limit_current = <0x258>; + battery,wpc_charging_limit_current = <0x3e8>; + battery,wpc_temp_lcd_on_control_source = <0x1>; + battery,wpc_lcd_on_high_temp = <0x17c>; + battery,wpc_lcd_on_high_temp_rec = <0x168>; + battery,wpc_lcd_on_input_limit_current = <0x1c2>; + battery,wpc_store_high_temp = <0x168>; + battery,wpc_store_high_temp_recovery = <0x154>; + battery,wpc_store_charging_limit_current = <0x190>; + battery,wpc_store_lcd_on_high_temp = <0x168>; + battery,wpc_store_lcd_on_high_temp_rec = <0x12c>; + battery,wpc_store_lcd_on_charging_limit_current = <0x190>; + battery,sleep_mode_limit_current = <0x1f4>; + battery,wc_full_input_limit_current = <0x64>; + battery,mix_high_temp = <0x1a4>; + battery,mix_high_chg_temp = <0x1f4>; + battery,mix_high_temp_recovery = <0x186>; + battery,full_condition_type = <0x9>; + battery,full_condition_soc = <0x5d>; + battery,full_condition_vcell = <0x10ea>; + battery,recharge_check_count = <0x1>; + battery,recharge_condition_type = <0x4>; + battery,recharge_condition_soc = <0x62>; + battery,recharge_condition_vcell = <0x10d6>; + battery,charging_total_time = <0x3840>; + battery,hv_charging_total_time = <0x2a30>; + battery,normal_charging_total_time = <0x4650>; + battery,usb_charging_total_time = <0x8ca0>; + battery,recharging_total_time = <0x1518>; + battery,charging_reset_time = <0x0>; + battery,chg_float_voltage = <0x111c>; + battery,pre_afc_work_delay = <0x7d0>; + battery,pre_wc_afc_work_delay = <0xfa0>; + battery,pre_afc_input_current = <0x1f4>; + battery,pre_wc_afc_input_current = <0x1f4>; + battery,prepare_ta_delay = <0x0>; + battery,swelling_high_rechg_voltage = <0xfa0>; + battery,swelling_low_rechg_voltage = <0x1086>; + battery,siop_input_limit_current = <0x4b0>; + battery,siop_charging_limit_current = <0x3e8>; + battery,siop_hv_input_limit_current = <0x2bc>; + battery,siop_hv_input_limit_current_2nd = <0x226>; + battery,siop_hv_charging_limit_current = <0x3e8>; + battery,ttf_hv_charge_current = <0xa28>; + battery,ttf_dc25_charge_current = <0xed8>; + battery,rp_current_rp1 = <0x1f4>; + battery,rp_current_rp2 = <0x5dc>; + battery,rp_current_rp3 = <0xbb8>; + battery,rp_current_rdu_rp3 = <0x834>; + battery,rp_current_abnormal_rp3 = <0x708>; + battery,pd_charging_charge_power = <0x3a98>; + battery,max_charging_current = <0xaf0>; + battery,wireless_cc_cv = <0x55>; + battery,wireless_otg_input_current = <0x384>; + battery,age_data = <0x0 0x111c 0x10d6 0x10b8 0x5d 0x12c 0x1108 0x10c2 0x10a4 0x5c 0x190 0x10f4 0x10ae 0x1090 0x5b 0x2bc 0x10e0 0x109a 0x107c 0x5a 0x3e8 0x10ae 0x1068 0x104a 0x59>; + battery,health_condition = <0x384 0x0 0x4b0 0x0 0x5dc 0x0>; + battery,standard_curr = <0xe42>; + battery,expired_time = <0x23a0>; + battery,recharging_expired_time = <0x1518>; + battery,battery_full_capacity = <0x1388>; + battery,cisd_max_voltage_thr = <0x1388>; + battery,max_input_voltage = <0x2328>; + battery,max_input_current = <0xbb8>; + battery,cisd_alg_index = <0x8>; + battery,ignore_cisd_index = <0x0 0x3c0>; + battery,ignore_cisd_index_d = <0x0 0x78>; + battery,ttf_capacity = <0xf28>; + battery,cv_data = <0xe36 0x358 0x51b 0xd81 0x362 0x4f2 0xcc6 0x36b 0x4ca 0xc27 0x371 0x4ab 0xb78 0x379 0x483 0xac8 0x380 0x45a 0xa4a 0x387 0x433 0x9b2 0x38c 0x413 0x93e 0x393 0x3ea 0x89d 0x399 0x3c1 0x84b 0x39e 0x39c 0x7e3 0x3a2 0x37e 0x78a 0x3a6 0x35c 0x708 0x3ab 0x334 0x6ae 0x3b0 0x305 0x667 0x3b4 0x2e2 0x60b 0x3b8 0x2ba 0x5a7 0x3bc 0x291 0x562 0x3be 0x26f 0x543 0x3c2 0x24a 0x4a4 0x3c5 0x221 0x496 0x3cb 0x1d8 0x43e 0x3ce 0x1b2 0x427 0x3d1 0x189 0x3f0 0x3d4 0x160 0x3d1 0x3dc 0xda 0x36e 0x3e0 0x9b 0x366 0x3e2 0x7c 0x300 0x3e6 0x3e 0x2f5 0x3e8 0x0>; + io-channels = <0xffffffff 0x4f 0xffffffff 0x4d>; + io-channel-names = "adc-temp", "adc-chg-temp"; + }; + + sm5714-fuelgauge { + status = "okay"; + fuelgauge,fuel_alert_soc = <0x1>; + fuelgauge,capacity_max = <0x3e8>; + fuelgauge,capacity_max_margin = <0x12c>; + fuelgauge,capacity_min = <0x0>; + fuelgauge,capacity_calculation_type = <0x1f>; + fuelgauge,using_temp_compensation; + fuelgauge,low_temp_limit = <0x64>; + fuelgauge,using_hw_vempty; + fuelgauge,sw_v_empty_voltage = <0xc80>; + fuelgauge,sw_v_empty_voltage_cisd = <0xc1c>; + fuelgauge,sw_v_empty_recover_voltage = <0xd98>; + fuelgauge,capacity = <0x1388>; + + battery_params { + battery,id = <0x0>; + battery0,battery_type = <0x114e 0x1f20>; + battery0,battery_table0 = <0x1400 0x1b73 0x1c4b 0x1d38 0x1d68 0x1d7a 0x1d88 0x1d8f 0x1db4 0x1dea 0x1e0d 0x1e42 0x1e88 0x1eb4 0x1f01 0x1f3d 0x1f76 0x1fc7 0x2023 0x207f 0x2116 0x2190 0x2272 0x2400>; + battery0,battery_table1 = <0x0 0x99 0x219 0x4b3 0x5cc 0x74c 0xb80 0xd19 0xfb3 0x14e6 0x1a19 0x1f4c 0x29b3 0x2ee6 0x36b3 0x3be6 0x3e80 0x4119 0x464c 0x4b80 0x534c 0x5880 0x6400 0x6419>; + battery0,battery_table2 = <0x4b4b 0x4444 0x4040 0x3e3e 0x3c3c 0x3b3b 0x3838 0x3737 0x3535 0x3434 0x3434 0x3333 0x3333 0x3333 0x3333 0x3232>; + battery0,rs_value = <0x66 0x66 0x3800 0x199 0x599 0x599 0x100>; + battery0,v_alarm = <0xce4 0x0>; + battery0,topoff = <0x28a>; + battery0,i_cal = <0x0 0x0 0x800 0x800 0x0 0x0 0x7f0 0x81b>; + battery0,v_cal = <0x1 0x0 0x0 0x1 0x0 0x0 0x0>; + battery0,temp_std = <0x19>; + battery0,tem_poff = <0xd7a 0x32 0xd16 0x32>; + battery0,aux_ctrl = <0x322 0x5800>; + battery0,data_ver = <0x7>; + battery0,v_max_table = <0x2272 0x2250 0x222e 0x220c 0x21b7>; + battery0,q_max_table = <0x1f20 0x1e9f 0x1e1e 0x1d9d 0x1c5b>; + }; + }; + + cable-info { + default_input_current = <0x708>; + default_charging_current = <0x834>; + full_check_current_1st = <0x28a>; + full_check_current_2nd = <0xe1>; + + current_group_1 { + cable_number = <0x2 0x13 0x15 0x16 0x17 0x1e>; + input_current = <0x1f4>; + charging_current = <0x1f4>; + }; + + current_group_2 { + cable_number = <0x19 0x1f>; + input_current = <0x3e8>; + charging_current = <0x3e8>; + }; + + current_group_3 { + cable_number = <0x5 0x20>; + input_current = <0x5dc>; + charging_current = <0x5dc>; + }; + + current_group_4 { + cable_number = <0x6 0x7 0x8 0x11 0x12>; + input_current = <0x672>; + charging_current = <0xaf0>; + }; + + current_group_5 { + cable_number = <0x9>; + input_current = <0x672>; + charging_current = <0xc4e>; + }; + + current_group_6 { + cable_number = <0xa 0xc 0xf 0x1b 0x21 0x24>; + input_current = <0x320>; + charging_current = <0x960>; + }; + + current_group_7 { + cable_number = <0xd>; + input_current = <0x2bc>; + charging_current = <0x960>; + }; + + current_group_8 { + cable_number = <0x18>; + input_current = <0x3e8>; + charging_current = <0x1c2>; + }; + + current_group_9 { + cable_number = <0x23>; + input_current = <0x708>; + charging_current = <0x708>; + }; + + current_group_10 { + cable_number = <0xb 0xe 0x10 0x1c 0x23>; + input_current = <0x28a>; + charging_current = <0x960>; + }; + + current_group_11 { + cable_number = <0x1d 0x25>; + input_current = <0x1f4>; + charging_current = <0x4b0>; + }; + + current_group_12 { + cable_number = <0x1 0x4>; + input_current = <0x1db>; + charging_current = <0x226>; + }; + + current_group_13 { + cable_number = <0x22>; + input_current = <0x4b0>; + charging_current = <0x960>; + }; + }; + }; + }; + + fragment@125 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + + pca9468@57 { + compatible = "nxp,pca9468"; + reg = <0x57>; + pinctrl-names = "default"; + pca9468,input-current-limit = <0x26e8f0>; + pca9468,charging-current = <0x5b8d80>; + pca9468,input-itopoff = <0x7a120>; + pca9468,sense-resistance = <0x0>; + pca9468,switching-frequency = <0x3>; + pca9468,ntc-threshold = <0x0>; + pca9468,ta-mode = <0x1>; + pca9468,pps_reqen; + }; + }; + }; + + fragment@126 { + target = <0xffffffff>; + + __overlay__ { + + sec-direct-charger { + status = "okay"; + compatible = "samsung,sec-direct-charger"; + charger,battery_name = "battery"; + charger,main_charger = "sm5714-charger"; + charger,direct_charger = "pca9468-charger"; + charger,dchg_min_current = <0x7d0>; + charger,dchg_temp_low_threshold = <0xb4>; + charger,dchg_temp_high_threshold = <0x1a4>; + }; + + battery { + battery,charger_name = "sec-direct-charger"; + battery,dchg_temp_check_type = <0x1>; + battery,dchg_thermal_source = <0x3>; + battery,dchg_temp_table_adc = <0x19a28 0x1f806 0x25cd4 0x2cacc 0x35442 0x3f00c 0x4a754 0x58344 0x683dc 0x79ff2 0x8ce5c 0xa33c2 0xbbdd0 0xd5108 0xeed6a 0x1080a2 0x1213da 0x138b94 0x14dea6 0x16163a 0x171ffc 0x180e40 0x18ceb2>; + battery,dchg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,dc_step_chg_type = <0xe9>; + battery,dc_step_chg_charge_power = <0x55f0>; + battery,dc_step_chg_step = <0x3>; + battery,dc_step_chg_cond_vol = <0xfff 0x107c 0x111c>; + battery,dc_step_chg_cond_iin = <0x7ee 0x721 0x0>; + battery,dc_step_chg_iin_check_cnt = <0x3>; + battery,dc_step_chg_cond_soc = <0xc 0x32 0x64>; + battery,dc_step_chg_val_vfloat = <0xfff 0x107c 0x111c>; + battery,dc_step_chg_val_iout = <0x1388 0xfdc 0xe42>; + }; + }; + }; + + __symbols__ { + dsi_rm69299_visionox_amoled_video = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video"; + dsi_rm69299_visionox_amoled_cmd = "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd"; + dsi_sim_vid = "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video"; + dsi_sim_cmd = "/fragment@3/__overlay__/qcom,mdss_dsi_sim_cmd"; + dsi_sim_dsc_375_cmd = "/fragment@4/__overlay__/qcom,mdss_dsi_sim_dsc_375_cmd"; + dsi_nt36672c_video = "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video"; + dsi_panel_pwr_supply = "/fragment@6/__overlay__/dsi_panel_pwr_supply"; + dsi_panel_pwr_supply_no_labibb = "/fragment@6/__overlay__/dsi_panel_pwr_supply_no_labibb"; + dsi_panel_pwr_supply_labibb_amoled = "/fragment@6/__overlay__/dsi_panel_pwr_supply_labibb_amoled"; + dsi_rm69299_visionox_amoled_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@0"; + dsi_rm69299_visionox_amoled_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@1"; + dsi_sim_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@2"; + dsi_sim_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@3"; + dsi_sim_dsc_375_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@4"; + dsi_nt36672c_video_display = "/fragment@6/__overlay__/qcom,dsi-display@5"; + sde_dsi = "/fragment@6/__overlay__/qcom,dsi-display"; + sde_wb = "/fragment@6/__overlay__/qcom,wb-display@0"; + ext_disp = "/fragment@6/__overlay__/qcom,msm-ext-disp"; + ext_disp_audio_codec = "/fragment@6/__overlay__/qcom,msm-ext-disp/qcom,msm-ext-disp-audio-codec-rx"; + mtp_batterydata = "/fragment@11/__overlay__/qcom,battery-data"; + lpi_tlmm = "/fragment@27/__overlay__/lpi_pinctrl@627C0000"; + cdc_dmic01_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_active"; + cdc_dmic01_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_sleep"; + cdc_dmic01_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_active"; + cdc_dmic01_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_sleep"; + cdc_dmic23_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_active"; + cdc_dmic23_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_sleep"; + cdc_dmic23_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_active"; + cdc_dmic23_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_sleep"; + cdc_dmic45_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_active"; + cdc_dmic45_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_sleep"; + cdc_dmic45_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_active"; + cdc_dmic45_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_sleep"; + tx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_sleep"; + tx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_active"; + tx_swr_data0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_sleep"; + tx_swr_data0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_active"; + wsa_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_sleep"; + wsa_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_active"; + wsa_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_sleep"; + wsa_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_active"; + tx_swr_data1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_sleep"; + tx_swr_data1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_active"; + tx_swr_data2_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_sleep"; + tx_swr_data2_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_active"; + rx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_sleep"; + rx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_active"; + rx_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_sleep"; + rx_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_active"; + lpi_i2s1_sck_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_active"; + lpi_i2s1_sck_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_sleep"; + lpi_i2s1_ws_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_active"; + lpi_i2s1_ws_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_sleep"; + lpi_i2s1_sd0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_active"; + lpi_i2s1_sd0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_sleep"; + lpi_i2s1_sd1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_active"; + lpi_i2s1_sd1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_sleep"; + tx_macro = "/fragment@28/__overlay__/tx-macro@62620000"; + swr2 = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master"; + wcd938x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd938x-tx-slave"; + wcd937x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd937x-tx-slave"; + rx_macro = "/fragment@28/__overlay__/rx-macro@62600000"; + swr1 = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master"; + wcd938x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd938x-rx-slave"; + wcd937x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd937x-rx-slave"; + wsa_macro = "/fragment@28/__overlay__/wsa-macro@62640000"; + swr0 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master"; + wsa881x_0211 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211"; + wsa881x_0212 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212"; + wsa881x_0213 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213"; + wsa881x_0214 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214"; + va_macro = "/fragment@28/__overlay__/va-macro@62770000"; + wcd938x_codec = "/fragment@28/__overlay__/wcd938x-codec"; + wcd937x_codec = "/fragment@28/__overlay__/wcd937x-codec"; + cdc_dmic01_gpios = "/fragment@30/__overlay__/cdc_dmic01_pinctrl"; + cdc_dmic23_gpios = "/fragment@30/__overlay__/cdc_dmic23_pinctrl"; + cdc_dmic45_gpios = "/fragment@30/__overlay__/cdc_dmic45_pinctrl"; + wsa_swr_gpios = "/fragment@30/__overlay__/wsa_swr_clk_data_pinctrl"; + rx_swr_gpios = "/fragment@30/__overlay__/rx_swr_clk_data_pinctrl"; + tx_swr_gpios = "/fragment@30/__overlay__/tx_swr_clk_data_pinctrl"; + wsa_spkr_en1 = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl"; + wsa_spkr_en2 = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl"; + wcd_rst_gpio = "/fragment@31/__overlay__/msm_cdc_pinctrl@58"; + clock_audio_wsa_1 = "/fragment@31/__overlay__/wsa_core_clk"; + clock_audio_wsa_2 = "/fragment@31/__overlay__/wsa_npl_clk"; + clock_audio_rx_1 = "/fragment@31/__overlay__/rx_core_clk"; + clock_audio_rx_2 = "/fragment@31/__overlay__/rx_npl_clk"; + clock_audio_tx_1 = "/fragment@31/__overlay__/tx_core_clk"; + clock_audio_tx_2 = "/fragment@31/__overlay__/tx_npl_clk"; + clock_audio_va_1 = "/fragment@31/__overlay__/va_core_clk"; + clock_audio_va_2 = "/fragment@31/__overlay__/va_npl_clk"; + qupv3_se8_2hsuart = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000"; + qupv3_se8_2hsuart_pins = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins"; + qupv3_se8_2uart_tx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_active"; + qupv3_se8_2uart_rx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_active"; + qupv3_se8_2uart_tx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_sleep"; + qupv3_se8_2uart_rx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_sleep"; + sec_debug_region = "/fragment@37/__overlay__/sec_debug_region@0"; + sec_debug_autocomment = "/fragment@37/__overlay__/sec_debug_autocomment@0"; + sec_debug_rdx_bootdev = "/fragment@37/__overlay__/sec_debug_rdx_bootdev@0"; + kaslr_region = "/fragment@37/__overlay__/kaslr_region@A0001000"; + rkp_region = "/fragment@37/__overlay__/rkp_region@B0200000"; + hdm_region = "/fragment@37/__overlay__/hdm_region@A1000000"; + modem_shared_mem = "/fragment@37/__overlay__/modem_shared_mem_region@B5000000"; + usb_noti = "/fragment@60/__overlay__/usb-notifier"; + imp_list = "/fragment@65/__overlay__/imp_list"; + cdc_quin_mi2s_gpios = "/fragment@66/__overlay__/msm_cdc_pinctrl_quin"; + samsung_q6audio_adaptation = "/fragment@67/__overlay__/samsung,q6audio-adaptation"; + det_zones = "/fragment@67/__overlay__/det_zones"; + i2c_18 = "/fragment@67/__overlay__/i2c@18"; + tas256x = "/fragment@67/__overlay__/i2c@18/tas256x@4c"; + tas25xx_gpio_default = "/fragment@70/__overlay__/tas25xx_gpio_default"; + fm_lna_default = "/fragment@70/__overlay__/fm_lna_default"; + grip_i2c_active = "/fragment@71/__overlay__/grip_i2c/grip_i2c_active"; + grip_i2c_suspend = "/fragment@71/__overlay__/grip_i2c/grip_i2c_suspend"; + s2mpb03_i2c_sda_default = "/fragment@71/__overlay__/s2mpb03_i2c_sda_default"; + s2mpb03_i2c_scl_default = "/fragment@71/__overlay__/s2mpb03_i2c_scl_default"; + cam_sensor_mclk0_active = "/fragment@71/__overlay__/cam_sensor_mclk0_active"; + cam_sensor_mclk0_suspend = "/fragment@71/__overlay__/cam_sensor_mclk0_suspend"; + cam_sensor_mclk1_active = "/fragment@71/__overlay__/cam_sensor_mclk1_active"; + cam_sensor_mclk1_suspend = "/fragment@71/__overlay__/cam_sensor_mclk1_suspend"; + cam_sensor_mclk2_active = "/fragment@71/__overlay__/cam_sensor_mclk2_active"; + cam_sensor_mclk2_suspend = "/fragment@71/__overlay__/cam_sensor_mclk2_suspend"; + cam_sensor_mclk3_active = "/fragment@71/__overlay__/cam_sensor_mclk3_active"; + cam_sensor_mclk3_suspend = "/fragment@71/__overlay__/cam_sensor_mclk3_suspend"; + cam_sensor_mclk4_active = "/fragment@71/__overlay__/cam_sensor_mclk4_active"; + cam_sensor_mclk4_suspend = "/fragment@71/__overlay__/cam_sensor_mclk4_suspend"; + rcam1_sensor_reset_active = "/fragment@71/__overlay__/rcam1_sensor_reset_active"; + rcam1_sensor_reset_suspend = "/fragment@71/__overlay__/rcam1_sensor_reset_suspend"; + front_sensor_reset_active = "/fragment@71/__overlay__/front_sensor_reset_active"; + front_sensor_reset_suspend = "/fragment@71/__overlay__/front_sensor_reset_suspend"; + rcam3_sensor_reset_active = "/fragment@71/__overlay__/rcam3_sensor_reset_active"; + rcam3_sensor_reset_suspend = "/fragment@71/__overlay__/rcam3_sensor_reset_suspend"; + rcam2_sensor_reset_active = "/fragment@71/__overlay__/rcam2_sensor_reset_active"; + rcam2_sensor_reset_suspend = "/fragment@71/__overlay__/rcam2_sensor_reset_suspend"; + rcam4_sensor_reset_active = "/fragment@71/__overlay__/rcam4_sensor_reset_active"; + rcam4_sensor_reset_suspend = "/fragment@71/__overlay__/rcam4_sensor_reset_suspend"; + rcam1_sensor_vana_active = "/fragment@71/__overlay__/rcam1_sensor_vana_active"; + rcam1_sensor_vana_suspend = "/fragment@71/__overlay__/rcam1_sensor_vana_suspend"; + rcam2_sensor_vana_active = "/fragment@71/__overlay__/rcam2_sensor_vana_active"; + rcam2_sensor_vana_suspend = "/fragment@71/__overlay__/rcam2_sensor_vana_suspend"; + rcam3_sensor_vana_active = "/fragment@71/__overlay__/rcam3_sensor_vana_active"; + rcam3_sensor_vana_suspend = "/fragment@71/__overlay__/rcam3_sensor_vana_suspend"; + rcam4_sensor_vana_active = "/fragment@71/__overlay__/rcam4_sensor_vana_active"; + rcam4_sensor_vana_suspend = "/fragment@71/__overlay__/rcam4_sensor_vana_suspend"; + cam_mipi_sel_active = "/fragment@71/__overlay__/cam_mipi_sel_active"; + cam_mipi_sel_suspend = "/fragment@71/__overlay__/cam_mipi_sel_suspend"; + rcam2_sensor_vdig_active = "/fragment@71/__overlay__/rcam2_sensor_vdig_active"; + rcam2_sensor_vdig_suspend = "/fragment@71/__overlay__/rcam2_sensor_vdig_suspend"; + rcam4_sensor_vdig_active = "/fragment@71/__overlay__/rcam4_sensor_vdig_active"; + rcam4_sensor_vdig_suspend = "/fragment@71/__overlay__/rcam4_sensor_vdig_suspend"; + if_pmic_i2c_pins = "/fragment@71/__overlay__/if_pmic_i2c_pins"; + if_pmic_i2c_sleep = "/fragment@71/__overlay__/if_pmic_i2c_pins/if_pmic_i2c_sleep"; + usbpd_i2c_pins = "/fragment@71/__overlay__/usbpd_i2c_pins"; + usbpd_i2c_sleep = "/fragment@71/__overlay__/usbpd_i2c_pins/usbpd_i2c_sleep"; + mcu_reset_active = "/fragment@71/__overlay__/mcu_reset_active"; + mcu_reset_suspend = "/fragment@71/__overlay__/mcu_reset_suspend"; + mcu_clk_active = "/fragment@71/__overlay__/mcu_clk_active"; + mcu_clk_suspend = "/fragment@71/__overlay__/mcu_clk_suspend"; + torch_en_active = "/fragment@71/__overlay__/torch_en_active"; + torch_en_suspend = "/fragment@71/__overlay__/torch_en_suspend"; + grip_int_active = "/fragment@72/__overlay__/grip_int_active"; + grip_int_suspend = "/fragment@72/__overlay__/grip_int_suspend"; + i2c2 = "/fragment@77/__overlay__/i2c@2"; + s2mpb03_l1 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo1"; + s2mpb03_l2 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo2"; + s2mpb03_l3 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo3"; + s2mpb03_l4 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo4"; + s2mpb03_l5 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo5"; + s2mpb03_l6 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo6"; + s2mpb03_l7 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo7"; + tsp_int = "/fragment@82/__overlay__/tsp_int"; + qupv3_se7_i2c_pins_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp"; + qupv3_se7_i2c_active_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp/qupv3_se7_i2c_active_tsp"; + qupv3_se7_i2c_sleep_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp/qupv3_se7_i2c_sleep_tsp"; + tsp_zt = "/fragment@83/__overlay__/touchscreen@20"; + tsp_stm = "/fragment@83/__overlay__/touchscreen@49"; + key_vol_up_default = "/fragment@84/__overlay__/key_vol_up/key_vol_up_default"; + self_display_FC3_dtsi = "/fragment@87/__overlay__/self_display_FC3_dtsi"; + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD = "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + ss_dsi_panel_PBA_BOOTING_FHD = "/fragment@89/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD"; + sde_te_active = "/fragment@90/__overlay__/pmx_sde_te/sde_te_active"; + sde_te_suspend = "/fragment@90/__overlay__/pmx_sde_te/sde_te_suspend"; + pmx_sde = "/fragment@90/__overlay__/pmx_sde"; + sde_dsi_active = "/fragment@90/__overlay__/pmx_sde/sde_dsi_active"; + sde_dsi_suspend = "/fragment@90/__overlay__/pmx_sde/sde_dsi_suspend"; + sde_ub_det_default = "/fragment@91/__overlay__/pmx_sde_ub_det/sde_ub_det_default"; + sde_fg_err_default = "/fragment@92/__overlay__/pmx_sde_fg_err/sde_fg_err_default"; + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD_display = "/fragment@93/__overlay__/qcom,dsi-display@9"; + ss_dsi_panel_PBA_BOOTING_FHD_display = "/fragment@93/__overlay__/qcom,dsi-display@10"; + if_pmic_irq_default = "/fragment@99/__overlay__/if_pmic_irq/if_pmic_irq_default"; + usbpd_irq_default = "/fragment@99/__overlay__/usbpd_irq/usbpd_irq_default"; + fps_rst = "/fragment@101/__overlay__/fps_rst"; + sm5714_flash0 = "/fragment@106/__overlay__/qcom,flash_0"; + sm5714_torch0 = "/fragment@106/__overlay__/qcom,torch_0"; + led_flash0 = "/fragment@106/__overlay__/qcom,camera-flash@0"; + ois_rear = "/fragment@108/__overlay__/qcom,ois@62"; + eeprom2 = "/fragment@109/__overlay__/qcom,eeprom@0x2D"; + eeprom3 = "/fragment@109/__overlay__/qcom,eeprom@37"; + sensor_rear_macro = "/fragment@110/__overlay__/qcom,cam-sensor@4"; + eeprom4 = "/fragment@110/__overlay__/qcom,eeprom@0x3F"; + actuator_rear0 = "/fragment@111/__overlay__/qcom,actuator@0xC"; + eeprom0 = "/fragment@111/__overlay__/qcom,eeprom@50"; + eeprom1 = "/fragment@111/__overlay__/qcom,eeprom@51"; + vibrator = "/fragment@112/__overlay__/samsung,vibrator"; + nfc_qupv3_se0_i2c_sleep = "/fragment@113/__overlay__/nfc_qupv3_se0_i2c_sleep"; + nfc_clk_req_gpio = "/fragment@113/__overlay__/nfc_clk_req_gpio"; + nfc_irq_gpio = "/fragment@113/__overlay__/nfc_irq_gpio"; + nfc_ven_gpio = "/fragment@113/__overlay__/nfc_ven_gpio"; + nfc_firm_gpio = "/fragment@113/__overlay__/nfc_firm_gpio"; + nfc_ldo_en_gpio = "/fragment@113/__overlay__/nfc_ldo_en_gpio"; + hall_default = "/fragment@116/__overlay__/hall/hall_default"; + L8C = "/fragment@117/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150l_l8 = "/fragment@117/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150_l5 = "/fragment@117/__overlay__/rpmh-regulator-ldoa5/regulator-pm6150-l5"; + i2c_17 = "/fragment@117/__overlay__/i2c@17"; + }; + + __fixups__ { + mdss_mdp = "/fragment@0:target:0", "/fragment@1:target:0", "/fragment@2:target:0", "/fragment@3:target:0", "/fragment@4:target:0", "/fragment@5:target:0", "/fragment@8:target:0", "/fragment@10:target:0", "/fragment@88:target:0", "/fragment@89:target:0"; + tlmm = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-te-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-te-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-te-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-te-gpio:0", "/fragment@7/__overlay__:qcom,usbplug-cc-gpio:0", "/fragment@17/__overlay__:cd-gpios:0", "/fragment@24/__overlay__/synaptics_tcm@20:interrupt-parent:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,irq-gpio:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,reset-gpio:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:interrupt-parent:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:reset-gpios:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:irq-gpios:0", "/fragment@25/__overlay__/nq@28:qcom,nq-irq:0", "/fragment@25/__overlay__/nq@28:qcom,nq-ven:0", "/fragment@25/__overlay__/nq@28:qcom,nq-firm:0", "/fragment@25/__overlay__/nq@28:qcom,nq-clkreq:0", "/fragment@25/__overlay__/nq@28:interrupt-parent:0", "/fragment@35:target:0", "/fragment@67/__overlay__/i2c@18:gpios:0", "/fragment@67/__overlay__/i2c@18:gpios:12", "/fragment@67/__overlay__/i2c@18/tas256x@4c:ti,reset-gpio:0", "/fragment@67/__overlay__/i2c@18/tas256x@4c:ti,irq-gpio:0", "/fragment@68/__overlay__:qcom,fm-lna-gpios:0", "/fragment@70:target:0", "/fragment@71:target:0", "/fragment@73:target:0", "/fragment@77/__overlay__/i2c@2:gpios:0", "/fragment@77/__overlay__/i2c@2:gpios:12", "/fragment@82:target:0", "/fragment@83/__overlay__/touchscreen@20:zinitix,irq_gpio:0", "/fragment@83/__overlay__/touchscreen@49:stm,irq_gpio:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:qcom,platform-reset-gpio:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:qcom,platform-te-gpio:0", "/fragment@89/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD:qcom,platform-reset-gpio:0", "/fragment@90:target:0", "/fragment@97/__overlay__/sm5714@49:sm5714,irq-gpio:0", "/fragment@98/__overlay__/usbpd-sm5714@33:usbpd,usbpd_int:0", "/fragment@99:target:0", "/fragment@101:target:0", "/fragment@103/__overlay__/gw9558-spi@0:goodix,gpio_reset:0", "/fragment@104/__overlay__/gw9558@0:goodix,gpio_reset:0", "/fragment@107/__overlay__/sm5714-fled:flash-en-gpio:0", "/fragment@107/__overlay__/sm5714-fled:torch-en-gpio:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:12", "/fragment@108/__overlay__/qcom,ois@62:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:24", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:36", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:12", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:24", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:36", "/fragment@113:target:0", "/fragment@114/__overlay__/sec-nfc@27:interrupt-parent:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,ven-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,irq-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,firm-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,clk_req-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,pvdd-gpio:0", "/fragment@117/__overlay__/i2c@17:gpios:0", "/fragment@117/__overlay__/i2c@17:gpios:12", "/fragment@118:target:0", "/fragment@120:target:0", "/fragment@122:target:0"; + pm6150l_gpios = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-reset-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-reset-gpio:0", "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-bklight-en-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-en-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-reset-gpio:0", "/fragment@22:target:0", "/fragment@72:target:0", "/fragment@84:target:0", "/fragment@85/__overlay__/vol_up:gpios:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:samsung,esd-irq-gpio1:0", "/fragment@92:target:0", "/fragment@117/__overlay__/i2c@17/sx9360-i2c@28:sx9360,nirq-gpio:0"; + soc = "/fragment@6:target:0", "/fragment@11:target:0", "/fragment@23:target:0", "/fragment@31:target:0", "/fragment@34:target:0", "/fragment@60:target:0", "/fragment@67:target:0", "/fragment@77:target:0", "/fragment@86:target:0", "/fragment@87:target:0", "/fragment@93:target:0", "/fragment@104:target:0", "/fragment@106:target:0", "/fragment@112:target:0", "/fragment@115:target:0", "/fragment@117:target:0", "/fragment@119:target:0", "/fragment@124:target:0", "/fragment@126:target:0"; + mdss_dsi0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-ctrl:0"; + mdss_dsi_phy0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-phy:0"; + mdss_dsi0_pll = "/fragment@6/__overlay__/qcom,dsi-display:clocks:0", "/fragment@6/__overlay__/qcom,dsi-display:clocks:8", "/fragment@6/__overlay__/qcom,dsi-display:clocks:16", "/fragment@6/__overlay__/qcom,dsi-display:clocks:24", "/fragment@6/__overlay__/qcom,dsi-display:clocks:32", "/fragment@6/__overlay__/qcom,dsi-display:clocks:40", "/fragment@6/__overlay__/qcom,dsi-display:clocks:48", "/fragment@6/__overlay__/qcom,dsi-display:clocks:56", "/fragment@6/__overlay__/qcom,dsi-display:clocks:64", "/fragment@6/__overlay__/qcom,dsi-display:clocks:72"; + L13A = "/fragment@6/__overlay__/qcom,dsi-display:vddio-supply:0"; + L18A = "/fragment@6/__overlay__/qcom,dsi-display:vdda-3p3-supply:0"; + lcdb_ldo_vreg = "/fragment@6/__overlay__/qcom,dsi-display:lab-supply:0"; + lcdb_ncp_vreg = "/fragment@6/__overlay__/qcom,dsi-display:ibb-supply:0"; + pm6150_l18 = "/fragment@6/__overlay__/qcom,dsi-display:vci-supply:0"; + pm6150_l13 = "/fragment@6/__overlay__/qcom,dsi-display:vddi-supply:0"; + sde_dp = "/fragment@7:target:0", "/fragment@8/__overlay__:connectors:8", "/fragment@26:target:0"; + pm6150_pdphy = "/fragment@7/__overlay__:qcom,dp-usbpd-detection:0"; + sde_dp_usbplug_cc_active = "/fragment@7/__overlay__:pinctrl-0:0"; + sde_dp_usbplug_cc_suspend = "/fragment@7/__overlay__:pinctrl-1:0"; + sde_rscc = "/fragment@8/__overlay__:connectors:12"; + thermal_zones = "/fragment@9:target:0", "/fragment@18:target:0"; + pm6150_trip0 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:trip:0"; + pm6150_charger = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:cooling-device:0", "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:cooling-device:0", "/fragment@21:target:0"; + pm6150_trip1 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:trip:0"; + pm6150l_trip0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:trip:0"; + CPU0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:cooling-device:0"; + CPU1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:cooling-device:0"; + CPU2 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:cooling-device:0"; + CPU3 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:cooling-device:0"; + CPU4 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:cooling-device:0"; + CPU5 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:cooling-device:0"; + CPU6 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:cooling-device:0"; + CPU7 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:cooling-device:0"; + pm6150l_trip1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:trip:0"; + bcl_lvl0 = "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:trip:0"; + bcl_lvl1 = "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:trip:0"; + bcl_lvl2 = "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:trip:0"; + soc_trip = "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:trip:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:trip:0"; + pm6150l_vadc = "/fragment@12:target:0", "/fragment@13/__overlay__:io-channels:0", "/fragment@13/__overlay__:io-channels:8", "/fragment@13/__overlay__:io-channels:16", "/fragment@13/__overlay__:io-channels:24", "/fragment@77/__overlay__/sec_thermistor@1:io-channels:0", "/fragment@77/__overlay__/sec_thermistor@2:io-channels:0", "/fragment@80:target:0"; + pm6150l_adc_tm = "/fragment@13:target:0", "/fragment@18/__overlay__/pa-therm1:thermal-sensors:0"; + ufsphy_mem = "/fragment@14:target:0"; + pm6150_l4 = "/fragment@14/__overlay__:vdda-phy-supply:0"; + pm6150l_l3 = "/fragment@14/__overlay__:vdda-pll-supply:0", "/fragment@15/__overlay__:qcom,vddp-ref-clk-supply:0"; + ufshc_mem = "/fragment@15:target:0", "/fragment@63:target:0"; + ufs_phy_gdsc = "/fragment@15/__overlay__:vdd-hba-supply:0"; + pm6150_l19 = "/fragment@15/__overlay__:vcc-supply:0", "/fragment@16/__overlay__:vdd-supply:0"; + pm6150_l12 = "/fragment@15/__overlay__:vccq2-supply:0", "/fragment@16/__overlay__:vdd-io-supply:0"; + sdhc_1 = "/fragment@16:target:0"; + sdc1_clk_on = "/fragment@16/__overlay__:pinctrl-0:0"; + sdc1_cmd_on = "/fragment@16/__overlay__:pinctrl-0:4"; + sdc1_data_on = "/fragment@16/__overlay__:pinctrl-0:8"; + sdc1_rclk_on = "/fragment@16/__overlay__:pinctrl-0:12"; + sdc1_clk_off = "/fragment@16/__overlay__:pinctrl-1:0"; + sdc1_cmd_off = "/fragment@16/__overlay__:pinctrl-1:4"; + sdc1_data_off = "/fragment@16/__overlay__:pinctrl-1:8"; + sdc1_rclk_off = "/fragment@16/__overlay__:pinctrl-1:12"; + sdhc_2 = "/fragment@17:target:0"; + pm6150l_l9 = "/fragment@17/__overlay__:vdd-supply:0"; + pm6150l_l6 = "/fragment@17/__overlay__:vdd-io-supply:0"; + sdc2_clk_on = "/fragment@17/__overlay__:pinctrl-0:0"; + sdc2_cmd_on = "/fragment@17/__overlay__:pinctrl-0:4"; + sdc2_data_on = "/fragment@17/__overlay__:pinctrl-0:8"; + sdc2_cd_on = "/fragment@17/__overlay__:pinctrl-0:12"; + sdc2_clk_off = "/fragment@17/__overlay__:pinctrl-1:0"; + sdc2_cmd_off = "/fragment@17/__overlay__:pinctrl-1:4"; + sdc2_data_off = "/fragment@17/__overlay__:pinctrl-1:8"; + sdc2_cd_off = "/fragment@17/__overlay__:pinctrl-1:12"; + pm6150a_amoled = "/fragment@19:target:0"; + pm6150_qg = "/fragment@20:target:0"; + pm6150_vadc = "/fragment@21/__overlay__:io-channels:0", "/fragment@21/__overlay__:io-channels:8", "/fragment@21/__overlay__:io-channels:16", "/fragment@21/__overlay__:io-channels:24", "/fragment@21/__overlay__:io-channels:32", "/fragment@21/__overlay__:io-channels:40", "/fragment@21/__overlay__:io-channels:48", "/fragment@77/__overlay__/sec_thermistor@0:io-channels:0", "/fragment@79:target:0", "/fragment@123:target:0", "/fragment@124/__overlay__/battery:io-channels:0", "/fragment@124/__overlay__/battery:io-channels:8"; + qusb_phy0 = "/fragment@21/__overlay__:dpdm-supply:0", "/fragment@100:target:0"; + qupv3_se7_i2c = "/fragment@24:target:0", "/fragment@83:target:0", "/fragment@107:target:0"; + ts_active = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-0:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-0:0"; + ts_int_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:0"; + ts_reset_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:4", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:4"; + ts_release = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-2:0"; + pm6150_l10 = "/fragment@24/__overlay__/synaptics_tcm@20:vdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:vdd-supply:0", "/fragment@83/__overlay__/touchscreen@49:dvdd-supply:0"; + pm6150l_l7 = "/fragment@24/__overlay__/synaptics_tcm@20:avdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:avdd-supply:0", "/fragment@81:target:0", "/fragment@83/__overlay__/touchscreen@20:avdd-supply:0", "/fragment@83/__overlay__/touchscreen@49:avdd-supply:0"; + qupv3_se0_i2c = "/fragment@25:target:0", "/fragment@114:target:0"; + nfc_int_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:0"; + nfc_enable_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:4"; + nfc_clk_req_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:8"; + nfc_int_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:0"; + nfc_enable_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:4"; + nfc_clk_req_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:8"; + fsa4480 = "/fragment@26/__overlay__:qcom,dp-aux-switch:0", "/fragment@69:target:0"; + q6core = "/fragment@27:target:0", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:4", "/fragment@30:target:0", "/fragment@66:target:0", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:4"; + lpass_core_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:0", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:0", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:0"; + lpass_audio_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:8", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:8", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:8", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:8", "/fragment@28/__overlay__/va-macro@62770000:clocks:0"; + bolero = "/fragment@28:target:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214:qcom,bolero-handle:0", "/fragment@29/__overlay__:asoc-codec:4", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:12", "/fragment@65:target:0", "/fragment@68/__overlay__:asoc-codec:4", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:12"; + L10A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-rxtx-supply:0", "/fragment@28/__overlay__/wcd938x-codec:cdc-vddio-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-ldo-rxtx-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vddpx-1-supply:0"; + L15A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-buck-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-buck-supply:0"; + BOB = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-mic-bias-supply:0"; + atoll_snd = "/fragment@29:target:0", "/fragment@68:target:0"; + stub_codec = "/fragment@29/__overlay__:asoc-codec:0", "/fragment@68/__overlay__:asoc-codec:0"; + audio_apr = "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:0", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:0"; + spkr_1_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-0:0"; + spkr_1_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-1:0"; + spkr_2_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-0:0"; + spkr_2_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-1:0"; + wcd_reset_active = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-0:0"; + wcd_reset_sleep = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-1:0"; + va_cdc_dma_0_tx = "/fragment@32:target:0"; + aliases = "/fragment@33:target:0", "/fragment@64:target:0"; + clock_gcc = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:0", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:8", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:16"; + qupv3_1 = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:qcom,wrapper-core:0"; + dcc = "/fragment@36:target:0"; + reserved_memory = "/fragment@37:target:0", "/fragment@105:target:0", "/fragment@121:target:0"; + removed_region = "/fragment@38:target:0"; + pil_modem_mem = "/fragment@39:target:0"; + pil_adsp_mem = "/fragment@40:target:0"; + pil_camera_mem = "/fragment@41:target:0"; + pil_npu_mem = "/fragment@42:target:0"; + pil_video_mem = "/fragment@43:target:0"; + pil_cdsp_mem = "/fragment@44:target:0"; + qseecom_mem = "/fragment@45:target:0"; + qseecom_ta_mem = "/fragment@46:target:0"; + secure_carveout_heap = "/fragment@47:target:0"; + cdsp_sec_mem = "/fragment@48:target:0"; + msm_imem = "/fragment@49:target:0"; + camera = "/fragment@50:target:0"; + cam_vfe0 = "/fragment@51:target:0"; + cam_vfe1 = "/fragment@52:target:0"; + cam_vfe_lite = "/fragment@53:target:0"; + cam_lrme = "/fragment@54:target:0"; + shared_meta = "/fragment@55:target:0"; + android_q_fstab = "/fragment@56:target:0"; + pm8008_8 = "/fragment@57:target:0", "/fragment@75:target:0"; + pm8008_9 = "/fragment@58:target:0", "/fragment@76:target:0"; + usb0 = "/fragment@59:target:0"; + firmware = "/fragment@61:target:0"; + pil_modem = "/fragment@62:target:0"; + modem_smp2p_out = "/fragment@62/__overlay__:qcom,smem-states:0", "/fragment@62/__overlay__:qcom,smem-states:8", "/fragment@62/__overlay__:qcom,smem-states:16"; + pcm0 = "/fragment@68/__overlay__:asoc-platform:0"; + pcm1 = "/fragment@68/__overlay__:asoc-platform:4"; + pcm2 = "/fragment@68/__overlay__:asoc-platform:8"; + voip = "/fragment@68/__overlay__:asoc-platform:12"; + voice = "/fragment@68/__overlay__:asoc-platform:16"; + loopback = "/fragment@68/__overlay__:asoc-platform:20"; + compress = "/fragment@68/__overlay__:asoc-platform:24"; + hostless = "/fragment@68/__overlay__:asoc-platform:28"; + afe = "/fragment@68/__overlay__:asoc-platform:32"; + lsm = "/fragment@68/__overlay__:asoc-platform:36"; + routing = "/fragment@68/__overlay__:asoc-platform:40"; + compr = "/fragment@68/__overlay__:asoc-platform:44"; + pcm_noirq = "/fragment@68/__overlay__:asoc-platform:48"; + spmi_bus = "/fragment@74:target:0", "/fragment@117/__overlay__/i2c@17/sx9360-i2c@28:interrupt-parent:0"; + pm6150_gpios = "/fragment@78:target:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:samsung,ub-con-det:0", "/fragment@91:target:0", "/fragment@115/__overlay__/hall:hall,gpio_flip_cover:0", "/fragment@116:target:0"; + gpio_key = "/fragment@85:target:0"; + cont_splash_memory = "/fragment@94:target:0"; + dfps_data_memory = "/fragment@95:target:0"; + disp_rdump_memory = "/fragment@96:target:0"; + qupv3_se4_i2c = "/fragment@97:target:0", "/fragment@125:target:0"; + qupv3_se11_i2c = "/fragment@98:target:0"; + pm6150l_l11 = "/fragment@102:target:0"; + qupv3_se6_spi = "/fragment@103:target:0"; + pm6150l_switch2 = "/fragment@106/__overlay__/qcom,camera-flash@0:switch-source:0"; + qupv3_se10_i2c = "/fragment@108:target:0"; + cam_cci0 = "/fragment@109:target:0"; + titan_top_gdsc = "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@37:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:cam_clk-supply:0"; + clock_camcc = "/fragment@109/__overlay__/qcom,cam-sensor@0:clocks:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@37:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:clocks:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:clocks:0"; + cam_cci1 = "/fragment@110:target:0"; + qupv3_se9_i2c = "/fragment@111:target:0"; + apps_rsc = "/fragment@117/__overlay__/rpmh-regulator-ldoc8:mboxes:0"; + }; + + __local_fixups__ { + + fragment@0 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@1 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@2 { + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@5 { + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@6 { + + __overlay__ { + + qcom,dsi-display@0 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@1 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@2 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@3 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@4 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@5 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + qcom,dsi-display-list = <0x0 0x4>; + }; + }; + }; + + fragment@7 { + + __overlay__ { + qcom,ext-disp = <0x0>; + }; + }; + + fragment@8 { + + __overlay__ { + connectors = <0x0 0x4>; + }; + }; + + fragment@20 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@21 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@28 { + + __overlay__ { + + bolero-clk-rsc-mngr { + clocks = <0x0 0x8 0x10 0x18 0x20 0x28 0x30 0x38>; + }; + + tx-macro@62620000 { + clocks = <0x0 0x8>; + qcom,tx-swr-gpios = <0x0>; + }; + + rx-macro@62600000 { + clocks = <0x0 0x8>; + qcom,rx-swr-gpios = <0x0>; + }; + + wsa-macro@62640000 { + clocks = <0x0 0x8>; + qcom,wsa-swr-gpios = <0x0>; + + wsa_swr_master { + + wsa881x@20170211 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@20170212 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170213 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170214 { + qcom,spkr-sd-n-node = <0x0>; + }; + }; + }; + + wcd938x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + mbhc-button-thres = <0x0 0xc 0x18 0x24 0x30 0x3c 0x48 0x54>; + imp-table = <0x0 0x10 0x20 0x30 0x40 0x50 0x60 0x70>; + }; + + wcd937x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + }; + }; + }; + + fragment@29 { + + __overlay__ { + qcom,cdc-dmic01-gpios = <0x0>; + qcom,cdc-dmic23-gpios = <0x0>; + qcom,cdc-dmic45-gpios = <0x0>; + asoc-codec = <0x8>; + qcom,wsa-devs = <0x0 0x4 0x8 0xc>; + qcom,codec-aux-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@30 { + + __overlay__ { + + cdc_dmic01_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic23_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic45_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + wsa_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + rx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + tx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@34 { + + __overlay__ { + + qcom,qup_hsuart@a88000 { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@60 { + + __overlay__ { + + qcom,memshare { + + qcom,client_4 { + memory-region = <0x0>; + }; + }; + + samsung,sec_hdm { + memory-region = <0x0>; + }; + }; + }; + + fragment@66 { + + __overlay__ { + + msm_cdc_pinctrl_quin { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@67 { + + __overlay__ { + + i2c@18 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@68 { + + __overlay__ { + asoc-platform = <0x34>; + qcom,quin-mi2s-gpios = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@77 { + + __overlay__ { + + i2c@2 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@83 { + + __overlay__ { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + + touchscreen@20 { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + + touchscreen@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@85 { + + __overlay__ { + pinctrl-0 = <0x0>; + }; + }; + + fragment@88 { + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD { + ss,self_display = <0x0>; + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@89 { + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@97 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sm5714@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@98 { + + __overlay__ { + pinctrl-1 = <0x0>; + + usbpd-sm5714@33 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@103 { + + __overlay__ { + + gw9558-spi@0 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@104 { + + __overlay__ { + + gw9558@0 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@106 { + + __overlay__ { + + qcom,camera-flash@0 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,cam-res-mgr { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + }; + }; + + fragment@108 { + + __overlay__ { + + qcom,ois@62 { + cam_vaf-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@109 { + + __overlay__ { + + qcom,cam-sensor@0 { + actuator-src = <0x0>; + led-flash-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@2 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x2D { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@37 { + cam_vio-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + }; + }; + + fragment@110 { + + __overlay__ { + + qcom,cam-sensor@1 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@8 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@3 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@4 { + led-flash-src = <0x0>; + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + cam_vdig-supply = <0x0>; + }; + + qcom,eeprom@0x3F { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + cam_vdig-supply = <0x0>; + }; + }; + }; + + fragment@111 { + + __overlay__ { + + qcom,actuator@0xC { + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + }; + + qcom,eeprom@50 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@51 { + cam_vio-supply = <0x0>; + }; + }; + }; + + fragment@114 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sec-nfc@27 { + pinctrl-0 = <0x0 0x4 0x8 0xc 0x10>; + }; + }; + }; + + fragment@115 { + + __overlay__ { + + hall { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@117 { + + __overlay__ { + + i2c@17 { + pinctrl-0 = <0x0>; + + sx9360-i2c@28 { + pinctrl-0 = <0x0>; + }; + }; + }; + }; + }; }; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r05.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r05.dts index 09b53b242a6a..d93c4bc8ce72 100755 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r05.dts +++ b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r05.dts @@ -1,25 +1,7241 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - /dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a52q-r05.dtsi" -#include "drivers/atoll-sec-a52q-battery-r04.dtsi" / { model = "Samsung A52Q PROJECT REV03 (board-id,05)"; compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 5>; - dtbo-version = <0>; + qcom,board-id = <0x22 0x5>; + dtbo-version = <0x0>; + + fragment@0 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ video mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x37 0x30>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x38ae2bc0 0x37bc55b0 0x37f8cb38 0x383540b8 0x3871b640>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x3>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@1 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ cmd mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x3da58d80 0x3c9e86e0 0x3ce04888 0x3d220a30 0x3d63cbd8>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x4>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@2 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,mdss-dsi-panel-name = "Simulator video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-mode-switch; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x0 0x0 0x0 0x1 0x0>; + qcom,panel-ack-disabled; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x5>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-video-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,cmd-to-video-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,cmd-to-video-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1 0x2 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-cmd-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,video-to-cmd-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,video-to-cmd-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@3 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-t-clk-post = <0xc>; + qcom,mdss-dsi-t-clk-pre = <0x29>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-ack-disabled; + qcom,ulps-enabled; + phandle = <0x6>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x64>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x64>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x2d0 0x28 0x2d0 0x28 0x2d0 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x1cc>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x2e4>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x21c 0x28 0x21c 0x28 0x21c 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@2 { + qcom,mdss-dsi-panel-width = <0x2d0>; + qcom,mdss-dsi-panel-height = <0x500>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x348>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x564>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x168>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x168 0x28 0x168 0x28 0x168 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + }; + }; + }; + }; + + fragment@4 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_dsc_375_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode DSC 3.75:1 dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,panel-ack-disabled; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,ulps-enabled; + phandle = <0x7>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-pulse-width = <0x10>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x8>; + qcom,mdss-dsi-v-front-porch = <0xa>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-on-command = <0x15010000 0x2ff 0x20150100 0x2 0xfb011501 0x0 0x2000115 0x1000000 0x20155 0x15010000 0x202 0x45150100 0x2 0x5401501 0x0 0x2061915 0x1000000 0x2071e 0x15010000 0x20b 0x73150100 0x2 0xc731501 0x0 0x20eb015 0x1000000 0x20fae 0x15010000 0x211 0xb8150100 0x2 0x13001501 0x0 0x2588015 0x1000000 0x25901 0x15010000 0x25a 0x150100 0x2 0x5b011501 0x0 0x25c8015 0x1000000 0x25d81 0x15010000 0x25e 0x150100 0x2 0x5f011501 0x0 0x2723115 0x1000000 0x26803 0x15010000 0x2ff 0x24150100 0x2 0xfb011501 0x0 0x2001c15 0x1000000 0x2010b 0x15010000 0x202 0xc150100 0x2 0x3011501 0x0 0x2040f15 0x1000000 0x20510 0x15010000 0x206 0x10150100 0x2 0x7101501 0x0 0x2088915 0x1000000 0x2098a 0x15010000 0x20a 0x13150100 0x2 0xb131501 0x0 0x20c1515 0x1000000 0x20d15 0x15010000 0x20e 0x17150100 0x2 0xf171501 0x0 0x2101c15 0x1000000 0x2110b 0x15010000 0x212 0xc150100 0x2 0x13011501 0x0 0x2140f15 0x1000000 0x21510 0x15010000 0x216 0x10150100 0x2 0x17101501 0x0 0x2188915 0x1000000 0x2198a 0x15010000 0x21a 0x13150100 0x2 0x1b131501 0x0 0x21c1515 0x1000000 0x21d15 0x15010000 0x21e 0x17150100 0x2 0x1f171501 0x0 0x2204015 0x1000000 0x22101 0x15010000 0x222 0x150100 0x2 0x23401501 0x0 0x2244015 0x1000000 0x2256d 0x15010000 0x226 0x40150100 0x2 0x27401501 0x0 0x2e00015 0x1000000 0x2dc21 0x15010000 0x2dd 0x22150100 0x2 0xde071501 0x0 0x2df0715 0x1000000 0x2e36d 0x15010000 0x2e1 0x7150100 0x2 0xe2071501 0x0 0x229d815 0x1000000 0x22a2a 0x15010000 0x24b 0x3150100 0x2 0x4c111501 0x0 0x24d1015 0x1000000 0x24e01 0x15010000 0x24f 0x1150100 0x2 0x50101501 0x0 0x2510015 0x1000000 0x25280 0x15010000 0x253 0x150100 0x2 0x56001501 0x0 0x2540715 0x1000000 0x25807 0x15010000 0x255 0x25150100 0x2 0x5b431501 0x0 0x25c0015 0x1000000 0x25f73 0x15010000 0x260 0x73150100 0x2 0x63221501 0x0 0x2640015 0x1000000 0x26708 0x15010000 0x268 0x4150100 0x2 0x72021501 0x0 0x27a8015 0x1000000 0x27b91 0x15010000 0x27c 0xd8150100 0x2 0x7d601501 0x0 0x27f1515 0x1000000 0x27515 0x15010000 0x2b3 0xc0150100 0x2 0xb4001501 0x0 0x2b50015 0x1000000 0x27800 0x15010000 0x279 0x150100 0x2 0x80001501 0x0 0x2830015 0x1000000 0x2930a 0x15010000 0x294 0xa150100 0x2 0x8a001501 0x0 0x29bff15 0x1000000 0x29db0 0x15010000 0x29f 0x63150100 0x2 0x98101501 0x0 0x2ec0015 0x1000000 0x2ff10 0x39010000 0x11c1 0x9200010 0x2000268 0x1bb000a 0x66704c5 0x39010000 0x3c2 0x10f01501 0x0 0x2c00315 0x1000000 0x43b03 0xa0a1501 0x0 0x2350015 0x1000000 0x2e501 0x15010000 0x2bb 0x10150100 0x2 0xfb010501 0x7800 0x2110005 0x1000078 0x22900>; + qcom,mdss-dsi-off-command = [05 01 00 00 78 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x0>; + qcom,mdss-dsi-h-back-porch = <0x0>; + qcom,mdss-dsi-h-pulse-width = <0x0>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x0>; + qcom,mdss-dsi-v-front-porch = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x0>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = <0x15010000 0x2bb 0x10150100 0x2 0xb0030501 0x7800 0x1111501 0x0 0x251ff15 0x1000000 0x25324 0x15010000 0x2ff 0x23150100 0x2 0x8051501 0x0 0x2469015 0x1000000 0x2ff10 0x15010000 0x2ff 0xf0150100 0x2 0x92011501 0x0 0x2ff1015 0x1000000 0x23500 0x5010000 0x28000129>; + qcom,mdss-dsi-off-command = <0x5010000 0x10000128 0x5010000 0x40000110>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x150505 0x201f0505 0x3020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1 0x2 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@5 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,mdss-dsi-panel-name = "nt36672c fhd plus video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x14 0x0 0x14 0x1 0x14>; + qcom,mdss-pan-physical-width-dimension = <0x4a>; + qcom,mdss-pan-physical-height-dimension = <0x83>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-cphy-mode; + qcom,mdss-dsi-t-clk-post = <0x0>; + qcom,mdss-dsi-t-clk-pre = <0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x5a 0x32>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-skip-timing-update; + qcom,dsi-dyn-clk-list = <0x3eb54a94 0x3e726713 0x3e2f838b 0x3deca00a 0x3da9bc89>; + qcom,dsi-dyn-clk-type = "constant-fps-adjust-hfp"; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,platform-bklight-en-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-en-gpio = <0xffffffff 0x4 0x0>; + phandle = <0x8>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-front-porch = <0xca>; + qcom,mdss-dsi-h-back-porch = <0x38>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0xa>; + qcom,mdss-dsi-v-front-porch = <0x50b>; + qcom,mdss-dsi-v-pulse-width = <0xa>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 b0 00 29 01 00 00 00 00 02 c0 00 29 01 00 00 00 00 03 c2 1b a0 29 01 00 00 00 00 02 ff 25 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 18 20 15 01 00 00 00 00 02 ff 2a 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 27 80 15 01 00 00 00 00 02 28 fd 29 01 00 00 00 00 02 ff f0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 5a 00 29 01 00 00 00 00 02 a0 08 29 01 00 00 00 00 02 ff d0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 09 ad 15 01 00 00 00 00 02 ff 10 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 51 ff 15 01 00 00 00 00 02 53 2c 15 01 00 00 00 00 02 ff 23 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 0a 00 15 01 00 00 00 00 02 0b 00 15 01 00 00 00 00 02 0c 00 15 01 00 00 00 00 02 0d 00 15 01 00 00 00 00 02 11 01 15 01 00 00 00 00 02 12 95 15 01 00 00 00 00 02 15 68 15 01 00 00 00 00 02 16 0b 15 01 00 00 00 00 02 6f 00 15 01 00 00 00 00 02 70 00 15 01 00 00 00 00 02 71 00 15 01 00 00 00 00 02 a0 11 15 01 00 00 00 00 02 ff f0 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 d2 52 29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 35 00 05 01 00 00 78 00 02 11 00 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x230909 0x26240909 0x9060204>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@6 { + target = <0xffffffff>; + + __overlay__ { + + dsi_panel_pwr_supply { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xab>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + }; + + qcom,panel-supply-entry@2 { + reg = <0x2>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-post-on-sleep = <0x14>; + }; + }; + + dsi_panel_pwr_supply_no_labibb { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x2>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + }; + + dsi_panel_pwr_supply_labibb_amoled { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x1>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vdda-3p3"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x3390>; + qcom,supply-disable-load = <0x50>; + }; + }; + + qcom,dsi-display@0 { + label = "dsi_rm69299_visionox_amoled_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0"; + qcom,dsi-panel = <0x3>; + qcom,dsi-display-active; + phandle = <0xac>; + }; + + qcom,dsi-display@1 { + label = "dsi_rm69299_visionox_amoled_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x4>; + phandle = <0xad>; + }; + + qcom,dsi-display@2 { + label = "dsi_sim_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x5>; + phandle = <0xae>; + }; + + qcom,dsi-display@3 { + label = "dsi_sim_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x6>; + phandle = <0xaf>; + }; + + qcom,dsi-display@4 { + label = "dsi_sim_dsc_375_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x7>; + phandle = <0xb0>; + }; + + qcom,dsi-display@5 { + label = "dsi_nt36672c_video_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + qcom,dsi-panel = <0x8>; + phandle = <0xb1>; + }; + + qcom,dsi-display { + compatible = "qcom,dsi-display"; + qcom,dsi-ctrl = <0xffffffff>; + qcom,dsi-phy = <0xffffffff>; + clocks = <0xffffffff 0x6 0xffffffff 0x9 0xffffffff 0x3 0xffffffff 0x8 0xffffffff 0xa 0xffffffff 0xd 0xffffffff 0x11 0xffffffff 0x15 0xffffffff 0x16 0xffffffff 0x19>; + clock-names = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + pinctrl-names = "panel_active", "panel_suspend"; + pinctrl-0 = <0x9 0xa 0xb 0xc>; + pinctrl-1 = <0xd 0xe 0xb 0xc>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,panel-te-source = <0x0>; + vddio-supply = <0xffffffff>; + vdda-3p3-supply = <0xffffffff>; + lab-supply = <0xffffffff>; + ibb-supply = <0xffffffff>; + qcom,dsi-display-list = <0xf 0x10>; + vci-supply = <0xffffffff>; + vddi-supply = <0xffffffff>; + phandle = <0x13>; + }; + + qcom,wb-display@0 { + compatible = "qcom,wb-display"; + cell-index = <0x0>; + label = "wb_display"; + phandle = <0x12>; + }; + + qcom,msm-ext-disp { + compatible = "qcom,msm-ext-disp"; + phandle = <0x11>; + + qcom,msm-ext-disp-audio-codec-rx { + compatible = "qcom,msm-ext-disp-audio-codec-rx"; + phandle = <0x2c>; + }; + }; + }; + }; + + fragment@7 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-usbpd-detection = <0xffffffff>; + qcom,ext-disp = <0x11>; + qcom,usbplug-cc-gpio = <0xffffffff 0x68 0x0>; + pinctrl-name = "mdss_dp_active", "mdss_dp_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + }; + }; + + fragment@8 { + target = <0xffffffff>; + + __overlay__ { + connectors = <0x12 0x13 0xffffffff 0xffffffff>; + }; + }; + + fragment@9 { + target = <0xffffffff>; + + __overlay__ { + + pm6150-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150l-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_cpu0 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl0 { + disable-thermal-zone; + + cooling-maps { + + vbat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + vbat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl1 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl2 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + soc { + disable-thermal-zone; + + cooling-maps { + + soc_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + soc_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + }; + }; + + fragment@10 { + target = <0xffffffff>; + + __overlay__ { + #cooling-cells = <0x2>; + }; + }; + + fragment@11 { + target = <0xffffffff>; + + __overlay__ { + + qcom,battery-data { + qcom,batt-id-range-pct = <0xf>; + phandle = <0x14>; + + qcom,alium_860_89032_0000_3600mAh { + qcom,max-voltage-uv = <0x426030>; + qcom,fg-cc-cv-threshold-uv = <0x423920>; + qcom,fastchg-current-ma = <0x1518>; + qcom,batt-id-kohm = <0x6b>; + qcom,battery-beta = <0x109a>; + qcom,battery-therm-kohm = <0x64>; + qcom,battery-type = "Alium_860_89032_0000_3600mAh_Jun15th2018"; + qcom,qg-batt-profile-ver = <0x64>; + qcom,jeita-fcc-ranges = <0x0 0x32 0x2625a0 0x33 0x190 0x5265c0 0x191 0x1c2 0x2625a0>; + qcom,jeita-fv-ranges = <0x0 0x32 0x40d990 0x33 0x190 0x426030 0x191 0x1c2 0x40d990>; + qcom,step-chg-ranges = <0x36ee80 0x39fbc0 0x5265c0 0x39fbc1 0x419ce0 0x36ee80 0x419ce1 0x426030 0x2625a0>; + qcom,ocv-based-step-chg; + qcom,jeita-soft-thresholds = <0x5314 0x25e3>; + qcom,jeita-hard-thresholds = <0x58cd 0x20b8>; + qcom,jeita-soft-hys-thresholds = <0x4f5e 0x2943>; + qcom,jeita-soft-fcc-ua = <0x2625a0 0x2625a0>; + qcom,jeita-soft-fv-uv = <0x40d990 0x40d990>; + + qcom,fcc1-temp-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xd62 0xdbf 0xdfd 0xe1d 0xe2e>; + }; + + qcom,fcc2-temp-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xdda 0xdf8 0xe02 0xe04 0xdff 0xdff>; + }; + + qcom,pc-temp-v1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa846 0xa903 0xa965 0xa982 0xa987 0xa757 0xa82c 0xa88b 0xa8b2 0xa8bc 0xa671 0xa747 0xa7a8 0xa7d4 0xa7e5 0xa598 0xa65f 0xa6c5 0xa6f2 0xa707 0xa4ca 0xa582 0xa5e5 0xa611 0xa627 0xa3ff 0xa4af 0xa508 0xa531 0xa546 0xa330 0xa3e1 0xa430 0xa452 0xa465 0xa25d 0xa311 0xa35c 0xa377 0xa387 0xa1a0 0xa23e 0xa287 0xa29e 0xa2ad 0xa10a 0xa17a 0xa1b1 0xa1c4 0xa1d2 0xa07e 0xa0e5 0xa0f6 0xa0f5 0xa0fc 0x9fa9 0xa061 0xa067 0xa048 0xa036 0x9e4b 0x9f9a 0x9fd6 0x9fae 0x9f81 0x9cdb 0x9e3d 0x9ee8 0x9ee6 0x9ebf 0x9bed 0x9cd1 0x9d85 0x9dc6 0x9dd7 0x9b4d 0x9bf5 0x9c67 0x9cb4 0x9cf4 0x9ad6 0x9b65 0x9bd6 0x9c18 0x9c4a 0x9a75 0x9af5 0x9b63 0x9baa 0x9bc5 0x9a1f 0x9a9b 0x9ade 0x9b13 0x9b23 0x99c4 0x9a41 0x9a3f 0x9a2d 0x9a41 0x9962 0x99c6 0x998a 0x9943 0x9959 0x98fd 0x992a 0x98b8 0x9892 0x98a0 0x9894 0x9882 0x97f4 0x9800 0x9807 0x982b 0x97c6 0x976f 0x9780 0x9781 0x97cb 0x9713 0x970f 0x970c 0x970c 0x9775 0x9697 0x96b5 0x96a2 0x96a2 0x9724 0x963e 0x965a 0x9642 0x963e 0x96db 0x95fa 0x9603 0x95e9 0x95e1 0x9698 0x95c7 0x95b7 0x9598 0x958b 0x965b 0x959d 0x9571 0x954e 0x953b 0x9627 0x9575 0x9533 0x950c 0x94f4 0x95f8 0x9550 0x94fe 0x94d1 0x94b3 0x95cc 0x952e 0x94cf 0x949b 0x947a 0x95a2 0x9511 0x94a4 0x9465 0x9440 0x9579 0x94f7 0x947f 0x9432 0x9407 0x954f 0x94d6 0x9458 0x93fe 0x93cc 0x9525 0x94b2 0x942f 0x93c6 0x938b 0x94f0 0x9484 0x9402 0x938b 0x9345 0x94a6 0x943e 0x93bf 0x9343 0x92f7 0x944c 0x93da 0x935f 0x92ed 0x92a2 0x93e6 0x936c 0x92f1 0x9288 0x923f 0x936b 0x92f1 0x9276 0x920e 0x91c6 0x92e1 0x926f 0x91f1 0x9188 0x9141 0x9248 0x91ea 0x9165 0x90ff 0x90bc 0x91cf 0x9176 0x9100 0x909b 0x905b 0x9179 0x9129 0x90c1 0x9060 0x9022 0x9159 0x910e 0x90ab 0x904f 0x9011 0x913e 0x90f9 0x909a 0x903f 0x9001 0x911a 0x90de 0x907f 0x9020 0x8fdd 0x90ac 0x9070 0x8ff7 0x8f74 0x8f1a 0x8f68 0x8f1c 0x8e9e 0x8e14 0x8db6 0x8d9d 0x8d55 0x8cd8 0x8c4c 0x8beb 0x8b59 0x8b10 0x8a94 0x8a02 0x899f 0x8849 0x87fb 0x877d 0x86e5 0x867d 0x836c 0x8325 0x82aa 0x8209 0x8197 0x7530 0x7530 0x7530 0x7530 0x7530>; + }; + + qcom,pc-temp-v2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa98d 0xa97e 0xa974 0xa960 0xa92e 0xa910 0xa7fb 0xa83a 0xa854 0xa856 0xa82f 0xa819 0xa6a3 0xa712 0xa747 0xa757 0xa738 0xa728 0xa594 0xa609 0xa64d 0xa665 0xa64a 0xa63c 0xa4c7 0xa51d 0xa566 0xa581 0xa565 0xa558 0xa3f4 0xa43e 0xa489 0xa4a2 0xa484 0xa478 0xa2af 0xa364 0xa3b3 0xa3c8 0xa3a5 0xa397 0xa162 0xa292 0xa2e4 0xa2f3 0xa2ca 0xa2b9 0xa11a 0xa1c1 0xa210 0xa21b 0xa1ef 0xa1de 0xa14f 0xa0ea 0xa131 0xa139 0xa110 0xa103 0xa17a 0xa03c 0xa071 0xa077 0xa047 0xa035 0xa046 0x9fd6 0x9ff5 0x9ff5 0x9fb3 0x9f87 0x9d6d 0x9f7f 0x9f85 0x9f81 0x9f2b 0x9ee2 0x9b88 0x9eab 0x9ea9 0x9ead 0x9e5e 0x9e1a 0x9a81 0x9c78 0x9cde 0x9d1e 0x9d16 0x9d22 0x99b8 0x9a96 0x9b46 0x9bd5 0x9bfe 0x9c3f 0x9913 0x99e8 0x9a78 0x9b4d 0x9b70 0x9b9c 0x9887 0x9977 0x99df 0x9aeb 0x9b04 0x9b0e 0x97f7 0x98f2 0x9948 0x9a53 0x9a64 0x9a58 0x975c 0x9856 0x98b5 0x9965 0x9971 0x9967 0x96c8 0x97b8 0x9827 0x987f 0x9885 0x9883 0x9649 0x9720 0x9799 0x97d3 0x97d8 0x97d6 0x95d8 0x968d 0x9711 0x9743 0x9748 0x9745 0x957d 0x9608 0x9697 0x96c6 0x96cb 0x96c8 0x9533 0x9591 0x9629 0x9658 0x965c 0x9658 0x94f4 0x952a 0x95c3 0x95f3 0x95f6 0x95f1 0x94bc 0x94d6 0x9565 0x9595 0x9598 0x9592 0x948a 0x9491 0x950e 0x953e 0x9540 0x9538 0x9458 0x9459 0x94bd 0x94f0 0x94ef 0x94e6 0x9429 0x942b 0x9471 0x94aa 0x94a5 0x949b 0x93fa 0x9403 0x942c 0x9467 0x9461 0x9456 0x93cb 0x93dc 0x93ed 0x9426 0x9422 0x9418 0x939a 0x93b7 0x93b6 0x93e7 0x93e7 0x93dd 0x9366 0x9390 0x9384 0x93a6 0x93a1 0x9392 0x9330 0x9367 0x935a 0x9364 0x9348 0x932b 0x92f5 0x933c 0x9330 0x9322 0x92ea 0x92bd 0x92b6 0x9309 0x9301 0x92e2 0x9296 0x925d 0x9274 0x92ce 0x92cf 0x92a2 0x9248 0x9208 0x922d 0x9289 0x9294 0x925e 0x91fe 0x91bc 0x91e4 0x9235 0x924a 0x9214 0x91b6 0x9173 0x919a 0x91d4 0x91f2 0x91c0 0x9166 0x9124 0x9151 0x916d 0x918d 0x9158 0x9101 0x90c0 0x910a 0x9104 0x9119 0x90da 0x9085 0x9045 0x90be 0x90a5 0x90a4 0x9064 0x9011 0x8fd4 0x9066 0x9055 0x9058 0x9026 0x8fde 0x8fa3 0x8ff1 0x9009 0x9027 0x900b 0x8fc1 0x8f87 0x8fa0 0x8fd7 0x9010 0x8ff6 0x8fb0 0x8f76 0x8f3a 0x8f9b 0x8ff2 0x8fd7 0x8f94 0x8f5b 0x8e9d 0x8f3c 0x8fa7 0x8f84 0x8f3f 0x8efc 0x8dbc 0x8e73 0x8ecd 0x8e86 0x8e46 0x8df2 0x8c72 0x8d0b 0x8d41 0x8ce7 0x8ca5 0x8c4f 0x8a95 0x8b0d 0x8b2a 0x8ad3 0x8a9a 0x8a45 0x87f8 0x8865 0x887d 0x881c 0x87ec 0x879d 0x841a 0x8496 0x84d3 0x8488 0x847e 0x8426 0x7eca 0x7f24 0x801b 0x8028 0x7f97 0x7ef0 0x6fcb 0x6e6e 0x6d71 0x6d74 0x6d50 0x6d1a>; + }; + + qcom,pc-temp-z1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x38d1 0x33b6 0x2f09 0x2da0 0x2d49 0x38bb 0x337f 0x2f0d 0x2d9e 0x2d52 0x38c3 0x3376 0x2f0b 0x2da5 0x2d5c 0x38c7 0x337e 0x2f07 0x2da7 0x2d60 0x38d3 0x3382 0x2f03 0x2da8 0x2d62 0x38eb 0x337d 0x2f01 0x2da8 0x2d64 0x38ff 0x336c 0x2f02 0x2da9 0x2d67 0x38f6 0x335e 0x2f03 0x2dac 0x2d6a 0x38d7 0x335d 0x2f05 0x2dae 0x2d6d 0x38b6 0x3362 0x2f09 0x2db1 0x2d6f 0x3896 0x3360 0x2f0d 0x2db5 0x2d72 0x3874 0x334e 0x2f0f 0x2db8 0x2d77 0x3843 0x333c 0x2f0f 0x2dbb 0x2d7b 0x3810 0x332e 0x2f0b 0x2dbb 0x2d7c 0x37ee 0x3328 0x2f04 0x2db9 0x2d7c 0x37d3 0x3329 0x2f01 0x2db7 0x2d7c 0x37b6 0x3329 0x2f04 0x2dbb 0x2d7f 0x3792 0x332c 0x2f0a 0x2dc2 0x2d85 0x3772 0x3337 0x2f14 0x2dc9 0x2d8b 0x3765 0x3349 0x2f21 0x2dce 0x2d8f 0x3763 0x335e 0x2f2c 0x2dd3 0x2d93 0x376a 0x3374 0x2f35 0x2dd8 0x2d98 0x3773 0x3384 0x2f3d 0x2ddd 0x2d9c 0x377f 0x338b 0x2f45 0x2de1 0x2da1 0x3787 0x3391 0x2f4d 0x2de7 0x2da6 0x378c 0x339a 0x2f54 0x2dec 0x2daa 0x378f 0x33a6 0x2f5b 0x2df0 0x2daf 0x3794 0x33ad 0x2f62 0x2df4 0x2db3 0x379f 0x33b2 0x2f69 0x2df8 0x2db7 0x37af 0x33ba 0x2f6f 0x2dfc 0x2dbb 0x37c7 0x33c2 0x2f75 0x2e00 0x2dbf 0x37de 0x33c9 0x2f7a 0x2e04 0x2dc4 0x37e6 0x33d1 0x2f80 0x2e08 0x2dc8 0x37ea 0x33de 0x2f86 0x2e0d 0x2dcd 0x37f0 0x33f1 0x2f8e 0x2e12 0x2dd1 0x3807 0x3403 0x2f95 0x2e17 0x2dd5 0x383b 0x3415 0x2f9d 0x2e1a 0x2dd8 0x386b 0x3422 0x2fa5 0x2e1c 0x2dda 0x3891 0x3427 0x2faa 0x2e1f 0x2ddc 0x38b0 0x3429 0x2fad 0x2e21 0x2ddd 0x38b2 0x342d 0x2fb1 0x2e23 0x2dde 0x3888 0x3439 0x2fb9 0x2e25 0x2de0 0x3873 0x3448 0x2fbf 0x2e27 0x2de1 0x386e 0x3457 0x2fc0 0x2e28 0x2de2 0x3861 0x3449 0x2fc4 0x2e29 0x2de2 0x386f 0x3454 0x2fc7 0x2e2b 0x2de2 0x3869 0x3454 0x2fc8 0x2e2b 0x2de1 0x3868 0x345b 0x2fc9 0x2e2b 0x2de2 0x385f 0x3457 0x2fcf 0x2e2c 0x2de3 0x387c 0x3452 0x2fd1 0x2e30 0x2de6 0x3886 0x346f 0x2fdb 0x2e36 0x2deb 0x38aa 0x3476 0x2ff3 0x2e3f 0x2df0 0x3895 0x349e 0x3007 0x2e4a 0x2dfa 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06>; + }; + + qcom,pc-temp-z2-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2bb8 0x2632 0x2811 0x296b 0x2a9e 0x280d 0x2a3d 0x2824 0x28fa 0x293e 0x25fe 0x2926 0x282f 0x28bc 0x28c4 0x2606 0x274d 0x282a 0x28ad 0x28ac 0x2620 0x26d2 0x281d 0x2898 0x28a6 0x262f 0x26c3 0x2815 0x288c 0x28a4 0x2631 0x26b5 0x2811 0x2887 0x28a8 0x262c 0x26aa 0x2812 0x2882 0x28ac 0x2625 0x26a2 0x2816 0x2880 0x28ac 0x261b 0x269c 0x2819 0x2884 0x28b5 0x2612 0x2698 0x2813 0x2887 0x28cc 0x2616 0x2696 0x27f3 0x288e 0x28d4 0x2626 0x2699 0x27d7 0x28ae 0x28d3 0x262c 0x26a7 0x27e8 0x28bd 0x28d4 0x2618 0x26b3 0x2814 0x289f 0x28d2 0x25f5 0x26b6 0x282a 0x2883 0x28c7 0x25e5 0x26ba 0x2827 0x288f 0x28d1 0x25e1 0x26c3 0x281d 0x28b2 0x290a 0x25dd 0x26dd 0x2837 0x28e1 0x2937 0x25d6 0x26fd 0x2894 0x2931 0x293f 0x25c9 0x271e 0x28ce 0x296a 0x293f 0x25be 0x2742 0x28b3 0x2939 0x2923 0x25b7 0x2760 0x2883 0x28bd 0x28ee 0x25b1 0x2775 0x2863 0x288b 0x28cc 0x259f 0x2784 0x284c 0x289e 0x28b4 0x2574 0x278c 0x283f 0x28b6 0x28a5 0x2552 0x2793 0x283c 0x28a9 0x28a6 0x2544 0x2797 0x283d 0x2890 0x28af 0x250b 0x2796 0x2845 0x2888 0x28ba 0x24d2 0x2793 0x2859 0x2888 0x28cd 0x24c0 0x2792 0x286f 0x288c 0x28e8 0x24b3 0x2793 0x2885 0x289f 0x290a 0x24aa 0x2795 0x289c 0x28c5 0x2934 0x24a2 0x2799 0x28b4 0x28ea 0x2962 0x249c 0x27a2 0x28ce 0x290a 0x299b 0x2498 0x27aa 0x28df 0x2925 0x29c7 0x249e 0x27b2 0x28e4 0x293c 0x29d8 0x24a4 0x27b7 0x28e7 0x2954 0x29e2 0x24ad 0x27bb 0x28ef 0x2961 0x29ed 0x24b6 0x27c0 0x28fb 0x2964 0x29f9 0x24b5 0x27c2 0x2901 0x2965 0x2a01 0x24a8 0x27b9 0x28fa 0x2971 0x2a03 0x24a4 0x279c 0x28f3 0x2981 0x2a07 0x24aa 0x26ec 0x28f1 0x2987 0x2a1d 0x246c 0x26c6 0x28d6 0x2992 0x2a3b 0x2459 0x26cc 0x28c6 0x29ad 0x2a38 0x2447 0x26dc 0x28df 0x29c9 0x2a6a 0x2449 0x26cd 0x293d 0x29ca 0x2a89 0x243a 0x26ed 0x297e 0x2a06 0x2aa5 0x243e 0x26c3 0x2925 0x29d7 0x2a55 0x2464 0x269c 0x28de 0x298a 0x29c5 0x246e 0x264f 0x28b9 0x2971 0x29af 0x2445 0x25fc 0x289b 0x2927 0x295f 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904>; + }; + + qcom,pc-temp-z3-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4c45 0x4be7 0x4bad 0x4bb7 0x4b9b 0x4d48 0x4c26 0x4bd0 0x4baa 0x4b96 0x4dd0 0x4c76 0x4bee 0x4bac 0x4b97 0x4de1 0x4cc3 0x4bfa 0x4bb4 0x4b9c 0x4dce 0x4cd9 0x4bff 0x4bb6 0x4b9f 0x4db7 0x4cdc 0x4c00 0x4bb7 0x4ba2 0x4dac 0x4cdd 0x4bfe 0x4bb5 0x4ba2 0x4da7 0x4cdd 0x4bfb 0x4bb0 0x4b9f 0x4da5 0x4ce0 0x4bf8 0x4bac 0x4b9b 0x4da2 0x4ce2 0x4bf6 0x4bac 0x4b99 0x4da0 0x4cd4 0x4bf0 0x4bac 0x4b98 0x4da5 0x4cac 0x4bdf 0x4ba7 0x4b98 0x4db6 0x4c9a 0x4bc8 0x4b9b 0x4b95 0x4dc5 0x4cb6 0x4bce 0x4b96 0x4b91 0x4db4 0x4cd7 0x4bef 0x4ba3 0x4b93 0x4d83 0x4cd1 0x4c01 0x4bb3 0x4b97 0x4d54 0x4cac 0x4bec 0x4bad 0x4b94 0x4d30 0x4c8a 0x4bd0 0x4b9c 0x4b8a 0x4d0e 0x4c6f 0x4bcf 0x4b98 0x4b87 0x4cf1 0x4c5e 0x4be1 0x4ba6 0x4b8e 0x4cd8 0x4c62 0x4bee 0x4bb3 0x4b97 0x4cc6 0x4c75 0x4bef 0x4bb3 0x4b9d 0x4cbc 0x4c87 0x4bef 0x4bae 0x4ba1 0x4cb4 0x4c93 0x4bed 0x4bad 0x4ba2 0x4cac 0x4c9c 0x4bea 0x4bb4 0x4ba0 0x4ca3 0x4c9d 0x4be9 0x4bba 0x4b9e 0x4c97 0x4c9b 0x4bef 0x4bb7 0x4b9c 0x4c8c 0x4c97 0x4bf5 0x4bb2 0x4b9a 0x4c7f 0x4c91 0x4bf6 0x4bae 0x4b98 0x4c6f 0x4c8a 0x4bf4 0x4ba9 0x4b96 0x4c5d 0x4c84 0x4bf2 0x4ba5 0x4b94 0x4c4a 0x4c7f 0x4bef 0x4ba2 0x4b91 0x4c3a 0x4c7a 0x4bea 0x4ba0 0x4b8e 0x4c2b 0x4c73 0x4be7 0x4b9f 0x4b8a 0x4c1e 0x4c6b 0x4be5 0x4b9e 0x4b86 0x4c17 0x4c65 0x4be2 0x4b9e 0x4b84 0x4c1b 0x4c5f 0x4bde 0x4b9e 0x4b84 0x4c23 0x4c5a 0x4bda 0x4b9d 0x4b86 0x4c39 0x4c56 0x4bd7 0x4b9c 0x4b86 0x4c4f 0x4c53 0x4bd6 0x4b97 0x4b83 0x4c46 0x4c4f 0x4bd4 0x4b93 0x4b81 0x4c28 0x4c4a 0x4bd2 0x4b93 0x4b82 0x4c1b 0x4c3f 0x4bd0 0x4b93 0x4b82 0x4c19 0x4bfb 0x4bcc 0x4b93 0x4b83 0x4bac 0x4bb3 0x4bb6 0x4b90 0x4b7f 0x4b91 0x4b94 0x4ba0 0x4b89 0x4b78 0x4b89 0x4b8c 0x4b9e 0x4b80 0x4b70 0x4b8b 0x4b87 0x4b8e 0x4b7e 0x4b70 0x4b74 0x4b76 0x4b83 0x4b7c 0x4b6d 0x4b78 0x4b75 0x4b98 0x4b87 0x4b7c 0x4bab 0x4b91 0x4b9b 0x4b8b 0x4b83 0x4bda 0x4b96 0x4b9d 0x4b8e 0x4b84 0x4bf2 0x4b94 0x4b99 0x4b92 0x4b87 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c>; + }; + + qcom,pc-temp-z4-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4001 0x3c8d 0x3a72 0x3978 0x397b 0x40ed 0x3c83 0x3a6f 0x39c6 0x39b9 0x40da 0x3c60 0x3a4a 0x39d2 0x39c2 0x4086 0x3c0a 0x3a21 0x39c0 0x39b5 0x4000 0x3ba1 0x39fb 0x39a7 0x399e 0x3f71 0x3b4a 0x39dc 0x3990 0x3986 0x3ef7 0x3b02 0x39c2 0x3981 0x3976 0x3e89 0x3acb 0x39ac 0x3976 0x396c 0x3e16 0x3aa0 0x39a0 0x3970 0x3966 0x3d82 0x3a79 0x399a 0x396d 0x3961 0x3cf4 0x3a50 0x3998 0x396a 0x395d 0x3cc5 0x3a2f 0x3998 0x3965 0x3959 0x3cdb 0x3a29 0x3999 0x395f 0x3951 0x3cf0 0x3a35 0x399d 0x3961 0x394e 0x3cc2 0x3a3c 0x39a2 0x3970 0x395b 0x3c4c 0x3a29 0x39a0 0x397b 0x3968 0x3beb 0x39fe 0x398c 0x396b 0x395e 0x3bb2 0x39dd 0x3979 0x394d 0x3947 0x3b8d 0x39c9 0x3978 0x394f 0x3946 0x3b7e 0x39bd 0x3982 0x3988 0x3974 0x3b75 0x39bc 0x3996 0x39ba 0x39a6 0x3b71 0x39bf 0x39ca 0x39be 0x39ab 0x3b75 0x39c9 0x39fe 0x39b9 0x399f 0x3b7b 0x39fa 0x39fe 0x39ae 0x3991 0x3b80 0x3a38 0x39df 0x3993 0x3982 0x3b85 0x3a46 0x39bf 0x397d 0x3975 0x3b8c 0x3a43 0x39a7 0x3973 0x396c 0x3b92 0x3a3e 0x3994 0x396e 0x3965 0x3b9e 0x3a2f 0x3989 0x3969 0x395f 0x3bab 0x3a18 0x3982 0x3965 0x395a 0x3bb3 0x3a05 0x397d 0x3962 0x3955 0x3bba 0x39f5 0x397b 0x395e 0x3951 0x3bbe 0x39e5 0x397a 0x395a 0x394e 0x3bbc 0x39d6 0x3979 0x395a 0x394d 0x3bb5 0x39c8 0x3979 0x395c 0x3950 0x3ba1 0x39ba 0x3978 0x395e 0x3955 0x3b72 0x39ac 0x3976 0x3961 0x395b 0x3b43 0x39a1 0x3973 0x3963 0x3961 0x3afc 0x399e 0x3970 0x3963 0x3963 0x3abc 0x399c 0x396d 0x3963 0x3960 0x3ab4 0x3999 0x396a 0x3962 0x395d 0x3abb 0x3994 0x3967 0x3960 0x395c 0x3ab9 0x3995 0x3962 0x395d 0x395b 0x3aa3 0x39d0 0x395a 0x3959 0x3958 0x3abd 0x39eb 0x3957 0x394b 0x394c 0x3ac6 0x39f6 0x3953 0x3935 0x3934 0x3acb 0x39f8 0x394d 0x3931 0x392d 0x3ac3 0x39fa 0x3959 0x3929 0x3920 0x3ad0 0x3a03 0x3961 0x3925 0x391e 0x3ac0 0x39ff 0x394e 0x392e 0x392c 0x3a9b 0x39f7 0x3956 0x3935 0x3930 0x3a8e 0x39fe 0x3959 0x3936 0x3935 0x3a94 0x3a0e 0x3963 0x3937 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936>; + }; + + qcom,pc-temp-z5-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2b3c 0x2daa 0x3498 0x4a8d 0x45cc 0x2ef0 0x3052 0x39fb 0x4721 0x484e 0x3117 0x343d 0x3f9f 0x4802 0x4a61 0x31df 0x385f 0x430e 0x4b83 0x4d9f 0x326a 0x3a69 0x44ec 0x4e02 0x5124 0x32f3 0x3bab 0x4673 0x5049 0x55e1 0x33c6 0x3ce5 0x4810 0x514c 0x5936 0x34d0 0x3e95 0x49be 0x511b 0x5a23 0x35db 0x4119 0x4b35 0x5160 0x5a1d 0x36fa 0x4312 0x4c4c 0x5327 0x5b6b 0x3859 0x42b6 0x4bad 0x5424 0x5e2c 0x3a2d 0x3f5c 0x45e6 0x5167 0x6138 0x3c44 0x3ed3 0x3ee4 0x49ed 0x6100 0x3d63 0x47a6 0x4250 0x472f 0x5e7d 0x3d9a 0x506d 0x5049 0x50b3 0x5f98 0x3db5 0x5016 0x57f1 0x5c40 0x639a 0x3dda 0x4c6d 0x532f 0x5d14 0x64bc 0x3dd6 0x4a75 0x4bb9 0x59b9 0x646c 0x3d86 0x49e6 0x55e6 0x5b90 0x6454 0x3cdc 0x49b6 0x76e4 0x6b24 0x646b 0x3bcd 0x5034 0x875d 0x7705 0x6492 0x3ad1 0x649b 0x78a4 0x6a60 0x5e9c 0x3a04 0x7968 0x6282 0x5014 0x511e 0x3939 0x8c1a 0x56c4 0x4873 0x4bc7 0x3846 0x9a39 0x4fd8 0x5026 0x4d8e 0x3716 0x9aa6 0x4dfb 0x5780 0x5074 0x35e9 0x91df 0x53c1 0x5aa0 0x53ba 0x34ed 0x87db 0x5d83 0x5d20 0x57f1 0x33ea 0x7eb5 0x65eb 0x5e8b 0x5cc6 0x32dd 0x764e 0x6eb9 0x601d 0x628a 0x31ca 0x720c 0x75c6 0x61b9 0x67fc 0x30bf 0x6fd5 0x79eb 0x63f1 0x6c9c 0x2ffa 0x6e15 0x7d26 0x6810 0x7085 0x2f5e 0x6c28 0x8068 0x6dc5 0x7165 0x2ed6 0x6a83 0x83d1 0x7653 0x6fdc 0x2e78 0x6a47 0x8529 0x7b5b 0x6e81 0x2ea9 0x6b32 0x8003 0x7adf 0x6f61 0x2f11 0x6ca0 0x7890 0x796f 0x710e 0x303e 0x6e9b 0x7749 0x7672 0x709c 0x317f 0x7119 0x77a9 0x6cad 0x6a94 0x3162 0x71bd 0x77df 0x65cc 0x65f5 0x300b 0x6c45 0x7771 0x66c4 0x66af 0x2fb0 0x60cd 0x7669 0x680b 0x6789 0x3015 0x4018 0x70b0 0x6813 0x6600 0x2ca4 0x3328 0x596b 0x6764 0x62b7 0x2bbe 0x3022 0x477d 0x6688 0x6215 0x2b68 0x2f70 0x4725 0x57da 0x5967 0x2b6c 0x2f09 0x3dd8 0x58e5 0x64be 0x2ab7 0x2db9 0x398d 0x5bd2 0x6460 0x2ae0 0x2ded 0x457f 0x6bcd 0x75c0 0x2cb0 0x2ff3 0x438f 0x6311 0x7110 0x2d80 0x2fa5 0x439f 0x6129 0x668d 0x2d89 0x2ebe 0x3ec3 0x61e3 0x62ca 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005>; + }; + + qcom,pc-temp-z6-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x409a 0x3c2e 0x39dd 0x392f 0x3913 0x416d 0x3c48 0x39ee 0x394b 0x392d 0x419b 0x3c57 0x39ee 0x3952 0x3933 0x4181 0x3c50 0x39e4 0x394f 0x3931 0x413b 0x3c33 0x39d5 0x3947 0x392a 0x40e4 0x3c0c 0x39c7 0x393d 0x3921 0x409c 0x3be5 0x39bb 0x3935 0x391b 0x4062 0x3bcb 0x39b0 0x392e 0x3915 0x4027 0x3bb9 0x39aa 0x392a 0x3910 0x3fe0 0x3ba7 0x39a7 0x3929 0x390e 0x3f9a 0x3b8a 0x39a3 0x3928 0x390c 0x3f73 0x3b64 0x399a 0x3924 0x390b 0x3f65 0x3b56 0x398e 0x391c 0x3906 0x3f55 0x3b62 0x3992 0x3919 0x3903 0x3f1e 0x3b70 0x39a4 0x3927 0x390a 0x3ec0 0x3b64 0x39ac 0x3933 0x3912 0x3e70 0x3b3f 0x3999 0x392a 0x390c 0x3e3a 0x3b22 0x3982 0x3915 0x38fe 0x3e0f 0x3b10 0x3982 0x3914 0x38fc 0x3df2 0x3b06 0x3991 0x3936 0x3915 0x3ddc 0x3b09 0x39a5 0x3953 0x3930 0x3dd2 0x3b19 0x39c1 0x3956 0x3934 0x3dd2 0x3b2e 0x39d7 0x3953 0x3934 0x3dd7 0x3b4e 0x39d6 0x394f 0x3932 0x3ddc 0x3b6d 0x39c9 0x3948 0x392b 0x3de1 0x3b75 0x39be 0x3942 0x3924 0x3de6 0x3b75 0x39b8 0x393d 0x391f 0x3dea 0x3b74 0x39b4 0x3938 0x391c 0x3dee 0x3b6e 0x39b1 0x3935 0x3919 0x3df0 0x3b64 0x39ae 0x3931 0x3916 0x3df0 0x3b5c 0x39ab 0x392e 0x3913 0x3df0 0x3b54 0x39a9 0x392b 0x3910 0x3def 0x3b4c 0x39a8 0x3928 0x390d 0x3ded 0x3b46 0x39a7 0x3928 0x390c 0x3deb 0x3b40 0x39a7 0x3929 0x390c 0x3deb 0x3b3c 0x39a6 0x392a 0x390c 0x3ded 0x3b38 0x39a4 0x392c 0x390f 0x3def 0x3b35 0x39a2 0x392d 0x3913 0x3def 0x3b35 0x39a0 0x392d 0x3914 0x3dee 0x3b36 0x399f 0x392a 0x3912 0x3deb 0x3b36 0x399e 0x3928 0x3910 0x3de2 0x3b35 0x399d 0x3927 0x3910 0x3dd8 0x3b34 0x399b 0x3927 0x390f 0x3dcd 0x3b2c 0x3997 0x3926 0x390f 0x3da1 0x3b16 0x398b 0x391d 0x3908 0x3d94 0x3b10 0x397f 0x3911 0x38f9 0x3d93 0x3b0a 0x397c 0x390a 0x38f2 0x3d8f 0x3b0c 0x3979 0x3906 0x38ec 0x3d8d 0x3b07 0x3977 0x3903 0x38ea 0x3d95 0x3b0c 0x397c 0x390d 0x38f8 0x3da1 0x3b20 0x3983 0x3914 0x38ff 0x3dbd 0x3b30 0x398c 0x3918 0x3902 0x3de0 0x3b45 0x3993 0x391d 0x3906 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d>; + }; + + qcom,pc-temp-y1-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1dae 0x1a6c 0x17b7 0x1540 0x1467 0x143b 0x1db4 0x1a6f 0x17c3 0x153f 0x1466 0x143d 0x1dc0 0x1a74 0x17ca 0x153e 0x1466 0x143e 0x1dcd 0x1a7a 0x17ce 0x153c 0x1466 0x1440 0x1dd8 0x1a7e 0x17d0 0x153b 0x1467 0x1441 0x1ddd 0x1a80 0x17d0 0x153a 0x1467 0x1443 0x1ddc 0x1a80 0x17cc 0x153a 0x1468 0x1443 0x1dda 0x1a80 0x17c6 0x153a 0x146a 0x1444 0x1dd3 0x1a7d 0x17c5 0x153b 0x146c 0x1445 0x1dbc 0x1a76 0x17c8 0x153c 0x146d 0x1446 0x1daa 0x1a70 0x17ca 0x153d 0x146f 0x1448 0x1db3 0x1a6e 0x17c6 0x153d 0x1470 0x1449 0x1dc8 0x1a6f 0x17c0 0x153d 0x1472 0x144b 0x1ddc 0x1a74 0x17c1 0x153e 0x1474 0x144d 0x1df4 0x1a85 0x17d0 0x1545 0x1479 0x1452 0x1e03 0x1a97 0x17db 0x154d 0x147c 0x1454 0x1dfa 0x1aa4 0x17df 0x154f 0x147c 0x1455 0x1de7 0x1aaf 0x17e3 0x1552 0x147d 0x1455 0x1dd8 0x1ab0 0x17e4 0x1554 0x147e 0x1456 0x1dca 0x1aa1 0x17e2 0x1555 0x1480 0x1459 0x1dc3 0x1a95 0x17e2 0x1558 0x1483 0x145c 0x1dd6 0x1a97 0x17ed 0x155c 0x1487 0x1460 0x1df9 0x1a9f 0x17fb 0x1560 0x148b 0x1463 0x1e01 0x1aa5 0x17fd 0x1565 0x148e 0x1467 0x1e00 0x1aa8 0x17f8 0x1569 0x1491 0x146a 0x1e04 0x1aac 0x17f7 0x156d 0x1493 0x146e 0x1e09 0x1ab8 0x1800 0x1571 0x1496 0x1472 0x1e0c 0x1acc 0x180b 0x1576 0x149a 0x1475 0x1e0a 0x1ad7 0x180e 0x157b 0x149d 0x1478 0x1df8 0x1adc 0x1812 0x1581 0x14a0 0x147a 0x1de0 0x1ade 0x1817 0x1586 0x14a3 0x147d 0x1dd9 0x1adb 0x181b 0x158b 0x14a7 0x1480 0x1ddb 0x1ad7 0x181f 0x1590 0x14aa 0x1484 0x1ddd 0x1ad7 0x1820 0x1593 0x14ad 0x1487 0x1de1 0x1ad5 0x1821 0x1596 0x14b0 0x1489 0x1de8 0x1ad3 0x1823 0x1599 0x14b2 0x148b 0x1df7 0x1adf 0x1827 0x159b 0x14b4 0x148c 0x1e0a 0x1aef 0x182c 0x159d 0x14b5 0x148d 0x1e0d 0x1aef 0x1831 0x159e 0x14b5 0x148e 0x1dff 0x1ae3 0x1835 0x159f 0x14b6 0x148e 0x1df5 0x1adf 0x183a 0x15a1 0x14b7 0x148f 0x1df6 0x1ae5 0x1841 0x15a5 0x14b9 0x1491 0x1df6 0x1aeb 0x184c 0x15a8 0x14ba 0x1492 0x1df6 0x1af2 0x1849 0x15aa 0x14bb 0x1493 0x1dfa 0x1af8 0x1850 0x15af 0x14be 0x1495 0x1e04 0x1b0b 0x1850 0x15b1 0x14be 0x1496 0x1e09 0x1b08 0x1859 0x15b4 0x14be 0x1496 0x1e26 0x1b0e 0x1863 0x15b4 0x14be 0x1496 0x1e37 0x1b0b 0x186b 0x15b6 0x14bf 0x1496 0x1e2c 0x1b1e 0x1867 0x15b9 0x14c2 0x1498 0x1e29 0x1b3f 0x1879 0x15c2 0x14c5 0x149b 0x1e38 0x1b5b 0x1895 0x15d1 0x14cc 0x14a0 0x1e61 0x1b5f 0x18a8 0x15e4 0x14d3 0x14a6 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac>; + }; + + qcom,pc-temp-y2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x25d6 0x28a1 0x29b8 0x2b2a 0x2b60 0x2c89 0x2638 0x287f 0x299b 0x2b15 0x2b62 0x2c51 0x2674 0x286a 0x297a 0x2afb 0x2b61 0x2bfc 0x2693 0x285f 0x2959 0x2ade 0x2b5e 0x2ba2 0x269f 0x285b 0x293d 0x2abd 0x2b58 0x2b5a 0x26a2 0x285a 0x292b 0x2a9a 0x2b51 0x2b3c 0x266c 0x2867 0x2922 0x2a6d 0x2b48 0x2b43 0x260b 0x287d 0x291b 0x2a3f 0x2b3b 0x2b4e 0x25f2 0x2878 0x2916 0x2a29 0x2b28 0x2b4d 0x25fe 0x283e 0x2912 0x2a1c 0x2b09 0x2b3a 0x2615 0x2814 0x2910 0x2a13 0x2ae5 0x2b24 0x2698 0x2862 0x291a 0x2a04 0x2ab6 0x2afb 0x2784 0x28ea 0x2933 0x29f0 0x2a85 0x2ac3 0x27ba 0x2909 0x295a 0x29f2 0x2a7a 0x2abc 0x26d8 0x28f6 0x29a8 0x2a1d 0x2a90 0x2af0 0x2601 0x28e9 0x29e0 0x2a53 0x2ab0 0x2b19 0x25e5 0x28ff 0x29fa 0x2a91 0x2aec 0x2b1b 0x25de 0x2924 0x2a0e 0x2ad0 0x2b33 0x2b18 0x25d8 0x292d 0x2a1d 0x2aef 0x2b47 0x2b23 0x25d2 0x292c 0x2a2b 0x2afc 0x2b48 0x2b59 0x25cd 0x2929 0x2a36 0x2b0a 0x2b4a 0x2b9b 0x25ca 0x28f3 0x2a3f 0x2b29 0x2b78 0x2bd9 0x25c8 0x2849 0x2a48 0x2b54 0x2bc0 0x2c13 0x25c6 0x27d1 0x2a4b 0x2b74 0x2be2 0x2c3d 0x25c3 0x275f 0x2a50 0x2b8f 0x2bf6 0x2c5c 0x25c0 0x271c 0x2a54 0x2ba1 0x2c07 0x2c71 0x25bf 0x270e 0x2a52 0x2bac 0x2c19 0x2c83 0x25be 0x2700 0x2a4a 0x2bb0 0x2c2d 0x2c96 0x25bd 0x26ed 0x2a46 0x2ba7 0x2c35 0x2cb5 0x25bc 0x26d4 0x2a44 0x2b8e 0x2c41 0x2cec 0x25bb 0x26b9 0x2a3f 0x2b80 0x2c4d 0x2d11 0x25bb 0x26a1 0x29e9 0x2b83 0x2c40 0x2d02 0x25ba 0x268b 0x294e 0x2b8f 0x2c2f 0x2cda 0x25b9 0x2672 0x290b 0x2b9c 0x2c33 0x2cca 0x25b8 0x2655 0x28fa 0x2b99 0x2c39 0x2cd1 0x25b8 0x263a 0x28ee 0x2b84 0x2c35 0x2cd6 0x25b7 0x2622 0x28e6 0x2b68 0x2c34 0x2cdc 0x25b7 0x2604 0x290b 0x2b59 0x2c39 0x2ce8 0x25b6 0x25ec 0x293c 0x2b5f 0x2c3b 0x2ce7 0x25b6 0x25de 0x291d 0x2b60 0x2c36 0x2cd1 0x25b6 0x25d4 0x28ba 0x2b5f 0x2c32 0x2cc5 0x25b6 0x25cb 0x289c 0x2b62 0x2c34 0x2ccc 0x25b6 0x25c4 0x28a6 0x2b5d 0x2c32 0x2ccf 0x25b5 0x25be 0x281b 0x2b46 0x2c13 0x2cc8 0x25b5 0x25bb 0x27d7 0x2b34 0x2c13 0x2cb0 0x25b5 0x25bb 0x27c4 0x2b11 0x2c20 0x2c82 0x25b5 0x25ba 0x2810 0x2b0d 0x2c0a 0x2c51 0x25b5 0x25b9 0x2851 0x2b23 0x2be8 0x2c48 0x25b5 0x25b8 0x2853 0x2b28 0x2bef 0x2c50 0x25b4 0x25b8 0x2837 0x2ae6 0x2c1e 0x2c3a 0x25b4 0x25b6 0x2800 0x2acc 0x2bf7 0x2bfd 0x25b4 0x25b5 0x27bc 0x2aa1 0x2b7e 0x2ba7 0x25b4 0x25b4 0x2786 0x2a49 0x2b0f 0x2b35 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a>; + }; + + qcom,pc-temp-y3-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x347a 0x3456 0x3421 0x33e5 0x33e0 0x33d8 0x356b 0x345f 0x341a 0x33e4 0x33e0 0x33da 0x35ff 0x346c 0x3416 0x33e3 0x33e0 0x33db 0x364d 0x3479 0x3416 0x33e3 0x33e0 0x33dd 0x366b 0x3484 0x3418 0x33e3 0x33e0 0x33de 0x3670 0x3489 0x341c 0x33e5 0x33e0 0x33de 0x35ec 0x3489 0x3423 0x33e8 0x33e0 0x33de 0x34fc 0x3488 0x342b 0x33ed 0x33e1 0x33de 0x34bb 0x348b 0x342e 0x33ef 0x33e1 0x33de 0x34ba 0x349e 0x342f 0x33f0 0x33e1 0x33dd 0x34bb 0x34ac 0x3430 0x33f0 0x33e1 0x33dd 0x34d3 0x349e 0x343d 0x33f7 0x33e4 0x33df 0x3504 0x3481 0x3450 0x3401 0x33e9 0x33e2 0x3510 0x3471 0x3451 0x3402 0x33ea 0x33e3 0x34ec 0x3468 0x343b 0x33fe 0x33e8 0x33e2 0x34cc 0x3462 0x3427 0x33fb 0x33e6 0x33e2 0x34d0 0x345f 0x3422 0x33fd 0x33e8 0x33e2 0x34e0 0x345d 0x341f 0x3401 0x33ec 0x33e3 0x34e7 0x345a 0x341b 0x3401 0x33ec 0x33e3 0x34e9 0x3455 0x3416 0x33f9 0x33e7 0x33e0 0x34ea 0x344f 0x3411 0x33f0 0x33e3 0x33dd 0x34ec 0x3445 0x340c 0x33e8 0x33e1 0x33dc 0x34f0 0x3435 0x3407 0x33e3 0x33e0 0x33db 0x34f5 0x3427 0x3406 0x33e2 0x33df 0x33db 0x3500 0x341c 0x3405 0x33e3 0x33de 0x33db 0x3512 0x3417 0x3405 0x33e4 0x33de 0x33da 0x3525 0x3418 0x3405 0x33e3 0x33de 0x33da 0x3539 0x341b 0x3405 0x33e3 0x33dd 0x33da 0x354f 0x341f 0x3405 0x33e5 0x33dd 0x33da 0x356b 0x3423 0x3405 0x33e9 0x33dd 0x33d9 0x358d 0x3428 0x3405 0x33ec 0x33dd 0x33d9 0x35b2 0x342d 0x3400 0x33ed 0x33de 0x33d9 0x35da 0x3434 0x33f9 0x33ec 0x33de 0x33da 0x360a 0x343c 0x33f6 0x33ec 0x33df 0x33da 0x3641 0x3449 0x33f7 0x33ea 0x33de 0x33da 0x3680 0x3458 0x33f8 0x33e8 0x33de 0x33d9 0x36c1 0x3468 0x33fb 0x33e6 0x33de 0x33d9 0x3702 0x347a 0x3402 0x33e4 0x33dd 0x33d9 0x3742 0x3490 0x3408 0x33e3 0x33dd 0x33d9 0x3781 0x34b0 0x340c 0x33e3 0x33dd 0x33d9 0x37c1 0x34dc 0x340f 0x33e3 0x33dd 0x33d9 0x3803 0x3511 0x3415 0x33e3 0x33de 0x33da 0x3845 0x3550 0x341e 0x33e3 0x33de 0x33da 0x3892 0x35a3 0x3421 0x33e4 0x33de 0x33da 0x38ea 0x3613 0x3429 0x33e3 0x33de 0x33da 0x390d 0x3642 0x3430 0x33eb 0x33df 0x33dc 0x393f 0x363e 0x3435 0x33ec 0x33e1 0x33dd 0x395c 0x3658 0x3442 0x33f0 0x33e3 0x33e0 0x398d 0x36b9 0x3451 0x33f2 0x33e2 0x33e0 0x3a0b 0x3718 0x3452 0x33ee 0x33e1 0x33dd 0x3a97 0x37a6 0x345a 0x33f0 0x33e0 0x33dd 0x3b31 0x3888 0x346f 0x33f5 0x33e3 0x33e1 0x3c10 0x3978 0x3492 0x33f9 0x33e6 0x33e4 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6>; + }; + + qcom,pc-temp-y4-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x45b5 0x41d2 0x40f2 0x406d 0x4045 0x4044 0x452b 0x41db 0x40ef 0x4073 0x4045 0x4042 0x44eb 0x41eb 0x40ef 0x4078 0x4047 0x4041 0x44e9 0x4200 0x40f2 0x407b 0x4048 0x4040 0x4515 0x421b 0x40f7 0x407d 0x404a 0x4040 0x4561 0x4239 0x40fe 0x407e 0x404b 0x4040 0x4627 0x4263 0x4106 0x407c 0x404d 0x4041 0x478b 0x428e 0x4111 0x407a 0x404e 0x4044 0x4914 0x42a4 0x411c 0x407a 0x4051 0x4046 0x4b24 0x42ad 0x4127 0x4081 0x4055 0x4049 0x4c74 0x42bc 0x4138 0x408c 0x405b 0x404d 0x4a3e 0x4407 0x419f 0x409e 0x4069 0x4059 0x4560 0x4626 0x4237 0x40b4 0x407d 0x4068 0x437a 0x4642 0x4251 0x40bd 0x4081 0x406c 0x4347 0x43a8 0x4203 0x40bf 0x407d 0x406b 0x432d 0x41b1 0x41aa 0x40c3 0x407b 0x406a 0x4320 0x41b5 0x416e 0x40ec 0x4091 0x407a 0x430d 0x41e2 0x413b 0x4129 0x40ba 0x4098 0x42ef 0x41ed 0x4117 0x412a 0x40c0 0x409d 0x42b4 0x41c5 0x40fa 0x40d1 0x4094 0x407d 0x4274 0x4198 0x40e3 0x4085 0x4066 0x405b 0x4249 0x4180 0x40d4 0x4078 0x4054 0x404d 0x4228 0x416e 0x40c8 0x4072 0x4049 0x4043 0x421f 0x416b 0x40c2 0x406f 0x4048 0x4042 0x4223 0x415f 0x40be 0x406b 0x4048 0x4042 0x422b 0x414f 0x40bb 0x4069 0x4049 0x4043 0x4231 0x4143 0x40ba 0x406b 0x404b 0x4045 0x423b 0x4137 0x40ba 0x406d 0x404e 0x4048 0x4246 0x4136 0x40b9 0x406e 0x4051 0x404c 0x4252 0x4142 0x40b4 0x4070 0x4057 0x4051 0x425e 0x4154 0x40b0 0x4072 0x405e 0x4058 0x426a 0x4167 0x40b4 0x4074 0x4068 0x4063 0x4276 0x417f 0x40bd 0x4076 0x4073 0x4070 0x4283 0x4198 0x40c4 0x4074 0x4075 0x4072 0x4290 0x41b2 0x40c9 0x4069 0x4064 0x4061 0x429c 0x41cd 0x40cd 0x405e 0x404f 0x404c 0x42a8 0x41ef 0x40d2 0x405b 0x4044 0x4043 0x42b5 0x421f 0x40d8 0x4059 0x403e 0x403f 0x42c7 0x4244 0x40dc 0x405a 0x403e 0x4040 0x42e1 0x4252 0x40e9 0x405d 0x4042 0x4045 0x4308 0x425c 0x40fd 0x4060 0x4047 0x404a 0x433b 0x4262 0x410c 0x4063 0x4048 0x404b 0x437e 0x4270 0x4118 0x4064 0x4046 0x4048 0x43d3 0x4287 0x4129 0x4061 0x403d 0x403b 0x442a 0x42c2 0x4147 0x406b 0x4041 0x403e 0x441b 0x42ef 0x4160 0x4075 0x4057 0x405a 0x441e 0x4307 0x4166 0x4084 0x4070 0x4078 0x43ed 0x432a 0x4193 0x40a2 0x4099 0x40a2 0x43d0 0x436e 0x41e6 0x40be 0x409c 0x4098 0x43e5 0x4383 0x41de 0x409e 0x406e 0x4064 0x43f6 0x4384 0x41d8 0x409e 0x4060 0x4059 0x4411 0x43a0 0x41fb 0x40bd 0x4070 0x4067 0x4463 0x43f1 0x4266 0x40fb 0x4090 0x4085 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118>; + }; + + qcom,pc-temp-y5-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2208 0x348a 0x3ab0 0x3545 0x4573 0x3634 0x2208 0x34aa 0x3839 0x3326 0x4393 0x3e82 0x269f 0x34e2 0x3660 0x31db 0x419b 0x43da 0x2f8b 0x3522 0x3519 0x3130 0x3fbf 0x46e0 0x3428 0x3557 0x345a 0x30f0 0x3e34 0x4838 0x3590 0x3572 0x341a 0x30e7 0x3d2f 0x4884 0x30ee 0x3576 0x34b3 0x32d3 0x3ca4 0x46c7 0x2869 0x3578 0x35a4 0x35e5 0x3c3f 0x4385 0x267f 0x34b6 0x35c2 0x3648 0x3b81 0x4119 0x2a54 0x3032 0x3545 0x34d0 0x3996 0x3e92 0x2ff6 0x2cf8 0x3494 0x33cf 0x387f 0x3ce5 0x37e1 0x2fd6 0x333d 0x3525 0x3964 0x3cfd 0x4112 0x360e 0x319c 0x3768 0x3acb 0x3dbd 0x4280 0x3a64 0x326c 0x37dc 0x3b0d 0x3dbf 0x373b 0x3dd4 0x395e 0x3745 0x3a7a 0x3cb2 0x2cf9 0x3f72 0x3eca 0x36d1 0x3a41 0x3bb0 0x2d03 0x3ec5 0x3f83 0x384b 0x3ae8 0x3b5d 0x2edc 0x3dc2 0x3fc3 0x3b9d 0x3c38 0x3b2b 0x2f8c 0x3d9a 0x3f92 0x3dc7 0x3e57 0x3b93 0x2f1e 0x3df3 0x3ecf 0x3f34 0x4225 0x3e9f 0x2e5c 0x3e54 0x3de6 0x3fc8 0x445b 0x4233 0x2d64 0x3c6d 0x3c08 0x3c17 0x4527 0x44e0 0x2c30 0x3697 0x3971 0x3578 0x4604 0x471b 0x2b6b 0x3248 0x38a0 0x33d2 0x4627 0x47ff 0x2b06 0x2f1a 0x38d8 0x353a 0x4512 0x484d 0x2ad4 0x2d6f 0x3925 0x3660 0x43d2 0x484f 0x2add 0x2d4c 0x3975 0x3678 0x4315 0x4790 0x2aec 0x2d55 0x39cc 0x366c 0x4294 0x45bc 0x2af3 0x2d44 0x3a34 0x38ed 0x427b 0x43ff 0x2b16 0x2d12 0x3b09 0x40ee 0x4270 0x426f 0x2b4e 0x2d07 0x3ba6 0x465a 0x4280 0x41aa 0x2b80 0x2d07 0x38cb 0x47e5 0x43ef 0x42bb 0x2ba9 0x2cec 0x3382 0x48db 0x472c 0x45f6 0x2bd0 0x2ce9 0x319e 0x48b8 0x4a98 0x495f 0x2bf8 0x2d41 0x31a4 0x45bb 0x4e8c 0x4c69 0x2c20 0x2daa 0x31b5 0x4185 0x51da 0x4ea9 0x2c45 0x2dd9 0x3221 0x3e14 0x52fb 0x508e 0x2c64 0x2d8a 0x34af 0x3aee 0x5257 0x524a 0x2c6c 0x2d32 0x3713 0x3918 0x50bc 0x5292 0x2c5a 0x2d52 0x36de 0x38bf 0x4e90 0x50e7 0x2c45 0x2d99 0x34f7 0x3913 0x4dbc 0x4f8f 0x2c53 0x2da9 0x354f 0x3906 0x4ea8 0x5136 0x2cb7 0x2d71 0x370b 0x3898 0x515e 0x56c7 0x2d6c 0x2d2c 0x33cd 0x3962 0x555b 0x5c52 0x2e6e 0x2cc8 0x325a 0x3610 0x4cc2 0x4ea4 0x2fc4 0x2d10 0x320a 0x3e49 0x4394 0x4373 0x30b0 0x2d1b 0x3431 0x3e08 0x42cc 0x40b6 0x322c 0x2e86 0x370e 0x4092 0x40be 0x3f21 0x3256 0x3099 0x3915 0x3fe1 0x3e27 0x3e5b 0x322c 0x3127 0x38b1 0x3e5f 0x428d 0x410e 0x3117 0x3039 0x38e1 0x4283 0x4414 0x4431 0x2f77 0x2f18 0x37f8 0x4528 0x4741 0x4a06 0x2e6f 0x2e5e 0x37ca 0x4396 0x477b 0x4ab1 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b>; + }; + + qcom,pc-temp-y6-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1af4 0x1607 0x1492 0x13c9 0x139d 0x1392 0x1afb 0x160e 0x148d 0x13c8 0x139d 0x1393 0x1aff 0x1616 0x148a 0x13c7 0x139d 0x1394 0x1aff 0x161e 0x148a 0x13c8 0x139d 0x1395 0x1afc 0x1626 0x148c 0x13c9 0x139e 0x1395 0x1af7 0x162e 0x148e 0x13ca 0x139f 0x1396 0x1ac7 0x1636 0x1494 0x13cc 0x139f 0x1397 0x1a78 0x163e 0x149c 0x13cf 0x13a1 0x1397 0x1a74 0x1646 0x14a1 0x13d2 0x13a2 0x1398 0x1aff 0x164c 0x14a3 0x13d4 0x13a3 0x1399 0x1b70 0x1657 0x14a8 0x13d7 0x13a5 0x139a 0x1af4 0x16ac 0x14cc 0x13e2 0x13ac 0x139f 0x19d3 0x172c 0x1503 0x13ef 0x13b5 0x13a6 0x1941 0x172c 0x150b 0x13f2 0x13b7 0x13a8 0x190e 0x1670 0x14e5 0x13f1 0x13b5 0x13a7 0x18f6 0x15e2 0x14be 0x13f0 0x13b3 0x13a7 0x18fb 0x15e4 0x14ab 0x13fd 0x13bb 0x13ac 0x1909 0x15f5 0x149c 0x1412 0x13c9 0x13b5 0x190d 0x15f9 0x148f 0x1412 0x13cb 0x13b7 0x190c 0x15ed 0x1483 0x13f3 0x13bb 0x13ab 0x190a 0x15e0 0x147a 0x13d6 0x13ab 0x139f 0x190d 0x15d6 0x1473 0x13cd 0x13a4 0x139a 0x191a 0x15ce 0x146e 0x13c8 0x13a1 0x1397 0x192c 0x15c9 0x146d 0x13c7 0x13a0 0x1397 0x1945 0x15c7 0x146e 0x13c7 0x13a0 0x1397 0x1964 0x15c6 0x146f 0x13c8 0x13a0 0x1398 0x1982 0x15cb 0x1470 0x13c9 0x13a1 0x1398 0x19a0 0x15d5 0x1473 0x13ca 0x13a2 0x1399 0x19c0 0x15e2 0x1475 0x13cc 0x13a3 0x139a 0x19e6 0x15f3 0x1476 0x13d0 0x13a5 0x139c 0x1a11 0x1607 0x1477 0x13d4 0x13a7 0x139e 0x1a3f 0x161d 0x1478 0x13d6 0x13ab 0x13a2 0x1a72 0x1638 0x1479 0x13d7 0x13af 0x13a6 0x1aa7 0x1655 0x147b 0x13d6 0x13b0 0x13a7 0x1ae0 0x1676 0x147f 0x13d2 0x13ab 0x13a2 0x1b1c 0x169b 0x1483 0x13ce 0x13a5 0x139c 0x1b59 0x16c6 0x1488 0x13cc 0x13a2 0x139a 0x1b96 0x16f8 0x1490 0x13cb 0x13a0 0x1398 0x1bd4 0x1732 0x149a 0x13ca 0x13a0 0x1399 0x1c13 0x1772 0x14a5 0x13cb 0x13a1 0x139a 0x1c51 0x17bc 0x14b0 0x13cd 0x13a3 0x139c 0x1c90 0x1811 0x14bf 0x13ce 0x13a4 0x139d 0x1cd3 0x1875 0x14d0 0x13cf 0x13a3 0x139c 0x1d22 0x18ef 0x14e0 0x13d0 0x13a1 0x1399 0x1d80 0x1984 0x14f9 0x13d2 0x13a3 0x139a 0x1da5 0x19b9 0x150c 0x13db 0x13a9 0x13a3 0x1dcf 0x19c4 0x1513 0x13e1 0x13b2 0x13ad 0x1dde 0x19e7 0x152f 0x13ec 0x13bf 0x13bb 0x1e04 0x1a57 0x155a 0x13f6 0x13c0 0x13b8 0x1e6d 0x1abf 0x1560 0x13eb 0x13b2 0x13a7 0x1edf 0x1b41 0x1573 0x13ee 0x13ae 0x13a5 0x1f66 0x1c0d 0x15ab 0x13fd 0x13b6 0x13ac 0x2034 0x1cdf 0x160e 0x1415 0x13c2 0x13b7 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4>; + }; + }; + }; + }; + }; + + fragment@12 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm1 { + reg = <0x4f>; + label = "pa_therm1"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@13 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x4d 0xffffffff 0x4e 0xffffffff 0x4f 0xffffffff 0x52>; + + pa_therm1 { + reg = <0x4f>; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + }; + }; + }; + + fragment@14 { + target = <0xffffffff>; + + __overlay__ { + compatible = "qcom,ufs-phy-qmp-v3"; + vdda-phy-supply = <0xffffffff>; + vdda-pll-supply = <0xffffffff>; + vdda-phy-max-microamp = <0xf5b4>; + vdda-pll-max-microamp = <0x477c>; + status = "ok"; + }; + }; + + fragment@15 { + target = <0xffffffff>; + + __overlay__ { + vdd-hba-supply = <0xffffffff>; + vdd-hba-fixed-regulator; + vcc-supply = <0xffffffff>; + vcc-voltage-level = <0x2d2a80 0x2d2a80>; + vcc-max-microamp = <0x927c0>; + vccq2-supply = <0xffffffff>; + vccq2-voltage-level = <0x1ab3f0 0x1dc130>; + vccq2-max-microamp = <0x927c0>; + qcom,vddp-ref-clk-supply = <0xffffffff>; + qcom,vddp-ref-clk-max-microamp = <0x64>; + status = "ok"; + }; + }; + + fragment@16 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0x8b290>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <0x1b7740 0x1b7740>; + qcom,vdd-io-current-level = <0x0 0x4f588>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + status = "ok"; + }; + }; + + fragment@17 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0xc3500>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-voltage-level = <0x1b7740 0x2d0370>; + qcom,vdd-io-current-level = <0x0 0x55f0>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + cd-gpios = <0xffffffff 0x45 0x1>; + status = "ok"; + }; + }; + + fragment@18 { + target = <0xffffffff>; + + __overlay__ { + + pa-therm1 { + polling-delay-passive = <0x0>; + polling-delay = <0x0>; + thermal-governor = "user_space"; + thermal-sensors = <0xffffffff 0x4f>; + wake-capable-sensor; + + trips { + + active-config0 { + temperature = <0x1e848>; + hysteresis = <0x3e8>; + type = "passive"; + }; + }; + }; + + quiet-therm-step { + status = "disabled"; + }; + }; + }; + + fragment@19 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@20 { + target = <0xffffffff>; + + __overlay__ { + qcom,battery-data = <0x14>; + qcom,qg-iterm-ma = <0x64>; + qcom,hold-soc-while-full; + qcom,linearize-soc; + qcom,cl-feedback-on; + }; + }; + + fragment@21 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x8 0xffffffff 0x7 0xffffffff 0x9 0xffffffff 0x6 0xffffffff 0x4f 0xffffffff 0x99 0xffffffff 0x83>; + io-channel-names = "usb_in_voltage", "usb_in_current", "chg_temp", "die_temp", "conn_temp", "sbux_res", "vph_voltage"; + qcom,battery-data = <0x14>; + qcom,auto-recharge-soc = <0x62>; + qcom,step-charging-enable; + qcom,sw-jeita-enable; + qcom,fcc-stepping-enable; + qcom,suspend-input-on-debug-batt; + qcom,sec-charger-config = <0x3>; + qcom,thermal-mitigation = <0x401640 0x3567e0 0x2dc6c0 0x2625a0 0x1e8480 0x16e360 0xf4240 0x7a120>; + dpdm-supply = <0xffffffff>; + qcom,charger-temp-max = <0x320>; + qcom,smb-temp-max = <0x320>; + qcom,fcc-step-delay-ms = <0x64>; + qcom,fcc-step-size-ua = <0x186a0>; + qcom,disable-sw-thermal-regulation; + qcom,disable-fcc-restriction; + qcom,smb-internal-pull-kohm = <0x0>; + }; + }; + + fragment@22 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + }; + }; + }; + + fragment@23 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@24 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,i2c-touch-active = "synaptics,tcm-i2c"; + + synaptics_tcm@20 { + compatible = "synaptics,tcm-i2c"; + reg = <0x20>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend", "pmx_ts_release"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + pinctrl-2 = <0xffffffff>; + vdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + synaptics,pwr-reg-name = "avdd"; + synaptics,bus-reg-name = "vdd"; + synaptics,irq-gpio = <0xffffffff 0x9 0x2008>; + synaptics,irq-on-state = <0x0>; + synaptics,reset-gpio = <0xffffffff 0x8 0x0>; + synaptics,reset-on-state = <0x0>; + synaptics,reset-active-ms = <0x14>; + synaptics,reset-delay-ms = <0xc8>; + synaptics,power-delay-ms = <0xc8>; + synaptics,ubl-i2c-addr = <0x20>; + }; + + atmel_mxt_ts@4a { + compatible = "atmel,maxtouch"; + reg = <0x4a>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + avdd-supply = <0xffffffff>; + vdd-supply = <0xffffffff>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + reset-gpios = <0xffffffff 0x8 0x0>; + irq-gpios = <0xffffffff 0x9 0x2008>; + atmel,xy_switch; + atmel,panel-coords = <0x0 0x0 0x1df 0x31f>; + atmel,display-coords = <0x0 0x0 0x153 0x301>; + }; + }; + }; + + fragment@25 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,clk-freq-out = <0xf4240>; + #address-cells = <0x1>; + #size-cells = <0x0>; + + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <0xffffffff 0x25 0x0>; + qcom,nq-ven = <0xffffffff 0xc 0x0>; + qcom,nq-firm = <0xffffffff 0x24 0x0>; + qcom,nq-clkreq = <0xffffffff 0x1f 0x0>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff>; + }; + }; + }; + + fragment@26 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-aux-switch = <0xffffffff>; + }; + }; + + fragment@27 { + target = <0xffffffff>; + + __overlay__ { + + lpi_pinctrl@627C0000 { + compatible = "qcom,lpi-pinctrl"; + reg = <0x627c0000 0x0>; + qcom,num-gpios = <0xf>; + gpio-controller; + #gpio-cells = <0x2>; + qcom,slew-reg = <0x6295a000 0x0>; + qcom,lpi-offset-tbl = <0x0 0x1000 0x2000 0x3000 0x4000 0x5000 0x6000 0x7000 0x8000 0x9000 0xa000 0xb000 0xc000 0xd000 0xe000>; + qcom,lpi-slew-offset-tbl = <0x0 0x2 0x4 0x8 0xa 0xc 0x0 0x0 0x0 0x0 0x10 0x12 0x0 0x0 0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + phandle = <0x32>; + + dmic01_clk_active { + phandle = <0x33>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic01_clk_sleep { + phandle = <0x35>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic01_data_active { + phandle = <0x34>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic01_data_sleep { + phandle = <0x36>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic23_clk_active { + phandle = <0x37>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic23_clk_sleep { + phandle = <0x39>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic23_data_active { + phandle = <0x38>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic23_data_sleep { + phandle = <0x3a>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic45_clk_active { + phandle = <0x3b>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic45_clk_sleep { + phandle = <0x3d>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic45_data_active { + phandle = <0x3c>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic45_data_sleep { + phandle = <0x3e>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + tx_swr_clk_sleep { + phandle = <0x4b>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_clk_active { + phandle = <0x47>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + tx_swr_data0_sleep { + phandle = <0x4c>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data0_active { + phandle = <0x48>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_sleep { + phandle = <0x41>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_active { + phandle = <0x3f>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_data_sleep { + phandle = <0x42>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_data_active { + phandle = <0x40>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data1_sleep { + phandle = <0x4d>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data1_active { + phandle = <0x49>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data2_sleep { + phandle = <0x4e>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data2_active { + phandle = <0x4a>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + rx_swr_clk_sleep { + phandle = <0x45>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_clk_active { + phandle = <0x43>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + rx_swr_data_sleep { + phandle = <0x46>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_data_active { + phandle = <0x44>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + lpi_i2s1_sck_active { + phandle = <0x55>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sck_sleep { + phandle = <0x59>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_ws_active { + phandle = <0x56>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_ws_sleep { + phandle = <0x5a>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd0_active { + phandle = <0x57>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd0_sleep { + phandle = <0x5b>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd1_active { + phandle = <0x58>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd1_sleep { + phandle = <0x5c>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + }; + + fragment@28 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x4>; + + bolero-clk-rsc-mngr { + compatible = "qcom,bolero-clk-rsc-mngr"; + qcom,fs-gen-sequence = <0x3000 0x1 0x3004 0x1 0x3080 0x2>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,va_mclk_mode_muxsel = <0x627a0000>; + clock-names = "tx_core_clk", "tx_npl_clk", "rx_core_clk", "rx_npl_clk", "wsa_core_clk", "wsa_npl_clk", "va_core_clk", "va_npl_clk"; + clocks = <0x15 0x0 0x16 0x0 0x17 0x0 0x18 0x0 0x19 0x0 0x1a 0x0 0x1b 0x0 0x1c 0x0>; + }; + + tx-macro@62620000 { + compatible = "qcom,tx-macro"; + reg = <0x62620000 0x0>; + clock-names = "tx_core_clk", "tx_npl_clk"; + clocks = <0x15 0x0 0x16 0x0>; + qcom,tx-swr-gpios = <0x1d>; + qcom,tx-dmic-sample-rate = <0x249f00>; + phandle = <0xb2>; + + tx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x3>; + swrm-io-base = <0x62630000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x1>; + interrupts = <0x0 0x128 0x0 0x0 0x22b 0x0>; + interrupt-names = "swr_master_irq", "swr_wake_irq"; + qcom,swr-wakeup-required = <0x0>; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x21 0xf 0x2 0x12 0x1 0x2 0x13 0x2 0x3 0x14 0x1 0x3 0x15 0x2 0x4 0x16 0x1 0x4 0x17 0x2 0x4 0x18 0x4 0x4 0x19 0x8 0x5 0x1a 0x1 0x5 0x1b 0x2 0x5 0x1c 0x4 0x5 0x1d 0x8>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + qcom,swr-mstr-irq-wakeup-capable = <0x1>; + phandle = <0xb3>; + + wcd938x-tx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170223>; + phandle = <0x24>; + }; + + wcd937x-tx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170223>; + phandle = <0x28>; + }; + }; + }; + + rx-macro@62600000 { + compatible = "qcom,rx-macro"; + reg = <0x62600000 0x0>; + clock-names = "rx_core_clk", "rx_npl_clk"; + clocks = <0x17 0x0 0x18 0x0>; + qcom,rx-swr-gpios = <0x1e>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,rx-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + phandle = <0xb4>; + + rx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x2>; + swrm-io-base = <0x62610000 0x0>; + interrupts = <0x0 0x129 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x9 0x1 0x1 0xa 0x2 0x2 0xd 0x1 0x3 0xb 0x1 0x3 0xc 0x2 0x4 0xe 0x1 0x5 0xf 0x1 0x5 0x10 0x2>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + phandle = <0xb5>; + + wcd938x-rx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170224>; + phandle = <0x23>; + }; + + wcd937x-rx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170224>; + phandle = <0x27>; + }; + }; + }; + + wsa-macro@62640000 { + compatible = "qcom,wsa-macro"; + reg = <0x62640000 0x0>; + clock-names = "wsa_core_clk", "wsa_npl_clk"; + clocks = <0x19 0x0 0x1a 0x0>; + qcom,wsa-swr-gpios = <0x1f>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,wsa-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + status = "disabled"; + phandle = <0xb6>; + + wsa_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + qcom,swr_master_id = <0x1>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + swrm-io-base = <0x62650000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x0>; + interrupts = <0x0 0x127 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x8>; + qcom,swr-port-mapping = <0x1 0x1 0x1 0x2 0x3 0xf 0x3 0x2 0x3 0x4 0x5 0x1 0x5 0x7 0xf 0x6 0x6 0x3 0x7 0x4 0x3 0x8 0x8 0x3>; + qcom,swr-num-dev = <0x2>; + phandle = <0xb7>; + + wsa881x@20170211 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170211>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2d>; + }; + + wsa881x@20170212 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170212>; + qcom,spkr-sd-n-node = <0x21>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2e>; + }; + + wsa881x@21170213 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170213>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2f>; + }; + + wsa881x@21170214 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170214>; + qcom,spkr-sd-n-node = <0x21>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x30>; + }; + }; + }; + + va-macro@62770000 { + compatible = "qcom,va-macro"; + reg = <0x62770000 0x0>; + clock-names = "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0>; + qcom,va-clk-mux-select = <0x1>; + qcom,va-island-mode-muxsel = <0x627a0000>; + qcom,va-dmic-sample-rate = <0x927c0>; + qcom,default-clk-id = <0x0>; + phandle = <0xb8>; + }; + + wcd938x-codec { + compatible = "qcom,wcd938x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x0 0x13 0x2 0x0 0x13 0x1 0x14 0x1 0x0 0x14 0x1 0x15 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x2 0x18 0x4 0x0 0x18 0x2 0x19 0x8 0x0 0x19 0x3 0x1a 0x1 0x0 0x1a 0x3 0x1b 0x2 0x0 0x1b 0x3 0x1c 0x4 0x0 0x1c 0x3 0x1d 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x22>; + qcom,rx-slave = <0x23>; + qcom,tx-slave = <0x24>; + cdc-vdd-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-rxtx-current = <0x7530>; + cdc-vddio-supply = <0xffffffff>; + qcom,cdc-vddio-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddio-current = <0x7530>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0xaf0>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-micbias4-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-rxtx", "cdc-vddio", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + mbhc-button-thres = <0x25 0xd 0x3f 0x25 0x58 0x8a 0x25 0x8a 0x8a 0x25 0xe1 0xe1 0x25 0x1c2 0x1c2 0x25 0x1c2 0x26c 0x25 0x1c2 0x26c 0x25 0x1c2 0x26c>; + imp-table = <0x26 0x0 0x5 0x6 0x26 0x6 0x17 0x8 0x26 0x18 0x26 0x7 0x26 0x27 0x64 0x6 0x26 0x65 0xa0 0xa 0x26 0xa1 0x190 0xb 0x26 0x191 0x7d0 0xb 0x26 0x7d1 0x7fffffff 0x6>; + phandle = <0x31>; + }; + + wcd937x-codec { + status = "disabled"; + compatible = "qcom,wcd937x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x1 0x13 0x1 0x0 0x14 0x1 0x14 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x3 0x18 0x1 0x0 0x1a 0x3 0x19 0x2 0x0 0x1b 0x3 0x1a 0x4 0x0 0x1c 0x3 0x1b 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x22>; + qcom,rx-slave = <0x27>; + qcom,tx-slave = <0x28>; + cdc-vdd-ldo-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-ldo-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-ldo-rxtx-current = <0x61a8>; + cdc-vddpx-1-supply = <0xffffffff>; + qcom,cdc-vddpx-1-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddpx-1-current = <0x2710>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0x708>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-ldo-rxtx", "cdc-vddpx-1", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + phandle = <0xb9>; + }; + }; + }; + + fragment@29 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,msm-mi2s-master = <0x1 0x1 0x1 0x1 0x1 0x1>; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS4", "MIC BIAS4", "Analog Mic4", "TX DMIC0", "MIC BIAS1", "MIC BIAS1", "Digital Mic0", "TX DMIC1", "MIC BIAS1", "MIC BIAS1", "Digital Mic1", "TX DMIC2", "MIC BIAS3", "MIC BIAS3", "Digital Mic2", "TX DMIC3", "MIC BIAS3", "MIC BIAS3", "Digital Mic3", "TX DMIC4", "MIC BIAS4", "MIC BIAS4", "Digital Mic4", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "IN3_AUX", "AUX_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "TX SWR_DMIC0", "DMIC1_OUTPUT", "TX SWR_DMIC1", "DMIC2_OUTPUT", "TX SWR_DMIC2", "DMIC3_OUTPUT", "TX SWR_DMIC3", "DMIC4_OUTPUT", "TX SWR_DMIC4", "DMIC5_OUTPUT", "TX SWR_DMIC5", "DMIC6_OUTPUT", "TX SWR_DMIC6", "DMIC7_OUTPUT", "TX SWR_DMIC7", "DMIC8_OUTPUT", "WSA SRC0_INP", "SRC0", "WSA_TX DEC0_INP", "TX DEC0 MUX", "WSA_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "SpkrLeft IN", "WSA_SPK1 OUT", "SpkrRight IN", "WSA_SPK2 OUT", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA MIC BIAS1", "Digital Mic0", "VA MIC BIAS1", "Digital Mic1", "VA MIC BIAS3", "Digital Mic2", "VA MIC BIAS3", "Digital Mic3", "VA MIC BIAS4", "Digital Mic4", "VA DMIC0", "VA MIC BIAS1", "VA DMIC1", "VA MIC BIAS1", "VA DMIC2", "VA MIC BIAS3", "VA DMIC3", "VA MIC BIAS3", "VA DMIC4", "VA MIC BIAS4", "VA SWR_ADC0", "VA_SWR_CLK", "VA SWR_ADC1", "VA_SWR_CLK", "VA SWR_ADC2", "VA_SWR_CLK", "VA SWR_ADC3", "VA_SWR_CLK", "VA SWR_MIC0", "VA_SWR_CLK", "VA SWR_MIC1", "VA_SWR_CLK", "VA SWR_MIC2", "VA_SWR_CLK", "VA SWR_MIC3", "VA_SWR_CLK", "VA SWR_MIC4", "VA_SWR_CLK", "VA SWR_MIC5", "VA_SWR_CLK", "VA SWR_MIC6", "VA_SWR_CLK", "VA SWR_MIC7", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT", "VA SWR_MIC0", "DMIC1_OUTPUT", "VA SWR_MIC1", "DMIC2_OUTPUT", "VA SWR_MIC2", "DMIC3_OUTPUT", "VA SWR_MIC3", "DMIC4_OUTPUT", "VA SWR_MIC4", "DMIC5_OUTPUT", "VA SWR_MIC5", "DMIC6_OUTPUT", "VA SWR_MIC6", "DMIC7_OUTPUT", "VA SWR_MIC7", "DMIC8_OUTPUT"; + qcom,msm-mbhc-hphl-swh = <0x1>; + qcom,msm-mbhc-gnd-swh = <0x1>; + qcom,cdc-dmic01-gpios = <0x29>; + qcom,cdc-dmic23-gpios = <0x2a>; + qcom,cdc-dmic45-gpios = <0x2b>; + asoc-codec = <0xffffffff 0xffffffff 0x2c>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec", "msm-ext-disp-audio-codec-rx"; + qcom,wsa-max-devs = <0x2>; + qcom,wsa-devs = <0x2d 0x2e 0x2f 0x30>; + qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight", "SpkrLeft", "SpkrRight"; + qcom,codec-max-aux-devs = <0x1>; + qcom,codec-aux-devs = <0x31>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x32 0xffffffff>; + }; + }; + + fragment@30 { + target = <0xffffffff>; + + __overlay__ { + + cdc_dmic01_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x33 0x34>; + pinctrl-1 = <0x35 0x36>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x29>; + }; + + cdc_dmic23_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x37 0x38>; + pinctrl-1 = <0x39 0x3a>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2a>; + }; + + cdc_dmic45_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3b 0x3c>; + pinctrl-1 = <0x3d 0x3e>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2b>; + }; + + wsa_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3f 0x40>; + pinctrl-1 = <0x41 0x42>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x1f>; + }; + + rx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x43 0x44>; + pinctrl-1 = <0x45 0x46>; + qcom,lpi-gpios; + phandle = <0x1e>; + }; + + tx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x47 0x48 0x49 0x4a>; + pinctrl-1 = <0x4b 0x4c 0x4d 0x4e>; + qcom,lpi-gpios; + qcom,chip-wakeup-reg = <0x1ffb000>; + qcom,chip-wakeup-maskbit = <0x0>; + qcom,chip-wakeup-default-val = <0x1>; + phandle = <0x1d>; + }; + }; + }; + + fragment@31 { + target = <0xffffffff>; + + __overlay__ { + + wsa_spkr_en1_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x20>; + }; + + wsa_spkr_en2_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x21>; + }; + + msm_cdc_pinctrl@58 { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + phandle = <0x22>; + }; + + wsa_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x3>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x309>; + #clock-cells = <0x1>; + phandle = <0x19>; + }; + + wsa_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x4>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30a>; + #clock-cells = <0x1>; + phandle = <0x1a>; + }; + + rx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x5>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30e>; + #clock-cells = <0x1>; + phandle = <0x17>; + }; + + rx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x6>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30f>; + #clock-cells = <0x1>; + phandle = <0x18>; + }; + + tx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x7>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30c>; + #clock-cells = <0x1>; + phandle = <0x15>; + }; + + tx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x8>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30d>; + #clock-cells = <0x1>; + phandle = <0x16>; + }; + + va_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x2>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30b>; + #clock-cells = <0x1>; + phandle = <0x1b>; + }; + + va_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0xa>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x310>; + #clock-cells = <0x1>; + phandle = <0x1c>; + }; + }; + }; + + fragment@32 { + target = <0xffffffff>; + + __overlay__ { + qcom,msm-dai-is-island-supported = <0x1>; + }; + }; + + fragment@33 { + target = <0xffffffff>; + + __overlay__ { + hsuart8 = "/soc/qcom,qup_hsuart@a88000"; + }; + }; + + fragment@34 { + target = <0xffffffff>; + + __overlay__ { + + qcom,qup_hsuart@a88000 { + compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; + reg = <0xa88000 0x4000>; + reg-names = "se_phys"; + clock-names = "se-clk", "m-ahb", "s-ahb"; + clocks = <0xffffffff 0x50 0xffffffff 0x5a 0xffffffff 0x5b>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4f 0x50>; + pinctrl-1 = <0x51 0x52>; + interrupts = <0x0 0x163 0x0>; + qcom,wrapper-core = <0xffffffff>; + always-on-clock; + status = "ok"; + phandle = <0xba>; + }; + }; + }; + + fragment@35 { + target = <0xffffffff>; + + __overlay__ { + + qupv3_se8_2hsuart_pins { + phandle = <0xbb>; + + qupv3_se8_2uart_tx_active { + phandle = <0x4f>; + + mux { + pins = "gpio44"; + function = "qup12"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_rx_active { + phandle = <0x50>; + + mux { + pins = "gpio45"; + function = "qup12"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_tx_sleep { + phandle = <0x51>; + + mux { + pins = "gpio44"; + function = "gpio"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + input-enable; + }; + }; + + qupv3_se8_2uart_rx_sleep { + phandle = <0x52>; + + mux { + pins = "gpio45"; + function = "gpio"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@36 { + target = <0xffffffff>; + + __overlay__ { + + dcc_curr_link@3 { + qcom,curr-link-list = <0x3>; + qcom,data-sink = "sram"; + qcom,link-list = <0x0 0x18000024 0x1 0x0 0x0 0x18000040 0x1 0x0 0x0 0x18010024 0x1 0x0 0x0 0x18010040 0x1 0x0 0x0 0x18020024 0x1 0x0 0x0 0x18020040 0x1 0x0 0x0 0x18030024 0x1 0x0 0x0 0x18030040 0x1 0x0 0x0 0x18040024 0x1 0x0 0x0 0x18040040 0x1 0x0 0x0 0x18050024 0x1 0x0 0x0 0x18050040 0x1 0x0 0x0 0x18060024 0x1 0x0 0x0 0x18060040 0x1 0x0 0x0 0x18070024 0x1 0x0 0x0 0x18070040 0x1 0x0 0x0 0x18080024 0x1 0x0 0x0 0x18080040 0x1 0x0 0x0 0x180800f8 0x1 0x0 0x0 0x18080104 0x1 0x0 0x0 0x1808011c 0x1 0x0 0x0 0x18080128 0x1 0x0 0x0 0x18321700 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18325f00 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x18321818 0x1 0x0 0x0 0x18323818 0x1 0x0 0x0 0x18326018 0x1 0x0 0x0 0x18321920 0x1 0x0 0x0 0x1832102c 0x1 0x0 0x0 0x18321044 0x1 0x0 0x0 0x18321710 0x1 0x0 0x0 0x1832176c 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18323920 0x1 0x0 0x0 0x1832302c 0x1 0x0 0x0 0x18323044 0x1 0x0 0x0 0x18323710 0x1 0x0 0x0 0x1832376c 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18326120 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18325844 0x1 0x0 0x0 0x18325f10 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280000 0x2 0x0 0x0 0x18282000 0x2 0x0 0x0 0x18284000 0x2 0x0 0x0 0x9680000 0x1 0x0 0x0 0x9680004 0x1 0x0 0x2 0x8 0x0 0x0 0x0 0x9681000 0x1 0x0 0x2 0x1 0x0 0x0 0x0 0x9681004 0x1 0x0 0x0 0x9681008 0x1 0x0 0x0 0x968100c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9698500 0x1 0x0 0x0 0x9698504 0x1 0x0 0x0 0x9698508 0x1 0x0 0x0 0x969850c 0x1 0x0 0x0 0x9698510 0x1 0x0 0x0 0x9698514 0x1 0x0 0x0 0x9698518 0x1 0x0 0x0 0x969851c 0x1 0x0 0x0 0x9698700 0x1 0x0 0x0 0x9698704 0x1 0x0 0x0 0x9698708 0x1 0x0 0x0 0x969870c 0x1 0x0 0x0 0x9698714 0x1 0x0 0x0 0x9698718 0x1 0x0 0x0 0x969871c 0x1 0x0 0x0 0x1620204 0x1 0x0 0x0 0x1620240 0x1 0x0 0x0 0x1620248 0x1 0x0 0x0 0x1620288 0x1 0x0 0x0 0x162028c 0x1 0x0 0x0 0x1620290 0x1 0x0 0x0 0x1620294 0x1 0x0 0x0 0x16202a8 0x1 0x0 0x0 0x16202ac 0x1 0x0 0x0 0x16202b0 0x1 0x0 0x0 0x16202b4 0x1 0x0 0x0 0x1620300 0x1 0x0 0x0 0x16e0404 0x1 0x0 0x0 0x16e0408 0x1 0x0 0x0 0x16e0410 0x1 0x0 0x0 0x16e0420 0x1 0x0 0x0 0x16e0424 0x1 0x0 0x0 0x16e0428 0x1 0x0 0x0 0x16e042c 0x1 0x0 0x0 0x16e0430 0x1 0x0 0x0 0x16e0434 0x1 0x0 0x0 0x16e0438 0x1 0x0 0x0 0x16e043c 0x1 0x0 0x0 0x16e0300 0x1 0x0 0x0 0x16e0304 0x1 0x0 0x0 0x16e0700 0x1 0x0 0x0 0x16e0704 0x1 0x0 0x0 0x1700c00 0x1 0x0 0x0 0x1700c08 0x1 0x0 0x0 0x1700c10 0x1 0x0 0x0 0x1700c20 0x1 0x0 0x0 0x1700c24 0x1 0x0 0x0 0x1700c28 0x1 0x0 0x0 0x1700c2c 0x1 0x0 0x0 0x1700c30 0x1 0x0 0x0 0x1700c34 0x1 0x0 0x0 0x1700c38 0x1 0x0 0x0 0x1700c3c 0x1 0x0 0x0 0x1700300 0x1 0x0 0x0 0x1700304 0x1 0x0 0x0 0x1700308 0x1 0x0 0x0 0x170030c 0x1 0x0 0x0 0x1700310 0x1 0x0 0x0 0x1700500 0x1 0x0 0x0 0x1700504 0x1 0x0 0x0 0x1700508 0x1 0x0 0x0 0x170050c 0x1 0x0 0x0 0x1700900 0x1 0x0 0x0 0x1700904 0x1 0x0 0x0 0x1700908 0x1 0x0 0x0 0x1740004 0x1 0x0 0x0 0x1740008 0x1 0x0 0x0 0x1740010 0x1 0x0 0x0 0x1740020 0x1 0x0 0x0 0x1740024 0x1 0x0 0x0 0x1740028 0x1 0x0 0x0 0x174002c 0x1 0x0 0x0 0x1740030 0x1 0x0 0x0 0x1740034 0x1 0x0 0x0 0x1740038 0x1 0x0 0x0 0x174003c 0x1 0x0 0x0 0x1740300 0x1 0x0 0x0 0x1740304 0x1 0x0 0x0 0x1740308 0x1 0x0 0x0 0x174030c 0x1 0x0 0x0 0x1740310 0x1 0x0 0x0 0x1740314 0x1 0x0 0x0 0x9698204 0x1 0x0 0x0 0x9698240 0x1 0x0 0x0 0x9698244 0x1 0x0 0x0 0x9698248 0x1 0x0 0x0 0x969824c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x9681018 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9160204 0x1 0x0 0x0 0x9160240 0x1 0x0 0x0 0x9160248 0x1 0x0 0x0 0x9160288 0x1 0x0 0x0 0x9160290 0x1 0x0 0x0 0x9160300 0x1 0x0 0x0 0x9160304 0x1 0x0 0x0 0x9160308 0x1 0x0 0x0 0x916030c 0x1 0x0 0x0 0x9160310 0x1 0x0 0x0 0x9160314 0x1 0x0 0x0 0x9160318 0x1 0x0 0x0 0x9160008 0x1 0x0 0x0 0x9160010 0x1 0x0 0x0 0x9160020 0x1 0x0 0x0 0x9160024 0x1 0x0 0x0 0x9160028 0x1 0x0 0x0 0x916002c 0x1 0x0 0x0 0x9160030 0x1 0x0 0x0 0x9160034 0x1 0x0 0x0 0x9160038 0x1 0x0 0x0 0x916003c 0x1 0x0 0x0 0x63042680 0x1 0x0 0x0 0x63042684 0x1 0x0 0x0 0x63042688 0x1 0x0 0x0 0x63042690 0x1 0x0 0x0 0x630426a0 0x1 0x0 0x0 0x630426a4 0x1 0x0 0x0 0x630426a8 0x1 0x0 0x0 0x630426ac 0x1 0x0 0x0 0x630426b0 0x1 0x0 0x0 0x630426b4 0x1 0x0 0x0 0x630426b8 0x1 0x0 0x0 0x630426bc 0x1 0x0 0x0 0x63041900 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x1620500 0x4 0x0 0x0 0x1620700 0x4 0x0 0x0 0x1620300 0x1 0x0 0x0 0x1620f00 0x2 0x0 0x0 0x1620b00 0x2 0x0 0x0 0x1700b00 0x2 0x0 0x0 0x1700700 0x3 0x0 0x0 0x9163100 0x1 0x0 0x0 0x96aa100 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x9991500 0x8 0x0 0x0 0x9050008 0x1 0x0 0x0 0x9050078 0x1 0x0 0x0 0x9236028 0x1 0x0 0x0 0x923602c 0x1 0x0 0x0 0x9236030 0x1 0x0 0x0 0x9236034 0x1 0x0 0x0 0x9236038 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x92360b0 0x1 0x0 0x0 0x9236044 0x1 0x0 0x0 0x9236048 0x1 0x0 0x0 0x923604c 0x1 0x0 0x0 0x9236050 0x1 0x0 0x0 0x923e030 0x1 0x0 0x0 0x923e034 0x1 0x0 0x0 0x9241000 0x1 0x0 0x0 0x9248058 0x1 0x0 0x0 0x924805c 0x1 0x0 0x0 0x9248060 0x1 0x0 0x0 0x9248064 0x1 0x0 0x0 0x9260410 0x1 0x0 0x0 0x92e0410 0x1 0x0 0x0 0x9260414 0x1 0x0 0x0 0x92e0414 0x1 0x0 0x0 0x9260418 0x1 0x0 0x0 0x92e0418 0x1 0x0 0x0 0x9260420 0x1 0x0 0x0 0x9260424 0x1 0x0 0x0 0x9260430 0x1 0x0 0x0 0x9260440 0x1 0x0 0x0 0x9260448 0x1 0x0 0x0 0x92604a0 0x1 0x0 0x0 0x92604b0 0x1 0x0 0x0 0x92604d0 0x2 0x0 0x0 0x9261440 0x1 0x0 0x0 0x92e0420 0x1 0x0 0x0 0x92e0424 0x1 0x0 0x0 0x92e0430 0x1 0x0 0x0 0x92e0440 0x1 0x0 0x0 0x92e0448 0x1 0x0 0x0 0x92e04a0 0x1 0x0 0x0 0x92e04b0 0x1 0x0 0x0 0x92e04d0 0x2 0x0 0x0 0x9600000 0x1 0x0 0x0 0x9601000 0x1 0x0 0x0 0x9602000 0x1 0x0 0x0 0x9603000 0x1 0x0 0x0 0x9604000 0x1 0x0 0x0 0x9605000 0x1 0x0 0x0 0x9606000 0x1 0x0 0x0 0x9607000 0x1 0x0 0x0 0x9608000 0x1 0x0 0x0 0x9609000 0x1 0x0 0x0 0x960a000 0x1 0x0 0x0 0x960b000 0x1 0x0 0x0 0x960c000 0x1 0x0 0x0 0x960d000 0x1 0x0 0x0 0x960e000 0x1 0x0 0x0 0x960f000 0x1 0x0 0x0 0x9610000 0x1 0x0 0x0 0x9611000 0x1 0x0 0x0 0x9612000 0x1 0x0 0x0 0x9613000 0x1 0x0 0x0 0x9614000 0x1 0x0 0x0 0x9615000 0x1 0x0 0x0 0x9616000 0x1 0x0 0x0 0x9617000 0x1 0x0 0x0 0x9618000 0x1 0x0 0x0 0x9619000 0x1 0x0 0x0 0x961a000 0x1 0x0 0x0 0x961b000 0x1 0x0 0x0 0x961c000 0x1 0x0 0x0 0x961d000 0x1 0x0 0x0 0x961e000 0x1 0x0 0x0 0x961f000 0x1 0x0 0x0 0x9600004 0x1 0x0 0x0 0x9601004 0x1 0x0 0x0 0x9602004 0x1 0x0 0x0 0x9603004 0x1 0x0 0x0 0x9604004 0x1 0x0 0x0 0x9605004 0x1 0x0 0x0 0x9606004 0x1 0x0 0x0 0x9607004 0x1 0x0 0x0 0x9608004 0x1 0x0 0x0 0x9609004 0x1 0x0 0x0 0x960a004 0x1 0x0 0x0 0x960b004 0x1 0x0 0x0 0x960c004 0x1 0x0 0x0 0x960d004 0x1 0x0 0x0 0x960e004 0x1 0x0 0x0 0x960f004 0x1 0x0 0x0 0x9610004 0x1 0x0 0x0 0x9611004 0x1 0x0 0x0 0x9612004 0x1 0x0 0x0 0x9613004 0x1 0x0 0x0 0x9614004 0x1 0x0 0x0 0x9615004 0x1 0x0 0x0 0x9616004 0x1 0x0 0x0 0x9617004 0x1 0x0 0x0 0x9618004 0x1 0x0 0x0 0x9619004 0x1 0x0 0x0 0x961a004 0x1 0x0 0x0 0x961b004 0x1 0x0 0x0 0x961c004 0x1 0x0 0x0 0x961d004 0x1 0x0 0x0 0x961e004 0x1 0x0 0x0 0x961f004 0x1 0x0 0x0 0x9266418 0x1 0x0 0x0 0x92e6418 0x1 0x0 0x0 0x9265804 0x1 0x0 0x0 0x92e5804 0x1 0x0 0x0 0x92604b8 0x1 0x0 0x0 0x92e04b8 0x1 0x0 0x0 0xc201244 0x1 0x0 0x0 0xc202244 0x1 0x0 0x0 0x18100c18 0x1 0x0 0x0 0x18101c18 0x1 0x0 0x0 0x18300000 0x1 0x0 0x0 0x183a3a84 0x2 0x0 0x0 0x18393a84 0x1 0x0 0x0 0x100000 0x1 0x0 0x0 0x100004 0x1 0x0 0x0 0x100008 0x1 0x0 0x0 0x10000c 0x1 0x0 0x0 0x100010 0x1 0x0 0x0 0x100014 0x1 0x0 0x0 0x100018 0x1 0x0 0x0 0x10001c 0x1 0x0 0x0 0x100020 0x1 0x0 0x0 0x100024 0x1 0x0 0x0 0x100028 0x1 0x0 0x0 0x10002c 0x1 0x0 0x0 0x100030 0x1 0x0 0x0 0x100034 0x1 0x0 0x0 0x100100 0x1 0x0 0x0 0x100104 0x1 0x0 0x0 0x100108 0x1 0x0 0x0 0x10010c 0x1 0x0 0x0 0x101000 0x1 0x0 0x0 0x101004 0x1 0x0 0x0 0x101008 0x1 0x0 0x0 0x10100c 0x1 0x0 0x0 0x101010 0x1 0x0 0x0 0x101014 0x1 0x0 0x0 0x101018 0x1 0x0 0x0 0x10101c 0x1 0x0 0x0 0x101020 0x1 0x0 0x0 0x101024 0x1 0x0 0x0 0x101028 0x1 0x0 0x0 0x10102c 0x1 0x0 0x0 0x101030 0x1 0x0 0x0 0x101034 0x1 0x0 0x0 0x102000 0x1 0x0 0x0 0x102004 0x1 0x0 0x0 0x102008 0x1 0x0 0x0 0x10200c 0x1 0x0 0x0 0x102010 0x1 0x0 0x0 0x102014 0x1 0x0 0x0 0x102018 0x1 0x0 0x0 0x10201c 0x1 0x0 0x0 0x102020 0x1 0x0 0x0 0x102024 0x1 0x0 0x0 0x102028 0x1 0x0 0x0 0x10202c 0x1 0x0 0x0 0x102030 0x1 0x0 0x0 0x102034 0x1 0x0 0x0 0x103000 0x1 0x0 0x0 0x103004 0x1 0x0 0x0 0x103008 0x1 0x0 0x0 0x10300c 0x1 0x0 0x0 0x103010 0x1 0x0 0x0 0x103014 0x1 0x0 0x0 0x103018 0x1 0x0 0x0 0x10301c 0x1 0x0 0x0 0x103020 0x1 0x0 0x0 0x103024 0x1 0x0 0x0 0x103028 0x1 0x0 0x0 0x10302c 0x1 0x0 0x0 0x103030 0x1 0x0 0x0 0x103034 0x1 0x0 0x0 0x113000 0x1 0x0 0x0 0x113004 0x1 0x0 0x0 0x113008 0x1 0x0 0x0 0x11300c 0x1 0x0 0x0 0x113010 0x1 0x0 0x0 0x113014 0x1 0x0 0x0 0x113018 0x1 0x0 0x0 0x11301c 0x1 0x0 0x0 0x113020 0x1 0x0 0x0 0x113024 0x1 0x0 0x0 0x113028 0x1 0x0 0x0 0x11302c 0x1 0x0 0x0 0x113030 0x1 0x0 0x0 0x113034 0x1 0x0 0x0 0x11a000 0x1 0x0 0x0 0x11a004 0x1 0x0 0x0 0x11a008 0x1 0x0 0x0 0x11a00c 0x1 0x0 0x0 0x11a010 0x1 0x0 0x0 0x11a014 0x1 0x0 0x0 0x11a018 0x1 0x0 0x0 0x11a01c 0x1 0x0 0x0 0x11a020 0x1 0x0 0x0 0x11a024 0x1 0x0 0x0 0x11a028 0x1 0x0 0x0 0x11a02c 0x1 0x0 0x0 0x11a030 0x1 0x0 0x0 0x11a034 0x1 0x0 0x0 0x11b000 0x1 0x0 0x0 0x11b004 0x1 0x0 0x0 0x11b008 0x1 0x0 0x0 0x11b00c 0x1 0x0 0x0 0x11b010 0x1 0x0 0x0 0x11b014 0x1 0x0 0x0 0x11b018 0x1 0x0 0x0 0x11b01c 0x1 0x0 0x0 0x11b020 0x1 0x0 0x0 0x11b024 0x1 0x0 0x0 0x11b028 0x1 0x0 0x0 0x11b02c 0x1 0x0 0x0 0x11b030 0x1 0x0 0x0 0x11b034 0x1 0x0 0x0 0x174000 0x1 0x0 0x0 0x174004 0x1 0x0 0x0 0x174008 0x1 0x0 0x0 0x17400c 0x1 0x0 0x0 0x174010 0x1 0x0 0x0 0x174014 0x1 0x0 0x0 0x174018 0x1 0x0 0x0 0x17401c 0x1 0x0 0x0 0x174020 0x1 0x0 0x0 0x174024 0x1 0x0 0x0 0x174028 0x1 0x0 0x0 0x17402c 0x1 0x0 0x0 0x174030 0x1 0x0 0x0 0x174034 0x1 0x0 0x0 0x176000 0x1 0x0 0x0 0x176004 0x1 0x0 0x0 0x176008 0x1 0x0 0x0 0x17600c 0x1 0x0 0x0 0x176010 0x1 0x0 0x0 0x176014 0x1 0x0 0x0 0x176018 0x1 0x0 0x0 0x17601c 0x1 0x0 0x0 0x176020 0x1 0x0 0x0 0x176024 0x1 0x0 0x0 0x176028 0x1 0x0 0x0 0x17602c 0x1 0x0 0x0 0x176030 0x1 0x0 0x0 0x176034 0x1 0x0 0x0 0x10401c 0x1 0x0 0x0 0x183024 0x1 0x0 0x0 0x144168 0x1 0x0 0x0 0x11702c 0x1 0x0 0x0 0x10904c 0x1 0x0 0x0 0x189038 0x1 0x0 0x0 0x1443e8 0x1 0x0 0x0 0x1442b8 0x1 0x0 0x0 0x105060 0x1 0x0 0x0 0x141024 0x1 0x0 0x0 0x145038 0x1 0x0 0x0 0x109004 0x1 0x0 0x0 0x189004 0x1 0x0 0x0 0x190004 0x1 0x0 0x0 0xc2a0000 0x1 0x0 0x0 0xc2a0004 0x1 0x0 0x0 0xc2a0008 0x1 0x0 0x0 0xc2a000c 0x1 0x0 0x0 0xc2a0010 0x1 0x0 0x0 0xc2a0014 0x1 0x0 0x0 0xc2a0018 0x1 0x0 0x0 0xc2a001c 0x1 0x0 0x0 0xc2a0020 0x1 0x0 0x0 0xc2a0024 0x1 0x0 0x0 0xc2a0028 0x1 0x0 0x0 0xc2a002c 0x1 0x0 0x0 0xc2a0030 0x1 0x0 0x0 0xc2a0034 0x1 0x0 0x0 0xc2a1000 0x1 0x0 0x0 0xc2a1004 0x1 0x0 0x0 0xc2a1008 0x1 0x0 0x0 0xc2a100c 0x1 0x0 0x0 0xc2a1010 0x1 0x0 0x0 0xc2a1014 0x1 0x0 0x0 0xc2a1018 0x1 0x0 0x0 0xc2a101c 0x1 0x0 0x0 0xc2a1020 0x1 0x0 0x0 0xc2a1024 0x1 0x0 0x0 0xc2a1028 0x1 0x0 0x0 0xc2a102c 0x1 0x0 0x0 0xc2a1030 0x1 0x0 0x0 0xc2a2260 0x1 0x0 0x0 0xc2a2264 0x1 0x0 0x0 0xc2a3008 0x1 0x0 0x0 0xc2a300c 0x1 0x0 0x0 0xc2a3010 0x1 0x0 0x0 0xc2a3014 0x1 0x0 0x0 0xc2a3024 0x1 0x0 0x0 0xc2a2034 0x1 0x0 0x0 0xc2a214c 0x1 0x0 0x0 0xc2a2150 0x1 0x0 0x0 0xc2a2154 0x1 0x0 0x0 0x28206c 0x1 0x0 0x0 0x18282004 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x1808012c 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280004 0x1 0x0 0x0 0x18284038 0x1 0x0 0x0 0x18284000 0x2 0x0 0x0 0x90c012c 0x1 0x0 0x0 0x9222408 0x1 0x0 0x0 0x9220344 0x2 0x0 0x0 0x9220480 0x1 0x0 0x0 0x922358c 0x1 0x0 0x0 0x9222398 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x923201c 0x5 0x0 0x0 0x9232050 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x9186048 0x1 0x0 0x0 0x9186054 0x1 0x0 0x0 0x9186164 0x1 0x0 0x0 0x9186170 0x1 0x0 0x0 0xc2630a0 0x4 0x0 0x0 0xc2630b0 0x4 0x0 0x0 0xc2630c0 0x4 0x0 0x0 0xc2630d0 0x4 0x0 0x0 0x18200400 0x1 0x0 0x0 0x18200404 0x1 0x0 0x0 0x18200408 0x1 0x0 0x0 0x18200038 0x1 0x0 0x0 0x18200040 0x1 0x0 0x0 0x18200048 0x1 0x0 0x0 0x18220038 0x1 0x0 0x0 0x18220040 0x1 0x0 0x0 0x182200d0 0x1 0x0 0x0 0x18200030 0x1 0x0 0x0 0x18200010 0x1 0x0 0x0 0x1822000c 0x1 0x0 0x0 0x18220d14 0x1 0x0 0x0 0x18220fb4 0x1 0x0 0x0 0x18221254 0x1 0x0 0x0 0x182214f4 0x1 0x0 0x0 0x18221794 0x1 0x0 0x0 0x18221a34 0x1 0x0 0x0 0x18221cd4 0x1 0x0 0x0 0x18221f74 0x1 0x0 0x0 0x18220d18 0x1 0x0 0x0 0x18220fb8 0x1 0x0 0x0 0x18221258 0x1 0x0 0x0 0x182214f8 0x1 0x0 0x0 0x18221798 0x1 0x0 0x0 0x18221a38 0x1 0x0 0x0 0x18221cd8 0x1 0x0 0x0 0x18221f78 0x1 0x0 0x0 0x18220d00 0x1 0x0 0x0 0x18220d04 0x1 0x0 0x0 0x18220d1c 0x1 0x0 0x0 0x18220fbc 0x1 0x0 0x0 0x1822125c 0x1 0x0 0x0 0x182214fc 0x1 0x0 0x0 0x1822179c 0x1 0x0 0x0 0x18221a3c 0x1 0x0 0x0 0x18221cdc 0x1 0x0 0x0 0x18221f7c 0x1 0x0 0x0 0x18221274 0x1 0x0 0x0 0x18221288 0x1 0x0 0x0 0x1822129c 0x1 0x0 0x0 0x182212b0 0x1 0x0 0x0 0x182212c4 0x1 0x0 0x0 0x182212d8 0x1 0x0 0x0 0x182212ec 0x1 0x0 0x0 0x18221300 0x1 0x0 0x0 0x18221314 0x1 0x0 0x0 0x18221328 0x1 0x0 0x0 0x1822133c 0x1 0x0 0x0 0x18221350 0x1 0x0 0x0 0x18221364 0x1 0x0 0x0 0x18221378 0x1 0x0 0x0 0x1822138c 0x1 0x0 0x0 0x182213a0 0x1 0x0 0x0 0x18221514 0x1 0x0 0x0 0x18221528 0x1 0x0 0x0 0x1822153c 0x1 0x0 0x0 0x18221550 0x1 0x0 0x0 0x18221564 0x1 0x0 0x0 0x18221578 0x1 0x0 0x0 0x1822158c 0x1 0x0 0x0 0x182215a0 0x1 0x0 0x0 0x182215b4 0x1 0x0 0x0 0x182215c8 0x1 0x0 0x0 0x182215dc 0x1 0x0 0x0 0x182215f0 0x1 0x0 0x0 0x18221604 0x1 0x0 0x0 0x18221618 0x1 0x0 0x0 0x1822162c 0x1 0x0 0x0 0x18221640 0x1 0x0 0x0 0x182217b4 0x1 0x0 0x0 0x182217c8 0x1 0x0 0x0 0x182217dc 0x1 0x0 0x0 0x182217f0 0x1 0x0 0x0 0x18221804 0x1 0x0 0x0 0x18221818 0x1 0x0 0x0 0x1822182c 0x1 0x0 0x0 0x18221840 0x1 0x0 0x0 0x18221854 0x1 0x0 0x0 0x18221868 0x1 0x0 0x0 0x1822187c 0x1 0x0 0x0 0x18221890 0x1 0x0 0x0 0x182218a4 0x1 0x0 0x0 0x182218b8 0x1 0x0 0x0 0x182218cc 0x1 0x0 0x0 0x182218e0 0x1 0x0 0x0 0x18221a54 0x1 0x0 0x0 0x18221a68 0x1 0x0 0x0 0x18221a7c 0x1 0x0 0x0 0x18221a90 0x1 0x0 0x0 0x18221aa4 0x1 0x0 0x0 0x18221ab8 0x1 0x0 0x0 0x18221acc 0x1 0x0 0x0 0x18221ae0 0x1 0x0 0x0 0x18221af4 0x1 0x0 0x0 0x18221b08 0x1 0x0 0x0 0x18221b1c 0x1 0x0 0x0 0x18221b30 0x1 0x0 0x0 0x18221b44 0x1 0x0 0x0 0x18221b58 0x1 0x0 0x0 0x18221b6c 0x1 0x0 0x0 0x18221b80 0x1 0x0 0x0 0x18221cf4 0x1 0x0 0x0 0x18221d08 0x1 0x0 0x0 0x18221d1c 0x1 0x0 0x0 0x18221d30 0x1 0x0 0x0 0x18221d44 0x1 0x0 0x0 0x18221d58 0x1 0x0 0x0 0x18221d6c 0x1 0x0 0x0 0x18221d80 0x1 0x0 0x0 0x18221d94 0x1 0x0 0x0 0x18221da8 0x1 0x0 0x0 0x18221dbc 0x1 0x0 0x0 0x18221dd0 0x1 0x0 0x0 0x18221de4 0x1 0x0 0x0 0x18221df8 0x1 0x0 0x0 0x18221e0c 0x1 0x0 0x0 0x18221e20 0x1 0x0 0x0 0x18221f94 0x1 0x0 0x0 0x18221fa8 0x1 0x0 0x0 0x18221fbc 0x1 0x0 0x0 0x18221fd0 0x1 0x0 0x0 0x18221fe4 0x1 0x0 0x0 0x18221ff8 0x1 0x0 0x0 0x1822200c 0x1 0x0 0x0 0x18222020 0x1 0x0 0x0 0x18222034 0x1 0x0 0x0 0x18222048 0x1 0x0 0x0 0x1822205c 0x1 0x0 0x0 0x18222070 0x1 0x0 0x0 0x18222084 0x1 0x0 0x0 0x18222098 0x1 0x0 0x0 0x182220ac 0x1 0x0 0x0 0x182220c0 0x1 0x0 0x0 0x18221278 0x1 0x0 0x0 0x1822128c 0x1 0x0 0x0 0x182212a0 0x1 0x0 0x0 0x182212b4 0x1 0x0 0x0 0x182212c8 0x1 0x0 0x0 0x182212dc 0x1 0x0 0x0 0x182212f0 0x1 0x0 0x0 0x18221304 0x1 0x0 0x0 0x18221318 0x1 0x0 0x0 0x1822132c 0x1 0x0 0x0 0x18221340 0x1 0x0 0x0 0x18221354 0x1 0x0 0x0 0x18221368 0x1 0x0 0x0 0x1822137c 0x1 0x0 0x0 0x18221390 0x1 0x0 0x0 0x182213a4 0x1 0x0 0x0 0x18221518 0x1 0x0 0x0 0x1822152c 0x1 0x0 0x0 0x18221540 0x1 0x0 0x0 0x18221554 0x1 0x0 0x0 0x18221568 0x1 0x0 0x0 0x1822157c 0x1 0x0 0x0 0x18221590 0x1 0x0 0x0 0x182215a4 0x1 0x0 0x0 0x182215b8 0x1 0x0 0x0 0x182215cc 0x1 0x0 0x0 0x182215e0 0x1 0x0 0x0 0x182215f4 0x1 0x0 0x0 0x18221608 0x1 0x0 0x0 0x1822161c 0x1 0x0 0x0 0x18221630 0x1 0x0 0x0 0x18221644 0x1 0x0 0x0 0x182217b8 0x1 0x0 0x0 0x182217cc 0x1 0x0 0x0 0x182217e0 0x1 0x0 0x0 0x182217f4 0x1 0x0 0x0 0x18221808 0x1 0x0 0x0 0x1822181c 0x1 0x0 0x0 0x18221830 0x1 0x0 0x0 0x18221844 0x1 0x0 0x0 0x18221858 0x1 0x0 0x0 0x1822186c 0x1 0x0 0x0 0x18221880 0x1 0x0 0x0 0x18221894 0x1 0x0 0x0 0x182218a8 0x1 0x0 0x0 0x182218bc 0x1 0x0 0x0 0x182218d0 0x1 0x0 0x0 0x182218e4 0x1 0x0 0x0 0x18221a58 0x1 0x0 0x0 0x18221a6c 0x1 0x0 0x0 0x18221a80 0x1 0x0 0x0 0x18221a94 0x1 0x0 0x0 0x18221aa8 0x1 0x0 0x0 0x18221abc 0x1 0x0 0x0 0x18221ad0 0x1 0x0 0x0 0x18221ae4 0x1 0x0 0x0 0x18221af8 0x1 0x0 0x0 0x18221b0c 0x1 0x0 0x0 0x18221b20 0x1 0x0 0x0 0x18221b34 0x1 0x0 0x0 0x18221b48 0x1 0x0 0x0 0x18221b5c 0x1 0x0 0x0 0x18221b70 0x1 0x0 0x0 0x18221b84 0x1 0x0 0x0 0x18221cf8 0x1 0x0 0x0 0x18221d0c 0x1 0x0 0x0 0x18221d20 0x1 0x0 0x0 0x18221d34 0x1 0x0 0x0 0x18221d48 0x1 0x0 0x0 0x18221d5c 0x1 0x0 0x0 0x18221d70 0x1 0x0 0x0 0x18221d84 0x1 0x0 0x0 0x18221d98 0x1 0x0 0x0 0x18221dac 0x1 0x0 0x0 0x18221dc0 0x1 0x0 0x0 0x18221dd4 0x1 0x0 0x0 0x18221de8 0x1 0x0 0x0 0x18221dfc 0x1 0x0 0x0 0x18221e10 0x1 0x0 0x0 0x18221e24 0x1 0x0 0x0 0x18221f98 0x1 0x0 0x0 0x18221fac 0x1 0x0 0x0 0x18221fc0 0x1 0x0 0x0 0x18221fd4 0x1 0x0 0x0 0x18221fe8 0x1 0x0 0x0 0x18221ffc 0x1 0x0 0x0 0x18222010 0x1 0x0 0x0 0x18222024 0x1 0x0 0x0 0x18222038 0x1 0x0 0x0 0x1822204c 0x1 0x0 0x0 0x18222060 0x1 0x0 0x0 0x18222074 0x1 0x0 0x0 0x18222088 0x1 0x0 0x0 0x1822209c 0x1 0x0 0x0 0x182220b0 0x1 0x0 0x0 0x182220c4 0x1 0x0 0x0 0x105050 0x1 0x0 0x0 0x171004 0x1 0x0 0x0 0x171154 0x1 0x0 0x0 0x17100c 0x1 0x0 0x0 0x171018 0x1 0x0 0x0 0x5091004 0x1 0x0 0x0 0x509100c 0x1 0x0 0x0 0x5091010 0x1 0x0 0x0 0x5091014 0x1 0x0 0x0 0x5091054 0x1 0x0 0x0 0x5091060 0x1 0x0 0x0 0x509106c 0x1 0x0 0x0 0x5091070 0x1 0x0 0x0 0x5091074 0x1 0x0 0x0 0x5091078 0x1 0x0 0x0 0x509107c 0x1 0x0 0x0 0x509108c 0x1 0x0 0x0 0x5091098 0x1 0x0 0x0 0x509109c 0x1 0x0 0x0 0x1800005c 0x1 0x0 0x0 0x1801005c 0x1 0x0 0x0 0x1802005c 0x1 0x0 0x0 0x1803005c 0x1 0x0 0x0 0x1804005c 0x1 0x0 0x0 0x1805005c 0x1 0x0 0x0 0x1806005c 0x1 0x0 0x0 0x1807005c 0x1 0x0 0x0 0x17c0003c 0x1 0x0 0x1 0x6004fb0 0xc5acce55 0x0 0x1 0x600408c 0xff 0x0 0x1 0x6004fb0 0x0 0x0 0x0 0x62900010 0x1 0x0 0x0 0x62900014 0x1 0x0 0x0 0x62900018 0x1 0x0 0x0 0x62900030 0x1 0x0 0x0 0x62900038 0x1 0x0 0x0 0x62900040 0x1 0x0 0x0 0x62900048 0x1 0x0 0x0 0x629000d0 0x1 0x0 0x0 0x62900210 0x1 0x0 0x0 0x62900230 0x1 0x0 0x0 0x62900250 0x1 0x0 0x0 0x62900270 0x1 0x0 0x0 0x62900290 0x1 0x0 0x0 0x629002b0 0x1 0x0 0x0 0x62900208 0x1 0x0 0x0 0x62900228 0x1 0x0 0x0 0x62900248 0x1 0x0 0x0 0x62900268 0x1 0x0 0x0 0x62900288 0x1 0x0 0x0 0x629002a8 0x1 0x0 0x0 0x6290020c 0x1 0x0 0x0 0x6290022c 0x1 0x0 0x0 0x6290024c 0x1 0x0 0x0 0x6290026c 0x1 0x0 0x0 0x6290028c 0x1 0x0 0x0 0x629002ac 0x1 0x0 0x0 0x62900404 0x1 0x0 0x0 0x62900408 0x1 0x0 0x0 0x62900400 0x1 0x0 0x0 0x62900d04 0x1 0x0 0x0 0x624b0010 0x1 0x0 0x0 0x624b0014 0x1 0x0 0x0 0x624b0018 0x1 0x0 0x0 0x624b0210 0x1 0x0 0x0 0x624b0230 0x1 0x0 0x0 0x624b0250 0x1 0x0 0x0 0x624b0270 0x1 0x0 0x0 0x624b0290 0x1 0x0 0x0 0x624b02b0 0x1 0x0 0x0 0x624b0208 0x1 0x0 0x0 0x624b0228 0x1 0x0 0x0 0x624b0248 0x1 0x0 0x0 0x624b0268 0x1 0x0 0x0 0x624b0288 0x1 0x0 0x0 0x624b02a8 0x1 0x0 0x0 0x624b020c 0x1 0x0 0x0 0x624b022c 0x1 0x0 0x0 0x624b024c 0x1 0x0 0x0 0x624b026c 0x1 0x0 0x0 0x624b028c 0x1 0x0 0x0 0x624b02ac 0x1 0x0 0x0 0x624b0400 0x1 0x0 0x0 0x624b0404 0x1 0x0 0x0 0x624b0408 0x1 0x0 0x0 0x62402028 0x1 0x0 0x0 0xb254520 0x1 0x0 0x0 0xb251020 0x1 0x0 0x0 0xb251024 0x1 0x0 0x0 0xb251030 0x1 0x0 0x0 0xb251200 0x1 0x0 0x0 0xb251214 0x1 0x0 0x0 0xb251228 0x1 0x0 0x0 0xb25123c 0x1 0x0 0x0 0xb251250 0x1 0x0 0x0 0xb251204 0x1 0x0 0x0 0xb251218 0x1 0x0 0x0 0xb25122c 0x1 0x0 0x0 0xb251240 0x1 0x0 0x0 0xb251254 0x1 0x0 0x0 0xb251208 0x1 0x0 0x0 0xb25121c 0x1 0x0 0x0 0xb251230 0x1 0x0 0x0 0xb251244 0x1 0x0 0x0 0xb251258 0x1 0x0 0x0 0xb254510 0x1 0x0 0x0 0xb254514 0x1 0x0 0x0 0xb250010 0x1 0x0 0x0 0xb250014 0x1 0x0 0x0 0xb250900 0x1 0x0 0x0 0xb250904 0x1 0x0 0x0 0x4200010 0x1 0x0 0x0 0x4200014 0x1 0x0 0x0 0x4200018 0x1 0x0 0x0 0x4200030 0x1 0x0 0x0 0x4200038 0x1 0x0 0x0 0x4200040 0x1 0x0 0x0 0x4200048 0x1 0x0 0x0 0x42000d0 0x1 0x0 0x0 0x4200210 0x1 0x0 0x0 0x4200230 0x1 0x0 0x0 0x4200250 0x1 0x0 0x0 0x4200270 0x1 0x0 0x0 0x4200290 0x1 0x0 0x0 0x42002b0 0x1 0x0 0x0 0x4200208 0x1 0x0 0x0 0x4200228 0x1 0x0 0x0 0x4200248 0x1 0x0 0x0 0x4200268 0x1 0x0 0x0 0x4200288 0x1 0x0 0x0 0x42002a8 0x1 0x0 0x0 0x420020c 0x1 0x0 0x0 0x420022c 0x1 0x0 0x0 0x420024c 0x1 0x0 0x0 0x420026c 0x1 0x0 0x0 0x420028c 0x1 0x0 0x0 0x42002ac 0x1 0x0 0x0 0x4200404 0x1 0x0 0x0 0x4200408 0x1 0x0 0x0 0x4200400 0x1 0x0 0x0 0x4200d04 0x1 0x0 0x0 0x4130010 0x1 0x0 0x0 0x4130014 0x1 0x0 0x0 0x4130018 0x1 0x0 0x0 0x4130210 0x1 0x0 0x0 0x4130230 0x1 0x0 0x0 0x4130250 0x1 0x0 0x0 0x4130270 0x1 0x0 0x0 0x4130290 0x1 0x0 0x0 0x41302b0 0x1 0x0 0x0 0x4130208 0x1 0x0 0x0 0x4130228 0x1 0x0 0x0 0x4130248 0x1 0x0 0x0 0x4130268 0x1 0x0 0x0 0x4130288 0x1 0x0 0x0 0x41302a8 0x1 0x0 0x0 0x413020c 0x1 0x0 0x0 0x413022c 0x1 0x0 0x0 0x413024c 0x1 0x0 0x0 0x413026c 0x1 0x0 0x0 0x413028c 0x1 0x0 0x0 0x41302ac 0x1 0x0 0x0 0x4130400 0x1 0x0 0x0 0x4130404 0x1 0x0 0x0 0x4130408 0x1 0x0 0x0 0x4082028 0x1 0x0 0x0 0x18a008 0x1 0x0 0x0 0xb2c4520 0x1 0x0 0x0 0xb2c1020 0x1 0x0 0x0 0xb2c1024 0x1 0x0 0x0 0xb2c1030 0x1 0x0 0x0 0xb2c1200 0x1 0x0 0x0 0xb2c1214 0x1 0x0 0x0 0xb2c1228 0x1 0x0 0x0 0xb2c123c 0x1 0x0 0x0 0xb2c1250 0x1 0x0 0x0 0xb2c1204 0x1 0x0 0x0 0xb2c1218 0x1 0x0 0x0 0xb2c122c 0x1 0x0 0x0 0xb2c1240 0x1 0x0 0x0 0xb2c1254 0x1 0x0 0x0 0xb2c1208 0x1 0x0 0x0 0xb2c121c 0x1 0x0 0x0 0xb2c1230 0x1 0x0 0x0 0xb2c1244 0x1 0x0 0x0 0xb2c1258 0x1 0x0 0x0 0xb2c4510 0x1 0x0 0x0 0xb2c4514 0x1 0x0 0x0 0xb2c0010 0x1 0x0 0x0 0xb2c0014 0x1 0x0 0x0 0xb2c0900 0x1 0x0 0x0 0xb2c0904 0x1 0x0 0x0 0x80a4010 0x1 0x0 0x0 0x80a4014 0x1 0x0 0x0 0x80a4018 0x1 0x0 0x0 0x80a4030 0x1 0x0 0x0 0x80a4038 0x1 0x0 0x0 0x80a4040 0x1 0x0 0x0 0x80a4048 0x1 0x0 0x0 0x80a40d0 0x1 0x0 0x0 0x80a4210 0x1 0x0 0x0 0x80a4230 0x1 0x0 0x0 0x80a4250 0x1 0x0 0x0 0x80a4270 0x1 0x0 0x0 0x80a4290 0x1 0x0 0x0 0x80a42b0 0x1 0x0 0x0 0x80a4208 0x1 0x0 0x0 0x80a4228 0x1 0x0 0x0 0x80a4248 0x1 0x0 0x0 0x80a4268 0x1 0x0 0x0 0x80a4288 0x1 0x0 0x0 0x80a42a8 0x1 0x0 0x0 0x80a420c 0x1 0x0 0x0 0x80a422c 0x1 0x0 0x0 0x80a424c 0x1 0x0 0x0 0x80a426c 0x1 0x0 0x0 0x80a428c 0x1 0x0 0x0 0x80a42ac 0x1 0x0 0x0 0x80a4404 0x1 0x0 0x0 0x80a4408 0x1 0x0 0x0 0x80a4400 0x1 0x0 0x0 0x80a4d04 0x1 0x0 0x0 0x83b0010 0x1 0x0 0x0 0x83b0014 0x1 0x0 0x0 0x83b0018 0x1 0x0 0x0 0x83b0210 0x1 0x0 0x0 0x83b0230 0x1 0x0 0x0 0x83b0250 0x1 0x0 0x0 0x83b0270 0x1 0x0 0x0 0x83b0290 0x1 0x0 0x0 0x83b02b0 0x1 0x0 0x0 0x83b0208 0x1 0x0 0x0 0x83b0228 0x1 0x0 0x0 0x83b0248 0x1 0x0 0x0 0x83b0268 0x1 0x0 0x0 0x83b0288 0x1 0x0 0x0 0x83b02a8 0x1 0x0 0x0 0x83b020c 0x1 0x0 0x0 0x83b022c 0x1 0x0 0x0 0x83b024c 0x1 0x0 0x0 0x83b026c 0x1 0x0 0x0 0x83b028c 0x1 0x0 0x0 0x83b02ac 0x1 0x0 0x0 0x83b0400 0x1 0x0 0x0 0x83b0404 0x1 0x0 0x0 0x83b0408 0x1 0x0 0x0 0x8302028 0x1 0x0 0x0 0xb2b4520 0x1 0x0 0x0 0xb2b1020 0x1 0x0 0x0 0xb2b1024 0x1 0x0 0x0 0xb2b1030 0x1 0x0 0x0 0xb2b1200 0x1 0x0 0x0 0xb2b1214 0x1 0x0 0x0 0xb2b1228 0x1 0x0 0x0 0xb2b123c 0x1 0x0 0x0 0xb2b1250 0x1 0x0 0x0 0xb2b1204 0x1 0x0 0x0 0xb2b1218 0x1 0x0 0x0 0xb2b122c 0x1 0x0 0x0 0xb2b1240 0x1 0x0 0x0 0xb2b1254 0x1 0x0 0x0 0xb2b1208 0x1 0x0 0x0 0xb2b121c 0x1 0x0 0x0 0xb2b1230 0x1 0x0 0x0 0xb2b1244 0x1 0x0 0x0 0xb2b1258 0x1 0x0 0x0 0xb2b4510 0x1 0x0 0x0 0xb2b4514 0x1 0x0 0x0 0xb2b0010 0x1 0x0 0x0 0xb2b0014 0x1 0x0 0x0 0xb2b0900 0x1 0x0 0x0 0xb2b0904 0x1 0x0 0x0 0x17a00204 0x1d 0x0>; + }; + }; + }; + + fragment@37 { + target = <0xffffffff>; + + __overlay__ { + + ss_plog@B4400000 { + compatible = "ss_plog"; + no-map; + reg = <0x0 0xb4400000 0x0 0x200000>; + }; + + ramoops@B4600000 { + compatible = "ramoops"; + reg = <0x0 0xb4600000 0x0 0x100000>; + record-size = <0x40000>; + console-size = <0x40000>; + ftrace-size = <0x40000>; + pmsg-size = <0x40000>; + }; + + sec_debug_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4700000 0x0 0x800000>; + phandle = <0xbc>; + }; + + sec_debug_autocomment@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4f00000 0x0 0x1000>; + phandle = <0xbd>; + }; + + sec_debug_rdx_bootdev@0 { + no-ship; + reg = <0x1 0x0 0x0 0x5900000>; + phandle = <0xbe>; + }; + + kaslr_region@A0001000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xa0001000 0x0 0x1000>; + phandle = <0xbf>; + }; + + rkp_region@B0200000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xb0200000 0x0 0x200000>; + phandle = <0xc0>; + }; + + hdm_region@A1000000 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xa1000000 0x0 0x1000>; + phandle = <0x54>; + }; + + modem_shared_mem_region@B5000000 { + compatible = "modem-removed-dma-pool"; + no-map; + reg = <0x0 0xb5000000 0x0 0x6000000>; + phandle = <0x53>; + }; + }; + }; + + fragment@38 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x80b00000 0x0 0x7100000>; + }; + }; + + fragment@39 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x8b000000 0x0 0x8900000>; + }; + }; + + fragment@40 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x93c00000 0x0 0x3e00000>; + }; + }; + + fragment@41 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97a00000 0x0 0x500000>; + }; + }; + + fragment@42 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97f00000 0x0 0x500000>; + }; + }; + + fragment@43 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98400000 0x0 0x500000>; + }; + }; + + fragment@44 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98900000 0x0 0x1e00000>; + }; + }; + + fragment@45 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9e000000 0x0 0x2000000>; + }; + }; + + fragment@46 { + target = <0xffffffff>; + + __overlay__ { + size = <0x0 0x2000000>; + }; + }; + + fragment@47 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@48 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@49 { + target = <0xffffffff>; + + __overlay__ { + + upload_cause@66c { + compatible = "qcom,msm-imem-upload_cause"; + reg = <0x66c 0x4>; + }; + }; + }; + + fragment@50 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@51 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@52 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@53 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@54 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@55 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@56 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@57 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@58 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@59 { + target = <0xffffffff>; + + __overlay__ { + + dwc3@a600000 { + maximum-speed = "high-speed"; + }; + }; + }; + + fragment@60 { + target = <0xffffffff>; + + __overlay__ { + + input_booster { + status = "okay"; + compatible = "input_booster"; + #address-cells = <0x1>; + #size-cells = <0x0>; + + booster_key@1 { + input_booster,label = "KEY"; + input_booster,type = <0x0>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0xc8>; + input_booster,tail_times = <0x0>; + }; + + booster_key@2 { + input_booster,label = "TOUCHKEY"; + input_booster,type = <0x1>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x0>; + input_booster,tail_times = <0x12c>; + }; + + booster_key@3 { + input_booster,label = "TOUCH"; + input_booster,type = <0x2>; + input_booster,levels = <0x1 0x2 0x3>; + input_booster,cpu_freqs = <0x135600 0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2 0x2>; + input_booster,ddr_freqs = <0x3f9 0x3f9 0x3f9>; + input_booster,lpm_bias = <0x5 0x5 0x5>; + input_booster,head_times = <0xc8 0xc8 0x0>; + input_booster,tail_times = <0x0 0x0 0x12c>; + }; + + booster_key@4 { + input_booster,label = "MULTITOUCH"; + input_booster,type = <0x3>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x3e8 0x0>; + input_booster,tail_times = <0x0 0x1f4>; + }; + + booster_key@5 { + input_booster,label = "KEYBOARD"; + input_booster,type = <0x4>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x135600>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x82 0x82>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@6 { + input_booster,label = "MOUSE"; + input_booster,type = <0x5>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@7 { + input_booster,label = "MOUSE WHEEL"; + input_booster,type = <0x6>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@8 { + input_booster,label = "PEN HOVER"; + input_booster,type = <0x7>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@9 { + input_booster,label = "PEN"; + input_booster,type = <0x8>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x17bb00 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x258>; + }; + + booster_key@10 { + input_booster,label = "KEY_TWO"; + input_booster,type = <0x9>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x17bb00>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x2bc>; + input_booster,tail_times = <0x2bc>; + }; + }; + + sec_smem@0 { + compatible = "samsung,sec-smem"; + status = "okay"; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_4 { + compatible = "qcom,memshare-peripheral"; + memory-region = <0x53>; + qcom,peripheral-size = <0x2000000>; + qcom,reserved-size = <0x4000000>; + qcom,client-id = <0x3>; + qcom,allocate-boot-time; + label = "modem"; + }; + }; + + samsung,sec_misc { + qfprom_jtag,reg = <0x780180>; + }; + + usb-notifier { + compatible = "samsung,usb-notifier"; + qcom,disable_control_en = <0x1>; + qcom,unsupport_host_en = <0x0>; + phandle = <0xc1>; + }; + + samsung,sec_hdm { + memory-region = <0x54>; + }; + + argos { + compatible = "samsung,argos"; + #address-cells = <0x1>; + + boot_device@1 { + net_boost,label = "WIFI"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@2 { + net_boost,label = "WIFI TX"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0xc8 0x21b100 0x0 0x1b8a00 0x0 0x0 0x0 0x1 0x1 0x1>; + }; + + boot_device@3 { + net_boost,label = "WIFI RX"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@4 { + net_boost,label = "SWLAN"; + net_boost,node = "swlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@5 { + net_boost,label = "P2P"; + net_boost,node = "p2p-wlan0-0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@6 { + net_boost,label = "IPA"; + net_boost,node = "rmnet_ipa0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + }; + }; + }; + + fragment@61 { + target = <0xffffffff>; + + __overlay__ { + + android { + + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_system,recovery,dtbo,abl,xbl,tz,hyp"; + }; + }; + }; + }; + + fragment@62 { + target = <0xffffffff>; + + __overlay__ { + qcom,smem-states = <0xffffffff 0x0 0xffffffff 0x4 0xffffffff 0x5>; + qcom,smem-state-names = "qcom,force-stop", "qcom,stop-reason-0", "qcom,stop-reason-1"; + }; + }; + + fragment@63 { + target = <0xffffffff>; + + __overlay__ { + spm-level = <0x3>; + }; + }; + + fragment@64 { + target = <0xffffffff>; + + __overlay__ { + i2c18 = "/soc/i2c@18"; + }; + }; + + fragment@65 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x3>; + + imp_list { + #list-imp-cells = <0x3>; + phandle = <0x26>; + }; + }; + }; + + fragment@66 { + target = <0xffffffff>; + + __overlay__ { + + msm_cdc_pinctrl_quin { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x55 0x56 0x57 0x58>; + pinctrl-1 = <0x59 0x5a 0x5b 0x5c>; + qcom,lpi-gpios; + phandle = <0x60>; + }; + }; + }; + + fragment@67 { + target = <0xffffffff>; + + __overlay__ { + + sec-audio-sysfs { + compatible = "samsung,audio-sysfs"; + status = "okay"; + audio,num-amp = <0x2>; + }; + + samsung,q6audio-adaptation { + compatible = "samsung,q6audio-adaptation"; + adaptation,device-tx-port-id = <0xb037>; + adaptation,spk-rx-port-id = <0x1016>; + adaptation,usb-rx-port-id = <0x7000>; + adaptation,bt-rx-port-id = <0x400e>; + adaptation,headset-rx-port-id = <0xb030>; + phandle = <0x5f>; + }; + + det_zones { + #list-det-cells = <0x2>; + phandle = <0x25>; + }; + + i2c@18 { + status = "ok"; + cell-index = <0x12>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x58 0x0 0xffffffff 0x59 0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x5d 0x5e>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xc2>; + + tas256x@4c { + #sound-dai-cells = <0x0>; + compatible = "ti, tas256x"; + status = "ok"; + reg = <0x4c>; + ti,reset-gpio = <0xffffffff 0x5e 0x0>; + ti,irq-gpio = <0xffffffff 0x5a 0x0>; + ti,left-channel = <0x4d>; + ti,right-channel = <0x4c>; + ti,channels = <0x2>; + ti,iv-width = <0x8>; + ti,vbat-mon = <0x1>; + ti,port_id = <0x1016>; + phandle = <0xc3>; + }; + }; + }; + }; + + fragment@68 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,wcn-btfm = <0x1>; + qcom,ext-disp-audio-rx = <0x0>; + qcom,mi2s-audio-intf = <0x1>; + asoc-platform = <0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0x5f>; + asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-pcm-dsp.2", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-compress-dsp", "msm-pcm-hostless", "msm-pcm-afe", "msm-lsm-client", "msm-pcm-routing", "msm-compr-dsp", "msm-pcm-dsp-noirq", "q6audio-adaptation"; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS3", "MIC BIAS3", "Analog Mic4", "AMIC5", "MIC BIAS4", "MIC BIAS4", "Analog Mic5", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT"; + qcom,msm-mbhc-hs-mic-max-threshold-mv = <0x270f>; + qcom,msm-mbhc-hs-mic-min-threshold-mv = <0x280>; + qcom,cdc-dmic01-gpios; + qcom,cdc-dmic23-gpios; + qcom,cdc-dmic45-gpios; + qcom,quin-mi2s-gpios = <0x60>; + asoc-codec = <0xffffffff 0xffffffff>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec"; + qcom,wsa-max-devs = <0x0>; + qcom,wsa-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x32 0xffffffff>; + fsa4480-i2c-handle; + qcom,fm-lna-gpios = <0xffffffff 0x54 0x0>; + qcom,msm-mbhc-gnd-det = <0x1>; + }; + }; + + fragment@69 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@70 { + target = <0xffffffff>; + + __overlay__ { + + tas25xx_gpio_default { + phandle = <0x5d>; + + mux { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + function = "gpio"; + }; + + config { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + bias-disable; + }; + }; + + fm_lna_default { + phandle = <0x5e>; + + mux { + pins = "gpio84"; + function = "gpio"; + }; + + config { + pins = "gpio84"; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@71 { + target = <0xffffffff>; + + __overlay__ { + + grip_i2c { + + grip_i2c_active { + phandle = <0xa9>; + + grip_i2c_active { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + + grip_i2c_suspend { + phandle = <0xc4>; + + grip_i2c_suspend { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + }; + + s2mpb03_i2c_sda_default { + phandle = <0x61>; + + mux { + pins = "gpio25"; + function = "gpio"; + }; + + config { + pins = "gpio25"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + s2mpb03_i2c_scl_default { + phandle = <0x62>; + + mux { + pins = "gpio26"; + function = "gpio"; + }; + + config { + pins = "gpio26"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + cam_sensor_mclk0_active { + phandle = <0x7d>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk0_suspend { + phandle = <0x80>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk1_active { + phandle = <0x96>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk1_suspend { + phandle = <0x98>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk2_active { + phandle = <0x8d>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk2_suspend { + phandle = <0x90>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk3_active { + phandle = <0x84>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk3_suspend { + phandle = <0x88>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk4_active { + phandle = <0x9c>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk4_suspend { + phandle = <0x9f>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + rcam1_sensor_reset_active { + phandle = <0x7e>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_reset_suspend { + phandle = <0x81>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_active { + phandle = <0x97>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_suspend { + phandle = <0x99>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_active { + phandle = <0x85>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_suspend { + phandle = <0x89>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_active { + phandle = <0x8e>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_suspend { + phandle = <0x91>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_active { + phandle = <0x9d>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_suspend { + phandle = <0xa0>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_active { + phandle = <0x6f>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_suspend { + phandle = <0x70>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_active { + phandle = <0x8f>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_suspend { + phandle = <0x92>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_active { + phandle = <0x86>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_suspend { + phandle = <0x8a>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_active { + phandle = <0x9e>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_suspend { + phandle = <0xa1>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_active { + phandle = <0x87>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-disable; + output-high; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_suspend { + phandle = <0x8b>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vdig_active { + phandle = <0xc5>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vdig_suspend { + phandle = <0xc6>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_active { + phandle = <0xc7>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_suspend { + phandle = <0xc8>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + if_pmic_i2c_pins { + phandle = <0xc9>; + + if_pmic_i2c_sleep { + phandle = <0x68>; + + mux { + pins = "gpio115", "gpio116"; + function = "gpio"; + }; + + config { + pins = "gpio115", "gpio116"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + usbpd_i2c_pins { + phandle = <0xca>; + + usbpd_i2c_sleep { + phandle = <0x6a>; + + mux { + pins = "gpio53", "gpio54"; + function = "gpio"; + }; + + config { + pins = "gpio53", "gpio54"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + mcu_reset_active { + phandle = <0x72>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_reset_suspend { + phandle = <0x74>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + mcu_clk_active { + phandle = <0x73>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_clk_suspend { + phandle = <0x75>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + torch_en_active { + phandle = <0x7f>; + + mux { + pins = "gpio67", "gpio22"; + function = "gpio"; + }; + + config { + pins = "gpio67", "gpio22"; + bias-pull-down; + output-high; + drive-strength = <0x2>; + }; + }; + + torch_en_suspend { + phandle = <0x82>; + + mux { + pins = "gpio67", "gpio22"; + function = "gpio"; + }; + + config { + pins = "gpio67", "gpio22"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + }; + }; + + fragment@72 { + target = <0xffffffff>; + + __overlay__ { + + grip_int_active { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xaa>; + }; + + grip_int_suspend { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xcb>; + }; + }; + }; + + fragment@73 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x48 0x4a 0x4e 0x54 0x56 0x57 0x5b 0x5d 0x5f 0x62 0x6d 0x72 0x73 0x74 0x75 0x76>; + }; + }; + + fragment@74 { + target = <0xffffffff>; + + __overlay__ { + + qcom,pm6150@0 { + + qcom,power-on@800 { + interrupts = <0x0 0x8 0x0 0x0 0x0 0x8 0x1 0x0 0x0 0x8 0x4 0x0 0x0 0x8 0x5 0x0>; + interrupt-names = "kpdpwr", "resin", "resin-bark", "kpdpwr-resin-bark"; + qcom,s3-debounce = <0x80>; + + qcom,pon_1 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_2 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_3 { + qcom,pon-type = <0x3>; + qcom,support-reset = <0x1>; + qcom,pull-up = <0x1>; + qcom,s1-timer = <0x1a40>; + qcom,s2-timer = <0x3e8>; + qcom,s2-type = <0x8>; + qcom,use-bark; + }; + }; + }; + }; + }; + + fragment@75 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@76 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@77 { + target = <0xffffffff>; + + __overlay__ { + + sec_thermistor@0 { + compatible = "samsung,sec-ap-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "ap_therm"; + adc_array = <0x6a4 0x88e 0xa10 0xbe6 0xdff 0x1090 0x1381 0x16f4 0x1b1c 0x1fb9 0x247b 0x2a3c 0x309d 0x3706 0x3d9d 0x43e8 0x4aa6 0x50c4 0x564a 0x5b4e 0x5faf 0x6379 0x66aa>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@1 { + compatible = "samsung,sec-pa-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "pa_therm"; + adc_array = <0x708 0x8bf 0xa47 0xc19 0xe38 0x10c2 0x13c0 0x173d 0x1b5e 0x1fff 0x24cf 0x2a88 0x30de 0x3756 0x3dea 0x443d 0x4add 0x5100 0x5683 0x5b96 0x5fef 0x63ab 0x66d8>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@2 { + compatible = "samsung,sec-wf-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4f>; + io-channel-names = "wf_therm"; + adc_array = <0x708 0x8d5 0xa66 0xc35 0xe55 0x10d4 0x13e0 0x1766 0x1b81 0x2021 0x24f3 0x2aa3 0x30f4 0x376c 0x3e09 0x445e 0x4aec 0x5105 0x568c 0x5ba3 0x5ff9 0x63b4 0x66e0>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + i2c@2 { + cell-index = <0x2>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x19 0x0 0xffffffff 0x1a 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x61 0x62>; + phandle = <0xcc>; + + s2mpb03@56 { + compatible = "samsung,s2mpb03pmic"; + reg = <0x56>; + additional_reg_init; + + regulators { + + s2mpb03-ldo1 { + regulator-name = "s2mpb03-ldo1"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x100590>; + phandle = <0x95>; + }; + + s2mpb03-ldo2 { + regulator-name = "s2mpb03-ldo2"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x7c>; + }; + + s2mpb03-ldo3 { + regulator-name = "s2mpb03-ldo3"; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x7a>; + }; + + s2mpb03-ldo4 { + regulator-name = "s2mpb03-ldo4"; + regulator-min-microvolt = <0x124f80>; + regulator-max-microvolt = <0x124f80>; + phandle = <0x8c>; + }; + + s2mpb03-ldo5 { + regulator-name = "s2mpb03-ldo5"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x7b>; + }; + + s2mpb03-ldo6 { + regulator-name = "s2mpb03-ldo6"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x94>; + }; + + s2mpb03-ldo7 { + regulator-name = "s2mpb03-ldo7"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2ab980>; + phandle = <0x71>; + }; + }; + }; + }; + }; + }; + + fragment@78 { + target = <0xffffffff>; + + __overlay__ { + interrupts = <0x0 0xc0 0x0 0x0 0x0 0xc1 0x0 0x0 0x0 0xc2 0x0 0x0 0x0 0xc3 0x0 0x0 0x0 0xc4 0x0 0x0 0x0 0xc6 0x0 0x0 0x0 0xc7 0x0 0x0 0x0 0xc9 0x0 0x0>; + interrupt-names = "pm6150_gpio1", "pm6150_gpio2", "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio5", "pm6150_gpio7", "pm6150_gpio8", "pm6150_gpio10"; + qcom,gpios-disallowed = <0x6 0x9>; + }; + }; + + fragment@79 { + target = <0xffffffff>; + + __overlay__ { + + ap_therm { + reg = <0x4e>; + label = "ap_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@80 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm { + reg = <0x4e>; + label = "pa_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + + wf_therm { + reg = <0x4f>; + label = "wf_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@81 { + target = <0xffffffff>; + + __overlay__ { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x2dc6c0>; + regulator-boot-on; + }; + }; + + fragment@82 { + target = <0xffffffff>; + + __overlay__ { + + tsp_int { + phandle = <0x65>; + + mux { + pins = "gpio9"; + function = "gpio"; + }; + + config { + pins = "gpio9"; + input-enable; + bias-disable; + }; + }; + + qupv3_se7_i2c_pins_tsp { + phandle = <0xcd>; + + qupv3_se7_i2c_active_tsp { + phandle = <0x63>; + + mux { + pins = "gpio6", "gpio7"; + function = "qup11"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + qupv3_se7_i2c_sleep_tsp { + phandle = <0x64>; + + mux { + pins = "gpio6", "gpio7"; + function = "gpio"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <0x2>; + bias-disable; + }; + }; + }; + }; + }; + + fragment@83 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x63>; + pinctrl-1 = <0x64>; + + synaptics_tcm@20 { + status = "disabled"; + }; + + atmel_mxt_ts@4a { + status = "disabled"; + }; + + touchscreen@20 { + status = "disabled"; + compatible = "zinitix,zt_ts_device"; + reg = <0x20>; + pinctrl-names = "on_state", "off_state"; + pinctrl-0 = <0x65>; + pinctrl-1 = <0x65>; + avdd-supply = <0xffffffff>; + zinitix,gpio_ldo_en; + zinitix,irq_type = <0x2008>; + zinitix,x_resolution = <0x438>; + zinitix,y_resolution = <0x960>; + zinitix,page_size = <0x80>; + zinitix,irq_gpio = <0xffffffff 0x9 0x2008>; + zinitix,chip_name = "ZT7650"; + zinitix,firmware_name = "tsp_zinitix/zt7650_a52.bin"; + zinitix,spay; + zinitix,aod; + zinitix,aot; + zinitix,mis_cal_check; + support_ear_detect_mode; + support_dex_mode; + zinitix,bringup = <0x0>; + zinitix,ss_touch_num = <0x1>; + phandle = <0xce>; + }; + + touchscreen@49 { + status = "okay"; + compatible = "stm,fts_touch"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x65>; + dvdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + stm,irq_gpio = <0xffffffff 0x9 0x2008>; + stm,max_coords = <0xfff 0xfff>; + stm,firmware_name = "tsp_stm/fts5cu56a_a52.bin"; + stm,tclm_level = <0x2>; + stm,afe_base = <0x14>; + stm,bringup = <0x0>; + stm,support_fod; + stm,enable_settings_aot; + support_ear_detect; + support_mis_calibration_test; + support_dex_mode; + support_open_short_test; + support_sram_test; + stm,ss_touch_num = <0x1>; + phandle = <0xcf>; + }; + }; + }; + + fragment@84 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + + key_vol_up_default { + pins = "gpio8"; + function = "normal"; + input-enable; + bias-pull-up; + power-source = <0x0>; + phandle = <0x66>; + }; + }; + }; + }; + + fragment@85 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "default"; + pinctrl-0 = <0x66>; + + vol_up { + label = "volume_up"; + gpios = <0xffffffff 0x8 0x1>; + linux,input-type = <0x1>; + linux,code = <0x73>; + debounce-interval = <0xf>; + }; + }; + }; + + fragment@86 { + target = <0xffffffff>; + + __overlay__ { + + ss_touch { + compatible = "samsung,ss_touch"; + ss_touch,numbers = <0x1>; + }; + }; + }; + + fragment@87 { + target = <0xffffffff>; + + __overlay__ { + + self_display_FC3_dtsi { + label = "self_display_FC3_dtsi"; + samsung,support_self_display; + samsung,self_mask_setting_pre_revA = [29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 02 75 10]; + samsung,self_mask_setting_post_revA = [29 01 00 00 00 00 02 75 00]; + samsung,self_mask_on_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 00 00 00 95 07 9e 09 5f 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_on_factory_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_off_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_disp_debug_rx_cmds_revA = [06 01 00 00 00 00 01 7f 04 01]; + samsung,self_mask_check_tx_pre1_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 04 b0 00 27 d8 29 01 00 00 00 00 02 d8 16 29 01 00 00 00 00 0a bf 01 07 00 00 00 10 00 00 00 29 01 00 00 11 00 02 7a 00 29 01 00 00 00 00 02 75 10 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,self_mask_check_tx_pre2_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 02 75 00 29 01 00 00 22 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 01 f4 02 33 09 60 09 61 00 00 ff ff ff 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,mask_crc_pass_data = [d3 9b]; + samsung,self_mask_check_rx_cmds_revA = [06 01 00 00 00 00 01 14 02 00]; + samsung,self_mask_check_tx_post_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 00 00 00 00 00 29 01 00 00 00 00 02 bf 00 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + phandle = <0x67>; + }; + }; + }; + + fragment@88 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + label = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0x1e6>; + qcom,mdss-brightness-max-level = <0x1e6>; + qcom,mdss-brightness-default-level = <0xff>; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-t-clk-pre = <0x3e>; + qcom,mdss-dsi-t-clk-post = <0x10>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x43>; + qcom,mdss-pan-physical-height-dimension = <0x96>; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-t-clk-pre-extend; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "irq_check"; + samsung,panel-vendor = "SDC"; + samsung,disp-model = "AMS646YD01"; + samsung,support_gamma_mode2; + samsung,skip_read_on_pre; + samsung,elvss_interpolation_temperature = <0xfffffff0>; + samsung,support_lpm; + samsung,support_gpara; + samsung,pointing_gpara; + samsung,two_byte_gpara; + samsung,rsc_4_frame_idle; + samsung,support_factory_panel_swap; + samsung,support-optical-fingerprint; + samsung,delayed-display-on = <0x1>; + samsung,support_vrr_based_bl; + samsung,esd-irq-trigger1 = "falling"; + ss,self_display = <0x67>; + samsung,level0_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 9f a5 a5]; + samsung,level0_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 9f 5a 5a]; + samsung,level1_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 5a 5a]; + samsung,level1_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 a5 a5]; + samsung,level2_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 fc 5a 5a]; + samsung,level2_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 fc a5 a5]; + samsung,brightness_tx_cmds_revA = <0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100>; + samsung,display_on_tx_cmds_revA = [29 00 00 00 00 00 03 9f a5 a5 05 00 00 00 00 00 02 29 00 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,display_off_tx_cmds_revA = [05 01 00 00 00 00 02 28 00]; + samsung,reg_read_pos_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 00 00]; + samsung,mtp_write_sysfs_tx_cmds_revA = <0x29000000 0x3d00 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + samsung,panel_ltps_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 50 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,smooth_dimming_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 91 63 29 00 00 00 00 00 02 63 20 29 01 00 00 11 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,gamma_mode2_normal_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26360 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x7290000 0x2 0x53202900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0002900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revE = <0x29000000 0x391 0x2012900 0x0 0x2532029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 1c 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,gamma_mode2_hbm_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26320 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x290000 0x2 0x53e02900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0072900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revE = <0x29000000 0x391 0x2002900 0x0 0x253e029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 14 29 00 00 00 00 00 02 53 e0 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,vrr_tx_cmds_revD = [29 00 00 00 00 00 03 60 00 04 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 b4 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a c0 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 02 29 00 00 00 00 00 02 f7 0f]; + samsung,vrr_tx_cmds_revA = [29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f]; + samsung,acl_on_tx_cmds_revA = [29 00 00 00 00 00 04 b0 03 b3 65 29 00 00 00 00 00 14 65 55 00 b0 51 66 98 15 55 55 55 08 f1 c6 48 40 00 20 10 09 29 00 00 00 00 00 02 55 03]; + samsung,acl_off_tx_cmds_revA = [29 01 00 00 00 00 02 55 00]; + samsung,manufacture_id0_rx_cmds_revA = [06 01 00 00 00 00 01 da 01 00 00]; + samsung,manufacture_id1_rx_cmds_revA = [06 01 00 00 00 00 01 db 01 00 00]; + samsung,manufacture_id2_rx_cmds_revA = [06 01 00 00 00 00 01 dc 01 00 00]; + samsung,module_info_rx_cmds_revA = [06 01 00 00 00 00 01 a1 0b 00 00]; + samsung,octa_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 04 00 0b]; + samsung,cell_id_rx_cmds_revA = [06 01 00 00 00 00 01 92 10 00 02]; + samsung,ddi_id_rx_cmds_revA = [06 01 00 00 00 00 01 d6 05 00 00]; + samsung,mtp_read_sysfs_rx_cmds_revA = [06 01 00 00 00 00 01 00 00 00 00]; + samsung,candela_map_table_revA = <0x0 0x0 0x0 0x2 0x2 0x1 0x1 0x1 0x3 0x2 0x2 0x2 0x2 0x4 0x3 0x3 0x3 0x3 0x5 0x3 0x4 0x4 0x4 0x7 0x4 0x5 0x5 0x5 0x8 0x5 0x6 0x6 0x6 0xa 0x5 0x7 0x7 0x7 0xc 0x6 0x8 0x8 0x8 0xd 0x7 0x9 0x9 0x9 0xf 0x7 0xa 0xa 0xa 0x11 0x8 0xb 0xb 0xb 0x13 0x9 0xc 0xc 0xc 0x15 0xa 0xd 0xd 0xd 0x18 0xb 0xe 0xe 0xe 0x1a 0xc 0xf 0xf 0xf 0x1c 0xd 0x10 0x10 0x10 0x1e 0xd 0x11 0x11 0x11 0x20 0xe 0x12 0x12 0x12 0x23 0xf 0x13 0x13 0x13 0x25 0x10 0x14 0x14 0x14 0x28 0x11 0x15 0x15 0x15 0x2a 0x12 0x16 0x16 0x16 0x2d 0x13 0x17 0x17 0x17 0x2f 0x14 0x18 0x18 0x18 0x32 0x15 0x19 0x19 0x19 0x34 0x16 0x1a 0x1a 0x1a 0x37 0x17 0x1b 0x1b 0x1b 0x3a 0x19 0x1c 0x1c 0x1c 0x3c 0x1a 0x1d 0x1d 0x1d 0x3f 0x1b 0x1e 0x1e 0x1e 0x42 0x1c 0x1f 0x1f 0x1f 0x45 0x1d 0x20 0x20 0x20 0x47 0x1e 0x21 0x21 0x21 0x4a 0x1f 0x22 0x22 0x22 0x4d 0x20 0x23 0x23 0x23 0x50 0x22 0x24 0x24 0x24 0x53 0x23 0x25 0x25 0x25 0x56 0x24 0x26 0x26 0x26 0x59 0x25 0x27 0x27 0x27 0x5c 0x26 0x28 0x28 0x28 0x5f 0x28 0x29 0x29 0x29 0x62 0x29 0x2a 0x2a 0x2a 0x65 0x2a 0x2b 0x2b 0x2b 0x68 0x2b 0x2c 0x2c 0x2c 0x6b 0x2d 0x2d 0x2d 0x2d 0x6e 0x2e 0x2e 0x2e 0x2e 0x71 0x2f 0x2f 0x2f 0x2f 0x74 0x30 0x30 0x30 0x30 0x77 0x32 0x31 0x31 0x31 0x7b 0x33 0x32 0x32 0x32 0x7e 0x34 0x33 0x33 0x33 0x81 0x36 0x34 0x34 0x34 0x84 0x37 0x35 0x35 0x35 0x88 0x38 0x36 0x36 0x36 0x8b 0x3a 0x37 0x37 0x37 0x8e 0x3b 0x38 0x38 0x38 0x92 0x3c 0x39 0x39 0x39 0x95 0x3e 0x3a 0x3a 0x3a 0x98 0x3f 0x3b 0x3b 0x3b 0x9c 0x40 0x3c 0x3c 0x3c 0x9f 0x42 0x3d 0x3d 0x3d 0xa2 0x43 0x3e 0x3e 0x3e 0xa6 0x44 0x3f 0x3f 0x3f 0xa9 0x46 0x40 0x40 0x40 0xad 0x47 0x41 0x41 0x41 0xb0 0x49 0x42 0x42 0x42 0xb4 0x4a 0x43 0x43 0x43 0xb7 0x4c 0x44 0x44 0x44 0xbb 0x4d 0x45 0x45 0x45 0xbe 0x4e 0x46 0x46 0x46 0xc2 0x50 0x47 0x47 0x47 0xc5 0x51 0x48 0x48 0x48 0xc9 0x53 0x49 0x49 0x49 0xcd 0x54 0x4a 0x4a 0x4a 0xd0 0x56 0x4b 0x4b 0x4b 0xd4 0x57 0x4c 0x4c 0x4c 0xd7 0x59 0x4d 0x4d 0x4d 0xdb 0x5a 0x4e 0x4e 0x4e 0xdf 0x5c 0x4f 0x4f 0x4f 0xe3 0x5d 0x50 0x50 0x50 0xe6 0x5f 0x51 0x51 0x51 0xea 0x60 0x52 0x52 0x52 0xee 0x62 0x53 0x53 0x53 0xf1 0x63 0x54 0x54 0x54 0xf5 0x65 0x55 0x55 0x55 0xf9 0x66 0x56 0x56 0x56 0xfd 0x68 0x57 0x57 0x57 0x101 0x69 0x58 0x58 0x58 0x104 0x6b 0x59 0x59 0x59 0x108 0x6c 0x5a 0x5a 0x5a 0x10c 0x6e 0x5b 0x5b 0x5b 0x110 0x70 0x5c 0x5c 0x5c 0x114 0x71 0x5d 0x5d 0x5d 0x118 0x73 0x5e 0x5e 0x5e 0x11b 0x74 0x5f 0x5f 0x5f 0x11f 0x76 0x60 0x60 0x60 0x123 0x77 0x61 0x61 0x61 0x127 0x79 0x62 0x62 0x62 0x12b 0x7b 0x63 0x63 0x63 0x12f 0x7c 0x64 0x64 0x64 0x133 0x7e 0x65 0x65 0x65 0x137 0x7f 0x66 0x66 0x66 0x13b 0x81 0x67 0x67 0x67 0x13f 0x83 0x68 0x68 0x68 0x143 0x84 0x69 0x69 0x69 0x147 0x86 0x6a 0x6a 0x6a 0x14b 0x88 0x6b 0x6b 0x6b 0x14f 0x89 0x6c 0x6c 0x6c 0x153 0x8b 0x6d 0x6d 0x6d 0x157 0x8c 0x6e 0x6e 0x6e 0x15b 0x8e 0x6f 0x6f 0x6f 0x15f 0x90 0x70 0x70 0x70 0x163 0x91 0x71 0x71 0x71 0x168 0x93 0x72 0x72 0x72 0x16c 0x95 0x73 0x73 0x73 0x170 0x96 0x74 0x74 0x74 0x174 0x98 0x75 0x75 0x75 0x178 0x9a 0x76 0x76 0x76 0x17c 0x9c 0x77 0x77 0x77 0x180 0x9d 0x78 0x78 0x78 0x185 0x9f 0x79 0x79 0x79 0x189 0xa1 0x7a 0x7a 0x7a 0x18d 0xa2 0x7b 0x7b 0x7b 0x191 0xa4 0x7c 0x7c 0x7c 0x195 0xa6 0x7d 0x7d 0x7d 0x19a 0xa7 0x7e 0x7e 0x7e 0x19e 0xa9 0x7f 0x7f 0x7f 0x1a2 0xab 0x80 0x80 0x80 0x1a6 0xad 0x81 0x81 0x81 0x1ab 0xae 0x82 0x82 0x82 0x1af 0xb0 0x83 0x83 0x83 0x1b3 0xb2 0x84 0x84 0x84 0x1b8 0xb4 0x85 0x85 0x85 0x1bc 0xb5 0x86 0x86 0x86 0x1c0 0xb7 0x87 0x87 0x87 0x1c5 0xb9 0x88 0x88 0x88 0x1c9 0xbb 0x89 0x89 0x89 0x1cd 0xbc 0x8a 0x8a 0x8a 0x1d1 0xbe 0x8b 0x8b 0x8b 0x1d6 0xc0 0x8c 0x8c 0x8c 0x1da 0xc2 0x8d 0x8d 0x8d 0x1de 0xc3 0x8e 0x8e 0x8e 0x1e3 0xc5 0x8f 0x8f 0x8f 0x1e7 0xc7 0x90 0x90 0x90 0x1eb 0xc9 0x91 0x91 0x91 0x1f0 0xcb 0x92 0x92 0x92 0x1f4 0xcc 0x93 0x93 0x93 0x1f8 0xce 0x94 0x94 0x94 0x1fd 0xd0 0x95 0x95 0x95 0x201 0xd2 0x96 0x96 0x96 0x206 0xd4 0x97 0x97 0x97 0x20a 0xd6 0x98 0x98 0x98 0x20e 0xd7 0x99 0x99 0x99 0x213 0xd9 0x9a 0x9a 0x9a 0x217 0xdb 0x9b 0x9b 0x9b 0x21c 0xdd 0x9c 0x9c 0x9c 0x220 0xdf 0x9d 0x9d 0x9d 0x225 0xe1 0x9e 0x9e 0x9e 0x229 0xe2 0x9f 0x9f 0x9f 0x22e 0xe4 0xa0 0xa0 0xa0 0x232 0xe6 0xa1 0xa1 0xa1 0x237 0xe8 0xa2 0xa2 0xa2 0x23b 0xea 0xa3 0xa3 0xa3 0x240 0xec 0xa4 0xa4 0xa4 0x244 0xed 0xa5 0xa5 0xa5 0x249 0xef 0xa6 0xa6 0xa6 0x24d 0xf1 0xa7 0xa7 0xa7 0x252 0xf3 0xa8 0xa8 0xa8 0x256 0xf5 0xa9 0xa9 0xa9 0x25b 0xf7 0xaa 0xaa 0xaa 0x260 0xf9 0xab 0xab 0xab 0x264 0xfb 0xac 0xac 0xac 0x269 0xfd 0xad 0xad 0xad 0x26d 0xfe 0xae 0xae 0xae 0x272 0x100 0xaf 0xaf 0xaf 0x277 0x102 0xb0 0xb0 0xb0 0x27b 0x104 0xb1 0xb1 0xb1 0x280 0x106 0xb2 0xb2 0xb2 0x284 0x108 0xb3 0xb3 0xb3 0x289 0x10a 0xb4 0xb4 0xb4 0x28e 0x10c 0xb5 0xb5 0xb5 0x292 0x10e 0xb6 0xb6 0xb6 0x297 0x110 0xb7 0xb7 0xb7 0x29c 0x112 0xb8 0xb8 0xb8 0x2a0 0x113 0xb9 0xb9 0xb9 0x2a5 0x115 0xba 0xba 0xba 0x2aa 0x117 0xbb 0xbb 0xbb 0x2ae 0x119 0xbc 0xbc 0xbc 0x2b3 0x11b 0xbd 0xbd 0xbd 0x2b8 0x11d 0xbe 0xbe 0xbe 0x2bd 0x11f 0xbf 0xbf 0xbf 0x2c1 0x121 0xc0 0xc0 0xc0 0x2c6 0x123 0xc1 0xc1 0xc1 0x2cb 0x125 0xc2 0xc2 0xc2 0x2d0 0x127 0xc3 0xc3 0xc3 0x2d4 0x129 0xc4 0xc4 0xc4 0x2d9 0x12b 0xc5 0xc5 0xc5 0x2de 0x12d 0xc6 0xc6 0xc6 0x2e3 0x12f 0xc7 0xc7 0xc7 0x2e8 0x131 0xc8 0xc8 0xc8 0x2ec 0x133 0xc9 0xc9 0xc9 0x2f1 0x135 0xca 0xca 0xca 0x2f6 0x137 0xcb 0xcb 0xcb 0x2fb 0x139 0xcc 0xcc 0xcc 0x300 0x13b 0xcd 0xcd 0xcd 0x304 0x13d 0xce 0xce 0xce 0x309 0x13f 0xcf 0xcf 0xcf 0x30e 0x141 0xd0 0xd0 0xd0 0x313 0x143 0xd1 0xd1 0xd1 0x318 0x145 0xd2 0xd2 0xd2 0x31d 0x147 0xd3 0xd3 0xd3 0x322 0x149 0xd4 0xd4 0xd4 0x327 0x14b 0xd5 0xd5 0xd5 0x32b 0x14d 0xd6 0xd6 0xd6 0x330 0x14f 0xd7 0xd7 0xd7 0x335 0x151 0xd8 0xd8 0xd8 0x33a 0x153 0xd9 0xd9 0xd9 0x33f 0x155 0xda 0xda 0xda 0x344 0x157 0xdb 0xdb 0xdb 0x349 0x159 0xdc 0xdc 0xdc 0x34e 0x15b 0xdd 0xdd 0xdd 0x353 0x15d 0xde 0xde 0xde 0x358 0x15f 0xdf 0xdf 0xdf 0x35d 0x161 0xe0 0xe0 0xe0 0x362 0x163 0xe1 0xe1 0xe1 0x367 0x165 0xe2 0xe2 0xe2 0x36c 0x167 0xe3 0xe3 0xe3 0x371 0x169 0xe4 0xe4 0xe4 0x376 0x16b 0xe5 0xe5 0xe5 0x37b 0x16d 0xe6 0xe6 0xe6 0x380 0x170 0xe7 0xe7 0xe7 0x385 0x172 0xe8 0xe8 0xe8 0x38a 0x174 0xe9 0xe9 0xe9 0x38f 0x176 0xea 0xea 0xea 0x394 0x178 0xeb 0xeb 0xeb 0x399 0x17a 0xec 0xec 0xec 0x39e 0x17c 0xed 0xed 0xed 0x3a3 0x17e 0xee 0xee 0xee 0x3a8 0x180 0xef 0xef 0xef 0x3ad 0x182 0xf0 0xf0 0xf0 0x3b2 0x184 0xf1 0xf1 0xf1 0x3b7 0x186 0xf2 0xf2 0xf2 0x3bc 0x189 0xf3 0xf3 0xf3 0x3c1 0x18b 0xf4 0xf4 0xf4 0x3c7 0x18d 0xf5 0xf5 0xf5 0x3cc 0x18f 0xf6 0xf6 0xf6 0x3d1 0x191 0xf7 0xf7 0xf7 0x3d6 0x193 0xf8 0xf8 0xf8 0x3db 0x195 0xf9 0xf9 0xf9 0x3e0 0x197 0xfa 0xfa 0xfa 0x3e5 0x199 0xfb 0xfb 0xfb 0x3ea 0x19b 0xfc 0xfc 0xfc 0x3f0 0x19e 0xfd 0xfd 0xfd 0x3f5 0x1a0 0xfe 0xfe 0xfe 0x3fa 0x1a2 0xff 0xff 0xff 0x3ff 0x1a4>; + samsung,hbm_candela_map_table_revG = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x2 0x1aa 0x2 0x102 0x102 0x4 0x1ac 0x3 0x103 0x103 0x6 0x1ae 0x4 0x104 0x104 0x8 0x1b0 0x5 0x105 0x105 0xa 0x1b1 0x6 0x106 0x106 0xc 0x1b3 0x7 0x107 0x107 0xe 0x1b4 0x8 0x108 0x108 0x10 0x1b6 0x9 0x109 0x109 0x12 0x1b8 0xa 0x10a 0x10a 0x14 0x1b9 0xb 0x10b 0x10b 0x16 0x1bb 0xc 0x10c 0x10c 0x18 0x1bc 0xd 0x10d 0x10d 0x1a 0x1be 0xe 0x10e 0x10e 0x1c 0x1c0 0xf 0x10f 0x10f 0x1e 0x1c2 0x10 0x110 0x110 0x20 0x1c3 0x11 0x111 0x111 0x22 0x1c5 0x12 0x112 0x112 0x24 0x1c6 0x13 0x113 0x113 0x25 0x1c8 0x14 0x114 0x114 0x26 0x1ca 0x15 0x115 0x115 0x27 0x1cb 0x16 0x116 0x116 0x28 0x1cd 0x17 0x117 0x117 0x29 0x1ce 0x18 0x118 0x118 0x2a 0x1d0 0x19 0x119 0x119 0x2b 0x1d2 0x1a 0x11a 0x11a 0x2c 0x1d4 0x1b 0x11b 0x11b 0x2d 0x1d5 0x1c 0x11c 0x11c 0x2e 0x1d7 0x1d 0x11d 0x11d 0x2f 0x1d8 0x1e 0x11e 0x11e 0x30 0x1da 0x1f 0x11f 0x11f 0x31 0x1dc 0x20 0x120 0x120 0x32 0x1dd 0x21 0x121 0x121 0x33 0x1df 0x22 0x122 0x122 0x34 0x1e0 0x23 0x123 0x123 0x35 0x1e2 0x24 0x124 0x124 0x36 0x1e4 0x25 0x125 0x125 0x37 0x1e5 0x26 0x126 0x126 0x38 0x1e7 0x27 0x127 0x127 0x39 0x1e8 0x28 0x128 0x128 0x3a 0x1ea 0x29 0x129 0x129 0x3b 0x1ec 0x2a 0x12a 0x12a 0x3c 0x1ee 0x2b 0x12b 0x12b 0x3d 0x1ef 0x2c 0x12c 0x12c 0x3e 0x1f1 0x2d 0x12d 0x12d 0x3f 0x1f2 0x2e 0x12e 0x12e 0x40 0x1f4 0x2f 0x12f 0x12f 0x41 0x1f6 0x30 0x130 0x130 0x42 0x1f7 0x31 0x131 0x131 0x43 0x1f9 0x32 0x132 0x132 0x44 0x1fa 0x33 0x133 0x133 0x45 0x1fc 0x34 0x134 0x134 0x46 0x1fe 0x35 0x135 0x135 0x47 0x200 0x36 0x136 0x136 0x48 0x201 0x37 0x137 0x137 0x49 0x203 0x38 0x138 0x138 0x4a 0x204 0x39 0x139 0x139 0x4b 0x206 0x3a 0x13a 0x13a 0x4c 0x208 0x3b 0x13b 0x13b 0x4d 0x209 0x3c 0x13c 0x13c 0x4e 0x20b 0x3d 0x13d 0x13d 0x4f 0x20c 0x3e 0x13e 0x13e 0x50 0x20e 0x3f 0x13f 0x13f 0x51 0x210 0x40 0x140 0x140 0x52 0x211 0x41 0x141 0x141 0x53 0x213 0x42 0x142 0x142 0x54 0x215 0x43 0x143 0x143 0x55 0x216 0x44 0x144 0x144 0x56 0x218 0x45 0x145 0x145 0x57 0x21a 0x46 0x146 0x146 0x58 0x21b 0x47 0x147 0x147 0x59 0x21d 0x48 0x148 0x148 0x5a 0x21e 0x49 0x149 0x149 0x5b 0x220 0x4a 0x14a 0x14a 0x5c 0x222 0x4b 0x14b 0x14b 0x5d 0x223 0x4c 0x14c 0x14c 0x5f 0x225 0x4d 0x14d 0x14d 0x61 0x226 0x4e 0x14e 0x14e 0x63 0x228 0x4f 0x14f 0x14f 0x65 0x22a 0x50 0x150 0x150 0x67 0x22b 0x51 0x151 0x151 0x69 0x22d 0x52 0x152 0x152 0x6b 0x22f 0x53 0x153 0x153 0x6d 0x230 0x54 0x154 0x154 0x6f 0x232 0x55 0x155 0x155 0x71 0x234 0x56 0x156 0x156 0x73 0x235 0x57 0x157 0x157 0x75 0x237 0x58 0x158 0x158 0x77 0x238 0x59 0x159 0x159 0x79 0x23a 0x5a 0x15a 0x15a 0x7b 0x23c 0x5b 0x15b 0x15b 0x7d 0x23d 0x5c 0x15c 0x15c 0x7f 0x23f 0x5d 0x15d 0x15d 0x81 0x241 0x5e 0x15e 0x15e 0x83 0x242 0x5f 0x15f 0x15f 0x85 0x244 0x60 0x160 0x160 0x87 0x246 0x61 0x161 0x161 0x89 0x247 0x62 0x162 0x162 0x8b 0x249 0x63 0x163 0x163 0x8d 0x24a 0x64 0x164 0x164 0x8f 0x24c 0x65 0x165 0x165 0x91 0x24e 0x66 0x166 0x166 0x93 0x24f 0x67 0x167 0x167 0x95 0x251 0x68 0x168 0x168 0x97 0x253 0x69 0x169 0x169 0x9a 0x254 0x6a 0x16a 0x16a 0x9d 0x256 0x6b 0x16b 0x16b 0xa0 0x257 0x6c 0x16c 0x16c 0xa3 0x259 0x6d 0x16d 0x16d 0xa6 0x25b 0x6e 0x16e 0x16e 0xa8 0x25c 0x6f 0x16f 0x16f 0xab 0x25e 0x70 0x170 0x170 0xae 0x260 0x71 0x171 0x171 0xb1 0x261 0x72 0x172 0x172 0xb4 0x263 0x73 0x173 0x173 0xb7 0x264 0x74 0x174 0x174 0xba 0x266 0x75 0x175 0x175 0xbd 0x268 0x76 0x176 0x176 0xc0 0x269 0x77 0x177 0x177 0xc3 0x26b 0x78 0x178 0x178 0xc6 0x26d 0x79 0x179 0x179 0xc9 0x26e 0x7a 0x17a 0x17a 0xcc 0x270 0x7b 0x17b 0x17b 0xcf 0x272 0x7c 0x17c 0x17c 0xd2 0x273 0x7d 0x17d 0x17d 0xd5 0x275 0x7e 0x17e 0x17e 0xd8 0x276 0x7f 0x17f 0x17f 0xdb 0x278 0x80 0x180 0x180 0xde 0x27a 0x81 0x181 0x181 0xe1 0x27b 0x82 0x182 0x182 0xe4 0x27d 0x83 0x183 0x183 0xe7 0x27f 0x84 0x184 0x184 0xea 0x280 0x85 0x185 0x185 0xed 0x282 0x86 0x186 0x186 0xf0 0x283 0x87 0x187 0x187 0xf3 0x285 0x88 0x188 0x188 0xf6 0x287 0x89 0x189 0x189 0xf9 0x288 0x8a 0x18a 0x18a 0xfc 0x28a 0x8b 0x18b 0x18b 0xff 0x28c 0x8c 0x18c 0x18c 0x102 0x28d 0x8d 0x18d 0x18d 0x105 0x28f 0x8e 0x18e 0x18e 0x108 0x291 0x8f 0x18f 0x18f 0x10b 0x292 0x90 0x190 0x190 0x10e 0x294 0x91 0x191 0x191 0x111 0x295 0x92 0x192 0x192 0x114 0x297 0x93 0x193 0x193 0x117 0x299 0x94 0x194 0x194 0x11a 0x29a 0x95 0x195 0x195 0x11d 0x29c 0x96 0x196 0x196 0x120 0x29e 0x97 0x197 0x197 0x123 0x29f 0x98 0x198 0x198 0x126 0x2a1 0x99 0x199 0x199 0x129 0x2a3 0x9a 0x19a 0x19a 0x12c 0x2a4 0x9b 0x19b 0x19b 0x12f 0x2a6 0x9c 0x19c 0x19c 0x132 0x2a7 0x9d 0x19d 0x19d 0x135 0x2a9 0x9e 0x19e 0x19e 0x138 0x2ab 0x9f 0x19f 0x19f 0x13b 0x2ac 0xa0 0x1a0 0x1a0 0x13e 0x2ae 0xa1 0x1a1 0x1a1 0x141 0x2af 0xa2 0x1a2 0x1a2 0x144 0x2b1 0xa3 0x1a3 0x1a3 0x147 0x2b3 0xa4 0x1a4 0x1a4 0x14a 0x2b4 0xa5 0x1a5 0x1a5 0x14d 0x2b6 0xa6 0x1a6 0x1a6 0x150 0x2b8 0xa7 0x1a7 0x1a7 0x153 0x2b9 0xa8 0x1a8 0x1a8 0x156 0x2bb 0xa9 0x1a9 0x1a9 0x159 0x2bd 0xaa 0x1aa 0x1aa 0x15c 0x2be 0xab 0x1ab 0x1ab 0x15f 0x2c0 0xac 0x1ac 0x1ac 0x162 0x2c1 0xad 0x1ad 0x1ad 0x165 0x2c3 0xae 0x1ae 0x1ae 0x168 0x2c5 0xaf 0x1af 0x1af 0x16b 0x2c6 0xb0 0x1b0 0x1b0 0x16e 0x2c8 0xb1 0x1b1 0x1b1 0x171 0x2c9 0xb2 0x1b2 0x1b2 0x174 0x2cb 0xb3 0x1b3 0x1b3 0x177 0x2cd 0xb4 0x1b4 0x1b4 0x17a 0x2cf 0xb5 0x1b5 0x1b5 0x17d 0x2d0 0xb6 0x1b6 0x1b6 0x180 0x2d2 0xb7 0x1b7 0x1b7 0x183 0x2d3 0xb8 0x1b8 0x1b8 0x186 0x2d5 0xb9 0x1b9 0x1b9 0x189 0x2d7 0xba 0x1ba 0x1ba 0x18c 0x2d8 0xbb 0x1bb 0x1bb 0x18f 0x2da 0xbc 0x1bc 0x1bc 0x192 0x2db 0xbd 0x1bd 0x1bd 0x195 0x2dd 0xbe 0x1be 0x1be 0x198 0x2df 0xbf 0x1bf 0x1bf 0x19b 0x2e1 0xc0 0x1c0 0x1c0 0x19e 0x2e2 0xc1 0x1c1 0x1c1 0x1a1 0x2e4 0xc2 0x1c2 0x1c2 0x1a4 0x2e5 0xc3 0x1c3 0x1c3 0x1a7 0x2e7 0xc4 0x1c4 0x1c4 0x1aa 0x2e9 0xc5 0x1c5 0x1c5 0x1ad 0x2ea 0xc6 0x1c6 0x1c6 0x1b0 0x2ec 0xc7 0x1c7 0x1c7 0x1b3 0x2ed 0xc8 0x1c8 0x1c8 0x1b6 0x2ef 0xc9 0x1c9 0x1c9 0x1b9 0x2f1 0xca 0x1ca 0x1ca 0x1bc 0x2f2 0xcb 0x1cb 0x1cb 0x1bf 0x2f4 0xcc 0x1cc 0x1cc 0x1c2 0x2f5 0xcd 0x1cd 0x1cd 0x1c5 0x2f7 0xce 0x1ce 0x1ce 0x1c8 0x2f9 0xcf 0x1cf 0x1cf 0x1cb 0x2fb 0xd0 0x1d0 0x1d0 0x1ce 0x2fc 0xd1 0x1d1 0x1d1 0x1d1 0x2fe 0xd2 0x1d2 0x1d2 0x1d4 0x2ff 0xd3 0x1d3 0x1d3 0x1d7 0x301 0xd4 0x1d4 0x1d4 0x1da 0x303 0xd5 0x1d5 0x1d5 0x1dd 0x304 0xd6 0x1d6 0x1d6 0x1e0 0x306 0xd7 0x1d7 0x1d7 0x1e3 0x307 0xd8 0x1d8 0x1d8 0x1e6 0x309 0xd9 0x1d9 0x1d9 0x1e9 0x30b 0xda 0x1da 0x1da 0x1ec 0x30d 0xdb 0x1db 0x1db 0x1ef 0x30e 0xdc 0x1dc 0x1dc 0x1f2 0x310 0xdd 0x1dd 0x1dd 0x1f5 0x311 0xde 0x1de 0x1de 0x1f8 0x313 0xdf 0x1df 0x1df 0x1fb 0x315 0xe0 0x1e0 0x1e0 0x1fe 0x316 0xe1 0x1e1 0x1e1 0x201 0x318 0xe2 0x1e2 0x1e2 0x204 0x319 0xe3 0x1e3 0x1e3 0x207 0x31b 0xe4 0x1e4 0x1e4 0x20a 0x31d 0xe5 0x1e5 0x1e5 0x20d 0x31f 0xe6 0x1e6 0x1e6 0x210 0x320>; + samsung,hbm_candela_map_table_revA = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x3 0x1aa 0x2 0x102 0x102 0x6 0x1ac 0x3 0x103 0x103 0x9 0x1ae 0x4 0x104 0x104 0xc 0x1b0 0x5 0x105 0x105 0xf 0x1b1 0x6 0x106 0x106 0x12 0x1b3 0x7 0x107 0x107 0x15 0x1b4 0x8 0x108 0x108 0x18 0x1b6 0x9 0x109 0x109 0x1b 0x1b8 0xa 0x10a 0x10a 0x1e 0x1b9 0xb 0x10b 0x10b 0x21 0x1bb 0xc 0x10c 0x10c 0x24 0x1bc 0xd 0x10d 0x10d 0x27 0x1be 0xe 0x10e 0x10e 0x2a 0x1c0 0xf 0x10f 0x10f 0x2d 0x1c2 0x10 0x110 0x110 0x30 0x1c3 0x11 0x111 0x111 0x33 0x1c5 0x12 0x112 0x112 0x36 0x1c6 0x13 0x113 0x113 0x39 0x1c8 0x14 0x114 0x114 0x3c 0x1ca 0x15 0x115 0x115 0x3f 0x1cb 0x16 0x116 0x116 0x42 0x1cd 0x17 0x117 0x117 0x45 0x1ce 0x18 0x118 0x118 0x48 0x1d0 0x19 0x119 0x119 0x4b 0x1d2 0x1a 0x11a 0x11a 0x4e 0x1d4 0x1b 0x11b 0x11b 0x51 0x1d5 0x1c 0x11c 0x11c 0x54 0x1d7 0x1d 0x11d 0x11d 0x56 0x1d8 0x1e 0x11e 0x11e 0x58 0x1da 0x1f 0x11f 0x11f 0x5a 0x1dc 0x20 0x120 0x120 0x5c 0x1dd 0x21 0x121 0x121 0x5e 0x1df 0x22 0x122 0x122 0x60 0x1e0 0x23 0x123 0x123 0x62 0x1e2 0x24 0x124 0x124 0x64 0x1e4 0x25 0x125 0x125 0x66 0x1e5 0x26 0x126 0x126 0x68 0x1e7 0x27 0x127 0x127 0x6a 0x1e8 0x28 0x128 0x128 0x6c 0x1ea 0x29 0x129 0x129 0x6e 0x1ec 0x2a 0x12a 0x12a 0x70 0x1ee 0x2b 0x12b 0x12b 0x72 0x1ef 0x2c 0x12c 0x12c 0x74 0x1f1 0x2d 0x12d 0x12d 0x76 0x1f2 0x2e 0x12e 0x12e 0x78 0x1f4 0x2f 0x12f 0x12f 0x7a 0x1f6 0x30 0x130 0x130 0x7c 0x1f7 0x31 0x131 0x131 0x7e 0x1f9 0x32 0x132 0x132 0x80 0x1fa 0x33 0x133 0x133 0x82 0x1fc 0x34 0x134 0x134 0x84 0x1fe 0x35 0x135 0x135 0x86 0x200 0x36 0x136 0x136 0x88 0x201 0x37 0x137 0x137 0x8a 0x203 0x38 0x138 0x138 0x8c 0x204 0x39 0x139 0x139 0x8e 0x206 0x3a 0x13a 0x13a 0x90 0x208 0x3b 0x13b 0x13b 0x92 0x209 0x3c 0x13c 0x13c 0x94 0x20b 0x3d 0x13d 0x13d 0x96 0x20c 0x3e 0x13e 0x13e 0x98 0x20e 0x3f 0x13f 0x13f 0x9a 0x210 0x40 0x140 0x140 0x9c 0x211 0x41 0x141 0x141 0x9e 0x213 0x42 0x142 0x142 0xa0 0x215 0x43 0x143 0x143 0xa2 0x216 0x44 0x144 0x144 0xa4 0x218 0x45 0x145 0x145 0xa6 0x21a 0x46 0x146 0x146 0xa8 0x21b 0x47 0x147 0x147 0xaa 0x21d 0x48 0x148 0x148 0xac 0x21e 0x49 0x149 0x149 0xae 0x220 0x4a 0x14a 0x14a 0xb0 0x222 0x4b 0x14b 0x14b 0xb2 0x223 0x4c 0x14c 0x14c 0xb6 0x225 0x4d 0x14d 0x14d 0xba 0x226 0x4e 0x14e 0x14e 0xbe 0x228 0x4f 0x14f 0x14f 0xc2 0x22a 0x50 0x150 0x150 0xc6 0x22b 0x51 0x151 0x151 0xcb 0x22d 0x52 0x152 0x152 0xd0 0x22f 0x53 0x153 0x153 0xd5 0x230 0x54 0x154 0x154 0xda 0x232 0x55 0x155 0x155 0xdf 0x234 0x56 0x156 0x156 0xe4 0x235 0x57 0x157 0x157 0xe9 0x237 0x58 0x158 0x158 0xee 0x238 0x59 0x159 0x159 0xf3 0x23a 0x5a 0x15a 0x15a 0xf8 0x23c 0x5b 0x15b 0x15b 0xfd 0x23d 0x5c 0x15c 0x15c 0x102 0x23f 0x5d 0x15d 0x15d 0x107 0x241 0x5e 0x15e 0x15e 0x10c 0x242 0x5f 0x15f 0x15f 0x111 0x244 0x60 0x160 0x160 0x116 0x246 0x61 0x161 0x161 0x11b 0x247 0x62 0x162 0x162 0x120 0x249 0x63 0x163 0x163 0x125 0x24a 0x64 0x164 0x164 0x12a 0x24c 0x65 0x165 0x165 0x12f 0x24e 0x66 0x166 0x166 0x134 0x24f 0x67 0x167 0x167 0x139 0x251 0x68 0x168 0x168 0x13e 0x253 0x69 0x169 0x169 0x143 0x254 0x6a 0x16a 0x16a 0x148 0x256 0x6b 0x16b 0x16b 0x14d 0x257 0x6c 0x16c 0x16c 0x152 0x259 0x6d 0x16d 0x16d 0x157 0x25b 0x6e 0x16e 0x16e 0x15c 0x25c 0x6f 0x16f 0x16f 0x161 0x25e 0x70 0x170 0x170 0x166 0x260 0x71 0x171 0x171 0x16b 0x261 0x72 0x172 0x172 0x170 0x263 0x73 0x173 0x173 0x175 0x264 0x74 0x174 0x174 0x17a 0x266 0x75 0x175 0x175 0x17f 0x268 0x76 0x176 0x176 0x184 0x269 0x77 0x177 0x177 0x189 0x26b 0x78 0x178 0x178 0x18e 0x26d 0x79 0x179 0x179 0x193 0x26e 0x7a 0x17a 0x17a 0x198 0x270 0x7b 0x17b 0x17b 0x19d 0x272 0x7c 0x17c 0x17c 0x1a2 0x273 0x7d 0x17d 0x17d 0x1a7 0x275 0x7e 0x17e 0x17e 0x1ac 0x276 0x7f 0x17f 0x17f 0x1b1 0x278 0x80 0x180 0x180 0x1b6 0x27a 0x81 0x181 0x181 0x1bb 0x27b 0x82 0x182 0x182 0x1c0 0x27d 0x83 0x183 0x183 0x1c5 0x27f 0x84 0x184 0x184 0x1ca 0x280 0x85 0x185 0x185 0x1cf 0x282 0x86 0x186 0x186 0x1d4 0x283 0x87 0x187 0x187 0x1d9 0x285 0x88 0x188 0x188 0x1de 0x287 0x89 0x189 0x189 0x1e3 0x288 0x8a 0x18a 0x18a 0x1e8 0x28a 0x8b 0x18b 0x18b 0x1ed 0x28c 0x8c 0x18c 0x18c 0x1f2 0x28d 0x8d 0x18d 0x18d 0x1f7 0x28f 0x8e 0x18e 0x18e 0x1fc 0x291 0x8f 0x18f 0x18f 0x201 0x292 0x90 0x190 0x190 0x206 0x294 0x91 0x191 0x191 0x20b 0x295 0x92 0x192 0x192 0x210 0x297 0x93 0x193 0x193 0x215 0x299 0x94 0x194 0x194 0x21a 0x29a 0x95 0x195 0x195 0x21f 0x29c 0x96 0x196 0x196 0x224 0x29e 0x97 0x197 0x197 0x229 0x29f 0x98 0x198 0x198 0x22e 0x2a1 0x99 0x199 0x199 0x233 0x2a3 0x9a 0x19a 0x19a 0x238 0x2a4 0x9b 0x19b 0x19b 0x23d 0x2a6 0x9c 0x19c 0x19c 0x242 0x2a7 0x9d 0x19d 0x19d 0x247 0x2a9 0x9e 0x19e 0x19e 0x24d 0x2ab 0x9f 0x19f 0x19f 0x253 0x2ac 0xa0 0x1a0 0x1a0 0x259 0x2ae 0xa1 0x1a1 0x1a1 0x25f 0x2af 0xa2 0x1a2 0x1a2 0x265 0x2b1 0xa3 0x1a3 0x1a3 0x26b 0x2b3 0xa4 0x1a4 0x1a4 0x271 0x2b4 0xa5 0x1a5 0x1a5 0x277 0x2b6 0xa6 0x1a6 0x1a6 0x27d 0x2b8 0xa7 0x1a7 0x1a7 0x283 0x2b9 0xa8 0x1a8 0x1a8 0x289 0x2bb 0xa9 0x1a9 0x1a9 0x28f 0x2bd 0xaa 0x1aa 0x1aa 0x295 0x2be 0xab 0x1ab 0x1ab 0x29b 0x2c0 0xac 0x1ac 0x1ac 0x2a1 0x2c1 0xad 0x1ad 0x1ad 0x2a7 0x2c3 0xae 0x1ae 0x1ae 0x2ad 0x2c5 0xaf 0x1af 0x1af 0x2b3 0x2c6 0xb0 0x1b0 0x1b0 0x2b9 0x2c8 0xb1 0x1b1 0x1b1 0x2bf 0x2c9 0xb2 0x1b2 0x1b2 0x2c5 0x2cb 0xb3 0x1b3 0x1b3 0x2cb 0x2cd 0xb4 0x1b4 0x1b4 0x2d1 0x2cf 0xb5 0x1b5 0x1b5 0x2d7 0x2d0 0xb6 0x1b6 0x1b6 0x2dd 0x2d2 0xb7 0x1b7 0x1b7 0x2e3 0x2d3 0xb8 0x1b8 0x1b8 0x2e9 0x2d5 0xb9 0x1b9 0x1b9 0x2ef 0x2d7 0xba 0x1ba 0x1ba 0x2f5 0x2d8 0xbb 0x1bb 0x1bb 0x2fb 0x2da 0xbc 0x1bc 0x1bc 0x301 0x2db 0xbd 0x1bd 0x1bd 0x307 0x2dd 0xbe 0x1be 0x1be 0x30d 0x2df 0xbf 0x1bf 0x1bf 0x313 0x2e1 0xc0 0x1c0 0x1c0 0x319 0x2e2 0xc1 0x1c1 0x1c1 0x31f 0x2e4 0xc2 0x1c2 0x1c2 0x325 0x2e5 0xc3 0x1c3 0x1c3 0x32b 0x2e7 0xc4 0x1c4 0x1c4 0x331 0x2e9 0xc5 0x1c5 0x1c5 0x337 0x2ea 0xc6 0x1c6 0x1c6 0x33d 0x2ec 0xc7 0x1c7 0x1c7 0x343 0x2ed 0xc8 0x1c8 0x1c8 0x349 0x2ef 0xc9 0x1c9 0x1c9 0x34f 0x2f1 0xca 0x1ca 0x1ca 0x355 0x2f2 0xcb 0x1cb 0x1cb 0x35b 0x2f4 0xcc 0x1cc 0x1cc 0x361 0x2f5 0xcd 0x1cd 0x1cd 0x367 0x2f7 0xce 0x1ce 0x1ce 0x36d 0x2f9 0xcf 0x1cf 0x1cf 0x373 0x2fb 0xd0 0x1d0 0x1d0 0x379 0x2fc 0xd1 0x1d1 0x1d1 0x37f 0x2fe 0xd2 0x1d2 0x1d2 0x385 0x2ff 0xd3 0x1d3 0x1d3 0x38b 0x301 0xd4 0x1d4 0x1d4 0x391 0x303 0xd5 0x1d5 0x1d5 0x397 0x304 0xd6 0x1d6 0x1d6 0x39d 0x306 0xd7 0x1d7 0x1d7 0x3a3 0x307 0xd8 0x1d8 0x1d8 0x3a9 0x309 0xd9 0x1d9 0x1d9 0x3af 0x30b 0xda 0x1da 0x1da 0x3b5 0x30d 0xdb 0x1db 0x1db 0x3bb 0x30e 0xdc 0x1dc 0x1dc 0x3c1 0x310 0xdd 0x1dd 0x1dd 0x3c7 0x311 0xde 0x1de 0x1de 0x3cd 0x313 0xdf 0x1df 0x1df 0x3d3 0x315 0xe0 0x1e0 0x1e0 0x3d9 0x316 0xe1 0x1e1 0x1e1 0x3df 0x318 0xe2 0x1e2 0x1e2 0x3e5 0x319 0xe3 0x1e3 0x1e3 0x3eb 0x31b 0xe4 0x1e4 0x1e4 0x3f1 0x31d 0xe5 0x1e5 0x1e5 0x3f7 0x31f 0xe6 0x1e6 0x1e6 0x3ff 0x320>; + samsung,aod_candela_map_table_revA = <0x0 0x0 0xb 0x1b 0x2 0x1 0xc 0x1f 0x1a 0xa 0x2 0x20 0x36 0x19 0x1e 0x3 0x37 0xff 0x18 0x3c>; + samsung,support_dynamic_mipi_clk; + samsung,ffc_tx_cmds_revD = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 2e c5 29 00 00 00 00 00 03 c5 36 41 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revD = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53641 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c535a8 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53741>; + samsung,ffc_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 32 b1 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revA = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b1 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53222 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c533a0>; + samsung,dynamic_mipi_clk_timing_table = <0x65fbc9c0 0x671db480 0x6422c400>; + samsung,dynamic_mipi_clk_sel_table = <0x1 0x1 0x0 0x0 0x0 0x1 0x2 0x0 0x0 0x2 0x1 0x3 0x0 0x0 0x2 0x1 0x4 0x0 0x0 0x1 0x2 0xb 0x2942 0x29a2 0x0 0x2 0xb 0x29a3 0x29e8 0x1 0x2 0xb 0x29e9 0x2a56 0x0 0x2 0xc 0x25be 0x26d2 0x0 0x2 0xd 0x48a 0x54d 0x0 0x2 0xd 0x54e 0x593 0x1 0x2 0xd 0x594 0x5e9 0x0 0x2 0xe 0x601 0x661 0x0 0x2 0xe 0x662 0x6a7 0x1 0x2 0xe 0x6a8 0x6ca 0x0 0x2 0xf 0x1105 0x116a 0x0 0x2 0x11 0x8bd 0x8e6 0x0 0x2 0x11 0x8e7 0x92c 0x1 0x2 0x11 0x92d 0xa03 0x0 0x2 0x12 0xb79 0xb86 0x1 0x2 0x12 0xb87 0xb98 0x2 0x2 0x12 0xb99 0xc10 0x0 0x3 0x5b 0x0 0xd9 0x0 0x3 0x5b 0xda 0x165 0x1 0x3 0x5b 0x166 0x257 0x0 0x3 0x5c 0x258 0x26a 0x1 0x3 0x5c 0x26b 0x4a7 0x0 0x3 0x5c 0x4a8 0x4af 0x1 0x3 0x5d 0x4b0 0x64f 0x0 0x3 0x5d 0x650 0x6db 0x1 0x3 0x5d 0x6dc 0x79d 0x0 0x3 0x5e 0x79e 0x877 0x0 0x3 0x5e 0x878 0x903 0x1 0x3 0x5e 0x904 0x95f 0x0 0x3 0x5f 0x960 0xa59 0x0 0x3 0x61 0xabe 0xb29 0x0 0x3 0x61 0xb2a 0xbb5 0x1 0x3 0x61 0xbb6 0xd79 0x0 0x3 0x62 0xd7a 0xdac 0x1 0x3 0x62 0xdad 0xdd1 0x2 0x3 0x62 0xdd2 0xed7 0x0 0x3 0x66 0x1392 0x143b 0x0 0x3 0x67 0x143c 0x149f 0x0 0x3 0x68 0x14a0 0x1503 0x0 0x3 0x6b 0x1662 0x16d9 0x0 0x3 0x6c 0x16da 0x16f2 0x2 0x3 0x6c 0x16f3 0x176f 0x0 0x3 0x6d 0x1770 0x1805 0x0 0x3 0x6e 0x1806 0x1808 0x2 0x3 0x6e 0x1809 0x1931 0x0 0x3 0x6f 0x1932 0x1984 0x1 0x3 0x6f 0x1985 0x19c7 0x0 0x3 0x73 0x1f68 0x1f7a 0x1 0x3 0x73 0x1f7b 0x21b7 0x0 0x3 0x73 0x21b8 0x21f1 0x1 0x3 0x74 0x21f2 0x2214 0x2 0x3 0x74 0x2215 0x234f 0x0 0x3 0x76 0x23fa 0x24ba 0x0 0x3 0x76 0x24bb 0x2511 0x1 0x3 0x76 0x2512 0x2546 0x2 0x3 0x76 0x2547 0x25bb 0x0 0x3 0x77 0x25bc 0x25d9 0x2 0x3 0x77 0x25da 0x2629 0x0 0x3 0x78 0x262a 0x268a 0x1 0x3 0x78 0x268b 0x268d 0x0 0x3 0x7a 0x26c0 0x283d 0x0 0x3 0x7a 0x283e 0x2877 0x1 0x3 0x7c 0x8d68 0x8dfd 0x0 0x3 0x80 0x9376 0x9398 0x1 0x3 0x80 0x9399 0x9569 0x0 0x3 0x81 0x956a 0x96e4 0x0 0x3 0x81 0x96e5 0x96f9 0x1 0x3 0x82 0x96fa 0x98c2 0x0 0x3 0x82 0x98c3 0x994e 0x1 0x3 0x82 0x994f 0x9ae1 0x0 0x3 0x83 0x9ae2 0x9b20 0x1 0x3 0x83 0x9b21 0x9d5c 0x0 0x3 0x83 0x9d5d 0x9de8 0x1 0x3 0x83 0x9de9 0xa025 0x0 0x3 0x83 0xa026 0xa0b1 0x1 0x3 0x83 0xa0b2 0xa275 0x0 0x3 0x84 0xa276 0xa30c 0x0 0x3 0x84 0xa30d 0xa398 0x1 0x3 0x84 0xa399 0xa5d4 0x0 0x3 0x84 0xa5d5 0xa660 0x1 0x3 0x84 0xa661 0xa89d 0x0 0x3 0x84 0xa89e 0xa929 0x1 0x3 0x84 0xa92a 0xaa45 0x0 0x3 0x8a 0xd7c8 0xd813 0x0 0x3 0x8a 0xd814 0xd89f 0x1 0x3 0x8a 0xd8a0 0xdadc 0x0 0x3 0x8a 0xdadd 0xdb68 0x1 0x3 0x8a 0xdb69 0xdda3 0x0 0x3 0x9c 0x10384 0x1045d 0x0 0x3 0x9c 0x1045e 0x104e9 0x1 0x3 0x9c 0x104ea 0x10707 0x0 0x3 0xa1 0x10bea 0x10c9a 0x0 0x3 0xa1 0x10c9b 0x10ce1 0x1 0x3 0xa1 0x10ce2 0x10d26 0x2 0x3 0xa1 0x10d27 0x10d47 0x0 0x4 0x33 0x0 0x0 0x0 0x4 0x34 0x0 0x0 0x0 0x4 0x35 0x0 0x0 0x1 0x4 0x36 0x0 0x0 0x0 0x4 0x37 0x0 0x0 0x2 0x4 0x38 0x0 0x0 0x1 0x5 0x3d 0x0 0x0 0x2 0x5 0x3e 0x0 0x0 0x0 0x5 0x47 0x0 0x0 0x2>; + samsung,fd_on_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 40 40 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,fd_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 80 40 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_grid_on_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 bf 01 00 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,self_grid_off_revA = [29 01 00 00 11 00 03 f0 5a 5a 29 00 00 00 00 00 03 bf 00 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 4c f4 29 00 00 00 00 00 02 f4 28 29 00 00 00 00 00 03 91 01 01 29 00 00 00 00 00 02 53 27 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 40 0a 00 00 00 00 40 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 38 00 00 00 18 03 38 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 24 a4 29 01 00 00 00 00 02 f7 0f 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revA = <0x29000000 0x3f0 0x5a5a2900 0x0 0x4b0004c 0xf4290000 0x2 0xf4282900 0x0 0x3910101 0x29010000 0x253 0x26290000 0x2 0xf70f2901 0x1100 0x3f0a5a5>; + samsung,lpm_off_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 45 0a 00 00 00 00 45 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 3d 00 00 00 18 03 3d 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 26 f0 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_60nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 24]; + samsung,lpm_30nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 25]; + samsung,lpm_10nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 26]; + samsung,lpm_2nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 27]; + samsung,lpm_brightnes_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 02 53 26 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xf>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + samsung,ub-con-det = <0xffffffff 0x5 0x0>; + samsung,esd-irq-gpio1 = <0xffffffff 0x3 0x0>; + phandle = <0xf>; + + qcom,mdss-dsi-display-timings { + + fhd90 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0xf>; + qcom,mdss-dsi-panel-framerate = <0x5a>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x2847>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 0a 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 54 01 0c 00 b4 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 04 b0 00 04 f2 29 00 00 00 00 00 02 f2 54 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 01 00 00 11 00 02 f2 00 29 00 00 00 00 00 04 b0 01 b4 65 29 00 00 00 00 00 21 65 0c 94 0c 5a 0c 30 0b b8 0b 46 0a f6 09 ea 09 08 08 1a 07 12 06 2a 05 12 03 82 02 08 02 08 00 18 29 00 00 00 00 00 04 b0 00 2a 6a 29 00 00 00 00 00 04 6a 07 00 c0 29 01 00 00 11 00 02 f7 0f 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 04 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a 80 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 22 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 02 f7 0f 29 01 00 00 6e 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,panel-roi-alignment = <0x168 0x78 0x168 0x78 0x168 0x78>; + }; + + fhd60 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0x10>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x3dfa>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 0a 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 54 01 0c 00 b4 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 04 b0 00 04 f2 29 00 00 00 00 00 02 f2 54 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 01 00 00 11 00 02 f2 00 29 00 00 00 00 00 04 b0 01 b4 65 29 00 00 00 00 00 21 65 0c 94 0c 5a 0c 30 0b b8 0b 46 0a f6 09 ea 09 08 08 1a 07 12 06 2a 05 12 03 82 02 08 02 08 00 18 29 00 00 00 00 00 04 b0 00 2a 6a 29 00 00 00 00 00 04 6a 07 00 c0 29 01 00 00 11 00 02 f7 0f 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 04 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a 80 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 22 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 02 f7 0f 29 01 00 00 6e 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,panel-roi-alignment = <0x168 0x78 0x168 0x78 0x168 0x78>; + }; + }; + + qcom,panel-supply-entries { + #address-cells = <0x1>; + #size-cells = <0x0>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vci"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vddi"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1b7740>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + }; + }; + }; + }; + + fragment@89 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_PBA_BOOTING_FHD"; + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x0>; + qcom,mdss-dsi-bl-max-level = <0x639c>; + qcom,mdss-brightness-max-level = <0x639c>; + qcom,mdss-dsi-interleave-mode = <0x0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x3c>; + qcom,mdss-pan-physical-height-dimension = <0x6a>; + qcom,mdss-dsi-panel-mode-gpio-state = "invalid"; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + samsung,candela_map_table_revA = <0x0 0x0 0x2 0x5 0x1 0x2 0x2 0x6 0x2 0x3 0x3 0x7 0x3 0x4 0x4 0x8 0x4 0x5 0x5 0x9 0x5 0x6 0x6 0xa 0x6 0x7 0x7 0xb 0x7 0x8 0x8 0xc 0x8 0x9 0x9 0xd 0x9 0xa 0xa 0xe 0xa 0xb 0xb 0xf 0xb 0xc 0xc 0x10 0xc 0xd 0xd 0x11 0xd 0xe 0xe 0x13 0xe 0xf 0xf 0x14 0xf 0x10 0x10 0x15 0x10 0x11 0x11 0x16 0x11 0x12 0x12 0x18 0x12 0x13 0x13 0x19 0x13 0x14 0x14 0x1b 0x14 0x15 0x15 0x1d 0x15 0x16 0x16 0x1e 0x16 0x17 0x18 0x20 0x17 0x19 0x1a 0x22 0x18 0x1b 0x1c 0x25 0x19 0x1d 0x1d 0x27 0x1a 0x1e 0x20 0x29 0x1b 0x21 0x22 0x2c 0x1c 0x23 0x24 0x2f 0x1d 0x25 0x26 0x32 0x1e 0x27 0x28 0x35 0x1f 0x29 0x2b 0x38 0x20 0x2c 0x2e 0x3c 0x21 0x2f 0x31 0x40 0x22 0x32 0x34 0x44 0x23 0x35 0x38 0x48 0x24 0x39 0x3b 0x4d 0x25 0x3c 0x3f 0x52 0x26 0x40 0x43 0x57 0x27 0x44 0x47 0x5d 0x28 0x48 0x4c 0x62 0x29 0x4d 0x50 0x69 0x2a 0x51 0x56 0x6f 0x2b 0x57 0x5b 0x77 0x2c 0x5c 0x61 0x7e 0x2d 0x62 0x68 0x86 0x2e 0x69 0x6e 0x8f 0x2f 0x6f 0x76 0x98 0x30 0x77 0x7d 0xa2 0x31 0x7e 0x85 0xac 0x32 0x86 0x8e 0xb7 0x33 0x8f 0x96 0xc3 0x34 0x97 0xa0 0xcf 0x35 0xa1 0xaa 0xdc 0x36 0xab 0xb5 0xea 0x37 0xb6 0xc1 0xf9 0x38 0xc2 0xcd 0x109 0x39 0xce 0xda 0x11a 0x3a 0xdb 0xe6 0x12c 0x3b 0xe7 0xf2 0x13c 0x3c 0xf3 0xfe 0x14d 0x3d 0xff 0xff 0x168>; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x10>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + phandle = <0x10>; + + qcom,mdss-dsi-display-timings { + + fhd@0 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-front-porch = <0xa4>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-v-back-porch = <0x3>; + qcom,mdss-dsi-v-front-porch = <0x9>; + qcom,mdss-dsi-panel-clockrate = <0x35866480>; + qcom,mdss-dsi-panel-phy-timings = <0x1e0808 0x24220808 0x8020400>; + qcom,mdss-dsi-on-command = [39 01 00 00 78 00 02 11 00]; + qcom,mdss-dsi-off-command = <0x5010000 0x24000128 0x5010000 0x78000110>; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + }; + }; + }; + + fragment@90 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_te { + + sde_te_active { + phandle = <0x9>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + + sde_te_suspend { + phandle = <0xd>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + + pmx_sde { + phandle = <0xd0>; + + sde_dsi_active { + phandle = <0xa>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + bias-disable = <0x0>; + }; + }; + + sde_dsi_suspend { + phandle = <0xe>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable = <0x0>; + }; + }; + }; + }; + }; + + fragment@91 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_ub_det { + + sde_ub_det_default { + pins = "gpio5"; + function = "normal"; + input-enable; + power-source = <0x1>; + bias-disable; + phandle = <0xb>; + }; + }; + }; + }; + + fragment@92 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_fg_err { + + sde_fg_err_default { + pins = "gpio3"; + function = "normal"; + input-enable; + power-source = <0x0>; + bias-disable; + phandle = <0xc>; + }; + }; + }; + }; + + fragment@93 { + target = <0xffffffff>; + + __overlay__ { + + qcom,dsi-display@9 { + label = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + qcom,display-type = "primary"; + phandle = <0xd1>; + }; + + qcom,dsi-display@10 { + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,display-type = "primary"; + phandle = <0xd2>; + }; + }; + }; + + fragment@94 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c000000 0x0 0x9e4000>; + label = "cont_splash_region"; + }; + }; + + fragment@95 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c9e4000 0x0 0x100000>; + label = "dfps_data_region"; + }; + }; + + fragment@96 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c000000 0x0 0x9e4000>; + label = "disp_rdump_region"; + }; + }; + + fragment@97 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x68>; + status = "okay"; + + sm5714@49 { + status = "okay"; + compatible = "siliconmitus,sm5714mfd"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x69>; + sm5714,irq-gpio = <0xffffffff 0x21 0x0>; + sm5714,wakeup; + }; + }; + }; + + fragment@98 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x6a>; + status = "okay"; + + usbpd-sm5714@33 { + status = "okay"; + compatible = "sm5714-usbpd"; + reg = <0x33>; + pinctrl-names = "default"; + pinctrl-0 = <0x6b>; + usbpd,usbpd_int = <0xffffffff 0x68 0x0>; + support_pd_role_swap; + + pdic-manager { + pdic,max_power = <0x1388>; + pdic_op_power = <0x9c4>; + pdic_max_voltage = <0x1770>; + pdic_max_current = <0x7d0>; + pdic,min_current = <0x1f4>; + pdic,giveback = <0x0>; + pdic,usb_com_capable = <0x1>; + pdic,no_usb_suspend = <0x1>; + source,max_voltage = <0x1388>; + source,min_voltage = <0xfa0>; + source,max_power = <0x9c4>; + }; + }; + }; + }; + + fragment@99 { + target = <0xffffffff>; + + __overlay__ { + + if_pmic_irq { + + if_pmic_irq_default { + phandle = <0x69>; + + mux { + pins = "gpio33"; + function = "gpio"; + }; + + config { + pins = "gpio33"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + + usbpd_irq { + + usbpd_irq_default { + phandle = <0x6b>; + + mux { + pins = "gpio104"; + function = "gpio"; + }; + + config { + pins = "gpio104"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + }; + }; + + fragment@100 { + target = <0xffffffff>; + + __overlay__ { + qcom,qusb-phy-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x18 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x46 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + qcom,qusb-phy-host-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x18 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x46 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + }; + }; + + fragment@101 { + target = <0xffffffff>; + + __overlay__ { + + fps_rst { + phandle = <0x6c>; + + mux { + pins = "gpio91"; + function = "gpio"; + }; + + config { + pins = "gpio91"; + bias-pull-down; + }; + }; + }; + }; + + fragment@102 { + target = <0xffffffff>; + + __overlay__ { + regulator-name = "VDD_BTP_3P3"; + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + }; + }; + + fragment@103 { + target = <0xffffffff>; + + __overlay__ { + qcom,set-miso-sampling; + qcom,miso-sampling-ctrl-val = <0x2>; + status = "okay"; + + gw9558-spi@0 { + compatible = "goodix,gw9558x_factory"; + reg = <0x0>; + spi-max-frequency = <0x17d7840>; + pinctrl-names = "default"; + pinctrl-0 = <0x6c>; + gpio-controller; + #gpio-cells = <0x2>; + goodix,btp-regulator = "VDD_BTP_3P3"; + goodix,gpio_reset = <0xffffffff 0x5b 0x0>; + goodix,chip_id = "GW9558"; + goodix,position = "11.81,-0.02,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + goodix,modelinfo = "A525"; + goodix,rb = "547,215,-1,FFFFFF,A9A9A9"; + }; + }; + }; + + fragment@104 { + target = <0xffffffff>; + + __overlay__ { + + gw9558@0 { + compatible = "goodix,gw9558x"; + reg = <0x0>; + spi-max-frequency = <0x17d7840>; + pinctrl-names = "default"; + pinctrl-0 = <0x6c>; + gpio-controller; + #gpio-cells = <0x2>; + goodix,btp-regulator = "VDD_BTP_3P3"; + goodix,gpio_reset = <0xffffffff 0x5b 0x0>; + goodix,chip_id = "GW9558"; + goodix,position = "11.81,-0.02,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + goodix,modelinfo = "A525"; + goodix,rb = "547,215,-1,FFFFFF,A9A9A9"; + }; + }; + }; + + fragment@105 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@106 { + target = <0xffffffff>; + + __overlay__ { + + qcom,flash_0 { + label = "flash"; + qcom,led-name = "led:flash_0"; + qcom,max-current = <0x5dc>; + qcom,default-led-trigger = "flash0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x5dc>; + qcom,duration-ms = <0x500>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + qcom,record-current-ma = <0x12c>; + phandle = <0x6d>; + }; + + qcom,torch_0 { + label = "torch"; + qcom,led-name = "led:torch_0"; + qcom,max-current = <0x1f4>; + qcom,default-led-trigger = "torch0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x12c>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + phandle = <0x6e>; + }; + + qcom,camera-flash@0 { + cell-index = <0x0>; + compatible = "qcom,camera-flash"; + flash-source = <0x6d>; + torch-source = <0x6e>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x77>; + }; + + qcom,cam-res-mgr { + compatible = "qcom,cam-res-mgr"; + shared-gpios = <0x3f>; + pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; + status = "ok"; + pinctrl-0 = <0x6f>; + pinctrl-1 = <0x70>; + }; + }; + }; + + fragment@107 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + sm5714-fled { + compatible = "siliconmitus,sm5714-fled"; + reg = <0x49>; + status = "okay"; + slave-addr = <0x92>; + flash-en-gpio = <0xffffffff 0x16 0x0>; + torch-en-gpio = <0xffffffff 0x43 0x0>; + flash-brightness = <0xf>; + preflash-brightness = <0x7>; + torch-brightness = <0x7>; + factory_current = <0x0>; + timeout = <0xff>; + }; + }; + }; + + fragment@108 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + qcom,ois@62 { + compatible = "qcom,ois"; + cell-index = <0x0>; + reg = <0x62>; + slave-addr = <0xc4>; + slave-id = <0x460>; + cam_vaf-supply = <0x71>; + regulator-names = "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x2ab980>; + rgltr-max-voltage = <0x2ab980>; + rgltr-load-current = <0x30d40>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x72 0x73>; + pinctrl-1 = <0x74 0x75>; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x20 0x0 0xffffffff 0x2b 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x0>; + gpio-custom1 = <0x1>; + gpio-vio = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x0 0x0 0x0>; + gpio-req-tbl-label = "MCU_RESET0", "MCU_BOOT0", "MCU_VIO"; + status = "ok"; + phandle = <0x79>; + }; + }; + }; + + fragment@109 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@0 { + cell-index = <0x0>; + compatible = "qcom,cam-sensor"; + reg = <0x0>; + slave-addr = <0x34>; + csiphy-sd-index = <0x0>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x76>; + led-flash-src = <0x77>; + eeprom-src = <0x78>; + ois-src = <0x79>; + cam_vio-supply = <0x7a>; + cam_vaf-supply = <0x71>; + cam_vana-supply = <0x7b>; + cam_vdig-supply = <0x7c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vaf", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x2ab980 0xf4240 0x0>; + rgltr-max-voltage = <0x1b7740 0x2ab980 0x2c4020 0x10c8e0 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x7d 0x7e 0x7f>; + pinctrl-1 = <0x80 0x81 0x82>; + gpios = <0xffffffff 0xd 0x0 0xffffffff 0x1e 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x1>; + gpio-custom1 = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_VANA0"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x41>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@2 { + cell-index = <0x2>; + compatible = "qcom,cam-sensor"; + reg = <0x3>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x83>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x84 0x85 0x86 0x87>; + pinctrl-1 = <0x88 0x89 0x8a 0x8b>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x2D { + cell-index = <0x2>; + compatible = "qcom,eeprom"; + reg = <0x2d>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x84 0x85 0x86 0x87>; + pinctrl-1 = <0x88 0x89 0x8a 0x8b>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x83>; + }; + + qcom,eeprom@37 { + cell-index = <0x3>; + compatible = "qcom,eeprom"; + reg = <0x37>; + slave-addr = <0x6e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_vdig-supply = <0x8c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x8d 0x8e 0x8f>; + pinctrl-1 = <0x90 0x91 0x92>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x9a>; + }; + }; + }; + + fragment@110 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@1 { + cell-index = <0x1>; + compatible = "qcom,cam-sensor"; + reg = <0x1>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x93>; + cam_vio-supply = <0x7a>; + cam_vana-supply = <0x94>; + cam_vdig-supply = <0x95>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x96 0x97>; + pinctrl-1 = <0x98 0x99>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@8 { + cell-index = <0x8>; + compatible = "qcom,cam-sensor"; + reg = <0x8>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x93>; + cam_vio-supply = <0x7a>; + cam_vana-supply = <0x94>; + cam_vdig-supply = <0x95>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x96 0x97>; + pinctrl-1 = <0x98 0x99>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@3 { + cell-index = <0x3>; + compatible = "qcom,cam-sensor"; + reg = <0x2>; + slave-addr = <0x6e>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x9a>; + cam_vio-supply = <0x7a>; + cam_vdig-supply = <0x8c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x8d 0x8e 0x8f>; + pinctrl-1 = <0x90 0x91 0x92>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@4 { + cell-index = <0x4>; + compatible = "qcom,cam-sensor"; + reg = <0x4>; + slave-addr = <0x7e>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + led-flash-src = <0x77>; + eeprom-src = <0x9b>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x9c 0x9d 0x9e 0x87>; + pinctrl-1 = <0x9f 0xa0 0xa1 0x8b>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x40 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + cam_vdig-supply = <0x8c>; + phandle = <0xd3>; + }; + + qcom,eeprom@0x3F { + cell-index = <0x4>; + compatible = "qcom,eeprom"; + reg = <0x3f>; + slave-addr = <0x7e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x9c 0x9d 0x9e 0x87>; + pinctrl-1 = <0x9f 0xa0 0xa1 0x8b>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x40 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + cam_vdig-supply = <0x8c>; + phandle = <0x9b>; + }; + }; + }; + + fragment@111 { + target = <0xffffffff>; + + __overlay__ { + + qcom,actuator@0xC { + cell-index = <0x0>; + reg = <0xc>; + slave-addr = <0x18>; + compatible = "i2c_actuator"; + rgltr-cntrl-support; + cam_vio-supply = <0x7a>; + cam_vaf-supply = <0x71>; + regulator-names = "cam_vio", "cam_vaf"; + rgltr-min-voltage = <0x1b7740 0x2ab980>; + rgltr-max-voltage = <0x1b7740 0x2ab980>; + rgltr-load-current = <0x30d40 0x30d40>; + phandle = <0x76>; + }; + + qcom,eeprom@50 { + cell-index = <0x0>; + reg = <0x50>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa0>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1 0x1>; + qcom,cam-power-seq-delay = <0x2 0x2>; + cam_vaf-supply = <0x71>; + cam_vio-supply = <0x7a>; + regulator-names = "cam_vaf", "cam_vio"; + rgltr-min-voltage = <0x2ab980 0x1b7740>; + rgltr-max-voltage = <0x2ab980 0x1b7740>; + rgltr-load-current = <0x30d40 0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + phandle = <0x78>; + }; + + qcom,eeprom@51 { + cell-index = <0x1>; + reg = <0x51>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa2>; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x2>; + cam_vio-supply = <0x7a>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-mode = <0x0>; + sensor-position = <0x1>; + rgltr-cntrl-support; + phandle = <0x93>; + }; + }; + }; + + fragment@112 { + target = <0xffffffff>; + + __overlay__ { + + samsung,vibrator { + compatible = "samsung_vib"; + samsung,vib_type = "COINDC"; + status = "ok"; + phandle = <0xd4>; + }; + }; + }; + + fragment@113 { + target = <0xffffffff>; + + __overlay__ { + + nfc_qupv3_se0_i2c_sleep { + phandle = <0xa2>; + + mux { + pins = "gpio34", "gpio35"; + function = "gpio"; + }; + + config { + pins = "gpio34", "gpio35"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + nfc_clk_req_gpio { + phandle = <0xa3>; + + mux { + pins = "gpio31"; + function = "gpio"; + }; + + config { + pins = "gpio31"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_irq_gpio { + phandle = <0xa4>; + + mux { + pins = "gpio37"; + function = "gpio"; + }; + + config { + pins = "gpio37"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_ven_gpio { + phandle = <0xa5>; + + mux { + pins = "gpio12"; + function = "gpio"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-high; + }; + }; + + nfc_firm_gpio { + phandle = <0xa6>; + + mux { + pins = "gpio36"; + function = "gpio"; + }; + + config { + pins = "gpio36"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + nfc_ldo_en_gpio { + phandle = <0xa7>; + + mux { + pins = "gpio68"; + function = "gpio"; + }; + + config { + pins = "gpio68"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@114 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + pinctrl-1 = <0xa2>; + qcom,clk-freq-out = <0x61a80>; + + sec-nfc@27 { + compatible = "sec-nfc"; + reg = <0x27>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + sec-nfc,ven-gpio = <0xffffffff 0xc 0x0>; + sec-nfc,irq-gpio = <0xffffffff 0x25 0x0>; + sec-nfc,firm-gpio = <0xffffffff 0x24 0x0>; + sec-nfc,clk_req-gpio = <0xffffffff 0x1f 0x0>; + sec-nfc,pvdd-gpio = <0xffffffff 0x44 0x0>; + sec-nfc,clk_req_wake; + sec-nfc,bootloader_ver = <0x6>; + pinctrl-names = "default"; + pinctrl-0 = <0xa3 0xa4 0xa5 0xa6 0xa7>; + }; + }; + }; + + fragment@115 { + target = <0xffffffff>; + + __overlay__ { + + hall { + status = "okay"; + compatible = "hall"; + linux,input-type = <0x1>; + linux,code = <0x15>; + hall,gpio_flip_cover = <0xffffffff 0xa 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa8>; + }; + }; + }; + + fragment@116 { + target = <0xffffffff>; + + __overlay__ { + + hall { + + hall_default { + pins = "gpio10"; + function = "normal"; + output-disable; + input-enable; + bias-disable; + power-source = <0x0>; + phandle = <0xa8>; + }; + }; + }; + }; + + fragment@abc { + target-path = [2f 00]; + + __overlay__ { + + sec_abc { + compatible = "samsung,sec_abc"; + status = "okay"; + + gpu { + gpu,label = "GPU fault"; + gpu,threshold_count = <0x4>; + gpu,threshold_time = <0x4b0>; + }; + + gpu_page { + gpu_page,label = "GPU page fault"; + gpu_page,threshold_count = <0x14>; + gpu_page,threshold_time = <0x4b0>; + }; + + aicl { + aicl,label = "battery aicl"; + aicl,threshold_count = <0x5>; + aicl,threshold_time = <0x12c>; + }; + }; + + abc_hub { + compatible = "samsung,abc_hub"; + status = "okay"; + + bootc { + bootc,time_spec_user = <0x186a0>; + bootc,time_spec_eng = <0x186a0>; + bootc,time_spec_fac = <0x186a0>; + }; + }; + }; + }; + + fragment@117 { + target = <0xffffffff>; + + __overlay__ { + + rpmh-regulator-ldoc8 { + compatible = "qcom,rpmh-vrm-regulator"; + mboxes = <0xffffffff 0x0>; + qcom,resource-name = "ldoc8"; + qcom,regulator-type = "pmic5-ldo"; + qcom,supported-modes = <0x2 0x4>; + qcom,mode-threshold-currents = <0x0 0x1>; + + regulator-pm6150l-l8 { + regulator-name = "pm6150l_l8"; + qcom,set = <0x3>; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + qcom,init-voltage = <0x1b7740>; + regulator-always-on; + qcom,init-mode = <0x2>; + phandle = <0xd5>; + }; + }; + + rpmh-regulator-ldoa5 { + + regulator-pm6150-l5 { + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + regulator-always-on; + phandle = <0xd6>; + }; + }; + + i2c@17 { + status = "ok"; + cell-index = <0x11>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x33 0x0 0xffffffff 0x34 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0xa9>; + phandle = <0xd7>; + + sx9360-i2c@28 { + compatible = "sx9360"; + reg = <0x28>; + pinctrl-names = "default"; + pinctrl-0 = <0xaa>; + interrupt-parent = <0xffffffff>; + interrupts = <0x4 0xc4 0x0 0x2>; + sx9360,nirq-gpio = <0xffffffff 0x5 0x1>; + sx9360,reggnrlctrl2_reg = <0x32>; + sx9360,againfreq_reg = <0x38>; + sx9360,refagainfreq_reg = <0x36>; + sx9360,gainrawfilt_reg = <0x1a>; + sx9360,refgainrawfilt_reg = <0x22>; + sx9360,proxthresh_reg = <0x1d>; + sx9360,hyst_reg = <0x35>; + sx9360,regproxctrl3_reg = <0xd>; + sx9360,resolution_reg = <0xf>; + sx9360,refresolution_reg = <0xf>; + sx9360,hallic_cert_detect = <0x1>; + }; + }; + }; + }; + + fragment@118 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x48 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6d 0x72 0x73 0x74 0x75 0x76>; + }; + }; + + fragment@119 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@120 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0xb 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x37 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6b 0x6d 0x72 0x73 0x74 0x76>; + }; + }; + + fragment@121 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@122 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0xb 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6b 0x6d 0x72 0x73 0x74 0x76>; + }; + }; + + fragment@123 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0xb 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6b 0x6d 0x72 0x73 0x74 0x76>; + }; + }; + + fragment@124 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@125 { + target = <0xffffffff>; + + __overlay__ { + + bat_thm { + label = "bat_thm"; + reg = <0x4f>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + + chg_thm { + label = "chg_thm"; + reg = <0x4d>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + }; + }; + + fragment@126 { + target = <0xffffffff>; + + __overlay__ { + + battery { + pinctrl-names = "default"; + battery,chip_vendor = "QCOM"; + status = "okay"; + compatible = "samsung,sec-battery"; + battery,vendor = "Battery"; + battery,charger_name = "sm5714-charger"; + battery,fuelgauge_name = "sm5714-fuelgauge"; + battery,fgsrc_switch_name = "sm5714-fuelgauge"; + battery,technology = <0x2>; + battery,batt_data_version = <0x1>; + battery,temp_adc_type = <0x1>; + battery,temp_channel_raw = <0x1>; + battery,adc_check_count = <0x5>; + battery,temp_check_type = <0x1>; + battery,chg_temp_check_type = <0x1>; + battery,thermal_source = <0x2>; + battery,chg_thermal_source = <0x2>; + battery,temp_table_adc = <0x76c 0x923 0xab2 0xc97 0xec8 0x114f 0x146a 0x1803 0x1c2e 0x20e2 0x25c4 0x2b7f 0x31eb 0x386a 0x3f07 0x45a1 0x4be0 0x51ec 0x5774 0x5c67 0x609d 0x6442 0x6755>; + battery,temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,chg_temp_table_adc = <0x6d6 0x889 0xa14 0xbe2 0xe04 0x107c 0x137e 0x170b 0x1b0d 0x1f93 0x2479 0x2a3c 0x3072 0x3719 0x3da0 0x43e4 0x4aa7 0x50aa 0x5651 0x5b61 0x5fd6 0x637c 0x66ca>; + battery,chg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,polling_time = <0xa 0x1e 0x1e 0x1e 0xe10>; + battery,cable_check_type = <0x4>; + battery,cable_source_type = <0x1>; + battery,polling_type = <0x1>; + battery,monitor_initial_count = <0x0>; + battery,battery_check_type = <0x0>; + battery,ovp_uvlo_check_type = <0x3>; + battery,temp_check_count = <0x1>; + battery,overheatlimit_threshold = <0x2bc>; + battery,overheatlimit_recovery = <0x2a8>; + battery,wire_warm_overheat_thresh = <0x1f4>; + battery,wire_normal_warm_thresh = <0x1a4>; + battery,wire_cool1_normal_thresh = <0xb4>; + battery,wire_cool2_cool1_thresh = <0x96>; + battery,wire_cool3_cool2_thresh = <0x32>; + battery,wire_cold_cool3_thresh = <0x0>; + battery,wire_warm_current = <0x61b>; + battery,wire_cool1_current = <0xaf0>; + battery,wire_cool2_current = <0x417>; + battery,wire_cool3_current = <0x1b5>; + battery,low_temp_topoff = <0xe1>; + battery,high_temp_topoff = <0xe1>; + battery,low_temp_float = <0x111c>; + battery,high_temp_float = <0x1036>; + battery,full_check_type = <0x7>; + battery,full_check_type_2nd = <0x7>; + battery,full_check_count = <0x1>; + battery,chg_gpio_full_check = <0x0>; + battery,chg_polarity_full_check = <0x1>; + battery,chg_high_temp = <0x22b>; + battery,chg_high_temp_recovery = <0x212>; + battery,chg_input_limit_current = <0x3e8>; + battery,chg_charging_limit_current = <0x578>; + battery,wpc_temp_control_source = <0x1>; + battery,wpc_high_temp = <0x17c>; + battery,wpc_high_temp_recovery = <0x168>; + battery,wpc_input_limit_current = <0x258>; + battery,wpc_charging_limit_current = <0x3e8>; + battery,wpc_temp_lcd_on_control_source = <0x1>; + battery,wpc_lcd_on_high_temp = <0x17c>; + battery,wpc_lcd_on_high_temp_rec = <0x168>; + battery,wpc_lcd_on_input_limit_current = <0x1c2>; + battery,wpc_store_high_temp = <0x168>; + battery,wpc_store_high_temp_recovery = <0x154>; + battery,wpc_store_charging_limit_current = <0x190>; + battery,wpc_store_lcd_on_high_temp = <0x168>; + battery,wpc_store_lcd_on_high_temp_rec = <0x12c>; + battery,wpc_store_lcd_on_charging_limit_current = <0x190>; + battery,sleep_mode_limit_current = <0x1f4>; + battery,wc_full_input_limit_current = <0x64>; + battery,mix_high_temp = <0x1a4>; + battery,mix_high_chg_temp = <0x1f4>; + battery,mix_high_temp_recovery = <0x186>; + battery,full_condition_type = <0x9>; + battery,full_condition_soc = <0x5d>; + battery,full_condition_vcell = <0x10ea>; + battery,recharge_check_count = <0x1>; + battery,recharge_condition_type = <0x4>; + battery,recharge_condition_soc = <0x62>; + battery,recharge_condition_vcell = <0x10d6>; + battery,charging_total_time = <0x3840>; + battery,hv_charging_total_time = <0x2a30>; + battery,normal_charging_total_time = <0x4650>; + battery,usb_charging_total_time = <0x8ca0>; + battery,recharging_total_time = <0x1518>; + battery,charging_reset_time = <0x0>; + battery,chg_float_voltage = <0x111c>; + battery,pre_afc_work_delay = <0x7d0>; + battery,pre_wc_afc_work_delay = <0xfa0>; + battery,pre_afc_input_current = <0x1f4>; + battery,pre_wc_afc_input_current = <0x1f4>; + battery,prepare_ta_delay = <0x0>; + battery,swelling_high_rechg_voltage = <0xfa0>; + battery,swelling_low_rechg_voltage = <0x1086>; + battery,siop_input_limit_current = <0x4b0>; + battery,siop_charging_limit_current = <0x3e8>; + battery,siop_hv_input_limit_current = <0x2bc>; + battery,siop_hv_input_limit_current_2nd = <0x226>; + battery,siop_hv_charging_limit_current = <0x3e8>; + battery,ttf_hv_charge_current = <0xa28>; + battery,ttf_dc25_charge_current = <0xed8>; + battery,rp_current_rp1 = <0x1f4>; + battery,rp_current_rp2 = <0x5dc>; + battery,rp_current_rp3 = <0xbb8>; + battery,rp_current_rdu_rp3 = <0x834>; + battery,rp_current_abnormal_rp3 = <0x708>; + battery,pd_charging_charge_power = <0x3a98>; + battery,max_charging_current = <0xaf0>; + battery,wireless_cc_cv = <0x55>; + battery,wireless_otg_input_current = <0x384>; + battery,age_data = <0x0 0x111c 0x10d6 0x10b8 0x5d 0x12c 0x1108 0x10c2 0x10a4 0x5c 0x190 0x10f4 0x10ae 0x1090 0x5b 0x2bc 0x10e0 0x109a 0x107c 0x5a 0x3e8 0x10ae 0x1068 0x104a 0x59>; + battery,health_condition = <0x384 0x0 0x4b0 0x0 0x5dc 0x0>; + battery,standard_curr = <0xe42>; + battery,expired_time = <0x23a0>; + battery,recharging_expired_time = <0x1518>; + battery,battery_full_capacity = <0x1388>; + battery,cisd_max_voltage_thr = <0x1388>; + battery,max_input_voltage = <0x2328>; + battery,max_input_current = <0xbb8>; + battery,cisd_alg_index = <0x8>; + battery,ignore_cisd_index = <0x0 0x3c0>; + battery,ignore_cisd_index_d = <0x0 0x78>; + battery,ttf_capacity = <0xf28>; + battery,cv_data = <0xe36 0x358 0x51b 0xd81 0x362 0x4f2 0xcc6 0x36b 0x4ca 0xc27 0x371 0x4ab 0xb78 0x379 0x483 0xac8 0x380 0x45a 0xa4a 0x387 0x433 0x9b2 0x38c 0x413 0x93e 0x393 0x3ea 0x89d 0x399 0x3c1 0x84b 0x39e 0x39c 0x7e3 0x3a2 0x37e 0x78a 0x3a6 0x35c 0x708 0x3ab 0x334 0x6ae 0x3b0 0x305 0x667 0x3b4 0x2e2 0x60b 0x3b8 0x2ba 0x5a7 0x3bc 0x291 0x562 0x3be 0x26f 0x543 0x3c2 0x24a 0x4a4 0x3c5 0x221 0x496 0x3cb 0x1d8 0x43e 0x3ce 0x1b2 0x427 0x3d1 0x189 0x3f0 0x3d4 0x160 0x3d1 0x3dc 0xda 0x36e 0x3e0 0x9b 0x366 0x3e2 0x7c 0x300 0x3e6 0x3e 0x2f5 0x3e8 0x0>; + io-channels = <0xffffffff 0x4f 0xffffffff 0x4d>; + io-channel-names = "adc-temp", "adc-chg-temp"; + }; + + sm5714-fuelgauge { + status = "okay"; + fuelgauge,fuel_alert_soc = <0x1>; + fuelgauge,capacity_max = <0x3e8>; + fuelgauge,capacity_max_margin = <0x12c>; + fuelgauge,capacity_min = <0x0>; + fuelgauge,capacity_calculation_type = <0x1f>; + fuelgauge,using_temp_compensation; + fuelgauge,low_temp_limit = <0x64>; + fuelgauge,using_hw_vempty; + fuelgauge,sw_v_empty_voltage = <0xc80>; + fuelgauge,sw_v_empty_voltage_cisd = <0xc1c>; + fuelgauge,sw_v_empty_recover_voltage = <0xd98>; + fuelgauge,capacity = <0x1388>; + + battery_params { + battery,id = <0x0>; + battery0,battery_type = <0x114e 0x1f20>; + battery0,battery_table0 = <0x1400 0x1b73 0x1c4b 0x1d38 0x1d68 0x1d7a 0x1d88 0x1d8f 0x1db4 0x1dea 0x1e0d 0x1e42 0x1e88 0x1eb4 0x1f01 0x1f3d 0x1f76 0x1fc7 0x2023 0x207f 0x2116 0x2190 0x2272 0x2400>; + battery0,battery_table1 = <0x0 0x99 0x219 0x4b3 0x5cc 0x74c 0xb80 0xd19 0xfb3 0x14e6 0x1a19 0x1f4c 0x29b3 0x2ee6 0x36b3 0x3be6 0x3e80 0x4119 0x464c 0x4b80 0x534c 0x5880 0x6400 0x6419>; + battery0,battery_table2 = <0x4b4b 0x4444 0x4040 0x3e3e 0x3c3c 0x3b3b 0x3838 0x3737 0x3535 0x3434 0x3434 0x3333 0x3333 0x3333 0x3333 0x3232>; + battery0,rs_value = <0x66 0x66 0x3800 0x199 0x599 0x599 0x100>; + battery0,v_alarm = <0xce4 0x0>; + battery0,topoff = <0x28a>; + battery0,i_cal = <0x0 0x0 0x800 0x800 0x0 0x0 0x7f0 0x81b>; + battery0,v_cal = <0x1 0x0 0x0 0x1 0x0 0x0 0x0>; + battery0,temp_std = <0x19>; + battery0,tem_poff = <0xd7a 0x32 0xd16 0x32>; + battery0,aux_ctrl = <0x322 0x5800>; + battery0,data_ver = <0x7>; + battery0,v_max_table = <0x2272 0x2250 0x222e 0x220c 0x21b7>; + battery0,q_max_table = <0x1f20 0x1e9f 0x1e1e 0x1d9d 0x1c5b>; + }; + }; + + cable-info { + default_input_current = <0x708>; + default_charging_current = <0x834>; + full_check_current_1st = <0x28a>; + full_check_current_2nd = <0xe1>; + + current_group_1 { + cable_number = <0x2 0x13 0x15 0x16 0x17 0x1e>; + input_current = <0x1f4>; + charging_current = <0x1f4>; + }; + + current_group_2 { + cable_number = <0x19 0x1f>; + input_current = <0x3e8>; + charging_current = <0x3e8>; + }; + + current_group_3 { + cable_number = <0x5 0x20>; + input_current = <0x5dc>; + charging_current = <0x5dc>; + }; + + current_group_4 { + cable_number = <0x6 0x7 0x8 0x11 0x12>; + input_current = <0x672>; + charging_current = <0xaf0>; + }; + + current_group_5 { + cable_number = <0x9>; + input_current = <0x672>; + charging_current = <0xc4e>; + }; + + current_group_6 { + cable_number = <0xa 0xc 0xf 0x1b 0x21 0x24>; + input_current = <0x320>; + charging_current = <0x960>; + }; + + current_group_7 { + cable_number = <0xd>; + input_current = <0x2bc>; + charging_current = <0x960>; + }; + + current_group_8 { + cable_number = <0x18>; + input_current = <0x3e8>; + charging_current = <0x1c2>; + }; + + current_group_9 { + cable_number = <0x23>; + input_current = <0x708>; + charging_current = <0x708>; + }; + + current_group_10 { + cable_number = <0xb 0xe 0x10 0x1c 0x23>; + input_current = <0x28a>; + charging_current = <0x960>; + }; + + current_group_11 { + cable_number = <0x1d 0x25>; + input_current = <0x1f4>; + charging_current = <0x4b0>; + }; + + current_group_12 { + cable_number = <0x1 0x4>; + input_current = <0x1db>; + charging_current = <0x226>; + }; + + current_group_13 { + cable_number = <0x22>; + input_current = <0x4b0>; + charging_current = <0x960>; + }; + }; + }; + }; + + fragment@127 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + + pca9468@57 { + compatible = "nxp,pca9468"; + reg = <0x57>; + pinctrl-names = "default"; + pca9468,input-current-limit = <0x26e8f0>; + pca9468,charging-current = <0x5b8d80>; + pca9468,input-itopoff = <0x7a120>; + pca9468,sense-resistance = <0x0>; + pca9468,switching-frequency = <0x3>; + pca9468,ntc-threshold = <0x0>; + pca9468,ta-mode = <0x1>; + pca9468,pps_reqen; + }; + }; + }; + + fragment@128 { + target = <0xffffffff>; + + __overlay__ { + + sec-direct-charger { + status = "okay"; + compatible = "samsung,sec-direct-charger"; + charger,battery_name = "battery"; + charger,main_charger = "sm5714-charger"; + charger,direct_charger = "pca9468-charger"; + charger,dchg_min_current = <0x7d0>; + charger,dchg_temp_low_threshold = <0xb4>; + charger,dchg_temp_high_threshold = <0x1a4>; + }; + + battery { + battery,charger_name = "sec-direct-charger"; + battery,dchg_temp_check_type = <0x1>; + battery,dchg_thermal_source = <0x3>; + battery,dchg_temp_table_adc = <0x19a28 0x1f806 0x25cd4 0x2cacc 0x35442 0x3f00c 0x4a754 0x58344 0x683dc 0x79ff2 0x8ce5c 0xa33c2 0xbbdd0 0xd5108 0xeed6a 0x1080a2 0x1213da 0x138b94 0x14dea6 0x16163a 0x171ffc 0x180e40 0x18ceb2>; + battery,dchg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,dc_step_chg_type = <0xe9>; + battery,dc_step_chg_charge_power = <0x55f0>; + battery,dc_step_chg_step = <0x3>; + battery,dc_step_chg_cond_vol = <0xfff 0x107c 0x111c>; + battery,dc_step_chg_cond_iin = <0x7ee 0x721 0x0>; + battery,dc_step_chg_iin_check_cnt = <0x3>; + battery,dc_step_chg_cond_soc = <0xc 0x32 0x64>; + battery,dc_step_chg_val_vfloat = <0xfff 0x107c 0x111c>; + battery,dc_step_chg_val_iout = <0x1388 0xfdc 0xe42>; + }; + }; + }; + + __symbols__ { + dsi_rm69299_visionox_amoled_video = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video"; + dsi_rm69299_visionox_amoled_cmd = "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd"; + dsi_sim_vid = "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video"; + dsi_sim_cmd = "/fragment@3/__overlay__/qcom,mdss_dsi_sim_cmd"; + dsi_sim_dsc_375_cmd = "/fragment@4/__overlay__/qcom,mdss_dsi_sim_dsc_375_cmd"; + dsi_nt36672c_video = "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video"; + dsi_panel_pwr_supply = "/fragment@6/__overlay__/dsi_panel_pwr_supply"; + dsi_panel_pwr_supply_no_labibb = "/fragment@6/__overlay__/dsi_panel_pwr_supply_no_labibb"; + dsi_panel_pwr_supply_labibb_amoled = "/fragment@6/__overlay__/dsi_panel_pwr_supply_labibb_amoled"; + dsi_rm69299_visionox_amoled_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@0"; + dsi_rm69299_visionox_amoled_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@1"; + dsi_sim_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@2"; + dsi_sim_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@3"; + dsi_sim_dsc_375_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@4"; + dsi_nt36672c_video_display = "/fragment@6/__overlay__/qcom,dsi-display@5"; + sde_dsi = "/fragment@6/__overlay__/qcom,dsi-display"; + sde_wb = "/fragment@6/__overlay__/qcom,wb-display@0"; + ext_disp = "/fragment@6/__overlay__/qcom,msm-ext-disp"; + ext_disp_audio_codec = "/fragment@6/__overlay__/qcom,msm-ext-disp/qcom,msm-ext-disp-audio-codec-rx"; + mtp_batterydata = "/fragment@11/__overlay__/qcom,battery-data"; + lpi_tlmm = "/fragment@27/__overlay__/lpi_pinctrl@627C0000"; + cdc_dmic01_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_active"; + cdc_dmic01_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_sleep"; + cdc_dmic01_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_active"; + cdc_dmic01_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_sleep"; + cdc_dmic23_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_active"; + cdc_dmic23_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_sleep"; + cdc_dmic23_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_active"; + cdc_dmic23_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_sleep"; + cdc_dmic45_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_active"; + cdc_dmic45_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_sleep"; + cdc_dmic45_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_active"; + cdc_dmic45_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_sleep"; + tx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_sleep"; + tx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_active"; + tx_swr_data0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_sleep"; + tx_swr_data0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_active"; + wsa_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_sleep"; + wsa_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_active"; + wsa_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_sleep"; + wsa_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_active"; + tx_swr_data1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_sleep"; + tx_swr_data1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_active"; + tx_swr_data2_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_sleep"; + tx_swr_data2_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_active"; + rx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_sleep"; + rx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_active"; + rx_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_sleep"; + rx_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_active"; + lpi_i2s1_sck_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_active"; + lpi_i2s1_sck_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_sleep"; + lpi_i2s1_ws_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_active"; + lpi_i2s1_ws_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_sleep"; + lpi_i2s1_sd0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_active"; + lpi_i2s1_sd0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_sleep"; + lpi_i2s1_sd1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_active"; + lpi_i2s1_sd1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_sleep"; + tx_macro = "/fragment@28/__overlay__/tx-macro@62620000"; + swr2 = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master"; + wcd938x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd938x-tx-slave"; + wcd937x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd937x-tx-slave"; + rx_macro = "/fragment@28/__overlay__/rx-macro@62600000"; + swr1 = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master"; + wcd938x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd938x-rx-slave"; + wcd937x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd937x-rx-slave"; + wsa_macro = "/fragment@28/__overlay__/wsa-macro@62640000"; + swr0 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master"; + wsa881x_0211 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211"; + wsa881x_0212 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212"; + wsa881x_0213 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213"; + wsa881x_0214 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214"; + va_macro = "/fragment@28/__overlay__/va-macro@62770000"; + wcd938x_codec = "/fragment@28/__overlay__/wcd938x-codec"; + wcd937x_codec = "/fragment@28/__overlay__/wcd937x-codec"; + cdc_dmic01_gpios = "/fragment@30/__overlay__/cdc_dmic01_pinctrl"; + cdc_dmic23_gpios = "/fragment@30/__overlay__/cdc_dmic23_pinctrl"; + cdc_dmic45_gpios = "/fragment@30/__overlay__/cdc_dmic45_pinctrl"; + wsa_swr_gpios = "/fragment@30/__overlay__/wsa_swr_clk_data_pinctrl"; + rx_swr_gpios = "/fragment@30/__overlay__/rx_swr_clk_data_pinctrl"; + tx_swr_gpios = "/fragment@30/__overlay__/tx_swr_clk_data_pinctrl"; + wsa_spkr_en1 = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl"; + wsa_spkr_en2 = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl"; + wcd_rst_gpio = "/fragment@31/__overlay__/msm_cdc_pinctrl@58"; + clock_audio_wsa_1 = "/fragment@31/__overlay__/wsa_core_clk"; + clock_audio_wsa_2 = "/fragment@31/__overlay__/wsa_npl_clk"; + clock_audio_rx_1 = "/fragment@31/__overlay__/rx_core_clk"; + clock_audio_rx_2 = "/fragment@31/__overlay__/rx_npl_clk"; + clock_audio_tx_1 = "/fragment@31/__overlay__/tx_core_clk"; + clock_audio_tx_2 = "/fragment@31/__overlay__/tx_npl_clk"; + clock_audio_va_1 = "/fragment@31/__overlay__/va_core_clk"; + clock_audio_va_2 = "/fragment@31/__overlay__/va_npl_clk"; + qupv3_se8_2hsuart = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000"; + qupv3_se8_2hsuart_pins = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins"; + qupv3_se8_2uart_tx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_active"; + qupv3_se8_2uart_rx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_active"; + qupv3_se8_2uart_tx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_sleep"; + qupv3_se8_2uart_rx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_sleep"; + sec_debug_region = "/fragment@37/__overlay__/sec_debug_region@0"; + sec_debug_autocomment = "/fragment@37/__overlay__/sec_debug_autocomment@0"; + sec_debug_rdx_bootdev = "/fragment@37/__overlay__/sec_debug_rdx_bootdev@0"; + kaslr_region = "/fragment@37/__overlay__/kaslr_region@A0001000"; + rkp_region = "/fragment@37/__overlay__/rkp_region@B0200000"; + hdm_region = "/fragment@37/__overlay__/hdm_region@A1000000"; + modem_shared_mem = "/fragment@37/__overlay__/modem_shared_mem_region@B5000000"; + usb_noti = "/fragment@60/__overlay__/usb-notifier"; + imp_list = "/fragment@65/__overlay__/imp_list"; + cdc_quin_mi2s_gpios = "/fragment@66/__overlay__/msm_cdc_pinctrl_quin"; + samsung_q6audio_adaptation = "/fragment@67/__overlay__/samsung,q6audio-adaptation"; + det_zones = "/fragment@67/__overlay__/det_zones"; + i2c_18 = "/fragment@67/__overlay__/i2c@18"; + tas256x = "/fragment@67/__overlay__/i2c@18/tas256x@4c"; + tas25xx_gpio_default = "/fragment@70/__overlay__/tas25xx_gpio_default"; + fm_lna_default = "/fragment@70/__overlay__/fm_lna_default"; + grip_i2c_active = "/fragment@71/__overlay__/grip_i2c/grip_i2c_active"; + grip_i2c_suspend = "/fragment@71/__overlay__/grip_i2c/grip_i2c_suspend"; + s2mpb03_i2c_sda_default = "/fragment@71/__overlay__/s2mpb03_i2c_sda_default"; + s2mpb03_i2c_scl_default = "/fragment@71/__overlay__/s2mpb03_i2c_scl_default"; + cam_sensor_mclk0_active = "/fragment@71/__overlay__/cam_sensor_mclk0_active"; + cam_sensor_mclk0_suspend = "/fragment@71/__overlay__/cam_sensor_mclk0_suspend"; + cam_sensor_mclk1_active = "/fragment@71/__overlay__/cam_sensor_mclk1_active"; + cam_sensor_mclk1_suspend = "/fragment@71/__overlay__/cam_sensor_mclk1_suspend"; + cam_sensor_mclk2_active = "/fragment@71/__overlay__/cam_sensor_mclk2_active"; + cam_sensor_mclk2_suspend = "/fragment@71/__overlay__/cam_sensor_mclk2_suspend"; + cam_sensor_mclk3_active = "/fragment@71/__overlay__/cam_sensor_mclk3_active"; + cam_sensor_mclk3_suspend = "/fragment@71/__overlay__/cam_sensor_mclk3_suspend"; + cam_sensor_mclk4_active = "/fragment@71/__overlay__/cam_sensor_mclk4_active"; + cam_sensor_mclk4_suspend = "/fragment@71/__overlay__/cam_sensor_mclk4_suspend"; + rcam1_sensor_reset_active = "/fragment@71/__overlay__/rcam1_sensor_reset_active"; + rcam1_sensor_reset_suspend = "/fragment@71/__overlay__/rcam1_sensor_reset_suspend"; + front_sensor_reset_active = "/fragment@71/__overlay__/front_sensor_reset_active"; + front_sensor_reset_suspend = "/fragment@71/__overlay__/front_sensor_reset_suspend"; + rcam3_sensor_reset_active = "/fragment@71/__overlay__/rcam3_sensor_reset_active"; + rcam3_sensor_reset_suspend = "/fragment@71/__overlay__/rcam3_sensor_reset_suspend"; + rcam2_sensor_reset_active = "/fragment@71/__overlay__/rcam2_sensor_reset_active"; + rcam2_sensor_reset_suspend = "/fragment@71/__overlay__/rcam2_sensor_reset_suspend"; + rcam4_sensor_reset_active = "/fragment@71/__overlay__/rcam4_sensor_reset_active"; + rcam4_sensor_reset_suspend = "/fragment@71/__overlay__/rcam4_sensor_reset_suspend"; + rcam1_sensor_vana_active = "/fragment@71/__overlay__/rcam1_sensor_vana_active"; + rcam1_sensor_vana_suspend = "/fragment@71/__overlay__/rcam1_sensor_vana_suspend"; + rcam2_sensor_vana_active = "/fragment@71/__overlay__/rcam2_sensor_vana_active"; + rcam2_sensor_vana_suspend = "/fragment@71/__overlay__/rcam2_sensor_vana_suspend"; + rcam3_sensor_vana_active = "/fragment@71/__overlay__/rcam3_sensor_vana_active"; + rcam3_sensor_vana_suspend = "/fragment@71/__overlay__/rcam3_sensor_vana_suspend"; + rcam4_sensor_vana_active = "/fragment@71/__overlay__/rcam4_sensor_vana_active"; + rcam4_sensor_vana_suspend = "/fragment@71/__overlay__/rcam4_sensor_vana_suspend"; + cam_mipi_sel_active = "/fragment@71/__overlay__/cam_mipi_sel_active"; + cam_mipi_sel_suspend = "/fragment@71/__overlay__/cam_mipi_sel_suspend"; + rcam2_sensor_vdig_active = "/fragment@71/__overlay__/rcam2_sensor_vdig_active"; + rcam2_sensor_vdig_suspend = "/fragment@71/__overlay__/rcam2_sensor_vdig_suspend"; + rcam4_sensor_vdig_active = "/fragment@71/__overlay__/rcam4_sensor_vdig_active"; + rcam4_sensor_vdig_suspend = "/fragment@71/__overlay__/rcam4_sensor_vdig_suspend"; + if_pmic_i2c_pins = "/fragment@71/__overlay__/if_pmic_i2c_pins"; + if_pmic_i2c_sleep = "/fragment@71/__overlay__/if_pmic_i2c_pins/if_pmic_i2c_sleep"; + usbpd_i2c_pins = "/fragment@71/__overlay__/usbpd_i2c_pins"; + usbpd_i2c_sleep = "/fragment@71/__overlay__/usbpd_i2c_pins/usbpd_i2c_sleep"; + mcu_reset_active = "/fragment@71/__overlay__/mcu_reset_active"; + mcu_reset_suspend = "/fragment@71/__overlay__/mcu_reset_suspend"; + mcu_clk_active = "/fragment@71/__overlay__/mcu_clk_active"; + mcu_clk_suspend = "/fragment@71/__overlay__/mcu_clk_suspend"; + torch_en_active = "/fragment@71/__overlay__/torch_en_active"; + torch_en_suspend = "/fragment@71/__overlay__/torch_en_suspend"; + grip_int_active = "/fragment@72/__overlay__/grip_int_active"; + grip_int_suspend = "/fragment@72/__overlay__/grip_int_suspend"; + i2c2 = "/fragment@77/__overlay__/i2c@2"; + s2mpb03_l1 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo1"; + s2mpb03_l2 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo2"; + s2mpb03_l3 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo3"; + s2mpb03_l4 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo4"; + s2mpb03_l5 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo5"; + s2mpb03_l6 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo6"; + s2mpb03_l7 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo7"; + tsp_int = "/fragment@82/__overlay__/tsp_int"; + qupv3_se7_i2c_pins_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp"; + qupv3_se7_i2c_active_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp/qupv3_se7_i2c_active_tsp"; + qupv3_se7_i2c_sleep_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp/qupv3_se7_i2c_sleep_tsp"; + tsp_zt = "/fragment@83/__overlay__/touchscreen@20"; + tsp_stm = "/fragment@83/__overlay__/touchscreen@49"; + key_vol_up_default = "/fragment@84/__overlay__/key_vol_up/key_vol_up_default"; + self_display_FC3_dtsi = "/fragment@87/__overlay__/self_display_FC3_dtsi"; + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD = "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + ss_dsi_panel_PBA_BOOTING_FHD = "/fragment@89/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD"; + sde_te_active = "/fragment@90/__overlay__/pmx_sde_te/sde_te_active"; + sde_te_suspend = "/fragment@90/__overlay__/pmx_sde_te/sde_te_suspend"; + pmx_sde = "/fragment@90/__overlay__/pmx_sde"; + sde_dsi_active = "/fragment@90/__overlay__/pmx_sde/sde_dsi_active"; + sde_dsi_suspend = "/fragment@90/__overlay__/pmx_sde/sde_dsi_suspend"; + sde_ub_det_default = "/fragment@91/__overlay__/pmx_sde_ub_det/sde_ub_det_default"; + sde_fg_err_default = "/fragment@92/__overlay__/pmx_sde_fg_err/sde_fg_err_default"; + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD_display = "/fragment@93/__overlay__/qcom,dsi-display@9"; + ss_dsi_panel_PBA_BOOTING_FHD_display = "/fragment@93/__overlay__/qcom,dsi-display@10"; + if_pmic_irq_default = "/fragment@99/__overlay__/if_pmic_irq/if_pmic_irq_default"; + usbpd_irq_default = "/fragment@99/__overlay__/usbpd_irq/usbpd_irq_default"; + fps_rst = "/fragment@101/__overlay__/fps_rst"; + sm5714_flash0 = "/fragment@106/__overlay__/qcom,flash_0"; + sm5714_torch0 = "/fragment@106/__overlay__/qcom,torch_0"; + led_flash0 = "/fragment@106/__overlay__/qcom,camera-flash@0"; + ois_rear = "/fragment@108/__overlay__/qcom,ois@62"; + eeprom2 = "/fragment@109/__overlay__/qcom,eeprom@0x2D"; + eeprom3 = "/fragment@109/__overlay__/qcom,eeprom@37"; + sensor_rear_macro = "/fragment@110/__overlay__/qcom,cam-sensor@4"; + eeprom4 = "/fragment@110/__overlay__/qcom,eeprom@0x3F"; + actuator_rear0 = "/fragment@111/__overlay__/qcom,actuator@0xC"; + eeprom0 = "/fragment@111/__overlay__/qcom,eeprom@50"; + eeprom1 = "/fragment@111/__overlay__/qcom,eeprom@51"; + vibrator = "/fragment@112/__overlay__/samsung,vibrator"; + nfc_qupv3_se0_i2c_sleep = "/fragment@113/__overlay__/nfc_qupv3_se0_i2c_sleep"; + nfc_clk_req_gpio = "/fragment@113/__overlay__/nfc_clk_req_gpio"; + nfc_irq_gpio = "/fragment@113/__overlay__/nfc_irq_gpio"; + nfc_ven_gpio = "/fragment@113/__overlay__/nfc_ven_gpio"; + nfc_firm_gpio = "/fragment@113/__overlay__/nfc_firm_gpio"; + nfc_ldo_en_gpio = "/fragment@113/__overlay__/nfc_ldo_en_gpio"; + hall_default = "/fragment@116/__overlay__/hall/hall_default"; + L8C = "/fragment@117/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150l_l8 = "/fragment@117/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150_l5 = "/fragment@117/__overlay__/rpmh-regulator-ldoa5/regulator-pm6150-l5"; + i2c_17 = "/fragment@117/__overlay__/i2c@17"; + }; + + __fixups__ { + mdss_mdp = "/fragment@0:target:0", "/fragment@1:target:0", "/fragment@2:target:0", "/fragment@3:target:0", "/fragment@4:target:0", "/fragment@5:target:0", "/fragment@8:target:0", "/fragment@10:target:0", "/fragment@88:target:0", "/fragment@89:target:0"; + tlmm = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-te-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-te-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-te-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-te-gpio:0", "/fragment@7/__overlay__:qcom,usbplug-cc-gpio:0", "/fragment@17/__overlay__:cd-gpios:0", "/fragment@24/__overlay__/synaptics_tcm@20:interrupt-parent:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,irq-gpio:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,reset-gpio:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:interrupt-parent:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:reset-gpios:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:irq-gpios:0", "/fragment@25/__overlay__/nq@28:qcom,nq-irq:0", "/fragment@25/__overlay__/nq@28:qcom,nq-ven:0", "/fragment@25/__overlay__/nq@28:qcom,nq-firm:0", "/fragment@25/__overlay__/nq@28:qcom,nq-clkreq:0", "/fragment@25/__overlay__/nq@28:interrupt-parent:0", "/fragment@35:target:0", "/fragment@67/__overlay__/i2c@18:gpios:0", "/fragment@67/__overlay__/i2c@18:gpios:12", "/fragment@67/__overlay__/i2c@18/tas256x@4c:ti,reset-gpio:0", "/fragment@67/__overlay__/i2c@18/tas256x@4c:ti,irq-gpio:0", "/fragment@68/__overlay__:qcom,fm-lna-gpios:0", "/fragment@70:target:0", "/fragment@71:target:0", "/fragment@73:target:0", "/fragment@77/__overlay__/i2c@2:gpios:0", "/fragment@77/__overlay__/i2c@2:gpios:12", "/fragment@82:target:0", "/fragment@83/__overlay__/touchscreen@20:zinitix,irq_gpio:0", "/fragment@83/__overlay__/touchscreen@49:stm,irq_gpio:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:qcom,platform-reset-gpio:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:qcom,platform-te-gpio:0", "/fragment@89/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD:qcom,platform-reset-gpio:0", "/fragment@90:target:0", "/fragment@97/__overlay__/sm5714@49:sm5714,irq-gpio:0", "/fragment@98/__overlay__/usbpd-sm5714@33:usbpd,usbpd_int:0", "/fragment@99:target:0", "/fragment@101:target:0", "/fragment@103/__overlay__/gw9558-spi@0:goodix,gpio_reset:0", "/fragment@104/__overlay__/gw9558@0:goodix,gpio_reset:0", "/fragment@107/__overlay__/sm5714-fled:flash-en-gpio:0", "/fragment@107/__overlay__/sm5714-fled:torch-en-gpio:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:12", "/fragment@108/__overlay__/qcom,ois@62:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:24", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:36", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:12", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:24", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:36", "/fragment@113:target:0", "/fragment@114/__overlay__/sec-nfc@27:interrupt-parent:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,ven-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,irq-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,firm-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,clk_req-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,pvdd-gpio:0", "/fragment@117/__overlay__/i2c@17:gpios:0", "/fragment@117/__overlay__/i2c@17:gpios:12", "/fragment@118:target:0", "/fragment@120:target:0", "/fragment@122:target:0", "/fragment@123:target:0"; + pm6150l_gpios = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-reset-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-reset-gpio:0", "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-bklight-en-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-en-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-reset-gpio:0", "/fragment@22:target:0", "/fragment@72:target:0", "/fragment@84:target:0", "/fragment@85/__overlay__/vol_up:gpios:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:samsung,esd-irq-gpio1:0", "/fragment@92:target:0", "/fragment@117/__overlay__/i2c@17/sx9360-i2c@28:sx9360,nirq-gpio:0"; + soc = "/fragment@6:target:0", "/fragment@11:target:0", "/fragment@23:target:0", "/fragment@31:target:0", "/fragment@34:target:0", "/fragment@60:target:0", "/fragment@67:target:0", "/fragment@77:target:0", "/fragment@86:target:0", "/fragment@87:target:0", "/fragment@93:target:0", "/fragment@104:target:0", "/fragment@106:target:0", "/fragment@112:target:0", "/fragment@115:target:0", "/fragment@117:target:0", "/fragment@119:target:0", "/fragment@124:target:0", "/fragment@126:target:0", "/fragment@128:target:0"; + mdss_dsi0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-ctrl:0"; + mdss_dsi_phy0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-phy:0"; + mdss_dsi0_pll = "/fragment@6/__overlay__/qcom,dsi-display:clocks:0", "/fragment@6/__overlay__/qcom,dsi-display:clocks:8", "/fragment@6/__overlay__/qcom,dsi-display:clocks:16", "/fragment@6/__overlay__/qcom,dsi-display:clocks:24", "/fragment@6/__overlay__/qcom,dsi-display:clocks:32", "/fragment@6/__overlay__/qcom,dsi-display:clocks:40", "/fragment@6/__overlay__/qcom,dsi-display:clocks:48", "/fragment@6/__overlay__/qcom,dsi-display:clocks:56", "/fragment@6/__overlay__/qcom,dsi-display:clocks:64", "/fragment@6/__overlay__/qcom,dsi-display:clocks:72"; + L13A = "/fragment@6/__overlay__/qcom,dsi-display:vddio-supply:0"; + L18A = "/fragment@6/__overlay__/qcom,dsi-display:vdda-3p3-supply:0"; + lcdb_ldo_vreg = "/fragment@6/__overlay__/qcom,dsi-display:lab-supply:0"; + lcdb_ncp_vreg = "/fragment@6/__overlay__/qcom,dsi-display:ibb-supply:0"; + pm6150_l18 = "/fragment@6/__overlay__/qcom,dsi-display:vci-supply:0"; + pm6150_l13 = "/fragment@6/__overlay__/qcom,dsi-display:vddi-supply:0"; + sde_dp = "/fragment@7:target:0", "/fragment@8/__overlay__:connectors:8", "/fragment@26:target:0"; + pm6150_pdphy = "/fragment@7/__overlay__:qcom,dp-usbpd-detection:0"; + sde_dp_usbplug_cc_active = "/fragment@7/__overlay__:pinctrl-0:0"; + sde_dp_usbplug_cc_suspend = "/fragment@7/__overlay__:pinctrl-1:0"; + sde_rscc = "/fragment@8/__overlay__:connectors:12"; + thermal_zones = "/fragment@9:target:0", "/fragment@18:target:0"; + pm6150_trip0 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:trip:0"; + pm6150_charger = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:cooling-device:0", "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:cooling-device:0", "/fragment@21:target:0"; + pm6150_trip1 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:trip:0"; + pm6150l_trip0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:trip:0"; + CPU0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:cooling-device:0"; + CPU1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:cooling-device:0"; + CPU2 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:cooling-device:0"; + CPU3 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:cooling-device:0"; + CPU4 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:cooling-device:0"; + CPU5 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:cooling-device:0"; + CPU6 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:cooling-device:0"; + CPU7 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:cooling-device:0"; + pm6150l_trip1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:trip:0"; + bcl_lvl0 = "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:trip:0"; + bcl_lvl1 = "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:trip:0"; + bcl_lvl2 = "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:trip:0"; + soc_trip = "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:trip:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:trip:0"; + pm6150l_vadc = "/fragment@12:target:0", "/fragment@13/__overlay__:io-channels:0", "/fragment@13/__overlay__:io-channels:8", "/fragment@13/__overlay__:io-channels:16", "/fragment@13/__overlay__:io-channels:24", "/fragment@77/__overlay__/sec_thermistor@1:io-channels:0", "/fragment@77/__overlay__/sec_thermistor@2:io-channels:0", "/fragment@80:target:0"; + pm6150l_adc_tm = "/fragment@13:target:0", "/fragment@18/__overlay__/pa-therm1:thermal-sensors:0"; + ufsphy_mem = "/fragment@14:target:0"; + pm6150_l4 = "/fragment@14/__overlay__:vdda-phy-supply:0"; + pm6150l_l3 = "/fragment@14/__overlay__:vdda-pll-supply:0", "/fragment@15/__overlay__:qcom,vddp-ref-clk-supply:0"; + ufshc_mem = "/fragment@15:target:0", "/fragment@63:target:0"; + ufs_phy_gdsc = "/fragment@15/__overlay__:vdd-hba-supply:0"; + pm6150_l19 = "/fragment@15/__overlay__:vcc-supply:0", "/fragment@16/__overlay__:vdd-supply:0"; + pm6150_l12 = "/fragment@15/__overlay__:vccq2-supply:0", "/fragment@16/__overlay__:vdd-io-supply:0"; + sdhc_1 = "/fragment@16:target:0"; + sdc1_clk_on = "/fragment@16/__overlay__:pinctrl-0:0"; + sdc1_cmd_on = "/fragment@16/__overlay__:pinctrl-0:4"; + sdc1_data_on = "/fragment@16/__overlay__:pinctrl-0:8"; + sdc1_rclk_on = "/fragment@16/__overlay__:pinctrl-0:12"; + sdc1_clk_off = "/fragment@16/__overlay__:pinctrl-1:0"; + sdc1_cmd_off = "/fragment@16/__overlay__:pinctrl-1:4"; + sdc1_data_off = "/fragment@16/__overlay__:pinctrl-1:8"; + sdc1_rclk_off = "/fragment@16/__overlay__:pinctrl-1:12"; + sdhc_2 = "/fragment@17:target:0"; + pm6150l_l9 = "/fragment@17/__overlay__:vdd-supply:0"; + pm6150l_l6 = "/fragment@17/__overlay__:vdd-io-supply:0"; + sdc2_clk_on = "/fragment@17/__overlay__:pinctrl-0:0"; + sdc2_cmd_on = "/fragment@17/__overlay__:pinctrl-0:4"; + sdc2_data_on = "/fragment@17/__overlay__:pinctrl-0:8"; + sdc2_cd_on = "/fragment@17/__overlay__:pinctrl-0:12"; + sdc2_clk_off = "/fragment@17/__overlay__:pinctrl-1:0"; + sdc2_cmd_off = "/fragment@17/__overlay__:pinctrl-1:4"; + sdc2_data_off = "/fragment@17/__overlay__:pinctrl-1:8"; + sdc2_cd_off = "/fragment@17/__overlay__:pinctrl-1:12"; + pm6150a_amoled = "/fragment@19:target:0"; + pm6150_qg = "/fragment@20:target:0"; + pm6150_vadc = "/fragment@21/__overlay__:io-channels:0", "/fragment@21/__overlay__:io-channels:8", "/fragment@21/__overlay__:io-channels:16", "/fragment@21/__overlay__:io-channels:24", "/fragment@21/__overlay__:io-channels:32", "/fragment@21/__overlay__:io-channels:40", "/fragment@21/__overlay__:io-channels:48", "/fragment@77/__overlay__/sec_thermistor@0:io-channels:0", "/fragment@79:target:0", "/fragment@125:target:0", "/fragment@126/__overlay__/battery:io-channels:0", "/fragment@126/__overlay__/battery:io-channels:8"; + qusb_phy0 = "/fragment@21/__overlay__:dpdm-supply:0", "/fragment@100:target:0"; + qupv3_se7_i2c = "/fragment@24:target:0", "/fragment@83:target:0", "/fragment@107:target:0"; + ts_active = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-0:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-0:0"; + ts_int_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:0"; + ts_reset_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:4", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:4"; + ts_release = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-2:0"; + pm6150_l10 = "/fragment@24/__overlay__/synaptics_tcm@20:vdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:vdd-supply:0", "/fragment@83/__overlay__/touchscreen@49:dvdd-supply:0"; + pm6150l_l7 = "/fragment@24/__overlay__/synaptics_tcm@20:avdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:avdd-supply:0", "/fragment@81:target:0", "/fragment@83/__overlay__/touchscreen@20:avdd-supply:0", "/fragment@83/__overlay__/touchscreen@49:avdd-supply:0"; + qupv3_se0_i2c = "/fragment@25:target:0", "/fragment@114:target:0"; + nfc_int_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:0"; + nfc_enable_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:4"; + nfc_clk_req_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:8"; + nfc_int_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:0"; + nfc_enable_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:4"; + nfc_clk_req_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:8"; + fsa4480 = "/fragment@26/__overlay__:qcom,dp-aux-switch:0", "/fragment@69:target:0"; + q6core = "/fragment@27:target:0", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:4", "/fragment@30:target:0", "/fragment@66:target:0", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:4"; + lpass_core_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:0", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:0", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:0"; + lpass_audio_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:8", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:8", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:8", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:8", "/fragment@28/__overlay__/va-macro@62770000:clocks:0"; + bolero = "/fragment@28:target:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214:qcom,bolero-handle:0", "/fragment@29/__overlay__:asoc-codec:4", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:12", "/fragment@65:target:0", "/fragment@68/__overlay__:asoc-codec:4", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:12"; + L10A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-rxtx-supply:0", "/fragment@28/__overlay__/wcd938x-codec:cdc-vddio-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-ldo-rxtx-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vddpx-1-supply:0"; + L15A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-buck-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-buck-supply:0"; + BOB = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-mic-bias-supply:0"; + atoll_snd = "/fragment@29:target:0", "/fragment@68:target:0"; + stub_codec = "/fragment@29/__overlay__:asoc-codec:0", "/fragment@68/__overlay__:asoc-codec:0"; + audio_apr = "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:0", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:0"; + spkr_1_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-0:0"; + spkr_1_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-1:0"; + spkr_2_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-0:0"; + spkr_2_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-1:0"; + wcd_reset_active = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-0:0"; + wcd_reset_sleep = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-1:0"; + va_cdc_dma_0_tx = "/fragment@32:target:0"; + aliases = "/fragment@33:target:0", "/fragment@64:target:0"; + clock_gcc = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:0", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:8", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:16"; + qupv3_1 = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:qcom,wrapper-core:0"; + dcc = "/fragment@36:target:0"; + reserved_memory = "/fragment@37:target:0", "/fragment@105:target:0", "/fragment@121:target:0"; + removed_region = "/fragment@38:target:0"; + pil_modem_mem = "/fragment@39:target:0"; + pil_adsp_mem = "/fragment@40:target:0"; + pil_camera_mem = "/fragment@41:target:0"; + pil_npu_mem = "/fragment@42:target:0"; + pil_video_mem = "/fragment@43:target:0"; + pil_cdsp_mem = "/fragment@44:target:0"; + qseecom_mem = "/fragment@45:target:0"; + qseecom_ta_mem = "/fragment@46:target:0"; + secure_carveout_heap = "/fragment@47:target:0"; + cdsp_sec_mem = "/fragment@48:target:0"; + msm_imem = "/fragment@49:target:0"; + camera = "/fragment@50:target:0"; + cam_vfe0 = "/fragment@51:target:0"; + cam_vfe1 = "/fragment@52:target:0"; + cam_vfe_lite = "/fragment@53:target:0"; + cam_lrme = "/fragment@54:target:0"; + shared_meta = "/fragment@55:target:0"; + android_q_fstab = "/fragment@56:target:0"; + pm8008_8 = "/fragment@57:target:0", "/fragment@75:target:0"; + pm8008_9 = "/fragment@58:target:0", "/fragment@76:target:0"; + usb0 = "/fragment@59:target:0"; + firmware = "/fragment@61:target:0"; + pil_modem = "/fragment@62:target:0"; + modem_smp2p_out = "/fragment@62/__overlay__:qcom,smem-states:0", "/fragment@62/__overlay__:qcom,smem-states:8", "/fragment@62/__overlay__:qcom,smem-states:16"; + pcm0 = "/fragment@68/__overlay__:asoc-platform:0"; + pcm1 = "/fragment@68/__overlay__:asoc-platform:4"; + pcm2 = "/fragment@68/__overlay__:asoc-platform:8"; + voip = "/fragment@68/__overlay__:asoc-platform:12"; + voice = "/fragment@68/__overlay__:asoc-platform:16"; + loopback = "/fragment@68/__overlay__:asoc-platform:20"; + compress = "/fragment@68/__overlay__:asoc-platform:24"; + hostless = "/fragment@68/__overlay__:asoc-platform:28"; + afe = "/fragment@68/__overlay__:asoc-platform:32"; + lsm = "/fragment@68/__overlay__:asoc-platform:36"; + routing = "/fragment@68/__overlay__:asoc-platform:40"; + compr = "/fragment@68/__overlay__:asoc-platform:44"; + pcm_noirq = "/fragment@68/__overlay__:asoc-platform:48"; + spmi_bus = "/fragment@74:target:0", "/fragment@117/__overlay__/i2c@17/sx9360-i2c@28:interrupt-parent:0"; + pm6150_gpios = "/fragment@78:target:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:samsung,ub-con-det:0", "/fragment@91:target:0", "/fragment@115/__overlay__/hall:hall,gpio_flip_cover:0", "/fragment@116:target:0"; + gpio_key = "/fragment@85:target:0"; + cont_splash_memory = "/fragment@94:target:0"; + dfps_data_memory = "/fragment@95:target:0"; + disp_rdump_memory = "/fragment@96:target:0"; + qupv3_se4_i2c = "/fragment@97:target:0", "/fragment@127:target:0"; + qupv3_se11_i2c = "/fragment@98:target:0"; + pm6150l_l11 = "/fragment@102:target:0"; + qupv3_se6_spi = "/fragment@103:target:0"; + pm6150l_switch2 = "/fragment@106/__overlay__/qcom,camera-flash@0:switch-source:0"; + qupv3_se10_i2c = "/fragment@108:target:0"; + cam_cci0 = "/fragment@109:target:0"; + titan_top_gdsc = "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@37:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:cam_clk-supply:0"; + clock_camcc = "/fragment@109/__overlay__/qcom,cam-sensor@0:clocks:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@37:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:clocks:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:clocks:0"; + cam_cci1 = "/fragment@110:target:0"; + qupv3_se9_i2c = "/fragment@111:target:0"; + apps_rsc = "/fragment@117/__overlay__/rpmh-regulator-ldoc8:mboxes:0"; + }; + + __local_fixups__ { + + fragment@0 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@1 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@2 { + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@5 { + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@6 { + + __overlay__ { + + qcom,dsi-display@0 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@1 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@2 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@3 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@4 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@5 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + qcom,dsi-display-list = <0x0 0x4>; + }; + }; + }; + + fragment@7 { + + __overlay__ { + qcom,ext-disp = <0x0>; + }; + }; + + fragment@8 { + + __overlay__ { + connectors = <0x0 0x4>; + }; + }; + + fragment@20 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@21 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@28 { + + __overlay__ { + + bolero-clk-rsc-mngr { + clocks = <0x0 0x8 0x10 0x18 0x20 0x28 0x30 0x38>; + }; + + tx-macro@62620000 { + clocks = <0x0 0x8>; + qcom,tx-swr-gpios = <0x0>; + }; + + rx-macro@62600000 { + clocks = <0x0 0x8>; + qcom,rx-swr-gpios = <0x0>; + }; + + wsa-macro@62640000 { + clocks = <0x0 0x8>; + qcom,wsa-swr-gpios = <0x0>; + + wsa_swr_master { + + wsa881x@20170211 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@20170212 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170213 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170214 { + qcom,spkr-sd-n-node = <0x0>; + }; + }; + }; + + wcd938x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + mbhc-button-thres = <0x0 0xc 0x18 0x24 0x30 0x3c 0x48 0x54>; + imp-table = <0x0 0x10 0x20 0x30 0x40 0x50 0x60 0x70>; + }; + + wcd937x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + }; + }; + }; + + fragment@29 { + + __overlay__ { + qcom,cdc-dmic01-gpios = <0x0>; + qcom,cdc-dmic23-gpios = <0x0>; + qcom,cdc-dmic45-gpios = <0x0>; + asoc-codec = <0x8>; + qcom,wsa-devs = <0x0 0x4 0x8 0xc>; + qcom,codec-aux-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@30 { + + __overlay__ { + + cdc_dmic01_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic23_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic45_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + wsa_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + rx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + tx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@34 { + + __overlay__ { + + qcom,qup_hsuart@a88000 { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@60 { + + __overlay__ { + + qcom,memshare { + + qcom,client_4 { + memory-region = <0x0>; + }; + }; + + samsung,sec_hdm { + memory-region = <0x0>; + }; + }; + }; + + fragment@66 { + + __overlay__ { + + msm_cdc_pinctrl_quin { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@67 { + + __overlay__ { + + i2c@18 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@68 { + + __overlay__ { + asoc-platform = <0x34>; + qcom,quin-mi2s-gpios = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@77 { + + __overlay__ { + + i2c@2 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@83 { + + __overlay__ { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + + touchscreen@20 { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + + touchscreen@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@85 { + + __overlay__ { + pinctrl-0 = <0x0>; + }; + }; + + fragment@88 { + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD { + ss,self_display = <0x0>; + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@89 { + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@97 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sm5714@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@98 { + + __overlay__ { + pinctrl-1 = <0x0>; + + usbpd-sm5714@33 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@103 { + + __overlay__ { + + gw9558-spi@0 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@104 { + + __overlay__ { + + gw9558@0 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@106 { + + __overlay__ { + + qcom,camera-flash@0 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,cam-res-mgr { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + }; + }; + + fragment@108 { + + __overlay__ { + + qcom,ois@62 { + cam_vaf-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@109 { + + __overlay__ { + + qcom,cam-sensor@0 { + actuator-src = <0x0>; + led-flash-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@2 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x2D { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@37 { + cam_vio-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + }; + }; + + fragment@110 { + + __overlay__ { + + qcom,cam-sensor@1 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@8 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@3 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@4 { + led-flash-src = <0x0>; + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + cam_vdig-supply = <0x0>; + }; + + qcom,eeprom@0x3F { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + cam_vdig-supply = <0x0>; + }; + }; + }; + + fragment@111 { + + __overlay__ { + + qcom,actuator@0xC { + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + }; + + qcom,eeprom@50 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@51 { + cam_vio-supply = <0x0>; + }; + }; + }; + + fragment@114 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sec-nfc@27 { + pinctrl-0 = <0x0 0x4 0x8 0xc 0x10>; + }; + }; + }; + + fragment@115 { + + __overlay__ { + + hall { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@117 { + + __overlay__ { + + i2c@17 { + pinctrl-0 = <0x0>; + + sx9360-i2c@28 { + pinctrl-0 = <0x0>; + }; + }; + }; + }; + }; }; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r06.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r06.dts index bb2b6d642391..377f699b956e 100755 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r06.dts +++ b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-eur-overlay-r06.dts @@ -1,25 +1,7255 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - /dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a52q-r06.dtsi" -#include "drivers/atoll-sec-a52q-battery-r04.dtsi" / { model = "Samsung A52Q PROJECT REV03A (board-id,06)"; compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 6>; - dtbo-version = <0>; + qcom,board-id = <0x22 0x6>; + dtbo-version = <0x0>; + + fragment@0 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ video mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x37 0x30>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x38ae2bc0 0x37bc55b0 0x37f8cb38 0x383540b8 0x3871b640>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x3>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@1 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ cmd mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x3da58d80 0x3c9e86e0 0x3ce04888 0x3d220a30 0x3d63cbd8>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x4>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@2 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,mdss-dsi-panel-name = "Simulator video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-mode-switch; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x0 0x0 0x0 0x1 0x0>; + qcom,panel-ack-disabled; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x5>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-video-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,cmd-to-video-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,cmd-to-video-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1 0x2 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-cmd-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,video-to-cmd-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,video-to-cmd-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@3 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-t-clk-post = <0xc>; + qcom,mdss-dsi-t-clk-pre = <0x29>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-ack-disabled; + qcom,ulps-enabled; + phandle = <0x6>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x64>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x64>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x2d0 0x28 0x2d0 0x28 0x2d0 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x1cc>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x2e4>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x21c 0x28 0x21c 0x28 0x21c 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@2 { + qcom,mdss-dsi-panel-width = <0x2d0>; + qcom,mdss-dsi-panel-height = <0x500>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x348>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x564>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x168>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x168 0x28 0x168 0x28 0x168 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + }; + }; + }; + }; + + fragment@4 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_dsc_375_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode DSC 3.75:1 dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,panel-ack-disabled; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,ulps-enabled; + phandle = <0x7>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-pulse-width = <0x10>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x8>; + qcom,mdss-dsi-v-front-porch = <0xa>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-on-command = <0x15010000 0x2ff 0x20150100 0x2 0xfb011501 0x0 0x2000115 0x1000000 0x20155 0x15010000 0x202 0x45150100 0x2 0x5401501 0x0 0x2061915 0x1000000 0x2071e 0x15010000 0x20b 0x73150100 0x2 0xc731501 0x0 0x20eb015 0x1000000 0x20fae 0x15010000 0x211 0xb8150100 0x2 0x13001501 0x0 0x2588015 0x1000000 0x25901 0x15010000 0x25a 0x150100 0x2 0x5b011501 0x0 0x25c8015 0x1000000 0x25d81 0x15010000 0x25e 0x150100 0x2 0x5f011501 0x0 0x2723115 0x1000000 0x26803 0x15010000 0x2ff 0x24150100 0x2 0xfb011501 0x0 0x2001c15 0x1000000 0x2010b 0x15010000 0x202 0xc150100 0x2 0x3011501 0x0 0x2040f15 0x1000000 0x20510 0x15010000 0x206 0x10150100 0x2 0x7101501 0x0 0x2088915 0x1000000 0x2098a 0x15010000 0x20a 0x13150100 0x2 0xb131501 0x0 0x20c1515 0x1000000 0x20d15 0x15010000 0x20e 0x17150100 0x2 0xf171501 0x0 0x2101c15 0x1000000 0x2110b 0x15010000 0x212 0xc150100 0x2 0x13011501 0x0 0x2140f15 0x1000000 0x21510 0x15010000 0x216 0x10150100 0x2 0x17101501 0x0 0x2188915 0x1000000 0x2198a 0x15010000 0x21a 0x13150100 0x2 0x1b131501 0x0 0x21c1515 0x1000000 0x21d15 0x15010000 0x21e 0x17150100 0x2 0x1f171501 0x0 0x2204015 0x1000000 0x22101 0x15010000 0x222 0x150100 0x2 0x23401501 0x0 0x2244015 0x1000000 0x2256d 0x15010000 0x226 0x40150100 0x2 0x27401501 0x0 0x2e00015 0x1000000 0x2dc21 0x15010000 0x2dd 0x22150100 0x2 0xde071501 0x0 0x2df0715 0x1000000 0x2e36d 0x15010000 0x2e1 0x7150100 0x2 0xe2071501 0x0 0x229d815 0x1000000 0x22a2a 0x15010000 0x24b 0x3150100 0x2 0x4c111501 0x0 0x24d1015 0x1000000 0x24e01 0x15010000 0x24f 0x1150100 0x2 0x50101501 0x0 0x2510015 0x1000000 0x25280 0x15010000 0x253 0x150100 0x2 0x56001501 0x0 0x2540715 0x1000000 0x25807 0x15010000 0x255 0x25150100 0x2 0x5b431501 0x0 0x25c0015 0x1000000 0x25f73 0x15010000 0x260 0x73150100 0x2 0x63221501 0x0 0x2640015 0x1000000 0x26708 0x15010000 0x268 0x4150100 0x2 0x72021501 0x0 0x27a8015 0x1000000 0x27b91 0x15010000 0x27c 0xd8150100 0x2 0x7d601501 0x0 0x27f1515 0x1000000 0x27515 0x15010000 0x2b3 0xc0150100 0x2 0xb4001501 0x0 0x2b50015 0x1000000 0x27800 0x15010000 0x279 0x150100 0x2 0x80001501 0x0 0x2830015 0x1000000 0x2930a 0x15010000 0x294 0xa150100 0x2 0x8a001501 0x0 0x29bff15 0x1000000 0x29db0 0x15010000 0x29f 0x63150100 0x2 0x98101501 0x0 0x2ec0015 0x1000000 0x2ff10 0x39010000 0x11c1 0x9200010 0x2000268 0x1bb000a 0x66704c5 0x39010000 0x3c2 0x10f01501 0x0 0x2c00315 0x1000000 0x43b03 0xa0a1501 0x0 0x2350015 0x1000000 0x2e501 0x15010000 0x2bb 0x10150100 0x2 0xfb010501 0x7800 0x2110005 0x1000078 0x22900>; + qcom,mdss-dsi-off-command = [05 01 00 00 78 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x0>; + qcom,mdss-dsi-h-back-porch = <0x0>; + qcom,mdss-dsi-h-pulse-width = <0x0>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x0>; + qcom,mdss-dsi-v-front-porch = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x0>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = <0x15010000 0x2bb 0x10150100 0x2 0xb0030501 0x7800 0x1111501 0x0 0x251ff15 0x1000000 0x25324 0x15010000 0x2ff 0x23150100 0x2 0x8051501 0x0 0x2469015 0x1000000 0x2ff10 0x15010000 0x2ff 0xf0150100 0x2 0x92011501 0x0 0x2ff1015 0x1000000 0x23500 0x5010000 0x28000129>; + qcom,mdss-dsi-off-command = <0x5010000 0x10000128 0x5010000 0x40000110>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x150505 0x201f0505 0x3020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1 0x2 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@5 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,mdss-dsi-panel-name = "nt36672c fhd plus video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x14 0x0 0x14 0x1 0x14>; + qcom,mdss-pan-physical-width-dimension = <0x4a>; + qcom,mdss-pan-physical-height-dimension = <0x83>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-cphy-mode; + qcom,mdss-dsi-t-clk-post = <0x0>; + qcom,mdss-dsi-t-clk-pre = <0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x5a 0x32>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-skip-timing-update; + qcom,dsi-dyn-clk-list = <0x3eb54a94 0x3e726713 0x3e2f838b 0x3deca00a 0x3da9bc89>; + qcom,dsi-dyn-clk-type = "constant-fps-adjust-hfp"; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,platform-bklight-en-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-en-gpio = <0xffffffff 0x4 0x0>; + phandle = <0x8>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-front-porch = <0xca>; + qcom,mdss-dsi-h-back-porch = <0x38>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0xa>; + qcom,mdss-dsi-v-front-porch = <0x50b>; + qcom,mdss-dsi-v-pulse-width = <0xa>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 b0 00 29 01 00 00 00 00 02 c0 00 29 01 00 00 00 00 03 c2 1b a0 29 01 00 00 00 00 02 ff 25 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 18 20 15 01 00 00 00 00 02 ff 2a 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 27 80 15 01 00 00 00 00 02 28 fd 29 01 00 00 00 00 02 ff f0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 5a 00 29 01 00 00 00 00 02 a0 08 29 01 00 00 00 00 02 ff d0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 09 ad 15 01 00 00 00 00 02 ff 10 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 51 ff 15 01 00 00 00 00 02 53 2c 15 01 00 00 00 00 02 ff 23 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 0a 00 15 01 00 00 00 00 02 0b 00 15 01 00 00 00 00 02 0c 00 15 01 00 00 00 00 02 0d 00 15 01 00 00 00 00 02 11 01 15 01 00 00 00 00 02 12 95 15 01 00 00 00 00 02 15 68 15 01 00 00 00 00 02 16 0b 15 01 00 00 00 00 02 6f 00 15 01 00 00 00 00 02 70 00 15 01 00 00 00 00 02 71 00 15 01 00 00 00 00 02 a0 11 15 01 00 00 00 00 02 ff f0 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 d2 52 29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 35 00 05 01 00 00 78 00 02 11 00 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x230909 0x26240909 0x9060204>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@6 { + target = <0xffffffff>; + + __overlay__ { + + dsi_panel_pwr_supply { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xab>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + }; + + qcom,panel-supply-entry@2 { + reg = <0x2>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-post-on-sleep = <0x14>; + }; + }; + + dsi_panel_pwr_supply_no_labibb { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x2>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + }; + + dsi_panel_pwr_supply_labibb_amoled { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x1>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vdda-3p3"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x3390>; + qcom,supply-disable-load = <0x50>; + }; + }; + + qcom,dsi-display@0 { + label = "dsi_rm69299_visionox_amoled_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0"; + qcom,dsi-panel = <0x3>; + qcom,dsi-display-active; + phandle = <0xac>; + }; + + qcom,dsi-display@1 { + label = "dsi_rm69299_visionox_amoled_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x4>; + phandle = <0xad>; + }; + + qcom,dsi-display@2 { + label = "dsi_sim_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x5>; + phandle = <0xae>; + }; + + qcom,dsi-display@3 { + label = "dsi_sim_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x6>; + phandle = <0xaf>; + }; + + qcom,dsi-display@4 { + label = "dsi_sim_dsc_375_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x7>; + phandle = <0xb0>; + }; + + qcom,dsi-display@5 { + label = "dsi_nt36672c_video_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + qcom,dsi-panel = <0x8>; + phandle = <0xb1>; + }; + + qcom,dsi-display { + compatible = "qcom,dsi-display"; + qcom,dsi-ctrl = <0xffffffff>; + qcom,dsi-phy = <0xffffffff>; + clocks = <0xffffffff 0x6 0xffffffff 0x9 0xffffffff 0x3 0xffffffff 0x8 0xffffffff 0xa 0xffffffff 0xd 0xffffffff 0x11 0xffffffff 0x15 0xffffffff 0x16 0xffffffff 0x19>; + clock-names = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + pinctrl-names = "panel_active", "panel_suspend"; + pinctrl-0 = <0x9 0xa 0xb 0xc>; + pinctrl-1 = <0xd 0xe 0xb 0xc>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,panel-te-source = <0x0>; + vddio-supply = <0xffffffff>; + vdda-3p3-supply = <0xffffffff>; + lab-supply = <0xffffffff>; + ibb-supply = <0xffffffff>; + qcom,dsi-display-list = <0xf 0x10>; + vci-supply = <0xffffffff>; + vddi-supply = <0xffffffff>; + phandle = <0x13>; + }; + + qcom,wb-display@0 { + compatible = "qcom,wb-display"; + cell-index = <0x0>; + label = "wb_display"; + phandle = <0x12>; + }; + + qcom,msm-ext-disp { + compatible = "qcom,msm-ext-disp"; + phandle = <0x11>; + + qcom,msm-ext-disp-audio-codec-rx { + compatible = "qcom,msm-ext-disp-audio-codec-rx"; + phandle = <0x2c>; + }; + }; + }; + }; + + fragment@7 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-usbpd-detection = <0xffffffff>; + qcom,ext-disp = <0x11>; + qcom,usbplug-cc-gpio = <0xffffffff 0x68 0x0>; + pinctrl-name = "mdss_dp_active", "mdss_dp_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + }; + }; + + fragment@8 { + target = <0xffffffff>; + + __overlay__ { + connectors = <0x12 0x13 0xffffffff 0xffffffff>; + }; + }; + + fragment@9 { + target = <0xffffffff>; + + __overlay__ { + + pm6150-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150l-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_cpu0 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl0 { + disable-thermal-zone; + + cooling-maps { + + vbat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + vbat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl1 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl2 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + soc { + disable-thermal-zone; + + cooling-maps { + + soc_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + soc_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + }; + }; + + fragment@10 { + target = <0xffffffff>; + + __overlay__ { + #cooling-cells = <0x2>; + }; + }; + + fragment@11 { + target = <0xffffffff>; + + __overlay__ { + + qcom,battery-data { + qcom,batt-id-range-pct = <0xf>; + phandle = <0x14>; + + qcom,alium_860_89032_0000_3600mAh { + qcom,max-voltage-uv = <0x426030>; + qcom,fg-cc-cv-threshold-uv = <0x423920>; + qcom,fastchg-current-ma = <0x1518>; + qcom,batt-id-kohm = <0x6b>; + qcom,battery-beta = <0x109a>; + qcom,battery-therm-kohm = <0x64>; + qcom,battery-type = "Alium_860_89032_0000_3600mAh_Jun15th2018"; + qcom,qg-batt-profile-ver = <0x64>; + qcom,jeita-fcc-ranges = <0x0 0x32 0x2625a0 0x33 0x190 0x5265c0 0x191 0x1c2 0x2625a0>; + qcom,jeita-fv-ranges = <0x0 0x32 0x40d990 0x33 0x190 0x426030 0x191 0x1c2 0x40d990>; + qcom,step-chg-ranges = <0x36ee80 0x39fbc0 0x5265c0 0x39fbc1 0x419ce0 0x36ee80 0x419ce1 0x426030 0x2625a0>; + qcom,ocv-based-step-chg; + qcom,jeita-soft-thresholds = <0x5314 0x25e3>; + qcom,jeita-hard-thresholds = <0x58cd 0x20b8>; + qcom,jeita-soft-hys-thresholds = <0x4f5e 0x2943>; + qcom,jeita-soft-fcc-ua = <0x2625a0 0x2625a0>; + qcom,jeita-soft-fv-uv = <0x40d990 0x40d990>; + + qcom,fcc1-temp-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xd62 0xdbf 0xdfd 0xe1d 0xe2e>; + }; + + qcom,fcc2-temp-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xdda 0xdf8 0xe02 0xe04 0xdff 0xdff>; + }; + + qcom,pc-temp-v1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa846 0xa903 0xa965 0xa982 0xa987 0xa757 0xa82c 0xa88b 0xa8b2 0xa8bc 0xa671 0xa747 0xa7a8 0xa7d4 0xa7e5 0xa598 0xa65f 0xa6c5 0xa6f2 0xa707 0xa4ca 0xa582 0xa5e5 0xa611 0xa627 0xa3ff 0xa4af 0xa508 0xa531 0xa546 0xa330 0xa3e1 0xa430 0xa452 0xa465 0xa25d 0xa311 0xa35c 0xa377 0xa387 0xa1a0 0xa23e 0xa287 0xa29e 0xa2ad 0xa10a 0xa17a 0xa1b1 0xa1c4 0xa1d2 0xa07e 0xa0e5 0xa0f6 0xa0f5 0xa0fc 0x9fa9 0xa061 0xa067 0xa048 0xa036 0x9e4b 0x9f9a 0x9fd6 0x9fae 0x9f81 0x9cdb 0x9e3d 0x9ee8 0x9ee6 0x9ebf 0x9bed 0x9cd1 0x9d85 0x9dc6 0x9dd7 0x9b4d 0x9bf5 0x9c67 0x9cb4 0x9cf4 0x9ad6 0x9b65 0x9bd6 0x9c18 0x9c4a 0x9a75 0x9af5 0x9b63 0x9baa 0x9bc5 0x9a1f 0x9a9b 0x9ade 0x9b13 0x9b23 0x99c4 0x9a41 0x9a3f 0x9a2d 0x9a41 0x9962 0x99c6 0x998a 0x9943 0x9959 0x98fd 0x992a 0x98b8 0x9892 0x98a0 0x9894 0x9882 0x97f4 0x9800 0x9807 0x982b 0x97c6 0x976f 0x9780 0x9781 0x97cb 0x9713 0x970f 0x970c 0x970c 0x9775 0x9697 0x96b5 0x96a2 0x96a2 0x9724 0x963e 0x965a 0x9642 0x963e 0x96db 0x95fa 0x9603 0x95e9 0x95e1 0x9698 0x95c7 0x95b7 0x9598 0x958b 0x965b 0x959d 0x9571 0x954e 0x953b 0x9627 0x9575 0x9533 0x950c 0x94f4 0x95f8 0x9550 0x94fe 0x94d1 0x94b3 0x95cc 0x952e 0x94cf 0x949b 0x947a 0x95a2 0x9511 0x94a4 0x9465 0x9440 0x9579 0x94f7 0x947f 0x9432 0x9407 0x954f 0x94d6 0x9458 0x93fe 0x93cc 0x9525 0x94b2 0x942f 0x93c6 0x938b 0x94f0 0x9484 0x9402 0x938b 0x9345 0x94a6 0x943e 0x93bf 0x9343 0x92f7 0x944c 0x93da 0x935f 0x92ed 0x92a2 0x93e6 0x936c 0x92f1 0x9288 0x923f 0x936b 0x92f1 0x9276 0x920e 0x91c6 0x92e1 0x926f 0x91f1 0x9188 0x9141 0x9248 0x91ea 0x9165 0x90ff 0x90bc 0x91cf 0x9176 0x9100 0x909b 0x905b 0x9179 0x9129 0x90c1 0x9060 0x9022 0x9159 0x910e 0x90ab 0x904f 0x9011 0x913e 0x90f9 0x909a 0x903f 0x9001 0x911a 0x90de 0x907f 0x9020 0x8fdd 0x90ac 0x9070 0x8ff7 0x8f74 0x8f1a 0x8f68 0x8f1c 0x8e9e 0x8e14 0x8db6 0x8d9d 0x8d55 0x8cd8 0x8c4c 0x8beb 0x8b59 0x8b10 0x8a94 0x8a02 0x899f 0x8849 0x87fb 0x877d 0x86e5 0x867d 0x836c 0x8325 0x82aa 0x8209 0x8197 0x7530 0x7530 0x7530 0x7530 0x7530>; + }; + + qcom,pc-temp-v2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa98d 0xa97e 0xa974 0xa960 0xa92e 0xa910 0xa7fb 0xa83a 0xa854 0xa856 0xa82f 0xa819 0xa6a3 0xa712 0xa747 0xa757 0xa738 0xa728 0xa594 0xa609 0xa64d 0xa665 0xa64a 0xa63c 0xa4c7 0xa51d 0xa566 0xa581 0xa565 0xa558 0xa3f4 0xa43e 0xa489 0xa4a2 0xa484 0xa478 0xa2af 0xa364 0xa3b3 0xa3c8 0xa3a5 0xa397 0xa162 0xa292 0xa2e4 0xa2f3 0xa2ca 0xa2b9 0xa11a 0xa1c1 0xa210 0xa21b 0xa1ef 0xa1de 0xa14f 0xa0ea 0xa131 0xa139 0xa110 0xa103 0xa17a 0xa03c 0xa071 0xa077 0xa047 0xa035 0xa046 0x9fd6 0x9ff5 0x9ff5 0x9fb3 0x9f87 0x9d6d 0x9f7f 0x9f85 0x9f81 0x9f2b 0x9ee2 0x9b88 0x9eab 0x9ea9 0x9ead 0x9e5e 0x9e1a 0x9a81 0x9c78 0x9cde 0x9d1e 0x9d16 0x9d22 0x99b8 0x9a96 0x9b46 0x9bd5 0x9bfe 0x9c3f 0x9913 0x99e8 0x9a78 0x9b4d 0x9b70 0x9b9c 0x9887 0x9977 0x99df 0x9aeb 0x9b04 0x9b0e 0x97f7 0x98f2 0x9948 0x9a53 0x9a64 0x9a58 0x975c 0x9856 0x98b5 0x9965 0x9971 0x9967 0x96c8 0x97b8 0x9827 0x987f 0x9885 0x9883 0x9649 0x9720 0x9799 0x97d3 0x97d8 0x97d6 0x95d8 0x968d 0x9711 0x9743 0x9748 0x9745 0x957d 0x9608 0x9697 0x96c6 0x96cb 0x96c8 0x9533 0x9591 0x9629 0x9658 0x965c 0x9658 0x94f4 0x952a 0x95c3 0x95f3 0x95f6 0x95f1 0x94bc 0x94d6 0x9565 0x9595 0x9598 0x9592 0x948a 0x9491 0x950e 0x953e 0x9540 0x9538 0x9458 0x9459 0x94bd 0x94f0 0x94ef 0x94e6 0x9429 0x942b 0x9471 0x94aa 0x94a5 0x949b 0x93fa 0x9403 0x942c 0x9467 0x9461 0x9456 0x93cb 0x93dc 0x93ed 0x9426 0x9422 0x9418 0x939a 0x93b7 0x93b6 0x93e7 0x93e7 0x93dd 0x9366 0x9390 0x9384 0x93a6 0x93a1 0x9392 0x9330 0x9367 0x935a 0x9364 0x9348 0x932b 0x92f5 0x933c 0x9330 0x9322 0x92ea 0x92bd 0x92b6 0x9309 0x9301 0x92e2 0x9296 0x925d 0x9274 0x92ce 0x92cf 0x92a2 0x9248 0x9208 0x922d 0x9289 0x9294 0x925e 0x91fe 0x91bc 0x91e4 0x9235 0x924a 0x9214 0x91b6 0x9173 0x919a 0x91d4 0x91f2 0x91c0 0x9166 0x9124 0x9151 0x916d 0x918d 0x9158 0x9101 0x90c0 0x910a 0x9104 0x9119 0x90da 0x9085 0x9045 0x90be 0x90a5 0x90a4 0x9064 0x9011 0x8fd4 0x9066 0x9055 0x9058 0x9026 0x8fde 0x8fa3 0x8ff1 0x9009 0x9027 0x900b 0x8fc1 0x8f87 0x8fa0 0x8fd7 0x9010 0x8ff6 0x8fb0 0x8f76 0x8f3a 0x8f9b 0x8ff2 0x8fd7 0x8f94 0x8f5b 0x8e9d 0x8f3c 0x8fa7 0x8f84 0x8f3f 0x8efc 0x8dbc 0x8e73 0x8ecd 0x8e86 0x8e46 0x8df2 0x8c72 0x8d0b 0x8d41 0x8ce7 0x8ca5 0x8c4f 0x8a95 0x8b0d 0x8b2a 0x8ad3 0x8a9a 0x8a45 0x87f8 0x8865 0x887d 0x881c 0x87ec 0x879d 0x841a 0x8496 0x84d3 0x8488 0x847e 0x8426 0x7eca 0x7f24 0x801b 0x8028 0x7f97 0x7ef0 0x6fcb 0x6e6e 0x6d71 0x6d74 0x6d50 0x6d1a>; + }; + + qcom,pc-temp-z1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x38d1 0x33b6 0x2f09 0x2da0 0x2d49 0x38bb 0x337f 0x2f0d 0x2d9e 0x2d52 0x38c3 0x3376 0x2f0b 0x2da5 0x2d5c 0x38c7 0x337e 0x2f07 0x2da7 0x2d60 0x38d3 0x3382 0x2f03 0x2da8 0x2d62 0x38eb 0x337d 0x2f01 0x2da8 0x2d64 0x38ff 0x336c 0x2f02 0x2da9 0x2d67 0x38f6 0x335e 0x2f03 0x2dac 0x2d6a 0x38d7 0x335d 0x2f05 0x2dae 0x2d6d 0x38b6 0x3362 0x2f09 0x2db1 0x2d6f 0x3896 0x3360 0x2f0d 0x2db5 0x2d72 0x3874 0x334e 0x2f0f 0x2db8 0x2d77 0x3843 0x333c 0x2f0f 0x2dbb 0x2d7b 0x3810 0x332e 0x2f0b 0x2dbb 0x2d7c 0x37ee 0x3328 0x2f04 0x2db9 0x2d7c 0x37d3 0x3329 0x2f01 0x2db7 0x2d7c 0x37b6 0x3329 0x2f04 0x2dbb 0x2d7f 0x3792 0x332c 0x2f0a 0x2dc2 0x2d85 0x3772 0x3337 0x2f14 0x2dc9 0x2d8b 0x3765 0x3349 0x2f21 0x2dce 0x2d8f 0x3763 0x335e 0x2f2c 0x2dd3 0x2d93 0x376a 0x3374 0x2f35 0x2dd8 0x2d98 0x3773 0x3384 0x2f3d 0x2ddd 0x2d9c 0x377f 0x338b 0x2f45 0x2de1 0x2da1 0x3787 0x3391 0x2f4d 0x2de7 0x2da6 0x378c 0x339a 0x2f54 0x2dec 0x2daa 0x378f 0x33a6 0x2f5b 0x2df0 0x2daf 0x3794 0x33ad 0x2f62 0x2df4 0x2db3 0x379f 0x33b2 0x2f69 0x2df8 0x2db7 0x37af 0x33ba 0x2f6f 0x2dfc 0x2dbb 0x37c7 0x33c2 0x2f75 0x2e00 0x2dbf 0x37de 0x33c9 0x2f7a 0x2e04 0x2dc4 0x37e6 0x33d1 0x2f80 0x2e08 0x2dc8 0x37ea 0x33de 0x2f86 0x2e0d 0x2dcd 0x37f0 0x33f1 0x2f8e 0x2e12 0x2dd1 0x3807 0x3403 0x2f95 0x2e17 0x2dd5 0x383b 0x3415 0x2f9d 0x2e1a 0x2dd8 0x386b 0x3422 0x2fa5 0x2e1c 0x2dda 0x3891 0x3427 0x2faa 0x2e1f 0x2ddc 0x38b0 0x3429 0x2fad 0x2e21 0x2ddd 0x38b2 0x342d 0x2fb1 0x2e23 0x2dde 0x3888 0x3439 0x2fb9 0x2e25 0x2de0 0x3873 0x3448 0x2fbf 0x2e27 0x2de1 0x386e 0x3457 0x2fc0 0x2e28 0x2de2 0x3861 0x3449 0x2fc4 0x2e29 0x2de2 0x386f 0x3454 0x2fc7 0x2e2b 0x2de2 0x3869 0x3454 0x2fc8 0x2e2b 0x2de1 0x3868 0x345b 0x2fc9 0x2e2b 0x2de2 0x385f 0x3457 0x2fcf 0x2e2c 0x2de3 0x387c 0x3452 0x2fd1 0x2e30 0x2de6 0x3886 0x346f 0x2fdb 0x2e36 0x2deb 0x38aa 0x3476 0x2ff3 0x2e3f 0x2df0 0x3895 0x349e 0x3007 0x2e4a 0x2dfa 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06>; + }; + + qcom,pc-temp-z2-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2bb8 0x2632 0x2811 0x296b 0x2a9e 0x280d 0x2a3d 0x2824 0x28fa 0x293e 0x25fe 0x2926 0x282f 0x28bc 0x28c4 0x2606 0x274d 0x282a 0x28ad 0x28ac 0x2620 0x26d2 0x281d 0x2898 0x28a6 0x262f 0x26c3 0x2815 0x288c 0x28a4 0x2631 0x26b5 0x2811 0x2887 0x28a8 0x262c 0x26aa 0x2812 0x2882 0x28ac 0x2625 0x26a2 0x2816 0x2880 0x28ac 0x261b 0x269c 0x2819 0x2884 0x28b5 0x2612 0x2698 0x2813 0x2887 0x28cc 0x2616 0x2696 0x27f3 0x288e 0x28d4 0x2626 0x2699 0x27d7 0x28ae 0x28d3 0x262c 0x26a7 0x27e8 0x28bd 0x28d4 0x2618 0x26b3 0x2814 0x289f 0x28d2 0x25f5 0x26b6 0x282a 0x2883 0x28c7 0x25e5 0x26ba 0x2827 0x288f 0x28d1 0x25e1 0x26c3 0x281d 0x28b2 0x290a 0x25dd 0x26dd 0x2837 0x28e1 0x2937 0x25d6 0x26fd 0x2894 0x2931 0x293f 0x25c9 0x271e 0x28ce 0x296a 0x293f 0x25be 0x2742 0x28b3 0x2939 0x2923 0x25b7 0x2760 0x2883 0x28bd 0x28ee 0x25b1 0x2775 0x2863 0x288b 0x28cc 0x259f 0x2784 0x284c 0x289e 0x28b4 0x2574 0x278c 0x283f 0x28b6 0x28a5 0x2552 0x2793 0x283c 0x28a9 0x28a6 0x2544 0x2797 0x283d 0x2890 0x28af 0x250b 0x2796 0x2845 0x2888 0x28ba 0x24d2 0x2793 0x2859 0x2888 0x28cd 0x24c0 0x2792 0x286f 0x288c 0x28e8 0x24b3 0x2793 0x2885 0x289f 0x290a 0x24aa 0x2795 0x289c 0x28c5 0x2934 0x24a2 0x2799 0x28b4 0x28ea 0x2962 0x249c 0x27a2 0x28ce 0x290a 0x299b 0x2498 0x27aa 0x28df 0x2925 0x29c7 0x249e 0x27b2 0x28e4 0x293c 0x29d8 0x24a4 0x27b7 0x28e7 0x2954 0x29e2 0x24ad 0x27bb 0x28ef 0x2961 0x29ed 0x24b6 0x27c0 0x28fb 0x2964 0x29f9 0x24b5 0x27c2 0x2901 0x2965 0x2a01 0x24a8 0x27b9 0x28fa 0x2971 0x2a03 0x24a4 0x279c 0x28f3 0x2981 0x2a07 0x24aa 0x26ec 0x28f1 0x2987 0x2a1d 0x246c 0x26c6 0x28d6 0x2992 0x2a3b 0x2459 0x26cc 0x28c6 0x29ad 0x2a38 0x2447 0x26dc 0x28df 0x29c9 0x2a6a 0x2449 0x26cd 0x293d 0x29ca 0x2a89 0x243a 0x26ed 0x297e 0x2a06 0x2aa5 0x243e 0x26c3 0x2925 0x29d7 0x2a55 0x2464 0x269c 0x28de 0x298a 0x29c5 0x246e 0x264f 0x28b9 0x2971 0x29af 0x2445 0x25fc 0x289b 0x2927 0x295f 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904>; + }; + + qcom,pc-temp-z3-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4c45 0x4be7 0x4bad 0x4bb7 0x4b9b 0x4d48 0x4c26 0x4bd0 0x4baa 0x4b96 0x4dd0 0x4c76 0x4bee 0x4bac 0x4b97 0x4de1 0x4cc3 0x4bfa 0x4bb4 0x4b9c 0x4dce 0x4cd9 0x4bff 0x4bb6 0x4b9f 0x4db7 0x4cdc 0x4c00 0x4bb7 0x4ba2 0x4dac 0x4cdd 0x4bfe 0x4bb5 0x4ba2 0x4da7 0x4cdd 0x4bfb 0x4bb0 0x4b9f 0x4da5 0x4ce0 0x4bf8 0x4bac 0x4b9b 0x4da2 0x4ce2 0x4bf6 0x4bac 0x4b99 0x4da0 0x4cd4 0x4bf0 0x4bac 0x4b98 0x4da5 0x4cac 0x4bdf 0x4ba7 0x4b98 0x4db6 0x4c9a 0x4bc8 0x4b9b 0x4b95 0x4dc5 0x4cb6 0x4bce 0x4b96 0x4b91 0x4db4 0x4cd7 0x4bef 0x4ba3 0x4b93 0x4d83 0x4cd1 0x4c01 0x4bb3 0x4b97 0x4d54 0x4cac 0x4bec 0x4bad 0x4b94 0x4d30 0x4c8a 0x4bd0 0x4b9c 0x4b8a 0x4d0e 0x4c6f 0x4bcf 0x4b98 0x4b87 0x4cf1 0x4c5e 0x4be1 0x4ba6 0x4b8e 0x4cd8 0x4c62 0x4bee 0x4bb3 0x4b97 0x4cc6 0x4c75 0x4bef 0x4bb3 0x4b9d 0x4cbc 0x4c87 0x4bef 0x4bae 0x4ba1 0x4cb4 0x4c93 0x4bed 0x4bad 0x4ba2 0x4cac 0x4c9c 0x4bea 0x4bb4 0x4ba0 0x4ca3 0x4c9d 0x4be9 0x4bba 0x4b9e 0x4c97 0x4c9b 0x4bef 0x4bb7 0x4b9c 0x4c8c 0x4c97 0x4bf5 0x4bb2 0x4b9a 0x4c7f 0x4c91 0x4bf6 0x4bae 0x4b98 0x4c6f 0x4c8a 0x4bf4 0x4ba9 0x4b96 0x4c5d 0x4c84 0x4bf2 0x4ba5 0x4b94 0x4c4a 0x4c7f 0x4bef 0x4ba2 0x4b91 0x4c3a 0x4c7a 0x4bea 0x4ba0 0x4b8e 0x4c2b 0x4c73 0x4be7 0x4b9f 0x4b8a 0x4c1e 0x4c6b 0x4be5 0x4b9e 0x4b86 0x4c17 0x4c65 0x4be2 0x4b9e 0x4b84 0x4c1b 0x4c5f 0x4bde 0x4b9e 0x4b84 0x4c23 0x4c5a 0x4bda 0x4b9d 0x4b86 0x4c39 0x4c56 0x4bd7 0x4b9c 0x4b86 0x4c4f 0x4c53 0x4bd6 0x4b97 0x4b83 0x4c46 0x4c4f 0x4bd4 0x4b93 0x4b81 0x4c28 0x4c4a 0x4bd2 0x4b93 0x4b82 0x4c1b 0x4c3f 0x4bd0 0x4b93 0x4b82 0x4c19 0x4bfb 0x4bcc 0x4b93 0x4b83 0x4bac 0x4bb3 0x4bb6 0x4b90 0x4b7f 0x4b91 0x4b94 0x4ba0 0x4b89 0x4b78 0x4b89 0x4b8c 0x4b9e 0x4b80 0x4b70 0x4b8b 0x4b87 0x4b8e 0x4b7e 0x4b70 0x4b74 0x4b76 0x4b83 0x4b7c 0x4b6d 0x4b78 0x4b75 0x4b98 0x4b87 0x4b7c 0x4bab 0x4b91 0x4b9b 0x4b8b 0x4b83 0x4bda 0x4b96 0x4b9d 0x4b8e 0x4b84 0x4bf2 0x4b94 0x4b99 0x4b92 0x4b87 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c>; + }; + + qcom,pc-temp-z4-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4001 0x3c8d 0x3a72 0x3978 0x397b 0x40ed 0x3c83 0x3a6f 0x39c6 0x39b9 0x40da 0x3c60 0x3a4a 0x39d2 0x39c2 0x4086 0x3c0a 0x3a21 0x39c0 0x39b5 0x4000 0x3ba1 0x39fb 0x39a7 0x399e 0x3f71 0x3b4a 0x39dc 0x3990 0x3986 0x3ef7 0x3b02 0x39c2 0x3981 0x3976 0x3e89 0x3acb 0x39ac 0x3976 0x396c 0x3e16 0x3aa0 0x39a0 0x3970 0x3966 0x3d82 0x3a79 0x399a 0x396d 0x3961 0x3cf4 0x3a50 0x3998 0x396a 0x395d 0x3cc5 0x3a2f 0x3998 0x3965 0x3959 0x3cdb 0x3a29 0x3999 0x395f 0x3951 0x3cf0 0x3a35 0x399d 0x3961 0x394e 0x3cc2 0x3a3c 0x39a2 0x3970 0x395b 0x3c4c 0x3a29 0x39a0 0x397b 0x3968 0x3beb 0x39fe 0x398c 0x396b 0x395e 0x3bb2 0x39dd 0x3979 0x394d 0x3947 0x3b8d 0x39c9 0x3978 0x394f 0x3946 0x3b7e 0x39bd 0x3982 0x3988 0x3974 0x3b75 0x39bc 0x3996 0x39ba 0x39a6 0x3b71 0x39bf 0x39ca 0x39be 0x39ab 0x3b75 0x39c9 0x39fe 0x39b9 0x399f 0x3b7b 0x39fa 0x39fe 0x39ae 0x3991 0x3b80 0x3a38 0x39df 0x3993 0x3982 0x3b85 0x3a46 0x39bf 0x397d 0x3975 0x3b8c 0x3a43 0x39a7 0x3973 0x396c 0x3b92 0x3a3e 0x3994 0x396e 0x3965 0x3b9e 0x3a2f 0x3989 0x3969 0x395f 0x3bab 0x3a18 0x3982 0x3965 0x395a 0x3bb3 0x3a05 0x397d 0x3962 0x3955 0x3bba 0x39f5 0x397b 0x395e 0x3951 0x3bbe 0x39e5 0x397a 0x395a 0x394e 0x3bbc 0x39d6 0x3979 0x395a 0x394d 0x3bb5 0x39c8 0x3979 0x395c 0x3950 0x3ba1 0x39ba 0x3978 0x395e 0x3955 0x3b72 0x39ac 0x3976 0x3961 0x395b 0x3b43 0x39a1 0x3973 0x3963 0x3961 0x3afc 0x399e 0x3970 0x3963 0x3963 0x3abc 0x399c 0x396d 0x3963 0x3960 0x3ab4 0x3999 0x396a 0x3962 0x395d 0x3abb 0x3994 0x3967 0x3960 0x395c 0x3ab9 0x3995 0x3962 0x395d 0x395b 0x3aa3 0x39d0 0x395a 0x3959 0x3958 0x3abd 0x39eb 0x3957 0x394b 0x394c 0x3ac6 0x39f6 0x3953 0x3935 0x3934 0x3acb 0x39f8 0x394d 0x3931 0x392d 0x3ac3 0x39fa 0x3959 0x3929 0x3920 0x3ad0 0x3a03 0x3961 0x3925 0x391e 0x3ac0 0x39ff 0x394e 0x392e 0x392c 0x3a9b 0x39f7 0x3956 0x3935 0x3930 0x3a8e 0x39fe 0x3959 0x3936 0x3935 0x3a94 0x3a0e 0x3963 0x3937 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936>; + }; + + qcom,pc-temp-z5-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2b3c 0x2daa 0x3498 0x4a8d 0x45cc 0x2ef0 0x3052 0x39fb 0x4721 0x484e 0x3117 0x343d 0x3f9f 0x4802 0x4a61 0x31df 0x385f 0x430e 0x4b83 0x4d9f 0x326a 0x3a69 0x44ec 0x4e02 0x5124 0x32f3 0x3bab 0x4673 0x5049 0x55e1 0x33c6 0x3ce5 0x4810 0x514c 0x5936 0x34d0 0x3e95 0x49be 0x511b 0x5a23 0x35db 0x4119 0x4b35 0x5160 0x5a1d 0x36fa 0x4312 0x4c4c 0x5327 0x5b6b 0x3859 0x42b6 0x4bad 0x5424 0x5e2c 0x3a2d 0x3f5c 0x45e6 0x5167 0x6138 0x3c44 0x3ed3 0x3ee4 0x49ed 0x6100 0x3d63 0x47a6 0x4250 0x472f 0x5e7d 0x3d9a 0x506d 0x5049 0x50b3 0x5f98 0x3db5 0x5016 0x57f1 0x5c40 0x639a 0x3dda 0x4c6d 0x532f 0x5d14 0x64bc 0x3dd6 0x4a75 0x4bb9 0x59b9 0x646c 0x3d86 0x49e6 0x55e6 0x5b90 0x6454 0x3cdc 0x49b6 0x76e4 0x6b24 0x646b 0x3bcd 0x5034 0x875d 0x7705 0x6492 0x3ad1 0x649b 0x78a4 0x6a60 0x5e9c 0x3a04 0x7968 0x6282 0x5014 0x511e 0x3939 0x8c1a 0x56c4 0x4873 0x4bc7 0x3846 0x9a39 0x4fd8 0x5026 0x4d8e 0x3716 0x9aa6 0x4dfb 0x5780 0x5074 0x35e9 0x91df 0x53c1 0x5aa0 0x53ba 0x34ed 0x87db 0x5d83 0x5d20 0x57f1 0x33ea 0x7eb5 0x65eb 0x5e8b 0x5cc6 0x32dd 0x764e 0x6eb9 0x601d 0x628a 0x31ca 0x720c 0x75c6 0x61b9 0x67fc 0x30bf 0x6fd5 0x79eb 0x63f1 0x6c9c 0x2ffa 0x6e15 0x7d26 0x6810 0x7085 0x2f5e 0x6c28 0x8068 0x6dc5 0x7165 0x2ed6 0x6a83 0x83d1 0x7653 0x6fdc 0x2e78 0x6a47 0x8529 0x7b5b 0x6e81 0x2ea9 0x6b32 0x8003 0x7adf 0x6f61 0x2f11 0x6ca0 0x7890 0x796f 0x710e 0x303e 0x6e9b 0x7749 0x7672 0x709c 0x317f 0x7119 0x77a9 0x6cad 0x6a94 0x3162 0x71bd 0x77df 0x65cc 0x65f5 0x300b 0x6c45 0x7771 0x66c4 0x66af 0x2fb0 0x60cd 0x7669 0x680b 0x6789 0x3015 0x4018 0x70b0 0x6813 0x6600 0x2ca4 0x3328 0x596b 0x6764 0x62b7 0x2bbe 0x3022 0x477d 0x6688 0x6215 0x2b68 0x2f70 0x4725 0x57da 0x5967 0x2b6c 0x2f09 0x3dd8 0x58e5 0x64be 0x2ab7 0x2db9 0x398d 0x5bd2 0x6460 0x2ae0 0x2ded 0x457f 0x6bcd 0x75c0 0x2cb0 0x2ff3 0x438f 0x6311 0x7110 0x2d80 0x2fa5 0x439f 0x6129 0x668d 0x2d89 0x2ebe 0x3ec3 0x61e3 0x62ca 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005>; + }; + + qcom,pc-temp-z6-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x409a 0x3c2e 0x39dd 0x392f 0x3913 0x416d 0x3c48 0x39ee 0x394b 0x392d 0x419b 0x3c57 0x39ee 0x3952 0x3933 0x4181 0x3c50 0x39e4 0x394f 0x3931 0x413b 0x3c33 0x39d5 0x3947 0x392a 0x40e4 0x3c0c 0x39c7 0x393d 0x3921 0x409c 0x3be5 0x39bb 0x3935 0x391b 0x4062 0x3bcb 0x39b0 0x392e 0x3915 0x4027 0x3bb9 0x39aa 0x392a 0x3910 0x3fe0 0x3ba7 0x39a7 0x3929 0x390e 0x3f9a 0x3b8a 0x39a3 0x3928 0x390c 0x3f73 0x3b64 0x399a 0x3924 0x390b 0x3f65 0x3b56 0x398e 0x391c 0x3906 0x3f55 0x3b62 0x3992 0x3919 0x3903 0x3f1e 0x3b70 0x39a4 0x3927 0x390a 0x3ec0 0x3b64 0x39ac 0x3933 0x3912 0x3e70 0x3b3f 0x3999 0x392a 0x390c 0x3e3a 0x3b22 0x3982 0x3915 0x38fe 0x3e0f 0x3b10 0x3982 0x3914 0x38fc 0x3df2 0x3b06 0x3991 0x3936 0x3915 0x3ddc 0x3b09 0x39a5 0x3953 0x3930 0x3dd2 0x3b19 0x39c1 0x3956 0x3934 0x3dd2 0x3b2e 0x39d7 0x3953 0x3934 0x3dd7 0x3b4e 0x39d6 0x394f 0x3932 0x3ddc 0x3b6d 0x39c9 0x3948 0x392b 0x3de1 0x3b75 0x39be 0x3942 0x3924 0x3de6 0x3b75 0x39b8 0x393d 0x391f 0x3dea 0x3b74 0x39b4 0x3938 0x391c 0x3dee 0x3b6e 0x39b1 0x3935 0x3919 0x3df0 0x3b64 0x39ae 0x3931 0x3916 0x3df0 0x3b5c 0x39ab 0x392e 0x3913 0x3df0 0x3b54 0x39a9 0x392b 0x3910 0x3def 0x3b4c 0x39a8 0x3928 0x390d 0x3ded 0x3b46 0x39a7 0x3928 0x390c 0x3deb 0x3b40 0x39a7 0x3929 0x390c 0x3deb 0x3b3c 0x39a6 0x392a 0x390c 0x3ded 0x3b38 0x39a4 0x392c 0x390f 0x3def 0x3b35 0x39a2 0x392d 0x3913 0x3def 0x3b35 0x39a0 0x392d 0x3914 0x3dee 0x3b36 0x399f 0x392a 0x3912 0x3deb 0x3b36 0x399e 0x3928 0x3910 0x3de2 0x3b35 0x399d 0x3927 0x3910 0x3dd8 0x3b34 0x399b 0x3927 0x390f 0x3dcd 0x3b2c 0x3997 0x3926 0x390f 0x3da1 0x3b16 0x398b 0x391d 0x3908 0x3d94 0x3b10 0x397f 0x3911 0x38f9 0x3d93 0x3b0a 0x397c 0x390a 0x38f2 0x3d8f 0x3b0c 0x3979 0x3906 0x38ec 0x3d8d 0x3b07 0x3977 0x3903 0x38ea 0x3d95 0x3b0c 0x397c 0x390d 0x38f8 0x3da1 0x3b20 0x3983 0x3914 0x38ff 0x3dbd 0x3b30 0x398c 0x3918 0x3902 0x3de0 0x3b45 0x3993 0x391d 0x3906 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d>; + }; + + qcom,pc-temp-y1-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1dae 0x1a6c 0x17b7 0x1540 0x1467 0x143b 0x1db4 0x1a6f 0x17c3 0x153f 0x1466 0x143d 0x1dc0 0x1a74 0x17ca 0x153e 0x1466 0x143e 0x1dcd 0x1a7a 0x17ce 0x153c 0x1466 0x1440 0x1dd8 0x1a7e 0x17d0 0x153b 0x1467 0x1441 0x1ddd 0x1a80 0x17d0 0x153a 0x1467 0x1443 0x1ddc 0x1a80 0x17cc 0x153a 0x1468 0x1443 0x1dda 0x1a80 0x17c6 0x153a 0x146a 0x1444 0x1dd3 0x1a7d 0x17c5 0x153b 0x146c 0x1445 0x1dbc 0x1a76 0x17c8 0x153c 0x146d 0x1446 0x1daa 0x1a70 0x17ca 0x153d 0x146f 0x1448 0x1db3 0x1a6e 0x17c6 0x153d 0x1470 0x1449 0x1dc8 0x1a6f 0x17c0 0x153d 0x1472 0x144b 0x1ddc 0x1a74 0x17c1 0x153e 0x1474 0x144d 0x1df4 0x1a85 0x17d0 0x1545 0x1479 0x1452 0x1e03 0x1a97 0x17db 0x154d 0x147c 0x1454 0x1dfa 0x1aa4 0x17df 0x154f 0x147c 0x1455 0x1de7 0x1aaf 0x17e3 0x1552 0x147d 0x1455 0x1dd8 0x1ab0 0x17e4 0x1554 0x147e 0x1456 0x1dca 0x1aa1 0x17e2 0x1555 0x1480 0x1459 0x1dc3 0x1a95 0x17e2 0x1558 0x1483 0x145c 0x1dd6 0x1a97 0x17ed 0x155c 0x1487 0x1460 0x1df9 0x1a9f 0x17fb 0x1560 0x148b 0x1463 0x1e01 0x1aa5 0x17fd 0x1565 0x148e 0x1467 0x1e00 0x1aa8 0x17f8 0x1569 0x1491 0x146a 0x1e04 0x1aac 0x17f7 0x156d 0x1493 0x146e 0x1e09 0x1ab8 0x1800 0x1571 0x1496 0x1472 0x1e0c 0x1acc 0x180b 0x1576 0x149a 0x1475 0x1e0a 0x1ad7 0x180e 0x157b 0x149d 0x1478 0x1df8 0x1adc 0x1812 0x1581 0x14a0 0x147a 0x1de0 0x1ade 0x1817 0x1586 0x14a3 0x147d 0x1dd9 0x1adb 0x181b 0x158b 0x14a7 0x1480 0x1ddb 0x1ad7 0x181f 0x1590 0x14aa 0x1484 0x1ddd 0x1ad7 0x1820 0x1593 0x14ad 0x1487 0x1de1 0x1ad5 0x1821 0x1596 0x14b0 0x1489 0x1de8 0x1ad3 0x1823 0x1599 0x14b2 0x148b 0x1df7 0x1adf 0x1827 0x159b 0x14b4 0x148c 0x1e0a 0x1aef 0x182c 0x159d 0x14b5 0x148d 0x1e0d 0x1aef 0x1831 0x159e 0x14b5 0x148e 0x1dff 0x1ae3 0x1835 0x159f 0x14b6 0x148e 0x1df5 0x1adf 0x183a 0x15a1 0x14b7 0x148f 0x1df6 0x1ae5 0x1841 0x15a5 0x14b9 0x1491 0x1df6 0x1aeb 0x184c 0x15a8 0x14ba 0x1492 0x1df6 0x1af2 0x1849 0x15aa 0x14bb 0x1493 0x1dfa 0x1af8 0x1850 0x15af 0x14be 0x1495 0x1e04 0x1b0b 0x1850 0x15b1 0x14be 0x1496 0x1e09 0x1b08 0x1859 0x15b4 0x14be 0x1496 0x1e26 0x1b0e 0x1863 0x15b4 0x14be 0x1496 0x1e37 0x1b0b 0x186b 0x15b6 0x14bf 0x1496 0x1e2c 0x1b1e 0x1867 0x15b9 0x14c2 0x1498 0x1e29 0x1b3f 0x1879 0x15c2 0x14c5 0x149b 0x1e38 0x1b5b 0x1895 0x15d1 0x14cc 0x14a0 0x1e61 0x1b5f 0x18a8 0x15e4 0x14d3 0x14a6 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac>; + }; + + qcom,pc-temp-y2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x25d6 0x28a1 0x29b8 0x2b2a 0x2b60 0x2c89 0x2638 0x287f 0x299b 0x2b15 0x2b62 0x2c51 0x2674 0x286a 0x297a 0x2afb 0x2b61 0x2bfc 0x2693 0x285f 0x2959 0x2ade 0x2b5e 0x2ba2 0x269f 0x285b 0x293d 0x2abd 0x2b58 0x2b5a 0x26a2 0x285a 0x292b 0x2a9a 0x2b51 0x2b3c 0x266c 0x2867 0x2922 0x2a6d 0x2b48 0x2b43 0x260b 0x287d 0x291b 0x2a3f 0x2b3b 0x2b4e 0x25f2 0x2878 0x2916 0x2a29 0x2b28 0x2b4d 0x25fe 0x283e 0x2912 0x2a1c 0x2b09 0x2b3a 0x2615 0x2814 0x2910 0x2a13 0x2ae5 0x2b24 0x2698 0x2862 0x291a 0x2a04 0x2ab6 0x2afb 0x2784 0x28ea 0x2933 0x29f0 0x2a85 0x2ac3 0x27ba 0x2909 0x295a 0x29f2 0x2a7a 0x2abc 0x26d8 0x28f6 0x29a8 0x2a1d 0x2a90 0x2af0 0x2601 0x28e9 0x29e0 0x2a53 0x2ab0 0x2b19 0x25e5 0x28ff 0x29fa 0x2a91 0x2aec 0x2b1b 0x25de 0x2924 0x2a0e 0x2ad0 0x2b33 0x2b18 0x25d8 0x292d 0x2a1d 0x2aef 0x2b47 0x2b23 0x25d2 0x292c 0x2a2b 0x2afc 0x2b48 0x2b59 0x25cd 0x2929 0x2a36 0x2b0a 0x2b4a 0x2b9b 0x25ca 0x28f3 0x2a3f 0x2b29 0x2b78 0x2bd9 0x25c8 0x2849 0x2a48 0x2b54 0x2bc0 0x2c13 0x25c6 0x27d1 0x2a4b 0x2b74 0x2be2 0x2c3d 0x25c3 0x275f 0x2a50 0x2b8f 0x2bf6 0x2c5c 0x25c0 0x271c 0x2a54 0x2ba1 0x2c07 0x2c71 0x25bf 0x270e 0x2a52 0x2bac 0x2c19 0x2c83 0x25be 0x2700 0x2a4a 0x2bb0 0x2c2d 0x2c96 0x25bd 0x26ed 0x2a46 0x2ba7 0x2c35 0x2cb5 0x25bc 0x26d4 0x2a44 0x2b8e 0x2c41 0x2cec 0x25bb 0x26b9 0x2a3f 0x2b80 0x2c4d 0x2d11 0x25bb 0x26a1 0x29e9 0x2b83 0x2c40 0x2d02 0x25ba 0x268b 0x294e 0x2b8f 0x2c2f 0x2cda 0x25b9 0x2672 0x290b 0x2b9c 0x2c33 0x2cca 0x25b8 0x2655 0x28fa 0x2b99 0x2c39 0x2cd1 0x25b8 0x263a 0x28ee 0x2b84 0x2c35 0x2cd6 0x25b7 0x2622 0x28e6 0x2b68 0x2c34 0x2cdc 0x25b7 0x2604 0x290b 0x2b59 0x2c39 0x2ce8 0x25b6 0x25ec 0x293c 0x2b5f 0x2c3b 0x2ce7 0x25b6 0x25de 0x291d 0x2b60 0x2c36 0x2cd1 0x25b6 0x25d4 0x28ba 0x2b5f 0x2c32 0x2cc5 0x25b6 0x25cb 0x289c 0x2b62 0x2c34 0x2ccc 0x25b6 0x25c4 0x28a6 0x2b5d 0x2c32 0x2ccf 0x25b5 0x25be 0x281b 0x2b46 0x2c13 0x2cc8 0x25b5 0x25bb 0x27d7 0x2b34 0x2c13 0x2cb0 0x25b5 0x25bb 0x27c4 0x2b11 0x2c20 0x2c82 0x25b5 0x25ba 0x2810 0x2b0d 0x2c0a 0x2c51 0x25b5 0x25b9 0x2851 0x2b23 0x2be8 0x2c48 0x25b5 0x25b8 0x2853 0x2b28 0x2bef 0x2c50 0x25b4 0x25b8 0x2837 0x2ae6 0x2c1e 0x2c3a 0x25b4 0x25b6 0x2800 0x2acc 0x2bf7 0x2bfd 0x25b4 0x25b5 0x27bc 0x2aa1 0x2b7e 0x2ba7 0x25b4 0x25b4 0x2786 0x2a49 0x2b0f 0x2b35 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a>; + }; + + qcom,pc-temp-y3-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x347a 0x3456 0x3421 0x33e5 0x33e0 0x33d8 0x356b 0x345f 0x341a 0x33e4 0x33e0 0x33da 0x35ff 0x346c 0x3416 0x33e3 0x33e0 0x33db 0x364d 0x3479 0x3416 0x33e3 0x33e0 0x33dd 0x366b 0x3484 0x3418 0x33e3 0x33e0 0x33de 0x3670 0x3489 0x341c 0x33e5 0x33e0 0x33de 0x35ec 0x3489 0x3423 0x33e8 0x33e0 0x33de 0x34fc 0x3488 0x342b 0x33ed 0x33e1 0x33de 0x34bb 0x348b 0x342e 0x33ef 0x33e1 0x33de 0x34ba 0x349e 0x342f 0x33f0 0x33e1 0x33dd 0x34bb 0x34ac 0x3430 0x33f0 0x33e1 0x33dd 0x34d3 0x349e 0x343d 0x33f7 0x33e4 0x33df 0x3504 0x3481 0x3450 0x3401 0x33e9 0x33e2 0x3510 0x3471 0x3451 0x3402 0x33ea 0x33e3 0x34ec 0x3468 0x343b 0x33fe 0x33e8 0x33e2 0x34cc 0x3462 0x3427 0x33fb 0x33e6 0x33e2 0x34d0 0x345f 0x3422 0x33fd 0x33e8 0x33e2 0x34e0 0x345d 0x341f 0x3401 0x33ec 0x33e3 0x34e7 0x345a 0x341b 0x3401 0x33ec 0x33e3 0x34e9 0x3455 0x3416 0x33f9 0x33e7 0x33e0 0x34ea 0x344f 0x3411 0x33f0 0x33e3 0x33dd 0x34ec 0x3445 0x340c 0x33e8 0x33e1 0x33dc 0x34f0 0x3435 0x3407 0x33e3 0x33e0 0x33db 0x34f5 0x3427 0x3406 0x33e2 0x33df 0x33db 0x3500 0x341c 0x3405 0x33e3 0x33de 0x33db 0x3512 0x3417 0x3405 0x33e4 0x33de 0x33da 0x3525 0x3418 0x3405 0x33e3 0x33de 0x33da 0x3539 0x341b 0x3405 0x33e3 0x33dd 0x33da 0x354f 0x341f 0x3405 0x33e5 0x33dd 0x33da 0x356b 0x3423 0x3405 0x33e9 0x33dd 0x33d9 0x358d 0x3428 0x3405 0x33ec 0x33dd 0x33d9 0x35b2 0x342d 0x3400 0x33ed 0x33de 0x33d9 0x35da 0x3434 0x33f9 0x33ec 0x33de 0x33da 0x360a 0x343c 0x33f6 0x33ec 0x33df 0x33da 0x3641 0x3449 0x33f7 0x33ea 0x33de 0x33da 0x3680 0x3458 0x33f8 0x33e8 0x33de 0x33d9 0x36c1 0x3468 0x33fb 0x33e6 0x33de 0x33d9 0x3702 0x347a 0x3402 0x33e4 0x33dd 0x33d9 0x3742 0x3490 0x3408 0x33e3 0x33dd 0x33d9 0x3781 0x34b0 0x340c 0x33e3 0x33dd 0x33d9 0x37c1 0x34dc 0x340f 0x33e3 0x33dd 0x33d9 0x3803 0x3511 0x3415 0x33e3 0x33de 0x33da 0x3845 0x3550 0x341e 0x33e3 0x33de 0x33da 0x3892 0x35a3 0x3421 0x33e4 0x33de 0x33da 0x38ea 0x3613 0x3429 0x33e3 0x33de 0x33da 0x390d 0x3642 0x3430 0x33eb 0x33df 0x33dc 0x393f 0x363e 0x3435 0x33ec 0x33e1 0x33dd 0x395c 0x3658 0x3442 0x33f0 0x33e3 0x33e0 0x398d 0x36b9 0x3451 0x33f2 0x33e2 0x33e0 0x3a0b 0x3718 0x3452 0x33ee 0x33e1 0x33dd 0x3a97 0x37a6 0x345a 0x33f0 0x33e0 0x33dd 0x3b31 0x3888 0x346f 0x33f5 0x33e3 0x33e1 0x3c10 0x3978 0x3492 0x33f9 0x33e6 0x33e4 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6>; + }; + + qcom,pc-temp-y4-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x45b5 0x41d2 0x40f2 0x406d 0x4045 0x4044 0x452b 0x41db 0x40ef 0x4073 0x4045 0x4042 0x44eb 0x41eb 0x40ef 0x4078 0x4047 0x4041 0x44e9 0x4200 0x40f2 0x407b 0x4048 0x4040 0x4515 0x421b 0x40f7 0x407d 0x404a 0x4040 0x4561 0x4239 0x40fe 0x407e 0x404b 0x4040 0x4627 0x4263 0x4106 0x407c 0x404d 0x4041 0x478b 0x428e 0x4111 0x407a 0x404e 0x4044 0x4914 0x42a4 0x411c 0x407a 0x4051 0x4046 0x4b24 0x42ad 0x4127 0x4081 0x4055 0x4049 0x4c74 0x42bc 0x4138 0x408c 0x405b 0x404d 0x4a3e 0x4407 0x419f 0x409e 0x4069 0x4059 0x4560 0x4626 0x4237 0x40b4 0x407d 0x4068 0x437a 0x4642 0x4251 0x40bd 0x4081 0x406c 0x4347 0x43a8 0x4203 0x40bf 0x407d 0x406b 0x432d 0x41b1 0x41aa 0x40c3 0x407b 0x406a 0x4320 0x41b5 0x416e 0x40ec 0x4091 0x407a 0x430d 0x41e2 0x413b 0x4129 0x40ba 0x4098 0x42ef 0x41ed 0x4117 0x412a 0x40c0 0x409d 0x42b4 0x41c5 0x40fa 0x40d1 0x4094 0x407d 0x4274 0x4198 0x40e3 0x4085 0x4066 0x405b 0x4249 0x4180 0x40d4 0x4078 0x4054 0x404d 0x4228 0x416e 0x40c8 0x4072 0x4049 0x4043 0x421f 0x416b 0x40c2 0x406f 0x4048 0x4042 0x4223 0x415f 0x40be 0x406b 0x4048 0x4042 0x422b 0x414f 0x40bb 0x4069 0x4049 0x4043 0x4231 0x4143 0x40ba 0x406b 0x404b 0x4045 0x423b 0x4137 0x40ba 0x406d 0x404e 0x4048 0x4246 0x4136 0x40b9 0x406e 0x4051 0x404c 0x4252 0x4142 0x40b4 0x4070 0x4057 0x4051 0x425e 0x4154 0x40b0 0x4072 0x405e 0x4058 0x426a 0x4167 0x40b4 0x4074 0x4068 0x4063 0x4276 0x417f 0x40bd 0x4076 0x4073 0x4070 0x4283 0x4198 0x40c4 0x4074 0x4075 0x4072 0x4290 0x41b2 0x40c9 0x4069 0x4064 0x4061 0x429c 0x41cd 0x40cd 0x405e 0x404f 0x404c 0x42a8 0x41ef 0x40d2 0x405b 0x4044 0x4043 0x42b5 0x421f 0x40d8 0x4059 0x403e 0x403f 0x42c7 0x4244 0x40dc 0x405a 0x403e 0x4040 0x42e1 0x4252 0x40e9 0x405d 0x4042 0x4045 0x4308 0x425c 0x40fd 0x4060 0x4047 0x404a 0x433b 0x4262 0x410c 0x4063 0x4048 0x404b 0x437e 0x4270 0x4118 0x4064 0x4046 0x4048 0x43d3 0x4287 0x4129 0x4061 0x403d 0x403b 0x442a 0x42c2 0x4147 0x406b 0x4041 0x403e 0x441b 0x42ef 0x4160 0x4075 0x4057 0x405a 0x441e 0x4307 0x4166 0x4084 0x4070 0x4078 0x43ed 0x432a 0x4193 0x40a2 0x4099 0x40a2 0x43d0 0x436e 0x41e6 0x40be 0x409c 0x4098 0x43e5 0x4383 0x41de 0x409e 0x406e 0x4064 0x43f6 0x4384 0x41d8 0x409e 0x4060 0x4059 0x4411 0x43a0 0x41fb 0x40bd 0x4070 0x4067 0x4463 0x43f1 0x4266 0x40fb 0x4090 0x4085 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118>; + }; + + qcom,pc-temp-y5-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2208 0x348a 0x3ab0 0x3545 0x4573 0x3634 0x2208 0x34aa 0x3839 0x3326 0x4393 0x3e82 0x269f 0x34e2 0x3660 0x31db 0x419b 0x43da 0x2f8b 0x3522 0x3519 0x3130 0x3fbf 0x46e0 0x3428 0x3557 0x345a 0x30f0 0x3e34 0x4838 0x3590 0x3572 0x341a 0x30e7 0x3d2f 0x4884 0x30ee 0x3576 0x34b3 0x32d3 0x3ca4 0x46c7 0x2869 0x3578 0x35a4 0x35e5 0x3c3f 0x4385 0x267f 0x34b6 0x35c2 0x3648 0x3b81 0x4119 0x2a54 0x3032 0x3545 0x34d0 0x3996 0x3e92 0x2ff6 0x2cf8 0x3494 0x33cf 0x387f 0x3ce5 0x37e1 0x2fd6 0x333d 0x3525 0x3964 0x3cfd 0x4112 0x360e 0x319c 0x3768 0x3acb 0x3dbd 0x4280 0x3a64 0x326c 0x37dc 0x3b0d 0x3dbf 0x373b 0x3dd4 0x395e 0x3745 0x3a7a 0x3cb2 0x2cf9 0x3f72 0x3eca 0x36d1 0x3a41 0x3bb0 0x2d03 0x3ec5 0x3f83 0x384b 0x3ae8 0x3b5d 0x2edc 0x3dc2 0x3fc3 0x3b9d 0x3c38 0x3b2b 0x2f8c 0x3d9a 0x3f92 0x3dc7 0x3e57 0x3b93 0x2f1e 0x3df3 0x3ecf 0x3f34 0x4225 0x3e9f 0x2e5c 0x3e54 0x3de6 0x3fc8 0x445b 0x4233 0x2d64 0x3c6d 0x3c08 0x3c17 0x4527 0x44e0 0x2c30 0x3697 0x3971 0x3578 0x4604 0x471b 0x2b6b 0x3248 0x38a0 0x33d2 0x4627 0x47ff 0x2b06 0x2f1a 0x38d8 0x353a 0x4512 0x484d 0x2ad4 0x2d6f 0x3925 0x3660 0x43d2 0x484f 0x2add 0x2d4c 0x3975 0x3678 0x4315 0x4790 0x2aec 0x2d55 0x39cc 0x366c 0x4294 0x45bc 0x2af3 0x2d44 0x3a34 0x38ed 0x427b 0x43ff 0x2b16 0x2d12 0x3b09 0x40ee 0x4270 0x426f 0x2b4e 0x2d07 0x3ba6 0x465a 0x4280 0x41aa 0x2b80 0x2d07 0x38cb 0x47e5 0x43ef 0x42bb 0x2ba9 0x2cec 0x3382 0x48db 0x472c 0x45f6 0x2bd0 0x2ce9 0x319e 0x48b8 0x4a98 0x495f 0x2bf8 0x2d41 0x31a4 0x45bb 0x4e8c 0x4c69 0x2c20 0x2daa 0x31b5 0x4185 0x51da 0x4ea9 0x2c45 0x2dd9 0x3221 0x3e14 0x52fb 0x508e 0x2c64 0x2d8a 0x34af 0x3aee 0x5257 0x524a 0x2c6c 0x2d32 0x3713 0x3918 0x50bc 0x5292 0x2c5a 0x2d52 0x36de 0x38bf 0x4e90 0x50e7 0x2c45 0x2d99 0x34f7 0x3913 0x4dbc 0x4f8f 0x2c53 0x2da9 0x354f 0x3906 0x4ea8 0x5136 0x2cb7 0x2d71 0x370b 0x3898 0x515e 0x56c7 0x2d6c 0x2d2c 0x33cd 0x3962 0x555b 0x5c52 0x2e6e 0x2cc8 0x325a 0x3610 0x4cc2 0x4ea4 0x2fc4 0x2d10 0x320a 0x3e49 0x4394 0x4373 0x30b0 0x2d1b 0x3431 0x3e08 0x42cc 0x40b6 0x322c 0x2e86 0x370e 0x4092 0x40be 0x3f21 0x3256 0x3099 0x3915 0x3fe1 0x3e27 0x3e5b 0x322c 0x3127 0x38b1 0x3e5f 0x428d 0x410e 0x3117 0x3039 0x38e1 0x4283 0x4414 0x4431 0x2f77 0x2f18 0x37f8 0x4528 0x4741 0x4a06 0x2e6f 0x2e5e 0x37ca 0x4396 0x477b 0x4ab1 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b>; + }; + + qcom,pc-temp-y6-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1af4 0x1607 0x1492 0x13c9 0x139d 0x1392 0x1afb 0x160e 0x148d 0x13c8 0x139d 0x1393 0x1aff 0x1616 0x148a 0x13c7 0x139d 0x1394 0x1aff 0x161e 0x148a 0x13c8 0x139d 0x1395 0x1afc 0x1626 0x148c 0x13c9 0x139e 0x1395 0x1af7 0x162e 0x148e 0x13ca 0x139f 0x1396 0x1ac7 0x1636 0x1494 0x13cc 0x139f 0x1397 0x1a78 0x163e 0x149c 0x13cf 0x13a1 0x1397 0x1a74 0x1646 0x14a1 0x13d2 0x13a2 0x1398 0x1aff 0x164c 0x14a3 0x13d4 0x13a3 0x1399 0x1b70 0x1657 0x14a8 0x13d7 0x13a5 0x139a 0x1af4 0x16ac 0x14cc 0x13e2 0x13ac 0x139f 0x19d3 0x172c 0x1503 0x13ef 0x13b5 0x13a6 0x1941 0x172c 0x150b 0x13f2 0x13b7 0x13a8 0x190e 0x1670 0x14e5 0x13f1 0x13b5 0x13a7 0x18f6 0x15e2 0x14be 0x13f0 0x13b3 0x13a7 0x18fb 0x15e4 0x14ab 0x13fd 0x13bb 0x13ac 0x1909 0x15f5 0x149c 0x1412 0x13c9 0x13b5 0x190d 0x15f9 0x148f 0x1412 0x13cb 0x13b7 0x190c 0x15ed 0x1483 0x13f3 0x13bb 0x13ab 0x190a 0x15e0 0x147a 0x13d6 0x13ab 0x139f 0x190d 0x15d6 0x1473 0x13cd 0x13a4 0x139a 0x191a 0x15ce 0x146e 0x13c8 0x13a1 0x1397 0x192c 0x15c9 0x146d 0x13c7 0x13a0 0x1397 0x1945 0x15c7 0x146e 0x13c7 0x13a0 0x1397 0x1964 0x15c6 0x146f 0x13c8 0x13a0 0x1398 0x1982 0x15cb 0x1470 0x13c9 0x13a1 0x1398 0x19a0 0x15d5 0x1473 0x13ca 0x13a2 0x1399 0x19c0 0x15e2 0x1475 0x13cc 0x13a3 0x139a 0x19e6 0x15f3 0x1476 0x13d0 0x13a5 0x139c 0x1a11 0x1607 0x1477 0x13d4 0x13a7 0x139e 0x1a3f 0x161d 0x1478 0x13d6 0x13ab 0x13a2 0x1a72 0x1638 0x1479 0x13d7 0x13af 0x13a6 0x1aa7 0x1655 0x147b 0x13d6 0x13b0 0x13a7 0x1ae0 0x1676 0x147f 0x13d2 0x13ab 0x13a2 0x1b1c 0x169b 0x1483 0x13ce 0x13a5 0x139c 0x1b59 0x16c6 0x1488 0x13cc 0x13a2 0x139a 0x1b96 0x16f8 0x1490 0x13cb 0x13a0 0x1398 0x1bd4 0x1732 0x149a 0x13ca 0x13a0 0x1399 0x1c13 0x1772 0x14a5 0x13cb 0x13a1 0x139a 0x1c51 0x17bc 0x14b0 0x13cd 0x13a3 0x139c 0x1c90 0x1811 0x14bf 0x13ce 0x13a4 0x139d 0x1cd3 0x1875 0x14d0 0x13cf 0x13a3 0x139c 0x1d22 0x18ef 0x14e0 0x13d0 0x13a1 0x1399 0x1d80 0x1984 0x14f9 0x13d2 0x13a3 0x139a 0x1da5 0x19b9 0x150c 0x13db 0x13a9 0x13a3 0x1dcf 0x19c4 0x1513 0x13e1 0x13b2 0x13ad 0x1dde 0x19e7 0x152f 0x13ec 0x13bf 0x13bb 0x1e04 0x1a57 0x155a 0x13f6 0x13c0 0x13b8 0x1e6d 0x1abf 0x1560 0x13eb 0x13b2 0x13a7 0x1edf 0x1b41 0x1573 0x13ee 0x13ae 0x13a5 0x1f66 0x1c0d 0x15ab 0x13fd 0x13b6 0x13ac 0x2034 0x1cdf 0x160e 0x1415 0x13c2 0x13b7 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4>; + }; + }; + }; + }; + }; + + fragment@12 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm1 { + reg = <0x4f>; + label = "pa_therm1"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@13 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x4d 0xffffffff 0x4e 0xffffffff 0x4f 0xffffffff 0x52>; + + pa_therm1 { + reg = <0x4f>; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + }; + }; + }; + + fragment@14 { + target = <0xffffffff>; + + __overlay__ { + compatible = "qcom,ufs-phy-qmp-v3"; + vdda-phy-supply = <0xffffffff>; + vdda-pll-supply = <0xffffffff>; + vdda-phy-max-microamp = <0xf5b4>; + vdda-pll-max-microamp = <0x477c>; + status = "ok"; + }; + }; + + fragment@15 { + target = <0xffffffff>; + + __overlay__ { + vdd-hba-supply = <0xffffffff>; + vdd-hba-fixed-regulator; + vcc-supply = <0xffffffff>; + vcc-voltage-level = <0x2d2a80 0x2d2a80>; + vcc-max-microamp = <0x927c0>; + vccq2-supply = <0xffffffff>; + vccq2-voltage-level = <0x1ab3f0 0x1dc130>; + vccq2-max-microamp = <0x927c0>; + qcom,vddp-ref-clk-supply = <0xffffffff>; + qcom,vddp-ref-clk-max-microamp = <0x64>; + status = "ok"; + }; + }; + + fragment@16 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0x8b290>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <0x1b7740 0x1b7740>; + qcom,vdd-io-current-level = <0x0 0x4f588>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + status = "ok"; + }; + }; + + fragment@17 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0xc3500>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-voltage-level = <0x1b7740 0x2d0370>; + qcom,vdd-io-current-level = <0x0 0x55f0>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + cd-gpios = <0xffffffff 0x45 0x1>; + status = "ok"; + }; + }; + + fragment@18 { + target = <0xffffffff>; + + __overlay__ { + + pa-therm1 { + polling-delay-passive = <0x0>; + polling-delay = <0x0>; + thermal-governor = "user_space"; + thermal-sensors = <0xffffffff 0x4f>; + wake-capable-sensor; + + trips { + + active-config0 { + temperature = <0x1e848>; + hysteresis = <0x3e8>; + type = "passive"; + }; + }; + }; + + quiet-therm-step { + status = "disabled"; + }; + }; + }; + + fragment@19 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@20 { + target = <0xffffffff>; + + __overlay__ { + qcom,battery-data = <0x14>; + qcom,qg-iterm-ma = <0x64>; + qcom,hold-soc-while-full; + qcom,linearize-soc; + qcom,cl-feedback-on; + }; + }; + + fragment@21 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x8 0xffffffff 0x7 0xffffffff 0x9 0xffffffff 0x6 0xffffffff 0x4f 0xffffffff 0x99 0xffffffff 0x83>; + io-channel-names = "usb_in_voltage", "usb_in_current", "chg_temp", "die_temp", "conn_temp", "sbux_res", "vph_voltage"; + qcom,battery-data = <0x14>; + qcom,auto-recharge-soc = <0x62>; + qcom,step-charging-enable; + qcom,sw-jeita-enable; + qcom,fcc-stepping-enable; + qcom,suspend-input-on-debug-batt; + qcom,sec-charger-config = <0x3>; + qcom,thermal-mitigation = <0x401640 0x3567e0 0x2dc6c0 0x2625a0 0x1e8480 0x16e360 0xf4240 0x7a120>; + dpdm-supply = <0xffffffff>; + qcom,charger-temp-max = <0x320>; + qcom,smb-temp-max = <0x320>; + qcom,fcc-step-delay-ms = <0x64>; + qcom,fcc-step-size-ua = <0x186a0>; + qcom,disable-sw-thermal-regulation; + qcom,disable-fcc-restriction; + qcom,smb-internal-pull-kohm = <0x0>; + }; + }; + + fragment@22 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + }; + }; + }; + + fragment@23 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@24 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,i2c-touch-active = "synaptics,tcm-i2c"; + + synaptics_tcm@20 { + compatible = "synaptics,tcm-i2c"; + reg = <0x20>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend", "pmx_ts_release"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + pinctrl-2 = <0xffffffff>; + vdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + synaptics,pwr-reg-name = "avdd"; + synaptics,bus-reg-name = "vdd"; + synaptics,irq-gpio = <0xffffffff 0x9 0x2008>; + synaptics,irq-on-state = <0x0>; + synaptics,reset-gpio = <0xffffffff 0x8 0x0>; + synaptics,reset-on-state = <0x0>; + synaptics,reset-active-ms = <0x14>; + synaptics,reset-delay-ms = <0xc8>; + synaptics,power-delay-ms = <0xc8>; + synaptics,ubl-i2c-addr = <0x20>; + }; + + atmel_mxt_ts@4a { + compatible = "atmel,maxtouch"; + reg = <0x4a>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + avdd-supply = <0xffffffff>; + vdd-supply = <0xffffffff>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + reset-gpios = <0xffffffff 0x8 0x0>; + irq-gpios = <0xffffffff 0x9 0x2008>; + atmel,xy_switch; + atmel,panel-coords = <0x0 0x0 0x1df 0x31f>; + atmel,display-coords = <0x0 0x0 0x153 0x301>; + }; + }; + }; + + fragment@25 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,clk-freq-out = <0xf4240>; + #address-cells = <0x1>; + #size-cells = <0x0>; + + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <0xffffffff 0x25 0x0>; + qcom,nq-ven = <0xffffffff 0xc 0x0>; + qcom,nq-firm = <0xffffffff 0x24 0x0>; + qcom,nq-clkreq = <0xffffffff 0x1f 0x0>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff>; + }; + }; + }; + + fragment@26 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-aux-switch = <0xffffffff>; + }; + }; + + fragment@27 { + target = <0xffffffff>; + + __overlay__ { + + lpi_pinctrl@627C0000 { + compatible = "qcom,lpi-pinctrl"; + reg = <0x627c0000 0x0>; + qcom,num-gpios = <0xf>; + gpio-controller; + #gpio-cells = <0x2>; + qcom,slew-reg = <0x6295a000 0x0>; + qcom,lpi-offset-tbl = <0x0 0x1000 0x2000 0x3000 0x4000 0x5000 0x6000 0x7000 0x8000 0x9000 0xa000 0xb000 0xc000 0xd000 0xe000>; + qcom,lpi-slew-offset-tbl = <0x0 0x2 0x4 0x8 0xa 0xc 0x0 0x0 0x0 0x0 0x10 0x12 0x0 0x0 0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + phandle = <0x32>; + + dmic01_clk_active { + phandle = <0x33>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic01_clk_sleep { + phandle = <0x35>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic01_data_active { + phandle = <0x34>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic01_data_sleep { + phandle = <0x36>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic23_clk_active { + phandle = <0x37>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic23_clk_sleep { + phandle = <0x39>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic23_data_active { + phandle = <0x38>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic23_data_sleep { + phandle = <0x3a>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic45_clk_active { + phandle = <0x3b>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic45_clk_sleep { + phandle = <0x3d>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic45_data_active { + phandle = <0x3c>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic45_data_sleep { + phandle = <0x3e>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + tx_swr_clk_sleep { + phandle = <0x4b>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_clk_active { + phandle = <0x47>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + tx_swr_data0_sleep { + phandle = <0x4c>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data0_active { + phandle = <0x48>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_sleep { + phandle = <0x41>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_active { + phandle = <0x3f>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_data_sleep { + phandle = <0x42>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_data_active { + phandle = <0x40>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data1_sleep { + phandle = <0x4d>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data1_active { + phandle = <0x49>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data2_sleep { + phandle = <0x4e>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data2_active { + phandle = <0x4a>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + rx_swr_clk_sleep { + phandle = <0x45>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_clk_active { + phandle = <0x43>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + rx_swr_data_sleep { + phandle = <0x46>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_data_active { + phandle = <0x44>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + lpi_i2s1_sck_active { + phandle = <0x55>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sck_sleep { + phandle = <0x59>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_ws_active { + phandle = <0x56>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_ws_sleep { + phandle = <0x5a>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd0_active { + phandle = <0x57>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd0_sleep { + phandle = <0x5b>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd1_active { + phandle = <0x58>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd1_sleep { + phandle = <0x5c>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + }; + + fragment@28 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x4>; + + bolero-clk-rsc-mngr { + compatible = "qcom,bolero-clk-rsc-mngr"; + qcom,fs-gen-sequence = <0x3000 0x1 0x3004 0x1 0x3080 0x2>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,va_mclk_mode_muxsel = <0x627a0000>; + clock-names = "tx_core_clk", "tx_npl_clk", "rx_core_clk", "rx_npl_clk", "wsa_core_clk", "wsa_npl_clk", "va_core_clk", "va_npl_clk"; + clocks = <0x15 0x0 0x16 0x0 0x17 0x0 0x18 0x0 0x19 0x0 0x1a 0x0 0x1b 0x0 0x1c 0x0>; + }; + + tx-macro@62620000 { + compatible = "qcom,tx-macro"; + reg = <0x62620000 0x0>; + clock-names = "tx_core_clk", "tx_npl_clk"; + clocks = <0x15 0x0 0x16 0x0>; + qcom,tx-swr-gpios = <0x1d>; + qcom,tx-dmic-sample-rate = <0x249f00>; + phandle = <0xb2>; + + tx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x3>; + swrm-io-base = <0x62630000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x1>; + interrupts = <0x0 0x128 0x0 0x0 0x22b 0x0>; + interrupt-names = "swr_master_irq", "swr_wake_irq"; + qcom,swr-wakeup-required = <0x0>; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x21 0xf 0x2 0x12 0x1 0x2 0x13 0x2 0x3 0x14 0x1 0x3 0x15 0x2 0x4 0x16 0x1 0x4 0x17 0x2 0x4 0x18 0x4 0x4 0x19 0x8 0x5 0x1a 0x1 0x5 0x1b 0x2 0x5 0x1c 0x4 0x5 0x1d 0x8>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + qcom,swr-mstr-irq-wakeup-capable = <0x1>; + phandle = <0xb3>; + + wcd938x-tx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170223>; + phandle = <0x24>; + }; + + wcd937x-tx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170223>; + phandle = <0x28>; + }; + }; + }; + + rx-macro@62600000 { + compatible = "qcom,rx-macro"; + reg = <0x62600000 0x0>; + clock-names = "rx_core_clk", "rx_npl_clk"; + clocks = <0x17 0x0 0x18 0x0>; + qcom,rx-swr-gpios = <0x1e>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,rx-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + phandle = <0xb4>; + + rx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x2>; + swrm-io-base = <0x62610000 0x0>; + interrupts = <0x0 0x129 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x9 0x1 0x1 0xa 0x2 0x2 0xd 0x1 0x3 0xb 0x1 0x3 0xc 0x2 0x4 0xe 0x1 0x5 0xf 0x1 0x5 0x10 0x2>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + phandle = <0xb5>; + + wcd938x-rx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170224>; + phandle = <0x23>; + }; + + wcd937x-rx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170224>; + phandle = <0x27>; + }; + }; + }; + + wsa-macro@62640000 { + compatible = "qcom,wsa-macro"; + reg = <0x62640000 0x0>; + clock-names = "wsa_core_clk", "wsa_npl_clk"; + clocks = <0x19 0x0 0x1a 0x0>; + qcom,wsa-swr-gpios = <0x1f>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,wsa-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + status = "disabled"; + phandle = <0xb6>; + + wsa_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + qcom,swr_master_id = <0x1>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + swrm-io-base = <0x62650000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x0>; + interrupts = <0x0 0x127 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x8>; + qcom,swr-port-mapping = <0x1 0x1 0x1 0x2 0x3 0xf 0x3 0x2 0x3 0x4 0x5 0x1 0x5 0x7 0xf 0x6 0x6 0x3 0x7 0x4 0x3 0x8 0x8 0x3>; + qcom,swr-num-dev = <0x2>; + phandle = <0xb7>; + + wsa881x@20170211 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170211>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2d>; + }; + + wsa881x@20170212 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170212>; + qcom,spkr-sd-n-node = <0x21>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2e>; + }; + + wsa881x@21170213 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170213>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2f>; + }; + + wsa881x@21170214 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170214>; + qcom,spkr-sd-n-node = <0x21>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x30>; + }; + }; + }; + + va-macro@62770000 { + compatible = "qcom,va-macro"; + reg = <0x62770000 0x0>; + clock-names = "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0>; + qcom,va-clk-mux-select = <0x1>; + qcom,va-island-mode-muxsel = <0x627a0000>; + qcom,va-dmic-sample-rate = <0x927c0>; + qcom,default-clk-id = <0x0>; + phandle = <0xb8>; + }; + + wcd938x-codec { + compatible = "qcom,wcd938x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x0 0x13 0x2 0x0 0x13 0x1 0x14 0x1 0x0 0x14 0x1 0x15 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x2 0x18 0x4 0x0 0x18 0x2 0x19 0x8 0x0 0x19 0x3 0x1a 0x1 0x0 0x1a 0x3 0x1b 0x2 0x0 0x1b 0x3 0x1c 0x4 0x0 0x1c 0x3 0x1d 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x22>; + qcom,rx-slave = <0x23>; + qcom,tx-slave = <0x24>; + cdc-vdd-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-rxtx-current = <0x7530>; + cdc-vddio-supply = <0xffffffff>; + qcom,cdc-vddio-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddio-current = <0x7530>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0xaf0>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-micbias4-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-rxtx", "cdc-vddio", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + mbhc-button-thres = <0x25 0xd 0x3f 0x25 0x58 0x8a 0x25 0x8a 0x8a 0x25 0xe1 0xe1 0x25 0x1c2 0x1c2 0x25 0x1c2 0x26c 0x25 0x1c2 0x26c 0x25 0x1c2 0x26c>; + imp-table = <0x26 0x0 0x5 0x6 0x26 0x6 0x17 0x8 0x26 0x18 0x26 0x7 0x26 0x27 0x64 0x6 0x26 0x65 0xa0 0xa 0x26 0xa1 0x190 0xb 0x26 0x191 0x7d0 0xb 0x26 0x7d1 0x7fffffff 0x6>; + phandle = <0x31>; + }; + + wcd937x-codec { + status = "disabled"; + compatible = "qcom,wcd937x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x1 0x13 0x1 0x0 0x14 0x1 0x14 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x3 0x18 0x1 0x0 0x1a 0x3 0x19 0x2 0x0 0x1b 0x3 0x1a 0x4 0x0 0x1c 0x3 0x1b 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x22>; + qcom,rx-slave = <0x27>; + qcom,tx-slave = <0x28>; + cdc-vdd-ldo-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-ldo-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-ldo-rxtx-current = <0x61a8>; + cdc-vddpx-1-supply = <0xffffffff>; + qcom,cdc-vddpx-1-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddpx-1-current = <0x2710>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0x708>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-ldo-rxtx", "cdc-vddpx-1", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + phandle = <0xb9>; + }; + }; + }; + + fragment@29 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,msm-mi2s-master = <0x1 0x1 0x1 0x1 0x1 0x1>; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS4", "MIC BIAS4", "Analog Mic4", "TX DMIC0", "MIC BIAS1", "MIC BIAS1", "Digital Mic0", "TX DMIC1", "MIC BIAS1", "MIC BIAS1", "Digital Mic1", "TX DMIC2", "MIC BIAS3", "MIC BIAS3", "Digital Mic2", "TX DMIC3", "MIC BIAS3", "MIC BIAS3", "Digital Mic3", "TX DMIC4", "MIC BIAS4", "MIC BIAS4", "Digital Mic4", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "IN3_AUX", "AUX_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "TX SWR_DMIC0", "DMIC1_OUTPUT", "TX SWR_DMIC1", "DMIC2_OUTPUT", "TX SWR_DMIC2", "DMIC3_OUTPUT", "TX SWR_DMIC3", "DMIC4_OUTPUT", "TX SWR_DMIC4", "DMIC5_OUTPUT", "TX SWR_DMIC5", "DMIC6_OUTPUT", "TX SWR_DMIC6", "DMIC7_OUTPUT", "TX SWR_DMIC7", "DMIC8_OUTPUT", "WSA SRC0_INP", "SRC0", "WSA_TX DEC0_INP", "TX DEC0 MUX", "WSA_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "SpkrLeft IN", "WSA_SPK1 OUT", "SpkrRight IN", "WSA_SPK2 OUT", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA MIC BIAS1", "Digital Mic0", "VA MIC BIAS1", "Digital Mic1", "VA MIC BIAS3", "Digital Mic2", "VA MIC BIAS3", "Digital Mic3", "VA MIC BIAS4", "Digital Mic4", "VA DMIC0", "VA MIC BIAS1", "VA DMIC1", "VA MIC BIAS1", "VA DMIC2", "VA MIC BIAS3", "VA DMIC3", "VA MIC BIAS3", "VA DMIC4", "VA MIC BIAS4", "VA SWR_ADC0", "VA_SWR_CLK", "VA SWR_ADC1", "VA_SWR_CLK", "VA SWR_ADC2", "VA_SWR_CLK", "VA SWR_ADC3", "VA_SWR_CLK", "VA SWR_MIC0", "VA_SWR_CLK", "VA SWR_MIC1", "VA_SWR_CLK", "VA SWR_MIC2", "VA_SWR_CLK", "VA SWR_MIC3", "VA_SWR_CLK", "VA SWR_MIC4", "VA_SWR_CLK", "VA SWR_MIC5", "VA_SWR_CLK", "VA SWR_MIC6", "VA_SWR_CLK", "VA SWR_MIC7", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT", "VA SWR_MIC0", "DMIC1_OUTPUT", "VA SWR_MIC1", "DMIC2_OUTPUT", "VA SWR_MIC2", "DMIC3_OUTPUT", "VA SWR_MIC3", "DMIC4_OUTPUT", "VA SWR_MIC4", "DMIC5_OUTPUT", "VA SWR_MIC5", "DMIC6_OUTPUT", "VA SWR_MIC6", "DMIC7_OUTPUT", "VA SWR_MIC7", "DMIC8_OUTPUT"; + qcom,msm-mbhc-hphl-swh = <0x1>; + qcom,msm-mbhc-gnd-swh = <0x1>; + qcom,cdc-dmic01-gpios = <0x29>; + qcom,cdc-dmic23-gpios = <0x2a>; + qcom,cdc-dmic45-gpios = <0x2b>; + asoc-codec = <0xffffffff 0xffffffff 0x2c>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec", "msm-ext-disp-audio-codec-rx"; + qcom,wsa-max-devs = <0x2>; + qcom,wsa-devs = <0x2d 0x2e 0x2f 0x30>; + qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight", "SpkrLeft", "SpkrRight"; + qcom,codec-max-aux-devs = <0x1>; + qcom,codec-aux-devs = <0x31>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x32 0xffffffff>; + }; + }; + + fragment@30 { + target = <0xffffffff>; + + __overlay__ { + + cdc_dmic01_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x33 0x34>; + pinctrl-1 = <0x35 0x36>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x29>; + }; + + cdc_dmic23_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x37 0x38>; + pinctrl-1 = <0x39 0x3a>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2a>; + }; + + cdc_dmic45_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3b 0x3c>; + pinctrl-1 = <0x3d 0x3e>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2b>; + }; + + wsa_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3f 0x40>; + pinctrl-1 = <0x41 0x42>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x1f>; + }; + + rx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x43 0x44>; + pinctrl-1 = <0x45 0x46>; + qcom,lpi-gpios; + phandle = <0x1e>; + }; + + tx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x47 0x48 0x49 0x4a>; + pinctrl-1 = <0x4b 0x4c 0x4d 0x4e>; + qcom,lpi-gpios; + qcom,chip-wakeup-reg = <0x1ffb000>; + qcom,chip-wakeup-maskbit = <0x0>; + qcom,chip-wakeup-default-val = <0x1>; + phandle = <0x1d>; + }; + }; + }; + + fragment@31 { + target = <0xffffffff>; + + __overlay__ { + + wsa_spkr_en1_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x20>; + }; + + wsa_spkr_en2_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x21>; + }; + + msm_cdc_pinctrl@58 { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + phandle = <0x22>; + }; + + wsa_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x3>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x309>; + #clock-cells = <0x1>; + phandle = <0x19>; + }; + + wsa_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x4>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30a>; + #clock-cells = <0x1>; + phandle = <0x1a>; + }; + + rx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x5>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30e>; + #clock-cells = <0x1>; + phandle = <0x17>; + }; + + rx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x6>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30f>; + #clock-cells = <0x1>; + phandle = <0x18>; + }; + + tx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x7>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30c>; + #clock-cells = <0x1>; + phandle = <0x15>; + }; + + tx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x8>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30d>; + #clock-cells = <0x1>; + phandle = <0x16>; + }; + + va_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x2>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30b>; + #clock-cells = <0x1>; + phandle = <0x1b>; + }; + + va_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0xa>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x310>; + #clock-cells = <0x1>; + phandle = <0x1c>; + }; + }; + }; + + fragment@32 { + target = <0xffffffff>; + + __overlay__ { + qcom,msm-dai-is-island-supported = <0x1>; + }; + }; + + fragment@33 { + target = <0xffffffff>; + + __overlay__ { + hsuart8 = "/soc/qcom,qup_hsuart@a88000"; + }; + }; + + fragment@34 { + target = <0xffffffff>; + + __overlay__ { + + qcom,qup_hsuart@a88000 { + compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; + reg = <0xa88000 0x4000>; + reg-names = "se_phys"; + clock-names = "se-clk", "m-ahb", "s-ahb"; + clocks = <0xffffffff 0x50 0xffffffff 0x5a 0xffffffff 0x5b>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4f 0x50>; + pinctrl-1 = <0x51 0x52>; + interrupts = <0x0 0x163 0x0>; + qcom,wrapper-core = <0xffffffff>; + always-on-clock; + status = "ok"; + phandle = <0xba>; + }; + }; + }; + + fragment@35 { + target = <0xffffffff>; + + __overlay__ { + + qupv3_se8_2hsuart_pins { + phandle = <0xbb>; + + qupv3_se8_2uart_tx_active { + phandle = <0x4f>; + + mux { + pins = "gpio44"; + function = "qup12"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_rx_active { + phandle = <0x50>; + + mux { + pins = "gpio45"; + function = "qup12"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_tx_sleep { + phandle = <0x51>; + + mux { + pins = "gpio44"; + function = "gpio"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + input-enable; + }; + }; + + qupv3_se8_2uart_rx_sleep { + phandle = <0x52>; + + mux { + pins = "gpio45"; + function = "gpio"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@36 { + target = <0xffffffff>; + + __overlay__ { + + dcc_curr_link@3 { + qcom,curr-link-list = <0x3>; + qcom,data-sink = "sram"; + qcom,link-list = <0x0 0x18000024 0x1 0x0 0x0 0x18000040 0x1 0x0 0x0 0x18010024 0x1 0x0 0x0 0x18010040 0x1 0x0 0x0 0x18020024 0x1 0x0 0x0 0x18020040 0x1 0x0 0x0 0x18030024 0x1 0x0 0x0 0x18030040 0x1 0x0 0x0 0x18040024 0x1 0x0 0x0 0x18040040 0x1 0x0 0x0 0x18050024 0x1 0x0 0x0 0x18050040 0x1 0x0 0x0 0x18060024 0x1 0x0 0x0 0x18060040 0x1 0x0 0x0 0x18070024 0x1 0x0 0x0 0x18070040 0x1 0x0 0x0 0x18080024 0x1 0x0 0x0 0x18080040 0x1 0x0 0x0 0x180800f8 0x1 0x0 0x0 0x18080104 0x1 0x0 0x0 0x1808011c 0x1 0x0 0x0 0x18080128 0x1 0x0 0x0 0x18321700 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18325f00 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x18321818 0x1 0x0 0x0 0x18323818 0x1 0x0 0x0 0x18326018 0x1 0x0 0x0 0x18321920 0x1 0x0 0x0 0x1832102c 0x1 0x0 0x0 0x18321044 0x1 0x0 0x0 0x18321710 0x1 0x0 0x0 0x1832176c 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18323920 0x1 0x0 0x0 0x1832302c 0x1 0x0 0x0 0x18323044 0x1 0x0 0x0 0x18323710 0x1 0x0 0x0 0x1832376c 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18326120 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18325844 0x1 0x0 0x0 0x18325f10 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280000 0x2 0x0 0x0 0x18282000 0x2 0x0 0x0 0x18284000 0x2 0x0 0x0 0x9680000 0x1 0x0 0x0 0x9680004 0x1 0x0 0x2 0x8 0x0 0x0 0x0 0x9681000 0x1 0x0 0x2 0x1 0x0 0x0 0x0 0x9681004 0x1 0x0 0x0 0x9681008 0x1 0x0 0x0 0x968100c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9698500 0x1 0x0 0x0 0x9698504 0x1 0x0 0x0 0x9698508 0x1 0x0 0x0 0x969850c 0x1 0x0 0x0 0x9698510 0x1 0x0 0x0 0x9698514 0x1 0x0 0x0 0x9698518 0x1 0x0 0x0 0x969851c 0x1 0x0 0x0 0x9698700 0x1 0x0 0x0 0x9698704 0x1 0x0 0x0 0x9698708 0x1 0x0 0x0 0x969870c 0x1 0x0 0x0 0x9698714 0x1 0x0 0x0 0x9698718 0x1 0x0 0x0 0x969871c 0x1 0x0 0x0 0x1620204 0x1 0x0 0x0 0x1620240 0x1 0x0 0x0 0x1620248 0x1 0x0 0x0 0x1620288 0x1 0x0 0x0 0x162028c 0x1 0x0 0x0 0x1620290 0x1 0x0 0x0 0x1620294 0x1 0x0 0x0 0x16202a8 0x1 0x0 0x0 0x16202ac 0x1 0x0 0x0 0x16202b0 0x1 0x0 0x0 0x16202b4 0x1 0x0 0x0 0x1620300 0x1 0x0 0x0 0x16e0404 0x1 0x0 0x0 0x16e0408 0x1 0x0 0x0 0x16e0410 0x1 0x0 0x0 0x16e0420 0x1 0x0 0x0 0x16e0424 0x1 0x0 0x0 0x16e0428 0x1 0x0 0x0 0x16e042c 0x1 0x0 0x0 0x16e0430 0x1 0x0 0x0 0x16e0434 0x1 0x0 0x0 0x16e0438 0x1 0x0 0x0 0x16e043c 0x1 0x0 0x0 0x16e0300 0x1 0x0 0x0 0x16e0304 0x1 0x0 0x0 0x16e0700 0x1 0x0 0x0 0x16e0704 0x1 0x0 0x0 0x1700c00 0x1 0x0 0x0 0x1700c08 0x1 0x0 0x0 0x1700c10 0x1 0x0 0x0 0x1700c20 0x1 0x0 0x0 0x1700c24 0x1 0x0 0x0 0x1700c28 0x1 0x0 0x0 0x1700c2c 0x1 0x0 0x0 0x1700c30 0x1 0x0 0x0 0x1700c34 0x1 0x0 0x0 0x1700c38 0x1 0x0 0x0 0x1700c3c 0x1 0x0 0x0 0x1700300 0x1 0x0 0x0 0x1700304 0x1 0x0 0x0 0x1700308 0x1 0x0 0x0 0x170030c 0x1 0x0 0x0 0x1700310 0x1 0x0 0x0 0x1700500 0x1 0x0 0x0 0x1700504 0x1 0x0 0x0 0x1700508 0x1 0x0 0x0 0x170050c 0x1 0x0 0x0 0x1700900 0x1 0x0 0x0 0x1700904 0x1 0x0 0x0 0x1700908 0x1 0x0 0x0 0x1740004 0x1 0x0 0x0 0x1740008 0x1 0x0 0x0 0x1740010 0x1 0x0 0x0 0x1740020 0x1 0x0 0x0 0x1740024 0x1 0x0 0x0 0x1740028 0x1 0x0 0x0 0x174002c 0x1 0x0 0x0 0x1740030 0x1 0x0 0x0 0x1740034 0x1 0x0 0x0 0x1740038 0x1 0x0 0x0 0x174003c 0x1 0x0 0x0 0x1740300 0x1 0x0 0x0 0x1740304 0x1 0x0 0x0 0x1740308 0x1 0x0 0x0 0x174030c 0x1 0x0 0x0 0x1740310 0x1 0x0 0x0 0x1740314 0x1 0x0 0x0 0x9698204 0x1 0x0 0x0 0x9698240 0x1 0x0 0x0 0x9698244 0x1 0x0 0x0 0x9698248 0x1 0x0 0x0 0x969824c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x9681018 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9160204 0x1 0x0 0x0 0x9160240 0x1 0x0 0x0 0x9160248 0x1 0x0 0x0 0x9160288 0x1 0x0 0x0 0x9160290 0x1 0x0 0x0 0x9160300 0x1 0x0 0x0 0x9160304 0x1 0x0 0x0 0x9160308 0x1 0x0 0x0 0x916030c 0x1 0x0 0x0 0x9160310 0x1 0x0 0x0 0x9160314 0x1 0x0 0x0 0x9160318 0x1 0x0 0x0 0x9160008 0x1 0x0 0x0 0x9160010 0x1 0x0 0x0 0x9160020 0x1 0x0 0x0 0x9160024 0x1 0x0 0x0 0x9160028 0x1 0x0 0x0 0x916002c 0x1 0x0 0x0 0x9160030 0x1 0x0 0x0 0x9160034 0x1 0x0 0x0 0x9160038 0x1 0x0 0x0 0x916003c 0x1 0x0 0x0 0x63042680 0x1 0x0 0x0 0x63042684 0x1 0x0 0x0 0x63042688 0x1 0x0 0x0 0x63042690 0x1 0x0 0x0 0x630426a0 0x1 0x0 0x0 0x630426a4 0x1 0x0 0x0 0x630426a8 0x1 0x0 0x0 0x630426ac 0x1 0x0 0x0 0x630426b0 0x1 0x0 0x0 0x630426b4 0x1 0x0 0x0 0x630426b8 0x1 0x0 0x0 0x630426bc 0x1 0x0 0x0 0x63041900 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x1620500 0x4 0x0 0x0 0x1620700 0x4 0x0 0x0 0x1620300 0x1 0x0 0x0 0x1620f00 0x2 0x0 0x0 0x1620b00 0x2 0x0 0x0 0x1700b00 0x2 0x0 0x0 0x1700700 0x3 0x0 0x0 0x9163100 0x1 0x0 0x0 0x96aa100 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x9991500 0x8 0x0 0x0 0x9050008 0x1 0x0 0x0 0x9050078 0x1 0x0 0x0 0x9236028 0x1 0x0 0x0 0x923602c 0x1 0x0 0x0 0x9236030 0x1 0x0 0x0 0x9236034 0x1 0x0 0x0 0x9236038 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x92360b0 0x1 0x0 0x0 0x9236044 0x1 0x0 0x0 0x9236048 0x1 0x0 0x0 0x923604c 0x1 0x0 0x0 0x9236050 0x1 0x0 0x0 0x923e030 0x1 0x0 0x0 0x923e034 0x1 0x0 0x0 0x9241000 0x1 0x0 0x0 0x9248058 0x1 0x0 0x0 0x924805c 0x1 0x0 0x0 0x9248060 0x1 0x0 0x0 0x9248064 0x1 0x0 0x0 0x9260410 0x1 0x0 0x0 0x92e0410 0x1 0x0 0x0 0x9260414 0x1 0x0 0x0 0x92e0414 0x1 0x0 0x0 0x9260418 0x1 0x0 0x0 0x92e0418 0x1 0x0 0x0 0x9260420 0x1 0x0 0x0 0x9260424 0x1 0x0 0x0 0x9260430 0x1 0x0 0x0 0x9260440 0x1 0x0 0x0 0x9260448 0x1 0x0 0x0 0x92604a0 0x1 0x0 0x0 0x92604b0 0x1 0x0 0x0 0x92604d0 0x2 0x0 0x0 0x9261440 0x1 0x0 0x0 0x92e0420 0x1 0x0 0x0 0x92e0424 0x1 0x0 0x0 0x92e0430 0x1 0x0 0x0 0x92e0440 0x1 0x0 0x0 0x92e0448 0x1 0x0 0x0 0x92e04a0 0x1 0x0 0x0 0x92e04b0 0x1 0x0 0x0 0x92e04d0 0x2 0x0 0x0 0x9600000 0x1 0x0 0x0 0x9601000 0x1 0x0 0x0 0x9602000 0x1 0x0 0x0 0x9603000 0x1 0x0 0x0 0x9604000 0x1 0x0 0x0 0x9605000 0x1 0x0 0x0 0x9606000 0x1 0x0 0x0 0x9607000 0x1 0x0 0x0 0x9608000 0x1 0x0 0x0 0x9609000 0x1 0x0 0x0 0x960a000 0x1 0x0 0x0 0x960b000 0x1 0x0 0x0 0x960c000 0x1 0x0 0x0 0x960d000 0x1 0x0 0x0 0x960e000 0x1 0x0 0x0 0x960f000 0x1 0x0 0x0 0x9610000 0x1 0x0 0x0 0x9611000 0x1 0x0 0x0 0x9612000 0x1 0x0 0x0 0x9613000 0x1 0x0 0x0 0x9614000 0x1 0x0 0x0 0x9615000 0x1 0x0 0x0 0x9616000 0x1 0x0 0x0 0x9617000 0x1 0x0 0x0 0x9618000 0x1 0x0 0x0 0x9619000 0x1 0x0 0x0 0x961a000 0x1 0x0 0x0 0x961b000 0x1 0x0 0x0 0x961c000 0x1 0x0 0x0 0x961d000 0x1 0x0 0x0 0x961e000 0x1 0x0 0x0 0x961f000 0x1 0x0 0x0 0x9600004 0x1 0x0 0x0 0x9601004 0x1 0x0 0x0 0x9602004 0x1 0x0 0x0 0x9603004 0x1 0x0 0x0 0x9604004 0x1 0x0 0x0 0x9605004 0x1 0x0 0x0 0x9606004 0x1 0x0 0x0 0x9607004 0x1 0x0 0x0 0x9608004 0x1 0x0 0x0 0x9609004 0x1 0x0 0x0 0x960a004 0x1 0x0 0x0 0x960b004 0x1 0x0 0x0 0x960c004 0x1 0x0 0x0 0x960d004 0x1 0x0 0x0 0x960e004 0x1 0x0 0x0 0x960f004 0x1 0x0 0x0 0x9610004 0x1 0x0 0x0 0x9611004 0x1 0x0 0x0 0x9612004 0x1 0x0 0x0 0x9613004 0x1 0x0 0x0 0x9614004 0x1 0x0 0x0 0x9615004 0x1 0x0 0x0 0x9616004 0x1 0x0 0x0 0x9617004 0x1 0x0 0x0 0x9618004 0x1 0x0 0x0 0x9619004 0x1 0x0 0x0 0x961a004 0x1 0x0 0x0 0x961b004 0x1 0x0 0x0 0x961c004 0x1 0x0 0x0 0x961d004 0x1 0x0 0x0 0x961e004 0x1 0x0 0x0 0x961f004 0x1 0x0 0x0 0x9266418 0x1 0x0 0x0 0x92e6418 0x1 0x0 0x0 0x9265804 0x1 0x0 0x0 0x92e5804 0x1 0x0 0x0 0x92604b8 0x1 0x0 0x0 0x92e04b8 0x1 0x0 0x0 0xc201244 0x1 0x0 0x0 0xc202244 0x1 0x0 0x0 0x18100c18 0x1 0x0 0x0 0x18101c18 0x1 0x0 0x0 0x18300000 0x1 0x0 0x0 0x183a3a84 0x2 0x0 0x0 0x18393a84 0x1 0x0 0x0 0x100000 0x1 0x0 0x0 0x100004 0x1 0x0 0x0 0x100008 0x1 0x0 0x0 0x10000c 0x1 0x0 0x0 0x100010 0x1 0x0 0x0 0x100014 0x1 0x0 0x0 0x100018 0x1 0x0 0x0 0x10001c 0x1 0x0 0x0 0x100020 0x1 0x0 0x0 0x100024 0x1 0x0 0x0 0x100028 0x1 0x0 0x0 0x10002c 0x1 0x0 0x0 0x100030 0x1 0x0 0x0 0x100034 0x1 0x0 0x0 0x100100 0x1 0x0 0x0 0x100104 0x1 0x0 0x0 0x100108 0x1 0x0 0x0 0x10010c 0x1 0x0 0x0 0x101000 0x1 0x0 0x0 0x101004 0x1 0x0 0x0 0x101008 0x1 0x0 0x0 0x10100c 0x1 0x0 0x0 0x101010 0x1 0x0 0x0 0x101014 0x1 0x0 0x0 0x101018 0x1 0x0 0x0 0x10101c 0x1 0x0 0x0 0x101020 0x1 0x0 0x0 0x101024 0x1 0x0 0x0 0x101028 0x1 0x0 0x0 0x10102c 0x1 0x0 0x0 0x101030 0x1 0x0 0x0 0x101034 0x1 0x0 0x0 0x102000 0x1 0x0 0x0 0x102004 0x1 0x0 0x0 0x102008 0x1 0x0 0x0 0x10200c 0x1 0x0 0x0 0x102010 0x1 0x0 0x0 0x102014 0x1 0x0 0x0 0x102018 0x1 0x0 0x0 0x10201c 0x1 0x0 0x0 0x102020 0x1 0x0 0x0 0x102024 0x1 0x0 0x0 0x102028 0x1 0x0 0x0 0x10202c 0x1 0x0 0x0 0x102030 0x1 0x0 0x0 0x102034 0x1 0x0 0x0 0x103000 0x1 0x0 0x0 0x103004 0x1 0x0 0x0 0x103008 0x1 0x0 0x0 0x10300c 0x1 0x0 0x0 0x103010 0x1 0x0 0x0 0x103014 0x1 0x0 0x0 0x103018 0x1 0x0 0x0 0x10301c 0x1 0x0 0x0 0x103020 0x1 0x0 0x0 0x103024 0x1 0x0 0x0 0x103028 0x1 0x0 0x0 0x10302c 0x1 0x0 0x0 0x103030 0x1 0x0 0x0 0x103034 0x1 0x0 0x0 0x113000 0x1 0x0 0x0 0x113004 0x1 0x0 0x0 0x113008 0x1 0x0 0x0 0x11300c 0x1 0x0 0x0 0x113010 0x1 0x0 0x0 0x113014 0x1 0x0 0x0 0x113018 0x1 0x0 0x0 0x11301c 0x1 0x0 0x0 0x113020 0x1 0x0 0x0 0x113024 0x1 0x0 0x0 0x113028 0x1 0x0 0x0 0x11302c 0x1 0x0 0x0 0x113030 0x1 0x0 0x0 0x113034 0x1 0x0 0x0 0x11a000 0x1 0x0 0x0 0x11a004 0x1 0x0 0x0 0x11a008 0x1 0x0 0x0 0x11a00c 0x1 0x0 0x0 0x11a010 0x1 0x0 0x0 0x11a014 0x1 0x0 0x0 0x11a018 0x1 0x0 0x0 0x11a01c 0x1 0x0 0x0 0x11a020 0x1 0x0 0x0 0x11a024 0x1 0x0 0x0 0x11a028 0x1 0x0 0x0 0x11a02c 0x1 0x0 0x0 0x11a030 0x1 0x0 0x0 0x11a034 0x1 0x0 0x0 0x11b000 0x1 0x0 0x0 0x11b004 0x1 0x0 0x0 0x11b008 0x1 0x0 0x0 0x11b00c 0x1 0x0 0x0 0x11b010 0x1 0x0 0x0 0x11b014 0x1 0x0 0x0 0x11b018 0x1 0x0 0x0 0x11b01c 0x1 0x0 0x0 0x11b020 0x1 0x0 0x0 0x11b024 0x1 0x0 0x0 0x11b028 0x1 0x0 0x0 0x11b02c 0x1 0x0 0x0 0x11b030 0x1 0x0 0x0 0x11b034 0x1 0x0 0x0 0x174000 0x1 0x0 0x0 0x174004 0x1 0x0 0x0 0x174008 0x1 0x0 0x0 0x17400c 0x1 0x0 0x0 0x174010 0x1 0x0 0x0 0x174014 0x1 0x0 0x0 0x174018 0x1 0x0 0x0 0x17401c 0x1 0x0 0x0 0x174020 0x1 0x0 0x0 0x174024 0x1 0x0 0x0 0x174028 0x1 0x0 0x0 0x17402c 0x1 0x0 0x0 0x174030 0x1 0x0 0x0 0x174034 0x1 0x0 0x0 0x176000 0x1 0x0 0x0 0x176004 0x1 0x0 0x0 0x176008 0x1 0x0 0x0 0x17600c 0x1 0x0 0x0 0x176010 0x1 0x0 0x0 0x176014 0x1 0x0 0x0 0x176018 0x1 0x0 0x0 0x17601c 0x1 0x0 0x0 0x176020 0x1 0x0 0x0 0x176024 0x1 0x0 0x0 0x176028 0x1 0x0 0x0 0x17602c 0x1 0x0 0x0 0x176030 0x1 0x0 0x0 0x176034 0x1 0x0 0x0 0x10401c 0x1 0x0 0x0 0x183024 0x1 0x0 0x0 0x144168 0x1 0x0 0x0 0x11702c 0x1 0x0 0x0 0x10904c 0x1 0x0 0x0 0x189038 0x1 0x0 0x0 0x1443e8 0x1 0x0 0x0 0x1442b8 0x1 0x0 0x0 0x105060 0x1 0x0 0x0 0x141024 0x1 0x0 0x0 0x145038 0x1 0x0 0x0 0x109004 0x1 0x0 0x0 0x189004 0x1 0x0 0x0 0x190004 0x1 0x0 0x0 0xc2a0000 0x1 0x0 0x0 0xc2a0004 0x1 0x0 0x0 0xc2a0008 0x1 0x0 0x0 0xc2a000c 0x1 0x0 0x0 0xc2a0010 0x1 0x0 0x0 0xc2a0014 0x1 0x0 0x0 0xc2a0018 0x1 0x0 0x0 0xc2a001c 0x1 0x0 0x0 0xc2a0020 0x1 0x0 0x0 0xc2a0024 0x1 0x0 0x0 0xc2a0028 0x1 0x0 0x0 0xc2a002c 0x1 0x0 0x0 0xc2a0030 0x1 0x0 0x0 0xc2a0034 0x1 0x0 0x0 0xc2a1000 0x1 0x0 0x0 0xc2a1004 0x1 0x0 0x0 0xc2a1008 0x1 0x0 0x0 0xc2a100c 0x1 0x0 0x0 0xc2a1010 0x1 0x0 0x0 0xc2a1014 0x1 0x0 0x0 0xc2a1018 0x1 0x0 0x0 0xc2a101c 0x1 0x0 0x0 0xc2a1020 0x1 0x0 0x0 0xc2a1024 0x1 0x0 0x0 0xc2a1028 0x1 0x0 0x0 0xc2a102c 0x1 0x0 0x0 0xc2a1030 0x1 0x0 0x0 0xc2a2260 0x1 0x0 0x0 0xc2a2264 0x1 0x0 0x0 0xc2a3008 0x1 0x0 0x0 0xc2a300c 0x1 0x0 0x0 0xc2a3010 0x1 0x0 0x0 0xc2a3014 0x1 0x0 0x0 0xc2a3024 0x1 0x0 0x0 0xc2a2034 0x1 0x0 0x0 0xc2a214c 0x1 0x0 0x0 0xc2a2150 0x1 0x0 0x0 0xc2a2154 0x1 0x0 0x0 0x28206c 0x1 0x0 0x0 0x18282004 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x1808012c 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280004 0x1 0x0 0x0 0x18284038 0x1 0x0 0x0 0x18284000 0x2 0x0 0x0 0x90c012c 0x1 0x0 0x0 0x9222408 0x1 0x0 0x0 0x9220344 0x2 0x0 0x0 0x9220480 0x1 0x0 0x0 0x922358c 0x1 0x0 0x0 0x9222398 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x923201c 0x5 0x0 0x0 0x9232050 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x9186048 0x1 0x0 0x0 0x9186054 0x1 0x0 0x0 0x9186164 0x1 0x0 0x0 0x9186170 0x1 0x0 0x0 0xc2630a0 0x4 0x0 0x0 0xc2630b0 0x4 0x0 0x0 0xc2630c0 0x4 0x0 0x0 0xc2630d0 0x4 0x0 0x0 0x18200400 0x1 0x0 0x0 0x18200404 0x1 0x0 0x0 0x18200408 0x1 0x0 0x0 0x18200038 0x1 0x0 0x0 0x18200040 0x1 0x0 0x0 0x18200048 0x1 0x0 0x0 0x18220038 0x1 0x0 0x0 0x18220040 0x1 0x0 0x0 0x182200d0 0x1 0x0 0x0 0x18200030 0x1 0x0 0x0 0x18200010 0x1 0x0 0x0 0x1822000c 0x1 0x0 0x0 0x18220d14 0x1 0x0 0x0 0x18220fb4 0x1 0x0 0x0 0x18221254 0x1 0x0 0x0 0x182214f4 0x1 0x0 0x0 0x18221794 0x1 0x0 0x0 0x18221a34 0x1 0x0 0x0 0x18221cd4 0x1 0x0 0x0 0x18221f74 0x1 0x0 0x0 0x18220d18 0x1 0x0 0x0 0x18220fb8 0x1 0x0 0x0 0x18221258 0x1 0x0 0x0 0x182214f8 0x1 0x0 0x0 0x18221798 0x1 0x0 0x0 0x18221a38 0x1 0x0 0x0 0x18221cd8 0x1 0x0 0x0 0x18221f78 0x1 0x0 0x0 0x18220d00 0x1 0x0 0x0 0x18220d04 0x1 0x0 0x0 0x18220d1c 0x1 0x0 0x0 0x18220fbc 0x1 0x0 0x0 0x1822125c 0x1 0x0 0x0 0x182214fc 0x1 0x0 0x0 0x1822179c 0x1 0x0 0x0 0x18221a3c 0x1 0x0 0x0 0x18221cdc 0x1 0x0 0x0 0x18221f7c 0x1 0x0 0x0 0x18221274 0x1 0x0 0x0 0x18221288 0x1 0x0 0x0 0x1822129c 0x1 0x0 0x0 0x182212b0 0x1 0x0 0x0 0x182212c4 0x1 0x0 0x0 0x182212d8 0x1 0x0 0x0 0x182212ec 0x1 0x0 0x0 0x18221300 0x1 0x0 0x0 0x18221314 0x1 0x0 0x0 0x18221328 0x1 0x0 0x0 0x1822133c 0x1 0x0 0x0 0x18221350 0x1 0x0 0x0 0x18221364 0x1 0x0 0x0 0x18221378 0x1 0x0 0x0 0x1822138c 0x1 0x0 0x0 0x182213a0 0x1 0x0 0x0 0x18221514 0x1 0x0 0x0 0x18221528 0x1 0x0 0x0 0x1822153c 0x1 0x0 0x0 0x18221550 0x1 0x0 0x0 0x18221564 0x1 0x0 0x0 0x18221578 0x1 0x0 0x0 0x1822158c 0x1 0x0 0x0 0x182215a0 0x1 0x0 0x0 0x182215b4 0x1 0x0 0x0 0x182215c8 0x1 0x0 0x0 0x182215dc 0x1 0x0 0x0 0x182215f0 0x1 0x0 0x0 0x18221604 0x1 0x0 0x0 0x18221618 0x1 0x0 0x0 0x1822162c 0x1 0x0 0x0 0x18221640 0x1 0x0 0x0 0x182217b4 0x1 0x0 0x0 0x182217c8 0x1 0x0 0x0 0x182217dc 0x1 0x0 0x0 0x182217f0 0x1 0x0 0x0 0x18221804 0x1 0x0 0x0 0x18221818 0x1 0x0 0x0 0x1822182c 0x1 0x0 0x0 0x18221840 0x1 0x0 0x0 0x18221854 0x1 0x0 0x0 0x18221868 0x1 0x0 0x0 0x1822187c 0x1 0x0 0x0 0x18221890 0x1 0x0 0x0 0x182218a4 0x1 0x0 0x0 0x182218b8 0x1 0x0 0x0 0x182218cc 0x1 0x0 0x0 0x182218e0 0x1 0x0 0x0 0x18221a54 0x1 0x0 0x0 0x18221a68 0x1 0x0 0x0 0x18221a7c 0x1 0x0 0x0 0x18221a90 0x1 0x0 0x0 0x18221aa4 0x1 0x0 0x0 0x18221ab8 0x1 0x0 0x0 0x18221acc 0x1 0x0 0x0 0x18221ae0 0x1 0x0 0x0 0x18221af4 0x1 0x0 0x0 0x18221b08 0x1 0x0 0x0 0x18221b1c 0x1 0x0 0x0 0x18221b30 0x1 0x0 0x0 0x18221b44 0x1 0x0 0x0 0x18221b58 0x1 0x0 0x0 0x18221b6c 0x1 0x0 0x0 0x18221b80 0x1 0x0 0x0 0x18221cf4 0x1 0x0 0x0 0x18221d08 0x1 0x0 0x0 0x18221d1c 0x1 0x0 0x0 0x18221d30 0x1 0x0 0x0 0x18221d44 0x1 0x0 0x0 0x18221d58 0x1 0x0 0x0 0x18221d6c 0x1 0x0 0x0 0x18221d80 0x1 0x0 0x0 0x18221d94 0x1 0x0 0x0 0x18221da8 0x1 0x0 0x0 0x18221dbc 0x1 0x0 0x0 0x18221dd0 0x1 0x0 0x0 0x18221de4 0x1 0x0 0x0 0x18221df8 0x1 0x0 0x0 0x18221e0c 0x1 0x0 0x0 0x18221e20 0x1 0x0 0x0 0x18221f94 0x1 0x0 0x0 0x18221fa8 0x1 0x0 0x0 0x18221fbc 0x1 0x0 0x0 0x18221fd0 0x1 0x0 0x0 0x18221fe4 0x1 0x0 0x0 0x18221ff8 0x1 0x0 0x0 0x1822200c 0x1 0x0 0x0 0x18222020 0x1 0x0 0x0 0x18222034 0x1 0x0 0x0 0x18222048 0x1 0x0 0x0 0x1822205c 0x1 0x0 0x0 0x18222070 0x1 0x0 0x0 0x18222084 0x1 0x0 0x0 0x18222098 0x1 0x0 0x0 0x182220ac 0x1 0x0 0x0 0x182220c0 0x1 0x0 0x0 0x18221278 0x1 0x0 0x0 0x1822128c 0x1 0x0 0x0 0x182212a0 0x1 0x0 0x0 0x182212b4 0x1 0x0 0x0 0x182212c8 0x1 0x0 0x0 0x182212dc 0x1 0x0 0x0 0x182212f0 0x1 0x0 0x0 0x18221304 0x1 0x0 0x0 0x18221318 0x1 0x0 0x0 0x1822132c 0x1 0x0 0x0 0x18221340 0x1 0x0 0x0 0x18221354 0x1 0x0 0x0 0x18221368 0x1 0x0 0x0 0x1822137c 0x1 0x0 0x0 0x18221390 0x1 0x0 0x0 0x182213a4 0x1 0x0 0x0 0x18221518 0x1 0x0 0x0 0x1822152c 0x1 0x0 0x0 0x18221540 0x1 0x0 0x0 0x18221554 0x1 0x0 0x0 0x18221568 0x1 0x0 0x0 0x1822157c 0x1 0x0 0x0 0x18221590 0x1 0x0 0x0 0x182215a4 0x1 0x0 0x0 0x182215b8 0x1 0x0 0x0 0x182215cc 0x1 0x0 0x0 0x182215e0 0x1 0x0 0x0 0x182215f4 0x1 0x0 0x0 0x18221608 0x1 0x0 0x0 0x1822161c 0x1 0x0 0x0 0x18221630 0x1 0x0 0x0 0x18221644 0x1 0x0 0x0 0x182217b8 0x1 0x0 0x0 0x182217cc 0x1 0x0 0x0 0x182217e0 0x1 0x0 0x0 0x182217f4 0x1 0x0 0x0 0x18221808 0x1 0x0 0x0 0x1822181c 0x1 0x0 0x0 0x18221830 0x1 0x0 0x0 0x18221844 0x1 0x0 0x0 0x18221858 0x1 0x0 0x0 0x1822186c 0x1 0x0 0x0 0x18221880 0x1 0x0 0x0 0x18221894 0x1 0x0 0x0 0x182218a8 0x1 0x0 0x0 0x182218bc 0x1 0x0 0x0 0x182218d0 0x1 0x0 0x0 0x182218e4 0x1 0x0 0x0 0x18221a58 0x1 0x0 0x0 0x18221a6c 0x1 0x0 0x0 0x18221a80 0x1 0x0 0x0 0x18221a94 0x1 0x0 0x0 0x18221aa8 0x1 0x0 0x0 0x18221abc 0x1 0x0 0x0 0x18221ad0 0x1 0x0 0x0 0x18221ae4 0x1 0x0 0x0 0x18221af8 0x1 0x0 0x0 0x18221b0c 0x1 0x0 0x0 0x18221b20 0x1 0x0 0x0 0x18221b34 0x1 0x0 0x0 0x18221b48 0x1 0x0 0x0 0x18221b5c 0x1 0x0 0x0 0x18221b70 0x1 0x0 0x0 0x18221b84 0x1 0x0 0x0 0x18221cf8 0x1 0x0 0x0 0x18221d0c 0x1 0x0 0x0 0x18221d20 0x1 0x0 0x0 0x18221d34 0x1 0x0 0x0 0x18221d48 0x1 0x0 0x0 0x18221d5c 0x1 0x0 0x0 0x18221d70 0x1 0x0 0x0 0x18221d84 0x1 0x0 0x0 0x18221d98 0x1 0x0 0x0 0x18221dac 0x1 0x0 0x0 0x18221dc0 0x1 0x0 0x0 0x18221dd4 0x1 0x0 0x0 0x18221de8 0x1 0x0 0x0 0x18221dfc 0x1 0x0 0x0 0x18221e10 0x1 0x0 0x0 0x18221e24 0x1 0x0 0x0 0x18221f98 0x1 0x0 0x0 0x18221fac 0x1 0x0 0x0 0x18221fc0 0x1 0x0 0x0 0x18221fd4 0x1 0x0 0x0 0x18221fe8 0x1 0x0 0x0 0x18221ffc 0x1 0x0 0x0 0x18222010 0x1 0x0 0x0 0x18222024 0x1 0x0 0x0 0x18222038 0x1 0x0 0x0 0x1822204c 0x1 0x0 0x0 0x18222060 0x1 0x0 0x0 0x18222074 0x1 0x0 0x0 0x18222088 0x1 0x0 0x0 0x1822209c 0x1 0x0 0x0 0x182220b0 0x1 0x0 0x0 0x182220c4 0x1 0x0 0x0 0x105050 0x1 0x0 0x0 0x171004 0x1 0x0 0x0 0x171154 0x1 0x0 0x0 0x17100c 0x1 0x0 0x0 0x171018 0x1 0x0 0x0 0x5091004 0x1 0x0 0x0 0x509100c 0x1 0x0 0x0 0x5091010 0x1 0x0 0x0 0x5091014 0x1 0x0 0x0 0x5091054 0x1 0x0 0x0 0x5091060 0x1 0x0 0x0 0x509106c 0x1 0x0 0x0 0x5091070 0x1 0x0 0x0 0x5091074 0x1 0x0 0x0 0x5091078 0x1 0x0 0x0 0x509107c 0x1 0x0 0x0 0x509108c 0x1 0x0 0x0 0x5091098 0x1 0x0 0x0 0x509109c 0x1 0x0 0x0 0x1800005c 0x1 0x0 0x0 0x1801005c 0x1 0x0 0x0 0x1802005c 0x1 0x0 0x0 0x1803005c 0x1 0x0 0x0 0x1804005c 0x1 0x0 0x0 0x1805005c 0x1 0x0 0x0 0x1806005c 0x1 0x0 0x0 0x1807005c 0x1 0x0 0x0 0x17c0003c 0x1 0x0 0x1 0x6004fb0 0xc5acce55 0x0 0x1 0x600408c 0xff 0x0 0x1 0x6004fb0 0x0 0x0 0x0 0x62900010 0x1 0x0 0x0 0x62900014 0x1 0x0 0x0 0x62900018 0x1 0x0 0x0 0x62900030 0x1 0x0 0x0 0x62900038 0x1 0x0 0x0 0x62900040 0x1 0x0 0x0 0x62900048 0x1 0x0 0x0 0x629000d0 0x1 0x0 0x0 0x62900210 0x1 0x0 0x0 0x62900230 0x1 0x0 0x0 0x62900250 0x1 0x0 0x0 0x62900270 0x1 0x0 0x0 0x62900290 0x1 0x0 0x0 0x629002b0 0x1 0x0 0x0 0x62900208 0x1 0x0 0x0 0x62900228 0x1 0x0 0x0 0x62900248 0x1 0x0 0x0 0x62900268 0x1 0x0 0x0 0x62900288 0x1 0x0 0x0 0x629002a8 0x1 0x0 0x0 0x6290020c 0x1 0x0 0x0 0x6290022c 0x1 0x0 0x0 0x6290024c 0x1 0x0 0x0 0x6290026c 0x1 0x0 0x0 0x6290028c 0x1 0x0 0x0 0x629002ac 0x1 0x0 0x0 0x62900404 0x1 0x0 0x0 0x62900408 0x1 0x0 0x0 0x62900400 0x1 0x0 0x0 0x62900d04 0x1 0x0 0x0 0x624b0010 0x1 0x0 0x0 0x624b0014 0x1 0x0 0x0 0x624b0018 0x1 0x0 0x0 0x624b0210 0x1 0x0 0x0 0x624b0230 0x1 0x0 0x0 0x624b0250 0x1 0x0 0x0 0x624b0270 0x1 0x0 0x0 0x624b0290 0x1 0x0 0x0 0x624b02b0 0x1 0x0 0x0 0x624b0208 0x1 0x0 0x0 0x624b0228 0x1 0x0 0x0 0x624b0248 0x1 0x0 0x0 0x624b0268 0x1 0x0 0x0 0x624b0288 0x1 0x0 0x0 0x624b02a8 0x1 0x0 0x0 0x624b020c 0x1 0x0 0x0 0x624b022c 0x1 0x0 0x0 0x624b024c 0x1 0x0 0x0 0x624b026c 0x1 0x0 0x0 0x624b028c 0x1 0x0 0x0 0x624b02ac 0x1 0x0 0x0 0x624b0400 0x1 0x0 0x0 0x624b0404 0x1 0x0 0x0 0x624b0408 0x1 0x0 0x0 0x62402028 0x1 0x0 0x0 0xb254520 0x1 0x0 0x0 0xb251020 0x1 0x0 0x0 0xb251024 0x1 0x0 0x0 0xb251030 0x1 0x0 0x0 0xb251200 0x1 0x0 0x0 0xb251214 0x1 0x0 0x0 0xb251228 0x1 0x0 0x0 0xb25123c 0x1 0x0 0x0 0xb251250 0x1 0x0 0x0 0xb251204 0x1 0x0 0x0 0xb251218 0x1 0x0 0x0 0xb25122c 0x1 0x0 0x0 0xb251240 0x1 0x0 0x0 0xb251254 0x1 0x0 0x0 0xb251208 0x1 0x0 0x0 0xb25121c 0x1 0x0 0x0 0xb251230 0x1 0x0 0x0 0xb251244 0x1 0x0 0x0 0xb251258 0x1 0x0 0x0 0xb254510 0x1 0x0 0x0 0xb254514 0x1 0x0 0x0 0xb250010 0x1 0x0 0x0 0xb250014 0x1 0x0 0x0 0xb250900 0x1 0x0 0x0 0xb250904 0x1 0x0 0x0 0x4200010 0x1 0x0 0x0 0x4200014 0x1 0x0 0x0 0x4200018 0x1 0x0 0x0 0x4200030 0x1 0x0 0x0 0x4200038 0x1 0x0 0x0 0x4200040 0x1 0x0 0x0 0x4200048 0x1 0x0 0x0 0x42000d0 0x1 0x0 0x0 0x4200210 0x1 0x0 0x0 0x4200230 0x1 0x0 0x0 0x4200250 0x1 0x0 0x0 0x4200270 0x1 0x0 0x0 0x4200290 0x1 0x0 0x0 0x42002b0 0x1 0x0 0x0 0x4200208 0x1 0x0 0x0 0x4200228 0x1 0x0 0x0 0x4200248 0x1 0x0 0x0 0x4200268 0x1 0x0 0x0 0x4200288 0x1 0x0 0x0 0x42002a8 0x1 0x0 0x0 0x420020c 0x1 0x0 0x0 0x420022c 0x1 0x0 0x0 0x420024c 0x1 0x0 0x0 0x420026c 0x1 0x0 0x0 0x420028c 0x1 0x0 0x0 0x42002ac 0x1 0x0 0x0 0x4200404 0x1 0x0 0x0 0x4200408 0x1 0x0 0x0 0x4200400 0x1 0x0 0x0 0x4200d04 0x1 0x0 0x0 0x4130010 0x1 0x0 0x0 0x4130014 0x1 0x0 0x0 0x4130018 0x1 0x0 0x0 0x4130210 0x1 0x0 0x0 0x4130230 0x1 0x0 0x0 0x4130250 0x1 0x0 0x0 0x4130270 0x1 0x0 0x0 0x4130290 0x1 0x0 0x0 0x41302b0 0x1 0x0 0x0 0x4130208 0x1 0x0 0x0 0x4130228 0x1 0x0 0x0 0x4130248 0x1 0x0 0x0 0x4130268 0x1 0x0 0x0 0x4130288 0x1 0x0 0x0 0x41302a8 0x1 0x0 0x0 0x413020c 0x1 0x0 0x0 0x413022c 0x1 0x0 0x0 0x413024c 0x1 0x0 0x0 0x413026c 0x1 0x0 0x0 0x413028c 0x1 0x0 0x0 0x41302ac 0x1 0x0 0x0 0x4130400 0x1 0x0 0x0 0x4130404 0x1 0x0 0x0 0x4130408 0x1 0x0 0x0 0x4082028 0x1 0x0 0x0 0x18a008 0x1 0x0 0x0 0xb2c4520 0x1 0x0 0x0 0xb2c1020 0x1 0x0 0x0 0xb2c1024 0x1 0x0 0x0 0xb2c1030 0x1 0x0 0x0 0xb2c1200 0x1 0x0 0x0 0xb2c1214 0x1 0x0 0x0 0xb2c1228 0x1 0x0 0x0 0xb2c123c 0x1 0x0 0x0 0xb2c1250 0x1 0x0 0x0 0xb2c1204 0x1 0x0 0x0 0xb2c1218 0x1 0x0 0x0 0xb2c122c 0x1 0x0 0x0 0xb2c1240 0x1 0x0 0x0 0xb2c1254 0x1 0x0 0x0 0xb2c1208 0x1 0x0 0x0 0xb2c121c 0x1 0x0 0x0 0xb2c1230 0x1 0x0 0x0 0xb2c1244 0x1 0x0 0x0 0xb2c1258 0x1 0x0 0x0 0xb2c4510 0x1 0x0 0x0 0xb2c4514 0x1 0x0 0x0 0xb2c0010 0x1 0x0 0x0 0xb2c0014 0x1 0x0 0x0 0xb2c0900 0x1 0x0 0x0 0xb2c0904 0x1 0x0 0x0 0x80a4010 0x1 0x0 0x0 0x80a4014 0x1 0x0 0x0 0x80a4018 0x1 0x0 0x0 0x80a4030 0x1 0x0 0x0 0x80a4038 0x1 0x0 0x0 0x80a4040 0x1 0x0 0x0 0x80a4048 0x1 0x0 0x0 0x80a40d0 0x1 0x0 0x0 0x80a4210 0x1 0x0 0x0 0x80a4230 0x1 0x0 0x0 0x80a4250 0x1 0x0 0x0 0x80a4270 0x1 0x0 0x0 0x80a4290 0x1 0x0 0x0 0x80a42b0 0x1 0x0 0x0 0x80a4208 0x1 0x0 0x0 0x80a4228 0x1 0x0 0x0 0x80a4248 0x1 0x0 0x0 0x80a4268 0x1 0x0 0x0 0x80a4288 0x1 0x0 0x0 0x80a42a8 0x1 0x0 0x0 0x80a420c 0x1 0x0 0x0 0x80a422c 0x1 0x0 0x0 0x80a424c 0x1 0x0 0x0 0x80a426c 0x1 0x0 0x0 0x80a428c 0x1 0x0 0x0 0x80a42ac 0x1 0x0 0x0 0x80a4404 0x1 0x0 0x0 0x80a4408 0x1 0x0 0x0 0x80a4400 0x1 0x0 0x0 0x80a4d04 0x1 0x0 0x0 0x83b0010 0x1 0x0 0x0 0x83b0014 0x1 0x0 0x0 0x83b0018 0x1 0x0 0x0 0x83b0210 0x1 0x0 0x0 0x83b0230 0x1 0x0 0x0 0x83b0250 0x1 0x0 0x0 0x83b0270 0x1 0x0 0x0 0x83b0290 0x1 0x0 0x0 0x83b02b0 0x1 0x0 0x0 0x83b0208 0x1 0x0 0x0 0x83b0228 0x1 0x0 0x0 0x83b0248 0x1 0x0 0x0 0x83b0268 0x1 0x0 0x0 0x83b0288 0x1 0x0 0x0 0x83b02a8 0x1 0x0 0x0 0x83b020c 0x1 0x0 0x0 0x83b022c 0x1 0x0 0x0 0x83b024c 0x1 0x0 0x0 0x83b026c 0x1 0x0 0x0 0x83b028c 0x1 0x0 0x0 0x83b02ac 0x1 0x0 0x0 0x83b0400 0x1 0x0 0x0 0x83b0404 0x1 0x0 0x0 0x83b0408 0x1 0x0 0x0 0x8302028 0x1 0x0 0x0 0xb2b4520 0x1 0x0 0x0 0xb2b1020 0x1 0x0 0x0 0xb2b1024 0x1 0x0 0x0 0xb2b1030 0x1 0x0 0x0 0xb2b1200 0x1 0x0 0x0 0xb2b1214 0x1 0x0 0x0 0xb2b1228 0x1 0x0 0x0 0xb2b123c 0x1 0x0 0x0 0xb2b1250 0x1 0x0 0x0 0xb2b1204 0x1 0x0 0x0 0xb2b1218 0x1 0x0 0x0 0xb2b122c 0x1 0x0 0x0 0xb2b1240 0x1 0x0 0x0 0xb2b1254 0x1 0x0 0x0 0xb2b1208 0x1 0x0 0x0 0xb2b121c 0x1 0x0 0x0 0xb2b1230 0x1 0x0 0x0 0xb2b1244 0x1 0x0 0x0 0xb2b1258 0x1 0x0 0x0 0xb2b4510 0x1 0x0 0x0 0xb2b4514 0x1 0x0 0x0 0xb2b0010 0x1 0x0 0x0 0xb2b0014 0x1 0x0 0x0 0xb2b0900 0x1 0x0 0x0 0xb2b0904 0x1 0x0 0x0 0x17a00204 0x1d 0x0>; + }; + }; + }; + + fragment@37 { + target = <0xffffffff>; + + __overlay__ { + + ss_plog@B4400000 { + compatible = "ss_plog"; + no-map; + reg = <0x0 0xb4400000 0x0 0x200000>; + }; + + ramoops@B4600000 { + compatible = "ramoops"; + reg = <0x0 0xb4600000 0x0 0x100000>; + record-size = <0x40000>; + console-size = <0x40000>; + ftrace-size = <0x40000>; + pmsg-size = <0x40000>; + }; + + sec_debug_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4700000 0x0 0x800000>; + phandle = <0xbc>; + }; + + sec_debug_autocomment@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4f00000 0x0 0x1000>; + phandle = <0xbd>; + }; + + sec_debug_rdx_bootdev@0 { + no-ship; + reg = <0x1 0x0 0x0 0x5900000>; + phandle = <0xbe>; + }; + + kaslr_region@A0001000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xa0001000 0x0 0x1000>; + phandle = <0xbf>; + }; + + rkp_region@B0200000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xb0200000 0x0 0x200000>; + phandle = <0xc0>; + }; + + hdm_region@A1000000 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xa1000000 0x0 0x1000>; + phandle = <0x54>; + }; + + modem_shared_mem_region@B5000000 { + compatible = "modem-removed-dma-pool"; + no-map; + reg = <0x0 0xb5000000 0x0 0x6000000>; + phandle = <0x53>; + }; + }; + }; + + fragment@38 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x80b00000 0x0 0x7100000>; + }; + }; + + fragment@39 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x8b000000 0x0 0x8900000>; + }; + }; + + fragment@40 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x93c00000 0x0 0x3e00000>; + }; + }; + + fragment@41 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97a00000 0x0 0x500000>; + }; + }; + + fragment@42 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97f00000 0x0 0x500000>; + }; + }; + + fragment@43 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98400000 0x0 0x500000>; + }; + }; + + fragment@44 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98900000 0x0 0x1e00000>; + }; + }; + + fragment@45 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9e000000 0x0 0x2000000>; + }; + }; + + fragment@46 { + target = <0xffffffff>; + + __overlay__ { + size = <0x0 0x2000000>; + }; + }; + + fragment@47 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@48 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@49 { + target = <0xffffffff>; + + __overlay__ { + + upload_cause@66c { + compatible = "qcom,msm-imem-upload_cause"; + reg = <0x66c 0x4>; + }; + }; + }; + + fragment@50 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@51 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@52 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@53 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@54 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@55 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@56 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@57 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@58 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@59 { + target = <0xffffffff>; + + __overlay__ { + + dwc3@a600000 { + maximum-speed = "high-speed"; + }; + }; + }; + + fragment@60 { + target = <0xffffffff>; + + __overlay__ { + + input_booster { + status = "okay"; + compatible = "input_booster"; + #address-cells = <0x1>; + #size-cells = <0x0>; + + booster_key@1 { + input_booster,label = "KEY"; + input_booster,type = <0x0>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0xc8>; + input_booster,tail_times = <0x0>; + }; + + booster_key@2 { + input_booster,label = "TOUCHKEY"; + input_booster,type = <0x1>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x0>; + input_booster,tail_times = <0x12c>; + }; + + booster_key@3 { + input_booster,label = "TOUCH"; + input_booster,type = <0x2>; + input_booster,levels = <0x1 0x2 0x3>; + input_booster,cpu_freqs = <0x135600 0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2 0x2>; + input_booster,ddr_freqs = <0x3f9 0x3f9 0x3f9>; + input_booster,lpm_bias = <0x5 0x5 0x5>; + input_booster,head_times = <0xc8 0xc8 0x0>; + input_booster,tail_times = <0x0 0x0 0x12c>; + }; + + booster_key@4 { + input_booster,label = "MULTITOUCH"; + input_booster,type = <0x3>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x3e8 0x0>; + input_booster,tail_times = <0x0 0x1f4>; + }; + + booster_key@5 { + input_booster,label = "KEYBOARD"; + input_booster,type = <0x4>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x135600>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x82 0x82>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@6 { + input_booster,label = "MOUSE"; + input_booster,type = <0x5>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@7 { + input_booster,label = "MOUSE WHEEL"; + input_booster,type = <0x6>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@8 { + input_booster,label = "PEN HOVER"; + input_booster,type = <0x7>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@9 { + input_booster,label = "PEN"; + input_booster,type = <0x8>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x17bb00 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x258>; + }; + + booster_key@10 { + input_booster,label = "KEY_TWO"; + input_booster,type = <0x9>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x17bb00>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x2bc>; + input_booster,tail_times = <0x2bc>; + }; + }; + + sec_smem@0 { + compatible = "samsung,sec-smem"; + status = "okay"; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_4 { + compatible = "qcom,memshare-peripheral"; + memory-region = <0x53>; + qcom,peripheral-size = <0x2000000>; + qcom,reserved-size = <0x4000000>; + qcom,client-id = <0x3>; + qcom,allocate-boot-time; + label = "modem"; + }; + }; + + samsung,sec_misc { + qfprom_jtag,reg = <0x780180>; + }; + + usb-notifier { + compatible = "samsung,usb-notifier"; + qcom,disable_control_en = <0x1>; + qcom,unsupport_host_en = <0x0>; + phandle = <0xc1>; + }; + + samsung,sec_hdm { + memory-region = <0x54>; + }; + + argos { + compatible = "samsung,argos"; + #address-cells = <0x1>; + + boot_device@1 { + net_boost,label = "WIFI"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@2 { + net_boost,label = "WIFI TX"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0xc8 0x21b100 0x0 0x1b8a00 0x0 0x0 0x0 0x1 0x1 0x1>; + }; + + boot_device@3 { + net_boost,label = "WIFI RX"; + net_boost,node = "wlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@4 { + net_boost,label = "SWLAN"; + net_boost,node = "swlan0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@5 { + net_boost,label = "P2P"; + net_boost,node = "p2p-wlan0-0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + + boot_device@6 { + net_boost,label = "IPA"; + net_boost,node = "rmnet_ipa0"; + net_boost,table_size = <0x1>; + net_boost,table = <0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + }; + }; + }; + }; + + fragment@61 { + target = <0xffffffff>; + + __overlay__ { + + android { + + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_system,recovery,dtbo,abl,xbl,tz,hyp"; + }; + }; + }; + }; + + fragment@62 { + target = <0xffffffff>; + + __overlay__ { + qcom,smem-states = <0xffffffff 0x0 0xffffffff 0x4 0xffffffff 0x5>; + qcom,smem-state-names = "qcom,force-stop", "qcom,stop-reason-0", "qcom,stop-reason-1"; + }; + }; + + fragment@63 { + target = <0xffffffff>; + + __overlay__ { + spm-level = <0x3>; + }; + }; + + fragment@64 { + target = <0xffffffff>; + + __overlay__ { + i2c18 = "/soc/i2c@18"; + }; + }; + + fragment@65 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x3>; + + imp_list { + #list-imp-cells = <0x3>; + phandle = <0x26>; + }; + }; + }; + + fragment@66 { + target = <0xffffffff>; + + __overlay__ { + + msm_cdc_pinctrl_quin { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x55 0x56 0x57 0x58>; + pinctrl-1 = <0x59 0x5a 0x5b 0x5c>; + qcom,lpi-gpios; + phandle = <0x60>; + }; + }; + }; + + fragment@67 { + target = <0xffffffff>; + + __overlay__ { + + sec-audio-sysfs { + compatible = "samsung,audio-sysfs"; + status = "okay"; + audio,num-amp = <0x2>; + }; + + samsung,q6audio-adaptation { + compatible = "samsung,q6audio-adaptation"; + adaptation,device-tx-port-id = <0xb037>; + adaptation,spk-rx-port-id = <0x1016>; + adaptation,usb-rx-port-id = <0x7000>; + adaptation,bt-rx-port-id = <0x400e>; + adaptation,headset-rx-port-id = <0xb030>; + phandle = <0x5f>; + }; + + det_zones { + #list-det-cells = <0x2>; + phandle = <0x25>; + }; + + i2c@18 { + status = "ok"; + cell-index = <0x12>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x58 0x0 0xffffffff 0x59 0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x5d 0x5e>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xc2>; + + tas256x@4c { + #sound-dai-cells = <0x0>; + compatible = "ti, tas256x"; + status = "ok"; + reg = <0x4c>; + ti,reset-gpio = <0xffffffff 0x5e 0x0>; + ti,irq-gpio = <0xffffffff 0x5a 0x0>; + ti,left-channel = <0x4d>; + ti,right-channel = <0x4c>; + ti,channels = <0x2>; + ti,iv-width = <0x8>; + ti,vbat-mon = <0x1>; + ti,port_id = <0x1016>; + phandle = <0xc3>; + }; + }; + }; + }; + + fragment@68 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,wcn-btfm = <0x1>; + qcom,ext-disp-audio-rx = <0x0>; + qcom,mi2s-audio-intf = <0x1>; + asoc-platform = <0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0x5f>; + asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-pcm-dsp.2", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-compress-dsp", "msm-pcm-hostless", "msm-pcm-afe", "msm-lsm-client", "msm-pcm-routing", "msm-compr-dsp", "msm-pcm-dsp-noirq", "q6audio-adaptation"; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS3", "MIC BIAS3", "Analog Mic4", "AMIC5", "MIC BIAS4", "MIC BIAS4", "Analog Mic5", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT"; + qcom,msm-mbhc-hs-mic-max-threshold-mv = <0x270f>; + qcom,msm-mbhc-hs-mic-min-threshold-mv = <0x280>; + qcom,cdc-dmic01-gpios; + qcom,cdc-dmic23-gpios; + qcom,cdc-dmic45-gpios; + qcom,quin-mi2s-gpios = <0x60>; + asoc-codec = <0xffffffff 0xffffffff>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec"; + qcom,wsa-max-devs = <0x0>; + qcom,wsa-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x32 0xffffffff>; + fsa4480-i2c-handle; + qcom,fm-lna-gpios = <0xffffffff 0x54 0x0>; + qcom,msm-mbhc-gnd-det = <0x1>; + }; + }; + + fragment@69 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@70 { + target = <0xffffffff>; + + __overlay__ { + + tas25xx_gpio_default { + phandle = <0x5d>; + + mux { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + function = "gpio"; + }; + + config { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + bias-disable; + }; + }; + + fm_lna_default { + phandle = <0x5e>; + + mux { + pins = "gpio84"; + function = "gpio"; + }; + + config { + pins = "gpio84"; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@71 { + target = <0xffffffff>; + + __overlay__ { + + grip_i2c { + + grip_i2c_active { + phandle = <0xa9>; + + grip_i2c_active { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + + grip_i2c_suspend { + phandle = <0xc4>; + + grip_i2c_suspend { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + }; + + s2mpb03_i2c_sda_default { + phandle = <0x61>; + + mux { + pins = "gpio25"; + function = "gpio"; + }; + + config { + pins = "gpio25"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + s2mpb03_i2c_scl_default { + phandle = <0x62>; + + mux { + pins = "gpio26"; + function = "gpio"; + }; + + config { + pins = "gpio26"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + cam_sensor_mclk0_active { + phandle = <0x7d>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk0_suspend { + phandle = <0x80>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk1_active { + phandle = <0x96>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk1_suspend { + phandle = <0x98>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk2_active { + phandle = <0x8d>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk2_suspend { + phandle = <0x90>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk3_active { + phandle = <0x84>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk3_suspend { + phandle = <0x88>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + cam_sensor_mclk4_active { + phandle = <0x9c>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-disable; + drive-strength = <0x4>; + }; + }; + + cam_sensor_mclk4_suspend { + phandle = <0x9f>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-pull-down; + drive-strength = <0x4>; + output-low; + }; + }; + + rcam1_sensor_reset_active { + phandle = <0x7e>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_reset_suspend { + phandle = <0x81>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_active { + phandle = <0x97>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_suspend { + phandle = <0x99>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_active { + phandle = <0x85>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_suspend { + phandle = <0x89>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_active { + phandle = <0x8e>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_suspend { + phandle = <0x91>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_active { + phandle = <0x9d>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_suspend { + phandle = <0xa0>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_active { + phandle = <0x6f>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_suspend { + phandle = <0x70>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_active { + phandle = <0x8f>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_suspend { + phandle = <0x92>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_active { + phandle = <0x86>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_suspend { + phandle = <0x8a>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_active { + phandle = <0x9e>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_suspend { + phandle = <0xa1>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_active { + phandle = <0x87>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-disable; + output-high; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_suspend { + phandle = <0x8b>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vdig_active { + phandle = <0xc5>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vdig_suspend { + phandle = <0xc6>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_active { + phandle = <0xc7>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_suspend { + phandle = <0xc8>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + if_pmic_i2c_pins { + phandle = <0xc9>; + + if_pmic_i2c_sleep { + phandle = <0x68>; + + mux { + pins = "gpio115", "gpio116"; + function = "gpio"; + }; + + config { + pins = "gpio115", "gpio116"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + usbpd_i2c_pins { + phandle = <0xca>; + + usbpd_i2c_sleep { + phandle = <0x6a>; + + mux { + pins = "gpio53", "gpio54"; + function = "gpio"; + }; + + config { + pins = "gpio53", "gpio54"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + mcu_reset_active { + phandle = <0x72>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_reset_suspend { + phandle = <0x74>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + mcu_clk_active { + phandle = <0x73>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_clk_suspend { + phandle = <0x75>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + torch_en_active { + phandle = <0x7f>; + + mux { + pins = "gpio67", "gpio22"; + function = "gpio"; + }; + + config { + pins = "gpio67", "gpio22"; + bias-pull-down; + output-high; + drive-strength = <0x2>; + }; + }; + + torch_en_suspend { + phandle = <0x82>; + + mux { + pins = "gpio67", "gpio22"; + function = "gpio"; + }; + + config { + pins = "gpio67", "gpio22"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + }; + }; + + fragment@72 { + target = <0xffffffff>; + + __overlay__ { + + grip_int_active { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xaa>; + }; + + grip_int_suspend { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xcb>; + }; + }; + }; + + fragment@73 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x48 0x4a 0x4e 0x54 0x56 0x57 0x5b 0x5d 0x5f 0x62 0x6d 0x72 0x73 0x74 0x75 0x76>; + }; + }; + + fragment@74 { + target = <0xffffffff>; + + __overlay__ { + + qcom,pm6150@0 { + + qcom,power-on@800 { + interrupts = <0x0 0x8 0x0 0x0 0x0 0x8 0x1 0x0 0x0 0x8 0x4 0x0 0x0 0x8 0x5 0x0>; + interrupt-names = "kpdpwr", "resin", "resin-bark", "kpdpwr-resin-bark"; + qcom,s3-debounce = <0x80>; + + qcom,pon_1 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_2 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_3 { + qcom,pon-type = <0x3>; + qcom,support-reset = <0x1>; + qcom,pull-up = <0x1>; + qcom,s1-timer = <0x1a40>; + qcom,s2-timer = <0x3e8>; + qcom,s2-type = <0x8>; + qcom,use-bark; + }; + }; + }; + }; + }; + + fragment@75 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@76 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@77 { + target = <0xffffffff>; + + __overlay__ { + + sec_thermistor@0 { + compatible = "samsung,sec-ap-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "ap_therm"; + adc_array = <0x6a4 0x88e 0xa10 0xbe6 0xdff 0x1090 0x1381 0x16f4 0x1b1c 0x1fb9 0x247b 0x2a3c 0x309d 0x3706 0x3d9d 0x43e8 0x4aa6 0x50c4 0x564a 0x5b4e 0x5faf 0x6379 0x66aa>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@1 { + compatible = "samsung,sec-pa-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "pa_therm"; + adc_array = <0x708 0x8bf 0xa47 0xc19 0xe38 0x10c2 0x13c0 0x173d 0x1b5e 0x1fff 0x24cf 0x2a88 0x30de 0x3756 0x3dea 0x443d 0x4add 0x5100 0x5683 0x5b96 0x5fef 0x63ab 0x66d8>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@2 { + compatible = "samsung,sec-wf-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4f>; + io-channel-names = "wf_therm"; + adc_array = <0x708 0x8d5 0xa66 0xc35 0xe55 0x10d4 0x13e0 0x1766 0x1b81 0x2021 0x24f3 0x2aa3 0x30f4 0x376c 0x3e09 0x445e 0x4aec 0x5105 0x568c 0x5ba3 0x5ff9 0x63b4 0x66e0>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + i2c@2 { + cell-index = <0x2>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x19 0x0 0xffffffff 0x1a 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x61 0x62>; + phandle = <0xcc>; + + s2mpb03@56 { + compatible = "samsung,s2mpb03pmic"; + reg = <0x56>; + additional_reg_init; + + regulators { + + s2mpb03-ldo1 { + regulator-name = "s2mpb03-ldo1"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x100590>; + phandle = <0x95>; + }; + + s2mpb03-ldo2 { + regulator-name = "s2mpb03-ldo2"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x7c>; + }; + + s2mpb03-ldo3 { + regulator-name = "s2mpb03-ldo3"; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x7a>; + }; + + s2mpb03-ldo4 { + regulator-name = "s2mpb03-ldo4"; + regulator-min-microvolt = <0x124f80>; + regulator-max-microvolt = <0x124f80>; + phandle = <0x8c>; + }; + + s2mpb03-ldo5 { + regulator-name = "s2mpb03-ldo5"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x7b>; + }; + + s2mpb03-ldo6 { + regulator-name = "s2mpb03-ldo6"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x94>; + }; + + s2mpb03-ldo7 { + regulator-name = "s2mpb03-ldo7"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2ab980>; + phandle = <0x71>; + }; + }; + }; + }; + }; + }; + + fragment@78 { + target = <0xffffffff>; + + __overlay__ { + interrupts = <0x0 0xc0 0x0 0x0 0x0 0xc1 0x0 0x0 0x0 0xc2 0x0 0x0 0x0 0xc3 0x0 0x0 0x0 0xc4 0x0 0x0 0x0 0xc6 0x0 0x0 0x0 0xc7 0x0 0x0 0x0 0xc9 0x0 0x0>; + interrupt-names = "pm6150_gpio1", "pm6150_gpio2", "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio5", "pm6150_gpio7", "pm6150_gpio8", "pm6150_gpio10"; + qcom,gpios-disallowed = <0x6 0x9>; + }; + }; + + fragment@79 { + target = <0xffffffff>; + + __overlay__ { + + ap_therm { + reg = <0x4e>; + label = "ap_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@80 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm { + reg = <0x4e>; + label = "pa_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + + wf_therm { + reg = <0x4f>; + label = "wf_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@81 { + target = <0xffffffff>; + + __overlay__ { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x2dc6c0>; + regulator-boot-on; + }; + }; + + fragment@82 { + target = <0xffffffff>; + + __overlay__ { + + tsp_int { + phandle = <0x65>; + + mux { + pins = "gpio9"; + function = "gpio"; + }; + + config { + pins = "gpio9"; + input-enable; + bias-disable; + }; + }; + + qupv3_se7_i2c_pins_tsp { + phandle = <0xcd>; + + qupv3_se7_i2c_active_tsp { + phandle = <0x63>; + + mux { + pins = "gpio6", "gpio7"; + function = "qup11"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + qupv3_se7_i2c_sleep_tsp { + phandle = <0x64>; + + mux { + pins = "gpio6", "gpio7"; + function = "gpio"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <0x2>; + bias-disable; + }; + }; + }; + }; + }; + + fragment@83 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x63>; + pinctrl-1 = <0x64>; + + synaptics_tcm@20 { + status = "disabled"; + }; + + atmel_mxt_ts@4a { + status = "disabled"; + }; + + touchscreen@20 { + status = "disabled"; + compatible = "zinitix,zt_ts_device"; + reg = <0x20>; + pinctrl-names = "on_state", "off_state"; + pinctrl-0 = <0x65>; + pinctrl-1 = <0x65>; + avdd-supply = <0xffffffff>; + zinitix,gpio_ldo_en; + zinitix,irq_type = <0x2008>; + zinitix,x_resolution = <0x438>; + zinitix,y_resolution = <0x960>; + zinitix,page_size = <0x80>; + zinitix,irq_gpio = <0xffffffff 0x9 0x2008>; + zinitix,chip_name = "ZT7650"; + zinitix,firmware_name = "tsp_zinitix/zt7650_a52.bin"; + zinitix,spay; + zinitix,aod; + zinitix,aot; + zinitix,mis_cal_check; + support_ear_detect_mode; + support_dex_mode; + zinitix,bringup = <0x0>; + zinitix,ss_touch_num = <0x1>; + phandle = <0xce>; + }; + + touchscreen@49 { + status = "okay"; + compatible = "stm,fts_touch"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x65>; + dvdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + stm,irq_gpio = <0xffffffff 0x9 0x2008>; + stm,max_coords = <0xfff 0xfff>; + stm,firmware_name = "tsp_stm/fts5cu56a_a52.bin"; + stm,tclm_level = <0x2>; + stm,afe_base = <0x14>; + stm,bringup = <0x0>; + stm,support_fod; + stm,enable_settings_aot; + support_ear_detect; + support_mis_calibration_test; + support_dex_mode; + support_open_short_test; + support_sram_test; + stm,ss_touch_num = <0x1>; + phandle = <0xcf>; + }; + }; + }; + + fragment@84 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + + key_vol_up_default { + pins = "gpio8"; + function = "normal"; + input-enable; + bias-pull-up; + power-source = <0x0>; + phandle = <0x66>; + }; + }; + }; + }; + + fragment@85 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "default"; + pinctrl-0 = <0x66>; + + vol_up { + label = "volume_up"; + gpios = <0xffffffff 0x8 0x1>; + linux,input-type = <0x1>; + linux,code = <0x73>; + debounce-interval = <0xf>; + }; + }; + }; + + fragment@86 { + target = <0xffffffff>; + + __overlay__ { + + ss_touch { + compatible = "samsung,ss_touch"; + ss_touch,numbers = <0x1>; + }; + }; + }; + + fragment@87 { + target = <0xffffffff>; + + __overlay__ { + + self_display_FC3_dtsi { + label = "self_display_FC3_dtsi"; + samsung,support_self_display; + samsung,self_mask_setting_pre_revA = [29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 02 75 10]; + samsung,self_mask_setting_post_revA = [29 01 00 00 00 00 02 75 00]; + samsung,self_mask_on_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 00 00 00 95 07 9e 09 5f 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_on_factory_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_off_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_disp_debug_rx_cmds_revA = [06 01 00 00 00 00 01 7f 04 01]; + samsung,self_mask_check_tx_pre1_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 04 b0 00 27 d8 29 01 00 00 00 00 02 d8 16 29 01 00 00 00 00 0a bf 01 07 00 00 00 10 00 00 00 29 01 00 00 11 00 02 7a 00 29 01 00 00 00 00 02 75 10 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,self_mask_check_tx_pre2_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 02 75 00 29 01 00 00 22 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 01 f4 02 33 09 60 09 61 00 00 ff ff ff 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,mask_crc_pass_data = [d3 9b]; + samsung,self_mask_check_rx_cmds_revA = [06 01 00 00 00 00 01 14 02 00]; + samsung,self_mask_check_tx_post_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 00 00 00 00 00 29 01 00 00 00 00 02 bf 00 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + phandle = <0x67>; + }; + }; + }; + + fragment@88 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + label = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0x1e6>; + qcom,mdss-brightness-max-level = <0x1e6>; + qcom,mdss-brightness-default-level = <0xff>; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-t-clk-pre = <0x3e>; + qcom,mdss-dsi-t-clk-post = <0x10>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x43>; + qcom,mdss-pan-physical-height-dimension = <0x96>; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-t-clk-pre-extend; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "irq_check"; + samsung,panel-vendor = "SDC"; + samsung,disp-model = "AMS646YD01"; + samsung,support_gamma_mode2; + samsung,skip_read_on_pre; + samsung,elvss_interpolation_temperature = <0xfffffff0>; + samsung,support_lpm; + samsung,support_gpara; + samsung,pointing_gpara; + samsung,two_byte_gpara; + samsung,rsc_4_frame_idle; + samsung,support_factory_panel_swap; + samsung,support-optical-fingerprint; + samsung,delayed-display-on = <0x1>; + samsung,support_vrr_based_bl; + samsung,esd-irq-trigger1 = "falling"; + ss,self_display = <0x67>; + samsung,level0_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 9f a5 a5]; + samsung,level0_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 9f 5a 5a]; + samsung,level1_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 5a 5a]; + samsung,level1_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 a5 a5]; + samsung,level2_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 fc 5a 5a]; + samsung,level2_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 fc a5 a5]; + samsung,brightness_tx_cmds_revA = <0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100>; + samsung,display_on_tx_cmds_revA = [29 00 00 00 00 00 03 9f a5 a5 05 00 00 00 00 00 02 29 00 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,display_off_tx_cmds_revA = [05 01 00 00 00 00 02 28 00]; + samsung,reg_read_pos_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 00 00]; + samsung,mtp_write_sysfs_tx_cmds_revA = <0x29000000 0x3d00 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + samsung,panel_ltps_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 50 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,smooth_dimming_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 91 63 29 00 00 00 00 00 02 63 20 29 01 00 00 11 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,gamma_mode2_normal_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26360 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x7290000 0x2 0x53202900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0002900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revE = <0x29000000 0x391 0x2012900 0x0 0x2532029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 1c 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,gamma_mode2_hbm_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26320 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x290000 0x2 0x53e02900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0072900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revE = <0x29000000 0x391 0x2002900 0x0 0x253e029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 14 29 00 00 00 00 00 02 53 e0 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,vrr_tx_cmds_revD = [29 00 00 00 00 00 03 60 00 04 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 b4 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a c0 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 02 29 00 00 00 00 00 02 f7 0f]; + samsung,vrr_tx_cmds_revA = [29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f]; + samsung,acl_on_tx_cmds_revA = [29 00 00 00 00 00 04 b0 03 b3 65 29 00 00 00 00 00 14 65 55 00 b0 51 66 98 15 55 55 55 08 f1 c6 48 40 00 20 10 09 29 00 00 00 00 00 02 55 03]; + samsung,acl_off_tx_cmds_revA = [29 01 00 00 00 00 02 55 00]; + samsung,manufacture_id0_rx_cmds_revA = [06 01 00 00 00 00 01 da 01 00 00]; + samsung,manufacture_id1_rx_cmds_revA = [06 01 00 00 00 00 01 db 01 00 00]; + samsung,manufacture_id2_rx_cmds_revA = [06 01 00 00 00 00 01 dc 01 00 00]; + samsung,module_info_rx_cmds_revA = [06 01 00 00 00 00 01 a1 0b 00 00]; + samsung,octa_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 04 00 0b]; + samsung,cell_id_rx_cmds_revA = [06 01 00 00 00 00 01 92 10 00 02]; + samsung,ddi_id_rx_cmds_revA = [06 01 00 00 00 00 01 d6 05 00 00]; + samsung,mtp_read_sysfs_rx_cmds_revA = [06 01 00 00 00 00 01 00 00 00 00]; + samsung,candela_map_table_revA = <0x0 0x0 0x0 0x2 0x2 0x1 0x1 0x1 0x3 0x2 0x2 0x2 0x2 0x4 0x3 0x3 0x3 0x3 0x5 0x3 0x4 0x4 0x4 0x7 0x4 0x5 0x5 0x5 0x8 0x5 0x6 0x6 0x6 0xa 0x5 0x7 0x7 0x7 0xc 0x6 0x8 0x8 0x8 0xd 0x7 0x9 0x9 0x9 0xf 0x7 0xa 0xa 0xa 0x11 0x8 0xb 0xb 0xb 0x13 0x9 0xc 0xc 0xc 0x15 0xa 0xd 0xd 0xd 0x18 0xb 0xe 0xe 0xe 0x1a 0xc 0xf 0xf 0xf 0x1c 0xd 0x10 0x10 0x10 0x1e 0xd 0x11 0x11 0x11 0x20 0xe 0x12 0x12 0x12 0x23 0xf 0x13 0x13 0x13 0x25 0x10 0x14 0x14 0x14 0x28 0x11 0x15 0x15 0x15 0x2a 0x12 0x16 0x16 0x16 0x2d 0x13 0x17 0x17 0x17 0x2f 0x14 0x18 0x18 0x18 0x32 0x15 0x19 0x19 0x19 0x34 0x16 0x1a 0x1a 0x1a 0x37 0x17 0x1b 0x1b 0x1b 0x3a 0x19 0x1c 0x1c 0x1c 0x3c 0x1a 0x1d 0x1d 0x1d 0x3f 0x1b 0x1e 0x1e 0x1e 0x42 0x1c 0x1f 0x1f 0x1f 0x45 0x1d 0x20 0x20 0x20 0x47 0x1e 0x21 0x21 0x21 0x4a 0x1f 0x22 0x22 0x22 0x4d 0x20 0x23 0x23 0x23 0x50 0x22 0x24 0x24 0x24 0x53 0x23 0x25 0x25 0x25 0x56 0x24 0x26 0x26 0x26 0x59 0x25 0x27 0x27 0x27 0x5c 0x26 0x28 0x28 0x28 0x5f 0x28 0x29 0x29 0x29 0x62 0x29 0x2a 0x2a 0x2a 0x65 0x2a 0x2b 0x2b 0x2b 0x68 0x2b 0x2c 0x2c 0x2c 0x6b 0x2d 0x2d 0x2d 0x2d 0x6e 0x2e 0x2e 0x2e 0x2e 0x71 0x2f 0x2f 0x2f 0x2f 0x74 0x30 0x30 0x30 0x30 0x77 0x32 0x31 0x31 0x31 0x7b 0x33 0x32 0x32 0x32 0x7e 0x34 0x33 0x33 0x33 0x81 0x36 0x34 0x34 0x34 0x84 0x37 0x35 0x35 0x35 0x88 0x38 0x36 0x36 0x36 0x8b 0x3a 0x37 0x37 0x37 0x8e 0x3b 0x38 0x38 0x38 0x92 0x3c 0x39 0x39 0x39 0x95 0x3e 0x3a 0x3a 0x3a 0x98 0x3f 0x3b 0x3b 0x3b 0x9c 0x40 0x3c 0x3c 0x3c 0x9f 0x42 0x3d 0x3d 0x3d 0xa2 0x43 0x3e 0x3e 0x3e 0xa6 0x44 0x3f 0x3f 0x3f 0xa9 0x46 0x40 0x40 0x40 0xad 0x47 0x41 0x41 0x41 0xb0 0x49 0x42 0x42 0x42 0xb4 0x4a 0x43 0x43 0x43 0xb7 0x4c 0x44 0x44 0x44 0xbb 0x4d 0x45 0x45 0x45 0xbe 0x4e 0x46 0x46 0x46 0xc2 0x50 0x47 0x47 0x47 0xc5 0x51 0x48 0x48 0x48 0xc9 0x53 0x49 0x49 0x49 0xcd 0x54 0x4a 0x4a 0x4a 0xd0 0x56 0x4b 0x4b 0x4b 0xd4 0x57 0x4c 0x4c 0x4c 0xd7 0x59 0x4d 0x4d 0x4d 0xdb 0x5a 0x4e 0x4e 0x4e 0xdf 0x5c 0x4f 0x4f 0x4f 0xe3 0x5d 0x50 0x50 0x50 0xe6 0x5f 0x51 0x51 0x51 0xea 0x60 0x52 0x52 0x52 0xee 0x62 0x53 0x53 0x53 0xf1 0x63 0x54 0x54 0x54 0xf5 0x65 0x55 0x55 0x55 0xf9 0x66 0x56 0x56 0x56 0xfd 0x68 0x57 0x57 0x57 0x101 0x69 0x58 0x58 0x58 0x104 0x6b 0x59 0x59 0x59 0x108 0x6c 0x5a 0x5a 0x5a 0x10c 0x6e 0x5b 0x5b 0x5b 0x110 0x70 0x5c 0x5c 0x5c 0x114 0x71 0x5d 0x5d 0x5d 0x118 0x73 0x5e 0x5e 0x5e 0x11b 0x74 0x5f 0x5f 0x5f 0x11f 0x76 0x60 0x60 0x60 0x123 0x77 0x61 0x61 0x61 0x127 0x79 0x62 0x62 0x62 0x12b 0x7b 0x63 0x63 0x63 0x12f 0x7c 0x64 0x64 0x64 0x133 0x7e 0x65 0x65 0x65 0x137 0x7f 0x66 0x66 0x66 0x13b 0x81 0x67 0x67 0x67 0x13f 0x83 0x68 0x68 0x68 0x143 0x84 0x69 0x69 0x69 0x147 0x86 0x6a 0x6a 0x6a 0x14b 0x88 0x6b 0x6b 0x6b 0x14f 0x89 0x6c 0x6c 0x6c 0x153 0x8b 0x6d 0x6d 0x6d 0x157 0x8c 0x6e 0x6e 0x6e 0x15b 0x8e 0x6f 0x6f 0x6f 0x15f 0x90 0x70 0x70 0x70 0x163 0x91 0x71 0x71 0x71 0x168 0x93 0x72 0x72 0x72 0x16c 0x95 0x73 0x73 0x73 0x170 0x96 0x74 0x74 0x74 0x174 0x98 0x75 0x75 0x75 0x178 0x9a 0x76 0x76 0x76 0x17c 0x9c 0x77 0x77 0x77 0x180 0x9d 0x78 0x78 0x78 0x185 0x9f 0x79 0x79 0x79 0x189 0xa1 0x7a 0x7a 0x7a 0x18d 0xa2 0x7b 0x7b 0x7b 0x191 0xa4 0x7c 0x7c 0x7c 0x195 0xa6 0x7d 0x7d 0x7d 0x19a 0xa7 0x7e 0x7e 0x7e 0x19e 0xa9 0x7f 0x7f 0x7f 0x1a2 0xab 0x80 0x80 0x80 0x1a6 0xad 0x81 0x81 0x81 0x1ab 0xae 0x82 0x82 0x82 0x1af 0xb0 0x83 0x83 0x83 0x1b3 0xb2 0x84 0x84 0x84 0x1b8 0xb4 0x85 0x85 0x85 0x1bc 0xb5 0x86 0x86 0x86 0x1c0 0xb7 0x87 0x87 0x87 0x1c5 0xb9 0x88 0x88 0x88 0x1c9 0xbb 0x89 0x89 0x89 0x1cd 0xbc 0x8a 0x8a 0x8a 0x1d1 0xbe 0x8b 0x8b 0x8b 0x1d6 0xc0 0x8c 0x8c 0x8c 0x1da 0xc2 0x8d 0x8d 0x8d 0x1de 0xc3 0x8e 0x8e 0x8e 0x1e3 0xc5 0x8f 0x8f 0x8f 0x1e7 0xc7 0x90 0x90 0x90 0x1eb 0xc9 0x91 0x91 0x91 0x1f0 0xcb 0x92 0x92 0x92 0x1f4 0xcc 0x93 0x93 0x93 0x1f8 0xce 0x94 0x94 0x94 0x1fd 0xd0 0x95 0x95 0x95 0x201 0xd2 0x96 0x96 0x96 0x206 0xd4 0x97 0x97 0x97 0x20a 0xd6 0x98 0x98 0x98 0x20e 0xd7 0x99 0x99 0x99 0x213 0xd9 0x9a 0x9a 0x9a 0x217 0xdb 0x9b 0x9b 0x9b 0x21c 0xdd 0x9c 0x9c 0x9c 0x220 0xdf 0x9d 0x9d 0x9d 0x225 0xe1 0x9e 0x9e 0x9e 0x229 0xe2 0x9f 0x9f 0x9f 0x22e 0xe4 0xa0 0xa0 0xa0 0x232 0xe6 0xa1 0xa1 0xa1 0x237 0xe8 0xa2 0xa2 0xa2 0x23b 0xea 0xa3 0xa3 0xa3 0x240 0xec 0xa4 0xa4 0xa4 0x244 0xed 0xa5 0xa5 0xa5 0x249 0xef 0xa6 0xa6 0xa6 0x24d 0xf1 0xa7 0xa7 0xa7 0x252 0xf3 0xa8 0xa8 0xa8 0x256 0xf5 0xa9 0xa9 0xa9 0x25b 0xf7 0xaa 0xaa 0xaa 0x260 0xf9 0xab 0xab 0xab 0x264 0xfb 0xac 0xac 0xac 0x269 0xfd 0xad 0xad 0xad 0x26d 0xfe 0xae 0xae 0xae 0x272 0x100 0xaf 0xaf 0xaf 0x277 0x102 0xb0 0xb0 0xb0 0x27b 0x104 0xb1 0xb1 0xb1 0x280 0x106 0xb2 0xb2 0xb2 0x284 0x108 0xb3 0xb3 0xb3 0x289 0x10a 0xb4 0xb4 0xb4 0x28e 0x10c 0xb5 0xb5 0xb5 0x292 0x10e 0xb6 0xb6 0xb6 0x297 0x110 0xb7 0xb7 0xb7 0x29c 0x112 0xb8 0xb8 0xb8 0x2a0 0x113 0xb9 0xb9 0xb9 0x2a5 0x115 0xba 0xba 0xba 0x2aa 0x117 0xbb 0xbb 0xbb 0x2ae 0x119 0xbc 0xbc 0xbc 0x2b3 0x11b 0xbd 0xbd 0xbd 0x2b8 0x11d 0xbe 0xbe 0xbe 0x2bd 0x11f 0xbf 0xbf 0xbf 0x2c1 0x121 0xc0 0xc0 0xc0 0x2c6 0x123 0xc1 0xc1 0xc1 0x2cb 0x125 0xc2 0xc2 0xc2 0x2d0 0x127 0xc3 0xc3 0xc3 0x2d4 0x129 0xc4 0xc4 0xc4 0x2d9 0x12b 0xc5 0xc5 0xc5 0x2de 0x12d 0xc6 0xc6 0xc6 0x2e3 0x12f 0xc7 0xc7 0xc7 0x2e8 0x131 0xc8 0xc8 0xc8 0x2ec 0x133 0xc9 0xc9 0xc9 0x2f1 0x135 0xca 0xca 0xca 0x2f6 0x137 0xcb 0xcb 0xcb 0x2fb 0x139 0xcc 0xcc 0xcc 0x300 0x13b 0xcd 0xcd 0xcd 0x304 0x13d 0xce 0xce 0xce 0x309 0x13f 0xcf 0xcf 0xcf 0x30e 0x141 0xd0 0xd0 0xd0 0x313 0x143 0xd1 0xd1 0xd1 0x318 0x145 0xd2 0xd2 0xd2 0x31d 0x147 0xd3 0xd3 0xd3 0x322 0x149 0xd4 0xd4 0xd4 0x327 0x14b 0xd5 0xd5 0xd5 0x32b 0x14d 0xd6 0xd6 0xd6 0x330 0x14f 0xd7 0xd7 0xd7 0x335 0x151 0xd8 0xd8 0xd8 0x33a 0x153 0xd9 0xd9 0xd9 0x33f 0x155 0xda 0xda 0xda 0x344 0x157 0xdb 0xdb 0xdb 0x349 0x159 0xdc 0xdc 0xdc 0x34e 0x15b 0xdd 0xdd 0xdd 0x353 0x15d 0xde 0xde 0xde 0x358 0x15f 0xdf 0xdf 0xdf 0x35d 0x161 0xe0 0xe0 0xe0 0x362 0x163 0xe1 0xe1 0xe1 0x367 0x165 0xe2 0xe2 0xe2 0x36c 0x167 0xe3 0xe3 0xe3 0x371 0x169 0xe4 0xe4 0xe4 0x376 0x16b 0xe5 0xe5 0xe5 0x37b 0x16d 0xe6 0xe6 0xe6 0x380 0x170 0xe7 0xe7 0xe7 0x385 0x172 0xe8 0xe8 0xe8 0x38a 0x174 0xe9 0xe9 0xe9 0x38f 0x176 0xea 0xea 0xea 0x394 0x178 0xeb 0xeb 0xeb 0x399 0x17a 0xec 0xec 0xec 0x39e 0x17c 0xed 0xed 0xed 0x3a3 0x17e 0xee 0xee 0xee 0x3a8 0x180 0xef 0xef 0xef 0x3ad 0x182 0xf0 0xf0 0xf0 0x3b2 0x184 0xf1 0xf1 0xf1 0x3b7 0x186 0xf2 0xf2 0xf2 0x3bc 0x189 0xf3 0xf3 0xf3 0x3c1 0x18b 0xf4 0xf4 0xf4 0x3c7 0x18d 0xf5 0xf5 0xf5 0x3cc 0x18f 0xf6 0xf6 0xf6 0x3d1 0x191 0xf7 0xf7 0xf7 0x3d6 0x193 0xf8 0xf8 0xf8 0x3db 0x195 0xf9 0xf9 0xf9 0x3e0 0x197 0xfa 0xfa 0xfa 0x3e5 0x199 0xfb 0xfb 0xfb 0x3ea 0x19b 0xfc 0xfc 0xfc 0x3f0 0x19e 0xfd 0xfd 0xfd 0x3f5 0x1a0 0xfe 0xfe 0xfe 0x3fa 0x1a2 0xff 0xff 0xff 0x3ff 0x1a4>; + samsung,hbm_candela_map_table_revG = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x2 0x1aa 0x2 0x102 0x102 0x4 0x1ac 0x3 0x103 0x103 0x6 0x1ae 0x4 0x104 0x104 0x8 0x1b0 0x5 0x105 0x105 0xa 0x1b1 0x6 0x106 0x106 0xc 0x1b3 0x7 0x107 0x107 0xe 0x1b4 0x8 0x108 0x108 0x10 0x1b6 0x9 0x109 0x109 0x12 0x1b8 0xa 0x10a 0x10a 0x14 0x1b9 0xb 0x10b 0x10b 0x16 0x1bb 0xc 0x10c 0x10c 0x18 0x1bc 0xd 0x10d 0x10d 0x1a 0x1be 0xe 0x10e 0x10e 0x1c 0x1c0 0xf 0x10f 0x10f 0x1e 0x1c2 0x10 0x110 0x110 0x20 0x1c3 0x11 0x111 0x111 0x22 0x1c5 0x12 0x112 0x112 0x24 0x1c6 0x13 0x113 0x113 0x25 0x1c8 0x14 0x114 0x114 0x26 0x1ca 0x15 0x115 0x115 0x27 0x1cb 0x16 0x116 0x116 0x28 0x1cd 0x17 0x117 0x117 0x29 0x1ce 0x18 0x118 0x118 0x2a 0x1d0 0x19 0x119 0x119 0x2b 0x1d2 0x1a 0x11a 0x11a 0x2c 0x1d4 0x1b 0x11b 0x11b 0x2d 0x1d5 0x1c 0x11c 0x11c 0x2e 0x1d7 0x1d 0x11d 0x11d 0x2f 0x1d8 0x1e 0x11e 0x11e 0x30 0x1da 0x1f 0x11f 0x11f 0x31 0x1dc 0x20 0x120 0x120 0x32 0x1dd 0x21 0x121 0x121 0x33 0x1df 0x22 0x122 0x122 0x34 0x1e0 0x23 0x123 0x123 0x35 0x1e2 0x24 0x124 0x124 0x36 0x1e4 0x25 0x125 0x125 0x37 0x1e5 0x26 0x126 0x126 0x38 0x1e7 0x27 0x127 0x127 0x39 0x1e8 0x28 0x128 0x128 0x3a 0x1ea 0x29 0x129 0x129 0x3b 0x1ec 0x2a 0x12a 0x12a 0x3c 0x1ee 0x2b 0x12b 0x12b 0x3d 0x1ef 0x2c 0x12c 0x12c 0x3e 0x1f1 0x2d 0x12d 0x12d 0x3f 0x1f2 0x2e 0x12e 0x12e 0x40 0x1f4 0x2f 0x12f 0x12f 0x41 0x1f6 0x30 0x130 0x130 0x42 0x1f7 0x31 0x131 0x131 0x43 0x1f9 0x32 0x132 0x132 0x44 0x1fa 0x33 0x133 0x133 0x45 0x1fc 0x34 0x134 0x134 0x46 0x1fe 0x35 0x135 0x135 0x47 0x200 0x36 0x136 0x136 0x48 0x201 0x37 0x137 0x137 0x49 0x203 0x38 0x138 0x138 0x4a 0x204 0x39 0x139 0x139 0x4b 0x206 0x3a 0x13a 0x13a 0x4c 0x208 0x3b 0x13b 0x13b 0x4d 0x209 0x3c 0x13c 0x13c 0x4e 0x20b 0x3d 0x13d 0x13d 0x4f 0x20c 0x3e 0x13e 0x13e 0x50 0x20e 0x3f 0x13f 0x13f 0x51 0x210 0x40 0x140 0x140 0x52 0x211 0x41 0x141 0x141 0x53 0x213 0x42 0x142 0x142 0x54 0x215 0x43 0x143 0x143 0x55 0x216 0x44 0x144 0x144 0x56 0x218 0x45 0x145 0x145 0x57 0x21a 0x46 0x146 0x146 0x58 0x21b 0x47 0x147 0x147 0x59 0x21d 0x48 0x148 0x148 0x5a 0x21e 0x49 0x149 0x149 0x5b 0x220 0x4a 0x14a 0x14a 0x5c 0x222 0x4b 0x14b 0x14b 0x5d 0x223 0x4c 0x14c 0x14c 0x5f 0x225 0x4d 0x14d 0x14d 0x61 0x226 0x4e 0x14e 0x14e 0x63 0x228 0x4f 0x14f 0x14f 0x65 0x22a 0x50 0x150 0x150 0x67 0x22b 0x51 0x151 0x151 0x69 0x22d 0x52 0x152 0x152 0x6b 0x22f 0x53 0x153 0x153 0x6d 0x230 0x54 0x154 0x154 0x6f 0x232 0x55 0x155 0x155 0x71 0x234 0x56 0x156 0x156 0x73 0x235 0x57 0x157 0x157 0x75 0x237 0x58 0x158 0x158 0x77 0x238 0x59 0x159 0x159 0x79 0x23a 0x5a 0x15a 0x15a 0x7b 0x23c 0x5b 0x15b 0x15b 0x7d 0x23d 0x5c 0x15c 0x15c 0x7f 0x23f 0x5d 0x15d 0x15d 0x81 0x241 0x5e 0x15e 0x15e 0x83 0x242 0x5f 0x15f 0x15f 0x85 0x244 0x60 0x160 0x160 0x87 0x246 0x61 0x161 0x161 0x89 0x247 0x62 0x162 0x162 0x8b 0x249 0x63 0x163 0x163 0x8d 0x24a 0x64 0x164 0x164 0x8f 0x24c 0x65 0x165 0x165 0x91 0x24e 0x66 0x166 0x166 0x93 0x24f 0x67 0x167 0x167 0x95 0x251 0x68 0x168 0x168 0x97 0x253 0x69 0x169 0x169 0x9a 0x254 0x6a 0x16a 0x16a 0x9d 0x256 0x6b 0x16b 0x16b 0xa0 0x257 0x6c 0x16c 0x16c 0xa3 0x259 0x6d 0x16d 0x16d 0xa6 0x25b 0x6e 0x16e 0x16e 0xa8 0x25c 0x6f 0x16f 0x16f 0xab 0x25e 0x70 0x170 0x170 0xae 0x260 0x71 0x171 0x171 0xb1 0x261 0x72 0x172 0x172 0xb4 0x263 0x73 0x173 0x173 0xb7 0x264 0x74 0x174 0x174 0xba 0x266 0x75 0x175 0x175 0xbd 0x268 0x76 0x176 0x176 0xc0 0x269 0x77 0x177 0x177 0xc3 0x26b 0x78 0x178 0x178 0xc6 0x26d 0x79 0x179 0x179 0xc9 0x26e 0x7a 0x17a 0x17a 0xcc 0x270 0x7b 0x17b 0x17b 0xcf 0x272 0x7c 0x17c 0x17c 0xd2 0x273 0x7d 0x17d 0x17d 0xd5 0x275 0x7e 0x17e 0x17e 0xd8 0x276 0x7f 0x17f 0x17f 0xdb 0x278 0x80 0x180 0x180 0xde 0x27a 0x81 0x181 0x181 0xe1 0x27b 0x82 0x182 0x182 0xe4 0x27d 0x83 0x183 0x183 0xe7 0x27f 0x84 0x184 0x184 0xea 0x280 0x85 0x185 0x185 0xed 0x282 0x86 0x186 0x186 0xf0 0x283 0x87 0x187 0x187 0xf3 0x285 0x88 0x188 0x188 0xf6 0x287 0x89 0x189 0x189 0xf9 0x288 0x8a 0x18a 0x18a 0xfc 0x28a 0x8b 0x18b 0x18b 0xff 0x28c 0x8c 0x18c 0x18c 0x102 0x28d 0x8d 0x18d 0x18d 0x105 0x28f 0x8e 0x18e 0x18e 0x108 0x291 0x8f 0x18f 0x18f 0x10b 0x292 0x90 0x190 0x190 0x10e 0x294 0x91 0x191 0x191 0x111 0x295 0x92 0x192 0x192 0x114 0x297 0x93 0x193 0x193 0x117 0x299 0x94 0x194 0x194 0x11a 0x29a 0x95 0x195 0x195 0x11d 0x29c 0x96 0x196 0x196 0x120 0x29e 0x97 0x197 0x197 0x123 0x29f 0x98 0x198 0x198 0x126 0x2a1 0x99 0x199 0x199 0x129 0x2a3 0x9a 0x19a 0x19a 0x12c 0x2a4 0x9b 0x19b 0x19b 0x12f 0x2a6 0x9c 0x19c 0x19c 0x132 0x2a7 0x9d 0x19d 0x19d 0x135 0x2a9 0x9e 0x19e 0x19e 0x138 0x2ab 0x9f 0x19f 0x19f 0x13b 0x2ac 0xa0 0x1a0 0x1a0 0x13e 0x2ae 0xa1 0x1a1 0x1a1 0x141 0x2af 0xa2 0x1a2 0x1a2 0x144 0x2b1 0xa3 0x1a3 0x1a3 0x147 0x2b3 0xa4 0x1a4 0x1a4 0x14a 0x2b4 0xa5 0x1a5 0x1a5 0x14d 0x2b6 0xa6 0x1a6 0x1a6 0x150 0x2b8 0xa7 0x1a7 0x1a7 0x153 0x2b9 0xa8 0x1a8 0x1a8 0x156 0x2bb 0xa9 0x1a9 0x1a9 0x159 0x2bd 0xaa 0x1aa 0x1aa 0x15c 0x2be 0xab 0x1ab 0x1ab 0x15f 0x2c0 0xac 0x1ac 0x1ac 0x162 0x2c1 0xad 0x1ad 0x1ad 0x165 0x2c3 0xae 0x1ae 0x1ae 0x168 0x2c5 0xaf 0x1af 0x1af 0x16b 0x2c6 0xb0 0x1b0 0x1b0 0x16e 0x2c8 0xb1 0x1b1 0x1b1 0x171 0x2c9 0xb2 0x1b2 0x1b2 0x174 0x2cb 0xb3 0x1b3 0x1b3 0x177 0x2cd 0xb4 0x1b4 0x1b4 0x17a 0x2cf 0xb5 0x1b5 0x1b5 0x17d 0x2d0 0xb6 0x1b6 0x1b6 0x180 0x2d2 0xb7 0x1b7 0x1b7 0x183 0x2d3 0xb8 0x1b8 0x1b8 0x186 0x2d5 0xb9 0x1b9 0x1b9 0x189 0x2d7 0xba 0x1ba 0x1ba 0x18c 0x2d8 0xbb 0x1bb 0x1bb 0x18f 0x2da 0xbc 0x1bc 0x1bc 0x192 0x2db 0xbd 0x1bd 0x1bd 0x195 0x2dd 0xbe 0x1be 0x1be 0x198 0x2df 0xbf 0x1bf 0x1bf 0x19b 0x2e1 0xc0 0x1c0 0x1c0 0x19e 0x2e2 0xc1 0x1c1 0x1c1 0x1a1 0x2e4 0xc2 0x1c2 0x1c2 0x1a4 0x2e5 0xc3 0x1c3 0x1c3 0x1a7 0x2e7 0xc4 0x1c4 0x1c4 0x1aa 0x2e9 0xc5 0x1c5 0x1c5 0x1ad 0x2ea 0xc6 0x1c6 0x1c6 0x1b0 0x2ec 0xc7 0x1c7 0x1c7 0x1b3 0x2ed 0xc8 0x1c8 0x1c8 0x1b6 0x2ef 0xc9 0x1c9 0x1c9 0x1b9 0x2f1 0xca 0x1ca 0x1ca 0x1bc 0x2f2 0xcb 0x1cb 0x1cb 0x1bf 0x2f4 0xcc 0x1cc 0x1cc 0x1c2 0x2f5 0xcd 0x1cd 0x1cd 0x1c5 0x2f7 0xce 0x1ce 0x1ce 0x1c8 0x2f9 0xcf 0x1cf 0x1cf 0x1cb 0x2fb 0xd0 0x1d0 0x1d0 0x1ce 0x2fc 0xd1 0x1d1 0x1d1 0x1d1 0x2fe 0xd2 0x1d2 0x1d2 0x1d4 0x2ff 0xd3 0x1d3 0x1d3 0x1d7 0x301 0xd4 0x1d4 0x1d4 0x1da 0x303 0xd5 0x1d5 0x1d5 0x1dd 0x304 0xd6 0x1d6 0x1d6 0x1e0 0x306 0xd7 0x1d7 0x1d7 0x1e3 0x307 0xd8 0x1d8 0x1d8 0x1e6 0x309 0xd9 0x1d9 0x1d9 0x1e9 0x30b 0xda 0x1da 0x1da 0x1ec 0x30d 0xdb 0x1db 0x1db 0x1ef 0x30e 0xdc 0x1dc 0x1dc 0x1f2 0x310 0xdd 0x1dd 0x1dd 0x1f5 0x311 0xde 0x1de 0x1de 0x1f8 0x313 0xdf 0x1df 0x1df 0x1fb 0x315 0xe0 0x1e0 0x1e0 0x1fe 0x316 0xe1 0x1e1 0x1e1 0x201 0x318 0xe2 0x1e2 0x1e2 0x204 0x319 0xe3 0x1e3 0x1e3 0x207 0x31b 0xe4 0x1e4 0x1e4 0x20a 0x31d 0xe5 0x1e5 0x1e5 0x20d 0x31f 0xe6 0x1e6 0x1e6 0x210 0x320>; + samsung,hbm_candela_map_table_revA = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x3 0x1aa 0x2 0x102 0x102 0x6 0x1ac 0x3 0x103 0x103 0x9 0x1ae 0x4 0x104 0x104 0xc 0x1b0 0x5 0x105 0x105 0xf 0x1b1 0x6 0x106 0x106 0x12 0x1b3 0x7 0x107 0x107 0x15 0x1b4 0x8 0x108 0x108 0x18 0x1b6 0x9 0x109 0x109 0x1b 0x1b8 0xa 0x10a 0x10a 0x1e 0x1b9 0xb 0x10b 0x10b 0x21 0x1bb 0xc 0x10c 0x10c 0x24 0x1bc 0xd 0x10d 0x10d 0x27 0x1be 0xe 0x10e 0x10e 0x2a 0x1c0 0xf 0x10f 0x10f 0x2d 0x1c2 0x10 0x110 0x110 0x30 0x1c3 0x11 0x111 0x111 0x33 0x1c5 0x12 0x112 0x112 0x36 0x1c6 0x13 0x113 0x113 0x39 0x1c8 0x14 0x114 0x114 0x3c 0x1ca 0x15 0x115 0x115 0x3f 0x1cb 0x16 0x116 0x116 0x42 0x1cd 0x17 0x117 0x117 0x45 0x1ce 0x18 0x118 0x118 0x48 0x1d0 0x19 0x119 0x119 0x4b 0x1d2 0x1a 0x11a 0x11a 0x4e 0x1d4 0x1b 0x11b 0x11b 0x51 0x1d5 0x1c 0x11c 0x11c 0x54 0x1d7 0x1d 0x11d 0x11d 0x56 0x1d8 0x1e 0x11e 0x11e 0x58 0x1da 0x1f 0x11f 0x11f 0x5a 0x1dc 0x20 0x120 0x120 0x5c 0x1dd 0x21 0x121 0x121 0x5e 0x1df 0x22 0x122 0x122 0x60 0x1e0 0x23 0x123 0x123 0x62 0x1e2 0x24 0x124 0x124 0x64 0x1e4 0x25 0x125 0x125 0x66 0x1e5 0x26 0x126 0x126 0x68 0x1e7 0x27 0x127 0x127 0x6a 0x1e8 0x28 0x128 0x128 0x6c 0x1ea 0x29 0x129 0x129 0x6e 0x1ec 0x2a 0x12a 0x12a 0x70 0x1ee 0x2b 0x12b 0x12b 0x72 0x1ef 0x2c 0x12c 0x12c 0x74 0x1f1 0x2d 0x12d 0x12d 0x76 0x1f2 0x2e 0x12e 0x12e 0x78 0x1f4 0x2f 0x12f 0x12f 0x7a 0x1f6 0x30 0x130 0x130 0x7c 0x1f7 0x31 0x131 0x131 0x7e 0x1f9 0x32 0x132 0x132 0x80 0x1fa 0x33 0x133 0x133 0x82 0x1fc 0x34 0x134 0x134 0x84 0x1fe 0x35 0x135 0x135 0x86 0x200 0x36 0x136 0x136 0x88 0x201 0x37 0x137 0x137 0x8a 0x203 0x38 0x138 0x138 0x8c 0x204 0x39 0x139 0x139 0x8e 0x206 0x3a 0x13a 0x13a 0x90 0x208 0x3b 0x13b 0x13b 0x92 0x209 0x3c 0x13c 0x13c 0x94 0x20b 0x3d 0x13d 0x13d 0x96 0x20c 0x3e 0x13e 0x13e 0x98 0x20e 0x3f 0x13f 0x13f 0x9a 0x210 0x40 0x140 0x140 0x9c 0x211 0x41 0x141 0x141 0x9e 0x213 0x42 0x142 0x142 0xa0 0x215 0x43 0x143 0x143 0xa2 0x216 0x44 0x144 0x144 0xa4 0x218 0x45 0x145 0x145 0xa6 0x21a 0x46 0x146 0x146 0xa8 0x21b 0x47 0x147 0x147 0xaa 0x21d 0x48 0x148 0x148 0xac 0x21e 0x49 0x149 0x149 0xae 0x220 0x4a 0x14a 0x14a 0xb0 0x222 0x4b 0x14b 0x14b 0xb2 0x223 0x4c 0x14c 0x14c 0xb6 0x225 0x4d 0x14d 0x14d 0xba 0x226 0x4e 0x14e 0x14e 0xbe 0x228 0x4f 0x14f 0x14f 0xc2 0x22a 0x50 0x150 0x150 0xc6 0x22b 0x51 0x151 0x151 0xcb 0x22d 0x52 0x152 0x152 0xd0 0x22f 0x53 0x153 0x153 0xd5 0x230 0x54 0x154 0x154 0xda 0x232 0x55 0x155 0x155 0xdf 0x234 0x56 0x156 0x156 0xe4 0x235 0x57 0x157 0x157 0xe9 0x237 0x58 0x158 0x158 0xee 0x238 0x59 0x159 0x159 0xf3 0x23a 0x5a 0x15a 0x15a 0xf8 0x23c 0x5b 0x15b 0x15b 0xfd 0x23d 0x5c 0x15c 0x15c 0x102 0x23f 0x5d 0x15d 0x15d 0x107 0x241 0x5e 0x15e 0x15e 0x10c 0x242 0x5f 0x15f 0x15f 0x111 0x244 0x60 0x160 0x160 0x116 0x246 0x61 0x161 0x161 0x11b 0x247 0x62 0x162 0x162 0x120 0x249 0x63 0x163 0x163 0x125 0x24a 0x64 0x164 0x164 0x12a 0x24c 0x65 0x165 0x165 0x12f 0x24e 0x66 0x166 0x166 0x134 0x24f 0x67 0x167 0x167 0x139 0x251 0x68 0x168 0x168 0x13e 0x253 0x69 0x169 0x169 0x143 0x254 0x6a 0x16a 0x16a 0x148 0x256 0x6b 0x16b 0x16b 0x14d 0x257 0x6c 0x16c 0x16c 0x152 0x259 0x6d 0x16d 0x16d 0x157 0x25b 0x6e 0x16e 0x16e 0x15c 0x25c 0x6f 0x16f 0x16f 0x161 0x25e 0x70 0x170 0x170 0x166 0x260 0x71 0x171 0x171 0x16b 0x261 0x72 0x172 0x172 0x170 0x263 0x73 0x173 0x173 0x175 0x264 0x74 0x174 0x174 0x17a 0x266 0x75 0x175 0x175 0x17f 0x268 0x76 0x176 0x176 0x184 0x269 0x77 0x177 0x177 0x189 0x26b 0x78 0x178 0x178 0x18e 0x26d 0x79 0x179 0x179 0x193 0x26e 0x7a 0x17a 0x17a 0x198 0x270 0x7b 0x17b 0x17b 0x19d 0x272 0x7c 0x17c 0x17c 0x1a2 0x273 0x7d 0x17d 0x17d 0x1a7 0x275 0x7e 0x17e 0x17e 0x1ac 0x276 0x7f 0x17f 0x17f 0x1b1 0x278 0x80 0x180 0x180 0x1b6 0x27a 0x81 0x181 0x181 0x1bb 0x27b 0x82 0x182 0x182 0x1c0 0x27d 0x83 0x183 0x183 0x1c5 0x27f 0x84 0x184 0x184 0x1ca 0x280 0x85 0x185 0x185 0x1cf 0x282 0x86 0x186 0x186 0x1d4 0x283 0x87 0x187 0x187 0x1d9 0x285 0x88 0x188 0x188 0x1de 0x287 0x89 0x189 0x189 0x1e3 0x288 0x8a 0x18a 0x18a 0x1e8 0x28a 0x8b 0x18b 0x18b 0x1ed 0x28c 0x8c 0x18c 0x18c 0x1f2 0x28d 0x8d 0x18d 0x18d 0x1f7 0x28f 0x8e 0x18e 0x18e 0x1fc 0x291 0x8f 0x18f 0x18f 0x201 0x292 0x90 0x190 0x190 0x206 0x294 0x91 0x191 0x191 0x20b 0x295 0x92 0x192 0x192 0x210 0x297 0x93 0x193 0x193 0x215 0x299 0x94 0x194 0x194 0x21a 0x29a 0x95 0x195 0x195 0x21f 0x29c 0x96 0x196 0x196 0x224 0x29e 0x97 0x197 0x197 0x229 0x29f 0x98 0x198 0x198 0x22e 0x2a1 0x99 0x199 0x199 0x233 0x2a3 0x9a 0x19a 0x19a 0x238 0x2a4 0x9b 0x19b 0x19b 0x23d 0x2a6 0x9c 0x19c 0x19c 0x242 0x2a7 0x9d 0x19d 0x19d 0x247 0x2a9 0x9e 0x19e 0x19e 0x24d 0x2ab 0x9f 0x19f 0x19f 0x253 0x2ac 0xa0 0x1a0 0x1a0 0x259 0x2ae 0xa1 0x1a1 0x1a1 0x25f 0x2af 0xa2 0x1a2 0x1a2 0x265 0x2b1 0xa3 0x1a3 0x1a3 0x26b 0x2b3 0xa4 0x1a4 0x1a4 0x271 0x2b4 0xa5 0x1a5 0x1a5 0x277 0x2b6 0xa6 0x1a6 0x1a6 0x27d 0x2b8 0xa7 0x1a7 0x1a7 0x283 0x2b9 0xa8 0x1a8 0x1a8 0x289 0x2bb 0xa9 0x1a9 0x1a9 0x28f 0x2bd 0xaa 0x1aa 0x1aa 0x295 0x2be 0xab 0x1ab 0x1ab 0x29b 0x2c0 0xac 0x1ac 0x1ac 0x2a1 0x2c1 0xad 0x1ad 0x1ad 0x2a7 0x2c3 0xae 0x1ae 0x1ae 0x2ad 0x2c5 0xaf 0x1af 0x1af 0x2b3 0x2c6 0xb0 0x1b0 0x1b0 0x2b9 0x2c8 0xb1 0x1b1 0x1b1 0x2bf 0x2c9 0xb2 0x1b2 0x1b2 0x2c5 0x2cb 0xb3 0x1b3 0x1b3 0x2cb 0x2cd 0xb4 0x1b4 0x1b4 0x2d1 0x2cf 0xb5 0x1b5 0x1b5 0x2d7 0x2d0 0xb6 0x1b6 0x1b6 0x2dd 0x2d2 0xb7 0x1b7 0x1b7 0x2e3 0x2d3 0xb8 0x1b8 0x1b8 0x2e9 0x2d5 0xb9 0x1b9 0x1b9 0x2ef 0x2d7 0xba 0x1ba 0x1ba 0x2f5 0x2d8 0xbb 0x1bb 0x1bb 0x2fb 0x2da 0xbc 0x1bc 0x1bc 0x301 0x2db 0xbd 0x1bd 0x1bd 0x307 0x2dd 0xbe 0x1be 0x1be 0x30d 0x2df 0xbf 0x1bf 0x1bf 0x313 0x2e1 0xc0 0x1c0 0x1c0 0x319 0x2e2 0xc1 0x1c1 0x1c1 0x31f 0x2e4 0xc2 0x1c2 0x1c2 0x325 0x2e5 0xc3 0x1c3 0x1c3 0x32b 0x2e7 0xc4 0x1c4 0x1c4 0x331 0x2e9 0xc5 0x1c5 0x1c5 0x337 0x2ea 0xc6 0x1c6 0x1c6 0x33d 0x2ec 0xc7 0x1c7 0x1c7 0x343 0x2ed 0xc8 0x1c8 0x1c8 0x349 0x2ef 0xc9 0x1c9 0x1c9 0x34f 0x2f1 0xca 0x1ca 0x1ca 0x355 0x2f2 0xcb 0x1cb 0x1cb 0x35b 0x2f4 0xcc 0x1cc 0x1cc 0x361 0x2f5 0xcd 0x1cd 0x1cd 0x367 0x2f7 0xce 0x1ce 0x1ce 0x36d 0x2f9 0xcf 0x1cf 0x1cf 0x373 0x2fb 0xd0 0x1d0 0x1d0 0x379 0x2fc 0xd1 0x1d1 0x1d1 0x37f 0x2fe 0xd2 0x1d2 0x1d2 0x385 0x2ff 0xd3 0x1d3 0x1d3 0x38b 0x301 0xd4 0x1d4 0x1d4 0x391 0x303 0xd5 0x1d5 0x1d5 0x397 0x304 0xd6 0x1d6 0x1d6 0x39d 0x306 0xd7 0x1d7 0x1d7 0x3a3 0x307 0xd8 0x1d8 0x1d8 0x3a9 0x309 0xd9 0x1d9 0x1d9 0x3af 0x30b 0xda 0x1da 0x1da 0x3b5 0x30d 0xdb 0x1db 0x1db 0x3bb 0x30e 0xdc 0x1dc 0x1dc 0x3c1 0x310 0xdd 0x1dd 0x1dd 0x3c7 0x311 0xde 0x1de 0x1de 0x3cd 0x313 0xdf 0x1df 0x1df 0x3d3 0x315 0xe0 0x1e0 0x1e0 0x3d9 0x316 0xe1 0x1e1 0x1e1 0x3df 0x318 0xe2 0x1e2 0x1e2 0x3e5 0x319 0xe3 0x1e3 0x1e3 0x3eb 0x31b 0xe4 0x1e4 0x1e4 0x3f1 0x31d 0xe5 0x1e5 0x1e5 0x3f7 0x31f 0xe6 0x1e6 0x1e6 0x3ff 0x320>; + samsung,aod_candela_map_table_revA = <0x0 0x0 0xb 0x1b 0x2 0x1 0xc 0x1f 0x1a 0xa 0x2 0x20 0x36 0x19 0x1e 0x3 0x37 0xff 0x18 0x3c>; + samsung,support_dynamic_mipi_clk; + samsung,ffc_tx_cmds_revD = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 2e c5 29 00 00 00 00 00 03 c5 36 41 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revD = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53641 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c535a8 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53741>; + samsung,ffc_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 32 b1 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revA = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b1 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53222 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c533a0>; + samsung,dynamic_mipi_clk_timing_table = <0x65fbc9c0 0x671db480 0x6422c400>; + samsung,dynamic_mipi_clk_sel_table = <0x1 0x1 0x0 0x0 0x0 0x1 0x2 0x0 0x0 0x2 0x1 0x3 0x0 0x0 0x2 0x1 0x4 0x0 0x0 0x1 0x2 0xb 0x2942 0x29a2 0x0 0x2 0xb 0x29a3 0x29e8 0x1 0x2 0xb 0x29e9 0x2a56 0x0 0x2 0xc 0x25be 0x26d2 0x0 0x2 0xd 0x48a 0x54d 0x0 0x2 0xd 0x54e 0x593 0x1 0x2 0xd 0x594 0x5e9 0x0 0x2 0xe 0x601 0x661 0x0 0x2 0xe 0x662 0x6a7 0x1 0x2 0xe 0x6a8 0x6ca 0x0 0x2 0xf 0x1105 0x116a 0x0 0x2 0x11 0x8bd 0x8e6 0x0 0x2 0x11 0x8e7 0x92c 0x1 0x2 0x11 0x92d 0xa03 0x0 0x2 0x12 0xb79 0xb86 0x1 0x2 0x12 0xb87 0xb98 0x2 0x2 0x12 0xb99 0xc10 0x0 0x3 0x5b 0x0 0xd9 0x0 0x3 0x5b 0xda 0x165 0x1 0x3 0x5b 0x166 0x257 0x0 0x3 0x5c 0x258 0x26a 0x1 0x3 0x5c 0x26b 0x4a7 0x0 0x3 0x5c 0x4a8 0x4af 0x1 0x3 0x5d 0x4b0 0x64f 0x0 0x3 0x5d 0x650 0x6db 0x1 0x3 0x5d 0x6dc 0x79d 0x0 0x3 0x5e 0x79e 0x877 0x0 0x3 0x5e 0x878 0x903 0x1 0x3 0x5e 0x904 0x95f 0x0 0x3 0x5f 0x960 0xa59 0x0 0x3 0x61 0xabe 0xb29 0x0 0x3 0x61 0xb2a 0xbb5 0x1 0x3 0x61 0xbb6 0xd79 0x0 0x3 0x62 0xd7a 0xdac 0x1 0x3 0x62 0xdad 0xdd1 0x2 0x3 0x62 0xdd2 0xed7 0x0 0x3 0x66 0x1392 0x143b 0x0 0x3 0x67 0x143c 0x149f 0x0 0x3 0x68 0x14a0 0x1503 0x0 0x3 0x6b 0x1662 0x16d9 0x0 0x3 0x6c 0x16da 0x16f2 0x2 0x3 0x6c 0x16f3 0x176f 0x0 0x3 0x6d 0x1770 0x1805 0x0 0x3 0x6e 0x1806 0x1808 0x2 0x3 0x6e 0x1809 0x1931 0x0 0x3 0x6f 0x1932 0x1984 0x1 0x3 0x6f 0x1985 0x19c7 0x0 0x3 0x73 0x1f68 0x1f7a 0x1 0x3 0x73 0x1f7b 0x21b7 0x0 0x3 0x73 0x21b8 0x21f1 0x1 0x3 0x74 0x21f2 0x2214 0x2 0x3 0x74 0x2215 0x234f 0x0 0x3 0x76 0x23fa 0x24ba 0x0 0x3 0x76 0x24bb 0x2511 0x1 0x3 0x76 0x2512 0x2546 0x2 0x3 0x76 0x2547 0x25bb 0x0 0x3 0x77 0x25bc 0x25d9 0x2 0x3 0x77 0x25da 0x2629 0x0 0x3 0x78 0x262a 0x268a 0x1 0x3 0x78 0x268b 0x268d 0x0 0x3 0x7a 0x26c0 0x283d 0x0 0x3 0x7a 0x283e 0x2877 0x1 0x3 0x7c 0x8d68 0x8dfd 0x0 0x3 0x80 0x9376 0x9398 0x1 0x3 0x80 0x9399 0x9569 0x0 0x3 0x81 0x956a 0x96e4 0x0 0x3 0x81 0x96e5 0x96f9 0x1 0x3 0x82 0x96fa 0x98c2 0x0 0x3 0x82 0x98c3 0x994e 0x1 0x3 0x82 0x994f 0x9ae1 0x0 0x3 0x83 0x9ae2 0x9b20 0x1 0x3 0x83 0x9b21 0x9d5c 0x0 0x3 0x83 0x9d5d 0x9de8 0x1 0x3 0x83 0x9de9 0xa025 0x0 0x3 0x83 0xa026 0xa0b1 0x1 0x3 0x83 0xa0b2 0xa275 0x0 0x3 0x84 0xa276 0xa30c 0x0 0x3 0x84 0xa30d 0xa398 0x1 0x3 0x84 0xa399 0xa5d4 0x0 0x3 0x84 0xa5d5 0xa660 0x1 0x3 0x84 0xa661 0xa89d 0x0 0x3 0x84 0xa89e 0xa929 0x1 0x3 0x84 0xa92a 0xaa45 0x0 0x3 0x8a 0xd7c8 0xd813 0x0 0x3 0x8a 0xd814 0xd89f 0x1 0x3 0x8a 0xd8a0 0xdadc 0x0 0x3 0x8a 0xdadd 0xdb68 0x1 0x3 0x8a 0xdb69 0xdda3 0x0 0x3 0x9c 0x10384 0x1045d 0x0 0x3 0x9c 0x1045e 0x104e9 0x1 0x3 0x9c 0x104ea 0x10707 0x0 0x3 0xa1 0x10bea 0x10c9a 0x0 0x3 0xa1 0x10c9b 0x10ce1 0x1 0x3 0xa1 0x10ce2 0x10d26 0x2 0x3 0xa1 0x10d27 0x10d47 0x0 0x4 0x33 0x0 0x0 0x0 0x4 0x34 0x0 0x0 0x0 0x4 0x35 0x0 0x0 0x1 0x4 0x36 0x0 0x0 0x0 0x4 0x37 0x0 0x0 0x2 0x4 0x38 0x0 0x0 0x1 0x5 0x3d 0x0 0x0 0x2 0x5 0x3e 0x0 0x0 0x0 0x5 0x47 0x0 0x0 0x2>; + samsung,fd_on_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 40 40 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,fd_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 80 40 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_grid_on_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 bf 01 00 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,self_grid_off_revA = [29 01 00 00 11 00 03 f0 5a 5a 29 00 00 00 00 00 03 bf 00 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 4c f4 29 00 00 00 00 00 02 f4 28 29 00 00 00 00 00 03 91 01 01 29 00 00 00 00 00 02 53 27 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 40 0a 00 00 00 00 40 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 38 00 00 00 18 03 38 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 24 a4 29 01 00 00 00 00 02 f7 0f 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revA = <0x29000000 0x3f0 0x5a5a2900 0x0 0x4b0004c 0xf4290000 0x2 0xf4282900 0x0 0x3910101 0x29010000 0x253 0x26290000 0x2 0xf70f2901 0x1100 0x3f0a5a5>; + samsung,lpm_off_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 45 0a 00 00 00 00 45 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 3d 00 00 00 18 03 3d 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 26 f0 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_60nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 24]; + samsung,lpm_30nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 25]; + samsung,lpm_10nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 26]; + samsung,lpm_2nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 27]; + samsung,lpm_brightnes_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 02 53 26 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xf>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + samsung,ub-con-det = <0xffffffff 0x5 0x0>; + samsung,esd-irq-gpio1 = <0xffffffff 0x3 0x0>; + phandle = <0xf>; + + qcom,mdss-dsi-display-timings { + + fhd90 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0xf>; + qcom,mdss-dsi-panel-framerate = <0x5a>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x2847>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 0a 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 54 01 0c 00 b4 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 04 b0 00 04 f2 29 00 00 00 00 00 02 f2 54 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 01 00 00 11 00 02 f2 00 29 00 00 00 00 00 04 b0 01 b4 65 29 00 00 00 00 00 21 65 0c 94 0c 5a 0c 30 0b b8 0b 46 0a f6 09 ea 09 08 08 1a 07 12 06 2a 05 12 03 82 02 08 02 08 00 18 29 00 00 00 00 00 04 b0 00 2a 6a 29 00 00 00 00 00 04 6a 07 00 c0 29 01 00 00 11 00 02 f7 0f 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 04 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a 80 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 22 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 02 f7 0f 29 01 00 00 6e 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,panel-roi-alignment = <0x168 0x78 0x168 0x78 0x168 0x78>; + }; + + fhd60 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0x10>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x3dfa>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 0a 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 2a f2 00 05 0e 58 54 01 0c 00 b4 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 04 b0 00 04 f2 29 00 00 00 00 00 02 f2 54 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 01 00 00 11 00 02 f2 00 29 00 00 00 00 00 04 b0 01 b4 65 29 00 00 00 00 00 21 65 0c 94 0c 5a 0c 30 0b b8 0b 46 0a f6 09 ea 09 08 08 1a 07 12 06 2a 05 12 03 82 02 08 02 08 00 18 29 00 00 00 00 00 04 b0 00 2a 6a 29 00 00 00 00 00 04 6a 07 00 c0 29 01 00 00 11 00 02 f7 0f 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 04 b0 00 08 f2 29 00 00 00 00 00 02 f2 04 29 00 00 00 00 00 04 b0 00 2c 6a 29 00 00 00 00 00 02 6a 80 29 00 00 00 00 00 04 b0 00 28 68 29 00 00 00 00 00 02 68 22 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 02 f7 0f 29 01 00 00 6e 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,panel-roi-alignment = <0x168 0x78 0x168 0x78 0x168 0x78>; + }; + }; + + qcom,panel-supply-entries { + #address-cells = <0x1>; + #size-cells = <0x0>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vci"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vddi"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1b7740>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + }; + }; + }; + }; + + fragment@89 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_PBA_BOOTING_FHD"; + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x0>; + qcom,mdss-dsi-bl-max-level = <0x639c>; + qcom,mdss-brightness-max-level = <0x639c>; + qcom,mdss-dsi-interleave-mode = <0x0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x3c>; + qcom,mdss-pan-physical-height-dimension = <0x6a>; + qcom,mdss-dsi-panel-mode-gpio-state = "invalid"; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + samsung,candela_map_table_revA = <0x0 0x0 0x2 0x5 0x1 0x2 0x2 0x6 0x2 0x3 0x3 0x7 0x3 0x4 0x4 0x8 0x4 0x5 0x5 0x9 0x5 0x6 0x6 0xa 0x6 0x7 0x7 0xb 0x7 0x8 0x8 0xc 0x8 0x9 0x9 0xd 0x9 0xa 0xa 0xe 0xa 0xb 0xb 0xf 0xb 0xc 0xc 0x10 0xc 0xd 0xd 0x11 0xd 0xe 0xe 0x13 0xe 0xf 0xf 0x14 0xf 0x10 0x10 0x15 0x10 0x11 0x11 0x16 0x11 0x12 0x12 0x18 0x12 0x13 0x13 0x19 0x13 0x14 0x14 0x1b 0x14 0x15 0x15 0x1d 0x15 0x16 0x16 0x1e 0x16 0x17 0x18 0x20 0x17 0x19 0x1a 0x22 0x18 0x1b 0x1c 0x25 0x19 0x1d 0x1d 0x27 0x1a 0x1e 0x20 0x29 0x1b 0x21 0x22 0x2c 0x1c 0x23 0x24 0x2f 0x1d 0x25 0x26 0x32 0x1e 0x27 0x28 0x35 0x1f 0x29 0x2b 0x38 0x20 0x2c 0x2e 0x3c 0x21 0x2f 0x31 0x40 0x22 0x32 0x34 0x44 0x23 0x35 0x38 0x48 0x24 0x39 0x3b 0x4d 0x25 0x3c 0x3f 0x52 0x26 0x40 0x43 0x57 0x27 0x44 0x47 0x5d 0x28 0x48 0x4c 0x62 0x29 0x4d 0x50 0x69 0x2a 0x51 0x56 0x6f 0x2b 0x57 0x5b 0x77 0x2c 0x5c 0x61 0x7e 0x2d 0x62 0x68 0x86 0x2e 0x69 0x6e 0x8f 0x2f 0x6f 0x76 0x98 0x30 0x77 0x7d 0xa2 0x31 0x7e 0x85 0xac 0x32 0x86 0x8e 0xb7 0x33 0x8f 0x96 0xc3 0x34 0x97 0xa0 0xcf 0x35 0xa1 0xaa 0xdc 0x36 0xab 0xb5 0xea 0x37 0xb6 0xc1 0xf9 0x38 0xc2 0xcd 0x109 0x39 0xce 0xda 0x11a 0x3a 0xdb 0xe6 0x12c 0x3b 0xe7 0xf2 0x13c 0x3c 0xf3 0xfe 0x14d 0x3d 0xff 0xff 0x168>; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x10>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + phandle = <0x10>; + + qcom,mdss-dsi-display-timings { + + fhd@0 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-front-porch = <0xa4>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-v-back-porch = <0x3>; + qcom,mdss-dsi-v-front-porch = <0x9>; + qcom,mdss-dsi-panel-clockrate = <0x35866480>; + qcom,mdss-dsi-panel-phy-timings = <0x1e0808 0x24220808 0x8020400>; + qcom,mdss-dsi-on-command = [39 01 00 00 78 00 02 11 00]; + qcom,mdss-dsi-off-command = <0x5010000 0x24000128 0x5010000 0x78000110>; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + }; + }; + }; + + fragment@90 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_te { + + sde_te_active { + phandle = <0x9>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + + sde_te_suspend { + phandle = <0xd>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + + pmx_sde { + phandle = <0xd0>; + + sde_dsi_active { + phandle = <0xa>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + bias-disable = <0x0>; + }; + }; + + sde_dsi_suspend { + phandle = <0xe>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable = <0x0>; + }; + }; + }; + }; + }; + + fragment@91 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_ub_det { + + sde_ub_det_default { + pins = "gpio5"; + function = "normal"; + input-enable; + power-source = <0x1>; + bias-disable; + phandle = <0xb>; + }; + }; + }; + }; + + fragment@92 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_fg_err { + + sde_fg_err_default { + pins = "gpio3"; + function = "normal"; + input-enable; + power-source = <0x0>; + bias-disable; + phandle = <0xc>; + }; + }; + }; + }; + + fragment@93 { + target = <0xffffffff>; + + __overlay__ { + + qcom,dsi-display@9 { + label = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + qcom,display-type = "primary"; + phandle = <0xd1>; + }; + + qcom,dsi-display@10 { + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,display-type = "primary"; + phandle = <0xd2>; + }; + }; + }; + + fragment@94 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c000000 0x0 0x9e4000>; + label = "cont_splash_region"; + }; + }; + + fragment@95 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c9e4000 0x0 0x100000>; + label = "dfps_data_region"; + }; + }; + + fragment@96 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9c000000 0x0 0x9e4000>; + label = "disp_rdump_region"; + }; + }; + + fragment@97 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x68>; + status = "okay"; + + sm5714@49 { + status = "okay"; + compatible = "siliconmitus,sm5714mfd"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x69>; + sm5714,irq-gpio = <0xffffffff 0x21 0x0>; + sm5714,wakeup; + }; + }; + }; + + fragment@98 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x6a>; + status = "okay"; + + usbpd-sm5714@33 { + status = "okay"; + compatible = "sm5714-usbpd"; + reg = <0x33>; + pinctrl-names = "default"; + pinctrl-0 = <0x6b>; + usbpd,usbpd_int = <0xffffffff 0x68 0x0>; + support_pd_role_swap; + + pdic-manager { + pdic,max_power = <0x1388>; + pdic_op_power = <0x9c4>; + pdic_max_voltage = <0x1770>; + pdic_max_current = <0x7d0>; + pdic,min_current = <0x1f4>; + pdic,giveback = <0x0>; + pdic,usb_com_capable = <0x1>; + pdic,no_usb_suspend = <0x1>; + source,max_voltage = <0x1388>; + source,min_voltage = <0xfa0>; + source,max_power = <0x9c4>; + }; + }; + }; + }; + + fragment@99 { + target = <0xffffffff>; + + __overlay__ { + + if_pmic_irq { + + if_pmic_irq_default { + phandle = <0x69>; + + mux { + pins = "gpio33"; + function = "gpio"; + }; + + config { + pins = "gpio33"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + + usbpd_irq { + + usbpd_irq_default { + phandle = <0x6b>; + + mux { + pins = "gpio104"; + function = "gpio"; + }; + + config { + pins = "gpio104"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + }; + }; + + fragment@100 { + target = <0xffffffff>; + + __overlay__ { + qcom,qusb-phy-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x18 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x46 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + qcom,qusb-phy-host-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x18 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x46 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + }; + }; + + fragment@101 { + target = <0xffffffff>; + + __overlay__ { + + fps_rst { + phandle = <0x6c>; + + mux { + pins = "gpio91"; + function = "gpio"; + }; + + config { + pins = "gpio91"; + bias-pull-down; + }; + }; + }; + }; + + fragment@102 { + target = <0xffffffff>; + + __overlay__ { + regulator-name = "VDD_BTP_3P3"; + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + }; + }; + + fragment@103 { + target = <0xffffffff>; + + __overlay__ { + qcom,set-miso-sampling; + qcom,miso-sampling-ctrl-val = <0x2>; + status = "okay"; + + gw9558-spi@0 { + compatible = "goodix,gw9558x_factory"; + reg = <0x0>; + spi-max-frequency = <0x17d7840>; + pinctrl-names = "default"; + pinctrl-0 = <0x6c>; + gpio-controller; + #gpio-cells = <0x2>; + goodix,btp-regulator = "VDD_BTP_3P3"; + goodix,gpio_reset = <0xffffffff 0x5b 0x0>; + goodix,chip_id = "GW9558"; + goodix,position = "11.81,-0.02,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + goodix,modelinfo = "A525"; + goodix,rb = "547,215,-1,FFFFFF,A9A9A9"; + }; + }; + }; + + fragment@104 { + target = <0xffffffff>; + + __overlay__ { + + gw9558@0 { + compatible = "goodix,gw9558x"; + reg = <0x0>; + spi-max-frequency = <0x17d7840>; + pinctrl-names = "default"; + pinctrl-0 = <0x6c>; + gpio-controller; + #gpio-cells = <0x2>; + goodix,btp-regulator = "VDD_BTP_3P3"; + goodix,gpio_reset = <0xffffffff 0x5b 0x0>; + goodix,chip_id = "GW9558"; + goodix,position = "11.81,-0.02,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + goodix,modelinfo = "A525"; + goodix,rb = "547,215,-1,FFFFFF,A9A9A9"; + }; + }; + }; + + fragment@105 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@106 { + target = <0xffffffff>; + + __overlay__ { + + qcom,flash_0 { + label = "flash"; + qcom,led-name = "led:flash_0"; + qcom,max-current = <0x5dc>; + qcom,default-led-trigger = "flash0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x5dc>; + qcom,duration-ms = <0x500>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + qcom,record-current-ma = <0x12c>; + phandle = <0x6d>; + }; + + qcom,torch_0 { + label = "torch"; + qcom,led-name = "led:torch_0"; + qcom,max-current = <0x1f4>; + qcom,default-led-trigger = "torch0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x12c>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + phandle = <0x6e>; + }; + + qcom,camera-flash@0 { + cell-index = <0x0>; + compatible = "qcom,camera-flash"; + flash-source = <0x6d>; + torch-source = <0x6e>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x77>; + }; + + qcom,cam-res-mgr { + compatible = "qcom,cam-res-mgr"; + shared-gpios = <0x3f>; + pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; + status = "ok"; + pinctrl-0 = <0x6f>; + pinctrl-1 = <0x70>; + }; + }; + }; + + fragment@107 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + sm5714-fled { + compatible = "siliconmitus,sm5714-fled"; + reg = <0x49>; + status = "okay"; + slave-addr = <0x92>; + flash-en-gpio = <0xffffffff 0x16 0x0>; + torch-en-gpio = <0xffffffff 0x43 0x0>; + flash-brightness = <0xf>; + preflash-brightness = <0x7>; + torch-brightness = <0x7>; + factory_current = <0x0>; + timeout = <0xff>; + }; + }; + }; + + fragment@108 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + qcom,ois@62 { + compatible = "qcom,ois"; + cell-index = <0x0>; + reg = <0x62>; + slave-addr = <0xc4>; + slave-id = <0x460>; + cam_vaf-supply = <0x71>; + regulator-names = "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x2ab980>; + rgltr-max-voltage = <0x2ab980>; + rgltr-load-current = <0x30d40>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x72 0x73>; + pinctrl-1 = <0x74 0x75>; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x20 0x0 0xffffffff 0x2b 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x0>; + gpio-custom1 = <0x1>; + gpio-vio = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x0 0x0 0x0>; + gpio-req-tbl-label = "MCU_RESET0", "MCU_BOOT0", "MCU_VIO"; + status = "ok"; + phandle = <0x79>; + }; + }; + }; + + fragment@109 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@0 { + cell-index = <0x0>; + compatible = "qcom,cam-sensor"; + reg = <0x0>; + slave-addr = <0x34>; + csiphy-sd-index = <0x0>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x76>; + led-flash-src = <0x77>; + eeprom-src = <0x78>; + ois-src = <0x79>; + cam_vio-supply = <0x7a>; + cam_vaf-supply = <0x71>; + cam_vana-supply = <0x7b>; + cam_vdig-supply = <0x7c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vaf", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x2ab980 0xf4240 0x0>; + rgltr-max-voltage = <0x1b7740 0x2ab980 0x2c4020 0x10c8e0 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x7d 0x7e 0x7f>; + pinctrl-1 = <0x80 0x81 0x82>; + gpios = <0xffffffff 0xd 0x0 0xffffffff 0x1e 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x1>; + gpio-custom1 = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_VANA0"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x41>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@2 { + cell-index = <0x2>; + compatible = "qcom,cam-sensor"; + reg = <0x3>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x83>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x84 0x85 0x86 0x87>; + pinctrl-1 = <0x88 0x89 0x8a 0x8b>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x2D { + cell-index = <0x2>; + compatible = "qcom,eeprom"; + reg = <0x2d>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x84 0x85 0x86 0x87>; + pinctrl-1 = <0x88 0x89 0x8a 0x8b>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x83>; + }; + + qcom,eeprom@37 { + cell-index = <0x3>; + compatible = "qcom,eeprom"; + reg = <0x37>; + slave-addr = <0x6e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_vdig-supply = <0x8c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x8d 0x8e 0x8f>; + pinctrl-1 = <0x90 0x91 0x92>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x9a>; + }; + }; + }; + + fragment@110 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@1 { + cell-index = <0x1>; + compatible = "qcom,cam-sensor"; + reg = <0x1>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x93>; + cam_vio-supply = <0x7a>; + cam_vana-supply = <0x94>; + cam_vdig-supply = <0x95>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x96 0x97>; + pinctrl-1 = <0x98 0x99>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@8 { + cell-index = <0x8>; + compatible = "qcom,cam-sensor"; + reg = <0x8>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x93>; + cam_vio-supply = <0x7a>; + cam_vana-supply = <0x94>; + cam_vdig-supply = <0x95>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x96 0x97>; + pinctrl-1 = <0x98 0x99>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@3 { + cell-index = <0x3>; + compatible = "qcom,cam-sensor"; + reg = <0x2>; + slave-addr = <0x6e>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x9a>; + cam_vio-supply = <0x7a>; + cam_vdig-supply = <0x8c>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x8d 0x8e 0x8f>; + pinctrl-1 = <0x90 0x91 0x92>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@4 { + cell-index = <0x4>; + compatible = "qcom,cam-sensor"; + reg = <0x4>; + slave-addr = <0x7e>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + led-flash-src = <0x77>; + eeprom-src = <0x9b>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x9c 0x9d 0x9e 0x87>; + pinctrl-1 = <0x9f 0xa0 0xa1 0x8b>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x40 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + cam_vdig-supply = <0x8c>; + phandle = <0xd3>; + }; + + qcom,eeprom@0x3F { + cell-index = <0x4>; + compatible = "qcom,eeprom"; + reg = <0x3f>; + slave-addr = <0x7e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7a>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-max-voltage = <0x1b7740 0x124f80 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x9c 0x9d 0x9e 0x87>; + pinctrl-1 = <0x9f 0xa0 0xa1 0x8b>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x40 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + cam_vdig-supply = <0x8c>; + phandle = <0x9b>; + }; + }; + }; + + fragment@111 { + target = <0xffffffff>; + + __overlay__ { + + qcom,actuator@0xC { + cell-index = <0x0>; + reg = <0xc>; + slave-addr = <0x18>; + compatible = "i2c_actuator"; + rgltr-cntrl-support; + cam_vio-supply = <0x7a>; + cam_vaf-supply = <0x71>; + regulator-names = "cam_vio", "cam_vaf"; + rgltr-min-voltage = <0x1b7740 0x2ab980>; + rgltr-max-voltage = <0x1b7740 0x2ab980>; + rgltr-load-current = <0x30d40 0x30d40>; + phandle = <0x76>; + }; + + qcom,eeprom@50 { + cell-index = <0x0>; + reg = <0x50>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa0>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1 0x1>; + qcom,cam-power-seq-delay = <0x2 0x2>; + cam_vaf-supply = <0x71>; + cam_vio-supply = <0x7a>; + regulator-names = "cam_vaf", "cam_vio"; + rgltr-min-voltage = <0x2ab980 0x1b7740>; + rgltr-max-voltage = <0x2ab980 0x1b7740>; + rgltr-load-current = <0x30d40 0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + phandle = <0x78>; + }; + + qcom,eeprom@51 { + cell-index = <0x1>; + reg = <0x51>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa2>; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x2>; + cam_vio-supply = <0x7a>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-mode = <0x0>; + sensor-position = <0x1>; + rgltr-cntrl-support; + phandle = <0x93>; + }; + }; + }; + + fragment@112 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@113 { + target = <0xffffffff>; + + __overlay__ { + + nfc_qupv3_se0_i2c_sleep { + phandle = <0xa2>; + + mux { + pins = "gpio34", "gpio35"; + function = "gpio"; + }; + + config { + pins = "gpio34", "gpio35"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + nfc_clk_req_gpio { + phandle = <0xa3>; + + mux { + pins = "gpio31"; + function = "gpio"; + }; + + config { + pins = "gpio31"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_irq_gpio { + phandle = <0xa4>; + + mux { + pins = "gpio37"; + function = "gpio"; + }; + + config { + pins = "gpio37"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_ven_gpio { + phandle = <0xa5>; + + mux { + pins = "gpio12"; + function = "gpio"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-high; + }; + }; + + nfc_firm_gpio { + phandle = <0xa6>; + + mux { + pins = "gpio36"; + function = "gpio"; + }; + + config { + pins = "gpio36"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + nfc_ldo_en_gpio { + phandle = <0xa7>; + + mux { + pins = "gpio68"; + function = "gpio"; + }; + + config { + pins = "gpio68"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@114 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + pinctrl-1 = <0xa2>; + qcom,clk-freq-out = <0x61a80>; + + sec-nfc@27 { + compatible = "sec-nfc"; + reg = <0x27>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + sec-nfc,ven-gpio = <0xffffffff 0xc 0x0>; + sec-nfc,irq-gpio = <0xffffffff 0x25 0x0>; + sec-nfc,firm-gpio = <0xffffffff 0x24 0x0>; + sec-nfc,clk_req-gpio = <0xffffffff 0x1f 0x0>; + sec-nfc,pvdd-gpio = <0xffffffff 0x44 0x0>; + sec-nfc,clk_req_wake; + sec-nfc,bootloader_ver = <0x6>; + pinctrl-names = "default"; + pinctrl-0 = <0xa3 0xa4 0xa5 0xa6 0xa7>; + }; + }; + }; + + fragment@115 { + target = <0xffffffff>; + + __overlay__ { + + hall { + status = "okay"; + compatible = "hall"; + linux,input-type = <0x1>; + linux,code = <0x15>; + hall,gpio_flip_cover = <0xffffffff 0xa 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa8>; + }; + }; + }; + + fragment@116 { + target = <0xffffffff>; + + __overlay__ { + + hall { + + hall_default { + pins = "gpio10"; + function = "normal"; + output-disable; + input-enable; + bias-disable; + power-source = <0x0>; + phandle = <0xa8>; + }; + }; + }; + }; + + fragment@abc { + target-path = [2f 00]; + + __overlay__ { + + sec_abc { + compatible = "samsung,sec_abc"; + status = "okay"; + + gpu { + gpu,label = "GPU fault"; + gpu,threshold_count = <0x4>; + gpu,threshold_time = <0x4b0>; + }; + + gpu_page { + gpu_page,label = "GPU page fault"; + gpu_page,threshold_count = <0x14>; + gpu_page,threshold_time = <0x4b0>; + }; + + aicl { + aicl,label = "battery aicl"; + aicl,threshold_count = <0x5>; + aicl,threshold_time = <0x12c>; + }; + }; + + abc_hub { + compatible = "samsung,abc_hub"; + status = "okay"; + + bootc { + bootc,time_spec_user = <0x186a0>; + bootc,time_spec_eng = <0x186a0>; + bootc,time_spec_fac = <0x186a0>; + }; + }; + }; + }; + + fragment@117 { + target = <0xffffffff>; + + __overlay__ { + + rpmh-regulator-ldoc8 { + compatible = "qcom,rpmh-vrm-regulator"; + mboxes = <0xffffffff 0x0>; + qcom,resource-name = "ldoc8"; + qcom,regulator-type = "pmic5-ldo"; + qcom,supported-modes = <0x2 0x4>; + qcom,mode-threshold-currents = <0x0 0x1>; + + regulator-pm6150l-l8 { + regulator-name = "pm6150l_l8"; + qcom,set = <0x3>; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + qcom,init-voltage = <0x1b7740>; + regulator-always-on; + qcom,init-mode = <0x2>; + phandle = <0xd4>; + }; + }; + + rpmh-regulator-ldoa5 { + + regulator-pm6150-l5 { + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + regulator-always-on; + phandle = <0xd5>; + }; + }; + + i2c@17 { + status = "ok"; + cell-index = <0x11>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x33 0x0 0xffffffff 0x34 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0xa9>; + phandle = <0xd6>; + + sx9360-i2c@28 { + compatible = "sx9360"; + reg = <0x28>; + pinctrl-names = "default"; + pinctrl-0 = <0xaa>; + interrupt-parent = <0xffffffff>; + interrupts = <0x4 0xc4 0x0 0x2>; + sx9360,nirq-gpio = <0xffffffff 0x5 0x1>; + sx9360,reggnrlctrl2_reg = <0x32>; + sx9360,againfreq_reg = <0x38>; + sx9360,refagainfreq_reg = <0x36>; + sx9360,gainrawfilt_reg = <0x1a>; + sx9360,refgainrawfilt_reg = <0x22>; + sx9360,proxthresh_reg = <0x1d>; + sx9360,hyst_reg = <0x35>; + sx9360,regproxctrl3_reg = <0xd>; + sx9360,resolution_reg = <0xf>; + sx9360,refresolution_reg = <0xf>; + sx9360,hallic_cert_detect = <0x1>; + }; + }; + }; + }; + + fragment@118 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x48 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6d 0x72 0x73 0x74 0x75 0x76>; + }; + }; + + fragment@119 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@120 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0xb 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x37 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6b 0x6d 0x72 0x73 0x74 0x76>; + }; + }; + + fragment@121 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@122 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0xb 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6b 0x6d 0x72 0x73 0x74 0x76>; + }; + }; + + fragment@123 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0xb 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6b 0x6d 0x72 0x73 0x74 0x76>; + }; + }; + + fragment@124 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@125 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0xa 0xb 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x20 0x22 0x24 0x25 0x26 0x27 0x2a 0x2b 0x2d 0x2f 0x31 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5d 0x5e 0x5f 0x62 0x6b 0x6d 0x72 0x73 0x74 0x76>; + }; + }; + + fragment@126 { + target = <0xffffffff>; + + __overlay__ { + + msm_vibrator { + compatible = "vibrator"; + motor-vdd_type = <0x0>; + motor-en = <0xffffffff 0x39 0x0>; + samsung,vib_type = "COINDC"; + }; + }; + }; + + fragment@127 { + target = <0xffffffff>; + + __overlay__ { + + bat_thm { + label = "bat_thm"; + reg = <0x4f>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + + chg_thm { + label = "chg_thm"; + reg = <0x4d>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + }; + }; + + fragment@128 { + target = <0xffffffff>; + + __overlay__ { + + battery { + pinctrl-names = "default"; + battery,chip_vendor = "QCOM"; + status = "okay"; + compatible = "samsung,sec-battery"; + battery,vendor = "Battery"; + battery,charger_name = "sm5714-charger"; + battery,fuelgauge_name = "sm5714-fuelgauge"; + battery,fgsrc_switch_name = "sm5714-fuelgauge"; + battery,technology = <0x2>; + battery,batt_data_version = <0x1>; + battery,temp_adc_type = <0x1>; + battery,temp_channel_raw = <0x1>; + battery,adc_check_count = <0x5>; + battery,temp_check_type = <0x1>; + battery,chg_temp_check_type = <0x1>; + battery,thermal_source = <0x2>; + battery,chg_thermal_source = <0x2>; + battery,temp_table_adc = <0x76c 0x923 0xab2 0xc97 0xec8 0x114f 0x146a 0x1803 0x1c2e 0x20e2 0x25c4 0x2b7f 0x31eb 0x386a 0x3f07 0x45a1 0x4be0 0x51ec 0x5774 0x5c67 0x609d 0x6442 0x6755>; + battery,temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,chg_temp_table_adc = <0x6d6 0x889 0xa14 0xbe2 0xe04 0x107c 0x137e 0x170b 0x1b0d 0x1f93 0x2479 0x2a3c 0x3072 0x3719 0x3da0 0x43e4 0x4aa7 0x50aa 0x5651 0x5b61 0x5fd6 0x637c 0x66ca>; + battery,chg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,polling_time = <0xa 0x1e 0x1e 0x1e 0xe10>; + battery,cable_check_type = <0x4>; + battery,cable_source_type = <0x1>; + battery,polling_type = <0x1>; + battery,monitor_initial_count = <0x0>; + battery,battery_check_type = <0x0>; + battery,ovp_uvlo_check_type = <0x3>; + battery,temp_check_count = <0x1>; + battery,overheatlimit_threshold = <0x2bc>; + battery,overheatlimit_recovery = <0x2a8>; + battery,wire_warm_overheat_thresh = <0x1f4>; + battery,wire_normal_warm_thresh = <0x1a4>; + battery,wire_cool1_normal_thresh = <0xb4>; + battery,wire_cool2_cool1_thresh = <0x96>; + battery,wire_cool3_cool2_thresh = <0x32>; + battery,wire_cold_cool3_thresh = <0x0>; + battery,wire_warm_current = <0x61b>; + battery,wire_cool1_current = <0xaf0>; + battery,wire_cool2_current = <0x417>; + battery,wire_cool3_current = <0x1b5>; + battery,low_temp_topoff = <0xe1>; + battery,high_temp_topoff = <0xe1>; + battery,low_temp_float = <0x111c>; + battery,high_temp_float = <0x1036>; + battery,full_check_type = <0x7>; + battery,full_check_type_2nd = <0x7>; + battery,full_check_count = <0x1>; + battery,chg_gpio_full_check = <0x0>; + battery,chg_polarity_full_check = <0x1>; + battery,chg_high_temp = <0x22b>; + battery,chg_high_temp_recovery = <0x212>; + battery,chg_input_limit_current = <0x3e8>; + battery,chg_charging_limit_current = <0x578>; + battery,wpc_temp_control_source = <0x1>; + battery,wpc_high_temp = <0x17c>; + battery,wpc_high_temp_recovery = <0x168>; + battery,wpc_input_limit_current = <0x258>; + battery,wpc_charging_limit_current = <0x3e8>; + battery,wpc_temp_lcd_on_control_source = <0x1>; + battery,wpc_lcd_on_high_temp = <0x17c>; + battery,wpc_lcd_on_high_temp_rec = <0x168>; + battery,wpc_lcd_on_input_limit_current = <0x1c2>; + battery,wpc_store_high_temp = <0x168>; + battery,wpc_store_high_temp_recovery = <0x154>; + battery,wpc_store_charging_limit_current = <0x190>; + battery,wpc_store_lcd_on_high_temp = <0x168>; + battery,wpc_store_lcd_on_high_temp_rec = <0x12c>; + battery,wpc_store_lcd_on_charging_limit_current = <0x190>; + battery,sleep_mode_limit_current = <0x1f4>; + battery,wc_full_input_limit_current = <0x64>; + battery,mix_high_temp = <0x1a4>; + battery,mix_high_chg_temp = <0x1f4>; + battery,mix_high_temp_recovery = <0x186>; + battery,full_condition_type = <0x9>; + battery,full_condition_soc = <0x5d>; + battery,full_condition_vcell = <0x10ea>; + battery,recharge_check_count = <0x1>; + battery,recharge_condition_type = <0x4>; + battery,recharge_condition_soc = <0x62>; + battery,recharge_condition_vcell = <0x10d6>; + battery,charging_total_time = <0x3840>; + battery,hv_charging_total_time = <0x2a30>; + battery,normal_charging_total_time = <0x4650>; + battery,usb_charging_total_time = <0x8ca0>; + battery,recharging_total_time = <0x1518>; + battery,charging_reset_time = <0x0>; + battery,chg_float_voltage = <0x111c>; + battery,pre_afc_work_delay = <0x7d0>; + battery,pre_wc_afc_work_delay = <0xfa0>; + battery,pre_afc_input_current = <0x1f4>; + battery,pre_wc_afc_input_current = <0x1f4>; + battery,prepare_ta_delay = <0x0>; + battery,swelling_high_rechg_voltage = <0xfa0>; + battery,swelling_low_rechg_voltage = <0x1086>; + battery,siop_input_limit_current = <0x4b0>; + battery,siop_charging_limit_current = <0x3e8>; + battery,siop_hv_input_limit_current = <0x2bc>; + battery,siop_hv_input_limit_current_2nd = <0x226>; + battery,siop_hv_charging_limit_current = <0x3e8>; + battery,ttf_hv_charge_current = <0xa28>; + battery,ttf_dc25_charge_current = <0xed8>; + battery,rp_current_rp1 = <0x1f4>; + battery,rp_current_rp2 = <0x5dc>; + battery,rp_current_rp3 = <0xbb8>; + battery,rp_current_rdu_rp3 = <0x834>; + battery,rp_current_abnormal_rp3 = <0x708>; + battery,pd_charging_charge_power = <0x3a98>; + battery,max_charging_current = <0xaf0>; + battery,wireless_cc_cv = <0x55>; + battery,wireless_otg_input_current = <0x384>; + battery,age_data = <0x0 0x111c 0x10d6 0x10b8 0x5d 0x12c 0x1108 0x10c2 0x10a4 0x5c 0x190 0x10f4 0x10ae 0x1090 0x5b 0x2bc 0x10e0 0x109a 0x107c 0x5a 0x3e8 0x10ae 0x1068 0x104a 0x59>; + battery,health_condition = <0x384 0x0 0x4b0 0x0 0x5dc 0x0>; + battery,standard_curr = <0xe42>; + battery,expired_time = <0x23a0>; + battery,recharging_expired_time = <0x1518>; + battery,battery_full_capacity = <0x1388>; + battery,cisd_max_voltage_thr = <0x1388>; + battery,max_input_voltage = <0x2328>; + battery,max_input_current = <0xbb8>; + battery,cisd_alg_index = <0x8>; + battery,ignore_cisd_index = <0x0 0x3c0>; + battery,ignore_cisd_index_d = <0x0 0x78>; + battery,ttf_capacity = <0xf28>; + battery,cv_data = <0xe36 0x358 0x51b 0xd81 0x362 0x4f2 0xcc6 0x36b 0x4ca 0xc27 0x371 0x4ab 0xb78 0x379 0x483 0xac8 0x380 0x45a 0xa4a 0x387 0x433 0x9b2 0x38c 0x413 0x93e 0x393 0x3ea 0x89d 0x399 0x3c1 0x84b 0x39e 0x39c 0x7e3 0x3a2 0x37e 0x78a 0x3a6 0x35c 0x708 0x3ab 0x334 0x6ae 0x3b0 0x305 0x667 0x3b4 0x2e2 0x60b 0x3b8 0x2ba 0x5a7 0x3bc 0x291 0x562 0x3be 0x26f 0x543 0x3c2 0x24a 0x4a4 0x3c5 0x221 0x496 0x3cb 0x1d8 0x43e 0x3ce 0x1b2 0x427 0x3d1 0x189 0x3f0 0x3d4 0x160 0x3d1 0x3dc 0xda 0x36e 0x3e0 0x9b 0x366 0x3e2 0x7c 0x300 0x3e6 0x3e 0x2f5 0x3e8 0x0>; + io-channels = <0xffffffff 0x4f 0xffffffff 0x4d>; + io-channel-names = "adc-temp", "adc-chg-temp"; + }; + + sm5714-fuelgauge { + status = "okay"; + fuelgauge,fuel_alert_soc = <0x1>; + fuelgauge,capacity_max = <0x3e8>; + fuelgauge,capacity_max_margin = <0x12c>; + fuelgauge,capacity_min = <0x0>; + fuelgauge,capacity_calculation_type = <0x1f>; + fuelgauge,using_temp_compensation; + fuelgauge,low_temp_limit = <0x64>; + fuelgauge,using_hw_vempty; + fuelgauge,sw_v_empty_voltage = <0xc80>; + fuelgauge,sw_v_empty_voltage_cisd = <0xc1c>; + fuelgauge,sw_v_empty_recover_voltage = <0xd98>; + fuelgauge,capacity = <0x1388>; + + battery_params { + battery,id = <0x0>; + battery0,battery_type = <0x114e 0x1f20>; + battery0,battery_table0 = <0x1400 0x1b73 0x1c4b 0x1d38 0x1d68 0x1d7a 0x1d88 0x1d8f 0x1db4 0x1dea 0x1e0d 0x1e42 0x1e88 0x1eb4 0x1f01 0x1f3d 0x1f76 0x1fc7 0x2023 0x207f 0x2116 0x2190 0x2272 0x2400>; + battery0,battery_table1 = <0x0 0x99 0x219 0x4b3 0x5cc 0x74c 0xb80 0xd19 0xfb3 0x14e6 0x1a19 0x1f4c 0x29b3 0x2ee6 0x36b3 0x3be6 0x3e80 0x4119 0x464c 0x4b80 0x534c 0x5880 0x6400 0x6419>; + battery0,battery_table2 = <0x4b4b 0x4444 0x4040 0x3e3e 0x3c3c 0x3b3b 0x3838 0x3737 0x3535 0x3434 0x3434 0x3333 0x3333 0x3333 0x3333 0x3232>; + battery0,rs_value = <0x66 0x66 0x3800 0x199 0x599 0x599 0x100>; + battery0,v_alarm = <0xce4 0x0>; + battery0,topoff = <0x28a>; + battery0,i_cal = <0x0 0x0 0x800 0x800 0x0 0x0 0x7f0 0x81b>; + battery0,v_cal = <0x1 0x0 0x0 0x1 0x0 0x0 0x0>; + battery0,temp_std = <0x19>; + battery0,tem_poff = <0xd7a 0x32 0xd16 0x32>; + battery0,aux_ctrl = <0x322 0x5800>; + battery0,data_ver = <0x7>; + battery0,v_max_table = <0x2272 0x2250 0x222e 0x220c 0x21b7>; + battery0,q_max_table = <0x1f20 0x1e9f 0x1e1e 0x1d9d 0x1c5b>; + }; + }; + + cable-info { + default_input_current = <0x708>; + default_charging_current = <0x834>; + full_check_current_1st = <0x28a>; + full_check_current_2nd = <0xe1>; + + current_group_1 { + cable_number = <0x2 0x13 0x15 0x16 0x17 0x1e>; + input_current = <0x1f4>; + charging_current = <0x1f4>; + }; + + current_group_2 { + cable_number = <0x19 0x1f>; + input_current = <0x3e8>; + charging_current = <0x3e8>; + }; + + current_group_3 { + cable_number = <0x5 0x20>; + input_current = <0x5dc>; + charging_current = <0x5dc>; + }; + + current_group_4 { + cable_number = <0x6 0x7 0x8 0x11 0x12>; + input_current = <0x672>; + charging_current = <0xaf0>; + }; + + current_group_5 { + cable_number = <0x9>; + input_current = <0x672>; + charging_current = <0xc4e>; + }; + + current_group_6 { + cable_number = <0xa 0xc 0xf 0x1b 0x21 0x24>; + input_current = <0x320>; + charging_current = <0x960>; + }; + + current_group_7 { + cable_number = <0xd>; + input_current = <0x2bc>; + charging_current = <0x960>; + }; + + current_group_8 { + cable_number = <0x18>; + input_current = <0x3e8>; + charging_current = <0x1c2>; + }; + + current_group_9 { + cable_number = <0x23>; + input_current = <0x708>; + charging_current = <0x708>; + }; + + current_group_10 { + cable_number = <0xb 0xe 0x10 0x1c 0x23>; + input_current = <0x28a>; + charging_current = <0x960>; + }; + + current_group_11 { + cable_number = <0x1d 0x25>; + input_current = <0x1f4>; + charging_current = <0x4b0>; + }; + + current_group_12 { + cable_number = <0x1 0x4>; + input_current = <0x1db>; + charging_current = <0x226>; + }; + + current_group_13 { + cable_number = <0x22>; + input_current = <0x4b0>; + charging_current = <0x960>; + }; + }; + }; + }; + + fragment@129 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + + pca9468@57 { + compatible = "nxp,pca9468"; + reg = <0x57>; + pinctrl-names = "default"; + pca9468,input-current-limit = <0x26e8f0>; + pca9468,charging-current = <0x5b8d80>; + pca9468,input-itopoff = <0x7a120>; + pca9468,sense-resistance = <0x0>; + pca9468,switching-frequency = <0x3>; + pca9468,ntc-threshold = <0x0>; + pca9468,ta-mode = <0x1>; + pca9468,pps_reqen; + }; + }; + }; + + fragment@130 { + target = <0xffffffff>; + + __overlay__ { + + sec-direct-charger { + status = "okay"; + compatible = "samsung,sec-direct-charger"; + charger,battery_name = "battery"; + charger,main_charger = "sm5714-charger"; + charger,direct_charger = "pca9468-charger"; + charger,dchg_min_current = <0x7d0>; + charger,dchg_temp_low_threshold = <0xb4>; + charger,dchg_temp_high_threshold = <0x1a4>; + }; + + battery { + battery,charger_name = "sec-direct-charger"; + battery,dchg_temp_check_type = <0x1>; + battery,dchg_thermal_source = <0x3>; + battery,dchg_temp_table_adc = <0x19a28 0x1f806 0x25cd4 0x2cacc 0x35442 0x3f00c 0x4a754 0x58344 0x683dc 0x79ff2 0x8ce5c 0xa33c2 0xbbdd0 0xd5108 0xeed6a 0x1080a2 0x1213da 0x138b94 0x14dea6 0x16163a 0x171ffc 0x180e40 0x18ceb2>; + battery,dchg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,dc_step_chg_type = <0xe9>; + battery,dc_step_chg_charge_power = <0x55f0>; + battery,dc_step_chg_step = <0x3>; + battery,dc_step_chg_cond_vol = <0xfff 0x107c 0x111c>; + battery,dc_step_chg_cond_iin = <0x7ee 0x721 0x0>; + battery,dc_step_chg_iin_check_cnt = <0x3>; + battery,dc_step_chg_cond_soc = <0xc 0x32 0x64>; + battery,dc_step_chg_val_vfloat = <0xfff 0x107c 0x111c>; + battery,dc_step_chg_val_iout = <0x1388 0xfdc 0xe42>; + }; + }; + }; + + __symbols__ { + dsi_rm69299_visionox_amoled_video = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video"; + dsi_rm69299_visionox_amoled_cmd = "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd"; + dsi_sim_vid = "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video"; + dsi_sim_cmd = "/fragment@3/__overlay__/qcom,mdss_dsi_sim_cmd"; + dsi_sim_dsc_375_cmd = "/fragment@4/__overlay__/qcom,mdss_dsi_sim_dsc_375_cmd"; + dsi_nt36672c_video = "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video"; + dsi_panel_pwr_supply = "/fragment@6/__overlay__/dsi_panel_pwr_supply"; + dsi_panel_pwr_supply_no_labibb = "/fragment@6/__overlay__/dsi_panel_pwr_supply_no_labibb"; + dsi_panel_pwr_supply_labibb_amoled = "/fragment@6/__overlay__/dsi_panel_pwr_supply_labibb_amoled"; + dsi_rm69299_visionox_amoled_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@0"; + dsi_rm69299_visionox_amoled_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@1"; + dsi_sim_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@2"; + dsi_sim_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@3"; + dsi_sim_dsc_375_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@4"; + dsi_nt36672c_video_display = "/fragment@6/__overlay__/qcom,dsi-display@5"; + sde_dsi = "/fragment@6/__overlay__/qcom,dsi-display"; + sde_wb = "/fragment@6/__overlay__/qcom,wb-display@0"; + ext_disp = "/fragment@6/__overlay__/qcom,msm-ext-disp"; + ext_disp_audio_codec = "/fragment@6/__overlay__/qcom,msm-ext-disp/qcom,msm-ext-disp-audio-codec-rx"; + mtp_batterydata = "/fragment@11/__overlay__/qcom,battery-data"; + lpi_tlmm = "/fragment@27/__overlay__/lpi_pinctrl@627C0000"; + cdc_dmic01_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_active"; + cdc_dmic01_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_sleep"; + cdc_dmic01_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_active"; + cdc_dmic01_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_sleep"; + cdc_dmic23_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_active"; + cdc_dmic23_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_sleep"; + cdc_dmic23_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_active"; + cdc_dmic23_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_sleep"; + cdc_dmic45_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_active"; + cdc_dmic45_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_sleep"; + cdc_dmic45_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_active"; + cdc_dmic45_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_sleep"; + tx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_sleep"; + tx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_active"; + tx_swr_data0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_sleep"; + tx_swr_data0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_active"; + wsa_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_sleep"; + wsa_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_active"; + wsa_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_sleep"; + wsa_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_active"; + tx_swr_data1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_sleep"; + tx_swr_data1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_active"; + tx_swr_data2_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_sleep"; + tx_swr_data2_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_active"; + rx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_sleep"; + rx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_active"; + rx_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_sleep"; + rx_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_active"; + lpi_i2s1_sck_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_active"; + lpi_i2s1_sck_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_sleep"; + lpi_i2s1_ws_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_active"; + lpi_i2s1_ws_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_sleep"; + lpi_i2s1_sd0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_active"; + lpi_i2s1_sd0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_sleep"; + lpi_i2s1_sd1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_active"; + lpi_i2s1_sd1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_sleep"; + tx_macro = "/fragment@28/__overlay__/tx-macro@62620000"; + swr2 = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master"; + wcd938x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd938x-tx-slave"; + wcd937x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd937x-tx-slave"; + rx_macro = "/fragment@28/__overlay__/rx-macro@62600000"; + swr1 = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master"; + wcd938x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd938x-rx-slave"; + wcd937x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd937x-rx-slave"; + wsa_macro = "/fragment@28/__overlay__/wsa-macro@62640000"; + swr0 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master"; + wsa881x_0211 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211"; + wsa881x_0212 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212"; + wsa881x_0213 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213"; + wsa881x_0214 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214"; + va_macro = "/fragment@28/__overlay__/va-macro@62770000"; + wcd938x_codec = "/fragment@28/__overlay__/wcd938x-codec"; + wcd937x_codec = "/fragment@28/__overlay__/wcd937x-codec"; + cdc_dmic01_gpios = "/fragment@30/__overlay__/cdc_dmic01_pinctrl"; + cdc_dmic23_gpios = "/fragment@30/__overlay__/cdc_dmic23_pinctrl"; + cdc_dmic45_gpios = "/fragment@30/__overlay__/cdc_dmic45_pinctrl"; + wsa_swr_gpios = "/fragment@30/__overlay__/wsa_swr_clk_data_pinctrl"; + rx_swr_gpios = "/fragment@30/__overlay__/rx_swr_clk_data_pinctrl"; + tx_swr_gpios = "/fragment@30/__overlay__/tx_swr_clk_data_pinctrl"; + wsa_spkr_en1 = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl"; + wsa_spkr_en2 = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl"; + wcd_rst_gpio = "/fragment@31/__overlay__/msm_cdc_pinctrl@58"; + clock_audio_wsa_1 = "/fragment@31/__overlay__/wsa_core_clk"; + clock_audio_wsa_2 = "/fragment@31/__overlay__/wsa_npl_clk"; + clock_audio_rx_1 = "/fragment@31/__overlay__/rx_core_clk"; + clock_audio_rx_2 = "/fragment@31/__overlay__/rx_npl_clk"; + clock_audio_tx_1 = "/fragment@31/__overlay__/tx_core_clk"; + clock_audio_tx_2 = "/fragment@31/__overlay__/tx_npl_clk"; + clock_audio_va_1 = "/fragment@31/__overlay__/va_core_clk"; + clock_audio_va_2 = "/fragment@31/__overlay__/va_npl_clk"; + qupv3_se8_2hsuart = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000"; + qupv3_se8_2hsuart_pins = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins"; + qupv3_se8_2uart_tx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_active"; + qupv3_se8_2uart_rx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_active"; + qupv3_se8_2uart_tx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_sleep"; + qupv3_se8_2uart_rx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_sleep"; + sec_debug_region = "/fragment@37/__overlay__/sec_debug_region@0"; + sec_debug_autocomment = "/fragment@37/__overlay__/sec_debug_autocomment@0"; + sec_debug_rdx_bootdev = "/fragment@37/__overlay__/sec_debug_rdx_bootdev@0"; + kaslr_region = "/fragment@37/__overlay__/kaslr_region@A0001000"; + rkp_region = "/fragment@37/__overlay__/rkp_region@B0200000"; + hdm_region = "/fragment@37/__overlay__/hdm_region@A1000000"; + modem_shared_mem = "/fragment@37/__overlay__/modem_shared_mem_region@B5000000"; + usb_noti = "/fragment@60/__overlay__/usb-notifier"; + imp_list = "/fragment@65/__overlay__/imp_list"; + cdc_quin_mi2s_gpios = "/fragment@66/__overlay__/msm_cdc_pinctrl_quin"; + samsung_q6audio_adaptation = "/fragment@67/__overlay__/samsung,q6audio-adaptation"; + det_zones = "/fragment@67/__overlay__/det_zones"; + i2c_18 = "/fragment@67/__overlay__/i2c@18"; + tas256x = "/fragment@67/__overlay__/i2c@18/tas256x@4c"; + tas25xx_gpio_default = "/fragment@70/__overlay__/tas25xx_gpio_default"; + fm_lna_default = "/fragment@70/__overlay__/fm_lna_default"; + grip_i2c_active = "/fragment@71/__overlay__/grip_i2c/grip_i2c_active"; + grip_i2c_suspend = "/fragment@71/__overlay__/grip_i2c/grip_i2c_suspend"; + s2mpb03_i2c_sda_default = "/fragment@71/__overlay__/s2mpb03_i2c_sda_default"; + s2mpb03_i2c_scl_default = "/fragment@71/__overlay__/s2mpb03_i2c_scl_default"; + cam_sensor_mclk0_active = "/fragment@71/__overlay__/cam_sensor_mclk0_active"; + cam_sensor_mclk0_suspend = "/fragment@71/__overlay__/cam_sensor_mclk0_suspend"; + cam_sensor_mclk1_active = "/fragment@71/__overlay__/cam_sensor_mclk1_active"; + cam_sensor_mclk1_suspend = "/fragment@71/__overlay__/cam_sensor_mclk1_suspend"; + cam_sensor_mclk2_active = "/fragment@71/__overlay__/cam_sensor_mclk2_active"; + cam_sensor_mclk2_suspend = "/fragment@71/__overlay__/cam_sensor_mclk2_suspend"; + cam_sensor_mclk3_active = "/fragment@71/__overlay__/cam_sensor_mclk3_active"; + cam_sensor_mclk3_suspend = "/fragment@71/__overlay__/cam_sensor_mclk3_suspend"; + cam_sensor_mclk4_active = "/fragment@71/__overlay__/cam_sensor_mclk4_active"; + cam_sensor_mclk4_suspend = "/fragment@71/__overlay__/cam_sensor_mclk4_suspend"; + rcam1_sensor_reset_active = "/fragment@71/__overlay__/rcam1_sensor_reset_active"; + rcam1_sensor_reset_suspend = "/fragment@71/__overlay__/rcam1_sensor_reset_suspend"; + front_sensor_reset_active = "/fragment@71/__overlay__/front_sensor_reset_active"; + front_sensor_reset_suspend = "/fragment@71/__overlay__/front_sensor_reset_suspend"; + rcam3_sensor_reset_active = "/fragment@71/__overlay__/rcam3_sensor_reset_active"; + rcam3_sensor_reset_suspend = "/fragment@71/__overlay__/rcam3_sensor_reset_suspend"; + rcam2_sensor_reset_active = "/fragment@71/__overlay__/rcam2_sensor_reset_active"; + rcam2_sensor_reset_suspend = "/fragment@71/__overlay__/rcam2_sensor_reset_suspend"; + rcam4_sensor_reset_active = "/fragment@71/__overlay__/rcam4_sensor_reset_active"; + rcam4_sensor_reset_suspend = "/fragment@71/__overlay__/rcam4_sensor_reset_suspend"; + rcam1_sensor_vana_active = "/fragment@71/__overlay__/rcam1_sensor_vana_active"; + rcam1_sensor_vana_suspend = "/fragment@71/__overlay__/rcam1_sensor_vana_suspend"; + rcam2_sensor_vana_active = "/fragment@71/__overlay__/rcam2_sensor_vana_active"; + rcam2_sensor_vana_suspend = "/fragment@71/__overlay__/rcam2_sensor_vana_suspend"; + rcam3_sensor_vana_active = "/fragment@71/__overlay__/rcam3_sensor_vana_active"; + rcam3_sensor_vana_suspend = "/fragment@71/__overlay__/rcam3_sensor_vana_suspend"; + rcam4_sensor_vana_active = "/fragment@71/__overlay__/rcam4_sensor_vana_active"; + rcam4_sensor_vana_suspend = "/fragment@71/__overlay__/rcam4_sensor_vana_suspend"; + cam_mipi_sel_active = "/fragment@71/__overlay__/cam_mipi_sel_active"; + cam_mipi_sel_suspend = "/fragment@71/__overlay__/cam_mipi_sel_suspend"; + rcam2_sensor_vdig_active = "/fragment@71/__overlay__/rcam2_sensor_vdig_active"; + rcam2_sensor_vdig_suspend = "/fragment@71/__overlay__/rcam2_sensor_vdig_suspend"; + rcam4_sensor_vdig_active = "/fragment@71/__overlay__/rcam4_sensor_vdig_active"; + rcam4_sensor_vdig_suspend = "/fragment@71/__overlay__/rcam4_sensor_vdig_suspend"; + if_pmic_i2c_pins = "/fragment@71/__overlay__/if_pmic_i2c_pins"; + if_pmic_i2c_sleep = "/fragment@71/__overlay__/if_pmic_i2c_pins/if_pmic_i2c_sleep"; + usbpd_i2c_pins = "/fragment@71/__overlay__/usbpd_i2c_pins"; + usbpd_i2c_sleep = "/fragment@71/__overlay__/usbpd_i2c_pins/usbpd_i2c_sleep"; + mcu_reset_active = "/fragment@71/__overlay__/mcu_reset_active"; + mcu_reset_suspend = "/fragment@71/__overlay__/mcu_reset_suspend"; + mcu_clk_active = "/fragment@71/__overlay__/mcu_clk_active"; + mcu_clk_suspend = "/fragment@71/__overlay__/mcu_clk_suspend"; + torch_en_active = "/fragment@71/__overlay__/torch_en_active"; + torch_en_suspend = "/fragment@71/__overlay__/torch_en_suspend"; + grip_int_active = "/fragment@72/__overlay__/grip_int_active"; + grip_int_suspend = "/fragment@72/__overlay__/grip_int_suspend"; + i2c2 = "/fragment@77/__overlay__/i2c@2"; + s2mpb03_l1 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo1"; + s2mpb03_l2 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo2"; + s2mpb03_l3 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo3"; + s2mpb03_l4 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo4"; + s2mpb03_l5 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo5"; + s2mpb03_l6 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo6"; + s2mpb03_l7 = "/fragment@77/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo7"; + tsp_int = "/fragment@82/__overlay__/tsp_int"; + qupv3_se7_i2c_pins_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp"; + qupv3_se7_i2c_active_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp/qupv3_se7_i2c_active_tsp"; + qupv3_se7_i2c_sleep_tsp = "/fragment@82/__overlay__/qupv3_se7_i2c_pins_tsp/qupv3_se7_i2c_sleep_tsp"; + tsp_zt = "/fragment@83/__overlay__/touchscreen@20"; + tsp_stm = "/fragment@83/__overlay__/touchscreen@49"; + key_vol_up_default = "/fragment@84/__overlay__/key_vol_up/key_vol_up_default"; + self_display_FC3_dtsi = "/fragment@87/__overlay__/self_display_FC3_dtsi"; + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD = "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; + ss_dsi_panel_PBA_BOOTING_FHD = "/fragment@89/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD"; + sde_te_active = "/fragment@90/__overlay__/pmx_sde_te/sde_te_active"; + sde_te_suspend = "/fragment@90/__overlay__/pmx_sde_te/sde_te_suspend"; + pmx_sde = "/fragment@90/__overlay__/pmx_sde"; + sde_dsi_active = "/fragment@90/__overlay__/pmx_sde/sde_dsi_active"; + sde_dsi_suspend = "/fragment@90/__overlay__/pmx_sde/sde_dsi_suspend"; + sde_ub_det_default = "/fragment@91/__overlay__/pmx_sde_ub_det/sde_ub_det_default"; + sde_fg_err_default = "/fragment@92/__overlay__/pmx_sde_fg_err/sde_fg_err_default"; + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD_display = "/fragment@93/__overlay__/qcom,dsi-display@9"; + ss_dsi_panel_PBA_BOOTING_FHD_display = "/fragment@93/__overlay__/qcom,dsi-display@10"; + if_pmic_irq_default = "/fragment@99/__overlay__/if_pmic_irq/if_pmic_irq_default"; + usbpd_irq_default = "/fragment@99/__overlay__/usbpd_irq/usbpd_irq_default"; + fps_rst = "/fragment@101/__overlay__/fps_rst"; + sm5714_flash0 = "/fragment@106/__overlay__/qcom,flash_0"; + sm5714_torch0 = "/fragment@106/__overlay__/qcom,torch_0"; + led_flash0 = "/fragment@106/__overlay__/qcom,camera-flash@0"; + ois_rear = "/fragment@108/__overlay__/qcom,ois@62"; + eeprom2 = "/fragment@109/__overlay__/qcom,eeprom@0x2D"; + eeprom3 = "/fragment@109/__overlay__/qcom,eeprom@37"; + sensor_rear_macro = "/fragment@110/__overlay__/qcom,cam-sensor@4"; + eeprom4 = "/fragment@110/__overlay__/qcom,eeprom@0x3F"; + actuator_rear0 = "/fragment@111/__overlay__/qcom,actuator@0xC"; + eeprom0 = "/fragment@111/__overlay__/qcom,eeprom@50"; + eeprom1 = "/fragment@111/__overlay__/qcom,eeprom@51"; + nfc_qupv3_se0_i2c_sleep = "/fragment@113/__overlay__/nfc_qupv3_se0_i2c_sleep"; + nfc_clk_req_gpio = "/fragment@113/__overlay__/nfc_clk_req_gpio"; + nfc_irq_gpio = "/fragment@113/__overlay__/nfc_irq_gpio"; + nfc_ven_gpio = "/fragment@113/__overlay__/nfc_ven_gpio"; + nfc_firm_gpio = "/fragment@113/__overlay__/nfc_firm_gpio"; + nfc_ldo_en_gpio = "/fragment@113/__overlay__/nfc_ldo_en_gpio"; + hall_default = "/fragment@116/__overlay__/hall/hall_default"; + L8C = "/fragment@117/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150l_l8 = "/fragment@117/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150_l5 = "/fragment@117/__overlay__/rpmh-regulator-ldoa5/regulator-pm6150-l5"; + i2c_17 = "/fragment@117/__overlay__/i2c@17"; + }; + + __fixups__ { + mdss_mdp = "/fragment@0:target:0", "/fragment@1:target:0", "/fragment@2:target:0", "/fragment@3:target:0", "/fragment@4:target:0", "/fragment@5:target:0", "/fragment@8:target:0", "/fragment@10:target:0", "/fragment@88:target:0", "/fragment@89:target:0"; + tlmm = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-te-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-te-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-te-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-te-gpio:0", "/fragment@7/__overlay__:qcom,usbplug-cc-gpio:0", "/fragment@17/__overlay__:cd-gpios:0", "/fragment@24/__overlay__/synaptics_tcm@20:interrupt-parent:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,irq-gpio:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,reset-gpio:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:interrupt-parent:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:reset-gpios:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:irq-gpios:0", "/fragment@25/__overlay__/nq@28:qcom,nq-irq:0", "/fragment@25/__overlay__/nq@28:qcom,nq-ven:0", "/fragment@25/__overlay__/nq@28:qcom,nq-firm:0", "/fragment@25/__overlay__/nq@28:qcom,nq-clkreq:0", "/fragment@25/__overlay__/nq@28:interrupt-parent:0", "/fragment@35:target:0", "/fragment@67/__overlay__/i2c@18:gpios:0", "/fragment@67/__overlay__/i2c@18:gpios:12", "/fragment@67/__overlay__/i2c@18/tas256x@4c:ti,reset-gpio:0", "/fragment@67/__overlay__/i2c@18/tas256x@4c:ti,irq-gpio:0", "/fragment@68/__overlay__:qcom,fm-lna-gpios:0", "/fragment@70:target:0", "/fragment@71:target:0", "/fragment@73:target:0", "/fragment@77/__overlay__/i2c@2:gpios:0", "/fragment@77/__overlay__/i2c@2:gpios:12", "/fragment@82:target:0", "/fragment@83/__overlay__/touchscreen@20:zinitix,irq_gpio:0", "/fragment@83/__overlay__/touchscreen@49:stm,irq_gpio:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:qcom,platform-reset-gpio:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:qcom,platform-te-gpio:0", "/fragment@89/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD:qcom,platform-reset-gpio:0", "/fragment@90:target:0", "/fragment@97/__overlay__/sm5714@49:sm5714,irq-gpio:0", "/fragment@98/__overlay__/usbpd-sm5714@33:usbpd,usbpd_int:0", "/fragment@99:target:0", "/fragment@101:target:0", "/fragment@103/__overlay__/gw9558-spi@0:goodix,gpio_reset:0", "/fragment@104/__overlay__/gw9558@0:goodix,gpio_reset:0", "/fragment@107/__overlay__/sm5714-fled:flash-en-gpio:0", "/fragment@107/__overlay__/sm5714-fled:torch-en-gpio:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:12", "/fragment@108/__overlay__/qcom,ois@62:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:24", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@37:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:36", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:12", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:24", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:36", "/fragment@113:target:0", "/fragment@114/__overlay__/sec-nfc@27:interrupt-parent:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,ven-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,irq-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,firm-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,clk_req-gpio:0", "/fragment@114/__overlay__/sec-nfc@27:sec-nfc,pvdd-gpio:0", "/fragment@117/__overlay__/i2c@17:gpios:0", "/fragment@117/__overlay__/i2c@17:gpios:12", "/fragment@118:target:0", "/fragment@120:target:0", "/fragment@122:target:0", "/fragment@123:target:0", "/fragment@125:target:0", "/fragment@126/__overlay__/msm_vibrator:motor-en:0"; + pm6150l_gpios = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-reset-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-reset-gpio:0", "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-bklight-en-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-en-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-reset-gpio:0", "/fragment@22:target:0", "/fragment@72:target:0", "/fragment@84:target:0", "/fragment@85/__overlay__/vol_up:gpios:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:samsung,esd-irq-gpio1:0", "/fragment@92:target:0", "/fragment@117/__overlay__/i2c@17/sx9360-i2c@28:sx9360,nirq-gpio:0"; + soc = "/fragment@6:target:0", "/fragment@11:target:0", "/fragment@23:target:0", "/fragment@31:target:0", "/fragment@34:target:0", "/fragment@60:target:0", "/fragment@67:target:0", "/fragment@77:target:0", "/fragment@86:target:0", "/fragment@87:target:0", "/fragment@93:target:0", "/fragment@104:target:0", "/fragment@106:target:0", "/fragment@112:target:0", "/fragment@115:target:0", "/fragment@117:target:0", "/fragment@119:target:0", "/fragment@124:target:0", "/fragment@126:target:0", "/fragment@128:target:0", "/fragment@130:target:0"; + mdss_dsi0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-ctrl:0"; + mdss_dsi_phy0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-phy:0"; + mdss_dsi0_pll = "/fragment@6/__overlay__/qcom,dsi-display:clocks:0", "/fragment@6/__overlay__/qcom,dsi-display:clocks:8", "/fragment@6/__overlay__/qcom,dsi-display:clocks:16", "/fragment@6/__overlay__/qcom,dsi-display:clocks:24", "/fragment@6/__overlay__/qcom,dsi-display:clocks:32", "/fragment@6/__overlay__/qcom,dsi-display:clocks:40", "/fragment@6/__overlay__/qcom,dsi-display:clocks:48", "/fragment@6/__overlay__/qcom,dsi-display:clocks:56", "/fragment@6/__overlay__/qcom,dsi-display:clocks:64", "/fragment@6/__overlay__/qcom,dsi-display:clocks:72"; + L13A = "/fragment@6/__overlay__/qcom,dsi-display:vddio-supply:0"; + L18A = "/fragment@6/__overlay__/qcom,dsi-display:vdda-3p3-supply:0"; + lcdb_ldo_vreg = "/fragment@6/__overlay__/qcom,dsi-display:lab-supply:0"; + lcdb_ncp_vreg = "/fragment@6/__overlay__/qcom,dsi-display:ibb-supply:0"; + pm6150_l18 = "/fragment@6/__overlay__/qcom,dsi-display:vci-supply:0"; + pm6150_l13 = "/fragment@6/__overlay__/qcom,dsi-display:vddi-supply:0"; + sde_dp = "/fragment@7:target:0", "/fragment@8/__overlay__:connectors:8", "/fragment@26:target:0"; + pm6150_pdphy = "/fragment@7/__overlay__:qcom,dp-usbpd-detection:0"; + sde_dp_usbplug_cc_active = "/fragment@7/__overlay__:pinctrl-0:0"; + sde_dp_usbplug_cc_suspend = "/fragment@7/__overlay__:pinctrl-1:0"; + sde_rscc = "/fragment@8/__overlay__:connectors:12"; + thermal_zones = "/fragment@9:target:0", "/fragment@18:target:0"; + pm6150_trip0 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:trip:0"; + pm6150_charger = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:cooling-device:0", "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:cooling-device:0", "/fragment@21:target:0"; + pm6150_trip1 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:trip:0"; + pm6150l_trip0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:trip:0"; + CPU0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:cooling-device:0"; + CPU1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:cooling-device:0"; + CPU2 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:cooling-device:0"; + CPU3 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:cooling-device:0"; + CPU4 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:cooling-device:0"; + CPU5 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:cooling-device:0"; + CPU6 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:cooling-device:0"; + CPU7 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:cooling-device:0"; + pm6150l_trip1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:trip:0"; + bcl_lvl0 = "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:trip:0"; + bcl_lvl1 = "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:trip:0"; + bcl_lvl2 = "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:trip:0"; + soc_trip = "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:trip:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:trip:0"; + pm6150l_vadc = "/fragment@12:target:0", "/fragment@13/__overlay__:io-channels:0", "/fragment@13/__overlay__:io-channels:8", "/fragment@13/__overlay__:io-channels:16", "/fragment@13/__overlay__:io-channels:24", "/fragment@77/__overlay__/sec_thermistor@1:io-channels:0", "/fragment@77/__overlay__/sec_thermistor@2:io-channels:0", "/fragment@80:target:0"; + pm6150l_adc_tm = "/fragment@13:target:0", "/fragment@18/__overlay__/pa-therm1:thermal-sensors:0"; + ufsphy_mem = "/fragment@14:target:0"; + pm6150_l4 = "/fragment@14/__overlay__:vdda-phy-supply:0"; + pm6150l_l3 = "/fragment@14/__overlay__:vdda-pll-supply:0", "/fragment@15/__overlay__:qcom,vddp-ref-clk-supply:0"; + ufshc_mem = "/fragment@15:target:0", "/fragment@63:target:0"; + ufs_phy_gdsc = "/fragment@15/__overlay__:vdd-hba-supply:0"; + pm6150_l19 = "/fragment@15/__overlay__:vcc-supply:0", "/fragment@16/__overlay__:vdd-supply:0"; + pm6150_l12 = "/fragment@15/__overlay__:vccq2-supply:0", "/fragment@16/__overlay__:vdd-io-supply:0"; + sdhc_1 = "/fragment@16:target:0"; + sdc1_clk_on = "/fragment@16/__overlay__:pinctrl-0:0"; + sdc1_cmd_on = "/fragment@16/__overlay__:pinctrl-0:4"; + sdc1_data_on = "/fragment@16/__overlay__:pinctrl-0:8"; + sdc1_rclk_on = "/fragment@16/__overlay__:pinctrl-0:12"; + sdc1_clk_off = "/fragment@16/__overlay__:pinctrl-1:0"; + sdc1_cmd_off = "/fragment@16/__overlay__:pinctrl-1:4"; + sdc1_data_off = "/fragment@16/__overlay__:pinctrl-1:8"; + sdc1_rclk_off = "/fragment@16/__overlay__:pinctrl-1:12"; + sdhc_2 = "/fragment@17:target:0"; + pm6150l_l9 = "/fragment@17/__overlay__:vdd-supply:0"; + pm6150l_l6 = "/fragment@17/__overlay__:vdd-io-supply:0"; + sdc2_clk_on = "/fragment@17/__overlay__:pinctrl-0:0"; + sdc2_cmd_on = "/fragment@17/__overlay__:pinctrl-0:4"; + sdc2_data_on = "/fragment@17/__overlay__:pinctrl-0:8"; + sdc2_cd_on = "/fragment@17/__overlay__:pinctrl-0:12"; + sdc2_clk_off = "/fragment@17/__overlay__:pinctrl-1:0"; + sdc2_cmd_off = "/fragment@17/__overlay__:pinctrl-1:4"; + sdc2_data_off = "/fragment@17/__overlay__:pinctrl-1:8"; + sdc2_cd_off = "/fragment@17/__overlay__:pinctrl-1:12"; + pm6150a_amoled = "/fragment@19:target:0"; + pm6150_qg = "/fragment@20:target:0"; + pm6150_vadc = "/fragment@21/__overlay__:io-channels:0", "/fragment@21/__overlay__:io-channels:8", "/fragment@21/__overlay__:io-channels:16", "/fragment@21/__overlay__:io-channels:24", "/fragment@21/__overlay__:io-channels:32", "/fragment@21/__overlay__:io-channels:40", "/fragment@21/__overlay__:io-channels:48", "/fragment@77/__overlay__/sec_thermistor@0:io-channels:0", "/fragment@79:target:0", "/fragment@127:target:0", "/fragment@128/__overlay__/battery:io-channels:0", "/fragment@128/__overlay__/battery:io-channels:8"; + qusb_phy0 = "/fragment@21/__overlay__:dpdm-supply:0", "/fragment@100:target:0"; + qupv3_se7_i2c = "/fragment@24:target:0", "/fragment@83:target:0", "/fragment@107:target:0"; + ts_active = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-0:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-0:0"; + ts_int_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:0"; + ts_reset_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:4", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:4"; + ts_release = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-2:0"; + pm6150_l10 = "/fragment@24/__overlay__/synaptics_tcm@20:vdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:vdd-supply:0", "/fragment@83/__overlay__/touchscreen@49:dvdd-supply:0"; + pm6150l_l7 = "/fragment@24/__overlay__/synaptics_tcm@20:avdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:avdd-supply:0", "/fragment@81:target:0", "/fragment@83/__overlay__/touchscreen@20:avdd-supply:0", "/fragment@83/__overlay__/touchscreen@49:avdd-supply:0"; + qupv3_se0_i2c = "/fragment@25:target:0", "/fragment@114:target:0"; + nfc_int_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:0"; + nfc_enable_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:4"; + nfc_clk_req_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:8"; + nfc_int_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:0"; + nfc_enable_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:4"; + nfc_clk_req_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:8"; + fsa4480 = "/fragment@26/__overlay__:qcom,dp-aux-switch:0", "/fragment@69:target:0"; + q6core = "/fragment@27:target:0", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:4", "/fragment@30:target:0", "/fragment@66:target:0", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:4"; + lpass_core_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:0", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:0", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:0"; + lpass_audio_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:8", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:8", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:8", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:8", "/fragment@28/__overlay__/va-macro@62770000:clocks:0"; + bolero = "/fragment@28:target:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214:qcom,bolero-handle:0", "/fragment@29/__overlay__:asoc-codec:4", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:12", "/fragment@65:target:0", "/fragment@68/__overlay__:asoc-codec:4", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:12"; + L10A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-rxtx-supply:0", "/fragment@28/__overlay__/wcd938x-codec:cdc-vddio-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-ldo-rxtx-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vddpx-1-supply:0"; + L15A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-buck-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-buck-supply:0"; + BOB = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-mic-bias-supply:0"; + atoll_snd = "/fragment@29:target:0", "/fragment@68:target:0"; + stub_codec = "/fragment@29/__overlay__:asoc-codec:0", "/fragment@68/__overlay__:asoc-codec:0"; + audio_apr = "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:0", "/fragment@68/__overlay__:qcom,msm_audio_ssr_devs:0"; + spkr_1_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-0:0"; + spkr_1_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-1:0"; + spkr_2_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-0:0"; + spkr_2_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-1:0"; + wcd_reset_active = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-0:0"; + wcd_reset_sleep = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-1:0"; + va_cdc_dma_0_tx = "/fragment@32:target:0"; + aliases = "/fragment@33:target:0", "/fragment@64:target:0"; + clock_gcc = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:0", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:8", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:16"; + qupv3_1 = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:qcom,wrapper-core:0"; + dcc = "/fragment@36:target:0"; + reserved_memory = "/fragment@37:target:0", "/fragment@105:target:0", "/fragment@121:target:0"; + removed_region = "/fragment@38:target:0"; + pil_modem_mem = "/fragment@39:target:0"; + pil_adsp_mem = "/fragment@40:target:0"; + pil_camera_mem = "/fragment@41:target:0"; + pil_npu_mem = "/fragment@42:target:0"; + pil_video_mem = "/fragment@43:target:0"; + pil_cdsp_mem = "/fragment@44:target:0"; + qseecom_mem = "/fragment@45:target:0"; + qseecom_ta_mem = "/fragment@46:target:0"; + secure_carveout_heap = "/fragment@47:target:0"; + cdsp_sec_mem = "/fragment@48:target:0"; + msm_imem = "/fragment@49:target:0"; + camera = "/fragment@50:target:0"; + cam_vfe0 = "/fragment@51:target:0"; + cam_vfe1 = "/fragment@52:target:0"; + cam_vfe_lite = "/fragment@53:target:0"; + cam_lrme = "/fragment@54:target:0"; + shared_meta = "/fragment@55:target:0"; + android_q_fstab = "/fragment@56:target:0"; + pm8008_8 = "/fragment@57:target:0", "/fragment@75:target:0"; + pm8008_9 = "/fragment@58:target:0", "/fragment@76:target:0"; + usb0 = "/fragment@59:target:0"; + firmware = "/fragment@61:target:0"; + pil_modem = "/fragment@62:target:0"; + modem_smp2p_out = "/fragment@62/__overlay__:qcom,smem-states:0", "/fragment@62/__overlay__:qcom,smem-states:8", "/fragment@62/__overlay__:qcom,smem-states:16"; + pcm0 = "/fragment@68/__overlay__:asoc-platform:0"; + pcm1 = "/fragment@68/__overlay__:asoc-platform:4"; + pcm2 = "/fragment@68/__overlay__:asoc-platform:8"; + voip = "/fragment@68/__overlay__:asoc-platform:12"; + voice = "/fragment@68/__overlay__:asoc-platform:16"; + loopback = "/fragment@68/__overlay__:asoc-platform:20"; + compress = "/fragment@68/__overlay__:asoc-platform:24"; + hostless = "/fragment@68/__overlay__:asoc-platform:28"; + afe = "/fragment@68/__overlay__:asoc-platform:32"; + lsm = "/fragment@68/__overlay__:asoc-platform:36"; + routing = "/fragment@68/__overlay__:asoc-platform:40"; + compr = "/fragment@68/__overlay__:asoc-platform:44"; + pcm_noirq = "/fragment@68/__overlay__:asoc-platform:48"; + spmi_bus = "/fragment@74:target:0", "/fragment@117/__overlay__/i2c@17/sx9360-i2c@28:interrupt-parent:0"; + pm6150_gpios = "/fragment@78:target:0", "/fragment@88/__overlay__/ss_dsi_panel_S6E3FC3_AMS646YD04_FHD:samsung,ub-con-det:0", "/fragment@91:target:0", "/fragment@115/__overlay__/hall:hall,gpio_flip_cover:0", "/fragment@116:target:0"; + gpio_key = "/fragment@85:target:0"; + cont_splash_memory = "/fragment@94:target:0"; + dfps_data_memory = "/fragment@95:target:0"; + disp_rdump_memory = "/fragment@96:target:0"; + qupv3_se4_i2c = "/fragment@97:target:0", "/fragment@129:target:0"; + qupv3_se11_i2c = "/fragment@98:target:0"; + pm6150l_l11 = "/fragment@102:target:0"; + qupv3_se6_spi = "/fragment@103:target:0"; + pm6150l_switch2 = "/fragment@106/__overlay__/qcom,camera-flash@0:switch-source:0"; + qupv3_se10_i2c = "/fragment@108:target:0"; + cam_cci0 = "/fragment@109:target:0"; + titan_top_gdsc = "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@37:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:cam_clk-supply:0"; + clock_camcc = "/fragment@109/__overlay__/qcom,cam-sensor@0:clocks:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@37:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:clocks:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:clocks:0"; + cam_cci1 = "/fragment@110:target:0"; + qupv3_se9_i2c = "/fragment@111:target:0"; + apps_rsc = "/fragment@117/__overlay__/rpmh-regulator-ldoc8:mboxes:0"; + }; + + __local_fixups__ { + + fragment@0 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@1 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@2 { + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@5 { + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@6 { + + __overlay__ { + + qcom,dsi-display@0 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@1 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@2 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@3 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@4 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@5 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + qcom,dsi-display-list = <0x0 0x4>; + }; + }; + }; + + fragment@7 { + + __overlay__ { + qcom,ext-disp = <0x0>; + }; + }; + + fragment@8 { + + __overlay__ { + connectors = <0x0 0x4>; + }; + }; + + fragment@20 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@21 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@28 { + + __overlay__ { + + bolero-clk-rsc-mngr { + clocks = <0x0 0x8 0x10 0x18 0x20 0x28 0x30 0x38>; + }; + + tx-macro@62620000 { + clocks = <0x0 0x8>; + qcom,tx-swr-gpios = <0x0>; + }; + + rx-macro@62600000 { + clocks = <0x0 0x8>; + qcom,rx-swr-gpios = <0x0>; + }; + + wsa-macro@62640000 { + clocks = <0x0 0x8>; + qcom,wsa-swr-gpios = <0x0>; + + wsa_swr_master { + + wsa881x@20170211 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@20170212 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170213 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170214 { + qcom,spkr-sd-n-node = <0x0>; + }; + }; + }; + + wcd938x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + mbhc-button-thres = <0x0 0xc 0x18 0x24 0x30 0x3c 0x48 0x54>; + imp-table = <0x0 0x10 0x20 0x30 0x40 0x50 0x60 0x70>; + }; + + wcd937x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + }; + }; + }; + + fragment@29 { + + __overlay__ { + qcom,cdc-dmic01-gpios = <0x0>; + qcom,cdc-dmic23-gpios = <0x0>; + qcom,cdc-dmic45-gpios = <0x0>; + asoc-codec = <0x8>; + qcom,wsa-devs = <0x0 0x4 0x8 0xc>; + qcom,codec-aux-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@30 { + + __overlay__ { + + cdc_dmic01_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic23_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic45_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + wsa_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + rx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + tx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@34 { + + __overlay__ { + + qcom,qup_hsuart@a88000 { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@60 { + + __overlay__ { + + qcom,memshare { + + qcom,client_4 { + memory-region = <0x0>; + }; + }; + + samsung,sec_hdm { + memory-region = <0x0>; + }; + }; + }; + + fragment@66 { + + __overlay__ { + + msm_cdc_pinctrl_quin { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@67 { + + __overlay__ { + + i2c@18 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@68 { + + __overlay__ { + asoc-platform = <0x34>; + qcom,quin-mi2s-gpios = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@77 { + + __overlay__ { + + i2c@2 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@83 { + + __overlay__ { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + + touchscreen@20 { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + + touchscreen@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@85 { + + __overlay__ { + pinctrl-0 = <0x0>; + }; + }; + + fragment@88 { + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS646YD04_FHD { + ss,self_display = <0x0>; + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@89 { + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@97 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sm5714@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@98 { + + __overlay__ { + pinctrl-1 = <0x0>; + + usbpd-sm5714@33 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@103 { + + __overlay__ { + + gw9558-spi@0 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@104 { + + __overlay__ { + + gw9558@0 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@106 { + + __overlay__ { + + qcom,camera-flash@0 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,cam-res-mgr { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + }; + }; + + fragment@108 { + + __overlay__ { + + qcom,ois@62 { + cam_vaf-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@109 { + + __overlay__ { + + qcom,cam-sensor@0 { + actuator-src = <0x0>; + led-flash-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@2 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x2D { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@37 { + cam_vio-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + }; + }; + + fragment@110 { + + __overlay__ { + + qcom,cam-sensor@1 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@8 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@3 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@4 { + led-flash-src = <0x0>; + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + cam_vdig-supply = <0x0>; + }; + + qcom,eeprom@0x3F { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + cam_vdig-supply = <0x0>; + }; + }; + }; + + fragment@111 { + + __overlay__ { + + qcom,actuator@0xC { + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + }; + + qcom,eeprom@50 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@51 { + cam_vio-supply = <0x0>; + }; + }; + }; + + fragment@114 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sec-nfc@27 { + pinctrl-0 = <0x0 0x4 0x8 0xc 0x10>; + }; + }; + }; + + fragment@115 { + + __overlay__ { + + hall { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@117 { + + __overlay__ { + + i2c@17 { + pinctrl-0 = <0x0>; + + sx9360-i2c@28 { + pinctrl-0 = <0x0>; + }; + }; + }; + }; + }; }; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-input-common.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-input-common.dtsi deleted file mode 100755 index 8e716a68eaaf..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-input-common.dtsi +++ /dev/null @@ -1,170 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -&pm6150l_l7 { - regulator-min-microvolt = <3000000>; - regulator-max-microvolt = <3000000>; - regulator-boot-on; -}; - -&tlmm { - tsp_int: tsp_int { - mux { - pins = "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio9"; - input-enable; - bias-disable; - }; - }; - - qupv3_se7_i2c_pins_tsp: qupv3_se7_i2c_pins_tsp { - qupv3_se7_i2c_active_tsp: qupv3_se7_i2c_active_tsp { - mux { - pins = "gpio6", "gpio7"; - function = "qup11"; - }; - - config { - pins = "gpio6", "gpio7"; - drive-strength = <2>; - bias-disable; - }; - }; - - qupv3_se7_i2c_sleep_tsp: qupv3_se7_i2c_sleep_tsp { - mux { - pins = "gpio6", "gpio7"; - function = "gpio"; - }; - - config { - pins = "gpio6", "gpio7"; - drive-strength = <2>; - bias-disable; - }; - }; - }; -}; - -&qupv3_se7_i2c { - status = "ok"; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&qupv3_se7_i2c_active_tsp>; - pinctrl-1 = <&qupv3_se7_i2c_sleep_tsp>; - - synaptics_tcm@20 { - status = "disabled"; - }; - atmel_mxt_ts@4a { - status = "disabled"; - }; - - tsp_zt: touchscreen@20 { - status = "disabled"; - compatible = "zinitix,zt_ts_device"; - reg = <0x20>; - pinctrl-names = "on_state", "off_state"; - pinctrl-0 = <&tsp_int>; - pinctrl-1 = <&tsp_int>; - avdd-supply = <&pm6150l_l7>; - zinitix,gpio_ldo_en; - zinitix,irq_type = <0x2008>; - zinitix,x_resolution = <1080>; - zinitix,y_resolution = <2400>; - zinitix,page_size = <0x80>; - zinitix,irq_gpio = <&tlmm 9 0x2008>; - zinitix,chip_name = "ZT7650"; - zinitix,firmware_name = "tsp_zinitix/zt7650_a52.bin"; - zinitix,spay; - zinitix,aod; - zinitix,aot; - zinitix,mis_cal_check; - support_ear_detect_mode; - support_dex_mode; - zinitix,bringup = <0>; -// zinitix,tclm_level = <0x2>; -// zinitix,afe_base = <0xe>; - zinitix,ss_touch_num = <0x1>; - }; - - tsp_stm: touchscreen@49 { - status = "disabled"; - compatible = "stm,fts_touch"; - reg = <0x49>; - pinctrl-names = "default"; - pinctrl-0 = <&tsp_int>; - dvdd-supply = <&pm6150_l10>; - avdd-supply = <&pm6150l_l7>; - stm,irq_gpio = <&tlmm 9 0x2008>; - stm,max_coords = <4095 4095>; - stm,firmware_name = "tsp_stm/fts5cu56a_a52.bin"; - stm,tclm_level = <2>; - stm,afe_base = <0x14>; - stm,bringup = <0>; - stm,support_fod; - stm,enable_settings_aot; - support_ear_detect; - support_mis_calibration_test; - support_dex_mode; - support_open_short_test; - support_sram_test; -// support_hall_ic; -// support_flex_mode; - stm,ss_touch_num = <1>; -// stm,hw_i2c_reset; - }; -}; - -/delete-node/&key_vol_up_default; -&pm6150l_gpios { - key_vol_up { - key_vol_up_default: key_vol_up_default { - pins = "gpio8"; - function = "normal"; - input-enable; - bias-pull-up; - power-source = <0>; - }; - }; -}; - -/delete-node/&gpio_key; -&gpio_key { - status = "okay"; - compatible = "gpio-keys"; - input-name = "gpio-keys"; - - pinctrl-names = "default"; - pinctrl-0 = <&key_vol_up_default>; - - vol_up { - label = "volume_up"; - gpios = <&pm6150l_gpios 8 0x1>; - linux,input-type = <1>; - linux,code = ; - debounce-interval = <15>; - }; -}; - -&soc { - ss_touch { - compatible = "samsung,ss_touch"; - ss_touch,numbers = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-ltn-overlay-r04.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-ltn-overlay-r04.dts deleted file mode 100755 index f01b34f9318b..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-ltn-overlay-r04.dts +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a52q-r04.dtsi" -#include "drivers/atoll-sec-a52q-battery-r04.dtsi" - -/ { - model = "Samsung A52Q LTN PROJECT REV02 (board-id,04)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 4>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-ltn-overlay-r05.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-ltn-overlay-r05.dts deleted file mode 100755 index e1ab80e9f975..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-ltn-overlay-r05.dts +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a52q-r05.dtsi" -#include "drivers/atoll-sec-a52q-battery-r04.dtsi" - -/ { - model = "Samsung A52Q LTN PROJECT REV03 (board-id,05)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 5>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-ltn-overlay-r06.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-ltn-overlay-r06.dts deleted file mode 100755 index 0152bd1fdeb1..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-ltn-overlay-r06.dts +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a52q-r06.dtsi" -#include "drivers/atoll-sec-a52q-battery-r04.dtsi" - -/ { - model = "Samsung A52Q LTN PROJECT REV03A (board-id,06)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 6>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r00.dtsi deleted file mode 100755 index 7c2800ae7b8f..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r00.dtsi +++ /dev/null @@ -1,687 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "drivers/atoll-sec-a52q-audio-pinctrl-common.dtsi" - -&tlmm { - grip_i2c { - grip_i2c_active: grip_i2c_active { - grip_i2c_active { - pins = "gpio51", "gpio52"; - bias-disable; - }; - }; - grip_i2c_suspend: grip_i2c_suspend { - grip_i2c_suspend { - pins = "gpio51", "gpio52"; - bias-disable; - }; - }; - }; - - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - mux { - pins = "gpio25"; - function = "gpio"; - }; - config { - pins = "gpio25"; - drive-strength = <2>; - bias-disable; - }; - }; - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - mux { - pins = "gpio26"; - function = "gpio"; - }; - config { - pins = "gpio26"; - drive-strength = <2>; - bias-disable; - }; - }; - - cam_sensor_mclk0_active: cam_sensor_mclk0_active { - /* Main Rear MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-disable; /* No PULL */ - drive-strength = <4>; /* 4 MA */ - }; - }; - - cam_sensor_mclk0_suspend: cam_sensor_mclk0_suspend { - /* Main Rear MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-pull-down; /* No PULL */ - drive-strength = <4>; /* 4 MA */ - output-low; - }; - }; - - cam_sensor_mclk1_active: cam_sensor_mclk1_active { - /* FRONT MCLK */ - mux { - pins = "gpio23"; - function = "cam_mclk"; - }; - config { - pins = "gpio23"; - bias-disable; /* No PULL */ - drive-strength = <4>; /* 4 MA */ - }; - }; - - cam_sensor_mclk1_suspend: cam_sensor_mclk1_suspend { - /* FRONT MCLK */ - mux { - pins = "gpio23"; - function = "cam_mclk"; - }; - config { - pins = "gpio23"; - bias-pull-down; /* No PULL */ - drive-strength = <4>; /* 4 MA */ - output-low; - }; - }; - - cam_sensor_mclk2_active: cam_sensor_mclk2_active { - /* Bokeh Cam MCLK */ - mux { - pins = "gpio14"; - function = "cam_mclk"; - }; - config { - pins = "gpio14"; - bias-disable; /* No PULL */ - drive-strength = <4>; /* 4 MA */ - }; - }; - - cam_sensor_mclk2_suspend: cam_sensor_mclk2_suspend { - /* Bokeh Cam MCLK */ - mux { - pins = "gpio14"; - function = "cam_mclk"; - }; - config { - pins = "gpio14"; - bias-pull-down; /* No PULL */ - drive-strength = <4>; /* 4 MA */ - output-low; - }; - }; - - cam_sensor_mclk3_active: cam_sensor_mclk3_active { - /* UW Cam MCLK */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - config { - pins = "gpio15"; - bias-disable; /* No PULL */ - drive-strength = <4>; /* 4 MA */ - }; - }; - - cam_sensor_mclk3_suspend: cam_sensor_mclk3_suspend { - /* UW Cam MCLK */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - config { - pins = "gpio15"; - bias-pull-down; /* No PULL */ - drive-strength = <4>; /* 4 MA */ - output-low; - - }; - }; - - cam_sensor_mclk4_active: cam_sensor_mclk4_active { - /* Macro Cam MCLK */ - mux { - pins = "gpio16"; - function = "cam_mclk"; - }; - config { - pins = "gpio16"; - bias-disable; /* No PULL */ - drive-strength = <4>; /* 4 MA */ - }; - }; - - cam_sensor_mclk4_suspend: cam_sensor_mclk4_suspend { - /* Macro Cam MCLK */ - mux { - pins = "gpio16"; - function = "cam_mclk"; - }; - config { - pins = "gpio16"; - bias-pull-down; /* No PULL */ - drive-strength = <4>; /* 4 MA */ - output-low; - - }; - }; - - rcam1_sensor_reset_active: rcam1_sensor_reset_active { - /* Main Rear reset */ - mux { - pins = "gpio30"; - function = "gpio"; - }; - config { - pins = "gpio30"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - rcam1_sensor_reset_suspend: rcam1_sensor_reset_suspend { - /* Main Rear reset */ - mux { - pins = "gpio30"; - function = "gpio"; - }; - config { - pins = "gpio30"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - front_sensor_reset_active: front_sensor_reset_active { - /* FRONT RESET */ - mux { - pins = "gpio21"; - function = "gpio"; - }; - config { - pins = "gpio21"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - front_sensor_reset_suspend: front_sensor_reset_suspend { - /* FRONT RESET */ - mux { - pins = "gpio21"; - function = "gpio"; - }; - config { - pins = "gpio21"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam3_sensor_reset_active: rcam3_sensor_reset_active { - /* UW Cam RESET */ - mux { - pins = "gpio29"; - function = "gpio"; - }; - config { - pins = "gpio29"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - rcam3_sensor_reset_suspend: rcam3_sensor_reset_suspend { - /* UW Cam RESET */ - mux { - pins = "gpio29"; - function = "gpio"; - }; - config { - pins = "gpio29"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_reset_active: rcam2_sensor_reset_active { - /* Bokeh Cam RESET */ - mux { - pins = "gpio42"; - function = "gpio"; - }; - config { - pins = "gpio42"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_reset_suspend: rcam2_sensor_reset_suspend { - /* Bokeh Cam RESET */ - mux { - pins = "gpio42"; - function = "gpio"; - }; - config { - pins = "gpio42"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_reset_active: rcam4_sensor_reset_active { - /* Macro Cam RESET */ - mux { - pins = "gpio24"; - function = "gpio"; - }; - config { - pins = "gpio24"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_reset_suspend: rcam4_sensor_reset_suspend { - /* Macro Cam RESET */ - mux { - pins = "gpio24"; - function = "gpio"; - }; - config { - pins = "gpio24"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam1_sensor_vana_active: rcam1_sensor_vana_active { - /* Rear VANA */ - mux { - pins = "gpio63"; - function = "gpio"; - }; - config { - pins = "gpio63"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - rcam1_sensor_vana_suspend: rcam1_sensor_vana_suspend { - /* Rear VANA */ - mux { - pins = "gpio63"; - function = "gpio"; - }; - config { - pins = "gpio63"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_vana_active: rcam2_sensor_vana_active { - /* Bokeh VANA */ - mux { - pins = "gpio64"; - function = "gpio"; - }; - config { - pins = "gpio64"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_vana_suspend: rcam2_sensor_vana_suspend { - /* Bokeh VANA */ - mux { - pins = "gpio64"; - function = "gpio"; - }; - config { - pins = "gpio64"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam3_sensor_vana_active: rcam3_sensor_vana_active { - /* UW VANA */ - mux { - pins = "gpio65"; - function = "gpio"; - }; - config { - pins = "gpio65"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - rcam3_sensor_vana_suspend: rcam3_sensor_vana_suspend { - /* UW VANA */ - mux { - pins = "gpio65"; - function = "gpio"; - }; - config { - pins = "gpio65"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_vana_active: rcam4_sensor_vana_active { - /* Macro VANA */ - mux { - pins = "gpio74"; - function = "gpio"; - }; - config { - pins = "gpio74"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_vana_suspend: rcam4_sensor_vana_suspend { - /* Macro VANA */ - mux { - pins = "gpio74"; - function = "gpio"; - }; - config { - pins = "gpio74"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_mipi_sel_active: cam_mipi_sel_active { - /* MIPI SEL */ - mux { - pins = "gpio66"; - function = "gpio"; - }; - config { - pins = "gpio66"; - bias-disable; - output-high; - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_mipi_sel_suspend: cam_mipi_sel_suspend { - /* MIPI SEL */ - mux { - pins = "gpio66"; - function = "gpio"; - }; - config { - pins = "gpio66"; - bias-pull-down; - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_vdig_active: rcam2_sensor_vdig_active { - /* Bokeh VDIG */ - mux { - pins = "gpio64"; - function = "gpio"; - }; - config { - pins = "gpio64"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_vdig_suspend: rcam2_sensor_vdig_suspend { - /* Bokeh VDIG */ - mux { - pins = "gpio64"; - function = "gpio"; - }; - config { - pins = "gpio64"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_vdig_active: rcam4_sensor_vdig_active { - /* Macro VDIG */ - mux { - pins = "gpio74"; - function = "gpio"; - }; - config { - pins = "gpio74"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_vdig_suspend: rcam4_sensor_vdig_suspend { - /* Macro VDIG */ - mux { - pins = "gpio74"; - function = "gpio"; - }; - config { - pins = "gpio74"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - if_pmic_i2c_pins: if_pmic_i2c_pins { - if_pmic_i2c_sleep: if_pmic_i2c_sleep { - mux { - pins = "gpio115", "gpio116"; - function = "gpio"; - }; - - config { - pins = "gpio115", "gpio116"; - drive-strength = <2>; - input-enable; - bias-disable; - }; - }; - }; - usbpd_i2c_pins: usbpd_i2c_pins { - usbpd_i2c_sleep: usbpd_i2c_sleep { - mux { - pins = "gpio53", "gpio54"; - function = "gpio"; - }; - - config { - pins = "gpio53", "gpio54"; - drive-strength = <2>; - input-enable; - bias-disable; - }; - }; - }; - - mcu_reset_active: mcu_reset_active { - /* MCU Reset */ - mux { - pins = "gpio32"; - function = "gpio"; - }; - config { - pins = "gpio32"; - bias-disable; /* No PULL */ - /*output-high;*/ - drive-strength = <2>; /* 2 MA */ - }; - }; - - mcu_reset_suspend: mcu_reset_suspend { - /* MCU Reset */ - mux { - pins = "gpio32"; - function = "gpio"; - }; - config { - pins = "gpio32"; - bias-pull-down; /* PULL DOWN */ - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; - - mcu_clk_active: mcu_clk_active { - /* MCU CLK */ - mux { - pins = "gpio43"; - function = "gpio"; - }; - config { - pins = "gpio43"; - bias-disable; /* No PULL */ - //output-high; - drive-strength = <2>; /* 2 MA */ - }; - }; - - mcu_clk_suspend: mcu_clk_suspend { - /* MCU Reset */ - mux { - pins = "gpio43"; - function = "gpio"; - }; - config { - pins = "gpio43"; - bias-pull-down; /* PULL DOWN */ - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; - - torch_en_active: torch_en_active { - mux { - pins = "gpio67" ,"gpio22"; - function = "gpio"; - }; - config { - pins = "gpio67" ,"gpio22"; - bias-pull-down; /* PULL DOWN */ - output-high; - drive-strength = <2>; /* 2 MA */ - }; - }; - - torch_en_suspend: torch_en_suspend { - mux { - pins = "gpio67" ,"gpio22"; - function = "gpio"; - }; - config { - pins = "gpio67" ,"gpio22"; - bias-pull-down; /* PULL DOWN */ - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; - -}; - -&pm6150l_gpios { - grip_int_active: grip_int_active { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_int_suspend: grip_int_suspend { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; - -&tlmm { - wakeup-disabled-gpios = < - 0 /* SPI : NFC_ESE_MISO */ - 3 /* LAGOON : NFC_ESE_CS_N */ - 6 /* I2C : TSP_SDA_1P8 */ - 10 /* LAGOON : DISP_TE */ - 16 /* MCLK : RCAM4_MCLK */ - 21 /* RST_N : FCAM_RST_N */ - 22 /* EN : CAM_FLASH_EN */ - 23 /* MCLK : FCAM_MCLK */ - 24 /* RST_N : RCAM4_RST_N */ - 26 /* HW-REVIEW : MCU_BOOT0_SWCLK */ - 28 /* I2C : FCAM_RCAM2_RCAM4_SENSOR_I2C_SCL_1P8 */ - 30 /* RST_N : RCAM1_RST_N */ - 32 /* RST_N : MCU_nRST */ - 34 /* I2C : NFC_SDA_1P8 */ - 36 /* LAGOON : NFC_FIRM */ - 37 /* LAGOON : NFC_IRQ */ - 38 /* HW-REVIEW : BT_UART_CTS */ - 39 /* HW-REVIEW : BT_UART_RTS */ - 42 /* I2C : CC_SDA_1P8 */ - 43 /* I2C : CC_SCL_1P8 */ - 45 /* UART : AP_UART_RXD */ - 47 /* I2C : CAM_AF_EEP_I2C_SCL_1P8 */ - 49 /* LAGOON : BT_FM_SB_CLK */ - 52 /* I2C : GRIP_SCL_1P8 */ - 53 /* I2C : CAM_PMIC_I2C_SDA_1P8 */ - 56 /* LAGOON : MST_DATA_B */ - 57 /* EN : MST_LDO_EN */ - 58 /* RST_N : CODEC_RST_N */ - 59 /* SPI : BTP_SPI_MISO */ - 62 /* SPI : BTP_SPI_CS_N */ - 63 /* EN : RCAM1_LDO_EN */ - 64 /* EN : RCAM2_LDO_EN */ - 65 /* EN : RCAM3_LDO_EN */ - 66 /* LAGOON : CAM_SEL */ - 67 /* EN : BTP_LDO_EN */ - 68 /* EN : NFC_LDO_EN */ - 69 /* LAGOON : T_FLASH_DET */ - 72 /* EN : FM_LAN_EN */ - 74 /* EN : RCAM4_LDO_EN */ - 78 /* NC : NC */ - 84 /* NC : NC */ - 86 /* I2C : AP_MCU_SDA_1P8 */ - 87 /* I2C : AP_MCU_SCL_1P8 */ - 91 /* RST_N : BTP_RST_N */ - 93 /* UNUSED : HALL_INT1 */ - 95 /* NC : NC */ - 98 /* NC : NC */ - 109 /* LAGOON : CP_WLAN_COEX_RXD */ - 114 /* LAGOON : AP_USB_BOOT_POL_SEL */ - 115 /* I2C : IF_PMIC_SDA_1P8 */ - 116 /* I2C : IF_PMIC_SCL_1P8 */ - 117 /* NC : NC */ - 118 /* EN : NFC_ESE_EN */ - >; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r01.dtsi deleted file mode 100755 index 9e855f3da2dc..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r01.dtsi +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - wakeup-disabled-gpios = < - 0 /* SPI : NFC_ESE_MISO */ - 3 /* LAGOON : NFC_ESE_CS_N */ - 6 /* I2C : TSP_SDA_1P8 */ - 10 /* LAGOON : DISP_TE */ - 16 /* MCLK : RCAM4_MCLK */ - 21 /* RST_N : FCAM_RST_N */ - 22 /* EN : CAM_FLASH_EN */ - 23 /* MCLK : FCAM_MCLK */ - 24 /* RST_N : RCAM4_RST_N */ - 26 /* I2C : CAM_PMIC_I2C_SCL_1P8 */ - 28 /* I2C : FCAM_RCAM2_RCAM4_SENSOR_I2C_SCL_1P8 */ - 30 /* RST_N : RCAM1_RST_N */ - 32 /* RST_N : MCU_nRST */ - 34 /* I2C : NFC_SDA_1P8 */ - 36 /* LAGOON : NFC_FIRM */ - 37 /* LAGOON : NFC_IRQ */ - 38 /* HW-REVIEW : BT_UART_CTS */ - 39 /* HW-REVIEW : BT_UART_RTS */ - 42 /* RST_N : RCAM2_RST_N */ - 43 /* HW-REVIEW : MCU_BOOT0_SWCLK */ - 45 /* UART : AP_UART_RXD */ - 47 /* I2C : CAM_AF_EEP_I2C_SCL_1P8 */ - 49 /* LAGOON : BT_FM_SB_CLK */ - 52 /* I2C : GRIP_SCL_1P8 */ - 53 /* I2C : CC_SDA_1P8 */ - 56 /* LAGOON : MST_DATA_B */ - 57 /* EN : MST_LDO_EN */ - 58 /* RST_N : CODEC_RST_N */ - 59 /* SPI : BTP_SPI_MISO */ - 62 /* SPI : BTP_SPI_CS_N */ - 63 /* EN : RCAM1_LDO_EN */ - 64 /* EN : RCAM2_LDO_EN */ - 65 /* EN : RCAM3_LDO_EN */ - 66 /* LAGOON : CAM_SEL */ - 67 /* EN : BTP_LDO_EN */ - 68 /* EN : NFC_LDO_EN */ - 69 /* LAGOON : T_FLASH_DET */ - 72 /* EN : FM_LAN_EN */ - 74 /* EN : RCAM4_LDO_EN */ - 78 /* NC : NC */ - 84 /* NC : NC */ - 86 /* I2C : AP_MCU_SDA_1P8 */ - 87 /* I2C : AP_MCU_SCL_1P8 */ - 88 /* I2C : SPK_AMP_SDA_1P8 */ - 89 /* I2C : SPK_AMP_SCL_1P8 */ - 90 /* HW-REVIEW : SPK_AMP_INT */ - 91 /* RST_N : BTP_RST_N */ - 93 /* UNUSED : HALL_INT1 */ - 94 /* EN : SPK_AMP_EN */ - 95 /* HW-REVIEW : FAST_BOOT_SEL0 */ - 98 /* HW-REVIEW : FAST_BOOT_SEL3 */ - 109 /* LAGOON : CP_WLAN_COEX_RXD */ - 114 /* LAGOON : AP_USB_BOOT_POL_SEL */ - 115 /* I2C : IF_PMIC_SDA_1P8 */ - 116 /* I2C : IF_PMIC_SCL_1P8 */ - 117 /* NC : NC */ - 118 /* EN : NFC_ESE_EN */ - >; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r02.dtsi deleted file mode 100755 index 43b7e5c64d3c..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r02.dtsi +++ /dev/null @@ -1,99 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&rcam4_sensor_vana_active { - /* Macro VANA */ - mux { - pins = "gpio64"; - function = "gpio"; - }; - config { - pins = "gpio64"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; -}; - -&rcam4_sensor_vana_suspend { - /* Macro VANA */ - mux { - pins = "gpio64"; - function = "gpio"; - }; - config { - pins = "gpio64"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; -}; - -&tlmm { - wakeup-disabled-gpios = < - 0 /* SPI : NFC_ESE_MISO */ - 3 /* LAGOON : NFC_ESE_CS_N */ - 6 /* I2C : TSP_SDA_1P8 */ - 10 /* LAGOON : DISP_TE */ - 11 /* LCD/HW-REVIEW : EL_ON1_DET */ - 16 /* MCLK : RCAM4_MCLK */ - 21 /* RST_N : FCAM_RST_N */ - 22 /* EN : CAM_FLASH_EN */ - 23 /* MCLK : FCAM_MCLK */ - 24 /* RST_N : RCAM4_RST_N */ - 26 /* I2C : CAM_PMIC_I2C_SCL_1P8 */ - 28 /* I2C : FCAM_RCAM2_RCAM4_SENSOR_I2C_SCL_1P8 */ - 30 /* RST_N : RCAM1_RST_N */ - 32 /* RST_N : MCU_nRST */ - 34 /* I2C : NFC_SDA_1P8 */ - 36 /* LAGOON : NFC_FIRM */ - 37 /* LAGOON : NFC_IRQ */ - 38 /* HW-REVIEW : BT_UART_CTS */ - 39 /* HW-REVIEW : BT_UART_RTS */ - 42 /* RST_N : RCAM2_RST_N */ - 43 /* HW-REVIEW : MCU_BOOT0_SWCLK */ - 45 /* UART : AP_UART_RXD */ - 47 /* I2C : CAM_AF_EEP_I2C_SCL_1P8 */ - 49 /* LAGOON : BT_FM_SB_CLK */ - 52 /* I2C : GRIP_SCL_1P8 */ - 53 /* I2C : CC_SDA_1P8 */ - 55 /* NC : NC */ - 57 /* EN : HAPTIC_EN */ - 58 /* RST_N : CODEC_RST_N */ - 59 /* SPI : BTP_SPI_MISO */ - 62 /* SPI : BTP_SPI_CS_N */ - 63 /* EN : RCAM1_LDO_EN */ - 64 /* EN : RCAM2_RCAM4_LDO_EN */ - 65 /* EN : RCAM3_LDO_EN */ - 66 /* LAGOON : CAM_SEL */ - 67 /* EN : CAM_TORCH_EN */ - 68 /* EN : NFC_LDO_EN */ - 69 /* LAGOON : T_FLASH_DET */ - 74 /* NC : NC */ - 78 /* NC : NC */ - 84 /* EN : FM_LNA_EN */ - 86 /* I2C : AP_MCU_SDA_1P8 */ - 87 /* I2C : AP_MCU_SCL_1P8 */ - 88 /* I2C : SPK_AMP_SDA_1P8 */ - 89 /* I2C : SPK_AMP_SCL_1P8 */ - 90 /* HW-REVIEW : SPK_AMP_INT */ - 91 /* RST_N : BTP_RST_N */ - 93 /* UNUSED : HALL_INT1 */ - 94 /* EN : SPK_AMP_EN */ - 95 /* HW-REVIEW : FAST_BOOT_SEL0 */ - 98 /* HW-REVIEW : FAST_BOOT_SEL3 */ - 107 /* HW-REVIEW : FAST_BOOT_SEL2 */ - 109 /* LAGOON : CP_WLAN_COEX_RXD */ - 114 /* LAGOON : AP_USB_BOOT_POL_SEL */ - 115 /* I2C : IF_PMIC_SDA_1P8 */ - 116 /* I2C : IF_PMIC_SCL_1P8 */ - 118 /* EN : NFC_ESE_EN */ - >; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r04.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r04.dtsi deleted file mode 100755 index 3c1ca57ce2a8..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r04.dtsi +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - wakeup-disabled-gpios = < - 0 /* SPI : NFC_ESE_MISO */ - 3 /* LAGOON : NFC_ESE_CS_N */ - 6 /* I2C : TSP_SDA_1P8 */ - 10 /* LAGOON : DISP_TE */ - 11 /* LCD/HW-REVIEW : EL_ON1_DET */ - 16 /* MCLK : RCAM4_MCLK */ - 21 /* RST_N : FCAM_RST_N */ - 22 /* EN : CAM_FLASH_EN */ - 23 /* MCLK : FCAM_MCLK */ - 24 /* RST_N : RCAM4_RST_N */ - 26 /* I2C : CAM_PMIC_I2C_SCL_1P8 */ - 28 /* I2C : FCAM_RCAM2_RCAM4_SENSOR_I2C_SCL_1P8 */ - 30 /* RST_N : RCAM1_RST_N */ - 32 /* RST_N : MCU_nRST */ - 34 /* I2C : NFC_SDA_1P8 */ - 36 /* LAGOON : NFC_FIRM */ - 37 /* LAGOON : NFC_IRQ */ - 38 /* HW-REVIEW : BT_UART_CTS */ - 39 /* HW-REVIEW : BT_UART_RTS */ - 42 /* RST_N : RCAM2_RST_N */ - 43 /* HW-REVIEW : MCU_BOOT0_SWCLK */ - 45 /* UART : AP_UART_RXD */ - 47 /* I2C : CAM_AF_EEP_I2C_SCL_1P8 */ - 49 /* LAGOON : BT_FM_SB_CLK */ - 52 /* I2C : GRIP_SCL_1P8 */ - 53 /* I2C : CC_SDA_1P8 */ - 55 /* NC : NC */ - 56 /* NC : NC */ - 57 /* NC : NC */ - 58 /* RST_N : CODEC_RST_N */ - 59 /* SPI : BTP_SPI_MISO */ - 62 /* SPI : BTP_SPI_CS_N */ - 63 /* EN : RCAM1_LDO_EN */ - 64 /* EN : RCAM2_RCAM4_LDO_EN */ - 65 /* EN : RCAM3_LDO_EN */ - 66 /* LAGOON : CAM_SEL */ - 67 /* EN : CAM_TORCH_EN */ - 68 /* EN : NFC_LDO_EN */ - 69 /* LAGOON : T_FLASH_DET */ - 74 /* NC : NC */ - 78 /* NC : NC */ - 84 /* EN : FM_LNA_EN */ - 86 /* I2C : AP_MCU_SDA_1P8 */ - 87 /* I2C : AP_MCU_SCL_1P8 */ - 88 /* I2C : SPK_AMP_SDA_1P8 */ - 89 /* I2C : SPK_AMP_SCL_1P8 */ - 90 /* HW-REVIEW : SPK_AMP_INT */ - 91 /* RST_N : BTP_RST_N */ - 93 /* UNUSED : HALL_INT1 */ - 94 /* EN : SPK_AMP_EN */ - 95 /* HW-REVIEW : FAST_BOOT_SEL0 */ - 98 /* HW-REVIEW : FAST_BOOT_SEL3 */ - 107 /* HW-REVIEW : FAST_BOOT_SEL2 */ - 109 /* LAGOON : CP_WLAN_COEX_RXD */ - 114 /* LAGOON : AP_USB_BOOT_POL_SEL */ - 115 /* I2C : IF_PMIC_SDA_1P8 */ - 116 /* I2C : IF_PMIC_SCL_1P8 */ - 118 /* EN : NFC_ESE_EN */ - >; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r05.dtsi deleted file mode 100755 index eedb5c3bdc52..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r05.dtsi +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - wakeup-disabled-gpios = < - 0 /* NC : NC */ - 3 /* NC : NC */ - 6 /* I2C : TSP_SDA_1P8 */ - 10 /* LAGOON : DISP_TE */ - 11 /* LCD/HW-REVIEW : EL_ON1_DET */ - 16 /* MCLK : RCAM4_MCLK */ - 21 /* RST_N : FCAM_RST_N */ - 22 /* EN : CAM_FLASH_EN */ - 23 /* MCLK : FCAM_MCLK */ - 24 /* RST_N : RCAM4_RST_N */ - 26 /* I2C : CAM_PMIC_I2C_SCL_1P8 */ - 28 /* I2C : FCAM_RCAM2_RCAM4_SENSOR_I2C_SCL_1P8 */ - 30 /* RST_N : RCAM1_RST_N */ - 32 /* RST_N : MCU_nRST */ - 34 /* I2C : NFC_SDA_1P8 */ - 36 /* LAGOON : NFC_FIRM */ - 37 /* LAGOON : NFC_IRQ */ - 38 /* HW-REVIEW : BT_UART_CTS */ - 39 /* HW-REVIEW : BT_UART_RTS */ - 42 /* RST_N : RCAM2_RST_N */ - 43 /* HW-REVIEW : MCU_BOOT0_SWCLK */ - 45 /* UART : AP_UART_RXD */ - 47 /* I2C : CAM_AF_EEP_I2C_SCL_1P8 */ - 49 /* LAGOON : BT_FM_SB_CLK */ - 52 /* I2C : GRIP_SCL_1P8 */ - 53 /* I2C : CC_SDA_1P8 */ - 55 /* NC : NC */ - 56 /* NC : NC */ - 57 /* NC : NC */ - 58 /* RST_N : CODEC_RST_N */ - 59 /* SPI : BTP_SPI_MISO */ - 62 /* SPI : BTP_SPI_CS_N */ - 63 /* EN : RCAM1_LDO_EN */ - 64 /* EN : RCAM2_RCAM4_LDO_EN */ - 65 /* EN : RCAM3_LDO_EN */ - 66 /* LAGOON : CAM_SEL */ - 67 /* EN : CAM_TORCH_EN */ - 68 /* EN : NFC_LDO_EN */ - 69 /* LAGOON : T_FLASH_DET */ - 74 /* NC : NC */ - 78 /* NC : NC */ - 84 /* EN : FM_LNA_EN */ - 86 /* I2C : AP_MCU_SDA_1P8 */ - 87 /* I2C : AP_MCU_SCL_1P8 */ - 88 /* I2C : SPK_AMP_SDA_1P8 */ - 89 /* I2C : SPK_AMP_SCL_1P8 */ - 90 /* HW-REVIEW : SPK_AMP_INT */ - 91 /* RST_N : BTP_RST_N */ - 93 /* UNUSED : HALL_INT1 */ - 94 /* EN : SPK_AMP_EN */ - 95 /* HW-REVIEW : FAST_BOOT_SEL0 */ - 98 /* HW-REVIEW : FAST_BOOT_SEL3 */ - 107 /* HW-REVIEW : FAST_BOOT_SEL2 */ - 109 /* LAGOON : CP_WLAN_COEX_RXD */ - 114 /* LAGOON : AP_USB_BOOT_POL_SEL */ - 115 /* I2C : IF_PMIC_SDA_1P8 */ - 116 /* I2C : IF_PMIC_SCL_1P8 */ - 118 /* NC : NC */ - >; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r06.dtsi deleted file mode 100755 index ab40d149315f..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pinctrl-r06.dtsi +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - wakeup-disabled-gpios = < - 0 /* NC : NC */ - 3 /* NC : NC */ - 6 /* I2C : TSP_SDA_1P8 */ - 10 /* LAGOON : DISP_TE */ - 11 /* LCD/HW-REVIEW : EL_ON1_DET */ - 16 /* MCLK : RCAM4_MCLK */ - 21 /* RST_N : FCAM_RST_N */ - 22 /* EN : CAM_FLASH_EN */ - 23 /* MCLK : FCAM_MCLK */ - 24 /* RST_N : RCAM4_RST_N */ - 26 /* I2C : CAM_PMIC_I2C_SCL_1P8 */ - 28 /* I2C : FCAM_RCAM2_RCAM4_SENSOR_I2C_SCL_1P8 */ - 30 /* RST_N : RCAM1_RST_N */ - 32 /* RST_N : MCU_nRST */ - 34 /* I2C : NFC_SDA_1P8 */ - 36 /* LAGOON : NFC_FIRM */ - 37 /* LAGOON : NFC_IRQ */ - 38 /* HW-REVIEW : BT_UART_CTS */ - 39 /* HW-REVIEW : BT_UART_RTS */ - 42 /* RST_N : RCAM2_RST_N */ - 43 /* HW-REVIEW : MCU_BOOT0_SWCLK */ - 45 /* UART : AP_UART_RXD */ - 47 /* I2C : CAM_AF_EEP_I2C_SCL_1P8 */ - 49 /* LAGOON : BT_FM_SB_CLK */ - 52 /* I2C : GRIP_SCL_1P8 */ - 53 /* I2C : CC_SDA_1P8 */ - 55 /* NC : NC */ - 56 /* NC : NC */ - 57 /* EN : MOT_EN */ - 58 /* RST_N : CODEC_RST_N */ - 59 /* SPI : BTP_SPI_MISO */ - 62 /* SPI : BTP_SPI_CS_N */ - 63 /* EN : RCAM1_LDO_EN */ - 64 /* EN : RCAM2_RCAM4_LDO_EN */ - 65 /* EN : RCAM3_LDO_EN */ - 66 /* LAGOON : CAM_SEL */ - 67 /* EN : CAM_TORCH_EN */ - 68 /* EN : NFC_LDO_EN */ - 69 /* LAGOON : T_FLASH_DET */ - 74 /* NC : NC */ - 78 /* NC : NC */ - 84 /* EN : FM_LNA_EN */ - 86 /* I2C : AP_MCU_SDA_1P8 */ - 87 /* I2C : AP_MCU_SCL_1P8 */ - 88 /* I2C : SPK_AMP_SDA_1P8 */ - 89 /* I2C : SPK_AMP_SCL_1P8 */ - 90 /* HW-REVIEW : SPK_AMP_INT */ - 91 /* RST_N : BTP_RST_N */ - 93 /* UNUSED : HALL_INT1 */ - 94 /* EN : SPK_AMP_EN */ - 95 /* HW-REVIEW : FAST_BOOT_SEL0 */ - 98 /* HW-REVIEW : FAST_BOOT_SEL3 */ - 107 /* HW-REVIEW : FAST_BOOT_SEL2 */ - 109 /* LAGOON : CP_WLAN_COEX_RXD */ - 114 /* LAGOON : AP_USB_BOOT_POL_SEL */ - 115 /* I2C : IF_PMIC_SDA_1P8 */ - 116 /* I2C : IF_PMIC_SCL_1P8 */ - 118 /* NC : NC */ - >; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pm-common.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pm-common.dtsi deleted file mode 100755 index 453a98e03226..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-pm-common.dtsi +++ /dev/null @@ -1,169 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-pm-common.dtsi" - -&soc { - /* AP Thermistor table */ - sec_thermistor@0 { - compatible = "samsung,sec-ap-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "ap_therm"; - adc_array = <1700 2190 2576 3046 3583 4240 4993 - 5876 6940 8121 9339 10812 12445 - 14086 15773 17384 19110 20676 22090 23374 24495 25465 26282>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* PA Thermistor table */ - sec_thermistor@1 { - compatible = "samsung,sec-pa-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "pa_therm"; - adc_array = <1800 2239 2631 3097 3640 4290 5056 - 5949 7006 8191 9423 10888 12510 - 14166 15850 17469 19165 20736 22147 23446 24559 25515 26328>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* WiFi Thermistor table */ - sec_thermistor@2 { - compatible = "samsung,sec-wf-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - io-channel-names = "wf_therm"; - adc_array = <1800 2261 2662 3125 3669 4308 5088 - 5990 7041 8225 9459 10915 12532 - 14188 15881 17502 19180 20741 22156 23459 24569 25524 26336>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 25 0 /* sda */ - &tlmm 26 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1000000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1000000>; - regulator-max-microvolt = <1100000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2900000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2900000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -&pm6150_gpios { - interrupts = <0x0 0xc0 0 IRQ_TYPE_NONE>, - <0x0 0xc1 0 IRQ_TYPE_NONE>, - <0x0 0xc2 0 IRQ_TYPE_NONE>, - <0x0 0xc3 0 IRQ_TYPE_NONE>, - <0x0 0xc4 0 IRQ_TYPE_NONE>, - <0x0 0xc6 0 IRQ_TYPE_NONE>, - <0x0 0xc7 0 IRQ_TYPE_NONE>, - <0x0 0xc9 0 IRQ_TYPE_NONE>; - interrupt-names = "pm6150_gpio1", "pm6150_gpio2", - "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio5", - "pm6150_gpio7", "pm6150_gpio8", - "pm6150_gpio10"; - qcom,gpios-disallowed = <6 9>; -}; - -&pm6150_vadc { - ap_therm { - reg = ; - label = "ap_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - }; -}; - -&pm6150l_vadc { - /delete-node/ pa_therm0; - - pa_therm { - reg = ; - label = "pa_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - }; - - wf_therm { - reg = ; - label = "wf_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r00.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r00.dtsi deleted file mode 100755 index c29a857ea3f7..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r00.dtsi +++ /dev/null @@ -1,104 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "drivers/atoll-sec-a52q-audio-common.dtsi" -#include "atoll-sec-a52q-pinctrl-r00.dtsi" -#include "atoll-sec-a52q-pm-common.dtsi" -#include "atoll-sec-a52q-input-common.dtsi" - -#include "drivers/atoll-sec-a52q-display-r00.dtsi" -#include "drivers/atoll-sec-a52q-usb-r00.dtsi" -#include "drivers/atoll-sec-a52q-fingerprint_00.dtsi" -#include "drivers/atoll-sec-a52q-camera-sensor-common.dtsi" -#include -#include "drivers/atoll-sec-a52q-vibrator-r00.dtsi" -#include "drivers/atoll-sec-a52q-nfc_r00.dtsi" -#include "drivers/atoll-sec-a52q-hall-r00.dtsi" -#include "drivers/atoll-sec-a52q-abc-r00.dtsi" - -&soc { - //Sensor Vdd - rpmh-regulator-ldoc8 { - compatible = "qcom,rpmh-vrm-regulator"; - mboxes = <&apps_rsc 0>; - qcom,resource-name = "ldoc8"; - qcom,regulator-type = "pmic5-ldo"; - qcom,supported-modes = - ; - qcom,mode-threshold-currents = <0 1>; - L8C: - pm6150l_l8: regulator-pm6150l-l8 { - regulator-name = "pm6150l_l8"; - qcom,set = ; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - qcom,init-voltage = <1800000>; - regulator-always-on; - qcom,init-mode = - ; - }; - }; - - //Grip Sensor Vdd - rpmh-regulator-ldoa5 { - pm6150_l5: regulator-pm6150-l5 { - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; - regulator-always-on; - }; - }; - - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = <&tlmm 51 0 /* sda */ - &tlmm 52 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_i2c_active>; - - sx9360-i2c@28 { - compatible = "sx9360"; - reg = <0x28>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_int_active>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - sx9360,nirq-gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_LOW>; - sx9360,reggnrlctrl2_reg = <0x32>; /* scanperiod: 102ms */ - sx9360,againfreq_reg = <0x38>; /* freq : 62.5 kHz, again : +/-5.25 pF */ - sx9360,refagainfreq_reg = <0x36>; /* reference phase again : 5.25 pF, sampling freq : 83.33 khz */ - sx9360,gainrawfilt_reg = <0x1A>; /* gain: x4, rawfilt : 1-1/4 */ - sx9360,refgainrawfilt_reg = <0x22>; /* reference phase gain: x8, rawfilt : 1-1/4 */ - sx9360,proxthresh_reg = <0x22>; /* threshold: 614 */ - sx9360,hyst_reg = <0x15>; /* hysteresis: small, closedeb: 2 samples, fardeb: 2 samples */ - sx9360,regproxctrl3_reg = <0x0C>; /* AVGPOSFILT: 1/256, AVGNEGFILT: 1/2 */ - sx9360,resolution_reg = <0x0F>; /* resolution: 1204 */ - sx9360,refresolution_reg = <0x0F>; /* reference phase resolution: 1204 */ - sx9360,hallic_cert_detect = <1>; - }; - }; -}; - -&tsp_zt { - status = "okay"; - zinitix,bringup = <1>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r01.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r01.dtsi deleted file mode 100755 index a303f9d882f2..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r01.dtsi +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-a52q-r00.dtsi" -#include "atoll-sec-a52q-pinctrl-r01.dtsi" - -&soc { - -}; - -&tsp_zt { - status = "okay"; - zinitix,bringup = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r02.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r02.dtsi deleted file mode 100755 index 0dd972f667d6..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r02.dtsi +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-a52q-r01.dtsi" -#include "atoll-sec-a52q-pinctrl-r02.dtsi" -#include "drivers/atoll-sec-a52q-camera-sensor-r02.dtsi" - -&vibrator { - samsung,vib_en = <&tlmm 57 0>; -}; - -&tsp_zt { - status = "okay"; - zinitix,bringup = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r04.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r04.dtsi deleted file mode 100755 index 772a4b0d000e..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r04.dtsi +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-a52q-r02.dtsi" -#include "atoll-sec-a52q-pinctrl-r04.dtsi" - -&vibrator { - /delete-property/ samsung,vib_en; -}; - -&tsp_zt { - status = "disabled"; -}; - -&tsp_stm { - status = "okay"; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r05.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r05.dtsi deleted file mode 100755 index ab16fced1b64..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r05.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-a52q-r04.dtsi" -#include "atoll-sec-a52q-pinctrl-r05.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r06.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r06.dtsi deleted file mode 100755 index b82dd65b64a6..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a52q-r06.dtsi +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-a52q-r05.dtsi" -#include "atoll-sec-a52q-pinctrl-r06.dtsi" - -/delete-node/ &vibrator; - -&soc { - msm_vibrator { - compatible = "vibrator"; - motor-vdd_type = <0>; /* 0: gpio, 1: pmic */ - motor-en = <&tlmm 57 0x0>; - samsung,vib_type = "COINDC"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-common.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-common.dtsi deleted file mode 100755 index 240fb1e4e284..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-common.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&reserved_memory { - camera_mem: camera_mem_region { - reg = <0x1 0x20000000 0x0 0x25800000>; - ion,recyclable; - }; -}; - -&soc { - qcom,ion { - qcom,ion-heap@30 { /* CAMERA HEAP */ - reg = <30>; - memory-region = <&camera_mem>; - qcom,ion-heap-type = "RBIN"; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r00.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r00.dts old mode 100755 new mode 100644 index 149d047f1323..0860a5370116 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r00.dts +++ b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r00.dts @@ -1,25 +1,7031 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - /dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a72q-r00.dtsi" -#include "drivers/atoll-sec-a72q-battery-common.dtsi" / { model = "Samsung A72Q PROJECT (board-id,00)"; compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 0>; - dtbo-version = <0>; + qcom,board-id = <0x22 0x0>; + dtbo-version = <0x0>; + + fragment@0 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ video mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x37 0x30>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x38ae2bc0 0x37bc55b0 0x37f8cb38 0x383540b8 0x3871b640>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x3>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@1 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ cmd mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x3da58d80 0x3c9e86e0 0x3ce04888 0x3d220a30 0x3d63cbd8>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x4>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@2 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,mdss-dsi-panel-name = "Simulator video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-mode-switch; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x0 0x0 0x0 0x1 0x0>; + qcom,panel-ack-disabled; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x5>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-video-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,cmd-to-video-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,cmd-to-video-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1 0x2 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-cmd-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,video-to-cmd-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,video-to-cmd-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@3 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-t-clk-post = <0xc>; + qcom,mdss-dsi-t-clk-pre = <0x29>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-ack-disabled; + qcom,ulps-enabled; + phandle = <0x6>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x64>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x64>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x2d0 0x28 0x2d0 0x28 0x2d0 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x1cc>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x2e4>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x21c 0x28 0x21c 0x28 0x21c 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@2 { + qcom,mdss-dsi-panel-width = <0x2d0>; + qcom,mdss-dsi-panel-height = <0x500>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x348>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x564>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x168>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x168 0x28 0x168 0x28 0x168 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + }; + }; + }; + }; + + fragment@4 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_dsc_375_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode DSC 3.75:1 dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,panel-ack-disabled; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,ulps-enabled; + phandle = <0x7>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-pulse-width = <0x10>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x8>; + qcom,mdss-dsi-v-front-porch = <0xa>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-on-command = <0x15010000 0x2ff 0x20150100 0x2 0xfb011501 0x0 0x2000115 0x1000000 0x20155 0x15010000 0x202 0x45150100 0x2 0x5401501 0x0 0x2061915 0x1000000 0x2071e 0x15010000 0x20b 0x73150100 0x2 0xc731501 0x0 0x20eb015 0x1000000 0x20fae 0x15010000 0x211 0xb8150100 0x2 0x13001501 0x0 0x2588015 0x1000000 0x25901 0x15010000 0x25a 0x150100 0x2 0x5b011501 0x0 0x25c8015 0x1000000 0x25d81 0x15010000 0x25e 0x150100 0x2 0x5f011501 0x0 0x2723115 0x1000000 0x26803 0x15010000 0x2ff 0x24150100 0x2 0xfb011501 0x0 0x2001c15 0x1000000 0x2010b 0x15010000 0x202 0xc150100 0x2 0x3011501 0x0 0x2040f15 0x1000000 0x20510 0x15010000 0x206 0x10150100 0x2 0x7101501 0x0 0x2088915 0x1000000 0x2098a 0x15010000 0x20a 0x13150100 0x2 0xb131501 0x0 0x20c1515 0x1000000 0x20d15 0x15010000 0x20e 0x17150100 0x2 0xf171501 0x0 0x2101c15 0x1000000 0x2110b 0x15010000 0x212 0xc150100 0x2 0x13011501 0x0 0x2140f15 0x1000000 0x21510 0x15010000 0x216 0x10150100 0x2 0x17101501 0x0 0x2188915 0x1000000 0x2198a 0x15010000 0x21a 0x13150100 0x2 0x1b131501 0x0 0x21c1515 0x1000000 0x21d15 0x15010000 0x21e 0x17150100 0x2 0x1f171501 0x0 0x2204015 0x1000000 0x22101 0x15010000 0x222 0x150100 0x2 0x23401501 0x0 0x2244015 0x1000000 0x2256d 0x15010000 0x226 0x40150100 0x2 0x27401501 0x0 0x2e00015 0x1000000 0x2dc21 0x15010000 0x2dd 0x22150100 0x2 0xde071501 0x0 0x2df0715 0x1000000 0x2e36d 0x15010000 0x2e1 0x7150100 0x2 0xe2071501 0x0 0x229d815 0x1000000 0x22a2a 0x15010000 0x24b 0x3150100 0x2 0x4c111501 0x0 0x24d1015 0x1000000 0x24e01 0x15010000 0x24f 0x1150100 0x2 0x50101501 0x0 0x2510015 0x1000000 0x25280 0x15010000 0x253 0x150100 0x2 0x56001501 0x0 0x2540715 0x1000000 0x25807 0x15010000 0x255 0x25150100 0x2 0x5b431501 0x0 0x25c0015 0x1000000 0x25f73 0x15010000 0x260 0x73150100 0x2 0x63221501 0x0 0x2640015 0x1000000 0x26708 0x15010000 0x268 0x4150100 0x2 0x72021501 0x0 0x27a8015 0x1000000 0x27b91 0x15010000 0x27c 0xd8150100 0x2 0x7d601501 0x0 0x27f1515 0x1000000 0x27515 0x15010000 0x2b3 0xc0150100 0x2 0xb4001501 0x0 0x2b50015 0x1000000 0x27800 0x15010000 0x279 0x150100 0x2 0x80001501 0x0 0x2830015 0x1000000 0x2930a 0x15010000 0x294 0xa150100 0x2 0x8a001501 0x0 0x29bff15 0x1000000 0x29db0 0x15010000 0x29f 0x63150100 0x2 0x98101501 0x0 0x2ec0015 0x1000000 0x2ff10 0x39010000 0x11c1 0x9200010 0x2000268 0x1bb000a 0x66704c5 0x39010000 0x3c2 0x10f01501 0x0 0x2c00315 0x1000000 0x43b03 0xa0a1501 0x0 0x2350015 0x1000000 0x2e501 0x15010000 0x2bb 0x10150100 0x2 0xfb010501 0x7800 0x2110005 0x1000078 0x22900>; + qcom,mdss-dsi-off-command = [05 01 00 00 78 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x0>; + qcom,mdss-dsi-h-back-porch = <0x0>; + qcom,mdss-dsi-h-pulse-width = <0x0>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x0>; + qcom,mdss-dsi-v-front-porch = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x0>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = <0x15010000 0x2bb 0x10150100 0x2 0xb0030501 0x7800 0x1111501 0x0 0x251ff15 0x1000000 0x25324 0x15010000 0x2ff 0x23150100 0x2 0x8051501 0x0 0x2469015 0x1000000 0x2ff10 0x15010000 0x2ff 0xf0150100 0x2 0x92011501 0x0 0x2ff1015 0x1000000 0x23500 0x5010000 0x28000129>; + qcom,mdss-dsi-off-command = <0x5010000 0x10000128 0x5010000 0x40000110>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x150505 0x201f0505 0x3020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1 0x2 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@5 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,mdss-dsi-panel-name = "nt36672c fhd plus video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x14 0x0 0x14 0x1 0x14>; + qcom,mdss-pan-physical-width-dimension = <0x4a>; + qcom,mdss-pan-physical-height-dimension = <0x83>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-cphy-mode; + qcom,mdss-dsi-t-clk-post = <0x0>; + qcom,mdss-dsi-t-clk-pre = <0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x5a 0x32>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-skip-timing-update; + qcom,dsi-dyn-clk-list = <0x3eb54a94 0x3e726713 0x3e2f838b 0x3deca00a 0x3da9bc89>; + qcom,dsi-dyn-clk-type = "constant-fps-adjust-hfp"; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,platform-bklight-en-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-en-gpio = <0xffffffff 0x4 0x0>; + phandle = <0x8>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-front-porch = <0xca>; + qcom,mdss-dsi-h-back-porch = <0x38>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0xa>; + qcom,mdss-dsi-v-front-porch = <0x50b>; + qcom,mdss-dsi-v-pulse-width = <0xa>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 b0 00 29 01 00 00 00 00 02 c0 00 29 01 00 00 00 00 03 c2 1b a0 29 01 00 00 00 00 02 ff 25 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 18 20 15 01 00 00 00 00 02 ff 2a 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 27 80 15 01 00 00 00 00 02 28 fd 29 01 00 00 00 00 02 ff f0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 5a 00 29 01 00 00 00 00 02 a0 08 29 01 00 00 00 00 02 ff d0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 09 ad 15 01 00 00 00 00 02 ff 10 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 51 ff 15 01 00 00 00 00 02 53 2c 15 01 00 00 00 00 02 ff 23 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 0a 00 15 01 00 00 00 00 02 0b 00 15 01 00 00 00 00 02 0c 00 15 01 00 00 00 00 02 0d 00 15 01 00 00 00 00 02 11 01 15 01 00 00 00 00 02 12 95 15 01 00 00 00 00 02 15 68 15 01 00 00 00 00 02 16 0b 15 01 00 00 00 00 02 6f 00 15 01 00 00 00 00 02 70 00 15 01 00 00 00 00 02 71 00 15 01 00 00 00 00 02 a0 11 15 01 00 00 00 00 02 ff f0 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 d2 52 29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 35 00 05 01 00 00 78 00 02 11 00 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x230909 0x26240909 0x9060204>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@6 { + target = <0xffffffff>; + + __overlay__ { + + dsi_panel_pwr_supply { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xaa>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + }; + + qcom,panel-supply-entry@2 { + reg = <0x2>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-post-on-sleep = <0x14>; + }; + }; + + dsi_panel_pwr_supply_no_labibb { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x2>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + }; + + dsi_panel_pwr_supply_labibb_amoled { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x1>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vdda-3p3"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x3390>; + qcom,supply-disable-load = <0x50>; + }; + }; + + qcom,dsi-display@0 { + label = "dsi_rm69299_visionox_amoled_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0"; + qcom,dsi-panel = <0x3>; + qcom,dsi-display-active; + phandle = <0xab>; + }; + + qcom,dsi-display@1 { + label = "dsi_rm69299_visionox_amoled_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x4>; + phandle = <0xac>; + }; + + qcom,dsi-display@2 { + label = "dsi_sim_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x5>; + phandle = <0xad>; + }; + + qcom,dsi-display@3 { + label = "dsi_sim_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x6>; + phandle = <0xae>; + }; + + qcom,dsi-display@4 { + label = "dsi_sim_dsc_375_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x7>; + phandle = <0xaf>; + }; + + qcom,dsi-display@5 { + label = "dsi_nt36672c_video_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + qcom,dsi-panel = <0x8>; + phandle = <0xb0>; + }; + + qcom,dsi-display { + compatible = "qcom,dsi-display"; + qcom,dsi-ctrl = <0xffffffff>; + qcom,dsi-phy = <0xffffffff>; + clocks = <0xffffffff 0x6 0xffffffff 0x9 0xffffffff 0x3 0xffffffff 0x8 0xffffffff 0xa 0xffffffff 0xd 0xffffffff 0x11 0xffffffff 0x15 0xffffffff 0x16 0xffffffff 0x19>; + clock-names = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + pinctrl-names = "panel_active", "panel_suspend"; + pinctrl-0 = <0x9 0xa 0xb>; + pinctrl-1 = <0xc 0xd 0xb>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,panel-te-source = <0x0>; + vddio-supply = <0xffffffff>; + vdda-3p3-supply = <0xffffffff>; + lab-supply = <0xffffffff>; + ibb-supply = <0xffffffff>; + qcom,dsi-display-list = <0xe 0xf>; + vci-supply = <0xffffffff>; + vddi-supply = <0xffffffff>; + phandle = <0x12>; + }; + + qcom,wb-display@0 { + compatible = "qcom,wb-display"; + cell-index = <0x0>; + label = "wb_display"; + phandle = <0x11>; + }; + + qcom,msm-ext-disp { + compatible = "qcom,msm-ext-disp"; + phandle = <0x10>; + + qcom,msm-ext-disp-audio-codec-rx { + compatible = "qcom,msm-ext-disp-audio-codec-rx"; + phandle = <0x2b>; + }; + }; + }; + }; + + fragment@7 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-usbpd-detection = <0xffffffff>; + qcom,ext-disp = <0x10>; + qcom,usbplug-cc-gpio = <0xffffffff 0x68 0x0>; + pinctrl-name = "mdss_dp_active", "mdss_dp_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + }; + }; + + fragment@8 { + target = <0xffffffff>; + + __overlay__ { + connectors = <0x11 0x12 0xffffffff 0xffffffff>; + }; + }; + + fragment@9 { + target = <0xffffffff>; + + __overlay__ { + + pm6150-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150l-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_cpu0 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl0 { + disable-thermal-zone; + + cooling-maps { + + vbat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + vbat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl1 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl2 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + soc { + disable-thermal-zone; + + cooling-maps { + + soc_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + soc_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + }; + }; + + fragment@10 { + target = <0xffffffff>; + + __overlay__ { + #cooling-cells = <0x2>; + }; + }; + + fragment@11 { + target = <0xffffffff>; + + __overlay__ { + + qcom,battery-data { + qcom,batt-id-range-pct = <0xf>; + phandle = <0x13>; + + qcom,alium_860_89032_0000_3600mAh { + qcom,max-voltage-uv = <0x426030>; + qcom,fg-cc-cv-threshold-uv = <0x423920>; + qcom,fastchg-current-ma = <0x1518>; + qcom,batt-id-kohm = <0x6b>; + qcom,battery-beta = <0x109a>; + qcom,battery-therm-kohm = <0x64>; + qcom,battery-type = "Alium_860_89032_0000_3600mAh_Jun15th2018"; + qcom,qg-batt-profile-ver = <0x64>; + qcom,jeita-fcc-ranges = <0x0 0x32 0x2625a0 0x33 0x190 0x5265c0 0x191 0x1c2 0x2625a0>; + qcom,jeita-fv-ranges = <0x0 0x32 0x40d990 0x33 0x190 0x426030 0x191 0x1c2 0x40d990>; + qcom,step-chg-ranges = <0x36ee80 0x39fbc0 0x5265c0 0x39fbc1 0x419ce0 0x36ee80 0x419ce1 0x426030 0x2625a0>; + qcom,ocv-based-step-chg; + qcom,jeita-soft-thresholds = <0x5314 0x25e3>; + qcom,jeita-hard-thresholds = <0x58cd 0x20b8>; + qcom,jeita-soft-hys-thresholds = <0x4f5e 0x2943>; + qcom,jeita-soft-fcc-ua = <0x2625a0 0x2625a0>; + qcom,jeita-soft-fv-uv = <0x40d990 0x40d990>; + + qcom,fcc1-temp-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xd62 0xdbf 0xdfd 0xe1d 0xe2e>; + }; + + qcom,fcc2-temp-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xdda 0xdf8 0xe02 0xe04 0xdff 0xdff>; + }; + + qcom,pc-temp-v1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa846 0xa903 0xa965 0xa982 0xa987 0xa757 0xa82c 0xa88b 0xa8b2 0xa8bc 0xa671 0xa747 0xa7a8 0xa7d4 0xa7e5 0xa598 0xa65f 0xa6c5 0xa6f2 0xa707 0xa4ca 0xa582 0xa5e5 0xa611 0xa627 0xa3ff 0xa4af 0xa508 0xa531 0xa546 0xa330 0xa3e1 0xa430 0xa452 0xa465 0xa25d 0xa311 0xa35c 0xa377 0xa387 0xa1a0 0xa23e 0xa287 0xa29e 0xa2ad 0xa10a 0xa17a 0xa1b1 0xa1c4 0xa1d2 0xa07e 0xa0e5 0xa0f6 0xa0f5 0xa0fc 0x9fa9 0xa061 0xa067 0xa048 0xa036 0x9e4b 0x9f9a 0x9fd6 0x9fae 0x9f81 0x9cdb 0x9e3d 0x9ee8 0x9ee6 0x9ebf 0x9bed 0x9cd1 0x9d85 0x9dc6 0x9dd7 0x9b4d 0x9bf5 0x9c67 0x9cb4 0x9cf4 0x9ad6 0x9b65 0x9bd6 0x9c18 0x9c4a 0x9a75 0x9af5 0x9b63 0x9baa 0x9bc5 0x9a1f 0x9a9b 0x9ade 0x9b13 0x9b23 0x99c4 0x9a41 0x9a3f 0x9a2d 0x9a41 0x9962 0x99c6 0x998a 0x9943 0x9959 0x98fd 0x992a 0x98b8 0x9892 0x98a0 0x9894 0x9882 0x97f4 0x9800 0x9807 0x982b 0x97c6 0x976f 0x9780 0x9781 0x97cb 0x9713 0x970f 0x970c 0x970c 0x9775 0x9697 0x96b5 0x96a2 0x96a2 0x9724 0x963e 0x965a 0x9642 0x963e 0x96db 0x95fa 0x9603 0x95e9 0x95e1 0x9698 0x95c7 0x95b7 0x9598 0x958b 0x965b 0x959d 0x9571 0x954e 0x953b 0x9627 0x9575 0x9533 0x950c 0x94f4 0x95f8 0x9550 0x94fe 0x94d1 0x94b3 0x95cc 0x952e 0x94cf 0x949b 0x947a 0x95a2 0x9511 0x94a4 0x9465 0x9440 0x9579 0x94f7 0x947f 0x9432 0x9407 0x954f 0x94d6 0x9458 0x93fe 0x93cc 0x9525 0x94b2 0x942f 0x93c6 0x938b 0x94f0 0x9484 0x9402 0x938b 0x9345 0x94a6 0x943e 0x93bf 0x9343 0x92f7 0x944c 0x93da 0x935f 0x92ed 0x92a2 0x93e6 0x936c 0x92f1 0x9288 0x923f 0x936b 0x92f1 0x9276 0x920e 0x91c6 0x92e1 0x926f 0x91f1 0x9188 0x9141 0x9248 0x91ea 0x9165 0x90ff 0x90bc 0x91cf 0x9176 0x9100 0x909b 0x905b 0x9179 0x9129 0x90c1 0x9060 0x9022 0x9159 0x910e 0x90ab 0x904f 0x9011 0x913e 0x90f9 0x909a 0x903f 0x9001 0x911a 0x90de 0x907f 0x9020 0x8fdd 0x90ac 0x9070 0x8ff7 0x8f74 0x8f1a 0x8f68 0x8f1c 0x8e9e 0x8e14 0x8db6 0x8d9d 0x8d55 0x8cd8 0x8c4c 0x8beb 0x8b59 0x8b10 0x8a94 0x8a02 0x899f 0x8849 0x87fb 0x877d 0x86e5 0x867d 0x836c 0x8325 0x82aa 0x8209 0x8197 0x7530 0x7530 0x7530 0x7530 0x7530>; + }; + + qcom,pc-temp-v2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa98d 0xa97e 0xa974 0xa960 0xa92e 0xa910 0xa7fb 0xa83a 0xa854 0xa856 0xa82f 0xa819 0xa6a3 0xa712 0xa747 0xa757 0xa738 0xa728 0xa594 0xa609 0xa64d 0xa665 0xa64a 0xa63c 0xa4c7 0xa51d 0xa566 0xa581 0xa565 0xa558 0xa3f4 0xa43e 0xa489 0xa4a2 0xa484 0xa478 0xa2af 0xa364 0xa3b3 0xa3c8 0xa3a5 0xa397 0xa162 0xa292 0xa2e4 0xa2f3 0xa2ca 0xa2b9 0xa11a 0xa1c1 0xa210 0xa21b 0xa1ef 0xa1de 0xa14f 0xa0ea 0xa131 0xa139 0xa110 0xa103 0xa17a 0xa03c 0xa071 0xa077 0xa047 0xa035 0xa046 0x9fd6 0x9ff5 0x9ff5 0x9fb3 0x9f87 0x9d6d 0x9f7f 0x9f85 0x9f81 0x9f2b 0x9ee2 0x9b88 0x9eab 0x9ea9 0x9ead 0x9e5e 0x9e1a 0x9a81 0x9c78 0x9cde 0x9d1e 0x9d16 0x9d22 0x99b8 0x9a96 0x9b46 0x9bd5 0x9bfe 0x9c3f 0x9913 0x99e8 0x9a78 0x9b4d 0x9b70 0x9b9c 0x9887 0x9977 0x99df 0x9aeb 0x9b04 0x9b0e 0x97f7 0x98f2 0x9948 0x9a53 0x9a64 0x9a58 0x975c 0x9856 0x98b5 0x9965 0x9971 0x9967 0x96c8 0x97b8 0x9827 0x987f 0x9885 0x9883 0x9649 0x9720 0x9799 0x97d3 0x97d8 0x97d6 0x95d8 0x968d 0x9711 0x9743 0x9748 0x9745 0x957d 0x9608 0x9697 0x96c6 0x96cb 0x96c8 0x9533 0x9591 0x9629 0x9658 0x965c 0x9658 0x94f4 0x952a 0x95c3 0x95f3 0x95f6 0x95f1 0x94bc 0x94d6 0x9565 0x9595 0x9598 0x9592 0x948a 0x9491 0x950e 0x953e 0x9540 0x9538 0x9458 0x9459 0x94bd 0x94f0 0x94ef 0x94e6 0x9429 0x942b 0x9471 0x94aa 0x94a5 0x949b 0x93fa 0x9403 0x942c 0x9467 0x9461 0x9456 0x93cb 0x93dc 0x93ed 0x9426 0x9422 0x9418 0x939a 0x93b7 0x93b6 0x93e7 0x93e7 0x93dd 0x9366 0x9390 0x9384 0x93a6 0x93a1 0x9392 0x9330 0x9367 0x935a 0x9364 0x9348 0x932b 0x92f5 0x933c 0x9330 0x9322 0x92ea 0x92bd 0x92b6 0x9309 0x9301 0x92e2 0x9296 0x925d 0x9274 0x92ce 0x92cf 0x92a2 0x9248 0x9208 0x922d 0x9289 0x9294 0x925e 0x91fe 0x91bc 0x91e4 0x9235 0x924a 0x9214 0x91b6 0x9173 0x919a 0x91d4 0x91f2 0x91c0 0x9166 0x9124 0x9151 0x916d 0x918d 0x9158 0x9101 0x90c0 0x910a 0x9104 0x9119 0x90da 0x9085 0x9045 0x90be 0x90a5 0x90a4 0x9064 0x9011 0x8fd4 0x9066 0x9055 0x9058 0x9026 0x8fde 0x8fa3 0x8ff1 0x9009 0x9027 0x900b 0x8fc1 0x8f87 0x8fa0 0x8fd7 0x9010 0x8ff6 0x8fb0 0x8f76 0x8f3a 0x8f9b 0x8ff2 0x8fd7 0x8f94 0x8f5b 0x8e9d 0x8f3c 0x8fa7 0x8f84 0x8f3f 0x8efc 0x8dbc 0x8e73 0x8ecd 0x8e86 0x8e46 0x8df2 0x8c72 0x8d0b 0x8d41 0x8ce7 0x8ca5 0x8c4f 0x8a95 0x8b0d 0x8b2a 0x8ad3 0x8a9a 0x8a45 0x87f8 0x8865 0x887d 0x881c 0x87ec 0x879d 0x841a 0x8496 0x84d3 0x8488 0x847e 0x8426 0x7eca 0x7f24 0x801b 0x8028 0x7f97 0x7ef0 0x6fcb 0x6e6e 0x6d71 0x6d74 0x6d50 0x6d1a>; + }; + + qcom,pc-temp-z1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x38d1 0x33b6 0x2f09 0x2da0 0x2d49 0x38bb 0x337f 0x2f0d 0x2d9e 0x2d52 0x38c3 0x3376 0x2f0b 0x2da5 0x2d5c 0x38c7 0x337e 0x2f07 0x2da7 0x2d60 0x38d3 0x3382 0x2f03 0x2da8 0x2d62 0x38eb 0x337d 0x2f01 0x2da8 0x2d64 0x38ff 0x336c 0x2f02 0x2da9 0x2d67 0x38f6 0x335e 0x2f03 0x2dac 0x2d6a 0x38d7 0x335d 0x2f05 0x2dae 0x2d6d 0x38b6 0x3362 0x2f09 0x2db1 0x2d6f 0x3896 0x3360 0x2f0d 0x2db5 0x2d72 0x3874 0x334e 0x2f0f 0x2db8 0x2d77 0x3843 0x333c 0x2f0f 0x2dbb 0x2d7b 0x3810 0x332e 0x2f0b 0x2dbb 0x2d7c 0x37ee 0x3328 0x2f04 0x2db9 0x2d7c 0x37d3 0x3329 0x2f01 0x2db7 0x2d7c 0x37b6 0x3329 0x2f04 0x2dbb 0x2d7f 0x3792 0x332c 0x2f0a 0x2dc2 0x2d85 0x3772 0x3337 0x2f14 0x2dc9 0x2d8b 0x3765 0x3349 0x2f21 0x2dce 0x2d8f 0x3763 0x335e 0x2f2c 0x2dd3 0x2d93 0x376a 0x3374 0x2f35 0x2dd8 0x2d98 0x3773 0x3384 0x2f3d 0x2ddd 0x2d9c 0x377f 0x338b 0x2f45 0x2de1 0x2da1 0x3787 0x3391 0x2f4d 0x2de7 0x2da6 0x378c 0x339a 0x2f54 0x2dec 0x2daa 0x378f 0x33a6 0x2f5b 0x2df0 0x2daf 0x3794 0x33ad 0x2f62 0x2df4 0x2db3 0x379f 0x33b2 0x2f69 0x2df8 0x2db7 0x37af 0x33ba 0x2f6f 0x2dfc 0x2dbb 0x37c7 0x33c2 0x2f75 0x2e00 0x2dbf 0x37de 0x33c9 0x2f7a 0x2e04 0x2dc4 0x37e6 0x33d1 0x2f80 0x2e08 0x2dc8 0x37ea 0x33de 0x2f86 0x2e0d 0x2dcd 0x37f0 0x33f1 0x2f8e 0x2e12 0x2dd1 0x3807 0x3403 0x2f95 0x2e17 0x2dd5 0x383b 0x3415 0x2f9d 0x2e1a 0x2dd8 0x386b 0x3422 0x2fa5 0x2e1c 0x2dda 0x3891 0x3427 0x2faa 0x2e1f 0x2ddc 0x38b0 0x3429 0x2fad 0x2e21 0x2ddd 0x38b2 0x342d 0x2fb1 0x2e23 0x2dde 0x3888 0x3439 0x2fb9 0x2e25 0x2de0 0x3873 0x3448 0x2fbf 0x2e27 0x2de1 0x386e 0x3457 0x2fc0 0x2e28 0x2de2 0x3861 0x3449 0x2fc4 0x2e29 0x2de2 0x386f 0x3454 0x2fc7 0x2e2b 0x2de2 0x3869 0x3454 0x2fc8 0x2e2b 0x2de1 0x3868 0x345b 0x2fc9 0x2e2b 0x2de2 0x385f 0x3457 0x2fcf 0x2e2c 0x2de3 0x387c 0x3452 0x2fd1 0x2e30 0x2de6 0x3886 0x346f 0x2fdb 0x2e36 0x2deb 0x38aa 0x3476 0x2ff3 0x2e3f 0x2df0 0x3895 0x349e 0x3007 0x2e4a 0x2dfa 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06>; + }; + + qcom,pc-temp-z2-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2bb8 0x2632 0x2811 0x296b 0x2a9e 0x280d 0x2a3d 0x2824 0x28fa 0x293e 0x25fe 0x2926 0x282f 0x28bc 0x28c4 0x2606 0x274d 0x282a 0x28ad 0x28ac 0x2620 0x26d2 0x281d 0x2898 0x28a6 0x262f 0x26c3 0x2815 0x288c 0x28a4 0x2631 0x26b5 0x2811 0x2887 0x28a8 0x262c 0x26aa 0x2812 0x2882 0x28ac 0x2625 0x26a2 0x2816 0x2880 0x28ac 0x261b 0x269c 0x2819 0x2884 0x28b5 0x2612 0x2698 0x2813 0x2887 0x28cc 0x2616 0x2696 0x27f3 0x288e 0x28d4 0x2626 0x2699 0x27d7 0x28ae 0x28d3 0x262c 0x26a7 0x27e8 0x28bd 0x28d4 0x2618 0x26b3 0x2814 0x289f 0x28d2 0x25f5 0x26b6 0x282a 0x2883 0x28c7 0x25e5 0x26ba 0x2827 0x288f 0x28d1 0x25e1 0x26c3 0x281d 0x28b2 0x290a 0x25dd 0x26dd 0x2837 0x28e1 0x2937 0x25d6 0x26fd 0x2894 0x2931 0x293f 0x25c9 0x271e 0x28ce 0x296a 0x293f 0x25be 0x2742 0x28b3 0x2939 0x2923 0x25b7 0x2760 0x2883 0x28bd 0x28ee 0x25b1 0x2775 0x2863 0x288b 0x28cc 0x259f 0x2784 0x284c 0x289e 0x28b4 0x2574 0x278c 0x283f 0x28b6 0x28a5 0x2552 0x2793 0x283c 0x28a9 0x28a6 0x2544 0x2797 0x283d 0x2890 0x28af 0x250b 0x2796 0x2845 0x2888 0x28ba 0x24d2 0x2793 0x2859 0x2888 0x28cd 0x24c0 0x2792 0x286f 0x288c 0x28e8 0x24b3 0x2793 0x2885 0x289f 0x290a 0x24aa 0x2795 0x289c 0x28c5 0x2934 0x24a2 0x2799 0x28b4 0x28ea 0x2962 0x249c 0x27a2 0x28ce 0x290a 0x299b 0x2498 0x27aa 0x28df 0x2925 0x29c7 0x249e 0x27b2 0x28e4 0x293c 0x29d8 0x24a4 0x27b7 0x28e7 0x2954 0x29e2 0x24ad 0x27bb 0x28ef 0x2961 0x29ed 0x24b6 0x27c0 0x28fb 0x2964 0x29f9 0x24b5 0x27c2 0x2901 0x2965 0x2a01 0x24a8 0x27b9 0x28fa 0x2971 0x2a03 0x24a4 0x279c 0x28f3 0x2981 0x2a07 0x24aa 0x26ec 0x28f1 0x2987 0x2a1d 0x246c 0x26c6 0x28d6 0x2992 0x2a3b 0x2459 0x26cc 0x28c6 0x29ad 0x2a38 0x2447 0x26dc 0x28df 0x29c9 0x2a6a 0x2449 0x26cd 0x293d 0x29ca 0x2a89 0x243a 0x26ed 0x297e 0x2a06 0x2aa5 0x243e 0x26c3 0x2925 0x29d7 0x2a55 0x2464 0x269c 0x28de 0x298a 0x29c5 0x246e 0x264f 0x28b9 0x2971 0x29af 0x2445 0x25fc 0x289b 0x2927 0x295f 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904>; + }; + + qcom,pc-temp-z3-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4c45 0x4be7 0x4bad 0x4bb7 0x4b9b 0x4d48 0x4c26 0x4bd0 0x4baa 0x4b96 0x4dd0 0x4c76 0x4bee 0x4bac 0x4b97 0x4de1 0x4cc3 0x4bfa 0x4bb4 0x4b9c 0x4dce 0x4cd9 0x4bff 0x4bb6 0x4b9f 0x4db7 0x4cdc 0x4c00 0x4bb7 0x4ba2 0x4dac 0x4cdd 0x4bfe 0x4bb5 0x4ba2 0x4da7 0x4cdd 0x4bfb 0x4bb0 0x4b9f 0x4da5 0x4ce0 0x4bf8 0x4bac 0x4b9b 0x4da2 0x4ce2 0x4bf6 0x4bac 0x4b99 0x4da0 0x4cd4 0x4bf0 0x4bac 0x4b98 0x4da5 0x4cac 0x4bdf 0x4ba7 0x4b98 0x4db6 0x4c9a 0x4bc8 0x4b9b 0x4b95 0x4dc5 0x4cb6 0x4bce 0x4b96 0x4b91 0x4db4 0x4cd7 0x4bef 0x4ba3 0x4b93 0x4d83 0x4cd1 0x4c01 0x4bb3 0x4b97 0x4d54 0x4cac 0x4bec 0x4bad 0x4b94 0x4d30 0x4c8a 0x4bd0 0x4b9c 0x4b8a 0x4d0e 0x4c6f 0x4bcf 0x4b98 0x4b87 0x4cf1 0x4c5e 0x4be1 0x4ba6 0x4b8e 0x4cd8 0x4c62 0x4bee 0x4bb3 0x4b97 0x4cc6 0x4c75 0x4bef 0x4bb3 0x4b9d 0x4cbc 0x4c87 0x4bef 0x4bae 0x4ba1 0x4cb4 0x4c93 0x4bed 0x4bad 0x4ba2 0x4cac 0x4c9c 0x4bea 0x4bb4 0x4ba0 0x4ca3 0x4c9d 0x4be9 0x4bba 0x4b9e 0x4c97 0x4c9b 0x4bef 0x4bb7 0x4b9c 0x4c8c 0x4c97 0x4bf5 0x4bb2 0x4b9a 0x4c7f 0x4c91 0x4bf6 0x4bae 0x4b98 0x4c6f 0x4c8a 0x4bf4 0x4ba9 0x4b96 0x4c5d 0x4c84 0x4bf2 0x4ba5 0x4b94 0x4c4a 0x4c7f 0x4bef 0x4ba2 0x4b91 0x4c3a 0x4c7a 0x4bea 0x4ba0 0x4b8e 0x4c2b 0x4c73 0x4be7 0x4b9f 0x4b8a 0x4c1e 0x4c6b 0x4be5 0x4b9e 0x4b86 0x4c17 0x4c65 0x4be2 0x4b9e 0x4b84 0x4c1b 0x4c5f 0x4bde 0x4b9e 0x4b84 0x4c23 0x4c5a 0x4bda 0x4b9d 0x4b86 0x4c39 0x4c56 0x4bd7 0x4b9c 0x4b86 0x4c4f 0x4c53 0x4bd6 0x4b97 0x4b83 0x4c46 0x4c4f 0x4bd4 0x4b93 0x4b81 0x4c28 0x4c4a 0x4bd2 0x4b93 0x4b82 0x4c1b 0x4c3f 0x4bd0 0x4b93 0x4b82 0x4c19 0x4bfb 0x4bcc 0x4b93 0x4b83 0x4bac 0x4bb3 0x4bb6 0x4b90 0x4b7f 0x4b91 0x4b94 0x4ba0 0x4b89 0x4b78 0x4b89 0x4b8c 0x4b9e 0x4b80 0x4b70 0x4b8b 0x4b87 0x4b8e 0x4b7e 0x4b70 0x4b74 0x4b76 0x4b83 0x4b7c 0x4b6d 0x4b78 0x4b75 0x4b98 0x4b87 0x4b7c 0x4bab 0x4b91 0x4b9b 0x4b8b 0x4b83 0x4bda 0x4b96 0x4b9d 0x4b8e 0x4b84 0x4bf2 0x4b94 0x4b99 0x4b92 0x4b87 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c>; + }; + + qcom,pc-temp-z4-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4001 0x3c8d 0x3a72 0x3978 0x397b 0x40ed 0x3c83 0x3a6f 0x39c6 0x39b9 0x40da 0x3c60 0x3a4a 0x39d2 0x39c2 0x4086 0x3c0a 0x3a21 0x39c0 0x39b5 0x4000 0x3ba1 0x39fb 0x39a7 0x399e 0x3f71 0x3b4a 0x39dc 0x3990 0x3986 0x3ef7 0x3b02 0x39c2 0x3981 0x3976 0x3e89 0x3acb 0x39ac 0x3976 0x396c 0x3e16 0x3aa0 0x39a0 0x3970 0x3966 0x3d82 0x3a79 0x399a 0x396d 0x3961 0x3cf4 0x3a50 0x3998 0x396a 0x395d 0x3cc5 0x3a2f 0x3998 0x3965 0x3959 0x3cdb 0x3a29 0x3999 0x395f 0x3951 0x3cf0 0x3a35 0x399d 0x3961 0x394e 0x3cc2 0x3a3c 0x39a2 0x3970 0x395b 0x3c4c 0x3a29 0x39a0 0x397b 0x3968 0x3beb 0x39fe 0x398c 0x396b 0x395e 0x3bb2 0x39dd 0x3979 0x394d 0x3947 0x3b8d 0x39c9 0x3978 0x394f 0x3946 0x3b7e 0x39bd 0x3982 0x3988 0x3974 0x3b75 0x39bc 0x3996 0x39ba 0x39a6 0x3b71 0x39bf 0x39ca 0x39be 0x39ab 0x3b75 0x39c9 0x39fe 0x39b9 0x399f 0x3b7b 0x39fa 0x39fe 0x39ae 0x3991 0x3b80 0x3a38 0x39df 0x3993 0x3982 0x3b85 0x3a46 0x39bf 0x397d 0x3975 0x3b8c 0x3a43 0x39a7 0x3973 0x396c 0x3b92 0x3a3e 0x3994 0x396e 0x3965 0x3b9e 0x3a2f 0x3989 0x3969 0x395f 0x3bab 0x3a18 0x3982 0x3965 0x395a 0x3bb3 0x3a05 0x397d 0x3962 0x3955 0x3bba 0x39f5 0x397b 0x395e 0x3951 0x3bbe 0x39e5 0x397a 0x395a 0x394e 0x3bbc 0x39d6 0x3979 0x395a 0x394d 0x3bb5 0x39c8 0x3979 0x395c 0x3950 0x3ba1 0x39ba 0x3978 0x395e 0x3955 0x3b72 0x39ac 0x3976 0x3961 0x395b 0x3b43 0x39a1 0x3973 0x3963 0x3961 0x3afc 0x399e 0x3970 0x3963 0x3963 0x3abc 0x399c 0x396d 0x3963 0x3960 0x3ab4 0x3999 0x396a 0x3962 0x395d 0x3abb 0x3994 0x3967 0x3960 0x395c 0x3ab9 0x3995 0x3962 0x395d 0x395b 0x3aa3 0x39d0 0x395a 0x3959 0x3958 0x3abd 0x39eb 0x3957 0x394b 0x394c 0x3ac6 0x39f6 0x3953 0x3935 0x3934 0x3acb 0x39f8 0x394d 0x3931 0x392d 0x3ac3 0x39fa 0x3959 0x3929 0x3920 0x3ad0 0x3a03 0x3961 0x3925 0x391e 0x3ac0 0x39ff 0x394e 0x392e 0x392c 0x3a9b 0x39f7 0x3956 0x3935 0x3930 0x3a8e 0x39fe 0x3959 0x3936 0x3935 0x3a94 0x3a0e 0x3963 0x3937 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936>; + }; + + qcom,pc-temp-z5-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2b3c 0x2daa 0x3498 0x4a8d 0x45cc 0x2ef0 0x3052 0x39fb 0x4721 0x484e 0x3117 0x343d 0x3f9f 0x4802 0x4a61 0x31df 0x385f 0x430e 0x4b83 0x4d9f 0x326a 0x3a69 0x44ec 0x4e02 0x5124 0x32f3 0x3bab 0x4673 0x5049 0x55e1 0x33c6 0x3ce5 0x4810 0x514c 0x5936 0x34d0 0x3e95 0x49be 0x511b 0x5a23 0x35db 0x4119 0x4b35 0x5160 0x5a1d 0x36fa 0x4312 0x4c4c 0x5327 0x5b6b 0x3859 0x42b6 0x4bad 0x5424 0x5e2c 0x3a2d 0x3f5c 0x45e6 0x5167 0x6138 0x3c44 0x3ed3 0x3ee4 0x49ed 0x6100 0x3d63 0x47a6 0x4250 0x472f 0x5e7d 0x3d9a 0x506d 0x5049 0x50b3 0x5f98 0x3db5 0x5016 0x57f1 0x5c40 0x639a 0x3dda 0x4c6d 0x532f 0x5d14 0x64bc 0x3dd6 0x4a75 0x4bb9 0x59b9 0x646c 0x3d86 0x49e6 0x55e6 0x5b90 0x6454 0x3cdc 0x49b6 0x76e4 0x6b24 0x646b 0x3bcd 0x5034 0x875d 0x7705 0x6492 0x3ad1 0x649b 0x78a4 0x6a60 0x5e9c 0x3a04 0x7968 0x6282 0x5014 0x511e 0x3939 0x8c1a 0x56c4 0x4873 0x4bc7 0x3846 0x9a39 0x4fd8 0x5026 0x4d8e 0x3716 0x9aa6 0x4dfb 0x5780 0x5074 0x35e9 0x91df 0x53c1 0x5aa0 0x53ba 0x34ed 0x87db 0x5d83 0x5d20 0x57f1 0x33ea 0x7eb5 0x65eb 0x5e8b 0x5cc6 0x32dd 0x764e 0x6eb9 0x601d 0x628a 0x31ca 0x720c 0x75c6 0x61b9 0x67fc 0x30bf 0x6fd5 0x79eb 0x63f1 0x6c9c 0x2ffa 0x6e15 0x7d26 0x6810 0x7085 0x2f5e 0x6c28 0x8068 0x6dc5 0x7165 0x2ed6 0x6a83 0x83d1 0x7653 0x6fdc 0x2e78 0x6a47 0x8529 0x7b5b 0x6e81 0x2ea9 0x6b32 0x8003 0x7adf 0x6f61 0x2f11 0x6ca0 0x7890 0x796f 0x710e 0x303e 0x6e9b 0x7749 0x7672 0x709c 0x317f 0x7119 0x77a9 0x6cad 0x6a94 0x3162 0x71bd 0x77df 0x65cc 0x65f5 0x300b 0x6c45 0x7771 0x66c4 0x66af 0x2fb0 0x60cd 0x7669 0x680b 0x6789 0x3015 0x4018 0x70b0 0x6813 0x6600 0x2ca4 0x3328 0x596b 0x6764 0x62b7 0x2bbe 0x3022 0x477d 0x6688 0x6215 0x2b68 0x2f70 0x4725 0x57da 0x5967 0x2b6c 0x2f09 0x3dd8 0x58e5 0x64be 0x2ab7 0x2db9 0x398d 0x5bd2 0x6460 0x2ae0 0x2ded 0x457f 0x6bcd 0x75c0 0x2cb0 0x2ff3 0x438f 0x6311 0x7110 0x2d80 0x2fa5 0x439f 0x6129 0x668d 0x2d89 0x2ebe 0x3ec3 0x61e3 0x62ca 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005>; + }; + + qcom,pc-temp-z6-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x409a 0x3c2e 0x39dd 0x392f 0x3913 0x416d 0x3c48 0x39ee 0x394b 0x392d 0x419b 0x3c57 0x39ee 0x3952 0x3933 0x4181 0x3c50 0x39e4 0x394f 0x3931 0x413b 0x3c33 0x39d5 0x3947 0x392a 0x40e4 0x3c0c 0x39c7 0x393d 0x3921 0x409c 0x3be5 0x39bb 0x3935 0x391b 0x4062 0x3bcb 0x39b0 0x392e 0x3915 0x4027 0x3bb9 0x39aa 0x392a 0x3910 0x3fe0 0x3ba7 0x39a7 0x3929 0x390e 0x3f9a 0x3b8a 0x39a3 0x3928 0x390c 0x3f73 0x3b64 0x399a 0x3924 0x390b 0x3f65 0x3b56 0x398e 0x391c 0x3906 0x3f55 0x3b62 0x3992 0x3919 0x3903 0x3f1e 0x3b70 0x39a4 0x3927 0x390a 0x3ec0 0x3b64 0x39ac 0x3933 0x3912 0x3e70 0x3b3f 0x3999 0x392a 0x390c 0x3e3a 0x3b22 0x3982 0x3915 0x38fe 0x3e0f 0x3b10 0x3982 0x3914 0x38fc 0x3df2 0x3b06 0x3991 0x3936 0x3915 0x3ddc 0x3b09 0x39a5 0x3953 0x3930 0x3dd2 0x3b19 0x39c1 0x3956 0x3934 0x3dd2 0x3b2e 0x39d7 0x3953 0x3934 0x3dd7 0x3b4e 0x39d6 0x394f 0x3932 0x3ddc 0x3b6d 0x39c9 0x3948 0x392b 0x3de1 0x3b75 0x39be 0x3942 0x3924 0x3de6 0x3b75 0x39b8 0x393d 0x391f 0x3dea 0x3b74 0x39b4 0x3938 0x391c 0x3dee 0x3b6e 0x39b1 0x3935 0x3919 0x3df0 0x3b64 0x39ae 0x3931 0x3916 0x3df0 0x3b5c 0x39ab 0x392e 0x3913 0x3df0 0x3b54 0x39a9 0x392b 0x3910 0x3def 0x3b4c 0x39a8 0x3928 0x390d 0x3ded 0x3b46 0x39a7 0x3928 0x390c 0x3deb 0x3b40 0x39a7 0x3929 0x390c 0x3deb 0x3b3c 0x39a6 0x392a 0x390c 0x3ded 0x3b38 0x39a4 0x392c 0x390f 0x3def 0x3b35 0x39a2 0x392d 0x3913 0x3def 0x3b35 0x39a0 0x392d 0x3914 0x3dee 0x3b36 0x399f 0x392a 0x3912 0x3deb 0x3b36 0x399e 0x3928 0x3910 0x3de2 0x3b35 0x399d 0x3927 0x3910 0x3dd8 0x3b34 0x399b 0x3927 0x390f 0x3dcd 0x3b2c 0x3997 0x3926 0x390f 0x3da1 0x3b16 0x398b 0x391d 0x3908 0x3d94 0x3b10 0x397f 0x3911 0x38f9 0x3d93 0x3b0a 0x397c 0x390a 0x38f2 0x3d8f 0x3b0c 0x3979 0x3906 0x38ec 0x3d8d 0x3b07 0x3977 0x3903 0x38ea 0x3d95 0x3b0c 0x397c 0x390d 0x38f8 0x3da1 0x3b20 0x3983 0x3914 0x38ff 0x3dbd 0x3b30 0x398c 0x3918 0x3902 0x3de0 0x3b45 0x3993 0x391d 0x3906 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d>; + }; + + qcom,pc-temp-y1-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1dae 0x1a6c 0x17b7 0x1540 0x1467 0x143b 0x1db4 0x1a6f 0x17c3 0x153f 0x1466 0x143d 0x1dc0 0x1a74 0x17ca 0x153e 0x1466 0x143e 0x1dcd 0x1a7a 0x17ce 0x153c 0x1466 0x1440 0x1dd8 0x1a7e 0x17d0 0x153b 0x1467 0x1441 0x1ddd 0x1a80 0x17d0 0x153a 0x1467 0x1443 0x1ddc 0x1a80 0x17cc 0x153a 0x1468 0x1443 0x1dda 0x1a80 0x17c6 0x153a 0x146a 0x1444 0x1dd3 0x1a7d 0x17c5 0x153b 0x146c 0x1445 0x1dbc 0x1a76 0x17c8 0x153c 0x146d 0x1446 0x1daa 0x1a70 0x17ca 0x153d 0x146f 0x1448 0x1db3 0x1a6e 0x17c6 0x153d 0x1470 0x1449 0x1dc8 0x1a6f 0x17c0 0x153d 0x1472 0x144b 0x1ddc 0x1a74 0x17c1 0x153e 0x1474 0x144d 0x1df4 0x1a85 0x17d0 0x1545 0x1479 0x1452 0x1e03 0x1a97 0x17db 0x154d 0x147c 0x1454 0x1dfa 0x1aa4 0x17df 0x154f 0x147c 0x1455 0x1de7 0x1aaf 0x17e3 0x1552 0x147d 0x1455 0x1dd8 0x1ab0 0x17e4 0x1554 0x147e 0x1456 0x1dca 0x1aa1 0x17e2 0x1555 0x1480 0x1459 0x1dc3 0x1a95 0x17e2 0x1558 0x1483 0x145c 0x1dd6 0x1a97 0x17ed 0x155c 0x1487 0x1460 0x1df9 0x1a9f 0x17fb 0x1560 0x148b 0x1463 0x1e01 0x1aa5 0x17fd 0x1565 0x148e 0x1467 0x1e00 0x1aa8 0x17f8 0x1569 0x1491 0x146a 0x1e04 0x1aac 0x17f7 0x156d 0x1493 0x146e 0x1e09 0x1ab8 0x1800 0x1571 0x1496 0x1472 0x1e0c 0x1acc 0x180b 0x1576 0x149a 0x1475 0x1e0a 0x1ad7 0x180e 0x157b 0x149d 0x1478 0x1df8 0x1adc 0x1812 0x1581 0x14a0 0x147a 0x1de0 0x1ade 0x1817 0x1586 0x14a3 0x147d 0x1dd9 0x1adb 0x181b 0x158b 0x14a7 0x1480 0x1ddb 0x1ad7 0x181f 0x1590 0x14aa 0x1484 0x1ddd 0x1ad7 0x1820 0x1593 0x14ad 0x1487 0x1de1 0x1ad5 0x1821 0x1596 0x14b0 0x1489 0x1de8 0x1ad3 0x1823 0x1599 0x14b2 0x148b 0x1df7 0x1adf 0x1827 0x159b 0x14b4 0x148c 0x1e0a 0x1aef 0x182c 0x159d 0x14b5 0x148d 0x1e0d 0x1aef 0x1831 0x159e 0x14b5 0x148e 0x1dff 0x1ae3 0x1835 0x159f 0x14b6 0x148e 0x1df5 0x1adf 0x183a 0x15a1 0x14b7 0x148f 0x1df6 0x1ae5 0x1841 0x15a5 0x14b9 0x1491 0x1df6 0x1aeb 0x184c 0x15a8 0x14ba 0x1492 0x1df6 0x1af2 0x1849 0x15aa 0x14bb 0x1493 0x1dfa 0x1af8 0x1850 0x15af 0x14be 0x1495 0x1e04 0x1b0b 0x1850 0x15b1 0x14be 0x1496 0x1e09 0x1b08 0x1859 0x15b4 0x14be 0x1496 0x1e26 0x1b0e 0x1863 0x15b4 0x14be 0x1496 0x1e37 0x1b0b 0x186b 0x15b6 0x14bf 0x1496 0x1e2c 0x1b1e 0x1867 0x15b9 0x14c2 0x1498 0x1e29 0x1b3f 0x1879 0x15c2 0x14c5 0x149b 0x1e38 0x1b5b 0x1895 0x15d1 0x14cc 0x14a0 0x1e61 0x1b5f 0x18a8 0x15e4 0x14d3 0x14a6 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac>; + }; + + qcom,pc-temp-y2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x25d6 0x28a1 0x29b8 0x2b2a 0x2b60 0x2c89 0x2638 0x287f 0x299b 0x2b15 0x2b62 0x2c51 0x2674 0x286a 0x297a 0x2afb 0x2b61 0x2bfc 0x2693 0x285f 0x2959 0x2ade 0x2b5e 0x2ba2 0x269f 0x285b 0x293d 0x2abd 0x2b58 0x2b5a 0x26a2 0x285a 0x292b 0x2a9a 0x2b51 0x2b3c 0x266c 0x2867 0x2922 0x2a6d 0x2b48 0x2b43 0x260b 0x287d 0x291b 0x2a3f 0x2b3b 0x2b4e 0x25f2 0x2878 0x2916 0x2a29 0x2b28 0x2b4d 0x25fe 0x283e 0x2912 0x2a1c 0x2b09 0x2b3a 0x2615 0x2814 0x2910 0x2a13 0x2ae5 0x2b24 0x2698 0x2862 0x291a 0x2a04 0x2ab6 0x2afb 0x2784 0x28ea 0x2933 0x29f0 0x2a85 0x2ac3 0x27ba 0x2909 0x295a 0x29f2 0x2a7a 0x2abc 0x26d8 0x28f6 0x29a8 0x2a1d 0x2a90 0x2af0 0x2601 0x28e9 0x29e0 0x2a53 0x2ab0 0x2b19 0x25e5 0x28ff 0x29fa 0x2a91 0x2aec 0x2b1b 0x25de 0x2924 0x2a0e 0x2ad0 0x2b33 0x2b18 0x25d8 0x292d 0x2a1d 0x2aef 0x2b47 0x2b23 0x25d2 0x292c 0x2a2b 0x2afc 0x2b48 0x2b59 0x25cd 0x2929 0x2a36 0x2b0a 0x2b4a 0x2b9b 0x25ca 0x28f3 0x2a3f 0x2b29 0x2b78 0x2bd9 0x25c8 0x2849 0x2a48 0x2b54 0x2bc0 0x2c13 0x25c6 0x27d1 0x2a4b 0x2b74 0x2be2 0x2c3d 0x25c3 0x275f 0x2a50 0x2b8f 0x2bf6 0x2c5c 0x25c0 0x271c 0x2a54 0x2ba1 0x2c07 0x2c71 0x25bf 0x270e 0x2a52 0x2bac 0x2c19 0x2c83 0x25be 0x2700 0x2a4a 0x2bb0 0x2c2d 0x2c96 0x25bd 0x26ed 0x2a46 0x2ba7 0x2c35 0x2cb5 0x25bc 0x26d4 0x2a44 0x2b8e 0x2c41 0x2cec 0x25bb 0x26b9 0x2a3f 0x2b80 0x2c4d 0x2d11 0x25bb 0x26a1 0x29e9 0x2b83 0x2c40 0x2d02 0x25ba 0x268b 0x294e 0x2b8f 0x2c2f 0x2cda 0x25b9 0x2672 0x290b 0x2b9c 0x2c33 0x2cca 0x25b8 0x2655 0x28fa 0x2b99 0x2c39 0x2cd1 0x25b8 0x263a 0x28ee 0x2b84 0x2c35 0x2cd6 0x25b7 0x2622 0x28e6 0x2b68 0x2c34 0x2cdc 0x25b7 0x2604 0x290b 0x2b59 0x2c39 0x2ce8 0x25b6 0x25ec 0x293c 0x2b5f 0x2c3b 0x2ce7 0x25b6 0x25de 0x291d 0x2b60 0x2c36 0x2cd1 0x25b6 0x25d4 0x28ba 0x2b5f 0x2c32 0x2cc5 0x25b6 0x25cb 0x289c 0x2b62 0x2c34 0x2ccc 0x25b6 0x25c4 0x28a6 0x2b5d 0x2c32 0x2ccf 0x25b5 0x25be 0x281b 0x2b46 0x2c13 0x2cc8 0x25b5 0x25bb 0x27d7 0x2b34 0x2c13 0x2cb0 0x25b5 0x25bb 0x27c4 0x2b11 0x2c20 0x2c82 0x25b5 0x25ba 0x2810 0x2b0d 0x2c0a 0x2c51 0x25b5 0x25b9 0x2851 0x2b23 0x2be8 0x2c48 0x25b5 0x25b8 0x2853 0x2b28 0x2bef 0x2c50 0x25b4 0x25b8 0x2837 0x2ae6 0x2c1e 0x2c3a 0x25b4 0x25b6 0x2800 0x2acc 0x2bf7 0x2bfd 0x25b4 0x25b5 0x27bc 0x2aa1 0x2b7e 0x2ba7 0x25b4 0x25b4 0x2786 0x2a49 0x2b0f 0x2b35 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a>; + }; + + qcom,pc-temp-y3-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x347a 0x3456 0x3421 0x33e5 0x33e0 0x33d8 0x356b 0x345f 0x341a 0x33e4 0x33e0 0x33da 0x35ff 0x346c 0x3416 0x33e3 0x33e0 0x33db 0x364d 0x3479 0x3416 0x33e3 0x33e0 0x33dd 0x366b 0x3484 0x3418 0x33e3 0x33e0 0x33de 0x3670 0x3489 0x341c 0x33e5 0x33e0 0x33de 0x35ec 0x3489 0x3423 0x33e8 0x33e0 0x33de 0x34fc 0x3488 0x342b 0x33ed 0x33e1 0x33de 0x34bb 0x348b 0x342e 0x33ef 0x33e1 0x33de 0x34ba 0x349e 0x342f 0x33f0 0x33e1 0x33dd 0x34bb 0x34ac 0x3430 0x33f0 0x33e1 0x33dd 0x34d3 0x349e 0x343d 0x33f7 0x33e4 0x33df 0x3504 0x3481 0x3450 0x3401 0x33e9 0x33e2 0x3510 0x3471 0x3451 0x3402 0x33ea 0x33e3 0x34ec 0x3468 0x343b 0x33fe 0x33e8 0x33e2 0x34cc 0x3462 0x3427 0x33fb 0x33e6 0x33e2 0x34d0 0x345f 0x3422 0x33fd 0x33e8 0x33e2 0x34e0 0x345d 0x341f 0x3401 0x33ec 0x33e3 0x34e7 0x345a 0x341b 0x3401 0x33ec 0x33e3 0x34e9 0x3455 0x3416 0x33f9 0x33e7 0x33e0 0x34ea 0x344f 0x3411 0x33f0 0x33e3 0x33dd 0x34ec 0x3445 0x340c 0x33e8 0x33e1 0x33dc 0x34f0 0x3435 0x3407 0x33e3 0x33e0 0x33db 0x34f5 0x3427 0x3406 0x33e2 0x33df 0x33db 0x3500 0x341c 0x3405 0x33e3 0x33de 0x33db 0x3512 0x3417 0x3405 0x33e4 0x33de 0x33da 0x3525 0x3418 0x3405 0x33e3 0x33de 0x33da 0x3539 0x341b 0x3405 0x33e3 0x33dd 0x33da 0x354f 0x341f 0x3405 0x33e5 0x33dd 0x33da 0x356b 0x3423 0x3405 0x33e9 0x33dd 0x33d9 0x358d 0x3428 0x3405 0x33ec 0x33dd 0x33d9 0x35b2 0x342d 0x3400 0x33ed 0x33de 0x33d9 0x35da 0x3434 0x33f9 0x33ec 0x33de 0x33da 0x360a 0x343c 0x33f6 0x33ec 0x33df 0x33da 0x3641 0x3449 0x33f7 0x33ea 0x33de 0x33da 0x3680 0x3458 0x33f8 0x33e8 0x33de 0x33d9 0x36c1 0x3468 0x33fb 0x33e6 0x33de 0x33d9 0x3702 0x347a 0x3402 0x33e4 0x33dd 0x33d9 0x3742 0x3490 0x3408 0x33e3 0x33dd 0x33d9 0x3781 0x34b0 0x340c 0x33e3 0x33dd 0x33d9 0x37c1 0x34dc 0x340f 0x33e3 0x33dd 0x33d9 0x3803 0x3511 0x3415 0x33e3 0x33de 0x33da 0x3845 0x3550 0x341e 0x33e3 0x33de 0x33da 0x3892 0x35a3 0x3421 0x33e4 0x33de 0x33da 0x38ea 0x3613 0x3429 0x33e3 0x33de 0x33da 0x390d 0x3642 0x3430 0x33eb 0x33df 0x33dc 0x393f 0x363e 0x3435 0x33ec 0x33e1 0x33dd 0x395c 0x3658 0x3442 0x33f0 0x33e3 0x33e0 0x398d 0x36b9 0x3451 0x33f2 0x33e2 0x33e0 0x3a0b 0x3718 0x3452 0x33ee 0x33e1 0x33dd 0x3a97 0x37a6 0x345a 0x33f0 0x33e0 0x33dd 0x3b31 0x3888 0x346f 0x33f5 0x33e3 0x33e1 0x3c10 0x3978 0x3492 0x33f9 0x33e6 0x33e4 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6>; + }; + + qcom,pc-temp-y4-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x45b5 0x41d2 0x40f2 0x406d 0x4045 0x4044 0x452b 0x41db 0x40ef 0x4073 0x4045 0x4042 0x44eb 0x41eb 0x40ef 0x4078 0x4047 0x4041 0x44e9 0x4200 0x40f2 0x407b 0x4048 0x4040 0x4515 0x421b 0x40f7 0x407d 0x404a 0x4040 0x4561 0x4239 0x40fe 0x407e 0x404b 0x4040 0x4627 0x4263 0x4106 0x407c 0x404d 0x4041 0x478b 0x428e 0x4111 0x407a 0x404e 0x4044 0x4914 0x42a4 0x411c 0x407a 0x4051 0x4046 0x4b24 0x42ad 0x4127 0x4081 0x4055 0x4049 0x4c74 0x42bc 0x4138 0x408c 0x405b 0x404d 0x4a3e 0x4407 0x419f 0x409e 0x4069 0x4059 0x4560 0x4626 0x4237 0x40b4 0x407d 0x4068 0x437a 0x4642 0x4251 0x40bd 0x4081 0x406c 0x4347 0x43a8 0x4203 0x40bf 0x407d 0x406b 0x432d 0x41b1 0x41aa 0x40c3 0x407b 0x406a 0x4320 0x41b5 0x416e 0x40ec 0x4091 0x407a 0x430d 0x41e2 0x413b 0x4129 0x40ba 0x4098 0x42ef 0x41ed 0x4117 0x412a 0x40c0 0x409d 0x42b4 0x41c5 0x40fa 0x40d1 0x4094 0x407d 0x4274 0x4198 0x40e3 0x4085 0x4066 0x405b 0x4249 0x4180 0x40d4 0x4078 0x4054 0x404d 0x4228 0x416e 0x40c8 0x4072 0x4049 0x4043 0x421f 0x416b 0x40c2 0x406f 0x4048 0x4042 0x4223 0x415f 0x40be 0x406b 0x4048 0x4042 0x422b 0x414f 0x40bb 0x4069 0x4049 0x4043 0x4231 0x4143 0x40ba 0x406b 0x404b 0x4045 0x423b 0x4137 0x40ba 0x406d 0x404e 0x4048 0x4246 0x4136 0x40b9 0x406e 0x4051 0x404c 0x4252 0x4142 0x40b4 0x4070 0x4057 0x4051 0x425e 0x4154 0x40b0 0x4072 0x405e 0x4058 0x426a 0x4167 0x40b4 0x4074 0x4068 0x4063 0x4276 0x417f 0x40bd 0x4076 0x4073 0x4070 0x4283 0x4198 0x40c4 0x4074 0x4075 0x4072 0x4290 0x41b2 0x40c9 0x4069 0x4064 0x4061 0x429c 0x41cd 0x40cd 0x405e 0x404f 0x404c 0x42a8 0x41ef 0x40d2 0x405b 0x4044 0x4043 0x42b5 0x421f 0x40d8 0x4059 0x403e 0x403f 0x42c7 0x4244 0x40dc 0x405a 0x403e 0x4040 0x42e1 0x4252 0x40e9 0x405d 0x4042 0x4045 0x4308 0x425c 0x40fd 0x4060 0x4047 0x404a 0x433b 0x4262 0x410c 0x4063 0x4048 0x404b 0x437e 0x4270 0x4118 0x4064 0x4046 0x4048 0x43d3 0x4287 0x4129 0x4061 0x403d 0x403b 0x442a 0x42c2 0x4147 0x406b 0x4041 0x403e 0x441b 0x42ef 0x4160 0x4075 0x4057 0x405a 0x441e 0x4307 0x4166 0x4084 0x4070 0x4078 0x43ed 0x432a 0x4193 0x40a2 0x4099 0x40a2 0x43d0 0x436e 0x41e6 0x40be 0x409c 0x4098 0x43e5 0x4383 0x41de 0x409e 0x406e 0x4064 0x43f6 0x4384 0x41d8 0x409e 0x4060 0x4059 0x4411 0x43a0 0x41fb 0x40bd 0x4070 0x4067 0x4463 0x43f1 0x4266 0x40fb 0x4090 0x4085 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118>; + }; + + qcom,pc-temp-y5-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2208 0x348a 0x3ab0 0x3545 0x4573 0x3634 0x2208 0x34aa 0x3839 0x3326 0x4393 0x3e82 0x269f 0x34e2 0x3660 0x31db 0x419b 0x43da 0x2f8b 0x3522 0x3519 0x3130 0x3fbf 0x46e0 0x3428 0x3557 0x345a 0x30f0 0x3e34 0x4838 0x3590 0x3572 0x341a 0x30e7 0x3d2f 0x4884 0x30ee 0x3576 0x34b3 0x32d3 0x3ca4 0x46c7 0x2869 0x3578 0x35a4 0x35e5 0x3c3f 0x4385 0x267f 0x34b6 0x35c2 0x3648 0x3b81 0x4119 0x2a54 0x3032 0x3545 0x34d0 0x3996 0x3e92 0x2ff6 0x2cf8 0x3494 0x33cf 0x387f 0x3ce5 0x37e1 0x2fd6 0x333d 0x3525 0x3964 0x3cfd 0x4112 0x360e 0x319c 0x3768 0x3acb 0x3dbd 0x4280 0x3a64 0x326c 0x37dc 0x3b0d 0x3dbf 0x373b 0x3dd4 0x395e 0x3745 0x3a7a 0x3cb2 0x2cf9 0x3f72 0x3eca 0x36d1 0x3a41 0x3bb0 0x2d03 0x3ec5 0x3f83 0x384b 0x3ae8 0x3b5d 0x2edc 0x3dc2 0x3fc3 0x3b9d 0x3c38 0x3b2b 0x2f8c 0x3d9a 0x3f92 0x3dc7 0x3e57 0x3b93 0x2f1e 0x3df3 0x3ecf 0x3f34 0x4225 0x3e9f 0x2e5c 0x3e54 0x3de6 0x3fc8 0x445b 0x4233 0x2d64 0x3c6d 0x3c08 0x3c17 0x4527 0x44e0 0x2c30 0x3697 0x3971 0x3578 0x4604 0x471b 0x2b6b 0x3248 0x38a0 0x33d2 0x4627 0x47ff 0x2b06 0x2f1a 0x38d8 0x353a 0x4512 0x484d 0x2ad4 0x2d6f 0x3925 0x3660 0x43d2 0x484f 0x2add 0x2d4c 0x3975 0x3678 0x4315 0x4790 0x2aec 0x2d55 0x39cc 0x366c 0x4294 0x45bc 0x2af3 0x2d44 0x3a34 0x38ed 0x427b 0x43ff 0x2b16 0x2d12 0x3b09 0x40ee 0x4270 0x426f 0x2b4e 0x2d07 0x3ba6 0x465a 0x4280 0x41aa 0x2b80 0x2d07 0x38cb 0x47e5 0x43ef 0x42bb 0x2ba9 0x2cec 0x3382 0x48db 0x472c 0x45f6 0x2bd0 0x2ce9 0x319e 0x48b8 0x4a98 0x495f 0x2bf8 0x2d41 0x31a4 0x45bb 0x4e8c 0x4c69 0x2c20 0x2daa 0x31b5 0x4185 0x51da 0x4ea9 0x2c45 0x2dd9 0x3221 0x3e14 0x52fb 0x508e 0x2c64 0x2d8a 0x34af 0x3aee 0x5257 0x524a 0x2c6c 0x2d32 0x3713 0x3918 0x50bc 0x5292 0x2c5a 0x2d52 0x36de 0x38bf 0x4e90 0x50e7 0x2c45 0x2d99 0x34f7 0x3913 0x4dbc 0x4f8f 0x2c53 0x2da9 0x354f 0x3906 0x4ea8 0x5136 0x2cb7 0x2d71 0x370b 0x3898 0x515e 0x56c7 0x2d6c 0x2d2c 0x33cd 0x3962 0x555b 0x5c52 0x2e6e 0x2cc8 0x325a 0x3610 0x4cc2 0x4ea4 0x2fc4 0x2d10 0x320a 0x3e49 0x4394 0x4373 0x30b0 0x2d1b 0x3431 0x3e08 0x42cc 0x40b6 0x322c 0x2e86 0x370e 0x4092 0x40be 0x3f21 0x3256 0x3099 0x3915 0x3fe1 0x3e27 0x3e5b 0x322c 0x3127 0x38b1 0x3e5f 0x428d 0x410e 0x3117 0x3039 0x38e1 0x4283 0x4414 0x4431 0x2f77 0x2f18 0x37f8 0x4528 0x4741 0x4a06 0x2e6f 0x2e5e 0x37ca 0x4396 0x477b 0x4ab1 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b>; + }; + + qcom,pc-temp-y6-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1af4 0x1607 0x1492 0x13c9 0x139d 0x1392 0x1afb 0x160e 0x148d 0x13c8 0x139d 0x1393 0x1aff 0x1616 0x148a 0x13c7 0x139d 0x1394 0x1aff 0x161e 0x148a 0x13c8 0x139d 0x1395 0x1afc 0x1626 0x148c 0x13c9 0x139e 0x1395 0x1af7 0x162e 0x148e 0x13ca 0x139f 0x1396 0x1ac7 0x1636 0x1494 0x13cc 0x139f 0x1397 0x1a78 0x163e 0x149c 0x13cf 0x13a1 0x1397 0x1a74 0x1646 0x14a1 0x13d2 0x13a2 0x1398 0x1aff 0x164c 0x14a3 0x13d4 0x13a3 0x1399 0x1b70 0x1657 0x14a8 0x13d7 0x13a5 0x139a 0x1af4 0x16ac 0x14cc 0x13e2 0x13ac 0x139f 0x19d3 0x172c 0x1503 0x13ef 0x13b5 0x13a6 0x1941 0x172c 0x150b 0x13f2 0x13b7 0x13a8 0x190e 0x1670 0x14e5 0x13f1 0x13b5 0x13a7 0x18f6 0x15e2 0x14be 0x13f0 0x13b3 0x13a7 0x18fb 0x15e4 0x14ab 0x13fd 0x13bb 0x13ac 0x1909 0x15f5 0x149c 0x1412 0x13c9 0x13b5 0x190d 0x15f9 0x148f 0x1412 0x13cb 0x13b7 0x190c 0x15ed 0x1483 0x13f3 0x13bb 0x13ab 0x190a 0x15e0 0x147a 0x13d6 0x13ab 0x139f 0x190d 0x15d6 0x1473 0x13cd 0x13a4 0x139a 0x191a 0x15ce 0x146e 0x13c8 0x13a1 0x1397 0x192c 0x15c9 0x146d 0x13c7 0x13a0 0x1397 0x1945 0x15c7 0x146e 0x13c7 0x13a0 0x1397 0x1964 0x15c6 0x146f 0x13c8 0x13a0 0x1398 0x1982 0x15cb 0x1470 0x13c9 0x13a1 0x1398 0x19a0 0x15d5 0x1473 0x13ca 0x13a2 0x1399 0x19c0 0x15e2 0x1475 0x13cc 0x13a3 0x139a 0x19e6 0x15f3 0x1476 0x13d0 0x13a5 0x139c 0x1a11 0x1607 0x1477 0x13d4 0x13a7 0x139e 0x1a3f 0x161d 0x1478 0x13d6 0x13ab 0x13a2 0x1a72 0x1638 0x1479 0x13d7 0x13af 0x13a6 0x1aa7 0x1655 0x147b 0x13d6 0x13b0 0x13a7 0x1ae0 0x1676 0x147f 0x13d2 0x13ab 0x13a2 0x1b1c 0x169b 0x1483 0x13ce 0x13a5 0x139c 0x1b59 0x16c6 0x1488 0x13cc 0x13a2 0x139a 0x1b96 0x16f8 0x1490 0x13cb 0x13a0 0x1398 0x1bd4 0x1732 0x149a 0x13ca 0x13a0 0x1399 0x1c13 0x1772 0x14a5 0x13cb 0x13a1 0x139a 0x1c51 0x17bc 0x14b0 0x13cd 0x13a3 0x139c 0x1c90 0x1811 0x14bf 0x13ce 0x13a4 0x139d 0x1cd3 0x1875 0x14d0 0x13cf 0x13a3 0x139c 0x1d22 0x18ef 0x14e0 0x13d0 0x13a1 0x1399 0x1d80 0x1984 0x14f9 0x13d2 0x13a3 0x139a 0x1da5 0x19b9 0x150c 0x13db 0x13a9 0x13a3 0x1dcf 0x19c4 0x1513 0x13e1 0x13b2 0x13ad 0x1dde 0x19e7 0x152f 0x13ec 0x13bf 0x13bb 0x1e04 0x1a57 0x155a 0x13f6 0x13c0 0x13b8 0x1e6d 0x1abf 0x1560 0x13eb 0x13b2 0x13a7 0x1edf 0x1b41 0x1573 0x13ee 0x13ae 0x13a5 0x1f66 0x1c0d 0x15ab 0x13fd 0x13b6 0x13ac 0x2034 0x1cdf 0x160e 0x1415 0x13c2 0x13b7 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4>; + }; + }; + }; + }; + }; + + fragment@12 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm1 { + reg = <0x4f>; + label = "pa_therm1"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@13 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x4d 0xffffffff 0x4e 0xffffffff 0x4f 0xffffffff 0x52>; + + pa_therm1 { + reg = <0x4f>; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + }; + }; + }; + + fragment@14 { + target = <0xffffffff>; + + __overlay__ { + compatible = "qcom,ufs-phy-qmp-v3"; + vdda-phy-supply = <0xffffffff>; + vdda-pll-supply = <0xffffffff>; + vdda-phy-max-microamp = <0xf5b4>; + vdda-pll-max-microamp = <0x477c>; + status = "ok"; + }; + }; + + fragment@15 { + target = <0xffffffff>; + + __overlay__ { + vdd-hba-supply = <0xffffffff>; + vdd-hba-fixed-regulator; + vcc-supply = <0xffffffff>; + vcc-voltage-level = <0x2d2a80 0x2d2a80>; + vcc-max-microamp = <0x927c0>; + vccq2-supply = <0xffffffff>; + vccq2-voltage-level = <0x1ab3f0 0x1dc130>; + vccq2-max-microamp = <0x927c0>; + qcom,vddp-ref-clk-supply = <0xffffffff>; + qcom,vddp-ref-clk-max-microamp = <0x64>; + status = "ok"; + }; + }; + + fragment@16 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0x8b290>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <0x1b7740 0x1b7740>; + qcom,vdd-io-current-level = <0x0 0x4f588>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + status = "ok"; + }; + }; + + fragment@17 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0xc3500>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-voltage-level = <0x1b7740 0x2d0370>; + qcom,vdd-io-current-level = <0x0 0x55f0>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + cd-gpios = <0xffffffff 0x45 0x1>; + status = "ok"; + }; + }; + + fragment@18 { + target = <0xffffffff>; + + __overlay__ { + + pa-therm1 { + polling-delay-passive = <0x0>; + polling-delay = <0x0>; + thermal-governor = "user_space"; + thermal-sensors = <0xffffffff 0x4f>; + wake-capable-sensor; + + trips { + + active-config0 { + temperature = <0x1e848>; + hysteresis = <0x3e8>; + type = "passive"; + }; + }; + }; + + quiet-therm-step { + status = "disabled"; + }; + }; + }; + + fragment@19 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@20 { + target = <0xffffffff>; + + __overlay__ { + qcom,battery-data = <0x13>; + qcom,qg-iterm-ma = <0x64>; + qcom,hold-soc-while-full; + qcom,linearize-soc; + qcom,cl-feedback-on; + }; + }; + + fragment@21 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x8 0xffffffff 0x7 0xffffffff 0x9 0xffffffff 0x6 0xffffffff 0x4f 0xffffffff 0x99 0xffffffff 0x83>; + io-channel-names = "usb_in_voltage", "usb_in_current", "chg_temp", "die_temp", "conn_temp", "sbux_res", "vph_voltage"; + qcom,battery-data = <0x13>; + qcom,auto-recharge-soc = <0x62>; + qcom,step-charging-enable; + qcom,sw-jeita-enable; + qcom,fcc-stepping-enable; + qcom,suspend-input-on-debug-batt; + qcom,sec-charger-config = <0x3>; + qcom,thermal-mitigation = <0x401640 0x3567e0 0x2dc6c0 0x2625a0 0x1e8480 0x16e360 0xf4240 0x7a120>; + dpdm-supply = <0xffffffff>; + qcom,charger-temp-max = <0x320>; + qcom,smb-temp-max = <0x320>; + qcom,fcc-step-delay-ms = <0x64>; + qcom,fcc-step-size-ua = <0x186a0>; + qcom,disable-sw-thermal-regulation; + qcom,disable-fcc-restriction; + qcom,smb-internal-pull-kohm = <0x0>; + }; + }; + + fragment@22 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + }; + }; + }; + + fragment@23 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@24 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,i2c-touch-active = "synaptics,tcm-i2c"; + + synaptics_tcm@20 { + compatible = "synaptics,tcm-i2c"; + reg = <0x20>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend", "pmx_ts_release"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + pinctrl-2 = <0xffffffff>; + vdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + synaptics,pwr-reg-name = "avdd"; + synaptics,bus-reg-name = "vdd"; + synaptics,irq-gpio = <0xffffffff 0x9 0x2008>; + synaptics,irq-on-state = <0x0>; + synaptics,reset-gpio = <0xffffffff 0x8 0x0>; + synaptics,reset-on-state = <0x0>; + synaptics,reset-active-ms = <0x14>; + synaptics,reset-delay-ms = <0xc8>; + synaptics,power-delay-ms = <0xc8>; + synaptics,ubl-i2c-addr = <0x20>; + }; + + atmel_mxt_ts@4a { + compatible = "atmel,maxtouch"; + reg = <0x4a>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + avdd-supply = <0xffffffff>; + vdd-supply = <0xffffffff>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + reset-gpios = <0xffffffff 0x8 0x0>; + irq-gpios = <0xffffffff 0x9 0x2008>; + atmel,xy_switch; + atmel,panel-coords = <0x0 0x0 0x1df 0x31f>; + atmel,display-coords = <0x0 0x0 0x153 0x301>; + }; + }; + }; + + fragment@25 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,clk-freq-out = <0xf4240>; + #address-cells = <0x1>; + #size-cells = <0x0>; + + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <0xffffffff 0x25 0x0>; + qcom,nq-ven = <0xffffffff 0xc 0x0>; + qcom,nq-firm = <0xffffffff 0x24 0x0>; + qcom,nq-clkreq = <0xffffffff 0x1f 0x0>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff>; + }; + }; + }; + + fragment@26 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-aux-switch = <0xffffffff>; + }; + }; + + fragment@27 { + target = <0xffffffff>; + + __overlay__ { + + lpi_pinctrl@627C0000 { + compatible = "qcom,lpi-pinctrl"; + reg = <0x627c0000 0x0>; + qcom,num-gpios = <0xf>; + gpio-controller; + #gpio-cells = <0x2>; + qcom,slew-reg = <0x6295a000 0x0>; + qcom,lpi-offset-tbl = <0x0 0x1000 0x2000 0x3000 0x4000 0x5000 0x6000 0x7000 0x8000 0x9000 0xa000 0xb000 0xc000 0xd000 0xe000>; + qcom,lpi-slew-offset-tbl = <0x0 0x2 0x4 0x8 0xa 0xc 0x0 0x0 0x0 0x0 0x10 0x12 0x0 0x0 0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + phandle = <0x31>; + + dmic01_clk_active { + phandle = <0x32>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic01_clk_sleep { + phandle = <0x34>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic01_data_active { + phandle = <0x33>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic01_data_sleep { + phandle = <0x35>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic23_clk_active { + phandle = <0x36>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic23_clk_sleep { + phandle = <0x38>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic23_data_active { + phandle = <0x37>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic23_data_sleep { + phandle = <0x39>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic45_clk_active { + phandle = <0x3a>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic45_clk_sleep { + phandle = <0x3c>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic45_data_active { + phandle = <0x3b>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic45_data_sleep { + phandle = <0x3d>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + tx_swr_clk_sleep { + phandle = <0x4a>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_clk_active { + phandle = <0x46>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + tx_swr_data0_sleep { + phandle = <0x4b>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data0_active { + phandle = <0x47>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_sleep { + phandle = <0x40>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_active { + phandle = <0x3e>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_data_sleep { + phandle = <0x41>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_data_active { + phandle = <0x3f>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data1_sleep { + phandle = <0x4c>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data1_active { + phandle = <0x48>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data2_sleep { + phandle = <0x4d>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data2_active { + phandle = <0x49>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + rx_swr_clk_sleep { + phandle = <0x44>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_clk_active { + phandle = <0x42>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + rx_swr_data_sleep { + phandle = <0x45>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_data_active { + phandle = <0x43>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + lpi_i2s1_sck_active { + phandle = <0x55>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sck_sleep { + phandle = <0x59>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_ws_active { + phandle = <0x56>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_ws_sleep { + phandle = <0x5a>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd0_active { + phandle = <0x57>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd0_sleep { + phandle = <0x5b>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd1_active { + phandle = <0x58>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd1_sleep { + phandle = <0x5c>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + }; + + fragment@28 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x4>; + + bolero-clk-rsc-mngr { + compatible = "qcom,bolero-clk-rsc-mngr"; + qcom,fs-gen-sequence = <0x3000 0x1 0x3004 0x1 0x3080 0x2>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,va_mclk_mode_muxsel = <0x627a0000>; + clock-names = "tx_core_clk", "tx_npl_clk", "rx_core_clk", "rx_npl_clk", "wsa_core_clk", "wsa_npl_clk", "va_core_clk", "va_npl_clk"; + clocks = <0x14 0x0 0x15 0x0 0x16 0x0 0x17 0x0 0x18 0x0 0x19 0x0 0x1a 0x0 0x1b 0x0>; + }; + + tx-macro@62620000 { + compatible = "qcom,tx-macro"; + reg = <0x62620000 0x0>; + clock-names = "tx_core_clk", "tx_npl_clk"; + clocks = <0x14 0x0 0x15 0x0>; + qcom,tx-swr-gpios = <0x1c>; + qcom,tx-dmic-sample-rate = <0x249f00>; + phandle = <0xb1>; + + tx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x3>; + swrm-io-base = <0x62630000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x1>; + interrupts = <0x0 0x128 0x0 0x0 0x22b 0x0>; + interrupt-names = "swr_master_irq", "swr_wake_irq"; + qcom,swr-wakeup-required = <0x0>; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x21 0xf 0x2 0x12 0x1 0x2 0x13 0x2 0x3 0x14 0x1 0x3 0x15 0x2 0x4 0x16 0x1 0x4 0x17 0x2 0x4 0x18 0x4 0x4 0x19 0x8 0x5 0x1a 0x1 0x5 0x1b 0x2 0x5 0x1c 0x4 0x5 0x1d 0x8>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + qcom,swr-mstr-irq-wakeup-capable = <0x1>; + phandle = <0xb2>; + + wcd938x-tx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170223>; + phandle = <0x23>; + }; + + wcd937x-tx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170223>; + phandle = <0x27>; + }; + }; + }; + + rx-macro@62600000 { + compatible = "qcom,rx-macro"; + reg = <0x62600000 0x0>; + clock-names = "rx_core_clk", "rx_npl_clk"; + clocks = <0x16 0x0 0x17 0x0>; + qcom,rx-swr-gpios = <0x1d>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,rx-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + phandle = <0xb3>; + + rx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x2>; + swrm-io-base = <0x62610000 0x0>; + interrupts = <0x0 0x129 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x9 0x1 0x1 0xa 0x2 0x2 0xd 0x1 0x3 0xb 0x1 0x3 0xc 0x2 0x4 0xe 0x1 0x5 0xf 0x1 0x5 0x10 0x2>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + phandle = <0xb4>; + + wcd938x-rx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170224>; + phandle = <0x22>; + }; + + wcd937x-rx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170224>; + phandle = <0x26>; + }; + }; + }; + + wsa-macro@62640000 { + compatible = "qcom,wsa-macro"; + reg = <0x62640000 0x0>; + clock-names = "wsa_core_clk", "wsa_npl_clk"; + clocks = <0x18 0x0 0x19 0x0>; + qcom,wsa-swr-gpios = <0x1e>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,wsa-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + status = "disabled"; + phandle = <0xb5>; + + wsa_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + qcom,swr_master_id = <0x1>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + swrm-io-base = <0x62650000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x0>; + interrupts = <0x0 0x127 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x8>; + qcom,swr-port-mapping = <0x1 0x1 0x1 0x2 0x3 0xf 0x3 0x2 0x3 0x4 0x5 0x1 0x5 0x7 0xf 0x6 0x6 0x3 0x7 0x4 0x3 0x8 0x8 0x3>; + qcom,swr-num-dev = <0x2>; + phandle = <0xb6>; + + wsa881x@20170211 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170211>; + qcom,spkr-sd-n-node = <0x1f>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2c>; + }; + + wsa881x@20170212 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170212>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2d>; + }; + + wsa881x@21170213 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170213>; + qcom,spkr-sd-n-node = <0x1f>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2e>; + }; + + wsa881x@21170214 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170214>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2f>; + }; + }; + }; + + va-macro@62770000 { + compatible = "qcom,va-macro"; + reg = <0x62770000 0x0>; + clock-names = "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0>; + qcom,va-clk-mux-select = <0x1>; + qcom,va-island-mode-muxsel = <0x627a0000>; + qcom,va-dmic-sample-rate = <0x927c0>; + qcom,default-clk-id = <0x0>; + phandle = <0xb7>; + }; + + wcd938x-codec { + compatible = "qcom,wcd938x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x0 0x13 0x2 0x0 0x13 0x1 0x14 0x1 0x0 0x14 0x1 0x15 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x2 0x18 0x4 0x0 0x18 0x2 0x19 0x8 0x0 0x19 0x3 0x1a 0x1 0x0 0x1a 0x3 0x1b 0x2 0x0 0x1b 0x3 0x1c 0x4 0x0 0x1c 0x3 0x1d 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x21>; + qcom,rx-slave = <0x22>; + qcom,tx-slave = <0x23>; + cdc-vdd-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-rxtx-current = <0x7530>; + cdc-vddio-supply = <0xffffffff>; + qcom,cdc-vddio-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddio-current = <0x7530>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0xaf0>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-micbias4-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-rxtx", "cdc-vddio", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + mbhc-button-thres = <0x24 0xd 0x3f 0x24 0x58 0x8a 0x24 0x8a 0x8a 0x24 0xe1 0xe1 0x24 0x1c2 0x1c2 0x24 0x1c2 0x26c 0x24 0x1c2 0x26c 0x24 0x1c2 0x26c>; + imp-table = <0x25 0x0 0x5 0x6 0x25 0x6 0x17 0x8 0x25 0x18 0x26 0x7 0x25 0x27 0x64 0x6 0x25 0x65 0xa0 0xa 0x25 0xa1 0x190 0xb 0x25 0x191 0x7d0 0xb 0x25 0x7d1 0x7fffffff 0x6>; + phandle = <0x30>; + }; + + wcd937x-codec { + status = "disabled"; + compatible = "qcom,wcd937x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x1 0x13 0x1 0x0 0x14 0x1 0x14 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x3 0x18 0x1 0x0 0x1a 0x3 0x19 0x2 0x0 0x1b 0x3 0x1a 0x4 0x0 0x1c 0x3 0x1b 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x21>; + qcom,rx-slave = <0x26>; + qcom,tx-slave = <0x27>; + cdc-vdd-ldo-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-ldo-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-ldo-rxtx-current = <0x61a8>; + cdc-vddpx-1-supply = <0xffffffff>; + qcom,cdc-vddpx-1-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddpx-1-current = <0x2710>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0x708>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-ldo-rxtx", "cdc-vddpx-1", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + phandle = <0xb8>; + }; + }; + }; + + fragment@29 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,msm-mi2s-master = <0x1 0x1 0x1 0x1 0x1 0x1>; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS4", "MIC BIAS4", "Analog Mic4", "TX DMIC0", "MIC BIAS1", "MIC BIAS1", "Digital Mic0", "TX DMIC1", "MIC BIAS1", "MIC BIAS1", "Digital Mic1", "TX DMIC2", "MIC BIAS3", "MIC BIAS3", "Digital Mic2", "TX DMIC3", "MIC BIAS3", "MIC BIAS3", "Digital Mic3", "TX DMIC4", "MIC BIAS4", "MIC BIAS4", "Digital Mic4", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "IN3_AUX", "AUX_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "TX SWR_DMIC0", "DMIC1_OUTPUT", "TX SWR_DMIC1", "DMIC2_OUTPUT", "TX SWR_DMIC2", "DMIC3_OUTPUT", "TX SWR_DMIC3", "DMIC4_OUTPUT", "TX SWR_DMIC4", "DMIC5_OUTPUT", "TX SWR_DMIC5", "DMIC6_OUTPUT", "TX SWR_DMIC6", "DMIC7_OUTPUT", "TX SWR_DMIC7", "DMIC8_OUTPUT", "WSA SRC0_INP", "SRC0", "WSA_TX DEC0_INP", "TX DEC0 MUX", "WSA_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "SpkrLeft IN", "WSA_SPK1 OUT", "SpkrRight IN", "WSA_SPK2 OUT", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA MIC BIAS1", "Digital Mic0", "VA MIC BIAS1", "Digital Mic1", "VA MIC BIAS3", "Digital Mic2", "VA MIC BIAS3", "Digital Mic3", "VA MIC BIAS4", "Digital Mic4", "VA DMIC0", "VA MIC BIAS1", "VA DMIC1", "VA MIC BIAS1", "VA DMIC2", "VA MIC BIAS3", "VA DMIC3", "VA MIC BIAS3", "VA DMIC4", "VA MIC BIAS4", "VA SWR_ADC0", "VA_SWR_CLK", "VA SWR_ADC1", "VA_SWR_CLK", "VA SWR_ADC2", "VA_SWR_CLK", "VA SWR_ADC3", "VA_SWR_CLK", "VA SWR_MIC0", "VA_SWR_CLK", "VA SWR_MIC1", "VA_SWR_CLK", "VA SWR_MIC2", "VA_SWR_CLK", "VA SWR_MIC3", "VA_SWR_CLK", "VA SWR_MIC4", "VA_SWR_CLK", "VA SWR_MIC5", "VA_SWR_CLK", "VA SWR_MIC6", "VA_SWR_CLK", "VA SWR_MIC7", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT", "VA SWR_MIC0", "DMIC1_OUTPUT", "VA SWR_MIC1", "DMIC2_OUTPUT", "VA SWR_MIC2", "DMIC3_OUTPUT", "VA SWR_MIC3", "DMIC4_OUTPUT", "VA SWR_MIC4", "DMIC5_OUTPUT", "VA SWR_MIC5", "DMIC6_OUTPUT", "VA SWR_MIC6", "DMIC7_OUTPUT", "VA SWR_MIC7", "DMIC8_OUTPUT"; + qcom,msm-mbhc-hphl-swh = <0x1>; + qcom,msm-mbhc-gnd-swh = <0x1>; + qcom,cdc-dmic01-gpios = <0x28>; + qcom,cdc-dmic23-gpios = <0x29>; + qcom,cdc-dmic45-gpios = <0x2a>; + asoc-codec = <0xffffffff 0xffffffff 0x2b>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec", "msm-ext-disp-audio-codec-rx"; + qcom,wsa-max-devs = <0x2>; + qcom,wsa-devs = <0x2c 0x2d 0x2e 0x2f>; + qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight", "SpkrLeft", "SpkrRight"; + qcom,codec-max-aux-devs = <0x1>; + qcom,codec-aux-devs = <0x30>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x31 0xffffffff>; + }; + }; + + fragment@30 { + target = <0xffffffff>; + + __overlay__ { + + cdc_dmic01_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x32 0x33>; + pinctrl-1 = <0x34 0x35>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x28>; + }; + + cdc_dmic23_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x36 0x37>; + pinctrl-1 = <0x38 0x39>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x29>; + }; + + cdc_dmic45_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3a 0x3b>; + pinctrl-1 = <0x3c 0x3d>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2a>; + }; + + wsa_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3e 0x3f>; + pinctrl-1 = <0x40 0x41>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x1e>; + }; + + rx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x42 0x43>; + pinctrl-1 = <0x44 0x45>; + qcom,lpi-gpios; + phandle = <0x1d>; + }; + + tx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x46 0x47 0x48 0x49>; + pinctrl-1 = <0x4a 0x4b 0x4c 0x4d>; + qcom,lpi-gpios; + qcom,chip-wakeup-reg = <0x1ffb000>; + qcom,chip-wakeup-maskbit = <0x0>; + qcom,chip-wakeup-default-val = <0x1>; + phandle = <0x1c>; + }; + }; + }; + + fragment@31 { + target = <0xffffffff>; + + __overlay__ { + + wsa_spkr_en1_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x1f>; + }; + + wsa_spkr_en2_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x20>; + }; + + msm_cdc_pinctrl@58 { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + phandle = <0x21>; + }; + + wsa_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x3>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x309>; + #clock-cells = <0x1>; + phandle = <0x18>; + }; + + wsa_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x4>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30a>; + #clock-cells = <0x1>; + phandle = <0x19>; + }; + + rx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x5>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30e>; + #clock-cells = <0x1>; + phandle = <0x16>; + }; + + rx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x6>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30f>; + #clock-cells = <0x1>; + phandle = <0x17>; + }; + + tx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x7>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30c>; + #clock-cells = <0x1>; + phandle = <0x14>; + }; + + tx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x8>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30d>; + #clock-cells = <0x1>; + phandle = <0x15>; + }; + + va_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x2>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30b>; + #clock-cells = <0x1>; + phandle = <0x1a>; + }; + + va_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0xa>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x310>; + #clock-cells = <0x1>; + phandle = <0x1b>; + }; + }; + }; + + fragment@32 { + target = <0xffffffff>; + + __overlay__ { + qcom,msm-dai-is-island-supported = <0x1>; + }; + }; + + fragment@33 { + target = <0xffffffff>; + + __overlay__ { + hsuart8 = "/soc/qcom,qup_hsuart@a88000"; + }; + }; + + fragment@34 { + target = <0xffffffff>; + + __overlay__ { + + qcom,qup_hsuart@a88000 { + compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; + reg = <0xa88000 0x4000>; + reg-names = "se_phys"; + clock-names = "se-clk", "m-ahb", "s-ahb"; + clocks = <0xffffffff 0x50 0xffffffff 0x5a 0xffffffff 0x5b>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4e 0x4f>; + pinctrl-1 = <0x50 0x51>; + interrupts = <0x0 0x163 0x0>; + qcom,wrapper-core = <0xffffffff>; + always-on-clock; + status = "ok"; + phandle = <0xb9>; + }; + }; + }; + + fragment@35 { + target = <0xffffffff>; + + __overlay__ { + + qupv3_se8_2hsuart_pins { + phandle = <0xba>; + + qupv3_se8_2uart_tx_active { + phandle = <0x4e>; + + mux { + pins = "gpio44"; + function = "qup12"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_rx_active { + phandle = <0x4f>; + + mux { + pins = "gpio45"; + function = "qup12"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_tx_sleep { + phandle = <0x50>; + + mux { + pins = "gpio44"; + function = "gpio"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + input-enable; + }; + }; + + qupv3_se8_2uart_rx_sleep { + phandle = <0x51>; + + mux { + pins = "gpio45"; + function = "gpio"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@36 { + target = <0xffffffff>; + + __overlay__ { + + dcc_curr_link@3 { + qcom,curr-link-list = <0x3>; + qcom,data-sink = "sram"; + qcom,link-list = <0x0 0x18000024 0x1 0x0 0x0 0x18000040 0x1 0x0 0x0 0x18010024 0x1 0x0 0x0 0x18010040 0x1 0x0 0x0 0x18020024 0x1 0x0 0x0 0x18020040 0x1 0x0 0x0 0x18030024 0x1 0x0 0x0 0x18030040 0x1 0x0 0x0 0x18040024 0x1 0x0 0x0 0x18040040 0x1 0x0 0x0 0x18050024 0x1 0x0 0x0 0x18050040 0x1 0x0 0x0 0x18060024 0x1 0x0 0x0 0x18060040 0x1 0x0 0x0 0x18070024 0x1 0x0 0x0 0x18070040 0x1 0x0 0x0 0x18080024 0x1 0x0 0x0 0x18080040 0x1 0x0 0x0 0x180800f8 0x1 0x0 0x0 0x18080104 0x1 0x0 0x0 0x1808011c 0x1 0x0 0x0 0x18080128 0x1 0x0 0x0 0x18321700 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18325f00 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x18321818 0x1 0x0 0x0 0x18323818 0x1 0x0 0x0 0x18326018 0x1 0x0 0x0 0x18321920 0x1 0x0 0x0 0x1832102c 0x1 0x0 0x0 0x18321044 0x1 0x0 0x0 0x18321710 0x1 0x0 0x0 0x1832176c 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18323920 0x1 0x0 0x0 0x1832302c 0x1 0x0 0x0 0x18323044 0x1 0x0 0x0 0x18323710 0x1 0x0 0x0 0x1832376c 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18326120 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18325844 0x1 0x0 0x0 0x18325f10 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280000 0x2 0x0 0x0 0x18282000 0x2 0x0 0x0 0x18284000 0x2 0x0 0x0 0x9680000 0x1 0x0 0x0 0x9680004 0x1 0x0 0x2 0x8 0x0 0x0 0x0 0x9681000 0x1 0x0 0x2 0x1 0x0 0x0 0x0 0x9681004 0x1 0x0 0x0 0x9681008 0x1 0x0 0x0 0x968100c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9698500 0x1 0x0 0x0 0x9698504 0x1 0x0 0x0 0x9698508 0x1 0x0 0x0 0x969850c 0x1 0x0 0x0 0x9698510 0x1 0x0 0x0 0x9698514 0x1 0x0 0x0 0x9698518 0x1 0x0 0x0 0x969851c 0x1 0x0 0x0 0x9698700 0x1 0x0 0x0 0x9698704 0x1 0x0 0x0 0x9698708 0x1 0x0 0x0 0x969870c 0x1 0x0 0x0 0x9698714 0x1 0x0 0x0 0x9698718 0x1 0x0 0x0 0x969871c 0x1 0x0 0x0 0x1620204 0x1 0x0 0x0 0x1620240 0x1 0x0 0x0 0x1620248 0x1 0x0 0x0 0x1620288 0x1 0x0 0x0 0x162028c 0x1 0x0 0x0 0x1620290 0x1 0x0 0x0 0x1620294 0x1 0x0 0x0 0x16202a8 0x1 0x0 0x0 0x16202ac 0x1 0x0 0x0 0x16202b0 0x1 0x0 0x0 0x16202b4 0x1 0x0 0x0 0x1620300 0x1 0x0 0x0 0x16e0404 0x1 0x0 0x0 0x16e0408 0x1 0x0 0x0 0x16e0410 0x1 0x0 0x0 0x16e0420 0x1 0x0 0x0 0x16e0424 0x1 0x0 0x0 0x16e0428 0x1 0x0 0x0 0x16e042c 0x1 0x0 0x0 0x16e0430 0x1 0x0 0x0 0x16e0434 0x1 0x0 0x0 0x16e0438 0x1 0x0 0x0 0x16e043c 0x1 0x0 0x0 0x16e0300 0x1 0x0 0x0 0x16e0304 0x1 0x0 0x0 0x16e0700 0x1 0x0 0x0 0x16e0704 0x1 0x0 0x0 0x1700c00 0x1 0x0 0x0 0x1700c08 0x1 0x0 0x0 0x1700c10 0x1 0x0 0x0 0x1700c20 0x1 0x0 0x0 0x1700c24 0x1 0x0 0x0 0x1700c28 0x1 0x0 0x0 0x1700c2c 0x1 0x0 0x0 0x1700c30 0x1 0x0 0x0 0x1700c34 0x1 0x0 0x0 0x1700c38 0x1 0x0 0x0 0x1700c3c 0x1 0x0 0x0 0x1700300 0x1 0x0 0x0 0x1700304 0x1 0x0 0x0 0x1700308 0x1 0x0 0x0 0x170030c 0x1 0x0 0x0 0x1700310 0x1 0x0 0x0 0x1700500 0x1 0x0 0x0 0x1700504 0x1 0x0 0x0 0x1700508 0x1 0x0 0x0 0x170050c 0x1 0x0 0x0 0x1700900 0x1 0x0 0x0 0x1700904 0x1 0x0 0x0 0x1700908 0x1 0x0 0x0 0x1740004 0x1 0x0 0x0 0x1740008 0x1 0x0 0x0 0x1740010 0x1 0x0 0x0 0x1740020 0x1 0x0 0x0 0x1740024 0x1 0x0 0x0 0x1740028 0x1 0x0 0x0 0x174002c 0x1 0x0 0x0 0x1740030 0x1 0x0 0x0 0x1740034 0x1 0x0 0x0 0x1740038 0x1 0x0 0x0 0x174003c 0x1 0x0 0x0 0x1740300 0x1 0x0 0x0 0x1740304 0x1 0x0 0x0 0x1740308 0x1 0x0 0x0 0x174030c 0x1 0x0 0x0 0x1740310 0x1 0x0 0x0 0x1740314 0x1 0x0 0x0 0x9698204 0x1 0x0 0x0 0x9698240 0x1 0x0 0x0 0x9698244 0x1 0x0 0x0 0x9698248 0x1 0x0 0x0 0x969824c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x9681018 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9160204 0x1 0x0 0x0 0x9160240 0x1 0x0 0x0 0x9160248 0x1 0x0 0x0 0x9160288 0x1 0x0 0x0 0x9160290 0x1 0x0 0x0 0x9160300 0x1 0x0 0x0 0x9160304 0x1 0x0 0x0 0x9160308 0x1 0x0 0x0 0x916030c 0x1 0x0 0x0 0x9160310 0x1 0x0 0x0 0x9160314 0x1 0x0 0x0 0x9160318 0x1 0x0 0x0 0x9160008 0x1 0x0 0x0 0x9160010 0x1 0x0 0x0 0x9160020 0x1 0x0 0x0 0x9160024 0x1 0x0 0x0 0x9160028 0x1 0x0 0x0 0x916002c 0x1 0x0 0x0 0x9160030 0x1 0x0 0x0 0x9160034 0x1 0x0 0x0 0x9160038 0x1 0x0 0x0 0x916003c 0x1 0x0 0x0 0x63042680 0x1 0x0 0x0 0x63042684 0x1 0x0 0x0 0x63042688 0x1 0x0 0x0 0x63042690 0x1 0x0 0x0 0x630426a0 0x1 0x0 0x0 0x630426a4 0x1 0x0 0x0 0x630426a8 0x1 0x0 0x0 0x630426ac 0x1 0x0 0x0 0x630426b0 0x1 0x0 0x0 0x630426b4 0x1 0x0 0x0 0x630426b8 0x1 0x0 0x0 0x630426bc 0x1 0x0 0x0 0x63041900 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x1620500 0x4 0x0 0x0 0x1620700 0x4 0x0 0x0 0x1620300 0x1 0x0 0x0 0x1620f00 0x2 0x0 0x0 0x1620b00 0x2 0x0 0x0 0x1700b00 0x2 0x0 0x0 0x1700700 0x3 0x0 0x0 0x9163100 0x1 0x0 0x0 0x96aa100 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x9991500 0x8 0x0 0x0 0x9050008 0x1 0x0 0x0 0x9050078 0x1 0x0 0x0 0x9236028 0x1 0x0 0x0 0x923602c 0x1 0x0 0x0 0x9236030 0x1 0x0 0x0 0x9236034 0x1 0x0 0x0 0x9236038 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x92360b0 0x1 0x0 0x0 0x9236044 0x1 0x0 0x0 0x9236048 0x1 0x0 0x0 0x923604c 0x1 0x0 0x0 0x9236050 0x1 0x0 0x0 0x923e030 0x1 0x0 0x0 0x923e034 0x1 0x0 0x0 0x9241000 0x1 0x0 0x0 0x9248058 0x1 0x0 0x0 0x924805c 0x1 0x0 0x0 0x9248060 0x1 0x0 0x0 0x9248064 0x1 0x0 0x0 0x9260410 0x1 0x0 0x0 0x92e0410 0x1 0x0 0x0 0x9260414 0x1 0x0 0x0 0x92e0414 0x1 0x0 0x0 0x9260418 0x1 0x0 0x0 0x92e0418 0x1 0x0 0x0 0x9260420 0x1 0x0 0x0 0x9260424 0x1 0x0 0x0 0x9260430 0x1 0x0 0x0 0x9260440 0x1 0x0 0x0 0x9260448 0x1 0x0 0x0 0x92604a0 0x1 0x0 0x0 0x92604b0 0x1 0x0 0x0 0x92604d0 0x2 0x0 0x0 0x9261440 0x1 0x0 0x0 0x92e0420 0x1 0x0 0x0 0x92e0424 0x1 0x0 0x0 0x92e0430 0x1 0x0 0x0 0x92e0440 0x1 0x0 0x0 0x92e0448 0x1 0x0 0x0 0x92e04a0 0x1 0x0 0x0 0x92e04b0 0x1 0x0 0x0 0x92e04d0 0x2 0x0 0x0 0x9600000 0x1 0x0 0x0 0x9601000 0x1 0x0 0x0 0x9602000 0x1 0x0 0x0 0x9603000 0x1 0x0 0x0 0x9604000 0x1 0x0 0x0 0x9605000 0x1 0x0 0x0 0x9606000 0x1 0x0 0x0 0x9607000 0x1 0x0 0x0 0x9608000 0x1 0x0 0x0 0x9609000 0x1 0x0 0x0 0x960a000 0x1 0x0 0x0 0x960b000 0x1 0x0 0x0 0x960c000 0x1 0x0 0x0 0x960d000 0x1 0x0 0x0 0x960e000 0x1 0x0 0x0 0x960f000 0x1 0x0 0x0 0x9610000 0x1 0x0 0x0 0x9611000 0x1 0x0 0x0 0x9612000 0x1 0x0 0x0 0x9613000 0x1 0x0 0x0 0x9614000 0x1 0x0 0x0 0x9615000 0x1 0x0 0x0 0x9616000 0x1 0x0 0x0 0x9617000 0x1 0x0 0x0 0x9618000 0x1 0x0 0x0 0x9619000 0x1 0x0 0x0 0x961a000 0x1 0x0 0x0 0x961b000 0x1 0x0 0x0 0x961c000 0x1 0x0 0x0 0x961d000 0x1 0x0 0x0 0x961e000 0x1 0x0 0x0 0x961f000 0x1 0x0 0x0 0x9600004 0x1 0x0 0x0 0x9601004 0x1 0x0 0x0 0x9602004 0x1 0x0 0x0 0x9603004 0x1 0x0 0x0 0x9604004 0x1 0x0 0x0 0x9605004 0x1 0x0 0x0 0x9606004 0x1 0x0 0x0 0x9607004 0x1 0x0 0x0 0x9608004 0x1 0x0 0x0 0x9609004 0x1 0x0 0x0 0x960a004 0x1 0x0 0x0 0x960b004 0x1 0x0 0x0 0x960c004 0x1 0x0 0x0 0x960d004 0x1 0x0 0x0 0x960e004 0x1 0x0 0x0 0x960f004 0x1 0x0 0x0 0x9610004 0x1 0x0 0x0 0x9611004 0x1 0x0 0x0 0x9612004 0x1 0x0 0x0 0x9613004 0x1 0x0 0x0 0x9614004 0x1 0x0 0x0 0x9615004 0x1 0x0 0x0 0x9616004 0x1 0x0 0x0 0x9617004 0x1 0x0 0x0 0x9618004 0x1 0x0 0x0 0x9619004 0x1 0x0 0x0 0x961a004 0x1 0x0 0x0 0x961b004 0x1 0x0 0x0 0x961c004 0x1 0x0 0x0 0x961d004 0x1 0x0 0x0 0x961e004 0x1 0x0 0x0 0x961f004 0x1 0x0 0x0 0x9266418 0x1 0x0 0x0 0x92e6418 0x1 0x0 0x0 0x9265804 0x1 0x0 0x0 0x92e5804 0x1 0x0 0x0 0x92604b8 0x1 0x0 0x0 0x92e04b8 0x1 0x0 0x0 0xc201244 0x1 0x0 0x0 0xc202244 0x1 0x0 0x0 0x18100c18 0x1 0x0 0x0 0x18101c18 0x1 0x0 0x0 0x18300000 0x1 0x0 0x0 0x183a3a84 0x2 0x0 0x0 0x18393a84 0x1 0x0 0x0 0x100000 0x1 0x0 0x0 0x100004 0x1 0x0 0x0 0x100008 0x1 0x0 0x0 0x10000c 0x1 0x0 0x0 0x100010 0x1 0x0 0x0 0x100014 0x1 0x0 0x0 0x100018 0x1 0x0 0x0 0x10001c 0x1 0x0 0x0 0x100020 0x1 0x0 0x0 0x100024 0x1 0x0 0x0 0x100028 0x1 0x0 0x0 0x10002c 0x1 0x0 0x0 0x100030 0x1 0x0 0x0 0x100034 0x1 0x0 0x0 0x100100 0x1 0x0 0x0 0x100104 0x1 0x0 0x0 0x100108 0x1 0x0 0x0 0x10010c 0x1 0x0 0x0 0x101000 0x1 0x0 0x0 0x101004 0x1 0x0 0x0 0x101008 0x1 0x0 0x0 0x10100c 0x1 0x0 0x0 0x101010 0x1 0x0 0x0 0x101014 0x1 0x0 0x0 0x101018 0x1 0x0 0x0 0x10101c 0x1 0x0 0x0 0x101020 0x1 0x0 0x0 0x101024 0x1 0x0 0x0 0x101028 0x1 0x0 0x0 0x10102c 0x1 0x0 0x0 0x101030 0x1 0x0 0x0 0x101034 0x1 0x0 0x0 0x102000 0x1 0x0 0x0 0x102004 0x1 0x0 0x0 0x102008 0x1 0x0 0x0 0x10200c 0x1 0x0 0x0 0x102010 0x1 0x0 0x0 0x102014 0x1 0x0 0x0 0x102018 0x1 0x0 0x0 0x10201c 0x1 0x0 0x0 0x102020 0x1 0x0 0x0 0x102024 0x1 0x0 0x0 0x102028 0x1 0x0 0x0 0x10202c 0x1 0x0 0x0 0x102030 0x1 0x0 0x0 0x102034 0x1 0x0 0x0 0x103000 0x1 0x0 0x0 0x103004 0x1 0x0 0x0 0x103008 0x1 0x0 0x0 0x10300c 0x1 0x0 0x0 0x103010 0x1 0x0 0x0 0x103014 0x1 0x0 0x0 0x103018 0x1 0x0 0x0 0x10301c 0x1 0x0 0x0 0x103020 0x1 0x0 0x0 0x103024 0x1 0x0 0x0 0x103028 0x1 0x0 0x0 0x10302c 0x1 0x0 0x0 0x103030 0x1 0x0 0x0 0x103034 0x1 0x0 0x0 0x113000 0x1 0x0 0x0 0x113004 0x1 0x0 0x0 0x113008 0x1 0x0 0x0 0x11300c 0x1 0x0 0x0 0x113010 0x1 0x0 0x0 0x113014 0x1 0x0 0x0 0x113018 0x1 0x0 0x0 0x11301c 0x1 0x0 0x0 0x113020 0x1 0x0 0x0 0x113024 0x1 0x0 0x0 0x113028 0x1 0x0 0x0 0x11302c 0x1 0x0 0x0 0x113030 0x1 0x0 0x0 0x113034 0x1 0x0 0x0 0x11a000 0x1 0x0 0x0 0x11a004 0x1 0x0 0x0 0x11a008 0x1 0x0 0x0 0x11a00c 0x1 0x0 0x0 0x11a010 0x1 0x0 0x0 0x11a014 0x1 0x0 0x0 0x11a018 0x1 0x0 0x0 0x11a01c 0x1 0x0 0x0 0x11a020 0x1 0x0 0x0 0x11a024 0x1 0x0 0x0 0x11a028 0x1 0x0 0x0 0x11a02c 0x1 0x0 0x0 0x11a030 0x1 0x0 0x0 0x11a034 0x1 0x0 0x0 0x11b000 0x1 0x0 0x0 0x11b004 0x1 0x0 0x0 0x11b008 0x1 0x0 0x0 0x11b00c 0x1 0x0 0x0 0x11b010 0x1 0x0 0x0 0x11b014 0x1 0x0 0x0 0x11b018 0x1 0x0 0x0 0x11b01c 0x1 0x0 0x0 0x11b020 0x1 0x0 0x0 0x11b024 0x1 0x0 0x0 0x11b028 0x1 0x0 0x0 0x11b02c 0x1 0x0 0x0 0x11b030 0x1 0x0 0x0 0x11b034 0x1 0x0 0x0 0x174000 0x1 0x0 0x0 0x174004 0x1 0x0 0x0 0x174008 0x1 0x0 0x0 0x17400c 0x1 0x0 0x0 0x174010 0x1 0x0 0x0 0x174014 0x1 0x0 0x0 0x174018 0x1 0x0 0x0 0x17401c 0x1 0x0 0x0 0x174020 0x1 0x0 0x0 0x174024 0x1 0x0 0x0 0x174028 0x1 0x0 0x0 0x17402c 0x1 0x0 0x0 0x174030 0x1 0x0 0x0 0x174034 0x1 0x0 0x0 0x176000 0x1 0x0 0x0 0x176004 0x1 0x0 0x0 0x176008 0x1 0x0 0x0 0x17600c 0x1 0x0 0x0 0x176010 0x1 0x0 0x0 0x176014 0x1 0x0 0x0 0x176018 0x1 0x0 0x0 0x17601c 0x1 0x0 0x0 0x176020 0x1 0x0 0x0 0x176024 0x1 0x0 0x0 0x176028 0x1 0x0 0x0 0x17602c 0x1 0x0 0x0 0x176030 0x1 0x0 0x0 0x176034 0x1 0x0 0x0 0x10401c 0x1 0x0 0x0 0x183024 0x1 0x0 0x0 0x144168 0x1 0x0 0x0 0x11702c 0x1 0x0 0x0 0x10904c 0x1 0x0 0x0 0x189038 0x1 0x0 0x0 0x1443e8 0x1 0x0 0x0 0x1442b8 0x1 0x0 0x0 0x105060 0x1 0x0 0x0 0x141024 0x1 0x0 0x0 0x145038 0x1 0x0 0x0 0x109004 0x1 0x0 0x0 0x189004 0x1 0x0 0x0 0x190004 0x1 0x0 0x0 0xc2a0000 0x1 0x0 0x0 0xc2a0004 0x1 0x0 0x0 0xc2a0008 0x1 0x0 0x0 0xc2a000c 0x1 0x0 0x0 0xc2a0010 0x1 0x0 0x0 0xc2a0014 0x1 0x0 0x0 0xc2a0018 0x1 0x0 0x0 0xc2a001c 0x1 0x0 0x0 0xc2a0020 0x1 0x0 0x0 0xc2a0024 0x1 0x0 0x0 0xc2a0028 0x1 0x0 0x0 0xc2a002c 0x1 0x0 0x0 0xc2a0030 0x1 0x0 0x0 0xc2a0034 0x1 0x0 0x0 0xc2a1000 0x1 0x0 0x0 0xc2a1004 0x1 0x0 0x0 0xc2a1008 0x1 0x0 0x0 0xc2a100c 0x1 0x0 0x0 0xc2a1010 0x1 0x0 0x0 0xc2a1014 0x1 0x0 0x0 0xc2a1018 0x1 0x0 0x0 0xc2a101c 0x1 0x0 0x0 0xc2a1020 0x1 0x0 0x0 0xc2a1024 0x1 0x0 0x0 0xc2a1028 0x1 0x0 0x0 0xc2a102c 0x1 0x0 0x0 0xc2a1030 0x1 0x0 0x0 0xc2a2260 0x1 0x0 0x0 0xc2a2264 0x1 0x0 0x0 0xc2a3008 0x1 0x0 0x0 0xc2a300c 0x1 0x0 0x0 0xc2a3010 0x1 0x0 0x0 0xc2a3014 0x1 0x0 0x0 0xc2a3024 0x1 0x0 0x0 0xc2a2034 0x1 0x0 0x0 0xc2a214c 0x1 0x0 0x0 0xc2a2150 0x1 0x0 0x0 0xc2a2154 0x1 0x0 0x0 0x28206c 0x1 0x0 0x0 0x18282004 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x1808012c 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280004 0x1 0x0 0x0 0x18284038 0x1 0x0 0x0 0x18284000 0x2 0x0 0x0 0x90c012c 0x1 0x0 0x0 0x9222408 0x1 0x0 0x0 0x9220344 0x2 0x0 0x0 0x9220480 0x1 0x0 0x0 0x922358c 0x1 0x0 0x0 0x9222398 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x923201c 0x5 0x0 0x0 0x9232050 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x9186048 0x1 0x0 0x0 0x9186054 0x1 0x0 0x0 0x9186164 0x1 0x0 0x0 0x9186170 0x1 0x0 0x0 0xc2630a0 0x4 0x0 0x0 0xc2630b0 0x4 0x0 0x0 0xc2630c0 0x4 0x0 0x0 0xc2630d0 0x4 0x0 0x0 0x18200400 0x1 0x0 0x0 0x18200404 0x1 0x0 0x0 0x18200408 0x1 0x0 0x0 0x18200038 0x1 0x0 0x0 0x18200040 0x1 0x0 0x0 0x18200048 0x1 0x0 0x0 0x18220038 0x1 0x0 0x0 0x18220040 0x1 0x0 0x0 0x182200d0 0x1 0x0 0x0 0x18200030 0x1 0x0 0x0 0x18200010 0x1 0x0 0x0 0x1822000c 0x1 0x0 0x0 0x18220d14 0x1 0x0 0x0 0x18220fb4 0x1 0x0 0x0 0x18221254 0x1 0x0 0x0 0x182214f4 0x1 0x0 0x0 0x18221794 0x1 0x0 0x0 0x18221a34 0x1 0x0 0x0 0x18221cd4 0x1 0x0 0x0 0x18221f74 0x1 0x0 0x0 0x18220d18 0x1 0x0 0x0 0x18220fb8 0x1 0x0 0x0 0x18221258 0x1 0x0 0x0 0x182214f8 0x1 0x0 0x0 0x18221798 0x1 0x0 0x0 0x18221a38 0x1 0x0 0x0 0x18221cd8 0x1 0x0 0x0 0x18221f78 0x1 0x0 0x0 0x18220d00 0x1 0x0 0x0 0x18220d04 0x1 0x0 0x0 0x18220d1c 0x1 0x0 0x0 0x18220fbc 0x1 0x0 0x0 0x1822125c 0x1 0x0 0x0 0x182214fc 0x1 0x0 0x0 0x1822179c 0x1 0x0 0x0 0x18221a3c 0x1 0x0 0x0 0x18221cdc 0x1 0x0 0x0 0x18221f7c 0x1 0x0 0x0 0x18221274 0x1 0x0 0x0 0x18221288 0x1 0x0 0x0 0x1822129c 0x1 0x0 0x0 0x182212b0 0x1 0x0 0x0 0x182212c4 0x1 0x0 0x0 0x182212d8 0x1 0x0 0x0 0x182212ec 0x1 0x0 0x0 0x18221300 0x1 0x0 0x0 0x18221314 0x1 0x0 0x0 0x18221328 0x1 0x0 0x0 0x1822133c 0x1 0x0 0x0 0x18221350 0x1 0x0 0x0 0x18221364 0x1 0x0 0x0 0x18221378 0x1 0x0 0x0 0x1822138c 0x1 0x0 0x0 0x182213a0 0x1 0x0 0x0 0x18221514 0x1 0x0 0x0 0x18221528 0x1 0x0 0x0 0x1822153c 0x1 0x0 0x0 0x18221550 0x1 0x0 0x0 0x18221564 0x1 0x0 0x0 0x18221578 0x1 0x0 0x0 0x1822158c 0x1 0x0 0x0 0x182215a0 0x1 0x0 0x0 0x182215b4 0x1 0x0 0x0 0x182215c8 0x1 0x0 0x0 0x182215dc 0x1 0x0 0x0 0x182215f0 0x1 0x0 0x0 0x18221604 0x1 0x0 0x0 0x18221618 0x1 0x0 0x0 0x1822162c 0x1 0x0 0x0 0x18221640 0x1 0x0 0x0 0x182217b4 0x1 0x0 0x0 0x182217c8 0x1 0x0 0x0 0x182217dc 0x1 0x0 0x0 0x182217f0 0x1 0x0 0x0 0x18221804 0x1 0x0 0x0 0x18221818 0x1 0x0 0x0 0x1822182c 0x1 0x0 0x0 0x18221840 0x1 0x0 0x0 0x18221854 0x1 0x0 0x0 0x18221868 0x1 0x0 0x0 0x1822187c 0x1 0x0 0x0 0x18221890 0x1 0x0 0x0 0x182218a4 0x1 0x0 0x0 0x182218b8 0x1 0x0 0x0 0x182218cc 0x1 0x0 0x0 0x182218e0 0x1 0x0 0x0 0x18221a54 0x1 0x0 0x0 0x18221a68 0x1 0x0 0x0 0x18221a7c 0x1 0x0 0x0 0x18221a90 0x1 0x0 0x0 0x18221aa4 0x1 0x0 0x0 0x18221ab8 0x1 0x0 0x0 0x18221acc 0x1 0x0 0x0 0x18221ae0 0x1 0x0 0x0 0x18221af4 0x1 0x0 0x0 0x18221b08 0x1 0x0 0x0 0x18221b1c 0x1 0x0 0x0 0x18221b30 0x1 0x0 0x0 0x18221b44 0x1 0x0 0x0 0x18221b58 0x1 0x0 0x0 0x18221b6c 0x1 0x0 0x0 0x18221b80 0x1 0x0 0x0 0x18221cf4 0x1 0x0 0x0 0x18221d08 0x1 0x0 0x0 0x18221d1c 0x1 0x0 0x0 0x18221d30 0x1 0x0 0x0 0x18221d44 0x1 0x0 0x0 0x18221d58 0x1 0x0 0x0 0x18221d6c 0x1 0x0 0x0 0x18221d80 0x1 0x0 0x0 0x18221d94 0x1 0x0 0x0 0x18221da8 0x1 0x0 0x0 0x18221dbc 0x1 0x0 0x0 0x18221dd0 0x1 0x0 0x0 0x18221de4 0x1 0x0 0x0 0x18221df8 0x1 0x0 0x0 0x18221e0c 0x1 0x0 0x0 0x18221e20 0x1 0x0 0x0 0x18221f94 0x1 0x0 0x0 0x18221fa8 0x1 0x0 0x0 0x18221fbc 0x1 0x0 0x0 0x18221fd0 0x1 0x0 0x0 0x18221fe4 0x1 0x0 0x0 0x18221ff8 0x1 0x0 0x0 0x1822200c 0x1 0x0 0x0 0x18222020 0x1 0x0 0x0 0x18222034 0x1 0x0 0x0 0x18222048 0x1 0x0 0x0 0x1822205c 0x1 0x0 0x0 0x18222070 0x1 0x0 0x0 0x18222084 0x1 0x0 0x0 0x18222098 0x1 0x0 0x0 0x182220ac 0x1 0x0 0x0 0x182220c0 0x1 0x0 0x0 0x18221278 0x1 0x0 0x0 0x1822128c 0x1 0x0 0x0 0x182212a0 0x1 0x0 0x0 0x182212b4 0x1 0x0 0x0 0x182212c8 0x1 0x0 0x0 0x182212dc 0x1 0x0 0x0 0x182212f0 0x1 0x0 0x0 0x18221304 0x1 0x0 0x0 0x18221318 0x1 0x0 0x0 0x1822132c 0x1 0x0 0x0 0x18221340 0x1 0x0 0x0 0x18221354 0x1 0x0 0x0 0x18221368 0x1 0x0 0x0 0x1822137c 0x1 0x0 0x0 0x18221390 0x1 0x0 0x0 0x182213a4 0x1 0x0 0x0 0x18221518 0x1 0x0 0x0 0x1822152c 0x1 0x0 0x0 0x18221540 0x1 0x0 0x0 0x18221554 0x1 0x0 0x0 0x18221568 0x1 0x0 0x0 0x1822157c 0x1 0x0 0x0 0x18221590 0x1 0x0 0x0 0x182215a4 0x1 0x0 0x0 0x182215b8 0x1 0x0 0x0 0x182215cc 0x1 0x0 0x0 0x182215e0 0x1 0x0 0x0 0x182215f4 0x1 0x0 0x0 0x18221608 0x1 0x0 0x0 0x1822161c 0x1 0x0 0x0 0x18221630 0x1 0x0 0x0 0x18221644 0x1 0x0 0x0 0x182217b8 0x1 0x0 0x0 0x182217cc 0x1 0x0 0x0 0x182217e0 0x1 0x0 0x0 0x182217f4 0x1 0x0 0x0 0x18221808 0x1 0x0 0x0 0x1822181c 0x1 0x0 0x0 0x18221830 0x1 0x0 0x0 0x18221844 0x1 0x0 0x0 0x18221858 0x1 0x0 0x0 0x1822186c 0x1 0x0 0x0 0x18221880 0x1 0x0 0x0 0x18221894 0x1 0x0 0x0 0x182218a8 0x1 0x0 0x0 0x182218bc 0x1 0x0 0x0 0x182218d0 0x1 0x0 0x0 0x182218e4 0x1 0x0 0x0 0x18221a58 0x1 0x0 0x0 0x18221a6c 0x1 0x0 0x0 0x18221a80 0x1 0x0 0x0 0x18221a94 0x1 0x0 0x0 0x18221aa8 0x1 0x0 0x0 0x18221abc 0x1 0x0 0x0 0x18221ad0 0x1 0x0 0x0 0x18221ae4 0x1 0x0 0x0 0x18221af8 0x1 0x0 0x0 0x18221b0c 0x1 0x0 0x0 0x18221b20 0x1 0x0 0x0 0x18221b34 0x1 0x0 0x0 0x18221b48 0x1 0x0 0x0 0x18221b5c 0x1 0x0 0x0 0x18221b70 0x1 0x0 0x0 0x18221b84 0x1 0x0 0x0 0x18221cf8 0x1 0x0 0x0 0x18221d0c 0x1 0x0 0x0 0x18221d20 0x1 0x0 0x0 0x18221d34 0x1 0x0 0x0 0x18221d48 0x1 0x0 0x0 0x18221d5c 0x1 0x0 0x0 0x18221d70 0x1 0x0 0x0 0x18221d84 0x1 0x0 0x0 0x18221d98 0x1 0x0 0x0 0x18221dac 0x1 0x0 0x0 0x18221dc0 0x1 0x0 0x0 0x18221dd4 0x1 0x0 0x0 0x18221de8 0x1 0x0 0x0 0x18221dfc 0x1 0x0 0x0 0x18221e10 0x1 0x0 0x0 0x18221e24 0x1 0x0 0x0 0x18221f98 0x1 0x0 0x0 0x18221fac 0x1 0x0 0x0 0x18221fc0 0x1 0x0 0x0 0x18221fd4 0x1 0x0 0x0 0x18221fe8 0x1 0x0 0x0 0x18221ffc 0x1 0x0 0x0 0x18222010 0x1 0x0 0x0 0x18222024 0x1 0x0 0x0 0x18222038 0x1 0x0 0x0 0x1822204c 0x1 0x0 0x0 0x18222060 0x1 0x0 0x0 0x18222074 0x1 0x0 0x0 0x18222088 0x1 0x0 0x0 0x1822209c 0x1 0x0 0x0 0x182220b0 0x1 0x0 0x0 0x182220c4 0x1 0x0 0x0 0x105050 0x1 0x0 0x0 0x171004 0x1 0x0 0x0 0x171154 0x1 0x0 0x0 0x17100c 0x1 0x0 0x0 0x171018 0x1 0x0 0x0 0x5091004 0x1 0x0 0x0 0x509100c 0x1 0x0 0x0 0x5091010 0x1 0x0 0x0 0x5091014 0x1 0x0 0x0 0x5091054 0x1 0x0 0x0 0x5091060 0x1 0x0 0x0 0x509106c 0x1 0x0 0x0 0x5091070 0x1 0x0 0x0 0x5091074 0x1 0x0 0x0 0x5091078 0x1 0x0 0x0 0x509107c 0x1 0x0 0x0 0x509108c 0x1 0x0 0x0 0x5091098 0x1 0x0 0x0 0x509109c 0x1 0x0 0x0 0x1800005c 0x1 0x0 0x0 0x1801005c 0x1 0x0 0x0 0x1802005c 0x1 0x0 0x0 0x1803005c 0x1 0x0 0x0 0x1804005c 0x1 0x0 0x0 0x1805005c 0x1 0x0 0x0 0x1806005c 0x1 0x0 0x0 0x1807005c 0x1 0x0 0x0 0x17c0003c 0x1 0x0 0x1 0x6004fb0 0xc5acce55 0x0 0x1 0x600408c 0xff 0x0 0x1 0x6004fb0 0x0 0x0 0x0 0x62900010 0x1 0x0 0x0 0x62900014 0x1 0x0 0x0 0x62900018 0x1 0x0 0x0 0x62900030 0x1 0x0 0x0 0x62900038 0x1 0x0 0x0 0x62900040 0x1 0x0 0x0 0x62900048 0x1 0x0 0x0 0x629000d0 0x1 0x0 0x0 0x62900210 0x1 0x0 0x0 0x62900230 0x1 0x0 0x0 0x62900250 0x1 0x0 0x0 0x62900270 0x1 0x0 0x0 0x62900290 0x1 0x0 0x0 0x629002b0 0x1 0x0 0x0 0x62900208 0x1 0x0 0x0 0x62900228 0x1 0x0 0x0 0x62900248 0x1 0x0 0x0 0x62900268 0x1 0x0 0x0 0x62900288 0x1 0x0 0x0 0x629002a8 0x1 0x0 0x0 0x6290020c 0x1 0x0 0x0 0x6290022c 0x1 0x0 0x0 0x6290024c 0x1 0x0 0x0 0x6290026c 0x1 0x0 0x0 0x6290028c 0x1 0x0 0x0 0x629002ac 0x1 0x0 0x0 0x62900404 0x1 0x0 0x0 0x62900408 0x1 0x0 0x0 0x62900400 0x1 0x0 0x0 0x62900d04 0x1 0x0 0x0 0x624b0010 0x1 0x0 0x0 0x624b0014 0x1 0x0 0x0 0x624b0018 0x1 0x0 0x0 0x624b0210 0x1 0x0 0x0 0x624b0230 0x1 0x0 0x0 0x624b0250 0x1 0x0 0x0 0x624b0270 0x1 0x0 0x0 0x624b0290 0x1 0x0 0x0 0x624b02b0 0x1 0x0 0x0 0x624b0208 0x1 0x0 0x0 0x624b0228 0x1 0x0 0x0 0x624b0248 0x1 0x0 0x0 0x624b0268 0x1 0x0 0x0 0x624b0288 0x1 0x0 0x0 0x624b02a8 0x1 0x0 0x0 0x624b020c 0x1 0x0 0x0 0x624b022c 0x1 0x0 0x0 0x624b024c 0x1 0x0 0x0 0x624b026c 0x1 0x0 0x0 0x624b028c 0x1 0x0 0x0 0x624b02ac 0x1 0x0 0x0 0x624b0400 0x1 0x0 0x0 0x624b0404 0x1 0x0 0x0 0x624b0408 0x1 0x0 0x0 0x62402028 0x1 0x0 0x0 0xb254520 0x1 0x0 0x0 0xb251020 0x1 0x0 0x0 0xb251024 0x1 0x0 0x0 0xb251030 0x1 0x0 0x0 0xb251200 0x1 0x0 0x0 0xb251214 0x1 0x0 0x0 0xb251228 0x1 0x0 0x0 0xb25123c 0x1 0x0 0x0 0xb251250 0x1 0x0 0x0 0xb251204 0x1 0x0 0x0 0xb251218 0x1 0x0 0x0 0xb25122c 0x1 0x0 0x0 0xb251240 0x1 0x0 0x0 0xb251254 0x1 0x0 0x0 0xb251208 0x1 0x0 0x0 0xb25121c 0x1 0x0 0x0 0xb251230 0x1 0x0 0x0 0xb251244 0x1 0x0 0x0 0xb251258 0x1 0x0 0x0 0xb254510 0x1 0x0 0x0 0xb254514 0x1 0x0 0x0 0xb250010 0x1 0x0 0x0 0xb250014 0x1 0x0 0x0 0xb250900 0x1 0x0 0x0 0xb250904 0x1 0x0 0x0 0x4200010 0x1 0x0 0x0 0x4200014 0x1 0x0 0x0 0x4200018 0x1 0x0 0x0 0x4200030 0x1 0x0 0x0 0x4200038 0x1 0x0 0x0 0x4200040 0x1 0x0 0x0 0x4200048 0x1 0x0 0x0 0x42000d0 0x1 0x0 0x0 0x4200210 0x1 0x0 0x0 0x4200230 0x1 0x0 0x0 0x4200250 0x1 0x0 0x0 0x4200270 0x1 0x0 0x0 0x4200290 0x1 0x0 0x0 0x42002b0 0x1 0x0 0x0 0x4200208 0x1 0x0 0x0 0x4200228 0x1 0x0 0x0 0x4200248 0x1 0x0 0x0 0x4200268 0x1 0x0 0x0 0x4200288 0x1 0x0 0x0 0x42002a8 0x1 0x0 0x0 0x420020c 0x1 0x0 0x0 0x420022c 0x1 0x0 0x0 0x420024c 0x1 0x0 0x0 0x420026c 0x1 0x0 0x0 0x420028c 0x1 0x0 0x0 0x42002ac 0x1 0x0 0x0 0x4200404 0x1 0x0 0x0 0x4200408 0x1 0x0 0x0 0x4200400 0x1 0x0 0x0 0x4200d04 0x1 0x0 0x0 0x4130010 0x1 0x0 0x0 0x4130014 0x1 0x0 0x0 0x4130018 0x1 0x0 0x0 0x4130210 0x1 0x0 0x0 0x4130230 0x1 0x0 0x0 0x4130250 0x1 0x0 0x0 0x4130270 0x1 0x0 0x0 0x4130290 0x1 0x0 0x0 0x41302b0 0x1 0x0 0x0 0x4130208 0x1 0x0 0x0 0x4130228 0x1 0x0 0x0 0x4130248 0x1 0x0 0x0 0x4130268 0x1 0x0 0x0 0x4130288 0x1 0x0 0x0 0x41302a8 0x1 0x0 0x0 0x413020c 0x1 0x0 0x0 0x413022c 0x1 0x0 0x0 0x413024c 0x1 0x0 0x0 0x413026c 0x1 0x0 0x0 0x413028c 0x1 0x0 0x0 0x41302ac 0x1 0x0 0x0 0x4130400 0x1 0x0 0x0 0x4130404 0x1 0x0 0x0 0x4130408 0x1 0x0 0x0 0x4082028 0x1 0x0 0x0 0x18a008 0x1 0x0 0x0 0xb2c4520 0x1 0x0 0x0 0xb2c1020 0x1 0x0 0x0 0xb2c1024 0x1 0x0 0x0 0xb2c1030 0x1 0x0 0x0 0xb2c1200 0x1 0x0 0x0 0xb2c1214 0x1 0x0 0x0 0xb2c1228 0x1 0x0 0x0 0xb2c123c 0x1 0x0 0x0 0xb2c1250 0x1 0x0 0x0 0xb2c1204 0x1 0x0 0x0 0xb2c1218 0x1 0x0 0x0 0xb2c122c 0x1 0x0 0x0 0xb2c1240 0x1 0x0 0x0 0xb2c1254 0x1 0x0 0x0 0xb2c1208 0x1 0x0 0x0 0xb2c121c 0x1 0x0 0x0 0xb2c1230 0x1 0x0 0x0 0xb2c1244 0x1 0x0 0x0 0xb2c1258 0x1 0x0 0x0 0xb2c4510 0x1 0x0 0x0 0xb2c4514 0x1 0x0 0x0 0xb2c0010 0x1 0x0 0x0 0xb2c0014 0x1 0x0 0x0 0xb2c0900 0x1 0x0 0x0 0xb2c0904 0x1 0x0 0x0 0x80a4010 0x1 0x0 0x0 0x80a4014 0x1 0x0 0x0 0x80a4018 0x1 0x0 0x0 0x80a4030 0x1 0x0 0x0 0x80a4038 0x1 0x0 0x0 0x80a4040 0x1 0x0 0x0 0x80a4048 0x1 0x0 0x0 0x80a40d0 0x1 0x0 0x0 0x80a4210 0x1 0x0 0x0 0x80a4230 0x1 0x0 0x0 0x80a4250 0x1 0x0 0x0 0x80a4270 0x1 0x0 0x0 0x80a4290 0x1 0x0 0x0 0x80a42b0 0x1 0x0 0x0 0x80a4208 0x1 0x0 0x0 0x80a4228 0x1 0x0 0x0 0x80a4248 0x1 0x0 0x0 0x80a4268 0x1 0x0 0x0 0x80a4288 0x1 0x0 0x0 0x80a42a8 0x1 0x0 0x0 0x80a420c 0x1 0x0 0x0 0x80a422c 0x1 0x0 0x0 0x80a424c 0x1 0x0 0x0 0x80a426c 0x1 0x0 0x0 0x80a428c 0x1 0x0 0x0 0x80a42ac 0x1 0x0 0x0 0x80a4404 0x1 0x0 0x0 0x80a4408 0x1 0x0 0x0 0x80a4400 0x1 0x0 0x0 0x80a4d04 0x1 0x0 0x0 0x83b0010 0x1 0x0 0x0 0x83b0014 0x1 0x0 0x0 0x83b0018 0x1 0x0 0x0 0x83b0210 0x1 0x0 0x0 0x83b0230 0x1 0x0 0x0 0x83b0250 0x1 0x0 0x0 0x83b0270 0x1 0x0 0x0 0x83b0290 0x1 0x0 0x0 0x83b02b0 0x1 0x0 0x0 0x83b0208 0x1 0x0 0x0 0x83b0228 0x1 0x0 0x0 0x83b0248 0x1 0x0 0x0 0x83b0268 0x1 0x0 0x0 0x83b0288 0x1 0x0 0x0 0x83b02a8 0x1 0x0 0x0 0x83b020c 0x1 0x0 0x0 0x83b022c 0x1 0x0 0x0 0x83b024c 0x1 0x0 0x0 0x83b026c 0x1 0x0 0x0 0x83b028c 0x1 0x0 0x0 0x83b02ac 0x1 0x0 0x0 0x83b0400 0x1 0x0 0x0 0x83b0404 0x1 0x0 0x0 0x83b0408 0x1 0x0 0x0 0x8302028 0x1 0x0 0x0 0xb2b4520 0x1 0x0 0x0 0xb2b1020 0x1 0x0 0x0 0xb2b1024 0x1 0x0 0x0 0xb2b1030 0x1 0x0 0x0 0xb2b1200 0x1 0x0 0x0 0xb2b1214 0x1 0x0 0x0 0xb2b1228 0x1 0x0 0x0 0xb2b123c 0x1 0x0 0x0 0xb2b1250 0x1 0x0 0x0 0xb2b1204 0x1 0x0 0x0 0xb2b1218 0x1 0x0 0x0 0xb2b122c 0x1 0x0 0x0 0xb2b1240 0x1 0x0 0x0 0xb2b1254 0x1 0x0 0x0 0xb2b1208 0x1 0x0 0x0 0xb2b121c 0x1 0x0 0x0 0xb2b1230 0x1 0x0 0x0 0xb2b1244 0x1 0x0 0x0 0xb2b1258 0x1 0x0 0x0 0xb2b4510 0x1 0x0 0x0 0xb2b4514 0x1 0x0 0x0 0xb2b0010 0x1 0x0 0x0 0xb2b0014 0x1 0x0 0x0 0xb2b0900 0x1 0x0 0x0 0xb2b0904 0x1 0x0 0x0 0x17a00204 0x1d 0x0>; + }; + }; + }; + + fragment@37 { + target = <0xffffffff>; + + __overlay__ { + + ss_plog@B4400000 { + compatible = "ss_plog"; + no-map; + reg = <0x0 0xb4400000 0x0 0x200000>; + }; + + ramoops@B4600000 { + compatible = "ramoops"; + reg = <0x0 0xb4600000 0x0 0x100000>; + record-size = <0x40000>; + console-size = <0x40000>; + ftrace-size = <0x40000>; + pmsg-size = <0x40000>; + }; + + sec_debug_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4700000 0x0 0x800000>; + phandle = <0xbb>; + }; + + sec_debug_autocomment@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4f00000 0x0 0x1000>; + phandle = <0xbc>; + }; + + sec_debug_rdx_bootdev@0 { + no-ship; + reg = <0x1 0x0 0x0 0x5900000>; + phandle = <0xbd>; + }; + + kaslr_region@A0001000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xa0001000 0x0 0x1000>; + phandle = <0xbe>; + }; + + rkp_region@B0200000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xb0200000 0x0 0x200000>; + phandle = <0xbf>; + }; + + hdm_region@A1000000 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xa1000000 0x0 0x1000>; + phandle = <0x53>; + }; + + modem_shared_mem_region@B5000000 { + compatible = "modem-removed-dma-pool"; + no-map; + reg = <0x0 0xb5000000 0x0 0x6000000>; + phandle = <0x52>; + }; + }; + }; + + fragment@38 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x80b00000 0x0 0x7100000>; + }; + }; + + fragment@39 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x8b000000 0x0 0x8900000>; + }; + }; + + fragment@40 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x93c00000 0x0 0x3e00000>; + }; + }; + + fragment@41 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97a00000 0x0 0x500000>; + }; + }; + + fragment@42 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97f00000 0x0 0x500000>; + }; + }; + + fragment@43 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98400000 0x0 0x500000>; + }; + }; + + fragment@44 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98900000 0x0 0x1e00000>; + }; + }; + + fragment@45 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9e000000 0x0 0x2000000>; + }; + }; + + fragment@46 { + target = <0xffffffff>; + + __overlay__ { + size = <0x0 0x2000000>; + }; + }; + + fragment@47 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@48 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@49 { + target = <0xffffffff>; + + __overlay__ { + + upload_cause@66c { + compatible = "qcom,msm-imem-upload_cause"; + reg = <0x66c 0x4>; + }; + }; + }; + + fragment@50 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@51 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@52 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@53 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@54 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@55 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@56 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@57 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@58 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@59 { + target = <0xffffffff>; + + __overlay__ { + + dwc3@a600000 { + maximum-speed = "high-speed"; + }; + }; + }; + + fragment@60 { + target = <0xffffffff>; + + __overlay__ { + + input_booster { + status = "okay"; + compatible = "input_booster"; + #address-cells = <0x1>; + #size-cells = <0x0>; + + booster_key@1 { + input_booster,label = "KEY"; + input_booster,type = <0x0>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0xc8>; + input_booster,tail_times = <0x0>; + }; + + booster_key@2 { + input_booster,label = "TOUCHKEY"; + input_booster,type = <0x1>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x0>; + input_booster,tail_times = <0x12c>; + }; + + booster_key@3 { + input_booster,label = "TOUCH"; + input_booster,type = <0x2>; + input_booster,levels = <0x1 0x2 0x3>; + input_booster,cpu_freqs = <0x135600 0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2 0x2>; + input_booster,ddr_freqs = <0x3f9 0x3f9 0x3f9>; + input_booster,lpm_bias = <0x5 0x5 0x5>; + input_booster,head_times = <0xc8 0xc8 0x0>; + input_booster,tail_times = <0x0 0x0 0x12c>; + }; + + booster_key@4 { + input_booster,label = "MULTITOUCH"; + input_booster,type = <0x3>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x3e8 0x0>; + input_booster,tail_times = <0x0 0x1f4>; + }; + + booster_key@5 { + input_booster,label = "KEYBOARD"; + input_booster,type = <0x4>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x135600>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x82 0x82>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@6 { + input_booster,label = "MOUSE"; + input_booster,type = <0x5>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@7 { + input_booster,label = "MOUSE WHEEL"; + input_booster,type = <0x6>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@8 { + input_booster,label = "PEN HOVER"; + input_booster,type = <0x7>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@9 { + input_booster,label = "PEN"; + input_booster,type = <0x8>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x17bb00 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x258>; + }; + + booster_key@10 { + input_booster,label = "KEY_TWO"; + input_booster,type = <0x9>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x17bb00>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x2bc>; + input_booster,tail_times = <0x2bc>; + }; + }; + + sec_smem@0 { + compatible = "samsung,sec-smem"; + status = "okay"; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_4 { + compatible = "qcom,memshare-peripheral"; + memory-region = <0x52>; + qcom,peripheral-size = <0x2000000>; + qcom,reserved-size = <0x4000000>; + qcom,client-id = <0x3>; + qcom,allocate-boot-time; + label = "modem"; + }; + }; + + samsung,sec_misc { + qfprom_jtag,reg = <0x780180>; + }; + + usb-notifier { + compatible = "samsung,usb-notifier"; + qcom,disable_control_en = <0x1>; + qcom,unsupport_host_en = <0x0>; + phandle = <0xc0>; + }; + + samsung,sec_hdm { + memory-region = <0x53>; + }; + }; + }; + + fragment@61 { + target = <0xffffffff>; + + __overlay__ { + + android { + + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_system,recovery,dtbo,abl,xbl,tz,hyp"; + }; + }; + }; + }; + + fragment@62 { + target = <0xffffffff>; + + __overlay__ { + qcom,smem-states = <0xffffffff 0x0 0xffffffff 0x4 0xffffffff 0x5>; + qcom,smem-state-names = "qcom,force-stop", "qcom,stop-reason-0", "qcom,stop-reason-1"; + }; + }; + + fragment@63 { + target = <0xffffffff>; + + __overlay__ { + vdd-3.3-ch1-supply; + }; + }; + + fragment@64 { + target = <0xffffffff>; + + __overlay__ { + spm-level = <0x3>; + }; + }; + + fragment@65 { + target = <0xffffffff>; + + __overlay__ { + + camera_mem_region { + reg = <0x1 0x20000000 0x0 0x25800000>; + ion,recyclable; + phandle = <0x54>; + }; + }; + }; + + fragment@66 { + target = <0xffffffff>; + + __overlay__ { + + qcom,ion { + + qcom,ion-heap@30 { + reg = <0x1e>; + memory-region = <0x54>; + qcom,ion-heap-type = "RBIN"; + }; + }; + }; + }; + + fragment@67 { + target = <0xffffffff>; + + __overlay__ { + i2c18 = "/soc/i2c@18"; + }; + }; + + fragment@68 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x3>; + + imp_list { + #list-imp-cells = <0x3>; + phandle = <0x25>; + }; + }; + }; + + fragment@69 { + target = <0xffffffff>; + + __overlay__ { + + msm_cdc_pinctrl_quin { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x55 0x56 0x57 0x58>; + pinctrl-1 = <0x59 0x5a 0x5b 0x5c>; + qcom,lpi-gpios; + phandle = <0x60>; + }; + }; + }; + + fragment@70 { + target = <0xffffffff>; + + __overlay__ { + + sec-audio-sysfs { + compatible = "samsung,audio-sysfs"; + status = "okay"; + audio,num-amp = <0x2>; + }; + + samsung,q6audio-adaptation { + compatible = "samsung,q6audio-adaptation"; + adaptation,device-tx-port-id = <0xb037>; + adaptation,spk-rx-port-id = <0x1016>; + adaptation,usb-rx-port-id = <0x7000>; + adaptation,bt-rx-port-id = <0x400e>; + adaptation,headset-rx-port-id = <0xb030>; + phandle = <0x5f>; + }; + + det_zones { + #list-det-cells = <0x2>; + phandle = <0x24>; + }; + + i2c@18 { + status = "ok"; + cell-index = <0x12>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x58 0x0 0xffffffff 0x59 0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x5d 0x5e>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xc1>; + + tas256x@4c { + #sound-dai-cells = <0x0>; + compatible = "ti, tas256x"; + status = "ok"; + reg = <0x4c>; + ti,reset-gpio = <0xffffffff 0x5e 0x0>; + ti,irq-gpio = <0xffffffff 0x5a 0x0>; + ti,left-channel = <0x4d>; + ti,right-channel = <0x4c>; + ti,channels = <0x2>; + ti,iv-width = <0x8>; + ti,vbat-mon = <0x1>; + ti,port_id = <0x1016>; + phandle = <0xc2>; + }; + }; + }; + }; + + fragment@71 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,wcn-btfm = <0x1>; + qcom,ext-disp-audio-rx = <0x0>; + qcom,mi2s-audio-intf = <0x1>; + asoc-platform = <0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0x5f>; + asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-pcm-dsp.2", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-compress-dsp", "msm-pcm-hostless", "msm-pcm-afe", "msm-lsm-client", "msm-pcm-routing", "msm-compr-dsp", "msm-pcm-dsp-noirq", "q6audio-adaptation"; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS3", "MIC BIAS3", "Analog Mic4", "AMIC5", "MIC BIAS4", "MIC BIAS4", "Analog Mic5", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT"; + qcom,msm-mbhc-hs-mic-max-threshold-mv = <0x270f>; + qcom,msm-mbhc-hs-mic-min-threshold-mv = <0x280>; + qcom,cdc-dmic01-gpios; + qcom,cdc-dmic23-gpios; + qcom,cdc-dmic45-gpios; + qcom,quin-mi2s-gpios = <0x60>; + asoc-codec = <0xffffffff 0xffffffff>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec"; + qcom,wsa-max-devs = <0x0>; + qcom,wsa-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x31 0xffffffff>; + fsa4480-i2c-handle; + qcom,fm-lna-gpios = <0xffffffff 0x54 0x0>; + qcom,msm-mbhc-gnd-det = <0x1>; + }; + }; + + fragment@72 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@73 { + target = <0xffffffff>; + + __overlay__ { + + tas25xx_gpio_default { + phandle = <0x5d>; + + mux { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + function = "gpio"; + }; + + config { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + bias-disable; + }; + }; + + fm_lna_default { + phandle = <0x5e>; + + mux { + pins = "gpio84"; + function = "gpio"; + }; + + config { + pins = "gpio84"; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@74 { + target = <0xffffffff>; + + __overlay__ { + + grip_i2c { + + grip_i2c_active { + phandle = <0xa8>; + + grip_i2c_active { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + + grip_i2c_suspend { + phandle = <0xc3>; + + grip_i2c_suspend { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + }; + + s2mpb03_i2c_sda_default { + phandle = <0x61>; + + mux { + pins = "gpio25"; + function = "gpio"; + }; + + config { + pins = "gpio25"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + s2mpb03_i2c_scl_default { + phandle = <0x62>; + + mux { + pins = "gpio26"; + function = "gpio"; + }; + + config { + pins = "gpio26"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + cam_sensor_mclk0_active { + phandle = <0x81>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk0_suspend { + phandle = <0x83>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk1_active { + phandle = <0x91>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk1_suspend { + phandle = <0x93>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk2_active { + phandle = <0x99>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk2_suspend { + phandle = <0x9c>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk3_active { + phandle = <0x86>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk3_suspend { + phandle = <0x8a>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk4_active { + phandle = <0xa0>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk4_suspend { + phandle = <0xa3>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + rcam1_sensor_reset_active { + phandle = <0x82>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_reset_suspend { + phandle = <0x84>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_active { + phandle = <0x92>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_suspend { + phandle = <0x94>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_active { + phandle = <0x87>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_suspend { + phandle = <0x8b>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_active { + phandle = <0x9a>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_suspend { + phandle = <0x9d>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_active { + phandle = <0xa1>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_suspend { + phandle = <0xa4>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_active { + phandle = <0x73>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_suspend { + phandle = <0x74>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_active { + phandle = <0x9b>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_suspend { + phandle = <0x9e>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_active { + phandle = <0x88>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_suspend { + phandle = <0x8c>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_active { + phandle = <0xa2>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_suspend { + phandle = <0xa5>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_active { + phandle = <0x89>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-disable; + output-high; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_suspend { + phandle = <0x8d>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vdig_active { + phandle = <0xc4>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vdig_suspend { + phandle = <0xc5>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_active { + phandle = <0xc6>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_suspend { + phandle = <0xc7>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + if_pmic_i2c_pins { + phandle = <0xc8>; + + if_pmic_i2c_sleep { + phandle = <0x66>; + + mux { + pins = "gpio115", "gpio116"; + function = "gpio"; + }; + + config { + pins = "gpio115", "gpio116"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + usbpd_i2c_pins { + phandle = <0xc9>; + + usbpd_i2c_sleep { + phandle = <0x68>; + + mux { + pins = "gpio53", "gpio54"; + function = "gpio"; + }; + + config { + pins = "gpio53", "gpio54"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + mcu_reset_active { + phandle = <0x76>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_reset_suspend { + phandle = <0x78>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + mcu_clk_active { + phandle = <0x77>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_clk_suspend { + phandle = <0x79>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + }; + }; + + fragment@75 { + target = <0xffffffff>; + + __overlay__ { + + grip_int_active { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xa9>; + }; + + grip_int_suspend { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xca>; + }; + }; + }; + + fragment@76 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x6 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x22 0x25 0x2a 0x2d 0x2f 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x43 0x44 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5b 0x5e 0x73 0x74 0x76>; + }; + }; + + fragment@77 { + target = <0xffffffff>; + + __overlay__ { + + qcom,pm6150@0 { + + qcom,power-on@800 { + interrupts = <0x0 0x8 0x0 0x0 0x0 0x8 0x1 0x0 0x0 0x8 0x4 0x0 0x0 0x8 0x5 0x0>; + interrupt-names = "kpdpwr", "resin", "resin-bark", "kpdpwr-resin-bark"; + qcom,s3-debounce = <0x80>; + + qcom,pon_1 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_2 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_3 { + qcom,pon-type = <0x3>; + qcom,support-reset = <0x1>; + qcom,pull-up = <0x1>; + qcom,s1-timer = <0x1a40>; + qcom,s2-timer = <0x3e8>; + qcom,s2-type = <0x8>; + qcom,use-bark; + }; + }; + }; + }; + }; + + fragment@78 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@79 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@80 { + target = <0xffffffff>; + + __overlay__ { + + sec_thermistor@0 { + compatible = "samsung,sec-ap-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "ap_therm"; + adc_array = <0x70e 0x8a0 0xa3c 0xc04 0xe36 0x1103 0x1467 0x17f5 0x1c02 0x20ba 0x25b4 0x2b63 0x3141 0x3799 0x3d1c 0x44c8 0x4b37 0x51b0 0x5641 0x5bbf 0x5fec 0x6437 0x66e9>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@1 { + compatible = "samsung,sec-pa-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "pa_therm"; + adc_array = <0x745 0x8dc 0xa82 0xc3c 0xe92 0x112d 0x149e 0x1836 0x1c41 0x211f 0x2636 0x2bc9 0x31a3 0x3802 0x3d67 0x453a 0x4b8f 0x518c 0x5730 0x5c17 0x60ae 0x6482 0x672b>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@2 { + compatible = "samsung,sec-wf-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4f>; + io-channel-names = "wf_therm"; + adc_array = <0x753 0x8de 0xa8f 0xc4d 0xe9a 0x1140 0x149f 0x183d 0x1c54 0x2116 0x262e 0x2bdb 0x31c1 0x3816 0x3d7c 0x455a 0x4b86 0x51c4 0x56f2 0x5c43 0x60c5 0x64b3 0x6785>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + i2c@2 { + cell-index = <0x2>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x19 0x0 0xffffffff 0x1a 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x61 0x62>; + phandle = <0xcb>; + + s2mpb03@56 { + compatible = "samsung,s2mpb03pmic"; + reg = <0x56>; + additional_reg_init; + + regulators { + + s2mpb03-ldo1 { + regulator-name = "s2mpb03-ldo1"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x100590>; + phandle = <0x90>; + }; + + s2mpb03-ldo2 { + regulator-name = "s2mpb03-ldo2"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x80>; + }; + + s2mpb03-ldo3 { + regulator-name = "s2mpb03-ldo3"; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x7e>; + }; + + s2mpb03-ldo4 { + regulator-name = "s2mpb03-ldo4"; + regulator-min-microvolt = <0x10c8e0>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x98>; + }; + + s2mpb03-ldo5 { + regulator-name = "s2mpb03-ldo5"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x7f>; + }; + + s2mpb03-ldo6 { + regulator-name = "s2mpb03-ldo6"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x8f>; + }; + + s2mpb03-ldo7 { + regulator-name = "s2mpb03-ldo7"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x75>; + }; + }; + }; + }; + }; + }; + + fragment@81 { + target = <0xffffffff>; + + __overlay__ { + interrupts = <0x0 0xc0 0x0 0x0 0x0 0xc1 0x0 0x0 0x0 0xc2 0x0 0x0 0x0 0xc3 0x0 0x0 0x0 0xc4 0x0 0x0 0x0 0xc6 0x0 0x0 0x0 0xc7 0x0 0x0 0x0 0xc9 0x0 0x0>; + interrupt-names = "pm6150_gpio1", "pm6150_gpio2", "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio5", "pm6150_gpio7", "pm6150_gpio8", "pm6150_gpio10"; + qcom,gpios-disallowed = <0x6 0x9>; + }; + }; + + fragment@82 { + target = <0xffffffff>; + + __overlay__ { + + ap_therm { + reg = <0x4e>; + label = "ap_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@83 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm { + reg = <0x4e>; + label = "pa_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + + wf_therm { + reg = <0x4f>; + label = "wf_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@84 { + target = <0xffffffff>; + + __overlay__ { + + self_display_FC3_dtsi { + label = "self_display_FC3_dtsi"; + samsung,support_self_display; + samsung,self_mask_setting_pre_revA = [29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 02 75 10]; + samsung,self_mask_setting_post_revA = [29 01 00 00 00 00 02 75 00]; + samsung,self_mask_on_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 00 00 00 95 07 9e 09 5f 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_on_factory_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_off_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_disp_debug_rx_cmds_revA = [06 01 00 00 00 00 01 7f 04 01]; + samsung,self_mask_check_tx_pre1_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 04 b0 00 27 d8 29 01 00 00 00 00 02 d8 16 29 01 00 00 00 00 0a bf 01 07 00 00 00 10 00 00 00 29 01 00 00 11 00 02 7a 00 29 01 00 00 00 00 02 75 10 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,self_mask_check_tx_pre2_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 02 75 00 29 01 00 00 22 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 01 f4 02 33 09 60 09 61 00 00 ff ff ff 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,mask_crc_pass_data = [d3 9b]; + samsung,self_mask_check_rx_cmds_revA = [06 01 00 00 00 00 01 14 02 00]; + samsung,self_mask_check_tx_post_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 00 00 00 00 00 29 01 00 00 00 00 02 bf 00 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + phandle = <0x63>; + }; + }; + }; + + fragment@85 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + label = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0x1e6>; + qcom,mdss-brightness-max-level = <0x1e6>; + qcom,mdss-brightness-default-level = <0xff>; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-t-clk-pre = <0x3e>; + qcom,mdss-dsi-t-clk-post = <0x10>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x46>; + qcom,mdss-pan-physical-height-dimension = <0x9b>; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-t-clk-pre-extend; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + qcom,ulps-enabled; + samsung,panel-vendor = "SDC"; + samsung,disp-model = "AMS667YM01"; + samsung,support_gamma_mode2; + samsung,skip_read_on_pre; + samsung,elvss_interpolation_temperature = <0xfffffff0>; + samsung,support_lpm; + samsung,support_gpara; + samsung,pointing_gpara; + samsung,two_byte_gpara; + samsung,rsc_4_frame_idle; + samsung,support_factory_panel_swap; + samsung,support-optical-fingerprint; + samsung,support_vrr_based_bl; + ss,self_display = <0x63>; + samsung,level0_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 9f a5 a5]; + samsung,level0_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 9f 5a 5a]; + samsung,level1_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 5a 5a]; + samsung,level1_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 a5 a5]; + samsung,level2_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 fc 5a 5a]; + samsung,level2_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 fc a5 a5]; + samsung,brightness_tx_cmds_revA = <0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100>; + samsung,display_on_tx_cmds_revA = [29 00 00 00 00 00 03 9f a5 a5 05 00 00 00 00 00 02 29 00 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,display_off_tx_cmds_revA = [05 01 00 00 00 00 02 28 00]; + samsung,reg_read_pos_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 00 00]; + samsung,mtp_write_sysfs_tx_cmds_revA = <0x29000000 0x3d00 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + samsung,panel_ltps_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 50 01 0c 00 04 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 3c 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,panel_ltps_tx_cmds_revC = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 50 00 0c 00 04 31 48 31 48 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 3c 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,smooth_dimming_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 91 63 29 00 00 00 00 00 02 63 20 29 01 00 00 11 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,gamma_mode2_normal_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26360 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x7290000 0x2 0x53202900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0002900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revF = <0x29000000 0x391 0x2012900 0x0 0x2532029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 1c 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,gamma_mode2_hbm_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26320 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x290000 0x2 0x53e02900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0072900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revF = <0x29000000 0x391 0x2002900 0x0 0x253e029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 14 29 00 00 00 00 00 02 53 e0 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,vrr_tx_cmds_revA = [29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f]; + samsung,acl_on_tx_cmds_revA = [29 00 00 00 00 00 04 b0 03 b3 65 29 00 00 00 00 00 14 65 55 00 b0 51 66 98 15 55 55 55 08 f1 c6 48 40 00 20 10 09 29 00 00 00 00 00 02 55 03]; + samsung,acl_off_tx_cmds_revA = [29 01 00 00 00 00 02 55 00]; + samsung,manufacture_id0_rx_cmds_revA = [06 01 00 00 00 00 01 da 01 00 00]; + samsung,manufacture_id1_rx_cmds_revA = [06 01 00 00 00 00 01 db 01 00 00]; + samsung,manufacture_id2_rx_cmds_revA = [06 01 00 00 00 00 01 dc 01 00 00]; + samsung,module_info_rx_cmds_revA = [06 01 00 00 00 00 01 a1 0b 00 00]; + samsung,octa_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 04 00 0b]; + samsung,cell_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 10 00 0f]; + samsung,cell_id_rx_cmds_revG = [06 01 00 00 00 00 01 92 10 00 02]; + samsung,ddi_id_rx_cmds_revA = [06 01 00 00 00 00 01 d6 05 00 00]; + samsung,mtp_read_sysfs_rx_cmds_revA = [06 01 00 00 00 00 01 00 00 00 00]; + samsung,candela_map_table_revA = <0x0 0x0 0x0 0x2 0x2 0x1 0x1 0x1 0x3 0x2 0x2 0x2 0x2 0x4 0x3 0x3 0x3 0x3 0x5 0x3 0x4 0x4 0x4 0x7 0x4 0x5 0x5 0x5 0x8 0x5 0x6 0x6 0x6 0xa 0x5 0x7 0x7 0x7 0xc 0x6 0x8 0x8 0x8 0xd 0x7 0x9 0x9 0x9 0xf 0x7 0xa 0xa 0xa 0x11 0x8 0xb 0xb 0xb 0x13 0x9 0xc 0xc 0xc 0x15 0xa 0xd 0xd 0xd 0x18 0xb 0xe 0xe 0xe 0x1a 0xc 0xf 0xf 0xf 0x1c 0xd 0x10 0x10 0x10 0x1e 0xd 0x11 0x11 0x11 0x20 0xe 0x12 0x12 0x12 0x23 0xf 0x13 0x13 0x13 0x25 0x10 0x14 0x14 0x14 0x28 0x11 0x15 0x15 0x15 0x2a 0x12 0x16 0x16 0x16 0x2d 0x13 0x17 0x17 0x17 0x2f 0x14 0x18 0x18 0x18 0x32 0x15 0x19 0x19 0x19 0x34 0x16 0x1a 0x1a 0x1a 0x37 0x17 0x1b 0x1b 0x1b 0x3a 0x19 0x1c 0x1c 0x1c 0x3c 0x1a 0x1d 0x1d 0x1d 0x3f 0x1b 0x1e 0x1e 0x1e 0x42 0x1c 0x1f 0x1f 0x1f 0x45 0x1d 0x20 0x20 0x20 0x47 0x1e 0x21 0x21 0x21 0x4a 0x1f 0x22 0x22 0x22 0x4d 0x20 0x23 0x23 0x23 0x50 0x22 0x24 0x24 0x24 0x53 0x23 0x25 0x25 0x25 0x56 0x24 0x26 0x26 0x26 0x59 0x25 0x27 0x27 0x27 0x5c 0x26 0x28 0x28 0x28 0x5f 0x28 0x29 0x29 0x29 0x62 0x29 0x2a 0x2a 0x2a 0x65 0x2a 0x2b 0x2b 0x2b 0x68 0x2b 0x2c 0x2c 0x2c 0x6b 0x2d 0x2d 0x2d 0x2d 0x6e 0x2e 0x2e 0x2e 0x2e 0x71 0x2f 0x2f 0x2f 0x2f 0x74 0x30 0x30 0x30 0x30 0x77 0x32 0x31 0x31 0x31 0x7b 0x33 0x32 0x32 0x32 0x7e 0x34 0x33 0x33 0x33 0x81 0x36 0x34 0x34 0x34 0x84 0x37 0x35 0x35 0x35 0x88 0x38 0x36 0x36 0x36 0x8b 0x3a 0x37 0x37 0x37 0x8e 0x3b 0x38 0x38 0x38 0x92 0x3c 0x39 0x39 0x39 0x95 0x3e 0x3a 0x3a 0x3a 0x98 0x3f 0x3b 0x3b 0x3b 0x9c 0x40 0x3c 0x3c 0x3c 0x9f 0x42 0x3d 0x3d 0x3d 0xa2 0x43 0x3e 0x3e 0x3e 0xa6 0x44 0x3f 0x3f 0x3f 0xa9 0x46 0x40 0x40 0x40 0xad 0x47 0x41 0x41 0x41 0xb0 0x49 0x42 0x42 0x42 0xb4 0x4a 0x43 0x43 0x43 0xb7 0x4c 0x44 0x44 0x44 0xbb 0x4d 0x45 0x45 0x45 0xbe 0x4e 0x46 0x46 0x46 0xc2 0x50 0x47 0x47 0x47 0xc5 0x51 0x48 0x48 0x48 0xc9 0x53 0x49 0x49 0x49 0xcd 0x54 0x4a 0x4a 0x4a 0xd0 0x56 0x4b 0x4b 0x4b 0xd4 0x57 0x4c 0x4c 0x4c 0xd7 0x59 0x4d 0x4d 0x4d 0xdb 0x5a 0x4e 0x4e 0x4e 0xdf 0x5c 0x4f 0x4f 0x4f 0xe3 0x5d 0x50 0x50 0x50 0xe6 0x5f 0x51 0x51 0x51 0xea 0x60 0x52 0x52 0x52 0xee 0x62 0x53 0x53 0x53 0xf1 0x63 0x54 0x54 0x54 0xf5 0x65 0x55 0x55 0x55 0xf9 0x66 0x56 0x56 0x56 0xfd 0x68 0x57 0x57 0x57 0x101 0x69 0x58 0x58 0x58 0x104 0x6b 0x59 0x59 0x59 0x108 0x6c 0x5a 0x5a 0x5a 0x10c 0x6e 0x5b 0x5b 0x5b 0x110 0x70 0x5c 0x5c 0x5c 0x114 0x71 0x5d 0x5d 0x5d 0x118 0x73 0x5e 0x5e 0x5e 0x11b 0x74 0x5f 0x5f 0x5f 0x11f 0x76 0x60 0x60 0x60 0x123 0x77 0x61 0x61 0x61 0x127 0x79 0x62 0x62 0x62 0x12b 0x7b 0x63 0x63 0x63 0x12f 0x7c 0x64 0x64 0x64 0x133 0x7e 0x65 0x65 0x65 0x137 0x7f 0x66 0x66 0x66 0x13b 0x81 0x67 0x67 0x67 0x13f 0x83 0x68 0x68 0x68 0x143 0x84 0x69 0x69 0x69 0x147 0x86 0x6a 0x6a 0x6a 0x14b 0x88 0x6b 0x6b 0x6b 0x14f 0x89 0x6c 0x6c 0x6c 0x153 0x8b 0x6d 0x6d 0x6d 0x157 0x8c 0x6e 0x6e 0x6e 0x15b 0x8e 0x6f 0x6f 0x6f 0x15f 0x90 0x70 0x70 0x70 0x163 0x91 0x71 0x71 0x71 0x168 0x93 0x72 0x72 0x72 0x16c 0x95 0x73 0x73 0x73 0x170 0x96 0x74 0x74 0x74 0x174 0x98 0x75 0x75 0x75 0x178 0x9a 0x76 0x76 0x76 0x17c 0x9c 0x77 0x77 0x77 0x180 0x9d 0x78 0x78 0x78 0x185 0x9f 0x79 0x79 0x79 0x189 0xa1 0x7a 0x7a 0x7a 0x18d 0xa2 0x7b 0x7b 0x7b 0x191 0xa4 0x7c 0x7c 0x7c 0x195 0xa6 0x7d 0x7d 0x7d 0x19a 0xa7 0x7e 0x7e 0x7e 0x19e 0xa9 0x7f 0x7f 0x7f 0x1a2 0xab 0x80 0x80 0x80 0x1a6 0xad 0x81 0x81 0x81 0x1ab 0xae 0x82 0x82 0x82 0x1af 0xb0 0x83 0x83 0x83 0x1b3 0xb2 0x84 0x84 0x84 0x1b8 0xb4 0x85 0x85 0x85 0x1bc 0xb5 0x86 0x86 0x86 0x1c0 0xb7 0x87 0x87 0x87 0x1c5 0xb9 0x88 0x88 0x88 0x1c9 0xbb 0x89 0x89 0x89 0x1cd 0xbc 0x8a 0x8a 0x8a 0x1d1 0xbe 0x8b 0x8b 0x8b 0x1d6 0xc0 0x8c 0x8c 0x8c 0x1da 0xc2 0x8d 0x8d 0x8d 0x1de 0xc3 0x8e 0x8e 0x8e 0x1e3 0xc5 0x8f 0x8f 0x8f 0x1e7 0xc7 0x90 0x90 0x90 0x1eb 0xc9 0x91 0x91 0x91 0x1f0 0xcb 0x92 0x92 0x92 0x1f4 0xcc 0x93 0x93 0x93 0x1f8 0xce 0x94 0x94 0x94 0x1fd 0xd0 0x95 0x95 0x95 0x201 0xd2 0x96 0x96 0x96 0x206 0xd4 0x97 0x97 0x97 0x20a 0xd6 0x98 0x98 0x98 0x20e 0xd7 0x99 0x99 0x99 0x213 0xd9 0x9a 0x9a 0x9a 0x217 0xdb 0x9b 0x9b 0x9b 0x21c 0xdd 0x9c 0x9c 0x9c 0x220 0xdf 0x9d 0x9d 0x9d 0x225 0xe1 0x9e 0x9e 0x9e 0x229 0xe2 0x9f 0x9f 0x9f 0x22e 0xe4 0xa0 0xa0 0xa0 0x232 0xe6 0xa1 0xa1 0xa1 0x237 0xe8 0xa2 0xa2 0xa2 0x23b 0xea 0xa3 0xa3 0xa3 0x240 0xec 0xa4 0xa4 0xa4 0x244 0xed 0xa5 0xa5 0xa5 0x249 0xef 0xa6 0xa6 0xa6 0x24d 0xf1 0xa7 0xa7 0xa7 0x252 0xf3 0xa8 0xa8 0xa8 0x256 0xf5 0xa9 0xa9 0xa9 0x25b 0xf7 0xaa 0xaa 0xaa 0x260 0xf9 0xab 0xab 0xab 0x264 0xfb 0xac 0xac 0xac 0x269 0xfd 0xad 0xad 0xad 0x26d 0xfe 0xae 0xae 0xae 0x272 0x100 0xaf 0xaf 0xaf 0x277 0x102 0xb0 0xb0 0xb0 0x27b 0x104 0xb1 0xb1 0xb1 0x280 0x106 0xb2 0xb2 0xb2 0x284 0x108 0xb3 0xb3 0xb3 0x289 0x10a 0xb4 0xb4 0xb4 0x28e 0x10c 0xb5 0xb5 0xb5 0x292 0x10e 0xb6 0xb6 0xb6 0x297 0x110 0xb7 0xb7 0xb7 0x29c 0x112 0xb8 0xb8 0xb8 0x2a0 0x113 0xb9 0xb9 0xb9 0x2a5 0x115 0xba 0xba 0xba 0x2aa 0x117 0xbb 0xbb 0xbb 0x2ae 0x119 0xbc 0xbc 0xbc 0x2b3 0x11b 0xbd 0xbd 0xbd 0x2b8 0x11d 0xbe 0xbe 0xbe 0x2bd 0x11f 0xbf 0xbf 0xbf 0x2c1 0x121 0xc0 0xc0 0xc0 0x2c6 0x123 0xc1 0xc1 0xc1 0x2cb 0x125 0xc2 0xc2 0xc2 0x2d0 0x127 0xc3 0xc3 0xc3 0x2d4 0x129 0xc4 0xc4 0xc4 0x2d9 0x12b 0xc5 0xc5 0xc5 0x2de 0x12d 0xc6 0xc6 0xc6 0x2e3 0x12f 0xc7 0xc7 0xc7 0x2e8 0x131 0xc8 0xc8 0xc8 0x2ec 0x133 0xc9 0xc9 0xc9 0x2f1 0x135 0xca 0xca 0xca 0x2f6 0x137 0xcb 0xcb 0xcb 0x2fb 0x139 0xcc 0xcc 0xcc 0x300 0x13b 0xcd 0xcd 0xcd 0x304 0x13d 0xce 0xce 0xce 0x309 0x13f 0xcf 0xcf 0xcf 0x30e 0x141 0xd0 0xd0 0xd0 0x313 0x143 0xd1 0xd1 0xd1 0x318 0x145 0xd2 0xd2 0xd2 0x31d 0x147 0xd3 0xd3 0xd3 0x322 0x149 0xd4 0xd4 0xd4 0x327 0x14b 0xd5 0xd5 0xd5 0x32b 0x14d 0xd6 0xd6 0xd6 0x330 0x14f 0xd7 0xd7 0xd7 0x335 0x151 0xd8 0xd8 0xd8 0x33a 0x153 0xd9 0xd9 0xd9 0x33f 0x155 0xda 0xda 0xda 0x344 0x157 0xdb 0xdb 0xdb 0x349 0x159 0xdc 0xdc 0xdc 0x34e 0x15b 0xdd 0xdd 0xdd 0x353 0x15d 0xde 0xde 0xde 0x358 0x15f 0xdf 0xdf 0xdf 0x35d 0x161 0xe0 0xe0 0xe0 0x362 0x163 0xe1 0xe1 0xe1 0x367 0x165 0xe2 0xe2 0xe2 0x36c 0x167 0xe3 0xe3 0xe3 0x371 0x169 0xe4 0xe4 0xe4 0x376 0x16b 0xe5 0xe5 0xe5 0x37b 0x16d 0xe6 0xe6 0xe6 0x380 0x170 0xe7 0xe7 0xe7 0x385 0x172 0xe8 0xe8 0xe8 0x38a 0x174 0xe9 0xe9 0xe9 0x38f 0x176 0xea 0xea 0xea 0x394 0x178 0xeb 0xeb 0xeb 0x399 0x17a 0xec 0xec 0xec 0x39e 0x17c 0xed 0xed 0xed 0x3a3 0x17e 0xee 0xee 0xee 0x3a8 0x180 0xef 0xef 0xef 0x3ad 0x182 0xf0 0xf0 0xf0 0x3b2 0x184 0xf1 0xf1 0xf1 0x3b7 0x186 0xf2 0xf2 0xf2 0x3bc 0x189 0xf3 0xf3 0xf3 0x3c1 0x18b 0xf4 0xf4 0xf4 0x3c7 0x18d 0xf5 0xf5 0xf5 0x3cc 0x18f 0xf6 0xf6 0xf6 0x3d1 0x191 0xf7 0xf7 0xf7 0x3d6 0x193 0xf8 0xf8 0xf8 0x3db 0x195 0xf9 0xf9 0xf9 0x3e0 0x197 0xfa 0xfa 0xfa 0x3e5 0x199 0xfb 0xfb 0xfb 0x3ea 0x19b 0xfc 0xfc 0xfc 0x3f0 0x19e 0xfd 0xfd 0xfd 0x3f5 0x1a0 0xfe 0xfe 0xfe 0x3fa 0x1a2 0xff 0xff 0xff 0x3ff 0x1a4>; + samsung,hbm_candela_map_table_revG = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x2 0x1aa 0x2 0x102 0x102 0x4 0x1ac 0x3 0x103 0x103 0x6 0x1ae 0x4 0x104 0x104 0x8 0x1b0 0x5 0x105 0x105 0xa 0x1b1 0x6 0x106 0x106 0xc 0x1b3 0x7 0x107 0x107 0xe 0x1b4 0x8 0x108 0x108 0x10 0x1b6 0x9 0x109 0x109 0x12 0x1b8 0xa 0x10a 0x10a 0x14 0x1b9 0xb 0x10b 0x10b 0x16 0x1bb 0xc 0x10c 0x10c 0x18 0x1bc 0xd 0x10d 0x10d 0x1a 0x1be 0xe 0x10e 0x10e 0x1c 0x1c0 0xf 0x10f 0x10f 0x1e 0x1c2 0x10 0x110 0x110 0x20 0x1c3 0x11 0x111 0x111 0x22 0x1c5 0x12 0x112 0x112 0x24 0x1c6 0x13 0x113 0x113 0x25 0x1c8 0x14 0x114 0x114 0x26 0x1ca 0x15 0x115 0x115 0x27 0x1cb 0x16 0x116 0x116 0x28 0x1cd 0x17 0x117 0x117 0x29 0x1ce 0x18 0x118 0x118 0x2a 0x1d0 0x19 0x119 0x119 0x2b 0x1d2 0x1a 0x11a 0x11a 0x2c 0x1d4 0x1b 0x11b 0x11b 0x2d 0x1d5 0x1c 0x11c 0x11c 0x2e 0x1d7 0x1d 0x11d 0x11d 0x2f 0x1d8 0x1e 0x11e 0x11e 0x30 0x1da 0x1f 0x11f 0x11f 0x31 0x1dc 0x20 0x120 0x120 0x32 0x1dd 0x21 0x121 0x121 0x33 0x1df 0x22 0x122 0x122 0x34 0x1e0 0x23 0x123 0x123 0x35 0x1e2 0x24 0x124 0x124 0x36 0x1e4 0x25 0x125 0x125 0x37 0x1e5 0x26 0x126 0x126 0x38 0x1e7 0x27 0x127 0x127 0x39 0x1e8 0x28 0x128 0x128 0x3a 0x1ea 0x29 0x129 0x129 0x3b 0x1ec 0x2a 0x12a 0x12a 0x3c 0x1ee 0x2b 0x12b 0x12b 0x3d 0x1ef 0x2c 0x12c 0x12c 0x3e 0x1f1 0x2d 0x12d 0x12d 0x3f 0x1f2 0x2e 0x12e 0x12e 0x40 0x1f4 0x2f 0x12f 0x12f 0x41 0x1f6 0x30 0x130 0x130 0x42 0x1f7 0x31 0x131 0x131 0x43 0x1f9 0x32 0x132 0x132 0x44 0x1fa 0x33 0x133 0x133 0x45 0x1fc 0x34 0x134 0x134 0x46 0x1fe 0x35 0x135 0x135 0x47 0x200 0x36 0x136 0x136 0x48 0x201 0x37 0x137 0x137 0x49 0x203 0x38 0x138 0x138 0x4a 0x204 0x39 0x139 0x139 0x4b 0x206 0x3a 0x13a 0x13a 0x4c 0x208 0x3b 0x13b 0x13b 0x4d 0x209 0x3c 0x13c 0x13c 0x4e 0x20b 0x3d 0x13d 0x13d 0x4f 0x20c 0x3e 0x13e 0x13e 0x50 0x20e 0x3f 0x13f 0x13f 0x51 0x210 0x40 0x140 0x140 0x52 0x211 0x41 0x141 0x141 0x53 0x213 0x42 0x142 0x142 0x54 0x215 0x43 0x143 0x143 0x55 0x216 0x44 0x144 0x144 0x56 0x218 0x45 0x145 0x145 0x57 0x21a 0x46 0x146 0x146 0x58 0x21b 0x47 0x147 0x147 0x59 0x21d 0x48 0x148 0x148 0x5a 0x21e 0x49 0x149 0x149 0x5b 0x220 0x4a 0x14a 0x14a 0x5c 0x222 0x4b 0x14b 0x14b 0x5d 0x223 0x4c 0x14c 0x14c 0x5f 0x225 0x4d 0x14d 0x14d 0x61 0x226 0x4e 0x14e 0x14e 0x63 0x228 0x4f 0x14f 0x14f 0x65 0x22a 0x50 0x150 0x150 0x67 0x22b 0x51 0x151 0x151 0x69 0x22d 0x52 0x152 0x152 0x6b 0x22f 0x53 0x153 0x153 0x6d 0x230 0x54 0x154 0x154 0x6f 0x232 0x55 0x155 0x155 0x71 0x234 0x56 0x156 0x156 0x73 0x235 0x57 0x157 0x157 0x75 0x237 0x58 0x158 0x158 0x77 0x238 0x59 0x159 0x159 0x79 0x23a 0x5a 0x15a 0x15a 0x7b 0x23c 0x5b 0x15b 0x15b 0x7d 0x23d 0x5c 0x15c 0x15c 0x7f 0x23f 0x5d 0x15d 0x15d 0x81 0x241 0x5e 0x15e 0x15e 0x83 0x242 0x5f 0x15f 0x15f 0x85 0x244 0x60 0x160 0x160 0x87 0x246 0x61 0x161 0x161 0x89 0x247 0x62 0x162 0x162 0x8b 0x249 0x63 0x163 0x163 0x8d 0x24a 0x64 0x164 0x164 0x8f 0x24c 0x65 0x165 0x165 0x91 0x24e 0x66 0x166 0x166 0x93 0x24f 0x67 0x167 0x167 0x95 0x251 0x68 0x168 0x168 0x97 0x253 0x69 0x169 0x169 0x9a 0x254 0x6a 0x16a 0x16a 0x9d 0x256 0x6b 0x16b 0x16b 0xa0 0x257 0x6c 0x16c 0x16c 0xa3 0x259 0x6d 0x16d 0x16d 0xa6 0x25b 0x6e 0x16e 0x16e 0xa8 0x25c 0x6f 0x16f 0x16f 0xab 0x25e 0x70 0x170 0x170 0xae 0x260 0x71 0x171 0x171 0xb1 0x261 0x72 0x172 0x172 0xb4 0x263 0x73 0x173 0x173 0xb7 0x264 0x74 0x174 0x174 0xba 0x266 0x75 0x175 0x175 0xbd 0x268 0x76 0x176 0x176 0xc0 0x269 0x77 0x177 0x177 0xc3 0x26b 0x78 0x178 0x178 0xc6 0x26d 0x79 0x179 0x179 0xc9 0x26e 0x7a 0x17a 0x17a 0xcc 0x270 0x7b 0x17b 0x17b 0xcf 0x272 0x7c 0x17c 0x17c 0xd2 0x273 0x7d 0x17d 0x17d 0xd5 0x275 0x7e 0x17e 0x17e 0xd8 0x276 0x7f 0x17f 0x17f 0xdb 0x278 0x80 0x180 0x180 0xde 0x27a 0x81 0x181 0x181 0xe1 0x27b 0x82 0x182 0x182 0xe4 0x27d 0x83 0x183 0x183 0xe7 0x27f 0x84 0x184 0x184 0xea 0x280 0x85 0x185 0x185 0xed 0x282 0x86 0x186 0x186 0xf0 0x283 0x87 0x187 0x187 0xf3 0x285 0x88 0x188 0x188 0xf6 0x287 0x89 0x189 0x189 0xf9 0x288 0x8a 0x18a 0x18a 0xfc 0x28a 0x8b 0x18b 0x18b 0xff 0x28c 0x8c 0x18c 0x18c 0x102 0x28d 0x8d 0x18d 0x18d 0x105 0x28f 0x8e 0x18e 0x18e 0x108 0x291 0x8f 0x18f 0x18f 0x10b 0x292 0x90 0x190 0x190 0x10e 0x294 0x91 0x191 0x191 0x111 0x295 0x92 0x192 0x192 0x114 0x297 0x93 0x193 0x193 0x117 0x299 0x94 0x194 0x194 0x11a 0x29a 0x95 0x195 0x195 0x11d 0x29c 0x96 0x196 0x196 0x120 0x29e 0x97 0x197 0x197 0x123 0x29f 0x98 0x198 0x198 0x126 0x2a1 0x99 0x199 0x199 0x129 0x2a3 0x9a 0x19a 0x19a 0x12c 0x2a4 0x9b 0x19b 0x19b 0x12f 0x2a6 0x9c 0x19c 0x19c 0x132 0x2a7 0x9d 0x19d 0x19d 0x135 0x2a9 0x9e 0x19e 0x19e 0x138 0x2ab 0x9f 0x19f 0x19f 0x13b 0x2ac 0xa0 0x1a0 0x1a0 0x13e 0x2ae 0xa1 0x1a1 0x1a1 0x141 0x2af 0xa2 0x1a2 0x1a2 0x144 0x2b1 0xa3 0x1a3 0x1a3 0x147 0x2b3 0xa4 0x1a4 0x1a4 0x14a 0x2b4 0xa5 0x1a5 0x1a5 0x14d 0x2b6 0xa6 0x1a6 0x1a6 0x150 0x2b8 0xa7 0x1a7 0x1a7 0x153 0x2b9 0xa8 0x1a8 0x1a8 0x156 0x2bb 0xa9 0x1a9 0x1a9 0x159 0x2bd 0xaa 0x1aa 0x1aa 0x15c 0x2be 0xab 0x1ab 0x1ab 0x15f 0x2c0 0xac 0x1ac 0x1ac 0x162 0x2c1 0xad 0x1ad 0x1ad 0x165 0x2c3 0xae 0x1ae 0x1ae 0x168 0x2c5 0xaf 0x1af 0x1af 0x16b 0x2c6 0xb0 0x1b0 0x1b0 0x16e 0x2c8 0xb1 0x1b1 0x1b1 0x171 0x2c9 0xb2 0x1b2 0x1b2 0x174 0x2cb 0xb3 0x1b3 0x1b3 0x177 0x2cd 0xb4 0x1b4 0x1b4 0x17a 0x2cf 0xb5 0x1b5 0x1b5 0x17d 0x2d0 0xb6 0x1b6 0x1b6 0x180 0x2d2 0xb7 0x1b7 0x1b7 0x183 0x2d3 0xb8 0x1b8 0x1b8 0x186 0x2d5 0xb9 0x1b9 0x1b9 0x189 0x2d7 0xba 0x1ba 0x1ba 0x18c 0x2d8 0xbb 0x1bb 0x1bb 0x18f 0x2da 0xbc 0x1bc 0x1bc 0x192 0x2db 0xbd 0x1bd 0x1bd 0x195 0x2dd 0xbe 0x1be 0x1be 0x198 0x2df 0xbf 0x1bf 0x1bf 0x19b 0x2e1 0xc0 0x1c0 0x1c0 0x19e 0x2e2 0xc1 0x1c1 0x1c1 0x1a1 0x2e4 0xc2 0x1c2 0x1c2 0x1a4 0x2e5 0xc3 0x1c3 0x1c3 0x1a7 0x2e7 0xc4 0x1c4 0x1c4 0x1aa 0x2e9 0xc5 0x1c5 0x1c5 0x1ad 0x2ea 0xc6 0x1c6 0x1c6 0x1b0 0x2ec 0xc7 0x1c7 0x1c7 0x1b3 0x2ed 0xc8 0x1c8 0x1c8 0x1b6 0x2ef 0xc9 0x1c9 0x1c9 0x1b9 0x2f1 0xca 0x1ca 0x1ca 0x1bc 0x2f2 0xcb 0x1cb 0x1cb 0x1bf 0x2f4 0xcc 0x1cc 0x1cc 0x1c2 0x2f5 0xcd 0x1cd 0x1cd 0x1c5 0x2f7 0xce 0x1ce 0x1ce 0x1c8 0x2f9 0xcf 0x1cf 0x1cf 0x1cb 0x2fb 0xd0 0x1d0 0x1d0 0x1ce 0x2fc 0xd1 0x1d1 0x1d1 0x1d1 0x2fe 0xd2 0x1d2 0x1d2 0x1d4 0x2ff 0xd3 0x1d3 0x1d3 0x1d7 0x301 0xd4 0x1d4 0x1d4 0x1da 0x303 0xd5 0x1d5 0x1d5 0x1dd 0x304 0xd6 0x1d6 0x1d6 0x1e0 0x306 0xd7 0x1d7 0x1d7 0x1e3 0x307 0xd8 0x1d8 0x1d8 0x1e6 0x309 0xd9 0x1d9 0x1d9 0x1e9 0x30b 0xda 0x1da 0x1da 0x1ec 0x30d 0xdb 0x1db 0x1db 0x1ef 0x30e 0xdc 0x1dc 0x1dc 0x1f2 0x310 0xdd 0x1dd 0x1dd 0x1f5 0x311 0xde 0x1de 0x1de 0x1f8 0x313 0xdf 0x1df 0x1df 0x1fb 0x315 0xe0 0x1e0 0x1e0 0x1fe 0x316 0xe1 0x1e1 0x1e1 0x201 0x318 0xe2 0x1e2 0x1e2 0x204 0x319 0xe3 0x1e3 0x1e3 0x207 0x31b 0xe4 0x1e4 0x1e4 0x20a 0x31d 0xe5 0x1e5 0x1e5 0x20d 0x31f 0xe6 0x1e6 0x1e6 0x210 0x320>; + samsung,hbm_candela_map_table_revA = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x3 0x1aa 0x2 0x102 0x102 0x6 0x1ac 0x3 0x103 0x103 0x9 0x1ae 0x4 0x104 0x104 0xc 0x1b0 0x5 0x105 0x105 0xf 0x1b1 0x6 0x106 0x106 0x12 0x1b3 0x7 0x107 0x107 0x15 0x1b4 0x8 0x108 0x108 0x18 0x1b6 0x9 0x109 0x109 0x1b 0x1b8 0xa 0x10a 0x10a 0x1e 0x1b9 0xb 0x10b 0x10b 0x21 0x1bb 0xc 0x10c 0x10c 0x24 0x1bc 0xd 0x10d 0x10d 0x27 0x1be 0xe 0x10e 0x10e 0x2a 0x1c0 0xf 0x10f 0x10f 0x2d 0x1c2 0x10 0x110 0x110 0x30 0x1c3 0x11 0x111 0x111 0x33 0x1c5 0x12 0x112 0x112 0x36 0x1c6 0x13 0x113 0x113 0x39 0x1c8 0x14 0x114 0x114 0x3c 0x1ca 0x15 0x115 0x115 0x3f 0x1cb 0x16 0x116 0x116 0x42 0x1cd 0x17 0x117 0x117 0x45 0x1ce 0x18 0x118 0x118 0x48 0x1d0 0x19 0x119 0x119 0x4b 0x1d2 0x1a 0x11a 0x11a 0x4e 0x1d4 0x1b 0x11b 0x11b 0x51 0x1d5 0x1c 0x11c 0x11c 0x54 0x1d7 0x1d 0x11d 0x11d 0x56 0x1d8 0x1e 0x11e 0x11e 0x58 0x1da 0x1f 0x11f 0x11f 0x5a 0x1dc 0x20 0x120 0x120 0x5c 0x1dd 0x21 0x121 0x121 0x5e 0x1df 0x22 0x122 0x122 0x60 0x1e0 0x23 0x123 0x123 0x62 0x1e2 0x24 0x124 0x124 0x64 0x1e4 0x25 0x125 0x125 0x66 0x1e5 0x26 0x126 0x126 0x68 0x1e7 0x27 0x127 0x127 0x6a 0x1e8 0x28 0x128 0x128 0x6c 0x1ea 0x29 0x129 0x129 0x6e 0x1ec 0x2a 0x12a 0x12a 0x70 0x1ee 0x2b 0x12b 0x12b 0x72 0x1ef 0x2c 0x12c 0x12c 0x74 0x1f1 0x2d 0x12d 0x12d 0x76 0x1f2 0x2e 0x12e 0x12e 0x78 0x1f4 0x2f 0x12f 0x12f 0x7a 0x1f6 0x30 0x130 0x130 0x7c 0x1f7 0x31 0x131 0x131 0x7e 0x1f9 0x32 0x132 0x132 0x80 0x1fa 0x33 0x133 0x133 0x82 0x1fc 0x34 0x134 0x134 0x84 0x1fe 0x35 0x135 0x135 0x86 0x200 0x36 0x136 0x136 0x88 0x201 0x37 0x137 0x137 0x8a 0x203 0x38 0x138 0x138 0x8c 0x204 0x39 0x139 0x139 0x8e 0x206 0x3a 0x13a 0x13a 0x90 0x208 0x3b 0x13b 0x13b 0x92 0x209 0x3c 0x13c 0x13c 0x94 0x20b 0x3d 0x13d 0x13d 0x96 0x20c 0x3e 0x13e 0x13e 0x98 0x20e 0x3f 0x13f 0x13f 0x9a 0x210 0x40 0x140 0x140 0x9c 0x211 0x41 0x141 0x141 0x9e 0x213 0x42 0x142 0x142 0xa0 0x215 0x43 0x143 0x143 0xa2 0x216 0x44 0x144 0x144 0xa4 0x218 0x45 0x145 0x145 0xa6 0x21a 0x46 0x146 0x146 0xa8 0x21b 0x47 0x147 0x147 0xaa 0x21d 0x48 0x148 0x148 0xac 0x21e 0x49 0x149 0x149 0xae 0x220 0x4a 0x14a 0x14a 0xb0 0x222 0x4b 0x14b 0x14b 0xb2 0x223 0x4c 0x14c 0x14c 0xb6 0x225 0x4d 0x14d 0x14d 0xba 0x226 0x4e 0x14e 0x14e 0xbe 0x228 0x4f 0x14f 0x14f 0xc2 0x22a 0x50 0x150 0x150 0xc6 0x22b 0x51 0x151 0x151 0xcb 0x22d 0x52 0x152 0x152 0xd0 0x22f 0x53 0x153 0x153 0xd5 0x230 0x54 0x154 0x154 0xda 0x232 0x55 0x155 0x155 0xdf 0x234 0x56 0x156 0x156 0xe4 0x235 0x57 0x157 0x157 0xe9 0x237 0x58 0x158 0x158 0xee 0x238 0x59 0x159 0x159 0xf3 0x23a 0x5a 0x15a 0x15a 0xf8 0x23c 0x5b 0x15b 0x15b 0xfd 0x23d 0x5c 0x15c 0x15c 0x102 0x23f 0x5d 0x15d 0x15d 0x107 0x241 0x5e 0x15e 0x15e 0x10c 0x242 0x5f 0x15f 0x15f 0x111 0x244 0x60 0x160 0x160 0x116 0x246 0x61 0x161 0x161 0x11b 0x247 0x62 0x162 0x162 0x120 0x249 0x63 0x163 0x163 0x125 0x24a 0x64 0x164 0x164 0x12a 0x24c 0x65 0x165 0x165 0x12f 0x24e 0x66 0x166 0x166 0x134 0x24f 0x67 0x167 0x167 0x139 0x251 0x68 0x168 0x168 0x13e 0x253 0x69 0x169 0x169 0x143 0x254 0x6a 0x16a 0x16a 0x148 0x256 0x6b 0x16b 0x16b 0x14d 0x257 0x6c 0x16c 0x16c 0x152 0x259 0x6d 0x16d 0x16d 0x157 0x25b 0x6e 0x16e 0x16e 0x15c 0x25c 0x6f 0x16f 0x16f 0x161 0x25e 0x70 0x170 0x170 0x166 0x260 0x71 0x171 0x171 0x16b 0x261 0x72 0x172 0x172 0x170 0x263 0x73 0x173 0x173 0x175 0x264 0x74 0x174 0x174 0x17a 0x266 0x75 0x175 0x175 0x17f 0x268 0x76 0x176 0x176 0x184 0x269 0x77 0x177 0x177 0x189 0x26b 0x78 0x178 0x178 0x18e 0x26d 0x79 0x179 0x179 0x193 0x26e 0x7a 0x17a 0x17a 0x198 0x270 0x7b 0x17b 0x17b 0x19d 0x272 0x7c 0x17c 0x17c 0x1a2 0x273 0x7d 0x17d 0x17d 0x1a7 0x275 0x7e 0x17e 0x17e 0x1ac 0x276 0x7f 0x17f 0x17f 0x1b1 0x278 0x80 0x180 0x180 0x1b6 0x27a 0x81 0x181 0x181 0x1bb 0x27b 0x82 0x182 0x182 0x1c0 0x27d 0x83 0x183 0x183 0x1c5 0x27f 0x84 0x184 0x184 0x1ca 0x280 0x85 0x185 0x185 0x1cf 0x282 0x86 0x186 0x186 0x1d4 0x283 0x87 0x187 0x187 0x1d9 0x285 0x88 0x188 0x188 0x1de 0x287 0x89 0x189 0x189 0x1e3 0x288 0x8a 0x18a 0x18a 0x1e8 0x28a 0x8b 0x18b 0x18b 0x1ed 0x28c 0x8c 0x18c 0x18c 0x1f2 0x28d 0x8d 0x18d 0x18d 0x1f7 0x28f 0x8e 0x18e 0x18e 0x1fc 0x291 0x8f 0x18f 0x18f 0x201 0x292 0x90 0x190 0x190 0x206 0x294 0x91 0x191 0x191 0x20b 0x295 0x92 0x192 0x192 0x210 0x297 0x93 0x193 0x193 0x215 0x299 0x94 0x194 0x194 0x21a 0x29a 0x95 0x195 0x195 0x21f 0x29c 0x96 0x196 0x196 0x224 0x29e 0x97 0x197 0x197 0x229 0x29f 0x98 0x198 0x198 0x22e 0x2a1 0x99 0x199 0x199 0x233 0x2a3 0x9a 0x19a 0x19a 0x238 0x2a4 0x9b 0x19b 0x19b 0x23d 0x2a6 0x9c 0x19c 0x19c 0x242 0x2a7 0x9d 0x19d 0x19d 0x247 0x2a9 0x9e 0x19e 0x19e 0x24d 0x2ab 0x9f 0x19f 0x19f 0x253 0x2ac 0xa0 0x1a0 0x1a0 0x259 0x2ae 0xa1 0x1a1 0x1a1 0x25f 0x2af 0xa2 0x1a2 0x1a2 0x265 0x2b1 0xa3 0x1a3 0x1a3 0x26b 0x2b3 0xa4 0x1a4 0x1a4 0x271 0x2b4 0xa5 0x1a5 0x1a5 0x277 0x2b6 0xa6 0x1a6 0x1a6 0x27d 0x2b8 0xa7 0x1a7 0x1a7 0x283 0x2b9 0xa8 0x1a8 0x1a8 0x289 0x2bb 0xa9 0x1a9 0x1a9 0x28f 0x2bd 0xaa 0x1aa 0x1aa 0x295 0x2be 0xab 0x1ab 0x1ab 0x29b 0x2c0 0xac 0x1ac 0x1ac 0x2a1 0x2c1 0xad 0x1ad 0x1ad 0x2a7 0x2c3 0xae 0x1ae 0x1ae 0x2ad 0x2c5 0xaf 0x1af 0x1af 0x2b3 0x2c6 0xb0 0x1b0 0x1b0 0x2b9 0x2c8 0xb1 0x1b1 0x1b1 0x2bf 0x2c9 0xb2 0x1b2 0x1b2 0x2c5 0x2cb 0xb3 0x1b3 0x1b3 0x2cb 0x2cd 0xb4 0x1b4 0x1b4 0x2d1 0x2cf 0xb5 0x1b5 0x1b5 0x2d7 0x2d0 0xb6 0x1b6 0x1b6 0x2dd 0x2d2 0xb7 0x1b7 0x1b7 0x2e3 0x2d3 0xb8 0x1b8 0x1b8 0x2e9 0x2d5 0xb9 0x1b9 0x1b9 0x2ef 0x2d7 0xba 0x1ba 0x1ba 0x2f5 0x2d8 0xbb 0x1bb 0x1bb 0x2fb 0x2da 0xbc 0x1bc 0x1bc 0x301 0x2db 0xbd 0x1bd 0x1bd 0x307 0x2dd 0xbe 0x1be 0x1be 0x30d 0x2df 0xbf 0x1bf 0x1bf 0x313 0x2e1 0xc0 0x1c0 0x1c0 0x319 0x2e2 0xc1 0x1c1 0x1c1 0x31f 0x2e4 0xc2 0x1c2 0x1c2 0x325 0x2e5 0xc3 0x1c3 0x1c3 0x32b 0x2e7 0xc4 0x1c4 0x1c4 0x331 0x2e9 0xc5 0x1c5 0x1c5 0x337 0x2ea 0xc6 0x1c6 0x1c6 0x33d 0x2ec 0xc7 0x1c7 0x1c7 0x343 0x2ed 0xc8 0x1c8 0x1c8 0x349 0x2ef 0xc9 0x1c9 0x1c9 0x34f 0x2f1 0xca 0x1ca 0x1ca 0x355 0x2f2 0xcb 0x1cb 0x1cb 0x35b 0x2f4 0xcc 0x1cc 0x1cc 0x361 0x2f5 0xcd 0x1cd 0x1cd 0x367 0x2f7 0xce 0x1ce 0x1ce 0x36d 0x2f9 0xcf 0x1cf 0x1cf 0x373 0x2fb 0xd0 0x1d0 0x1d0 0x379 0x2fc 0xd1 0x1d1 0x1d1 0x37f 0x2fe 0xd2 0x1d2 0x1d2 0x385 0x2ff 0xd3 0x1d3 0x1d3 0x38b 0x301 0xd4 0x1d4 0x1d4 0x391 0x303 0xd5 0x1d5 0x1d5 0x397 0x304 0xd6 0x1d6 0x1d6 0x39d 0x306 0xd7 0x1d7 0x1d7 0x3a3 0x307 0xd8 0x1d8 0x1d8 0x3a9 0x309 0xd9 0x1d9 0x1d9 0x3af 0x30b 0xda 0x1da 0x1da 0x3b5 0x30d 0xdb 0x1db 0x1db 0x3bb 0x30e 0xdc 0x1dc 0x1dc 0x3c1 0x310 0xdd 0x1dd 0x1dd 0x3c7 0x311 0xde 0x1de 0x1de 0x3cd 0x313 0xdf 0x1df 0x1df 0x3d3 0x315 0xe0 0x1e0 0x1e0 0x3d9 0x316 0xe1 0x1e1 0x1e1 0x3df 0x318 0xe2 0x1e2 0x1e2 0x3e5 0x319 0xe3 0x1e3 0x1e3 0x3eb 0x31b 0xe4 0x1e4 0x1e4 0x3f1 0x31d 0xe5 0x1e5 0x1e5 0x3f7 0x31f 0xe6 0x1e6 0x1e6 0x3ff 0x320>; + samsung,aod_candela_map_table_revA = <0x0 0x0 0xb 0x1b 0x2 0x1 0xc 0x1f 0x1a 0xa 0x2 0x20 0x36 0x19 0x1e 0x3 0x37 0xff 0x18 0x3c>; + samsung,support_dynamic_mipi_clk; + samsung,ffc_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 2e c5 29 00 00 00 00 00 03 c5 36 41 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,ffc_tx_cmds_revC = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 33 43 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,ffc_tx_cmds_revD = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 32 b1 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revA = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53641 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c535a8 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53741>; + samsung,dyn_mipi_clk_ffc_cmds_revC = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53343 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b2 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53435>; + samsung,dyn_mipi_clk_ffc_cmds_revD = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b1 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53222 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c533a0>; + samsung,dynamic_mipi_clk_timing_table = <0x65fbc9c0 0x671db480 0x6422c400>; + samsung,dynamic_mipi_clk_sel_table = <0x1 0x1 0x0 0x0 0x0 0x1 0x2 0x0 0x0 0x2 0x1 0x3 0x0 0x0 0x2 0x1 0x4 0x0 0x0 0x1 0x2 0xb 0x2942 0x29a2 0x0 0x2 0xb 0x29a3 0x29e8 0x1 0x2 0xb 0x29e9 0x2a56 0x0 0x2 0xc 0x25be 0x26d2 0x0 0x2 0xd 0x48a 0x54d 0x0 0x2 0xd 0x54e 0x593 0x1 0x2 0xd 0x594 0x5e9 0x0 0x2 0xe 0x601 0x661 0x0 0x2 0xe 0x662 0x6a7 0x1 0x2 0xe 0x6a8 0x6ca 0x0 0x2 0xf 0x1105 0x116a 0x0 0x2 0x11 0x8bd 0x8e6 0x0 0x2 0x11 0x8e7 0x92c 0x1 0x2 0x11 0x92d 0xa03 0x0 0x2 0x12 0xb79 0xb86 0x1 0x2 0x12 0xb87 0xb98 0x2 0x2 0x12 0xb99 0xc10 0x0 0x3 0x5b 0x0 0xd9 0x0 0x3 0x5b 0xda 0x165 0x1 0x3 0x5b 0x166 0x257 0x0 0x3 0x5c 0x258 0x26a 0x1 0x3 0x5c 0x26b 0x4a7 0x0 0x3 0x5c 0x4a8 0x4af 0x1 0x3 0x5d 0x4b0 0x64f 0x0 0x3 0x5d 0x650 0x6db 0x1 0x3 0x5d 0x6dc 0x79d 0x0 0x3 0x5e 0x79e 0x877 0x0 0x3 0x5e 0x878 0x903 0x1 0x3 0x5e 0x904 0x95f 0x0 0x3 0x5f 0x960 0xa59 0x0 0x3 0x61 0xabe 0xb29 0x0 0x3 0x61 0xb2a 0xbb5 0x1 0x3 0x61 0xbb6 0xd79 0x0 0x3 0x62 0xd7a 0xdac 0x1 0x3 0x62 0xdad 0xdd1 0x2 0x3 0x62 0xdd2 0xed7 0x0 0x3 0x66 0x1392 0x143b 0x0 0x3 0x67 0x143c 0x149f 0x0 0x3 0x68 0x14a0 0x1503 0x0 0x3 0x6b 0x1662 0x16d9 0x0 0x3 0x6c 0x16da 0x16f2 0x2 0x3 0x6c 0x16f3 0x176f 0x0 0x3 0x6d 0x1770 0x1805 0x0 0x3 0x6e 0x1806 0x1808 0x2 0x3 0x6e 0x1809 0x1931 0x0 0x3 0x6f 0x1932 0x1984 0x1 0x3 0x6f 0x1985 0x19c7 0x0 0x3 0x73 0x1f68 0x1f7a 0x1 0x3 0x73 0x1f7b 0x21b7 0x0 0x3 0x73 0x21b8 0x21f1 0x1 0x3 0x74 0x21f2 0x2214 0x2 0x3 0x74 0x2215 0x234f 0x0 0x3 0x76 0x23fa 0x24ba 0x0 0x3 0x76 0x24bb 0x2511 0x1 0x3 0x76 0x2512 0x2546 0x2 0x3 0x76 0x2547 0x25bb 0x0 0x3 0x77 0x25bc 0x25d9 0x2 0x3 0x77 0x25da 0x2629 0x0 0x3 0x78 0x262a 0x268a 0x1 0x3 0x78 0x268b 0x268d 0x0 0x3 0x7a 0x26c0 0x283d 0x0 0x3 0x7a 0x283e 0x2877 0x1 0x3 0x7c 0x8d68 0x8dfd 0x0 0x3 0x80 0x9376 0x9398 0x1 0x3 0x80 0x9399 0x9569 0x0 0x3 0x81 0x956a 0x96e4 0x0 0x3 0x81 0x96e5 0x96f9 0x1 0x3 0x82 0x96fa 0x98c2 0x0 0x3 0x82 0x98c3 0x994e 0x1 0x3 0x82 0x994f 0x9ae1 0x0 0x3 0x83 0x9ae2 0x9b20 0x1 0x3 0x83 0x9b21 0x9d5c 0x0 0x3 0x83 0x9d5d 0x9de8 0x1 0x3 0x83 0x9de9 0xa025 0x0 0x3 0x83 0xa026 0xa0b1 0x1 0x3 0x83 0xa0b2 0xa275 0x0 0x3 0x84 0xa276 0xa30c 0x0 0x3 0x84 0xa30d 0xa398 0x1 0x3 0x84 0xa399 0xa5d4 0x0 0x3 0x84 0xa5d5 0xa660 0x1 0x3 0x84 0xa661 0xa89d 0x0 0x3 0x84 0xa89e 0xa929 0x1 0x3 0x84 0xa92a 0xaa45 0x0 0x3 0x8a 0xd7c8 0xd813 0x0 0x3 0x8a 0xd814 0xd89f 0x1 0x3 0x8a 0xd8a0 0xdadc 0x0 0x3 0x8a 0xdadd 0xdb68 0x1 0x3 0x8a 0xdb69 0xdda3 0x0 0x3 0x9c 0x10384 0x1045d 0x0 0x3 0x9c 0x1045e 0x104e9 0x1 0x3 0x9c 0x104ea 0x10707 0x0 0x3 0xa1 0x10bea 0x10c9a 0x0 0x3 0xa1 0x10c9b 0x10ce1 0x1 0x3 0xa1 0x10ce2 0x10d26 0x2 0x3 0xa1 0x10d27 0x10d47 0x0 0x4 0x33 0x0 0x0 0x0 0x4 0x34 0x0 0x0 0x0 0x4 0x35 0x0 0x0 0x1 0x4 0x36 0x0 0x0 0x0 0x4 0x37 0x0 0x0 0x2 0x4 0x38 0x0 0x0 0x1 0x5 0x3d 0x0 0x0 0x2 0x5 0x3e 0x0 0x0 0x0 0x5 0x47 0x0 0x0 0x2>; + samsung,fd_on_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 40 40 29 01 00 00 78 00 03 f0 a5 a5]; + samsung,fd_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 80 40 29 01 00 00 78 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 91 01 01 29 00 00 00 00 00 02 53 27 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 3c 0d 00 00 00 00 3c 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 38 00 00 00 18 03 38 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 24 a4 29 01 00 00 00 00 02 f7 0f 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revA = <0x29000000 0x3f0 0x5a5a2900 0x0 0x3910101 0x29010000 0x253 0x26290000 0x2 0xf70f2901 0x1100 0x3f0a5a5>; + samsung,lpm_off_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 40 0d 00 00 00 00 40 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 3d 00 00 00 18 03 3d 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 26 e4 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_60nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 24]; + samsung,lpm_30nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 25]; + samsung,lpm_10nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 26]; + samsung,lpm_2nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 27]; + samsung,lpm_brightnes_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 02 53 26 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xe>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + samsung,ub-con-det = <0xffffffff 0x5 0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "irq_check"; + qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; + samsung,esd-irq-gpio1 = <0xffffffff 0xb 0x0>; + phandle = <0xe>; + + qcom,mdss-dsi-display-timings { + + fhd90 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0xf>; + qcom,mdss-dsi-panel-framerate = <0x5a>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x2590>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 1e 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 54 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 03 60 08 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 5a 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + + fhd60 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0x10>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x3dfa>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 1e 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 54 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 5a 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + + qcom,panel-supply-entries { + #address-cells = <0x1>; + #size-cells = <0x0>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vci"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vddi"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1b7740>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x2>; + }; + }; + }; + }; + }; + + fragment@86 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_PBA_BOOTING_FHD"; + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x0>; + qcom,mdss-dsi-bl-max-level = <0x639c>; + qcom,mdss-brightness-max-level = <0x639c>; + qcom,mdss-dsi-interleave-mode = <0x0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x3c>; + qcom,mdss-pan-physical-height-dimension = <0x6a>; + qcom,mdss-dsi-panel-mode-gpio-state = "invalid"; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + samsung,candela_map_table_revA = <0x0 0x0 0x2 0x5 0x1 0x2 0x2 0x6 0x2 0x3 0x3 0x7 0x3 0x4 0x4 0x8 0x4 0x5 0x5 0x9 0x5 0x6 0x6 0xa 0x6 0x7 0x7 0xb 0x7 0x8 0x8 0xc 0x8 0x9 0x9 0xd 0x9 0xa 0xa 0xe 0xa 0xb 0xb 0xf 0xb 0xc 0xc 0x10 0xc 0xd 0xd 0x11 0xd 0xe 0xe 0x13 0xe 0xf 0xf 0x14 0xf 0x10 0x10 0x15 0x10 0x11 0x11 0x16 0x11 0x12 0x12 0x18 0x12 0x13 0x13 0x19 0x13 0x14 0x14 0x1b 0x14 0x15 0x15 0x1d 0x15 0x16 0x16 0x1e 0x16 0x17 0x18 0x20 0x17 0x19 0x1a 0x22 0x18 0x1b 0x1c 0x25 0x19 0x1d 0x1d 0x27 0x1a 0x1e 0x20 0x29 0x1b 0x21 0x22 0x2c 0x1c 0x23 0x24 0x2f 0x1d 0x25 0x26 0x32 0x1e 0x27 0x28 0x35 0x1f 0x29 0x2b 0x38 0x20 0x2c 0x2e 0x3c 0x21 0x2f 0x31 0x40 0x22 0x32 0x34 0x44 0x23 0x35 0x38 0x48 0x24 0x39 0x3b 0x4d 0x25 0x3c 0x3f 0x52 0x26 0x40 0x43 0x57 0x27 0x44 0x47 0x5d 0x28 0x48 0x4c 0x62 0x29 0x4d 0x50 0x69 0x2a 0x51 0x56 0x6f 0x2b 0x57 0x5b 0x77 0x2c 0x5c 0x61 0x7e 0x2d 0x62 0x68 0x86 0x2e 0x69 0x6e 0x8f 0x2f 0x6f 0x76 0x98 0x30 0x77 0x7d 0xa2 0x31 0x7e 0x85 0xac 0x32 0x86 0x8e 0xb7 0x33 0x8f 0x96 0xc3 0x34 0x97 0xa0 0xcf 0x35 0xa1 0xaa 0xdc 0x36 0xab 0xb5 0xea 0x37 0xb6 0xc1 0xf9 0x38 0xc2 0xcd 0x109 0x39 0xce 0xda 0x11a 0x3a 0xdb 0xe6 0x12c 0x3b 0xe7 0xf2 0x13c 0x3c 0xf3 0xfe 0x14d 0x3d 0xff 0xff 0x168>; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xf>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + phandle = <0xf>; + + qcom,mdss-dsi-display-timings { + + fhd@0 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-front-porch = <0xa4>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-v-back-porch = <0x3>; + qcom,mdss-dsi-v-front-porch = <0x9>; + qcom,mdss-dsi-panel-clockrate = <0x35866480>; + qcom,mdss-dsi-panel-phy-timings = <0x1e0808 0x24220808 0x8020400>; + qcom,mdss-dsi-on-command = [39 01 00 00 78 00 02 11 00]; + qcom,mdss-dsi-off-command = <0x5010000 0x24000128 0x5010000 0x78000110>; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + }; + }; + }; + + fragment@87 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_te { + + sde_te_active { + phandle = <0x9>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + + sde_te_suspend { + phandle = <0xc>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + + pmx_sde { + phandle = <0xcc>; + + sde_dsi_active { + phandle = <0xa>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + bias-disable = <0x0>; + }; + }; + + sde_dsi_suspend { + phandle = <0xd>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable = <0x0>; + }; + }; + }; + }; + }; + + fragment@88 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_ub_det { + + sde_ub_det_default { + pins = "gpio5"; + function = "normal"; + input-enable; + power-source = <0x1>; + bias-disable; + phandle = <0xb>; + }; + }; + }; + }; + + fragment@89 { + target = <0xffffffff>; + + __overlay__ { + + qcom,dsi-display@9 { + label = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + qcom,display-type = "primary"; + phandle = <0xcd>; + }; + + qcom,dsi-display@10 { + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,display-type = "primary"; + phandle = <0xce>; + }; + }; + }; + + fragment@90 { + target = <0xffffffff>; + + __overlay__ { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x2dc6c0>; + regulator-boot-on; + }; + }; + + fragment@91 { + target = <0xffffffff>; + + __overlay__ { + + tsp_int { + phandle = <0x64>; + + mux { + pins = "gpio9"; + function = "gpio"; + }; + + config { + pins = "gpio9"; + input-enable; + bias-disable; + }; + }; + }; + }; + + fragment@92 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + synaptics_tcm@20 { + status = "disabled"; + }; + + atmel_mxt_ts@4a { + status = "disabled"; + }; + + touchscreen@20 { + status = "ok"; + compatible = "zinitix,zt_ts_device"; + reg = <0x20>; + pinctrl-names = "on_state", "off_state"; + pinctrl-0 = <0x64>; + pinctrl-1 = <0x64>; + avdd-supply = <0xffffffff>; + zinitix,gpio_ldo_en; + zinitix,irq_type = <0x2008>; + zinitix,x_resolution = <0x438>; + zinitix,y_resolution = <0x960>; + zinitix,page_size = <0x80>; + zinitix,irq_gpio = <0xffffffff 0x9 0x2008>; + zinitix,chip_name = "ZT7650"; + zinitix,select_lcdid = <0x801000 0x801001 0x801002>; + zinitix,firmware_name = "tsp_zinitix/zt7650_a72.bin", "tsp_zinitix/zt7650_a72.bin", "tsp_zinitix/zt7650_a72_3rd.bin"; + zinitix,spay; + zinitix,aod; + zinitix,aot; + zinitix,mis_cal_check; + support_ear_detect_mode; + support_dex_mode; + zinitix,bringup = <0x0>; + zinitix,ss_touch_num = <0x1>; + phandle = <0xcf>; + }; + + touchscreen@49 { + status = "ok"; + compatible = "stm,fts_touch"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x64>; + avdd-supply = <0xffffffff>; + stm,irq_gpio = <0xffffffff 0x9 0x2008>; + stm,max_coords = <0xfff 0xfff>; + stm,firmware_name = "tsp_stm/fts5cu56a_a72.bin"; + stm,tclm_level = <0x2>; + stm,afe_base = <0x7>; + stm,bringup = <0x0>; + stm,support_fod; + stm,enable_settings_aot; + support_ear_detect; + support_mis_calibration_test; + support_dex_mode; + support_open_short_test; + support_sram_test; + stm,ss_touch_num = <0x1>; + phandle = <0xd0>; + }; + }; + }; + + fragment@93 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + + key_vol_up_default { + pins = "gpio8"; + function = "normal"; + input-enable; + bias-pull-up; + power-source = <0x0>; + phandle = <0x65>; + }; + }; + }; + }; + + fragment@94 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "default"; + pinctrl-0 = <0x65>; + + vol_up { + label = "volume_up"; + gpios = <0xffffffff 0x8 0x1>; + linux,input-type = <0x1>; + linux,code = <0x73>; + debounce-interval = <0xf>; + }; + }; + }; + + fragment@95 { + target = <0xffffffff>; + + __overlay__ { + + ss_touch { + compatible = "samsung,ss_touch"; + ss_touch,numbers = <0x1>; + }; + }; + }; + + fragment@96 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x66>; + status = "okay"; + + sm5714@49 { + status = "okay"; + compatible = "siliconmitus,sm5714mfd"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x67>; + sm5714,irq-gpio = <0xffffffff 0x21 0x0>; + sm5714,wakeup; + }; + }; + }; + + fragment@97 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x68>; + status = "okay"; + + usbpd-sm5714@33 { + status = "okay"; + compatible = "sm5714-usbpd"; + reg = <0x33>; + pinctrl-names = "default"; + pinctrl-0 = <0x69>; + usbpd,usbpd_int = <0xffffffff 0x68 0x0>; + support_pd_role_swap; + + pdic-manager { + pdic,max_power = <0x1388>; + pdic_op_power = <0x9c4>; + pdic_max_voltage = <0x1770>; + pdic_max_current = <0x7d0>; + pdic,min_current = <0x1f4>; + pdic,giveback = <0x0>; + pdic,usb_com_capable = <0x1>; + pdic,no_usb_suspend = <0x1>; + source,max_voltage = <0x1388>; + source,min_voltage = <0xfa0>; + source,max_power = <0x9c4>; + }; + }; + }; + }; + + fragment@98 { + target = <0xffffffff>; + + __overlay__ { + + if_pmic_irq { + + if_pmic_irq_default { + phandle = <0x67>; + + mux { + pins = "gpio33"; + function = "gpio"; + }; + + config { + pins = "gpio33"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + + usbpd_irq { + + usbpd_irq_default { + phandle = <0x69>; + + mux { + pins = "gpio104"; + function = "gpio"; + }; + + config { + pins = "gpio104"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + }; + }; + + fragment@99 { + target = <0xffffffff>; + + __overlay__ { + qcom,qusb-phy-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x15 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x47 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + qcom,qusb-phy-host-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x15 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x47 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + }; + }; + + fragment@100 { + target = <0xffffffff>; + + __overlay__ { + + nfc_qupv3_se0_i2c_sleep { + phandle = <0x6a>; + + mux { + pins = "gpio34", "gpio35"; + function = "gpio"; + }; + + config { + pins = "gpio34", "gpio35"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + nfc_clk_req_gpio { + phandle = <0x6b>; + + mux { + pins = "gpio31"; + function = "gpio"; + }; + + config { + pins = "gpio31"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_irq_gpio { + phandle = <0x6c>; + + mux { + pins = "gpio37"; + function = "gpio"; + }; + + config { + pins = "gpio37"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_ven_gpio { + phandle = <0x6d>; + + mux { + pins = "gpio12"; + function = "gpio"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-high; + }; + }; + + nfc_firm_gpio { + phandle = <0x6e>; + + mux { + pins = "gpio36"; + function = "gpio"; + }; + + config { + pins = "gpio36"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + nfc_ldo_en_gpio { + phandle = <0x6f>; + + mux { + pins = "gpio68"; + function = "gpio"; + }; + + config { + pins = "gpio68"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@101 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + pinctrl-1 = <0x6a>; + qcom,clk-freq-out = <0x61a80>; + + sec-nfc@27 { + compatible = "sec-nfc"; + reg = <0x27>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + sec-nfc,ven-gpio = <0xffffffff 0xc 0x0>; + sec-nfc,irq-gpio = <0xffffffff 0x25 0x0>; + sec-nfc,firm-gpio = <0xffffffff 0x24 0x0>; + sec-nfc,clk_req-gpio = <0xffffffff 0x1f 0x0>; + sec-nfc,pvdd-gpio = <0xffffffff 0x44 0x0>; + sec-nfc,clk_req_wake; + sec-nfc,bootloader_ver = <0x6>; + pinctrl-names = "default"; + pinctrl-0 = <0x6b 0x6c 0x6d 0x6e 0x6f>; + }; + }; + }; + + fragment@102 { + target = <0xffffffff>; + + __overlay__ { + + et7xx_rst { + + et7xx_rst { + phandle = <0x70>; + + mux { + pins = "gpio91"; + function = "gpio"; + }; + + config { + pins = "gpio91"; + driver-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@103 { + target = <0xffffffff>; + + __overlay__ { + regulator-name = "VDD_BTP_3P3"; + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + }; + }; + + fragment@104 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + + etspi,et7xx { + compatible = "etspi,et7xx"; + reg = <0x0>; + spi-max-frequency = <0xbebc20>; + pinctrl-names = "default"; + pinctrl-0 = <0x70>; + gpio-controller; + #gpio-cells = <0x2>; + etspi-regulator = "VDD_BTP_3P3"; + etspi-sleepPin = <0xffffffff 0x5b 0x0>; + etspi-chipid = "ET713"; + etspi-modelinfo = "A725"; + etspi-position = "12.03,0.00,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + etspi-rb = "547,-1,-1,FFFFFF"; + }; + }; + }; + + fragment@105 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@106 { + target = <0xffffffff>; + + __overlay__ { + + qcom,flash_0 { + label = "flash"; + qcom,led-name = "led:flash_0"; + qcom,max-current = <0x5dc>; + qcom,default-led-trigger = "flash0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x5dc>; + qcom,duration-ms = <0x500>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + qcom,record-current-ma = <0xe1>; + phandle = <0x71>; + }; + + qcom,torch_0 { + label = "torch"; + qcom,led-name = "led:torch_0"; + qcom,max-current = <0x1f4>; + qcom,default-led-trigger = "torch0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x12c>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + phandle = <0x72>; + }; + + qcom,camera-flash@0 { + cell-index = <0x0>; + compatible = "qcom,camera-flash"; + flash-source = <0x71>; + torch-source = <0x72>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x7b>; + }; + + qcom,camera-flash@1 { + cell-index = <0x1>; + compatible = "qcom,camera-flash"; + flash-source = <0x71>; + torch-source = <0x72>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x97>; + }; + + qcom,cam-res-mgr { + compatible = "qcom,cam-res-mgr"; + shared-gpios = <0x3f>; + pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; + status = "ok"; + pinctrl-0 = <0x73>; + pinctrl-1 = <0x74>; + }; + }; + }; + + fragment@107 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + sm5714-fled { + compatible = "siliconmitus,sm5714-fled"; + reg = <0x49>; + status = "okay"; + slave-addr = <0x92>; + flash-en-gpio = <0xffffffff 0x16 0x0>; + torch-en-gpio = <0xffffffff 0x43 0x0>; + flash-brightness = <0xf>; + preflash-brightness = <0x7>; + torch-brightness = <0x7>; + factory_current = <0x0>; + timeout = <0xff>; + }; + }; + }; + + fragment@108 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + qcom,ois@62 { + compatible = "qcom,ois"; + cell-index = <0x0>; + reg = <0x62>; + slave-addr = <0xc4>; + slave-id = <0x460>; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x2ab980>; + rgltr-max-voltage = <0x2ab980>; + rgltr-load-current = <0x30d40>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x76 0x77>; + pinctrl-1 = <0x78 0x79>; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x20 0x0 0xffffffff 0x2b 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x0>; + gpio-custom1 = <0x1>; + gpio-vio = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x0 0x0 0x0>; + gpio-req-tbl-label = "MCU_RESET0", "MCU_BOOT0", "MCU_VIO"; + status = "ok"; + phandle = <0x7d>; + }; + }; + }; + + fragment@109 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@0 { + cell-index = <0x0>; + compatible = "qcom,cam-sensor"; + reg = <0x0>; + slave-addr = <0x34>; + csiphy-sd-index = <0x0>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x7a>; + led-flash-src = <0x7b>; + eeprom-src = <0x7c>; + ois-src = <0x7d>; + cam_vio-supply = <0x7e>; + cam_vaf-supply = <0x75>; + cam_vana-supply = <0x7f>; + cam_vdig-supply = <0x80>; + cam_clk-supply = <0xffffffff>; + cam_bob-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vaf", "cam_vana", "cam_vdig", "cam_clk", "cam_bob"; + rgltr-cntrl-support; + pwm-switch; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x2ab980 0xf4240 0x0 0x325aa0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x2c4020 0x10c8e0 0x0 0x325aa0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x30d40 0x0 0x1e8480>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x81 0x82>; + pinctrl-1 = <0x83 0x84>; + gpios = <0xffffffff 0xd 0x0 0xffffffff 0x1e 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x1>; + gpio-custom1 = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_VANA0"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x41>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0xd1>; + }; + + qcom,cam-sensor@2 { + cell-index = <0x2>; + compatible = "qcom,cam-sensor"; + reg = <0x3>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x85>; + cam_vio-supply = <0x7e>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x86 0x87 0x88 0x89>; + pinctrl-1 = <0x8a 0x8b 0x8c 0x8d>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x2D { + cell-index = <0x2>; + compatible = "qcom,eeprom"; + reg = <0x2d>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7e>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x86 0x87 0x88 0x89>; + pinctrl-1 = <0x8a 0x8b 0x8c 0x8d>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + phandle = <0x85>; + }; + }; + }; + + fragment@110 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@1 { + cell-index = <0x1>; + compatible = "qcom,cam-sensor"; + reg = <0x1>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x8e>; + cam_vio-supply = <0x7e>; + cam_vana-supply = <0x8f>; + cam_vdig-supply = <0x90>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x91 0x92>; + pinctrl-1 = <0x93 0x94>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@8 { + cell-index = <0x8>; + compatible = "qcom,cam-sensor"; + reg = <0x8>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x8e>; + cam_vio-supply = <0x7e>; + cam_vana-supply = <0x8f>; + cam_vdig-supply = <0x90>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x91 0x92>; + pinctrl-1 = <0x93 0x94>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@3 { + cell-index = <0x3>; + compatible = "qcom,cam-sensor"; + reg = <0x2>; + slave-addr = <0x42>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x95>; + eeprom-src = <0x96>; + ois-src = <0x7d>; + led-flash-src = <0x97>; + cam_vio-supply = <0x7e>; + cam_vaf-supply = <0x75>; + cam_vdig-supply = <0x98>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vaf", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x10c8e0 0x0>; + rgltr-max-voltage = <0x1b7740 0x2ab980 0x10c8e0 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x99 0x9a 0x9b>; + pinctrl-1 = <0x9c 0x9d 0x9e>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0xd2>; + }; + + qcom,cam-sensor@4 { + cell-index = <0x4>; + compatible = "qcom,cam-sensor"; + reg = <0x4>; + slave-addr = <0x7e>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + led-flash-src = <0x7b>; + eeprom-src = <0x9f>; + cam_vio-supply = <0x7e>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0xa0 0xa1 0xa2 0x89>; + pinctrl-1 = <0xa3 0xa4 0xa5 0x8d>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x4a 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x3F { + cell-index = <0x4>; + compatible = "qcom,eeprom"; + reg = <0x3f>; + slave-addr = <0x7e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7e>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0xa0 0xa1 0xa2 0x89>; + pinctrl-1 = <0xa3 0xa4 0xa5 0x8d>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x4a 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x9f>; + }; + }; + }; + + fragment@111 { + target = <0xffffffff>; + + __overlay__ { + + qcom,actuator@0xC { + cell-index = <0x0>; + reg = <0xc>; + slave-addr = <0x18>; + compatible = "i2c_actuator"; + rgltr-cntrl-support; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vaf"; + rgltr-min-voltage = <0x2ab980>; + rgltr-max-voltage = <0x2ab980>; + rgltr-load-current = <0x30d40>; + phandle = <0x7a>; + }; + + qcom,actuator2 { + cell-index = <0x2>; + compatible = "qcom,actuator"; + reg = <0x1e>; + slave-addr = <0x1e>; + cam_vio-supply = <0x7e>; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vio", "cam_vaf"; + rgltr-min-voltage = <0x1b7740 0x2ab980>; + rgltr-max-voltage = <0x1b7740 0x2ab980>; + rgltr-load-current = <0x1e8480 0x30d40>; + qcom,cam-power-seq-type = "cam_vio", "cam_vaf"; + qcom,cam-power-seq-cfg-val = <0x1 0x1>; + qcom,cam-power-seq-delay = <0x1 0xc>; + cci-master = <0x1>; + status = "ok"; + phandle = <0x95>; + }; + + qcom,eeprom@50 { + cell-index = <0x0>; + reg = <0x50>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa0>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1 0x1>; + qcom,cam-power-seq-delay = <0x2 0x2>; + cam_vaf-supply = <0x75>; + cam_vio-supply = <0x7e>; + regulator-names = "cam_vaf", "cam_vio"; + rgltr-min-voltage = <0x2ab980 0x1b7740>; + rgltr-max-voltage = <0x2ab980 0x1b7740>; + rgltr-load-current = <0x30d40 0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + phandle = <0x7c>; + }; + + qcom,eeprom@51 { + cell-index = <0x1>; + reg = <0x51>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa2>; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x2>; + cam_vio-supply = <0x7e>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-mode = <0x0>; + sensor-position = <0x1>; + rgltr-cntrl-support; + phandle = <0x8e>; + }; + + qcom,eeprom@55 { + cell-index = <0x3>; + reg = <0x55>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xaa>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1 0x1>; + qcom,cam-power-seq-delay = <0x1 0x1>; + cam_vaf-supply = <0x75>; + cam_vio-supply = <0x7e>; + regulator-names = "cam_vaf", "cam_vio"; + rgltr-min-voltage = <0x2ab980 0x1b7740>; + rgltr-max-voltage = <0x2ab980 0x1b7740>; + rgltr-load-current = <0x30d40 0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + phandle = <0x96>; + }; + }; + }; + + fragment@112 { + target = <0xffffffff>; + + __overlay__ { + + samsung,vibrator { + compatible = "samsung_vib"; + samsung,vib_type = "COINDC"; + status = "ok"; + phandle = <0xd3>; + }; + }; + }; + + fragment@113 { + target = <0xffffffff>; + + __overlay__ { + + hall { + status = "okay"; + compatible = "hall"; + linux,input-type = <0x1>; + linux,code = <0x15>; + hall,gpio_flip_cover = <0xffffffff 0xa 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa6>; + }; + + certify_hall { + status = "okay"; + compatible = "certify_hall"; + linux,input-type = <0x1>; + linux,code = <0x1b>; + certify_hall,gpio_certify_cover = <0xffffffff 0x5d 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa7>; + }; + }; + }; + + fragment@114 { + target = <0xffffffff>; + + __overlay__ { + + hall { + + hall_default { + pins = "gpio10"; + function = "normal"; + output-disable; + input-enable; + bias-disable; + power-source = <0x0>; + phandle = <0xa6>; + }; + }; + }; + }; + + fragment@115 { + target = <0xffffffff>; + + __overlay__ { + + certify_hall_default { + phandle = <0xa7>; + + mux { + pins = "gpio93"; + function = "gpio"; + }; + + config { + pins = "gpio93"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + }; + + fragment@116 { + target = <0xffffffff>; + + __overlay__ { + + rpmh-regulator-ldoc8 { + compatible = "qcom,rpmh-vrm-regulator"; + mboxes = <0xffffffff 0x0>; + qcom,resource-name = "ldoc8"; + qcom,regulator-type = "pmic5-ldo"; + qcom,supported-modes = <0x2 0x4>; + qcom,mode-threshold-currents = <0x0 0x1>; + + regulator-pm6150l-l8 { + regulator-name = "pm6150l_l8"; + qcom,set = <0x3>; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + qcom,init-voltage = <0x1b7740>; + regulator-always-on; + qcom,init-mode = <0x2>; + phandle = <0xd4>; + }; + }; + + rpmh-regulator-ldoa5 { + + regulator-pm6150-l5 { + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + regulator-always-on; + phandle = <0xd5>; + }; + }; + + i2c@17 { + status = "ok"; + cell-index = <0x11>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x33 0x0 0xffffffff 0x34 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0xa8>; + phandle = <0xd6>; + + sx9360-i2c@28 { + compatible = "sx9360"; + reg = <0x28>; + pinctrl-names = "default"; + pinctrl-0 = <0xa9>; + interrupt-parent = <0xffffffff>; + interrupts = <0x4 0xc4 0x0 0x2>; + sx9360,nirq-gpio = <0xffffffff 0x5 0x1>; + sx9360,reggnrlctrl2_reg = <0x32>; + sx9360,againfreq_reg = <0x38>; + sx9360,refagainfreq_reg = <0x36>; + sx9360,gainrawfilt_reg = <0x1a>; + sx9360,refgainrawfilt_reg = <0x22>; + sx9360,proxthresh_reg = <0x22>; + sx9360,hyst_reg = <0x15>; + sx9360,regproxctrl3_reg = <0xc>; + sx9360,resolution_reg = <0xf>; + sx9360,refresolution_reg = <0xf>; + sx9360,hallic_cert_detect = <0x1>; + }; + }; + }; + }; + + fragment@117 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + + sm5440@63 { + status = "okay"; + compatible = "siliconmitus,sm5440"; + reg = <0x63>; + pinctrl-names = "default"; + }; + }; + }; + + fragment@118 { + target = <0xffffffff>; + + __overlay__ { + + bat_thm { + label = "bat_thm"; + reg = <0x4f>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + + chg_thm { + label = "chg_thm"; + reg = <0x4d>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + }; + }; + + fragment@119 { + target = <0xffffffff>; + + __overlay__ { + + sec-direct-charger { + status = "okay"; + compatible = "samsung,sec-direct-charger"; + charger,battery_name = "battery"; + charger,main_charger = "sm5714-charger"; + charger,direct_charger = "sm5440-charger"; + charger,dchg_min_current = <0x7d0>; + charger,dchg_temp_low_threshold = <0xb4>; + charger,dchg_temp_high_threshold = <0x1a4>; + }; + + battery { + pinctrl-names = "default"; + battery,chip_vendor = "QCOM"; + status = "okay"; + compatible = "samsung,sec-battery"; + battery,vendor = "Battery"; + battery,charger_name = "sec-direct-charger"; + battery,fuelgauge_name = "sm5714-fuelgauge"; + battery,fgsrc_switch_name = "sm5714-fuelgauge"; + battery,technology = <0x2>; + battery,batt_data_version = <0x1>; + battery,temp_adc_type = <0x1>; + battery,temp_channel_raw = <0x1>; + battery,adc_check_count = <0x5>; + battery,temp_check_type = <0x1>; + battery,chg_temp_check_type = <0x1>; + battery,thermal_source = <0x2>; + battery,chg_thermal_source = <0x2>; + battery,temp_table_adc = <0x7e4 0x941 0xada 0xcc1 0xef2 0x1188 0x1493 0x1821 0x1c49 0x20dc 0x25dc 0x2b94 0x31b1 0x3854 0x3ef2 0x4588 0x4bdd 0x51ec 0x5781 0x5c85 0x60b2 0x6456 0x675a>; + battery,temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,chg_temp_table_adc = <0x761 0x8c1 0xa5c 0xc35 0xe5d 0x10e2 0x13e6 0x1766 0x1b85 0x200c 0x2503 0x2ab1 0x30cc 0x3774 0x3e15 0x44b0 0x4b25 0x5141 0x56de 0x5bf6 0x6042 0x63fd 0x6711>; + battery,chg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,polling_time = <0xa 0x1e 0x1e 0x1e 0xe10>; + battery,cable_check_type = <0x4>; + battery,cable_source_type = <0x1>; + battery,polling_type = <0x1>; + battery,monitor_initial_count = <0x0>; + battery,battery_check_type = <0x0>; + battery,ovp_uvlo_check_type = <0x3>; + battery,temp_check_count = <0x1>; + battery,overheatlimit_threshold = <0x2bc>; + battery,overheatlimit_recovery = <0x2a8>; + battery,wire_warm_overheat_thresh = <0x1f4>; + battery,wire_normal_warm_thresh = <0x1a4>; + battery,wire_cool1_normal_thresh = <0xb4>; + battery,wire_cool2_cool1_thresh = <0x96>; + battery,wire_cool3_cool2_thresh = <0x32>; + battery,wire_cold_cool3_thresh = <0x0>; + battery,wire_warm_current = <0x6c6>; + battery,wire_cool1_current = <0xa8c>; + battery,wire_cool2_current = <0x485>; + battery,wire_cool3_current = <0x1e5>; + battery,low_temp_topoff = <0xfa>; + battery,high_temp_topoff = <0xfa>; + battery,low_temp_float = <0x111c>; + battery,high_temp_float = <0x1036>; + battery,full_check_type = <0x7>; + battery,full_check_type_2nd = <0x7>; + battery,full_check_count = <0x1>; + battery,chg_gpio_full_check = <0x0>; + battery,chg_high_temp = <0x28a>; + battery,chg_high_temp_recovery = <0x276>; + battery,chg_input_limit_current = <0x3e8>; + battery,chg_charging_limit_current = <0x578>; + battery,wpc_temp_control_source = <0x1>; + battery,wpc_high_temp = <0x17c>; + battery,wpc_high_temp_recovery = <0x168>; + battery,wpc_input_limit_current = <0x258>; + battery,wpc_charging_limit_current = <0x3e8>; + battery,wpc_temp_lcd_on_control_source = <0x1>; + battery,wpc_lcd_on_high_temp = <0x17c>; + battery,wpc_lcd_on_high_temp_rec = <0x168>; + battery,wpc_lcd_on_input_limit_current = <0x1c2>; + battery,wpc_store_high_temp = <0x168>; + battery,wpc_store_high_temp_recovery = <0x154>; + battery,wpc_store_charging_limit_current = <0x190>; + battery,wpc_store_lcd_on_high_temp = <0x168>; + battery,wpc_store_lcd_on_high_temp_rec = <0x12c>; + battery,wpc_store_lcd_on_charging_limit_current = <0x190>; + battery,sleep_mode_limit_current = <0x1f4>; + battery,wc_full_input_limit_current = <0x64>; + battery,mix_high_temp = <0x1cc>; + battery,mix_high_chg_temp = <0x1f4>; + battery,mix_high_temp_recovery = <0x1c2>; + battery,full_condition_type = <0x9>; + battery,full_condition_soc = <0x5d>; + battery,full_condition_vcell = <0x10ea>; + battery,recharge_check_count = <0x1>; + battery,recharge_condition_type = <0x4>; + battery,recharge_condition_soc = <0x62>; + battery,recharge_condition_vcell = <0x10d6>; + battery,charging_total_time = <0x3840>; + battery,hv_charging_total_time = <0x2a30>; + battery,normal_charging_total_time = <0x4650>; + battery,usb_charging_total_time = <0x8ca0>; + battery,recharging_total_time = <0x1518>; + battery,charging_reset_time = <0x0>; + battery,chg_float_voltage = <0x111c>; + battery,pre_afc_work_delay = <0x7d0>; + battery,pre_wc_afc_work_delay = <0xfa0>; + battery,pre_afc_input_current = <0x1f4>; + battery,pre_wc_afc_input_current = <0x1f4>; + battery,prepare_ta_delay = <0x0>; + battery,swelling_high_rechg_voltage = <0xfa0>; + battery,swelling_low_rechg_voltage = <0x1086>; + battery,siop_input_limit_current = <0x4b0>; + battery,siop_charging_limit_current = <0x3e8>; + battery,siop_hv_input_limit_current = <0x2bc>; + battery,siop_hv_input_limit_current_2nd = <0x226>; + battery,siop_hv_charging_limit_current = <0x3e8>; + battery,ttf_hv_charge_current = <0x992>; + battery,ttf_dc25_charge_current = <0xe42>; + battery,rp_current_rp1 = <0x1f4>; + battery,rp_current_rp2 = <0x5dc>; + battery,rp_current_rp3 = <0xbb8>; + battery,rp_current_rdu_rp3 = <0x834>; + battery,rp_current_abnormal_rp3 = <0x708>; + battery,pd_charging_charge_power = <0x3a98>; + battery,max_charging_current = <0xa8c>; + battery,wireless_cc_cv = <0x55>; + battery,wireless_otg_input_current = <0x384>; + battery,age_data = <0x0 0x111c 0x10d6 0x10b8 0x5d 0x12c 0x1108 0x10c2 0x10a4 0x5c 0x190 0x10f4 0x10ae 0x1090 0x5b 0x2bc 0x10e0 0x109a 0x107c 0x5a 0x3e8 0x10ae 0x1068 0x104a 0x59>; + battery,health_condition = <0x384 0x0 0x4b0 0x0 0x5dc 0x0>; + battery,step_charging_type = <0x0>; + battery,step_charging_charge_power = <0x2ee0>; + battery,step_charging_condition = <0x2d 0x64>; + battery,step_charging_condition_curr = <0xa8c 0xa8c>; + battery,step_charging_current = <0xa8c 0xa8c>; + battery,step_charging_float_voltage = <0x1036 0x111c>; + battery,dc_step_chg_type = <0xe9>; + battery,dc_step_chg_charge_power = <0x55f0>; + battery,dc_step_chg_step = <0x3>; + battery,dc_step_chg_cond_vol = <0x1004 0x1086 0x111c>; + battery,dc_step_chg_cond_iin = <0x802 0x79e 0x0>; + battery,dc_step_chg_iin_check_cnt = <0x3>; + battery,dc_step_chg_cond_soc = <0x14 0x3c 0x64>; + battery,dc_step_chg_val_vfloat = <0x1004 0x1086 0x111c>; + battery,dc_step_chg_val_iout = <0x13ec 0x1004 0xf3c>; + battery,standard_curr = <0xf3c>; + battery,expired_time = <0x288c>; + battery,recharging_expired_time = <0x1518>; + battery,battery_full_capacity = <0x1388>; + battery,cisd_max_voltage_thr = <0x1388>; + battery,max_input_voltage = <0x2328>; + battery,max_input_current = <0xbb8>; + battery,cisd_alg_index = <0x8>; + battery,ignore_cisd_index = <0x0 0x3c0>; + battery,ignore_cisd_index_d = <0x0 0x78>; + battery,ttf_capacity = <0x10cc>; + battery,cv_data = <0xa59 0x367 0x546 0xa1a 0x370 0x502 0x960 0x37b 0x4c5 0x8cf 0x384 0x485 0x828 0x38f 0x43a 0x79f 0x398 0x3f1 0x717 0x3a2 0x3b1 0x676 0x3ad 0x33e 0x5e0 0x3b6 0x2e0 0x531 0x3c1 0x263 0x4a2 0x3ca 0x1f8 0x406 0x3df 0xf5 0x387 0x3de 0xb8 0x2f4 0x3e8 0x0>; + io-channels = <0xffffffff 0x4f 0xffffffff 0x4d>; + io-channel-names = "adc-temp", "adc-chg-temp"; + }; + + sm5714-fuelgauge { + status = "okay"; + fuelgauge,fuel_alert_soc = <0x1>; + fuelgauge,capacity_max = <0x3e8>; + fuelgauge,capacity_max_margin = <0x12c>; + fuelgauge,capacity_min = <0x0>; + fuelgauge,capacity_calculation_type = <0x1f>; + fuelgauge,using_temp_compensation; + fuelgauge,low_temp_limit = <0x64>; + fuelgauge,using_hw_vempty; + fuelgauge,sw_v_empty_voltage = <0xc80>; + fuelgauge,sw_v_empty_voltage_cisd = <0xc1c>; + fuelgauge,sw_v_empty_recover_voltage = <0xd98>; + fuelgauge,capacity = <0x1388>; + + battery_params { + battery,id = <0x0>; + battery0,battery_type = <0x114e 0x21b3>; + battery0,battery_table0 = <0x1400 0x1b77 0x1c40 0x1ccb 0x1d31 0x1d6f 0x1d81 0x1d88 0x1da0 0x1de3 0x1e1f 0x1e45 0x1e5e 0x1e7e 0x1ebc 0x1efb 0x1f27 0x1faf 0x2009 0x209b 0x2103 0x218b 0x227c 0x2400>; + battery0,battery_table1 = <0x0 0x99 0x1b3 0x2cc 0x3e6 0x500 0x7b3 0xa80 0xd4c 0x12cc 0x1b19 0x2099 0x2619 0x2b99 0x3133 0x36b3 0x3980 0x3f00 0x4480 0x4ccc 0x524c 0x58e6 0x6400 0x6419>; + battery0,battery_table2 = <0x4b4b 0x4444 0x4040 0x3e3e 0x3c3c 0x3b3b 0x3838 0x3737 0x3535 0x3434 0x3434 0x3333 0x3333 0x3333 0x3333 0x3232>; + battery0,rs_value = <0xa3 0xa3 0x3800 0x200 0x599 0x599 0x100>; + battery0,v_alarm = <0xc1c 0xc8>; + battery0,topoff = <0x2ee>; + battery0,i_cal = <0x0 0x0 0x800 0x800 0x0 0x0 0x800 0x81e>; + battery0,v_cal = <0x1 0x0 0x0 0x1 0x0 0x0 0x0>; + battery0,temp_std = <0x19>; + battery0,tem_poff = <0xd48 0x32 0xcb2 0x32>; + battery0,aux_ctrl = <0x322 0x5800>; + battery0,data_ver = <0x9>; + battery0,v_max_table = <0x227c 0x225f 0x2243 0x2226 0x21d9>; + battery0,q_max_table = <0x21b3 0x210d 0x2068 0x1fc2 0x1e23>; + }; + }; + + cable-info { + default_input_current = <0x708>; + default_charging_current = <0x834>; + full_check_current_1st = <0x2ee>; + full_check_current_2nd = <0xfa>; + + current_group_1 { + cable_number = <0x2 0x13 0x15 0x16 0x17 0x1e>; + input_current = <0x1f4>; + charging_current = <0x1f4>; + }; + + current_group_2 { + cable_number = <0x19 0x1f>; + input_current = <0x3e8>; + charging_current = <0x3e8>; + }; + + current_group_3 { + cable_number = <0x5 0x20>; + input_current = <0x5dc>; + charging_current = <0x5dc>; + }; + + current_group_4 { + cable_number = <0x6 0x7 0x8 0x11 0x12>; + input_current = <0x672>; + charging_current = <0xa8c>; + }; + + current_group_5 { + cable_number = <0x9>; + input_current = <0x672>; + charging_current = <0x960>; + }; + + current_group_6 { + cable_number = <0xa 0xc 0xf 0x1b 0x21 0x24>; + input_current = <0x320>; + charging_current = <0x960>; + }; + + current_group_7 { + cable_number = <0xd>; + input_current = <0x2bc>; + charging_current = <0x960>; + }; + + current_group_8 { + cable_number = <0x18>; + input_current = <0x3e8>; + charging_current = <0x1c2>; + }; + + current_group_9 { + cable_number = <0x23>; + input_current = <0x708>; + charging_current = <0x708>; + }; + + current_group_10 { + cable_number = <0xb 0xe 0x10 0x1c 0x23>; + input_current = <0x28a>; + charging_current = <0x960>; + }; + + current_group_11 { + cable_number = <0x1d 0x25>; + input_current = <0x1f4>; + charging_current = <0x4b0>; + }; + + current_group_12 { + cable_number = <0x1 0x4>; + input_current = <0x1db>; + charging_current = <0x226>; + }; + + current_group_13 { + cable_number = <0x22>; + input_current = <0x4b0>; + charging_current = <0x960>; + }; + }; + }; + }; + + __symbols__ { + dsi_rm69299_visionox_amoled_video = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video"; + dsi_rm69299_visionox_amoled_cmd = "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd"; + dsi_sim_vid = "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video"; + dsi_sim_cmd = "/fragment@3/__overlay__/qcom,mdss_dsi_sim_cmd"; + dsi_sim_dsc_375_cmd = "/fragment@4/__overlay__/qcom,mdss_dsi_sim_dsc_375_cmd"; + dsi_nt36672c_video = "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video"; + dsi_panel_pwr_supply = "/fragment@6/__overlay__/dsi_panel_pwr_supply"; + dsi_panel_pwr_supply_no_labibb = "/fragment@6/__overlay__/dsi_panel_pwr_supply_no_labibb"; + dsi_panel_pwr_supply_labibb_amoled = "/fragment@6/__overlay__/dsi_panel_pwr_supply_labibb_amoled"; + dsi_rm69299_visionox_amoled_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@0"; + dsi_rm69299_visionox_amoled_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@1"; + dsi_sim_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@2"; + dsi_sim_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@3"; + dsi_sim_dsc_375_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@4"; + dsi_nt36672c_video_display = "/fragment@6/__overlay__/qcom,dsi-display@5"; + sde_dsi = "/fragment@6/__overlay__/qcom,dsi-display"; + sde_wb = "/fragment@6/__overlay__/qcom,wb-display@0"; + ext_disp = "/fragment@6/__overlay__/qcom,msm-ext-disp"; + ext_disp_audio_codec = "/fragment@6/__overlay__/qcom,msm-ext-disp/qcom,msm-ext-disp-audio-codec-rx"; + mtp_batterydata = "/fragment@11/__overlay__/qcom,battery-data"; + lpi_tlmm = "/fragment@27/__overlay__/lpi_pinctrl@627C0000"; + cdc_dmic01_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_active"; + cdc_dmic01_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_sleep"; + cdc_dmic01_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_active"; + cdc_dmic01_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_sleep"; + cdc_dmic23_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_active"; + cdc_dmic23_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_sleep"; + cdc_dmic23_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_active"; + cdc_dmic23_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_sleep"; + cdc_dmic45_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_active"; + cdc_dmic45_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_sleep"; + cdc_dmic45_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_active"; + cdc_dmic45_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_sleep"; + tx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_sleep"; + tx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_active"; + tx_swr_data0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_sleep"; + tx_swr_data0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_active"; + wsa_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_sleep"; + wsa_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_active"; + wsa_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_sleep"; + wsa_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_active"; + tx_swr_data1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_sleep"; + tx_swr_data1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_active"; + tx_swr_data2_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_sleep"; + tx_swr_data2_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_active"; + rx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_sleep"; + rx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_active"; + rx_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_sleep"; + rx_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_active"; + lpi_i2s1_sck_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_active"; + lpi_i2s1_sck_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_sleep"; + lpi_i2s1_ws_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_active"; + lpi_i2s1_ws_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_sleep"; + lpi_i2s1_sd0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_active"; + lpi_i2s1_sd0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_sleep"; + lpi_i2s1_sd1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_active"; + lpi_i2s1_sd1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_sleep"; + tx_macro = "/fragment@28/__overlay__/tx-macro@62620000"; + swr2 = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master"; + wcd938x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd938x-tx-slave"; + wcd937x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd937x-tx-slave"; + rx_macro = "/fragment@28/__overlay__/rx-macro@62600000"; + swr1 = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master"; + wcd938x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd938x-rx-slave"; + wcd937x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd937x-rx-slave"; + wsa_macro = "/fragment@28/__overlay__/wsa-macro@62640000"; + swr0 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master"; + wsa881x_0211 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211"; + wsa881x_0212 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212"; + wsa881x_0213 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213"; + wsa881x_0214 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214"; + va_macro = "/fragment@28/__overlay__/va-macro@62770000"; + wcd938x_codec = "/fragment@28/__overlay__/wcd938x-codec"; + wcd937x_codec = "/fragment@28/__overlay__/wcd937x-codec"; + cdc_dmic01_gpios = "/fragment@30/__overlay__/cdc_dmic01_pinctrl"; + cdc_dmic23_gpios = "/fragment@30/__overlay__/cdc_dmic23_pinctrl"; + cdc_dmic45_gpios = "/fragment@30/__overlay__/cdc_dmic45_pinctrl"; + wsa_swr_gpios = "/fragment@30/__overlay__/wsa_swr_clk_data_pinctrl"; + rx_swr_gpios = "/fragment@30/__overlay__/rx_swr_clk_data_pinctrl"; + tx_swr_gpios = "/fragment@30/__overlay__/tx_swr_clk_data_pinctrl"; + wsa_spkr_en1 = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl"; + wsa_spkr_en2 = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl"; + wcd_rst_gpio = "/fragment@31/__overlay__/msm_cdc_pinctrl@58"; + clock_audio_wsa_1 = "/fragment@31/__overlay__/wsa_core_clk"; + clock_audio_wsa_2 = "/fragment@31/__overlay__/wsa_npl_clk"; + clock_audio_rx_1 = "/fragment@31/__overlay__/rx_core_clk"; + clock_audio_rx_2 = "/fragment@31/__overlay__/rx_npl_clk"; + clock_audio_tx_1 = "/fragment@31/__overlay__/tx_core_clk"; + clock_audio_tx_2 = "/fragment@31/__overlay__/tx_npl_clk"; + clock_audio_va_1 = "/fragment@31/__overlay__/va_core_clk"; + clock_audio_va_2 = "/fragment@31/__overlay__/va_npl_clk"; + qupv3_se8_2hsuart = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000"; + qupv3_se8_2hsuart_pins = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins"; + qupv3_se8_2uart_tx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_active"; + qupv3_se8_2uart_rx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_active"; + qupv3_se8_2uart_tx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_sleep"; + qupv3_se8_2uart_rx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_sleep"; + sec_debug_region = "/fragment@37/__overlay__/sec_debug_region@0"; + sec_debug_autocomment = "/fragment@37/__overlay__/sec_debug_autocomment@0"; + sec_debug_rdx_bootdev = "/fragment@37/__overlay__/sec_debug_rdx_bootdev@0"; + kaslr_region = "/fragment@37/__overlay__/kaslr_region@A0001000"; + rkp_region = "/fragment@37/__overlay__/rkp_region@B0200000"; + hdm_region = "/fragment@37/__overlay__/hdm_region@A1000000"; + modem_shared_mem = "/fragment@37/__overlay__/modem_shared_mem_region@B5000000"; + usb_noti = "/fragment@60/__overlay__/usb-notifier"; + camera_mem = "/fragment@65/__overlay__/camera_mem_region"; + imp_list = "/fragment@68/__overlay__/imp_list"; + cdc_quin_mi2s_gpios = "/fragment@69/__overlay__/msm_cdc_pinctrl_quin"; + samsung_q6audio_adaptation = "/fragment@70/__overlay__/samsung,q6audio-adaptation"; + det_zones = "/fragment@70/__overlay__/det_zones"; + i2c_18 = "/fragment@70/__overlay__/i2c@18"; + tas256x = "/fragment@70/__overlay__/i2c@18/tas256x@4c"; + tas25xx_gpio_default = "/fragment@73/__overlay__/tas25xx_gpio_default"; + fm_lna_default = "/fragment@73/__overlay__/fm_lna_default"; + grip_i2c_active = "/fragment@74/__overlay__/grip_i2c/grip_i2c_active"; + grip_i2c_suspend = "/fragment@74/__overlay__/grip_i2c/grip_i2c_suspend"; + s2mpb03_i2c_sda_default = "/fragment@74/__overlay__/s2mpb03_i2c_sda_default"; + s2mpb03_i2c_scl_default = "/fragment@74/__overlay__/s2mpb03_i2c_scl_default"; + cam_sensor_mclk0_active = "/fragment@74/__overlay__/cam_sensor_mclk0_active"; + cam_sensor_mclk0_suspend = "/fragment@74/__overlay__/cam_sensor_mclk0_suspend"; + cam_sensor_mclk1_active = "/fragment@74/__overlay__/cam_sensor_mclk1_active"; + cam_sensor_mclk1_suspend = "/fragment@74/__overlay__/cam_sensor_mclk1_suspend"; + cam_sensor_mclk2_active = "/fragment@74/__overlay__/cam_sensor_mclk2_active"; + cam_sensor_mclk2_suspend = "/fragment@74/__overlay__/cam_sensor_mclk2_suspend"; + cam_sensor_mclk3_active = "/fragment@74/__overlay__/cam_sensor_mclk3_active"; + cam_sensor_mclk3_suspend = "/fragment@74/__overlay__/cam_sensor_mclk3_suspend"; + cam_sensor_mclk4_active = "/fragment@74/__overlay__/cam_sensor_mclk4_active"; + cam_sensor_mclk4_suspend = "/fragment@74/__overlay__/cam_sensor_mclk4_suspend"; + rcam1_sensor_reset_active = "/fragment@74/__overlay__/rcam1_sensor_reset_active"; + rcam1_sensor_reset_suspend = "/fragment@74/__overlay__/rcam1_sensor_reset_suspend"; + front_sensor_reset_active = "/fragment@74/__overlay__/front_sensor_reset_active"; + front_sensor_reset_suspend = "/fragment@74/__overlay__/front_sensor_reset_suspend"; + rcam3_sensor_reset_active = "/fragment@74/__overlay__/rcam3_sensor_reset_active"; + rcam3_sensor_reset_suspend = "/fragment@74/__overlay__/rcam3_sensor_reset_suspend"; + rcam2_sensor_reset_active = "/fragment@74/__overlay__/rcam2_sensor_reset_active"; + rcam2_sensor_reset_suspend = "/fragment@74/__overlay__/rcam2_sensor_reset_suspend"; + rcam4_sensor_reset_active = "/fragment@74/__overlay__/rcam4_sensor_reset_active"; + rcam4_sensor_reset_suspend = "/fragment@74/__overlay__/rcam4_sensor_reset_suspend"; + rcam1_sensor_vana_active = "/fragment@74/__overlay__/rcam1_sensor_vana_active"; + rcam1_sensor_vana_suspend = "/fragment@74/__overlay__/rcam1_sensor_vana_suspend"; + rcam2_sensor_vana_active = "/fragment@74/__overlay__/rcam2_sensor_vana_active"; + rcam2_sensor_vana_suspend = "/fragment@74/__overlay__/rcam2_sensor_vana_suspend"; + rcam3_sensor_vana_active = "/fragment@74/__overlay__/rcam3_sensor_vana_active"; + rcam3_sensor_vana_suspend = "/fragment@74/__overlay__/rcam3_sensor_vana_suspend"; + rcam4_sensor_vana_active = "/fragment@74/__overlay__/rcam4_sensor_vana_active"; + rcam4_sensor_vana_suspend = "/fragment@74/__overlay__/rcam4_sensor_vana_suspend"; + cam_mipi_sel_active = "/fragment@74/__overlay__/cam_mipi_sel_active"; + cam_mipi_sel_suspend = "/fragment@74/__overlay__/cam_mipi_sel_suspend"; + rcam3_sensor_vdig_active = "/fragment@74/__overlay__/rcam3_sensor_vdig_active"; + rcam3_sensor_vdig_suspend = "/fragment@74/__overlay__/rcam3_sensor_vdig_suspend"; + rcam4_sensor_vdig_active = "/fragment@74/__overlay__/rcam4_sensor_vdig_active"; + rcam4_sensor_vdig_suspend = "/fragment@74/__overlay__/rcam4_sensor_vdig_suspend"; + if_pmic_i2c_pins = "/fragment@74/__overlay__/if_pmic_i2c_pins"; + if_pmic_i2c_sleep = "/fragment@74/__overlay__/if_pmic_i2c_pins/if_pmic_i2c_sleep"; + usbpd_i2c_pins = "/fragment@74/__overlay__/usbpd_i2c_pins"; + usbpd_i2c_sleep = "/fragment@74/__overlay__/usbpd_i2c_pins/usbpd_i2c_sleep"; + mcu_reset_active = "/fragment@74/__overlay__/mcu_reset_active"; + mcu_reset_suspend = "/fragment@74/__overlay__/mcu_reset_suspend"; + mcu_clk_active = "/fragment@74/__overlay__/mcu_clk_active"; + mcu_clk_suspend = "/fragment@74/__overlay__/mcu_clk_suspend"; + grip_int_active = "/fragment@75/__overlay__/grip_int_active"; + grip_int_suspend = "/fragment@75/__overlay__/grip_int_suspend"; + i2c2 = "/fragment@80/__overlay__/i2c@2"; + s2mpb03_l1 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo1"; + s2mpb03_l2 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo2"; + s2mpb03_l3 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo3"; + s2mpb03_l4 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo4"; + s2mpb03_l5 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo5"; + s2mpb03_l6 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo6"; + s2mpb03_l7 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo7"; + self_display_FC3_dtsi = "/fragment@84/__overlay__/self_display_FC3_dtsi"; + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD = "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + ss_dsi_panel_PBA_BOOTING_FHD = "/fragment@86/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD"; + sde_te_active = "/fragment@87/__overlay__/pmx_sde_te/sde_te_active"; + sde_te_suspend = "/fragment@87/__overlay__/pmx_sde_te/sde_te_suspend"; + pmx_sde = "/fragment@87/__overlay__/pmx_sde"; + sde_dsi_active = "/fragment@87/__overlay__/pmx_sde/sde_dsi_active"; + sde_dsi_suspend = "/fragment@87/__overlay__/pmx_sde/sde_dsi_suspend"; + sde_ub_det_default = "/fragment@88/__overlay__/pmx_sde_ub_det/sde_ub_det_default"; + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD_display = "/fragment@89/__overlay__/qcom,dsi-display@9"; + ss_dsi_panel_PBA_BOOTING_FHD_display = "/fragment@89/__overlay__/qcom,dsi-display@10"; + tsp_int = "/fragment@91/__overlay__/tsp_int"; + tsp_zt = "/fragment@92/__overlay__/touchscreen@20"; + tsp_stm = "/fragment@92/__overlay__/touchscreen@49"; + key_vol_up_default = "/fragment@93/__overlay__/key_vol_up/key_vol_up_default"; + if_pmic_irq_default = "/fragment@98/__overlay__/if_pmic_irq/if_pmic_irq_default"; + usbpd_irq_default = "/fragment@98/__overlay__/usbpd_irq/usbpd_irq_default"; + nfc_qupv3_se0_i2c_sleep = "/fragment@100/__overlay__/nfc_qupv3_se0_i2c_sleep"; + nfc_clk_req_gpio = "/fragment@100/__overlay__/nfc_clk_req_gpio"; + nfc_irq_gpio = "/fragment@100/__overlay__/nfc_irq_gpio"; + nfc_ven_gpio = "/fragment@100/__overlay__/nfc_ven_gpio"; + nfc_firm_gpio = "/fragment@100/__overlay__/nfc_firm_gpio"; + nfc_ldo_en_gpio = "/fragment@100/__overlay__/nfc_ldo_en_gpio"; + et7xx_rst = "/fragment@102/__overlay__/et7xx_rst/et7xx_rst"; + sm5714_flash0 = "/fragment@106/__overlay__/qcom,flash_0"; + sm5714_torch0 = "/fragment@106/__overlay__/qcom,torch_0"; + led_flash0 = "/fragment@106/__overlay__/qcom,camera-flash@0"; + led_flash1 = "/fragment@106/__overlay__/qcom,camera-flash@1"; + ois_rear = "/fragment@108/__overlay__/qcom,ois@62"; + sensor_rear = "/fragment@109/__overlay__/qcom,cam-sensor@0"; + eeprom2 = "/fragment@109/__overlay__/qcom,eeprom@0x2D"; + sensor_rear_tele = "/fragment@110/__overlay__/qcom,cam-sensor@3"; + eeprom4 = "/fragment@110/__overlay__/qcom,eeprom@0x3F"; + actuator_rear0 = "/fragment@111/__overlay__/qcom,actuator@0xC"; + actuator_rear_tele = "/fragment@111/__overlay__/qcom,actuator2"; + eeprom0 = "/fragment@111/__overlay__/qcom,eeprom@50"; + eeprom1 = "/fragment@111/__overlay__/qcom,eeprom@51"; + eeprom3 = "/fragment@111/__overlay__/qcom,eeprom@55"; + vibrator = "/fragment@112/__overlay__/samsung,vibrator"; + hall_default = "/fragment@114/__overlay__/hall/hall_default"; + certify_hall_default = "/fragment@115/__overlay__/certify_hall_default"; + L8C = "/fragment@116/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150l_l8 = "/fragment@116/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150_l5 = "/fragment@116/__overlay__/rpmh-regulator-ldoa5/regulator-pm6150-l5"; + i2c_17 = "/fragment@116/__overlay__/i2c@17"; + }; + + __fixups__ { + mdss_mdp = "/fragment@0:target:0", "/fragment@1:target:0", "/fragment@2:target:0", "/fragment@3:target:0", "/fragment@4:target:0", "/fragment@5:target:0", "/fragment@8:target:0", "/fragment@10:target:0", "/fragment@85:target:0", "/fragment@86:target:0"; + tlmm = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-te-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-te-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-te-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-te-gpio:0", "/fragment@7/__overlay__:qcom,usbplug-cc-gpio:0", "/fragment@17/__overlay__:cd-gpios:0", "/fragment@24/__overlay__/synaptics_tcm@20:interrupt-parent:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,irq-gpio:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,reset-gpio:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:interrupt-parent:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:reset-gpios:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:irq-gpios:0", "/fragment@25/__overlay__/nq@28:qcom,nq-irq:0", "/fragment@25/__overlay__/nq@28:qcom,nq-ven:0", "/fragment@25/__overlay__/nq@28:qcom,nq-firm:0", "/fragment@25/__overlay__/nq@28:qcom,nq-clkreq:0", "/fragment@25/__overlay__/nq@28:interrupt-parent:0", "/fragment@35:target:0", "/fragment@70/__overlay__/i2c@18:gpios:0", "/fragment@70/__overlay__/i2c@18:gpios:12", "/fragment@70/__overlay__/i2c@18/tas256x@4c:ti,reset-gpio:0", "/fragment@70/__overlay__/i2c@18/tas256x@4c:ti,irq-gpio:0", "/fragment@71/__overlay__:qcom,fm-lna-gpios:0", "/fragment@73:target:0", "/fragment@74:target:0", "/fragment@76:target:0", "/fragment@80/__overlay__/i2c@2:gpios:0", "/fragment@80/__overlay__/i2c@2:gpios:12", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:qcom,platform-reset-gpio:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:qcom,platform-te-gpio:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:samsung,esd-irq-gpio1:0", "/fragment@86/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD:qcom,platform-reset-gpio:0", "/fragment@87:target:0", "/fragment@91:target:0", "/fragment@92/__overlay__/touchscreen@20:zinitix,irq_gpio:0", "/fragment@92/__overlay__/touchscreen@49:stm,irq_gpio:0", "/fragment@96/__overlay__/sm5714@49:sm5714,irq-gpio:0", "/fragment@97/__overlay__/usbpd-sm5714@33:usbpd,usbpd_int:0", "/fragment@98:target:0", "/fragment@100:target:0", "/fragment@101/__overlay__/sec-nfc@27:interrupt-parent:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,ven-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,irq-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,firm-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,clk_req-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,pvdd-gpio:0", "/fragment@102:target:0", "/fragment@104/__overlay__/etspi,et7xx:etspi-sleepPin:0", "/fragment@107/__overlay__/sm5714-fled:flash-en-gpio:0", "/fragment@107/__overlay__/sm5714-fled:torch-en-gpio:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:12", "/fragment@108/__overlay__/qcom,ois@62:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:24", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:36", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:36", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:12", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:24", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:36", "/fragment@113/__overlay__/certify_hall:certify_hall,gpio_certify_cover:0", "/fragment@115:target:0", "/fragment@116/__overlay__/i2c@17:gpios:0", "/fragment@116/__overlay__/i2c@17:gpios:12"; + pm6150l_gpios = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-reset-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-reset-gpio:0", "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-bklight-en-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-en-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-reset-gpio:0", "/fragment@22:target:0", "/fragment@75:target:0", "/fragment@93:target:0", "/fragment@94/__overlay__/vol_up:gpios:0", "/fragment@116/__overlay__/i2c@17/sx9360-i2c@28:sx9360,nirq-gpio:0"; + soc = "/fragment@6:target:0", "/fragment@11:target:0", "/fragment@23:target:0", "/fragment@31:target:0", "/fragment@34:target:0", "/fragment@60:target:0", "/fragment@66:target:0", "/fragment@70:target:0", "/fragment@80:target:0", "/fragment@84:target:0", "/fragment@89:target:0", "/fragment@95:target:0", "/fragment@106:target:0", "/fragment@112:target:0", "/fragment@113:target:0", "/fragment@116:target:0", "/fragment@119:target:0"; + mdss_dsi0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-ctrl:0"; + mdss_dsi_phy0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-phy:0"; + mdss_dsi0_pll = "/fragment@6/__overlay__/qcom,dsi-display:clocks:0", "/fragment@6/__overlay__/qcom,dsi-display:clocks:8", "/fragment@6/__overlay__/qcom,dsi-display:clocks:16", "/fragment@6/__overlay__/qcom,dsi-display:clocks:24", "/fragment@6/__overlay__/qcom,dsi-display:clocks:32", "/fragment@6/__overlay__/qcom,dsi-display:clocks:40", "/fragment@6/__overlay__/qcom,dsi-display:clocks:48", "/fragment@6/__overlay__/qcom,dsi-display:clocks:56", "/fragment@6/__overlay__/qcom,dsi-display:clocks:64", "/fragment@6/__overlay__/qcom,dsi-display:clocks:72"; + L13A = "/fragment@6/__overlay__/qcom,dsi-display:vddio-supply:0"; + L18A = "/fragment@6/__overlay__/qcom,dsi-display:vdda-3p3-supply:0"; + lcdb_ldo_vreg = "/fragment@6/__overlay__/qcom,dsi-display:lab-supply:0"; + lcdb_ncp_vreg = "/fragment@6/__overlay__/qcom,dsi-display:ibb-supply:0"; + pm6150_l18 = "/fragment@6/__overlay__/qcom,dsi-display:vci-supply:0"; + pm6150_l13 = "/fragment@6/__overlay__/qcom,dsi-display:vddi-supply:0"; + sde_dp = "/fragment@7:target:0", "/fragment@8/__overlay__:connectors:8", "/fragment@26:target:0"; + pm6150_pdphy = "/fragment@7/__overlay__:qcom,dp-usbpd-detection:0"; + sde_dp_usbplug_cc_active = "/fragment@7/__overlay__:pinctrl-0:0"; + sde_dp_usbplug_cc_suspend = "/fragment@7/__overlay__:pinctrl-1:0"; + sde_rscc = "/fragment@8/__overlay__:connectors:12"; + thermal_zones = "/fragment@9:target:0", "/fragment@18:target:0"; + pm6150_trip0 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:trip:0"; + pm6150_charger = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:cooling-device:0", "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:cooling-device:0", "/fragment@21:target:0"; + pm6150_trip1 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:trip:0"; + pm6150l_trip0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:trip:0"; + CPU0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:cooling-device:0"; + CPU1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:cooling-device:0"; + CPU2 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:cooling-device:0"; + CPU3 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:cooling-device:0"; + CPU4 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:cooling-device:0"; + CPU5 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:cooling-device:0"; + CPU6 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:cooling-device:0"; + CPU7 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:cooling-device:0"; + pm6150l_trip1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:trip:0"; + bcl_lvl0 = "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:trip:0"; + bcl_lvl1 = "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:trip:0"; + bcl_lvl2 = "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:trip:0"; + soc_trip = "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:trip:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:trip:0"; + pm6150l_vadc = "/fragment@12:target:0", "/fragment@13/__overlay__:io-channels:0", "/fragment@13/__overlay__:io-channels:8", "/fragment@13/__overlay__:io-channels:16", "/fragment@13/__overlay__:io-channels:24", "/fragment@80/__overlay__/sec_thermistor@1:io-channels:0", "/fragment@80/__overlay__/sec_thermistor@2:io-channels:0", "/fragment@83:target:0"; + pm6150l_adc_tm = "/fragment@13:target:0", "/fragment@18/__overlay__/pa-therm1:thermal-sensors:0"; + ufsphy_mem = "/fragment@14:target:0"; + pm6150_l4 = "/fragment@14/__overlay__:vdda-phy-supply:0"; + pm6150l_l3 = "/fragment@14/__overlay__:vdda-pll-supply:0", "/fragment@15/__overlay__:qcom,vddp-ref-clk-supply:0"; + ufshc_mem = "/fragment@15:target:0", "/fragment@64:target:0"; + ufs_phy_gdsc = "/fragment@15/__overlay__:vdd-hba-supply:0"; + pm6150_l19 = "/fragment@15/__overlay__:vcc-supply:0", "/fragment@16/__overlay__:vdd-supply:0"; + pm6150_l12 = "/fragment@15/__overlay__:vccq2-supply:0", "/fragment@16/__overlay__:vdd-io-supply:0"; + sdhc_1 = "/fragment@16:target:0"; + sdc1_clk_on = "/fragment@16/__overlay__:pinctrl-0:0"; + sdc1_cmd_on = "/fragment@16/__overlay__:pinctrl-0:4"; + sdc1_data_on = "/fragment@16/__overlay__:pinctrl-0:8"; + sdc1_rclk_on = "/fragment@16/__overlay__:pinctrl-0:12"; + sdc1_clk_off = "/fragment@16/__overlay__:pinctrl-1:0"; + sdc1_cmd_off = "/fragment@16/__overlay__:pinctrl-1:4"; + sdc1_data_off = "/fragment@16/__overlay__:pinctrl-1:8"; + sdc1_rclk_off = "/fragment@16/__overlay__:pinctrl-1:12"; + sdhc_2 = "/fragment@17:target:0"; + pm6150l_l9 = "/fragment@17/__overlay__:vdd-supply:0"; + pm6150l_l6 = "/fragment@17/__overlay__:vdd-io-supply:0"; + sdc2_clk_on = "/fragment@17/__overlay__:pinctrl-0:0"; + sdc2_cmd_on = "/fragment@17/__overlay__:pinctrl-0:4"; + sdc2_data_on = "/fragment@17/__overlay__:pinctrl-0:8"; + sdc2_cd_on = "/fragment@17/__overlay__:pinctrl-0:12"; + sdc2_clk_off = "/fragment@17/__overlay__:pinctrl-1:0"; + sdc2_cmd_off = "/fragment@17/__overlay__:pinctrl-1:4"; + sdc2_data_off = "/fragment@17/__overlay__:pinctrl-1:8"; + sdc2_cd_off = "/fragment@17/__overlay__:pinctrl-1:12"; + pm6150a_amoled = "/fragment@19:target:0"; + pm6150_qg = "/fragment@20:target:0"; + pm6150_vadc = "/fragment@21/__overlay__:io-channels:0", "/fragment@21/__overlay__:io-channels:8", "/fragment@21/__overlay__:io-channels:16", "/fragment@21/__overlay__:io-channels:24", "/fragment@21/__overlay__:io-channels:32", "/fragment@21/__overlay__:io-channels:40", "/fragment@21/__overlay__:io-channels:48", "/fragment@80/__overlay__/sec_thermistor@0:io-channels:0", "/fragment@82:target:0", "/fragment@118:target:0", "/fragment@119/__overlay__/battery:io-channels:0", "/fragment@119/__overlay__/battery:io-channels:8"; + qusb_phy0 = "/fragment@21/__overlay__:dpdm-supply:0", "/fragment@99:target:0"; + qupv3_se7_i2c = "/fragment@24:target:0", "/fragment@92:target:0", "/fragment@107:target:0"; + ts_active = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-0:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-0:0"; + ts_int_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:0"; + ts_reset_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:4", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:4"; + ts_release = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-2:0"; + pm6150_l10 = "/fragment@24/__overlay__/synaptics_tcm@20:vdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:vdd-supply:0"; + pm6150l_l7 = "/fragment@24/__overlay__/synaptics_tcm@20:avdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:avdd-supply:0", "/fragment@90:target:0", "/fragment@92/__overlay__/touchscreen@20:avdd-supply:0", "/fragment@92/__overlay__/touchscreen@49:avdd-supply:0"; + qupv3_se0_i2c = "/fragment@25:target:0", "/fragment@101:target:0"; + nfc_int_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:0"; + nfc_enable_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:4"; + nfc_clk_req_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:8"; + nfc_int_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:0"; + nfc_enable_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:4"; + nfc_clk_req_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:8"; + fsa4480 = "/fragment@26/__overlay__:qcom,dp-aux-switch:0", "/fragment@72:target:0"; + q6core = "/fragment@27:target:0", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:4", "/fragment@30:target:0", "/fragment@69:target:0", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:4"; + lpass_core_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:0", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:0", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:0"; + lpass_audio_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:8", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:8", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:8", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:8", "/fragment@28/__overlay__/va-macro@62770000:clocks:0"; + bolero = "/fragment@28:target:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214:qcom,bolero-handle:0", "/fragment@29/__overlay__:asoc-codec:4", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:12", "/fragment@68:target:0", "/fragment@71/__overlay__:asoc-codec:4", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:12"; + L10A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-rxtx-supply:0", "/fragment@28/__overlay__/wcd938x-codec:cdc-vddio-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-ldo-rxtx-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vddpx-1-supply:0"; + L15A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-buck-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-buck-supply:0"; + BOB = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_bob-supply:0"; + atoll_snd = "/fragment@29:target:0", "/fragment@71:target:0"; + stub_codec = "/fragment@29/__overlay__:asoc-codec:0", "/fragment@71/__overlay__:asoc-codec:0"; + audio_apr = "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:0", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:0"; + spkr_1_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-0:0"; + spkr_1_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-1:0"; + spkr_2_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-0:0"; + spkr_2_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-1:0"; + wcd_reset_active = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-0:0"; + wcd_reset_sleep = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-1:0"; + va_cdc_dma_0_tx = "/fragment@32:target:0"; + aliases = "/fragment@33:target:0", "/fragment@67:target:0"; + clock_gcc = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:0", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:8", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:16"; + qupv3_1 = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:qcom,wrapper-core:0"; + dcc = "/fragment@36:target:0"; + reserved_memory = "/fragment@37:target:0", "/fragment@65:target:0", "/fragment@105:target:0"; + removed_region = "/fragment@38:target:0"; + pil_modem_mem = "/fragment@39:target:0"; + pil_adsp_mem = "/fragment@40:target:0"; + pil_camera_mem = "/fragment@41:target:0"; + pil_npu_mem = "/fragment@42:target:0"; + pil_video_mem = "/fragment@43:target:0"; + pil_cdsp_mem = "/fragment@44:target:0"; + qseecom_mem = "/fragment@45:target:0"; + qseecom_ta_mem = "/fragment@46:target:0"; + secure_carveout_heap = "/fragment@47:target:0"; + cdsp_sec_mem = "/fragment@48:target:0"; + msm_imem = "/fragment@49:target:0"; + camera = "/fragment@50:target:0"; + cam_vfe0 = "/fragment@51:target:0"; + cam_vfe1 = "/fragment@52:target:0"; + cam_vfe_lite = "/fragment@53:target:0"; + cam_lrme = "/fragment@54:target:0"; + shared_meta = "/fragment@55:target:0"; + android_q_fstab = "/fragment@56:target:0"; + pm8008_8 = "/fragment@57:target:0", "/fragment@78:target:0"; + pm8008_9 = "/fragment@58:target:0", "/fragment@79:target:0"; + usb0 = "/fragment@59:target:0"; + firmware = "/fragment@61:target:0"; + pil_modem = "/fragment@62:target:0"; + modem_smp2p_out = "/fragment@62/__overlay__:qcom,smem-states:0", "/fragment@62/__overlay__:qcom,smem-states:8", "/fragment@62/__overlay__:qcom,smem-states:16"; + icnss = "/fragment@63:target:0"; + pcm0 = "/fragment@71/__overlay__:asoc-platform:0"; + pcm1 = "/fragment@71/__overlay__:asoc-platform:4"; + pcm2 = "/fragment@71/__overlay__:asoc-platform:8"; + voip = "/fragment@71/__overlay__:asoc-platform:12"; + voice = "/fragment@71/__overlay__:asoc-platform:16"; + loopback = "/fragment@71/__overlay__:asoc-platform:20"; + compress = "/fragment@71/__overlay__:asoc-platform:24"; + hostless = "/fragment@71/__overlay__:asoc-platform:28"; + afe = "/fragment@71/__overlay__:asoc-platform:32"; + lsm = "/fragment@71/__overlay__:asoc-platform:36"; + routing = "/fragment@71/__overlay__:asoc-platform:40"; + compr = "/fragment@71/__overlay__:asoc-platform:44"; + pcm_noirq = "/fragment@71/__overlay__:asoc-platform:48"; + spmi_bus = "/fragment@77:target:0", "/fragment@116/__overlay__/i2c@17/sx9360-i2c@28:interrupt-parent:0"; + pm6150_gpios = "/fragment@81:target:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:samsung,ub-con-det:0", "/fragment@88:target:0", "/fragment@113/__overlay__/hall:hall,gpio_flip_cover:0", "/fragment@114:target:0"; + gpio_key = "/fragment@94:target:0"; + qupv3_se4_i2c = "/fragment@96:target:0", "/fragment@117:target:0"; + qupv3_se11_i2c = "/fragment@97:target:0"; + pm6150l_l11 = "/fragment@103:target:0"; + qupv3_se6_spi = "/fragment@104:target:0"; + pm6150l_switch2 = "/fragment@106/__overlay__/qcom,camera-flash@0:switch-source:0", "/fragment@106/__overlay__/qcom,camera-flash@1:switch-source:0"; + qupv3_se10_i2c = "/fragment@108:target:0"; + cam_cci0 = "/fragment@109:target:0"; + titan_top_gdsc = "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:cam_clk-supply:0"; + clock_camcc = "/fragment@109/__overlay__/qcom,cam-sensor@0:clocks:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:clocks:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:clocks:0"; + cam_cci1 = "/fragment@110:target:0"; + qupv3_se9_i2c = "/fragment@111:target:0"; + apps_rsc = "/fragment@116/__overlay__/rpmh-regulator-ldoc8:mboxes:0"; + }; + + __local_fixups__ { + + fragment@0 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@1 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@2 { + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@5 { + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@6 { + + __overlay__ { + + qcom,dsi-display@0 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@1 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@2 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@3 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@4 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@5 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display { + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + qcom,dsi-display-list = <0x0 0x4>; + }; + }; + }; + + fragment@7 { + + __overlay__ { + qcom,ext-disp = <0x0>; + }; + }; + + fragment@8 { + + __overlay__ { + connectors = <0x0 0x4>; + }; + }; + + fragment@20 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@21 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@28 { + + __overlay__ { + + bolero-clk-rsc-mngr { + clocks = <0x0 0x8 0x10 0x18 0x20 0x28 0x30 0x38>; + }; + + tx-macro@62620000 { + clocks = <0x0 0x8>; + qcom,tx-swr-gpios = <0x0>; + }; + + rx-macro@62600000 { + clocks = <0x0 0x8>; + qcom,rx-swr-gpios = <0x0>; + }; + + wsa-macro@62640000 { + clocks = <0x0 0x8>; + qcom,wsa-swr-gpios = <0x0>; + + wsa_swr_master { + + wsa881x@20170211 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@20170212 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170213 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170214 { + qcom,spkr-sd-n-node = <0x0>; + }; + }; + }; + + wcd938x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + mbhc-button-thres = <0x0 0xc 0x18 0x24 0x30 0x3c 0x48 0x54>; + imp-table = <0x0 0x10 0x20 0x30 0x40 0x50 0x60 0x70>; + }; + + wcd937x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + }; + }; + }; + + fragment@29 { + + __overlay__ { + qcom,cdc-dmic01-gpios = <0x0>; + qcom,cdc-dmic23-gpios = <0x0>; + qcom,cdc-dmic45-gpios = <0x0>; + asoc-codec = <0x8>; + qcom,wsa-devs = <0x0 0x4 0x8 0xc>; + qcom,codec-aux-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@30 { + + __overlay__ { + + cdc_dmic01_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic23_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic45_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + wsa_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + rx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + tx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@34 { + + __overlay__ { + + qcom,qup_hsuart@a88000 { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@60 { + + __overlay__ { + + qcom,memshare { + + qcom,client_4 { + memory-region = <0x0>; + }; + }; + + samsung,sec_hdm { + memory-region = <0x0>; + }; + }; + }; + + fragment@66 { + + __overlay__ { + + qcom,ion { + + qcom,ion-heap@30 { + memory-region = <0x0>; + }; + }; + }; + }; + + fragment@69 { + + __overlay__ { + + msm_cdc_pinctrl_quin { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@70 { + + __overlay__ { + + i2c@18 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@71 { + + __overlay__ { + asoc-platform = <0x34>; + qcom,quin-mi2s-gpios = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@80 { + + __overlay__ { + + i2c@2 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@85 { + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD { + ss,self_display = <0x0>; + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@86 { + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@92 { + + __overlay__ { + + touchscreen@20 { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + + touchscreen@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@94 { + + __overlay__ { + pinctrl-0 = <0x0>; + }; + }; + + fragment@96 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sm5714@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@97 { + + __overlay__ { + pinctrl-1 = <0x0>; + + usbpd-sm5714@33 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@101 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sec-nfc@27 { + pinctrl-0 = <0x0 0x4 0x8 0xc 0x10>; + }; + }; + }; + + fragment@104 { + + __overlay__ { + + etspi,et7xx { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@106 { + + __overlay__ { + + qcom,camera-flash@0 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,camera-flash@1 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,cam-res-mgr { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + }; + }; + + fragment@108 { + + __overlay__ { + + qcom,ois@62 { + cam_vaf-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@109 { + + __overlay__ { + + qcom,cam-sensor@0 { + actuator-src = <0x0>; + led-flash-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@2 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x2D { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@110 { + + __overlay__ { + + qcom,cam-sensor@1 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@8 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@3 { + actuator-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + led-flash-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@4 { + led-flash-src = <0x0>; + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x3F { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@111 { + + __overlay__ { + + qcom,actuator@0xC { + cam_vaf-supply = <0x0>; + }; + + qcom,actuator2 { + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + }; + + qcom,eeprom@50 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@51 { + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@55 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + }; + }; + + fragment@113 { + + __overlay__ { + + hall { + pinctrl-0 = <0x0>; + }; + + certify_hall { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@116 { + + __overlay__ { + + i2c@17 { + pinctrl-0 = <0x0>; + + sx9360-i2c@28 { + pinctrl-0 = <0x0>; + }; + }; + }; + }; + }; }; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r01.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r01.dts old mode 100755 new mode 100644 index 7a330d2597ae..f34b3fef45cb --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r01.dts +++ b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r01.dts @@ -1,25 +1,7046 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - /dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a72q-r01.dtsi" -#include "drivers/atoll-sec-a72q-battery-common.dtsi" / { model = "Samsung A72Q PROJECT REV00 (board-id,01)"; compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 1>; - dtbo-version = <0>; + qcom,board-id = <0x22 0x1>; + dtbo-version = <0x0>; + + fragment@0 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ video mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x37 0x30>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x38ae2bc0 0x37bc55b0 0x37f8cb38 0x383540b8 0x3871b640>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x3>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@1 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ cmd mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x3da58d80 0x3c9e86e0 0x3ce04888 0x3d220a30 0x3d63cbd8>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x4>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@2 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,mdss-dsi-panel-name = "Simulator video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-mode-switch; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x0 0x0 0x0 0x1 0x0>; + qcom,panel-ack-disabled; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x5>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-video-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,cmd-to-video-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,cmd-to-video-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1 0x2 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-cmd-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,video-to-cmd-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,video-to-cmd-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@3 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-t-clk-post = <0xc>; + qcom,mdss-dsi-t-clk-pre = <0x29>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-ack-disabled; + qcom,ulps-enabled; + phandle = <0x6>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x64>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x64>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x2d0 0x28 0x2d0 0x28 0x2d0 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x1cc>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x2e4>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x21c 0x28 0x21c 0x28 0x21c 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@2 { + qcom,mdss-dsi-panel-width = <0x2d0>; + qcom,mdss-dsi-panel-height = <0x500>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x348>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x564>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x168>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x168 0x28 0x168 0x28 0x168 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + }; + }; + }; + }; + + fragment@4 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_dsc_375_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode DSC 3.75:1 dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,panel-ack-disabled; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,ulps-enabled; + phandle = <0x7>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-pulse-width = <0x10>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x8>; + qcom,mdss-dsi-v-front-porch = <0xa>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-on-command = <0x15010000 0x2ff 0x20150100 0x2 0xfb011501 0x0 0x2000115 0x1000000 0x20155 0x15010000 0x202 0x45150100 0x2 0x5401501 0x0 0x2061915 0x1000000 0x2071e 0x15010000 0x20b 0x73150100 0x2 0xc731501 0x0 0x20eb015 0x1000000 0x20fae 0x15010000 0x211 0xb8150100 0x2 0x13001501 0x0 0x2588015 0x1000000 0x25901 0x15010000 0x25a 0x150100 0x2 0x5b011501 0x0 0x25c8015 0x1000000 0x25d81 0x15010000 0x25e 0x150100 0x2 0x5f011501 0x0 0x2723115 0x1000000 0x26803 0x15010000 0x2ff 0x24150100 0x2 0xfb011501 0x0 0x2001c15 0x1000000 0x2010b 0x15010000 0x202 0xc150100 0x2 0x3011501 0x0 0x2040f15 0x1000000 0x20510 0x15010000 0x206 0x10150100 0x2 0x7101501 0x0 0x2088915 0x1000000 0x2098a 0x15010000 0x20a 0x13150100 0x2 0xb131501 0x0 0x20c1515 0x1000000 0x20d15 0x15010000 0x20e 0x17150100 0x2 0xf171501 0x0 0x2101c15 0x1000000 0x2110b 0x15010000 0x212 0xc150100 0x2 0x13011501 0x0 0x2140f15 0x1000000 0x21510 0x15010000 0x216 0x10150100 0x2 0x17101501 0x0 0x2188915 0x1000000 0x2198a 0x15010000 0x21a 0x13150100 0x2 0x1b131501 0x0 0x21c1515 0x1000000 0x21d15 0x15010000 0x21e 0x17150100 0x2 0x1f171501 0x0 0x2204015 0x1000000 0x22101 0x15010000 0x222 0x150100 0x2 0x23401501 0x0 0x2244015 0x1000000 0x2256d 0x15010000 0x226 0x40150100 0x2 0x27401501 0x0 0x2e00015 0x1000000 0x2dc21 0x15010000 0x2dd 0x22150100 0x2 0xde071501 0x0 0x2df0715 0x1000000 0x2e36d 0x15010000 0x2e1 0x7150100 0x2 0xe2071501 0x0 0x229d815 0x1000000 0x22a2a 0x15010000 0x24b 0x3150100 0x2 0x4c111501 0x0 0x24d1015 0x1000000 0x24e01 0x15010000 0x24f 0x1150100 0x2 0x50101501 0x0 0x2510015 0x1000000 0x25280 0x15010000 0x253 0x150100 0x2 0x56001501 0x0 0x2540715 0x1000000 0x25807 0x15010000 0x255 0x25150100 0x2 0x5b431501 0x0 0x25c0015 0x1000000 0x25f73 0x15010000 0x260 0x73150100 0x2 0x63221501 0x0 0x2640015 0x1000000 0x26708 0x15010000 0x268 0x4150100 0x2 0x72021501 0x0 0x27a8015 0x1000000 0x27b91 0x15010000 0x27c 0xd8150100 0x2 0x7d601501 0x0 0x27f1515 0x1000000 0x27515 0x15010000 0x2b3 0xc0150100 0x2 0xb4001501 0x0 0x2b50015 0x1000000 0x27800 0x15010000 0x279 0x150100 0x2 0x80001501 0x0 0x2830015 0x1000000 0x2930a 0x15010000 0x294 0xa150100 0x2 0x8a001501 0x0 0x29bff15 0x1000000 0x29db0 0x15010000 0x29f 0x63150100 0x2 0x98101501 0x0 0x2ec0015 0x1000000 0x2ff10 0x39010000 0x11c1 0x9200010 0x2000268 0x1bb000a 0x66704c5 0x39010000 0x3c2 0x10f01501 0x0 0x2c00315 0x1000000 0x43b03 0xa0a1501 0x0 0x2350015 0x1000000 0x2e501 0x15010000 0x2bb 0x10150100 0x2 0xfb010501 0x7800 0x2110005 0x1000078 0x22900>; + qcom,mdss-dsi-off-command = [05 01 00 00 78 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x0>; + qcom,mdss-dsi-h-back-porch = <0x0>; + qcom,mdss-dsi-h-pulse-width = <0x0>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x0>; + qcom,mdss-dsi-v-front-porch = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x0>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = <0x15010000 0x2bb 0x10150100 0x2 0xb0030501 0x7800 0x1111501 0x0 0x251ff15 0x1000000 0x25324 0x15010000 0x2ff 0x23150100 0x2 0x8051501 0x0 0x2469015 0x1000000 0x2ff10 0x15010000 0x2ff 0xf0150100 0x2 0x92011501 0x0 0x2ff1015 0x1000000 0x23500 0x5010000 0x28000129>; + qcom,mdss-dsi-off-command = <0x5010000 0x10000128 0x5010000 0x40000110>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x150505 0x201f0505 0x3020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1 0x2 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@5 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,mdss-dsi-panel-name = "nt36672c fhd plus video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x14 0x0 0x14 0x1 0x14>; + qcom,mdss-pan-physical-width-dimension = <0x4a>; + qcom,mdss-pan-physical-height-dimension = <0x83>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-cphy-mode; + qcom,mdss-dsi-t-clk-post = <0x0>; + qcom,mdss-dsi-t-clk-pre = <0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x5a 0x32>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-skip-timing-update; + qcom,dsi-dyn-clk-list = <0x3eb54a94 0x3e726713 0x3e2f838b 0x3deca00a 0x3da9bc89>; + qcom,dsi-dyn-clk-type = "constant-fps-adjust-hfp"; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,platform-bklight-en-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-en-gpio = <0xffffffff 0x4 0x0>; + phandle = <0x8>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-front-porch = <0xca>; + qcom,mdss-dsi-h-back-porch = <0x38>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0xa>; + qcom,mdss-dsi-v-front-porch = <0x50b>; + qcom,mdss-dsi-v-pulse-width = <0xa>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 b0 00 29 01 00 00 00 00 02 c0 00 29 01 00 00 00 00 03 c2 1b a0 29 01 00 00 00 00 02 ff 25 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 18 20 15 01 00 00 00 00 02 ff 2a 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 27 80 15 01 00 00 00 00 02 28 fd 29 01 00 00 00 00 02 ff f0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 5a 00 29 01 00 00 00 00 02 a0 08 29 01 00 00 00 00 02 ff d0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 09 ad 15 01 00 00 00 00 02 ff 10 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 51 ff 15 01 00 00 00 00 02 53 2c 15 01 00 00 00 00 02 ff 23 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 0a 00 15 01 00 00 00 00 02 0b 00 15 01 00 00 00 00 02 0c 00 15 01 00 00 00 00 02 0d 00 15 01 00 00 00 00 02 11 01 15 01 00 00 00 00 02 12 95 15 01 00 00 00 00 02 15 68 15 01 00 00 00 00 02 16 0b 15 01 00 00 00 00 02 6f 00 15 01 00 00 00 00 02 70 00 15 01 00 00 00 00 02 71 00 15 01 00 00 00 00 02 a0 11 15 01 00 00 00 00 02 ff f0 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 d2 52 29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 35 00 05 01 00 00 78 00 02 11 00 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x230909 0x26240909 0x9060204>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@6 { + target = <0xffffffff>; + + __overlay__ { + + dsi_panel_pwr_supply { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xaa>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + }; + + qcom,panel-supply-entry@2 { + reg = <0x2>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-post-on-sleep = <0x14>; + }; + }; + + dsi_panel_pwr_supply_no_labibb { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x2>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + }; + + dsi_panel_pwr_supply_labibb_amoled { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x1>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vdda-3p3"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x3390>; + qcom,supply-disable-load = <0x50>; + }; + }; + + qcom,dsi-display@0 { + label = "dsi_rm69299_visionox_amoled_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0"; + qcom,dsi-panel = <0x3>; + qcom,dsi-display-active; + phandle = <0xab>; + }; + + qcom,dsi-display@1 { + label = "dsi_rm69299_visionox_amoled_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x4>; + phandle = <0xac>; + }; + + qcom,dsi-display@2 { + label = "dsi_sim_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x5>; + phandle = <0xad>; + }; + + qcom,dsi-display@3 { + label = "dsi_sim_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x6>; + phandle = <0xae>; + }; + + qcom,dsi-display@4 { + label = "dsi_sim_dsc_375_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x7>; + phandle = <0xaf>; + }; + + qcom,dsi-display@5 { + label = "dsi_nt36672c_video_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + qcom,dsi-panel = <0x8>; + phandle = <0xb0>; + }; + + qcom,dsi-display { + compatible = "qcom,dsi-display"; + qcom,dsi-ctrl = <0xffffffff>; + qcom,dsi-phy = <0xffffffff>; + clocks = <0xffffffff 0x6 0xffffffff 0x9 0xffffffff 0x3 0xffffffff 0x8 0xffffffff 0xa 0xffffffff 0xd 0xffffffff 0x11 0xffffffff 0x15 0xffffffff 0x16 0xffffffff 0x19>; + clock-names = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + pinctrl-names = "panel_active", "panel_suspend"; + pinctrl-0 = <0x9 0xa 0xb>; + pinctrl-1 = <0xc 0xd 0xb>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,panel-te-source = <0x0>; + vddio-supply = <0xffffffff>; + vdda-3p3-supply = <0xffffffff>; + lab-supply = <0xffffffff>; + ibb-supply = <0xffffffff>; + qcom,dsi-display-list = <0xe 0xf>; + vci-supply = <0xffffffff>; + vddi-supply = <0xffffffff>; + phandle = <0x12>; + }; + + qcom,wb-display@0 { + compatible = "qcom,wb-display"; + cell-index = <0x0>; + label = "wb_display"; + phandle = <0x11>; + }; + + qcom,msm-ext-disp { + compatible = "qcom,msm-ext-disp"; + phandle = <0x10>; + + qcom,msm-ext-disp-audio-codec-rx { + compatible = "qcom,msm-ext-disp-audio-codec-rx"; + phandle = <0x2b>; + }; + }; + }; + }; + + fragment@7 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-usbpd-detection = <0xffffffff>; + qcom,ext-disp = <0x10>; + qcom,usbplug-cc-gpio = <0xffffffff 0x68 0x0>; + pinctrl-name = "mdss_dp_active", "mdss_dp_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + }; + }; + + fragment@8 { + target = <0xffffffff>; + + __overlay__ { + connectors = <0x11 0x12 0xffffffff 0xffffffff>; + }; + }; + + fragment@9 { + target = <0xffffffff>; + + __overlay__ { + + pm6150-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150l-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_cpu0 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl0 { + disable-thermal-zone; + + cooling-maps { + + vbat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + vbat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl1 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl2 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + soc { + disable-thermal-zone; + + cooling-maps { + + soc_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + soc_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + }; + }; + + fragment@10 { + target = <0xffffffff>; + + __overlay__ { + #cooling-cells = <0x2>; + }; + }; + + fragment@11 { + target = <0xffffffff>; + + __overlay__ { + + qcom,battery-data { + qcom,batt-id-range-pct = <0xf>; + phandle = <0x13>; + + qcom,alium_860_89032_0000_3600mAh { + qcom,max-voltage-uv = <0x426030>; + qcom,fg-cc-cv-threshold-uv = <0x423920>; + qcom,fastchg-current-ma = <0x1518>; + qcom,batt-id-kohm = <0x6b>; + qcom,battery-beta = <0x109a>; + qcom,battery-therm-kohm = <0x64>; + qcom,battery-type = "Alium_860_89032_0000_3600mAh_Jun15th2018"; + qcom,qg-batt-profile-ver = <0x64>; + qcom,jeita-fcc-ranges = <0x0 0x32 0x2625a0 0x33 0x190 0x5265c0 0x191 0x1c2 0x2625a0>; + qcom,jeita-fv-ranges = <0x0 0x32 0x40d990 0x33 0x190 0x426030 0x191 0x1c2 0x40d990>; + qcom,step-chg-ranges = <0x36ee80 0x39fbc0 0x5265c0 0x39fbc1 0x419ce0 0x36ee80 0x419ce1 0x426030 0x2625a0>; + qcom,ocv-based-step-chg; + qcom,jeita-soft-thresholds = <0x5314 0x25e3>; + qcom,jeita-hard-thresholds = <0x58cd 0x20b8>; + qcom,jeita-soft-hys-thresholds = <0x4f5e 0x2943>; + qcom,jeita-soft-fcc-ua = <0x2625a0 0x2625a0>; + qcom,jeita-soft-fv-uv = <0x40d990 0x40d990>; + + qcom,fcc1-temp-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xd62 0xdbf 0xdfd 0xe1d 0xe2e>; + }; + + qcom,fcc2-temp-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xdda 0xdf8 0xe02 0xe04 0xdff 0xdff>; + }; + + qcom,pc-temp-v1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa846 0xa903 0xa965 0xa982 0xa987 0xa757 0xa82c 0xa88b 0xa8b2 0xa8bc 0xa671 0xa747 0xa7a8 0xa7d4 0xa7e5 0xa598 0xa65f 0xa6c5 0xa6f2 0xa707 0xa4ca 0xa582 0xa5e5 0xa611 0xa627 0xa3ff 0xa4af 0xa508 0xa531 0xa546 0xa330 0xa3e1 0xa430 0xa452 0xa465 0xa25d 0xa311 0xa35c 0xa377 0xa387 0xa1a0 0xa23e 0xa287 0xa29e 0xa2ad 0xa10a 0xa17a 0xa1b1 0xa1c4 0xa1d2 0xa07e 0xa0e5 0xa0f6 0xa0f5 0xa0fc 0x9fa9 0xa061 0xa067 0xa048 0xa036 0x9e4b 0x9f9a 0x9fd6 0x9fae 0x9f81 0x9cdb 0x9e3d 0x9ee8 0x9ee6 0x9ebf 0x9bed 0x9cd1 0x9d85 0x9dc6 0x9dd7 0x9b4d 0x9bf5 0x9c67 0x9cb4 0x9cf4 0x9ad6 0x9b65 0x9bd6 0x9c18 0x9c4a 0x9a75 0x9af5 0x9b63 0x9baa 0x9bc5 0x9a1f 0x9a9b 0x9ade 0x9b13 0x9b23 0x99c4 0x9a41 0x9a3f 0x9a2d 0x9a41 0x9962 0x99c6 0x998a 0x9943 0x9959 0x98fd 0x992a 0x98b8 0x9892 0x98a0 0x9894 0x9882 0x97f4 0x9800 0x9807 0x982b 0x97c6 0x976f 0x9780 0x9781 0x97cb 0x9713 0x970f 0x970c 0x970c 0x9775 0x9697 0x96b5 0x96a2 0x96a2 0x9724 0x963e 0x965a 0x9642 0x963e 0x96db 0x95fa 0x9603 0x95e9 0x95e1 0x9698 0x95c7 0x95b7 0x9598 0x958b 0x965b 0x959d 0x9571 0x954e 0x953b 0x9627 0x9575 0x9533 0x950c 0x94f4 0x95f8 0x9550 0x94fe 0x94d1 0x94b3 0x95cc 0x952e 0x94cf 0x949b 0x947a 0x95a2 0x9511 0x94a4 0x9465 0x9440 0x9579 0x94f7 0x947f 0x9432 0x9407 0x954f 0x94d6 0x9458 0x93fe 0x93cc 0x9525 0x94b2 0x942f 0x93c6 0x938b 0x94f0 0x9484 0x9402 0x938b 0x9345 0x94a6 0x943e 0x93bf 0x9343 0x92f7 0x944c 0x93da 0x935f 0x92ed 0x92a2 0x93e6 0x936c 0x92f1 0x9288 0x923f 0x936b 0x92f1 0x9276 0x920e 0x91c6 0x92e1 0x926f 0x91f1 0x9188 0x9141 0x9248 0x91ea 0x9165 0x90ff 0x90bc 0x91cf 0x9176 0x9100 0x909b 0x905b 0x9179 0x9129 0x90c1 0x9060 0x9022 0x9159 0x910e 0x90ab 0x904f 0x9011 0x913e 0x90f9 0x909a 0x903f 0x9001 0x911a 0x90de 0x907f 0x9020 0x8fdd 0x90ac 0x9070 0x8ff7 0x8f74 0x8f1a 0x8f68 0x8f1c 0x8e9e 0x8e14 0x8db6 0x8d9d 0x8d55 0x8cd8 0x8c4c 0x8beb 0x8b59 0x8b10 0x8a94 0x8a02 0x899f 0x8849 0x87fb 0x877d 0x86e5 0x867d 0x836c 0x8325 0x82aa 0x8209 0x8197 0x7530 0x7530 0x7530 0x7530 0x7530>; + }; + + qcom,pc-temp-v2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa98d 0xa97e 0xa974 0xa960 0xa92e 0xa910 0xa7fb 0xa83a 0xa854 0xa856 0xa82f 0xa819 0xa6a3 0xa712 0xa747 0xa757 0xa738 0xa728 0xa594 0xa609 0xa64d 0xa665 0xa64a 0xa63c 0xa4c7 0xa51d 0xa566 0xa581 0xa565 0xa558 0xa3f4 0xa43e 0xa489 0xa4a2 0xa484 0xa478 0xa2af 0xa364 0xa3b3 0xa3c8 0xa3a5 0xa397 0xa162 0xa292 0xa2e4 0xa2f3 0xa2ca 0xa2b9 0xa11a 0xa1c1 0xa210 0xa21b 0xa1ef 0xa1de 0xa14f 0xa0ea 0xa131 0xa139 0xa110 0xa103 0xa17a 0xa03c 0xa071 0xa077 0xa047 0xa035 0xa046 0x9fd6 0x9ff5 0x9ff5 0x9fb3 0x9f87 0x9d6d 0x9f7f 0x9f85 0x9f81 0x9f2b 0x9ee2 0x9b88 0x9eab 0x9ea9 0x9ead 0x9e5e 0x9e1a 0x9a81 0x9c78 0x9cde 0x9d1e 0x9d16 0x9d22 0x99b8 0x9a96 0x9b46 0x9bd5 0x9bfe 0x9c3f 0x9913 0x99e8 0x9a78 0x9b4d 0x9b70 0x9b9c 0x9887 0x9977 0x99df 0x9aeb 0x9b04 0x9b0e 0x97f7 0x98f2 0x9948 0x9a53 0x9a64 0x9a58 0x975c 0x9856 0x98b5 0x9965 0x9971 0x9967 0x96c8 0x97b8 0x9827 0x987f 0x9885 0x9883 0x9649 0x9720 0x9799 0x97d3 0x97d8 0x97d6 0x95d8 0x968d 0x9711 0x9743 0x9748 0x9745 0x957d 0x9608 0x9697 0x96c6 0x96cb 0x96c8 0x9533 0x9591 0x9629 0x9658 0x965c 0x9658 0x94f4 0x952a 0x95c3 0x95f3 0x95f6 0x95f1 0x94bc 0x94d6 0x9565 0x9595 0x9598 0x9592 0x948a 0x9491 0x950e 0x953e 0x9540 0x9538 0x9458 0x9459 0x94bd 0x94f0 0x94ef 0x94e6 0x9429 0x942b 0x9471 0x94aa 0x94a5 0x949b 0x93fa 0x9403 0x942c 0x9467 0x9461 0x9456 0x93cb 0x93dc 0x93ed 0x9426 0x9422 0x9418 0x939a 0x93b7 0x93b6 0x93e7 0x93e7 0x93dd 0x9366 0x9390 0x9384 0x93a6 0x93a1 0x9392 0x9330 0x9367 0x935a 0x9364 0x9348 0x932b 0x92f5 0x933c 0x9330 0x9322 0x92ea 0x92bd 0x92b6 0x9309 0x9301 0x92e2 0x9296 0x925d 0x9274 0x92ce 0x92cf 0x92a2 0x9248 0x9208 0x922d 0x9289 0x9294 0x925e 0x91fe 0x91bc 0x91e4 0x9235 0x924a 0x9214 0x91b6 0x9173 0x919a 0x91d4 0x91f2 0x91c0 0x9166 0x9124 0x9151 0x916d 0x918d 0x9158 0x9101 0x90c0 0x910a 0x9104 0x9119 0x90da 0x9085 0x9045 0x90be 0x90a5 0x90a4 0x9064 0x9011 0x8fd4 0x9066 0x9055 0x9058 0x9026 0x8fde 0x8fa3 0x8ff1 0x9009 0x9027 0x900b 0x8fc1 0x8f87 0x8fa0 0x8fd7 0x9010 0x8ff6 0x8fb0 0x8f76 0x8f3a 0x8f9b 0x8ff2 0x8fd7 0x8f94 0x8f5b 0x8e9d 0x8f3c 0x8fa7 0x8f84 0x8f3f 0x8efc 0x8dbc 0x8e73 0x8ecd 0x8e86 0x8e46 0x8df2 0x8c72 0x8d0b 0x8d41 0x8ce7 0x8ca5 0x8c4f 0x8a95 0x8b0d 0x8b2a 0x8ad3 0x8a9a 0x8a45 0x87f8 0x8865 0x887d 0x881c 0x87ec 0x879d 0x841a 0x8496 0x84d3 0x8488 0x847e 0x8426 0x7eca 0x7f24 0x801b 0x8028 0x7f97 0x7ef0 0x6fcb 0x6e6e 0x6d71 0x6d74 0x6d50 0x6d1a>; + }; + + qcom,pc-temp-z1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x38d1 0x33b6 0x2f09 0x2da0 0x2d49 0x38bb 0x337f 0x2f0d 0x2d9e 0x2d52 0x38c3 0x3376 0x2f0b 0x2da5 0x2d5c 0x38c7 0x337e 0x2f07 0x2da7 0x2d60 0x38d3 0x3382 0x2f03 0x2da8 0x2d62 0x38eb 0x337d 0x2f01 0x2da8 0x2d64 0x38ff 0x336c 0x2f02 0x2da9 0x2d67 0x38f6 0x335e 0x2f03 0x2dac 0x2d6a 0x38d7 0x335d 0x2f05 0x2dae 0x2d6d 0x38b6 0x3362 0x2f09 0x2db1 0x2d6f 0x3896 0x3360 0x2f0d 0x2db5 0x2d72 0x3874 0x334e 0x2f0f 0x2db8 0x2d77 0x3843 0x333c 0x2f0f 0x2dbb 0x2d7b 0x3810 0x332e 0x2f0b 0x2dbb 0x2d7c 0x37ee 0x3328 0x2f04 0x2db9 0x2d7c 0x37d3 0x3329 0x2f01 0x2db7 0x2d7c 0x37b6 0x3329 0x2f04 0x2dbb 0x2d7f 0x3792 0x332c 0x2f0a 0x2dc2 0x2d85 0x3772 0x3337 0x2f14 0x2dc9 0x2d8b 0x3765 0x3349 0x2f21 0x2dce 0x2d8f 0x3763 0x335e 0x2f2c 0x2dd3 0x2d93 0x376a 0x3374 0x2f35 0x2dd8 0x2d98 0x3773 0x3384 0x2f3d 0x2ddd 0x2d9c 0x377f 0x338b 0x2f45 0x2de1 0x2da1 0x3787 0x3391 0x2f4d 0x2de7 0x2da6 0x378c 0x339a 0x2f54 0x2dec 0x2daa 0x378f 0x33a6 0x2f5b 0x2df0 0x2daf 0x3794 0x33ad 0x2f62 0x2df4 0x2db3 0x379f 0x33b2 0x2f69 0x2df8 0x2db7 0x37af 0x33ba 0x2f6f 0x2dfc 0x2dbb 0x37c7 0x33c2 0x2f75 0x2e00 0x2dbf 0x37de 0x33c9 0x2f7a 0x2e04 0x2dc4 0x37e6 0x33d1 0x2f80 0x2e08 0x2dc8 0x37ea 0x33de 0x2f86 0x2e0d 0x2dcd 0x37f0 0x33f1 0x2f8e 0x2e12 0x2dd1 0x3807 0x3403 0x2f95 0x2e17 0x2dd5 0x383b 0x3415 0x2f9d 0x2e1a 0x2dd8 0x386b 0x3422 0x2fa5 0x2e1c 0x2dda 0x3891 0x3427 0x2faa 0x2e1f 0x2ddc 0x38b0 0x3429 0x2fad 0x2e21 0x2ddd 0x38b2 0x342d 0x2fb1 0x2e23 0x2dde 0x3888 0x3439 0x2fb9 0x2e25 0x2de0 0x3873 0x3448 0x2fbf 0x2e27 0x2de1 0x386e 0x3457 0x2fc0 0x2e28 0x2de2 0x3861 0x3449 0x2fc4 0x2e29 0x2de2 0x386f 0x3454 0x2fc7 0x2e2b 0x2de2 0x3869 0x3454 0x2fc8 0x2e2b 0x2de1 0x3868 0x345b 0x2fc9 0x2e2b 0x2de2 0x385f 0x3457 0x2fcf 0x2e2c 0x2de3 0x387c 0x3452 0x2fd1 0x2e30 0x2de6 0x3886 0x346f 0x2fdb 0x2e36 0x2deb 0x38aa 0x3476 0x2ff3 0x2e3f 0x2df0 0x3895 0x349e 0x3007 0x2e4a 0x2dfa 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06>; + }; + + qcom,pc-temp-z2-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2bb8 0x2632 0x2811 0x296b 0x2a9e 0x280d 0x2a3d 0x2824 0x28fa 0x293e 0x25fe 0x2926 0x282f 0x28bc 0x28c4 0x2606 0x274d 0x282a 0x28ad 0x28ac 0x2620 0x26d2 0x281d 0x2898 0x28a6 0x262f 0x26c3 0x2815 0x288c 0x28a4 0x2631 0x26b5 0x2811 0x2887 0x28a8 0x262c 0x26aa 0x2812 0x2882 0x28ac 0x2625 0x26a2 0x2816 0x2880 0x28ac 0x261b 0x269c 0x2819 0x2884 0x28b5 0x2612 0x2698 0x2813 0x2887 0x28cc 0x2616 0x2696 0x27f3 0x288e 0x28d4 0x2626 0x2699 0x27d7 0x28ae 0x28d3 0x262c 0x26a7 0x27e8 0x28bd 0x28d4 0x2618 0x26b3 0x2814 0x289f 0x28d2 0x25f5 0x26b6 0x282a 0x2883 0x28c7 0x25e5 0x26ba 0x2827 0x288f 0x28d1 0x25e1 0x26c3 0x281d 0x28b2 0x290a 0x25dd 0x26dd 0x2837 0x28e1 0x2937 0x25d6 0x26fd 0x2894 0x2931 0x293f 0x25c9 0x271e 0x28ce 0x296a 0x293f 0x25be 0x2742 0x28b3 0x2939 0x2923 0x25b7 0x2760 0x2883 0x28bd 0x28ee 0x25b1 0x2775 0x2863 0x288b 0x28cc 0x259f 0x2784 0x284c 0x289e 0x28b4 0x2574 0x278c 0x283f 0x28b6 0x28a5 0x2552 0x2793 0x283c 0x28a9 0x28a6 0x2544 0x2797 0x283d 0x2890 0x28af 0x250b 0x2796 0x2845 0x2888 0x28ba 0x24d2 0x2793 0x2859 0x2888 0x28cd 0x24c0 0x2792 0x286f 0x288c 0x28e8 0x24b3 0x2793 0x2885 0x289f 0x290a 0x24aa 0x2795 0x289c 0x28c5 0x2934 0x24a2 0x2799 0x28b4 0x28ea 0x2962 0x249c 0x27a2 0x28ce 0x290a 0x299b 0x2498 0x27aa 0x28df 0x2925 0x29c7 0x249e 0x27b2 0x28e4 0x293c 0x29d8 0x24a4 0x27b7 0x28e7 0x2954 0x29e2 0x24ad 0x27bb 0x28ef 0x2961 0x29ed 0x24b6 0x27c0 0x28fb 0x2964 0x29f9 0x24b5 0x27c2 0x2901 0x2965 0x2a01 0x24a8 0x27b9 0x28fa 0x2971 0x2a03 0x24a4 0x279c 0x28f3 0x2981 0x2a07 0x24aa 0x26ec 0x28f1 0x2987 0x2a1d 0x246c 0x26c6 0x28d6 0x2992 0x2a3b 0x2459 0x26cc 0x28c6 0x29ad 0x2a38 0x2447 0x26dc 0x28df 0x29c9 0x2a6a 0x2449 0x26cd 0x293d 0x29ca 0x2a89 0x243a 0x26ed 0x297e 0x2a06 0x2aa5 0x243e 0x26c3 0x2925 0x29d7 0x2a55 0x2464 0x269c 0x28de 0x298a 0x29c5 0x246e 0x264f 0x28b9 0x2971 0x29af 0x2445 0x25fc 0x289b 0x2927 0x295f 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904>; + }; + + qcom,pc-temp-z3-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4c45 0x4be7 0x4bad 0x4bb7 0x4b9b 0x4d48 0x4c26 0x4bd0 0x4baa 0x4b96 0x4dd0 0x4c76 0x4bee 0x4bac 0x4b97 0x4de1 0x4cc3 0x4bfa 0x4bb4 0x4b9c 0x4dce 0x4cd9 0x4bff 0x4bb6 0x4b9f 0x4db7 0x4cdc 0x4c00 0x4bb7 0x4ba2 0x4dac 0x4cdd 0x4bfe 0x4bb5 0x4ba2 0x4da7 0x4cdd 0x4bfb 0x4bb0 0x4b9f 0x4da5 0x4ce0 0x4bf8 0x4bac 0x4b9b 0x4da2 0x4ce2 0x4bf6 0x4bac 0x4b99 0x4da0 0x4cd4 0x4bf0 0x4bac 0x4b98 0x4da5 0x4cac 0x4bdf 0x4ba7 0x4b98 0x4db6 0x4c9a 0x4bc8 0x4b9b 0x4b95 0x4dc5 0x4cb6 0x4bce 0x4b96 0x4b91 0x4db4 0x4cd7 0x4bef 0x4ba3 0x4b93 0x4d83 0x4cd1 0x4c01 0x4bb3 0x4b97 0x4d54 0x4cac 0x4bec 0x4bad 0x4b94 0x4d30 0x4c8a 0x4bd0 0x4b9c 0x4b8a 0x4d0e 0x4c6f 0x4bcf 0x4b98 0x4b87 0x4cf1 0x4c5e 0x4be1 0x4ba6 0x4b8e 0x4cd8 0x4c62 0x4bee 0x4bb3 0x4b97 0x4cc6 0x4c75 0x4bef 0x4bb3 0x4b9d 0x4cbc 0x4c87 0x4bef 0x4bae 0x4ba1 0x4cb4 0x4c93 0x4bed 0x4bad 0x4ba2 0x4cac 0x4c9c 0x4bea 0x4bb4 0x4ba0 0x4ca3 0x4c9d 0x4be9 0x4bba 0x4b9e 0x4c97 0x4c9b 0x4bef 0x4bb7 0x4b9c 0x4c8c 0x4c97 0x4bf5 0x4bb2 0x4b9a 0x4c7f 0x4c91 0x4bf6 0x4bae 0x4b98 0x4c6f 0x4c8a 0x4bf4 0x4ba9 0x4b96 0x4c5d 0x4c84 0x4bf2 0x4ba5 0x4b94 0x4c4a 0x4c7f 0x4bef 0x4ba2 0x4b91 0x4c3a 0x4c7a 0x4bea 0x4ba0 0x4b8e 0x4c2b 0x4c73 0x4be7 0x4b9f 0x4b8a 0x4c1e 0x4c6b 0x4be5 0x4b9e 0x4b86 0x4c17 0x4c65 0x4be2 0x4b9e 0x4b84 0x4c1b 0x4c5f 0x4bde 0x4b9e 0x4b84 0x4c23 0x4c5a 0x4bda 0x4b9d 0x4b86 0x4c39 0x4c56 0x4bd7 0x4b9c 0x4b86 0x4c4f 0x4c53 0x4bd6 0x4b97 0x4b83 0x4c46 0x4c4f 0x4bd4 0x4b93 0x4b81 0x4c28 0x4c4a 0x4bd2 0x4b93 0x4b82 0x4c1b 0x4c3f 0x4bd0 0x4b93 0x4b82 0x4c19 0x4bfb 0x4bcc 0x4b93 0x4b83 0x4bac 0x4bb3 0x4bb6 0x4b90 0x4b7f 0x4b91 0x4b94 0x4ba0 0x4b89 0x4b78 0x4b89 0x4b8c 0x4b9e 0x4b80 0x4b70 0x4b8b 0x4b87 0x4b8e 0x4b7e 0x4b70 0x4b74 0x4b76 0x4b83 0x4b7c 0x4b6d 0x4b78 0x4b75 0x4b98 0x4b87 0x4b7c 0x4bab 0x4b91 0x4b9b 0x4b8b 0x4b83 0x4bda 0x4b96 0x4b9d 0x4b8e 0x4b84 0x4bf2 0x4b94 0x4b99 0x4b92 0x4b87 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c>; + }; + + qcom,pc-temp-z4-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4001 0x3c8d 0x3a72 0x3978 0x397b 0x40ed 0x3c83 0x3a6f 0x39c6 0x39b9 0x40da 0x3c60 0x3a4a 0x39d2 0x39c2 0x4086 0x3c0a 0x3a21 0x39c0 0x39b5 0x4000 0x3ba1 0x39fb 0x39a7 0x399e 0x3f71 0x3b4a 0x39dc 0x3990 0x3986 0x3ef7 0x3b02 0x39c2 0x3981 0x3976 0x3e89 0x3acb 0x39ac 0x3976 0x396c 0x3e16 0x3aa0 0x39a0 0x3970 0x3966 0x3d82 0x3a79 0x399a 0x396d 0x3961 0x3cf4 0x3a50 0x3998 0x396a 0x395d 0x3cc5 0x3a2f 0x3998 0x3965 0x3959 0x3cdb 0x3a29 0x3999 0x395f 0x3951 0x3cf0 0x3a35 0x399d 0x3961 0x394e 0x3cc2 0x3a3c 0x39a2 0x3970 0x395b 0x3c4c 0x3a29 0x39a0 0x397b 0x3968 0x3beb 0x39fe 0x398c 0x396b 0x395e 0x3bb2 0x39dd 0x3979 0x394d 0x3947 0x3b8d 0x39c9 0x3978 0x394f 0x3946 0x3b7e 0x39bd 0x3982 0x3988 0x3974 0x3b75 0x39bc 0x3996 0x39ba 0x39a6 0x3b71 0x39bf 0x39ca 0x39be 0x39ab 0x3b75 0x39c9 0x39fe 0x39b9 0x399f 0x3b7b 0x39fa 0x39fe 0x39ae 0x3991 0x3b80 0x3a38 0x39df 0x3993 0x3982 0x3b85 0x3a46 0x39bf 0x397d 0x3975 0x3b8c 0x3a43 0x39a7 0x3973 0x396c 0x3b92 0x3a3e 0x3994 0x396e 0x3965 0x3b9e 0x3a2f 0x3989 0x3969 0x395f 0x3bab 0x3a18 0x3982 0x3965 0x395a 0x3bb3 0x3a05 0x397d 0x3962 0x3955 0x3bba 0x39f5 0x397b 0x395e 0x3951 0x3bbe 0x39e5 0x397a 0x395a 0x394e 0x3bbc 0x39d6 0x3979 0x395a 0x394d 0x3bb5 0x39c8 0x3979 0x395c 0x3950 0x3ba1 0x39ba 0x3978 0x395e 0x3955 0x3b72 0x39ac 0x3976 0x3961 0x395b 0x3b43 0x39a1 0x3973 0x3963 0x3961 0x3afc 0x399e 0x3970 0x3963 0x3963 0x3abc 0x399c 0x396d 0x3963 0x3960 0x3ab4 0x3999 0x396a 0x3962 0x395d 0x3abb 0x3994 0x3967 0x3960 0x395c 0x3ab9 0x3995 0x3962 0x395d 0x395b 0x3aa3 0x39d0 0x395a 0x3959 0x3958 0x3abd 0x39eb 0x3957 0x394b 0x394c 0x3ac6 0x39f6 0x3953 0x3935 0x3934 0x3acb 0x39f8 0x394d 0x3931 0x392d 0x3ac3 0x39fa 0x3959 0x3929 0x3920 0x3ad0 0x3a03 0x3961 0x3925 0x391e 0x3ac0 0x39ff 0x394e 0x392e 0x392c 0x3a9b 0x39f7 0x3956 0x3935 0x3930 0x3a8e 0x39fe 0x3959 0x3936 0x3935 0x3a94 0x3a0e 0x3963 0x3937 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936>; + }; + + qcom,pc-temp-z5-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2b3c 0x2daa 0x3498 0x4a8d 0x45cc 0x2ef0 0x3052 0x39fb 0x4721 0x484e 0x3117 0x343d 0x3f9f 0x4802 0x4a61 0x31df 0x385f 0x430e 0x4b83 0x4d9f 0x326a 0x3a69 0x44ec 0x4e02 0x5124 0x32f3 0x3bab 0x4673 0x5049 0x55e1 0x33c6 0x3ce5 0x4810 0x514c 0x5936 0x34d0 0x3e95 0x49be 0x511b 0x5a23 0x35db 0x4119 0x4b35 0x5160 0x5a1d 0x36fa 0x4312 0x4c4c 0x5327 0x5b6b 0x3859 0x42b6 0x4bad 0x5424 0x5e2c 0x3a2d 0x3f5c 0x45e6 0x5167 0x6138 0x3c44 0x3ed3 0x3ee4 0x49ed 0x6100 0x3d63 0x47a6 0x4250 0x472f 0x5e7d 0x3d9a 0x506d 0x5049 0x50b3 0x5f98 0x3db5 0x5016 0x57f1 0x5c40 0x639a 0x3dda 0x4c6d 0x532f 0x5d14 0x64bc 0x3dd6 0x4a75 0x4bb9 0x59b9 0x646c 0x3d86 0x49e6 0x55e6 0x5b90 0x6454 0x3cdc 0x49b6 0x76e4 0x6b24 0x646b 0x3bcd 0x5034 0x875d 0x7705 0x6492 0x3ad1 0x649b 0x78a4 0x6a60 0x5e9c 0x3a04 0x7968 0x6282 0x5014 0x511e 0x3939 0x8c1a 0x56c4 0x4873 0x4bc7 0x3846 0x9a39 0x4fd8 0x5026 0x4d8e 0x3716 0x9aa6 0x4dfb 0x5780 0x5074 0x35e9 0x91df 0x53c1 0x5aa0 0x53ba 0x34ed 0x87db 0x5d83 0x5d20 0x57f1 0x33ea 0x7eb5 0x65eb 0x5e8b 0x5cc6 0x32dd 0x764e 0x6eb9 0x601d 0x628a 0x31ca 0x720c 0x75c6 0x61b9 0x67fc 0x30bf 0x6fd5 0x79eb 0x63f1 0x6c9c 0x2ffa 0x6e15 0x7d26 0x6810 0x7085 0x2f5e 0x6c28 0x8068 0x6dc5 0x7165 0x2ed6 0x6a83 0x83d1 0x7653 0x6fdc 0x2e78 0x6a47 0x8529 0x7b5b 0x6e81 0x2ea9 0x6b32 0x8003 0x7adf 0x6f61 0x2f11 0x6ca0 0x7890 0x796f 0x710e 0x303e 0x6e9b 0x7749 0x7672 0x709c 0x317f 0x7119 0x77a9 0x6cad 0x6a94 0x3162 0x71bd 0x77df 0x65cc 0x65f5 0x300b 0x6c45 0x7771 0x66c4 0x66af 0x2fb0 0x60cd 0x7669 0x680b 0x6789 0x3015 0x4018 0x70b0 0x6813 0x6600 0x2ca4 0x3328 0x596b 0x6764 0x62b7 0x2bbe 0x3022 0x477d 0x6688 0x6215 0x2b68 0x2f70 0x4725 0x57da 0x5967 0x2b6c 0x2f09 0x3dd8 0x58e5 0x64be 0x2ab7 0x2db9 0x398d 0x5bd2 0x6460 0x2ae0 0x2ded 0x457f 0x6bcd 0x75c0 0x2cb0 0x2ff3 0x438f 0x6311 0x7110 0x2d80 0x2fa5 0x439f 0x6129 0x668d 0x2d89 0x2ebe 0x3ec3 0x61e3 0x62ca 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005>; + }; + + qcom,pc-temp-z6-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x409a 0x3c2e 0x39dd 0x392f 0x3913 0x416d 0x3c48 0x39ee 0x394b 0x392d 0x419b 0x3c57 0x39ee 0x3952 0x3933 0x4181 0x3c50 0x39e4 0x394f 0x3931 0x413b 0x3c33 0x39d5 0x3947 0x392a 0x40e4 0x3c0c 0x39c7 0x393d 0x3921 0x409c 0x3be5 0x39bb 0x3935 0x391b 0x4062 0x3bcb 0x39b0 0x392e 0x3915 0x4027 0x3bb9 0x39aa 0x392a 0x3910 0x3fe0 0x3ba7 0x39a7 0x3929 0x390e 0x3f9a 0x3b8a 0x39a3 0x3928 0x390c 0x3f73 0x3b64 0x399a 0x3924 0x390b 0x3f65 0x3b56 0x398e 0x391c 0x3906 0x3f55 0x3b62 0x3992 0x3919 0x3903 0x3f1e 0x3b70 0x39a4 0x3927 0x390a 0x3ec0 0x3b64 0x39ac 0x3933 0x3912 0x3e70 0x3b3f 0x3999 0x392a 0x390c 0x3e3a 0x3b22 0x3982 0x3915 0x38fe 0x3e0f 0x3b10 0x3982 0x3914 0x38fc 0x3df2 0x3b06 0x3991 0x3936 0x3915 0x3ddc 0x3b09 0x39a5 0x3953 0x3930 0x3dd2 0x3b19 0x39c1 0x3956 0x3934 0x3dd2 0x3b2e 0x39d7 0x3953 0x3934 0x3dd7 0x3b4e 0x39d6 0x394f 0x3932 0x3ddc 0x3b6d 0x39c9 0x3948 0x392b 0x3de1 0x3b75 0x39be 0x3942 0x3924 0x3de6 0x3b75 0x39b8 0x393d 0x391f 0x3dea 0x3b74 0x39b4 0x3938 0x391c 0x3dee 0x3b6e 0x39b1 0x3935 0x3919 0x3df0 0x3b64 0x39ae 0x3931 0x3916 0x3df0 0x3b5c 0x39ab 0x392e 0x3913 0x3df0 0x3b54 0x39a9 0x392b 0x3910 0x3def 0x3b4c 0x39a8 0x3928 0x390d 0x3ded 0x3b46 0x39a7 0x3928 0x390c 0x3deb 0x3b40 0x39a7 0x3929 0x390c 0x3deb 0x3b3c 0x39a6 0x392a 0x390c 0x3ded 0x3b38 0x39a4 0x392c 0x390f 0x3def 0x3b35 0x39a2 0x392d 0x3913 0x3def 0x3b35 0x39a0 0x392d 0x3914 0x3dee 0x3b36 0x399f 0x392a 0x3912 0x3deb 0x3b36 0x399e 0x3928 0x3910 0x3de2 0x3b35 0x399d 0x3927 0x3910 0x3dd8 0x3b34 0x399b 0x3927 0x390f 0x3dcd 0x3b2c 0x3997 0x3926 0x390f 0x3da1 0x3b16 0x398b 0x391d 0x3908 0x3d94 0x3b10 0x397f 0x3911 0x38f9 0x3d93 0x3b0a 0x397c 0x390a 0x38f2 0x3d8f 0x3b0c 0x3979 0x3906 0x38ec 0x3d8d 0x3b07 0x3977 0x3903 0x38ea 0x3d95 0x3b0c 0x397c 0x390d 0x38f8 0x3da1 0x3b20 0x3983 0x3914 0x38ff 0x3dbd 0x3b30 0x398c 0x3918 0x3902 0x3de0 0x3b45 0x3993 0x391d 0x3906 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d>; + }; + + qcom,pc-temp-y1-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1dae 0x1a6c 0x17b7 0x1540 0x1467 0x143b 0x1db4 0x1a6f 0x17c3 0x153f 0x1466 0x143d 0x1dc0 0x1a74 0x17ca 0x153e 0x1466 0x143e 0x1dcd 0x1a7a 0x17ce 0x153c 0x1466 0x1440 0x1dd8 0x1a7e 0x17d0 0x153b 0x1467 0x1441 0x1ddd 0x1a80 0x17d0 0x153a 0x1467 0x1443 0x1ddc 0x1a80 0x17cc 0x153a 0x1468 0x1443 0x1dda 0x1a80 0x17c6 0x153a 0x146a 0x1444 0x1dd3 0x1a7d 0x17c5 0x153b 0x146c 0x1445 0x1dbc 0x1a76 0x17c8 0x153c 0x146d 0x1446 0x1daa 0x1a70 0x17ca 0x153d 0x146f 0x1448 0x1db3 0x1a6e 0x17c6 0x153d 0x1470 0x1449 0x1dc8 0x1a6f 0x17c0 0x153d 0x1472 0x144b 0x1ddc 0x1a74 0x17c1 0x153e 0x1474 0x144d 0x1df4 0x1a85 0x17d0 0x1545 0x1479 0x1452 0x1e03 0x1a97 0x17db 0x154d 0x147c 0x1454 0x1dfa 0x1aa4 0x17df 0x154f 0x147c 0x1455 0x1de7 0x1aaf 0x17e3 0x1552 0x147d 0x1455 0x1dd8 0x1ab0 0x17e4 0x1554 0x147e 0x1456 0x1dca 0x1aa1 0x17e2 0x1555 0x1480 0x1459 0x1dc3 0x1a95 0x17e2 0x1558 0x1483 0x145c 0x1dd6 0x1a97 0x17ed 0x155c 0x1487 0x1460 0x1df9 0x1a9f 0x17fb 0x1560 0x148b 0x1463 0x1e01 0x1aa5 0x17fd 0x1565 0x148e 0x1467 0x1e00 0x1aa8 0x17f8 0x1569 0x1491 0x146a 0x1e04 0x1aac 0x17f7 0x156d 0x1493 0x146e 0x1e09 0x1ab8 0x1800 0x1571 0x1496 0x1472 0x1e0c 0x1acc 0x180b 0x1576 0x149a 0x1475 0x1e0a 0x1ad7 0x180e 0x157b 0x149d 0x1478 0x1df8 0x1adc 0x1812 0x1581 0x14a0 0x147a 0x1de0 0x1ade 0x1817 0x1586 0x14a3 0x147d 0x1dd9 0x1adb 0x181b 0x158b 0x14a7 0x1480 0x1ddb 0x1ad7 0x181f 0x1590 0x14aa 0x1484 0x1ddd 0x1ad7 0x1820 0x1593 0x14ad 0x1487 0x1de1 0x1ad5 0x1821 0x1596 0x14b0 0x1489 0x1de8 0x1ad3 0x1823 0x1599 0x14b2 0x148b 0x1df7 0x1adf 0x1827 0x159b 0x14b4 0x148c 0x1e0a 0x1aef 0x182c 0x159d 0x14b5 0x148d 0x1e0d 0x1aef 0x1831 0x159e 0x14b5 0x148e 0x1dff 0x1ae3 0x1835 0x159f 0x14b6 0x148e 0x1df5 0x1adf 0x183a 0x15a1 0x14b7 0x148f 0x1df6 0x1ae5 0x1841 0x15a5 0x14b9 0x1491 0x1df6 0x1aeb 0x184c 0x15a8 0x14ba 0x1492 0x1df6 0x1af2 0x1849 0x15aa 0x14bb 0x1493 0x1dfa 0x1af8 0x1850 0x15af 0x14be 0x1495 0x1e04 0x1b0b 0x1850 0x15b1 0x14be 0x1496 0x1e09 0x1b08 0x1859 0x15b4 0x14be 0x1496 0x1e26 0x1b0e 0x1863 0x15b4 0x14be 0x1496 0x1e37 0x1b0b 0x186b 0x15b6 0x14bf 0x1496 0x1e2c 0x1b1e 0x1867 0x15b9 0x14c2 0x1498 0x1e29 0x1b3f 0x1879 0x15c2 0x14c5 0x149b 0x1e38 0x1b5b 0x1895 0x15d1 0x14cc 0x14a0 0x1e61 0x1b5f 0x18a8 0x15e4 0x14d3 0x14a6 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac>; + }; + + qcom,pc-temp-y2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x25d6 0x28a1 0x29b8 0x2b2a 0x2b60 0x2c89 0x2638 0x287f 0x299b 0x2b15 0x2b62 0x2c51 0x2674 0x286a 0x297a 0x2afb 0x2b61 0x2bfc 0x2693 0x285f 0x2959 0x2ade 0x2b5e 0x2ba2 0x269f 0x285b 0x293d 0x2abd 0x2b58 0x2b5a 0x26a2 0x285a 0x292b 0x2a9a 0x2b51 0x2b3c 0x266c 0x2867 0x2922 0x2a6d 0x2b48 0x2b43 0x260b 0x287d 0x291b 0x2a3f 0x2b3b 0x2b4e 0x25f2 0x2878 0x2916 0x2a29 0x2b28 0x2b4d 0x25fe 0x283e 0x2912 0x2a1c 0x2b09 0x2b3a 0x2615 0x2814 0x2910 0x2a13 0x2ae5 0x2b24 0x2698 0x2862 0x291a 0x2a04 0x2ab6 0x2afb 0x2784 0x28ea 0x2933 0x29f0 0x2a85 0x2ac3 0x27ba 0x2909 0x295a 0x29f2 0x2a7a 0x2abc 0x26d8 0x28f6 0x29a8 0x2a1d 0x2a90 0x2af0 0x2601 0x28e9 0x29e0 0x2a53 0x2ab0 0x2b19 0x25e5 0x28ff 0x29fa 0x2a91 0x2aec 0x2b1b 0x25de 0x2924 0x2a0e 0x2ad0 0x2b33 0x2b18 0x25d8 0x292d 0x2a1d 0x2aef 0x2b47 0x2b23 0x25d2 0x292c 0x2a2b 0x2afc 0x2b48 0x2b59 0x25cd 0x2929 0x2a36 0x2b0a 0x2b4a 0x2b9b 0x25ca 0x28f3 0x2a3f 0x2b29 0x2b78 0x2bd9 0x25c8 0x2849 0x2a48 0x2b54 0x2bc0 0x2c13 0x25c6 0x27d1 0x2a4b 0x2b74 0x2be2 0x2c3d 0x25c3 0x275f 0x2a50 0x2b8f 0x2bf6 0x2c5c 0x25c0 0x271c 0x2a54 0x2ba1 0x2c07 0x2c71 0x25bf 0x270e 0x2a52 0x2bac 0x2c19 0x2c83 0x25be 0x2700 0x2a4a 0x2bb0 0x2c2d 0x2c96 0x25bd 0x26ed 0x2a46 0x2ba7 0x2c35 0x2cb5 0x25bc 0x26d4 0x2a44 0x2b8e 0x2c41 0x2cec 0x25bb 0x26b9 0x2a3f 0x2b80 0x2c4d 0x2d11 0x25bb 0x26a1 0x29e9 0x2b83 0x2c40 0x2d02 0x25ba 0x268b 0x294e 0x2b8f 0x2c2f 0x2cda 0x25b9 0x2672 0x290b 0x2b9c 0x2c33 0x2cca 0x25b8 0x2655 0x28fa 0x2b99 0x2c39 0x2cd1 0x25b8 0x263a 0x28ee 0x2b84 0x2c35 0x2cd6 0x25b7 0x2622 0x28e6 0x2b68 0x2c34 0x2cdc 0x25b7 0x2604 0x290b 0x2b59 0x2c39 0x2ce8 0x25b6 0x25ec 0x293c 0x2b5f 0x2c3b 0x2ce7 0x25b6 0x25de 0x291d 0x2b60 0x2c36 0x2cd1 0x25b6 0x25d4 0x28ba 0x2b5f 0x2c32 0x2cc5 0x25b6 0x25cb 0x289c 0x2b62 0x2c34 0x2ccc 0x25b6 0x25c4 0x28a6 0x2b5d 0x2c32 0x2ccf 0x25b5 0x25be 0x281b 0x2b46 0x2c13 0x2cc8 0x25b5 0x25bb 0x27d7 0x2b34 0x2c13 0x2cb0 0x25b5 0x25bb 0x27c4 0x2b11 0x2c20 0x2c82 0x25b5 0x25ba 0x2810 0x2b0d 0x2c0a 0x2c51 0x25b5 0x25b9 0x2851 0x2b23 0x2be8 0x2c48 0x25b5 0x25b8 0x2853 0x2b28 0x2bef 0x2c50 0x25b4 0x25b8 0x2837 0x2ae6 0x2c1e 0x2c3a 0x25b4 0x25b6 0x2800 0x2acc 0x2bf7 0x2bfd 0x25b4 0x25b5 0x27bc 0x2aa1 0x2b7e 0x2ba7 0x25b4 0x25b4 0x2786 0x2a49 0x2b0f 0x2b35 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a>; + }; + + qcom,pc-temp-y3-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x347a 0x3456 0x3421 0x33e5 0x33e0 0x33d8 0x356b 0x345f 0x341a 0x33e4 0x33e0 0x33da 0x35ff 0x346c 0x3416 0x33e3 0x33e0 0x33db 0x364d 0x3479 0x3416 0x33e3 0x33e0 0x33dd 0x366b 0x3484 0x3418 0x33e3 0x33e0 0x33de 0x3670 0x3489 0x341c 0x33e5 0x33e0 0x33de 0x35ec 0x3489 0x3423 0x33e8 0x33e0 0x33de 0x34fc 0x3488 0x342b 0x33ed 0x33e1 0x33de 0x34bb 0x348b 0x342e 0x33ef 0x33e1 0x33de 0x34ba 0x349e 0x342f 0x33f0 0x33e1 0x33dd 0x34bb 0x34ac 0x3430 0x33f0 0x33e1 0x33dd 0x34d3 0x349e 0x343d 0x33f7 0x33e4 0x33df 0x3504 0x3481 0x3450 0x3401 0x33e9 0x33e2 0x3510 0x3471 0x3451 0x3402 0x33ea 0x33e3 0x34ec 0x3468 0x343b 0x33fe 0x33e8 0x33e2 0x34cc 0x3462 0x3427 0x33fb 0x33e6 0x33e2 0x34d0 0x345f 0x3422 0x33fd 0x33e8 0x33e2 0x34e0 0x345d 0x341f 0x3401 0x33ec 0x33e3 0x34e7 0x345a 0x341b 0x3401 0x33ec 0x33e3 0x34e9 0x3455 0x3416 0x33f9 0x33e7 0x33e0 0x34ea 0x344f 0x3411 0x33f0 0x33e3 0x33dd 0x34ec 0x3445 0x340c 0x33e8 0x33e1 0x33dc 0x34f0 0x3435 0x3407 0x33e3 0x33e0 0x33db 0x34f5 0x3427 0x3406 0x33e2 0x33df 0x33db 0x3500 0x341c 0x3405 0x33e3 0x33de 0x33db 0x3512 0x3417 0x3405 0x33e4 0x33de 0x33da 0x3525 0x3418 0x3405 0x33e3 0x33de 0x33da 0x3539 0x341b 0x3405 0x33e3 0x33dd 0x33da 0x354f 0x341f 0x3405 0x33e5 0x33dd 0x33da 0x356b 0x3423 0x3405 0x33e9 0x33dd 0x33d9 0x358d 0x3428 0x3405 0x33ec 0x33dd 0x33d9 0x35b2 0x342d 0x3400 0x33ed 0x33de 0x33d9 0x35da 0x3434 0x33f9 0x33ec 0x33de 0x33da 0x360a 0x343c 0x33f6 0x33ec 0x33df 0x33da 0x3641 0x3449 0x33f7 0x33ea 0x33de 0x33da 0x3680 0x3458 0x33f8 0x33e8 0x33de 0x33d9 0x36c1 0x3468 0x33fb 0x33e6 0x33de 0x33d9 0x3702 0x347a 0x3402 0x33e4 0x33dd 0x33d9 0x3742 0x3490 0x3408 0x33e3 0x33dd 0x33d9 0x3781 0x34b0 0x340c 0x33e3 0x33dd 0x33d9 0x37c1 0x34dc 0x340f 0x33e3 0x33dd 0x33d9 0x3803 0x3511 0x3415 0x33e3 0x33de 0x33da 0x3845 0x3550 0x341e 0x33e3 0x33de 0x33da 0x3892 0x35a3 0x3421 0x33e4 0x33de 0x33da 0x38ea 0x3613 0x3429 0x33e3 0x33de 0x33da 0x390d 0x3642 0x3430 0x33eb 0x33df 0x33dc 0x393f 0x363e 0x3435 0x33ec 0x33e1 0x33dd 0x395c 0x3658 0x3442 0x33f0 0x33e3 0x33e0 0x398d 0x36b9 0x3451 0x33f2 0x33e2 0x33e0 0x3a0b 0x3718 0x3452 0x33ee 0x33e1 0x33dd 0x3a97 0x37a6 0x345a 0x33f0 0x33e0 0x33dd 0x3b31 0x3888 0x346f 0x33f5 0x33e3 0x33e1 0x3c10 0x3978 0x3492 0x33f9 0x33e6 0x33e4 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6>; + }; + + qcom,pc-temp-y4-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x45b5 0x41d2 0x40f2 0x406d 0x4045 0x4044 0x452b 0x41db 0x40ef 0x4073 0x4045 0x4042 0x44eb 0x41eb 0x40ef 0x4078 0x4047 0x4041 0x44e9 0x4200 0x40f2 0x407b 0x4048 0x4040 0x4515 0x421b 0x40f7 0x407d 0x404a 0x4040 0x4561 0x4239 0x40fe 0x407e 0x404b 0x4040 0x4627 0x4263 0x4106 0x407c 0x404d 0x4041 0x478b 0x428e 0x4111 0x407a 0x404e 0x4044 0x4914 0x42a4 0x411c 0x407a 0x4051 0x4046 0x4b24 0x42ad 0x4127 0x4081 0x4055 0x4049 0x4c74 0x42bc 0x4138 0x408c 0x405b 0x404d 0x4a3e 0x4407 0x419f 0x409e 0x4069 0x4059 0x4560 0x4626 0x4237 0x40b4 0x407d 0x4068 0x437a 0x4642 0x4251 0x40bd 0x4081 0x406c 0x4347 0x43a8 0x4203 0x40bf 0x407d 0x406b 0x432d 0x41b1 0x41aa 0x40c3 0x407b 0x406a 0x4320 0x41b5 0x416e 0x40ec 0x4091 0x407a 0x430d 0x41e2 0x413b 0x4129 0x40ba 0x4098 0x42ef 0x41ed 0x4117 0x412a 0x40c0 0x409d 0x42b4 0x41c5 0x40fa 0x40d1 0x4094 0x407d 0x4274 0x4198 0x40e3 0x4085 0x4066 0x405b 0x4249 0x4180 0x40d4 0x4078 0x4054 0x404d 0x4228 0x416e 0x40c8 0x4072 0x4049 0x4043 0x421f 0x416b 0x40c2 0x406f 0x4048 0x4042 0x4223 0x415f 0x40be 0x406b 0x4048 0x4042 0x422b 0x414f 0x40bb 0x4069 0x4049 0x4043 0x4231 0x4143 0x40ba 0x406b 0x404b 0x4045 0x423b 0x4137 0x40ba 0x406d 0x404e 0x4048 0x4246 0x4136 0x40b9 0x406e 0x4051 0x404c 0x4252 0x4142 0x40b4 0x4070 0x4057 0x4051 0x425e 0x4154 0x40b0 0x4072 0x405e 0x4058 0x426a 0x4167 0x40b4 0x4074 0x4068 0x4063 0x4276 0x417f 0x40bd 0x4076 0x4073 0x4070 0x4283 0x4198 0x40c4 0x4074 0x4075 0x4072 0x4290 0x41b2 0x40c9 0x4069 0x4064 0x4061 0x429c 0x41cd 0x40cd 0x405e 0x404f 0x404c 0x42a8 0x41ef 0x40d2 0x405b 0x4044 0x4043 0x42b5 0x421f 0x40d8 0x4059 0x403e 0x403f 0x42c7 0x4244 0x40dc 0x405a 0x403e 0x4040 0x42e1 0x4252 0x40e9 0x405d 0x4042 0x4045 0x4308 0x425c 0x40fd 0x4060 0x4047 0x404a 0x433b 0x4262 0x410c 0x4063 0x4048 0x404b 0x437e 0x4270 0x4118 0x4064 0x4046 0x4048 0x43d3 0x4287 0x4129 0x4061 0x403d 0x403b 0x442a 0x42c2 0x4147 0x406b 0x4041 0x403e 0x441b 0x42ef 0x4160 0x4075 0x4057 0x405a 0x441e 0x4307 0x4166 0x4084 0x4070 0x4078 0x43ed 0x432a 0x4193 0x40a2 0x4099 0x40a2 0x43d0 0x436e 0x41e6 0x40be 0x409c 0x4098 0x43e5 0x4383 0x41de 0x409e 0x406e 0x4064 0x43f6 0x4384 0x41d8 0x409e 0x4060 0x4059 0x4411 0x43a0 0x41fb 0x40bd 0x4070 0x4067 0x4463 0x43f1 0x4266 0x40fb 0x4090 0x4085 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118>; + }; + + qcom,pc-temp-y5-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2208 0x348a 0x3ab0 0x3545 0x4573 0x3634 0x2208 0x34aa 0x3839 0x3326 0x4393 0x3e82 0x269f 0x34e2 0x3660 0x31db 0x419b 0x43da 0x2f8b 0x3522 0x3519 0x3130 0x3fbf 0x46e0 0x3428 0x3557 0x345a 0x30f0 0x3e34 0x4838 0x3590 0x3572 0x341a 0x30e7 0x3d2f 0x4884 0x30ee 0x3576 0x34b3 0x32d3 0x3ca4 0x46c7 0x2869 0x3578 0x35a4 0x35e5 0x3c3f 0x4385 0x267f 0x34b6 0x35c2 0x3648 0x3b81 0x4119 0x2a54 0x3032 0x3545 0x34d0 0x3996 0x3e92 0x2ff6 0x2cf8 0x3494 0x33cf 0x387f 0x3ce5 0x37e1 0x2fd6 0x333d 0x3525 0x3964 0x3cfd 0x4112 0x360e 0x319c 0x3768 0x3acb 0x3dbd 0x4280 0x3a64 0x326c 0x37dc 0x3b0d 0x3dbf 0x373b 0x3dd4 0x395e 0x3745 0x3a7a 0x3cb2 0x2cf9 0x3f72 0x3eca 0x36d1 0x3a41 0x3bb0 0x2d03 0x3ec5 0x3f83 0x384b 0x3ae8 0x3b5d 0x2edc 0x3dc2 0x3fc3 0x3b9d 0x3c38 0x3b2b 0x2f8c 0x3d9a 0x3f92 0x3dc7 0x3e57 0x3b93 0x2f1e 0x3df3 0x3ecf 0x3f34 0x4225 0x3e9f 0x2e5c 0x3e54 0x3de6 0x3fc8 0x445b 0x4233 0x2d64 0x3c6d 0x3c08 0x3c17 0x4527 0x44e0 0x2c30 0x3697 0x3971 0x3578 0x4604 0x471b 0x2b6b 0x3248 0x38a0 0x33d2 0x4627 0x47ff 0x2b06 0x2f1a 0x38d8 0x353a 0x4512 0x484d 0x2ad4 0x2d6f 0x3925 0x3660 0x43d2 0x484f 0x2add 0x2d4c 0x3975 0x3678 0x4315 0x4790 0x2aec 0x2d55 0x39cc 0x366c 0x4294 0x45bc 0x2af3 0x2d44 0x3a34 0x38ed 0x427b 0x43ff 0x2b16 0x2d12 0x3b09 0x40ee 0x4270 0x426f 0x2b4e 0x2d07 0x3ba6 0x465a 0x4280 0x41aa 0x2b80 0x2d07 0x38cb 0x47e5 0x43ef 0x42bb 0x2ba9 0x2cec 0x3382 0x48db 0x472c 0x45f6 0x2bd0 0x2ce9 0x319e 0x48b8 0x4a98 0x495f 0x2bf8 0x2d41 0x31a4 0x45bb 0x4e8c 0x4c69 0x2c20 0x2daa 0x31b5 0x4185 0x51da 0x4ea9 0x2c45 0x2dd9 0x3221 0x3e14 0x52fb 0x508e 0x2c64 0x2d8a 0x34af 0x3aee 0x5257 0x524a 0x2c6c 0x2d32 0x3713 0x3918 0x50bc 0x5292 0x2c5a 0x2d52 0x36de 0x38bf 0x4e90 0x50e7 0x2c45 0x2d99 0x34f7 0x3913 0x4dbc 0x4f8f 0x2c53 0x2da9 0x354f 0x3906 0x4ea8 0x5136 0x2cb7 0x2d71 0x370b 0x3898 0x515e 0x56c7 0x2d6c 0x2d2c 0x33cd 0x3962 0x555b 0x5c52 0x2e6e 0x2cc8 0x325a 0x3610 0x4cc2 0x4ea4 0x2fc4 0x2d10 0x320a 0x3e49 0x4394 0x4373 0x30b0 0x2d1b 0x3431 0x3e08 0x42cc 0x40b6 0x322c 0x2e86 0x370e 0x4092 0x40be 0x3f21 0x3256 0x3099 0x3915 0x3fe1 0x3e27 0x3e5b 0x322c 0x3127 0x38b1 0x3e5f 0x428d 0x410e 0x3117 0x3039 0x38e1 0x4283 0x4414 0x4431 0x2f77 0x2f18 0x37f8 0x4528 0x4741 0x4a06 0x2e6f 0x2e5e 0x37ca 0x4396 0x477b 0x4ab1 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b>; + }; + + qcom,pc-temp-y6-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1af4 0x1607 0x1492 0x13c9 0x139d 0x1392 0x1afb 0x160e 0x148d 0x13c8 0x139d 0x1393 0x1aff 0x1616 0x148a 0x13c7 0x139d 0x1394 0x1aff 0x161e 0x148a 0x13c8 0x139d 0x1395 0x1afc 0x1626 0x148c 0x13c9 0x139e 0x1395 0x1af7 0x162e 0x148e 0x13ca 0x139f 0x1396 0x1ac7 0x1636 0x1494 0x13cc 0x139f 0x1397 0x1a78 0x163e 0x149c 0x13cf 0x13a1 0x1397 0x1a74 0x1646 0x14a1 0x13d2 0x13a2 0x1398 0x1aff 0x164c 0x14a3 0x13d4 0x13a3 0x1399 0x1b70 0x1657 0x14a8 0x13d7 0x13a5 0x139a 0x1af4 0x16ac 0x14cc 0x13e2 0x13ac 0x139f 0x19d3 0x172c 0x1503 0x13ef 0x13b5 0x13a6 0x1941 0x172c 0x150b 0x13f2 0x13b7 0x13a8 0x190e 0x1670 0x14e5 0x13f1 0x13b5 0x13a7 0x18f6 0x15e2 0x14be 0x13f0 0x13b3 0x13a7 0x18fb 0x15e4 0x14ab 0x13fd 0x13bb 0x13ac 0x1909 0x15f5 0x149c 0x1412 0x13c9 0x13b5 0x190d 0x15f9 0x148f 0x1412 0x13cb 0x13b7 0x190c 0x15ed 0x1483 0x13f3 0x13bb 0x13ab 0x190a 0x15e0 0x147a 0x13d6 0x13ab 0x139f 0x190d 0x15d6 0x1473 0x13cd 0x13a4 0x139a 0x191a 0x15ce 0x146e 0x13c8 0x13a1 0x1397 0x192c 0x15c9 0x146d 0x13c7 0x13a0 0x1397 0x1945 0x15c7 0x146e 0x13c7 0x13a0 0x1397 0x1964 0x15c6 0x146f 0x13c8 0x13a0 0x1398 0x1982 0x15cb 0x1470 0x13c9 0x13a1 0x1398 0x19a0 0x15d5 0x1473 0x13ca 0x13a2 0x1399 0x19c0 0x15e2 0x1475 0x13cc 0x13a3 0x139a 0x19e6 0x15f3 0x1476 0x13d0 0x13a5 0x139c 0x1a11 0x1607 0x1477 0x13d4 0x13a7 0x139e 0x1a3f 0x161d 0x1478 0x13d6 0x13ab 0x13a2 0x1a72 0x1638 0x1479 0x13d7 0x13af 0x13a6 0x1aa7 0x1655 0x147b 0x13d6 0x13b0 0x13a7 0x1ae0 0x1676 0x147f 0x13d2 0x13ab 0x13a2 0x1b1c 0x169b 0x1483 0x13ce 0x13a5 0x139c 0x1b59 0x16c6 0x1488 0x13cc 0x13a2 0x139a 0x1b96 0x16f8 0x1490 0x13cb 0x13a0 0x1398 0x1bd4 0x1732 0x149a 0x13ca 0x13a0 0x1399 0x1c13 0x1772 0x14a5 0x13cb 0x13a1 0x139a 0x1c51 0x17bc 0x14b0 0x13cd 0x13a3 0x139c 0x1c90 0x1811 0x14bf 0x13ce 0x13a4 0x139d 0x1cd3 0x1875 0x14d0 0x13cf 0x13a3 0x139c 0x1d22 0x18ef 0x14e0 0x13d0 0x13a1 0x1399 0x1d80 0x1984 0x14f9 0x13d2 0x13a3 0x139a 0x1da5 0x19b9 0x150c 0x13db 0x13a9 0x13a3 0x1dcf 0x19c4 0x1513 0x13e1 0x13b2 0x13ad 0x1dde 0x19e7 0x152f 0x13ec 0x13bf 0x13bb 0x1e04 0x1a57 0x155a 0x13f6 0x13c0 0x13b8 0x1e6d 0x1abf 0x1560 0x13eb 0x13b2 0x13a7 0x1edf 0x1b41 0x1573 0x13ee 0x13ae 0x13a5 0x1f66 0x1c0d 0x15ab 0x13fd 0x13b6 0x13ac 0x2034 0x1cdf 0x160e 0x1415 0x13c2 0x13b7 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4>; + }; + }; + }; + }; + }; + + fragment@12 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm1 { + reg = <0x4f>; + label = "pa_therm1"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@13 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x4d 0xffffffff 0x4e 0xffffffff 0x4f 0xffffffff 0x52>; + + pa_therm1 { + reg = <0x4f>; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + }; + }; + }; + + fragment@14 { + target = <0xffffffff>; + + __overlay__ { + compatible = "qcom,ufs-phy-qmp-v3"; + vdda-phy-supply = <0xffffffff>; + vdda-pll-supply = <0xffffffff>; + vdda-phy-max-microamp = <0xf5b4>; + vdda-pll-max-microamp = <0x477c>; + status = "ok"; + }; + }; + + fragment@15 { + target = <0xffffffff>; + + __overlay__ { + vdd-hba-supply = <0xffffffff>; + vdd-hba-fixed-regulator; + vcc-supply = <0xffffffff>; + vcc-voltage-level = <0x2d2a80 0x2d2a80>; + vcc-max-microamp = <0x927c0>; + vccq2-supply = <0xffffffff>; + vccq2-voltage-level = <0x1ab3f0 0x1dc130>; + vccq2-max-microamp = <0x927c0>; + qcom,vddp-ref-clk-supply = <0xffffffff>; + qcom,vddp-ref-clk-max-microamp = <0x64>; + status = "ok"; + }; + }; + + fragment@16 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0x8b290>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <0x1b7740 0x1b7740>; + qcom,vdd-io-current-level = <0x0 0x4f588>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + status = "ok"; + }; + }; + + fragment@17 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0xc3500>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-voltage-level = <0x1b7740 0x2d0370>; + qcom,vdd-io-current-level = <0x0 0x55f0>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + cd-gpios = <0xffffffff 0x45 0x1>; + status = "ok"; + }; + }; + + fragment@18 { + target = <0xffffffff>; + + __overlay__ { + + pa-therm1 { + polling-delay-passive = <0x0>; + polling-delay = <0x0>; + thermal-governor = "user_space"; + thermal-sensors = <0xffffffff 0x4f>; + wake-capable-sensor; + + trips { + + active-config0 { + temperature = <0x1e848>; + hysteresis = <0x3e8>; + type = "passive"; + }; + }; + }; + + quiet-therm-step { + status = "disabled"; + }; + }; + }; + + fragment@19 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@20 { + target = <0xffffffff>; + + __overlay__ { + qcom,battery-data = <0x13>; + qcom,qg-iterm-ma = <0x64>; + qcom,hold-soc-while-full; + qcom,linearize-soc; + qcom,cl-feedback-on; + }; + }; + + fragment@21 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x8 0xffffffff 0x7 0xffffffff 0x9 0xffffffff 0x6 0xffffffff 0x4f 0xffffffff 0x99 0xffffffff 0x83>; + io-channel-names = "usb_in_voltage", "usb_in_current", "chg_temp", "die_temp", "conn_temp", "sbux_res", "vph_voltage"; + qcom,battery-data = <0x13>; + qcom,auto-recharge-soc = <0x62>; + qcom,step-charging-enable; + qcom,sw-jeita-enable; + qcom,fcc-stepping-enable; + qcom,suspend-input-on-debug-batt; + qcom,sec-charger-config = <0x3>; + qcom,thermal-mitigation = <0x401640 0x3567e0 0x2dc6c0 0x2625a0 0x1e8480 0x16e360 0xf4240 0x7a120>; + dpdm-supply = <0xffffffff>; + qcom,charger-temp-max = <0x320>; + qcom,smb-temp-max = <0x320>; + qcom,fcc-step-delay-ms = <0x64>; + qcom,fcc-step-size-ua = <0x186a0>; + qcom,disable-sw-thermal-regulation; + qcom,disable-fcc-restriction; + qcom,smb-internal-pull-kohm = <0x0>; + }; + }; + + fragment@22 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + }; + }; + }; + + fragment@23 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@24 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,i2c-touch-active = "synaptics,tcm-i2c"; + + synaptics_tcm@20 { + compatible = "synaptics,tcm-i2c"; + reg = <0x20>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend", "pmx_ts_release"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + pinctrl-2 = <0xffffffff>; + vdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + synaptics,pwr-reg-name = "avdd"; + synaptics,bus-reg-name = "vdd"; + synaptics,irq-gpio = <0xffffffff 0x9 0x2008>; + synaptics,irq-on-state = <0x0>; + synaptics,reset-gpio = <0xffffffff 0x8 0x0>; + synaptics,reset-on-state = <0x0>; + synaptics,reset-active-ms = <0x14>; + synaptics,reset-delay-ms = <0xc8>; + synaptics,power-delay-ms = <0xc8>; + synaptics,ubl-i2c-addr = <0x20>; + }; + + atmel_mxt_ts@4a { + compatible = "atmel,maxtouch"; + reg = <0x4a>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + avdd-supply = <0xffffffff>; + vdd-supply = <0xffffffff>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + reset-gpios = <0xffffffff 0x8 0x0>; + irq-gpios = <0xffffffff 0x9 0x2008>; + atmel,xy_switch; + atmel,panel-coords = <0x0 0x0 0x1df 0x31f>; + atmel,display-coords = <0x0 0x0 0x153 0x301>; + }; + }; + }; + + fragment@25 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,clk-freq-out = <0xf4240>; + #address-cells = <0x1>; + #size-cells = <0x0>; + + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <0xffffffff 0x25 0x0>; + qcom,nq-ven = <0xffffffff 0xc 0x0>; + qcom,nq-firm = <0xffffffff 0x24 0x0>; + qcom,nq-clkreq = <0xffffffff 0x1f 0x0>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff>; + }; + }; + }; + + fragment@26 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-aux-switch = <0xffffffff>; + }; + }; + + fragment@27 { + target = <0xffffffff>; + + __overlay__ { + + lpi_pinctrl@627C0000 { + compatible = "qcom,lpi-pinctrl"; + reg = <0x627c0000 0x0>; + qcom,num-gpios = <0xf>; + gpio-controller; + #gpio-cells = <0x2>; + qcom,slew-reg = <0x6295a000 0x0>; + qcom,lpi-offset-tbl = <0x0 0x1000 0x2000 0x3000 0x4000 0x5000 0x6000 0x7000 0x8000 0x9000 0xa000 0xb000 0xc000 0xd000 0xe000>; + qcom,lpi-slew-offset-tbl = <0x0 0x2 0x4 0x8 0xa 0xc 0x0 0x0 0x0 0x0 0x10 0x12 0x0 0x0 0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + phandle = <0x31>; + + dmic01_clk_active { + phandle = <0x32>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic01_clk_sleep { + phandle = <0x34>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic01_data_active { + phandle = <0x33>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic01_data_sleep { + phandle = <0x35>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic23_clk_active { + phandle = <0x36>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic23_clk_sleep { + phandle = <0x38>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic23_data_active { + phandle = <0x37>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic23_data_sleep { + phandle = <0x39>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic45_clk_active { + phandle = <0x3a>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic45_clk_sleep { + phandle = <0x3c>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic45_data_active { + phandle = <0x3b>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic45_data_sleep { + phandle = <0x3d>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + tx_swr_clk_sleep { + phandle = <0x4a>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_clk_active { + phandle = <0x46>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + tx_swr_data0_sleep { + phandle = <0x4b>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data0_active { + phandle = <0x47>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_sleep { + phandle = <0x40>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_active { + phandle = <0x3e>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_data_sleep { + phandle = <0x41>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_data_active { + phandle = <0x3f>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data1_sleep { + phandle = <0x4c>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data1_active { + phandle = <0x48>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data2_sleep { + phandle = <0x4d>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data2_active { + phandle = <0x49>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + rx_swr_clk_sleep { + phandle = <0x44>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_clk_active { + phandle = <0x42>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + rx_swr_data_sleep { + phandle = <0x45>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_data_active { + phandle = <0x43>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + lpi_i2s1_sck_active { + phandle = <0x55>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sck_sleep { + phandle = <0x59>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_ws_active { + phandle = <0x56>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_ws_sleep { + phandle = <0x5a>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd0_active { + phandle = <0x57>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd0_sleep { + phandle = <0x5b>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd1_active { + phandle = <0x58>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd1_sleep { + phandle = <0x5c>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + }; + + fragment@28 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x4>; + + bolero-clk-rsc-mngr { + compatible = "qcom,bolero-clk-rsc-mngr"; + qcom,fs-gen-sequence = <0x3000 0x1 0x3004 0x1 0x3080 0x2>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,va_mclk_mode_muxsel = <0x627a0000>; + clock-names = "tx_core_clk", "tx_npl_clk", "rx_core_clk", "rx_npl_clk", "wsa_core_clk", "wsa_npl_clk", "va_core_clk", "va_npl_clk"; + clocks = <0x14 0x0 0x15 0x0 0x16 0x0 0x17 0x0 0x18 0x0 0x19 0x0 0x1a 0x0 0x1b 0x0>; + }; + + tx-macro@62620000 { + compatible = "qcom,tx-macro"; + reg = <0x62620000 0x0>; + clock-names = "tx_core_clk", "tx_npl_clk"; + clocks = <0x14 0x0 0x15 0x0>; + qcom,tx-swr-gpios = <0x1c>; + qcom,tx-dmic-sample-rate = <0x249f00>; + phandle = <0xb1>; + + tx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x3>; + swrm-io-base = <0x62630000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x1>; + interrupts = <0x0 0x128 0x0 0x0 0x22b 0x0>; + interrupt-names = "swr_master_irq", "swr_wake_irq"; + qcom,swr-wakeup-required = <0x0>; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x21 0xf 0x2 0x12 0x1 0x2 0x13 0x2 0x3 0x14 0x1 0x3 0x15 0x2 0x4 0x16 0x1 0x4 0x17 0x2 0x4 0x18 0x4 0x4 0x19 0x8 0x5 0x1a 0x1 0x5 0x1b 0x2 0x5 0x1c 0x4 0x5 0x1d 0x8>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + qcom,swr-mstr-irq-wakeup-capable = <0x1>; + phandle = <0xb2>; + + wcd938x-tx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170223>; + phandle = <0x23>; + }; + + wcd937x-tx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170223>; + phandle = <0x27>; + }; + }; + }; + + rx-macro@62600000 { + compatible = "qcom,rx-macro"; + reg = <0x62600000 0x0>; + clock-names = "rx_core_clk", "rx_npl_clk"; + clocks = <0x16 0x0 0x17 0x0>; + qcom,rx-swr-gpios = <0x1d>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,rx-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + phandle = <0xb3>; + + rx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x2>; + swrm-io-base = <0x62610000 0x0>; + interrupts = <0x0 0x129 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x9 0x1 0x1 0xa 0x2 0x2 0xd 0x1 0x3 0xb 0x1 0x3 0xc 0x2 0x4 0xe 0x1 0x5 0xf 0x1 0x5 0x10 0x2>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + phandle = <0xb4>; + + wcd938x-rx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170224>; + phandle = <0x22>; + }; + + wcd937x-rx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170224>; + phandle = <0x26>; + }; + }; + }; + + wsa-macro@62640000 { + compatible = "qcom,wsa-macro"; + reg = <0x62640000 0x0>; + clock-names = "wsa_core_clk", "wsa_npl_clk"; + clocks = <0x18 0x0 0x19 0x0>; + qcom,wsa-swr-gpios = <0x1e>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,wsa-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + status = "disabled"; + phandle = <0xb5>; + + wsa_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + qcom,swr_master_id = <0x1>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + swrm-io-base = <0x62650000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x0>; + interrupts = <0x0 0x127 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x8>; + qcom,swr-port-mapping = <0x1 0x1 0x1 0x2 0x3 0xf 0x3 0x2 0x3 0x4 0x5 0x1 0x5 0x7 0xf 0x6 0x6 0x3 0x7 0x4 0x3 0x8 0x8 0x3>; + qcom,swr-num-dev = <0x2>; + phandle = <0xb6>; + + wsa881x@20170211 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170211>; + qcom,spkr-sd-n-node = <0x1f>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2c>; + }; + + wsa881x@20170212 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170212>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2d>; + }; + + wsa881x@21170213 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170213>; + qcom,spkr-sd-n-node = <0x1f>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2e>; + }; + + wsa881x@21170214 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170214>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2f>; + }; + }; + }; + + va-macro@62770000 { + compatible = "qcom,va-macro"; + reg = <0x62770000 0x0>; + clock-names = "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0>; + qcom,va-clk-mux-select = <0x1>; + qcom,va-island-mode-muxsel = <0x627a0000>; + qcom,va-dmic-sample-rate = <0x927c0>; + qcom,default-clk-id = <0x0>; + phandle = <0xb7>; + }; + + wcd938x-codec { + compatible = "qcom,wcd938x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x0 0x13 0x2 0x0 0x13 0x1 0x14 0x1 0x0 0x14 0x1 0x15 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x2 0x18 0x4 0x0 0x18 0x2 0x19 0x8 0x0 0x19 0x3 0x1a 0x1 0x0 0x1a 0x3 0x1b 0x2 0x0 0x1b 0x3 0x1c 0x4 0x0 0x1c 0x3 0x1d 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x21>; + qcom,rx-slave = <0x22>; + qcom,tx-slave = <0x23>; + cdc-vdd-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-rxtx-current = <0x7530>; + cdc-vddio-supply = <0xffffffff>; + qcom,cdc-vddio-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddio-current = <0x7530>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0xaf0>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-micbias4-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-rxtx", "cdc-vddio", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + mbhc-button-thres = <0x24 0xd 0x3f 0x24 0x58 0x8a 0x24 0x8a 0x8a 0x24 0xe1 0xe1 0x24 0x1c2 0x1c2 0x24 0x1c2 0x26c 0x24 0x1c2 0x26c 0x24 0x1c2 0x26c>; + imp-table = <0x25 0x0 0x5 0x6 0x25 0x6 0x17 0x8 0x25 0x18 0x26 0x7 0x25 0x27 0x64 0x6 0x25 0x65 0xa0 0xa 0x25 0xa1 0x190 0xb 0x25 0x191 0x7d0 0xb 0x25 0x7d1 0x7fffffff 0x6>; + phandle = <0x30>; + }; + + wcd937x-codec { + status = "disabled"; + compatible = "qcom,wcd937x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x1 0x13 0x1 0x0 0x14 0x1 0x14 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x3 0x18 0x1 0x0 0x1a 0x3 0x19 0x2 0x0 0x1b 0x3 0x1a 0x4 0x0 0x1c 0x3 0x1b 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x21>; + qcom,rx-slave = <0x26>; + qcom,tx-slave = <0x27>; + cdc-vdd-ldo-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-ldo-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-ldo-rxtx-current = <0x61a8>; + cdc-vddpx-1-supply = <0xffffffff>; + qcom,cdc-vddpx-1-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddpx-1-current = <0x2710>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0x708>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-ldo-rxtx", "cdc-vddpx-1", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + phandle = <0xb8>; + }; + }; + }; + + fragment@29 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,msm-mi2s-master = <0x1 0x1 0x1 0x1 0x1 0x1>; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS4", "MIC BIAS4", "Analog Mic4", "TX DMIC0", "MIC BIAS1", "MIC BIAS1", "Digital Mic0", "TX DMIC1", "MIC BIAS1", "MIC BIAS1", "Digital Mic1", "TX DMIC2", "MIC BIAS3", "MIC BIAS3", "Digital Mic2", "TX DMIC3", "MIC BIAS3", "MIC BIAS3", "Digital Mic3", "TX DMIC4", "MIC BIAS4", "MIC BIAS4", "Digital Mic4", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "IN3_AUX", "AUX_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "TX SWR_DMIC0", "DMIC1_OUTPUT", "TX SWR_DMIC1", "DMIC2_OUTPUT", "TX SWR_DMIC2", "DMIC3_OUTPUT", "TX SWR_DMIC3", "DMIC4_OUTPUT", "TX SWR_DMIC4", "DMIC5_OUTPUT", "TX SWR_DMIC5", "DMIC6_OUTPUT", "TX SWR_DMIC6", "DMIC7_OUTPUT", "TX SWR_DMIC7", "DMIC8_OUTPUT", "WSA SRC0_INP", "SRC0", "WSA_TX DEC0_INP", "TX DEC0 MUX", "WSA_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "SpkrLeft IN", "WSA_SPK1 OUT", "SpkrRight IN", "WSA_SPK2 OUT", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA MIC BIAS1", "Digital Mic0", "VA MIC BIAS1", "Digital Mic1", "VA MIC BIAS3", "Digital Mic2", "VA MIC BIAS3", "Digital Mic3", "VA MIC BIAS4", "Digital Mic4", "VA DMIC0", "VA MIC BIAS1", "VA DMIC1", "VA MIC BIAS1", "VA DMIC2", "VA MIC BIAS3", "VA DMIC3", "VA MIC BIAS3", "VA DMIC4", "VA MIC BIAS4", "VA SWR_ADC0", "VA_SWR_CLK", "VA SWR_ADC1", "VA_SWR_CLK", "VA SWR_ADC2", "VA_SWR_CLK", "VA SWR_ADC3", "VA_SWR_CLK", "VA SWR_MIC0", "VA_SWR_CLK", "VA SWR_MIC1", "VA_SWR_CLK", "VA SWR_MIC2", "VA_SWR_CLK", "VA SWR_MIC3", "VA_SWR_CLK", "VA SWR_MIC4", "VA_SWR_CLK", "VA SWR_MIC5", "VA_SWR_CLK", "VA SWR_MIC6", "VA_SWR_CLK", "VA SWR_MIC7", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT", "VA SWR_MIC0", "DMIC1_OUTPUT", "VA SWR_MIC1", "DMIC2_OUTPUT", "VA SWR_MIC2", "DMIC3_OUTPUT", "VA SWR_MIC3", "DMIC4_OUTPUT", "VA SWR_MIC4", "DMIC5_OUTPUT", "VA SWR_MIC5", "DMIC6_OUTPUT", "VA SWR_MIC6", "DMIC7_OUTPUT", "VA SWR_MIC7", "DMIC8_OUTPUT"; + qcom,msm-mbhc-hphl-swh = <0x1>; + qcom,msm-mbhc-gnd-swh = <0x1>; + qcom,cdc-dmic01-gpios = <0x28>; + qcom,cdc-dmic23-gpios = <0x29>; + qcom,cdc-dmic45-gpios = <0x2a>; + asoc-codec = <0xffffffff 0xffffffff 0x2b>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec", "msm-ext-disp-audio-codec-rx"; + qcom,wsa-max-devs = <0x2>; + qcom,wsa-devs = <0x2c 0x2d 0x2e 0x2f>; + qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight", "SpkrLeft", "SpkrRight"; + qcom,codec-max-aux-devs = <0x1>; + qcom,codec-aux-devs = <0x30>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x31 0xffffffff>; + }; + }; + + fragment@30 { + target = <0xffffffff>; + + __overlay__ { + + cdc_dmic01_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x32 0x33>; + pinctrl-1 = <0x34 0x35>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x28>; + }; + + cdc_dmic23_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x36 0x37>; + pinctrl-1 = <0x38 0x39>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x29>; + }; + + cdc_dmic45_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3a 0x3b>; + pinctrl-1 = <0x3c 0x3d>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2a>; + }; + + wsa_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3e 0x3f>; + pinctrl-1 = <0x40 0x41>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x1e>; + }; + + rx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x42 0x43>; + pinctrl-1 = <0x44 0x45>; + qcom,lpi-gpios; + phandle = <0x1d>; + }; + + tx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x46 0x47 0x48 0x49>; + pinctrl-1 = <0x4a 0x4b 0x4c 0x4d>; + qcom,lpi-gpios; + qcom,chip-wakeup-reg = <0x1ffb000>; + qcom,chip-wakeup-maskbit = <0x0>; + qcom,chip-wakeup-default-val = <0x1>; + phandle = <0x1c>; + }; + }; + }; + + fragment@31 { + target = <0xffffffff>; + + __overlay__ { + + wsa_spkr_en1_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x1f>; + }; + + wsa_spkr_en2_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x20>; + }; + + msm_cdc_pinctrl@58 { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + phandle = <0x21>; + }; + + wsa_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x3>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x309>; + #clock-cells = <0x1>; + phandle = <0x18>; + }; + + wsa_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x4>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30a>; + #clock-cells = <0x1>; + phandle = <0x19>; + }; + + rx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x5>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30e>; + #clock-cells = <0x1>; + phandle = <0x16>; + }; + + rx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x6>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30f>; + #clock-cells = <0x1>; + phandle = <0x17>; + }; + + tx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x7>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30c>; + #clock-cells = <0x1>; + phandle = <0x14>; + }; + + tx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x8>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30d>; + #clock-cells = <0x1>; + phandle = <0x15>; + }; + + va_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x2>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30b>; + #clock-cells = <0x1>; + phandle = <0x1a>; + }; + + va_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0xa>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x310>; + #clock-cells = <0x1>; + phandle = <0x1b>; + }; + }; + }; + + fragment@32 { + target = <0xffffffff>; + + __overlay__ { + qcom,msm-dai-is-island-supported = <0x1>; + }; + }; + + fragment@33 { + target = <0xffffffff>; + + __overlay__ { + hsuart8 = "/soc/qcom,qup_hsuart@a88000"; + }; + }; + + fragment@34 { + target = <0xffffffff>; + + __overlay__ { + + qcom,qup_hsuart@a88000 { + compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; + reg = <0xa88000 0x4000>; + reg-names = "se_phys"; + clock-names = "se-clk", "m-ahb", "s-ahb"; + clocks = <0xffffffff 0x50 0xffffffff 0x5a 0xffffffff 0x5b>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4e 0x4f>; + pinctrl-1 = <0x50 0x51>; + interrupts = <0x0 0x163 0x0>; + qcom,wrapper-core = <0xffffffff>; + always-on-clock; + status = "ok"; + phandle = <0xb9>; + }; + }; + }; + + fragment@35 { + target = <0xffffffff>; + + __overlay__ { + + qupv3_se8_2hsuart_pins { + phandle = <0xba>; + + qupv3_se8_2uart_tx_active { + phandle = <0x4e>; + + mux { + pins = "gpio44"; + function = "qup12"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_rx_active { + phandle = <0x4f>; + + mux { + pins = "gpio45"; + function = "qup12"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_tx_sleep { + phandle = <0x50>; + + mux { + pins = "gpio44"; + function = "gpio"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + input-enable; + }; + }; + + qupv3_se8_2uart_rx_sleep { + phandle = <0x51>; + + mux { + pins = "gpio45"; + function = "gpio"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@36 { + target = <0xffffffff>; + + __overlay__ { + + dcc_curr_link@3 { + qcom,curr-link-list = <0x3>; + qcom,data-sink = "sram"; + qcom,link-list = <0x0 0x18000024 0x1 0x0 0x0 0x18000040 0x1 0x0 0x0 0x18010024 0x1 0x0 0x0 0x18010040 0x1 0x0 0x0 0x18020024 0x1 0x0 0x0 0x18020040 0x1 0x0 0x0 0x18030024 0x1 0x0 0x0 0x18030040 0x1 0x0 0x0 0x18040024 0x1 0x0 0x0 0x18040040 0x1 0x0 0x0 0x18050024 0x1 0x0 0x0 0x18050040 0x1 0x0 0x0 0x18060024 0x1 0x0 0x0 0x18060040 0x1 0x0 0x0 0x18070024 0x1 0x0 0x0 0x18070040 0x1 0x0 0x0 0x18080024 0x1 0x0 0x0 0x18080040 0x1 0x0 0x0 0x180800f8 0x1 0x0 0x0 0x18080104 0x1 0x0 0x0 0x1808011c 0x1 0x0 0x0 0x18080128 0x1 0x0 0x0 0x18321700 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18325f00 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x18321818 0x1 0x0 0x0 0x18323818 0x1 0x0 0x0 0x18326018 0x1 0x0 0x0 0x18321920 0x1 0x0 0x0 0x1832102c 0x1 0x0 0x0 0x18321044 0x1 0x0 0x0 0x18321710 0x1 0x0 0x0 0x1832176c 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18323920 0x1 0x0 0x0 0x1832302c 0x1 0x0 0x0 0x18323044 0x1 0x0 0x0 0x18323710 0x1 0x0 0x0 0x1832376c 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18326120 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18325844 0x1 0x0 0x0 0x18325f10 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280000 0x2 0x0 0x0 0x18282000 0x2 0x0 0x0 0x18284000 0x2 0x0 0x0 0x9680000 0x1 0x0 0x0 0x9680004 0x1 0x0 0x2 0x8 0x0 0x0 0x0 0x9681000 0x1 0x0 0x2 0x1 0x0 0x0 0x0 0x9681004 0x1 0x0 0x0 0x9681008 0x1 0x0 0x0 0x968100c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9698500 0x1 0x0 0x0 0x9698504 0x1 0x0 0x0 0x9698508 0x1 0x0 0x0 0x969850c 0x1 0x0 0x0 0x9698510 0x1 0x0 0x0 0x9698514 0x1 0x0 0x0 0x9698518 0x1 0x0 0x0 0x969851c 0x1 0x0 0x0 0x9698700 0x1 0x0 0x0 0x9698704 0x1 0x0 0x0 0x9698708 0x1 0x0 0x0 0x969870c 0x1 0x0 0x0 0x9698714 0x1 0x0 0x0 0x9698718 0x1 0x0 0x0 0x969871c 0x1 0x0 0x0 0x1620204 0x1 0x0 0x0 0x1620240 0x1 0x0 0x0 0x1620248 0x1 0x0 0x0 0x1620288 0x1 0x0 0x0 0x162028c 0x1 0x0 0x0 0x1620290 0x1 0x0 0x0 0x1620294 0x1 0x0 0x0 0x16202a8 0x1 0x0 0x0 0x16202ac 0x1 0x0 0x0 0x16202b0 0x1 0x0 0x0 0x16202b4 0x1 0x0 0x0 0x1620300 0x1 0x0 0x0 0x16e0404 0x1 0x0 0x0 0x16e0408 0x1 0x0 0x0 0x16e0410 0x1 0x0 0x0 0x16e0420 0x1 0x0 0x0 0x16e0424 0x1 0x0 0x0 0x16e0428 0x1 0x0 0x0 0x16e042c 0x1 0x0 0x0 0x16e0430 0x1 0x0 0x0 0x16e0434 0x1 0x0 0x0 0x16e0438 0x1 0x0 0x0 0x16e043c 0x1 0x0 0x0 0x16e0300 0x1 0x0 0x0 0x16e0304 0x1 0x0 0x0 0x16e0700 0x1 0x0 0x0 0x16e0704 0x1 0x0 0x0 0x1700c00 0x1 0x0 0x0 0x1700c08 0x1 0x0 0x0 0x1700c10 0x1 0x0 0x0 0x1700c20 0x1 0x0 0x0 0x1700c24 0x1 0x0 0x0 0x1700c28 0x1 0x0 0x0 0x1700c2c 0x1 0x0 0x0 0x1700c30 0x1 0x0 0x0 0x1700c34 0x1 0x0 0x0 0x1700c38 0x1 0x0 0x0 0x1700c3c 0x1 0x0 0x0 0x1700300 0x1 0x0 0x0 0x1700304 0x1 0x0 0x0 0x1700308 0x1 0x0 0x0 0x170030c 0x1 0x0 0x0 0x1700310 0x1 0x0 0x0 0x1700500 0x1 0x0 0x0 0x1700504 0x1 0x0 0x0 0x1700508 0x1 0x0 0x0 0x170050c 0x1 0x0 0x0 0x1700900 0x1 0x0 0x0 0x1700904 0x1 0x0 0x0 0x1700908 0x1 0x0 0x0 0x1740004 0x1 0x0 0x0 0x1740008 0x1 0x0 0x0 0x1740010 0x1 0x0 0x0 0x1740020 0x1 0x0 0x0 0x1740024 0x1 0x0 0x0 0x1740028 0x1 0x0 0x0 0x174002c 0x1 0x0 0x0 0x1740030 0x1 0x0 0x0 0x1740034 0x1 0x0 0x0 0x1740038 0x1 0x0 0x0 0x174003c 0x1 0x0 0x0 0x1740300 0x1 0x0 0x0 0x1740304 0x1 0x0 0x0 0x1740308 0x1 0x0 0x0 0x174030c 0x1 0x0 0x0 0x1740310 0x1 0x0 0x0 0x1740314 0x1 0x0 0x0 0x9698204 0x1 0x0 0x0 0x9698240 0x1 0x0 0x0 0x9698244 0x1 0x0 0x0 0x9698248 0x1 0x0 0x0 0x969824c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x9681018 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9160204 0x1 0x0 0x0 0x9160240 0x1 0x0 0x0 0x9160248 0x1 0x0 0x0 0x9160288 0x1 0x0 0x0 0x9160290 0x1 0x0 0x0 0x9160300 0x1 0x0 0x0 0x9160304 0x1 0x0 0x0 0x9160308 0x1 0x0 0x0 0x916030c 0x1 0x0 0x0 0x9160310 0x1 0x0 0x0 0x9160314 0x1 0x0 0x0 0x9160318 0x1 0x0 0x0 0x9160008 0x1 0x0 0x0 0x9160010 0x1 0x0 0x0 0x9160020 0x1 0x0 0x0 0x9160024 0x1 0x0 0x0 0x9160028 0x1 0x0 0x0 0x916002c 0x1 0x0 0x0 0x9160030 0x1 0x0 0x0 0x9160034 0x1 0x0 0x0 0x9160038 0x1 0x0 0x0 0x916003c 0x1 0x0 0x0 0x63042680 0x1 0x0 0x0 0x63042684 0x1 0x0 0x0 0x63042688 0x1 0x0 0x0 0x63042690 0x1 0x0 0x0 0x630426a0 0x1 0x0 0x0 0x630426a4 0x1 0x0 0x0 0x630426a8 0x1 0x0 0x0 0x630426ac 0x1 0x0 0x0 0x630426b0 0x1 0x0 0x0 0x630426b4 0x1 0x0 0x0 0x630426b8 0x1 0x0 0x0 0x630426bc 0x1 0x0 0x0 0x63041900 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x1620500 0x4 0x0 0x0 0x1620700 0x4 0x0 0x0 0x1620300 0x1 0x0 0x0 0x1620f00 0x2 0x0 0x0 0x1620b00 0x2 0x0 0x0 0x1700b00 0x2 0x0 0x0 0x1700700 0x3 0x0 0x0 0x9163100 0x1 0x0 0x0 0x96aa100 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x9991500 0x8 0x0 0x0 0x9050008 0x1 0x0 0x0 0x9050078 0x1 0x0 0x0 0x9236028 0x1 0x0 0x0 0x923602c 0x1 0x0 0x0 0x9236030 0x1 0x0 0x0 0x9236034 0x1 0x0 0x0 0x9236038 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x92360b0 0x1 0x0 0x0 0x9236044 0x1 0x0 0x0 0x9236048 0x1 0x0 0x0 0x923604c 0x1 0x0 0x0 0x9236050 0x1 0x0 0x0 0x923e030 0x1 0x0 0x0 0x923e034 0x1 0x0 0x0 0x9241000 0x1 0x0 0x0 0x9248058 0x1 0x0 0x0 0x924805c 0x1 0x0 0x0 0x9248060 0x1 0x0 0x0 0x9248064 0x1 0x0 0x0 0x9260410 0x1 0x0 0x0 0x92e0410 0x1 0x0 0x0 0x9260414 0x1 0x0 0x0 0x92e0414 0x1 0x0 0x0 0x9260418 0x1 0x0 0x0 0x92e0418 0x1 0x0 0x0 0x9260420 0x1 0x0 0x0 0x9260424 0x1 0x0 0x0 0x9260430 0x1 0x0 0x0 0x9260440 0x1 0x0 0x0 0x9260448 0x1 0x0 0x0 0x92604a0 0x1 0x0 0x0 0x92604b0 0x1 0x0 0x0 0x92604d0 0x2 0x0 0x0 0x9261440 0x1 0x0 0x0 0x92e0420 0x1 0x0 0x0 0x92e0424 0x1 0x0 0x0 0x92e0430 0x1 0x0 0x0 0x92e0440 0x1 0x0 0x0 0x92e0448 0x1 0x0 0x0 0x92e04a0 0x1 0x0 0x0 0x92e04b0 0x1 0x0 0x0 0x92e04d0 0x2 0x0 0x0 0x9600000 0x1 0x0 0x0 0x9601000 0x1 0x0 0x0 0x9602000 0x1 0x0 0x0 0x9603000 0x1 0x0 0x0 0x9604000 0x1 0x0 0x0 0x9605000 0x1 0x0 0x0 0x9606000 0x1 0x0 0x0 0x9607000 0x1 0x0 0x0 0x9608000 0x1 0x0 0x0 0x9609000 0x1 0x0 0x0 0x960a000 0x1 0x0 0x0 0x960b000 0x1 0x0 0x0 0x960c000 0x1 0x0 0x0 0x960d000 0x1 0x0 0x0 0x960e000 0x1 0x0 0x0 0x960f000 0x1 0x0 0x0 0x9610000 0x1 0x0 0x0 0x9611000 0x1 0x0 0x0 0x9612000 0x1 0x0 0x0 0x9613000 0x1 0x0 0x0 0x9614000 0x1 0x0 0x0 0x9615000 0x1 0x0 0x0 0x9616000 0x1 0x0 0x0 0x9617000 0x1 0x0 0x0 0x9618000 0x1 0x0 0x0 0x9619000 0x1 0x0 0x0 0x961a000 0x1 0x0 0x0 0x961b000 0x1 0x0 0x0 0x961c000 0x1 0x0 0x0 0x961d000 0x1 0x0 0x0 0x961e000 0x1 0x0 0x0 0x961f000 0x1 0x0 0x0 0x9600004 0x1 0x0 0x0 0x9601004 0x1 0x0 0x0 0x9602004 0x1 0x0 0x0 0x9603004 0x1 0x0 0x0 0x9604004 0x1 0x0 0x0 0x9605004 0x1 0x0 0x0 0x9606004 0x1 0x0 0x0 0x9607004 0x1 0x0 0x0 0x9608004 0x1 0x0 0x0 0x9609004 0x1 0x0 0x0 0x960a004 0x1 0x0 0x0 0x960b004 0x1 0x0 0x0 0x960c004 0x1 0x0 0x0 0x960d004 0x1 0x0 0x0 0x960e004 0x1 0x0 0x0 0x960f004 0x1 0x0 0x0 0x9610004 0x1 0x0 0x0 0x9611004 0x1 0x0 0x0 0x9612004 0x1 0x0 0x0 0x9613004 0x1 0x0 0x0 0x9614004 0x1 0x0 0x0 0x9615004 0x1 0x0 0x0 0x9616004 0x1 0x0 0x0 0x9617004 0x1 0x0 0x0 0x9618004 0x1 0x0 0x0 0x9619004 0x1 0x0 0x0 0x961a004 0x1 0x0 0x0 0x961b004 0x1 0x0 0x0 0x961c004 0x1 0x0 0x0 0x961d004 0x1 0x0 0x0 0x961e004 0x1 0x0 0x0 0x961f004 0x1 0x0 0x0 0x9266418 0x1 0x0 0x0 0x92e6418 0x1 0x0 0x0 0x9265804 0x1 0x0 0x0 0x92e5804 0x1 0x0 0x0 0x92604b8 0x1 0x0 0x0 0x92e04b8 0x1 0x0 0x0 0xc201244 0x1 0x0 0x0 0xc202244 0x1 0x0 0x0 0x18100c18 0x1 0x0 0x0 0x18101c18 0x1 0x0 0x0 0x18300000 0x1 0x0 0x0 0x183a3a84 0x2 0x0 0x0 0x18393a84 0x1 0x0 0x0 0x100000 0x1 0x0 0x0 0x100004 0x1 0x0 0x0 0x100008 0x1 0x0 0x0 0x10000c 0x1 0x0 0x0 0x100010 0x1 0x0 0x0 0x100014 0x1 0x0 0x0 0x100018 0x1 0x0 0x0 0x10001c 0x1 0x0 0x0 0x100020 0x1 0x0 0x0 0x100024 0x1 0x0 0x0 0x100028 0x1 0x0 0x0 0x10002c 0x1 0x0 0x0 0x100030 0x1 0x0 0x0 0x100034 0x1 0x0 0x0 0x100100 0x1 0x0 0x0 0x100104 0x1 0x0 0x0 0x100108 0x1 0x0 0x0 0x10010c 0x1 0x0 0x0 0x101000 0x1 0x0 0x0 0x101004 0x1 0x0 0x0 0x101008 0x1 0x0 0x0 0x10100c 0x1 0x0 0x0 0x101010 0x1 0x0 0x0 0x101014 0x1 0x0 0x0 0x101018 0x1 0x0 0x0 0x10101c 0x1 0x0 0x0 0x101020 0x1 0x0 0x0 0x101024 0x1 0x0 0x0 0x101028 0x1 0x0 0x0 0x10102c 0x1 0x0 0x0 0x101030 0x1 0x0 0x0 0x101034 0x1 0x0 0x0 0x102000 0x1 0x0 0x0 0x102004 0x1 0x0 0x0 0x102008 0x1 0x0 0x0 0x10200c 0x1 0x0 0x0 0x102010 0x1 0x0 0x0 0x102014 0x1 0x0 0x0 0x102018 0x1 0x0 0x0 0x10201c 0x1 0x0 0x0 0x102020 0x1 0x0 0x0 0x102024 0x1 0x0 0x0 0x102028 0x1 0x0 0x0 0x10202c 0x1 0x0 0x0 0x102030 0x1 0x0 0x0 0x102034 0x1 0x0 0x0 0x103000 0x1 0x0 0x0 0x103004 0x1 0x0 0x0 0x103008 0x1 0x0 0x0 0x10300c 0x1 0x0 0x0 0x103010 0x1 0x0 0x0 0x103014 0x1 0x0 0x0 0x103018 0x1 0x0 0x0 0x10301c 0x1 0x0 0x0 0x103020 0x1 0x0 0x0 0x103024 0x1 0x0 0x0 0x103028 0x1 0x0 0x0 0x10302c 0x1 0x0 0x0 0x103030 0x1 0x0 0x0 0x103034 0x1 0x0 0x0 0x113000 0x1 0x0 0x0 0x113004 0x1 0x0 0x0 0x113008 0x1 0x0 0x0 0x11300c 0x1 0x0 0x0 0x113010 0x1 0x0 0x0 0x113014 0x1 0x0 0x0 0x113018 0x1 0x0 0x0 0x11301c 0x1 0x0 0x0 0x113020 0x1 0x0 0x0 0x113024 0x1 0x0 0x0 0x113028 0x1 0x0 0x0 0x11302c 0x1 0x0 0x0 0x113030 0x1 0x0 0x0 0x113034 0x1 0x0 0x0 0x11a000 0x1 0x0 0x0 0x11a004 0x1 0x0 0x0 0x11a008 0x1 0x0 0x0 0x11a00c 0x1 0x0 0x0 0x11a010 0x1 0x0 0x0 0x11a014 0x1 0x0 0x0 0x11a018 0x1 0x0 0x0 0x11a01c 0x1 0x0 0x0 0x11a020 0x1 0x0 0x0 0x11a024 0x1 0x0 0x0 0x11a028 0x1 0x0 0x0 0x11a02c 0x1 0x0 0x0 0x11a030 0x1 0x0 0x0 0x11a034 0x1 0x0 0x0 0x11b000 0x1 0x0 0x0 0x11b004 0x1 0x0 0x0 0x11b008 0x1 0x0 0x0 0x11b00c 0x1 0x0 0x0 0x11b010 0x1 0x0 0x0 0x11b014 0x1 0x0 0x0 0x11b018 0x1 0x0 0x0 0x11b01c 0x1 0x0 0x0 0x11b020 0x1 0x0 0x0 0x11b024 0x1 0x0 0x0 0x11b028 0x1 0x0 0x0 0x11b02c 0x1 0x0 0x0 0x11b030 0x1 0x0 0x0 0x11b034 0x1 0x0 0x0 0x174000 0x1 0x0 0x0 0x174004 0x1 0x0 0x0 0x174008 0x1 0x0 0x0 0x17400c 0x1 0x0 0x0 0x174010 0x1 0x0 0x0 0x174014 0x1 0x0 0x0 0x174018 0x1 0x0 0x0 0x17401c 0x1 0x0 0x0 0x174020 0x1 0x0 0x0 0x174024 0x1 0x0 0x0 0x174028 0x1 0x0 0x0 0x17402c 0x1 0x0 0x0 0x174030 0x1 0x0 0x0 0x174034 0x1 0x0 0x0 0x176000 0x1 0x0 0x0 0x176004 0x1 0x0 0x0 0x176008 0x1 0x0 0x0 0x17600c 0x1 0x0 0x0 0x176010 0x1 0x0 0x0 0x176014 0x1 0x0 0x0 0x176018 0x1 0x0 0x0 0x17601c 0x1 0x0 0x0 0x176020 0x1 0x0 0x0 0x176024 0x1 0x0 0x0 0x176028 0x1 0x0 0x0 0x17602c 0x1 0x0 0x0 0x176030 0x1 0x0 0x0 0x176034 0x1 0x0 0x0 0x10401c 0x1 0x0 0x0 0x183024 0x1 0x0 0x0 0x144168 0x1 0x0 0x0 0x11702c 0x1 0x0 0x0 0x10904c 0x1 0x0 0x0 0x189038 0x1 0x0 0x0 0x1443e8 0x1 0x0 0x0 0x1442b8 0x1 0x0 0x0 0x105060 0x1 0x0 0x0 0x141024 0x1 0x0 0x0 0x145038 0x1 0x0 0x0 0x109004 0x1 0x0 0x0 0x189004 0x1 0x0 0x0 0x190004 0x1 0x0 0x0 0xc2a0000 0x1 0x0 0x0 0xc2a0004 0x1 0x0 0x0 0xc2a0008 0x1 0x0 0x0 0xc2a000c 0x1 0x0 0x0 0xc2a0010 0x1 0x0 0x0 0xc2a0014 0x1 0x0 0x0 0xc2a0018 0x1 0x0 0x0 0xc2a001c 0x1 0x0 0x0 0xc2a0020 0x1 0x0 0x0 0xc2a0024 0x1 0x0 0x0 0xc2a0028 0x1 0x0 0x0 0xc2a002c 0x1 0x0 0x0 0xc2a0030 0x1 0x0 0x0 0xc2a0034 0x1 0x0 0x0 0xc2a1000 0x1 0x0 0x0 0xc2a1004 0x1 0x0 0x0 0xc2a1008 0x1 0x0 0x0 0xc2a100c 0x1 0x0 0x0 0xc2a1010 0x1 0x0 0x0 0xc2a1014 0x1 0x0 0x0 0xc2a1018 0x1 0x0 0x0 0xc2a101c 0x1 0x0 0x0 0xc2a1020 0x1 0x0 0x0 0xc2a1024 0x1 0x0 0x0 0xc2a1028 0x1 0x0 0x0 0xc2a102c 0x1 0x0 0x0 0xc2a1030 0x1 0x0 0x0 0xc2a2260 0x1 0x0 0x0 0xc2a2264 0x1 0x0 0x0 0xc2a3008 0x1 0x0 0x0 0xc2a300c 0x1 0x0 0x0 0xc2a3010 0x1 0x0 0x0 0xc2a3014 0x1 0x0 0x0 0xc2a3024 0x1 0x0 0x0 0xc2a2034 0x1 0x0 0x0 0xc2a214c 0x1 0x0 0x0 0xc2a2150 0x1 0x0 0x0 0xc2a2154 0x1 0x0 0x0 0x28206c 0x1 0x0 0x0 0x18282004 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x1808012c 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280004 0x1 0x0 0x0 0x18284038 0x1 0x0 0x0 0x18284000 0x2 0x0 0x0 0x90c012c 0x1 0x0 0x0 0x9222408 0x1 0x0 0x0 0x9220344 0x2 0x0 0x0 0x9220480 0x1 0x0 0x0 0x922358c 0x1 0x0 0x0 0x9222398 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x923201c 0x5 0x0 0x0 0x9232050 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x9186048 0x1 0x0 0x0 0x9186054 0x1 0x0 0x0 0x9186164 0x1 0x0 0x0 0x9186170 0x1 0x0 0x0 0xc2630a0 0x4 0x0 0x0 0xc2630b0 0x4 0x0 0x0 0xc2630c0 0x4 0x0 0x0 0xc2630d0 0x4 0x0 0x0 0x18200400 0x1 0x0 0x0 0x18200404 0x1 0x0 0x0 0x18200408 0x1 0x0 0x0 0x18200038 0x1 0x0 0x0 0x18200040 0x1 0x0 0x0 0x18200048 0x1 0x0 0x0 0x18220038 0x1 0x0 0x0 0x18220040 0x1 0x0 0x0 0x182200d0 0x1 0x0 0x0 0x18200030 0x1 0x0 0x0 0x18200010 0x1 0x0 0x0 0x1822000c 0x1 0x0 0x0 0x18220d14 0x1 0x0 0x0 0x18220fb4 0x1 0x0 0x0 0x18221254 0x1 0x0 0x0 0x182214f4 0x1 0x0 0x0 0x18221794 0x1 0x0 0x0 0x18221a34 0x1 0x0 0x0 0x18221cd4 0x1 0x0 0x0 0x18221f74 0x1 0x0 0x0 0x18220d18 0x1 0x0 0x0 0x18220fb8 0x1 0x0 0x0 0x18221258 0x1 0x0 0x0 0x182214f8 0x1 0x0 0x0 0x18221798 0x1 0x0 0x0 0x18221a38 0x1 0x0 0x0 0x18221cd8 0x1 0x0 0x0 0x18221f78 0x1 0x0 0x0 0x18220d00 0x1 0x0 0x0 0x18220d04 0x1 0x0 0x0 0x18220d1c 0x1 0x0 0x0 0x18220fbc 0x1 0x0 0x0 0x1822125c 0x1 0x0 0x0 0x182214fc 0x1 0x0 0x0 0x1822179c 0x1 0x0 0x0 0x18221a3c 0x1 0x0 0x0 0x18221cdc 0x1 0x0 0x0 0x18221f7c 0x1 0x0 0x0 0x18221274 0x1 0x0 0x0 0x18221288 0x1 0x0 0x0 0x1822129c 0x1 0x0 0x0 0x182212b0 0x1 0x0 0x0 0x182212c4 0x1 0x0 0x0 0x182212d8 0x1 0x0 0x0 0x182212ec 0x1 0x0 0x0 0x18221300 0x1 0x0 0x0 0x18221314 0x1 0x0 0x0 0x18221328 0x1 0x0 0x0 0x1822133c 0x1 0x0 0x0 0x18221350 0x1 0x0 0x0 0x18221364 0x1 0x0 0x0 0x18221378 0x1 0x0 0x0 0x1822138c 0x1 0x0 0x0 0x182213a0 0x1 0x0 0x0 0x18221514 0x1 0x0 0x0 0x18221528 0x1 0x0 0x0 0x1822153c 0x1 0x0 0x0 0x18221550 0x1 0x0 0x0 0x18221564 0x1 0x0 0x0 0x18221578 0x1 0x0 0x0 0x1822158c 0x1 0x0 0x0 0x182215a0 0x1 0x0 0x0 0x182215b4 0x1 0x0 0x0 0x182215c8 0x1 0x0 0x0 0x182215dc 0x1 0x0 0x0 0x182215f0 0x1 0x0 0x0 0x18221604 0x1 0x0 0x0 0x18221618 0x1 0x0 0x0 0x1822162c 0x1 0x0 0x0 0x18221640 0x1 0x0 0x0 0x182217b4 0x1 0x0 0x0 0x182217c8 0x1 0x0 0x0 0x182217dc 0x1 0x0 0x0 0x182217f0 0x1 0x0 0x0 0x18221804 0x1 0x0 0x0 0x18221818 0x1 0x0 0x0 0x1822182c 0x1 0x0 0x0 0x18221840 0x1 0x0 0x0 0x18221854 0x1 0x0 0x0 0x18221868 0x1 0x0 0x0 0x1822187c 0x1 0x0 0x0 0x18221890 0x1 0x0 0x0 0x182218a4 0x1 0x0 0x0 0x182218b8 0x1 0x0 0x0 0x182218cc 0x1 0x0 0x0 0x182218e0 0x1 0x0 0x0 0x18221a54 0x1 0x0 0x0 0x18221a68 0x1 0x0 0x0 0x18221a7c 0x1 0x0 0x0 0x18221a90 0x1 0x0 0x0 0x18221aa4 0x1 0x0 0x0 0x18221ab8 0x1 0x0 0x0 0x18221acc 0x1 0x0 0x0 0x18221ae0 0x1 0x0 0x0 0x18221af4 0x1 0x0 0x0 0x18221b08 0x1 0x0 0x0 0x18221b1c 0x1 0x0 0x0 0x18221b30 0x1 0x0 0x0 0x18221b44 0x1 0x0 0x0 0x18221b58 0x1 0x0 0x0 0x18221b6c 0x1 0x0 0x0 0x18221b80 0x1 0x0 0x0 0x18221cf4 0x1 0x0 0x0 0x18221d08 0x1 0x0 0x0 0x18221d1c 0x1 0x0 0x0 0x18221d30 0x1 0x0 0x0 0x18221d44 0x1 0x0 0x0 0x18221d58 0x1 0x0 0x0 0x18221d6c 0x1 0x0 0x0 0x18221d80 0x1 0x0 0x0 0x18221d94 0x1 0x0 0x0 0x18221da8 0x1 0x0 0x0 0x18221dbc 0x1 0x0 0x0 0x18221dd0 0x1 0x0 0x0 0x18221de4 0x1 0x0 0x0 0x18221df8 0x1 0x0 0x0 0x18221e0c 0x1 0x0 0x0 0x18221e20 0x1 0x0 0x0 0x18221f94 0x1 0x0 0x0 0x18221fa8 0x1 0x0 0x0 0x18221fbc 0x1 0x0 0x0 0x18221fd0 0x1 0x0 0x0 0x18221fe4 0x1 0x0 0x0 0x18221ff8 0x1 0x0 0x0 0x1822200c 0x1 0x0 0x0 0x18222020 0x1 0x0 0x0 0x18222034 0x1 0x0 0x0 0x18222048 0x1 0x0 0x0 0x1822205c 0x1 0x0 0x0 0x18222070 0x1 0x0 0x0 0x18222084 0x1 0x0 0x0 0x18222098 0x1 0x0 0x0 0x182220ac 0x1 0x0 0x0 0x182220c0 0x1 0x0 0x0 0x18221278 0x1 0x0 0x0 0x1822128c 0x1 0x0 0x0 0x182212a0 0x1 0x0 0x0 0x182212b4 0x1 0x0 0x0 0x182212c8 0x1 0x0 0x0 0x182212dc 0x1 0x0 0x0 0x182212f0 0x1 0x0 0x0 0x18221304 0x1 0x0 0x0 0x18221318 0x1 0x0 0x0 0x1822132c 0x1 0x0 0x0 0x18221340 0x1 0x0 0x0 0x18221354 0x1 0x0 0x0 0x18221368 0x1 0x0 0x0 0x1822137c 0x1 0x0 0x0 0x18221390 0x1 0x0 0x0 0x182213a4 0x1 0x0 0x0 0x18221518 0x1 0x0 0x0 0x1822152c 0x1 0x0 0x0 0x18221540 0x1 0x0 0x0 0x18221554 0x1 0x0 0x0 0x18221568 0x1 0x0 0x0 0x1822157c 0x1 0x0 0x0 0x18221590 0x1 0x0 0x0 0x182215a4 0x1 0x0 0x0 0x182215b8 0x1 0x0 0x0 0x182215cc 0x1 0x0 0x0 0x182215e0 0x1 0x0 0x0 0x182215f4 0x1 0x0 0x0 0x18221608 0x1 0x0 0x0 0x1822161c 0x1 0x0 0x0 0x18221630 0x1 0x0 0x0 0x18221644 0x1 0x0 0x0 0x182217b8 0x1 0x0 0x0 0x182217cc 0x1 0x0 0x0 0x182217e0 0x1 0x0 0x0 0x182217f4 0x1 0x0 0x0 0x18221808 0x1 0x0 0x0 0x1822181c 0x1 0x0 0x0 0x18221830 0x1 0x0 0x0 0x18221844 0x1 0x0 0x0 0x18221858 0x1 0x0 0x0 0x1822186c 0x1 0x0 0x0 0x18221880 0x1 0x0 0x0 0x18221894 0x1 0x0 0x0 0x182218a8 0x1 0x0 0x0 0x182218bc 0x1 0x0 0x0 0x182218d0 0x1 0x0 0x0 0x182218e4 0x1 0x0 0x0 0x18221a58 0x1 0x0 0x0 0x18221a6c 0x1 0x0 0x0 0x18221a80 0x1 0x0 0x0 0x18221a94 0x1 0x0 0x0 0x18221aa8 0x1 0x0 0x0 0x18221abc 0x1 0x0 0x0 0x18221ad0 0x1 0x0 0x0 0x18221ae4 0x1 0x0 0x0 0x18221af8 0x1 0x0 0x0 0x18221b0c 0x1 0x0 0x0 0x18221b20 0x1 0x0 0x0 0x18221b34 0x1 0x0 0x0 0x18221b48 0x1 0x0 0x0 0x18221b5c 0x1 0x0 0x0 0x18221b70 0x1 0x0 0x0 0x18221b84 0x1 0x0 0x0 0x18221cf8 0x1 0x0 0x0 0x18221d0c 0x1 0x0 0x0 0x18221d20 0x1 0x0 0x0 0x18221d34 0x1 0x0 0x0 0x18221d48 0x1 0x0 0x0 0x18221d5c 0x1 0x0 0x0 0x18221d70 0x1 0x0 0x0 0x18221d84 0x1 0x0 0x0 0x18221d98 0x1 0x0 0x0 0x18221dac 0x1 0x0 0x0 0x18221dc0 0x1 0x0 0x0 0x18221dd4 0x1 0x0 0x0 0x18221de8 0x1 0x0 0x0 0x18221dfc 0x1 0x0 0x0 0x18221e10 0x1 0x0 0x0 0x18221e24 0x1 0x0 0x0 0x18221f98 0x1 0x0 0x0 0x18221fac 0x1 0x0 0x0 0x18221fc0 0x1 0x0 0x0 0x18221fd4 0x1 0x0 0x0 0x18221fe8 0x1 0x0 0x0 0x18221ffc 0x1 0x0 0x0 0x18222010 0x1 0x0 0x0 0x18222024 0x1 0x0 0x0 0x18222038 0x1 0x0 0x0 0x1822204c 0x1 0x0 0x0 0x18222060 0x1 0x0 0x0 0x18222074 0x1 0x0 0x0 0x18222088 0x1 0x0 0x0 0x1822209c 0x1 0x0 0x0 0x182220b0 0x1 0x0 0x0 0x182220c4 0x1 0x0 0x0 0x105050 0x1 0x0 0x0 0x171004 0x1 0x0 0x0 0x171154 0x1 0x0 0x0 0x17100c 0x1 0x0 0x0 0x171018 0x1 0x0 0x0 0x5091004 0x1 0x0 0x0 0x509100c 0x1 0x0 0x0 0x5091010 0x1 0x0 0x0 0x5091014 0x1 0x0 0x0 0x5091054 0x1 0x0 0x0 0x5091060 0x1 0x0 0x0 0x509106c 0x1 0x0 0x0 0x5091070 0x1 0x0 0x0 0x5091074 0x1 0x0 0x0 0x5091078 0x1 0x0 0x0 0x509107c 0x1 0x0 0x0 0x509108c 0x1 0x0 0x0 0x5091098 0x1 0x0 0x0 0x509109c 0x1 0x0 0x0 0x1800005c 0x1 0x0 0x0 0x1801005c 0x1 0x0 0x0 0x1802005c 0x1 0x0 0x0 0x1803005c 0x1 0x0 0x0 0x1804005c 0x1 0x0 0x0 0x1805005c 0x1 0x0 0x0 0x1806005c 0x1 0x0 0x0 0x1807005c 0x1 0x0 0x0 0x17c0003c 0x1 0x0 0x1 0x6004fb0 0xc5acce55 0x0 0x1 0x600408c 0xff 0x0 0x1 0x6004fb0 0x0 0x0 0x0 0x62900010 0x1 0x0 0x0 0x62900014 0x1 0x0 0x0 0x62900018 0x1 0x0 0x0 0x62900030 0x1 0x0 0x0 0x62900038 0x1 0x0 0x0 0x62900040 0x1 0x0 0x0 0x62900048 0x1 0x0 0x0 0x629000d0 0x1 0x0 0x0 0x62900210 0x1 0x0 0x0 0x62900230 0x1 0x0 0x0 0x62900250 0x1 0x0 0x0 0x62900270 0x1 0x0 0x0 0x62900290 0x1 0x0 0x0 0x629002b0 0x1 0x0 0x0 0x62900208 0x1 0x0 0x0 0x62900228 0x1 0x0 0x0 0x62900248 0x1 0x0 0x0 0x62900268 0x1 0x0 0x0 0x62900288 0x1 0x0 0x0 0x629002a8 0x1 0x0 0x0 0x6290020c 0x1 0x0 0x0 0x6290022c 0x1 0x0 0x0 0x6290024c 0x1 0x0 0x0 0x6290026c 0x1 0x0 0x0 0x6290028c 0x1 0x0 0x0 0x629002ac 0x1 0x0 0x0 0x62900404 0x1 0x0 0x0 0x62900408 0x1 0x0 0x0 0x62900400 0x1 0x0 0x0 0x62900d04 0x1 0x0 0x0 0x624b0010 0x1 0x0 0x0 0x624b0014 0x1 0x0 0x0 0x624b0018 0x1 0x0 0x0 0x624b0210 0x1 0x0 0x0 0x624b0230 0x1 0x0 0x0 0x624b0250 0x1 0x0 0x0 0x624b0270 0x1 0x0 0x0 0x624b0290 0x1 0x0 0x0 0x624b02b0 0x1 0x0 0x0 0x624b0208 0x1 0x0 0x0 0x624b0228 0x1 0x0 0x0 0x624b0248 0x1 0x0 0x0 0x624b0268 0x1 0x0 0x0 0x624b0288 0x1 0x0 0x0 0x624b02a8 0x1 0x0 0x0 0x624b020c 0x1 0x0 0x0 0x624b022c 0x1 0x0 0x0 0x624b024c 0x1 0x0 0x0 0x624b026c 0x1 0x0 0x0 0x624b028c 0x1 0x0 0x0 0x624b02ac 0x1 0x0 0x0 0x624b0400 0x1 0x0 0x0 0x624b0404 0x1 0x0 0x0 0x624b0408 0x1 0x0 0x0 0x62402028 0x1 0x0 0x0 0xb254520 0x1 0x0 0x0 0xb251020 0x1 0x0 0x0 0xb251024 0x1 0x0 0x0 0xb251030 0x1 0x0 0x0 0xb251200 0x1 0x0 0x0 0xb251214 0x1 0x0 0x0 0xb251228 0x1 0x0 0x0 0xb25123c 0x1 0x0 0x0 0xb251250 0x1 0x0 0x0 0xb251204 0x1 0x0 0x0 0xb251218 0x1 0x0 0x0 0xb25122c 0x1 0x0 0x0 0xb251240 0x1 0x0 0x0 0xb251254 0x1 0x0 0x0 0xb251208 0x1 0x0 0x0 0xb25121c 0x1 0x0 0x0 0xb251230 0x1 0x0 0x0 0xb251244 0x1 0x0 0x0 0xb251258 0x1 0x0 0x0 0xb254510 0x1 0x0 0x0 0xb254514 0x1 0x0 0x0 0xb250010 0x1 0x0 0x0 0xb250014 0x1 0x0 0x0 0xb250900 0x1 0x0 0x0 0xb250904 0x1 0x0 0x0 0x4200010 0x1 0x0 0x0 0x4200014 0x1 0x0 0x0 0x4200018 0x1 0x0 0x0 0x4200030 0x1 0x0 0x0 0x4200038 0x1 0x0 0x0 0x4200040 0x1 0x0 0x0 0x4200048 0x1 0x0 0x0 0x42000d0 0x1 0x0 0x0 0x4200210 0x1 0x0 0x0 0x4200230 0x1 0x0 0x0 0x4200250 0x1 0x0 0x0 0x4200270 0x1 0x0 0x0 0x4200290 0x1 0x0 0x0 0x42002b0 0x1 0x0 0x0 0x4200208 0x1 0x0 0x0 0x4200228 0x1 0x0 0x0 0x4200248 0x1 0x0 0x0 0x4200268 0x1 0x0 0x0 0x4200288 0x1 0x0 0x0 0x42002a8 0x1 0x0 0x0 0x420020c 0x1 0x0 0x0 0x420022c 0x1 0x0 0x0 0x420024c 0x1 0x0 0x0 0x420026c 0x1 0x0 0x0 0x420028c 0x1 0x0 0x0 0x42002ac 0x1 0x0 0x0 0x4200404 0x1 0x0 0x0 0x4200408 0x1 0x0 0x0 0x4200400 0x1 0x0 0x0 0x4200d04 0x1 0x0 0x0 0x4130010 0x1 0x0 0x0 0x4130014 0x1 0x0 0x0 0x4130018 0x1 0x0 0x0 0x4130210 0x1 0x0 0x0 0x4130230 0x1 0x0 0x0 0x4130250 0x1 0x0 0x0 0x4130270 0x1 0x0 0x0 0x4130290 0x1 0x0 0x0 0x41302b0 0x1 0x0 0x0 0x4130208 0x1 0x0 0x0 0x4130228 0x1 0x0 0x0 0x4130248 0x1 0x0 0x0 0x4130268 0x1 0x0 0x0 0x4130288 0x1 0x0 0x0 0x41302a8 0x1 0x0 0x0 0x413020c 0x1 0x0 0x0 0x413022c 0x1 0x0 0x0 0x413024c 0x1 0x0 0x0 0x413026c 0x1 0x0 0x0 0x413028c 0x1 0x0 0x0 0x41302ac 0x1 0x0 0x0 0x4130400 0x1 0x0 0x0 0x4130404 0x1 0x0 0x0 0x4130408 0x1 0x0 0x0 0x4082028 0x1 0x0 0x0 0x18a008 0x1 0x0 0x0 0xb2c4520 0x1 0x0 0x0 0xb2c1020 0x1 0x0 0x0 0xb2c1024 0x1 0x0 0x0 0xb2c1030 0x1 0x0 0x0 0xb2c1200 0x1 0x0 0x0 0xb2c1214 0x1 0x0 0x0 0xb2c1228 0x1 0x0 0x0 0xb2c123c 0x1 0x0 0x0 0xb2c1250 0x1 0x0 0x0 0xb2c1204 0x1 0x0 0x0 0xb2c1218 0x1 0x0 0x0 0xb2c122c 0x1 0x0 0x0 0xb2c1240 0x1 0x0 0x0 0xb2c1254 0x1 0x0 0x0 0xb2c1208 0x1 0x0 0x0 0xb2c121c 0x1 0x0 0x0 0xb2c1230 0x1 0x0 0x0 0xb2c1244 0x1 0x0 0x0 0xb2c1258 0x1 0x0 0x0 0xb2c4510 0x1 0x0 0x0 0xb2c4514 0x1 0x0 0x0 0xb2c0010 0x1 0x0 0x0 0xb2c0014 0x1 0x0 0x0 0xb2c0900 0x1 0x0 0x0 0xb2c0904 0x1 0x0 0x0 0x80a4010 0x1 0x0 0x0 0x80a4014 0x1 0x0 0x0 0x80a4018 0x1 0x0 0x0 0x80a4030 0x1 0x0 0x0 0x80a4038 0x1 0x0 0x0 0x80a4040 0x1 0x0 0x0 0x80a4048 0x1 0x0 0x0 0x80a40d0 0x1 0x0 0x0 0x80a4210 0x1 0x0 0x0 0x80a4230 0x1 0x0 0x0 0x80a4250 0x1 0x0 0x0 0x80a4270 0x1 0x0 0x0 0x80a4290 0x1 0x0 0x0 0x80a42b0 0x1 0x0 0x0 0x80a4208 0x1 0x0 0x0 0x80a4228 0x1 0x0 0x0 0x80a4248 0x1 0x0 0x0 0x80a4268 0x1 0x0 0x0 0x80a4288 0x1 0x0 0x0 0x80a42a8 0x1 0x0 0x0 0x80a420c 0x1 0x0 0x0 0x80a422c 0x1 0x0 0x0 0x80a424c 0x1 0x0 0x0 0x80a426c 0x1 0x0 0x0 0x80a428c 0x1 0x0 0x0 0x80a42ac 0x1 0x0 0x0 0x80a4404 0x1 0x0 0x0 0x80a4408 0x1 0x0 0x0 0x80a4400 0x1 0x0 0x0 0x80a4d04 0x1 0x0 0x0 0x83b0010 0x1 0x0 0x0 0x83b0014 0x1 0x0 0x0 0x83b0018 0x1 0x0 0x0 0x83b0210 0x1 0x0 0x0 0x83b0230 0x1 0x0 0x0 0x83b0250 0x1 0x0 0x0 0x83b0270 0x1 0x0 0x0 0x83b0290 0x1 0x0 0x0 0x83b02b0 0x1 0x0 0x0 0x83b0208 0x1 0x0 0x0 0x83b0228 0x1 0x0 0x0 0x83b0248 0x1 0x0 0x0 0x83b0268 0x1 0x0 0x0 0x83b0288 0x1 0x0 0x0 0x83b02a8 0x1 0x0 0x0 0x83b020c 0x1 0x0 0x0 0x83b022c 0x1 0x0 0x0 0x83b024c 0x1 0x0 0x0 0x83b026c 0x1 0x0 0x0 0x83b028c 0x1 0x0 0x0 0x83b02ac 0x1 0x0 0x0 0x83b0400 0x1 0x0 0x0 0x83b0404 0x1 0x0 0x0 0x83b0408 0x1 0x0 0x0 0x8302028 0x1 0x0 0x0 0xb2b4520 0x1 0x0 0x0 0xb2b1020 0x1 0x0 0x0 0xb2b1024 0x1 0x0 0x0 0xb2b1030 0x1 0x0 0x0 0xb2b1200 0x1 0x0 0x0 0xb2b1214 0x1 0x0 0x0 0xb2b1228 0x1 0x0 0x0 0xb2b123c 0x1 0x0 0x0 0xb2b1250 0x1 0x0 0x0 0xb2b1204 0x1 0x0 0x0 0xb2b1218 0x1 0x0 0x0 0xb2b122c 0x1 0x0 0x0 0xb2b1240 0x1 0x0 0x0 0xb2b1254 0x1 0x0 0x0 0xb2b1208 0x1 0x0 0x0 0xb2b121c 0x1 0x0 0x0 0xb2b1230 0x1 0x0 0x0 0xb2b1244 0x1 0x0 0x0 0xb2b1258 0x1 0x0 0x0 0xb2b4510 0x1 0x0 0x0 0xb2b4514 0x1 0x0 0x0 0xb2b0010 0x1 0x0 0x0 0xb2b0014 0x1 0x0 0x0 0xb2b0900 0x1 0x0 0x0 0xb2b0904 0x1 0x0 0x0 0x17a00204 0x1d 0x0>; + }; + }; + }; + + fragment@37 { + target = <0xffffffff>; + + __overlay__ { + + ss_plog@B4400000 { + compatible = "ss_plog"; + no-map; + reg = <0x0 0xb4400000 0x0 0x200000>; + }; + + ramoops@B4600000 { + compatible = "ramoops"; + reg = <0x0 0xb4600000 0x0 0x100000>; + record-size = <0x40000>; + console-size = <0x40000>; + ftrace-size = <0x40000>; + pmsg-size = <0x40000>; + }; + + sec_debug_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4700000 0x0 0x800000>; + phandle = <0xbb>; + }; + + sec_debug_autocomment@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4f00000 0x0 0x1000>; + phandle = <0xbc>; + }; + + sec_debug_rdx_bootdev@0 { + no-ship; + reg = <0x1 0x0 0x0 0x5900000>; + phandle = <0xbd>; + }; + + kaslr_region@A0001000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xa0001000 0x0 0x1000>; + phandle = <0xbe>; + }; + + rkp_region@B0200000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xb0200000 0x0 0x200000>; + phandle = <0xbf>; + }; + + hdm_region@A1000000 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xa1000000 0x0 0x1000>; + phandle = <0x53>; + }; + + modem_shared_mem_region@B5000000 { + compatible = "modem-removed-dma-pool"; + no-map; + reg = <0x0 0xb5000000 0x0 0x6000000>; + phandle = <0x52>; + }; + }; + }; + + fragment@38 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x80b00000 0x0 0x7100000>; + }; + }; + + fragment@39 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x8b000000 0x0 0x8900000>; + }; + }; + + fragment@40 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x93c00000 0x0 0x3e00000>; + }; + }; + + fragment@41 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97a00000 0x0 0x500000>; + }; + }; + + fragment@42 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97f00000 0x0 0x500000>; + }; + }; + + fragment@43 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98400000 0x0 0x500000>; + }; + }; + + fragment@44 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98900000 0x0 0x1e00000>; + }; + }; + + fragment@45 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9e000000 0x0 0x2000000>; + }; + }; + + fragment@46 { + target = <0xffffffff>; + + __overlay__ { + size = <0x0 0x2000000>; + }; + }; + + fragment@47 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@48 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@49 { + target = <0xffffffff>; + + __overlay__ { + + upload_cause@66c { + compatible = "qcom,msm-imem-upload_cause"; + reg = <0x66c 0x4>; + }; + }; + }; + + fragment@50 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@51 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@52 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@53 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@54 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@55 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@56 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@57 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@58 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@59 { + target = <0xffffffff>; + + __overlay__ { + + dwc3@a600000 { + maximum-speed = "high-speed"; + }; + }; + }; + + fragment@60 { + target = <0xffffffff>; + + __overlay__ { + + input_booster { + status = "okay"; + compatible = "input_booster"; + #address-cells = <0x1>; + #size-cells = <0x0>; + + booster_key@1 { + input_booster,label = "KEY"; + input_booster,type = <0x0>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0xc8>; + input_booster,tail_times = <0x0>; + }; + + booster_key@2 { + input_booster,label = "TOUCHKEY"; + input_booster,type = <0x1>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x0>; + input_booster,tail_times = <0x12c>; + }; + + booster_key@3 { + input_booster,label = "TOUCH"; + input_booster,type = <0x2>; + input_booster,levels = <0x1 0x2 0x3>; + input_booster,cpu_freqs = <0x135600 0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2 0x2>; + input_booster,ddr_freqs = <0x3f9 0x3f9 0x3f9>; + input_booster,lpm_bias = <0x5 0x5 0x5>; + input_booster,head_times = <0xc8 0xc8 0x0>; + input_booster,tail_times = <0x0 0x0 0x12c>; + }; + + booster_key@4 { + input_booster,label = "MULTITOUCH"; + input_booster,type = <0x3>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x3e8 0x0>; + input_booster,tail_times = <0x0 0x1f4>; + }; + + booster_key@5 { + input_booster,label = "KEYBOARD"; + input_booster,type = <0x4>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x135600>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x82 0x82>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@6 { + input_booster,label = "MOUSE"; + input_booster,type = <0x5>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@7 { + input_booster,label = "MOUSE WHEEL"; + input_booster,type = <0x6>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@8 { + input_booster,label = "PEN HOVER"; + input_booster,type = <0x7>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@9 { + input_booster,label = "PEN"; + input_booster,type = <0x8>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x17bb00 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x258>; + }; + + booster_key@10 { + input_booster,label = "KEY_TWO"; + input_booster,type = <0x9>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x17bb00>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x2bc>; + input_booster,tail_times = <0x2bc>; + }; + }; + + sec_smem@0 { + compatible = "samsung,sec-smem"; + status = "okay"; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_4 { + compatible = "qcom,memshare-peripheral"; + memory-region = <0x52>; + qcom,peripheral-size = <0x2000000>; + qcom,reserved-size = <0x4000000>; + qcom,client-id = <0x3>; + qcom,allocate-boot-time; + label = "modem"; + }; + }; + + samsung,sec_misc { + qfprom_jtag,reg = <0x780180>; + }; + + usb-notifier { + compatible = "samsung,usb-notifier"; + qcom,disable_control_en = <0x1>; + qcom,unsupport_host_en = <0x0>; + phandle = <0xc0>; + }; + + samsung,sec_hdm { + memory-region = <0x53>; + }; + }; + }; + + fragment@61 { + target = <0xffffffff>; + + __overlay__ { + + android { + + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_system,recovery,dtbo,abl,xbl,tz,hyp"; + }; + }; + }; + }; + + fragment@62 { + target = <0xffffffff>; + + __overlay__ { + qcom,smem-states = <0xffffffff 0x0 0xffffffff 0x4 0xffffffff 0x5>; + qcom,smem-state-names = "qcom,force-stop", "qcom,stop-reason-0", "qcom,stop-reason-1"; + }; + }; + + fragment@63 { + target = <0xffffffff>; + + __overlay__ { + vdd-3.3-ch1-supply; + }; + }; + + fragment@64 { + target = <0xffffffff>; + + __overlay__ { + spm-level = <0x3>; + }; + }; + + fragment@65 { + target = <0xffffffff>; + + __overlay__ { + + camera_mem_region { + reg = <0x1 0x20000000 0x0 0x25800000>; + ion,recyclable; + phandle = <0x54>; + }; + }; + }; + + fragment@66 { + target = <0xffffffff>; + + __overlay__ { + + qcom,ion { + + qcom,ion-heap@30 { + reg = <0x1e>; + memory-region = <0x54>; + qcom,ion-heap-type = "RBIN"; + }; + }; + }; + }; + + fragment@67 { + target = <0xffffffff>; + + __overlay__ { + i2c18 = "/soc/i2c@18"; + }; + }; + + fragment@68 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x3>; + + imp_list { + #list-imp-cells = <0x3>; + phandle = <0x25>; + }; + }; + }; + + fragment@69 { + target = <0xffffffff>; + + __overlay__ { + + msm_cdc_pinctrl_quin { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x55 0x56 0x57 0x58>; + pinctrl-1 = <0x59 0x5a 0x5b 0x5c>; + qcom,lpi-gpios; + phandle = <0x60>; + }; + }; + }; + + fragment@70 { + target = <0xffffffff>; + + __overlay__ { + + sec-audio-sysfs { + compatible = "samsung,audio-sysfs"; + status = "okay"; + audio,num-amp = <0x2>; + }; + + samsung,q6audio-adaptation { + compatible = "samsung,q6audio-adaptation"; + adaptation,device-tx-port-id = <0xb037>; + adaptation,spk-rx-port-id = <0x1016>; + adaptation,usb-rx-port-id = <0x7000>; + adaptation,bt-rx-port-id = <0x400e>; + adaptation,headset-rx-port-id = <0xb030>; + phandle = <0x5f>; + }; + + det_zones { + #list-det-cells = <0x2>; + phandle = <0x24>; + }; + + i2c@18 { + status = "ok"; + cell-index = <0x12>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x58 0x0 0xffffffff 0x59 0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x5d 0x5e>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xc1>; + + tas256x@4c { + #sound-dai-cells = <0x0>; + compatible = "ti, tas256x"; + status = "ok"; + reg = <0x4c>; + ti,reset-gpio = <0xffffffff 0x5e 0x0>; + ti,irq-gpio = <0xffffffff 0x5a 0x0>; + ti,left-channel = <0x4d>; + ti,right-channel = <0x4c>; + ti,channels = <0x2>; + ti,iv-width = <0x8>; + ti,vbat-mon = <0x1>; + ti,port_id = <0x1016>; + phandle = <0xc2>; + }; + }; + }; + }; + + fragment@71 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,wcn-btfm = <0x1>; + qcom,ext-disp-audio-rx = <0x0>; + qcom,mi2s-audio-intf = <0x1>; + asoc-platform = <0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0x5f>; + asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-pcm-dsp.2", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-compress-dsp", "msm-pcm-hostless", "msm-pcm-afe", "msm-lsm-client", "msm-pcm-routing", "msm-compr-dsp", "msm-pcm-dsp-noirq", "q6audio-adaptation"; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS3", "MIC BIAS3", "Analog Mic4", "AMIC5", "MIC BIAS4", "MIC BIAS4", "Analog Mic5", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT"; + qcom,msm-mbhc-hs-mic-max-threshold-mv = <0x270f>; + qcom,msm-mbhc-hs-mic-min-threshold-mv = <0x280>; + qcom,cdc-dmic01-gpios; + qcom,cdc-dmic23-gpios; + qcom,cdc-dmic45-gpios; + qcom,quin-mi2s-gpios = <0x60>; + asoc-codec = <0xffffffff 0xffffffff>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec"; + qcom,wsa-max-devs = <0x0>; + qcom,wsa-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x31 0xffffffff>; + fsa4480-i2c-handle; + qcom,fm-lna-gpios = <0xffffffff 0x54 0x0>; + qcom,msm-mbhc-gnd-det = <0x1>; + }; + }; + + fragment@72 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@73 { + target = <0xffffffff>; + + __overlay__ { + + tas25xx_gpio_default { + phandle = <0x5d>; + + mux { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + function = "gpio"; + }; + + config { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + bias-disable; + }; + }; + + fm_lna_default { + phandle = <0x5e>; + + mux { + pins = "gpio84"; + function = "gpio"; + }; + + config { + pins = "gpio84"; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@74 { + target = <0xffffffff>; + + __overlay__ { + + grip_i2c { + + grip_i2c_active { + phandle = <0xa8>; + + grip_i2c_active { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + + grip_i2c_suspend { + phandle = <0xc3>; + + grip_i2c_suspend { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + }; + + s2mpb03_i2c_sda_default { + phandle = <0x61>; + + mux { + pins = "gpio25"; + function = "gpio"; + }; + + config { + pins = "gpio25"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + s2mpb03_i2c_scl_default { + phandle = <0x62>; + + mux { + pins = "gpio26"; + function = "gpio"; + }; + + config { + pins = "gpio26"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + cam_sensor_mclk0_active { + phandle = <0x81>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk0_suspend { + phandle = <0x83>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk1_active { + phandle = <0x91>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk1_suspend { + phandle = <0x93>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk2_active { + phandle = <0x99>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk2_suspend { + phandle = <0x9c>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk3_active { + phandle = <0x86>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk3_suspend { + phandle = <0x8a>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk4_active { + phandle = <0xa0>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk4_suspend { + phandle = <0xa3>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + rcam1_sensor_reset_active { + phandle = <0x82>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_reset_suspend { + phandle = <0x84>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_active { + phandle = <0x92>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_suspend { + phandle = <0x94>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_active { + phandle = <0x87>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_suspend { + phandle = <0x8b>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_active { + phandle = <0x9a>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_suspend { + phandle = <0x9d>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_active { + phandle = <0xa1>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_suspend { + phandle = <0xa4>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_active { + phandle = <0x73>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_suspend { + phandle = <0x74>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_active { + phandle = <0x9b>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_suspend { + phandle = <0x9e>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_active { + phandle = <0x88>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_suspend { + phandle = <0x8c>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_active { + phandle = <0xa2>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_suspend { + phandle = <0xa5>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_active { + phandle = <0x89>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-disable; + output-high; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_suspend { + phandle = <0x8d>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vdig_active { + phandle = <0xc4>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vdig_suspend { + phandle = <0xc5>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_active { + phandle = <0xc6>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_suspend { + phandle = <0xc7>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + if_pmic_i2c_pins { + phandle = <0xc8>; + + if_pmic_i2c_sleep { + phandle = <0x66>; + + mux { + pins = "gpio115", "gpio116"; + function = "gpio"; + }; + + config { + pins = "gpio115", "gpio116"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + usbpd_i2c_pins { + phandle = <0xc9>; + + usbpd_i2c_sleep { + phandle = <0x68>; + + mux { + pins = "gpio53", "gpio54"; + function = "gpio"; + }; + + config { + pins = "gpio53", "gpio54"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + mcu_reset_active { + phandle = <0x76>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_reset_suspend { + phandle = <0x78>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + mcu_clk_active { + phandle = <0x77>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_clk_suspend { + phandle = <0x79>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + }; + }; + + fragment@75 { + target = <0xffffffff>; + + __overlay__ { + + grip_int_active { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xa9>; + }; + + grip_int_suspend { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xca>; + }; + }; + }; + + fragment@76 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x6 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x22 0x25 0x2a 0x2d 0x2f 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x43 0x44 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5b 0x5e 0x73 0x74 0x76>; + }; + }; + + fragment@77 { + target = <0xffffffff>; + + __overlay__ { + + qcom,pm6150@0 { + + qcom,power-on@800 { + interrupts = <0x0 0x8 0x0 0x0 0x0 0x8 0x1 0x0 0x0 0x8 0x4 0x0 0x0 0x8 0x5 0x0>; + interrupt-names = "kpdpwr", "resin", "resin-bark", "kpdpwr-resin-bark"; + qcom,s3-debounce = <0x80>; + + qcom,pon_1 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_2 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_3 { + qcom,pon-type = <0x3>; + qcom,support-reset = <0x1>; + qcom,pull-up = <0x1>; + qcom,s1-timer = <0x1a40>; + qcom,s2-timer = <0x3e8>; + qcom,s2-type = <0x8>; + qcom,use-bark; + }; + }; + }; + }; + }; + + fragment@78 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@79 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@80 { + target = <0xffffffff>; + + __overlay__ { + + sec_thermistor@0 { + compatible = "samsung,sec-ap-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "ap_therm"; + adc_array = <0x70e 0x8a0 0xa3c 0xc04 0xe36 0x1103 0x1467 0x17f5 0x1c02 0x20ba 0x25b4 0x2b63 0x3141 0x3799 0x3d1c 0x44c8 0x4b37 0x51b0 0x5641 0x5bbf 0x5fec 0x6437 0x66e9>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@1 { + compatible = "samsung,sec-pa-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "pa_therm"; + adc_array = <0x745 0x8dc 0xa82 0xc3c 0xe92 0x112d 0x149e 0x1836 0x1c41 0x211f 0x2636 0x2bc9 0x31a3 0x3802 0x3d67 0x453a 0x4b8f 0x518c 0x5730 0x5c17 0x60ae 0x6482 0x672b>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@2 { + compatible = "samsung,sec-wf-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4f>; + io-channel-names = "wf_therm"; + adc_array = <0x753 0x8de 0xa8f 0xc4d 0xe9a 0x1140 0x149f 0x183d 0x1c54 0x2116 0x262e 0x2bdb 0x31c1 0x3816 0x3d7c 0x455a 0x4b86 0x51c4 0x56f2 0x5c43 0x60c5 0x64b3 0x6785>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + i2c@2 { + cell-index = <0x2>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x19 0x0 0xffffffff 0x1a 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x61 0x62>; + phandle = <0xcb>; + + s2mpb03@56 { + compatible = "samsung,s2mpb03pmic"; + reg = <0x56>; + additional_reg_init; + + regulators { + + s2mpb03-ldo1 { + regulator-name = "s2mpb03-ldo1"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x100590>; + phandle = <0x90>; + }; + + s2mpb03-ldo2 { + regulator-name = "s2mpb03-ldo2"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x80>; + }; + + s2mpb03-ldo3 { + regulator-name = "s2mpb03-ldo3"; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x7e>; + }; + + s2mpb03-ldo4 { + regulator-name = "s2mpb03-ldo4"; + regulator-min-microvolt = <0x10c8e0>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x98>; + }; + + s2mpb03-ldo5 { + regulator-name = "s2mpb03-ldo5"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x7f>; + }; + + s2mpb03-ldo6 { + regulator-name = "s2mpb03-ldo6"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x8f>; + }; + + s2mpb03-ldo7 { + regulator-name = "s2mpb03-ldo7"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x75>; + }; + }; + }; + }; + }; + }; + + fragment@81 { + target = <0xffffffff>; + + __overlay__ { + interrupts = <0x0 0xc0 0x0 0x0 0x0 0xc1 0x0 0x0 0x0 0xc2 0x0 0x0 0x0 0xc3 0x0 0x0 0x0 0xc4 0x0 0x0 0x0 0xc6 0x0 0x0 0x0 0xc7 0x0 0x0 0x0 0xc9 0x0 0x0>; + interrupt-names = "pm6150_gpio1", "pm6150_gpio2", "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio5", "pm6150_gpio7", "pm6150_gpio8", "pm6150_gpio10"; + qcom,gpios-disallowed = <0x6 0x9>; + }; + }; + + fragment@82 { + target = <0xffffffff>; + + __overlay__ { + + ap_therm { + reg = <0x4e>; + label = "ap_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@83 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm { + reg = <0x4e>; + label = "pa_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + + wf_therm { + reg = <0x4f>; + label = "wf_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@84 { + target = <0xffffffff>; + + __overlay__ { + + self_display_FC3_dtsi { + label = "self_display_FC3_dtsi"; + samsung,support_self_display; + samsung,self_mask_setting_pre_revA = [29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 02 75 10]; + samsung,self_mask_setting_post_revA = [29 01 00 00 00 00 02 75 00]; + samsung,self_mask_on_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 00 00 00 95 07 9e 09 5f 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_on_factory_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_off_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_disp_debug_rx_cmds_revA = [06 01 00 00 00 00 01 7f 04 01]; + samsung,self_mask_check_tx_pre1_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 04 b0 00 27 d8 29 01 00 00 00 00 02 d8 16 29 01 00 00 00 00 0a bf 01 07 00 00 00 10 00 00 00 29 01 00 00 11 00 02 7a 00 29 01 00 00 00 00 02 75 10 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,self_mask_check_tx_pre2_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 02 75 00 29 01 00 00 22 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 01 f4 02 33 09 60 09 61 00 00 ff ff ff 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,mask_crc_pass_data = [d3 9b]; + samsung,self_mask_check_rx_cmds_revA = [06 01 00 00 00 00 01 14 02 00]; + samsung,self_mask_check_tx_post_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 00 00 00 00 00 29 01 00 00 00 00 02 bf 00 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + phandle = <0x63>; + }; + }; + }; + + fragment@85 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + label = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0x1e6>; + qcom,mdss-brightness-max-level = <0x1e6>; + qcom,mdss-brightness-default-level = <0xff>; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-t-clk-pre = <0x3e>; + qcom,mdss-dsi-t-clk-post = <0x10>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x46>; + qcom,mdss-pan-physical-height-dimension = <0x9b>; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-t-clk-pre-extend; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + qcom,ulps-enabled; + samsung,panel-vendor = "SDC"; + samsung,disp-model = "AMS667YM01"; + samsung,support_gamma_mode2; + samsung,skip_read_on_pre; + samsung,elvss_interpolation_temperature = <0xfffffff0>; + samsung,support_lpm; + samsung,support_gpara; + samsung,pointing_gpara; + samsung,two_byte_gpara; + samsung,rsc_4_frame_idle; + samsung,support_factory_panel_swap; + samsung,support-optical-fingerprint; + samsung,support_vrr_based_bl; + ss,self_display = <0x63>; + samsung,level0_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 9f a5 a5]; + samsung,level0_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 9f 5a 5a]; + samsung,level1_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 5a 5a]; + samsung,level1_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 a5 a5]; + samsung,level2_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 fc 5a 5a]; + samsung,level2_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 fc a5 a5]; + samsung,brightness_tx_cmds_revA = <0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100>; + samsung,display_on_tx_cmds_revA = [29 00 00 00 00 00 03 9f a5 a5 05 00 00 00 00 00 02 29 00 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,display_off_tx_cmds_revA = [05 01 00 00 00 00 02 28 00]; + samsung,reg_read_pos_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 00 00]; + samsung,mtp_write_sysfs_tx_cmds_revA = <0x29000000 0x3d00 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + samsung,panel_ltps_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 50 01 0c 00 04 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 3c 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,panel_ltps_tx_cmds_revC = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 50 00 0c 00 04 31 48 31 48 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 3c 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,smooth_dimming_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 91 63 29 00 00 00 00 00 02 63 20 29 01 00 00 11 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,gamma_mode2_normal_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26360 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x7290000 0x2 0x53202900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0002900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revF = <0x29000000 0x391 0x2012900 0x0 0x2532029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 1c 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,gamma_mode2_hbm_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26320 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x290000 0x2 0x53e02900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0072900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revF = <0x29000000 0x391 0x2002900 0x0 0x253e029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 14 29 00 00 00 00 00 02 53 e0 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,vrr_tx_cmds_revA = [29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f]; + samsung,acl_on_tx_cmds_revA = [29 00 00 00 00 00 04 b0 03 b3 65 29 00 00 00 00 00 14 65 55 00 b0 51 66 98 15 55 55 55 08 f1 c6 48 40 00 20 10 09 29 00 00 00 00 00 02 55 03]; + samsung,acl_off_tx_cmds_revA = [29 01 00 00 00 00 02 55 00]; + samsung,manufacture_id0_rx_cmds_revA = [06 01 00 00 00 00 01 da 01 00 00]; + samsung,manufacture_id1_rx_cmds_revA = [06 01 00 00 00 00 01 db 01 00 00]; + samsung,manufacture_id2_rx_cmds_revA = [06 01 00 00 00 00 01 dc 01 00 00]; + samsung,module_info_rx_cmds_revA = [06 01 00 00 00 00 01 a1 0b 00 00]; + samsung,octa_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 04 00 0b]; + samsung,cell_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 10 00 0f]; + samsung,cell_id_rx_cmds_revG = [06 01 00 00 00 00 01 92 10 00 02]; + samsung,ddi_id_rx_cmds_revA = [06 01 00 00 00 00 01 d6 05 00 00]; + samsung,mtp_read_sysfs_rx_cmds_revA = [06 01 00 00 00 00 01 00 00 00 00]; + samsung,candela_map_table_revA = <0x0 0x0 0x0 0x2 0x2 0x1 0x1 0x1 0x3 0x2 0x2 0x2 0x2 0x4 0x3 0x3 0x3 0x3 0x5 0x3 0x4 0x4 0x4 0x7 0x4 0x5 0x5 0x5 0x8 0x5 0x6 0x6 0x6 0xa 0x5 0x7 0x7 0x7 0xc 0x6 0x8 0x8 0x8 0xd 0x7 0x9 0x9 0x9 0xf 0x7 0xa 0xa 0xa 0x11 0x8 0xb 0xb 0xb 0x13 0x9 0xc 0xc 0xc 0x15 0xa 0xd 0xd 0xd 0x18 0xb 0xe 0xe 0xe 0x1a 0xc 0xf 0xf 0xf 0x1c 0xd 0x10 0x10 0x10 0x1e 0xd 0x11 0x11 0x11 0x20 0xe 0x12 0x12 0x12 0x23 0xf 0x13 0x13 0x13 0x25 0x10 0x14 0x14 0x14 0x28 0x11 0x15 0x15 0x15 0x2a 0x12 0x16 0x16 0x16 0x2d 0x13 0x17 0x17 0x17 0x2f 0x14 0x18 0x18 0x18 0x32 0x15 0x19 0x19 0x19 0x34 0x16 0x1a 0x1a 0x1a 0x37 0x17 0x1b 0x1b 0x1b 0x3a 0x19 0x1c 0x1c 0x1c 0x3c 0x1a 0x1d 0x1d 0x1d 0x3f 0x1b 0x1e 0x1e 0x1e 0x42 0x1c 0x1f 0x1f 0x1f 0x45 0x1d 0x20 0x20 0x20 0x47 0x1e 0x21 0x21 0x21 0x4a 0x1f 0x22 0x22 0x22 0x4d 0x20 0x23 0x23 0x23 0x50 0x22 0x24 0x24 0x24 0x53 0x23 0x25 0x25 0x25 0x56 0x24 0x26 0x26 0x26 0x59 0x25 0x27 0x27 0x27 0x5c 0x26 0x28 0x28 0x28 0x5f 0x28 0x29 0x29 0x29 0x62 0x29 0x2a 0x2a 0x2a 0x65 0x2a 0x2b 0x2b 0x2b 0x68 0x2b 0x2c 0x2c 0x2c 0x6b 0x2d 0x2d 0x2d 0x2d 0x6e 0x2e 0x2e 0x2e 0x2e 0x71 0x2f 0x2f 0x2f 0x2f 0x74 0x30 0x30 0x30 0x30 0x77 0x32 0x31 0x31 0x31 0x7b 0x33 0x32 0x32 0x32 0x7e 0x34 0x33 0x33 0x33 0x81 0x36 0x34 0x34 0x34 0x84 0x37 0x35 0x35 0x35 0x88 0x38 0x36 0x36 0x36 0x8b 0x3a 0x37 0x37 0x37 0x8e 0x3b 0x38 0x38 0x38 0x92 0x3c 0x39 0x39 0x39 0x95 0x3e 0x3a 0x3a 0x3a 0x98 0x3f 0x3b 0x3b 0x3b 0x9c 0x40 0x3c 0x3c 0x3c 0x9f 0x42 0x3d 0x3d 0x3d 0xa2 0x43 0x3e 0x3e 0x3e 0xa6 0x44 0x3f 0x3f 0x3f 0xa9 0x46 0x40 0x40 0x40 0xad 0x47 0x41 0x41 0x41 0xb0 0x49 0x42 0x42 0x42 0xb4 0x4a 0x43 0x43 0x43 0xb7 0x4c 0x44 0x44 0x44 0xbb 0x4d 0x45 0x45 0x45 0xbe 0x4e 0x46 0x46 0x46 0xc2 0x50 0x47 0x47 0x47 0xc5 0x51 0x48 0x48 0x48 0xc9 0x53 0x49 0x49 0x49 0xcd 0x54 0x4a 0x4a 0x4a 0xd0 0x56 0x4b 0x4b 0x4b 0xd4 0x57 0x4c 0x4c 0x4c 0xd7 0x59 0x4d 0x4d 0x4d 0xdb 0x5a 0x4e 0x4e 0x4e 0xdf 0x5c 0x4f 0x4f 0x4f 0xe3 0x5d 0x50 0x50 0x50 0xe6 0x5f 0x51 0x51 0x51 0xea 0x60 0x52 0x52 0x52 0xee 0x62 0x53 0x53 0x53 0xf1 0x63 0x54 0x54 0x54 0xf5 0x65 0x55 0x55 0x55 0xf9 0x66 0x56 0x56 0x56 0xfd 0x68 0x57 0x57 0x57 0x101 0x69 0x58 0x58 0x58 0x104 0x6b 0x59 0x59 0x59 0x108 0x6c 0x5a 0x5a 0x5a 0x10c 0x6e 0x5b 0x5b 0x5b 0x110 0x70 0x5c 0x5c 0x5c 0x114 0x71 0x5d 0x5d 0x5d 0x118 0x73 0x5e 0x5e 0x5e 0x11b 0x74 0x5f 0x5f 0x5f 0x11f 0x76 0x60 0x60 0x60 0x123 0x77 0x61 0x61 0x61 0x127 0x79 0x62 0x62 0x62 0x12b 0x7b 0x63 0x63 0x63 0x12f 0x7c 0x64 0x64 0x64 0x133 0x7e 0x65 0x65 0x65 0x137 0x7f 0x66 0x66 0x66 0x13b 0x81 0x67 0x67 0x67 0x13f 0x83 0x68 0x68 0x68 0x143 0x84 0x69 0x69 0x69 0x147 0x86 0x6a 0x6a 0x6a 0x14b 0x88 0x6b 0x6b 0x6b 0x14f 0x89 0x6c 0x6c 0x6c 0x153 0x8b 0x6d 0x6d 0x6d 0x157 0x8c 0x6e 0x6e 0x6e 0x15b 0x8e 0x6f 0x6f 0x6f 0x15f 0x90 0x70 0x70 0x70 0x163 0x91 0x71 0x71 0x71 0x168 0x93 0x72 0x72 0x72 0x16c 0x95 0x73 0x73 0x73 0x170 0x96 0x74 0x74 0x74 0x174 0x98 0x75 0x75 0x75 0x178 0x9a 0x76 0x76 0x76 0x17c 0x9c 0x77 0x77 0x77 0x180 0x9d 0x78 0x78 0x78 0x185 0x9f 0x79 0x79 0x79 0x189 0xa1 0x7a 0x7a 0x7a 0x18d 0xa2 0x7b 0x7b 0x7b 0x191 0xa4 0x7c 0x7c 0x7c 0x195 0xa6 0x7d 0x7d 0x7d 0x19a 0xa7 0x7e 0x7e 0x7e 0x19e 0xa9 0x7f 0x7f 0x7f 0x1a2 0xab 0x80 0x80 0x80 0x1a6 0xad 0x81 0x81 0x81 0x1ab 0xae 0x82 0x82 0x82 0x1af 0xb0 0x83 0x83 0x83 0x1b3 0xb2 0x84 0x84 0x84 0x1b8 0xb4 0x85 0x85 0x85 0x1bc 0xb5 0x86 0x86 0x86 0x1c0 0xb7 0x87 0x87 0x87 0x1c5 0xb9 0x88 0x88 0x88 0x1c9 0xbb 0x89 0x89 0x89 0x1cd 0xbc 0x8a 0x8a 0x8a 0x1d1 0xbe 0x8b 0x8b 0x8b 0x1d6 0xc0 0x8c 0x8c 0x8c 0x1da 0xc2 0x8d 0x8d 0x8d 0x1de 0xc3 0x8e 0x8e 0x8e 0x1e3 0xc5 0x8f 0x8f 0x8f 0x1e7 0xc7 0x90 0x90 0x90 0x1eb 0xc9 0x91 0x91 0x91 0x1f0 0xcb 0x92 0x92 0x92 0x1f4 0xcc 0x93 0x93 0x93 0x1f8 0xce 0x94 0x94 0x94 0x1fd 0xd0 0x95 0x95 0x95 0x201 0xd2 0x96 0x96 0x96 0x206 0xd4 0x97 0x97 0x97 0x20a 0xd6 0x98 0x98 0x98 0x20e 0xd7 0x99 0x99 0x99 0x213 0xd9 0x9a 0x9a 0x9a 0x217 0xdb 0x9b 0x9b 0x9b 0x21c 0xdd 0x9c 0x9c 0x9c 0x220 0xdf 0x9d 0x9d 0x9d 0x225 0xe1 0x9e 0x9e 0x9e 0x229 0xe2 0x9f 0x9f 0x9f 0x22e 0xe4 0xa0 0xa0 0xa0 0x232 0xe6 0xa1 0xa1 0xa1 0x237 0xe8 0xa2 0xa2 0xa2 0x23b 0xea 0xa3 0xa3 0xa3 0x240 0xec 0xa4 0xa4 0xa4 0x244 0xed 0xa5 0xa5 0xa5 0x249 0xef 0xa6 0xa6 0xa6 0x24d 0xf1 0xa7 0xa7 0xa7 0x252 0xf3 0xa8 0xa8 0xa8 0x256 0xf5 0xa9 0xa9 0xa9 0x25b 0xf7 0xaa 0xaa 0xaa 0x260 0xf9 0xab 0xab 0xab 0x264 0xfb 0xac 0xac 0xac 0x269 0xfd 0xad 0xad 0xad 0x26d 0xfe 0xae 0xae 0xae 0x272 0x100 0xaf 0xaf 0xaf 0x277 0x102 0xb0 0xb0 0xb0 0x27b 0x104 0xb1 0xb1 0xb1 0x280 0x106 0xb2 0xb2 0xb2 0x284 0x108 0xb3 0xb3 0xb3 0x289 0x10a 0xb4 0xb4 0xb4 0x28e 0x10c 0xb5 0xb5 0xb5 0x292 0x10e 0xb6 0xb6 0xb6 0x297 0x110 0xb7 0xb7 0xb7 0x29c 0x112 0xb8 0xb8 0xb8 0x2a0 0x113 0xb9 0xb9 0xb9 0x2a5 0x115 0xba 0xba 0xba 0x2aa 0x117 0xbb 0xbb 0xbb 0x2ae 0x119 0xbc 0xbc 0xbc 0x2b3 0x11b 0xbd 0xbd 0xbd 0x2b8 0x11d 0xbe 0xbe 0xbe 0x2bd 0x11f 0xbf 0xbf 0xbf 0x2c1 0x121 0xc0 0xc0 0xc0 0x2c6 0x123 0xc1 0xc1 0xc1 0x2cb 0x125 0xc2 0xc2 0xc2 0x2d0 0x127 0xc3 0xc3 0xc3 0x2d4 0x129 0xc4 0xc4 0xc4 0x2d9 0x12b 0xc5 0xc5 0xc5 0x2de 0x12d 0xc6 0xc6 0xc6 0x2e3 0x12f 0xc7 0xc7 0xc7 0x2e8 0x131 0xc8 0xc8 0xc8 0x2ec 0x133 0xc9 0xc9 0xc9 0x2f1 0x135 0xca 0xca 0xca 0x2f6 0x137 0xcb 0xcb 0xcb 0x2fb 0x139 0xcc 0xcc 0xcc 0x300 0x13b 0xcd 0xcd 0xcd 0x304 0x13d 0xce 0xce 0xce 0x309 0x13f 0xcf 0xcf 0xcf 0x30e 0x141 0xd0 0xd0 0xd0 0x313 0x143 0xd1 0xd1 0xd1 0x318 0x145 0xd2 0xd2 0xd2 0x31d 0x147 0xd3 0xd3 0xd3 0x322 0x149 0xd4 0xd4 0xd4 0x327 0x14b 0xd5 0xd5 0xd5 0x32b 0x14d 0xd6 0xd6 0xd6 0x330 0x14f 0xd7 0xd7 0xd7 0x335 0x151 0xd8 0xd8 0xd8 0x33a 0x153 0xd9 0xd9 0xd9 0x33f 0x155 0xda 0xda 0xda 0x344 0x157 0xdb 0xdb 0xdb 0x349 0x159 0xdc 0xdc 0xdc 0x34e 0x15b 0xdd 0xdd 0xdd 0x353 0x15d 0xde 0xde 0xde 0x358 0x15f 0xdf 0xdf 0xdf 0x35d 0x161 0xe0 0xe0 0xe0 0x362 0x163 0xe1 0xe1 0xe1 0x367 0x165 0xe2 0xe2 0xe2 0x36c 0x167 0xe3 0xe3 0xe3 0x371 0x169 0xe4 0xe4 0xe4 0x376 0x16b 0xe5 0xe5 0xe5 0x37b 0x16d 0xe6 0xe6 0xe6 0x380 0x170 0xe7 0xe7 0xe7 0x385 0x172 0xe8 0xe8 0xe8 0x38a 0x174 0xe9 0xe9 0xe9 0x38f 0x176 0xea 0xea 0xea 0x394 0x178 0xeb 0xeb 0xeb 0x399 0x17a 0xec 0xec 0xec 0x39e 0x17c 0xed 0xed 0xed 0x3a3 0x17e 0xee 0xee 0xee 0x3a8 0x180 0xef 0xef 0xef 0x3ad 0x182 0xf0 0xf0 0xf0 0x3b2 0x184 0xf1 0xf1 0xf1 0x3b7 0x186 0xf2 0xf2 0xf2 0x3bc 0x189 0xf3 0xf3 0xf3 0x3c1 0x18b 0xf4 0xf4 0xf4 0x3c7 0x18d 0xf5 0xf5 0xf5 0x3cc 0x18f 0xf6 0xf6 0xf6 0x3d1 0x191 0xf7 0xf7 0xf7 0x3d6 0x193 0xf8 0xf8 0xf8 0x3db 0x195 0xf9 0xf9 0xf9 0x3e0 0x197 0xfa 0xfa 0xfa 0x3e5 0x199 0xfb 0xfb 0xfb 0x3ea 0x19b 0xfc 0xfc 0xfc 0x3f0 0x19e 0xfd 0xfd 0xfd 0x3f5 0x1a0 0xfe 0xfe 0xfe 0x3fa 0x1a2 0xff 0xff 0xff 0x3ff 0x1a4>; + samsung,hbm_candela_map_table_revG = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x2 0x1aa 0x2 0x102 0x102 0x4 0x1ac 0x3 0x103 0x103 0x6 0x1ae 0x4 0x104 0x104 0x8 0x1b0 0x5 0x105 0x105 0xa 0x1b1 0x6 0x106 0x106 0xc 0x1b3 0x7 0x107 0x107 0xe 0x1b4 0x8 0x108 0x108 0x10 0x1b6 0x9 0x109 0x109 0x12 0x1b8 0xa 0x10a 0x10a 0x14 0x1b9 0xb 0x10b 0x10b 0x16 0x1bb 0xc 0x10c 0x10c 0x18 0x1bc 0xd 0x10d 0x10d 0x1a 0x1be 0xe 0x10e 0x10e 0x1c 0x1c0 0xf 0x10f 0x10f 0x1e 0x1c2 0x10 0x110 0x110 0x20 0x1c3 0x11 0x111 0x111 0x22 0x1c5 0x12 0x112 0x112 0x24 0x1c6 0x13 0x113 0x113 0x25 0x1c8 0x14 0x114 0x114 0x26 0x1ca 0x15 0x115 0x115 0x27 0x1cb 0x16 0x116 0x116 0x28 0x1cd 0x17 0x117 0x117 0x29 0x1ce 0x18 0x118 0x118 0x2a 0x1d0 0x19 0x119 0x119 0x2b 0x1d2 0x1a 0x11a 0x11a 0x2c 0x1d4 0x1b 0x11b 0x11b 0x2d 0x1d5 0x1c 0x11c 0x11c 0x2e 0x1d7 0x1d 0x11d 0x11d 0x2f 0x1d8 0x1e 0x11e 0x11e 0x30 0x1da 0x1f 0x11f 0x11f 0x31 0x1dc 0x20 0x120 0x120 0x32 0x1dd 0x21 0x121 0x121 0x33 0x1df 0x22 0x122 0x122 0x34 0x1e0 0x23 0x123 0x123 0x35 0x1e2 0x24 0x124 0x124 0x36 0x1e4 0x25 0x125 0x125 0x37 0x1e5 0x26 0x126 0x126 0x38 0x1e7 0x27 0x127 0x127 0x39 0x1e8 0x28 0x128 0x128 0x3a 0x1ea 0x29 0x129 0x129 0x3b 0x1ec 0x2a 0x12a 0x12a 0x3c 0x1ee 0x2b 0x12b 0x12b 0x3d 0x1ef 0x2c 0x12c 0x12c 0x3e 0x1f1 0x2d 0x12d 0x12d 0x3f 0x1f2 0x2e 0x12e 0x12e 0x40 0x1f4 0x2f 0x12f 0x12f 0x41 0x1f6 0x30 0x130 0x130 0x42 0x1f7 0x31 0x131 0x131 0x43 0x1f9 0x32 0x132 0x132 0x44 0x1fa 0x33 0x133 0x133 0x45 0x1fc 0x34 0x134 0x134 0x46 0x1fe 0x35 0x135 0x135 0x47 0x200 0x36 0x136 0x136 0x48 0x201 0x37 0x137 0x137 0x49 0x203 0x38 0x138 0x138 0x4a 0x204 0x39 0x139 0x139 0x4b 0x206 0x3a 0x13a 0x13a 0x4c 0x208 0x3b 0x13b 0x13b 0x4d 0x209 0x3c 0x13c 0x13c 0x4e 0x20b 0x3d 0x13d 0x13d 0x4f 0x20c 0x3e 0x13e 0x13e 0x50 0x20e 0x3f 0x13f 0x13f 0x51 0x210 0x40 0x140 0x140 0x52 0x211 0x41 0x141 0x141 0x53 0x213 0x42 0x142 0x142 0x54 0x215 0x43 0x143 0x143 0x55 0x216 0x44 0x144 0x144 0x56 0x218 0x45 0x145 0x145 0x57 0x21a 0x46 0x146 0x146 0x58 0x21b 0x47 0x147 0x147 0x59 0x21d 0x48 0x148 0x148 0x5a 0x21e 0x49 0x149 0x149 0x5b 0x220 0x4a 0x14a 0x14a 0x5c 0x222 0x4b 0x14b 0x14b 0x5d 0x223 0x4c 0x14c 0x14c 0x5f 0x225 0x4d 0x14d 0x14d 0x61 0x226 0x4e 0x14e 0x14e 0x63 0x228 0x4f 0x14f 0x14f 0x65 0x22a 0x50 0x150 0x150 0x67 0x22b 0x51 0x151 0x151 0x69 0x22d 0x52 0x152 0x152 0x6b 0x22f 0x53 0x153 0x153 0x6d 0x230 0x54 0x154 0x154 0x6f 0x232 0x55 0x155 0x155 0x71 0x234 0x56 0x156 0x156 0x73 0x235 0x57 0x157 0x157 0x75 0x237 0x58 0x158 0x158 0x77 0x238 0x59 0x159 0x159 0x79 0x23a 0x5a 0x15a 0x15a 0x7b 0x23c 0x5b 0x15b 0x15b 0x7d 0x23d 0x5c 0x15c 0x15c 0x7f 0x23f 0x5d 0x15d 0x15d 0x81 0x241 0x5e 0x15e 0x15e 0x83 0x242 0x5f 0x15f 0x15f 0x85 0x244 0x60 0x160 0x160 0x87 0x246 0x61 0x161 0x161 0x89 0x247 0x62 0x162 0x162 0x8b 0x249 0x63 0x163 0x163 0x8d 0x24a 0x64 0x164 0x164 0x8f 0x24c 0x65 0x165 0x165 0x91 0x24e 0x66 0x166 0x166 0x93 0x24f 0x67 0x167 0x167 0x95 0x251 0x68 0x168 0x168 0x97 0x253 0x69 0x169 0x169 0x9a 0x254 0x6a 0x16a 0x16a 0x9d 0x256 0x6b 0x16b 0x16b 0xa0 0x257 0x6c 0x16c 0x16c 0xa3 0x259 0x6d 0x16d 0x16d 0xa6 0x25b 0x6e 0x16e 0x16e 0xa8 0x25c 0x6f 0x16f 0x16f 0xab 0x25e 0x70 0x170 0x170 0xae 0x260 0x71 0x171 0x171 0xb1 0x261 0x72 0x172 0x172 0xb4 0x263 0x73 0x173 0x173 0xb7 0x264 0x74 0x174 0x174 0xba 0x266 0x75 0x175 0x175 0xbd 0x268 0x76 0x176 0x176 0xc0 0x269 0x77 0x177 0x177 0xc3 0x26b 0x78 0x178 0x178 0xc6 0x26d 0x79 0x179 0x179 0xc9 0x26e 0x7a 0x17a 0x17a 0xcc 0x270 0x7b 0x17b 0x17b 0xcf 0x272 0x7c 0x17c 0x17c 0xd2 0x273 0x7d 0x17d 0x17d 0xd5 0x275 0x7e 0x17e 0x17e 0xd8 0x276 0x7f 0x17f 0x17f 0xdb 0x278 0x80 0x180 0x180 0xde 0x27a 0x81 0x181 0x181 0xe1 0x27b 0x82 0x182 0x182 0xe4 0x27d 0x83 0x183 0x183 0xe7 0x27f 0x84 0x184 0x184 0xea 0x280 0x85 0x185 0x185 0xed 0x282 0x86 0x186 0x186 0xf0 0x283 0x87 0x187 0x187 0xf3 0x285 0x88 0x188 0x188 0xf6 0x287 0x89 0x189 0x189 0xf9 0x288 0x8a 0x18a 0x18a 0xfc 0x28a 0x8b 0x18b 0x18b 0xff 0x28c 0x8c 0x18c 0x18c 0x102 0x28d 0x8d 0x18d 0x18d 0x105 0x28f 0x8e 0x18e 0x18e 0x108 0x291 0x8f 0x18f 0x18f 0x10b 0x292 0x90 0x190 0x190 0x10e 0x294 0x91 0x191 0x191 0x111 0x295 0x92 0x192 0x192 0x114 0x297 0x93 0x193 0x193 0x117 0x299 0x94 0x194 0x194 0x11a 0x29a 0x95 0x195 0x195 0x11d 0x29c 0x96 0x196 0x196 0x120 0x29e 0x97 0x197 0x197 0x123 0x29f 0x98 0x198 0x198 0x126 0x2a1 0x99 0x199 0x199 0x129 0x2a3 0x9a 0x19a 0x19a 0x12c 0x2a4 0x9b 0x19b 0x19b 0x12f 0x2a6 0x9c 0x19c 0x19c 0x132 0x2a7 0x9d 0x19d 0x19d 0x135 0x2a9 0x9e 0x19e 0x19e 0x138 0x2ab 0x9f 0x19f 0x19f 0x13b 0x2ac 0xa0 0x1a0 0x1a0 0x13e 0x2ae 0xa1 0x1a1 0x1a1 0x141 0x2af 0xa2 0x1a2 0x1a2 0x144 0x2b1 0xa3 0x1a3 0x1a3 0x147 0x2b3 0xa4 0x1a4 0x1a4 0x14a 0x2b4 0xa5 0x1a5 0x1a5 0x14d 0x2b6 0xa6 0x1a6 0x1a6 0x150 0x2b8 0xa7 0x1a7 0x1a7 0x153 0x2b9 0xa8 0x1a8 0x1a8 0x156 0x2bb 0xa9 0x1a9 0x1a9 0x159 0x2bd 0xaa 0x1aa 0x1aa 0x15c 0x2be 0xab 0x1ab 0x1ab 0x15f 0x2c0 0xac 0x1ac 0x1ac 0x162 0x2c1 0xad 0x1ad 0x1ad 0x165 0x2c3 0xae 0x1ae 0x1ae 0x168 0x2c5 0xaf 0x1af 0x1af 0x16b 0x2c6 0xb0 0x1b0 0x1b0 0x16e 0x2c8 0xb1 0x1b1 0x1b1 0x171 0x2c9 0xb2 0x1b2 0x1b2 0x174 0x2cb 0xb3 0x1b3 0x1b3 0x177 0x2cd 0xb4 0x1b4 0x1b4 0x17a 0x2cf 0xb5 0x1b5 0x1b5 0x17d 0x2d0 0xb6 0x1b6 0x1b6 0x180 0x2d2 0xb7 0x1b7 0x1b7 0x183 0x2d3 0xb8 0x1b8 0x1b8 0x186 0x2d5 0xb9 0x1b9 0x1b9 0x189 0x2d7 0xba 0x1ba 0x1ba 0x18c 0x2d8 0xbb 0x1bb 0x1bb 0x18f 0x2da 0xbc 0x1bc 0x1bc 0x192 0x2db 0xbd 0x1bd 0x1bd 0x195 0x2dd 0xbe 0x1be 0x1be 0x198 0x2df 0xbf 0x1bf 0x1bf 0x19b 0x2e1 0xc0 0x1c0 0x1c0 0x19e 0x2e2 0xc1 0x1c1 0x1c1 0x1a1 0x2e4 0xc2 0x1c2 0x1c2 0x1a4 0x2e5 0xc3 0x1c3 0x1c3 0x1a7 0x2e7 0xc4 0x1c4 0x1c4 0x1aa 0x2e9 0xc5 0x1c5 0x1c5 0x1ad 0x2ea 0xc6 0x1c6 0x1c6 0x1b0 0x2ec 0xc7 0x1c7 0x1c7 0x1b3 0x2ed 0xc8 0x1c8 0x1c8 0x1b6 0x2ef 0xc9 0x1c9 0x1c9 0x1b9 0x2f1 0xca 0x1ca 0x1ca 0x1bc 0x2f2 0xcb 0x1cb 0x1cb 0x1bf 0x2f4 0xcc 0x1cc 0x1cc 0x1c2 0x2f5 0xcd 0x1cd 0x1cd 0x1c5 0x2f7 0xce 0x1ce 0x1ce 0x1c8 0x2f9 0xcf 0x1cf 0x1cf 0x1cb 0x2fb 0xd0 0x1d0 0x1d0 0x1ce 0x2fc 0xd1 0x1d1 0x1d1 0x1d1 0x2fe 0xd2 0x1d2 0x1d2 0x1d4 0x2ff 0xd3 0x1d3 0x1d3 0x1d7 0x301 0xd4 0x1d4 0x1d4 0x1da 0x303 0xd5 0x1d5 0x1d5 0x1dd 0x304 0xd6 0x1d6 0x1d6 0x1e0 0x306 0xd7 0x1d7 0x1d7 0x1e3 0x307 0xd8 0x1d8 0x1d8 0x1e6 0x309 0xd9 0x1d9 0x1d9 0x1e9 0x30b 0xda 0x1da 0x1da 0x1ec 0x30d 0xdb 0x1db 0x1db 0x1ef 0x30e 0xdc 0x1dc 0x1dc 0x1f2 0x310 0xdd 0x1dd 0x1dd 0x1f5 0x311 0xde 0x1de 0x1de 0x1f8 0x313 0xdf 0x1df 0x1df 0x1fb 0x315 0xe0 0x1e0 0x1e0 0x1fe 0x316 0xe1 0x1e1 0x1e1 0x201 0x318 0xe2 0x1e2 0x1e2 0x204 0x319 0xe3 0x1e3 0x1e3 0x207 0x31b 0xe4 0x1e4 0x1e4 0x20a 0x31d 0xe5 0x1e5 0x1e5 0x20d 0x31f 0xe6 0x1e6 0x1e6 0x210 0x320>; + samsung,hbm_candela_map_table_revA = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x3 0x1aa 0x2 0x102 0x102 0x6 0x1ac 0x3 0x103 0x103 0x9 0x1ae 0x4 0x104 0x104 0xc 0x1b0 0x5 0x105 0x105 0xf 0x1b1 0x6 0x106 0x106 0x12 0x1b3 0x7 0x107 0x107 0x15 0x1b4 0x8 0x108 0x108 0x18 0x1b6 0x9 0x109 0x109 0x1b 0x1b8 0xa 0x10a 0x10a 0x1e 0x1b9 0xb 0x10b 0x10b 0x21 0x1bb 0xc 0x10c 0x10c 0x24 0x1bc 0xd 0x10d 0x10d 0x27 0x1be 0xe 0x10e 0x10e 0x2a 0x1c0 0xf 0x10f 0x10f 0x2d 0x1c2 0x10 0x110 0x110 0x30 0x1c3 0x11 0x111 0x111 0x33 0x1c5 0x12 0x112 0x112 0x36 0x1c6 0x13 0x113 0x113 0x39 0x1c8 0x14 0x114 0x114 0x3c 0x1ca 0x15 0x115 0x115 0x3f 0x1cb 0x16 0x116 0x116 0x42 0x1cd 0x17 0x117 0x117 0x45 0x1ce 0x18 0x118 0x118 0x48 0x1d0 0x19 0x119 0x119 0x4b 0x1d2 0x1a 0x11a 0x11a 0x4e 0x1d4 0x1b 0x11b 0x11b 0x51 0x1d5 0x1c 0x11c 0x11c 0x54 0x1d7 0x1d 0x11d 0x11d 0x56 0x1d8 0x1e 0x11e 0x11e 0x58 0x1da 0x1f 0x11f 0x11f 0x5a 0x1dc 0x20 0x120 0x120 0x5c 0x1dd 0x21 0x121 0x121 0x5e 0x1df 0x22 0x122 0x122 0x60 0x1e0 0x23 0x123 0x123 0x62 0x1e2 0x24 0x124 0x124 0x64 0x1e4 0x25 0x125 0x125 0x66 0x1e5 0x26 0x126 0x126 0x68 0x1e7 0x27 0x127 0x127 0x6a 0x1e8 0x28 0x128 0x128 0x6c 0x1ea 0x29 0x129 0x129 0x6e 0x1ec 0x2a 0x12a 0x12a 0x70 0x1ee 0x2b 0x12b 0x12b 0x72 0x1ef 0x2c 0x12c 0x12c 0x74 0x1f1 0x2d 0x12d 0x12d 0x76 0x1f2 0x2e 0x12e 0x12e 0x78 0x1f4 0x2f 0x12f 0x12f 0x7a 0x1f6 0x30 0x130 0x130 0x7c 0x1f7 0x31 0x131 0x131 0x7e 0x1f9 0x32 0x132 0x132 0x80 0x1fa 0x33 0x133 0x133 0x82 0x1fc 0x34 0x134 0x134 0x84 0x1fe 0x35 0x135 0x135 0x86 0x200 0x36 0x136 0x136 0x88 0x201 0x37 0x137 0x137 0x8a 0x203 0x38 0x138 0x138 0x8c 0x204 0x39 0x139 0x139 0x8e 0x206 0x3a 0x13a 0x13a 0x90 0x208 0x3b 0x13b 0x13b 0x92 0x209 0x3c 0x13c 0x13c 0x94 0x20b 0x3d 0x13d 0x13d 0x96 0x20c 0x3e 0x13e 0x13e 0x98 0x20e 0x3f 0x13f 0x13f 0x9a 0x210 0x40 0x140 0x140 0x9c 0x211 0x41 0x141 0x141 0x9e 0x213 0x42 0x142 0x142 0xa0 0x215 0x43 0x143 0x143 0xa2 0x216 0x44 0x144 0x144 0xa4 0x218 0x45 0x145 0x145 0xa6 0x21a 0x46 0x146 0x146 0xa8 0x21b 0x47 0x147 0x147 0xaa 0x21d 0x48 0x148 0x148 0xac 0x21e 0x49 0x149 0x149 0xae 0x220 0x4a 0x14a 0x14a 0xb0 0x222 0x4b 0x14b 0x14b 0xb2 0x223 0x4c 0x14c 0x14c 0xb6 0x225 0x4d 0x14d 0x14d 0xba 0x226 0x4e 0x14e 0x14e 0xbe 0x228 0x4f 0x14f 0x14f 0xc2 0x22a 0x50 0x150 0x150 0xc6 0x22b 0x51 0x151 0x151 0xcb 0x22d 0x52 0x152 0x152 0xd0 0x22f 0x53 0x153 0x153 0xd5 0x230 0x54 0x154 0x154 0xda 0x232 0x55 0x155 0x155 0xdf 0x234 0x56 0x156 0x156 0xe4 0x235 0x57 0x157 0x157 0xe9 0x237 0x58 0x158 0x158 0xee 0x238 0x59 0x159 0x159 0xf3 0x23a 0x5a 0x15a 0x15a 0xf8 0x23c 0x5b 0x15b 0x15b 0xfd 0x23d 0x5c 0x15c 0x15c 0x102 0x23f 0x5d 0x15d 0x15d 0x107 0x241 0x5e 0x15e 0x15e 0x10c 0x242 0x5f 0x15f 0x15f 0x111 0x244 0x60 0x160 0x160 0x116 0x246 0x61 0x161 0x161 0x11b 0x247 0x62 0x162 0x162 0x120 0x249 0x63 0x163 0x163 0x125 0x24a 0x64 0x164 0x164 0x12a 0x24c 0x65 0x165 0x165 0x12f 0x24e 0x66 0x166 0x166 0x134 0x24f 0x67 0x167 0x167 0x139 0x251 0x68 0x168 0x168 0x13e 0x253 0x69 0x169 0x169 0x143 0x254 0x6a 0x16a 0x16a 0x148 0x256 0x6b 0x16b 0x16b 0x14d 0x257 0x6c 0x16c 0x16c 0x152 0x259 0x6d 0x16d 0x16d 0x157 0x25b 0x6e 0x16e 0x16e 0x15c 0x25c 0x6f 0x16f 0x16f 0x161 0x25e 0x70 0x170 0x170 0x166 0x260 0x71 0x171 0x171 0x16b 0x261 0x72 0x172 0x172 0x170 0x263 0x73 0x173 0x173 0x175 0x264 0x74 0x174 0x174 0x17a 0x266 0x75 0x175 0x175 0x17f 0x268 0x76 0x176 0x176 0x184 0x269 0x77 0x177 0x177 0x189 0x26b 0x78 0x178 0x178 0x18e 0x26d 0x79 0x179 0x179 0x193 0x26e 0x7a 0x17a 0x17a 0x198 0x270 0x7b 0x17b 0x17b 0x19d 0x272 0x7c 0x17c 0x17c 0x1a2 0x273 0x7d 0x17d 0x17d 0x1a7 0x275 0x7e 0x17e 0x17e 0x1ac 0x276 0x7f 0x17f 0x17f 0x1b1 0x278 0x80 0x180 0x180 0x1b6 0x27a 0x81 0x181 0x181 0x1bb 0x27b 0x82 0x182 0x182 0x1c0 0x27d 0x83 0x183 0x183 0x1c5 0x27f 0x84 0x184 0x184 0x1ca 0x280 0x85 0x185 0x185 0x1cf 0x282 0x86 0x186 0x186 0x1d4 0x283 0x87 0x187 0x187 0x1d9 0x285 0x88 0x188 0x188 0x1de 0x287 0x89 0x189 0x189 0x1e3 0x288 0x8a 0x18a 0x18a 0x1e8 0x28a 0x8b 0x18b 0x18b 0x1ed 0x28c 0x8c 0x18c 0x18c 0x1f2 0x28d 0x8d 0x18d 0x18d 0x1f7 0x28f 0x8e 0x18e 0x18e 0x1fc 0x291 0x8f 0x18f 0x18f 0x201 0x292 0x90 0x190 0x190 0x206 0x294 0x91 0x191 0x191 0x20b 0x295 0x92 0x192 0x192 0x210 0x297 0x93 0x193 0x193 0x215 0x299 0x94 0x194 0x194 0x21a 0x29a 0x95 0x195 0x195 0x21f 0x29c 0x96 0x196 0x196 0x224 0x29e 0x97 0x197 0x197 0x229 0x29f 0x98 0x198 0x198 0x22e 0x2a1 0x99 0x199 0x199 0x233 0x2a3 0x9a 0x19a 0x19a 0x238 0x2a4 0x9b 0x19b 0x19b 0x23d 0x2a6 0x9c 0x19c 0x19c 0x242 0x2a7 0x9d 0x19d 0x19d 0x247 0x2a9 0x9e 0x19e 0x19e 0x24d 0x2ab 0x9f 0x19f 0x19f 0x253 0x2ac 0xa0 0x1a0 0x1a0 0x259 0x2ae 0xa1 0x1a1 0x1a1 0x25f 0x2af 0xa2 0x1a2 0x1a2 0x265 0x2b1 0xa3 0x1a3 0x1a3 0x26b 0x2b3 0xa4 0x1a4 0x1a4 0x271 0x2b4 0xa5 0x1a5 0x1a5 0x277 0x2b6 0xa6 0x1a6 0x1a6 0x27d 0x2b8 0xa7 0x1a7 0x1a7 0x283 0x2b9 0xa8 0x1a8 0x1a8 0x289 0x2bb 0xa9 0x1a9 0x1a9 0x28f 0x2bd 0xaa 0x1aa 0x1aa 0x295 0x2be 0xab 0x1ab 0x1ab 0x29b 0x2c0 0xac 0x1ac 0x1ac 0x2a1 0x2c1 0xad 0x1ad 0x1ad 0x2a7 0x2c3 0xae 0x1ae 0x1ae 0x2ad 0x2c5 0xaf 0x1af 0x1af 0x2b3 0x2c6 0xb0 0x1b0 0x1b0 0x2b9 0x2c8 0xb1 0x1b1 0x1b1 0x2bf 0x2c9 0xb2 0x1b2 0x1b2 0x2c5 0x2cb 0xb3 0x1b3 0x1b3 0x2cb 0x2cd 0xb4 0x1b4 0x1b4 0x2d1 0x2cf 0xb5 0x1b5 0x1b5 0x2d7 0x2d0 0xb6 0x1b6 0x1b6 0x2dd 0x2d2 0xb7 0x1b7 0x1b7 0x2e3 0x2d3 0xb8 0x1b8 0x1b8 0x2e9 0x2d5 0xb9 0x1b9 0x1b9 0x2ef 0x2d7 0xba 0x1ba 0x1ba 0x2f5 0x2d8 0xbb 0x1bb 0x1bb 0x2fb 0x2da 0xbc 0x1bc 0x1bc 0x301 0x2db 0xbd 0x1bd 0x1bd 0x307 0x2dd 0xbe 0x1be 0x1be 0x30d 0x2df 0xbf 0x1bf 0x1bf 0x313 0x2e1 0xc0 0x1c0 0x1c0 0x319 0x2e2 0xc1 0x1c1 0x1c1 0x31f 0x2e4 0xc2 0x1c2 0x1c2 0x325 0x2e5 0xc3 0x1c3 0x1c3 0x32b 0x2e7 0xc4 0x1c4 0x1c4 0x331 0x2e9 0xc5 0x1c5 0x1c5 0x337 0x2ea 0xc6 0x1c6 0x1c6 0x33d 0x2ec 0xc7 0x1c7 0x1c7 0x343 0x2ed 0xc8 0x1c8 0x1c8 0x349 0x2ef 0xc9 0x1c9 0x1c9 0x34f 0x2f1 0xca 0x1ca 0x1ca 0x355 0x2f2 0xcb 0x1cb 0x1cb 0x35b 0x2f4 0xcc 0x1cc 0x1cc 0x361 0x2f5 0xcd 0x1cd 0x1cd 0x367 0x2f7 0xce 0x1ce 0x1ce 0x36d 0x2f9 0xcf 0x1cf 0x1cf 0x373 0x2fb 0xd0 0x1d0 0x1d0 0x379 0x2fc 0xd1 0x1d1 0x1d1 0x37f 0x2fe 0xd2 0x1d2 0x1d2 0x385 0x2ff 0xd3 0x1d3 0x1d3 0x38b 0x301 0xd4 0x1d4 0x1d4 0x391 0x303 0xd5 0x1d5 0x1d5 0x397 0x304 0xd6 0x1d6 0x1d6 0x39d 0x306 0xd7 0x1d7 0x1d7 0x3a3 0x307 0xd8 0x1d8 0x1d8 0x3a9 0x309 0xd9 0x1d9 0x1d9 0x3af 0x30b 0xda 0x1da 0x1da 0x3b5 0x30d 0xdb 0x1db 0x1db 0x3bb 0x30e 0xdc 0x1dc 0x1dc 0x3c1 0x310 0xdd 0x1dd 0x1dd 0x3c7 0x311 0xde 0x1de 0x1de 0x3cd 0x313 0xdf 0x1df 0x1df 0x3d3 0x315 0xe0 0x1e0 0x1e0 0x3d9 0x316 0xe1 0x1e1 0x1e1 0x3df 0x318 0xe2 0x1e2 0x1e2 0x3e5 0x319 0xe3 0x1e3 0x1e3 0x3eb 0x31b 0xe4 0x1e4 0x1e4 0x3f1 0x31d 0xe5 0x1e5 0x1e5 0x3f7 0x31f 0xe6 0x1e6 0x1e6 0x3ff 0x320>; + samsung,aod_candela_map_table_revA = <0x0 0x0 0xb 0x1b 0x2 0x1 0xc 0x1f 0x1a 0xa 0x2 0x20 0x36 0x19 0x1e 0x3 0x37 0xff 0x18 0x3c>; + samsung,support_dynamic_mipi_clk; + samsung,ffc_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 2e c5 29 00 00 00 00 00 03 c5 36 41 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,ffc_tx_cmds_revC = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 33 43 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,ffc_tx_cmds_revD = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 32 b1 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revA = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53641 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c535a8 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53741>; + samsung,dyn_mipi_clk_ffc_cmds_revC = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53343 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b2 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53435>; + samsung,dyn_mipi_clk_ffc_cmds_revD = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b1 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53222 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c533a0>; + samsung,dynamic_mipi_clk_timing_table = <0x65fbc9c0 0x671db480 0x6422c400>; + samsung,dynamic_mipi_clk_sel_table = <0x1 0x1 0x0 0x0 0x0 0x1 0x2 0x0 0x0 0x2 0x1 0x3 0x0 0x0 0x2 0x1 0x4 0x0 0x0 0x1 0x2 0xb 0x2942 0x29a2 0x0 0x2 0xb 0x29a3 0x29e8 0x1 0x2 0xb 0x29e9 0x2a56 0x0 0x2 0xc 0x25be 0x26d2 0x0 0x2 0xd 0x48a 0x54d 0x0 0x2 0xd 0x54e 0x593 0x1 0x2 0xd 0x594 0x5e9 0x0 0x2 0xe 0x601 0x661 0x0 0x2 0xe 0x662 0x6a7 0x1 0x2 0xe 0x6a8 0x6ca 0x0 0x2 0xf 0x1105 0x116a 0x0 0x2 0x11 0x8bd 0x8e6 0x0 0x2 0x11 0x8e7 0x92c 0x1 0x2 0x11 0x92d 0xa03 0x0 0x2 0x12 0xb79 0xb86 0x1 0x2 0x12 0xb87 0xb98 0x2 0x2 0x12 0xb99 0xc10 0x0 0x3 0x5b 0x0 0xd9 0x0 0x3 0x5b 0xda 0x165 0x1 0x3 0x5b 0x166 0x257 0x0 0x3 0x5c 0x258 0x26a 0x1 0x3 0x5c 0x26b 0x4a7 0x0 0x3 0x5c 0x4a8 0x4af 0x1 0x3 0x5d 0x4b0 0x64f 0x0 0x3 0x5d 0x650 0x6db 0x1 0x3 0x5d 0x6dc 0x79d 0x0 0x3 0x5e 0x79e 0x877 0x0 0x3 0x5e 0x878 0x903 0x1 0x3 0x5e 0x904 0x95f 0x0 0x3 0x5f 0x960 0xa59 0x0 0x3 0x61 0xabe 0xb29 0x0 0x3 0x61 0xb2a 0xbb5 0x1 0x3 0x61 0xbb6 0xd79 0x0 0x3 0x62 0xd7a 0xdac 0x1 0x3 0x62 0xdad 0xdd1 0x2 0x3 0x62 0xdd2 0xed7 0x0 0x3 0x66 0x1392 0x143b 0x0 0x3 0x67 0x143c 0x149f 0x0 0x3 0x68 0x14a0 0x1503 0x0 0x3 0x6b 0x1662 0x16d9 0x0 0x3 0x6c 0x16da 0x16f2 0x2 0x3 0x6c 0x16f3 0x176f 0x0 0x3 0x6d 0x1770 0x1805 0x0 0x3 0x6e 0x1806 0x1808 0x2 0x3 0x6e 0x1809 0x1931 0x0 0x3 0x6f 0x1932 0x1984 0x1 0x3 0x6f 0x1985 0x19c7 0x0 0x3 0x73 0x1f68 0x1f7a 0x1 0x3 0x73 0x1f7b 0x21b7 0x0 0x3 0x73 0x21b8 0x21f1 0x1 0x3 0x74 0x21f2 0x2214 0x2 0x3 0x74 0x2215 0x234f 0x0 0x3 0x76 0x23fa 0x24ba 0x0 0x3 0x76 0x24bb 0x2511 0x1 0x3 0x76 0x2512 0x2546 0x2 0x3 0x76 0x2547 0x25bb 0x0 0x3 0x77 0x25bc 0x25d9 0x2 0x3 0x77 0x25da 0x2629 0x0 0x3 0x78 0x262a 0x268a 0x1 0x3 0x78 0x268b 0x268d 0x0 0x3 0x7a 0x26c0 0x283d 0x0 0x3 0x7a 0x283e 0x2877 0x1 0x3 0x7c 0x8d68 0x8dfd 0x0 0x3 0x80 0x9376 0x9398 0x1 0x3 0x80 0x9399 0x9569 0x0 0x3 0x81 0x956a 0x96e4 0x0 0x3 0x81 0x96e5 0x96f9 0x1 0x3 0x82 0x96fa 0x98c2 0x0 0x3 0x82 0x98c3 0x994e 0x1 0x3 0x82 0x994f 0x9ae1 0x0 0x3 0x83 0x9ae2 0x9b20 0x1 0x3 0x83 0x9b21 0x9d5c 0x0 0x3 0x83 0x9d5d 0x9de8 0x1 0x3 0x83 0x9de9 0xa025 0x0 0x3 0x83 0xa026 0xa0b1 0x1 0x3 0x83 0xa0b2 0xa275 0x0 0x3 0x84 0xa276 0xa30c 0x0 0x3 0x84 0xa30d 0xa398 0x1 0x3 0x84 0xa399 0xa5d4 0x0 0x3 0x84 0xa5d5 0xa660 0x1 0x3 0x84 0xa661 0xa89d 0x0 0x3 0x84 0xa89e 0xa929 0x1 0x3 0x84 0xa92a 0xaa45 0x0 0x3 0x8a 0xd7c8 0xd813 0x0 0x3 0x8a 0xd814 0xd89f 0x1 0x3 0x8a 0xd8a0 0xdadc 0x0 0x3 0x8a 0xdadd 0xdb68 0x1 0x3 0x8a 0xdb69 0xdda3 0x0 0x3 0x9c 0x10384 0x1045d 0x0 0x3 0x9c 0x1045e 0x104e9 0x1 0x3 0x9c 0x104ea 0x10707 0x0 0x3 0xa1 0x10bea 0x10c9a 0x0 0x3 0xa1 0x10c9b 0x10ce1 0x1 0x3 0xa1 0x10ce2 0x10d26 0x2 0x3 0xa1 0x10d27 0x10d47 0x0 0x4 0x33 0x0 0x0 0x0 0x4 0x34 0x0 0x0 0x0 0x4 0x35 0x0 0x0 0x1 0x4 0x36 0x0 0x0 0x0 0x4 0x37 0x0 0x0 0x2 0x4 0x38 0x0 0x0 0x1 0x5 0x3d 0x0 0x0 0x2 0x5 0x3e 0x0 0x0 0x0 0x5 0x47 0x0 0x0 0x2>; + samsung,fd_on_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 40 40 29 01 00 00 78 00 03 f0 a5 a5]; + samsung,fd_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 80 40 29 01 00 00 78 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 91 01 01 29 00 00 00 00 00 02 53 27 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 3c 0d 00 00 00 00 3c 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 38 00 00 00 18 03 38 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 24 a4 29 01 00 00 00 00 02 f7 0f 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revA = <0x29000000 0x3f0 0x5a5a2900 0x0 0x3910101 0x29010000 0x253 0x26290000 0x2 0xf70f2901 0x1100 0x3f0a5a5>; + samsung,lpm_off_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 40 0d 00 00 00 00 40 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 3d 00 00 00 18 03 3d 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 26 e4 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_60nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 24]; + samsung,lpm_30nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 25]; + samsung,lpm_10nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 26]; + samsung,lpm_2nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 27]; + samsung,lpm_brightnes_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 02 53 26 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xe>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + samsung,ub-con-det = <0xffffffff 0x5 0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "irq_check"; + qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; + samsung,esd-irq-gpio1 = <0xffffffff 0xb 0x0>; + phandle = <0xe>; + + qcom,mdss-dsi-display-timings { + + fhd90 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0xf>; + qcom,mdss-dsi-panel-framerate = <0x5a>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x2590>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 1e 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 54 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 03 60 08 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 5a 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + + fhd60 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0x10>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x3dfa>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 1e 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 54 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 5a 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + + qcom,panel-supply-entries { + #address-cells = <0x1>; + #size-cells = <0x0>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vci"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vddi"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1b7740>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x2>; + }; + }; + }; + }; + }; + + fragment@86 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_PBA_BOOTING_FHD"; + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x0>; + qcom,mdss-dsi-bl-max-level = <0x639c>; + qcom,mdss-brightness-max-level = <0x639c>; + qcom,mdss-dsi-interleave-mode = <0x0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x3c>; + qcom,mdss-pan-physical-height-dimension = <0x6a>; + qcom,mdss-dsi-panel-mode-gpio-state = "invalid"; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + samsung,candela_map_table_revA = <0x0 0x0 0x2 0x5 0x1 0x2 0x2 0x6 0x2 0x3 0x3 0x7 0x3 0x4 0x4 0x8 0x4 0x5 0x5 0x9 0x5 0x6 0x6 0xa 0x6 0x7 0x7 0xb 0x7 0x8 0x8 0xc 0x8 0x9 0x9 0xd 0x9 0xa 0xa 0xe 0xa 0xb 0xb 0xf 0xb 0xc 0xc 0x10 0xc 0xd 0xd 0x11 0xd 0xe 0xe 0x13 0xe 0xf 0xf 0x14 0xf 0x10 0x10 0x15 0x10 0x11 0x11 0x16 0x11 0x12 0x12 0x18 0x12 0x13 0x13 0x19 0x13 0x14 0x14 0x1b 0x14 0x15 0x15 0x1d 0x15 0x16 0x16 0x1e 0x16 0x17 0x18 0x20 0x17 0x19 0x1a 0x22 0x18 0x1b 0x1c 0x25 0x19 0x1d 0x1d 0x27 0x1a 0x1e 0x20 0x29 0x1b 0x21 0x22 0x2c 0x1c 0x23 0x24 0x2f 0x1d 0x25 0x26 0x32 0x1e 0x27 0x28 0x35 0x1f 0x29 0x2b 0x38 0x20 0x2c 0x2e 0x3c 0x21 0x2f 0x31 0x40 0x22 0x32 0x34 0x44 0x23 0x35 0x38 0x48 0x24 0x39 0x3b 0x4d 0x25 0x3c 0x3f 0x52 0x26 0x40 0x43 0x57 0x27 0x44 0x47 0x5d 0x28 0x48 0x4c 0x62 0x29 0x4d 0x50 0x69 0x2a 0x51 0x56 0x6f 0x2b 0x57 0x5b 0x77 0x2c 0x5c 0x61 0x7e 0x2d 0x62 0x68 0x86 0x2e 0x69 0x6e 0x8f 0x2f 0x6f 0x76 0x98 0x30 0x77 0x7d 0xa2 0x31 0x7e 0x85 0xac 0x32 0x86 0x8e 0xb7 0x33 0x8f 0x96 0xc3 0x34 0x97 0xa0 0xcf 0x35 0xa1 0xaa 0xdc 0x36 0xab 0xb5 0xea 0x37 0xb6 0xc1 0xf9 0x38 0xc2 0xcd 0x109 0x39 0xce 0xda 0x11a 0x3a 0xdb 0xe6 0x12c 0x3b 0xe7 0xf2 0x13c 0x3c 0xf3 0xfe 0x14d 0x3d 0xff 0xff 0x168>; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xf>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + phandle = <0xf>; + + qcom,mdss-dsi-display-timings { + + fhd@0 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-front-porch = <0xa4>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-v-back-porch = <0x3>; + qcom,mdss-dsi-v-front-porch = <0x9>; + qcom,mdss-dsi-panel-clockrate = <0x35866480>; + qcom,mdss-dsi-panel-phy-timings = <0x1e0808 0x24220808 0x8020400>; + qcom,mdss-dsi-on-command = [39 01 00 00 78 00 02 11 00]; + qcom,mdss-dsi-off-command = <0x5010000 0x24000128 0x5010000 0x78000110>; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + }; + }; + }; + + fragment@87 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_te { + + sde_te_active { + phandle = <0x9>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + + sde_te_suspend { + phandle = <0xc>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + + pmx_sde { + phandle = <0xcc>; + + sde_dsi_active { + phandle = <0xa>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + bias-disable = <0x0>; + }; + }; + + sde_dsi_suspend { + phandle = <0xd>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable = <0x0>; + }; + }; + }; + }; + }; + + fragment@88 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_ub_det { + + sde_ub_det_default { + pins = "gpio5"; + function = "normal"; + input-enable; + power-source = <0x1>; + bias-disable; + phandle = <0xb>; + }; + }; + }; + }; + + fragment@89 { + target = <0xffffffff>; + + __overlay__ { + + qcom,dsi-display@9 { + label = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + qcom,display-type = "primary"; + phandle = <0xcd>; + }; + + qcom,dsi-display@10 { + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,display-type = "primary"; + phandle = <0xce>; + }; + }; + }; + + fragment@90 { + target = <0xffffffff>; + + __overlay__ { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x2dc6c0>; + regulator-boot-on; + }; + }; + + fragment@91 { + target = <0xffffffff>; + + __overlay__ { + + tsp_int { + phandle = <0x64>; + + mux { + pins = "gpio9"; + function = "gpio"; + }; + + config { + pins = "gpio9"; + input-enable; + bias-disable; + }; + }; + }; + }; + + fragment@92 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + synaptics_tcm@20 { + status = "disabled"; + }; + + atmel_mxt_ts@4a { + status = "disabled"; + }; + + touchscreen@20 { + status = "ok"; + compatible = "zinitix,zt_ts_device"; + reg = <0x20>; + pinctrl-names = "on_state", "off_state"; + pinctrl-0 = <0x64>; + pinctrl-1 = <0x64>; + avdd-supply = <0xffffffff>; + zinitix,gpio_ldo_en; + zinitix,irq_type = <0x2008>; + zinitix,x_resolution = <0x438>; + zinitix,y_resolution = <0x960>; + zinitix,page_size = <0x80>; + zinitix,irq_gpio = <0xffffffff 0x9 0x2008>; + zinitix,chip_name = "ZT7650"; + zinitix,select_lcdid = <0x801000 0x801001 0x801002>; + zinitix,firmware_name = "tsp_zinitix/zt7650_a72.bin", "tsp_zinitix/zt7650_a72.bin", "tsp_zinitix/zt7650_a72_3rd.bin"; + zinitix,spay; + zinitix,aod; + zinitix,aot; + zinitix,mis_cal_check; + support_ear_detect_mode; + support_dex_mode; + zinitix,bringup = <0x0>; + zinitix,ss_touch_num = <0x1>; + phandle = <0xcf>; + }; + + touchscreen@49 { + status = "ok"; + compatible = "stm,fts_touch"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x64>; + avdd-supply = <0xffffffff>; + stm,irq_gpio = <0xffffffff 0x9 0x2008>; + stm,max_coords = <0xfff 0xfff>; + stm,firmware_name = "tsp_stm/fts5cu56a_a72.bin"; + stm,tclm_level = <0x2>; + stm,afe_base = <0x7>; + stm,bringup = <0x0>; + stm,support_fod; + stm,enable_settings_aot; + support_ear_detect; + support_mis_calibration_test; + support_dex_mode; + support_open_short_test; + support_sram_test; + stm,ss_touch_num = <0x1>; + phandle = <0xd0>; + }; + }; + }; + + fragment@93 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + + key_vol_up_default { + pins = "gpio8"; + function = "normal"; + input-enable; + bias-pull-up; + power-source = <0x0>; + phandle = <0x65>; + }; + }; + }; + }; + + fragment@94 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "default"; + pinctrl-0 = <0x65>; + + vol_up { + label = "volume_up"; + gpios = <0xffffffff 0x8 0x1>; + linux,input-type = <0x1>; + linux,code = <0x73>; + debounce-interval = <0xf>; + }; + }; + }; + + fragment@95 { + target = <0xffffffff>; + + __overlay__ { + + ss_touch { + compatible = "samsung,ss_touch"; + ss_touch,numbers = <0x1>; + }; + }; + }; + + fragment@96 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x66>; + status = "okay"; + + sm5714@49 { + status = "okay"; + compatible = "siliconmitus,sm5714mfd"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x67>; + sm5714,irq-gpio = <0xffffffff 0x21 0x0>; + sm5714,wakeup; + }; + }; + }; + + fragment@97 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x68>; + status = "okay"; + + usbpd-sm5714@33 { + status = "okay"; + compatible = "sm5714-usbpd"; + reg = <0x33>; + pinctrl-names = "default"; + pinctrl-0 = <0x69>; + usbpd,usbpd_int = <0xffffffff 0x68 0x0>; + support_pd_role_swap; + + pdic-manager { + pdic,max_power = <0x1388>; + pdic_op_power = <0x9c4>; + pdic_max_voltage = <0x1770>; + pdic_max_current = <0x7d0>; + pdic,min_current = <0x1f4>; + pdic,giveback = <0x0>; + pdic,usb_com_capable = <0x1>; + pdic,no_usb_suspend = <0x1>; + source,max_voltage = <0x1388>; + source,min_voltage = <0xfa0>; + source,max_power = <0x9c4>; + }; + }; + }; + }; + + fragment@98 { + target = <0xffffffff>; + + __overlay__ { + + if_pmic_irq { + + if_pmic_irq_default { + phandle = <0x67>; + + mux { + pins = "gpio33"; + function = "gpio"; + }; + + config { + pins = "gpio33"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + + usbpd_irq { + + usbpd_irq_default { + phandle = <0x69>; + + mux { + pins = "gpio104"; + function = "gpio"; + }; + + config { + pins = "gpio104"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + }; + }; + + fragment@99 { + target = <0xffffffff>; + + __overlay__ { + qcom,qusb-phy-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x15 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x47 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + qcom,qusb-phy-host-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x15 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x47 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + }; + }; + + fragment@100 { + target = <0xffffffff>; + + __overlay__ { + + nfc_qupv3_se0_i2c_sleep { + phandle = <0x6a>; + + mux { + pins = "gpio34", "gpio35"; + function = "gpio"; + }; + + config { + pins = "gpio34", "gpio35"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + nfc_clk_req_gpio { + phandle = <0x6b>; + + mux { + pins = "gpio31"; + function = "gpio"; + }; + + config { + pins = "gpio31"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_irq_gpio { + phandle = <0x6c>; + + mux { + pins = "gpio37"; + function = "gpio"; + }; + + config { + pins = "gpio37"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_ven_gpio { + phandle = <0x6d>; + + mux { + pins = "gpio12"; + function = "gpio"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-high; + }; + }; + + nfc_firm_gpio { + phandle = <0x6e>; + + mux { + pins = "gpio36"; + function = "gpio"; + }; + + config { + pins = "gpio36"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + nfc_ldo_en_gpio { + phandle = <0x6f>; + + mux { + pins = "gpio68"; + function = "gpio"; + }; + + config { + pins = "gpio68"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@101 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + pinctrl-1 = <0x6a>; + qcom,clk-freq-out = <0x61a80>; + + sec-nfc@27 { + compatible = "sec-nfc"; + reg = <0x27>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + sec-nfc,ven-gpio = <0xffffffff 0xc 0x0>; + sec-nfc,irq-gpio = <0xffffffff 0x25 0x0>; + sec-nfc,firm-gpio = <0xffffffff 0x24 0x0>; + sec-nfc,clk_req-gpio = <0xffffffff 0x1f 0x0>; + sec-nfc,pvdd-gpio = <0xffffffff 0x44 0x0>; + sec-nfc,clk_req_wake; + sec-nfc,bootloader_ver = <0x6>; + pinctrl-names = "default"; + pinctrl-0 = <0x6b 0x6c 0x6d 0x6e 0x6f>; + }; + }; + }; + + fragment@102 { + target = <0xffffffff>; + + __overlay__ { + + et7xx_rst { + + et7xx_rst { + phandle = <0x70>; + + mux { + pins = "gpio91"; + function = "gpio"; + }; + + config { + pins = "gpio91"; + driver-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@103 { + target = <0xffffffff>; + + __overlay__ { + regulator-name = "VDD_BTP_3P3"; + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + }; + }; + + fragment@104 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + + etspi,et7xx { + compatible = "etspi,et7xx"; + reg = <0x0>; + spi-max-frequency = <0xbebc20>; + pinctrl-names = "default"; + pinctrl-0 = <0x70>; + gpio-controller; + #gpio-cells = <0x2>; + etspi-regulator = "VDD_BTP_3P3"; + etspi-sleepPin = <0xffffffff 0x5b 0x0>; + etspi-chipid = "ET713"; + etspi-modelinfo = "A725"; + etspi-position = "12.03,0.00,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + etspi-rb = "547,-1,-1,FFFFFF"; + }; + }; + }; + + fragment@105 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@106 { + target = <0xffffffff>; + + __overlay__ { + + qcom,flash_0 { + label = "flash"; + qcom,led-name = "led:flash_0"; + qcom,max-current = <0x5dc>; + qcom,default-led-trigger = "flash0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x5dc>; + qcom,duration-ms = <0x500>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + qcom,record-current-ma = <0xe1>; + phandle = <0x71>; + }; + + qcom,torch_0 { + label = "torch"; + qcom,led-name = "led:torch_0"; + qcom,max-current = <0x1f4>; + qcom,default-led-trigger = "torch0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x12c>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + phandle = <0x72>; + }; + + qcom,camera-flash@0 { + cell-index = <0x0>; + compatible = "qcom,camera-flash"; + flash-source = <0x71>; + torch-source = <0x72>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x7b>; + }; + + qcom,camera-flash@1 { + cell-index = <0x1>; + compatible = "qcom,camera-flash"; + flash-source = <0x71>; + torch-source = <0x72>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x97>; + }; + + qcom,cam-res-mgr { + compatible = "qcom,cam-res-mgr"; + shared-gpios = <0x3f>; + pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; + status = "ok"; + pinctrl-0 = <0x73>; + pinctrl-1 = <0x74>; + }; + }; + }; + + fragment@107 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + sm5714-fled { + compatible = "siliconmitus,sm5714-fled"; + reg = <0x49>; + status = "okay"; + slave-addr = <0x92>; + flash-en-gpio = <0xffffffff 0x16 0x0>; + torch-en-gpio = <0xffffffff 0x43 0x0>; + flash-brightness = <0xf>; + preflash-brightness = <0x7>; + torch-brightness = <0x7>; + factory_current = <0x0>; + timeout = <0xff>; + }; + }; + }; + + fragment@108 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + qcom,ois@62 { + compatible = "qcom,ois"; + cell-index = <0x0>; + reg = <0x62>; + slave-addr = <0xc4>; + slave-id = <0x460>; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vaf"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x2ab980>; + rgltr-max-voltage = <0x2ab980>; + rgltr-load-current = <0x30d40>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x76 0x77>; + pinctrl-1 = <0x78 0x79>; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x20 0x0 0xffffffff 0x2b 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x0>; + gpio-custom1 = <0x1>; + gpio-vio = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x0 0x0 0x0>; + gpio-req-tbl-label = "MCU_RESET0", "MCU_BOOT0", "MCU_VIO"; + status = "ok"; + phandle = <0x7d>; + }; + }; + }; + + fragment@109 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@0 { + cell-index = <0x0>; + compatible = "qcom,cam-sensor"; + reg = <0x0>; + slave-addr = <0x34>; + csiphy-sd-index = <0x0>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x7a>; + led-flash-src = <0x7b>; + eeprom-src = <0x7c>; + ois-src = <0x7d>; + cam_vio-supply = <0x7e>; + cam_vaf-supply = <0x75>; + cam_vana-supply = <0x7f>; + cam_vdig-supply = <0x80>; + cam_clk-supply = <0xffffffff>; + cam_bob-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vaf", "cam_vana", "cam_vdig", "cam_clk", "cam_bob"; + rgltr-cntrl-support; + pwm-switch; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x2ab980 0xf4240 0x0 0x325aa0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x2c4020 0x10c8e0 0x0 0x325aa0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x30d40 0x0 0x1e8480>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x81 0x82>; + pinctrl-1 = <0x83 0x84>; + gpios = <0xffffffff 0xd 0x0 0xffffffff 0x1e 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x1>; + gpio-custom1 = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_VANA0"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x41>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0xd1>; + }; + + qcom,cam-sensor@2 { + cell-index = <0x2>; + compatible = "qcom,cam-sensor"; + reg = <0x3>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x85>; + cam_vio-supply = <0x7e>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x86 0x87 0x88 0x89>; + pinctrl-1 = <0x8a 0x8b 0x8c 0x8d>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x2D { + cell-index = <0x2>; + compatible = "qcom,eeprom"; + reg = <0x2d>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7e>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x86 0x87 0x88 0x89>; + pinctrl-1 = <0x8a 0x8b 0x8c 0x8d>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + phandle = <0x85>; + }; + }; + }; + + fragment@110 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@1 { + cell-index = <0x1>; + compatible = "qcom,cam-sensor"; + reg = <0x1>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x8e>; + cam_vio-supply = <0x7e>; + cam_vana-supply = <0x8f>; + cam_vdig-supply = <0x90>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x91 0x92>; + pinctrl-1 = <0x93 0x94>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@8 { + cell-index = <0x8>; + compatible = "qcom,cam-sensor"; + reg = <0x8>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x8e>; + cam_vio-supply = <0x7e>; + cam_vana-supply = <0x8f>; + cam_vdig-supply = <0x90>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x91 0x92>; + pinctrl-1 = <0x93 0x94>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@3 { + cell-index = <0x3>; + compatible = "qcom,cam-sensor"; + reg = <0x2>; + slave-addr = <0x42>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x95>; + eeprom-src = <0x96>; + ois-src = <0x7d>; + led-flash-src = <0x97>; + cam_vio-supply = <0x7e>; + cam_vaf-supply = <0x75>; + cam_vdig-supply = <0x98>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vaf", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x10c8e0 0x0>; + rgltr-max-voltage = <0x1b7740 0x2ab980 0x10c8e0 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x99 0x9a 0x9b>; + pinctrl-1 = <0x9c 0x9d 0x9e>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0xd2>; + }; + + qcom,cam-sensor@4 { + cell-index = <0x4>; + compatible = "qcom,cam-sensor"; + reg = <0x4>; + slave-addr = <0x7e>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + led-flash-src = <0x7b>; + eeprom-src = <0x9f>; + cam_vio-supply = <0x7e>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0xa0 0xa1 0xa2 0x89>; + pinctrl-1 = <0xa3 0xa4 0xa5 0x8d>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x4a 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x3F { + cell-index = <0x4>; + compatible = "qcom,eeprom"; + reg = <0x3f>; + slave-addr = <0x7e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7e>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0xa0 0xa1 0xa2 0x89>; + pinctrl-1 = <0xa3 0xa4 0xa5 0x8d>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x4a 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x9f>; + }; + }; + }; + + fragment@111 { + target = <0xffffffff>; + + __overlay__ { + + qcom,actuator@0xC { + cell-index = <0x0>; + reg = <0xc>; + slave-addr = <0x18>; + compatible = "i2c_actuator"; + rgltr-cntrl-support; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vaf"; + rgltr-min-voltage = <0x2ab980>; + rgltr-max-voltage = <0x2ab980>; + rgltr-load-current = <0x30d40>; + phandle = <0x7a>; + }; + + qcom,actuator2 { + cell-index = <0x2>; + compatible = "qcom,actuator"; + reg = <0x1e>; + slave-addr = <0x1e>; + cam_vio-supply = <0x7e>; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vio", "cam_vaf"; + rgltr-min-voltage = <0x1b7740 0x2ab980>; + rgltr-max-voltage = <0x1b7740 0x2ab980>; + rgltr-load-current = <0x1e8480 0x30d40>; + qcom,cam-power-seq-type = "cam_vio", "cam_vaf"; + qcom,cam-power-seq-cfg-val = <0x1 0x1>; + qcom,cam-power-seq-delay = <0x1 0xc>; + cci-master = <0x1>; + status = "ok"; + phandle = <0x95>; + }; + + qcom,eeprom@50 { + cell-index = <0x0>; + reg = <0x50>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa0>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1 0x1>; + qcom,cam-power-seq-delay = <0x2 0x2>; + cam_vaf-supply = <0x75>; + cam_vio-supply = <0x7e>; + regulator-names = "cam_vaf", "cam_vio"; + rgltr-min-voltage = <0x2ab980 0x1b7740>; + rgltr-max-voltage = <0x2ab980 0x1b7740>; + rgltr-load-current = <0x30d40 0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + phandle = <0x7c>; + }; + + qcom,eeprom@51 { + cell-index = <0x1>; + reg = <0x51>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa2>; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x2>; + cam_vio-supply = <0x7e>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-mode = <0x0>; + sensor-position = <0x1>; + rgltr-cntrl-support; + phandle = <0x8e>; + }; + + qcom,eeprom@55 { + cell-index = <0x3>; + reg = <0x55>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xaa>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1 0x1>; + qcom,cam-power-seq-delay = <0x1 0x1>; + cam_vaf-supply = <0x75>; + cam_vio-supply = <0x7e>; + regulator-names = "cam_vaf", "cam_vio"; + rgltr-min-voltage = <0x2ab980 0x1b7740>; + rgltr-max-voltage = <0x2ab980 0x1b7740>; + rgltr-load-current = <0x30d40 0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + phandle = <0x96>; + }; + }; + }; + + fragment@112 { + target = <0xffffffff>; + + __overlay__ { + + samsung,vibrator { + compatible = "samsung_vib"; + samsung,vib_type = "COINDC"; + status = "ok"; + phandle = <0xd3>; + }; + }; + }; + + fragment@113 { + target = <0xffffffff>; + + __overlay__ { + + hall { + status = "okay"; + compatible = "hall"; + linux,input-type = <0x1>; + linux,code = <0x15>; + hall,gpio_flip_cover = <0xffffffff 0xa 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa6>; + }; + + certify_hall { + status = "okay"; + compatible = "certify_hall"; + linux,input-type = <0x1>; + linux,code = <0x1b>; + certify_hall,gpio_certify_cover = <0xffffffff 0x5d 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa7>; + }; + }; + }; + + fragment@114 { + target = <0xffffffff>; + + __overlay__ { + + hall { + + hall_default { + pins = "gpio10"; + function = "normal"; + output-disable; + input-enable; + bias-disable; + power-source = <0x0>; + phandle = <0xa6>; + }; + }; + }; + }; + + fragment@115 { + target = <0xffffffff>; + + __overlay__ { + + certify_hall_default { + phandle = <0xa7>; + + mux { + pins = "gpio93"; + function = "gpio"; + }; + + config { + pins = "gpio93"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + }; + + fragment@116 { + target = <0xffffffff>; + + __overlay__ { + + rpmh-regulator-ldoc8 { + compatible = "qcom,rpmh-vrm-regulator"; + mboxes = <0xffffffff 0x0>; + qcom,resource-name = "ldoc8"; + qcom,regulator-type = "pmic5-ldo"; + qcom,supported-modes = <0x2 0x4>; + qcom,mode-threshold-currents = <0x0 0x1>; + + regulator-pm6150l-l8 { + regulator-name = "pm6150l_l8"; + qcom,set = <0x3>; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + qcom,init-voltage = <0x1b7740>; + regulator-always-on; + qcom,init-mode = <0x2>; + phandle = <0xd4>; + }; + }; + + rpmh-regulator-ldoa5 { + + regulator-pm6150-l5 { + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + regulator-always-on; + phandle = <0xd5>; + }; + }; + + i2c@17 { + status = "ok"; + cell-index = <0x11>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x33 0x0 0xffffffff 0x34 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0xa8>; + phandle = <0xd6>; + + sx9360-i2c@28 { + compatible = "sx9360"; + reg = <0x28>; + pinctrl-names = "default"; + pinctrl-0 = <0xa9>; + interrupt-parent = <0xffffffff>; + interrupts = <0x4 0xc4 0x0 0x2>; + sx9360,nirq-gpio = <0xffffffff 0x5 0x1>; + sx9360,reggnrlctrl2_reg = <0x32>; + sx9360,againfreq_reg = <0x38>; + sx9360,refagainfreq_reg = <0x36>; + sx9360,gainrawfilt_reg = <0x1a>; + sx9360,refgainrawfilt_reg = <0x22>; + sx9360,proxthresh_reg = <0x22>; + sx9360,hyst_reg = <0x15>; + sx9360,regproxctrl3_reg = <0xc>; + sx9360,resolution_reg = <0xf>; + sx9360,refresolution_reg = <0xf>; + sx9360,hallic_cert_detect = <0x1>; + }; + }; + }; + }; + + fragment@117 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x6 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x22 0x25 0x2a 0x2d 0x2f 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x43 0x44 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5b 0x5e 0x73 0x74 0x76>; + }; + }; + + fragment@118 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@119 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + + sm5440@63 { + status = "okay"; + compatible = "siliconmitus,sm5440"; + reg = <0x63>; + pinctrl-names = "default"; + }; + }; + }; + + fragment@120 { + target = <0xffffffff>; + + __overlay__ { + + bat_thm { + label = "bat_thm"; + reg = <0x4f>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + + chg_thm { + label = "chg_thm"; + reg = <0x4d>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + }; + }; + + fragment@121 { + target = <0xffffffff>; + + __overlay__ { + + sec-direct-charger { + status = "okay"; + compatible = "samsung,sec-direct-charger"; + charger,battery_name = "battery"; + charger,main_charger = "sm5714-charger"; + charger,direct_charger = "sm5440-charger"; + charger,dchg_min_current = <0x7d0>; + charger,dchg_temp_low_threshold = <0xb4>; + charger,dchg_temp_high_threshold = <0x1a4>; + }; + + battery { + pinctrl-names = "default"; + battery,chip_vendor = "QCOM"; + status = "okay"; + compatible = "samsung,sec-battery"; + battery,vendor = "Battery"; + battery,charger_name = "sec-direct-charger"; + battery,fuelgauge_name = "sm5714-fuelgauge"; + battery,fgsrc_switch_name = "sm5714-fuelgauge"; + battery,technology = <0x2>; + battery,batt_data_version = <0x1>; + battery,temp_adc_type = <0x1>; + battery,temp_channel_raw = <0x1>; + battery,adc_check_count = <0x5>; + battery,temp_check_type = <0x1>; + battery,chg_temp_check_type = <0x1>; + battery,thermal_source = <0x2>; + battery,chg_thermal_source = <0x2>; + battery,temp_table_adc = <0x7e4 0x941 0xada 0xcc1 0xef2 0x1188 0x1493 0x1821 0x1c49 0x20dc 0x25dc 0x2b94 0x31b1 0x3854 0x3ef2 0x4588 0x4bdd 0x51ec 0x5781 0x5c85 0x60b2 0x6456 0x675a>; + battery,temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,chg_temp_table_adc = <0x761 0x8c1 0xa5c 0xc35 0xe5d 0x10e2 0x13e6 0x1766 0x1b85 0x200c 0x2503 0x2ab1 0x30cc 0x3774 0x3e15 0x44b0 0x4b25 0x5141 0x56de 0x5bf6 0x6042 0x63fd 0x6711>; + battery,chg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,polling_time = <0xa 0x1e 0x1e 0x1e 0xe10>; + battery,cable_check_type = <0x4>; + battery,cable_source_type = <0x1>; + battery,polling_type = <0x1>; + battery,monitor_initial_count = <0x0>; + battery,battery_check_type = <0x0>; + battery,ovp_uvlo_check_type = <0x3>; + battery,temp_check_count = <0x1>; + battery,overheatlimit_threshold = <0x2bc>; + battery,overheatlimit_recovery = <0x2a8>; + battery,wire_warm_overheat_thresh = <0x1f4>; + battery,wire_normal_warm_thresh = <0x1a4>; + battery,wire_cool1_normal_thresh = <0xb4>; + battery,wire_cool2_cool1_thresh = <0x96>; + battery,wire_cool3_cool2_thresh = <0x32>; + battery,wire_cold_cool3_thresh = <0x0>; + battery,wire_warm_current = <0x6c6>; + battery,wire_cool1_current = <0xa8c>; + battery,wire_cool2_current = <0x485>; + battery,wire_cool3_current = <0x1e5>; + battery,low_temp_topoff = <0xfa>; + battery,high_temp_topoff = <0xfa>; + battery,low_temp_float = <0x111c>; + battery,high_temp_float = <0x1036>; + battery,full_check_type = <0x7>; + battery,full_check_type_2nd = <0x7>; + battery,full_check_count = <0x1>; + battery,chg_gpio_full_check = <0x0>; + battery,chg_high_temp = <0x28a>; + battery,chg_high_temp_recovery = <0x276>; + battery,chg_input_limit_current = <0x3e8>; + battery,chg_charging_limit_current = <0x578>; + battery,wpc_temp_control_source = <0x1>; + battery,wpc_high_temp = <0x17c>; + battery,wpc_high_temp_recovery = <0x168>; + battery,wpc_input_limit_current = <0x258>; + battery,wpc_charging_limit_current = <0x3e8>; + battery,wpc_temp_lcd_on_control_source = <0x1>; + battery,wpc_lcd_on_high_temp = <0x17c>; + battery,wpc_lcd_on_high_temp_rec = <0x168>; + battery,wpc_lcd_on_input_limit_current = <0x1c2>; + battery,wpc_store_high_temp = <0x168>; + battery,wpc_store_high_temp_recovery = <0x154>; + battery,wpc_store_charging_limit_current = <0x190>; + battery,wpc_store_lcd_on_high_temp = <0x168>; + battery,wpc_store_lcd_on_high_temp_rec = <0x12c>; + battery,wpc_store_lcd_on_charging_limit_current = <0x190>; + battery,sleep_mode_limit_current = <0x1f4>; + battery,wc_full_input_limit_current = <0x64>; + battery,mix_high_temp = <0x1cc>; + battery,mix_high_chg_temp = <0x1f4>; + battery,mix_high_temp_recovery = <0x1c2>; + battery,full_condition_type = <0x9>; + battery,full_condition_soc = <0x5d>; + battery,full_condition_vcell = <0x10ea>; + battery,recharge_check_count = <0x1>; + battery,recharge_condition_type = <0x4>; + battery,recharge_condition_soc = <0x62>; + battery,recharge_condition_vcell = <0x10d6>; + battery,charging_total_time = <0x3840>; + battery,hv_charging_total_time = <0x2a30>; + battery,normal_charging_total_time = <0x4650>; + battery,usb_charging_total_time = <0x8ca0>; + battery,recharging_total_time = <0x1518>; + battery,charging_reset_time = <0x0>; + battery,chg_float_voltage = <0x111c>; + battery,pre_afc_work_delay = <0x7d0>; + battery,pre_wc_afc_work_delay = <0xfa0>; + battery,pre_afc_input_current = <0x1f4>; + battery,pre_wc_afc_input_current = <0x1f4>; + battery,prepare_ta_delay = <0x0>; + battery,swelling_high_rechg_voltage = <0xfa0>; + battery,swelling_low_rechg_voltage = <0x1086>; + battery,siop_input_limit_current = <0x4b0>; + battery,siop_charging_limit_current = <0x3e8>; + battery,siop_hv_input_limit_current = <0x2bc>; + battery,siop_hv_input_limit_current_2nd = <0x226>; + battery,siop_hv_charging_limit_current = <0x3e8>; + battery,ttf_hv_charge_current = <0x992>; + battery,ttf_dc25_charge_current = <0xe42>; + battery,rp_current_rp1 = <0x1f4>; + battery,rp_current_rp2 = <0x5dc>; + battery,rp_current_rp3 = <0xbb8>; + battery,rp_current_rdu_rp3 = <0x834>; + battery,rp_current_abnormal_rp3 = <0x708>; + battery,pd_charging_charge_power = <0x3a98>; + battery,max_charging_current = <0xa8c>; + battery,wireless_cc_cv = <0x55>; + battery,wireless_otg_input_current = <0x384>; + battery,age_data = <0x0 0x111c 0x10d6 0x10b8 0x5d 0x12c 0x1108 0x10c2 0x10a4 0x5c 0x190 0x10f4 0x10ae 0x1090 0x5b 0x2bc 0x10e0 0x109a 0x107c 0x5a 0x3e8 0x10ae 0x1068 0x104a 0x59>; + battery,health_condition = <0x384 0x0 0x4b0 0x0 0x5dc 0x0>; + battery,step_charging_type = <0x0>; + battery,step_charging_charge_power = <0x2ee0>; + battery,step_charging_condition = <0x2d 0x64>; + battery,step_charging_condition_curr = <0xa8c 0xa8c>; + battery,step_charging_current = <0xa8c 0xa8c>; + battery,step_charging_float_voltage = <0x1036 0x111c>; + battery,dc_step_chg_type = <0xe9>; + battery,dc_step_chg_charge_power = <0x55f0>; + battery,dc_step_chg_step = <0x3>; + battery,dc_step_chg_cond_vol = <0x1004 0x1086 0x111c>; + battery,dc_step_chg_cond_iin = <0x802 0x79e 0x0>; + battery,dc_step_chg_iin_check_cnt = <0x3>; + battery,dc_step_chg_cond_soc = <0x14 0x3c 0x64>; + battery,dc_step_chg_val_vfloat = <0x1004 0x1086 0x111c>; + battery,dc_step_chg_val_iout = <0x13ec 0x1004 0xf3c>; + battery,standard_curr = <0xf3c>; + battery,expired_time = <0x288c>; + battery,recharging_expired_time = <0x1518>; + battery,battery_full_capacity = <0x1388>; + battery,cisd_max_voltage_thr = <0x1388>; + battery,max_input_voltage = <0x2328>; + battery,max_input_current = <0xbb8>; + battery,cisd_alg_index = <0x8>; + battery,ignore_cisd_index = <0x0 0x3c0>; + battery,ignore_cisd_index_d = <0x0 0x78>; + battery,ttf_capacity = <0x10cc>; + battery,cv_data = <0xa59 0x367 0x546 0xa1a 0x370 0x502 0x960 0x37b 0x4c5 0x8cf 0x384 0x485 0x828 0x38f 0x43a 0x79f 0x398 0x3f1 0x717 0x3a2 0x3b1 0x676 0x3ad 0x33e 0x5e0 0x3b6 0x2e0 0x531 0x3c1 0x263 0x4a2 0x3ca 0x1f8 0x406 0x3df 0xf5 0x387 0x3de 0xb8 0x2f4 0x3e8 0x0>; + io-channels = <0xffffffff 0x4f 0xffffffff 0x4d>; + io-channel-names = "adc-temp", "adc-chg-temp"; + }; + + sm5714-fuelgauge { + status = "okay"; + fuelgauge,fuel_alert_soc = <0x1>; + fuelgauge,capacity_max = <0x3e8>; + fuelgauge,capacity_max_margin = <0x12c>; + fuelgauge,capacity_min = <0x0>; + fuelgauge,capacity_calculation_type = <0x1f>; + fuelgauge,using_temp_compensation; + fuelgauge,low_temp_limit = <0x64>; + fuelgauge,using_hw_vempty; + fuelgauge,sw_v_empty_voltage = <0xc80>; + fuelgauge,sw_v_empty_voltage_cisd = <0xc1c>; + fuelgauge,sw_v_empty_recover_voltage = <0xd98>; + fuelgauge,capacity = <0x1388>; + + battery_params { + battery,id = <0x0>; + battery0,battery_type = <0x114e 0x21b3>; + battery0,battery_table0 = <0x1400 0x1b77 0x1c40 0x1ccb 0x1d31 0x1d6f 0x1d81 0x1d88 0x1da0 0x1de3 0x1e1f 0x1e45 0x1e5e 0x1e7e 0x1ebc 0x1efb 0x1f27 0x1faf 0x2009 0x209b 0x2103 0x218b 0x227c 0x2400>; + battery0,battery_table1 = <0x0 0x99 0x1b3 0x2cc 0x3e6 0x500 0x7b3 0xa80 0xd4c 0x12cc 0x1b19 0x2099 0x2619 0x2b99 0x3133 0x36b3 0x3980 0x3f00 0x4480 0x4ccc 0x524c 0x58e6 0x6400 0x6419>; + battery0,battery_table2 = <0x4b4b 0x4444 0x4040 0x3e3e 0x3c3c 0x3b3b 0x3838 0x3737 0x3535 0x3434 0x3434 0x3333 0x3333 0x3333 0x3333 0x3232>; + battery0,rs_value = <0xa3 0xa3 0x3800 0x200 0x599 0x599 0x100>; + battery0,v_alarm = <0xc1c 0xc8>; + battery0,topoff = <0x2ee>; + battery0,i_cal = <0x0 0x0 0x800 0x800 0x0 0x0 0x800 0x81e>; + battery0,v_cal = <0x1 0x0 0x0 0x1 0x0 0x0 0x0>; + battery0,temp_std = <0x19>; + battery0,tem_poff = <0xd48 0x32 0xcb2 0x32>; + battery0,aux_ctrl = <0x322 0x5800>; + battery0,data_ver = <0x9>; + battery0,v_max_table = <0x227c 0x225f 0x2243 0x2226 0x21d9>; + battery0,q_max_table = <0x21b3 0x210d 0x2068 0x1fc2 0x1e23>; + }; + }; + + cable-info { + default_input_current = <0x708>; + default_charging_current = <0x834>; + full_check_current_1st = <0x2ee>; + full_check_current_2nd = <0xfa>; + + current_group_1 { + cable_number = <0x2 0x13 0x15 0x16 0x17 0x1e>; + input_current = <0x1f4>; + charging_current = <0x1f4>; + }; + + current_group_2 { + cable_number = <0x19 0x1f>; + input_current = <0x3e8>; + charging_current = <0x3e8>; + }; + + current_group_3 { + cable_number = <0x5 0x20>; + input_current = <0x5dc>; + charging_current = <0x5dc>; + }; + + current_group_4 { + cable_number = <0x6 0x7 0x8 0x11 0x12>; + input_current = <0x672>; + charging_current = <0xa8c>; + }; + + current_group_5 { + cable_number = <0x9>; + input_current = <0x672>; + charging_current = <0x960>; + }; + + current_group_6 { + cable_number = <0xa 0xc 0xf 0x1b 0x21 0x24>; + input_current = <0x320>; + charging_current = <0x960>; + }; + + current_group_7 { + cable_number = <0xd>; + input_current = <0x2bc>; + charging_current = <0x960>; + }; + + current_group_8 { + cable_number = <0x18>; + input_current = <0x3e8>; + charging_current = <0x1c2>; + }; + + current_group_9 { + cable_number = <0x23>; + input_current = <0x708>; + charging_current = <0x708>; + }; + + current_group_10 { + cable_number = <0xb 0xe 0x10 0x1c 0x23>; + input_current = <0x28a>; + charging_current = <0x960>; + }; + + current_group_11 { + cable_number = <0x1d 0x25>; + input_current = <0x1f4>; + charging_current = <0x4b0>; + }; + + current_group_12 { + cable_number = <0x1 0x4>; + input_current = <0x1db>; + charging_current = <0x226>; + }; + + current_group_13 { + cable_number = <0x22>; + input_current = <0x4b0>; + charging_current = <0x960>; + }; + }; + }; + }; + + __symbols__ { + dsi_rm69299_visionox_amoled_video = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video"; + dsi_rm69299_visionox_amoled_cmd = "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd"; + dsi_sim_vid = "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video"; + dsi_sim_cmd = "/fragment@3/__overlay__/qcom,mdss_dsi_sim_cmd"; + dsi_sim_dsc_375_cmd = "/fragment@4/__overlay__/qcom,mdss_dsi_sim_dsc_375_cmd"; + dsi_nt36672c_video = "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video"; + dsi_panel_pwr_supply = "/fragment@6/__overlay__/dsi_panel_pwr_supply"; + dsi_panel_pwr_supply_no_labibb = "/fragment@6/__overlay__/dsi_panel_pwr_supply_no_labibb"; + dsi_panel_pwr_supply_labibb_amoled = "/fragment@6/__overlay__/dsi_panel_pwr_supply_labibb_amoled"; + dsi_rm69299_visionox_amoled_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@0"; + dsi_rm69299_visionox_amoled_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@1"; + dsi_sim_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@2"; + dsi_sim_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@3"; + dsi_sim_dsc_375_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@4"; + dsi_nt36672c_video_display = "/fragment@6/__overlay__/qcom,dsi-display@5"; + sde_dsi = "/fragment@6/__overlay__/qcom,dsi-display"; + sde_wb = "/fragment@6/__overlay__/qcom,wb-display@0"; + ext_disp = "/fragment@6/__overlay__/qcom,msm-ext-disp"; + ext_disp_audio_codec = "/fragment@6/__overlay__/qcom,msm-ext-disp/qcom,msm-ext-disp-audio-codec-rx"; + mtp_batterydata = "/fragment@11/__overlay__/qcom,battery-data"; + lpi_tlmm = "/fragment@27/__overlay__/lpi_pinctrl@627C0000"; + cdc_dmic01_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_active"; + cdc_dmic01_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_sleep"; + cdc_dmic01_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_active"; + cdc_dmic01_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_sleep"; + cdc_dmic23_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_active"; + cdc_dmic23_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_sleep"; + cdc_dmic23_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_active"; + cdc_dmic23_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_sleep"; + cdc_dmic45_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_active"; + cdc_dmic45_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_sleep"; + cdc_dmic45_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_active"; + cdc_dmic45_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_sleep"; + tx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_sleep"; + tx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_active"; + tx_swr_data0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_sleep"; + tx_swr_data0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_active"; + wsa_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_sleep"; + wsa_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_active"; + wsa_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_sleep"; + wsa_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_active"; + tx_swr_data1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_sleep"; + tx_swr_data1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_active"; + tx_swr_data2_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_sleep"; + tx_swr_data2_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_active"; + rx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_sleep"; + rx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_active"; + rx_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_sleep"; + rx_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_active"; + lpi_i2s1_sck_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_active"; + lpi_i2s1_sck_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_sleep"; + lpi_i2s1_ws_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_active"; + lpi_i2s1_ws_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_sleep"; + lpi_i2s1_sd0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_active"; + lpi_i2s1_sd0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_sleep"; + lpi_i2s1_sd1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_active"; + lpi_i2s1_sd1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_sleep"; + tx_macro = "/fragment@28/__overlay__/tx-macro@62620000"; + swr2 = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master"; + wcd938x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd938x-tx-slave"; + wcd937x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd937x-tx-slave"; + rx_macro = "/fragment@28/__overlay__/rx-macro@62600000"; + swr1 = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master"; + wcd938x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd938x-rx-slave"; + wcd937x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd937x-rx-slave"; + wsa_macro = "/fragment@28/__overlay__/wsa-macro@62640000"; + swr0 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master"; + wsa881x_0211 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211"; + wsa881x_0212 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212"; + wsa881x_0213 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213"; + wsa881x_0214 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214"; + va_macro = "/fragment@28/__overlay__/va-macro@62770000"; + wcd938x_codec = "/fragment@28/__overlay__/wcd938x-codec"; + wcd937x_codec = "/fragment@28/__overlay__/wcd937x-codec"; + cdc_dmic01_gpios = "/fragment@30/__overlay__/cdc_dmic01_pinctrl"; + cdc_dmic23_gpios = "/fragment@30/__overlay__/cdc_dmic23_pinctrl"; + cdc_dmic45_gpios = "/fragment@30/__overlay__/cdc_dmic45_pinctrl"; + wsa_swr_gpios = "/fragment@30/__overlay__/wsa_swr_clk_data_pinctrl"; + rx_swr_gpios = "/fragment@30/__overlay__/rx_swr_clk_data_pinctrl"; + tx_swr_gpios = "/fragment@30/__overlay__/tx_swr_clk_data_pinctrl"; + wsa_spkr_en1 = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl"; + wsa_spkr_en2 = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl"; + wcd_rst_gpio = "/fragment@31/__overlay__/msm_cdc_pinctrl@58"; + clock_audio_wsa_1 = "/fragment@31/__overlay__/wsa_core_clk"; + clock_audio_wsa_2 = "/fragment@31/__overlay__/wsa_npl_clk"; + clock_audio_rx_1 = "/fragment@31/__overlay__/rx_core_clk"; + clock_audio_rx_2 = "/fragment@31/__overlay__/rx_npl_clk"; + clock_audio_tx_1 = "/fragment@31/__overlay__/tx_core_clk"; + clock_audio_tx_2 = "/fragment@31/__overlay__/tx_npl_clk"; + clock_audio_va_1 = "/fragment@31/__overlay__/va_core_clk"; + clock_audio_va_2 = "/fragment@31/__overlay__/va_npl_clk"; + qupv3_se8_2hsuart = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000"; + qupv3_se8_2hsuart_pins = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins"; + qupv3_se8_2uart_tx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_active"; + qupv3_se8_2uart_rx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_active"; + qupv3_se8_2uart_tx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_sleep"; + qupv3_se8_2uart_rx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_sleep"; + sec_debug_region = "/fragment@37/__overlay__/sec_debug_region@0"; + sec_debug_autocomment = "/fragment@37/__overlay__/sec_debug_autocomment@0"; + sec_debug_rdx_bootdev = "/fragment@37/__overlay__/sec_debug_rdx_bootdev@0"; + kaslr_region = "/fragment@37/__overlay__/kaslr_region@A0001000"; + rkp_region = "/fragment@37/__overlay__/rkp_region@B0200000"; + hdm_region = "/fragment@37/__overlay__/hdm_region@A1000000"; + modem_shared_mem = "/fragment@37/__overlay__/modem_shared_mem_region@B5000000"; + usb_noti = "/fragment@60/__overlay__/usb-notifier"; + camera_mem = "/fragment@65/__overlay__/camera_mem_region"; + imp_list = "/fragment@68/__overlay__/imp_list"; + cdc_quin_mi2s_gpios = "/fragment@69/__overlay__/msm_cdc_pinctrl_quin"; + samsung_q6audio_adaptation = "/fragment@70/__overlay__/samsung,q6audio-adaptation"; + det_zones = "/fragment@70/__overlay__/det_zones"; + i2c_18 = "/fragment@70/__overlay__/i2c@18"; + tas256x = "/fragment@70/__overlay__/i2c@18/tas256x@4c"; + tas25xx_gpio_default = "/fragment@73/__overlay__/tas25xx_gpio_default"; + fm_lna_default = "/fragment@73/__overlay__/fm_lna_default"; + grip_i2c_active = "/fragment@74/__overlay__/grip_i2c/grip_i2c_active"; + grip_i2c_suspend = "/fragment@74/__overlay__/grip_i2c/grip_i2c_suspend"; + s2mpb03_i2c_sda_default = "/fragment@74/__overlay__/s2mpb03_i2c_sda_default"; + s2mpb03_i2c_scl_default = "/fragment@74/__overlay__/s2mpb03_i2c_scl_default"; + cam_sensor_mclk0_active = "/fragment@74/__overlay__/cam_sensor_mclk0_active"; + cam_sensor_mclk0_suspend = "/fragment@74/__overlay__/cam_sensor_mclk0_suspend"; + cam_sensor_mclk1_active = "/fragment@74/__overlay__/cam_sensor_mclk1_active"; + cam_sensor_mclk1_suspend = "/fragment@74/__overlay__/cam_sensor_mclk1_suspend"; + cam_sensor_mclk2_active = "/fragment@74/__overlay__/cam_sensor_mclk2_active"; + cam_sensor_mclk2_suspend = "/fragment@74/__overlay__/cam_sensor_mclk2_suspend"; + cam_sensor_mclk3_active = "/fragment@74/__overlay__/cam_sensor_mclk3_active"; + cam_sensor_mclk3_suspend = "/fragment@74/__overlay__/cam_sensor_mclk3_suspend"; + cam_sensor_mclk4_active = "/fragment@74/__overlay__/cam_sensor_mclk4_active"; + cam_sensor_mclk4_suspend = "/fragment@74/__overlay__/cam_sensor_mclk4_suspend"; + rcam1_sensor_reset_active = "/fragment@74/__overlay__/rcam1_sensor_reset_active"; + rcam1_sensor_reset_suspend = "/fragment@74/__overlay__/rcam1_sensor_reset_suspend"; + front_sensor_reset_active = "/fragment@74/__overlay__/front_sensor_reset_active"; + front_sensor_reset_suspend = "/fragment@74/__overlay__/front_sensor_reset_suspend"; + rcam3_sensor_reset_active = "/fragment@74/__overlay__/rcam3_sensor_reset_active"; + rcam3_sensor_reset_suspend = "/fragment@74/__overlay__/rcam3_sensor_reset_suspend"; + rcam2_sensor_reset_active = "/fragment@74/__overlay__/rcam2_sensor_reset_active"; + rcam2_sensor_reset_suspend = "/fragment@74/__overlay__/rcam2_sensor_reset_suspend"; + rcam4_sensor_reset_active = "/fragment@74/__overlay__/rcam4_sensor_reset_active"; + rcam4_sensor_reset_suspend = "/fragment@74/__overlay__/rcam4_sensor_reset_suspend"; + rcam1_sensor_vana_active = "/fragment@74/__overlay__/rcam1_sensor_vana_active"; + rcam1_sensor_vana_suspend = "/fragment@74/__overlay__/rcam1_sensor_vana_suspend"; + rcam2_sensor_vana_active = "/fragment@74/__overlay__/rcam2_sensor_vana_active"; + rcam2_sensor_vana_suspend = "/fragment@74/__overlay__/rcam2_sensor_vana_suspend"; + rcam3_sensor_vana_active = "/fragment@74/__overlay__/rcam3_sensor_vana_active"; + rcam3_sensor_vana_suspend = "/fragment@74/__overlay__/rcam3_sensor_vana_suspend"; + rcam4_sensor_vana_active = "/fragment@74/__overlay__/rcam4_sensor_vana_active"; + rcam4_sensor_vana_suspend = "/fragment@74/__overlay__/rcam4_sensor_vana_suspend"; + cam_mipi_sel_active = "/fragment@74/__overlay__/cam_mipi_sel_active"; + cam_mipi_sel_suspend = "/fragment@74/__overlay__/cam_mipi_sel_suspend"; + rcam3_sensor_vdig_active = "/fragment@74/__overlay__/rcam3_sensor_vdig_active"; + rcam3_sensor_vdig_suspend = "/fragment@74/__overlay__/rcam3_sensor_vdig_suspend"; + rcam4_sensor_vdig_active = "/fragment@74/__overlay__/rcam4_sensor_vdig_active"; + rcam4_sensor_vdig_suspend = "/fragment@74/__overlay__/rcam4_sensor_vdig_suspend"; + if_pmic_i2c_pins = "/fragment@74/__overlay__/if_pmic_i2c_pins"; + if_pmic_i2c_sleep = "/fragment@74/__overlay__/if_pmic_i2c_pins/if_pmic_i2c_sleep"; + usbpd_i2c_pins = "/fragment@74/__overlay__/usbpd_i2c_pins"; + usbpd_i2c_sleep = "/fragment@74/__overlay__/usbpd_i2c_pins/usbpd_i2c_sleep"; + mcu_reset_active = "/fragment@74/__overlay__/mcu_reset_active"; + mcu_reset_suspend = "/fragment@74/__overlay__/mcu_reset_suspend"; + mcu_clk_active = "/fragment@74/__overlay__/mcu_clk_active"; + mcu_clk_suspend = "/fragment@74/__overlay__/mcu_clk_suspend"; + grip_int_active = "/fragment@75/__overlay__/grip_int_active"; + grip_int_suspend = "/fragment@75/__overlay__/grip_int_suspend"; + i2c2 = "/fragment@80/__overlay__/i2c@2"; + s2mpb03_l1 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo1"; + s2mpb03_l2 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo2"; + s2mpb03_l3 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo3"; + s2mpb03_l4 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo4"; + s2mpb03_l5 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo5"; + s2mpb03_l6 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo6"; + s2mpb03_l7 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo7"; + self_display_FC3_dtsi = "/fragment@84/__overlay__/self_display_FC3_dtsi"; + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD = "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + ss_dsi_panel_PBA_BOOTING_FHD = "/fragment@86/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD"; + sde_te_active = "/fragment@87/__overlay__/pmx_sde_te/sde_te_active"; + sde_te_suspend = "/fragment@87/__overlay__/pmx_sde_te/sde_te_suspend"; + pmx_sde = "/fragment@87/__overlay__/pmx_sde"; + sde_dsi_active = "/fragment@87/__overlay__/pmx_sde/sde_dsi_active"; + sde_dsi_suspend = "/fragment@87/__overlay__/pmx_sde/sde_dsi_suspend"; + sde_ub_det_default = "/fragment@88/__overlay__/pmx_sde_ub_det/sde_ub_det_default"; + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD_display = "/fragment@89/__overlay__/qcom,dsi-display@9"; + ss_dsi_panel_PBA_BOOTING_FHD_display = "/fragment@89/__overlay__/qcom,dsi-display@10"; + tsp_int = "/fragment@91/__overlay__/tsp_int"; + tsp_zt = "/fragment@92/__overlay__/touchscreen@20"; + tsp_stm = "/fragment@92/__overlay__/touchscreen@49"; + key_vol_up_default = "/fragment@93/__overlay__/key_vol_up/key_vol_up_default"; + if_pmic_irq_default = "/fragment@98/__overlay__/if_pmic_irq/if_pmic_irq_default"; + usbpd_irq_default = "/fragment@98/__overlay__/usbpd_irq/usbpd_irq_default"; + nfc_qupv3_se0_i2c_sleep = "/fragment@100/__overlay__/nfc_qupv3_se0_i2c_sleep"; + nfc_clk_req_gpio = "/fragment@100/__overlay__/nfc_clk_req_gpio"; + nfc_irq_gpio = "/fragment@100/__overlay__/nfc_irq_gpio"; + nfc_ven_gpio = "/fragment@100/__overlay__/nfc_ven_gpio"; + nfc_firm_gpio = "/fragment@100/__overlay__/nfc_firm_gpio"; + nfc_ldo_en_gpio = "/fragment@100/__overlay__/nfc_ldo_en_gpio"; + et7xx_rst = "/fragment@102/__overlay__/et7xx_rst/et7xx_rst"; + sm5714_flash0 = "/fragment@106/__overlay__/qcom,flash_0"; + sm5714_torch0 = "/fragment@106/__overlay__/qcom,torch_0"; + led_flash0 = "/fragment@106/__overlay__/qcom,camera-flash@0"; + led_flash1 = "/fragment@106/__overlay__/qcom,camera-flash@1"; + ois_rear = "/fragment@108/__overlay__/qcom,ois@62"; + sensor_rear = "/fragment@109/__overlay__/qcom,cam-sensor@0"; + eeprom2 = "/fragment@109/__overlay__/qcom,eeprom@0x2D"; + sensor_rear_tele = "/fragment@110/__overlay__/qcom,cam-sensor@3"; + eeprom4 = "/fragment@110/__overlay__/qcom,eeprom@0x3F"; + actuator_rear0 = "/fragment@111/__overlay__/qcom,actuator@0xC"; + actuator_rear_tele = "/fragment@111/__overlay__/qcom,actuator2"; + eeprom0 = "/fragment@111/__overlay__/qcom,eeprom@50"; + eeprom1 = "/fragment@111/__overlay__/qcom,eeprom@51"; + eeprom3 = "/fragment@111/__overlay__/qcom,eeprom@55"; + vibrator = "/fragment@112/__overlay__/samsung,vibrator"; + hall_default = "/fragment@114/__overlay__/hall/hall_default"; + certify_hall_default = "/fragment@115/__overlay__/certify_hall_default"; + L8C = "/fragment@116/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150l_l8 = "/fragment@116/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150_l5 = "/fragment@116/__overlay__/rpmh-regulator-ldoa5/regulator-pm6150-l5"; + i2c_17 = "/fragment@116/__overlay__/i2c@17"; + }; + + __fixups__ { + mdss_mdp = "/fragment@0:target:0", "/fragment@1:target:0", "/fragment@2:target:0", "/fragment@3:target:0", "/fragment@4:target:0", "/fragment@5:target:0", "/fragment@8:target:0", "/fragment@10:target:0", "/fragment@85:target:0", "/fragment@86:target:0"; + tlmm = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-te-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-te-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-te-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-te-gpio:0", "/fragment@7/__overlay__:qcom,usbplug-cc-gpio:0", "/fragment@17/__overlay__:cd-gpios:0", "/fragment@24/__overlay__/synaptics_tcm@20:interrupt-parent:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,irq-gpio:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,reset-gpio:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:interrupt-parent:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:reset-gpios:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:irq-gpios:0", "/fragment@25/__overlay__/nq@28:qcom,nq-irq:0", "/fragment@25/__overlay__/nq@28:qcom,nq-ven:0", "/fragment@25/__overlay__/nq@28:qcom,nq-firm:0", "/fragment@25/__overlay__/nq@28:qcom,nq-clkreq:0", "/fragment@25/__overlay__/nq@28:interrupt-parent:0", "/fragment@35:target:0", "/fragment@70/__overlay__/i2c@18:gpios:0", "/fragment@70/__overlay__/i2c@18:gpios:12", "/fragment@70/__overlay__/i2c@18/tas256x@4c:ti,reset-gpio:0", "/fragment@70/__overlay__/i2c@18/tas256x@4c:ti,irq-gpio:0", "/fragment@71/__overlay__:qcom,fm-lna-gpios:0", "/fragment@73:target:0", "/fragment@74:target:0", "/fragment@76:target:0", "/fragment@80/__overlay__/i2c@2:gpios:0", "/fragment@80/__overlay__/i2c@2:gpios:12", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:qcom,platform-reset-gpio:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:qcom,platform-te-gpio:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:samsung,esd-irq-gpio1:0", "/fragment@86/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD:qcom,platform-reset-gpio:0", "/fragment@87:target:0", "/fragment@91:target:0", "/fragment@92/__overlay__/touchscreen@20:zinitix,irq_gpio:0", "/fragment@92/__overlay__/touchscreen@49:stm,irq_gpio:0", "/fragment@96/__overlay__/sm5714@49:sm5714,irq-gpio:0", "/fragment@97/__overlay__/usbpd-sm5714@33:usbpd,usbpd_int:0", "/fragment@98:target:0", "/fragment@100:target:0", "/fragment@101/__overlay__/sec-nfc@27:interrupt-parent:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,ven-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,irq-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,firm-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,clk_req-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,pvdd-gpio:0", "/fragment@102:target:0", "/fragment@104/__overlay__/etspi,et7xx:etspi-sleepPin:0", "/fragment@107/__overlay__/sm5714-fled:flash-en-gpio:0", "/fragment@107/__overlay__/sm5714-fled:torch-en-gpio:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:12", "/fragment@108/__overlay__/qcom,ois@62:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:24", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:36", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:36", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:12", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:24", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:36", "/fragment@113/__overlay__/certify_hall:certify_hall,gpio_certify_cover:0", "/fragment@115:target:0", "/fragment@116/__overlay__/i2c@17:gpios:0", "/fragment@116/__overlay__/i2c@17:gpios:12", "/fragment@117:target:0"; + pm6150l_gpios = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-reset-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-reset-gpio:0", "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-bklight-en-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-en-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-reset-gpio:0", "/fragment@22:target:0", "/fragment@75:target:0", "/fragment@93:target:0", "/fragment@94/__overlay__/vol_up:gpios:0", "/fragment@116/__overlay__/i2c@17/sx9360-i2c@28:sx9360,nirq-gpio:0"; + soc = "/fragment@6:target:0", "/fragment@11:target:0", "/fragment@23:target:0", "/fragment@31:target:0", "/fragment@34:target:0", "/fragment@60:target:0", "/fragment@66:target:0", "/fragment@70:target:0", "/fragment@80:target:0", "/fragment@84:target:0", "/fragment@89:target:0", "/fragment@95:target:0", "/fragment@106:target:0", "/fragment@112:target:0", "/fragment@113:target:0", "/fragment@116:target:0", "/fragment@118:target:0", "/fragment@121:target:0"; + mdss_dsi0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-ctrl:0"; + mdss_dsi_phy0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-phy:0"; + mdss_dsi0_pll = "/fragment@6/__overlay__/qcom,dsi-display:clocks:0", "/fragment@6/__overlay__/qcom,dsi-display:clocks:8", "/fragment@6/__overlay__/qcom,dsi-display:clocks:16", "/fragment@6/__overlay__/qcom,dsi-display:clocks:24", "/fragment@6/__overlay__/qcom,dsi-display:clocks:32", "/fragment@6/__overlay__/qcom,dsi-display:clocks:40", "/fragment@6/__overlay__/qcom,dsi-display:clocks:48", "/fragment@6/__overlay__/qcom,dsi-display:clocks:56", "/fragment@6/__overlay__/qcom,dsi-display:clocks:64", "/fragment@6/__overlay__/qcom,dsi-display:clocks:72"; + L13A = "/fragment@6/__overlay__/qcom,dsi-display:vddio-supply:0"; + L18A = "/fragment@6/__overlay__/qcom,dsi-display:vdda-3p3-supply:0"; + lcdb_ldo_vreg = "/fragment@6/__overlay__/qcom,dsi-display:lab-supply:0"; + lcdb_ncp_vreg = "/fragment@6/__overlay__/qcom,dsi-display:ibb-supply:0"; + pm6150_l18 = "/fragment@6/__overlay__/qcom,dsi-display:vci-supply:0"; + pm6150_l13 = "/fragment@6/__overlay__/qcom,dsi-display:vddi-supply:0"; + sde_dp = "/fragment@7:target:0", "/fragment@8/__overlay__:connectors:8", "/fragment@26:target:0"; + pm6150_pdphy = "/fragment@7/__overlay__:qcom,dp-usbpd-detection:0"; + sde_dp_usbplug_cc_active = "/fragment@7/__overlay__:pinctrl-0:0"; + sde_dp_usbplug_cc_suspend = "/fragment@7/__overlay__:pinctrl-1:0"; + sde_rscc = "/fragment@8/__overlay__:connectors:12"; + thermal_zones = "/fragment@9:target:0", "/fragment@18:target:0"; + pm6150_trip0 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:trip:0"; + pm6150_charger = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:cooling-device:0", "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:cooling-device:0", "/fragment@21:target:0"; + pm6150_trip1 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:trip:0"; + pm6150l_trip0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:trip:0"; + CPU0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:cooling-device:0"; + CPU1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:cooling-device:0"; + CPU2 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:cooling-device:0"; + CPU3 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:cooling-device:0"; + CPU4 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:cooling-device:0"; + CPU5 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:cooling-device:0"; + CPU6 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:cooling-device:0"; + CPU7 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:cooling-device:0"; + pm6150l_trip1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:trip:0"; + bcl_lvl0 = "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:trip:0"; + bcl_lvl1 = "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:trip:0"; + bcl_lvl2 = "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:trip:0"; + soc_trip = "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:trip:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:trip:0"; + pm6150l_vadc = "/fragment@12:target:0", "/fragment@13/__overlay__:io-channels:0", "/fragment@13/__overlay__:io-channels:8", "/fragment@13/__overlay__:io-channels:16", "/fragment@13/__overlay__:io-channels:24", "/fragment@80/__overlay__/sec_thermistor@1:io-channels:0", "/fragment@80/__overlay__/sec_thermistor@2:io-channels:0", "/fragment@83:target:0"; + pm6150l_adc_tm = "/fragment@13:target:0", "/fragment@18/__overlay__/pa-therm1:thermal-sensors:0"; + ufsphy_mem = "/fragment@14:target:0"; + pm6150_l4 = "/fragment@14/__overlay__:vdda-phy-supply:0"; + pm6150l_l3 = "/fragment@14/__overlay__:vdda-pll-supply:0", "/fragment@15/__overlay__:qcom,vddp-ref-clk-supply:0"; + ufshc_mem = "/fragment@15:target:0", "/fragment@64:target:0"; + ufs_phy_gdsc = "/fragment@15/__overlay__:vdd-hba-supply:0"; + pm6150_l19 = "/fragment@15/__overlay__:vcc-supply:0", "/fragment@16/__overlay__:vdd-supply:0"; + pm6150_l12 = "/fragment@15/__overlay__:vccq2-supply:0", "/fragment@16/__overlay__:vdd-io-supply:0"; + sdhc_1 = "/fragment@16:target:0"; + sdc1_clk_on = "/fragment@16/__overlay__:pinctrl-0:0"; + sdc1_cmd_on = "/fragment@16/__overlay__:pinctrl-0:4"; + sdc1_data_on = "/fragment@16/__overlay__:pinctrl-0:8"; + sdc1_rclk_on = "/fragment@16/__overlay__:pinctrl-0:12"; + sdc1_clk_off = "/fragment@16/__overlay__:pinctrl-1:0"; + sdc1_cmd_off = "/fragment@16/__overlay__:pinctrl-1:4"; + sdc1_data_off = "/fragment@16/__overlay__:pinctrl-1:8"; + sdc1_rclk_off = "/fragment@16/__overlay__:pinctrl-1:12"; + sdhc_2 = "/fragment@17:target:0"; + pm6150l_l9 = "/fragment@17/__overlay__:vdd-supply:0"; + pm6150l_l6 = "/fragment@17/__overlay__:vdd-io-supply:0"; + sdc2_clk_on = "/fragment@17/__overlay__:pinctrl-0:0"; + sdc2_cmd_on = "/fragment@17/__overlay__:pinctrl-0:4"; + sdc2_data_on = "/fragment@17/__overlay__:pinctrl-0:8"; + sdc2_cd_on = "/fragment@17/__overlay__:pinctrl-0:12"; + sdc2_clk_off = "/fragment@17/__overlay__:pinctrl-1:0"; + sdc2_cmd_off = "/fragment@17/__overlay__:pinctrl-1:4"; + sdc2_data_off = "/fragment@17/__overlay__:pinctrl-1:8"; + sdc2_cd_off = "/fragment@17/__overlay__:pinctrl-1:12"; + pm6150a_amoled = "/fragment@19:target:0"; + pm6150_qg = "/fragment@20:target:0"; + pm6150_vadc = "/fragment@21/__overlay__:io-channels:0", "/fragment@21/__overlay__:io-channels:8", "/fragment@21/__overlay__:io-channels:16", "/fragment@21/__overlay__:io-channels:24", "/fragment@21/__overlay__:io-channels:32", "/fragment@21/__overlay__:io-channels:40", "/fragment@21/__overlay__:io-channels:48", "/fragment@80/__overlay__/sec_thermistor@0:io-channels:0", "/fragment@82:target:0", "/fragment@120:target:0", "/fragment@121/__overlay__/battery:io-channels:0", "/fragment@121/__overlay__/battery:io-channels:8"; + qusb_phy0 = "/fragment@21/__overlay__:dpdm-supply:0", "/fragment@99:target:0"; + qupv3_se7_i2c = "/fragment@24:target:0", "/fragment@92:target:0", "/fragment@107:target:0"; + ts_active = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-0:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-0:0"; + ts_int_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:0"; + ts_reset_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:4", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:4"; + ts_release = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-2:0"; + pm6150_l10 = "/fragment@24/__overlay__/synaptics_tcm@20:vdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:vdd-supply:0"; + pm6150l_l7 = "/fragment@24/__overlay__/synaptics_tcm@20:avdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:avdd-supply:0", "/fragment@90:target:0", "/fragment@92/__overlay__/touchscreen@20:avdd-supply:0", "/fragment@92/__overlay__/touchscreen@49:avdd-supply:0"; + qupv3_se0_i2c = "/fragment@25:target:0", "/fragment@101:target:0"; + nfc_int_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:0"; + nfc_enable_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:4"; + nfc_clk_req_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:8"; + nfc_int_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:0"; + nfc_enable_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:4"; + nfc_clk_req_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:8"; + fsa4480 = "/fragment@26/__overlay__:qcom,dp-aux-switch:0", "/fragment@72:target:0"; + q6core = "/fragment@27:target:0", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:4", "/fragment@30:target:0", "/fragment@69:target:0", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:4"; + lpass_core_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:0", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:0", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:0"; + lpass_audio_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:8", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:8", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:8", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:8", "/fragment@28/__overlay__/va-macro@62770000:clocks:0"; + bolero = "/fragment@28:target:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214:qcom,bolero-handle:0", "/fragment@29/__overlay__:asoc-codec:4", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:12", "/fragment@68:target:0", "/fragment@71/__overlay__:asoc-codec:4", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:12"; + L10A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-rxtx-supply:0", "/fragment@28/__overlay__/wcd938x-codec:cdc-vddio-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-ldo-rxtx-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vddpx-1-supply:0"; + L15A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-buck-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-buck-supply:0"; + BOB = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_bob-supply:0"; + atoll_snd = "/fragment@29:target:0", "/fragment@71:target:0"; + stub_codec = "/fragment@29/__overlay__:asoc-codec:0", "/fragment@71/__overlay__:asoc-codec:0"; + audio_apr = "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:0", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:0"; + spkr_1_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-0:0"; + spkr_1_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-1:0"; + spkr_2_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-0:0"; + spkr_2_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-1:0"; + wcd_reset_active = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-0:0"; + wcd_reset_sleep = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-1:0"; + va_cdc_dma_0_tx = "/fragment@32:target:0"; + aliases = "/fragment@33:target:0", "/fragment@67:target:0"; + clock_gcc = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:0", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:8", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:16"; + qupv3_1 = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:qcom,wrapper-core:0"; + dcc = "/fragment@36:target:0"; + reserved_memory = "/fragment@37:target:0", "/fragment@65:target:0", "/fragment@105:target:0"; + removed_region = "/fragment@38:target:0"; + pil_modem_mem = "/fragment@39:target:0"; + pil_adsp_mem = "/fragment@40:target:0"; + pil_camera_mem = "/fragment@41:target:0"; + pil_npu_mem = "/fragment@42:target:0"; + pil_video_mem = "/fragment@43:target:0"; + pil_cdsp_mem = "/fragment@44:target:0"; + qseecom_mem = "/fragment@45:target:0"; + qseecom_ta_mem = "/fragment@46:target:0"; + secure_carveout_heap = "/fragment@47:target:0"; + cdsp_sec_mem = "/fragment@48:target:0"; + msm_imem = "/fragment@49:target:0"; + camera = "/fragment@50:target:0"; + cam_vfe0 = "/fragment@51:target:0"; + cam_vfe1 = "/fragment@52:target:0"; + cam_vfe_lite = "/fragment@53:target:0"; + cam_lrme = "/fragment@54:target:0"; + shared_meta = "/fragment@55:target:0"; + android_q_fstab = "/fragment@56:target:0"; + pm8008_8 = "/fragment@57:target:0", "/fragment@78:target:0"; + pm8008_9 = "/fragment@58:target:0", "/fragment@79:target:0"; + usb0 = "/fragment@59:target:0"; + firmware = "/fragment@61:target:0"; + pil_modem = "/fragment@62:target:0"; + modem_smp2p_out = "/fragment@62/__overlay__:qcom,smem-states:0", "/fragment@62/__overlay__:qcom,smem-states:8", "/fragment@62/__overlay__:qcom,smem-states:16"; + icnss = "/fragment@63:target:0"; + pcm0 = "/fragment@71/__overlay__:asoc-platform:0"; + pcm1 = "/fragment@71/__overlay__:asoc-platform:4"; + pcm2 = "/fragment@71/__overlay__:asoc-platform:8"; + voip = "/fragment@71/__overlay__:asoc-platform:12"; + voice = "/fragment@71/__overlay__:asoc-platform:16"; + loopback = "/fragment@71/__overlay__:asoc-platform:20"; + compress = "/fragment@71/__overlay__:asoc-platform:24"; + hostless = "/fragment@71/__overlay__:asoc-platform:28"; + afe = "/fragment@71/__overlay__:asoc-platform:32"; + lsm = "/fragment@71/__overlay__:asoc-platform:36"; + routing = "/fragment@71/__overlay__:asoc-platform:40"; + compr = "/fragment@71/__overlay__:asoc-platform:44"; + pcm_noirq = "/fragment@71/__overlay__:asoc-platform:48"; + spmi_bus = "/fragment@77:target:0", "/fragment@116/__overlay__/i2c@17/sx9360-i2c@28:interrupt-parent:0"; + pm6150_gpios = "/fragment@81:target:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:samsung,ub-con-det:0", "/fragment@88:target:0", "/fragment@113/__overlay__/hall:hall,gpio_flip_cover:0", "/fragment@114:target:0"; + gpio_key = "/fragment@94:target:0"; + qupv3_se4_i2c = "/fragment@96:target:0", "/fragment@119:target:0"; + qupv3_se11_i2c = "/fragment@97:target:0"; + pm6150l_l11 = "/fragment@103:target:0"; + qupv3_se6_spi = "/fragment@104:target:0"; + pm6150l_switch2 = "/fragment@106/__overlay__/qcom,camera-flash@0:switch-source:0", "/fragment@106/__overlay__/qcom,camera-flash@1:switch-source:0"; + qupv3_se10_i2c = "/fragment@108:target:0"; + cam_cci0 = "/fragment@109:target:0"; + titan_top_gdsc = "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:cam_clk-supply:0"; + clock_camcc = "/fragment@109/__overlay__/qcom,cam-sensor@0:clocks:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:clocks:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:clocks:0"; + cam_cci1 = "/fragment@110:target:0"; + qupv3_se9_i2c = "/fragment@111:target:0"; + apps_rsc = "/fragment@116/__overlay__/rpmh-regulator-ldoc8:mboxes:0"; + }; + + __local_fixups__ { + + fragment@0 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@1 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@2 { + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@5 { + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@6 { + + __overlay__ { + + qcom,dsi-display@0 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@1 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@2 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@3 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@4 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@5 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display { + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + qcom,dsi-display-list = <0x0 0x4>; + }; + }; + }; + + fragment@7 { + + __overlay__ { + qcom,ext-disp = <0x0>; + }; + }; + + fragment@8 { + + __overlay__ { + connectors = <0x0 0x4>; + }; + }; + + fragment@20 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@21 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@28 { + + __overlay__ { + + bolero-clk-rsc-mngr { + clocks = <0x0 0x8 0x10 0x18 0x20 0x28 0x30 0x38>; + }; + + tx-macro@62620000 { + clocks = <0x0 0x8>; + qcom,tx-swr-gpios = <0x0>; + }; + + rx-macro@62600000 { + clocks = <0x0 0x8>; + qcom,rx-swr-gpios = <0x0>; + }; + + wsa-macro@62640000 { + clocks = <0x0 0x8>; + qcom,wsa-swr-gpios = <0x0>; + + wsa_swr_master { + + wsa881x@20170211 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@20170212 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170213 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170214 { + qcom,spkr-sd-n-node = <0x0>; + }; + }; + }; + + wcd938x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + mbhc-button-thres = <0x0 0xc 0x18 0x24 0x30 0x3c 0x48 0x54>; + imp-table = <0x0 0x10 0x20 0x30 0x40 0x50 0x60 0x70>; + }; + + wcd937x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + }; + }; + }; + + fragment@29 { + + __overlay__ { + qcom,cdc-dmic01-gpios = <0x0>; + qcom,cdc-dmic23-gpios = <0x0>; + qcom,cdc-dmic45-gpios = <0x0>; + asoc-codec = <0x8>; + qcom,wsa-devs = <0x0 0x4 0x8 0xc>; + qcom,codec-aux-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@30 { + + __overlay__ { + + cdc_dmic01_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic23_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic45_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + wsa_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + rx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + tx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@34 { + + __overlay__ { + + qcom,qup_hsuart@a88000 { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@60 { + + __overlay__ { + + qcom,memshare { + + qcom,client_4 { + memory-region = <0x0>; + }; + }; + + samsung,sec_hdm { + memory-region = <0x0>; + }; + }; + }; + + fragment@66 { + + __overlay__ { + + qcom,ion { + + qcom,ion-heap@30 { + memory-region = <0x0>; + }; + }; + }; + }; + + fragment@69 { + + __overlay__ { + + msm_cdc_pinctrl_quin { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@70 { + + __overlay__ { + + i2c@18 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@71 { + + __overlay__ { + asoc-platform = <0x34>; + qcom,quin-mi2s-gpios = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@80 { + + __overlay__ { + + i2c@2 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@85 { + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD { + ss,self_display = <0x0>; + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@86 { + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@92 { + + __overlay__ { + + touchscreen@20 { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + + touchscreen@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@94 { + + __overlay__ { + pinctrl-0 = <0x0>; + }; + }; + + fragment@96 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sm5714@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@97 { + + __overlay__ { + pinctrl-1 = <0x0>; + + usbpd-sm5714@33 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@101 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sec-nfc@27 { + pinctrl-0 = <0x0 0x4 0x8 0xc 0x10>; + }; + }; + }; + + fragment@104 { + + __overlay__ { + + etspi,et7xx { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@106 { + + __overlay__ { + + qcom,camera-flash@0 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,camera-flash@1 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,cam-res-mgr { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + }; + }; + + fragment@108 { + + __overlay__ { + + qcom,ois@62 { + cam_vaf-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@109 { + + __overlay__ { + + qcom,cam-sensor@0 { + actuator-src = <0x0>; + led-flash-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@2 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x2D { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@110 { + + __overlay__ { + + qcom,cam-sensor@1 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@8 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@3 { + actuator-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + led-flash-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@4 { + led-flash-src = <0x0>; + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x3F { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@111 { + + __overlay__ { + + qcom,actuator@0xC { + cam_vaf-supply = <0x0>; + }; + + qcom,actuator2 { + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + }; + + qcom,eeprom@50 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@51 { + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@55 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + }; + }; + + fragment@113 { + + __overlay__ { + + hall { + pinctrl-0 = <0x0>; + }; + + certify_hall { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@116 { + + __overlay__ { + + i2c@17 { + pinctrl-0 = <0x0>; + + sx9360-i2c@28 { + pinctrl-0 = <0x0>; + }; + }; + }; + }; + }; }; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r02.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r02.dts old mode 100755 new mode 100644 index 00f1678e15ea..cc5a06f957e8 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r02.dts +++ b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r02.dts @@ -1,25 +1,7163 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - /dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a72q-r02.dtsi" -#include "./drivers/atoll-sec-a72q-battery-r02.dtsi" / { model = "Samsung A72Q PROJECT REV01 (board-id,02)"; compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 2>; - dtbo-version = <0>; + qcom,board-id = <0x22 0x2>; + dtbo-version = <0x0>; + + fragment@0 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ video mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x37 0x30>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x38ae2bc0 0x37bc55b0 0x37f8cb38 0x383540b8 0x3871b640>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x3>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@1 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ cmd mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x3da58d80 0x3c9e86e0 0x3ce04888 0x3d220a30 0x3d63cbd8>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x4>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@2 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,mdss-dsi-panel-name = "Simulator video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-mode-switch; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x0 0x0 0x0 0x1 0x0>; + qcom,panel-ack-disabled; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x5>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-video-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,cmd-to-video-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,cmd-to-video-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1 0x2 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-cmd-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,video-to-cmd-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,video-to-cmd-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@3 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-t-clk-post = <0xc>; + qcom,mdss-dsi-t-clk-pre = <0x29>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-ack-disabled; + qcom,ulps-enabled; + phandle = <0x6>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x64>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x64>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x2d0 0x28 0x2d0 0x28 0x2d0 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x1cc>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x2e4>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x21c 0x28 0x21c 0x28 0x21c 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@2 { + qcom,mdss-dsi-panel-width = <0x2d0>; + qcom,mdss-dsi-panel-height = <0x500>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x348>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x564>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x168>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x168 0x28 0x168 0x28 0x168 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + }; + }; + }; + }; + + fragment@4 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_dsc_375_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode DSC 3.75:1 dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,panel-ack-disabled; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,ulps-enabled; + phandle = <0x7>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-pulse-width = <0x10>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x8>; + qcom,mdss-dsi-v-front-porch = <0xa>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-on-command = <0x15010000 0x2ff 0x20150100 0x2 0xfb011501 0x0 0x2000115 0x1000000 0x20155 0x15010000 0x202 0x45150100 0x2 0x5401501 0x0 0x2061915 0x1000000 0x2071e 0x15010000 0x20b 0x73150100 0x2 0xc731501 0x0 0x20eb015 0x1000000 0x20fae 0x15010000 0x211 0xb8150100 0x2 0x13001501 0x0 0x2588015 0x1000000 0x25901 0x15010000 0x25a 0x150100 0x2 0x5b011501 0x0 0x25c8015 0x1000000 0x25d81 0x15010000 0x25e 0x150100 0x2 0x5f011501 0x0 0x2723115 0x1000000 0x26803 0x15010000 0x2ff 0x24150100 0x2 0xfb011501 0x0 0x2001c15 0x1000000 0x2010b 0x15010000 0x202 0xc150100 0x2 0x3011501 0x0 0x2040f15 0x1000000 0x20510 0x15010000 0x206 0x10150100 0x2 0x7101501 0x0 0x2088915 0x1000000 0x2098a 0x15010000 0x20a 0x13150100 0x2 0xb131501 0x0 0x20c1515 0x1000000 0x20d15 0x15010000 0x20e 0x17150100 0x2 0xf171501 0x0 0x2101c15 0x1000000 0x2110b 0x15010000 0x212 0xc150100 0x2 0x13011501 0x0 0x2140f15 0x1000000 0x21510 0x15010000 0x216 0x10150100 0x2 0x17101501 0x0 0x2188915 0x1000000 0x2198a 0x15010000 0x21a 0x13150100 0x2 0x1b131501 0x0 0x21c1515 0x1000000 0x21d15 0x15010000 0x21e 0x17150100 0x2 0x1f171501 0x0 0x2204015 0x1000000 0x22101 0x15010000 0x222 0x150100 0x2 0x23401501 0x0 0x2244015 0x1000000 0x2256d 0x15010000 0x226 0x40150100 0x2 0x27401501 0x0 0x2e00015 0x1000000 0x2dc21 0x15010000 0x2dd 0x22150100 0x2 0xde071501 0x0 0x2df0715 0x1000000 0x2e36d 0x15010000 0x2e1 0x7150100 0x2 0xe2071501 0x0 0x229d815 0x1000000 0x22a2a 0x15010000 0x24b 0x3150100 0x2 0x4c111501 0x0 0x24d1015 0x1000000 0x24e01 0x15010000 0x24f 0x1150100 0x2 0x50101501 0x0 0x2510015 0x1000000 0x25280 0x15010000 0x253 0x150100 0x2 0x56001501 0x0 0x2540715 0x1000000 0x25807 0x15010000 0x255 0x25150100 0x2 0x5b431501 0x0 0x25c0015 0x1000000 0x25f73 0x15010000 0x260 0x73150100 0x2 0x63221501 0x0 0x2640015 0x1000000 0x26708 0x15010000 0x268 0x4150100 0x2 0x72021501 0x0 0x27a8015 0x1000000 0x27b91 0x15010000 0x27c 0xd8150100 0x2 0x7d601501 0x0 0x27f1515 0x1000000 0x27515 0x15010000 0x2b3 0xc0150100 0x2 0xb4001501 0x0 0x2b50015 0x1000000 0x27800 0x15010000 0x279 0x150100 0x2 0x80001501 0x0 0x2830015 0x1000000 0x2930a 0x15010000 0x294 0xa150100 0x2 0x8a001501 0x0 0x29bff15 0x1000000 0x29db0 0x15010000 0x29f 0x63150100 0x2 0x98101501 0x0 0x2ec0015 0x1000000 0x2ff10 0x39010000 0x11c1 0x9200010 0x2000268 0x1bb000a 0x66704c5 0x39010000 0x3c2 0x10f01501 0x0 0x2c00315 0x1000000 0x43b03 0xa0a1501 0x0 0x2350015 0x1000000 0x2e501 0x15010000 0x2bb 0x10150100 0x2 0xfb010501 0x7800 0x2110005 0x1000078 0x22900>; + qcom,mdss-dsi-off-command = [05 01 00 00 78 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x0>; + qcom,mdss-dsi-h-back-porch = <0x0>; + qcom,mdss-dsi-h-pulse-width = <0x0>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x0>; + qcom,mdss-dsi-v-front-porch = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x0>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = <0x15010000 0x2bb 0x10150100 0x2 0xb0030501 0x7800 0x1111501 0x0 0x251ff15 0x1000000 0x25324 0x15010000 0x2ff 0x23150100 0x2 0x8051501 0x0 0x2469015 0x1000000 0x2ff10 0x15010000 0x2ff 0xf0150100 0x2 0x92011501 0x0 0x2ff1015 0x1000000 0x23500 0x5010000 0x28000129>; + qcom,mdss-dsi-off-command = <0x5010000 0x10000128 0x5010000 0x40000110>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x150505 0x201f0505 0x3020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1 0x2 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@5 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,mdss-dsi-panel-name = "nt36672c fhd plus video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x14 0x0 0x14 0x1 0x14>; + qcom,mdss-pan-physical-width-dimension = <0x4a>; + qcom,mdss-pan-physical-height-dimension = <0x83>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-cphy-mode; + qcom,mdss-dsi-t-clk-post = <0x0>; + qcom,mdss-dsi-t-clk-pre = <0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x5a 0x32>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-skip-timing-update; + qcom,dsi-dyn-clk-list = <0x3eb54a94 0x3e726713 0x3e2f838b 0x3deca00a 0x3da9bc89>; + qcom,dsi-dyn-clk-type = "constant-fps-adjust-hfp"; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,platform-bklight-en-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-en-gpio = <0xffffffff 0x4 0x0>; + phandle = <0x8>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-front-porch = <0xca>; + qcom,mdss-dsi-h-back-porch = <0x38>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0xa>; + qcom,mdss-dsi-v-front-porch = <0x50b>; + qcom,mdss-dsi-v-pulse-width = <0xa>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 b0 00 29 01 00 00 00 00 02 c0 00 29 01 00 00 00 00 03 c2 1b a0 29 01 00 00 00 00 02 ff 25 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 18 20 15 01 00 00 00 00 02 ff 2a 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 27 80 15 01 00 00 00 00 02 28 fd 29 01 00 00 00 00 02 ff f0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 5a 00 29 01 00 00 00 00 02 a0 08 29 01 00 00 00 00 02 ff d0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 09 ad 15 01 00 00 00 00 02 ff 10 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 51 ff 15 01 00 00 00 00 02 53 2c 15 01 00 00 00 00 02 ff 23 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 0a 00 15 01 00 00 00 00 02 0b 00 15 01 00 00 00 00 02 0c 00 15 01 00 00 00 00 02 0d 00 15 01 00 00 00 00 02 11 01 15 01 00 00 00 00 02 12 95 15 01 00 00 00 00 02 15 68 15 01 00 00 00 00 02 16 0b 15 01 00 00 00 00 02 6f 00 15 01 00 00 00 00 02 70 00 15 01 00 00 00 00 02 71 00 15 01 00 00 00 00 02 a0 11 15 01 00 00 00 00 02 ff f0 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 d2 52 29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 35 00 05 01 00 00 78 00 02 11 00 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x230909 0x26240909 0x9060204>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@6 { + target = <0xffffffff>; + + __overlay__ { + + dsi_panel_pwr_supply { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xab>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + }; + + qcom,panel-supply-entry@2 { + reg = <0x2>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-post-on-sleep = <0x14>; + }; + }; + + dsi_panel_pwr_supply_no_labibb { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x2>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + }; + + dsi_panel_pwr_supply_labibb_amoled { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x1>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vdda-3p3"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x3390>; + qcom,supply-disable-load = <0x50>; + }; + }; + + qcom,dsi-display@0 { + label = "dsi_rm69299_visionox_amoled_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0"; + qcom,dsi-panel = <0x3>; + qcom,dsi-display-active; + phandle = <0xac>; + }; + + qcom,dsi-display@1 { + label = "dsi_rm69299_visionox_amoled_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x4>; + phandle = <0xad>; + }; + + qcom,dsi-display@2 { + label = "dsi_sim_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x5>; + phandle = <0xae>; + }; + + qcom,dsi-display@3 { + label = "dsi_sim_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x6>; + phandle = <0xaf>; + }; + + qcom,dsi-display@4 { + label = "dsi_sim_dsc_375_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x7>; + phandle = <0xb0>; + }; + + qcom,dsi-display@5 { + label = "dsi_nt36672c_video_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + qcom,dsi-panel = <0x8>; + phandle = <0xb1>; + }; + + qcom,dsi-display { + compatible = "qcom,dsi-display"; + qcom,dsi-ctrl = <0xffffffff>; + qcom,dsi-phy = <0xffffffff>; + clocks = <0xffffffff 0x6 0xffffffff 0x9 0xffffffff 0x3 0xffffffff 0x8 0xffffffff 0xa 0xffffffff 0xd 0xffffffff 0x11 0xffffffff 0x15 0xffffffff 0x16 0xffffffff 0x19>; + clock-names = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + pinctrl-names = "panel_active", "panel_suspend"; + pinctrl-0 = <0x9 0xa 0xb>; + pinctrl-1 = <0xc 0xd 0xb>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,panel-te-source = <0x0>; + vddio-supply = <0xffffffff>; + vdda-3p3-supply = <0xffffffff>; + lab-supply = <0xffffffff>; + ibb-supply = <0xffffffff>; + qcom,dsi-display-list = <0xe 0xf>; + vci-supply = <0xffffffff>; + vddi-supply = <0xffffffff>; + phandle = <0x12>; + }; + + qcom,wb-display@0 { + compatible = "qcom,wb-display"; + cell-index = <0x0>; + label = "wb_display"; + phandle = <0x11>; + }; + + qcom,msm-ext-disp { + compatible = "qcom,msm-ext-disp"; + phandle = <0x10>; + + qcom,msm-ext-disp-audio-codec-rx { + compatible = "qcom,msm-ext-disp-audio-codec-rx"; + phandle = <0x2b>; + }; + }; + }; + }; + + fragment@7 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-usbpd-detection = <0xffffffff>; + qcom,ext-disp = <0x10>; + qcom,usbplug-cc-gpio = <0xffffffff 0x68 0x0>; + pinctrl-name = "mdss_dp_active", "mdss_dp_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + }; + }; + + fragment@8 { + target = <0xffffffff>; + + __overlay__ { + connectors = <0x11 0x12 0xffffffff 0xffffffff>; + }; + }; + + fragment@9 { + target = <0xffffffff>; + + __overlay__ { + + pm6150-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150l-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_cpu0 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl0 { + disable-thermal-zone; + + cooling-maps { + + vbat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + vbat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl1 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl2 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + soc { + disable-thermal-zone; + + cooling-maps { + + soc_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + soc_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + }; + }; + + fragment@10 { + target = <0xffffffff>; + + __overlay__ { + #cooling-cells = <0x2>; + }; + }; + + fragment@11 { + target = <0xffffffff>; + + __overlay__ { + + qcom,battery-data { + qcom,batt-id-range-pct = <0xf>; + phandle = <0x13>; + + qcom,alium_860_89032_0000_3600mAh { + qcom,max-voltage-uv = <0x426030>; + qcom,fg-cc-cv-threshold-uv = <0x423920>; + qcom,fastchg-current-ma = <0x1518>; + qcom,batt-id-kohm = <0x6b>; + qcom,battery-beta = <0x109a>; + qcom,battery-therm-kohm = <0x64>; + qcom,battery-type = "Alium_860_89032_0000_3600mAh_Jun15th2018"; + qcom,qg-batt-profile-ver = <0x64>; + qcom,jeita-fcc-ranges = <0x0 0x32 0x2625a0 0x33 0x190 0x5265c0 0x191 0x1c2 0x2625a0>; + qcom,jeita-fv-ranges = <0x0 0x32 0x40d990 0x33 0x190 0x426030 0x191 0x1c2 0x40d990>; + qcom,step-chg-ranges = <0x36ee80 0x39fbc0 0x5265c0 0x39fbc1 0x419ce0 0x36ee80 0x419ce1 0x426030 0x2625a0>; + qcom,ocv-based-step-chg; + qcom,jeita-soft-thresholds = <0x5314 0x25e3>; + qcom,jeita-hard-thresholds = <0x58cd 0x20b8>; + qcom,jeita-soft-hys-thresholds = <0x4f5e 0x2943>; + qcom,jeita-soft-fcc-ua = <0x2625a0 0x2625a0>; + qcom,jeita-soft-fv-uv = <0x40d990 0x40d990>; + + qcom,fcc1-temp-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xd62 0xdbf 0xdfd 0xe1d 0xe2e>; + }; + + qcom,fcc2-temp-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xdda 0xdf8 0xe02 0xe04 0xdff 0xdff>; + }; + + qcom,pc-temp-v1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa846 0xa903 0xa965 0xa982 0xa987 0xa757 0xa82c 0xa88b 0xa8b2 0xa8bc 0xa671 0xa747 0xa7a8 0xa7d4 0xa7e5 0xa598 0xa65f 0xa6c5 0xa6f2 0xa707 0xa4ca 0xa582 0xa5e5 0xa611 0xa627 0xa3ff 0xa4af 0xa508 0xa531 0xa546 0xa330 0xa3e1 0xa430 0xa452 0xa465 0xa25d 0xa311 0xa35c 0xa377 0xa387 0xa1a0 0xa23e 0xa287 0xa29e 0xa2ad 0xa10a 0xa17a 0xa1b1 0xa1c4 0xa1d2 0xa07e 0xa0e5 0xa0f6 0xa0f5 0xa0fc 0x9fa9 0xa061 0xa067 0xa048 0xa036 0x9e4b 0x9f9a 0x9fd6 0x9fae 0x9f81 0x9cdb 0x9e3d 0x9ee8 0x9ee6 0x9ebf 0x9bed 0x9cd1 0x9d85 0x9dc6 0x9dd7 0x9b4d 0x9bf5 0x9c67 0x9cb4 0x9cf4 0x9ad6 0x9b65 0x9bd6 0x9c18 0x9c4a 0x9a75 0x9af5 0x9b63 0x9baa 0x9bc5 0x9a1f 0x9a9b 0x9ade 0x9b13 0x9b23 0x99c4 0x9a41 0x9a3f 0x9a2d 0x9a41 0x9962 0x99c6 0x998a 0x9943 0x9959 0x98fd 0x992a 0x98b8 0x9892 0x98a0 0x9894 0x9882 0x97f4 0x9800 0x9807 0x982b 0x97c6 0x976f 0x9780 0x9781 0x97cb 0x9713 0x970f 0x970c 0x970c 0x9775 0x9697 0x96b5 0x96a2 0x96a2 0x9724 0x963e 0x965a 0x9642 0x963e 0x96db 0x95fa 0x9603 0x95e9 0x95e1 0x9698 0x95c7 0x95b7 0x9598 0x958b 0x965b 0x959d 0x9571 0x954e 0x953b 0x9627 0x9575 0x9533 0x950c 0x94f4 0x95f8 0x9550 0x94fe 0x94d1 0x94b3 0x95cc 0x952e 0x94cf 0x949b 0x947a 0x95a2 0x9511 0x94a4 0x9465 0x9440 0x9579 0x94f7 0x947f 0x9432 0x9407 0x954f 0x94d6 0x9458 0x93fe 0x93cc 0x9525 0x94b2 0x942f 0x93c6 0x938b 0x94f0 0x9484 0x9402 0x938b 0x9345 0x94a6 0x943e 0x93bf 0x9343 0x92f7 0x944c 0x93da 0x935f 0x92ed 0x92a2 0x93e6 0x936c 0x92f1 0x9288 0x923f 0x936b 0x92f1 0x9276 0x920e 0x91c6 0x92e1 0x926f 0x91f1 0x9188 0x9141 0x9248 0x91ea 0x9165 0x90ff 0x90bc 0x91cf 0x9176 0x9100 0x909b 0x905b 0x9179 0x9129 0x90c1 0x9060 0x9022 0x9159 0x910e 0x90ab 0x904f 0x9011 0x913e 0x90f9 0x909a 0x903f 0x9001 0x911a 0x90de 0x907f 0x9020 0x8fdd 0x90ac 0x9070 0x8ff7 0x8f74 0x8f1a 0x8f68 0x8f1c 0x8e9e 0x8e14 0x8db6 0x8d9d 0x8d55 0x8cd8 0x8c4c 0x8beb 0x8b59 0x8b10 0x8a94 0x8a02 0x899f 0x8849 0x87fb 0x877d 0x86e5 0x867d 0x836c 0x8325 0x82aa 0x8209 0x8197 0x7530 0x7530 0x7530 0x7530 0x7530>; + }; + + qcom,pc-temp-v2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa98d 0xa97e 0xa974 0xa960 0xa92e 0xa910 0xa7fb 0xa83a 0xa854 0xa856 0xa82f 0xa819 0xa6a3 0xa712 0xa747 0xa757 0xa738 0xa728 0xa594 0xa609 0xa64d 0xa665 0xa64a 0xa63c 0xa4c7 0xa51d 0xa566 0xa581 0xa565 0xa558 0xa3f4 0xa43e 0xa489 0xa4a2 0xa484 0xa478 0xa2af 0xa364 0xa3b3 0xa3c8 0xa3a5 0xa397 0xa162 0xa292 0xa2e4 0xa2f3 0xa2ca 0xa2b9 0xa11a 0xa1c1 0xa210 0xa21b 0xa1ef 0xa1de 0xa14f 0xa0ea 0xa131 0xa139 0xa110 0xa103 0xa17a 0xa03c 0xa071 0xa077 0xa047 0xa035 0xa046 0x9fd6 0x9ff5 0x9ff5 0x9fb3 0x9f87 0x9d6d 0x9f7f 0x9f85 0x9f81 0x9f2b 0x9ee2 0x9b88 0x9eab 0x9ea9 0x9ead 0x9e5e 0x9e1a 0x9a81 0x9c78 0x9cde 0x9d1e 0x9d16 0x9d22 0x99b8 0x9a96 0x9b46 0x9bd5 0x9bfe 0x9c3f 0x9913 0x99e8 0x9a78 0x9b4d 0x9b70 0x9b9c 0x9887 0x9977 0x99df 0x9aeb 0x9b04 0x9b0e 0x97f7 0x98f2 0x9948 0x9a53 0x9a64 0x9a58 0x975c 0x9856 0x98b5 0x9965 0x9971 0x9967 0x96c8 0x97b8 0x9827 0x987f 0x9885 0x9883 0x9649 0x9720 0x9799 0x97d3 0x97d8 0x97d6 0x95d8 0x968d 0x9711 0x9743 0x9748 0x9745 0x957d 0x9608 0x9697 0x96c6 0x96cb 0x96c8 0x9533 0x9591 0x9629 0x9658 0x965c 0x9658 0x94f4 0x952a 0x95c3 0x95f3 0x95f6 0x95f1 0x94bc 0x94d6 0x9565 0x9595 0x9598 0x9592 0x948a 0x9491 0x950e 0x953e 0x9540 0x9538 0x9458 0x9459 0x94bd 0x94f0 0x94ef 0x94e6 0x9429 0x942b 0x9471 0x94aa 0x94a5 0x949b 0x93fa 0x9403 0x942c 0x9467 0x9461 0x9456 0x93cb 0x93dc 0x93ed 0x9426 0x9422 0x9418 0x939a 0x93b7 0x93b6 0x93e7 0x93e7 0x93dd 0x9366 0x9390 0x9384 0x93a6 0x93a1 0x9392 0x9330 0x9367 0x935a 0x9364 0x9348 0x932b 0x92f5 0x933c 0x9330 0x9322 0x92ea 0x92bd 0x92b6 0x9309 0x9301 0x92e2 0x9296 0x925d 0x9274 0x92ce 0x92cf 0x92a2 0x9248 0x9208 0x922d 0x9289 0x9294 0x925e 0x91fe 0x91bc 0x91e4 0x9235 0x924a 0x9214 0x91b6 0x9173 0x919a 0x91d4 0x91f2 0x91c0 0x9166 0x9124 0x9151 0x916d 0x918d 0x9158 0x9101 0x90c0 0x910a 0x9104 0x9119 0x90da 0x9085 0x9045 0x90be 0x90a5 0x90a4 0x9064 0x9011 0x8fd4 0x9066 0x9055 0x9058 0x9026 0x8fde 0x8fa3 0x8ff1 0x9009 0x9027 0x900b 0x8fc1 0x8f87 0x8fa0 0x8fd7 0x9010 0x8ff6 0x8fb0 0x8f76 0x8f3a 0x8f9b 0x8ff2 0x8fd7 0x8f94 0x8f5b 0x8e9d 0x8f3c 0x8fa7 0x8f84 0x8f3f 0x8efc 0x8dbc 0x8e73 0x8ecd 0x8e86 0x8e46 0x8df2 0x8c72 0x8d0b 0x8d41 0x8ce7 0x8ca5 0x8c4f 0x8a95 0x8b0d 0x8b2a 0x8ad3 0x8a9a 0x8a45 0x87f8 0x8865 0x887d 0x881c 0x87ec 0x879d 0x841a 0x8496 0x84d3 0x8488 0x847e 0x8426 0x7eca 0x7f24 0x801b 0x8028 0x7f97 0x7ef0 0x6fcb 0x6e6e 0x6d71 0x6d74 0x6d50 0x6d1a>; + }; + + qcom,pc-temp-z1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x38d1 0x33b6 0x2f09 0x2da0 0x2d49 0x38bb 0x337f 0x2f0d 0x2d9e 0x2d52 0x38c3 0x3376 0x2f0b 0x2da5 0x2d5c 0x38c7 0x337e 0x2f07 0x2da7 0x2d60 0x38d3 0x3382 0x2f03 0x2da8 0x2d62 0x38eb 0x337d 0x2f01 0x2da8 0x2d64 0x38ff 0x336c 0x2f02 0x2da9 0x2d67 0x38f6 0x335e 0x2f03 0x2dac 0x2d6a 0x38d7 0x335d 0x2f05 0x2dae 0x2d6d 0x38b6 0x3362 0x2f09 0x2db1 0x2d6f 0x3896 0x3360 0x2f0d 0x2db5 0x2d72 0x3874 0x334e 0x2f0f 0x2db8 0x2d77 0x3843 0x333c 0x2f0f 0x2dbb 0x2d7b 0x3810 0x332e 0x2f0b 0x2dbb 0x2d7c 0x37ee 0x3328 0x2f04 0x2db9 0x2d7c 0x37d3 0x3329 0x2f01 0x2db7 0x2d7c 0x37b6 0x3329 0x2f04 0x2dbb 0x2d7f 0x3792 0x332c 0x2f0a 0x2dc2 0x2d85 0x3772 0x3337 0x2f14 0x2dc9 0x2d8b 0x3765 0x3349 0x2f21 0x2dce 0x2d8f 0x3763 0x335e 0x2f2c 0x2dd3 0x2d93 0x376a 0x3374 0x2f35 0x2dd8 0x2d98 0x3773 0x3384 0x2f3d 0x2ddd 0x2d9c 0x377f 0x338b 0x2f45 0x2de1 0x2da1 0x3787 0x3391 0x2f4d 0x2de7 0x2da6 0x378c 0x339a 0x2f54 0x2dec 0x2daa 0x378f 0x33a6 0x2f5b 0x2df0 0x2daf 0x3794 0x33ad 0x2f62 0x2df4 0x2db3 0x379f 0x33b2 0x2f69 0x2df8 0x2db7 0x37af 0x33ba 0x2f6f 0x2dfc 0x2dbb 0x37c7 0x33c2 0x2f75 0x2e00 0x2dbf 0x37de 0x33c9 0x2f7a 0x2e04 0x2dc4 0x37e6 0x33d1 0x2f80 0x2e08 0x2dc8 0x37ea 0x33de 0x2f86 0x2e0d 0x2dcd 0x37f0 0x33f1 0x2f8e 0x2e12 0x2dd1 0x3807 0x3403 0x2f95 0x2e17 0x2dd5 0x383b 0x3415 0x2f9d 0x2e1a 0x2dd8 0x386b 0x3422 0x2fa5 0x2e1c 0x2dda 0x3891 0x3427 0x2faa 0x2e1f 0x2ddc 0x38b0 0x3429 0x2fad 0x2e21 0x2ddd 0x38b2 0x342d 0x2fb1 0x2e23 0x2dde 0x3888 0x3439 0x2fb9 0x2e25 0x2de0 0x3873 0x3448 0x2fbf 0x2e27 0x2de1 0x386e 0x3457 0x2fc0 0x2e28 0x2de2 0x3861 0x3449 0x2fc4 0x2e29 0x2de2 0x386f 0x3454 0x2fc7 0x2e2b 0x2de2 0x3869 0x3454 0x2fc8 0x2e2b 0x2de1 0x3868 0x345b 0x2fc9 0x2e2b 0x2de2 0x385f 0x3457 0x2fcf 0x2e2c 0x2de3 0x387c 0x3452 0x2fd1 0x2e30 0x2de6 0x3886 0x346f 0x2fdb 0x2e36 0x2deb 0x38aa 0x3476 0x2ff3 0x2e3f 0x2df0 0x3895 0x349e 0x3007 0x2e4a 0x2dfa 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06>; + }; + + qcom,pc-temp-z2-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2bb8 0x2632 0x2811 0x296b 0x2a9e 0x280d 0x2a3d 0x2824 0x28fa 0x293e 0x25fe 0x2926 0x282f 0x28bc 0x28c4 0x2606 0x274d 0x282a 0x28ad 0x28ac 0x2620 0x26d2 0x281d 0x2898 0x28a6 0x262f 0x26c3 0x2815 0x288c 0x28a4 0x2631 0x26b5 0x2811 0x2887 0x28a8 0x262c 0x26aa 0x2812 0x2882 0x28ac 0x2625 0x26a2 0x2816 0x2880 0x28ac 0x261b 0x269c 0x2819 0x2884 0x28b5 0x2612 0x2698 0x2813 0x2887 0x28cc 0x2616 0x2696 0x27f3 0x288e 0x28d4 0x2626 0x2699 0x27d7 0x28ae 0x28d3 0x262c 0x26a7 0x27e8 0x28bd 0x28d4 0x2618 0x26b3 0x2814 0x289f 0x28d2 0x25f5 0x26b6 0x282a 0x2883 0x28c7 0x25e5 0x26ba 0x2827 0x288f 0x28d1 0x25e1 0x26c3 0x281d 0x28b2 0x290a 0x25dd 0x26dd 0x2837 0x28e1 0x2937 0x25d6 0x26fd 0x2894 0x2931 0x293f 0x25c9 0x271e 0x28ce 0x296a 0x293f 0x25be 0x2742 0x28b3 0x2939 0x2923 0x25b7 0x2760 0x2883 0x28bd 0x28ee 0x25b1 0x2775 0x2863 0x288b 0x28cc 0x259f 0x2784 0x284c 0x289e 0x28b4 0x2574 0x278c 0x283f 0x28b6 0x28a5 0x2552 0x2793 0x283c 0x28a9 0x28a6 0x2544 0x2797 0x283d 0x2890 0x28af 0x250b 0x2796 0x2845 0x2888 0x28ba 0x24d2 0x2793 0x2859 0x2888 0x28cd 0x24c0 0x2792 0x286f 0x288c 0x28e8 0x24b3 0x2793 0x2885 0x289f 0x290a 0x24aa 0x2795 0x289c 0x28c5 0x2934 0x24a2 0x2799 0x28b4 0x28ea 0x2962 0x249c 0x27a2 0x28ce 0x290a 0x299b 0x2498 0x27aa 0x28df 0x2925 0x29c7 0x249e 0x27b2 0x28e4 0x293c 0x29d8 0x24a4 0x27b7 0x28e7 0x2954 0x29e2 0x24ad 0x27bb 0x28ef 0x2961 0x29ed 0x24b6 0x27c0 0x28fb 0x2964 0x29f9 0x24b5 0x27c2 0x2901 0x2965 0x2a01 0x24a8 0x27b9 0x28fa 0x2971 0x2a03 0x24a4 0x279c 0x28f3 0x2981 0x2a07 0x24aa 0x26ec 0x28f1 0x2987 0x2a1d 0x246c 0x26c6 0x28d6 0x2992 0x2a3b 0x2459 0x26cc 0x28c6 0x29ad 0x2a38 0x2447 0x26dc 0x28df 0x29c9 0x2a6a 0x2449 0x26cd 0x293d 0x29ca 0x2a89 0x243a 0x26ed 0x297e 0x2a06 0x2aa5 0x243e 0x26c3 0x2925 0x29d7 0x2a55 0x2464 0x269c 0x28de 0x298a 0x29c5 0x246e 0x264f 0x28b9 0x2971 0x29af 0x2445 0x25fc 0x289b 0x2927 0x295f 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904>; + }; + + qcom,pc-temp-z3-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4c45 0x4be7 0x4bad 0x4bb7 0x4b9b 0x4d48 0x4c26 0x4bd0 0x4baa 0x4b96 0x4dd0 0x4c76 0x4bee 0x4bac 0x4b97 0x4de1 0x4cc3 0x4bfa 0x4bb4 0x4b9c 0x4dce 0x4cd9 0x4bff 0x4bb6 0x4b9f 0x4db7 0x4cdc 0x4c00 0x4bb7 0x4ba2 0x4dac 0x4cdd 0x4bfe 0x4bb5 0x4ba2 0x4da7 0x4cdd 0x4bfb 0x4bb0 0x4b9f 0x4da5 0x4ce0 0x4bf8 0x4bac 0x4b9b 0x4da2 0x4ce2 0x4bf6 0x4bac 0x4b99 0x4da0 0x4cd4 0x4bf0 0x4bac 0x4b98 0x4da5 0x4cac 0x4bdf 0x4ba7 0x4b98 0x4db6 0x4c9a 0x4bc8 0x4b9b 0x4b95 0x4dc5 0x4cb6 0x4bce 0x4b96 0x4b91 0x4db4 0x4cd7 0x4bef 0x4ba3 0x4b93 0x4d83 0x4cd1 0x4c01 0x4bb3 0x4b97 0x4d54 0x4cac 0x4bec 0x4bad 0x4b94 0x4d30 0x4c8a 0x4bd0 0x4b9c 0x4b8a 0x4d0e 0x4c6f 0x4bcf 0x4b98 0x4b87 0x4cf1 0x4c5e 0x4be1 0x4ba6 0x4b8e 0x4cd8 0x4c62 0x4bee 0x4bb3 0x4b97 0x4cc6 0x4c75 0x4bef 0x4bb3 0x4b9d 0x4cbc 0x4c87 0x4bef 0x4bae 0x4ba1 0x4cb4 0x4c93 0x4bed 0x4bad 0x4ba2 0x4cac 0x4c9c 0x4bea 0x4bb4 0x4ba0 0x4ca3 0x4c9d 0x4be9 0x4bba 0x4b9e 0x4c97 0x4c9b 0x4bef 0x4bb7 0x4b9c 0x4c8c 0x4c97 0x4bf5 0x4bb2 0x4b9a 0x4c7f 0x4c91 0x4bf6 0x4bae 0x4b98 0x4c6f 0x4c8a 0x4bf4 0x4ba9 0x4b96 0x4c5d 0x4c84 0x4bf2 0x4ba5 0x4b94 0x4c4a 0x4c7f 0x4bef 0x4ba2 0x4b91 0x4c3a 0x4c7a 0x4bea 0x4ba0 0x4b8e 0x4c2b 0x4c73 0x4be7 0x4b9f 0x4b8a 0x4c1e 0x4c6b 0x4be5 0x4b9e 0x4b86 0x4c17 0x4c65 0x4be2 0x4b9e 0x4b84 0x4c1b 0x4c5f 0x4bde 0x4b9e 0x4b84 0x4c23 0x4c5a 0x4bda 0x4b9d 0x4b86 0x4c39 0x4c56 0x4bd7 0x4b9c 0x4b86 0x4c4f 0x4c53 0x4bd6 0x4b97 0x4b83 0x4c46 0x4c4f 0x4bd4 0x4b93 0x4b81 0x4c28 0x4c4a 0x4bd2 0x4b93 0x4b82 0x4c1b 0x4c3f 0x4bd0 0x4b93 0x4b82 0x4c19 0x4bfb 0x4bcc 0x4b93 0x4b83 0x4bac 0x4bb3 0x4bb6 0x4b90 0x4b7f 0x4b91 0x4b94 0x4ba0 0x4b89 0x4b78 0x4b89 0x4b8c 0x4b9e 0x4b80 0x4b70 0x4b8b 0x4b87 0x4b8e 0x4b7e 0x4b70 0x4b74 0x4b76 0x4b83 0x4b7c 0x4b6d 0x4b78 0x4b75 0x4b98 0x4b87 0x4b7c 0x4bab 0x4b91 0x4b9b 0x4b8b 0x4b83 0x4bda 0x4b96 0x4b9d 0x4b8e 0x4b84 0x4bf2 0x4b94 0x4b99 0x4b92 0x4b87 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c>; + }; + + qcom,pc-temp-z4-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4001 0x3c8d 0x3a72 0x3978 0x397b 0x40ed 0x3c83 0x3a6f 0x39c6 0x39b9 0x40da 0x3c60 0x3a4a 0x39d2 0x39c2 0x4086 0x3c0a 0x3a21 0x39c0 0x39b5 0x4000 0x3ba1 0x39fb 0x39a7 0x399e 0x3f71 0x3b4a 0x39dc 0x3990 0x3986 0x3ef7 0x3b02 0x39c2 0x3981 0x3976 0x3e89 0x3acb 0x39ac 0x3976 0x396c 0x3e16 0x3aa0 0x39a0 0x3970 0x3966 0x3d82 0x3a79 0x399a 0x396d 0x3961 0x3cf4 0x3a50 0x3998 0x396a 0x395d 0x3cc5 0x3a2f 0x3998 0x3965 0x3959 0x3cdb 0x3a29 0x3999 0x395f 0x3951 0x3cf0 0x3a35 0x399d 0x3961 0x394e 0x3cc2 0x3a3c 0x39a2 0x3970 0x395b 0x3c4c 0x3a29 0x39a0 0x397b 0x3968 0x3beb 0x39fe 0x398c 0x396b 0x395e 0x3bb2 0x39dd 0x3979 0x394d 0x3947 0x3b8d 0x39c9 0x3978 0x394f 0x3946 0x3b7e 0x39bd 0x3982 0x3988 0x3974 0x3b75 0x39bc 0x3996 0x39ba 0x39a6 0x3b71 0x39bf 0x39ca 0x39be 0x39ab 0x3b75 0x39c9 0x39fe 0x39b9 0x399f 0x3b7b 0x39fa 0x39fe 0x39ae 0x3991 0x3b80 0x3a38 0x39df 0x3993 0x3982 0x3b85 0x3a46 0x39bf 0x397d 0x3975 0x3b8c 0x3a43 0x39a7 0x3973 0x396c 0x3b92 0x3a3e 0x3994 0x396e 0x3965 0x3b9e 0x3a2f 0x3989 0x3969 0x395f 0x3bab 0x3a18 0x3982 0x3965 0x395a 0x3bb3 0x3a05 0x397d 0x3962 0x3955 0x3bba 0x39f5 0x397b 0x395e 0x3951 0x3bbe 0x39e5 0x397a 0x395a 0x394e 0x3bbc 0x39d6 0x3979 0x395a 0x394d 0x3bb5 0x39c8 0x3979 0x395c 0x3950 0x3ba1 0x39ba 0x3978 0x395e 0x3955 0x3b72 0x39ac 0x3976 0x3961 0x395b 0x3b43 0x39a1 0x3973 0x3963 0x3961 0x3afc 0x399e 0x3970 0x3963 0x3963 0x3abc 0x399c 0x396d 0x3963 0x3960 0x3ab4 0x3999 0x396a 0x3962 0x395d 0x3abb 0x3994 0x3967 0x3960 0x395c 0x3ab9 0x3995 0x3962 0x395d 0x395b 0x3aa3 0x39d0 0x395a 0x3959 0x3958 0x3abd 0x39eb 0x3957 0x394b 0x394c 0x3ac6 0x39f6 0x3953 0x3935 0x3934 0x3acb 0x39f8 0x394d 0x3931 0x392d 0x3ac3 0x39fa 0x3959 0x3929 0x3920 0x3ad0 0x3a03 0x3961 0x3925 0x391e 0x3ac0 0x39ff 0x394e 0x392e 0x392c 0x3a9b 0x39f7 0x3956 0x3935 0x3930 0x3a8e 0x39fe 0x3959 0x3936 0x3935 0x3a94 0x3a0e 0x3963 0x3937 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936>; + }; + + qcom,pc-temp-z5-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2b3c 0x2daa 0x3498 0x4a8d 0x45cc 0x2ef0 0x3052 0x39fb 0x4721 0x484e 0x3117 0x343d 0x3f9f 0x4802 0x4a61 0x31df 0x385f 0x430e 0x4b83 0x4d9f 0x326a 0x3a69 0x44ec 0x4e02 0x5124 0x32f3 0x3bab 0x4673 0x5049 0x55e1 0x33c6 0x3ce5 0x4810 0x514c 0x5936 0x34d0 0x3e95 0x49be 0x511b 0x5a23 0x35db 0x4119 0x4b35 0x5160 0x5a1d 0x36fa 0x4312 0x4c4c 0x5327 0x5b6b 0x3859 0x42b6 0x4bad 0x5424 0x5e2c 0x3a2d 0x3f5c 0x45e6 0x5167 0x6138 0x3c44 0x3ed3 0x3ee4 0x49ed 0x6100 0x3d63 0x47a6 0x4250 0x472f 0x5e7d 0x3d9a 0x506d 0x5049 0x50b3 0x5f98 0x3db5 0x5016 0x57f1 0x5c40 0x639a 0x3dda 0x4c6d 0x532f 0x5d14 0x64bc 0x3dd6 0x4a75 0x4bb9 0x59b9 0x646c 0x3d86 0x49e6 0x55e6 0x5b90 0x6454 0x3cdc 0x49b6 0x76e4 0x6b24 0x646b 0x3bcd 0x5034 0x875d 0x7705 0x6492 0x3ad1 0x649b 0x78a4 0x6a60 0x5e9c 0x3a04 0x7968 0x6282 0x5014 0x511e 0x3939 0x8c1a 0x56c4 0x4873 0x4bc7 0x3846 0x9a39 0x4fd8 0x5026 0x4d8e 0x3716 0x9aa6 0x4dfb 0x5780 0x5074 0x35e9 0x91df 0x53c1 0x5aa0 0x53ba 0x34ed 0x87db 0x5d83 0x5d20 0x57f1 0x33ea 0x7eb5 0x65eb 0x5e8b 0x5cc6 0x32dd 0x764e 0x6eb9 0x601d 0x628a 0x31ca 0x720c 0x75c6 0x61b9 0x67fc 0x30bf 0x6fd5 0x79eb 0x63f1 0x6c9c 0x2ffa 0x6e15 0x7d26 0x6810 0x7085 0x2f5e 0x6c28 0x8068 0x6dc5 0x7165 0x2ed6 0x6a83 0x83d1 0x7653 0x6fdc 0x2e78 0x6a47 0x8529 0x7b5b 0x6e81 0x2ea9 0x6b32 0x8003 0x7adf 0x6f61 0x2f11 0x6ca0 0x7890 0x796f 0x710e 0x303e 0x6e9b 0x7749 0x7672 0x709c 0x317f 0x7119 0x77a9 0x6cad 0x6a94 0x3162 0x71bd 0x77df 0x65cc 0x65f5 0x300b 0x6c45 0x7771 0x66c4 0x66af 0x2fb0 0x60cd 0x7669 0x680b 0x6789 0x3015 0x4018 0x70b0 0x6813 0x6600 0x2ca4 0x3328 0x596b 0x6764 0x62b7 0x2bbe 0x3022 0x477d 0x6688 0x6215 0x2b68 0x2f70 0x4725 0x57da 0x5967 0x2b6c 0x2f09 0x3dd8 0x58e5 0x64be 0x2ab7 0x2db9 0x398d 0x5bd2 0x6460 0x2ae0 0x2ded 0x457f 0x6bcd 0x75c0 0x2cb0 0x2ff3 0x438f 0x6311 0x7110 0x2d80 0x2fa5 0x439f 0x6129 0x668d 0x2d89 0x2ebe 0x3ec3 0x61e3 0x62ca 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005>; + }; + + qcom,pc-temp-z6-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x409a 0x3c2e 0x39dd 0x392f 0x3913 0x416d 0x3c48 0x39ee 0x394b 0x392d 0x419b 0x3c57 0x39ee 0x3952 0x3933 0x4181 0x3c50 0x39e4 0x394f 0x3931 0x413b 0x3c33 0x39d5 0x3947 0x392a 0x40e4 0x3c0c 0x39c7 0x393d 0x3921 0x409c 0x3be5 0x39bb 0x3935 0x391b 0x4062 0x3bcb 0x39b0 0x392e 0x3915 0x4027 0x3bb9 0x39aa 0x392a 0x3910 0x3fe0 0x3ba7 0x39a7 0x3929 0x390e 0x3f9a 0x3b8a 0x39a3 0x3928 0x390c 0x3f73 0x3b64 0x399a 0x3924 0x390b 0x3f65 0x3b56 0x398e 0x391c 0x3906 0x3f55 0x3b62 0x3992 0x3919 0x3903 0x3f1e 0x3b70 0x39a4 0x3927 0x390a 0x3ec0 0x3b64 0x39ac 0x3933 0x3912 0x3e70 0x3b3f 0x3999 0x392a 0x390c 0x3e3a 0x3b22 0x3982 0x3915 0x38fe 0x3e0f 0x3b10 0x3982 0x3914 0x38fc 0x3df2 0x3b06 0x3991 0x3936 0x3915 0x3ddc 0x3b09 0x39a5 0x3953 0x3930 0x3dd2 0x3b19 0x39c1 0x3956 0x3934 0x3dd2 0x3b2e 0x39d7 0x3953 0x3934 0x3dd7 0x3b4e 0x39d6 0x394f 0x3932 0x3ddc 0x3b6d 0x39c9 0x3948 0x392b 0x3de1 0x3b75 0x39be 0x3942 0x3924 0x3de6 0x3b75 0x39b8 0x393d 0x391f 0x3dea 0x3b74 0x39b4 0x3938 0x391c 0x3dee 0x3b6e 0x39b1 0x3935 0x3919 0x3df0 0x3b64 0x39ae 0x3931 0x3916 0x3df0 0x3b5c 0x39ab 0x392e 0x3913 0x3df0 0x3b54 0x39a9 0x392b 0x3910 0x3def 0x3b4c 0x39a8 0x3928 0x390d 0x3ded 0x3b46 0x39a7 0x3928 0x390c 0x3deb 0x3b40 0x39a7 0x3929 0x390c 0x3deb 0x3b3c 0x39a6 0x392a 0x390c 0x3ded 0x3b38 0x39a4 0x392c 0x390f 0x3def 0x3b35 0x39a2 0x392d 0x3913 0x3def 0x3b35 0x39a0 0x392d 0x3914 0x3dee 0x3b36 0x399f 0x392a 0x3912 0x3deb 0x3b36 0x399e 0x3928 0x3910 0x3de2 0x3b35 0x399d 0x3927 0x3910 0x3dd8 0x3b34 0x399b 0x3927 0x390f 0x3dcd 0x3b2c 0x3997 0x3926 0x390f 0x3da1 0x3b16 0x398b 0x391d 0x3908 0x3d94 0x3b10 0x397f 0x3911 0x38f9 0x3d93 0x3b0a 0x397c 0x390a 0x38f2 0x3d8f 0x3b0c 0x3979 0x3906 0x38ec 0x3d8d 0x3b07 0x3977 0x3903 0x38ea 0x3d95 0x3b0c 0x397c 0x390d 0x38f8 0x3da1 0x3b20 0x3983 0x3914 0x38ff 0x3dbd 0x3b30 0x398c 0x3918 0x3902 0x3de0 0x3b45 0x3993 0x391d 0x3906 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d>; + }; + + qcom,pc-temp-y1-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1dae 0x1a6c 0x17b7 0x1540 0x1467 0x143b 0x1db4 0x1a6f 0x17c3 0x153f 0x1466 0x143d 0x1dc0 0x1a74 0x17ca 0x153e 0x1466 0x143e 0x1dcd 0x1a7a 0x17ce 0x153c 0x1466 0x1440 0x1dd8 0x1a7e 0x17d0 0x153b 0x1467 0x1441 0x1ddd 0x1a80 0x17d0 0x153a 0x1467 0x1443 0x1ddc 0x1a80 0x17cc 0x153a 0x1468 0x1443 0x1dda 0x1a80 0x17c6 0x153a 0x146a 0x1444 0x1dd3 0x1a7d 0x17c5 0x153b 0x146c 0x1445 0x1dbc 0x1a76 0x17c8 0x153c 0x146d 0x1446 0x1daa 0x1a70 0x17ca 0x153d 0x146f 0x1448 0x1db3 0x1a6e 0x17c6 0x153d 0x1470 0x1449 0x1dc8 0x1a6f 0x17c0 0x153d 0x1472 0x144b 0x1ddc 0x1a74 0x17c1 0x153e 0x1474 0x144d 0x1df4 0x1a85 0x17d0 0x1545 0x1479 0x1452 0x1e03 0x1a97 0x17db 0x154d 0x147c 0x1454 0x1dfa 0x1aa4 0x17df 0x154f 0x147c 0x1455 0x1de7 0x1aaf 0x17e3 0x1552 0x147d 0x1455 0x1dd8 0x1ab0 0x17e4 0x1554 0x147e 0x1456 0x1dca 0x1aa1 0x17e2 0x1555 0x1480 0x1459 0x1dc3 0x1a95 0x17e2 0x1558 0x1483 0x145c 0x1dd6 0x1a97 0x17ed 0x155c 0x1487 0x1460 0x1df9 0x1a9f 0x17fb 0x1560 0x148b 0x1463 0x1e01 0x1aa5 0x17fd 0x1565 0x148e 0x1467 0x1e00 0x1aa8 0x17f8 0x1569 0x1491 0x146a 0x1e04 0x1aac 0x17f7 0x156d 0x1493 0x146e 0x1e09 0x1ab8 0x1800 0x1571 0x1496 0x1472 0x1e0c 0x1acc 0x180b 0x1576 0x149a 0x1475 0x1e0a 0x1ad7 0x180e 0x157b 0x149d 0x1478 0x1df8 0x1adc 0x1812 0x1581 0x14a0 0x147a 0x1de0 0x1ade 0x1817 0x1586 0x14a3 0x147d 0x1dd9 0x1adb 0x181b 0x158b 0x14a7 0x1480 0x1ddb 0x1ad7 0x181f 0x1590 0x14aa 0x1484 0x1ddd 0x1ad7 0x1820 0x1593 0x14ad 0x1487 0x1de1 0x1ad5 0x1821 0x1596 0x14b0 0x1489 0x1de8 0x1ad3 0x1823 0x1599 0x14b2 0x148b 0x1df7 0x1adf 0x1827 0x159b 0x14b4 0x148c 0x1e0a 0x1aef 0x182c 0x159d 0x14b5 0x148d 0x1e0d 0x1aef 0x1831 0x159e 0x14b5 0x148e 0x1dff 0x1ae3 0x1835 0x159f 0x14b6 0x148e 0x1df5 0x1adf 0x183a 0x15a1 0x14b7 0x148f 0x1df6 0x1ae5 0x1841 0x15a5 0x14b9 0x1491 0x1df6 0x1aeb 0x184c 0x15a8 0x14ba 0x1492 0x1df6 0x1af2 0x1849 0x15aa 0x14bb 0x1493 0x1dfa 0x1af8 0x1850 0x15af 0x14be 0x1495 0x1e04 0x1b0b 0x1850 0x15b1 0x14be 0x1496 0x1e09 0x1b08 0x1859 0x15b4 0x14be 0x1496 0x1e26 0x1b0e 0x1863 0x15b4 0x14be 0x1496 0x1e37 0x1b0b 0x186b 0x15b6 0x14bf 0x1496 0x1e2c 0x1b1e 0x1867 0x15b9 0x14c2 0x1498 0x1e29 0x1b3f 0x1879 0x15c2 0x14c5 0x149b 0x1e38 0x1b5b 0x1895 0x15d1 0x14cc 0x14a0 0x1e61 0x1b5f 0x18a8 0x15e4 0x14d3 0x14a6 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac>; + }; + + qcom,pc-temp-y2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x25d6 0x28a1 0x29b8 0x2b2a 0x2b60 0x2c89 0x2638 0x287f 0x299b 0x2b15 0x2b62 0x2c51 0x2674 0x286a 0x297a 0x2afb 0x2b61 0x2bfc 0x2693 0x285f 0x2959 0x2ade 0x2b5e 0x2ba2 0x269f 0x285b 0x293d 0x2abd 0x2b58 0x2b5a 0x26a2 0x285a 0x292b 0x2a9a 0x2b51 0x2b3c 0x266c 0x2867 0x2922 0x2a6d 0x2b48 0x2b43 0x260b 0x287d 0x291b 0x2a3f 0x2b3b 0x2b4e 0x25f2 0x2878 0x2916 0x2a29 0x2b28 0x2b4d 0x25fe 0x283e 0x2912 0x2a1c 0x2b09 0x2b3a 0x2615 0x2814 0x2910 0x2a13 0x2ae5 0x2b24 0x2698 0x2862 0x291a 0x2a04 0x2ab6 0x2afb 0x2784 0x28ea 0x2933 0x29f0 0x2a85 0x2ac3 0x27ba 0x2909 0x295a 0x29f2 0x2a7a 0x2abc 0x26d8 0x28f6 0x29a8 0x2a1d 0x2a90 0x2af0 0x2601 0x28e9 0x29e0 0x2a53 0x2ab0 0x2b19 0x25e5 0x28ff 0x29fa 0x2a91 0x2aec 0x2b1b 0x25de 0x2924 0x2a0e 0x2ad0 0x2b33 0x2b18 0x25d8 0x292d 0x2a1d 0x2aef 0x2b47 0x2b23 0x25d2 0x292c 0x2a2b 0x2afc 0x2b48 0x2b59 0x25cd 0x2929 0x2a36 0x2b0a 0x2b4a 0x2b9b 0x25ca 0x28f3 0x2a3f 0x2b29 0x2b78 0x2bd9 0x25c8 0x2849 0x2a48 0x2b54 0x2bc0 0x2c13 0x25c6 0x27d1 0x2a4b 0x2b74 0x2be2 0x2c3d 0x25c3 0x275f 0x2a50 0x2b8f 0x2bf6 0x2c5c 0x25c0 0x271c 0x2a54 0x2ba1 0x2c07 0x2c71 0x25bf 0x270e 0x2a52 0x2bac 0x2c19 0x2c83 0x25be 0x2700 0x2a4a 0x2bb0 0x2c2d 0x2c96 0x25bd 0x26ed 0x2a46 0x2ba7 0x2c35 0x2cb5 0x25bc 0x26d4 0x2a44 0x2b8e 0x2c41 0x2cec 0x25bb 0x26b9 0x2a3f 0x2b80 0x2c4d 0x2d11 0x25bb 0x26a1 0x29e9 0x2b83 0x2c40 0x2d02 0x25ba 0x268b 0x294e 0x2b8f 0x2c2f 0x2cda 0x25b9 0x2672 0x290b 0x2b9c 0x2c33 0x2cca 0x25b8 0x2655 0x28fa 0x2b99 0x2c39 0x2cd1 0x25b8 0x263a 0x28ee 0x2b84 0x2c35 0x2cd6 0x25b7 0x2622 0x28e6 0x2b68 0x2c34 0x2cdc 0x25b7 0x2604 0x290b 0x2b59 0x2c39 0x2ce8 0x25b6 0x25ec 0x293c 0x2b5f 0x2c3b 0x2ce7 0x25b6 0x25de 0x291d 0x2b60 0x2c36 0x2cd1 0x25b6 0x25d4 0x28ba 0x2b5f 0x2c32 0x2cc5 0x25b6 0x25cb 0x289c 0x2b62 0x2c34 0x2ccc 0x25b6 0x25c4 0x28a6 0x2b5d 0x2c32 0x2ccf 0x25b5 0x25be 0x281b 0x2b46 0x2c13 0x2cc8 0x25b5 0x25bb 0x27d7 0x2b34 0x2c13 0x2cb0 0x25b5 0x25bb 0x27c4 0x2b11 0x2c20 0x2c82 0x25b5 0x25ba 0x2810 0x2b0d 0x2c0a 0x2c51 0x25b5 0x25b9 0x2851 0x2b23 0x2be8 0x2c48 0x25b5 0x25b8 0x2853 0x2b28 0x2bef 0x2c50 0x25b4 0x25b8 0x2837 0x2ae6 0x2c1e 0x2c3a 0x25b4 0x25b6 0x2800 0x2acc 0x2bf7 0x2bfd 0x25b4 0x25b5 0x27bc 0x2aa1 0x2b7e 0x2ba7 0x25b4 0x25b4 0x2786 0x2a49 0x2b0f 0x2b35 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a>; + }; + + qcom,pc-temp-y3-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x347a 0x3456 0x3421 0x33e5 0x33e0 0x33d8 0x356b 0x345f 0x341a 0x33e4 0x33e0 0x33da 0x35ff 0x346c 0x3416 0x33e3 0x33e0 0x33db 0x364d 0x3479 0x3416 0x33e3 0x33e0 0x33dd 0x366b 0x3484 0x3418 0x33e3 0x33e0 0x33de 0x3670 0x3489 0x341c 0x33e5 0x33e0 0x33de 0x35ec 0x3489 0x3423 0x33e8 0x33e0 0x33de 0x34fc 0x3488 0x342b 0x33ed 0x33e1 0x33de 0x34bb 0x348b 0x342e 0x33ef 0x33e1 0x33de 0x34ba 0x349e 0x342f 0x33f0 0x33e1 0x33dd 0x34bb 0x34ac 0x3430 0x33f0 0x33e1 0x33dd 0x34d3 0x349e 0x343d 0x33f7 0x33e4 0x33df 0x3504 0x3481 0x3450 0x3401 0x33e9 0x33e2 0x3510 0x3471 0x3451 0x3402 0x33ea 0x33e3 0x34ec 0x3468 0x343b 0x33fe 0x33e8 0x33e2 0x34cc 0x3462 0x3427 0x33fb 0x33e6 0x33e2 0x34d0 0x345f 0x3422 0x33fd 0x33e8 0x33e2 0x34e0 0x345d 0x341f 0x3401 0x33ec 0x33e3 0x34e7 0x345a 0x341b 0x3401 0x33ec 0x33e3 0x34e9 0x3455 0x3416 0x33f9 0x33e7 0x33e0 0x34ea 0x344f 0x3411 0x33f0 0x33e3 0x33dd 0x34ec 0x3445 0x340c 0x33e8 0x33e1 0x33dc 0x34f0 0x3435 0x3407 0x33e3 0x33e0 0x33db 0x34f5 0x3427 0x3406 0x33e2 0x33df 0x33db 0x3500 0x341c 0x3405 0x33e3 0x33de 0x33db 0x3512 0x3417 0x3405 0x33e4 0x33de 0x33da 0x3525 0x3418 0x3405 0x33e3 0x33de 0x33da 0x3539 0x341b 0x3405 0x33e3 0x33dd 0x33da 0x354f 0x341f 0x3405 0x33e5 0x33dd 0x33da 0x356b 0x3423 0x3405 0x33e9 0x33dd 0x33d9 0x358d 0x3428 0x3405 0x33ec 0x33dd 0x33d9 0x35b2 0x342d 0x3400 0x33ed 0x33de 0x33d9 0x35da 0x3434 0x33f9 0x33ec 0x33de 0x33da 0x360a 0x343c 0x33f6 0x33ec 0x33df 0x33da 0x3641 0x3449 0x33f7 0x33ea 0x33de 0x33da 0x3680 0x3458 0x33f8 0x33e8 0x33de 0x33d9 0x36c1 0x3468 0x33fb 0x33e6 0x33de 0x33d9 0x3702 0x347a 0x3402 0x33e4 0x33dd 0x33d9 0x3742 0x3490 0x3408 0x33e3 0x33dd 0x33d9 0x3781 0x34b0 0x340c 0x33e3 0x33dd 0x33d9 0x37c1 0x34dc 0x340f 0x33e3 0x33dd 0x33d9 0x3803 0x3511 0x3415 0x33e3 0x33de 0x33da 0x3845 0x3550 0x341e 0x33e3 0x33de 0x33da 0x3892 0x35a3 0x3421 0x33e4 0x33de 0x33da 0x38ea 0x3613 0x3429 0x33e3 0x33de 0x33da 0x390d 0x3642 0x3430 0x33eb 0x33df 0x33dc 0x393f 0x363e 0x3435 0x33ec 0x33e1 0x33dd 0x395c 0x3658 0x3442 0x33f0 0x33e3 0x33e0 0x398d 0x36b9 0x3451 0x33f2 0x33e2 0x33e0 0x3a0b 0x3718 0x3452 0x33ee 0x33e1 0x33dd 0x3a97 0x37a6 0x345a 0x33f0 0x33e0 0x33dd 0x3b31 0x3888 0x346f 0x33f5 0x33e3 0x33e1 0x3c10 0x3978 0x3492 0x33f9 0x33e6 0x33e4 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6>; + }; + + qcom,pc-temp-y4-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x45b5 0x41d2 0x40f2 0x406d 0x4045 0x4044 0x452b 0x41db 0x40ef 0x4073 0x4045 0x4042 0x44eb 0x41eb 0x40ef 0x4078 0x4047 0x4041 0x44e9 0x4200 0x40f2 0x407b 0x4048 0x4040 0x4515 0x421b 0x40f7 0x407d 0x404a 0x4040 0x4561 0x4239 0x40fe 0x407e 0x404b 0x4040 0x4627 0x4263 0x4106 0x407c 0x404d 0x4041 0x478b 0x428e 0x4111 0x407a 0x404e 0x4044 0x4914 0x42a4 0x411c 0x407a 0x4051 0x4046 0x4b24 0x42ad 0x4127 0x4081 0x4055 0x4049 0x4c74 0x42bc 0x4138 0x408c 0x405b 0x404d 0x4a3e 0x4407 0x419f 0x409e 0x4069 0x4059 0x4560 0x4626 0x4237 0x40b4 0x407d 0x4068 0x437a 0x4642 0x4251 0x40bd 0x4081 0x406c 0x4347 0x43a8 0x4203 0x40bf 0x407d 0x406b 0x432d 0x41b1 0x41aa 0x40c3 0x407b 0x406a 0x4320 0x41b5 0x416e 0x40ec 0x4091 0x407a 0x430d 0x41e2 0x413b 0x4129 0x40ba 0x4098 0x42ef 0x41ed 0x4117 0x412a 0x40c0 0x409d 0x42b4 0x41c5 0x40fa 0x40d1 0x4094 0x407d 0x4274 0x4198 0x40e3 0x4085 0x4066 0x405b 0x4249 0x4180 0x40d4 0x4078 0x4054 0x404d 0x4228 0x416e 0x40c8 0x4072 0x4049 0x4043 0x421f 0x416b 0x40c2 0x406f 0x4048 0x4042 0x4223 0x415f 0x40be 0x406b 0x4048 0x4042 0x422b 0x414f 0x40bb 0x4069 0x4049 0x4043 0x4231 0x4143 0x40ba 0x406b 0x404b 0x4045 0x423b 0x4137 0x40ba 0x406d 0x404e 0x4048 0x4246 0x4136 0x40b9 0x406e 0x4051 0x404c 0x4252 0x4142 0x40b4 0x4070 0x4057 0x4051 0x425e 0x4154 0x40b0 0x4072 0x405e 0x4058 0x426a 0x4167 0x40b4 0x4074 0x4068 0x4063 0x4276 0x417f 0x40bd 0x4076 0x4073 0x4070 0x4283 0x4198 0x40c4 0x4074 0x4075 0x4072 0x4290 0x41b2 0x40c9 0x4069 0x4064 0x4061 0x429c 0x41cd 0x40cd 0x405e 0x404f 0x404c 0x42a8 0x41ef 0x40d2 0x405b 0x4044 0x4043 0x42b5 0x421f 0x40d8 0x4059 0x403e 0x403f 0x42c7 0x4244 0x40dc 0x405a 0x403e 0x4040 0x42e1 0x4252 0x40e9 0x405d 0x4042 0x4045 0x4308 0x425c 0x40fd 0x4060 0x4047 0x404a 0x433b 0x4262 0x410c 0x4063 0x4048 0x404b 0x437e 0x4270 0x4118 0x4064 0x4046 0x4048 0x43d3 0x4287 0x4129 0x4061 0x403d 0x403b 0x442a 0x42c2 0x4147 0x406b 0x4041 0x403e 0x441b 0x42ef 0x4160 0x4075 0x4057 0x405a 0x441e 0x4307 0x4166 0x4084 0x4070 0x4078 0x43ed 0x432a 0x4193 0x40a2 0x4099 0x40a2 0x43d0 0x436e 0x41e6 0x40be 0x409c 0x4098 0x43e5 0x4383 0x41de 0x409e 0x406e 0x4064 0x43f6 0x4384 0x41d8 0x409e 0x4060 0x4059 0x4411 0x43a0 0x41fb 0x40bd 0x4070 0x4067 0x4463 0x43f1 0x4266 0x40fb 0x4090 0x4085 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118>; + }; + + qcom,pc-temp-y5-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2208 0x348a 0x3ab0 0x3545 0x4573 0x3634 0x2208 0x34aa 0x3839 0x3326 0x4393 0x3e82 0x269f 0x34e2 0x3660 0x31db 0x419b 0x43da 0x2f8b 0x3522 0x3519 0x3130 0x3fbf 0x46e0 0x3428 0x3557 0x345a 0x30f0 0x3e34 0x4838 0x3590 0x3572 0x341a 0x30e7 0x3d2f 0x4884 0x30ee 0x3576 0x34b3 0x32d3 0x3ca4 0x46c7 0x2869 0x3578 0x35a4 0x35e5 0x3c3f 0x4385 0x267f 0x34b6 0x35c2 0x3648 0x3b81 0x4119 0x2a54 0x3032 0x3545 0x34d0 0x3996 0x3e92 0x2ff6 0x2cf8 0x3494 0x33cf 0x387f 0x3ce5 0x37e1 0x2fd6 0x333d 0x3525 0x3964 0x3cfd 0x4112 0x360e 0x319c 0x3768 0x3acb 0x3dbd 0x4280 0x3a64 0x326c 0x37dc 0x3b0d 0x3dbf 0x373b 0x3dd4 0x395e 0x3745 0x3a7a 0x3cb2 0x2cf9 0x3f72 0x3eca 0x36d1 0x3a41 0x3bb0 0x2d03 0x3ec5 0x3f83 0x384b 0x3ae8 0x3b5d 0x2edc 0x3dc2 0x3fc3 0x3b9d 0x3c38 0x3b2b 0x2f8c 0x3d9a 0x3f92 0x3dc7 0x3e57 0x3b93 0x2f1e 0x3df3 0x3ecf 0x3f34 0x4225 0x3e9f 0x2e5c 0x3e54 0x3de6 0x3fc8 0x445b 0x4233 0x2d64 0x3c6d 0x3c08 0x3c17 0x4527 0x44e0 0x2c30 0x3697 0x3971 0x3578 0x4604 0x471b 0x2b6b 0x3248 0x38a0 0x33d2 0x4627 0x47ff 0x2b06 0x2f1a 0x38d8 0x353a 0x4512 0x484d 0x2ad4 0x2d6f 0x3925 0x3660 0x43d2 0x484f 0x2add 0x2d4c 0x3975 0x3678 0x4315 0x4790 0x2aec 0x2d55 0x39cc 0x366c 0x4294 0x45bc 0x2af3 0x2d44 0x3a34 0x38ed 0x427b 0x43ff 0x2b16 0x2d12 0x3b09 0x40ee 0x4270 0x426f 0x2b4e 0x2d07 0x3ba6 0x465a 0x4280 0x41aa 0x2b80 0x2d07 0x38cb 0x47e5 0x43ef 0x42bb 0x2ba9 0x2cec 0x3382 0x48db 0x472c 0x45f6 0x2bd0 0x2ce9 0x319e 0x48b8 0x4a98 0x495f 0x2bf8 0x2d41 0x31a4 0x45bb 0x4e8c 0x4c69 0x2c20 0x2daa 0x31b5 0x4185 0x51da 0x4ea9 0x2c45 0x2dd9 0x3221 0x3e14 0x52fb 0x508e 0x2c64 0x2d8a 0x34af 0x3aee 0x5257 0x524a 0x2c6c 0x2d32 0x3713 0x3918 0x50bc 0x5292 0x2c5a 0x2d52 0x36de 0x38bf 0x4e90 0x50e7 0x2c45 0x2d99 0x34f7 0x3913 0x4dbc 0x4f8f 0x2c53 0x2da9 0x354f 0x3906 0x4ea8 0x5136 0x2cb7 0x2d71 0x370b 0x3898 0x515e 0x56c7 0x2d6c 0x2d2c 0x33cd 0x3962 0x555b 0x5c52 0x2e6e 0x2cc8 0x325a 0x3610 0x4cc2 0x4ea4 0x2fc4 0x2d10 0x320a 0x3e49 0x4394 0x4373 0x30b0 0x2d1b 0x3431 0x3e08 0x42cc 0x40b6 0x322c 0x2e86 0x370e 0x4092 0x40be 0x3f21 0x3256 0x3099 0x3915 0x3fe1 0x3e27 0x3e5b 0x322c 0x3127 0x38b1 0x3e5f 0x428d 0x410e 0x3117 0x3039 0x38e1 0x4283 0x4414 0x4431 0x2f77 0x2f18 0x37f8 0x4528 0x4741 0x4a06 0x2e6f 0x2e5e 0x37ca 0x4396 0x477b 0x4ab1 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b>; + }; + + qcom,pc-temp-y6-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1af4 0x1607 0x1492 0x13c9 0x139d 0x1392 0x1afb 0x160e 0x148d 0x13c8 0x139d 0x1393 0x1aff 0x1616 0x148a 0x13c7 0x139d 0x1394 0x1aff 0x161e 0x148a 0x13c8 0x139d 0x1395 0x1afc 0x1626 0x148c 0x13c9 0x139e 0x1395 0x1af7 0x162e 0x148e 0x13ca 0x139f 0x1396 0x1ac7 0x1636 0x1494 0x13cc 0x139f 0x1397 0x1a78 0x163e 0x149c 0x13cf 0x13a1 0x1397 0x1a74 0x1646 0x14a1 0x13d2 0x13a2 0x1398 0x1aff 0x164c 0x14a3 0x13d4 0x13a3 0x1399 0x1b70 0x1657 0x14a8 0x13d7 0x13a5 0x139a 0x1af4 0x16ac 0x14cc 0x13e2 0x13ac 0x139f 0x19d3 0x172c 0x1503 0x13ef 0x13b5 0x13a6 0x1941 0x172c 0x150b 0x13f2 0x13b7 0x13a8 0x190e 0x1670 0x14e5 0x13f1 0x13b5 0x13a7 0x18f6 0x15e2 0x14be 0x13f0 0x13b3 0x13a7 0x18fb 0x15e4 0x14ab 0x13fd 0x13bb 0x13ac 0x1909 0x15f5 0x149c 0x1412 0x13c9 0x13b5 0x190d 0x15f9 0x148f 0x1412 0x13cb 0x13b7 0x190c 0x15ed 0x1483 0x13f3 0x13bb 0x13ab 0x190a 0x15e0 0x147a 0x13d6 0x13ab 0x139f 0x190d 0x15d6 0x1473 0x13cd 0x13a4 0x139a 0x191a 0x15ce 0x146e 0x13c8 0x13a1 0x1397 0x192c 0x15c9 0x146d 0x13c7 0x13a0 0x1397 0x1945 0x15c7 0x146e 0x13c7 0x13a0 0x1397 0x1964 0x15c6 0x146f 0x13c8 0x13a0 0x1398 0x1982 0x15cb 0x1470 0x13c9 0x13a1 0x1398 0x19a0 0x15d5 0x1473 0x13ca 0x13a2 0x1399 0x19c0 0x15e2 0x1475 0x13cc 0x13a3 0x139a 0x19e6 0x15f3 0x1476 0x13d0 0x13a5 0x139c 0x1a11 0x1607 0x1477 0x13d4 0x13a7 0x139e 0x1a3f 0x161d 0x1478 0x13d6 0x13ab 0x13a2 0x1a72 0x1638 0x1479 0x13d7 0x13af 0x13a6 0x1aa7 0x1655 0x147b 0x13d6 0x13b0 0x13a7 0x1ae0 0x1676 0x147f 0x13d2 0x13ab 0x13a2 0x1b1c 0x169b 0x1483 0x13ce 0x13a5 0x139c 0x1b59 0x16c6 0x1488 0x13cc 0x13a2 0x139a 0x1b96 0x16f8 0x1490 0x13cb 0x13a0 0x1398 0x1bd4 0x1732 0x149a 0x13ca 0x13a0 0x1399 0x1c13 0x1772 0x14a5 0x13cb 0x13a1 0x139a 0x1c51 0x17bc 0x14b0 0x13cd 0x13a3 0x139c 0x1c90 0x1811 0x14bf 0x13ce 0x13a4 0x139d 0x1cd3 0x1875 0x14d0 0x13cf 0x13a3 0x139c 0x1d22 0x18ef 0x14e0 0x13d0 0x13a1 0x1399 0x1d80 0x1984 0x14f9 0x13d2 0x13a3 0x139a 0x1da5 0x19b9 0x150c 0x13db 0x13a9 0x13a3 0x1dcf 0x19c4 0x1513 0x13e1 0x13b2 0x13ad 0x1dde 0x19e7 0x152f 0x13ec 0x13bf 0x13bb 0x1e04 0x1a57 0x155a 0x13f6 0x13c0 0x13b8 0x1e6d 0x1abf 0x1560 0x13eb 0x13b2 0x13a7 0x1edf 0x1b41 0x1573 0x13ee 0x13ae 0x13a5 0x1f66 0x1c0d 0x15ab 0x13fd 0x13b6 0x13ac 0x2034 0x1cdf 0x160e 0x1415 0x13c2 0x13b7 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4>; + }; + }; + }; + }; + }; + + fragment@12 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm1 { + reg = <0x4f>; + label = "pa_therm1"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@13 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x4d 0xffffffff 0x4e 0xffffffff 0x4f 0xffffffff 0x52>; + + pa_therm1 { + reg = <0x4f>; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + }; + }; + }; + + fragment@14 { + target = <0xffffffff>; + + __overlay__ { + compatible = "qcom,ufs-phy-qmp-v3"; + vdda-phy-supply = <0xffffffff>; + vdda-pll-supply = <0xffffffff>; + vdda-phy-max-microamp = <0xf5b4>; + vdda-pll-max-microamp = <0x477c>; + status = "ok"; + }; + }; + + fragment@15 { + target = <0xffffffff>; + + __overlay__ { + vdd-hba-supply = <0xffffffff>; + vdd-hba-fixed-regulator; + vcc-supply = <0xffffffff>; + vcc-voltage-level = <0x2d2a80 0x2d2a80>; + vcc-max-microamp = <0x927c0>; + vccq2-supply = <0xffffffff>; + vccq2-voltage-level = <0x1ab3f0 0x1dc130>; + vccq2-max-microamp = <0x927c0>; + qcom,vddp-ref-clk-supply = <0xffffffff>; + qcom,vddp-ref-clk-max-microamp = <0x64>; + status = "ok"; + }; + }; + + fragment@16 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0x8b290>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <0x1b7740 0x1b7740>; + qcom,vdd-io-current-level = <0x0 0x4f588>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + status = "ok"; + }; + }; + + fragment@17 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0xc3500>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-voltage-level = <0x1b7740 0x2d0370>; + qcom,vdd-io-current-level = <0x0 0x55f0>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + cd-gpios = <0xffffffff 0x45 0x1>; + status = "ok"; + }; + }; + + fragment@18 { + target = <0xffffffff>; + + __overlay__ { + + pa-therm1 { + polling-delay-passive = <0x0>; + polling-delay = <0x0>; + thermal-governor = "user_space"; + thermal-sensors = <0xffffffff 0x4f>; + wake-capable-sensor; + + trips { + + active-config0 { + temperature = <0x1e848>; + hysteresis = <0x3e8>; + type = "passive"; + }; + }; + }; + + quiet-therm-step { + status = "disabled"; + }; + }; + }; + + fragment@19 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@20 { + target = <0xffffffff>; + + __overlay__ { + qcom,battery-data = <0x13>; + qcom,qg-iterm-ma = <0x64>; + qcom,hold-soc-while-full; + qcom,linearize-soc; + qcom,cl-feedback-on; + }; + }; + + fragment@21 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x8 0xffffffff 0x7 0xffffffff 0x9 0xffffffff 0x6 0xffffffff 0x4f 0xffffffff 0x99 0xffffffff 0x83>; + io-channel-names = "usb_in_voltage", "usb_in_current", "chg_temp", "die_temp", "conn_temp", "sbux_res", "vph_voltage"; + qcom,battery-data = <0x13>; + qcom,auto-recharge-soc = <0x62>; + qcom,step-charging-enable; + qcom,sw-jeita-enable; + qcom,fcc-stepping-enable; + qcom,suspend-input-on-debug-batt; + qcom,sec-charger-config = <0x3>; + qcom,thermal-mitigation = <0x401640 0x3567e0 0x2dc6c0 0x2625a0 0x1e8480 0x16e360 0xf4240 0x7a120>; + dpdm-supply = <0xffffffff>; + qcom,charger-temp-max = <0x320>; + qcom,smb-temp-max = <0x320>; + qcom,fcc-step-delay-ms = <0x64>; + qcom,fcc-step-size-ua = <0x186a0>; + qcom,disable-sw-thermal-regulation; + qcom,disable-fcc-restriction; + qcom,smb-internal-pull-kohm = <0x0>; + }; + }; + + fragment@22 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + }; + }; + }; + + fragment@23 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@24 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,i2c-touch-active = "synaptics,tcm-i2c"; + + synaptics_tcm@20 { + compatible = "synaptics,tcm-i2c"; + reg = <0x20>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend", "pmx_ts_release"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + pinctrl-2 = <0xffffffff>; + vdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + synaptics,pwr-reg-name = "avdd"; + synaptics,bus-reg-name = "vdd"; + synaptics,irq-gpio = <0xffffffff 0x9 0x2008>; + synaptics,irq-on-state = <0x0>; + synaptics,reset-gpio = <0xffffffff 0x8 0x0>; + synaptics,reset-on-state = <0x0>; + synaptics,reset-active-ms = <0x14>; + synaptics,reset-delay-ms = <0xc8>; + synaptics,power-delay-ms = <0xc8>; + synaptics,ubl-i2c-addr = <0x20>; + }; + + atmel_mxt_ts@4a { + compatible = "atmel,maxtouch"; + reg = <0x4a>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + avdd-supply = <0xffffffff>; + vdd-supply = <0xffffffff>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + reset-gpios = <0xffffffff 0x8 0x0>; + irq-gpios = <0xffffffff 0x9 0x2008>; + atmel,xy_switch; + atmel,panel-coords = <0x0 0x0 0x1df 0x31f>; + atmel,display-coords = <0x0 0x0 0x153 0x301>; + }; + }; + }; + + fragment@25 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,clk-freq-out = <0xf4240>; + #address-cells = <0x1>; + #size-cells = <0x0>; + + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <0xffffffff 0x25 0x0>; + qcom,nq-ven = <0xffffffff 0xc 0x0>; + qcom,nq-firm = <0xffffffff 0x24 0x0>; + qcom,nq-clkreq = <0xffffffff 0x1f 0x0>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff>; + }; + }; + }; + + fragment@26 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-aux-switch = <0xffffffff>; + }; + }; + + fragment@27 { + target = <0xffffffff>; + + __overlay__ { + + lpi_pinctrl@627C0000 { + compatible = "qcom,lpi-pinctrl"; + reg = <0x627c0000 0x0>; + qcom,num-gpios = <0xf>; + gpio-controller; + #gpio-cells = <0x2>; + qcom,slew-reg = <0x6295a000 0x0>; + qcom,lpi-offset-tbl = <0x0 0x1000 0x2000 0x3000 0x4000 0x5000 0x6000 0x7000 0x8000 0x9000 0xa000 0xb000 0xc000 0xd000 0xe000>; + qcom,lpi-slew-offset-tbl = <0x0 0x2 0x4 0x8 0xa 0xc 0x0 0x0 0x0 0x0 0x10 0x12 0x0 0x0 0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + phandle = <0x31>; + + dmic01_clk_active { + phandle = <0x32>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic01_clk_sleep { + phandle = <0x34>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic01_data_active { + phandle = <0x33>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic01_data_sleep { + phandle = <0x35>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic23_clk_active { + phandle = <0x36>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic23_clk_sleep { + phandle = <0x38>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic23_data_active { + phandle = <0x37>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic23_data_sleep { + phandle = <0x39>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic45_clk_active { + phandle = <0x3a>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic45_clk_sleep { + phandle = <0x3c>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic45_data_active { + phandle = <0x3b>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic45_data_sleep { + phandle = <0x3d>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + tx_swr_clk_sleep { + phandle = <0x4a>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_clk_active { + phandle = <0x46>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + tx_swr_data0_sleep { + phandle = <0x4b>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data0_active { + phandle = <0x47>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_sleep { + phandle = <0x40>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_active { + phandle = <0x3e>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_data_sleep { + phandle = <0x41>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_data_active { + phandle = <0x3f>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data1_sleep { + phandle = <0x4c>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data1_active { + phandle = <0x48>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data2_sleep { + phandle = <0x4d>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data2_active { + phandle = <0x49>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + rx_swr_clk_sleep { + phandle = <0x44>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_clk_active { + phandle = <0x42>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + rx_swr_data_sleep { + phandle = <0x45>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_data_active { + phandle = <0x43>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + lpi_i2s1_sck_active { + phandle = <0x55>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sck_sleep { + phandle = <0x59>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_ws_active { + phandle = <0x56>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_ws_sleep { + phandle = <0x5a>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd0_active { + phandle = <0x57>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd0_sleep { + phandle = <0x5b>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd1_active { + phandle = <0x58>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd1_sleep { + phandle = <0x5c>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + }; + + fragment@28 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x4>; + + bolero-clk-rsc-mngr { + compatible = "qcom,bolero-clk-rsc-mngr"; + qcom,fs-gen-sequence = <0x3000 0x1 0x3004 0x1 0x3080 0x2>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,va_mclk_mode_muxsel = <0x627a0000>; + clock-names = "tx_core_clk", "tx_npl_clk", "rx_core_clk", "rx_npl_clk", "wsa_core_clk", "wsa_npl_clk", "va_core_clk", "va_npl_clk"; + clocks = <0x14 0x0 0x15 0x0 0x16 0x0 0x17 0x0 0x18 0x0 0x19 0x0 0x1a 0x0 0x1b 0x0>; + }; + + tx-macro@62620000 { + compatible = "qcom,tx-macro"; + reg = <0x62620000 0x0>; + clock-names = "tx_core_clk", "tx_npl_clk"; + clocks = <0x14 0x0 0x15 0x0>; + qcom,tx-swr-gpios = <0x1c>; + qcom,tx-dmic-sample-rate = <0x249f00>; + phandle = <0xb2>; + + tx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x3>; + swrm-io-base = <0x62630000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x1>; + interrupts = <0x0 0x128 0x0 0x0 0x22b 0x0>; + interrupt-names = "swr_master_irq", "swr_wake_irq"; + qcom,swr-wakeup-required = <0x0>; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x21 0xf 0x2 0x12 0x1 0x2 0x13 0x2 0x3 0x14 0x1 0x3 0x15 0x2 0x4 0x16 0x1 0x4 0x17 0x2 0x4 0x18 0x4 0x4 0x19 0x8 0x5 0x1a 0x1 0x5 0x1b 0x2 0x5 0x1c 0x4 0x5 0x1d 0x8>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + qcom,swr-mstr-irq-wakeup-capable = <0x1>; + phandle = <0xb3>; + + wcd938x-tx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170223>; + phandle = <0x23>; + }; + + wcd937x-tx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170223>; + phandle = <0x27>; + }; + }; + }; + + rx-macro@62600000 { + compatible = "qcom,rx-macro"; + reg = <0x62600000 0x0>; + clock-names = "rx_core_clk", "rx_npl_clk"; + clocks = <0x16 0x0 0x17 0x0>; + qcom,rx-swr-gpios = <0x1d>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,rx-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + phandle = <0xb4>; + + rx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x2>; + swrm-io-base = <0x62610000 0x0>; + interrupts = <0x0 0x129 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x9 0x1 0x1 0xa 0x2 0x2 0xd 0x1 0x3 0xb 0x1 0x3 0xc 0x2 0x4 0xe 0x1 0x5 0xf 0x1 0x5 0x10 0x2>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + phandle = <0xb5>; + + wcd938x-rx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170224>; + phandle = <0x22>; + }; + + wcd937x-rx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170224>; + phandle = <0x26>; + }; + }; + }; + + wsa-macro@62640000 { + compatible = "qcom,wsa-macro"; + reg = <0x62640000 0x0>; + clock-names = "wsa_core_clk", "wsa_npl_clk"; + clocks = <0x18 0x0 0x19 0x0>; + qcom,wsa-swr-gpios = <0x1e>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,wsa-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + status = "disabled"; + phandle = <0xb6>; + + wsa_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + qcom,swr_master_id = <0x1>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + swrm-io-base = <0x62650000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x0>; + interrupts = <0x0 0x127 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x8>; + qcom,swr-port-mapping = <0x1 0x1 0x1 0x2 0x3 0xf 0x3 0x2 0x3 0x4 0x5 0x1 0x5 0x7 0xf 0x6 0x6 0x3 0x7 0x4 0x3 0x8 0x8 0x3>; + qcom,swr-num-dev = <0x2>; + phandle = <0xb7>; + + wsa881x@20170211 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170211>; + qcom,spkr-sd-n-node = <0x1f>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2c>; + }; + + wsa881x@20170212 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170212>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2d>; + }; + + wsa881x@21170213 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170213>; + qcom,spkr-sd-n-node = <0x1f>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2e>; + }; + + wsa881x@21170214 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170214>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2f>; + }; + }; + }; + + va-macro@62770000 { + compatible = "qcom,va-macro"; + reg = <0x62770000 0x0>; + clock-names = "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0>; + qcom,va-clk-mux-select = <0x1>; + qcom,va-island-mode-muxsel = <0x627a0000>; + qcom,va-dmic-sample-rate = <0x927c0>; + qcom,default-clk-id = <0x0>; + phandle = <0xb8>; + }; + + wcd938x-codec { + compatible = "qcom,wcd938x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x0 0x13 0x2 0x0 0x13 0x1 0x14 0x1 0x0 0x14 0x1 0x15 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x2 0x18 0x4 0x0 0x18 0x2 0x19 0x8 0x0 0x19 0x3 0x1a 0x1 0x0 0x1a 0x3 0x1b 0x2 0x0 0x1b 0x3 0x1c 0x4 0x0 0x1c 0x3 0x1d 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x21>; + qcom,rx-slave = <0x22>; + qcom,tx-slave = <0x23>; + cdc-vdd-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-rxtx-current = <0x7530>; + cdc-vddio-supply = <0xffffffff>; + qcom,cdc-vddio-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddio-current = <0x7530>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0xaf0>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-micbias4-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-rxtx", "cdc-vddio", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + mbhc-button-thres = <0x24 0xd 0x3f 0x24 0x58 0x8a 0x24 0x8a 0x8a 0x24 0xe1 0xe1 0x24 0x1c2 0x1c2 0x24 0x1c2 0x26c 0x24 0x1c2 0x26c 0x24 0x1c2 0x26c>; + imp-table = <0x25 0x0 0x5 0x6 0x25 0x6 0x17 0x8 0x25 0x18 0x26 0x7 0x25 0x27 0x64 0x6 0x25 0x65 0xa0 0xa 0x25 0xa1 0x190 0xb 0x25 0x191 0x7d0 0xb 0x25 0x7d1 0x7fffffff 0x6>; + phandle = <0x30>; + }; + + wcd937x-codec { + status = "disabled"; + compatible = "qcom,wcd937x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x1 0x13 0x1 0x0 0x14 0x1 0x14 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x3 0x18 0x1 0x0 0x1a 0x3 0x19 0x2 0x0 0x1b 0x3 0x1a 0x4 0x0 0x1c 0x3 0x1b 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x21>; + qcom,rx-slave = <0x26>; + qcom,tx-slave = <0x27>; + cdc-vdd-ldo-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-ldo-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-ldo-rxtx-current = <0x61a8>; + cdc-vddpx-1-supply = <0xffffffff>; + qcom,cdc-vddpx-1-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddpx-1-current = <0x2710>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0x708>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-ldo-rxtx", "cdc-vddpx-1", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + phandle = <0xb9>; + }; + }; + }; + + fragment@29 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,msm-mi2s-master = <0x1 0x1 0x1 0x1 0x1 0x1>; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS4", "MIC BIAS4", "Analog Mic4", "TX DMIC0", "MIC BIAS1", "MIC BIAS1", "Digital Mic0", "TX DMIC1", "MIC BIAS1", "MIC BIAS1", "Digital Mic1", "TX DMIC2", "MIC BIAS3", "MIC BIAS3", "Digital Mic2", "TX DMIC3", "MIC BIAS3", "MIC BIAS3", "Digital Mic3", "TX DMIC4", "MIC BIAS4", "MIC BIAS4", "Digital Mic4", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "IN3_AUX", "AUX_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "TX SWR_DMIC0", "DMIC1_OUTPUT", "TX SWR_DMIC1", "DMIC2_OUTPUT", "TX SWR_DMIC2", "DMIC3_OUTPUT", "TX SWR_DMIC3", "DMIC4_OUTPUT", "TX SWR_DMIC4", "DMIC5_OUTPUT", "TX SWR_DMIC5", "DMIC6_OUTPUT", "TX SWR_DMIC6", "DMIC7_OUTPUT", "TX SWR_DMIC7", "DMIC8_OUTPUT", "WSA SRC0_INP", "SRC0", "WSA_TX DEC0_INP", "TX DEC0 MUX", "WSA_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "SpkrLeft IN", "WSA_SPK1 OUT", "SpkrRight IN", "WSA_SPK2 OUT", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA MIC BIAS1", "Digital Mic0", "VA MIC BIAS1", "Digital Mic1", "VA MIC BIAS3", "Digital Mic2", "VA MIC BIAS3", "Digital Mic3", "VA MIC BIAS4", "Digital Mic4", "VA DMIC0", "VA MIC BIAS1", "VA DMIC1", "VA MIC BIAS1", "VA DMIC2", "VA MIC BIAS3", "VA DMIC3", "VA MIC BIAS3", "VA DMIC4", "VA MIC BIAS4", "VA SWR_ADC0", "VA_SWR_CLK", "VA SWR_ADC1", "VA_SWR_CLK", "VA SWR_ADC2", "VA_SWR_CLK", "VA SWR_ADC3", "VA_SWR_CLK", "VA SWR_MIC0", "VA_SWR_CLK", "VA SWR_MIC1", "VA_SWR_CLK", "VA SWR_MIC2", "VA_SWR_CLK", "VA SWR_MIC3", "VA_SWR_CLK", "VA SWR_MIC4", "VA_SWR_CLK", "VA SWR_MIC5", "VA_SWR_CLK", "VA SWR_MIC6", "VA_SWR_CLK", "VA SWR_MIC7", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT", "VA SWR_MIC0", "DMIC1_OUTPUT", "VA SWR_MIC1", "DMIC2_OUTPUT", "VA SWR_MIC2", "DMIC3_OUTPUT", "VA SWR_MIC3", "DMIC4_OUTPUT", "VA SWR_MIC4", "DMIC5_OUTPUT", "VA SWR_MIC5", "DMIC6_OUTPUT", "VA SWR_MIC6", "DMIC7_OUTPUT", "VA SWR_MIC7", "DMIC8_OUTPUT"; + qcom,msm-mbhc-hphl-swh = <0x1>; + qcom,msm-mbhc-gnd-swh = <0x1>; + qcom,cdc-dmic01-gpios = <0x28>; + qcom,cdc-dmic23-gpios = <0x29>; + qcom,cdc-dmic45-gpios = <0x2a>; + asoc-codec = <0xffffffff 0xffffffff 0x2b>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec", "msm-ext-disp-audio-codec-rx"; + qcom,wsa-max-devs = <0x2>; + qcom,wsa-devs = <0x2c 0x2d 0x2e 0x2f>; + qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight", "SpkrLeft", "SpkrRight"; + qcom,codec-max-aux-devs = <0x1>; + qcom,codec-aux-devs = <0x30>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x31 0xffffffff>; + }; + }; + + fragment@30 { + target = <0xffffffff>; + + __overlay__ { + + cdc_dmic01_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x32 0x33>; + pinctrl-1 = <0x34 0x35>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x28>; + }; + + cdc_dmic23_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x36 0x37>; + pinctrl-1 = <0x38 0x39>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x29>; + }; + + cdc_dmic45_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3a 0x3b>; + pinctrl-1 = <0x3c 0x3d>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2a>; + }; + + wsa_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3e 0x3f>; + pinctrl-1 = <0x40 0x41>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x1e>; + }; + + rx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x42 0x43>; + pinctrl-1 = <0x44 0x45>; + qcom,lpi-gpios; + phandle = <0x1d>; + }; + + tx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x46 0x47 0x48 0x49>; + pinctrl-1 = <0x4a 0x4b 0x4c 0x4d>; + qcom,lpi-gpios; + qcom,chip-wakeup-reg = <0x1ffb000>; + qcom,chip-wakeup-maskbit = <0x0>; + qcom,chip-wakeup-default-val = <0x1>; + phandle = <0x1c>; + }; + }; + }; + + fragment@31 { + target = <0xffffffff>; + + __overlay__ { + + wsa_spkr_en1_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x1f>; + }; + + wsa_spkr_en2_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x20>; + }; + + msm_cdc_pinctrl@58 { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + phandle = <0x21>; + }; + + wsa_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x3>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x309>; + #clock-cells = <0x1>; + phandle = <0x18>; + }; + + wsa_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x4>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30a>; + #clock-cells = <0x1>; + phandle = <0x19>; + }; + + rx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x5>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30e>; + #clock-cells = <0x1>; + phandle = <0x16>; + }; + + rx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x6>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30f>; + #clock-cells = <0x1>; + phandle = <0x17>; + }; + + tx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x7>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30c>; + #clock-cells = <0x1>; + phandle = <0x14>; + }; + + tx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x8>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30d>; + #clock-cells = <0x1>; + phandle = <0x15>; + }; + + va_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x2>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30b>; + #clock-cells = <0x1>; + phandle = <0x1a>; + }; + + va_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0xa>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x310>; + #clock-cells = <0x1>; + phandle = <0x1b>; + }; + }; + }; + + fragment@32 { + target = <0xffffffff>; + + __overlay__ { + qcom,msm-dai-is-island-supported = <0x1>; + }; + }; + + fragment@33 { + target = <0xffffffff>; + + __overlay__ { + hsuart8 = "/soc/qcom,qup_hsuart@a88000"; + }; + }; + + fragment@34 { + target = <0xffffffff>; + + __overlay__ { + + qcom,qup_hsuart@a88000 { + compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; + reg = <0xa88000 0x4000>; + reg-names = "se_phys"; + clock-names = "se-clk", "m-ahb", "s-ahb"; + clocks = <0xffffffff 0x50 0xffffffff 0x5a 0xffffffff 0x5b>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4e 0x4f>; + pinctrl-1 = <0x50 0x51>; + interrupts = <0x0 0x163 0x0>; + qcom,wrapper-core = <0xffffffff>; + always-on-clock; + status = "ok"; + phandle = <0xba>; + }; + }; + }; + + fragment@35 { + target = <0xffffffff>; + + __overlay__ { + + qupv3_se8_2hsuart_pins { + phandle = <0xbb>; + + qupv3_se8_2uart_tx_active { + phandle = <0x4e>; + + mux { + pins = "gpio44"; + function = "qup12"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_rx_active { + phandle = <0x4f>; + + mux { + pins = "gpio45"; + function = "qup12"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_tx_sleep { + phandle = <0x50>; + + mux { + pins = "gpio44"; + function = "gpio"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + input-enable; + }; + }; + + qupv3_se8_2uart_rx_sleep { + phandle = <0x51>; + + mux { + pins = "gpio45"; + function = "gpio"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@36 { + target = <0xffffffff>; + + __overlay__ { + + dcc_curr_link@3 { + qcom,curr-link-list = <0x3>; + qcom,data-sink = "sram"; + qcom,link-list = <0x0 0x18000024 0x1 0x0 0x0 0x18000040 0x1 0x0 0x0 0x18010024 0x1 0x0 0x0 0x18010040 0x1 0x0 0x0 0x18020024 0x1 0x0 0x0 0x18020040 0x1 0x0 0x0 0x18030024 0x1 0x0 0x0 0x18030040 0x1 0x0 0x0 0x18040024 0x1 0x0 0x0 0x18040040 0x1 0x0 0x0 0x18050024 0x1 0x0 0x0 0x18050040 0x1 0x0 0x0 0x18060024 0x1 0x0 0x0 0x18060040 0x1 0x0 0x0 0x18070024 0x1 0x0 0x0 0x18070040 0x1 0x0 0x0 0x18080024 0x1 0x0 0x0 0x18080040 0x1 0x0 0x0 0x180800f8 0x1 0x0 0x0 0x18080104 0x1 0x0 0x0 0x1808011c 0x1 0x0 0x0 0x18080128 0x1 0x0 0x0 0x18321700 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18325f00 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x18321818 0x1 0x0 0x0 0x18323818 0x1 0x0 0x0 0x18326018 0x1 0x0 0x0 0x18321920 0x1 0x0 0x0 0x1832102c 0x1 0x0 0x0 0x18321044 0x1 0x0 0x0 0x18321710 0x1 0x0 0x0 0x1832176c 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18323920 0x1 0x0 0x0 0x1832302c 0x1 0x0 0x0 0x18323044 0x1 0x0 0x0 0x18323710 0x1 0x0 0x0 0x1832376c 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18326120 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18325844 0x1 0x0 0x0 0x18325f10 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280000 0x2 0x0 0x0 0x18282000 0x2 0x0 0x0 0x18284000 0x2 0x0 0x0 0x9680000 0x1 0x0 0x0 0x9680004 0x1 0x0 0x2 0x8 0x0 0x0 0x0 0x9681000 0x1 0x0 0x2 0x1 0x0 0x0 0x0 0x9681004 0x1 0x0 0x0 0x9681008 0x1 0x0 0x0 0x968100c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9698500 0x1 0x0 0x0 0x9698504 0x1 0x0 0x0 0x9698508 0x1 0x0 0x0 0x969850c 0x1 0x0 0x0 0x9698510 0x1 0x0 0x0 0x9698514 0x1 0x0 0x0 0x9698518 0x1 0x0 0x0 0x969851c 0x1 0x0 0x0 0x9698700 0x1 0x0 0x0 0x9698704 0x1 0x0 0x0 0x9698708 0x1 0x0 0x0 0x969870c 0x1 0x0 0x0 0x9698714 0x1 0x0 0x0 0x9698718 0x1 0x0 0x0 0x969871c 0x1 0x0 0x0 0x1620204 0x1 0x0 0x0 0x1620240 0x1 0x0 0x0 0x1620248 0x1 0x0 0x0 0x1620288 0x1 0x0 0x0 0x162028c 0x1 0x0 0x0 0x1620290 0x1 0x0 0x0 0x1620294 0x1 0x0 0x0 0x16202a8 0x1 0x0 0x0 0x16202ac 0x1 0x0 0x0 0x16202b0 0x1 0x0 0x0 0x16202b4 0x1 0x0 0x0 0x1620300 0x1 0x0 0x0 0x16e0404 0x1 0x0 0x0 0x16e0408 0x1 0x0 0x0 0x16e0410 0x1 0x0 0x0 0x16e0420 0x1 0x0 0x0 0x16e0424 0x1 0x0 0x0 0x16e0428 0x1 0x0 0x0 0x16e042c 0x1 0x0 0x0 0x16e0430 0x1 0x0 0x0 0x16e0434 0x1 0x0 0x0 0x16e0438 0x1 0x0 0x0 0x16e043c 0x1 0x0 0x0 0x16e0300 0x1 0x0 0x0 0x16e0304 0x1 0x0 0x0 0x16e0700 0x1 0x0 0x0 0x16e0704 0x1 0x0 0x0 0x1700c00 0x1 0x0 0x0 0x1700c08 0x1 0x0 0x0 0x1700c10 0x1 0x0 0x0 0x1700c20 0x1 0x0 0x0 0x1700c24 0x1 0x0 0x0 0x1700c28 0x1 0x0 0x0 0x1700c2c 0x1 0x0 0x0 0x1700c30 0x1 0x0 0x0 0x1700c34 0x1 0x0 0x0 0x1700c38 0x1 0x0 0x0 0x1700c3c 0x1 0x0 0x0 0x1700300 0x1 0x0 0x0 0x1700304 0x1 0x0 0x0 0x1700308 0x1 0x0 0x0 0x170030c 0x1 0x0 0x0 0x1700310 0x1 0x0 0x0 0x1700500 0x1 0x0 0x0 0x1700504 0x1 0x0 0x0 0x1700508 0x1 0x0 0x0 0x170050c 0x1 0x0 0x0 0x1700900 0x1 0x0 0x0 0x1700904 0x1 0x0 0x0 0x1700908 0x1 0x0 0x0 0x1740004 0x1 0x0 0x0 0x1740008 0x1 0x0 0x0 0x1740010 0x1 0x0 0x0 0x1740020 0x1 0x0 0x0 0x1740024 0x1 0x0 0x0 0x1740028 0x1 0x0 0x0 0x174002c 0x1 0x0 0x0 0x1740030 0x1 0x0 0x0 0x1740034 0x1 0x0 0x0 0x1740038 0x1 0x0 0x0 0x174003c 0x1 0x0 0x0 0x1740300 0x1 0x0 0x0 0x1740304 0x1 0x0 0x0 0x1740308 0x1 0x0 0x0 0x174030c 0x1 0x0 0x0 0x1740310 0x1 0x0 0x0 0x1740314 0x1 0x0 0x0 0x9698204 0x1 0x0 0x0 0x9698240 0x1 0x0 0x0 0x9698244 0x1 0x0 0x0 0x9698248 0x1 0x0 0x0 0x969824c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x9681018 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9160204 0x1 0x0 0x0 0x9160240 0x1 0x0 0x0 0x9160248 0x1 0x0 0x0 0x9160288 0x1 0x0 0x0 0x9160290 0x1 0x0 0x0 0x9160300 0x1 0x0 0x0 0x9160304 0x1 0x0 0x0 0x9160308 0x1 0x0 0x0 0x916030c 0x1 0x0 0x0 0x9160310 0x1 0x0 0x0 0x9160314 0x1 0x0 0x0 0x9160318 0x1 0x0 0x0 0x9160008 0x1 0x0 0x0 0x9160010 0x1 0x0 0x0 0x9160020 0x1 0x0 0x0 0x9160024 0x1 0x0 0x0 0x9160028 0x1 0x0 0x0 0x916002c 0x1 0x0 0x0 0x9160030 0x1 0x0 0x0 0x9160034 0x1 0x0 0x0 0x9160038 0x1 0x0 0x0 0x916003c 0x1 0x0 0x0 0x63042680 0x1 0x0 0x0 0x63042684 0x1 0x0 0x0 0x63042688 0x1 0x0 0x0 0x63042690 0x1 0x0 0x0 0x630426a0 0x1 0x0 0x0 0x630426a4 0x1 0x0 0x0 0x630426a8 0x1 0x0 0x0 0x630426ac 0x1 0x0 0x0 0x630426b0 0x1 0x0 0x0 0x630426b4 0x1 0x0 0x0 0x630426b8 0x1 0x0 0x0 0x630426bc 0x1 0x0 0x0 0x63041900 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x1620500 0x4 0x0 0x0 0x1620700 0x4 0x0 0x0 0x1620300 0x1 0x0 0x0 0x1620f00 0x2 0x0 0x0 0x1620b00 0x2 0x0 0x0 0x1700b00 0x2 0x0 0x0 0x1700700 0x3 0x0 0x0 0x9163100 0x1 0x0 0x0 0x96aa100 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x9991500 0x8 0x0 0x0 0x9050008 0x1 0x0 0x0 0x9050078 0x1 0x0 0x0 0x9236028 0x1 0x0 0x0 0x923602c 0x1 0x0 0x0 0x9236030 0x1 0x0 0x0 0x9236034 0x1 0x0 0x0 0x9236038 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x92360b0 0x1 0x0 0x0 0x9236044 0x1 0x0 0x0 0x9236048 0x1 0x0 0x0 0x923604c 0x1 0x0 0x0 0x9236050 0x1 0x0 0x0 0x923e030 0x1 0x0 0x0 0x923e034 0x1 0x0 0x0 0x9241000 0x1 0x0 0x0 0x9248058 0x1 0x0 0x0 0x924805c 0x1 0x0 0x0 0x9248060 0x1 0x0 0x0 0x9248064 0x1 0x0 0x0 0x9260410 0x1 0x0 0x0 0x92e0410 0x1 0x0 0x0 0x9260414 0x1 0x0 0x0 0x92e0414 0x1 0x0 0x0 0x9260418 0x1 0x0 0x0 0x92e0418 0x1 0x0 0x0 0x9260420 0x1 0x0 0x0 0x9260424 0x1 0x0 0x0 0x9260430 0x1 0x0 0x0 0x9260440 0x1 0x0 0x0 0x9260448 0x1 0x0 0x0 0x92604a0 0x1 0x0 0x0 0x92604b0 0x1 0x0 0x0 0x92604d0 0x2 0x0 0x0 0x9261440 0x1 0x0 0x0 0x92e0420 0x1 0x0 0x0 0x92e0424 0x1 0x0 0x0 0x92e0430 0x1 0x0 0x0 0x92e0440 0x1 0x0 0x0 0x92e0448 0x1 0x0 0x0 0x92e04a0 0x1 0x0 0x0 0x92e04b0 0x1 0x0 0x0 0x92e04d0 0x2 0x0 0x0 0x9600000 0x1 0x0 0x0 0x9601000 0x1 0x0 0x0 0x9602000 0x1 0x0 0x0 0x9603000 0x1 0x0 0x0 0x9604000 0x1 0x0 0x0 0x9605000 0x1 0x0 0x0 0x9606000 0x1 0x0 0x0 0x9607000 0x1 0x0 0x0 0x9608000 0x1 0x0 0x0 0x9609000 0x1 0x0 0x0 0x960a000 0x1 0x0 0x0 0x960b000 0x1 0x0 0x0 0x960c000 0x1 0x0 0x0 0x960d000 0x1 0x0 0x0 0x960e000 0x1 0x0 0x0 0x960f000 0x1 0x0 0x0 0x9610000 0x1 0x0 0x0 0x9611000 0x1 0x0 0x0 0x9612000 0x1 0x0 0x0 0x9613000 0x1 0x0 0x0 0x9614000 0x1 0x0 0x0 0x9615000 0x1 0x0 0x0 0x9616000 0x1 0x0 0x0 0x9617000 0x1 0x0 0x0 0x9618000 0x1 0x0 0x0 0x9619000 0x1 0x0 0x0 0x961a000 0x1 0x0 0x0 0x961b000 0x1 0x0 0x0 0x961c000 0x1 0x0 0x0 0x961d000 0x1 0x0 0x0 0x961e000 0x1 0x0 0x0 0x961f000 0x1 0x0 0x0 0x9600004 0x1 0x0 0x0 0x9601004 0x1 0x0 0x0 0x9602004 0x1 0x0 0x0 0x9603004 0x1 0x0 0x0 0x9604004 0x1 0x0 0x0 0x9605004 0x1 0x0 0x0 0x9606004 0x1 0x0 0x0 0x9607004 0x1 0x0 0x0 0x9608004 0x1 0x0 0x0 0x9609004 0x1 0x0 0x0 0x960a004 0x1 0x0 0x0 0x960b004 0x1 0x0 0x0 0x960c004 0x1 0x0 0x0 0x960d004 0x1 0x0 0x0 0x960e004 0x1 0x0 0x0 0x960f004 0x1 0x0 0x0 0x9610004 0x1 0x0 0x0 0x9611004 0x1 0x0 0x0 0x9612004 0x1 0x0 0x0 0x9613004 0x1 0x0 0x0 0x9614004 0x1 0x0 0x0 0x9615004 0x1 0x0 0x0 0x9616004 0x1 0x0 0x0 0x9617004 0x1 0x0 0x0 0x9618004 0x1 0x0 0x0 0x9619004 0x1 0x0 0x0 0x961a004 0x1 0x0 0x0 0x961b004 0x1 0x0 0x0 0x961c004 0x1 0x0 0x0 0x961d004 0x1 0x0 0x0 0x961e004 0x1 0x0 0x0 0x961f004 0x1 0x0 0x0 0x9266418 0x1 0x0 0x0 0x92e6418 0x1 0x0 0x0 0x9265804 0x1 0x0 0x0 0x92e5804 0x1 0x0 0x0 0x92604b8 0x1 0x0 0x0 0x92e04b8 0x1 0x0 0x0 0xc201244 0x1 0x0 0x0 0xc202244 0x1 0x0 0x0 0x18100c18 0x1 0x0 0x0 0x18101c18 0x1 0x0 0x0 0x18300000 0x1 0x0 0x0 0x183a3a84 0x2 0x0 0x0 0x18393a84 0x1 0x0 0x0 0x100000 0x1 0x0 0x0 0x100004 0x1 0x0 0x0 0x100008 0x1 0x0 0x0 0x10000c 0x1 0x0 0x0 0x100010 0x1 0x0 0x0 0x100014 0x1 0x0 0x0 0x100018 0x1 0x0 0x0 0x10001c 0x1 0x0 0x0 0x100020 0x1 0x0 0x0 0x100024 0x1 0x0 0x0 0x100028 0x1 0x0 0x0 0x10002c 0x1 0x0 0x0 0x100030 0x1 0x0 0x0 0x100034 0x1 0x0 0x0 0x100100 0x1 0x0 0x0 0x100104 0x1 0x0 0x0 0x100108 0x1 0x0 0x0 0x10010c 0x1 0x0 0x0 0x101000 0x1 0x0 0x0 0x101004 0x1 0x0 0x0 0x101008 0x1 0x0 0x0 0x10100c 0x1 0x0 0x0 0x101010 0x1 0x0 0x0 0x101014 0x1 0x0 0x0 0x101018 0x1 0x0 0x0 0x10101c 0x1 0x0 0x0 0x101020 0x1 0x0 0x0 0x101024 0x1 0x0 0x0 0x101028 0x1 0x0 0x0 0x10102c 0x1 0x0 0x0 0x101030 0x1 0x0 0x0 0x101034 0x1 0x0 0x0 0x102000 0x1 0x0 0x0 0x102004 0x1 0x0 0x0 0x102008 0x1 0x0 0x0 0x10200c 0x1 0x0 0x0 0x102010 0x1 0x0 0x0 0x102014 0x1 0x0 0x0 0x102018 0x1 0x0 0x0 0x10201c 0x1 0x0 0x0 0x102020 0x1 0x0 0x0 0x102024 0x1 0x0 0x0 0x102028 0x1 0x0 0x0 0x10202c 0x1 0x0 0x0 0x102030 0x1 0x0 0x0 0x102034 0x1 0x0 0x0 0x103000 0x1 0x0 0x0 0x103004 0x1 0x0 0x0 0x103008 0x1 0x0 0x0 0x10300c 0x1 0x0 0x0 0x103010 0x1 0x0 0x0 0x103014 0x1 0x0 0x0 0x103018 0x1 0x0 0x0 0x10301c 0x1 0x0 0x0 0x103020 0x1 0x0 0x0 0x103024 0x1 0x0 0x0 0x103028 0x1 0x0 0x0 0x10302c 0x1 0x0 0x0 0x103030 0x1 0x0 0x0 0x103034 0x1 0x0 0x0 0x113000 0x1 0x0 0x0 0x113004 0x1 0x0 0x0 0x113008 0x1 0x0 0x0 0x11300c 0x1 0x0 0x0 0x113010 0x1 0x0 0x0 0x113014 0x1 0x0 0x0 0x113018 0x1 0x0 0x0 0x11301c 0x1 0x0 0x0 0x113020 0x1 0x0 0x0 0x113024 0x1 0x0 0x0 0x113028 0x1 0x0 0x0 0x11302c 0x1 0x0 0x0 0x113030 0x1 0x0 0x0 0x113034 0x1 0x0 0x0 0x11a000 0x1 0x0 0x0 0x11a004 0x1 0x0 0x0 0x11a008 0x1 0x0 0x0 0x11a00c 0x1 0x0 0x0 0x11a010 0x1 0x0 0x0 0x11a014 0x1 0x0 0x0 0x11a018 0x1 0x0 0x0 0x11a01c 0x1 0x0 0x0 0x11a020 0x1 0x0 0x0 0x11a024 0x1 0x0 0x0 0x11a028 0x1 0x0 0x0 0x11a02c 0x1 0x0 0x0 0x11a030 0x1 0x0 0x0 0x11a034 0x1 0x0 0x0 0x11b000 0x1 0x0 0x0 0x11b004 0x1 0x0 0x0 0x11b008 0x1 0x0 0x0 0x11b00c 0x1 0x0 0x0 0x11b010 0x1 0x0 0x0 0x11b014 0x1 0x0 0x0 0x11b018 0x1 0x0 0x0 0x11b01c 0x1 0x0 0x0 0x11b020 0x1 0x0 0x0 0x11b024 0x1 0x0 0x0 0x11b028 0x1 0x0 0x0 0x11b02c 0x1 0x0 0x0 0x11b030 0x1 0x0 0x0 0x11b034 0x1 0x0 0x0 0x174000 0x1 0x0 0x0 0x174004 0x1 0x0 0x0 0x174008 0x1 0x0 0x0 0x17400c 0x1 0x0 0x0 0x174010 0x1 0x0 0x0 0x174014 0x1 0x0 0x0 0x174018 0x1 0x0 0x0 0x17401c 0x1 0x0 0x0 0x174020 0x1 0x0 0x0 0x174024 0x1 0x0 0x0 0x174028 0x1 0x0 0x0 0x17402c 0x1 0x0 0x0 0x174030 0x1 0x0 0x0 0x174034 0x1 0x0 0x0 0x176000 0x1 0x0 0x0 0x176004 0x1 0x0 0x0 0x176008 0x1 0x0 0x0 0x17600c 0x1 0x0 0x0 0x176010 0x1 0x0 0x0 0x176014 0x1 0x0 0x0 0x176018 0x1 0x0 0x0 0x17601c 0x1 0x0 0x0 0x176020 0x1 0x0 0x0 0x176024 0x1 0x0 0x0 0x176028 0x1 0x0 0x0 0x17602c 0x1 0x0 0x0 0x176030 0x1 0x0 0x0 0x176034 0x1 0x0 0x0 0x10401c 0x1 0x0 0x0 0x183024 0x1 0x0 0x0 0x144168 0x1 0x0 0x0 0x11702c 0x1 0x0 0x0 0x10904c 0x1 0x0 0x0 0x189038 0x1 0x0 0x0 0x1443e8 0x1 0x0 0x0 0x1442b8 0x1 0x0 0x0 0x105060 0x1 0x0 0x0 0x141024 0x1 0x0 0x0 0x145038 0x1 0x0 0x0 0x109004 0x1 0x0 0x0 0x189004 0x1 0x0 0x0 0x190004 0x1 0x0 0x0 0xc2a0000 0x1 0x0 0x0 0xc2a0004 0x1 0x0 0x0 0xc2a0008 0x1 0x0 0x0 0xc2a000c 0x1 0x0 0x0 0xc2a0010 0x1 0x0 0x0 0xc2a0014 0x1 0x0 0x0 0xc2a0018 0x1 0x0 0x0 0xc2a001c 0x1 0x0 0x0 0xc2a0020 0x1 0x0 0x0 0xc2a0024 0x1 0x0 0x0 0xc2a0028 0x1 0x0 0x0 0xc2a002c 0x1 0x0 0x0 0xc2a0030 0x1 0x0 0x0 0xc2a0034 0x1 0x0 0x0 0xc2a1000 0x1 0x0 0x0 0xc2a1004 0x1 0x0 0x0 0xc2a1008 0x1 0x0 0x0 0xc2a100c 0x1 0x0 0x0 0xc2a1010 0x1 0x0 0x0 0xc2a1014 0x1 0x0 0x0 0xc2a1018 0x1 0x0 0x0 0xc2a101c 0x1 0x0 0x0 0xc2a1020 0x1 0x0 0x0 0xc2a1024 0x1 0x0 0x0 0xc2a1028 0x1 0x0 0x0 0xc2a102c 0x1 0x0 0x0 0xc2a1030 0x1 0x0 0x0 0xc2a2260 0x1 0x0 0x0 0xc2a2264 0x1 0x0 0x0 0xc2a3008 0x1 0x0 0x0 0xc2a300c 0x1 0x0 0x0 0xc2a3010 0x1 0x0 0x0 0xc2a3014 0x1 0x0 0x0 0xc2a3024 0x1 0x0 0x0 0xc2a2034 0x1 0x0 0x0 0xc2a214c 0x1 0x0 0x0 0xc2a2150 0x1 0x0 0x0 0xc2a2154 0x1 0x0 0x0 0x28206c 0x1 0x0 0x0 0x18282004 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x1808012c 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280004 0x1 0x0 0x0 0x18284038 0x1 0x0 0x0 0x18284000 0x2 0x0 0x0 0x90c012c 0x1 0x0 0x0 0x9222408 0x1 0x0 0x0 0x9220344 0x2 0x0 0x0 0x9220480 0x1 0x0 0x0 0x922358c 0x1 0x0 0x0 0x9222398 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x923201c 0x5 0x0 0x0 0x9232050 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x9186048 0x1 0x0 0x0 0x9186054 0x1 0x0 0x0 0x9186164 0x1 0x0 0x0 0x9186170 0x1 0x0 0x0 0xc2630a0 0x4 0x0 0x0 0xc2630b0 0x4 0x0 0x0 0xc2630c0 0x4 0x0 0x0 0xc2630d0 0x4 0x0 0x0 0x18200400 0x1 0x0 0x0 0x18200404 0x1 0x0 0x0 0x18200408 0x1 0x0 0x0 0x18200038 0x1 0x0 0x0 0x18200040 0x1 0x0 0x0 0x18200048 0x1 0x0 0x0 0x18220038 0x1 0x0 0x0 0x18220040 0x1 0x0 0x0 0x182200d0 0x1 0x0 0x0 0x18200030 0x1 0x0 0x0 0x18200010 0x1 0x0 0x0 0x1822000c 0x1 0x0 0x0 0x18220d14 0x1 0x0 0x0 0x18220fb4 0x1 0x0 0x0 0x18221254 0x1 0x0 0x0 0x182214f4 0x1 0x0 0x0 0x18221794 0x1 0x0 0x0 0x18221a34 0x1 0x0 0x0 0x18221cd4 0x1 0x0 0x0 0x18221f74 0x1 0x0 0x0 0x18220d18 0x1 0x0 0x0 0x18220fb8 0x1 0x0 0x0 0x18221258 0x1 0x0 0x0 0x182214f8 0x1 0x0 0x0 0x18221798 0x1 0x0 0x0 0x18221a38 0x1 0x0 0x0 0x18221cd8 0x1 0x0 0x0 0x18221f78 0x1 0x0 0x0 0x18220d00 0x1 0x0 0x0 0x18220d04 0x1 0x0 0x0 0x18220d1c 0x1 0x0 0x0 0x18220fbc 0x1 0x0 0x0 0x1822125c 0x1 0x0 0x0 0x182214fc 0x1 0x0 0x0 0x1822179c 0x1 0x0 0x0 0x18221a3c 0x1 0x0 0x0 0x18221cdc 0x1 0x0 0x0 0x18221f7c 0x1 0x0 0x0 0x18221274 0x1 0x0 0x0 0x18221288 0x1 0x0 0x0 0x1822129c 0x1 0x0 0x0 0x182212b0 0x1 0x0 0x0 0x182212c4 0x1 0x0 0x0 0x182212d8 0x1 0x0 0x0 0x182212ec 0x1 0x0 0x0 0x18221300 0x1 0x0 0x0 0x18221314 0x1 0x0 0x0 0x18221328 0x1 0x0 0x0 0x1822133c 0x1 0x0 0x0 0x18221350 0x1 0x0 0x0 0x18221364 0x1 0x0 0x0 0x18221378 0x1 0x0 0x0 0x1822138c 0x1 0x0 0x0 0x182213a0 0x1 0x0 0x0 0x18221514 0x1 0x0 0x0 0x18221528 0x1 0x0 0x0 0x1822153c 0x1 0x0 0x0 0x18221550 0x1 0x0 0x0 0x18221564 0x1 0x0 0x0 0x18221578 0x1 0x0 0x0 0x1822158c 0x1 0x0 0x0 0x182215a0 0x1 0x0 0x0 0x182215b4 0x1 0x0 0x0 0x182215c8 0x1 0x0 0x0 0x182215dc 0x1 0x0 0x0 0x182215f0 0x1 0x0 0x0 0x18221604 0x1 0x0 0x0 0x18221618 0x1 0x0 0x0 0x1822162c 0x1 0x0 0x0 0x18221640 0x1 0x0 0x0 0x182217b4 0x1 0x0 0x0 0x182217c8 0x1 0x0 0x0 0x182217dc 0x1 0x0 0x0 0x182217f0 0x1 0x0 0x0 0x18221804 0x1 0x0 0x0 0x18221818 0x1 0x0 0x0 0x1822182c 0x1 0x0 0x0 0x18221840 0x1 0x0 0x0 0x18221854 0x1 0x0 0x0 0x18221868 0x1 0x0 0x0 0x1822187c 0x1 0x0 0x0 0x18221890 0x1 0x0 0x0 0x182218a4 0x1 0x0 0x0 0x182218b8 0x1 0x0 0x0 0x182218cc 0x1 0x0 0x0 0x182218e0 0x1 0x0 0x0 0x18221a54 0x1 0x0 0x0 0x18221a68 0x1 0x0 0x0 0x18221a7c 0x1 0x0 0x0 0x18221a90 0x1 0x0 0x0 0x18221aa4 0x1 0x0 0x0 0x18221ab8 0x1 0x0 0x0 0x18221acc 0x1 0x0 0x0 0x18221ae0 0x1 0x0 0x0 0x18221af4 0x1 0x0 0x0 0x18221b08 0x1 0x0 0x0 0x18221b1c 0x1 0x0 0x0 0x18221b30 0x1 0x0 0x0 0x18221b44 0x1 0x0 0x0 0x18221b58 0x1 0x0 0x0 0x18221b6c 0x1 0x0 0x0 0x18221b80 0x1 0x0 0x0 0x18221cf4 0x1 0x0 0x0 0x18221d08 0x1 0x0 0x0 0x18221d1c 0x1 0x0 0x0 0x18221d30 0x1 0x0 0x0 0x18221d44 0x1 0x0 0x0 0x18221d58 0x1 0x0 0x0 0x18221d6c 0x1 0x0 0x0 0x18221d80 0x1 0x0 0x0 0x18221d94 0x1 0x0 0x0 0x18221da8 0x1 0x0 0x0 0x18221dbc 0x1 0x0 0x0 0x18221dd0 0x1 0x0 0x0 0x18221de4 0x1 0x0 0x0 0x18221df8 0x1 0x0 0x0 0x18221e0c 0x1 0x0 0x0 0x18221e20 0x1 0x0 0x0 0x18221f94 0x1 0x0 0x0 0x18221fa8 0x1 0x0 0x0 0x18221fbc 0x1 0x0 0x0 0x18221fd0 0x1 0x0 0x0 0x18221fe4 0x1 0x0 0x0 0x18221ff8 0x1 0x0 0x0 0x1822200c 0x1 0x0 0x0 0x18222020 0x1 0x0 0x0 0x18222034 0x1 0x0 0x0 0x18222048 0x1 0x0 0x0 0x1822205c 0x1 0x0 0x0 0x18222070 0x1 0x0 0x0 0x18222084 0x1 0x0 0x0 0x18222098 0x1 0x0 0x0 0x182220ac 0x1 0x0 0x0 0x182220c0 0x1 0x0 0x0 0x18221278 0x1 0x0 0x0 0x1822128c 0x1 0x0 0x0 0x182212a0 0x1 0x0 0x0 0x182212b4 0x1 0x0 0x0 0x182212c8 0x1 0x0 0x0 0x182212dc 0x1 0x0 0x0 0x182212f0 0x1 0x0 0x0 0x18221304 0x1 0x0 0x0 0x18221318 0x1 0x0 0x0 0x1822132c 0x1 0x0 0x0 0x18221340 0x1 0x0 0x0 0x18221354 0x1 0x0 0x0 0x18221368 0x1 0x0 0x0 0x1822137c 0x1 0x0 0x0 0x18221390 0x1 0x0 0x0 0x182213a4 0x1 0x0 0x0 0x18221518 0x1 0x0 0x0 0x1822152c 0x1 0x0 0x0 0x18221540 0x1 0x0 0x0 0x18221554 0x1 0x0 0x0 0x18221568 0x1 0x0 0x0 0x1822157c 0x1 0x0 0x0 0x18221590 0x1 0x0 0x0 0x182215a4 0x1 0x0 0x0 0x182215b8 0x1 0x0 0x0 0x182215cc 0x1 0x0 0x0 0x182215e0 0x1 0x0 0x0 0x182215f4 0x1 0x0 0x0 0x18221608 0x1 0x0 0x0 0x1822161c 0x1 0x0 0x0 0x18221630 0x1 0x0 0x0 0x18221644 0x1 0x0 0x0 0x182217b8 0x1 0x0 0x0 0x182217cc 0x1 0x0 0x0 0x182217e0 0x1 0x0 0x0 0x182217f4 0x1 0x0 0x0 0x18221808 0x1 0x0 0x0 0x1822181c 0x1 0x0 0x0 0x18221830 0x1 0x0 0x0 0x18221844 0x1 0x0 0x0 0x18221858 0x1 0x0 0x0 0x1822186c 0x1 0x0 0x0 0x18221880 0x1 0x0 0x0 0x18221894 0x1 0x0 0x0 0x182218a8 0x1 0x0 0x0 0x182218bc 0x1 0x0 0x0 0x182218d0 0x1 0x0 0x0 0x182218e4 0x1 0x0 0x0 0x18221a58 0x1 0x0 0x0 0x18221a6c 0x1 0x0 0x0 0x18221a80 0x1 0x0 0x0 0x18221a94 0x1 0x0 0x0 0x18221aa8 0x1 0x0 0x0 0x18221abc 0x1 0x0 0x0 0x18221ad0 0x1 0x0 0x0 0x18221ae4 0x1 0x0 0x0 0x18221af8 0x1 0x0 0x0 0x18221b0c 0x1 0x0 0x0 0x18221b20 0x1 0x0 0x0 0x18221b34 0x1 0x0 0x0 0x18221b48 0x1 0x0 0x0 0x18221b5c 0x1 0x0 0x0 0x18221b70 0x1 0x0 0x0 0x18221b84 0x1 0x0 0x0 0x18221cf8 0x1 0x0 0x0 0x18221d0c 0x1 0x0 0x0 0x18221d20 0x1 0x0 0x0 0x18221d34 0x1 0x0 0x0 0x18221d48 0x1 0x0 0x0 0x18221d5c 0x1 0x0 0x0 0x18221d70 0x1 0x0 0x0 0x18221d84 0x1 0x0 0x0 0x18221d98 0x1 0x0 0x0 0x18221dac 0x1 0x0 0x0 0x18221dc0 0x1 0x0 0x0 0x18221dd4 0x1 0x0 0x0 0x18221de8 0x1 0x0 0x0 0x18221dfc 0x1 0x0 0x0 0x18221e10 0x1 0x0 0x0 0x18221e24 0x1 0x0 0x0 0x18221f98 0x1 0x0 0x0 0x18221fac 0x1 0x0 0x0 0x18221fc0 0x1 0x0 0x0 0x18221fd4 0x1 0x0 0x0 0x18221fe8 0x1 0x0 0x0 0x18221ffc 0x1 0x0 0x0 0x18222010 0x1 0x0 0x0 0x18222024 0x1 0x0 0x0 0x18222038 0x1 0x0 0x0 0x1822204c 0x1 0x0 0x0 0x18222060 0x1 0x0 0x0 0x18222074 0x1 0x0 0x0 0x18222088 0x1 0x0 0x0 0x1822209c 0x1 0x0 0x0 0x182220b0 0x1 0x0 0x0 0x182220c4 0x1 0x0 0x0 0x105050 0x1 0x0 0x0 0x171004 0x1 0x0 0x0 0x171154 0x1 0x0 0x0 0x17100c 0x1 0x0 0x0 0x171018 0x1 0x0 0x0 0x5091004 0x1 0x0 0x0 0x509100c 0x1 0x0 0x0 0x5091010 0x1 0x0 0x0 0x5091014 0x1 0x0 0x0 0x5091054 0x1 0x0 0x0 0x5091060 0x1 0x0 0x0 0x509106c 0x1 0x0 0x0 0x5091070 0x1 0x0 0x0 0x5091074 0x1 0x0 0x0 0x5091078 0x1 0x0 0x0 0x509107c 0x1 0x0 0x0 0x509108c 0x1 0x0 0x0 0x5091098 0x1 0x0 0x0 0x509109c 0x1 0x0 0x0 0x1800005c 0x1 0x0 0x0 0x1801005c 0x1 0x0 0x0 0x1802005c 0x1 0x0 0x0 0x1803005c 0x1 0x0 0x0 0x1804005c 0x1 0x0 0x0 0x1805005c 0x1 0x0 0x0 0x1806005c 0x1 0x0 0x0 0x1807005c 0x1 0x0 0x0 0x17c0003c 0x1 0x0 0x1 0x6004fb0 0xc5acce55 0x0 0x1 0x600408c 0xff 0x0 0x1 0x6004fb0 0x0 0x0 0x0 0x62900010 0x1 0x0 0x0 0x62900014 0x1 0x0 0x0 0x62900018 0x1 0x0 0x0 0x62900030 0x1 0x0 0x0 0x62900038 0x1 0x0 0x0 0x62900040 0x1 0x0 0x0 0x62900048 0x1 0x0 0x0 0x629000d0 0x1 0x0 0x0 0x62900210 0x1 0x0 0x0 0x62900230 0x1 0x0 0x0 0x62900250 0x1 0x0 0x0 0x62900270 0x1 0x0 0x0 0x62900290 0x1 0x0 0x0 0x629002b0 0x1 0x0 0x0 0x62900208 0x1 0x0 0x0 0x62900228 0x1 0x0 0x0 0x62900248 0x1 0x0 0x0 0x62900268 0x1 0x0 0x0 0x62900288 0x1 0x0 0x0 0x629002a8 0x1 0x0 0x0 0x6290020c 0x1 0x0 0x0 0x6290022c 0x1 0x0 0x0 0x6290024c 0x1 0x0 0x0 0x6290026c 0x1 0x0 0x0 0x6290028c 0x1 0x0 0x0 0x629002ac 0x1 0x0 0x0 0x62900404 0x1 0x0 0x0 0x62900408 0x1 0x0 0x0 0x62900400 0x1 0x0 0x0 0x62900d04 0x1 0x0 0x0 0x624b0010 0x1 0x0 0x0 0x624b0014 0x1 0x0 0x0 0x624b0018 0x1 0x0 0x0 0x624b0210 0x1 0x0 0x0 0x624b0230 0x1 0x0 0x0 0x624b0250 0x1 0x0 0x0 0x624b0270 0x1 0x0 0x0 0x624b0290 0x1 0x0 0x0 0x624b02b0 0x1 0x0 0x0 0x624b0208 0x1 0x0 0x0 0x624b0228 0x1 0x0 0x0 0x624b0248 0x1 0x0 0x0 0x624b0268 0x1 0x0 0x0 0x624b0288 0x1 0x0 0x0 0x624b02a8 0x1 0x0 0x0 0x624b020c 0x1 0x0 0x0 0x624b022c 0x1 0x0 0x0 0x624b024c 0x1 0x0 0x0 0x624b026c 0x1 0x0 0x0 0x624b028c 0x1 0x0 0x0 0x624b02ac 0x1 0x0 0x0 0x624b0400 0x1 0x0 0x0 0x624b0404 0x1 0x0 0x0 0x624b0408 0x1 0x0 0x0 0x62402028 0x1 0x0 0x0 0xb254520 0x1 0x0 0x0 0xb251020 0x1 0x0 0x0 0xb251024 0x1 0x0 0x0 0xb251030 0x1 0x0 0x0 0xb251200 0x1 0x0 0x0 0xb251214 0x1 0x0 0x0 0xb251228 0x1 0x0 0x0 0xb25123c 0x1 0x0 0x0 0xb251250 0x1 0x0 0x0 0xb251204 0x1 0x0 0x0 0xb251218 0x1 0x0 0x0 0xb25122c 0x1 0x0 0x0 0xb251240 0x1 0x0 0x0 0xb251254 0x1 0x0 0x0 0xb251208 0x1 0x0 0x0 0xb25121c 0x1 0x0 0x0 0xb251230 0x1 0x0 0x0 0xb251244 0x1 0x0 0x0 0xb251258 0x1 0x0 0x0 0xb254510 0x1 0x0 0x0 0xb254514 0x1 0x0 0x0 0xb250010 0x1 0x0 0x0 0xb250014 0x1 0x0 0x0 0xb250900 0x1 0x0 0x0 0xb250904 0x1 0x0 0x0 0x4200010 0x1 0x0 0x0 0x4200014 0x1 0x0 0x0 0x4200018 0x1 0x0 0x0 0x4200030 0x1 0x0 0x0 0x4200038 0x1 0x0 0x0 0x4200040 0x1 0x0 0x0 0x4200048 0x1 0x0 0x0 0x42000d0 0x1 0x0 0x0 0x4200210 0x1 0x0 0x0 0x4200230 0x1 0x0 0x0 0x4200250 0x1 0x0 0x0 0x4200270 0x1 0x0 0x0 0x4200290 0x1 0x0 0x0 0x42002b0 0x1 0x0 0x0 0x4200208 0x1 0x0 0x0 0x4200228 0x1 0x0 0x0 0x4200248 0x1 0x0 0x0 0x4200268 0x1 0x0 0x0 0x4200288 0x1 0x0 0x0 0x42002a8 0x1 0x0 0x0 0x420020c 0x1 0x0 0x0 0x420022c 0x1 0x0 0x0 0x420024c 0x1 0x0 0x0 0x420026c 0x1 0x0 0x0 0x420028c 0x1 0x0 0x0 0x42002ac 0x1 0x0 0x0 0x4200404 0x1 0x0 0x0 0x4200408 0x1 0x0 0x0 0x4200400 0x1 0x0 0x0 0x4200d04 0x1 0x0 0x0 0x4130010 0x1 0x0 0x0 0x4130014 0x1 0x0 0x0 0x4130018 0x1 0x0 0x0 0x4130210 0x1 0x0 0x0 0x4130230 0x1 0x0 0x0 0x4130250 0x1 0x0 0x0 0x4130270 0x1 0x0 0x0 0x4130290 0x1 0x0 0x0 0x41302b0 0x1 0x0 0x0 0x4130208 0x1 0x0 0x0 0x4130228 0x1 0x0 0x0 0x4130248 0x1 0x0 0x0 0x4130268 0x1 0x0 0x0 0x4130288 0x1 0x0 0x0 0x41302a8 0x1 0x0 0x0 0x413020c 0x1 0x0 0x0 0x413022c 0x1 0x0 0x0 0x413024c 0x1 0x0 0x0 0x413026c 0x1 0x0 0x0 0x413028c 0x1 0x0 0x0 0x41302ac 0x1 0x0 0x0 0x4130400 0x1 0x0 0x0 0x4130404 0x1 0x0 0x0 0x4130408 0x1 0x0 0x0 0x4082028 0x1 0x0 0x0 0x18a008 0x1 0x0 0x0 0xb2c4520 0x1 0x0 0x0 0xb2c1020 0x1 0x0 0x0 0xb2c1024 0x1 0x0 0x0 0xb2c1030 0x1 0x0 0x0 0xb2c1200 0x1 0x0 0x0 0xb2c1214 0x1 0x0 0x0 0xb2c1228 0x1 0x0 0x0 0xb2c123c 0x1 0x0 0x0 0xb2c1250 0x1 0x0 0x0 0xb2c1204 0x1 0x0 0x0 0xb2c1218 0x1 0x0 0x0 0xb2c122c 0x1 0x0 0x0 0xb2c1240 0x1 0x0 0x0 0xb2c1254 0x1 0x0 0x0 0xb2c1208 0x1 0x0 0x0 0xb2c121c 0x1 0x0 0x0 0xb2c1230 0x1 0x0 0x0 0xb2c1244 0x1 0x0 0x0 0xb2c1258 0x1 0x0 0x0 0xb2c4510 0x1 0x0 0x0 0xb2c4514 0x1 0x0 0x0 0xb2c0010 0x1 0x0 0x0 0xb2c0014 0x1 0x0 0x0 0xb2c0900 0x1 0x0 0x0 0xb2c0904 0x1 0x0 0x0 0x80a4010 0x1 0x0 0x0 0x80a4014 0x1 0x0 0x0 0x80a4018 0x1 0x0 0x0 0x80a4030 0x1 0x0 0x0 0x80a4038 0x1 0x0 0x0 0x80a4040 0x1 0x0 0x0 0x80a4048 0x1 0x0 0x0 0x80a40d0 0x1 0x0 0x0 0x80a4210 0x1 0x0 0x0 0x80a4230 0x1 0x0 0x0 0x80a4250 0x1 0x0 0x0 0x80a4270 0x1 0x0 0x0 0x80a4290 0x1 0x0 0x0 0x80a42b0 0x1 0x0 0x0 0x80a4208 0x1 0x0 0x0 0x80a4228 0x1 0x0 0x0 0x80a4248 0x1 0x0 0x0 0x80a4268 0x1 0x0 0x0 0x80a4288 0x1 0x0 0x0 0x80a42a8 0x1 0x0 0x0 0x80a420c 0x1 0x0 0x0 0x80a422c 0x1 0x0 0x0 0x80a424c 0x1 0x0 0x0 0x80a426c 0x1 0x0 0x0 0x80a428c 0x1 0x0 0x0 0x80a42ac 0x1 0x0 0x0 0x80a4404 0x1 0x0 0x0 0x80a4408 0x1 0x0 0x0 0x80a4400 0x1 0x0 0x0 0x80a4d04 0x1 0x0 0x0 0x83b0010 0x1 0x0 0x0 0x83b0014 0x1 0x0 0x0 0x83b0018 0x1 0x0 0x0 0x83b0210 0x1 0x0 0x0 0x83b0230 0x1 0x0 0x0 0x83b0250 0x1 0x0 0x0 0x83b0270 0x1 0x0 0x0 0x83b0290 0x1 0x0 0x0 0x83b02b0 0x1 0x0 0x0 0x83b0208 0x1 0x0 0x0 0x83b0228 0x1 0x0 0x0 0x83b0248 0x1 0x0 0x0 0x83b0268 0x1 0x0 0x0 0x83b0288 0x1 0x0 0x0 0x83b02a8 0x1 0x0 0x0 0x83b020c 0x1 0x0 0x0 0x83b022c 0x1 0x0 0x0 0x83b024c 0x1 0x0 0x0 0x83b026c 0x1 0x0 0x0 0x83b028c 0x1 0x0 0x0 0x83b02ac 0x1 0x0 0x0 0x83b0400 0x1 0x0 0x0 0x83b0404 0x1 0x0 0x0 0x83b0408 0x1 0x0 0x0 0x8302028 0x1 0x0 0x0 0xb2b4520 0x1 0x0 0x0 0xb2b1020 0x1 0x0 0x0 0xb2b1024 0x1 0x0 0x0 0xb2b1030 0x1 0x0 0x0 0xb2b1200 0x1 0x0 0x0 0xb2b1214 0x1 0x0 0x0 0xb2b1228 0x1 0x0 0x0 0xb2b123c 0x1 0x0 0x0 0xb2b1250 0x1 0x0 0x0 0xb2b1204 0x1 0x0 0x0 0xb2b1218 0x1 0x0 0x0 0xb2b122c 0x1 0x0 0x0 0xb2b1240 0x1 0x0 0x0 0xb2b1254 0x1 0x0 0x0 0xb2b1208 0x1 0x0 0x0 0xb2b121c 0x1 0x0 0x0 0xb2b1230 0x1 0x0 0x0 0xb2b1244 0x1 0x0 0x0 0xb2b1258 0x1 0x0 0x0 0xb2b4510 0x1 0x0 0x0 0xb2b4514 0x1 0x0 0x0 0xb2b0010 0x1 0x0 0x0 0xb2b0014 0x1 0x0 0x0 0xb2b0900 0x1 0x0 0x0 0xb2b0904 0x1 0x0 0x0 0x17a00204 0x1d 0x0>; + }; + }; + }; + + fragment@37 { + target = <0xffffffff>; + + __overlay__ { + + ss_plog@B4400000 { + compatible = "ss_plog"; + no-map; + reg = <0x0 0xb4400000 0x0 0x200000>; + }; + + ramoops@B4600000 { + compatible = "ramoops"; + reg = <0x0 0xb4600000 0x0 0x100000>; + record-size = <0x40000>; + console-size = <0x40000>; + ftrace-size = <0x40000>; + pmsg-size = <0x40000>; + }; + + sec_debug_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4700000 0x0 0x800000>; + phandle = <0xbc>; + }; + + sec_debug_autocomment@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4f00000 0x0 0x1000>; + phandle = <0xbd>; + }; + + sec_debug_rdx_bootdev@0 { + no-ship; + reg = <0x1 0x0 0x0 0x5900000>; + phandle = <0xbe>; + }; + + kaslr_region@A0001000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xa0001000 0x0 0x1000>; + phandle = <0xbf>; + }; + + rkp_region@B0200000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xb0200000 0x0 0x200000>; + phandle = <0xc0>; + }; + + hdm_region@A1000000 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xa1000000 0x0 0x1000>; + phandle = <0x53>; + }; + + modem_shared_mem_region@B5000000 { + compatible = "modem-removed-dma-pool"; + no-map; + reg = <0x0 0xb5000000 0x0 0x6000000>; + phandle = <0x52>; + }; + }; + }; + + fragment@38 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x80b00000 0x0 0x7100000>; + }; + }; + + fragment@39 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x8b000000 0x0 0x8900000>; + }; + }; + + fragment@40 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x93c00000 0x0 0x3e00000>; + }; + }; + + fragment@41 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97a00000 0x0 0x500000>; + }; + }; + + fragment@42 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97f00000 0x0 0x500000>; + }; + }; + + fragment@43 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98400000 0x0 0x500000>; + }; + }; + + fragment@44 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98900000 0x0 0x1e00000>; + }; + }; + + fragment@45 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9e000000 0x0 0x2000000>; + }; + }; + + fragment@46 { + target = <0xffffffff>; + + __overlay__ { + size = <0x0 0x2000000>; + }; + }; + + fragment@47 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@48 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@49 { + target = <0xffffffff>; + + __overlay__ { + + upload_cause@66c { + compatible = "qcom,msm-imem-upload_cause"; + reg = <0x66c 0x4>; + }; + }; + }; + + fragment@50 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@51 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@52 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@53 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@54 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@55 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@56 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@57 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@58 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@59 { + target = <0xffffffff>; + + __overlay__ { + + dwc3@a600000 { + maximum-speed = "high-speed"; + }; + }; + }; + + fragment@60 { + target = <0xffffffff>; + + __overlay__ { + + input_booster { + status = "okay"; + compatible = "input_booster"; + #address-cells = <0x1>; + #size-cells = <0x0>; + + booster_key@1 { + input_booster,label = "KEY"; + input_booster,type = <0x0>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0xc8>; + input_booster,tail_times = <0x0>; + }; + + booster_key@2 { + input_booster,label = "TOUCHKEY"; + input_booster,type = <0x1>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x0>; + input_booster,tail_times = <0x12c>; + }; + + booster_key@3 { + input_booster,label = "TOUCH"; + input_booster,type = <0x2>; + input_booster,levels = <0x1 0x2 0x3>; + input_booster,cpu_freqs = <0x135600 0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2 0x2>; + input_booster,ddr_freqs = <0x3f9 0x3f9 0x3f9>; + input_booster,lpm_bias = <0x5 0x5 0x5>; + input_booster,head_times = <0xc8 0xc8 0x0>; + input_booster,tail_times = <0x0 0x0 0x12c>; + }; + + booster_key@4 { + input_booster,label = "MULTITOUCH"; + input_booster,type = <0x3>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x3e8 0x0>; + input_booster,tail_times = <0x0 0x1f4>; + }; + + booster_key@5 { + input_booster,label = "KEYBOARD"; + input_booster,type = <0x4>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x135600>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x82 0x82>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@6 { + input_booster,label = "MOUSE"; + input_booster,type = <0x5>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@7 { + input_booster,label = "MOUSE WHEEL"; + input_booster,type = <0x6>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@8 { + input_booster,label = "PEN HOVER"; + input_booster,type = <0x7>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@9 { + input_booster,label = "PEN"; + input_booster,type = <0x8>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x17bb00 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x258>; + }; + + booster_key@10 { + input_booster,label = "KEY_TWO"; + input_booster,type = <0x9>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x17bb00>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x2bc>; + input_booster,tail_times = <0x2bc>; + }; + }; + + sec_smem@0 { + compatible = "samsung,sec-smem"; + status = "okay"; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_4 { + compatible = "qcom,memshare-peripheral"; + memory-region = <0x52>; + qcom,peripheral-size = <0x2000000>; + qcom,reserved-size = <0x4000000>; + qcom,client-id = <0x3>; + qcom,allocate-boot-time; + label = "modem"; + }; + }; + + samsung,sec_misc { + qfprom_jtag,reg = <0x780180>; + }; + + usb-notifier { + compatible = "samsung,usb-notifier"; + qcom,disable_control_en = <0x1>; + qcom,unsupport_host_en = <0x0>; + phandle = <0xc1>; + }; + + samsung,sec_hdm { + memory-region = <0x53>; + }; + }; + }; + + fragment@61 { + target = <0xffffffff>; + + __overlay__ { + + android { + + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_system,recovery,dtbo,abl,xbl,tz,hyp"; + }; + }; + }; + }; + + fragment@62 { + target = <0xffffffff>; + + __overlay__ { + qcom,smem-states = <0xffffffff 0x0 0xffffffff 0x4 0xffffffff 0x5>; + qcom,smem-state-names = "qcom,force-stop", "qcom,stop-reason-0", "qcom,stop-reason-1"; + }; + }; + + fragment@63 { + target = <0xffffffff>; + + __overlay__ { + vdd-3.3-ch1-supply; + }; + }; + + fragment@64 { + target = <0xffffffff>; + + __overlay__ { + spm-level = <0x3>; + }; + }; + + fragment@65 { + target = <0xffffffff>; + + __overlay__ { + + camera_mem_region { + reg = <0x1 0x20000000 0x0 0x25800000>; + ion,recyclable; + phandle = <0x54>; + }; + }; + }; + + fragment@66 { + target = <0xffffffff>; + + __overlay__ { + + qcom,ion { + + qcom,ion-heap@30 { + reg = <0x1e>; + memory-region = <0x54>; + qcom,ion-heap-type = "RBIN"; + }; + }; + }; + }; + + fragment@67 { + target = <0xffffffff>; + + __overlay__ { + i2c18 = "/soc/i2c@18"; + }; + }; + + fragment@68 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x3>; + + imp_list { + #list-imp-cells = <0x3>; + phandle = <0x25>; + }; + }; + }; + + fragment@69 { + target = <0xffffffff>; + + __overlay__ { + + msm_cdc_pinctrl_quin { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x55 0x56 0x57 0x58>; + pinctrl-1 = <0x59 0x5a 0x5b 0x5c>; + qcom,lpi-gpios; + phandle = <0x60>; + }; + }; + }; + + fragment@70 { + target = <0xffffffff>; + + __overlay__ { + + sec-audio-sysfs { + compatible = "samsung,audio-sysfs"; + status = "okay"; + audio,num-amp = <0x2>; + }; + + samsung,q6audio-adaptation { + compatible = "samsung,q6audio-adaptation"; + adaptation,device-tx-port-id = <0xb037>; + adaptation,spk-rx-port-id = <0x1016>; + adaptation,usb-rx-port-id = <0x7000>; + adaptation,bt-rx-port-id = <0x400e>; + adaptation,headset-rx-port-id = <0xb030>; + phandle = <0x5f>; + }; + + det_zones { + #list-det-cells = <0x2>; + phandle = <0x24>; + }; + + i2c@18 { + status = "ok"; + cell-index = <0x12>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x58 0x0 0xffffffff 0x59 0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x5d 0x5e>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xc2>; + + tas256x@4c { + #sound-dai-cells = <0x0>; + compatible = "ti, tas256x"; + status = "ok"; + reg = <0x4c>; + ti,reset-gpio = <0xffffffff 0x5e 0x0>; + ti,irq-gpio = <0xffffffff 0x5a 0x0>; + ti,left-channel = <0x4d>; + ti,right-channel = <0x4c>; + ti,channels = <0x2>; + ti,iv-width = <0x8>; + ti,vbat-mon = <0x1>; + ti,port_id = <0x1016>; + phandle = <0xc3>; + }; + }; + }; + }; + + fragment@71 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,wcn-btfm = <0x1>; + qcom,ext-disp-audio-rx = <0x0>; + qcom,mi2s-audio-intf = <0x1>; + asoc-platform = <0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0x5f>; + asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-pcm-dsp.2", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-compress-dsp", "msm-pcm-hostless", "msm-pcm-afe", "msm-lsm-client", "msm-pcm-routing", "msm-compr-dsp", "msm-pcm-dsp-noirq", "q6audio-adaptation"; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS3", "MIC BIAS3", "Analog Mic4", "AMIC5", "MIC BIAS4", "MIC BIAS4", "Analog Mic5", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT"; + qcom,msm-mbhc-hs-mic-max-threshold-mv = <0x270f>; + qcom,msm-mbhc-hs-mic-min-threshold-mv = <0x280>; + qcom,cdc-dmic01-gpios; + qcom,cdc-dmic23-gpios; + qcom,cdc-dmic45-gpios; + qcom,quin-mi2s-gpios = <0x60>; + asoc-codec = <0xffffffff 0xffffffff>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec"; + qcom,wsa-max-devs = <0x0>; + qcom,wsa-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x31 0xffffffff>; + fsa4480-i2c-handle; + qcom,fm-lna-gpios = <0xffffffff 0x54 0x0>; + qcom,msm-mbhc-gnd-det = <0x1>; + }; + }; + + fragment@72 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@73 { + target = <0xffffffff>; + + __overlay__ { + + tas25xx_gpio_default { + phandle = <0x5d>; + + mux { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + function = "gpio"; + }; + + config { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + bias-disable; + }; + }; + + fm_lna_default { + phandle = <0x5e>; + + mux { + pins = "gpio84"; + function = "gpio"; + }; + + config { + pins = "gpio84"; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@74 { + target = <0xffffffff>; + + __overlay__ { + + grip_i2c { + + grip_i2c_active { + phandle = <0xa8>; + + grip_i2c_active { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + + grip_i2c_suspend { + phandle = <0xc4>; + + grip_i2c_suspend { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + }; + + s2mpb03_i2c_sda_default { + phandle = <0x61>; + + mux { + pins = "gpio25"; + function = "gpio"; + }; + + config { + pins = "gpio25"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + s2mpb03_i2c_scl_default { + phandle = <0x62>; + + mux { + pins = "gpio26"; + function = "gpio"; + }; + + config { + pins = "gpio26"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + cam_sensor_mclk0_active { + phandle = <0x81>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk0_suspend { + phandle = <0x83>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk1_active { + phandle = <0x91>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk1_suspend { + phandle = <0x93>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk2_active { + phandle = <0x99>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk2_suspend { + phandle = <0x9c>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk3_active { + phandle = <0x86>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk3_suspend { + phandle = <0x8a>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk4_active { + phandle = <0xa0>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk4_suspend { + phandle = <0xa3>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + rcam1_sensor_reset_active { + phandle = <0x82>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_reset_suspend { + phandle = <0x84>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_active { + phandle = <0x92>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_suspend { + phandle = <0x94>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_active { + phandle = <0x87>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_suspend { + phandle = <0x8b>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_active { + phandle = <0x9a>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_suspend { + phandle = <0x9d>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_active { + phandle = <0xa1>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_suspend { + phandle = <0xa4>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_active { + phandle = <0x73>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_suspend { + phandle = <0x74>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_active { + phandle = <0x9b>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_suspend { + phandle = <0x9e>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_active { + phandle = <0x88>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_suspend { + phandle = <0x8c>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_active { + phandle = <0xa2>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_suspend { + phandle = <0xa5>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_active { + phandle = <0x89>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-disable; + output-high; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_suspend { + phandle = <0x8d>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vdig_active { + phandle = <0xc5>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vdig_suspend { + phandle = <0xc6>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_active { + phandle = <0xc7>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_suspend { + phandle = <0xc8>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + if_pmic_i2c_pins { + phandle = <0xc9>; + + if_pmic_i2c_sleep { + phandle = <0x66>; + + mux { + pins = "gpio115", "gpio116"; + function = "gpio"; + }; + + config { + pins = "gpio115", "gpio116"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + usbpd_i2c_pins { + phandle = <0xca>; + + usbpd_i2c_sleep { + phandle = <0x68>; + + mux { + pins = "gpio53", "gpio54"; + function = "gpio"; + }; + + config { + pins = "gpio53", "gpio54"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + mcu_reset_active { + phandle = <0x76>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_reset_suspend { + phandle = <0x78>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + mcu_clk_active { + phandle = <0x77>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_clk_suspend { + phandle = <0x79>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + }; + }; + + fragment@75 { + target = <0xffffffff>; + + __overlay__ { + + grip_int_active { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xa9>; + }; + + grip_int_suspend { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xcb>; + }; + }; + }; + + fragment@76 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x6 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x22 0x25 0x2a 0x2d 0x2f 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x43 0x44 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5b 0x5e 0x73 0x74 0x76>; + }; + }; + + fragment@77 { + target = <0xffffffff>; + + __overlay__ { + + qcom,pm6150@0 { + + qcom,power-on@800 { + interrupts = <0x0 0x8 0x0 0x0 0x0 0x8 0x1 0x0 0x0 0x8 0x4 0x0 0x0 0x8 0x5 0x0>; + interrupt-names = "kpdpwr", "resin", "resin-bark", "kpdpwr-resin-bark"; + qcom,s3-debounce = <0x80>; + + qcom,pon_1 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_2 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_3 { + qcom,pon-type = <0x3>; + qcom,support-reset = <0x1>; + qcom,pull-up = <0x1>; + qcom,s1-timer = <0x1a40>; + qcom,s2-timer = <0x3e8>; + qcom,s2-type = <0x8>; + qcom,use-bark; + }; + }; + }; + }; + }; + + fragment@78 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@79 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@80 { + target = <0xffffffff>; + + __overlay__ { + + sec_thermistor@0 { + compatible = "samsung,sec-ap-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "ap_therm"; + adc_array = <0x70e 0x8a0 0xa3c 0xc04 0xe36 0x1103 0x1467 0x17f5 0x1c02 0x20ba 0x25b4 0x2b63 0x3141 0x3799 0x3d1c 0x44c8 0x4b37 0x51b0 0x5641 0x5bbf 0x5fec 0x6437 0x66e9>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@1 { + compatible = "samsung,sec-pa-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "pa_therm"; + adc_array = <0x745 0x8dc 0xa82 0xc3c 0xe92 0x112d 0x149e 0x1836 0x1c41 0x211f 0x2636 0x2bc9 0x31a3 0x3802 0x3d67 0x453a 0x4b8f 0x518c 0x5730 0x5c17 0x60ae 0x6482 0x672b>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@2 { + compatible = "samsung,sec-wf-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4f>; + io-channel-names = "wf_therm"; + adc_array = <0x753 0x8de 0xa8f 0xc4d 0xe9a 0x1140 0x149f 0x183d 0x1c54 0x2116 0x262e 0x2bdb 0x31c1 0x3816 0x3d7c 0x455a 0x4b86 0x51c4 0x56f2 0x5c43 0x60c5 0x64b3 0x6785>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + i2c@2 { + cell-index = <0x2>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x19 0x0 0xffffffff 0x1a 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x61 0x62>; + phandle = <0xcc>; + + s2mpb03@56 { + compatible = "samsung,s2mpb03pmic"; + reg = <0x56>; + additional_reg_init; + + regulators { + + s2mpb03-ldo1 { + regulator-name = "s2mpb03-ldo1"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x100590>; + phandle = <0x90>; + }; + + s2mpb03-ldo2 { + regulator-name = "s2mpb03-ldo2"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x80>; + }; + + s2mpb03-ldo3 { + regulator-name = "s2mpb03-ldo3"; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x7f>; + }; + + s2mpb03-ldo4 { + regulator-name = "s2mpb03-ldo4"; + regulator-min-microvolt = <0x10c8e0>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x98>; + }; + + s2mpb03-ldo5 { + regulator-name = "s2mpb03-ldo5"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x7a>; + }; + + s2mpb03-ldo6 { + regulator-name = "s2mpb03-ldo6"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x8f>; + }; + + s2mpb03-ldo7 { + regulator-name = "s2mpb03-ldo7"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x75>; + }; + }; + }; + }; + }; + }; + + fragment@81 { + target = <0xffffffff>; + + __overlay__ { + interrupts = <0x0 0xc0 0x0 0x0 0x0 0xc1 0x0 0x0 0x0 0xc2 0x0 0x0 0x0 0xc3 0x0 0x0 0x0 0xc4 0x0 0x0 0x0 0xc6 0x0 0x0 0x0 0xc7 0x0 0x0 0x0 0xc9 0x0 0x0>; + interrupt-names = "pm6150_gpio1", "pm6150_gpio2", "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio5", "pm6150_gpio7", "pm6150_gpio8", "pm6150_gpio10"; + qcom,gpios-disallowed = <0x6 0x9>; + }; + }; + + fragment@82 { + target = <0xffffffff>; + + __overlay__ { + + ap_therm { + reg = <0x4e>; + label = "ap_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@83 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm { + reg = <0x4e>; + label = "pa_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + + wf_therm { + reg = <0x4f>; + label = "wf_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@84 { + target = <0xffffffff>; + + __overlay__ { + + self_display_FC3_dtsi { + label = "self_display_FC3_dtsi"; + samsung,support_self_display; + samsung,self_mask_setting_pre_revA = [29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 02 75 10]; + samsung,self_mask_setting_post_revA = [29 01 00 00 00 00 02 75 00]; + samsung,self_mask_on_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 00 00 00 95 07 9e 09 5f 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_on_factory_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_off_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_disp_debug_rx_cmds_revA = [06 01 00 00 00 00 01 7f 04 01]; + samsung,self_mask_check_tx_pre1_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 04 b0 00 27 d8 29 01 00 00 00 00 02 d8 16 29 01 00 00 00 00 0a bf 01 07 00 00 00 10 00 00 00 29 01 00 00 11 00 02 7a 00 29 01 00 00 00 00 02 75 10 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,self_mask_check_tx_pre2_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 02 75 00 29 01 00 00 22 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 01 f4 02 33 09 60 09 61 00 00 ff ff ff 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,mask_crc_pass_data = [d3 9b]; + samsung,self_mask_check_rx_cmds_revA = [06 01 00 00 00 00 01 14 02 00]; + samsung,self_mask_check_tx_post_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 00 00 00 00 00 29 01 00 00 00 00 02 bf 00 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + phandle = <0x63>; + }; + }; + }; + + fragment@85 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + label = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0x1e6>; + qcom,mdss-brightness-max-level = <0x1e6>; + qcom,mdss-brightness-default-level = <0xff>; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-t-clk-pre = <0x3e>; + qcom,mdss-dsi-t-clk-post = <0x10>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x46>; + qcom,mdss-pan-physical-height-dimension = <0x9b>; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-t-clk-pre-extend; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + qcom,ulps-enabled; + samsung,panel-vendor = "SDC"; + samsung,disp-model = "AMS667YM01"; + samsung,support_gamma_mode2; + samsung,skip_read_on_pre; + samsung,elvss_interpolation_temperature = <0xfffffff0>; + samsung,support_lpm; + samsung,support_gpara; + samsung,pointing_gpara; + samsung,two_byte_gpara; + samsung,rsc_4_frame_idle; + samsung,support_factory_panel_swap; + samsung,support-optical-fingerprint; + samsung,support_vrr_based_bl; + ss,self_display = <0x63>; + samsung,level0_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 9f a5 a5]; + samsung,level0_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 9f 5a 5a]; + samsung,level1_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 5a 5a]; + samsung,level1_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 a5 a5]; + samsung,level2_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 fc 5a 5a]; + samsung,level2_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 fc a5 a5]; + samsung,brightness_tx_cmds_revA = <0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100>; + samsung,display_on_tx_cmds_revA = [29 00 00 00 00 00 03 9f a5 a5 05 00 00 00 00 00 02 29 00 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,display_off_tx_cmds_revA = [05 01 00 00 00 00 02 28 00]; + samsung,reg_read_pos_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 00 00]; + samsung,mtp_write_sysfs_tx_cmds_revA = <0x29000000 0x3d00 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + samsung,panel_ltps_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 50 01 0c 00 04 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 3c 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,panel_ltps_tx_cmds_revC = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 50 00 0c 00 04 31 48 31 48 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 3c 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,smooth_dimming_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 91 63 29 00 00 00 00 00 02 63 20 29 01 00 00 11 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,gamma_mode2_normal_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26360 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x7290000 0x2 0x53202900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0002900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revF = <0x29000000 0x391 0x2012900 0x0 0x2532029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 1c 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,gamma_mode2_hbm_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26320 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x290000 0x2 0x53e02900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0072900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revF = <0x29000000 0x391 0x2002900 0x0 0x253e029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 14 29 00 00 00 00 00 02 53 e0 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,vrr_tx_cmds_revA = [29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f]; + samsung,acl_on_tx_cmds_revA = [29 00 00 00 00 00 04 b0 03 b3 65 29 00 00 00 00 00 14 65 55 00 b0 51 66 98 15 55 55 55 08 f1 c6 48 40 00 20 10 09 29 00 00 00 00 00 02 55 03]; + samsung,acl_off_tx_cmds_revA = [29 01 00 00 00 00 02 55 00]; + samsung,manufacture_id0_rx_cmds_revA = [06 01 00 00 00 00 01 da 01 00 00]; + samsung,manufacture_id1_rx_cmds_revA = [06 01 00 00 00 00 01 db 01 00 00]; + samsung,manufacture_id2_rx_cmds_revA = [06 01 00 00 00 00 01 dc 01 00 00]; + samsung,module_info_rx_cmds_revA = [06 01 00 00 00 00 01 a1 0b 00 00]; + samsung,octa_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 04 00 0b]; + samsung,cell_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 10 00 0f]; + samsung,cell_id_rx_cmds_revG = [06 01 00 00 00 00 01 92 10 00 02]; + samsung,ddi_id_rx_cmds_revA = [06 01 00 00 00 00 01 d6 05 00 00]; + samsung,mtp_read_sysfs_rx_cmds_revA = [06 01 00 00 00 00 01 00 00 00 00]; + samsung,candela_map_table_revA = <0x0 0x0 0x0 0x2 0x2 0x1 0x1 0x1 0x3 0x2 0x2 0x2 0x2 0x4 0x3 0x3 0x3 0x3 0x5 0x3 0x4 0x4 0x4 0x7 0x4 0x5 0x5 0x5 0x8 0x5 0x6 0x6 0x6 0xa 0x5 0x7 0x7 0x7 0xc 0x6 0x8 0x8 0x8 0xd 0x7 0x9 0x9 0x9 0xf 0x7 0xa 0xa 0xa 0x11 0x8 0xb 0xb 0xb 0x13 0x9 0xc 0xc 0xc 0x15 0xa 0xd 0xd 0xd 0x18 0xb 0xe 0xe 0xe 0x1a 0xc 0xf 0xf 0xf 0x1c 0xd 0x10 0x10 0x10 0x1e 0xd 0x11 0x11 0x11 0x20 0xe 0x12 0x12 0x12 0x23 0xf 0x13 0x13 0x13 0x25 0x10 0x14 0x14 0x14 0x28 0x11 0x15 0x15 0x15 0x2a 0x12 0x16 0x16 0x16 0x2d 0x13 0x17 0x17 0x17 0x2f 0x14 0x18 0x18 0x18 0x32 0x15 0x19 0x19 0x19 0x34 0x16 0x1a 0x1a 0x1a 0x37 0x17 0x1b 0x1b 0x1b 0x3a 0x19 0x1c 0x1c 0x1c 0x3c 0x1a 0x1d 0x1d 0x1d 0x3f 0x1b 0x1e 0x1e 0x1e 0x42 0x1c 0x1f 0x1f 0x1f 0x45 0x1d 0x20 0x20 0x20 0x47 0x1e 0x21 0x21 0x21 0x4a 0x1f 0x22 0x22 0x22 0x4d 0x20 0x23 0x23 0x23 0x50 0x22 0x24 0x24 0x24 0x53 0x23 0x25 0x25 0x25 0x56 0x24 0x26 0x26 0x26 0x59 0x25 0x27 0x27 0x27 0x5c 0x26 0x28 0x28 0x28 0x5f 0x28 0x29 0x29 0x29 0x62 0x29 0x2a 0x2a 0x2a 0x65 0x2a 0x2b 0x2b 0x2b 0x68 0x2b 0x2c 0x2c 0x2c 0x6b 0x2d 0x2d 0x2d 0x2d 0x6e 0x2e 0x2e 0x2e 0x2e 0x71 0x2f 0x2f 0x2f 0x2f 0x74 0x30 0x30 0x30 0x30 0x77 0x32 0x31 0x31 0x31 0x7b 0x33 0x32 0x32 0x32 0x7e 0x34 0x33 0x33 0x33 0x81 0x36 0x34 0x34 0x34 0x84 0x37 0x35 0x35 0x35 0x88 0x38 0x36 0x36 0x36 0x8b 0x3a 0x37 0x37 0x37 0x8e 0x3b 0x38 0x38 0x38 0x92 0x3c 0x39 0x39 0x39 0x95 0x3e 0x3a 0x3a 0x3a 0x98 0x3f 0x3b 0x3b 0x3b 0x9c 0x40 0x3c 0x3c 0x3c 0x9f 0x42 0x3d 0x3d 0x3d 0xa2 0x43 0x3e 0x3e 0x3e 0xa6 0x44 0x3f 0x3f 0x3f 0xa9 0x46 0x40 0x40 0x40 0xad 0x47 0x41 0x41 0x41 0xb0 0x49 0x42 0x42 0x42 0xb4 0x4a 0x43 0x43 0x43 0xb7 0x4c 0x44 0x44 0x44 0xbb 0x4d 0x45 0x45 0x45 0xbe 0x4e 0x46 0x46 0x46 0xc2 0x50 0x47 0x47 0x47 0xc5 0x51 0x48 0x48 0x48 0xc9 0x53 0x49 0x49 0x49 0xcd 0x54 0x4a 0x4a 0x4a 0xd0 0x56 0x4b 0x4b 0x4b 0xd4 0x57 0x4c 0x4c 0x4c 0xd7 0x59 0x4d 0x4d 0x4d 0xdb 0x5a 0x4e 0x4e 0x4e 0xdf 0x5c 0x4f 0x4f 0x4f 0xe3 0x5d 0x50 0x50 0x50 0xe6 0x5f 0x51 0x51 0x51 0xea 0x60 0x52 0x52 0x52 0xee 0x62 0x53 0x53 0x53 0xf1 0x63 0x54 0x54 0x54 0xf5 0x65 0x55 0x55 0x55 0xf9 0x66 0x56 0x56 0x56 0xfd 0x68 0x57 0x57 0x57 0x101 0x69 0x58 0x58 0x58 0x104 0x6b 0x59 0x59 0x59 0x108 0x6c 0x5a 0x5a 0x5a 0x10c 0x6e 0x5b 0x5b 0x5b 0x110 0x70 0x5c 0x5c 0x5c 0x114 0x71 0x5d 0x5d 0x5d 0x118 0x73 0x5e 0x5e 0x5e 0x11b 0x74 0x5f 0x5f 0x5f 0x11f 0x76 0x60 0x60 0x60 0x123 0x77 0x61 0x61 0x61 0x127 0x79 0x62 0x62 0x62 0x12b 0x7b 0x63 0x63 0x63 0x12f 0x7c 0x64 0x64 0x64 0x133 0x7e 0x65 0x65 0x65 0x137 0x7f 0x66 0x66 0x66 0x13b 0x81 0x67 0x67 0x67 0x13f 0x83 0x68 0x68 0x68 0x143 0x84 0x69 0x69 0x69 0x147 0x86 0x6a 0x6a 0x6a 0x14b 0x88 0x6b 0x6b 0x6b 0x14f 0x89 0x6c 0x6c 0x6c 0x153 0x8b 0x6d 0x6d 0x6d 0x157 0x8c 0x6e 0x6e 0x6e 0x15b 0x8e 0x6f 0x6f 0x6f 0x15f 0x90 0x70 0x70 0x70 0x163 0x91 0x71 0x71 0x71 0x168 0x93 0x72 0x72 0x72 0x16c 0x95 0x73 0x73 0x73 0x170 0x96 0x74 0x74 0x74 0x174 0x98 0x75 0x75 0x75 0x178 0x9a 0x76 0x76 0x76 0x17c 0x9c 0x77 0x77 0x77 0x180 0x9d 0x78 0x78 0x78 0x185 0x9f 0x79 0x79 0x79 0x189 0xa1 0x7a 0x7a 0x7a 0x18d 0xa2 0x7b 0x7b 0x7b 0x191 0xa4 0x7c 0x7c 0x7c 0x195 0xa6 0x7d 0x7d 0x7d 0x19a 0xa7 0x7e 0x7e 0x7e 0x19e 0xa9 0x7f 0x7f 0x7f 0x1a2 0xab 0x80 0x80 0x80 0x1a6 0xad 0x81 0x81 0x81 0x1ab 0xae 0x82 0x82 0x82 0x1af 0xb0 0x83 0x83 0x83 0x1b3 0xb2 0x84 0x84 0x84 0x1b8 0xb4 0x85 0x85 0x85 0x1bc 0xb5 0x86 0x86 0x86 0x1c0 0xb7 0x87 0x87 0x87 0x1c5 0xb9 0x88 0x88 0x88 0x1c9 0xbb 0x89 0x89 0x89 0x1cd 0xbc 0x8a 0x8a 0x8a 0x1d1 0xbe 0x8b 0x8b 0x8b 0x1d6 0xc0 0x8c 0x8c 0x8c 0x1da 0xc2 0x8d 0x8d 0x8d 0x1de 0xc3 0x8e 0x8e 0x8e 0x1e3 0xc5 0x8f 0x8f 0x8f 0x1e7 0xc7 0x90 0x90 0x90 0x1eb 0xc9 0x91 0x91 0x91 0x1f0 0xcb 0x92 0x92 0x92 0x1f4 0xcc 0x93 0x93 0x93 0x1f8 0xce 0x94 0x94 0x94 0x1fd 0xd0 0x95 0x95 0x95 0x201 0xd2 0x96 0x96 0x96 0x206 0xd4 0x97 0x97 0x97 0x20a 0xd6 0x98 0x98 0x98 0x20e 0xd7 0x99 0x99 0x99 0x213 0xd9 0x9a 0x9a 0x9a 0x217 0xdb 0x9b 0x9b 0x9b 0x21c 0xdd 0x9c 0x9c 0x9c 0x220 0xdf 0x9d 0x9d 0x9d 0x225 0xe1 0x9e 0x9e 0x9e 0x229 0xe2 0x9f 0x9f 0x9f 0x22e 0xe4 0xa0 0xa0 0xa0 0x232 0xe6 0xa1 0xa1 0xa1 0x237 0xe8 0xa2 0xa2 0xa2 0x23b 0xea 0xa3 0xa3 0xa3 0x240 0xec 0xa4 0xa4 0xa4 0x244 0xed 0xa5 0xa5 0xa5 0x249 0xef 0xa6 0xa6 0xa6 0x24d 0xf1 0xa7 0xa7 0xa7 0x252 0xf3 0xa8 0xa8 0xa8 0x256 0xf5 0xa9 0xa9 0xa9 0x25b 0xf7 0xaa 0xaa 0xaa 0x260 0xf9 0xab 0xab 0xab 0x264 0xfb 0xac 0xac 0xac 0x269 0xfd 0xad 0xad 0xad 0x26d 0xfe 0xae 0xae 0xae 0x272 0x100 0xaf 0xaf 0xaf 0x277 0x102 0xb0 0xb0 0xb0 0x27b 0x104 0xb1 0xb1 0xb1 0x280 0x106 0xb2 0xb2 0xb2 0x284 0x108 0xb3 0xb3 0xb3 0x289 0x10a 0xb4 0xb4 0xb4 0x28e 0x10c 0xb5 0xb5 0xb5 0x292 0x10e 0xb6 0xb6 0xb6 0x297 0x110 0xb7 0xb7 0xb7 0x29c 0x112 0xb8 0xb8 0xb8 0x2a0 0x113 0xb9 0xb9 0xb9 0x2a5 0x115 0xba 0xba 0xba 0x2aa 0x117 0xbb 0xbb 0xbb 0x2ae 0x119 0xbc 0xbc 0xbc 0x2b3 0x11b 0xbd 0xbd 0xbd 0x2b8 0x11d 0xbe 0xbe 0xbe 0x2bd 0x11f 0xbf 0xbf 0xbf 0x2c1 0x121 0xc0 0xc0 0xc0 0x2c6 0x123 0xc1 0xc1 0xc1 0x2cb 0x125 0xc2 0xc2 0xc2 0x2d0 0x127 0xc3 0xc3 0xc3 0x2d4 0x129 0xc4 0xc4 0xc4 0x2d9 0x12b 0xc5 0xc5 0xc5 0x2de 0x12d 0xc6 0xc6 0xc6 0x2e3 0x12f 0xc7 0xc7 0xc7 0x2e8 0x131 0xc8 0xc8 0xc8 0x2ec 0x133 0xc9 0xc9 0xc9 0x2f1 0x135 0xca 0xca 0xca 0x2f6 0x137 0xcb 0xcb 0xcb 0x2fb 0x139 0xcc 0xcc 0xcc 0x300 0x13b 0xcd 0xcd 0xcd 0x304 0x13d 0xce 0xce 0xce 0x309 0x13f 0xcf 0xcf 0xcf 0x30e 0x141 0xd0 0xd0 0xd0 0x313 0x143 0xd1 0xd1 0xd1 0x318 0x145 0xd2 0xd2 0xd2 0x31d 0x147 0xd3 0xd3 0xd3 0x322 0x149 0xd4 0xd4 0xd4 0x327 0x14b 0xd5 0xd5 0xd5 0x32b 0x14d 0xd6 0xd6 0xd6 0x330 0x14f 0xd7 0xd7 0xd7 0x335 0x151 0xd8 0xd8 0xd8 0x33a 0x153 0xd9 0xd9 0xd9 0x33f 0x155 0xda 0xda 0xda 0x344 0x157 0xdb 0xdb 0xdb 0x349 0x159 0xdc 0xdc 0xdc 0x34e 0x15b 0xdd 0xdd 0xdd 0x353 0x15d 0xde 0xde 0xde 0x358 0x15f 0xdf 0xdf 0xdf 0x35d 0x161 0xe0 0xe0 0xe0 0x362 0x163 0xe1 0xe1 0xe1 0x367 0x165 0xe2 0xe2 0xe2 0x36c 0x167 0xe3 0xe3 0xe3 0x371 0x169 0xe4 0xe4 0xe4 0x376 0x16b 0xe5 0xe5 0xe5 0x37b 0x16d 0xe6 0xe6 0xe6 0x380 0x170 0xe7 0xe7 0xe7 0x385 0x172 0xe8 0xe8 0xe8 0x38a 0x174 0xe9 0xe9 0xe9 0x38f 0x176 0xea 0xea 0xea 0x394 0x178 0xeb 0xeb 0xeb 0x399 0x17a 0xec 0xec 0xec 0x39e 0x17c 0xed 0xed 0xed 0x3a3 0x17e 0xee 0xee 0xee 0x3a8 0x180 0xef 0xef 0xef 0x3ad 0x182 0xf0 0xf0 0xf0 0x3b2 0x184 0xf1 0xf1 0xf1 0x3b7 0x186 0xf2 0xf2 0xf2 0x3bc 0x189 0xf3 0xf3 0xf3 0x3c1 0x18b 0xf4 0xf4 0xf4 0x3c7 0x18d 0xf5 0xf5 0xf5 0x3cc 0x18f 0xf6 0xf6 0xf6 0x3d1 0x191 0xf7 0xf7 0xf7 0x3d6 0x193 0xf8 0xf8 0xf8 0x3db 0x195 0xf9 0xf9 0xf9 0x3e0 0x197 0xfa 0xfa 0xfa 0x3e5 0x199 0xfb 0xfb 0xfb 0x3ea 0x19b 0xfc 0xfc 0xfc 0x3f0 0x19e 0xfd 0xfd 0xfd 0x3f5 0x1a0 0xfe 0xfe 0xfe 0x3fa 0x1a2 0xff 0xff 0xff 0x3ff 0x1a4>; + samsung,hbm_candela_map_table_revG = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x2 0x1aa 0x2 0x102 0x102 0x4 0x1ac 0x3 0x103 0x103 0x6 0x1ae 0x4 0x104 0x104 0x8 0x1b0 0x5 0x105 0x105 0xa 0x1b1 0x6 0x106 0x106 0xc 0x1b3 0x7 0x107 0x107 0xe 0x1b4 0x8 0x108 0x108 0x10 0x1b6 0x9 0x109 0x109 0x12 0x1b8 0xa 0x10a 0x10a 0x14 0x1b9 0xb 0x10b 0x10b 0x16 0x1bb 0xc 0x10c 0x10c 0x18 0x1bc 0xd 0x10d 0x10d 0x1a 0x1be 0xe 0x10e 0x10e 0x1c 0x1c0 0xf 0x10f 0x10f 0x1e 0x1c2 0x10 0x110 0x110 0x20 0x1c3 0x11 0x111 0x111 0x22 0x1c5 0x12 0x112 0x112 0x24 0x1c6 0x13 0x113 0x113 0x25 0x1c8 0x14 0x114 0x114 0x26 0x1ca 0x15 0x115 0x115 0x27 0x1cb 0x16 0x116 0x116 0x28 0x1cd 0x17 0x117 0x117 0x29 0x1ce 0x18 0x118 0x118 0x2a 0x1d0 0x19 0x119 0x119 0x2b 0x1d2 0x1a 0x11a 0x11a 0x2c 0x1d4 0x1b 0x11b 0x11b 0x2d 0x1d5 0x1c 0x11c 0x11c 0x2e 0x1d7 0x1d 0x11d 0x11d 0x2f 0x1d8 0x1e 0x11e 0x11e 0x30 0x1da 0x1f 0x11f 0x11f 0x31 0x1dc 0x20 0x120 0x120 0x32 0x1dd 0x21 0x121 0x121 0x33 0x1df 0x22 0x122 0x122 0x34 0x1e0 0x23 0x123 0x123 0x35 0x1e2 0x24 0x124 0x124 0x36 0x1e4 0x25 0x125 0x125 0x37 0x1e5 0x26 0x126 0x126 0x38 0x1e7 0x27 0x127 0x127 0x39 0x1e8 0x28 0x128 0x128 0x3a 0x1ea 0x29 0x129 0x129 0x3b 0x1ec 0x2a 0x12a 0x12a 0x3c 0x1ee 0x2b 0x12b 0x12b 0x3d 0x1ef 0x2c 0x12c 0x12c 0x3e 0x1f1 0x2d 0x12d 0x12d 0x3f 0x1f2 0x2e 0x12e 0x12e 0x40 0x1f4 0x2f 0x12f 0x12f 0x41 0x1f6 0x30 0x130 0x130 0x42 0x1f7 0x31 0x131 0x131 0x43 0x1f9 0x32 0x132 0x132 0x44 0x1fa 0x33 0x133 0x133 0x45 0x1fc 0x34 0x134 0x134 0x46 0x1fe 0x35 0x135 0x135 0x47 0x200 0x36 0x136 0x136 0x48 0x201 0x37 0x137 0x137 0x49 0x203 0x38 0x138 0x138 0x4a 0x204 0x39 0x139 0x139 0x4b 0x206 0x3a 0x13a 0x13a 0x4c 0x208 0x3b 0x13b 0x13b 0x4d 0x209 0x3c 0x13c 0x13c 0x4e 0x20b 0x3d 0x13d 0x13d 0x4f 0x20c 0x3e 0x13e 0x13e 0x50 0x20e 0x3f 0x13f 0x13f 0x51 0x210 0x40 0x140 0x140 0x52 0x211 0x41 0x141 0x141 0x53 0x213 0x42 0x142 0x142 0x54 0x215 0x43 0x143 0x143 0x55 0x216 0x44 0x144 0x144 0x56 0x218 0x45 0x145 0x145 0x57 0x21a 0x46 0x146 0x146 0x58 0x21b 0x47 0x147 0x147 0x59 0x21d 0x48 0x148 0x148 0x5a 0x21e 0x49 0x149 0x149 0x5b 0x220 0x4a 0x14a 0x14a 0x5c 0x222 0x4b 0x14b 0x14b 0x5d 0x223 0x4c 0x14c 0x14c 0x5f 0x225 0x4d 0x14d 0x14d 0x61 0x226 0x4e 0x14e 0x14e 0x63 0x228 0x4f 0x14f 0x14f 0x65 0x22a 0x50 0x150 0x150 0x67 0x22b 0x51 0x151 0x151 0x69 0x22d 0x52 0x152 0x152 0x6b 0x22f 0x53 0x153 0x153 0x6d 0x230 0x54 0x154 0x154 0x6f 0x232 0x55 0x155 0x155 0x71 0x234 0x56 0x156 0x156 0x73 0x235 0x57 0x157 0x157 0x75 0x237 0x58 0x158 0x158 0x77 0x238 0x59 0x159 0x159 0x79 0x23a 0x5a 0x15a 0x15a 0x7b 0x23c 0x5b 0x15b 0x15b 0x7d 0x23d 0x5c 0x15c 0x15c 0x7f 0x23f 0x5d 0x15d 0x15d 0x81 0x241 0x5e 0x15e 0x15e 0x83 0x242 0x5f 0x15f 0x15f 0x85 0x244 0x60 0x160 0x160 0x87 0x246 0x61 0x161 0x161 0x89 0x247 0x62 0x162 0x162 0x8b 0x249 0x63 0x163 0x163 0x8d 0x24a 0x64 0x164 0x164 0x8f 0x24c 0x65 0x165 0x165 0x91 0x24e 0x66 0x166 0x166 0x93 0x24f 0x67 0x167 0x167 0x95 0x251 0x68 0x168 0x168 0x97 0x253 0x69 0x169 0x169 0x9a 0x254 0x6a 0x16a 0x16a 0x9d 0x256 0x6b 0x16b 0x16b 0xa0 0x257 0x6c 0x16c 0x16c 0xa3 0x259 0x6d 0x16d 0x16d 0xa6 0x25b 0x6e 0x16e 0x16e 0xa8 0x25c 0x6f 0x16f 0x16f 0xab 0x25e 0x70 0x170 0x170 0xae 0x260 0x71 0x171 0x171 0xb1 0x261 0x72 0x172 0x172 0xb4 0x263 0x73 0x173 0x173 0xb7 0x264 0x74 0x174 0x174 0xba 0x266 0x75 0x175 0x175 0xbd 0x268 0x76 0x176 0x176 0xc0 0x269 0x77 0x177 0x177 0xc3 0x26b 0x78 0x178 0x178 0xc6 0x26d 0x79 0x179 0x179 0xc9 0x26e 0x7a 0x17a 0x17a 0xcc 0x270 0x7b 0x17b 0x17b 0xcf 0x272 0x7c 0x17c 0x17c 0xd2 0x273 0x7d 0x17d 0x17d 0xd5 0x275 0x7e 0x17e 0x17e 0xd8 0x276 0x7f 0x17f 0x17f 0xdb 0x278 0x80 0x180 0x180 0xde 0x27a 0x81 0x181 0x181 0xe1 0x27b 0x82 0x182 0x182 0xe4 0x27d 0x83 0x183 0x183 0xe7 0x27f 0x84 0x184 0x184 0xea 0x280 0x85 0x185 0x185 0xed 0x282 0x86 0x186 0x186 0xf0 0x283 0x87 0x187 0x187 0xf3 0x285 0x88 0x188 0x188 0xf6 0x287 0x89 0x189 0x189 0xf9 0x288 0x8a 0x18a 0x18a 0xfc 0x28a 0x8b 0x18b 0x18b 0xff 0x28c 0x8c 0x18c 0x18c 0x102 0x28d 0x8d 0x18d 0x18d 0x105 0x28f 0x8e 0x18e 0x18e 0x108 0x291 0x8f 0x18f 0x18f 0x10b 0x292 0x90 0x190 0x190 0x10e 0x294 0x91 0x191 0x191 0x111 0x295 0x92 0x192 0x192 0x114 0x297 0x93 0x193 0x193 0x117 0x299 0x94 0x194 0x194 0x11a 0x29a 0x95 0x195 0x195 0x11d 0x29c 0x96 0x196 0x196 0x120 0x29e 0x97 0x197 0x197 0x123 0x29f 0x98 0x198 0x198 0x126 0x2a1 0x99 0x199 0x199 0x129 0x2a3 0x9a 0x19a 0x19a 0x12c 0x2a4 0x9b 0x19b 0x19b 0x12f 0x2a6 0x9c 0x19c 0x19c 0x132 0x2a7 0x9d 0x19d 0x19d 0x135 0x2a9 0x9e 0x19e 0x19e 0x138 0x2ab 0x9f 0x19f 0x19f 0x13b 0x2ac 0xa0 0x1a0 0x1a0 0x13e 0x2ae 0xa1 0x1a1 0x1a1 0x141 0x2af 0xa2 0x1a2 0x1a2 0x144 0x2b1 0xa3 0x1a3 0x1a3 0x147 0x2b3 0xa4 0x1a4 0x1a4 0x14a 0x2b4 0xa5 0x1a5 0x1a5 0x14d 0x2b6 0xa6 0x1a6 0x1a6 0x150 0x2b8 0xa7 0x1a7 0x1a7 0x153 0x2b9 0xa8 0x1a8 0x1a8 0x156 0x2bb 0xa9 0x1a9 0x1a9 0x159 0x2bd 0xaa 0x1aa 0x1aa 0x15c 0x2be 0xab 0x1ab 0x1ab 0x15f 0x2c0 0xac 0x1ac 0x1ac 0x162 0x2c1 0xad 0x1ad 0x1ad 0x165 0x2c3 0xae 0x1ae 0x1ae 0x168 0x2c5 0xaf 0x1af 0x1af 0x16b 0x2c6 0xb0 0x1b0 0x1b0 0x16e 0x2c8 0xb1 0x1b1 0x1b1 0x171 0x2c9 0xb2 0x1b2 0x1b2 0x174 0x2cb 0xb3 0x1b3 0x1b3 0x177 0x2cd 0xb4 0x1b4 0x1b4 0x17a 0x2cf 0xb5 0x1b5 0x1b5 0x17d 0x2d0 0xb6 0x1b6 0x1b6 0x180 0x2d2 0xb7 0x1b7 0x1b7 0x183 0x2d3 0xb8 0x1b8 0x1b8 0x186 0x2d5 0xb9 0x1b9 0x1b9 0x189 0x2d7 0xba 0x1ba 0x1ba 0x18c 0x2d8 0xbb 0x1bb 0x1bb 0x18f 0x2da 0xbc 0x1bc 0x1bc 0x192 0x2db 0xbd 0x1bd 0x1bd 0x195 0x2dd 0xbe 0x1be 0x1be 0x198 0x2df 0xbf 0x1bf 0x1bf 0x19b 0x2e1 0xc0 0x1c0 0x1c0 0x19e 0x2e2 0xc1 0x1c1 0x1c1 0x1a1 0x2e4 0xc2 0x1c2 0x1c2 0x1a4 0x2e5 0xc3 0x1c3 0x1c3 0x1a7 0x2e7 0xc4 0x1c4 0x1c4 0x1aa 0x2e9 0xc5 0x1c5 0x1c5 0x1ad 0x2ea 0xc6 0x1c6 0x1c6 0x1b0 0x2ec 0xc7 0x1c7 0x1c7 0x1b3 0x2ed 0xc8 0x1c8 0x1c8 0x1b6 0x2ef 0xc9 0x1c9 0x1c9 0x1b9 0x2f1 0xca 0x1ca 0x1ca 0x1bc 0x2f2 0xcb 0x1cb 0x1cb 0x1bf 0x2f4 0xcc 0x1cc 0x1cc 0x1c2 0x2f5 0xcd 0x1cd 0x1cd 0x1c5 0x2f7 0xce 0x1ce 0x1ce 0x1c8 0x2f9 0xcf 0x1cf 0x1cf 0x1cb 0x2fb 0xd0 0x1d0 0x1d0 0x1ce 0x2fc 0xd1 0x1d1 0x1d1 0x1d1 0x2fe 0xd2 0x1d2 0x1d2 0x1d4 0x2ff 0xd3 0x1d3 0x1d3 0x1d7 0x301 0xd4 0x1d4 0x1d4 0x1da 0x303 0xd5 0x1d5 0x1d5 0x1dd 0x304 0xd6 0x1d6 0x1d6 0x1e0 0x306 0xd7 0x1d7 0x1d7 0x1e3 0x307 0xd8 0x1d8 0x1d8 0x1e6 0x309 0xd9 0x1d9 0x1d9 0x1e9 0x30b 0xda 0x1da 0x1da 0x1ec 0x30d 0xdb 0x1db 0x1db 0x1ef 0x30e 0xdc 0x1dc 0x1dc 0x1f2 0x310 0xdd 0x1dd 0x1dd 0x1f5 0x311 0xde 0x1de 0x1de 0x1f8 0x313 0xdf 0x1df 0x1df 0x1fb 0x315 0xe0 0x1e0 0x1e0 0x1fe 0x316 0xe1 0x1e1 0x1e1 0x201 0x318 0xe2 0x1e2 0x1e2 0x204 0x319 0xe3 0x1e3 0x1e3 0x207 0x31b 0xe4 0x1e4 0x1e4 0x20a 0x31d 0xe5 0x1e5 0x1e5 0x20d 0x31f 0xe6 0x1e6 0x1e6 0x210 0x320>; + samsung,hbm_candela_map_table_revA = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x3 0x1aa 0x2 0x102 0x102 0x6 0x1ac 0x3 0x103 0x103 0x9 0x1ae 0x4 0x104 0x104 0xc 0x1b0 0x5 0x105 0x105 0xf 0x1b1 0x6 0x106 0x106 0x12 0x1b3 0x7 0x107 0x107 0x15 0x1b4 0x8 0x108 0x108 0x18 0x1b6 0x9 0x109 0x109 0x1b 0x1b8 0xa 0x10a 0x10a 0x1e 0x1b9 0xb 0x10b 0x10b 0x21 0x1bb 0xc 0x10c 0x10c 0x24 0x1bc 0xd 0x10d 0x10d 0x27 0x1be 0xe 0x10e 0x10e 0x2a 0x1c0 0xf 0x10f 0x10f 0x2d 0x1c2 0x10 0x110 0x110 0x30 0x1c3 0x11 0x111 0x111 0x33 0x1c5 0x12 0x112 0x112 0x36 0x1c6 0x13 0x113 0x113 0x39 0x1c8 0x14 0x114 0x114 0x3c 0x1ca 0x15 0x115 0x115 0x3f 0x1cb 0x16 0x116 0x116 0x42 0x1cd 0x17 0x117 0x117 0x45 0x1ce 0x18 0x118 0x118 0x48 0x1d0 0x19 0x119 0x119 0x4b 0x1d2 0x1a 0x11a 0x11a 0x4e 0x1d4 0x1b 0x11b 0x11b 0x51 0x1d5 0x1c 0x11c 0x11c 0x54 0x1d7 0x1d 0x11d 0x11d 0x56 0x1d8 0x1e 0x11e 0x11e 0x58 0x1da 0x1f 0x11f 0x11f 0x5a 0x1dc 0x20 0x120 0x120 0x5c 0x1dd 0x21 0x121 0x121 0x5e 0x1df 0x22 0x122 0x122 0x60 0x1e0 0x23 0x123 0x123 0x62 0x1e2 0x24 0x124 0x124 0x64 0x1e4 0x25 0x125 0x125 0x66 0x1e5 0x26 0x126 0x126 0x68 0x1e7 0x27 0x127 0x127 0x6a 0x1e8 0x28 0x128 0x128 0x6c 0x1ea 0x29 0x129 0x129 0x6e 0x1ec 0x2a 0x12a 0x12a 0x70 0x1ee 0x2b 0x12b 0x12b 0x72 0x1ef 0x2c 0x12c 0x12c 0x74 0x1f1 0x2d 0x12d 0x12d 0x76 0x1f2 0x2e 0x12e 0x12e 0x78 0x1f4 0x2f 0x12f 0x12f 0x7a 0x1f6 0x30 0x130 0x130 0x7c 0x1f7 0x31 0x131 0x131 0x7e 0x1f9 0x32 0x132 0x132 0x80 0x1fa 0x33 0x133 0x133 0x82 0x1fc 0x34 0x134 0x134 0x84 0x1fe 0x35 0x135 0x135 0x86 0x200 0x36 0x136 0x136 0x88 0x201 0x37 0x137 0x137 0x8a 0x203 0x38 0x138 0x138 0x8c 0x204 0x39 0x139 0x139 0x8e 0x206 0x3a 0x13a 0x13a 0x90 0x208 0x3b 0x13b 0x13b 0x92 0x209 0x3c 0x13c 0x13c 0x94 0x20b 0x3d 0x13d 0x13d 0x96 0x20c 0x3e 0x13e 0x13e 0x98 0x20e 0x3f 0x13f 0x13f 0x9a 0x210 0x40 0x140 0x140 0x9c 0x211 0x41 0x141 0x141 0x9e 0x213 0x42 0x142 0x142 0xa0 0x215 0x43 0x143 0x143 0xa2 0x216 0x44 0x144 0x144 0xa4 0x218 0x45 0x145 0x145 0xa6 0x21a 0x46 0x146 0x146 0xa8 0x21b 0x47 0x147 0x147 0xaa 0x21d 0x48 0x148 0x148 0xac 0x21e 0x49 0x149 0x149 0xae 0x220 0x4a 0x14a 0x14a 0xb0 0x222 0x4b 0x14b 0x14b 0xb2 0x223 0x4c 0x14c 0x14c 0xb6 0x225 0x4d 0x14d 0x14d 0xba 0x226 0x4e 0x14e 0x14e 0xbe 0x228 0x4f 0x14f 0x14f 0xc2 0x22a 0x50 0x150 0x150 0xc6 0x22b 0x51 0x151 0x151 0xcb 0x22d 0x52 0x152 0x152 0xd0 0x22f 0x53 0x153 0x153 0xd5 0x230 0x54 0x154 0x154 0xda 0x232 0x55 0x155 0x155 0xdf 0x234 0x56 0x156 0x156 0xe4 0x235 0x57 0x157 0x157 0xe9 0x237 0x58 0x158 0x158 0xee 0x238 0x59 0x159 0x159 0xf3 0x23a 0x5a 0x15a 0x15a 0xf8 0x23c 0x5b 0x15b 0x15b 0xfd 0x23d 0x5c 0x15c 0x15c 0x102 0x23f 0x5d 0x15d 0x15d 0x107 0x241 0x5e 0x15e 0x15e 0x10c 0x242 0x5f 0x15f 0x15f 0x111 0x244 0x60 0x160 0x160 0x116 0x246 0x61 0x161 0x161 0x11b 0x247 0x62 0x162 0x162 0x120 0x249 0x63 0x163 0x163 0x125 0x24a 0x64 0x164 0x164 0x12a 0x24c 0x65 0x165 0x165 0x12f 0x24e 0x66 0x166 0x166 0x134 0x24f 0x67 0x167 0x167 0x139 0x251 0x68 0x168 0x168 0x13e 0x253 0x69 0x169 0x169 0x143 0x254 0x6a 0x16a 0x16a 0x148 0x256 0x6b 0x16b 0x16b 0x14d 0x257 0x6c 0x16c 0x16c 0x152 0x259 0x6d 0x16d 0x16d 0x157 0x25b 0x6e 0x16e 0x16e 0x15c 0x25c 0x6f 0x16f 0x16f 0x161 0x25e 0x70 0x170 0x170 0x166 0x260 0x71 0x171 0x171 0x16b 0x261 0x72 0x172 0x172 0x170 0x263 0x73 0x173 0x173 0x175 0x264 0x74 0x174 0x174 0x17a 0x266 0x75 0x175 0x175 0x17f 0x268 0x76 0x176 0x176 0x184 0x269 0x77 0x177 0x177 0x189 0x26b 0x78 0x178 0x178 0x18e 0x26d 0x79 0x179 0x179 0x193 0x26e 0x7a 0x17a 0x17a 0x198 0x270 0x7b 0x17b 0x17b 0x19d 0x272 0x7c 0x17c 0x17c 0x1a2 0x273 0x7d 0x17d 0x17d 0x1a7 0x275 0x7e 0x17e 0x17e 0x1ac 0x276 0x7f 0x17f 0x17f 0x1b1 0x278 0x80 0x180 0x180 0x1b6 0x27a 0x81 0x181 0x181 0x1bb 0x27b 0x82 0x182 0x182 0x1c0 0x27d 0x83 0x183 0x183 0x1c5 0x27f 0x84 0x184 0x184 0x1ca 0x280 0x85 0x185 0x185 0x1cf 0x282 0x86 0x186 0x186 0x1d4 0x283 0x87 0x187 0x187 0x1d9 0x285 0x88 0x188 0x188 0x1de 0x287 0x89 0x189 0x189 0x1e3 0x288 0x8a 0x18a 0x18a 0x1e8 0x28a 0x8b 0x18b 0x18b 0x1ed 0x28c 0x8c 0x18c 0x18c 0x1f2 0x28d 0x8d 0x18d 0x18d 0x1f7 0x28f 0x8e 0x18e 0x18e 0x1fc 0x291 0x8f 0x18f 0x18f 0x201 0x292 0x90 0x190 0x190 0x206 0x294 0x91 0x191 0x191 0x20b 0x295 0x92 0x192 0x192 0x210 0x297 0x93 0x193 0x193 0x215 0x299 0x94 0x194 0x194 0x21a 0x29a 0x95 0x195 0x195 0x21f 0x29c 0x96 0x196 0x196 0x224 0x29e 0x97 0x197 0x197 0x229 0x29f 0x98 0x198 0x198 0x22e 0x2a1 0x99 0x199 0x199 0x233 0x2a3 0x9a 0x19a 0x19a 0x238 0x2a4 0x9b 0x19b 0x19b 0x23d 0x2a6 0x9c 0x19c 0x19c 0x242 0x2a7 0x9d 0x19d 0x19d 0x247 0x2a9 0x9e 0x19e 0x19e 0x24d 0x2ab 0x9f 0x19f 0x19f 0x253 0x2ac 0xa0 0x1a0 0x1a0 0x259 0x2ae 0xa1 0x1a1 0x1a1 0x25f 0x2af 0xa2 0x1a2 0x1a2 0x265 0x2b1 0xa3 0x1a3 0x1a3 0x26b 0x2b3 0xa4 0x1a4 0x1a4 0x271 0x2b4 0xa5 0x1a5 0x1a5 0x277 0x2b6 0xa6 0x1a6 0x1a6 0x27d 0x2b8 0xa7 0x1a7 0x1a7 0x283 0x2b9 0xa8 0x1a8 0x1a8 0x289 0x2bb 0xa9 0x1a9 0x1a9 0x28f 0x2bd 0xaa 0x1aa 0x1aa 0x295 0x2be 0xab 0x1ab 0x1ab 0x29b 0x2c0 0xac 0x1ac 0x1ac 0x2a1 0x2c1 0xad 0x1ad 0x1ad 0x2a7 0x2c3 0xae 0x1ae 0x1ae 0x2ad 0x2c5 0xaf 0x1af 0x1af 0x2b3 0x2c6 0xb0 0x1b0 0x1b0 0x2b9 0x2c8 0xb1 0x1b1 0x1b1 0x2bf 0x2c9 0xb2 0x1b2 0x1b2 0x2c5 0x2cb 0xb3 0x1b3 0x1b3 0x2cb 0x2cd 0xb4 0x1b4 0x1b4 0x2d1 0x2cf 0xb5 0x1b5 0x1b5 0x2d7 0x2d0 0xb6 0x1b6 0x1b6 0x2dd 0x2d2 0xb7 0x1b7 0x1b7 0x2e3 0x2d3 0xb8 0x1b8 0x1b8 0x2e9 0x2d5 0xb9 0x1b9 0x1b9 0x2ef 0x2d7 0xba 0x1ba 0x1ba 0x2f5 0x2d8 0xbb 0x1bb 0x1bb 0x2fb 0x2da 0xbc 0x1bc 0x1bc 0x301 0x2db 0xbd 0x1bd 0x1bd 0x307 0x2dd 0xbe 0x1be 0x1be 0x30d 0x2df 0xbf 0x1bf 0x1bf 0x313 0x2e1 0xc0 0x1c0 0x1c0 0x319 0x2e2 0xc1 0x1c1 0x1c1 0x31f 0x2e4 0xc2 0x1c2 0x1c2 0x325 0x2e5 0xc3 0x1c3 0x1c3 0x32b 0x2e7 0xc4 0x1c4 0x1c4 0x331 0x2e9 0xc5 0x1c5 0x1c5 0x337 0x2ea 0xc6 0x1c6 0x1c6 0x33d 0x2ec 0xc7 0x1c7 0x1c7 0x343 0x2ed 0xc8 0x1c8 0x1c8 0x349 0x2ef 0xc9 0x1c9 0x1c9 0x34f 0x2f1 0xca 0x1ca 0x1ca 0x355 0x2f2 0xcb 0x1cb 0x1cb 0x35b 0x2f4 0xcc 0x1cc 0x1cc 0x361 0x2f5 0xcd 0x1cd 0x1cd 0x367 0x2f7 0xce 0x1ce 0x1ce 0x36d 0x2f9 0xcf 0x1cf 0x1cf 0x373 0x2fb 0xd0 0x1d0 0x1d0 0x379 0x2fc 0xd1 0x1d1 0x1d1 0x37f 0x2fe 0xd2 0x1d2 0x1d2 0x385 0x2ff 0xd3 0x1d3 0x1d3 0x38b 0x301 0xd4 0x1d4 0x1d4 0x391 0x303 0xd5 0x1d5 0x1d5 0x397 0x304 0xd6 0x1d6 0x1d6 0x39d 0x306 0xd7 0x1d7 0x1d7 0x3a3 0x307 0xd8 0x1d8 0x1d8 0x3a9 0x309 0xd9 0x1d9 0x1d9 0x3af 0x30b 0xda 0x1da 0x1da 0x3b5 0x30d 0xdb 0x1db 0x1db 0x3bb 0x30e 0xdc 0x1dc 0x1dc 0x3c1 0x310 0xdd 0x1dd 0x1dd 0x3c7 0x311 0xde 0x1de 0x1de 0x3cd 0x313 0xdf 0x1df 0x1df 0x3d3 0x315 0xe0 0x1e0 0x1e0 0x3d9 0x316 0xe1 0x1e1 0x1e1 0x3df 0x318 0xe2 0x1e2 0x1e2 0x3e5 0x319 0xe3 0x1e3 0x1e3 0x3eb 0x31b 0xe4 0x1e4 0x1e4 0x3f1 0x31d 0xe5 0x1e5 0x1e5 0x3f7 0x31f 0xe6 0x1e6 0x1e6 0x3ff 0x320>; + samsung,aod_candela_map_table_revA = <0x0 0x0 0xb 0x1b 0x2 0x1 0xc 0x1f 0x1a 0xa 0x2 0x20 0x36 0x19 0x1e 0x3 0x37 0xff 0x18 0x3c>; + samsung,support_dynamic_mipi_clk; + samsung,ffc_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 2e c5 29 00 00 00 00 00 03 c5 36 41 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,ffc_tx_cmds_revC = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 33 43 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,ffc_tx_cmds_revD = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 32 b1 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revA = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53641 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c535a8 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53741>; + samsung,dyn_mipi_clk_ffc_cmds_revC = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53343 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b2 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53435>; + samsung,dyn_mipi_clk_ffc_cmds_revD = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b1 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53222 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c533a0>; + samsung,dynamic_mipi_clk_timing_table = <0x65fbc9c0 0x671db480 0x6422c400>; + samsung,dynamic_mipi_clk_sel_table = <0x1 0x1 0x0 0x0 0x0 0x1 0x2 0x0 0x0 0x2 0x1 0x3 0x0 0x0 0x2 0x1 0x4 0x0 0x0 0x1 0x2 0xb 0x2942 0x29a2 0x0 0x2 0xb 0x29a3 0x29e8 0x1 0x2 0xb 0x29e9 0x2a56 0x0 0x2 0xc 0x25be 0x26d2 0x0 0x2 0xd 0x48a 0x54d 0x0 0x2 0xd 0x54e 0x593 0x1 0x2 0xd 0x594 0x5e9 0x0 0x2 0xe 0x601 0x661 0x0 0x2 0xe 0x662 0x6a7 0x1 0x2 0xe 0x6a8 0x6ca 0x0 0x2 0xf 0x1105 0x116a 0x0 0x2 0x11 0x8bd 0x8e6 0x0 0x2 0x11 0x8e7 0x92c 0x1 0x2 0x11 0x92d 0xa03 0x0 0x2 0x12 0xb79 0xb86 0x1 0x2 0x12 0xb87 0xb98 0x2 0x2 0x12 0xb99 0xc10 0x0 0x3 0x5b 0x0 0xd9 0x0 0x3 0x5b 0xda 0x165 0x1 0x3 0x5b 0x166 0x257 0x0 0x3 0x5c 0x258 0x26a 0x1 0x3 0x5c 0x26b 0x4a7 0x0 0x3 0x5c 0x4a8 0x4af 0x1 0x3 0x5d 0x4b0 0x64f 0x0 0x3 0x5d 0x650 0x6db 0x1 0x3 0x5d 0x6dc 0x79d 0x0 0x3 0x5e 0x79e 0x877 0x0 0x3 0x5e 0x878 0x903 0x1 0x3 0x5e 0x904 0x95f 0x0 0x3 0x5f 0x960 0xa59 0x0 0x3 0x61 0xabe 0xb29 0x0 0x3 0x61 0xb2a 0xbb5 0x1 0x3 0x61 0xbb6 0xd79 0x0 0x3 0x62 0xd7a 0xdac 0x1 0x3 0x62 0xdad 0xdd1 0x2 0x3 0x62 0xdd2 0xed7 0x0 0x3 0x66 0x1392 0x143b 0x0 0x3 0x67 0x143c 0x149f 0x0 0x3 0x68 0x14a0 0x1503 0x0 0x3 0x6b 0x1662 0x16d9 0x0 0x3 0x6c 0x16da 0x16f2 0x2 0x3 0x6c 0x16f3 0x176f 0x0 0x3 0x6d 0x1770 0x1805 0x0 0x3 0x6e 0x1806 0x1808 0x2 0x3 0x6e 0x1809 0x1931 0x0 0x3 0x6f 0x1932 0x1984 0x1 0x3 0x6f 0x1985 0x19c7 0x0 0x3 0x73 0x1f68 0x1f7a 0x1 0x3 0x73 0x1f7b 0x21b7 0x0 0x3 0x73 0x21b8 0x21f1 0x1 0x3 0x74 0x21f2 0x2214 0x2 0x3 0x74 0x2215 0x234f 0x0 0x3 0x76 0x23fa 0x24ba 0x0 0x3 0x76 0x24bb 0x2511 0x1 0x3 0x76 0x2512 0x2546 0x2 0x3 0x76 0x2547 0x25bb 0x0 0x3 0x77 0x25bc 0x25d9 0x2 0x3 0x77 0x25da 0x2629 0x0 0x3 0x78 0x262a 0x268a 0x1 0x3 0x78 0x268b 0x268d 0x0 0x3 0x7a 0x26c0 0x283d 0x0 0x3 0x7a 0x283e 0x2877 0x1 0x3 0x7c 0x8d68 0x8dfd 0x0 0x3 0x80 0x9376 0x9398 0x1 0x3 0x80 0x9399 0x9569 0x0 0x3 0x81 0x956a 0x96e4 0x0 0x3 0x81 0x96e5 0x96f9 0x1 0x3 0x82 0x96fa 0x98c2 0x0 0x3 0x82 0x98c3 0x994e 0x1 0x3 0x82 0x994f 0x9ae1 0x0 0x3 0x83 0x9ae2 0x9b20 0x1 0x3 0x83 0x9b21 0x9d5c 0x0 0x3 0x83 0x9d5d 0x9de8 0x1 0x3 0x83 0x9de9 0xa025 0x0 0x3 0x83 0xa026 0xa0b1 0x1 0x3 0x83 0xa0b2 0xa275 0x0 0x3 0x84 0xa276 0xa30c 0x0 0x3 0x84 0xa30d 0xa398 0x1 0x3 0x84 0xa399 0xa5d4 0x0 0x3 0x84 0xa5d5 0xa660 0x1 0x3 0x84 0xa661 0xa89d 0x0 0x3 0x84 0xa89e 0xa929 0x1 0x3 0x84 0xa92a 0xaa45 0x0 0x3 0x8a 0xd7c8 0xd813 0x0 0x3 0x8a 0xd814 0xd89f 0x1 0x3 0x8a 0xd8a0 0xdadc 0x0 0x3 0x8a 0xdadd 0xdb68 0x1 0x3 0x8a 0xdb69 0xdda3 0x0 0x3 0x9c 0x10384 0x1045d 0x0 0x3 0x9c 0x1045e 0x104e9 0x1 0x3 0x9c 0x104ea 0x10707 0x0 0x3 0xa1 0x10bea 0x10c9a 0x0 0x3 0xa1 0x10c9b 0x10ce1 0x1 0x3 0xa1 0x10ce2 0x10d26 0x2 0x3 0xa1 0x10d27 0x10d47 0x0 0x4 0x33 0x0 0x0 0x0 0x4 0x34 0x0 0x0 0x0 0x4 0x35 0x0 0x0 0x1 0x4 0x36 0x0 0x0 0x0 0x4 0x37 0x0 0x0 0x2 0x4 0x38 0x0 0x0 0x1 0x5 0x3d 0x0 0x0 0x2 0x5 0x3e 0x0 0x0 0x0 0x5 0x47 0x0 0x0 0x2>; + samsung,fd_on_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 40 40 29 01 00 00 78 00 03 f0 a5 a5]; + samsung,fd_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 80 40 29 01 00 00 78 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 91 01 01 29 00 00 00 00 00 02 53 27 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 3c 0d 00 00 00 00 3c 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 38 00 00 00 18 03 38 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 24 a4 29 01 00 00 00 00 02 f7 0f 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revA = <0x29000000 0x3f0 0x5a5a2900 0x0 0x3910101 0x29010000 0x253 0x26290000 0x2 0xf70f2901 0x1100 0x3f0a5a5>; + samsung,lpm_off_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 40 0d 00 00 00 00 40 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 3d 00 00 00 18 03 3d 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 26 e4 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_60nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 24]; + samsung,lpm_30nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 25]; + samsung,lpm_10nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 26]; + samsung,lpm_2nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 27]; + samsung,lpm_brightnes_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 02 53 26 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xe>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + samsung,ub-con-det = <0xffffffff 0x5 0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "irq_check"; + qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; + samsung,esd-irq-gpio1 = <0xffffffff 0xb 0x0>; + phandle = <0xe>; + + qcom,mdss-dsi-display-timings { + + fhd90 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0xf>; + qcom,mdss-dsi-panel-framerate = <0x5a>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x2590>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 1e 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 54 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 03 60 08 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 5a 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + + fhd60 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0x10>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x3dfa>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 1e 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 54 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 5a 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + + qcom,panel-supply-entries { + #address-cells = <0x1>; + #size-cells = <0x0>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vci"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vddi"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1b7740>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x2>; + }; + }; + }; + }; + }; + + fragment@86 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_PBA_BOOTING_FHD"; + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x0>; + qcom,mdss-dsi-bl-max-level = <0x639c>; + qcom,mdss-brightness-max-level = <0x639c>; + qcom,mdss-dsi-interleave-mode = <0x0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x3c>; + qcom,mdss-pan-physical-height-dimension = <0x6a>; + qcom,mdss-dsi-panel-mode-gpio-state = "invalid"; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + samsung,candela_map_table_revA = <0x0 0x0 0x2 0x5 0x1 0x2 0x2 0x6 0x2 0x3 0x3 0x7 0x3 0x4 0x4 0x8 0x4 0x5 0x5 0x9 0x5 0x6 0x6 0xa 0x6 0x7 0x7 0xb 0x7 0x8 0x8 0xc 0x8 0x9 0x9 0xd 0x9 0xa 0xa 0xe 0xa 0xb 0xb 0xf 0xb 0xc 0xc 0x10 0xc 0xd 0xd 0x11 0xd 0xe 0xe 0x13 0xe 0xf 0xf 0x14 0xf 0x10 0x10 0x15 0x10 0x11 0x11 0x16 0x11 0x12 0x12 0x18 0x12 0x13 0x13 0x19 0x13 0x14 0x14 0x1b 0x14 0x15 0x15 0x1d 0x15 0x16 0x16 0x1e 0x16 0x17 0x18 0x20 0x17 0x19 0x1a 0x22 0x18 0x1b 0x1c 0x25 0x19 0x1d 0x1d 0x27 0x1a 0x1e 0x20 0x29 0x1b 0x21 0x22 0x2c 0x1c 0x23 0x24 0x2f 0x1d 0x25 0x26 0x32 0x1e 0x27 0x28 0x35 0x1f 0x29 0x2b 0x38 0x20 0x2c 0x2e 0x3c 0x21 0x2f 0x31 0x40 0x22 0x32 0x34 0x44 0x23 0x35 0x38 0x48 0x24 0x39 0x3b 0x4d 0x25 0x3c 0x3f 0x52 0x26 0x40 0x43 0x57 0x27 0x44 0x47 0x5d 0x28 0x48 0x4c 0x62 0x29 0x4d 0x50 0x69 0x2a 0x51 0x56 0x6f 0x2b 0x57 0x5b 0x77 0x2c 0x5c 0x61 0x7e 0x2d 0x62 0x68 0x86 0x2e 0x69 0x6e 0x8f 0x2f 0x6f 0x76 0x98 0x30 0x77 0x7d 0xa2 0x31 0x7e 0x85 0xac 0x32 0x86 0x8e 0xb7 0x33 0x8f 0x96 0xc3 0x34 0x97 0xa0 0xcf 0x35 0xa1 0xaa 0xdc 0x36 0xab 0xb5 0xea 0x37 0xb6 0xc1 0xf9 0x38 0xc2 0xcd 0x109 0x39 0xce 0xda 0x11a 0x3a 0xdb 0xe6 0x12c 0x3b 0xe7 0xf2 0x13c 0x3c 0xf3 0xfe 0x14d 0x3d 0xff 0xff 0x168>; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xf>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + phandle = <0xf>; + + qcom,mdss-dsi-display-timings { + + fhd@0 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-front-porch = <0xa4>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-v-back-porch = <0x3>; + qcom,mdss-dsi-v-front-porch = <0x9>; + qcom,mdss-dsi-panel-clockrate = <0x35866480>; + qcom,mdss-dsi-panel-phy-timings = <0x1e0808 0x24220808 0x8020400>; + qcom,mdss-dsi-on-command = [39 01 00 00 78 00 02 11 00]; + qcom,mdss-dsi-off-command = <0x5010000 0x24000128 0x5010000 0x78000110>; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + }; + }; + }; + + fragment@87 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_te { + + sde_te_active { + phandle = <0x9>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + + sde_te_suspend { + phandle = <0xc>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + + pmx_sde { + phandle = <0xcd>; + + sde_dsi_active { + phandle = <0xa>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + bias-disable = <0x0>; + }; + }; + + sde_dsi_suspend { + phandle = <0xd>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable = <0x0>; + }; + }; + }; + }; + }; + + fragment@88 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_ub_det { + + sde_ub_det_default { + pins = "gpio5"; + function = "normal"; + input-enable; + power-source = <0x1>; + bias-disable; + phandle = <0xb>; + }; + }; + }; + }; + + fragment@89 { + target = <0xffffffff>; + + __overlay__ { + + qcom,dsi-display@9 { + label = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + qcom,display-type = "primary"; + phandle = <0xce>; + }; + + qcom,dsi-display@10 { + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,display-type = "primary"; + phandle = <0xcf>; + }; + }; + }; + + fragment@90 { + target = <0xffffffff>; + + __overlay__ { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x2dc6c0>; + regulator-boot-on; + }; + }; + + fragment@91 { + target = <0xffffffff>; + + __overlay__ { + + tsp_int { + phandle = <0x64>; + + mux { + pins = "gpio9"; + function = "gpio"; + }; + + config { + pins = "gpio9"; + input-enable; + bias-disable; + }; + }; + }; + }; + + fragment@92 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + synaptics_tcm@20 { + status = "disabled"; + }; + + atmel_mxt_ts@4a { + status = "disabled"; + }; + + touchscreen@20 { + status = "ok"; + compatible = "zinitix,zt_ts_device"; + reg = <0x20>; + pinctrl-names = "on_state", "off_state"; + pinctrl-0 = <0x64>; + pinctrl-1 = <0x64>; + avdd-supply = <0xffffffff>; + zinitix,gpio_ldo_en; + zinitix,irq_type = <0x2008>; + zinitix,x_resolution = <0x438>; + zinitix,y_resolution = <0x960>; + zinitix,page_size = <0x80>; + zinitix,irq_gpio = <0xffffffff 0x9 0x2008>; + zinitix,chip_name = "ZT7650"; + zinitix,select_lcdid = <0x801000 0x801001 0x801002>; + zinitix,firmware_name = "tsp_zinitix/zt7650_a72.bin", "tsp_zinitix/zt7650_a72.bin", "tsp_zinitix/zt7650_a72_3rd.bin"; + zinitix,spay; + zinitix,aod; + zinitix,aot; + zinitix,mis_cal_check; + support_ear_detect_mode; + support_dex_mode; + zinitix,bringup = <0x0>; + zinitix,ss_touch_num = <0x1>; + phandle = <0xd0>; + }; + + touchscreen@49 { + status = "ok"; + compatible = "stm,fts_touch"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x64>; + avdd-supply = <0xffffffff>; + stm,irq_gpio = <0xffffffff 0x9 0x2008>; + stm,max_coords = <0xfff 0xfff>; + stm,firmware_name = "tsp_stm/fts5cu56a_a72.bin"; + stm,tclm_level = <0x2>; + stm,afe_base = <0x7>; + stm,bringup = <0x0>; + stm,support_fod; + stm,enable_settings_aot; + support_ear_detect; + support_mis_calibration_test; + support_dex_mode; + support_open_short_test; + support_sram_test; + stm,ss_touch_num = <0x1>; + phandle = <0xd1>; + }; + }; + }; + + fragment@93 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + + key_vol_up_default { + pins = "gpio8"; + function = "normal"; + input-enable; + bias-pull-up; + power-source = <0x0>; + phandle = <0x65>; + }; + }; + }; + }; + + fragment@94 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "default"; + pinctrl-0 = <0x65>; + + vol_up { + label = "volume_up"; + gpios = <0xffffffff 0x8 0x1>; + linux,input-type = <0x1>; + linux,code = <0x73>; + debounce-interval = <0xf>; + }; + }; + }; + + fragment@95 { + target = <0xffffffff>; + + __overlay__ { + + ss_touch { + compatible = "samsung,ss_touch"; + ss_touch,numbers = <0x1>; + }; + }; + }; + + fragment@96 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x66>; + status = "okay"; + + sm5714@49 { + status = "okay"; + compatible = "siliconmitus,sm5714mfd"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x67>; + sm5714,irq-gpio = <0xffffffff 0x21 0x0>; + sm5714,wakeup; + }; + }; + }; + + fragment@97 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x68>; + status = "okay"; + + usbpd-sm5714@33 { + status = "okay"; + compatible = "sm5714-usbpd"; + reg = <0x33>; + pinctrl-names = "default"; + pinctrl-0 = <0x69>; + usbpd,usbpd_int = <0xffffffff 0x68 0x0>; + support_pd_role_swap; + + pdic-manager { + pdic,max_power = <0x1388>; + pdic_op_power = <0x9c4>; + pdic_max_voltage = <0x1770>; + pdic_max_current = <0x7d0>; + pdic,min_current = <0x1f4>; + pdic,giveback = <0x0>; + pdic,usb_com_capable = <0x1>; + pdic,no_usb_suspend = <0x1>; + source,max_voltage = <0x1388>; + source,min_voltage = <0xfa0>; + source,max_power = <0x9c4>; + }; + }; + }; + }; + + fragment@98 { + target = <0xffffffff>; + + __overlay__ { + + if_pmic_irq { + + if_pmic_irq_default { + phandle = <0x67>; + + mux { + pins = "gpio33"; + function = "gpio"; + }; + + config { + pins = "gpio33"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + + usbpd_irq { + + usbpd_irq_default { + phandle = <0x69>; + + mux { + pins = "gpio104"; + function = "gpio"; + }; + + config { + pins = "gpio104"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + }; + }; + + fragment@99 { + target = <0xffffffff>; + + __overlay__ { + qcom,qusb-phy-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x15 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x47 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + qcom,qusb-phy-host-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x15 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x47 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + }; + }; + + fragment@100 { + target = <0xffffffff>; + + __overlay__ { + + nfc_qupv3_se0_i2c_sleep { + phandle = <0x6a>; + + mux { + pins = "gpio34", "gpio35"; + function = "gpio"; + }; + + config { + pins = "gpio34", "gpio35"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + nfc_clk_req_gpio { + phandle = <0x6b>; + + mux { + pins = "gpio31"; + function = "gpio"; + }; + + config { + pins = "gpio31"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_irq_gpio { + phandle = <0x6c>; + + mux { + pins = "gpio37"; + function = "gpio"; + }; + + config { + pins = "gpio37"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_ven_gpio { + phandle = <0x6d>; + + mux { + pins = "gpio12"; + function = "gpio"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-high; + }; + }; + + nfc_firm_gpio { + phandle = <0x6e>; + + mux { + pins = "gpio36"; + function = "gpio"; + }; + + config { + pins = "gpio36"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + nfc_ldo_en_gpio { + phandle = <0x6f>; + + mux { + pins = "gpio68"; + function = "gpio"; + }; + + config { + pins = "gpio68"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@101 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + pinctrl-1 = <0x6a>; + qcom,clk-freq-out = <0x61a80>; + + sec-nfc@27 { + compatible = "sec-nfc"; + reg = <0x27>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + sec-nfc,ven-gpio = <0xffffffff 0xc 0x0>; + sec-nfc,irq-gpio = <0xffffffff 0x25 0x0>; + sec-nfc,firm-gpio = <0xffffffff 0x24 0x0>; + sec-nfc,clk_req-gpio = <0xffffffff 0x1f 0x0>; + sec-nfc,pvdd-gpio = <0xffffffff 0x44 0x0>; + sec-nfc,clk_req_wake; + sec-nfc,bootloader_ver = <0x6>; + pinctrl-names = "default"; + pinctrl-0 = <0x6b 0x6c 0x6d 0x6e 0x6f>; + }; + }; + }; + + fragment@102 { + target = <0xffffffff>; + + __overlay__ { + + et7xx_rst { + + et7xx_rst { + phandle = <0x70>; + + mux { + pins = "gpio91"; + function = "gpio"; + }; + + config { + pins = "gpio91"; + driver-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@103 { + target = <0xffffffff>; + + __overlay__ { + regulator-name = "VDD_BTP_3P3"; + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + }; + }; + + fragment@104 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + + etspi,et7xx { + compatible = "etspi,et7xx"; + reg = <0x0>; + spi-max-frequency = <0xbebc20>; + pinctrl-names = "default"; + pinctrl-0 = <0x70>; + gpio-controller; + #gpio-cells = <0x2>; + etspi-regulator = "VDD_BTP_3P3"; + etspi-sleepPin = <0xffffffff 0x5b 0x0>; + etspi-chipid = "ET713"; + etspi-modelinfo = "A725"; + etspi-position = "12.03,0.00,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + etspi-rb = "547,-1,-1,FFFFFF"; + }; + }; + }; + + fragment@105 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@106 { + target = <0xffffffff>; + + __overlay__ { + + qcom,flash_0 { + label = "flash"; + qcom,led-name = "led:flash_0"; + qcom,max-current = <0x5dc>; + qcom,default-led-trigger = "flash0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x5dc>; + qcom,duration-ms = <0x500>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + qcom,record-current-ma = <0xe1>; + phandle = <0x71>; + }; + + qcom,torch_0 { + label = "torch"; + qcom,led-name = "led:torch_0"; + qcom,max-current = <0x1f4>; + qcom,default-led-trigger = "torch0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x12c>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + phandle = <0x72>; + }; + + qcom,camera-flash@0 { + cell-index = <0x0>; + compatible = "qcom,camera-flash"; + flash-source = <0x71>; + torch-source = <0x72>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x7c>; + }; + + qcom,camera-flash@1 { + cell-index = <0x1>; + compatible = "qcom,camera-flash"; + flash-source = <0x71>; + torch-source = <0x72>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x97>; + }; + + qcom,cam-res-mgr { + compatible = "qcom,cam-res-mgr"; + shared-gpios = <0x3f>; + pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; + status = "ok"; + pinctrl-0 = <0x73>; + pinctrl-1 = <0x74>; + }; + }; + }; + + fragment@107 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + sm5714-fled { + compatible = "siliconmitus,sm5714-fled"; + reg = <0x49>; + status = "okay"; + slave-addr = <0x92>; + flash-en-gpio = <0xffffffff 0x16 0x0>; + torch-en-gpio = <0xffffffff 0x43 0x0>; + flash-brightness = <0xf>; + preflash-brightness = <0x7>; + torch-brightness = <0x7>; + factory_current = <0x0>; + timeout = <0xff>; + }; + }; + }; + + fragment@108 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + qcom,ois@62 { + compatible = "qcom,ois"; + cell-index = <0x0>; + reg = <0x62>; + slave-addr = <0xc4>; + slave-id = <0x460>; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vdig"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x2ab980>; + rgltr-max-voltage = <0x2ab980>; + rgltr-load-current = <0x30d40>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x76 0x77>; + pinctrl-1 = <0x78 0x79>; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x20 0x0 0xffffffff 0x2b 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x0>; + gpio-custom1 = <0x1>; + gpio-vio = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x0 0x0 0x0>; + gpio-req-tbl-label = "MCU_RESET0", "MCU_BOOT0", "MCU_VIO"; + status = "ok"; + cam_vdig-supply = <0x7a>; + phandle = <0x7e>; + }; + }; + }; + + fragment@109 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@0 { + cell-index = <0x0>; + compatible = "qcom,cam-sensor"; + reg = <0x0>; + slave-addr = <0x34>; + csiphy-sd-index = <0x0>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x7b>; + led-flash-src = <0x7c>; + eeprom-src = <0x7d>; + ois-src = <0x7e>; + cam_vio-supply = <0x7f>; + cam_vaf-supply = <0x75>; + cam_vana-supply = <0x75>; + cam_vdig-supply = <0x80>; + cam_clk-supply = <0xffffffff>; + cam_bob-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_bob", "cam_clk"; + rgltr-cntrl-support; + pwm-switch; + rgltr-min-voltage = <0x1b7740 0x2ab980 0xf4240 0x325aa0 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x10c8e0 0x325aa0 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x1e8480 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x81 0x82>; + pinctrl-1 = <0x83 0x84>; + gpios = <0xffffffff 0xd 0x0 0xffffffff 0x1e 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x1>; + gpio-custom1 = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_VANA0"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x41>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0xd2>; + }; + + qcom,cam-sensor@2 { + cell-index = <0x2>; + compatible = "qcom,cam-sensor"; + reg = <0x3>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x85>; + cam_vio-supply = <0x7f>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x86 0x87 0x88 0x89>; + pinctrl-1 = <0x8a 0x8b 0x8c 0x8d>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x2D { + cell-index = <0x2>; + compatible = "qcom,eeprom"; + reg = <0x2d>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7f>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x86 0x87 0x88 0x89>; + pinctrl-1 = <0x8a 0x8b 0x8c 0x8d>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + phandle = <0x85>; + }; + }; + }; + + fragment@110 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@1 { + cell-index = <0x1>; + compatible = "qcom,cam-sensor"; + reg = <0x1>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x8e>; + cam_vio-supply = <0x7f>; + cam_vana-supply = <0x8f>; + cam_vdig-supply = <0x90>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x91 0x92>; + pinctrl-1 = <0x93 0x94>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@8 { + cell-index = <0x8>; + compatible = "qcom,cam-sensor"; + reg = <0x8>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x8e>; + cam_vio-supply = <0x7f>; + cam_vana-supply = <0x8f>; + cam_vdig-supply = <0x90>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x91 0x92>; + pinctrl-1 = <0x93 0x94>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@3 { + cell-index = <0x3>; + compatible = "qcom,cam-sensor"; + reg = <0x2>; + slave-addr = <0x42>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x95>; + eeprom-src = <0x96>; + ois-src = <0x7e>; + led-flash-src = <0x97>; + cam_vio-supply = <0x7f>; + cam_vaf-supply = <0x75>; + cam_vdig-supply = <0x98>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x10c8e0 0x0>; + rgltr-max-voltage = <0x1b7740 0x10c8e0 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x99 0x9a 0x9b>; + pinctrl-1 = <0x9c 0x9d 0x9e>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2", "CAM_VAF0"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + gpio-vaf = <0x3>; + phandle = <0xd3>; + }; + + qcom,cam-sensor@4 { + cell-index = <0x4>; + compatible = "qcom,cam-sensor"; + reg = <0x4>; + slave-addr = <0x7e>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + led-flash-src = <0x7c>; + eeprom-src = <0x9f>; + cam_vio-supply = <0x7f>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0xa0 0xa1 0xa2 0x89>; + pinctrl-1 = <0xa3 0xa4 0xa5 0x8d>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x4a 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x3F { + cell-index = <0x4>; + compatible = "qcom,eeprom"; + reg = <0x3f>; + slave-addr = <0x7e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7f>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0xa0 0xa1 0xa2 0x89>; + pinctrl-1 = <0xa3 0xa4 0xa5 0x8d>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x4a 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x9f>; + }; + }; + }; + + fragment@111 { + target = <0xffffffff>; + + __overlay__ { + + qcom,actuator@0xC { + cell-index = <0x0>; + reg = <0xc>; + slave-addr = <0x18>; + compatible = "i2c_actuator"; + rgltr-cntrl-support; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x1e8480>; + cam_vio-supply = <0x7f>; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x3f 0x0>; + gpio-vaf = <0x0>; + gpio-req-tbl-num = <0x0>; + gpio-req-tbl-flags = <0x0>; + gpio-req-tbl-label = "CAM_VAF0"; + phandle = <0x7b>; + }; + + qcom,actuator2 { + cell-index = <0x2>; + compatible = "qcom,actuator"; + reg = <0x1e>; + slave-addr = <0x1e>; + cam_vio-supply = <0x7f>; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x1e8480>; + qcom,cam-power-seq-type = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x1>; + cci-master = <0x1>; + status = "ok"; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x3f 0x0>; + gpio-vaf = <0x0>; + gpio-req-tbl-num = <0x0>; + gpio-req-tbl-flags = <0x0>; + gpio-req-tbl-label = "CAM_VAF0"; + phandle = <0x95>; + }; + + qcom,eeprom@50 { + cell-index = <0x0>; + reg = <0x50>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa0>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x2>; + cam_vaf-supply = <0x75>; + cam_vio-supply = <0x7f>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x3f 0x0>; + gpio-vaf = <0x0>; + gpio-req-tbl-num = <0x0>; + gpio-req-tbl-flags = <0x0>; + gpio-req-tbl-label = "CAM_VAF0"; + phandle = <0x7d>; + }; + + qcom,eeprom@51 { + cell-index = <0x1>; + reg = <0x51>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa2>; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x2>; + cam_vio-supply = <0x7f>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-mode = <0x0>; + sensor-position = <0x1>; + rgltr-cntrl-support; + phandle = <0x8e>; + }; + + qcom,eeprom@55 { + cell-index = <0x3>; + reg = <0x55>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xaa>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x1>; + cam_vaf-supply = <0x75>; + cam_vio-supply = <0x7f>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x3f 0x0>; + gpio-vaf = <0x0>; + gpio-req-tbl-num = <0x0>; + gpio-req-tbl-flags = <0x0>; + gpio-req-tbl-label = "CAM_VAF0"; + phandle = <0x96>; + }; + }; + }; + + fragment@112 { + target = <0xffffffff>; + + __overlay__ { + + samsung,vibrator { + compatible = "samsung_vib"; + samsung,vib_type = "COINDC"; + status = "ok"; + phandle = <0xd4>; + }; + }; + }; + + fragment@113 { + target = <0xffffffff>; + + __overlay__ { + + hall { + status = "okay"; + compatible = "hall"; + linux,input-type = <0x1>; + linux,code = <0x15>; + hall,gpio_flip_cover = <0xffffffff 0xa 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa6>; + }; + + certify_hall { + status = "okay"; + compatible = "certify_hall"; + linux,input-type = <0x1>; + linux,code = <0x1b>; + certify_hall,gpio_certify_cover = <0xffffffff 0x5d 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa7>; + }; + }; + }; + + fragment@114 { + target = <0xffffffff>; + + __overlay__ { + + hall { + + hall_default { + pins = "gpio10"; + function = "normal"; + output-disable; + input-enable; + bias-disable; + power-source = <0x0>; + phandle = <0xa6>; + }; + }; + }; + }; + + fragment@115 { + target = <0xffffffff>; + + __overlay__ { + + certify_hall_default { + phandle = <0xa7>; + + mux { + pins = "gpio93"; + function = "gpio"; + }; + + config { + pins = "gpio93"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + }; + + fragment@116 { + target = <0xffffffff>; + + __overlay__ { + + rpmh-regulator-ldoc8 { + compatible = "qcom,rpmh-vrm-regulator"; + mboxes = <0xffffffff 0x0>; + qcom,resource-name = "ldoc8"; + qcom,regulator-type = "pmic5-ldo"; + qcom,supported-modes = <0x2 0x4>; + qcom,mode-threshold-currents = <0x0 0x1>; + + regulator-pm6150l-l8 { + regulator-name = "pm6150l_l8"; + qcom,set = <0x3>; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + qcom,init-voltage = <0x1b7740>; + regulator-always-on; + qcom,init-mode = <0x2>; + phandle = <0xd5>; + }; + }; + + rpmh-regulator-ldoa5 { + + regulator-pm6150-l5 { + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + regulator-always-on; + phandle = <0xd6>; + }; + }; + + i2c@17 { + status = "ok"; + cell-index = <0x11>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x33 0x0 0xffffffff 0x34 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0xa8>; + phandle = <0xd7>; + + sx9360-i2c@28 { + compatible = "sx9360"; + reg = <0x28>; + pinctrl-names = "default"; + pinctrl-0 = <0xa9>; + interrupt-parent = <0xffffffff>; + interrupts = <0x4 0xc4 0x0 0x2>; + sx9360,nirq-gpio = <0xffffffff 0x5 0x1>; + sx9360,reggnrlctrl2_reg = <0x32>; + sx9360,againfreq_reg = <0x38>; + sx9360,refagainfreq_reg = <0x36>; + sx9360,gainrawfilt_reg = <0x1a>; + sx9360,refgainrawfilt_reg = <0x22>; + sx9360,proxthresh_reg = <0x22>; + sx9360,hyst_reg = <0x15>; + sx9360,regproxctrl3_reg = <0xc>; + sx9360,resolution_reg = <0xf>; + sx9360,refresolution_reg = <0xf>; + sx9360,hallic_cert_detect = <0x1>; + }; + }; + }; + }; + + fragment@117 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x6 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x22 0x25 0x2a 0x2d 0x2f 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x43 0x44 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5b 0x5e 0x73 0x74 0x76>; + }; + }; + + fragment@118 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@119 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x22 0x25 0x2a 0x2d 0x2f 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x43 0x44 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5b 0x5e 0x73 0x74 0x76>; + }; + }; + + fragment@120 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@121 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@122 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + + sm5440@63 { + status = "okay"; + compatible = "siliconmitus,sm5440"; + reg = <0x63>; + pinctrl-names = "default"; + }; + }; + }; + + fragment@123 { + target = <0xffffffff>; + + __overlay__ { + + bat_thm { + label = "bat_thm"; + reg = <0x4f>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + + chg_thm { + label = "chg_thm"; + reg = <0x4d>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + }; + }; + + fragment@124 { + target = <0xffffffff>; + + __overlay__ { + + sec-direct-charger { + status = "okay"; + compatible = "samsung,sec-direct-charger"; + charger,battery_name = "battery"; + charger,main_charger = "sm5714-charger"; + charger,direct_charger = "sm5440-charger"; + charger,dchg_min_current = <0x7d0>; + charger,dchg_temp_low_threshold = <0xb4>; + charger,dchg_temp_high_threshold = <0x1a4>; + }; + + battery { + pinctrl-names = "default"; + battery,chip_vendor = "QCOM"; + status = "okay"; + compatible = "samsung,sec-battery"; + battery,vendor = "Battery"; + battery,charger_name = "sec-direct-charger"; + battery,fuelgauge_name = "sm5714-fuelgauge"; + battery,fgsrc_switch_name = "sm5714-fuelgauge"; + battery,technology = <0x2>; + battery,batt_data_version = <0x1>; + battery,temp_adc_type = <0x1>; + battery,temp_channel_raw = <0x1>; + battery,adc_check_count = <0x5>; + battery,temp_check_type = <0x1>; + battery,chg_temp_check_type = <0x1>; + battery,thermal_source = <0x2>; + battery,chg_thermal_source = <0x2>; + battery,temp_table_adc = <0x7e4 0x941 0xada 0xcc1 0xef2 0x1188 0x1493 0x1821 0x1c49 0x20dc 0x25dc 0x2b94 0x31b1 0x3854 0x3ef2 0x4588 0x4bdd 0x51ec 0x5781 0x5c85 0x60b2 0x6456 0x675a>; + battery,temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,chg_temp_table_adc = <0x761 0x8c1 0xa5c 0xc35 0xe5d 0x10e2 0x13e6 0x1766 0x1b85 0x200c 0x2503 0x2ab1 0x30cc 0x3774 0x3e15 0x44b0 0x4b25 0x5141 0x56de 0x5bf6 0x6042 0x63fd 0x6711>; + battery,chg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,polling_time = <0xa 0x1e 0x1e 0x1e 0xe10>; + battery,cable_check_type = <0x4>; + battery,cable_source_type = <0x1>; + battery,polling_type = <0x1>; + battery,monitor_initial_count = <0x0>; + battery,battery_check_type = <0x0>; + battery,ovp_uvlo_check_type = <0x3>; + battery,temp_check_count = <0x1>; + battery,overheatlimit_threshold = <0x2bc>; + battery,overheatlimit_recovery = <0x2a8>; + battery,wire_warm_overheat_thresh = <0x1f4>; + battery,wire_normal_warm_thresh = <0x1a4>; + battery,wire_cool1_normal_thresh = <0xb4>; + battery,wire_cool2_cool1_thresh = <0x96>; + battery,wire_cool3_cool2_thresh = <0x32>; + battery,wire_cold_cool3_thresh = <0x0>; + battery,wire_warm_current = <0x6c6>; + battery,wire_cool1_current = <0xa8c>; + battery,wire_cool2_current = <0x485>; + battery,wire_cool3_current = <0x1e5>; + battery,low_temp_topoff = <0xfa>; + battery,high_temp_topoff = <0xfa>; + battery,low_temp_float = <0x111c>; + battery,high_temp_float = <0x1036>; + battery,full_check_type = <0x7>; + battery,full_check_type_2nd = <0x7>; + battery,full_check_count = <0x1>; + battery,chg_gpio_full_check = <0x0>; + battery,chg_high_temp = <0x28a>; + battery,chg_high_temp_recovery = <0x276>; + battery,chg_input_limit_current = <0x3e8>; + battery,chg_charging_limit_current = <0x578>; + battery,wpc_temp_control_source = <0x1>; + battery,wpc_high_temp = <0x17c>; + battery,wpc_high_temp_recovery = <0x168>; + battery,wpc_input_limit_current = <0x258>; + battery,wpc_charging_limit_current = <0x3e8>; + battery,wpc_temp_lcd_on_control_source = <0x1>; + battery,wpc_lcd_on_high_temp = <0x17c>; + battery,wpc_lcd_on_high_temp_rec = <0x168>; + battery,wpc_lcd_on_input_limit_current = <0x1c2>; + battery,wpc_store_high_temp = <0x168>; + battery,wpc_store_high_temp_recovery = <0x154>; + battery,wpc_store_charging_limit_current = <0x190>; + battery,wpc_store_lcd_on_high_temp = <0x168>; + battery,wpc_store_lcd_on_high_temp_rec = <0x12c>; + battery,wpc_store_lcd_on_charging_limit_current = <0x190>; + battery,sleep_mode_limit_current = <0x1f4>; + battery,wc_full_input_limit_current = <0x64>; + battery,mix_high_temp = <0x1cc>; + battery,mix_high_chg_temp = <0x1f4>; + battery,mix_high_temp_recovery = <0x1c2>; + battery,full_condition_type = <0x9>; + battery,full_condition_soc = <0x5d>; + battery,full_condition_vcell = <0x10ea>; + battery,recharge_check_count = <0x1>; + battery,recharge_condition_type = <0x4>; + battery,recharge_condition_soc = <0x62>; + battery,recharge_condition_vcell = <0x10d6>; + battery,charging_total_time = <0x3840>; + battery,hv_charging_total_time = <0x2a30>; + battery,normal_charging_total_time = <0x4650>; + battery,usb_charging_total_time = <0x8ca0>; + battery,recharging_total_time = <0x1518>; + battery,charging_reset_time = <0x0>; + battery,chg_float_voltage = <0x111c>; + battery,pre_afc_work_delay = <0x7d0>; + battery,pre_wc_afc_work_delay = <0xfa0>; + battery,pre_afc_input_current = <0x1f4>; + battery,pre_wc_afc_input_current = <0x1f4>; + battery,prepare_ta_delay = <0x0>; + battery,swelling_high_rechg_voltage = <0xfa0>; + battery,swelling_low_rechg_voltage = <0x1086>; + battery,siop_input_limit_current = <0x4b0>; + battery,siop_charging_limit_current = <0x3e8>; + battery,siop_hv_input_limit_current = <0x2bc>; + battery,siop_hv_input_limit_current_2nd = <0x226>; + battery,siop_hv_charging_limit_current = <0x3e8>; + battery,ttf_hv_charge_current = <0x992>; + battery,ttf_dc25_charge_current = <0xe42>; + battery,rp_current_rp1 = <0x1f4>; + battery,rp_current_rp2 = <0x5dc>; + battery,rp_current_rp3 = <0xbb8>; + battery,rp_current_rdu_rp3 = <0x834>; + battery,rp_current_abnormal_rp3 = <0x708>; + battery,pd_charging_charge_power = <0x3a98>; + battery,max_charging_current = <0xa8c>; + battery,wireless_cc_cv = <0x55>; + battery,wireless_otg_input_current = <0x384>; + battery,age_data = <0x0 0x111c 0x10d6 0x10b8 0x5d 0x12c 0x1108 0x10c2 0x10a4 0x5c 0x190 0x10f4 0x10ae 0x1090 0x5b 0x2bc 0x10e0 0x109a 0x107c 0x5a 0x3e8 0x10ae 0x1068 0x104a 0x59>; + battery,health_condition = <0x384 0x0 0x4b0 0x0 0x5dc 0x0>; + battery,step_charging_type = <0x0>; + battery,step_charging_charge_power = <0x2ee0>; + battery,step_charging_condition = <0x2d 0x64>; + battery,step_charging_condition_curr = <0xa8c 0xa8c>; + battery,step_charging_current = <0xa8c 0xa8c>; + battery,step_charging_float_voltage = <0x1036 0x111c>; + battery,dc_step_chg_type = <0xe9>; + battery,dc_step_chg_charge_power = <0x55f0>; + battery,dc_step_chg_step = <0x3>; + battery,dc_step_chg_cond_vol = <0x1004 0x1086 0x111c>; + battery,dc_step_chg_cond_iin = <0x802 0x79e 0x0>; + battery,dc_step_chg_iin_check_cnt = <0x3>; + battery,dc_step_chg_cond_soc = <0x14 0x3c 0x64>; + battery,dc_step_chg_val_vfloat = <0x1004 0x1086 0x111c>; + battery,dc_step_chg_val_iout = <0x13ec 0x1004 0xf3c>; + battery,standard_curr = <0xf3c>; + battery,expired_time = <0x288c>; + battery,recharging_expired_time = <0x1518>; + battery,battery_full_capacity = <0x1388>; + battery,cisd_max_voltage_thr = <0x1388>; + battery,max_input_voltage = <0x2328>; + battery,max_input_current = <0xbb8>; + battery,cisd_alg_index = <0x8>; + battery,ignore_cisd_index = <0x0 0x3c0>; + battery,ignore_cisd_index_d = <0x0 0x78>; + battery,ttf_capacity = <0x10cc>; + battery,cv_data = <0xa59 0x367 0x546 0xa1a 0x370 0x502 0x960 0x37b 0x4c5 0x8cf 0x384 0x485 0x828 0x38f 0x43a 0x79f 0x398 0x3f1 0x717 0x3a2 0x3b1 0x676 0x3ad 0x33e 0x5e0 0x3b6 0x2e0 0x531 0x3c1 0x263 0x4a2 0x3ca 0x1f8 0x406 0x3df 0xf5 0x387 0x3de 0xb8 0x2f4 0x3e8 0x0>; + io-channels = <0xffffffff 0x4f 0xffffffff 0x4d>; + io-channel-names = "adc-temp", "adc-chg-temp"; + }; + + sm5714-fuelgauge { + status = "okay"; + fuelgauge,fuel_alert_soc = <0x1>; + fuelgauge,capacity_max = <0x3e8>; + fuelgauge,capacity_max_margin = <0x12c>; + fuelgauge,capacity_min = <0x0>; + fuelgauge,capacity_calculation_type = <0x1f>; + fuelgauge,using_temp_compensation; + fuelgauge,low_temp_limit = <0x64>; + fuelgauge,using_hw_vempty; + fuelgauge,sw_v_empty_voltage = <0xc80>; + fuelgauge,sw_v_empty_voltage_cisd = <0xc1c>; + fuelgauge,sw_v_empty_recover_voltage = <0xd98>; + fuelgauge,capacity = <0x1388>; + + battery_params { + battery,id = <0x0>; + battery0,battery_type = <0x114e 0x21b3>; + battery0,battery_table0 = <0x1400 0x1b77 0x1c40 0x1ccb 0x1d31 0x1d6f 0x1d81 0x1d88 0x1da0 0x1de3 0x1e1f 0x1e45 0x1e5e 0x1e7e 0x1ebc 0x1efb 0x1f27 0x1faf 0x2009 0x209b 0x2103 0x218b 0x227c 0x2400>; + battery0,battery_table1 = <0x0 0x99 0x1b3 0x2cc 0x3e6 0x500 0x7b3 0xa80 0xd4c 0x12cc 0x1b19 0x2099 0x2619 0x2b99 0x3133 0x36b3 0x3980 0x3f00 0x4480 0x4ccc 0x524c 0x58e6 0x6400 0x6419>; + battery0,battery_table2 = <0x4b4b 0x4444 0x4040 0x3e3e 0x3c3c 0x3b3b 0x3838 0x3737 0x3535 0x3434 0x3434 0x3333 0x3333 0x3333 0x3333 0x3232>; + battery0,rs_value = <0xa3 0xa3 0x3800 0x200 0x599 0x599 0x100>; + battery0,v_alarm = <0xc1c 0xc8>; + battery0,topoff = <0x2ee>; + battery0,i_cal = <0x0 0x0 0x800 0x800 0x0 0x0 0x800 0x81e>; + battery0,v_cal = <0x1 0x0 0x0 0x1 0x0 0x0 0x0>; + battery0,temp_std = <0x19>; + battery0,tem_poff = <0xd48 0x32 0xcb2 0x32>; + battery0,aux_ctrl = <0x322 0x5800>; + battery0,data_ver = <0x9>; + battery0,v_max_table = <0x227c 0x225f 0x2243 0x2226 0x21d9>; + battery0,q_max_table = <0x21b3 0x210d 0x2068 0x1fc2 0x1e23>; + }; + }; + + cable-info { + default_input_current = <0x708>; + default_charging_current = <0x834>; + full_check_current_1st = <0x2ee>; + full_check_current_2nd = <0xfa>; + + current_group_1 { + cable_number = <0x2 0x13 0x15 0x16 0x17 0x1e>; + input_current = <0x1f4>; + charging_current = <0x1f4>; + }; + + current_group_2 { + cable_number = <0x19 0x1f>; + input_current = <0x3e8>; + charging_current = <0x3e8>; + }; + + current_group_3 { + cable_number = <0x5 0x20>; + input_current = <0x5dc>; + charging_current = <0x5dc>; + }; + + current_group_4 { + cable_number = <0x6 0x7 0x8 0x11 0x12>; + input_current = <0x672>; + charging_current = <0xa8c>; + }; + + current_group_5 { + cable_number = <0x9>; + input_current = <0x672>; + charging_current = <0x960>; + }; + + current_group_6 { + cable_number = <0xa 0xc 0xf 0x1b 0x21 0x24>; + input_current = <0x320>; + charging_current = <0x960>; + }; + + current_group_7 { + cable_number = <0xd>; + input_current = <0x2bc>; + charging_current = <0x960>; + }; + + current_group_8 { + cable_number = <0x18>; + input_current = <0x3e8>; + charging_current = <0x1c2>; + }; + + current_group_9 { + cable_number = <0x23>; + input_current = <0x708>; + charging_current = <0x708>; + }; + + current_group_10 { + cable_number = <0xb 0xe 0x10 0x1c 0x23>; + input_current = <0x28a>; + charging_current = <0x960>; + }; + + current_group_11 { + cable_number = <0x1d 0x25>; + input_current = <0x1f4>; + charging_current = <0x4b0>; + }; + + current_group_12 { + cable_number = <0x1 0x4>; + input_current = <0x1db>; + charging_current = <0x226>; + }; + + current_group_13 { + cable_number = <0x22>; + input_current = <0x4b0>; + charging_current = <0x960>; + }; + }; + }; + }; + + fragment@125 { + target = <0xffffffff>; + + __overlay__ { + + dc_thm { + + dc_thm_default { + pins = "gpio7"; + function = "normal"; + bias-high-impedance; + phandle = <0xaa>; + }; + }; + }; + }; + + fragment@126 { + target = <0xffffffff>; + + __overlay__ { + + dc_thm { + label = "dc_thm"; + reg = <0x54>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + }; + }; + + fragment@127 { + target = <0xffffffff>; + + __overlay__ { + + battery { + pinctrl-0 = <0xaa>; + battery,dchg_temp_check_type = <0x1>; + battery,dchg_thermal_source = <0x2>; + battery,dchg_temp_table_adc = <0x8ba 0xa55 0xc29 0xe52 0x10ce 0x13cf 0x1747 0x1b65 0x1fea 0x24d9 0x2a85 0x309e 0x3741 0x3ddf 0x4477 0x4af2 0x5110 0x56b0 0x5bcc 0x6020 0x63e1 0x66f7 0x3444>; + battery,dchg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,dchg_high_temp = <0x28a>; + battery,dchg_high_temp_recovery = <0x276>; + battery,dchg_high_batt_temp = <0x190>; + battery,dchg_high_batt_temp_recovery = <0x17c>; + battery,dchg_input_limit_current = <0x3e8>; + battery,dchg_charging_limit_current = <0x7d0>; + io-channels = <0xffffffff 0x4f 0xffffffff 0x4d 0xffffffff 0x54>; + io-channel-names = "adc-temp", "adc-chg-temp", "adc-dchg-temp"; + }; + }; + }; + + __symbols__ { + dsi_rm69299_visionox_amoled_video = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video"; + dsi_rm69299_visionox_amoled_cmd = "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd"; + dsi_sim_vid = "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video"; + dsi_sim_cmd = "/fragment@3/__overlay__/qcom,mdss_dsi_sim_cmd"; + dsi_sim_dsc_375_cmd = "/fragment@4/__overlay__/qcom,mdss_dsi_sim_dsc_375_cmd"; + dsi_nt36672c_video = "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video"; + dsi_panel_pwr_supply = "/fragment@6/__overlay__/dsi_panel_pwr_supply"; + dsi_panel_pwr_supply_no_labibb = "/fragment@6/__overlay__/dsi_panel_pwr_supply_no_labibb"; + dsi_panel_pwr_supply_labibb_amoled = "/fragment@6/__overlay__/dsi_panel_pwr_supply_labibb_amoled"; + dsi_rm69299_visionox_amoled_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@0"; + dsi_rm69299_visionox_amoled_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@1"; + dsi_sim_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@2"; + dsi_sim_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@3"; + dsi_sim_dsc_375_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@4"; + dsi_nt36672c_video_display = "/fragment@6/__overlay__/qcom,dsi-display@5"; + sde_dsi = "/fragment@6/__overlay__/qcom,dsi-display"; + sde_wb = "/fragment@6/__overlay__/qcom,wb-display@0"; + ext_disp = "/fragment@6/__overlay__/qcom,msm-ext-disp"; + ext_disp_audio_codec = "/fragment@6/__overlay__/qcom,msm-ext-disp/qcom,msm-ext-disp-audio-codec-rx"; + mtp_batterydata = "/fragment@11/__overlay__/qcom,battery-data"; + lpi_tlmm = "/fragment@27/__overlay__/lpi_pinctrl@627C0000"; + cdc_dmic01_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_active"; + cdc_dmic01_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_sleep"; + cdc_dmic01_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_active"; + cdc_dmic01_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_sleep"; + cdc_dmic23_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_active"; + cdc_dmic23_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_sleep"; + cdc_dmic23_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_active"; + cdc_dmic23_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_sleep"; + cdc_dmic45_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_active"; + cdc_dmic45_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_sleep"; + cdc_dmic45_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_active"; + cdc_dmic45_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_sleep"; + tx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_sleep"; + tx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_active"; + tx_swr_data0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_sleep"; + tx_swr_data0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_active"; + wsa_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_sleep"; + wsa_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_active"; + wsa_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_sleep"; + wsa_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_active"; + tx_swr_data1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_sleep"; + tx_swr_data1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_active"; + tx_swr_data2_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_sleep"; + tx_swr_data2_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_active"; + rx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_sleep"; + rx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_active"; + rx_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_sleep"; + rx_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_active"; + lpi_i2s1_sck_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_active"; + lpi_i2s1_sck_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_sleep"; + lpi_i2s1_ws_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_active"; + lpi_i2s1_ws_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_sleep"; + lpi_i2s1_sd0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_active"; + lpi_i2s1_sd0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_sleep"; + lpi_i2s1_sd1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_active"; + lpi_i2s1_sd1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_sleep"; + tx_macro = "/fragment@28/__overlay__/tx-macro@62620000"; + swr2 = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master"; + wcd938x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd938x-tx-slave"; + wcd937x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd937x-tx-slave"; + rx_macro = "/fragment@28/__overlay__/rx-macro@62600000"; + swr1 = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master"; + wcd938x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd938x-rx-slave"; + wcd937x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd937x-rx-slave"; + wsa_macro = "/fragment@28/__overlay__/wsa-macro@62640000"; + swr0 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master"; + wsa881x_0211 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211"; + wsa881x_0212 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212"; + wsa881x_0213 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213"; + wsa881x_0214 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214"; + va_macro = "/fragment@28/__overlay__/va-macro@62770000"; + wcd938x_codec = "/fragment@28/__overlay__/wcd938x-codec"; + wcd937x_codec = "/fragment@28/__overlay__/wcd937x-codec"; + cdc_dmic01_gpios = "/fragment@30/__overlay__/cdc_dmic01_pinctrl"; + cdc_dmic23_gpios = "/fragment@30/__overlay__/cdc_dmic23_pinctrl"; + cdc_dmic45_gpios = "/fragment@30/__overlay__/cdc_dmic45_pinctrl"; + wsa_swr_gpios = "/fragment@30/__overlay__/wsa_swr_clk_data_pinctrl"; + rx_swr_gpios = "/fragment@30/__overlay__/rx_swr_clk_data_pinctrl"; + tx_swr_gpios = "/fragment@30/__overlay__/tx_swr_clk_data_pinctrl"; + wsa_spkr_en1 = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl"; + wsa_spkr_en2 = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl"; + wcd_rst_gpio = "/fragment@31/__overlay__/msm_cdc_pinctrl@58"; + clock_audio_wsa_1 = "/fragment@31/__overlay__/wsa_core_clk"; + clock_audio_wsa_2 = "/fragment@31/__overlay__/wsa_npl_clk"; + clock_audio_rx_1 = "/fragment@31/__overlay__/rx_core_clk"; + clock_audio_rx_2 = "/fragment@31/__overlay__/rx_npl_clk"; + clock_audio_tx_1 = "/fragment@31/__overlay__/tx_core_clk"; + clock_audio_tx_2 = "/fragment@31/__overlay__/tx_npl_clk"; + clock_audio_va_1 = "/fragment@31/__overlay__/va_core_clk"; + clock_audio_va_2 = "/fragment@31/__overlay__/va_npl_clk"; + qupv3_se8_2hsuart = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000"; + qupv3_se8_2hsuart_pins = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins"; + qupv3_se8_2uart_tx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_active"; + qupv3_se8_2uart_rx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_active"; + qupv3_se8_2uart_tx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_sleep"; + qupv3_se8_2uart_rx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_sleep"; + sec_debug_region = "/fragment@37/__overlay__/sec_debug_region@0"; + sec_debug_autocomment = "/fragment@37/__overlay__/sec_debug_autocomment@0"; + sec_debug_rdx_bootdev = "/fragment@37/__overlay__/sec_debug_rdx_bootdev@0"; + kaslr_region = "/fragment@37/__overlay__/kaslr_region@A0001000"; + rkp_region = "/fragment@37/__overlay__/rkp_region@B0200000"; + hdm_region = "/fragment@37/__overlay__/hdm_region@A1000000"; + modem_shared_mem = "/fragment@37/__overlay__/modem_shared_mem_region@B5000000"; + usb_noti = "/fragment@60/__overlay__/usb-notifier"; + camera_mem = "/fragment@65/__overlay__/camera_mem_region"; + imp_list = "/fragment@68/__overlay__/imp_list"; + cdc_quin_mi2s_gpios = "/fragment@69/__overlay__/msm_cdc_pinctrl_quin"; + samsung_q6audio_adaptation = "/fragment@70/__overlay__/samsung,q6audio-adaptation"; + det_zones = "/fragment@70/__overlay__/det_zones"; + i2c_18 = "/fragment@70/__overlay__/i2c@18"; + tas256x = "/fragment@70/__overlay__/i2c@18/tas256x@4c"; + tas25xx_gpio_default = "/fragment@73/__overlay__/tas25xx_gpio_default"; + fm_lna_default = "/fragment@73/__overlay__/fm_lna_default"; + grip_i2c_active = "/fragment@74/__overlay__/grip_i2c/grip_i2c_active"; + grip_i2c_suspend = "/fragment@74/__overlay__/grip_i2c/grip_i2c_suspend"; + s2mpb03_i2c_sda_default = "/fragment@74/__overlay__/s2mpb03_i2c_sda_default"; + s2mpb03_i2c_scl_default = "/fragment@74/__overlay__/s2mpb03_i2c_scl_default"; + cam_sensor_mclk0_active = "/fragment@74/__overlay__/cam_sensor_mclk0_active"; + cam_sensor_mclk0_suspend = "/fragment@74/__overlay__/cam_sensor_mclk0_suspend"; + cam_sensor_mclk1_active = "/fragment@74/__overlay__/cam_sensor_mclk1_active"; + cam_sensor_mclk1_suspend = "/fragment@74/__overlay__/cam_sensor_mclk1_suspend"; + cam_sensor_mclk2_active = "/fragment@74/__overlay__/cam_sensor_mclk2_active"; + cam_sensor_mclk2_suspend = "/fragment@74/__overlay__/cam_sensor_mclk2_suspend"; + cam_sensor_mclk3_active = "/fragment@74/__overlay__/cam_sensor_mclk3_active"; + cam_sensor_mclk3_suspend = "/fragment@74/__overlay__/cam_sensor_mclk3_suspend"; + cam_sensor_mclk4_active = "/fragment@74/__overlay__/cam_sensor_mclk4_active"; + cam_sensor_mclk4_suspend = "/fragment@74/__overlay__/cam_sensor_mclk4_suspend"; + rcam1_sensor_reset_active = "/fragment@74/__overlay__/rcam1_sensor_reset_active"; + rcam1_sensor_reset_suspend = "/fragment@74/__overlay__/rcam1_sensor_reset_suspend"; + front_sensor_reset_active = "/fragment@74/__overlay__/front_sensor_reset_active"; + front_sensor_reset_suspend = "/fragment@74/__overlay__/front_sensor_reset_suspend"; + rcam3_sensor_reset_active = "/fragment@74/__overlay__/rcam3_sensor_reset_active"; + rcam3_sensor_reset_suspend = "/fragment@74/__overlay__/rcam3_sensor_reset_suspend"; + rcam2_sensor_reset_active = "/fragment@74/__overlay__/rcam2_sensor_reset_active"; + rcam2_sensor_reset_suspend = "/fragment@74/__overlay__/rcam2_sensor_reset_suspend"; + rcam4_sensor_reset_active = "/fragment@74/__overlay__/rcam4_sensor_reset_active"; + rcam4_sensor_reset_suspend = "/fragment@74/__overlay__/rcam4_sensor_reset_suspend"; + rcam1_sensor_vana_active = "/fragment@74/__overlay__/rcam1_sensor_vana_active"; + rcam1_sensor_vana_suspend = "/fragment@74/__overlay__/rcam1_sensor_vana_suspend"; + rcam2_sensor_vana_active = "/fragment@74/__overlay__/rcam2_sensor_vana_active"; + rcam2_sensor_vana_suspend = "/fragment@74/__overlay__/rcam2_sensor_vana_suspend"; + rcam3_sensor_vana_active = "/fragment@74/__overlay__/rcam3_sensor_vana_active"; + rcam3_sensor_vana_suspend = "/fragment@74/__overlay__/rcam3_sensor_vana_suspend"; + rcam4_sensor_vana_active = "/fragment@74/__overlay__/rcam4_sensor_vana_active"; + rcam4_sensor_vana_suspend = "/fragment@74/__overlay__/rcam4_sensor_vana_suspend"; + cam_mipi_sel_active = "/fragment@74/__overlay__/cam_mipi_sel_active"; + cam_mipi_sel_suspend = "/fragment@74/__overlay__/cam_mipi_sel_suspend"; + rcam3_sensor_vdig_active = "/fragment@74/__overlay__/rcam3_sensor_vdig_active"; + rcam3_sensor_vdig_suspend = "/fragment@74/__overlay__/rcam3_sensor_vdig_suspend"; + rcam4_sensor_vdig_active = "/fragment@74/__overlay__/rcam4_sensor_vdig_active"; + rcam4_sensor_vdig_suspend = "/fragment@74/__overlay__/rcam4_sensor_vdig_suspend"; + if_pmic_i2c_pins = "/fragment@74/__overlay__/if_pmic_i2c_pins"; + if_pmic_i2c_sleep = "/fragment@74/__overlay__/if_pmic_i2c_pins/if_pmic_i2c_sleep"; + usbpd_i2c_pins = "/fragment@74/__overlay__/usbpd_i2c_pins"; + usbpd_i2c_sleep = "/fragment@74/__overlay__/usbpd_i2c_pins/usbpd_i2c_sleep"; + mcu_reset_active = "/fragment@74/__overlay__/mcu_reset_active"; + mcu_reset_suspend = "/fragment@74/__overlay__/mcu_reset_suspend"; + mcu_clk_active = "/fragment@74/__overlay__/mcu_clk_active"; + mcu_clk_suspend = "/fragment@74/__overlay__/mcu_clk_suspend"; + grip_int_active = "/fragment@75/__overlay__/grip_int_active"; + grip_int_suspend = "/fragment@75/__overlay__/grip_int_suspend"; + i2c2 = "/fragment@80/__overlay__/i2c@2"; + s2mpb03_l1 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo1"; + s2mpb03_l2 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo2"; + s2mpb03_l3 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo3"; + s2mpb03_l4 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo4"; + s2mpb03_l5 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo5"; + s2mpb03_l6 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo6"; + s2mpb03_l7 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo7"; + self_display_FC3_dtsi = "/fragment@84/__overlay__/self_display_FC3_dtsi"; + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD = "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + ss_dsi_panel_PBA_BOOTING_FHD = "/fragment@86/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD"; + sde_te_active = "/fragment@87/__overlay__/pmx_sde_te/sde_te_active"; + sde_te_suspend = "/fragment@87/__overlay__/pmx_sde_te/sde_te_suspend"; + pmx_sde = "/fragment@87/__overlay__/pmx_sde"; + sde_dsi_active = "/fragment@87/__overlay__/pmx_sde/sde_dsi_active"; + sde_dsi_suspend = "/fragment@87/__overlay__/pmx_sde/sde_dsi_suspend"; + sde_ub_det_default = "/fragment@88/__overlay__/pmx_sde_ub_det/sde_ub_det_default"; + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD_display = "/fragment@89/__overlay__/qcom,dsi-display@9"; + ss_dsi_panel_PBA_BOOTING_FHD_display = "/fragment@89/__overlay__/qcom,dsi-display@10"; + tsp_int = "/fragment@91/__overlay__/tsp_int"; + tsp_zt = "/fragment@92/__overlay__/touchscreen@20"; + tsp_stm = "/fragment@92/__overlay__/touchscreen@49"; + key_vol_up_default = "/fragment@93/__overlay__/key_vol_up/key_vol_up_default"; + if_pmic_irq_default = "/fragment@98/__overlay__/if_pmic_irq/if_pmic_irq_default"; + usbpd_irq_default = "/fragment@98/__overlay__/usbpd_irq/usbpd_irq_default"; + nfc_qupv3_se0_i2c_sleep = "/fragment@100/__overlay__/nfc_qupv3_se0_i2c_sleep"; + nfc_clk_req_gpio = "/fragment@100/__overlay__/nfc_clk_req_gpio"; + nfc_irq_gpio = "/fragment@100/__overlay__/nfc_irq_gpio"; + nfc_ven_gpio = "/fragment@100/__overlay__/nfc_ven_gpio"; + nfc_firm_gpio = "/fragment@100/__overlay__/nfc_firm_gpio"; + nfc_ldo_en_gpio = "/fragment@100/__overlay__/nfc_ldo_en_gpio"; + et7xx_rst = "/fragment@102/__overlay__/et7xx_rst/et7xx_rst"; + sm5714_flash0 = "/fragment@106/__overlay__/qcom,flash_0"; + sm5714_torch0 = "/fragment@106/__overlay__/qcom,torch_0"; + led_flash0 = "/fragment@106/__overlay__/qcom,camera-flash@0"; + led_flash1 = "/fragment@106/__overlay__/qcom,camera-flash@1"; + ois_rear = "/fragment@108/__overlay__/qcom,ois@62"; + sensor_rear = "/fragment@109/__overlay__/qcom,cam-sensor@0"; + eeprom2 = "/fragment@109/__overlay__/qcom,eeprom@0x2D"; + sensor_rear_tele = "/fragment@110/__overlay__/qcom,cam-sensor@3"; + eeprom4 = "/fragment@110/__overlay__/qcom,eeprom@0x3F"; + actuator_rear0 = "/fragment@111/__overlay__/qcom,actuator@0xC"; + actuator_rear_tele = "/fragment@111/__overlay__/qcom,actuator2"; + eeprom0 = "/fragment@111/__overlay__/qcom,eeprom@50"; + eeprom1 = "/fragment@111/__overlay__/qcom,eeprom@51"; + eeprom3 = "/fragment@111/__overlay__/qcom,eeprom@55"; + vibrator = "/fragment@112/__overlay__/samsung,vibrator"; + hall_default = "/fragment@114/__overlay__/hall/hall_default"; + certify_hall_default = "/fragment@115/__overlay__/certify_hall_default"; + L8C = "/fragment@116/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150l_l8 = "/fragment@116/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150_l5 = "/fragment@116/__overlay__/rpmh-regulator-ldoa5/regulator-pm6150-l5"; + i2c_17 = "/fragment@116/__overlay__/i2c@17"; + dc_thm_default = "/fragment@125/__overlay__/dc_thm/dc_thm_default"; + }; + + __fixups__ { + mdss_mdp = "/fragment@0:target:0", "/fragment@1:target:0", "/fragment@2:target:0", "/fragment@3:target:0", "/fragment@4:target:0", "/fragment@5:target:0", "/fragment@8:target:0", "/fragment@10:target:0", "/fragment@85:target:0", "/fragment@86:target:0"; + tlmm = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-te-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-te-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-te-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-te-gpio:0", "/fragment@7/__overlay__:qcom,usbplug-cc-gpio:0", "/fragment@17/__overlay__:cd-gpios:0", "/fragment@24/__overlay__/synaptics_tcm@20:interrupt-parent:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,irq-gpio:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,reset-gpio:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:interrupt-parent:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:reset-gpios:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:irq-gpios:0", "/fragment@25/__overlay__/nq@28:qcom,nq-irq:0", "/fragment@25/__overlay__/nq@28:qcom,nq-ven:0", "/fragment@25/__overlay__/nq@28:qcom,nq-firm:0", "/fragment@25/__overlay__/nq@28:qcom,nq-clkreq:0", "/fragment@25/__overlay__/nq@28:interrupt-parent:0", "/fragment@35:target:0", "/fragment@70/__overlay__/i2c@18:gpios:0", "/fragment@70/__overlay__/i2c@18:gpios:12", "/fragment@70/__overlay__/i2c@18/tas256x@4c:ti,reset-gpio:0", "/fragment@70/__overlay__/i2c@18/tas256x@4c:ti,irq-gpio:0", "/fragment@71/__overlay__:qcom,fm-lna-gpios:0", "/fragment@73:target:0", "/fragment@74:target:0", "/fragment@76:target:0", "/fragment@80/__overlay__/i2c@2:gpios:0", "/fragment@80/__overlay__/i2c@2:gpios:12", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:qcom,platform-reset-gpio:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:qcom,platform-te-gpio:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:samsung,esd-irq-gpio1:0", "/fragment@86/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD:qcom,platform-reset-gpio:0", "/fragment@87:target:0", "/fragment@91:target:0", "/fragment@92/__overlay__/touchscreen@20:zinitix,irq_gpio:0", "/fragment@92/__overlay__/touchscreen@49:stm,irq_gpio:0", "/fragment@96/__overlay__/sm5714@49:sm5714,irq-gpio:0", "/fragment@97/__overlay__/usbpd-sm5714@33:usbpd,usbpd_int:0", "/fragment@98:target:0", "/fragment@100:target:0", "/fragment@101/__overlay__/sec-nfc@27:interrupt-parent:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,ven-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,irq-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,firm-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,clk_req-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,pvdd-gpio:0", "/fragment@102:target:0", "/fragment@104/__overlay__/etspi,et7xx:etspi-sleepPin:0", "/fragment@107/__overlay__/sm5714-fled:flash-en-gpio:0", "/fragment@107/__overlay__/sm5714-fled:torch-en-gpio:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:12", "/fragment@108/__overlay__/qcom,ois@62:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:24", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:36", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:36", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:36", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:12", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:24", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:36", "/fragment@111/__overlay__/qcom,actuator@0xC:gpios:0", "/fragment@111/__overlay__/qcom,actuator2:gpios:0", "/fragment@111/__overlay__/qcom,eeprom@50:gpios:0", "/fragment@111/__overlay__/qcom,eeprom@55:gpios:0", "/fragment@113/__overlay__/certify_hall:certify_hall,gpio_certify_cover:0", "/fragment@115:target:0", "/fragment@116/__overlay__/i2c@17:gpios:0", "/fragment@116/__overlay__/i2c@17:gpios:12", "/fragment@117:target:0", "/fragment@119:target:0"; + pm6150l_gpios = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-reset-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-reset-gpio:0", "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-bklight-en-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-en-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-reset-gpio:0", "/fragment@22:target:0", "/fragment@75:target:0", "/fragment@93:target:0", "/fragment@94/__overlay__/vol_up:gpios:0", "/fragment@116/__overlay__/i2c@17/sx9360-i2c@28:sx9360,nirq-gpio:0", "/fragment@125:target:0"; + soc = "/fragment@6:target:0", "/fragment@11:target:0", "/fragment@23:target:0", "/fragment@31:target:0", "/fragment@34:target:0", "/fragment@60:target:0", "/fragment@66:target:0", "/fragment@70:target:0", "/fragment@80:target:0", "/fragment@84:target:0", "/fragment@89:target:0", "/fragment@95:target:0", "/fragment@106:target:0", "/fragment@112:target:0", "/fragment@113:target:0", "/fragment@116:target:0", "/fragment@118:target:0", "/fragment@121:target:0", "/fragment@124:target:0", "/fragment@127:target:0"; + mdss_dsi0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-ctrl:0"; + mdss_dsi_phy0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-phy:0"; + mdss_dsi0_pll = "/fragment@6/__overlay__/qcom,dsi-display:clocks:0", "/fragment@6/__overlay__/qcom,dsi-display:clocks:8", "/fragment@6/__overlay__/qcom,dsi-display:clocks:16", "/fragment@6/__overlay__/qcom,dsi-display:clocks:24", "/fragment@6/__overlay__/qcom,dsi-display:clocks:32", "/fragment@6/__overlay__/qcom,dsi-display:clocks:40", "/fragment@6/__overlay__/qcom,dsi-display:clocks:48", "/fragment@6/__overlay__/qcom,dsi-display:clocks:56", "/fragment@6/__overlay__/qcom,dsi-display:clocks:64", "/fragment@6/__overlay__/qcom,dsi-display:clocks:72"; + L13A = "/fragment@6/__overlay__/qcom,dsi-display:vddio-supply:0"; + L18A = "/fragment@6/__overlay__/qcom,dsi-display:vdda-3p3-supply:0"; + lcdb_ldo_vreg = "/fragment@6/__overlay__/qcom,dsi-display:lab-supply:0"; + lcdb_ncp_vreg = "/fragment@6/__overlay__/qcom,dsi-display:ibb-supply:0"; + pm6150_l18 = "/fragment@6/__overlay__/qcom,dsi-display:vci-supply:0"; + pm6150_l13 = "/fragment@6/__overlay__/qcom,dsi-display:vddi-supply:0"; + sde_dp = "/fragment@7:target:0", "/fragment@8/__overlay__:connectors:8", "/fragment@26:target:0"; + pm6150_pdphy = "/fragment@7/__overlay__:qcom,dp-usbpd-detection:0"; + sde_dp_usbplug_cc_active = "/fragment@7/__overlay__:pinctrl-0:0"; + sde_dp_usbplug_cc_suspend = "/fragment@7/__overlay__:pinctrl-1:0"; + sde_rscc = "/fragment@8/__overlay__:connectors:12"; + thermal_zones = "/fragment@9:target:0", "/fragment@18:target:0"; + pm6150_trip0 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:trip:0"; + pm6150_charger = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:cooling-device:0", "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:cooling-device:0", "/fragment@21:target:0"; + pm6150_trip1 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:trip:0"; + pm6150l_trip0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:trip:0"; + CPU0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:cooling-device:0"; + CPU1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:cooling-device:0"; + CPU2 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:cooling-device:0"; + CPU3 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:cooling-device:0"; + CPU4 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:cooling-device:0"; + CPU5 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:cooling-device:0"; + CPU6 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:cooling-device:0"; + CPU7 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:cooling-device:0"; + pm6150l_trip1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:trip:0"; + bcl_lvl0 = "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:trip:0"; + bcl_lvl1 = "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:trip:0"; + bcl_lvl2 = "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:trip:0"; + soc_trip = "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:trip:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:trip:0"; + pm6150l_vadc = "/fragment@12:target:0", "/fragment@13/__overlay__:io-channels:0", "/fragment@13/__overlay__:io-channels:8", "/fragment@13/__overlay__:io-channels:16", "/fragment@13/__overlay__:io-channels:24", "/fragment@80/__overlay__/sec_thermistor@1:io-channels:0", "/fragment@80/__overlay__/sec_thermistor@2:io-channels:0", "/fragment@83:target:0", "/fragment@126:target:0", "/fragment@127/__overlay__/battery:io-channels:16"; + pm6150l_adc_tm = "/fragment@13:target:0", "/fragment@18/__overlay__/pa-therm1:thermal-sensors:0"; + ufsphy_mem = "/fragment@14:target:0"; + pm6150_l4 = "/fragment@14/__overlay__:vdda-phy-supply:0"; + pm6150l_l3 = "/fragment@14/__overlay__:vdda-pll-supply:0", "/fragment@15/__overlay__:qcom,vddp-ref-clk-supply:0"; + ufshc_mem = "/fragment@15:target:0", "/fragment@64:target:0"; + ufs_phy_gdsc = "/fragment@15/__overlay__:vdd-hba-supply:0"; + pm6150_l19 = "/fragment@15/__overlay__:vcc-supply:0", "/fragment@16/__overlay__:vdd-supply:0"; + pm6150_l12 = "/fragment@15/__overlay__:vccq2-supply:0", "/fragment@16/__overlay__:vdd-io-supply:0"; + sdhc_1 = "/fragment@16:target:0"; + sdc1_clk_on = "/fragment@16/__overlay__:pinctrl-0:0"; + sdc1_cmd_on = "/fragment@16/__overlay__:pinctrl-0:4"; + sdc1_data_on = "/fragment@16/__overlay__:pinctrl-0:8"; + sdc1_rclk_on = "/fragment@16/__overlay__:pinctrl-0:12"; + sdc1_clk_off = "/fragment@16/__overlay__:pinctrl-1:0"; + sdc1_cmd_off = "/fragment@16/__overlay__:pinctrl-1:4"; + sdc1_data_off = "/fragment@16/__overlay__:pinctrl-1:8"; + sdc1_rclk_off = "/fragment@16/__overlay__:pinctrl-1:12"; + sdhc_2 = "/fragment@17:target:0"; + pm6150l_l9 = "/fragment@17/__overlay__:vdd-supply:0"; + pm6150l_l6 = "/fragment@17/__overlay__:vdd-io-supply:0"; + sdc2_clk_on = "/fragment@17/__overlay__:pinctrl-0:0"; + sdc2_cmd_on = "/fragment@17/__overlay__:pinctrl-0:4"; + sdc2_data_on = "/fragment@17/__overlay__:pinctrl-0:8"; + sdc2_cd_on = "/fragment@17/__overlay__:pinctrl-0:12"; + sdc2_clk_off = "/fragment@17/__overlay__:pinctrl-1:0"; + sdc2_cmd_off = "/fragment@17/__overlay__:pinctrl-1:4"; + sdc2_data_off = "/fragment@17/__overlay__:pinctrl-1:8"; + sdc2_cd_off = "/fragment@17/__overlay__:pinctrl-1:12"; + pm6150a_amoled = "/fragment@19:target:0"; + pm6150_qg = "/fragment@20:target:0"; + pm6150_vadc = "/fragment@21/__overlay__:io-channels:0", "/fragment@21/__overlay__:io-channels:8", "/fragment@21/__overlay__:io-channels:16", "/fragment@21/__overlay__:io-channels:24", "/fragment@21/__overlay__:io-channels:32", "/fragment@21/__overlay__:io-channels:40", "/fragment@21/__overlay__:io-channels:48", "/fragment@80/__overlay__/sec_thermistor@0:io-channels:0", "/fragment@82:target:0", "/fragment@123:target:0", "/fragment@124/__overlay__/battery:io-channels:0", "/fragment@124/__overlay__/battery:io-channels:8", "/fragment@127/__overlay__/battery:io-channels:0", "/fragment@127/__overlay__/battery:io-channels:8"; + qusb_phy0 = "/fragment@21/__overlay__:dpdm-supply:0", "/fragment@99:target:0"; + qupv3_se7_i2c = "/fragment@24:target:0", "/fragment@92:target:0", "/fragment@107:target:0"; + ts_active = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-0:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-0:0"; + ts_int_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:0"; + ts_reset_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:4", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:4"; + ts_release = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-2:0"; + pm6150_l10 = "/fragment@24/__overlay__/synaptics_tcm@20:vdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:vdd-supply:0"; + pm6150l_l7 = "/fragment@24/__overlay__/synaptics_tcm@20:avdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:avdd-supply:0", "/fragment@90:target:0", "/fragment@92/__overlay__/touchscreen@20:avdd-supply:0", "/fragment@92/__overlay__/touchscreen@49:avdd-supply:0"; + qupv3_se0_i2c = "/fragment@25:target:0", "/fragment@101:target:0"; + nfc_int_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:0"; + nfc_enable_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:4"; + nfc_clk_req_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:8"; + nfc_int_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:0"; + nfc_enable_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:4"; + nfc_clk_req_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:8"; + fsa4480 = "/fragment@26/__overlay__:qcom,dp-aux-switch:0", "/fragment@72:target:0"; + q6core = "/fragment@27:target:0", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:4", "/fragment@30:target:0", "/fragment@69:target:0", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:4"; + lpass_core_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:0", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:0", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:0"; + lpass_audio_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:8", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:8", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:8", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:8", "/fragment@28/__overlay__/va-macro@62770000:clocks:0"; + bolero = "/fragment@28:target:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214:qcom,bolero-handle:0", "/fragment@29/__overlay__:asoc-codec:4", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:12", "/fragment@68:target:0", "/fragment@71/__overlay__:asoc-codec:4", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:12"; + L10A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-rxtx-supply:0", "/fragment@28/__overlay__/wcd938x-codec:cdc-vddio-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-ldo-rxtx-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vddpx-1-supply:0"; + L15A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-buck-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-buck-supply:0"; + BOB = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_bob-supply:0"; + atoll_snd = "/fragment@29:target:0", "/fragment@71:target:0"; + stub_codec = "/fragment@29/__overlay__:asoc-codec:0", "/fragment@71/__overlay__:asoc-codec:0"; + audio_apr = "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:0", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:0"; + spkr_1_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-0:0"; + spkr_1_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-1:0"; + spkr_2_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-0:0"; + spkr_2_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-1:0"; + wcd_reset_active = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-0:0"; + wcd_reset_sleep = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-1:0"; + va_cdc_dma_0_tx = "/fragment@32:target:0"; + aliases = "/fragment@33:target:0", "/fragment@67:target:0"; + clock_gcc = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:0", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:8", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:16"; + qupv3_1 = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:qcom,wrapper-core:0"; + dcc = "/fragment@36:target:0"; + reserved_memory = "/fragment@37:target:0", "/fragment@65:target:0", "/fragment@105:target:0", "/fragment@120:target:0"; + removed_region = "/fragment@38:target:0"; + pil_modem_mem = "/fragment@39:target:0"; + pil_adsp_mem = "/fragment@40:target:0"; + pil_camera_mem = "/fragment@41:target:0"; + pil_npu_mem = "/fragment@42:target:0"; + pil_video_mem = "/fragment@43:target:0"; + pil_cdsp_mem = "/fragment@44:target:0"; + qseecom_mem = "/fragment@45:target:0"; + qseecom_ta_mem = "/fragment@46:target:0"; + secure_carveout_heap = "/fragment@47:target:0"; + cdsp_sec_mem = "/fragment@48:target:0"; + msm_imem = "/fragment@49:target:0"; + camera = "/fragment@50:target:0"; + cam_vfe0 = "/fragment@51:target:0"; + cam_vfe1 = "/fragment@52:target:0"; + cam_vfe_lite = "/fragment@53:target:0"; + cam_lrme = "/fragment@54:target:0"; + shared_meta = "/fragment@55:target:0"; + android_q_fstab = "/fragment@56:target:0"; + pm8008_8 = "/fragment@57:target:0", "/fragment@78:target:0"; + pm8008_9 = "/fragment@58:target:0", "/fragment@79:target:0"; + usb0 = "/fragment@59:target:0"; + firmware = "/fragment@61:target:0"; + pil_modem = "/fragment@62:target:0"; + modem_smp2p_out = "/fragment@62/__overlay__:qcom,smem-states:0", "/fragment@62/__overlay__:qcom,smem-states:8", "/fragment@62/__overlay__:qcom,smem-states:16"; + icnss = "/fragment@63:target:0"; + pcm0 = "/fragment@71/__overlay__:asoc-platform:0"; + pcm1 = "/fragment@71/__overlay__:asoc-platform:4"; + pcm2 = "/fragment@71/__overlay__:asoc-platform:8"; + voip = "/fragment@71/__overlay__:asoc-platform:12"; + voice = "/fragment@71/__overlay__:asoc-platform:16"; + loopback = "/fragment@71/__overlay__:asoc-platform:20"; + compress = "/fragment@71/__overlay__:asoc-platform:24"; + hostless = "/fragment@71/__overlay__:asoc-platform:28"; + afe = "/fragment@71/__overlay__:asoc-platform:32"; + lsm = "/fragment@71/__overlay__:asoc-platform:36"; + routing = "/fragment@71/__overlay__:asoc-platform:40"; + compr = "/fragment@71/__overlay__:asoc-platform:44"; + pcm_noirq = "/fragment@71/__overlay__:asoc-platform:48"; + spmi_bus = "/fragment@77:target:0", "/fragment@116/__overlay__/i2c@17/sx9360-i2c@28:interrupt-parent:0"; + pm6150_gpios = "/fragment@81:target:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:samsung,ub-con-det:0", "/fragment@88:target:0", "/fragment@113/__overlay__/hall:hall,gpio_flip_cover:0", "/fragment@114:target:0"; + gpio_key = "/fragment@94:target:0"; + qupv3_se4_i2c = "/fragment@96:target:0", "/fragment@122:target:0"; + qupv3_se11_i2c = "/fragment@97:target:0"; + pm6150l_l11 = "/fragment@103:target:0"; + qupv3_se6_spi = "/fragment@104:target:0"; + pm6150l_switch2 = "/fragment@106/__overlay__/qcom,camera-flash@0:switch-source:0", "/fragment@106/__overlay__/qcom,camera-flash@1:switch-source:0"; + qupv3_se10_i2c = "/fragment@108:target:0"; + cam_cci0 = "/fragment@109:target:0"; + titan_top_gdsc = "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:cam_clk-supply:0"; + clock_camcc = "/fragment@109/__overlay__/qcom,cam-sensor@0:clocks:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:clocks:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:clocks:0"; + cam_cci1 = "/fragment@110:target:0"; + qupv3_se9_i2c = "/fragment@111:target:0"; + apps_rsc = "/fragment@116/__overlay__/rpmh-regulator-ldoc8:mboxes:0"; + }; + + __local_fixups__ { + + fragment@0 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@1 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@2 { + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@5 { + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@6 { + + __overlay__ { + + qcom,dsi-display@0 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@1 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@2 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@3 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@4 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@5 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display { + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + qcom,dsi-display-list = <0x0 0x4>; + }; + }; + }; + + fragment@7 { + + __overlay__ { + qcom,ext-disp = <0x0>; + }; + }; + + fragment@8 { + + __overlay__ { + connectors = <0x0 0x4>; + }; + }; + + fragment@20 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@21 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@28 { + + __overlay__ { + + bolero-clk-rsc-mngr { + clocks = <0x0 0x8 0x10 0x18 0x20 0x28 0x30 0x38>; + }; + + tx-macro@62620000 { + clocks = <0x0 0x8>; + qcom,tx-swr-gpios = <0x0>; + }; + + rx-macro@62600000 { + clocks = <0x0 0x8>; + qcom,rx-swr-gpios = <0x0>; + }; + + wsa-macro@62640000 { + clocks = <0x0 0x8>; + qcom,wsa-swr-gpios = <0x0>; + + wsa_swr_master { + + wsa881x@20170211 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@20170212 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170213 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170214 { + qcom,spkr-sd-n-node = <0x0>; + }; + }; + }; + + wcd938x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + mbhc-button-thres = <0x0 0xc 0x18 0x24 0x30 0x3c 0x48 0x54>; + imp-table = <0x0 0x10 0x20 0x30 0x40 0x50 0x60 0x70>; + }; + + wcd937x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + }; + }; + }; + + fragment@29 { + + __overlay__ { + qcom,cdc-dmic01-gpios = <0x0>; + qcom,cdc-dmic23-gpios = <0x0>; + qcom,cdc-dmic45-gpios = <0x0>; + asoc-codec = <0x8>; + qcom,wsa-devs = <0x0 0x4 0x8 0xc>; + qcom,codec-aux-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@30 { + + __overlay__ { + + cdc_dmic01_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic23_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic45_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + wsa_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + rx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + tx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@34 { + + __overlay__ { + + qcom,qup_hsuart@a88000 { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@60 { + + __overlay__ { + + qcom,memshare { + + qcom,client_4 { + memory-region = <0x0>; + }; + }; + + samsung,sec_hdm { + memory-region = <0x0>; + }; + }; + }; + + fragment@66 { + + __overlay__ { + + qcom,ion { + + qcom,ion-heap@30 { + memory-region = <0x0>; + }; + }; + }; + }; + + fragment@69 { + + __overlay__ { + + msm_cdc_pinctrl_quin { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@70 { + + __overlay__ { + + i2c@18 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@71 { + + __overlay__ { + asoc-platform = <0x34>; + qcom,quin-mi2s-gpios = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@80 { + + __overlay__ { + + i2c@2 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@85 { + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD { + ss,self_display = <0x0>; + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@86 { + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@92 { + + __overlay__ { + + touchscreen@20 { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + + touchscreen@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@94 { + + __overlay__ { + pinctrl-0 = <0x0>; + }; + }; + + fragment@96 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sm5714@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@97 { + + __overlay__ { + pinctrl-1 = <0x0>; + + usbpd-sm5714@33 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@101 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sec-nfc@27 { + pinctrl-0 = <0x0 0x4 0x8 0xc 0x10>; + }; + }; + }; + + fragment@104 { + + __overlay__ { + + etspi,et7xx { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@106 { + + __overlay__ { + + qcom,camera-flash@0 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,camera-flash@1 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,cam-res-mgr { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + }; + }; + + fragment@108 { + + __overlay__ { + + qcom,ois@62 { + cam_vaf-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + cam_vdig-supply = <0x0>; + }; + }; + }; + + fragment@109 { + + __overlay__ { + + qcom,cam-sensor@0 { + actuator-src = <0x0>; + led-flash-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@2 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x2D { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@110 { + + __overlay__ { + + qcom,cam-sensor@1 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@8 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@3 { + actuator-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + led-flash-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@4 { + led-flash-src = <0x0>; + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x3F { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@111 { + + __overlay__ { + + qcom,actuator@0xC { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + + qcom,actuator2 { + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + }; + + qcom,eeprom@50 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@51 { + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@55 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + }; + }; + + fragment@113 { + + __overlay__ { + + hall { + pinctrl-0 = <0x0>; + }; + + certify_hall { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@116 { + + __overlay__ { + + i2c@17 { + pinctrl-0 = <0x0>; + + sx9360-i2c@28 { + pinctrl-0 = <0x0>; + }; + }; + }; + }; + + fragment@127 { + + __overlay__ { + + battery { + pinctrl-0 = <0x0>; + }; + }; + }; + }; }; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r04.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r04.dts old mode 100755 new mode 100644 index 6becd235c951..34373561f4ab --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r04.dts +++ b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r04.dts @@ -1,25 +1,7177 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - /dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a72q-r04.dtsi" -#include "./drivers/atoll-sec-a72q-battery-r02.dtsi" / { model = "Samsung A72Q PROJECT REV02 (board-id,04)"; compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 4>; - dtbo-version = <0>; + qcom,board-id = <0x22 0x4>; + dtbo-version = <0x0>; + + fragment@0 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ video mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x37 0x30>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x38ae2bc0 0x37bc55b0 0x37f8cb38 0x383540b8 0x3871b640>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x3>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@1 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ cmd mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x3da58d80 0x3c9e86e0 0x3ce04888 0x3d220a30 0x3d63cbd8>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x4>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@2 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,mdss-dsi-panel-name = "Simulator video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-mode-switch; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x0 0x0 0x0 0x1 0x0>; + qcom,panel-ack-disabled; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x5>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-video-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,cmd-to-video-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,cmd-to-video-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1 0x2 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-cmd-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,video-to-cmd-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,video-to-cmd-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@3 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-t-clk-post = <0xc>; + qcom,mdss-dsi-t-clk-pre = <0x29>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-ack-disabled; + qcom,ulps-enabled; + phandle = <0x6>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x64>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x64>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x2d0 0x28 0x2d0 0x28 0x2d0 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x1cc>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x2e4>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x21c 0x28 0x21c 0x28 0x21c 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@2 { + qcom,mdss-dsi-panel-width = <0x2d0>; + qcom,mdss-dsi-panel-height = <0x500>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x348>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x564>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x168>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x168 0x28 0x168 0x28 0x168 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + }; + }; + }; + }; + + fragment@4 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_dsc_375_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode DSC 3.75:1 dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,panel-ack-disabled; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,ulps-enabled; + phandle = <0x7>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-pulse-width = <0x10>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x8>; + qcom,mdss-dsi-v-front-porch = <0xa>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-on-command = <0x15010000 0x2ff 0x20150100 0x2 0xfb011501 0x0 0x2000115 0x1000000 0x20155 0x15010000 0x202 0x45150100 0x2 0x5401501 0x0 0x2061915 0x1000000 0x2071e 0x15010000 0x20b 0x73150100 0x2 0xc731501 0x0 0x20eb015 0x1000000 0x20fae 0x15010000 0x211 0xb8150100 0x2 0x13001501 0x0 0x2588015 0x1000000 0x25901 0x15010000 0x25a 0x150100 0x2 0x5b011501 0x0 0x25c8015 0x1000000 0x25d81 0x15010000 0x25e 0x150100 0x2 0x5f011501 0x0 0x2723115 0x1000000 0x26803 0x15010000 0x2ff 0x24150100 0x2 0xfb011501 0x0 0x2001c15 0x1000000 0x2010b 0x15010000 0x202 0xc150100 0x2 0x3011501 0x0 0x2040f15 0x1000000 0x20510 0x15010000 0x206 0x10150100 0x2 0x7101501 0x0 0x2088915 0x1000000 0x2098a 0x15010000 0x20a 0x13150100 0x2 0xb131501 0x0 0x20c1515 0x1000000 0x20d15 0x15010000 0x20e 0x17150100 0x2 0xf171501 0x0 0x2101c15 0x1000000 0x2110b 0x15010000 0x212 0xc150100 0x2 0x13011501 0x0 0x2140f15 0x1000000 0x21510 0x15010000 0x216 0x10150100 0x2 0x17101501 0x0 0x2188915 0x1000000 0x2198a 0x15010000 0x21a 0x13150100 0x2 0x1b131501 0x0 0x21c1515 0x1000000 0x21d15 0x15010000 0x21e 0x17150100 0x2 0x1f171501 0x0 0x2204015 0x1000000 0x22101 0x15010000 0x222 0x150100 0x2 0x23401501 0x0 0x2244015 0x1000000 0x2256d 0x15010000 0x226 0x40150100 0x2 0x27401501 0x0 0x2e00015 0x1000000 0x2dc21 0x15010000 0x2dd 0x22150100 0x2 0xde071501 0x0 0x2df0715 0x1000000 0x2e36d 0x15010000 0x2e1 0x7150100 0x2 0xe2071501 0x0 0x229d815 0x1000000 0x22a2a 0x15010000 0x24b 0x3150100 0x2 0x4c111501 0x0 0x24d1015 0x1000000 0x24e01 0x15010000 0x24f 0x1150100 0x2 0x50101501 0x0 0x2510015 0x1000000 0x25280 0x15010000 0x253 0x150100 0x2 0x56001501 0x0 0x2540715 0x1000000 0x25807 0x15010000 0x255 0x25150100 0x2 0x5b431501 0x0 0x25c0015 0x1000000 0x25f73 0x15010000 0x260 0x73150100 0x2 0x63221501 0x0 0x2640015 0x1000000 0x26708 0x15010000 0x268 0x4150100 0x2 0x72021501 0x0 0x27a8015 0x1000000 0x27b91 0x15010000 0x27c 0xd8150100 0x2 0x7d601501 0x0 0x27f1515 0x1000000 0x27515 0x15010000 0x2b3 0xc0150100 0x2 0xb4001501 0x0 0x2b50015 0x1000000 0x27800 0x15010000 0x279 0x150100 0x2 0x80001501 0x0 0x2830015 0x1000000 0x2930a 0x15010000 0x294 0xa150100 0x2 0x8a001501 0x0 0x29bff15 0x1000000 0x29db0 0x15010000 0x29f 0x63150100 0x2 0x98101501 0x0 0x2ec0015 0x1000000 0x2ff10 0x39010000 0x11c1 0x9200010 0x2000268 0x1bb000a 0x66704c5 0x39010000 0x3c2 0x10f01501 0x0 0x2c00315 0x1000000 0x43b03 0xa0a1501 0x0 0x2350015 0x1000000 0x2e501 0x15010000 0x2bb 0x10150100 0x2 0xfb010501 0x7800 0x2110005 0x1000078 0x22900>; + qcom,mdss-dsi-off-command = [05 01 00 00 78 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x0>; + qcom,mdss-dsi-h-back-porch = <0x0>; + qcom,mdss-dsi-h-pulse-width = <0x0>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x0>; + qcom,mdss-dsi-v-front-porch = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x0>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = <0x15010000 0x2bb 0x10150100 0x2 0xb0030501 0x7800 0x1111501 0x0 0x251ff15 0x1000000 0x25324 0x15010000 0x2ff 0x23150100 0x2 0x8051501 0x0 0x2469015 0x1000000 0x2ff10 0x15010000 0x2ff 0xf0150100 0x2 0x92011501 0x0 0x2ff1015 0x1000000 0x23500 0x5010000 0x28000129>; + qcom,mdss-dsi-off-command = <0x5010000 0x10000128 0x5010000 0x40000110>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x150505 0x201f0505 0x3020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1 0x2 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@5 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,mdss-dsi-panel-name = "nt36672c fhd plus video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x14 0x0 0x14 0x1 0x14>; + qcom,mdss-pan-physical-width-dimension = <0x4a>; + qcom,mdss-pan-physical-height-dimension = <0x83>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-cphy-mode; + qcom,mdss-dsi-t-clk-post = <0x0>; + qcom,mdss-dsi-t-clk-pre = <0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x5a 0x32>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-skip-timing-update; + qcom,dsi-dyn-clk-list = <0x3eb54a94 0x3e726713 0x3e2f838b 0x3deca00a 0x3da9bc89>; + qcom,dsi-dyn-clk-type = "constant-fps-adjust-hfp"; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,platform-bklight-en-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-en-gpio = <0xffffffff 0x4 0x0>; + phandle = <0x8>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-front-porch = <0xca>; + qcom,mdss-dsi-h-back-porch = <0x38>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0xa>; + qcom,mdss-dsi-v-front-porch = <0x50b>; + qcom,mdss-dsi-v-pulse-width = <0xa>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 b0 00 29 01 00 00 00 00 02 c0 00 29 01 00 00 00 00 03 c2 1b a0 29 01 00 00 00 00 02 ff 25 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 18 20 15 01 00 00 00 00 02 ff 2a 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 27 80 15 01 00 00 00 00 02 28 fd 29 01 00 00 00 00 02 ff f0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 5a 00 29 01 00 00 00 00 02 a0 08 29 01 00 00 00 00 02 ff d0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 09 ad 15 01 00 00 00 00 02 ff 10 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 51 ff 15 01 00 00 00 00 02 53 2c 15 01 00 00 00 00 02 ff 23 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 0a 00 15 01 00 00 00 00 02 0b 00 15 01 00 00 00 00 02 0c 00 15 01 00 00 00 00 02 0d 00 15 01 00 00 00 00 02 11 01 15 01 00 00 00 00 02 12 95 15 01 00 00 00 00 02 15 68 15 01 00 00 00 00 02 16 0b 15 01 00 00 00 00 02 6f 00 15 01 00 00 00 00 02 70 00 15 01 00 00 00 00 02 71 00 15 01 00 00 00 00 02 a0 11 15 01 00 00 00 00 02 ff f0 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 d2 52 29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 35 00 05 01 00 00 78 00 02 11 00 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x230909 0x26240909 0x9060204>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@6 { + target = <0xffffffff>; + + __overlay__ { + + dsi_panel_pwr_supply { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xab>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + }; + + qcom,panel-supply-entry@2 { + reg = <0x2>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-post-on-sleep = <0x14>; + }; + }; + + dsi_panel_pwr_supply_no_labibb { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x2>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + }; + + dsi_panel_pwr_supply_labibb_amoled { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x1>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vdda-3p3"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x3390>; + qcom,supply-disable-load = <0x50>; + }; + }; + + qcom,dsi-display@0 { + label = "dsi_rm69299_visionox_amoled_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0"; + qcom,dsi-panel = <0x3>; + qcom,dsi-display-active; + phandle = <0xac>; + }; + + qcom,dsi-display@1 { + label = "dsi_rm69299_visionox_amoled_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x4>; + phandle = <0xad>; + }; + + qcom,dsi-display@2 { + label = "dsi_sim_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x5>; + phandle = <0xae>; + }; + + qcom,dsi-display@3 { + label = "dsi_sim_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x6>; + phandle = <0xaf>; + }; + + qcom,dsi-display@4 { + label = "dsi_sim_dsc_375_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x7>; + phandle = <0xb0>; + }; + + qcom,dsi-display@5 { + label = "dsi_nt36672c_video_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + qcom,dsi-panel = <0x8>; + phandle = <0xb1>; + }; + + qcom,dsi-display { + compatible = "qcom,dsi-display"; + qcom,dsi-ctrl = <0xffffffff>; + qcom,dsi-phy = <0xffffffff>; + clocks = <0xffffffff 0x6 0xffffffff 0x9 0xffffffff 0x3 0xffffffff 0x8 0xffffffff 0xa 0xffffffff 0xd 0xffffffff 0x11 0xffffffff 0x15 0xffffffff 0x16 0xffffffff 0x19>; + clock-names = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + pinctrl-names = "panel_active", "panel_suspend"; + pinctrl-0 = <0x9 0xa 0xb>; + pinctrl-1 = <0xc 0xd 0xb>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,panel-te-source = <0x0>; + vddio-supply = <0xffffffff>; + vdda-3p3-supply = <0xffffffff>; + lab-supply = <0xffffffff>; + ibb-supply = <0xffffffff>; + qcom,dsi-display-list = <0xe 0xf>; + vci-supply = <0xffffffff>; + vddi-supply = <0xffffffff>; + phandle = <0x12>; + }; + + qcom,wb-display@0 { + compatible = "qcom,wb-display"; + cell-index = <0x0>; + label = "wb_display"; + phandle = <0x11>; + }; + + qcom,msm-ext-disp { + compatible = "qcom,msm-ext-disp"; + phandle = <0x10>; + + qcom,msm-ext-disp-audio-codec-rx { + compatible = "qcom,msm-ext-disp-audio-codec-rx"; + phandle = <0x2b>; + }; + }; + }; + }; + + fragment@7 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-usbpd-detection = <0xffffffff>; + qcom,ext-disp = <0x10>; + qcom,usbplug-cc-gpio = <0xffffffff 0x68 0x0>; + pinctrl-name = "mdss_dp_active", "mdss_dp_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + }; + }; + + fragment@8 { + target = <0xffffffff>; + + __overlay__ { + connectors = <0x11 0x12 0xffffffff 0xffffffff>; + }; + }; + + fragment@9 { + target = <0xffffffff>; + + __overlay__ { + + pm6150-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150l-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_cpu0 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl0 { + disable-thermal-zone; + + cooling-maps { + + vbat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + vbat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl1 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl2 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + soc { + disable-thermal-zone; + + cooling-maps { + + soc_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + soc_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + }; + }; + + fragment@10 { + target = <0xffffffff>; + + __overlay__ { + #cooling-cells = <0x2>; + }; + }; + + fragment@11 { + target = <0xffffffff>; + + __overlay__ { + + qcom,battery-data { + qcom,batt-id-range-pct = <0xf>; + phandle = <0x13>; + + qcom,alium_860_89032_0000_3600mAh { + qcom,max-voltage-uv = <0x426030>; + qcom,fg-cc-cv-threshold-uv = <0x423920>; + qcom,fastchg-current-ma = <0x1518>; + qcom,batt-id-kohm = <0x6b>; + qcom,battery-beta = <0x109a>; + qcom,battery-therm-kohm = <0x64>; + qcom,battery-type = "Alium_860_89032_0000_3600mAh_Jun15th2018"; + qcom,qg-batt-profile-ver = <0x64>; + qcom,jeita-fcc-ranges = <0x0 0x32 0x2625a0 0x33 0x190 0x5265c0 0x191 0x1c2 0x2625a0>; + qcom,jeita-fv-ranges = <0x0 0x32 0x40d990 0x33 0x190 0x426030 0x191 0x1c2 0x40d990>; + qcom,step-chg-ranges = <0x36ee80 0x39fbc0 0x5265c0 0x39fbc1 0x419ce0 0x36ee80 0x419ce1 0x426030 0x2625a0>; + qcom,ocv-based-step-chg; + qcom,jeita-soft-thresholds = <0x5314 0x25e3>; + qcom,jeita-hard-thresholds = <0x58cd 0x20b8>; + qcom,jeita-soft-hys-thresholds = <0x4f5e 0x2943>; + qcom,jeita-soft-fcc-ua = <0x2625a0 0x2625a0>; + qcom,jeita-soft-fv-uv = <0x40d990 0x40d990>; + + qcom,fcc1-temp-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xd62 0xdbf 0xdfd 0xe1d 0xe2e>; + }; + + qcom,fcc2-temp-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xdda 0xdf8 0xe02 0xe04 0xdff 0xdff>; + }; + + qcom,pc-temp-v1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa846 0xa903 0xa965 0xa982 0xa987 0xa757 0xa82c 0xa88b 0xa8b2 0xa8bc 0xa671 0xa747 0xa7a8 0xa7d4 0xa7e5 0xa598 0xa65f 0xa6c5 0xa6f2 0xa707 0xa4ca 0xa582 0xa5e5 0xa611 0xa627 0xa3ff 0xa4af 0xa508 0xa531 0xa546 0xa330 0xa3e1 0xa430 0xa452 0xa465 0xa25d 0xa311 0xa35c 0xa377 0xa387 0xa1a0 0xa23e 0xa287 0xa29e 0xa2ad 0xa10a 0xa17a 0xa1b1 0xa1c4 0xa1d2 0xa07e 0xa0e5 0xa0f6 0xa0f5 0xa0fc 0x9fa9 0xa061 0xa067 0xa048 0xa036 0x9e4b 0x9f9a 0x9fd6 0x9fae 0x9f81 0x9cdb 0x9e3d 0x9ee8 0x9ee6 0x9ebf 0x9bed 0x9cd1 0x9d85 0x9dc6 0x9dd7 0x9b4d 0x9bf5 0x9c67 0x9cb4 0x9cf4 0x9ad6 0x9b65 0x9bd6 0x9c18 0x9c4a 0x9a75 0x9af5 0x9b63 0x9baa 0x9bc5 0x9a1f 0x9a9b 0x9ade 0x9b13 0x9b23 0x99c4 0x9a41 0x9a3f 0x9a2d 0x9a41 0x9962 0x99c6 0x998a 0x9943 0x9959 0x98fd 0x992a 0x98b8 0x9892 0x98a0 0x9894 0x9882 0x97f4 0x9800 0x9807 0x982b 0x97c6 0x976f 0x9780 0x9781 0x97cb 0x9713 0x970f 0x970c 0x970c 0x9775 0x9697 0x96b5 0x96a2 0x96a2 0x9724 0x963e 0x965a 0x9642 0x963e 0x96db 0x95fa 0x9603 0x95e9 0x95e1 0x9698 0x95c7 0x95b7 0x9598 0x958b 0x965b 0x959d 0x9571 0x954e 0x953b 0x9627 0x9575 0x9533 0x950c 0x94f4 0x95f8 0x9550 0x94fe 0x94d1 0x94b3 0x95cc 0x952e 0x94cf 0x949b 0x947a 0x95a2 0x9511 0x94a4 0x9465 0x9440 0x9579 0x94f7 0x947f 0x9432 0x9407 0x954f 0x94d6 0x9458 0x93fe 0x93cc 0x9525 0x94b2 0x942f 0x93c6 0x938b 0x94f0 0x9484 0x9402 0x938b 0x9345 0x94a6 0x943e 0x93bf 0x9343 0x92f7 0x944c 0x93da 0x935f 0x92ed 0x92a2 0x93e6 0x936c 0x92f1 0x9288 0x923f 0x936b 0x92f1 0x9276 0x920e 0x91c6 0x92e1 0x926f 0x91f1 0x9188 0x9141 0x9248 0x91ea 0x9165 0x90ff 0x90bc 0x91cf 0x9176 0x9100 0x909b 0x905b 0x9179 0x9129 0x90c1 0x9060 0x9022 0x9159 0x910e 0x90ab 0x904f 0x9011 0x913e 0x90f9 0x909a 0x903f 0x9001 0x911a 0x90de 0x907f 0x9020 0x8fdd 0x90ac 0x9070 0x8ff7 0x8f74 0x8f1a 0x8f68 0x8f1c 0x8e9e 0x8e14 0x8db6 0x8d9d 0x8d55 0x8cd8 0x8c4c 0x8beb 0x8b59 0x8b10 0x8a94 0x8a02 0x899f 0x8849 0x87fb 0x877d 0x86e5 0x867d 0x836c 0x8325 0x82aa 0x8209 0x8197 0x7530 0x7530 0x7530 0x7530 0x7530>; + }; + + qcom,pc-temp-v2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa98d 0xa97e 0xa974 0xa960 0xa92e 0xa910 0xa7fb 0xa83a 0xa854 0xa856 0xa82f 0xa819 0xa6a3 0xa712 0xa747 0xa757 0xa738 0xa728 0xa594 0xa609 0xa64d 0xa665 0xa64a 0xa63c 0xa4c7 0xa51d 0xa566 0xa581 0xa565 0xa558 0xa3f4 0xa43e 0xa489 0xa4a2 0xa484 0xa478 0xa2af 0xa364 0xa3b3 0xa3c8 0xa3a5 0xa397 0xa162 0xa292 0xa2e4 0xa2f3 0xa2ca 0xa2b9 0xa11a 0xa1c1 0xa210 0xa21b 0xa1ef 0xa1de 0xa14f 0xa0ea 0xa131 0xa139 0xa110 0xa103 0xa17a 0xa03c 0xa071 0xa077 0xa047 0xa035 0xa046 0x9fd6 0x9ff5 0x9ff5 0x9fb3 0x9f87 0x9d6d 0x9f7f 0x9f85 0x9f81 0x9f2b 0x9ee2 0x9b88 0x9eab 0x9ea9 0x9ead 0x9e5e 0x9e1a 0x9a81 0x9c78 0x9cde 0x9d1e 0x9d16 0x9d22 0x99b8 0x9a96 0x9b46 0x9bd5 0x9bfe 0x9c3f 0x9913 0x99e8 0x9a78 0x9b4d 0x9b70 0x9b9c 0x9887 0x9977 0x99df 0x9aeb 0x9b04 0x9b0e 0x97f7 0x98f2 0x9948 0x9a53 0x9a64 0x9a58 0x975c 0x9856 0x98b5 0x9965 0x9971 0x9967 0x96c8 0x97b8 0x9827 0x987f 0x9885 0x9883 0x9649 0x9720 0x9799 0x97d3 0x97d8 0x97d6 0x95d8 0x968d 0x9711 0x9743 0x9748 0x9745 0x957d 0x9608 0x9697 0x96c6 0x96cb 0x96c8 0x9533 0x9591 0x9629 0x9658 0x965c 0x9658 0x94f4 0x952a 0x95c3 0x95f3 0x95f6 0x95f1 0x94bc 0x94d6 0x9565 0x9595 0x9598 0x9592 0x948a 0x9491 0x950e 0x953e 0x9540 0x9538 0x9458 0x9459 0x94bd 0x94f0 0x94ef 0x94e6 0x9429 0x942b 0x9471 0x94aa 0x94a5 0x949b 0x93fa 0x9403 0x942c 0x9467 0x9461 0x9456 0x93cb 0x93dc 0x93ed 0x9426 0x9422 0x9418 0x939a 0x93b7 0x93b6 0x93e7 0x93e7 0x93dd 0x9366 0x9390 0x9384 0x93a6 0x93a1 0x9392 0x9330 0x9367 0x935a 0x9364 0x9348 0x932b 0x92f5 0x933c 0x9330 0x9322 0x92ea 0x92bd 0x92b6 0x9309 0x9301 0x92e2 0x9296 0x925d 0x9274 0x92ce 0x92cf 0x92a2 0x9248 0x9208 0x922d 0x9289 0x9294 0x925e 0x91fe 0x91bc 0x91e4 0x9235 0x924a 0x9214 0x91b6 0x9173 0x919a 0x91d4 0x91f2 0x91c0 0x9166 0x9124 0x9151 0x916d 0x918d 0x9158 0x9101 0x90c0 0x910a 0x9104 0x9119 0x90da 0x9085 0x9045 0x90be 0x90a5 0x90a4 0x9064 0x9011 0x8fd4 0x9066 0x9055 0x9058 0x9026 0x8fde 0x8fa3 0x8ff1 0x9009 0x9027 0x900b 0x8fc1 0x8f87 0x8fa0 0x8fd7 0x9010 0x8ff6 0x8fb0 0x8f76 0x8f3a 0x8f9b 0x8ff2 0x8fd7 0x8f94 0x8f5b 0x8e9d 0x8f3c 0x8fa7 0x8f84 0x8f3f 0x8efc 0x8dbc 0x8e73 0x8ecd 0x8e86 0x8e46 0x8df2 0x8c72 0x8d0b 0x8d41 0x8ce7 0x8ca5 0x8c4f 0x8a95 0x8b0d 0x8b2a 0x8ad3 0x8a9a 0x8a45 0x87f8 0x8865 0x887d 0x881c 0x87ec 0x879d 0x841a 0x8496 0x84d3 0x8488 0x847e 0x8426 0x7eca 0x7f24 0x801b 0x8028 0x7f97 0x7ef0 0x6fcb 0x6e6e 0x6d71 0x6d74 0x6d50 0x6d1a>; + }; + + qcom,pc-temp-z1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x38d1 0x33b6 0x2f09 0x2da0 0x2d49 0x38bb 0x337f 0x2f0d 0x2d9e 0x2d52 0x38c3 0x3376 0x2f0b 0x2da5 0x2d5c 0x38c7 0x337e 0x2f07 0x2da7 0x2d60 0x38d3 0x3382 0x2f03 0x2da8 0x2d62 0x38eb 0x337d 0x2f01 0x2da8 0x2d64 0x38ff 0x336c 0x2f02 0x2da9 0x2d67 0x38f6 0x335e 0x2f03 0x2dac 0x2d6a 0x38d7 0x335d 0x2f05 0x2dae 0x2d6d 0x38b6 0x3362 0x2f09 0x2db1 0x2d6f 0x3896 0x3360 0x2f0d 0x2db5 0x2d72 0x3874 0x334e 0x2f0f 0x2db8 0x2d77 0x3843 0x333c 0x2f0f 0x2dbb 0x2d7b 0x3810 0x332e 0x2f0b 0x2dbb 0x2d7c 0x37ee 0x3328 0x2f04 0x2db9 0x2d7c 0x37d3 0x3329 0x2f01 0x2db7 0x2d7c 0x37b6 0x3329 0x2f04 0x2dbb 0x2d7f 0x3792 0x332c 0x2f0a 0x2dc2 0x2d85 0x3772 0x3337 0x2f14 0x2dc9 0x2d8b 0x3765 0x3349 0x2f21 0x2dce 0x2d8f 0x3763 0x335e 0x2f2c 0x2dd3 0x2d93 0x376a 0x3374 0x2f35 0x2dd8 0x2d98 0x3773 0x3384 0x2f3d 0x2ddd 0x2d9c 0x377f 0x338b 0x2f45 0x2de1 0x2da1 0x3787 0x3391 0x2f4d 0x2de7 0x2da6 0x378c 0x339a 0x2f54 0x2dec 0x2daa 0x378f 0x33a6 0x2f5b 0x2df0 0x2daf 0x3794 0x33ad 0x2f62 0x2df4 0x2db3 0x379f 0x33b2 0x2f69 0x2df8 0x2db7 0x37af 0x33ba 0x2f6f 0x2dfc 0x2dbb 0x37c7 0x33c2 0x2f75 0x2e00 0x2dbf 0x37de 0x33c9 0x2f7a 0x2e04 0x2dc4 0x37e6 0x33d1 0x2f80 0x2e08 0x2dc8 0x37ea 0x33de 0x2f86 0x2e0d 0x2dcd 0x37f0 0x33f1 0x2f8e 0x2e12 0x2dd1 0x3807 0x3403 0x2f95 0x2e17 0x2dd5 0x383b 0x3415 0x2f9d 0x2e1a 0x2dd8 0x386b 0x3422 0x2fa5 0x2e1c 0x2dda 0x3891 0x3427 0x2faa 0x2e1f 0x2ddc 0x38b0 0x3429 0x2fad 0x2e21 0x2ddd 0x38b2 0x342d 0x2fb1 0x2e23 0x2dde 0x3888 0x3439 0x2fb9 0x2e25 0x2de0 0x3873 0x3448 0x2fbf 0x2e27 0x2de1 0x386e 0x3457 0x2fc0 0x2e28 0x2de2 0x3861 0x3449 0x2fc4 0x2e29 0x2de2 0x386f 0x3454 0x2fc7 0x2e2b 0x2de2 0x3869 0x3454 0x2fc8 0x2e2b 0x2de1 0x3868 0x345b 0x2fc9 0x2e2b 0x2de2 0x385f 0x3457 0x2fcf 0x2e2c 0x2de3 0x387c 0x3452 0x2fd1 0x2e30 0x2de6 0x3886 0x346f 0x2fdb 0x2e36 0x2deb 0x38aa 0x3476 0x2ff3 0x2e3f 0x2df0 0x3895 0x349e 0x3007 0x2e4a 0x2dfa 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06>; + }; + + qcom,pc-temp-z2-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2bb8 0x2632 0x2811 0x296b 0x2a9e 0x280d 0x2a3d 0x2824 0x28fa 0x293e 0x25fe 0x2926 0x282f 0x28bc 0x28c4 0x2606 0x274d 0x282a 0x28ad 0x28ac 0x2620 0x26d2 0x281d 0x2898 0x28a6 0x262f 0x26c3 0x2815 0x288c 0x28a4 0x2631 0x26b5 0x2811 0x2887 0x28a8 0x262c 0x26aa 0x2812 0x2882 0x28ac 0x2625 0x26a2 0x2816 0x2880 0x28ac 0x261b 0x269c 0x2819 0x2884 0x28b5 0x2612 0x2698 0x2813 0x2887 0x28cc 0x2616 0x2696 0x27f3 0x288e 0x28d4 0x2626 0x2699 0x27d7 0x28ae 0x28d3 0x262c 0x26a7 0x27e8 0x28bd 0x28d4 0x2618 0x26b3 0x2814 0x289f 0x28d2 0x25f5 0x26b6 0x282a 0x2883 0x28c7 0x25e5 0x26ba 0x2827 0x288f 0x28d1 0x25e1 0x26c3 0x281d 0x28b2 0x290a 0x25dd 0x26dd 0x2837 0x28e1 0x2937 0x25d6 0x26fd 0x2894 0x2931 0x293f 0x25c9 0x271e 0x28ce 0x296a 0x293f 0x25be 0x2742 0x28b3 0x2939 0x2923 0x25b7 0x2760 0x2883 0x28bd 0x28ee 0x25b1 0x2775 0x2863 0x288b 0x28cc 0x259f 0x2784 0x284c 0x289e 0x28b4 0x2574 0x278c 0x283f 0x28b6 0x28a5 0x2552 0x2793 0x283c 0x28a9 0x28a6 0x2544 0x2797 0x283d 0x2890 0x28af 0x250b 0x2796 0x2845 0x2888 0x28ba 0x24d2 0x2793 0x2859 0x2888 0x28cd 0x24c0 0x2792 0x286f 0x288c 0x28e8 0x24b3 0x2793 0x2885 0x289f 0x290a 0x24aa 0x2795 0x289c 0x28c5 0x2934 0x24a2 0x2799 0x28b4 0x28ea 0x2962 0x249c 0x27a2 0x28ce 0x290a 0x299b 0x2498 0x27aa 0x28df 0x2925 0x29c7 0x249e 0x27b2 0x28e4 0x293c 0x29d8 0x24a4 0x27b7 0x28e7 0x2954 0x29e2 0x24ad 0x27bb 0x28ef 0x2961 0x29ed 0x24b6 0x27c0 0x28fb 0x2964 0x29f9 0x24b5 0x27c2 0x2901 0x2965 0x2a01 0x24a8 0x27b9 0x28fa 0x2971 0x2a03 0x24a4 0x279c 0x28f3 0x2981 0x2a07 0x24aa 0x26ec 0x28f1 0x2987 0x2a1d 0x246c 0x26c6 0x28d6 0x2992 0x2a3b 0x2459 0x26cc 0x28c6 0x29ad 0x2a38 0x2447 0x26dc 0x28df 0x29c9 0x2a6a 0x2449 0x26cd 0x293d 0x29ca 0x2a89 0x243a 0x26ed 0x297e 0x2a06 0x2aa5 0x243e 0x26c3 0x2925 0x29d7 0x2a55 0x2464 0x269c 0x28de 0x298a 0x29c5 0x246e 0x264f 0x28b9 0x2971 0x29af 0x2445 0x25fc 0x289b 0x2927 0x295f 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904>; + }; + + qcom,pc-temp-z3-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4c45 0x4be7 0x4bad 0x4bb7 0x4b9b 0x4d48 0x4c26 0x4bd0 0x4baa 0x4b96 0x4dd0 0x4c76 0x4bee 0x4bac 0x4b97 0x4de1 0x4cc3 0x4bfa 0x4bb4 0x4b9c 0x4dce 0x4cd9 0x4bff 0x4bb6 0x4b9f 0x4db7 0x4cdc 0x4c00 0x4bb7 0x4ba2 0x4dac 0x4cdd 0x4bfe 0x4bb5 0x4ba2 0x4da7 0x4cdd 0x4bfb 0x4bb0 0x4b9f 0x4da5 0x4ce0 0x4bf8 0x4bac 0x4b9b 0x4da2 0x4ce2 0x4bf6 0x4bac 0x4b99 0x4da0 0x4cd4 0x4bf0 0x4bac 0x4b98 0x4da5 0x4cac 0x4bdf 0x4ba7 0x4b98 0x4db6 0x4c9a 0x4bc8 0x4b9b 0x4b95 0x4dc5 0x4cb6 0x4bce 0x4b96 0x4b91 0x4db4 0x4cd7 0x4bef 0x4ba3 0x4b93 0x4d83 0x4cd1 0x4c01 0x4bb3 0x4b97 0x4d54 0x4cac 0x4bec 0x4bad 0x4b94 0x4d30 0x4c8a 0x4bd0 0x4b9c 0x4b8a 0x4d0e 0x4c6f 0x4bcf 0x4b98 0x4b87 0x4cf1 0x4c5e 0x4be1 0x4ba6 0x4b8e 0x4cd8 0x4c62 0x4bee 0x4bb3 0x4b97 0x4cc6 0x4c75 0x4bef 0x4bb3 0x4b9d 0x4cbc 0x4c87 0x4bef 0x4bae 0x4ba1 0x4cb4 0x4c93 0x4bed 0x4bad 0x4ba2 0x4cac 0x4c9c 0x4bea 0x4bb4 0x4ba0 0x4ca3 0x4c9d 0x4be9 0x4bba 0x4b9e 0x4c97 0x4c9b 0x4bef 0x4bb7 0x4b9c 0x4c8c 0x4c97 0x4bf5 0x4bb2 0x4b9a 0x4c7f 0x4c91 0x4bf6 0x4bae 0x4b98 0x4c6f 0x4c8a 0x4bf4 0x4ba9 0x4b96 0x4c5d 0x4c84 0x4bf2 0x4ba5 0x4b94 0x4c4a 0x4c7f 0x4bef 0x4ba2 0x4b91 0x4c3a 0x4c7a 0x4bea 0x4ba0 0x4b8e 0x4c2b 0x4c73 0x4be7 0x4b9f 0x4b8a 0x4c1e 0x4c6b 0x4be5 0x4b9e 0x4b86 0x4c17 0x4c65 0x4be2 0x4b9e 0x4b84 0x4c1b 0x4c5f 0x4bde 0x4b9e 0x4b84 0x4c23 0x4c5a 0x4bda 0x4b9d 0x4b86 0x4c39 0x4c56 0x4bd7 0x4b9c 0x4b86 0x4c4f 0x4c53 0x4bd6 0x4b97 0x4b83 0x4c46 0x4c4f 0x4bd4 0x4b93 0x4b81 0x4c28 0x4c4a 0x4bd2 0x4b93 0x4b82 0x4c1b 0x4c3f 0x4bd0 0x4b93 0x4b82 0x4c19 0x4bfb 0x4bcc 0x4b93 0x4b83 0x4bac 0x4bb3 0x4bb6 0x4b90 0x4b7f 0x4b91 0x4b94 0x4ba0 0x4b89 0x4b78 0x4b89 0x4b8c 0x4b9e 0x4b80 0x4b70 0x4b8b 0x4b87 0x4b8e 0x4b7e 0x4b70 0x4b74 0x4b76 0x4b83 0x4b7c 0x4b6d 0x4b78 0x4b75 0x4b98 0x4b87 0x4b7c 0x4bab 0x4b91 0x4b9b 0x4b8b 0x4b83 0x4bda 0x4b96 0x4b9d 0x4b8e 0x4b84 0x4bf2 0x4b94 0x4b99 0x4b92 0x4b87 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c>; + }; + + qcom,pc-temp-z4-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4001 0x3c8d 0x3a72 0x3978 0x397b 0x40ed 0x3c83 0x3a6f 0x39c6 0x39b9 0x40da 0x3c60 0x3a4a 0x39d2 0x39c2 0x4086 0x3c0a 0x3a21 0x39c0 0x39b5 0x4000 0x3ba1 0x39fb 0x39a7 0x399e 0x3f71 0x3b4a 0x39dc 0x3990 0x3986 0x3ef7 0x3b02 0x39c2 0x3981 0x3976 0x3e89 0x3acb 0x39ac 0x3976 0x396c 0x3e16 0x3aa0 0x39a0 0x3970 0x3966 0x3d82 0x3a79 0x399a 0x396d 0x3961 0x3cf4 0x3a50 0x3998 0x396a 0x395d 0x3cc5 0x3a2f 0x3998 0x3965 0x3959 0x3cdb 0x3a29 0x3999 0x395f 0x3951 0x3cf0 0x3a35 0x399d 0x3961 0x394e 0x3cc2 0x3a3c 0x39a2 0x3970 0x395b 0x3c4c 0x3a29 0x39a0 0x397b 0x3968 0x3beb 0x39fe 0x398c 0x396b 0x395e 0x3bb2 0x39dd 0x3979 0x394d 0x3947 0x3b8d 0x39c9 0x3978 0x394f 0x3946 0x3b7e 0x39bd 0x3982 0x3988 0x3974 0x3b75 0x39bc 0x3996 0x39ba 0x39a6 0x3b71 0x39bf 0x39ca 0x39be 0x39ab 0x3b75 0x39c9 0x39fe 0x39b9 0x399f 0x3b7b 0x39fa 0x39fe 0x39ae 0x3991 0x3b80 0x3a38 0x39df 0x3993 0x3982 0x3b85 0x3a46 0x39bf 0x397d 0x3975 0x3b8c 0x3a43 0x39a7 0x3973 0x396c 0x3b92 0x3a3e 0x3994 0x396e 0x3965 0x3b9e 0x3a2f 0x3989 0x3969 0x395f 0x3bab 0x3a18 0x3982 0x3965 0x395a 0x3bb3 0x3a05 0x397d 0x3962 0x3955 0x3bba 0x39f5 0x397b 0x395e 0x3951 0x3bbe 0x39e5 0x397a 0x395a 0x394e 0x3bbc 0x39d6 0x3979 0x395a 0x394d 0x3bb5 0x39c8 0x3979 0x395c 0x3950 0x3ba1 0x39ba 0x3978 0x395e 0x3955 0x3b72 0x39ac 0x3976 0x3961 0x395b 0x3b43 0x39a1 0x3973 0x3963 0x3961 0x3afc 0x399e 0x3970 0x3963 0x3963 0x3abc 0x399c 0x396d 0x3963 0x3960 0x3ab4 0x3999 0x396a 0x3962 0x395d 0x3abb 0x3994 0x3967 0x3960 0x395c 0x3ab9 0x3995 0x3962 0x395d 0x395b 0x3aa3 0x39d0 0x395a 0x3959 0x3958 0x3abd 0x39eb 0x3957 0x394b 0x394c 0x3ac6 0x39f6 0x3953 0x3935 0x3934 0x3acb 0x39f8 0x394d 0x3931 0x392d 0x3ac3 0x39fa 0x3959 0x3929 0x3920 0x3ad0 0x3a03 0x3961 0x3925 0x391e 0x3ac0 0x39ff 0x394e 0x392e 0x392c 0x3a9b 0x39f7 0x3956 0x3935 0x3930 0x3a8e 0x39fe 0x3959 0x3936 0x3935 0x3a94 0x3a0e 0x3963 0x3937 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936>; + }; + + qcom,pc-temp-z5-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2b3c 0x2daa 0x3498 0x4a8d 0x45cc 0x2ef0 0x3052 0x39fb 0x4721 0x484e 0x3117 0x343d 0x3f9f 0x4802 0x4a61 0x31df 0x385f 0x430e 0x4b83 0x4d9f 0x326a 0x3a69 0x44ec 0x4e02 0x5124 0x32f3 0x3bab 0x4673 0x5049 0x55e1 0x33c6 0x3ce5 0x4810 0x514c 0x5936 0x34d0 0x3e95 0x49be 0x511b 0x5a23 0x35db 0x4119 0x4b35 0x5160 0x5a1d 0x36fa 0x4312 0x4c4c 0x5327 0x5b6b 0x3859 0x42b6 0x4bad 0x5424 0x5e2c 0x3a2d 0x3f5c 0x45e6 0x5167 0x6138 0x3c44 0x3ed3 0x3ee4 0x49ed 0x6100 0x3d63 0x47a6 0x4250 0x472f 0x5e7d 0x3d9a 0x506d 0x5049 0x50b3 0x5f98 0x3db5 0x5016 0x57f1 0x5c40 0x639a 0x3dda 0x4c6d 0x532f 0x5d14 0x64bc 0x3dd6 0x4a75 0x4bb9 0x59b9 0x646c 0x3d86 0x49e6 0x55e6 0x5b90 0x6454 0x3cdc 0x49b6 0x76e4 0x6b24 0x646b 0x3bcd 0x5034 0x875d 0x7705 0x6492 0x3ad1 0x649b 0x78a4 0x6a60 0x5e9c 0x3a04 0x7968 0x6282 0x5014 0x511e 0x3939 0x8c1a 0x56c4 0x4873 0x4bc7 0x3846 0x9a39 0x4fd8 0x5026 0x4d8e 0x3716 0x9aa6 0x4dfb 0x5780 0x5074 0x35e9 0x91df 0x53c1 0x5aa0 0x53ba 0x34ed 0x87db 0x5d83 0x5d20 0x57f1 0x33ea 0x7eb5 0x65eb 0x5e8b 0x5cc6 0x32dd 0x764e 0x6eb9 0x601d 0x628a 0x31ca 0x720c 0x75c6 0x61b9 0x67fc 0x30bf 0x6fd5 0x79eb 0x63f1 0x6c9c 0x2ffa 0x6e15 0x7d26 0x6810 0x7085 0x2f5e 0x6c28 0x8068 0x6dc5 0x7165 0x2ed6 0x6a83 0x83d1 0x7653 0x6fdc 0x2e78 0x6a47 0x8529 0x7b5b 0x6e81 0x2ea9 0x6b32 0x8003 0x7adf 0x6f61 0x2f11 0x6ca0 0x7890 0x796f 0x710e 0x303e 0x6e9b 0x7749 0x7672 0x709c 0x317f 0x7119 0x77a9 0x6cad 0x6a94 0x3162 0x71bd 0x77df 0x65cc 0x65f5 0x300b 0x6c45 0x7771 0x66c4 0x66af 0x2fb0 0x60cd 0x7669 0x680b 0x6789 0x3015 0x4018 0x70b0 0x6813 0x6600 0x2ca4 0x3328 0x596b 0x6764 0x62b7 0x2bbe 0x3022 0x477d 0x6688 0x6215 0x2b68 0x2f70 0x4725 0x57da 0x5967 0x2b6c 0x2f09 0x3dd8 0x58e5 0x64be 0x2ab7 0x2db9 0x398d 0x5bd2 0x6460 0x2ae0 0x2ded 0x457f 0x6bcd 0x75c0 0x2cb0 0x2ff3 0x438f 0x6311 0x7110 0x2d80 0x2fa5 0x439f 0x6129 0x668d 0x2d89 0x2ebe 0x3ec3 0x61e3 0x62ca 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005>; + }; + + qcom,pc-temp-z6-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x409a 0x3c2e 0x39dd 0x392f 0x3913 0x416d 0x3c48 0x39ee 0x394b 0x392d 0x419b 0x3c57 0x39ee 0x3952 0x3933 0x4181 0x3c50 0x39e4 0x394f 0x3931 0x413b 0x3c33 0x39d5 0x3947 0x392a 0x40e4 0x3c0c 0x39c7 0x393d 0x3921 0x409c 0x3be5 0x39bb 0x3935 0x391b 0x4062 0x3bcb 0x39b0 0x392e 0x3915 0x4027 0x3bb9 0x39aa 0x392a 0x3910 0x3fe0 0x3ba7 0x39a7 0x3929 0x390e 0x3f9a 0x3b8a 0x39a3 0x3928 0x390c 0x3f73 0x3b64 0x399a 0x3924 0x390b 0x3f65 0x3b56 0x398e 0x391c 0x3906 0x3f55 0x3b62 0x3992 0x3919 0x3903 0x3f1e 0x3b70 0x39a4 0x3927 0x390a 0x3ec0 0x3b64 0x39ac 0x3933 0x3912 0x3e70 0x3b3f 0x3999 0x392a 0x390c 0x3e3a 0x3b22 0x3982 0x3915 0x38fe 0x3e0f 0x3b10 0x3982 0x3914 0x38fc 0x3df2 0x3b06 0x3991 0x3936 0x3915 0x3ddc 0x3b09 0x39a5 0x3953 0x3930 0x3dd2 0x3b19 0x39c1 0x3956 0x3934 0x3dd2 0x3b2e 0x39d7 0x3953 0x3934 0x3dd7 0x3b4e 0x39d6 0x394f 0x3932 0x3ddc 0x3b6d 0x39c9 0x3948 0x392b 0x3de1 0x3b75 0x39be 0x3942 0x3924 0x3de6 0x3b75 0x39b8 0x393d 0x391f 0x3dea 0x3b74 0x39b4 0x3938 0x391c 0x3dee 0x3b6e 0x39b1 0x3935 0x3919 0x3df0 0x3b64 0x39ae 0x3931 0x3916 0x3df0 0x3b5c 0x39ab 0x392e 0x3913 0x3df0 0x3b54 0x39a9 0x392b 0x3910 0x3def 0x3b4c 0x39a8 0x3928 0x390d 0x3ded 0x3b46 0x39a7 0x3928 0x390c 0x3deb 0x3b40 0x39a7 0x3929 0x390c 0x3deb 0x3b3c 0x39a6 0x392a 0x390c 0x3ded 0x3b38 0x39a4 0x392c 0x390f 0x3def 0x3b35 0x39a2 0x392d 0x3913 0x3def 0x3b35 0x39a0 0x392d 0x3914 0x3dee 0x3b36 0x399f 0x392a 0x3912 0x3deb 0x3b36 0x399e 0x3928 0x3910 0x3de2 0x3b35 0x399d 0x3927 0x3910 0x3dd8 0x3b34 0x399b 0x3927 0x390f 0x3dcd 0x3b2c 0x3997 0x3926 0x390f 0x3da1 0x3b16 0x398b 0x391d 0x3908 0x3d94 0x3b10 0x397f 0x3911 0x38f9 0x3d93 0x3b0a 0x397c 0x390a 0x38f2 0x3d8f 0x3b0c 0x3979 0x3906 0x38ec 0x3d8d 0x3b07 0x3977 0x3903 0x38ea 0x3d95 0x3b0c 0x397c 0x390d 0x38f8 0x3da1 0x3b20 0x3983 0x3914 0x38ff 0x3dbd 0x3b30 0x398c 0x3918 0x3902 0x3de0 0x3b45 0x3993 0x391d 0x3906 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d>; + }; + + qcom,pc-temp-y1-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1dae 0x1a6c 0x17b7 0x1540 0x1467 0x143b 0x1db4 0x1a6f 0x17c3 0x153f 0x1466 0x143d 0x1dc0 0x1a74 0x17ca 0x153e 0x1466 0x143e 0x1dcd 0x1a7a 0x17ce 0x153c 0x1466 0x1440 0x1dd8 0x1a7e 0x17d0 0x153b 0x1467 0x1441 0x1ddd 0x1a80 0x17d0 0x153a 0x1467 0x1443 0x1ddc 0x1a80 0x17cc 0x153a 0x1468 0x1443 0x1dda 0x1a80 0x17c6 0x153a 0x146a 0x1444 0x1dd3 0x1a7d 0x17c5 0x153b 0x146c 0x1445 0x1dbc 0x1a76 0x17c8 0x153c 0x146d 0x1446 0x1daa 0x1a70 0x17ca 0x153d 0x146f 0x1448 0x1db3 0x1a6e 0x17c6 0x153d 0x1470 0x1449 0x1dc8 0x1a6f 0x17c0 0x153d 0x1472 0x144b 0x1ddc 0x1a74 0x17c1 0x153e 0x1474 0x144d 0x1df4 0x1a85 0x17d0 0x1545 0x1479 0x1452 0x1e03 0x1a97 0x17db 0x154d 0x147c 0x1454 0x1dfa 0x1aa4 0x17df 0x154f 0x147c 0x1455 0x1de7 0x1aaf 0x17e3 0x1552 0x147d 0x1455 0x1dd8 0x1ab0 0x17e4 0x1554 0x147e 0x1456 0x1dca 0x1aa1 0x17e2 0x1555 0x1480 0x1459 0x1dc3 0x1a95 0x17e2 0x1558 0x1483 0x145c 0x1dd6 0x1a97 0x17ed 0x155c 0x1487 0x1460 0x1df9 0x1a9f 0x17fb 0x1560 0x148b 0x1463 0x1e01 0x1aa5 0x17fd 0x1565 0x148e 0x1467 0x1e00 0x1aa8 0x17f8 0x1569 0x1491 0x146a 0x1e04 0x1aac 0x17f7 0x156d 0x1493 0x146e 0x1e09 0x1ab8 0x1800 0x1571 0x1496 0x1472 0x1e0c 0x1acc 0x180b 0x1576 0x149a 0x1475 0x1e0a 0x1ad7 0x180e 0x157b 0x149d 0x1478 0x1df8 0x1adc 0x1812 0x1581 0x14a0 0x147a 0x1de0 0x1ade 0x1817 0x1586 0x14a3 0x147d 0x1dd9 0x1adb 0x181b 0x158b 0x14a7 0x1480 0x1ddb 0x1ad7 0x181f 0x1590 0x14aa 0x1484 0x1ddd 0x1ad7 0x1820 0x1593 0x14ad 0x1487 0x1de1 0x1ad5 0x1821 0x1596 0x14b0 0x1489 0x1de8 0x1ad3 0x1823 0x1599 0x14b2 0x148b 0x1df7 0x1adf 0x1827 0x159b 0x14b4 0x148c 0x1e0a 0x1aef 0x182c 0x159d 0x14b5 0x148d 0x1e0d 0x1aef 0x1831 0x159e 0x14b5 0x148e 0x1dff 0x1ae3 0x1835 0x159f 0x14b6 0x148e 0x1df5 0x1adf 0x183a 0x15a1 0x14b7 0x148f 0x1df6 0x1ae5 0x1841 0x15a5 0x14b9 0x1491 0x1df6 0x1aeb 0x184c 0x15a8 0x14ba 0x1492 0x1df6 0x1af2 0x1849 0x15aa 0x14bb 0x1493 0x1dfa 0x1af8 0x1850 0x15af 0x14be 0x1495 0x1e04 0x1b0b 0x1850 0x15b1 0x14be 0x1496 0x1e09 0x1b08 0x1859 0x15b4 0x14be 0x1496 0x1e26 0x1b0e 0x1863 0x15b4 0x14be 0x1496 0x1e37 0x1b0b 0x186b 0x15b6 0x14bf 0x1496 0x1e2c 0x1b1e 0x1867 0x15b9 0x14c2 0x1498 0x1e29 0x1b3f 0x1879 0x15c2 0x14c5 0x149b 0x1e38 0x1b5b 0x1895 0x15d1 0x14cc 0x14a0 0x1e61 0x1b5f 0x18a8 0x15e4 0x14d3 0x14a6 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac>; + }; + + qcom,pc-temp-y2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x25d6 0x28a1 0x29b8 0x2b2a 0x2b60 0x2c89 0x2638 0x287f 0x299b 0x2b15 0x2b62 0x2c51 0x2674 0x286a 0x297a 0x2afb 0x2b61 0x2bfc 0x2693 0x285f 0x2959 0x2ade 0x2b5e 0x2ba2 0x269f 0x285b 0x293d 0x2abd 0x2b58 0x2b5a 0x26a2 0x285a 0x292b 0x2a9a 0x2b51 0x2b3c 0x266c 0x2867 0x2922 0x2a6d 0x2b48 0x2b43 0x260b 0x287d 0x291b 0x2a3f 0x2b3b 0x2b4e 0x25f2 0x2878 0x2916 0x2a29 0x2b28 0x2b4d 0x25fe 0x283e 0x2912 0x2a1c 0x2b09 0x2b3a 0x2615 0x2814 0x2910 0x2a13 0x2ae5 0x2b24 0x2698 0x2862 0x291a 0x2a04 0x2ab6 0x2afb 0x2784 0x28ea 0x2933 0x29f0 0x2a85 0x2ac3 0x27ba 0x2909 0x295a 0x29f2 0x2a7a 0x2abc 0x26d8 0x28f6 0x29a8 0x2a1d 0x2a90 0x2af0 0x2601 0x28e9 0x29e0 0x2a53 0x2ab0 0x2b19 0x25e5 0x28ff 0x29fa 0x2a91 0x2aec 0x2b1b 0x25de 0x2924 0x2a0e 0x2ad0 0x2b33 0x2b18 0x25d8 0x292d 0x2a1d 0x2aef 0x2b47 0x2b23 0x25d2 0x292c 0x2a2b 0x2afc 0x2b48 0x2b59 0x25cd 0x2929 0x2a36 0x2b0a 0x2b4a 0x2b9b 0x25ca 0x28f3 0x2a3f 0x2b29 0x2b78 0x2bd9 0x25c8 0x2849 0x2a48 0x2b54 0x2bc0 0x2c13 0x25c6 0x27d1 0x2a4b 0x2b74 0x2be2 0x2c3d 0x25c3 0x275f 0x2a50 0x2b8f 0x2bf6 0x2c5c 0x25c0 0x271c 0x2a54 0x2ba1 0x2c07 0x2c71 0x25bf 0x270e 0x2a52 0x2bac 0x2c19 0x2c83 0x25be 0x2700 0x2a4a 0x2bb0 0x2c2d 0x2c96 0x25bd 0x26ed 0x2a46 0x2ba7 0x2c35 0x2cb5 0x25bc 0x26d4 0x2a44 0x2b8e 0x2c41 0x2cec 0x25bb 0x26b9 0x2a3f 0x2b80 0x2c4d 0x2d11 0x25bb 0x26a1 0x29e9 0x2b83 0x2c40 0x2d02 0x25ba 0x268b 0x294e 0x2b8f 0x2c2f 0x2cda 0x25b9 0x2672 0x290b 0x2b9c 0x2c33 0x2cca 0x25b8 0x2655 0x28fa 0x2b99 0x2c39 0x2cd1 0x25b8 0x263a 0x28ee 0x2b84 0x2c35 0x2cd6 0x25b7 0x2622 0x28e6 0x2b68 0x2c34 0x2cdc 0x25b7 0x2604 0x290b 0x2b59 0x2c39 0x2ce8 0x25b6 0x25ec 0x293c 0x2b5f 0x2c3b 0x2ce7 0x25b6 0x25de 0x291d 0x2b60 0x2c36 0x2cd1 0x25b6 0x25d4 0x28ba 0x2b5f 0x2c32 0x2cc5 0x25b6 0x25cb 0x289c 0x2b62 0x2c34 0x2ccc 0x25b6 0x25c4 0x28a6 0x2b5d 0x2c32 0x2ccf 0x25b5 0x25be 0x281b 0x2b46 0x2c13 0x2cc8 0x25b5 0x25bb 0x27d7 0x2b34 0x2c13 0x2cb0 0x25b5 0x25bb 0x27c4 0x2b11 0x2c20 0x2c82 0x25b5 0x25ba 0x2810 0x2b0d 0x2c0a 0x2c51 0x25b5 0x25b9 0x2851 0x2b23 0x2be8 0x2c48 0x25b5 0x25b8 0x2853 0x2b28 0x2bef 0x2c50 0x25b4 0x25b8 0x2837 0x2ae6 0x2c1e 0x2c3a 0x25b4 0x25b6 0x2800 0x2acc 0x2bf7 0x2bfd 0x25b4 0x25b5 0x27bc 0x2aa1 0x2b7e 0x2ba7 0x25b4 0x25b4 0x2786 0x2a49 0x2b0f 0x2b35 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a>; + }; + + qcom,pc-temp-y3-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x347a 0x3456 0x3421 0x33e5 0x33e0 0x33d8 0x356b 0x345f 0x341a 0x33e4 0x33e0 0x33da 0x35ff 0x346c 0x3416 0x33e3 0x33e0 0x33db 0x364d 0x3479 0x3416 0x33e3 0x33e0 0x33dd 0x366b 0x3484 0x3418 0x33e3 0x33e0 0x33de 0x3670 0x3489 0x341c 0x33e5 0x33e0 0x33de 0x35ec 0x3489 0x3423 0x33e8 0x33e0 0x33de 0x34fc 0x3488 0x342b 0x33ed 0x33e1 0x33de 0x34bb 0x348b 0x342e 0x33ef 0x33e1 0x33de 0x34ba 0x349e 0x342f 0x33f0 0x33e1 0x33dd 0x34bb 0x34ac 0x3430 0x33f0 0x33e1 0x33dd 0x34d3 0x349e 0x343d 0x33f7 0x33e4 0x33df 0x3504 0x3481 0x3450 0x3401 0x33e9 0x33e2 0x3510 0x3471 0x3451 0x3402 0x33ea 0x33e3 0x34ec 0x3468 0x343b 0x33fe 0x33e8 0x33e2 0x34cc 0x3462 0x3427 0x33fb 0x33e6 0x33e2 0x34d0 0x345f 0x3422 0x33fd 0x33e8 0x33e2 0x34e0 0x345d 0x341f 0x3401 0x33ec 0x33e3 0x34e7 0x345a 0x341b 0x3401 0x33ec 0x33e3 0x34e9 0x3455 0x3416 0x33f9 0x33e7 0x33e0 0x34ea 0x344f 0x3411 0x33f0 0x33e3 0x33dd 0x34ec 0x3445 0x340c 0x33e8 0x33e1 0x33dc 0x34f0 0x3435 0x3407 0x33e3 0x33e0 0x33db 0x34f5 0x3427 0x3406 0x33e2 0x33df 0x33db 0x3500 0x341c 0x3405 0x33e3 0x33de 0x33db 0x3512 0x3417 0x3405 0x33e4 0x33de 0x33da 0x3525 0x3418 0x3405 0x33e3 0x33de 0x33da 0x3539 0x341b 0x3405 0x33e3 0x33dd 0x33da 0x354f 0x341f 0x3405 0x33e5 0x33dd 0x33da 0x356b 0x3423 0x3405 0x33e9 0x33dd 0x33d9 0x358d 0x3428 0x3405 0x33ec 0x33dd 0x33d9 0x35b2 0x342d 0x3400 0x33ed 0x33de 0x33d9 0x35da 0x3434 0x33f9 0x33ec 0x33de 0x33da 0x360a 0x343c 0x33f6 0x33ec 0x33df 0x33da 0x3641 0x3449 0x33f7 0x33ea 0x33de 0x33da 0x3680 0x3458 0x33f8 0x33e8 0x33de 0x33d9 0x36c1 0x3468 0x33fb 0x33e6 0x33de 0x33d9 0x3702 0x347a 0x3402 0x33e4 0x33dd 0x33d9 0x3742 0x3490 0x3408 0x33e3 0x33dd 0x33d9 0x3781 0x34b0 0x340c 0x33e3 0x33dd 0x33d9 0x37c1 0x34dc 0x340f 0x33e3 0x33dd 0x33d9 0x3803 0x3511 0x3415 0x33e3 0x33de 0x33da 0x3845 0x3550 0x341e 0x33e3 0x33de 0x33da 0x3892 0x35a3 0x3421 0x33e4 0x33de 0x33da 0x38ea 0x3613 0x3429 0x33e3 0x33de 0x33da 0x390d 0x3642 0x3430 0x33eb 0x33df 0x33dc 0x393f 0x363e 0x3435 0x33ec 0x33e1 0x33dd 0x395c 0x3658 0x3442 0x33f0 0x33e3 0x33e0 0x398d 0x36b9 0x3451 0x33f2 0x33e2 0x33e0 0x3a0b 0x3718 0x3452 0x33ee 0x33e1 0x33dd 0x3a97 0x37a6 0x345a 0x33f0 0x33e0 0x33dd 0x3b31 0x3888 0x346f 0x33f5 0x33e3 0x33e1 0x3c10 0x3978 0x3492 0x33f9 0x33e6 0x33e4 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6>; + }; + + qcom,pc-temp-y4-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x45b5 0x41d2 0x40f2 0x406d 0x4045 0x4044 0x452b 0x41db 0x40ef 0x4073 0x4045 0x4042 0x44eb 0x41eb 0x40ef 0x4078 0x4047 0x4041 0x44e9 0x4200 0x40f2 0x407b 0x4048 0x4040 0x4515 0x421b 0x40f7 0x407d 0x404a 0x4040 0x4561 0x4239 0x40fe 0x407e 0x404b 0x4040 0x4627 0x4263 0x4106 0x407c 0x404d 0x4041 0x478b 0x428e 0x4111 0x407a 0x404e 0x4044 0x4914 0x42a4 0x411c 0x407a 0x4051 0x4046 0x4b24 0x42ad 0x4127 0x4081 0x4055 0x4049 0x4c74 0x42bc 0x4138 0x408c 0x405b 0x404d 0x4a3e 0x4407 0x419f 0x409e 0x4069 0x4059 0x4560 0x4626 0x4237 0x40b4 0x407d 0x4068 0x437a 0x4642 0x4251 0x40bd 0x4081 0x406c 0x4347 0x43a8 0x4203 0x40bf 0x407d 0x406b 0x432d 0x41b1 0x41aa 0x40c3 0x407b 0x406a 0x4320 0x41b5 0x416e 0x40ec 0x4091 0x407a 0x430d 0x41e2 0x413b 0x4129 0x40ba 0x4098 0x42ef 0x41ed 0x4117 0x412a 0x40c0 0x409d 0x42b4 0x41c5 0x40fa 0x40d1 0x4094 0x407d 0x4274 0x4198 0x40e3 0x4085 0x4066 0x405b 0x4249 0x4180 0x40d4 0x4078 0x4054 0x404d 0x4228 0x416e 0x40c8 0x4072 0x4049 0x4043 0x421f 0x416b 0x40c2 0x406f 0x4048 0x4042 0x4223 0x415f 0x40be 0x406b 0x4048 0x4042 0x422b 0x414f 0x40bb 0x4069 0x4049 0x4043 0x4231 0x4143 0x40ba 0x406b 0x404b 0x4045 0x423b 0x4137 0x40ba 0x406d 0x404e 0x4048 0x4246 0x4136 0x40b9 0x406e 0x4051 0x404c 0x4252 0x4142 0x40b4 0x4070 0x4057 0x4051 0x425e 0x4154 0x40b0 0x4072 0x405e 0x4058 0x426a 0x4167 0x40b4 0x4074 0x4068 0x4063 0x4276 0x417f 0x40bd 0x4076 0x4073 0x4070 0x4283 0x4198 0x40c4 0x4074 0x4075 0x4072 0x4290 0x41b2 0x40c9 0x4069 0x4064 0x4061 0x429c 0x41cd 0x40cd 0x405e 0x404f 0x404c 0x42a8 0x41ef 0x40d2 0x405b 0x4044 0x4043 0x42b5 0x421f 0x40d8 0x4059 0x403e 0x403f 0x42c7 0x4244 0x40dc 0x405a 0x403e 0x4040 0x42e1 0x4252 0x40e9 0x405d 0x4042 0x4045 0x4308 0x425c 0x40fd 0x4060 0x4047 0x404a 0x433b 0x4262 0x410c 0x4063 0x4048 0x404b 0x437e 0x4270 0x4118 0x4064 0x4046 0x4048 0x43d3 0x4287 0x4129 0x4061 0x403d 0x403b 0x442a 0x42c2 0x4147 0x406b 0x4041 0x403e 0x441b 0x42ef 0x4160 0x4075 0x4057 0x405a 0x441e 0x4307 0x4166 0x4084 0x4070 0x4078 0x43ed 0x432a 0x4193 0x40a2 0x4099 0x40a2 0x43d0 0x436e 0x41e6 0x40be 0x409c 0x4098 0x43e5 0x4383 0x41de 0x409e 0x406e 0x4064 0x43f6 0x4384 0x41d8 0x409e 0x4060 0x4059 0x4411 0x43a0 0x41fb 0x40bd 0x4070 0x4067 0x4463 0x43f1 0x4266 0x40fb 0x4090 0x4085 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118>; + }; + + qcom,pc-temp-y5-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2208 0x348a 0x3ab0 0x3545 0x4573 0x3634 0x2208 0x34aa 0x3839 0x3326 0x4393 0x3e82 0x269f 0x34e2 0x3660 0x31db 0x419b 0x43da 0x2f8b 0x3522 0x3519 0x3130 0x3fbf 0x46e0 0x3428 0x3557 0x345a 0x30f0 0x3e34 0x4838 0x3590 0x3572 0x341a 0x30e7 0x3d2f 0x4884 0x30ee 0x3576 0x34b3 0x32d3 0x3ca4 0x46c7 0x2869 0x3578 0x35a4 0x35e5 0x3c3f 0x4385 0x267f 0x34b6 0x35c2 0x3648 0x3b81 0x4119 0x2a54 0x3032 0x3545 0x34d0 0x3996 0x3e92 0x2ff6 0x2cf8 0x3494 0x33cf 0x387f 0x3ce5 0x37e1 0x2fd6 0x333d 0x3525 0x3964 0x3cfd 0x4112 0x360e 0x319c 0x3768 0x3acb 0x3dbd 0x4280 0x3a64 0x326c 0x37dc 0x3b0d 0x3dbf 0x373b 0x3dd4 0x395e 0x3745 0x3a7a 0x3cb2 0x2cf9 0x3f72 0x3eca 0x36d1 0x3a41 0x3bb0 0x2d03 0x3ec5 0x3f83 0x384b 0x3ae8 0x3b5d 0x2edc 0x3dc2 0x3fc3 0x3b9d 0x3c38 0x3b2b 0x2f8c 0x3d9a 0x3f92 0x3dc7 0x3e57 0x3b93 0x2f1e 0x3df3 0x3ecf 0x3f34 0x4225 0x3e9f 0x2e5c 0x3e54 0x3de6 0x3fc8 0x445b 0x4233 0x2d64 0x3c6d 0x3c08 0x3c17 0x4527 0x44e0 0x2c30 0x3697 0x3971 0x3578 0x4604 0x471b 0x2b6b 0x3248 0x38a0 0x33d2 0x4627 0x47ff 0x2b06 0x2f1a 0x38d8 0x353a 0x4512 0x484d 0x2ad4 0x2d6f 0x3925 0x3660 0x43d2 0x484f 0x2add 0x2d4c 0x3975 0x3678 0x4315 0x4790 0x2aec 0x2d55 0x39cc 0x366c 0x4294 0x45bc 0x2af3 0x2d44 0x3a34 0x38ed 0x427b 0x43ff 0x2b16 0x2d12 0x3b09 0x40ee 0x4270 0x426f 0x2b4e 0x2d07 0x3ba6 0x465a 0x4280 0x41aa 0x2b80 0x2d07 0x38cb 0x47e5 0x43ef 0x42bb 0x2ba9 0x2cec 0x3382 0x48db 0x472c 0x45f6 0x2bd0 0x2ce9 0x319e 0x48b8 0x4a98 0x495f 0x2bf8 0x2d41 0x31a4 0x45bb 0x4e8c 0x4c69 0x2c20 0x2daa 0x31b5 0x4185 0x51da 0x4ea9 0x2c45 0x2dd9 0x3221 0x3e14 0x52fb 0x508e 0x2c64 0x2d8a 0x34af 0x3aee 0x5257 0x524a 0x2c6c 0x2d32 0x3713 0x3918 0x50bc 0x5292 0x2c5a 0x2d52 0x36de 0x38bf 0x4e90 0x50e7 0x2c45 0x2d99 0x34f7 0x3913 0x4dbc 0x4f8f 0x2c53 0x2da9 0x354f 0x3906 0x4ea8 0x5136 0x2cb7 0x2d71 0x370b 0x3898 0x515e 0x56c7 0x2d6c 0x2d2c 0x33cd 0x3962 0x555b 0x5c52 0x2e6e 0x2cc8 0x325a 0x3610 0x4cc2 0x4ea4 0x2fc4 0x2d10 0x320a 0x3e49 0x4394 0x4373 0x30b0 0x2d1b 0x3431 0x3e08 0x42cc 0x40b6 0x322c 0x2e86 0x370e 0x4092 0x40be 0x3f21 0x3256 0x3099 0x3915 0x3fe1 0x3e27 0x3e5b 0x322c 0x3127 0x38b1 0x3e5f 0x428d 0x410e 0x3117 0x3039 0x38e1 0x4283 0x4414 0x4431 0x2f77 0x2f18 0x37f8 0x4528 0x4741 0x4a06 0x2e6f 0x2e5e 0x37ca 0x4396 0x477b 0x4ab1 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b>; + }; + + qcom,pc-temp-y6-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1af4 0x1607 0x1492 0x13c9 0x139d 0x1392 0x1afb 0x160e 0x148d 0x13c8 0x139d 0x1393 0x1aff 0x1616 0x148a 0x13c7 0x139d 0x1394 0x1aff 0x161e 0x148a 0x13c8 0x139d 0x1395 0x1afc 0x1626 0x148c 0x13c9 0x139e 0x1395 0x1af7 0x162e 0x148e 0x13ca 0x139f 0x1396 0x1ac7 0x1636 0x1494 0x13cc 0x139f 0x1397 0x1a78 0x163e 0x149c 0x13cf 0x13a1 0x1397 0x1a74 0x1646 0x14a1 0x13d2 0x13a2 0x1398 0x1aff 0x164c 0x14a3 0x13d4 0x13a3 0x1399 0x1b70 0x1657 0x14a8 0x13d7 0x13a5 0x139a 0x1af4 0x16ac 0x14cc 0x13e2 0x13ac 0x139f 0x19d3 0x172c 0x1503 0x13ef 0x13b5 0x13a6 0x1941 0x172c 0x150b 0x13f2 0x13b7 0x13a8 0x190e 0x1670 0x14e5 0x13f1 0x13b5 0x13a7 0x18f6 0x15e2 0x14be 0x13f0 0x13b3 0x13a7 0x18fb 0x15e4 0x14ab 0x13fd 0x13bb 0x13ac 0x1909 0x15f5 0x149c 0x1412 0x13c9 0x13b5 0x190d 0x15f9 0x148f 0x1412 0x13cb 0x13b7 0x190c 0x15ed 0x1483 0x13f3 0x13bb 0x13ab 0x190a 0x15e0 0x147a 0x13d6 0x13ab 0x139f 0x190d 0x15d6 0x1473 0x13cd 0x13a4 0x139a 0x191a 0x15ce 0x146e 0x13c8 0x13a1 0x1397 0x192c 0x15c9 0x146d 0x13c7 0x13a0 0x1397 0x1945 0x15c7 0x146e 0x13c7 0x13a0 0x1397 0x1964 0x15c6 0x146f 0x13c8 0x13a0 0x1398 0x1982 0x15cb 0x1470 0x13c9 0x13a1 0x1398 0x19a0 0x15d5 0x1473 0x13ca 0x13a2 0x1399 0x19c0 0x15e2 0x1475 0x13cc 0x13a3 0x139a 0x19e6 0x15f3 0x1476 0x13d0 0x13a5 0x139c 0x1a11 0x1607 0x1477 0x13d4 0x13a7 0x139e 0x1a3f 0x161d 0x1478 0x13d6 0x13ab 0x13a2 0x1a72 0x1638 0x1479 0x13d7 0x13af 0x13a6 0x1aa7 0x1655 0x147b 0x13d6 0x13b0 0x13a7 0x1ae0 0x1676 0x147f 0x13d2 0x13ab 0x13a2 0x1b1c 0x169b 0x1483 0x13ce 0x13a5 0x139c 0x1b59 0x16c6 0x1488 0x13cc 0x13a2 0x139a 0x1b96 0x16f8 0x1490 0x13cb 0x13a0 0x1398 0x1bd4 0x1732 0x149a 0x13ca 0x13a0 0x1399 0x1c13 0x1772 0x14a5 0x13cb 0x13a1 0x139a 0x1c51 0x17bc 0x14b0 0x13cd 0x13a3 0x139c 0x1c90 0x1811 0x14bf 0x13ce 0x13a4 0x139d 0x1cd3 0x1875 0x14d0 0x13cf 0x13a3 0x139c 0x1d22 0x18ef 0x14e0 0x13d0 0x13a1 0x1399 0x1d80 0x1984 0x14f9 0x13d2 0x13a3 0x139a 0x1da5 0x19b9 0x150c 0x13db 0x13a9 0x13a3 0x1dcf 0x19c4 0x1513 0x13e1 0x13b2 0x13ad 0x1dde 0x19e7 0x152f 0x13ec 0x13bf 0x13bb 0x1e04 0x1a57 0x155a 0x13f6 0x13c0 0x13b8 0x1e6d 0x1abf 0x1560 0x13eb 0x13b2 0x13a7 0x1edf 0x1b41 0x1573 0x13ee 0x13ae 0x13a5 0x1f66 0x1c0d 0x15ab 0x13fd 0x13b6 0x13ac 0x2034 0x1cdf 0x160e 0x1415 0x13c2 0x13b7 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4>; + }; + }; + }; + }; + }; + + fragment@12 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm1 { + reg = <0x4f>; + label = "pa_therm1"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@13 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x4d 0xffffffff 0x4e 0xffffffff 0x4f 0xffffffff 0x52>; + + pa_therm1 { + reg = <0x4f>; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + }; + }; + }; + + fragment@14 { + target = <0xffffffff>; + + __overlay__ { + compatible = "qcom,ufs-phy-qmp-v3"; + vdda-phy-supply = <0xffffffff>; + vdda-pll-supply = <0xffffffff>; + vdda-phy-max-microamp = <0xf5b4>; + vdda-pll-max-microamp = <0x477c>; + status = "ok"; + }; + }; + + fragment@15 { + target = <0xffffffff>; + + __overlay__ { + vdd-hba-supply = <0xffffffff>; + vdd-hba-fixed-regulator; + vcc-supply = <0xffffffff>; + vcc-voltage-level = <0x2d2a80 0x2d2a80>; + vcc-max-microamp = <0x927c0>; + vccq2-supply = <0xffffffff>; + vccq2-voltage-level = <0x1ab3f0 0x1dc130>; + vccq2-max-microamp = <0x927c0>; + qcom,vddp-ref-clk-supply = <0xffffffff>; + qcom,vddp-ref-clk-max-microamp = <0x64>; + status = "ok"; + }; + }; + + fragment@16 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0x8b290>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <0x1b7740 0x1b7740>; + qcom,vdd-io-current-level = <0x0 0x4f588>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + status = "ok"; + }; + }; + + fragment@17 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0xc3500>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-voltage-level = <0x1b7740 0x2d0370>; + qcom,vdd-io-current-level = <0x0 0x55f0>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + cd-gpios = <0xffffffff 0x45 0x1>; + status = "ok"; + }; + }; + + fragment@18 { + target = <0xffffffff>; + + __overlay__ { + + pa-therm1 { + polling-delay-passive = <0x0>; + polling-delay = <0x0>; + thermal-governor = "user_space"; + thermal-sensors = <0xffffffff 0x4f>; + wake-capable-sensor; + + trips { + + active-config0 { + temperature = <0x1e848>; + hysteresis = <0x3e8>; + type = "passive"; + }; + }; + }; + + quiet-therm-step { + status = "disabled"; + }; + }; + }; + + fragment@19 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@20 { + target = <0xffffffff>; + + __overlay__ { + qcom,battery-data = <0x13>; + qcom,qg-iterm-ma = <0x64>; + qcom,hold-soc-while-full; + qcom,linearize-soc; + qcom,cl-feedback-on; + }; + }; + + fragment@21 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x8 0xffffffff 0x7 0xffffffff 0x9 0xffffffff 0x6 0xffffffff 0x4f 0xffffffff 0x99 0xffffffff 0x83>; + io-channel-names = "usb_in_voltage", "usb_in_current", "chg_temp", "die_temp", "conn_temp", "sbux_res", "vph_voltage"; + qcom,battery-data = <0x13>; + qcom,auto-recharge-soc = <0x62>; + qcom,step-charging-enable; + qcom,sw-jeita-enable; + qcom,fcc-stepping-enable; + qcom,suspend-input-on-debug-batt; + qcom,sec-charger-config = <0x3>; + qcom,thermal-mitigation = <0x401640 0x3567e0 0x2dc6c0 0x2625a0 0x1e8480 0x16e360 0xf4240 0x7a120>; + dpdm-supply = <0xffffffff>; + qcom,charger-temp-max = <0x320>; + qcom,smb-temp-max = <0x320>; + qcom,fcc-step-delay-ms = <0x64>; + qcom,fcc-step-size-ua = <0x186a0>; + qcom,disable-sw-thermal-regulation; + qcom,disable-fcc-restriction; + qcom,smb-internal-pull-kohm = <0x0>; + }; + }; + + fragment@22 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + }; + }; + }; + + fragment@23 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@24 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,i2c-touch-active = "synaptics,tcm-i2c"; + + synaptics_tcm@20 { + compatible = "synaptics,tcm-i2c"; + reg = <0x20>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend", "pmx_ts_release"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + pinctrl-2 = <0xffffffff>; + vdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + synaptics,pwr-reg-name = "avdd"; + synaptics,bus-reg-name = "vdd"; + synaptics,irq-gpio = <0xffffffff 0x9 0x2008>; + synaptics,irq-on-state = <0x0>; + synaptics,reset-gpio = <0xffffffff 0x8 0x0>; + synaptics,reset-on-state = <0x0>; + synaptics,reset-active-ms = <0x14>; + synaptics,reset-delay-ms = <0xc8>; + synaptics,power-delay-ms = <0xc8>; + synaptics,ubl-i2c-addr = <0x20>; + }; + + atmel_mxt_ts@4a { + compatible = "atmel,maxtouch"; + reg = <0x4a>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + avdd-supply = <0xffffffff>; + vdd-supply = <0xffffffff>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + reset-gpios = <0xffffffff 0x8 0x0>; + irq-gpios = <0xffffffff 0x9 0x2008>; + atmel,xy_switch; + atmel,panel-coords = <0x0 0x0 0x1df 0x31f>; + atmel,display-coords = <0x0 0x0 0x153 0x301>; + }; + }; + }; + + fragment@25 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,clk-freq-out = <0xf4240>; + #address-cells = <0x1>; + #size-cells = <0x0>; + + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <0xffffffff 0x25 0x0>; + qcom,nq-ven = <0xffffffff 0xc 0x0>; + qcom,nq-firm = <0xffffffff 0x24 0x0>; + qcom,nq-clkreq = <0xffffffff 0x1f 0x0>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff>; + }; + }; + }; + + fragment@26 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-aux-switch = <0xffffffff>; + }; + }; + + fragment@27 { + target = <0xffffffff>; + + __overlay__ { + + lpi_pinctrl@627C0000 { + compatible = "qcom,lpi-pinctrl"; + reg = <0x627c0000 0x0>; + qcom,num-gpios = <0xf>; + gpio-controller; + #gpio-cells = <0x2>; + qcom,slew-reg = <0x6295a000 0x0>; + qcom,lpi-offset-tbl = <0x0 0x1000 0x2000 0x3000 0x4000 0x5000 0x6000 0x7000 0x8000 0x9000 0xa000 0xb000 0xc000 0xd000 0xe000>; + qcom,lpi-slew-offset-tbl = <0x0 0x2 0x4 0x8 0xa 0xc 0x0 0x0 0x0 0x0 0x10 0x12 0x0 0x0 0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + phandle = <0x31>; + + dmic01_clk_active { + phandle = <0x32>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic01_clk_sleep { + phandle = <0x34>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic01_data_active { + phandle = <0x33>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic01_data_sleep { + phandle = <0x35>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic23_clk_active { + phandle = <0x36>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic23_clk_sleep { + phandle = <0x38>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic23_data_active { + phandle = <0x37>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic23_data_sleep { + phandle = <0x39>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic45_clk_active { + phandle = <0x3a>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic45_clk_sleep { + phandle = <0x3c>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic45_data_active { + phandle = <0x3b>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic45_data_sleep { + phandle = <0x3d>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + tx_swr_clk_sleep { + phandle = <0x4a>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_clk_active { + phandle = <0x46>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + tx_swr_data0_sleep { + phandle = <0x4b>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data0_active { + phandle = <0x47>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_sleep { + phandle = <0x40>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_active { + phandle = <0x3e>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_data_sleep { + phandle = <0x41>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_data_active { + phandle = <0x3f>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data1_sleep { + phandle = <0x4c>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data1_active { + phandle = <0x48>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data2_sleep { + phandle = <0x4d>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data2_active { + phandle = <0x49>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + rx_swr_clk_sleep { + phandle = <0x44>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_clk_active { + phandle = <0x42>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + rx_swr_data_sleep { + phandle = <0x45>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_data_active { + phandle = <0x43>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + lpi_i2s1_sck_active { + phandle = <0x55>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sck_sleep { + phandle = <0x59>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_ws_active { + phandle = <0x56>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_ws_sleep { + phandle = <0x5a>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd0_active { + phandle = <0x57>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd0_sleep { + phandle = <0x5b>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd1_active { + phandle = <0x58>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd1_sleep { + phandle = <0x5c>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + }; + + fragment@28 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x4>; + + bolero-clk-rsc-mngr { + compatible = "qcom,bolero-clk-rsc-mngr"; + qcom,fs-gen-sequence = <0x3000 0x1 0x3004 0x1 0x3080 0x2>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,va_mclk_mode_muxsel = <0x627a0000>; + clock-names = "tx_core_clk", "tx_npl_clk", "rx_core_clk", "rx_npl_clk", "wsa_core_clk", "wsa_npl_clk", "va_core_clk", "va_npl_clk"; + clocks = <0x14 0x0 0x15 0x0 0x16 0x0 0x17 0x0 0x18 0x0 0x19 0x0 0x1a 0x0 0x1b 0x0>; + }; + + tx-macro@62620000 { + compatible = "qcom,tx-macro"; + reg = <0x62620000 0x0>; + clock-names = "tx_core_clk", "tx_npl_clk"; + clocks = <0x14 0x0 0x15 0x0>; + qcom,tx-swr-gpios = <0x1c>; + qcom,tx-dmic-sample-rate = <0x249f00>; + phandle = <0xb2>; + + tx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x3>; + swrm-io-base = <0x62630000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x1>; + interrupts = <0x0 0x128 0x0 0x0 0x22b 0x0>; + interrupt-names = "swr_master_irq", "swr_wake_irq"; + qcom,swr-wakeup-required = <0x0>; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x21 0xf 0x2 0x12 0x1 0x2 0x13 0x2 0x3 0x14 0x1 0x3 0x15 0x2 0x4 0x16 0x1 0x4 0x17 0x2 0x4 0x18 0x4 0x4 0x19 0x8 0x5 0x1a 0x1 0x5 0x1b 0x2 0x5 0x1c 0x4 0x5 0x1d 0x8>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + qcom,swr-mstr-irq-wakeup-capable = <0x1>; + phandle = <0xb3>; + + wcd938x-tx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170223>; + phandle = <0x23>; + }; + + wcd937x-tx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170223>; + phandle = <0x27>; + }; + }; + }; + + rx-macro@62600000 { + compatible = "qcom,rx-macro"; + reg = <0x62600000 0x0>; + clock-names = "rx_core_clk", "rx_npl_clk"; + clocks = <0x16 0x0 0x17 0x0>; + qcom,rx-swr-gpios = <0x1d>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,rx-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + phandle = <0xb4>; + + rx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x2>; + swrm-io-base = <0x62610000 0x0>; + interrupts = <0x0 0x129 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x9 0x1 0x1 0xa 0x2 0x2 0xd 0x1 0x3 0xb 0x1 0x3 0xc 0x2 0x4 0xe 0x1 0x5 0xf 0x1 0x5 0x10 0x2>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + phandle = <0xb5>; + + wcd938x-rx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170224>; + phandle = <0x22>; + }; + + wcd937x-rx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170224>; + phandle = <0x26>; + }; + }; + }; + + wsa-macro@62640000 { + compatible = "qcom,wsa-macro"; + reg = <0x62640000 0x0>; + clock-names = "wsa_core_clk", "wsa_npl_clk"; + clocks = <0x18 0x0 0x19 0x0>; + qcom,wsa-swr-gpios = <0x1e>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,wsa-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + status = "disabled"; + phandle = <0xb6>; + + wsa_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + qcom,swr_master_id = <0x1>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + swrm-io-base = <0x62650000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x0>; + interrupts = <0x0 0x127 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x8>; + qcom,swr-port-mapping = <0x1 0x1 0x1 0x2 0x3 0xf 0x3 0x2 0x3 0x4 0x5 0x1 0x5 0x7 0xf 0x6 0x6 0x3 0x7 0x4 0x3 0x8 0x8 0x3>; + qcom,swr-num-dev = <0x2>; + phandle = <0xb7>; + + wsa881x@20170211 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170211>; + qcom,spkr-sd-n-node = <0x1f>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2c>; + }; + + wsa881x@20170212 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170212>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2d>; + }; + + wsa881x@21170213 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170213>; + qcom,spkr-sd-n-node = <0x1f>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2e>; + }; + + wsa881x@21170214 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170214>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2f>; + }; + }; + }; + + va-macro@62770000 { + compatible = "qcom,va-macro"; + reg = <0x62770000 0x0>; + clock-names = "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0>; + qcom,va-clk-mux-select = <0x1>; + qcom,va-island-mode-muxsel = <0x627a0000>; + qcom,va-dmic-sample-rate = <0x927c0>; + qcom,default-clk-id = <0x0>; + phandle = <0xb8>; + }; + + wcd938x-codec { + compatible = "qcom,wcd938x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x0 0x13 0x2 0x0 0x13 0x1 0x14 0x1 0x0 0x14 0x1 0x15 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x2 0x18 0x4 0x0 0x18 0x2 0x19 0x8 0x0 0x19 0x3 0x1a 0x1 0x0 0x1a 0x3 0x1b 0x2 0x0 0x1b 0x3 0x1c 0x4 0x0 0x1c 0x3 0x1d 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x21>; + qcom,rx-slave = <0x22>; + qcom,tx-slave = <0x23>; + cdc-vdd-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-rxtx-current = <0x7530>; + cdc-vddio-supply = <0xffffffff>; + qcom,cdc-vddio-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddio-current = <0x7530>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0xaf0>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-micbias4-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-rxtx", "cdc-vddio", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + mbhc-button-thres = <0x24 0xd 0x3f 0x24 0x58 0x8a 0x24 0x8a 0x8a 0x24 0xe1 0xe1 0x24 0x1c2 0x1c2 0x24 0x1c2 0x26c 0x24 0x1c2 0x26c 0x24 0x1c2 0x26c>; + imp-table = <0x25 0x0 0x5 0x6 0x25 0x6 0x17 0x8 0x25 0x18 0x26 0x7 0x25 0x27 0x64 0x6 0x25 0x65 0xa0 0xa 0x25 0xa1 0x190 0xb 0x25 0x191 0x7d0 0xb 0x25 0x7d1 0x7fffffff 0x6>; + phandle = <0x30>; + }; + + wcd937x-codec { + status = "disabled"; + compatible = "qcom,wcd937x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x1 0x13 0x1 0x0 0x14 0x1 0x14 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x3 0x18 0x1 0x0 0x1a 0x3 0x19 0x2 0x0 0x1b 0x3 0x1a 0x4 0x0 0x1c 0x3 0x1b 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x21>; + qcom,rx-slave = <0x26>; + qcom,tx-slave = <0x27>; + cdc-vdd-ldo-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-ldo-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-ldo-rxtx-current = <0x61a8>; + cdc-vddpx-1-supply = <0xffffffff>; + qcom,cdc-vddpx-1-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddpx-1-current = <0x2710>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0x708>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-ldo-rxtx", "cdc-vddpx-1", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + phandle = <0xb9>; + }; + }; + }; + + fragment@29 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,msm-mi2s-master = <0x1 0x1 0x1 0x1 0x1 0x1>; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS4", "MIC BIAS4", "Analog Mic4", "TX DMIC0", "MIC BIAS1", "MIC BIAS1", "Digital Mic0", "TX DMIC1", "MIC BIAS1", "MIC BIAS1", "Digital Mic1", "TX DMIC2", "MIC BIAS3", "MIC BIAS3", "Digital Mic2", "TX DMIC3", "MIC BIAS3", "MIC BIAS3", "Digital Mic3", "TX DMIC4", "MIC BIAS4", "MIC BIAS4", "Digital Mic4", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "IN3_AUX", "AUX_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "TX SWR_DMIC0", "DMIC1_OUTPUT", "TX SWR_DMIC1", "DMIC2_OUTPUT", "TX SWR_DMIC2", "DMIC3_OUTPUT", "TX SWR_DMIC3", "DMIC4_OUTPUT", "TX SWR_DMIC4", "DMIC5_OUTPUT", "TX SWR_DMIC5", "DMIC6_OUTPUT", "TX SWR_DMIC6", "DMIC7_OUTPUT", "TX SWR_DMIC7", "DMIC8_OUTPUT", "WSA SRC0_INP", "SRC0", "WSA_TX DEC0_INP", "TX DEC0 MUX", "WSA_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "SpkrLeft IN", "WSA_SPK1 OUT", "SpkrRight IN", "WSA_SPK2 OUT", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA MIC BIAS1", "Digital Mic0", "VA MIC BIAS1", "Digital Mic1", "VA MIC BIAS3", "Digital Mic2", "VA MIC BIAS3", "Digital Mic3", "VA MIC BIAS4", "Digital Mic4", "VA DMIC0", "VA MIC BIAS1", "VA DMIC1", "VA MIC BIAS1", "VA DMIC2", "VA MIC BIAS3", "VA DMIC3", "VA MIC BIAS3", "VA DMIC4", "VA MIC BIAS4", "VA SWR_ADC0", "VA_SWR_CLK", "VA SWR_ADC1", "VA_SWR_CLK", "VA SWR_ADC2", "VA_SWR_CLK", "VA SWR_ADC3", "VA_SWR_CLK", "VA SWR_MIC0", "VA_SWR_CLK", "VA SWR_MIC1", "VA_SWR_CLK", "VA SWR_MIC2", "VA_SWR_CLK", "VA SWR_MIC3", "VA_SWR_CLK", "VA SWR_MIC4", "VA_SWR_CLK", "VA SWR_MIC5", "VA_SWR_CLK", "VA SWR_MIC6", "VA_SWR_CLK", "VA SWR_MIC7", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT", "VA SWR_MIC0", "DMIC1_OUTPUT", "VA SWR_MIC1", "DMIC2_OUTPUT", "VA SWR_MIC2", "DMIC3_OUTPUT", "VA SWR_MIC3", "DMIC4_OUTPUT", "VA SWR_MIC4", "DMIC5_OUTPUT", "VA SWR_MIC5", "DMIC6_OUTPUT", "VA SWR_MIC6", "DMIC7_OUTPUT", "VA SWR_MIC7", "DMIC8_OUTPUT"; + qcom,msm-mbhc-hphl-swh = <0x1>; + qcom,msm-mbhc-gnd-swh = <0x1>; + qcom,cdc-dmic01-gpios = <0x28>; + qcom,cdc-dmic23-gpios = <0x29>; + qcom,cdc-dmic45-gpios = <0x2a>; + asoc-codec = <0xffffffff 0xffffffff 0x2b>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec", "msm-ext-disp-audio-codec-rx"; + qcom,wsa-max-devs = <0x2>; + qcom,wsa-devs = <0x2c 0x2d 0x2e 0x2f>; + qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight", "SpkrLeft", "SpkrRight"; + qcom,codec-max-aux-devs = <0x1>; + qcom,codec-aux-devs = <0x30>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x31 0xffffffff>; + }; + }; + + fragment@30 { + target = <0xffffffff>; + + __overlay__ { + + cdc_dmic01_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x32 0x33>; + pinctrl-1 = <0x34 0x35>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x28>; + }; + + cdc_dmic23_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x36 0x37>; + pinctrl-1 = <0x38 0x39>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x29>; + }; + + cdc_dmic45_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3a 0x3b>; + pinctrl-1 = <0x3c 0x3d>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2a>; + }; + + wsa_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3e 0x3f>; + pinctrl-1 = <0x40 0x41>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x1e>; + }; + + rx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x42 0x43>; + pinctrl-1 = <0x44 0x45>; + qcom,lpi-gpios; + phandle = <0x1d>; + }; + + tx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x46 0x47 0x48 0x49>; + pinctrl-1 = <0x4a 0x4b 0x4c 0x4d>; + qcom,lpi-gpios; + qcom,chip-wakeup-reg = <0x1ffb000>; + qcom,chip-wakeup-maskbit = <0x0>; + qcom,chip-wakeup-default-val = <0x1>; + phandle = <0x1c>; + }; + }; + }; + + fragment@31 { + target = <0xffffffff>; + + __overlay__ { + + wsa_spkr_en1_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x1f>; + }; + + wsa_spkr_en2_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x20>; + }; + + msm_cdc_pinctrl@58 { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + phandle = <0x21>; + }; + + wsa_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x3>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x309>; + #clock-cells = <0x1>; + phandle = <0x18>; + }; + + wsa_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x4>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30a>; + #clock-cells = <0x1>; + phandle = <0x19>; + }; + + rx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x5>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30e>; + #clock-cells = <0x1>; + phandle = <0x16>; + }; + + rx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x6>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30f>; + #clock-cells = <0x1>; + phandle = <0x17>; + }; + + tx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x7>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30c>; + #clock-cells = <0x1>; + phandle = <0x14>; + }; + + tx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x8>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30d>; + #clock-cells = <0x1>; + phandle = <0x15>; + }; + + va_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x2>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30b>; + #clock-cells = <0x1>; + phandle = <0x1a>; + }; + + va_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0xa>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x310>; + #clock-cells = <0x1>; + phandle = <0x1b>; + }; + }; + }; + + fragment@32 { + target = <0xffffffff>; + + __overlay__ { + qcom,msm-dai-is-island-supported = <0x1>; + }; + }; + + fragment@33 { + target = <0xffffffff>; + + __overlay__ { + hsuart8 = "/soc/qcom,qup_hsuart@a88000"; + }; + }; + + fragment@34 { + target = <0xffffffff>; + + __overlay__ { + + qcom,qup_hsuart@a88000 { + compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; + reg = <0xa88000 0x4000>; + reg-names = "se_phys"; + clock-names = "se-clk", "m-ahb", "s-ahb"; + clocks = <0xffffffff 0x50 0xffffffff 0x5a 0xffffffff 0x5b>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4e 0x4f>; + pinctrl-1 = <0x50 0x51>; + interrupts = <0x0 0x163 0x0>; + qcom,wrapper-core = <0xffffffff>; + always-on-clock; + status = "ok"; + phandle = <0xba>; + }; + }; + }; + + fragment@35 { + target = <0xffffffff>; + + __overlay__ { + + qupv3_se8_2hsuart_pins { + phandle = <0xbb>; + + qupv3_se8_2uart_tx_active { + phandle = <0x4e>; + + mux { + pins = "gpio44"; + function = "qup12"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_rx_active { + phandle = <0x4f>; + + mux { + pins = "gpio45"; + function = "qup12"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_tx_sleep { + phandle = <0x50>; + + mux { + pins = "gpio44"; + function = "gpio"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + input-enable; + }; + }; + + qupv3_se8_2uart_rx_sleep { + phandle = <0x51>; + + mux { + pins = "gpio45"; + function = "gpio"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@36 { + target = <0xffffffff>; + + __overlay__ { + + dcc_curr_link@3 { + qcom,curr-link-list = <0x3>; + qcom,data-sink = "sram"; + qcom,link-list = <0x0 0x18000024 0x1 0x0 0x0 0x18000040 0x1 0x0 0x0 0x18010024 0x1 0x0 0x0 0x18010040 0x1 0x0 0x0 0x18020024 0x1 0x0 0x0 0x18020040 0x1 0x0 0x0 0x18030024 0x1 0x0 0x0 0x18030040 0x1 0x0 0x0 0x18040024 0x1 0x0 0x0 0x18040040 0x1 0x0 0x0 0x18050024 0x1 0x0 0x0 0x18050040 0x1 0x0 0x0 0x18060024 0x1 0x0 0x0 0x18060040 0x1 0x0 0x0 0x18070024 0x1 0x0 0x0 0x18070040 0x1 0x0 0x0 0x18080024 0x1 0x0 0x0 0x18080040 0x1 0x0 0x0 0x180800f8 0x1 0x0 0x0 0x18080104 0x1 0x0 0x0 0x1808011c 0x1 0x0 0x0 0x18080128 0x1 0x0 0x0 0x18321700 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18325f00 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x18321818 0x1 0x0 0x0 0x18323818 0x1 0x0 0x0 0x18326018 0x1 0x0 0x0 0x18321920 0x1 0x0 0x0 0x1832102c 0x1 0x0 0x0 0x18321044 0x1 0x0 0x0 0x18321710 0x1 0x0 0x0 0x1832176c 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18323920 0x1 0x0 0x0 0x1832302c 0x1 0x0 0x0 0x18323044 0x1 0x0 0x0 0x18323710 0x1 0x0 0x0 0x1832376c 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18326120 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18325844 0x1 0x0 0x0 0x18325f10 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280000 0x2 0x0 0x0 0x18282000 0x2 0x0 0x0 0x18284000 0x2 0x0 0x0 0x9680000 0x1 0x0 0x0 0x9680004 0x1 0x0 0x2 0x8 0x0 0x0 0x0 0x9681000 0x1 0x0 0x2 0x1 0x0 0x0 0x0 0x9681004 0x1 0x0 0x0 0x9681008 0x1 0x0 0x0 0x968100c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9698500 0x1 0x0 0x0 0x9698504 0x1 0x0 0x0 0x9698508 0x1 0x0 0x0 0x969850c 0x1 0x0 0x0 0x9698510 0x1 0x0 0x0 0x9698514 0x1 0x0 0x0 0x9698518 0x1 0x0 0x0 0x969851c 0x1 0x0 0x0 0x9698700 0x1 0x0 0x0 0x9698704 0x1 0x0 0x0 0x9698708 0x1 0x0 0x0 0x969870c 0x1 0x0 0x0 0x9698714 0x1 0x0 0x0 0x9698718 0x1 0x0 0x0 0x969871c 0x1 0x0 0x0 0x1620204 0x1 0x0 0x0 0x1620240 0x1 0x0 0x0 0x1620248 0x1 0x0 0x0 0x1620288 0x1 0x0 0x0 0x162028c 0x1 0x0 0x0 0x1620290 0x1 0x0 0x0 0x1620294 0x1 0x0 0x0 0x16202a8 0x1 0x0 0x0 0x16202ac 0x1 0x0 0x0 0x16202b0 0x1 0x0 0x0 0x16202b4 0x1 0x0 0x0 0x1620300 0x1 0x0 0x0 0x16e0404 0x1 0x0 0x0 0x16e0408 0x1 0x0 0x0 0x16e0410 0x1 0x0 0x0 0x16e0420 0x1 0x0 0x0 0x16e0424 0x1 0x0 0x0 0x16e0428 0x1 0x0 0x0 0x16e042c 0x1 0x0 0x0 0x16e0430 0x1 0x0 0x0 0x16e0434 0x1 0x0 0x0 0x16e0438 0x1 0x0 0x0 0x16e043c 0x1 0x0 0x0 0x16e0300 0x1 0x0 0x0 0x16e0304 0x1 0x0 0x0 0x16e0700 0x1 0x0 0x0 0x16e0704 0x1 0x0 0x0 0x1700c00 0x1 0x0 0x0 0x1700c08 0x1 0x0 0x0 0x1700c10 0x1 0x0 0x0 0x1700c20 0x1 0x0 0x0 0x1700c24 0x1 0x0 0x0 0x1700c28 0x1 0x0 0x0 0x1700c2c 0x1 0x0 0x0 0x1700c30 0x1 0x0 0x0 0x1700c34 0x1 0x0 0x0 0x1700c38 0x1 0x0 0x0 0x1700c3c 0x1 0x0 0x0 0x1700300 0x1 0x0 0x0 0x1700304 0x1 0x0 0x0 0x1700308 0x1 0x0 0x0 0x170030c 0x1 0x0 0x0 0x1700310 0x1 0x0 0x0 0x1700500 0x1 0x0 0x0 0x1700504 0x1 0x0 0x0 0x1700508 0x1 0x0 0x0 0x170050c 0x1 0x0 0x0 0x1700900 0x1 0x0 0x0 0x1700904 0x1 0x0 0x0 0x1700908 0x1 0x0 0x0 0x1740004 0x1 0x0 0x0 0x1740008 0x1 0x0 0x0 0x1740010 0x1 0x0 0x0 0x1740020 0x1 0x0 0x0 0x1740024 0x1 0x0 0x0 0x1740028 0x1 0x0 0x0 0x174002c 0x1 0x0 0x0 0x1740030 0x1 0x0 0x0 0x1740034 0x1 0x0 0x0 0x1740038 0x1 0x0 0x0 0x174003c 0x1 0x0 0x0 0x1740300 0x1 0x0 0x0 0x1740304 0x1 0x0 0x0 0x1740308 0x1 0x0 0x0 0x174030c 0x1 0x0 0x0 0x1740310 0x1 0x0 0x0 0x1740314 0x1 0x0 0x0 0x9698204 0x1 0x0 0x0 0x9698240 0x1 0x0 0x0 0x9698244 0x1 0x0 0x0 0x9698248 0x1 0x0 0x0 0x969824c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x9681018 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9160204 0x1 0x0 0x0 0x9160240 0x1 0x0 0x0 0x9160248 0x1 0x0 0x0 0x9160288 0x1 0x0 0x0 0x9160290 0x1 0x0 0x0 0x9160300 0x1 0x0 0x0 0x9160304 0x1 0x0 0x0 0x9160308 0x1 0x0 0x0 0x916030c 0x1 0x0 0x0 0x9160310 0x1 0x0 0x0 0x9160314 0x1 0x0 0x0 0x9160318 0x1 0x0 0x0 0x9160008 0x1 0x0 0x0 0x9160010 0x1 0x0 0x0 0x9160020 0x1 0x0 0x0 0x9160024 0x1 0x0 0x0 0x9160028 0x1 0x0 0x0 0x916002c 0x1 0x0 0x0 0x9160030 0x1 0x0 0x0 0x9160034 0x1 0x0 0x0 0x9160038 0x1 0x0 0x0 0x916003c 0x1 0x0 0x0 0x63042680 0x1 0x0 0x0 0x63042684 0x1 0x0 0x0 0x63042688 0x1 0x0 0x0 0x63042690 0x1 0x0 0x0 0x630426a0 0x1 0x0 0x0 0x630426a4 0x1 0x0 0x0 0x630426a8 0x1 0x0 0x0 0x630426ac 0x1 0x0 0x0 0x630426b0 0x1 0x0 0x0 0x630426b4 0x1 0x0 0x0 0x630426b8 0x1 0x0 0x0 0x630426bc 0x1 0x0 0x0 0x63041900 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x1620500 0x4 0x0 0x0 0x1620700 0x4 0x0 0x0 0x1620300 0x1 0x0 0x0 0x1620f00 0x2 0x0 0x0 0x1620b00 0x2 0x0 0x0 0x1700b00 0x2 0x0 0x0 0x1700700 0x3 0x0 0x0 0x9163100 0x1 0x0 0x0 0x96aa100 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x9991500 0x8 0x0 0x0 0x9050008 0x1 0x0 0x0 0x9050078 0x1 0x0 0x0 0x9236028 0x1 0x0 0x0 0x923602c 0x1 0x0 0x0 0x9236030 0x1 0x0 0x0 0x9236034 0x1 0x0 0x0 0x9236038 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x92360b0 0x1 0x0 0x0 0x9236044 0x1 0x0 0x0 0x9236048 0x1 0x0 0x0 0x923604c 0x1 0x0 0x0 0x9236050 0x1 0x0 0x0 0x923e030 0x1 0x0 0x0 0x923e034 0x1 0x0 0x0 0x9241000 0x1 0x0 0x0 0x9248058 0x1 0x0 0x0 0x924805c 0x1 0x0 0x0 0x9248060 0x1 0x0 0x0 0x9248064 0x1 0x0 0x0 0x9260410 0x1 0x0 0x0 0x92e0410 0x1 0x0 0x0 0x9260414 0x1 0x0 0x0 0x92e0414 0x1 0x0 0x0 0x9260418 0x1 0x0 0x0 0x92e0418 0x1 0x0 0x0 0x9260420 0x1 0x0 0x0 0x9260424 0x1 0x0 0x0 0x9260430 0x1 0x0 0x0 0x9260440 0x1 0x0 0x0 0x9260448 0x1 0x0 0x0 0x92604a0 0x1 0x0 0x0 0x92604b0 0x1 0x0 0x0 0x92604d0 0x2 0x0 0x0 0x9261440 0x1 0x0 0x0 0x92e0420 0x1 0x0 0x0 0x92e0424 0x1 0x0 0x0 0x92e0430 0x1 0x0 0x0 0x92e0440 0x1 0x0 0x0 0x92e0448 0x1 0x0 0x0 0x92e04a0 0x1 0x0 0x0 0x92e04b0 0x1 0x0 0x0 0x92e04d0 0x2 0x0 0x0 0x9600000 0x1 0x0 0x0 0x9601000 0x1 0x0 0x0 0x9602000 0x1 0x0 0x0 0x9603000 0x1 0x0 0x0 0x9604000 0x1 0x0 0x0 0x9605000 0x1 0x0 0x0 0x9606000 0x1 0x0 0x0 0x9607000 0x1 0x0 0x0 0x9608000 0x1 0x0 0x0 0x9609000 0x1 0x0 0x0 0x960a000 0x1 0x0 0x0 0x960b000 0x1 0x0 0x0 0x960c000 0x1 0x0 0x0 0x960d000 0x1 0x0 0x0 0x960e000 0x1 0x0 0x0 0x960f000 0x1 0x0 0x0 0x9610000 0x1 0x0 0x0 0x9611000 0x1 0x0 0x0 0x9612000 0x1 0x0 0x0 0x9613000 0x1 0x0 0x0 0x9614000 0x1 0x0 0x0 0x9615000 0x1 0x0 0x0 0x9616000 0x1 0x0 0x0 0x9617000 0x1 0x0 0x0 0x9618000 0x1 0x0 0x0 0x9619000 0x1 0x0 0x0 0x961a000 0x1 0x0 0x0 0x961b000 0x1 0x0 0x0 0x961c000 0x1 0x0 0x0 0x961d000 0x1 0x0 0x0 0x961e000 0x1 0x0 0x0 0x961f000 0x1 0x0 0x0 0x9600004 0x1 0x0 0x0 0x9601004 0x1 0x0 0x0 0x9602004 0x1 0x0 0x0 0x9603004 0x1 0x0 0x0 0x9604004 0x1 0x0 0x0 0x9605004 0x1 0x0 0x0 0x9606004 0x1 0x0 0x0 0x9607004 0x1 0x0 0x0 0x9608004 0x1 0x0 0x0 0x9609004 0x1 0x0 0x0 0x960a004 0x1 0x0 0x0 0x960b004 0x1 0x0 0x0 0x960c004 0x1 0x0 0x0 0x960d004 0x1 0x0 0x0 0x960e004 0x1 0x0 0x0 0x960f004 0x1 0x0 0x0 0x9610004 0x1 0x0 0x0 0x9611004 0x1 0x0 0x0 0x9612004 0x1 0x0 0x0 0x9613004 0x1 0x0 0x0 0x9614004 0x1 0x0 0x0 0x9615004 0x1 0x0 0x0 0x9616004 0x1 0x0 0x0 0x9617004 0x1 0x0 0x0 0x9618004 0x1 0x0 0x0 0x9619004 0x1 0x0 0x0 0x961a004 0x1 0x0 0x0 0x961b004 0x1 0x0 0x0 0x961c004 0x1 0x0 0x0 0x961d004 0x1 0x0 0x0 0x961e004 0x1 0x0 0x0 0x961f004 0x1 0x0 0x0 0x9266418 0x1 0x0 0x0 0x92e6418 0x1 0x0 0x0 0x9265804 0x1 0x0 0x0 0x92e5804 0x1 0x0 0x0 0x92604b8 0x1 0x0 0x0 0x92e04b8 0x1 0x0 0x0 0xc201244 0x1 0x0 0x0 0xc202244 0x1 0x0 0x0 0x18100c18 0x1 0x0 0x0 0x18101c18 0x1 0x0 0x0 0x18300000 0x1 0x0 0x0 0x183a3a84 0x2 0x0 0x0 0x18393a84 0x1 0x0 0x0 0x100000 0x1 0x0 0x0 0x100004 0x1 0x0 0x0 0x100008 0x1 0x0 0x0 0x10000c 0x1 0x0 0x0 0x100010 0x1 0x0 0x0 0x100014 0x1 0x0 0x0 0x100018 0x1 0x0 0x0 0x10001c 0x1 0x0 0x0 0x100020 0x1 0x0 0x0 0x100024 0x1 0x0 0x0 0x100028 0x1 0x0 0x0 0x10002c 0x1 0x0 0x0 0x100030 0x1 0x0 0x0 0x100034 0x1 0x0 0x0 0x100100 0x1 0x0 0x0 0x100104 0x1 0x0 0x0 0x100108 0x1 0x0 0x0 0x10010c 0x1 0x0 0x0 0x101000 0x1 0x0 0x0 0x101004 0x1 0x0 0x0 0x101008 0x1 0x0 0x0 0x10100c 0x1 0x0 0x0 0x101010 0x1 0x0 0x0 0x101014 0x1 0x0 0x0 0x101018 0x1 0x0 0x0 0x10101c 0x1 0x0 0x0 0x101020 0x1 0x0 0x0 0x101024 0x1 0x0 0x0 0x101028 0x1 0x0 0x0 0x10102c 0x1 0x0 0x0 0x101030 0x1 0x0 0x0 0x101034 0x1 0x0 0x0 0x102000 0x1 0x0 0x0 0x102004 0x1 0x0 0x0 0x102008 0x1 0x0 0x0 0x10200c 0x1 0x0 0x0 0x102010 0x1 0x0 0x0 0x102014 0x1 0x0 0x0 0x102018 0x1 0x0 0x0 0x10201c 0x1 0x0 0x0 0x102020 0x1 0x0 0x0 0x102024 0x1 0x0 0x0 0x102028 0x1 0x0 0x0 0x10202c 0x1 0x0 0x0 0x102030 0x1 0x0 0x0 0x102034 0x1 0x0 0x0 0x103000 0x1 0x0 0x0 0x103004 0x1 0x0 0x0 0x103008 0x1 0x0 0x0 0x10300c 0x1 0x0 0x0 0x103010 0x1 0x0 0x0 0x103014 0x1 0x0 0x0 0x103018 0x1 0x0 0x0 0x10301c 0x1 0x0 0x0 0x103020 0x1 0x0 0x0 0x103024 0x1 0x0 0x0 0x103028 0x1 0x0 0x0 0x10302c 0x1 0x0 0x0 0x103030 0x1 0x0 0x0 0x103034 0x1 0x0 0x0 0x113000 0x1 0x0 0x0 0x113004 0x1 0x0 0x0 0x113008 0x1 0x0 0x0 0x11300c 0x1 0x0 0x0 0x113010 0x1 0x0 0x0 0x113014 0x1 0x0 0x0 0x113018 0x1 0x0 0x0 0x11301c 0x1 0x0 0x0 0x113020 0x1 0x0 0x0 0x113024 0x1 0x0 0x0 0x113028 0x1 0x0 0x0 0x11302c 0x1 0x0 0x0 0x113030 0x1 0x0 0x0 0x113034 0x1 0x0 0x0 0x11a000 0x1 0x0 0x0 0x11a004 0x1 0x0 0x0 0x11a008 0x1 0x0 0x0 0x11a00c 0x1 0x0 0x0 0x11a010 0x1 0x0 0x0 0x11a014 0x1 0x0 0x0 0x11a018 0x1 0x0 0x0 0x11a01c 0x1 0x0 0x0 0x11a020 0x1 0x0 0x0 0x11a024 0x1 0x0 0x0 0x11a028 0x1 0x0 0x0 0x11a02c 0x1 0x0 0x0 0x11a030 0x1 0x0 0x0 0x11a034 0x1 0x0 0x0 0x11b000 0x1 0x0 0x0 0x11b004 0x1 0x0 0x0 0x11b008 0x1 0x0 0x0 0x11b00c 0x1 0x0 0x0 0x11b010 0x1 0x0 0x0 0x11b014 0x1 0x0 0x0 0x11b018 0x1 0x0 0x0 0x11b01c 0x1 0x0 0x0 0x11b020 0x1 0x0 0x0 0x11b024 0x1 0x0 0x0 0x11b028 0x1 0x0 0x0 0x11b02c 0x1 0x0 0x0 0x11b030 0x1 0x0 0x0 0x11b034 0x1 0x0 0x0 0x174000 0x1 0x0 0x0 0x174004 0x1 0x0 0x0 0x174008 0x1 0x0 0x0 0x17400c 0x1 0x0 0x0 0x174010 0x1 0x0 0x0 0x174014 0x1 0x0 0x0 0x174018 0x1 0x0 0x0 0x17401c 0x1 0x0 0x0 0x174020 0x1 0x0 0x0 0x174024 0x1 0x0 0x0 0x174028 0x1 0x0 0x0 0x17402c 0x1 0x0 0x0 0x174030 0x1 0x0 0x0 0x174034 0x1 0x0 0x0 0x176000 0x1 0x0 0x0 0x176004 0x1 0x0 0x0 0x176008 0x1 0x0 0x0 0x17600c 0x1 0x0 0x0 0x176010 0x1 0x0 0x0 0x176014 0x1 0x0 0x0 0x176018 0x1 0x0 0x0 0x17601c 0x1 0x0 0x0 0x176020 0x1 0x0 0x0 0x176024 0x1 0x0 0x0 0x176028 0x1 0x0 0x0 0x17602c 0x1 0x0 0x0 0x176030 0x1 0x0 0x0 0x176034 0x1 0x0 0x0 0x10401c 0x1 0x0 0x0 0x183024 0x1 0x0 0x0 0x144168 0x1 0x0 0x0 0x11702c 0x1 0x0 0x0 0x10904c 0x1 0x0 0x0 0x189038 0x1 0x0 0x0 0x1443e8 0x1 0x0 0x0 0x1442b8 0x1 0x0 0x0 0x105060 0x1 0x0 0x0 0x141024 0x1 0x0 0x0 0x145038 0x1 0x0 0x0 0x109004 0x1 0x0 0x0 0x189004 0x1 0x0 0x0 0x190004 0x1 0x0 0x0 0xc2a0000 0x1 0x0 0x0 0xc2a0004 0x1 0x0 0x0 0xc2a0008 0x1 0x0 0x0 0xc2a000c 0x1 0x0 0x0 0xc2a0010 0x1 0x0 0x0 0xc2a0014 0x1 0x0 0x0 0xc2a0018 0x1 0x0 0x0 0xc2a001c 0x1 0x0 0x0 0xc2a0020 0x1 0x0 0x0 0xc2a0024 0x1 0x0 0x0 0xc2a0028 0x1 0x0 0x0 0xc2a002c 0x1 0x0 0x0 0xc2a0030 0x1 0x0 0x0 0xc2a0034 0x1 0x0 0x0 0xc2a1000 0x1 0x0 0x0 0xc2a1004 0x1 0x0 0x0 0xc2a1008 0x1 0x0 0x0 0xc2a100c 0x1 0x0 0x0 0xc2a1010 0x1 0x0 0x0 0xc2a1014 0x1 0x0 0x0 0xc2a1018 0x1 0x0 0x0 0xc2a101c 0x1 0x0 0x0 0xc2a1020 0x1 0x0 0x0 0xc2a1024 0x1 0x0 0x0 0xc2a1028 0x1 0x0 0x0 0xc2a102c 0x1 0x0 0x0 0xc2a1030 0x1 0x0 0x0 0xc2a2260 0x1 0x0 0x0 0xc2a2264 0x1 0x0 0x0 0xc2a3008 0x1 0x0 0x0 0xc2a300c 0x1 0x0 0x0 0xc2a3010 0x1 0x0 0x0 0xc2a3014 0x1 0x0 0x0 0xc2a3024 0x1 0x0 0x0 0xc2a2034 0x1 0x0 0x0 0xc2a214c 0x1 0x0 0x0 0xc2a2150 0x1 0x0 0x0 0xc2a2154 0x1 0x0 0x0 0x28206c 0x1 0x0 0x0 0x18282004 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x1808012c 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280004 0x1 0x0 0x0 0x18284038 0x1 0x0 0x0 0x18284000 0x2 0x0 0x0 0x90c012c 0x1 0x0 0x0 0x9222408 0x1 0x0 0x0 0x9220344 0x2 0x0 0x0 0x9220480 0x1 0x0 0x0 0x922358c 0x1 0x0 0x0 0x9222398 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x923201c 0x5 0x0 0x0 0x9232050 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x9186048 0x1 0x0 0x0 0x9186054 0x1 0x0 0x0 0x9186164 0x1 0x0 0x0 0x9186170 0x1 0x0 0x0 0xc2630a0 0x4 0x0 0x0 0xc2630b0 0x4 0x0 0x0 0xc2630c0 0x4 0x0 0x0 0xc2630d0 0x4 0x0 0x0 0x18200400 0x1 0x0 0x0 0x18200404 0x1 0x0 0x0 0x18200408 0x1 0x0 0x0 0x18200038 0x1 0x0 0x0 0x18200040 0x1 0x0 0x0 0x18200048 0x1 0x0 0x0 0x18220038 0x1 0x0 0x0 0x18220040 0x1 0x0 0x0 0x182200d0 0x1 0x0 0x0 0x18200030 0x1 0x0 0x0 0x18200010 0x1 0x0 0x0 0x1822000c 0x1 0x0 0x0 0x18220d14 0x1 0x0 0x0 0x18220fb4 0x1 0x0 0x0 0x18221254 0x1 0x0 0x0 0x182214f4 0x1 0x0 0x0 0x18221794 0x1 0x0 0x0 0x18221a34 0x1 0x0 0x0 0x18221cd4 0x1 0x0 0x0 0x18221f74 0x1 0x0 0x0 0x18220d18 0x1 0x0 0x0 0x18220fb8 0x1 0x0 0x0 0x18221258 0x1 0x0 0x0 0x182214f8 0x1 0x0 0x0 0x18221798 0x1 0x0 0x0 0x18221a38 0x1 0x0 0x0 0x18221cd8 0x1 0x0 0x0 0x18221f78 0x1 0x0 0x0 0x18220d00 0x1 0x0 0x0 0x18220d04 0x1 0x0 0x0 0x18220d1c 0x1 0x0 0x0 0x18220fbc 0x1 0x0 0x0 0x1822125c 0x1 0x0 0x0 0x182214fc 0x1 0x0 0x0 0x1822179c 0x1 0x0 0x0 0x18221a3c 0x1 0x0 0x0 0x18221cdc 0x1 0x0 0x0 0x18221f7c 0x1 0x0 0x0 0x18221274 0x1 0x0 0x0 0x18221288 0x1 0x0 0x0 0x1822129c 0x1 0x0 0x0 0x182212b0 0x1 0x0 0x0 0x182212c4 0x1 0x0 0x0 0x182212d8 0x1 0x0 0x0 0x182212ec 0x1 0x0 0x0 0x18221300 0x1 0x0 0x0 0x18221314 0x1 0x0 0x0 0x18221328 0x1 0x0 0x0 0x1822133c 0x1 0x0 0x0 0x18221350 0x1 0x0 0x0 0x18221364 0x1 0x0 0x0 0x18221378 0x1 0x0 0x0 0x1822138c 0x1 0x0 0x0 0x182213a0 0x1 0x0 0x0 0x18221514 0x1 0x0 0x0 0x18221528 0x1 0x0 0x0 0x1822153c 0x1 0x0 0x0 0x18221550 0x1 0x0 0x0 0x18221564 0x1 0x0 0x0 0x18221578 0x1 0x0 0x0 0x1822158c 0x1 0x0 0x0 0x182215a0 0x1 0x0 0x0 0x182215b4 0x1 0x0 0x0 0x182215c8 0x1 0x0 0x0 0x182215dc 0x1 0x0 0x0 0x182215f0 0x1 0x0 0x0 0x18221604 0x1 0x0 0x0 0x18221618 0x1 0x0 0x0 0x1822162c 0x1 0x0 0x0 0x18221640 0x1 0x0 0x0 0x182217b4 0x1 0x0 0x0 0x182217c8 0x1 0x0 0x0 0x182217dc 0x1 0x0 0x0 0x182217f0 0x1 0x0 0x0 0x18221804 0x1 0x0 0x0 0x18221818 0x1 0x0 0x0 0x1822182c 0x1 0x0 0x0 0x18221840 0x1 0x0 0x0 0x18221854 0x1 0x0 0x0 0x18221868 0x1 0x0 0x0 0x1822187c 0x1 0x0 0x0 0x18221890 0x1 0x0 0x0 0x182218a4 0x1 0x0 0x0 0x182218b8 0x1 0x0 0x0 0x182218cc 0x1 0x0 0x0 0x182218e0 0x1 0x0 0x0 0x18221a54 0x1 0x0 0x0 0x18221a68 0x1 0x0 0x0 0x18221a7c 0x1 0x0 0x0 0x18221a90 0x1 0x0 0x0 0x18221aa4 0x1 0x0 0x0 0x18221ab8 0x1 0x0 0x0 0x18221acc 0x1 0x0 0x0 0x18221ae0 0x1 0x0 0x0 0x18221af4 0x1 0x0 0x0 0x18221b08 0x1 0x0 0x0 0x18221b1c 0x1 0x0 0x0 0x18221b30 0x1 0x0 0x0 0x18221b44 0x1 0x0 0x0 0x18221b58 0x1 0x0 0x0 0x18221b6c 0x1 0x0 0x0 0x18221b80 0x1 0x0 0x0 0x18221cf4 0x1 0x0 0x0 0x18221d08 0x1 0x0 0x0 0x18221d1c 0x1 0x0 0x0 0x18221d30 0x1 0x0 0x0 0x18221d44 0x1 0x0 0x0 0x18221d58 0x1 0x0 0x0 0x18221d6c 0x1 0x0 0x0 0x18221d80 0x1 0x0 0x0 0x18221d94 0x1 0x0 0x0 0x18221da8 0x1 0x0 0x0 0x18221dbc 0x1 0x0 0x0 0x18221dd0 0x1 0x0 0x0 0x18221de4 0x1 0x0 0x0 0x18221df8 0x1 0x0 0x0 0x18221e0c 0x1 0x0 0x0 0x18221e20 0x1 0x0 0x0 0x18221f94 0x1 0x0 0x0 0x18221fa8 0x1 0x0 0x0 0x18221fbc 0x1 0x0 0x0 0x18221fd0 0x1 0x0 0x0 0x18221fe4 0x1 0x0 0x0 0x18221ff8 0x1 0x0 0x0 0x1822200c 0x1 0x0 0x0 0x18222020 0x1 0x0 0x0 0x18222034 0x1 0x0 0x0 0x18222048 0x1 0x0 0x0 0x1822205c 0x1 0x0 0x0 0x18222070 0x1 0x0 0x0 0x18222084 0x1 0x0 0x0 0x18222098 0x1 0x0 0x0 0x182220ac 0x1 0x0 0x0 0x182220c0 0x1 0x0 0x0 0x18221278 0x1 0x0 0x0 0x1822128c 0x1 0x0 0x0 0x182212a0 0x1 0x0 0x0 0x182212b4 0x1 0x0 0x0 0x182212c8 0x1 0x0 0x0 0x182212dc 0x1 0x0 0x0 0x182212f0 0x1 0x0 0x0 0x18221304 0x1 0x0 0x0 0x18221318 0x1 0x0 0x0 0x1822132c 0x1 0x0 0x0 0x18221340 0x1 0x0 0x0 0x18221354 0x1 0x0 0x0 0x18221368 0x1 0x0 0x0 0x1822137c 0x1 0x0 0x0 0x18221390 0x1 0x0 0x0 0x182213a4 0x1 0x0 0x0 0x18221518 0x1 0x0 0x0 0x1822152c 0x1 0x0 0x0 0x18221540 0x1 0x0 0x0 0x18221554 0x1 0x0 0x0 0x18221568 0x1 0x0 0x0 0x1822157c 0x1 0x0 0x0 0x18221590 0x1 0x0 0x0 0x182215a4 0x1 0x0 0x0 0x182215b8 0x1 0x0 0x0 0x182215cc 0x1 0x0 0x0 0x182215e0 0x1 0x0 0x0 0x182215f4 0x1 0x0 0x0 0x18221608 0x1 0x0 0x0 0x1822161c 0x1 0x0 0x0 0x18221630 0x1 0x0 0x0 0x18221644 0x1 0x0 0x0 0x182217b8 0x1 0x0 0x0 0x182217cc 0x1 0x0 0x0 0x182217e0 0x1 0x0 0x0 0x182217f4 0x1 0x0 0x0 0x18221808 0x1 0x0 0x0 0x1822181c 0x1 0x0 0x0 0x18221830 0x1 0x0 0x0 0x18221844 0x1 0x0 0x0 0x18221858 0x1 0x0 0x0 0x1822186c 0x1 0x0 0x0 0x18221880 0x1 0x0 0x0 0x18221894 0x1 0x0 0x0 0x182218a8 0x1 0x0 0x0 0x182218bc 0x1 0x0 0x0 0x182218d0 0x1 0x0 0x0 0x182218e4 0x1 0x0 0x0 0x18221a58 0x1 0x0 0x0 0x18221a6c 0x1 0x0 0x0 0x18221a80 0x1 0x0 0x0 0x18221a94 0x1 0x0 0x0 0x18221aa8 0x1 0x0 0x0 0x18221abc 0x1 0x0 0x0 0x18221ad0 0x1 0x0 0x0 0x18221ae4 0x1 0x0 0x0 0x18221af8 0x1 0x0 0x0 0x18221b0c 0x1 0x0 0x0 0x18221b20 0x1 0x0 0x0 0x18221b34 0x1 0x0 0x0 0x18221b48 0x1 0x0 0x0 0x18221b5c 0x1 0x0 0x0 0x18221b70 0x1 0x0 0x0 0x18221b84 0x1 0x0 0x0 0x18221cf8 0x1 0x0 0x0 0x18221d0c 0x1 0x0 0x0 0x18221d20 0x1 0x0 0x0 0x18221d34 0x1 0x0 0x0 0x18221d48 0x1 0x0 0x0 0x18221d5c 0x1 0x0 0x0 0x18221d70 0x1 0x0 0x0 0x18221d84 0x1 0x0 0x0 0x18221d98 0x1 0x0 0x0 0x18221dac 0x1 0x0 0x0 0x18221dc0 0x1 0x0 0x0 0x18221dd4 0x1 0x0 0x0 0x18221de8 0x1 0x0 0x0 0x18221dfc 0x1 0x0 0x0 0x18221e10 0x1 0x0 0x0 0x18221e24 0x1 0x0 0x0 0x18221f98 0x1 0x0 0x0 0x18221fac 0x1 0x0 0x0 0x18221fc0 0x1 0x0 0x0 0x18221fd4 0x1 0x0 0x0 0x18221fe8 0x1 0x0 0x0 0x18221ffc 0x1 0x0 0x0 0x18222010 0x1 0x0 0x0 0x18222024 0x1 0x0 0x0 0x18222038 0x1 0x0 0x0 0x1822204c 0x1 0x0 0x0 0x18222060 0x1 0x0 0x0 0x18222074 0x1 0x0 0x0 0x18222088 0x1 0x0 0x0 0x1822209c 0x1 0x0 0x0 0x182220b0 0x1 0x0 0x0 0x182220c4 0x1 0x0 0x0 0x105050 0x1 0x0 0x0 0x171004 0x1 0x0 0x0 0x171154 0x1 0x0 0x0 0x17100c 0x1 0x0 0x0 0x171018 0x1 0x0 0x0 0x5091004 0x1 0x0 0x0 0x509100c 0x1 0x0 0x0 0x5091010 0x1 0x0 0x0 0x5091014 0x1 0x0 0x0 0x5091054 0x1 0x0 0x0 0x5091060 0x1 0x0 0x0 0x509106c 0x1 0x0 0x0 0x5091070 0x1 0x0 0x0 0x5091074 0x1 0x0 0x0 0x5091078 0x1 0x0 0x0 0x509107c 0x1 0x0 0x0 0x509108c 0x1 0x0 0x0 0x5091098 0x1 0x0 0x0 0x509109c 0x1 0x0 0x0 0x1800005c 0x1 0x0 0x0 0x1801005c 0x1 0x0 0x0 0x1802005c 0x1 0x0 0x0 0x1803005c 0x1 0x0 0x0 0x1804005c 0x1 0x0 0x0 0x1805005c 0x1 0x0 0x0 0x1806005c 0x1 0x0 0x0 0x1807005c 0x1 0x0 0x0 0x17c0003c 0x1 0x0 0x1 0x6004fb0 0xc5acce55 0x0 0x1 0x600408c 0xff 0x0 0x1 0x6004fb0 0x0 0x0 0x0 0x62900010 0x1 0x0 0x0 0x62900014 0x1 0x0 0x0 0x62900018 0x1 0x0 0x0 0x62900030 0x1 0x0 0x0 0x62900038 0x1 0x0 0x0 0x62900040 0x1 0x0 0x0 0x62900048 0x1 0x0 0x0 0x629000d0 0x1 0x0 0x0 0x62900210 0x1 0x0 0x0 0x62900230 0x1 0x0 0x0 0x62900250 0x1 0x0 0x0 0x62900270 0x1 0x0 0x0 0x62900290 0x1 0x0 0x0 0x629002b0 0x1 0x0 0x0 0x62900208 0x1 0x0 0x0 0x62900228 0x1 0x0 0x0 0x62900248 0x1 0x0 0x0 0x62900268 0x1 0x0 0x0 0x62900288 0x1 0x0 0x0 0x629002a8 0x1 0x0 0x0 0x6290020c 0x1 0x0 0x0 0x6290022c 0x1 0x0 0x0 0x6290024c 0x1 0x0 0x0 0x6290026c 0x1 0x0 0x0 0x6290028c 0x1 0x0 0x0 0x629002ac 0x1 0x0 0x0 0x62900404 0x1 0x0 0x0 0x62900408 0x1 0x0 0x0 0x62900400 0x1 0x0 0x0 0x62900d04 0x1 0x0 0x0 0x624b0010 0x1 0x0 0x0 0x624b0014 0x1 0x0 0x0 0x624b0018 0x1 0x0 0x0 0x624b0210 0x1 0x0 0x0 0x624b0230 0x1 0x0 0x0 0x624b0250 0x1 0x0 0x0 0x624b0270 0x1 0x0 0x0 0x624b0290 0x1 0x0 0x0 0x624b02b0 0x1 0x0 0x0 0x624b0208 0x1 0x0 0x0 0x624b0228 0x1 0x0 0x0 0x624b0248 0x1 0x0 0x0 0x624b0268 0x1 0x0 0x0 0x624b0288 0x1 0x0 0x0 0x624b02a8 0x1 0x0 0x0 0x624b020c 0x1 0x0 0x0 0x624b022c 0x1 0x0 0x0 0x624b024c 0x1 0x0 0x0 0x624b026c 0x1 0x0 0x0 0x624b028c 0x1 0x0 0x0 0x624b02ac 0x1 0x0 0x0 0x624b0400 0x1 0x0 0x0 0x624b0404 0x1 0x0 0x0 0x624b0408 0x1 0x0 0x0 0x62402028 0x1 0x0 0x0 0xb254520 0x1 0x0 0x0 0xb251020 0x1 0x0 0x0 0xb251024 0x1 0x0 0x0 0xb251030 0x1 0x0 0x0 0xb251200 0x1 0x0 0x0 0xb251214 0x1 0x0 0x0 0xb251228 0x1 0x0 0x0 0xb25123c 0x1 0x0 0x0 0xb251250 0x1 0x0 0x0 0xb251204 0x1 0x0 0x0 0xb251218 0x1 0x0 0x0 0xb25122c 0x1 0x0 0x0 0xb251240 0x1 0x0 0x0 0xb251254 0x1 0x0 0x0 0xb251208 0x1 0x0 0x0 0xb25121c 0x1 0x0 0x0 0xb251230 0x1 0x0 0x0 0xb251244 0x1 0x0 0x0 0xb251258 0x1 0x0 0x0 0xb254510 0x1 0x0 0x0 0xb254514 0x1 0x0 0x0 0xb250010 0x1 0x0 0x0 0xb250014 0x1 0x0 0x0 0xb250900 0x1 0x0 0x0 0xb250904 0x1 0x0 0x0 0x4200010 0x1 0x0 0x0 0x4200014 0x1 0x0 0x0 0x4200018 0x1 0x0 0x0 0x4200030 0x1 0x0 0x0 0x4200038 0x1 0x0 0x0 0x4200040 0x1 0x0 0x0 0x4200048 0x1 0x0 0x0 0x42000d0 0x1 0x0 0x0 0x4200210 0x1 0x0 0x0 0x4200230 0x1 0x0 0x0 0x4200250 0x1 0x0 0x0 0x4200270 0x1 0x0 0x0 0x4200290 0x1 0x0 0x0 0x42002b0 0x1 0x0 0x0 0x4200208 0x1 0x0 0x0 0x4200228 0x1 0x0 0x0 0x4200248 0x1 0x0 0x0 0x4200268 0x1 0x0 0x0 0x4200288 0x1 0x0 0x0 0x42002a8 0x1 0x0 0x0 0x420020c 0x1 0x0 0x0 0x420022c 0x1 0x0 0x0 0x420024c 0x1 0x0 0x0 0x420026c 0x1 0x0 0x0 0x420028c 0x1 0x0 0x0 0x42002ac 0x1 0x0 0x0 0x4200404 0x1 0x0 0x0 0x4200408 0x1 0x0 0x0 0x4200400 0x1 0x0 0x0 0x4200d04 0x1 0x0 0x0 0x4130010 0x1 0x0 0x0 0x4130014 0x1 0x0 0x0 0x4130018 0x1 0x0 0x0 0x4130210 0x1 0x0 0x0 0x4130230 0x1 0x0 0x0 0x4130250 0x1 0x0 0x0 0x4130270 0x1 0x0 0x0 0x4130290 0x1 0x0 0x0 0x41302b0 0x1 0x0 0x0 0x4130208 0x1 0x0 0x0 0x4130228 0x1 0x0 0x0 0x4130248 0x1 0x0 0x0 0x4130268 0x1 0x0 0x0 0x4130288 0x1 0x0 0x0 0x41302a8 0x1 0x0 0x0 0x413020c 0x1 0x0 0x0 0x413022c 0x1 0x0 0x0 0x413024c 0x1 0x0 0x0 0x413026c 0x1 0x0 0x0 0x413028c 0x1 0x0 0x0 0x41302ac 0x1 0x0 0x0 0x4130400 0x1 0x0 0x0 0x4130404 0x1 0x0 0x0 0x4130408 0x1 0x0 0x0 0x4082028 0x1 0x0 0x0 0x18a008 0x1 0x0 0x0 0xb2c4520 0x1 0x0 0x0 0xb2c1020 0x1 0x0 0x0 0xb2c1024 0x1 0x0 0x0 0xb2c1030 0x1 0x0 0x0 0xb2c1200 0x1 0x0 0x0 0xb2c1214 0x1 0x0 0x0 0xb2c1228 0x1 0x0 0x0 0xb2c123c 0x1 0x0 0x0 0xb2c1250 0x1 0x0 0x0 0xb2c1204 0x1 0x0 0x0 0xb2c1218 0x1 0x0 0x0 0xb2c122c 0x1 0x0 0x0 0xb2c1240 0x1 0x0 0x0 0xb2c1254 0x1 0x0 0x0 0xb2c1208 0x1 0x0 0x0 0xb2c121c 0x1 0x0 0x0 0xb2c1230 0x1 0x0 0x0 0xb2c1244 0x1 0x0 0x0 0xb2c1258 0x1 0x0 0x0 0xb2c4510 0x1 0x0 0x0 0xb2c4514 0x1 0x0 0x0 0xb2c0010 0x1 0x0 0x0 0xb2c0014 0x1 0x0 0x0 0xb2c0900 0x1 0x0 0x0 0xb2c0904 0x1 0x0 0x0 0x80a4010 0x1 0x0 0x0 0x80a4014 0x1 0x0 0x0 0x80a4018 0x1 0x0 0x0 0x80a4030 0x1 0x0 0x0 0x80a4038 0x1 0x0 0x0 0x80a4040 0x1 0x0 0x0 0x80a4048 0x1 0x0 0x0 0x80a40d0 0x1 0x0 0x0 0x80a4210 0x1 0x0 0x0 0x80a4230 0x1 0x0 0x0 0x80a4250 0x1 0x0 0x0 0x80a4270 0x1 0x0 0x0 0x80a4290 0x1 0x0 0x0 0x80a42b0 0x1 0x0 0x0 0x80a4208 0x1 0x0 0x0 0x80a4228 0x1 0x0 0x0 0x80a4248 0x1 0x0 0x0 0x80a4268 0x1 0x0 0x0 0x80a4288 0x1 0x0 0x0 0x80a42a8 0x1 0x0 0x0 0x80a420c 0x1 0x0 0x0 0x80a422c 0x1 0x0 0x0 0x80a424c 0x1 0x0 0x0 0x80a426c 0x1 0x0 0x0 0x80a428c 0x1 0x0 0x0 0x80a42ac 0x1 0x0 0x0 0x80a4404 0x1 0x0 0x0 0x80a4408 0x1 0x0 0x0 0x80a4400 0x1 0x0 0x0 0x80a4d04 0x1 0x0 0x0 0x83b0010 0x1 0x0 0x0 0x83b0014 0x1 0x0 0x0 0x83b0018 0x1 0x0 0x0 0x83b0210 0x1 0x0 0x0 0x83b0230 0x1 0x0 0x0 0x83b0250 0x1 0x0 0x0 0x83b0270 0x1 0x0 0x0 0x83b0290 0x1 0x0 0x0 0x83b02b0 0x1 0x0 0x0 0x83b0208 0x1 0x0 0x0 0x83b0228 0x1 0x0 0x0 0x83b0248 0x1 0x0 0x0 0x83b0268 0x1 0x0 0x0 0x83b0288 0x1 0x0 0x0 0x83b02a8 0x1 0x0 0x0 0x83b020c 0x1 0x0 0x0 0x83b022c 0x1 0x0 0x0 0x83b024c 0x1 0x0 0x0 0x83b026c 0x1 0x0 0x0 0x83b028c 0x1 0x0 0x0 0x83b02ac 0x1 0x0 0x0 0x83b0400 0x1 0x0 0x0 0x83b0404 0x1 0x0 0x0 0x83b0408 0x1 0x0 0x0 0x8302028 0x1 0x0 0x0 0xb2b4520 0x1 0x0 0x0 0xb2b1020 0x1 0x0 0x0 0xb2b1024 0x1 0x0 0x0 0xb2b1030 0x1 0x0 0x0 0xb2b1200 0x1 0x0 0x0 0xb2b1214 0x1 0x0 0x0 0xb2b1228 0x1 0x0 0x0 0xb2b123c 0x1 0x0 0x0 0xb2b1250 0x1 0x0 0x0 0xb2b1204 0x1 0x0 0x0 0xb2b1218 0x1 0x0 0x0 0xb2b122c 0x1 0x0 0x0 0xb2b1240 0x1 0x0 0x0 0xb2b1254 0x1 0x0 0x0 0xb2b1208 0x1 0x0 0x0 0xb2b121c 0x1 0x0 0x0 0xb2b1230 0x1 0x0 0x0 0xb2b1244 0x1 0x0 0x0 0xb2b1258 0x1 0x0 0x0 0xb2b4510 0x1 0x0 0x0 0xb2b4514 0x1 0x0 0x0 0xb2b0010 0x1 0x0 0x0 0xb2b0014 0x1 0x0 0x0 0xb2b0900 0x1 0x0 0x0 0xb2b0904 0x1 0x0 0x0 0x17a00204 0x1d 0x0>; + }; + }; + }; + + fragment@37 { + target = <0xffffffff>; + + __overlay__ { + + ss_plog@B4400000 { + compatible = "ss_plog"; + no-map; + reg = <0x0 0xb4400000 0x0 0x200000>; + }; + + ramoops@B4600000 { + compatible = "ramoops"; + reg = <0x0 0xb4600000 0x0 0x100000>; + record-size = <0x40000>; + console-size = <0x40000>; + ftrace-size = <0x40000>; + pmsg-size = <0x40000>; + }; + + sec_debug_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4700000 0x0 0x800000>; + phandle = <0xbc>; + }; + + sec_debug_autocomment@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4f00000 0x0 0x1000>; + phandle = <0xbd>; + }; + + sec_debug_rdx_bootdev@0 { + no-ship; + reg = <0x1 0x0 0x0 0x5900000>; + phandle = <0xbe>; + }; + + kaslr_region@A0001000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xa0001000 0x0 0x1000>; + phandle = <0xbf>; + }; + + rkp_region@B0200000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xb0200000 0x0 0x200000>; + phandle = <0xc0>; + }; + + hdm_region@A1000000 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xa1000000 0x0 0x1000>; + phandle = <0x53>; + }; + + modem_shared_mem_region@B5000000 { + compatible = "modem-removed-dma-pool"; + no-map; + reg = <0x0 0xb5000000 0x0 0x6000000>; + phandle = <0x52>; + }; + }; + }; + + fragment@38 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x80b00000 0x0 0x7100000>; + }; + }; + + fragment@39 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x8b000000 0x0 0x8900000>; + }; + }; + + fragment@40 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x93c00000 0x0 0x3e00000>; + }; + }; + + fragment@41 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97a00000 0x0 0x500000>; + }; + }; + + fragment@42 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97f00000 0x0 0x500000>; + }; + }; + + fragment@43 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98400000 0x0 0x500000>; + }; + }; + + fragment@44 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98900000 0x0 0x1e00000>; + }; + }; + + fragment@45 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9e000000 0x0 0x2000000>; + }; + }; + + fragment@46 { + target = <0xffffffff>; + + __overlay__ { + size = <0x0 0x2000000>; + }; + }; + + fragment@47 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@48 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@49 { + target = <0xffffffff>; + + __overlay__ { + + upload_cause@66c { + compatible = "qcom,msm-imem-upload_cause"; + reg = <0x66c 0x4>; + }; + }; + }; + + fragment@50 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@51 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@52 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@53 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@54 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@55 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@56 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@57 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@58 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@59 { + target = <0xffffffff>; + + __overlay__ { + + dwc3@a600000 { + maximum-speed = "high-speed"; + }; + }; + }; + + fragment@60 { + target = <0xffffffff>; + + __overlay__ { + + input_booster { + status = "okay"; + compatible = "input_booster"; + #address-cells = <0x1>; + #size-cells = <0x0>; + + booster_key@1 { + input_booster,label = "KEY"; + input_booster,type = <0x0>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0xc8>; + input_booster,tail_times = <0x0>; + }; + + booster_key@2 { + input_booster,label = "TOUCHKEY"; + input_booster,type = <0x1>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x0>; + input_booster,tail_times = <0x12c>; + }; + + booster_key@3 { + input_booster,label = "TOUCH"; + input_booster,type = <0x2>; + input_booster,levels = <0x1 0x2 0x3>; + input_booster,cpu_freqs = <0x135600 0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2 0x2>; + input_booster,ddr_freqs = <0x3f9 0x3f9 0x3f9>; + input_booster,lpm_bias = <0x5 0x5 0x5>; + input_booster,head_times = <0xc8 0xc8 0x0>; + input_booster,tail_times = <0x0 0x0 0x12c>; + }; + + booster_key@4 { + input_booster,label = "MULTITOUCH"; + input_booster,type = <0x3>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x3e8 0x0>; + input_booster,tail_times = <0x0 0x1f4>; + }; + + booster_key@5 { + input_booster,label = "KEYBOARD"; + input_booster,type = <0x4>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x135600>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x82 0x82>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@6 { + input_booster,label = "MOUSE"; + input_booster,type = <0x5>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@7 { + input_booster,label = "MOUSE WHEEL"; + input_booster,type = <0x6>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@8 { + input_booster,label = "PEN HOVER"; + input_booster,type = <0x7>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@9 { + input_booster,label = "PEN"; + input_booster,type = <0x8>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x17bb00 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x258>; + }; + + booster_key@10 { + input_booster,label = "KEY_TWO"; + input_booster,type = <0x9>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x17bb00>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x2bc>; + input_booster,tail_times = <0x2bc>; + }; + }; + + sec_smem@0 { + compatible = "samsung,sec-smem"; + status = "okay"; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_4 { + compatible = "qcom,memshare-peripheral"; + memory-region = <0x52>; + qcom,peripheral-size = <0x2000000>; + qcom,reserved-size = <0x4000000>; + qcom,client-id = <0x3>; + qcom,allocate-boot-time; + label = "modem"; + }; + }; + + samsung,sec_misc { + qfprom_jtag,reg = <0x780180>; + }; + + usb-notifier { + compatible = "samsung,usb-notifier"; + qcom,disable_control_en = <0x1>; + qcom,unsupport_host_en = <0x0>; + phandle = <0xc1>; + }; + + samsung,sec_hdm { + memory-region = <0x53>; + }; + }; + }; + + fragment@61 { + target = <0xffffffff>; + + __overlay__ { + + android { + + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_system,recovery,dtbo,abl,xbl,tz,hyp"; + }; + }; + }; + }; + + fragment@62 { + target = <0xffffffff>; + + __overlay__ { + qcom,smem-states = <0xffffffff 0x0 0xffffffff 0x4 0xffffffff 0x5>; + qcom,smem-state-names = "qcom,force-stop", "qcom,stop-reason-0", "qcom,stop-reason-1"; + }; + }; + + fragment@63 { + target = <0xffffffff>; + + __overlay__ { + vdd-3.3-ch1-supply; + }; + }; + + fragment@64 { + target = <0xffffffff>; + + __overlay__ { + spm-level = <0x3>; + }; + }; + + fragment@65 { + target = <0xffffffff>; + + __overlay__ { + + camera_mem_region { + reg = <0x1 0x20000000 0x0 0x25800000>; + ion,recyclable; + phandle = <0x54>; + }; + }; + }; + + fragment@66 { + target = <0xffffffff>; + + __overlay__ { + + qcom,ion { + + qcom,ion-heap@30 { + reg = <0x1e>; + memory-region = <0x54>; + qcom,ion-heap-type = "RBIN"; + }; + }; + }; + }; + + fragment@67 { + target = <0xffffffff>; + + __overlay__ { + i2c18 = "/soc/i2c@18"; + }; + }; + + fragment@68 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x3>; + + imp_list { + #list-imp-cells = <0x3>; + phandle = <0x25>; + }; + }; + }; + + fragment@69 { + target = <0xffffffff>; + + __overlay__ { + + msm_cdc_pinctrl_quin { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x55 0x56 0x57 0x58>; + pinctrl-1 = <0x59 0x5a 0x5b 0x5c>; + qcom,lpi-gpios; + phandle = <0x60>; + }; + }; + }; + + fragment@70 { + target = <0xffffffff>; + + __overlay__ { + + sec-audio-sysfs { + compatible = "samsung,audio-sysfs"; + status = "okay"; + audio,num-amp = <0x2>; + }; + + samsung,q6audio-adaptation { + compatible = "samsung,q6audio-adaptation"; + adaptation,device-tx-port-id = <0xb037>; + adaptation,spk-rx-port-id = <0x1016>; + adaptation,usb-rx-port-id = <0x7000>; + adaptation,bt-rx-port-id = <0x400e>; + adaptation,headset-rx-port-id = <0xb030>; + phandle = <0x5f>; + }; + + det_zones { + #list-det-cells = <0x2>; + phandle = <0x24>; + }; + + i2c@18 { + status = "ok"; + cell-index = <0x12>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x58 0x0 0xffffffff 0x59 0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x5d 0x5e>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xc2>; + + tas256x@4c { + #sound-dai-cells = <0x0>; + compatible = "ti, tas256x"; + status = "ok"; + reg = <0x4c>; + ti,reset-gpio = <0xffffffff 0x5e 0x0>; + ti,irq-gpio = <0xffffffff 0x5a 0x0>; + ti,left-channel = <0x4d>; + ti,right-channel = <0x4c>; + ti,channels = <0x2>; + ti,iv-width = <0x8>; + ti,vbat-mon = <0x1>; + ti,port_id = <0x1016>; + phandle = <0xc3>; + }; + }; + }; + }; + + fragment@71 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,wcn-btfm = <0x1>; + qcom,ext-disp-audio-rx = <0x0>; + qcom,mi2s-audio-intf = <0x1>; + asoc-platform = <0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0x5f>; + asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-pcm-dsp.2", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-compress-dsp", "msm-pcm-hostless", "msm-pcm-afe", "msm-lsm-client", "msm-pcm-routing", "msm-compr-dsp", "msm-pcm-dsp-noirq", "q6audio-adaptation"; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS3", "MIC BIAS3", "Analog Mic4", "AMIC5", "MIC BIAS4", "MIC BIAS4", "Analog Mic5", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT"; + qcom,msm-mbhc-hs-mic-max-threshold-mv = <0x270f>; + qcom,msm-mbhc-hs-mic-min-threshold-mv = <0x280>; + qcom,cdc-dmic01-gpios; + qcom,cdc-dmic23-gpios; + qcom,cdc-dmic45-gpios; + qcom,quin-mi2s-gpios = <0x60>; + asoc-codec = <0xffffffff 0xffffffff>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec"; + qcom,wsa-max-devs = <0x0>; + qcom,wsa-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x31 0xffffffff>; + fsa4480-i2c-handle; + qcom,fm-lna-gpios = <0xffffffff 0x54 0x0>; + qcom,msm-mbhc-gnd-det = <0x1>; + }; + }; + + fragment@72 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@73 { + target = <0xffffffff>; + + __overlay__ { + + tas25xx_gpio_default { + phandle = <0x5d>; + + mux { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + function = "gpio"; + }; + + config { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + bias-disable; + }; + }; + + fm_lna_default { + phandle = <0x5e>; + + mux { + pins = "gpio84"; + function = "gpio"; + }; + + config { + pins = "gpio84"; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@74 { + target = <0xffffffff>; + + __overlay__ { + + grip_i2c { + + grip_i2c_active { + phandle = <0xa8>; + + grip_i2c_active { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + + grip_i2c_suspend { + phandle = <0xc4>; + + grip_i2c_suspend { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + }; + + s2mpb03_i2c_sda_default { + phandle = <0x61>; + + mux { + pins = "gpio25"; + function = "gpio"; + }; + + config { + pins = "gpio25"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + s2mpb03_i2c_scl_default { + phandle = <0x62>; + + mux { + pins = "gpio26"; + function = "gpio"; + }; + + config { + pins = "gpio26"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + cam_sensor_mclk0_active { + phandle = <0x81>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk0_suspend { + phandle = <0x83>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk1_active { + phandle = <0x91>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk1_suspend { + phandle = <0x93>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk2_active { + phandle = <0x99>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk2_suspend { + phandle = <0x9c>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk3_active { + phandle = <0x86>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk3_suspend { + phandle = <0x8a>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk4_active { + phandle = <0xa0>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk4_suspend { + phandle = <0xa3>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + rcam1_sensor_reset_active { + phandle = <0x82>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_reset_suspend { + phandle = <0x84>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_active { + phandle = <0x92>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_suspend { + phandle = <0x94>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_active { + phandle = <0x87>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_suspend { + phandle = <0x8b>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_active { + phandle = <0x9a>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_suspend { + phandle = <0x9d>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_active { + phandle = <0xa1>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_suspend { + phandle = <0xa4>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_active { + phandle = <0x73>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_suspend { + phandle = <0x74>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_active { + phandle = <0x9b>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_suspend { + phandle = <0x9e>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_active { + phandle = <0x88>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_suspend { + phandle = <0x8c>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_active { + phandle = <0xa2>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_suspend { + phandle = <0xa5>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_active { + phandle = <0x89>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-disable; + output-high; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_suspend { + phandle = <0x8d>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vdig_active { + phandle = <0xc5>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vdig_suspend { + phandle = <0xc6>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_active { + phandle = <0xc7>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_suspend { + phandle = <0xc8>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + if_pmic_i2c_pins { + phandle = <0xc9>; + + if_pmic_i2c_sleep { + phandle = <0x66>; + + mux { + pins = "gpio115", "gpio116"; + function = "gpio"; + }; + + config { + pins = "gpio115", "gpio116"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + usbpd_i2c_pins { + phandle = <0xca>; + + usbpd_i2c_sleep { + phandle = <0x68>; + + mux { + pins = "gpio53", "gpio54"; + function = "gpio"; + }; + + config { + pins = "gpio53", "gpio54"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + mcu_reset_active { + phandle = <0x76>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_reset_suspend { + phandle = <0x78>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + mcu_clk_active { + phandle = <0x77>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_clk_suspend { + phandle = <0x79>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + }; + }; + + fragment@75 { + target = <0xffffffff>; + + __overlay__ { + + grip_int_active { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xa9>; + }; + + grip_int_suspend { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xcb>; + }; + }; + }; + + fragment@76 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x6 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x22 0x25 0x2a 0x2d 0x2f 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x43 0x44 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5b 0x5e 0x73 0x74 0x76>; + }; + }; + + fragment@77 { + target = <0xffffffff>; + + __overlay__ { + + qcom,pm6150@0 { + + qcom,power-on@800 { + interrupts = <0x0 0x8 0x0 0x0 0x0 0x8 0x1 0x0 0x0 0x8 0x4 0x0 0x0 0x8 0x5 0x0>; + interrupt-names = "kpdpwr", "resin", "resin-bark", "kpdpwr-resin-bark"; + qcom,s3-debounce = <0x80>; + + qcom,pon_1 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_2 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_3 { + qcom,pon-type = <0x3>; + qcom,support-reset = <0x1>; + qcom,pull-up = <0x1>; + qcom,s1-timer = <0x1a40>; + qcom,s2-timer = <0x3e8>; + qcom,s2-type = <0x8>; + qcom,use-bark; + }; + }; + }; + }; + }; + + fragment@78 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@79 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@80 { + target = <0xffffffff>; + + __overlay__ { + + sec_thermistor@0 { + compatible = "samsung,sec-ap-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "ap_therm"; + adc_array = <0x70e 0x8a0 0xa3c 0xc04 0xe36 0x1103 0x1467 0x17f5 0x1c02 0x20ba 0x25b4 0x2b63 0x3141 0x3799 0x3d1c 0x44c8 0x4b37 0x51b0 0x5641 0x5bbf 0x5fec 0x6437 0x66e9>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@1 { + compatible = "samsung,sec-pa-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "pa_therm"; + adc_array = <0x745 0x8dc 0xa82 0xc3c 0xe92 0x112d 0x149e 0x1836 0x1c41 0x211f 0x2636 0x2bc9 0x31a3 0x3802 0x3d67 0x453a 0x4b8f 0x518c 0x5730 0x5c17 0x60ae 0x6482 0x672b>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@2 { + compatible = "samsung,sec-wf-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4f>; + io-channel-names = "wf_therm"; + adc_array = <0x753 0x8de 0xa8f 0xc4d 0xe9a 0x1140 0x149f 0x183d 0x1c54 0x2116 0x262e 0x2bdb 0x31c1 0x3816 0x3d7c 0x455a 0x4b86 0x51c4 0x56f2 0x5c43 0x60c5 0x64b3 0x6785>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + i2c@2 { + cell-index = <0x2>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x19 0x0 0xffffffff 0x1a 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x61 0x62>; + phandle = <0xcc>; + + s2mpb03@56 { + compatible = "samsung,s2mpb03pmic"; + reg = <0x56>; + additional_reg_init; + + regulators { + + s2mpb03-ldo1 { + regulator-name = "s2mpb03-ldo1"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x100590>; + phandle = <0x90>; + }; + + s2mpb03-ldo2 { + regulator-name = "s2mpb03-ldo2"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x80>; + }; + + s2mpb03-ldo3 { + regulator-name = "s2mpb03-ldo3"; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x7f>; + }; + + s2mpb03-ldo4 { + regulator-name = "s2mpb03-ldo4"; + regulator-min-microvolt = <0x10c8e0>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x98>; + }; + + s2mpb03-ldo5 { + regulator-name = "s2mpb03-ldo5"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x7a>; + }; + + s2mpb03-ldo6 { + regulator-name = "s2mpb03-ldo6"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x8f>; + }; + + s2mpb03-ldo7 { + regulator-name = "s2mpb03-ldo7"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x75>; + }; + }; + }; + }; + }; + }; + + fragment@81 { + target = <0xffffffff>; + + __overlay__ { + interrupts = <0x0 0xc0 0x0 0x0 0x0 0xc1 0x0 0x0 0x0 0xc2 0x0 0x0 0x0 0xc3 0x0 0x0 0x0 0xc4 0x0 0x0 0x0 0xc6 0x0 0x0 0x0 0xc7 0x0 0x0 0x0 0xc9 0x0 0x0>; + interrupt-names = "pm6150_gpio1", "pm6150_gpio2", "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio5", "pm6150_gpio7", "pm6150_gpio8", "pm6150_gpio10"; + qcom,gpios-disallowed = <0x6 0x9>; + }; + }; + + fragment@82 { + target = <0xffffffff>; + + __overlay__ { + + ap_therm { + reg = <0x4e>; + label = "ap_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@83 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm { + reg = <0x4e>; + label = "pa_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + + wf_therm { + reg = <0x4f>; + label = "wf_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@84 { + target = <0xffffffff>; + + __overlay__ { + + self_display_FC3_dtsi { + label = "self_display_FC3_dtsi"; + samsung,support_self_display; + samsung,self_mask_setting_pre_revA = [29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 02 75 10]; + samsung,self_mask_setting_post_revA = [29 01 00 00 00 00 02 75 00]; + samsung,self_mask_on_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 00 00 00 95 07 9e 09 5f 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_on_factory_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_off_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_disp_debug_rx_cmds_revA = [06 01 00 00 00 00 01 7f 04 01]; + samsung,self_mask_check_tx_pre1_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 04 b0 00 27 d8 29 01 00 00 00 00 02 d8 16 29 01 00 00 00 00 0a bf 01 07 00 00 00 10 00 00 00 29 01 00 00 11 00 02 7a 00 29 01 00 00 00 00 02 75 10 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,self_mask_check_tx_pre2_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 02 75 00 29 01 00 00 22 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 01 f4 02 33 09 60 09 61 00 00 ff ff ff 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,mask_crc_pass_data = [d3 9b]; + samsung,self_mask_check_rx_cmds_revA = [06 01 00 00 00 00 01 14 02 00]; + samsung,self_mask_check_tx_post_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 00 00 00 00 00 29 01 00 00 00 00 02 bf 00 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + phandle = <0x63>; + }; + }; + }; + + fragment@85 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + label = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0x1e6>; + qcom,mdss-brightness-max-level = <0x1e6>; + qcom,mdss-brightness-default-level = <0xff>; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-t-clk-pre = <0x3e>; + qcom,mdss-dsi-t-clk-post = <0x10>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x46>; + qcom,mdss-pan-physical-height-dimension = <0x9b>; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-t-clk-pre-extend; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + qcom,ulps-enabled; + samsung,panel-vendor = "SDC"; + samsung,disp-model = "AMS667YM01"; + samsung,support_gamma_mode2; + samsung,skip_read_on_pre; + samsung,elvss_interpolation_temperature = <0xfffffff0>; + samsung,support_lpm; + samsung,support_gpara; + samsung,pointing_gpara; + samsung,two_byte_gpara; + samsung,rsc_4_frame_idle; + samsung,support_factory_panel_swap; + samsung,support-optical-fingerprint; + samsung,support_vrr_based_bl; + ss,self_display = <0x63>; + samsung,level0_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 9f a5 a5]; + samsung,level0_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 9f 5a 5a]; + samsung,level1_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 5a 5a]; + samsung,level1_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 a5 a5]; + samsung,level2_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 fc 5a 5a]; + samsung,level2_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 fc a5 a5]; + samsung,brightness_tx_cmds_revA = <0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100>; + samsung,display_on_tx_cmds_revA = [29 00 00 00 00 00 03 9f a5 a5 05 00 00 00 00 00 02 29 00 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,display_off_tx_cmds_revA = [05 01 00 00 00 00 02 28 00]; + samsung,reg_read_pos_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 00 00]; + samsung,mtp_write_sysfs_tx_cmds_revA = <0x29000000 0x3d00 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + samsung,panel_ltps_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 50 01 0c 00 04 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 3c 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,panel_ltps_tx_cmds_revC = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 50 00 0c 00 04 31 48 31 48 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 3c 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,smooth_dimming_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 91 63 29 00 00 00 00 00 02 63 20 29 01 00 00 11 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,gamma_mode2_normal_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26360 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x7290000 0x2 0x53202900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0002900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revF = <0x29000000 0x391 0x2012900 0x0 0x2532029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 1c 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,gamma_mode2_hbm_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26320 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x290000 0x2 0x53e02900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0072900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revF = <0x29000000 0x391 0x2002900 0x0 0x253e029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 14 29 00 00 00 00 00 02 53 e0 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,vrr_tx_cmds_revA = [29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f]; + samsung,acl_on_tx_cmds_revA = [29 00 00 00 00 00 04 b0 03 b3 65 29 00 00 00 00 00 14 65 55 00 b0 51 66 98 15 55 55 55 08 f1 c6 48 40 00 20 10 09 29 00 00 00 00 00 02 55 03]; + samsung,acl_off_tx_cmds_revA = [29 01 00 00 00 00 02 55 00]; + samsung,manufacture_id0_rx_cmds_revA = [06 01 00 00 00 00 01 da 01 00 00]; + samsung,manufacture_id1_rx_cmds_revA = [06 01 00 00 00 00 01 db 01 00 00]; + samsung,manufacture_id2_rx_cmds_revA = [06 01 00 00 00 00 01 dc 01 00 00]; + samsung,module_info_rx_cmds_revA = [06 01 00 00 00 00 01 a1 0b 00 00]; + samsung,octa_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 04 00 0b]; + samsung,cell_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 10 00 0f]; + samsung,cell_id_rx_cmds_revG = [06 01 00 00 00 00 01 92 10 00 02]; + samsung,ddi_id_rx_cmds_revA = [06 01 00 00 00 00 01 d6 05 00 00]; + samsung,mtp_read_sysfs_rx_cmds_revA = [06 01 00 00 00 00 01 00 00 00 00]; + samsung,candela_map_table_revA = <0x0 0x0 0x0 0x2 0x2 0x1 0x1 0x1 0x3 0x2 0x2 0x2 0x2 0x4 0x3 0x3 0x3 0x3 0x5 0x3 0x4 0x4 0x4 0x7 0x4 0x5 0x5 0x5 0x8 0x5 0x6 0x6 0x6 0xa 0x5 0x7 0x7 0x7 0xc 0x6 0x8 0x8 0x8 0xd 0x7 0x9 0x9 0x9 0xf 0x7 0xa 0xa 0xa 0x11 0x8 0xb 0xb 0xb 0x13 0x9 0xc 0xc 0xc 0x15 0xa 0xd 0xd 0xd 0x18 0xb 0xe 0xe 0xe 0x1a 0xc 0xf 0xf 0xf 0x1c 0xd 0x10 0x10 0x10 0x1e 0xd 0x11 0x11 0x11 0x20 0xe 0x12 0x12 0x12 0x23 0xf 0x13 0x13 0x13 0x25 0x10 0x14 0x14 0x14 0x28 0x11 0x15 0x15 0x15 0x2a 0x12 0x16 0x16 0x16 0x2d 0x13 0x17 0x17 0x17 0x2f 0x14 0x18 0x18 0x18 0x32 0x15 0x19 0x19 0x19 0x34 0x16 0x1a 0x1a 0x1a 0x37 0x17 0x1b 0x1b 0x1b 0x3a 0x19 0x1c 0x1c 0x1c 0x3c 0x1a 0x1d 0x1d 0x1d 0x3f 0x1b 0x1e 0x1e 0x1e 0x42 0x1c 0x1f 0x1f 0x1f 0x45 0x1d 0x20 0x20 0x20 0x47 0x1e 0x21 0x21 0x21 0x4a 0x1f 0x22 0x22 0x22 0x4d 0x20 0x23 0x23 0x23 0x50 0x22 0x24 0x24 0x24 0x53 0x23 0x25 0x25 0x25 0x56 0x24 0x26 0x26 0x26 0x59 0x25 0x27 0x27 0x27 0x5c 0x26 0x28 0x28 0x28 0x5f 0x28 0x29 0x29 0x29 0x62 0x29 0x2a 0x2a 0x2a 0x65 0x2a 0x2b 0x2b 0x2b 0x68 0x2b 0x2c 0x2c 0x2c 0x6b 0x2d 0x2d 0x2d 0x2d 0x6e 0x2e 0x2e 0x2e 0x2e 0x71 0x2f 0x2f 0x2f 0x2f 0x74 0x30 0x30 0x30 0x30 0x77 0x32 0x31 0x31 0x31 0x7b 0x33 0x32 0x32 0x32 0x7e 0x34 0x33 0x33 0x33 0x81 0x36 0x34 0x34 0x34 0x84 0x37 0x35 0x35 0x35 0x88 0x38 0x36 0x36 0x36 0x8b 0x3a 0x37 0x37 0x37 0x8e 0x3b 0x38 0x38 0x38 0x92 0x3c 0x39 0x39 0x39 0x95 0x3e 0x3a 0x3a 0x3a 0x98 0x3f 0x3b 0x3b 0x3b 0x9c 0x40 0x3c 0x3c 0x3c 0x9f 0x42 0x3d 0x3d 0x3d 0xa2 0x43 0x3e 0x3e 0x3e 0xa6 0x44 0x3f 0x3f 0x3f 0xa9 0x46 0x40 0x40 0x40 0xad 0x47 0x41 0x41 0x41 0xb0 0x49 0x42 0x42 0x42 0xb4 0x4a 0x43 0x43 0x43 0xb7 0x4c 0x44 0x44 0x44 0xbb 0x4d 0x45 0x45 0x45 0xbe 0x4e 0x46 0x46 0x46 0xc2 0x50 0x47 0x47 0x47 0xc5 0x51 0x48 0x48 0x48 0xc9 0x53 0x49 0x49 0x49 0xcd 0x54 0x4a 0x4a 0x4a 0xd0 0x56 0x4b 0x4b 0x4b 0xd4 0x57 0x4c 0x4c 0x4c 0xd7 0x59 0x4d 0x4d 0x4d 0xdb 0x5a 0x4e 0x4e 0x4e 0xdf 0x5c 0x4f 0x4f 0x4f 0xe3 0x5d 0x50 0x50 0x50 0xe6 0x5f 0x51 0x51 0x51 0xea 0x60 0x52 0x52 0x52 0xee 0x62 0x53 0x53 0x53 0xf1 0x63 0x54 0x54 0x54 0xf5 0x65 0x55 0x55 0x55 0xf9 0x66 0x56 0x56 0x56 0xfd 0x68 0x57 0x57 0x57 0x101 0x69 0x58 0x58 0x58 0x104 0x6b 0x59 0x59 0x59 0x108 0x6c 0x5a 0x5a 0x5a 0x10c 0x6e 0x5b 0x5b 0x5b 0x110 0x70 0x5c 0x5c 0x5c 0x114 0x71 0x5d 0x5d 0x5d 0x118 0x73 0x5e 0x5e 0x5e 0x11b 0x74 0x5f 0x5f 0x5f 0x11f 0x76 0x60 0x60 0x60 0x123 0x77 0x61 0x61 0x61 0x127 0x79 0x62 0x62 0x62 0x12b 0x7b 0x63 0x63 0x63 0x12f 0x7c 0x64 0x64 0x64 0x133 0x7e 0x65 0x65 0x65 0x137 0x7f 0x66 0x66 0x66 0x13b 0x81 0x67 0x67 0x67 0x13f 0x83 0x68 0x68 0x68 0x143 0x84 0x69 0x69 0x69 0x147 0x86 0x6a 0x6a 0x6a 0x14b 0x88 0x6b 0x6b 0x6b 0x14f 0x89 0x6c 0x6c 0x6c 0x153 0x8b 0x6d 0x6d 0x6d 0x157 0x8c 0x6e 0x6e 0x6e 0x15b 0x8e 0x6f 0x6f 0x6f 0x15f 0x90 0x70 0x70 0x70 0x163 0x91 0x71 0x71 0x71 0x168 0x93 0x72 0x72 0x72 0x16c 0x95 0x73 0x73 0x73 0x170 0x96 0x74 0x74 0x74 0x174 0x98 0x75 0x75 0x75 0x178 0x9a 0x76 0x76 0x76 0x17c 0x9c 0x77 0x77 0x77 0x180 0x9d 0x78 0x78 0x78 0x185 0x9f 0x79 0x79 0x79 0x189 0xa1 0x7a 0x7a 0x7a 0x18d 0xa2 0x7b 0x7b 0x7b 0x191 0xa4 0x7c 0x7c 0x7c 0x195 0xa6 0x7d 0x7d 0x7d 0x19a 0xa7 0x7e 0x7e 0x7e 0x19e 0xa9 0x7f 0x7f 0x7f 0x1a2 0xab 0x80 0x80 0x80 0x1a6 0xad 0x81 0x81 0x81 0x1ab 0xae 0x82 0x82 0x82 0x1af 0xb0 0x83 0x83 0x83 0x1b3 0xb2 0x84 0x84 0x84 0x1b8 0xb4 0x85 0x85 0x85 0x1bc 0xb5 0x86 0x86 0x86 0x1c0 0xb7 0x87 0x87 0x87 0x1c5 0xb9 0x88 0x88 0x88 0x1c9 0xbb 0x89 0x89 0x89 0x1cd 0xbc 0x8a 0x8a 0x8a 0x1d1 0xbe 0x8b 0x8b 0x8b 0x1d6 0xc0 0x8c 0x8c 0x8c 0x1da 0xc2 0x8d 0x8d 0x8d 0x1de 0xc3 0x8e 0x8e 0x8e 0x1e3 0xc5 0x8f 0x8f 0x8f 0x1e7 0xc7 0x90 0x90 0x90 0x1eb 0xc9 0x91 0x91 0x91 0x1f0 0xcb 0x92 0x92 0x92 0x1f4 0xcc 0x93 0x93 0x93 0x1f8 0xce 0x94 0x94 0x94 0x1fd 0xd0 0x95 0x95 0x95 0x201 0xd2 0x96 0x96 0x96 0x206 0xd4 0x97 0x97 0x97 0x20a 0xd6 0x98 0x98 0x98 0x20e 0xd7 0x99 0x99 0x99 0x213 0xd9 0x9a 0x9a 0x9a 0x217 0xdb 0x9b 0x9b 0x9b 0x21c 0xdd 0x9c 0x9c 0x9c 0x220 0xdf 0x9d 0x9d 0x9d 0x225 0xe1 0x9e 0x9e 0x9e 0x229 0xe2 0x9f 0x9f 0x9f 0x22e 0xe4 0xa0 0xa0 0xa0 0x232 0xe6 0xa1 0xa1 0xa1 0x237 0xe8 0xa2 0xa2 0xa2 0x23b 0xea 0xa3 0xa3 0xa3 0x240 0xec 0xa4 0xa4 0xa4 0x244 0xed 0xa5 0xa5 0xa5 0x249 0xef 0xa6 0xa6 0xa6 0x24d 0xf1 0xa7 0xa7 0xa7 0x252 0xf3 0xa8 0xa8 0xa8 0x256 0xf5 0xa9 0xa9 0xa9 0x25b 0xf7 0xaa 0xaa 0xaa 0x260 0xf9 0xab 0xab 0xab 0x264 0xfb 0xac 0xac 0xac 0x269 0xfd 0xad 0xad 0xad 0x26d 0xfe 0xae 0xae 0xae 0x272 0x100 0xaf 0xaf 0xaf 0x277 0x102 0xb0 0xb0 0xb0 0x27b 0x104 0xb1 0xb1 0xb1 0x280 0x106 0xb2 0xb2 0xb2 0x284 0x108 0xb3 0xb3 0xb3 0x289 0x10a 0xb4 0xb4 0xb4 0x28e 0x10c 0xb5 0xb5 0xb5 0x292 0x10e 0xb6 0xb6 0xb6 0x297 0x110 0xb7 0xb7 0xb7 0x29c 0x112 0xb8 0xb8 0xb8 0x2a0 0x113 0xb9 0xb9 0xb9 0x2a5 0x115 0xba 0xba 0xba 0x2aa 0x117 0xbb 0xbb 0xbb 0x2ae 0x119 0xbc 0xbc 0xbc 0x2b3 0x11b 0xbd 0xbd 0xbd 0x2b8 0x11d 0xbe 0xbe 0xbe 0x2bd 0x11f 0xbf 0xbf 0xbf 0x2c1 0x121 0xc0 0xc0 0xc0 0x2c6 0x123 0xc1 0xc1 0xc1 0x2cb 0x125 0xc2 0xc2 0xc2 0x2d0 0x127 0xc3 0xc3 0xc3 0x2d4 0x129 0xc4 0xc4 0xc4 0x2d9 0x12b 0xc5 0xc5 0xc5 0x2de 0x12d 0xc6 0xc6 0xc6 0x2e3 0x12f 0xc7 0xc7 0xc7 0x2e8 0x131 0xc8 0xc8 0xc8 0x2ec 0x133 0xc9 0xc9 0xc9 0x2f1 0x135 0xca 0xca 0xca 0x2f6 0x137 0xcb 0xcb 0xcb 0x2fb 0x139 0xcc 0xcc 0xcc 0x300 0x13b 0xcd 0xcd 0xcd 0x304 0x13d 0xce 0xce 0xce 0x309 0x13f 0xcf 0xcf 0xcf 0x30e 0x141 0xd0 0xd0 0xd0 0x313 0x143 0xd1 0xd1 0xd1 0x318 0x145 0xd2 0xd2 0xd2 0x31d 0x147 0xd3 0xd3 0xd3 0x322 0x149 0xd4 0xd4 0xd4 0x327 0x14b 0xd5 0xd5 0xd5 0x32b 0x14d 0xd6 0xd6 0xd6 0x330 0x14f 0xd7 0xd7 0xd7 0x335 0x151 0xd8 0xd8 0xd8 0x33a 0x153 0xd9 0xd9 0xd9 0x33f 0x155 0xda 0xda 0xda 0x344 0x157 0xdb 0xdb 0xdb 0x349 0x159 0xdc 0xdc 0xdc 0x34e 0x15b 0xdd 0xdd 0xdd 0x353 0x15d 0xde 0xde 0xde 0x358 0x15f 0xdf 0xdf 0xdf 0x35d 0x161 0xe0 0xe0 0xe0 0x362 0x163 0xe1 0xe1 0xe1 0x367 0x165 0xe2 0xe2 0xe2 0x36c 0x167 0xe3 0xe3 0xe3 0x371 0x169 0xe4 0xe4 0xe4 0x376 0x16b 0xe5 0xe5 0xe5 0x37b 0x16d 0xe6 0xe6 0xe6 0x380 0x170 0xe7 0xe7 0xe7 0x385 0x172 0xe8 0xe8 0xe8 0x38a 0x174 0xe9 0xe9 0xe9 0x38f 0x176 0xea 0xea 0xea 0x394 0x178 0xeb 0xeb 0xeb 0x399 0x17a 0xec 0xec 0xec 0x39e 0x17c 0xed 0xed 0xed 0x3a3 0x17e 0xee 0xee 0xee 0x3a8 0x180 0xef 0xef 0xef 0x3ad 0x182 0xf0 0xf0 0xf0 0x3b2 0x184 0xf1 0xf1 0xf1 0x3b7 0x186 0xf2 0xf2 0xf2 0x3bc 0x189 0xf3 0xf3 0xf3 0x3c1 0x18b 0xf4 0xf4 0xf4 0x3c7 0x18d 0xf5 0xf5 0xf5 0x3cc 0x18f 0xf6 0xf6 0xf6 0x3d1 0x191 0xf7 0xf7 0xf7 0x3d6 0x193 0xf8 0xf8 0xf8 0x3db 0x195 0xf9 0xf9 0xf9 0x3e0 0x197 0xfa 0xfa 0xfa 0x3e5 0x199 0xfb 0xfb 0xfb 0x3ea 0x19b 0xfc 0xfc 0xfc 0x3f0 0x19e 0xfd 0xfd 0xfd 0x3f5 0x1a0 0xfe 0xfe 0xfe 0x3fa 0x1a2 0xff 0xff 0xff 0x3ff 0x1a4>; + samsung,hbm_candela_map_table_revG = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x2 0x1aa 0x2 0x102 0x102 0x4 0x1ac 0x3 0x103 0x103 0x6 0x1ae 0x4 0x104 0x104 0x8 0x1b0 0x5 0x105 0x105 0xa 0x1b1 0x6 0x106 0x106 0xc 0x1b3 0x7 0x107 0x107 0xe 0x1b4 0x8 0x108 0x108 0x10 0x1b6 0x9 0x109 0x109 0x12 0x1b8 0xa 0x10a 0x10a 0x14 0x1b9 0xb 0x10b 0x10b 0x16 0x1bb 0xc 0x10c 0x10c 0x18 0x1bc 0xd 0x10d 0x10d 0x1a 0x1be 0xe 0x10e 0x10e 0x1c 0x1c0 0xf 0x10f 0x10f 0x1e 0x1c2 0x10 0x110 0x110 0x20 0x1c3 0x11 0x111 0x111 0x22 0x1c5 0x12 0x112 0x112 0x24 0x1c6 0x13 0x113 0x113 0x25 0x1c8 0x14 0x114 0x114 0x26 0x1ca 0x15 0x115 0x115 0x27 0x1cb 0x16 0x116 0x116 0x28 0x1cd 0x17 0x117 0x117 0x29 0x1ce 0x18 0x118 0x118 0x2a 0x1d0 0x19 0x119 0x119 0x2b 0x1d2 0x1a 0x11a 0x11a 0x2c 0x1d4 0x1b 0x11b 0x11b 0x2d 0x1d5 0x1c 0x11c 0x11c 0x2e 0x1d7 0x1d 0x11d 0x11d 0x2f 0x1d8 0x1e 0x11e 0x11e 0x30 0x1da 0x1f 0x11f 0x11f 0x31 0x1dc 0x20 0x120 0x120 0x32 0x1dd 0x21 0x121 0x121 0x33 0x1df 0x22 0x122 0x122 0x34 0x1e0 0x23 0x123 0x123 0x35 0x1e2 0x24 0x124 0x124 0x36 0x1e4 0x25 0x125 0x125 0x37 0x1e5 0x26 0x126 0x126 0x38 0x1e7 0x27 0x127 0x127 0x39 0x1e8 0x28 0x128 0x128 0x3a 0x1ea 0x29 0x129 0x129 0x3b 0x1ec 0x2a 0x12a 0x12a 0x3c 0x1ee 0x2b 0x12b 0x12b 0x3d 0x1ef 0x2c 0x12c 0x12c 0x3e 0x1f1 0x2d 0x12d 0x12d 0x3f 0x1f2 0x2e 0x12e 0x12e 0x40 0x1f4 0x2f 0x12f 0x12f 0x41 0x1f6 0x30 0x130 0x130 0x42 0x1f7 0x31 0x131 0x131 0x43 0x1f9 0x32 0x132 0x132 0x44 0x1fa 0x33 0x133 0x133 0x45 0x1fc 0x34 0x134 0x134 0x46 0x1fe 0x35 0x135 0x135 0x47 0x200 0x36 0x136 0x136 0x48 0x201 0x37 0x137 0x137 0x49 0x203 0x38 0x138 0x138 0x4a 0x204 0x39 0x139 0x139 0x4b 0x206 0x3a 0x13a 0x13a 0x4c 0x208 0x3b 0x13b 0x13b 0x4d 0x209 0x3c 0x13c 0x13c 0x4e 0x20b 0x3d 0x13d 0x13d 0x4f 0x20c 0x3e 0x13e 0x13e 0x50 0x20e 0x3f 0x13f 0x13f 0x51 0x210 0x40 0x140 0x140 0x52 0x211 0x41 0x141 0x141 0x53 0x213 0x42 0x142 0x142 0x54 0x215 0x43 0x143 0x143 0x55 0x216 0x44 0x144 0x144 0x56 0x218 0x45 0x145 0x145 0x57 0x21a 0x46 0x146 0x146 0x58 0x21b 0x47 0x147 0x147 0x59 0x21d 0x48 0x148 0x148 0x5a 0x21e 0x49 0x149 0x149 0x5b 0x220 0x4a 0x14a 0x14a 0x5c 0x222 0x4b 0x14b 0x14b 0x5d 0x223 0x4c 0x14c 0x14c 0x5f 0x225 0x4d 0x14d 0x14d 0x61 0x226 0x4e 0x14e 0x14e 0x63 0x228 0x4f 0x14f 0x14f 0x65 0x22a 0x50 0x150 0x150 0x67 0x22b 0x51 0x151 0x151 0x69 0x22d 0x52 0x152 0x152 0x6b 0x22f 0x53 0x153 0x153 0x6d 0x230 0x54 0x154 0x154 0x6f 0x232 0x55 0x155 0x155 0x71 0x234 0x56 0x156 0x156 0x73 0x235 0x57 0x157 0x157 0x75 0x237 0x58 0x158 0x158 0x77 0x238 0x59 0x159 0x159 0x79 0x23a 0x5a 0x15a 0x15a 0x7b 0x23c 0x5b 0x15b 0x15b 0x7d 0x23d 0x5c 0x15c 0x15c 0x7f 0x23f 0x5d 0x15d 0x15d 0x81 0x241 0x5e 0x15e 0x15e 0x83 0x242 0x5f 0x15f 0x15f 0x85 0x244 0x60 0x160 0x160 0x87 0x246 0x61 0x161 0x161 0x89 0x247 0x62 0x162 0x162 0x8b 0x249 0x63 0x163 0x163 0x8d 0x24a 0x64 0x164 0x164 0x8f 0x24c 0x65 0x165 0x165 0x91 0x24e 0x66 0x166 0x166 0x93 0x24f 0x67 0x167 0x167 0x95 0x251 0x68 0x168 0x168 0x97 0x253 0x69 0x169 0x169 0x9a 0x254 0x6a 0x16a 0x16a 0x9d 0x256 0x6b 0x16b 0x16b 0xa0 0x257 0x6c 0x16c 0x16c 0xa3 0x259 0x6d 0x16d 0x16d 0xa6 0x25b 0x6e 0x16e 0x16e 0xa8 0x25c 0x6f 0x16f 0x16f 0xab 0x25e 0x70 0x170 0x170 0xae 0x260 0x71 0x171 0x171 0xb1 0x261 0x72 0x172 0x172 0xb4 0x263 0x73 0x173 0x173 0xb7 0x264 0x74 0x174 0x174 0xba 0x266 0x75 0x175 0x175 0xbd 0x268 0x76 0x176 0x176 0xc0 0x269 0x77 0x177 0x177 0xc3 0x26b 0x78 0x178 0x178 0xc6 0x26d 0x79 0x179 0x179 0xc9 0x26e 0x7a 0x17a 0x17a 0xcc 0x270 0x7b 0x17b 0x17b 0xcf 0x272 0x7c 0x17c 0x17c 0xd2 0x273 0x7d 0x17d 0x17d 0xd5 0x275 0x7e 0x17e 0x17e 0xd8 0x276 0x7f 0x17f 0x17f 0xdb 0x278 0x80 0x180 0x180 0xde 0x27a 0x81 0x181 0x181 0xe1 0x27b 0x82 0x182 0x182 0xe4 0x27d 0x83 0x183 0x183 0xe7 0x27f 0x84 0x184 0x184 0xea 0x280 0x85 0x185 0x185 0xed 0x282 0x86 0x186 0x186 0xf0 0x283 0x87 0x187 0x187 0xf3 0x285 0x88 0x188 0x188 0xf6 0x287 0x89 0x189 0x189 0xf9 0x288 0x8a 0x18a 0x18a 0xfc 0x28a 0x8b 0x18b 0x18b 0xff 0x28c 0x8c 0x18c 0x18c 0x102 0x28d 0x8d 0x18d 0x18d 0x105 0x28f 0x8e 0x18e 0x18e 0x108 0x291 0x8f 0x18f 0x18f 0x10b 0x292 0x90 0x190 0x190 0x10e 0x294 0x91 0x191 0x191 0x111 0x295 0x92 0x192 0x192 0x114 0x297 0x93 0x193 0x193 0x117 0x299 0x94 0x194 0x194 0x11a 0x29a 0x95 0x195 0x195 0x11d 0x29c 0x96 0x196 0x196 0x120 0x29e 0x97 0x197 0x197 0x123 0x29f 0x98 0x198 0x198 0x126 0x2a1 0x99 0x199 0x199 0x129 0x2a3 0x9a 0x19a 0x19a 0x12c 0x2a4 0x9b 0x19b 0x19b 0x12f 0x2a6 0x9c 0x19c 0x19c 0x132 0x2a7 0x9d 0x19d 0x19d 0x135 0x2a9 0x9e 0x19e 0x19e 0x138 0x2ab 0x9f 0x19f 0x19f 0x13b 0x2ac 0xa0 0x1a0 0x1a0 0x13e 0x2ae 0xa1 0x1a1 0x1a1 0x141 0x2af 0xa2 0x1a2 0x1a2 0x144 0x2b1 0xa3 0x1a3 0x1a3 0x147 0x2b3 0xa4 0x1a4 0x1a4 0x14a 0x2b4 0xa5 0x1a5 0x1a5 0x14d 0x2b6 0xa6 0x1a6 0x1a6 0x150 0x2b8 0xa7 0x1a7 0x1a7 0x153 0x2b9 0xa8 0x1a8 0x1a8 0x156 0x2bb 0xa9 0x1a9 0x1a9 0x159 0x2bd 0xaa 0x1aa 0x1aa 0x15c 0x2be 0xab 0x1ab 0x1ab 0x15f 0x2c0 0xac 0x1ac 0x1ac 0x162 0x2c1 0xad 0x1ad 0x1ad 0x165 0x2c3 0xae 0x1ae 0x1ae 0x168 0x2c5 0xaf 0x1af 0x1af 0x16b 0x2c6 0xb0 0x1b0 0x1b0 0x16e 0x2c8 0xb1 0x1b1 0x1b1 0x171 0x2c9 0xb2 0x1b2 0x1b2 0x174 0x2cb 0xb3 0x1b3 0x1b3 0x177 0x2cd 0xb4 0x1b4 0x1b4 0x17a 0x2cf 0xb5 0x1b5 0x1b5 0x17d 0x2d0 0xb6 0x1b6 0x1b6 0x180 0x2d2 0xb7 0x1b7 0x1b7 0x183 0x2d3 0xb8 0x1b8 0x1b8 0x186 0x2d5 0xb9 0x1b9 0x1b9 0x189 0x2d7 0xba 0x1ba 0x1ba 0x18c 0x2d8 0xbb 0x1bb 0x1bb 0x18f 0x2da 0xbc 0x1bc 0x1bc 0x192 0x2db 0xbd 0x1bd 0x1bd 0x195 0x2dd 0xbe 0x1be 0x1be 0x198 0x2df 0xbf 0x1bf 0x1bf 0x19b 0x2e1 0xc0 0x1c0 0x1c0 0x19e 0x2e2 0xc1 0x1c1 0x1c1 0x1a1 0x2e4 0xc2 0x1c2 0x1c2 0x1a4 0x2e5 0xc3 0x1c3 0x1c3 0x1a7 0x2e7 0xc4 0x1c4 0x1c4 0x1aa 0x2e9 0xc5 0x1c5 0x1c5 0x1ad 0x2ea 0xc6 0x1c6 0x1c6 0x1b0 0x2ec 0xc7 0x1c7 0x1c7 0x1b3 0x2ed 0xc8 0x1c8 0x1c8 0x1b6 0x2ef 0xc9 0x1c9 0x1c9 0x1b9 0x2f1 0xca 0x1ca 0x1ca 0x1bc 0x2f2 0xcb 0x1cb 0x1cb 0x1bf 0x2f4 0xcc 0x1cc 0x1cc 0x1c2 0x2f5 0xcd 0x1cd 0x1cd 0x1c5 0x2f7 0xce 0x1ce 0x1ce 0x1c8 0x2f9 0xcf 0x1cf 0x1cf 0x1cb 0x2fb 0xd0 0x1d0 0x1d0 0x1ce 0x2fc 0xd1 0x1d1 0x1d1 0x1d1 0x2fe 0xd2 0x1d2 0x1d2 0x1d4 0x2ff 0xd3 0x1d3 0x1d3 0x1d7 0x301 0xd4 0x1d4 0x1d4 0x1da 0x303 0xd5 0x1d5 0x1d5 0x1dd 0x304 0xd6 0x1d6 0x1d6 0x1e0 0x306 0xd7 0x1d7 0x1d7 0x1e3 0x307 0xd8 0x1d8 0x1d8 0x1e6 0x309 0xd9 0x1d9 0x1d9 0x1e9 0x30b 0xda 0x1da 0x1da 0x1ec 0x30d 0xdb 0x1db 0x1db 0x1ef 0x30e 0xdc 0x1dc 0x1dc 0x1f2 0x310 0xdd 0x1dd 0x1dd 0x1f5 0x311 0xde 0x1de 0x1de 0x1f8 0x313 0xdf 0x1df 0x1df 0x1fb 0x315 0xe0 0x1e0 0x1e0 0x1fe 0x316 0xe1 0x1e1 0x1e1 0x201 0x318 0xe2 0x1e2 0x1e2 0x204 0x319 0xe3 0x1e3 0x1e3 0x207 0x31b 0xe4 0x1e4 0x1e4 0x20a 0x31d 0xe5 0x1e5 0x1e5 0x20d 0x31f 0xe6 0x1e6 0x1e6 0x210 0x320>; + samsung,hbm_candela_map_table_revA = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x3 0x1aa 0x2 0x102 0x102 0x6 0x1ac 0x3 0x103 0x103 0x9 0x1ae 0x4 0x104 0x104 0xc 0x1b0 0x5 0x105 0x105 0xf 0x1b1 0x6 0x106 0x106 0x12 0x1b3 0x7 0x107 0x107 0x15 0x1b4 0x8 0x108 0x108 0x18 0x1b6 0x9 0x109 0x109 0x1b 0x1b8 0xa 0x10a 0x10a 0x1e 0x1b9 0xb 0x10b 0x10b 0x21 0x1bb 0xc 0x10c 0x10c 0x24 0x1bc 0xd 0x10d 0x10d 0x27 0x1be 0xe 0x10e 0x10e 0x2a 0x1c0 0xf 0x10f 0x10f 0x2d 0x1c2 0x10 0x110 0x110 0x30 0x1c3 0x11 0x111 0x111 0x33 0x1c5 0x12 0x112 0x112 0x36 0x1c6 0x13 0x113 0x113 0x39 0x1c8 0x14 0x114 0x114 0x3c 0x1ca 0x15 0x115 0x115 0x3f 0x1cb 0x16 0x116 0x116 0x42 0x1cd 0x17 0x117 0x117 0x45 0x1ce 0x18 0x118 0x118 0x48 0x1d0 0x19 0x119 0x119 0x4b 0x1d2 0x1a 0x11a 0x11a 0x4e 0x1d4 0x1b 0x11b 0x11b 0x51 0x1d5 0x1c 0x11c 0x11c 0x54 0x1d7 0x1d 0x11d 0x11d 0x56 0x1d8 0x1e 0x11e 0x11e 0x58 0x1da 0x1f 0x11f 0x11f 0x5a 0x1dc 0x20 0x120 0x120 0x5c 0x1dd 0x21 0x121 0x121 0x5e 0x1df 0x22 0x122 0x122 0x60 0x1e0 0x23 0x123 0x123 0x62 0x1e2 0x24 0x124 0x124 0x64 0x1e4 0x25 0x125 0x125 0x66 0x1e5 0x26 0x126 0x126 0x68 0x1e7 0x27 0x127 0x127 0x6a 0x1e8 0x28 0x128 0x128 0x6c 0x1ea 0x29 0x129 0x129 0x6e 0x1ec 0x2a 0x12a 0x12a 0x70 0x1ee 0x2b 0x12b 0x12b 0x72 0x1ef 0x2c 0x12c 0x12c 0x74 0x1f1 0x2d 0x12d 0x12d 0x76 0x1f2 0x2e 0x12e 0x12e 0x78 0x1f4 0x2f 0x12f 0x12f 0x7a 0x1f6 0x30 0x130 0x130 0x7c 0x1f7 0x31 0x131 0x131 0x7e 0x1f9 0x32 0x132 0x132 0x80 0x1fa 0x33 0x133 0x133 0x82 0x1fc 0x34 0x134 0x134 0x84 0x1fe 0x35 0x135 0x135 0x86 0x200 0x36 0x136 0x136 0x88 0x201 0x37 0x137 0x137 0x8a 0x203 0x38 0x138 0x138 0x8c 0x204 0x39 0x139 0x139 0x8e 0x206 0x3a 0x13a 0x13a 0x90 0x208 0x3b 0x13b 0x13b 0x92 0x209 0x3c 0x13c 0x13c 0x94 0x20b 0x3d 0x13d 0x13d 0x96 0x20c 0x3e 0x13e 0x13e 0x98 0x20e 0x3f 0x13f 0x13f 0x9a 0x210 0x40 0x140 0x140 0x9c 0x211 0x41 0x141 0x141 0x9e 0x213 0x42 0x142 0x142 0xa0 0x215 0x43 0x143 0x143 0xa2 0x216 0x44 0x144 0x144 0xa4 0x218 0x45 0x145 0x145 0xa6 0x21a 0x46 0x146 0x146 0xa8 0x21b 0x47 0x147 0x147 0xaa 0x21d 0x48 0x148 0x148 0xac 0x21e 0x49 0x149 0x149 0xae 0x220 0x4a 0x14a 0x14a 0xb0 0x222 0x4b 0x14b 0x14b 0xb2 0x223 0x4c 0x14c 0x14c 0xb6 0x225 0x4d 0x14d 0x14d 0xba 0x226 0x4e 0x14e 0x14e 0xbe 0x228 0x4f 0x14f 0x14f 0xc2 0x22a 0x50 0x150 0x150 0xc6 0x22b 0x51 0x151 0x151 0xcb 0x22d 0x52 0x152 0x152 0xd0 0x22f 0x53 0x153 0x153 0xd5 0x230 0x54 0x154 0x154 0xda 0x232 0x55 0x155 0x155 0xdf 0x234 0x56 0x156 0x156 0xe4 0x235 0x57 0x157 0x157 0xe9 0x237 0x58 0x158 0x158 0xee 0x238 0x59 0x159 0x159 0xf3 0x23a 0x5a 0x15a 0x15a 0xf8 0x23c 0x5b 0x15b 0x15b 0xfd 0x23d 0x5c 0x15c 0x15c 0x102 0x23f 0x5d 0x15d 0x15d 0x107 0x241 0x5e 0x15e 0x15e 0x10c 0x242 0x5f 0x15f 0x15f 0x111 0x244 0x60 0x160 0x160 0x116 0x246 0x61 0x161 0x161 0x11b 0x247 0x62 0x162 0x162 0x120 0x249 0x63 0x163 0x163 0x125 0x24a 0x64 0x164 0x164 0x12a 0x24c 0x65 0x165 0x165 0x12f 0x24e 0x66 0x166 0x166 0x134 0x24f 0x67 0x167 0x167 0x139 0x251 0x68 0x168 0x168 0x13e 0x253 0x69 0x169 0x169 0x143 0x254 0x6a 0x16a 0x16a 0x148 0x256 0x6b 0x16b 0x16b 0x14d 0x257 0x6c 0x16c 0x16c 0x152 0x259 0x6d 0x16d 0x16d 0x157 0x25b 0x6e 0x16e 0x16e 0x15c 0x25c 0x6f 0x16f 0x16f 0x161 0x25e 0x70 0x170 0x170 0x166 0x260 0x71 0x171 0x171 0x16b 0x261 0x72 0x172 0x172 0x170 0x263 0x73 0x173 0x173 0x175 0x264 0x74 0x174 0x174 0x17a 0x266 0x75 0x175 0x175 0x17f 0x268 0x76 0x176 0x176 0x184 0x269 0x77 0x177 0x177 0x189 0x26b 0x78 0x178 0x178 0x18e 0x26d 0x79 0x179 0x179 0x193 0x26e 0x7a 0x17a 0x17a 0x198 0x270 0x7b 0x17b 0x17b 0x19d 0x272 0x7c 0x17c 0x17c 0x1a2 0x273 0x7d 0x17d 0x17d 0x1a7 0x275 0x7e 0x17e 0x17e 0x1ac 0x276 0x7f 0x17f 0x17f 0x1b1 0x278 0x80 0x180 0x180 0x1b6 0x27a 0x81 0x181 0x181 0x1bb 0x27b 0x82 0x182 0x182 0x1c0 0x27d 0x83 0x183 0x183 0x1c5 0x27f 0x84 0x184 0x184 0x1ca 0x280 0x85 0x185 0x185 0x1cf 0x282 0x86 0x186 0x186 0x1d4 0x283 0x87 0x187 0x187 0x1d9 0x285 0x88 0x188 0x188 0x1de 0x287 0x89 0x189 0x189 0x1e3 0x288 0x8a 0x18a 0x18a 0x1e8 0x28a 0x8b 0x18b 0x18b 0x1ed 0x28c 0x8c 0x18c 0x18c 0x1f2 0x28d 0x8d 0x18d 0x18d 0x1f7 0x28f 0x8e 0x18e 0x18e 0x1fc 0x291 0x8f 0x18f 0x18f 0x201 0x292 0x90 0x190 0x190 0x206 0x294 0x91 0x191 0x191 0x20b 0x295 0x92 0x192 0x192 0x210 0x297 0x93 0x193 0x193 0x215 0x299 0x94 0x194 0x194 0x21a 0x29a 0x95 0x195 0x195 0x21f 0x29c 0x96 0x196 0x196 0x224 0x29e 0x97 0x197 0x197 0x229 0x29f 0x98 0x198 0x198 0x22e 0x2a1 0x99 0x199 0x199 0x233 0x2a3 0x9a 0x19a 0x19a 0x238 0x2a4 0x9b 0x19b 0x19b 0x23d 0x2a6 0x9c 0x19c 0x19c 0x242 0x2a7 0x9d 0x19d 0x19d 0x247 0x2a9 0x9e 0x19e 0x19e 0x24d 0x2ab 0x9f 0x19f 0x19f 0x253 0x2ac 0xa0 0x1a0 0x1a0 0x259 0x2ae 0xa1 0x1a1 0x1a1 0x25f 0x2af 0xa2 0x1a2 0x1a2 0x265 0x2b1 0xa3 0x1a3 0x1a3 0x26b 0x2b3 0xa4 0x1a4 0x1a4 0x271 0x2b4 0xa5 0x1a5 0x1a5 0x277 0x2b6 0xa6 0x1a6 0x1a6 0x27d 0x2b8 0xa7 0x1a7 0x1a7 0x283 0x2b9 0xa8 0x1a8 0x1a8 0x289 0x2bb 0xa9 0x1a9 0x1a9 0x28f 0x2bd 0xaa 0x1aa 0x1aa 0x295 0x2be 0xab 0x1ab 0x1ab 0x29b 0x2c0 0xac 0x1ac 0x1ac 0x2a1 0x2c1 0xad 0x1ad 0x1ad 0x2a7 0x2c3 0xae 0x1ae 0x1ae 0x2ad 0x2c5 0xaf 0x1af 0x1af 0x2b3 0x2c6 0xb0 0x1b0 0x1b0 0x2b9 0x2c8 0xb1 0x1b1 0x1b1 0x2bf 0x2c9 0xb2 0x1b2 0x1b2 0x2c5 0x2cb 0xb3 0x1b3 0x1b3 0x2cb 0x2cd 0xb4 0x1b4 0x1b4 0x2d1 0x2cf 0xb5 0x1b5 0x1b5 0x2d7 0x2d0 0xb6 0x1b6 0x1b6 0x2dd 0x2d2 0xb7 0x1b7 0x1b7 0x2e3 0x2d3 0xb8 0x1b8 0x1b8 0x2e9 0x2d5 0xb9 0x1b9 0x1b9 0x2ef 0x2d7 0xba 0x1ba 0x1ba 0x2f5 0x2d8 0xbb 0x1bb 0x1bb 0x2fb 0x2da 0xbc 0x1bc 0x1bc 0x301 0x2db 0xbd 0x1bd 0x1bd 0x307 0x2dd 0xbe 0x1be 0x1be 0x30d 0x2df 0xbf 0x1bf 0x1bf 0x313 0x2e1 0xc0 0x1c0 0x1c0 0x319 0x2e2 0xc1 0x1c1 0x1c1 0x31f 0x2e4 0xc2 0x1c2 0x1c2 0x325 0x2e5 0xc3 0x1c3 0x1c3 0x32b 0x2e7 0xc4 0x1c4 0x1c4 0x331 0x2e9 0xc5 0x1c5 0x1c5 0x337 0x2ea 0xc6 0x1c6 0x1c6 0x33d 0x2ec 0xc7 0x1c7 0x1c7 0x343 0x2ed 0xc8 0x1c8 0x1c8 0x349 0x2ef 0xc9 0x1c9 0x1c9 0x34f 0x2f1 0xca 0x1ca 0x1ca 0x355 0x2f2 0xcb 0x1cb 0x1cb 0x35b 0x2f4 0xcc 0x1cc 0x1cc 0x361 0x2f5 0xcd 0x1cd 0x1cd 0x367 0x2f7 0xce 0x1ce 0x1ce 0x36d 0x2f9 0xcf 0x1cf 0x1cf 0x373 0x2fb 0xd0 0x1d0 0x1d0 0x379 0x2fc 0xd1 0x1d1 0x1d1 0x37f 0x2fe 0xd2 0x1d2 0x1d2 0x385 0x2ff 0xd3 0x1d3 0x1d3 0x38b 0x301 0xd4 0x1d4 0x1d4 0x391 0x303 0xd5 0x1d5 0x1d5 0x397 0x304 0xd6 0x1d6 0x1d6 0x39d 0x306 0xd7 0x1d7 0x1d7 0x3a3 0x307 0xd8 0x1d8 0x1d8 0x3a9 0x309 0xd9 0x1d9 0x1d9 0x3af 0x30b 0xda 0x1da 0x1da 0x3b5 0x30d 0xdb 0x1db 0x1db 0x3bb 0x30e 0xdc 0x1dc 0x1dc 0x3c1 0x310 0xdd 0x1dd 0x1dd 0x3c7 0x311 0xde 0x1de 0x1de 0x3cd 0x313 0xdf 0x1df 0x1df 0x3d3 0x315 0xe0 0x1e0 0x1e0 0x3d9 0x316 0xe1 0x1e1 0x1e1 0x3df 0x318 0xe2 0x1e2 0x1e2 0x3e5 0x319 0xe3 0x1e3 0x1e3 0x3eb 0x31b 0xe4 0x1e4 0x1e4 0x3f1 0x31d 0xe5 0x1e5 0x1e5 0x3f7 0x31f 0xe6 0x1e6 0x1e6 0x3ff 0x320>; + samsung,aod_candela_map_table_revA = <0x0 0x0 0xb 0x1b 0x2 0x1 0xc 0x1f 0x1a 0xa 0x2 0x20 0x36 0x19 0x1e 0x3 0x37 0xff 0x18 0x3c>; + samsung,support_dynamic_mipi_clk; + samsung,ffc_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 2e c5 29 00 00 00 00 00 03 c5 36 41 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,ffc_tx_cmds_revC = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 33 43 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,ffc_tx_cmds_revD = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 32 b1 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revA = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53641 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c535a8 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53741>; + samsung,dyn_mipi_clk_ffc_cmds_revC = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53343 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b2 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53435>; + samsung,dyn_mipi_clk_ffc_cmds_revD = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b1 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53222 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c533a0>; + samsung,dynamic_mipi_clk_timing_table = <0x65fbc9c0 0x671db480 0x6422c400>; + samsung,dynamic_mipi_clk_sel_table = <0x1 0x1 0x0 0x0 0x0 0x1 0x2 0x0 0x0 0x2 0x1 0x3 0x0 0x0 0x2 0x1 0x4 0x0 0x0 0x1 0x2 0xb 0x2942 0x29a2 0x0 0x2 0xb 0x29a3 0x29e8 0x1 0x2 0xb 0x29e9 0x2a56 0x0 0x2 0xc 0x25be 0x26d2 0x0 0x2 0xd 0x48a 0x54d 0x0 0x2 0xd 0x54e 0x593 0x1 0x2 0xd 0x594 0x5e9 0x0 0x2 0xe 0x601 0x661 0x0 0x2 0xe 0x662 0x6a7 0x1 0x2 0xe 0x6a8 0x6ca 0x0 0x2 0xf 0x1105 0x116a 0x0 0x2 0x11 0x8bd 0x8e6 0x0 0x2 0x11 0x8e7 0x92c 0x1 0x2 0x11 0x92d 0xa03 0x0 0x2 0x12 0xb79 0xb86 0x1 0x2 0x12 0xb87 0xb98 0x2 0x2 0x12 0xb99 0xc10 0x0 0x3 0x5b 0x0 0xd9 0x0 0x3 0x5b 0xda 0x165 0x1 0x3 0x5b 0x166 0x257 0x0 0x3 0x5c 0x258 0x26a 0x1 0x3 0x5c 0x26b 0x4a7 0x0 0x3 0x5c 0x4a8 0x4af 0x1 0x3 0x5d 0x4b0 0x64f 0x0 0x3 0x5d 0x650 0x6db 0x1 0x3 0x5d 0x6dc 0x79d 0x0 0x3 0x5e 0x79e 0x877 0x0 0x3 0x5e 0x878 0x903 0x1 0x3 0x5e 0x904 0x95f 0x0 0x3 0x5f 0x960 0xa59 0x0 0x3 0x61 0xabe 0xb29 0x0 0x3 0x61 0xb2a 0xbb5 0x1 0x3 0x61 0xbb6 0xd79 0x0 0x3 0x62 0xd7a 0xdac 0x1 0x3 0x62 0xdad 0xdd1 0x2 0x3 0x62 0xdd2 0xed7 0x0 0x3 0x66 0x1392 0x143b 0x0 0x3 0x67 0x143c 0x149f 0x0 0x3 0x68 0x14a0 0x1503 0x0 0x3 0x6b 0x1662 0x16d9 0x0 0x3 0x6c 0x16da 0x16f2 0x2 0x3 0x6c 0x16f3 0x176f 0x0 0x3 0x6d 0x1770 0x1805 0x0 0x3 0x6e 0x1806 0x1808 0x2 0x3 0x6e 0x1809 0x1931 0x0 0x3 0x6f 0x1932 0x1984 0x1 0x3 0x6f 0x1985 0x19c7 0x0 0x3 0x73 0x1f68 0x1f7a 0x1 0x3 0x73 0x1f7b 0x21b7 0x0 0x3 0x73 0x21b8 0x21f1 0x1 0x3 0x74 0x21f2 0x2214 0x2 0x3 0x74 0x2215 0x234f 0x0 0x3 0x76 0x23fa 0x24ba 0x0 0x3 0x76 0x24bb 0x2511 0x1 0x3 0x76 0x2512 0x2546 0x2 0x3 0x76 0x2547 0x25bb 0x0 0x3 0x77 0x25bc 0x25d9 0x2 0x3 0x77 0x25da 0x2629 0x0 0x3 0x78 0x262a 0x268a 0x1 0x3 0x78 0x268b 0x268d 0x0 0x3 0x7a 0x26c0 0x283d 0x0 0x3 0x7a 0x283e 0x2877 0x1 0x3 0x7c 0x8d68 0x8dfd 0x0 0x3 0x80 0x9376 0x9398 0x1 0x3 0x80 0x9399 0x9569 0x0 0x3 0x81 0x956a 0x96e4 0x0 0x3 0x81 0x96e5 0x96f9 0x1 0x3 0x82 0x96fa 0x98c2 0x0 0x3 0x82 0x98c3 0x994e 0x1 0x3 0x82 0x994f 0x9ae1 0x0 0x3 0x83 0x9ae2 0x9b20 0x1 0x3 0x83 0x9b21 0x9d5c 0x0 0x3 0x83 0x9d5d 0x9de8 0x1 0x3 0x83 0x9de9 0xa025 0x0 0x3 0x83 0xa026 0xa0b1 0x1 0x3 0x83 0xa0b2 0xa275 0x0 0x3 0x84 0xa276 0xa30c 0x0 0x3 0x84 0xa30d 0xa398 0x1 0x3 0x84 0xa399 0xa5d4 0x0 0x3 0x84 0xa5d5 0xa660 0x1 0x3 0x84 0xa661 0xa89d 0x0 0x3 0x84 0xa89e 0xa929 0x1 0x3 0x84 0xa92a 0xaa45 0x0 0x3 0x8a 0xd7c8 0xd813 0x0 0x3 0x8a 0xd814 0xd89f 0x1 0x3 0x8a 0xd8a0 0xdadc 0x0 0x3 0x8a 0xdadd 0xdb68 0x1 0x3 0x8a 0xdb69 0xdda3 0x0 0x3 0x9c 0x10384 0x1045d 0x0 0x3 0x9c 0x1045e 0x104e9 0x1 0x3 0x9c 0x104ea 0x10707 0x0 0x3 0xa1 0x10bea 0x10c9a 0x0 0x3 0xa1 0x10c9b 0x10ce1 0x1 0x3 0xa1 0x10ce2 0x10d26 0x2 0x3 0xa1 0x10d27 0x10d47 0x0 0x4 0x33 0x0 0x0 0x0 0x4 0x34 0x0 0x0 0x0 0x4 0x35 0x0 0x0 0x1 0x4 0x36 0x0 0x0 0x0 0x4 0x37 0x0 0x0 0x2 0x4 0x38 0x0 0x0 0x1 0x5 0x3d 0x0 0x0 0x2 0x5 0x3e 0x0 0x0 0x0 0x5 0x47 0x0 0x0 0x2>; + samsung,fd_on_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 40 40 29 01 00 00 78 00 03 f0 a5 a5]; + samsung,fd_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 80 40 29 01 00 00 78 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 91 01 01 29 00 00 00 00 00 02 53 27 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 3c 0d 00 00 00 00 3c 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 38 00 00 00 18 03 38 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 24 a4 29 01 00 00 00 00 02 f7 0f 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revA = <0x29000000 0x3f0 0x5a5a2900 0x0 0x3910101 0x29010000 0x253 0x26290000 0x2 0xf70f2901 0x1100 0x3f0a5a5>; + samsung,lpm_off_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 40 0d 00 00 00 00 40 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 3d 00 00 00 18 03 3d 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 26 e4 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_60nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 24]; + samsung,lpm_30nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 25]; + samsung,lpm_10nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 26]; + samsung,lpm_2nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 27]; + samsung,lpm_brightnes_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 02 53 26 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xe>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + samsung,ub-con-det = <0xffffffff 0x5 0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "irq_check"; + qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; + samsung,esd-irq-gpio1 = <0xffffffff 0xb 0x0>; + phandle = <0xe>; + + qcom,mdss-dsi-display-timings { + + fhd90 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0xf>; + qcom,mdss-dsi-panel-framerate = <0x5a>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x2590>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 1e 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 54 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 03 60 08 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 5a 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + + fhd60 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0x10>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x3dfa>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 1e 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 54 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 5a 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + + qcom,panel-supply-entries { + #address-cells = <0x1>; + #size-cells = <0x0>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vci"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vddi"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1b7740>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x2>; + }; + }; + }; + }; + }; + + fragment@86 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_PBA_BOOTING_FHD"; + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x0>; + qcom,mdss-dsi-bl-max-level = <0x639c>; + qcom,mdss-brightness-max-level = <0x639c>; + qcom,mdss-dsi-interleave-mode = <0x0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x3c>; + qcom,mdss-pan-physical-height-dimension = <0x6a>; + qcom,mdss-dsi-panel-mode-gpio-state = "invalid"; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + samsung,candela_map_table_revA = <0x0 0x0 0x2 0x5 0x1 0x2 0x2 0x6 0x2 0x3 0x3 0x7 0x3 0x4 0x4 0x8 0x4 0x5 0x5 0x9 0x5 0x6 0x6 0xa 0x6 0x7 0x7 0xb 0x7 0x8 0x8 0xc 0x8 0x9 0x9 0xd 0x9 0xa 0xa 0xe 0xa 0xb 0xb 0xf 0xb 0xc 0xc 0x10 0xc 0xd 0xd 0x11 0xd 0xe 0xe 0x13 0xe 0xf 0xf 0x14 0xf 0x10 0x10 0x15 0x10 0x11 0x11 0x16 0x11 0x12 0x12 0x18 0x12 0x13 0x13 0x19 0x13 0x14 0x14 0x1b 0x14 0x15 0x15 0x1d 0x15 0x16 0x16 0x1e 0x16 0x17 0x18 0x20 0x17 0x19 0x1a 0x22 0x18 0x1b 0x1c 0x25 0x19 0x1d 0x1d 0x27 0x1a 0x1e 0x20 0x29 0x1b 0x21 0x22 0x2c 0x1c 0x23 0x24 0x2f 0x1d 0x25 0x26 0x32 0x1e 0x27 0x28 0x35 0x1f 0x29 0x2b 0x38 0x20 0x2c 0x2e 0x3c 0x21 0x2f 0x31 0x40 0x22 0x32 0x34 0x44 0x23 0x35 0x38 0x48 0x24 0x39 0x3b 0x4d 0x25 0x3c 0x3f 0x52 0x26 0x40 0x43 0x57 0x27 0x44 0x47 0x5d 0x28 0x48 0x4c 0x62 0x29 0x4d 0x50 0x69 0x2a 0x51 0x56 0x6f 0x2b 0x57 0x5b 0x77 0x2c 0x5c 0x61 0x7e 0x2d 0x62 0x68 0x86 0x2e 0x69 0x6e 0x8f 0x2f 0x6f 0x76 0x98 0x30 0x77 0x7d 0xa2 0x31 0x7e 0x85 0xac 0x32 0x86 0x8e 0xb7 0x33 0x8f 0x96 0xc3 0x34 0x97 0xa0 0xcf 0x35 0xa1 0xaa 0xdc 0x36 0xab 0xb5 0xea 0x37 0xb6 0xc1 0xf9 0x38 0xc2 0xcd 0x109 0x39 0xce 0xda 0x11a 0x3a 0xdb 0xe6 0x12c 0x3b 0xe7 0xf2 0x13c 0x3c 0xf3 0xfe 0x14d 0x3d 0xff 0xff 0x168>; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xf>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + phandle = <0xf>; + + qcom,mdss-dsi-display-timings { + + fhd@0 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-front-porch = <0xa4>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-v-back-porch = <0x3>; + qcom,mdss-dsi-v-front-porch = <0x9>; + qcom,mdss-dsi-panel-clockrate = <0x35866480>; + qcom,mdss-dsi-panel-phy-timings = <0x1e0808 0x24220808 0x8020400>; + qcom,mdss-dsi-on-command = [39 01 00 00 78 00 02 11 00]; + qcom,mdss-dsi-off-command = <0x5010000 0x24000128 0x5010000 0x78000110>; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + }; + }; + }; + + fragment@87 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_te { + + sde_te_active { + phandle = <0x9>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + + sde_te_suspend { + phandle = <0xc>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + + pmx_sde { + phandle = <0xcd>; + + sde_dsi_active { + phandle = <0xa>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + bias-disable = <0x0>; + }; + }; + + sde_dsi_suspend { + phandle = <0xd>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable = <0x0>; + }; + }; + }; + }; + }; + + fragment@88 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_ub_det { + + sde_ub_det_default { + pins = "gpio5"; + function = "normal"; + input-enable; + power-source = <0x1>; + bias-disable; + phandle = <0xb>; + }; + }; + }; + }; + + fragment@89 { + target = <0xffffffff>; + + __overlay__ { + + qcom,dsi-display@9 { + label = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + qcom,display-type = "primary"; + phandle = <0xce>; + }; + + qcom,dsi-display@10 { + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,display-type = "primary"; + phandle = <0xcf>; + }; + }; + }; + + fragment@90 { + target = <0xffffffff>; + + __overlay__ { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x2dc6c0>; + regulator-boot-on; + }; + }; + + fragment@91 { + target = <0xffffffff>; + + __overlay__ { + + tsp_int { + phandle = <0x64>; + + mux { + pins = "gpio9"; + function = "gpio"; + }; + + config { + pins = "gpio9"; + input-enable; + bias-disable; + }; + }; + }; + }; + + fragment@92 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + synaptics_tcm@20 { + status = "disabled"; + }; + + atmel_mxt_ts@4a { + status = "disabled"; + }; + + touchscreen@20 { + status = "ok"; + compatible = "zinitix,zt_ts_device"; + reg = <0x20>; + pinctrl-names = "on_state", "off_state"; + pinctrl-0 = <0x64>; + pinctrl-1 = <0x64>; + avdd-supply = <0xffffffff>; + zinitix,gpio_ldo_en; + zinitix,irq_type = <0x2008>; + zinitix,x_resolution = <0x438>; + zinitix,y_resolution = <0x960>; + zinitix,page_size = <0x80>; + zinitix,irq_gpio = <0xffffffff 0x9 0x2008>; + zinitix,chip_name = "ZT7650"; + zinitix,select_lcdid = <0x801000 0x801001 0x801002>; + zinitix,firmware_name = "tsp_zinitix/zt7650_a72.bin", "tsp_zinitix/zt7650_a72.bin", "tsp_zinitix/zt7650_a72_3rd.bin"; + zinitix,spay; + zinitix,aod; + zinitix,aot; + zinitix,mis_cal_check; + support_ear_detect_mode; + support_dex_mode; + zinitix,bringup = <0x0>; + zinitix,ss_touch_num = <0x1>; + phandle = <0xd0>; + }; + + touchscreen@49 { + status = "ok"; + compatible = "stm,fts_touch"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x64>; + avdd-supply = <0xffffffff>; + stm,irq_gpio = <0xffffffff 0x9 0x2008>; + stm,max_coords = <0xfff 0xfff>; + stm,firmware_name = "tsp_stm/fts5cu56a_a72.bin"; + stm,tclm_level = <0x2>; + stm,afe_base = <0x7>; + stm,bringup = <0x0>; + stm,support_fod; + stm,enable_settings_aot; + support_ear_detect; + support_mis_calibration_test; + support_dex_mode; + support_open_short_test; + support_sram_test; + stm,ss_touch_num = <0x1>; + phandle = <0xd1>; + }; + }; + }; + + fragment@93 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + + key_vol_up_default { + pins = "gpio8"; + function = "normal"; + input-enable; + bias-pull-up; + power-source = <0x0>; + phandle = <0x65>; + }; + }; + }; + }; + + fragment@94 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "default"; + pinctrl-0 = <0x65>; + + vol_up { + label = "volume_up"; + gpios = <0xffffffff 0x8 0x1>; + linux,input-type = <0x1>; + linux,code = <0x73>; + debounce-interval = <0xf>; + }; + }; + }; + + fragment@95 { + target = <0xffffffff>; + + __overlay__ { + + ss_touch { + compatible = "samsung,ss_touch"; + ss_touch,numbers = <0x1>; + }; + }; + }; + + fragment@96 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x66>; + status = "okay"; + + sm5714@49 { + status = "okay"; + compatible = "siliconmitus,sm5714mfd"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x67>; + sm5714,irq-gpio = <0xffffffff 0x21 0x0>; + sm5714,wakeup; + }; + }; + }; + + fragment@97 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x68>; + status = "okay"; + + usbpd-sm5714@33 { + status = "okay"; + compatible = "sm5714-usbpd"; + reg = <0x33>; + pinctrl-names = "default"; + pinctrl-0 = <0x69>; + usbpd,usbpd_int = <0xffffffff 0x68 0x0>; + support_pd_role_swap; + + pdic-manager { + pdic,max_power = <0x1388>; + pdic_op_power = <0x9c4>; + pdic_max_voltage = <0x1770>; + pdic_max_current = <0x7d0>; + pdic,min_current = <0x1f4>; + pdic,giveback = <0x0>; + pdic,usb_com_capable = <0x1>; + pdic,no_usb_suspend = <0x1>; + source,max_voltage = <0x1388>; + source,min_voltage = <0xfa0>; + source,max_power = <0x9c4>; + }; + }; + }; + }; + + fragment@98 { + target = <0xffffffff>; + + __overlay__ { + + if_pmic_irq { + + if_pmic_irq_default { + phandle = <0x67>; + + mux { + pins = "gpio33"; + function = "gpio"; + }; + + config { + pins = "gpio33"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + + usbpd_irq { + + usbpd_irq_default { + phandle = <0x69>; + + mux { + pins = "gpio104"; + function = "gpio"; + }; + + config { + pins = "gpio104"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + }; + }; + + fragment@99 { + target = <0xffffffff>; + + __overlay__ { + qcom,qusb-phy-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x15 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x47 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + qcom,qusb-phy-host-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x15 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x47 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + }; + }; + + fragment@100 { + target = <0xffffffff>; + + __overlay__ { + + nfc_qupv3_se0_i2c_sleep { + phandle = <0x6a>; + + mux { + pins = "gpio34", "gpio35"; + function = "gpio"; + }; + + config { + pins = "gpio34", "gpio35"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + nfc_clk_req_gpio { + phandle = <0x6b>; + + mux { + pins = "gpio31"; + function = "gpio"; + }; + + config { + pins = "gpio31"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_irq_gpio { + phandle = <0x6c>; + + mux { + pins = "gpio37"; + function = "gpio"; + }; + + config { + pins = "gpio37"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_ven_gpio { + phandle = <0x6d>; + + mux { + pins = "gpio12"; + function = "gpio"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-high; + }; + }; + + nfc_firm_gpio { + phandle = <0x6e>; + + mux { + pins = "gpio36"; + function = "gpio"; + }; + + config { + pins = "gpio36"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + nfc_ldo_en_gpio { + phandle = <0x6f>; + + mux { + pins = "gpio68"; + function = "gpio"; + }; + + config { + pins = "gpio68"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@101 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + pinctrl-1 = <0x6a>; + qcom,clk-freq-out = <0x61a80>; + + sec-nfc@27 { + compatible = "sec-nfc"; + reg = <0x27>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + sec-nfc,ven-gpio = <0xffffffff 0xc 0x0>; + sec-nfc,irq-gpio = <0xffffffff 0x25 0x0>; + sec-nfc,firm-gpio = <0xffffffff 0x24 0x0>; + sec-nfc,clk_req-gpio = <0xffffffff 0x1f 0x0>; + sec-nfc,pvdd-gpio = <0xffffffff 0x44 0x0>; + sec-nfc,clk_req_wake; + sec-nfc,bootloader_ver = <0x6>; + pinctrl-names = "default"; + pinctrl-0 = <0x6b 0x6c 0x6d 0x6e 0x6f>; + }; + }; + }; + + fragment@102 { + target = <0xffffffff>; + + __overlay__ { + + et7xx_rst { + + et7xx_rst { + phandle = <0x70>; + + mux { + pins = "gpio91"; + function = "gpio"; + }; + + config { + pins = "gpio91"; + driver-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@103 { + target = <0xffffffff>; + + __overlay__ { + regulator-name = "VDD_BTP_3P3"; + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + }; + }; + + fragment@104 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + + etspi,et7xx { + compatible = "etspi,et7xx"; + reg = <0x0>; + spi-max-frequency = <0xbebc20>; + pinctrl-names = "default"; + pinctrl-0 = <0x70>; + gpio-controller; + #gpio-cells = <0x2>; + etspi-regulator = "VDD_BTP_3P3"; + etspi-sleepPin = <0xffffffff 0x5b 0x0>; + etspi-chipid = "ET713"; + etspi-modelinfo = "A725"; + etspi-position = "12.03,0.00,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + etspi-rb = "547,-1,-1,FFFFFF"; + }; + }; + }; + + fragment@105 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@106 { + target = <0xffffffff>; + + __overlay__ { + + qcom,flash_0 { + label = "flash"; + qcom,led-name = "led:flash_0"; + qcom,max-current = <0x5dc>; + qcom,default-led-trigger = "flash0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x5dc>; + qcom,duration-ms = <0x500>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + qcom,record-current-ma = <0xe1>; + phandle = <0x71>; + }; + + qcom,torch_0 { + label = "torch"; + qcom,led-name = "led:torch_0"; + qcom,max-current = <0x1f4>; + qcom,default-led-trigger = "torch0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x12c>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + phandle = <0x72>; + }; + + qcom,camera-flash@0 { + cell-index = <0x0>; + compatible = "qcom,camera-flash"; + flash-source = <0x71>; + torch-source = <0x72>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x7c>; + }; + + qcom,camera-flash@1 { + cell-index = <0x1>; + compatible = "qcom,camera-flash"; + flash-source = <0x71>; + torch-source = <0x72>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x97>; + }; + + qcom,cam-res-mgr { + compatible = "qcom,cam-res-mgr"; + shared-gpios = <0x3f>; + pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; + status = "ok"; + pinctrl-0 = <0x73>; + pinctrl-1 = <0x74>; + }; + }; + }; + + fragment@107 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + sm5714-fled { + compatible = "siliconmitus,sm5714-fled"; + reg = <0x49>; + status = "okay"; + slave-addr = <0x92>; + flash-en-gpio = <0xffffffff 0x16 0x0>; + torch-en-gpio = <0xffffffff 0x43 0x0>; + flash-brightness = <0xf>; + preflash-brightness = <0x7>; + torch-brightness = <0x7>; + factory_current = <0x0>; + timeout = <0xff>; + }; + }; + }; + + fragment@108 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + qcom,ois@62 { + compatible = "qcom,ois"; + cell-index = <0x0>; + reg = <0x62>; + slave-addr = <0xc4>; + slave-id = <0x460>; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vdig"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x2ab980>; + rgltr-max-voltage = <0x2ab980>; + rgltr-load-current = <0x30d40>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x76 0x77>; + pinctrl-1 = <0x78 0x79>; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x20 0x0 0xffffffff 0x2b 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x0>; + gpio-custom1 = <0x1>; + gpio-vio = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x0 0x0 0x0>; + gpio-req-tbl-label = "MCU_RESET0", "MCU_BOOT0", "MCU_VIO"; + status = "ok"; + cam_vdig-supply = <0x7a>; + phandle = <0x7e>; + }; + }; + }; + + fragment@109 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@0 { + cell-index = <0x0>; + compatible = "qcom,cam-sensor"; + reg = <0x0>; + slave-addr = <0x34>; + csiphy-sd-index = <0x0>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x7b>; + led-flash-src = <0x7c>; + eeprom-src = <0x7d>; + ois-src = <0x7e>; + cam_vio-supply = <0x7f>; + cam_vaf-supply = <0x75>; + cam_vana-supply = <0x75>; + cam_vdig-supply = <0x80>; + cam_clk-supply = <0xffffffff>; + cam_bob-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_bob", "cam_clk"; + rgltr-cntrl-support; + pwm-switch; + rgltr-min-voltage = <0x1b7740 0x2ab980 0xf4240 0x325aa0 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x10c8e0 0x325aa0 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x1e8480 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x81 0x82>; + pinctrl-1 = <0x83 0x84>; + gpios = <0xffffffff 0xd 0x0 0xffffffff 0x1e 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x1>; + gpio-custom1 = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_VANA0"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x41>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0xd2>; + }; + + qcom,cam-sensor@2 { + cell-index = <0x2>; + compatible = "qcom,cam-sensor"; + reg = <0x3>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x85>; + cam_vio-supply = <0x7f>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x86 0x87 0x88 0x89>; + pinctrl-1 = <0x8a 0x8b 0x8c 0x8d>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x2D { + cell-index = <0x2>; + compatible = "qcom,eeprom"; + reg = <0x2d>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7f>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x86 0x87 0x88 0x89>; + pinctrl-1 = <0x8a 0x8b 0x8c 0x8d>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + phandle = <0x85>; + }; + }; + }; + + fragment@110 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@1 { + cell-index = <0x1>; + compatible = "qcom,cam-sensor"; + reg = <0x1>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x8e>; + cam_vio-supply = <0x7f>; + cam_vana-supply = <0x8f>; + cam_vdig-supply = <0x90>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x91 0x92>; + pinctrl-1 = <0x93 0x94>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@8 { + cell-index = <0x8>; + compatible = "qcom,cam-sensor"; + reg = <0x8>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x8e>; + cam_vio-supply = <0x7f>; + cam_vana-supply = <0x8f>; + cam_vdig-supply = <0x90>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x91 0x92>; + pinctrl-1 = <0x93 0x94>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@3 { + cell-index = <0x3>; + compatible = "qcom,cam-sensor"; + reg = <0x2>; + slave-addr = <0x42>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x95>; + eeprom-src = <0x96>; + ois-src = <0x7e>; + led-flash-src = <0x97>; + cam_vio-supply = <0x7f>; + cam_vaf-supply = <0x75>; + cam_vdig-supply = <0x98>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x10c8e0 0x0>; + rgltr-max-voltage = <0x1b7740 0x10c8e0 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x99 0x9a 0x9b>; + pinctrl-1 = <0x9c 0x9d 0x9e>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2", "CAM_VAF0"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + gpio-vaf = <0x3>; + phandle = <0xd3>; + }; + + qcom,cam-sensor@4 { + cell-index = <0x4>; + compatible = "qcom,cam-sensor"; + reg = <0x4>; + slave-addr = <0x7e>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + led-flash-src = <0x7c>; + eeprom-src = <0x9f>; + cam_vio-supply = <0x7f>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0xa0 0xa1 0xa2 0x89>; + pinctrl-1 = <0xa3 0xa4 0xa5 0x8d>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x4a 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x3F { + cell-index = <0x4>; + compatible = "qcom,eeprom"; + reg = <0x3f>; + slave-addr = <0x7e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7f>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0xa0 0xa1 0xa2 0x89>; + pinctrl-1 = <0xa3 0xa4 0xa5 0x8d>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x4a 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x9f>; + }; + }; + }; + + fragment@111 { + target = <0xffffffff>; + + __overlay__ { + + qcom,actuator@0xC { + cell-index = <0x0>; + reg = <0xc>; + slave-addr = <0x18>; + compatible = "i2c_actuator"; + rgltr-cntrl-support; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x1e8480>; + cam_vio-supply = <0x7f>; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x3f 0x0>; + gpio-vaf = <0x0>; + gpio-req-tbl-num = <0x0>; + gpio-req-tbl-flags = <0x0>; + gpio-req-tbl-label = "CAM_VAF0"; + phandle = <0x7b>; + }; + + qcom,actuator2 { + cell-index = <0x2>; + compatible = "qcom,actuator"; + reg = <0x1e>; + slave-addr = <0x1e>; + cam_vio-supply = <0x7f>; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x1e8480>; + qcom,cam-power-seq-type = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x1>; + cci-master = <0x1>; + status = "ok"; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x3f 0x0>; + gpio-vaf = <0x0>; + gpio-req-tbl-num = <0x0>; + gpio-req-tbl-flags = <0x0>; + gpio-req-tbl-label = "CAM_VAF0"; + phandle = <0x95>; + }; + + qcom,eeprom@50 { + cell-index = <0x0>; + reg = <0x50>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa0>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x2>; + cam_vaf-supply = <0x75>; + cam_vio-supply = <0x7f>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x3f 0x0>; + gpio-vaf = <0x0>; + gpio-req-tbl-num = <0x0>; + gpio-req-tbl-flags = <0x0>; + gpio-req-tbl-label = "CAM_VAF0"; + phandle = <0x7d>; + }; + + qcom,eeprom@51 { + cell-index = <0x1>; + reg = <0x51>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa2>; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x2>; + cam_vio-supply = <0x7f>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-mode = <0x0>; + sensor-position = <0x1>; + rgltr-cntrl-support; + phandle = <0x8e>; + }; + + qcom,eeprom@55 { + cell-index = <0x3>; + reg = <0x55>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xaa>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x1>; + cam_vaf-supply = <0x75>; + cam_vio-supply = <0x7f>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x3f 0x0>; + gpio-vaf = <0x0>; + gpio-req-tbl-num = <0x0>; + gpio-req-tbl-flags = <0x0>; + gpio-req-tbl-label = "CAM_VAF0"; + phandle = <0x96>; + }; + }; + }; + + fragment@112 { + target = <0xffffffff>; + + __overlay__ { + + samsung,vibrator { + compatible = "samsung_vib"; + samsung,vib_type = "COINDC"; + status = "ok"; + phandle = <0xd4>; + }; + }; + }; + + fragment@113 { + target = <0xffffffff>; + + __overlay__ { + + hall { + status = "okay"; + compatible = "hall"; + linux,input-type = <0x1>; + linux,code = <0x15>; + hall,gpio_flip_cover = <0xffffffff 0xa 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa6>; + }; + + certify_hall { + status = "okay"; + compatible = "certify_hall"; + linux,input-type = <0x1>; + linux,code = <0x1b>; + certify_hall,gpio_certify_cover = <0xffffffff 0x5d 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa7>; + }; + }; + }; + + fragment@114 { + target = <0xffffffff>; + + __overlay__ { + + hall { + + hall_default { + pins = "gpio10"; + function = "normal"; + output-disable; + input-enable; + bias-disable; + power-source = <0x0>; + phandle = <0xa6>; + }; + }; + }; + }; + + fragment@115 { + target = <0xffffffff>; + + __overlay__ { + + certify_hall_default { + phandle = <0xa7>; + + mux { + pins = "gpio93"; + function = "gpio"; + }; + + config { + pins = "gpio93"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + }; + + fragment@116 { + target = <0xffffffff>; + + __overlay__ { + + rpmh-regulator-ldoc8 { + compatible = "qcom,rpmh-vrm-regulator"; + mboxes = <0xffffffff 0x0>; + qcom,resource-name = "ldoc8"; + qcom,regulator-type = "pmic5-ldo"; + qcom,supported-modes = <0x2 0x4>; + qcom,mode-threshold-currents = <0x0 0x1>; + + regulator-pm6150l-l8 { + regulator-name = "pm6150l_l8"; + qcom,set = <0x3>; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + qcom,init-voltage = <0x1b7740>; + regulator-always-on; + qcom,init-mode = <0x2>; + phandle = <0xd5>; + }; + }; + + rpmh-regulator-ldoa5 { + + regulator-pm6150-l5 { + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + regulator-always-on; + phandle = <0xd6>; + }; + }; + + i2c@17 { + status = "ok"; + cell-index = <0x11>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x33 0x0 0xffffffff 0x34 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0xa8>; + phandle = <0xd7>; + + sx9360-i2c@28 { + compatible = "sx9360"; + reg = <0x28>; + pinctrl-names = "default"; + pinctrl-0 = <0xa9>; + interrupt-parent = <0xffffffff>; + interrupts = <0x4 0xc4 0x0 0x2>; + sx9360,nirq-gpio = <0xffffffff 0x5 0x1>; + sx9360,reggnrlctrl2_reg = <0x32>; + sx9360,againfreq_reg = <0x38>; + sx9360,refagainfreq_reg = <0x36>; + sx9360,gainrawfilt_reg = <0x1a>; + sx9360,refgainrawfilt_reg = <0x22>; + sx9360,proxthresh_reg = <0x22>; + sx9360,hyst_reg = <0x15>; + sx9360,regproxctrl3_reg = <0xc>; + sx9360,resolution_reg = <0xf>; + sx9360,refresolution_reg = <0xf>; + sx9360,hallic_cert_detect = <0x1>; + }; + }; + }; + }; + + fragment@117 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x6 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x22 0x25 0x2a 0x2d 0x2f 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x43 0x44 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5b 0x5e 0x73 0x74 0x76>; + }; + }; + + fragment@118 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@119 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x22 0x25 0x2a 0x2d 0x2f 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x43 0x44 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5b 0x5e 0x73 0x74 0x76>; + }; + }; + + fragment@120 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@121 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@122 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@123 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@124 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + + sm5440@63 { + status = "okay"; + compatible = "siliconmitus,sm5440"; + reg = <0x63>; + pinctrl-names = "default"; + }; + }; + }; + + fragment@125 { + target = <0xffffffff>; + + __overlay__ { + + bat_thm { + label = "bat_thm"; + reg = <0x4f>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + + chg_thm { + label = "chg_thm"; + reg = <0x4d>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + }; + }; + + fragment@126 { + target = <0xffffffff>; + + __overlay__ { + + sec-direct-charger { + status = "okay"; + compatible = "samsung,sec-direct-charger"; + charger,battery_name = "battery"; + charger,main_charger = "sm5714-charger"; + charger,direct_charger = "sm5440-charger"; + charger,dchg_min_current = <0x7d0>; + charger,dchg_temp_low_threshold = <0xb4>; + charger,dchg_temp_high_threshold = <0x1a4>; + }; + + battery { + pinctrl-names = "default"; + battery,chip_vendor = "QCOM"; + status = "okay"; + compatible = "samsung,sec-battery"; + battery,vendor = "Battery"; + battery,charger_name = "sec-direct-charger"; + battery,fuelgauge_name = "sm5714-fuelgauge"; + battery,fgsrc_switch_name = "sm5714-fuelgauge"; + battery,technology = <0x2>; + battery,batt_data_version = <0x1>; + battery,temp_adc_type = <0x1>; + battery,temp_channel_raw = <0x1>; + battery,adc_check_count = <0x5>; + battery,temp_check_type = <0x1>; + battery,chg_temp_check_type = <0x1>; + battery,thermal_source = <0x2>; + battery,chg_thermal_source = <0x2>; + battery,temp_table_adc = <0x7e4 0x941 0xada 0xcc1 0xef2 0x1188 0x1493 0x1821 0x1c49 0x20dc 0x25dc 0x2b94 0x31b1 0x3854 0x3ef2 0x4588 0x4bdd 0x51ec 0x5781 0x5c85 0x60b2 0x6456 0x675a>; + battery,temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,chg_temp_table_adc = <0x761 0x8c1 0xa5c 0xc35 0xe5d 0x10e2 0x13e6 0x1766 0x1b85 0x200c 0x2503 0x2ab1 0x30cc 0x3774 0x3e15 0x44b0 0x4b25 0x5141 0x56de 0x5bf6 0x6042 0x63fd 0x6711>; + battery,chg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,polling_time = <0xa 0x1e 0x1e 0x1e 0xe10>; + battery,cable_check_type = <0x4>; + battery,cable_source_type = <0x1>; + battery,polling_type = <0x1>; + battery,monitor_initial_count = <0x0>; + battery,battery_check_type = <0x0>; + battery,ovp_uvlo_check_type = <0x3>; + battery,temp_check_count = <0x1>; + battery,overheatlimit_threshold = <0x2bc>; + battery,overheatlimit_recovery = <0x2a8>; + battery,wire_warm_overheat_thresh = <0x1f4>; + battery,wire_normal_warm_thresh = <0x1a4>; + battery,wire_cool1_normal_thresh = <0xb4>; + battery,wire_cool2_cool1_thresh = <0x96>; + battery,wire_cool3_cool2_thresh = <0x32>; + battery,wire_cold_cool3_thresh = <0x0>; + battery,wire_warm_current = <0x6c6>; + battery,wire_cool1_current = <0xa8c>; + battery,wire_cool2_current = <0x485>; + battery,wire_cool3_current = <0x1e5>; + battery,low_temp_topoff = <0xfa>; + battery,high_temp_topoff = <0xfa>; + battery,low_temp_float = <0x111c>; + battery,high_temp_float = <0x1036>; + battery,full_check_type = <0x7>; + battery,full_check_type_2nd = <0x7>; + battery,full_check_count = <0x1>; + battery,chg_gpio_full_check = <0x0>; + battery,chg_high_temp = <0x28a>; + battery,chg_high_temp_recovery = <0x276>; + battery,chg_input_limit_current = <0x3e8>; + battery,chg_charging_limit_current = <0x578>; + battery,wpc_temp_control_source = <0x1>; + battery,wpc_high_temp = <0x17c>; + battery,wpc_high_temp_recovery = <0x168>; + battery,wpc_input_limit_current = <0x258>; + battery,wpc_charging_limit_current = <0x3e8>; + battery,wpc_temp_lcd_on_control_source = <0x1>; + battery,wpc_lcd_on_high_temp = <0x17c>; + battery,wpc_lcd_on_high_temp_rec = <0x168>; + battery,wpc_lcd_on_input_limit_current = <0x1c2>; + battery,wpc_store_high_temp = <0x168>; + battery,wpc_store_high_temp_recovery = <0x154>; + battery,wpc_store_charging_limit_current = <0x190>; + battery,wpc_store_lcd_on_high_temp = <0x168>; + battery,wpc_store_lcd_on_high_temp_rec = <0x12c>; + battery,wpc_store_lcd_on_charging_limit_current = <0x190>; + battery,sleep_mode_limit_current = <0x1f4>; + battery,wc_full_input_limit_current = <0x64>; + battery,mix_high_temp = <0x1cc>; + battery,mix_high_chg_temp = <0x1f4>; + battery,mix_high_temp_recovery = <0x1c2>; + battery,full_condition_type = <0x9>; + battery,full_condition_soc = <0x5d>; + battery,full_condition_vcell = <0x10ea>; + battery,recharge_check_count = <0x1>; + battery,recharge_condition_type = <0x4>; + battery,recharge_condition_soc = <0x62>; + battery,recharge_condition_vcell = <0x10d6>; + battery,charging_total_time = <0x3840>; + battery,hv_charging_total_time = <0x2a30>; + battery,normal_charging_total_time = <0x4650>; + battery,usb_charging_total_time = <0x8ca0>; + battery,recharging_total_time = <0x1518>; + battery,charging_reset_time = <0x0>; + battery,chg_float_voltage = <0x111c>; + battery,pre_afc_work_delay = <0x7d0>; + battery,pre_wc_afc_work_delay = <0xfa0>; + battery,pre_afc_input_current = <0x1f4>; + battery,pre_wc_afc_input_current = <0x1f4>; + battery,prepare_ta_delay = <0x0>; + battery,swelling_high_rechg_voltage = <0xfa0>; + battery,swelling_low_rechg_voltage = <0x1086>; + battery,siop_input_limit_current = <0x4b0>; + battery,siop_charging_limit_current = <0x3e8>; + battery,siop_hv_input_limit_current = <0x2bc>; + battery,siop_hv_input_limit_current_2nd = <0x226>; + battery,siop_hv_charging_limit_current = <0x3e8>; + battery,ttf_hv_charge_current = <0x992>; + battery,ttf_dc25_charge_current = <0xe42>; + battery,rp_current_rp1 = <0x1f4>; + battery,rp_current_rp2 = <0x5dc>; + battery,rp_current_rp3 = <0xbb8>; + battery,rp_current_rdu_rp3 = <0x834>; + battery,rp_current_abnormal_rp3 = <0x708>; + battery,pd_charging_charge_power = <0x3a98>; + battery,max_charging_current = <0xa8c>; + battery,wireless_cc_cv = <0x55>; + battery,wireless_otg_input_current = <0x384>; + battery,age_data = <0x0 0x111c 0x10d6 0x10b8 0x5d 0x12c 0x1108 0x10c2 0x10a4 0x5c 0x190 0x10f4 0x10ae 0x1090 0x5b 0x2bc 0x10e0 0x109a 0x107c 0x5a 0x3e8 0x10ae 0x1068 0x104a 0x59>; + battery,health_condition = <0x384 0x0 0x4b0 0x0 0x5dc 0x0>; + battery,step_charging_type = <0x0>; + battery,step_charging_charge_power = <0x2ee0>; + battery,step_charging_condition = <0x2d 0x64>; + battery,step_charging_condition_curr = <0xa8c 0xa8c>; + battery,step_charging_current = <0xa8c 0xa8c>; + battery,step_charging_float_voltage = <0x1036 0x111c>; + battery,dc_step_chg_type = <0xe9>; + battery,dc_step_chg_charge_power = <0x55f0>; + battery,dc_step_chg_step = <0x3>; + battery,dc_step_chg_cond_vol = <0x1004 0x1086 0x111c>; + battery,dc_step_chg_cond_iin = <0x802 0x79e 0x0>; + battery,dc_step_chg_iin_check_cnt = <0x3>; + battery,dc_step_chg_cond_soc = <0x14 0x3c 0x64>; + battery,dc_step_chg_val_vfloat = <0x1004 0x1086 0x111c>; + battery,dc_step_chg_val_iout = <0x13ec 0x1004 0xf3c>; + battery,standard_curr = <0xf3c>; + battery,expired_time = <0x288c>; + battery,recharging_expired_time = <0x1518>; + battery,battery_full_capacity = <0x1388>; + battery,cisd_max_voltage_thr = <0x1388>; + battery,max_input_voltage = <0x2328>; + battery,max_input_current = <0xbb8>; + battery,cisd_alg_index = <0x8>; + battery,ignore_cisd_index = <0x0 0x3c0>; + battery,ignore_cisd_index_d = <0x0 0x78>; + battery,ttf_capacity = <0x10cc>; + battery,cv_data = <0xa59 0x367 0x546 0xa1a 0x370 0x502 0x960 0x37b 0x4c5 0x8cf 0x384 0x485 0x828 0x38f 0x43a 0x79f 0x398 0x3f1 0x717 0x3a2 0x3b1 0x676 0x3ad 0x33e 0x5e0 0x3b6 0x2e0 0x531 0x3c1 0x263 0x4a2 0x3ca 0x1f8 0x406 0x3df 0xf5 0x387 0x3de 0xb8 0x2f4 0x3e8 0x0>; + io-channels = <0xffffffff 0x4f 0xffffffff 0x4d>; + io-channel-names = "adc-temp", "adc-chg-temp"; + }; + + sm5714-fuelgauge { + status = "okay"; + fuelgauge,fuel_alert_soc = <0x1>; + fuelgauge,capacity_max = <0x3e8>; + fuelgauge,capacity_max_margin = <0x12c>; + fuelgauge,capacity_min = <0x0>; + fuelgauge,capacity_calculation_type = <0x1f>; + fuelgauge,using_temp_compensation; + fuelgauge,low_temp_limit = <0x64>; + fuelgauge,using_hw_vempty; + fuelgauge,sw_v_empty_voltage = <0xc80>; + fuelgauge,sw_v_empty_voltage_cisd = <0xc1c>; + fuelgauge,sw_v_empty_recover_voltage = <0xd98>; + fuelgauge,capacity = <0x1388>; + + battery_params { + battery,id = <0x0>; + battery0,battery_type = <0x114e 0x21b3>; + battery0,battery_table0 = <0x1400 0x1b77 0x1c40 0x1ccb 0x1d31 0x1d6f 0x1d81 0x1d88 0x1da0 0x1de3 0x1e1f 0x1e45 0x1e5e 0x1e7e 0x1ebc 0x1efb 0x1f27 0x1faf 0x2009 0x209b 0x2103 0x218b 0x227c 0x2400>; + battery0,battery_table1 = <0x0 0x99 0x1b3 0x2cc 0x3e6 0x500 0x7b3 0xa80 0xd4c 0x12cc 0x1b19 0x2099 0x2619 0x2b99 0x3133 0x36b3 0x3980 0x3f00 0x4480 0x4ccc 0x524c 0x58e6 0x6400 0x6419>; + battery0,battery_table2 = <0x4b4b 0x4444 0x4040 0x3e3e 0x3c3c 0x3b3b 0x3838 0x3737 0x3535 0x3434 0x3434 0x3333 0x3333 0x3333 0x3333 0x3232>; + battery0,rs_value = <0xa3 0xa3 0x3800 0x200 0x599 0x599 0x100>; + battery0,v_alarm = <0xc1c 0xc8>; + battery0,topoff = <0x2ee>; + battery0,i_cal = <0x0 0x0 0x800 0x800 0x0 0x0 0x800 0x81e>; + battery0,v_cal = <0x1 0x0 0x0 0x1 0x0 0x0 0x0>; + battery0,temp_std = <0x19>; + battery0,tem_poff = <0xd48 0x32 0xcb2 0x32>; + battery0,aux_ctrl = <0x322 0x5800>; + battery0,data_ver = <0x9>; + battery0,v_max_table = <0x227c 0x225f 0x2243 0x2226 0x21d9>; + battery0,q_max_table = <0x21b3 0x210d 0x2068 0x1fc2 0x1e23>; + }; + }; + + cable-info { + default_input_current = <0x708>; + default_charging_current = <0x834>; + full_check_current_1st = <0x2ee>; + full_check_current_2nd = <0xfa>; + + current_group_1 { + cable_number = <0x2 0x13 0x15 0x16 0x17 0x1e>; + input_current = <0x1f4>; + charging_current = <0x1f4>; + }; + + current_group_2 { + cable_number = <0x19 0x1f>; + input_current = <0x3e8>; + charging_current = <0x3e8>; + }; + + current_group_3 { + cable_number = <0x5 0x20>; + input_current = <0x5dc>; + charging_current = <0x5dc>; + }; + + current_group_4 { + cable_number = <0x6 0x7 0x8 0x11 0x12>; + input_current = <0x672>; + charging_current = <0xa8c>; + }; + + current_group_5 { + cable_number = <0x9>; + input_current = <0x672>; + charging_current = <0x960>; + }; + + current_group_6 { + cable_number = <0xa 0xc 0xf 0x1b 0x21 0x24>; + input_current = <0x320>; + charging_current = <0x960>; + }; + + current_group_7 { + cable_number = <0xd>; + input_current = <0x2bc>; + charging_current = <0x960>; + }; + + current_group_8 { + cable_number = <0x18>; + input_current = <0x3e8>; + charging_current = <0x1c2>; + }; + + current_group_9 { + cable_number = <0x23>; + input_current = <0x708>; + charging_current = <0x708>; + }; + + current_group_10 { + cable_number = <0xb 0xe 0x10 0x1c 0x23>; + input_current = <0x28a>; + charging_current = <0x960>; + }; + + current_group_11 { + cable_number = <0x1d 0x25>; + input_current = <0x1f4>; + charging_current = <0x4b0>; + }; + + current_group_12 { + cable_number = <0x1 0x4>; + input_current = <0x1db>; + charging_current = <0x226>; + }; + + current_group_13 { + cable_number = <0x22>; + input_current = <0x4b0>; + charging_current = <0x960>; + }; + }; + }; + }; + + fragment@127 { + target = <0xffffffff>; + + __overlay__ { + + dc_thm { + + dc_thm_default { + pins = "gpio7"; + function = "normal"; + bias-high-impedance; + phandle = <0xaa>; + }; + }; + }; + }; + + fragment@128 { + target = <0xffffffff>; + + __overlay__ { + + dc_thm { + label = "dc_thm"; + reg = <0x54>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + }; + }; + + fragment@129 { + target = <0xffffffff>; + + __overlay__ { + + battery { + pinctrl-0 = <0xaa>; + battery,dchg_temp_check_type = <0x1>; + battery,dchg_thermal_source = <0x2>; + battery,dchg_temp_table_adc = <0x8ba 0xa55 0xc29 0xe52 0x10ce 0x13cf 0x1747 0x1b65 0x1fea 0x24d9 0x2a85 0x309e 0x3741 0x3ddf 0x4477 0x4af2 0x5110 0x56b0 0x5bcc 0x6020 0x63e1 0x66f7 0x3444>; + battery,dchg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,dchg_high_temp = <0x28a>; + battery,dchg_high_temp_recovery = <0x276>; + battery,dchg_high_batt_temp = <0x190>; + battery,dchg_high_batt_temp_recovery = <0x17c>; + battery,dchg_input_limit_current = <0x3e8>; + battery,dchg_charging_limit_current = <0x7d0>; + io-channels = <0xffffffff 0x4f 0xffffffff 0x4d 0xffffffff 0x54>; + io-channel-names = "adc-temp", "adc-chg-temp", "adc-dchg-temp"; + }; + }; + }; + + __symbols__ { + dsi_rm69299_visionox_amoled_video = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video"; + dsi_rm69299_visionox_amoled_cmd = "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd"; + dsi_sim_vid = "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video"; + dsi_sim_cmd = "/fragment@3/__overlay__/qcom,mdss_dsi_sim_cmd"; + dsi_sim_dsc_375_cmd = "/fragment@4/__overlay__/qcom,mdss_dsi_sim_dsc_375_cmd"; + dsi_nt36672c_video = "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video"; + dsi_panel_pwr_supply = "/fragment@6/__overlay__/dsi_panel_pwr_supply"; + dsi_panel_pwr_supply_no_labibb = "/fragment@6/__overlay__/dsi_panel_pwr_supply_no_labibb"; + dsi_panel_pwr_supply_labibb_amoled = "/fragment@6/__overlay__/dsi_panel_pwr_supply_labibb_amoled"; + dsi_rm69299_visionox_amoled_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@0"; + dsi_rm69299_visionox_amoled_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@1"; + dsi_sim_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@2"; + dsi_sim_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@3"; + dsi_sim_dsc_375_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@4"; + dsi_nt36672c_video_display = "/fragment@6/__overlay__/qcom,dsi-display@5"; + sde_dsi = "/fragment@6/__overlay__/qcom,dsi-display"; + sde_wb = "/fragment@6/__overlay__/qcom,wb-display@0"; + ext_disp = "/fragment@6/__overlay__/qcom,msm-ext-disp"; + ext_disp_audio_codec = "/fragment@6/__overlay__/qcom,msm-ext-disp/qcom,msm-ext-disp-audio-codec-rx"; + mtp_batterydata = "/fragment@11/__overlay__/qcom,battery-data"; + lpi_tlmm = "/fragment@27/__overlay__/lpi_pinctrl@627C0000"; + cdc_dmic01_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_active"; + cdc_dmic01_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_sleep"; + cdc_dmic01_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_active"; + cdc_dmic01_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_sleep"; + cdc_dmic23_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_active"; + cdc_dmic23_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_sleep"; + cdc_dmic23_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_active"; + cdc_dmic23_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_sleep"; + cdc_dmic45_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_active"; + cdc_dmic45_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_sleep"; + cdc_dmic45_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_active"; + cdc_dmic45_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_sleep"; + tx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_sleep"; + tx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_active"; + tx_swr_data0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_sleep"; + tx_swr_data0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_active"; + wsa_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_sleep"; + wsa_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_active"; + wsa_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_sleep"; + wsa_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_active"; + tx_swr_data1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_sleep"; + tx_swr_data1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_active"; + tx_swr_data2_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_sleep"; + tx_swr_data2_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_active"; + rx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_sleep"; + rx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_active"; + rx_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_sleep"; + rx_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_active"; + lpi_i2s1_sck_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_active"; + lpi_i2s1_sck_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_sleep"; + lpi_i2s1_ws_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_active"; + lpi_i2s1_ws_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_sleep"; + lpi_i2s1_sd0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_active"; + lpi_i2s1_sd0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_sleep"; + lpi_i2s1_sd1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_active"; + lpi_i2s1_sd1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_sleep"; + tx_macro = "/fragment@28/__overlay__/tx-macro@62620000"; + swr2 = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master"; + wcd938x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd938x-tx-slave"; + wcd937x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd937x-tx-slave"; + rx_macro = "/fragment@28/__overlay__/rx-macro@62600000"; + swr1 = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master"; + wcd938x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd938x-rx-slave"; + wcd937x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd937x-rx-slave"; + wsa_macro = "/fragment@28/__overlay__/wsa-macro@62640000"; + swr0 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master"; + wsa881x_0211 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211"; + wsa881x_0212 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212"; + wsa881x_0213 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213"; + wsa881x_0214 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214"; + va_macro = "/fragment@28/__overlay__/va-macro@62770000"; + wcd938x_codec = "/fragment@28/__overlay__/wcd938x-codec"; + wcd937x_codec = "/fragment@28/__overlay__/wcd937x-codec"; + cdc_dmic01_gpios = "/fragment@30/__overlay__/cdc_dmic01_pinctrl"; + cdc_dmic23_gpios = "/fragment@30/__overlay__/cdc_dmic23_pinctrl"; + cdc_dmic45_gpios = "/fragment@30/__overlay__/cdc_dmic45_pinctrl"; + wsa_swr_gpios = "/fragment@30/__overlay__/wsa_swr_clk_data_pinctrl"; + rx_swr_gpios = "/fragment@30/__overlay__/rx_swr_clk_data_pinctrl"; + tx_swr_gpios = "/fragment@30/__overlay__/tx_swr_clk_data_pinctrl"; + wsa_spkr_en1 = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl"; + wsa_spkr_en2 = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl"; + wcd_rst_gpio = "/fragment@31/__overlay__/msm_cdc_pinctrl@58"; + clock_audio_wsa_1 = "/fragment@31/__overlay__/wsa_core_clk"; + clock_audio_wsa_2 = "/fragment@31/__overlay__/wsa_npl_clk"; + clock_audio_rx_1 = "/fragment@31/__overlay__/rx_core_clk"; + clock_audio_rx_2 = "/fragment@31/__overlay__/rx_npl_clk"; + clock_audio_tx_1 = "/fragment@31/__overlay__/tx_core_clk"; + clock_audio_tx_2 = "/fragment@31/__overlay__/tx_npl_clk"; + clock_audio_va_1 = "/fragment@31/__overlay__/va_core_clk"; + clock_audio_va_2 = "/fragment@31/__overlay__/va_npl_clk"; + qupv3_se8_2hsuart = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000"; + qupv3_se8_2hsuart_pins = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins"; + qupv3_se8_2uart_tx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_active"; + qupv3_se8_2uart_rx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_active"; + qupv3_se8_2uart_tx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_sleep"; + qupv3_se8_2uart_rx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_sleep"; + sec_debug_region = "/fragment@37/__overlay__/sec_debug_region@0"; + sec_debug_autocomment = "/fragment@37/__overlay__/sec_debug_autocomment@0"; + sec_debug_rdx_bootdev = "/fragment@37/__overlay__/sec_debug_rdx_bootdev@0"; + kaslr_region = "/fragment@37/__overlay__/kaslr_region@A0001000"; + rkp_region = "/fragment@37/__overlay__/rkp_region@B0200000"; + hdm_region = "/fragment@37/__overlay__/hdm_region@A1000000"; + modem_shared_mem = "/fragment@37/__overlay__/modem_shared_mem_region@B5000000"; + usb_noti = "/fragment@60/__overlay__/usb-notifier"; + camera_mem = "/fragment@65/__overlay__/camera_mem_region"; + imp_list = "/fragment@68/__overlay__/imp_list"; + cdc_quin_mi2s_gpios = "/fragment@69/__overlay__/msm_cdc_pinctrl_quin"; + samsung_q6audio_adaptation = "/fragment@70/__overlay__/samsung,q6audio-adaptation"; + det_zones = "/fragment@70/__overlay__/det_zones"; + i2c_18 = "/fragment@70/__overlay__/i2c@18"; + tas256x = "/fragment@70/__overlay__/i2c@18/tas256x@4c"; + tas25xx_gpio_default = "/fragment@73/__overlay__/tas25xx_gpio_default"; + fm_lna_default = "/fragment@73/__overlay__/fm_lna_default"; + grip_i2c_active = "/fragment@74/__overlay__/grip_i2c/grip_i2c_active"; + grip_i2c_suspend = "/fragment@74/__overlay__/grip_i2c/grip_i2c_suspend"; + s2mpb03_i2c_sda_default = "/fragment@74/__overlay__/s2mpb03_i2c_sda_default"; + s2mpb03_i2c_scl_default = "/fragment@74/__overlay__/s2mpb03_i2c_scl_default"; + cam_sensor_mclk0_active = "/fragment@74/__overlay__/cam_sensor_mclk0_active"; + cam_sensor_mclk0_suspend = "/fragment@74/__overlay__/cam_sensor_mclk0_suspend"; + cam_sensor_mclk1_active = "/fragment@74/__overlay__/cam_sensor_mclk1_active"; + cam_sensor_mclk1_suspend = "/fragment@74/__overlay__/cam_sensor_mclk1_suspend"; + cam_sensor_mclk2_active = "/fragment@74/__overlay__/cam_sensor_mclk2_active"; + cam_sensor_mclk2_suspend = "/fragment@74/__overlay__/cam_sensor_mclk2_suspend"; + cam_sensor_mclk3_active = "/fragment@74/__overlay__/cam_sensor_mclk3_active"; + cam_sensor_mclk3_suspend = "/fragment@74/__overlay__/cam_sensor_mclk3_suspend"; + cam_sensor_mclk4_active = "/fragment@74/__overlay__/cam_sensor_mclk4_active"; + cam_sensor_mclk4_suspend = "/fragment@74/__overlay__/cam_sensor_mclk4_suspend"; + rcam1_sensor_reset_active = "/fragment@74/__overlay__/rcam1_sensor_reset_active"; + rcam1_sensor_reset_suspend = "/fragment@74/__overlay__/rcam1_sensor_reset_suspend"; + front_sensor_reset_active = "/fragment@74/__overlay__/front_sensor_reset_active"; + front_sensor_reset_suspend = "/fragment@74/__overlay__/front_sensor_reset_suspend"; + rcam3_sensor_reset_active = "/fragment@74/__overlay__/rcam3_sensor_reset_active"; + rcam3_sensor_reset_suspend = "/fragment@74/__overlay__/rcam3_sensor_reset_suspend"; + rcam2_sensor_reset_active = "/fragment@74/__overlay__/rcam2_sensor_reset_active"; + rcam2_sensor_reset_suspend = "/fragment@74/__overlay__/rcam2_sensor_reset_suspend"; + rcam4_sensor_reset_active = "/fragment@74/__overlay__/rcam4_sensor_reset_active"; + rcam4_sensor_reset_suspend = "/fragment@74/__overlay__/rcam4_sensor_reset_suspend"; + rcam1_sensor_vana_active = "/fragment@74/__overlay__/rcam1_sensor_vana_active"; + rcam1_sensor_vana_suspend = "/fragment@74/__overlay__/rcam1_sensor_vana_suspend"; + rcam2_sensor_vana_active = "/fragment@74/__overlay__/rcam2_sensor_vana_active"; + rcam2_sensor_vana_suspend = "/fragment@74/__overlay__/rcam2_sensor_vana_suspend"; + rcam3_sensor_vana_active = "/fragment@74/__overlay__/rcam3_sensor_vana_active"; + rcam3_sensor_vana_suspend = "/fragment@74/__overlay__/rcam3_sensor_vana_suspend"; + rcam4_sensor_vana_active = "/fragment@74/__overlay__/rcam4_sensor_vana_active"; + rcam4_sensor_vana_suspend = "/fragment@74/__overlay__/rcam4_sensor_vana_suspend"; + cam_mipi_sel_active = "/fragment@74/__overlay__/cam_mipi_sel_active"; + cam_mipi_sel_suspend = "/fragment@74/__overlay__/cam_mipi_sel_suspend"; + rcam3_sensor_vdig_active = "/fragment@74/__overlay__/rcam3_sensor_vdig_active"; + rcam3_sensor_vdig_suspend = "/fragment@74/__overlay__/rcam3_sensor_vdig_suspend"; + rcam4_sensor_vdig_active = "/fragment@74/__overlay__/rcam4_sensor_vdig_active"; + rcam4_sensor_vdig_suspend = "/fragment@74/__overlay__/rcam4_sensor_vdig_suspend"; + if_pmic_i2c_pins = "/fragment@74/__overlay__/if_pmic_i2c_pins"; + if_pmic_i2c_sleep = "/fragment@74/__overlay__/if_pmic_i2c_pins/if_pmic_i2c_sleep"; + usbpd_i2c_pins = "/fragment@74/__overlay__/usbpd_i2c_pins"; + usbpd_i2c_sleep = "/fragment@74/__overlay__/usbpd_i2c_pins/usbpd_i2c_sleep"; + mcu_reset_active = "/fragment@74/__overlay__/mcu_reset_active"; + mcu_reset_suspend = "/fragment@74/__overlay__/mcu_reset_suspend"; + mcu_clk_active = "/fragment@74/__overlay__/mcu_clk_active"; + mcu_clk_suspend = "/fragment@74/__overlay__/mcu_clk_suspend"; + grip_int_active = "/fragment@75/__overlay__/grip_int_active"; + grip_int_suspend = "/fragment@75/__overlay__/grip_int_suspend"; + i2c2 = "/fragment@80/__overlay__/i2c@2"; + s2mpb03_l1 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo1"; + s2mpb03_l2 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo2"; + s2mpb03_l3 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo3"; + s2mpb03_l4 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo4"; + s2mpb03_l5 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo5"; + s2mpb03_l6 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo6"; + s2mpb03_l7 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo7"; + self_display_FC3_dtsi = "/fragment@84/__overlay__/self_display_FC3_dtsi"; + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD = "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + ss_dsi_panel_PBA_BOOTING_FHD = "/fragment@86/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD"; + sde_te_active = "/fragment@87/__overlay__/pmx_sde_te/sde_te_active"; + sde_te_suspend = "/fragment@87/__overlay__/pmx_sde_te/sde_te_suspend"; + pmx_sde = "/fragment@87/__overlay__/pmx_sde"; + sde_dsi_active = "/fragment@87/__overlay__/pmx_sde/sde_dsi_active"; + sde_dsi_suspend = "/fragment@87/__overlay__/pmx_sde/sde_dsi_suspend"; + sde_ub_det_default = "/fragment@88/__overlay__/pmx_sde_ub_det/sde_ub_det_default"; + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD_display = "/fragment@89/__overlay__/qcom,dsi-display@9"; + ss_dsi_panel_PBA_BOOTING_FHD_display = "/fragment@89/__overlay__/qcom,dsi-display@10"; + tsp_int = "/fragment@91/__overlay__/tsp_int"; + tsp_zt = "/fragment@92/__overlay__/touchscreen@20"; + tsp_stm = "/fragment@92/__overlay__/touchscreen@49"; + key_vol_up_default = "/fragment@93/__overlay__/key_vol_up/key_vol_up_default"; + if_pmic_irq_default = "/fragment@98/__overlay__/if_pmic_irq/if_pmic_irq_default"; + usbpd_irq_default = "/fragment@98/__overlay__/usbpd_irq/usbpd_irq_default"; + nfc_qupv3_se0_i2c_sleep = "/fragment@100/__overlay__/nfc_qupv3_se0_i2c_sleep"; + nfc_clk_req_gpio = "/fragment@100/__overlay__/nfc_clk_req_gpio"; + nfc_irq_gpio = "/fragment@100/__overlay__/nfc_irq_gpio"; + nfc_ven_gpio = "/fragment@100/__overlay__/nfc_ven_gpio"; + nfc_firm_gpio = "/fragment@100/__overlay__/nfc_firm_gpio"; + nfc_ldo_en_gpio = "/fragment@100/__overlay__/nfc_ldo_en_gpio"; + et7xx_rst = "/fragment@102/__overlay__/et7xx_rst/et7xx_rst"; + sm5714_flash0 = "/fragment@106/__overlay__/qcom,flash_0"; + sm5714_torch0 = "/fragment@106/__overlay__/qcom,torch_0"; + led_flash0 = "/fragment@106/__overlay__/qcom,camera-flash@0"; + led_flash1 = "/fragment@106/__overlay__/qcom,camera-flash@1"; + ois_rear = "/fragment@108/__overlay__/qcom,ois@62"; + sensor_rear = "/fragment@109/__overlay__/qcom,cam-sensor@0"; + eeprom2 = "/fragment@109/__overlay__/qcom,eeprom@0x2D"; + sensor_rear_tele = "/fragment@110/__overlay__/qcom,cam-sensor@3"; + eeprom4 = "/fragment@110/__overlay__/qcom,eeprom@0x3F"; + actuator_rear0 = "/fragment@111/__overlay__/qcom,actuator@0xC"; + actuator_rear_tele = "/fragment@111/__overlay__/qcom,actuator2"; + eeprom0 = "/fragment@111/__overlay__/qcom,eeprom@50"; + eeprom1 = "/fragment@111/__overlay__/qcom,eeprom@51"; + eeprom3 = "/fragment@111/__overlay__/qcom,eeprom@55"; + vibrator = "/fragment@112/__overlay__/samsung,vibrator"; + hall_default = "/fragment@114/__overlay__/hall/hall_default"; + certify_hall_default = "/fragment@115/__overlay__/certify_hall_default"; + L8C = "/fragment@116/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150l_l8 = "/fragment@116/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150_l5 = "/fragment@116/__overlay__/rpmh-regulator-ldoa5/regulator-pm6150-l5"; + i2c_17 = "/fragment@116/__overlay__/i2c@17"; + dc_thm_default = "/fragment@127/__overlay__/dc_thm/dc_thm_default"; + }; + + __fixups__ { + mdss_mdp = "/fragment@0:target:0", "/fragment@1:target:0", "/fragment@2:target:0", "/fragment@3:target:0", "/fragment@4:target:0", "/fragment@5:target:0", "/fragment@8:target:0", "/fragment@10:target:0", "/fragment@85:target:0", "/fragment@86:target:0"; + tlmm = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-te-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-te-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-te-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-te-gpio:0", "/fragment@7/__overlay__:qcom,usbplug-cc-gpio:0", "/fragment@17/__overlay__:cd-gpios:0", "/fragment@24/__overlay__/synaptics_tcm@20:interrupt-parent:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,irq-gpio:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,reset-gpio:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:interrupt-parent:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:reset-gpios:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:irq-gpios:0", "/fragment@25/__overlay__/nq@28:qcom,nq-irq:0", "/fragment@25/__overlay__/nq@28:qcom,nq-ven:0", "/fragment@25/__overlay__/nq@28:qcom,nq-firm:0", "/fragment@25/__overlay__/nq@28:qcom,nq-clkreq:0", "/fragment@25/__overlay__/nq@28:interrupt-parent:0", "/fragment@35:target:0", "/fragment@70/__overlay__/i2c@18:gpios:0", "/fragment@70/__overlay__/i2c@18:gpios:12", "/fragment@70/__overlay__/i2c@18/tas256x@4c:ti,reset-gpio:0", "/fragment@70/__overlay__/i2c@18/tas256x@4c:ti,irq-gpio:0", "/fragment@71/__overlay__:qcom,fm-lna-gpios:0", "/fragment@73:target:0", "/fragment@74:target:0", "/fragment@76:target:0", "/fragment@80/__overlay__/i2c@2:gpios:0", "/fragment@80/__overlay__/i2c@2:gpios:12", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:qcom,platform-reset-gpio:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:qcom,platform-te-gpio:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:samsung,esd-irq-gpio1:0", "/fragment@86/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD:qcom,platform-reset-gpio:0", "/fragment@87:target:0", "/fragment@91:target:0", "/fragment@92/__overlay__/touchscreen@20:zinitix,irq_gpio:0", "/fragment@92/__overlay__/touchscreen@49:stm,irq_gpio:0", "/fragment@96/__overlay__/sm5714@49:sm5714,irq-gpio:0", "/fragment@97/__overlay__/usbpd-sm5714@33:usbpd,usbpd_int:0", "/fragment@98:target:0", "/fragment@100:target:0", "/fragment@101/__overlay__/sec-nfc@27:interrupt-parent:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,ven-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,irq-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,firm-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,clk_req-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,pvdd-gpio:0", "/fragment@102:target:0", "/fragment@104/__overlay__/etspi,et7xx:etspi-sleepPin:0", "/fragment@107/__overlay__/sm5714-fled:flash-en-gpio:0", "/fragment@107/__overlay__/sm5714-fled:torch-en-gpio:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:12", "/fragment@108/__overlay__/qcom,ois@62:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:24", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:36", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:36", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:36", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:12", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:24", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:36", "/fragment@111/__overlay__/qcom,actuator@0xC:gpios:0", "/fragment@111/__overlay__/qcom,actuator2:gpios:0", "/fragment@111/__overlay__/qcom,eeprom@50:gpios:0", "/fragment@111/__overlay__/qcom,eeprom@55:gpios:0", "/fragment@113/__overlay__/certify_hall:certify_hall,gpio_certify_cover:0", "/fragment@115:target:0", "/fragment@116/__overlay__/i2c@17:gpios:0", "/fragment@116/__overlay__/i2c@17:gpios:12", "/fragment@117:target:0", "/fragment@119:target:0", "/fragment@122:target:0"; + pm6150l_gpios = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-reset-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-reset-gpio:0", "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-bklight-en-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-en-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-reset-gpio:0", "/fragment@22:target:0", "/fragment@75:target:0", "/fragment@93:target:0", "/fragment@94/__overlay__/vol_up:gpios:0", "/fragment@116/__overlay__/i2c@17/sx9360-i2c@28:sx9360,nirq-gpio:0", "/fragment@127:target:0"; + soc = "/fragment@6:target:0", "/fragment@11:target:0", "/fragment@23:target:0", "/fragment@31:target:0", "/fragment@34:target:0", "/fragment@60:target:0", "/fragment@66:target:0", "/fragment@70:target:0", "/fragment@80:target:0", "/fragment@84:target:0", "/fragment@89:target:0", "/fragment@95:target:0", "/fragment@106:target:0", "/fragment@112:target:0", "/fragment@113:target:0", "/fragment@116:target:0", "/fragment@118:target:0", "/fragment@121:target:0", "/fragment@123:target:0", "/fragment@126:target:0", "/fragment@129:target:0"; + mdss_dsi0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-ctrl:0"; + mdss_dsi_phy0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-phy:0"; + mdss_dsi0_pll = "/fragment@6/__overlay__/qcom,dsi-display:clocks:0", "/fragment@6/__overlay__/qcom,dsi-display:clocks:8", "/fragment@6/__overlay__/qcom,dsi-display:clocks:16", "/fragment@6/__overlay__/qcom,dsi-display:clocks:24", "/fragment@6/__overlay__/qcom,dsi-display:clocks:32", "/fragment@6/__overlay__/qcom,dsi-display:clocks:40", "/fragment@6/__overlay__/qcom,dsi-display:clocks:48", "/fragment@6/__overlay__/qcom,dsi-display:clocks:56", "/fragment@6/__overlay__/qcom,dsi-display:clocks:64", "/fragment@6/__overlay__/qcom,dsi-display:clocks:72"; + L13A = "/fragment@6/__overlay__/qcom,dsi-display:vddio-supply:0"; + L18A = "/fragment@6/__overlay__/qcom,dsi-display:vdda-3p3-supply:0"; + lcdb_ldo_vreg = "/fragment@6/__overlay__/qcom,dsi-display:lab-supply:0"; + lcdb_ncp_vreg = "/fragment@6/__overlay__/qcom,dsi-display:ibb-supply:0"; + pm6150_l18 = "/fragment@6/__overlay__/qcom,dsi-display:vci-supply:0"; + pm6150_l13 = "/fragment@6/__overlay__/qcom,dsi-display:vddi-supply:0"; + sde_dp = "/fragment@7:target:0", "/fragment@8/__overlay__:connectors:8", "/fragment@26:target:0"; + pm6150_pdphy = "/fragment@7/__overlay__:qcom,dp-usbpd-detection:0"; + sde_dp_usbplug_cc_active = "/fragment@7/__overlay__:pinctrl-0:0"; + sde_dp_usbplug_cc_suspend = "/fragment@7/__overlay__:pinctrl-1:0"; + sde_rscc = "/fragment@8/__overlay__:connectors:12"; + thermal_zones = "/fragment@9:target:0", "/fragment@18:target:0"; + pm6150_trip0 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:trip:0"; + pm6150_charger = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:cooling-device:0", "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:cooling-device:0", "/fragment@21:target:0"; + pm6150_trip1 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:trip:0"; + pm6150l_trip0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:trip:0"; + CPU0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:cooling-device:0"; + CPU1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:cooling-device:0"; + CPU2 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:cooling-device:0"; + CPU3 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:cooling-device:0"; + CPU4 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:cooling-device:0"; + CPU5 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:cooling-device:0"; + CPU6 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:cooling-device:0"; + CPU7 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:cooling-device:0"; + pm6150l_trip1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:trip:0"; + bcl_lvl0 = "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:trip:0"; + bcl_lvl1 = "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:trip:0"; + bcl_lvl2 = "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:trip:0"; + soc_trip = "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:trip:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:trip:0"; + pm6150l_vadc = "/fragment@12:target:0", "/fragment@13/__overlay__:io-channels:0", "/fragment@13/__overlay__:io-channels:8", "/fragment@13/__overlay__:io-channels:16", "/fragment@13/__overlay__:io-channels:24", "/fragment@80/__overlay__/sec_thermistor@1:io-channels:0", "/fragment@80/__overlay__/sec_thermistor@2:io-channels:0", "/fragment@83:target:0", "/fragment@128:target:0", "/fragment@129/__overlay__/battery:io-channels:16"; + pm6150l_adc_tm = "/fragment@13:target:0", "/fragment@18/__overlay__/pa-therm1:thermal-sensors:0"; + ufsphy_mem = "/fragment@14:target:0"; + pm6150_l4 = "/fragment@14/__overlay__:vdda-phy-supply:0"; + pm6150l_l3 = "/fragment@14/__overlay__:vdda-pll-supply:0", "/fragment@15/__overlay__:qcom,vddp-ref-clk-supply:0"; + ufshc_mem = "/fragment@15:target:0", "/fragment@64:target:0"; + ufs_phy_gdsc = "/fragment@15/__overlay__:vdd-hba-supply:0"; + pm6150_l19 = "/fragment@15/__overlay__:vcc-supply:0", "/fragment@16/__overlay__:vdd-supply:0"; + pm6150_l12 = "/fragment@15/__overlay__:vccq2-supply:0", "/fragment@16/__overlay__:vdd-io-supply:0"; + sdhc_1 = "/fragment@16:target:0"; + sdc1_clk_on = "/fragment@16/__overlay__:pinctrl-0:0"; + sdc1_cmd_on = "/fragment@16/__overlay__:pinctrl-0:4"; + sdc1_data_on = "/fragment@16/__overlay__:pinctrl-0:8"; + sdc1_rclk_on = "/fragment@16/__overlay__:pinctrl-0:12"; + sdc1_clk_off = "/fragment@16/__overlay__:pinctrl-1:0"; + sdc1_cmd_off = "/fragment@16/__overlay__:pinctrl-1:4"; + sdc1_data_off = "/fragment@16/__overlay__:pinctrl-1:8"; + sdc1_rclk_off = "/fragment@16/__overlay__:pinctrl-1:12"; + sdhc_2 = "/fragment@17:target:0"; + pm6150l_l9 = "/fragment@17/__overlay__:vdd-supply:0"; + pm6150l_l6 = "/fragment@17/__overlay__:vdd-io-supply:0"; + sdc2_clk_on = "/fragment@17/__overlay__:pinctrl-0:0"; + sdc2_cmd_on = "/fragment@17/__overlay__:pinctrl-0:4"; + sdc2_data_on = "/fragment@17/__overlay__:pinctrl-0:8"; + sdc2_cd_on = "/fragment@17/__overlay__:pinctrl-0:12"; + sdc2_clk_off = "/fragment@17/__overlay__:pinctrl-1:0"; + sdc2_cmd_off = "/fragment@17/__overlay__:pinctrl-1:4"; + sdc2_data_off = "/fragment@17/__overlay__:pinctrl-1:8"; + sdc2_cd_off = "/fragment@17/__overlay__:pinctrl-1:12"; + pm6150a_amoled = "/fragment@19:target:0"; + pm6150_qg = "/fragment@20:target:0"; + pm6150_vadc = "/fragment@21/__overlay__:io-channels:0", "/fragment@21/__overlay__:io-channels:8", "/fragment@21/__overlay__:io-channels:16", "/fragment@21/__overlay__:io-channels:24", "/fragment@21/__overlay__:io-channels:32", "/fragment@21/__overlay__:io-channels:40", "/fragment@21/__overlay__:io-channels:48", "/fragment@80/__overlay__/sec_thermistor@0:io-channels:0", "/fragment@82:target:0", "/fragment@125:target:0", "/fragment@126/__overlay__/battery:io-channels:0", "/fragment@126/__overlay__/battery:io-channels:8", "/fragment@129/__overlay__/battery:io-channels:0", "/fragment@129/__overlay__/battery:io-channels:8"; + qusb_phy0 = "/fragment@21/__overlay__:dpdm-supply:0", "/fragment@99:target:0"; + qupv3_se7_i2c = "/fragment@24:target:0", "/fragment@92:target:0", "/fragment@107:target:0"; + ts_active = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-0:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-0:0"; + ts_int_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:0"; + ts_reset_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:4", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:4"; + ts_release = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-2:0"; + pm6150_l10 = "/fragment@24/__overlay__/synaptics_tcm@20:vdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:vdd-supply:0"; + pm6150l_l7 = "/fragment@24/__overlay__/synaptics_tcm@20:avdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:avdd-supply:0", "/fragment@90:target:0", "/fragment@92/__overlay__/touchscreen@20:avdd-supply:0", "/fragment@92/__overlay__/touchscreen@49:avdd-supply:0"; + qupv3_se0_i2c = "/fragment@25:target:0", "/fragment@101:target:0"; + nfc_int_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:0"; + nfc_enable_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:4"; + nfc_clk_req_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:8"; + nfc_int_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:0"; + nfc_enable_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:4"; + nfc_clk_req_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:8"; + fsa4480 = "/fragment@26/__overlay__:qcom,dp-aux-switch:0", "/fragment@72:target:0"; + q6core = "/fragment@27:target:0", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:4", "/fragment@30:target:0", "/fragment@69:target:0", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:4"; + lpass_core_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:0", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:0", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:0"; + lpass_audio_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:8", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:8", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:8", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:8", "/fragment@28/__overlay__/va-macro@62770000:clocks:0"; + bolero = "/fragment@28:target:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214:qcom,bolero-handle:0", "/fragment@29/__overlay__:asoc-codec:4", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:12", "/fragment@68:target:0", "/fragment@71/__overlay__:asoc-codec:4", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:12"; + L10A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-rxtx-supply:0", "/fragment@28/__overlay__/wcd938x-codec:cdc-vddio-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-ldo-rxtx-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vddpx-1-supply:0"; + L15A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-buck-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-buck-supply:0"; + BOB = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_bob-supply:0"; + atoll_snd = "/fragment@29:target:0", "/fragment@71:target:0"; + stub_codec = "/fragment@29/__overlay__:asoc-codec:0", "/fragment@71/__overlay__:asoc-codec:0"; + audio_apr = "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:0", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:0"; + spkr_1_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-0:0"; + spkr_1_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-1:0"; + spkr_2_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-0:0"; + spkr_2_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-1:0"; + wcd_reset_active = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-0:0"; + wcd_reset_sleep = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-1:0"; + va_cdc_dma_0_tx = "/fragment@32:target:0"; + aliases = "/fragment@33:target:0", "/fragment@67:target:0"; + clock_gcc = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:0", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:8", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:16"; + qupv3_1 = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:qcom,wrapper-core:0"; + dcc = "/fragment@36:target:0"; + reserved_memory = "/fragment@37:target:0", "/fragment@65:target:0", "/fragment@105:target:0", "/fragment@120:target:0"; + removed_region = "/fragment@38:target:0"; + pil_modem_mem = "/fragment@39:target:0"; + pil_adsp_mem = "/fragment@40:target:0"; + pil_camera_mem = "/fragment@41:target:0"; + pil_npu_mem = "/fragment@42:target:0"; + pil_video_mem = "/fragment@43:target:0"; + pil_cdsp_mem = "/fragment@44:target:0"; + qseecom_mem = "/fragment@45:target:0"; + qseecom_ta_mem = "/fragment@46:target:0"; + secure_carveout_heap = "/fragment@47:target:0"; + cdsp_sec_mem = "/fragment@48:target:0"; + msm_imem = "/fragment@49:target:0"; + camera = "/fragment@50:target:0"; + cam_vfe0 = "/fragment@51:target:0"; + cam_vfe1 = "/fragment@52:target:0"; + cam_vfe_lite = "/fragment@53:target:0"; + cam_lrme = "/fragment@54:target:0"; + shared_meta = "/fragment@55:target:0"; + android_q_fstab = "/fragment@56:target:0"; + pm8008_8 = "/fragment@57:target:0", "/fragment@78:target:0"; + pm8008_9 = "/fragment@58:target:0", "/fragment@79:target:0"; + usb0 = "/fragment@59:target:0"; + firmware = "/fragment@61:target:0"; + pil_modem = "/fragment@62:target:0"; + modem_smp2p_out = "/fragment@62/__overlay__:qcom,smem-states:0", "/fragment@62/__overlay__:qcom,smem-states:8", "/fragment@62/__overlay__:qcom,smem-states:16"; + icnss = "/fragment@63:target:0"; + pcm0 = "/fragment@71/__overlay__:asoc-platform:0"; + pcm1 = "/fragment@71/__overlay__:asoc-platform:4"; + pcm2 = "/fragment@71/__overlay__:asoc-platform:8"; + voip = "/fragment@71/__overlay__:asoc-platform:12"; + voice = "/fragment@71/__overlay__:asoc-platform:16"; + loopback = "/fragment@71/__overlay__:asoc-platform:20"; + compress = "/fragment@71/__overlay__:asoc-platform:24"; + hostless = "/fragment@71/__overlay__:asoc-platform:28"; + afe = "/fragment@71/__overlay__:asoc-platform:32"; + lsm = "/fragment@71/__overlay__:asoc-platform:36"; + routing = "/fragment@71/__overlay__:asoc-platform:40"; + compr = "/fragment@71/__overlay__:asoc-platform:44"; + pcm_noirq = "/fragment@71/__overlay__:asoc-platform:48"; + spmi_bus = "/fragment@77:target:0", "/fragment@116/__overlay__/i2c@17/sx9360-i2c@28:interrupt-parent:0"; + pm6150_gpios = "/fragment@81:target:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:samsung,ub-con-det:0", "/fragment@88:target:0", "/fragment@113/__overlay__/hall:hall,gpio_flip_cover:0", "/fragment@114:target:0"; + gpio_key = "/fragment@94:target:0"; + qupv3_se4_i2c = "/fragment@96:target:0", "/fragment@124:target:0"; + qupv3_se11_i2c = "/fragment@97:target:0"; + pm6150l_l11 = "/fragment@103:target:0"; + qupv3_se6_spi = "/fragment@104:target:0"; + pm6150l_switch2 = "/fragment@106/__overlay__/qcom,camera-flash@0:switch-source:0", "/fragment@106/__overlay__/qcom,camera-flash@1:switch-source:0"; + qupv3_se10_i2c = "/fragment@108:target:0"; + cam_cci0 = "/fragment@109:target:0"; + titan_top_gdsc = "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:cam_clk-supply:0"; + clock_camcc = "/fragment@109/__overlay__/qcom,cam-sensor@0:clocks:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:clocks:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:clocks:0"; + cam_cci1 = "/fragment@110:target:0"; + qupv3_se9_i2c = "/fragment@111:target:0"; + apps_rsc = "/fragment@116/__overlay__/rpmh-regulator-ldoc8:mboxes:0"; + }; + + __local_fixups__ { + + fragment@0 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@1 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@2 { + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@5 { + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@6 { + + __overlay__ { + + qcom,dsi-display@0 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@1 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@2 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@3 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@4 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@5 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display { + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + qcom,dsi-display-list = <0x0 0x4>; + }; + }; + }; + + fragment@7 { + + __overlay__ { + qcom,ext-disp = <0x0>; + }; + }; + + fragment@8 { + + __overlay__ { + connectors = <0x0 0x4>; + }; + }; + + fragment@20 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@21 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@28 { + + __overlay__ { + + bolero-clk-rsc-mngr { + clocks = <0x0 0x8 0x10 0x18 0x20 0x28 0x30 0x38>; + }; + + tx-macro@62620000 { + clocks = <0x0 0x8>; + qcom,tx-swr-gpios = <0x0>; + }; + + rx-macro@62600000 { + clocks = <0x0 0x8>; + qcom,rx-swr-gpios = <0x0>; + }; + + wsa-macro@62640000 { + clocks = <0x0 0x8>; + qcom,wsa-swr-gpios = <0x0>; + + wsa_swr_master { + + wsa881x@20170211 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@20170212 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170213 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170214 { + qcom,spkr-sd-n-node = <0x0>; + }; + }; + }; + + wcd938x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + mbhc-button-thres = <0x0 0xc 0x18 0x24 0x30 0x3c 0x48 0x54>; + imp-table = <0x0 0x10 0x20 0x30 0x40 0x50 0x60 0x70>; + }; + + wcd937x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + }; + }; + }; + + fragment@29 { + + __overlay__ { + qcom,cdc-dmic01-gpios = <0x0>; + qcom,cdc-dmic23-gpios = <0x0>; + qcom,cdc-dmic45-gpios = <0x0>; + asoc-codec = <0x8>; + qcom,wsa-devs = <0x0 0x4 0x8 0xc>; + qcom,codec-aux-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@30 { + + __overlay__ { + + cdc_dmic01_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic23_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic45_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + wsa_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + rx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + tx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@34 { + + __overlay__ { + + qcom,qup_hsuart@a88000 { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@60 { + + __overlay__ { + + qcom,memshare { + + qcom,client_4 { + memory-region = <0x0>; + }; + }; + + samsung,sec_hdm { + memory-region = <0x0>; + }; + }; + }; + + fragment@66 { + + __overlay__ { + + qcom,ion { + + qcom,ion-heap@30 { + memory-region = <0x0>; + }; + }; + }; + }; + + fragment@69 { + + __overlay__ { + + msm_cdc_pinctrl_quin { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@70 { + + __overlay__ { + + i2c@18 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@71 { + + __overlay__ { + asoc-platform = <0x34>; + qcom,quin-mi2s-gpios = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@80 { + + __overlay__ { + + i2c@2 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@85 { + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD { + ss,self_display = <0x0>; + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@86 { + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@92 { + + __overlay__ { + + touchscreen@20 { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + + touchscreen@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@94 { + + __overlay__ { + pinctrl-0 = <0x0>; + }; + }; + + fragment@96 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sm5714@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@97 { + + __overlay__ { + pinctrl-1 = <0x0>; + + usbpd-sm5714@33 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@101 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sec-nfc@27 { + pinctrl-0 = <0x0 0x4 0x8 0xc 0x10>; + }; + }; + }; + + fragment@104 { + + __overlay__ { + + etspi,et7xx { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@106 { + + __overlay__ { + + qcom,camera-flash@0 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,camera-flash@1 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,cam-res-mgr { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + }; + }; + + fragment@108 { + + __overlay__ { + + qcom,ois@62 { + cam_vaf-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + cam_vdig-supply = <0x0>; + }; + }; + }; + + fragment@109 { + + __overlay__ { + + qcom,cam-sensor@0 { + actuator-src = <0x0>; + led-flash-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@2 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x2D { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@110 { + + __overlay__ { + + qcom,cam-sensor@1 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@8 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@3 { + actuator-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + led-flash-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@4 { + led-flash-src = <0x0>; + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x3F { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@111 { + + __overlay__ { + + qcom,actuator@0xC { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + + qcom,actuator2 { + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + }; + + qcom,eeprom@50 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@51 { + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@55 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + }; + }; + + fragment@113 { + + __overlay__ { + + hall { + pinctrl-0 = <0x0>; + }; + + certify_hall { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@116 { + + __overlay__ { + + i2c@17 { + pinctrl-0 = <0x0>; + + sx9360-i2c@28 { + pinctrl-0 = <0x0>; + }; + }; + }; + }; + + fragment@129 { + + __overlay__ { + + battery { + pinctrl-0 = <0x0>; + }; + }; + }; + }; }; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r05.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r05.dts old mode 100755 new mode 100644 index e14d99245486..bc17578cd160 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r05.dts +++ b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-eur-overlay-r05.dts @@ -1,25 +1,7191 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - /dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a72q-r05.dtsi" -#include "./drivers/atoll-sec-a72q-battery-r02.dtsi" / { model = "Samsung A72Q PROJECT REV03 (board-id,05)"; compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 5>; - dtbo-version = <0>; + qcom,board-id = <0x22 0x5>; + dtbo-version = <0x0>; + + fragment@0 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ video mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x37 0x30>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x38ae2bc0 0x37bc55b0 0x37f8cb38 0x383540b8 0x3871b640>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x3>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@1 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,mdss-dsi-panel-name = "rm69299 amoled fhd+ cmd mode dsi visionox panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-te-pin; + qcom,ulps-enabled; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-list = <0x3da58d80 0x3c9e86e0 0x3ce04888 0x3d220a30 0x3d63cbd8>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,mdss-dsi-t-clk-post = <0xe>; + qcom,mdss-dsi-t-clk-pre = <0x31>; + qcom,panel-supply-entries = <0x1>; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x4>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x8c8>; + qcom,mdss-dsi-h-front-porch = <0x1a>; + qcom,mdss-dsi-h-back-porch = <0x24>; + qcom,mdss-dsi-h-pulse-width = <0x2>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x4>; + qcom,mdss-dsi-v-front-porch = <0x38>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 02 fe 00 39 01 00 00 00 00 02 c2 08 39 01 00 00 00 00 02 35 00 39 01 00 00 00 00 02 51 ff 05 01 00 00 96 00 02 11 00 05 01 00 00 32 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x200808 0x24230808 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@2 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,mdss-dsi-panel-name = "Simulator video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-mode-switch; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x0 0x0 0x0 0x1 0x0>; + qcom,panel-ack-disabled; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + phandle = <0x5>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-video-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,cmd-to-video-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,cmd-to-video-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1 0x2 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-cmd-mode; + qcom,mdss-dsi-panel-width = <0x280>; + qcom,mdss-dsi-panel-height = <0x1e0>; + qcom,mdss-dsi-h-front-porch = <0x8>; + qcom,mdss-dsi-h-back-porch = <0x8>; + qcom,mdss-dsi-h-pulse-width = <0x8>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x6>; + qcom,mdss-dsi-v-front-porch = <0x6>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x0 0x0 0x0>; + qcom,mdss-dsi-on-command = [32 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-off-command = [22 01 00 00 00 00 02 00 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,video-to-cmd-mode-post-switch-commands = [32 01 00 00 00 00 02 00 00]; + qcom,video-to-cmd-mode-post-switch-commands-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x1c0707 0x23210707 0x5020400>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@3 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-t-clk-post = <0xc>; + qcom,mdss-dsi-t-clk-pre = <0x29>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <0x38a4 0x3c8c 0x7d00 0x4268 0x3c8c 0x7530 0x1f40 0xbb8>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-ack-disabled; + qcom,ulps-enabled; + phandle = <0x6>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x64>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x64>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x2d0 0x28 0x2d0 0x28 0x2d0 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x78>; + qcom,mdss-dsi-h-back-porch = <0x1cc>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x2e4>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x21c 0x28 0x21c 0x28 0x21c 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + + timing@2 { + qcom,mdss-dsi-panel-width = <0x2d0>; + qcom,mdss-dsi-panel-height = <0x500>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x348>; + qcom,mdss-dsi-h-pulse-width = <0x28>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x64>; + qcom,mdss-dsi-v-front-porch = <0x564>; + qcom,mdss-dsi-v-pulse-width = <0x28>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-timings = <0x210909 0x24230808 0x8030400>; + qcom,mdss-dsi-on-command = <0x29010000 0x2b0 0x3050100 0xa0001 0x150100 0xa0002 0x3a773901 0xa00 0x52a0000 0x4ff3901 0xa00 0x52b0000 0x59f1501 0xa00 0x2350039 0x100000a 0x34400 0x150100 0xa0002 0x51ff1501 0xa00 0x2532415 0x100000a 0x25500 0x5010000 0x78000111 0x5010000 0x10000129>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x28>; + qcom,mdss-dsc-slice-width = <0x168>; + qcom,mdss-dsc-slice-per-pkt = <0x1>; + qcom,mdss-dsc-bit-per-component = <0x8>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1>; + qcom,default-topology-index = <0x1>; + qcom,panel-roi-alignment = <0x168 0x28 0x168 0x28 0x168 0x28>; + qcom,partial-update-enabled = "single_roi"; + }; + }; + }; + }; + }; + + fragment@4 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_sim_dsc_375_cmd { + qcom,mdss-dsi-panel-name = "Simulator cmd mode DSC 3.75:1 dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0xa 0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-bl-max-level = <0xfff>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-te-check-enable; + qcom,mdss-dsi-te-using-wd; + qcom,mdss-dsi-te-using-te-pin; + qcom,panel-ack-disabled; + qcom,mdss-dsi-t-clk-post = <0xd>; + qcom,mdss-dsi-t-clk-pre = <0x2d>; + qcom,ulps-enabled; + phandle = <0x7>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-panel-width = <0x5a0>; + qcom,mdss-dsi-panel-height = <0xa00>; + qcom,mdss-dsi-h-front-porch = <0x64>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-pulse-width = <0x10>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x8>; + qcom,mdss-dsi-v-front-porch = <0xa>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-on-command = <0x15010000 0x2ff 0x20150100 0x2 0xfb011501 0x0 0x2000115 0x1000000 0x20155 0x15010000 0x202 0x45150100 0x2 0x5401501 0x0 0x2061915 0x1000000 0x2071e 0x15010000 0x20b 0x73150100 0x2 0xc731501 0x0 0x20eb015 0x1000000 0x20fae 0x15010000 0x211 0xb8150100 0x2 0x13001501 0x0 0x2588015 0x1000000 0x25901 0x15010000 0x25a 0x150100 0x2 0x5b011501 0x0 0x25c8015 0x1000000 0x25d81 0x15010000 0x25e 0x150100 0x2 0x5f011501 0x0 0x2723115 0x1000000 0x26803 0x15010000 0x2ff 0x24150100 0x2 0xfb011501 0x0 0x2001c15 0x1000000 0x2010b 0x15010000 0x202 0xc150100 0x2 0x3011501 0x0 0x2040f15 0x1000000 0x20510 0x15010000 0x206 0x10150100 0x2 0x7101501 0x0 0x2088915 0x1000000 0x2098a 0x15010000 0x20a 0x13150100 0x2 0xb131501 0x0 0x20c1515 0x1000000 0x20d15 0x15010000 0x20e 0x17150100 0x2 0xf171501 0x0 0x2101c15 0x1000000 0x2110b 0x15010000 0x212 0xc150100 0x2 0x13011501 0x0 0x2140f15 0x1000000 0x21510 0x15010000 0x216 0x10150100 0x2 0x17101501 0x0 0x2188915 0x1000000 0x2198a 0x15010000 0x21a 0x13150100 0x2 0x1b131501 0x0 0x21c1515 0x1000000 0x21d15 0x15010000 0x21e 0x17150100 0x2 0x1f171501 0x0 0x2204015 0x1000000 0x22101 0x15010000 0x222 0x150100 0x2 0x23401501 0x0 0x2244015 0x1000000 0x2256d 0x15010000 0x226 0x40150100 0x2 0x27401501 0x0 0x2e00015 0x1000000 0x2dc21 0x15010000 0x2dd 0x22150100 0x2 0xde071501 0x0 0x2df0715 0x1000000 0x2e36d 0x15010000 0x2e1 0x7150100 0x2 0xe2071501 0x0 0x229d815 0x1000000 0x22a2a 0x15010000 0x24b 0x3150100 0x2 0x4c111501 0x0 0x24d1015 0x1000000 0x24e01 0x15010000 0x24f 0x1150100 0x2 0x50101501 0x0 0x2510015 0x1000000 0x25280 0x15010000 0x253 0x150100 0x2 0x56001501 0x0 0x2540715 0x1000000 0x25807 0x15010000 0x255 0x25150100 0x2 0x5b431501 0x0 0x25c0015 0x1000000 0x25f73 0x15010000 0x260 0x73150100 0x2 0x63221501 0x0 0x2640015 0x1000000 0x26708 0x15010000 0x268 0x4150100 0x2 0x72021501 0x0 0x27a8015 0x1000000 0x27b91 0x15010000 0x27c 0xd8150100 0x2 0x7d601501 0x0 0x27f1515 0x1000000 0x27515 0x15010000 0x2b3 0xc0150100 0x2 0xb4001501 0x0 0x2b50015 0x1000000 0x27800 0x15010000 0x279 0x150100 0x2 0x80001501 0x0 0x2830015 0x1000000 0x2930a 0x15010000 0x294 0xa150100 0x2 0x8a001501 0x0 0x29bff15 0x1000000 0x29db0 0x15010000 0x29f 0x63150100 0x2 0x98101501 0x0 0x2ec0015 0x1000000 0x2ff10 0x39010000 0x11c1 0x9200010 0x2000268 0x1bb000a 0x66704c5 0x39010000 0x3c2 0x10f01501 0x0 0x2c00315 0x1000000 0x43b03 0xa0a1501 0x0 0x2350015 0x1000000 0x2e501 0x15010000 0x2bb 0x10150100 0x2 0xfb010501 0x7800 0x2110005 0x1000078 0x22900>; + qcom,mdss-dsi-off-command = [05 01 00 00 78 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x2d0>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x1a0606 0x22200707 0x4020400>; + qcom,display-topology = <0x1 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + + timing@1 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-h-front-porch = <0x0>; + qcom,mdss-dsi-h-back-porch = <0x0>; + qcom,mdss-dsi-h-pulse-width = <0x0>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0x0>; + qcom,mdss-dsi-v-front-porch = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x0>; + qcom,mdss-dsi-h-left-border = <0x0>; + qcom,mdss-dsi-h-right-border = <0x0>; + qcom,mdss-dsi-v-top-border = <0x0>; + qcom,mdss-dsi-v-bottom-border = <0x0>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = <0x15010000 0x2bb 0x10150100 0x2 0xb0030501 0x7800 0x1111501 0x0 0x251ff15 0x1000000 0x25324 0x15010000 0x2ff 0x23150100 0x2 0x8051501 0x0 0x2469015 0x1000000 0x2ff10 0x15010000 0x2ff 0xf0150100 0x2 0x92011501 0x0 0x2ff1015 0x1000000 0x23500 0x5010000 0x28000129>; + qcom,mdss-dsi-off-command = <0x5010000 0x10000128 0x5010000 0x40000110>; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <0x0>; + qcom,compression-mode = "dsc"; + qcom,mdss-dsc-slice-height = <0x10>; + qcom,mdss-dsc-slice-width = <0x21c>; + qcom,mdss-dsc-slice-per-pkt = <0x2>; + qcom,mdss-dsc-bit-per-component = <0xa>; + qcom,mdss-dsc-bit-per-pixel = <0x8>; + qcom,mdss-dsc-block-prediction-enable; + qcom,mdss-dsi-panel-phy-timings = <0x150505 0x201f0505 0x3020400>; + qcom,display-topology = <0x1 0x1 0x1 0x2 0x2 0x1 0x2 0x1 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@5 { + target = <0xffffffff>; + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,mdss-dsi-panel-name = "nt36672c fhd plus video mode dsi panel"; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-reset-sequence = <0x1 0x14 0x0 0x14 0x1 0x14>; + qcom,mdss-pan-physical-width-dimension = <0x4a>; + qcom,mdss-pan-physical-height-dimension = <0x83>; + qcom,mdss-dsi-panel-peak-brightness = <0x401640>; + qcom,mdss-dsi-panel-blackness-level = <0xc9e>; + qcom,panel-cphy-mode; + qcom,mdss-dsi-t-clk-post = <0x0>; + qcom,mdss-dsi-t-clk-pre = <0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-command = <0x6010001 0x10a>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-on-check-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <0x1>; + qcom,dsi-supported-dfps-list = <0x3c 0x5a 0x32>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,dsi-dyn-clk-enable; + qcom,dsi-dyn-clk-skip-timing-update; + qcom,dsi-dyn-clk-list = <0x3eb54a94 0x3e726713 0x3e2f838b 0x3deca00a 0x3da9bc89>; + qcom,dsi-dyn-clk-type = "constant-fps-adjust-hfp"; + qcom,panel-supply-entries = <0x2>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0xff>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,platform-bklight-en-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-en-gpio = <0xffffffff 0x4 0x0>; + phandle = <0x8>; + + qcom,mdss-dsi-display-timings { + + timing@0 { + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-front-porch = <0xca>; + qcom,mdss-dsi-h-back-porch = <0x38>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-back-porch = <0xa>; + qcom,mdss-dsi-v-front-porch = <0x50b>; + qcom,mdss-dsi-v-pulse-width = <0xa>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-on-command = [29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 b0 00 29 01 00 00 00 00 02 c0 00 29 01 00 00 00 00 03 c2 1b a0 29 01 00 00 00 00 02 ff 25 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 18 20 15 01 00 00 00 00 02 ff 2a 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 27 80 15 01 00 00 00 00 02 28 fd 29 01 00 00 00 00 02 ff f0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 5a 00 29 01 00 00 00 00 02 a0 08 29 01 00 00 00 00 02 ff d0 29 01 00 00 00 00 02 fb 01 29 01 00 00 00 00 02 09 ad 15 01 00 00 00 00 02 ff 10 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 51 ff 15 01 00 00 00 00 02 53 2c 15 01 00 00 00 00 02 ff 23 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 0a 00 15 01 00 00 00 00 02 0b 00 15 01 00 00 00 00 02 0c 00 15 01 00 00 00 00 02 0d 00 15 01 00 00 00 00 02 11 01 15 01 00 00 00 00 02 12 95 15 01 00 00 00 00 02 15 68 15 01 00 00 00 00 02 16 0b 15 01 00 00 00 00 02 6f 00 15 01 00 00 00 00 02 70 00 15 01 00 00 00 00 02 71 00 15 01 00 00 00 00 02 a0 11 15 01 00 00 00 00 02 ff f0 15 01 00 00 00 00 02 fb 01 15 01 00 00 00 00 02 d2 52 29 01 00 00 00 00 02 ff 10 29 01 00 00 00 00 02 35 00 05 01 00 00 78 00 02 11 00 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-phy-timings = <0x230909 0x26240909 0x9060204>; + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + }; + }; + }; + }; + }; + + fragment@6 { + target = <0xffffffff>; + + __overlay__ { + + dsi_panel_pwr_supply { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xab>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + }; + + qcom,panel-supply-entry@2 { + reg = <0x2>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <0x4630c0>; + qcom,supply-max-voltage = <0x5b8d80>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-post-on-sleep = <0x14>; + }; + }; + + dsi_panel_pwr_supply_no_labibb { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x2>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + }; + + dsi_panel_pwr_supply_labibb_amoled { + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0x1>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vddio"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1d0d80>; + qcom,supply-enable-load = <0x7d00>; + qcom,supply-disable-load = <0x50>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vdda-3p3"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x3390>; + qcom,supply-disable-load = <0x50>; + }; + }; + + qcom,dsi-display@0 { + label = "dsi_rm69299_visionox_amoled_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0"; + qcom,dsi-panel = <0x3>; + qcom,dsi-display-active; + phandle = <0xac>; + }; + + qcom,dsi-display@1 { + label = "dsi_rm69299_visionox_amoled_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x4>; + phandle = <0xad>; + }; + + qcom,dsi-display@2 { + label = "dsi_sim_vid_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x5>; + phandle = <0xae>; + }; + + qcom,dsi-display@3 { + label = "dsi_sim_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x6>; + phandle = <0xaf>; + }; + + qcom,dsi-display@4 { + label = "dsi_sim_dsc_375_cmd_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0x7>; + phandle = <0xb0>; + }; + + qcom,dsi-display@5 { + label = "dsi_nt36672c_video_display"; + qcom,display-type = "primary"; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + qcom,dsi-panel = <0x8>; + phandle = <0xb1>; + }; + + qcom,dsi-display { + compatible = "qcom,dsi-display"; + qcom,dsi-ctrl = <0xffffffff>; + qcom,dsi-phy = <0xffffffff>; + clocks = <0xffffffff 0x6 0xffffffff 0x9 0xffffffff 0x3 0xffffffff 0x8 0xffffffff 0xa 0xffffffff 0xd 0xffffffff 0x11 0xffffffff 0x15 0xffffffff 0x16 0xffffffff 0x19>; + clock-names = "mux_byte_clk0", "mux_pixel_clk0", "src_byte_clk0", "src_pixel_clk0", "cphy_byte_clk0", "cphy_pixel_clk0", "shadow_byte_clk0", "shadow_pixel_clk0", "shadow_cphybyte_clk0", "shadow_cphypixel_clk0"; + pinctrl-names = "panel_active", "panel_suspend"; + pinctrl-0 = <0x9 0xa 0xb>; + pinctrl-1 = <0xc 0xd 0xb>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + qcom,platform-reset-gpio = <0xffffffff 0x3 0x0>; + qcom,panel-te-source = <0x0>; + vddio-supply = <0xffffffff>; + vdda-3p3-supply = <0xffffffff>; + lab-supply = <0xffffffff>; + ibb-supply = <0xffffffff>; + qcom,dsi-display-list = <0xe 0xf>; + vci-supply = <0xffffffff>; + vddi-supply = <0xffffffff>; + phandle = <0x12>; + }; + + qcom,wb-display@0 { + compatible = "qcom,wb-display"; + cell-index = <0x0>; + label = "wb_display"; + phandle = <0x11>; + }; + + qcom,msm-ext-disp { + compatible = "qcom,msm-ext-disp"; + phandle = <0x10>; + + qcom,msm-ext-disp-audio-codec-rx { + compatible = "qcom,msm-ext-disp-audio-codec-rx"; + phandle = <0x2b>; + }; + }; + }; + }; + + fragment@7 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-usbpd-detection = <0xffffffff>; + qcom,ext-disp = <0x10>; + qcom,usbplug-cc-gpio = <0xffffffff 0x68 0x0>; + pinctrl-name = "mdss_dp_active", "mdss_dp_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + }; + }; + + fragment@8 { + target = <0xffffffff>; + + __overlay__ { + connectors = <0x11 0x12 0xffffffff 0xffffffff>; + }; + }; + + fragment@9 { + target = <0xffffffff>; + + __overlay__ { + + pm6150-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_bat { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150l-tz { + disable-thermal-zone; + + cooling-maps { + + trip0_cpu0 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip0_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffd 0xfffffffd>; + }; + + trip1_cpu1 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu2 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu3 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu4 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu5 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + trip1_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl0 { + disable-thermal-zone; + + cooling-maps { + + vbat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + vbat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl1 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + pm6150-bcl-lvl2 { + disable-thermal-zone; + + cooling-maps { + + ibat_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + ibat_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + + soc { + disable-thermal-zone; + + cooling-maps { + + soc_cpu6 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + + soc_cpu7 { + trip = <0xffffffff>; + cooling-device = <0xffffffff 0xfffffffe 0xfffffffe>; + }; + }; + }; + }; + }; + + fragment@10 { + target = <0xffffffff>; + + __overlay__ { + #cooling-cells = <0x2>; + }; + }; + + fragment@11 { + target = <0xffffffff>; + + __overlay__ { + + qcom,battery-data { + qcom,batt-id-range-pct = <0xf>; + phandle = <0x13>; + + qcom,alium_860_89032_0000_3600mAh { + qcom,max-voltage-uv = <0x426030>; + qcom,fg-cc-cv-threshold-uv = <0x423920>; + qcom,fastchg-current-ma = <0x1518>; + qcom,batt-id-kohm = <0x6b>; + qcom,battery-beta = <0x109a>; + qcom,battery-therm-kohm = <0x64>; + qcom,battery-type = "Alium_860_89032_0000_3600mAh_Jun15th2018"; + qcom,qg-batt-profile-ver = <0x64>; + qcom,jeita-fcc-ranges = <0x0 0x32 0x2625a0 0x33 0x190 0x5265c0 0x191 0x1c2 0x2625a0>; + qcom,jeita-fv-ranges = <0x0 0x32 0x40d990 0x33 0x190 0x426030 0x191 0x1c2 0x40d990>; + qcom,step-chg-ranges = <0x36ee80 0x39fbc0 0x5265c0 0x39fbc1 0x419ce0 0x36ee80 0x419ce1 0x426030 0x2625a0>; + qcom,ocv-based-step-chg; + qcom,jeita-soft-thresholds = <0x5314 0x25e3>; + qcom,jeita-hard-thresholds = <0x58cd 0x20b8>; + qcom,jeita-soft-hys-thresholds = <0x4f5e 0x2943>; + qcom,jeita-soft-fcc-ua = <0x2625a0 0x2625a0>; + qcom,jeita-soft-fv-uv = <0x40d990 0x40d990>; + + qcom,fcc1-temp-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xd62 0xdbf 0xdfd 0xe1d 0xe2e>; + }; + + qcom,fcc2-temp-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-data = <0xdda 0xdf8 0xe02 0xe04 0xdff 0xdff>; + }; + + qcom,pc-temp-v1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa846 0xa903 0xa965 0xa982 0xa987 0xa757 0xa82c 0xa88b 0xa8b2 0xa8bc 0xa671 0xa747 0xa7a8 0xa7d4 0xa7e5 0xa598 0xa65f 0xa6c5 0xa6f2 0xa707 0xa4ca 0xa582 0xa5e5 0xa611 0xa627 0xa3ff 0xa4af 0xa508 0xa531 0xa546 0xa330 0xa3e1 0xa430 0xa452 0xa465 0xa25d 0xa311 0xa35c 0xa377 0xa387 0xa1a0 0xa23e 0xa287 0xa29e 0xa2ad 0xa10a 0xa17a 0xa1b1 0xa1c4 0xa1d2 0xa07e 0xa0e5 0xa0f6 0xa0f5 0xa0fc 0x9fa9 0xa061 0xa067 0xa048 0xa036 0x9e4b 0x9f9a 0x9fd6 0x9fae 0x9f81 0x9cdb 0x9e3d 0x9ee8 0x9ee6 0x9ebf 0x9bed 0x9cd1 0x9d85 0x9dc6 0x9dd7 0x9b4d 0x9bf5 0x9c67 0x9cb4 0x9cf4 0x9ad6 0x9b65 0x9bd6 0x9c18 0x9c4a 0x9a75 0x9af5 0x9b63 0x9baa 0x9bc5 0x9a1f 0x9a9b 0x9ade 0x9b13 0x9b23 0x99c4 0x9a41 0x9a3f 0x9a2d 0x9a41 0x9962 0x99c6 0x998a 0x9943 0x9959 0x98fd 0x992a 0x98b8 0x9892 0x98a0 0x9894 0x9882 0x97f4 0x9800 0x9807 0x982b 0x97c6 0x976f 0x9780 0x9781 0x97cb 0x9713 0x970f 0x970c 0x970c 0x9775 0x9697 0x96b5 0x96a2 0x96a2 0x9724 0x963e 0x965a 0x9642 0x963e 0x96db 0x95fa 0x9603 0x95e9 0x95e1 0x9698 0x95c7 0x95b7 0x9598 0x958b 0x965b 0x959d 0x9571 0x954e 0x953b 0x9627 0x9575 0x9533 0x950c 0x94f4 0x95f8 0x9550 0x94fe 0x94d1 0x94b3 0x95cc 0x952e 0x94cf 0x949b 0x947a 0x95a2 0x9511 0x94a4 0x9465 0x9440 0x9579 0x94f7 0x947f 0x9432 0x9407 0x954f 0x94d6 0x9458 0x93fe 0x93cc 0x9525 0x94b2 0x942f 0x93c6 0x938b 0x94f0 0x9484 0x9402 0x938b 0x9345 0x94a6 0x943e 0x93bf 0x9343 0x92f7 0x944c 0x93da 0x935f 0x92ed 0x92a2 0x93e6 0x936c 0x92f1 0x9288 0x923f 0x936b 0x92f1 0x9276 0x920e 0x91c6 0x92e1 0x926f 0x91f1 0x9188 0x9141 0x9248 0x91ea 0x9165 0x90ff 0x90bc 0x91cf 0x9176 0x9100 0x909b 0x905b 0x9179 0x9129 0x90c1 0x9060 0x9022 0x9159 0x910e 0x90ab 0x904f 0x9011 0x913e 0x90f9 0x909a 0x903f 0x9001 0x911a 0x90de 0x907f 0x9020 0x8fdd 0x90ac 0x9070 0x8ff7 0x8f74 0x8f1a 0x8f68 0x8f1c 0x8e9e 0x8e14 0x8db6 0x8d9d 0x8d55 0x8cd8 0x8c4c 0x8beb 0x8b59 0x8b10 0x8a94 0x8a02 0x899f 0x8849 0x87fb 0x877d 0x86e5 0x867d 0x836c 0x8325 0x82aa 0x8209 0x8197 0x7530 0x7530 0x7530 0x7530 0x7530>; + }; + + qcom,pc-temp-v2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0xa98d 0xa97e 0xa974 0xa960 0xa92e 0xa910 0xa7fb 0xa83a 0xa854 0xa856 0xa82f 0xa819 0xa6a3 0xa712 0xa747 0xa757 0xa738 0xa728 0xa594 0xa609 0xa64d 0xa665 0xa64a 0xa63c 0xa4c7 0xa51d 0xa566 0xa581 0xa565 0xa558 0xa3f4 0xa43e 0xa489 0xa4a2 0xa484 0xa478 0xa2af 0xa364 0xa3b3 0xa3c8 0xa3a5 0xa397 0xa162 0xa292 0xa2e4 0xa2f3 0xa2ca 0xa2b9 0xa11a 0xa1c1 0xa210 0xa21b 0xa1ef 0xa1de 0xa14f 0xa0ea 0xa131 0xa139 0xa110 0xa103 0xa17a 0xa03c 0xa071 0xa077 0xa047 0xa035 0xa046 0x9fd6 0x9ff5 0x9ff5 0x9fb3 0x9f87 0x9d6d 0x9f7f 0x9f85 0x9f81 0x9f2b 0x9ee2 0x9b88 0x9eab 0x9ea9 0x9ead 0x9e5e 0x9e1a 0x9a81 0x9c78 0x9cde 0x9d1e 0x9d16 0x9d22 0x99b8 0x9a96 0x9b46 0x9bd5 0x9bfe 0x9c3f 0x9913 0x99e8 0x9a78 0x9b4d 0x9b70 0x9b9c 0x9887 0x9977 0x99df 0x9aeb 0x9b04 0x9b0e 0x97f7 0x98f2 0x9948 0x9a53 0x9a64 0x9a58 0x975c 0x9856 0x98b5 0x9965 0x9971 0x9967 0x96c8 0x97b8 0x9827 0x987f 0x9885 0x9883 0x9649 0x9720 0x9799 0x97d3 0x97d8 0x97d6 0x95d8 0x968d 0x9711 0x9743 0x9748 0x9745 0x957d 0x9608 0x9697 0x96c6 0x96cb 0x96c8 0x9533 0x9591 0x9629 0x9658 0x965c 0x9658 0x94f4 0x952a 0x95c3 0x95f3 0x95f6 0x95f1 0x94bc 0x94d6 0x9565 0x9595 0x9598 0x9592 0x948a 0x9491 0x950e 0x953e 0x9540 0x9538 0x9458 0x9459 0x94bd 0x94f0 0x94ef 0x94e6 0x9429 0x942b 0x9471 0x94aa 0x94a5 0x949b 0x93fa 0x9403 0x942c 0x9467 0x9461 0x9456 0x93cb 0x93dc 0x93ed 0x9426 0x9422 0x9418 0x939a 0x93b7 0x93b6 0x93e7 0x93e7 0x93dd 0x9366 0x9390 0x9384 0x93a6 0x93a1 0x9392 0x9330 0x9367 0x935a 0x9364 0x9348 0x932b 0x92f5 0x933c 0x9330 0x9322 0x92ea 0x92bd 0x92b6 0x9309 0x9301 0x92e2 0x9296 0x925d 0x9274 0x92ce 0x92cf 0x92a2 0x9248 0x9208 0x922d 0x9289 0x9294 0x925e 0x91fe 0x91bc 0x91e4 0x9235 0x924a 0x9214 0x91b6 0x9173 0x919a 0x91d4 0x91f2 0x91c0 0x9166 0x9124 0x9151 0x916d 0x918d 0x9158 0x9101 0x90c0 0x910a 0x9104 0x9119 0x90da 0x9085 0x9045 0x90be 0x90a5 0x90a4 0x9064 0x9011 0x8fd4 0x9066 0x9055 0x9058 0x9026 0x8fde 0x8fa3 0x8ff1 0x9009 0x9027 0x900b 0x8fc1 0x8f87 0x8fa0 0x8fd7 0x9010 0x8ff6 0x8fb0 0x8f76 0x8f3a 0x8f9b 0x8ff2 0x8fd7 0x8f94 0x8f5b 0x8e9d 0x8f3c 0x8fa7 0x8f84 0x8f3f 0x8efc 0x8dbc 0x8e73 0x8ecd 0x8e86 0x8e46 0x8df2 0x8c72 0x8d0b 0x8d41 0x8ce7 0x8ca5 0x8c4f 0x8a95 0x8b0d 0x8b2a 0x8ad3 0x8a9a 0x8a45 0x87f8 0x8865 0x887d 0x881c 0x87ec 0x879d 0x841a 0x8496 0x84d3 0x8488 0x847e 0x8426 0x7eca 0x7f24 0x801b 0x8028 0x7f97 0x7ef0 0x6fcb 0x6e6e 0x6d71 0x6d74 0x6d50 0x6d1a>; + }; + + qcom,pc-temp-z1-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x38d1 0x33b6 0x2f09 0x2da0 0x2d49 0x38bb 0x337f 0x2f0d 0x2d9e 0x2d52 0x38c3 0x3376 0x2f0b 0x2da5 0x2d5c 0x38c7 0x337e 0x2f07 0x2da7 0x2d60 0x38d3 0x3382 0x2f03 0x2da8 0x2d62 0x38eb 0x337d 0x2f01 0x2da8 0x2d64 0x38ff 0x336c 0x2f02 0x2da9 0x2d67 0x38f6 0x335e 0x2f03 0x2dac 0x2d6a 0x38d7 0x335d 0x2f05 0x2dae 0x2d6d 0x38b6 0x3362 0x2f09 0x2db1 0x2d6f 0x3896 0x3360 0x2f0d 0x2db5 0x2d72 0x3874 0x334e 0x2f0f 0x2db8 0x2d77 0x3843 0x333c 0x2f0f 0x2dbb 0x2d7b 0x3810 0x332e 0x2f0b 0x2dbb 0x2d7c 0x37ee 0x3328 0x2f04 0x2db9 0x2d7c 0x37d3 0x3329 0x2f01 0x2db7 0x2d7c 0x37b6 0x3329 0x2f04 0x2dbb 0x2d7f 0x3792 0x332c 0x2f0a 0x2dc2 0x2d85 0x3772 0x3337 0x2f14 0x2dc9 0x2d8b 0x3765 0x3349 0x2f21 0x2dce 0x2d8f 0x3763 0x335e 0x2f2c 0x2dd3 0x2d93 0x376a 0x3374 0x2f35 0x2dd8 0x2d98 0x3773 0x3384 0x2f3d 0x2ddd 0x2d9c 0x377f 0x338b 0x2f45 0x2de1 0x2da1 0x3787 0x3391 0x2f4d 0x2de7 0x2da6 0x378c 0x339a 0x2f54 0x2dec 0x2daa 0x378f 0x33a6 0x2f5b 0x2df0 0x2daf 0x3794 0x33ad 0x2f62 0x2df4 0x2db3 0x379f 0x33b2 0x2f69 0x2df8 0x2db7 0x37af 0x33ba 0x2f6f 0x2dfc 0x2dbb 0x37c7 0x33c2 0x2f75 0x2e00 0x2dbf 0x37de 0x33c9 0x2f7a 0x2e04 0x2dc4 0x37e6 0x33d1 0x2f80 0x2e08 0x2dc8 0x37ea 0x33de 0x2f86 0x2e0d 0x2dcd 0x37f0 0x33f1 0x2f8e 0x2e12 0x2dd1 0x3807 0x3403 0x2f95 0x2e17 0x2dd5 0x383b 0x3415 0x2f9d 0x2e1a 0x2dd8 0x386b 0x3422 0x2fa5 0x2e1c 0x2dda 0x3891 0x3427 0x2faa 0x2e1f 0x2ddc 0x38b0 0x3429 0x2fad 0x2e21 0x2ddd 0x38b2 0x342d 0x2fb1 0x2e23 0x2dde 0x3888 0x3439 0x2fb9 0x2e25 0x2de0 0x3873 0x3448 0x2fbf 0x2e27 0x2de1 0x386e 0x3457 0x2fc0 0x2e28 0x2de2 0x3861 0x3449 0x2fc4 0x2e29 0x2de2 0x386f 0x3454 0x2fc7 0x2e2b 0x2de2 0x3869 0x3454 0x2fc8 0x2e2b 0x2de1 0x3868 0x345b 0x2fc9 0x2e2b 0x2de2 0x385f 0x3457 0x2fcf 0x2e2c 0x2de3 0x387c 0x3452 0x2fd1 0x2e30 0x2de6 0x3886 0x346f 0x2fdb 0x2e36 0x2deb 0x38aa 0x3476 0x2ff3 0x2e3f 0x2df0 0x3895 0x349e 0x3007 0x2e4a 0x2dfa 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06 0x38d0 0x34c8 0x3032 0x2e5c 0x2e06>; + }; + + qcom,pc-temp-z2-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2bb8 0x2632 0x2811 0x296b 0x2a9e 0x280d 0x2a3d 0x2824 0x28fa 0x293e 0x25fe 0x2926 0x282f 0x28bc 0x28c4 0x2606 0x274d 0x282a 0x28ad 0x28ac 0x2620 0x26d2 0x281d 0x2898 0x28a6 0x262f 0x26c3 0x2815 0x288c 0x28a4 0x2631 0x26b5 0x2811 0x2887 0x28a8 0x262c 0x26aa 0x2812 0x2882 0x28ac 0x2625 0x26a2 0x2816 0x2880 0x28ac 0x261b 0x269c 0x2819 0x2884 0x28b5 0x2612 0x2698 0x2813 0x2887 0x28cc 0x2616 0x2696 0x27f3 0x288e 0x28d4 0x2626 0x2699 0x27d7 0x28ae 0x28d3 0x262c 0x26a7 0x27e8 0x28bd 0x28d4 0x2618 0x26b3 0x2814 0x289f 0x28d2 0x25f5 0x26b6 0x282a 0x2883 0x28c7 0x25e5 0x26ba 0x2827 0x288f 0x28d1 0x25e1 0x26c3 0x281d 0x28b2 0x290a 0x25dd 0x26dd 0x2837 0x28e1 0x2937 0x25d6 0x26fd 0x2894 0x2931 0x293f 0x25c9 0x271e 0x28ce 0x296a 0x293f 0x25be 0x2742 0x28b3 0x2939 0x2923 0x25b7 0x2760 0x2883 0x28bd 0x28ee 0x25b1 0x2775 0x2863 0x288b 0x28cc 0x259f 0x2784 0x284c 0x289e 0x28b4 0x2574 0x278c 0x283f 0x28b6 0x28a5 0x2552 0x2793 0x283c 0x28a9 0x28a6 0x2544 0x2797 0x283d 0x2890 0x28af 0x250b 0x2796 0x2845 0x2888 0x28ba 0x24d2 0x2793 0x2859 0x2888 0x28cd 0x24c0 0x2792 0x286f 0x288c 0x28e8 0x24b3 0x2793 0x2885 0x289f 0x290a 0x24aa 0x2795 0x289c 0x28c5 0x2934 0x24a2 0x2799 0x28b4 0x28ea 0x2962 0x249c 0x27a2 0x28ce 0x290a 0x299b 0x2498 0x27aa 0x28df 0x2925 0x29c7 0x249e 0x27b2 0x28e4 0x293c 0x29d8 0x24a4 0x27b7 0x28e7 0x2954 0x29e2 0x24ad 0x27bb 0x28ef 0x2961 0x29ed 0x24b6 0x27c0 0x28fb 0x2964 0x29f9 0x24b5 0x27c2 0x2901 0x2965 0x2a01 0x24a8 0x27b9 0x28fa 0x2971 0x2a03 0x24a4 0x279c 0x28f3 0x2981 0x2a07 0x24aa 0x26ec 0x28f1 0x2987 0x2a1d 0x246c 0x26c6 0x28d6 0x2992 0x2a3b 0x2459 0x26cc 0x28c6 0x29ad 0x2a38 0x2447 0x26dc 0x28df 0x29c9 0x2a6a 0x2449 0x26cd 0x293d 0x29ca 0x2a89 0x243a 0x26ed 0x297e 0x2a06 0x2aa5 0x243e 0x26c3 0x2925 0x29d7 0x2a55 0x2464 0x269c 0x28de 0x298a 0x29c5 0x246e 0x264f 0x28b9 0x2971 0x29af 0x2445 0x25fc 0x289b 0x2927 0x295f 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904 0x241d 0x258f 0x282d 0x28da 0x2904>; + }; + + qcom,pc-temp-z3-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4c45 0x4be7 0x4bad 0x4bb7 0x4b9b 0x4d48 0x4c26 0x4bd0 0x4baa 0x4b96 0x4dd0 0x4c76 0x4bee 0x4bac 0x4b97 0x4de1 0x4cc3 0x4bfa 0x4bb4 0x4b9c 0x4dce 0x4cd9 0x4bff 0x4bb6 0x4b9f 0x4db7 0x4cdc 0x4c00 0x4bb7 0x4ba2 0x4dac 0x4cdd 0x4bfe 0x4bb5 0x4ba2 0x4da7 0x4cdd 0x4bfb 0x4bb0 0x4b9f 0x4da5 0x4ce0 0x4bf8 0x4bac 0x4b9b 0x4da2 0x4ce2 0x4bf6 0x4bac 0x4b99 0x4da0 0x4cd4 0x4bf0 0x4bac 0x4b98 0x4da5 0x4cac 0x4bdf 0x4ba7 0x4b98 0x4db6 0x4c9a 0x4bc8 0x4b9b 0x4b95 0x4dc5 0x4cb6 0x4bce 0x4b96 0x4b91 0x4db4 0x4cd7 0x4bef 0x4ba3 0x4b93 0x4d83 0x4cd1 0x4c01 0x4bb3 0x4b97 0x4d54 0x4cac 0x4bec 0x4bad 0x4b94 0x4d30 0x4c8a 0x4bd0 0x4b9c 0x4b8a 0x4d0e 0x4c6f 0x4bcf 0x4b98 0x4b87 0x4cf1 0x4c5e 0x4be1 0x4ba6 0x4b8e 0x4cd8 0x4c62 0x4bee 0x4bb3 0x4b97 0x4cc6 0x4c75 0x4bef 0x4bb3 0x4b9d 0x4cbc 0x4c87 0x4bef 0x4bae 0x4ba1 0x4cb4 0x4c93 0x4bed 0x4bad 0x4ba2 0x4cac 0x4c9c 0x4bea 0x4bb4 0x4ba0 0x4ca3 0x4c9d 0x4be9 0x4bba 0x4b9e 0x4c97 0x4c9b 0x4bef 0x4bb7 0x4b9c 0x4c8c 0x4c97 0x4bf5 0x4bb2 0x4b9a 0x4c7f 0x4c91 0x4bf6 0x4bae 0x4b98 0x4c6f 0x4c8a 0x4bf4 0x4ba9 0x4b96 0x4c5d 0x4c84 0x4bf2 0x4ba5 0x4b94 0x4c4a 0x4c7f 0x4bef 0x4ba2 0x4b91 0x4c3a 0x4c7a 0x4bea 0x4ba0 0x4b8e 0x4c2b 0x4c73 0x4be7 0x4b9f 0x4b8a 0x4c1e 0x4c6b 0x4be5 0x4b9e 0x4b86 0x4c17 0x4c65 0x4be2 0x4b9e 0x4b84 0x4c1b 0x4c5f 0x4bde 0x4b9e 0x4b84 0x4c23 0x4c5a 0x4bda 0x4b9d 0x4b86 0x4c39 0x4c56 0x4bd7 0x4b9c 0x4b86 0x4c4f 0x4c53 0x4bd6 0x4b97 0x4b83 0x4c46 0x4c4f 0x4bd4 0x4b93 0x4b81 0x4c28 0x4c4a 0x4bd2 0x4b93 0x4b82 0x4c1b 0x4c3f 0x4bd0 0x4b93 0x4b82 0x4c19 0x4bfb 0x4bcc 0x4b93 0x4b83 0x4bac 0x4bb3 0x4bb6 0x4b90 0x4b7f 0x4b91 0x4b94 0x4ba0 0x4b89 0x4b78 0x4b89 0x4b8c 0x4b9e 0x4b80 0x4b70 0x4b8b 0x4b87 0x4b8e 0x4b7e 0x4b70 0x4b74 0x4b76 0x4b83 0x4b7c 0x4b6d 0x4b78 0x4b75 0x4b98 0x4b87 0x4b7c 0x4bab 0x4b91 0x4b9b 0x4b8b 0x4b83 0x4bda 0x4b96 0x4b9d 0x4b8e 0x4b84 0x4bf2 0x4b94 0x4b99 0x4b92 0x4b87 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c 0x4c08 0x4ba0 0x4b9f 0x4b95 0x4b8c>; + }; + + qcom,pc-temp-z4-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x4001 0x3c8d 0x3a72 0x3978 0x397b 0x40ed 0x3c83 0x3a6f 0x39c6 0x39b9 0x40da 0x3c60 0x3a4a 0x39d2 0x39c2 0x4086 0x3c0a 0x3a21 0x39c0 0x39b5 0x4000 0x3ba1 0x39fb 0x39a7 0x399e 0x3f71 0x3b4a 0x39dc 0x3990 0x3986 0x3ef7 0x3b02 0x39c2 0x3981 0x3976 0x3e89 0x3acb 0x39ac 0x3976 0x396c 0x3e16 0x3aa0 0x39a0 0x3970 0x3966 0x3d82 0x3a79 0x399a 0x396d 0x3961 0x3cf4 0x3a50 0x3998 0x396a 0x395d 0x3cc5 0x3a2f 0x3998 0x3965 0x3959 0x3cdb 0x3a29 0x3999 0x395f 0x3951 0x3cf0 0x3a35 0x399d 0x3961 0x394e 0x3cc2 0x3a3c 0x39a2 0x3970 0x395b 0x3c4c 0x3a29 0x39a0 0x397b 0x3968 0x3beb 0x39fe 0x398c 0x396b 0x395e 0x3bb2 0x39dd 0x3979 0x394d 0x3947 0x3b8d 0x39c9 0x3978 0x394f 0x3946 0x3b7e 0x39bd 0x3982 0x3988 0x3974 0x3b75 0x39bc 0x3996 0x39ba 0x39a6 0x3b71 0x39bf 0x39ca 0x39be 0x39ab 0x3b75 0x39c9 0x39fe 0x39b9 0x399f 0x3b7b 0x39fa 0x39fe 0x39ae 0x3991 0x3b80 0x3a38 0x39df 0x3993 0x3982 0x3b85 0x3a46 0x39bf 0x397d 0x3975 0x3b8c 0x3a43 0x39a7 0x3973 0x396c 0x3b92 0x3a3e 0x3994 0x396e 0x3965 0x3b9e 0x3a2f 0x3989 0x3969 0x395f 0x3bab 0x3a18 0x3982 0x3965 0x395a 0x3bb3 0x3a05 0x397d 0x3962 0x3955 0x3bba 0x39f5 0x397b 0x395e 0x3951 0x3bbe 0x39e5 0x397a 0x395a 0x394e 0x3bbc 0x39d6 0x3979 0x395a 0x394d 0x3bb5 0x39c8 0x3979 0x395c 0x3950 0x3ba1 0x39ba 0x3978 0x395e 0x3955 0x3b72 0x39ac 0x3976 0x3961 0x395b 0x3b43 0x39a1 0x3973 0x3963 0x3961 0x3afc 0x399e 0x3970 0x3963 0x3963 0x3abc 0x399c 0x396d 0x3963 0x3960 0x3ab4 0x3999 0x396a 0x3962 0x395d 0x3abb 0x3994 0x3967 0x3960 0x395c 0x3ab9 0x3995 0x3962 0x395d 0x395b 0x3aa3 0x39d0 0x395a 0x3959 0x3958 0x3abd 0x39eb 0x3957 0x394b 0x394c 0x3ac6 0x39f6 0x3953 0x3935 0x3934 0x3acb 0x39f8 0x394d 0x3931 0x392d 0x3ac3 0x39fa 0x3959 0x3929 0x3920 0x3ad0 0x3a03 0x3961 0x3925 0x391e 0x3ac0 0x39ff 0x394e 0x392e 0x392c 0x3a9b 0x39f7 0x3956 0x3935 0x3930 0x3a8e 0x39fe 0x3959 0x3936 0x3935 0x3a94 0x3a0e 0x3963 0x3937 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936 0x3aa9 0x3a1d 0x3967 0x393a 0x3936>; + }; + + qcom,pc-temp-z5-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2b3c 0x2daa 0x3498 0x4a8d 0x45cc 0x2ef0 0x3052 0x39fb 0x4721 0x484e 0x3117 0x343d 0x3f9f 0x4802 0x4a61 0x31df 0x385f 0x430e 0x4b83 0x4d9f 0x326a 0x3a69 0x44ec 0x4e02 0x5124 0x32f3 0x3bab 0x4673 0x5049 0x55e1 0x33c6 0x3ce5 0x4810 0x514c 0x5936 0x34d0 0x3e95 0x49be 0x511b 0x5a23 0x35db 0x4119 0x4b35 0x5160 0x5a1d 0x36fa 0x4312 0x4c4c 0x5327 0x5b6b 0x3859 0x42b6 0x4bad 0x5424 0x5e2c 0x3a2d 0x3f5c 0x45e6 0x5167 0x6138 0x3c44 0x3ed3 0x3ee4 0x49ed 0x6100 0x3d63 0x47a6 0x4250 0x472f 0x5e7d 0x3d9a 0x506d 0x5049 0x50b3 0x5f98 0x3db5 0x5016 0x57f1 0x5c40 0x639a 0x3dda 0x4c6d 0x532f 0x5d14 0x64bc 0x3dd6 0x4a75 0x4bb9 0x59b9 0x646c 0x3d86 0x49e6 0x55e6 0x5b90 0x6454 0x3cdc 0x49b6 0x76e4 0x6b24 0x646b 0x3bcd 0x5034 0x875d 0x7705 0x6492 0x3ad1 0x649b 0x78a4 0x6a60 0x5e9c 0x3a04 0x7968 0x6282 0x5014 0x511e 0x3939 0x8c1a 0x56c4 0x4873 0x4bc7 0x3846 0x9a39 0x4fd8 0x5026 0x4d8e 0x3716 0x9aa6 0x4dfb 0x5780 0x5074 0x35e9 0x91df 0x53c1 0x5aa0 0x53ba 0x34ed 0x87db 0x5d83 0x5d20 0x57f1 0x33ea 0x7eb5 0x65eb 0x5e8b 0x5cc6 0x32dd 0x764e 0x6eb9 0x601d 0x628a 0x31ca 0x720c 0x75c6 0x61b9 0x67fc 0x30bf 0x6fd5 0x79eb 0x63f1 0x6c9c 0x2ffa 0x6e15 0x7d26 0x6810 0x7085 0x2f5e 0x6c28 0x8068 0x6dc5 0x7165 0x2ed6 0x6a83 0x83d1 0x7653 0x6fdc 0x2e78 0x6a47 0x8529 0x7b5b 0x6e81 0x2ea9 0x6b32 0x8003 0x7adf 0x6f61 0x2f11 0x6ca0 0x7890 0x796f 0x710e 0x303e 0x6e9b 0x7749 0x7672 0x709c 0x317f 0x7119 0x77a9 0x6cad 0x6a94 0x3162 0x71bd 0x77df 0x65cc 0x65f5 0x300b 0x6c45 0x7771 0x66c4 0x66af 0x2fb0 0x60cd 0x7669 0x680b 0x6789 0x3015 0x4018 0x70b0 0x6813 0x6600 0x2ca4 0x3328 0x596b 0x6764 0x62b7 0x2bbe 0x3022 0x477d 0x6688 0x6215 0x2b68 0x2f70 0x4725 0x57da 0x5967 0x2b6c 0x2f09 0x3dd8 0x58e5 0x64be 0x2ab7 0x2db9 0x398d 0x5bd2 0x6460 0x2ae0 0x2ded 0x457f 0x6bcd 0x75c0 0x2cb0 0x2ff3 0x438f 0x6311 0x7110 0x2d80 0x2fa5 0x439f 0x6129 0x668d 0x2d89 0x2ebe 0x3ec3 0x61e3 0x62ca 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005 0x2d50 0x2e6c 0x3eb4 0x5b72 0x6005>; + }; + + qcom,pc-temp-z6-lut { + qcom,lut-col-legend = <0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x409a 0x3c2e 0x39dd 0x392f 0x3913 0x416d 0x3c48 0x39ee 0x394b 0x392d 0x419b 0x3c57 0x39ee 0x3952 0x3933 0x4181 0x3c50 0x39e4 0x394f 0x3931 0x413b 0x3c33 0x39d5 0x3947 0x392a 0x40e4 0x3c0c 0x39c7 0x393d 0x3921 0x409c 0x3be5 0x39bb 0x3935 0x391b 0x4062 0x3bcb 0x39b0 0x392e 0x3915 0x4027 0x3bb9 0x39aa 0x392a 0x3910 0x3fe0 0x3ba7 0x39a7 0x3929 0x390e 0x3f9a 0x3b8a 0x39a3 0x3928 0x390c 0x3f73 0x3b64 0x399a 0x3924 0x390b 0x3f65 0x3b56 0x398e 0x391c 0x3906 0x3f55 0x3b62 0x3992 0x3919 0x3903 0x3f1e 0x3b70 0x39a4 0x3927 0x390a 0x3ec0 0x3b64 0x39ac 0x3933 0x3912 0x3e70 0x3b3f 0x3999 0x392a 0x390c 0x3e3a 0x3b22 0x3982 0x3915 0x38fe 0x3e0f 0x3b10 0x3982 0x3914 0x38fc 0x3df2 0x3b06 0x3991 0x3936 0x3915 0x3ddc 0x3b09 0x39a5 0x3953 0x3930 0x3dd2 0x3b19 0x39c1 0x3956 0x3934 0x3dd2 0x3b2e 0x39d7 0x3953 0x3934 0x3dd7 0x3b4e 0x39d6 0x394f 0x3932 0x3ddc 0x3b6d 0x39c9 0x3948 0x392b 0x3de1 0x3b75 0x39be 0x3942 0x3924 0x3de6 0x3b75 0x39b8 0x393d 0x391f 0x3dea 0x3b74 0x39b4 0x3938 0x391c 0x3dee 0x3b6e 0x39b1 0x3935 0x3919 0x3df0 0x3b64 0x39ae 0x3931 0x3916 0x3df0 0x3b5c 0x39ab 0x392e 0x3913 0x3df0 0x3b54 0x39a9 0x392b 0x3910 0x3def 0x3b4c 0x39a8 0x3928 0x390d 0x3ded 0x3b46 0x39a7 0x3928 0x390c 0x3deb 0x3b40 0x39a7 0x3929 0x390c 0x3deb 0x3b3c 0x39a6 0x392a 0x390c 0x3ded 0x3b38 0x39a4 0x392c 0x390f 0x3def 0x3b35 0x39a2 0x392d 0x3913 0x3def 0x3b35 0x39a0 0x392d 0x3914 0x3dee 0x3b36 0x399f 0x392a 0x3912 0x3deb 0x3b36 0x399e 0x3928 0x3910 0x3de2 0x3b35 0x399d 0x3927 0x3910 0x3dd8 0x3b34 0x399b 0x3927 0x390f 0x3dcd 0x3b2c 0x3997 0x3926 0x390f 0x3da1 0x3b16 0x398b 0x391d 0x3908 0x3d94 0x3b10 0x397f 0x3911 0x38f9 0x3d93 0x3b0a 0x397c 0x390a 0x38f2 0x3d8f 0x3b0c 0x3979 0x3906 0x38ec 0x3d8d 0x3b07 0x3977 0x3903 0x38ea 0x3d95 0x3b0c 0x397c 0x390d 0x38f8 0x3da1 0x3b20 0x3983 0x3914 0x38ff 0x3dbd 0x3b30 0x398c 0x3918 0x3902 0x3de0 0x3b45 0x3993 0x391d 0x3906 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d 0x3e15 0x3b6d 0x39a2 0x3924 0x390d>; + }; + + qcom,pc-temp-y1-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1dae 0x1a6c 0x17b7 0x1540 0x1467 0x143b 0x1db4 0x1a6f 0x17c3 0x153f 0x1466 0x143d 0x1dc0 0x1a74 0x17ca 0x153e 0x1466 0x143e 0x1dcd 0x1a7a 0x17ce 0x153c 0x1466 0x1440 0x1dd8 0x1a7e 0x17d0 0x153b 0x1467 0x1441 0x1ddd 0x1a80 0x17d0 0x153a 0x1467 0x1443 0x1ddc 0x1a80 0x17cc 0x153a 0x1468 0x1443 0x1dda 0x1a80 0x17c6 0x153a 0x146a 0x1444 0x1dd3 0x1a7d 0x17c5 0x153b 0x146c 0x1445 0x1dbc 0x1a76 0x17c8 0x153c 0x146d 0x1446 0x1daa 0x1a70 0x17ca 0x153d 0x146f 0x1448 0x1db3 0x1a6e 0x17c6 0x153d 0x1470 0x1449 0x1dc8 0x1a6f 0x17c0 0x153d 0x1472 0x144b 0x1ddc 0x1a74 0x17c1 0x153e 0x1474 0x144d 0x1df4 0x1a85 0x17d0 0x1545 0x1479 0x1452 0x1e03 0x1a97 0x17db 0x154d 0x147c 0x1454 0x1dfa 0x1aa4 0x17df 0x154f 0x147c 0x1455 0x1de7 0x1aaf 0x17e3 0x1552 0x147d 0x1455 0x1dd8 0x1ab0 0x17e4 0x1554 0x147e 0x1456 0x1dca 0x1aa1 0x17e2 0x1555 0x1480 0x1459 0x1dc3 0x1a95 0x17e2 0x1558 0x1483 0x145c 0x1dd6 0x1a97 0x17ed 0x155c 0x1487 0x1460 0x1df9 0x1a9f 0x17fb 0x1560 0x148b 0x1463 0x1e01 0x1aa5 0x17fd 0x1565 0x148e 0x1467 0x1e00 0x1aa8 0x17f8 0x1569 0x1491 0x146a 0x1e04 0x1aac 0x17f7 0x156d 0x1493 0x146e 0x1e09 0x1ab8 0x1800 0x1571 0x1496 0x1472 0x1e0c 0x1acc 0x180b 0x1576 0x149a 0x1475 0x1e0a 0x1ad7 0x180e 0x157b 0x149d 0x1478 0x1df8 0x1adc 0x1812 0x1581 0x14a0 0x147a 0x1de0 0x1ade 0x1817 0x1586 0x14a3 0x147d 0x1dd9 0x1adb 0x181b 0x158b 0x14a7 0x1480 0x1ddb 0x1ad7 0x181f 0x1590 0x14aa 0x1484 0x1ddd 0x1ad7 0x1820 0x1593 0x14ad 0x1487 0x1de1 0x1ad5 0x1821 0x1596 0x14b0 0x1489 0x1de8 0x1ad3 0x1823 0x1599 0x14b2 0x148b 0x1df7 0x1adf 0x1827 0x159b 0x14b4 0x148c 0x1e0a 0x1aef 0x182c 0x159d 0x14b5 0x148d 0x1e0d 0x1aef 0x1831 0x159e 0x14b5 0x148e 0x1dff 0x1ae3 0x1835 0x159f 0x14b6 0x148e 0x1df5 0x1adf 0x183a 0x15a1 0x14b7 0x148f 0x1df6 0x1ae5 0x1841 0x15a5 0x14b9 0x1491 0x1df6 0x1aeb 0x184c 0x15a8 0x14ba 0x1492 0x1df6 0x1af2 0x1849 0x15aa 0x14bb 0x1493 0x1dfa 0x1af8 0x1850 0x15af 0x14be 0x1495 0x1e04 0x1b0b 0x1850 0x15b1 0x14be 0x1496 0x1e09 0x1b08 0x1859 0x15b4 0x14be 0x1496 0x1e26 0x1b0e 0x1863 0x15b4 0x14be 0x1496 0x1e37 0x1b0b 0x186b 0x15b6 0x14bf 0x1496 0x1e2c 0x1b1e 0x1867 0x15b9 0x14c2 0x1498 0x1e29 0x1b3f 0x1879 0x15c2 0x14c5 0x149b 0x1e38 0x1b5b 0x1895 0x15d1 0x14cc 0x14a0 0x1e61 0x1b5f 0x18a8 0x15e4 0x14d3 0x14a6 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac 0x1eb6 0x1b7e 0x18ca 0x15f7 0x14dc 0x14ac>; + }; + + qcom,pc-temp-y2-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x25d6 0x28a1 0x29b8 0x2b2a 0x2b60 0x2c89 0x2638 0x287f 0x299b 0x2b15 0x2b62 0x2c51 0x2674 0x286a 0x297a 0x2afb 0x2b61 0x2bfc 0x2693 0x285f 0x2959 0x2ade 0x2b5e 0x2ba2 0x269f 0x285b 0x293d 0x2abd 0x2b58 0x2b5a 0x26a2 0x285a 0x292b 0x2a9a 0x2b51 0x2b3c 0x266c 0x2867 0x2922 0x2a6d 0x2b48 0x2b43 0x260b 0x287d 0x291b 0x2a3f 0x2b3b 0x2b4e 0x25f2 0x2878 0x2916 0x2a29 0x2b28 0x2b4d 0x25fe 0x283e 0x2912 0x2a1c 0x2b09 0x2b3a 0x2615 0x2814 0x2910 0x2a13 0x2ae5 0x2b24 0x2698 0x2862 0x291a 0x2a04 0x2ab6 0x2afb 0x2784 0x28ea 0x2933 0x29f0 0x2a85 0x2ac3 0x27ba 0x2909 0x295a 0x29f2 0x2a7a 0x2abc 0x26d8 0x28f6 0x29a8 0x2a1d 0x2a90 0x2af0 0x2601 0x28e9 0x29e0 0x2a53 0x2ab0 0x2b19 0x25e5 0x28ff 0x29fa 0x2a91 0x2aec 0x2b1b 0x25de 0x2924 0x2a0e 0x2ad0 0x2b33 0x2b18 0x25d8 0x292d 0x2a1d 0x2aef 0x2b47 0x2b23 0x25d2 0x292c 0x2a2b 0x2afc 0x2b48 0x2b59 0x25cd 0x2929 0x2a36 0x2b0a 0x2b4a 0x2b9b 0x25ca 0x28f3 0x2a3f 0x2b29 0x2b78 0x2bd9 0x25c8 0x2849 0x2a48 0x2b54 0x2bc0 0x2c13 0x25c6 0x27d1 0x2a4b 0x2b74 0x2be2 0x2c3d 0x25c3 0x275f 0x2a50 0x2b8f 0x2bf6 0x2c5c 0x25c0 0x271c 0x2a54 0x2ba1 0x2c07 0x2c71 0x25bf 0x270e 0x2a52 0x2bac 0x2c19 0x2c83 0x25be 0x2700 0x2a4a 0x2bb0 0x2c2d 0x2c96 0x25bd 0x26ed 0x2a46 0x2ba7 0x2c35 0x2cb5 0x25bc 0x26d4 0x2a44 0x2b8e 0x2c41 0x2cec 0x25bb 0x26b9 0x2a3f 0x2b80 0x2c4d 0x2d11 0x25bb 0x26a1 0x29e9 0x2b83 0x2c40 0x2d02 0x25ba 0x268b 0x294e 0x2b8f 0x2c2f 0x2cda 0x25b9 0x2672 0x290b 0x2b9c 0x2c33 0x2cca 0x25b8 0x2655 0x28fa 0x2b99 0x2c39 0x2cd1 0x25b8 0x263a 0x28ee 0x2b84 0x2c35 0x2cd6 0x25b7 0x2622 0x28e6 0x2b68 0x2c34 0x2cdc 0x25b7 0x2604 0x290b 0x2b59 0x2c39 0x2ce8 0x25b6 0x25ec 0x293c 0x2b5f 0x2c3b 0x2ce7 0x25b6 0x25de 0x291d 0x2b60 0x2c36 0x2cd1 0x25b6 0x25d4 0x28ba 0x2b5f 0x2c32 0x2cc5 0x25b6 0x25cb 0x289c 0x2b62 0x2c34 0x2ccc 0x25b6 0x25c4 0x28a6 0x2b5d 0x2c32 0x2ccf 0x25b5 0x25be 0x281b 0x2b46 0x2c13 0x2cc8 0x25b5 0x25bb 0x27d7 0x2b34 0x2c13 0x2cb0 0x25b5 0x25bb 0x27c4 0x2b11 0x2c20 0x2c82 0x25b5 0x25ba 0x2810 0x2b0d 0x2c0a 0x2c51 0x25b5 0x25b9 0x2851 0x2b23 0x2be8 0x2c48 0x25b5 0x25b8 0x2853 0x2b28 0x2bef 0x2c50 0x25b4 0x25b8 0x2837 0x2ae6 0x2c1e 0x2c3a 0x25b4 0x25b6 0x2800 0x2acc 0x2bf7 0x2bfd 0x25b4 0x25b5 0x27bc 0x2aa1 0x2b7e 0x2ba7 0x25b4 0x25b4 0x2786 0x2a49 0x2b0f 0x2b35 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a 0x25b2 0x25b4 0x2773 0x2a1c 0x2a4f 0x2a4a>; + }; + + qcom,pc-temp-y3-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x347a 0x3456 0x3421 0x33e5 0x33e0 0x33d8 0x356b 0x345f 0x341a 0x33e4 0x33e0 0x33da 0x35ff 0x346c 0x3416 0x33e3 0x33e0 0x33db 0x364d 0x3479 0x3416 0x33e3 0x33e0 0x33dd 0x366b 0x3484 0x3418 0x33e3 0x33e0 0x33de 0x3670 0x3489 0x341c 0x33e5 0x33e0 0x33de 0x35ec 0x3489 0x3423 0x33e8 0x33e0 0x33de 0x34fc 0x3488 0x342b 0x33ed 0x33e1 0x33de 0x34bb 0x348b 0x342e 0x33ef 0x33e1 0x33de 0x34ba 0x349e 0x342f 0x33f0 0x33e1 0x33dd 0x34bb 0x34ac 0x3430 0x33f0 0x33e1 0x33dd 0x34d3 0x349e 0x343d 0x33f7 0x33e4 0x33df 0x3504 0x3481 0x3450 0x3401 0x33e9 0x33e2 0x3510 0x3471 0x3451 0x3402 0x33ea 0x33e3 0x34ec 0x3468 0x343b 0x33fe 0x33e8 0x33e2 0x34cc 0x3462 0x3427 0x33fb 0x33e6 0x33e2 0x34d0 0x345f 0x3422 0x33fd 0x33e8 0x33e2 0x34e0 0x345d 0x341f 0x3401 0x33ec 0x33e3 0x34e7 0x345a 0x341b 0x3401 0x33ec 0x33e3 0x34e9 0x3455 0x3416 0x33f9 0x33e7 0x33e0 0x34ea 0x344f 0x3411 0x33f0 0x33e3 0x33dd 0x34ec 0x3445 0x340c 0x33e8 0x33e1 0x33dc 0x34f0 0x3435 0x3407 0x33e3 0x33e0 0x33db 0x34f5 0x3427 0x3406 0x33e2 0x33df 0x33db 0x3500 0x341c 0x3405 0x33e3 0x33de 0x33db 0x3512 0x3417 0x3405 0x33e4 0x33de 0x33da 0x3525 0x3418 0x3405 0x33e3 0x33de 0x33da 0x3539 0x341b 0x3405 0x33e3 0x33dd 0x33da 0x354f 0x341f 0x3405 0x33e5 0x33dd 0x33da 0x356b 0x3423 0x3405 0x33e9 0x33dd 0x33d9 0x358d 0x3428 0x3405 0x33ec 0x33dd 0x33d9 0x35b2 0x342d 0x3400 0x33ed 0x33de 0x33d9 0x35da 0x3434 0x33f9 0x33ec 0x33de 0x33da 0x360a 0x343c 0x33f6 0x33ec 0x33df 0x33da 0x3641 0x3449 0x33f7 0x33ea 0x33de 0x33da 0x3680 0x3458 0x33f8 0x33e8 0x33de 0x33d9 0x36c1 0x3468 0x33fb 0x33e6 0x33de 0x33d9 0x3702 0x347a 0x3402 0x33e4 0x33dd 0x33d9 0x3742 0x3490 0x3408 0x33e3 0x33dd 0x33d9 0x3781 0x34b0 0x340c 0x33e3 0x33dd 0x33d9 0x37c1 0x34dc 0x340f 0x33e3 0x33dd 0x33d9 0x3803 0x3511 0x3415 0x33e3 0x33de 0x33da 0x3845 0x3550 0x341e 0x33e3 0x33de 0x33da 0x3892 0x35a3 0x3421 0x33e4 0x33de 0x33da 0x38ea 0x3613 0x3429 0x33e3 0x33de 0x33da 0x390d 0x3642 0x3430 0x33eb 0x33df 0x33dc 0x393f 0x363e 0x3435 0x33ec 0x33e1 0x33dd 0x395c 0x3658 0x3442 0x33f0 0x33e3 0x33e0 0x398d 0x36b9 0x3451 0x33f2 0x33e2 0x33e0 0x3a0b 0x3718 0x3452 0x33ee 0x33e1 0x33dd 0x3a97 0x37a6 0x345a 0x33f0 0x33e0 0x33dd 0x3b31 0x3888 0x346f 0x33f5 0x33e3 0x33e1 0x3c10 0x3978 0x3492 0x33f9 0x33e6 0x33e4 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6 0x3f2c 0x3a7b 0x34ca 0x3403 0x33ea 0x33e6>; + }; + + qcom,pc-temp-y4-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x45b5 0x41d2 0x40f2 0x406d 0x4045 0x4044 0x452b 0x41db 0x40ef 0x4073 0x4045 0x4042 0x44eb 0x41eb 0x40ef 0x4078 0x4047 0x4041 0x44e9 0x4200 0x40f2 0x407b 0x4048 0x4040 0x4515 0x421b 0x40f7 0x407d 0x404a 0x4040 0x4561 0x4239 0x40fe 0x407e 0x404b 0x4040 0x4627 0x4263 0x4106 0x407c 0x404d 0x4041 0x478b 0x428e 0x4111 0x407a 0x404e 0x4044 0x4914 0x42a4 0x411c 0x407a 0x4051 0x4046 0x4b24 0x42ad 0x4127 0x4081 0x4055 0x4049 0x4c74 0x42bc 0x4138 0x408c 0x405b 0x404d 0x4a3e 0x4407 0x419f 0x409e 0x4069 0x4059 0x4560 0x4626 0x4237 0x40b4 0x407d 0x4068 0x437a 0x4642 0x4251 0x40bd 0x4081 0x406c 0x4347 0x43a8 0x4203 0x40bf 0x407d 0x406b 0x432d 0x41b1 0x41aa 0x40c3 0x407b 0x406a 0x4320 0x41b5 0x416e 0x40ec 0x4091 0x407a 0x430d 0x41e2 0x413b 0x4129 0x40ba 0x4098 0x42ef 0x41ed 0x4117 0x412a 0x40c0 0x409d 0x42b4 0x41c5 0x40fa 0x40d1 0x4094 0x407d 0x4274 0x4198 0x40e3 0x4085 0x4066 0x405b 0x4249 0x4180 0x40d4 0x4078 0x4054 0x404d 0x4228 0x416e 0x40c8 0x4072 0x4049 0x4043 0x421f 0x416b 0x40c2 0x406f 0x4048 0x4042 0x4223 0x415f 0x40be 0x406b 0x4048 0x4042 0x422b 0x414f 0x40bb 0x4069 0x4049 0x4043 0x4231 0x4143 0x40ba 0x406b 0x404b 0x4045 0x423b 0x4137 0x40ba 0x406d 0x404e 0x4048 0x4246 0x4136 0x40b9 0x406e 0x4051 0x404c 0x4252 0x4142 0x40b4 0x4070 0x4057 0x4051 0x425e 0x4154 0x40b0 0x4072 0x405e 0x4058 0x426a 0x4167 0x40b4 0x4074 0x4068 0x4063 0x4276 0x417f 0x40bd 0x4076 0x4073 0x4070 0x4283 0x4198 0x40c4 0x4074 0x4075 0x4072 0x4290 0x41b2 0x40c9 0x4069 0x4064 0x4061 0x429c 0x41cd 0x40cd 0x405e 0x404f 0x404c 0x42a8 0x41ef 0x40d2 0x405b 0x4044 0x4043 0x42b5 0x421f 0x40d8 0x4059 0x403e 0x403f 0x42c7 0x4244 0x40dc 0x405a 0x403e 0x4040 0x42e1 0x4252 0x40e9 0x405d 0x4042 0x4045 0x4308 0x425c 0x40fd 0x4060 0x4047 0x404a 0x433b 0x4262 0x410c 0x4063 0x4048 0x404b 0x437e 0x4270 0x4118 0x4064 0x4046 0x4048 0x43d3 0x4287 0x4129 0x4061 0x403d 0x403b 0x442a 0x42c2 0x4147 0x406b 0x4041 0x403e 0x441b 0x42ef 0x4160 0x4075 0x4057 0x405a 0x441e 0x4307 0x4166 0x4084 0x4070 0x4078 0x43ed 0x432a 0x4193 0x40a2 0x4099 0x40a2 0x43d0 0x436e 0x41e6 0x40be 0x409c 0x4098 0x43e5 0x4383 0x41de 0x409e 0x406e 0x4064 0x43f6 0x4384 0x41d8 0x409e 0x4060 0x4059 0x4411 0x43a0 0x41fb 0x40bd 0x4070 0x4067 0x4463 0x43f1 0x4266 0x40fb 0x4090 0x4085 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118 0x470a 0x44a2 0x432d 0x41de 0x4141 0x4118>; + }; + + qcom,pc-temp-y5-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x2208 0x348a 0x3ab0 0x3545 0x4573 0x3634 0x2208 0x34aa 0x3839 0x3326 0x4393 0x3e82 0x269f 0x34e2 0x3660 0x31db 0x419b 0x43da 0x2f8b 0x3522 0x3519 0x3130 0x3fbf 0x46e0 0x3428 0x3557 0x345a 0x30f0 0x3e34 0x4838 0x3590 0x3572 0x341a 0x30e7 0x3d2f 0x4884 0x30ee 0x3576 0x34b3 0x32d3 0x3ca4 0x46c7 0x2869 0x3578 0x35a4 0x35e5 0x3c3f 0x4385 0x267f 0x34b6 0x35c2 0x3648 0x3b81 0x4119 0x2a54 0x3032 0x3545 0x34d0 0x3996 0x3e92 0x2ff6 0x2cf8 0x3494 0x33cf 0x387f 0x3ce5 0x37e1 0x2fd6 0x333d 0x3525 0x3964 0x3cfd 0x4112 0x360e 0x319c 0x3768 0x3acb 0x3dbd 0x4280 0x3a64 0x326c 0x37dc 0x3b0d 0x3dbf 0x373b 0x3dd4 0x395e 0x3745 0x3a7a 0x3cb2 0x2cf9 0x3f72 0x3eca 0x36d1 0x3a41 0x3bb0 0x2d03 0x3ec5 0x3f83 0x384b 0x3ae8 0x3b5d 0x2edc 0x3dc2 0x3fc3 0x3b9d 0x3c38 0x3b2b 0x2f8c 0x3d9a 0x3f92 0x3dc7 0x3e57 0x3b93 0x2f1e 0x3df3 0x3ecf 0x3f34 0x4225 0x3e9f 0x2e5c 0x3e54 0x3de6 0x3fc8 0x445b 0x4233 0x2d64 0x3c6d 0x3c08 0x3c17 0x4527 0x44e0 0x2c30 0x3697 0x3971 0x3578 0x4604 0x471b 0x2b6b 0x3248 0x38a0 0x33d2 0x4627 0x47ff 0x2b06 0x2f1a 0x38d8 0x353a 0x4512 0x484d 0x2ad4 0x2d6f 0x3925 0x3660 0x43d2 0x484f 0x2add 0x2d4c 0x3975 0x3678 0x4315 0x4790 0x2aec 0x2d55 0x39cc 0x366c 0x4294 0x45bc 0x2af3 0x2d44 0x3a34 0x38ed 0x427b 0x43ff 0x2b16 0x2d12 0x3b09 0x40ee 0x4270 0x426f 0x2b4e 0x2d07 0x3ba6 0x465a 0x4280 0x41aa 0x2b80 0x2d07 0x38cb 0x47e5 0x43ef 0x42bb 0x2ba9 0x2cec 0x3382 0x48db 0x472c 0x45f6 0x2bd0 0x2ce9 0x319e 0x48b8 0x4a98 0x495f 0x2bf8 0x2d41 0x31a4 0x45bb 0x4e8c 0x4c69 0x2c20 0x2daa 0x31b5 0x4185 0x51da 0x4ea9 0x2c45 0x2dd9 0x3221 0x3e14 0x52fb 0x508e 0x2c64 0x2d8a 0x34af 0x3aee 0x5257 0x524a 0x2c6c 0x2d32 0x3713 0x3918 0x50bc 0x5292 0x2c5a 0x2d52 0x36de 0x38bf 0x4e90 0x50e7 0x2c45 0x2d99 0x34f7 0x3913 0x4dbc 0x4f8f 0x2c53 0x2da9 0x354f 0x3906 0x4ea8 0x5136 0x2cb7 0x2d71 0x370b 0x3898 0x515e 0x56c7 0x2d6c 0x2d2c 0x33cd 0x3962 0x555b 0x5c52 0x2e6e 0x2cc8 0x325a 0x3610 0x4cc2 0x4ea4 0x2fc4 0x2d10 0x320a 0x3e49 0x4394 0x4373 0x30b0 0x2d1b 0x3431 0x3e08 0x42cc 0x40b6 0x322c 0x2e86 0x370e 0x4092 0x40be 0x3f21 0x3256 0x3099 0x3915 0x3fe1 0x3e27 0x3e5b 0x322c 0x3127 0x38b1 0x3e5f 0x428d 0x410e 0x3117 0x3039 0x38e1 0x4283 0x4414 0x4431 0x2f77 0x2f18 0x37f8 0x4528 0x4741 0x4a06 0x2e6f 0x2e5e 0x37ca 0x4396 0x477b 0x4ab1 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b 0x2b65 0x2d9d 0x3932 0x4343 0x45a6 0x476b>; + }; + + qcom,pc-temp-y6-lut { + qcom,lut-col-legend = <0xfffffff6 0x0 0xa 0x19 0x28 0x32>; + qcom,lut-row-legend = <0x2710 0x2648 0x2580 0x24b8 0x23f0 0x2328 0x2260 0x2198 0x20d0 0x2008 0x1f40 0x1e78 0x1db0 0x1ce8 0x1c20 0x1b58 0x1a90 0x19c8 0x1900 0x1838 0x1770 0x16a8 0x15e0 0x1518 0x1450 0x1388 0x12c0 0x11f8 0x1130 0x1068 0xfa0 0xed8 0xe10 0xd48 0xc80 0xbb8 0xaf0 0xa28 0x960 0x898 0x7d0 0x708 0x640 0x578 0x4b0 0x3e8 0x384 0x320 0x2bc 0x258 0x1f4 0x190 0x12c 0xc8 0x64 0x0>; + qcom,lut-data = <0x1af4 0x1607 0x1492 0x13c9 0x139d 0x1392 0x1afb 0x160e 0x148d 0x13c8 0x139d 0x1393 0x1aff 0x1616 0x148a 0x13c7 0x139d 0x1394 0x1aff 0x161e 0x148a 0x13c8 0x139d 0x1395 0x1afc 0x1626 0x148c 0x13c9 0x139e 0x1395 0x1af7 0x162e 0x148e 0x13ca 0x139f 0x1396 0x1ac7 0x1636 0x1494 0x13cc 0x139f 0x1397 0x1a78 0x163e 0x149c 0x13cf 0x13a1 0x1397 0x1a74 0x1646 0x14a1 0x13d2 0x13a2 0x1398 0x1aff 0x164c 0x14a3 0x13d4 0x13a3 0x1399 0x1b70 0x1657 0x14a8 0x13d7 0x13a5 0x139a 0x1af4 0x16ac 0x14cc 0x13e2 0x13ac 0x139f 0x19d3 0x172c 0x1503 0x13ef 0x13b5 0x13a6 0x1941 0x172c 0x150b 0x13f2 0x13b7 0x13a8 0x190e 0x1670 0x14e5 0x13f1 0x13b5 0x13a7 0x18f6 0x15e2 0x14be 0x13f0 0x13b3 0x13a7 0x18fb 0x15e4 0x14ab 0x13fd 0x13bb 0x13ac 0x1909 0x15f5 0x149c 0x1412 0x13c9 0x13b5 0x190d 0x15f9 0x148f 0x1412 0x13cb 0x13b7 0x190c 0x15ed 0x1483 0x13f3 0x13bb 0x13ab 0x190a 0x15e0 0x147a 0x13d6 0x13ab 0x139f 0x190d 0x15d6 0x1473 0x13cd 0x13a4 0x139a 0x191a 0x15ce 0x146e 0x13c8 0x13a1 0x1397 0x192c 0x15c9 0x146d 0x13c7 0x13a0 0x1397 0x1945 0x15c7 0x146e 0x13c7 0x13a0 0x1397 0x1964 0x15c6 0x146f 0x13c8 0x13a0 0x1398 0x1982 0x15cb 0x1470 0x13c9 0x13a1 0x1398 0x19a0 0x15d5 0x1473 0x13ca 0x13a2 0x1399 0x19c0 0x15e2 0x1475 0x13cc 0x13a3 0x139a 0x19e6 0x15f3 0x1476 0x13d0 0x13a5 0x139c 0x1a11 0x1607 0x1477 0x13d4 0x13a7 0x139e 0x1a3f 0x161d 0x1478 0x13d6 0x13ab 0x13a2 0x1a72 0x1638 0x1479 0x13d7 0x13af 0x13a6 0x1aa7 0x1655 0x147b 0x13d6 0x13b0 0x13a7 0x1ae0 0x1676 0x147f 0x13d2 0x13ab 0x13a2 0x1b1c 0x169b 0x1483 0x13ce 0x13a5 0x139c 0x1b59 0x16c6 0x1488 0x13cc 0x13a2 0x139a 0x1b96 0x16f8 0x1490 0x13cb 0x13a0 0x1398 0x1bd4 0x1732 0x149a 0x13ca 0x13a0 0x1399 0x1c13 0x1772 0x14a5 0x13cb 0x13a1 0x139a 0x1c51 0x17bc 0x14b0 0x13cd 0x13a3 0x139c 0x1c90 0x1811 0x14bf 0x13ce 0x13a4 0x139d 0x1cd3 0x1875 0x14d0 0x13cf 0x13a3 0x139c 0x1d22 0x18ef 0x14e0 0x13d0 0x13a1 0x1399 0x1d80 0x1984 0x14f9 0x13d2 0x13a3 0x139a 0x1da5 0x19b9 0x150c 0x13db 0x13a9 0x13a3 0x1dcf 0x19c4 0x1513 0x13e1 0x13b2 0x13ad 0x1dde 0x19e7 0x152f 0x13ec 0x13bf 0x13bb 0x1e04 0x1a57 0x155a 0x13f6 0x13c0 0x13b8 0x1e6d 0x1abf 0x1560 0x13eb 0x13b2 0x13a7 0x1edf 0x1b41 0x1573 0x13ee 0x13ae 0x13a5 0x1f66 0x1c0d 0x15ab 0x13fd 0x13b6 0x13ac 0x2034 0x1cdf 0x160e 0x1415 0x13c2 0x13b7 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4 0x23c8 0x1de5 0x16a3 0x1461 0x13f8 0x13e4>; + }; + }; + }; + }; + }; + + fragment@12 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm1 { + reg = <0x4f>; + label = "pa_therm1"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@13 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x4d 0xffffffff 0x4e 0xffffffff 0x4f 0xffffffff 0x52>; + + pa_therm1 { + reg = <0x4f>; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + }; + }; + }; + + fragment@14 { + target = <0xffffffff>; + + __overlay__ { + compatible = "qcom,ufs-phy-qmp-v3"; + vdda-phy-supply = <0xffffffff>; + vdda-pll-supply = <0xffffffff>; + vdda-phy-max-microamp = <0xf5b4>; + vdda-pll-max-microamp = <0x477c>; + status = "ok"; + }; + }; + + fragment@15 { + target = <0xffffffff>; + + __overlay__ { + vdd-hba-supply = <0xffffffff>; + vdd-hba-fixed-regulator; + vcc-supply = <0xffffffff>; + vcc-voltage-level = <0x2d2a80 0x2d2a80>; + vcc-max-microamp = <0x927c0>; + vccq2-supply = <0xffffffff>; + vccq2-voltage-level = <0x1ab3f0 0x1dc130>; + vccq2-max-microamp = <0x927c0>; + qcom,vddp-ref-clk-supply = <0xffffffff>; + qcom,vddp-ref-clk-max-microamp = <0x64>; + status = "ok"; + }; + }; + + fragment@16 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0x8b290>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <0x1b7740 0x1b7740>; + qcom,vdd-io-current-level = <0x0 0x4f588>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + status = "ok"; + }; + }; + + fragment@17 { + target = <0xffffffff>; + + __overlay__ { + vdd-supply = <0xffffffff>; + qcom,vdd-voltage-level = <0x2d2a80 0x2d2a80>; + qcom,vdd-current-level = <0x0 0xc3500>; + vdd-io-supply = <0xffffffff>; + qcom,vdd-io-voltage-level = <0x1b7740 0x2d0370>; + qcom,vdd-io-current-level = <0x0 0x55f0>; + pinctrl-names = "active", "sleep"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff 0xffffffff>; + cd-gpios = <0xffffffff 0x45 0x1>; + status = "ok"; + }; + }; + + fragment@18 { + target = <0xffffffff>; + + __overlay__ { + + pa-therm1 { + polling-delay-passive = <0x0>; + polling-delay = <0x0>; + thermal-governor = "user_space"; + thermal-sensors = <0xffffffff 0x4f>; + wake-capable-sensor; + + trips { + + active-config0 { + temperature = <0x1e848>; + hysteresis = <0x3e8>; + type = "passive"; + }; + }; + }; + + quiet-therm-step { + status = "disabled"; + }; + }; + }; + + fragment@19 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@20 { + target = <0xffffffff>; + + __overlay__ { + qcom,battery-data = <0x13>; + qcom,qg-iterm-ma = <0x64>; + qcom,hold-soc-while-full; + qcom,linearize-soc; + qcom,cl-feedback-on; + }; + }; + + fragment@21 { + target = <0xffffffff>; + + __overlay__ { + io-channels = <0xffffffff 0x8 0xffffffff 0x7 0xffffffff 0x9 0xffffffff 0x6 0xffffffff 0x4f 0xffffffff 0x99 0xffffffff 0x83>; + io-channel-names = "usb_in_voltage", "usb_in_current", "chg_temp", "die_temp", "conn_temp", "sbux_res", "vph_voltage"; + qcom,battery-data = <0x13>; + qcom,auto-recharge-soc = <0x62>; + qcom,step-charging-enable; + qcom,sw-jeita-enable; + qcom,fcc-stepping-enable; + qcom,suspend-input-on-debug-batt; + qcom,sec-charger-config = <0x3>; + qcom,thermal-mitigation = <0x401640 0x3567e0 0x2dc6c0 0x2625a0 0x1e8480 0x16e360 0xf4240 0x7a120>; + dpdm-supply = <0xffffffff>; + qcom,charger-temp-max = <0x320>; + qcom,smb-temp-max = <0x320>; + qcom,fcc-step-delay-ms = <0x64>; + qcom,fcc-step-size-ua = <0x186a0>; + qcom,disable-sw-thermal-regulation; + qcom,disable-fcc-restriction; + qcom,smb-internal-pull-kohm = <0x0>; + }; + }; + + fragment@22 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + }; + }; + }; + + fragment@23 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@24 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,i2c-touch-active = "synaptics,tcm-i2c"; + + synaptics_tcm@20 { + compatible = "synaptics,tcm-i2c"; + reg = <0x20>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend", "pmx_ts_release"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + pinctrl-2 = <0xffffffff>; + vdd-supply = <0xffffffff>; + avdd-supply = <0xffffffff>; + synaptics,pwr-reg-name = "avdd"; + synaptics,bus-reg-name = "vdd"; + synaptics,irq-gpio = <0xffffffff 0x9 0x2008>; + synaptics,irq-on-state = <0x0>; + synaptics,reset-gpio = <0xffffffff 0x8 0x0>; + synaptics,reset-on-state = <0x0>; + synaptics,reset-active-ms = <0x14>; + synaptics,reset-delay-ms = <0xc8>; + synaptics,power-delay-ms = <0xc8>; + synaptics,ubl-i2c-addr = <0x20>; + }; + + atmel_mxt_ts@4a { + compatible = "atmel,maxtouch"; + reg = <0x4a>; + interrupt-parent = <0xffffffff>; + interrupts = <0x9 0x2008>; + avdd-supply = <0xffffffff>; + vdd-supply = <0xffffffff>; + pinctrl-names = "pmx_ts_active", "pmx_ts_suspend"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff>; + reset-gpios = <0xffffffff 0x8 0x0>; + irq-gpios = <0xffffffff 0x9 0x2008>; + atmel,xy_switch; + atmel,panel-coords = <0x0 0x0 0x1df 0x31f>; + atmel,display-coords = <0x0 0x0 0x153 0x301>; + }; + }; + }; + + fragment@25 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + qcom,clk-freq-out = <0xf4240>; + #address-cells = <0x1>; + #size-cells = <0x0>; + + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <0xffffffff 0x25 0x0>; + qcom,nq-ven = <0xffffffff 0xc 0x0>; + qcom,nq-firm = <0xffffffff 0x24 0x0>; + qcom,nq-clkreq = <0xffffffff 0x1f 0x0>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff>; + pinctrl-1 = <0xffffffff 0xffffffff 0xffffffff>; + }; + }; + }; + + fragment@26 { + target = <0xffffffff>; + + __overlay__ { + qcom,dp-aux-switch = <0xffffffff>; + }; + }; + + fragment@27 { + target = <0xffffffff>; + + __overlay__ { + + lpi_pinctrl@627C0000 { + compatible = "qcom,lpi-pinctrl"; + reg = <0x627c0000 0x0>; + qcom,num-gpios = <0xf>; + gpio-controller; + #gpio-cells = <0x2>; + qcom,slew-reg = <0x6295a000 0x0>; + qcom,lpi-offset-tbl = <0x0 0x1000 0x2000 0x3000 0x4000 0x5000 0x6000 0x7000 0x8000 0x9000 0xa000 0xb000 0xc000 0xd000 0xe000>; + qcom,lpi-slew-offset-tbl = <0x0 0x2 0x4 0x8 0xa 0xc 0x0 0x0 0x0 0x0 0x10 0x12 0x0 0x0 0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + phandle = <0x31>; + + dmic01_clk_active { + phandle = <0x32>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic01_clk_sleep { + phandle = <0x34>; + + mux { + pins = "gpio6"; + function = "func1"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic01_data_active { + phandle = <0x33>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic01_data_sleep { + phandle = <0x35>; + + mux { + pins = "gpio7"; + function = "func1"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic23_clk_active { + phandle = <0x36>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic23_clk_sleep { + phandle = <0x38>; + + mux { + pins = "gpio8"; + function = "func1"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic23_data_active { + phandle = <0x37>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic23_data_sleep { + phandle = <0x39>; + + mux { + pins = "gpio9"; + function = "func1"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + dmic45_clk_active { + phandle = <0x3a>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x8>; + output-high; + }; + }; + + dmic45_clk_sleep { + phandle = <0x3c>; + + mux { + pins = "gpio12"; + function = "func1"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + dmic45_data_active { + phandle = <0x3b>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x8>; + input-enable; + }; + }; + + dmic45_data_sleep { + phandle = <0x3d>; + + mux { + pins = "gpio13"; + function = "func1"; + }; + + config { + pins = "gpio13"; + drive-strength = <0x2>; + pull-down; + input-enable; + }; + }; + + tx_swr_clk_sleep { + phandle = <0x4a>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_clk_active { + phandle = <0x46>; + + mux { + pins = "gpio0"; + function = "func1"; + }; + + config { + pins = "gpio0"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + tx_swr_data0_sleep { + phandle = <0x4b>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data0_active { + phandle = <0x47>; + + mux { + pins = "gpio1"; + function = "func1"; + }; + + config { + pins = "gpio1"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_sleep { + phandle = <0x40>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_clk_active { + phandle = <0x3e>; + + mux { + pins = "gpio10"; + function = "func2"; + }; + + config { + pins = "gpio10"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + wsa_swr_data_sleep { + phandle = <0x41>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + wsa_swr_data_active { + phandle = <0x3f>; + + mux { + pins = "gpio11"; + function = "func2"; + }; + + config { + pins = "gpio11"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data1_sleep { + phandle = <0x4c>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data1_active { + phandle = <0x48>; + + mux { + pins = "gpio2"; + function = "func1"; + }; + + config { + pins = "gpio2"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + tx_swr_data2_sleep { + phandle = <0x4d>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + tx_swr_data2_active { + phandle = <0x49>; + + mux { + pins = "gpio14"; + function = "func1"; + }; + + config { + pins = "gpio14"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + rx_swr_clk_sleep { + phandle = <0x44>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_clk_active { + phandle = <0x42>; + + mux { + pins = "gpio3"; + function = "func1"; + }; + + config { + pins = "gpio3"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-disable; + }; + }; + + rx_swr_data_sleep { + phandle = <0x45>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + bias-bus-hold; + }; + }; + + rx_swr_data_active { + phandle = <0x43>; + + mux { + pins = "gpio4", "gpio5"; + function = "func1"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <0xa>; + slew-rate = <0x3>; + bias-bus-hold; + }; + }; + + lpi_i2s1_sck_active { + phandle = <0x55>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sck_sleep { + phandle = <0x59>; + + mux { + pins = "gpio6"; + function = "func2"; + }; + + config { + pins = "gpio6"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_ws_active { + phandle = <0x56>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_ws_sleep { + phandle = <0x5a>; + + mux { + pins = "gpio7"; + function = "func2"; + }; + + config { + pins = "gpio7"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd0_active { + phandle = <0x57>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd0_sleep { + phandle = <0x5b>; + + mux { + pins = "gpio8"; + function = "func2"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + lpi_i2s1_sd1_active { + phandle = <0x58>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x4>; + output-high; + }; + }; + + lpi_i2s1_sd1_sleep { + phandle = <0x5c>; + + mux { + pins = "gpio9"; + function = "func2"; + }; + + config { + pins = "gpio9"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + }; + + fragment@28 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x4>; + + bolero-clk-rsc-mngr { + compatible = "qcom,bolero-clk-rsc-mngr"; + qcom,fs-gen-sequence = <0x3000 0x1 0x3004 0x1 0x3080 0x2>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,va_mclk_mode_muxsel = <0x627a0000>; + clock-names = "tx_core_clk", "tx_npl_clk", "rx_core_clk", "rx_npl_clk", "wsa_core_clk", "wsa_npl_clk", "va_core_clk", "va_npl_clk"; + clocks = <0x14 0x0 0x15 0x0 0x16 0x0 0x17 0x0 0x18 0x0 0x19 0x0 0x1a 0x0 0x1b 0x0>; + }; + + tx-macro@62620000 { + compatible = "qcom,tx-macro"; + reg = <0x62620000 0x0>; + clock-names = "tx_core_clk", "tx_npl_clk"; + clocks = <0x14 0x0 0x15 0x0>; + qcom,tx-swr-gpios = <0x1c>; + qcom,tx-dmic-sample-rate = <0x249f00>; + phandle = <0xb2>; + + tx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x3>; + swrm-io-base = <0x62630000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x1>; + interrupts = <0x0 0x128 0x0 0x0 0x22b 0x0>; + interrupt-names = "swr_master_irq", "swr_wake_irq"; + qcom,swr-wakeup-required = <0x0>; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x21 0xf 0x2 0x12 0x1 0x2 0x13 0x2 0x3 0x14 0x1 0x3 0x15 0x2 0x4 0x16 0x1 0x4 0x17 0x2 0x4 0x18 0x4 0x4 0x19 0x8 0x5 0x1a 0x1 0x5 0x1b 0x2 0x5 0x1c 0x4 0x5 0x1d 0x8>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + qcom,swr-mstr-irq-wakeup-capable = <0x1>; + phandle = <0xb3>; + + wcd938x-tx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170223>; + phandle = <0x23>; + }; + + wcd937x-tx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170223>; + phandle = <0x27>; + }; + }; + }; + + rx-macro@62600000 { + compatible = "qcom,rx-macro"; + reg = <0x62600000 0x0>; + clock-names = "rx_core_clk", "rx_npl_clk"; + clocks = <0x16 0x0 0x17 0x0>; + qcom,rx-swr-gpios = <0x1d>; + qcom,rx_mclk_mode_muxsel = <0x627240d8>; + qcom,rx-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + phandle = <0xb4>; + + rx_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + qcom,swr_master_id = <0x2>; + swrm-io-base = <0x62610000 0x0>; + interrupts = <0x0 0x129 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x5>; + qcom,swr-port-mapping = <0x1 0x9 0x1 0x1 0xa 0x2 0x2 0xd 0x1 0x3 0xb 0x1 0x3 0xc 0x2 0x4 0xe 0x1 0x5 0xf 0x1 0x5 0x10 0x2>; + qcom,swr-num-dev = <0x1>; + qcom,swr-clock-stop-mode0 = <0x1>; + phandle = <0xb5>; + + wcd938x-rx-slave { + compatible = "qcom,wcd938x-slave"; + reg = <0xd 0x1170224>; + phandle = <0x22>; + }; + + wcd937x-rx-slave { + status = "disabled"; + compatible = "qcom,wcd937x-slave"; + reg = <0xa 0x1170224>; + phandle = <0x26>; + }; + }; + }; + + wsa-macro@62640000 { + compatible = "qcom,wsa-macro"; + reg = <0x62640000 0x0>; + clock-names = "wsa_core_clk", "wsa_npl_clk"; + clocks = <0x18 0x0 0x19 0x0>; + qcom,wsa-swr-gpios = <0x1e>; + qcom,wsa_mclk_mode_muxsel = <0x627220d8>; + qcom,wsa-bcl-pmic-params = [00 00 1e]; + qcom,default-clk-id = <0x0>; + status = "disabled"; + phandle = <0xb6>; + + wsa_swr_master { + compatible = "qcom,swr-mstr"; + #address-cells = <0x2>; + #size-cells = <0x0>; + qcom,swr_master_id = <0x1>; + clock-names = "lpass_core_hw_vote", "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0 0xffffffff 0x0>; + swrm-io-base = <0x62650000 0x0>; + qcom,mipi-sdw-block-packing-mode = <0x0>; + interrupts = <0x0 0x127 0x0>; + interrupt-names = "swr_master_irq"; + qcom,swr-num-ports = <0x8>; + qcom,swr-port-mapping = <0x1 0x1 0x1 0x2 0x3 0xf 0x3 0x2 0x3 0x4 0x5 0x1 0x5 0x7 0xf 0x6 0x6 0x3 0x7 0x4 0x3 0x8 0x8 0x3>; + qcom,swr-num-dev = <0x2>; + phandle = <0xb7>; + + wsa881x@20170211 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170211>; + qcom,spkr-sd-n-node = <0x1f>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2c>; + }; + + wsa881x@20170212 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x20170212>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2d>; + }; + + wsa881x@21170213 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170213>; + qcom,spkr-sd-n-node = <0x1f>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2e>; + }; + + wsa881x@21170214 { + compatible = "qcom,wsa881x"; + reg = <0x10 0x21170214>; + qcom,spkr-sd-n-node = <0x20>; + qcom,bolero-handle = <0xffffffff>; + status = "disabled"; + phandle = <0x2f>; + }; + }; + }; + + va-macro@62770000 { + compatible = "qcom,va-macro"; + reg = <0x62770000 0x0>; + clock-names = "lpass_audio_hw_vote"; + clocks = <0xffffffff 0x0>; + qcom,va-clk-mux-select = <0x1>; + qcom,va-island-mode-muxsel = <0x627a0000>; + qcom,va-dmic-sample-rate = <0x927c0>; + qcom,default-clk-id = <0x0>; + phandle = <0xb8>; + }; + + wcd938x-codec { + compatible = "qcom,wcd938x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x0 0x13 0x2 0x0 0x13 0x1 0x14 0x1 0x0 0x14 0x1 0x15 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x2 0x18 0x4 0x0 0x18 0x2 0x19 0x8 0x0 0x19 0x3 0x1a 0x1 0x0 0x1a 0x3 0x1b 0x2 0x0 0x1b 0x3 0x1c 0x4 0x0 0x1c 0x3 0x1d 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x21>; + qcom,rx-slave = <0x22>; + qcom,tx-slave = <0x23>; + cdc-vdd-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-rxtx-current = <0x7530>; + cdc-vddio-supply = <0xffffffff>; + qcom,cdc-vddio-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddio-current = <0x7530>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0xaf0>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-micbias4-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-rxtx", "cdc-vddio", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + mbhc-button-thres = <0x24 0xd 0x3f 0x24 0x58 0x8a 0x24 0x8a 0x8a 0x24 0xe1 0xe1 0x24 0x1c2 0x1c2 0x24 0x1c2 0x26c 0x24 0x1c2 0x26c 0x24 0x1c2 0x26c>; + imp-table = <0x25 0x0 0x5 0x6 0x25 0x6 0x17 0x8 0x25 0x18 0x26 0x7 0x25 0x27 0x64 0x6 0x25 0x65 0xa0 0xa 0x25 0xa1 0x190 0xb 0x25 0x191 0x7d0 0xb 0x25 0x7d1 0x7fffffff 0x6>; + phandle = <0x30>; + }; + + wcd937x-codec { + status = "disabled"; + compatible = "qcom,wcd937x-codec"; + qcom,split-codec = <0x1>; + qcom,rx_swr_ch_map = <0x0 0x9 0x1 0x0 0x9 0x0 0xa 0x2 0x0 0xa 0x1 0xd 0x1 0x0 0xd 0x2 0xb 0x1 0x0 0xb 0x2 0xc 0x2 0x0 0xc 0x3 0xe 0x1 0x0 0xe 0x4 0xf 0x1 0x0 0xf 0x4 0x10 0x2 0x0 0x10>; + qcom,tx_swr_ch_map = <0x0 0x12 0x1 0x0 0x12 0x1 0x13 0x1 0x0 0x14 0x1 0x14 0x2 0x0 0x15 0x2 0x16 0x1 0x0 0x16 0x2 0x17 0x2 0x0 0x17 0x2 0x11 0x4 0x0 0x18 0x3 0x18 0x1 0x0 0x1a 0x3 0x19 0x2 0x0 0x1b 0x3 0x1a 0x4 0x0 0x1c 0x3 0x1b 0x8 0x0 0x1d>; + qcom,wcd-rst-gpio-node = <0x21>; + qcom,rx-slave = <0x26>; + qcom,tx-slave = <0x27>; + cdc-vdd-ldo-rxtx-supply = <0xffffffff>; + qcom,cdc-vdd-ldo-rxtx-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-ldo-rxtx-current = <0x61a8>; + cdc-vddpx-1-supply = <0xffffffff>; + qcom,cdc-vddpx-1-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vddpx-1-current = <0x2710>; + cdc-vdd-buck-supply = <0xffffffff>; + qcom,cdc-vdd-buck-voltage = <0x1b7740 0x1b7740>; + qcom,cdc-vdd-buck-current = <0x9eb10>; + cdc-vdd-mic-bias-supply = <0xffffffff>; + qcom,cdc-vdd-mic-bias-voltage = <0x325aa0 0x325aa0>; + qcom,cdc-vdd-mic-bias-current = <0x7530>; + qcom,cdc-micbias1-mv = <0x708>; + qcom,cdc-micbias2-mv = <0x708>; + qcom,cdc-micbias3-mv = <0x708>; + qcom,cdc-static-supplies = "cdc-vdd-ldo-rxtx", "cdc-vddpx-1", "cdc-vdd-mic-bias"; + qcom,cdc-on-demand-supplies = "cdc-vdd-buck"; + phandle = <0xb9>; + }; + }; + }; + + fragment@29 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,msm-mi2s-master = <0x1 0x1 0x1 0x1 0x1 0x1>; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS4", "MIC BIAS4", "Analog Mic4", "TX DMIC0", "MIC BIAS1", "MIC BIAS1", "Digital Mic0", "TX DMIC1", "MIC BIAS1", "MIC BIAS1", "Digital Mic1", "TX DMIC2", "MIC BIAS3", "MIC BIAS3", "Digital Mic2", "TX DMIC3", "MIC BIAS3", "MIC BIAS3", "Digital Mic3", "TX DMIC4", "MIC BIAS4", "MIC BIAS4", "Digital Mic4", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "IN3_AUX", "AUX_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "TX SWR_DMIC0", "DMIC1_OUTPUT", "TX SWR_DMIC1", "DMIC2_OUTPUT", "TX SWR_DMIC2", "DMIC3_OUTPUT", "TX SWR_DMIC3", "DMIC4_OUTPUT", "TX SWR_DMIC4", "DMIC5_OUTPUT", "TX SWR_DMIC5", "DMIC6_OUTPUT", "TX SWR_DMIC6", "DMIC7_OUTPUT", "TX SWR_DMIC7", "DMIC8_OUTPUT", "WSA SRC0_INP", "SRC0", "WSA_TX DEC0_INP", "TX DEC0 MUX", "WSA_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "SpkrLeft IN", "WSA_SPK1 OUT", "SpkrRight IN", "WSA_SPK2 OUT", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA MIC BIAS1", "Digital Mic0", "VA MIC BIAS1", "Digital Mic1", "VA MIC BIAS3", "Digital Mic2", "VA MIC BIAS3", "Digital Mic3", "VA MIC BIAS4", "Digital Mic4", "VA DMIC0", "VA MIC BIAS1", "VA DMIC1", "VA MIC BIAS1", "VA DMIC2", "VA MIC BIAS3", "VA DMIC3", "VA MIC BIAS3", "VA DMIC4", "VA MIC BIAS4", "VA SWR_ADC0", "VA_SWR_CLK", "VA SWR_ADC1", "VA_SWR_CLK", "VA SWR_ADC2", "VA_SWR_CLK", "VA SWR_ADC3", "VA_SWR_CLK", "VA SWR_MIC0", "VA_SWR_CLK", "VA SWR_MIC1", "VA_SWR_CLK", "VA SWR_MIC2", "VA_SWR_CLK", "VA SWR_MIC3", "VA_SWR_CLK", "VA SWR_MIC4", "VA_SWR_CLK", "VA SWR_MIC5", "VA_SWR_CLK", "VA SWR_MIC6", "VA_SWR_CLK", "VA SWR_MIC7", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT", "VA SWR_MIC0", "DMIC1_OUTPUT", "VA SWR_MIC1", "DMIC2_OUTPUT", "VA SWR_MIC2", "DMIC3_OUTPUT", "VA SWR_MIC3", "DMIC4_OUTPUT", "VA SWR_MIC4", "DMIC5_OUTPUT", "VA SWR_MIC5", "DMIC6_OUTPUT", "VA SWR_MIC6", "DMIC7_OUTPUT", "VA SWR_MIC7", "DMIC8_OUTPUT"; + qcom,msm-mbhc-hphl-swh = <0x1>; + qcom,msm-mbhc-gnd-swh = <0x1>; + qcom,cdc-dmic01-gpios = <0x28>; + qcom,cdc-dmic23-gpios = <0x29>; + qcom,cdc-dmic45-gpios = <0x2a>; + asoc-codec = <0xffffffff 0xffffffff 0x2b>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec", "msm-ext-disp-audio-codec-rx"; + qcom,wsa-max-devs = <0x2>; + qcom,wsa-devs = <0x2c 0x2d 0x2e 0x2f>; + qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight", "SpkrLeft", "SpkrRight"; + qcom,codec-max-aux-devs = <0x1>; + qcom,codec-aux-devs = <0x30>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x31 0xffffffff>; + }; + }; + + fragment@30 { + target = <0xffffffff>; + + __overlay__ { + + cdc_dmic01_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x32 0x33>; + pinctrl-1 = <0x34 0x35>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x28>; + }; + + cdc_dmic23_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x36 0x37>; + pinctrl-1 = <0x38 0x39>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x29>; + }; + + cdc_dmic45_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3a 0x3b>; + pinctrl-1 = <0x3c 0x3d>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x2a>; + }; + + wsa_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x3e 0x3f>; + pinctrl-1 = <0x40 0x41>; + qcom,lpi-gpios; + status = "disabled"; + phandle = <0x1e>; + }; + + rx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x42 0x43>; + pinctrl-1 = <0x44 0x45>; + qcom,lpi-gpios; + phandle = <0x1d>; + }; + + tx_swr_clk_data_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x46 0x47 0x48 0x49>; + pinctrl-1 = <0x4a 0x4b 0x4c 0x4d>; + qcom,lpi-gpios; + qcom,chip-wakeup-reg = <0x1ffb000>; + qcom,chip-wakeup-maskbit = <0x0>; + qcom,chip-wakeup-default-val = <0x1>; + phandle = <0x1c>; + }; + }; + }; + + fragment@31 { + target = <0xffffffff>; + + __overlay__ { + + wsa_spkr_en1_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x1f>; + }; + + wsa_spkr_en2_pinctrl { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + status = "disabled"; + phandle = <0x20>; + }; + + msm_cdc_pinctrl@58 { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0xffffffff>; + pinctrl-1 = <0xffffffff>; + phandle = <0x21>; + }; + + wsa_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x3>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x309>; + #clock-cells = <0x1>; + phandle = <0x18>; + }; + + wsa_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x4>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30a>; + #clock-cells = <0x1>; + phandle = <0x19>; + }; + + rx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x5>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30e>; + #clock-cells = <0x1>; + phandle = <0x16>; + }; + + rx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x6>; + qcom,codec-lpass-ext-clk-freq = <0x1588800>; + qcom,codec-lpass-clk-id = <0x30f>; + #clock-cells = <0x1>; + phandle = <0x17>; + }; + + tx_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x7>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30c>; + #clock-cells = <0x1>; + phandle = <0x14>; + }; + + tx_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x8>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30d>; + #clock-cells = <0x1>; + phandle = <0x15>; + }; + + va_core_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0x2>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x30b>; + #clock-cells = <0x1>; + phandle = <0x1a>; + }; + + va_npl_clk { + compatible = "qcom,audio-ref-clk"; + qcom,codec-ext-clk-src = <0xa>; + qcom,codec-lpass-ext-clk-freq = <0x124f800>; + qcom,codec-lpass-clk-id = <0x310>; + #clock-cells = <0x1>; + phandle = <0x1b>; + }; + }; + }; + + fragment@32 { + target = <0xffffffff>; + + __overlay__ { + qcom,msm-dai-is-island-supported = <0x1>; + }; + }; + + fragment@33 { + target = <0xffffffff>; + + __overlay__ { + hsuart8 = "/soc/qcom,qup_hsuart@a88000"; + }; + }; + + fragment@34 { + target = <0xffffffff>; + + __overlay__ { + + qcom,qup_hsuart@a88000 { + compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; + reg = <0xa88000 0x4000>; + reg-names = "se_phys"; + clock-names = "se-clk", "m-ahb", "s-ahb"; + clocks = <0xffffffff 0x50 0xffffffff 0x5a 0xffffffff 0x5b>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <0x4e 0x4f>; + pinctrl-1 = <0x50 0x51>; + interrupts = <0x0 0x163 0x0>; + qcom,wrapper-core = <0xffffffff>; + always-on-clock; + status = "ok"; + phandle = <0xba>; + }; + }; + }; + + fragment@35 { + target = <0xffffffff>; + + __overlay__ { + + qupv3_se8_2hsuart_pins { + phandle = <0xbb>; + + qupv3_se8_2uart_tx_active { + phandle = <0x4e>; + + mux { + pins = "gpio44"; + function = "qup12"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_rx_active { + phandle = <0x4f>; + + mux { + pins = "gpio45"; + function = "qup12"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-up; + }; + }; + + qupv3_se8_2uart_tx_sleep { + phandle = <0x50>; + + mux { + pins = "gpio44"; + function = "gpio"; + }; + + config { + pins = "gpio44"; + drive-strength = <0x2>; + bias-pull-up; + input-enable; + }; + }; + + qupv3_se8_2uart_rx_sleep { + phandle = <0x51>; + + mux { + pins = "gpio45"; + function = "gpio"; + }; + + config { + pins = "gpio45"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@36 { + target = <0xffffffff>; + + __overlay__ { + + dcc_curr_link@3 { + qcom,curr-link-list = <0x3>; + qcom,data-sink = "sram"; + qcom,link-list = <0x0 0x18000024 0x1 0x0 0x0 0x18000040 0x1 0x0 0x0 0x18010024 0x1 0x0 0x0 0x18010040 0x1 0x0 0x0 0x18020024 0x1 0x0 0x0 0x18020040 0x1 0x0 0x0 0x18030024 0x1 0x0 0x0 0x18030040 0x1 0x0 0x0 0x18040024 0x1 0x0 0x0 0x18040040 0x1 0x0 0x0 0x18050024 0x1 0x0 0x0 0x18050040 0x1 0x0 0x0 0x18060024 0x1 0x0 0x0 0x18060040 0x1 0x0 0x0 0x18070024 0x1 0x0 0x0 0x18070040 0x1 0x0 0x0 0x18080024 0x1 0x0 0x0 0x18080040 0x1 0x0 0x0 0x180800f8 0x1 0x0 0x0 0x18080104 0x1 0x0 0x0 0x1808011c 0x1 0x0 0x0 0x18080128 0x1 0x0 0x0 0x18321700 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18325f00 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x18321818 0x1 0x0 0x0 0x18323818 0x1 0x0 0x0 0x18326018 0x1 0x0 0x0 0x18321920 0x1 0x0 0x0 0x1832102c 0x1 0x0 0x0 0x18321044 0x1 0x0 0x0 0x18321710 0x1 0x0 0x0 0x1832176c 0x1 0x0 0x0 0x18322c18 0x1 0x0 0x0 0x18323700 0x1 0x0 0x0 0x18323920 0x1 0x0 0x0 0x1832302c 0x1 0x0 0x0 0x18323044 0x1 0x0 0x0 0x18323710 0x1 0x0 0x0 0x1832376c 0x1 0x0 0x0 0x18324c18 0x1 0x0 0x0 0x18326120 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18325844 0x1 0x0 0x0 0x18325f10 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x18327418 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280000 0x2 0x0 0x0 0x18282000 0x2 0x0 0x0 0x18284000 0x2 0x0 0x0 0x9680000 0x1 0x0 0x0 0x9680004 0x1 0x0 0x2 0x8 0x0 0x0 0x0 0x9681000 0x1 0x0 0x2 0x1 0x0 0x0 0x0 0x9681004 0x1 0x0 0x0 0x9681008 0x1 0x0 0x0 0x968100c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9698500 0x1 0x0 0x0 0x9698504 0x1 0x0 0x0 0x9698508 0x1 0x0 0x0 0x969850c 0x1 0x0 0x0 0x9698510 0x1 0x0 0x0 0x9698514 0x1 0x0 0x0 0x9698518 0x1 0x0 0x0 0x969851c 0x1 0x0 0x0 0x9698700 0x1 0x0 0x0 0x9698704 0x1 0x0 0x0 0x9698708 0x1 0x0 0x0 0x969870c 0x1 0x0 0x0 0x9698714 0x1 0x0 0x0 0x9698718 0x1 0x0 0x0 0x969871c 0x1 0x0 0x0 0x1620204 0x1 0x0 0x0 0x1620240 0x1 0x0 0x0 0x1620248 0x1 0x0 0x0 0x1620288 0x1 0x0 0x0 0x162028c 0x1 0x0 0x0 0x1620290 0x1 0x0 0x0 0x1620294 0x1 0x0 0x0 0x16202a8 0x1 0x0 0x0 0x16202ac 0x1 0x0 0x0 0x16202b0 0x1 0x0 0x0 0x16202b4 0x1 0x0 0x0 0x1620300 0x1 0x0 0x0 0x16e0404 0x1 0x0 0x0 0x16e0408 0x1 0x0 0x0 0x16e0410 0x1 0x0 0x0 0x16e0420 0x1 0x0 0x0 0x16e0424 0x1 0x0 0x0 0x16e0428 0x1 0x0 0x0 0x16e042c 0x1 0x0 0x0 0x16e0430 0x1 0x0 0x0 0x16e0434 0x1 0x0 0x0 0x16e0438 0x1 0x0 0x0 0x16e043c 0x1 0x0 0x0 0x16e0300 0x1 0x0 0x0 0x16e0304 0x1 0x0 0x0 0x16e0700 0x1 0x0 0x0 0x16e0704 0x1 0x0 0x0 0x1700c00 0x1 0x0 0x0 0x1700c08 0x1 0x0 0x0 0x1700c10 0x1 0x0 0x0 0x1700c20 0x1 0x0 0x0 0x1700c24 0x1 0x0 0x0 0x1700c28 0x1 0x0 0x0 0x1700c2c 0x1 0x0 0x0 0x1700c30 0x1 0x0 0x0 0x1700c34 0x1 0x0 0x0 0x1700c38 0x1 0x0 0x0 0x1700c3c 0x1 0x0 0x0 0x1700300 0x1 0x0 0x0 0x1700304 0x1 0x0 0x0 0x1700308 0x1 0x0 0x0 0x170030c 0x1 0x0 0x0 0x1700310 0x1 0x0 0x0 0x1700500 0x1 0x0 0x0 0x1700504 0x1 0x0 0x0 0x1700508 0x1 0x0 0x0 0x170050c 0x1 0x0 0x0 0x1700900 0x1 0x0 0x0 0x1700904 0x1 0x0 0x0 0x1700908 0x1 0x0 0x0 0x1740004 0x1 0x0 0x0 0x1740008 0x1 0x0 0x0 0x1740010 0x1 0x0 0x0 0x1740020 0x1 0x0 0x0 0x1740024 0x1 0x0 0x0 0x1740028 0x1 0x0 0x0 0x174002c 0x1 0x0 0x0 0x1740030 0x1 0x0 0x0 0x1740034 0x1 0x0 0x0 0x1740038 0x1 0x0 0x0 0x174003c 0x1 0x0 0x0 0x1740300 0x1 0x0 0x0 0x1740304 0x1 0x0 0x0 0x1740308 0x1 0x0 0x0 0x174030c 0x1 0x0 0x0 0x1740310 0x1 0x0 0x0 0x1740314 0x1 0x0 0x0 0x9698204 0x1 0x0 0x0 0x9698240 0x1 0x0 0x0 0x9698244 0x1 0x0 0x0 0x9698248 0x1 0x0 0x0 0x969824c 0x1 0x0 0x0 0x9681010 0x1 0x0 0x0 0x9681014 0x1 0x0 0x0 0x9681018 0x1 0x0 0x0 0x968101c 0x1 0x0 0x0 0x9681020 0x1 0x0 0x0 0x9681024 0x1 0x0 0x0 0x9681028 0x1 0x0 0x0 0x968102c 0x1 0x0 0x0 0x9681030 0x1 0x0 0x0 0x9681034 0x1 0x0 0x0 0x968103c 0x1 0x0 0x0 0x9698100 0x1 0x0 0x0 0x9698104 0x1 0x0 0x0 0x9698108 0x1 0x0 0x0 0x9698110 0x1 0x0 0x0 0x9698120 0x1 0x0 0x0 0x9698124 0x1 0x0 0x0 0x9698128 0x1 0x0 0x0 0x969812c 0x1 0x0 0x0 0x9698130 0x1 0x0 0x0 0x9698134 0x1 0x0 0x0 0x9698138 0x1 0x0 0x0 0x969813c 0x1 0x0 0x0 0x9160204 0x1 0x0 0x0 0x9160240 0x1 0x0 0x0 0x9160248 0x1 0x0 0x0 0x9160288 0x1 0x0 0x0 0x9160290 0x1 0x0 0x0 0x9160300 0x1 0x0 0x0 0x9160304 0x1 0x0 0x0 0x9160308 0x1 0x0 0x0 0x916030c 0x1 0x0 0x0 0x9160310 0x1 0x0 0x0 0x9160314 0x1 0x0 0x0 0x9160318 0x1 0x0 0x0 0x9160008 0x1 0x0 0x0 0x9160010 0x1 0x0 0x0 0x9160020 0x1 0x0 0x0 0x9160024 0x1 0x0 0x0 0x9160028 0x1 0x0 0x0 0x916002c 0x1 0x0 0x0 0x9160030 0x1 0x0 0x0 0x9160034 0x1 0x0 0x0 0x9160038 0x1 0x0 0x0 0x916003c 0x1 0x0 0x0 0x63042680 0x1 0x0 0x0 0x63042684 0x1 0x0 0x0 0x63042688 0x1 0x0 0x0 0x63042690 0x1 0x0 0x0 0x630426a0 0x1 0x0 0x0 0x630426a4 0x1 0x0 0x0 0x630426a8 0x1 0x0 0x0 0x630426ac 0x1 0x0 0x0 0x630426b0 0x1 0x0 0x0 0x630426b4 0x1 0x0 0x0 0x630426b8 0x1 0x0 0x0 0x630426bc 0x1 0x0 0x0 0x63041900 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x1620500 0x4 0x0 0x0 0x1620700 0x4 0x0 0x0 0x1620300 0x1 0x0 0x0 0x1620f00 0x2 0x0 0x0 0x1620b00 0x2 0x0 0x0 0x1700b00 0x2 0x0 0x0 0x1700700 0x3 0x0 0x0 0x9163100 0x1 0x0 0x0 0x96aa100 0x1 0x0 0x0 0x63041d00 0x1 0x0 0x0 0x9991500 0x8 0x0 0x0 0x9050008 0x1 0x0 0x0 0x9050078 0x1 0x0 0x0 0x9236028 0x1 0x0 0x0 0x923602c 0x1 0x0 0x0 0x9236030 0x1 0x0 0x0 0x9236034 0x1 0x0 0x0 0x9236038 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x92360b0 0x1 0x0 0x0 0x9236044 0x1 0x0 0x0 0x9236048 0x1 0x0 0x0 0x923604c 0x1 0x0 0x0 0x9236050 0x1 0x0 0x0 0x923e030 0x1 0x0 0x0 0x923e034 0x1 0x0 0x0 0x9241000 0x1 0x0 0x0 0x9248058 0x1 0x0 0x0 0x924805c 0x1 0x0 0x0 0x9248060 0x1 0x0 0x0 0x9248064 0x1 0x0 0x0 0x9260410 0x1 0x0 0x0 0x92e0410 0x1 0x0 0x0 0x9260414 0x1 0x0 0x0 0x92e0414 0x1 0x0 0x0 0x9260418 0x1 0x0 0x0 0x92e0418 0x1 0x0 0x0 0x9260420 0x1 0x0 0x0 0x9260424 0x1 0x0 0x0 0x9260430 0x1 0x0 0x0 0x9260440 0x1 0x0 0x0 0x9260448 0x1 0x0 0x0 0x92604a0 0x1 0x0 0x0 0x92604b0 0x1 0x0 0x0 0x92604d0 0x2 0x0 0x0 0x9261440 0x1 0x0 0x0 0x92e0420 0x1 0x0 0x0 0x92e0424 0x1 0x0 0x0 0x92e0430 0x1 0x0 0x0 0x92e0440 0x1 0x0 0x0 0x92e0448 0x1 0x0 0x0 0x92e04a0 0x1 0x0 0x0 0x92e04b0 0x1 0x0 0x0 0x92e04d0 0x2 0x0 0x0 0x9600000 0x1 0x0 0x0 0x9601000 0x1 0x0 0x0 0x9602000 0x1 0x0 0x0 0x9603000 0x1 0x0 0x0 0x9604000 0x1 0x0 0x0 0x9605000 0x1 0x0 0x0 0x9606000 0x1 0x0 0x0 0x9607000 0x1 0x0 0x0 0x9608000 0x1 0x0 0x0 0x9609000 0x1 0x0 0x0 0x960a000 0x1 0x0 0x0 0x960b000 0x1 0x0 0x0 0x960c000 0x1 0x0 0x0 0x960d000 0x1 0x0 0x0 0x960e000 0x1 0x0 0x0 0x960f000 0x1 0x0 0x0 0x9610000 0x1 0x0 0x0 0x9611000 0x1 0x0 0x0 0x9612000 0x1 0x0 0x0 0x9613000 0x1 0x0 0x0 0x9614000 0x1 0x0 0x0 0x9615000 0x1 0x0 0x0 0x9616000 0x1 0x0 0x0 0x9617000 0x1 0x0 0x0 0x9618000 0x1 0x0 0x0 0x9619000 0x1 0x0 0x0 0x961a000 0x1 0x0 0x0 0x961b000 0x1 0x0 0x0 0x961c000 0x1 0x0 0x0 0x961d000 0x1 0x0 0x0 0x961e000 0x1 0x0 0x0 0x961f000 0x1 0x0 0x0 0x9600004 0x1 0x0 0x0 0x9601004 0x1 0x0 0x0 0x9602004 0x1 0x0 0x0 0x9603004 0x1 0x0 0x0 0x9604004 0x1 0x0 0x0 0x9605004 0x1 0x0 0x0 0x9606004 0x1 0x0 0x0 0x9607004 0x1 0x0 0x0 0x9608004 0x1 0x0 0x0 0x9609004 0x1 0x0 0x0 0x960a004 0x1 0x0 0x0 0x960b004 0x1 0x0 0x0 0x960c004 0x1 0x0 0x0 0x960d004 0x1 0x0 0x0 0x960e004 0x1 0x0 0x0 0x960f004 0x1 0x0 0x0 0x9610004 0x1 0x0 0x0 0x9611004 0x1 0x0 0x0 0x9612004 0x1 0x0 0x0 0x9613004 0x1 0x0 0x0 0x9614004 0x1 0x0 0x0 0x9615004 0x1 0x0 0x0 0x9616004 0x1 0x0 0x0 0x9617004 0x1 0x0 0x0 0x9618004 0x1 0x0 0x0 0x9619004 0x1 0x0 0x0 0x961a004 0x1 0x0 0x0 0x961b004 0x1 0x0 0x0 0x961c004 0x1 0x0 0x0 0x961d004 0x1 0x0 0x0 0x961e004 0x1 0x0 0x0 0x961f004 0x1 0x0 0x0 0x9266418 0x1 0x0 0x0 0x92e6418 0x1 0x0 0x0 0x9265804 0x1 0x0 0x0 0x92e5804 0x1 0x0 0x0 0x92604b8 0x1 0x0 0x0 0x92e04b8 0x1 0x0 0x0 0xc201244 0x1 0x0 0x0 0xc202244 0x1 0x0 0x0 0x18100c18 0x1 0x0 0x0 0x18101c18 0x1 0x0 0x0 0x18300000 0x1 0x0 0x0 0x183a3a84 0x2 0x0 0x0 0x18393a84 0x1 0x0 0x0 0x100000 0x1 0x0 0x0 0x100004 0x1 0x0 0x0 0x100008 0x1 0x0 0x0 0x10000c 0x1 0x0 0x0 0x100010 0x1 0x0 0x0 0x100014 0x1 0x0 0x0 0x100018 0x1 0x0 0x0 0x10001c 0x1 0x0 0x0 0x100020 0x1 0x0 0x0 0x100024 0x1 0x0 0x0 0x100028 0x1 0x0 0x0 0x10002c 0x1 0x0 0x0 0x100030 0x1 0x0 0x0 0x100034 0x1 0x0 0x0 0x100100 0x1 0x0 0x0 0x100104 0x1 0x0 0x0 0x100108 0x1 0x0 0x0 0x10010c 0x1 0x0 0x0 0x101000 0x1 0x0 0x0 0x101004 0x1 0x0 0x0 0x101008 0x1 0x0 0x0 0x10100c 0x1 0x0 0x0 0x101010 0x1 0x0 0x0 0x101014 0x1 0x0 0x0 0x101018 0x1 0x0 0x0 0x10101c 0x1 0x0 0x0 0x101020 0x1 0x0 0x0 0x101024 0x1 0x0 0x0 0x101028 0x1 0x0 0x0 0x10102c 0x1 0x0 0x0 0x101030 0x1 0x0 0x0 0x101034 0x1 0x0 0x0 0x102000 0x1 0x0 0x0 0x102004 0x1 0x0 0x0 0x102008 0x1 0x0 0x0 0x10200c 0x1 0x0 0x0 0x102010 0x1 0x0 0x0 0x102014 0x1 0x0 0x0 0x102018 0x1 0x0 0x0 0x10201c 0x1 0x0 0x0 0x102020 0x1 0x0 0x0 0x102024 0x1 0x0 0x0 0x102028 0x1 0x0 0x0 0x10202c 0x1 0x0 0x0 0x102030 0x1 0x0 0x0 0x102034 0x1 0x0 0x0 0x103000 0x1 0x0 0x0 0x103004 0x1 0x0 0x0 0x103008 0x1 0x0 0x0 0x10300c 0x1 0x0 0x0 0x103010 0x1 0x0 0x0 0x103014 0x1 0x0 0x0 0x103018 0x1 0x0 0x0 0x10301c 0x1 0x0 0x0 0x103020 0x1 0x0 0x0 0x103024 0x1 0x0 0x0 0x103028 0x1 0x0 0x0 0x10302c 0x1 0x0 0x0 0x103030 0x1 0x0 0x0 0x103034 0x1 0x0 0x0 0x113000 0x1 0x0 0x0 0x113004 0x1 0x0 0x0 0x113008 0x1 0x0 0x0 0x11300c 0x1 0x0 0x0 0x113010 0x1 0x0 0x0 0x113014 0x1 0x0 0x0 0x113018 0x1 0x0 0x0 0x11301c 0x1 0x0 0x0 0x113020 0x1 0x0 0x0 0x113024 0x1 0x0 0x0 0x113028 0x1 0x0 0x0 0x11302c 0x1 0x0 0x0 0x113030 0x1 0x0 0x0 0x113034 0x1 0x0 0x0 0x11a000 0x1 0x0 0x0 0x11a004 0x1 0x0 0x0 0x11a008 0x1 0x0 0x0 0x11a00c 0x1 0x0 0x0 0x11a010 0x1 0x0 0x0 0x11a014 0x1 0x0 0x0 0x11a018 0x1 0x0 0x0 0x11a01c 0x1 0x0 0x0 0x11a020 0x1 0x0 0x0 0x11a024 0x1 0x0 0x0 0x11a028 0x1 0x0 0x0 0x11a02c 0x1 0x0 0x0 0x11a030 0x1 0x0 0x0 0x11a034 0x1 0x0 0x0 0x11b000 0x1 0x0 0x0 0x11b004 0x1 0x0 0x0 0x11b008 0x1 0x0 0x0 0x11b00c 0x1 0x0 0x0 0x11b010 0x1 0x0 0x0 0x11b014 0x1 0x0 0x0 0x11b018 0x1 0x0 0x0 0x11b01c 0x1 0x0 0x0 0x11b020 0x1 0x0 0x0 0x11b024 0x1 0x0 0x0 0x11b028 0x1 0x0 0x0 0x11b02c 0x1 0x0 0x0 0x11b030 0x1 0x0 0x0 0x11b034 0x1 0x0 0x0 0x174000 0x1 0x0 0x0 0x174004 0x1 0x0 0x0 0x174008 0x1 0x0 0x0 0x17400c 0x1 0x0 0x0 0x174010 0x1 0x0 0x0 0x174014 0x1 0x0 0x0 0x174018 0x1 0x0 0x0 0x17401c 0x1 0x0 0x0 0x174020 0x1 0x0 0x0 0x174024 0x1 0x0 0x0 0x174028 0x1 0x0 0x0 0x17402c 0x1 0x0 0x0 0x174030 0x1 0x0 0x0 0x174034 0x1 0x0 0x0 0x176000 0x1 0x0 0x0 0x176004 0x1 0x0 0x0 0x176008 0x1 0x0 0x0 0x17600c 0x1 0x0 0x0 0x176010 0x1 0x0 0x0 0x176014 0x1 0x0 0x0 0x176018 0x1 0x0 0x0 0x17601c 0x1 0x0 0x0 0x176020 0x1 0x0 0x0 0x176024 0x1 0x0 0x0 0x176028 0x1 0x0 0x0 0x17602c 0x1 0x0 0x0 0x176030 0x1 0x0 0x0 0x176034 0x1 0x0 0x0 0x10401c 0x1 0x0 0x0 0x183024 0x1 0x0 0x0 0x144168 0x1 0x0 0x0 0x11702c 0x1 0x0 0x0 0x10904c 0x1 0x0 0x0 0x189038 0x1 0x0 0x0 0x1443e8 0x1 0x0 0x0 0x1442b8 0x1 0x0 0x0 0x105060 0x1 0x0 0x0 0x141024 0x1 0x0 0x0 0x145038 0x1 0x0 0x0 0x109004 0x1 0x0 0x0 0x189004 0x1 0x0 0x0 0x190004 0x1 0x0 0x0 0xc2a0000 0x1 0x0 0x0 0xc2a0004 0x1 0x0 0x0 0xc2a0008 0x1 0x0 0x0 0xc2a000c 0x1 0x0 0x0 0xc2a0010 0x1 0x0 0x0 0xc2a0014 0x1 0x0 0x0 0xc2a0018 0x1 0x0 0x0 0xc2a001c 0x1 0x0 0x0 0xc2a0020 0x1 0x0 0x0 0xc2a0024 0x1 0x0 0x0 0xc2a0028 0x1 0x0 0x0 0xc2a002c 0x1 0x0 0x0 0xc2a0030 0x1 0x0 0x0 0xc2a0034 0x1 0x0 0x0 0xc2a1000 0x1 0x0 0x0 0xc2a1004 0x1 0x0 0x0 0xc2a1008 0x1 0x0 0x0 0xc2a100c 0x1 0x0 0x0 0xc2a1010 0x1 0x0 0x0 0xc2a1014 0x1 0x0 0x0 0xc2a1018 0x1 0x0 0x0 0xc2a101c 0x1 0x0 0x0 0xc2a1020 0x1 0x0 0x0 0xc2a1024 0x1 0x0 0x0 0xc2a1028 0x1 0x0 0x0 0xc2a102c 0x1 0x0 0x0 0xc2a1030 0x1 0x0 0x0 0xc2a2260 0x1 0x0 0x0 0xc2a2264 0x1 0x0 0x0 0xc2a3008 0x1 0x0 0x0 0xc2a300c 0x1 0x0 0x0 0xc2a3010 0x1 0x0 0x0 0xc2a3014 0x1 0x0 0x0 0xc2a3024 0x1 0x0 0x0 0xc2a2034 0x1 0x0 0x0 0xc2a214c 0x1 0x0 0x0 0xc2a2150 0x1 0x0 0x0 0xc2a2154 0x1 0x0 0x0 0x28206c 0x1 0x0 0x0 0x18282004 0x1 0x0 0x0 0x18325f6c 0x1 0x0 0x0 0x1808012c 0x1 0x0 0x0 0x1832582c 0x1 0x0 0x0 0x18280004 0x1 0x0 0x0 0x18284038 0x1 0x0 0x0 0x18284000 0x2 0x0 0x0 0x90c012c 0x1 0x0 0x0 0x9222408 0x1 0x0 0x0 0x9220344 0x2 0x0 0x0 0x9220480 0x1 0x0 0x0 0x922358c 0x1 0x0 0x0 0x9222398 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x92223a4 0x1 0x0 0x0 0x923201c 0x5 0x0 0x0 0x9232050 0x1 0x0 0x0 0x9232100 0x1 0x0 0x0 0x9186048 0x1 0x0 0x0 0x9186054 0x1 0x0 0x0 0x9186164 0x1 0x0 0x0 0x9186170 0x1 0x0 0x0 0xc2630a0 0x4 0x0 0x0 0xc2630b0 0x4 0x0 0x0 0xc2630c0 0x4 0x0 0x0 0xc2630d0 0x4 0x0 0x0 0x18200400 0x1 0x0 0x0 0x18200404 0x1 0x0 0x0 0x18200408 0x1 0x0 0x0 0x18200038 0x1 0x0 0x0 0x18200040 0x1 0x0 0x0 0x18200048 0x1 0x0 0x0 0x18220038 0x1 0x0 0x0 0x18220040 0x1 0x0 0x0 0x182200d0 0x1 0x0 0x0 0x18200030 0x1 0x0 0x0 0x18200010 0x1 0x0 0x0 0x1822000c 0x1 0x0 0x0 0x18220d14 0x1 0x0 0x0 0x18220fb4 0x1 0x0 0x0 0x18221254 0x1 0x0 0x0 0x182214f4 0x1 0x0 0x0 0x18221794 0x1 0x0 0x0 0x18221a34 0x1 0x0 0x0 0x18221cd4 0x1 0x0 0x0 0x18221f74 0x1 0x0 0x0 0x18220d18 0x1 0x0 0x0 0x18220fb8 0x1 0x0 0x0 0x18221258 0x1 0x0 0x0 0x182214f8 0x1 0x0 0x0 0x18221798 0x1 0x0 0x0 0x18221a38 0x1 0x0 0x0 0x18221cd8 0x1 0x0 0x0 0x18221f78 0x1 0x0 0x0 0x18220d00 0x1 0x0 0x0 0x18220d04 0x1 0x0 0x0 0x18220d1c 0x1 0x0 0x0 0x18220fbc 0x1 0x0 0x0 0x1822125c 0x1 0x0 0x0 0x182214fc 0x1 0x0 0x0 0x1822179c 0x1 0x0 0x0 0x18221a3c 0x1 0x0 0x0 0x18221cdc 0x1 0x0 0x0 0x18221f7c 0x1 0x0 0x0 0x18221274 0x1 0x0 0x0 0x18221288 0x1 0x0 0x0 0x1822129c 0x1 0x0 0x0 0x182212b0 0x1 0x0 0x0 0x182212c4 0x1 0x0 0x0 0x182212d8 0x1 0x0 0x0 0x182212ec 0x1 0x0 0x0 0x18221300 0x1 0x0 0x0 0x18221314 0x1 0x0 0x0 0x18221328 0x1 0x0 0x0 0x1822133c 0x1 0x0 0x0 0x18221350 0x1 0x0 0x0 0x18221364 0x1 0x0 0x0 0x18221378 0x1 0x0 0x0 0x1822138c 0x1 0x0 0x0 0x182213a0 0x1 0x0 0x0 0x18221514 0x1 0x0 0x0 0x18221528 0x1 0x0 0x0 0x1822153c 0x1 0x0 0x0 0x18221550 0x1 0x0 0x0 0x18221564 0x1 0x0 0x0 0x18221578 0x1 0x0 0x0 0x1822158c 0x1 0x0 0x0 0x182215a0 0x1 0x0 0x0 0x182215b4 0x1 0x0 0x0 0x182215c8 0x1 0x0 0x0 0x182215dc 0x1 0x0 0x0 0x182215f0 0x1 0x0 0x0 0x18221604 0x1 0x0 0x0 0x18221618 0x1 0x0 0x0 0x1822162c 0x1 0x0 0x0 0x18221640 0x1 0x0 0x0 0x182217b4 0x1 0x0 0x0 0x182217c8 0x1 0x0 0x0 0x182217dc 0x1 0x0 0x0 0x182217f0 0x1 0x0 0x0 0x18221804 0x1 0x0 0x0 0x18221818 0x1 0x0 0x0 0x1822182c 0x1 0x0 0x0 0x18221840 0x1 0x0 0x0 0x18221854 0x1 0x0 0x0 0x18221868 0x1 0x0 0x0 0x1822187c 0x1 0x0 0x0 0x18221890 0x1 0x0 0x0 0x182218a4 0x1 0x0 0x0 0x182218b8 0x1 0x0 0x0 0x182218cc 0x1 0x0 0x0 0x182218e0 0x1 0x0 0x0 0x18221a54 0x1 0x0 0x0 0x18221a68 0x1 0x0 0x0 0x18221a7c 0x1 0x0 0x0 0x18221a90 0x1 0x0 0x0 0x18221aa4 0x1 0x0 0x0 0x18221ab8 0x1 0x0 0x0 0x18221acc 0x1 0x0 0x0 0x18221ae0 0x1 0x0 0x0 0x18221af4 0x1 0x0 0x0 0x18221b08 0x1 0x0 0x0 0x18221b1c 0x1 0x0 0x0 0x18221b30 0x1 0x0 0x0 0x18221b44 0x1 0x0 0x0 0x18221b58 0x1 0x0 0x0 0x18221b6c 0x1 0x0 0x0 0x18221b80 0x1 0x0 0x0 0x18221cf4 0x1 0x0 0x0 0x18221d08 0x1 0x0 0x0 0x18221d1c 0x1 0x0 0x0 0x18221d30 0x1 0x0 0x0 0x18221d44 0x1 0x0 0x0 0x18221d58 0x1 0x0 0x0 0x18221d6c 0x1 0x0 0x0 0x18221d80 0x1 0x0 0x0 0x18221d94 0x1 0x0 0x0 0x18221da8 0x1 0x0 0x0 0x18221dbc 0x1 0x0 0x0 0x18221dd0 0x1 0x0 0x0 0x18221de4 0x1 0x0 0x0 0x18221df8 0x1 0x0 0x0 0x18221e0c 0x1 0x0 0x0 0x18221e20 0x1 0x0 0x0 0x18221f94 0x1 0x0 0x0 0x18221fa8 0x1 0x0 0x0 0x18221fbc 0x1 0x0 0x0 0x18221fd0 0x1 0x0 0x0 0x18221fe4 0x1 0x0 0x0 0x18221ff8 0x1 0x0 0x0 0x1822200c 0x1 0x0 0x0 0x18222020 0x1 0x0 0x0 0x18222034 0x1 0x0 0x0 0x18222048 0x1 0x0 0x0 0x1822205c 0x1 0x0 0x0 0x18222070 0x1 0x0 0x0 0x18222084 0x1 0x0 0x0 0x18222098 0x1 0x0 0x0 0x182220ac 0x1 0x0 0x0 0x182220c0 0x1 0x0 0x0 0x18221278 0x1 0x0 0x0 0x1822128c 0x1 0x0 0x0 0x182212a0 0x1 0x0 0x0 0x182212b4 0x1 0x0 0x0 0x182212c8 0x1 0x0 0x0 0x182212dc 0x1 0x0 0x0 0x182212f0 0x1 0x0 0x0 0x18221304 0x1 0x0 0x0 0x18221318 0x1 0x0 0x0 0x1822132c 0x1 0x0 0x0 0x18221340 0x1 0x0 0x0 0x18221354 0x1 0x0 0x0 0x18221368 0x1 0x0 0x0 0x1822137c 0x1 0x0 0x0 0x18221390 0x1 0x0 0x0 0x182213a4 0x1 0x0 0x0 0x18221518 0x1 0x0 0x0 0x1822152c 0x1 0x0 0x0 0x18221540 0x1 0x0 0x0 0x18221554 0x1 0x0 0x0 0x18221568 0x1 0x0 0x0 0x1822157c 0x1 0x0 0x0 0x18221590 0x1 0x0 0x0 0x182215a4 0x1 0x0 0x0 0x182215b8 0x1 0x0 0x0 0x182215cc 0x1 0x0 0x0 0x182215e0 0x1 0x0 0x0 0x182215f4 0x1 0x0 0x0 0x18221608 0x1 0x0 0x0 0x1822161c 0x1 0x0 0x0 0x18221630 0x1 0x0 0x0 0x18221644 0x1 0x0 0x0 0x182217b8 0x1 0x0 0x0 0x182217cc 0x1 0x0 0x0 0x182217e0 0x1 0x0 0x0 0x182217f4 0x1 0x0 0x0 0x18221808 0x1 0x0 0x0 0x1822181c 0x1 0x0 0x0 0x18221830 0x1 0x0 0x0 0x18221844 0x1 0x0 0x0 0x18221858 0x1 0x0 0x0 0x1822186c 0x1 0x0 0x0 0x18221880 0x1 0x0 0x0 0x18221894 0x1 0x0 0x0 0x182218a8 0x1 0x0 0x0 0x182218bc 0x1 0x0 0x0 0x182218d0 0x1 0x0 0x0 0x182218e4 0x1 0x0 0x0 0x18221a58 0x1 0x0 0x0 0x18221a6c 0x1 0x0 0x0 0x18221a80 0x1 0x0 0x0 0x18221a94 0x1 0x0 0x0 0x18221aa8 0x1 0x0 0x0 0x18221abc 0x1 0x0 0x0 0x18221ad0 0x1 0x0 0x0 0x18221ae4 0x1 0x0 0x0 0x18221af8 0x1 0x0 0x0 0x18221b0c 0x1 0x0 0x0 0x18221b20 0x1 0x0 0x0 0x18221b34 0x1 0x0 0x0 0x18221b48 0x1 0x0 0x0 0x18221b5c 0x1 0x0 0x0 0x18221b70 0x1 0x0 0x0 0x18221b84 0x1 0x0 0x0 0x18221cf8 0x1 0x0 0x0 0x18221d0c 0x1 0x0 0x0 0x18221d20 0x1 0x0 0x0 0x18221d34 0x1 0x0 0x0 0x18221d48 0x1 0x0 0x0 0x18221d5c 0x1 0x0 0x0 0x18221d70 0x1 0x0 0x0 0x18221d84 0x1 0x0 0x0 0x18221d98 0x1 0x0 0x0 0x18221dac 0x1 0x0 0x0 0x18221dc0 0x1 0x0 0x0 0x18221dd4 0x1 0x0 0x0 0x18221de8 0x1 0x0 0x0 0x18221dfc 0x1 0x0 0x0 0x18221e10 0x1 0x0 0x0 0x18221e24 0x1 0x0 0x0 0x18221f98 0x1 0x0 0x0 0x18221fac 0x1 0x0 0x0 0x18221fc0 0x1 0x0 0x0 0x18221fd4 0x1 0x0 0x0 0x18221fe8 0x1 0x0 0x0 0x18221ffc 0x1 0x0 0x0 0x18222010 0x1 0x0 0x0 0x18222024 0x1 0x0 0x0 0x18222038 0x1 0x0 0x0 0x1822204c 0x1 0x0 0x0 0x18222060 0x1 0x0 0x0 0x18222074 0x1 0x0 0x0 0x18222088 0x1 0x0 0x0 0x1822209c 0x1 0x0 0x0 0x182220b0 0x1 0x0 0x0 0x182220c4 0x1 0x0 0x0 0x105050 0x1 0x0 0x0 0x171004 0x1 0x0 0x0 0x171154 0x1 0x0 0x0 0x17100c 0x1 0x0 0x0 0x171018 0x1 0x0 0x0 0x5091004 0x1 0x0 0x0 0x509100c 0x1 0x0 0x0 0x5091010 0x1 0x0 0x0 0x5091014 0x1 0x0 0x0 0x5091054 0x1 0x0 0x0 0x5091060 0x1 0x0 0x0 0x509106c 0x1 0x0 0x0 0x5091070 0x1 0x0 0x0 0x5091074 0x1 0x0 0x0 0x5091078 0x1 0x0 0x0 0x509107c 0x1 0x0 0x0 0x509108c 0x1 0x0 0x0 0x5091098 0x1 0x0 0x0 0x509109c 0x1 0x0 0x0 0x1800005c 0x1 0x0 0x0 0x1801005c 0x1 0x0 0x0 0x1802005c 0x1 0x0 0x0 0x1803005c 0x1 0x0 0x0 0x1804005c 0x1 0x0 0x0 0x1805005c 0x1 0x0 0x0 0x1806005c 0x1 0x0 0x0 0x1807005c 0x1 0x0 0x0 0x17c0003c 0x1 0x0 0x1 0x6004fb0 0xc5acce55 0x0 0x1 0x600408c 0xff 0x0 0x1 0x6004fb0 0x0 0x0 0x0 0x62900010 0x1 0x0 0x0 0x62900014 0x1 0x0 0x0 0x62900018 0x1 0x0 0x0 0x62900030 0x1 0x0 0x0 0x62900038 0x1 0x0 0x0 0x62900040 0x1 0x0 0x0 0x62900048 0x1 0x0 0x0 0x629000d0 0x1 0x0 0x0 0x62900210 0x1 0x0 0x0 0x62900230 0x1 0x0 0x0 0x62900250 0x1 0x0 0x0 0x62900270 0x1 0x0 0x0 0x62900290 0x1 0x0 0x0 0x629002b0 0x1 0x0 0x0 0x62900208 0x1 0x0 0x0 0x62900228 0x1 0x0 0x0 0x62900248 0x1 0x0 0x0 0x62900268 0x1 0x0 0x0 0x62900288 0x1 0x0 0x0 0x629002a8 0x1 0x0 0x0 0x6290020c 0x1 0x0 0x0 0x6290022c 0x1 0x0 0x0 0x6290024c 0x1 0x0 0x0 0x6290026c 0x1 0x0 0x0 0x6290028c 0x1 0x0 0x0 0x629002ac 0x1 0x0 0x0 0x62900404 0x1 0x0 0x0 0x62900408 0x1 0x0 0x0 0x62900400 0x1 0x0 0x0 0x62900d04 0x1 0x0 0x0 0x624b0010 0x1 0x0 0x0 0x624b0014 0x1 0x0 0x0 0x624b0018 0x1 0x0 0x0 0x624b0210 0x1 0x0 0x0 0x624b0230 0x1 0x0 0x0 0x624b0250 0x1 0x0 0x0 0x624b0270 0x1 0x0 0x0 0x624b0290 0x1 0x0 0x0 0x624b02b0 0x1 0x0 0x0 0x624b0208 0x1 0x0 0x0 0x624b0228 0x1 0x0 0x0 0x624b0248 0x1 0x0 0x0 0x624b0268 0x1 0x0 0x0 0x624b0288 0x1 0x0 0x0 0x624b02a8 0x1 0x0 0x0 0x624b020c 0x1 0x0 0x0 0x624b022c 0x1 0x0 0x0 0x624b024c 0x1 0x0 0x0 0x624b026c 0x1 0x0 0x0 0x624b028c 0x1 0x0 0x0 0x624b02ac 0x1 0x0 0x0 0x624b0400 0x1 0x0 0x0 0x624b0404 0x1 0x0 0x0 0x624b0408 0x1 0x0 0x0 0x62402028 0x1 0x0 0x0 0xb254520 0x1 0x0 0x0 0xb251020 0x1 0x0 0x0 0xb251024 0x1 0x0 0x0 0xb251030 0x1 0x0 0x0 0xb251200 0x1 0x0 0x0 0xb251214 0x1 0x0 0x0 0xb251228 0x1 0x0 0x0 0xb25123c 0x1 0x0 0x0 0xb251250 0x1 0x0 0x0 0xb251204 0x1 0x0 0x0 0xb251218 0x1 0x0 0x0 0xb25122c 0x1 0x0 0x0 0xb251240 0x1 0x0 0x0 0xb251254 0x1 0x0 0x0 0xb251208 0x1 0x0 0x0 0xb25121c 0x1 0x0 0x0 0xb251230 0x1 0x0 0x0 0xb251244 0x1 0x0 0x0 0xb251258 0x1 0x0 0x0 0xb254510 0x1 0x0 0x0 0xb254514 0x1 0x0 0x0 0xb250010 0x1 0x0 0x0 0xb250014 0x1 0x0 0x0 0xb250900 0x1 0x0 0x0 0xb250904 0x1 0x0 0x0 0x4200010 0x1 0x0 0x0 0x4200014 0x1 0x0 0x0 0x4200018 0x1 0x0 0x0 0x4200030 0x1 0x0 0x0 0x4200038 0x1 0x0 0x0 0x4200040 0x1 0x0 0x0 0x4200048 0x1 0x0 0x0 0x42000d0 0x1 0x0 0x0 0x4200210 0x1 0x0 0x0 0x4200230 0x1 0x0 0x0 0x4200250 0x1 0x0 0x0 0x4200270 0x1 0x0 0x0 0x4200290 0x1 0x0 0x0 0x42002b0 0x1 0x0 0x0 0x4200208 0x1 0x0 0x0 0x4200228 0x1 0x0 0x0 0x4200248 0x1 0x0 0x0 0x4200268 0x1 0x0 0x0 0x4200288 0x1 0x0 0x0 0x42002a8 0x1 0x0 0x0 0x420020c 0x1 0x0 0x0 0x420022c 0x1 0x0 0x0 0x420024c 0x1 0x0 0x0 0x420026c 0x1 0x0 0x0 0x420028c 0x1 0x0 0x0 0x42002ac 0x1 0x0 0x0 0x4200404 0x1 0x0 0x0 0x4200408 0x1 0x0 0x0 0x4200400 0x1 0x0 0x0 0x4200d04 0x1 0x0 0x0 0x4130010 0x1 0x0 0x0 0x4130014 0x1 0x0 0x0 0x4130018 0x1 0x0 0x0 0x4130210 0x1 0x0 0x0 0x4130230 0x1 0x0 0x0 0x4130250 0x1 0x0 0x0 0x4130270 0x1 0x0 0x0 0x4130290 0x1 0x0 0x0 0x41302b0 0x1 0x0 0x0 0x4130208 0x1 0x0 0x0 0x4130228 0x1 0x0 0x0 0x4130248 0x1 0x0 0x0 0x4130268 0x1 0x0 0x0 0x4130288 0x1 0x0 0x0 0x41302a8 0x1 0x0 0x0 0x413020c 0x1 0x0 0x0 0x413022c 0x1 0x0 0x0 0x413024c 0x1 0x0 0x0 0x413026c 0x1 0x0 0x0 0x413028c 0x1 0x0 0x0 0x41302ac 0x1 0x0 0x0 0x4130400 0x1 0x0 0x0 0x4130404 0x1 0x0 0x0 0x4130408 0x1 0x0 0x0 0x4082028 0x1 0x0 0x0 0x18a008 0x1 0x0 0x0 0xb2c4520 0x1 0x0 0x0 0xb2c1020 0x1 0x0 0x0 0xb2c1024 0x1 0x0 0x0 0xb2c1030 0x1 0x0 0x0 0xb2c1200 0x1 0x0 0x0 0xb2c1214 0x1 0x0 0x0 0xb2c1228 0x1 0x0 0x0 0xb2c123c 0x1 0x0 0x0 0xb2c1250 0x1 0x0 0x0 0xb2c1204 0x1 0x0 0x0 0xb2c1218 0x1 0x0 0x0 0xb2c122c 0x1 0x0 0x0 0xb2c1240 0x1 0x0 0x0 0xb2c1254 0x1 0x0 0x0 0xb2c1208 0x1 0x0 0x0 0xb2c121c 0x1 0x0 0x0 0xb2c1230 0x1 0x0 0x0 0xb2c1244 0x1 0x0 0x0 0xb2c1258 0x1 0x0 0x0 0xb2c4510 0x1 0x0 0x0 0xb2c4514 0x1 0x0 0x0 0xb2c0010 0x1 0x0 0x0 0xb2c0014 0x1 0x0 0x0 0xb2c0900 0x1 0x0 0x0 0xb2c0904 0x1 0x0 0x0 0x80a4010 0x1 0x0 0x0 0x80a4014 0x1 0x0 0x0 0x80a4018 0x1 0x0 0x0 0x80a4030 0x1 0x0 0x0 0x80a4038 0x1 0x0 0x0 0x80a4040 0x1 0x0 0x0 0x80a4048 0x1 0x0 0x0 0x80a40d0 0x1 0x0 0x0 0x80a4210 0x1 0x0 0x0 0x80a4230 0x1 0x0 0x0 0x80a4250 0x1 0x0 0x0 0x80a4270 0x1 0x0 0x0 0x80a4290 0x1 0x0 0x0 0x80a42b0 0x1 0x0 0x0 0x80a4208 0x1 0x0 0x0 0x80a4228 0x1 0x0 0x0 0x80a4248 0x1 0x0 0x0 0x80a4268 0x1 0x0 0x0 0x80a4288 0x1 0x0 0x0 0x80a42a8 0x1 0x0 0x0 0x80a420c 0x1 0x0 0x0 0x80a422c 0x1 0x0 0x0 0x80a424c 0x1 0x0 0x0 0x80a426c 0x1 0x0 0x0 0x80a428c 0x1 0x0 0x0 0x80a42ac 0x1 0x0 0x0 0x80a4404 0x1 0x0 0x0 0x80a4408 0x1 0x0 0x0 0x80a4400 0x1 0x0 0x0 0x80a4d04 0x1 0x0 0x0 0x83b0010 0x1 0x0 0x0 0x83b0014 0x1 0x0 0x0 0x83b0018 0x1 0x0 0x0 0x83b0210 0x1 0x0 0x0 0x83b0230 0x1 0x0 0x0 0x83b0250 0x1 0x0 0x0 0x83b0270 0x1 0x0 0x0 0x83b0290 0x1 0x0 0x0 0x83b02b0 0x1 0x0 0x0 0x83b0208 0x1 0x0 0x0 0x83b0228 0x1 0x0 0x0 0x83b0248 0x1 0x0 0x0 0x83b0268 0x1 0x0 0x0 0x83b0288 0x1 0x0 0x0 0x83b02a8 0x1 0x0 0x0 0x83b020c 0x1 0x0 0x0 0x83b022c 0x1 0x0 0x0 0x83b024c 0x1 0x0 0x0 0x83b026c 0x1 0x0 0x0 0x83b028c 0x1 0x0 0x0 0x83b02ac 0x1 0x0 0x0 0x83b0400 0x1 0x0 0x0 0x83b0404 0x1 0x0 0x0 0x83b0408 0x1 0x0 0x0 0x8302028 0x1 0x0 0x0 0xb2b4520 0x1 0x0 0x0 0xb2b1020 0x1 0x0 0x0 0xb2b1024 0x1 0x0 0x0 0xb2b1030 0x1 0x0 0x0 0xb2b1200 0x1 0x0 0x0 0xb2b1214 0x1 0x0 0x0 0xb2b1228 0x1 0x0 0x0 0xb2b123c 0x1 0x0 0x0 0xb2b1250 0x1 0x0 0x0 0xb2b1204 0x1 0x0 0x0 0xb2b1218 0x1 0x0 0x0 0xb2b122c 0x1 0x0 0x0 0xb2b1240 0x1 0x0 0x0 0xb2b1254 0x1 0x0 0x0 0xb2b1208 0x1 0x0 0x0 0xb2b121c 0x1 0x0 0x0 0xb2b1230 0x1 0x0 0x0 0xb2b1244 0x1 0x0 0x0 0xb2b1258 0x1 0x0 0x0 0xb2b4510 0x1 0x0 0x0 0xb2b4514 0x1 0x0 0x0 0xb2b0010 0x1 0x0 0x0 0xb2b0014 0x1 0x0 0x0 0xb2b0900 0x1 0x0 0x0 0xb2b0904 0x1 0x0 0x0 0x17a00204 0x1d 0x0>; + }; + }; + }; + + fragment@37 { + target = <0xffffffff>; + + __overlay__ { + + ss_plog@B4400000 { + compatible = "ss_plog"; + no-map; + reg = <0x0 0xb4400000 0x0 0x200000>; + }; + + ramoops@B4600000 { + compatible = "ramoops"; + reg = <0x0 0xb4600000 0x0 0x100000>; + record-size = <0x40000>; + console-size = <0x40000>; + ftrace-size = <0x40000>; + pmsg-size = <0x40000>; + }; + + sec_debug_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4700000 0x0 0x800000>; + phandle = <0xbc>; + }; + + sec_debug_autocomment@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xb4f00000 0x0 0x1000>; + phandle = <0xbd>; + }; + + sec_debug_rdx_bootdev@0 { + no-ship; + reg = <0x1 0x0 0x0 0x5900000>; + phandle = <0xbe>; + }; + + kaslr_region@A0001000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xa0001000 0x0 0x1000>; + phandle = <0xbf>; + }; + + rkp_region@B0200000 { + compatible = "removed-dma-pool"; + reg = <0x0 0xb0200000 0x0 0x200000>; + phandle = <0xc0>; + }; + + hdm_region@A1000000 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0xa1000000 0x0 0x1000>; + phandle = <0x53>; + }; + + modem_shared_mem_region@B5000000 { + compatible = "modem-removed-dma-pool"; + no-map; + reg = <0x0 0xb5000000 0x0 0x6000000>; + phandle = <0x52>; + }; + }; + }; + + fragment@38 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x80b00000 0x0 0x7100000>; + }; + }; + + fragment@39 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x8b000000 0x0 0x8900000>; + }; + }; + + fragment@40 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x93c00000 0x0 0x3e00000>; + }; + }; + + fragment@41 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97a00000 0x0 0x500000>; + }; + }; + + fragment@42 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x97f00000 0x0 0x500000>; + }; + }; + + fragment@43 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98400000 0x0 0x500000>; + }; + }; + + fragment@44 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x98900000 0x0 0x1e00000>; + }; + }; + + fragment@45 { + target = <0xffffffff>; + + __overlay__ { + reg = <0x0 0x9e000000 0x0 0x2000000>; + }; + }; + + fragment@46 { + target = <0xffffffff>; + + __overlay__ { + size = <0x0 0x2000000>; + }; + }; + + fragment@47 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@48 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@49 { + target = <0xffffffff>; + + __overlay__ { + + upload_cause@66c { + compatible = "qcom,msm-imem-upload_cause"; + reg = <0x66c 0x4>; + }; + }; + }; + + fragment@50 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@51 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@52 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@53 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@54 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@55 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@56 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@57 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@58 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + }; + }; + + fragment@59 { + target = <0xffffffff>; + + __overlay__ { + + dwc3@a600000 { + maximum-speed = "high-speed"; + }; + }; + }; + + fragment@60 { + target = <0xffffffff>; + + __overlay__ { + + input_booster { + status = "okay"; + compatible = "input_booster"; + #address-cells = <0x1>; + #size-cells = <0x0>; + + booster_key@1 { + input_booster,label = "KEY"; + input_booster,type = <0x0>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0xc8>; + input_booster,tail_times = <0x0>; + }; + + booster_key@2 { + input_booster,label = "TOUCHKEY"; + input_booster,type = <0x1>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x135600>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x0>; + input_booster,tail_times = <0x12c>; + }; + + booster_key@3 { + input_booster,label = "TOUCH"; + input_booster,type = <0x2>; + input_booster,levels = <0x1 0x2 0x3>; + input_booster,cpu_freqs = <0x135600 0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2 0x2>; + input_booster,ddr_freqs = <0x3f9 0x3f9 0x3f9>; + input_booster,lpm_bias = <0x5 0x5 0x5>; + input_booster,head_times = <0xc8 0xc8 0x0>; + input_booster,tail_times = <0x0 0x0 0x12c>; + }; + + booster_key@4 { + input_booster,label = "MULTITOUCH"; + input_booster,type = <0x3>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x3e8 0x0>; + input_booster,tail_times = <0x0 0x1f4>; + }; + + booster_key@5 { + input_booster,label = "KEYBOARD"; + input_booster,type = <0x4>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x135600>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0x82 0x82>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@6 { + input_booster,label = "MOUSE"; + input_booster,type = <0x5>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@7 { + input_booster,label = "MOUSE WHEEL"; + input_booster,type = <0x6>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x0>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x0>; + }; + + booster_key@8 { + input_booster,label = "PEN HOVER"; + input_booster,type = <0x7>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x135600 0x10fe00>; + input_booster,hmp_boost = <0x2 0x0>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x12c>; + }; + + booster_key@9 { + input_booster,label = "PEN"; + input_booster,type = <0x8>; + input_booster,levels = <0x1 0x2>; + input_booster,cpu_freqs = <0x17bb00 0x10fe00>; + input_booster,hmp_boost = <0x2 0x2>; + input_booster,ddr_freqs = <0x0 0x0>; + input_booster,lpm_bias = <0x0 0x0>; + input_booster,head_times = <0xc8 0x0>; + input_booster,tail_times = <0x0 0x258>; + }; + + booster_key@10 { + input_booster,label = "KEY_TWO"; + input_booster,type = <0x9>; + input_booster,levels = <0x1>; + input_booster,cpu_freqs = <0x17bb00>; + input_booster,hmp_boost = <0x2>; + input_booster,ddr_freqs = <0x0>; + input_booster,lpm_bias = <0x0>; + input_booster,head_times = <0x2bc>; + input_booster,tail_times = <0x2bc>; + }; + }; + + sec_smem@0 { + compatible = "samsung,sec-smem"; + status = "okay"; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_4 { + compatible = "qcom,memshare-peripheral"; + memory-region = <0x52>; + qcom,peripheral-size = <0x2000000>; + qcom,reserved-size = <0x4000000>; + qcom,client-id = <0x3>; + qcom,allocate-boot-time; + label = "modem"; + }; + }; + + samsung,sec_misc { + qfprom_jtag,reg = <0x780180>; + }; + + usb-notifier { + compatible = "samsung,usb-notifier"; + qcom,disable_control_en = <0x1>; + qcom,unsupport_host_en = <0x0>; + phandle = <0xc1>; + }; + + samsung,sec_hdm { + memory-region = <0x53>; + }; + }; + }; + + fragment@61 { + target = <0xffffffff>; + + __overlay__ { + + android { + + vbmeta { + compatible = "android,vbmeta"; + parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_system,recovery,dtbo,abl,xbl,tz,hyp"; + }; + }; + }; + }; + + fragment@62 { + target = <0xffffffff>; + + __overlay__ { + qcom,smem-states = <0xffffffff 0x0 0xffffffff 0x4 0xffffffff 0x5>; + qcom,smem-state-names = "qcom,force-stop", "qcom,stop-reason-0", "qcom,stop-reason-1"; + }; + }; + + fragment@63 { + target = <0xffffffff>; + + __overlay__ { + vdd-3.3-ch1-supply; + }; + }; + + fragment@64 { + target = <0xffffffff>; + + __overlay__ { + spm-level = <0x3>; + }; + }; + + fragment@65 { + target = <0xffffffff>; + + __overlay__ { + + camera_mem_region { + reg = <0x1 0x20000000 0x0 0x25800000>; + ion,recyclable; + phandle = <0x54>; + }; + }; + }; + + fragment@66 { + target = <0xffffffff>; + + __overlay__ { + + qcom,ion { + + qcom,ion-heap@30 { + reg = <0x1e>; + memory-region = <0x54>; + qcom,ion-heap-type = "RBIN"; + }; + }; + }; + }; + + fragment@67 { + target = <0xffffffff>; + + __overlay__ { + i2c18 = "/soc/i2c@18"; + }; + }; + + fragment@68 { + target = <0xffffffff>; + + __overlay__ { + qcom,num-macros = <0x3>; + + imp_list { + #list-imp-cells = <0x3>; + phandle = <0x25>; + }; + }; + }; + + fragment@69 { + target = <0xffffffff>; + + __overlay__ { + + msm_cdc_pinctrl_quin { + compatible = "qcom,msm-cdc-pinctrl"; + pinctrl-names = "aud_active", "aud_sleep"; + pinctrl-0 = <0x55 0x56 0x57 0x58>; + pinctrl-1 = <0x59 0x5a 0x5b 0x5c>; + qcom,lpi-gpios; + phandle = <0x60>; + }; + }; + }; + + fragment@70 { + target = <0xffffffff>; + + __overlay__ { + + sec-audio-sysfs { + compatible = "samsung,audio-sysfs"; + status = "okay"; + audio,num-amp = <0x2>; + }; + + samsung,q6audio-adaptation { + compatible = "samsung,q6audio-adaptation"; + adaptation,device-tx-port-id = <0xb037>; + adaptation,spk-rx-port-id = <0x1016>; + adaptation,usb-rx-port-id = <0x7000>; + adaptation,bt-rx-port-id = <0x400e>; + adaptation,headset-rx-port-id = <0xb030>; + phandle = <0x5f>; + }; + + det_zones { + #list-det-cells = <0x2>; + phandle = <0x24>; + }; + + i2c@18 { + status = "ok"; + cell-index = <0x12>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x58 0x0 0xffffffff 0x59 0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x5d 0x5e>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + phandle = <0xc2>; + + tas256x@4c { + #sound-dai-cells = <0x0>; + compatible = "ti, tas256x"; + status = "ok"; + reg = <0x4c>; + ti,reset-gpio = <0xffffffff 0x5e 0x0>; + ti,irq-gpio = <0xffffffff 0x5a 0x0>; + ti,left-channel = <0x4d>; + ti,right-channel = <0x4c>; + ti,channels = <0x2>; + ti,iv-width = <0x8>; + ti,vbat-mon = <0x1>; + ti,port_id = <0x1016>; + phandle = <0xc3>; + }; + }; + }; + }; + + fragment@71 { + target = <0xffffffff>; + + __overlay__ { + qcom,model = "atoll-idp-snd-card"; + qcom,wcn-btfm = <0x1>; + qcom,ext-disp-audio-rx = <0x0>; + qcom,mi2s-audio-intf = <0x1>; + asoc-platform = <0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0x5f>; + asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", "msm-pcm-dsp.2", "msm-voip-dsp", "msm-pcm-voice", "msm-pcm-loopback", "msm-compress-dsp", "msm-pcm-hostless", "msm-pcm-afe", "msm-lsm-client", "msm-pcm-routing", "msm-compr-dsp", "msm-pcm-dsp-noirq", "q6audio-adaptation"; + qcom,audio-routing = "AMIC1", "MIC BIAS1", "MIC BIAS1", "Analog Mic1", "AMIC2", "MIC BIAS2", "MIC BIAS2", "Analog Mic2", "AMIC3", "MIC BIAS3", "MIC BIAS3", "Analog Mic3", "AMIC4", "MIC BIAS3", "MIC BIAS3", "Analog Mic4", "AMIC5", "MIC BIAS4", "MIC BIAS4", "Analog Mic5", "IN1_HPHL", "HPHL_OUT", "IN2_HPHR", "HPHR_OUT", "TX SWR_ADC0", "ADC1_OUTPUT", "TX SWR_ADC1", "ADC2_OUTPUT", "TX SWR_ADC2", "ADC3_OUTPUT", "TX SWR_ADC3", "ADC4_OUTPUT", "RX_TX DEC0_INP", "TX DEC0 MUX", "RX_TX DEC1_INP", "TX DEC1 MUX", "RX_TX DEC2_INP", "TX DEC2 MUX", "RX_TX DEC3_INP", "TX DEC3 MUX", "VA_AIF1 CAP", "VA_SWR_CLK", "VA_AIF2 CAP", "VA_SWR_CLK", "VA_AIF3 CAP", "VA_SWR_CLK", "VA SWR_ADC0", "ADC1_OUTPUT", "VA SWR_ADC1", "ADC2_OUTPUT", "VA SWR_ADC2", "ADC3_OUTPUT", "VA SWR_ADC3", "ADC4_OUTPUT"; + qcom,msm-mbhc-hs-mic-max-threshold-mv = <0x270f>; + qcom,msm-mbhc-hs-mic-min-threshold-mv = <0x280>; + qcom,cdc-dmic01-gpios; + qcom,cdc-dmic23-gpios; + qcom,cdc-dmic45-gpios; + qcom,quin-mi2s-gpios = <0x60>; + asoc-codec = <0xffffffff 0xffffffff>; + asoc-codec-names = "msm-stub-codec.1", "bolero_codec"; + qcom,wsa-max-devs = <0x0>; + qcom,wsa-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0xffffffff 0xffffffff 0x31 0xffffffff>; + fsa4480-i2c-handle; + qcom,fm-lna-gpios = <0xffffffff 0x54 0x0>; + qcom,msm-mbhc-gnd-det = <0x1>; + }; + }; + + fragment@72 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@73 { + target = <0xffffffff>; + + __overlay__ { + + tas25xx_gpio_default { + phandle = <0x5d>; + + mux { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + function = "gpio"; + }; + + config { + pins = "gpio88", "gpio89", "gpio90", "gpio94"; + bias-disable; + }; + }; + + fm_lna_default { + phandle = <0x5e>; + + mux { + pins = "gpio84"; + function = "gpio"; + }; + + config { + pins = "gpio84"; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@74 { + target = <0xffffffff>; + + __overlay__ { + + grip_i2c { + + grip_i2c_active { + phandle = <0xa8>; + + grip_i2c_active { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + + grip_i2c_suspend { + phandle = <0xc4>; + + grip_i2c_suspend { + pins = "gpio51", "gpio52"; + bias-disable; + }; + }; + }; + + s2mpb03_i2c_sda_default { + phandle = <0x61>; + + mux { + pins = "gpio25"; + function = "gpio"; + }; + + config { + pins = "gpio25"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + s2mpb03_i2c_scl_default { + phandle = <0x62>; + + mux { + pins = "gpio26"; + function = "gpio"; + }; + + config { + pins = "gpio26"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + cam_sensor_mclk0_active { + phandle = <0x81>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk0_suspend { + phandle = <0x83>; + + mux { + pins = "gpio13"; + function = "cam_mclk"; + }; + + config { + pins = "gpio13"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk1_active { + phandle = <0x91>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk1_suspend { + phandle = <0x93>; + + mux { + pins = "gpio23"; + function = "cam_mclk"; + }; + + config { + pins = "gpio23"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk2_active { + phandle = <0x99>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk2_suspend { + phandle = <0x9c>; + + mux { + pins = "gpio14"; + function = "cam_mclk"; + }; + + config { + pins = "gpio14"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk3_active { + phandle = <0x86>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk3_suspend { + phandle = <0x8a>; + + mux { + pins = "gpio15"; + function = "cam_mclk"; + }; + + config { + pins = "gpio15"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + cam_sensor_mclk4_active { + phandle = <0xa0>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-disable; + drive-strength = <0x6>; + }; + }; + + cam_sensor_mclk4_suspend { + phandle = <0xa3>; + + mux { + pins = "gpio16"; + function = "cam_mclk"; + }; + + config { + pins = "gpio16"; + bias-pull-down; + drive-strength = <0x6>; + output-low; + }; + }; + + rcam1_sensor_reset_active { + phandle = <0x82>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_reset_suspend { + phandle = <0x84>; + + mux { + pins = "gpio30"; + function = "gpio"; + }; + + config { + pins = "gpio30"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_active { + phandle = <0x92>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + front_sensor_reset_suspend { + phandle = <0x94>; + + mux { + pins = "gpio21"; + function = "gpio"; + }; + + config { + pins = "gpio21"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_active { + phandle = <0x87>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_reset_suspend { + phandle = <0x8b>; + + mux { + pins = "gpio29"; + function = "gpio"; + }; + + config { + pins = "gpio29"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_active { + phandle = <0x9a>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_reset_suspend { + phandle = <0x9d>; + + mux { + pins = "gpio42"; + function = "gpio"; + }; + + config { + pins = "gpio42"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_active { + phandle = <0xa1>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_reset_suspend { + phandle = <0xa4>; + + mux { + pins = "gpio24"; + function = "gpio"; + }; + + config { + pins = "gpio24"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_active { + phandle = <0x73>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam1_sensor_vana_suspend { + phandle = <0x74>; + + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_active { + phandle = <0x9b>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam2_sensor_vana_suspend { + phandle = <0x9e>; + + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_active { + phandle = <0x88>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vana_suspend { + phandle = <0x8c>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_active { + phandle = <0xa2>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vana_suspend { + phandle = <0xa5>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_active { + phandle = <0x89>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-disable; + output-high; + drive-strength = <0x2>; + }; + }; + + cam_mipi_sel_suspend { + phandle = <0x8d>; + + mux { + pins = "gpio66"; + function = "gpio"; + }; + + config { + pins = "gpio66"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vdig_active { + phandle = <0xc5>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam3_sensor_vdig_suspend { + phandle = <0xc6>; + + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_active { + phandle = <0xc7>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + rcam4_sensor_vdig_suspend { + phandle = <0xc8>; + + mux { + pins = "gpio74"; + function = "gpio"; + }; + + config { + pins = "gpio74"; + bias-pull-down; + drive-strength = <0x2>; + }; + }; + + if_pmic_i2c_pins { + phandle = <0xc9>; + + if_pmic_i2c_sleep { + phandle = <0x66>; + + mux { + pins = "gpio115", "gpio116"; + function = "gpio"; + }; + + config { + pins = "gpio115", "gpio116"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + usbpd_i2c_pins { + phandle = <0xca>; + + usbpd_i2c_sleep { + phandle = <0x68>; + + mux { + pins = "gpio53", "gpio54"; + function = "gpio"; + }; + + config { + pins = "gpio53", "gpio54"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + + mcu_reset_active { + phandle = <0x76>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_reset_suspend { + phandle = <0x78>; + + mux { + pins = "gpio32"; + function = "gpio"; + }; + + config { + pins = "gpio32"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + + mcu_clk_active { + phandle = <0x77>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + mcu_clk_suspend { + phandle = <0x79>; + + mux { + pins = "gpio43"; + function = "gpio"; + }; + + config { + pins = "gpio43"; + bias-pull-down; + output-low; + drive-strength = <0x2>; + }; + }; + }; + }; + + fragment@75 { + target = <0xffffffff>; + + __overlay__ { + + grip_int_active { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xa9>; + }; + + grip_int_suspend { + pins = "gpio5"; + function = "normal"; + power-source = <0x0>; + input-enable; + bias-disable; + phandle = <0xcb>; + }; + }; + }; + + fragment@76 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x6 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x22 0x25 0x2a 0x2d 0x2f 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x43 0x44 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5b 0x5e 0x73 0x74 0x76>; + }; + }; + + fragment@77 { + target = <0xffffffff>; + + __overlay__ { + + qcom,pm6150@0 { + + qcom,power-on@800 { + interrupts = <0x0 0x8 0x0 0x0 0x0 0x8 0x1 0x0 0x0 0x8 0x4 0x0 0x0 0x8 0x5 0x0>; + interrupt-names = "kpdpwr", "resin", "resin-bark", "kpdpwr-resin-bark"; + qcom,s3-debounce = <0x80>; + + qcom,pon_1 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_2 { + qcom,support-reset = <0x0>; + }; + + qcom,pon_3 { + qcom,pon-type = <0x3>; + qcom,support-reset = <0x1>; + qcom,pull-up = <0x1>; + qcom,s1-timer = <0x1a40>; + qcom,s2-timer = <0x3e8>; + qcom,s2-type = <0x8>; + qcom,use-bark; + }; + }; + }; + }; + }; + + fragment@78 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@79 { + target = <0xffffffff>; + + __overlay__ { + status = "disabled"; + }; + }; + + fragment@80 { + target = <0xffffffff>; + + __overlay__ { + + sec_thermistor@0 { + compatible = "samsung,sec-ap-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "ap_therm"; + adc_array = <0x70e 0x8a0 0xa3c 0xc04 0xe36 0x1103 0x1467 0x17f5 0x1c02 0x20ba 0x25b4 0x2b63 0x3141 0x3799 0x3d1c 0x44c8 0x4b37 0x51b0 0x5641 0x5bbf 0x5fec 0x6437 0x66e9>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@1 { + compatible = "samsung,sec-pa-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4e>; + io-channel-names = "pa_therm"; + adc_array = <0x745 0x8dc 0xa82 0xc3c 0xe92 0x112d 0x149e 0x1836 0x1c41 0x211f 0x2636 0x2bc9 0x31a3 0x3802 0x3d67 0x453a 0x4b8f 0x518c 0x5730 0x5c17 0x60ae 0x6482 0x672b>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + sec_thermistor@2 { + compatible = "samsung,sec-wf-thermistor"; + status = "okay"; + io-channels = <0xffffffff 0x4f>; + io-channel-names = "wf_therm"; + adc_array = <0x753 0x8de 0xa8f 0xc4d 0xe9a 0x1140 0x149f 0x183d 0x1c54 0x2116 0x262e 0x2bdb 0x31c1 0x3816 0x3d7c 0x455a 0x4b86 0x51c4 0x56f2 0x5c43 0x60c5 0x64b3 0x6785>; + temp_array = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + }; + + i2c@2 { + cell-index = <0x2>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x19 0x0 0xffffffff 0x1a 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0x61 0x62>; + phandle = <0xcc>; + + s2mpb03@56 { + compatible = "samsung,s2mpb03pmic"; + reg = <0x56>; + additional_reg_init; + + regulators { + + s2mpb03-ldo1 { + regulator-name = "s2mpb03-ldo1"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x100590>; + phandle = <0x90>; + }; + + s2mpb03-ldo2 { + regulator-name = "s2mpb03-ldo2"; + regulator-min-microvolt = <0xf4240>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x80>; + }; + + s2mpb03-ldo3 { + regulator-name = "s2mpb03-ldo3"; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + phandle = <0x7f>; + }; + + s2mpb03-ldo4 { + regulator-name = "s2mpb03-ldo4"; + regulator-min-microvolt = <0x10c8e0>; + regulator-max-microvolt = <0x10c8e0>; + phandle = <0x98>; + }; + + s2mpb03-ldo5 { + regulator-name = "s2mpb03-ldo5"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x7a>; + }; + + s2mpb03-ldo6 { + regulator-name = "s2mpb03-ldo6"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x8f>; + }; + + s2mpb03-ldo7 { + regulator-name = "s2mpb03-ldo7"; + regulator-min-microvolt = <0x2ab980>; + regulator-max-microvolt = <0x2c4020>; + phandle = <0x75>; + }; + }; + }; + }; + }; + }; + + fragment@81 { + target = <0xffffffff>; + + __overlay__ { + interrupts = <0x0 0xc0 0x0 0x0 0x0 0xc1 0x0 0x0 0x0 0xc2 0x0 0x0 0x0 0xc3 0x0 0x0 0x0 0xc4 0x0 0x0 0x0 0xc6 0x0 0x0 0x0 0xc7 0x0 0x0 0x0 0xc9 0x0 0x0>; + interrupt-names = "pm6150_gpio1", "pm6150_gpio2", "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio5", "pm6150_gpio7", "pm6150_gpio8", "pm6150_gpio10"; + qcom,gpios-disallowed = <0x6 0x9>; + }; + }; + + fragment@82 { + target = <0xffffffff>; + + __overlay__ { + + ap_therm { + reg = <0x4e>; + label = "ap_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@83 { + target = <0xffffffff>; + + __overlay__ { + + pa_therm { + reg = <0x4e>; + label = "pa_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + + wf_therm { + reg = <0x4f>; + label = "wf_therm"; + qcom,ratiometric; + qcom,hw-settle-time = <0xc8>; + qcom,pre-scaling = <0x1 0x1>; + }; + }; + }; + + fragment@84 { + target = <0xffffffff>; + + __overlay__ { + + self_display_FC3_dtsi { + label = "self_display_FC3_dtsi"; + samsung,support_self_display; + samsung,self_mask_setting_pre_revA = [29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 02 75 10]; + samsung,self_mask_setting_post_revA = [29 01 00 00 00 00 02 75 00]; + samsung,self_mask_on_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 00 00 00 95 07 9e 09 5f 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_on_factory_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 17 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 09 0c 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_mask_off_revA = [29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 02 7a 00 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,self_disp_debug_rx_cmds_revA = [06 01 00 00 00 00 01 7f 04 01]; + samsung,self_mask_check_tx_pre1_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 04 b0 00 27 d8 29 01 00 00 00 00 02 d8 16 29 01 00 00 00 00 0a bf 01 07 00 00 00 10 00 00 00 29 01 00 00 11 00 02 7a 00 29 01 00 00 00 00 02 75 10 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,self_mask_check_tx_pre2_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 02 75 00 29 01 00 00 22 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 01 f4 02 33 09 60 09 61 00 00 ff ff ff 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,mask_crc_pass_data = [d3 9b]; + samsung,self_mask_check_rx_cmds_revA = [06 01 00 00 00 00 01 14 02 00]; + samsung,self_mask_check_tx_post_revA = [29 01 00 00 00 00 03 9f a5 a5 29 01 00 00 00 00 03 f0 5a 5a 29 01 00 00 00 00 03 fc 5a 5a 29 01 00 00 00 00 1a 7a 01 06 00 00 00 00 00 00 00 00 00 00 09 60 09 61 09 62 09 63 00 00 00 00 00 29 01 00 00 00 00 02 bf 00 29 01 00 00 00 00 03 fc a5 a5 29 01 00 00 00 00 03 f0 a5 a5 29 01 00 00 00 00 03 9f 5a 5a]; + phandle = <0x63>; + }; + }; + }; + + fragment@85 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + label = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x1>; + qcom,mdss-dsi-bl-max-level = <0x1e6>; + qcom,mdss-brightness-max-level = <0x1e6>; + qcom,mdss-brightness-default-level = <0xff>; + qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; + qcom,mdss-dsi-te-pin-select = <0x1>; + qcom,mdss-dsi-te-dcs-command = <0x1>; + qcom,mdss-dsi-wr-mem-start = <0x2c>; + qcom,mdss-dsi-wr-mem-continue = <0x3c>; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-t-clk-pre = <0x3e>; + qcom,mdss-dsi-t-clk-post = <0x10>; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x46>; + qcom,mdss-pan-physical-height-dimension = <0x9b>; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-t-clk-pre-extend; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + qcom,ulps-enabled; + samsung,panel-vendor = "SDC"; + samsung,disp-model = "AMS667YM01"; + samsung,support_gamma_mode2; + samsung,skip_read_on_pre; + samsung,elvss_interpolation_temperature = <0xfffffff0>; + samsung,support_lpm; + samsung,support_gpara; + samsung,pointing_gpara; + samsung,two_byte_gpara; + samsung,rsc_4_frame_idle; + samsung,support_factory_panel_swap; + samsung,support-optical-fingerprint; + samsung,support_vrr_based_bl; + ss,self_display = <0x63>; + samsung,level0_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 9f a5 a5]; + samsung,level0_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 9f 5a 5a]; + samsung,level1_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 5a 5a]; + samsung,level1_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 f0 a5 a5]; + samsung,level2_key_enable_tx_cmds_revA = [29 01 00 00 00 00 03 fc 5a 5a]; + samsung,level2_key_disable_tx_cmds_revA = [29 01 00 00 00 00 03 fc a5 a5]; + samsung,brightness_tx_cmds_revA = <0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100 0x39010000 0x100>; + samsung,display_on_tx_cmds_revA = [29 00 00 00 00 00 03 9f a5 a5 05 00 00 00 00 00 02 29 00 29 01 00 00 00 00 03 9f 5a 5a]; + samsung,display_off_tx_cmds_revA = [05 01 00 00 00 00 02 28 00]; + samsung,reg_read_pos_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 00 00]; + samsung,mtp_write_sysfs_tx_cmds_revA = <0x29000000 0x3d00 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0>; + samsung,panel_ltps_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 50 01 0c 00 04 26 e4 2f b0 0c 09 74 26 e4 0c 00 04 10 00 10 26 a8 10 00 10 10 3c 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,panel_ltps_tx_cmds_revC = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 50 00 0c 00 04 31 48 31 48 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 3c 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,smooth_dimming_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 91 63 29 00 00 00 00 00 02 63 20 29 01 00 00 11 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,gamma_mode2_normal_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26360 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x7290000 0x2 0x53202900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0002900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revF = <0x29000000 0x391 0x2012900 0x0 0x2532029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_normal_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 1c 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,gamma_mode2_hbm_tx_cmds_revG = <0x29000000 0x4b0 0x916329 0x0 0x26320 0x29000000 0x4b0 0x2036329 0x0 0x363f1 0x290000 0x2 0x53e02900 0x0 0x35103ff 0x29000000 0x2b5 0x14290000 0x4 0xb0020363 0x29000000 0x363 0xf0072900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revF = <0x29000000 0x391 0x2002900 0x0 0x253e029 0x0 0x35103 0xff290000 0x2 0xb5142900 0x0 0x4b00076 0x63290000 0x4 0x63000000>; + samsung,gamma_mode2_hbm_tx_cmds_revA = [29 00 00 00 00 00 04 b0 00 02 90 29 00 00 00 00 00 02 90 14 29 00 00 00 00 00 02 53 e0 29 00 00 00 00 00 03 51 03 ff 29 00 00 00 00 00 02 b5 14 29 00 00 00 00 00 04 b0 00 76 63 29 00 00 00 00 00 04 63 00 00 00]; + samsung,vrr_tx_cmds_revA = [29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f]; + samsung,acl_on_tx_cmds_revA = [29 00 00 00 00 00 04 b0 03 b3 65 29 00 00 00 00 00 14 65 55 00 b0 51 66 98 15 55 55 55 08 f1 c6 48 40 00 20 10 09 29 00 00 00 00 00 02 55 03]; + samsung,acl_off_tx_cmds_revA = [29 01 00 00 00 00 02 55 00]; + samsung,manufacture_id0_rx_cmds_revA = [06 01 00 00 00 00 01 da 01 00 00]; + samsung,manufacture_id1_rx_cmds_revA = [06 01 00 00 00 00 01 db 01 00 00]; + samsung,manufacture_id2_rx_cmds_revA = [06 01 00 00 00 00 01 dc 01 00 00]; + samsung,module_info_rx_cmds_revA = [06 01 00 00 00 00 01 a1 0b 00 00]; + samsung,octa_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 04 00 0b]; + samsung,cell_id_rx_cmds_revA = [06 01 00 00 00 00 01 a1 10 00 0f]; + samsung,cell_id_rx_cmds_revG = [06 01 00 00 00 00 01 92 10 00 02]; + samsung,ddi_id_rx_cmds_revA = [06 01 00 00 00 00 01 d6 05 00 00]; + samsung,mtp_read_sysfs_rx_cmds_revA = [06 01 00 00 00 00 01 00 00 00 00]; + samsung,candela_map_table_revA = <0x0 0x0 0x0 0x2 0x2 0x1 0x1 0x1 0x3 0x2 0x2 0x2 0x2 0x4 0x3 0x3 0x3 0x3 0x5 0x3 0x4 0x4 0x4 0x7 0x4 0x5 0x5 0x5 0x8 0x5 0x6 0x6 0x6 0xa 0x5 0x7 0x7 0x7 0xc 0x6 0x8 0x8 0x8 0xd 0x7 0x9 0x9 0x9 0xf 0x7 0xa 0xa 0xa 0x11 0x8 0xb 0xb 0xb 0x13 0x9 0xc 0xc 0xc 0x15 0xa 0xd 0xd 0xd 0x18 0xb 0xe 0xe 0xe 0x1a 0xc 0xf 0xf 0xf 0x1c 0xd 0x10 0x10 0x10 0x1e 0xd 0x11 0x11 0x11 0x20 0xe 0x12 0x12 0x12 0x23 0xf 0x13 0x13 0x13 0x25 0x10 0x14 0x14 0x14 0x28 0x11 0x15 0x15 0x15 0x2a 0x12 0x16 0x16 0x16 0x2d 0x13 0x17 0x17 0x17 0x2f 0x14 0x18 0x18 0x18 0x32 0x15 0x19 0x19 0x19 0x34 0x16 0x1a 0x1a 0x1a 0x37 0x17 0x1b 0x1b 0x1b 0x3a 0x19 0x1c 0x1c 0x1c 0x3c 0x1a 0x1d 0x1d 0x1d 0x3f 0x1b 0x1e 0x1e 0x1e 0x42 0x1c 0x1f 0x1f 0x1f 0x45 0x1d 0x20 0x20 0x20 0x47 0x1e 0x21 0x21 0x21 0x4a 0x1f 0x22 0x22 0x22 0x4d 0x20 0x23 0x23 0x23 0x50 0x22 0x24 0x24 0x24 0x53 0x23 0x25 0x25 0x25 0x56 0x24 0x26 0x26 0x26 0x59 0x25 0x27 0x27 0x27 0x5c 0x26 0x28 0x28 0x28 0x5f 0x28 0x29 0x29 0x29 0x62 0x29 0x2a 0x2a 0x2a 0x65 0x2a 0x2b 0x2b 0x2b 0x68 0x2b 0x2c 0x2c 0x2c 0x6b 0x2d 0x2d 0x2d 0x2d 0x6e 0x2e 0x2e 0x2e 0x2e 0x71 0x2f 0x2f 0x2f 0x2f 0x74 0x30 0x30 0x30 0x30 0x77 0x32 0x31 0x31 0x31 0x7b 0x33 0x32 0x32 0x32 0x7e 0x34 0x33 0x33 0x33 0x81 0x36 0x34 0x34 0x34 0x84 0x37 0x35 0x35 0x35 0x88 0x38 0x36 0x36 0x36 0x8b 0x3a 0x37 0x37 0x37 0x8e 0x3b 0x38 0x38 0x38 0x92 0x3c 0x39 0x39 0x39 0x95 0x3e 0x3a 0x3a 0x3a 0x98 0x3f 0x3b 0x3b 0x3b 0x9c 0x40 0x3c 0x3c 0x3c 0x9f 0x42 0x3d 0x3d 0x3d 0xa2 0x43 0x3e 0x3e 0x3e 0xa6 0x44 0x3f 0x3f 0x3f 0xa9 0x46 0x40 0x40 0x40 0xad 0x47 0x41 0x41 0x41 0xb0 0x49 0x42 0x42 0x42 0xb4 0x4a 0x43 0x43 0x43 0xb7 0x4c 0x44 0x44 0x44 0xbb 0x4d 0x45 0x45 0x45 0xbe 0x4e 0x46 0x46 0x46 0xc2 0x50 0x47 0x47 0x47 0xc5 0x51 0x48 0x48 0x48 0xc9 0x53 0x49 0x49 0x49 0xcd 0x54 0x4a 0x4a 0x4a 0xd0 0x56 0x4b 0x4b 0x4b 0xd4 0x57 0x4c 0x4c 0x4c 0xd7 0x59 0x4d 0x4d 0x4d 0xdb 0x5a 0x4e 0x4e 0x4e 0xdf 0x5c 0x4f 0x4f 0x4f 0xe3 0x5d 0x50 0x50 0x50 0xe6 0x5f 0x51 0x51 0x51 0xea 0x60 0x52 0x52 0x52 0xee 0x62 0x53 0x53 0x53 0xf1 0x63 0x54 0x54 0x54 0xf5 0x65 0x55 0x55 0x55 0xf9 0x66 0x56 0x56 0x56 0xfd 0x68 0x57 0x57 0x57 0x101 0x69 0x58 0x58 0x58 0x104 0x6b 0x59 0x59 0x59 0x108 0x6c 0x5a 0x5a 0x5a 0x10c 0x6e 0x5b 0x5b 0x5b 0x110 0x70 0x5c 0x5c 0x5c 0x114 0x71 0x5d 0x5d 0x5d 0x118 0x73 0x5e 0x5e 0x5e 0x11b 0x74 0x5f 0x5f 0x5f 0x11f 0x76 0x60 0x60 0x60 0x123 0x77 0x61 0x61 0x61 0x127 0x79 0x62 0x62 0x62 0x12b 0x7b 0x63 0x63 0x63 0x12f 0x7c 0x64 0x64 0x64 0x133 0x7e 0x65 0x65 0x65 0x137 0x7f 0x66 0x66 0x66 0x13b 0x81 0x67 0x67 0x67 0x13f 0x83 0x68 0x68 0x68 0x143 0x84 0x69 0x69 0x69 0x147 0x86 0x6a 0x6a 0x6a 0x14b 0x88 0x6b 0x6b 0x6b 0x14f 0x89 0x6c 0x6c 0x6c 0x153 0x8b 0x6d 0x6d 0x6d 0x157 0x8c 0x6e 0x6e 0x6e 0x15b 0x8e 0x6f 0x6f 0x6f 0x15f 0x90 0x70 0x70 0x70 0x163 0x91 0x71 0x71 0x71 0x168 0x93 0x72 0x72 0x72 0x16c 0x95 0x73 0x73 0x73 0x170 0x96 0x74 0x74 0x74 0x174 0x98 0x75 0x75 0x75 0x178 0x9a 0x76 0x76 0x76 0x17c 0x9c 0x77 0x77 0x77 0x180 0x9d 0x78 0x78 0x78 0x185 0x9f 0x79 0x79 0x79 0x189 0xa1 0x7a 0x7a 0x7a 0x18d 0xa2 0x7b 0x7b 0x7b 0x191 0xa4 0x7c 0x7c 0x7c 0x195 0xa6 0x7d 0x7d 0x7d 0x19a 0xa7 0x7e 0x7e 0x7e 0x19e 0xa9 0x7f 0x7f 0x7f 0x1a2 0xab 0x80 0x80 0x80 0x1a6 0xad 0x81 0x81 0x81 0x1ab 0xae 0x82 0x82 0x82 0x1af 0xb0 0x83 0x83 0x83 0x1b3 0xb2 0x84 0x84 0x84 0x1b8 0xb4 0x85 0x85 0x85 0x1bc 0xb5 0x86 0x86 0x86 0x1c0 0xb7 0x87 0x87 0x87 0x1c5 0xb9 0x88 0x88 0x88 0x1c9 0xbb 0x89 0x89 0x89 0x1cd 0xbc 0x8a 0x8a 0x8a 0x1d1 0xbe 0x8b 0x8b 0x8b 0x1d6 0xc0 0x8c 0x8c 0x8c 0x1da 0xc2 0x8d 0x8d 0x8d 0x1de 0xc3 0x8e 0x8e 0x8e 0x1e3 0xc5 0x8f 0x8f 0x8f 0x1e7 0xc7 0x90 0x90 0x90 0x1eb 0xc9 0x91 0x91 0x91 0x1f0 0xcb 0x92 0x92 0x92 0x1f4 0xcc 0x93 0x93 0x93 0x1f8 0xce 0x94 0x94 0x94 0x1fd 0xd0 0x95 0x95 0x95 0x201 0xd2 0x96 0x96 0x96 0x206 0xd4 0x97 0x97 0x97 0x20a 0xd6 0x98 0x98 0x98 0x20e 0xd7 0x99 0x99 0x99 0x213 0xd9 0x9a 0x9a 0x9a 0x217 0xdb 0x9b 0x9b 0x9b 0x21c 0xdd 0x9c 0x9c 0x9c 0x220 0xdf 0x9d 0x9d 0x9d 0x225 0xe1 0x9e 0x9e 0x9e 0x229 0xe2 0x9f 0x9f 0x9f 0x22e 0xe4 0xa0 0xa0 0xa0 0x232 0xe6 0xa1 0xa1 0xa1 0x237 0xe8 0xa2 0xa2 0xa2 0x23b 0xea 0xa3 0xa3 0xa3 0x240 0xec 0xa4 0xa4 0xa4 0x244 0xed 0xa5 0xa5 0xa5 0x249 0xef 0xa6 0xa6 0xa6 0x24d 0xf1 0xa7 0xa7 0xa7 0x252 0xf3 0xa8 0xa8 0xa8 0x256 0xf5 0xa9 0xa9 0xa9 0x25b 0xf7 0xaa 0xaa 0xaa 0x260 0xf9 0xab 0xab 0xab 0x264 0xfb 0xac 0xac 0xac 0x269 0xfd 0xad 0xad 0xad 0x26d 0xfe 0xae 0xae 0xae 0x272 0x100 0xaf 0xaf 0xaf 0x277 0x102 0xb0 0xb0 0xb0 0x27b 0x104 0xb1 0xb1 0xb1 0x280 0x106 0xb2 0xb2 0xb2 0x284 0x108 0xb3 0xb3 0xb3 0x289 0x10a 0xb4 0xb4 0xb4 0x28e 0x10c 0xb5 0xb5 0xb5 0x292 0x10e 0xb6 0xb6 0xb6 0x297 0x110 0xb7 0xb7 0xb7 0x29c 0x112 0xb8 0xb8 0xb8 0x2a0 0x113 0xb9 0xb9 0xb9 0x2a5 0x115 0xba 0xba 0xba 0x2aa 0x117 0xbb 0xbb 0xbb 0x2ae 0x119 0xbc 0xbc 0xbc 0x2b3 0x11b 0xbd 0xbd 0xbd 0x2b8 0x11d 0xbe 0xbe 0xbe 0x2bd 0x11f 0xbf 0xbf 0xbf 0x2c1 0x121 0xc0 0xc0 0xc0 0x2c6 0x123 0xc1 0xc1 0xc1 0x2cb 0x125 0xc2 0xc2 0xc2 0x2d0 0x127 0xc3 0xc3 0xc3 0x2d4 0x129 0xc4 0xc4 0xc4 0x2d9 0x12b 0xc5 0xc5 0xc5 0x2de 0x12d 0xc6 0xc6 0xc6 0x2e3 0x12f 0xc7 0xc7 0xc7 0x2e8 0x131 0xc8 0xc8 0xc8 0x2ec 0x133 0xc9 0xc9 0xc9 0x2f1 0x135 0xca 0xca 0xca 0x2f6 0x137 0xcb 0xcb 0xcb 0x2fb 0x139 0xcc 0xcc 0xcc 0x300 0x13b 0xcd 0xcd 0xcd 0x304 0x13d 0xce 0xce 0xce 0x309 0x13f 0xcf 0xcf 0xcf 0x30e 0x141 0xd0 0xd0 0xd0 0x313 0x143 0xd1 0xd1 0xd1 0x318 0x145 0xd2 0xd2 0xd2 0x31d 0x147 0xd3 0xd3 0xd3 0x322 0x149 0xd4 0xd4 0xd4 0x327 0x14b 0xd5 0xd5 0xd5 0x32b 0x14d 0xd6 0xd6 0xd6 0x330 0x14f 0xd7 0xd7 0xd7 0x335 0x151 0xd8 0xd8 0xd8 0x33a 0x153 0xd9 0xd9 0xd9 0x33f 0x155 0xda 0xda 0xda 0x344 0x157 0xdb 0xdb 0xdb 0x349 0x159 0xdc 0xdc 0xdc 0x34e 0x15b 0xdd 0xdd 0xdd 0x353 0x15d 0xde 0xde 0xde 0x358 0x15f 0xdf 0xdf 0xdf 0x35d 0x161 0xe0 0xe0 0xe0 0x362 0x163 0xe1 0xe1 0xe1 0x367 0x165 0xe2 0xe2 0xe2 0x36c 0x167 0xe3 0xe3 0xe3 0x371 0x169 0xe4 0xe4 0xe4 0x376 0x16b 0xe5 0xe5 0xe5 0x37b 0x16d 0xe6 0xe6 0xe6 0x380 0x170 0xe7 0xe7 0xe7 0x385 0x172 0xe8 0xe8 0xe8 0x38a 0x174 0xe9 0xe9 0xe9 0x38f 0x176 0xea 0xea 0xea 0x394 0x178 0xeb 0xeb 0xeb 0x399 0x17a 0xec 0xec 0xec 0x39e 0x17c 0xed 0xed 0xed 0x3a3 0x17e 0xee 0xee 0xee 0x3a8 0x180 0xef 0xef 0xef 0x3ad 0x182 0xf0 0xf0 0xf0 0x3b2 0x184 0xf1 0xf1 0xf1 0x3b7 0x186 0xf2 0xf2 0xf2 0x3bc 0x189 0xf3 0xf3 0xf3 0x3c1 0x18b 0xf4 0xf4 0xf4 0x3c7 0x18d 0xf5 0xf5 0xf5 0x3cc 0x18f 0xf6 0xf6 0xf6 0x3d1 0x191 0xf7 0xf7 0xf7 0x3d6 0x193 0xf8 0xf8 0xf8 0x3db 0x195 0xf9 0xf9 0xf9 0x3e0 0x197 0xfa 0xfa 0xfa 0x3e5 0x199 0xfb 0xfb 0xfb 0x3ea 0x19b 0xfc 0xfc 0xfc 0x3f0 0x19e 0xfd 0xfd 0xfd 0x3f5 0x1a0 0xfe 0xfe 0xfe 0x3fa 0x1a2 0xff 0xff 0xff 0x3ff 0x1a4>; + samsung,hbm_candela_map_table_revG = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x2 0x1aa 0x2 0x102 0x102 0x4 0x1ac 0x3 0x103 0x103 0x6 0x1ae 0x4 0x104 0x104 0x8 0x1b0 0x5 0x105 0x105 0xa 0x1b1 0x6 0x106 0x106 0xc 0x1b3 0x7 0x107 0x107 0xe 0x1b4 0x8 0x108 0x108 0x10 0x1b6 0x9 0x109 0x109 0x12 0x1b8 0xa 0x10a 0x10a 0x14 0x1b9 0xb 0x10b 0x10b 0x16 0x1bb 0xc 0x10c 0x10c 0x18 0x1bc 0xd 0x10d 0x10d 0x1a 0x1be 0xe 0x10e 0x10e 0x1c 0x1c0 0xf 0x10f 0x10f 0x1e 0x1c2 0x10 0x110 0x110 0x20 0x1c3 0x11 0x111 0x111 0x22 0x1c5 0x12 0x112 0x112 0x24 0x1c6 0x13 0x113 0x113 0x25 0x1c8 0x14 0x114 0x114 0x26 0x1ca 0x15 0x115 0x115 0x27 0x1cb 0x16 0x116 0x116 0x28 0x1cd 0x17 0x117 0x117 0x29 0x1ce 0x18 0x118 0x118 0x2a 0x1d0 0x19 0x119 0x119 0x2b 0x1d2 0x1a 0x11a 0x11a 0x2c 0x1d4 0x1b 0x11b 0x11b 0x2d 0x1d5 0x1c 0x11c 0x11c 0x2e 0x1d7 0x1d 0x11d 0x11d 0x2f 0x1d8 0x1e 0x11e 0x11e 0x30 0x1da 0x1f 0x11f 0x11f 0x31 0x1dc 0x20 0x120 0x120 0x32 0x1dd 0x21 0x121 0x121 0x33 0x1df 0x22 0x122 0x122 0x34 0x1e0 0x23 0x123 0x123 0x35 0x1e2 0x24 0x124 0x124 0x36 0x1e4 0x25 0x125 0x125 0x37 0x1e5 0x26 0x126 0x126 0x38 0x1e7 0x27 0x127 0x127 0x39 0x1e8 0x28 0x128 0x128 0x3a 0x1ea 0x29 0x129 0x129 0x3b 0x1ec 0x2a 0x12a 0x12a 0x3c 0x1ee 0x2b 0x12b 0x12b 0x3d 0x1ef 0x2c 0x12c 0x12c 0x3e 0x1f1 0x2d 0x12d 0x12d 0x3f 0x1f2 0x2e 0x12e 0x12e 0x40 0x1f4 0x2f 0x12f 0x12f 0x41 0x1f6 0x30 0x130 0x130 0x42 0x1f7 0x31 0x131 0x131 0x43 0x1f9 0x32 0x132 0x132 0x44 0x1fa 0x33 0x133 0x133 0x45 0x1fc 0x34 0x134 0x134 0x46 0x1fe 0x35 0x135 0x135 0x47 0x200 0x36 0x136 0x136 0x48 0x201 0x37 0x137 0x137 0x49 0x203 0x38 0x138 0x138 0x4a 0x204 0x39 0x139 0x139 0x4b 0x206 0x3a 0x13a 0x13a 0x4c 0x208 0x3b 0x13b 0x13b 0x4d 0x209 0x3c 0x13c 0x13c 0x4e 0x20b 0x3d 0x13d 0x13d 0x4f 0x20c 0x3e 0x13e 0x13e 0x50 0x20e 0x3f 0x13f 0x13f 0x51 0x210 0x40 0x140 0x140 0x52 0x211 0x41 0x141 0x141 0x53 0x213 0x42 0x142 0x142 0x54 0x215 0x43 0x143 0x143 0x55 0x216 0x44 0x144 0x144 0x56 0x218 0x45 0x145 0x145 0x57 0x21a 0x46 0x146 0x146 0x58 0x21b 0x47 0x147 0x147 0x59 0x21d 0x48 0x148 0x148 0x5a 0x21e 0x49 0x149 0x149 0x5b 0x220 0x4a 0x14a 0x14a 0x5c 0x222 0x4b 0x14b 0x14b 0x5d 0x223 0x4c 0x14c 0x14c 0x5f 0x225 0x4d 0x14d 0x14d 0x61 0x226 0x4e 0x14e 0x14e 0x63 0x228 0x4f 0x14f 0x14f 0x65 0x22a 0x50 0x150 0x150 0x67 0x22b 0x51 0x151 0x151 0x69 0x22d 0x52 0x152 0x152 0x6b 0x22f 0x53 0x153 0x153 0x6d 0x230 0x54 0x154 0x154 0x6f 0x232 0x55 0x155 0x155 0x71 0x234 0x56 0x156 0x156 0x73 0x235 0x57 0x157 0x157 0x75 0x237 0x58 0x158 0x158 0x77 0x238 0x59 0x159 0x159 0x79 0x23a 0x5a 0x15a 0x15a 0x7b 0x23c 0x5b 0x15b 0x15b 0x7d 0x23d 0x5c 0x15c 0x15c 0x7f 0x23f 0x5d 0x15d 0x15d 0x81 0x241 0x5e 0x15e 0x15e 0x83 0x242 0x5f 0x15f 0x15f 0x85 0x244 0x60 0x160 0x160 0x87 0x246 0x61 0x161 0x161 0x89 0x247 0x62 0x162 0x162 0x8b 0x249 0x63 0x163 0x163 0x8d 0x24a 0x64 0x164 0x164 0x8f 0x24c 0x65 0x165 0x165 0x91 0x24e 0x66 0x166 0x166 0x93 0x24f 0x67 0x167 0x167 0x95 0x251 0x68 0x168 0x168 0x97 0x253 0x69 0x169 0x169 0x9a 0x254 0x6a 0x16a 0x16a 0x9d 0x256 0x6b 0x16b 0x16b 0xa0 0x257 0x6c 0x16c 0x16c 0xa3 0x259 0x6d 0x16d 0x16d 0xa6 0x25b 0x6e 0x16e 0x16e 0xa8 0x25c 0x6f 0x16f 0x16f 0xab 0x25e 0x70 0x170 0x170 0xae 0x260 0x71 0x171 0x171 0xb1 0x261 0x72 0x172 0x172 0xb4 0x263 0x73 0x173 0x173 0xb7 0x264 0x74 0x174 0x174 0xba 0x266 0x75 0x175 0x175 0xbd 0x268 0x76 0x176 0x176 0xc0 0x269 0x77 0x177 0x177 0xc3 0x26b 0x78 0x178 0x178 0xc6 0x26d 0x79 0x179 0x179 0xc9 0x26e 0x7a 0x17a 0x17a 0xcc 0x270 0x7b 0x17b 0x17b 0xcf 0x272 0x7c 0x17c 0x17c 0xd2 0x273 0x7d 0x17d 0x17d 0xd5 0x275 0x7e 0x17e 0x17e 0xd8 0x276 0x7f 0x17f 0x17f 0xdb 0x278 0x80 0x180 0x180 0xde 0x27a 0x81 0x181 0x181 0xe1 0x27b 0x82 0x182 0x182 0xe4 0x27d 0x83 0x183 0x183 0xe7 0x27f 0x84 0x184 0x184 0xea 0x280 0x85 0x185 0x185 0xed 0x282 0x86 0x186 0x186 0xf0 0x283 0x87 0x187 0x187 0xf3 0x285 0x88 0x188 0x188 0xf6 0x287 0x89 0x189 0x189 0xf9 0x288 0x8a 0x18a 0x18a 0xfc 0x28a 0x8b 0x18b 0x18b 0xff 0x28c 0x8c 0x18c 0x18c 0x102 0x28d 0x8d 0x18d 0x18d 0x105 0x28f 0x8e 0x18e 0x18e 0x108 0x291 0x8f 0x18f 0x18f 0x10b 0x292 0x90 0x190 0x190 0x10e 0x294 0x91 0x191 0x191 0x111 0x295 0x92 0x192 0x192 0x114 0x297 0x93 0x193 0x193 0x117 0x299 0x94 0x194 0x194 0x11a 0x29a 0x95 0x195 0x195 0x11d 0x29c 0x96 0x196 0x196 0x120 0x29e 0x97 0x197 0x197 0x123 0x29f 0x98 0x198 0x198 0x126 0x2a1 0x99 0x199 0x199 0x129 0x2a3 0x9a 0x19a 0x19a 0x12c 0x2a4 0x9b 0x19b 0x19b 0x12f 0x2a6 0x9c 0x19c 0x19c 0x132 0x2a7 0x9d 0x19d 0x19d 0x135 0x2a9 0x9e 0x19e 0x19e 0x138 0x2ab 0x9f 0x19f 0x19f 0x13b 0x2ac 0xa0 0x1a0 0x1a0 0x13e 0x2ae 0xa1 0x1a1 0x1a1 0x141 0x2af 0xa2 0x1a2 0x1a2 0x144 0x2b1 0xa3 0x1a3 0x1a3 0x147 0x2b3 0xa4 0x1a4 0x1a4 0x14a 0x2b4 0xa5 0x1a5 0x1a5 0x14d 0x2b6 0xa6 0x1a6 0x1a6 0x150 0x2b8 0xa7 0x1a7 0x1a7 0x153 0x2b9 0xa8 0x1a8 0x1a8 0x156 0x2bb 0xa9 0x1a9 0x1a9 0x159 0x2bd 0xaa 0x1aa 0x1aa 0x15c 0x2be 0xab 0x1ab 0x1ab 0x15f 0x2c0 0xac 0x1ac 0x1ac 0x162 0x2c1 0xad 0x1ad 0x1ad 0x165 0x2c3 0xae 0x1ae 0x1ae 0x168 0x2c5 0xaf 0x1af 0x1af 0x16b 0x2c6 0xb0 0x1b0 0x1b0 0x16e 0x2c8 0xb1 0x1b1 0x1b1 0x171 0x2c9 0xb2 0x1b2 0x1b2 0x174 0x2cb 0xb3 0x1b3 0x1b3 0x177 0x2cd 0xb4 0x1b4 0x1b4 0x17a 0x2cf 0xb5 0x1b5 0x1b5 0x17d 0x2d0 0xb6 0x1b6 0x1b6 0x180 0x2d2 0xb7 0x1b7 0x1b7 0x183 0x2d3 0xb8 0x1b8 0x1b8 0x186 0x2d5 0xb9 0x1b9 0x1b9 0x189 0x2d7 0xba 0x1ba 0x1ba 0x18c 0x2d8 0xbb 0x1bb 0x1bb 0x18f 0x2da 0xbc 0x1bc 0x1bc 0x192 0x2db 0xbd 0x1bd 0x1bd 0x195 0x2dd 0xbe 0x1be 0x1be 0x198 0x2df 0xbf 0x1bf 0x1bf 0x19b 0x2e1 0xc0 0x1c0 0x1c0 0x19e 0x2e2 0xc1 0x1c1 0x1c1 0x1a1 0x2e4 0xc2 0x1c2 0x1c2 0x1a4 0x2e5 0xc3 0x1c3 0x1c3 0x1a7 0x2e7 0xc4 0x1c4 0x1c4 0x1aa 0x2e9 0xc5 0x1c5 0x1c5 0x1ad 0x2ea 0xc6 0x1c6 0x1c6 0x1b0 0x2ec 0xc7 0x1c7 0x1c7 0x1b3 0x2ed 0xc8 0x1c8 0x1c8 0x1b6 0x2ef 0xc9 0x1c9 0x1c9 0x1b9 0x2f1 0xca 0x1ca 0x1ca 0x1bc 0x2f2 0xcb 0x1cb 0x1cb 0x1bf 0x2f4 0xcc 0x1cc 0x1cc 0x1c2 0x2f5 0xcd 0x1cd 0x1cd 0x1c5 0x2f7 0xce 0x1ce 0x1ce 0x1c8 0x2f9 0xcf 0x1cf 0x1cf 0x1cb 0x2fb 0xd0 0x1d0 0x1d0 0x1ce 0x2fc 0xd1 0x1d1 0x1d1 0x1d1 0x2fe 0xd2 0x1d2 0x1d2 0x1d4 0x2ff 0xd3 0x1d3 0x1d3 0x1d7 0x301 0xd4 0x1d4 0x1d4 0x1da 0x303 0xd5 0x1d5 0x1d5 0x1dd 0x304 0xd6 0x1d6 0x1d6 0x1e0 0x306 0xd7 0x1d7 0x1d7 0x1e3 0x307 0xd8 0x1d8 0x1d8 0x1e6 0x309 0xd9 0x1d9 0x1d9 0x1e9 0x30b 0xda 0x1da 0x1da 0x1ec 0x30d 0xdb 0x1db 0x1db 0x1ef 0x30e 0xdc 0x1dc 0x1dc 0x1f2 0x310 0xdd 0x1dd 0x1dd 0x1f5 0x311 0xde 0x1de 0x1de 0x1f8 0x313 0xdf 0x1df 0x1df 0x1fb 0x315 0xe0 0x1e0 0x1e0 0x1fe 0x316 0xe1 0x1e1 0x1e1 0x201 0x318 0xe2 0x1e2 0x1e2 0x204 0x319 0xe3 0x1e3 0x1e3 0x207 0x31b 0xe4 0x1e4 0x1e4 0x20a 0x31d 0xe5 0x1e5 0x1e5 0x20d 0x31f 0xe6 0x1e6 0x1e6 0x210 0x320>; + samsung,hbm_candela_map_table_revA = <0x0 0x100 0x100 0x0 0x1a9 0x1 0x101 0x101 0x3 0x1aa 0x2 0x102 0x102 0x6 0x1ac 0x3 0x103 0x103 0x9 0x1ae 0x4 0x104 0x104 0xc 0x1b0 0x5 0x105 0x105 0xf 0x1b1 0x6 0x106 0x106 0x12 0x1b3 0x7 0x107 0x107 0x15 0x1b4 0x8 0x108 0x108 0x18 0x1b6 0x9 0x109 0x109 0x1b 0x1b8 0xa 0x10a 0x10a 0x1e 0x1b9 0xb 0x10b 0x10b 0x21 0x1bb 0xc 0x10c 0x10c 0x24 0x1bc 0xd 0x10d 0x10d 0x27 0x1be 0xe 0x10e 0x10e 0x2a 0x1c0 0xf 0x10f 0x10f 0x2d 0x1c2 0x10 0x110 0x110 0x30 0x1c3 0x11 0x111 0x111 0x33 0x1c5 0x12 0x112 0x112 0x36 0x1c6 0x13 0x113 0x113 0x39 0x1c8 0x14 0x114 0x114 0x3c 0x1ca 0x15 0x115 0x115 0x3f 0x1cb 0x16 0x116 0x116 0x42 0x1cd 0x17 0x117 0x117 0x45 0x1ce 0x18 0x118 0x118 0x48 0x1d0 0x19 0x119 0x119 0x4b 0x1d2 0x1a 0x11a 0x11a 0x4e 0x1d4 0x1b 0x11b 0x11b 0x51 0x1d5 0x1c 0x11c 0x11c 0x54 0x1d7 0x1d 0x11d 0x11d 0x56 0x1d8 0x1e 0x11e 0x11e 0x58 0x1da 0x1f 0x11f 0x11f 0x5a 0x1dc 0x20 0x120 0x120 0x5c 0x1dd 0x21 0x121 0x121 0x5e 0x1df 0x22 0x122 0x122 0x60 0x1e0 0x23 0x123 0x123 0x62 0x1e2 0x24 0x124 0x124 0x64 0x1e4 0x25 0x125 0x125 0x66 0x1e5 0x26 0x126 0x126 0x68 0x1e7 0x27 0x127 0x127 0x6a 0x1e8 0x28 0x128 0x128 0x6c 0x1ea 0x29 0x129 0x129 0x6e 0x1ec 0x2a 0x12a 0x12a 0x70 0x1ee 0x2b 0x12b 0x12b 0x72 0x1ef 0x2c 0x12c 0x12c 0x74 0x1f1 0x2d 0x12d 0x12d 0x76 0x1f2 0x2e 0x12e 0x12e 0x78 0x1f4 0x2f 0x12f 0x12f 0x7a 0x1f6 0x30 0x130 0x130 0x7c 0x1f7 0x31 0x131 0x131 0x7e 0x1f9 0x32 0x132 0x132 0x80 0x1fa 0x33 0x133 0x133 0x82 0x1fc 0x34 0x134 0x134 0x84 0x1fe 0x35 0x135 0x135 0x86 0x200 0x36 0x136 0x136 0x88 0x201 0x37 0x137 0x137 0x8a 0x203 0x38 0x138 0x138 0x8c 0x204 0x39 0x139 0x139 0x8e 0x206 0x3a 0x13a 0x13a 0x90 0x208 0x3b 0x13b 0x13b 0x92 0x209 0x3c 0x13c 0x13c 0x94 0x20b 0x3d 0x13d 0x13d 0x96 0x20c 0x3e 0x13e 0x13e 0x98 0x20e 0x3f 0x13f 0x13f 0x9a 0x210 0x40 0x140 0x140 0x9c 0x211 0x41 0x141 0x141 0x9e 0x213 0x42 0x142 0x142 0xa0 0x215 0x43 0x143 0x143 0xa2 0x216 0x44 0x144 0x144 0xa4 0x218 0x45 0x145 0x145 0xa6 0x21a 0x46 0x146 0x146 0xa8 0x21b 0x47 0x147 0x147 0xaa 0x21d 0x48 0x148 0x148 0xac 0x21e 0x49 0x149 0x149 0xae 0x220 0x4a 0x14a 0x14a 0xb0 0x222 0x4b 0x14b 0x14b 0xb2 0x223 0x4c 0x14c 0x14c 0xb6 0x225 0x4d 0x14d 0x14d 0xba 0x226 0x4e 0x14e 0x14e 0xbe 0x228 0x4f 0x14f 0x14f 0xc2 0x22a 0x50 0x150 0x150 0xc6 0x22b 0x51 0x151 0x151 0xcb 0x22d 0x52 0x152 0x152 0xd0 0x22f 0x53 0x153 0x153 0xd5 0x230 0x54 0x154 0x154 0xda 0x232 0x55 0x155 0x155 0xdf 0x234 0x56 0x156 0x156 0xe4 0x235 0x57 0x157 0x157 0xe9 0x237 0x58 0x158 0x158 0xee 0x238 0x59 0x159 0x159 0xf3 0x23a 0x5a 0x15a 0x15a 0xf8 0x23c 0x5b 0x15b 0x15b 0xfd 0x23d 0x5c 0x15c 0x15c 0x102 0x23f 0x5d 0x15d 0x15d 0x107 0x241 0x5e 0x15e 0x15e 0x10c 0x242 0x5f 0x15f 0x15f 0x111 0x244 0x60 0x160 0x160 0x116 0x246 0x61 0x161 0x161 0x11b 0x247 0x62 0x162 0x162 0x120 0x249 0x63 0x163 0x163 0x125 0x24a 0x64 0x164 0x164 0x12a 0x24c 0x65 0x165 0x165 0x12f 0x24e 0x66 0x166 0x166 0x134 0x24f 0x67 0x167 0x167 0x139 0x251 0x68 0x168 0x168 0x13e 0x253 0x69 0x169 0x169 0x143 0x254 0x6a 0x16a 0x16a 0x148 0x256 0x6b 0x16b 0x16b 0x14d 0x257 0x6c 0x16c 0x16c 0x152 0x259 0x6d 0x16d 0x16d 0x157 0x25b 0x6e 0x16e 0x16e 0x15c 0x25c 0x6f 0x16f 0x16f 0x161 0x25e 0x70 0x170 0x170 0x166 0x260 0x71 0x171 0x171 0x16b 0x261 0x72 0x172 0x172 0x170 0x263 0x73 0x173 0x173 0x175 0x264 0x74 0x174 0x174 0x17a 0x266 0x75 0x175 0x175 0x17f 0x268 0x76 0x176 0x176 0x184 0x269 0x77 0x177 0x177 0x189 0x26b 0x78 0x178 0x178 0x18e 0x26d 0x79 0x179 0x179 0x193 0x26e 0x7a 0x17a 0x17a 0x198 0x270 0x7b 0x17b 0x17b 0x19d 0x272 0x7c 0x17c 0x17c 0x1a2 0x273 0x7d 0x17d 0x17d 0x1a7 0x275 0x7e 0x17e 0x17e 0x1ac 0x276 0x7f 0x17f 0x17f 0x1b1 0x278 0x80 0x180 0x180 0x1b6 0x27a 0x81 0x181 0x181 0x1bb 0x27b 0x82 0x182 0x182 0x1c0 0x27d 0x83 0x183 0x183 0x1c5 0x27f 0x84 0x184 0x184 0x1ca 0x280 0x85 0x185 0x185 0x1cf 0x282 0x86 0x186 0x186 0x1d4 0x283 0x87 0x187 0x187 0x1d9 0x285 0x88 0x188 0x188 0x1de 0x287 0x89 0x189 0x189 0x1e3 0x288 0x8a 0x18a 0x18a 0x1e8 0x28a 0x8b 0x18b 0x18b 0x1ed 0x28c 0x8c 0x18c 0x18c 0x1f2 0x28d 0x8d 0x18d 0x18d 0x1f7 0x28f 0x8e 0x18e 0x18e 0x1fc 0x291 0x8f 0x18f 0x18f 0x201 0x292 0x90 0x190 0x190 0x206 0x294 0x91 0x191 0x191 0x20b 0x295 0x92 0x192 0x192 0x210 0x297 0x93 0x193 0x193 0x215 0x299 0x94 0x194 0x194 0x21a 0x29a 0x95 0x195 0x195 0x21f 0x29c 0x96 0x196 0x196 0x224 0x29e 0x97 0x197 0x197 0x229 0x29f 0x98 0x198 0x198 0x22e 0x2a1 0x99 0x199 0x199 0x233 0x2a3 0x9a 0x19a 0x19a 0x238 0x2a4 0x9b 0x19b 0x19b 0x23d 0x2a6 0x9c 0x19c 0x19c 0x242 0x2a7 0x9d 0x19d 0x19d 0x247 0x2a9 0x9e 0x19e 0x19e 0x24d 0x2ab 0x9f 0x19f 0x19f 0x253 0x2ac 0xa0 0x1a0 0x1a0 0x259 0x2ae 0xa1 0x1a1 0x1a1 0x25f 0x2af 0xa2 0x1a2 0x1a2 0x265 0x2b1 0xa3 0x1a3 0x1a3 0x26b 0x2b3 0xa4 0x1a4 0x1a4 0x271 0x2b4 0xa5 0x1a5 0x1a5 0x277 0x2b6 0xa6 0x1a6 0x1a6 0x27d 0x2b8 0xa7 0x1a7 0x1a7 0x283 0x2b9 0xa8 0x1a8 0x1a8 0x289 0x2bb 0xa9 0x1a9 0x1a9 0x28f 0x2bd 0xaa 0x1aa 0x1aa 0x295 0x2be 0xab 0x1ab 0x1ab 0x29b 0x2c0 0xac 0x1ac 0x1ac 0x2a1 0x2c1 0xad 0x1ad 0x1ad 0x2a7 0x2c3 0xae 0x1ae 0x1ae 0x2ad 0x2c5 0xaf 0x1af 0x1af 0x2b3 0x2c6 0xb0 0x1b0 0x1b0 0x2b9 0x2c8 0xb1 0x1b1 0x1b1 0x2bf 0x2c9 0xb2 0x1b2 0x1b2 0x2c5 0x2cb 0xb3 0x1b3 0x1b3 0x2cb 0x2cd 0xb4 0x1b4 0x1b4 0x2d1 0x2cf 0xb5 0x1b5 0x1b5 0x2d7 0x2d0 0xb6 0x1b6 0x1b6 0x2dd 0x2d2 0xb7 0x1b7 0x1b7 0x2e3 0x2d3 0xb8 0x1b8 0x1b8 0x2e9 0x2d5 0xb9 0x1b9 0x1b9 0x2ef 0x2d7 0xba 0x1ba 0x1ba 0x2f5 0x2d8 0xbb 0x1bb 0x1bb 0x2fb 0x2da 0xbc 0x1bc 0x1bc 0x301 0x2db 0xbd 0x1bd 0x1bd 0x307 0x2dd 0xbe 0x1be 0x1be 0x30d 0x2df 0xbf 0x1bf 0x1bf 0x313 0x2e1 0xc0 0x1c0 0x1c0 0x319 0x2e2 0xc1 0x1c1 0x1c1 0x31f 0x2e4 0xc2 0x1c2 0x1c2 0x325 0x2e5 0xc3 0x1c3 0x1c3 0x32b 0x2e7 0xc4 0x1c4 0x1c4 0x331 0x2e9 0xc5 0x1c5 0x1c5 0x337 0x2ea 0xc6 0x1c6 0x1c6 0x33d 0x2ec 0xc7 0x1c7 0x1c7 0x343 0x2ed 0xc8 0x1c8 0x1c8 0x349 0x2ef 0xc9 0x1c9 0x1c9 0x34f 0x2f1 0xca 0x1ca 0x1ca 0x355 0x2f2 0xcb 0x1cb 0x1cb 0x35b 0x2f4 0xcc 0x1cc 0x1cc 0x361 0x2f5 0xcd 0x1cd 0x1cd 0x367 0x2f7 0xce 0x1ce 0x1ce 0x36d 0x2f9 0xcf 0x1cf 0x1cf 0x373 0x2fb 0xd0 0x1d0 0x1d0 0x379 0x2fc 0xd1 0x1d1 0x1d1 0x37f 0x2fe 0xd2 0x1d2 0x1d2 0x385 0x2ff 0xd3 0x1d3 0x1d3 0x38b 0x301 0xd4 0x1d4 0x1d4 0x391 0x303 0xd5 0x1d5 0x1d5 0x397 0x304 0xd6 0x1d6 0x1d6 0x39d 0x306 0xd7 0x1d7 0x1d7 0x3a3 0x307 0xd8 0x1d8 0x1d8 0x3a9 0x309 0xd9 0x1d9 0x1d9 0x3af 0x30b 0xda 0x1da 0x1da 0x3b5 0x30d 0xdb 0x1db 0x1db 0x3bb 0x30e 0xdc 0x1dc 0x1dc 0x3c1 0x310 0xdd 0x1dd 0x1dd 0x3c7 0x311 0xde 0x1de 0x1de 0x3cd 0x313 0xdf 0x1df 0x1df 0x3d3 0x315 0xe0 0x1e0 0x1e0 0x3d9 0x316 0xe1 0x1e1 0x1e1 0x3df 0x318 0xe2 0x1e2 0x1e2 0x3e5 0x319 0xe3 0x1e3 0x1e3 0x3eb 0x31b 0xe4 0x1e4 0x1e4 0x3f1 0x31d 0xe5 0x1e5 0x1e5 0x3f7 0x31f 0xe6 0x1e6 0x1e6 0x3ff 0x320>; + samsung,aod_candela_map_table_revA = <0x0 0x0 0xb 0x1b 0x2 0x1 0xc 0x1f 0x1a 0xa 0x2 0x20 0x36 0x19 0x1e 0x3 0x37 0xff 0x18 0x3c>; + samsung,support_dynamic_mipi_clk; + samsung,ffc_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 2e c5 29 00 00 00 00 00 03 c5 36 41 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,ffc_tx_cmds_revC = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 33 43 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,ffc_tx_cmds_revD = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 fc 5a 5a 29 00 00 00 00 00 04 b0 00 2a c5 29 00 00 00 00 00 05 c5 0d 10 80 45 29 00 00 00 00 00 04 b0 00 3e c5 29 00 00 00 00 00 03 c5 32 b1 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 fc a5 a5 29 00 00 00 00 00 03 f0 a5 a5]; + samsung,dyn_mipi_clk_ffc_cmds_revA = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53641 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c535a8 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x2ec52900 0x0 0x3c53741>; + samsung,dyn_mipi_clk_ffc_cmds_revC = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53343 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b2 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53435>; + samsung,dyn_mipi_clk_ffc_cmds_revD = <0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c532b1 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c53222 0x29000000 0x4b0 0x2ac529 0x0 0x5c50d 0x10804529 0x0 0x4b000 0x3ec52900 0x0 0x3c533a0>; + samsung,dynamic_mipi_clk_timing_table = <0x65fbc9c0 0x671db480 0x6422c400>; + samsung,dynamic_mipi_clk_sel_table = <0x1 0x1 0x0 0x0 0x0 0x1 0x2 0x0 0x0 0x2 0x1 0x3 0x0 0x0 0x2 0x1 0x4 0x0 0x0 0x1 0x2 0xb 0x2942 0x29a2 0x0 0x2 0xb 0x29a3 0x29e8 0x1 0x2 0xb 0x29e9 0x2a56 0x0 0x2 0xc 0x25be 0x26d2 0x0 0x2 0xd 0x48a 0x54d 0x0 0x2 0xd 0x54e 0x593 0x1 0x2 0xd 0x594 0x5e9 0x0 0x2 0xe 0x601 0x661 0x0 0x2 0xe 0x662 0x6a7 0x1 0x2 0xe 0x6a8 0x6ca 0x0 0x2 0xf 0x1105 0x116a 0x0 0x2 0x11 0x8bd 0x8e6 0x0 0x2 0x11 0x8e7 0x92c 0x1 0x2 0x11 0x92d 0xa03 0x0 0x2 0x12 0xb79 0xb86 0x1 0x2 0x12 0xb87 0xb98 0x2 0x2 0x12 0xb99 0xc10 0x0 0x3 0x5b 0x0 0xd9 0x0 0x3 0x5b 0xda 0x165 0x1 0x3 0x5b 0x166 0x257 0x0 0x3 0x5c 0x258 0x26a 0x1 0x3 0x5c 0x26b 0x4a7 0x0 0x3 0x5c 0x4a8 0x4af 0x1 0x3 0x5d 0x4b0 0x64f 0x0 0x3 0x5d 0x650 0x6db 0x1 0x3 0x5d 0x6dc 0x79d 0x0 0x3 0x5e 0x79e 0x877 0x0 0x3 0x5e 0x878 0x903 0x1 0x3 0x5e 0x904 0x95f 0x0 0x3 0x5f 0x960 0xa59 0x0 0x3 0x61 0xabe 0xb29 0x0 0x3 0x61 0xb2a 0xbb5 0x1 0x3 0x61 0xbb6 0xd79 0x0 0x3 0x62 0xd7a 0xdac 0x1 0x3 0x62 0xdad 0xdd1 0x2 0x3 0x62 0xdd2 0xed7 0x0 0x3 0x66 0x1392 0x143b 0x0 0x3 0x67 0x143c 0x149f 0x0 0x3 0x68 0x14a0 0x1503 0x0 0x3 0x6b 0x1662 0x16d9 0x0 0x3 0x6c 0x16da 0x16f2 0x2 0x3 0x6c 0x16f3 0x176f 0x0 0x3 0x6d 0x1770 0x1805 0x0 0x3 0x6e 0x1806 0x1808 0x2 0x3 0x6e 0x1809 0x1931 0x0 0x3 0x6f 0x1932 0x1984 0x1 0x3 0x6f 0x1985 0x19c7 0x0 0x3 0x73 0x1f68 0x1f7a 0x1 0x3 0x73 0x1f7b 0x21b7 0x0 0x3 0x73 0x21b8 0x21f1 0x1 0x3 0x74 0x21f2 0x2214 0x2 0x3 0x74 0x2215 0x234f 0x0 0x3 0x76 0x23fa 0x24ba 0x0 0x3 0x76 0x24bb 0x2511 0x1 0x3 0x76 0x2512 0x2546 0x2 0x3 0x76 0x2547 0x25bb 0x0 0x3 0x77 0x25bc 0x25d9 0x2 0x3 0x77 0x25da 0x2629 0x0 0x3 0x78 0x262a 0x268a 0x1 0x3 0x78 0x268b 0x268d 0x0 0x3 0x7a 0x26c0 0x283d 0x0 0x3 0x7a 0x283e 0x2877 0x1 0x3 0x7c 0x8d68 0x8dfd 0x0 0x3 0x80 0x9376 0x9398 0x1 0x3 0x80 0x9399 0x9569 0x0 0x3 0x81 0x956a 0x96e4 0x0 0x3 0x81 0x96e5 0x96f9 0x1 0x3 0x82 0x96fa 0x98c2 0x0 0x3 0x82 0x98c3 0x994e 0x1 0x3 0x82 0x994f 0x9ae1 0x0 0x3 0x83 0x9ae2 0x9b20 0x1 0x3 0x83 0x9b21 0x9d5c 0x0 0x3 0x83 0x9d5d 0x9de8 0x1 0x3 0x83 0x9de9 0xa025 0x0 0x3 0x83 0xa026 0xa0b1 0x1 0x3 0x83 0xa0b2 0xa275 0x0 0x3 0x84 0xa276 0xa30c 0x0 0x3 0x84 0xa30d 0xa398 0x1 0x3 0x84 0xa399 0xa5d4 0x0 0x3 0x84 0xa5d5 0xa660 0x1 0x3 0x84 0xa661 0xa89d 0x0 0x3 0x84 0xa89e 0xa929 0x1 0x3 0x84 0xa92a 0xaa45 0x0 0x3 0x8a 0xd7c8 0xd813 0x0 0x3 0x8a 0xd814 0xd89f 0x1 0x3 0x8a 0xd8a0 0xdadc 0x0 0x3 0x8a 0xdadd 0xdb68 0x1 0x3 0x8a 0xdb69 0xdda3 0x0 0x3 0x9c 0x10384 0x1045d 0x0 0x3 0x9c 0x1045e 0x104e9 0x1 0x3 0x9c 0x104ea 0x10707 0x0 0x3 0xa1 0x10bea 0x10c9a 0x0 0x3 0xa1 0x10c9b 0x10ce1 0x1 0x3 0xa1 0x10ce2 0x10d26 0x2 0x3 0xa1 0x10d27 0x10d47 0x0 0x4 0x33 0x0 0x0 0x0 0x4 0x34 0x0 0x0 0x0 0x4 0x35 0x0 0x0 0x1 0x4 0x36 0x0 0x0 0x0 0x4 0x37 0x0 0x0 0x2 0x4 0x38 0x0 0x0 0x1 0x5 0x3d 0x0 0x0 0x2 0x5 0x3e 0x0 0x0 0x0 0x5 0x47 0x0 0x0 0x2>; + samsung,fd_on_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 40 40 29 01 00 00 78 00 03 f0 a5 a5]; + samsung,fd_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 0a b5 29 00 00 00 00 00 03 b5 80 40 29 01 00 00 78 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 91 01 01 29 00 00 00 00 00 02 53 27 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 3c 0d 00 00 00 00 3c 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 38 00 00 00 18 03 38 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 24 a4 29 01 00 00 00 00 02 f7 0f 29 01 00 00 11 00 03 f0 a5 a5]; + samsung,lpm_on_tx_cmds_revA = <0x29000000 0x3f0 0x5a5a2900 0x0 0x3910101 0x29010000 0x253 0x26290000 0x2 0xf70f2901 0x1100 0x3f0a5a5>; + samsung,lpm_off_tx_cmds_revG = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 04 b0 01 88 cb 29 00 00 00 00 00 08 cb 40 0d 00 00 00 00 40 29 00 00 00 00 00 04 b0 01 c0 cb 29 00 00 00 00 00 08 cb 3d 00 00 00 18 03 3d 29 00 00 00 00 00 04 b0 00 10 f2 29 00 00 00 00 00 03 f2 26 e4 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 53 20 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_off_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 04 b0 00 07 b5 29 00 00 00 00 00 04 b5 00 00 00 29 00 00 00 00 00 03 91 02 01 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + samsung,lpm_60nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 24]; + samsung,lpm_30nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 25]; + samsung,lpm_10nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 26]; + samsung,lpm_2nit_tx_cmds_revA = [29 00 00 00 00 00 02 53 27]; + samsung,lpm_brightnes_tx_cmds_revA = [29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 02 53 26 29 00 00 00 00 00 02 f7 0f 29 01 00 00 00 00 03 f0 a5 a5]; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xe>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + qcom,platform-te-gpio = <0xffffffff 0xa 0x0>; + samsung,ub-con-det = <0xffffffff 0x5 0x0>; + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-check-mode = "irq_check"; + qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; + samsung,esd-irq-gpio1 = <0xffffffff 0xb 0x0>; + phandle = <0xe>; + + qcom,mdss-dsi-display-timings { + + fhd90 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0xf>; + qcom,mdss-dsi-panel-framerate = <0x5a>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x2590>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 1e 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 54 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 03 60 08 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 5a 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + + fhd60 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x960>; + qcom,mdss-dsi-h-pulse-width = <0x54>; + qcom,mdss-dsi-h-back-porch = <0x58>; + qcom,mdss-dsi-h-front-porch = <0x50>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x2>; + qcom,mdss-dsi-v-back-porch = <0x2>; + qcom,mdss-dsi-v-front-porch = <0x10>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + samsung,mdss-dsi-sot-hs-mode; + qcom,mdss-mdp-transfer-time-us = <0x3dfa>; + qcom,mdss-dsi-panel-clockrate = <0x65fbc9c0>; + qcom,mdss-dsi-panel-phy-timings = <0x360f0e 0x2d2a0f0f 0xd020400>; + qcom,mdss-dsi-t-clk-pre = <0x2f>; + qcom,mdss-dsi-t-clk-post = <0x12>; + qcom,mdss-dsi-on-command = [05 01 00 00 1e 00 02 11 00 29 00 00 00 00 00 03 f0 5a 5a 29 00 00 00 00 00 03 9f a5 a5 29 00 00 00 00 00 2a f2 00 05 0e 58 54 00 0c 00 04 30 b8 30 b8 0c 04 bc 26 e8 0c 00 04 10 00 10 26 a8 10 00 10 10 34 10 00 40 30 c8 00 c8 00 00 ce 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 02 35 00 29 00 00 00 00 00 05 2a 00 00 04 37 29 00 00 00 00 00 05 2b 00 00 09 5f 29 00 00 00 00 00 0a c2 1b 41 b0 0e 00 3c 5a 00 00 29 00 00 00 00 00 02 e5 15 29 00 00 00 00 00 04 ed 44 4c 20 29 00 00 00 00 00 03 cc 5c 51 29 00 00 00 00 00 04 b0 00 27 f2 29 00 00 00 00 00 02 f2 00 29 00 00 00 00 00 04 b0 00 92 63 29 00 00 00 00 00 02 63 04 29 00 00 00 00 00 03 60 00 00 29 00 00 00 00 00 02 f7 0f 29 00 00 00 00 00 03 9f 5a 5a 29 01 00 00 5a 00 03 f0 a5 a5]; + qcom,mdss-dsi-off-command = [29 00 00 00 00 00 03 9f a5 a5 05 01 00 00 14 00 02 28 00 05 01 00 00 78 00 02 10 00 29 01 00 00 00 00 03 9f 5a 5a]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + + qcom,panel-supply-entries { + #address-cells = <0x1>; + #size-cells = <0x0>; + + qcom,panel-supply-entry@0 { + reg = <0x0>; + qcom,supply-name = "vci"; + qcom,supply-min-voltage = <0x2dc6c0>; + qcom,supply-max-voltage = <0x2dc6c0>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x0>; + }; + + qcom,panel-supply-entry@1 { + reg = <0x1>; + qcom,supply-name = "vddi"; + qcom,supply-min-voltage = <0x1b7740>; + qcom,supply-max-voltage = <0x1b7740>; + qcom,supply-enable-load = <0x186a0>; + qcom,supply-disable-load = <0x64>; + qcom,supply-pre-on-sleep = <0x0>; + qcom,supply-post-on-sleep = <0x0>; + qcom,supply-pre-off-sleep = <0x2>; + }; + }; + }; + }; + }; + + fragment@86 { + target = <0xffffffff>; + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_PBA_BOOTING_FHD"; + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,mdss-dsi-bpp = <0x18>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0x0>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + qcom,mdss-dsi-bl-min-level = <0x0>; + qcom,mdss-dsi-bl-max-level = <0x639c>; + qcom,mdss-brightness-max-level = <0x639c>; + qcom,mdss-dsi-interleave-mode = <0x0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-pixel-packing = "loose"; + qcom,mdss-dsi-virtual-channel-id = <0x0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-stream = <0x0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-pan-physical-width-dimension = <0x3c>; + qcom,mdss-pan-physical-height-dimension = <0x6a>; + qcom,mdss-dsi-panel-mode-gpio-state = "invalid"; + qcom,mdss-dsi-reset-sequence = <0x0 0xa 0x1 0xa>; + qcom,adjust-timer-wakeup-ms = <0x1>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + samsung,candela_map_table_revA = <0x0 0x0 0x2 0x5 0x1 0x2 0x2 0x6 0x2 0x3 0x3 0x7 0x3 0x4 0x4 0x8 0x4 0x5 0x5 0x9 0x5 0x6 0x6 0xa 0x6 0x7 0x7 0xb 0x7 0x8 0x8 0xc 0x8 0x9 0x9 0xd 0x9 0xa 0xa 0xe 0xa 0xb 0xb 0xf 0xb 0xc 0xc 0x10 0xc 0xd 0xd 0x11 0xd 0xe 0xe 0x13 0xe 0xf 0xf 0x14 0xf 0x10 0x10 0x15 0x10 0x11 0x11 0x16 0x11 0x12 0x12 0x18 0x12 0x13 0x13 0x19 0x13 0x14 0x14 0x1b 0x14 0x15 0x15 0x1d 0x15 0x16 0x16 0x1e 0x16 0x17 0x18 0x20 0x17 0x19 0x1a 0x22 0x18 0x1b 0x1c 0x25 0x19 0x1d 0x1d 0x27 0x1a 0x1e 0x20 0x29 0x1b 0x21 0x22 0x2c 0x1c 0x23 0x24 0x2f 0x1d 0x25 0x26 0x32 0x1e 0x27 0x28 0x35 0x1f 0x29 0x2b 0x38 0x20 0x2c 0x2e 0x3c 0x21 0x2f 0x31 0x40 0x22 0x32 0x34 0x44 0x23 0x35 0x38 0x48 0x24 0x39 0x3b 0x4d 0x25 0x3c 0x3f 0x52 0x26 0x40 0x43 0x57 0x27 0x44 0x47 0x5d 0x28 0x48 0x4c 0x62 0x29 0x4d 0x50 0x69 0x2a 0x51 0x56 0x6f 0x2b 0x57 0x5b 0x77 0x2c 0x5c 0x61 0x7e 0x2d 0x62 0x68 0x86 0x2e 0x69 0x6e 0x8f 0x2f 0x6f 0x76 0x98 0x30 0x77 0x7d 0xa2 0x31 0x7e 0x85 0xac 0x32 0x86 0x8e 0xb7 0x33 0x8f 0x96 0xc3 0x34 0x97 0xa0 0xcf 0x35 0xa1 0xaa 0xdc 0x36 0xab 0xb5 0xea 0x37 0xb6 0xc1 0xf9 0x38 0xc2 0xcd 0x109 0x39 0xce 0xda 0x11a 0x3a 0xdb 0xe6 0x12c 0x3b 0xe7 0xf2 0x13c 0x3c 0xf3 0xfe 0x14d 0x3d 0xff 0xff 0x168>; + qcom,display-type = "primary"; + qcom,dsi-display-active; + qcom,dsi-ctrl-num = <0x0>; + qcom,dsi-phy-num = <0x0>; + qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; + qcom,dsi-panel = <0xf>; + qcom,platform-reset-gpio = <0xffffffff 0x8 0x0>; + phandle = <0xf>; + + qcom,mdss-dsi-display-timings { + + fhd@0 { + qcom,display-topology = <0x1 0x0 0x1>; + qcom,default-topology-index = <0x0>; + qcom,mdss-dsi-panel-width = <0x438>; + qcom,mdss-dsi-panel-height = <0x780>; + qcom,mdss-dsi-panel-framerate = <0x3c>; + qcom,mdss-dsi-h-pulse-width = <0xc>; + qcom,mdss-dsi-h-back-porch = <0x20>; + qcom,mdss-dsi-h-front-porch = <0xa4>; + qcom,mdss-dsi-h-sync-skew = <0x0>; + qcom,mdss-dsi-v-pulse-width = <0x4>; + qcom,mdss-dsi-v-back-porch = <0x3>; + qcom,mdss-dsi-v-front-porch = <0x9>; + qcom,mdss-dsi-panel-clockrate = <0x35866480>; + qcom,mdss-dsi-panel-phy-timings = <0x1e0808 0x24220808 0x8020400>; + qcom,mdss-dsi-on-command = [39 01 00 00 78 00 02 11 00]; + qcom,mdss-dsi-off-command = <0x5010000 0x24000128 0x5010000 0x78000110>; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + }; + }; + }; + + fragment@87 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_te { + + sde_te_active { + phandle = <0x9>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + + sde_te_suspend { + phandle = <0xc>; + + mux { + pins = "gpio10"; + function = "mdp_vsync"; + }; + + config { + pins = "gpio10"; + drive-strength = <0x2>; + bias-pull-down; + }; + }; + }; + + pmx_sde { + phandle = <0xcd>; + + sde_dsi_active { + phandle = <0xa>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x8>; + bias-disable = <0x0>; + }; + }; + + sde_dsi_suspend { + phandle = <0xd>; + + mux { + pins = "gpio8"; + function = "gpio"; + }; + + config { + pins = "gpio8"; + drive-strength = <0x2>; + bias-disable = <0x0>; + }; + }; + }; + }; + }; + + fragment@88 { + target = <0xffffffff>; + + __overlay__ { + + pmx_sde_ub_det { + + sde_ub_det_default { + pins = "gpio5"; + function = "normal"; + input-enable; + power-source = <0x1>; + bias-disable; + phandle = <0xb>; + }; + }; + }; + }; + + fragment@89 { + target = <0xffffffff>; + + __overlay__ { + + qcom,dsi-display@9 { + label = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + qcom,display-type = "primary"; + phandle = <0xce>; + }; + + qcom,dsi-display@10 { + label = "ss_dsi_panel_PBA_BOOTING_FHD"; + qcom,display-type = "primary"; + phandle = <0xcf>; + }; + }; + }; + + fragment@90 { + target = <0xffffffff>; + + __overlay__ { + regulator-min-microvolt = <0x2dc6c0>; + regulator-max-microvolt = <0x2dc6c0>; + regulator-boot-on; + }; + }; + + fragment@91 { + target = <0xffffffff>; + + __overlay__ { + + tsp_int { + phandle = <0x64>; + + mux { + pins = "gpio9"; + function = "gpio"; + }; + + config { + pins = "gpio9"; + input-enable; + bias-disable; + }; + }; + }; + }; + + fragment@92 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + synaptics_tcm@20 { + status = "disabled"; + }; + + atmel_mxt_ts@4a { + status = "disabled"; + }; + + touchscreen@20 { + status = "ok"; + compatible = "zinitix,zt_ts_device"; + reg = <0x20>; + pinctrl-names = "on_state", "off_state"; + pinctrl-0 = <0x64>; + pinctrl-1 = <0x64>; + avdd-supply = <0xffffffff>; + zinitix,gpio_ldo_en; + zinitix,irq_type = <0x2008>; + zinitix,x_resolution = <0x438>; + zinitix,y_resolution = <0x960>; + zinitix,page_size = <0x80>; + zinitix,irq_gpio = <0xffffffff 0x9 0x2008>; + zinitix,chip_name = "ZT7650"; + zinitix,select_lcdid = <0x801000 0x801001 0x801002>; + zinitix,firmware_name = "tsp_zinitix/zt7650_a72.bin", "tsp_zinitix/zt7650_a72.bin", "tsp_zinitix/zt7650_a72_3rd.bin"; + zinitix,spay; + zinitix,aod; + zinitix,aot; + zinitix,mis_cal_check; + support_ear_detect_mode; + support_dex_mode; + zinitix,bringup = <0x0>; + zinitix,ss_touch_num = <0x1>; + phandle = <0xd0>; + }; + + touchscreen@49 { + status = "ok"; + compatible = "stm,fts_touch"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x64>; + avdd-supply = <0xffffffff>; + stm,irq_gpio = <0xffffffff 0x9 0x2008>; + stm,max_coords = <0xfff 0xfff>; + stm,firmware_name = "tsp_stm/fts5cu56a_a72.bin"; + stm,tclm_level = <0x2>; + stm,afe_base = <0x7>; + stm,bringup = <0x0>; + stm,support_fod; + stm,enable_settings_aot; + support_ear_detect; + support_mis_calibration_test; + support_dex_mode; + support_open_short_test; + support_sram_test; + stm,ss_touch_num = <0x1>; + phandle = <0xd1>; + }; + }; + }; + + fragment@93 { + target = <0xffffffff>; + + __overlay__ { + + key_vol_up { + + key_vol_up_default { + pins = "gpio8"; + function = "normal"; + input-enable; + bias-pull-up; + power-source = <0x0>; + phandle = <0x65>; + }; + }; + }; + }; + + fragment@94 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "default"; + pinctrl-0 = <0x65>; + + vol_up { + label = "volume_up"; + gpios = <0xffffffff 0x8 0x1>; + linux,input-type = <0x1>; + linux,code = <0x73>; + debounce-interval = <0xf>; + }; + }; + }; + + fragment@95 { + target = <0xffffffff>; + + __overlay__ { + + ss_touch { + compatible = "samsung,ss_touch"; + ss_touch,numbers = <0x1>; + }; + }; + }; + + fragment@96 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x66>; + status = "okay"; + + sm5714@49 { + status = "okay"; + compatible = "siliconmitus,sm5714mfd"; + reg = <0x49>; + pinctrl-names = "default"; + pinctrl-0 = <0x67>; + sm5714,irq-gpio = <0xffffffff 0x21 0x0>; + sm5714,wakeup; + }; + }; + }; + + fragment@97 { + target = <0xffffffff>; + + __overlay__ { + pinctrl-1 = <0x68>; + status = "okay"; + + usbpd-sm5714@33 { + status = "okay"; + compatible = "sm5714-usbpd"; + reg = <0x33>; + pinctrl-names = "default"; + pinctrl-0 = <0x69>; + usbpd,usbpd_int = <0xffffffff 0x68 0x0>; + support_pd_role_swap; + + pdic-manager { + pdic,max_power = <0x1388>; + pdic_op_power = <0x9c4>; + pdic_max_voltage = <0x1770>; + pdic_max_current = <0x7d0>; + pdic,min_current = <0x1f4>; + pdic,giveback = <0x0>; + pdic,usb_com_capable = <0x1>; + pdic,no_usb_suspend = <0x1>; + source,max_voltage = <0x1388>; + source,min_voltage = <0xfa0>; + source,max_power = <0x9c4>; + }; + }; + }; + }; + + fragment@98 { + target = <0xffffffff>; + + __overlay__ { + + if_pmic_irq { + + if_pmic_irq_default { + phandle = <0x67>; + + mux { + pins = "gpio33"; + function = "gpio"; + }; + + config { + pins = "gpio33"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + + usbpd_irq { + + usbpd_irq_default { + phandle = <0x69>; + + mux { + pins = "gpio104"; + function = "gpio"; + }; + + config { + pins = "gpio104"; + drive-strength = <0x2>; + bias-disable; + input-enable; + }; + }; + }; + }; + }; + + fragment@99 { + target = <0xffffffff>; + + __overlay__ { + qcom,qusb-phy-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x15 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x47 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + qcom,qusb-phy-host-init-seq = <0x23 0x210 0x3 0x4 0x7c 0x18c 0x80 0x2c 0xa 0x184 0x19 0xb4 0x40 0x194 0x15 0x198 0x21 0x214 0x8 0x220 0x58 0x224 0x47 0x240 0x2b 0x244 0xca 0x248 0x0 0x24c 0x3 0x250 0x30 0x23c 0x22 0x210>; + }; + }; + + fragment@100 { + target = <0xffffffff>; + + __overlay__ { + + nfc_qupv3_se0_i2c_sleep { + phandle = <0x6a>; + + mux { + pins = "gpio34", "gpio35"; + function = "gpio"; + }; + + config { + pins = "gpio34", "gpio35"; + drive-strength = <0x2>; + bias-disable; + }; + }; + + nfc_clk_req_gpio { + phandle = <0x6b>; + + mux { + pins = "gpio31"; + function = "gpio"; + }; + + config { + pins = "gpio31"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_irq_gpio { + phandle = <0x6c>; + + mux { + pins = "gpio37"; + function = "gpio"; + }; + + config { + pins = "gpio37"; + drive-strength = <0x2>; + bias-pull-down; + input-enable; + }; + }; + + nfc_ven_gpio { + phandle = <0x6d>; + + mux { + pins = "gpio12"; + function = "gpio"; + }; + + config { + pins = "gpio12"; + drive-strength = <0x2>; + bias-disable; + output-high; + }; + }; + + nfc_firm_gpio { + phandle = <0x6e>; + + mux { + pins = "gpio36"; + function = "gpio"; + }; + + config { + pins = "gpio36"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + + nfc_ldo_en_gpio { + phandle = <0x6f>; + + mux { + pins = "gpio68"; + function = "gpio"; + }; + + config { + pins = "gpio68"; + drive-strength = <0x2>; + bias-disable; + output-low; + }; + }; + }; + }; + + fragment@101 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + pinctrl-1 = <0x6a>; + qcom,clk-freq-out = <0x61a80>; + + sec-nfc@27 { + compatible = "sec-nfc"; + reg = <0x27>; + interrupt-parent = <0xffffffff>; + interrupts = <0x25 0x0>; + sec-nfc,ven-gpio = <0xffffffff 0xc 0x0>; + sec-nfc,irq-gpio = <0xffffffff 0x25 0x0>; + sec-nfc,firm-gpio = <0xffffffff 0x24 0x0>; + sec-nfc,clk_req-gpio = <0xffffffff 0x1f 0x0>; + sec-nfc,pvdd-gpio = <0xffffffff 0x44 0x0>; + sec-nfc,clk_req_wake; + sec-nfc,bootloader_ver = <0x6>; + pinctrl-names = "default"; + pinctrl-0 = <0x6b 0x6c 0x6d 0x6e 0x6f>; + }; + }; + }; + + fragment@102 { + target = <0xffffffff>; + + __overlay__ { + + et7xx_rst { + + et7xx_rst { + phandle = <0x70>; + + mux { + pins = "gpio91"; + function = "gpio"; + }; + + config { + pins = "gpio91"; + driver-strength = <0x2>; + bias-pull-down; + }; + }; + }; + }; + }; + + fragment@103 { + target = <0xffffffff>; + + __overlay__ { + regulator-name = "VDD_BTP_3P3"; + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + }; + }; + + fragment@104 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + + etspi,et7xx { + compatible = "etspi,et7xx"; + reg = <0x0>; + spi-max-frequency = <0xbebc20>; + pinctrl-names = "default"; + pinctrl-0 = <0x70>; + gpio-controller; + #gpio-cells = <0x2>; + etspi-regulator = "VDD_BTP_3P3"; + etspi-sleepPin = <0xffffffff 0x5b 0x0>; + etspi-chipid = "ET713"; + etspi-modelinfo = "A725"; + etspi-position = "12.03,0.00,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; + etspi-rb = "547,-1,-1,FFFFFF"; + }; + }; + }; + + fragment@105 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@106 { + target = <0xffffffff>; + + __overlay__ { + + qcom,flash_0 { + label = "flash"; + qcom,led-name = "led:flash_0"; + qcom,max-current = <0x5dc>; + qcom,default-led-trigger = "flash0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x5dc>; + qcom,duration-ms = <0x500>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + qcom,record-current-ma = <0xe1>; + phandle = <0x71>; + }; + + qcom,torch_0 { + label = "torch"; + qcom,led-name = "led:torch_0"; + qcom,max-current = <0x1f4>; + qcom,default-led-trigger = "torch0_trigger"; + qcom,id = <0x0>; + qcom,current-ma = <0x12c>; + qcom,ires-ua = <0x30d4>; + qcom,hdrm-voltage-mv = <0x145>; + qcom,hdrm-vol-hi-lo-win-mv = <0x64>; + phandle = <0x72>; + }; + + qcom,camera-flash@0 { + cell-index = <0x0>; + compatible = "qcom,camera-flash"; + flash-source = <0x71>; + torch-source = <0x72>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x7c>; + }; + + qcom,camera-flash@1 { + cell-index = <0x1>; + compatible = "qcom,camera-flash"; + flash-source = <0x71>; + torch-source = <0x72>; + switch-source = <0xffffffff>; + status = "ok"; + phandle = <0x97>; + }; + + qcom,cam-res-mgr { + compatible = "qcom,cam-res-mgr"; + shared-gpios = <0x3f>; + pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; + status = "ok"; + pinctrl-0 = <0x73>; + pinctrl-1 = <0x74>; + }; + }; + }; + + fragment@107 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + sm5714-fled { + compatible = "siliconmitus,sm5714-fled"; + reg = <0x49>; + status = "okay"; + slave-addr = <0x92>; + flash-en-gpio = <0xffffffff 0x16 0x0>; + torch-en-gpio = <0xffffffff 0x43 0x0>; + flash-brightness = <0xf>; + preflash-brightness = <0x7>; + torch-brightness = <0x7>; + factory_current = <0x0>; + timeout = <0xff>; + }; + }; + }; + + fragment@108 { + target = <0xffffffff>; + + __overlay__ { + status = "ok"; + + qcom,ois@62 { + compatible = "qcom,ois"; + cell-index = <0x0>; + reg = <0x62>; + slave-addr = <0xc4>; + slave-id = <0x460>; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vdig"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x2ab980>; + rgltr-max-voltage = <0x2ab980>; + rgltr-load-current = <0x30d40>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x76 0x77>; + pinctrl-1 = <0x78 0x79>; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x20 0x0 0xffffffff 0x2b 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x0>; + gpio-custom1 = <0x1>; + gpio-vio = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x0 0x0 0x0>; + gpio-req-tbl-label = "MCU_RESET0", "MCU_BOOT0", "MCU_VIO"; + status = "ok"; + cam_vdig-supply = <0x7a>; + phandle = <0x7e>; + }; + }; + }; + + fragment@109 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@0 { + cell-index = <0x0>; + compatible = "qcom,cam-sensor"; + reg = <0x0>; + slave-addr = <0x34>; + csiphy-sd-index = <0x0>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x7b>; + led-flash-src = <0x7c>; + eeprom-src = <0x7d>; + ois-src = <0x7e>; + cam_vio-supply = <0x7f>; + cam_vaf-supply = <0x75>; + cam_vana-supply = <0x75>; + cam_vdig-supply = <0x80>; + cam_clk-supply = <0xffffffff>; + cam_bob-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_bob", "cam_clk"; + rgltr-cntrl-support; + pwm-switch; + rgltr-min-voltage = <0x1b7740 0x2ab980 0xf4240 0x325aa0 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x10c8e0 0x325aa0 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x1e8480 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x81 0x82>; + pinctrl-1 = <0x83 0x84>; + gpios = <0xffffffff 0xd 0x0 0xffffffff 0x1e 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x1>; + gpio-custom1 = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2>; + gpio-req-tbl-flags = <0x1 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_VANA0"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x41>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0xd2>; + }; + + qcom,cam-sensor@2 { + cell-index = <0x2>; + compatible = "qcom,cam-sensor"; + reg = <0x3>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + eeprom-src = <0x85>; + cam_vio-supply = <0x7f>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x86 0x87 0x88 0x89>; + pinctrl-1 = <0x8a 0x8b 0x8c 0x8d>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x2D { + cell-index = <0x2>; + compatible = "qcom,eeprom"; + reg = <0x2d>; + slave-addr = <0x5a>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7f>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x86 0x87 0x88 0x89>; + pinctrl-1 = <0x8a 0x8b 0x8c 0x8d>; + gpios = <0xffffffff 0xf 0x0 0xffffffff 0x1d 0x0 0xffffffff 0x41 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x0>; + cci-master = <0x1>; + status = "ok"; + clocks = <0xffffffff 0x45>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + phandle = <0x85>; + }; + }; + }; + + fragment@110 { + target = <0xffffffff>; + + __overlay__ { + + qcom,cam-sensor@1 { + cell-index = <0x1>; + compatible = "qcom,cam-sensor"; + reg = <0x1>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x8e>; + cam_vio-supply = <0x7f>; + cam_vana-supply = <0x8f>; + cam_vdig-supply = <0x90>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x91 0x92>; + pinctrl-1 = <0x93 0x94>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@8 { + cell-index = <0x8>; + compatible = "qcom,cam-sensor"; + reg = <0x8>; + slave-addr = <0x34>; + csiphy-sd-index = <0x2>; + sensor-position-roll = <0x10e>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0x0>; + eeprom-src = <0x8e>; + cam_vio-supply = <0x7f>; + cam_vana-supply = <0x8f>; + cam_vdig-supply = <0x90>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x2ab980 0x100590 0x0>; + rgltr-max-voltage = <0x1b7740 0x2c4020 0x100590 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x91 0x92>; + pinctrl-1 = <0x93 0x94>; + gpios = <0xffffffff 0x17 0x0 0xffffffff 0x15 0x0>; + gpio-reset = <0x1>; + gpio-req-tbl-num = <0x0 0x1>; + gpio-req-tbl-flags = <0x1 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x49>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,cam-sensor@3 { + cell-index = <0x3>; + compatible = "qcom,cam-sensor"; + reg = <0x2>; + slave-addr = <0x42>; + csiphy-sd-index = <0x1>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + actuator-src = <0x95>; + eeprom-src = <0x96>; + ois-src = <0x7e>; + led-flash-src = <0x97>; + cam_vio-supply = <0x7f>; + cam_vaf-supply = <0x75>; + cam_vdig-supply = <0x98>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_vdig", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x10c8e0 0x0>; + rgltr-max-voltage = <0x1b7740 0x10c8e0 0x0>; + rgltr-load-current = <0x30d40 0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0x99 0x9a 0x9b>; + pinctrl-1 = <0x9c 0x9d 0x9e>; + gpios = <0xffffffff 0xe 0x0 0xffffffff 0x2a 0x0 0xffffffff 0x40 0x0 0xffffffff 0x3f 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2", "CAM_VAF0"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x43>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x124f800>; + cam,isp = <0x0>; + cam,cal_memory = <0x2>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x1>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + gpio-vaf = <0x3>; + phandle = <0xd3>; + }; + + qcom,cam-sensor@4 { + cell-index = <0x4>; + compatible = "qcom,cam-sensor"; + reg = <0x4>; + slave-addr = <0x7e>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + led-flash-src = <0x7c>; + eeprom-src = <0x9f>; + cam_vio-supply = <0x7f>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0xa0 0xa1 0xa2 0x89>; + pinctrl-1 = <0xa3 0xa4 0xa5 0x8d>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x4a 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + }; + + qcom,eeprom@0x3F { + cell-index = <0x4>; + compatible = "qcom,eeprom"; + reg = <0x3f>; + slave-addr = <0x7e>; + i2c-freq-mode = <0x1>; + csiphy-sd-index = <0x3>; + sensor-position-roll = <0x5a>; + sensor-position-pitch = <0x0>; + sensor-position-yaw = <0xb4>; + cam_vio-supply = <0x7f>; + cam_clk-supply = <0xffffffff>; + regulator-names = "cam_vio", "cam_clk"; + rgltr-cntrl-support; + rgltr-min-voltage = <0x1b7740 0x0>; + rgltr-max-voltage = <0x1b7740 0x0>; + rgltr-load-current = <0x30d40 0x0>; + gpio-no-mux = <0x0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <0xa0 0xa1 0xa2 0x89>; + pinctrl-1 = <0xa3 0xa4 0xa5 0x8d>; + gpios = <0xffffffff 0x10 0x0 0xffffffff 0x18 0x0 0xffffffff 0x4a 0x0 0xffffffff 0x42 0x0>; + gpio-reset = <0x1>; + gpio-vana = <0x2>; + gpio-custom1 = <0x3>; + gpio-req-tbl-num = <0x0 0x1 0x2 0x3>; + gpio-req-tbl-flags = <0x1 0x0 0x0 0x0>; + gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; + sensor-mode = <0x0>; + cci-device = <0x1>; + cci-master = <0x0>; + status = "ok"; + clocks = <0xffffffff 0x47>; + clock-names = "cam_clk"; + clock-cntl-level = "turbo"; + clock-rates = <0x16e3600>; + cam,isp = <0x0>; + cam,cal_memory = <0x0>; + cam,read_version = <0x0>; + cam,core_voltage = <0x0>; + cam,upgrade = <0x0>; + cam,fw_write = <0x0>; + cam,fw_dump = <0x0>; + cam,companion_chip = <0x0>; + cam,ois = <0x0>; + cam,dual_open = <0x0>; + cam,valid = <0x1>; + phandle = <0x9f>; + }; + }; + }; + + fragment@111 { + target = <0xffffffff>; + + __overlay__ { + + qcom,actuator@0xC { + cell-index = <0x0>; + reg = <0xc>; + slave-addr = <0x18>; + compatible = "i2c_actuator"; + rgltr-cntrl-support; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x1e8480>; + cam_vio-supply = <0x7f>; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x3f 0x0>; + gpio-vaf = <0x0>; + gpio-req-tbl-num = <0x0>; + gpio-req-tbl-flags = <0x0>; + gpio-req-tbl-label = "CAM_VAF0"; + phandle = <0x7b>; + }; + + qcom,actuator2 { + cell-index = <0x2>; + compatible = "qcom,actuator"; + reg = <0x1e>; + slave-addr = <0x1e>; + cam_vio-supply = <0x7f>; + cam_vaf-supply = <0x75>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x1e8480>; + qcom,cam-power-seq-type = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x1>; + cci-master = <0x1>; + status = "ok"; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x3f 0x0>; + gpio-vaf = <0x0>; + gpio-req-tbl-num = <0x0>; + gpio-req-tbl-flags = <0x0>; + gpio-req-tbl-label = "CAM_VAF0"; + phandle = <0x95>; + }; + + qcom,eeprom@50 { + cell-index = <0x0>; + reg = <0x50>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa0>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x2>; + cam_vaf-supply = <0x75>; + cam_vio-supply = <0x7f>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x3f 0x0>; + gpio-vaf = <0x0>; + gpio-req-tbl-num = <0x0>; + gpio-req-tbl-flags = <0x0>; + gpio-req-tbl-label = "CAM_VAF0"; + phandle = <0x7d>; + }; + + qcom,eeprom@51 { + cell-index = <0x1>; + reg = <0x51>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xa2>; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x2>; + cam_vio-supply = <0x7f>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-mode = <0x0>; + sensor-position = <0x1>; + rgltr-cntrl-support; + phandle = <0x8e>; + }; + + qcom,eeprom@55 { + cell-index = <0x3>; + reg = <0x55>; + compatible = "qcom,eeprom"; + i2c-freq-mode = <0x1>; + slave-addr = <0xaa>; + sensor-mode = <0x0>; + qcom,cam-power-seq-type = "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vio"; + qcom,cam-power-seq-cfg-val = <0x1>; + qcom,cam-power-seq-delay = <0x1>; + cam_vaf-supply = <0x75>; + cam_vio-supply = <0x7f>; + regulator-names = "cam_vio"; + rgltr-min-voltage = <0x1b7740>; + rgltr-max-voltage = <0x1b7740>; + rgltr-load-current = <0x30d40>; + sensor-position = <0x0>; + rgltr-cntrl-support; + gpio-no-mux = <0x0>; + gpios = <0xffffffff 0x3f 0x0>; + gpio-vaf = <0x0>; + gpio-req-tbl-num = <0x0>; + gpio-req-tbl-flags = <0x0>; + gpio-req-tbl-label = "CAM_VAF0"; + phandle = <0x96>; + }; + }; + }; + + fragment@112 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@113 { + target = <0xffffffff>; + + __overlay__ { + + hall { + status = "okay"; + compatible = "hall"; + linux,input-type = <0x1>; + linux,code = <0x15>; + hall,gpio_flip_cover = <0xffffffff 0xa 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa6>; + }; + + certify_hall { + status = "okay"; + compatible = "certify_hall"; + linux,input-type = <0x1>; + linux,code = <0x1b>; + certify_hall,gpio_certify_cover = <0xffffffff 0x5d 0x1>; + debounce-interval = <0xf>; + pinctrl-names = "default"; + pinctrl-0 = <0xa7>; + }; + }; + }; + + fragment@114 { + target = <0xffffffff>; + + __overlay__ { + + hall { + + hall_default { + pins = "gpio10"; + function = "normal"; + output-disable; + input-enable; + bias-disable; + power-source = <0x0>; + phandle = <0xa6>; + }; + }; + }; + }; + + fragment@115 { + target = <0xffffffff>; + + __overlay__ { + + certify_hall_default { + phandle = <0xa7>; + + mux { + pins = "gpio93"; + function = "gpio"; + }; + + config { + pins = "gpio93"; + drive-strength = <0x2>; + input-enable; + bias-disable; + }; + }; + }; + }; + + fragment@116 { + target = <0xffffffff>; + + __overlay__ { + + rpmh-regulator-ldoc8 { + compatible = "qcom,rpmh-vrm-regulator"; + mboxes = <0xffffffff 0x0>; + qcom,resource-name = "ldoc8"; + qcom,regulator-type = "pmic5-ldo"; + qcom,supported-modes = <0x2 0x4>; + qcom,mode-threshold-currents = <0x0 0x1>; + + regulator-pm6150l-l8 { + regulator-name = "pm6150l_l8"; + qcom,set = <0x3>; + regulator-min-microvolt = <0x1b7740>; + regulator-max-microvolt = <0x1b7740>; + qcom,init-voltage = <0x1b7740>; + regulator-always-on; + qcom,init-mode = <0x2>; + phandle = <0xd4>; + }; + }; + + rpmh-regulator-ldoa5 { + + regulator-pm6150-l5 { + regulator-min-microvolt = <0x325aa0>; + regulator-max-microvolt = <0x325aa0>; + qcom,init-voltage = <0x325aa0>; + regulator-always-on; + phandle = <0xd5>; + }; + }; + + i2c@17 { + status = "ok"; + cell-index = <0x11>; + compatible = "i2c-gpio"; + gpios = <0xffffffff 0x33 0x0 0xffffffff 0x34 0x0>; + #i2c-gpio,delay-us = <0x2>; + #address-cells = <0x1>; + #size-cells = <0x0>; + pinctrl-names = "default"; + pinctrl-0 = <0xa8>; + phandle = <0xd6>; + + sx9360-i2c@28 { + compatible = "sx9360"; + reg = <0x28>; + pinctrl-names = "default"; + pinctrl-0 = <0xa9>; + interrupt-parent = <0xffffffff>; + interrupts = <0x4 0xc4 0x0 0x2>; + sx9360,nirq-gpio = <0xffffffff 0x5 0x1>; + sx9360,reggnrlctrl2_reg = <0x32>; + sx9360,againfreq_reg = <0x38>; + sx9360,refagainfreq_reg = <0x36>; + sx9360,gainrawfilt_reg = <0x1a>; + sx9360,refgainrawfilt_reg = <0x22>; + sx9360,proxthresh_reg = <0x22>; + sx9360,hyst_reg = <0x15>; + sx9360,regproxctrl3_reg = <0xc>; + sx9360,resolution_reg = <0xf>; + sx9360,refresolution_reg = <0xf>; + sx9360,hallic_cert_detect = <0x1>; + }; + }; + }; + }; + + fragment@117 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x6 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x22 0x25 0x2a 0x2d 0x2f 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x43 0x44 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5b 0x5e 0x73 0x74 0x76>; + }; + }; + + fragment@118 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@119 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x22 0x25 0x2a 0x2d 0x2f 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x43 0x44 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5b 0x5e 0x73 0x74 0x76>; + }; + }; + + fragment@120 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@121 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@122 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@123 { + target = <0xffffffff>; + + __overlay__ { + }; + }; + + fragment@124 { + target = <0xffffffff>; + + __overlay__ { + wakeup-disabled-gpios = <0x0 0x3 0x6 0x10 0x15 0x16 0x17 0x18 0x1a 0x1c 0x1e 0x22 0x25 0x2a 0x2d 0x2f 0x34 0x35 0x37 0x38 0x39 0x3a 0x3b 0x3e 0x3f 0x40 0x41 0x43 0x44 0x4a 0x4e 0x54 0x56 0x57 0x58 0x59 0x5b 0x5e 0x73 0x74 0x76>; + }; + }; + + fragment@125 { + target = <0xffffffff>; + + __overlay__ { + + msm_vibrator { + compatible = "vibrator"; + motor-vdd_type = <0x0>; + motor-en = <0xffffffff 0x39 0x0>; + samsung,vib_type = "COINDC"; + }; + }; + }; + + fragment@126 { + target = <0xffffffff>; + + __overlay__ { + status = "okay"; + + sm5440@63 { + status = "okay"; + compatible = "siliconmitus,sm5440"; + reg = <0x63>; + pinctrl-names = "default"; + }; + }; + }; + + fragment@127 { + target = <0xffffffff>; + + __overlay__ { + + bat_thm { + label = "bat_thm"; + reg = <0x4f>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + + chg_thm { + label = "chg_thm"; + reg = <0x4d>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + }; + }; + + fragment@128 { + target = <0xffffffff>; + + __overlay__ { + + sec-direct-charger { + status = "okay"; + compatible = "samsung,sec-direct-charger"; + charger,battery_name = "battery"; + charger,main_charger = "sm5714-charger"; + charger,direct_charger = "sm5440-charger"; + charger,dchg_min_current = <0x7d0>; + charger,dchg_temp_low_threshold = <0xb4>; + charger,dchg_temp_high_threshold = <0x1a4>; + }; + + battery { + pinctrl-names = "default"; + battery,chip_vendor = "QCOM"; + status = "okay"; + compatible = "samsung,sec-battery"; + battery,vendor = "Battery"; + battery,charger_name = "sec-direct-charger"; + battery,fuelgauge_name = "sm5714-fuelgauge"; + battery,fgsrc_switch_name = "sm5714-fuelgauge"; + battery,technology = <0x2>; + battery,batt_data_version = <0x1>; + battery,temp_adc_type = <0x1>; + battery,temp_channel_raw = <0x1>; + battery,adc_check_count = <0x5>; + battery,temp_check_type = <0x1>; + battery,chg_temp_check_type = <0x1>; + battery,thermal_source = <0x2>; + battery,chg_thermal_source = <0x2>; + battery,temp_table_adc = <0x7e4 0x941 0xada 0xcc1 0xef2 0x1188 0x1493 0x1821 0x1c49 0x20dc 0x25dc 0x2b94 0x31b1 0x3854 0x3ef2 0x4588 0x4bdd 0x51ec 0x5781 0x5c85 0x60b2 0x6456 0x675a>; + battery,temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,chg_temp_table_adc = <0x761 0x8c1 0xa5c 0xc35 0xe5d 0x10e2 0x13e6 0x1766 0x1b85 0x200c 0x2503 0x2ab1 0x30cc 0x3774 0x3e15 0x44b0 0x4b25 0x5141 0x56de 0x5bf6 0x6042 0x63fd 0x6711>; + battery,chg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,polling_time = <0xa 0x1e 0x1e 0x1e 0xe10>; + battery,cable_check_type = <0x4>; + battery,cable_source_type = <0x1>; + battery,polling_type = <0x1>; + battery,monitor_initial_count = <0x0>; + battery,battery_check_type = <0x0>; + battery,ovp_uvlo_check_type = <0x3>; + battery,temp_check_count = <0x1>; + battery,overheatlimit_threshold = <0x2bc>; + battery,overheatlimit_recovery = <0x2a8>; + battery,wire_warm_overheat_thresh = <0x1f4>; + battery,wire_normal_warm_thresh = <0x1a4>; + battery,wire_cool1_normal_thresh = <0xb4>; + battery,wire_cool2_cool1_thresh = <0x96>; + battery,wire_cool3_cool2_thresh = <0x32>; + battery,wire_cold_cool3_thresh = <0x0>; + battery,wire_warm_current = <0x6c6>; + battery,wire_cool1_current = <0xa8c>; + battery,wire_cool2_current = <0x485>; + battery,wire_cool3_current = <0x1e5>; + battery,low_temp_topoff = <0xfa>; + battery,high_temp_topoff = <0xfa>; + battery,low_temp_float = <0x111c>; + battery,high_temp_float = <0x1036>; + battery,full_check_type = <0x7>; + battery,full_check_type_2nd = <0x7>; + battery,full_check_count = <0x1>; + battery,chg_gpio_full_check = <0x0>; + battery,chg_high_temp = <0x28a>; + battery,chg_high_temp_recovery = <0x276>; + battery,chg_input_limit_current = <0x3e8>; + battery,chg_charging_limit_current = <0x578>; + battery,wpc_temp_control_source = <0x1>; + battery,wpc_high_temp = <0x17c>; + battery,wpc_high_temp_recovery = <0x168>; + battery,wpc_input_limit_current = <0x258>; + battery,wpc_charging_limit_current = <0x3e8>; + battery,wpc_temp_lcd_on_control_source = <0x1>; + battery,wpc_lcd_on_high_temp = <0x17c>; + battery,wpc_lcd_on_high_temp_rec = <0x168>; + battery,wpc_lcd_on_input_limit_current = <0x1c2>; + battery,wpc_store_high_temp = <0x168>; + battery,wpc_store_high_temp_recovery = <0x154>; + battery,wpc_store_charging_limit_current = <0x190>; + battery,wpc_store_lcd_on_high_temp = <0x168>; + battery,wpc_store_lcd_on_high_temp_rec = <0x12c>; + battery,wpc_store_lcd_on_charging_limit_current = <0x190>; + battery,sleep_mode_limit_current = <0x1f4>; + battery,wc_full_input_limit_current = <0x64>; + battery,mix_high_temp = <0x1cc>; + battery,mix_high_chg_temp = <0x1f4>; + battery,mix_high_temp_recovery = <0x1c2>; + battery,full_condition_type = <0x9>; + battery,full_condition_soc = <0x5d>; + battery,full_condition_vcell = <0x10ea>; + battery,recharge_check_count = <0x1>; + battery,recharge_condition_type = <0x4>; + battery,recharge_condition_soc = <0x62>; + battery,recharge_condition_vcell = <0x10d6>; + battery,charging_total_time = <0x3840>; + battery,hv_charging_total_time = <0x2a30>; + battery,normal_charging_total_time = <0x4650>; + battery,usb_charging_total_time = <0x8ca0>; + battery,recharging_total_time = <0x1518>; + battery,charging_reset_time = <0x0>; + battery,chg_float_voltage = <0x111c>; + battery,pre_afc_work_delay = <0x7d0>; + battery,pre_wc_afc_work_delay = <0xfa0>; + battery,pre_afc_input_current = <0x1f4>; + battery,pre_wc_afc_input_current = <0x1f4>; + battery,prepare_ta_delay = <0x0>; + battery,swelling_high_rechg_voltage = <0xfa0>; + battery,swelling_low_rechg_voltage = <0x1086>; + battery,siop_input_limit_current = <0x4b0>; + battery,siop_charging_limit_current = <0x3e8>; + battery,siop_hv_input_limit_current = <0x2bc>; + battery,siop_hv_input_limit_current_2nd = <0x226>; + battery,siop_hv_charging_limit_current = <0x3e8>; + battery,ttf_hv_charge_current = <0x992>; + battery,ttf_dc25_charge_current = <0xe42>; + battery,rp_current_rp1 = <0x1f4>; + battery,rp_current_rp2 = <0x5dc>; + battery,rp_current_rp3 = <0xbb8>; + battery,rp_current_rdu_rp3 = <0x834>; + battery,rp_current_abnormal_rp3 = <0x708>; + battery,pd_charging_charge_power = <0x3a98>; + battery,max_charging_current = <0xa8c>; + battery,wireless_cc_cv = <0x55>; + battery,wireless_otg_input_current = <0x384>; + battery,age_data = <0x0 0x111c 0x10d6 0x10b8 0x5d 0x12c 0x1108 0x10c2 0x10a4 0x5c 0x190 0x10f4 0x10ae 0x1090 0x5b 0x2bc 0x10e0 0x109a 0x107c 0x5a 0x3e8 0x10ae 0x1068 0x104a 0x59>; + battery,health_condition = <0x384 0x0 0x4b0 0x0 0x5dc 0x0>; + battery,step_charging_type = <0x0>; + battery,step_charging_charge_power = <0x2ee0>; + battery,step_charging_condition = <0x2d 0x64>; + battery,step_charging_condition_curr = <0xa8c 0xa8c>; + battery,step_charging_current = <0xa8c 0xa8c>; + battery,step_charging_float_voltage = <0x1036 0x111c>; + battery,dc_step_chg_type = <0xe9>; + battery,dc_step_chg_charge_power = <0x55f0>; + battery,dc_step_chg_step = <0x3>; + battery,dc_step_chg_cond_vol = <0x1004 0x1086 0x111c>; + battery,dc_step_chg_cond_iin = <0x802 0x79e 0x0>; + battery,dc_step_chg_iin_check_cnt = <0x3>; + battery,dc_step_chg_cond_soc = <0x14 0x3c 0x64>; + battery,dc_step_chg_val_vfloat = <0x1004 0x1086 0x111c>; + battery,dc_step_chg_val_iout = <0x13ec 0x1004 0xf3c>; + battery,standard_curr = <0xf3c>; + battery,expired_time = <0x288c>; + battery,recharging_expired_time = <0x1518>; + battery,battery_full_capacity = <0x1388>; + battery,cisd_max_voltage_thr = <0x1388>; + battery,max_input_voltage = <0x2328>; + battery,max_input_current = <0xbb8>; + battery,cisd_alg_index = <0x8>; + battery,ignore_cisd_index = <0x0 0x3c0>; + battery,ignore_cisd_index_d = <0x0 0x78>; + battery,ttf_capacity = <0x10cc>; + battery,cv_data = <0xa59 0x367 0x546 0xa1a 0x370 0x502 0x960 0x37b 0x4c5 0x8cf 0x384 0x485 0x828 0x38f 0x43a 0x79f 0x398 0x3f1 0x717 0x3a2 0x3b1 0x676 0x3ad 0x33e 0x5e0 0x3b6 0x2e0 0x531 0x3c1 0x263 0x4a2 0x3ca 0x1f8 0x406 0x3df 0xf5 0x387 0x3de 0xb8 0x2f4 0x3e8 0x0>; + io-channels = <0xffffffff 0x4f 0xffffffff 0x4d>; + io-channel-names = "adc-temp", "adc-chg-temp"; + }; + + sm5714-fuelgauge { + status = "okay"; + fuelgauge,fuel_alert_soc = <0x1>; + fuelgauge,capacity_max = <0x3e8>; + fuelgauge,capacity_max_margin = <0x12c>; + fuelgauge,capacity_min = <0x0>; + fuelgauge,capacity_calculation_type = <0x1f>; + fuelgauge,using_temp_compensation; + fuelgauge,low_temp_limit = <0x64>; + fuelgauge,using_hw_vempty; + fuelgauge,sw_v_empty_voltage = <0xc80>; + fuelgauge,sw_v_empty_voltage_cisd = <0xc1c>; + fuelgauge,sw_v_empty_recover_voltage = <0xd98>; + fuelgauge,capacity = <0x1388>; + + battery_params { + battery,id = <0x0>; + battery0,battery_type = <0x114e 0x21b3>; + battery0,battery_table0 = <0x1400 0x1b77 0x1c40 0x1ccb 0x1d31 0x1d6f 0x1d81 0x1d88 0x1da0 0x1de3 0x1e1f 0x1e45 0x1e5e 0x1e7e 0x1ebc 0x1efb 0x1f27 0x1faf 0x2009 0x209b 0x2103 0x218b 0x227c 0x2400>; + battery0,battery_table1 = <0x0 0x99 0x1b3 0x2cc 0x3e6 0x500 0x7b3 0xa80 0xd4c 0x12cc 0x1b19 0x2099 0x2619 0x2b99 0x3133 0x36b3 0x3980 0x3f00 0x4480 0x4ccc 0x524c 0x58e6 0x6400 0x6419>; + battery0,battery_table2 = <0x4b4b 0x4444 0x4040 0x3e3e 0x3c3c 0x3b3b 0x3838 0x3737 0x3535 0x3434 0x3434 0x3333 0x3333 0x3333 0x3333 0x3232>; + battery0,rs_value = <0xa3 0xa3 0x3800 0x200 0x599 0x599 0x100>; + battery0,v_alarm = <0xc1c 0xc8>; + battery0,topoff = <0x2ee>; + battery0,i_cal = <0x0 0x0 0x800 0x800 0x0 0x0 0x800 0x81e>; + battery0,v_cal = <0x1 0x0 0x0 0x1 0x0 0x0 0x0>; + battery0,temp_std = <0x19>; + battery0,tem_poff = <0xd48 0x32 0xcb2 0x32>; + battery0,aux_ctrl = <0x322 0x5800>; + battery0,data_ver = <0x9>; + battery0,v_max_table = <0x227c 0x225f 0x2243 0x2226 0x21d9>; + battery0,q_max_table = <0x21b3 0x210d 0x2068 0x1fc2 0x1e23>; + }; + }; + + cable-info { + default_input_current = <0x708>; + default_charging_current = <0x834>; + full_check_current_1st = <0x2ee>; + full_check_current_2nd = <0xfa>; + + current_group_1 { + cable_number = <0x2 0x13 0x15 0x16 0x17 0x1e>; + input_current = <0x1f4>; + charging_current = <0x1f4>; + }; + + current_group_2 { + cable_number = <0x19 0x1f>; + input_current = <0x3e8>; + charging_current = <0x3e8>; + }; + + current_group_3 { + cable_number = <0x5 0x20>; + input_current = <0x5dc>; + charging_current = <0x5dc>; + }; + + current_group_4 { + cable_number = <0x6 0x7 0x8 0x11 0x12>; + input_current = <0x672>; + charging_current = <0xa8c>; + }; + + current_group_5 { + cable_number = <0x9>; + input_current = <0x672>; + charging_current = <0x960>; + }; + + current_group_6 { + cable_number = <0xa 0xc 0xf 0x1b 0x21 0x24>; + input_current = <0x320>; + charging_current = <0x960>; + }; + + current_group_7 { + cable_number = <0xd>; + input_current = <0x2bc>; + charging_current = <0x960>; + }; + + current_group_8 { + cable_number = <0x18>; + input_current = <0x3e8>; + charging_current = <0x1c2>; + }; + + current_group_9 { + cable_number = <0x23>; + input_current = <0x708>; + charging_current = <0x708>; + }; + + current_group_10 { + cable_number = <0xb 0xe 0x10 0x1c 0x23>; + input_current = <0x28a>; + charging_current = <0x960>; + }; + + current_group_11 { + cable_number = <0x1d 0x25>; + input_current = <0x1f4>; + charging_current = <0x4b0>; + }; + + current_group_12 { + cable_number = <0x1 0x4>; + input_current = <0x1db>; + charging_current = <0x226>; + }; + + current_group_13 { + cable_number = <0x22>; + input_current = <0x4b0>; + charging_current = <0x960>; + }; + }; + }; + }; + + fragment@129 { + target = <0xffffffff>; + + __overlay__ { + + dc_thm { + + dc_thm_default { + pins = "gpio7"; + function = "normal"; + bias-high-impedance; + phandle = <0xaa>; + }; + }; + }; + }; + + fragment@130 { + target = <0xffffffff>; + + __overlay__ { + + dc_thm { + label = "dc_thm"; + reg = <0x54>; + qcom,pre-scaling = <0x1 0x1>; + qcom,hw-settle-time = <0xc8>; + qcom,ratiometric; + }; + }; + }; + + fragment@131 { + target = <0xffffffff>; + + __overlay__ { + + battery { + pinctrl-0 = <0xaa>; + battery,dchg_temp_check_type = <0x1>; + battery,dchg_thermal_source = <0x2>; + battery,dchg_temp_table_adc = <0x8ba 0xa55 0xc29 0xe52 0x10ce 0x13cf 0x1747 0x1b65 0x1fea 0x24d9 0x2a85 0x309e 0x3741 0x3ddf 0x4477 0x4af2 0x5110 0x56b0 0x5bcc 0x6020 0x63e1 0x66f7 0x3444>; + battery,dchg_temp_table_data = <0x384 0x352 0x320 0x2ee 0x2bc 0x28a 0x258 0x226 0x1f4 0x1c2 0x190 0x15e 0x12c 0xfa 0xc8 0x96 0x64 0x32 0x0 0xffffffce 0xffffff9c 0xffffff6a 0xffffff38>; + battery,dchg_high_temp = <0x28a>; + battery,dchg_high_temp_recovery = <0x276>; + battery,dchg_high_batt_temp = <0x190>; + battery,dchg_high_batt_temp_recovery = <0x17c>; + battery,dchg_input_limit_current = <0x3e8>; + battery,dchg_charging_limit_current = <0x7d0>; + io-channels = <0xffffffff 0x4f 0xffffffff 0x4d 0xffffffff 0x54>; + io-channel-names = "adc-temp", "adc-chg-temp", "adc-dchg-temp"; + }; + }; + }; + + __symbols__ { + dsi_rm69299_visionox_amoled_video = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video"; + dsi_rm69299_visionox_amoled_cmd = "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd"; + dsi_sim_vid = "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video"; + dsi_sim_cmd = "/fragment@3/__overlay__/qcom,mdss_dsi_sim_cmd"; + dsi_sim_dsc_375_cmd = "/fragment@4/__overlay__/qcom,mdss_dsi_sim_dsc_375_cmd"; + dsi_nt36672c_video = "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video"; + dsi_panel_pwr_supply = "/fragment@6/__overlay__/dsi_panel_pwr_supply"; + dsi_panel_pwr_supply_no_labibb = "/fragment@6/__overlay__/dsi_panel_pwr_supply_no_labibb"; + dsi_panel_pwr_supply_labibb_amoled = "/fragment@6/__overlay__/dsi_panel_pwr_supply_labibb_amoled"; + dsi_rm69299_visionox_amoled_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@0"; + dsi_rm69299_visionox_amoled_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@1"; + dsi_sim_vid_display = "/fragment@6/__overlay__/qcom,dsi-display@2"; + dsi_sim_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@3"; + dsi_sim_dsc_375_cmd_display = "/fragment@6/__overlay__/qcom,dsi-display@4"; + dsi_nt36672c_video_display = "/fragment@6/__overlay__/qcom,dsi-display@5"; + sde_dsi = "/fragment@6/__overlay__/qcom,dsi-display"; + sde_wb = "/fragment@6/__overlay__/qcom,wb-display@0"; + ext_disp = "/fragment@6/__overlay__/qcom,msm-ext-disp"; + ext_disp_audio_codec = "/fragment@6/__overlay__/qcom,msm-ext-disp/qcom,msm-ext-disp-audio-codec-rx"; + mtp_batterydata = "/fragment@11/__overlay__/qcom,battery-data"; + lpi_tlmm = "/fragment@27/__overlay__/lpi_pinctrl@627C0000"; + cdc_dmic01_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_active"; + cdc_dmic01_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_clk_sleep"; + cdc_dmic01_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_active"; + cdc_dmic01_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic01_data_sleep"; + cdc_dmic23_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_active"; + cdc_dmic23_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_clk_sleep"; + cdc_dmic23_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_active"; + cdc_dmic23_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic23_data_sleep"; + cdc_dmic45_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_active"; + cdc_dmic45_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_clk_sleep"; + cdc_dmic45_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_active"; + cdc_dmic45_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/dmic45_data_sleep"; + tx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_sleep"; + tx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_clk_active"; + tx_swr_data0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_sleep"; + tx_swr_data0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data0_active"; + wsa_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_sleep"; + wsa_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_clk_active"; + wsa_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_sleep"; + wsa_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/wsa_swr_data_active"; + tx_swr_data1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_sleep"; + tx_swr_data1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data1_active"; + tx_swr_data2_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_sleep"; + tx_swr_data2_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/tx_swr_data2_active"; + rx_swr_clk_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_sleep"; + rx_swr_clk_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_clk_active"; + rx_swr_data_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_sleep"; + rx_swr_data_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/rx_swr_data_active"; + lpi_i2s1_sck_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_active"; + lpi_i2s1_sck_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sck_sleep"; + lpi_i2s1_ws_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_active"; + lpi_i2s1_ws_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_ws_sleep"; + lpi_i2s1_sd0_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_active"; + lpi_i2s1_sd0_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd0_sleep"; + lpi_i2s1_sd1_active = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_active"; + lpi_i2s1_sd1_sleep = "/fragment@27/__overlay__/lpi_pinctrl@627C0000/lpi_i2s1_sd1_sleep"; + tx_macro = "/fragment@28/__overlay__/tx-macro@62620000"; + swr2 = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master"; + wcd938x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd938x-tx-slave"; + wcd937x_tx_slave = "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master/wcd937x-tx-slave"; + rx_macro = "/fragment@28/__overlay__/rx-macro@62600000"; + swr1 = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master"; + wcd938x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd938x-rx-slave"; + wcd937x_rx_slave = "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master/wcd937x-rx-slave"; + wsa_macro = "/fragment@28/__overlay__/wsa-macro@62640000"; + swr0 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master"; + wsa881x_0211 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211"; + wsa881x_0212 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212"; + wsa881x_0213 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213"; + wsa881x_0214 = "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214"; + va_macro = "/fragment@28/__overlay__/va-macro@62770000"; + wcd938x_codec = "/fragment@28/__overlay__/wcd938x-codec"; + wcd937x_codec = "/fragment@28/__overlay__/wcd937x-codec"; + cdc_dmic01_gpios = "/fragment@30/__overlay__/cdc_dmic01_pinctrl"; + cdc_dmic23_gpios = "/fragment@30/__overlay__/cdc_dmic23_pinctrl"; + cdc_dmic45_gpios = "/fragment@30/__overlay__/cdc_dmic45_pinctrl"; + wsa_swr_gpios = "/fragment@30/__overlay__/wsa_swr_clk_data_pinctrl"; + rx_swr_gpios = "/fragment@30/__overlay__/rx_swr_clk_data_pinctrl"; + tx_swr_gpios = "/fragment@30/__overlay__/tx_swr_clk_data_pinctrl"; + wsa_spkr_en1 = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl"; + wsa_spkr_en2 = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl"; + wcd_rst_gpio = "/fragment@31/__overlay__/msm_cdc_pinctrl@58"; + clock_audio_wsa_1 = "/fragment@31/__overlay__/wsa_core_clk"; + clock_audio_wsa_2 = "/fragment@31/__overlay__/wsa_npl_clk"; + clock_audio_rx_1 = "/fragment@31/__overlay__/rx_core_clk"; + clock_audio_rx_2 = "/fragment@31/__overlay__/rx_npl_clk"; + clock_audio_tx_1 = "/fragment@31/__overlay__/tx_core_clk"; + clock_audio_tx_2 = "/fragment@31/__overlay__/tx_npl_clk"; + clock_audio_va_1 = "/fragment@31/__overlay__/va_core_clk"; + clock_audio_va_2 = "/fragment@31/__overlay__/va_npl_clk"; + qupv3_se8_2hsuart = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000"; + qupv3_se8_2hsuart_pins = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins"; + qupv3_se8_2uart_tx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_active"; + qupv3_se8_2uart_rx_active = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_active"; + qupv3_se8_2uart_tx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_tx_sleep"; + qupv3_se8_2uart_rx_sleep = "/fragment@35/__overlay__/qupv3_se8_2hsuart_pins/qupv3_se8_2uart_rx_sleep"; + sec_debug_region = "/fragment@37/__overlay__/sec_debug_region@0"; + sec_debug_autocomment = "/fragment@37/__overlay__/sec_debug_autocomment@0"; + sec_debug_rdx_bootdev = "/fragment@37/__overlay__/sec_debug_rdx_bootdev@0"; + kaslr_region = "/fragment@37/__overlay__/kaslr_region@A0001000"; + rkp_region = "/fragment@37/__overlay__/rkp_region@B0200000"; + hdm_region = "/fragment@37/__overlay__/hdm_region@A1000000"; + modem_shared_mem = "/fragment@37/__overlay__/modem_shared_mem_region@B5000000"; + usb_noti = "/fragment@60/__overlay__/usb-notifier"; + camera_mem = "/fragment@65/__overlay__/camera_mem_region"; + imp_list = "/fragment@68/__overlay__/imp_list"; + cdc_quin_mi2s_gpios = "/fragment@69/__overlay__/msm_cdc_pinctrl_quin"; + samsung_q6audio_adaptation = "/fragment@70/__overlay__/samsung,q6audio-adaptation"; + det_zones = "/fragment@70/__overlay__/det_zones"; + i2c_18 = "/fragment@70/__overlay__/i2c@18"; + tas256x = "/fragment@70/__overlay__/i2c@18/tas256x@4c"; + tas25xx_gpio_default = "/fragment@73/__overlay__/tas25xx_gpio_default"; + fm_lna_default = "/fragment@73/__overlay__/fm_lna_default"; + grip_i2c_active = "/fragment@74/__overlay__/grip_i2c/grip_i2c_active"; + grip_i2c_suspend = "/fragment@74/__overlay__/grip_i2c/grip_i2c_suspend"; + s2mpb03_i2c_sda_default = "/fragment@74/__overlay__/s2mpb03_i2c_sda_default"; + s2mpb03_i2c_scl_default = "/fragment@74/__overlay__/s2mpb03_i2c_scl_default"; + cam_sensor_mclk0_active = "/fragment@74/__overlay__/cam_sensor_mclk0_active"; + cam_sensor_mclk0_suspend = "/fragment@74/__overlay__/cam_sensor_mclk0_suspend"; + cam_sensor_mclk1_active = "/fragment@74/__overlay__/cam_sensor_mclk1_active"; + cam_sensor_mclk1_suspend = "/fragment@74/__overlay__/cam_sensor_mclk1_suspend"; + cam_sensor_mclk2_active = "/fragment@74/__overlay__/cam_sensor_mclk2_active"; + cam_sensor_mclk2_suspend = "/fragment@74/__overlay__/cam_sensor_mclk2_suspend"; + cam_sensor_mclk3_active = "/fragment@74/__overlay__/cam_sensor_mclk3_active"; + cam_sensor_mclk3_suspend = "/fragment@74/__overlay__/cam_sensor_mclk3_suspend"; + cam_sensor_mclk4_active = "/fragment@74/__overlay__/cam_sensor_mclk4_active"; + cam_sensor_mclk4_suspend = "/fragment@74/__overlay__/cam_sensor_mclk4_suspend"; + rcam1_sensor_reset_active = "/fragment@74/__overlay__/rcam1_sensor_reset_active"; + rcam1_sensor_reset_suspend = "/fragment@74/__overlay__/rcam1_sensor_reset_suspend"; + front_sensor_reset_active = "/fragment@74/__overlay__/front_sensor_reset_active"; + front_sensor_reset_suspend = "/fragment@74/__overlay__/front_sensor_reset_suspend"; + rcam3_sensor_reset_active = "/fragment@74/__overlay__/rcam3_sensor_reset_active"; + rcam3_sensor_reset_suspend = "/fragment@74/__overlay__/rcam3_sensor_reset_suspend"; + rcam2_sensor_reset_active = "/fragment@74/__overlay__/rcam2_sensor_reset_active"; + rcam2_sensor_reset_suspend = "/fragment@74/__overlay__/rcam2_sensor_reset_suspend"; + rcam4_sensor_reset_active = "/fragment@74/__overlay__/rcam4_sensor_reset_active"; + rcam4_sensor_reset_suspend = "/fragment@74/__overlay__/rcam4_sensor_reset_suspend"; + rcam1_sensor_vana_active = "/fragment@74/__overlay__/rcam1_sensor_vana_active"; + rcam1_sensor_vana_suspend = "/fragment@74/__overlay__/rcam1_sensor_vana_suspend"; + rcam2_sensor_vana_active = "/fragment@74/__overlay__/rcam2_sensor_vana_active"; + rcam2_sensor_vana_suspend = "/fragment@74/__overlay__/rcam2_sensor_vana_suspend"; + rcam3_sensor_vana_active = "/fragment@74/__overlay__/rcam3_sensor_vana_active"; + rcam3_sensor_vana_suspend = "/fragment@74/__overlay__/rcam3_sensor_vana_suspend"; + rcam4_sensor_vana_active = "/fragment@74/__overlay__/rcam4_sensor_vana_active"; + rcam4_sensor_vana_suspend = "/fragment@74/__overlay__/rcam4_sensor_vana_suspend"; + cam_mipi_sel_active = "/fragment@74/__overlay__/cam_mipi_sel_active"; + cam_mipi_sel_suspend = "/fragment@74/__overlay__/cam_mipi_sel_suspend"; + rcam3_sensor_vdig_active = "/fragment@74/__overlay__/rcam3_sensor_vdig_active"; + rcam3_sensor_vdig_suspend = "/fragment@74/__overlay__/rcam3_sensor_vdig_suspend"; + rcam4_sensor_vdig_active = "/fragment@74/__overlay__/rcam4_sensor_vdig_active"; + rcam4_sensor_vdig_suspend = "/fragment@74/__overlay__/rcam4_sensor_vdig_suspend"; + if_pmic_i2c_pins = "/fragment@74/__overlay__/if_pmic_i2c_pins"; + if_pmic_i2c_sleep = "/fragment@74/__overlay__/if_pmic_i2c_pins/if_pmic_i2c_sleep"; + usbpd_i2c_pins = "/fragment@74/__overlay__/usbpd_i2c_pins"; + usbpd_i2c_sleep = "/fragment@74/__overlay__/usbpd_i2c_pins/usbpd_i2c_sleep"; + mcu_reset_active = "/fragment@74/__overlay__/mcu_reset_active"; + mcu_reset_suspend = "/fragment@74/__overlay__/mcu_reset_suspend"; + mcu_clk_active = "/fragment@74/__overlay__/mcu_clk_active"; + mcu_clk_suspend = "/fragment@74/__overlay__/mcu_clk_suspend"; + grip_int_active = "/fragment@75/__overlay__/grip_int_active"; + grip_int_suspend = "/fragment@75/__overlay__/grip_int_suspend"; + i2c2 = "/fragment@80/__overlay__/i2c@2"; + s2mpb03_l1 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo1"; + s2mpb03_l2 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo2"; + s2mpb03_l3 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo3"; + s2mpb03_l4 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo4"; + s2mpb03_l5 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo5"; + s2mpb03_l6 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo6"; + s2mpb03_l7 = "/fragment@80/__overlay__/i2c@2/s2mpb03@56/regulators/s2mpb03-ldo7"; + self_display_FC3_dtsi = "/fragment@84/__overlay__/self_display_FC3_dtsi"; + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD = "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; + ss_dsi_panel_PBA_BOOTING_FHD = "/fragment@86/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD"; + sde_te_active = "/fragment@87/__overlay__/pmx_sde_te/sde_te_active"; + sde_te_suspend = "/fragment@87/__overlay__/pmx_sde_te/sde_te_suspend"; + pmx_sde = "/fragment@87/__overlay__/pmx_sde"; + sde_dsi_active = "/fragment@87/__overlay__/pmx_sde/sde_dsi_active"; + sde_dsi_suspend = "/fragment@87/__overlay__/pmx_sde/sde_dsi_suspend"; + sde_ub_det_default = "/fragment@88/__overlay__/pmx_sde_ub_det/sde_ub_det_default"; + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD_display = "/fragment@89/__overlay__/qcom,dsi-display@9"; + ss_dsi_panel_PBA_BOOTING_FHD_display = "/fragment@89/__overlay__/qcom,dsi-display@10"; + tsp_int = "/fragment@91/__overlay__/tsp_int"; + tsp_zt = "/fragment@92/__overlay__/touchscreen@20"; + tsp_stm = "/fragment@92/__overlay__/touchscreen@49"; + key_vol_up_default = "/fragment@93/__overlay__/key_vol_up/key_vol_up_default"; + if_pmic_irq_default = "/fragment@98/__overlay__/if_pmic_irq/if_pmic_irq_default"; + usbpd_irq_default = "/fragment@98/__overlay__/usbpd_irq/usbpd_irq_default"; + nfc_qupv3_se0_i2c_sleep = "/fragment@100/__overlay__/nfc_qupv3_se0_i2c_sleep"; + nfc_clk_req_gpio = "/fragment@100/__overlay__/nfc_clk_req_gpio"; + nfc_irq_gpio = "/fragment@100/__overlay__/nfc_irq_gpio"; + nfc_ven_gpio = "/fragment@100/__overlay__/nfc_ven_gpio"; + nfc_firm_gpio = "/fragment@100/__overlay__/nfc_firm_gpio"; + nfc_ldo_en_gpio = "/fragment@100/__overlay__/nfc_ldo_en_gpio"; + et7xx_rst = "/fragment@102/__overlay__/et7xx_rst/et7xx_rst"; + sm5714_flash0 = "/fragment@106/__overlay__/qcom,flash_0"; + sm5714_torch0 = "/fragment@106/__overlay__/qcom,torch_0"; + led_flash0 = "/fragment@106/__overlay__/qcom,camera-flash@0"; + led_flash1 = "/fragment@106/__overlay__/qcom,camera-flash@1"; + ois_rear = "/fragment@108/__overlay__/qcom,ois@62"; + sensor_rear = "/fragment@109/__overlay__/qcom,cam-sensor@0"; + eeprom2 = "/fragment@109/__overlay__/qcom,eeprom@0x2D"; + sensor_rear_tele = "/fragment@110/__overlay__/qcom,cam-sensor@3"; + eeprom4 = "/fragment@110/__overlay__/qcom,eeprom@0x3F"; + actuator_rear0 = "/fragment@111/__overlay__/qcom,actuator@0xC"; + actuator_rear_tele = "/fragment@111/__overlay__/qcom,actuator2"; + eeprom0 = "/fragment@111/__overlay__/qcom,eeprom@50"; + eeprom1 = "/fragment@111/__overlay__/qcom,eeprom@51"; + eeprom3 = "/fragment@111/__overlay__/qcom,eeprom@55"; + hall_default = "/fragment@114/__overlay__/hall/hall_default"; + certify_hall_default = "/fragment@115/__overlay__/certify_hall_default"; + L8C = "/fragment@116/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150l_l8 = "/fragment@116/__overlay__/rpmh-regulator-ldoc8/regulator-pm6150l-l8"; + pm6150_l5 = "/fragment@116/__overlay__/rpmh-regulator-ldoa5/regulator-pm6150-l5"; + i2c_17 = "/fragment@116/__overlay__/i2c@17"; + dc_thm_default = "/fragment@129/__overlay__/dc_thm/dc_thm_default"; + }; + + __fixups__ { + mdss_mdp = "/fragment@0:target:0", "/fragment@1:target:0", "/fragment@2:target:0", "/fragment@3:target:0", "/fragment@4:target:0", "/fragment@5:target:0", "/fragment@8:target:0", "/fragment@10:target:0", "/fragment@85:target:0", "/fragment@86:target:0"; + tlmm = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-te-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-te-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-te-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-te-gpio:0", "/fragment@7/__overlay__:qcom,usbplug-cc-gpio:0", "/fragment@17/__overlay__:cd-gpios:0", "/fragment@24/__overlay__/synaptics_tcm@20:interrupt-parent:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,irq-gpio:0", "/fragment@24/__overlay__/synaptics_tcm@20:synaptics,reset-gpio:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:interrupt-parent:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:reset-gpios:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:irq-gpios:0", "/fragment@25/__overlay__/nq@28:qcom,nq-irq:0", "/fragment@25/__overlay__/nq@28:qcom,nq-ven:0", "/fragment@25/__overlay__/nq@28:qcom,nq-firm:0", "/fragment@25/__overlay__/nq@28:qcom,nq-clkreq:0", "/fragment@25/__overlay__/nq@28:interrupt-parent:0", "/fragment@35:target:0", "/fragment@70/__overlay__/i2c@18:gpios:0", "/fragment@70/__overlay__/i2c@18:gpios:12", "/fragment@70/__overlay__/i2c@18/tas256x@4c:ti,reset-gpio:0", "/fragment@70/__overlay__/i2c@18/tas256x@4c:ti,irq-gpio:0", "/fragment@71/__overlay__:qcom,fm-lna-gpios:0", "/fragment@73:target:0", "/fragment@74:target:0", "/fragment@76:target:0", "/fragment@80/__overlay__/i2c@2:gpios:0", "/fragment@80/__overlay__/i2c@2:gpios:12", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:qcom,platform-reset-gpio:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:qcom,platform-te-gpio:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:samsung,esd-irq-gpio1:0", "/fragment@86/__overlay__/ss_dsi_panel_PBA_BOOTING_FHD:qcom,platform-reset-gpio:0", "/fragment@87:target:0", "/fragment@91:target:0", "/fragment@92/__overlay__/touchscreen@20:zinitix,irq_gpio:0", "/fragment@92/__overlay__/touchscreen@49:stm,irq_gpio:0", "/fragment@96/__overlay__/sm5714@49:sm5714,irq-gpio:0", "/fragment@97/__overlay__/usbpd-sm5714@33:usbpd,usbpd_int:0", "/fragment@98:target:0", "/fragment@100:target:0", "/fragment@101/__overlay__/sec-nfc@27:interrupt-parent:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,ven-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,irq-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,firm-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,clk_req-gpio:0", "/fragment@101/__overlay__/sec-nfc@27:sec-nfc,pvdd-gpio:0", "/fragment@102:target:0", "/fragment@104/__overlay__/etspi,et7xx:etspi-sleepPin:0", "/fragment@107/__overlay__/sm5714-fled:flash-en-gpio:0", "/fragment@107/__overlay__/sm5714-fled:torch-en-gpio:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:0", "/fragment@108/__overlay__/qcom,ois@62:gpios:12", "/fragment@108/__overlay__/qcom,ois@62:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@0:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:12", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:24", "/fragment@109/__overlay__/qcom,cam-sensor@2:gpios:36", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:12", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:24", "/fragment@109/__overlay__/qcom,eeprom@0x2D:gpios:36", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@3:gpios:36", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:12", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:24", "/fragment@110/__overlay__/qcom,cam-sensor@4:gpios:36", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:12", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:24", "/fragment@110/__overlay__/qcom,eeprom@0x3F:gpios:36", "/fragment@111/__overlay__/qcom,actuator@0xC:gpios:0", "/fragment@111/__overlay__/qcom,actuator2:gpios:0", "/fragment@111/__overlay__/qcom,eeprom@50:gpios:0", "/fragment@111/__overlay__/qcom,eeprom@55:gpios:0", "/fragment@113/__overlay__/certify_hall:certify_hall,gpio_certify_cover:0", "/fragment@115:target:0", "/fragment@116/__overlay__/i2c@17:gpios:0", "/fragment@116/__overlay__/i2c@17:gpios:12", "/fragment@117:target:0", "/fragment@119:target:0", "/fragment@122:target:0", "/fragment@124:target:0", "/fragment@125/__overlay__/msm_vibrator:motor-en:0"; + pm6150l_gpios = "/fragment@0/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_video:qcom,platform-reset-gpio:0", "/fragment@1/__overlay__/qcom,mdss_dsi_rm69299_visionox_amoled_cmd:qcom,platform-reset-gpio:0", "/fragment@2/__overlay__/qcom,mdss_dsi_sim_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-reset-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-bklight-en-gpio:0", "/fragment@5/__overlay__/qcom,mdss_dsi_nt36672c_video:qcom,platform-en-gpio:0", "/fragment@6/__overlay__/qcom,dsi-display:qcom,platform-reset-gpio:0", "/fragment@22:target:0", "/fragment@75:target:0", "/fragment@93:target:0", "/fragment@94/__overlay__/vol_up:gpios:0", "/fragment@116/__overlay__/i2c@17/sx9360-i2c@28:sx9360,nirq-gpio:0", "/fragment@129:target:0"; + soc = "/fragment@6:target:0", "/fragment@11:target:0", "/fragment@23:target:0", "/fragment@31:target:0", "/fragment@34:target:0", "/fragment@60:target:0", "/fragment@66:target:0", "/fragment@70:target:0", "/fragment@80:target:0", "/fragment@84:target:0", "/fragment@89:target:0", "/fragment@95:target:0", "/fragment@106:target:0", "/fragment@112:target:0", "/fragment@113:target:0", "/fragment@116:target:0", "/fragment@118:target:0", "/fragment@121:target:0", "/fragment@123:target:0", "/fragment@125:target:0", "/fragment@128:target:0", "/fragment@131:target:0"; + mdss_dsi0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-ctrl:0"; + mdss_dsi_phy0 = "/fragment@6/__overlay__/qcom,dsi-display:qcom,dsi-phy:0"; + mdss_dsi0_pll = "/fragment@6/__overlay__/qcom,dsi-display:clocks:0", "/fragment@6/__overlay__/qcom,dsi-display:clocks:8", "/fragment@6/__overlay__/qcom,dsi-display:clocks:16", "/fragment@6/__overlay__/qcom,dsi-display:clocks:24", "/fragment@6/__overlay__/qcom,dsi-display:clocks:32", "/fragment@6/__overlay__/qcom,dsi-display:clocks:40", "/fragment@6/__overlay__/qcom,dsi-display:clocks:48", "/fragment@6/__overlay__/qcom,dsi-display:clocks:56", "/fragment@6/__overlay__/qcom,dsi-display:clocks:64", "/fragment@6/__overlay__/qcom,dsi-display:clocks:72"; + L13A = "/fragment@6/__overlay__/qcom,dsi-display:vddio-supply:0"; + L18A = "/fragment@6/__overlay__/qcom,dsi-display:vdda-3p3-supply:0"; + lcdb_ldo_vreg = "/fragment@6/__overlay__/qcom,dsi-display:lab-supply:0"; + lcdb_ncp_vreg = "/fragment@6/__overlay__/qcom,dsi-display:ibb-supply:0"; + pm6150_l18 = "/fragment@6/__overlay__/qcom,dsi-display:vci-supply:0"; + pm6150_l13 = "/fragment@6/__overlay__/qcom,dsi-display:vddi-supply:0"; + sde_dp = "/fragment@7:target:0", "/fragment@8/__overlay__:connectors:8", "/fragment@26:target:0"; + pm6150_pdphy = "/fragment@7/__overlay__:qcom,dp-usbpd-detection:0"; + sde_dp_usbplug_cc_active = "/fragment@7/__overlay__:pinctrl-0:0"; + sde_dp_usbplug_cc_suspend = "/fragment@7/__overlay__:pinctrl-1:0"; + sde_rscc = "/fragment@8/__overlay__:connectors:12"; + thermal_zones = "/fragment@9:target:0", "/fragment@18:target:0"; + pm6150_trip0 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:trip:0"; + pm6150_charger = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip0_bat:cooling-device:0", "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:cooling-device:0", "/fragment@21:target:0"; + pm6150_trip1 = "/fragment@9/__overlay__/pm6150-tz/cooling-maps/trip1_bat:trip:0"; + pm6150l_trip0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:trip:0"; + CPU0 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu0:cooling-device:0"; + CPU1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu1:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:cooling-device:0"; + CPU2 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu2:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:cooling-device:0"; + CPU3 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu3:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:cooling-device:0"; + CPU4 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu4:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:cooling-device:0"; + CPU5 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu5:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:cooling-device:0"; + CPU6 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:cooling-device:0"; + CPU7 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip0_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:cooling-device:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:cooling-device:0"; + pm6150l_trip1 = "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu1:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu2:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu3:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu4:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu5:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu6:trip:0", "/fragment@9/__overlay__/pm6150l-tz/cooling-maps/trip1_cpu7:trip:0"; + bcl_lvl0 = "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl0/cooling-maps/vbat_cpu7:trip:0"; + bcl_lvl1 = "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl1/cooling-maps/ibat_cpu7:trip:0"; + bcl_lvl2 = "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu6:trip:0", "/fragment@9/__overlay__/pm6150-bcl-lvl2/cooling-maps/ibat_cpu7:trip:0"; + soc_trip = "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu6:trip:0", "/fragment@9/__overlay__/soc/cooling-maps/soc_cpu7:trip:0"; + pm6150l_vadc = "/fragment@12:target:0", "/fragment@13/__overlay__:io-channels:0", "/fragment@13/__overlay__:io-channels:8", "/fragment@13/__overlay__:io-channels:16", "/fragment@13/__overlay__:io-channels:24", "/fragment@80/__overlay__/sec_thermistor@1:io-channels:0", "/fragment@80/__overlay__/sec_thermistor@2:io-channels:0", "/fragment@83:target:0", "/fragment@130:target:0", "/fragment@131/__overlay__/battery:io-channels:16"; + pm6150l_adc_tm = "/fragment@13:target:0", "/fragment@18/__overlay__/pa-therm1:thermal-sensors:0"; + ufsphy_mem = "/fragment@14:target:0"; + pm6150_l4 = "/fragment@14/__overlay__:vdda-phy-supply:0"; + pm6150l_l3 = "/fragment@14/__overlay__:vdda-pll-supply:0", "/fragment@15/__overlay__:qcom,vddp-ref-clk-supply:0"; + ufshc_mem = "/fragment@15:target:0", "/fragment@64:target:0"; + ufs_phy_gdsc = "/fragment@15/__overlay__:vdd-hba-supply:0"; + pm6150_l19 = "/fragment@15/__overlay__:vcc-supply:0", "/fragment@16/__overlay__:vdd-supply:0"; + pm6150_l12 = "/fragment@15/__overlay__:vccq2-supply:0", "/fragment@16/__overlay__:vdd-io-supply:0"; + sdhc_1 = "/fragment@16:target:0"; + sdc1_clk_on = "/fragment@16/__overlay__:pinctrl-0:0"; + sdc1_cmd_on = "/fragment@16/__overlay__:pinctrl-0:4"; + sdc1_data_on = "/fragment@16/__overlay__:pinctrl-0:8"; + sdc1_rclk_on = "/fragment@16/__overlay__:pinctrl-0:12"; + sdc1_clk_off = "/fragment@16/__overlay__:pinctrl-1:0"; + sdc1_cmd_off = "/fragment@16/__overlay__:pinctrl-1:4"; + sdc1_data_off = "/fragment@16/__overlay__:pinctrl-1:8"; + sdc1_rclk_off = "/fragment@16/__overlay__:pinctrl-1:12"; + sdhc_2 = "/fragment@17:target:0"; + pm6150l_l9 = "/fragment@17/__overlay__:vdd-supply:0"; + pm6150l_l6 = "/fragment@17/__overlay__:vdd-io-supply:0"; + sdc2_clk_on = "/fragment@17/__overlay__:pinctrl-0:0"; + sdc2_cmd_on = "/fragment@17/__overlay__:pinctrl-0:4"; + sdc2_data_on = "/fragment@17/__overlay__:pinctrl-0:8"; + sdc2_cd_on = "/fragment@17/__overlay__:pinctrl-0:12"; + sdc2_clk_off = "/fragment@17/__overlay__:pinctrl-1:0"; + sdc2_cmd_off = "/fragment@17/__overlay__:pinctrl-1:4"; + sdc2_data_off = "/fragment@17/__overlay__:pinctrl-1:8"; + sdc2_cd_off = "/fragment@17/__overlay__:pinctrl-1:12"; + pm6150a_amoled = "/fragment@19:target:0"; + pm6150_qg = "/fragment@20:target:0"; + pm6150_vadc = "/fragment@21/__overlay__:io-channels:0", "/fragment@21/__overlay__:io-channels:8", "/fragment@21/__overlay__:io-channels:16", "/fragment@21/__overlay__:io-channels:24", "/fragment@21/__overlay__:io-channels:32", "/fragment@21/__overlay__:io-channels:40", "/fragment@21/__overlay__:io-channels:48", "/fragment@80/__overlay__/sec_thermistor@0:io-channels:0", "/fragment@82:target:0", "/fragment@127:target:0", "/fragment@128/__overlay__/battery:io-channels:0", "/fragment@128/__overlay__/battery:io-channels:8", "/fragment@131/__overlay__/battery:io-channels:0", "/fragment@131/__overlay__/battery:io-channels:8"; + qusb_phy0 = "/fragment@21/__overlay__:dpdm-supply:0", "/fragment@99:target:0"; + qupv3_se7_i2c = "/fragment@24:target:0", "/fragment@92:target:0", "/fragment@107:target:0"; + ts_active = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-0:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-0:0"; + ts_int_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:0"; + ts_reset_suspend = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-1:4", "/fragment@24/__overlay__/atmel_mxt_ts@4a:pinctrl-1:4"; + ts_release = "/fragment@24/__overlay__/synaptics_tcm@20:pinctrl-2:0"; + pm6150_l10 = "/fragment@24/__overlay__/synaptics_tcm@20:vdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:vdd-supply:0"; + pm6150l_l7 = "/fragment@24/__overlay__/synaptics_tcm@20:avdd-supply:0", "/fragment@24/__overlay__/atmel_mxt_ts@4a:avdd-supply:0", "/fragment@90:target:0", "/fragment@92/__overlay__/touchscreen@20:avdd-supply:0", "/fragment@92/__overlay__/touchscreen@49:avdd-supply:0"; + qupv3_se0_i2c = "/fragment@25:target:0", "/fragment@101:target:0"; + nfc_int_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:0"; + nfc_enable_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:4"; + nfc_clk_req_active = "/fragment@25/__overlay__/nq@28:pinctrl-0:8"; + nfc_int_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:0"; + nfc_enable_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:4"; + nfc_clk_req_suspend = "/fragment@25/__overlay__/nq@28:pinctrl-1:8"; + fsa4480 = "/fragment@26/__overlay__:qcom,dp-aux-switch:0", "/fragment@72:target:0"; + q6core = "/fragment@27:target:0", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:4", "/fragment@30:target:0", "/fragment@69:target:0", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:4"; + lpass_core_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:0", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:0", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:0"; + lpass_audio_hw_vote = "/fragment@27/__overlay__/lpi_pinctrl@627C0000:clocks:8", "/fragment@28/__overlay__/tx-macro@62620000/tx_swr_master:clocks:8", "/fragment@28/__overlay__/rx-macro@62600000/rx_swr_master:clocks:8", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master:clocks:8", "/fragment@28/__overlay__/va-macro@62770000:clocks:0"; + bolero = "/fragment@28:target:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170211:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@20170212:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170213:qcom,bolero-handle:0", "/fragment@28/__overlay__/wsa-macro@62640000/wsa_swr_master/wsa881x@21170214:qcom,bolero-handle:0", "/fragment@29/__overlay__:asoc-codec:4", "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:12", "/fragment@68:target:0", "/fragment@71/__overlay__:asoc-codec:4", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:12"; + L10A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-rxtx-supply:0", "/fragment@28/__overlay__/wcd938x-codec:cdc-vddio-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-ldo-rxtx-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vddpx-1-supply:0"; + L15A = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-buck-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-buck-supply:0"; + BOB = "/fragment@28/__overlay__/wcd938x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@28/__overlay__/wcd937x-codec:cdc-vdd-mic-bias-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_bob-supply:0"; + atoll_snd = "/fragment@29:target:0", "/fragment@71:target:0"; + stub_codec = "/fragment@29/__overlay__:asoc-codec:0", "/fragment@71/__overlay__:asoc-codec:0"; + audio_apr = "/fragment@29/__overlay__:qcom,msm_audio_ssr_devs:0", "/fragment@71/__overlay__:qcom,msm_audio_ssr_devs:0"; + spkr_1_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-0:0"; + spkr_1_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en1_pinctrl:pinctrl-1:0"; + spkr_2_sd_n_active = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-0:0"; + spkr_2_sd_n_sleep = "/fragment@31/__overlay__/wsa_spkr_en2_pinctrl:pinctrl-1:0"; + wcd_reset_active = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-0:0"; + wcd_reset_sleep = "/fragment@31/__overlay__/msm_cdc_pinctrl@58:pinctrl-1:0"; + va_cdc_dma_0_tx = "/fragment@32:target:0"; + aliases = "/fragment@33:target:0", "/fragment@67:target:0"; + clock_gcc = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:0", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:8", "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:clocks:16"; + qupv3_1 = "/fragment@34/__overlay__/qcom,qup_hsuart@a88000:qcom,wrapper-core:0"; + dcc = "/fragment@36:target:0"; + reserved_memory = "/fragment@37:target:0", "/fragment@65:target:0", "/fragment@105:target:0", "/fragment@120:target:0"; + removed_region = "/fragment@38:target:0"; + pil_modem_mem = "/fragment@39:target:0"; + pil_adsp_mem = "/fragment@40:target:0"; + pil_camera_mem = "/fragment@41:target:0"; + pil_npu_mem = "/fragment@42:target:0"; + pil_video_mem = "/fragment@43:target:0"; + pil_cdsp_mem = "/fragment@44:target:0"; + qseecom_mem = "/fragment@45:target:0"; + qseecom_ta_mem = "/fragment@46:target:0"; + secure_carveout_heap = "/fragment@47:target:0"; + cdsp_sec_mem = "/fragment@48:target:0"; + msm_imem = "/fragment@49:target:0"; + camera = "/fragment@50:target:0"; + cam_vfe0 = "/fragment@51:target:0"; + cam_vfe1 = "/fragment@52:target:0"; + cam_vfe_lite = "/fragment@53:target:0"; + cam_lrme = "/fragment@54:target:0"; + shared_meta = "/fragment@55:target:0"; + android_q_fstab = "/fragment@56:target:0"; + pm8008_8 = "/fragment@57:target:0", "/fragment@78:target:0"; + pm8008_9 = "/fragment@58:target:0", "/fragment@79:target:0"; + usb0 = "/fragment@59:target:0"; + firmware = "/fragment@61:target:0"; + pil_modem = "/fragment@62:target:0"; + modem_smp2p_out = "/fragment@62/__overlay__:qcom,smem-states:0", "/fragment@62/__overlay__:qcom,smem-states:8", "/fragment@62/__overlay__:qcom,smem-states:16"; + icnss = "/fragment@63:target:0"; + pcm0 = "/fragment@71/__overlay__:asoc-platform:0"; + pcm1 = "/fragment@71/__overlay__:asoc-platform:4"; + pcm2 = "/fragment@71/__overlay__:asoc-platform:8"; + voip = "/fragment@71/__overlay__:asoc-platform:12"; + voice = "/fragment@71/__overlay__:asoc-platform:16"; + loopback = "/fragment@71/__overlay__:asoc-platform:20"; + compress = "/fragment@71/__overlay__:asoc-platform:24"; + hostless = "/fragment@71/__overlay__:asoc-platform:28"; + afe = "/fragment@71/__overlay__:asoc-platform:32"; + lsm = "/fragment@71/__overlay__:asoc-platform:36"; + routing = "/fragment@71/__overlay__:asoc-platform:40"; + compr = "/fragment@71/__overlay__:asoc-platform:44"; + pcm_noirq = "/fragment@71/__overlay__:asoc-platform:48"; + spmi_bus = "/fragment@77:target:0", "/fragment@116/__overlay__/i2c@17/sx9360-i2c@28:interrupt-parent:0"; + pm6150_gpios = "/fragment@81:target:0", "/fragment@85/__overlay__/ss_dsi_panel_S6E3FC3_AMS667YM01_FHD:samsung,ub-con-det:0", "/fragment@88:target:0", "/fragment@113/__overlay__/hall:hall,gpio_flip_cover:0", "/fragment@114:target:0"; + gpio_key = "/fragment@94:target:0"; + qupv3_se4_i2c = "/fragment@96:target:0", "/fragment@126:target:0"; + qupv3_se11_i2c = "/fragment@97:target:0"; + pm6150l_l11 = "/fragment@103:target:0"; + qupv3_se6_spi = "/fragment@104:target:0"; + pm6150l_switch2 = "/fragment@106/__overlay__/qcom,camera-flash@0:switch-source:0", "/fragment@106/__overlay__/qcom,camera-flash@1:switch-source:0"; + qupv3_se10_i2c = "/fragment@108:target:0"; + cam_cci0 = "/fragment@109:target:0"; + titan_top_gdsc = "/fragment@109/__overlay__/qcom,cam-sensor@0:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:cam_clk-supply:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:cam_clk-supply:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:cam_clk-supply:0"; + clock_camcc = "/fragment@109/__overlay__/qcom,cam-sensor@0:clocks:0", "/fragment@109/__overlay__/qcom,cam-sensor@2:clocks:0", "/fragment@109/__overlay__/qcom,eeprom@0x2D:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@1:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@8:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@3:clocks:0", "/fragment@110/__overlay__/qcom,cam-sensor@4:clocks:0", "/fragment@110/__overlay__/qcom,eeprom@0x3F:clocks:0"; + cam_cci1 = "/fragment@110:target:0"; + qupv3_se9_i2c = "/fragment@111:target:0"; + apps_rsc = "/fragment@116/__overlay__/rpmh-regulator-ldoc8:mboxes:0"; + }; + + __local_fixups__ { + + fragment@0 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@1 { + + __overlay__ { + + qcom,mdss_dsi_rm69299_visionox_amoled_cmd { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@2 { + + __overlay__ { + + qcom,mdss_dsi_sim_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@5 { + + __overlay__ { + + qcom,mdss_dsi_nt36672c_video { + qcom,panel-supply-entries = <0x0>; + }; + }; + }; + + fragment@6 { + + __overlay__ { + + qcom,dsi-display@0 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@1 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@2 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@3 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@4 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display@5 { + qcom,dsi-panel = <0x0>; + }; + + qcom,dsi-display { + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + qcom,dsi-display-list = <0x0 0x4>; + }; + }; + }; + + fragment@7 { + + __overlay__ { + qcom,ext-disp = <0x0>; + }; + }; + + fragment@8 { + + __overlay__ { + connectors = <0x0 0x4>; + }; + }; + + fragment@20 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@21 { + + __overlay__ { + qcom,battery-data = <0x0>; + }; + }; + + fragment@28 { + + __overlay__ { + + bolero-clk-rsc-mngr { + clocks = <0x0 0x8 0x10 0x18 0x20 0x28 0x30 0x38>; + }; + + tx-macro@62620000 { + clocks = <0x0 0x8>; + qcom,tx-swr-gpios = <0x0>; + }; + + rx-macro@62600000 { + clocks = <0x0 0x8>; + qcom,rx-swr-gpios = <0x0>; + }; + + wsa-macro@62640000 { + clocks = <0x0 0x8>; + qcom,wsa-swr-gpios = <0x0>; + + wsa_swr_master { + + wsa881x@20170211 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@20170212 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170213 { + qcom,spkr-sd-n-node = <0x0>; + }; + + wsa881x@21170214 { + qcom,spkr-sd-n-node = <0x0>; + }; + }; + }; + + wcd938x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + mbhc-button-thres = <0x0 0xc 0x18 0x24 0x30 0x3c 0x48 0x54>; + imp-table = <0x0 0x10 0x20 0x30 0x40 0x50 0x60 0x70>; + }; + + wcd937x-codec { + qcom,wcd-rst-gpio-node = <0x0>; + qcom,rx-slave = <0x0>; + qcom,tx-slave = <0x0>; + }; + }; + }; + + fragment@29 { + + __overlay__ { + qcom,cdc-dmic01-gpios = <0x0>; + qcom,cdc-dmic23-gpios = <0x0>; + qcom,cdc-dmic45-gpios = <0x0>; + asoc-codec = <0x8>; + qcom,wsa-devs = <0x0 0x4 0x8 0xc>; + qcom,codec-aux-devs = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@30 { + + __overlay__ { + + cdc_dmic01_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic23_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + cdc_dmic45_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + wsa_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + rx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + tx_swr_clk_data_pinctrl { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@34 { + + __overlay__ { + + qcom,qup_hsuart@a88000 { + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + }; + }; + + fragment@60 { + + __overlay__ { + + qcom,memshare { + + qcom,client_4 { + memory-region = <0x0>; + }; + }; + + samsung,sec_hdm { + memory-region = <0x0>; + }; + }; + }; + + fragment@66 { + + __overlay__ { + + qcom,ion { + + qcom,ion-heap@30 { + memory-region = <0x0>; + }; + }; + }; + }; + + fragment@69 { + + __overlay__ { + + msm_cdc_pinctrl_quin { + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@70 { + + __overlay__ { + + i2c@18 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@71 { + + __overlay__ { + asoc-platform = <0x34>; + qcom,quin-mi2s-gpios = <0x0>; + qcom,msm_audio_ssr_devs = <0x8>; + }; + }; + + fragment@80 { + + __overlay__ { + + i2c@2 { + pinctrl-0 = <0x0 0x4>; + }; + }; + }; + + fragment@85 { + + __overlay__ { + + ss_dsi_panel_S6E3FC3_AMS667YM01_FHD { + ss,self_display = <0x0>; + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@86 { + + __overlay__ { + + ss_dsi_panel_PBA_BOOTING_FHD { + qcom,dsi-panel = <0x0>; + }; + }; + }; + + fragment@92 { + + __overlay__ { + + touchscreen@20 { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + + touchscreen@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@94 { + + __overlay__ { + pinctrl-0 = <0x0>; + }; + }; + + fragment@96 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sm5714@49 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@97 { + + __overlay__ { + pinctrl-1 = <0x0>; + + usbpd-sm5714@33 { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@101 { + + __overlay__ { + pinctrl-1 = <0x0>; + + sec-nfc@27 { + pinctrl-0 = <0x0 0x4 0x8 0xc 0x10>; + }; + }; + }; + + fragment@104 { + + __overlay__ { + + etspi,et7xx { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@106 { + + __overlay__ { + + qcom,camera-flash@0 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,camera-flash@1 { + flash-source = <0x0>; + torch-source = <0x0>; + }; + + qcom,cam-res-mgr { + pinctrl-0 = <0x0>; + pinctrl-1 = <0x0>; + }; + }; + }; + + fragment@108 { + + __overlay__ { + + qcom,ois@62 { + cam_vaf-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + cam_vdig-supply = <0x0>; + }; + }; + }; + + fragment@109 { + + __overlay__ { + + qcom,cam-sensor@0 { + actuator-src = <0x0>; + led-flash-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@2 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x2D { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@110 { + + __overlay__ { + + qcom,cam-sensor@1 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@8 { + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vana-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4>; + pinctrl-1 = <0x0 0x4>; + }; + + qcom,cam-sensor@3 { + actuator-src = <0x0>; + eeprom-src = <0x0>; + ois-src = <0x0>; + led-flash-src = <0x0>; + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + cam_vdig-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8>; + pinctrl-1 = <0x0 0x4 0x8>; + }; + + qcom,cam-sensor@4 { + led-flash-src = <0x0>; + eeprom-src = <0x0>; + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + + qcom,eeprom@0x3F { + cam_vio-supply = <0x0>; + pinctrl-0 = <0x0 0x4 0x8 0xc>; + pinctrl-1 = <0x0 0x4 0x8 0xc>; + }; + }; + }; + + fragment@111 { + + __overlay__ { + + qcom,actuator@0xC { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + + qcom,actuator2 { + cam_vio-supply = <0x0>; + cam_vaf-supply = <0x0>; + }; + + qcom,eeprom@50 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@51 { + cam_vio-supply = <0x0>; + }; + + qcom,eeprom@55 { + cam_vaf-supply = <0x0>; + cam_vio-supply = <0x0>; + }; + }; + }; + + fragment@113 { + + __overlay__ { + + hall { + pinctrl-0 = <0x0>; + }; + + certify_hall { + pinctrl-0 = <0x0>; + }; + }; + }; + + fragment@116 { + + __overlay__ { + + i2c@17 { + pinctrl-0 = <0x0>; + + sx9360-i2c@28 { + pinctrl-0 = <0x0>; + }; + }; + }; + }; + + fragment@131 { + + __overlay__ { + + battery { + pinctrl-0 = <0x0>; + }; + }; + }; + }; }; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-input-common.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-input-common.dtsi deleted file mode 100755 index 284a0b4358a0..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-input-common.dtsi +++ /dev/null @@ -1,139 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -&pm6150l_l7 { - regulator-min-microvolt = <3000000>; - regulator-max-microvolt = <3000000>; - regulator-boot-on; -}; - -&tlmm { - tsp_int: tsp_int { - mux { - pins = "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio9"; - input-enable; - bias-disable; - }; - }; -}; - -&qupv3_se7_i2c { - status = "ok"; - synaptics_tcm@20 { - status = "disabled"; - }; - atmel_mxt_ts@4a { - status = "disabled"; - }; - - tsp_zt: touchscreen@20 { - status = "ok"; - compatible = "zinitix,zt_ts_device"; - reg = <0x20>; - pinctrl-names = "on_state", "off_state"; - pinctrl-0 = <&tsp_int>; - pinctrl-1 = <&tsp_int>; - avdd-supply = <&pm6150l_l7>; - zinitix,gpio_ldo_en; - zinitix,irq_type = <0x2008>; - zinitix,x_resolution = <1080>; - zinitix,y_resolution = <2400>; - zinitix,page_size = <0x80>; - zinitix,irq_gpio = <&tlmm 9 0x2008>; - zinitix,chip_name = "ZT7650"; - zinitix,select_lcdid = <0x801000 0x801001 0x801002>; - zinitix,firmware_name = "tsp_zinitix/zt7650_a72.bin", "tsp_zinitix/zt7650_a72.bin", "tsp_zinitix/zt7650_a72_3rd.bin"; - zinitix,spay; - zinitix,aod; - zinitix,aot; - zinitix,mis_cal_check; - support_ear_detect_mode; - support_dex_mode; - zinitix,bringup = <0>; -// zinitix,tclm_level = <0x2>; -// zinitix,afe_base = <0xe>; - zinitix,ss_touch_num = <0x1>; - }; - - tsp_stm: touchscreen@49 { - status = "ok"; - compatible = "stm,fts_touch"; - reg = <0x49>; - pinctrl-names = "default"; - pinctrl-0 = <&tsp_int>; - /* dvdd-supply = <&pm6150_l10>; */ - avdd-supply = <&pm6150l_l7>; - stm,irq_gpio = <&tlmm 9 0x2008>; - stm,max_coords = <4095 4095>; - stm,firmware_name = "tsp_stm/fts5cu56a_a72.bin"; - stm,tclm_level = <2>; - stm,afe_base = <0x7>; - stm,bringup = <0>; - stm,support_fod; - stm,enable_settings_aot; - support_ear_detect; - support_mis_calibration_test; - support_dex_mode; - support_open_short_test; - support_sram_test; -// support_hall_ic; -// support_flex_mode; - stm,ss_touch_num = <1>; -// stm,hw_i2c_reset; - }; -}; - -/delete-node/&key_vol_up_default; -&pm6150l_gpios { - key_vol_up { - key_vol_up_default: key_vol_up_default { - pins = "gpio8"; - function = "normal"; - input-enable; - bias-pull-up; - power-source = <0>; - }; - }; -}; - -/delete-node/&gpio_key; -&gpio_key { - status = "okay"; - compatible = "gpio-keys"; - input-name = "gpio-keys"; - - pinctrl-names = "default"; - pinctrl-0 = <&key_vol_up_default>; - - vol_up { - label = "volume_up"; - gpios = <&pm6150l_gpios 8 0x1>; - linux,input-type = <1>; - linux,code = ; - debounce-interval = <15>; - }; -}; - -&soc { - ss_touch { - compatible = "samsung,ss_touch"; - ss_touch,numbers = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r00.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r00.dts deleted file mode 100755 index 149d047f1323..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r00.dts +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a72q-r00.dtsi" -#include "drivers/atoll-sec-a72q-battery-common.dtsi" - -/ { - model = "Samsung A72Q PROJECT (board-id,00)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 0>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r01.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r01.dts deleted file mode 100755 index 7a330d2597ae..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r01.dts +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a72q-r01.dtsi" -#include "drivers/atoll-sec-a72q-battery-common.dtsi" - -/ { - model = "Samsung A72Q PROJECT REV00 (board-id,01)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 1>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r02.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r02.dts deleted file mode 100755 index 00f1678e15ea..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r02.dts +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a72q-r02.dtsi" -#include "./drivers/atoll-sec-a72q-battery-r02.dtsi" - -/ { - model = "Samsung A72Q PROJECT REV01 (board-id,02)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 2>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r04.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r04.dts deleted file mode 100755 index 6becd235c951..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r04.dts +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a72q-r04.dtsi" -#include "./drivers/atoll-sec-a72q-battery-r02.dtsi" - -/ { - model = "Samsung A72Q PROJECT REV02 (board-id,04)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 4>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r05.dts b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r05.dts deleted file mode 100755 index e14d99245486..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-ltn-overlay-r05.dts +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-a72q-r05.dtsi" -#include "./drivers/atoll-sec-a72q-battery-r02.dtsi" - -/ { - model = "Samsung A72Q PROJECT REV03 (board-id,05)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 5>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r00.dtsi deleted file mode 100755 index 2aae5a783a88..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r00.dtsi +++ /dev/null @@ -1,653 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "drivers/atoll-sec-a72q-audio-pinctrl-common.dtsi" - -&tlmm { - grip_i2c { - grip_i2c_active: grip_i2c_active { - grip_i2c_active { - pins = "gpio51", "gpio52"; - bias-disable; - }; - }; - grip_i2c_suspend: grip_i2c_suspend { - grip_i2c_suspend { - pins = "gpio51", "gpio52"; - bias-disable; - }; - }; - }; - - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - mux { - pins = "gpio25"; - function = "gpio"; - }; - config { - pins = "gpio25"; - drive-strength = <2>; - bias-disable; - }; - }; - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - mux { - pins = "gpio26"; - function = "gpio"; - }; - config { - pins = "gpio26"; - drive-strength = <2>; - bias-disable; - }; - }; - - cam_sensor_mclk0_active: cam_sensor_mclk0_active { - /* Main Rear MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk0_suspend: cam_sensor_mclk0_suspend { - /* Main Rear MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk1_active: cam_sensor_mclk1_active { - /* FRONT MCLK */ - mux { - pins = "gpio23"; - function = "cam_mclk"; - }; - config { - pins = "gpio23"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk1_suspend: cam_sensor_mclk1_suspend { - /* FRONT MCLK */ - mux { - pins = "gpio23"; - function = "cam_mclk"; - }; - config { - pins = "gpio23"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk2_active: cam_sensor_mclk2_active { - /* Tele Cam MCLK */ - mux { - pins = "gpio14"; - function = "cam_mclk"; - }; - config { - pins = "gpio14"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk2_suspend: cam_sensor_mclk2_suspend { - /* Tele Cam MCLK */ - mux { - pins = "gpio14"; - function = "cam_mclk"; - }; - config { - pins = "gpio14"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - - cam_sensor_mclk3_active: cam_sensor_mclk3_active { - /* UW Cam MCLK */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - config { - pins = "gpio15"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk3_suspend: cam_sensor_mclk3_suspend { - /* UW Cam MCLK */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - config { - pins = "gpio15"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - - }; - }; - - cam_sensor_mclk4_active: cam_sensor_mclk4_active { - /* Macro Cam MCLK */ - mux { - pins = "gpio16"; - function = "cam_mclk"; - }; - config { - pins = "gpio16"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk4_suspend: cam_sensor_mclk4_suspend { - /* Macro Cam MCLK */ - mux { - pins = "gpio16"; - function = "cam_mclk"; - }; - config { - pins = "gpio16"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - - }; - }; - - rcam1_sensor_reset_active: rcam1_sensor_reset_active { - /* Main Rear reset */ - mux { - pins = "gpio30"; - function = "gpio"; - }; - config { - pins = "gpio30"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - rcam1_sensor_reset_suspend: rcam1_sensor_reset_suspend { - /* Main Rear reset */ - mux { - pins = "gpio30"; - function = "gpio"; - }; - config { - pins = "gpio30"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - front_sensor_reset_active: front_sensor_reset_active { - /* FRONT RESET */ - mux { - pins = "gpio21"; - function = "gpio"; - }; - config { - pins = "gpio21"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - front_sensor_reset_suspend: front_sensor_reset_suspend { - /* FRONT RESET */ - mux { - pins = "gpio21"; - function = "gpio"; - }; - config { - pins = "gpio21"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam3_sensor_reset_active: rcam3_sensor_reset_active { - /* UW Cam RESET */ - mux { - pins = "gpio29"; - function = "gpio"; - }; - config { - pins = "gpio29"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - rcam3_sensor_reset_suspend: rcam3_sensor_reset_suspend { - /* UW Cam RESET */ - mux { - pins = "gpio29"; - function = "gpio"; - }; - config { - pins = "gpio29"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_reset_active: rcam2_sensor_reset_active { - /* Tele Cam RESET */ - mux { - pins = "gpio42"; - function = "gpio"; - }; - config { - pins = "gpio42"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_reset_suspend: rcam2_sensor_reset_suspend { - /* Tele Cam RESET */ - mux { - pins = "gpio42"; - function = "gpio"; - }; - config { - pins = "gpio42"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - - - rcam4_sensor_reset_active: rcam4_sensor_reset_active { - /* Macro Cam RESET */ - mux { - pins = "gpio24"; - function = "gpio"; - }; - config { - pins = "gpio24"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_reset_suspend: rcam4_sensor_reset_suspend { - /* Macro Cam RESET */ - mux { - pins = "gpio24"; - function = "gpio"; - }; - config { - pins = "gpio24"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam1_sensor_vana_active: rcam1_sensor_vana_active { - /* Rear VANA */ - mux { - pins = "gpio63"; - function = "gpio"; - }; - config { - pins = "gpio63"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - rcam1_sensor_vana_suspend: rcam1_sensor_vana_suspend { - /* Rear VANA */ - mux { - pins = "gpio63"; - function = "gpio"; - }; - config { - pins = "gpio63"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_vana_active: rcam2_sensor_vana_active { - /* Tele VANA */ - mux { - pins = "gpio64"; - function = "gpio"; - }; - config { - pins = "gpio64"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_vana_suspend: rcam2_sensor_vana_suspend { - /* Tele VANA */ - mux { - pins = "gpio64"; - function = "gpio"; - }; - config { - pins = "gpio64"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - - rcam3_sensor_vana_active: rcam3_sensor_vana_active { - /* UW VANA */ - mux { - pins = "gpio65"; - function = "gpio"; - }; - config { - pins = "gpio65"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - rcam3_sensor_vana_suspend: rcam3_sensor_vana_suspend { - /* UW VANA */ - mux { - pins = "gpio65"; - function = "gpio"; - }; - config { - pins = "gpio65"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_vana_active: rcam4_sensor_vana_active { - /* Macro VANA */ - mux { - pins = "gpio74"; - function = "gpio"; - }; - config { - pins = "gpio74"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_vana_suspend: rcam4_sensor_vana_suspend { - /* Macro VANA */ - mux { - pins = "gpio74"; - function = "gpio"; - }; - config { - pins = "gpio74"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_mipi_sel_active: cam_mipi_sel_active { - /* MIPI SEL */ - mux { - pins = "gpio66"; - function = "gpio"; - }; - config { - pins = "gpio66"; - bias-disable; - output-high; - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_mipi_sel_suspend: cam_mipi_sel_suspend { - /* MIPI SEL */ - mux { - pins = "gpio66"; - function = "gpio"; - }; - config { - pins = "gpio66"; - bias-pull-down; - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam3_sensor_vdig_active: rcam3_sensor_vdig_active { - /* UW VDIG */ - mux { - pins = "gpio65"; - function = "gpio"; - }; - config { - pins = "gpio65"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam3_sensor_vdig_suspend: rcam3_sensor_vdig_suspend { - /* UW VDIG */ - mux { - pins = "gpio65"; - function = "gpio"; - }; - config { - pins = "gpio65"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - - rcam4_sensor_vdig_active: rcam4_sensor_vdig_active { - /* Macro VDIG */ - mux { - pins = "gpio74"; - function = "gpio"; - }; - config { - pins = "gpio74"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_vdig_suspend: rcam4_sensor_vdig_suspend { - /* Macro VDIG */ - mux { - pins = "gpio74"; - function = "gpio"; - }; - config { - pins = "gpio74"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - if_pmic_i2c_pins: if_pmic_i2c_pins { - if_pmic_i2c_sleep: if_pmic_i2c_sleep { - mux { - pins = "gpio115", "gpio116"; - function = "gpio"; - }; - - config { - pins = "gpio115", "gpio116"; - drive-strength = <2>; - input-enable; - bias-disable; - }; - }; - }; - - usbpd_i2c_pins: usbpd_i2c_pins { - usbpd_i2c_sleep: usbpd_i2c_sleep { - mux { - pins = "gpio53", "gpio54"; - function = "gpio"; - }; - - config { - pins = "gpio53", "gpio54"; - drive-strength = <2>; - input-enable; - bias-disable; - }; - }; - }; - - mcu_reset_active: mcu_reset_active { - /* MCU Reset */ - mux { - pins = "gpio32"; - function = "gpio"; - }; - config { - pins = "gpio32"; - bias-disable; /* No PULL */ - //output-high; - drive-strength = <2>; /* 2 MA */ - }; - }; - - mcu_reset_suspend: mcu_reset_suspend { - /* MCU Reset */ - mux { - pins = "gpio32"; - function = "gpio"; - }; - config { - pins = "gpio32"; - bias-pull-down; /* PULL DOWN */ - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; - - mcu_clk_active: mcu_clk_active { - /* MCU CLK */ - mux { - pins = "gpio43"; - function = "gpio"; - }; - config { - pins = "gpio43"; - bias-disable; /* No PULL */ - //output-high; - drive-strength = <2>; /* 2 MA */ - }; - }; - - mcu_clk_suspend: mcu_clk_suspend { - /* MCU Reset */ - mux { - pins = "gpio43"; - function = "gpio"; - }; - config { - pins = "gpio43"; - bias-pull-down; /* PULL DOWN */ - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; -}; - -&pm6150l_gpios { - grip_int_active: grip_int_active { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_int_suspend: grip_int_suspend { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; - -&tlmm { - wakeup-disabled-gpios = < - 0 /* SPI : NFC_ESE_MISO */ - 6 /* I2C : TSP_SDA_1P8 */ - 16 /* MCLK : RCAM4_MCLK */ - 21 /* RST_N : FCAM_RST_N */ - 22 /* EN : CAM_FLASH_EN */ - 23 /* MCLK : FCAM_MCLK */ - 24 /* RST_N : RCAM4_RST_N */ - 26 /* I2C : CAM_PMIC_I2C_SCL_1P8 */ - 28 /* I2C : FCAM_RCAM2_RCAM4_SENSOR_I2C_SCL_1P8 */ - 30 /* RST_N : RCAM1_RST_N */ - 34 /* I2C : NFC_SDA_1P8 */ - 37 /* LAGOON : NFC_IRQ */ - 42 /* RST_N : RCAM2_RST_N */ - 45 /* UART : AP_UART_RXD */ - 47 /* I2C : CAM_AF_EEP_I2C_SCL_1P8 */ - 52 /* I2C : GRIP_SCL_1P8 */ - 53 /* I2C : CC_SDA_1P8 */ - 55 /* NC : NC */ - 56 /* NC : NC */ - 57 /* NC : NC */ - 58 /* RST_N : CODEC_RST_N */ - 59 /* SPI : BTP_SPI_MISO */ - 62 /* SPI : BTP_SPI_CS_N */ - 63 /* EN : RCAM1_LDO_EN */ - 64 /* EN : RCAM2_LDO_EN */ - 65 /* EN : RCAM3_LDO_EN */ - 67 /* EN : BTP_LDO_EN */ - 68 /* EN : NFC_LDO_EN */ - 74 /* EN : RCAM4_LDO_EN */ - 78 /* NC : NC */ - 84 /* EN : FM_LNA_EN */ - 86 /* I2C : AP_MCU_SDA_1P8 */ - 87 /* I2C : AP_MCU_SCL_1P8 */ - 88 /* I2C : SPK_AMP_SDA_1P8 */ - 89 /* I2C : SPK_AMP_SCL_1P8 */ - 91 /* RST_N : BTP_RST_N */ - 94 /* EN : SPK_AMP_EN */ - 115 /* I2C : IF_PMIC_SDA_1P8 */ - 116 /* I2C : IF_PMIC_SCL_1P8 */ - 118 /* EN : NFC_ESE_EN */ - >; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r01.dtsi deleted file mode 100755 index b54a754100ef..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r01.dtsi +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - wakeup-disabled-gpios = < - 0 /* SPI : NFC_ESE_MISO */ - 6 /* I2C : TSP_SDA_1P8 */ - 16 /* MCLK : RCAM4_MCLK */ - 21 /* RST_N : FCAM_RST_N */ - 22 /* EN : CAM_FLASH_EN */ - 23 /* MCLK : FCAM_MCLK */ - 24 /* RST_N : RCAM4_RST_N */ - 26 /* I2C : CAM_PMIC_I2C_SCL_1P8 */ - 28 /* I2C : FCAM_RCAM2_RCAM4_SENSOR_I2C_SCL_1P8 */ - 30 /* RST_N : RCAM1_RST_N */ - 34 /* I2C : NFC_SDA_1P8 */ - 37 /* LAGOON : NFC_IRQ */ - 42 /* RST_N : RCAM2_RST_N */ - 45 /* UART : AP_UART_RXD */ - 47 /* I2C : CAM_AF_EEP_I2C_SCL_1P8 */ - 52 /* I2C : GRIP_SCL_1P8 */ - 53 /* I2C : CC_SDA_1P8 */ - 55 /* NC : NC */ - 56 /* NC : NC */ - 57 /* NC : NC */ - 58 /* RST_N : CODEC_RST_N */ - 59 /* SPI : BTP_SPI_MISO */ - 62 /* SPI : BTP_SPI_CS_N */ - 63 /* EN : RCAM1_LDO_EN */ - 64 /* EN : RCAM2_LDO_EN */ - 65 /* EN : RCAM3_LDO_EN */ - 67 /* EN : CAM_TORCH_EN */ - 68 /* EN : NFC_LDO_EN */ - 74 /* EN : RCAM4_LDO_EN */ - 78 /* NC : NC */ - 84 /* EN : FM_LNA_EN */ - 86 /* I2C : AP_MCU_SDA_1P8 */ - 87 /* I2C : AP_MCU_SCL_1P8 */ - 88 /* I2C : SPK_AMP_SDA_1P8 */ - 89 /* I2C : SPK_AMP_SCL_1P8 */ - 91 /* RST_N : BTP_RST_N */ - 94 /* EN : SPK_AMP_EN */ - 115 /* I2C : IF_PMIC_SDA_1P8 */ - 116 /* I2C : IF_PMIC_SCL_1P8 */ - 118 /* EN : NFC_ESE_EN */ - >; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r02.dtsi deleted file mode 100755 index e1cf2740a3bc..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r02.dtsi +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - wakeup-disabled-gpios = < - 0 /* NC : NC */ - 3 /* NC : NC */ - 6 /* I2C : TSP_SDA_1P8 */ - 16 /* MCLK : RCAM4_MCLK */ - 21 /* RST_N : FCAM_RST_N */ - 22 /* EN : CAM_FLASH_EN */ - 23 /* MCLK : FCAM_MCLK */ - 24 /* RST_N : RCAM4_RST_N */ - 26 /* I2C : CAM_PMIC_I2C_SCL_1P8 */ - 28 /* I2C : FCAM_RCAM2_RCAM4_SENSOR_I2C_SCL_1P8 */ - 30 /* RST_N : RCAM1_RST_N */ - 34 /* I2C : NFC_SDA_1P8 */ - 37 /* LAGOON : NFC_IRQ */ - 42 /* RST_N : RCAM2_RST_N */ - 45 /* UART : AP_UART_RXD */ - 47 /* I2C : CAM_AF_EEP_I2C_SCL_1P8 */ - 52 /* I2C : GRIP_SCL_1P8 */ - 53 /* I2C : CC_SDA_1P8 */ - 55 /* NC : NC */ - 56 /* NC : NC */ - 57 /* NC : NC */ - 58 /* RST_N : CODEC_RST_N */ - 59 /* SPI : BTP_SPI_MISO */ - 62 /* SPI : BTP_SPI_CS_N */ - 63 /* EN : RCAM1_LDO_EN */ - 64 /* EN : RCAM2_LDO_EN */ - 65 /* EN : RCAM3_LDO_EN */ - 67 /* EN : CAM_TORCH_EN */ - 68 /* EN : NFC_LDO_EN */ - 74 /* EN : RCAM4_LDO_EN */ - 78 /* NC : NC */ - 84 /* EN : FM_LNA_EN */ - 86 /* I2C : AP_MCU_SDA_1P8 */ - 87 /* I2C : AP_MCU_SCL_1P8 */ - 88 /* I2C : SPK_AMP_SDA_1P8 */ - 89 /* I2C : SPK_AMP_SCL_1P8 */ - 91 /* RST_N : BTP_RST_N */ - 94 /* EN : SPK_AMP_EN */ - 115 /* I2C : IF_PMIC_SDA_1P8 */ - 116 /* I2C : IF_PMIC_SCL_1P8 */ - 118 /* NC : NC */ - >; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r04.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r04.dtsi deleted file mode 100755 index aff692515b33..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r04.dtsi +++ /dev/null @@ -1,15 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r05.dtsi deleted file mode 100755 index 996af44afdfe..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pinctrl-r05.dtsi +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - wakeup-disabled-gpios = < - 0 /* NC : NC */ - 3 /* NC : NC */ - 6 /* I2C : TSP_SDA_1P8 */ - 16 /* MCLK : RCAM4_MCLK */ - 21 /* RST_N : FCAM_RST_N */ - 22 /* EN : CAM_FLASH_EN */ - 23 /* MCLK : FCAM_MCLK */ - 24 /* RST_N : RCAM4_RST_N */ - 26 /* I2C : CAM_PMIC_I2C_SCL_1P8 */ - 28 /* I2C : FCAM_RCAM2_RCAM4_SENSOR_I2C_SCL_1P8 */ - 30 /* RST_N : RCAM1_RST_N */ - 34 /* I2C : NFC_SDA_1P8 */ - 37 /* LAGOON : NFC_IRQ */ - 42 /* RST_N : RCAM2_RST_N */ - 45 /* UART : AP_UART_RXD */ - 47 /* I2C : CAM_AF_EEP_I2C_SCL_1P8 */ - 52 /* I2C : GRIP_SCL_1P8 */ - 53 /* I2C : CC_SDA_1P8 */ - 55 /* NC : NC */ - 56 /* NC : NC */ - 57 /* EN : MOT_EN */ - 58 /* RST_N : CODEC_RST_N */ - 59 /* SPI : BTP_SPI_MISO */ - 62 /* SPI : BTP_SPI_CS_N */ - 63 /* EN : RCAM1_LDO_EN */ - 64 /* EN : RCAM2_LDO_EN */ - 65 /* EN : RCAM3_LDO_EN */ - 67 /* EN : CAM_TORCH_EN */ - 68 /* EN : NFC_LDO_EN */ - 74 /* EN : RCAM4_LDO_EN */ - 78 /* NC : NC */ - 84 /* EN : FM_LNA_EN */ - 86 /* I2C : AP_MCU_SDA_1P8 */ - 87 /* I2C : AP_MCU_SCL_1P8 */ - 88 /* I2C : SPK_AMP_SDA_1P8 */ - 89 /* I2C : SPK_AMP_SCL_1P8 */ - 91 /* RST_N : BTP_RST_N */ - 94 /* EN : SPK_AMP_EN */ - 115 /* I2C : IF_PMIC_SDA_1P8 */ - 116 /* I2C : IF_PMIC_SCL_1P8 */ - 118 /* NC : NC */ - >; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pm-common.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pm-common.dtsi deleted file mode 100755 index b7a8ed03c39e..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-pm-common.dtsi +++ /dev/null @@ -1,169 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-pm-common.dtsi" - -&soc { - /* AP Thermistor table */ - sec_thermistor@0 { - compatible = "samsung,sec-ap-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "ap_therm"; - adc_array = <1806 2208 2620 3076 3638 4355 5223 - 6133 7170 8378 9652 11107 12609 - 14233 15644 17608 19255 20912 22081 23487 24556 25655 26345>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* PA Thermistor table */ - sec_thermistor@1 { - compatible = "samsung,sec-pa-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "pa_therm"; - adc_array = <1861 2268 2690 3132 3730 4397 5278 - 6198 7233 8479 9782 11209 12707 - 14338 15719 17722 19343 20876 22320 23575 24750 25730 26411>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* WiFi Thermistor table */ - sec_thermistor@2 { - compatible = "samsung,sec-wf-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - io-channel-names = "wf_therm"; - adc_array = <1875 2270 2703 3149 3738 4416 5279 - 6205 7252 8470 9774 11227 12737 - 14358 15740 17754 19334 20932 22258 23619 24773 25779 26501>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 25 0 /* sda */ - &tlmm 26 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1000000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1000000>; - regulator-max-microvolt = <1100000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1100000>; - regulator-max-microvolt = <1100000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2900000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2900000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2900000>; - }; - }; - }; - }; -}; - -&pm6150_gpios { - interrupts = <0x0 0xc0 0 IRQ_TYPE_NONE>, - <0x0 0xc1 0 IRQ_TYPE_NONE>, - <0x0 0xc2 0 IRQ_TYPE_NONE>, - <0x0 0xc3 0 IRQ_TYPE_NONE>, - <0x0 0xc4 0 IRQ_TYPE_NONE>, - <0x0 0xc6 0 IRQ_TYPE_NONE>, - <0x0 0xc7 0 IRQ_TYPE_NONE>, - <0x0 0xc9 0 IRQ_TYPE_NONE>; - interrupt-names = "pm6150_gpio1", "pm6150_gpio2", - "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio5", - "pm6150_gpio7", "pm6150_gpio8", - "pm6150_gpio10"; - qcom,gpios-disallowed = <6 9>; -}; - -&pm6150_vadc { - ap_therm { - reg = ; - label = "ap_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - }; -}; - -&pm6150l_vadc { - /delete-node/ pa_therm0; - - pa_therm { - reg = ; - label = "pa_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - }; - - wf_therm { - reg = ; - label = "wf_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r00.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r00.dtsi deleted file mode 100755 index 5980baedc0ee..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r00.dtsi +++ /dev/null @@ -1,99 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-a72q-common.dtsi" -#include "drivers/atoll-sec-a72q-audio-common.dtsi" -#include "atoll-sec-a72q-pinctrl-r00.dtsi" -#include "atoll-sec-a72q-pm-common.dtsi" -#include "drivers/atoll-sec-a72q-display-r00.dtsi" -#include "atoll-sec-a72q-input-common.dtsi" -#include "drivers/atoll-sec-a72q-usb-r00.dtsi" -#include "drivers/atoll-sec-a52q-nfc_r00.dtsi" -#include "drivers/atoll-sec-a72q-fingerprint-r00.dtsi" -#include "drivers/atoll-sec-a72q-camera-sensor-common.dtsi" -#include "drivers/atoll-sec-a72q-vibrator-r00.dtsi" -#include "drivers/atoll-sec-a72q-hall-r00.dtsi" - -#include - -&soc { - rpmh-regulator-ldoc8 { - - compatible = "qcom,rpmh-vrm-regulator"; - mboxes = <&apps_rsc 0>; - qcom,resource-name = "ldoc8"; - qcom,regulator-type = "pmic5-ldo"; - qcom,supported-modes = - ; - qcom,mode-threshold-currents = <0 1>; - L8C: - pm6150l_l8: regulator-pm6150l-l8 { - regulator-name = "pm6150l_l8"; - qcom,set = ; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - qcom,init-voltage = <1800000>; - regulator-always-on; - qcom,init-mode = - ; - }; - }; - - //Grip Sensor Vdd - rpmh-regulator-ldoa5 { - pm6150_l5: regulator-pm6150-l5 { - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; - regulator-always-on; - }; - }; - - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = <&tlmm 51 0 /* sda */ - &tlmm 52 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_i2c_active>; - - sx9360-i2c@28 { - compatible = "sx9360"; - reg = <0x28>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_int_active>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - sx9360,nirq-gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_LOW>; - sx9360,reggnrlctrl2_reg = <0x32>; /* scanperiod: 102ms */ - sx9360,againfreq_reg = <0x38>; /* freq : 62.5 kHz, again : +/-5.25 pF */ - sx9360,refagainfreq_reg = <0x36>; /* reference phase again : 5.25 pF, sampling freq : 83.33 khz */ - sx9360,gainrawfilt_reg = <0x1A>; /* gain: x4, rawfilt : 1-1/4 */ - sx9360,refgainrawfilt_reg = <0x22>; /* reference phase gain: x8, rawfilt : 1-1/4 */ - sx9360,proxthresh_reg = <0x22>; /* threshold: 614 */ - sx9360,hyst_reg = <0x15>; /* hysteresis: small, closedeb: 2 samples, fardeb: 2 samples */ - sx9360,regproxctrl3_reg = <0x0C>; /* AVGPOSFILT: 1/256, AVGNEGFILT: 1/2 */ - sx9360,resolution_reg = <0x0F>; /* resolution: 1204 */ - sx9360,refresolution_reg = <0x0F>; /* reference phase resolution: 1204 */ - sx9360,hallic_cert_detect = <1>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r01.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r01.dtsi deleted file mode 100755 index a784a291c9a6..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r01.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-a72q-r00.dtsi" -#include "atoll-sec-a72q-pinctrl-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r02.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r02.dtsi deleted file mode 100755 index 468e9134e8ce..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r02.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-a72q-r01.dtsi" -#include "atoll-sec-a72q-pinctrl-r02.dtsi" -#include "drivers/atoll-sec-a72q-camera-sensor-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r04.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r04.dtsi deleted file mode 100755 index eeb87dbbee6c..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r04.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-a72q-r02.dtsi" -#include "atoll-sec-a72q-pinctrl-r04.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r05.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r05.dtsi deleted file mode 100755 index 96036a3eae30..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-a72q-r05.dtsi +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-a72q-r04.dtsi" -#include "atoll-sec-a72q-pinctrl-r05.dtsi" - -/delete-node/ &vibrator; - -&soc { - msm_vibrator { - compatible = "vibrator"; - motor-vdd_type = <0>; /* 0: gpio, 1: pmic */ - motor-en = <&tlmm 57 0x0>; - samsung,vib_type = "COINDC"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-common.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-common.dtsi deleted file mode 100755 index 9922ae25a7bc..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-common.dtsi +++ /dev/null @@ -1,430 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -#include "../qcom/atoll-idp.dtsi" -#include "../qcom/atoll-audio-overlay.dtsi" - -#include "atoll-sec-uart-common.dtsi" -#include "atoll-sec-dcc-common.dtsi" - -&reserved_memory { - ss_plog@B4400000 { - compatible = "ss_plog"; - no-map; - reg = <0x0 0xB4400000 0x0 0x00200000>; - }; - - ramoops@B4600000 { - compatible = "ramoops"; - reg = <0 0xB4600000 0 0x100000>; - record-size = <0x40000>; - console-size = <0x40000>; - ftrace-size = <0x40000>; - pmsg-size = <0x40000>; - }; - - /* CONFIG_SEC_DEBUG reserves 8MB */ - sec_debug_region: sec_debug_region@0 { - compatible = "removed-dma-pool"; - no-map; - reg = <0x0 0xB4700000 0x0 0x00800000>; - }; - - /* sec_debug_low_region reserves 4MB - This region is reserved if only debuglevel low */ - /* FIXME: - sec_debug_low_region: sec_debug_low_region@0 { - compatible = "removed-dma-pool"; - no-map; - reg = <0x0 0xB1400000 0x0 0x00400000>; - }; - */ - - sec_debug_autocomment: sec_debug_autocomment@0 { - compatible = "removed-dma-pool"; - no-map; - reg = <0x0 0xB4F00000 0x0 0x00001000>; - }; - - sec_debug_rdx_bootdev: sec_debug_rdx_bootdev@0 { - no-ship; - reg = <0x1 0x00000000 0x0 0x05900000>; - }; - - /* Kaslr offset reserve */ - kaslr_region: kaslr_region@A0001000 { - compatible = "removed-dma-pool"; - reg = <0x0 0xA0001000 0x0 0x00001000>; - }; - - /* rkp_region reserves 2MB for UH_LOG and UH_STATIC_HEAP */ - /* CAUSION: DO NOT reserve 0xB0200000 ~ 0xB1800000 region for RKP at the runtime */ - rkp_region: rkp_region@B0200000 { - compatible = "removed-dma-pool"; - reg = <0x0 0xB0200000 0x0 0x00200000>; - }; - - hdm_region: hdm_region@A1000000 { - compatible = "removed-dma-pool"; - no-map; - reg = <0x0 0xA1000000 0x0 0x1000>; - }; - - modem_shared_mem: modem_shared_mem_region@B5000000 { - compatible = "modem-removed-dma-pool"; - no-map; - reg = <0x0 0xb5000000 0x0 0x06000000>; - }; -}; - -&removed_region { - reg = <0 0x80B00000 0 0x7100000>; -}; - -&pil_modem_mem { - reg = <0 0x8B000000 0 0x8900000>; -}; - -&pil_adsp_mem { - reg = <0 0x93C00000 0 0x3E00000>; -}; - -&pil_camera_mem { - reg = <0 0x97A00000 0 0x500000>; -}; - -&pil_npu_mem { - reg = <0 0x97F00000 0 0x500000>; -}; - -&pil_video_mem { - reg = <0 0x98400000 0 0x500000>; -}; - -&pil_cdsp_mem { - reg = <0 0x98900000 0 0x1E00000>; -}; - -&qseecom_mem { - reg = <0 0x9e000000 0 0x2000000>; -}; - -&qseecom_ta_mem { - size = <0 0x2000000>; -}; - -/* disable QC CDSPsec memory region and the related ION heap */ -&secure_carveout_heap { - status = "disabled"; -}; -&cdsp_sec_mem { - status = "disabled"; -}; - -&msm_imem { - upload_cause@66c { - compatible = "qcom,msm-imem-upload_cause"; - reg = <0x66c 4>; - }; -}; - -&camera { - status = "ok"; -}; - -&cam_vfe0 { - status = "ok"; -}; - -&cam_vfe1 { - status = "ok"; -}; - -&cam_vfe_lite { - status = "ok"; -}; - -&cam_lrme { - status = "ok"; -}; - -&shared_meta { - status = "ok"; -}; - -&android_q_fstab { - status = "ok"; -}; - -&pm8008_8 { - status = "ok"; -}; - -&pm8008_9 { - status = "ok"; -}; - -&usb0 { - dwc3@a600000 { - maximum-speed = "high-speed"; - }; -}; - -&soc { - input_booster { - status = "okay"; - compatible = "input_booster"; - #address-cells = <1>; - #size-cells = <0>; - - booster_key@1 { - input_booster,label = "KEY"; - input_booster,type = <0>; /* BOOSTER_DEVICE_KEY */ - - input_booster,levels = <1>; - - /* Frequency table */ - /* for level : 1_Head */ - input_booster,cpu_freqs = <1267200>; - input_booster,hmp_boost = <2>; - input_booster,ddr_freqs = <0>; - input_booster,lpm_bias = <0>; - - /* Time table */ - input_booster,head_times = <200>; - input_booster,tail_times = <0>; - }; - booster_key@2 { - input_booster,label = "TOUCHKEY"; - input_booster,type = <1>; /* BOOSTER_DEVICE_TOUCHKEY */ - - input_booster,levels = <1>; - - /* Frequency table */ - /* for level : 1_Head */ - input_booster,cpu_freqs = <1267200>; - input_booster,hmp_boost = <2>; - input_booster,ddr_freqs = <0>; - input_booster,lpm_bias = <0>; - - /* Time table */ - input_booster,head_times = <0>; - input_booster,tail_times = <300>; - }; - booster_key@3 { - input_booster,label = "TOUCH"; - input_booster,type = <2>; /* BOOSTER_DEVICE_TOUCH */ - - input_booster,levels = <1 2 3>; - - /* Frequency table */ - /* for level : 1_Head, 2_Head, 2_Tail */ - input_booster,cpu_freqs = <1267200 1267200 1113600>; - input_booster,hmp_boost = <2 2 2>; - input_booster,ddr_freqs = <1017 1017 1017>; - input_booster,lpm_bias = <5 5 5>; - - /* Time table */ - input_booster,head_times = <200 200 0>; - input_booster,tail_times = <0 0 300>; - }; - booster_key@4 { // Input Booster + - input_booster,label = "MULTITOUCH"; - input_booster,type = <3>; /* BOOSTER_DEVICE_MULTITOUCH */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1267200 0>; - input_booster,hmp_boost = <2 0>; - input_booster,ddr_freqs = <0 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <1000 0>; - input_booster,tail_times = <0 500>; - }; - booster_key@5 { - input_booster,label = "KEYBOARD"; - input_booster,type = <4>; /* BOOSTER_DEVICE_KEYBOARD */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head, 2_Tail */ - input_booster,cpu_freqs = <1267200 1267200>; - input_booster,hmp_boost = <2 2>; - input_booster,ddr_freqs = <0 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <130 130>; - input_booster,tail_times = <0 0>; - }; - booster_key@6 { - input_booster,label = "MOUSE"; - input_booster,type = <5>; /* BOOSTER_DEVICE_MOUSE */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1267200 1113600>; - input_booster,hmp_boost = <2 0>; - input_booster,ddr_freqs = <0 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <200 0>; - input_booster,tail_times = <0 300>; - }; - booster_key@7 { - input_booster,label = "MOUSE WHEEL"; - input_booster,type = <6>; /* BOOSTER_DEVICE_MOUSE */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1267200 0>; - input_booster,hmp_boost = <2 0>; - input_booster,ddr_freqs = <0 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <200 0>; - input_booster,tail_times = <0 0>; - }; - booster_key@8 { - input_booster,label = "PEN HOVER"; - input_booster,type = <7>; /* BOOSTER_DEVICE_MOUSE */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1267200 1113600>; - input_booster,hmp_boost = <2 0>; - input_booster,ddr_freqs = <0 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <200 0>; - input_booster,tail_times = <0 300>; - }; - booster_key@9 { - input_booster,label = "PEN"; - input_booster,type = <8>; /* BOOSTER_DEVICE_MOUSE */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1555200 1113600>; - input_booster,hmp_boost = <2 2>; - input_booster,ddr_freqs = <0 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <200 0>; - input_booster,tail_times = <0 600>; - }; // Input Booster - - booster_key@10 { - input_booster,label = "KEY_TWO"; - input_booster,type = <9>; /* BOOSTER_DEVICE_KEY */ - - input_booster,levels = <1>; - - /* Frequency table */ - /* for level : 1_Head */ - input_booster,cpu_freqs = <1555200>; - input_booster,hmp_boost = <2>; - input_booster,ddr_freqs = <0>; - input_booster,lpm_bias = <0>; - - /* Time table */ - input_booster,head_times = <700>; - input_booster,tail_times = <700>; - }; - // Input Booster - - /* If you need to add new key type, add it this position */ - }; - - sec_smem@0 { - compatible = "samsung,sec-smem"; - status = "okay"; - }; - - qcom,memshare { - compatible = "qcom,memshare"; - - qcom,client_4 { - compatible = "qcom,memshare-peripheral"; - memory-region = <&modem_shared_mem>; - qcom,peripheral-size = <0x02000000>; - qcom,reserved-size = <0x04000000>; - qcom,client-id = <3>; - qcom,allocate-boot-time; - label = "modem"; - }; - }; - - samsung,sec_misc { - qfprom_jtag,reg = <0x00780180>; - }; - - usb_noti: usb-notifier { - compatible = "samsung,usb-notifier"; - qcom,disable_control_en = <1>; - qcom,unsupport_host_en = <0>; - }; - - samsung,sec_hdm { - memory-region = <&hdm_region>; - }; -}; - -&firmware { - android { - vbmeta { - compatible = "android,vbmeta"; - parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_system,recovery,dtbo,abl,xbl,tz,hyp"; - }; - }; -}; - -&pil_modem { - /* Outputs to mss */ - qcom,smem-states = <&modem_smp2p_out 0>, <&modem_smp2p_out 4>, <&modem_smp2p_out 5>; - qcom,smem-state-names = "qcom,force-stop", "qcom,stop-reason-0", "qcom,stop-reason-1"; -}; - -&icnss { - vdd-3.3-ch1-supply = <>; -}; - -&dsi_rm69299_visionox_amoled_vid_display { - qcom,dsi-display-active; -}; - -&tx_swr_gpios { - qcom,chip-wakeup-reg = <0x01FFB000>; - qcom,chip-wakeup-maskbit = <0>; - qcom,chip-wakeup-default-val = <0x1>; -}; - -&ufshc_mem { - spm-level = <3>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-dcc-common.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-dcc-common.dtsi deleted file mode 100755 index 5932e19977ef..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-dcc-common.dtsi +++ /dev/null @@ -1,1328 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - - -/* config_atoll_dcc_gemnoc() */ -#define config_atoll_dcc_gemnoc \ - \ - /* Gladiator */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* GEMNOC Registers */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_atoll_dcc_noc_err_regs() */ -#define config_atoll_dcc_noc_err_regs \ - \ - /* CNOC */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - \ - /* SNOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* AGGNOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* MNOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* GEM_NOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* DC_NOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* LPASS AGGNOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* SNOC_CENTER_NIU_STATUS_SBM0_SENSEIN */ \ - , \ - \ - /* SNOC_CENTER_NIU_STATUS_SBM1_SENSEIN */ \ - , \ - \ - /* SNOC_CENTER_SBM_SENSEIN */ \ - , \ - \ - /* SNOC_MONAQ_NIU_STATUS_SBM_SENSEIN */ \ - , \ - \ - /* SNOC_WEST_NIU_STATUS_SBM_SENSEIN */ \ - , \ - \ - /* A1NOC_MONAQ_SBM_SENSEIN */ \ - , \ - \ - /* A1NOC_WEST_SBM_SENSEIN */ \ - , \ - \ - /* CNOC_CENTER_STATUS_SBM_SENSEIN */ \ - /* , */ \ - \ - /* CNOC_MMNOC_STATUS_SBM_SENSEIN */ \ - /* , */ \ - \ - /* CNOC_WEST_STATUS_SBM_SENSEIN */ \ - /* , */ \ - \ - /* DC_NOC_DISABLE_SBM_SENSEIN */ \ - , \ - \ - /* GEM_NOC_SBM_MDSP_SAFE_SHAPING_SENSEIN */ \ - , \ - \ - /* LPASS_AG_NOC_SIDEBANDMANAGERSTATUS_MAIN_SIDEBANDMANAGER_SENSEIN */ \ - , \ - \ - /* NPU_SB_SENSEIN */ \ - - -/* config_atoll_dcc_shrm() */ -#define config_atoll_dcc_shrm \ - \ - /* SHRM CSR */ \ - , \ - /* , */ \ - - -/* config_atoll_dcc_rscc_apps() */ -#define config_atoll_dcc_rscc_apps \ - \ - /* RSC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* RSC-TCS */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_atoll_dcc_lpm() */ -#define config_atoll_dcc_lpm \ - \ - /* LPM_Registers */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_atoll_dcc_rscc_lpass() */ -#define config_atoll_dcc_rscc_lpass \ - \ - /* RSCp */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* RSCc */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* Q6_Status */ \ - , \ - \ - /* PDC registers */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_atoll_dcc_rscc_modem() */ -#define config_atoll_dcc_rscc_modem \ - \ - /* RSCp */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* RSCc */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* Q6 status */ \ - , \ - , \ - \ - /* PDC registers */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_atoll_dcc_rscc_cdsp() */ -#define config_atoll_dcc_rscc_cdsp \ - \ - /* RSCp */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* RSCc_CDSP */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* Q6 Status */ \ - , \ - \ - /* PDC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_atoll_dcc_memnoc_mccc() */ -#define config_atoll_dcc_memnoc_mccc \ - \ - /* MCCC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_atoll_dcc_osm() */ -#define config_atoll_dcc_osm \ - \ - /* APSS_OSM */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_atoll_dcc_ddr() */ -#define config_atoll_dcc_ddr \ - \ - /* DDR GEMNOC TR PEnding status */ \ - , \ - \ - /* LLCC Registers */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* LLCC0_LLCC_FEWC_FIFO_STATUS */ \ - , \ - \ - /* DDR CLK registers */ \ - , \ - , \ - , \ - - -/* config_atoll_dcc_cabo_llcc_shrm() */ -#define config_atoll_dcc_cabo_llcc_shrm \ - \ - /* LLCC/CABO */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* LLCC Broadcast */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_atoll_dcc_cx_mx() */ -#define config_atoll_dcc_cx_mx \ - \ - /* CX_MX */ \ - , \ - , \ - \ - /* APC Voltage */ \ - , \ - , \ - \ - /* APC / MX CORNER */ \ - , \ - \ - /* CPRH */ \ - , \ - - -/* config_atoll_dcc_gcc_regs() */ -#define config_atoll_dcc_gcc_regs \ - \ - /* GCC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* AOSS_CC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_atoll_dcc_bcm_seq_hang() */ -#define config_atoll_dcc_bcm_seq_hang \ - \ - /* GOLD */ \ - - -/* config_atoll_dcc_pll() */ -#define config_atoll_dcc_pll \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_atoll_dcc_tsens_regs() */ -#define config_atoll_dcc_tsens_regs \ - , \ - , \ - , \ - - -/* config_atoll_dcc_gpu() */ -#define config_atoll_dcc_gpu \ - \ - /* GCC */ \ - , \ - , \ - , \ - , \ - , \ - \ - /* GPUCC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_atoll_dcc_gic() */ -#define config_atoll_dcc_gic \ - - -&dcc { - dcc_curr_link@3 { - qcom,curr-link-list = <3>; - qcom,data-sink = "sram"; - qcom,link-list = - config_atoll_dcc_lpm, - config_atoll_dcc_osm, - config_atoll_dcc_gemnoc, - config_atoll_dcc_noc_err_regs, - config_atoll_dcc_shrm, - config_atoll_dcc_cabo_llcc_shrm, - /* config_atoll_dcc_memnoc_mccc, */ - config_atoll_dcc_cx_mx, - config_atoll_dcc_gcc_regs, - config_atoll_dcc_bcm_seq_hang, - config_atoll_dcc_pll, - config_atoll_dcc_ddr, - config_atoll_dcc_tsens_regs, - config_atoll_dcc_rscc_apps, - config_atoll_dcc_gpu, - config_atoll_dcc_rscc_lpass, - config_atoll_dcc_rscc_modem, - config_atoll_dcc_rscc_cdsp, - config_atoll_dcc_gic; - }; - -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-common.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-common.dtsi deleted file mode 100755 index bd3717929cfc..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-common.dtsi +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-m42q-input-common.dtsi" - -&reserved_memory { - -}; - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r00.dts b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r00.dts deleted file mode 100755 index 7fa8836bc36b..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r00.dts +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-m42q-r00.dtsi" -#include "drivers/atoll-sec-m42q-battery-common.dtsi" -#include "drivers/atoll-sec-m42q-fingerprint-r00.dtsi" - -/ { - model = "Samsung M42Q PROJECT BRINGUP (board-id,00)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 0>; - dtbo-version = <0>; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r01.dts b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r01.dts deleted file mode 100755 index 4c4794642aa6..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r01.dts +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-m42q-r01.dtsi" -#include "drivers/atoll-sec-m42q-battery-common.dtsi" -#include "drivers/atoll-sec-m42q-fingerprint-r00.dtsi" - -/ { - model = "Samsung M42Q PROJECT DV1 REV00 (board-id,01)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 1>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r02.dts b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r02.dts deleted file mode 100755 index e9ac1f8c76f6..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r02.dts +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-m42q-r02.dtsi" -#include "drivers/atoll-sec-m42q-battery-r02.dtsi" -#include "drivers/atoll-sec-m42q-fingerprint-r00.dtsi" - -/ { - model = "Samsung M42Q PROJECT DV2 REV01 (board-id,02)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 2>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r04.dts b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r04.dts deleted file mode 100755 index 014f4e9863bc..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r04.dts +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-m42q-r04.dtsi" -#include "drivers/atoll-sec-m42q-battery-r02.dtsi" -#include "drivers/atoll-sec-m42q-fingerprint-r00.dtsi" - -/ { - model = "Samsung M42Q PROJECT REV02 (board-id,04)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 4>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r05.dts b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r05.dts deleted file mode 100755 index 148e02dea41c..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r05.dts +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-m42q-r05.dtsi" -#include "drivers/atoll-sec-m42q-battery-r02.dtsi" -#include "drivers/atoll-sec-m42q-fingerprint-r00.dtsi" - -/ { - model = "Samsung M42Q PROJECT REV03 (board-id,05)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 5>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r06.dts b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r06.dts deleted file mode 100755 index 6694f380579d..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-eur-overlay-r06.dts +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-m42q-r06.dtsi" -#include "drivers/atoll-sec-m42q-battery-r02.dtsi" -#include "drivers/atoll-sec-m42q-fingerprint-r00.dtsi" - -/ { - model = "Samsung M42Q PROJECT REV03A (board-id,06)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 6>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-input-common.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-input-common.dtsi deleted file mode 100755 index bbac12ab9906..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-input-common.dtsi +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -&pm6150l_l7 { - regulator-min-microvolt = <3000000>; - regulator-max-microvolt = <3000000>; - regulator-boot-on; -}; - -&tlmm { - tsp_int: tsp_int { - mux { - pins = "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio9"; - input-enable; - bias-disable; - }; - }; -}; - -&qupv3_se7_i2c { - status = "ok"; - synaptics_tcm@20 { - status = "disabled"; - }; - atmel_mxt_ts@4a { - status = "disabled"; - }; - - tsp_stm: touchscreen@49 { - status = "ok"; - compatible = "stm,fts_touch"; - reg = <0x49>; - pinctrl-names = "default"; - pinctrl-0 = <&tsp_int>; - dvdd-supply = <&tsp_io_ldo>; - avdd-supply = <&pm6150l_l7>; - stm,irq_gpio = <&tlmm 9 0x2008>; - stm,max_coords = <4095 4095>; - stm,firmware_name = "tsp_stm/fts5cu56a_m42.bin"; - stm,tclm_level = <1>; - /* stm,afe_base = <0x7>; */ - stm,enable_settings_aot; - support_ear_detect; - support_mis_calibration_test; - support_dex_mode; - support_open_short_test; - support_sram_test; - stm,ss_touch_num = <1>; - }; -}; - -/delete-node/&key_vol_up_default; -&pm6150l_gpios { - key_vol_up { - key_vol_up_default: key_vol_up_default { - pins = "gpio8"; - function = "normal"; - input-enable; - bias-pull-up; - power-source = <0>; - }; - }; -}; - -/delete-node/&gpio_key; -&gpio_key { - status = "okay"; - compatible = "gpio-keys"; - input-name = "gpio-keys"; - - pinctrl-names = "default"; - pinctrl-0 = <&key_vol_up_default>; - - vol_up { - label = "volume_up"; - gpios = <&pm6150l_gpios 8 0x1>; - linux,input-type = <1>; - linux,code = ; - debounce-interval = <15>; - }; -}; - -&soc { - ss_touch { - compatible = "samsung,ss_touch"; - ss_touch,numbers = <1>; - }; - - tsp_io_ldo: tsp_io_ldo { - compatible = "regulator-fixed"; - regulator-name = "tsp_io_ldo"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - gpio = <&tlmm 43 0>; - enable-active-high; - regulator-boot-on; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r00.dts b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r00.dts deleted file mode 100755 index 38ba57ed976a..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r00.dts +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-m42q-r00.dtsi" -#include "drivers/atoll-sec-m42q-battery-common.dtsi" -#include "drivers/atoll-sec-m42q-fingerprint-r00.dtsi" - -/ { - model = "Samsung M42Q PROJECT BRINGUP (board-id,00)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 0>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r01.dts b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r01.dts deleted file mode 100755 index 2dc3d618ab2e..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r01.dts +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-m42q-r01.dtsi" -#include "drivers/atoll-sec-m42q-battery-common.dtsi" -#include "drivers/atoll-sec-m42q-fingerprint-r00.dtsi" - -/ { - model = "Samsung M42Q PROJECT DV1 REV00 (board-id,01)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 1>; - dtbo-version = <0>; -}; - diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r02.dts b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r02.dts deleted file mode 100755 index e2e36e62a31a..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r02.dts +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-m42q-r02.dtsi" -#include "drivers/atoll-sec-m42q-battery-r02.dtsi" -#include "drivers/atoll-sec-m42q-fingerprint-r00.dtsi" - -/ { - model = "Samsung M42Q PROJECT DV2 REV01 (board-id,02)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 2>; - dtbo-version = <0>; -}; - diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r04.dts b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r04.dts deleted file mode 100755 index 014f4e9863bc..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-jpn-overlay-r04.dts +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-m42q-r04.dtsi" -#include "drivers/atoll-sec-m42q-battery-r02.dtsi" -#include "drivers/atoll-sec-m42q-fingerprint-r00.dtsi" - -/ { - model = "Samsung M42Q PROJECT REV02 (board-id,04)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 4>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r00.dtsi deleted file mode 100755 index b222269a102a..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r00.dtsi +++ /dev/null @@ -1,621 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "drivers/atoll-sec-m42q-audio-pinctrl-common.dtsi" - -&tlmm { - grip_i2c { - grip_i2c_active: grip_i2c_active { - grip_i2c_active { - pins = "gpio51", "gpio52"; - bias-disable; - }; - }; - grip_i2c_suspend: grip_i2c_suspend { - grip_i2c_suspend { - pins = "gpio51", "gpio52"; - bias-disable; - }; - }; - }; - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - mux { - pins = "gpio25"; - function = "gpio"; - }; - config { - pins = "gpio25"; - drive-strength = <2>; - bias-disable; - }; - }; - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - mux { - pins = "gpio26"; - function = "gpio"; - }; - config { - pins = "gpio26"; - drive-strength = <2>; - bias-disable; - }; - }; - cam_sensor_mclk0_active: cam_sensor_mclk0_active { - /* Main Rear MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk0_suspend: cam_sensor_mclk0_suspend { - /* Main Rear MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk1_active: cam_sensor_mclk1_active { - /* FRONT MCLK */ - mux { - pins = "gpio23"; - function = "cam_mclk"; - }; - config { - pins = "gpio23"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk1_suspend: cam_sensor_mclk1_suspend { - /* FRONT MCLK */ - mux { - pins = "gpio23"; - function = "cam_mclk"; - }; - config { - pins = "gpio23"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk2_active: cam_sensor_mclk2_active { - /* Bokeh Cam MCLK */ - mux { - pins = "gpio14"; - function = "cam_mclk"; - }; - config { - pins = "gpio14"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk2_suspend: cam_sensor_mclk2_suspend { - /* Bokeh Cam MCLK */ - mux { - pins = "gpio14"; - function = "cam_mclk"; - }; - config { - pins = "gpio14"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk3_active: cam_sensor_mclk3_active { - /* UW Cam MCLK */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - config { - pins = "gpio15"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk3_suspend: cam_sensor_mclk3_suspend { - /* UW Cam MCLK */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - config { - pins = "gpio15"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - - }; - }; - - cam_sensor_mclk4_active: cam_sensor_mclk4_active { - /* Macro Cam MCLK */ - mux { - pins = "gpio16"; - function = "cam_mclk"; - }; - config { - pins = "gpio16"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk4_suspend: cam_sensor_mclk4_suspend { - /* Macro Cam MCLK */ - mux { - pins = "gpio16"; - function = "cam_mclk"; - }; - config { - pins = "gpio16"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - - }; - }; - - rcam1_sensor_reset_active: rcam1_sensor_reset_active { - /* Main Rear reset */ - mux { - pins = "gpio30"; - function = "gpio"; - }; - config { - pins = "gpio30"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - rcam1_sensor_reset_suspend: rcam1_sensor_reset_suspend { - /* Main Rear reset */ - mux { - pins = "gpio30"; - function = "gpio"; - }; - config { - pins = "gpio30"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - front_sensor_reset_active: front_sensor_reset_active { - /* FRONT RESET */ - mux { - pins = "gpio21"; - function = "gpio"; - }; - config { - pins = "gpio21"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - front_sensor_reset_suspend: front_sensor_reset_suspend { - /* FRONT RESET */ - mux { - pins = "gpio21"; - function = "gpio"; - }; - config { - pins = "gpio21"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam3_sensor_reset_active: rcam3_sensor_reset_active { - /* UW Cam RESET */ - mux { - pins = "gpio29"; - function = "gpio"; - }; - config { - pins = "gpio29"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - rcam3_sensor_reset_suspend: rcam3_sensor_reset_suspend { - /* UW Cam RESET */ - mux { - pins = "gpio29"; - function = "gpio"; - }; - config { - pins = "gpio29"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_reset_active: rcam2_sensor_reset_active { - /* Bokeh Cam RESET */ - mux { - pins = "gpio42"; - function = "gpio"; - }; - config { - pins = "gpio42"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_reset_suspend: rcam2_sensor_reset_suspend { - /* Bokeh Cam RESET */ - mux { - pins = "gpio42"; - function = "gpio"; - }; - config { - pins = "gpio42"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_reset_active: rcam4_sensor_reset_active { - /* Macro Cam RESET */ - mux { - pins = "gpio24"; - function = "gpio"; - }; - config { - pins = "gpio24"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_reset_suspend: rcam4_sensor_reset_suspend { - /* Macro Cam RESET */ - mux { - pins = "gpio24"; - function = "gpio"; - }; - config { - pins = "gpio24"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam1_sensor_vana_active: rcam1_sensor_vana_active { - /* Rear VANA */ - mux { - pins = "gpio63"; - function = "gpio"; - }; - config { - pins = "gpio63"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - rcam1_sensor_vana_suspend: rcam1_sensor_vana_suspend { - /* Rear VANA */ - mux { - pins = "gpio63"; - function = "gpio"; - }; - config { - pins = "gpio63"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_vana_active: rcam2_sensor_vana_active { - /* Bokeh VANA */ - mux { - pins = "gpio64"; - function = "gpio"; - }; - config { - pins = "gpio64"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_vana_suspend: rcam2_sensor_vana_suspend { - /* Bokeh VANA */ - mux { - pins = "gpio64"; - function = "gpio"; - }; - config { - pins = "gpio64"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam3_sensor_vana_active: rcam3_sensor_vana_active { - /* UW VANA */ - mux { - pins = "gpio65"; - function = "gpio"; - }; - config { - pins = "gpio65"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - rcam3_sensor_vana_suspend: rcam3_sensor_vana_suspend { - /* UW VANA */ - mux { - pins = "gpio65"; - function = "gpio"; - }; - config { - pins = "gpio65"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_vana_active: rcam4_sensor_vana_active { - /* Macro VANA */ - mux { - pins = "gpio74"; - function = "gpio"; - }; - config { - pins = "gpio74"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_vana_suspend: rcam4_sensor_vana_suspend { - /* Macro VANA */ - mux { - pins = "gpio74"; - function = "gpio"; - }; - config { - pins = "gpio74"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_mipi_sel_active: cam_mipi_sel_active { - /* MIPI SEL */ - mux { - pins = "gpio66"; - function = "gpio"; - }; - config { - pins = "gpio66"; - bias-disable; - output-high; - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_mipi_sel_suspend: cam_mipi_sel_suspend { - /* MIPI SEL */ - mux { - pins = "gpio66"; - function = "gpio"; - }; - config { - pins = "gpio66"; - bias-pull-down; - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_vdig_active: rcam2_sensor_vdig_active { - /* Bokeh VDIG */ - mux { - pins = "gpio64"; - function = "gpio"; - }; - config { - pins = "gpio64"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam2_sensor_vdig_suspend: rcam2_sensor_vdig_suspend { - /* Bokeh VDIG */ - mux { - pins = "gpio64"; - function = "gpio"; - }; - config { - pins = "gpio64"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_vdig_active: rcam4_sensor_vdig_active { - /* Macro VDIG */ - mux { - pins = "gpio74"; - function = "gpio"; - }; - config { - pins = "gpio74"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - rcam4_sensor_vdig_suspend: rcam4_sensor_vdig_suspend { - /* Macro VDIG */ - mux { - pins = "gpio74"; - function = "gpio"; - }; - config { - pins = "gpio74"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - if_pmic_i2c_pins: if_pmic_i2c_pins { - if_pmic_i2c_sleep: if_pmic_i2c_sleep { - mux { - pins = "gpio115", "gpio116"; - function = "gpio"; - }; - - config { - pins = "gpio115", "gpio116"; - drive-strength = <2>; - input-enable; - bias-disable; - }; - }; - }; - - usbpd_i2c_pins: usbpd_i2c_pins { - usbpd_i2c_sleep: usbpd_i2c_sleep { - mux { - pins = "gpio53", "gpio54"; - function = "gpio"; - }; - - config { - pins = "gpio53", "gpio54"; - drive-strength = <2>; - input-enable; - bias-disable; - }; - }; - }; -}; - -&pm6150l_gpios { - grip_int_active: grip_int_active { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_int_suspend: grip_int_suspend { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - sub_grip_int_active: sub_grip_int_active { - pins = "gpio4"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - sub_grip_int_suspend: sub_grip_int_suspend { - pins = "gpio4"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; - -&tlmm { - wakeup-disabled-gpios = < - 0 /* SPI : NFC_ESE_MISO */ - 3 /* LAGOON : NFC_ESE_CS_N */ - 6 /* I2C : TSP_SDA_1P8 */ - 10 /* LAGOON : DISP_TE */ - 16 /* MCLK : RCAM4_MCLK */ - 21 /* RST_N : FCAM_RST_N */ - 22 /* EN : CAM_FLASH_EN */ - 23 /* MCLK : FCAM_MCLK */ - 24 /* RST_N : RCAM4_RST_N */ - 26 /* I2C : CAM_PMIC_I2C_SCL_1P8 */ - 28 /* I2C : FCAM_RCAM2_RCAM4_SENSOR_I2C_SCL_1P8 */ - 30 /* RST_N : RCAM1_RST_N */ - 32 /* NC : NC */ - 34 /* I2C : NFC_SDA_1P8 */ - 36 /* LAGOON : NFC_FIRM */ - 37 /* LAGOON : NFC_IRQ */ - 38 /* HW-REVIEW : BT_UART_CTS */ - 39 /* HW-REVIEW : BT_UART_RTS */ - 42 /* RST_N : RCAM2_RST_N */ - 43 /* NC : NC */ - 45 /* UART : AP_UART_RXD */ - 47 /* I2C : CAM_AF_EEP_I2C_SCL_1P8 */ - 49 /* LAGOON : BT_FM_SB_CLK */ - 52 /* I2C : GRIP_SCL_1P8 */ - 53 /* I2C : CC_SDA_1P8 */ - 55 /* RST_N : RCAM1_ISP_RST_N */ - 56 /* NC : NC */ - 57 /* NC : NC */ - 58 /* RST_N : CODEC_RST_N */ - 59 /* SPI : BTP_SPI_MISO */ - 62 /* SPI : BTP_SPI_CS_N */ - 63 /* EN : RCAM1_LDO_EN */ - 64 /* EN : RCAM2_LDO_EN */ - 65 /* EN : RCAM3_LDO_EN */ - 66 /* LAGOON : CAM_SEL */ - 67 /* EN : CAM_TORCH_EN */ - 68 /* EN : NFC_LDO_EN */ - 69 /* LAGOON : T_FLASH_DET */ - 74 /* EN : RCAM4_LDO_EN */ - 78 /* NC : NC */ - 84 /* EN : FM_LNA_EN */ - 86 /* LCD/HW-REVIEW : EL_ON1_DET */ - 87 /* NC : NC */ - 88 /* I2C : SPK_AMP_SDA_1P8 */ - 89 /* I2C : SPK_AMP_SCL_1P8 */ - 90 /* HW-REVIEW : SPK_AMP_INT */ - 91 /* RST_N : BTP_RST_N */ - 94 /* EN : SPK_AMP_EN */ - 95 /* HW-REVIEW : FAST_BOOT_SEL0 */ - 98 /* HW-REVIEW : FAST_BOOT_SEL3 */ - 109 /* LAGOON : CP_WLAN_COEX_RXD */ - 114 /* LAGOON : AP_USB_BOOT_POL_SEL */ - 115 /* I2C : IF_PMIC_SDA_1P8 */ - 116 /* I2C : IF_PMIC_SCL_1P8 */ - 117 /* NC : NC */ - 118 /* EN : NFC_ESE_EN */ - >; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r01.dtsi deleted file mode 100755 index c6a5275dd178..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r01.dtsi +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - wakeup-disabled-gpios = < - 0 /* SPI : NFC_ESE_MISO */ - 3 /* LAGOON : NFC_ESE_CS_N */ - 6 /* I2C : TSP_SDA_1P8 */ - 10 /* LAGOON : DISP_TE */ - 11 /* LCD/HW-REVIEW : EL_ON1_DET */ - 16 /* MCLK : RCAM4_MCLK */ - 21 /* RST_N : FCAM_RST_N */ - 22 /* EN : CAM_FLASH_EN */ - 23 /* MCLK : FCAM_MCLK */ - 24 /* RST_N : RCAM4_RST_N */ - 26 /* I2C : CAM_PMIC_I2C_SCL_1P8 */ - 28 /* I2C : FCAM_RCAM2_RCAM4_SENSOR_I2C_SCL_1P8 */ - 30 /* RST_N : RCAM1_RST_N */ - 32 /* NC : NC */ - 34 /* I2C : NFC_SDA_1P8 */ - 36 /* LAGOON : NFC_FIRM */ - 37 /* LAGOON : NFC_IRQ */ - 38 /* HW-REVIEW : BT_UART_CTS */ - 39 /* HW-REVIEW : BT_UART_RTS */ - 42 /* RST_N : RCAM2_RST_N */ - 43 /* NC : NC */ - 45 /* UART : AP_UART_RXD */ - 47 /* I2C : CAM_AF_EEP_I2C_SCL_1P8 */ - 49 /* LAGOON : BT_FM_SB_CLK */ - 52 /* I2C : GRIP_SCL_1P8 */ - 53 /* I2C : CC_SDA_1P8 */ - 55 /* RST_N : RCAM1_ISP_RST_N */ - 56 /* MCLK : RCAM1_ISP_MCLK */ - 57 /* NC : NC */ - 58 /* RST_N : CODEC_RST_N */ - 59 /* SPI : BTP_SPI_MISO */ - 62 /* SPI : BTP_SPI_CS_N */ - 63 /* EN : RCAM1_LDO_EN */ - 64 /* EN : RCAM2_LDO_EN */ - 65 /* EN : RCAM3_LDO_EN */ - 66 /* LAGOON : CAM_SEL */ - 67 /* EN : CAM_TORCH_EN */ - 68 /* EN : NFC_LDO_EN */ - 69 /* LAGOON : T_FLASH_DET */ - 74 /* EN : RCAM4_LDO_EN */ - 78 /* NC : NC */ - 84 /* EN : FM_LNA_EN */ - 86 /* NC : NC */ - 87 /* NC : NC */ - 88 /* I2C : SPK_AMP_SDA_1P8 */ - 89 /* I2C : SPK_AMP_SCL_1P8 */ - 90 /* HW-REVIEW : SPK_AMP_INT */ - 91 /* RST_N : BTP_RST_N */ - 94 /* EN : SPK_AMP_EN */ - 95 /* HW-REVIEW : FAST_BOOT_SEL0 */ - 98 /* HW-REVIEW : FAST_BOOT_SEL3 */ - 109 /* LAGOON : CP_WLAN_COEX_RXD */ - 114 /* LAGOON : AP_USB_BOOT_POL_SEL */ - 115 /* I2C : IF_PMIC_SDA_1P8 */ - 116 /* I2C : IF_PMIC_SCL_1P8 */ - 117 /* NC : NC */ - 118 /* EN : NFC_ESE_EN */ - >; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r02.dtsi deleted file mode 100755 index aff692515b33..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r02.dtsi +++ /dev/null @@ -1,15 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r04.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r04.dtsi deleted file mode 100755 index 73bfd0f41ab0..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r04.dtsi +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - - /delete-node/ rcam4_sensor_vana_active; - /delete-node/ rcam4_sensor_vana_suspend; - -}; - -&tlmm { - wakeup-disabled-gpios = < - 0 /* NC : NC */ - 3 /* NC : NC */ - 6 /* I2C : TSP_SDA_1P8 */ - 10 /* LAGOON : DISP_TE */ - 11 /* LCD/HW-REVIEW : EL_ON1_DET */ - 16 /* MCLK : RCAM4_MCLK */ - 21 /* RST_N : FCAM_RST_N */ - 22 /* EN : CAM_FLASH_EN */ - 23 /* MCLK : FCAM_MCLK */ - 24 /* RST_N : RCAM4_RST_N */ - 26 /* I2C : CAM_PMIC_I2C_SCL_1P8 */ - 28 /* I2C : FCAM_RCAM2_RCAM4_SENSOR_I2C_SCL_1P8 */ - 30 /* RST_N : RCAM1_RST_N */ - 32 /* NC : NC */ - 34 /* I2C : NFC_SDA_1P8 */ - 36 /* LAGOON : NFC_FIRM */ - 37 /* LAGOON : NFC_IRQ */ - 38 /* HW-REVIEW : BT_UART_CTS */ - 39 /* HW-REVIEW : BT_UART_RTS */ - 42 /* RST_N : RCAM2_RST_N */ - 43 /* EN : TSP_EN_1P8 */ - 45 /* UART : AP_UART_RXD */ - 47 /* I2C : CAM_AF_EEP_I2C_SCL_1P8 */ - 49 /* LAGOON : BT_FM_SB_CLK */ - 52 /* I2C : GRIP_SCL_1P8 */ - 53 /* I2C : CC_SDA_1P8 */ - 55 /* RST_N : RCAM1_ISP_RST_N */ - 56 /* NC : NC */ - 57 /* EN : MOT_EN */ - 58 /* RST_N : CODEC_RST_N */ - 59 /* SPI : BTP_SPI_MISO */ - 62 /* SPI : BTP_SPI_CS_N */ - 63 /* EN : RCAM1_LDO_EN */ - 64 /* EN : RCAM2_RCAM4_LDO_EN */ - 65 /* EN : RCAM3_LDO_EN */ - 66 /* LAGOON : CAM_SEL */ - 67 /* EN : CAM_TORCH_EN */ - 68 /* EN : NFC_LDO_EN */ - 69 /* LAGOON : T_FLASH_DET */ - 74 /* NC : NC */ - 78 /* NC : NC */ - 84 /* NC : NC */ - 86 /* NC : NC */ - 87 /* NC : NC */ - 88 /* I2C : SPK_AMP_SDA_1P8 */ - 89 /* I2C : SPK_AMP_SCL_1P8 */ - 90 /* HW-REVIEW : SPK_AMP_INT */ - 91 /* RST_N : BTP_RST_N */ - 94 /* EN : SPK_AMP_EN */ - 95 /* HW-REVIEW : FAST_BOOT_SEL0 */ - 98 /* HW-REVIEW : FAST_BOOT_SEL3 */ - 109 /* LAGOON : CP_WLAN_COEX_RXD */ - 114 /* LAGOON : AP_USB_BOOT_POL_SEL */ - 115 /* I2C : IF_PMIC_SDA_1P8 */ - 116 /* I2C : IF_PMIC_SCL_1P8 */ - 117 /* NC : NC */ - 118 /* NC : NC */ - >; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r05.dtsi deleted file mode 100755 index aff692515b33..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r05.dtsi +++ /dev/null @@ -1,15 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r06.dtsi deleted file mode 100755 index 74a613df3472..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pinctrl-r06.dtsi +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - -}; - -&rcam4_sensor_vdig_active { - /* Macro VDIG */ - mux { - pins = "gpio56"; - function = "gpio"; - }; - config { - pins = "gpio56"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; -}; - -&rcam4_sensor_vdig_suspend { - /* Macro VDIG */ - mux { - pins = "gpio56"; - function = "gpio"; - }; - config { - pins = "gpio56"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pm-common.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pm-common.dtsi deleted file mode 100755 index 931bf5a7f36c..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-pm-common.dtsi +++ /dev/null @@ -1,183 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-pm-common.dtsi" - -&soc { - /* AP Thermistor table */ - sec_thermistor@0 { - compatible = "samsung,sec-ap-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "ap_therm"; - adc_array = <1831 2184 2569 3068 3620 4245 5040 - 5957 7030 8198 9474 10919 12557 - 14185 15894 17587 19209 20739 22151 23427 24543 25514 26296>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* PA Thermistor table */ - sec_thermistor@1 { - compatible = "samsung,sec-pa-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "pa_therm"; - adc_array = <1884 2237 2633 3115 3672 4291 5086 - 6007 7076 8240 9517 10963 12595 - 14223 15931 17618 19239 20769 22189 23458 24574 25535 26323>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* WiFi Thermistor table */ - sec_thermistor@2 { - compatible = "samsung,sec-wf-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - io-channel-names = "wf_therm"; - adc_array = <1906 2253 2638 3132 3691 4311 5105 - 6024 7093 8255 9536 10982 12611 - 14244 15952 17641 19258 20787 22211 23479 24594 25552 26336>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 25 0 /* sda */ - &tlmm 26 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2900000>; - regulator-max-microvolt = <2900000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -&pm6150_gpios { - interrupts = <0x0 0xc0 0 IRQ_TYPE_NONE>, - <0x0 0xc1 0 IRQ_TYPE_NONE>, - <0x0 0xc2 0 IRQ_TYPE_NONE>, - <0x0 0xc3 0 IRQ_TYPE_NONE>, - <0x0 0xc4 0 IRQ_TYPE_NONE>, - <0x0 0xc6 0 IRQ_TYPE_NONE>, - <0x0 0xc7 0 IRQ_TYPE_NONE>, - <0x0 0xc9 0 IRQ_TYPE_NONE>; - interrupt-names = "pm6150_gpio1", "pm6150_gpio2", - "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio5", - "pm6150_gpio7", "pm6150_gpio8", - "pm6150_gpio10"; - qcom,gpios-disallowed = <6 9>; - - /delete-node/ sdm_skin_therm; -}; - -&pm6150_vadc { - pinctrl-0 = <&nvm_therm_default>; - - ap_therm { - reg = ; - label = "ap_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - }; - - /delete-node/ sdm_skin_therm; -}; - -&pm6150_adc_tm { - io-channels = <&pm6150_vadc ADC_XO_THERM_PU2>, - <&pm6150_vadc ADC_AMUX_THM1_PU2>, - <&pm6150_vadc ADC_AMUX_THM3_PU2>; - - /delete-node/ sdm_skin_therm; -}; - -&pm6150l_vadc { - /delete-node/ pa_therm0; - - pa_therm { - reg = ; - label = "pa_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - }; - - wf_therm { - reg = ; - label = "wf_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r00.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r00.dtsi deleted file mode 100755 index d2393ee22554..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r00.dtsi +++ /dev/null @@ -1,102 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-m42q-common.dtsi" -#include "drivers/atoll-sec-m42q-audio-common.dtsi" -#include "drivers/atoll-sec-m42q-usb-r00.dtsi" -#include "atoll-sec-m42q-pinctrl-r00.dtsi" -#include "atoll-sec-m42q-pm-common.dtsi" -#include "drivers/atoll-sec-m42q-display-r00.dtsi" -#include -#include "drivers/atoll-sec-m42q-vibrator-r00.dtsi" -#include "drivers/atoll-sec-a52q-nfc_r00.dtsi" -#include "drivers/atoll-sec-m42q-camera-sensor-r00.dtsi" -#include "drivers/atoll-sec-m42q-abc-r00.dtsi" - -&soc { - rpmh-regulator-ldoc8 { - compatible = "qcom,rpmh-vrm-regulator"; - mboxes = <&apps_rsc 0>; - qcom,resource-name = "ldoc8"; - qcom,regulator-type = "pmic5-ldo"; - qcom,supported-modes = - ; - qcom,mode-threshold-currents = <0 1>; - L8C: - pm6150l_l8: regulator-pm6150l-l8 { - regulator-name = "pm6150l_l8"; - qcom,set = ; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - qcom,init-voltage = <1800000>; - regulator-always-on; - qcom,init-mode = - ; - }; - }; - - //Grip Sensor Vdd - rpmh-regulator-ldoa5 { - pm6150_l5: regulator-pm6150-l5 { - regulator-min-microvolt = <3000000>; - regulator-max-microvolt = <3000000>; - qcom,init-voltage = <3000000>; - regulator-always-on; - }; - }; - - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = <&tlmm 51 0 /* sda */ - &tlmm 52 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&grip_i2c_active>; - - #address-cells = <1>; - #size-cells = <0>; - - isg5320a: isg5320a@28 { - compatible = "isg5320a"; - pinctrl-names = "default"; - pinctrl-0 = <&grip_int_active>; - reg = <0x28>; - status = "okay"; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc3 0 IRQ_TYPE_EDGE_FALLING>; - - isg5320a,irq-gpio = <&pm6150l_gpios 4 GPIO_ACTIVE_LOW>; - isg5320a,hallic_detect = <1>; - isg5320a,hallic_cert_detect = <1>; - }; - - isg5320a_sub: isg5320a_sub@2C { - compatible = "isg5320a_sub"; - pinctrl-names = "default"; - pinctrl-0 = <&sub_grip_int_active>; - reg = <0x2C>; - status = "okay"; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - isg5320a_sub,irq-gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_LOW>; - isg5320a_sub,hallic_detect = <1>; - isg5320a_sub,hallic_cert_detect = <1>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r01.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r01.dtsi deleted file mode 100755 index ce5a22bdec12..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r01.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-m42q-r00.dtsi" -#include "atoll-sec-m42q-pinctrl-r01.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r02.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r02.dtsi deleted file mode 100755 index b3b148a05ef7..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r02.dtsi +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-m42q-r01.dtsi" -#include "atoll-sec-m42q-pinctrl-r02.dtsi" - -/delete-node/ &vibrator; - -&soc { - msm_vibrator { - compatible = "vibrator"; - motor-vdd_type = <0>; /* 0: gpio, 1: pmic */ - motor-en = <&tlmm 57 0x0>; - samsung,vib_type = "COINDC"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r04.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r04.dtsi deleted file mode 100755 index 0c7c28faf139..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r04.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-m42q-r02.dtsi" -#include "atoll-sec-m42q-pinctrl-r04.dtsi" -#include "drivers/atoll-sec-m42q-camera-sensor-r04.dtsi" - -&soc { - -}; - -&i2c_18 { - pinctrl-0 = <&tas25xx_gpio_default>; -}; - -&atoll_snd { - qcom,fm-lna-gpios = <>; -}; - diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r05.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r05.dtsi deleted file mode 100755 index a16d3979b1c6..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r05.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-m42q-r04.dtsi" -#include "atoll-sec-m42q-pinctrl-r05.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r06.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r06.dtsi deleted file mode 100755 index 5dfdc3519ba7..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-r06.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-m42q-r05.dtsi" -#include "atoll-sec-m42q-pinctrl-r06.dtsi" -#include "drivers/atoll-sec-m42q-camera-sensor-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r01.dts b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r01.dts deleted file mode 100755 index 35c44bac801c..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r01.dts +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-m42q-r01.dtsi" -#include "drivers/atoll-sec-m42q-battery-common.dtsi" -#include "drivers/atoll-sec-m42q-fingerprint-r00.dtsi" - -/ { - model = "Samsung M42Q PROJECT - SM-M425U1_REV00 (board-id,01)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 1>; - dtbo-version = <0>; -}; - - -&i2c_18 { - pinctrl-0 = <&tas25xx_gpio_default>; -}; - -&atoll_snd { - qcom,fm-lna-gpios = <>; -}; - diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r02.dts b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r02.dts deleted file mode 100755 index aec19d41cedf..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r02.dts +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-m42q-r02.dtsi" -#include "drivers/atoll-sec-m42q-battery-r02.dtsi" -#include "drivers/atoll-sec-m42q-fingerprint-r00.dtsi" - -/ { - model = "Samsung M42Q PROJECT - SM-M425U1_REV00 (board-id,02)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 2>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r04.dts b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r04.dts deleted file mode 100755 index ad4429ba39c9..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r04.dts +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-m42q-r04.dtsi" -#include "drivers/atoll-sec-m42q-battery-r02.dtsi" -#include "drivers/atoll-sec-m42q-fingerprint-r00.dtsi" - -/ { - model = "Samsung M42Q PROJECT - SM-M425U1_REV01 (board-id,04)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 4>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r06.dts b/arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r06.dts deleted file mode 100755 index fe40239aaf9d..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-m42q-usa-overlay-r06.dts +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "atoll-sec-common.dtsi" -#include "atoll-sec-m42q-r06.dtsi" -#include "drivers/atoll-sec-m42q-battery-r02.dtsi" -#include "drivers/atoll-sec-m42q-fingerprint-r00.dtsi" - -/ { - model = "Samsung M42Q PROJECT - SM-M425U1_REV02 (board-id,06)"; - compatible = "qcom,atoll-ab-idp", "qcom,atoll-ab", "qcom,idp"; - qcom,board-id = <34 6>; - dtbo-version = <0>; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-pm-common.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-pm-common.dtsi deleted file mode 100755 index 953fce330108..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-pm-common.dtsi +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&spmi_bus { - qcom,pm6150@0 { - qcom,power-on@800 { - interrupts = <0x0 0x8 0x0 IRQ_TYPE_NONE>, - <0x0 0x8 0x1 IRQ_TYPE_NONE>, - <0x0 0x8 0x4 IRQ_TYPE_NONE>, - <0x0 0x8 0x5 IRQ_TYPE_NONE>; - interrupt-names = "kpdpwr", "resin", - "resin-bark", "kpdpwr-resin-bark"; - qcom,s3-debounce = <128>; - - qcom,pon_1 { - qcom,support-reset = <0>; - }; - - qcom,pon_2 { - qcom,support-reset = <0>; - }; - - qcom,pon_3 { - qcom,pon-type = ; - qcom,support-reset = <1>; - qcom,pull-up = <1>; - qcom,s1-timer = <6720>; - qcom,s2-timer = <1000>; - qcom,s2-type = ; - qcom,use-bark; - }; - }; - }; -}; - -&pm8008_8 { - status = "disabled"; -}; - -&pm8008_9 { - status = "disabled"; -}; diff --git a/arch/arm64/boot/dts/samsung/atoll-sec-uart-common.dtsi b/arch/arm64/boot/dts/samsung/atoll-sec-uart-common.dtsi deleted file mode 100755 index d40532fc5f39..000000000000 --- a/arch/arm64/boot/dts/samsung/atoll-sec-uart-common.dtsi +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&aliases { - hsuart8 = "/soc/qcom,qup_hsuart@a88000"; /* UART for ATD*/ -}; - -&soc { - qupv3_se8_2hsuart: qcom,qup_hsuart@a88000 { - compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; - reg = <0xa88000 0x4000>; - reg-names = "se_phys"; - clock-names = "se-clk", "m-ahb", "s-ahb"; - clocks = <&clock_gcc GCC_QUPV3_WRAP1_S2_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_M_AHB_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_S_AHB_CLK>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&qupv3_se8_2uart_tx_active>,<&qupv3_se8_2uart_rx_active>; - pinctrl-1 = <&qupv3_se8_2uart_tx_sleep>,<&qupv3_se8_2uart_rx_sleep>; - interrupts = ; - qcom,wrapper-core = <&qupv3_1>; - always-on-clock; - status = "ok"; - }; -}; - -&tlmm { - qupv3_se8_2hsuart_pins: qupv3_se8_2hsuart_pins { - qupv3_se8_2uart_tx_active: qupv3_se8_2uart_tx_active { - mux { - pins = "gpio44"; - function = "qup12"; - }; - - config { - pins = "gpio44"; - drive-strength = <2>; - bias-pull-up; - }; - }; - - qupv3_se8_2uart_rx_active: qupv3_se8_2uart_rx_active { - mux { - pins = "gpio45"; - function = "qup12"; - }; - - config { - pins = "gpio45"; - drive-strength = <2>; - bias-pull-up; - }; - }; - - qupv3_se8_2uart_tx_sleep: qupv3_se8_2uart_tx_sleep { - mux { - pins = "gpio44"; - function = "gpio"; - }; - - config { - pins = "gpio44"; - drive-strength = <2>; - bias-pull-up; - input-enable; - }; - }; - - qupv3_se8_2uart_rx_sleep: qupv3_se8_2uart_rx_sleep { - mux { - pins = "gpio45"; - function = "gpio"; - }; - - config { - pins = "gpio45"; - drive-strength = <2>; - bias-pull-down; - }; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-battery-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-battery-common.dtsi deleted file mode 100755 index 44c41e91e329..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-battery-common.dtsi +++ /dev/null @@ -1,691 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&smb1390 { - status = "disabled"; -}; - -&smb1390_charger { - status = "disabled"; -}; - -&soc { - battery { - status = "okay"; - compatible = "samsung,sec-battery"; - pinctrl-names = "default"; - - battery,vendor = "Battery"; - battery,charger_name = "sec-direct-charger"; - battery,fuelgauge_name = "s2mu107-fuelgauge"; - battery,technology = <2>; /* POWER_SUPPLY_TECHNOLOGY_LION */ - battery,fgsrc_switch_name = "s2mu107-fuelgauge"; /* Fuelgauge voltage source */ - - battery,batt_data_version = <3>; - - battery,chip_vendor = "LSI"; - battery,temp_channel_raw= <1>; /* BATTERY_TEMP_CHANNEL_RAW */ - battery,temp_adc_type = <1>; /* SEC_BATTERY_ADC_TYPE_AP */ - - battery,temp_check_type = <1>; /* SEC_BATTERY_TEMP_CHECK_ADC */ - battery,chg_temp_check_type = <2>; /* SEC_BATTERY_TEMP_CHECK_TEMP*/ - - battery,thermal_source = <2>; /* SEC_BATTERY_THERMAL_SOURCE_ADC */ - battery,chg_thermal_source = <0>; /* SEC_CHARGER_THERMAL_SOURCE_FG */ - - battery,dchg_thermal_source = <0>; /* SEC_CHARGER_THERMAL_SOURCE_FG */ - battery,polling_time = <10 30 30 30 3600>; - - - battery,temp_table_adc = < - 2127 2475 2966 3377 3975 4632 5454 6390 7499 8709 - 10058 11543 13049 14708 16403 18129 19883 21326 22780 24007 - 24825 25547 26180 - >; - battery,temp_table_data = < - 900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) - (-100) (-150) (-200) - >; - - battery,inbat_voltage = <1>; - - battery,inbat_voltage_table_adc = < - 2820 2795 2767 2737 2706 2686 2659 2630 2602 2574 - 2544 2514 2484 2456 2432 2405 2379 2351 2320 2292 - 2265 2236 2207 - >; - battery,inbat_voltage_table_data = < - 4400 4350 4300 4250 4200 4150 4100 4050 4000 3950 - 3900 3850 3800 3750 3700 3650 3600 3550 3500 3450 - 3400 3350 3300 - >; - battery,dchg_temp_table_adc = <110262 131376 159528 190026 225216 265098 307326 373014 436356 511428 - 593538 685032 783564 886788 992358 1100274 1205844 1299684 1391178 1470942 1538976 1595280 1642200>; - battery,dchg_temp_table_data = <900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - - battery,adc_check_count = <5>; - - battery,cable_check_type = <4>; /* SEC_BATTERY_CABLE_CHECK_PSY */ - battery,cable_source_type = <1>; /* SEC_BATTERY_CABLE_SOURCE_EXTERNAL */ - battery,polling_type = <1>; /* SEC_BATTERY_MONITOR_ALARM */ - battery,monitor_initial_count = <0>; - - battery,pre_afc_input_current = <500>; - battery,prepare_afc_delay = <0>; - - battery,battery_check_type = <0>; /* SEC_BATTERY_CHECK_NONE */ - battery,check_count = <0>; - - battery,ovp_uvlo_check_type = <3>; /* SEC_BATTERY_OVP_UVLO_CHGPOLLING */ - - battery,temp_check_count = <1>; - battery,temp_highlimit_threshold_event = <700>; - battery,temp_highlimit_recovery_event = <680>; - battery,temp_high_threshold_event = <500>; - battery,temp_high_recovery_event = <480>; - battery,temp_low_threshold_event = <0>; - battery,temp_low_recovery_event = <20>; - battery,temp_highlimit_threshold_normal = <700>; - battery,temp_highlimit_recovery_normal = <680>; - battery,temp_high_threshold_normal = <500>; - battery,temp_high_recovery_normal = <480>; - battery,temp_low_threshold_normal = <0>; - battery,temp_low_recovery_normal = <20>; - battery,temp_highlimit_threshold_lpm = <800>; - battery,temp_highlimit_recovery_lpm = <750>; - battery,temp_high_threshold_lpm = <500>; - battery,temp_high_recovery_lpm = <480>; - battery,temp_low_threshold_lpm = <0>; - battery,temp_low_recovery_lpm = <20>; - battery,wpc_high_threshold_normal = <450>; - battery,wpc_high_recovery_normal = <400>; - battery,wpc_low_threshold_normal = <0>; - battery,wpc_low_recovery_normal = <50>; - - battery,full_check_type = <2>; /* SEC_BATTERY_FULLCHARGED_FG_CURRENT */ - battery,full_check_type_2nd = <2>; /* SEC_BATTERY_FULLCHARGED_FG_CURRENT */ - battery,full_check_count = <1>; - battery,chg_gpio_full_check = <0>; - battery,chg_polarity_full_check = <1>; - - battery,chg_heating_prevention_method = <1>; /* SEC_BATTERY_BY_CHANGING_CURRENT */ - battery,chg_high_temp = <470>; - battery,chg_high_temp_recovery = <430>; - battery,chg_input_limit_current = <1000>; - battery,chg_charging_limit_current = <1800>; - battery,dchg_input_limit_current = <1000>; - battery,dchg_charging_limit_current = <2000>; - - battery,mix_high_temp = <420>; - battery,mix_high_chg_temp = <500>; - battery,mix_high_temp_recovery = <390>; - - /* SEC_BATTERY_FULL_CONDITION_SOC | - * SEC_BATTERY_FULL_CONDITION_NOTIMEFULL | - * SEC_BATTERY_FULL_CONDITION_VCELL - */ - battery,full_condition_type = <13>; - battery,full_condition_soc = <93>; - battery,full_condition_vcell = <4250>; - - battery,recharge_check_count = <1>; - battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */ - battery,recharge_condition_soc = <98>; - battery,recharge_condition_vcell = <4280>; - - battery,charging_total_time = <14400>; - battery,hv_charging_total_time = <10800>; - battery,normal_charging_total_time = <18000>; - battery,usb_charging_total_time = <36000>; - battery,recharging_total_time = <5400>; - battery,charging_reset_time = <0>; - - battery,chg_float_voltage = <4350>; - - battery,swelling_high_temp_block = <410>; - battery,swelling_high_temp_recov = <390>; - battery,swelling_wc_high_temp_recov = <390>; - battery,swelling_low_temp_block_1st = <150>; - battery,swelling_low_temp_recov_1st = <170>; - battery,swelling_low_temp_block_2nd = <50>; - battery,swelling_low_temp_recov_2nd = <70>; - battery,swelling_low_temp_3rd_ctrl; - battery,swelling_low_temp_block_3rd = <180>; - battery,swelling_low_temp_recov_3rd = <200>; - - battery,swelling_low_temp_current = <1050>; /* 0.3C */ - battery,swelling_low_temp_current_2nd = <400>; - battery,swelling_low_temp_current_3rd = <3100>; - battery,swelling_low_temp_topoff = <250>; /* 0.05C */ - battery,swelling_high_temp_current = <1550>; /* 0.45C */ - battery,swelling_high_temp_topoff = <250>; /* 0.05C */ - battery,swelling_wc_high_temp_current = <750>; /* 0.3C */ - battery,swelling_wc_low_temp_current = <750>; /* 0.3C */ - - battery,swelling_drop_float_voltage = <4150>; - battery,swelling_high_rechg_voltage = <4000>; - battery,swelling_low_rechg_voltage = <4200>; - - battery,siop_event_check_type = <1>; - battery,siop_call_cv_current = <330>; - battery,siop_call_cc_current = <330>; - - battery,siop_input_limit_current = <1200>; - battery,siop_charging_limit_current = <1000>; - battery,siop_hv_input_limit_current = <700>; - battery,siop_hv_charging_limit_current = <1000>; - battery,input_current_by_siop_20 = <400>; - - battery,rp_current_rp1 = <500>; - battery,rp_current_rp2 = <1500>; - battery,rp_current_rp3 = <3000>; - battery,rp_current_rdu_rp3 = <2100>; - battery,rp_current_abnormal_rp3 = <1800>; - - battery,pd_charging_charge_power = <15000>; - battery,max_charging_current = <3150>; - battery,battery_full_capacity = <4400>; - battery,ttf_hv_charge_current = <2750>; - battery,ttf_dc25_charge_current = <3200>; - - battery,ttf_capacity = <3604>; - battery,cv_data = < - 3069 830 1800 - 2972 838 1750 - 2836 846 1700 - 2770 853 1650 - 2703 859 1600 - 2587 864 1550 - 2523 871 1500 - 2424 878 1450 - 2342 884 1400 - 2319 887 1350 - 2131 893 1300 - 2137 899 1250 - 2044 905 1200 - 2009 908 1150 - 1928 913 1100 - 1919 919 1050 - 1839 922 1000 - 1775 927 950 - 1748 931 900 - 1654 937 850 - 1633 940 800 - 1615 944 750 - 1546 946 700 - 1531 949 650 - 1484 952 600 - 1377 958 550 - 1326 963 500 - 1266 969 450 - 1190 973 400 - 1143 977 350 - 1072 981 300 - 1023 985 250 - 1027 988 200 - 1010 992 150 - 865 994 100 - 850 997 50 - 846 1000 0 - >; - /* cycle, chg_float_voltage, recharge_condition_vcell, full_condition_vcell, full_condition_soc, step charging condition */ - battery,age_data = <0 4350 4280 4250 93 45 /*4.35*/ - 300 4330 4260 4230 92 45 /*4.33*/ - 400 4310 4240 4210 91 45 /*4.31*/ - 700 4290 4220 4190 90 45 /*4.29*/ - 1000 4240 4170 4140 89 45 /*4.24*/ - >; - - /* step charging option */ - battery,step_charging_type = <0>; - battery,step_charging_charge_power = <12000>; - battery,step_charging_condition = <45 100>; - battery,step_charging_condition_curr = <3100 3100>; - battery,step_charging_current = <3100 3100>; - battery,step_charging_float_voltage = <4150 4350>; - - /* direct step charging option */ - battery,dc_step_chg_type = <0x6B>; /* origin(0x6B), soc option is temporary removed */ - battery,dc_step_chg_charge_power = <22000>; - battery,dc_step_chg_step = <3>; - battery,dc_step_chg_cond_vol = <4090 4190 4350>; /* STEP_CHARGING_CONDITION_VOLTAGE */ - battery,dc_step_chg_cond_iin = <1950 1575 0>; /* STEP_CHARGING_CONDITION_INPUT_CURRENT */ - battery,dc_step_chg_iin_check_cnt = <3>; - battery,dc_step_chg_cond_soc = <9 48 100>; /* STEP_CHARGING_CONDITION_SOC */ - battery,dc_step_chg_val_vfloat = <4090 4190 4350>; /* STEP_CHARGING_CONDITION_FLOAT_VOLTAGE */ - battery,dc_step_chg_val_iout = <4600 3900 3100>; - - battery,max_input_voltage = <9000>; /* mV */ - battery,max_input_current = <3000>; /* mA */ - - battery,standard_curr = <3100>; - battery,expired_time = <12600>; /* 150 + 60 minutes */ - battery,recharging_expired_time = <5400>; - - battery,cisd_alg_index = <7>; - - battery,cisd_max_voltage_thr = <5000>; /* battery ovp detection voltage */ - - io-channels = <&pm6150_vadc ADC_BAT_THERM_PU2>; - io-channel-names = "adc-temp"; - - battery,recovery_cable; - battery,lowtemp_support_full_volt; - battery,enable_water_resistance; - battery,ta_alert_wa; - }; - - - s2mu107-charger { - status = "disable"; - compatible = "samsung,s2mu107-switching-charger"; - }; - - s2mu107-direct-charger { - status = "enable"; - dc,direct_charger_name = "s2mu107-direct-charger"; - - dc,step_charge_level = <3>; - dc,dc_step_voltage_45w = <4090 4190 4350>; - dc,dc_step_current_45w = <4600 3900 3100>; - dc,dc_step_voltage_25w = <4090 4190 4350>; - dc,dc_step_current_25w = <4600 3900 3100>; - dc,dc_c_rate = <20 14 9>; - }; - - - sec-direct-charger { - status = "okay"; - compatible = "samsung,sec-direct-charger"; - - charger,battery_name = "battery"; - charger,main_charger = "s2mu107-switching-charger"; - charger,direct_charger = "s2mu107-direct-charger"; - - charger,dchg_min_current = <2000>; - charger,dchg_temp_low_threshold = <180>; - charger,dchg_temp_high_threshold = <410>; - charger,ta_alert_wa; - }; - - 12c@13 { - s2mu107-fuelgauge@3B{ - compatible = "samsung,s2mu107-fuelgauge"; - reg = <0x3B>; - pinctrl-names = "default"; - pinctrl-0 = <&fuel_irq>; - fuelgauge,charger_name = "s2mu107-switching-charger"; - fuelgauge,fuel_int = <&tlmm 104 0>; - fuelgauge,fuel_alert_soc = <1>; - fuelgauge,fuel_alert_vol = <3300>; - fuelgauge,low_temp_limit = <100>; - fuelgauge,sw_vbat_l_recovery_vol = <3465>; - fuelgauge,capacity_max = <990>; - fuelgauge,capacity_max_margin = <200>; - fuelgauge,capacity_min = <0>; - fuelgauge,capacity_calculation_type = <28>; - fuelgauge,capacity_full = <3000>; - fuelgauge,type_str = "SDI"; - fuelgauge,fg_log_enable = <1>; - fuelgauge,low_vbat_threshold_lowtemp = <3000>; - }; - - flash_led { - reg = <0x74>; - compatible = "qcom,s2mu107-fled"; - enable = <1 1>; - flash-gpio = <&tlmm 22 0>; - torch-gpio = <&tlmm 24 0>; - pinctrl-names = "fled_default", "fled_suspend"; - pinctrl-0 = <&cam_flash_active &cam_torch_active>; - pinctrl-1 = <&cam_flash_suspend &cam_torch_suspend>; - flash_current = <1400>; - preflash_current = <200>; - torch_current = <300>; - movie_current = <200>; - factory_current = <300>; - flashlight_current = <25 75 100 150 200>; - status = "okay"; - }; - }; - -battery_params { - battery,battery_data = - < - /***** battery data for 4.35 *****/ - /* battery,battery_table3 */ - 5 11 123 10 241 9 123 9 12 9 - 167 8 48 8 201 7 147 7 69 7 - 219 6 161 6 121 6 90 6 65 6 - 46 6 7 6 217 5 149 5 128 5 - 171 3 139 1 107 8 0 8 149 7 - 42 7 191 6 84 6 232 5 125 5 - 18 5 167 4 60 4 209 3 102 3 - 251 2 144 2 37 2 186 1 78 1 - 227 0 120 0 13 0 218 15 - - /* battery,battery_table4 */ - 10 10 10 10 29 29 28 28 28 27 - 27 28 28 30 31 32 33 35 38 45 - 57 112 - - /* battery,batcap */ - 0x1C 0x43 0xBE 0x0B /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x08 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10523 10000 9477 8954 8431 7907 7385 6862 6339 5816 - 5293 4770 4248 3725 3202 2679 2156 1633 1110 587 - 64 (-187) - - /* battery,ocv_arr_val */ - 43776 43103 42429 41853 41308 40814 40233 39731 39467 39086 - 38569 38288 38091 37939 37819 37723 37533 37312 36977 36873 - 34584 31928 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.33 *****/ - /* battery,battery_table3 */ - 5 11 123 10 242 9 123 9 12 9 - 167 8 48 8 201 7 147 7 69 7 - 219 6 161 6 121 6 90 6 65 6 - 46 6 7 6 217 5 149 5 128 5 - 171 3 139 1 126 8 18 8 166 7 - 58 7 206 6 98 6 246 5 138 5 - 30 5 178 4 69 4 217 3 109 3 - 1 3 149 2 41 2 189 1 81 1 - 229 0 121 0 13 0 218 15 - - /* battery,battery_table4 */ - 10 10 10 10 29 29 28 28 28 27 - 27 28 28 30 31 32 33 35 39 45 - 57 112 - - /* battery,batcap */ - 0xB0 0x45 0xF0 0x0D /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10614 10086 9559 9031 8504 7976 7449 6921 6394 5866 - 5339 4811 4284 3756 3229 2701 2174 1646 1119 591 - 64 (-187) - - /* battery,ocv_arr_val */ - 43776 43102 42429 41852 41309 40813 40233 39730 39467 39085 - 38569 38288 38091 37939 37818 37723 37533 37311 36976 36873 - 34583 31928 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.31 *****/ - /* battery,battery_table3 */ - 5 11 123 10 242 9 123 9 12 9 - 167 8 48 8 201 7 147 7 69 7 - 219 6 161 6 121 6 90 6 65 6 - 46 6 7 6 217 5 149 5 128 5 - 171 3 139 1 161 8 51 8 197 7 - 87 7 234 6 124 6 14 6 160 5 - 50 5 197 4 87 4 233 3 123 3 - 14 3 160 2 50 2 196 1 87 1 - 233 0 123 0 13 0 218 15 - - /* battery,battery_table4 */ - 10 10 10 10 29 29 28 28 28 27 - 27 28 28 30 31 32 33 35 39 45 - 57 112 - - /* battery,batcap */ - 0x9C 0x44 0xD8 0x0B /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10784 10248 9712 9176 8640 8104 7568 7032 6496 5960 - 5424 4888 4352 3816 3281 2745 2209 1673 1137 601 - 65 (-189) - - /* battery,ocv_arr_val */ - 43776 43102 42429 41852 41309 40813 40233 39730 39467 39085 - 38569 38288 38091 37939 37818 37723 37533 37311 36976 36873 - 34583 31928 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.29 *****/ - /* battery,battery_table3 */ - 5 11 123 10 242 9 123 9 12 9 - 167 8 48 8 201 7 147 7 69 7 - 219 6 161 6 121 6 90 6 65 6 - 46 6 7 6 217 5 149 5 128 5 - 171 3 139 1 200 8 88 8 232 7 - 121 7 9 7 153 6 41 6 186 5 - 74 5 218 4 107 4 251 3 139 3 - 28 3 172 2 60 2 204 1 93 1 - 237 0 125 0 14 0 217 15 - - /* battery,battery_table4 */ - 10 10 10 10 29 29 28 28 28 27 - 27 28 28 30 31 32 33 35 39 45 - 57 112 - - /* battery,batcap */ - 0x68 0x43 0x7B 0x0D /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10975 10429 9884 9338 8793 8248 7702 7157 6611 6066 - 5520 4975 4430 3884 3339 2793 2248 1702 1157 612 - 66 (-190) - - /* battery,ocv_arr_val */ - 43776 43102 42429 41852 41309 40813 40233 39730 39467 39085 - 38569 38288 38091 37939 37818 37723 37533 37311 36976 36873 - 34583 31928 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.24 *****/ - /* battery,battery_table3 */ - 5 11 123 10 242 9 123 9 12 9 - 167 8 48 8 201 7 147 7 69 7 - 219 6 161 6 121 6 90 6 65 6 - 46 6 7 6 217 5 149 5 128 5 - 171 3 139 1 45 9 184 8 68 8 - 207 7 90 7 229 6 113 6 252 5 - 135 5 18 5 158 4 41 4 180 3 - 63 3 203 2 86 2 225 1 108 1 - 248 0 131 0 14 0 217 15 - - /* battery,battery_table4 */ - 10 10 10 10 29 29 28 28 28 27 - 27 28 28 30 31 32 33 35 39 45 - 57 112 - - /* battery,batcap */ - 0x80 0x40 0xE6 0x0C /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 11471 10900 10330 9760 9190 8620 8050 7480 6910 6340 - 5770 5200 4630 4060 3490 2919 2349 1779 1209 639 - 69 (-195) - - /* battery,ocv_arr_val */ - 43776 43102 42429 41852 41309 40813 40233 39730 39467 39085 - 38569 38288 38091 37939 37818 37723 37533 37311 36976 36873 - 34583 31928 - - /* battery,tunning */ - 0x00 - >; - - battery,battery_table3 = < - 5 11 123 10 241 9 123 9 12 9 - 167 8 48 8 201 7 147 7 69 7 - 219 6 161 6 121 6 90 6 65 6 - 46 6 7 6 217 5 149 5 128 5 - 171 3 139 1 107 8 0 8 149 7 - 42 7 191 6 84 6 232 5 125 5 - 18 5 167 4 60 4 209 3 102 3 - 251 2 144 2 37 2 186 1 78 1 - 227 0 120 0 13 0 218 15 - >; - - battery,battery_table4 = < - 10 10 10 10 29 29 28 28 28 27 - 27 28 28 30 31 32 33 35 38 45 - 57 112 - >; - - battery,batcap = <0x1C 0x43 0xBE 0x0B>; /* [0x0E] [0x0F] [0x10] [0x11] */ - - battery,soc_arr_val = < - 10523 10000 9477 8954 8431 7907 7385 6862 6339 5816 - 5293 4770 4248 3725 3202 2679 2156 1633 1110 587 - 64 (-187) - >; - - battery,ocv_arr_val = < - 43776 43103 42429 41853 41308 40814 40233 39731 39467 39086 - 38569 38288 38091 37939 37819 37723 37533 37312 36977 36873 - 34584 31928 - >; - - }; - -/* sec_battery_cable - * 0 UNKNOWN, - * 1 NONE, - * 2 PREPARE_TA, - * 3 TA, - * 4 USB, - * 5 USB_CDP, - * 6 9V_TA, - * 7 9V_ERR, - * 8 9V_UNKNOWN, - * 9 12V_TA, - * 10 WIRELESS, - * 11 HV_WIRELESS, - * 12 PMA_WIRELESS, - * 13 WIRELESS_PACK, - * 14 WIRELESS_PACK_TA, - * 15 WIRELESS_STAND, - * 16 WIRELESS_HV_STAND, - * 17 QC20, - * 18 QC30, - * 19 PDIC, - * 20 UARTOFF, - * 21 OTG, - * 22 LAN_HUB, - * 23 POWER_SHARING, - * 24 HMT_CONNECTED, - * 25 HMT_CHARGE, - * 26 HV_TA_CHG_LIMIT, - * 27 WIRELESS_VEHICLE, - * 28 WIRELESS_HV_VEHICLE, - * 29 PREPARE_WIRELESS_HV, - * 30 TIMEOUT, - * 31 SMART_OTG, - * 32 SMART_NOTG, - * 33 WIRELESS_TX, - * 34 WIRELESS_HV_20, - * 35 WIRELESS_HV_20_LIMIT, - * 36 WIRELESS_FAKE, - * 37 WIRELESS_HV_20_PREPARE, - * 38 PDIC_APDO, - * 39 POGO, - */ - - cable-info { - default_input_current = <1800>; - default_charging_current = <2100>; - full_check_current_1st = <650>; - full_check_current_2nd = <250>; - - current_group_1 { - cable_number = <1 4 19 21 22 23 30>; - input_current = <500>; - charging_current = <500>; - }; - - current_group_2 { - cable_number = <2 25>; - input_current = <1000>; - charging_current = <1000>; - }; - - current_group_3 { - cable_number = <5>; - input_current = <1500>; - charging_current = <1500>; - }; - - current_group_4 { - cable_number = <6 7 8>; - input_current = <1650>; - charging_current = <3100>; - }; - - current_group_5 { - cable_number = <9>; - input_current = <1650>; - charging_current = <2200>; - }; - - current_group_6 { - cable_number = <10 12 14 15 27>; - input_current = <900>; - charging_current = <1200>; - }; - - current_group_7 { - cable_number = <13>; - input_current = <700>; - charging_current = <1200>; - }; - - current_group_8 { - cable_number = <24>; - input_current = <1000>; - charging_current = <450>; - }; - - current_group_9 { - cable_number = <26>; - input_current = <2000>; - charging_current = <1800>; - }; - - current_group_10 { - cable_number = <11 16 28>; - input_current = <650>; - charging_current = <1200>; - }; - - current_group_11 { - cable_number = <29>; - input_current = <500>; - charging_current = <1200>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-common.dtsi deleted file mode 100755 index 07828c2dce5f..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-common.dtsi +++ /dev/null @@ -1,195 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -#include -#include "../drivers/sm7150-sec-a71-audio.dtsi" -#include "sm7150-sec-a71-input-common.dtsi" -#include "sm7150-sec-a71-pinctrl-common.dtsi" -#include "../drivers/sm7150-sec-a71-mst-r00.dtsi" - -&aliases { - i2c17 = &i2c_17; - hsuart8 = "/soc/qcom,qup_hsuart@0xa88000"; -}; - -&reserved_memory { - camera_mem: camera_mem_region { - reg = <0x0 0xC2000000 0x0 0x25800000>; - ion,recyclable; - }; -}; - -&soc { - qcom,ion { - qcom,ion-heap@30 { /* CAMERA HEAP */ - reg = <30>; - memory-region = <&camera_mem>; - qcom,ion-heap-type = "RBIN"; - }; - }; -}; - -&soc { - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = <&tlmm 25 0 /* sda */ - &tlmm 26 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&grip_i2c_active>; - pinctrl-1 = <&grip_i2c_suspend>; - - a96t3x6@21 { - compatible = "a96t3x6"; - reg = <0x21>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_int_active>; - pinctrl-1 = <&grip_int_suspend>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - a96t3x6,irq_gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_LOW>; - a96t3x6,dvdd_vreg_name = "pm6150l_l11"; - a96t3x6,fw_path = "abov/a96t356_a71.bin"; - a96t3x6,firmup_cmd = <0x3b>; - }; - - a96t3x6_sub@20 { - compatible = "a96t3x6_sub"; - reg = <0x20>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_sub_int_active>; - pinctrl-1 = <&grip_sub_int_suspend>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - a96t3x6,irq_gpio = <&pm6150l_gpios 6 GPIO_ACTIVE_LOW>; - a96t3x6,dvdd_vreg_name = "pm6150_l16"; - a96t3x6,fw_path = "abov/a96t356_a71_sub.bin"; - a96t3x6,firmup_cmd = <0x3b>; - }; - }; - - /* Sensor */ - qcom,lpass@62400000 { - sensor_vdd-supply = <&pm6150l_l8>; - qcom,sensor_vdd-uV-uA = <1800000 0>; - qcom,active-reg-names = "sensor_vdd"; - }; - - ssc_core { - status = "okay"; - compatible = "ssc_core"; - ssc_core,mst_gpio = <&pm6150l_gpios 4 GPIO_ACTIVE_HIGH>; - }; - - sec_detect_conn { - compatible = "samsung,sec_detect_conn"; - - sec,det_pm_conn_gpios = <&pm6150_gpios 8 0>; /* SUB_CONNECT */ - sec,det_pm_conn_name = "SUB_CONNECT"; - - - pinctrl-names = "det_pm_connect"; - pinctrl-0 = <&detect_conn_pm_setting>; - }; - - sec_abc { - compatible = "samsung,sec_abc"; - status = "okay"; - - gpu { - gpu,label="GPU fault"; - gpu,threshold_count=<20>; - gpu,threshold_time=<1200>; - }; - aicl { - aicl,label="battery aicl"; - aicl,threshold_count=<5>; - aicl,threshold_time=<300>; - }; - }; - - abc_hub { - compatible = "samsung,abc_hub"; - status = "okay"; - - pinctrl-names = "det_pm_connect"; - pinctrl-0 = <&detect_conn_pm_setting>; - - bootc { - bootc,time_spec_user = <100000>; /* user binary user build */ - bootc,time_spec_eng = <100000>; /* user binary eng build */ - bootc,time_spec_fac = <100000>; /* factory binary */ - }; - - cond { - sec,det_pm_conn_gpios = <&pm6150_gpios 8 0>; /* SUB_CONNECT */ - sec,det_pm_conn_name = "sub"; - }; - }; - - qupv3_se8_2hsuart: qcom,qup_hsuart@0xa88000 { - compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; - reg = <0xa88000 0x4000>; - reg-names = "se_phys"; - clock-names = "se-clk", "m-ahb", "s-ahb"; - clocks = <&clock_gcc GCC_QUPV3_WRAP1_S2_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_M_AHB_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_S_AHB_CLK>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&qupv3_se8_2uart_tx_active>,<&qupv3_se8_2uart_rx_active>; - pinctrl-1 = <&qupv3_se8_2uart_tx_sleep>,<&qupv3_se8_2uart_rx_sleep>; - interrupts = ; - qcom,wrapper-core = <&qupv3_1>; - status = "ok"; - always-on-clock; - }; -}; - -&shared_meta { - status = "okay"; - parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_samsung,recovery,dtbo,abl,xbl,tz,hyp"; -}; - -/* Grip Sensor */ -&pm6150_l16 { - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; -}; - -&pm6150l_l11 { - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; -}; - -/* not use eMMC */ -&sdhc_1 { - status = "disabled"; -}; -/* not use SDcard */ -&sdhc_2 { - cd-gpios = <&tlmm 88 0x0>; -}; - - diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-input-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-input-common.dtsi deleted file mode 100755 index cc4c1b28f3bf..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-input-common.dtsi +++ /dev/null @@ -1,194 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&tlmm { - attn_irq: attn_irq { - mux { - pins = "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio9"; - input-enable; - bias-disable; /* No PULL */ - drive-strength = <2>; - }; - }; - attn_input: attn_input { - mux { - pins = "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio9"; - /*input-enable;*/ - bias-disable; - drive-strength = <2>; - }; - }; -}; - -&pm6150_gpios { - tsp_int_dvdd_en: tsp_int_dvdd_en { - pins = "gpio4"; - function = "normal"; - power-source = <0>; - }; -}; - - -&qupv3_se7_i2c { - status = "ok"; - - touchscreen@50 { - compatible = "imagis,ist40xx-ts"; - reg = <0x50>; - imagis,irq-gpio = <&tlmm 9 0>; - imagis,regulator_avdd = "tsp_ldo_en"; - imagis,fw-bin = <1>; - imagis,octa-hw = <1>; - imagis,area-size = <63 126 60>; /* indicator: 24dp~63px navigator:48dp~126px edge:60px | dpi:420*/ - imagis,ic-version = "ist40xx"; - imagis,project-name = "a70s"; - imagis,tclm_level = <1>; - imagis,afe_base = <0x0000>; - imagis,factory_item_version = <1>; - imagis,cm_spec = <300 2200 43>; /* min, max, gap */ - enable_fpcb_noise_test; - enable_settings_aot; - support_fod; - status = "ok"; - }; - - mms_ts@48 { - compatible = "melfas,mms_ts"; - reg = <0x48>; - pinctrl-names = "on_state", "off_state"; - pinctrl-0 = <&attn_irq>; - pinctrl-1 = <&attn_input>; - melfas,irq-gpio = <&tlmm 9 0>; - melfas,scl-gpio = <&tlmm 7 0>; - melfas,sda-gpio = <&tlmm 6 0>; - melfas,vdd_en = "tsp_ldo_en"; - /*melfas,io_en = "tsp_io";*/ - melfas,area-size = <133 266 341>; /* indicator: 24dp navigator:48dp edge:60px TSP resolution is 4095 x 4095 */ - melfas,max_x_y = <4095 4095>; /* x & y */ - melfas,display_resolution = <1080 2400>; - melfas,node_info = <16 34 0>; /* x & y & key */ - melfas,fod_info = <16 14 28>; /* tx, rx, vi size */ - melfas,event_info = <8 12>; /* event format & event size */ - melfas,support_lpm = "true"; - melfas,fw_name = "tsp_melfas/mss100_a70s.bin"; - melfas,ss_touch_num = <1>; - support_ear_detect_mode; - enable_settings_aot; - support_fod; - support_open_short_test; - melfas,regulator_boot_on; - status = "ok"; - }; - - touchscreen@48 { - status = "ok"; - compatible = "sec,sec_ts"; - reg = <0x48>; - interrupt-parent = <&tlmm>; - interrupts = <9 0>; - pinctrl-names = "default", "on_state", "off_state"; - pinctrl-0 = <&attn_irq &tsp_int_dvdd_en>; - pinctrl-1 = <&attn_irq &tsp_int_dvdd_en>; - pinctrl-2 = <&attn_irq>; - sec,irq_gpio = <&tlmm 9 0x2008>; - sec,dvdd_gpio = <&pm6150_gpios 4 0>; /* tsp_dvdd_en PMIC GPIO 4, tsp_ldo_dvdd regulator */ - sec,irq_type = <0x2008>; - sec,max_coords = <4096 4096>; /* x y */ - sec,regulator_avdd = "tsp_ldo_avdd"; - sec,regulator_boot_on; - sec,firmware_name = "tsp_sec/y771_a71_1l.bin", "tsp_sec/y771_a71.bin"; - sec,project_name = "A71", "A715"; - sec,tclm_level = <2>; - sec,afe_base = <0x0107>; - support_dex_mode; - sec,i2c-burstmax = <0xffff>; - sec,ss_touch_num = <1>; - enable_settings_aot; - sec,area-size = <132 266 341>; - support_ear_detect_mode; - sync-reportrate-120 = "Y"; - support_fod; - support_fod_gesture; - support_open_short_test; - support_mis_calibration_test; - sec,bringup = <3>; - }; -}; - -/delete-node/&key_vol_up_default; -&pm6150l_gpios { - key_vol_up { - key_vol_up_default: key_vol_up_default { - pins = "gpio2"; - function = "normal"; - input-enable; - bias-pull-up; - power-source = <0>; - }; - }; -}; - -&soc { - /delete-node/gpio_keys; - gpio_keys { - status = "ok"; - compatible = "gpio-keys"; - input-name = "gpio-keys"; - - pinctrl-names = "default"; - pinctrl-0 = <&key_vol_up_default>; - - vol_up { - label = "volume_up"; - gpios = <&pm6150l_gpios 2 0x1>; - linux,input-type = <1>; - linux,code = ; - debounce-interval = <15>; - }; - }; - - ss_touch { - compatible = "samsung,ss_touch"; - ss_touch,numbers = <1>; - }; - - tsp_ldo_en { - compatible = "regulator-fixed"; - regulator-name = "tsp_ldo_en"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - gpio = <&tlmm 56 0>; - enable-active-high; - regulator-boot-on; - }; - - tsp_ldo_avdd { - compatible = "regulator-fixed"; - regulator-name = "tsp_ldo_avdd"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - gpio = <&tlmm 56 0>; - enable-active-high; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-pinctrl-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-pinctrl-common.dtsi deleted file mode 100755 index 4b3674beb6f2..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-pinctrl-common.dtsi +++ /dev/null @@ -1,541 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../drivers/sm7150-sec-a71-audio-pinctrl.dtsi" - -&tlmm { - s2mpb03_i2c_pins { - s2mpb03_i2c_active: s2mpb03_i2c_active { - mux { - pins = "gpio46", "gpio47"; - function = "gpio"; - }; - config { - pins = "gpio46", "gpio47"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - - grip_i2c { - grip_i2c_active: grip_i2c_active { - grip_i2c_active { - pins = "gpio25", "gpio26"; - bias-disable; - }; - }; - grip_i2c_suspend: grip_i2c_suspend { - grip_i2c_suspend { - pins = "gpio25", "gpio26"; - bias-disable; - }; - }; - }; - - fuel_irq: fuel_irq { - config { - pins = "gpio104"; - bias-disable; /* No PULL */ - }; - }; - - hall_default: hall_default { - mux { - pins = "gpio91"; - function = "gpio"; - }; - config { - pins = "gpio91"; - drive-strength = <2>; - bias-disable; - }; - }; - - certify_hall_default: certify_hall_default { - mux { - pins = "gpio93"; - function = "gpio"; - }; - config { - pins = "gpio93"; - drive-strength = <2>; - bias-disable; - }; - }; - - sdc2_cd_on: cd_on { - mux { - pins = "gpio88"; - function = "gpio"; - }; - - config { - pins = "gpio88"; - drive-strength = <2>; - bias-disable; - }; - }; - - sdc2_cd_off: cd_off { - mux { - pins = "gpio88"; - function = "gpio"; - }; - - config { - pins = "gpio88"; - drive-strength = <2>; - bias-disable; - }; - }; - - cam_sensor_mclk0_active: cam_sensor_mclk0_active { - /* Main Rear MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk0_suspend: cam_sensor_mclk0_suspend { - /* Main Rear MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk1_active: cam_sensor_mclk1_active { - /* FRONT MCLK */ - mux { - pins = "gpio14"; - function = "cam_mclk"; - }; - config { - pins = "gpio14"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk1_suspend: cam_sensor_mclk1_suspend { - /* FRONT MCLK */ - mux { - pins = "gpio14"; - function = "cam_mclk"; - }; - config { - pins = "gpio14"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk2_active: cam_sensor_mclk2_active { - /* Bokeh Cam MCLK */ - mux { - pins = "gpio16"; - function = "cam_mclk"; - }; - config { - pins = "gpio16"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk2_suspend: cam_sensor_mclk2_suspend { - /* Bokeh Cam MCLK */ - mux { - pins = "gpio16"; - function = "cam_mclk"; - }; - config { - pins = "gpio16"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk3_active: cam_sensor_mclk3_active { - /* UW Cam MCLK */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - config { - pins = "gpio15"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk3_suspend: cam_sensor_mclk3_suspend { - /* UW Cam MCLK */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - config { - pins = "gpio15"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - - }; - }; - - cam_sensor_rear_active: cam_sensor_rear_active { - /* Main Rear reset */ - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_rear_suspend: cam_sensor_rear_suspend { - /* Main Rear reset */ - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_front_active: cam_sensor_front_active { - /* FRONT RESET */ - mux { - pins = "gpio23"; - function = "gpio"; - }; - config { - pins = "gpio23"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_front_suspend: cam_sensor_front_suspend { - /* FRONT RESET */ - mux { - pins = "gpio23"; - function = "gpio"; - }; - config { - pins = "gpio23"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - - - cam_sensor_rear3sw_active: cam_sensor_rear3sw_active { - /* UW Cam RESET */ - mux { - pins = "gpio53"; - function = "gpio"; - }; - config { - pins = "gpio53"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_rear3sw_suspend: cam_sensor_rear3sw_suspend { - /* UW Cam RESET */ - mux { - pins = "gpio53"; - function = "gpio"; - }; - config { - pins = "gpio53"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_rear3_pwr_active: cam_rear3_pwr_active { - /* UW VANA */ - mux { - pins = "gpio4"; - function = "gpio"; - }; - config { - pins = "gpio4"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_rear3_pwr_suspend: cam_rear3_pwr_suspend { - /* UW VANA */ - mux { - pins = "gpio4"; - function = "gpio"; - }; - config { - pins = "gpio4"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_mipi_sel_active: cam_mipi_sel_active { - /* MIPI SEL */ - mux { - pins = "gpio51"; - function = "gpio"; - }; - config { - pins = "gpio51"; - bias-disable; - output-high; - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_mipi_sel_suspend: cam_mipi_sel_suspend { - /* MIPI SEL */ - mux { - pins = "gpio51"; - function = "gpio"; - }; - config { - pins = "gpio51"; - bias-pull-down; - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear_sub2_active: cam_sensor_rear_sub2_active { - /* Bokeh Cam RESET */ - mux { - pins = "gpio67"; - function = "gpio"; - }; - config { - pins = "gpio67"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear_sub2_suspend: cam_sensor_rear_sub2_suspend { - /* Bokeh Cam RESET */ - mux { - pins = "gpio67"; - function = "gpio"; - }; - config { - pins = "gpio67"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_flash_active: cam_flash_active { - /* TORCH, FLASH */ - mux { - pins = "gpio22"; - function = "gpio"; - }; - config { - pins = "gpio22"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_flash_suspend: cam_flash_suspend { - /* TORCH, FLASH */ - mux { - pins = "gpio22"; - function = "gpio"; - }; - config { - pins = "gpio22"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_torch_active: cam_torch_active { - /* TORCH, FLASH */ - mux { - pins = "gpio24"; - function = "gpio"; - }; - config { - pins = "gpio24"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_torch_suspend: cam_torch_suspend { - /* TORCH, FLASH */ - mux { - pins = "gpio24"; - function = "gpio"; - }; - config { - pins = "gpio24"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - led_enable: led_enable { - mux { - pins = "gpio22"; - function = "gpio"; - }; - - config { - pins = "gpio22"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - led_disable: led_disable { - mux { - pins = "gpio22"; - function = "gpio"; - }; - - config { - pins = "gpio22"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - -}; - -&pm6150_gpios { - detect_conn_pm_setting: detect_conn_pm_setting { - pins = "gpio8"; /* SUB_DET */ - function = "normal"; - power-source = <0>; - bias-disable; /* NO PULL */ - input-enable; - }; - -}; - -&pm6150l_gpios { - grip_int_active: grip_int_active { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_int_suspend: grip_int_suspend { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - grip_sub_int_active: grip_sub_int_active { - pins = "gpio6"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_sub_int_suspend: grip_sub_int_suspend { - pins = "gpio6"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - cam_sensor_rear4sw_active: cam_sensor_rear4sw_active{ - pins = "gpio11"; - function = "normal"; - power-source = <1>; - input-enable; - bias-disable; - }; - - cam_sensor_rear4sw_suspend: cam_sensor_rear4sw_suspend{ - pins = "gpio11"; - function = "normal"; - power-souce = <1>; - input-enable; - bias-disable; - }; - - - cam_sensor_rear4_pwr_active: cam_sensor_rear4_pwr_active{ - pins = "gpio12"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - cam_sensor_rear4_pwr_suspend: cam_sensor_rear4_pwr_suspend{ - pins = "gpio12"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - - cam_sensor_rear4_digital_active: cam_sensor_rear4_digital_active{ - pins = "gpio10"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - cam_sensor_rear4_digital_suspend: cam_sensor_rear4_digital_suspend{ - pins = "gpio10"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - -}; diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-pm-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-pm-common.dtsi deleted file mode 100755 index 73e1936ea3d8..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-a71-pm-common.dtsi +++ /dev/null @@ -1,298 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include - -&soc { - /* AP Thermistor table */ - sec_thermistor@0 { - compatible = "samsung,sec-ap-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "ap_therm"; - adc_array = <1806 2208 2620 3076 3638 4355 5223 - 6133 7170 8378 9652 11107 12609 - 14233 15644 17608 19255 20912 22081 23487 24556 25655 26345>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* PA Thermistor table */ - sec_thermistor@1 { - compatible = "samsung,sec-pa-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "pa_therm"; - adc_array = <1861 2268 2690 3132 3730 4397 5278 - 6198 7233 8479 9782 11209 12707 - 14338 15719 17722 19343 20876 22320 23575 24750 25730 26411>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* WiFi Thermistor table */ - sec_thermistor@2 { - compatible = "samsung,sec-wf-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM3_PU2>; - io-channel-names = "wf_therm"; - adc_array = <1875 2270 2703 3149 3738 4416 5279 - 6205 7252 8470 9774 11227 12737 - 14358 15740 17754 19334 20932 22258 23619 24773 25779 26501>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@26 { - cell-index = <26>; - compatible = "i2c-gpio"; - gpios = <&tlmm 46 0 /* sda */ - &tlmm 47 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_active>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2900000>; - regulator-max-microvolt = <2900000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -&spmi_bus { - qcom,pm6150@0 { - qcom,power-on@800 { - interrupts = <0x0 0x8 0x0 IRQ_TYPE_NONE>, - <0x0 0x8 0x1 IRQ_TYPE_NONE>, - <0x0 0x8 0x4 IRQ_TYPE_NONE>, - <0x0 0x8 0x5 IRQ_TYPE_NONE>; - interrupt-names = "kpdpwr", "resin", - "resin-bark", "kpdpwr-resin-bark"; - qcom,s3-debounce = <128>; - - qcom,pon_1 { - qcom,support-reset = <0>; - }; - - qcom,pon_2 { - qcom,support-reset = <0>; - }; - - qcom,pon_3 { - qcom,pon-type = ; - qcom,support-reset = <1>; - qcom,pull-up = <1>; - qcom,s1-timer = <6720>; - qcom,s2-timer = <1000>; - qcom,s2-type = ; - qcom,use-bark; - }; - }; - }; - - qcom,pm8009@a { - status = "disabled"; - }; - qcom,pm8009@b { - status = "disabled"; - }; -}; - -/* Prevent voltage drop of LDO12*/ -&pm6150_l12 { - qcom,init-voltage = <1800000>; -}; - -&pm6150_gpios { - interrupts = <0x0 0xc0 0 IRQ_TYPE_NONE>, - <0x0 0xc1 0 IRQ_TYPE_NONE>, - <0x0 0xc2 0 IRQ_TYPE_NONE>, - <0x0 0xc3 0 IRQ_TYPE_NONE>, - <0x0 0xc5 0 IRQ_TYPE_NONE>, - <0x0 0xc6 0 IRQ_TYPE_NONE>, - <0x0 0xc7 0 IRQ_TYPE_NONE>; - - interrupt-names = "pm6150_gpio1", "pm6150_gpio2", - "pm6150_gpio3", "pm6150_gpio4", - "pm6150_gpio6", - "pm6150_gpio7", - "pm6150_gpio8"; - qcom,gpios-disallowed = <5 9 10>; -}; - -&pm6150_adc_tm { - io-channels = <&pm6150_vadc ADC_XO_THERM_PU2>, - <&pm6150_vadc ADC_AMUX_THM2_PU2>, - <&pm6150_vadc ADC_AMUX_THM3_PU2>; - - quiet_therm { - status = "disabled"; - }; -}; - -&pm6150_vadc { - rf_pa0_therm { - reg = ; - label = "pa_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - rf_pa1_therm { - reg = ; - label = "wf_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - quiet_therm { - status = "disabled"; - }; -}; - -&pm6150l_gpios { - interrupts = <0x4 0xc0 0 IRQ_TYPE_NONE>, - <0x4 0xc1 0 IRQ_TYPE_NONE>, - <0x4 0xc2 0 IRQ_TYPE_NONE>, - <0x4 0xc3 0 IRQ_TYPE_NONE>, - <0x4 0xc4 0 IRQ_TYPE_NONE>, - <0x4 0xc5 0 IRQ_TYPE_NONE>, - <0x4 0xc7 0 IRQ_TYPE_NONE>, - <0x4 0xc8 0 IRQ_TYPE_NONE>, - <0x4 0xc9 0 IRQ_TYPE_NONE>, - <0x4 0xca 0 IRQ_TYPE_NONE>, - <0x4 0xcb 0 IRQ_TYPE_NONE>; - interrupt-names = "pm6150l_gpio1", "pm6150l_gpio2", - "pm6150l_gpio3", "pm6150l_gpio4", - "pm6150l_gpio5", "pm6150l_gpio6", - "pm6150l_gpio8", "pm6150l_gpio9", - "pm6150l_gpio10", "pm6150l_gpio11", - "pm6150l_gpio12"; - qcom,gpios-disallowed = <7>; - - dummy_pin { - dummy_pin_default: dummy_pin_default { - pins = "gpio12"; - bias-disable; - }; - }; -}; - -&pm6150l_adc_tm { - status = "disabled"; -/* /delete-property/ io-channels; - - conn_therm { - status = "disabled"; - }; - camera_ftherm { - status = "disabled"; - }; - nvm_therm { - status = "disabled"; - }; */ -}; - -&pm6150l_vadc { - pinctrl-0 = <&dummy_pin_default>; - - sdm_therm { - reg = ; - label = "ap_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - camera_ftherm { - status = "disabled"; - }; - nvm_therm { - status = "disabled"; - }; -}; - -&thermal_zones { - quiet-therm-adc { - status = "disabled"; - }; - conn-therm-adc { - status = "disabled"; - }; - camera-ftherm-adc { - status = "disabled"; - }; - nvm-therm-adc { - status = "disabled"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-common.dtsi deleted file mode 100755 index fe0a1a6fcb68..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-common.dtsi +++ /dev/null @@ -1,563 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -#include "../../qcom/sdmmagpie-idp.dtsi" -#include "../../qcom/sdmmagpie-audio-overlay.dtsi" - -#include "sm7150-sec-dcc.dtsi" - -&reserved_memory { - ss_plog@A1100000 { - compatible = "ss_plog"; - no-map; - reg = <0x0 0xA1100000 0x0 0x00200000>; - }; - - ramoops@A1300000 { - compatible = "ramoops"; - reg = <0 0xA1300000 0 0x100000>; - record-size = <0x40000>; - console-size = <0x40000>; - ftrace-size = <0x40000>; - pmsg-size = <0x40000>; - }; - - /* CONFIG_SEC_DEBUG reserves 8MB */ - sec_debug_region: sec_debug_region@0 { - compatible = "removed-dma-pool"; - no-map; - reg = <0x0 0xA1400000 0x0 0x00800000>; - }; - - /* sec_debug_low_region reserves 4MB - This region is reserved if only debuglevel low */ - /* FIXME: - sec_debug_low_region: sec_debug_low_region@0 { - compatible = "removed-dma-pool"; - no-map; - reg = <0x0 0xA1400000 0x0 0x00400000>; - }; - */ - - sec_debug_autocomment: sec_debug_autocomment@0 { - compatible = "removed-dma-pool"; - no-map; - reg = <0x0 0xA1C00000 0x0 0x00001000>; - }; - - sec_debug_rdx_bootdev: sec_debug_rdx_bootdev@0 { - no-ship; - reg = <0x1 0x00000000 0x0 0x05900000>; - }; - /* Kaslr offset reserve */ - kaslr_region: kaslr_region@80001000 { - compatible = "removed-dma-pool"; - reg = <0x0 0x80001000 0x0 0x00001000>; - }; - - /* rkp_region reserves 2MB for UH_LOG and UH_STATIC_HEAP */ - /* CAUSION: DO NOT reserve 0xB0200000 ~ 0xB1800000 region for RKP at the runtime */ - rkp_region: rkp_region@B0200000 { - compatible = "removed-dma-pool"; - reg = <0x0 0xB0200000 0x0 0x00200000>; - }; - - /*to reserve 1MB for TIMA */ - tima_mem: tima_region@B0100000 { - compatible = "removed-dma-pool"; - no-map; - reg = <0 0xB0100000 0 0x100000>; - }; - - modem_shared_mem: modem_shared_mem_region@BA000000 { - compatible = "modem-removed-dma-pool"; - no-map; - reg = <0x0 0xba000000 0x0 0x06000000>; - }; -}; - -&qseecom_ta_mem { - size = <0 0x2000000>; -}; - -&removed_region { - reg = <0 0x86200000 0 0x5600000>; -}; - -&pil_camera_mem{ - reg = <0 0x8CB00000 0 0x500000>; -}; - -&pil_modem_mem { - reg = <0 0x8D000000 0 0x8C00000>; -}; - -&pil_video_mem { - reg = <0 0x95C00000 0 0x500000>; -}; - -&pil_cdsp_mem { - reg = <0 0x96100000 0 0x1E00000>; -}; - -&pil_adsp_mem { - reg = <0 0x97F00000 0 0x2800000>; -}; - -&wlan_msa_mem { - reg = <0 0x9A700000 0 0x180000>; -}; - -&npu_mem { - reg = <0 0x9A880000 0 0x80000>; -}; - -&pil_ipa_fw_mem { - reg = <0 0x9A900000 0 0x10000>; -}; - -&pil_ipa_gsi_mem { - reg = <0 0x9A910000 0 0x5000>; -}; - -&pil_gpu_mem { - reg = <0 0x9A915000 0 0x2000>; -}; - -&qseecom_mem { - reg = <0 0x9E400000 0 0x2400000>; -}; - -&cdsp_sec_mem { - reg = <0 0xA4000000 0 0xC00000>; -}; - -&soc{ - input_booster { - status = "okay"; - compatible = "input_booster"; - #address-cells = <1>; - #size-cells = <0>; - - booster_key@1 { - input_booster,label = "KEY"; - input_booster,type = <0>; /* BOOSTER_DEVICE_KEY */ - - input_booster,levels = <1>; - - /* Frequency table */ - /* for level : 1_Head */ - input_booster,cpu_freqs = <1324800>; - input_booster,core_num = <0>; - input_booster,hmp_boost = <2>; - input_booster,bimc_freqs = <0>; - input_booster,lpm_bias = <0>; - - /* Time table */ - input_booster,head_times = <200>; - input_booster,tail_times = <0>; - }; - booster_key@2 { - input_booster,label = "TOUCHKEY"; - input_booster,type = <1>; /* BOOSTER_DEVICE_TOUCHKEY */ - - input_booster,levels = <1>; - - /* Frequency table */ - /* for level : 1_Head */ - input_booster,cpu_freqs = <1324800>; - input_booster,core_num = <0>; - input_booster,hmp_boost = <2>; - input_booster,bimc_freqs = <0>; - input_booster,lpm_bias = <0>; - - /* Time table */ - input_booster,head_times = <0>; - input_booster,tail_times = <300>; - }; - booster_key@3 { - input_booster,label = "TOUCH"; - input_booster,type = <2>; /* BOOSTER_DEVICE_TOUCH */ - - input_booster,levels = <1 2 3>; - - /* Frequency table */ - /* for level : 1_Head, 2_Head, 2_Tail */ - input_booster,cpu_freqs = <1324800 1324800 1209600>; - input_booster,core_num = <4 4 0>; - input_booster,hmp_boost = <2 2 2>; - input_booster,bimc_freqs = <0 0 0>; - input_booster,lpm_bias = <5 5 5>; - - /* Time table */ - input_booster,head_times = <200 200 0>; - input_booster,tail_times = <0 0 300>; - }; - booster_key@4 { // Input Booster + - input_booster,label = "MULTITOUCH"; - input_booster,type = <3>; /* BOOSTER_DEVICE_MULTITOUCH */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1324800 0>; - input_booster,core_num = <0 0>; - input_booster,hmp_boost = <2 0>; - input_booster,bimc_freqs = <0 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <1000 0>; - input_booster,tail_times = <0 500>; - }; - booster_key@5 { - input_booster,label = "KEYBOARD"; - input_booster,type = <4>; /* BOOSTER_DEVICE_KEYBOARD */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head, 2_Tail */ - input_booster,cpu_freqs = <1324800 1324800>; - input_booster,core_num = <0 0>; - input_booster,hmp_boost = <2 2>; - input_booster,bimc_freqs = <0 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <130 130>; - input_booster,tail_times = <0 0>; - }; - booster_key@6 { - input_booster,label = "MOUSE"; - input_booster,type = <5>; /* BOOSTER_DEVICE_MOUSE */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1324800 1209600>; - input_booster,core_num = <0 0>; - input_booster,hmp_boost = <2 2>; - input_booster,bimc_freqs = <0 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <200 0>; - input_booster,tail_times = <0 300>; - }; - booster_key@7 { - input_booster,label = "MOUSE WHEEL"; - input_booster,type = <6>; /* BOOSTER_DEVICE_MOUSE */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1324800 0>; - input_booster,core_num = <0 0>; - input_booster,hmp_boost = <2 0>; - input_booster,bimc_freqs = <0 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <200 0>; - input_booster,tail_times = <0 0>; - }; - booster_key@8 { - input_booster,label = "PEN HOVER"; - input_booster,type = <7>; /* BOOSTER_DEVICE_MOUSE */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1324800 1209600>; - input_booster,core_num = <0 0>; - input_booster,hmp_boost = <2 2>; - input_booster,bimc_freqs = <0 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <200 0>; - input_booster,tail_times = <0 300>; - }; - booster_key@9 { - input_booster,label = "PEN"; - input_booster,type = <8>; /* BOOSTER_DEVICE_MOUSE */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1555200 979200>; - input_booster,hmp_boost = <2 2>; - input_booster,ddr_freqs = <0 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <200 0>; - input_booster,tail_times = <0 600>; - }; // Input Booster - - booster_key@10 { - input_booster,label = "KEY_TWO"; - input_booster,type = <9>; /* BOOSTER_DEVICE_KEY */ - - input_booster,levels = <1>; - - /* Frequency table */ - /* for level : 1_Head */ - input_booster,cpu_freqs = <1555200>; - input_booster,hmp_boost = <2>; - input_booster,ddr_freqs = <0>; - input_booster,lpm_bias = <0>; - - /* Time table */ - input_booster,head_times = <700>; - input_booster,tail_times = <700>; - }; - // Input Booster - - /* If you need to add new key type, add it this position */ - }; - - qcom,glinkpkt { - compatible = "qcom,glinkpkt"; - - qcom,glinkpkt-glinkbridge { - qcom,glinkpkt-edge = "mpss"; - qcom,glinkpkt-ch-name = "glink_bridge"; - qcom,glinkpkt-dev-name = "smd4"; - }; - }; - sec_smem@0 { - compatible = "samsung,sec-smem"; - status = "okay"; - }; - qcom,memshare { - compatible = "qcom,memshare"; - - qcom,client_4 { - compatible = "qcom,memshare-peripheral"; - memory-region = <&modem_shared_mem>; - qcom,peripheral-size = <0x02000000>; - qcom,reserved-size = <0x04000000>; - qcom,client-id = <3>; - qcom,allocate-boot-time; - label = "modem"; - }; - }; - - argos { - compatible = "samsung,argos"; - #address-cells = <1>; - /* The device number should be assigned for each device, e.g. "boot_device@1" and "boot_device@2". - * Duplicated number is not allowed. Please refer the below example. - */ - /* Table Format should be - * - * ARM_min : Big Core's minimum frequency lock. 0 means not set, - * ARM_max : Big Core's maximum frequency lock. 0 means not set, - * Little_min : Little Core's minimum frequency lock. 0 means not set, - * Little_max : Little Core's maximum frequency lock. 0 means not set, - * BIMC1 : Memory frequency lock. 0 means not set,(not used now) - * BIMC2 : Memory frequency lock. 0 means not set, (not used now) - * Task : 1 - Set task affinity lock. - * 0 - Not set or unlock, - * Task affinity should be predefined driver's code. - * IRQ : 1 - Set irq affinity lock. - * 0 - Not set or unlock, - * Task affinity should be predefined driver's code. - * SCHED_boost : 1 - Increase sched boosting count (not used now) - * 0 - Decrease sched boosting count - */ - /* - *boot_device@1 { - * net_boost,label="WIFI"; - * net_boost,node="wlan0"; - * net_boost,table_size = <3>; - * net_boost,table= < - * 5 2016000 0 2016000 0 0 0 0 0 0 - * 10 2016000 0 2016000 0 0 0 0 0 0 - * 20 2016000 0 2016000 0 0 0 0 0 0 - * 30 2016000 0 2016000 0 0 0 0 0 0 - * >; - * }; - */ - boot_device@1 { - net_boost,label="WIFI"; - net_boost,node="wlan0"; - net_boost,table_size = <3>; - net_boost,table= < - 150 0 0 0 0 0 0 0 0 0 - 200 0 0 0 0 0 0 1 1 1 - 300 0 0 0 0 0 0 1 1 1 - >; - }; - boot_device@2 { - net_boost,label="WIFI TX"; - net_boost,node="wlan0"; - net_boost,table_size = <5>; - net_boost,table= < - 20 1420800 0 1420800 0 0 0 0 0 0 - 60 1728000 0 1728000 0 0 0 0 0 0 - 100 1958400 0 1958400 0 0 0 0 0 0 - 150 2208000 0 2208000 0 0 0 1 1 1 - 300 2649600 0 2649600 0 0 0 1 1 1 - >; - }; - boot_device@3 { - net_boost,label="WIFI RX"; - net_boost,node="wlan0"; - net_boost,table_size = <4>; - net_boost,table= < - 60 1190400 0 1190400 0 0 0 0 0 0 - 100 1267200 0 1267200 0 0 0 0 0 0 - 200 1728000 0 1728000 0 0 0 1 1 1 - 300 2035200 0 2035200 0 0 0 1 1 1 - >; - }; - boot_device@4 { - net_boost,label="SWLAN"; - net_boost,node="swlan0"; - net_boost,table_size = <4>; - net_boost,table= < - 2 1612800 0 1612800 0 0 0 0 0 0 - 5 1843200 0 1843200 0 0 0 0 0 0 - 20 2092800 0 2092800 0 0 0 1 1 1 - 50 2246400 0 2246400 0 0 0 1 1 1 - >; - }; - boot_device@5 { - net_boost,label="UFS"; - net_boost,node=""; - net_boost,sysnode="/sys/class/scsi_host/host0/transferred_cnt"; - net_boost,table_size = <3>; - net_boost,table= < - 112 0 0 566400 0 0 0 0 0 0 - 800 0 0 883200 0 0 0 0 0 0 - 3200 0 0 2092800 0 0 0 0 0 0 - >; - }; - boot_device@6 { - net_boost,label="P2P"; - net_boost,node="p2p-wlan0-0"; - net_boost,table_size = <3>; - net_boost,table= < - 30 1420800 0 1420800 0 0 0 0 0 0 - 90 1958400 0 1958400 0 0 0 0 0 0 - 300 2208000 0 2208000 0 0 0 1 1 1 - >; - }; - boot_device@7 { - net_boost,label="IPC"; - net_boost,node="rmnet_ipa0"; - net_boost,table_size = <5>; - net_boost,table= < - 10 0 0 0 0 0 0 0 0 0 - 60 1324800 0 1324800 0 0 0 0 0 0 - 100 1555200 0 1555200 0 0 0 0 0 0 - 200 1708800 0 1708800 0 0 0 1 1 1 - 300 1939200 0 1939200 0 0 0 1 1 1 - >; - }; - }; -}; - -&shared_meta { - status = "disabled"; -}; - -&thermal_zones { - lmh-dcvs-00 { - trips { - active-config { - temperature = <85000>; - }; - }; - }; - - lmh-dcvs-01 { - trips { - active-config { - temperature = <85000>; - }; - }; - }; -}; - -&pil_modem { - /* Outputs to mss */ - qcom,smem-states = <&modem_smp2p_out 0>, <&modem_smp2p_out 4>, <&modem_smp2p_out 5>; - qcom,smem-state-names = "qcom,force-stop", "qcom,stop-reason-0", "qcom,stop-reason-1"; -}; - -&tlmm { - qupv3_se8_2uart_pins: qupv3_se8_2uart_pins { - qupv3_se8_2uart_tx_active: qupv3_se8_2uart_tx_active { - mux { - pins = "gpio44"; - function = "qup12"; - }; - - config { - pins = "gpio44"; - drive-strength = <2>; - bias-pull-up; - }; - }; - - qupv3_se8_2uart_rx_active: qupv3_se8_2uart_rx_active { - mux { - pins = "gpio45"; - function = "qup12"; - }; - - config { - pins = "gpio45"; - drive-strength = <2>; - bias-pull-down; - }; - }; - - qupv3_se8_2uart_tx_sleep: qupv3_se8_2uart_tx_sleep { - mux { - pins = "gpio44"; - function = "gpio"; - }; - - config { - pins = "gpio44"; - drive-strength = <2>; - bias-pull-up; - input-enable; - input-high; - }; - }; - - qupv3_se8_2uart_rx_sleep: qupv3_se8_2uart_rx_sleep { - mux { - pins = "gpio45"; - function = "gpio"; - }; - - config { - pins = "gpio45"; - drive-strength = <2>; - bias-pull-down; - }; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-dcc.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-dcc.dtsi deleted file mode 100755 index d6b1fc486505..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-dcc.dtsi +++ /dev/null @@ -1,1614 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - - -/* config_talos_dcc_gladiator() */ -#define config_talos_dcc_gladiator \ - \ - /* Gladiator */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_noc_err_regs() */ -#define config_talos_dcc_noc_err_regs \ - \ - /* CNOC */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - \ - /* SNOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* AGGNOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* MNOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* GEM_NOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* SSC_NOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* DC_NOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* SNOC_CENTER_NIU_STATUS_SBM0_SENSEIN */ \ - , \ - \ - /* SNOC_CENTER_NIU_STATUS_SBM1_SENSEIN */ \ - , \ - \ - /* SNOC_CENTER_SBM_SENSEIN */ \ - , \ - \ - /* SNOC_MONAQ_NIU_STATUS_SBM_SENSEIN */ \ - , \ - \ - /* SNOC_WEST_NIU_STATUS_SBM_SENSEIN */ \ - , \ - \ - /* A1NOC_MONAQ_SBM_SENSEIN */ \ - , \ - \ - /* A1NOC_WEST_SBM_SENSEIN */ \ - , \ - \ - /* CNOC_CENTER_STATUS_SBM_SENSEIN */ \ - /* , */ \ - \ - /* CNOC_MMNOC_STATUS_SBM_SENSEIN */ \ - /* , */ \ - \ - /* CNOC_WEST_STATUS_SBM_SENSEIN */ \ - /* , */ \ - \ - /* DC_NOC_DISABLE_SBM_SENSEIN */ \ - , \ - \ - /* GEM_NOC_SBM_MDSP_SAFE_SHAPING_SENSEIN */ \ - - -/* config_talos_dcc_shrm() */ -#define config_talos_dcc_shrm \ - \ - /* SHRM CSR */ \ - , \ - , \ - - -/* config_talos_dcc_rscc_apps() */ -#define config_talos_dcc_rscc_apps \ - \ - /* RSC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* RSC-TCS */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_pdc_apps() */ -#define config_talos_dcc_pdc_apps \ - \ - /* RSC_PCU */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_rscc_lpass() */ -#define config_talos_dcc_rscc_lpass \ - \ - /* RSCp */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* RSCc */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* Q6_Status */ \ - , \ - \ - /* RSC-TCS */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_rscc_modem() */ -#define config_talos_dcc_rscc_modem \ - \ - /* RSCp */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* RSCc */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* Q6 status */ \ - , \ - , \ - \ - /* RSC-TCS */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_rscc_cdsp() */ -#define config_talos_dcc_rscc_cdsp \ - \ - /* RSCp */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* RSCc_CDSP */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* Q6 Status */ \ - , \ - \ - /* RSC_TCS */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_memnoc_mccc() */ -#define config_talos_dcc_memnoc_mccc \ - \ - /* MCCC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_gpu() */ -#define config_talos_dcc_gpu \ - \ - /* GCC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* GPUCC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* GFX smmu */ \ - , \ - , \ - \ - /* GPU GX */ \ - , \ - , \ - - -/* config_talos_dcc_osm() */ -#define config_talos_dcc_osm \ - \ - /* APSS_OSM */ \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_cabo_llcc_shrm() */ -#define config_talos_dcc_cabo_llcc_shrm \ - \ - /* LLCC/CABO */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_cx_mx() */ -#define config_talos_dcc_cx_mx \ - \ - /* CX_MX */ \ - , \ - , \ - \ - /* APC Voltage */ \ - , \ - , \ - \ - /* APC / MX CORNER */ \ - , \ - \ - /* CPRH */ \ - , \ - - -/* config_talos_dcc_gcc_regs() */ -#define config_talos_dcc_gcc_regs \ - \ - /* GCC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* AOSS_CC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_tsens_regs() */ -#define config_talos_dcc_tsens_regs \ - \ - /* GOLD */ \ - , \ - , \ - , \ - - -/* config_talos_dcc_core_hang() */ -#define config_talos_dcc_core_hang \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_bcm_seq_hang() */ -#define config_talos_dcc_bcm_seq_hang \ - - -/* config_talos_dcc_pll() */ -#define config_talos_dcc_pll \ - , \ - , \ - , \ - , \ - , \ - , \ - - -&dcc { - qcom,curr-link-list = <3>; - qcom,link-list = - config_talos_dcc_gladiator, - config_talos_dcc_noc_err_regs, - config_talos_dcc_shrm, - config_talos_dcc_rscc_apps, - config_talos_dcc_pdc_apps, - /* config_talos_dcc_rscc_lpass, */ - config_talos_dcc_rscc_modem, - /* config_talos_dcc_rscc_cdsp, */ - config_talos_dcc_memnoc_mccc, - config_talos_dcc_gpu, - config_talos_dcc_osm, - config_talos_dcc_cabo_llcc_shrm, - config_talos_dcc_cx_mx, - config_talos_dcc_gcc_regs, - config_talos_dcc_tsens_regs, - config_talos_dcc_core_hang, - config_talos_dcc_bcm_seq_hang, - config_talos_dcc_pll; - -}; diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-battery-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-battery-common.dtsi deleted file mode 100755 index 91ab33e4a0d4..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-battery-common.dtsi +++ /dev/null @@ -1,660 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&smb1390 { - status = "disabled"; -}; - -&smb1390_charger { - status = "disabled"; -}; - -&pm6150_vadc { - bat_thm { - reg = ; - label = "bat_thm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - }; -}; - -&soc { - battery { - status = "okay"; - compatible = "samsung,sec-battery"; - pinctrl-names = "default"; - - battery,vendor = "Battery"; - battery,charger_name = "sec-direct-charger"; - battery,fuelgauge_name = "s2mu106-fuelgauge"; - battery,technology = <2>; /* POWER_SUPPLY_TECHNOLOGY_LION */ - battery,fgsrc_switch_name = "s2mu106-fuelgauge"; /* Fuelgauge voltage source */ - - battery,batt_data_version = <1>; - - battery,chip_vendor = "QCOM"; - battery,temp_channel_raw= <1>; /* BATTERY_TEMP_CHANNEL_RAW */ - battery,temp_adc_type = <1>; /* SEC_BATTERY_ADC_TYPE_AP */ - - battery,temp_check_type = <1>; /* SEC_BATTERY_TEMP_CHECK_ADC */ - battery,chg_temp_check_type = <2>; /* SEC_BATTERY_TEMP_CHECK_TEMP*/ - - battery,thermal_source = <2>; /* SEC_BATTERY_THERMAL_SOURCE_ADC */ - battery,chg_thermal_source = <0>; /* SEC_CHARGER_THERMAL_SOURCE_FG */ - - battery,dchg_thermal_source = <3>; /* SEC_BATTERY_THERMAL_SOURCE_CHG_ADC */ - battery,polling_time = <10 30 30 30 3600>; - - - battery,temp_table_adc = < - 2127 2475 2966 3377 3975 4632 5454 6390 7499 8709 - 10058 11543 13049 14708 16403 18129 19883 21326 22780 24007 - 24825 25547 26180 - >; - battery,temp_table_data = < - 900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) - (-100) (-150) (-200) - >; - - battery,inbat_voltage = <1>; - - battery,inbat_voltage_table_adc = < - 2820 2795 2767 2737 2706 2686 2659 2630 2602 2574 - 2544 2514 2484 2456 2432 2405 2379 2351 2320 2292 - 2265 2236 2207 - >; - battery,inbat_voltage_table_data = < - 4400 4350 4300 4250 4200 4150 4100 4050 4000 3950 - 3900 3850 3800 3750 3700 3650 3600 3550 3500 3450 - 3400 3350 3300 - >; - battery,dchg_temp_table_adc = <110262 131376 159528 190026 225216 265098 307326 373014 436356 511428 - 593538 685032 783564 886788 992358 1100274 1205844 1299684 1391178 1470942 1538976 1595280 1642200>; - battery,dchg_temp_table_data = <900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - - battery,adc_check_count = <5>; - - battery,cable_check_type = <4>; /* SEC_BATTERY_CABLE_CHECK_PSY */ - battery,cable_source_type = <1>; /* SEC_BATTERY_CABLE_SOURCE_EXTERNAL */ - battery,polling_type = <1>; /* SEC_BATTERY_MONITOR_ALARM */ - battery,monitor_initial_count = <0>; - - battery,pre_afc_input_current = <500>; - battery,prepare_afc_delay = <0>; - - battery,battery_check_type = <0>; /* SEC_BATTERY_CHECK_NONE */ - battery,check_count = <0>; - - battery,ovp_uvlo_check_type = <3>; /* SEC_BATTERY_OVP_UVLO_CHGPOLLING */ - - battery,temp_check_count = <1>; - battery,temp_highlimit_threshold_event = <700>; - battery,temp_highlimit_recovery_event = <680>; - battery,temp_high_threshold_event = <500>; - battery,temp_high_recovery_event = <480>; - battery,temp_low_threshold_event = <0>; - battery,temp_low_recovery_event = <20>; - battery,temp_highlimit_threshold_normal = <700>; - battery,temp_highlimit_recovery_normal = <680>; - battery,temp_high_threshold_normal = <500>; - battery,temp_high_recovery_normal = <480>; - battery,temp_low_threshold_normal = <0>; - battery,temp_low_recovery_normal = <20>; - battery,temp_highlimit_threshold_lpm = <800>; - battery,temp_highlimit_recovery_lpm = <750>; - battery,temp_high_threshold_lpm = <500>; - battery,temp_high_recovery_lpm = <480>; - battery,temp_low_threshold_lpm = <0>; - battery,temp_low_recovery_lpm = <20>; - battery,wpc_high_threshold_normal = <450>; - battery,wpc_high_recovery_normal = <400>; - battery,wpc_low_threshold_normal = <0>; - battery,wpc_low_recovery_normal = <50>; - - battery,full_check_type = <2>; /* SEC_BATTERY_FULLCHARGED_FG_CURRENT */ - battery,full_check_type_2nd = <2>; /* SEC_BATTERY_FULLCHARGED_FG_CURRENT */ - battery,full_check_count = <1>; - battery,chg_gpio_full_check = <0>; - battery,chg_polarity_full_check = <1>; - - battery,chg_heating_prevention_method = <1>; /* SEC_BATTERY_BY_CHANGING_CURRENT */ - battery,chg_high_temp = <470>; - battery,chg_high_temp_recovery = <430>; - battery,chg_input_limit_current = <1000>; - battery,chg_charging_limit_current = <1800>; - battery,dchg_input_limit_current = <1000>; - battery,dchg_charging_limit_current = <2000>; - - battery,mix_high_temp = <420>; - battery,mix_high_chg_temp = <500>; - battery,mix_high_temp_recovery = <390>; - - /* SEC_BATTERY_FULL_CONDITION_SOC | - * SEC_BATTERY_FULL_CONDITION_NOTIMEFULL | - * SEC_BATTERY_FULL_CONDITION_VCELL - */ - battery,full_condition_type = <13>; - battery,full_condition_soc = <93>; - battery,full_condition_vcell = <4250>; - - battery,recharge_check_count = <1>; - battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */ - battery,recharge_condition_soc = <98>; - battery,recharge_condition_vcell = <4280>; - - battery,charging_total_time = <14400>; - battery,hv_charging_total_time = <10800>; - battery,normal_charging_total_time = <18000>; - battery,usb_charging_total_time = <36000>; - battery,recharging_total_time = <5400>; - battery,charging_reset_time = <0>; - - battery,chg_float_voltage = <4350>; - - battery,swelling_high_temp_block = <410>; - battery,swelling_high_temp_recov = <390>; - battery,swelling_wc_high_temp_recov = <390>; - battery,swelling_low_temp_block_1st = <150>; - battery,swelling_low_temp_recov_1st = <170>; - battery,swelling_low_temp_block_2nd = <50>; - battery,swelling_low_temp_recov_2nd = <70>; - battery,swelling_low_temp_3rd_ctrl; - battery,swelling_low_temp_block_3rd = <180>; - battery,swelling_low_temp_recov_3rd = <200>; - - battery,swelling_low_temp_current = <1050>; /* 0.3C */ - battery,swelling_low_temp_current_2nd = <400>; - battery,swelling_low_temp_current_3rd = <3100>; - battery,swelling_low_temp_topoff = <250>; /* 0.05C */ - battery,swelling_high_temp_current = <1550>; /* 0.45C */ - battery,swelling_high_temp_topoff = <250>; /* 0.05C */ - battery,swelling_wc_high_temp_current = <750>; /* 0.3C */ - battery,swelling_wc_low_temp_current = <750>; /* 0.3C */ - - battery,swelling_drop_float_voltage = <4150>; - battery,swelling_high_rechg_voltage = <4000>; - battery,swelling_low_rechg_voltage = <4200>; - - battery,siop_event_check_type = <1>; - battery,siop_call_cv_current = <330>; - battery,siop_call_cc_current = <330>; - - battery,siop_input_limit_current = <1200>; - battery,siop_charging_limit_current = <1000>; - battery,siop_hv_input_limit_current = <700>; - battery,siop_hv_charging_limit_current = <1000>; - battery,input_current_by_siop_20 = <400>; - - battery,rp_current_rp1 = <500>; - battery,rp_current_rp2 = <1500>; - battery,rp_current_rp3 = <3000>; - battery,rp_current_rdu_rp3 = <2100>; - battery,rp_current_abnormal_rp3 = <1800>; - - battery,pd_charging_charge_power = <15000>; - battery,max_charging_current = <3150>; - battery,battery_full_capacity = <4400>; - - /* cycle, chg_float_voltage, recharge_condition_vcell, full_condition_vcell, full_condition_soc, step charging condition */ - battery,age_data = <0 4350 4280 4250 93 45 /*4.35*/ - 300 4330 4260 4230 92 45 /*4.33*/ - 400 4310 4240 4210 91 45 /*4.31*/ - 700 4290 4220 4190 90 45 /*4.29*/ - 1000 4240 4170 4140 89 45 /*4.24*/ - >; - - /* step charging option */ - battery,step_charging_type = <0>; - battery,step_charging_charge_power = <12000>; - battery,step_charging_condition = <45 100>; - battery,step_charging_condition_curr = <3100 3100>; - battery,step_charging_current = <3100 3100>; - battery,step_charging_float_voltage = <4150 4350>; - - /* direct step charging option */ - battery,dc_step_chg_type = <0x6B>; /* origin(0x6B), soc option is temporary removed */ - battery,dc_step_chg_charge_power = <22000>; - battery,dc_step_chg_step = <3>; - battery,dc_step_chg_cond_vol = <4090 4190 4350>; /* STEP_CHARGING_CONDITION_VOLTAGE */ - battery,dc_step_chg_cond_iin = <1950 1575 0>; /* STEP_CHARGING_CONDITION_INPUT_CURRENT */ - battery,dc_step_chg_iin_check_cnt = <3>; - battery,dc_step_chg_cond_soc = <9 48 100>; /* STEP_CHARGING_CONDITION_SOC */ - battery,dc_step_chg_val_vfloat = <4090 4190 4350>; /* STEP_CHARGING_CONDITION_FLOAT_VOLTAGE */ - battery,dc_step_chg_val_iout = <4600 3900 3100>; - - battery,max_input_voltage = <9000>; /* mV */ - battery,max_input_current = <3000>; /* mA */ - - battery,standard_curr = <3100>; - battery,expired_time = <12600>; /* 150 + 60 minutes */ - battery,recharging_expired_time = <5400>; - - battery,cisd_alg_index = <7>; - - battery,cisd_max_voltage_thr = <5000>; /* battery ovp detection voltage */ - - io-channels = <&pm6150_vadc ADC_AMUX_THM4_PU2>; - io-channel-names = "adc-temp"; - - battery,recovery_cable; - battery,lowtemp_support_full_volt; - battery,enable_water_resistance; - battery,ta_alert_wa; - }; - - - s2mu106-charger { - status = "disable"; - compatible = "samsung,s2mu106-charger"; - }; - - sec-direct-charger { - status = "okay"; - compatible = "samsung,sec-direct-charger"; - - charger,battery_name = "battery"; - charger,main_charger = "s2mu106-charger"; - charger,direct_charger = "pca9468-charger"; - - charger,dchg_min_current = <2000>; - charger,dchg_temp_low_threshold = <180>; - charger,dchg_temp_high_threshold = <410>; - charger,ta_alert_wa; - }; - - 12c@13 { - pca9468@57 { - compatible = "nxp,pca9468"; - reg = <0x57>; - pca9468,input-current-limit = <2570000>; /* 2.57A */ - pca9468,charging-current = <6000000>; /* 6A */ - pca9468,input-itopoff = <500000>; /* 500mA */ - pca9468,sense-resistance = <0>; /* 5mOhm */ - pca9468,switching-frequency = <3>; /* 980KHz */ - pca9468,ntc-threshold = <0>; /* disable */ - pca9468,ta-mode = <1>; /* 2:1 charging mode */ - }; - - flash_led { - reg = <0x74>; - compatible = "qcom,s2mu106-fled"; - enable = <1 1>; - flash-gpio = <&tlmm 22 0>; - torch-gpio = <&tlmm 24 0>; - pinctrl-names = "fled_default", "fled_suspend"; - pinctrl-0 = <&cam_flash_active &cam_torch_active>; - pinctrl-1 = <&cam_flash_suspend &cam_torch_suspend>; - flash_current = <1400>; - preflash_current = <200>; - torch_current = <300>; - movie_current = <200>; - factory_current = <300>; - flashlight_current = <25 75 100 150 200>; - status = "okay"; - }; - }; - - 12c@14 { - s2mu106-fuelgauge@3B{ - compatible = "samsung,s2mu106-fuelgauge"; - reg = <0x3B>; - pinctrl-names = "default"; - pinctrl-0 = <&fuel_irq>; - fuelgauge,fuel_int = <&tlmm 104 0>; - fuelgauge,charger_name = "s2mu106-charger"; - fuelgauge,fuel_alert_soc = <1>; - fuelgauge,fuel_alert_vol = <3300>; - fuelgauge,low_temp_limit = <100>; - fuelgauge,capacity_max = <990>; - fuelgauge,capacity_max_margin = <200>; - fuelgauge,capacity_min = <0>; - fuelgauge,capacity_calculation_type = <28>; - fuelgauge,capacity_full = <3000>; - fuelgauge,type_str = "SDI"; - fuelgauge,fg_log_enable = <1>; - fuelgauge,low_voltage_limit = <3450>; - fuelgauge,low_voltage_limit_lowtemp = <3000>; - }; - }; - -battery_params { - battery,battery_data = - < - /***** battery data for 4.35 *****/ - /* battery,battery_table3 */ - 5 11 123 10 241 9 123 9 12 9 - 167 8 48 8 201 7 147 7 69 7 - 219 6 161 6 121 6 90 6 65 6 - 46 6 7 6 217 5 149 5 128 5 - 171 3 139 1 107 8 0 8 149 7 - 42 7 191 6 84 6 232 5 125 5 - 18 5 167 4 60 4 209 3 102 3 - 251 2 144 2 37 2 186 1 78 1 - 227 0 120 0 13 0 218 15 - - /* battery,battery_table4 */ - 10 10 10 10 29 29 28 28 28 27 - 27 28 28 30 31 32 33 35 38 45 - 57 112 - - /* battery,batcap */ - 0x1C 0x43 0xBE 0x0B /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x08 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10523 10000 9477 8954 8431 7907 7385 6862 6339 5816 - 5293 4770 4248 3725 3202 2679 2156 1633 1110 587 - 64 (-187) - - /* battery,ocv_arr_val */ - 43776 43103 42429 41853 41308 40814 40233 39731 39467 39086 - 38569 38288 38091 37939 37819 37723 37533 37312 36977 36873 - 34584 31928 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.33 *****/ - /* battery,battery_table3 */ - 5 11 123 10 242 9 123 9 12 9 - 167 8 48 8 201 7 147 7 69 7 - 219 6 161 6 121 6 90 6 65 6 - 46 6 7 6 217 5 149 5 128 5 - 171 3 139 1 126 8 18 8 166 7 - 58 7 206 6 98 6 246 5 138 5 - 30 5 178 4 69 4 217 3 109 3 - 1 3 149 2 41 2 189 1 81 1 - 229 0 121 0 13 0 218 15 - - /* battery,battery_table4 */ - 10 10 10 10 29 29 28 28 28 27 - 27 28 28 30 31 32 33 35 39 45 - 57 112 - - /* battery,batcap */ - 0xB0 0x45 0xF0 0x0D /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10614 10086 9559 9031 8504 7976 7449 6921 6394 5866 - 5339 4811 4284 3756 3229 2701 2174 1646 1119 591 - 64 (-187) - - /* battery,ocv_arr_val */ - 43776 43102 42429 41852 41309 40813 40233 39730 39467 39085 - 38569 38288 38091 37939 37818 37723 37533 37311 36976 36873 - 34583 31928 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.31 *****/ - /* battery,battery_table3 */ - 5 11 123 10 242 9 123 9 12 9 - 167 8 48 8 201 7 147 7 69 7 - 219 6 161 6 121 6 90 6 65 6 - 46 6 7 6 217 5 149 5 128 5 - 171 3 139 1 161 8 51 8 197 7 - 87 7 234 6 124 6 14 6 160 5 - 50 5 197 4 87 4 233 3 123 3 - 14 3 160 2 50 2 196 1 87 1 - 233 0 123 0 13 0 218 15 - - /* battery,battery_table4 */ - 10 10 10 10 29 29 28 28 28 27 - 27 28 28 30 31 32 33 35 39 45 - 57 112 - - /* battery,batcap */ - 0x9C 0x44 0xD8 0x0B /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10784 10248 9712 9176 8640 8104 7568 7032 6496 5960 - 5424 4888 4352 3816 3281 2745 2209 1673 1137 601 - 65 (-189) - - /* battery,ocv_arr_val */ - 43776 43102 42429 41852 41309 40813 40233 39730 39467 39085 - 38569 38288 38091 37939 37818 37723 37533 37311 36976 36873 - 34583 31928 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.29 *****/ - /* battery,battery_table3 */ - 5 11 123 10 242 9 123 9 12 9 - 167 8 48 8 201 7 147 7 69 7 - 219 6 161 6 121 6 90 6 65 6 - 46 6 7 6 217 5 149 5 128 5 - 171 3 139 1 200 8 88 8 232 7 - 121 7 9 7 153 6 41 6 186 5 - 74 5 218 4 107 4 251 3 139 3 - 28 3 172 2 60 2 204 1 93 1 - 237 0 125 0 14 0 217 15 - - /* battery,battery_table4 */ - 10 10 10 10 29 29 28 28 28 27 - 27 28 28 30 31 32 33 35 39 45 - 57 112 - - /* battery,batcap */ - 0x68 0x43 0x7B 0x0D /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10975 10429 9884 9338 8793 8248 7702 7157 6611 6066 - 5520 4975 4430 3884 3339 2793 2248 1702 1157 612 - 66 (-190) - - /* battery,ocv_arr_val */ - 43776 43102 42429 41852 41309 40813 40233 39730 39467 39085 - 38569 38288 38091 37939 37818 37723 37533 37311 36976 36873 - 34583 31928 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.24 *****/ - /* battery,battery_table3 */ - 5 11 123 10 242 9 123 9 12 9 - 167 8 48 8 201 7 147 7 69 7 - 219 6 161 6 121 6 90 6 65 6 - 46 6 7 6 217 5 149 5 128 5 - 171 3 139 1 45 9 184 8 68 8 - 207 7 90 7 229 6 113 6 252 5 - 135 5 18 5 158 4 41 4 180 3 - 63 3 203 2 86 2 225 1 108 1 - 248 0 131 0 14 0 217 15 - - /* battery,battery_table4 */ - 10 10 10 10 29 29 28 28 28 27 - 27 28 28 30 31 32 33 35 39 45 - 57 112 - - /* battery,batcap */ - 0x80 0x40 0xE6 0x0C /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 11471 10900 10330 9760 9190 8620 8050 7480 6910 6340 - 5770 5200 4630 4060 3490 2919 2349 1779 1209 639 - 69 (-195) - - /* battery,ocv_arr_val */ - 43776 43102 42429 41852 41309 40813 40233 39730 39467 39085 - 38569 38288 38091 37939 37818 37723 37533 37311 36976 36873 - 34583 31928 - - /* battery,tunning */ - 0x00 - >; - - battery,battery_table3 = < - 5 11 123 10 241 9 123 9 12 9 - 167 8 48 8 201 7 147 7 69 7 - 219 6 161 6 121 6 90 6 65 6 - 46 6 7 6 217 5 149 5 128 5 - 171 3 139 1 107 8 0 8 149 7 - 42 7 191 6 84 6 232 5 125 5 - 18 5 167 4 60 4 209 3 102 3 - 251 2 144 2 37 2 186 1 78 1 - 227 0 120 0 13 0 218 15 - >; - - battery,battery_table4 = < - 10 10 10 10 29 29 28 28 28 27 - 27 28 28 30 31 32 33 35 38 45 - 57 112 - >; - - battery,batcap = <0x1C 0x43 0xBE 0x0B>; /* [0x0E] [0x0F] [0x10] [0x11] */ - - battery,soc_arr_val = < - 10523 10000 9477 8954 8431 7907 7385 6862 6339 5816 - 5293 4770 4248 3725 3202 2679 2156 1633 1110 587 - 64 (-187) - >; - - battery,ocv_arr_val = < - 43776 43103 42429 41853 41308 40814 40233 39731 39467 39086 - 38569 38288 38091 37939 37819 37723 37533 37312 36977 36873 - 34584 31928 - >; - - }; - -/* sec_battery_cable - * 0 UNKNOWN, - * 1 NONE, - * 2 PREPARE_TA, - * 3 TA, - * 4 USB, - * 5 USB_CDP, - * 6 9V_TA, - * 7 9V_ERR, - * 8 9V_UNKNOWN, - * 9 12V_TA, - * 10 WIRELESS, - * 11 HV_WIRELESS, - * 12 PMA_WIRELESS, - * 13 WIRELESS_PACK, - * 14 WIRELESS_PACK_TA, - * 15 WIRELESS_STAND, - * 16 WIRELESS_HV_STAND, - * 17 QC20, - * 18 QC30, - * 19 PDIC, - * 20 UARTOFF, - * 21 OTG, - * 22 LAN_HUB, - * 23 POWER_SHARING, - * 24 HMT_CONNECTED, - * 25 HMT_CHARGE, - * 26 HV_TA_CHG_LIMIT, - * 27 WIRELESS_VEHICLE, - * 28 WIRELESS_HV_VEHICLE, - * 29 PREPARE_WIRELESS_HV, - * 30 TIMEOUT, - * 31 SMART_OTG, - * 32 SMART_NOTG, - * 33 WIRELESS_TX, - * 34 WIRELESS_HV_20, - * 35 WIRELESS_HV_20_LIMIT, - * 36 WIRELESS_FAKE, - * 37 WIRELESS_HV_20_PREPARE, - * 38 PDIC_APDO, - * 39 POGO, - */ - - cable-info { - default_input_current = <1800>; - default_charging_current = <2100>; - full_check_current_1st = <650>; - full_check_current_2nd = <250>; - - current_group_1 { - cable_number = <1 4 19 21 22 23 30>; - input_current = <500>; - charging_current = <500>; - }; - - current_group_2 { - cable_number = <2 25>; - input_current = <1000>; - charging_current = <1000>; - }; - - current_group_3 { - cable_number = <5>; - input_current = <1500>; - charging_current = <1500>; - }; - - current_group_4 { - cable_number = <6 7 8>; - input_current = <1650>; - charging_current = <3100>; - }; - - current_group_5 { - cable_number = <9>; - input_current = <1650>; - charging_current = <2200>; - }; - - current_group_6 { - cable_number = <10 12 14 15 27>; - input_current = <900>; - charging_current = <1200>; - }; - - current_group_7 { - cable_number = <13>; - input_current = <700>; - charging_current = <1200>; - }; - - current_group_8 { - cable_number = <24>; - input_current = <1000>; - charging_current = <450>; - }; - - current_group_9 { - cable_number = <26>; - input_current = <2000>; - charging_current = <1800>; - }; - - current_group_10 { - cable_number = <11 16 28>; - input_current = <650>; - charging_current = <1200>; - }; - - current_group_11 { - cable_number = <29>; - input_current = <500>; - charging_current = <1200>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-common.dtsi deleted file mode 100755 index d407b68418c7..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-common.dtsi +++ /dev/null @@ -1,182 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -#include -#include "../drivers/sm7150-sec-m41-audio.dtsi" -#include "sm7150-sec-m41-input-common.dtsi" -#include "sm7150-sec-m41-pinctrl-common.dtsi" -#include "../drivers/sm7150-sec-m41-mst-r00.dtsi" - -&aliases { - i2c17 = &i2c_17; - hsuart8 = "/soc/qcom,qup_hsuart@0xa88000"; -}; - -&reserved_memory { - camera_mem: camera_mem_region { - reg = <0x0 0xC2000000 0x0 0x14000000>; - ion,recyclable; - }; -}; - -&soc { - qcom,ion { - qcom,ion-heap@30 { /* CAMERA HEAP */ - reg = <30>; - memory-region = <&camera_mem>; - qcom,ion-heap-type = "RBIN"; - }; - }; -}; - -&soc { - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = <&tlmm 25 0 /* sda */ - &tlmm 26 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&grip_i2c_active>; - pinctrl-1 = <&grip_i2c_suspend>; - - a96t3x6@21 { - compatible = "a96t3x6"; - reg = <0x21>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_int_active>; - pinctrl-1 = <&grip_int_suspend>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - a96t3x6,irq_gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_LOW>; - a96t3x6,dvdd_vreg_name = "pm6150l_l11"; - a96t3x6,fw_path = "abov/a96t356_m41.bin"; - a96t3x6,firmup_cmd = <0x3b>; - }; - - a96t3x6_sub@20 { - compatible = "a96t3x6_sub"; - reg = <0x20>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_sub_int_active>; - pinctrl-1 = <&grip_sub_int_suspend>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - a96t3x6,irq_gpio = <&pm6150l_gpios 6 GPIO_ACTIVE_LOW>; - a96t3x6,dvdd_vreg_name = "pm6150_l16"; - a96t3x6,fw_path = "abov/a96t356_m41_sub.bin"; - a96t3x6,firmup_cmd = <0x3b>; - }; - }; - - /* Sensor */ - qcom,lpass@62400000 { - sensor_vdd-supply = <&pm6150l_l8>; - qcom,sensor_vdd-uV-uA = <1800000 0>; - qcom,active-reg-names = "sensor_vdd"; - }; - - ssc_core { - status = "okay"; - compatible = "ssc_core"; - ssc_core,mst_gpio = <&pm6150l_gpios 4 GPIO_ACTIVE_HIGH>; - }; - - sec_detect_conn { - compatible = "samsung,sec_detect_conn"; - - sec,det_pm_conn_gpios = <&pm6150_gpios 8 0>; /* SUB_CONNECT */ - sec,det_pm_conn_name = "SUB_CONNECT"; - - - pinctrl-names = "det_pm_connect"; - pinctrl-0 = <&detect_conn_pm_setting>; - }; - - sec_abc { - compatible = "samsung,sec_abc"; - status = "okay"; - - gpu { - gpu,label="GPU fault"; - gpu,threshold_count=<20>; - gpu,threshold_time=<1200>; - }; - aicl { - aicl,label="battery aicl"; - aicl,threshold_count=<5>; - aicl,threshold_time=<300>; - }; - }; - - abc_hub { - compatible = "samsung,abc_hub"; - status = "okay"; - - pinctrl-names = "det_pm_connect"; - pinctrl-0 = <&detect_conn_pm_setting>; - - bootc { - bootc,time_spec_user = <100000>; /* user binary user build */ - bootc,time_spec_eng = <100000>; /* user binary eng build */ - bootc,time_spec_fac = <100000>; /* factory binary */ - }; - - cond { - sec,det_pm_conn_gpios = <&pm6150_gpios 8 0>; /* SUB_CONNECT */ - sec,det_pm_conn_name = "sub"; - }; - }; - - qupv3_se8_2hsuart: qcom,qup_hsuart@0xa88000 { - compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; - reg = <0xa88000 0x4000>; - reg-names = "se_phys"; - clock-names = "se-clk", "m-ahb", "s-ahb"; - clocks = <&clock_gcc GCC_QUPV3_WRAP1_S2_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_M_AHB_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_S_AHB_CLK>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&qupv3_se8_2uart_tx_active>,<&qupv3_se8_2uart_rx_active>; - pinctrl-1 = <&qupv3_se8_2uart_tx_sleep>,<&qupv3_se8_2uart_rx_sleep>; - interrupts = ; - qcom,wrapper-core = <&qupv3_1>; - status = "ok"; - always-on-clock; - }; -}; - -&shared_meta { - status = "okay"; - parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_samsung,recovery,dtbo,abl,xbl,tz,hyp"; -}; - -/* not use eMMC */ -&sdhc_1 { - status = "disabled"; -}; -/* not use SDcard */ -&sdhc_2 { - cd-gpios = <&tlmm 88 0x0>; -}; - - diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-input-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-input-common.dtsi deleted file mode 100755 index 6fdd1fbacaf5..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-input-common.dtsi +++ /dev/null @@ -1,146 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&tlmm { - attn_irq: attn_irq { - mux { - pins = "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio9"; - input-enable; - bias-disable; /* No PULL */ - drive-strength = <2>; - }; - }; - attn_input: attn_input { - mux { - pins = "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio9"; - /*input-enable;*/ - bias-disable; - drive-strength = <2>; - }; - }; -}; - -&pm6150_gpios { - tsp_int_dvdd_en: tsp_int_dvdd_en { - pins = "gpio4"; - function = "normal"; - power-source = <0>; - }; -}; - - -&qupv3_se7_i2c { - status = "ok"; - - touchscreen@48 { - status = "ok"; - compatible = "sec,sec_ts"; - reg = <0x48>; - interrupt-parent = <&tlmm>; - interrupts = <9 0>; - pinctrl-names = "default", "on_state", "off_state"; - pinctrl-0 = <&attn_irq &tsp_int_dvdd_en>; - pinctrl-1 = <&attn_irq &tsp_int_dvdd_en>; - pinctrl-2 = <&attn_irq>; - sec,irq_gpio = <&tlmm 9 0x2008>; - sec,dvdd_gpio = <&pm6150_gpios 4 0>; /* tsp_dvdd_en PMIC GPIO 4, tsp_ldo_dvdd regulator */ - sec,irq_type = <0x2008>; - sec,max_coords = <4096 4096>; /* x y */ - sec,regulator_avdd = "tsp_ldo_avdd"; - sec,regulator_boot_on; - sec,firmware_name = "tsp_sec/y771_m41.bin"; - sec,project_name = "M41", "M41"; - sec,tclm_level = <1>; - sec,afe_base = <0x00>; - support_dex_mode; - sec,i2c-burstmax = <0xffff>; - sec,ss_touch_num = <1>; - enable_settings_aot; - sec,area-size = <132 266 341>; - support_ear_detect_mode; - sync-reportrate-120 = "Y"; - support_fod; - support_fod_gesture; - support_open_short_test; - support_mis_calibration_test; - sec,bringup = <3>; - }; -}; - -/delete-node/&key_vol_up_default; -&pm6150l_gpios { - key_vol_up { - key_vol_up_default: key_vol_up_default { - pins = "gpio2"; - function = "normal"; - input-enable; - bias-pull-up; - power-source = <0>; - }; - }; -}; - -&soc { - /delete-node/gpio_keys; - gpio_keys { - status = "ok"; - compatible = "gpio-keys"; - input-name = "gpio-keys"; - - pinctrl-names = "default"; - pinctrl-0 = <&key_vol_up_default>; - - vol_up { - label = "volume_up"; - gpios = <&pm6150l_gpios 2 0x1>; - linux,input-type = <1>; - linux,code = ; - debounce-interval = <15>; - }; - }; - - ss_touch { - compatible = "samsung,ss_touch"; - ss_touch,numbers = <1>; - }; - - tsp_ldo_en { - compatible = "regulator-fixed"; - regulator-name = "tsp_ldo_en"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - gpio = <&tlmm 56 0>; - enable-active-high; - regulator-boot-on; - }; - - tsp_ldo_avdd { - compatible = "regulator-fixed"; - regulator-name = "tsp_ldo_avdd"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - gpio = <&tlmm 56 0>; - enable-active-high; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-pinctrl-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-pinctrl-common.dtsi deleted file mode 100755 index 1e7b75d3ee40..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-pinctrl-common.dtsi +++ /dev/null @@ -1,517 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../drivers/sm7150-sec-m41-audio-pinctrl.dtsi" - -&tlmm { - s2mpb03_i2c_pins { - s2mpb03_i2c_active: s2mpb03_i2c_active { - mux { - pins = "gpio46", "gpio47"; - function = "gpio"; - }; - config { - pins = "gpio46", "gpio47"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - - grip_i2c { - grip_i2c_active: grip_i2c_active { - grip_i2c_active { - pins = "gpio25", "gpio26"; - bias-disable; - }; - }; - grip_i2c_suspend: grip_i2c_suspend { - grip_i2c_suspend { - pins = "gpio25", "gpio26"; - bias-disable; - }; - }; - }; - - fuel_irq: fuel_irq { - config { - pins = "gpio104"; - bias-disable; /* No PULL */ - }; - }; - - sdc2_cd_on: cd_on { - mux { - pins = "gpio88"; - function = "gpio"; - }; - - config { - pins = "gpio88"; - drive-strength = <2>; - bias-disable; - }; - }; - - sdc2_cd_off: cd_off { - mux { - pins = "gpio88"; - function = "gpio"; - }; - - config { - pins = "gpio88"; - drive-strength = <2>; - bias-disable; - }; - }; - - cam_sensor_mclk0_active: cam_sensor_mclk0_active { - /* Main Rear MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk0_suspend: cam_sensor_mclk0_suspend { - /* Main Rear MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk1_active: cam_sensor_mclk1_active { - /* FRONT MCLK */ - mux { - pins = "gpio14"; - function = "cam_mclk"; - }; - config { - pins = "gpio14"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk1_suspend: cam_sensor_mclk1_suspend { - /* FRONT MCLK */ - mux { - pins = "gpio14"; - function = "cam_mclk"; - }; - config { - pins = "gpio14"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk2_active: cam_sensor_mclk2_active { - /* Bokeh Cam MCLK */ - mux { - pins = "gpio16"; - function = "cam_mclk"; - }; - config { - pins = "gpio16"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk2_suspend: cam_sensor_mclk2_suspend { - /* Bokeh Cam MCLK */ - mux { - pins = "gpio16"; - function = "cam_mclk"; - }; - config { - pins = "gpio16"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk3_active: cam_sensor_mclk3_active { - /* UW Cam MCLK */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - config { - pins = "gpio15"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk3_suspend: cam_sensor_mclk3_suspend { - /* UW Cam MCLK */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - config { - pins = "gpio15"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - - }; - }; - - cam_sensor_rear_active: cam_sensor_rear_active { - /* Main Rear reset */ - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_rear_suspend: cam_sensor_rear_suspend { - /* Main Rear reset */ - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_front_active: cam_sensor_front_active { - /* FRONT RESET */ - mux { - pins = "gpio23"; - function = "gpio"; - }; - config { - pins = "gpio23"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_front_suspend: cam_sensor_front_suspend { - /* FRONT RESET */ - mux { - pins = "gpio23"; - function = "gpio"; - }; - config { - pins = "gpio23"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - - - cam_sensor_rear3sw_active: cam_sensor_rear3sw_active { - /* UW Cam RESET */ - mux { - pins = "gpio53"; - function = "gpio"; - }; - config { - pins = "gpio53"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_rear3sw_suspend: cam_sensor_rear3sw_suspend { - /* UW Cam RESET */ - mux { - pins = "gpio53"; - function = "gpio"; - }; - config { - pins = "gpio53"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_rear3_pwr_active: cam_rear3_pwr_active { - /* UW VANA */ - mux { - pins = "gpio4"; - function = "gpio"; - }; - config { - pins = "gpio4"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_rear3_pwr_suspend: cam_rear3_pwr_suspend { - /* UW VANA */ - mux { - pins = "gpio4"; - function = "gpio"; - }; - config { - pins = "gpio4"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_mipi_sel_active: cam_mipi_sel_active { - /* MIPI SEL */ - mux { - pins = "gpio51"; - function = "gpio"; - }; - config { - pins = "gpio51"; - bias-disable; - output-high; - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_mipi_sel_suspend: cam_mipi_sel_suspend { - /* MIPI SEL */ - mux { - pins = "gpio51"; - function = "gpio"; - }; - config { - pins = "gpio51"; - bias-pull-down; - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear_sub2_active: cam_sensor_rear_sub2_active { - /* Bokeh Cam RESET */ - mux { - pins = "gpio67"; - function = "gpio"; - }; - config { - pins = "gpio67"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear_sub2_suspend: cam_sensor_rear_sub2_suspend { - /* Bokeh Cam RESET */ - mux { - pins = "gpio67"; - function = "gpio"; - }; - config { - pins = "gpio67"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_flash_active: cam_flash_active { - /* TORCH, FLASH */ - mux { - pins = "gpio22"; - function = "gpio"; - }; - config { - pins = "gpio22"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_flash_suspend: cam_flash_suspend { - /* TORCH, FLASH */ - mux { - pins = "gpio22"; - function = "gpio"; - }; - config { - pins = "gpio22"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_torch_active: cam_torch_active { - /* TORCH, FLASH */ - mux { - pins = "gpio24"; - function = "gpio"; - }; - config { - pins = "gpio24"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_torch_suspend: cam_torch_suspend { - /* TORCH, FLASH */ - mux { - pins = "gpio24"; - function = "gpio"; - }; - config { - pins = "gpio24"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - led_enable: led_enable { - mux { - pins = "gpio22"; - function = "gpio"; - }; - - config { - pins = "gpio22"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - led_disable: led_disable { - mux { - pins = "gpio22"; - function = "gpio"; - }; - - config { - pins = "gpio22"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - -}; - -&pm6150_gpios { - detect_conn_pm_setting: detect_conn_pm_setting { - pins = "gpio8"; /* SUB_DET */ - function = "normal"; - power-source = <0>; - bias-disable; /* NO PULL */ - input-enable; - }; - -}; - -&pm6150l_gpios { - grip_int_active: grip_int_active { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_int_suspend: grip_int_suspend { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - grip_sub_int_active: grip_sub_int_active { - pins = "gpio6"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_sub_int_suspend: grip_sub_int_suspend { - pins = "gpio6"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - cam_sensor_rear4sw_active: cam_sensor_rear4sw_active{ - pins = "gpio11"; - function = "normal"; - power-source = <1>; - input-enable; - bias-disable; - }; - - cam_sensor_rear4sw_suspend: cam_sensor_rear4sw_suspend{ - pins = "gpio11"; - function = "normal"; - power-souce = <1>; - input-enable; - bias-disable; - }; - - - cam_sensor_rear4_pwr_active: cam_sensor_rear4_pwr_active{ - pins = "gpio12"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - cam_sensor_rear4_pwr_suspend: cam_sensor_rear4_pwr_suspend{ - pins = "gpio12"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - - cam_sensor_rear4_digital_active: cam_sensor_rear4_digital_active{ - pins = "gpio10"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - cam_sensor_rear4_digital_suspend: cam_sensor_rear4_digital_suspend{ - pins = "gpio10"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - -}; diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-pm-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-pm-common.dtsi deleted file mode 100755 index 4de05659cec0..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m41-pm-common.dtsi +++ /dev/null @@ -1,311 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include - -&soc { - /* AP Thermistor table */ - sec_thermistor@0 { - compatible = "samsung,sec-ap-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "ap_therm"; - adc_array = <1806 2208 2620 3076 3638 4355 5223 - 6133 7170 8378 9652 11107 12609 - 14233 15644 17608 19255 20912 22081 23487 24556 25655 26345>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* PA Thermistor table */ - sec_thermistor@1 { - compatible = "samsung,sec-pa-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "pa_therm"; - adc_array = <1861 2268 2690 3132 3730 4397 5278 - 6198 7233 8479 9782 11209 12707 - 14338 15719 17722 19343 20876 22320 23575 24750 25730 26411>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* WiFi Thermistor table */ - sec_thermistor@2 { - compatible = "samsung,sec-wf-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM3_PU2>; - io-channel-names = "wf_therm"; - adc_array = <1875 2270 2703 3149 3738 4416 5279 - 6205 7252 8470 9774 11227 12737 - 14358 15740 17754 19334 20932 22258 23619 24773 25779 26501>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@26 { - cell-index = <26>; - compatible = "i2c-gpio"; - gpios = <&tlmm 46 0 /* sda */ - &tlmm 47 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_active>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2900000>; - regulator-max-microvolt = <2900000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -&spmi_bus { - qcom,pm6150@0 { - qcom,power-on@800 { - interrupts = <0x0 0x8 0x0 IRQ_TYPE_NONE>, - <0x0 0x8 0x1 IRQ_TYPE_NONE>, - <0x0 0x8 0x4 IRQ_TYPE_NONE>, - <0x0 0x8 0x5 IRQ_TYPE_NONE>; - interrupt-names = "kpdpwr", "resin", - "resin-bark", "kpdpwr-resin-bark"; - qcom,s3-debounce = <128>; - - qcom,pon_1 { - qcom,support-reset = <0>; - }; - - qcom,pon_2 { - qcom,support-reset = <0>; - }; - - qcom,pon_3 { - qcom,pon-type = ; - qcom,support-reset = <1>; - qcom,pull-up = <1>; - qcom,s1-timer = <6720>; - qcom,s2-timer = <1000>; - qcom,s2-type = ; - qcom,use-bark; - }; - }; - }; - - qcom,pm8009@a { - status = "disabled"; - }; - qcom,pm8009@b { - status = "disabled"; - }; -}; - -/* Prevent voltage drop of LDO12*/ -&pm6150_l12 { - qcom,init-voltage = <1800000>; -}; - -/* Grip Sensor */ -&pm6150_l16 { - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; -}; - -&pm6150l_l11 { - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; -}; - -&pm6150_gpios { - interrupts = <0x0 0xc0 0 IRQ_TYPE_NONE>, - <0x0 0xc1 0 IRQ_TYPE_NONE>, - <0x0 0xc2 0 IRQ_TYPE_NONE>, - <0x0 0xc3 0 IRQ_TYPE_NONE>, - <0x0 0xc5 0 IRQ_TYPE_NONE>, - <0x0 0xc6 0 IRQ_TYPE_NONE>, - <0x0 0xc7 0 IRQ_TYPE_NONE>; - - interrupt-names = "pm6150_gpio1", "pm6150_gpio2", - "pm6150_gpio3", "pm6150_gpio4", - "pm6150_gpio6", - "pm6150_gpio7", - "pm6150_gpio8"; - qcom,gpios-disallowed = <5 9 10>; -}; - -&pm6150_adc_tm { - io-channels = <&pm6150_vadc ADC_XO_THERM_PU2>, - <&pm6150_vadc ADC_AMUX_THM2_PU2>, - <&pm6150_vadc ADC_AMUX_THM3_PU2>; - - quiet_therm { - status = "disabled"; - }; -}; - -&pm6150_vadc { - rf_pa0_therm { - reg = ; - label = "pa_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - rf_pa1_therm { - reg = ; - label = "wf_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - quiet_therm { - status = "disabled"; - }; -}; - -&pm6150l_gpios { - interrupts = <0x4 0xc0 0 IRQ_TYPE_NONE>, - <0x4 0xc1 0 IRQ_TYPE_NONE>, - <0x4 0xc2 0 IRQ_TYPE_NONE>, - <0x4 0xc3 0 IRQ_TYPE_NONE>, - <0x4 0xc4 0 IRQ_TYPE_NONE>, - <0x4 0xc5 0 IRQ_TYPE_NONE>, - <0x4 0xc7 0 IRQ_TYPE_NONE>, - <0x4 0xc8 0 IRQ_TYPE_NONE>, - <0x4 0xc9 0 IRQ_TYPE_NONE>, - <0x4 0xca 0 IRQ_TYPE_NONE>, - <0x4 0xcb 0 IRQ_TYPE_NONE>; - interrupt-names = "pm6150l_gpio1", "pm6150l_gpio2", - "pm6150l_gpio3", "pm6150l_gpio4", - "pm6150l_gpio5", "pm6150l_gpio6", - "pm6150l_gpio8", "pm6150l_gpio9", - "pm6150l_gpio10", "pm6150l_gpio11", - "pm6150l_gpio12"; - qcom,gpios-disallowed = <7>; - - dummy_pin { - dummy_pin_default: dummy_pin_default { - pins = "gpio12"; - bias-disable; - }; - }; -}; - -&pm6150l_adc_tm { - status = "disabled"; -/* /delete-property/ io-channels; - - conn_therm { - status = "disabled"; - }; - camera_ftherm { - status = "disabled"; - }; - nvm_therm { - status = "disabled"; - }; */ -}; - -&pm6150l_vadc { - pinctrl-0 = <&dummy_pin_default>; - - sdm_therm { - reg = ; - label = "ap_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - camera_ftherm { - status = "disabled"; - }; - nvm_therm { - status = "disabled"; - }; -}; - -&thermal_zones { - quiet-therm-adc { - status = "disabled"; - }; - conn-therm-adc { - status = "disabled"; - }; - camera-ftherm-adc { - status = "disabled"; - }; - nvm-therm-adc { - status = "disabled"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-battery-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-battery-common.dtsi deleted file mode 100755 index 87dedb6973b2..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-battery-common.dtsi +++ /dev/null @@ -1,701 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&smb1390 { - status = "disabled"; -}; - -&smb1390_charger { - status = "disabled"; -}; - -&pm6150_vadc { - bat_thm { - reg = ; - label = "bat_thm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - }; -}; - -&qupv3_se11_i2c{ - status = "ok"; - - s2mu106-fuelgauge@3B{ - compatible = "samsung,s2mu106-fuelgauge"; - reg = <0x3B>; - pinctrl-names = "default"; - pinctrl-0 = <&fuel_irq>; - fuelgauge,fuel_int = <&tlmm 104 0>; - fuelgauge,charger_name = "s2mu106-charger"; - fuelgauge,fuel_alert_soc = <1>; - fuelgauge,fuel_alert_vol = <3300>; - fuelgauge,low_temp_limit = <100>; - fuelgauge,capacity_max = <990>; - fuelgauge,capacity_max_margin = <200>; - fuelgauge,capacity_min = <0>; - fuelgauge,capacity_calculation_type = <28>; - fuelgauge,capacity_full = <7000>; - fuelgauge,type_str = "SDI"; - fuelgauge,fg_log_enable = <1>; - fuelgauge,low_voltage_limit = <3450>; - fuelgauge,low_voltage_limit_lowtemp = <3000>; - fuelgauge,i_socr_coeff = <80>; - fuelgauge,low_t_compen_coeff = <180>; - }; - }; - -&soc { - battery { - status = "okay"; - compatible = "samsung,sec-battery"; - pinctrl-names = "default"; - - battery,vendor = "Battery"; - battery,charger_name = "sec-direct-charger"; - battery,fuelgauge_name = "s2mu106-fuelgauge"; - battery,technology = <2>; /* POWER_SUPPLY_TECHNOLOGY_LION */ - battery,fgsrc_switch_name = "s2mu106-fuelgauge"; /* Fuelgauge voltage source */ - - battery,batt_data_version = <2>; - - battery,chip_vendor = "QCOM"; - battery,temp_channel_raw= <1>; /* BATTERY_TEMP_CHANNEL_RAW */ - battery,temp_adc_type = <1>; /* SEC_BATTERY_ADC_TYPE_AP */ - - battery,temp_check_type = <1>; /* SEC_BATTERY_TEMP_CHECK_ADC */ - battery,chg_temp_check_type = <2>; /* SEC_BATTERY_TEMP_CHECK_TEMP*/ - - battery,thermal_source = <2>; /* SEC_BATTERY_THERMAL_SOURCE_ADC */ - battery,chg_thermal_source = <0>; /* SEC_CHARGER_THERMAL_SOURCE_FG */ - - battery,dchg_thermal_source = <3>; /* SEC_BATTERY_THERMAL_SOURCE_CHG_ADC */ - battery,polling_time = <10 30 30 30 3600>; - - - battery,temp_table_adc = < - 1998 2411 2824 3310 3882 4543 5384 6302 7337 8485 - 9728 11153 12702 14344 16061 17803 19417 20947 22363 23642 - 24732 25654 26427 - >; - battery,temp_table_data = < - 900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) - (-100) (-150) (-200) - >; - - battery,inbat_voltage = <1>; - - battery,inbat_voltage_table_adc = < - 2820 2795 2767 2737 2706 2686 2659 2630 2602 2574 - 2544 2514 2484 2456 2432 2405 2379 2351 2320 2292 - 2265 2236 2207 - >; - battery,inbat_voltage_table_data = < - 4400 4350 4300 4250 4200 4150 4100 4050 4000 3950 - 3900 3850 3800 3750 3700 3650 3600 3550 3500 3450 - 3400 3350 3300 - >; - battery,dchg_temp_table_adc = <99705 125511 151317 182988 211140 258060 308499 365976 428145 498525 - 575943 663918 757758 859809 968898 1080333 1182384 1279743 1368891 1452174 1523727 1583550 1635162>; - battery,dchg_temp_table_data = <900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - - battery,adc_check_count = <5>; - - battery,cable_check_type = <4>; /* SEC_BATTERY_CABLE_CHECK_PSY */ - battery,cable_source_type = <1>; /* SEC_BATTERY_CABLE_SOURCE_EXTERNAL */ - battery,polling_type = <1>; /* SEC_BATTERY_MONITOR_ALARM */ - battery,monitor_initial_count = <0>; - - battery,pre_afc_input_current = <500>; - battery,prepare_afc_delay = <0>; - - battery,battery_check_type = <0>; /* SEC_BATTERY_CHECK_NONE */ - battery,check_count = <0>; - - battery,ovp_uvlo_check_type = <3>; /* SEC_BATTERY_OVP_UVLO_CHGPOLLING */ - - battery,temp_check_count = <1>; - battery,temp_highlimit_threshold_event = <700>; - battery,temp_highlimit_recovery_event = <680>; - battery,temp_high_threshold_event = <500>; - battery,temp_high_recovery_event = <480>; - battery,temp_low_threshold_event = <0>; - battery,temp_low_recovery_event = <20>; - battery,temp_highlimit_threshold_normal = <700>; - battery,temp_highlimit_recovery_normal = <680>; - battery,temp_high_threshold_normal = <500>; - battery,temp_high_recovery_normal = <480>; - battery,temp_low_threshold_normal = <0>; - battery,temp_low_recovery_normal = <20>; - battery,temp_highlimit_threshold_lpm = <800>; - battery,temp_highlimit_recovery_lpm = <750>; - battery,temp_high_threshold_lpm = <500>; - battery,temp_high_recovery_lpm = <480>; - battery,temp_low_threshold_lpm = <0>; - battery,temp_low_recovery_lpm = <20>; - battery,wpc_high_threshold_normal = <450>; - battery,wpc_high_recovery_normal = <400>; - battery,wpc_low_threshold_normal = <0>; - battery,wpc_low_recovery_normal = <50>; - - battery,full_check_type = <2>; /* SEC_BATTERY_FULLCHARGED_FG_CURRENT */ - battery,full_check_type_2nd = <2>; /* SEC_BATTERY_FULLCHARGED_FG_CURRENT */ - battery,full_check_count = <1>; - battery,chg_gpio_full_check = <0>; - battery,chg_polarity_full_check = <1>; - - battery,chg_heating_prevention_method = <1>; /* SEC_BATTERY_BY_CHANGING_CURRENT */ - battery,chg_high_temp = <490>; - battery,chg_high_temp_recovery = <450>; - battery,chg_input_limit_current = <1000>; - battery,chg_charging_limit_current = <1800>; - battery,dchg_input_limit_current = <1000>; - battery,dchg_charging_limit_current = <2000>; - - battery,mix_high_temp = <420>; - battery,mix_high_chg_temp = <500>; - battery,mix_high_temp_recovery = <390>; - - /* SEC_BATTERY_FULL_CONDITION_SOC | - * SEC_BATTERY_FULL_CONDITION_NOTIMEFULL | - * SEC_BATTERY_FULL_CONDITION_VCELL - */ - battery,full_condition_type = <13>; - battery,full_condition_soc = <93>; - battery,full_condition_vcell = <4250>; - - battery,recharge_check_count = <1>; - battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */ - battery,recharge_condition_soc = <98>; - battery,recharge_condition_vcell = <4310>; - - battery,charging_total_time = <14400>; - battery,hv_charging_total_time = <10800>; - battery,normal_charging_total_time = <18000>; - battery,usb_charging_total_time = <36000>; - battery,recharging_total_time = <5400>; - battery,charging_reset_time = <0>; - - battery,chg_float_voltage = <4380>; - - battery,swelling_high_temp_block = <410>; - battery,swelling_high_temp_recov = <390>; - battery,swelling_wc_high_temp_recov = <390>; - battery,swelling_low_temp_block_1st = <150>; - battery,swelling_low_temp_recov_1st = <170>; - battery,swelling_low_temp_block_2nd = <50>; - battery,swelling_low_temp_recov_2nd = <70>; - - battery,swelling_low_temp_current = <1750>; - battery,swelling_low_temp_current_2nd = <680>; - battery,swelling_low_temp_topoff = <340>; - battery,swelling_high_temp_current = <2600>; - battery,swelling_high_temp_topoff = <340>; - battery,swelling_wc_high_temp_current = <750>; /* 0.3C */ - battery,swelling_wc_low_temp_current = <750>; /* 0.3C */ - - battery,swelling_drop_float_voltage = <4150>; - battery,swelling_high_rechg_voltage = <4000>; - battery,swelling_low_rechg_voltage = <4230>; - - battery,dchg_high_temp = <470>; - battery,dchg_high_temp_recovery = <430>; - - battery,siop_event_check_type = <1>; - battery,siop_call_cv_current = <330>; - battery,siop_call_cc_current = <330>; - - battery,siop_input_limit_current = <1200>; - battery,siop_charging_limit_current = <1000>; - battery,siop_hv_input_limit_current = <700>; - battery,siop_hv_charging_limit_current = <1000>; - battery,input_current_by_siop_20 = <400>; - - battery,rp_current_rp1 = <500>; - battery,rp_current_rp2 = <1500>; - battery,rp_current_rp3 = <3000>; - battery,rp_current_rdu_rp3 = <2100>; - battery,rp_current_abnormal_rp3 = <1800>; - - battery,pd_charging_charge_power = <15000>; - battery,max_charging_current = <3150>; - battery,battery_full_capacity = <7000>; - - battery,ttf_hv_charge_current = <2550>; - battery,ttf_dc25_charge_current = <3300>; - - battery,ttf_capacity = <5650>; - battery,cv_data = < - 3435 832 1800 - 3365 837 1770 - 3298 841 1740 - 3177 850 1680 - 3042 858 1620 - 2958 864 1560 - 2834 871 1500 - 2751 879 1440 - 2644 886 1380 - 2550 891 1320 - 2467 898 1260 - 2389 905 1200 - 2294 910 1140 - 2219 916 1080 - 2124 921 1020 - 2049 926 960 - 1961 931 900 - 1927 938 840 - 1838 942 780 - 1756 945 720 - 1725 949 660 - 1648 952 600 - 1577 959 540 - 1541 966 480 - 1498 972 420 - 1396 976 360 - 1376 981 300 - 1347 986 240 - 1269 990 180 - 1242 993 120 - 1211 996 60 - 1170 1000 0 - >; - - /* cycle, chg_float_voltage, recharge_condition_vcell, full_condition_vcell, full_condition_soc, step charging condition */ - battery,age_data = <0 4380 4310 4280 93 - 300 4360 4290 4260 92 - 400 4340 4270 4240 91 - 700 4320 4250 4220 90 - 1000 4270 4200 4170 89>; - - /* step charging option */ - battery,step_charging_type = <0>; - - /* direct step charging option */ - battery,dc_step_chg_type = <0xE9>; - battery,dc_step_chg_charge_power = <22000>; - battery,dc_step_chg_step = <3>; - battery,dc_step_chg_cond_vol = <4090 4190 4350>; /* STEP_CHARGING_CONDITION_VOLTAGE */ - battery,dc_step_chg_cond_iin = <1950 1575 0>; /* STEP_CHARGING_CONDITION_INPUT_CURRENT */ - battery,dc_step_chg_iin_check_cnt = <3>; - battery,dc_step_chg_cond_soc = <9 48 100>; /* STEP_CHARGING_CONDITION_SOC */ - battery,dc_step_chg_val_vfloat = <4075 4250 4380>; /* STEP_CHARGING_CONDITION_FLOAT_VOLTAGE */ - battery,dc_step_chg_val_iout = <5300 3900 3450>; - - battery,max_input_voltage = <9000>; /* mV */ - battery,max_input_current = <3000>; /* mA */ - - battery,standard_curr = <3450>; - battery,expired_time = <12600>; /* (148 + 60) ~ 210 minutes */ - battery,recharging_expired_time = <5400>; - - battery,cisd_alg_index = <7>; - - battery,cisd_max_voltage_thr = <5000>; /* battery ovp detection voltage */ - - io-channels = <&pm6150_vadc ADC_AMUX_THM4_PU2>; - io-channel-names = "adc-temp"; - - battery,recovery_cable; - battery,lowtemp_support_full_volt; - battery,enable_water_resistance; - battery,ta_alert_wa; - }; - - - s2mu106-charger { - status = "disable"; - compatible = "samsung,s2mu106-charger"; - }; - - sec-direct-charger { - status = "okay"; - compatible = "samsung,sec-direct-charger"; - - charger,battery_name = "battery"; - charger,main_charger = "s2mu106-charger"; - charger,direct_charger = "pca9468-charger"; - - charger,dchg_min_current = <2000>; - charger,dchg_temp_low_threshold = <170>; - charger,dchg_temp_high_threshold = <410>; - charger,ta_alert_wa; - }; - - 12c@13 { - pca9468@57 { - compatible = "nxp,pca9468"; - reg = <0x57>; - pca9468,input-current-limit = <2570000>; /* 2.57A */ - pca9468,charging-current = <6000000>; /* 6A */ - pca9468,input-itopoff = <500000>; /* 500mA */ - pca9468,sense-resistance = <0>; /* 5mOhm */ - pca9468,switching-frequency = <3>; /* 980KHz */ - pca9468,ntc-threshold = <0>; /* disable */ - pca9468,ta-mode = <1>; /* 2:1 charging mode */ - }; - - flash_led { - reg = <0x74>; - compatible = "qcom,s2mu106-fled"; - enable = <1 1>; - flash-gpio = <&tlmm 22 0>; - torch-gpio = <&tlmm 24 0>; - pinctrl-names = "fled_default", "fled_suspend"; - pinctrl-0 = <&cam_flash_active &cam_torch_active>; - pinctrl-1 = <&cam_flash_suspend &cam_torch_suspend>; - flash_current = <1400>; - preflash_current = <200>; - torch_current = <300>; - movie_current = <200>; - factory_current = <300>; - flashlight_current = <25 75 100 150 200>; - status = "okay"; - }; - }; - -battery_params { - battery,battery_data = - < - /***** battery data for 4.38 *****/ - /* battery,battery_table3 */ - 34 11 162 10 33 10 167 9 50 9 - 195 8 93 8 0 8 175 7 96 7 - 242 6 182 6 139 6 106 6 81 6 - 58 6 21 6 237 5 174 5 135 5 - 246 4 191 2 105 8 0 8 151 7 - 46 7 197 6 92 6 243 5 138 5 - 33 5 184 4 79 4 230 3 125 3 - 20 3 171 2 66 2 217 1 112 1 - 7 1 158 0 53 0 243 15 - - - /* battery,battery_table4 */ - 10 10 10 10 42 42 42 42 42 42 - 42 42 43 43 43 43 43 44 44 45 - 48 154 - - - /* battery,batcap */ - 0x98 0x67 0x6C 0x13 /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x08 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10513 10000 9487 8974 8462 7949 7436 6923 6410 5897 - 5385 4872 4359 3846 3333 2821 2308 1795 1282 769 - 256 (-63) - - /* battery,ocv_arr_val */ - 43916 43289 42662 42067 41495 40954 40453 40001 39604 39221 - 38681 38389 38179 38019 37894 37784 37604 37409 37099 36907 - 36201 33433 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.36 *****/ - /* battery,battery_table3 */ - 34 11 162 10 33 10 167 9 50 9 - 195 8 93 8 0 8 175 7 96 7 - 242 6 182 6 139 6 106 6 81 6 - 58 6 21 6 237 5 174 5 135 5 - 246 4 191 2 131 8 25 8 175 7 - 68 7 218 6 112 6 5 6 155 5 - 48 5 198 4 92 4 241 3 135 3 - 29 3 178 2 72 2 221 1 115 1 - 9 1 158 0 52 0 242 15 - - /* battery,battery_table4 */ - 10 10 10 10 42 42 42 42 42 42 - 42 42 43 43 43 43 43 44 44 45 - 48 154 - - - /* battery,batcap */ - 0x48 0x66 0x2D 0x13 /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x08 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10642 10122 9603 9083 8564 8045 7525 7006 6487 5967 - 5448 4928 4409 3890 3370 2851 2331 1812 1293 773 - 254 (-69) - - /* battery,ocv_arr_val */ - 43916 43289 42662 42067 41495 40954 40453 40001 39604 39221 - 38681 38389 38179 38019 37894 37784 37604 37409 37099 36907 - 36201 33433 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.34 *****/ - /* battery,battery_table3 */ - 34 11 162 10 33 10 167 9 50 9 - 195 8 93 8 0 8 175 7 96 7 - 242 6 182 6 139 6 106 6 81 6 - 58 6 21 6 237 5 174 5 135 5 - 246 4 191 2 169 8 60 8 208 7 - 100 7 248 6 140 6 32 6 179 5 - 71 5 219 4 111 4 3 4 150 3 - 42 3 190 2 82 2 230 1 121 1 - 13 1 161 0 53 0 242 15 - - /* battery,battery_table4 */ - 10 10 10 10 42 42 42 42 42 42 - 42 42 43 43 43 43 43 44 44 45 - 48 154 - - /* battery,batcap */ - 0x90 0x64 0xDB 0x12 /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10824 10295 9767 9239 8711 8182 7654 7126 6597 6069 - 5541 5013 4484 3956 3428 2900 2371 1843 1315 787 - 258 (-70) - - - /* battery,ocv_arr_val */ - 43916 43289 42662 42067 41495 40954 40453 40001 39604 39221 - 38681 38389 38179 38019 37894 37784 37604 37409 37099 36907 - 36201 33433 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.32 *****/ - /* battery,battery_table3 */ - 34 11 162 10 33 10 167 9 50 9 - 195 8 93 8 0 8 175 7 96 7 - 242 6 182 6 139 6 106 6 81 6 - 58 6 21 6 237 5 174 5 135 5 - 246 4 191 2 211 8 101 8 246 7 - 136 7 26 7 172 6 61 6 207 5 - 97 5 243 4 132 4 22 4 168 3 - 58 3 203 2 93 2 239 1 129 1 - 18 1 164 0 54 0 241 15 - - /* battery,battery_table4 */ - 10 10 10 10 42 42 42 42 42 42 - 42 42 43 43 43 43 43 44 44 45 - 48 154 - - /* battery,batcap */ - 0xB0 0x62 0x81 0x12 /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 11029 10491 9953 9414 8876 8338 7800 7261 6723 6185 - 5646 5108 4570 4031 3493 2955 2416 1878 1340 801 - 263 (-72) - - - /* battery,ocv_arr_val */ - 43916 43289 42662 42067 41495 40954 40453 40001 39604 39221 - 38681 38389 38179 38019 37894 37784 37604 37409 37099 36907 - 36201 33433 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.27 *****/ - /* battery,battery_table3 */ - 34 11 162 10 33 10 167 9 50 9 - 195 8 93 8 0 8 175 7 96 7 - 242 6 182 6 139 6 106 6 81 6 - 58 6 21 6 237 5 174 5 135 5 - 246 4 191 2 56 9 197 8 81 8 - 222 7 107 7 248 6 133 6 18 6 - 158 5 43 5 184 4 69 4 210 3 - 95 3 235 2 120 2 5 2 146 1 - 31 1 171 0 56 0 241 15 - - /* battery,battery_table4 */ - 10 10 10 10 42 42 42 42 42 42 - 42 42 43 43 43 43 43 44 44 45 - 48 154 - - /* battery,batcap */ - 0x74 0x5E 0xB5 0x11 /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 11522 10960 10397 9835 9273 8710 8148 7586 7023 6461 - 5899 5336 4774 4211 3649 3087 2524 1962 1400 837 - 275 (-75) - - /* battery,ocv_arr_val */ - 43916 43289 42662 42067 41495 40954 40453 40001 39604 39221 - 38681 38389 38179 38019 37894 37784 37604 37409 37099 36907 - 36201 33433 - - /* battery,tunning */ - 0x00 - >; - - battery,battery_table3 = < - 34 11 162 10 33 10 167 9 50 9 - 195 8 93 8 0 8 175 7 96 7 - 242 6 182 6 139 6 106 6 81 6 - 58 6 21 6 237 5 174 5 135 5 - 246 4 191 2 105 8 0 8 151 7 - 46 7 197 6 92 6 243 5 138 5 - 33 5 184 4 79 4 230 3 125 3 - 20 3 171 2 66 2 217 1 112 1 - 7 1 158 0 53 0 243 15 - >; - - battery,battery_table4 = < - 10 10 10 10 42 42 42 42 42 42 - 42 42 43 43 43 43 43 44 44 45 - 48 154 - >; - - battery,batcap = <0x98 0x67 0x6C 0x13>; /* [0x0E] [0x0F] [0x10] [0x11] */ - - battery,soc_arr_val = < - 10513 10000 9487 8974 8462 7949 7436 6923 6410 5897 - 5385 4872 4359 3846 3333 2821 2308 1795 1282 769 - 256 (-63) - >; - - battery,ocv_arr_val = < - 43916 43289 42662 42067 41495 40954 40453 40001 39604 39221 - 38681 38389 38179 38019 37894 37784 37604 37409 37099 36907 - 36201 33433 - >; - - }; - -/* sec_battery_cable - * 0 UNKNOWN, - * 1 NONE, - * 2 PREPARE_TA, - * 3 TA, - * 4 USB, - * 5 USB_CDP, - * 6 9V_TA, - * 7 9V_ERR, - * 8 9V_UNKNOWN, - * 9 12V_TA, - * 10 WIRELESS, - * 11 HV_WIRELESS, - * 12 PMA_WIRELESS, - * 13 WIRELESS_PACK, - * 14 WIRELESS_PACK_TA, - * 15 WIRELESS_STAND, - * 16 WIRELESS_HV_STAND, - * 17 QC20, - * 18 QC30, - * 19 PDIC, - * 20 UARTOFF, - * 21 OTG, - * 22 LAN_HUB, - * 23 POWER_SHARING, - * 24 HMT_CONNECTED, - * 25 HMT_CHARGE, - * 26 HV_TA_CHG_LIMIT, - * 27 WIRELESS_VEHICLE, - * 28 WIRELESS_HV_VEHICLE, - * 29 PREPARE_WIRELESS_HV, - * 30 TIMEOUT, - * 31 SMART_OTG, - * 32 SMART_NOTG, - * 33 WIRELESS_TX, - * 34 WIRELESS_HV_20, - * 35 WIRELESS_HV_20_LIMIT, - * 36 WIRELESS_FAKE, - * 37 WIRELESS_HV_20_PREPARE, - * 38 PDIC_APDO, - * 39 POGO, - */ - - cable-info { - default_input_current = <1800>; - default_charging_current = <2100>; - full_check_current_1st = <1000>; - full_check_current_2nd = <340>; - - current_group_1 { - cable_number = <1 4 19 21 22 23 30>; - input_current = <500>; - charging_current = <500>; - }; - - current_group_2 { - cable_number = <2 25>; - input_current = <1000>; - charging_current = <1000>; - }; - - current_group_3 { - cable_number = <5>; - input_current = <1500>; - charging_current = <1500>; - }; - - current_group_4 { - cable_number = <6 7 8>; - input_current = <1650>; - charging_current = <3150>; - }; - - current_group_5 { - cable_number = <9>; - input_current = <1650>; - charging_current = <2200>; - }; - - current_group_6 { - cable_number = <10 12 14 15 27>; - input_current = <900>; - charging_current = <1200>; - }; - - current_group_7 { - cable_number = <13>; - input_current = <700>; - charging_current = <1200>; - }; - - current_group_8 { - cable_number = <24>; - input_current = <1000>; - charging_current = <450>; - }; - - current_group_9 { - cable_number = <26>; - input_current = <2000>; - charging_current = <1800>; - }; - - current_group_10 { - cable_number = <11 16 28>; - input_current = <650>; - charging_current = <1200>; - }; - - current_group_11 { - cable_number = <29>; - input_current = <500>; - charging_current = <1200>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-common.dtsi deleted file mode 100755 index a75f1027fd77..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-common.dtsi +++ /dev/null @@ -1,182 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -#include -#include "../drivers/sm7150-sec-m51-audio.dtsi" -#include "sm7150-sec-m51-input-common.dtsi" -#include "sm7150-sec-m51-pinctrl-common.dtsi" -#include "../drivers/sm7150-sec-m51-mst-r00.dtsi" - -&aliases { - i2c17 = &i2c_17; - hsuart8 = "/soc/qcom,qup_hsuart@0xa88000"; -}; - -&reserved_memory { - camera_mem: camera_mem_region { - reg = <0x0 0xC2000000 0x0 0x14000000>; - ion,recyclable; - }; -}; - -&soc { - qcom,ion { - qcom,ion-heap@30 { /* CAMERA HEAP */ - reg = <30>; - memory-region = <&camera_mem>; - qcom,ion-heap-type = "RBIN"; - }; - }; -}; - -&soc { - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = <&tlmm 25 0 /* sda */ - &tlmm 26 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&grip_i2c_active>; - pinctrl-1 = <&grip_i2c_suspend>; - - a96t3x6@20 { - compatible = "a96t3x6"; - reg = <0x20>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_int_active>; - pinctrl-1 = <&grip_int_suspend>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - a96t3x6,irq_gpio = <&pm6150l_gpios 6 GPIO_ACTIVE_LOW>; - a96t3x6,dvdd_vreg_name = "pm6150_l16"; - a96t3x6,fw_path = "abov/a96t356_m51.bin"; - a96t3x6,firmup_cmd = <0x3b>; - }; - - a96t3x6_sub@21 { - compatible = "a96t3x6_sub"; - reg = <0x21>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_sub_int_active>; - pinctrl-1 = <&grip_sub_int_suspend>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - a96t3x6,irq_gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_LOW>; - a96t3x6,dvdd_vreg_name = "pm6150l_l11"; - a96t3x6,fw_path = "abov/a96t356_m51_sub.bin"; - a96t3x6,firmup_cmd = <0x3b>; - }; - }; - - /* Sensor */ - qcom,lpass@62400000 { - sensor_vdd-supply = <&pm6150l_l8>; - qcom,sensor_vdd-uV-uA = <1800000 0>; - qcom,active-reg-names = "sensor_vdd"; - }; - - ssc_core { - status = "okay"; - compatible = "ssc_core"; - ssc_core,mst_gpio = <&pm6150l_gpios 4 GPIO_ACTIVE_HIGH>; - }; - - sec_detect_conn { - compatible = "samsung,sec_detect_conn"; - - sec,det_pm_conn_gpios = <&pm6150_gpios 8 0>; /* SUB_CONNECT */ - sec,det_pm_conn_name = "SUB_CONNECT"; - - - pinctrl-names = "det_pm_connect"; - pinctrl-0 = <&detect_conn_pm_setting>; - }; - - sec_abc { - compatible = "samsung,sec_abc"; - status = "okay"; - - gpu { - gpu,label="GPU fault"; - gpu,threshold_count=<20>; - gpu,threshold_time=<1200>; - }; - aicl { - aicl,label="battery aicl"; - aicl,threshold_count=<5>; - aicl,threshold_time=<300>; - }; - }; - - abc_hub { - compatible = "samsung,abc_hub"; - status = "okay"; - - pinctrl-names = "det_pm_connect"; - pinctrl-0 = <&detect_conn_pm_setting>; - - bootc { - bootc,time_spec_user = <100000>; /* user binary user build */ - bootc,time_spec_eng = <100000>; /* user binary eng build */ - bootc,time_spec_fac = <100000>; /* factory binary */ - }; - - cond { - sec,det_pm_conn_gpios = <&pm6150_gpios 8 0>; /* SUB_CONNECT */ - sec,det_pm_conn_name = "sub"; - }; - }; - - qupv3_se8_2hsuart: qcom,qup_hsuart@0xa88000 { - compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; - reg = <0xa88000 0x4000>; - reg-names = "se_phys"; - clock-names = "se-clk", "m-ahb", "s-ahb"; - clocks = <&clock_gcc GCC_QUPV3_WRAP1_S2_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_M_AHB_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_S_AHB_CLK>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&qupv3_se8_2uart_tx_active>,<&qupv3_se8_2uart_rx_active>; - pinctrl-1 = <&qupv3_se8_2uart_tx_sleep>,<&qupv3_se8_2uart_rx_sleep>; - interrupts = ; - qcom,wrapper-core = <&qupv3_1>; - status = "ok"; - always-on-clock; - }; -}; - -&shared_meta { - status = "okay"; - parts = "vbmeta,boot,system,vendor,product,odm,prism,optics,vbmeta_samsung,recovery,dtbo,abl,xbl,tz,hyp"; -}; - -/* not use eMMC */ -&sdhc_1 { - status = "disabled"; -}; -/* not use SDcard */ -&sdhc_2 { - cd-gpios = <&tlmm 88 0x0>; -}; - - diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-input-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-input-common.dtsi deleted file mode 100755 index 511f9f7dda08..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-input-common.dtsi +++ /dev/null @@ -1,145 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&tlmm { - attn_irq: attn_irq { - mux { - pins = "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio9"; - input-enable; - bias-disable; /* No PULL */ - drive-strength = <2>; - }; - }; - attn_input: attn_input { - mux { - pins = "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio9"; - /*input-enable;*/ - bias-disable; - drive-strength = <2>; - }; - }; -}; - -&pm6150_gpios { - tsp_int_dvdd_en: tsp_int_dvdd_en { - pins = "gpio4"; - function = "normal"; - power-source = <0>; - }; -}; - - -&qupv3_se7_i2c { - status = "ok"; - - touchscreen@48 { - status = "ok"; - compatible = "sec,sec_ts"; - reg = <0x48>; - interrupt-parent = <&tlmm>; - interrupts = <9 0>; - pinctrl-names = "default", "on_state", "off_state"; - pinctrl-0 = <&attn_irq &tsp_int_dvdd_en>; - pinctrl-1 = <&attn_irq &tsp_int_dvdd_en>; - pinctrl-2 = <&attn_irq>; - sec,irq_gpio = <&tlmm 9 0x2008>; - sec,dvdd_gpio = <&pm6150_gpios 4 0>; /* tsp_dvdd_en PMIC GPIO 4, tsp_ldo_dvdd regulator */ - sec,irq_type = <0x2008>; - sec,max_coords = <4096 4096>; /* x y */ - sec,regulator_avdd = "tsp_ldo_avdd"; - sec,regulator_boot_on; - sec,firmware_name = "tsp_sec/y771_m51.bin", "tsp_sec/y771_m51_sdc.bin", "tsp_sec/y771_a71.bin"; - sec,project_name = "M51", "M515"; - sec,tclm_level = <2>; - sec,afe_base = <0x0105 0x0202 0x0107>; /* CSOT SDC A71 */ - support_dex_mode; - sec,i2c-burstmax = <0xffff>; - sec,ss_touch_num = <1>; - enable_settings_aot; - sec,area-size = <132 266 341>; - support_ear_detect_mode; - sync-reportrate-120 = "Y"; - support_fod; - support_fod_gesture; - support_open_short_test; - support_mis_calibration_test; - }; -}; - -/delete-node/&key_vol_up_default; -&pm6150l_gpios { - key_vol_up { - key_vol_up_default: key_vol_up_default { - pins = "gpio2"; - function = "normal"; - input-enable; - bias-pull-up; - power-source = <0>; - }; - }; -}; - -&soc { - /delete-node/gpio_keys; - gpio_keys { - status = "ok"; - compatible = "gpio-keys"; - input-name = "gpio-keys"; - - pinctrl-names = "default"; - pinctrl-0 = <&key_vol_up_default>; - - vol_up { - label = "volume_up"; - gpios = <&pm6150l_gpios 2 0x1>; - linux,input-type = <1>; - linux,code = ; - debounce-interval = <15>; - }; - }; - - ss_touch { - compatible = "samsung,ss_touch"; - ss_touch,numbers = <1>; - }; - - tsp_ldo_en { - compatible = "regulator-fixed"; - regulator-name = "tsp_ldo_en"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - gpio = <&tlmm 56 0>; - enable-active-high; - regulator-boot-on; - }; - - tsp_ldo_avdd { - compatible = "regulator-fixed"; - regulator-name = "tsp_ldo_avdd"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - gpio = <&tlmm 56 0>; - enable-active-high; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-pinctrl-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-pinctrl-common.dtsi deleted file mode 100755 index 91012510d81e..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-pinctrl-common.dtsi +++ /dev/null @@ -1,517 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../drivers/sm7150-sec-m51-audio-pinctrl.dtsi" - -&tlmm { - s2mpb03_i2c_pins { - s2mpb03_i2c_active: s2mpb03_i2c_active { - mux { - pins = "gpio46", "gpio47"; - function = "gpio"; - }; - config { - pins = "gpio46", "gpio47"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - - grip_i2c { - grip_i2c_active: grip_i2c_active { - grip_i2c_active { - pins = "gpio25", "gpio26"; - bias-disable; - }; - }; - grip_i2c_suspend: grip_i2c_suspend { - grip_i2c_suspend { - pins = "gpio25", "gpio26"; - bias-disable; - }; - }; - }; - - fuel_irq: fuel_irq { - config { - pins = "gpio104"; - bias-disable; /* No PULL */ - }; - }; - - sdc2_cd_on: cd_on { - mux { - pins = "gpio88"; - function = "gpio"; - }; - - config { - pins = "gpio88"; - drive-strength = <2>; - bias-disable; - }; - }; - - sdc2_cd_off: cd_off { - mux { - pins = "gpio88"; - function = "gpio"; - }; - - config { - pins = "gpio88"; - drive-strength = <2>; - bias-disable; - }; - }; - - cam_sensor_mclk0_active: cam_sensor_mclk0_active { - /* Main Rear MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk0_suspend: cam_sensor_mclk0_suspend { - /* Main Rear MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk1_active: cam_sensor_mclk1_active { - /* FRONT MCLK */ - mux { - pins = "gpio14"; - function = "cam_mclk"; - }; - config { - pins = "gpio14"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk1_suspend: cam_sensor_mclk1_suspend { - /* FRONT MCLK */ - mux { - pins = "gpio14"; - function = "cam_mclk"; - }; - config { - pins = "gpio14"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk2_active: cam_sensor_mclk2_active { - /* Bokeh Cam MCLK */ - mux { - pins = "gpio16"; - function = "cam_mclk"; - }; - config { - pins = "gpio16"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk2_suspend: cam_sensor_mclk2_suspend { - /* Bokeh Cam MCLK */ - mux { - pins = "gpio16"; - function = "cam_mclk"; - }; - config { - pins = "gpio16"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk3_active: cam_sensor_mclk3_active { - /* UW Cam MCLK */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - config { - pins = "gpio15"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk3_suspend: cam_sensor_mclk3_suspend { - /* UW Cam MCLK */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - config { - pins = "gpio15"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - - }; - }; - - cam_sensor_rear_active: cam_sensor_rear_active { - /* Main Rear reset */ - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_rear_suspend: cam_sensor_rear_suspend { - /* Main Rear reset */ - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_front_active: cam_sensor_front_active { - /* FRONT RESET */ - mux { - pins = "gpio23"; - function = "gpio"; - }; - config { - pins = "gpio23"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_front_suspend: cam_sensor_front_suspend { - /* FRONT RESET */ - mux { - pins = "gpio23"; - function = "gpio"; - }; - config { - pins = "gpio23"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - - - cam_sensor_rear3sw_active: cam_sensor_rear3sw_active { - /* UW Cam RESET */ - mux { - pins = "gpio53"; - function = "gpio"; - }; - config { - pins = "gpio53"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_rear3sw_suspend: cam_sensor_rear3sw_suspend { - /* UW Cam RESET */ - mux { - pins = "gpio53"; - function = "gpio"; - }; - config { - pins = "gpio53"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_rear3_pwr_active: cam_rear3_pwr_active { - /* UW VANA */ - mux { - pins = "gpio4"; - function = "gpio"; - }; - config { - pins = "gpio4"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_rear3_pwr_suspend: cam_rear3_pwr_suspend { - /* UW VANA */ - mux { - pins = "gpio4"; - function = "gpio"; - }; - config { - pins = "gpio4"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_mipi_sel_active: cam_mipi_sel_active { - /* MIPI SEL */ - mux { - pins = "gpio51"; - function = "gpio"; - }; - config { - pins = "gpio51"; - bias-disable; - output-high; - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_mipi_sel_suspend: cam_mipi_sel_suspend { - /* MIPI SEL */ - mux { - pins = "gpio51"; - function = "gpio"; - }; - config { - pins = "gpio51"; - bias-pull-down; - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear_sub2_active: cam_sensor_rear_sub2_active { - /* Bokeh Cam RESET */ - mux { - pins = "gpio67"; - function = "gpio"; - }; - config { - pins = "gpio67"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear_sub2_suspend: cam_sensor_rear_sub2_suspend { - /* Bokeh Cam RESET */ - mux { - pins = "gpio67"; - function = "gpio"; - }; - config { - pins = "gpio67"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_flash_active: cam_flash_active { - /* TORCH, FLASH */ - mux { - pins = "gpio22"; - function = "gpio"; - }; - config { - pins = "gpio22"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_flash_suspend: cam_flash_suspend { - /* TORCH, FLASH */ - mux { - pins = "gpio22"; - function = "gpio"; - }; - config { - pins = "gpio22"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_torch_active: cam_torch_active { - /* TORCH, FLASH */ - mux { - pins = "gpio24"; - function = "gpio"; - }; - config { - pins = "gpio24"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_torch_suspend: cam_torch_suspend { - /* TORCH, FLASH */ - mux { - pins = "gpio24"; - function = "gpio"; - }; - config { - pins = "gpio24"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - led_enable: led_enable { - mux { - pins = "gpio22"; - function = "gpio"; - }; - - config { - pins = "gpio22"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - led_disable: led_disable { - mux { - pins = "gpio22"; - function = "gpio"; - }; - - config { - pins = "gpio22"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - -}; - -&pm6150_gpios { - detect_conn_pm_setting: detect_conn_pm_setting { - pins = "gpio8"; /* SUB_DET */ - function = "normal"; - power-source = <0>; - bias-disable; /* NO PULL */ - input-enable; - }; - -}; - -&pm6150l_gpios { - grip_int_active: grip_int_active { - pins = "gpio6"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_int_suspend: grip_int_suspend { - pins = "gpio6"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - grip_sub_int_active: grip_sub_int_active { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_sub_int_suspend: grip_sub_int_suspend { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - cam_sensor_rear4sw_active: cam_sensor_rear4sw_active{ - pins = "gpio11"; - function = "normal"; - power-source = <1>; - input-enable; - bias-disable; - }; - - cam_sensor_rear4sw_suspend: cam_sensor_rear4sw_suspend{ - pins = "gpio11"; - function = "normal"; - power-souce = <1>; - input-enable; - bias-disable; - }; - - - cam_sensor_rear4_pwr_active: cam_sensor_rear4_pwr_active{ - pins = "gpio12"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - cam_sensor_rear4_pwr_suspend: cam_sensor_rear4_pwr_suspend{ - pins = "gpio12"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - - cam_sensor_rear4_digital_active: cam_sensor_rear4_digital_active{ - pins = "gpio10"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - cam_sensor_rear4_digital_suspend: cam_sensor_rear4_digital_suspend{ - pins = "gpio10"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - -}; diff --git a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-pm-common.dtsi b/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-pm-common.dtsi deleted file mode 100755 index b43db2ba2660..000000000000 --- a/arch/arm64/boot/dts/samsung/common/sm7150-sec-m51-pm-common.dtsi +++ /dev/null @@ -1,311 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include - -&soc { - /* AP Thermistor table */ - sec_thermistor@0 { - compatible = "samsung,sec-ap-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "ap_therm"; - adc_array = <1934 2351 2864 3141 4047 4829 - 5719 6712 7824 9032 10426 11867 - 13482 15254 17024 18686 20252 21688 23067 24237 25238 26106>; - temp_array = <850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* PA Thermistor table */ - sec_thermistor@1 { - compatible = "samsung,sec-pa-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "pa_therm"; - adc_array = <2064 2484 2982 3341 4181 4982 - 5881 6882 8011 9223 10627 12099 - 13711 15476 17258 18891 20442 21870 23241 24387 25368 26207>; - temp_array = <850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* WiFi Thermistor table */ - sec_thermistor@2 { - compatible = "samsung,sec-wf-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM3_PU2>; - io-channel-names = "wf_therm"; - adc_array = <2132 2557 3049 3501 4262 5073 - 5983 6993 8124 9349 10757 12244 - 13867 15622 17390 19019 20567 22001 23345 24472 25440 26259>; - temp_array = <850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@26 { - cell-index = <26>; - compatible = "i2c-gpio"; - gpios = <&tlmm 46 0 /* sda */ - &tlmm 47 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_active>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2900000>; - regulator-max-microvolt = <2900000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -&spmi_bus { - qcom,pm6150@0 { - qcom,power-on@800 { - interrupts = <0x0 0x8 0x0 IRQ_TYPE_NONE>, - <0x0 0x8 0x1 IRQ_TYPE_NONE>, - <0x0 0x8 0x4 IRQ_TYPE_NONE>, - <0x0 0x8 0x5 IRQ_TYPE_NONE>; - interrupt-names = "kpdpwr", "resin", - "resin-bark", "kpdpwr-resin-bark"; - qcom,s3-debounce = <128>; - - qcom,pon_1 { - qcom,support-reset = <0>; - }; - - qcom,pon_2 { - qcom,support-reset = <0>; - }; - - qcom,pon_3 { - qcom,pon-type = ; - qcom,support-reset = <1>; - qcom,pull-up = <1>; - qcom,s1-timer = <6720>; - qcom,s2-timer = <1000>; - qcom,s2-type = ; - qcom,use-bark; - }; - }; - }; - - qcom,pm8009@a { - status = "disabled"; - }; - qcom,pm8009@b { - status = "disabled"; - }; -}; - -/* Prevent voltage drop of LDO12*/ -&pm6150_l12 { - qcom,init-voltage = <1800000>; -}; - -/* Grip Sensor */ -&pm6150_l16 { - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; -}; - -&pm6150l_l11 { - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; -}; - -&pm6150_gpios { - interrupts = <0x0 0xc0 0 IRQ_TYPE_NONE>, - <0x0 0xc1 0 IRQ_TYPE_NONE>, - <0x0 0xc2 0 IRQ_TYPE_NONE>, - <0x0 0xc3 0 IRQ_TYPE_NONE>, - <0x0 0xc5 0 IRQ_TYPE_NONE>, - <0x0 0xc6 0 IRQ_TYPE_NONE>, - <0x0 0xc7 0 IRQ_TYPE_NONE>; - - interrupt-names = "pm6150_gpio1", "pm6150_gpio2", - "pm6150_gpio3", "pm6150_gpio4", - "pm6150_gpio6", - "pm6150_gpio7", - "pm6150_gpio8"; - qcom,gpios-disallowed = <5 9 10>; -}; - -&pm6150_adc_tm { - io-channels = <&pm6150_vadc ADC_XO_THERM_PU2>, - <&pm6150_vadc ADC_AMUX_THM2_PU2>, - <&pm6150_vadc ADC_AMUX_THM3_PU2>; - - quiet_therm { - status = "disabled"; - }; -}; - -&pm6150_vadc { - rf_pa0_therm { - reg = ; - label = "pa_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - rf_pa1_therm { - reg = ; - label = "wf_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - quiet_therm { - status = "disabled"; - }; -}; - -&pm6150l_gpios { - interrupts = <0x4 0xc0 0 IRQ_TYPE_NONE>, - <0x4 0xc1 0 IRQ_TYPE_NONE>, - <0x4 0xc2 0 IRQ_TYPE_NONE>, - <0x4 0xc3 0 IRQ_TYPE_NONE>, - <0x4 0xc4 0 IRQ_TYPE_NONE>, - <0x4 0xc5 0 IRQ_TYPE_NONE>, - <0x4 0xc7 0 IRQ_TYPE_NONE>, - <0x4 0xc8 0 IRQ_TYPE_NONE>, - <0x4 0xc9 0 IRQ_TYPE_NONE>, - <0x4 0xca 0 IRQ_TYPE_NONE>, - <0x4 0xcb 0 IRQ_TYPE_NONE>; - interrupt-names = "pm6150l_gpio1", "pm6150l_gpio2", - "pm6150l_gpio3", "pm6150l_gpio4", - "pm6150l_gpio5", "pm6150l_gpio6", - "pm6150l_gpio8", "pm6150l_gpio9", - "pm6150l_gpio10", "pm6150l_gpio11", - "pm6150l_gpio12"; - qcom,gpios-disallowed = <7>; - - dummy_pin { - dummy_pin_default: dummy_pin_default { - pins = "gpio12"; - bias-disable; - }; - }; -}; - -&pm6150l_adc_tm { - status = "disabled"; -/* /delete-property/ io-channels; - - conn_therm { - status = "disabled"; - }; - camera_ftherm { - status = "disabled"; - }; - nvm_therm { - status = "disabled"; - }; */ -}; - -&pm6150l_vadc { - pinctrl-0 = <&dummy_pin_default>; - - sdm_therm { - reg = ; - label = "ap_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - camera_ftherm { - status = "disabled"; - }; - nvm_therm { - status = "disabled"; - }; -}; - -&thermal_zones { - quiet-therm-adc { - status = "disabled"; - }; - conn-therm-adc { - status = "disabled"; - }; - camera-ftherm-adc { - status = "disabled"; - }; - nvm-therm-adc { - status = "disabled"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-abc-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-abc-r00.dtsi deleted file mode 100755 index 6bf14c9c074f..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-abc-r00.dtsi +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/ { - fragment@abc { - target-path = "/"; - __overlay__ { - sec_abc { - compatible = "samsung,sec_abc"; - status = "okay"; - - gpu { - gpu,label="GPU fault"; - gpu,threshold_count=<4>; - gpu,threshold_time=<1200>; - }; - gpu_page { - gpu_page,label="GPU page fault"; - gpu_page,threshold_count=<20>; - gpu_page,threshold_time=<1200>; - }; - aicl { - aicl,label="battery aicl"; - aicl,threshold_count=<5>; - aicl,threshold_time=<300>; - }; - }; - abc_hub { - compatible = "samsung,abc_hub"; - status = "okay"; - - bootc { - bootc,time_spec_user = <100000>; /* user binary user build */ - bootc,time_spec_eng = <100000>; /* user binary eng build */ - bootc,time_spec_fac = <100000>; /* factory binary */ - }; - }; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-audio-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-audio-common.dtsi deleted file mode 100755 index 32e0c46a1946..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-audio-common.dtsi +++ /dev/null @@ -1,207 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&aliases { - i2c18 = "/soc/i2c@18"; -}; - -&bolero { - qcom,num-macros = <3>; - imp_list: imp_list { - #list-imp-cells = <3>; - }; -}; - -&wcd938x_codec { - qcom,cdc-micbias2-mv = <2800>; - mbhc-button-thres = <&det_zones 13 63>, - <&det_zones 88 138>, - <&det_zones 138 138>, - <&det_zones 225 225>, - <&det_zones 450 450>, - <&det_zones 450 620>, - <&det_zones 450 620>, - <&det_zones 450 620>; - imp-table = <&imp_list 0 5 6>, - <&imp_list 6 23 8>, - <&imp_list 24 38 7>, - <&imp_list 39 100 6>, - <&imp_list 101 160 10>, - <&imp_list 161 400 11>, - <&imp_list 401 2000 11>, - <&imp_list 2001 0x7fffffff 6>; -}; - -&q6core { - cdc_quin_mi2s_gpios: msm_cdc_pinctrl_quin { - compatible = "qcom,msm-cdc-pinctrl"; - pinctrl-names = "aud_active", "aud_sleep"; - pinctrl-0 = <&lpi_i2s1_sck_active &lpi_i2s1_ws_active - &lpi_i2s1_sd0_active &lpi_i2s1_sd1_active>; - pinctrl-1 = <&lpi_i2s1_sck_sleep &lpi_i2s1_ws_sleep - &lpi_i2s1_sd0_sleep &lpi_i2s1_sd1_sleep>; - qcom,lpi-gpios; - }; -}; - -&soc { - sec-audio-sysfs { - compatible = "samsung,audio-sysfs"; - status = "okay"; - audio,num-amp = <2>; - }; - - samsung_q6audio_adaptation: samsung,q6audio-adaptation { - compatible = "samsung,q6audio-adaptation"; - adaptation,device-tx-port-id = <0xB037>; - adaptation,spk-rx-port-id = <0x1016>; - adaptation,usb-rx-port-id = <0x7000>; - adaptation,bt-rx-port-id = <0x400e>; - adaptation,headset-rx-port-id = <0xB030>; - }; - - det_zones: det_zones { - #list-det-cells = <2>; - }; - - i2c_18: i2c@18 { /* SW I2C */ - status = "ok"; - - cell-index = <18>; - compatible = "i2c-gpio"; - gpios = <&tlmm 88 0 /* sda */ - &tlmm 89 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&tas25xx_gpio_default &fm_lna_default>; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - tas256x:tas256x@4c { - #sound-dai-cells = <0>; - compatible = "ti, tas256x"; - status = "ok"; - reg = <0x4c>; - ti,reset-gpio = <&tlmm 94 0>; - ti,irq-gpio = <&tlmm 90 0>; - ti,left-channel = <0x4d>; - ti,right-channel = <0x4c>; - ti,channels = <2>; /* channel number */ - ti,iv-width = <8>; - ti,vbat-mon = <1>; - ti,port_id = <0x1016>; /* Rx port ID use for Qcom platform */ - }; - }; -}; - -&atoll_snd { - qcom,model = "atoll-idp-snd-card"; - qcom,wcn-btfm = <1>; - qcom,ext-disp-audio-rx = <0>; - qcom,mi2s-audio-intf = <1>; - asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>, - <&loopback>, <&compress>, <&hostless>, - <&afe>, <&lsm>, <&routing>, <&compr>, - <&pcm_noirq>, <&samsung_q6audio_adaptation>; - asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", - "msm-pcm-dsp.2", "msm-voip-dsp", - "msm-pcm-voice", "msm-pcm-loopback", - "msm-compress-dsp", "msm-pcm-hostless", - "msm-pcm-afe", "msm-lsm-client", - "msm-pcm-routing", "msm-compr-dsp", - "msm-pcm-dsp-noirq", "q6audio-adaptation"; - qcom,audio-routing = - "AMIC1", "MIC BIAS1", - "MIC BIAS1", "Analog Mic1", - "AMIC2", "MIC BIAS2", - "MIC BIAS2", "Analog Mic2", - "AMIC3", "MIC BIAS3", - "MIC BIAS3", "Analog Mic3", - "AMIC4", "MIC BIAS3", - "MIC BIAS3", "Analog Mic4", - "AMIC5", "MIC BIAS4", - "MIC BIAS4", "Analog Mic5", - "IN1_HPHL", "HPHL_OUT", - "IN2_HPHR", "HPHR_OUT", - "TX SWR_ADC0", "ADC1_OUTPUT", - "TX SWR_ADC1", "ADC2_OUTPUT", - "TX SWR_ADC2", "ADC3_OUTPUT", - "TX SWR_ADC3", "ADC4_OUTPUT", - "RX_TX DEC0_INP", "TX DEC0 MUX", - "RX_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC2_INP", "TX DEC2 MUX", - "RX_TX DEC3_INP", "TX DEC3 MUX", - "VA_AIF1 CAP", "VA_SWR_CLK", - "VA_AIF2 CAP", "VA_SWR_CLK", - "VA_AIF3 CAP", "VA_SWR_CLK", - "VA SWR_ADC0", "ADC1_OUTPUT", - "VA SWR_ADC1", "ADC2_OUTPUT", - "VA SWR_ADC2", "ADC3_OUTPUT", - "VA SWR_ADC3", "ADC4_OUTPUT"; - - qcom,msm-mbhc-hs-mic-max-threshold-mv = <9999>; - qcom,msm-mbhc-hs-mic-min-threshold-mv = <640>; - qcom,cdc-dmic01-gpios = <>; - qcom,cdc-dmic23-gpios = <>; - qcom,cdc-dmic45-gpios = <>; - qcom,quin-mi2s-gpios = <&cdc_quin_mi2s_gpios>; - asoc-codec = <&stub_codec>, <&bolero>; - asoc-codec-names = "msm-stub-codec.1", "bolero_codec"; - qcom,wsa-max-devs = <0>; - qcom,wsa-devs = <0>; - qcom,msm_audio_ssr_devs = <&audio_apr>, <&q6core>, - <&lpi_tlmm>, <&bolero>; - fsa4480-i2c-handle = <>; - qcom,fm-lna-gpios = <&tlmm 84 0>; - qcom,msm-mbhc-gnd-det = <1>; -}; - -&fsa4480 { - status = "disabled"; -}; -&wsa_swr_gpios { - status = "disabled"; -}; -&wsa_spkr_en1 { - status = "disabled"; -}; -&wsa_spkr_en2 { - status = "disabled"; -}; -&wsa881x_0211 { - status = "disabled"; -}; -&wsa881x_0212 { - status = "disabled"; -}; -&wsa881x_0213 { - status = "disabled"; -}; -&wsa881x_0214 { - status = "disabled"; -}; -&cdc_dmic01_gpios { - status = "disabled"; -}; -&cdc_dmic23_gpios { - status = "disabled"; -}; -&cdc_dmic45_gpios { - status = "disabled"; -}; -&wsa_swr_gpios { - status = "disabled"; -}; -&wsa_macro { - status = "disabled"; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-audio-pinctrl-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-audio-pinctrl-common.dtsi deleted file mode 100755 index 9d4048be58f0..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-audio-pinctrl-common.dtsi +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - tas25xx_gpio_default: tas25xx_gpio_default { - mux { - pins = "gpio88", "gpio89", "gpio90", "gpio94"; - function = "gpio"; - }; - config { - pins = "gpio88", "gpio89", "gpio90", "gpio94"; - bias-disable; /* No PULL */ - }; - }; - - fm_lna_default: fm_lna_default { - mux { - pins = "gpio84"; - function = "gpio"; - }; - config { - pins = "gpio84"; - bias-disable; /* No PULL */ - output-low; - }; - }; -}; - -&lpi_tlmm { - lpi_i2s1_sck_active: lpi_i2s1_sck_active { - config { - drive-strength = <4>; - }; - }; - - lpi_i2s1_ws_active: lpi_i2s1_ws_active { - config { - drive-strength = <4>; - }; - }; - - lpi_i2s1_sd0_active: lpi_i2s1_sd0_active { - config { - drive-strength = <4>; - }; - }; - - lpi_i2s1_sd1_active: lpi_i2s1_sd1_active { - config { - drive-strength = <4>; - }; - }; -}; - diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-battery-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-battery-common.dtsi deleted file mode 100755 index 7c4acdd626ca..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-battery-common.dtsi +++ /dev/null @@ -1,408 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&pm6150_vadc { - bat_thm { /* AMUX_3 */ - label = "bat_thm"; - reg = ; - qcom,pre-scaling = <1 1>; - qcom,hw-settle-time = <200>; - qcom,ratiometric; - }; - chg_thm { /* AMUX_1 */ - label = "chg_thm"; - reg = ; - qcom,pre-scaling = <1 1>; - qcom,hw-settle-time = <200>; - qcom,ratiometric; - }; -}; - -&soc { - battery { - pinctrl-names = "default"; - - battery,chip_vendor = "QCOM"; - status = "okay"; - compatible = "samsung,sec-battery"; - battery,vendor = "Battery"; - battery,charger_name = "sm5714-charger"; - battery,fuelgauge_name = "sm5714-fuelgauge"; - battery,fgsrc_switch_name = "sm5714-fuelgauge"; /* Fuelgauge voltage source */ - battery,technology = <2>; /* POWER_SUPPLY_TECHNOLOGY_LION */ - - battery,batt_data_version = <1>; - - battery,temp_adc_type = <1>; /* SEC_BATTERY_ADC_TYPE_AP */ - battery,temp_channel_raw = <1>; /* ADC_TEMP_CHANNEL_RAW */ - battery,adc_check_count = <5>; - battery,temp_check_type = <1>; - battery,chg_temp_check_type = <1>; - - battery,thermal_source = <2>; /* SEC_BATTERY_THERMAL_SOURCE_ADC */ - battery,chg_thermal_source = <2>; /* SEC_BATTERY_THERMAL_SOURCE_ADC */ - - battery,temp_table_adc = <1900 2339 2738 3223 3784 4431 5226 - 6147 7214 8418 9668 11135 12779 - 14442 16135 17825 19424 20972 22388 23655 24733 25666 26453>; - battery,temp_table_data = <900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - battery,chg_temp_table_adc = <1750 2185 2580 3042 3588 4220 4990 - 5899 6925 8083 9337 10812 12402 - 14105 15776 17380 19111 20650 22097 23393 24534 25468 26314>; - battery,chg_temp_table_data = <900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - - battery,polling_time = <10 30 30 30 3600>; - - battery,cable_check_type = <4>; /* SEC_BATTERY_CABLE_CHECK_PSY */ - battery,cable_source_type = <1>; - battery,polling_type = <1>; /* SEC_BATTERY_MONITOR_ALARM */ - battery,monitor_initial_count = <0>; - - battery,battery_check_type = <0>; /* SEC_BATTERY_CHECK_NONE */ - - battery,ovp_uvlo_check_type = <3>; /* SEC_BATTERY_OVP_UVLO_CHGPOLLING */ - - battery,temp_check_count = <1>; - - battery,overheatlimit_threshold = <700>; - battery,overheatlimit_recovery = <680>; - battery,wire_warm_overheat_thresh = <500>; - battery,wire_normal_warm_thresh = <420>; - battery,wire_cool1_normal_thresh = <180>; - battery,wire_cool2_cool1_thresh = <150>; - battery,wire_cool3_cool2_thresh = <50>; - battery,wire_cold_cool3_thresh = <0>; - - battery,wire_warm_current = <1563>; /* 0.36C */ - battery,wire_cool1_current = <2800>; /* 0.72C */ - battery,wire_cool2_current = <1047>; /* 0.24C */ - battery,wire_cool3_current = <437>; /* 0.1C */ - - battery,low_temp_topoff = <225>; - battery,high_temp_topoff = <225>; - - battery,low_temp_float = <4380>; - battery,high_temp_float = <4150>; - - battery,full_check_type = <7>; /* SEC_BATTERY_FULLCHARGED_CHGPSY */ - battery,full_check_type_2nd = <7>; /* SEC_BATTERY_FULLCHARGED_CHGPSY */ - battery,full_check_count = <1>; - battery,chg_gpio_full_check = <0>; - battery,chg_polarity_full_check = <1>; - - battery,chg_high_temp = <555>; - battery,chg_high_temp_recovery = <530>; - battery,chg_input_limit_current = <1000>; - battery,chg_charging_limit_current = <1400>; - - battery,wpc_temp_control_source = <1>; - battery,wpc_high_temp = <380>; - battery,wpc_high_temp_recovery = <360>; - battery,wpc_input_limit_current = <600>; - battery,wpc_charging_limit_current = <1000>; - battery,wpc_temp_lcd_on_control_source = <1>; - battery,wpc_lcd_on_high_temp = <380>; - battery,wpc_lcd_on_high_temp_rec = <360>; - battery,wpc_lcd_on_input_limit_current = <450>; - - battery,wpc_store_high_temp = <360>; - battery,wpc_store_high_temp_recovery = <340>; - battery,wpc_store_charging_limit_current = <400>; - battery,wpc_store_lcd_on_high_temp = <360>; - battery,wpc_store_lcd_on_high_temp_rec = <300>; - battery,wpc_store_lcd_on_charging_limit_current = <400>; - - battery,sleep_mode_limit_current = <500>; - battery,wc_full_input_limit_current = <100>; - - battery,mix_high_temp = <420>; - battery,mix_high_chg_temp = <500>; - battery,mix_high_temp_recovery = <390>; - - battery,full_condition_type = <9>; - battery,full_condition_soc = <93>; - battery,full_condition_vcell = <4330>; - - battery,recharge_check_count = <1>; - battery,recharge_condition_type = <4>; - battery,recharge_condition_soc = <98>; - battery,recharge_condition_vcell = <4310>; - - battery,charging_total_time = <14400>; - battery,hv_charging_total_time = <10800>; - battery,normal_charging_total_time = <18000>; - battery,usb_charging_total_time = <36000>; - battery,recharging_total_time = <5400>; - battery,charging_reset_time = <0>; - - battery,chg_float_voltage = <4380>; - - battery,pre_afc_work_delay = <2000>; - battery,pre_wc_afc_work_delay = <4000>; - battery,pre_afc_input_current = <500>; - battery,pre_wc_afc_input_current = <500>; - battery,prepare_ta_delay = <0>; /* msec */ - - battery,swelling_high_rechg_voltage = <4000>; - battery,swelling_low_rechg_voltage = <4230>; - - battery,siop_input_limit_current = <1200>; - battery,siop_charging_limit_current = <1000>; - battery,siop_hv_input_limit_current = <700>; - battery,siop_hv_input_limit_current_2nd = <550>; - battery,siop_hv_charging_limit_current = <1000>; - - battery,ttf_hv_charge_current = <2600>; - battery,ttf_dc25_charge_current = <3800>; - - battery,rp_current_rp1 = <500>; - battery,rp_current_rp2 = <1500>; - battery,rp_current_rp3 = <3000>; - battery,rp_current_rdu_rp3 = <2100>; - battery,rp_current_abnormal_rp3 = <1800>; - - battery,pd_charging_charge_power = <15000>; - battery,max_charging_current = <2800>; - - battery,wireless_cc_cv = <85>; - battery,wireless_otg_input_current = <900>; - - /* cycle, chg_float_voltage, recharge_condition_vcell, full_condition_vcell, full_condition_soc, step charging condition */ - battery,age_data = <0 4380 4310 4280 93 - 300 4360 4290 4260 92 - 400 4340 4270 4240 91 - 700 4320 4250 4220 90 - 1000 4270 4200 4170 89>; - - battery,health_condition = < - /* CYCLE ASOC */ - 900 0 /* GOOD */ - 1200 0 /* NORMAL */ - 1500 0 /* AGED */ - >; - - battery,standard_curr = <3650>; - battery,expired_time = <9120>; /* 92 + 60 minutes */ - battery,recharging_expired_time = <5400>; - battery,battery_full_capacity = <5000>; - battery,cisd_max_voltage_thr = <5000>; /* batttery ovp dettection voltage */ - - battery,max_input_voltage = <9000>; /* mV */ - battery,max_input_current = <3000>; /* mA */ - - battery,cisd_alg_index = <8>; - battery,ignore_cisd_index = <0 960>; /* Do not use AFC_FAIL to DROP_VALUE */ - battery,ignore_cisd_index_d = <0 120>; /* Do not use AFC_FAIL_PER_DAY to DROP_VALUE_PER_DAY */ - - battery,ttf_capacity = <3880>; - battery,cv_data = < - 3638 856 1307 - 3457 866 1266 - 3270 875 1226 - 3111 881 1195 - 2936 889 1155 - 2760 896 1114 - 2634 903 1075 - 2482 908 1043 - 2366 915 1002 - 2205 921 961 - 2123 926 924 - 2019 930 894 - 1930 934 860 - 1800 939 820 - 1710 944 773 - 1639 948 738 - 1547 952 698 - 1447 956 657 - 1378 958 623 - 1347 962 586 - 1188 965 545 - 1174 971 472 - 1086 974 434 - 1063 977 393 - 1008 980 352 - 977 988 218 - 878 992 155 - 870 994 124 - 768 998 62 - 757 1000 0 - >; - - io-channels = <&pm6150_vadc ADC_AMUX_THM3_PU2>, <&pm6150_vadc ADC_AMUX_THM1_PU2>; - io-channel-names = "adc-temp", "adc-chg-temp"; - }; - - sm5714-fuelgauge { - status = "okay"; - fuelgauge,fuel_alert_soc = <1>; - fuelgauge,capacity_max = <1000>; - fuelgauge,capacity_max_margin = <300>; - fuelgauge,capacity_min = <0>; - fuelgauge,capacity_calculation_type = <0x1F>; - fuelgauge,using_temp_compensation; - fuelgauge,low_temp_limit = <100>; - fuelgauge,using_hw_vempty; - fuelgauge,sw_v_empty_voltage = <3200>; - fuelgauge,sw_v_empty_voltage_cisd = <3100>; - fuelgauge,sw_v_empty_recover_voltage = <3480>; - fuelgauge,capacity = <5000>; - battery_params { - battery,id = <0>; - battery0,battery_type = <4430 0x1F20>; /* batt_v_max, cap */ - battery0,battery_table0 = < - 0x1400 0x1B73 0x1C4B 0x1D38 0x1D68 0x1D7A 0x1D88 0x1D8F - 0x1DB4 0x1DEA 0x1E0D 0x1E42 0x1E88 0x1EB4 0x1F01 0x1F3D - 0x1F76 0x1FC7 0x2023 0x207F 0x2116 0x2190 0x2272 0x2400 - >; - battery0,battery_table1 = < - 0x0 0x99 0x219 0x4B3 0x5CC 0x74C 0xB80 0xD19 - 0xFB3 0x14E6 0x1A19 0x1F4C 0x29B3 0x2EE6 0x36B3 0x3BE6 - 0x3E80 0x4119 0x464C 0x4B80 0x534C 0x5880 0x6400 0x6419 - >; - battery0,battery_table2 = < - 0x4B4B 0x4444 0x4040 0x3E3E 0x3C3C 0x3B3B 0x3838 0x3737 - 0x3535 0x3434 0x3434 0x3333 0x3333 0x3333 0x3333 0x3232 - >; - /* spare factor chg_factor dischg_factor manvalue */ - battery0,rs_value = <0x66 0x66 0x3800 0x199 0x599 0x599 0x100>; - battery0,v_alarm = <3300 0>; - battery0,topoff = <650>; - battery0,i_cal = <0 0x0 0x0800 0x0800 0 0x0 0x07F0 0x081B>; - battery0,v_cal = <1 0x0 0x0 1 0x0 0x0 0x0>; - battery0,temp_std = <25>; - battery0,tem_poff = <3450 50 3350 50>; - battery0,aux_ctrl = <0x322 0x5800>; - battery0,data_ver = <7>; - battery0,v_max_table = <0x2272 0x2250 0x222E 0x220C 0x21B7>; - battery0,q_max_table = <0x1F20 0x1E9F 0x1E1E 0x1D9D 0x1C5B>; - }; - }; - - /* sec_battery_cable - * 0 UNKNOWN, - * 1 NONE, - * 2 PREPARE_TA, - * 3 TA, - * 4 USB, - * 5 USB_CDP, - * 6 9V_TA, - * 7 9V_ERR, - * 8 9V_UNKNOWN, - * 9 12V_TA, - * 10 WIRELESS, - * 11 HV_WIRELESS, - * 12 PMA_WIRELESS, - * 13 WIRELESS_PACK, - * 14 CABLE_WIRELESS_HV_PACK, - * 15 WIRELESS_STAND, - * 16 WIRELESS_HV_STAND, - * 17 QC20, - * 18 QC30, - * 19 PDIC, - * 20 UARTOFF, - * 21 OTG, - * 22 LAN_HUB, - * 23 POWER_SHARING, - * 24 HMT_CONNECTED, - * 25 HMT_CHARGE, - * 26 HV_TA_CHG_LIMIT, - * 27 WIRELESS_VEHICLE, - * 28 WIRELESS_HV_VEHICLE, - * 29 PREPARE_WIRELESS_HV, - * 30 TIMEOUT, - * 31 SMART_OTG, - * 32 SMART_NOTG, - * 33 WIRELESS_TX, - * 34 HV_WIRELESS_20, - * 35 HV_WIRELESS_20_LIMIT, - * 36 WIRELESS_FAKE, - * 37 PREPARE_WIRELESS_20, - * 38 CABLE_PDIC_APDO, - * 39 CABLE_MAX, - */ - cable-info { - default_input_current = <1800>; - default_charging_current = <2100>; - full_check_current_1st = <650>; - full_check_current_2nd = <225>; - - current_group_1 { - cable_number = <2 19 21 22 23 30>; - input_current = <500>; - charging_current = <500>; - }; - current_group_2 { - cable_number = <25 31>; - input_current = <1000>; - charging_current = <1000>; - }; - current_group_3 { - cable_number = <5 32>; - input_current = <1500>; - charging_current = <1500>; - }; - current_group_4 { - cable_number = <6 7 8 17 18>; - input_current = <1650>; - charging_current = <2800>; - }; - current_group_5 { - cable_number = <9>; - input_current = <1650>; - charging_current = <3150>; - }; - current_group_6 { - cable_number = <10 12 15 27 33 36>; - input_current = <800>; - charging_current = <2400>; - }; - current_group_7 { - cable_number = <13>; - input_current = <700>; - charging_current = <2400>; - }; - current_group_8 { - cable_number = <24>; - input_current = <1000>; - charging_current = <450>; - }; - current_group_9 { - cable_number = <35>; - input_current = <1800>; - charging_current = <1800>; - }; - current_group_10 { - cable_number = <11 14 16 28 35>; - input_current = <650>; - charging_current = <2400>; - }; - current_group_11 { - cable_number = <29 37>; - input_current = <500>; - charging_current = <1200>; - }; - current_group_12 { - cable_number = <1 4>; - input_current = <475>; - charging_current = <550>; - }; - current_group_13 { - cable_number = <34>; - input_current = <1200>; - charging_current = <2400>; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-battery-r04.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-battery-r04.dtsi deleted file mode 100755 index 31750cd20640..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-battery-r04.dtsi +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "atoll-sec-a52q-battery-common.dtsi" - -&qupv3_se4_i2c { - status = "okay"; - - pca9468@57 { - compatible = "nxp,pca9468"; - reg = <0x57>; - - pinctrl-names = "default"; - pca9468,input-current-limit = <2550000>; /* 2.55A */ - pca9468,charging-current = <6000000>; /* 6A */ - pca9468,input-itopoff = <500000>; /* 500mA */ - pca9468,sense-resistance = <0>; /* 5mOhm */ - pca9468,switching-frequency = <3>; /* 980KHz */ - pca9468,ntc-threshold = <0>; /* disable */ - pca9468,ta-mode = <1>; /* 2:1 charging mode */ - pca9468,pps_reqen; - }; -}; - -&soc { - sec-direct-charger { - status = "okay"; - compatible = "samsung,sec-direct-charger"; - - charger,battery_name = "battery"; - charger,main_charger = "sm5714-charger"; - charger,direct_charger = "pca9468-charger"; - - charger,dchg_min_current = <2000>; - charger,dchg_temp_low_threshold = <180>; - charger,dchg_temp_high_threshold = <420>; - - }; - - battery { - battery,charger_name = "sec-direct-charger"; - - battery,dchg_temp_check_type = <1>; - battery,dchg_thermal_source = <3>; /* SEC_BATTERY_THERMAL_SOURCE_CHG_ADC */ - - battery,dchg_temp_table_adc = <105000 129030 154836 182988 218178 - 258060 304980 361284 426972 499698 - 577116 668610 769488 872712 978282 - 1081506 1184730 1280916 1367718 1447482 - 1515516 1576512 1625778>; - battery,dchg_temp_table_data = <900 850 800 750 700 - 650 600 550 500 450 - 400 350 300 250 200 - 150 100 50 0 (-50) - (-100) (-150) (-200)>; - - /* direct step charging option */ - battery,dc_step_chg_type = <0xE9>; - battery,dc_step_chg_charge_power = <22000>; - battery,dc_step_chg_step = <3>; - battery,dc_step_chg_cond_vol = <4095 4220 4380>; /* STEP_CHARGING_CONDITION_VOLTAGE */ - battery,dc_step_chg_cond_iin = <2030 1825 0>; /* STEP_CHARGING_CONDITION_INPUT_CURRENT */ - battery,dc_step_chg_iin_check_cnt = <3>; - battery,dc_step_chg_cond_soc = <12 50 100>; /* STEP_CHARGING_CONDITION_SOC */ - battery,dc_step_chg_val_vfloat = <4095 4220 4380>; /* STEP_CHARGING_CONDITION_FLOAT_VOLTAGE */ - battery,dc_step_chg_val_iout = <5000 4060 3650>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-camera-sensor-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-camera-sensor-common.dtsi deleted file mode 100755 index ccba364133fc..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-camera-sensor-common.dtsi +++ /dev/null @@ -1,727 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -&reserved_memory { - -}; - -&soc { - sm5714_flash0: qcom,flash_0 { - label = "flash"; - qcom,led-name = "led:flash_0"; - qcom,max-current = <1500>; - qcom,default-led-trigger = "flash0_trigger"; - qcom,id = <0>; - qcom,current-ma = <1500>; - qcom,duration-ms = <1280>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - qcom,record-current-ma = <300>; - }; - - sm5714_torch0: qcom,torch_0 { - label = "torch"; - qcom,led-name = "led:torch_0"; - qcom,max-current = <500>; - qcom,default-led-trigger = "torch0_trigger"; - qcom,id = <0>; - qcom,current-ma = <300>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - }; - - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - compatible = "qcom,camera-flash"; - flash-source = <&sm5714_flash0>; - torch-source = <&sm5714_torch0>; - switch-source = <&pm6150l_switch2>; - status = "ok"; - }; - - qcom,cam-res-mgr { - compatible = "qcom,cam-res-mgr"; - shared-gpios = <63>; - pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; - status = "ok"; - pinctrl-0 = <&rcam1_sensor_vana_active>; - pinctrl-1 = <&rcam1_sensor_vana_suspend>; - }; -}; - -&qupv3_se7_i2c { - status = "ok"; - - sm5714-fled { - compatible = "siliconmitus,sm5714-fled"; - reg = <0x49>; - status = "okay"; - slave-addr = <0x92>; - flash-en-gpio = <&tlmm 22 0>; - torch-en-gpio = <&tlmm 67 0>; - flash-brightness = <0xF>; //0x0(600mA) ~ 0xF(1350mA) : 50mA Step - preflash-brightness = <0x7>; - torch-brightness = <0x7>; //0x0(50mA) ~ 0x7(225mA) : 25mA Step - factory_current = <0x0>; //0x0(300mA) - timeout = <0xff>; - }; -}; - -&qupv3_se10_i2c { - status = "ok"; - - ois_rear: qcom,ois@62 { - compatible = "qcom,ois"; - cell-index = <0>; - reg = <0x62>; - slave-addr = <0xC4>; - slave-id = <0x460>; - - cam_vaf-supply = <&s2mpb03_l7>; - regulator-names = "cam_vaf"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000>; - rgltr-max-voltage = <2800000>; - rgltr-load-current = <200000>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&mcu_reset_active &mcu_clk_active>; - pinctrl-1 = <&mcu_reset_suspend &mcu_clk_suspend>; - gpio-no-mux = <0>; - gpios = <&tlmm 32 0>, /* RESET */ - <&tlmm 43 0>, /* BOOT0 */ - <&tlmm 63 0>; /* VANA : RCAM1_AVDD_1P8 */ - - gpio-reset = <0>; - gpio-custom1 = <1>; - gpio-vio = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <0 0 0>; - gpio-req-tbl-label = "MCU_RESET0", "MCU_BOOT0", "MCU_VIO"; - status = "ok"; - }; -}; - -&cam_cci0 { - - qcom,cam-sensor@0 { /* REAR CAM1 - 64MP Wide */ - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - slave-addr = <0x34>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - ois-src = <&ois_rear>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vaf-supply = <&s2mpb03_l7>; - cam_vana-supply = <&s2mpb03_l5>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio","cam_vaf","cam_vana","cam_vdig","cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 2800000 1000000 0>; - rgltr-max-voltage = <1800000 2800000 2900000 1100000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active &rcam1_sensor_reset_active &torch_en_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend &rcam1_sensor_reset_suspend &torch_en_suspend>; - - gpios = <&tlmm 13 0>, /* MCLK */ - <&tlmm 30 0>, /* RST */ - <&tlmm 63 0>; /* VANA : RCAM1_AVDD_1P8 */ - gpio-reset = <1>; - gpio-custom1 = <2>; //Due to multiple analog voltages :: RCAM1_AVDD_1P8 - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_VANA0"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <1>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { /* REAR CAM3 - 12MP UW */ - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - slave-addr = <0x5A>; - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &rcam3_sensor_reset_active &rcam3_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &rcam3_sensor_reset_suspend &rcam3_sensor_vana_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 15 0>, /* MCLK */ - <&tlmm 29 0>, /* RST */ - <&tlmm 65 0>, /* VANA */ - <&tlmm 66 0>; /*MIPI SEL*/ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <19200000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - eeprom2: qcom,eeprom@0x2D { - cell-index = <2>; - compatible = "qcom,eeprom"; - reg = <0x2D>; - slave-addr = <0x5A>; - - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &rcam3_sensor_reset_active &rcam3_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &rcam3_sensor_reset_suspend &rcam3_sensor_vana_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 15 0>, /* MCLK */ - <&tlmm 29 0>, /* RST */ - <&tlmm 65 0>, /* VANA */ - <&tlmm 66 0>; /*MIPI SEL*/ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <19200000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - eeprom3: qcom,eeprom@37 { - cell-index = <3>; - compatible = "qcom,eeprom"; - reg = <0x37>; - slave-addr = <0x6E>; - i2c-freq-mode = <1>; - - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig","cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 0>; - rgltr-max-voltage = <1800000 1200000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &rcam2_sensor_reset_active &rcam2_sensor_vana_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &rcam2_sensor_reset_suspend &rcam2_sensor_vana_suspend>; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 42 0>, /* RST */ - <&tlmm 64 0>; /* VANA */ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - -}; - -&cam_cci1 { - - qcom,cam-sensor@1 { /* VT 32M */ - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - slave-addr = <0x34>; - csiphy-sd-index = <2>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 1050000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &front_sensor_reset_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &front_sensor_reset_suspend >; - - gpios = <&tlmm 23 0>, /* MCLK */ - <&tlmm 21 0>; /*RST */ - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK4_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { /* VT 32M */ - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - slave-addr = <0x34>; - csiphy-sd-index = <2>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 1050000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &front_sensor_reset_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &front_sensor_reset_suspend >; - - gpios = <&tlmm 23 0>, /* MCLK */ - <&tlmm 21 0>; /*RST */ - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK4_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { /* REAR CAM 2 - 5M Bokeh */ - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - slave-addr = <0x6E>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig","cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 0>; - rgltr-max-voltage = <1800000 1200000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &rcam2_sensor_reset_active &rcam2_sensor_vana_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &rcam2_sensor_reset_suspend &rcam2_sensor_vana_suspend>; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 42 0>, /* RST */ - <&tlmm 64 0>; /* VANA */ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - sensor_rear_macro: qcom,cam-sensor@4 { /* REAR CAM 4 - 5M Macro */ - cell-index = <4>; - compatible = "qcom,cam-sensor"; - reg = <0x4>; - slave-addr = <0x7E>; - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom4>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk4_active &rcam4_sensor_reset_active &rcam4_sensor_vana_active &cam_mipi_sel_active &torch_en_active>; - pinctrl-1 = <&cam_sensor_mclk4_suspend &rcam4_sensor_reset_suspend &rcam4_sensor_vana_suspend &cam_mipi_sel_suspend &torch_en_suspend>; - - gpios = <&tlmm 16 0>, /* MCLK */ - <&tlmm 24 0>, /* RESET */ - <&tlmm 74 0>, /* VANA */ - <&tlmm 66 0>; /*MIPI SEL*/ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - eeprom4: qcom,eeprom@0x3F { - cell-index = <4>; - compatible = "qcom,eeprom"; - reg = <0x3F>; - slave-addr = <0x7E>; - i2c-freq-mode = <1>; - - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk4_active &rcam4_sensor_reset_active &rcam4_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk4_suspend &rcam4_sensor_reset_suspend &rcam4_sensor_vana_suspend &cam_mipi_sel_suspend>; - - gpios = <&tlmm 16 0>, // MCLK - <&tlmm 24 0>, // RESET - <&tlmm 74 0>, // VANA - <&tlmm 66 0>; // MIPI SEL - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - -}; - -&qupv3_se9_i2c { - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - slave-addr = <0x18>; - compatible = "i2c_actuator"; - - rgltr-cntrl-support; - cam_vio-supply = <&s2mpb03_l3>; - cam_vaf-supply = <&s2mpb03_l7>; - regulator-names = "cam_vio","cam_vaf"; - rgltr-min-voltage = <1800000 2800000>; - rgltr-max-voltage = <1800000 2800000>; - rgltr-load-current = <200000 200000>; - }; - - eeprom0: qcom,eeprom@50 { - cell-index = <0>; - reg = <0x50>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&s2mpb03_l7>; - cam_vio-supply = <&s2mpb03_l3>; - - regulator-names = "cam_vaf","cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-mode = <0>; - sensor-position = <1>; - rgltr-cntrl-support; - }; - -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-camera-sensor-r02.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-camera-sensor-r02.dtsi deleted file mode 100755 index 93a5344ab4d3..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-camera-sensor-r02.dtsi +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -&reserved_memory { - -}; - -&sensor_rear_macro { - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 0>; - rgltr-max-voltage = <1800000 1200000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk4_active &rcam4_sensor_reset_active &rcam4_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk4_suspend &rcam4_sensor_reset_suspend &rcam4_sensor_vana_suspend &cam_mipi_sel_suspend>; - - gpios = <&tlmm 16 0>, /* MCLK */ - <&tlmm 24 0>, /* RESET */ - <&tlmm 64 0>, /* VANA */ - <&tlmm 66 0>; /*MIPI SEL*/ -}; - -&eeprom4 { - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 0>; - rgltr-max-voltage = <1800000 1200000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk4_active &rcam4_sensor_reset_active &rcam4_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk4_suspend &rcam4_sensor_reset_suspend &rcam4_sensor_vana_suspend &cam_mipi_sel_suspend>; - - gpios = <&tlmm 16 0>, // MCLK - <&tlmm 24 0>, // RESET - <&tlmm 64 0>, // VANA - <&tlmm 66 0>; // MIPI SEL -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-display-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-display-r00.dtsi deleted file mode 100755 index fbe3b81affa4..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-display-r00.dtsi +++ /dev/null @@ -1,199 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../../drivers/gpu/drm/msm/samsung_lego/SELF_DISPLAY/self_display_cmd_FC3.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS646YD04/dsi_panel_S6E3FC3_AMS646YD04_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung_lego/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - - -&tlmm { - pmx_sde_te { - sde_te_active: sde_te_active { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_te_suspend: sde_te_suspend { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio8"; - function = "gpio"; - }; - - config { - pins = "gpio8"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio8"; - function = "gpio"; - }; - - config { - pins = "gpio8"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - }; -}; - -&pm6150_gpios { - pmx_sde_ub_det { - sde_ub_det_default: sde_ub_det_default { - pins = "gpio5"; - function = "normal"; - input-enable; - power-source = <1>; - bias-disable; /* No PULL */ - }; - }; -}; - -&pm6150l_gpios { - pmx_sde_fg_err { - sde_fg_err_default: sde_fg_err_default { - pins = "gpio3"; - function = "normal"; - input-enable; - power-source = <0>; - bias-disable; /* No PULL */ - }; - }; -}; - -&soc { - /* A52Q panel */ - ss_dsi_panel_S6E3FC3_AMS646YD04_FHD_display: qcom,dsi-display@9 { - label = "ss_dsi_panel_S6E3FC3_AMS646YD04_FHD"; - qcom,display-type = "primary"; - - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@10 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - - }; -}; - -&sde_dsi { - vci-supply = <&pm6150_l18>; /* 3.0V, VREG_L18A_3P0 */ - vddi-supply = <&pm6150_l13>; /* 1.8V, VREG_L13A_1P8 */ - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_te_active &sde_dsi_active &sde_ub_det_default &sde_fg_err_default>; - pinctrl-1 = <&sde_te_suspend &sde_dsi_suspend &sde_ub_det_default &sde_fg_err_default>; - qcom,dsi-display-list = - <&ss_dsi_panel_S6E3FC3_AMS646YD04_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; -}; - -&ss_dsi_panel_S6E3FC3_AMS646YD04_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_S6E3FC3_AMS646YD04_FHD>; - - qcom,platform-reset-gpio = <&tlmm 8 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&pm6150_gpios 5 0>; /* OCTA_CON_DET*/ - samsung,esd-irq-gpio1 = <&pm6150l_gpios 3 0>; /* FG_ERR*/ - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vci"; - qcom,supply-min-voltage = <3000000>; - qcom,supply-max-voltage = <3000000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <0>; - qcom,supply-pre-off-sleep = <0>; - }; - - qcom,panel-supply-entry@1 { - reg = <1>; - qcom,supply-name = "vddi"; - qcom,supply-min-voltage = <1800000>; - qcom,supply-max-voltage = <1800000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <0>; - qcom,supply-pre-off-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-reset-gpio = <&tlmm 8 0>; -}; - -&cont_splash_memory { - reg = <0x0 0x9c000000 0x0 0x9E4000>; //0x9E4000 is roundup(1080 * 2400 * 4, 4K) - label = "cont_splash_region"; -}; - -&dfps_data_memory { - reg = <0x0 0x9C9E4000 0x0 0x0100000>; //0x9C9E4000 is 0x9c000000 + 0x9E4000 - label = "dfps_data_region"; -}; - -&disp_rdump_memory { - reg = <0x0 0x9c000000 0x0 0x9E4000>; //0x9E4000 is roundup(1080 * 2400 * 4, 4K) - label = "disp_rdump_region"; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-fingerprint_00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-fingerprint_00.dtsi deleted file mode 100755 index fc12636537d4..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-fingerprint_00.dtsi +++ /dev/null @@ -1,77 +0,0 @@ -/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - fps_rst: fps_rst { - mux { - pins = "gpio91"; - function = "gpio"; - }; - config { - pins = "gpio91"; - bias-pull-down; - }; - }; -}; - -&pm6150l_l11 { - regulator-name = "VDD_BTP_3P3"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; -}; - -&qupv3_se6_spi { - qcom,set-miso-sampling; - qcom,miso-sampling-ctrl-val = <2>; - status = "okay"; - - gw9558-spi@0 { - compatible = "goodix,gw9558x_factory"; - reg = <0>; - spi-max-frequency = <25000000>; - - pinctrl-names = "default"; - pinctrl-0 = <&fps_rst>; - - gpio-controller; - #gpio-cells = <2>; - - goodix,btp-regulator = "VDD_BTP_3P3"; - goodix,gpio_reset = <&tlmm 91 0>; - goodix,chip_id = "GW9558"; - goodix,position = "11.81,-0.02,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; - goodix,modelinfo = "A525"; - goodix,rb = "547,215,-1,FFFFFF,A9A9A9"; - }; -}; - -&soc { - gw9558@0 { - compatible = "goodix,gw9558x"; - reg = <0>; - spi-max-frequency = <25000000>; - - pinctrl-names = "default"; - pinctrl-0 = <&fps_rst>; - - gpio-controller; - #gpio-cells = <2>; - - goodix,btp-regulator = "VDD_BTP_3P3"; - goodix,gpio_reset = <&tlmm 91 0>; - goodix,chip_id = "GW9558"; - goodix,position = "11.81,-0.02,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; - goodix,modelinfo = "A525"; - goodix,rb = "547,215,-1,FFFFFF,A9A9A9"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-hall-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-hall-r00.dtsi deleted file mode 100755 index 5f803b55dcb0..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-hall-r00.dtsi +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - hall { - status = "okay"; - compatible = "hall"; - linux,input-type = <1>; - linux,code = <21>; - hall,gpio_flip_cover = <&pm6150_gpios 10 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&hall_default>; - }; -}; - -&pm6150_gpios { - hall { - hall_default: hall_default { - pins = "gpio10"; - function = "normal"; - output-disable; - input-enable; - bias-disable; - power-source = <0>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-nfc_r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-nfc_r00.dtsi deleted file mode 100755 index 5569c65f6d69..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-nfc_r00.dtsi +++ /dev/null @@ -1,117 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - nfc_qupv3_se0_i2c_sleep: nfc_qupv3_se0_i2c_sleep { - mux { - pins = "gpio34", "gpio35"; - function = "gpio"; - }; - - config { - pins = "gpio34", "gpio35"; - drive-strength = <2>; - bias-disable; - }; - }; - - nfc_clk_req_gpio: nfc_clk_req_gpio { - mux { - pins = "gpio31"; - function = "gpio"; - }; - - config { - pins = "gpio31"; - drive-strength = <2>; - bias-pull-down; - input-enable; - }; - }; - - nfc_irq_gpio: nfc_irq_gpio { - mux { - pins = "gpio37"; - function = "gpio"; - }; - config { - pins = "gpio37"; - drive-strength = <2>; - bias-pull-down; - input-enable; - }; - }; - - nfc_ven_gpio: nfc_ven_gpio { - mux { - pins = "gpio12"; - function = "gpio"; - }; - config { - pins = "gpio12"; - drive-strength = <2>; - bias-disable; - output-high; - }; - }; - - nfc_firm_gpio: nfc_firm_gpio { - mux { - pins = "gpio36"; - function = "gpio"; - }; - config { - pins = "gpio36"; - drive-strength = <2>; - bias-disable; - output-low; - }; - }; - - nfc_ldo_en_gpio: nfc_ldo_en_gpio { - mux { - pins = "gpio68"; - function = "gpio"; - }; - config { - pins = "gpio68"; - drive-strength = <2>; - bias-disable; - output-low; - }; - }; -}; - -/* gpio34 and gpio35 are used for nfc i2c */ -&qupv3_se0_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se0_i2c_sleep>; - qcom,clk-freq-out = <400000>; - sec-nfc@27 { - compatible = "sec-nfc"; - reg = <0x27>; - interrupt-parent = <&tlmm>; - interrupts = <37 0>; - - sec-nfc,ven-gpio = <&tlmm 12 0>; - sec-nfc,irq-gpio = <&tlmm 37 0>; - sec-nfc,firm-gpio = <&tlmm 36 0>; - sec-nfc,clk_req-gpio = <&tlmm 31 0>; - /* sec-nfc,nfc_pvdd-supply = <&pm6150a_l1>;*/ - sec-nfc,pvdd-gpio = <&tlmm 68 0>; - /*sec-nfc,ldo_control;*/ - sec-nfc,clk_req_wake; - sec-nfc,bootloader_ver = <6>; - - pinctrl-names = "default"; - pinctrl-0 = <&nfc_clk_req_gpio &nfc_irq_gpio &nfc_ven_gpio &nfc_firm_gpio &nfc_ldo_en_gpio>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-usb-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-usb-r00.dtsi deleted file mode 100755 index 12c85c97bc24..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-usb-r00.dtsi +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&qupv3_se4_i2c { - pinctrl-1 = <&if_pmic_i2c_sleep>; - status = "okay"; - sm5714@49{ - status = "okay"; - compatible = "siliconmitus,sm5714mfd"; - reg = <0x49>; - pinctrl-names = "default"; - pinctrl-0 = <&if_pmic_irq_default>; - sm5714,irq-gpio = <&tlmm 33 0>; - sm5714,wakeup; - }; -}; - -&qupv3_se11_i2c { - pinctrl-1 = <&usbpd_i2c_sleep>; - status = "okay"; - usbpd-sm5714@33 { - status = "okay"; - compatible = "sm5714-usbpd"; - reg = <0x33>; - pinctrl-names = "default"; - pinctrl-0 = <&usbpd_irq_default>; - usbpd,usbpd_int = <&tlmm 104 0>; - support_pd_role_swap; - pdic-manager { - /* sink */ - pdic,max_power = <5000>; - pdic_op_power = <2500>; - pdic_max_voltage = <6000>; - pdic_max_current = <2000>; - pdic,min_current = <500>; - - pdic,giveback = <0>; - pdic,usb_com_capable = <1>; - pdic,no_usb_suspend = <1>; - - /* source */ - source,max_voltage = <5000>; - source,min_voltage = <4000>; - source,max_power = <2500>; - }; - }; -}; - -&tlmm { - if_pmic_irq { - if_pmic_irq_default: if_pmic_irq_default { - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; - }; - - usbpd_irq { - usbpd_irq_default: usbpd_irq_default { - mux { - pins = "gpio104"; - function = "gpio"; - }; - config { - pins = "gpio104"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; - }; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x18 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x46 0x240 /* TUNE1 */ - 0x2b 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x00 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,qusb-phy-host-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x18 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x46 0x240 /* TUNE1 */ - 0x2b 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x00 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-vibrator-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-vibrator-r00.dtsi deleted file mode 100755 index fedce1f96de2..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a52q-vibrator-r00.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - vibrator: samsung,vibrator { - compatible = "samsung_vib"; - samsung,vib_type = "COINDC"; - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-audio-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-audio-common.dtsi deleted file mode 100755 index 32e0c46a1946..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-audio-common.dtsi +++ /dev/null @@ -1,207 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&aliases { - i2c18 = "/soc/i2c@18"; -}; - -&bolero { - qcom,num-macros = <3>; - imp_list: imp_list { - #list-imp-cells = <3>; - }; -}; - -&wcd938x_codec { - qcom,cdc-micbias2-mv = <2800>; - mbhc-button-thres = <&det_zones 13 63>, - <&det_zones 88 138>, - <&det_zones 138 138>, - <&det_zones 225 225>, - <&det_zones 450 450>, - <&det_zones 450 620>, - <&det_zones 450 620>, - <&det_zones 450 620>; - imp-table = <&imp_list 0 5 6>, - <&imp_list 6 23 8>, - <&imp_list 24 38 7>, - <&imp_list 39 100 6>, - <&imp_list 101 160 10>, - <&imp_list 161 400 11>, - <&imp_list 401 2000 11>, - <&imp_list 2001 0x7fffffff 6>; -}; - -&q6core { - cdc_quin_mi2s_gpios: msm_cdc_pinctrl_quin { - compatible = "qcom,msm-cdc-pinctrl"; - pinctrl-names = "aud_active", "aud_sleep"; - pinctrl-0 = <&lpi_i2s1_sck_active &lpi_i2s1_ws_active - &lpi_i2s1_sd0_active &lpi_i2s1_sd1_active>; - pinctrl-1 = <&lpi_i2s1_sck_sleep &lpi_i2s1_ws_sleep - &lpi_i2s1_sd0_sleep &lpi_i2s1_sd1_sleep>; - qcom,lpi-gpios; - }; -}; - -&soc { - sec-audio-sysfs { - compatible = "samsung,audio-sysfs"; - status = "okay"; - audio,num-amp = <2>; - }; - - samsung_q6audio_adaptation: samsung,q6audio-adaptation { - compatible = "samsung,q6audio-adaptation"; - adaptation,device-tx-port-id = <0xB037>; - adaptation,spk-rx-port-id = <0x1016>; - adaptation,usb-rx-port-id = <0x7000>; - adaptation,bt-rx-port-id = <0x400e>; - adaptation,headset-rx-port-id = <0xB030>; - }; - - det_zones: det_zones { - #list-det-cells = <2>; - }; - - i2c_18: i2c@18 { /* SW I2C */ - status = "ok"; - - cell-index = <18>; - compatible = "i2c-gpio"; - gpios = <&tlmm 88 0 /* sda */ - &tlmm 89 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&tas25xx_gpio_default &fm_lna_default>; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - tas256x:tas256x@4c { - #sound-dai-cells = <0>; - compatible = "ti, tas256x"; - status = "ok"; - reg = <0x4c>; - ti,reset-gpio = <&tlmm 94 0>; - ti,irq-gpio = <&tlmm 90 0>; - ti,left-channel = <0x4d>; - ti,right-channel = <0x4c>; - ti,channels = <2>; /* channel number */ - ti,iv-width = <8>; - ti,vbat-mon = <1>; - ti,port_id = <0x1016>; /* Rx port ID use for Qcom platform */ - }; - }; -}; - -&atoll_snd { - qcom,model = "atoll-idp-snd-card"; - qcom,wcn-btfm = <1>; - qcom,ext-disp-audio-rx = <0>; - qcom,mi2s-audio-intf = <1>; - asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>, - <&loopback>, <&compress>, <&hostless>, - <&afe>, <&lsm>, <&routing>, <&compr>, - <&pcm_noirq>, <&samsung_q6audio_adaptation>; - asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", - "msm-pcm-dsp.2", "msm-voip-dsp", - "msm-pcm-voice", "msm-pcm-loopback", - "msm-compress-dsp", "msm-pcm-hostless", - "msm-pcm-afe", "msm-lsm-client", - "msm-pcm-routing", "msm-compr-dsp", - "msm-pcm-dsp-noirq", "q6audio-adaptation"; - qcom,audio-routing = - "AMIC1", "MIC BIAS1", - "MIC BIAS1", "Analog Mic1", - "AMIC2", "MIC BIAS2", - "MIC BIAS2", "Analog Mic2", - "AMIC3", "MIC BIAS3", - "MIC BIAS3", "Analog Mic3", - "AMIC4", "MIC BIAS3", - "MIC BIAS3", "Analog Mic4", - "AMIC5", "MIC BIAS4", - "MIC BIAS4", "Analog Mic5", - "IN1_HPHL", "HPHL_OUT", - "IN2_HPHR", "HPHR_OUT", - "TX SWR_ADC0", "ADC1_OUTPUT", - "TX SWR_ADC1", "ADC2_OUTPUT", - "TX SWR_ADC2", "ADC3_OUTPUT", - "TX SWR_ADC3", "ADC4_OUTPUT", - "RX_TX DEC0_INP", "TX DEC0 MUX", - "RX_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC2_INP", "TX DEC2 MUX", - "RX_TX DEC3_INP", "TX DEC3 MUX", - "VA_AIF1 CAP", "VA_SWR_CLK", - "VA_AIF2 CAP", "VA_SWR_CLK", - "VA_AIF3 CAP", "VA_SWR_CLK", - "VA SWR_ADC0", "ADC1_OUTPUT", - "VA SWR_ADC1", "ADC2_OUTPUT", - "VA SWR_ADC2", "ADC3_OUTPUT", - "VA SWR_ADC3", "ADC4_OUTPUT"; - - qcom,msm-mbhc-hs-mic-max-threshold-mv = <9999>; - qcom,msm-mbhc-hs-mic-min-threshold-mv = <640>; - qcom,cdc-dmic01-gpios = <>; - qcom,cdc-dmic23-gpios = <>; - qcom,cdc-dmic45-gpios = <>; - qcom,quin-mi2s-gpios = <&cdc_quin_mi2s_gpios>; - asoc-codec = <&stub_codec>, <&bolero>; - asoc-codec-names = "msm-stub-codec.1", "bolero_codec"; - qcom,wsa-max-devs = <0>; - qcom,wsa-devs = <0>; - qcom,msm_audio_ssr_devs = <&audio_apr>, <&q6core>, - <&lpi_tlmm>, <&bolero>; - fsa4480-i2c-handle = <>; - qcom,fm-lna-gpios = <&tlmm 84 0>; - qcom,msm-mbhc-gnd-det = <1>; -}; - -&fsa4480 { - status = "disabled"; -}; -&wsa_swr_gpios { - status = "disabled"; -}; -&wsa_spkr_en1 { - status = "disabled"; -}; -&wsa_spkr_en2 { - status = "disabled"; -}; -&wsa881x_0211 { - status = "disabled"; -}; -&wsa881x_0212 { - status = "disabled"; -}; -&wsa881x_0213 { - status = "disabled"; -}; -&wsa881x_0214 { - status = "disabled"; -}; -&cdc_dmic01_gpios { - status = "disabled"; -}; -&cdc_dmic23_gpios { - status = "disabled"; -}; -&cdc_dmic45_gpios { - status = "disabled"; -}; -&wsa_swr_gpios { - status = "disabled"; -}; -&wsa_macro { - status = "disabled"; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-audio-pinctrl-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-audio-pinctrl-common.dtsi deleted file mode 100755 index 37062f1693ab..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-audio-pinctrl-common.dtsi +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - tas25xx_gpio_default: tas25xx_gpio_default { - mux { - pins = "gpio88", "gpio89", "gpio90", "gpio94"; - function = "gpio"; - }; - config { - pins = "gpio88", "gpio89", "gpio90", "gpio94"; - bias-disable; /* No PULL */ - }; - }; - - fm_lna_default: fm_lna_default { - mux { - pins = "gpio84"; - function = "gpio"; - }; - config { - pins = "gpio84"; - bias-disable; /* No PULL */ - output-low; - }; - }; -}; - -&lpi_tlmm { - lpi_i2s1_sck_active: lpi_i2s1_sck_active { - config { - drive-strength = <4>; - }; - }; - - lpi_i2s1_ws_active: lpi_i2s1_ws_active { - config { - drive-strength = <4>; - }; - }; - - lpi_i2s1_sd0_active: lpi_i2s1_sd0_active { - config { - drive-strength = <4>; - }; - }; - - lpi_i2s1_sd1_active: lpi_i2s1_sd1_active { - config { - drive-strength = <4>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-battery-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-battery-common.dtsi deleted file mode 100755 index b6603b59ba4c..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-battery-common.dtsi +++ /dev/null @@ -1,438 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&qupv3_se4_i2c { - status = "okay"; - sm5440@63{ - status = "okay"; - compatible = "siliconmitus,sm5440"; - reg = <0x63>; - pinctrl-names = "default"; - - }; -}; - -&pm6150_vadc { - bat_thm { /* AMUX_3 */ - label = "bat_thm"; - reg = ; - qcom,pre-scaling = <1 1>; - qcom,hw-settle-time = <200>; - qcom,ratiometric; - }; - chg_thm { /* AMUX_1 */ - label = "chg_thm"; - reg = ; - qcom,pre-scaling = <1 1>; - qcom,hw-settle-time = <200>; - qcom,ratiometric; - }; -}; - -&soc { - - sec-direct-charger { - status = "okay"; - compatible = "samsung,sec-direct-charger"; - - charger,battery_name = "battery"; - charger,main_charger = "sm5714-charger"; - charger,direct_charger = "sm5440-charger"; - - charger,dchg_min_current = <2000>; - charger,dchg_temp_low_threshold = <180>; - charger,dchg_temp_high_threshold = <420>; - - }; - - battery { - pinctrl-names = "default"; - - battery,chip_vendor = "QCOM"; - status = "okay"; - compatible = "samsung,sec-battery"; - battery,vendor = "Battery"; - battery,charger_name = "sec-direct-charger"; - battery,fuelgauge_name = "sm5714-fuelgauge"; - battery,fgsrc_switch_name = "sm5714-fuelgauge"; /* Fuelgauge voltage source */ - battery,technology = <2>; /* POWER_SUPPLY_TECHNOLOGY_LION */ - - battery,batt_data_version = <1>; - - battery,temp_adc_type = <1>; /* SEC_BATTERY_ADC_TYPE_AP */ - battery,temp_channel_raw = <1>; /* ADC_TEMP_CHANNEL_RAW */ - battery,adc_check_count = <5>; - battery,temp_check_type = <1>; - battery,chg_temp_check_type = <1>; - - battery,thermal_source = <2>; /* SEC_BATTERY_THERMAL_SOURCE_ADC */ - battery,chg_thermal_source = <2>; /* SEC_BATTERY_THERMAL_SOURCE_ADC */ - - battery,temp_table_adc = <2020 2369 2778 3265 3826 4488 5267 - 6177 7241 8412 9692 11156 12721 - 14420 16114 17800 19421 20972 22401 23685 24754 25686 26458>; - battery,temp_table_data = <900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - battery,chg_temp_table_adc = <1889 2241 2652 3125 3677 4322 5094 - 5990 7045 8204 9475 10929 12492 - 14196 15893 17584 19237 20801 22238 23542 24642 25597 26385>; - battery,chg_temp_table_data = <900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - - battery,polling_time = <10 30 30 30 3600>; - - battery,cable_check_type = <4>; /* SEC_BATTERY_CABLE_CHECK_PSY */ - battery,cable_source_type = <1>; - battery,polling_type = <1>; /* SEC_BATTERY_MONITOR_ALARM */ - battery,monitor_initial_count = <0>; - - battery,battery_check_type = <0>; /* SEC_BATTERY_CHECK_NONE */ - - battery,ovp_uvlo_check_type = <3>; /* SEC_BATTERY_OVP_UVLO_CHGPOLLING */ - - battery,temp_check_count = <1>; - - battery,overheatlimit_threshold = <700>; - battery,overheatlimit_recovery = <680>; - battery,wire_warm_overheat_thresh = <500>; - battery,wire_normal_warm_thresh = <420>; - battery,wire_cool1_normal_thresh = <180>; - battery,wire_cool2_cool1_thresh = <150>; - battery,wire_cool3_cool2_thresh = <50>; - battery,wire_cold_cool3_thresh = <0>; - - battery,wire_warm_current = <1734>; /* 0.36C */ - battery,wire_cool1_current = <2700>; /* 0.72C */ - battery,wire_cool2_current = <1157>; /* 0.24C */ - battery,wire_cool3_current = <485>; /* 0.1C */ - - battery,low_temp_topoff = <250>; - battery,high_temp_topoff = <250>; - - battery,low_temp_float = <4380>; - battery,high_temp_float = <4150>; - - battery,full_check_type = <7>; /* SEC_BATTERY_FULLCHARGED_CHGPSY */ - battery,full_check_type_2nd = <7>; /* SEC_BATTERY_FULLCHARGED_CHGPSY */ - battery,full_check_count = <1>; - battery,chg_gpio_full_check = <0>; - - battery,chg_high_temp = <650>; - battery,chg_high_temp_recovery = <630>; - battery,chg_input_limit_current = <1000>; - battery,chg_charging_limit_current = <1400>; - - battery,wpc_temp_control_source = <1>; - battery,wpc_high_temp = <380>; - battery,wpc_high_temp_recovery = <360>; - battery,wpc_input_limit_current = <600>; - battery,wpc_charging_limit_current = <1000>; - battery,wpc_temp_lcd_on_control_source = <1>; - battery,wpc_lcd_on_high_temp = <380>; - battery,wpc_lcd_on_high_temp_rec = <360>; - battery,wpc_lcd_on_input_limit_current = <450>; - - battery,wpc_store_high_temp = <360>; - battery,wpc_store_high_temp_recovery = <340>; - battery,wpc_store_charging_limit_current = <400>; - battery,wpc_store_lcd_on_high_temp = <360>; - battery,wpc_store_lcd_on_high_temp_rec = <300>; - battery,wpc_store_lcd_on_charging_limit_current = <400>; - - battery,sleep_mode_limit_current = <500>; - battery,wc_full_input_limit_current = <100>; - - battery,mix_high_temp = <460>; - battery,mix_high_chg_temp = <500>; - battery,mix_high_temp_recovery = <450>; - - battery,full_condition_type = <9>; - battery,full_condition_soc = <93>; - battery,full_condition_vcell = <4330>; - - battery,recharge_check_count = <1>; - battery,recharge_condition_type = <4>; - battery,recharge_condition_soc = <98>; - battery,recharge_condition_vcell = <4310>; - - battery,charging_total_time = <14400>; - battery,hv_charging_total_time = <10800>; - battery,normal_charging_total_time = <18000>; - battery,usb_charging_total_time = <36000>; - battery,recharging_total_time = <5400>; - battery,charging_reset_time = <0>; - - battery,chg_float_voltage = <4380>; - - battery,pre_afc_work_delay = <2000>; - battery,pre_wc_afc_work_delay = <4000>; - battery,pre_afc_input_current = <500>; - battery,pre_wc_afc_input_current = <500>; - battery,prepare_ta_delay = <0>; /* msec */ - - battery,swelling_high_rechg_voltage = <4000>; - battery,swelling_low_rechg_voltage = <4230>; - - battery,siop_input_limit_current = <1200>; - battery,siop_charging_limit_current = <1000>; - battery,siop_hv_input_limit_current = <700>; - battery,siop_hv_input_limit_current_2nd = <550>; - battery,siop_hv_charging_limit_current = <1000>; - - battery,ttf_hv_charge_current = <2450>; - battery,ttf_dc25_charge_current = <3650>; - - battery,rp_current_rp1 = <500>; - battery,rp_current_rp2 = <1500>; - battery,rp_current_rp3 = <3000>; - battery,rp_current_rdu_rp3 = <2100>; - battery,rp_current_abnormal_rp3 = <1800>; - - battery,pd_charging_charge_power = <15000>; - battery,max_charging_current = <2700>; - - battery,wireless_cc_cv = <85>; - battery,wireless_otg_input_current = <900>; - - /* cycle, chg_float_voltage, recharge_condition_vcell, - * full_condition_vcell, full_condition_soc, step charging condition - */ - battery,age_data = <0 4380 4310 4280 93 - 300 4360 4290 4260 92 - 400 4340 4270 4240 91 - 700 4320 4250 4220 90 - 1000 4270 4200 4170 89>; - - battery,health_condition = < - /* CYCLE ASOC */ - 900 0 /* GOOD */ - 1200 0 /* NORMAL */ - 1500 0 /* AGED */ - >; - - /* step charging option */ - battery,step_charging_type = <0>; - battery,step_charging_charge_power = <12000>; - battery,step_charging_condition = <45 100>; - battery,step_charging_condition_curr = <2700 2700>; - battery,step_charging_current = <2700 2700>; - battery,step_charging_float_voltage = <4150 4380>; - - /* direct step charging option */ - battery,dc_step_chg_type = <0xE9>; - battery,dc_step_chg_charge_power = <22000>; - battery,dc_step_chg_step = <3>; - battery,dc_step_chg_cond_vol = <4100 4230 4380>; /* STEP_CHARGING_CONDITION_VOLTAGE */ - battery,dc_step_chg_cond_iin = <2050 1950 0>; /* STEP_CHARGING_CONDITION_INPUT_CURRENT */ - battery,dc_step_chg_iin_check_cnt = <3>; - battery,dc_step_chg_cond_soc = <20 60 100>; /* STEP_CHARGING_CONDITION_SOC */ - battery,dc_step_chg_val_vfloat = <4100 4230 4380>; /* STEP_CHARGING_CONDITION_FLOAT_VOLTAGE */ - battery,dc_step_chg_val_iout = <5100 4100 3900>; - - battery,standard_curr = <3900>; - battery,expired_time = <10380>; /* 113 + 60 minutes */ - battery,recharging_expired_time = <5400>; - battery,battery_full_capacity = <5000>; - battery,cisd_max_voltage_thr = <5000>; /* batttery ovp dettection voltage */ - - battery,max_input_voltage = <9000>; /* mV */ - battery,max_input_current = <3000>; /* mA */ - - battery,cisd_alg_index = <8>; - battery,ignore_cisd_index = <0 960>; /* Do not use AFC_FAIL to DROP_VALUE */ - battery,ignore_cisd_index_d = <0 120>; /* Do not use AFC_FAIL_PER_DAY to DROP_VALUE_PER_DAY */ - - battery,ttf_capacity = <4300>; - battery,cv_data = < - 2649 871 1350 - 2586 880 1282 - 2400 891 1221 - 2255 900 1157 - 2088 911 1082 - 1951 920 1009 - 1815 930 945 - 1654 941 830 - 1504 950 736 - 1329 961 611 - 1186 970 504 - 1030 991 245 - 903 990 184 - 756 1000 0 - >; - - io-channels = <&pm6150_vadc ADC_AMUX_THM3_PU2>, <&pm6150_vadc ADC_AMUX_THM1_PU2>; - io-channel-names = "adc-temp", "adc-chg-temp"; - }; - - sm5714-fuelgauge { - status = "okay"; - fuelgauge,fuel_alert_soc = <1>; - fuelgauge,capacity_max = <1000>; - fuelgauge,capacity_max_margin = <300>; - fuelgauge,capacity_min = <0>; - fuelgauge,capacity_calculation_type = <0x1F>; - fuelgauge,using_temp_compensation; - fuelgauge,low_temp_limit = <100>; - fuelgauge,using_hw_vempty; - fuelgauge,sw_v_empty_voltage = <3200>; - fuelgauge,sw_v_empty_voltage_cisd = <3100>; - fuelgauge,sw_v_empty_recover_voltage = <3480>; - fuelgauge,capacity = <5000>; - battery_params { - battery,id = <0>; - battery0,battery_type = <4430 0x21B3>; /* batt_v_max, cap */ - battery0,battery_table0 = < - 0x1400 0x1B77 0x1C40 0x1CCB 0x1D31 0x1D6F 0x1D81 0x1D88 - 0x1DA0 0x1DE3 0x1E1F 0x1E45 0x1E5E 0x1E7E 0x1EBC 0x1EFB - 0x1F27 0x1FAF 0x2009 0x209B 0x2103 0x218B 0x227C 0x2400 - >; - battery0,battery_table1 = < - 0x0000 0x0099 0x01B3 0x02CC 0x03E6 0x0500 0x07B3 0x0A80 - 0x0D4C 0x12CC 0x1B19 0x2099 0x2619 0x2B99 0x3133 0x36B3 - 0x3980 0x3F00 0x4480 0x4CCC 0x524C 0x58E6 0x6400 0x6419 - >; - battery0,battery_table2 = < - 0x4B4B 0x4444 0x4040 0x3E3E 0x3C3C 0x3B3B 0x3838 0x3737 - 0x3535 0x3434 0x3434 0x3333 0x3333 0x3333 0x3333 0x3232 - >; - /* spare factor chg_factor dischg_factor manvalue */ - battery0,rs_value = <0xA3 0xA3 0x3800 0x200 0x599 0x599 0x100>; - battery0,v_alarm = <3100 200>; - battery0,topoff = <750>; - battery0,i_cal = <0 0x0 0x0800 0x0800 0 0x0 0x0800 0x081e>; - battery0,v_cal = <1 0x0 0x0 1 0x0 0x0 0x0>; - battery0,temp_std = <25>; - battery0,tem_poff = <3400 50 3250 50>; - battery0,aux_ctrl = <0x322 0x5800>; - battery0,data_ver = <9>; - battery0,v_max_table = <0x227C 0x225F 0x2243 0x2226 0x21D9>; - battery0,q_max_table = <0x21B3 0x210D 0x2068 0x1FC2 0x1E23>; - }; - }; - - /* sec_battery_cable - * 0 UNKNOWN, - * 1 NONE, - * 2 PREPARE_TA, - * 3 TA, - * 4 USB, - * 5 USB_CDP, - * 6 9V_TA, - * 7 9V_ERR, - * 8 9V_UNKNOWN, - * 9 12V_TA, - * 10 WIRELESS, - * 11 HV_WIRELESS, - * 12 PMA_WIRELESS, - * 13 WIRELESS_PACK, - * 14 CABLE_WIRELESS_HV_PACK, - * 15 WIRELESS_STAND, - * 16 WIRELESS_HV_STAND, - * 17 QC20, - * 18 QC30, - * 19 PDIC, - * 20 UARTOFF, - * 21 OTG, - * 22 LAN_HUB, - * 23 POWER_SHARING, - * 24 HMT_CONNECTED, - * 25 HMT_CHARGE, - * 26 HV_TA_CHG_LIMIT, - * 27 WIRELESS_VEHICLE, - * 28 WIRELESS_HV_VEHICLE, - * 29 PREPARE_WIRELESS_HV, - * 30 TIMEOUT, - * 31 SMART_OTG, - * 32 SMART_NOTG, - * 33 WIRELESS_TX, - * 34 HV_WIRELESS_20, - * 35 HV_WIRELESS_20_LIMIT, - * 36 WIRELESS_FAKE, - * 37 PREPARE_WIRELESS_20, - * 38 CABLE_PDIC_APDO, - * 39 CABLE_MAX, - */ - cable-info { - default_input_current = <1800>; - default_charging_current = <2100>; - full_check_current_1st = <750>; - full_check_current_2nd = <250>; - - current_group_1 { - cable_number = <2 19 21 22 23 30>; - input_current = <500>; - charging_current = <500>; - }; - current_group_2 { - cable_number = <25 31>; - input_current = <1000>; - charging_current = <1000>; - }; - current_group_3 { - cable_number = <5 32>; - input_current = <1500>; - charging_current = <1500>; - }; - current_group_4 { - cable_number = <6 7 8 17 18>; - input_current = <1650>; - charging_current = <2700>; - }; - current_group_5 { - cable_number = <9>; - input_current = <1650>; - charging_current = <2400>; - }; - current_group_6 { - cable_number = <10 12 15 27 33 36>; - input_current = <800>; - charging_current = <2400>; - }; - current_group_7 { - cable_number = <13>; - input_current = <700>; - charging_current = <2400>; - }; - current_group_8 { - cable_number = <24>; - input_current = <1000>; - charging_current = <450>; - }; - current_group_9 { - cable_number = <35>; - input_current = <1800>; - charging_current = <1800>; - }; - current_group_10 { - cable_number = <11 14 16 28 35>; - input_current = <650>; - charging_current = <2400>; - }; - current_group_11 { - cable_number = <29 37>; - input_current = <500>; - charging_current = <1200>; - }; - current_group_12 { - cable_number = <1 4>; - input_current = <475>; - charging_current = <550>; - }; - current_group_13 { - cable_number = <34>; - input_current = <1200>; - charging_current = <2400>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-battery-r02.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-battery-r02.dtsi deleted file mode 100755 index aed3ef2ca15c..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-battery-r02.dtsi +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-a72q-battery-common.dtsi" - -&pm6150l_gpios { - dc_thm { /* GPIO_07 */ -dc_thm_default: dc_thm_default { - pins = "gpio7"; - function = "normal"; - bias-high-impedance; - }; - }; -}; - -&pm6150l_vadc { - dc_thm { /* GPIO_07 */ - label = "dc_thm"; - reg = ; - qcom,pre-scaling = <1 1>; - qcom,hw-settle-time = <200>; - qcom,ratiometric; - }; -}; - -&soc { - battery { - pinctrl-0 = <&dc_thm_default>; - - battery,dchg_temp_check_type = <1>; - battery,dchg_thermal_source = <2>; /* SEC_BATTERY_THERMAL_SOURCE_ADC */ - - battery,dchg_temp_table_adc = <2234 2645 3113 3666 4302 5071 5959 - 7013 8170 9433 10885 12446 14145 - 15839 17527 19186 20752 22192 23500 24608 25569 26359 13380>; - battery,dchg_temp_table_data = <900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - - battery,dchg_high_temp = <650>; - battery,dchg_high_temp_recovery = <630>; - battery,dchg_high_batt_temp = <400>; - battery,dchg_high_batt_temp_recovery = <380>; - battery,dchg_input_limit_current = <1000>; - battery,dchg_charging_limit_current = <2000>; - - io-channels = <&pm6150_vadc ADC_AMUX_THM3_PU2>, <&pm6150_vadc ADC_AMUX_THM1_PU2>, <&pm6150l_vadc ADC_GPIO3_PU2>; - io-channel-names = "adc-temp", "adc-chg-temp", "adc-dchg-temp"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-camera-sensor-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-camera-sensor-common.dtsi deleted file mode 100755 index caaba354ee84..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-camera-sensor-common.dtsi +++ /dev/null @@ -1,722 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -&reserved_memory { - -}; - -&soc { - sm5714_flash0: qcom,flash_0 { - label = "flash"; - qcom,led-name = "led:flash_0"; - qcom,max-current = <1500>; - qcom,default-led-trigger = "flash0_trigger"; - qcom,id = <0>; - qcom,current-ma = <1500>; - qcom,duration-ms = <1280>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - qcom,record-current-ma = <225>; - }; - - sm5714_torch0: qcom,torch_0 { - label = "torch"; - qcom,led-name = "led:torch_0"; - qcom,max-current = <500>; - qcom,default-led-trigger = "torch0_trigger"; - qcom,id = <0>; - qcom,current-ma = <300>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - }; - - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - compatible = "qcom,camera-flash"; - flash-source = <&sm5714_flash0>; - torch-source = <&sm5714_torch0>; - switch-source = <&pm6150l_switch2>; - status = "ok"; - }; - - led_flash1: qcom,camera-flash@1 { - cell-index = <1>; - compatible = "qcom,camera-flash"; - flash-source = <&sm5714_flash0>; - torch-source = <&sm5714_torch0>; - switch-source = <&pm6150l_switch2>; - status = "ok"; - }; - - qcom,cam-res-mgr { - compatible = "qcom,cam-res-mgr"; - shared-gpios = <63>; - pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; - status = "ok"; - pinctrl-0 = <&rcam1_sensor_vana_active>; - pinctrl-1 = <&rcam1_sensor_vana_suspend>; - }; -}; - -&qupv3_se7_i2c { - status = "ok"; - - sm5714-fled { - compatible = "siliconmitus,sm5714-fled"; - reg = <0x49>; - status = "okay"; - slave-addr = <0x92>; - flash-en-gpio = <&tlmm 22 0>; - torch-en-gpio = <&tlmm 67 0>; - flash-brightness = <0xF>; //0x0(600mA) ~ 0xF(1350mA) : 50mA Step - preflash-brightness = <0x7>; - torch-brightness = <0x7>; //0x0(50mA) ~ 0x7(225mA) : 25mA Step - factory_current = <0x0>; - timeout = <0xff>; - }; -}; - -&qupv3_se10_i2c { - status = "ok"; - - ois_rear: qcom,ois@62 { - compatible = "qcom,ois"; - cell-index = <0>; - reg = <0x62>; - slave-addr = <0xC4>; - slave-id = <0x460>; - - cam_vaf-supply = <&s2mpb03_l7>; - regulator-names = "cam_vaf"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000>; - rgltr-max-voltage = <2800000>; - rgltr-load-current = <200000>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&mcu_reset_active &mcu_clk_active>; - pinctrl-1 = <&mcu_reset_suspend &mcu_clk_suspend>; - gpio-no-mux = <0>; - gpios = <&tlmm 32 0>, /* RESET */ - <&tlmm 43 0>, /* BOOT0 */ - <&tlmm 63 0>; /* VANA : RCAM1_AVDD_1P8 */ - - gpio-reset = <0>; - gpio-custom1 = <1>; - gpio-vio = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <0 0 0>; - gpio-req-tbl-label = "MCU_RESET0", "MCU_BOOT0", "MCU_VIO"; - status = "ok"; - }; -}; - -&cam_cci0 { - - sensor_rear: qcom,cam-sensor@0 { /* REAR CAM1 - 64MP Wide */ - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - slave-addr = <0x34>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - ois-src = <&ois_rear>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vaf-supply = <&s2mpb03_l7>; - cam_vana-supply = <&s2mpb03_l5>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_clk-supply = <&titan_top_gdsc>; - cam_bob-supply = <&BOB>; - regulator-names = "cam_vio","cam_vaf","cam_vana","cam_vdig","cam_clk", "cam_bob"; - rgltr-cntrl-support; - pwm-switch; - rgltr-min-voltage = <1800000 2800000 2800000 1000000 0 3300000>; - rgltr-max-voltage = <1800000 2900000 2900000 1100000 0 3300000>; - rgltr-load-current = <200000 200000 200000 200000 0 2000000>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active &rcam1_sensor_reset_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend &rcam1_sensor_reset_suspend>; - - gpios = <&tlmm 13 0>, /* MCLK */ - <&tlmm 30 0>, /* RST */ - <&tlmm 63 0>; /* VANA */ - gpio-reset = <1>; - gpio-custom1 = <2>; //Due to multiple analog voltages :: RCAM1_AVDD_1P8 - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_VANA0"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <1>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { /* REAR CAM3 - 12MP UW */ - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - slave-addr = <0x5A>; - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &rcam3_sensor_reset_active &rcam3_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &rcam3_sensor_reset_suspend &rcam3_sensor_vana_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 15 0>, /* MCLK */ - <&tlmm 29 0>, /* RST */ - <&tlmm 65 0>, /* VANA */ - <&tlmm 66 0>; /*MIPI SEL*/ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <19200000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - eeprom2: qcom,eeprom@0x2D { - cell-index = <2>; - compatible = "qcom,eeprom"; - reg = <0x2D>; - slave-addr = <0x5A>; - - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &rcam3_sensor_reset_active &rcam3_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &rcam3_sensor_reset_suspend &rcam3_sensor_vana_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 15 0>, /* MCLK */ - <&tlmm 29 0>, /* RST */ - <&tlmm 65 0>, /* VANA */ - <&tlmm 66 0>; /*MIPI SEL*/ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <19200000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - - }; -}; - -&cam_cci1 { - - qcom,cam-sensor@1 { /* VT 32M */ - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - slave-addr = <0x34>; - csiphy-sd-index = <2>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 1050000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &front_sensor_reset_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &front_sensor_reset_suspend >; - - gpios = <&tlmm 23 0>, /* MCLK */ - <&tlmm 21 0>; /*RST */ - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK4_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { /* VT 32M */ - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - slave-addr = <0x34>; - csiphy-sd-index = <2>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 1050000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &front_sensor_reset_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &front_sensor_reset_suspend >; - - gpios = <&tlmm 23 0>, /* MCLK */ - <&tlmm 21 0>; /*RST */ - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK4_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - sensor_rear_tele: qcom,cam-sensor@3 { /* REAR CAM 2 - 8M Tele */ - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - slave-addr = <0x42>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear_tele>; - eeprom-src = <&eeprom3>; - ois-src = <&ois_rear>; - led-flash-src = <&led_flash1>; - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vaf-supply = <&s2mpb03_l7>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio","cam_vaf","cam_vdig","cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 1100000 0>; - rgltr-max-voltage = <1800000 2800000 1100000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &rcam2_sensor_reset_active &rcam2_sensor_vana_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &rcam2_sensor_reset_suspend &rcam2_sensor_vana_suspend>; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 42 0>, /* RST */ - <&tlmm 64 0>; /* VANA */ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <19200000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <1>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@4 { /* REAR CAM 4 - 5M Macro */ - cell-index = <4>; - compatible = "qcom,cam-sensor"; - reg = <0x4>; - slave-addr = <0x7E>; - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom4>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk4_active &rcam4_sensor_reset_active &rcam4_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk4_suspend &rcam4_sensor_reset_suspend &rcam4_sensor_vana_suspend &cam_mipi_sel_suspend>; - - gpios = <&tlmm 16 0>, /* MCLK */ - <&tlmm 24 0>, /* RESET */ - <&tlmm 74 0>, /* VANA */ - <&tlmm 66 0>; /*MIPI SEL*/ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - eeprom4: qcom,eeprom@0x3F { - cell-index = <4>; - compatible = "qcom,eeprom"; - reg = <0x3F>; - slave-addr = <0x7E>; - i2c-freq-mode = <1>; - - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk4_active &rcam4_sensor_reset_active &rcam4_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk4_suspend &rcam4_sensor_reset_suspend &rcam4_sensor_vana_suspend &cam_mipi_sel_suspend>; - - gpios = <&tlmm 16 0>, // MCLK - <&tlmm 24 0>, // RESET - <&tlmm 74 0>, // VANA - <&tlmm 66 0>; // MIPI SEL - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - -}; - -&qupv3_se9_i2c { - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - slave-addr = <0x18>; - compatible = "i2c_actuator"; - - rgltr-cntrl-support; - cam_vaf-supply = <&s2mpb03_l7>; - regulator-names = "cam_vaf"; - rgltr-min-voltage = <2800000>; - rgltr-max-voltage = <2800000>; - rgltr-load-current = <200000>; - }; - - actuator_rear_tele: qcom,actuator2 { - cell-index = <2>; - compatible = "qcom,actuator"; - reg = <0x1E>; - slave-addr = <0x1E>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vaf-supply = <&s2mpb03_l7>; - regulator-names = "cam_vio", "cam_vaf"; - rgltr-min-voltage = <1800000 2800000>; - rgltr-max-voltage = <1800000 2800000>; - rgltr-load-current = <2000000 200000>; - qcom,cam-power-seq-type = "cam_vio", "cam_vaf"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <1 12>; - cci-master = <1>; - status = "ok"; - }; - - eeprom0: qcom,eeprom@50 { - cell-index = <0>; - reg = <0x50>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&s2mpb03_l7>; - cam_vio-supply = <&s2mpb03_l3>; - - regulator-names = "cam_vaf","cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-mode = <0>; - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom3: qcom,eeprom@55 { - cell-index = <3>; - reg = <0x55>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xAA>; - sensor-mode = <0>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <1 1>; - - cam_vaf-supply = <&s2mpb03_l7>; - cam_vio-supply = <&s2mpb03_l3>; - - regulator-names = "cam_vaf","cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-camera-sensor-r02.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-camera-sensor-r02.dtsi deleted file mode 100755 index b3e5e2d5488b..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-camera-sensor-r02.dtsi +++ /dev/null @@ -1,171 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -&reserved_memory { - -}; - -&s2mpb03_l5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2900000>; -}; - - -&s2mpb03_l7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2900000>; -}; - -&ois_rear { - cam_vdig-supply = <&s2mpb03_l5>; - regulator-names = "cam_vdig"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000>; - rgltr-max-voltage = <2800000>; - rgltr-load-current = <200000>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&mcu_reset_active &mcu_clk_active>; - pinctrl-1 = <&mcu_reset_suspend &mcu_clk_suspend>; - gpio-no-mux = <0>; - gpios = <&tlmm 32 0>, /* RESET */ - <&tlmm 43 0>, /* BOOT0 */ - <&tlmm 63 0>; /* VIO,VAF */ -}; - -&sensor_rear { - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l7>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_bob-supply = <&BOB>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio","cam_vana","cam_vdig","cam_bob" ,"cam_clk"; - rgltr-cntrl-support; - pwm-switch; - rgltr-min-voltage = <1800000 2800000 1000000 3300000 0>; - rgltr-max-voltage = <1800000 2900000 1100000 3300000 0>; - rgltr-load-current = <200000 200000 200000 2000000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active &rcam1_sensor_reset_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend &rcam1_sensor_reset_suspend>; - - gpios = <&tlmm 13 0>, /* MCLK */ - <&tlmm 30 0>, /* RST */ - <&tlmm 63 0>; /* VANA */ -}; - -&sensor_rear_tele { - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio","cam_vdig","cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1100000 0>; - rgltr-max-voltage = <1800000 1100000 0>; - rgltr-load-current = <200000 200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &rcam2_sensor_reset_active &rcam2_sensor_vana_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &rcam2_sensor_reset_suspend &rcam2_sensor_vana_suspend>; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 42 0>, /* RST */ - <&tlmm 64 0>, /* VANA */ - <&tlmm 63 0>; /* VAF */ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-vaf = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2", "CAM_VAF0"; -}; - -&actuator_rear0 { - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <2000000>; - - gpio-no-mux = <0>; - gpios = <&tlmm 63 0>; /* VAF */ - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF0"; -}; - -&actuator_rear_tele { - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <2000000>; - qcom,cam-power-seq-type = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <1>; - - gpio-no-mux = <0>; - gpios = <&tlmm 63 0>; /* VAF */ - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF0"; -}; - -&eeprom0 { - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - gpio-no-mux = <0>; - gpios = <&tlmm 63 0>; /* VAF */ - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF0"; -}; - -&eeprom3 { - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <1>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - gpio-no-mux = <0>; - gpios = <&tlmm 63 0>; /* VAF */ - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF0"; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-display-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-display-r00.dtsi deleted file mode 100755 index 33e86d223523..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-display-r00.dtsi +++ /dev/null @@ -1,178 +0,0 @@ -/* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../../drivers/gpu/drm/msm/samsung_lego/SELF_DISPLAY/self_display_cmd_FC3.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS667YM01/dsi_panel_S6E3FC3_AMS667YM01_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung_lego/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - - -&tlmm { - pmx_sde_te { - sde_te_active: sde_te_active { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_te_suspend: sde_te_suspend { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio8"; - function = "gpio"; - }; - - config { - pins = "gpio8"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio8"; - function = "gpio"; - }; - - config { - pins = "gpio8"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - }; -}; - -&pm6150_gpios { - pmx_sde_ub_det { - sde_ub_det_default: sde_ub_det_default { - pins = "gpio5"; - function = "normal"; - input-enable; - power-source = <1>; - bias-disable; /* No PULL */ - }; - }; -}; - -&soc { - /* A72Q panel */ - ss_dsi_panel_S6E3FC3_AMS667YM01_FHD_display: qcom,dsi-display@9 { - label = "ss_dsi_panel_S6E3FC3_AMS667YM01_FHD"; - qcom,display-type = "primary"; - - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@10 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - - }; -}; - -&sde_dsi { - vci-supply = <&pm6150_l18>; /* 3.0V, VREG_L18A_3P0 */ - vddi-supply = <&pm6150_l13>; /* 1.8V, VREG_L13A_1P8 */ - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_te_active &sde_dsi_active &sde_ub_det_default>; - pinctrl-1 = <&sde_te_suspend &sde_dsi_suspend &sde_ub_det_default>; - qcom,dsi-display-list = - <&ss_dsi_panel_S6E3FC3_AMS667YM01_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; -}; - -&ss_dsi_panel_S6E3FC3_AMS667YM01_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_S6E3FC3_AMS667YM01_FHD>; - - qcom,platform-reset-gpio = <&tlmm 8 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&pm6150_gpios 5 0>; - - /* ESD related */ - qcom,esd-check-enabled; - qcom,mdss-dsi-panel-status-check-mode ="irq_check"; - qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; - samsung,esd-irq-gpio1 = <&tlmm 11 0>; /* EL_ON1_DET */ - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vci"; - qcom,supply-min-voltage = <3000000>; - qcom,supply-max-voltage = <3000000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <0>; - qcom,supply-pre-off-sleep = <0>; - }; - - qcom,panel-supply-entry@1 { - reg = <1>; - qcom,supply-name = "vddi"; - qcom,supply-min-voltage = <1800000>; - qcom,supply-max-voltage = <1800000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <0>; - qcom,supply-pre-off-sleep = <2>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-reset-gpio = <&tlmm 8 0>; -}; - diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-fingerprint-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-fingerprint-r00.dtsi deleted file mode 100755 index a1926d18aadd..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-fingerprint-r00.dtsi +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - et7xx_rst { - et7xx_rst: et7xx_rst { - mux { - pins = "gpio91"; - function = "gpio"; - }; - config { - pins = "gpio91"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; -}; - -&pm6150l_l11 { - regulator-name = "VDD_BTP_3P3"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; -}; - -&qupv3_se6_spi { - status = "okay"; - - etspi,et7xx { - compatible = "etspi,et7xx"; - reg = <0>; - spi-max-frequency = <12500000>; - - pinctrl-names = "default"; - pinctrl-0 = <&et7xx_rst>; - - gpio-controller; - #gpio-cells = <2>; - - etspi-regulator = "VDD_BTP_3P3"; - etspi-sleepPin = <&tlmm 91 0>; - etspi-chipid = "ET713"; - etspi-modelinfo = "A725"; - etspi-position = "12.03,0.00,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; - etspi-rb = "547,-1,-1,FFFFFF"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-hall-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-hall-r00.dtsi deleted file mode 100755 index d70d01f1b36e..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-hall-r00.dtsi +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - hall { - status = "okay"; - compatible = "hall"; - linux,input-type = <1>; - linux,code = <21>; - hall,gpio_flip_cover = <&pm6150_gpios 10 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&hall_default>; - }; - - certify_hall { - status = "okay"; - compatible = "certify_hall"; - linux,input-type = <1>; - linux,code = <27>; - certify_hall,gpio_certify_cover = <&tlmm 93 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&certify_hall_default>; - }; -}; - -&pm6150_gpios { - hall { - hall_default: hall_default { - pins = "gpio10"; - function = "normal"; - output-disable; - input-enable; - bias-disable; - power-source = <0>; - }; - }; -}; - -&tlmm { - certify_hall_default: certify_hall_default { - mux { - pins = "gpio93"; - function = "gpio"; - }; - config { - pins = "gpio93"; - drive-strength = <2>; - input-enable; - bias-disable; - }; - }; -}; - diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-usb-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-usb-r00.dtsi deleted file mode 100755 index 7610fd7bc506..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-usb-r00.dtsi +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&qupv3_se4_i2c { - pinctrl-1 = <&if_pmic_i2c_sleep>; - status = "okay"; - sm5714@49{ - status = "okay"; - compatible = "siliconmitus,sm5714mfd"; - reg = <0x49>; - pinctrl-names = "default"; - pinctrl-0 = <&if_pmic_irq_default>; - sm5714,irq-gpio = <&tlmm 33 0>; - sm5714,wakeup; - }; -}; - -&qupv3_se11_i2c { - pinctrl-1 = <&usbpd_i2c_sleep>; - status = "okay"; - usbpd-sm5714@33 { - status = "okay"; - compatible = "sm5714-usbpd"; - reg = <0x33>; - pinctrl-names = "default"; - pinctrl-0 = <&usbpd_irq_default>; - usbpd,usbpd_int = <&tlmm 104 0>; - support_pd_role_swap; - pdic-manager { - /* sink */ - pdic,max_power = <5000>; - pdic_op_power = <2500>; - pdic_max_voltage = <6000>; - pdic_max_current = <2000>; - pdic,min_current = <500>; - - pdic,giveback = <0>; - pdic,usb_com_capable = <1>; - pdic,no_usb_suspend = <1>; - - /* source */ - source,max_voltage = <5000>; - source,min_voltage = <4000>; - source,max_power = <2500>; - }; - }; -}; - -&tlmm { - if_pmic_irq { - if_pmic_irq_default: if_pmic_irq_default { - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; - }; - - usbpd_irq { - usbpd_irq_default: usbpd_irq_default { - mux { - pins = "gpio104"; - function = "gpio"; - }; - config { - pins = "gpio104"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; - }; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x15 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x47 0x240 /* TUNE1 */ - 0x2b 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x00 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,qusb-phy-host-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x15 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x47 0x240 /* TUNE1 */ - 0x2b 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x00 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-vibrator-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-vibrator-r00.dtsi deleted file mode 100755 index fedce1f96de2..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-a72q-vibrator-r00.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - vibrator: samsung,vibrator { - compatible = "samsung_vib"; - samsung,vib_type = "COINDC"; - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-abc-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-abc-r00.dtsi deleted file mode 100755 index 5a4399c4d094..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-abc-r00.dtsi +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/ { - fragment@abc { - target-path = "/"; - __overlay__ { - sec_abc { - compatible = "samsung,sec_abc"; - status = "okay"; - - gpu { - gpu,label="GPU fault"; - gpu,threshold_count=<4>; - gpu,threshold_time=<1200>; - }; - gpu_page { - gpu_page,label="GPU page fault"; - gpu_page,threshold_count=<20>; - gpu_page,threshold_time=<1200>; - }; - aicl { - aicl,label="battery aicl"; - aicl,threshold_count=<5>; - aicl,threshold_time=<300>; - }; - }; - abc_hub { - compatible = "samsung,abc_hub"; - status = "okay"; - - bootc { - bootc,time_spec_user = <100000>; /* user binary user build */ - bootc,time_spec_eng = <150000>; /* user binary eng build */ - bootc,time_spec_fac = <100000>; /* factory binary */ - }; - }; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-audio-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-audio-common.dtsi deleted file mode 100755 index 3820186f8273..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-audio-common.dtsi +++ /dev/null @@ -1,206 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&aliases { - i2c18 = "/soc/i2c@18"; -}; - -&bolero { - qcom,num-macros = <3>; - imp_list: imp_list { - #list-imp-cells = <3>; - }; -}; - -&wcd938x_codec { - qcom,cdc-micbias2-mv = <2800>; - mbhc-button-thres = <&det_zones 13 63>, - <&det_zones 88 138>, - <&det_zones 138 138>, - <&det_zones 225 225>, - <&det_zones 450 450>, - <&det_zones 620 620>, - <&det_zones 620 620>, - <&det_zones 620 620>; - imp-table = <&imp_list 0 5 6>, - <&imp_list 6 23 8>, - <&imp_list 24 38 7>, - <&imp_list 39 100 6>, - <&imp_list 101 160 10>, - <&imp_list 161 400 11>, - <&imp_list 401 2000 11>, - <&imp_list 2001 0x7fffffff 6>; -}; - -&q6core { - cdc_quin_mi2s_gpios: msm_cdc_pinctrl_quin { - compatible = "qcom,msm-cdc-pinctrl"; - pinctrl-names = "aud_active", "aud_sleep"; - pinctrl-0 = <&lpi_i2s1_sck_active &lpi_i2s1_ws_active - &lpi_i2s1_sd0_active &lpi_i2s1_sd1_active>; - pinctrl-1 = <&lpi_i2s1_sck_sleep &lpi_i2s1_ws_sleep - &lpi_i2s1_sd0_sleep &lpi_i2s1_sd1_sleep>; - qcom,lpi-gpios; - }; -}; - -&soc { - sec-audio-sysfs { - compatible = "samsung,audio-sysfs"; - status = "okay"; - audio,num-amp = <1>; - }; - - samsung_q6audio_adaptation: samsung,q6audio-adaptation { - compatible = "samsung,q6audio-adaptation"; - adaptation,device-tx-port-id = <0xB037>; - adaptation,spk-rx-port-id = <0x1016>; - adaptation,usb-rx-port-id = <0x7000>; - adaptation,bt-rx-port-id = <0x400e>; - adaptation,headset-rx-port-id = <0xB030>; - }; - - det_zones: det_zones { - #list-det-cells = <2>; - }; - - i2c_18: i2c@18 { /* SW I2C */ - status = "ok"; - - cell-index = <18>; - compatible = "i2c-gpio"; - gpios = <&tlmm 88 0 /* sda */ - &tlmm 89 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&tas25xx_gpio_default &fm_lna_default>; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - tas256x:tas256x@4c { - #sound-dai-cells = <0>; - compatible = "ti, tas256x"; - status = "ok"; - reg = <0x4c>; - ti,reset-gpio = <&tlmm 94 0>; - ti,irq-gpio = <&tlmm 90 0>; - ti,left-channel = <0x4c>; - ti,channels = <1>; /* channel number */ - ti,iv-width = <16>; - ti,vbat-mon = <1>; - ti,port_id = <0x1016>; /* Rx port ID use for Qcom platform */ - }; - }; -}; - -&atoll_snd { - qcom,model = "atoll-idp-snd-card"; - qcom,wcn-btfm = <1>; - qcom,ext-disp-audio-rx = <0>; - qcom,mi2s-audio-intf = <1>; - asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>, - <&loopback>, <&compress>, <&hostless>, - <&afe>, <&lsm>, <&routing>, <&compr>, - <&pcm_noirq>, <&samsung_q6audio_adaptation>; - asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", - "msm-pcm-dsp.2", "msm-voip-dsp", - "msm-pcm-voice", "msm-pcm-loopback", - "msm-compress-dsp", "msm-pcm-hostless", - "msm-pcm-afe", "msm-lsm-client", - "msm-pcm-routing", "msm-compr-dsp", - "msm-pcm-dsp-noirq", "q6audio-adaptation"; - qcom,audio-routing = - "AMIC1", "MIC BIAS1", - "MIC BIAS1", "Analog Mic1", - "AMIC2", "MIC BIAS2", - "MIC BIAS2", "Analog Mic2", - "AMIC3", "MIC BIAS3", - "MIC BIAS3", "Analog Mic3", - "AMIC4", "MIC BIAS3", - "MIC BIAS3", "Analog Mic4", - "AMIC5", "MIC BIAS4", - "MIC BIAS4", "Analog Mic5", - "IN1_HPHL", "HPHL_OUT", - "IN2_HPHR", "HPHR_OUT", - "TX SWR_ADC0", "ADC1_OUTPUT", - "TX SWR_ADC1", "ADC2_OUTPUT", - "TX SWR_ADC2", "ADC3_OUTPUT", - "TX SWR_ADC3", "ADC4_OUTPUT", - "RX_TX DEC0_INP", "TX DEC0 MUX", - "RX_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC2_INP", "TX DEC2 MUX", - "RX_TX DEC3_INP", "TX DEC3 MUX", - "VA_AIF1 CAP", "VA_SWR_CLK", - "VA_AIF2 CAP", "VA_SWR_CLK", - "VA_AIF3 CAP", "VA_SWR_CLK", - "VA SWR_ADC0", "ADC1_OUTPUT", - "VA SWR_ADC1", "ADC2_OUTPUT", - "VA SWR_ADC2", "ADC3_OUTPUT", - "VA SWR_ADC3", "ADC4_OUTPUT"; - - qcom,msm-mbhc-hs-mic-max-threshold-mv = <9999>; - qcom,msm-mbhc-hs-mic-min-threshold-mv = <640>; - qcom,msm-mbhc-gnd-swh = <0>; - qcom,cdc-dmic01-gpios = <>; - qcom,cdc-dmic23-gpios = <>; - qcom,cdc-dmic45-gpios = <>; - qcom,quin-mi2s-gpios = <&cdc_quin_mi2s_gpios>; - asoc-codec = <&stub_codec>, <&bolero>; - asoc-codec-names = "msm-stub-codec.1", "bolero_codec"; - qcom,wsa-max-devs = <0>; - qcom,wsa-devs = <0>; - qcom,msm_audio_ssr_devs = <&audio_apr>, <&q6core>, - <&lpi_tlmm>, <&bolero>; - fsa4480-i2c-handle = <>; - qcom,fm-lna-gpios = <&tlmm 84 0>; -}; - -&fsa4480 { - status = "disabled"; -}; -&wsa_swr_gpios { - status = "disabled"; -}; -&wsa_spkr_en1 { - status = "disabled"; -}; -&wsa_spkr_en2 { - status = "disabled"; -}; -&wsa881x_0211 { - status = "disabled"; -}; -&wsa881x_0212 { - status = "disabled"; -}; -&wsa881x_0213 { - status = "disabled"; -}; -&wsa881x_0214 { - status = "disabled"; -}; -&cdc_dmic01_gpios { - status = "disabled"; -}; -&cdc_dmic23_gpios { - status = "disabled"; -}; -&cdc_dmic45_gpios { - status = "disabled"; -}; -&wsa_swr_gpios { - status = "disabled"; -}; -&wsa_macro { - status = "disabled"; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-audio-pinctrl-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-audio-pinctrl-common.dtsi deleted file mode 100755 index a16be80762af..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-audio-pinctrl-common.dtsi +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - tas25xx_gpio_default: tas25xx_gpio_default { - mux { - pins = "gpio88", "gpio89", "gpio90", "gpio94"; - function = "gpio"; - }; - config { - pins = "gpio88", "gpio89", "gpio90", "gpio94"; - bias-disable; /* No PULL */ - }; - }; - - fm_lna_default: fm_lna_default { - mux { - pins = "gpio84"; - function = "gpio"; - }; - config { - pins = "gpio84"; - bias-disable; /* No PULL */ - output-low; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-battery-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-battery-common.dtsi deleted file mode 100755 index 1296c02934d9..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-battery-common.dtsi +++ /dev/null @@ -1,515 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&qupv3_se4_i2c { - status = "okay"; - sm5440@63{ - status = "okay"; - compatible = "siliconmitus,sm5440"; - reg = <0x63>; - pinctrl-names = "default"; - - }; -}; - -&pm6150_vadc { - bat_thm { /* AMUX_3 */ - label = "bat_thm"; - reg = ; - qcom,pre-scaling = <1 1>; - qcom,hw-settle-time = <200>; - qcom,ratiometric; - }; - chg_thm { /* AMUX_1 */ - label = "chg_thm"; - reg = ; - qcom,pre-scaling = <1 1>; - qcom,hw-settle-time = <200>; - qcom,ratiometric; - }; -}; - -&soc { - - sec-direct-charger { - status = "okay"; - compatible = "samsung,sec-direct-charger"; - - charger,battery_name = "battery"; - charger,main_charger = "sm5714-charger"; - charger,direct_charger = "sm5440-charger"; - - charger,dchg_min_current = <2000>; - charger,dchg_temp_low_threshold = <180>; - charger,dchg_temp_high_threshold = <420>; - - }; - - battery { - pinctrl-names = "default"; - - battery,chip_vendor = "QCOM"; - status = "okay"; - compatible = "samsung,sec-battery"; - battery,vendor = "Battery"; - battery,charger_name = "sec-direct-charger"; - battery,fuelgauge_name = "sm5714-fuelgauge"; - battery,fgsrc_switch_name = "sm5714-fuelgauge"; /* Fuelgauge voltage source */ - battery,technology = <2>; /* POWER_SUPPLY_TECHNOLOGY_LION */ - - battery,batt_data_version = <1>; - - battery,temp_adc_type = <1>; /* SEC_BATTERY_ADC_TYPE_AP */ - battery,temp_channel_raw = <1>; /* ADC_TEMP_CHANNEL_RAW */ - battery,adc_check_count = <5>; - battery,temp_check_type = <1>; - battery,chg_temp_check_type = <1>; - - battery,thermal_source = <2>; /* SEC_BATTERY_THERMAL_SOURCE_ADC */ - battery,chg_thermal_source = <2>; /* SEC_BATTERY_THERMAL_SOURCE_ADC */ - - battery,temp_table_adc = <2453 2872 3359 3926 4589 5313 6237 - 7287 8486 9775 11135 12659 14316 - 15939 17586 19166 20643 21991 23237 24313 25235 26017 26642>; - battery,temp_table_data = <900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - battery,chg_temp_table_adc = <1820 2174 2587 3056 3614 4233 5023 - 5950 7018 8183 9450 10902 12530 - 14160 15870 17555 19181 20710 22144 23412 24537 25505 26295>; - battery,chg_temp_table_data = <900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - - battery,polling_time = <10 30 30 30 3600>; - - battery,cable_check_type = <4>; /* SEC_BATTERY_CABLE_CHECK_PSY */ - battery,cable_source_type = <1>; - battery,polling_type = <1>; /* SEC_BATTERY_MONITOR_ALARM */ - battery,monitor_initial_count = <0>; - - battery,battery_check_type = <0>; /* SEC_BATTERY_CHECK_NONE */ - - battery,ovp_uvlo_check_type = <3>; /* SEC_BATTERY_OVP_UVLO_CHGPOLLING */ - - battery,temp_check_count = <1>; - - battery,overheatlimit_threshold = <700>; - battery,overheatlimit_recovery = <680>; - battery,wire_warm_overheat_thresh = <500>; - battery,wire_normal_warm_thresh = <420>; - battery,wire_cool1_normal_thresh = <180>; - battery,wire_cool2_cool1_thresh = <150>; - battery,wire_cool3_cool2_thresh = <50>; - battery,wire_cold_cool3_thresh = <0>; - - battery,wire_warm_current = <2093>; /* 0.36C */ - battery,wire_cool1_current = <3600>; /* 0.61C */ - battery,wire_cool2_current = <1390>; /* 0.24C */ - battery,wire_cool3_current = <578>; /* 0.1C */ - - battery,low_temp_topoff = <300>; - battery,high_temp_topoff = <300>; - battery,low_temp_float = <4380>; - battery,high_temp_float = <4150>; - - battery,full_check_type = <7>; /* SEC_BATTERY_FULLCHARGED_CHGPSY */ - battery,full_check_type_2nd = <7>; /* SEC_BATTERY_FULLCHARGED_CHGPSY */ - battery,full_check_count = <1>; - battery,chg_gpio_full_check = <0>; - - battery,chg_high_temp = <500>; - battery,chg_high_temp_recovery = <480>; - battery,chg_input_limit_current = <1000>; - battery,chg_charging_limit_current = <1400>; - - battery,wpc_temp_control_source = <1>; - battery,wpc_high_temp = <380>; - battery,wpc_high_temp_recovery = <360>; - battery,wpc_input_limit_current = <600>; - battery,wpc_charging_limit_current = <1000>; - battery,wpc_temp_lcd_on_control_source = <1>; - battery,wpc_lcd_on_high_temp = <380>; - battery,wpc_lcd_on_high_temp_rec = <360>; - battery,wpc_lcd_on_input_limit_current = <450>; - - battery,wpc_store_high_temp = <360>; - battery,wpc_store_high_temp_recovery = <340>; - battery,wpc_store_charging_limit_current = <400>; - battery,wpc_store_lcd_on_high_temp = <360>; - battery,wpc_store_lcd_on_high_temp_rec = <300>; - battery,wpc_store_lcd_on_charging_limit_current = <400>; - - battery,sleep_mode_limit_current = <500>; - battery,wc_full_input_limit_current = <100>; - - battery,mix_high_temp = <420>; - battery,mix_high_chg_temp = <500>; - battery,mix_high_temp_recovery = <390>; - - battery,full_condition_type = <9>; - battery,full_condition_soc = <93>; - battery,full_condition_vcell = <4330>; - - battery,recharge_check_count = <1>; - battery,recharge_condition_type = <4>; - battery,recharge_condition_soc = <98>; - battery,recharge_condition_vcell = <4310>; - - battery,charging_total_time = <14400>; - battery,hv_charging_total_time = <10800>; - battery,normal_charging_total_time = <18000>; - battery,usb_charging_total_time = <36000>; - battery,recharging_total_time = <5400>; - battery,charging_reset_time = <0>; - - battery,chg_float_voltage = <4380>; - - battery,pre_afc_work_delay = <2000>; - battery,pre_wc_afc_work_delay = <4000>; - battery,pre_afc_input_current = <500>; - battery,pre_wc_afc_input_current = <500>; - battery,prepare_ta_delay = <0>; /* msec */ - - battery,swelling_high_rechg_voltage = <4030>; - battery,swelling_low_rechg_voltage = <4230>; - - battery,siop_input_limit_current = <1200>; - battery,siop_charging_limit_current = <1000>; - battery,siop_hv_input_limit_current = <700>; - battery,siop_hv_input_limit_current_2nd = <550>; - battery,siop_hv_charging_limit_current = <1000>; - battery,siop_level_20_power = <4500>; - - battery,ttf_hv_charge_current = <2450>; - battery,ttf_dc25_charge_current = <3650>; - - battery,rp_current_rp1 = <500>; - battery,rp_current_rp2 = <1500>; - battery,rp_current_rp3 = <3000>; - battery,rp_current_rdu_rp3 = <2100>; - battery,rp_current_abnormal_rp3 = <1800>; - - battery,pd_charging_charge_power = <15000>; - battery,max_charging_current = <3600>; - - battery,wireless_cc_cv = <85>; - battery,wireless_otg_input_current = <900>; - - /* cycle, chg_float_voltage, recharge_condition_vcell, - * full_condition_vcell, full_condition_soc, step charging condition - */ - battery,age_data = <0 4380 4310 4280 93 - 300 4360 4290 4260 92 - 400 4340 4270 4240 91 - 700 4320 4250 4220 90 - 1000 4270 4200 4170 89>; - - battery,health_condition = < - /* CYCLE ASOC */ - 900 0 /* GOOD */ - 1200 0 /* NORMAL */ - 1500 0 /* AGED */ - >; - - /* step charging option */ - battery,step_charging_type = <0>; - battery,step_charging_charge_power = <12000>; - battery,step_charging_condition = <45 100>; - battery,step_charging_condition_curr = <2500 2500>; - battery,step_charging_current = <2500 2500>; - battery,step_charging_float_voltage = <3150 4380>; - - /* direct step charging option */ - battery,dc_step_chg_type = <0xE9>; - battery,dc_step_chg_charge_power = <22000>; - battery,dc_step_chg_step = <3>; - battery,dc_step_chg_cond_vol = <4090 4230 4380>; /* STEP_CHARGING_CONDITION_VOLTAGE */ - battery,dc_step_chg_cond_iin = <2050 1800 0>; /* STEP_CHARGING_CONDITION_INPUT_CURRENT */ - battery,dc_step_chg_iin_check_cnt = <3>; - battery,dc_step_chg_cond_soc = <12 50 100>; /* STEP_CHARGING_CONDITION_SOC */ - battery,dc_step_chg_val_vfloat = <4090 4230 4380>; /* STEP_CHARGING_CONDITION_FLOAT_VOLTAGE */ - battery,dc_step_chg_val_iout = <4800 4100 3600>; - battery,standard_curr = <3600>; - battery,expired_time = <11100>; /* 125 + 60 minutes */ - battery,recharging_expired_time = <5400>; - battery,battery_full_capacity = <5000>; - battery,cisd_max_voltage_thr = <5000>; /* batttery ovp dettection voltage */ - - battery,max_input_voltage = <9000>; /* mV */ - battery,max_input_current = <3000>; /* mA */ - - battery,cisd_alg_index = <8>; - battery,ignore_cisd_index = <0 960>; /* Do not use AFC_FAIL to DROP_VALUE */ - battery,ignore_cisd_index_d = <0 120>; /* Do not use AFC_FAIL_PER_DAY to DROP_VALUE_PER_DAY */ - - battery,ttf_capacity = <3300>; - battery,cv_data = < - 2488 809 1809 - 2409 812 1796 - 2327 817 1769 - 2272 820 1743 - 2182 826 1721 - 2104 830 1690 - 2038 834 1670 - 1950 839 1640 - 1904 841 1622 - 1838 845 1594 - 1797 847 1576 - 1749 850 1560 - 1683 853 1531 - 1660 855 1525 - 1653 856 1515 - 1615 858 1512 - 1580 860 1509 - 1553 861 1502 - 1544 862 1483 - 1520 863 1463 - 1477 866 1458 - 1431 868 1451 - 1396 871 1424 - 1347 874 1409 - 1299 876 1383 - 1267 878 1361 - 1231 882 1332 - 1202 884 1315 - 1148 886 1288 - 1109 889 1263 - 1067 891 1243 - 1031 894 1213 - 1013 895 1185 - 975 897 1156 - 961 899 1140 - 921 901 1111 - 892 903 1084 - 887 903 1064 - 863 905 1038 - 833 907 1019 - 808 909 1004 - 787 910 976 - 764 912 946 - 744 914 918 - 730 915 904 - 715 916 895 - 693 917 864 - 681 918 846 - 666 920 828 - 651 921 800 - 640 922 783 - 628 925 752 - 622 926 735 - 618 927 712 - 600 930 697 - 596 931 679 - 584 933 664 - 576 936 646 - 577 937 627 - 562 938 614 - 511 948 601 - 505 949 572 - 493 951 553 - 492 952 535 - 484 953 506 - 480 955 487 - 474 956 464 - 462 957 435 - 456 958 417 - 452 959 398 - 446 961 380 - 437 962 364 - 429 964 355 - 423 965 336 - 422 966 329 - 414 967 303 - 411 968 282 - 405 969 255 - 397 970 242 - 391 971 229 - 387 972 211 - 384 973 199 - 372 975 191 - 364 977 171 - 356 978 140 - 350 981 126 - 340 985 107 - 335 988 84 - 327 991 54 - 320 995 26 - 313 998 13 - 0 1000 0 - >; - - io-channels = <&pm6150_vadc ADC_AMUX_THM3_PU2>, <&pm6150_vadc ADC_AMUX_THM1_PU2>; - io-channel-names = "adc-temp", "adc-chg-temp"; - }; - - sm5714-fuelgauge { - status = "okay"; - fuelgauge,fuel_alert_soc = <1>; - fuelgauge,capacity_max = <1000>; - fuelgauge,capacity_max_margin = <300>; - fuelgauge,capacity_min = <0>; - fuelgauge,capacity_calculation_type = <0x1F>; - fuelgauge,using_temp_compensation; - fuelgauge,low_temp_limit = <100>; - fuelgauge,using_hw_vempty; - fuelgauge,sw_v_empty_voltage = <3200>; - fuelgauge,sw_v_empty_voltage_cisd = <3100>; - fuelgauge,sw_v_empty_recover_voltage = <3480>; - fuelgauge,capacity = <5000>; - battery_params { - battery,id = <0>; - battery0,battery_type = <4400 0x2A4B>; /* batt_v_max, cap */ - battery0,battery_table0 = < - 0x1400 0x1AD0 0x1BD5 0x1C79 0x1D64 0x1D88 0x1D8F 0x1DA3 - 0x1DC7 0x1DFD 0x1E29 0x1E57 0x1E74 0x1EAD 0x1EDF 0x1F1F - 0x1F67 0x1FBE 0x201F 0x2087 0x20F8 0x2168 0x2278 0x2400 - >; - battery0,battery_table1 = < - 0x0 0x19 0x133 0x266 0x533 0x819 0xAE6 0xDB3 - 0x1099 0x1633 0x1BE6 0x2199 0x274C 0x2FCC 0x3580 0x3B19 - 0x3E00 0x40CC 0x4680 0x4C33 0x51CC 0x5780 0x6400 0x6419 - >; - battery0,battery_table2 = < - 0x4B4B 0x4444 0x4040 0x3E3E 0x3C3C 0x3B3B 0x3838 0x3737 - 0x3535 0x3434 0x3434 0x3333 0x3333 0x3333 0x3333 0x3232 - >; - /* spare factor chg_factor dischg_factor manvalue */ - battery0,rs_value = <0x0 0x30 0x3800 0x266 0x599 0x599 0x30>; - battery0,v_alarm = <3100 200>; - battery0,topoff = <600>; - battery0,i_cal = <1 0x0 0x0800 0x0800 0 0x0 0x07FC 0x0830>; - battery0,v_cal = <1 0x0 0x0 1 0x0 0x0 0x0>; - battery0,temp_std = <25>; - battery0,tem_poff = <3400 50 3250 50>; - battery0,aux_ctrl = <0x322 0x5800>; - battery0,data_ver = <2>; - battery0,v_max_table = <0x2278 0x2259 0x223A 0x221B 0x21C7>; - battery0,q_max_table = <0x2A4B 0x2998 0x28E5 0x2832 0x2673>; - }; - }; - - /* sec_battery_cable - * 0 UNKNOWN, - * 1 NONE, - * 2 PREPARE_TA, - * 3 TA, - * 4 USB, - * 5 USB_CDP, - * 6 9V_TA, - * 7 9V_ERR, - * 8 9V_UNKNOWN, - * 9 12V_TA, - * 10 WIRELESS, - * 11 HV_WIRELESS, - * 12 PMA_WIRELESS, - * 13 WIRELESS_PACK, - * 14 CABLE_WIRELESS_HV_PACK, - * 15 WIRELESS_STAND, - * 16 WIRELESS_HV_STAND, - * 17 QC20, - * 18 QC30, - * 19 PDIC, - * 20 UARTOFF, - * 21 OTG, - * 22 LAN_HUB, - * 23 POWER_SHARING, - * 24 HMT_CONNECTED, - * 25 HMT_CHARGE, - * 26 HV_TA_CHG_LIMIT, - * 27 WIRELESS_VEHICLE, - * 28 WIRELESS_HV_VEHICLE, - * 29 PREPARE_WIRELESS_HV, - * 30 TIMEOUT, - * 31 SMART_OTG, - * 32 SMART_NOTG, - * 33 WIRELESS_TX, - * 34 HV_WIRELESS_20, - * 35 HV_WIRELESS_20_LIMIT, - * 36 WIRELESS_FAKE, - * 37 PREPARE_WIRELESS_20, - * 38 CABLE_PDIC_APDO, - * 39 CABLE_MAX, - */ - cable-info { - default_input_current = <1800>; - default_charging_current = <2100>; - full_check_current_1st = <850>; - full_check_current_2nd = <300>; - - current_group_1 { - cable_number = <2 19 21 22 23 30>; - input_current = <500>; - charging_current = <500>; - }; - current_group_2 { - cable_number = <25 31>; - input_current = <1000>; - charging_current = <1000>; - }; - current_group_3 { - cable_number = <5 32>; - input_current = <1500>; - charging_current = <1500>; - }; - current_group_4 { - cable_number = <6 7 8 17 18>; - input_current = <1650>; - charging_current = <3600>; - }; - current_group_5 { - cable_number = <9>; - input_current = <1650>; - charging_current = <2400>; - }; - current_group_6 { - cable_number = <10 12 15 27 33 36>; - input_current = <800>; - charging_current = <2400>; - }; - current_group_7 { - cable_number = <13>; - input_current = <700>; - charging_current = <2400>; - }; - current_group_8 { - cable_number = <24>; - input_current = <1000>; - charging_current = <450>; - }; - current_group_9 { - cable_number = <35>; - input_current = <1800>; - charging_current = <1800>; - }; - current_group_10 { - cable_number = <11 14 16 28 35>; - input_current = <650>; - charging_current = <2400>; - }; - current_group_11 { - cable_number = <29 37>; - input_current = <500>; - charging_current = <1200>; - }; - current_group_12 { - cable_number = <1 4>; - input_current = <475>; - charging_current = <550>; - }; - current_group_13 { - cable_number = <34>; - input_current = <1200>; - charging_current = <2400>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-battery-r02.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-battery-r02.dtsi deleted file mode 100755 index cf7990362589..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-battery-r02.dtsi +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "atoll-sec-m42q-battery-common.dtsi" - -&pm6150l_gpios { - dc_thm { /* GPIO_07 */ -dc_thm_default: dc_thm_default { - pins = "gpio7"; - function = "normal"; - bias-high-impedance; - }; - }; -}; - -&pm6150l_vadc { - dc_thm { /* GPIO_07 */ - label = "dc_thm"; - reg = ; - qcom,pre-scaling = <1 1>; - qcom,hw-settle-time = <200>; - qcom,ratiometric; - }; -}; - -&soc { - battery { - pinctrl-0 = <&dc_thm_default>; - - battery,dchg_temp_check_type = <1>; - battery,dchg_thermal_source = <2>; /* SEC_BATTERY_THERMAL_SOURCE_ADC */ - - battery,dchg_temp_table_adc = <2184 2586 3058 3608 4222 5007 5924 - 6982 8141 9407 10845 12470 14093 - 15799 17488 19115 20649 22088 23370 24499 25472 26268 27076>; - battery,dchg_temp_table_data = <900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - - battery,dchg_high_temp = <650>; - battery,dchg_high_temp_recovery = <630>; - battery,dchg_high_batt_temp = <400>; - battery,dchg_high_batt_temp_recovery = <380>; - battery,dchg_input_limit_current = <1000>; - battery,dchg_charging_limit_current = <2000>; - - io-channels = <&pm6150_vadc ADC_AMUX_THM3_PU2>, <&pm6150_vadc ADC_AMUX_THM1_PU2>, <&pm6150l_vadc ADC_GPIO3_PU2>; - io-channel-names = "adc-temp", "adc-chg-temp", "adc-dchg-temp"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-common.dtsi deleted file mode 100755 index da06269848c6..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-common.dtsi +++ /dev/null @@ -1,705 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -&reserved_memory { - -}; - -&soc { - sm5714_flash0: qcom,flash_0 { - label = "flash"; - qcom,led-name = "led:flash_0"; - qcom,max-current = <1500>; - qcom,default-led-trigger = "flash0_trigger"; - qcom,id = <0>; - qcom,current-ma = <1500>; - qcom,duration-ms = <1280>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - qcom,record-current-ma = <300>; - }; - - sm5714_torch0: qcom,torch_0 { - label = "torch"; - qcom,led-name = "led:torch_0"; - qcom,max-current = <500>; - qcom,default-led-trigger = "torch0_trigger"; - qcom,id = <0>; - qcom,current-ma = <300>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - }; - - led_flash_rear: qcom,camera-flash@0 { - cell-index = <0>; - compatible = "qcom,camera-flash"; - flash-source = <&sm5714_flash0>; - torch-source = <&sm5714_torch0>; - switch-source = <&pm6150l_switch2>; - status = "ok"; - }; - -}; - -&qupv3_se7_i2c { - status = "ok"; - - sm5714-fled { - compatible = "siliconmitus,sm5714-fled"; - reg = <0x49>; - status = "okay"; - slave-addr = <0x92>; - flash-en-gpio = <&tlmm 22 0>; - torch-en-gpio = <&tlmm 67 0>; - flash-brightness = <0xF>; //0x0(600mA) ~ 0xF(1350mA) : 50mA Step - preflash-brightness = <0x7>; - torch-brightness = <0x7>; //0x0(50mA) ~ 0x7(225mA) : 25mA Step - factory_current = <0x0>; //0x0(300mA) - timeout = <0xff>; - }; -}; - -&cam_cci0 { - - qcom,cam-sensor@0 { /* REAR CAM1 - 64MP Wide */ - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - slave-addr = <0x5A>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash_rear>; - eeprom-src = <&eeprom0>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vaf-supply = <&s2mpb03_l7>; - cam_vana-supply = <&s2mpb03_l5>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio","cam_vaf","cam_vana","cam_vdig","cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 2800000 1050000 0>; - rgltr-max-voltage = <1800000 2800000 2800000 1050000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active &rcam1_sensor_reset_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend &rcam1_sensor_reset_suspend>; - - gpios = <&tlmm 13 0>, /* MCLK */ - <&tlmm 30 0>; /* RST */ - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <19200000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { /* REAR CAM3 - 12MP UW */ - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - slave-addr = <0x5A>; - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - led-flash-src = <&led_flash_rear>; - - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &rcam3_sensor_reset_active - &rcam3_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &rcam3_sensor_reset_suspend - &rcam3_sensor_vana_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 15 0>, /* MCLK */ - <&tlmm 29 0>, /* RST */ - <&tlmm 65 0>, /* VANA */ - <&tlmm 66 0>; /* MIPI SEL */ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <19200000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - eeprom2: qcom,eeprom@0x2D { - cell-index = <2>; - compatible = "qcom,eeprom"; - reg = <0x2D>; - slave-addr = <0x5A>; - - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &rcam3_sensor_reset_active &rcam3_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &rcam3_sensor_reset_suspend &rcam3_sensor_vana_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 15 0>, /* MCLK */ - <&tlmm 29 0>, /* RST */ - <&tlmm 65 0>, /* VANA */ - <&tlmm 66 0>; /*MIPI SEL*/ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <19200000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - eeprom3: qcom,eeprom@37 { - cell-index = <3>; - compatible = "qcom,eeprom"; - reg = <0x37>; - slave-addr = <0x6E>; - i2c-freq-mode = <1>; - - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &rcam2_sensor_reset_active &rcam2_sensor_vana_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &rcam2_sensor_reset_suspend &rcam2_sensor_vana_suspend>; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 42 0>, /* RST */ - <&tlmm 64 0>; /* VANA */ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - -}; - -&cam_cci1 { - - qcom,cam-res-mgr { - compatible = "qcom,cam-res-mgr"; - shared-gpios = <64>; - pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; - status = "ok"; - pinctrl-0 = <&rcam2_sensor_vana_active>; - pinctrl-1 = <&rcam2_sensor_vana_suspend>; - }; - - qcom,cam-sensor@1 { /* VT 32M */ - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - slave-addr = <0x34>; - csiphy-sd-index = <2>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1050000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &front_sensor_reset_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &front_sensor_reset_suspend >; - - gpios = <&tlmm 23 0>, /* MCLK */ - <&tlmm 21 0>; /*RST */ - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK4_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { /* VT 32M */ - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - slave-addr = <0x34>; - csiphy-sd-index = <2>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1050000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &front_sensor_reset_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &front_sensor_reset_suspend >; - - gpios = <&tlmm 23 0>, /* MCLK */ - <&tlmm 21 0>; /*RST */ - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK4_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { /* REAR CAM 2 - 5M Bokeh */ - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - slave-addr = <0x6E>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &rcam2_sensor_reset_active &rcam2_sensor_vana_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &rcam2_sensor_reset_suspend &rcam2_sensor_vana_suspend>; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 42 0>, /* RST */ - <&tlmm 64 0>; /* VANA */ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@4 { /* REAR CAM 4 - 5M Macro */ - cell-index = <4>; - compatible = "qcom,cam-sensor"; - reg = <0x4>; - slave-addr = <0x7E>; - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - led-flash-src = <&led_flash_rear>; - eeprom-src = <&eeprom4>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk4_active &rcam4_sensor_reset_active - &rcam2_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk4_suspend &rcam4_sensor_reset_suspend - &rcam2_sensor_vana_suspend &cam_mipi_sel_suspend>; - - gpios = <&tlmm 16 0>, /* MCLK */ - <&tlmm 24 0>, /* RESET */ - <&tlmm 64 0>, /* VANA */ - <&tlmm 66 0>; /*MIPI SEL*/ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - eeprom4: qcom,eeprom@0x3F { - cell-index = <4>; - compatible = "qcom,eeprom"; - reg = <0x3F>; - slave-addr = <0x7E>; - i2c-freq-mode = <1>; - - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk4_active &rcam4_sensor_reset_active &rcam2_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk4_suspend &rcam4_sensor_reset_suspend &rcam2_sensor_vana_suspend &cam_mipi_sel_suspend>; - - gpios = <&tlmm 16 0>, // MCLK - <&tlmm 24 0>, // RESET - <&tlmm 64 0>, // VANA - <&tlmm 66 0>; // MIPI SEL - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - -}; - -&qupv3_se9_i2c { - - eeprom0: qcom,eeprom@58 { - cell-index = <0>; - reg = <0x58>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&s2mpb03_l7>; - cam_vio-supply = <&s2mpb03_l3>; - - regulator-names = "cam_vaf","cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - slave-addr = <0x18>; - compatible = "i2c_actuator"; - - rgltr-cntrl-support; - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&s2mpb03_l7>; - cam_vio-supply = <&s2mpb03_l3>; - - regulator-names = "cam_vaf","cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-mode = <0>; - sensor-position = <1>; - rgltr-cntrl-support; - }; - -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-r00.dtsi deleted file mode 100755 index 2fd45d523dee..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-r00.dtsi +++ /dev/null @@ -1,694 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -&reserved_memory { - -}; - -&soc { - sm5714_flash0: qcom,flash_0 { - label = "flash"; - qcom,led-name = "led:flash_0"; - qcom,max-current = <1500>; - qcom,default-led-trigger = "flash0_trigger"; - qcom,id = <0>; - qcom,current-ma = <1500>; - qcom,duration-ms = <1280>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - qcom,record-current-ma = <300>; - }; - - sm5714_torch0: qcom,torch_0 { - label = "torch"; - qcom,led-name = "led:torch_0"; - qcom,max-current = <500>; - qcom,default-led-trigger = "torch0_trigger"; - qcom,id = <0>; - qcom,current-ma = <300>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - }; - - led_flash_rear: qcom,camera-flash@0 { - cell-index = <0>; - compatible = "qcom,camera-flash"; - flash-source = <&sm5714_flash0>; - torch-source = <&sm5714_torch0>; - switch-source = <&pm6150l_switch2>; - status = "ok"; - }; - -}; - -&qupv3_se7_i2c { - status = "ok"; - - sm5714-fled { - compatible = "siliconmitus,sm5714-fled"; - reg = <0x49>; - status = "okay"; - slave-addr = <0x92>; - flash-en-gpio = <&tlmm 22 0>; - torch-en-gpio = <&tlmm 67 0>; - flash-brightness = <0xF>; //0x0(600mA) ~ 0xF(1350mA) : 50mA Step - preflash-brightness = <0x7>; - torch-brightness = <0x7>; //0x0(50mA) ~ 0x7(225mA) : 25mA Step - factory_current = <0x0>; //0x0(300mA) - timeout = <0xff>; - }; -}; - -&cam_cci0 { - - qcom,cam-sensor@0 { /* REAR CAM1 - 64MP Wide */ - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - slave-addr = <0x5A>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash_rear>; - eeprom-src = <&eeprom0>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vaf-supply = <&s2mpb03_l7>; - cam_vana-supply = <&s2mpb03_l5>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio","cam_vaf","cam_vana","cam_vdig","cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 2800000 1050000 0>; - rgltr-max-voltage = <1800000 2800000 2800000 1050000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active &rcam1_sensor_reset_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend &rcam1_sensor_reset_suspend>; - - gpios = <&tlmm 13 0>, /* MCLK */ - <&tlmm 30 0>; /* RST */ - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <19200000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - sensor_rear_uw: qcom,cam-sensor@2 { /* REAR CAM3 - 12MP UW */ - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - slave-addr = <0x5A>; - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - led-flash-src = <&led_flash_rear>; - - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &rcam3_sensor_reset_active - &rcam3_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &rcam3_sensor_reset_suspend - &rcam3_sensor_vana_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 15 0>, /* MCLK */ - <&tlmm 29 0>, /* RST */ - <&tlmm 65 0>, /* VANA */ - <&tlmm 66 0>; /* MIPI SEL */ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <19200000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - eeprom2: qcom,eeprom@0x2D { - cell-index = <2>; - compatible = "qcom,eeprom"; - reg = <0x2D>; - slave-addr = <0x5A>; - - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &rcam3_sensor_reset_active &rcam3_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &rcam3_sensor_reset_suspend &rcam3_sensor_vana_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 15 0>, /* MCLK */ - <&tlmm 29 0>, /* RST */ - <&tlmm 65 0>, /* VANA */ - <&tlmm 66 0>; /*MIPI SEL*/ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA3", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <19200000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - eeprom3: qcom,eeprom@37 { - cell-index = <3>; - compatible = "qcom,eeprom"; - reg = <0x37>; - slave-addr = <0x6E>; - i2c-freq-mode = <1>; - - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &rcam2_sensor_reset_active &rcam2_sensor_vana_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &rcam2_sensor_reset_suspend &rcam2_sensor_vana_suspend>; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 42 0>, /* RST */ - <&tlmm 64 0>; /* VANA */ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - -}; - -&cam_cci1 { - - qcom,cam-sensor@1 { /* VT 32M */ - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - slave-addr = <0x34>; - csiphy-sd-index = <2>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1050000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &front_sensor_reset_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &front_sensor_reset_suspend >; - - gpios = <&tlmm 23 0>, /* MCLK */ - <&tlmm 21 0>; /*RST */ - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK4_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { /* VT 32M */ - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - slave-addr = <0x34>; - csiphy-sd-index = <2>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1050000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &front_sensor_reset_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &front_sensor_reset_suspend >; - - gpios = <&tlmm 23 0>, /* MCLK */ - <&tlmm 21 0>; /*RST */ - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK4", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK4_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - sensor_rear_bokeh: qcom,cam-sensor@3 { /* REAR CAM 2 - 5M Bokeh */ - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - slave-addr = <0x6E>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &rcam2_sensor_reset_active &rcam2_sensor_vana_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &rcam2_sensor_reset_suspend &rcam2_sensor_vana_suspend>; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 42 0>, /* RST */ - <&tlmm 64 0>; /* VANA */ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET2", "CAM_VANA2"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - sensor_rear_macro: qcom,cam-sensor@4 { /* REAR CAM 4 - 5M Macro */ - cell-index = <4>; - compatible = "qcom,cam-sensor"; - reg = <0x4>; - slave-addr = <0x7E>; - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - led-flash-src = <&led_flash_rear>; - eeprom-src = <&eeprom4>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk4_active &rcam4_sensor_reset_active - &rcam4_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk4_suspend &rcam4_sensor_reset_suspend - &rcam4_sensor_vana_suspend &cam_mipi_sel_suspend>; - - gpios = <&tlmm 16 0>, /* MCLK */ - <&tlmm 24 0>, /* RESET */ - <&tlmm 74 0>, /* VANA */ - <&tlmm 66 0>; /*MIPI SEL*/ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - eeprom4: qcom,eeprom@0x3F { - cell-index = <4>; - compatible = "qcom,eeprom"; - reg = <0x3F>; - slave-addr = <0x7E>; - i2c-freq-mode = <1>; - - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk4_active &rcam4_sensor_reset_active &rcam4_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk4_suspend &rcam4_sensor_reset_suspend &rcam4_sensor_vana_suspend &cam_mipi_sel_suspend>; - - gpios = <&tlmm 16 0>, // MCLK - <&tlmm 24 0>, // RESET - <&tlmm 74 0>, // VANA - <&tlmm 66 0>; // MIPI SEL - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VANA4", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - -}; - -&qupv3_se9_i2c { - - eeprom0: qcom,eeprom@58 { - cell-index = <0>; - reg = <0x58>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&s2mpb03_l7>; - cam_vio-supply = <&s2mpb03_l3>; - - regulator-names = "cam_vaf","cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - slave-addr = <0x18>; - compatible = "i2c_actuator"; - - rgltr-cntrl-support; - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&s2mpb03_l7>; - cam_vio-supply = <&s2mpb03_l3>; - - regulator-names = "cam_vaf","cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-mode = <0>; - sensor-position = <1>; - rgltr-cntrl-support; - }; - -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-r04.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-r04.dtsi deleted file mode 100755 index 0f78d4f17982..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-r04.dtsi +++ /dev/null @@ -1,118 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -&reserved_memory { - -}; - -&cam_cci0 { - - qcom,cam-res-mgr { - compatible = "qcom,cam-res-mgr"; - shared-gpios = <64>; - pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; - status = "ok"; - pinctrl-0 = <&rcam2_sensor_vana_active>; - pinctrl-1 = <&rcam2_sensor_vana_suspend>; - }; - -}; - -&sensor_rear_uw{ - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; -}; - -&sensor_rear_bokeh{ - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 0>; - rgltr-max-voltage = <1800000 1200000 0>; - rgltr-load-current = <200000 200000 0>; -}; - -&sensor_rear_macro{ - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 0>; - rgltr-max-voltage = <1800000 1200000 0>; - rgltr-load-current = <200000 200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk4_active &rcam4_sensor_reset_active - &rcam2_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk4_suspend &rcam4_sensor_reset_suspend - &rcam2_sensor_vana_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 16 0>, /* MCLK */ - <&tlmm 24 0>, /* RESET */ - <&tlmm 64 0>, /* VANA */ - <&tlmm 66 0>; /*MIPI SEL*/ -}; - -&eeprom4{ - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 0>; - rgltr-max-voltage = <1800000 1200000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk4_active &rcam4_sensor_reset_active &rcam2_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk4_suspend &rcam4_sensor_reset_suspend &rcam2_sensor_vana_suspend &cam_mipi_sel_suspend>; - - gpios = <&tlmm 16 0>, // MCLK - <&tlmm 24 0>, // RESET - <&tlmm 64 0>, // VANA - <&tlmm 66 0>; // MIPI SEL -}; - -&eeprom2{ - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; -}; - -&eeprom3{ - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 0>; - rgltr-max-voltage = <1800000 1200000 0>; - rgltr-load-current = <200000 200000 0>; -}; - diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-r06.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-r06.dtsi deleted file mode 100755 index c254746faa5f..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-camera-sensor-r06.dtsi +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include - -&reserved_memory { - -}; - -&sensor_rear_macro{ - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk4_active &rcam4_sensor_reset_active &rcam4_sensor_vdig_active - &rcam2_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk4_suspend &rcam4_sensor_reset_suspend &rcam4_sensor_vdig_suspend - &rcam2_sensor_vana_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 16 0>, /* MCLK */ - <&tlmm 24 0>, /* RESET */ - <&tlmm 56 0>, /* VDIG */ - <&tlmm 64 0>, /* VANA */ - <&tlmm 66 0>; /*MIPI SEL*/ - - gpio-reset = <1>; - gpio-vdig = <2>; - gpio-vana = <3>; - gpio-custom1 = <4>; - gpio-req-tbl-num = <0 1 2 3 4>; - gpio-req-tbl-flags = <1 0 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VDIG4", "CAM_VANA4", "MIPI_SEL"; -}; - -&eeprom4{ - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk4_active &rcam4_sensor_reset_active &rcam4_sensor_vdig_active - &rcam2_sensor_vana_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk4_suspend &rcam4_sensor_reset_suspend &rcam4_sensor_vdig_suspend - &rcam2_sensor_vana_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 16 0>, /* MCLK */ - <&tlmm 24 0>, /* RESET */ - <&tlmm 56 0>, /* VDIG */ - <&tlmm 64 0>, /* VANA */ - <&tlmm 66 0>; /*MIPI SEL*/ - - gpio-reset = <1>; - gpio-vdig = <2>; - gpio-vana = <3>; - gpio-custom1 = <4>; - gpio-req-tbl-num = <0 1 2 3 4>; - gpio-req-tbl-flags = <1 0 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET4", "CAM_VDIG4", "CAM_VANA4", "MIPI_SEL"; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-display-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-display-r00.dtsi deleted file mode 100755 index e2cd10f9c06c..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-display-r00.dtsi +++ /dev/null @@ -1,224 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../../drivers/gpu/drm/msm/samsung_lego/SELF_DISPLAY/self_display_cmd_FC3.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS638YQ01/dsi_panel_S6E3FC3_AMS638YQ01_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung_lego/EA8076GA_AMS638VL01/dsi_panel_EA8076GA_AMS638VL01_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung_lego/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - -&tlmm { - pmx_sde_te { - sde_te_active: sde_te_active { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_te_suspend: sde_te_suspend { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio8"; - function = "gpio"; - }; - - config { - pins = "gpio8"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio8"; - function = "gpio"; - }; - - config { - pins = "gpio8"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - }; -}; - -&pm6150_gpios { - pmx_sde_ub_det { - sde_ub_det_default: sde_ub_det_default { - pins = "gpio5"; - function = "normal"; - input-enable; - power-source = <1>; - bias-disable; /* No PULL */ - }; - }; -}; - -&soc { - /* M42Q_Rev_02 panel */ - ss_dsi_panel_S6E3FC3_AMS638YQ01_FHD_display: qcom,dsi-display@11 { - label = "ss_dsi_panel_S6E3FC3_AMS638YQ01_FHD"; - qcom,display-type = "primary"; - }; - - /* M42Q panel */ - ss_dsi_panel_EA8076GA_AMS638VL01_FHD_display: qcom,dsi-display@10 { - label = "ss_dsi_panel_EA8076GA_AMS638VL01_FHD"; - qcom,display-type = "primary"; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@9 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - }; -}; - -&sde_dsi { - vci-supply = <&pm6150_l18>; /* 3.0V, VREG_L18A_3P0 */ - vddi-supply = <&pm6150_l13>; /* 1.8V, VREG_L13A_1P8 */ - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_te_active &sde_dsi_active &sde_ub_det_default>; - pinctrl-1 = <&sde_te_suspend &sde_dsi_suspend &sde_ub_det_default>; - qcom,dsi-display-list = - <&ss_dsi_panel_S6E3FC3_AMS638YQ01_FHD - &ss_dsi_panel_EA8076GA_AMS638VL01_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; -}; - -&ss_dsi_panel_S6E3FC3_AMS638YQ01_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_S6E3FC3_AMS638YQ01_FHD>; - - qcom,platform-reset-gpio = <&tlmm 8 0>; /* OCTA_RST*/ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&pm6150_gpios 5 0>; - - /* ESD related */ - qcom,esd-check-enabled; - qcom,mdss-dsi-panel-status-check-mode ="irq_check"; - qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; - samsung,esd-irq-gpio1 = <&tlmm 11 0>; /* EL_ON1_DET */ - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vci"; - qcom,supply-min-voltage = <3000000>; - qcom,supply-max-voltage = <3000000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <0>; - }; - - qcom,panel-supply-entry@1 { - reg = <1>; - qcom,supply-name = "vddi"; - qcom,supply-min-voltage = <1800000>; - qcom,supply-max-voltage = <1800000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - - -&ss_dsi_panel_EA8076GA_AMS638VL01_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_EA8076GA_AMS638VL01_FHD>; - - qcom,platform-reset-gpio = <&tlmm 8 0>; /* OCTA_RST*/ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&pm6150_gpios 5 0>; - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; - qcom,supply-min-voltage = <1800000>; - qcom,supply-max-voltage = <1800000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <0>; - }; - - qcom,panel-supply-entry@1 { - reg = <1>; - qcom,supply-name = "vci"; - qcom,supply-min-voltage = <3000000>; - qcom,supply-max-voltage = <3000000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <10>; - qcom,supply-pre-off-sleep = <15>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-reset-gpio = <&tlmm 8 0>; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-fingerprint-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-fingerprint-r00.dtsi deleted file mode 100755 index fc0d1b9fae74..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-fingerprint-r00.dtsi +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - etspi_drdypin { - etspi_drdypin_active: etspi_drdypin_active { - mux { - pins = "gpio93"; - function = "gpio"; - }; - config { - pins = "gpio93"; - drive-strength = <2>; - bias-disable; - }; - }; - etspi_drdypin_suspend: etspi_drdypin_suspend { - mux { - pins = "gpio93"; - function = "gpio"; - }; - config { - pins = "gpio93"; - drive-strength = <2>; - bias-pull-down; - }; - }; - }; - - etspi_rstpin { - etspi_rstpin: etspi_rstpin { - mux { - pins = "gpio91"; - function = "gpio"; - }; - config { - pins = "gpio91"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; -}; - -&pm6150l_l11 { - regulator-name = "VDD_BTP_3P3"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; -}; - -&qupv3_se6_spi { - status = "okay"; - - etspi-spi@0 { - compatible = "etspi,et5xx"; - reg = <0>; - spi-max-frequency = <12500000>; - etspi-min_cpufreq_limit = <2169600>; - - pinctrl-names = "default", "sleep", "idle"; - pinctrl-0 = <&etspi_drdypin_suspend &etspi_rstpin>; - pinctrl-1 = <&etspi_drdypin_suspend>; - pinctrl-2 = <&etspi_drdypin_active>; - - gpio-controller; - #gpio-cells = <2>; - - etspi-regulator = "VDD_BTP_3P3"; - etspi-sleepPin = <&tlmm 91 0>; - etspi-drdyPin = <&tlmm 93 1>; - etspi-chipid = "ET523"; - etspi-orient = <2>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-usb-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-usb-r00.dtsi deleted file mode 100755 index 7610fd7bc506..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-usb-r00.dtsi +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&qupv3_se4_i2c { - pinctrl-1 = <&if_pmic_i2c_sleep>; - status = "okay"; - sm5714@49{ - status = "okay"; - compatible = "siliconmitus,sm5714mfd"; - reg = <0x49>; - pinctrl-names = "default"; - pinctrl-0 = <&if_pmic_irq_default>; - sm5714,irq-gpio = <&tlmm 33 0>; - sm5714,wakeup; - }; -}; - -&qupv3_se11_i2c { - pinctrl-1 = <&usbpd_i2c_sleep>; - status = "okay"; - usbpd-sm5714@33 { - status = "okay"; - compatible = "sm5714-usbpd"; - reg = <0x33>; - pinctrl-names = "default"; - pinctrl-0 = <&usbpd_irq_default>; - usbpd,usbpd_int = <&tlmm 104 0>; - support_pd_role_swap; - pdic-manager { - /* sink */ - pdic,max_power = <5000>; - pdic_op_power = <2500>; - pdic_max_voltage = <6000>; - pdic_max_current = <2000>; - pdic,min_current = <500>; - - pdic,giveback = <0>; - pdic,usb_com_capable = <1>; - pdic,no_usb_suspend = <1>; - - /* source */ - source,max_voltage = <5000>; - source,min_voltage = <4000>; - source,max_power = <2500>; - }; - }; -}; - -&tlmm { - if_pmic_irq { - if_pmic_irq_default: if_pmic_irq_default { - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; - }; - - usbpd_irq { - usbpd_irq_default: usbpd_irq_default { - mux { - pins = "gpio104"; - function = "gpio"; - }; - config { - pins = "gpio104"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; - }; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x15 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x47 0x240 /* TUNE1 */ - 0x2b 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x00 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,qusb-phy-host-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x15 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x47 0x240 /* TUNE1 */ - 0x2b 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x00 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-vibrator-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-vibrator-r00.dtsi deleted file mode 100755 index fedce1f96de2..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/atoll-sec-m42q-vibrator-r00.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - vibrator: samsung,vibrator { - compatible = "samsung_vib"; - samsung,vib_type = "COINDC"; - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-a71-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-a71-r00.dtsi deleted file mode 100755 index 6ccf59fadee3..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-a71-r00.dtsi +++ /dev/null @@ -1,577 +0,0 @@ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&pm6150_l6 { - regulator-min-microvolt = <1050000>; - qcom,init-voltage = <1050000>; -}; - -&soc { - s2mu107_flash0: qcom,flash_0 { - label = "flash"; - qcom,led-name = "led:flash_0"; - qcom,max-current = <1500>; - qcom,default-led-trigger = "flash0_trigger"; - qcom,id = <0>; - qcom,current-ma = <1400>; - qcom,duration-ms = <1280>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - qcom,record-current-ma = <200>; - }; - - s2mu107_torch0: qcom,torch_0 { - label = "torch"; - qcom,led-name = "led:torch_0"; - qcom,max-current = <500>; - qcom,default-led-trigger = "torch0_trigger"; - qcom,id = <0>; - qcom,current-ma = <300>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - }; - - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - compatible = "qcom,camera-flash"; - flash-source = <&s2mu107_flash0>; - torch-source = <&s2mu107_torch0>; - status = "ok"; - }; - - rpmh-regulator-ldoa18 { - compatible = "qcom,rpmh-vrm-regulator"; - mboxes = <&apps_rsc 0>; - qcom,resource-name = "ldoa18"; - qcom,regulator-type = "pmic5-ldo"; - qcom,supported-modes = - ; - qcom,mode-threshold-currents = <0 1>; - L18A: pm6150_l18: regulator-pm6150-l18 { - regulator-name = "pm6150_l18"; - qcom,set = ; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <3000000>; - qcom,init-voltage = <2800000>; - qcom,init-mode = ; - }; - }; - }; - -&cam_cci0 { - - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vaf-supply = <&s2mpb03_l7>; - cam_vana-supply = <&s2mpb03_l5>; - cam_v_custom1-supply = <&s2mpb03_l3>; // Analog 1.8 - cam_vdig-supply = <&pm6150_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio","cam_vaf", "cam_vana", "cam_v_custom1","cam_vdig","cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 2800000 1800000 1050000 0>; - rgltr-max-voltage = <1800000 2800000 2800000 1800000 1050000 0>; - rgltr-load-current = <200000 200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active &cam_sensor_rear_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend &cam_sensor_rear_suspend>; - - gpios = <&tlmm 13 0>, /* MCLK */ - <&tlmm 33 0>; /* RST */ - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@1 { /* VT 32M */ - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - slave-addr = <0x34>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom1-supply = <&pm6150_l13>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_v_custom1", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1050000 1800000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 1800000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &cam_sensor_front_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &cam_sensor_front_suspend >; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 23 0>; /*RST */ - - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { /* VT 32M */ - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - slave-addr = <0x34>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom1-supply = <&pm6150_l13>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_v_custom1", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1050000 1800000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 1800000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &cam_sensor_front_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &cam_sensor_front_suspend >; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 23 0>; /*RST */ - - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { /* REAR CAM 3 - 5M */ - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&pm6150_l18>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &cam_sensor_rear_sub2_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &cam_sensor_rear_sub2_suspend>; - - gpios = <&tlmm 16 0>, - <&tlmm 67 0>; - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET2"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { /* REAR CAM 2 - 13MP UW */ - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - - cam_vio-supply = <&pm6150_l13>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &cam_sensor_rear3sw_active &cam_rear3_pwr_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &cam_sensor_rear3sw_suspend &cam_rear3_pwr_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 15 0>, /* MCLK */ - <&tlmm 53 0>, /* RESET */ - <&tlmm 4 0>, /* VANA */ - <&tlmm 51 0>; /*MIPI SEL*/ - - - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA", "MIPI_SEL" ; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - - qcom,cam-sensor@4 { /* REAR CAM 4 - 5M Macro */ - cell-index = <4>; - compatible = "qcom,cam-sensor"; - reg = <0x4>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom4>; - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - - - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &cam_sensor_rear4sw_active &cam_sensor_rear4_pwr_active &cam_sensor_rear4_digital_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &cam_sensor_rear4sw_suspend &cam_sensor_rear4_pwr_suspend &cam_sensor_rear4_digital_suspend &cam_mipi_sel_suspend>; - - gpios = <&tlmm 15 0>, - <&pm6150l_gpios 11 0>, - <&pm6150l_gpios 12 0>, - <&pm6150l_gpios 10 0>, - <&tlmm 51 0>; - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-vdig = <3>; - gpio-custom1 = <4>; - gpio-req-tbl-num = <0 1 2 3 4>; - gpio-req-tbl-flags = <1 0 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET2", "CAM_VANA", "CAM_VDIG", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; -}; - -&cam_cci1 { - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - cam_vio-supply = <&pm6150_l13>; - cam_vaf-supply = <&s2mpb03_l7>; - regulator-names = "cam_vio","cam_vaf"; - rgltr-min-voltage = <1800000 2800000>; - rgltr-max-voltage = <1800000 2800000>; - rgltr-load-current = <200000 200000>; - }; - - eeprom0: qcom,eeprom@50 { - cell-index = <0>; - reg = <0x50>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&s2mpb03_l7>; - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_vaf","cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0xA2>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_v_custom1", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_v_custom1-supply = <&s2mpb03_l3>; - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_v_custom1","cam_vio"; - rgltr-min-voltage = <1800000 1800000>; - rgltr-max-voltage = <1800000 1800000>; - rgltr-load-current = <200000 200000>; - - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@54 { - cell-index = <2>; - reg = <0x54>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0xA8>; - - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - eeprom3: qcom,eeprom@53 { - cell-index = <3>; - reg = <0x53>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&s2mpb03_l7>; - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_vaf","cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - - - eeprom4: qcom,eeprom@52 { - cell-index = <4>; - reg = <0x52>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0xA4>; - - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-a71-r01.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-a71-r01.dtsi deleted file mode 100755 index 54fe0c359e05..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-a71-r01.dtsi +++ /dev/null @@ -1,577 +0,0 @@ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&pm6150_l6 { - regulator-min-microvolt = <1050000>; - qcom,init-voltage = <1050000>; -}; - -&soc { - s2mu106_flash0: qcom,flash_0 { - label = "flash"; - qcom,led-name = "led:flash_0"; - qcom,max-current = <1500>; - qcom,default-led-trigger = "flash0_trigger"; - qcom,id = <0>; - qcom,current-ma = <1400>; - qcom,duration-ms = <1280>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - qcom,record-current-ma = <200>; - }; - - s2mu106_torch0: qcom,torch_0 { - label = "torch"; - qcom,led-name = "led:torch_0"; - qcom,max-current = <500>; - qcom,default-led-trigger = "torch0_trigger"; - qcom,id = <0>; - qcom,current-ma = <300>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - }; - - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - compatible = "qcom,camera-flash"; - flash-source = <&s2mu106_flash0>; - torch-source = <&s2mu106_torch0>; - status = "ok"; - }; - - rpmh-regulator-ldoa18 { - compatible = "qcom,rpmh-vrm-regulator"; - mboxes = <&apps_rsc 0>; - qcom,resource-name = "ldoa18"; - qcom,regulator-type = "pmic5-ldo"; - qcom,supported-modes = - ; - qcom,mode-threshold-currents = <0 1>; - L18A: pm6150_l18: regulator-pm6150-l18 { - regulator-name = "pm6150_l18"; - qcom,set = ; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <3000000>; - qcom,init-voltage = <2800000>; - qcom,init-mode = ; - }; - }; - }; - -&cam_cci0 { - - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vaf-supply = <&s2mpb03_l7>; - cam_vana-supply = <&s2mpb03_l5>; - cam_v_custom1-supply = <&s2mpb03_l3>; // Analog 1.8 - cam_vdig-supply = <&pm6150_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio","cam_vaf", "cam_vana", "cam_v_custom1","cam_vdig","cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 2800000 1800000 1050000 0>; - rgltr-max-voltage = <1800000 2800000 2800000 1800000 1050000 0>; - rgltr-load-current = <200000 200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active &cam_sensor_rear_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend &cam_sensor_rear_suspend>; - - gpios = <&tlmm 13 0>, /* MCLK */ - <&tlmm 33 0>; /* RST */ - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@1 { /* VT 32M */ - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - slave-addr = <0x34>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom1-supply = <&pm6150_l13>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_v_custom1", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1050000 1800000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 1800000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &cam_sensor_front_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &cam_sensor_front_suspend >; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 23 0>; /*RST */ - - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { /* VT 32M */ - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - slave-addr = <0x34>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom1-supply = <&pm6150_l13>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_v_custom1", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1050000 1800000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 1800000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &cam_sensor_front_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &cam_sensor_front_suspend >; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 23 0>; /*RST */ - - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { /* REAR CAM 3 - 5M */ - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&pm6150_l18>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &cam_sensor_rear_sub2_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &cam_sensor_rear_sub2_suspend>; - - gpios = <&tlmm 16 0>, - <&tlmm 67 0>; - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET2"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { /* REAR CAM 2 - 13MP UW */ - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - - cam_vio-supply = <&pm6150_l13>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &cam_sensor_rear3sw_active &cam_rear3_pwr_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &cam_sensor_rear3sw_suspend &cam_rear3_pwr_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 15 0>, /* MCLK */ - <&tlmm 53 0>, /* RESET */ - <&tlmm 4 0>, /* VANA */ - <&tlmm 51 0>; /*MIPI SEL*/ - - - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA", "MIPI_SEL" ; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - - qcom,cam-sensor@4 { /* REAR CAM 4 - 5M Macro */ - cell-index = <4>; - compatible = "qcom,cam-sensor"; - reg = <0x4>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom4>; - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - - - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &cam_sensor_rear4sw_active &cam_sensor_rear4_pwr_active &cam_sensor_rear4_digital_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &cam_sensor_rear4sw_suspend &cam_sensor_rear4_pwr_suspend &cam_sensor_rear4_digital_suspend &cam_mipi_sel_suspend>; - - gpios = <&tlmm 15 0>, - <&pm6150l_gpios 11 0>, - <&pm6150l_gpios 12 0>, - <&pm6150l_gpios 10 0>, - <&tlmm 51 0>; - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-vdig = <3>; - gpio-custom1 = <4>; - gpio-req-tbl-num = <0 1 2 3 4>; - gpio-req-tbl-flags = <1 0 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET2", "CAM_VANA", "CAM_VDIG", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; -}; - -&cam_cci1 { - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - cam_vio-supply = <&pm6150_l13>; - cam_vaf-supply = <&s2mpb03_l7>; - regulator-names = "cam_vio","cam_vaf"; - rgltr-min-voltage = <1800000 2800000>; - rgltr-max-voltage = <1800000 2800000>; - rgltr-load-current = <200000 200000>; - }; - - eeprom0: qcom,eeprom@50 { - cell-index = <0>; - reg = <0x50>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&s2mpb03_l7>; - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_vaf","cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0xA2>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_v_custom1", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_v_custom1-supply = <&s2mpb03_l3>; - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_v_custom1","cam_vio"; - rgltr-min-voltage = <1800000 1800000>; - rgltr-max-voltage = <1800000 1800000>; - rgltr-load-current = <200000 200000>; - - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@54 { - cell-index = <2>; - reg = <0x54>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0xA8>; - - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - eeprom3: qcom,eeprom@53 { - cell-index = <3>; - reg = <0x53>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&s2mpb03_l7>; - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_vaf","cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - - - eeprom4: qcom,eeprom@52 { - cell-index = <4>; - reg = <0x52>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0xA4>; - - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-m41-r01.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-m41-r01.dtsi deleted file mode 100755 index 07ba6512dc31..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-m41-r01.dtsi +++ /dev/null @@ -1,595 +0,0 @@ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&pm6150_l6 { - regulator-min-microvolt = <1050000>; - qcom,init-voltage = <1050000>; -}; - -&soc { - s2mu106_flash0: qcom,flash_0 { - label = "flash"; - qcom,led-name = "led:flash_0"; - qcom,max-current = <1500>; - qcom,default-led-trigger = "flash0_trigger"; - qcom,id = <0>; - qcom,current-ma = <1400>; - qcom,duration-ms = <1280>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - qcom,record-current-ma = <200>; - }; - - s2mu106_torch0: qcom,torch_0 { - label = "torch"; - qcom,led-name = "led:torch_0"; - qcom,max-current = <500>; - qcom,default-led-trigger = "torch0_trigger"; - qcom,id = <0>; - qcom,current-ma = <300>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - }; - - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - compatible = "qcom,camera-flash"; - flash-source = <&s2mu106_flash0>; - torch-source = <&s2mu106_torch0>; - status = "ok"; - }; - - rpmh-regulator-ldoa18 { - compatible = "qcom,rpmh-vrm-regulator"; - mboxes = <&apps_rsc 0>; - qcom,resource-name = "ldoa18"; - qcom,regulator-type = "pmic5-ldo"; - qcom,supported-modes = - ; - qcom,mode-threshold-currents = <0 1>; - L18A: pm6150_l18: regulator-pm6150-l18 { - regulator-name = "pm6150_l18"; - qcom,set = ; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <3000000>; - qcom,init-voltage = <2800000>; - qcom,init-mode = ; - }; - }; - }; - -&cam_cci0 { - - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vaf-supply = <&s2mpb03_l7>; - cam_vana-supply = <&s2mpb03_l5>; - cam_v_custom1-supply = <&s2mpb03_l3>; // Analog 1.8 - cam_vdig-supply = <&pm6150_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio","cam_vaf", "cam_vana", "cam_v_custom1","cam_vdig","cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 2800000 1800000 1050000 0>; - rgltr-max-voltage = <1800000 2800000 2800000 1800000 1050000 0>; - rgltr-load-current = <200000 200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active &cam_sensor_rear_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend &cam_sensor_rear_suspend>; - - gpios = <&tlmm 13 0>, /* MCLK */ - <&tlmm 33 0>; /* RST */ - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@1 { /* VT 32M */ - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - slave-addr = <0x34>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom1-supply = <&pm6150_l13>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_v_custom1", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1050000 1800000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 1800000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &cam_sensor_front_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &cam_sensor_front_suspend >; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 23 0>; /*RST */ - - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { /* VT 32M */ - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - slave-addr = <0x34>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom1-supply = <&pm6150_l13>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_v_custom1", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1050000 1800000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 1800000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &cam_sensor_front_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &cam_sensor_front_suspend >; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 23 0>; /*RST */ - - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { /* REAR CAM 3 - 5M */ - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&pm6150_l18>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &cam_sensor_rear_sub2_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &cam_sensor_rear_sub2_suspend>; - - gpios = <&tlmm 16 0>, - <&tlmm 67 0>; - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET2"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { /* REAR CAM 2 - 13MP UW */ - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - - cam_vio-supply = <&pm6150_l13>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &cam_sensor_rear3sw_active &cam_rear3_pwr_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &cam_sensor_rear3sw_suspend &cam_rear3_pwr_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 15 0>, /* MCLK */ - <&tlmm 53 0>, /* RESET */ - <&tlmm 4 0>, /* VANA */ - <&tlmm 51 0>; /*MIPI SEL*/ - - - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA", "MIPI_SEL" ; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - - qcom,cam-sensor@4 { /* REAR CAM 4 - 5M Macro */ - cell-index = <4>; - compatible = "qcom,cam-sensor"; - reg = <0x4>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom4>; - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - - - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &cam_sensor_rear4sw_active &cam_sensor_rear4_pwr_active &cam_sensor_rear4_digital_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &cam_sensor_rear4sw_suspend &cam_sensor_rear4_pwr_suspend &cam_sensor_rear4_digital_suspend &cam_mipi_sel_suspend>; - - gpios = <&tlmm 15 0>, - <&pm6150l_gpios 11 0>, - <&pm6150l_gpios 12 0>, - <&pm6150l_gpios 10 0>, - <&tlmm 51 0>; - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-vdig = <3>; - gpio-custom1 = <4>; - gpio-req-tbl-num = <0 1 2 3 4>; - gpio-req-tbl-flags = <1 0 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET2", "CAM_VANA", "CAM_VDIG", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; -}; - -&cam_cci1 { - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - cam_vio-supply = <&pm6150_l13>; - cam_vaf-supply = <&s2mpb03_l7>; - regulator-names = "cam_vio","cam_vaf"; - rgltr-min-voltage = <1800000 2800000>; - rgltr-max-voltage = <1800000 2800000>; - rgltr-load-current = <200000 200000>; - }; - - eeprom0: qcom,eeprom@58 { - cell-index = <0>; - reg = <0x58>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&s2mpb03_l7>; - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_vaf","cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0xA2>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_v_custom1", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_v_custom1-supply = <&s2mpb03_l3>; - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_v_custom1","cam_vio"; - rgltr-min-voltage = <1800000 1800000>; - rgltr-max-voltage = <1800000 1800000>; - rgltr-load-current = <200000 200000>; - - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@54 { - cell-index = <2>; - reg = <0x54>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0xA8>; - - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom3: qcom,eeprom@53 { - cell-index = <3>; - reg = <0x37>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0x6E>; - sensor-position = <0>; - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&pm6150_l18>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &cam_sensor_rear_sub2_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &cam_sensor_rear_sub2_suspend>; - - gpios = <&tlmm 16 0>, - <&tlmm 67 0>; - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET2"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - }; - - - eeprom4: qcom,eeprom@52 { - cell-index = <4>; - reg = <0x52>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0xA4>; - - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-m51-r01.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-m51-r01.dtsi deleted file mode 100755 index df1a1c612503..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-camera-sensor-m51-r01.dtsi +++ /dev/null @@ -1,579 +0,0 @@ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&pm6150_l6 { - regulator-min-microvolt = <1050000>; - qcom,init-voltage = <1050000>; -}; - -&soc { - s2mu106_flash0: qcom,flash_0 { - label = "flash"; - qcom,led-name = "led:flash_0"; - qcom,max-current = <1500>; - qcom,default-led-trigger = "flash0_trigger"; - qcom,id = <0>; - qcom,current-ma = <1400>; - qcom,duration-ms = <1280>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - qcom,record-current-ma = <200>; - }; - - s2mu106_torch0: qcom,torch_0 { - label = "torch"; - qcom,led-name = "led:torch_0"; - qcom,max-current = <500>; - qcom,default-led-trigger = "torch0_trigger"; - qcom,id = <0>; - qcom,current-ma = <300>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - }; - - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - compatible = "qcom,camera-flash"; - flash-source = <&s2mu106_flash0>; - torch-source = <&s2mu106_torch0>; - status = "ok"; - }; - - rpmh-regulator-ldoa18 { - compatible = "qcom,rpmh-vrm-regulator"; - mboxes = <&apps_rsc 0>; - qcom,resource-name = "ldoa18"; - qcom,regulator-type = "pmic5-ldo"; - qcom,supported-modes = - ; - qcom,mode-threshold-currents = <0 1>; - L18A: pm6150_l18: regulator-pm6150-l18 { - regulator-name = "pm6150_l18"; - qcom,set = ; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <3000000>; - qcom,init-voltage = <2800000>; - qcom,init-mode = ; - }; - }; - }; - -&cam_cci0 { - - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vaf-supply = <&s2mpb03_l7>; - cam_vana-supply = <&s2mpb03_l5>; - cam_v_custom1-supply = <&pm6150_l13>; // Analog 1.8 - cam_vdig-supply = <&pm6150_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio","cam_vaf", "cam_vana", "cam_v_custom1","cam_vdig","cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 2800000 1800000 1050000 0>; - rgltr-max-voltage = <1800000 2800000 2800000 1800000 1050000 0>; - rgltr-load-current = <200000 200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active &cam_sensor_rear_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend &cam_sensor_rear_suspend>; - - gpios = <&tlmm 13 0>, /* MCLK */ - <&tlmm 33 0>; /* RST */ - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@1 { /* VT 32M */ - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - slave-addr = <0x34>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig","cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1050000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &cam_sensor_front_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &cam_sensor_front_suspend >; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 23 0>; /*RST */ - - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { /* VT 32M */ - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - slave-addr = <0x34>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1050000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &cam_sensor_front_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &cam_sensor_front_suspend >; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 23 0>; /*RST */ - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { /* REAR CAM 3 - 5M */ - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&pm6150_l18>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &cam_sensor_rear_sub2_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &cam_sensor_rear_sub2_suspend>; - - gpios = <&tlmm 16 0>, - <&tlmm 67 0>; - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET2"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { /* REAR CAM 2 - 13MP UW */ - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &cam_sensor_rear3sw_active &cam_rear3_pwr_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &cam_sensor_rear3sw_suspend &cam_rear3_pwr_suspend &cam_mipi_sel_suspend>; - gpios = <&tlmm 15 0>, /* MCLK */ - <&tlmm 53 0>, /* RESET */ - <&tlmm 4 0>, /* VANA */ - <&tlmm 51 0>; /*MIPI SEL*/ - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA", "MIPI_SEL" ; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - qcom,cam-sensor@4 { /* REAR CAM 4 - 5M Macro */ - cell-index = <4>; - compatible = "qcom,cam-sensor"; - reg = <0x4>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom4>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &cam_sensor_rear4sw_active &cam_sensor_rear4_pwr_active &cam_sensor_rear4_digital_active &cam_mipi_sel_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &cam_sensor_rear4sw_suspend &cam_sensor_rear4_pwr_suspend &cam_sensor_rear4_digital_suspend &cam_mipi_sel_suspend>; - - gpios = <&tlmm 15 0>, - <&pm6150l_gpios 11 0>, - <&pm6150l_gpios 12 0>, - <&pm6150l_gpios 10 0>, - <&tlmm 51 0>; - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-vdig = <3>; - gpio-custom1 = <4>; - gpio-req-tbl-num = <0 1 2 3 4>; - gpio-req-tbl-flags = <1 0 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET2", "CAM_VANA", "CAM_VDIG", "MIPI_SEL"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; -}; - -&cam_cci1 { - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - cam_vio-supply = <&s2mpb03_l3>; - cam_vaf-supply = <&s2mpb03_l7>; - regulator-names = "cam_vio","cam_vaf"; - rgltr-min-voltage = <1800000 2800000>; - rgltr-max-voltage = <1800000 2800000>; - rgltr-load-current = <200000 200000>; - }; - - eeprom0: qcom,eeprom@58 { - cell-index = <0>; - reg = <0x58>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&s2mpb03_l7>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf","cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0xA2>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@54 { - cell-index = <2>; - reg = <0x54>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0xA8>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom3: qcom,eeprom@53 { - cell-index = <3>; - reg = <0x37>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0x6E>; - sensor-position = <0>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&pm6150_l18>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &cam_sensor_rear_sub2_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &cam_sensor_rear_sub2_suspend>; - - gpios = <&tlmm 16 0>, - <&tlmm 67 0>; - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET2"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - }; - - eeprom4: qcom,eeprom@52 { - cell-index = <4>; - reg = <0x52>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0xA4>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-audio-pinctrl.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-audio-pinctrl.dtsi deleted file mode 100755 index 779ae98e1e61..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-audio-pinctrl.dtsi +++ /dev/null @@ -1,158 +0,0 @@ -/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&lpi_tlmm { - sec_mi2s_clk_active: sec_mi2s_clk_active { - mux { - pins = "gpio8"; - function = "func3"; - }; - config { - pins = "gpio8"; - drive-strength = <8>; - }; - }; - sec_mi2s_clk_sleep: sec_mi2s_clk_sleep { - mux { - pins = "gpio8"; - function = "func3"; - }; - config { - pins = "gpio8"; - drive-strength = <2>; - }; - }; - - sec_mi2s_ws_active: sec_mi2s_ws_active { - mux { - pins = "gpio9"; - function = "func3"; - }; - config { - pins = "gpio9"; - drive-strength = <8>; - }; - }; - - sec_mi2s_ws_sleep: sec_mi2s_ws_sleep { - mux { - pins = "gpio9"; - function = "func3"; - }; - config { - pins = "gpio9"; - drive-strength = <2>; - }; - }; - - sec_mi2s_sd0_active: sec_mi2s_sd0_active { - mux { - pins = "gpio10"; - function = "func4"; - }; - - config { - pins = "gpio10"; - drive-strength = <8>; - }; - }; - - sec_mi2s_sd0_sleep: sec_mi2s_sd0_sleep { - mux { - pins = "gpio10"; - function = "func4"; - }; - config { - pins = "gpio10"; - drive-strength = <2>; - }; - }; - - sec_mi2s_sd1_active: sec_mi2s_sd1_active { - mux { - pins = "gpio11"; - function = "func2"; - }; - config { - pins = "gpio11"; - drive-strength = <8>; - }; - }; - - sec_mi2s_sd1_sleep: sec_mi2s_sd1_sleep { - mux { - pins = "gpio11"; - function = "func2"; - }; - config { - pins = "gpio11"; - drive-strength = <2>; - }; - }; -}; - -&tlmm { - /* TAS2562 speaker pins */ - tas2562_int_default: tas2562_int_default { - mux { - pins = "gpio89"; - function = "gpio"; - }; - config { - pins = "gpio89"; - drive-strength = <2>; /* 2 MA */ - bias-disable; /* No PULL */ - }; - }; - - tas2562_rst_default: tas2562_rst_default { - mux { - pins = "gpio8"; - function = "gpio"; - }; - config { - pins = "gpio8"; - drive-strength = <2>; /* 2 MA */ - bias-disable; /* No PULL */ - }; - }; - - /delete-node/ qupv3_se0_i2c_pins; - qupv3_se0_i2c_pins: qupv3_se0_i2c_pins { - qupv3_se0_amp_i2c_active: qupv3_se0_amp_i2c_active { - mux { - pins = "gpio49", "gpio50"; - function = "qup00"; - }; - - config { - pins = "gpio49", "gpio50"; - drive-strength = <2>; - bias-disable; - }; - }; - - qupv3_se0_amp_i2c_sleep: qupv3_se0_amp_i2c_sleep { - mux { - pins = "gpio49", "gpio50"; - function = "gpio"; - }; - - config { - pins = "gpio49", "gpio50"; - drive-strength = <2>; - bias-disable; - }; - }; - }; -}; - diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-audio.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-audio.dtsi deleted file mode 100755 index 28720d2a97e5..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-audio.dtsi +++ /dev/null @@ -1,169 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&bolero { - qcom,num-macros = <3>; - imp_list: imp_list { - #list-imp-cells = <3>; - }; -}; - -&wcd937x_codec { - qcom,cdc-micbias2-mv = <2800>; - imp-table = <&imp_list 0 5 6>, - <&imp_list 6 21 6>, - <&imp_list 22 36 6>, - <&imp_list 37 100 6>, - <&imp_list 101 160 10>, - <&imp_list 161 400 11>, - <&imp_list 401 2000 11>, - <&imp_list 2001 0x7fffffff 6>; -}; - -&sm6150_snd { - qcom,model = "sm6150-idp-snd-card"; - qcom,msm-mi2s-master = <1>, <1>, <1>, <1>, <1>; - qcom,ext-disp-audio-rx = <1>; - - asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>, - <&loopback>, <&compress>, <&hostless>, - <&afe>, <&lsm>, <&routing>, <&compr>, - <&pcm_noirq>, <&samsung_q6audio_adaptation>; - asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", - "msm-pcm-dsp.2", "msm-voip-dsp", - "msm-pcm-voice", "msm-pcm-loopback", - "msm-compress-dsp", "msm-pcm-hostless", - "msm-pcm-afe", "msm-lsm-client", - "msm-pcm-routing", "msm-compr-dsp", - "msm-pcm-dsp-noirq", "q6audio-adaptation"; - qcom,audio-routing = - "AMIC1", "MIC BIAS1", - "MIC BIAS1", "Analog Mic1", - "AMIC2", "MIC BIAS2", - "MIC BIAS2", "Analog Mic2", - "AMIC3", "MIC BIAS3", - "MIC BIAS3", "Analog Mic3", - "IN1_HPHL", "HPHL_OUT", - "IN2_HPHR", "HPHR_OUT", - "IN3_AUX", "AUX_OUT", - "TX SWR_ADC0", "ADC1_OUTPUT", - "TX SWR_ADC2", "ADC2_OUTPUT", - "RX_TX DEC0_INP", "TX DEC0 MUX", - "RX_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC2_INP", "TX DEC2 MUX", - "RX_TX DEC3_INP", "TX DEC3 MUX"; - qcom,msm-mbhc-hs-mic-max-threshold-mv = <9999>; - qcom,msm-mbhc-hs-mic-min-threshold-mv = <640>; - qcom,msm-mbhc-hphl-swh = <1>; - qcom,msm-mbhc-gnd-swh = <0>; - qcom,cdc-dmic01-gpios = <0>; - qcom,cdc-dmic23-gpios = <0>; - qcom,fm-lna-gpios = <&tlmm 21 0>; - asoc-codec = <&stub_codec>, <&bolero>, <&ext_disp_audio_codec>; - asoc-codec-names = "msm-stub-codec.1", "bolero_codec", - "msm-ext-disp-audio-codec-rx"; - qcom,wsa-max-devs = <0>; - - qcom,codec-max-aux-devs = <1>; - qcom,codec-aux-devs = <&wcd937x_codec>; - qcom,msm_audio_ssr_devs = <&audio_apr>, <&q6core>, - <&lpi_tlmm>, <&bolero>; - mbhc-button-thres = <&det_zones 13 63>, - <&det_zones 88 138>, - <&det_zones 125 125>, - <&det_zones 225 225>, - <&det_zones 475 475>, - <&det_zones 620 620>, - <&det_zones 620 620>, - <&det_zones 620 620>; - qcom,sec-mi2s-gpios = <&cdc_sec_mi2s_gpios>; -}; - -&qupv3_se0_i2c { - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&qupv3_se0_amp_i2c_active>; - pinctrl-1 = <&qupv3_se0_amp_i2c_sleep>; - qcom,clk-freq-out = <100000>; - status = "ok"; - - tas2562:tas2562@4c { - #sound-dai-cells = <0>; - compatible = "ti,tas2562"; - reg = <0x4c>; - ti,left-channel = <0x4c>; - ti,channels = <1>; - ti,asi-format = <0>; - ti,reset-gpio = <&tlmm 8 0>; - ti,irq-gpio = <&tlmm 89 0>; - ti,port_id = <0x1002>; - ti,iv-width = <12>; - ti,vbat-mon = <1>; - status = "ok"; - - pinctrl-names = "default"; - pinctrl-0 = <&tas2562_int_default &tas2562_rst_default>; - }; -}; - -&soc { - det_zones: det_zones { - #list-det-cells = <2>; - }; - - samsung_q6audio_adaptation: samsung,q6audio-adaptation { - compatible = "samsung,q6audio-adaptation"; - adaptation,voice-tracking-tx-port-id = <0xB037>; - adaptation,amp-rx-port-id = <0x1002>; - adaptation,amp-rx-topology = <0x1000FC01>; - adaptation,amp-tx-topology = <0x1000FD01>; - }; - - cdc_sec_mi2s_gpios: msm_cdc_pinctrl_sec { - compatible = "qcom,msm-cdc-pinctrl"; - pinctrl-names = "aud_active", "aud_sleep"; - pinctrl-0 = <&sec_mi2s_clk_active &sec_mi2s_ws_active - &sec_mi2s_sd0_active &sec_mi2s_sd1_active>; - pinctrl-1 = <&sec_mi2s_clk_sleep &sec_mi2s_ws_sleep - &sec_mi2s_sd0_sleep &sec_mi2s_sd1_sleep>; - }; -}; - -&dai_mi2s1 { - qcom,msm-mi2s-rx-lines = <2>; - qcom,msm-mi2s-tx-lines = <1>; -}; - -&wsa_swr_gpios { - status = "disabled"; -}; - -&wsa_macro { - status = "disabled"; -}; - -&swr0 { - status = "disabled"; -}; - -&wsa_spkr_en1 { - status = "disabled"; -}; -&wsa_spkr_en2 { - status = "disabled"; -}; -&fsa4480 { - status = "disabled"; -}; - -&aliases { - i2c24 = "/soc/i2c@0x880000"; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r02.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r02.dtsi deleted file mode 100755 index 55cd2ee2cafd..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r02.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a71-battery-r03.dtsi" - -&pm6150_qg { - /* fix bat temp because of hw issue */ - qcom,fake_temp; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r03.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r03.dtsi deleted file mode 100755 index 32f78a047598..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r03.dtsi +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&pm6150_vadc { - bat_thm { - reg = ; - label = "bat_thm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - }; -}; - -&soc { - battery { - - battery,temp_table_adc = < - 1978 2288 2640 3049 3517 4021 4597 5237 5953 6723 - 7481 8270 9050 9786 10508 11178 11784 12312 12778 13168 - 13470 13719 13912 - >; - - io-channels = <&pm6150_vadc ADC_AMUX_THM4_PU2>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r04.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r04.dtsi deleted file mode 100755 index a7f38ef05de6..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r04.dtsi +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&pm6150_vadc { - bat_thm { - reg = ; - label = "bat_thm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - }; -}; - -&soc { - battery { - - battery,temp_table_adc = < - 2127 2475 2966 3377 3975 4632 5454 6390 7499 8709 - 10058 11543 13049 14708 16403 18129 19883 21326 22780 24007 - 24825 25547 26180 - >; - - io-channels = <&pm6150_vadc ADC_AMUX_THM4_PU2>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r05.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r05.dtsi deleted file mode 100755 index 3970eb3300bb..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r05.dtsi +++ /dev/null @@ -1,13 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a71-battery-r04.dtsi" \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r06.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r06.dtsi deleted file mode 100755 index fb5901550b07..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-battery-r06.dtsi +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&pm6150_vadc { - bat_thm { - reg = ; - label = "bat_thm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - }; -}; - -&soc { - battery { - - battery,dchg_thermal_source = <3>; /* SEC_BATTERY_THERMAL_SOURCE_CHG_ADC */ - battery,fuelgauge_name = "s2mu106-fuelgauge"; - battery,fgsrc_switch_name = "s2mu106-fuelgauge"; /* Fuelgauge voltage source */ - battery,batt_data_version = <1>; - - battery,chip_vendor = "QCOM"; - - battery,temp_table_adc = < - 2127 2475 2966 3377 3975 4632 5454 6390 7499 8709 - 10058 11543 13049 14708 16403 18129 19883 21326 22780 24007 - 24825 25547 26180 - >; - - io-channels = <&pm6150_vadc ADC_AMUX_THM4_PU2>; - }; - - /delete-node/ s2mu107-charger; - - s2mu106-charger { - status = "disable"; - compatible = "samsung,s2mu106-charger"; - }; - - sec-direct-charger { - charger,main_charger = "s2mu106-charger"; - charger,direct_charger = "pca9468-charger"; - }; - - 12c@13 { - - s2mu107-fuelgauge@3B { - status = "disabled"; - }; - - pca9468@57 { - compatible = "nxp,pca9468"; - reg = <0x57>; - pinctrl-names = "default"; - pinctrl-0 = <&dc_irq_default>; - - pca9468,irq-gpio = <&tlmm 57 GPIO_ACTIVE_LOW>; /* DC_IRQ_N */ - pca9468,input-current-limit = <2570000>; /* 2.57A */ - pca9468,charging-current = <6000000>; /* 6A */ - pca9468,input-itopoff = <500000>; /* 500mA */ - pca9468,sense-resistance = <0>; /* 5mOhm */ - pca9468,switching-frequency = <3>; /* 980KHz */ - pca9468,ntc-threshold = <0>; /* disable */ - pca9468,chg_gpio_en = <&tlmm 55 GPIO_ACTIVE_HIGH>; /* DC_CPEN */ - pca9468,ta-mode = <1>; /* 2:1 charging mode */ - }; - - flash_led { - reg = <0x74>; - compatible = "qcom,s2mu106-fled"; - enable = <1 1>; - flash-gpio = <&tlmm 22 0>; - torch-gpio = <&tlmm 24 0>; - pinctrl-names = "fled_default", "fled_suspend"; - pinctrl-0 = <&cam_flash_active &cam_torch_active>; - pinctrl-1 = <&cam_flash_suspend &cam_torch_suspend>; - factory_current = <300>; - flashlight_current = <25 75 100 150 200>; - status = "okay"; - }; - }; - - 12c@14 { - s2mu106-fuelgauge@3B{ - compatible = "samsung,s2mu106-fuelgauge"; - reg = <0x3B>; - pinctrl-names = "default"; - pinctrl-0 = <&fuel_irq>; - fuelgauge,fuel_int = <&tlmm 104 0>; - fuelgauge,charger_name = "s2mu106-charger"; - fuelgauge,fuel_alert_soc = <1>; - fuelgauge,fuel_alert_vol = <3300>; - fuelgauge,low_temp_limit = <100>; - fuelgauge,capacity_max = <990>; - fuelgauge,capacity_max_margin = <200>; - fuelgauge,capacity_min = <0>; - fuelgauge,capacity_calculation_type = <28>; - fuelgauge,capacity_full = <3000>; - fuelgauge,type_str = "SDI"; - fuelgauge,fg_log_enable = <1>; - - fuelgauge,low_voltage_limit = <3450>; - fuelgauge,low_voltage_limit_lowtemp = <3000>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r00.dtsi deleted file mode 100755 index 4cee8bcbd2fb..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r00.dtsi +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../../drivers/gpu/drm/msm/samsung/ANA6705_AMS670TD01/dsi_panel_ANA6705_AMS670TD01_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio11","gpio69", "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio11","gpio69", "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio11","gpio69", "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio11","gpio69", "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; -}; - -&soc { - /* A70s panel */ - ss_dsi_panel_ANA6705_AMS670TD01_FHD_display: qcom,dsi-display@9 { - label = "ss_dsi_panel_ANA6705_AMS670TD01_FHD"; - qcom,display-type = "primary"; - - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@10 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - - }; -}; - -&sde_dsi { - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_te_active &sde_dsi_active>; - pinctrl-1 = <&sde_te_suspend &sde_dsi_suspend>; - qcom,dsi-display-list = - <&ss_dsi_panel_ANA6705_AMS670TD01_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; -}; - -&ss_dsi_panel_ANA6705_AMS670TD01_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_ANA6705_AMS670TD01_FHD>; - - qcom,platform-en-gpio = <&tlmm 69 0>; /* LCD_EN_3P0 */ - qcom,platform-reset-gpio = <&tlmm 11 0>; /* OCTA_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-en-gpio = <&tlmm 69 0>; - qcom,platform-reset-gpio = <&tlmm 11 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; - diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r01.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r01.dtsi deleted file mode 100755 index abdffd6192ed..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r01.dtsi +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../../drivers/gpu/drm/msm/samsung/ANA6705_AMS667UK01/dsi_panel_ANA6705_AMS667UK01_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio11","gpio69","gpio64"; - function = "gpio"; - }; - - config { - pins = "gpio11","gpio69","gpio64"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio11","gpio69", "gpio64"; - function = "gpio"; - }; - - config { - pins = "gpio11","gpio69", "gpio64"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_esd_active: sde_esd_active { /*EL_ON1_DET gpio*/ - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_esd_suspend: sde_esd_suspend { - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; -}; - -&soc { - /* A70s panel */ - ss_dsi_panel_ANA6705_AMS667UK01_FHD_display: qcom,dsi-display@9 { - label = "ss_dsi_panel_ANA6705_AMS667UK01_FHD"; - qcom,display-type = "primary"; - - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@10 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - - }; -}; - -&sde_dsi { - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_te_active &sde_dsi_active &sde_esd_active>; - pinctrl-1 = <&sde_te_suspend &sde_dsi_suspend &sde_esd_suspend>; - qcom,dsi-display-list = - <&ss_dsi_panel_ANA6705_AMS667UK01_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; -}; - -&ss_dsi_panel_ANA6705_AMS667UK01_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_ANA6705_AMS667UK01_FHD>; - - qcom,platform-en-gpio = <&tlmm 69 0>; /* LCD_EN_3P0 */ - qcom,platform-reset-gpio = <&tlmm 11 0>; /* OCTA_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - samsung,support-optical-fingerprint; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-en-gpio = <&tlmm 69 0>; - qcom,platform-reset-gpio = <&tlmm 11 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; - diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r02.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r02.dtsi deleted file mode 100755 index c32449be9e80..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r02.dtsi +++ /dev/null @@ -1,180 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../../drivers/gpu/drm/msm/samsung/S6E3FA9_AMS667UK01/dsi_panel_S6E3FA9_AMS667UK01_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio11","gpio69", "gpio64"; - function = "gpio"; - }; - - config { - pins = "gpio11","gpio69", "gpio64"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio11","gpio69", "gpio64"; - function = "gpio"; - }; - - config { - pins = "gpio11","gpio69", "gpio64"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - }; - - pmx_sde_te { - sde_te_active: sde_te_active { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_te_suspend: sde_te_suspend { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - pmx_sde_octa_det { - sde_octa_det_active: sde_octa_det_active { - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_octa_det_suspend: sde_octa_det_suspend { - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - sde_esd_active: sde_esd_active { /*EL_ON1_DET gpio*/ - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_esd_suspend: sde_esd_suspend { - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; -}; - -&soc { - ss_dsi_panel_S6E3FA9_AMS667UK01_FHD_display: qcom,dsi-display@0 { - label = "ss_dsi_panel_S6E3FA9_AMS667UK01_FHD"; - qcom,display-type = "primary"; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@1 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - }; -}; - -&sde_dsi { - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_te_active &sde_dsi_active &sde_esd_active &sde_octa_det_active>; - pinctrl-1 = <&sde_te_suspend &sde_dsi_suspend &sde_esd_suspend &sde_octa_det_suspend>; - - qcom,dsi-display-list = - <&ss_dsi_panel_S6E3FA9_AMS667UK01_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; -}; - -&ss_dsi_panel_S6E3FA9_AMS667UK01_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_S6E3FA9_AMS667UK01_FHD>; - - qcom,platform-en-gpio = <&tlmm 69 0>; /* LCD_EN_3P0 */ - qcom,platform-reset-gpio = <&tlmm 11 0>; /* OCTA_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // OCTA_CON_DET - samsung,support-optical-fingerprint; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-en-gpio = <&tlmm 69 0>; - qcom,platform-reset-gpio = <&tlmm 11 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r04.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r04.dtsi deleted file mode 100755 index 596625369cd5..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-display-r04.dtsi +++ /dev/null @@ -1,259 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../../drivers/gpu/drm/msm/samsung/S6E3FA9_AMB667UM06/dsi_panel_S6E3FA9_AMB667UM06_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/SELF_DISPLAY/self_display_cmd_FA9.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - -#define DEFAULT_FIXED_VAL 0 - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio11", "gpio64"; - function = "gpio"; - }; - - config { - pins = "gpio11", "gpio64"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio11", "gpio64"; - function = "gpio"; - }; - - config { - pins = "gpio11", "gpio64"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - sde_en_active: sde_en_active { - mux { - pins = "gpio69"; - function = "gpio"; - }; - - config { - pins = "gpio69"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_en_suspend: sde_en_suspend { - mux { - pins = "gpio69"; - function = "gpio"; - }; - - config { - pins = "gpio69"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - pmx_sde_te { - sde_te_active: sde_te_active { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_te_suspend: sde_te_suspend { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - pmx_sde_ub_det { - sde_ub_det_active: sde_ub_det_active { /* UB_CON_DET */ - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - sde_ub_det_suspend: sde_ub_det_suspend { - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - }; - - sde_esd_active: sde_esd_active { /*EL_ON1_DET gpio*/ - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_esd_suspend: sde_esd_suspend { - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; -}; - -&soc { - fixed_reg_octa_vddi: fixed_reg_octa_vddi { - compatible = "regulator-fixed"; - status = "okay"; - regulator-name = "vddi"; - gpio = <&tlmm 69 0>; /* LCD_EN : 3.0 & 1.8 V */ - enable-active-high; - regulator-boot-on; - }; -}; - -&soc { - fixed_reg_octa_vddr: fixed_reg_octa_vddr { - compatible = "regulator-fixed"; - status = "okay"; - regulator-name = "vddr"; - gpio = <&tlmm 64 0>; /* LCD_VDDR_EN : 1.5 V */ - enable-active-high; - regulator-boot-on; - }; -}; - -&soc { - ss_dsi_panel_S6E3FA9_AMB667UM06_FHD_display: qcom,dsi-display@0 { - label = "ss_dsi_panel_S6E3FA9_AMB667UM06_FHD"; - qcom,display-type = "primary"; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@1 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - }; -}; - -&sde_dsi { - vddi-supply = <&fixed_reg_octa_vddi>; - vddr-supply = <&fixed_reg_octa_vddr>; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_en_active &sde_te_active &sde_dsi_active &sde_esd_active &sde_ub_det_active>; - pinctrl-1 = <&sde_en_suspend &sde_te_suspend &sde_dsi_suspend &sde_esd_suspend &sde_ub_det_suspend>; - - qcom,dsi-display-list = - <&ss_dsi_panel_S6E3FA9_AMB667UM06_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; -}; - -&ss_dsi_panel_S6E3FA9_AMB667UM06_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_S6E3FA9_AMB667UM06_FHD>; - - //qcom,platform-en-gpio = <&tlmm 69 0>; /* LCD_EN_3P0 */ - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - samsung,support-optical-fingerprint; - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - qcom,panel-supply-entry@1 { - reg = <1>; - qcom,supply-name = "vddr"; // 1.5 V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-reset-gpio = <&tlmm 11 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-common.dtsi deleted file mode 100755 index a313752f7cda..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-common.dtsi +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - samsung,vibrator { - compatible = "samsung_vib"; -// samsung,vib_pwm = <&tlmm 136 0>; -// samsung,vib_power = <&pm8150_gpios 10 0>; -// samsung,gp_clk = <0x00164000>; // Address of GP1 clock - samsung,chip_model = <4>; // using max77705 driver - samsung,vib_type = "COINDC"; - status = "ok"; - - pinctrl-names = "tlmm_pwm_default"; - pinctrl-0 = <&pwm_out_gpio6_default>; - pwms = <&pm6150l_pwm 0 1000000>; - - }; - - hall { - status = "okay"; - compatible = "hall"; - linux,input-type = <1>; - linux,code = <21>; - hall,gpio_flip_cover = <&tlmm 91 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&hall_default>; - }; - - certify_hall { - status = "okay"; - compatible = "certify_hall"; - linux,input-type = <1>; - linux,code = <27>; - certify_hall,gpio_certify_cover = <&tlmm 93 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&certify_hall_default>; - }; - - usb_noti: usb-notifier { - compatible = "samsung,usb-notifier"; - qcom,disable_control_en = <1>; - qcom,unsupport_host_en = <0>; - }; -}; - -&usb0 { - dwc3@a600000 { - usb-phy = <&qusb_phy0>, <&usb_nop_phy>; - maximum-speed = "high-speed"; - }; -}; - -&usb_qmp_dp_phy { - status = "disabled"; -}; - -&pm6150l_gpios { - pwm_out_gpio6 { - pwm_out_gpio6_default: pwm_out_gpio6_default { - pins = "gpio6"; - function = "func1"; - bias-disable; - power-source = <0>; - output-low; - qcom,drive-strength = <3>; - drive-push-pull; - }; - }; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x1c 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x72 0x240 /* TUNE1 */ - 0x2b 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x02 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,qusb-phy-host-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x1c 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0xf2 0x240 /* TUNE1 */ - 0x2b 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x02 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,diff_tune_host = <(2)>; /* efuse(0x3) + 0 = 7 for tune high value */ - qcom,diff_tune_device = <(4)>; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-r00.dtsi deleted file mode 100755 index ce5252e6dbd8..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-r00.dtsi +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -&i2c_13 { - s2mu107@3A { - status = "okay"; - compatible = "samsung,s2mu107mfd"; - reg = <0x3A>; - pinctrl-names = "default"; - pinctrl-0 = <&if_pmic_irq>; - s2mu107,irq-gpio = <&tlmm 68 0>; - s2mu107,wakeup; - }; - - usbpd-s2mu107@3C { - status = "okay"; - compatible = "s2mu107-usbpd"; - reg = <0x3C>; - pinctrl-names = "default"; - pinctrl-0 = <&usbpd_irq>; - usbpd,usbpd_int = <&tlmm 32 0>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-r05.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-r05.dtsi deleted file mode 100755 index 04a29108396d..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-r05.dtsi +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a71-eif-r00.dtsi" diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-r06.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-r06.dtsi deleted file mode 100755 index 1cc966ce6b77..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-eif-r06.dtsi +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&i2c_13 { - s2mu106@3D { - status = "okay"; - compatible = "samsung,s2mu106mfd"; - reg = <0x3D>; - pinctrl-names = "default"; - pinctrl-0 = <&if_pmic_irq>; - s2mu106,irq-gpio = <&tlmm 68 0>; - s2mu106,wakeup; - }; -}; - -&i2c_14 { - usbpd-s2mu106@3C { - compatible = "s2mu106-usbpd"; - status = "okay"; - reg = <0x3C>; - pinctrl-names = "default"; - pinctrl-0 = <&usbpd_irq>; - usbpd,usbpd_int = <&tlmm 32 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-fingerprint_00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-fingerprint_00.dtsi deleted file mode 100755 index 96079be584a5..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-fingerprint_00.dtsi +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - etspi_rstpin { - etspi_rstpin: etspi_rstpin { - mux { - pins = "gpio58"; - function = "gpio"; - }; - config { - pins = "gpio58"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; -}; - -&pm6150l_l7 { - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; -}; - -&soc { - qupv3_se6_spi: spi@0xa80000 { - status = "okay"; - - etspi-spi@0 { - compatible = "etspi,et7xx"; - reg = <0>; - spi-max-frequency = <50000000>; - etspi-min_cpufreq_limit = <2169600>; - - pinctrl-names = "default"; - pinctrl-0 = <&etspi_rstpin>; - - gpio-controller; - #gpio-cells = <2>; - - etspi-regulator = "pm6150l_l7"; - etspi-sleepPin = <&tlmm 58 0>; - etspi-chipid = "ET713"; - etspi-modelinfo = "A715"; - etspi-position = "14.42,0.00,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; - etspi-rb = "555,-1,-1"; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-mst-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-mst-r00.dtsi deleted file mode 100755 index 46160187ad33..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-mst-r00.dtsi +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2019, Samsung Electronics Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - sec-mst { - compatible = "sec-mst"; - sec-mst,mst-pwr-gpio = <&tlmm 5 0>; - sec-mst,mst-data-gpio = <&tlmm 83 0>; - sec-mst,mst-en-gpio = <&tlmm 84 0>; - sec-mst,mst-support-gpio = <&pm6150l_gpios 4 0>; - - //pinctrl-names = "mst_active"; - //pinctrl-0 = <&mst_data_init &mst_en_init>; - }; -/* - tlmm: pinctrl@03000000 { - mst_data_init: mst_data_init { - mux { - pins = "gpio84"; - function = "gpio"; - }; - config { - pins = "gpio84"; - drive-strength = <16>; - bias-pull-down; - output_low; - }; - }; - mst_en_init: mst_en_init { - mux { - pins = "gpio83"; - function = "gpio"; - }; - config { - pins = "gpio83"; - drive-strength = <16>; - bias-pull-down; - output_low; - }; - }; - }; -*/ -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-nfc-r00.dtsi deleted file mode 100755 index 0e0a9960e7d3..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-a71-nfc-r00.dtsi +++ /dev/null @@ -1,99 +0,0 @@ - -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi2 = &qupv3_se1_spi; - }; -}; -*/ - -&tlmm { - ese_qupv3_se1_spi_sleep: qupv3_se1_spi_sleep { - mux { - pins = "gpio0", "gpio1", "gpio2", - "gpio3"; - function = "gpio"; - }; - - config { - pins = "gpio0", "gpio1", "gpio2", - "gpio3"; - drive-strength = <6>; - bias-pull-down; - output-low; - }; - }; - - nfc_qupv3_se2_i2c_sleep: nfc_qupv3_se2_i2c_sleep { - mux { - pins = "gpio34", "gpio35"; - function = "gpio"; - }; - - config { - pins = "gpio34", "gpio35"; - drive-strength = <2>; - bias-disable; - }; - }; -}; - -&pm6150l_gpios { - nfc_det_gpio: nfc_det_gpio { - pins = "gpio1"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; - -/* gpio34 and gpio35 are used for nfc i2c */ -&qupv3_se2_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se2_i2c_sleep>; - - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <37 0>; - pn547,irq-gpio = <&tlmm 37 0>; - pn547,ven-gpio = <&tlmm 12 0>; - pn547,firm-gpio = <&tlmm 36 0>; - pn547,clk_req-gpio = <&tlmm 31 0>; /* BBCLK3 is controled by gpio 31 */ - pn547,pwr_req = <&tlmm 94 0>; - pn547,pvdd-gpio = <&tlmm 65 0>; - /* pn547,nfc-det-gpio = <&pm6150l_gpios 1 0>; */ /* need to be checked */ - pn547,clk_req_wake; - }; -}; - -/* gpio 0~3 are used for ese spi */ -&qupv3_se1_spi { - status = "okay"; - spi-max-frequency = <19200000>; - pinctrl-1 = <&ese_qupv3_se1_spi_sleep>; - - ese_spi@0 { - compatible = "p61"; - reg = <0>; - spi-max-frequency = <16000000>; - p61-ap_vendor = "qualcomm"; - p61-spi_node = <&qupv3_se1_spi>; - ese-det-gpio = <&pm6150l_gpios 1 0>; /* eSE_UICC_CHECK */ - pinctrl-names = "default"; - pinctrl-0 = <&nfc_det_gpio>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-audio-pinctrl.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-audio-pinctrl.dtsi deleted file mode 100755 index 141e54225702..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-audio-pinctrl.dtsi +++ /dev/null @@ -1,32 +0,0 @@ -&tlmm { - /* WSA speaker reset pins */ - spkr_reset_n { - spkr_reset_n_active: spkr_reset_n_active { - mux { - pins = "gpio8"; - function = "gpio"; - }; - - config { - pins = "gpio8"; - drive-strength = <16>; /* 16 mA */ - bias-disable; - output-high; - }; - }; - - spkr_reset_n_sleep: spkr_reset_n_sleep { - mux { - pins = "gpio8"; - function = "gpio"; - }; - - config { - pins = "gpio8"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; - input-enable; - }; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-audio.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-audio.dtsi deleted file mode 100755 index 4b5de23f9e8b..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-audio.dtsi +++ /dev/null @@ -1,142 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&bolero { - qcom,num-macros = <4>; - imp_list: imp_list { - #list-imp-cells = <3>; - }; -}; - -&wcd937x_codec { - qcom,cdc-micbias2-mv = <2800>; - imp-table = <&imp_list 0 5 6>, - <&imp_list 6 23 8>, - <&imp_list 24 38 7>, - <&imp_list 39 100 6>, - <&imp_list 101 160 10>, - <&imp_list 161 400 11>, - <&imp_list 401 2000 11>, - <&imp_list 2001 0x7fffffff 6>; -}; - -&sm6150_snd { - qcom,model = "sm6150-idp-snd-card"; - qcom,msm-mi2s-master = <1>, <1>, <1>, <1>, <1>; - qcom,ext-disp-audio-rx = <1>; - - asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>, - <&loopback>, <&compress>, <&hostless>, - <&afe>, <&lsm>, <&routing>, <&compr>, - <&pcm_noirq>, <&samsung_q6audio_adaptation>; - asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", - "msm-pcm-dsp.2", "msm-voip-dsp", - "msm-pcm-voice", "msm-pcm-loopback", - "msm-compress-dsp", "msm-pcm-hostless", - "msm-pcm-afe", "msm-lsm-client", - "msm-pcm-routing", "msm-compr-dsp", - "msm-pcm-dsp-noirq", "q6audio-adaptation"; - qcom,audio-routing = - "AMIC1", "MIC BIAS1", - "MIC BIAS1", "Analog Mic1", - "AMIC2", "MIC BIAS2", - "MIC BIAS2", "Analog Mic2", - "AMIC3", "MIC BIAS3", - "MIC BIAS3", "Analog Mic3", - "IN1_HPHL", "HPHL_OUT", - "IN2_HPHR", "HPHR_OUT", - "IN3_AUX", "AUX_OUT", - "TX SWR_ADC0", "ADC1_OUTPUT", - "TX SWR_ADC2", "ADC2_OUTPUT", - "WSA SRC0_INP", "SRC0", - "WSA_TX DEC0_INP", "TX DEC0 MUX", - "WSA_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC0_INP", "TX DEC0 MUX", - "RX_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC2_INP", "TX DEC2 MUX", - "RX_TX DEC3_INP", "TX DEC3 MUX", - "SpkrLeft IN", "WSA_SPK1 OUT"; - qcom,msm-mbhc-hs-mic-max-threshold-mv = <9999>; - qcom,msm-mbhc-hs-mic-min-threshold-mv = <640>; - qcom,msm-mbhc-hphl-swh = <1>; - qcom,msm-mbhc-gnd-swh = <0>; - qcom,cdc-dmic01-gpios = <0>; - qcom,cdc-dmic23-gpios = <0>; - qcom,fm-lna-gpios = <&tlmm 21 0>; - asoc-codec = <&stub_codec>, <&bolero>, <&ext_disp_audio_codec>; - asoc-codec-names = "msm-stub-codec.1", "bolero_codec", - "msm-ext-disp-audio-codec-rx"; - qcom,wsa-max-devs = <1>; - qcom,wsa-devs = <&wsa881x_0213>; - qcom,wsa-aux-dev-prefix = "SpkrLeft"; - - qcom,codec-max-aux-devs = <1>; - qcom,codec-aux-devs = <&wcd937x_codec>; - qcom,msm_audio_ssr_devs = <&audio_apr>, <&q6core>, - <&lpi_tlmm>, <&bolero>; - mbhc-button-thres = <&det_zones 13 63>, - <&det_zones 88 138>, - <&det_zones 125 125>, - <&det_zones 225 225>, - <&det_zones 500 500>, - <&det_zones 620 620>, - <&det_zones 620 620>, - <&det_zones 620 620>; -}; - -&wsa_spkr_en1 { - pinctrl-0 = <&spkr_reset_n_active>; - pinctrl-1 = <&spkr_reset_n_sleep>; -}; - -&soc { - det_zones: det_zones { - #list-det-cells = <2>; - }; - - samsung_q6audio_adaptation: samsung,q6audio-adaptation { - compatible = "samsung,q6audio-adaptation"; - adaptation,voice-tracking-tx-port-id = <0xB037>; - adaptation,amp-rx-port-id = <0xB000>; - }; -}; - -&wsa_macro { - #cooling-cells = <2>; -}; - -&thermal_zones { - aoss-lowc { - cooling-maps { - audio_cdev { - cooling-device = <&wsa_macro 1 1>; - }; - }; - }; -}; - -&wsa_spkr_en2 { - status = "disabled"; -}; -&fsa4480 { - status = "disabled"; -}; -&wsa881x_0211 { - status = "disabled"; -}; -&wsa881x_0212 { - status = "disabled"; -}; -&wsa881x_0214 { - status = "disabled"; -}; - diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-battery-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-battery-r00.dtsi deleted file mode 100755 index 1c4e71b30d25..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-battery-r00.dtsi +++ /dev/null @@ -1,12 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-display-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-display-r00.dtsi deleted file mode 100755 index 41d3c1033cec..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-display-r00.dtsi +++ /dev/null @@ -1,260 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include "../../../../../../drivers/gpu/drm/msm/samsung/SW83106/dsi_panel_SW83106_fdh_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - -#define DEFAULT_FIXED_VAL 0 - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio11", "gpio64"; - function = "gpio"; - }; - - config { - pins = "gpio11", "gpio64"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio11", "gpio64"; - function = "gpio"; - }; - - config { - pins = "gpio11", "gpio64"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - sde_en_active: sde_en_active { - mux { - pins = "gpio69"; - function = "gpio"; - }; - - config { - pins = "gpio69"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_en_suspend: sde_en_suspend { - mux { - pins = "gpio69"; - function = "gpio"; - }; - - config { - pins = "gpio69"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - pmx_sde_te { - sde_te_active: sde_te_active { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_te_suspend: sde_te_suspend { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - pmx_sde_ub_det { - sde_ub_det_active: sde_ub_det_active { /* UB_CON_DET */ - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - sde_ub_det_suspend: sde_ub_det_suspend { - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - }; - - sde_esd_active: sde_esd_active { /*EL_ON1_DET gpio*/ - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_esd_suspend: sde_esd_suspend { - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; -}; - -&soc { - fixed_reg_octa_vddi: fixed_reg_octa_vddi { - compatible = "regulator-fixed"; - status = "okay"; - regulator-name = "vddi"; - gpio = <&tlmm 69 0>; /* LCD_EN : 3.0 & 1.8 V */ - enable-active-high; - regulator-boot-on; - }; -}; - -&soc { - fixed_reg_octa_vddr: fixed_reg_octa_vddr { - compatible = "regulator-fixed"; - status = "okay"; - regulator-name = "vddr"; - gpio = <&tlmm 64 0>; /* LCD_VDDR_EN : 1.5 V */ - enable-active-high; - regulator-boot-on; - }; -}; - -&soc { - ss_dsi_panel_SW83106_FHD_display: qcom,dsi-display@0 { - label = "ss_dsi_panel_SW83106_FHD"; - qcom,display-type = "primary"; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@1 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - }; -}; - -&sde_dsi { - vddi-supply = <&fixed_reg_octa_vddi>; - vddr-supply = <&fixed_reg_octa_vddr>; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_en_active &sde_te_active &sde_dsi_active &sde_esd_active &sde_ub_det_active>; - pinctrl-1 = <&sde_en_suspend &sde_te_suspend &sde_dsi_suspend &sde_esd_suspend &sde_ub_det_suspend>; - - qcom,dsi-display-list = - <&ss_dsi_panel_SW83106_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; -}; - -&ss_dsi_panel_SW83106_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_SW83106_FHD>; - - //qcom,platform-en-gpio = <&tlmm 69 0>; /* LCD_EN_3P0 */ - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - samsung,ub-fd-gpio = <&tlmm 63 0>; // fast discharge - samsung,ub-fd-on-count = <25> ; - samsung,ub-fd-off-count = <26> ; - samsung,support-optical-fingerprint; - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - qcom,panel-supply-entry@1 { - reg = <1>; - qcom,supply-name = "vddr"; // 1.5 V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-reset-gpio = <&tlmm 11 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-eif-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-eif-common.dtsi deleted file mode 100755 index 0ff5c9d48041..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-eif-common.dtsi +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - samsung,vibrator { - compatible = "samsung_vib"; -// samsung,vib_pwm = <&tlmm 136 0>; -// samsung,vib_power = <&pm8150_gpios 10 0>; -// samsung,gp_clk = <0x00164000>; // Address of GP1 clock - samsung,chip_model = <4>; // using max77705 driver - samsung,vib_type = "COINDC"; - status = "ok"; - - pinctrl-names = "tlmm_pwm_default"; - pinctrl-0 = <&pwm_out_gpio6_default>; - pwms = <&pm6150l_pwm 0 1000000>; - - }; - - usb_noti: usb-notifier { - compatible = "samsung,usb-notifier"; - qcom,disable_control_en = <1>; - qcom,unsupport_host_en = <0>; - }; -}; - -&usb0 { - dwc3@a600000 { - usb-phy = <&qusb_phy0>, <&usb_nop_phy>; - maximum-speed = "high-speed"; - }; -}; - -&usb_qmp_dp_phy { - status = "disabled"; -}; - -&pm6150l_gpios { - pwm_out_gpio6 { - pwm_out_gpio6_default: pwm_out_gpio6_default { - pins = "gpio6"; - function = "func1"; - bias-disable; - power-source = <0>; - output-low; - qcom,drive-strength = <3>; - drive-push-pull; - }; - }; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x1c 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x72 0x240 /* TUNE1 */ - 0x2b 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x02 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,qusb-phy-host-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x1c 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0xf2 0x240 /* TUNE1 */ - 0x2b 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x02 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,diff_tune_host = <(2)>; /* efuse(0x3) + 0 = 7 for tune high value */ - qcom,diff_tune_device = <(4)>; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-eif-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-eif-r00.dtsi deleted file mode 100755 index 1cc966ce6b77..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-eif-r00.dtsi +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&i2c_13 { - s2mu106@3D { - status = "okay"; - compatible = "samsung,s2mu106mfd"; - reg = <0x3D>; - pinctrl-names = "default"; - pinctrl-0 = <&if_pmic_irq>; - s2mu106,irq-gpio = <&tlmm 68 0>; - s2mu106,wakeup; - }; -}; - -&i2c_14 { - usbpd-s2mu106@3C { - compatible = "s2mu106-usbpd"; - status = "okay"; - reg = <0x3C>; - pinctrl-names = "default"; - pinctrl-0 = <&usbpd_irq>; - usbpd,usbpd_int = <&tlmm 32 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-fingerprint_00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-fingerprint_00.dtsi deleted file mode 100755 index 96079be584a5..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-fingerprint_00.dtsi +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - etspi_rstpin { - etspi_rstpin: etspi_rstpin { - mux { - pins = "gpio58"; - function = "gpio"; - }; - config { - pins = "gpio58"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; -}; - -&pm6150l_l7 { - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; -}; - -&soc { - qupv3_se6_spi: spi@0xa80000 { - status = "okay"; - - etspi-spi@0 { - compatible = "etspi,et7xx"; - reg = <0>; - spi-max-frequency = <50000000>; - etspi-min_cpufreq_limit = <2169600>; - - pinctrl-names = "default"; - pinctrl-0 = <&etspi_rstpin>; - - gpio-controller; - #gpio-cells = <2>; - - etspi-regulator = "pm6150l_l7"; - etspi-sleepPin = <&tlmm 58 0>; - etspi-chipid = "ET713"; - etspi-modelinfo = "A715"; - etspi-position = "14.42,0.00,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; - etspi-rb = "555,-1,-1"; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-mst-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-mst-r00.dtsi deleted file mode 100755 index 46160187ad33..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-mst-r00.dtsi +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2019, Samsung Electronics Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - sec-mst { - compatible = "sec-mst"; - sec-mst,mst-pwr-gpio = <&tlmm 5 0>; - sec-mst,mst-data-gpio = <&tlmm 83 0>; - sec-mst,mst-en-gpio = <&tlmm 84 0>; - sec-mst,mst-support-gpio = <&pm6150l_gpios 4 0>; - - //pinctrl-names = "mst_active"; - //pinctrl-0 = <&mst_data_init &mst_en_init>; - }; -/* - tlmm: pinctrl@03000000 { - mst_data_init: mst_data_init { - mux { - pins = "gpio84"; - function = "gpio"; - }; - config { - pins = "gpio84"; - drive-strength = <16>; - bias-pull-down; - output_low; - }; - }; - mst_en_init: mst_en_init { - mux { - pins = "gpio83"; - function = "gpio"; - }; - config { - pins = "gpio83"; - drive-strength = <16>; - bias-pull-down; - output_low; - }; - }; - }; -*/ -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-nfc-r00.dtsi deleted file mode 100755 index 0e0a9960e7d3..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m41-nfc-r00.dtsi +++ /dev/null @@ -1,99 +0,0 @@ - -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi2 = &qupv3_se1_spi; - }; -}; -*/ - -&tlmm { - ese_qupv3_se1_spi_sleep: qupv3_se1_spi_sleep { - mux { - pins = "gpio0", "gpio1", "gpio2", - "gpio3"; - function = "gpio"; - }; - - config { - pins = "gpio0", "gpio1", "gpio2", - "gpio3"; - drive-strength = <6>; - bias-pull-down; - output-low; - }; - }; - - nfc_qupv3_se2_i2c_sleep: nfc_qupv3_se2_i2c_sleep { - mux { - pins = "gpio34", "gpio35"; - function = "gpio"; - }; - - config { - pins = "gpio34", "gpio35"; - drive-strength = <2>; - bias-disable; - }; - }; -}; - -&pm6150l_gpios { - nfc_det_gpio: nfc_det_gpio { - pins = "gpio1"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; - -/* gpio34 and gpio35 are used for nfc i2c */ -&qupv3_se2_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se2_i2c_sleep>; - - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <37 0>; - pn547,irq-gpio = <&tlmm 37 0>; - pn547,ven-gpio = <&tlmm 12 0>; - pn547,firm-gpio = <&tlmm 36 0>; - pn547,clk_req-gpio = <&tlmm 31 0>; /* BBCLK3 is controled by gpio 31 */ - pn547,pwr_req = <&tlmm 94 0>; - pn547,pvdd-gpio = <&tlmm 65 0>; - /* pn547,nfc-det-gpio = <&pm6150l_gpios 1 0>; */ /* need to be checked */ - pn547,clk_req_wake; - }; -}; - -/* gpio 0~3 are used for ese spi */ -&qupv3_se1_spi { - status = "okay"; - spi-max-frequency = <19200000>; - pinctrl-1 = <&ese_qupv3_se1_spi_sleep>; - - ese_spi@0 { - compatible = "p61"; - reg = <0>; - spi-max-frequency = <16000000>; - p61-ap_vendor = "qualcomm"; - p61-spi_node = <&qupv3_se1_spi>; - ese-det-gpio = <&pm6150l_gpios 1 0>; /* eSE_UICC_CHECK */ - pinctrl-names = "default"; - pinctrl-0 = <&nfc_det_gpio>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-audio-pinctrl.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-audio-pinctrl.dtsi deleted file mode 100755 index 141e54225702..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-audio-pinctrl.dtsi +++ /dev/null @@ -1,32 +0,0 @@ -&tlmm { - /* WSA speaker reset pins */ - spkr_reset_n { - spkr_reset_n_active: spkr_reset_n_active { - mux { - pins = "gpio8"; - function = "gpio"; - }; - - config { - pins = "gpio8"; - drive-strength = <16>; /* 16 mA */ - bias-disable; - output-high; - }; - }; - - spkr_reset_n_sleep: spkr_reset_n_sleep { - mux { - pins = "gpio8"; - function = "gpio"; - }; - - config { - pins = "gpio8"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; - input-enable; - }; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-audio.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-audio.dtsi deleted file mode 100755 index 375165bffb57..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-audio.dtsi +++ /dev/null @@ -1,146 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&bolero { - qcom,num-macros = <4>; - imp_list: imp_list { - #list-imp-cells = <3>; - }; -}; - -&wcd937x_codec { - qcom,cdc-micbias2-mv = <2800>; - imp-table = <&imp_list 0 5 6>, - <&imp_list 6 23 8>, - <&imp_list 24 38 7>, - <&imp_list 39 100 6>, - <&imp_list 101 160 10>, - <&imp_list 161 400 11>, - <&imp_list 401 2000 11>, - <&imp_list 2001 0x7fffffff 6>; -}; - -&sm6150_snd { - qcom,model = "sm6150-idp-snd-card"; - qcom,msm-mi2s-master = <1>, <1>, <1>, <1>, <1>; - qcom,ext-disp-audio-rx = <1>; - - asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>, - <&loopback>, <&compress>, <&hostless>, - <&afe>, <&lsm>, <&routing>, <&compr>, - <&pcm_noirq>, <&samsung_q6audio_adaptation>; - asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", - "msm-pcm-dsp.2", "msm-voip-dsp", - "msm-pcm-voice", "msm-pcm-loopback", - "msm-compress-dsp", "msm-pcm-hostless", - "msm-pcm-afe", "msm-lsm-client", - "msm-pcm-routing", "msm-compr-dsp", - "msm-pcm-dsp-noirq", "q6audio-adaptation"; - qcom,audio-routing = - "AMIC1", "MIC BIAS1", - "MIC BIAS1", "Analog Mic1", - "AMIC2", "MIC BIAS2", - "MIC BIAS2", "Analog Mic2", - "AMIC3", "MIC BIAS3", - "MIC BIAS3", "Analog Mic3", - "IN1_HPHL", "HPHL_OUT", - "IN2_HPHR", "HPHR_OUT", - "IN3_AUX", "AUX_OUT", - "TX SWR_ADC0", "ADC1_OUTPUT", - "TX SWR_ADC2", "ADC2_OUTPUT", - "WSA SRC0_INP", "SRC0", - "WSA_TX DEC0_INP", "TX DEC0 MUX", - "WSA_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC0_INP", "TX DEC0 MUX", - "RX_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC2_INP", "TX DEC2 MUX", - "RX_TX DEC3_INP", "TX DEC3 MUX", - "SpkrLeft IN", "WSA_SPK1 OUT"; - qcom,msm-mbhc-hs-mic-max-threshold-mv = <9999>; - qcom,msm-mbhc-hs-mic-min-threshold-mv = <640>; - qcom,msm-mbhc-hphl-swh = <1>; - qcom,msm-mbhc-gnd-swh = <0>; - qcom,cdc-dmic01-gpios = <0>; - qcom,cdc-dmic23-gpios = <0>; - qcom,fm-lna-gpios = <&tlmm 21 0>; - asoc-codec = <&stub_codec>, <&bolero>, <&ext_disp_audio_codec>; - asoc-codec-names = "msm-stub-codec.1", "bolero_codec", - "msm-ext-disp-audio-codec-rx"; - qcom,wsa-max-devs = <1>; - qcom,wsa-devs = <&wsa881x_0213>; - qcom,wsa-aux-dev-prefix = "SpkrLeft"; - - qcom,codec-max-aux-devs = <1>; - qcom,codec-aux-devs = <&wcd937x_codec>; - qcom,msm_audio_ssr_devs = <&audio_apr>, <&q6core>, - <&lpi_tlmm>, <&bolero>; - mbhc-button-thres = <&det_zones 13 63>, - <&det_zones 88 138>, - <&det_zones 125 125>, - <&det_zones 225 225>, - <&det_zones 500 500>, - <&det_zones 500 620>, - <&det_zones 500 620>, - <&det_zones 500 620>; -}; - -&wsa_spkr_en1 { - pinctrl-0 = <&spkr_reset_n_active>; - pinctrl-1 = <&spkr_reset_n_sleep>; -}; - -&soc { - det_zones: det_zones { - #list-det-cells = <2>; - }; - sec-audio-sysfs { - compatible = "samsung,audio-sysfs"; - status = "okay"; - audio,num-amp = <1>; - }; - samsung_q6audio_adaptation: samsung,q6audio-adaptation { - compatible = "samsung,q6audio-adaptation"; - adaptation,voice-tracking-tx-port-id = <0xB037>; - adaptation,amp-rx-port-id = <0xB000>; - }; -}; - -&wsa_macro { - #cooling-cells = <2>; -}; - -&thermal_zones { - aoss-lowc { - cooling-maps { - audio_cdev { - cooling-device = <&wsa_macro 1 1>; - }; - }; - }; -}; - -&wsa_spkr_en2 { - status = "disabled"; -}; -&fsa4480 { - status = "disabled"; -}; -&wsa881x_0211 { - status = "disabled"; -}; -&wsa881x_0212 { - status = "disabled"; -}; -&wsa881x_0214 { - status = "disabled"; -}; - diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-battery-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-battery-r00.dtsi deleted file mode 100755 index 1c4e71b30d25..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-battery-r00.dtsi +++ /dev/null @@ -1,12 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-battery-r02.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-battery-r02.dtsi deleted file mode 100755 index 5243334b8104..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-battery-r02.dtsi +++ /dev/null @@ -1,235 +0,0 @@ -/* Copyright (c) 2020, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -&soc { -battery_params { - battery,battery_data = - < - /***** battery data for 4.38 *****/ - /* battery,battery_table3 */ - 160 10 23 10 159 9 46 9 195 8 - 96 8 6 8 184 7 113 7 17 7 - 196 6 150 6 115 6 89 6 67 6 - 43 6 4 6 214 5 150 5 123 5 - 159 3 84 2 0 8 154 7 53 7 - 207 6 105 6 4 6 158 5 57 5 - 211 4 109 4 8 4 162 3 60 3 - 215 2 113 2 11 2 166 1 64 1 - 219 0 117 0 15 0 248 15 - - - /* battery,battery_table4 */ - 10 10 10 10 41 41 41 41 41 41 - 41 42 42 42 42 43 43 43 44 46 - 79 154 - - - /* battery,batcap */ - 0x70 0x69 0x7F 0x0E /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x08 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10000 9504 9007 8511 8015 7519 7022 6526 6030 5533 - 5037 4541 4045 3548 3052 2556 2060 1563 1067 571 - 74 (-39) - - /* battery,ocv_arr_val */ - 43280 42611 42027 41475 40952 40469 40030 39647 39301 38835 - 38457 38230 38060 37933 37827 37709 37518 37296 36981 36852 - 34527 32908 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.36 *****/ - /* battery,battery_table3 */ - 160 10 23 10 159 9 46 9 195 8 - 96 8 6 8 184 7 113 7 17 7 - 196 6 150 6 115 6 89 6 67 6 - 43 6 4 6 214 5 150 5 123 5 - 159 3 84 2 8 8 172 7 69 7 - 222 6 120 6 17 6 171 5 68 5 - 222 4 119 4 17 4 170 3 68 3 - 221 2 119 2 16 2 170 1 67 1 - 220 0 118 0 15 0 248 15 - - /* battery,battery_table4 */ - 10 10 10 10 41 41 41 41 41 41 - 41 42 42 42 42 43 43 43 44 46 - 79 154 - - - /* battery,batcap */ - 0x18 0x6A 0xE4 0x13 /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x08 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10088 9588 9087 8586 8086 7585 7084 6584 6083 5582 - 5082 4581 4080 3580 3079 2578 2078 1577 1076 576 - 75 (-39) - - /* battery,ocv_arr_val */ - 43280 42611 42027 41475 40952 40469 40030 39647 39301 38835 - 38457 38230 38060 37933 37827 37709 37518 37296 36981 36852 - 34527 32908 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.34 *****/ - /* battery,battery_table3 */ - 160 10 23 10 159 9 46 9 195 8 - 96 8 6 8 184 7 113 7 17 7 - 196 6 150 6 115 6 89 6 67 6 - 43 6 4 6 214 5 150 5 123 5 - 159 3 84 2 49 8 201 7 97 7 - 249 6 145 6 41 6 193 5 89 5 - 240 4 136 4 32 4 184 3 80 3 - 232 2 128 2 24 2 176 1 72 1 - 224 0 120 0 16 0 248 15 - - /* battery,battery_table4 */ - 10 10 10 10 41 41 41 41 41 41 - 41 42 42 42 42 43 43 43 44 46 - 79 154 - - /* battery,batcap */ - 0x88 0x68 0x99 0x13 /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10239 9731 9223 8715 8207 7698 7190 6682 6174 5666 - 5158 4650 4141 3633 3125 2617 2109 1601 1093 584 - 76 (-40) - - - /* battery,ocv_arr_val */ - 43280 42611 42027 41475 40952 40469 40030 39647 39301 38835 - 38457 38230 38060 37933 37827 37709 37518 37296 36981 36852 - 34527 32908 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.32 *****/ - /* battery,battery_table3 */ - 160 10 23 10 159 9 46 9 195 8 - 96 8 6 8 184 7 113 7 17 7 - 196 6 150 6 115 6 89 6 67 6 - 43 6 4 6 214 5 150 5 123 5 - 159 3 84 2 84 8 234 7 128 7 - 23 7 173 6 67 6 217 5 111 5 - 6 5 156 4 50 4 200 3 94 3 - 245 2 139 2 33 2 183 1 77 1 - 227 0 122 0 16 0 248 15 - - /* battery,battery_table4 */ - 10 10 10 10 41 41 41 41 41 41 - 41 42 42 42 42 43 43 43 44 46 - 79 154 - - /* battery,batcap */ - 0xD0 0x66 0x47 0x13 /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10410 9894 9377 8861 8344 7827 7311 6794 6277 5761 - 5244 4727 4211 3694 3177 2661 2144 1627 1111 594 - 77 (-40) - - - /* battery,ocv_arr_val */ - 43280 42611 42027 41475 40952 40469 40030 39647 39301 38835 - 38457 38230 38060 37933 37827 37709 37518 37296 36981 36852 - 34527 32908 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.27 *****/ - /* battery,battery_table3 */ - 160 10 23 10 159 9 46 9 195 8 - 96 8 6 8 184 7 113 7 17 7 - 196 6 150 6 115 6 89 6 67 6 - 43 6 4 6 214 5 150 5 123 5 - 159 3 84 2 179 8 68 8 214 7 - 103 7 249 6 138 6 28 6 173 5 - 63 5 208 4 98 4 243 3 133 3 - 22 3 168 2 57 2 203 1 92 1 - 238 0 127 0 17 0 247 15 - - /* battery,battery_table4 */ - 10 10 10 10 41 41 41 41 41 41 - 41 42 42 42 42 43 43 43 44 46 - 79 154 - - /* battery,batcap */ - 0x70 0x62 0x75 0x12 /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10873 10334 9794 9254 8715 8175 7636 7096 6556 6017 - 5477 4938 4398 3858 3319 2779 2239 1700 1160 621 - 81 (-42) - - /* battery,ocv_arr_val */ - 43280 42611 42027 41475 40952 40469 40030 39647 39301 38835 - 38457 38230 38060 37933 37827 37709 37518 37296 36981 36852 - 34527 32908 - - /* battery,tunning */ - 0x00 - >; - - battery,battery_table3 = < - 160 10 23 10 159 9 46 9 195 8 - 96 8 6 8 184 7 113 7 17 7 - 196 6 150 6 115 6 89 6 67 6 - 43 6 4 6 214 5 150 5 123 5 - 159 3 84 2 0 8 154 7 53 7 - 207 6 105 6 4 6 158 5 57 5 - 211 4 109 4 8 4 162 3 60 3 - 215 2 113 2 11 2 166 1 64 1 - 219 0 117 0 15 0 248 15 - >; - - battery,battery_table4 = < - 10 10 10 10 41 41 41 41 41 41 - 41 42 42 42 42 43 43 43 44 46 - 79 154 - >; - - battery,batcap = <0x70 0x69 0x7F 0x0E>; /* [0x0E] [0x0F] [0x10] [0x11] */ - - battery,soc_arr_val = < - 10000 9504 9007 8511 8015 7519 7022 6526 6030 5533 - 5037 4541 4045 3548 3052 2556 2060 1563 1067 571 - 74 (-39) - >; - - battery,ocv_arr_val = < - 43280 42611 42027 41475 40952 40469 40030 39647 39301 38835 - 38457 38230 38060 37933 37827 37709 37518 37296 36981 36852 - 34527 32908 - >; - }; - - battery { - battery,batt_data_version = <4>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r00.dtsi deleted file mode 100755 index 28fea2348f04..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r00.dtsi +++ /dev/null @@ -1,299 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include "../../../../../../drivers/gpu/drm/msm/samsung/SW83106/dsi_panel_SW83106_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/SW83106_WM6676Z21/dsi_panel_SW83106_WM6676Z21_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - -#define DEFAULT_FIXED_VAL 0 - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio11", "gpio64"; - function = "gpio"; - }; - - config { - pins = "gpio11", "gpio64"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio11", "gpio64"; - function = "gpio"; - }; - - config { - pins = "gpio11", "gpio64"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - sde_en_active: sde_en_active { - mux { - pins = "gpio69"; - function = "gpio"; - }; - - config { - pins = "gpio69"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_en_suspend: sde_en_suspend { - mux { - pins = "gpio69"; - function = "gpio"; - }; - - config { - pins = "gpio69"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - pmx_sde_te { - sde_te_active: sde_te_active { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_te_suspend: sde_te_suspend { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - pmx_sde_ub_det { - sde_ub_det_active: sde_ub_det_active { /* UB_CON_DET */ - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - sde_ub_det_suspend: sde_ub_det_suspend { - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - }; - - sde_esd_active: sde_esd_active { /*EL_ON1_DET gpio*/ - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_esd_suspend: sde_esd_suspend { - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; -}; - -&soc { - fixed_reg_octa_vddi: fixed_reg_octa_vddi { - compatible = "regulator-fixed"; - status = "okay"; - regulator-name = "vddi"; - gpio = <&tlmm 69 0>; /* LCD_EN : 3.0 & 1.8 V */ - enable-active-high; - regulator-boot-on; - }; -}; - -&soc { - fixed_reg_octa_vddr: fixed_reg_octa_vddr { - compatible = "regulator-fixed"; - status = "okay"; - regulator-name = "vddr"; - gpio = <&tlmm 64 0>; /* LCD_VDDR_EN : 1.5 V */ - enable-active-high; - regulator-boot-on; - }; -}; - -&soc { - ss_dsi_panel_SW83106_WM6676Z21_FHD_display: qcom,dsi-display@0 { - label = "ss_dsi_panel_SW83106_WM6676Z21_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_SW83106_WM6676Z21_FHD>; - }; - - ss_dsi_panel_SW83106_FHD_display: qcom,dsi-display@1 { - label = "ss_dsi_panel_SW83106_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_SW83106_FHD>; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@2 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - }; -}; - -&sde_dsi { - vddi-supply = <&fixed_reg_octa_vddi>; - vddr-supply = <&fixed_reg_octa_vddr>; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_en_active &sde_te_active &sde_dsi_active &sde_esd_active &sde_ub_det_active>; - pinctrl-1 = <&sde_en_suspend &sde_te_suspend &sde_dsi_suspend &sde_esd_suspend &sde_ub_det_suspend>; - - qcom,dsi-display-list = - <&ss_dsi_panel_SW83106_WM6676Z21_FHD_display - &ss_dsi_panel_SW83106_FHD_display - &ss_dsi_panel_PBA_BOOTING_FHD_display>; -}; - -&ss_dsi_panel_SW83106_WM6676Z21_FHD { - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - qcom,panel-supply-entry@1 { - reg = <1>; - qcom,supply-name = "vddr"; // 1.5 V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_SW83106_FHD { - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - qcom,panel-supply-entry@1 { - reg = <1>; - qcom,supply-name = "vddr"; // 1.5 V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,platform-reset-gpio = <&tlmm 11 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r02.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r02.dtsi deleted file mode 100755 index 5f4de35a377e..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r02.dtsi +++ /dev/null @@ -1,341 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include "../../../../../../drivers/gpu/drm/msm/samsung/SW83106/dsi_panel_SW83106_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/SW83106_WM6676Z21/dsi_panel_SW83106_WM6676Z21_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/S6E3FA9_AMB667UM07/dsi_panel_S6E3FA9_AMB667UM07_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/SELF_DISPLAY/self_display_cmd_FA9.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - -#define DEFAULT_FIXED_VAL 0 - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio11", "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio11", "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio11", "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio11", "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - sde_en_active: sde_en_active { - mux { - pins = "gpio69"; - function = "gpio"; - }; - - config { - pins = "gpio69"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_en_suspend: sde_en_suspend { - mux { - pins = "gpio69"; - function = "gpio"; - }; - - config { - pins = "gpio69"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - pmx_sde_te { - sde_te_active: sde_te_active { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_te_suspend: sde_te_suspend { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - pmx_sde_ub_det { - sde_ub_det_active: sde_ub_det_active { /* UB_CON_DET */ - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - sde_ub_det_suspend: sde_ub_det_suspend { - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - }; - - sde_esd_active: sde_esd_active { /*EL_ON1_DET gpio*/ - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_esd_suspend: sde_esd_suspend { - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; -}; - -&soc { - fixed_reg_octa_vddi: fixed_reg_octa_vddi { - compatible = "regulator-fixed"; - status = "okay"; - regulator-name = "vddi"; - gpio = <&tlmm 69 0>; /* LCD_EN : 3.0 & 1.8 V */ - enable-active-high; - regulator-boot-on; - }; -}; - -&soc { - ss_dsi_panel_SW83106_WM6676Z21_FHD_display: qcom,dsi-display@0 { - label = "ss_dsi_panel_SW83106_WM6676Z21_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_SW83106_WM6676Z21_FHD>; - }; - - ss_dsi_panel_SW83106_FHD_display: qcom,dsi-display@1 { - label = "ss_dsi_panel_SW83106_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_SW83106_FHD>; - }; - - ss_dsi_panel_S6E3FA9_AMB667UM07_FHD_display: qcom,dsi-display@2 { - label = "ss_dsi_panel_S6E3FA9_AMB667UM07_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_S6E3FA9_AMB667UM07_FHD>; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@3 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - }; -}; - -&sde_dsi { - vddi-supply = <&fixed_reg_octa_vddi>; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_en_active &sde_te_active &sde_dsi_active &sde_esd_active &sde_ub_det_active>; - pinctrl-1 = <&sde_en_suspend &sde_te_suspend &sde_dsi_suspend &sde_esd_suspend &sde_ub_det_suspend>; - - qcom,dsi-display-list = - <&ss_dsi_panel_SW83106_WM6676Z21_FHD_display - &ss_dsi_panel_SW83106_FHD_display - &ss_dsi_panel_S6E3FA9_AMB667UM07_FHD_display - &ss_dsi_panel_PBA_BOOTING_FHD_display>; -}; - -&ss_dsi_panel_SW83106_WM6676Z21_FHD { - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - samsung,ub-fd-gpio = <&tlmm 99 0>; // Fast Discharge - - /* ESD related */ - qcom,esd-check-enabled; - qcom,mdss-dsi-panel-status-check-mode ="irq_check"; - qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; - samsung,esd-irq-gpio1 = <&tlmm 63 0>; /* EL_ON1_DET */ - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_S6E3FA9_AMB667UM07_FHD { - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - samsung,ub-fd-gpio = <&tlmm 99 0>; // Fast Discharge - - /* ESD related */ - qcom,esd-check-enabled; - qcom,mdss-dsi-panel-status-check-mode ="irq_check"; - qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; - samsung,esd-irq-gpio1 = <&tlmm 63 0>; /* EL_ON1_DET */ - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_SW83106_FHD { - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - samsung,ub-fd-gpio = <&tlmm 99 0>; // Fast Discharge - - /* ESD related */ - qcom,esd-check-enabled; - qcom,mdss-dsi-panel-status-check-mode ="irq_check"; - qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; - samsung,esd-irq-gpio1 = <&tlmm 63 0>; /* EL_ON1_DET */ - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-reset-gpio = <&tlmm 11 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; - -&ss_dsi_panel_S6E3FA9_AMB667UM07_FHD { - /delete-property/ samsung,fd_on_tx_cmds_revA; - /delete-property/ samsung,fd_off_tx_cmds_revA; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r03.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r03.dtsi deleted file mode 100755 index 9b824cb850eb..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r03.dtsi +++ /dev/null @@ -1,290 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include "../../../../../../drivers/gpu/drm/msm/samsung/SW83106/dsi_panel_SW83106_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/SW83106_WM6676Z21/dsi_panel_SW83106_WM6676Z21_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - -#define DEFAULT_FIXED_VAL 0 - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio11", "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio11", "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio11", "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio11", "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - sde_en_active: sde_en_active { - mux { - pins = "gpio69"; - function = "gpio"; - }; - - config { - pins = "gpio69"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_en_suspend: sde_en_suspend { - mux { - pins = "gpio69"; - function = "gpio"; - }; - - config { - pins = "gpio69"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - pmx_sde_te { - sde_te_active: sde_te_active { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_te_suspend: sde_te_suspend { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - pmx_sde_ub_det { - sde_ub_det_active: sde_ub_det_active { /* UB_CON_DET */ - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - sde_ub_det_suspend: sde_ub_det_suspend { - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - }; - - sde_esd_active: sde_esd_active { /*EL_ON1_DET gpio*/ - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_esd_suspend: sde_esd_suspend { - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; -}; - -&soc { - fixed_reg_octa_vddi: fixed_reg_octa_vddi { - compatible = "regulator-fixed"; - status = "okay"; - regulator-name = "vddi"; - gpio = <&tlmm 69 0>; /* LCD_EN : 3.0 & 1.8 V */ - enable-active-high; - regulator-boot-on; - }; -}; - -&soc { - ss_dsi_panel_SW83106_WM6676Z21_FHD_display: qcom,dsi-display@0 { - label = "ss_dsi_panel_SW83106_WM6676Z21_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_SW83106_WM6676Z21_FHD>; - }; - - ss_dsi_panel_SW83106_FHD_display: qcom,dsi-display@1 { - label = "ss_dsi_panel_SW83106_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_SW83106_FHD>; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@2 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - }; -}; - -&sde_dsi { - vddi-supply = <&fixed_reg_octa_vddi>; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_en_active &sde_te_active &sde_dsi_active &sde_esd_active &sde_ub_det_active>; - pinctrl-1 = <&sde_en_suspend &sde_te_suspend &sde_dsi_suspend &sde_esd_suspend &sde_ub_det_suspend>; - - qcom,dsi-display-list = - <&ss_dsi_panel_SW83106_WM6676Z21_FHD_display - &ss_dsi_panel_SW83106_FHD_display - &ss_dsi_panel_PBA_BOOTING_FHD_display>; -}; - -&ss_dsi_panel_SW83106_WM6676Z21_FHD { - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - samsung,ub-fd-gpio = <&tlmm 99 0>; // Fast Discharge - - /* ESD related */ - qcom,esd-check-enabled; - qcom,mdss-dsi-panel-status-check-mode ="irq_check"; - qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; - samsung,esd-irq-gpio1 = <&tlmm 63 0>; /* EL_ON1_DET */ - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_SW83106_FHD { - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - samsung,ub-fd-gpio = <&tlmm 99 0>; // Fast Discharge - - /* ESD related */ - qcom,esd-check-enabled; - qcom,mdss-dsi-panel-status-check-mode ="irq_check"; - qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; - samsung,esd-irq-gpio1 = <&tlmm 63 0>; /* EL_ON1_DET */ - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-reset-gpio = <&tlmm 11 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r04.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r04.dtsi deleted file mode 100755 index 3e5f372a5daa..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r04.dtsi +++ /dev/null @@ -1,341 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include "../../../../../../drivers/gpu/drm/msm/samsung/SW83106/dsi_panel_SW83106_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/SW83106_WM6676Z21/dsi_panel_SW83106_WM6676Z21_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/S6E3FA9_AMB667UM07/dsi_panel_S6E3FA9_AMB667UM07_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/SELF_DISPLAY/self_display_cmd_FA9.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - -#define DEFAULT_FIXED_VAL 0 - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio11"; - function = "gpio"; - }; - - config { - pins = "gpio11"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio11"; - function = "gpio"; - }; - - config { - pins = "gpio11"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - sde_en_active: sde_en_active { - mux { - pins = "gpio69"; - function = "gpio"; - }; - - config { - pins = "gpio69"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_en_suspend: sde_en_suspend { - mux { - pins = "gpio69"; - function = "gpio"; - }; - - config { - pins = "gpio69"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - pmx_sde_te { - sde_te_active: sde_te_active { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_te_suspend: sde_te_suspend { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - pmx_sde_ub_det { - sde_ub_det_active: sde_ub_det_active { /* UB_CON_DET */ - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - sde_ub_det_suspend: sde_ub_det_suspend { - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - }; - - sde_esd_active: sde_esd_active { /*EL_ON1_DET gpio*/ - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_esd_suspend: sde_esd_suspend { - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; -}; - -&soc { - fixed_reg_octa_vddi: fixed_reg_octa_vddi { - compatible = "regulator-fixed"; - status = "okay"; - regulator-name = "vddi"; - gpio = <&tlmm 69 0>; /* LCD_EN : 3.0 & 1.8 V */ - enable-active-high; - regulator-boot-on; - }; -}; - -&soc { - ss_dsi_panel_SW83106_WM6676Z21_FHD_display: qcom,dsi-display@0 { - label = "ss_dsi_panel_SW83106_WM6676Z21_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_SW83106_WM6676Z21_FHD>; - }; - - ss_dsi_panel_SW83106_FHD_display: qcom,dsi-display@1 { - label = "ss_dsi_panel_SW83106_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_SW83106_FHD>; - }; - - ss_dsi_panel_S6E3FA9_AMB667UM07_FHD_display: qcom,dsi-display@2 { - label = "ss_dsi_panel_S6E3FA9_AMB667UM07_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_S6E3FA9_AMB667UM07_FHD>; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@3 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - }; -}; - -&sde_dsi { - vddi-supply = <&fixed_reg_octa_vddi>; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_en_active &sde_te_active &sde_dsi_active &sde_esd_active &sde_ub_det_active>; - pinctrl-1 = <&sde_en_suspend &sde_te_suspend &sde_dsi_suspend &sde_esd_suspend &sde_ub_det_suspend>; - - qcom,dsi-display-list = - <&ss_dsi_panel_SW83106_WM6676Z21_FHD_display - &ss_dsi_panel_SW83106_FHD_display - &ss_dsi_panel_S6E3FA9_AMB667UM07_FHD_display - &ss_dsi_panel_PBA_BOOTING_FHD_display>; -}; - -&ss_dsi_panel_SW83106_WM6676Z21_FHD { - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - samsung,ub-fd-gpio = <&tlmm 99 0>; // Fast Discharge - - /* ESD related */ - qcom,esd-check-enabled; - qcom,mdss-dsi-panel-status-check-mode ="irq_check"; - qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; - samsung,esd-irq-gpio1 = <&tlmm 63 0>; /* EL_ON1_DET */ - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_S6E3FA9_AMB667UM07_FHD { - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - samsung,ub-fd-gpio = <&tlmm 99 0>; // Fast Discharge - - /* ESD related */ - qcom,esd-check-enabled; - qcom,mdss-dsi-panel-status-check-mode ="irq_check"; - qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; - samsung,esd-irq-gpio1 = <&tlmm 63 0>; /* EL_ON1_DET */ - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_SW83106_FHD { - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - samsung,ub-fd-gpio = <&tlmm 99 0>; // Fast Discharge - - /* ESD related */ - qcom,esd-check-enabled; - qcom,mdss-dsi-panel-status-check-mode ="irq_check"; - qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; - samsung,esd-irq-gpio1 = <&tlmm 63 0>; /* EL_ON1_DET */ - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-reset-gpio = <&tlmm 11 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; - -&ss_dsi_panel_S6E3FA9_AMB667UM07_FHD { - /delete-property/ samsung,fd_on_tx_cmds_revA; - /delete-property/ samsung,fd_off_tx_cmds_revA; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r05.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r05.dtsi deleted file mode 100755 index a29d2216cbd1..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-display-r05.dtsi +++ /dev/null @@ -1,344 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include "../../../../../../drivers/gpu/drm/msm/samsung/SW83106/dsi_panel_SW83106_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/SW83106_WM6676Z21/dsi_panel_SW83106_WM6676Z21_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/S6E3FA9_AMB667UM07/dsi_panel_S6E3FA9_AMB667UM07_fhd_octa_cmd.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/SELF_DISPLAY/self_display_cmd_FA9.dtsi" -#include "../../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - -#define DEFAULT_FIXED_VAL 0 - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio11"; - function = "gpio"; - }; - - config { - pins = "gpio11"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio11"; - function = "gpio"; - }; - - config { - pins = "gpio11"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - sde_en_active: sde_en_active { - mux { - pins = "gpio69"; - function = "gpio"; - }; - - config { - pins = "gpio69"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_en_suspend: sde_en_suspend { - mux { - pins = "gpio69"; - function = "gpio"; - }; - - config { - pins = "gpio69"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - pmx_sde_te { - sde_te_active: sde_te_active { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_te_suspend: sde_te_suspend { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - pmx_sde_ub_det { - sde_ub_det_active: sde_ub_det_active { /* UB_CON_DET */ - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - sde_ub_det_suspend: sde_ub_det_suspend { - mux { - pins = "gpio66"; - function = "gpio"; - }; - - config { - pins = "gpio66"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - }; - - sde_esd_active: sde_esd_active { /*EL_ON1_DET gpio*/ - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_esd_suspend: sde_esd_suspend { - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; -}; - -&soc { - fixed_reg_octa_vddi: fixed_reg_octa_vddi { - compatible = "regulator-fixed"; - status = "okay"; - regulator-name = "vddi"; - gpio = <&tlmm 69 0>; /* LCD_EN : 3.0 & 1.8 V */ - enable-active-high; - regulator-boot-on; - }; -}; - -&soc { - ss_dsi_panel_SW83106_WM6676Z21_FHD_display: qcom,dsi-display@0 { - label = "ss_dsi_panel_SW83106_WM6676Z21_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_SW83106_WM6676Z21_FHD>; - }; - - ss_dsi_panel_SW83106_FHD_display: qcom,dsi-display@1 { - label = "ss_dsi_panel_SW83106_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_SW83106_FHD>; - }; - - ss_dsi_panel_S6E3FA9_AMB667UM07_FHD_display: qcom,dsi-display@2 { - label = "ss_dsi_panel_S6E3FA9_AMB667UM07_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_S6E3FA9_AMB667UM07_FHD>; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@3 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - }; -}; - -&sde_dsi { - vddi-supply = <&fixed_reg_octa_vddi>; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_en_active &sde_te_active &sde_dsi_active &sde_esd_active &sde_ub_det_active>; - pinctrl-1 = <&sde_en_suspend &sde_te_suspend &sde_dsi_suspend &sde_esd_suspend &sde_ub_det_suspend>; - - qcom,dsi-display-list = - <&ss_dsi_panel_SW83106_WM6676Z21_FHD_display - &ss_dsi_panel_SW83106_FHD_display - &ss_dsi_panel_S6E3FA9_AMB667UM07_FHD_display - &ss_dsi_panel_PBA_BOOTING_FHD_display>; -}; - -&ss_dsi_panel_SW83106_WM6676Z21_FHD { - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - - /* ESD related */ - qcom,esd-check-enabled; - qcom,mdss-dsi-panel-status-check-mode ="irq_check"; - qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; - samsung,esd-irq-gpio1 = <&tlmm 63 0>; /* EL_ON1_DET */ - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_S6E3FA9_AMB667UM07_FHD { - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - - /* ESD related */ - qcom,esd-check-enabled; - qcom,mdss-dsi-panel-status-check-mode ="irq_check"; - qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; - samsung,esd-irq-gpio1 = <&tlmm 63 0>; /* EL_ON1_DET */ - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_SW83106_FHD { - qcom,platform-reset-gpio = <&tlmm 11 0>; /* UB_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - - /* ESD related */ - qcom,esd-check-enabled; - qcom,mdss-dsi-panel-status-check-mode ="irq_check"; - qcom,mdss-dsi-panel-status-irq-trigger1 = "falling"; - samsung,esd-irq-gpio1 = <&tlmm 63 0>; /* EL_ON1_DET */ - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - /* use fixed regulator instead of samsung,panel-extra-power-gpio or qcom,platform-enable-gpio. */ - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddi"; // 3.0V , 1.8V - qcom,supply-min-voltage = ; - qcom,supply-max-voltage = ; - qcom,supply-enable-load = ; - qcom,supply-disable-load = ; - qcom,supply-pre-off-sleep = <0>; - qcom,supply-post-on-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-reset-gpio = <&tlmm 11 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; - -&ss_dsi_panel_SW83106_FHD { - /delete-property/ samsung,ub-fd-on-count; - /delete-property/ samsung,ub-fd-off-count; -}; - -&ss_dsi_panel_SW83106_WM6676Z21_FHD{ - /delete-property/ samsung,ub-fd-on-count; - /delete-property/ samsung,ub-fd-off-count; -}; - diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-eif-common.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-eif-common.dtsi deleted file mode 100755 index 0ff5c9d48041..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-eif-common.dtsi +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - samsung,vibrator { - compatible = "samsung_vib"; -// samsung,vib_pwm = <&tlmm 136 0>; -// samsung,vib_power = <&pm8150_gpios 10 0>; -// samsung,gp_clk = <0x00164000>; // Address of GP1 clock - samsung,chip_model = <4>; // using max77705 driver - samsung,vib_type = "COINDC"; - status = "ok"; - - pinctrl-names = "tlmm_pwm_default"; - pinctrl-0 = <&pwm_out_gpio6_default>; - pwms = <&pm6150l_pwm 0 1000000>; - - }; - - usb_noti: usb-notifier { - compatible = "samsung,usb-notifier"; - qcom,disable_control_en = <1>; - qcom,unsupport_host_en = <0>; - }; -}; - -&usb0 { - dwc3@a600000 { - usb-phy = <&qusb_phy0>, <&usb_nop_phy>; - maximum-speed = "high-speed"; - }; -}; - -&usb_qmp_dp_phy { - status = "disabled"; -}; - -&pm6150l_gpios { - pwm_out_gpio6 { - pwm_out_gpio6_default: pwm_out_gpio6_default { - pins = "gpio6"; - function = "func1"; - bias-disable; - power-source = <0>; - output-low; - qcom,drive-strength = <3>; - drive-push-pull; - }; - }; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x1c 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x72 0x240 /* TUNE1 */ - 0x2b 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x02 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,qusb-phy-host-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x1c 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0xf2 0x240 /* TUNE1 */ - 0x2b 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x02 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,diff_tune_host = <(2)>; /* efuse(0x3) + 0 = 7 for tune high value */ - qcom,diff_tune_device = <(4)>; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-eif-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-eif-r00.dtsi deleted file mode 100755 index 1010c18cb3e0..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-eif-r00.dtsi +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&i2c_13 { - s2mu106@3D { - status = "okay"; - compatible = "samsung,s2mu106mfd"; - reg = <0x3D>; - pinctrl-names = "default"; - pinctrl-0 = <&if_pmic_irq>; - s2mu106,irq-gpio = <&tlmm 68 0>; - s2mu106,wakeup; - }; -}; - -&qupv3_se11_i2c { - status = "ok"; - qcom,disable-autosuspend; /* QC suggestion CN#04711439, prevent suspend in LCD off */ - usbpd-s2mu106@3C { - compatible = "s2mu106-usbpd"; - reg = <0x3C>; - pinctrl-names = "default"; - pinctrl-0 = <&usbpd_irq>; - usbpd,usbpd_int = <&tlmm 32 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-fingerprint_00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-fingerprint_00.dtsi deleted file mode 100755 index 3603794fbc9f..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-fingerprint_00.dtsi +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - etspi_drdypin { - etspi_drdypin_active: etspi_drdypin_active { - mux { - pins = "gpio30"; - function = "gpio"; - }; - config { - pins = "gpio30"; - drive-strength = <2>; - bias-disable; - }; - }; - etspi_drdypin_suspend: etspi_drdypin_suspend { - mux { - pins = "gpio30"; - function = "gpio"; - }; - config { - pins = "gpio30"; - drive-strength = <2>; - bias-pull-down; - }; - }; - }; - - etspi_rstpin { - etspi_rstpin: etspi_rstpin { - mux { - pins = "gpio58"; - function = "gpio"; - }; - config { - pins = "gpio58"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; -}; - -&pm6150l_l7 { - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; -}; - -&soc { - qupv3_se6_spi: spi@0xa80000 { - status = "okay"; - - etspi-spi@0 { - compatible = "etspi,et5xx"; - reg = <0>; - spi-max-frequency = <12500000>; - etspi-min_cpufreq_limit = <2169600>; - - pinctrl-names = "default", "sleep", "idle"; - pinctrl-0 = <&etspi_drdypin_suspend &etspi_rstpin>; - pinctrl-1 = <&etspi_drdypin_suspend>; - pinctrl-2 = <&etspi_drdypin_active>; - - gpio-controller; - #gpio-cells = <2>; - - etspi-regulator = "pm6150l_l7"; - etspi-sleepPin = <&tlmm 58 0>; - etspi-drdyPin = <&tlmm 30 1>; - etspi-chipid = "ET523"; - etspi-orient = <2>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-mst-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-mst-r00.dtsi deleted file mode 100755 index 46160187ad33..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-mst-r00.dtsi +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2019, Samsung Electronics Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - sec-mst { - compatible = "sec-mst"; - sec-mst,mst-pwr-gpio = <&tlmm 5 0>; - sec-mst,mst-data-gpio = <&tlmm 83 0>; - sec-mst,mst-en-gpio = <&tlmm 84 0>; - sec-mst,mst-support-gpio = <&pm6150l_gpios 4 0>; - - //pinctrl-names = "mst_active"; - //pinctrl-0 = <&mst_data_init &mst_en_init>; - }; -/* - tlmm: pinctrl@03000000 { - mst_data_init: mst_data_init { - mux { - pins = "gpio84"; - function = "gpio"; - }; - config { - pins = "gpio84"; - drive-strength = <16>; - bias-pull-down; - output_low; - }; - }; - mst_en_init: mst_en_init { - mux { - pins = "gpio83"; - function = "gpio"; - }; - config { - pins = "gpio83"; - drive-strength = <16>; - bias-pull-down; - output_low; - }; - }; - }; -*/ -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-nfc-r00.dtsi deleted file mode 100755 index 0e0a9960e7d3..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-nfc-r00.dtsi +++ /dev/null @@ -1,99 +0,0 @@ - -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi2 = &qupv3_se1_spi; - }; -}; -*/ - -&tlmm { - ese_qupv3_se1_spi_sleep: qupv3_se1_spi_sleep { - mux { - pins = "gpio0", "gpio1", "gpio2", - "gpio3"; - function = "gpio"; - }; - - config { - pins = "gpio0", "gpio1", "gpio2", - "gpio3"; - drive-strength = <6>; - bias-pull-down; - output-low; - }; - }; - - nfc_qupv3_se2_i2c_sleep: nfc_qupv3_se2_i2c_sleep { - mux { - pins = "gpio34", "gpio35"; - function = "gpio"; - }; - - config { - pins = "gpio34", "gpio35"; - drive-strength = <2>; - bias-disable; - }; - }; -}; - -&pm6150l_gpios { - nfc_det_gpio: nfc_det_gpio { - pins = "gpio1"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; - -/* gpio34 and gpio35 are used for nfc i2c */ -&qupv3_se2_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se2_i2c_sleep>; - - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <37 0>; - pn547,irq-gpio = <&tlmm 37 0>; - pn547,ven-gpio = <&tlmm 12 0>; - pn547,firm-gpio = <&tlmm 36 0>; - pn547,clk_req-gpio = <&tlmm 31 0>; /* BBCLK3 is controled by gpio 31 */ - pn547,pwr_req = <&tlmm 94 0>; - pn547,pvdd-gpio = <&tlmm 65 0>; - /* pn547,nfc-det-gpio = <&pm6150l_gpios 1 0>; */ /* need to be checked */ - pn547,clk_req_wake; - }; -}; - -/* gpio 0~3 are used for ese spi */ -&qupv3_se1_spi { - status = "okay"; - spi-max-frequency = <19200000>; - pinctrl-1 = <&ese_qupv3_se1_spi_sleep>; - - ese_spi@0 { - compatible = "p61"; - reg = <0>; - spi-max-frequency = <16000000>; - p61-ap_vendor = "qualcomm"; - p61-spi_node = <&qupv3_se1_spi>; - ese-det-gpio = <&pm6150l_gpios 1 0>; /* eSE_UICC_CHECK */ - pinctrl-names = "default"; - pinctrl-0 = <&nfc_det_gpio>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-nfc-r02.dtsi b/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-nfc-r02.dtsi deleted file mode 100755 index 865efb024218..000000000000 --- a/arch/arm64/boot/dts/samsung/drivers/sm7150-sec-m51-nfc-r02.dtsi +++ /dev/null @@ -1,123 +0,0 @@ - -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi2 = &qupv3_se1_spi; - }; -}; -*/ - -&tlmm { - nfc_qupv3_se2_i2c_sleep: nfc_qupv3_se2_i2c_sleep { - mux { - pins = "gpio34", "gpio35"; - function = "gpio"; - }; - config { - pins = "gpio34", "gpio35"; - drive-strength = <2>; - bias-disable; - }; - }; - - nfc_clk_req_gpio: nfc_clk_req_gpio { - mux { - pins = "gpio31"; - function = "gpio"; - }; - - config { - pins = "gpio31"; - drive-strength = <2>; - bias-pull-down; - input-enable; - }; - }; - - nfc_irq_gpio: nfc_irq_gpio { - mux { - pins = "gpio37"; - function = "gpio"; - }; - config { - pins = "gpio37"; - drive-strength = <2>; - bias-pull-down; - input-enable; - }; - }; - - nfc_ven_gpio: nfc_ven_gpio { - mux { - pins = "gpio12"; - function = "gpio"; - }; - config { - pins = "gpio12"; - drive-strength = <2>; - bias-disable; - output-high; - }; - }; - - nfc_firm_gpio: nfc_firm_gpio { - mux { - pins = "gpio36"; - function = "gpio"; - }; - config { - pins = "gpio36"; - drive-strength = <2>; - bias-disable; - output-low; - }; - }; - - nfc_pvdd_gpio: nfc_pvdd_gpio { - mux { - pins = "gpio65"; - function = "gpio"; - }; - config { - pins = "gpio65"; - drive-strength = <2>; - bias-disable; - output-low; - }; - }; -}; - -/* gpio34 and gpio35 are used for nfc i2c */ -&qupv3_se2_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se2_i2c_sleep>; - qcom,clk-freq-out = <400000>; - sec-nfc@27 { - compatible = "sec-nfc"; - reg = <0x27>; - interrupt-parent = <&tlmm>; - interrupts = <37 0>; - - sec-nfc,ven-gpio = <&tlmm 12 0>; - sec-nfc,irq-gpio = <&tlmm 37 0>; - sec-nfc,firm-gpio = <&tlmm 36 0>; - sec-nfc,clk_req-gpio = <&tlmm 31 0>; - sec-nfc,pvdd-gpio = <&tlmm 65 0>; - sec-nfc,clk_req_wake; - sec-nfc,bootloader_ver = <6>; - - pinctrl-names = "default"; - pinctrl-0 = <&nfc_clk_req_gpio &nfc_irq_gpio &nfc_ven_gpio &nfc_firm_gpio &nfc_pvdd_gpio>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/m41/sm7150-sec-m41-swa-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/m41/sm7150-sec-m41-swa-pinctrl-r00.dtsi deleted file mode 100755 index 7c226b680a68..000000000000 --- a/arch/arm64/boot/dts/samsung/m41/sm7150-sec-m41-swa-pinctrl-r00.dtsi +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - -&tlmm { - usbpd_irq: usbpd_irq { - mux { - pins = "gpio32"; - function = "gpio"; - }; - config { - pins = "gpio32"; - drive-strength = <2>; - bias-disable; - input-enable; - }; - }; - - if_pmic_irq: if_pmic_irq { - mux { - pins = "gpio68"; - function = "gpio"; - }; - config { - pins = "gpio68"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; - - /* s2mu106_fg i2c */ - s2mu106_fg_i2c: s2mu106_fg_i2c { - s2mu106_fg_active: s2mu106_fg_active { - mux { - pins = "gpio102", "gpio101"; - function = "gpio"; - }; - - config { - pins = "gpio102", "gpio101"; - drive-strength = <2>; - bias-disable; - }; - }; - }; -}; - diff --git a/arch/arm64/boot/dts/samsung/m41/sm7150-sec-m41-swa-r00.dtsi b/arch/arm64/boot/dts/samsung/m41/sm7150-sec-m41-swa-r00.dtsi deleted file mode 100755 index d85bef0b5c38..000000000000 --- a/arch/arm64/boot/dts/samsung/m41/sm7150-sec-m41-swa-r00.dtsi +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - -#include "sm7150-sec-m41-swa-pinctrl-r00.dtsi" -#include "../common/sm7150-sec-m41-common.dtsi" -#include "../common/sm7150-sec-m41-pm-common.dtsi" -#include "../common/sm7150-sec-m41-battery-common.dtsi" -#include "../drivers/sm7150-sec-m41-eif-common.dtsi" -#include "../drivers/sm7150-sec-m41-fingerprint_00.dtsi" -#include "../drivers/sm7150-sec-m41-nfc-r00.dtsi" -#include "../drivers/sm7150-camera-sensor-m41-r01.dtsi" - -&soc { - sec_thermistor@0 { - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - }; - - i2c_14: 12c@14 { - status = "ok"; - - cell-index = <14>; - compatible = "i2c-gpio"; - gpios = <&tlmm 101 0 /*sda*/ - &tlmm 102 0 /*scl*/ - >; - - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default"; - pinctrl-0 = <&s2mu106_fg_active>; - }; -}; - -&pm6150l_vadc { - sdm_therm { - reg = ; - }; -}; - - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r00.dtsi deleted file mode 100755 index f184d9d979b7..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r00.dtsi +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - -&tlmm { - usbpd_irq: usbpd_irq { - mux { - pins = "gpio32"; - function = "gpio"; - }; - config { - pins = "gpio32"; - drive-strength = <2>; - bias-disable; - input-enable; - }; - }; - - if_pmic_irq: if_pmic_irq { - mux { - pins = "gpio68"; - function = "gpio"; - }; - config { - pins = "gpio68"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; -}; - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r01.dtsi deleted file mode 100755 index 3d585764ee64..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r01.dtsi +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ -#include "sm7150-sec-m51-eur-pinctrl-r00.dtsi" - -&soc { - -}; - -&tlmm { - -}; - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r02.dtsi deleted file mode 100755 index 96ad990693e3..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r02.dtsi +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ -#include "sm7150-sec-m51-eur-pinctrl-r01.dtsi" - -&soc { - -}; - -&tlmm { - -}; - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r04.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r04.dtsi deleted file mode 100755 index a353148eeb4f..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r04.dtsi +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ -#include "sm7150-sec-m51-eur-pinctrl-r02.dtsi" - -&soc { - -}; - -&tlmm { - -}; - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r05.dtsi deleted file mode 100755 index 52218a28368d..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-pinctrl-r05.dtsi +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ -#include "sm7150-sec-m51-eur-pinctrl-r04.dtsi" - -&soc { - -}; - -&tlmm { - -}; - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r00.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r00.dtsi deleted file mode 100755 index c8743e7b8421..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r00.dtsi +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -#include "../common/sm7150-sec-m51-common.dtsi" -#include "../common/sm7150-sec-m51-pm-common.dtsi" -#include "../common/sm7150-sec-m51-battery-common.dtsi" -#include "../drivers/sm7150-sec-m51-eif-common.dtsi" -#include "../drivers/sm7150-sec-m51-fingerprint_00.dtsi" -#include "../drivers/sm7150-camera-sensor-m51-r01.dtsi" - -&soc { - sec_thermistor@0 { - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - }; -}; - -&pm6150l_vadc { - sdm_therm { - reg = ; - }; -}; - - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r01.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r01.dtsi deleted file mode 100755 index 43c3ec985f1f..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r01.dtsi +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - -#include "sm7150-sec-m51-eur-r00.dtsi" - - -&soc { - -}; - - - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r02.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r02.dtsi deleted file mode 100755 index f77290eebd6b..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r02.dtsi +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - -#include "sm7150-sec-m51-eur-r01.dtsi" -#include "../drivers/sm7150-sec-m51-nfc-r02.dtsi" - - -&soc { - -}; - - - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r04.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r04.dtsi deleted file mode 100755 index a89a53c2223a..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r04.dtsi +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - -#include "sm7150-sec-m51-eur-r02.dtsi" - - -&soc { - -}; - - - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r05.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r05.dtsi deleted file mode 100755 index 3097b5bfd30a..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-eur-r05.dtsi +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - -#include "sm7150-sec-m51-eur-r04.dtsi" - - -&soc { - -}; - - - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-pinctrl-r00.dtsi deleted file mode 100755 index 7c226b680a68..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-pinctrl-r00.dtsi +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -&soc { - -}; - -&tlmm { - usbpd_irq: usbpd_irq { - mux { - pins = "gpio32"; - function = "gpio"; - }; - config { - pins = "gpio32"; - drive-strength = <2>; - bias-disable; - input-enable; - }; - }; - - if_pmic_irq: if_pmic_irq { - mux { - pins = "gpio68"; - function = "gpio"; - }; - config { - pins = "gpio68"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; - - /* s2mu106_fg i2c */ - s2mu106_fg_i2c: s2mu106_fg_i2c { - s2mu106_fg_active: s2mu106_fg_active { - mux { - pins = "gpio102", "gpio101"; - function = "gpio"; - }; - - config { - pins = "gpio102", "gpio101"; - drive-strength = <2>; - bias-disable; - }; - }; - }; -}; - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-pinctrl-r01.dtsi deleted file mode 100755 index dd5b3d96b0db..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-pinctrl-r01.dtsi +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ -#include "sm7150-sec-m51-swa-pinctrl-r00.dtsi" - -&soc { - -}; - -&tlmm { - -}; - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-pinctrl-r02.dtsi deleted file mode 100755 index 95080e9edf0f..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-pinctrl-r02.dtsi +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ -#include "sm7150-sec-m51-swa-pinctrl-r01.dtsi" - -&soc { - -}; - -&tlmm { - -}; - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-r00.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-r00.dtsi deleted file mode 100755 index 799c2ab6de4e..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-r00.dtsi +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - - -#include "../common/sm7150-sec-m51-common.dtsi" -#include "../common/sm7150-sec-m51-pm-common.dtsi" -#include "../common/sm7150-sec-m51-battery-common.dtsi" -#include "../drivers/sm7150-sec-m51-eif-common.dtsi" -#include "../drivers/sm7150-sec-m51-fingerprint_00.dtsi" -#include "../drivers/sm7150-sec-m51-nfc-r00.dtsi" -#include "../drivers/sm7150-camera-sensor-m51-r01.dtsi" - -&soc { - sec_thermistor@0 { - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - }; - - i2c_14: 12c@14 { - status = "ok"; - - cell-index = <14>; - compatible = "i2c-gpio"; - gpios = <&tlmm 101 0 /*sda*/ - &tlmm 102 0 /*scl*/ - >; - - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default"; - pinctrl-0 = <&s2mu106_fg_active>; - }; -}; - -&pm6150l_vadc { - sdm_therm { - reg = ; - }; -}; - - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-r01.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-r01.dtsi deleted file mode 100755 index c7447829b7f2..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-r01.dtsi +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - -#include "sm7150-sec-m51-swa-r00.dtsi" - - -&soc { - -}; - - - diff --git a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-r02.dtsi b/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-r02.dtsi deleted file mode 100755 index 3fba68257e6e..000000000000 --- a/arch/arm64/boot/dts/samsung/m51/sm7150-sec-m51-swa-r02.dtsi +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - -* - -* This program is free software; you can redistribute it and/or modify - -* it under the terms of the GNU General Public License version 2 and - -* only version 2 as published by the Free Software Foundation. - -* - -* This program is distributed in the hope that it will be useful, - -* but WITHOUT ANY WARRANTY; without even the implied warranty of - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - -* GNU General Public License for more details. - -*/ - -#include "sm7150-sec-m51-swa-r01.dtsi" - - -&soc { - -}; - - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70q-eur-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70q-eur-r00.dtsi deleted file mode 100755 index 5ddf94f20c2b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70q-eur-r00.dtsi +++ /dev/null @@ -1,413 +0,0 @@ -&soc { - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - reg = <0x00 0x00>; - compatible = "qcom,camera-flash"; - flash-source = <&pm6150l_flash0>; - torch-source = <&pm6150l_torch0>; - switch-source = <&pm6150l_switch0>; - status = "ok"; - }; -}; - -&cam_cci{ - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear0>; - eeprom-src = <&eeprom0>; - led-flash-src = <&led_flash0>; - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_vana-supply = <&s2mpb03_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vaf", "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000 1800000 1050000 2800000 0>; - rgltr-max-voltage = <2800000 1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_0_active &cam_sensor_rear_active>; - pinctrl-1 = <&cam_sensor_mclk_0_suspend &cam_sensor_rear_suspend>; - gpios = <&tlmm 28 0>, - <&tlmm 47 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - qcom,cam-sensor@1 { - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { /* 4HA */ - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_v_custom1-supply = <&s2mpb03_l2>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_v_custom1", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_3_active &cam_sensor_rear3sw_active &cam_rear3_pwr_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_3_suspend &cam_sensor_rear3sw_suspend &cam_rear3_pwr_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 31 0>, /* MCLK */ - <&tlmm 100 0>, /* RESET */ - <&tlmm 95 0>, /* DVDD,AVDD ENABLE */ - <&tlmm 49 0>; /* MIPI SW SEL BETWEEN FRONT AND RCAM3 */ - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET3", "CAM_VANA", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - eeprom0: qcom,eeprom@58 { - cell-index = <0>; - reg = <0x58>; //QUP use 0xB0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>;//QUP use 0xA2 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom3: qcom,eeprom@37 { - cell-index = <3>; - compatible = "qcom,eeprom"; - reg = <0x37>; - slave-addr = <0x6E>;//QUP use 0x6E - csiphy-sd-index = <2>; - i2c-freq-mode = <1>; - - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - //eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - eeprom2: qcom,eeprom@54 { - cell-index = <2>; - reg = <0x54>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA8>;//QUP use 0xA8 - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-master = <1>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70q-eur-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70q-eur-r02.dtsi deleted file mode 100755 index 85b7b86627e7..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70q-eur-r02.dtsi +++ /dev/null @@ -1,423 +0,0 @@ -&soc { - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - reg = <0x00 0x00>; - compatible = "qcom,camera-flash"; - flash-source = <&pm6150l_flash0>; - torch-source = <&pm6150l_torch0>; - switch-source = <&pm6150l_switch0>; - status = "ok"; - }; -}; - -&cam_cci{ - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear0>; - eeprom-src = <&eeprom0>; - led-flash-src = <&led_flash0>; - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_vana-supply = <&s2mpb03_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vaf", "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000 1800000 1050000 2800000 0>; - rgltr-max-voltage = <2800000 1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_0_active &cam_sensor_rear_active>; - pinctrl-1 = <&cam_sensor_mclk_0_suspend &cam_sensor_rear_suspend>; - gpios = <&tlmm 28 0>, - <&tlmm 47 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - qcom,cam-sensor@1 { - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { /* 4HA */ - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_v_custom1-supply = <&s2mpb03_l2>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_v_custom1", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_3_active &cam_sensor_rear3sw_active &cam_rear3_pwr_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_3_suspend &cam_sensor_rear3sw_suspend &cam_rear3_pwr_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 31 0>, /* MCLK */ - <&tlmm 100 0>, /* RESET */ - <&tlmm 95 0>, /* DVDD,AVDD ENABLE */ - <&tlmm 49 0>; /* MIPI SW SEL BETWEEN FRONT AND RCAM3 */ - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET3", "CAM_VANA", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - eeprom3: qcom,eeprom@37 { - cell-index = <3>; - compatible = "qcom,eeprom"; - reg = <0x37>; - slave-addr = <0x6E>;//QUP use 0x6E - csiphy-sd-index = <2>; - i2c-freq-mode = <1>; - - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - //eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; -}; - -&qupv3_se3_i2c{ - status = "ok"; - compatible = "i2c-gpio"; - gpios = <&tlmm 18 0 - &tlmm 19 0 >; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_eeprom_i2c_default>; - pinctrl-1 = <&cam_eeprom_i2c_sleep>; - - eeprom0: qcom,eeprom@58 { - cell-index = <0>; - reg = <0x58>; //QUP use 0xB0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>;//QUP use 0xA2 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@54 { - cell-index = <2>; - reg = <0x54>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA8>;//QUP use 0xA8 - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-master = <1>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70s-eur-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70s-eur-r02.dtsi deleted file mode 100755 index ef938cba7c90..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70s-eur-r02.dtsi +++ /dev/null @@ -1,423 +0,0 @@ -&soc { - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - reg = <0x00 0x00>; - compatible = "qcom,camera-flash"; - flash-source = <&pm6150l_flash0>; - torch-source = <&pm6150l_torch0>; - switch-source = <&pm6150l_switch0>; - status = "ok"; - }; -}; - -&cam_cci{ - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear0>; - eeprom-src = <&eeprom0>; - led-flash-src = <&led_flash0>; - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_vana-supply = <&s2mpb03_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vaf", "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000 1800000 1050000 2800000 0>; - rgltr-max-voltage = <2800000 1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_0_active &cam_sensor_rear_active>; - pinctrl-1 = <&cam_sensor_mclk_0_suspend &cam_sensor_rear_suspend>; - gpios = <&tlmm 28 0>, - <&tlmm 47 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - qcom,cam-sensor@1 { - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { /* 4HA */ - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_v_custom1-supply = <&s2mpb03_l2>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_v_custom1", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_3_active &cam_sensor_rear3sw_active &cam_rear3_pwr_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_3_suspend &cam_sensor_rear3sw_suspend &cam_rear3_pwr_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 31 0>, /* MCLK */ - <&tlmm 100 0>, /* RESET */ - <&tlmm 95 0>, /* DVDD,AVDD ENABLE */ - <&tlmm 49 0>; /* MIPI SW SEL BETWEEN FRONT AND RCAM3 */ - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET3", "CAM_VANA", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - eeprom3: qcom,eeprom@37 { - cell-index = <3>; - compatible = "qcom,eeprom"; - reg = <0x37>; - slave-addr = <0x6E>;//QUP use 0x6E - csiphy-sd-index = <2>; - i2c-freq-mode = <1>; - - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; -}; - -&qupv3_se3_i2c{ - status = "ok"; - compatible = "i2c-gpio"; - gpios = <&tlmm 18 0 - &tlmm 19 0 >; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_eeprom_i2c_default>; - pinctrl-1 = <&cam_eeprom_i2c_sleep>; - - eeprom0: qcom,eeprom@50 { - cell-index = <0>; - reg = <0x50>; //QUP use 0xA0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>;//QUP use 0xA2 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@54 { - cell-index = <2>; - reg = <0x54>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA8>;//QUP use 0xA8 - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-master = <1>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70s-eur-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70s-eur-r03.dtsi deleted file mode 100755 index add5d86bdcb0..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-camera-sensor-a70s-eur-r03.dtsi +++ /dev/null @@ -1,423 +0,0 @@ -&soc { - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - reg = <0x00 0x00>; - compatible = "qcom,camera-flash"; - flash-source = <&pm6150l_flash0>; - torch-source = <&pm6150l_torch0>; - switch-source = <&pm6150l_switch0>; - status = "ok"; - }; -}; - -&cam_cci{ - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear0>; - eeprom-src = <&eeprom0>; - led-flash-src = <&led_flash0>; - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_vana-supply = <&s2mpb03_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vaf", "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000 1800000 1050000 2800000 0>; - rgltr-max-voltage = <2800000 1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_0_active &cam_sensor_rear_active>; - pinctrl-1 = <&cam_sensor_mclk_0_suspend &cam_sensor_rear_suspend>; - gpios = <&tlmm 28 0>, - <&tlmm 47 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - qcom,cam-sensor@1 { - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { /* 4HA */ - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_v_custom1-supply = <&s2mpb03_l2>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_v_custom1", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_3_active &cam_sensor_rear3sw_active &cam_rear3_pwr_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_3_suspend &cam_sensor_rear3sw_suspend &cam_rear3_pwr_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 31 0>, /* MCLK */ - <&tlmm 100 0>, /* RESET */ - <&tlmm 95 0>, /* DVDD,AVDD ENABLE */ - <&tlmm 49 0>; /* MIPI SW SEL BETWEEN FRONT AND RCAM3 */ - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET3", "CAM_VANA", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - eeprom3: qcom,eeprom@37 { - cell-index = <3>; - compatible = "qcom,eeprom"; - reg = <0x37>; - slave-addr = <0x6E>;//QUP use 0x6E - csiphy-sd-index = <2>; - i2c-freq-mode = <1>; - - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - //eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; -}; - -&qupv3_se3_i2c{ - status = "ok"; - compatible = "i2c-gpio"; - gpios = <&tlmm 18 0 - &tlmm 19 0 >; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_eeprom_i2c_default>; - pinctrl-1 = <&cam_eeprom_i2c_sleep>; - - eeprom0: qcom,eeprom@50 { - cell-index = <0>; - reg = <0x50>; //QUP use 0xA0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>;//QUP use 0xA2 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@54 { - cell-index = <2>; - reg = <0x54>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA8>;//QUP use 0xA8 - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-master = <1>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-audio-pinctrl.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-audio-pinctrl.dtsi deleted file mode 100755 index 82142b65c63f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-audio-pinctrl.dtsi +++ /dev/null @@ -1,116 +0,0 @@ -&lpi_tlmm { - sec_mi2s_clk_active: sec_mi2s_clk_active { - mux { - pins = "gpio8"; - function = "func3"; - }; - config { - pins = "gpio8"; - drive-strength = <8>; - }; - }; - sec_mi2s_clk_sleep: sec_mi2s_clk_sleep { - mux { - pins = "gpio8"; - function = "func3"; - }; - config { - pins = "gpio8"; - drive-strength = <2>; - }; - }; - - sec_mi2s_ws_active: sec_mi2s_ws_active { - mux { - pins = "gpio9"; - function = "func3"; - }; - config { - pins = "gpio9"; - drive-strength = <8>; - }; - }; - - sec_mi2s_ws_sleep: sec_mi2s_ws_sleep { - mux { - pins = "gpio9"; - function = "func3"; - }; - config { - pins = "gpio9"; - drive-strength = <2>; - }; - }; - - sec_mi2s_sd0_active: sec_mi2s_sd0_active { - mux { - pins = "gpio10"; - function = "func4"; - }; - - config { - pins = "gpio10"; - drive-strength = <8>; - }; - }; - - sec_mi2s_sd0_sleep: sec_mi2s_sd0_sleep { - mux { - pins = "gpio10"; - function = "func4"; - }; - config { - pins = "gpio10"; - drive-strength = <2>; - }; - }; - - sec_mi2s_sd1_active: sec_mi2s_sd1_active { - mux { - pins = "gpio11"; - function = "func2"; - }; - config { - pins = "gpio11"; - drive-strength = <8>; - }; - }; - - sec_mi2s_sd1_sleep: sec_mi2s_sd1_sleep { - mux { - pins = "gpio11"; - function = "func2"; - }; - config { - pins = "gpio11"; - drive-strength = <2>; - }; - }; -}; - -&tlmm { - tfa_reset_active: tfa_reset_active{ - mux { - pins = "gpio26"; - function = "gpio"; - }; - config { - pins = "gpio26"; - driver-strength = <2>; - bias-pull-down; - }; - }; - - tfa_reset_suspend: tfa_reset_suspend{ - mux { - pins = "gpio26"; - function = "gpio"; - }; - config { - pins = "gpio26"; - driver-strength = <2>; - bias-pull-down; - }; - }; - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-audio.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-audio.dtsi deleted file mode 100755 index 889fcea894dd..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-audio.dtsi +++ /dev/null @@ -1,134 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../qcom/sm6150-audio-overlay.dtsi" - -&bolero { - qcom,num-macros = <4>; -}; - -&sm6150_snd { - qcom,model = "sm6150-idp-snd-card"; - qcom,msm-mi2s-master = <1>, <1>, <1>, <1>, <1>; - qcom,ext-disp-audio-rx = <1>; - qcom,dmic-ldo-en = <&tlmm 24 0x0>; - - asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>, - <&loopback>, <&compress>, <&hostless>, - <&afe>, <&lsm>, <&routing>, <&compr>, - <&pcm_noirq>, <&samsung_q6audio_adaptation>; - asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", - "msm-pcm-dsp.2", "msm-voip-dsp", - "msm-pcm-voice", "msm-pcm-loopback", - "msm-compress-dsp", "msm-pcm-hostless", - "msm-pcm-afe", "msm-lsm-client", - "msm-pcm-routing", "msm-compr-dsp", - "msm-pcm-dsp-noirq", "q6audio-adaptation"; - qcom,audio-routing = - "TX DMIC0", "Digital Mic0", - "TX DMIC1", "Digital Mic1", - "TX DMIC2", "Digital Mic2", - "TX_AIF1 CAP", "VA_MCLK", - "TX_AIF2 CAP", "VA_MCLK", - "RX AIF1 PB", "VA_MCLK", - "RX AIF2 PB", "VA_MCLK", - "RX AIF3 PB", "VA_MCLK", - "RX AIF4 PB", "VA_MCLK", - "IN1_HPHL", "HPHL_OUT", - "IN2_HPHR", "HPHR_OUT", - "IN3_AUX", "AUX_OUT", - "TX SWR_ADC0", "ADC1_OUTPUT", - "TX SWR_ADC2", "ADC2_OUTPUT", - "WSA SRC0_INP", "SRC0", - "WSA_TX DEC0_INP", "TX DEC0 MUX", - "WSA_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC0_INP", "TX DEC0 MUX", - "RX_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC2_INP", "TX DEC2 MUX", - "RX_TX DEC3_INP", "TX DEC3 MUX", - "SpkrLeft IN", "WSA_SPK1 OUT"; - qcom,msm-mbhc-hphl-swh = <0>; - qcom,msm-mbhc-gnd-swh = <0>; - qcom,fm-lna-gpios = <&tlmm 119 0>; - asoc-codec = <&stub_codec>, <&bolero>, <&ext_disp_audio_codec>; - asoc-codec-names = "msm-stub-codec.1", "bolero_codec", - "msm-ext-disp-audio-codec-rx"; - qcom,wsa-max-devs = <1>; - qcom,wsa-devs = <&wsa881x_0213>; - qcom,wsa-aux-dev-prefix = "SpkrLeft"; - qcom,codec-max-aux-devs = <0>; - qcom,msm_audio_ssr_devs = <&audio_apr>, <&q6core>, - <&lpi_tlmm>, <&bolero>; - qcom,sec-mi2s-gpios = <&cdc_sec_mi2s_gpios>; -}; - -&soc { - sec-audio-sysfs { - compatible = "samsung,audio-sysfs"; - status = "okay"; - audio,no-earjack; - audio,num-amp = <1>; - }; - samsung_q6audio_adaptation: samsung,q6audio-adaptation { - compatible = "samsung,q6audio-adaptation"; - adaptation,voice-tracking-tx-port-id = <0xB037>; - adaptation,amp-rx-port-id = <0xB000>; - }; - - cdc_sec_mi2s_gpios: msm_cdc_pinctrl_sec { - compatible = "qcom,msm-cdc-pinctrl"; - pinctrl-names = "aud_active", "aud_sleep"; - pinctrl-0 = <&sec_mi2s_clk_active &sec_mi2s_ws_active - &sec_mi2s_sd0_active &sec_mi2s_sd1_active>; - pinctrl-1 = <&sec_mi2s_clk_sleep &sec_mi2s_ws_sleep - &sec_mi2s_sd0_sleep &sec_mi2s_sd1_sleep>; - }; -}; - -&qupv3_se3_i2c { - status = "ok"; - tfa9xxx_rcv: tfa9xxx@34 { - compatible = "nxp,tfa9xxx"; - reg = <0x34>; - haptic; /* this device has the LRA */ - mclk-gpio = <&tlmm 36 0x00>; - }; -}; - -&wsa_macro { - status = "okay"; -}; -&swr0 { - status = "okay"; -}; -&wsa_spkr_en1 { - status = "okay"; -}; - -&va_macro { - status = "okay"; -}; -&wsa_spkr_en2 { - status = "disabled"; -}; -&fsa4480 { - status = "disabled"; -}; -&wsa881x_0211 { - status = "disabled"; -}; -&wsa881x_0212 { - status = "disabled"; -}; -&wsa881x_0214 { - status = "disabled"; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-battery-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-battery-common.dtsi deleted file mode 100755 index 0c7557765c70..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-battery-common.dtsi +++ /dev/null @@ -1,234 +0,0 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&mtp_batterydata { - /delete-node/ qcom,alium_860_89032_0000_3600mAh; - /delete-node/ qcom,mlp356477_2800mah; - #include "sm6150-sec-qg-batterydata-a60q.dtsi" -}; - -&pm6150_qg { - qcom,vbatt-cutoff-mv = <3400>; /* SOC 0% */ - qcom,qg-iterm-ma = <350>; /* SOC 100% */ -}; - -&pm6150_charger { - /delete-property/ qcom,sec-charger-config; - /delete-property/ qcom,step-charging-enable; - qcom,sec-charger-config = <0>; - qcom,chg-term-src = <1>; /* 0 : ITERM_SRC_UNSPECIFIED, 1 : ITERM_SRC_ADC, 2 : ITERM_SRC_ANALOG */ - qcom,chg-term-current-ma = <(-200)>; - qcom,fcc-max-ua = <2450000>; - qcom,usb-icl-ua = <2000000>; - qcom,sw-jeita-enable; - qcom,float-option = <2>; - qcom,otg-cl-ua = <1500000>; - qcom,hard-jeita-enable; - qcom,wdog-snarl-based-step-chg; - qcom,auto-recharge-soc = <(-22)>; - qcom,auto-recharge-vbat-mv = <4280>; - - qcom,jeita_cold_trigger = <0x583D>; /* 0 degree */ - qcom,jeita_cold_release = <0x561B>; /* 2 degree */ - qcom,jeita_hot_trigger = <0x1BE6>; /* 50 degree */ - qcom,jeita_hot_release = <0x1DE0>; /* 48 degree */ - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - water-det-enable; - #sbu-short-detect-enable; - - rid-gnd-gpio = <&pm6150l_gpios 9 GPIO_ACTIVE_LOW>; -}; - -&smb1390 { - status = "disabled"; -}; - -&smb1390_charger { - status = "disabled"; -}; - -&soc { - battery { - status = "okay"; - compatible = "samsung,sec-battery"; - battery,store_mode_polling_time = <30>; - battery,gpio_vbat_sense = <&pm6150l_gpios 12 GPIO_ACTIVE_LOW>; - battery,gpio_sub_pcb_detect = <&pm6150_gpios 8 GPIO_ACTIVE_LOW>; - battery,full_check_current_1st = <350>; - battery,use_temp_adc_table; - battery,use_chg_temp_adc_table; - - battery,temp_table_adc = <1626 2176 2726 3276 3848 - 4559 5254 6128 7142 8408 - 9805 11278 12866 14532 16212 - 17869 19637 21224 22589 23882 - 25002 25885 26599>; - battery,temp_table_data = <900 850 800 750 700 - 650 600 550 500 450 - 400 350 300 250 200 - 150 100 50 0 (-50) - (-100) (-150) (-200)>; - - battery,chg_temp_table_adc = <7865 8008 8167 8323 8554 - 8637 8768 8957 9103 9261 - 9412 9569 9720 9892 10060 - 10217 10377 10529 10707 10865 - 11025 11185 11345>; - battery,chg_temp_table_data = <(-200) (-150) (-100) (-50) 0 - 50 100 150 200 250 - 300 350 400 450 500 - 550 600 650 700 750 - 800 850 900>; - - /* mix temp setting value */ - battery,mix_temp_recovery = <390>; - battery,mix_temp_batt_threshold = <420>; - battery,mix_temp_die_threshold = <700>; - - /* chg temp setting value */ - battery,chg_high_temp = <520>; - battery,chg_high_temp_recovery = <500>; - battery,chg_input_limit_current = <1000>; - battery,chg_charging_limit_current = <1250>; - - /* Safety timer parameters */ - battery,standard_curr = <2450000>; //equal to last step of step_chg_ranges - battery,expired_time = <11400>; //190min - battery,recharging_expired_time = <5400>; //90mins - battery,safety_timer_polling_time = <30>; - - battery,battery_full_capacity = <3400>; /* battery capacity */ - /* disable Vbat ovp dettection */ - battery,cisd_max_voltage_thr = <5000>; /* batttery ovp dettection voltage */ - battery,cisd_alg_index = <7>; - - battery,siop_input_limit_current = <1200>; - battery,siop_charging_limit_current = <1800>; - battery,siop_hv_input_limit_current = <700>; - battery,siop_hv_charging_limit_current = <1800>; - battery,minimum_hv_input_current_by_siop_10 = <400>; - - battery,ttf_hv_charge_current = <2240>; - - battery,ttf_capacity = <3000>; - battery,cv_data = < - 2476 747 2401 - 2406 761 2339 - 2292 774 2276 - 2198 787 2214 - 2129 800 2150 - 2031 811 2087 - 1934 823 2024 - 1860 833 1962 - 1766 844 1899 - 1685 853 1837 - 1615 862 1774 - 1548 871 1711 - 1472 880 1643 - 1412 887 1586 - 1356 895 1520 - 1284 902 1460 - 1222 908 1397 - 1173 915 1334 - 1127 921 1272 - 1067 926 1202 - 1022 932 1145 - 988 937 1079 - 944 942 1014 - 906 946 957 - 870 951 892 - 827 955 826 - 791 959 769 - 759 963 704 - 725 966 639 - 701 970 581 - 670 973 516 - 642 976 451 - 621 979 394 - 592 982 328 - 568 985 263 - 540 987 198 - 516 990 180 - 478 994 105 - 420 1000 0 - >; - }; - -/* sec_battery_cable - * 0 UNKNOWN, - * 1 BATTERY, - * 2 UPS, - * 3 MAINS, - * 4 USB, - * 5 USB_DCP, - * 6 USB_CDP, - * 7 USB_ACA, - * 8 USB_TYPE_C, - * 9 USB_PD, - * 10 USB_PD_DRP, - * 11 APPLE_BRICK_ID, - * 12 USB_HVDCP, - * 13 USB_HVDCP_3, - * 14 WIRELESS, - * 15 USB_FLOAT, - * 16 BMS, - * 17 PARALLEL, - * 18 MAIN, - * 19 WIPOWER, - * 20 UFP, - * 21 DFP, - * 22 CHARGE_PUMP, - * 23 POWER_SHARING, - * 24 OTG, - * 25 AFC, - * 26 CABLE_MAX, -*/ - cable-info { - default_input_current = <1800>; - default_charging_current = <2100>; - - current_group_1 { - cable_number = <12 25>; - input_current = <1650>; - charging_current = <2450>; - }; - current_group_2 { - cable_number = <4 8 15>; - input_current = <500>; - charging_current = <700>; - }; - current_group_3 { - cable_number = <9 13>; - input_current = <2000>; - charging_current = <2450>; - }; - current_group_4 { - cable_number = <6 7>; - input_current = <1500>; - charging_current = <1500>; - }; - current_group_5 { - cable_number = <23 24>; - input_current = <500>; - charging_current = <500>; - }; - current_group_6 { - cable_number = <14>; - input_current = <900>; - charging_current = <2450>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-camera-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-camera-r01.dtsi deleted file mode 100755 index 14517bdb17ed..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-camera-r01.dtsi +++ /dev/null @@ -1,417 +0,0 @@ -&soc { - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - reg = <0x00 0x00>; - compatible = "qcom,camera-flash"; - flash-source = <&pm6150l_flash0>; - torch-source = <&pm6150l_torch0>; - switch-source = <&pm6150l_switch0>; - status = "ok"; - }; -}; - -&cam_cci{ - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_vana-supply = <&s2mpb03_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vaf", "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000 1800000 1050000 2800000 0>; - rgltr-max-voltage = <2800000 1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_0_active &cam_sensor_rear_active>; - pinctrl-1 = <&cam_sensor_mclk_0_suspend &cam_sensor_rear_suspend>; - gpios = <&tlmm 28 0>, - <&tlmm 47 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@1 { - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { //4HA - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_3_active &cam_sensor_rear3sw_active &cam_rear3_pwr_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_3_suspend &cam_sensor_rear3sw_suspend &cam_rear3_pwr_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 31 0>, // MCLK/ - <&tlmm 100 0>, // RESET - <&tlmm 95 0>, // DVDD,AVDD ENABLE - <&tlmm 49 0>; // MIPI SW SEL BETWEEN FRONT AND RCAM3 - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET3", "CAM_VANA", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - eeprom3: qcom,eeprom@37 { - cell-index = <3>; - compatible = "qcom,eeprom"; - reg = <0x37>; - slave-addr = <0x6E>;//QUP use 0x6E - csiphy-sd-index = <2>; - i2c-freq-mode = <1>; - - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - //eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; -}; - -&qupv3_se3_i2c{ - status = "ok"; - - eeprom0: qcom,eeprom@58 { - cell-index = <0>; - reg = <0x58>; //QUP use 0xB0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>;//QUP use 0xA2 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@54 { - cell-index = <2>; - reg = <0x54>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA8>;//QUP use 0xA8 - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-master = <1>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-camera.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-camera.dtsi deleted file mode 100755 index bfbecd5385da..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-camera.dtsi +++ /dev/null @@ -1,413 +0,0 @@ -&soc { - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - reg = <0x00 0x00>; - compatible = "qcom,camera-flash"; - flash-source = <&pm6150l_flash0>; - torch-source = <&pm6150l_torch0>; - switch-source = <&pm6150l_switch0>; - status = "ok"; - }; -}; - -&cam_cci{ - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_vana-supply = <&s2mpb03_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_0_active &cam_sensor_rear_active>; - pinctrl-1 = <&cam_sensor_mclk_0_suspend &cam_sensor_rear_suspend>; - gpios = <&tlmm 28 0>, - <&tlmm 47 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@1 { - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { //4HA - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_3_active &cam_sensor_rear3sw_active &cam_rear3_pwr_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_3_suspend &cam_sensor_rear3sw_suspend &cam_rear3_pwr_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 31 0>, // MCLK/ - <&tlmm 100 0>, // RESET - <&tlmm 95 0>, // DVDD,AVDD ENABLE - <&tlmm 49 0>; // MIPI SW SEL BETWEEN FRONT AND RCAM3 - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET3", "CAM_VANA", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - - eeprom0: qcom,eeprom@58 { - cell-index = <0>; - reg = <0x58>; //QUP use 0xB0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>;//QUP use 0xA2 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@37 { - cell-index = <2>; - compatible = "qcom,eeprom"; - reg = <0x37>; - slave-addr = <0x6E>;//QUP use 0x6E - csiphy-sd-index = <2>; - i2c-freq-mode = <1>; - - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - //eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - eeprom3: qcom,eeprom@54 { - cell-index = <3>; - reg = <0x54>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA8>;//QUP use 0xA8 - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-master = <1>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r00.dts deleted file mode 100755 index bba4198f8123..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r00.dts +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a60q-pm-common.dtsi" - -#include "sm6150-sec-a60q-chn-r00.dtsi" -#include "sm6150-sec-a60q-chn-pinctrl-r00.dtsi" -#include "sm6150-sec-a60q-battery-common.dtsi" -#include "sm6150-sec-a60q-nfc-r00.dtsi" -#include "sm6150-sec-a60q-eif-r00.dtsi" -#include "sm6150-sec-a60q-display-r00.dtsi" -#include "sm6150-sec-a60q-fingerprint_00.dtsi" -#include "sm6150-sec-a60q-camera.dtsi" - -/ { - model = "Samsung A60Q PROJECT Bring-Up (board-id,00)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - status = "disabled"; - }; - - touchscreen@20 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r01.dts deleted file mode 100755 index d4922ee44f95..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r01.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a60q-pm-common.dtsi" - -#include "sm6150-sec-a60q-chn-r01.dtsi" -#include "sm6150-sec-a60q-chn-pinctrl-r01.dtsi" -#include "sm6150-sec-a60q-battery-common.dtsi" -#include "sm6150-sec-a60q-nfc-r00.dtsi" -#include "sm6150-sec-a60q-eif-r00.dtsi" -#include "sm6150-sec-a60q-display-r01.dtsi" -#include "sm6150-sec-a60q-fingerprint_00.dtsi" -#include "sm6150-sec-a60q-camera.dtsi" - -/ { - model = "Samsung A60Q PROJECT (board-id,01)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 1>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r02.dts deleted file mode 100755 index 3627965bd3a5..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r02.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a60q-pm-common.dtsi" - -#include "sm6150-sec-a60q-chn-r02.dtsi" -#include "sm6150-sec-a60q-chn-pinctrl-r02.dtsi" -#include "sm6150-sec-a60q-battery-common.dtsi" -#include "sm6150-sec-a60q-nfc-r00.dtsi" -#include "sm6150-sec-a60q-eif-r00.dtsi" -#include "sm6150-sec-a60q-display-r01.dtsi" -#include "sm6150-sec-a60q-fingerprint_00.dtsi" -#include "sm6150-sec-a60q-camera-r01.dtsi" - -/ { - model = "Samsung A60Q PROJECT (board-id,02)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 2>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r03.dts deleted file mode 100755 index a5717d1e1c70..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r03.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a60q-pm-common.dtsi" - -#include "sm6150-sec-a60q-chn-r03.dtsi" -#include "sm6150-sec-a60q-chn-pinctrl-r03.dtsi" -#include "sm6150-sec-a60q-battery-common.dtsi" -#include "sm6150-sec-a60q-nfc-r00.dtsi" -#include "sm6150-sec-a60q-eif-r00.dtsi" -#include "sm6150-sec-a60q-display-r01.dtsi" -#include "sm6150-sec-a60q-fingerprint_01.dtsi" -#include "sm6150-sec-a60q-camera-r01.dtsi" - -/ { - model = "Samsung A60Q PROJECT (board-id,03)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 3>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r04.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r04.dts deleted file mode 100755 index 4d5de7b315a4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r04.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a60q-pm-common.dtsi" - -#include "sm6150-sec-a60q-chn-r04.dtsi" -#include "sm6150-sec-a60q-chn-pinctrl-r04.dtsi" -#include "sm6150-sec-a60q-battery-common.dtsi" -#include "sm6150-sec-a60q-nfc-r00.dtsi" -#include "sm6150-sec-a60q-eif-r00.dtsi" -#include "sm6150-sec-a60q-display-r01.dtsi" -#include "sm6150-sec-a60q-fingerprint_01.dtsi" -#include "sm6150-sec-a60q-camera-r01.dtsi" - -/ { - model = "Samsung A60Q PROJECT (board-id,04)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 4>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r05.dts deleted file mode 100755 index 2dcca44ace93..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r05.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a60q-pm-common.dtsi" - -#include "sm6150-sec-a60q-chn-r05.dtsi" -#include "sm6150-sec-a60q-chn-pinctrl-r05.dtsi" -#include "sm6150-sec-a60q-battery-common.dtsi" -#include "sm6150-sec-a60q-nfc-r00.dtsi" -#include "sm6150-sec-a60q-eif-r00.dtsi" -#include "sm6150-sec-a60q-display-r01.dtsi" -#include "sm6150-sec-a60q-fingerprint_01.dtsi" -#include "sm6150-sec-a60q-camera-r01.dtsi" - -/ { - model = "Samsung A60Q PROJECT (board-id,05)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 5>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r06.dts deleted file mode 100755 index 6c86bd409a1f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r06.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a60q-pm-common.dtsi" - -#include "sm6150-sec-a60q-chn-r06.dtsi" -#include "sm6150-sec-a60q-chn-pinctrl-r06.dtsi" -#include "sm6150-sec-a60q-battery-common.dtsi" -#include "sm6150-sec-a60q-nfc-r00.dtsi" -#include "sm6150-sec-a60q-eif-r00.dtsi" -#include "sm6150-sec-a60q-display-r01.dtsi" -#include "sm6150-sec-a60q-fingerprint_01.dtsi" -#include "sm6150-sec-a60q-camera-r01.dtsi" - -/ { - model = "Samsung A60Q PROJECT (board-id,06)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 6>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r08.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r08.dts deleted file mode 100755 index cf328e99f4e5..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-overlay-r08.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a60q-pm-common.dtsi" - -#include "sm6150-sec-a60q-chn-r08.dtsi" -#include "sm6150-sec-a60q-chn-pinctrl-r08.dtsi" -#include "sm6150-sec-a60q-battery-common.dtsi" -#include "sm6150-sec-a60q-nfc-r00.dtsi" -#include "sm6150-sec-a60q-eif-r00.dtsi" -#include "sm6150-sec-a60q-display-r01.dtsi" -#include "sm6150-sec-a60q-fingerprint_01.dtsi" -#include "sm6150-sec-a60q-camera-r01.dtsi" - -/ { - model = "Samsung A60Q PROJECT (board-id,08)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 8>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r00.dtsi deleted file mode 100755 index 3b856f2eb712..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r00.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-pinctrl-common.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r01.dtsi deleted file mode 100755 index a6e22ebd9643..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-chn-pinctrl-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r02.dtsi deleted file mode 100755 index 565abea8a237..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-chn-pinctrl-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r03.dtsi deleted file mode 100755 index e1f7f4da369e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-chn-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r04.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r04.dtsi deleted file mode 100755 index 7265da6d4914..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r04.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-chn-pinctrl-r03.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r05.dtsi deleted file mode 100755 index ca80268e6243..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r05.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-chn-pinctrl-r04.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r06.dtsi deleted file mode 100755 index 62185a2685ba..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r06.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-chn-pinctrl-r05.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r08.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r08.dtsi deleted file mode 100755 index 0a9b20da54a4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-pinctrl-r08.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-chn-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r00.dtsi deleted file mode 100755 index 8a30ad33b958..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r00.dtsi +++ /dev/null @@ -1,107 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-common.dtsi" -#include "sm6150-sec-a60q-input-common.dtsi" - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1000000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1100000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1100000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <3200000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2850000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -&novatek_ts { - status = "okay"; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r01.dtsi deleted file mode 100755 index a4e9b4f1091b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r01.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-chn-r00.dtsi" - -&soc { - -}; - -/* not use ufs */ -&ufsphy_mem { - status = "disabled"; -}; -&ufshc_mem { - status = "disabled"; -}; -&ufs_ice { - status = "disabled"; -}; - -/* use eMMC */ -&sdhc_1 { - status = "ok"; -}; - -&firmware { - android { - fstab { - product { - dev = "/dev/block/platform/soc/7c4000.sdhci/by-name/product"; - }; - vendor { - dev = "/dev/block/platform/soc/7c4000.sdhci/by-name/vendor"; - }; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r02.dtsi deleted file mode 100755 index b7669b15778b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r02.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-chn-r01.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r03.dtsi deleted file mode 100755 index d6ed9efc3e47..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r03.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-chn-r02.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r04.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r04.dtsi deleted file mode 100755 index fea6cc82db19..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r04.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-chn-r03.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r05.dtsi deleted file mode 100755 index 2be2c393a673..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r05.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-chn-r04.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r06.dtsi deleted file mode 100755 index 6708b1ed6491..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r06.dtsi +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-chn-r05.dtsi" - -&soc { - -}; - -&sdhc_2 { - /* remove SD card external LDO load switch from the r06 HW version */ - sec,tflash-en-gpio = <>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r08.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r08.dtsi deleted file mode 100755 index d8d692aef5ee..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-chn-r08.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-chn-r06.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-common.dtsi deleted file mode 100755 index c935a7eeaf25..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-common.dtsi +++ /dev/null @@ -1,128 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "sm6150-sec-a60q-audio.dtsi" - -&sdhc_2 { - cd-gpios = <&tlmm 99 0x1>; - sec,tflash-en-gpio = <&tlmm 121 0x0>; /* T_Flash EN - GPIO121 */ -}; - -&soc { - pm6150l_rid_adc { - status = "okay"; - compatible = "pm6150l_rid_adc"; - - interrupt-parent = <&spmi_bus>; - pm6150l_rid_adc,irq-gpio = <&pm6150l_gpios 9 GPIO_ACTIVE_LOW>; - jigon-gpios = <&pm6150l_gpios 11 GPIO_ACTIVE_LOW>; - - pinctrl-names = "default"; - pinctrl-0 = <&rid_adc_irq_default &gpio11_dig_out_default>; - - io-channels = <&pm6150l_vadc ADC_GPIO4>; - io-channel-names = "rid_adc_channel"; - }; - - hall { - status = "okay"; - compatible = "hall"; - linux,input-type = <1>; - linux,code = <21>; - hall,gpio_flip_cover = <&pm6150_gpios 10 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&hall_default>; - }; - - certify_hall { - status = "okay"; - compatible = "certify_hall"; - linux,input-type = <1>; - linux,code = <27>; - certify_hall,gpio_certify_cover = <&tlmm 96 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&certify_hall_default>; - }; - - qupv3_se4_afc: afc@a80000 { - compatible = "pm6150_afc"; - reg = <0xa80000 0x4000>; - interrupts = ; - #address-cells = <1>; - #size-cells = <0>; - clock-names = "se-clk", "m-ahb", "s-ahb"; - clocks = <&clock_gcc GCC_QUPV3_WRAP1_S0_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_M_AHB_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_S_AHB_CLK>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&qupv3_se4_afc_active &gpio1_afc_switch_default>; - pinctrl-1 = <&qupv3_se4_afc_sleep>; - qcom,wrapper-core = <&qupv3_1>; - afc-gpios = <&pm6150_gpios 1 GPIO_ACTIVE_LOW>; - status = "ok"; - }; - - /* Sensor */ - qcom,lpass@62400000 { - sensor_vdd-supply = <&pm6150l_l8>; - qcom,sensor_vdd-uV-uA = <1800000 0>; - qcom,active-reg-names = "sensor_vdd"; - }; - - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = <&tlmm 115 0 /* sda */ - &tlmm 116 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default","on_i2c","off_i2c"; - pinctrl-0 = <&grip_i2c>; - pinctrl-1 = <&grip_i2c>; - pinctrl-2 = <&grip_gpio>; - - tc3xxk@20 { - compatible = "coreriver,tc3xx-grip"; - pinctrl-names = "default","on_irq","off_irq"; - pinctrl-0 = <&grip_irq>; - pinctrl-1 = <&grip_irq>; - pinctrl-2 = <&grip_input>; - reg = <0x20>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - coreriver,scl-gpio = <&tlmm 116 0>; - coreriver,sda-gpio = <&tlmm 115 0>; - coreriver,irq-gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_LOW>; - coreriver,regulator_ic = "pm6150_l16"; - coreriver,i2c-gpio = "true"; - coreriver,boot-on-ldo = "true"; - coreriver,fw_name = "coreriver/tc305k_a60_grip.fw"; - coreriver,use_bitmap = <1>; - }; - }; -}; - -/* Grip Sensor */ -&pm6150_l16 { - regulator-min-microvolt = <2200000>; - regulator-max-microvolt = <2200000>; - qcom,init-voltage = <2200000>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-display-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-display-r00.dtsi deleted file mode 100755 index d918d32ecc07..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-display-r00.dtsi +++ /dev/null @@ -1,217 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../drivers/gpu/drm/msm/samsung/NT36672A_B6P064YQ5LP/dsi_panel_NT36672A_B6P064YQ5LP_fhd_video.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - function = "gpio"; - }; - - config { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - function = "gpio"; - }; - - config { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; -#if 1 - bl_i2c_active: bl_i2c_active { - mux { - pins = "gpio21", "gpio22"; - function = "gpio"; - }; - config { - pins = "gpio21", "gpio22"; - drive-strength = <2>; - bias-disable; - }; - - }; - bl_i2c_suspend: bl_i2c_suspend { - mux { - pins = "gpio21", "gpio22"; - function = "gpio"; - }; - config { - pins = "gpio21", "gpio22"; - drive-strength = <2>; - bias-disable; - }; - }; -#endif -}; - -&soc { -#if 1 -/*to do: change hw i2c*/ - i2c_20: i2c@20 { - status = "okay"; - - cell-index = <20>; - compatible = "i2c-gpio"; - gpios = <&tlmm 21 0 /* sda */ - &tlmm 22 0 /* scl */ - >; - i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&bl_i2c_active>; - pinctrl-1 = <&bl_i2c_suspend>; - - isl98611_backlight@29 { - compatible = "isl98611,backlight-control"; - reg = <0x29>; - - isl98611_en_gpio = <&tlmm 25 0x00>; - isl98611_enp_gpio = <&tlmm 97 0x00>; - isl98611_enn_gpio = <&tlmm 103 0x00>; - - pinctrl-names = "i2c_default", "i2c_suspend"; - pinctrl-0 = <&bl_i2c_active>; - pinctrl-1 = <&bl_i2c_suspend>; - - blic_init_data = [ - 01 00 - 02 BF - 03 02 - 04 14 - 05 14 - 06 F4 - 10 FF - 11 07 - 12 BF - 13 80 - 14 FD - 16 F5 - 17 8D - ]; - }; - }; -#else - qupv3_se4_i2c: i2c@a80000 { - status = "okay"; - isl98611_backlight@29 { - compatible = "isl98611,backlight-control"; - reg = <0x29>; - - isl98611_en_gpio = <&tlmm 25 0x00>; - isl98611_enp_gpio = <&tlmm 97 0x00>; - isl98611_enn_gpio = <&tlmm 103 0x00>; - - blic_init_data = [ - 01 00 - 02 BF - 03 02 - 04 14 - 05 14 - 06 F4 - 10 FF - 11 07 - 12 BF - 13 80 - 14 FD - 16 F5 - 17 8D - ]; - }; - }; -#endif - /* A60Q panel */ - ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD_display: qcom,dsi-display@5 { - label = "ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD"; - qcom,display-type = "primary"; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_dsi_active>; - pinctrl-1 = <&sde_dsi_suspend>; - - vddr-supply = <&pm6150_l10>; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@6 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_dsi_active>; - pinctrl-1 = <&sde_dsi_suspend>; - }; -}; - -&sde_dsi { - qcom,dsi-display-list = - <&ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD_display - &ss_dsi_panel_PBA_BOOTING_FHD_display>; -}; - -&ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD_display { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD>; - - qcom,platform-reset-gpio = <&tlmm 91 0>; - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddr"; - qcom,supply-min-voltage = <1800000>; - qcom,supply-max-voltage = <1800000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <0>; - qcom,supply-pre-off-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD_display { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-reset-gpio = <&tlmm 91 0>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-display-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-display-r01.dtsi deleted file mode 100755 index c32424a744b4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-display-r01.dtsi +++ /dev/null @@ -1,253 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../drivers/gpu/drm/msm/samsung/NT36672A_B6P064YQ5LP/dsi_panel_NT36672A_B6P064YQ5LP_fhd_video.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/NT36672A_B6TMA60/dsi_panel_NT36672A_B6TMA60_fhd_video.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/NT36672A_PM6300JB1/dsi_panel_NT36672A_PM6300JB1_fhd_video.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - function = "gpio"; - }; - - config { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - function = "gpio"; - }; - - config { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; -#if 1 - bl_i2c_active: bl_i2c_active { - mux { - pins = "gpio21", "gpio22"; - function = "gpio"; - }; - config { - pins = "gpio21", "gpio22"; - drive-strength = <2>; - bias-disable; - }; - - }; - bl_i2c_suspend: bl_i2c_suspend { - mux { - pins = "gpio21", "gpio22"; - function = "gpio"; - }; - config { - pins = "gpio21", "gpio22"; - drive-strength = <2>; - bias-disable; - }; - }; -#endif -}; - -&soc { - i2c_20: i2c@20 { - status = "okay"; - - cell-index = <20>; - compatible = "i2c-gpio"; - gpios = <&tlmm 21 0 /* sda */ - &tlmm 22 0 /* scl */ - >; - i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&bl_i2c_active>; - pinctrl-1 = <&bl_i2c_suspend>; - - lm36274_backlight@11 { - compatible = "lm36274,backlight-control"; - reg = <0x11>; /* 7bits i2c addr */ - - lm36274_hwen_gpio = <&tlmm 25 0x00>; - lm36274_enp_gpio = <&tlmm 97 0x00>; - lm36274_enn_gpio = <&tlmm 103 0x00>; - - pinctrl-names = "i2c_default", "i2c_suspend"; - pinctrl-0 = <&bl_i2c_active>; - pinctrl-1 = <&bl_i2c_suspend>; - - blic_init_data = [ - 02 2B /*(defalut 28) ramp & PWM enable*/ - 03 8E /*(defalut 8d) LED current ramp, PWM sample rate & hysteris */ - /* TO DO: select a suitable BL value */ - 04 04 /* D[2:0] LSB of 11 bit BL code*/ - 05 D4 /* D[7:0] MSB of 11 bit BL code*/ - 09 99 /* VPOS and VNEG enabled via external pin*/ - 0E 1E /* VNEG -5.5V */ - /* TO DO: set PWM freq to be 10kHz or lower, remove reg 0x10, and set reg 0x03 PWM sample rate lower */ - 10 07 /* PWM sample rate 24MHz */ - 11 75 /* backlight_boost_l_select:10uH */ - 08 1F /* finally: BL_EN, all LEDs enable*/ - ]; - }; - }; - - /* A60Q panel */ - ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD_display: qcom,dsi-display@13 { - label = "ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD>; - }; - - ss_dsi_panel_NT36672A_B6TMA60_FHD_display: qcom,dsi-display@14 { - label = "ss_dsi_panel_NT36672A_B6TMA60_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_NT36672A_B6TMA60_FHD>; - }; - - ss_dsi_panel_NT36672A_PM6300JB1_FHD_display: qcom,dsi-display@15 { - label = "ss_dsi_panel_NT36672A_PM6300JB1_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_NT36672A_PM6300JB1_FHD>; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@16 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - }; -}; - -&sde_dsi { - vddr-supply = <&pm6150_l15>; - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_dsi_active>; - pinctrl-1 = <&sde_dsi_suspend>; - - qcom,dsi-display-list = - <&ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD_display - &ss_dsi_panel_NT36672A_B6TMA60_FHD_display - &ss_dsi_panel_NT36672A_PM6300JB1_FHD_display - &ss_dsi_panel_PBA_BOOTING_FHD_display>; -}; - -&ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD { - qcom,platform-reset-gpio = <&tlmm 91 0>; - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddr"; - qcom,supply-min-voltage = <1800000>; - qcom,supply-max-voltage = <1800000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <1>; - qcom,supply-pre-off-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_NT36672A_B6TMA60_FHD { - qcom,platform-reset-gpio = <&tlmm 91 0>; - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddr"; - qcom,supply-min-voltage = <1800000>; - qcom,supply-max-voltage = <1800000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <1>; - qcom,supply-pre-off-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_NT36672A_PM6300JB1_FHD { - qcom,platform-reset-gpio = <&tlmm 91 0>; - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddr"; - qcom,supply-min-voltage = <1800000>; - qcom,supply-max-voltage = <1800000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <1>; - qcom,supply-pre-off-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,platform-reset-gpio = <&tlmm 91 0>; - - qcom,display-topology = <1 0 1>; - qcom,mdss-dsi-panel-phy-timings = [24 1e 08 09 05 02 04 a0 - 24 1e 08 09 05 02 04 a0 - 24 1e 08 09 05 02 04 a0 - 24 1e 08 09 05 02 04 a0 - 24 1a 08 09 05 02 04 a0]; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-eif-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-eif-r00.dtsi deleted file mode 100755 index 897f498cbf1f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-eif-r00.dtsi +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - usb_noti: usb-notifier { - compatible = "samsung,usb-notifier"; - qcom,disable_control_en = <1>; - qcom,unsupport_host_en = <0>; - }; - - samsung,usbpd { - compatible = "samsung,usb-pd"; - qcom,samsung-usbpd-detection = <&pm6150_pdphy>; - }; -}; - -&usb0 { - dwc3@a600000 { - usb-phy = <&qusb_phy0>, <&usb_nop_phy>; - maximum-speed = "high-speed"; - }; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = <0xc0 0x80 - 0x53 0x84 - 0x81 0x88 - 0xc7 0x8c - 0x30 0x08 - 0x79 0x0c - 0x21 0x10 - 0x01 0x90 - 0x14 0x9c - 0x9f 0x1c - 0x00 0x18>; - qcom,qusb-phy-host-init-seq = <0xc0 0x80 - 0xc3 0x84 - 0x81 0x88 - 0xc7 0x8c - 0x30 0x08 - 0x79 0x0c - 0x21 0x10 - 0x01 0x90 - 0x14 0x9c - 0x9f 0x1c - 0x00 0x18>; - /* ex) efuse(0xC) + (-7) = 0x5 for tune2 high value */ - qcom,diff_tune2_device = <(-7)>; - qcom,diff_tune2_host = <(0)>; -}; - -&usb_qmp_phy { - status = "disabled"; -}; - -&qupv3_se3_i2c { - tfa9xxx@34 { - haptic_clk_en = <&tlmm 37 0>; - haptic-fw-intensity-max = <41>; - samsung,vib_type = "LINEAR_RCVMOT"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-fingerprint_00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-fingerprint_00.dtsi deleted file mode 100755 index ff3223784148..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-fingerprint_00.dtsi +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - etspi_drdypin { - etspi_drdypin_active: etspi_drdypin_active { - mux { - pins = "gpio93"; - function = "gpio"; - }; - config { - pins = "gpio93"; - drive-strength = <2>; - bias-disable; - }; - }; - etspi_drdypin_suspend: etspi_drdypin_suspend { - mux { - pins = "gpio93"; - function = "gpio"; - }; - config { - pins = "gpio93"; - drive-strength = <2>; - bias-pull-down; - }; - }; - }; - - etspi_ldopin { - etspi_ldopin: etspi_ldopin { - mux { - pins = "gpio42"; - function = "gpio"; - }; - config { - pins = "gpio42"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; - - etspi_rstpin { - etspi_rstpin: etspi_rstpin { - mux { - pins = "gpio94"; - function = "gpio"; - }; - config { - pins = "gpio94"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; -}; - -&qupv3_se2_spi { - status = "okay"; - - etspi-spi@0 { - compatible = "etspi,et5xx"; - reg = <0>; - spi-max-frequency = <50000000>; - etspi-min_cpufreq_limit = <1708800>; - pinctrl-names = "default", "sleep", "idle"; - pinctrl-0 = <&etspi_drdypin_suspend &etspi_ldopin &etspi_rstpin>; - pinctrl-1 = <&etspi_drdypin_suspend>; - pinctrl-2 = <&etspi_drdypin_active>; - - gpio-controller; - #gpio-cells = <2>; - - etspi-sleepPin = <&tlmm 94 0>; - etspi-drdyPin = <&tlmm 93 1>; - etspi-ldoPin = <&tlmm 42 0>; - etspi-chipid = "ET520"; - etspi-orient = <2>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-fingerprint_01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-fingerprint_01.dtsi deleted file mode 100755 index 08425fd5e981..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-fingerprint_01.dtsi +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - etspi_drdypin { - etspi_drdypin_active: etspi_drdypin_active { - mux { - pins = "gpio93"; - function = "gpio"; - }; - config { - pins = "gpio93"; - drive-strength = <2>; - bias-disable; - }; - }; - etspi_drdypin_suspend: etspi_drdypin_suspend { - mux { - pins = "gpio93"; - function = "gpio"; - }; - config { - pins = "gpio93"; - drive-strength = <2>; - bias-pull-down; - }; - }; - }; - - etspi_ldopin { - etspi_ldopin: etspi_ldopin { - mux { - pins = "gpio42"; - function = "gpio"; - }; - config { - pins = "gpio42"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; - - etspi_rstpin { - etspi_rstpin: etspi_rstpin { - mux { - pins = "gpio94"; - function = "gpio"; - }; - config { - pins = "gpio94"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; -}; - -&qupv3_se2_spi { - status = "okay"; - - etspi-spi@0 { - compatible = "etspi,et5xx"; - reg = <0>; - spi-max-frequency = <50000000>; - etspi-min_cpufreq_limit = <1708800>; - pinctrl-names = "default", "sleep", "idle"; - pinctrl-0 = <&etspi_drdypin_suspend &etspi_ldopin &etspi_rstpin>; - pinctrl-1 = <&etspi_drdypin_suspend>; - pinctrl-2 = <&etspi_drdypin_active>; - - gpio-controller; - #gpio-cells = <2>; - - etspi-sleepPin = <&tlmm 94 0>; - etspi-drdyPin = <&tlmm 93 1>; - etspi-ldoPin = <&tlmm 42 0>; - etspi-chipid = "ET520"; - etspi-orient = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-input-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-input-common.dtsi deleted file mode 100755 index 2f63b9bddd2f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-input-common.dtsi +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&tlmm { - tsp_int: tsp_int { - mux { - pins = "gpio89"; - function = "gpio"; - }; - - config { - pins = "gpio89"; - input-enable; - bias-disable; - }; - }; -}; - -&pm6150_l18 { - regulator-min-microvolt = <3000000>; - regulator-max-microvolt = <3000000>; - regulator-boot-on; -}; - -&qupv3_se1_i2c { - status = "ok"; - - novatek_ts: touchscreen@62 { - status = "disabled"; - compatible = "novatek,nvt-ts"; - reg = <0x62>; - pinctrl-names = "default"; - pinctrl-0 = <&tsp_int>; - novatek,firmware_name = "tsp_novatek/nt36672_a60.bin"; - novatek,irq-gpio = <&tlmm 89 0x2002>; - novatek,resolution = <1080 2340>; /* x y */ - novatek,max_touch_num = <10>; - novatek,area-size = <133 266 341>; /* indicator: 24dp navigator: 48dp edge: 60px dpi=320 */ - novatek,ss_touch_num = <1>; - novatek,factory_item_version = <1>; - - novatek,mp-support-dt; - - novatek-mp-criteria-1135@0 { /* tima panel */ - #address-cells = <1>; - #size-cells = <0>; - compatible = "novatek-mp-criteria-1135"; - - /* MP Criteria */ - open_test_spec = <0 3650>; - short_test_spec = <11380 14000>; - - diff_test_frame = <50>; - }; - - novatek-mp-criteria-7204@1 { /* csot panel */ - #address-cells = <1>; - #size-cells = <0>; - compatible = "novatek-mp-criteria-7204"; - - /* MP Criteria */ - open_test_spec = <0 3650>; - short_test_spec = <11380 14000>; - - diff_test_frame = <50>; - }; - }; -}; - -/delete-node/&key_vol_up_default; -&pm6150l_gpios { - key_vol_up { - key_vol_up_default: key_vol_up_default { - pins = "gpio8"; - function = "normal"; - input-enable; - bias-pull-up; - power-source = <0>; - }; - }; -}; - -&soc { - /delete-node/gpio_keys; - gpio_keys { - status = "ok"; - compatible = "gpio-keys"; - input-name = "gpio-keys"; - - pinctrl-names = "default"; - pinctrl-0 = <&key_vol_up_default>; - - vol_up { - label = "volume_up"; - gpios = <&pm6150l_gpios 8 0x1>; - linux,input-type = <1>; - linux,code = ; - debounce-interval = <15>; - }; - }; - - ss_touch { - compatible = "samsung,ss_touch"; - ss_touch,numbers = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-nfc-r00.dtsi deleted file mode 100755 index 3ba330450ecd..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-nfc-r00.dtsi +++ /dev/null @@ -1,85 +0,0 @@ - -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi1 = &qupv3_se6_spi; - }; -}; -*/ - -&tlmm { - ese_qupv3_se6_spi_sleep: ese_qupv3_se6_spi_sleep { - mux { - pins = "gpio6", "gpio7", "gpio8", - "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio6", "gpio7", "gpio8", - "gpio9"; - drive-strength = <6>; - bias-pull-down; /* pull down */ - output-low; - }; - }; - - nfc_qupv3_se5_i2c_sleep: nfc_qupv3_se5_i2c_sleep { - mux { - pins = "gpio14", "gpio15"; - function = "gpio"; - }; - - config { - pins = "gpio14", "gpio15"; - drive-strength = <2>; - bias-disable; - }; - }; -}; - -/* gpio14 and gpio15 are used for nfc i2c */ -&qupv3_se5_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se5_i2c_sleep>; - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <86 0>; - pn547,irq-gpio = <&tlmm 86 0>; - pn547,ven-gpio = <&tlmm 84 0>; - pn547,firm-gpio = <&tlmm 85 0>; - pn547,clk_req-gpio = <&tlmm 50 0>; /* BBCLK3 is controled by gpio 50 */ - pn547,pwr_req = <&tlmm 87 0>; - pn547,pvdd-gpio = <&tlmm 23 0>; - pn547,clk_req_wake; - }; -}; - - -/* gpio 6~9 are used for ese spi */ -&qupv3_se6_spi { - status = "okay"; - spi-max-frequency = <19200000>; - pinctrl-1 = <&ese_qupv3_se6_spi_sleep>; - - ese_spi@0 { - compatible = "p61"; - reg = <0>; - spi-max-frequency = <16000000>; - p61-ap_vendor = "qualcomm"; - p61-spi_node = <&qupv3_se6_spi>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-pinctrl-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-pinctrl-common.dtsi deleted file mode 100755 index a979c0d1e2f4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-pinctrl-common.dtsi +++ /dev/null @@ -1,450 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-audio-pinctrl.dtsi" - -&tlmm { - i2c_22_pinctrl: i2c_22_pinctrl { - mux { - pins = "gpio108", /* DISP_PMIC_SDA_1P8 */ - "gpio109"; /* DISP_PMIC_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio108", /* DISP_PMIC_SDA_1P8 */ - "gpio109"; /* DISP_PMIC_SCL_1P8 */ - drive-strength = <2>; - bias-disable; - }; - }; - /* smb1390 i2c */ - smb1390_i2c: smb1390_i2c { - smb1390_i2c_active: smb1390_i2c_active { - mux { - pins = "gpio113", "gpio114","gpio65","gpio59"; - function = "gpio"; - }; - - config { - pins = "gpio113", "gpio114","gpio65","gpio59"; - drive-strength = <2>; - bias-pull-down; - input-enable; - }; - }; - }; - - - sdc2_cd_on: cd_on { - mux { - pins = "gpio99"; - function = "gpio"; - }; - config { - pins = "gpio99"; - drive-strength = <2>; - bias-disable; - }; - certify_hall_default: certify_hall_default { - mux { - pins = "gpio96"; - function = "gpio"; - }; - config { - pins = "gpio96"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - - sdc2_data_on: sdc2_data_on { - config { - pins = "sdc2_data"; - bias-pull-up; /* pull up */ - drive-strength = <8>; /* 8 MA */ - }; - }; - - i2c17 { - grip_i2c: grip-i2c { - mux { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - bias-disable; - }; - }; - - grip_gpio: grip-gpio { - mux { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - bias-disable; - }; - }; - }; - - cam_sensor_mclk_0_active: cam_sensor_mclk_0_active { - /* REAR MCLK */ - mux { - pins = "gpio28"; - function = "cam_mclk"; - }; - config { - pins = "gpio28"; - bias-disable; /* No PULL */ - drive-strength = <4>; /* 4 MA */ - }; - }; - - cam_sensor_mclk_0_suspend: cam_sensor_mclk_0_suspend { - /* REAR MCLK */ - mux { - pins = "gpio28"; - function = "cam_mclk"; - }; - config { - pins = "gpio28"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <4>; /* 4 MA */ - output-low; - }; - }; - - cam_sensor_rear_active: cam_sensor_rear_active { - /* REAR RESET */ - mux { - pins = "gpio47"; - function = "gpio"; - }; - config { - pins = "gpio47"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_rear_suspend: cam_sensor_rear_suspend { - /* REAR RESET */ - mux { - pins = "gpio47"; - function = "gpio"; - }; - config { - pins = "gpio47"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_mclk_1_active: cam_sensor_mclk_1_active { - /* FRONT MCLK */ - mux { - pins = "gpio29"; - function = "cam_mclk"; - }; - config { - pins = "gpio29"; - bias-disable; /* No PULL */ - drive-strength = <8>; /* 8 MA */ - }; - }; - - cam_sensor_mclk_1_suspend: cam_sensor_mclk_1_suspend { - /* FRONT MCLK */ - mux { - pins = "gpio29"; - function = "cam_mclk"; - }; - config { - pins = "gpio29"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <8>; /* 8 MA */ - output-low; - }; - }; - cam_sensor_front_active: cam_sensor_front_active { - /* FRONT RESET */ - mux { - pins = "gpio45"; - function = "gpio"; - }; - config { - pins = "gpio45"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_front_suspend: cam_sensor_front_suspend { - /* FRONT RESET */ - mux { - pins = "gpio45"; - function = "gpio"; - }; - config { - pins = "gpio45"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_mclk_2_active: cam_sensor_mclk_2_active { - /* REAR2 MCLK */ - mux { - pins = "gpio30"; - function = "cam_mclk"; - }; - config { - pins = "gpio30"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_mclk_2_suspend: cam_sensor_mclk_2_suspend { - /* REAR2 MCLK */ - mux { - pins = "gpio30"; - function = "cam_mclk"; - }; - config { - pins = "gpio30"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - cam_sensor_rear2_active: cam_sensor_rear2_active { - /* REAR2 RESET */ - mux { - pins = "gpio46"; - function = "gpio"; - }; - config { - pins = "gpio46"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_rear2_suspend: cam_sensor_rear2_suspend { - /* REAR2 RESET */ - mux { - pins = "gpio46"; - function = "gpio"; - }; - config { - pins = "gpio46"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - cam_sensor_mclk_3_active: cam_sensor_mclk_3_active { - /* REAR SW-8M */ - mux { - pins = "gpio31"; - function = "cam_mclk"; - }; - config { - pins = "gpio31"; - bias-disable; /* No PULL */ - drive-strength = <4>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_mclk_3_suspend: cam_sensor_mclk_3_suspend { - /* REAR SW-8M */ - mux { - pins = "gpio31"; - function = "cam_mclk"; - }; - config { - pins = "gpio31"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <4>; /* 2 MA */ - output-low; - }; - }; - - - cam_sensor_rear3sw_active: cam_sensor_rear3sw_active { - /* REAR SUB2 RESET*/ - mux { - pins = "gpio100"; - function = "gpio"; - }; - config { - pins = "gpio100"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear3sw_suspend: cam_sensor_rear3sw_suspend { - /* REAR SUB2 RESET */ - mux { - pins = "gpio100"; - function = "gpio"; - }; - config { - pins = "gpio100"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_rear3_pwr_active: cam_rear3_pwr_active { - /* REAR SUB2 RESET*/ - mux { - pins = "gpio95"; - function = "gpio"; - }; - config { - pins = "gpio95"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_rear3_pwr_suspend: cam_rear3_pwr_suspend { - /* REAR SUB2 RESET */ - mux { - pins = "gpio95"; - function = "gpio"; - }; - config { - pins = "gpio95"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_mipi_sw_active: cam_sensor_mipi_sw_active { - /* MIPI_SWITCH */ - mux { - pins = "gpio49"; - function = "gpio"; - }; - config { - pins = "gpio49"; - bias-disable; /* No PULL */ - output-high; - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_mipi_sw_suspend: cam_sensor_mipi_sw_suspend { - /* MIPI_SWITCH */ - mux { - pins = "gpio49"; - function = "gpio"; - }; - config { - pins = "gpio49"; - bias-disable; /* No PULL */ - output-high; - drive-strength = <2>; /* 2 MA */ - }; - }; - - led_enable: led_enable { - mux { - pins = "gpio39"; - function = "gpio"; - }; - - config { - pins = "gpio39"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - led_disable: led_disable { - mux { - pins = "gpio39"; - function = "gpio"; - }; - - config { - pins = "gpio39"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; -}; - -&lpi_tlmm { - gpio-reserved-ranges = <0 8>, <12 6>, <25 1>; -}; - -&pm6150_gpios { - hall { - hall_default: hall_default { - pins = "gpio10"; - function = "normal"; - output-disable; - input-enable; - bias-disable; - power-source = <0>; - }; - }; - - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&pm6150l_gpios { - grip_irq: grip-irq { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_input: grip-input { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; - - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-pm-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-pm-common.dtsi deleted file mode 100755 index 092ccfb204e0..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-pm-common.dtsi +++ /dev/null @@ -1,191 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include - -&soc { - /* AP Thermistor table */ - sec_thermistor@0 { - compatible = "samsung,sec-ap-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "ap_therm"; - adc_array = <1992 2292 2592 3042 3500 4223 4596 4731 4947 5100 - 5210 5455 5528 5820 6017 6222 6422 6485 6808 7004 - 7224 7482 7765 8055 8310 8546 8866 9082 9348 9614 - 9850 10211 10469 10779 11159 11361 11752 12096 12352 12841 - 13112 13485 13790 13982 14456 14802 15169 15486 15706 16215 - 16453 16930 17305 17291 17972 18157 18603 18961 19367 20783 - 21527 23603 24753 25734 26491 27114>; - temp_array = <900 850 800 750 700 650 620 610 600 590 - 580 570 560 550 540 530 520 510 500 490 - 480 470 460 450 440 430 420 410 400 390 - 380 370 360 350 340 330 320 310 300 290 - 280 270 260 250 240 230 220 210 200 190 - 180 170 160 150 140 130 120 110 100 50 - 0 (-50) (-100) (-150) (-200) (-250)>; - }; - - /* PA Thermistor table */ - sec_thermistor@1 { - compatible = "samsung,sec-pa-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "pa_therm"; - adc_array = <1764 2164 2614 3114 3639 4389 4745 4888 5095 5253 - 5413 5605 5789 5983 6184 6383 6596 6750 7006 7237 - 7487 7677 8001 8274 8535 8764 9075 9328 9593 9895 - 10171 10481 10790 11074 11414 11686 12066 12388 12667 13083 - 13378 13740 14053 14321 14731 15079 15439 15776 16040 16483 - 16748 17168 17576 17658 18211 18553 18882 19237 19599 20891 - 22109 23850 24991 25891 26621 27215>; - temp_array = <900 850 800 750 700 650 620 610 600 590 - 580 570 560 550 540 530 520 510 500 490 - 480 470 460 450 440 430 420 410 400 390 - 380 370 360 350 340 330 320 310 300 290 - 280 270 260 250 240 230 220 210 200 190 - 180 170 160 150 140 130 120 110 100 50 - 0 (-50) (-100) (-150) (-200) (-250)>; - }; - - /* WiFi Thermistor table */ - sec_thermistor@2 { - compatible = "samsung,sec-wf-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - io-channel-names = "wf_therm"; - adc_array = <1720 2120 2520 3020 3552 4270 4633 4763 4983 5134 - 5251 5491 5601 5863 6061 6264 6452 6554 6863 7069 - 7281 7533 7818 8110 8371 8597 8916 9134 9399 9675 - 9946 10248 10545 10843 11231 11435 11832 12160 12414 12905 - 13180 13538 13856 13960 14526 14875 15245 15561 15761 16288 - 16539 16996 17383 17376 18047 18253 18680 19039 19431 20881 - 21580 23695 24840 25791 26541 27148>; - temp_array = <900 850 800 750 700 650 620 610 600 590 - 580 570 560 550 540 530 520 510 500 490 - 480 470 460 450 440 430 420 410 400 390 - 380 370 360 350 340 330 320 310 300 290 - 280 270 260 250 240 230 220 210 200 190 - 180 170 160 150 140 130 120 110 100 50 - 0 (-50) (-100) (-150) (-200) (-250)>; - }; - -}; - -&spmi_bus { - qcom,pm6150@0{ - qcom,power-on@800 { - interrupts = <0x0 0x8 0x0 IRQ_TYPE_NONE>, - <0x0 0x8 0x1 IRQ_TYPE_NONE>, - <0x0 0x8 0x4 IRQ_TYPE_NONE>, - <0x0 0x8 0x5 IRQ_TYPE_NONE>; - interrupt-names = "kpdpwr", "resin", - "resin-bark", "kpdpwr-resin-bark"; - qcom,store-hard-reset-reason; - qcom,s3-debounce = <128>; - - qcom,pon_1 { - qcom,support-reset = <0>; - }; - - qcom,pon_2 { - qcom,support-reset = <0>; - }; - - qcom,pon_3 { - qcom,pon-type = ; - qcom,support-reset = <1>; - qcom,pull-up = <1>; - qcom,s1-timer = <6720>; - qcom,s2-timer = <1000>; - qcom,s2-type = ; - qcom,use-bark; - }; - }; - }; - - qcom,pm6150l@5 { - flash_led: qcom,leds@d300 { - pm6150l_flash0: qcom,flash_0 { - label = "flash"; - qcom,led-name = "led:flash_0"; - qcom,max-current = <1500>; - qcom,default-led-trigger = "flash0_trigger"; - qcom,id = <0>; - qcom,current-ma = <1400>; - qcom,duration-ms = <1280>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - qcom,record-current-ma = <200>; - }; - pm6150l_torch0: qcom,torch_0 { - label = "torch"; - qcom,led-name = "led:torch_0"; - qcom,max-current = <500>; - qcom,default-led-trigger = "torch0_trigger"; - qcom,id = <0>; - qcom,current-ma = <300>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - }; - }; - }; -}; -&pm6150_gpios { - interrupts = <0x0 0xc0 0 IRQ_TYPE_NONE>, - <0x0 0xc1 0 IRQ_TYPE_NONE>, - <0x0 0xc2 0 IRQ_TYPE_NONE>, - <0x0 0xc3 0 IRQ_TYPE_NONE>, - <0x0 0xc6 0 IRQ_TYPE_NONE>, - <0x0 0xc7 0 IRQ_TYPE_NONE>, - <0x0 0xc9 0 IRQ_TYPE_NONE>; - interrupt-names = "pm6150_gpio1", "pm6150_gpio2", - "pm6150_gpio3", "pm6150_gpio4", - "pm6150_gpio7", "pm6150_gpio8", - "pm6150_gpio10"; - qcom,gpios-disallowed = <5 6 9>; -}; - -&pm6150_vadc { - sdm_therm { - reg = ; - label = "ap_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; -}; - -&pm6150l_vadc { - rf_pa0_therm { - reg = ; - label = "pa_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - rf_pa1_therm { - reg = ; - label = "wf_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r00.dts deleted file mode 100755 index 372e95f2ad65..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r00.dts +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a60q-pm-common.dtsi" - -#include "sm6150-sec-a60q-swa-r00.dtsi" -#include "sm6150-sec-a60q-swa-pinctrl-r00.dtsi" -#include "sm6150-sec-a60q-battery-common.dtsi" -#include "sm6150-sec-a60q-nfc-r00.dtsi" -#include "sm6150-sec-a60q-eif-r00.dtsi" -#include "sm6150-sec-a60q-display-r00.dtsi" -#include "sm6150-sec-a60q-fingerprint_00.dtsi" -#include "sm6150-sec-a60q-camera.dtsi" - -/ { - model = "Samsung A60Q PROJECT Bring-Up (board-id,00)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - status = "disabled"; - }; - - touchscreen@20 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r01.dts deleted file mode 100755 index 6065c2464981..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r01.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a60q-pm-common.dtsi" - -#include "sm6150-sec-a60q-swa-r01.dtsi" -#include "sm6150-sec-a60q-swa-pinctrl-r01.dtsi" -#include "sm6150-sec-a60q-battery-common.dtsi" -#include "sm6150-sec-a60q-nfc-r00.dtsi" -#include "sm6150-sec-a60q-eif-r00.dtsi" -#include "sm6150-sec-a60q-display-r01.dtsi" -#include "sm6150-sec-a60q-fingerprint_00.dtsi" -#include "sm6150-sec-a60q-camera.dtsi" - -/ { - model = "Samsung A60Q PROJECT (board-id,01)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 1>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r02.dts deleted file mode 100755 index 8de2a2e55961..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r02.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a60q-pm-common.dtsi" - -#include "sm6150-sec-a60q-swa-r02.dtsi" -#include "sm6150-sec-a60q-swa-pinctrl-r02.dtsi" -#include "sm6150-sec-a60q-battery-common.dtsi" -#include "sm6150-sec-a60q-nfc-r00.dtsi" -#include "sm6150-sec-a60q-eif-r00.dtsi" -#include "sm6150-sec-a60q-display-r01.dtsi" -#include "sm6150-sec-a60q-fingerprint_00.dtsi" -#include "sm6150-sec-a60q-camera-r01.dtsi" - -/ { - model = "Samsung A60Q PROJECT (board-id,02)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 2>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r03.dts deleted file mode 100755 index c85a727e38d1..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r03.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a60q-pm-common.dtsi" - -#include "sm6150-sec-a60q-swa-r03.dtsi" -#include "sm6150-sec-a60q-swa-pinctrl-r03.dtsi" -#include "sm6150-sec-a60q-battery-common.dtsi" -#include "sm6150-sec-a60q-nfc-r00.dtsi" -#include "sm6150-sec-a60q-eif-r00.dtsi" -#include "sm6150-sec-a60q-display-r01.dtsi" -#include "sm6150-sec-a60q-fingerprint_01.dtsi" -#include "sm6150-sec-a60q-camera-r01.dtsi" - -/ { - model = "Samsung A60Q PROJECT (board-id,03)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 3>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r04.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r04.dts deleted file mode 100755 index 0b6571ec7336..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r04.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a60q-pm-common.dtsi" - -#include "sm6150-sec-a60q-swa-r04.dtsi" -#include "sm6150-sec-a60q-swa-pinctrl-r04.dtsi" -#include "sm6150-sec-a60q-battery-common.dtsi" -#include "sm6150-sec-a60q-nfc-r00.dtsi" -#include "sm6150-sec-a60q-eif-r00.dtsi" -#include "sm6150-sec-a60q-display-r01.dtsi" -#include "sm6150-sec-a60q-fingerprint_01.dtsi" -#include "sm6150-sec-a60q-camera-r01.dtsi" - -/ { - model = "Samsung A60Q PROJECT (board-id,04)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 4>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r05.dts deleted file mode 100755 index 2faf45de178d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-overlay-r05.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a60q-pm-common.dtsi" - -#include "sm6150-sec-a60q-swa-r05.dtsi" -#include "sm6150-sec-a60q-swa-pinctrl-r05.dtsi" -#include "sm6150-sec-a60q-battery-common.dtsi" -#include "sm6150-sec-a60q-nfc-r00.dtsi" -#include "sm6150-sec-a60q-eif-r00.dtsi" -#include "sm6150-sec-a60q-display-r01.dtsi" -#include "sm6150-sec-a60q-fingerprint_01.dtsi" -#include "sm6150-sec-a60q-camera-r01.dtsi" - -/ { - model = "Samsung A60Q PROJECT (board-id,05)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 5>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r00.dtsi deleted file mode 100755 index 3b856f2eb712..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r00.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-pinctrl-common.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r01.dtsi deleted file mode 100755 index 8d95ed2ec5f7..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-swa-pinctrl-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r02.dtsi deleted file mode 100755 index 4745de61c305..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-swa-pinctrl-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r03.dtsi deleted file mode 100755 index d32592f889d8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-swa-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r04.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r04.dtsi deleted file mode 100755 index 54e58ab2062c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r04.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-swa-pinctrl-r03.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r05.dtsi deleted file mode 100755 index e3bb7c9a1b96..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-pinctrl-r05.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-swa-pinctrl-r04.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r00.dtsi deleted file mode 100755 index 8a30ad33b958..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r00.dtsi +++ /dev/null @@ -1,107 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-common.dtsi" -#include "sm6150-sec-a60q-input-common.dtsi" - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1000000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1100000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1100000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <3200000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2850000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -&novatek_ts { - status = "okay"; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r01.dtsi deleted file mode 100755 index 8386e376fdfd..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r01.dtsi +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-swa-r00.dtsi" - -&soc { - /* not use ufs */ - /delete-node/ ufsphy_mem@1d87000; - /delete-node/ ufshc@1d84000; - /delete-node/ ufsice@1d90000; -}; - -/* use eMMC */ -&sdhc_1 { - status = "ok"; -}; - -&firmware { - android { - fstab { - product { - dev = "/dev/block/platform/soc/7c4000.sdhci/by-name/product"; - }; - vendor { - dev = "/dev/block/platform/soc/7c4000.sdhci/by-name/vendor"; - }; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r02.dtsi deleted file mode 100755 index 0f5670a47764..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r02.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-swa-r01.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r03.dtsi deleted file mode 100755 index e2f559f5e478..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r03.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-swa-r02.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r04.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r04.dtsi deleted file mode 100755 index 5dd2817b10de..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r04.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-swa-r03.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r05.dtsi deleted file mode 100755 index 75fd333da457..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a60q-swa-r05.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-swa-r04.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-audio-pinctrl.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-audio-pinctrl.dtsi deleted file mode 100755 index 8b137891791f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-audio-pinctrl.dtsi +++ /dev/null @@ -1 +0,0 @@ - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-audio.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-audio.dtsi deleted file mode 100755 index aef72a711c0f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-audio.dtsi +++ /dev/null @@ -1,139 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../qcom/sm6150-audio-overlay.dtsi" - -&bolero { - qcom,num-macros = <4>; - imp_list: imp_list { - #list-imp-cells = <3>; - }; -}; - -&wcd937x_codec { - qcom,cdc-micbias2-mv = <2800>; - imp-table = <&imp_list 0 5 6>, - <&imp_list 6 23 8>, - <&imp_list 24 38 7>, - <&imp_list 39 100 6>, - <&imp_list 101 160 10>, - <&imp_list 161 400 11>, - <&imp_list 401 2000 11>, - <&imp_list 2001 0x7fffffff 6>; -}; - -&sm6150_snd { - qcom,model = "sm6150-idp-snd-card"; - qcom,msm-mi2s-master = <1>, <1>, <1>, <1>, <1>; - qcom,ext-disp-audio-rx = <1>; - - asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>, - <&loopback>, <&compress>, <&hostless>, - <&afe>, <&lsm>, <&routing>, <&compr>, - <&pcm_noirq>, <&samsung_q6audio_adaptation>; - asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", - "msm-pcm-dsp.2", "msm-voip-dsp", - "msm-pcm-voice", "msm-pcm-loopback", - "msm-compress-dsp", "msm-pcm-hostless", - "msm-pcm-afe", "msm-lsm-client", - "msm-pcm-routing", "msm-compr-dsp", - "msm-pcm-dsp-noirq", "q6audio-adaptation"; - qcom,audio-routing = - "AMIC1", "MIC BIAS1", - "MIC BIAS1", "Analog Mic1", - "AMIC2", "MIC BIAS2", - "MIC BIAS2", "Analog Mic2", - "AMIC3", "MIC BIAS3", - "MIC BIAS3", "Analog Mic3", - "IN1_HPHL", "HPHL_OUT", - "IN2_HPHR", "HPHR_OUT", - "IN3_AUX", "AUX_OUT", - "TX SWR_ADC0", "ADC1_OUTPUT", - "TX SWR_ADC2", "ADC2_OUTPUT", - "WSA SRC0_INP", "SRC0", - "WSA_TX DEC0_INP", "TX DEC0 MUX", - "WSA_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC0_INP", "TX DEC0 MUX", - "RX_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC2_INP", "TX DEC2 MUX", - "RX_TX DEC3_INP", "TX DEC3 MUX", - "SpkrLeft IN", "WSA_SPK1 OUT"; - qcom,msm-mbhc-hs-mic-max-threshold-mv = <9999>; - qcom,msm-mbhc-hs-mic-min-threshold-mv = <640>; - qcom,msm-mbhc-hphl-swh = <1>; - qcom,msm-mbhc-gnd-swh = <0>; - qcom,cdc-dmic01-gpios = <0>; - qcom,cdc-dmic23-gpios = <0>; - qcom,fm-lna-gpios = <&tlmm 119 0>; - asoc-codec = <&stub_codec>, <&bolero>, <&ext_disp_audio_codec>; - asoc-codec-names = "msm-stub-codec.1", "bolero_codec", - "msm-ext-disp-audio-codec-rx"; - qcom,wsa-max-devs = <1>; - qcom,wsa-devs = <&wsa881x_0213>; - qcom,wsa-aux-dev-prefix = "SpkrLeft"; - - qcom,codec-max-aux-devs = <1>; - qcom,codec-aux-devs = <&wcd937x_codec>; - qcom,msm_audio_ssr_devs = <&audio_apr>, <&q6core>, - <&lpi_tlmm>, <&bolero>; - mbhc-button-thres = <&det_zones 13 63>, - <&det_zones 88 138>, - <&det_zones 125 125>, - <&det_zones 225 225>, - <&det_zones 500 500>, - <&det_zones 500 620>, - <&det_zones 500 620>, - <&det_zones 500 620>; -}; - -&soc { - det_zones: det_zones { - #list-det-cells = <2>; - }; - - samsung_q6audio_adaptation: samsung,q6audio-adaptation { - compatible = "samsung,q6audio-adaptation"; - adaptation,voice-tracking-tx-port-id = <0xB037>; - adaptation,amp-rx-port-id = <0xB000>; - }; -}; - -&wsa_macro { - #cooling-cells = <2>; -}; - -&thermal_zones { - aoss-lowc { - cooling-maps { - audio_cdev { - cooling-device = <&wsa_macro 1 1>; - }; - }; - }; -}; - -&wsa_spkr_en2 { - status = "disabled"; -}; -&fsa4480 { - status = "disabled"; -}; -&wsa881x_0211 { - status = "disabled"; -}; -&wsa881x_0212 { - status = "disabled"; -}; -&wsa881x_0214 { - status = "disabled"; -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-battery-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-battery-common.dtsi deleted file mode 100755 index 8478e002a248..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-battery-common.dtsi +++ /dev/null @@ -1,237 +0,0 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&mtp_batterydata { - /delete-node/ qcom,alium_860_89032_0000_3600mAh; - /delete-node/ qcom,mlp356477_2800mah; - #include "sm6150-sec-qg-batterydata-a70q.dtsi" -}; - -&pm6150_qg { - qcom,vbatt-cutoff-mv = <3400>; /* SOC 0% */ - qcom,qg-iterm-ma = <450>; /* SOC 100% */ -}; - -&pm6150_charger { - /delete-property/ qcom,sec-charger-config; - qcom,sec-charger-config = <1>; - qcom,chg-term-src = <1>; /* 0 : ITERM_SRC_UNSPECIFIED, 1 : ITERM_SRC_ADC, 2 : ITERM_SRC_ANALOG */ - qcom,chg-term-current-ma = <(-250)>; - qcom,fcc-max-ua = <3950000>; - qcom,usb-icl-ua = <2800000>; - qcom,sw-jeita-enable; - qcom,float-option = <2>; - qcom,otg-cl-ua = <1500000>; - qcom,hard-jeita-enable; - qcom,wdog-snarl-based-step-chg; - qcom,auto-recharge-soc = <(-22)>; - qcom,auto-recharge-vbat-mv = <4280>; - - qcom,jeita_cold_trigger = <0x57F0>; /* 0 degree */ - qcom,jeita_cold_release = <0x55AE>; /* 2 degree */ - qcom,jeita_hot_trigger = <0x1C52>; /* 50 degree */ - qcom,jeita_hot_release = <0x1E14>; /* 48 degree */ - - rid-gnd-gpio = <&pm6150l_gpios 9 GPIO_ACTIVE_LOW>; -}; - -&smb1390_charger { - qcom,min-ilim-ua = <750000>; - qcom,max-cutoff-soc = <85>; -}; - -&soc { - battery { - status = "okay"; - compatible = "samsung,sec-battery"; - battery,store_mode_polling_time = <30>; - battery,gpio_vbat_sense = <&pm6150l_gpios 12 GPIO_ACTIVE_LOW>; - battery,gpio_sub_pcb_detect = <&pm6150_gpios 8 GPIO_ACTIVE_LOW>; - battery,full_check_current_1st = <450>; - battery,use_temp_adc_table; - battery,use_chg_temp_adc_table; - - battery,temp_table_adc = <2114 2451 2853 3305 3896 - 4522 5388 6360 7250 8376 - 9721 11193 12793 14423 16240 - 17893 19736 21066 22512 23710 - 24874 25779 26214>; - battery,temp_table_data = <900 850 800 750 700 - 650 600 550 500 450 - 400 350 300 250 200 - 150 100 50 0 (-50) - (-100) (-150) (-200)>; - - battery,chg_temp_table_adc = <7933 8030 8182 8342 8491 - 8637 8767 8944 9097 9278 - 9431 9589 9752 9915 10071 - 10204 10387 10568 10710 10882 - 11040 11210 11374>; - battery,chg_temp_table_data = <(-200) (-150) (-100) (-50) 0 - 50 100 150 200 250 - 300 350 400 450 500 - 550 600 650 700 750 - 800 850 900>; - - /* mix temp setting value */ - battery,mix_temp_recovery = <390>; - battery,mix_temp_batt_threshold = <420>; - battery,mix_temp_die_threshold = <700>; - - /* chg temp setting value */ - battery,chg_high_temp = <540>; - battery,chg_high_temp_recovery = <520>; - battery,chg_input_limit_current = <1000>; - battery,chg_charging_limit_current = <1250>; - - /* d/c chg temp setting value */ - battery,check_dc_chg_lmit; - battery,dc_chg_high_temp = <560>; - battery,dc_chg_high_temp_recovery = <540>; - battery,dc_chg_input_limit_current = <1200>; - - /* Safety timer parameters */ - battery,standard_curr = <3150000>; //equal to last step of step_chg_ranges - battery,expired_time = <10920>; //182min (requested by HQE euna87.kim) - battery,recharging_expired_time = <5400>; //90mins - battery,safety_timer_polling_time = <30>; - - battery,battery_full_capacity = <4400>; /* battery capacity */ - /* disable Vbat ovp dettection */ - battery,cisd_max_voltage_thr = <5000>; /* batttery ovp dettection voltage */ - battery,cisd_alg_index = <7>; - - battery,siop_input_limit_current = <1200>; - battery,siop_charging_limit_current = <1800>; - battery,siop_hv_input_limit_current = <700>; - battery,siop_hv_charging_limit_current = <1800>; - battery,siop_dc_input_limit_current = <1000>; - battery,siop_dc_charging_limit_current = <2000>; - - battery,ttf_hv_charge_current = <2480>; - battery,ttf_dc25_charge_current = <3020>; - - battery,ttf_capacity = <3762>; - battery,cv_data = < - 3158 735 2580 - 2962 751 2520 - 2757 765 2450 - 2657 775 2390 - 2559 785 2330 - 2349 794 2270 - 2252 803 2210 - 2150 812 2150 - 2045 821 2090 - 1943 830 2030 - 1845 840 1960 - 1734 849 1900 - 1634 857 1840 - 1623 865 1770 - 1602 872 1710 - 1501 879 1650 - 1412 886 1590 - 1334 892 1530 - 1267 898 1470 - 1199 904 1400 - 1138 909 1340 - 1084 915 1280 - 1023 920 1210 - 961 925 1150 - 931 930 1090 - 884 934 1010 - 832 939 950 - 795 943 890 - 764 947 820 - 725 951 760 - 688 955 700 - 658 958 630 - 628 961 570 - 593 965 510 - 575 968 450 - 549 971 380 - 519 973 320 - 500 976 260 - 474 979 200 - 455 981 140 - 433 983 90 - 428 984 60 - 404 988 45 - 392 994 25 - 368 1000 0 - >; - }; - -/* sec_battery_cable - * 0 UNKNOWN, - * 1 BATTERY, - * 2 UPS, - * 3 MAINS, - * 4 USB, - * 5 USB_DCP, - * 6 USB_CDP, - * 7 USB_ACA, - * 8 USB_TYPE_C, - * 9 USB_PD, - * 10 USB_PD_DRP, - * 11 APPLE_BRICK_ID, - * 12 USB_HVDCP, - * 13 USB_HVDCP_3, - * 14 WIRELESS, - * 15 USB_FLOAT, - * 16 BMS, - * 17 PARALLEL, - * 18 MAIN, - * 19 WIPOWER, - * 20 UFP, - * 21 DFP, - * 22 CHARGE_PUMP, - * 23 POWER_SHARING, - * 24 OTG, - * 25 AFC, - * 26 CABLE_MAX, -*/ - cable-info { - default_input_current = <1800>; - default_charging_current = <2100>; - - current_group_1 { - cable_number = <12 25>; - input_current = <1650>; - charging_current = <3150>; - }; - current_group_2 { - cable_number = <4 8 15>; - input_current = <500>; - charging_current = <700>; - }; - current_group_3 { - cable_number = <9 13>; - input_current = <2800>; - charging_current = <3950>; - }; - current_group_4 { - cable_number = <6 7>; - input_current = <1500>; - charging_current = <1500>; - }; - current_group_5 { - cable_number = <23 24>; - input_current = <500>; - charging_current = <500>; - }; - current_group_6 { - cable_number = <14>; - input_current = <900>; - charging_current = <2850>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-battery-sm5713.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-battery-sm5713.dtsi deleted file mode 100755 index e751adb40e60..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-battery-sm5713.dtsi +++ /dev/null @@ -1,391 +0,0 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&pm6150_vadc { - bat_thm { /* BAT_THERM */ - label = "bat_thm"; - reg = ; - qcom,pre-scaling = <1 1>; - qcom,hw-settle-time = <200>; - qcom,ratiometric; - }; - chg_thm { /* AMUX_4 */ - label = "chg_thm"; - reg = ; - qcom,pre-scaling = <1 1>; - qcom,hw-settle-time = <200>; - qcom,ratiometric; - }; -}; - -&soc { - sec-direct-charger { - status = "okay"; - compatible = "samsung,sec-direct-charger"; - - charger,battery_name = "battery"; - charger,main_charger = "sm5713-charger"; - charger,direct_charger = "pca9468-charger"; - - charger,dc_min_current = <2000>; - }; - - battery { - status = "okay"; - compatible = "samsung,sec-battery"; - pinctrl-names = "default"; - battery,vendor = "BATTERY"; - battery,charger_name = "sec-direct-charger"; - battery,fuelgauge_name = "sm5713-fuelgauge"; - battery,technology = <2>; /* POWER_SUPPLY_TECHNOLOGY_LION */ - battery,fgsrc_switch_name = "sm5713-fuelgauge"; /* Fuelgauge voltage source */ - - battery,batt_data_version = <2>; - - battery,chip_vendor = "QCOM"; - battery,temp_adc_type = <1>; /* SEC_BATTERY_ADC_TYPE_AP */ - - battery,temp_check_type = <3>; /* SEC_BATTERY_TEMP_CHECK_ADC */ - battery,usb_temp_check_type = <0>; - battery,chg_temp_check_type = <0>; - battery,wpc_temp_check_type = <0>; - battery,dchg_temp_check_type = <0>; /* SEC_BATTERY_TEMP_CHECK_NONE for test */ - - battery,thermal_source = <3>; /* SEC_BATTERY_THERMAL_SOURCE_ADC */ - battery,usb_thermal_source = <0>; /* SEC_BATTERY_THERMAL_SOURCE_NONE */ - battery,chg_thermal_source = <3>; /* SEC_BATTERY_THERMAL_SOURCE_ADC */ - battery,wpc_thermal_source = <0>; /* SEC_BATTERY_THERMAL_SOURCE_NONE */ - battery,dchg_thermal_source = <3>; /* SEC_BATTERY_THERMAL_SOURCE_CHG_ADC */ - - battery,polling_time = <10 30 30 30 3600>; - - battery,temp_table_adc = <121128 144571 172663 209017 245998 - 291586 341283 402659 472728 547188 - 629714 693750 796993 896626 1005211 - 1117430 1217992 1321993 1417603 1502075 - 1573766 1637781 1684580>; - battery,temp_table_data = <900 850 800 750 700 - 650 600 550 500 450 - 400 350 300 250 200 - 150 100 50 0 (-50) - (-100) (-150) (-200)>; - - battery,chg_temp_table_adc = <118209 142495 170328 206617 244204 - 289727 339532 401340 471755 547123 - 627421 691586 794744 894246 1003135 - 1115419 1215484 1319225 1415419 1499740 - 1569095 1638126 1685639>; - battery,chg_temp_table_data = <900 850 800 750 700 - 650 600 550 500 450 - 400 350 300 250 200 - 150 100 50 0 (-50) - (-100) (-150) (-200)>; - - battery,dchg_temp_table_adc = <110882 138414 166566 194718 234600 - 276828 326094 387090 448086 525504 - 607614 696762 792948 893826 999396 - 1107312 1210536 1304376 1393524 1473288 - 1543668 1602318 1651584>; - battery,dchg_temp_table_data = <900 850 800 750 700 - 650 600 550 500 450 - 400 350 300 250 200 - 150 100 50 0 (-50) - (-100) (-150) (-200)>; - - battery,adc_check_count = <5>; - - battery,cable_check_type = <4>; /* SEC_BATTERY_CABLE_CHECK_PSY */ - battery,cable_source_type = <1>; /* SEC_BATTERY_CABLE_SOURCE_EXTERNAL */ - battery,polling_type = <1>; /* SEC_BATTERY_MONITOR_ALARM */ - battery,monitor_initial_count = <0>; - - battery,battery_check_type = <0>; /* SEC_BATTERY_CHECK_NONE */ - battery,check_count = <0>; - battery,check_adc_max = <1440>; - battery,check_adc_min = <0>; - - battery,ovp_uvlo_check_type = <3>; /* SEC_BATTERY_OVP_UVLO_CHGPOLLING */ - - battery,temp_check_count = <1>; - battery,temp_highlimit_threshold_event = <800>; - battery,temp_highlimit_recovery_event = <750>; - battery,temp_high_threshold_event = <500>; - battery,temp_high_recovery_event = <450>; - battery,temp_low_threshold_event = <0>; - battery,temp_low_recovery_event = <50>; - battery,temp_highlimit_threshold_normal = <800>; - battery,temp_highlimit_recovery_normal = <750>; - battery,temp_high_threshold_normal = <500>; - battery,temp_high_recovery_normal = <450>; - battery,temp_low_threshold_normal = <0>; - battery,temp_low_recovery_normal = <50>; - battery,temp_highlimit_threshold_lpm = <800>; - battery,temp_highlimit_recovery_lpm = <750>; - battery,temp_high_threshold_lpm = <500>; - battery,temp_high_recovery_lpm = <450>; - battery,temp_low_threshold_lpm = <0>; - battery,temp_low_recovery_lpm = <50>; - - battery,full_check_type = <2>; /* SEC_BATTERY_FULLCHARGED_FG_CURRENT */ - battery,full_check_type_2nd = <2>; /* SEC_BATTERY_FULLCHARGED_FG_CURRENT */ - battery,full_check_count = <1>; - battery,chg_gpio_full_check = <0>; - battery,chg_polarity_full_check = <1>; - - battery,chg_high_temp = <460>; - battery,chg_high_temp_recovery = <440>; - battery,chg_input_limit_current = <1000>; - battery,chg_charging_limit_current = <1250>; - battery,dchg_input_limit_current = <1000>; - battery,dchg_charging_limit_current = <2000>; - - battery,mix_high_temp = <420>; - battery,mix_high_chg_temp = <500>; - battery,mix_high_temp_recovery = <390>; - - /* SEC_BATTERY_FULL_CONDITION_NOTIMEFULL | SEC_BATTERY_FULL_CONDITION_VCELL */ - battery,full_condition_type = <9>; - battery,full_condition_soc = <93>; - battery,full_condition_vcell = <4250>; - - battery,recharge_check_count = <1>; - battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */ - battery,recharge_condition_soc = <98>; - battery,recharge_condition_vcell = <4280>; - - battery,charging_total_time = <14400>; - battery,hv_charging_total_time = <10800>; - battery,normal_charging_total_time = <18000>; - battery,usb_charging_total_time = <36000>; - battery,recharging_total_time = <5400>; - battery,charging_reset_time = <0>; - - battery,chg_float_voltage = <4350>; - - battery,pre_afc_work_delay = <2000>; - battery,pre_wc_afc_work_delay = <4000>; - battery,pre_afc_input_current = <500>; - battery,pre_wc_afc_input_current = <500>; - battery,prepare_ta_delay = <0>; /* msec */ - - battery,swelling_high_temp_block = <410>; - battery,swelling_high_temp_recov = <390>; - battery,swelling_low_temp_block_1st = <150>; - battery,swelling_low_temp_recov_1st = <200>; - battery,swelling_low_temp_block_2nd = <50>; - battery,swelling_low_temp_recov_2nd = <100>; - - battery,swelling_low_temp_current = <950>; /* 0.3C */ - battery,swelling_low_temp_current_2nd = <400>; /* 0.1C */ - battery,swelling_low_temp_topoff = <200>; /* 0.05C */ - battery,swelling_high_temp_current = <1400>; /* 0.45C */ - battery,swelling_high_temp_topoff = <200>; /* 0.05C */ - battery,swelling_wc_high_temp_current = <1400>; /* 0.3C */ - battery,swelling_wc_low_temp_current = <950>; /* 0.3C */ - battery,swelling_wc_low_temp_current_2nd = <400>; /* 0.1C */ - - battery,swelling_drop_float_voltage = <4150>; - battery,swelling_high_rechg_voltage = <4000>; - battery,swelling_low_rechg_voltage = <4000>; - - battery,siop_event_check_type = <1>; - battery,siop_call_cv_current = <330>; - battery,siop_call_cc_current = <330>; - - battery,siop_input_limit_current = <1200>; - battery,siop_charging_limit_current = <1000>; - battery,siop_hv_input_limit_current = <500>; - battery,siop_hv_charging_limit_current = <1000>; - - battery,pd_charging_charge_power = <25000>; - battery,max_charging_current = <5100>; - - /* cycle, chg_float_voltage, recharge_condition_vcell, full_condition_vcell, full_condition_soc */ - battery,age_data = <0 4350 4280 4250 93 - 300 4330 4260 4230 92 - 400 4310 4240 4210 91 - 700 4290 4220 4190 90 - 1000 4240 4170 4140 89>; - - /* step charging option */ - battery,step_charging_type = <0x61>; /* STEP_CHARGING_CONDITION_INPUT_CURRENT, CURRENT_NOW, FLOAT_VOLTAGE, VOLTAGE */ - battery,step_charging_charge_power = <15000>; - battery,step_charging_condtion = <2000 1570 0>; - battery,step_charging_soc_condtion = <40 70 100>; - battery,step_charging_current = <4500 3950 3150>; - battery,step_charging_float_voltage = <4090 4220 4350>; - - battery,max_input_voltage = <9000>; /* mV */ - battery,max_input_current = <3000>; /* mA */ - - battery,enable_sysovlo_irq; - - battery,standard_curr = <2850>; - battery,expired_time = <10800>; - battery,recharging_expired_time = <5400>; - - battery,battery_full_capacity = <4000>; - battery,cisd_max_voltage_thr = <4400>; /* batttery ovp dettection voltage */ - battery,cisd_alg_index = <7>; - - io-channels = <&pm6150_vadc ADC_BAT_THERM_PU2>, <&pm6150_vadc ADC_AMUX_THM4_PU2>; - io-channel-names = "adc-temp", "adc-chg-temp"; - }; - - sm5713-fuelgauge{ - status = "okay"; - compatible = "sm5713-fuelgauge,i2c"; - fuelgauge,fuel_alert_soc = <1>; - fuelgauge,capacity_max = <1000>; - fuelgauge,capacity_max_margin = <70>; - fuelgauge,capacity_min = <0>; - fuelgauge,capacity_calculation_type = <0x1F>; - battery_params { - battery,id = <0>; - battery0,battery_type = <4400 0x0 0x2124>; /* 4200 or 4350 or 4400 */ - battery0,battery_table0 = <0x1400 0x1B33 0x1BF6 0x1C97 0x1D35 0x1D7F 0x1D92 0x1DBA 0x1DF2 0x1E38 0x1E68 0x1EA0 0x1ED6 0x1F03 0x1F49 0x1F71 0x1FB7 0x1FC6 0x1FE9 0x202D 0x2086 0x20D1 0x2209 0x2400>; - battery0,battery_table1 = <0x0 0x4C 0x119 0x233 0x3E6 0x699 0xC00 0xEB3 0x1433 0x1F00 0x29E6 0x3200 0x3780 0x3A33 0x3CE6 0x3F99 0x4500 0x47CC 0x4A80 0x4D33 0x4FE6 0x554C 0x6400 0x6419>; - battery0,battery_table2 = <0x4B 0x44 0x40 0x3E 0x3C 0x3B 0x38 0x37 0x35 0x34 0x34 0x33 0x33 0x33 0x33 0x32>; - battery0,rce_value = <0x04E1 0x03E6 0x01D7>; - battery0,rs_value = <0x00a4 0x147 0x146 0x3800 0x007a>; /*rs p_mix_factor, n_mix_factor max min*/ - battery0,misc = <0x0000>; - battery0,topoff_soc = <0 3 450>; /*disable soc*/ - battery0,vit_period = <0x0a0a>; - battery0,dtcd_value = <0x1>; - battery0,volt_cal = <0x800b 0x800b>; - battery0,curr_offset = <1 0 0 0 0 0 0>; - battery0,mix_value = <0x0103 0x0004>; /*mix_rate init_blank*/ - battery0,temp_std = <25>; - battery0,temp_cal = <0 6 1 11 (-1) 1 6 1 9 1>; - battery0,ext_temp_cal = <0 2 1 2 1 1 2 3 2 3>; - battery0,temp_volcal = <1 15 1>; - battery0,temp_offset = <1 11 1 1 8 (-1)>; - battery0,curr_cal = <0x8080 0x8080 0x8080 0x8080 0x8080 0x8080>; - battery0,tem_poff = <3400 50 3250 50>; - battery0,arsm = <1 3 1 0x6>; - battery0,cycle_cfg = <0 0 0>; - battery0,full_offset = <0 50 0 0xD1 0x90>; - battery0,age_cntl = <0x325>; - battery0,tcal_ioff = <0x02 0x00>; - battery0,v_offset_cancel = <0 0 100 10>; - battery0,v_alarm = <3100 0>; - battery0,v_max_table = <0x2209 0x2200 0x21ED 0x21CB 0x2175>; - battery0,q_max_table = <0x2124 0x1CC4 0x1C44 0x1BC4 0x1A85>; - battery0,data_ver = <1>; - }; - }; - -/* sec_battery_cable - * 0 UNKNOWN, - * 1 NONE, - * 2 PREPARE_TA, - * 3 TA, - * 4 USB, - * 5 USB_CDP, - * 6 9V_TA, - * 7 9V_ERR, - * 8 9V_UNKNOWN, - * 9 12V_TA, - * 10 WIRELESS, - * 11 HV_WIRELESS, - * 12 PMA_WIRELESS, - * 13 WIRELESS_PACK, - * 14 WIRELESS_PACK_TA, - * 15 WIRELESS_STAND, - * 16 WIRELESS_HV_STAND, - * 17 QC20, - * 18 QC30, - * 19 PDIC, - * 20 UARTOFF, - * 21 OTG, - * 22 LAN_HUB, - * 23 POWER_SHARING, - * 24 HMT_CONNECTED, - * 25 HMT_CHARGE, - * 26 HV_TA_CHG_LIMIT, - * 27 WIRELESS_VEHICLE, - * 28 WIRELESS_HV_VEHICLE, - * 29 PREPARE_WIRELESS_HV, - * 30 TIMEOUT, - * 31 SMART_OTG, - * 32 SMART_NOTG, - * 33 PDIC_PPS, - * 34 CABLE_MAX, -*/ - cable-info { - default_input_current = <1800>; - default_charging_current = <2100>; - full_check_current_1st = <400>; - full_check_current_2nd = <200>; - - current_group_1 { - cable_number = <2 19 21 22 23 30>; - input_current = <500>; - charging_current = <500>; - }; - current_group_2 { - cable_number = <25 31>; - input_current = <1000>; - charging_current = <1000>; - }; - current_group_3 { - cable_number = <5 32>; - input_current = <1500>; - charging_current = <1500>; - }; - current_group_4 { - cable_number = <6 7 8 17 18>; - input_current = <1600>; - charging_current = <2850>; - }; - current_group_5 { - cable_number = <9>; - input_current = <1600>; - charging_current = <2850>; - }; - current_group_6 { - cable_number = <10 12 14 15 27>; - input_current = <900>; - charging_current = <2850>; - }; - current_group_7 { - cable_number = <13>; - input_current = <700>; - charging_current = <2850>; - }; - current_group_8 { - cable_number = <24>; - input_current = <1000>; - charging_current = <450>; - }; - current_group_9 { - cable_number = <26>; - input_current = <2000>; - charging_current = <1800>; - }; - current_group_10 { - cable_number = <11 16 28>; - input_current = <750>; - charging_current = <2850>; - }; - current_group_11 { - cable_number = <29>; - input_current = <500>; - charging_current = <1400>; - }; - current_group_12 { - cable_number = <1 4>; - input_current = <475>; - charging_current = <550>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r00.dts deleted file mode 100755 index ea61ddfd294f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r00.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-can-r00.dtsi" -#include "sm6150-sec-a70q-can-pinctrl-r00.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT Bring-Up (board-id,00)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r01.dts deleted file mode 100755 index 55abfe331ee8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r01.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-can-r01.dtsi" -#include "sm6150-sec-a70q-can-pinctrl-r01.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.0 (board-id,01)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,project-name = "a90"; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r02.dts deleted file mode 100755 index 5d6a46f54df6..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r02.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-can-r02.dtsi" -#include "sm6150-sec-a70q-can-pinctrl-r02.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.1 (board-id,02)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r03.dts deleted file mode 100755 index 108d920908d8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r03.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-can-r03.dtsi" -#include "sm6150-sec-a70q-can-pinctrl-r03.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2 (board-id,03)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r05.dts deleted file mode 100755 index 37dc804947d2..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r05.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-can-r05.dtsi" -#include "sm6150-sec-a70q-can-pinctrl-r05.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2A (board-id,05)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 5>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r06.dts deleted file mode 100755 index 1f76eb815bc9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r06.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-can-r06.dtsi" -#include "sm6150-sec-a70q-can-pinctrl-r06.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.3 (board-id,06)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 6>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r09.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r09.dts deleted file mode 100755 index 4bc6d0acb734..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r09.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-can-r09.dtsi" -#include "sm6150-sec-a70q-can-pinctrl-r09.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,09)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 9>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r10.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r10.dts deleted file mode 100755 index 3dcb69be8055..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r10.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-can-r10.dtsi" -#include "sm6150-sec-a70q-can-pinctrl-r10.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,10)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 10>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r11.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r11.dts deleted file mode 100755 index ed708243f8ca..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r11.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-can-r11.dtsi" -#include "sm6150-sec-a70q-can-pinctrl-r11.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,11)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 11>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r12.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r12.dts deleted file mode 100755 index 695fa5d9cfc1..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r12.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-can-r12.dtsi" -#include "sm6150-sec-a70q-can-pinctrl-r12.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,12)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 12>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r13.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r13.dts deleted file mode 100755 index c3327c543348..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r13.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-can-r13.dtsi" -#include "sm6150-sec-a70q-can-pinctrl-r13.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,13)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 13>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r14.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r14.dts deleted file mode 100755 index e4f50830205a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-overlay-r14.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-can-r14.dtsi" -#include "sm6150-sec-a70q-can-pinctrl-r14.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,14)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 14>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r00.dtsi deleted file mode 100755 index 6fe4a3f8b598..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r00.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-pinctrl-common.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r01.dtsi deleted file mode 100755 index 4e10acb1d964..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-pinctrl-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r02.dtsi deleted file mode 100755 index e45ba1b5a5ed..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-pinctrl-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r03.dtsi deleted file mode 100755 index 1dadddbfaf3c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r05.dtsi deleted file mode 100755 index 298cc5276023..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r05.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-pinctrl-r03.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r06.dtsi deleted file mode 100755 index 9347a5ce0a15..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r06.dtsi +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-pinctrl-r05.dtsi" - -&pm6150_gpios { - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r09.dtsi deleted file mode 100755 index bc5b655ef8b9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r10.dtsi deleted file mode 100755 index bc5b655ef8b9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r11.dtsi deleted file mode 100755 index bc5b655ef8b9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r12.dtsi deleted file mode 100755 index 8e000965110d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-pinctrl-r09.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r13.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r13.dtsi deleted file mode 100755 index b2bda114ec5d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r13.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-pinctrl-r10.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r14.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r14.dtsi deleted file mode 100755 index e5267b2e3933..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-pinctrl-r14.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-pinctrl-r11.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r00.dtsi deleted file mode 100755 index f696043bc27f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r00.dtsi +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-common.dtsi" -#include "sm6150-sec-a70q-input-common.dtsi" - -&wcd937x_codec { - imp-table = <&imp_list 0 5 6>, - <&imp_list 6 23 8>, - <&imp_list 24 38 7>, - <&imp_list 39 100 6>, - <&imp_list 101 160 7>, - <&imp_list 161 400 8>, - <&imp_list 401 2000 8>, - <&imp_list 2001 0x7fffffff 6>; -}; - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -/delete-node/ &i2c_22; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r01.dtsi deleted file mode 100755 index 160f5976b02c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-r00.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r02.dtsi deleted file mode 100755 index 2ead7dc06671..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r02.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-r01.dtsi" - -&soc { - -}; - -&s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -&s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -/* S2MPB03 Camera PMIC */ -&i2c2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r03.dtsi deleted file mode 100755 index f7ed2858023b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r03.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-r02.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r05.dtsi deleted file mode 100755 index 02e8713935b3..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r05.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-r03.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r06.dtsi deleted file mode 100755 index 61d436b6ff6b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r06.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-r05.dtsi" - -&pm6150_charger { - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - - water-det-enable; - #sub-short-detect-enable; -}; - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r09.dtsi deleted file mode 100755 index 36f7330088ad..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r10.dtsi deleted file mode 100755 index 36f7330088ad..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r11.dtsi deleted file mode 100755 index 36f7330088ad..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r12.dtsi deleted file mode 100755 index b65dec592fdf..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-r09.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r13.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r13.dtsi deleted file mode 100755 index 0d7f91a9840c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r13.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-r10.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r14.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r14.dtsi deleted file mode 100755 index 4dea1a96685f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-can-r14.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-can-r11.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r00.dts deleted file mode 100755 index 797a6fd4aac9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r00.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-chn-r00.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r00.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eur-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT BringUp (board-id,00)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r01.dts deleted file mode 100755 index 9249ea6640be..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r01.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-chn-r01.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r01.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eur-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.0 (board-id,01)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,project-name = "a90"; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r02.dts deleted file mode 100755 index 469199eb372e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r02.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-chn-r02.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r02.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eur-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.1 (board-id,02)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r03.dts deleted file mode 100755 index 26b4e9a8648f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r03.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-chn-r03.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r03.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eur-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2 (board-id,03)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r05.dts deleted file mode 100755 index 583dc8e2f1c4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r05.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-chn-r05.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r05.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eur-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2A (board-id,05)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 5>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r06.dts deleted file mode 100755 index 2e7a56b95bde..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r06.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-chn-r06.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r06.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eur-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.3 (board-id,06)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 6>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r09.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r09.dts deleted file mode 100755 index f1f7ff9c7382..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r09.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-chn-r09.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r09.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eur-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r09.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,09)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 9>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r10.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r10.dts deleted file mode 100755 index 12037b553212..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r10.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-chn-r10.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r10.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r09.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,10)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 10>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r11.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r11.dts deleted file mode 100755 index e6de4da8bcfa..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r11.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-chn-r11.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r11.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r09.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,11)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 11>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r12.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r12.dts deleted file mode 100755 index a236d814e846..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-overlay-r12.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-chn-r12.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r12.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r09.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,12)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 12>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r00.dtsi deleted file mode 100755 index 30b8cd5ccadc..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r00.dtsi +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-common.dtsi" -#include "sm6150-sec-a70q-input-common.dtsi" - -&wcd937x_codec { - imp-table = <&imp_list 0 5 6>, - <&imp_list 6 23 5>, - <&imp_list 24 38 7>, - <&imp_list 39 100 6>, - <&imp_list 101 160 2>, - <&imp_list 161 400 7>, - <&imp_list 401 2000 7>, - <&imp_list 2001 0x7fffffff 6>; -}; - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -/delete-node/ &i2c_22; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r01.dtsi deleted file mode 100755 index bfbcdd5dc29a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-chn-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r02.dtsi deleted file mode 100755 index 644ab439f18c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r02.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-chn-r01.dtsi" - -&soc { - -}; - -&s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -&s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -/* S2MPB03 Camera PMIC */ -&i2c2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r03.dtsi deleted file mode 100755 index ea977d12368b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r03.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-chn-r02.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r05.dtsi deleted file mode 100755 index 1903b5dae661..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r05.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-chn-r03.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r06.dtsi deleted file mode 100755 index efa82a4bf943..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r06.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-chn-r05.dtsi" - -&pm6150_charger { - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - - water-det-enable; - #sub-short-detect-enable; -}; - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r09.dtsi deleted file mode 100755 index 974e95078c36..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-chn-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r10.dtsi deleted file mode 100755 index 974e95078c36..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-chn-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r11.dtsi deleted file mode 100755 index 974e95078c36..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-chn-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r12.dtsi deleted file mode 100755 index 43b2c3765564..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-chn-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-chn-r09.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-common.dtsi deleted file mode 100755 index 244cb5f392c7..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-common.dtsi +++ /dev/null @@ -1,202 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "sm6150-sec-a70q-audio.dtsi" -#include "sm6150-sec-a70q-mst-r00.dtsi" - -&sdhc_2 { - cd-gpios = <&tlmm 99 0x0>; - sec,tflash-en-gpio = <&tlmm 121 0x0>; /* T_Flash EN - GPIO121 */ -}; - -&soc { - pm6150l_rid_adc { - status = "okay"; - compatible = "pm6150l_rid_adc"; - - interrupt-parent = <&spmi_bus>; - pm6150l_rid_adc,irq-gpio = <&pm6150l_gpios 9 GPIO_ACTIVE_LOW>; - jigon-gpios = <&pm6150l_gpios 11 GPIO_ACTIVE_LOW>; - - pinctrl-names = "default"; - pinctrl-0 = <&rid_adc_irq_default &gpio11_dig_out_default>; - - io-channels = <&pm6150l_vadc ADC_GPIO4>; - io-channel-names = "rid_adc_channel"; - }; - - sec_detect_conn { - compatible = "samsung,sec_detect_conn"; - sec,det_conn_gpios = <&tlmm 103 0>; /* UB_CON_DETECT */ - sec,det_conn_name = "UB_CONNECT"; - sec,det_conn_irq_type = <3>; /*UB_CON_DETECT FALLING, RIGING EDGE*/ - - sec,det_pm_conn_gpios = <&pm6150_gpios 8 0>; /* UB_CONNECT */ - sec,det_pm_conn_name = "SUB_CONNECT"; - - pinctrl-names = "det_ap_connect", "det_pm_connect"; - pinctrl-0 = <&detect_conn_setting>; - pinctrl-1 = <&detect_conn_pm_setting>; - }; - - sec_abc { - compatible = "samsung,sec_abc"; - status = "okay"; - - gpu { - gpu,label="GPU fault"; - gpu,threshold_count=<20>; - gpu,threshold_time=<1200>; - }; - - aicl { - aicl,label="battery aicl"; - aicl,threshold_count=<5>; - aicl,threshold_time=<300>; - }; - }; - - abc_hub { - compatible = "samsung,abc_hub"; - status = "okay"; - - pinctrl-names = "det_ap_connect", "det_pm_connect"; - pinctrl-0 = <&detect_conn_setting>; - pinctrl-1 = <&detect_conn_pm_setting>; - - bootc { - bootc,time_spec_user = <100000>; /* user binary user build */ - bootc,time_spec_eng = <100000>; /* user binary eng build */ - bootc,time_spec_fac = <100000>; /* factory binary */ - }; - - cond { - sec,det_conn_gpios = <&tlmm 103 0>; /* UB_CON_DETECT */ - sec,det_conn_name = "ub"; - sec,det_pm_conn_gpios = <&pm6150_gpios 8 0>; /* SUB_CONNECT */ - sec,det_pm_conn_name = "sub"; - }; - }; - - hall { - status = "okay"; - compatible = "hall"; - linux,input-type = <1>; - linux,code = <21>; - hall,gpio_flip_cover = <&pm6150_gpios 10 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&hall_default>; - }; - - certify_hall { - status = "okay"; - compatible = "certify_hall"; - linux,input-type = <1>; - linux,code = <27>; - certify_hall,gpio_certify_cover = <&tlmm 96 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&certify_hall_default>; - }; - - qupv3_se4_afc: afc@a80000 { - compatible = "pm6150_afc"; - reg = <0xa80000 0x4000>; - interrupts = ; - #address-cells = <1>; - #size-cells = <0>; - clock-names = "se-clk", "m-ahb", "s-ahb"; - clocks = <&clock_gcc GCC_QUPV3_WRAP1_S0_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_M_AHB_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_S_AHB_CLK>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&qupv3_se4_afc_active &gpio1_afc_switch_default>; - pinctrl-1 = <&qupv3_se4_afc_sleep>; - qcom,wrapper-core = <&qupv3_1>; - afc-gpios = <&pm6150_gpios 1 GPIO_ACTIVE_LOW>; - status = "ok"; - }; - - /* Sensor */ - qcom,lpass@62400000 { - sensor_vdd-supply = <&pm6150l_l8>; - qcom,sensor_vdd-uV-uA = <1800000 0>; - qcom,active-reg-names = "sensor_vdd"; - }; - - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = < &tlmm 115 0 /* sda */ - &tlmm 116 0 /* scl */ - >; - pinctrl-names = "default","on_i2c","off_i2c"; - pinctrl-0 = <&grip_i2c>; - pinctrl-1 = <&grip_i2c>; - pinctrl-2 = <&grip_gpio>; - - a96t3x6@20 { - compatible = "a96t3x6"; - pinctrl-names = "default"; - reg = <0x20>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - a96t3x6,irq_gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_HIGH>; - a96t3x6,ldo_en = <&tlmm 122 0>; - a96t3x6,fw_path = "abov/a96t346_a70q_eur.bin"; - a96t3x6,firmup_cmd = <0x38>; - a96t3x6,earjack_noise = <1>; - }; - }; - - i2c_18: i2c@18 { /* SW I2C */ - status = "ok"; - - cell-index = <18>; - compatible = "i2c-gpio"; - gpios = <&tlmm 25 0 /* sda */ - &tlmm 26 0 /* scl */ - >; - - pinctrl-names = "default"; - pinctrl-0 = <&grip_sub_i2c>; - - a96t3x6_sub@20 { - compatible = "a96t3x6_sub"; - pinctrl-names = "default"; - reg = <0x20>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - a96t3x6,irq_gpio = <&pm6150l_gpios 4 GPIO_ACTIVE_HIGH>; - a96t3x6,ldo_en = <&pm6150l_gpios 1 0>; - /*a96t3x6,fw_path = "abov/a96t346_a70q_sub_usa.bin";*/ - a96t3x6,fw_path = "a96t346_a70q_sub_usa.bin"; - a96t3x6,firmup_cmd = <0x3b>; - a96t3x6,earjack_noise = <1>; - }; - }; - - ssc_core { - status = "okay"; - compatible = "ssc_core"; - ssc_core,nfc_gpio = <&pm6150l_gpios 1 GPIO_ACTIVE_HIGH>; - ssc_core,mst_gpio = <&pm6150l_gpios 2 GPIO_ACTIVE_HIGH>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-display-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-display-r00.dtsi deleted file mode 100755 index c0ba7040ec9b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-display-r00.dtsi +++ /dev/null @@ -1,265 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../drivers/gpu/drm/msm/samsung/SELF_DISPLAY/self_display_cmd_FA7_AMS628RF05.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/S6E3FA7_AMS628RF05/dsi_panel_S6E3FA7_AMS628RF05_fhd_octa_cmd.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - - -#if 0 -/{ - aliases { - spi7 = &qupv3_se7_spi; - }; -}; -#endif - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio91"; - function = "gpio"; - }; - - config { - pins = "gpio91"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio91"; - function = "gpio"; - }; - - config { - pins = "gpio91"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - pmx_sde_te { - sde_te_active: sde_te_active { - mux { - pins = "gpio90"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio90"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_te_suspend: sde_te_suspend { - mux { - pins = "gpio90"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio90"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; -#if 0 - qupv3_se7_spi_pins: qupv3_se7_spi_pins { - qupv3_se7_spi_active: qupv3_se7_spi_active { - mux { - pins = "gpio98", "gpio99", "gpio100", - "gpio101"; - function = "qup7"; - }; - - config { - pins = "gpio98", "gpio99", "gpio100", - "gpio101"; - drive-strength = <6>; - bias-pull-down; /* prevent MISO floating */ - }; - }; - - qupv3_se7_spi_sleep: qupv3_se7_spi_sleep { - mux { - pins = "gpio98", "gpio99", "gpio100", - "gpio101"; - function = "gpio"; - }; - - config { - pins = "gpio98", "gpio99", "gpio100", - "gpio101"; - drive-strength = <6>; - bias-pull-down; - input-enable; - }; - }; - }; - - pmx_sde_ub_det { - sde_ub_det_active: sde_ub_det_active { - mux { - pins = "gpio50"; - function = "ub_detect"; - }; - - config { - pins = "gpio50"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - sde_ub_det_suspend: sde_ub_det_suspend { - mux { - pins = "gpio50"; - function = "ub_detect"; - }; - - config { - pins = "gpio50"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - }; -#endif -}; - -#if 0 -&qupv3_se7_spi { - status = "ok"; - - pinctrl-0 = <&qupv3_se7_spi_active>; - pinctrl-1 = <&qupv3_se7_spi_sleep>; - - ddi_spi:ddi_spi@0 { // LCD_SPI - compatible = "ss,ddi-spi"; - reg = <0>; - spi-max-frequency = <1200000>; - spi-mode = <0>; - spi-bpw = <8>; - }; -}; -#endif - -&soc { - /* A50 panel */ - ss_dsi_panel_S6E3FA7_AMS628RF05_FHD_display: qcom,dsi-display@5 { - label = "ss_dsi_panel_S6E3FA7_AMS628RF05_FHD"; - qcom,display-type = "primary"; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_dsi_active &sde_te_active>; - pinctrl-1 = <&sde_dsi_suspend &sde_te_suspend>; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@6 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_dsi_active &sde_te_active>; - pinctrl-1 = <&sde_dsi_suspend &sde_te_suspend>; - }; -}; - -&sde_dsi { - - vcisub-supply = <&s2dos03_l3>; /* VDD_SUB_DDI_3P0 */ - vdd3sub-supply = <&s2dos03_l1>; /* VDD_SUB_DDI_1P8 */ - - qcom,dsi-display-list = - <&ss_dsi_panel_S6E3FA7_AMS628RF05_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; -}; - -&mdss_mdp { - /* display node, like ss_dsi_panel_S6E3HA6_AMS622MR01_WQHD_display, - * will be added by cmdline. - * If your board doesn't use cmdline to select display node, - * add display node like below. - * connectors = <&sde_rscc &sde_wb &sde_dp &ss_dsi_panel_S6E3HA6_AMS622MR01_WQHD_display>; - */ -}; - -&ss_dsi_panel_S6E3FA7_AMS628RF05_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_S6E3FA7_AMS628RF05_FHD>; - - qcom,platform-reset-gpio = <&tlmm 91 0>; - qcom,platform-te-gpio = <&tlmm 90 0>; - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vdd3sub"; - qcom,supply-min-voltage = <1800000>; - qcom,supply-max-voltage = <1800000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <0>; - }; - - qcom,panel-supply-entry@1 { - reg = <1>; - qcom,supply-name = "vcisub"; - qcom,supply-min-voltage = <3000000>; - qcom,supply-max-voltage = <3000000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <10>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-reset-gpio = <&tlmm 91 0>; - qcom,platform-te-gpio = <&tlmm 90 0>; -}; - -#if 0 // data lane strength.. -&mdss_dsi_phy0 { - qcom,platform-lane-config = [00 20 00 00 - 00 20 00 00 - 00 20 00 00 - 00 20 00 00 - 00 20 00 80]; -}; -#endif diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-display-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-display-r01.dtsi deleted file mode 100755 index 21733425224d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-display-r01.dtsi +++ /dev/null @@ -1,167 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -//#include "../../../../../drivers/gpu/drm/msm/samsung/SELF_DISPLAY/self_display_cmd_FA7_AMS628RF05.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/S6E3FC2_AMS670TA01/dsi_panel_S6E3FC2_AMS670TA01_fhd_octa_cmd.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/S6E3FC2_AMS670TA01/dsi_panel_S6E3FC2_AMS670TA01_fhd_octa_cmd_A70.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - - -&pm6150_gpios { - sde_dsi_enable_active: sde_dsi_enable_active { - pins = "gpio6"; - function = "normal"; - power-source = <0>; - }; - - sde_dsi_enable_suspend: sde_dsi_enable_suspend { - pins = "gpio6"; - function = "normal"; - power-source = <0>; - output-low; - }; -}; - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { /*reset gpio*/ - mux { - pins = "gpio91"; - function = "gpio"; - }; - - config { - pins = "gpio91"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio91"; - function = "gpio"; - }; - - config { - pins = "gpio91"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_esd_active: sde_esd_active { /*EL_ON1_DET gpio*/ - mux { - pins = "gpio97"; - function = "gpio"; - }; - - config { - pins = "gpio97"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_esd_suspend: sde_esd_suspend { - mux { - pins = "gpio97"; - function = "gpio"; - }; - - config { - pins = "gpio97"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - sde_dsi2_active: sde_dsi2_active { /*OCTA_CON_DET gpio*/ - mux { - pins = "gpio103"; - function = "gpio"; - }; - - config { - pins = "gpio103"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi2_suspend: sde_dsi2_suspend { - mux { - pins = "gpio103"; - function = "gpio"; - }; - - config { - pins = "gpio103"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - }; -}; - -&soc { - /* A70 panel */ - ss_dsi_panel_S6E3FC2_AMS670TA01_FHD_display: qcom,dsi-display@5 { - label = "ss_dsi_panel_S6E3FC2_AMS670TA01_FHD"; - qcom,display-type = "primary"; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@6 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - }; -}; - -&sde_dsi { - qcom,dsi-display-list = - <&ss_dsi_panel_S6E3FC2_AMS670TA01_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_dsi_enable_active &sde_dsi_active &sde_te_active &sde_esd_active &sde_dsi2_active>; - pinctrl-1 = <&sde_dsi_enable_suspend &sde_dsi_suspend &sde_te_suspend &sde_esd_suspend &sde_dsi2_suspend>; -}; - -&ss_dsi_panel_S6E3FC2_AMS670TA01_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_S6E3FC2_AMS670TA01_FHD>; - - qcom,platform-en-gpio = <&pm6150_gpios 6 0>; - qcom,platform-reset-gpio = <&tlmm 91 0>; - qcom,platform-te-gpio = <&tlmm 90 0>; - samsung,esd-irq-gpio1 = <&tlmm 97 0>; - samsung,support-optical-fingerprint; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-en-gpio = <&pm6150_gpios 6 0>; - qcom,platform-reset-gpio = <&tlmm 91 0>; - qcom,platform-te-gpio = <&tlmm 90 0>; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eif-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eif-r00.dtsi deleted file mode 100755 index e08128872c0f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eif-r00.dtsi +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - usb_noti: usb-notifier { - compatible = "samsung,usb-notifier"; - qcom,disable_control_en = <1>; - qcom,unsupport_host_en = <0>; - }; - - samsung,vibrator { - compatible = "samsung_vib"; -// samsung,vib_pwm = <&tlmm 136 0>; -// samsung,vib_power = <&pm8150_gpios 10 0>; -// samsung,gp_clk = <0x00164000>; // Address of GP1 clock - samsung,chip_model = <4>; // using max77705 driver - samsung,vib_type = "COINDC"; - status = "ok"; - - pinctrl-names = "tlmm_pwm_default"; - pinctrl-0 = <&pwm_out_gpio6_default>; - pwms = <&pm6150l_pwm 0 1000000>; - - }; - - samsung,usbpd { - compatible = "samsung,usb-pd"; - qcom,samsung-usbpd-detection = <&pm6150_pdphy>; - }; -}; - -&usb0 { - dwc3@a600000 { - usb-phy = <&qusb_phy0>, <&usb_nop_phy>; - maximum-speed = "high-speed"; - }; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = <0x40 0x80 - 0x73 0x84 - 0x81 0x88 - 0xc5 0x8c - 0x30 0x08 - 0x79 0x0c - 0x21 0x10 - 0x14 0x9c - 0x9f 0x1c - 0x00 0x18 - 0x01 0x90>; - qcom,qusb-phy-host-init-seq = <0x40 0x80 - 0xb3 0x84 - 0x81 0x88 - 0xc5 0x8c - 0x30 0x08 - 0x79 0x0c - 0x21 0x10 - 0x14 0x9c - 0x9f 0x1c - 0x00 0x18 - 0x01 0x90>; - /* ex) efuse(0xC) + (-5) = 0x7 for tune2 high value */ - qcom,diff_tune2_device = <(-5)>; - qcom,diff_tune2_host = <(0)>; -}; - -&usb_qmp_phy { - status = "disabled"; -}; - -&pm6150l_gpios { - pwm_out_gpio6 { - pwm_out_gpio6_default: pwm_out_gpio6_default { - pins = "gpio6"; - function = "func1"; - bias-disable; - power-source = <0>; - output-low; - qcom,drive-strength = <3>; - drive-push-pull; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eif-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eif-r09.dtsi deleted file mode 100755 index cf89157e0f96..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eif-r09.dtsi +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - usb_noti: usb-notifier { - compatible = "samsung,usb-notifier"; - qcom,disable_control_en = <1>; - qcom,unsupport_host_en = <0>; - qcom,gpios_vbus_detect_en = <&tlmm 41 0>; - }; - - samsung,vibrator { - compatible = "samsung_vib"; -// samsung,vib_pwm = <&tlmm 136 0>; -// samsung,vib_power = <&pm8150_gpios 10 0>; -// samsung,gp_clk = <0x00164000>; // Address of GP1 clock - samsung,chip_model = <4>; // using max77705 driver - samsung,vib_type = "COINDC"; - status = "ok"; - - pinctrl-names = "tlmm_pwm_default"; - pinctrl-0 = <&pwm_out_gpio6_default>; - pwms = <&pm6150l_pwm 0 1000000>; - - }; - - samsung,usbpd { - compatible = "samsung,usb-pd"; - qcom,samsung-usbpd-detection = <&pm6150_pdphy>; - }; -}; - -&usb0 { - dwc3@a600000 { - usb-phy = <&qusb_phy0>, <&usb_nop_phy>; - maximum-speed = "high-speed"; - }; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = <0x40 0x80 - 0x73 0x84 - 0x81 0x88 - 0xc5 0x8c - 0x30 0x08 - 0x79 0x0c - 0x21 0x10 - 0x14 0x9c - 0x9f 0x1c - 0x00 0x18 - 0x01 0x90>; - qcom,qusb-phy-host-init-seq = <0x40 0x80 - 0xb3 0x84 - 0x81 0x88 - 0xc5 0x8c - 0x30 0x08 - 0x79 0x0c - 0x21 0x10 - 0x14 0x9c - 0x9f 0x1c - 0x00 0x18 - 0x01 0x90>; - /* ex) efuse(0xC) + (-5) = 0x7 for tune2 high value */ - qcom,diff_tune2_device = <(-5)>; - qcom,diff_tune2_host = <(0)>; -}; - -&usb_qmp_phy { - status = "disabled"; -}; - -&pm6150l_gpios { - pwm_out_gpio6 { - pwm_out_gpio6_default: pwm_out_gpio6_default { - pins = "gpio6"; - function = "func1"; - bias-disable; - power-source = <0>; - output-low; - qcom,drive-strength = <3>; - drive-push-pull; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r00.dts deleted file mode 100755 index 0326e6223f88..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r00.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-ldu-r00.dtsi" -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r00.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT BringUp (board-id,00)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r01.dts deleted file mode 100755 index f99d4d0e72bb..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r01.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-ldu-r01.dtsi" -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r01.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.0 (board-id,01)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,project-name = "a90"; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r02.dts deleted file mode 100755 index 1a4dbe351a5d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r02.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-ldu-r02.dtsi" -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r02.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.1 (board-id,02)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r03.dts deleted file mode 100755 index e08d24ac9baf..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r03.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-ldu-r03.dtsi" -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r03.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2 (board-id,03)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r05.dts deleted file mode 100755 index 218af3464574..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r05.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-ldu-r05.dtsi" -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r05.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2A (board-id,05)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 5>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r06.dts deleted file mode 100755 index c8067baed0b1..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r06.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-ldu-r06.dtsi" -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r06.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.3 (board-id,06)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 6>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r09.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r09.dts deleted file mode 100755 index 668c5ad226f8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r09.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-ldu-r09.dtsi" -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r09.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,09)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 9>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r10.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r10.dts deleted file mode 100755 index 030132f67f69..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r10.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-ldu-r10.dtsi" -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r10.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,10)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 10>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r11.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r11.dts deleted file mode 100755 index cd54546b3a29..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r11.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-ldu-r11.dtsi" -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r11.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,11)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 11>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r12.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r12.dts deleted file mode 100755 index d2fed0089a42..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r12.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-ldu-r12.dtsi" -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r12.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,12)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 12>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r13.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r13.dts deleted file mode 100755 index ee540009364b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r13.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-ldu-r13.dtsi" -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r13.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,13)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 13>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r14.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r14.dts deleted file mode 100755 index 08ac3324e4fa..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-overlay-r14.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-ldu-r14.dtsi" -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r14.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,14)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 14>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r00.dtsi deleted file mode 100755 index 6fe4a3f8b598..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r00.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-pinctrl-common.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r01.dtsi deleted file mode 100755 index a0d8ce662807..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r02.dtsi deleted file mode 100755 index 0ecce854c437..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r03.dtsi deleted file mode 100755 index c34074361df7..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r05.dtsi deleted file mode 100755 index 18b1fc1f3a99..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r05.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r03.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r06.dtsi deleted file mode 100755 index f44536134dab..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r06.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r05.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r09.dtsi deleted file mode 100755 index 127576e4da08..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r10.dtsi deleted file mode 100755 index 127576e4da08..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r11.dtsi deleted file mode 100755 index 127576e4da08..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r12.dtsi deleted file mode 100755 index 122f03aad1f4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r09.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r13.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r13.dtsi deleted file mode 100755 index 982016ada6d0..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r13.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r10.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r14.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r14.dtsi deleted file mode 100755 index f301533ffc19..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-pinctrl-r14.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-pinctrl-r11.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r00.dtsi deleted file mode 100755 index 46aef7db7f79..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r00.dtsi +++ /dev/null @@ -1,105 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-common.dtsi" -#include "sm6150-sec-a70q-input-common.dtsi" - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -/delete-node/ &i2c_22; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r01.dtsi deleted file mode 100755 index 61d1f7a69f80..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-r00.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r02.dtsi deleted file mode 100755 index cbe7778b96b4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r02.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-r01.dtsi" - -&soc { - -}; - -&s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -&s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -/* S2MPB03 Camera PMIC */ -&i2c2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r03.dtsi deleted file mode 100755 index 131348bc178c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r03.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-r02.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r05.dtsi deleted file mode 100755 index d57bc51055ec..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r05.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-r03.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r06.dtsi deleted file mode 100755 index 4b1cb3423fa5..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r06.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-r05.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r09.dtsi deleted file mode 100755 index de37c1518897..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r10.dtsi deleted file mode 100755 index de37c1518897..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r11.dtsi deleted file mode 100755 index de37c1518897..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r12.dtsi deleted file mode 100755 index c1eadfbddf2a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-r09.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r13.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r13.dtsi deleted file mode 100755 index 13b0e66e4081..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r13.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-r10.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r14.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r14.dtsi deleted file mode 100755 index 446af389c9f2..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-ldu-r14.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-ldu-r11.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-nfc-r00.dtsi deleted file mode 100755 index 2b26aa9be1a8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-nfc-r00.dtsi +++ /dev/null @@ -1,112 +0,0 @@ - -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi1 = &qupv3_se6_spi; - }; -}; -*/ - -&tlmm { - ese_qupv3_se6_spi_sleep: ese_qupv3_se6_spi_sleep { - mux { - pins = "gpio6", "gpio7", "gpio8", - "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio6", "gpio7", "gpio8", - "gpio9"; - drive-strength = <6>; - bias-pull-down; /* pull down */ - output-low; - }; - }; - - nfc_qupv3_se5_i2c_sleep: nfc_qupv3_se5_i2c_sleep { - mux { - pins = "gpio14", "gpio15"; - function = "gpio"; - }; - - config { - pins = "gpio14", "gpio15"; - drive-strength = <2>; - bias-disable; - }; - }; - - nfc_pvdd_gpio: nfc_pvdd_gpio { - mux { - pins = "gpio23"; - function = "gpio"; - }; - - config { - pins = "gpio23"; - drive-strength = <2>; - bias-disable; - }; - }; -}; - -&pm6150l_gpios { - nfc_det_gpio: nfc_det_gpio { - pins = "gpio1"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; - -/* gpio14 and gpio15 are used for nfc i2c */ -&qupv3_se5_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se5_i2c_sleep>; - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <86 0>; - pn547,irq-gpio = <&tlmm 86 0>; - pn547,ven-gpio = <&tlmm 84 0>; - pn547,firm-gpio = <&tlmm 85 0>; - pn547,clk_req-gpio = <&tlmm 50 0>; /* BBCLK3 is controled by gpio 50 */ - pn547,pwr_req = <&tlmm 87 0>; - pn547,pvdd-gpio = <&tlmm 23 0>; - pn547,nfc-det-gpio = <&pm6150l_gpios 1 0>; - pn547,clk_req_wake; - pinctrl-names = "default"; - pinctrl-0 = <&nfc_pvdd_gpio &nfc_det_gpio>; - }; -}; - - -/* gpio 6~9 are used for ese spi */ -&qupv3_se6_spi { - status = "okay"; - spi-max-frequency = <19200000>; - pinctrl-1 = <&ese_qupv3_se6_spi_sleep>; - - ese_spi@0 { - compatible = "p61"; - reg = <0>; - spi-max-frequency = <16000000>; - p61-ap_vendor = "qualcomm"; - ese-det-gpio = <&pm6150l_gpios 1 0>; - p61-spi_node = <&qupv3_se6_spi>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r00.dts deleted file mode 100755 index 640dee700702..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r00.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-r00.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r00.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT BringUp (board-id,00)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r01.dts deleted file mode 100755 index 5ec35ba8b701..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r01.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-r01.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r01.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.0 (board-id,01)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,project-name = "a90"; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r02.dts deleted file mode 100755 index e82f1f5e1443..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r02.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-r02.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r02.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.1 (board-id,02)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r03.dts deleted file mode 100755 index 40d160baf8e6..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r03.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-r03.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r03.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2 (board-id,03)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r05.dts deleted file mode 100755 index 839ce0a2698e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r05.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-r05.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r05.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2A (board-id,05)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 5>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r06.dts deleted file mode 100755 index e90ff3309ea0..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r06.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-r06.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r06.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.3 (board-id,06)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 6>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r09.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r09.dts deleted file mode 100755 index d73ad4659f4b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r09.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-r09.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r09.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r09.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,09)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 9>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r10.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r10.dts deleted file mode 100755 index 0fcaae207129..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r10.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-r10.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r10.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r09.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,10)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 10>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r11.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r11.dts deleted file mode 100755 index a17fcf184165..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r11.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-r11.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r11.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r09.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,11)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 11>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r12.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r12.dts deleted file mode 100755 index 2d61f503a9d8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r12.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-r12.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r12.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r09.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,12)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 12>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r13.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r13.dts deleted file mode 100755 index 74a8ae627fe5..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r13.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-r13.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r13.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r09.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,13)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 13>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r14.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r14.dts deleted file mode 100755 index adf3c5f3ad60..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-overlay-r14.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-eur-r14.dtsi" -#include "sm6150-sec-a70q-eur-pinctrl-r14.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r09.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,14)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 14>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r00.dtsi deleted file mode 100755 index 6fe4a3f8b598..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r00.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-pinctrl-common.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r01.dtsi deleted file mode 100755 index 12027b69c480..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-pinctrl-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r02.dtsi deleted file mode 100755 index 9b8fa42a70a2..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-pinctrl-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r03.dtsi deleted file mode 100755 index d32707785a22..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r05.dtsi deleted file mode 100755 index 51681b701615..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r05.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-pinctrl-r03.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r06.dtsi deleted file mode 100755 index 24287e76979f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r06.dtsi +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-pinctrl-r05.dtsi" - -&pm6150_gpios { - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r09.dtsi deleted file mode 100755 index ade00d49c219..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r10.dtsi deleted file mode 100755 index ade00d49c219..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r11.dtsi deleted file mode 100755 index ade00d49c219..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r12.dtsi deleted file mode 100755 index 64bdb064ccda..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-pinctrl-r09.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r13.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r13.dtsi deleted file mode 100755 index 7824284b2058..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r13.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-pinctrl-r10.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r14.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r14.dtsi deleted file mode 100755 index 50b296db96cc..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-pinctrl-r14.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-pinctrl-r11.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r00.dtsi deleted file mode 100755 index 46aef7db7f79..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r00.dtsi +++ /dev/null @@ -1,105 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-common.dtsi" -#include "sm6150-sec-a70q-input-common.dtsi" - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -/delete-node/ &i2c_22; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r01.dtsi deleted file mode 100755 index 532952c7ed22..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-r00.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r02.dtsi deleted file mode 100755 index 3a977a5c79ae..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r02.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-r01.dtsi" - -&soc { - -}; - -&s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -&s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -/* S2MPB03 Camera PMIC */ -&i2c2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r03.dtsi deleted file mode 100755 index b0c31530f430..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r03.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-r02.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r05.dtsi deleted file mode 100755 index 198c08208fef..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r05.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-r03.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r06.dtsi deleted file mode 100755 index 7993ca0ee2da..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r06.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-r05.dtsi" - -&pm6150_charger { - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - - water-det-enable; - #sub-short-detect-enable; -}; - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r09.dtsi deleted file mode 100755 index 1a64c2c66411..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r10.dtsi deleted file mode 100755 index 1a64c2c66411..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r11.dtsi deleted file mode 100755 index 1a64c2c66411..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r12.dtsi deleted file mode 100755 index 44342ce34e0f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-r09.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r13.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r13.dtsi deleted file mode 100755 index 6f7c5dd54ec4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r13.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-r10.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r14.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r14.dtsi deleted file mode 100755 index 0251d4ab1bc5..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-eur-r14.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-r11.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-fingerprint_00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-fingerprint_00.dtsi deleted file mode 100755 index 297226388cb7..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-fingerprint_00.dtsi +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - etspi_ldopin { - etspi_ldopin: etspi_ldopin { - mux { - pins = "gpio42"; - function = "gpio"; - }; - config { - pins = "gpio42"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; - - etspi_rstpin { - etspi_rstpin: etspi_rstpin { - mux { - pins = "gpio94"; - function = "gpio"; - }; - config { - pins = "gpio94"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; -}; - -&qupv3_se2_spi { - status = "okay"; - - etspi-spi@0 { - compatible = "etspi,et7xx"; - reg = <0>; - spi-max-frequency = <50000000>; - pinctrl-names = "default"; - pinctrl-0 = <&etspi_ldopin &etspi_rstpin>; - - gpio-controller; - #gpio-cells = <2>; - - etspi-sleepPin = <&tlmm 94 0>; - etspi-ldoPin = <&tlmm 42 0>; - etspi-chipid = "ET711"; - etspi-modelinfo = "A705"; - etspi-position = "13.96,0.00,7.30,7.30,14.80,14.80,12.00,12.00,5.00"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-fingerprint_02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-fingerprint_02.dtsi deleted file mode 100755 index afb57ea21aaa..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-fingerprint_02.dtsi +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - etspi_ldopin { - etspi_ldopin: etspi_ldopin { - mux { - pins = "gpio42"; - function = "gpio"; - }; - config { - pins = "gpio42"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; - - etspi_rstpin { - etspi_rstpin: etspi_rstpin { - mux { - pins = "gpio94"; - function = "gpio"; - }; - config { - pins = "gpio94"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; -}; - -&qupv3_se2_spi { - status = "okay"; - - etspi-spi@0 { - compatible = "etspi,et7xx"; - reg = <0>; - spi-max-frequency = <50000000>; - pinctrl-names = "default"; - pinctrl-0 = <&etspi_ldopin &etspi_rstpin>; - - gpio-controller; - #gpio-cells = <2>; - - etspi-sleepPin = <&tlmm 94 0>; - etspi-ldoPin = <&tlmm 42 0>; - etspi-chipid = "ET713"; - etspi-modelinfo = "A705"; - etspi-position = "13.96,0.00,7.30,7.30,14.80,14.80,12.00,12.00,5.00"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-input-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-input-common.dtsi deleted file mode 100755 index 1697ecb436d7..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-input-common.dtsi +++ /dev/null @@ -1,98 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&pm6150_l18 { - regulator-min-microvolt = <3000000>; - regulator-max-microvolt = <3000000>; - regulator-boot-on; -}; - -&tlmm { - tsp_int: tsp_int { - mux { - pins = "gpio89"; - function = "gpio"; - }; - - config { - pins = "gpio89"; - input-enable; - bias-disable; - }; - }; -}; - -&qupv3_se1_i2c { - status = "ok"; - - touchscreen@50 { - status = "ok"; - compatible = "imagis,ist40xx-ts"; - reg = <0x50>; - pinctrl-names = "default"; - pinctrl-0 = <&tsp_int>; - imagis,irq-gpio = <&tlmm 89 0>; - imagis,regulator_avdd = "pm6150_l18"; - imagis,x_resolution = <1080>; - imagis,y_resolution = <2400>; - imagis,ic-version = "ist40xx"; - imagis,project-name = "a70"; - imagis,fw-bin = <1>; - imagis,octa-hw = <1>; - imagis,tclm_level = <2>; - imagis,afe_base = <0x0303>; - imagis,factory_item_version = <1>; - imagis,cm_spec = <300 2200 43>; /* min, max, gap */ - enable_settings_aot; - support_fod; - }; -}; - -/delete-node/&key_vol_up_default; -&pm6150l_gpios { - key_vol_up { - key_vol_up_default: key_vol_up_default { - pins = "gpio8"; - function = "normal"; - input-enable; - bias-pull-up; - power-source = <0>; - }; - }; -}; - -&soc { - /delete-node/gpio_keys; - gpio_keys { - status = "ok"; - compatible = "gpio-keys"; - input-name = "gpio-keys"; - - pinctrl-names = "default"; - pinctrl-0 = <&key_vol_up_default>; - - vol_up { - label = "volume_up"; - gpios = <&pm6150l_gpios 8 0x1>; - linux,input-type = <1>; - linux,code = ; - debounce-interval = <15>; - }; - }; - - ss_touch { - compatible = "samsung,ss_touch"; - ss_touch,numbers = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-nfc-r00.dtsi deleted file mode 100755 index 0a78c81c7116..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-nfc-r00.dtsi +++ /dev/null @@ -1,60 +0,0 @@ - -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -&tlmm { - nfc_qupv3_se5_i2c_sleep: nfc_qupv3_se5_i2c_sleep { - mux { - pins = "gpio14", "gpio15"; - function = "gpio"; - }; - - config { - pins = "gpio14", "gpio15"; - drive-strength = <2>; - bias-disable; - }; - }; - - nfc_pvdd_gpio: nfc_pvdd_gpio { - mux { - pins = "gpio23"; - function = "gpio"; - }; - - config { - pins = "gpio23"; - drive-strength = <2>; - bias-disable; - }; - }; -}; - -/* gpio14 and gpio15 are used for nfc i2c */ -&qupv3_se5_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se5_i2c_sleep>; - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <86 0>; - pn547,irq-gpio = <&tlmm 86 0>; - pn547,ven-gpio = <&tlmm 84 0>; - pn547,firm-gpio = <&tlmm 85 0>; - pn547,clk_req-gpio = <&tlmm 50 0>; /* BBCLK3 is controled by gpio 50 */ - pn547,pwr_req = <&tlmm 87 0>; - pn547,pvdd-gpio = <&tlmm 23 0>; - pn547,clk_req_wake; - pinctrl-names = "default"; - pinctrl-0 = <&nfc_pvdd_gpio>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r00.dts deleted file mode 100755 index 9f60a153e7e1..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r00.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-kor-r00.dtsi" -#include "sm6150-sec-a70q-kor-pinctrl-r00.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-kor-nfc-r00.dtsi" -#include "sm6150-sec-a70q-kor-tdmb-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" - -/ { - model = "Samsung A70Q PROJECT Bring-Up (board-id,00)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r01.dts deleted file mode 100755 index 635f75af044d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r01.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-kor-r01.dtsi" -#include "sm6150-sec-a70q-kor-pinctrl-r01.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-kor-nfc-r00.dtsi" -#include "sm6150-sec-a70q-kor-tdmb-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.0 (board-id,01)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,project-name = "a90"; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r02.dts deleted file mode 100755 index 90e05aaadc84..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r02.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-kor-r02.dtsi" -#include "sm6150-sec-a70q-kor-pinctrl-r02.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-kor-nfc-r00.dtsi" -#include "sm6150-sec-a70q-kor-tdmb-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.1 (board-id,02)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r03.dts deleted file mode 100755 index c6782ba16838..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-overlay-r03.dts +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-kor-r03.dtsi" -#include "sm6150-sec-a70q-kor-pinctrl-r03.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-kor-nfc-r00.dtsi" -#include "sm6150-sec-a70q-kor-tdmb-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2 (board-id,03)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r00.dtsi deleted file mode 100755 index 6fe4a3f8b598..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r00.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-pinctrl-common.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r01.dtsi deleted file mode 100755 index a87dcf22e573..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-kor-pinctrl-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r02.dtsi deleted file mode 100755 index bc7eabdb9492..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-kor-pinctrl-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r03.dtsi deleted file mode 100755 index db86584647ac..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-kor-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r00.dtsi deleted file mode 100755 index fddfcf8a1b6c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r00.dtsi +++ /dev/null @@ -1,105 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-common.dtsi" -#include "sm6150-sec-a70q-input-common.dtsi" - -/delete-node/ &i2c_22; - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r01.dtsi deleted file mode 100755 index 2a8bb2ca7844..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-kor-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r02.dtsi deleted file mode 100755 index a8cb962fafd2..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r02.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-kor-r01.dtsi" - -&soc { - -}; - -&s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -&s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -/* S2MPB03 Camera PMIC */ -&i2c2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r03.dtsi deleted file mode 100755 index fea1b4552cd9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-r03.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-kor-r02.dtsi" - -&soc { - -}; - -&s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -&s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -/* S2MPB03 Camera PMIC */ -&i2c2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-tdmb-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-tdmb-r00.dtsi deleted file mode 100755 index bb08fbee603e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-kor-tdmb-r00.dtsi +++ /dev/null @@ -1,99 +0,0 @@ - -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi1 = &qupv3_se6_spi; - }; -}; -*/ - -&tlmm { - tdmb_qupv3_se6_spi_sleep: tdmb_qupv3_se6_spi_sleep { - mux { - pins = "gpio6", "gpio7", "gpio8", - "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio6", "gpio7", "gpio8", - "gpio9"; - drive-strength = <6>; - bias-pull-down; /* pull down */ - input-enable; - }; - }; - - - tdmb_irq { - tdmb_irq_on: tdmb_irq_on { - mux { - pins = "gpio98"; - function = "gpio"; - }; - - config { - pins = "gpio98"; - drive-strength = <2>; - bias-pull-up; - }; - }; - - tdmb_irq_off: tdmb_irq_off { - mux { - pins = "gpio98"; - function = "gpio"; - }; - - config { - pins = "gpio98"; - drive-strength = <2>; - bias-pull-down; - }; - }; - }; -}; - -&soc { - tdmb_data { - compatible = "samsung,tdmb"; - - pinctrl-names = "tdmb_on", "tdmb_off"; - pinctrl-0 = <&tdmb_irq_on>; - pinctrl-1 = <&tdmb_irq_off>; - - tdmb_pwr_en = <&tlmm 40 0 0>; - tdmb_irq = <&tlmm 98 0 0>; - tdmb_lna_en = <&tlmm 119 0 0>; - /*tdmb_ldo_en = <&expander_gpios 6 0>;*/ - tdmb_use_irq; - tdmb_xtal_freq = <24000>; - }; -}; - -/* gpio 6~9 are used for tdmb spi */ -&qupv3_se6_spi { - status = "okay"; - spi-max-frequency = <19200000>; - pinctrl-1 = <&tdmb_qupv3_se6_spi_sleep>; - -/* /delete-property/ dmas; */ -/* /delete-property/ dma-names; */ - - tdmb-spi@0 { - compatible = "tdmb_spi_comp"; - reg = <0>; - spi-max-frequency = <13000000>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-mst-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-mst-r00.dtsi deleted file mode 100755 index ebbccdb20968..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-mst-r00.dtsi +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2013, Samsung Electronics Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - sec-mst { - compatible = "sec-mst"; - sec-mst,mst-pwr-gpio = <&tlmm 36 0>; - sec-mst,mst-data-gpio = <&tlmm 37 0>; - sec-mst,mst-en-gpio = <&tlmm 38 0>; - sec-mst,mst-support-gpio = <&pm6150l_gpios 2 0>; - - //pinctrl-names = "mst_active"; - //pinctrl-0 = <&mst_data_init &mst_en_init>; - }; -/* - tlmm: pinctrl@03000000 { - mst_data_init: mst_data_init { - mux { - pins = "gpio84"; - function = "gpio"; - }; - config { - pins = "gpio84"; - drive-strength = <16>; - bias-pull-down; - output_low; - }; - }; - mst_en_init: mst_en_init { - mux { - pins = "gpio83"; - function = "gpio"; - }; - config { - pins = "gpio83"; - drive-strength = <16>; - bias-pull-down; - output_low; - }; - }; - }; -*/ -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-nfc-r00.dtsi deleted file mode 100755 index 07ad2ed5e75a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-nfc-r00.dtsi +++ /dev/null @@ -1,100 +0,0 @@ - -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi1 = &qupv3_se6_spi; - }; -}; -*/ - -&tlmm { - ese_qupv3_se6_spi_sleep: ese_qupv3_se6_spi_sleep { - mux { - pins = "gpio6", "gpio7", "gpio8", - "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio6", "gpio7", "gpio8", - "gpio9"; - drive-strength = <6>; - bias-pull-down; /* pull down */ - output-low; - }; - }; - - nfc_qupv3_se5_i2c_sleep: nfc_qupv3_se5_i2c_sleep { - mux { - pins = "gpio14", "gpio15"; - function = "gpio"; - }; - - config { - pins = "gpio14", "gpio15"; - drive-strength = <2>; - bias-disable; - }; - }; - - nfc_pvdd_gpio: nfc_pvdd_gpio { - mux { - pins = "gpio23"; - function = "gpio"; - }; - - config { - pins = "gpio23"; - drive-strength = <2>; - bias-disable; - }; - }; -}; - -/* gpio14 and gpio15 are used for nfc i2c */ -&qupv3_se5_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se5_i2c_sleep>; - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <86 0>; - pn547,irq-gpio = <&tlmm 86 0>; - pn547,ven-gpio = <&tlmm 84 0>; - pn547,firm-gpio = <&tlmm 85 0>; - pn547,clk_req-gpio = <&tlmm 50 0>; /* BBCLK3 is controled by gpio 50 */ - pn547,pwr_req = <&tlmm 87 0>; - pn547,pvdd-gpio = <&tlmm 23 0>; - pn547,clk_req_wake; - pinctrl-names = "default"; - pinctrl-0 = <&nfc_pvdd_gpio>; - }; -}; - - -/* gpio 6~9 are used for ese spi */ -&qupv3_se6_spi { - status = "okay"; - spi-max-frequency = <19200000>; - pinctrl-1 = <&ese_qupv3_se6_spi_sleep>; - - ese_spi@0 { - compatible = "p61"; - reg = <0>; - spi-max-frequency = <16000000>; - p61-ap_vendor = "qualcomm"; - p61-spi_node = <&qupv3_se6_spi>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-pinctrl-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-pinctrl-common.dtsi deleted file mode 100755 index ca7bdb0fbcf2..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-pinctrl-common.dtsi +++ /dev/null @@ -1,508 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-audio-pinctrl.dtsi" - -&tlmm { - - sdc2_cd_on: cd_on { - mux { - pins = "gpio99"; - function = "gpio"; - }; - config { - pins = "gpio99"; - drive-strength = <2>; - bias-disable; - }; - certify_hall_default: certify_hall_default { - mux { - pins = "gpio96"; - function = "gpio"; - }; - config { - pins = "gpio96"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - - i2c17 { - grip_i2c: grip-i2c { - mux { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - bias-disable; - }; - }; - - grip_gpio: grip-gpio { - mux { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - bias-disable; - }; - }; - }; - - grip_ldo_en { - grip_en: grip-en { - mux { - pins = "gpio122"; - function = "gpio"; - }; - - config { - pins = "gpio122"; - bias-disable; /* NO pull */ - drive-strength = <2>; /* 2 MA */ - output-enable; - output-low; - }; - }; - }; - - i2c18 { - grip_sub_i2c: grip-sub-i2c { - mux { - pins = "gpio25", /* GRIP_SENSOR_SDA_1P8 */ - "gpio26"; /* GRIP_SENSOR_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio25", /* GRIP_SENSOR_SDA_1P8 */ - "gpio26"; /* GRIP_SENSOR_SCL_1P8 */ - bias-disable; - }; - }; - }; - - sdc2_clk_on: sdc2_clk_on { - config { - pins = "sdc2_clk"; - bias-disable; /* NO pull */ - drive-strength = <8>; /* 8 MA */ - }; - }; - - sdc2_cmd_on: sdc2_cmd_on { - config { - pins = "sdc2_cmd"; - bias-pull-up; /* pull up */ - drive-strength = <8>; /* 8 MA */ - }; - }; - - sdc2_data_on: sdc2_data_on { - config { - pins = "sdc2_data"; - bias-pull-up; /* pull up */ - drive-strength = <8>; /* 8 MA */ - }; - }; - - cam_sensor_mclk_0_active: cam_sensor_mclk_0_active { - /* REAR MCLK */ - mux { - pins = "gpio28"; - function = "cam_mclk"; - }; - config { - pins = "gpio28"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk_0_suspend: cam_sensor_mclk_0_suspend { - /* REAR MCLK */ - mux { - pins = "gpio28"; - function = "cam_mclk"; - }; - config { - pins = "gpio28"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_rear_active: cam_sensor_rear_active { - /* REAR RESET */ - mux { - pins = "gpio47"; - function = "gpio"; - }; - config { - pins = "gpio47"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_rear_suspend: cam_sensor_rear_suspend { - /* REAR RESET */ - mux { - pins = "gpio47"; - function = "gpio"; - }; - config { - pins = "gpio47"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_mclk_1_active: cam_sensor_mclk_1_active { - /* FRONT MCLK */ - mux { - pins = "gpio29"; - function = "cam_mclk"; - }; - config { - pins = "gpio29"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk_1_suspend: cam_sensor_mclk_1_suspend { - /* FRONT MCLK */ - mux { - pins = "gpio29"; - function = "cam_mclk"; - }; - config { - pins = "gpio29"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_front_active: cam_sensor_front_active { - /* FRONT RESET */ - mux { - pins = "gpio45"; - function = "gpio"; - }; - config { - pins = "gpio45"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_front_suspend: cam_sensor_front_suspend { - /* FRONT RESET */ - mux { - pins = "gpio45"; - function = "gpio"; - }; - config { - pins = "gpio45"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_mclk_2_active: cam_sensor_mclk_2_active { - /* REAR2 MCLK */ - mux { - pins = "gpio30"; - function = "cam_mclk"; - }; - config { - pins = "gpio30"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_mclk_2_suspend: cam_sensor_mclk_2_suspend { - /* REAR2 MCLK */ - mux { - pins = "gpio30"; - function = "cam_mclk"; - }; - config { - pins = "gpio30"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_rear2_active: cam_sensor_rear2_active { - /* REAR2 RESET */ - mux { - pins = "gpio46"; - function = "gpio"; - }; - config { - pins = "gpio46"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_rear2_suspend: cam_sensor_rear2_suspend { - /* REAR2 RESET */ - mux { - pins = "gpio46"; - function = "gpio"; - }; - config { - pins = "gpio46"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_mclk_3_active: cam_sensor_mclk_3_active { - /* REAR SW-8M */ - mux { - pins = "gpio31"; - function = "cam_mclk"; - }; - config { - pins = "gpio31"; - bias-disable; /* No PULL */ - drive-strength = <4>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_mclk_3_suspend: cam_sensor_mclk_3_suspend { - /* REAR SW-8M */ - mux { - pins = "gpio31"; - function = "cam_mclk"; - }; - config { - pins = "gpio31"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <4>; /* 2 MA */ - output-low; - }; - }; - - - cam_sensor_rear3sw_active: cam_sensor_rear3sw_active { - /* REAR SUB2 RESET*/ - mux { - pins = "gpio100"; - function = "gpio"; - }; - config { - pins = "gpio100"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear3sw_suspend: cam_sensor_rear3sw_suspend { - /* REAR SUB2 RESET */ - mux { - pins = "gpio100"; - function = "gpio"; - }; - config { - pins = "gpio100"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_rear3_pwr_active: cam_rear3_pwr_active { - /* REAR SUB2 RESET*/ - mux { - pins = "gpio95"; - function = "gpio"; - }; - config { - pins = "gpio95"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_rear3_pwr_suspend: cam_rear3_pwr_suspend { - /* REAR SUB2 RESET */ - mux { - pins = "gpio95"; - function = "gpio"; - }; - config { - pins = "gpio95"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - - cam_eeprom_i2c_default: cam_eeprom_i2c_default { - /* I2C SDA SCL */ - mux { - pins = "gpio18", "gpio19"; - function = "gpio"; - }; - config{ - pins = "gpio18", "gpio19"; - bias-pull-down; - drive-strength = <2>; - output-low; - }; - }; - - cam_eeprom_i2c_sleep: cam_eeprom_i2c_sleep { - /* I2C SDA SCL */ - mux { - pins = "gpio18", "gpio19"; - function = "gpio"; - }; - config { - pins = "gpio18", "gpio19"; - bias-pull-down; - drive-strength = <2>; - output-low; - }; - }; - - cam_sensor_mipi_sw_active: cam_sensor_mipi_sw_active { - /* MIPI_SWITCH */ - mux { - pins = "gpio49"; - function = "gpio"; - }; - config { - pins = "gpio49"; - bias-pull-down; /* PULL DOWN */ - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_mipi_sw_suspend: cam_sensor_mipi_sw_suspend { - /* MIPI_SWITCH */ - mux { - pins = "gpio49"; - function = "gpio"; - }; - config { - pins = "gpio49"; - bias-pull-down; /* PULL DOWN */ - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; - - led_enable: led_enable { - mux { - pins = "gpio39"; - function = "gpio"; - }; - - config { - pins = "gpio39"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - led_disable: led_disable { - mux { - pins = "gpio39"; - function = "gpio"; - }; - - config { - pins = "gpio39"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - detect_conn { - detect_conn_setting: detect_conn_setting { - config { - pins = "gpio103";/* UB_CONNECT */ - drive-strength = <2>; - bias-disable; /* No PULL */ - input-enable; - }; - }; - }; -}; - -&lpi_tlmm { - gpio-reserved-ranges = <0 8>, <12 6>, <25 5>; -}; - -&pm6150_gpios { - hall { - hall_default: hall_default { - pins = "gpio10"; - function = "normal"; - output-disable; - input-enable; - bias-disable; - power-source = <0>; - }; - }; - detect_conn_pm_setting: detect_conn_pm_setting { - pins = "gpio8"; /* SUB_DET */ - bias-disable; /* NO PULL */ - input-enable; - }; -}; - -&pm6150l_gpios { - grip_irq: grip-irq { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_input: grip-input { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-pm-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-pm-common.dtsi deleted file mode 100755 index b6c1bde20d6c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-pm-common.dtsi +++ /dev/null @@ -1,238 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include - -&soc { - /* AP Thermistor table */ - sec_thermistor@0 { - compatible = "samsung,sec-ap-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "ap_therm"; - adc_array = <1881 2208 2628 3081 3665 4223 5091 6100 6971 8092 9435 - 10870 12425 14088 15876 17588 19413 20626 - 22139 - 23387 24546 25490 26016>; - temp_array = <900 850 800 750 700 650 600 550 500 450 400 - 350 300 250 200 150 100 50 - 0 - (-50) (-100) (-150) (-200)>; - }; - - /* PA Thermistor table */ - sec_thermistor@1 { - compatible = "samsung,sec-pa-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "pa_therm"; - adc_array = <2000 2335 2752 3207 3780 4373 5245 6227 7143 8277 9627 - 11047 12666 14287 16130 17811 19629 20891 - 22382 - 23605 24725 25638 26189>; - temp_array = <900 850 800 750 700 650 600 550 500 450 400 - 350 300 250 200 150 100 50 - 0 - (-50) (-100) (-150) (-200)>; - }; - - /* WiFi Thermistor table */ - sec_thermistor@2 { - compatible = "samsung,sec-wf-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - io-channel-names = "wf_therm"; - adc_array = <1957 2298 2714 3157 3732 4327 5195 6178 7091 8215 9553 - 11000 12575 14194 16036 17727 19530 20828 - 22308 - 23540 24672 25597 26163>; - temp_array = <900 850 800 750 700 650 600 550 500 450 400 - 350 300 250 200 150 100 50 - 0 - (-50) (-100) (-150) (-200)>; - }; - - i2c_22: i2c@22 { - /* S2DOS03 Display PMIC */ - status = "ok"; - - cell-index = <22>; - compatible = "i2c-gpio"; - gpios = <&tlmm 108 0 /* OCTA_PMIC_SDA_1P8 */ - &tlmm 109 0 /* OCTA_PMIC_SCL_1P8 */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&i2c_22_pinctrl>; - - s2dos03@60 { - compatible = "slsi,s2dos03"; - reg = <0x60>; - - buck-ramp-up = <0>; /* 6.25mV/us */ - buck-fpwm = <0>; /* Disable */ - - uvlo-fall-threshold = <0>; /* 2.30V */ - - regulators { - s2dos03_l1: s2dos03-ldo1 { - regulator-name = "s2dos03-ldo1"; - regulator-min-microvolt = <600000>; - regulator-max-microvolt = <3775000>; - active-discharge-enable = <1>; - }; - - s2dos03_l2: s2dos03-ldo2 { - regulator-name = "s2dos03-ldo2"; - regulator-min-microvolt = <600000>; - regulator-max-microvolt = <3775000>; - active-discharge-enable = <1>; - }; - - s2dos03_l3: s2dos03-ldo3 { - regulator-name = "s2dos03-ldo3"; - regulator-min-microvolt = <600000>; - regulator-max-microvolt = <3775000>; - active-discharge-enable = <1>; - }; - - s2dos03_l4: s2dos03-ldo4 { - regulator-name = "s2dos03-ldo4"; - regulator-min-microvolt = <600000>; - regulator-max-microvolt = <3775000>; - active-discharge-enable = <1>; - }; - - s2dos03_buck: s2dos03-buck { - regulator-name = "s2dos03-buck"; - regulator-min-microvolt = <500000>; - regulator-max-microvolt = <2093750>; - regulator-boot-on; /* from DREAMQ */ - active-discharge-enable = <1>; - }; - }; - }; - }; -}; - -&spmi_bus { - qcom,pm6150@0{ - qcom,power-on@800 { - interrupts = <0x0 0x8 0x0 IRQ_TYPE_NONE>, - <0x0 0x8 0x1 IRQ_TYPE_NONE>, - <0x0 0x8 0x4 IRQ_TYPE_NONE>, - <0x0 0x8 0x5 IRQ_TYPE_NONE>; - interrupt-names = "kpdpwr", "resin", - "resin-bark", "kpdpwr-resin-bark"; - qcom,store-hard-reset-reason; - qcom,s3-debounce = <128>; - - qcom,pon_1 { - qcom,support-reset = <0>; - }; - - qcom,pon_2 { - qcom,support-reset = <0>; - }; - - qcom,pon_3 { - qcom,pon-type = ; - qcom,support-reset = <1>; - qcom,pull-up = <1>; - qcom,s1-timer = <6720>; - qcom,s2-timer = <1000>; - qcom,s2-type = ; - qcom,use-bark; - }; - }; - }; - - qcom,pm6150l@5 { - flash_led: qcom,leds@d300 { - pm6150l_flash0: qcom,flash_0 { - label = "flash"; - qcom,led-name = "led:flash_0"; - qcom,max-current = <1500>; - qcom,default-led-trigger = "flash0_trigger"; - qcom,id = <0>; - qcom,current-ma = <1200>; - qcom,duration-ms = <1280>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - qcom,record-current-ma = <200>; - }; - pm6150l_torch0: qcom,torch_0 { - label = "torch"; - qcom,led-name = "led:torch_0"; - qcom,max-current = <500>; - qcom,default-led-trigger = "torch0_trigger"; - qcom,id = <0>; - qcom,current-ma = <300>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - }; - }; - }; -}; -&pm6150_gpios { - interrupts = <0x0 0xc0 0 IRQ_TYPE_NONE>, - <0x0 0xc1 0 IRQ_TYPE_NONE>, - <0x0 0xc2 0 IRQ_TYPE_NONE>, - <0x0 0xc3 0 IRQ_TYPE_NONE>, - <0x0 0xc5 0 IRQ_TYPE_NONE>, - <0x0 0xc6 0 IRQ_TYPE_NONE>, - <0x0 0xc7 0 IRQ_TYPE_NONE>, - <0x0 0xc9 0 IRQ_TYPE_NONE>; - interrupt-names = "pm6150_gpio1", "pm6150_gpio2", - "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio6", - "pm6150_gpio7", "pm6150_gpio8", - "pm6150_gpio10"; - qcom,gpios-disallowed = <5 9>; -}; - -&pm6150_vadc { - sdm_therm { - reg = ; - label = "ap_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; -}; - -&pm6150l_vadc { - rf_pa0_therm { - reg = ; - label = "pa_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - rf_pa1_therm { - reg = ; - label = "wf_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r00.dts deleted file mode 100755 index 40d389378188..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r00.dts +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-r00.dtsi" -#include "sm6150-sec-a70q-sea-pinctrl-r00.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" - -/ { - model = "Samsung A70Q PROJECT Bring-Up (board-id,00)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r01.dts deleted file mode 100755 index 405b57274f0f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r01.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-r01.dtsi" -#include "sm6150-sec-a70q-sea-pinctrl-r01.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.0 (board-id,01)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,project-name = "a90"; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r02.dts deleted file mode 100755 index cd1de349a185..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r02.dts +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-r02.dtsi" -#include "sm6150-sec-a70q-sea-pinctrl-r02.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.1 (board-id,02)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r03.dts deleted file mode 100755 index 7674e56beb19..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r03.dts +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-r03.dtsi" -#include "sm6150-sec-a70q-sea-pinctrl-r03.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2 (board-id,03)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r05.dts deleted file mode 100755 index aed9f9a5baea..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r05.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-r05.dtsi" -#include "sm6150-sec-a70q-sea-pinctrl-r05.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2A (board-id,05)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 5>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r06.dts deleted file mode 100755 index 7d3e29c6cbee..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r06.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-r06.dtsi" -#include "sm6150-sec-a70q-sea-pinctrl-r06.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.3 (board-id,06)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 6>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r09.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r09.dts deleted file mode 100755 index f214f6b106fd..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r09.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-r09.dtsi" -#include "sm6150-sec-a70q-sea-pinctrl-r09.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,09)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 9>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r10.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r10.dts deleted file mode 100755 index 405d99ed22c8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r10.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-r10.dtsi" -#include "sm6150-sec-a70q-sea-pinctrl-r10.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,10)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 10>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r11.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r11.dts deleted file mode 100755 index 52c3f006790d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r11.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-r11.dtsi" -#include "sm6150-sec-a70q-sea-pinctrl-r11.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,11)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 11>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r12.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r12.dts deleted file mode 100755 index d6427e422974..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r12.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-r12.dtsi" -#include "sm6150-sec-a70q-sea-pinctrl-r12.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,12)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 12>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r13.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r13.dts deleted file mode 100755 index 771d59622ce8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r13.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-r13.dtsi" -#include "sm6150-sec-a70q-sea-pinctrl-r13.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,13)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 13>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r14.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r14.dts deleted file mode 100755 index 5d3a05742423..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-overlay-r14.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-r14.dtsi" -#include "sm6150-sec-a70q-sea-pinctrl-r14.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,14)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 14>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r00.dtsi deleted file mode 100755 index 6fe4a3f8b598..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r00.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-pinctrl-common.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r01.dtsi deleted file mode 100755 index 50c46a16a82d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-pinctrl-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r02.dtsi deleted file mode 100755 index 3f1d5a511231..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-pinctrl-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r03.dtsi deleted file mode 100755 index e4c66e098e1f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r05.dtsi deleted file mode 100755 index dd979c1be1ab..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r05.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-pinctrl-r03.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r06.dtsi deleted file mode 100755 index 3910280667eb..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r06.dtsi +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-pinctrl-r05.dtsi" - -&pm6150_gpios { - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r09.dtsi deleted file mode 100755 index e1df1ba1d729..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r10.dtsi deleted file mode 100755 index e1df1ba1d729..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r11.dtsi deleted file mode 100755 index e1df1ba1d729..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r12.dtsi deleted file mode 100755 index 83ab3ed9791a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-pinctrl-r09.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r13.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r13.dtsi deleted file mode 100755 index eafb4ebd36d0..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r13.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-pinctrl-r10.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r14.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r14.dtsi deleted file mode 100755 index 525b9d933116..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-pinctrl-r14.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-pinctrl-r11.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r00.dtsi deleted file mode 100755 index 59820e0bcc3c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r00.dtsi +++ /dev/null @@ -1,105 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-common.dtsi" -#include "sm6150-sec-a70q-input-common.dtsi" - -/delete-node/ &i2c_22; - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r01.dtsi deleted file mode 100755 index c653d0b19989..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-r00.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r02.dtsi deleted file mode 100755 index 23cf78107159..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r02.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-r01.dtsi" - -&soc { - -}; - -&s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -&s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -/* S2MPB03 Camera PMIC */ -&i2c2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r03.dtsi deleted file mode 100755 index 4efdfa7466bf..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r03.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-r02.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r05.dtsi deleted file mode 100755 index 189ccc40e74e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r05.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-r03.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r06.dtsi deleted file mode 100755 index cbba777e481b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r06.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-r05.dtsi" - -&pm6150_charger { - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - - water-det-enable; - #sub-short-detect-enable; -}; - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r09.dtsi deleted file mode 100755 index 2d0e56c52988..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r10.dtsi deleted file mode 100755 index 2d0e56c52988..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r11.dtsi deleted file mode 100755 index 2d0e56c52988..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r12.dtsi deleted file mode 100755 index ec6f8472958e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-r09.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r13.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r13.dtsi deleted file mode 100755 index 41957af78459..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r13.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-r10.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r14.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r14.dtsi deleted file mode 100755 index f577a59b2b33..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-r14.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-r11.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r00.dts deleted file mode 100755 index e52b260746b4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r00.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xsa-r00.dtsi" -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r00.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" - -/ { - model = "Samsung A70Q PROJECT Bring-Up (board-id,00)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r01.dts deleted file mode 100755 index 8075e4607446..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r01.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xsa-r01.dtsi" -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r01.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.0 (board-id,01)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,project-name = "a90"; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r02.dts deleted file mode 100755 index b80c7ade130e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r02.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xsa-r02.dtsi" -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r02.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.1 (board-id,02)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r03.dts deleted file mode 100755 index e5605fd93359..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r03.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xsa-r03.dtsi" -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r03.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2 (board-id,03)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r05.dts deleted file mode 100755 index 58b57e018d12..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r05.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xsa-r05.dtsi" -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r05.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2A (board-id,05)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 5>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r06.dts deleted file mode 100755 index ad5677e77f00..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r06.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xsa-r06.dtsi" -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r06.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.3 (board-id,06)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 6>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r09.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r09.dts deleted file mode 100755 index 8c9a1a8fb817..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r09.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xsa-r09.dtsi" -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r09.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,09)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 9>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r10.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r10.dts deleted file mode 100755 index ad41e11c6c5b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r10.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xsa-r10.dtsi" -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r10.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,10)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 10>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r11.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r11.dts deleted file mode 100755 index 688d9f5582ce..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r11.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xsa-r11.dtsi" -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r11.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,11)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 11>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r12.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r12.dts deleted file mode 100755 index e7aa1df2687c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r12.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xsa-r12.dtsi" -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r12.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,12)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 12>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r13.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r13.dts deleted file mode 100755 index 833e90a1fa4c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r13.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xsa-r13.dtsi" -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r13.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,13)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 13>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r14.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r14.dts deleted file mode 100755 index 0f1612aea692..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r14.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xsa-r14.dtsi" -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r14.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,14)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 14>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r15.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r15.dts deleted file mode 100755 index 3488e16f4954..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-overlay-r15.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xsa-r15.dtsi" -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r15.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.4B (board-id,15)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 15>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r00.dtsi deleted file mode 100755 index 6fe4a3f8b598..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r00.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-pinctrl-common.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r01.dtsi deleted file mode 100755 index 479aa4a10c10..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r02.dtsi deleted file mode 100755 index 7f64d959733e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r03.dtsi deleted file mode 100755 index 7c9d69edc4eb..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r05.dtsi deleted file mode 100755 index c2a0bde002d1..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r05.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r03.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r06.dtsi deleted file mode 100755 index 22317f5c0f03..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r06.dtsi +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r05.dtsi" - -&pm6150_gpios { - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r09.dtsi deleted file mode 100755 index 214c8ee7b979..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r10.dtsi deleted file mode 100755 index 214c8ee7b979..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r11.dtsi deleted file mode 100755 index 214c8ee7b979..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r12.dtsi deleted file mode 100755 index 80e1f57deaf7..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r09.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r13.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r13.dtsi deleted file mode 100755 index 80c834e06b89..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r13.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r10.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r14.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r14.dtsi deleted file mode 100755 index 85918a129f19..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r14.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r11.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r15.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r15.dtsi deleted file mode 100755 index 3d842b0f2696..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-pinctrl-r15.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-pinctrl-r14.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r00.dtsi deleted file mode 100755 index fddfcf8a1b6c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r00.dtsi +++ /dev/null @@ -1,105 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-common.dtsi" -#include "sm6150-sec-a70q-input-common.dtsi" - -/delete-node/ &i2c_22; - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r01.dtsi deleted file mode 100755 index f239ac0224c5..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-r00.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r02.dtsi deleted file mode 100755 index dda437b343ad..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r02.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-r01.dtsi" - -&soc { - -}; - -&s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -&s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -/* S2MPB03 Camera PMIC */ -&i2c2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r03.dtsi deleted file mode 100755 index c19f7dcd41da..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r03.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-r02.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r05.dtsi deleted file mode 100755 index cacb8f1a698a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r05.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-r03.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r06.dtsi deleted file mode 100755 index 37d55738d403..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r06.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-r05.dtsi" - -&pm6150_charger { - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - - water-det-enable; - #sub-short-detect-enable; -}; - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r09.dtsi deleted file mode 100755 index c4e1ed3540a4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r10.dtsi deleted file mode 100755 index c4e1ed3540a4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r11.dtsi deleted file mode 100755 index c4e1ed3540a4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r12.dtsi deleted file mode 100755 index 4b102faff94c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-r09.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r13.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r13.dtsi deleted file mode 100755 index 4417348105c1..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r13.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-r10.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r14.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r14.dtsi deleted file mode 100755 index dd705947fb20..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r14.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-r11.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r15.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r15.dtsi deleted file mode 100755 index efe132eee22c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xsa-r15.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xsa-r14.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi deleted file mode 100755 index a37a4681389b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi +++ /dev/null @@ -1,68 +0,0 @@ - -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi1 = &qupv3_se6_spi; - }; -}; -*/ - -&tlmm { - nfc_qupv3_se5_i2c_sleep: nfc_qupv3_se5_i2c_sleep { - mux { - pins = "gpio14", "gpio15"; - function = "gpio"; - }; - - config { - pins = "gpio14", "gpio15"; - drive-strength = <2>; - bias-disable; - }; - }; - - nfc_pvdd_gpio: nfc_pvdd_gpio { - mux { - pins = "gpio23"; - function = "gpio"; - }; - - config { - pins = "gpio23"; - drive-strength = <2>; - bias-disable; - }; - }; -}; - -/* gpio14 and gpio15 are used for nfc i2c */ -&qupv3_se5_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se5_i2c_sleep>; - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <86 0>; - pn547,irq-gpio = <&tlmm 86 0>; - pn547,ven-gpio = <&tlmm 84 0>; - pn547,firm-gpio = <&tlmm 85 0>; - pn547,clk_req-gpio = <&tlmm 50 0>; /* BBCLK3 is controled by gpio 50 */ - pn547,pwr_req = <&tlmm 87 0>; - pn547,pvdd-gpio = <&tlmm 23 0>; - pn547,clk_req_wake; - pinctrl-names = "default"; - pinctrl-0 = <&nfc_pvdd_gpio>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r00.dts deleted file mode 100755 index fdf5f66dadba..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r00.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xtc-r00.dtsi" -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r00.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" - -/ { - model = "Samsung A70Q PROJECT Bring-Up (board-id,00)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r01.dts deleted file mode 100755 index 2c8a22493f26..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r01.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xtc-r01.dtsi" -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r01.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.0 (board-id,01)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,project-name = "a90"; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r02.dts deleted file mode 100755 index 86adb473430a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r02.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xtc-r02.dtsi" -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r02.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.1 (board-id,02)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r03.dts deleted file mode 100755 index a2949dc71e51..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r03.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xtc-r03.dtsi" -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r03.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2 (board-id,03)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r05.dts deleted file mode 100755 index 2bfd6ebfef93..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r05.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xtc-r05.dtsi" -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r05.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2A (board-id,05)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 5>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r06.dts deleted file mode 100755 index f9bedb5ba03c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r06.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xtc-r06.dtsi" -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r06.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.3 (board-id,06)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 6>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r09.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r09.dts deleted file mode 100755 index 88100a3a46b4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r09.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xtc-r09.dtsi" -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r09.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,09)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 9>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r10.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r10.dts deleted file mode 100755 index a18f8d197582..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r10.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xtc-r10.dtsi" -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r10.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,10)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 10>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r11.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r11.dts deleted file mode 100755 index 738205653a12..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r11.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xtc-r11.dtsi" -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r11.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,11)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 11>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r12.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r12.dts deleted file mode 100755 index 91fd358c8d82..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r12.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xtc-r12.dtsi" -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r12.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,12)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 12>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r13.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r13.dts deleted file mode 100755 index cc94bc2f2c32..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r13.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xtc-r13.dtsi" -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r13.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,13)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 13>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r14.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r14.dts deleted file mode 100755 index 611ca78e0b73..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-overlay-r14.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-sea-xtc-r14.dtsi" -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r14.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-sea-xtc-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,14)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 14>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r00.dtsi deleted file mode 100755 index 6fe4a3f8b598..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r00.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-pinctrl-common.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r01.dtsi deleted file mode 100755 index f2c9e5332275..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r02.dtsi deleted file mode 100755 index b2164db6b348..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r03.dtsi deleted file mode 100755 index 4d7ba917160a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r05.dtsi deleted file mode 100755 index c47704e50007..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r05.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r03.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r06.dtsi deleted file mode 100755 index c7ef25dc9403..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r06.dtsi +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r05.dtsi" - -&pm6150_gpios { - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r09.dtsi deleted file mode 100755 index 6576ff8afb2b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r10.dtsi deleted file mode 100755 index 6576ff8afb2b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r11.dtsi deleted file mode 100755 index 6576ff8afb2b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r12.dtsi deleted file mode 100755 index 35887138f269..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r09.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r13.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r13.dtsi deleted file mode 100755 index 45da97d073ac..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r13.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r10.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r14.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r14.dtsi deleted file mode 100755 index 97c2309594c8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-pinctrl-r14.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-pinctrl-r11.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r00.dtsi deleted file mode 100755 index fddfcf8a1b6c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r00.dtsi +++ /dev/null @@ -1,105 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-common.dtsi" -#include "sm6150-sec-a70q-input-common.dtsi" - -/delete-node/ &i2c_22; - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r01.dtsi deleted file mode 100755 index 0a93008dcc56..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-r00.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r02.dtsi deleted file mode 100755 index 0582ca90fccd..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r02.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-r01.dtsi" - -&soc { - -}; - -&s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -&s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -/* S2MPB03 Camera PMIC */ -&i2c2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r03.dtsi deleted file mode 100755 index bd4683d2a84f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r03.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-r02.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r05.dtsi deleted file mode 100755 index b9cd8270646f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r05.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-r03.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r06.dtsi deleted file mode 100755 index 919dbfeaf4c5..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r06.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-r05.dtsi" - -&pm6150_charger { - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - - water-det-enable; - #sub-short-detect-enable; -}; - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r09.dtsi deleted file mode 100755 index edf8e928ab39..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r10.dtsi deleted file mode 100755 index edf8e928ab39..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r11.dtsi deleted file mode 100755 index edf8e928ab39..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r12.dtsi deleted file mode 100755 index 92a1acf0c9ce..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-r09.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r13.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r13.dtsi deleted file mode 100755 index 25cbfdb2dbab..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r13.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-r10.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r14.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r14.dtsi deleted file mode 100755 index d1005ce1a09e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-sea-xtc-r14.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-sea-xtc-r11.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-nfc-r00.dtsi deleted file mode 100755 index a37a4681389b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-nfc-r00.dtsi +++ /dev/null @@ -1,68 +0,0 @@ - -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi1 = &qupv3_se6_spi; - }; -}; -*/ - -&tlmm { - nfc_qupv3_se5_i2c_sleep: nfc_qupv3_se5_i2c_sleep { - mux { - pins = "gpio14", "gpio15"; - function = "gpio"; - }; - - config { - pins = "gpio14", "gpio15"; - drive-strength = <2>; - bias-disable; - }; - }; - - nfc_pvdd_gpio: nfc_pvdd_gpio { - mux { - pins = "gpio23"; - function = "gpio"; - }; - - config { - pins = "gpio23"; - drive-strength = <2>; - bias-disable; - }; - }; -}; - -/* gpio14 and gpio15 are used for nfc i2c */ -&qupv3_se5_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se5_i2c_sleep>; - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <86 0>; - pn547,irq-gpio = <&tlmm 86 0>; - pn547,ven-gpio = <&tlmm 84 0>; - pn547,firm-gpio = <&tlmm 85 0>; - pn547,clk_req-gpio = <&tlmm 50 0>; /* BBCLK3 is controled by gpio 50 */ - pn547,pwr_req = <&tlmm 87 0>; - pn547,pvdd-gpio = <&tlmm 23 0>; - pn547,clk_req_wake; - pinctrl-names = "default"; - pinctrl-0 = <&nfc_pvdd_gpio>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r00.dts deleted file mode 100755 index e4b8ae8c6a4b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r00.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-swa-r00.dtsi" -#include "sm6150-sec-a70q-swa-pinctrl-r00.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-swa-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT Bring-Up (board-id,00)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r01.dts deleted file mode 100755 index 1c5eb5eb7371..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r01.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-swa-r01.dtsi" -#include "sm6150-sec-a70q-swa-pinctrl-r01.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-swa-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.0 (board-id,01)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,project-name = "a90"; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r02.dts deleted file mode 100755 index 1e74c9630288..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r02.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-swa-r02.dtsi" -#include "sm6150-sec-a70q-swa-pinctrl-r02.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-swa-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.1 (board-id,02)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r03.dts deleted file mode 100755 index ff7c9729e968..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r03.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-swa-r03.dtsi" -#include "sm6150-sec-a70q-swa-pinctrl-r03.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-swa-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2 (board-id,03)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r05.dts deleted file mode 100755 index 6286b44e100b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r05.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-swa-r05.dtsi" -#include "sm6150-sec-a70q-swa-pinctrl-r05.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-swa-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2A (board-id,05)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 5>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r06.dts deleted file mode 100755 index 625439ac9bdd..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r06.dts +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-swa-r06.dtsi" -#include "sm6150-sec-a70q-swa-pinctrl-r06.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-swa-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.3 (board-id,06)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 6>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r09.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r09.dts deleted file mode 100755 index 7e552ccc36e8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r09.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-swa-r09.dtsi" -#include "sm6150-sec-a70q-swa-pinctrl-r09.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-swa-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,09)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 9>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r10.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r10.dts deleted file mode 100755 index ddaabc1ac80c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r10.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-swa-r10.dtsi" -#include "sm6150-sec-a70q-swa-pinctrl-r10.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-swa-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,10)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 10>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r11.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r11.dts deleted file mode 100755 index 64696ebae848..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r11.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-swa-r11.dtsi" -#include "sm6150-sec-a70q-swa-pinctrl-r11.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-swa-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,11)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 11>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r12.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r12.dts deleted file mode 100755 index 7b1b1ef8482e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r12.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-swa-r12.dtsi" -#include "sm6150-sec-a70q-swa-pinctrl-r12.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-swa-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,12)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 12>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r13.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r13.dts deleted file mode 100755 index 7dfbae2d0374..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r13.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-swa-r13.dtsi" -#include "sm6150-sec-a70q-swa-pinctrl-r13.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-swa-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,13)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 13>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r14.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r14.dts deleted file mode 100755 index 86a82ecd96f4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-overlay-r14.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-swa-r14.dtsi" -#include "sm6150-sec-a70q-swa-pinctrl-r14.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-swa-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.6 (board-id,14)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 14>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r00.dtsi deleted file mode 100755 index 6fe4a3f8b598..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r00.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-pinctrl-common.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r01.dtsi deleted file mode 100755 index eb3ec8f82947..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-pinctrl-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r02.dtsi deleted file mode 100755 index 9d84fcdd189d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-pinctrl-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r03.dtsi deleted file mode 100755 index c1f5f90264b6..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r05.dtsi deleted file mode 100755 index fbc5659ec974..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r05.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-pinctrl-r03.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r06.dtsi deleted file mode 100755 index 982dcbf9da75..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r06.dtsi +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-pinctrl-r05.dtsi" - -&pm6150_gpios { - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r09.dtsi deleted file mode 100755 index b8be3f0f734c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r10.dtsi deleted file mode 100755 index b8be3f0f734c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r11.dtsi deleted file mode 100755 index b8be3f0f734c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r12.dtsi deleted file mode 100755 index bcb0188e4489..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-pinctrl-r09.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r13.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r13.dtsi deleted file mode 100755 index 3f5e02ba52db..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r13.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-pinctrl-r10.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r14.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r14.dtsi deleted file mode 100755 index ef54f8a36be9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-pinctrl-r14.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-pinctrl-r11.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r00.dtsi deleted file mode 100755 index 46aef7db7f79..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r00.dtsi +++ /dev/null @@ -1,105 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-common.dtsi" -#include "sm6150-sec-a70q-input-common.dtsi" - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -/delete-node/ &i2c_22; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r01.dtsi deleted file mode 100755 index f73a4b967355..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-r00.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r02.dtsi deleted file mode 100755 index 3a977a5c79ae..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r02.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-eur-r01.dtsi" - -&soc { - -}; - -&s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -&s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -/* S2MPB03 Camera PMIC */ -&i2c2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r03.dtsi deleted file mode 100755 index 94d6f883d720..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r03.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-r02.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r05.dtsi deleted file mode 100755 index 1be634f668ed..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r05.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-r03.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r06.dtsi deleted file mode 100755 index 74c2359a27a3..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r06.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-r05.dtsi" - -&pm6150_charger { - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - - water-det-enable; - #sub-short-detect-enable; -}; - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r09.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r09.dtsi deleted file mode 100755 index d260e501207d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r10.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r10.dtsi deleted file mode 100755 index d260e501207d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r10.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r11.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r11.dtsi deleted file mode 100755 index d260e501207d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r11.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-r06.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r12.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r12.dtsi deleted file mode 100755 index 40caf8fa189b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r12.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-r09.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r13.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r13.dtsi deleted file mode 100755 index 8b3c660bb53e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r13.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-r10.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r14.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r14.dtsi deleted file mode 100755 index 5def7f366fc9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-swa-r14.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-swa-r11.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-overlay-r00.dts deleted file mode 100755 index da179b2662cc..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-overlay-r00.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-usa-r00.dtsi" -#include "sm6150-sec-a70q-usa-pinctrl-r00.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r00.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_00.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r00.dtsi" -/ { - model = "Samsung A70Q PROJECT Bring-Up (board-id,00)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-overlay-r02.dts deleted file mode 100755 index 3339ff1eb218..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-overlay-r02.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-usa-r02.dtsi" -#include "sm6150-sec-a70q-usa-pinctrl-r02.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r09.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.2 (board-id,02)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-overlay-r03.dts deleted file mode 100755 index 05f88fbec956..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-overlay-r03.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70q-pm-common.dtsi" - -#include "sm6150-sec-a70q-usa-r03.dtsi" -#include "sm6150-sec-a70q-usa-pinctrl-r03.dtsi" -#include "sm6150-sec-a70q-battery-common.dtsi" -#include "sm6150-sec-a70q-nfc-r00.dtsi" -#include "sm6150-sec-a70q-eif-r09.dtsi" -#include "sm6150-sec-a70q-display-r01.dtsi" -#include "sm6150-sec-a70q-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70q-eur-r02.dtsi" -/ { - model = "Samsung A70Q PROJECT Rev0.3 (board-id,03)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-pinctrl-r00.dtsi deleted file mode 100755 index 6fe4a3f8b598..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-pinctrl-r00.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-pinctrl-common.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-pinctrl-r02.dtsi deleted file mode 100755 index bc3ce1d8afc5..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-pinctrl-r02.dtsi +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-usa-pinctrl-r00.dtsi" - -&pm6150_gpios { - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-pinctrl-r03.dtsi deleted file mode 100755 index 0129bbbb13f9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-usa-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-r00.dtsi deleted file mode 100755 index d19831205a4a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-r00.dtsi +++ /dev/null @@ -1,146 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-common.dtsi" -#include "sm6150-sec-a70q-input-common.dtsi" - -/delete-node/ &i2c_22; -/delete-node/ &i2c_17; - -&wcd937x_codec { - imp-table = <&imp_list 0 5 6>, - <&imp_list 6 23 8>, - <&imp_list 24 38 7>, - <&imp_list 39 100 6>, - <&imp_list 101 160 7>, - <&imp_list 161 400 8>, - <&imp_list 401 2000 8>, - <&imp_list 2001 0x7fffffff 6>; -}; - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; - - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = < &tlmm 115 0 /* sda */ - &tlmm 116 0 /* scl */ - >; - pinctrl-names = "default","on_i2c","off_i2c"; - pinctrl-0 = <&grip_i2c>; - pinctrl-1 = <&grip_i2c>; - pinctrl-2 = <&grip_gpio>; - - a96t3x6@20 { - compatible = "a96t3x6"; - pinctrl-names = "default"; - reg = <0x20>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - a96t3x6,irq_gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_HIGH>; - a96t3x6,ldo_en = <&tlmm 122 0>; - /* a96t3x6,fw_path = "abov/a96t346_a70q_usa.bin"; */ - a96t3x6,fw_path = "a96t346_a70q_usa.bin"; - a96t3x6,firmup_cmd = <0x38>; - a96t3x6,earjack_noise = <1>; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-r02.dtsi deleted file mode 100755 index 42449ae02ff3..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-r02.dtsi +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-usa-r00.dtsi" - -/delete-node/ &i2c_17; - -&pm6150_charger { - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - - water-det-enable; - #sub-short-detect-enable; -}; - -&soc { - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = < &tlmm 115 0 /* sda */ - &tlmm 116 0 /* scl */ - >; - pinctrl-names = "default","on_i2c","off_i2c"; - pinctrl-0 = <&grip_i2c>; - pinctrl-1 = <&grip_i2c>; - pinctrl-2 = <&grip_gpio>; - - a96t3x6@20 { - compatible = "a96t3x6"; - pinctrl-names = "default"; - reg = <0x20>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - a96t3x6,irq_gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_HIGH>; - a96t3x6,ldo_en = <&tlmm 122 0>; - /* a96t3x6,fw_path = "abov/a96t346_a70q_usa.bin"; */ - a96t3x6,fw_path = "a96t346_a70q_usa.bin"; - a96t3x6,firmup_cmd = <0x38>; - a96t3x6,earjack_noise = <1>; - }; - }; -}; - -&s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -&s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - /delete-property/bias-pull-up; - bias-disable; - }; -}; - -/* S2MPB03 Camera PMIC */ -&i2c2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-r03.dtsi deleted file mode 100755 index 53abbf9b02f5..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70q-usa-r03.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70q-usa-r02.dtsi" - -/delete-node/ &i2c_17; - -&soc { - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = < &tlmm 115 0 /* sda */ - &tlmm 116 0 /* scl */ - >; - pinctrl-names = "default","on_i2c","off_i2c"; - pinctrl-0 = <&grip_i2c>; - pinctrl-1 = <&grip_i2c>; - pinctrl-2 = <&grip_gpio>; - - a96t3x6@20 { - compatible = "a96t3x6"; - pinctrl-names = "default"; - reg = <0x20>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - a96t3x6,irq_gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_HIGH>; - a96t3x6,ldo_en = <&tlmm 122 0>; - /* a96t3x6,fw_path = "abov/a96t346_a70q_usa.bin"; */ - a96t3x6,fw_path = "a96t346_a70q_usa.bin"; - a96t3x6,firmup_cmd = <0x38>; - a96t3x6,earjack_noise = <1>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-audio-pinctrl.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-audio-pinctrl.dtsi deleted file mode 100755 index 8b137891791f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-audio-pinctrl.dtsi +++ /dev/null @@ -1 +0,0 @@ - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-audio.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-audio.dtsi deleted file mode 100755 index 6bdbdc898df1..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-audio.dtsi +++ /dev/null @@ -1,139 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../qcom/sm6150-audio-overlay.dtsi" - -&bolero { - qcom,num-macros = <4>; - imp_list: imp_list { - #list-imp-cells = <3>; - }; -}; - -&wcd937x_codec { - qcom,cdc-micbias2-mv = <2800>; - imp-table = <&imp_list 0 5 6>, - <&imp_list 6 23 8>, - <&imp_list 24 38 7>, - <&imp_list 39 100 6>, - <&imp_list 101 160 10>, - <&imp_list 161 400 11>, - <&imp_list 401 2000 11>, - <&imp_list 2001 0x7fffffff 6>; -}; - -&sm6150_snd { - qcom,model = "sm6150-idp-snd-card"; - qcom,msm-mi2s-master = <1>, <1>, <1>, <1>, <1>; - qcom,ext-disp-audio-rx = <1>; - - asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>, - <&loopback>, <&compress>, <&hostless>, - <&afe>, <&lsm>, <&routing>, <&compr>, - <&pcm_noirq>, <&samsung_q6audio_adaptation>; - asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", - "msm-pcm-dsp.2", "msm-voip-dsp", - "msm-pcm-voice", "msm-pcm-loopback", - "msm-compress-dsp", "msm-pcm-hostless", - "msm-pcm-afe", "msm-lsm-client", - "msm-pcm-routing", "msm-compr-dsp", - "msm-pcm-dsp-noirq", "q6audio-adaptation"; - qcom,audio-routing = - "AMIC1", "MIC BIAS1", - "MIC BIAS1", "Analog Mic1", - "AMIC2", "MIC BIAS2", - "MIC BIAS2", "Analog Mic2", - "AMIC3", "MIC BIAS3", - "MIC BIAS3", "Analog Mic3", - "IN1_HPHL", "HPHL_OUT", - "IN2_HPHR", "HPHR_OUT", - "IN3_AUX", "AUX_OUT", - "TX SWR_ADC0", "ADC1_OUTPUT", - "TX SWR_ADC2", "ADC2_OUTPUT", - "WSA SRC0_INP", "SRC0", - "WSA_TX DEC0_INP", "TX DEC0 MUX", - "WSA_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC0_INP", "TX DEC0 MUX", - "RX_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC2_INP", "TX DEC2 MUX", - "RX_TX DEC3_INP", "TX DEC3 MUX", - "SpkrLeft IN", "WSA_SPK1 OUT"; - qcom,msm-mbhc-hs-mic-max-threshold-mv = <9999>; - qcom,msm-mbhc-hs-mic-min-threshold-mv = <640>; - qcom,msm-mbhc-hphl-swh = <1>; - qcom,msm-mbhc-gnd-swh = <0>; - qcom,cdc-dmic01-gpios = <0>; - qcom,cdc-dmic23-gpios = <0>; - qcom,fm-lna-gpios = <&tlmm 119 0>; - asoc-codec = <&stub_codec>, <&bolero>, <&ext_disp_audio_codec>; - asoc-codec-names = "msm-stub-codec.1", "bolero_codec", - "msm-ext-disp-audio-codec-rx"; - qcom,wsa-max-devs = <1>; - qcom,wsa-devs = <&wsa881x_0213>; - qcom,wsa-aux-dev-prefix = "SpkrLeft"; - - qcom,codec-max-aux-devs = <1>; - qcom,codec-aux-devs = <&wcd937x_codec>; - qcom,msm_audio_ssr_devs = <&audio_apr>, <&q6core>, - <&lpi_tlmm>, <&bolero>; - mbhc-button-thres = <&det_zones 13 63>, - <&det_zones 88 138>, - <&det_zones 125 125>, - <&det_zones 225 225>, - <&det_zones 500 500>, - <&det_zones 620 620>, - <&det_zones 620 620>, - <&det_zones 620 620>; -}; - -&soc { - det_zones: det_zones { - #list-det-cells = <2>; - }; - - samsung_q6audio_adaptation: samsung,q6audio-adaptation { - compatible = "samsung,q6audio-adaptation"; - adaptation,voice-tracking-tx-port-id = <0xB037>; - adaptation,amp-rx-port-id = <0xB000>; - }; -}; - -&wsa_macro { - #cooling-cells = <2>; -}; - -&thermal_zones { - aoss-lowc { - cooling-maps { - audio_cdev { - cooling-device = <&wsa_macro 1 1>; - }; - }; - }; -}; - -&wsa_spkr_en2 { - status = "disabled"; -}; -&fsa4480 { - status = "disabled"; -}; -&wsa881x_0211 { - status = "disabled"; -}; -&wsa881x_0212 { - status = "disabled"; -}; -&wsa881x_0214 { - status = "disabled"; -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-battery-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-battery-common.dtsi deleted file mode 100755 index 0f1297306a07..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-battery-common.dtsi +++ /dev/null @@ -1,232 +0,0 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&mtp_batterydata { - /delete-node/ qcom,alium_860_89032_0000_3600mAh; - /delete-node/ qcom,mlp356477_2800mah; - #include "sm6150-sec-qg-batterydata-a70q.dtsi" -}; - -&pm6150_qg { - qcom,vbatt-cutoff-mv = <3400>; /* SOC 0% */ - qcom,qg-iterm-ma = <450>; /* SOC 100% */ -}; - -&pm6150_charger { - /delete-property/ qcom,sec-charger-config; - qcom,sec-charger-config = <1>; - qcom,chg-term-src = <1>; /* 0 : ITERM_SRC_UNSPECIFIED, 1 : ITERM_SRC_ADC, 2 : ITERM_SRC_ANALOG */ - qcom,chg-term-current-ma = <(-250)>; - qcom,fcc-max-ua = <3950000>; - qcom,usb-icl-ua = <2800000>; - qcom,sw-jeita-enable; - qcom,float-option = <2>; - qcom,otg-cl-ua = <1500000>; - qcom,hard-jeita-enable; - qcom,wdog-snarl-based-step-chg; - qcom,auto-recharge-soc = <(-22)>; - qcom,auto-recharge-vbat-mv = <4280>; - - qcom,jeita_cold_trigger = <0x57F0>; /* 0 degree */ - qcom,jeita_cold_release = <0x55AE>; /* 2 degree */ - qcom,jeita_hot_trigger = <0x1C52>; /* 50 degree */ - qcom,jeita_hot_release = <0x1E14>; /* 48 degree */ - - rid-gnd-gpio = <&pm6150l_gpios 9 GPIO_ACTIVE_LOW>; -}; - -&smb1390_charger { - qcom,min-ilim-ua = <750000>; - qcom,max-cutoff-soc = <85>; -}; - -&soc { - battery { - status = "okay"; - compatible = "samsung,sec-battery"; - battery,store_mode_polling_time = <30>; - battery,gpio_vbat_sense = <&pm6150l_gpios 12 GPIO_ACTIVE_LOW>; - battery,gpio_sub_pcb_detect = <&pm6150_gpios 8 GPIO_ACTIVE_LOW>; - battery,full_check_current_1st = <450>; - battery,use_temp_adc_table; - battery,use_chg_temp_adc_table; - - battery,temp_table_adc = <2114 2451 2853 3305 3896 - 4522 5388 6360 7250 8376 - 9721 11193 12793 14423 16240 - 17893 19736 21066 22512 23710 - 24874 25779 26214>; - battery,temp_table_data = <900 850 800 750 700 - 650 600 550 500 450 - 400 350 300 250 200 - 150 100 50 0 (-50) - (-100) (-150) (-200)>; - - battery,chg_temp_table_adc = <7933 8030 8182 8342 8491 - 8637 8767 8944 9097 9278 - 9431 9589 9752 9915 10071 - 10204 10387 10568 10710 10882 - 11040 11210 11374>; - battery,chg_temp_table_data = <(-200) (-150) (-100) (-50) 0 - 50 100 150 200 250 - 300 350 400 450 500 - 550 600 650 700 750 - 800 850 900>; - - /* mix temp setting value */ - battery,mix_temp_recovery = <390>; - battery,mix_temp_batt_threshold = <420>; - battery,mix_temp_die_threshold = <700>; - - /* chg temp setting value */ - battery,chg_high_temp = <540>; - battery,chg_high_temp_recovery = <520>; - battery,chg_input_limit_current = <1000>; - battery,chg_charging_limit_current = <1250>; - - /* d/c chg temp setting value */ - battery,check_dc_chg_lmit; - battery,dc_chg_high_temp = <560>; - battery,dc_chg_high_temp_recovery = <540>; - battery,dc_chg_input_limit_current = <1200>; - - /* Safety timer parameters */ - battery,standard_curr = <3150000>; //equal to last step of step_chg_ranges - battery,expired_time = <10920>; //182min (requested by HQE euna87.kim) - battery,recharging_expired_time = <5400>; //90mins - battery,safety_timer_polling_time = <30>; - - battery,battery_full_capacity = <4400>; /* battery capacity */ - /* disable Vbat ovp dettection */ - battery,cisd_max_voltage_thr = <5000>; /* batttery ovp dettection voltage */ - battery,cisd_alg_index = <7>; - - battery,siop_input_limit_current = <1200>; - battery,siop_charging_limit_current = <1800>; - battery,siop_hv_input_limit_current = <700>; - battery,siop_hv_charging_limit_current = <1800>; - battery,siop_dc_input_limit_current = <1000>; - battery,siop_dc_charging_limit_current = <2000>; - - battery,ttf_hv_charge_current = <2550>; - battery,ttf_dc25_charge_current = <3140>; - - battery,ttf_capacity = <3850>; - battery,cv_data = < - 1700 840 2340 - 1620 847 2280 - 1576 854 2220 - 1204 861 2160 - 1291 868 2100 - 1465 874 2040 - 1524 881 1980 - 1454 886 1920 - 1398 892 1860 - 1336 898 1800 - 1278 903 1740 - 1226 908 1680 - 1172 913 1620 - 1100 918 1560 - 1071 923 1500 - 1033 927 1440 - 987 931 1380 - 945 936 1320 - 912 940 1260 - 872 943 1200 - 836 947 1140 - 807 951 1080 - 769 954 1020 - 743 957 960 - 719 960 900 - 684 963 840 - 661 966 780 - 633 969 720 - 611 971 660 - 590 974 600 - 566 977 540 - 552 979 480 - 527 981 420 - 512 984 360 - 492 986 300 - 473 988 240 - 458 990 180 - 441 992 120 - 437 994 60 - 435 1000 0 - >; - }; - -/* sec_battery_cable - * 0 UNKNOWN, - * 1 BATTERY, - * 2 UPS, - * 3 MAINS, - * 4 USB, - * 5 USB_DCP, - * 6 USB_CDP, - * 7 USB_ACA, - * 8 USB_TYPE_C, - * 9 USB_PD, - * 10 USB_PD_DRP, - * 11 APPLE_BRICK_ID, - * 12 USB_HVDCP, - * 13 USB_HVDCP_3, - * 14 WIRELESS, - * 15 USB_FLOAT, - * 16 BMS, - * 17 PARALLEL, - * 18 MAIN, - * 19 WIPOWER, - * 20 UFP, - * 21 DFP, - * 22 CHARGE_PUMP, - * 23 POWER_SHARING, - * 24 OTG, - * 25 AFC, - * 26 CABLE_MAX, -*/ - cable-info { - default_input_current = <1800>; - default_charging_current = <2100>; - - current_group_1 { - cable_number = <12 25>; - input_current = <1650>; - charging_current = <3150>; - }; - current_group_2 { - cable_number = <4 8 15>; - input_current = <500>; - charging_current = <700>; - }; - current_group_3 { - cable_number = <9 13>; - input_current = <2800>; - charging_current = <3950>; - }; - current_group_4 { - cable_number = <6 7>; - input_current = <1500>; - charging_current = <1500>; - }; - current_group_5 { - cable_number = <23 24>; - input_current = <500>; - charging_current = <500>; - }; - current_group_6 { - cable_number = <14>; - input_current = <900>; - charging_current = <2850>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-nfc-r00.dtsi deleted file mode 100755 index 8c7c08fbc021..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-nfc-r00.dtsi +++ /dev/null @@ -1,109 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi1 = &qupv3_se6_spi; - }; -}; -*/ - -&tlmm { - ese_qupv3_se6_spi_sleep: ese_qupv3_se6_spi_sleep { - mux { - pins = "gpio6", "gpio7", "gpio8", - "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio6", "gpio7", "gpio8", - "gpio9"; - drive-strength = <6>; - bias-pull-down; /* pull down */ - output-low; - }; - }; - - nfc_qupv3_se5_i2c_sleep: nfc_qupv3_se5_i2c_sleep { - mux { - pins = "gpio14", "gpio15"; - function = "gpio"; - }; - - config { - pins = "gpio14", "gpio15"; - drive-strength = <2>; - bias-disable; - }; - }; - - nfc_pvdd_gpio: nfc_pvdd_gpio { - mux { - pins = "gpio23"; - function = "gpio"; - }; - - config { - pins = "gpio23"; - drive-strength = <2>; - bias-disable; - }; - }; -}; - -&pm6150l_gpios { - nfc_det_gpio: nfc_det_gpio { - pins = "gpio1"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; - -/* gpio14 and gpio15 are used for nfc i2c */ -&qupv3_se5_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se5_i2c_sleep>; - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <86 0>; - pn547,irq-gpio = <&tlmm 86 0>; - pn547,ven-gpio = <&tlmm 84 0>; - pn547,firm-gpio = <&tlmm 85 0>; - pn547,clk_req-gpio = <&tlmm 50 0>; /* BBCLK3 is controled by gpio 50 */ - pn547,pwr_req = <&tlmm 87 0>; - pn547,pvdd-gpio = <&tlmm 23 0>; - pn547,clk_req_wake; - pinctrl-names = "default"; - pinctrl-0 = <&nfc_pvdd_gpio &nfc_det_gpio>; - }; -}; - -/* gpio 6~9 are used for ese spi */ -&qupv3_se6_spi { - status = "okay"; - spi-max-frequency = <19200000>; - pinctrl-1 = <&ese_qupv3_se6_spi_sleep>; - - ese_spi@0 { - compatible = "p61"; - reg = <0>; - spi-max-frequency = <16000000>; - p61-ap_vendor = "qualcomm"; - ese-det-gpio = <&pm6150l_gpios 1 0>; - p61-spi_node = <&qupv3_se6_spi>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-overlay-r00.dts deleted file mode 100755 index 7725921ef42a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-overlay-r00.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70s-pm-common.dtsi" - -#include "sm6150-sec-a70s-chn-r00.dtsi" -#include "sm6150-sec-a70s-chn-pinctrl-r00.dtsi" -#include "sm6150-sec-a70s-battery-common.dtsi" -#include "sm6150-sec-a70s-chn-nfc-r00.dtsi" -#include "sm6150-sec-a70s-eif-r00.dtsi" -#include "sm6150-sec-a70s-display-r01.dtsi" -#include "sm6150-sec-a70s-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70s-eur-r02.dtsi" -/ { - model = "Samsung A70S CHN PROJECT Rev0.0 (board-id,0)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-pinctrl-r00.dtsi deleted file mode 100755 index fcf952d00c9a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-pinctrl-r00.dtsi +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70s-pinctrl-common.dtsi" - -&pm6150_gpios { - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-r00.dtsi deleted file mode 100755 index 0235062b04a3..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-chn-r00.dtsi +++ /dev/null @@ -1,127 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70s-common.dtsi" -#include "sm6150-sec-a70s-input-common.dtsi" - -&wcd937x_codec { - imp-table = <&imp_list 0 5 6>, - <&imp_list 6 23 5>, - <&imp_list 24 38 7>, - <&imp_list 39 100 6>, - <&imp_list 101 160 2>, - <&imp_list 161 400 7>, - <&imp_list 401 2000 7>, - <&imp_list 2001 0x7fffffff 6>; -}; - -&pm6150_charger { - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - - water-det-enable; - #sub-short-detect-enable; -}; - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -/delete-node/ &i2c_22; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-common.dtsi deleted file mode 100755 index 6266eecf246d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-common.dtsi +++ /dev/null @@ -1,161 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "sm6150-sec-a70s-audio.dtsi" -#include "sm6150-sec-a70s-mst-r00.dtsi" - -&sdhc_2 { - cd-gpios = <&tlmm 99 0x0>; - sec,tflash-en-gpio = <&tlmm 121 0x0>; /* T_Flash EN - GPIO121 */ -}; - -&soc { - pm6150l_rid_adc { - status = "okay"; - compatible = "pm6150l_rid_adc"; - - interrupt-parent = <&spmi_bus>; - pm6150l_rid_adc,irq-gpio = <&pm6150l_gpios 9 GPIO_ACTIVE_LOW>; - jigon-gpios = <&pm6150l_gpios 11 GPIO_ACTIVE_LOW>; - - pinctrl-names = "default"; - pinctrl-0 = <&rid_adc_irq_default &gpio11_dig_out_default>; - - io-channels = <&pm6150l_vadc ADC_GPIO4>; - io-channel-names = "rid_adc_channel"; - }; - - sec_detect_conn { - compatible = "samsung,sec_detect_conn"; - sec,det_conn_gpios = <&tlmm 103 0>; /* UB_CON_DETECT */ - sec,det_conn_name = "UB_CONNECT"; - sec,det_conn_irq_type = <3>; /*UB_CON_DETECT FALLING, RIGING EDGE*/ - - sec,det_pm_conn_gpios = <&pm6150_gpios 8 0>; /* UB_CONNECT */ - sec,det_pm_conn_name = "SUB_CONNECT"; - - pinctrl-names = "det_ap_connect", "det_pm_connect"; - pinctrl-0 = <&detect_conn_setting>; - pinctrl-1 = <&detect_conn_pm_setting>; - }; - - sec_abc { - compatible = "samsung,sec_abc"; - status = "okay"; - - gpu { - gpu,label="GPU fault"; - gpu,threshold_count=<20>; - gpu,threshold_time=<1200>; - }; - - aicl { - aicl,label="battery aicl"; - aicl,threshold_count=<5>; - aicl,threshold_time=<300>; - }; - }; - - abc_hub { - compatible = "samsung,abc_hub"; - status = "okay"; - - pinctrl-names = "det_ap_connect", "det_pm_connect"; - pinctrl-0 = <&detect_conn_setting>; - pinctrl-1 = <&detect_conn_pm_setting>; - - bootc { - bootc,time_spec_user = <100000>; /* user binary user build */ - bootc,time_spec_eng = <100000>; /* user binary eng build */ - bootc,time_spec_fac = <100000>; /* factory binary */ - }; - - cond { - sec,det_conn_gpios = <&tlmm 103 0>; /* UB_CON_DETECT */ - sec,det_conn_name = "ub"; - sec,det_pm_conn_gpios = <&pm6150_gpios 8 0>; /* SUB_CONNECT */ - sec,det_pm_conn_name = "sub"; - }; - }; - - hall { - status = "okay"; - compatible = "hall"; - linux,input-type = <1>; - linux,code = <21>; - hall,gpio_flip_cover = <&pm6150_gpios 10 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&hall_default>; - }; - - qupv3_se4_afc: afc@a80000 { - compatible = "pm6150_afc"; - reg = <0xa80000 0x4000>; - interrupts = ; - #address-cells = <1>; - #size-cells = <0>; - clock-names = "se-clk", "m-ahb", "s-ahb"; - clocks = <&clock_gcc GCC_QUPV3_WRAP1_S0_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_M_AHB_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_S_AHB_CLK>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&qupv3_se4_afc_active &gpio1_afc_switch_default>; - pinctrl-1 = <&qupv3_se4_afc_sleep>; - qcom,wrapper-core = <&qupv3_1>; - afc-gpios = <&pm6150_gpios 1 GPIO_ACTIVE_LOW>; - status = "ok"; - }; - - /* Sensor */ - qcom,lpass@62400000 { - sensor_vdd-supply = <&pm6150l_l8>; - qcom,sensor_vdd-uV-uA = <1800000 0>; - qcom,active-reg-names = "sensor_vdd"; - }; - - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = < &tlmm 115 0 /* sda */ - &tlmm 116 0 /* scl */ - >; - pinctrl-names = "default","on_i2c","off_i2c"; - pinctrl-0 = <&grip_i2c>; - pinctrl-1 = <&grip_i2c>; - pinctrl-2 = <&grip_gpio>; - - a96t3x6@20 { - compatible = "a96t3x6"; - pinctrl-names = "default"; - reg = <0x20>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - a96t3x6,irq_gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_HIGH>; - a96t3x6,ldo_en = <&tlmm 122 0>; - a96t3x6,fw_path = "abov/a96t346_a70q_eur.bin"; - a96t3x6,firmup_cmd = <0x38>; - a96t3x6,earjack_noise = <1>; - }; - }; - ssc_core { - status = "okay"; - compatible = "ssc_core"; - ssc_core,nfc_gpio = <&pm6150l_gpios 1 GPIO_ACTIVE_HIGH>; - ssc_core,mst_gpio = <&pm6150l_gpios 2 GPIO_ACTIVE_HIGH>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-display-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-display-r01.dtsi deleted file mode 100755 index 21733425224d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-display-r01.dtsi +++ /dev/null @@ -1,167 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -//#include "../../../../../drivers/gpu/drm/msm/samsung/SELF_DISPLAY/self_display_cmd_FA7_AMS628RF05.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/S6E3FC2_AMS670TA01/dsi_panel_S6E3FC2_AMS670TA01_fhd_octa_cmd.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/S6E3FC2_AMS670TA01/dsi_panel_S6E3FC2_AMS670TA01_fhd_octa_cmd_A70.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - - -&pm6150_gpios { - sde_dsi_enable_active: sde_dsi_enable_active { - pins = "gpio6"; - function = "normal"; - power-source = <0>; - }; - - sde_dsi_enable_suspend: sde_dsi_enable_suspend { - pins = "gpio6"; - function = "normal"; - power-source = <0>; - output-low; - }; -}; - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { /*reset gpio*/ - mux { - pins = "gpio91"; - function = "gpio"; - }; - - config { - pins = "gpio91"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio91"; - function = "gpio"; - }; - - config { - pins = "gpio91"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_esd_active: sde_esd_active { /*EL_ON1_DET gpio*/ - mux { - pins = "gpio97"; - function = "gpio"; - }; - - config { - pins = "gpio97"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_esd_suspend: sde_esd_suspend { - mux { - pins = "gpio97"; - function = "gpio"; - }; - - config { - pins = "gpio97"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - - sde_dsi2_active: sde_dsi2_active { /*OCTA_CON_DET gpio*/ - mux { - pins = "gpio103"; - function = "gpio"; - }; - - config { - pins = "gpio103"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi2_suspend: sde_dsi2_suspend { - mux { - pins = "gpio103"; - function = "gpio"; - }; - - config { - pins = "gpio103"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - }; -}; - -&soc { - /* A70 panel */ - ss_dsi_panel_S6E3FC2_AMS670TA01_FHD_display: qcom,dsi-display@5 { - label = "ss_dsi_panel_S6E3FC2_AMS670TA01_FHD"; - qcom,display-type = "primary"; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@6 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - }; -}; - -&sde_dsi { - qcom,dsi-display-list = - <&ss_dsi_panel_S6E3FC2_AMS670TA01_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_dsi_enable_active &sde_dsi_active &sde_te_active &sde_esd_active &sde_dsi2_active>; - pinctrl-1 = <&sde_dsi_enable_suspend &sde_dsi_suspend &sde_te_suspend &sde_esd_suspend &sde_dsi2_suspend>; -}; - -&ss_dsi_panel_S6E3FC2_AMS670TA01_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_S6E3FC2_AMS670TA01_FHD>; - - qcom,platform-en-gpio = <&pm6150_gpios 6 0>; - qcom,platform-reset-gpio = <&tlmm 91 0>; - qcom,platform-te-gpio = <&tlmm 90 0>; - samsung,esd-irq-gpio1 = <&tlmm 97 0>; - samsung,support-optical-fingerprint; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-en-gpio = <&pm6150_gpios 6 0>; - qcom,platform-reset-gpio = <&tlmm 91 0>; - qcom,platform-te-gpio = <&tlmm 90 0>; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-eif-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-eif-r00.dtsi deleted file mode 100755 index 943e63ff41f6..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-eif-r00.dtsi +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - usb_noti: usb-notifier { - compatible = "samsung,usb-notifier"; - qcom,disable_control_en = <1>; - qcom,unsupport_host_en = <0>; - }; - - samsung,vibrator { - compatible = "samsung_vib"; -// samsung,vib_pwm = <&tlmm 136 0>; -// samsung,vib_power = <&pm8150_gpios 10 0>; -// samsung,gp_clk = <0x00164000>; // Address of GP1 clock - samsung,chip_model = <4>; // using max77705 driver - samsung,vib_type = "COINDC"; - status = "ok"; - - pinctrl-names = "tlmm_pwm_default"; - pinctrl-0 = <&pwm_out_gpio6_default>; - pwms = <&pm6150l_pwm 0 1000000>; - - }; - - samsung,usbpd { - compatible = "samsung,usb-pd"; - qcom,samsung-usbpd-detection = <&pm6150_pdphy>; - }; -}; - -&usb0 { - dwc3@a600000 { - usb-phy = <&qusb_phy0>, <&usb_nop_phy>; - maximum-speed = "high-speed"; - }; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = <0x40 0x80 - 0x73 0x84 - 0x81 0x88 - 0xc5 0x8c - 0x30 0x08 - 0x79 0x0c - 0x21 0x10 - 0x14 0x9c - 0x9f 0x1c - 0x00 0x18>; - qcom,qusb-phy-host-init-seq = <0xf8 0x80 - 0xb3 0x84 - 0x83 0x88 - 0xc0 0x8c - 0x30 0x08 - 0x79 0x0c - 0x21 0x10 - 0x14 0x9c - 0x9f 0x1c - 0x00 0x18>; - /* ex) efuse(0xC) + (-5) = 0x7 for tune2 high value */ - qcom,diff_tune2_device = <(-5)>; - qcom,diff_tune2_host = <(0)>; -}; - -&usb_qmp_phy { - status = "disabled"; -}; - -&pm6150l_gpios { - pwm_out_gpio6 { - pwm_out_gpio6_default: pwm_out_gpio6_default { - pins = "gpio6"; - function = "func1"; - bias-disable; - power-source = <0>; - output-low; - qcom,drive-strength = <3>; - drive-push-pull; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-fingerprint_02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-fingerprint_02.dtsi deleted file mode 100755 index afb57ea21aaa..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-fingerprint_02.dtsi +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - etspi_ldopin { - etspi_ldopin: etspi_ldopin { - mux { - pins = "gpio42"; - function = "gpio"; - }; - config { - pins = "gpio42"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; - - etspi_rstpin { - etspi_rstpin: etspi_rstpin { - mux { - pins = "gpio94"; - function = "gpio"; - }; - config { - pins = "gpio94"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; -}; - -&qupv3_se2_spi { - status = "okay"; - - etspi-spi@0 { - compatible = "etspi,et7xx"; - reg = <0>; - spi-max-frequency = <50000000>; - pinctrl-names = "default"; - pinctrl-0 = <&etspi_ldopin &etspi_rstpin>; - - gpio-controller; - #gpio-cells = <2>; - - etspi-sleepPin = <&tlmm 94 0>; - etspi-ldoPin = <&tlmm 42 0>; - etspi-chipid = "ET713"; - etspi-modelinfo = "A705"; - etspi-position = "13.96,0.00,7.30,7.30,14.80,14.80,12.00,12.00,5.00"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-input-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-input-common.dtsi deleted file mode 100755 index 1697ecb436d7..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-input-common.dtsi +++ /dev/null @@ -1,98 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&pm6150_l18 { - regulator-min-microvolt = <3000000>; - regulator-max-microvolt = <3000000>; - regulator-boot-on; -}; - -&tlmm { - tsp_int: tsp_int { - mux { - pins = "gpio89"; - function = "gpio"; - }; - - config { - pins = "gpio89"; - input-enable; - bias-disable; - }; - }; -}; - -&qupv3_se1_i2c { - status = "ok"; - - touchscreen@50 { - status = "ok"; - compatible = "imagis,ist40xx-ts"; - reg = <0x50>; - pinctrl-names = "default"; - pinctrl-0 = <&tsp_int>; - imagis,irq-gpio = <&tlmm 89 0>; - imagis,regulator_avdd = "pm6150_l18"; - imagis,x_resolution = <1080>; - imagis,y_resolution = <2400>; - imagis,ic-version = "ist40xx"; - imagis,project-name = "a70"; - imagis,fw-bin = <1>; - imagis,octa-hw = <1>; - imagis,tclm_level = <2>; - imagis,afe_base = <0x0303>; - imagis,factory_item_version = <1>; - imagis,cm_spec = <300 2200 43>; /* min, max, gap */ - enable_settings_aot; - support_fod; - }; -}; - -/delete-node/&key_vol_up_default; -&pm6150l_gpios { - key_vol_up { - key_vol_up_default: key_vol_up_default { - pins = "gpio8"; - function = "normal"; - input-enable; - bias-pull-up; - power-source = <0>; - }; - }; -}; - -&soc { - /delete-node/gpio_keys; - gpio_keys { - status = "ok"; - compatible = "gpio-keys"; - input-name = "gpio-keys"; - - pinctrl-names = "default"; - pinctrl-0 = <&key_vol_up_default>; - - vol_up { - label = "volume_up"; - gpios = <&pm6150l_gpios 8 0x1>; - linux,input-type = <1>; - linux,code = ; - debounce-interval = <15>; - }; - }; - - ss_touch { - compatible = "samsung,ss_touch"; - ss_touch,numbers = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-mst-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-mst-r00.dtsi deleted file mode 100755 index ebbccdb20968..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-mst-r00.dtsi +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2013, Samsung Electronics Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - sec-mst { - compatible = "sec-mst"; - sec-mst,mst-pwr-gpio = <&tlmm 36 0>; - sec-mst,mst-data-gpio = <&tlmm 37 0>; - sec-mst,mst-en-gpio = <&tlmm 38 0>; - sec-mst,mst-support-gpio = <&pm6150l_gpios 2 0>; - - //pinctrl-names = "mst_active"; - //pinctrl-0 = <&mst_data_init &mst_en_init>; - }; -/* - tlmm: pinctrl@03000000 { - mst_data_init: mst_data_init { - mux { - pins = "gpio84"; - function = "gpio"; - }; - config { - pins = "gpio84"; - drive-strength = <16>; - bias-pull-down; - output_low; - }; - }; - mst_en_init: mst_en_init { - mux { - pins = "gpio83"; - function = "gpio"; - }; - config { - pins = "gpio83"; - drive-strength = <16>; - bias-pull-down; - output_low; - }; - }; - }; -*/ -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-pinctrl-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-pinctrl-common.dtsi deleted file mode 100755 index e64c8d27ac35..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-pinctrl-common.dtsi +++ /dev/null @@ -1,497 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70s-audio-pinctrl.dtsi" - -&tlmm { - - sdc2_cd_on: cd_on { - mux { - pins = "gpio99"; - function = "gpio"; - }; - config { - pins = "gpio99"; - drive-strength = <2>; - bias-disable; - }; - }; - - i2c17 { - grip_i2c: grip-i2c { - mux { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - bias-disable; - }; - }; - - grip_gpio: grip-gpio { - mux { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - bias-disable; - }; - }; - }; - - grip_ldo_en { - grip_en: grip-en { - mux { - pins = "gpio122"; - function = "gpio"; - }; - - config { - pins = "gpio122"; - bias-disable; /* NO pull */ - drive-strength = <2>; /* 2 MA */ - output-enable; - output-low; - }; - }; - }; - - i2c18 { - grip_sub_i2c: grip-sub-i2c { - mux { - pins = "gpio25", /* GRIP_SENSOR_SDA_1P8 */ - "gpio26"; /* GRIP_SENSOR_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio25", /* GRIP_SENSOR_SDA_1P8 */ - "gpio26"; /* GRIP_SENSOR_SCL_1P8 */ - bias-disable; - }; - }; - }; - - sdc2_clk_on: sdc2_clk_on { - config { - pins = "sdc2_clk"; - bias-disable; /* NO pull */ - drive-strength = <8>; /* 8 MA */ - }; - }; - - sdc2_cmd_on: sdc2_cmd_on { - config { - pins = "sdc2_cmd"; - bias-pull-up; /* pull up */ - drive-strength = <8>; /* 8 MA */ - }; - }; - - sdc2_data_on: sdc2_data_on { - config { - pins = "sdc2_data"; - bias-pull-up; /* pull up */ - drive-strength = <8>; /* 8 MA */ - }; - }; - - cam_sensor_mclk_0_active: cam_sensor_mclk_0_active { - /* REAR MCLK */ - mux { - pins = "gpio28"; - function = "cam_mclk"; - }; - config { - pins = "gpio28"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk_0_suspend: cam_sensor_mclk_0_suspend { - /* REAR MCLK */ - mux { - pins = "gpio28"; - function = "cam_mclk"; - }; - config { - pins = "gpio28"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_rear_active: cam_sensor_rear_active { - /* REAR RESET */ - mux { - pins = "gpio47"; - function = "gpio"; - }; - config { - pins = "gpio47"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_rear_suspend: cam_sensor_rear_suspend { - /* REAR RESET */ - mux { - pins = "gpio47"; - function = "gpio"; - }; - config { - pins = "gpio47"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_mclk_1_active: cam_sensor_mclk_1_active { - /* FRONT MCLK */ - mux { - pins = "gpio29"; - function = "cam_mclk"; - }; - config { - pins = "gpio29"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk_1_suspend: cam_sensor_mclk_1_suspend { - /* FRONT MCLK */ - mux { - pins = "gpio29"; - function = "cam_mclk"; - }; - config { - pins = "gpio29"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_front_active: cam_sensor_front_active { - /* FRONT RESET */ - mux { - pins = "gpio45"; - function = "gpio"; - }; - config { - pins = "gpio45"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_front_suspend: cam_sensor_front_suspend { - /* FRONT RESET */ - mux { - pins = "gpio45"; - function = "gpio"; - }; - config { - pins = "gpio45"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_mclk_2_active: cam_sensor_mclk_2_active { - /* REAR2 MCLK */ - mux { - pins = "gpio30"; - function = "cam_mclk"; - }; - config { - pins = "gpio30"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_mclk_2_suspend: cam_sensor_mclk_2_suspend { - /* REAR2 MCLK */ - mux { - pins = "gpio30"; - function = "cam_mclk"; - }; - config { - pins = "gpio30"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_rear2_active: cam_sensor_rear2_active { - /* REAR2 RESET */ - mux { - pins = "gpio46"; - function = "gpio"; - }; - config { - pins = "gpio46"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_rear2_suspend: cam_sensor_rear2_suspend { - /* REAR2 RESET */ - mux { - pins = "gpio46"; - function = "gpio"; - }; - config { - pins = "gpio46"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_mclk_3_active: cam_sensor_mclk_3_active { - /* REAR SW-8M */ - mux { - pins = "gpio31"; - function = "cam_mclk"; - }; - config { - pins = "gpio31"; - bias-disable; /* No PULL */ - drive-strength = <4>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_mclk_3_suspend: cam_sensor_mclk_3_suspend { - /* REAR SW-8M */ - mux { - pins = "gpio31"; - function = "cam_mclk"; - }; - config { - pins = "gpio31"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <4>; /* 2 MA */ - output-low; - }; - }; - - - cam_sensor_rear3sw_active: cam_sensor_rear3sw_active { - /* REAR SUB2 RESET*/ - mux { - pins = "gpio100"; - function = "gpio"; - }; - config { - pins = "gpio100"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear3sw_suspend: cam_sensor_rear3sw_suspend { - /* REAR SUB2 RESET */ - mux { - pins = "gpio100"; - function = "gpio"; - }; - config { - pins = "gpio100"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_rear3_pwr_active: cam_rear3_pwr_active { - /* REAR SUB2 RESET*/ - mux { - pins = "gpio95"; - function = "gpio"; - }; - config { - pins = "gpio95"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_rear3_pwr_suspend: cam_rear3_pwr_suspend { - /* REAR SUB2 RESET */ - mux { - pins = "gpio95"; - function = "gpio"; - }; - config { - pins = "gpio95"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - - cam_eeprom_i2c_default: cam_eeprom_i2c_default { - /* I2C SDA SCL */ - mux { - pins = "gpio18", "gpio19"; - function = "gpio"; - }; - config{ - pins = "gpio18", "gpio19"; - bias-pull-down; - drive-strength = <2>; - output-low; - }; - }; - - cam_eeprom_i2c_sleep: cam_eeprom_i2c_sleep { - /* I2C SDA SCL */ - mux { - pins = "gpio18", "gpio19"; - function = "gpio"; - }; - config { - pins = "gpio18", "gpio19"; - bias-pull-down; - drive-strength = <2>; - output-low; - }; - }; - - cam_sensor_mipi_sw_active: cam_sensor_mipi_sw_active { - /* MIPI_SWITCH */ - mux { - pins = "gpio49"; - function = "gpio"; - }; - config { - pins = "gpio49"; - bias-pull-down; /* PULL DOWN */ - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_mipi_sw_suspend: cam_sensor_mipi_sw_suspend { - /* MIPI_SWITCH */ - mux { - pins = "gpio49"; - function = "gpio"; - }; - config { - pins = "gpio49"; - bias-pull-down; /* PULL DOWN */ - output-low; - drive-strength = <2>; /* 2 MA */ - }; - }; - - led_enable: led_enable { - mux { - pins = "gpio39"; - function = "gpio"; - }; - - config { - pins = "gpio39"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - led_disable: led_disable { - mux { - pins = "gpio39"; - function = "gpio"; - }; - - config { - pins = "gpio39"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - detect_conn { - detect_conn_setting: detect_conn_setting { - config { - pins = "gpio103";/* UB_CONNECT */ - drive-strength = <2>; - bias-disable; /* No PULL */ - input-enable; - }; - }; - }; -}; - -&lpi_tlmm { - gpio-reserved-ranges = <0 8>, <12 6>, <25 5>; -}; - -&pm6150_gpios { - hall { - hall_default: hall_default { - pins = "gpio10"; - function = "normal"; - output-disable; - input-enable; - bias-disable; - power-source = <0>; - }; - }; - detect_conn_pm_setting: detect_conn_pm_setting { - pins = "gpio8"; /* SUB_DET */ - bias-disable; /* NO PULL */ - input-enable; - }; -}; - -&pm6150l_gpios { - grip_irq: grip-irq { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_input: grip-input { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-pm-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-pm-common.dtsi deleted file mode 100755 index b6c1bde20d6c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-pm-common.dtsi +++ /dev/null @@ -1,238 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include - -&soc { - /* AP Thermistor table */ - sec_thermistor@0 { - compatible = "samsung,sec-ap-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "ap_therm"; - adc_array = <1881 2208 2628 3081 3665 4223 5091 6100 6971 8092 9435 - 10870 12425 14088 15876 17588 19413 20626 - 22139 - 23387 24546 25490 26016>; - temp_array = <900 850 800 750 700 650 600 550 500 450 400 - 350 300 250 200 150 100 50 - 0 - (-50) (-100) (-150) (-200)>; - }; - - /* PA Thermistor table */ - sec_thermistor@1 { - compatible = "samsung,sec-pa-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "pa_therm"; - adc_array = <2000 2335 2752 3207 3780 4373 5245 6227 7143 8277 9627 - 11047 12666 14287 16130 17811 19629 20891 - 22382 - 23605 24725 25638 26189>; - temp_array = <900 850 800 750 700 650 600 550 500 450 400 - 350 300 250 200 150 100 50 - 0 - (-50) (-100) (-150) (-200)>; - }; - - /* WiFi Thermistor table */ - sec_thermistor@2 { - compatible = "samsung,sec-wf-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - io-channel-names = "wf_therm"; - adc_array = <1957 2298 2714 3157 3732 4327 5195 6178 7091 8215 9553 - 11000 12575 14194 16036 17727 19530 20828 - 22308 - 23540 24672 25597 26163>; - temp_array = <900 850 800 750 700 650 600 550 500 450 400 - 350 300 250 200 150 100 50 - 0 - (-50) (-100) (-150) (-200)>; - }; - - i2c_22: i2c@22 { - /* S2DOS03 Display PMIC */ - status = "ok"; - - cell-index = <22>; - compatible = "i2c-gpio"; - gpios = <&tlmm 108 0 /* OCTA_PMIC_SDA_1P8 */ - &tlmm 109 0 /* OCTA_PMIC_SCL_1P8 */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&i2c_22_pinctrl>; - - s2dos03@60 { - compatible = "slsi,s2dos03"; - reg = <0x60>; - - buck-ramp-up = <0>; /* 6.25mV/us */ - buck-fpwm = <0>; /* Disable */ - - uvlo-fall-threshold = <0>; /* 2.30V */ - - regulators { - s2dos03_l1: s2dos03-ldo1 { - regulator-name = "s2dos03-ldo1"; - regulator-min-microvolt = <600000>; - regulator-max-microvolt = <3775000>; - active-discharge-enable = <1>; - }; - - s2dos03_l2: s2dos03-ldo2 { - regulator-name = "s2dos03-ldo2"; - regulator-min-microvolt = <600000>; - regulator-max-microvolt = <3775000>; - active-discharge-enable = <1>; - }; - - s2dos03_l3: s2dos03-ldo3 { - regulator-name = "s2dos03-ldo3"; - regulator-min-microvolt = <600000>; - regulator-max-microvolt = <3775000>; - active-discharge-enable = <1>; - }; - - s2dos03_l4: s2dos03-ldo4 { - regulator-name = "s2dos03-ldo4"; - regulator-min-microvolt = <600000>; - regulator-max-microvolt = <3775000>; - active-discharge-enable = <1>; - }; - - s2dos03_buck: s2dos03-buck { - regulator-name = "s2dos03-buck"; - regulator-min-microvolt = <500000>; - regulator-max-microvolt = <2093750>; - regulator-boot-on; /* from DREAMQ */ - active-discharge-enable = <1>; - }; - }; - }; - }; -}; - -&spmi_bus { - qcom,pm6150@0{ - qcom,power-on@800 { - interrupts = <0x0 0x8 0x0 IRQ_TYPE_NONE>, - <0x0 0x8 0x1 IRQ_TYPE_NONE>, - <0x0 0x8 0x4 IRQ_TYPE_NONE>, - <0x0 0x8 0x5 IRQ_TYPE_NONE>; - interrupt-names = "kpdpwr", "resin", - "resin-bark", "kpdpwr-resin-bark"; - qcom,store-hard-reset-reason; - qcom,s3-debounce = <128>; - - qcom,pon_1 { - qcom,support-reset = <0>; - }; - - qcom,pon_2 { - qcom,support-reset = <0>; - }; - - qcom,pon_3 { - qcom,pon-type = ; - qcom,support-reset = <1>; - qcom,pull-up = <1>; - qcom,s1-timer = <6720>; - qcom,s2-timer = <1000>; - qcom,s2-type = ; - qcom,use-bark; - }; - }; - }; - - qcom,pm6150l@5 { - flash_led: qcom,leds@d300 { - pm6150l_flash0: qcom,flash_0 { - label = "flash"; - qcom,led-name = "led:flash_0"; - qcom,max-current = <1500>; - qcom,default-led-trigger = "flash0_trigger"; - qcom,id = <0>; - qcom,current-ma = <1200>; - qcom,duration-ms = <1280>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - qcom,record-current-ma = <200>; - }; - pm6150l_torch0: qcom,torch_0 { - label = "torch"; - qcom,led-name = "led:torch_0"; - qcom,max-current = <500>; - qcom,default-led-trigger = "torch0_trigger"; - qcom,id = <0>; - qcom,current-ma = <300>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - }; - }; - }; -}; -&pm6150_gpios { - interrupts = <0x0 0xc0 0 IRQ_TYPE_NONE>, - <0x0 0xc1 0 IRQ_TYPE_NONE>, - <0x0 0xc2 0 IRQ_TYPE_NONE>, - <0x0 0xc3 0 IRQ_TYPE_NONE>, - <0x0 0xc5 0 IRQ_TYPE_NONE>, - <0x0 0xc6 0 IRQ_TYPE_NONE>, - <0x0 0xc7 0 IRQ_TYPE_NONE>, - <0x0 0xc9 0 IRQ_TYPE_NONE>; - interrupt-names = "pm6150_gpio1", "pm6150_gpio2", - "pm6150_gpio3", "pm6150_gpio4", "pm6150_gpio6", - "pm6150_gpio7", "pm6150_gpio8", - "pm6150_gpio10"; - qcom,gpios-disallowed = <5 9>; -}; - -&pm6150_vadc { - sdm_therm { - reg = ; - label = "ap_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; -}; - -&pm6150l_vadc { - rf_pa0_therm { - reg = ; - label = "pa_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - rf_pa1_therm { - reg = ; - label = "wf_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-nfc-r00.dtsi deleted file mode 100755 index a37a4681389b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-nfc-r00.dtsi +++ /dev/null @@ -1,68 +0,0 @@ - -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi1 = &qupv3_se6_spi; - }; -}; -*/ - -&tlmm { - nfc_qupv3_se5_i2c_sleep: nfc_qupv3_se5_i2c_sleep { - mux { - pins = "gpio14", "gpio15"; - function = "gpio"; - }; - - config { - pins = "gpio14", "gpio15"; - drive-strength = <2>; - bias-disable; - }; - }; - - nfc_pvdd_gpio: nfc_pvdd_gpio { - mux { - pins = "gpio23"; - function = "gpio"; - }; - - config { - pins = "gpio23"; - drive-strength = <2>; - bias-disable; - }; - }; -}; - -/* gpio14 and gpio15 are used for nfc i2c */ -&qupv3_se5_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se5_i2c_sleep>; - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <86 0>; - pn547,irq-gpio = <&tlmm 86 0>; - pn547,ven-gpio = <&tlmm 84 0>; - pn547,firm-gpio = <&tlmm 85 0>; - pn547,clk_req-gpio = <&tlmm 50 0>; /* BBCLK3 is controled by gpio 50 */ - pn547,pwr_req = <&tlmm 87 0>; - pn547,pvdd-gpio = <&tlmm 23 0>; - pn547,clk_req_wake; - pinctrl-names = "default"; - pinctrl-0 = <&nfc_pvdd_gpio>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-overlay-r00.dts deleted file mode 100755 index 0f1e3622dc56..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-overlay-r00.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70s-pm-common.dtsi" - -#include "sm6150-sec-a70s-swa-r00.dtsi" -#include "sm6150-sec-a70s-swa-pinctrl-r00.dtsi" -#include "sm6150-sec-a70s-battery-common.dtsi" -#include "sm6150-sec-a70s-swa-nfc-r00.dtsi" -#include "sm6150-sec-a70s-eif-r00.dtsi" -#include "sm6150-sec-a70s-display-r01.dtsi" -#include "sm6150-sec-a70s-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70s-eur-r02.dtsi" -/ { - model = "Samsung A70S PROJECT Rev0.0 (board-id,0)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-overlay-r01.dts deleted file mode 100755 index fa5250487d26..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-overlay-r01.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-a70s-pm-common.dtsi" - -#include "sm6150-sec-a70s-swa-r01.dtsi" -#include "sm6150-sec-a70s-swa-pinctrl-r01.dtsi" -#include "sm6150-sec-a70s-battery-common.dtsi" -#include "sm6150-sec-a70s-swa-nfc-r00.dtsi" -#include "sm6150-sec-a70s-eif-r00.dtsi" -#include "sm6150-sec-a70s-display-r01.dtsi" -#include "sm6150-sec-a70s-fingerprint_02.dtsi" -#include "sm6150-camera-sensor-a70s-eur-r03.dtsi" -/ { - model = "Samsung A70S PROJECT Rev0.0 (board-id,01)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&tlmm 93 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-pinctrl-r00.dtsi deleted file mode 100755 index fcf952d00c9a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-pinctrl-r00.dtsi +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70s-pinctrl-common.dtsi" - -&pm6150_gpios { - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-pinctrl-r01.dtsi deleted file mode 100755 index 00f1b97f6198..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70s-swa-pinctrl-r00.dtsi" - -&soc { - -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-r00.dtsi deleted file mode 100755 index 286f64f30ad9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-r00.dtsi +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70s-common.dtsi" -#include "sm6150-sec-a70s-input-common.dtsi" - -&pm6150_charger { - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - - water-det-enable; - #sub-short-detect-enable; -}; - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -/delete-node/ &i2c_22; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-r01.dtsi deleted file mode 100755 index 125b966cdb1f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-a70s-swa-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a70s-swa-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-common.dtsi deleted file mode 100755 index 9f8462677c85..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-common.dtsi +++ /dev/null @@ -1,485 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-dcc.dtsi" - -&reserved_memory { - ss_plog@A1100000 { - compatible = "ss_plog"; - no-map; - reg = <0x0 0xA1100000 0x0 0x00200000>; - }; - - ramoops@A1300000 { - compatible = "ramoops"; - reg = <0 0xA1300000 0 0x100000>; - record-size = <0x40000>; - console-size = <0x40000>; - ftrace-size = <0x40000>; - pmsg-size = <0x40000>; - }; - - /* CONFIG_SEC_DEBUG reserves 8MB */ - sec_debug_region: sec_debug_region@0 { - compatible = "removed-dma-pool"; - no-map; - reg = <0x0 0xA1400000 0x0 0x00800000>; - }; - - /* sec_debug_low_region reserves 4MB - This region is reserved if only debuglevel low */ - /* FIXME: - sec_debug_low_region: sec_debug_low_region@0 { - compatible = "removed-dma-pool"; - no-map; - reg = <0x0 0xA1400000 0x0 0x00400000>; - }; - */ - - /* Kaslr offset reserve */ - kaslr_region: kaslr_region@80001000 { - compatible = "removed-dma-pool"; - reg = <0x0 0x80001000 0x0 0x00001000>; - }; - - /* rkp_region reserves 2MB for UH_LOG and UH_STATIC_HEAP */ - /* CAUSION: DO NOT reserve 0xB0200000 ~ 0xB1800000 region for RKP at the runtime */ - rkp_region: rkp_region@B0200000 { - compatible = "removed-dma-pool"; - reg = <0x0 0xB0200000 0x0 0x00200000>; - }; - - /*to reserve 1MB for TIMA */ - tima_mem: tima_region@B0100000 { - compatible = "removed-dma-pool"; - no-map; - reg = <0 0xB0100000 0 0x100000>; - }; - - modem_shared_mem: modem_shared_mem_region@BA000000 { - compatible = "modem-removed-dma-pool"; - no-map; - reg = <0x0 0xba000000 0x0 0x06000000>; - }; -}; - -&qseecom_ta_mem { - size = <0 0x2000000>; -}; - -&removed_region { - reg = <0 0x86200000 0 0x5600000>; -}; - -&pil_camera_mem{ - reg = <0 0x8CB00000 0 0x500000>; -}; - -&pil_modem_mem { - reg = <0 0x8D000000 0 0x8C00000>; -}; - -&pil_video_mem { - reg = <0 0x95C00000 0 0x500000>; -}; - -&wlan_msa_mem { - reg = <0 0x96100000 0 0x200000>; -}; - -&pil_cdsp_mem { - reg = <0 0x96300000 0 0x1E00000>; -}; - -&pil_adsp_mem { - reg = <0 0x98100000 0 0x2800000>; -}; - -&pil_ipa_fw_mem { - reg = <0 0x9A900000 0 0x10000>; -}; - -&pil_ipa_gsi_mem { - reg = <0 0x9A910000 0 0x5000>; -}; - -&pil_gpu_mem { - reg = <0 0x9A915000 0 0x2000>; -}; - -&qseecom_mem { - reg = <0 0x9E400000 0 0x2400000>; -}; - -&cdsp_sec_mem { - reg = <0 0xA4000000 0 0xC00000>; -}; - -&soc{ - input_booster { - status = "okay"; - compatible = "input_booster"; - #address-cells = <1>; - #size-cells = <0>; - - booster_key@1 { - input_booster,label = "KEY"; - input_booster,type = <0>; /* BOOSTER_DEVICE_KEY */ - - input_booster,levels = <1>; - - /* Frequency table */ - /* for level : 1_Head */ - input_booster,cpu_freqs = <1363200>; - input_booster,hmp_boost = <2>; - input_booster,lpm_bias = <0>; - - /* Time table */ - input_booster,head_times = <200>; - input_booster,tail_times = <0>; - }; - booster_key@2 { - input_booster,label = "TOUCHKEY"; - input_booster,type = <1>; /* BOOSTER_DEVICE_TOUCHKEY */ - - input_booster,levels = <1>; - - /* Frequency table */ - /* for level : 1_Head */ - input_booster,cpu_freqs = <1363200>; - input_booster,hmp_boost = <2>; - input_booster,lpm_bias = <0>; - - /* Time table */ - input_booster,head_times = <0>; - input_booster,tail_times = <300>; - }; - booster_key@3 { - input_booster,label = "TOUCH"; - input_booster,type = <2>; /* BOOSTER_DEVICE_TOUCH */ - - input_booster,levels = <1 2 3>; - - /* Frequency table */ - /* for level : 1_Head, 2_Head, 2_Tail */ - input_booster,cpu_freqs = <1363200 1363200 1132800>; - input_booster,hmp_boost = <2 2 2>; - input_booster,lpm_bias = <5 5 5>; - - /* Time table */ - input_booster,head_times = <200 200 0>; - input_booster,tail_times = <0 0 300>; - }; - booster_key@4 { // Input Booster + - input_booster,label = "MULTITOUCH"; - input_booster,type = <3>; /* BOOSTER_DEVICE_MULTITOUCH */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1363200 0>; - input_booster,hmp_boost = <2 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <1000 0>; - input_booster,tail_times = <0 500>; - }; - booster_key@5 { - input_booster,label = "KEYBOARD"; - input_booster,type = <4>; /* BOOSTER_DEVICE_KEYBOARD */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head, 2_Tail */ - input_booster,cpu_freqs = <1363200 1363200>; - input_booster,hmp_boost = <2 2>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <130 130>; - input_booster,tail_times = <0 0>; - }; - booster_key@6 { - input_booster,label = "MOUSE"; - input_booster,type = <5>; /* BOOSTER_DEVICE_MOUSE */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1363200 1132800>; - input_booster,hmp_boost = <2 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <200 0>; - input_booster,tail_times = <0 300>; - }; - booster_key@7 { - input_booster,label = "MOUSE WHEEL"; - input_booster,type = <6>; /* BOOSTER_DEVICE_MOUSE */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1363200 0>; - input_booster,hmp_boost = <2 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <200 0>; - input_booster,tail_times = <0 0>; - }; - booster_key@8 { - input_booster,label = "PEN HOVER"; - input_booster,type = <7>; /* BOOSTER_DEVICE_MOUSE */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1363200 1132800>; - input_booster,hmp_boost = <2 0>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <200 0>; - input_booster,tail_times = <0 300>; - }; - booster_key@9 { - input_booster,label = "PEN"; - input_booster,type = <8>; /* BOOSTER_DEVICE_MOUSE */ - - input_booster,levels = <1 2>; - - /* Frequency table */ - /* for level : 1_Head 2_Tail*/ - input_booster,cpu_freqs = <1574400 960000>; - input_booster,hmp_boost = <2 2>; - input_booster,lpm_bias = <0 0>; - - /* Time table */ - input_booster,head_times = <200 0>; - input_booster,tail_times = <0 600>; - }; // Input Booster - - booster_key@10 { - input_booster,label = "KEY_TWO"; - input_booster,type = <9>; /* BOOSTER_DEVICE_KEY */ - - input_booster,levels = <1>; - - /* Frequency table */ - /* for level : 1_Head */ - input_booster,cpu_freqs = <1574400>; - input_booster,hmp_boost = <2>; - input_booster,lpm_bias = <0>; - - /* Time table */ - input_booster,head_times = <700>; - input_booster,tail_times = <700>; - }; - // Input Booster - - /* If you need to add new key type, add it this position */ - }; - - qcom,glinkpkt { - compatible = "qcom,glinkpkt"; - - qcom,glinkpkt-glinkbridge { - qcom,glinkpkt-edge = "mpss"; - qcom,glinkpkt-ch-name = "glink_bridge"; - qcom,glinkpkt-dev-name = "smd4"; - }; - }; - sec_smem@0 { - compatible = "samsung,sec-smem"; - status = "okay"; - }; - qcom,memshare { - compatible = "qcom,memshare"; - qcom,client_4 { - compatible = "qcom,memshare-peripheral"; - memory-region = <&modem_shared_mem>; - qcom,peripheral-size = <0x02000000>; - qcom,reserved-size = <0x04000000>; - qcom,client-id = <3>; - qcom,allocate-boot-time; - label = "modem"; - }; - }; - - argos { - compatible = "samsung,argos"; - #address-cells = <1>; - /* The device number should be assigned for each device, e.g. "boot_device@1" and "boot_device@2". - * Duplicated number is not allowed. Please refer the below example. - */ - /* Table Format should be - * - * ARM_min : Big Core's minimum frequency lock. 0 means not set, - * ARM_max : Big Core's maximum frequency lock. 0 means not set, - * Little_min : Little Core's minimum frequency lock. 0 means not set, - * Little_max : Little Core's maximum frequency lock. 0 means not set, - * BIMC1 : Memory frequency lock. 0 means not set,(not used now) - * BIMC2 : Memory frequency lock. 0 means not set, (not used now) - * Task : 1 - Set task affinity lock. - * 0 - Not set or unlock, - * Task affinity should be predefined driver's code. - * IRQ : 1 - Set irq affinity lock. - * 0 - Not set or unlock, - * Task affinity should be predefined driver's code. - * SCHED_boost : 1 - Increase sched boosting count (not used now) - * 0 - Decrease sched boosting count - */ - /* - *boot_device@1 { - * net_boost,label="WIFI"; - * net_boost,node="wlan0"; - * net_boost,table_size = <3>; - * net_boost,table= < - * 5 2016000 0 2016000 0 0 0 0 0 0 - * 10 2016000 0 2016000 0 0 0 0 0 0 - * 20 2016000 0 2016000 0 0 0 0 0 0 - * 30 2016000 0 2016000 0 0 0 0 0 0 - * >; - * }; - */ - boot_device@1 { - net_boost,label="WIFI"; - net_boost,node="wlan0"; - net_boost,table_size = <3>; - net_boost,table= < - 150 0 0 0 0 0 0 0 0 0 - 200 0 0 0 0 0 0 1 1 1 - 300 0 0 0 0 0 0 1 1 1 - >; - }; - boot_device@2 { - net_boost,label="WIFI TX"; - net_boost,node="wlan0"; - net_boost,table_size = <3>; - net_boost,table= < - 20 1420800 0 1420800 0 0 0 0 0 0 - 60 1708800 0 1708800 0 0 0 0 0 0 - 100 2016000 0 1708800 0 0 0 1 1 1 - >; - }; - boot_device@3 { - net_boost,label="WIFI RX"; - net_boost,node="wlan0"; - net_boost,table_size = <4>; - net_boost,table= < - 60 1190400 0 1190400 0 0 0 0 0 0 - 100 1267200 0 1267200 0 0 0 0 0 0 - 200 1728000 0 1728000 0 0 0 1 1 1 - 300 2035200 0 2035200 0 0 0 1 1 1 - >; - }; - boot_device@4 { - net_boost,label="SWLAN"; - net_boost,node="swlan0"; - net_boost,table_size = <4>; - net_boost,table= < - 2 1612800 0 1612800 0 0 0 0 0 0 - 5 1843200 0 1843200 0 0 0 0 0 0 - 20 2092800 0 2092800 0 0 0 1 1 1 - 50 2246400 0 2246400 0 0 0 1 1 1 - >; - }; - boot_device@5 { - net_boost,label="UFS"; - net_boost,node=""; - net_boost,sysnode="/sys/class/scsi_host/host0/transferred_cnt"; - net_boost,table_size = <3>; - net_boost,table= < - 112 0 0 566400 0 0 0 0 0 0 - 800 0 0 883200 0 0 0 0 0 0 - 3200 0 0 2092800 0 0 0 0 0 0 - >; - }; - boot_device@6 { - net_boost,label="P2P"; - net_boost,node="p2p-wlan0-0"; - net_boost,table_size = <3>; - net_boost,table= < - 30 1420800 0 1420800 0 0 0 0 0 0 - 90 1958400 0 1958400 0 0 0 0 0 0 - 300 2208000 0 2208000 0 0 0 1 1 1 - >; - }; - boot_device@7 { - net_boost,label="IPA"; - net_boost,node="rmnet_ipa0"; - net_boost,table_size = <1>; - net_boost,table= < - 10 0 0 0 0 0 0 0 0 0 - 60 1324800 0 1324800 0 0 0 0 0 0 - 100 1708800 0 1708800 0 0 0 0 0 0 - 200 1939200 0 1939200 0 0 0 1 1 1 - >; - }; - }; -}; - -&firmware { - android { - vbmeta { - compatible = "android,vbmeta"; - parts = "vbmeta,boot,system,vendor,product,recovery,dtbo,abl,xbl,tz,hyp"; - }; - fstab { - product { - compatible = "android,product"; - /* dev = "/dev/block/bootdevice/by-name/product"; */ - dev = "/dev/block/platform/soc/1d84000.ufshc/by-name/product"; - type = "ext4"; - mnt_flags = "ro,errors=panic"; - fsmgr_flags = "wait,verify,avb"; - }; - vendor { - compatible = "android,vendor"; - dev = "/dev/block/platform/soc/1d84000.ufshc/by-name/vendor"; - type = "ext4"; - mnt_flags = "ro,barrier=1,discard"; - fsmgr_flags = "wait,verify,avb"; - }; - }; - }; -}; - -&thermal_zones { - lmh-dcvs-00 { - trips { - active-config { - temperature = <85000>; - }; - }; - }; - - lmh-dcvs-01 { - trips { - active-config { - temperature = <85000>; - }; - }; - }; -}; - -&pil_modem { - /* Outputs to mss */ - qcom,smem-states = <&modem_smp2p_out 0>, <&modem_smp2p_out 4>, <&modem_smp2p_out 5>; - qcom,smem-state-names = "qcom,force-stop", "qcom,stop-reason-0", "qcom,stop-reason-1"; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-dcc.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-dcc.dtsi deleted file mode 100755 index d6b1fc486505..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-dcc.dtsi +++ /dev/null @@ -1,1614 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - - -/* config_talos_dcc_gladiator() */ -#define config_talos_dcc_gladiator \ - \ - /* Gladiator */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_noc_err_regs() */ -#define config_talos_dcc_noc_err_regs \ - \ - /* CNOC */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - /* , */ \ - \ - /* SNOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* AGGNOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* MNOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* GEM_NOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* SSC_NOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* DC_NOC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* SNOC_CENTER_NIU_STATUS_SBM0_SENSEIN */ \ - , \ - \ - /* SNOC_CENTER_NIU_STATUS_SBM1_SENSEIN */ \ - , \ - \ - /* SNOC_CENTER_SBM_SENSEIN */ \ - , \ - \ - /* SNOC_MONAQ_NIU_STATUS_SBM_SENSEIN */ \ - , \ - \ - /* SNOC_WEST_NIU_STATUS_SBM_SENSEIN */ \ - , \ - \ - /* A1NOC_MONAQ_SBM_SENSEIN */ \ - , \ - \ - /* A1NOC_WEST_SBM_SENSEIN */ \ - , \ - \ - /* CNOC_CENTER_STATUS_SBM_SENSEIN */ \ - /* , */ \ - \ - /* CNOC_MMNOC_STATUS_SBM_SENSEIN */ \ - /* , */ \ - \ - /* CNOC_WEST_STATUS_SBM_SENSEIN */ \ - /* , */ \ - \ - /* DC_NOC_DISABLE_SBM_SENSEIN */ \ - , \ - \ - /* GEM_NOC_SBM_MDSP_SAFE_SHAPING_SENSEIN */ \ - - -/* config_talos_dcc_shrm() */ -#define config_talos_dcc_shrm \ - \ - /* SHRM CSR */ \ - , \ - , \ - - -/* config_talos_dcc_rscc_apps() */ -#define config_talos_dcc_rscc_apps \ - \ - /* RSC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* RSC-TCS */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_pdc_apps() */ -#define config_talos_dcc_pdc_apps \ - \ - /* RSC_PCU */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_rscc_lpass() */ -#define config_talos_dcc_rscc_lpass \ - \ - /* RSCp */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* RSCc */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* Q6_Status */ \ - , \ - \ - /* RSC-TCS */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_rscc_modem() */ -#define config_talos_dcc_rscc_modem \ - \ - /* RSCp */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* RSCc */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* Q6 status */ \ - , \ - , \ - \ - /* RSC-TCS */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_rscc_cdsp() */ -#define config_talos_dcc_rscc_cdsp \ - \ - /* RSCp */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* RSCc_CDSP */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* Q6 Status */ \ - , \ - \ - /* RSC_TCS */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_memnoc_mccc() */ -#define config_talos_dcc_memnoc_mccc \ - \ - /* MCCC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_gpu() */ -#define config_talos_dcc_gpu \ - \ - /* GCC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* GPUCC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* GFX smmu */ \ - , \ - , \ - \ - /* GPU GX */ \ - , \ - , \ - - -/* config_talos_dcc_osm() */ -#define config_talos_dcc_osm \ - \ - /* APSS_OSM */ \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_cabo_llcc_shrm() */ -#define config_talos_dcc_cabo_llcc_shrm \ - \ - /* LLCC/CABO */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_cx_mx() */ -#define config_talos_dcc_cx_mx \ - \ - /* CX_MX */ \ - , \ - , \ - \ - /* APC Voltage */ \ - , \ - , \ - \ - /* APC / MX CORNER */ \ - , \ - \ - /* CPRH */ \ - , \ - - -/* config_talos_dcc_gcc_regs() */ -#define config_talos_dcc_gcc_regs \ - \ - /* GCC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - \ - /* AOSS_CC */ \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_tsens_regs() */ -#define config_talos_dcc_tsens_regs \ - \ - /* GOLD */ \ - , \ - , \ - , \ - - -/* config_talos_dcc_core_hang() */ -#define config_talos_dcc_core_hang \ - , \ - , \ - , \ - , \ - , \ - , \ - , \ - - -/* config_talos_dcc_bcm_seq_hang() */ -#define config_talos_dcc_bcm_seq_hang \ - - -/* config_talos_dcc_pll() */ -#define config_talos_dcc_pll \ - , \ - , \ - , \ - , \ - , \ - , \ - - -&dcc { - qcom,curr-link-list = <3>; - qcom,link-list = - config_talos_dcc_gladiator, - config_talos_dcc_noc_err_regs, - config_talos_dcc_shrm, - config_talos_dcc_rscc_apps, - config_talos_dcc_pdc_apps, - /* config_talos_dcc_rscc_lpass, */ - config_talos_dcc_rscc_modem, - /* config_talos_dcc_rscc_cdsp, */ - config_talos_dcc_memnoc_mccc, - config_talos_dcc_gpu, - config_talos_dcc_osm, - config_talos_dcc_cabo_llcc_shrm, - config_talos_dcc_cx_mx, - config_talos_dcc_gcc_regs, - config_talos_dcc_tsens_regs, - config_talos_dcc_core_hang, - config_talos_dcc_bcm_seq_hang, - config_talos_dcc_pll; - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-audio-pinctrl.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-audio-pinctrl.dtsi deleted file mode 100755 index 82142b65c63f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-audio-pinctrl.dtsi +++ /dev/null @@ -1,116 +0,0 @@ -&lpi_tlmm { - sec_mi2s_clk_active: sec_mi2s_clk_active { - mux { - pins = "gpio8"; - function = "func3"; - }; - config { - pins = "gpio8"; - drive-strength = <8>; - }; - }; - sec_mi2s_clk_sleep: sec_mi2s_clk_sleep { - mux { - pins = "gpio8"; - function = "func3"; - }; - config { - pins = "gpio8"; - drive-strength = <2>; - }; - }; - - sec_mi2s_ws_active: sec_mi2s_ws_active { - mux { - pins = "gpio9"; - function = "func3"; - }; - config { - pins = "gpio9"; - drive-strength = <8>; - }; - }; - - sec_mi2s_ws_sleep: sec_mi2s_ws_sleep { - mux { - pins = "gpio9"; - function = "func3"; - }; - config { - pins = "gpio9"; - drive-strength = <2>; - }; - }; - - sec_mi2s_sd0_active: sec_mi2s_sd0_active { - mux { - pins = "gpio10"; - function = "func4"; - }; - - config { - pins = "gpio10"; - drive-strength = <8>; - }; - }; - - sec_mi2s_sd0_sleep: sec_mi2s_sd0_sleep { - mux { - pins = "gpio10"; - function = "func4"; - }; - config { - pins = "gpio10"; - drive-strength = <2>; - }; - }; - - sec_mi2s_sd1_active: sec_mi2s_sd1_active { - mux { - pins = "gpio11"; - function = "func2"; - }; - config { - pins = "gpio11"; - drive-strength = <8>; - }; - }; - - sec_mi2s_sd1_sleep: sec_mi2s_sd1_sleep { - mux { - pins = "gpio11"; - function = "func2"; - }; - config { - pins = "gpio11"; - drive-strength = <2>; - }; - }; -}; - -&tlmm { - tfa_reset_active: tfa_reset_active{ - mux { - pins = "gpio26"; - function = "gpio"; - }; - config { - pins = "gpio26"; - driver-strength = <2>; - bias-pull-down; - }; - }; - - tfa_reset_suspend: tfa_reset_suspend{ - mux { - pins = "gpio26"; - function = "gpio"; - }; - config { - pins = "gpio26"; - driver-strength = <2>; - bias-pull-down; - }; - }; - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-audio.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-audio.dtsi deleted file mode 100755 index 889fcea894dd..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-audio.dtsi +++ /dev/null @@ -1,134 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../qcom/sm6150-audio-overlay.dtsi" - -&bolero { - qcom,num-macros = <4>; -}; - -&sm6150_snd { - qcom,model = "sm6150-idp-snd-card"; - qcom,msm-mi2s-master = <1>, <1>, <1>, <1>, <1>; - qcom,ext-disp-audio-rx = <1>; - qcom,dmic-ldo-en = <&tlmm 24 0x0>; - - asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>, - <&loopback>, <&compress>, <&hostless>, - <&afe>, <&lsm>, <&routing>, <&compr>, - <&pcm_noirq>, <&samsung_q6audio_adaptation>; - asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", - "msm-pcm-dsp.2", "msm-voip-dsp", - "msm-pcm-voice", "msm-pcm-loopback", - "msm-compress-dsp", "msm-pcm-hostless", - "msm-pcm-afe", "msm-lsm-client", - "msm-pcm-routing", "msm-compr-dsp", - "msm-pcm-dsp-noirq", "q6audio-adaptation"; - qcom,audio-routing = - "TX DMIC0", "Digital Mic0", - "TX DMIC1", "Digital Mic1", - "TX DMIC2", "Digital Mic2", - "TX_AIF1 CAP", "VA_MCLK", - "TX_AIF2 CAP", "VA_MCLK", - "RX AIF1 PB", "VA_MCLK", - "RX AIF2 PB", "VA_MCLK", - "RX AIF3 PB", "VA_MCLK", - "RX AIF4 PB", "VA_MCLK", - "IN1_HPHL", "HPHL_OUT", - "IN2_HPHR", "HPHR_OUT", - "IN3_AUX", "AUX_OUT", - "TX SWR_ADC0", "ADC1_OUTPUT", - "TX SWR_ADC2", "ADC2_OUTPUT", - "WSA SRC0_INP", "SRC0", - "WSA_TX DEC0_INP", "TX DEC0 MUX", - "WSA_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC0_INP", "TX DEC0 MUX", - "RX_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC2_INP", "TX DEC2 MUX", - "RX_TX DEC3_INP", "TX DEC3 MUX", - "SpkrLeft IN", "WSA_SPK1 OUT"; - qcom,msm-mbhc-hphl-swh = <0>; - qcom,msm-mbhc-gnd-swh = <0>; - qcom,fm-lna-gpios = <&tlmm 119 0>; - asoc-codec = <&stub_codec>, <&bolero>, <&ext_disp_audio_codec>; - asoc-codec-names = "msm-stub-codec.1", "bolero_codec", - "msm-ext-disp-audio-codec-rx"; - qcom,wsa-max-devs = <1>; - qcom,wsa-devs = <&wsa881x_0213>; - qcom,wsa-aux-dev-prefix = "SpkrLeft"; - qcom,codec-max-aux-devs = <0>; - qcom,msm_audio_ssr_devs = <&audio_apr>, <&q6core>, - <&lpi_tlmm>, <&bolero>; - qcom,sec-mi2s-gpios = <&cdc_sec_mi2s_gpios>; -}; - -&soc { - sec-audio-sysfs { - compatible = "samsung,audio-sysfs"; - status = "okay"; - audio,no-earjack; - audio,num-amp = <1>; - }; - samsung_q6audio_adaptation: samsung,q6audio-adaptation { - compatible = "samsung,q6audio-adaptation"; - adaptation,voice-tracking-tx-port-id = <0xB037>; - adaptation,amp-rx-port-id = <0xB000>; - }; - - cdc_sec_mi2s_gpios: msm_cdc_pinctrl_sec { - compatible = "qcom,msm-cdc-pinctrl"; - pinctrl-names = "aud_active", "aud_sleep"; - pinctrl-0 = <&sec_mi2s_clk_active &sec_mi2s_ws_active - &sec_mi2s_sd0_active &sec_mi2s_sd1_active>; - pinctrl-1 = <&sec_mi2s_clk_sleep &sec_mi2s_ws_sleep - &sec_mi2s_sd0_sleep &sec_mi2s_sd1_sleep>; - }; -}; - -&qupv3_se3_i2c { - status = "ok"; - tfa9xxx_rcv: tfa9xxx@34 { - compatible = "nxp,tfa9xxx"; - reg = <0x34>; - haptic; /* this device has the LRA */ - mclk-gpio = <&tlmm 36 0x00>; - }; -}; - -&wsa_macro { - status = "okay"; -}; -&swr0 { - status = "okay"; -}; -&wsa_spkr_en1 { - status = "okay"; -}; - -&va_macro { - status = "okay"; -}; -&wsa_spkr_en2 { - status = "disabled"; -}; -&fsa4480 { - status = "disabled"; -}; -&wsa881x_0211 { - status = "disabled"; -}; -&wsa881x_0212 { - status = "disabled"; -}; -&wsa881x_0214 { - status = "disabled"; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-battery-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-battery-common.dtsi deleted file mode 100755 index e8ff99addeb9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-battery-common.dtsi +++ /dev/null @@ -1,188 +0,0 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&mtp_batterydata { - /delete-node/ qcom,alium_860_89032_0000_3600mAh; - /delete-node/ qcom,mlp356477_2800mah; - #include "sm6150-sec-qg-batterydata-a60q.dtsi" -}; - -&pm6150_qg { - qcom,vbatt-cutoff-mv = <3400>; /* SOC 0% */ - qcom,qg-iterm-ma = <350>; /* SOC 100% */ -}; - -&pm6150_charger { - /delete-property/ qcom,sec-charger-config; - /delete-property/ qcom,step-charging-enable; - qcom,sec-charger-config = <0>; - qcom,chg-term-src = <1>; /* 0 : ITERM_SRC_UNSPECIFIED, 1 : ITERM_SRC_ADC, 2 : ITERM_SRC_ANALOG */ - qcom,chg-term-current-ma = <(-200)>; - qcom,fcc-max-ua = <2450000>; - qcom,usb-icl-ua = <2000000>; - qcom,sw-jeita-enable; - qcom,float-option = <2>; - qcom,otg-cl-ua = <1500000>; - qcom,hard-jeita-enable; - qcom,wdog-snarl-based-step-chg; - qcom,auto-recharge-soc = <(-22)>; - qcom,auto-recharge-vbat-mv = <4280>; - - qcom,jeita_cold_trigger = <0x583D>; /* 0 degree */ - qcom,jeita_cold_release = <0x561B>; /* 2 degree */ - qcom,jeita_hot_trigger = <0x1BE6>; /* 50 degree */ - qcom,jeita_hot_release = <0x1DE0>; /* 48 degree */ - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - water-det-enable; - #sbu-short-detect-enable; - - rid-gnd-gpio = <&pm6150l_gpios 9 GPIO_ACTIVE_LOW>; -}; - -&smb1390 { - status = "disabled"; -}; - -&smb1390_charger { - status = "disabled"; -}; - -&soc { - battery { - status = "okay"; - compatible = "samsung,sec-battery"; - battery,store_mode_polling_time = <30>; - battery,gpio_vbat_sense = <&pm6150l_gpios 12 GPIO_ACTIVE_LOW>; - battery,gpio_sub_pcb_detect = <&pm6150_gpios 8 GPIO_ACTIVE_LOW>; - battery,full_check_current_1st = <350>; - battery,use_temp_adc_table; - - battery,temp_table_adc = <1626 2176 2726 3276 3848 - 4559 5254 6128 7142 8408 - 9805 11278 12866 14532 16212 - 17869 19637 21224 22589 23882 - 25002 25885 26599>; - battery,temp_table_data = <900 850 800 750 700 - 650 600 550 500 450 - 400 350 300 250 200 - 150 100 50 0 (-50) - (-100) (-150) (-200)>; - - battery,chg_temp_table_adc = <7865 8008 8167 8323 8554 - 8637 8768 8957 9103 9261 - 9412 9569 9720 9892 10060 - 10217 10377 10529 10707 10865 - 11025 11185 11345>; - battery,chg_temp_table_data = <(-200) (-150) (-100) (-50) 0 - 50 100 150 200 250 - 300 350 400 450 500 - 550 600 650 700 750 - 800 850 900>; - - /* mix temp setting value */ - battery,mix_temp_recovery = <390>; - battery,mix_temp_batt_threshold = <420>; - battery,mix_temp_die_threshold = <700>; - - /* chg temp setting value */ - battery,chg_high_temp = <520>; - battery,chg_high_temp_recovery = <500>; - battery,chg_input_limit_current = <1000>; - battery,chg_charging_limit_current = <1250>; - - /* Safety timer parameters */ - battery,standard_curr = <2450000>; //equal to last step of step_chg_ranges - battery,expired_time = <11400>; //190min - battery,recharging_expired_time = <5400>; //90mins - battery,safety_timer_polling_time = <30>; - - battery,battery_full_capacity = <3400>; /* battery capacity */ - /* disable Vbat ovp dettection */ - battery,cisd_max_voltage_thr = <5000>; /* batttery ovp dettection voltage */ - battery,cisd_alg_index = <7>; - - battery,siop_input_limit_current = <1200>; - battery,siop_charging_limit_current = <1800>; - battery,siop_hv_input_limit_current = <700>; - battery,siop_hv_charging_limit_current = <1800>; - battery,minimum_hv_input_current_by_siop_10 = <400>; - }; - -/* sec_battery_cable - * 0 UNKNOWN, - * 1 BATTERY, - * 2 UPS, - * 3 MAINS, - * 4 USB, - * 5 USB_DCP, - * 6 USB_CDP, - * 7 USB_ACA, - * 8 USB_TYPE_C, - * 9 USB_PD, - * 10 USB_PD_DRP, - * 11 APPLE_BRICK_ID, - * 12 USB_HVDCP, - * 13 USB_HVDCP_3, - * 14 WIRELESS, - * 15 USB_FLOAT, - * 16 BMS, - * 17 PARALLEL, - * 18 MAIN, - * 19 WIPOWER, - * 20 UFP, - * 21 DFP, - * 22 CHARGE_PUMP, - * 23 POWER_SHARING, - * 24 OTG, - * 25 AFC, - * 26 CABLE_MAX, -*/ - cable-info { - default_input_current = <1800>; - default_charging_current = <2100>; - - current_group_1 { - cable_number = <12 25>; - input_current = <1650>; - charging_current = <2450>; - }; - current_group_2 { - cable_number = <4 8 15>; - input_current = <500>; - charging_current = <700>; - }; - current_group_3 { - cable_number = <9 13>; - input_current = <2000>; - charging_current = <2450>; - }; - current_group_4 { - cable_number = <6 7>; - input_current = <1500>; - charging_current = <1500>; - }; - current_group_5 { - cable_number = <23 24>; - input_current = <500>; - charging_current = <500>; - }; - current_group_6 { - cable_number = <14>; - input_current = <900>; - charging_current = <2450>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-camera-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-camera-r01.dtsi deleted file mode 100755 index 8a51de493a5e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-camera-r01.dtsi +++ /dev/null @@ -1,417 +0,0 @@ -&soc { - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - reg = <0x00 0x00>; - compatible = "qcom,camera-flash"; - flash-source = <&pm6150l_flash0>; - torch-source = <&pm6150l_torch0>; - switch-source = <&pm6150l_switch0>; - status = "ok"; - }; -}; - -&cam_cci{ - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_vana-supply = <&s2mpb03_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vaf", "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000 1800000 1050000 2800000 0>; - rgltr-max-voltage = <2800000 1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_0_active &cam_sensor_rear_active>; - pinctrl-1 = <&cam_sensor_mclk_0_suspend &cam_sensor_rear_suspend>; - gpios = <&tlmm 28 0>, - <&tlmm 47 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@1 { - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { //4HA - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_3_active &cam_sensor_rear3sw_active &cam_rear3_pwr_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_3_suspend &cam_sensor_rear3sw_suspend &cam_rear3_pwr_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 31 0>, // MCLK/ - <&tlmm 100 0>, // RESET - <&tlmm 95 0>, // DVDD,AVDD ENABLE - <&tlmm 49 0>; // MIPI SW SEL BETWEEN FRONT AND RCAM3 - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET3", "CAM_VANA", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - eeprom3: qcom,eeprom@37 { - cell-index = <3>; - compatible = "qcom,eeprom"; - reg = <0x37>; - slave-addr = <0x6E>;//QUP use 0x6E - csiphy-sd-index = <2>; - i2c-freq-mode = <1>; - - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - //eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; -}; - -&qupv3_se3_i2c{ - status = "ok"; - - eeprom0: qcom,eeprom@58 { - cell-index = <0>; - reg = <0x58>; //QUP use 0xB0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>;//QUP use 0xA2 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@54 { - cell-index = <2>; - reg = <0x54>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA8>;//QUP use 0xA8 - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-master = <1>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-camera.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-camera.dtsi deleted file mode 100755 index f3a5ab0d3c67..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-camera.dtsi +++ /dev/null @@ -1,413 +0,0 @@ -&soc { - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - reg = <0x00 0x00>; - compatible = "qcom,camera-flash"; - flash-source = <&pm6150l_flash0>; - torch-source = <&pm6150l_torch0>; - switch-source = <&pm6150l_switch0>; - status = "ok"; - }; -}; - -&cam_cci{ - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_vana-supply = <&s2mpb03_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_0_active &cam_sensor_rear_active>; - pinctrl-1 = <&cam_sensor_mclk_0_suspend &cam_sensor_rear_suspend>; - gpios = <&tlmm 28 0>, - <&tlmm 47 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@1 { - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom1>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 2800000 0>; - rgltr-max-voltage = <1800000 1050000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_1_active &cam_sensor_front_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_1_suspend &cam_sensor_front_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 29 0>, - <&tlmm 45 0>, - <&tlmm 49 0>; - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { //4HA - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom3>; - cam_vio-supply = <&s2mpb03_l3>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 0>; - rgltr-max-voltage = <1800000 0>; - rgltr-load-current = <200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_3_active &cam_sensor_rear3sw_active &cam_rear3_pwr_active &cam_sensor_mipi_sw_active>; - pinctrl-1 = <&cam_sensor_mclk_3_suspend &cam_sensor_rear3sw_suspend &cam_rear3_pwr_suspend &cam_sensor_mipi_sw_suspend>; - gpios = <&tlmm 31 0>, // MCLK/ - <&tlmm 100 0>, // RESET - <&tlmm 95 0>, // DVDD,AVDD ENABLE - <&tlmm 49 0>; // MIPI SW SEL BETWEEN FRONT AND RCAM3 - gpio-reset = <1>; - gpio-vana = <2>; - gpio-custom1 = <3>; - gpio-req-tbl-num = <0 1 2 3>; - gpio-req-tbl-flags = <1 0 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET3", "CAM_VANA", "CAM_CUSTOM1"; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - - - eeprom0: qcom,eeprom@58 { - cell-index = <0>; - reg = <0x58>; //QUP use 0xB0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>;//QUP use 0xA2 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@37 { - cell-index = <2>; - compatible = "qcom,eeprom"; - reg = <0x37>; - slave-addr = <0x6E>;//QUP use 0x6E - csiphy-sd-index = <2>; - i2c-freq-mode = <1>; - - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - //eeprom-src = <&eeprom2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&s2mpb03_l7>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk_2_active &cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_mclk_2_suspend &cam_sensor_rear2_suspend>; - gpios = <&tlmm 30 0>, - <&tlmm 46 0>; - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2"; - - sensor-mode = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - eeprom3: qcom,eeprom@54 { - cell-index = <3>; - reg = <0x54>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA8>;//QUP use 0xA8 - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-master = <1>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - cam_vaf-supply = <&pm6150_l19>; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vaf", "cam_vio"; - rgltr-cntrl-support; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-common.dtsi deleted file mode 100755 index e25427048c67..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-common.dtsi +++ /dev/null @@ -1,153 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "sm6150-sec-a60q-audio.dtsi" - -&sdhc_2 { - cd-gpios = <&tlmm 99 0x1>; - sec,tflash-en-gpio = <&tlmm 121 0x0>; /* T_Flash EN - GPIO121 */ -}; - -&soc { - pm6150l_rid_adc { - status = "okay"; - compatible = "pm6150l_rid_adc"; - - interrupt-parent = <&spmi_bus>; - pm6150l_rid_adc,irq-gpio = <&pm6150l_gpios 9 GPIO_ACTIVE_LOW>; - jigon-gpios = <&pm6150l_gpios 11 GPIO_ACTIVE_LOW>; - - pinctrl-names = "default"; - pinctrl-0 = <&rid_adc_irq_default &gpio11_dig_out_default>; - - io-channels = <&pm6150l_vadc ADC_GPIO4>; - io-channel-names = "rid_adc_channel"; - }; - - hall { - status = "okay"; - compatible = "hall"; - linux,input-type = <1>; - linux,code = <21>; - hall,gpio_flip_cover = <&pm6150_gpios 10 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&hall_default>; - }; - - certify_hall { - status = "okay"; - compatible = "certify_hall"; - linux,input-type = <1>; - linux,code = <27>; - certify_hall,gpio_certify_cover = <&tlmm 96 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&certify_hall_default>; - }; - - qupv3_se4_afc: afc@a80000 { - compatible = "pm6150_afc"; - reg = <0xa80000 0x4000>; - interrupts = ; - #address-cells = <1>; - #size-cells = <0>; - clock-names = "se-clk", "m-ahb", "s-ahb"; - clocks = <&clock_gcc GCC_QUPV3_WRAP1_S0_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_M_AHB_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_S_AHB_CLK>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&qupv3_se4_afc_active &gpio1_afc_switch_default>; - pinctrl-1 = <&qupv3_se4_afc_sleep>; - qcom,wrapper-core = <&qupv3_1>; - afc-gpios = <&pm6150_gpios 1 GPIO_ACTIVE_LOW>; - status = "ok"; - }; - - /* Sensor */ - qcom,lpass@62400000 { - sensor_vdd-supply = <&pm6150l_l8>; - qcom,sensor_vdd-uV-uA = <1800000 0>; - qcom,active-reg-names = "sensor_vdd"; - }; - - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = <&tlmm 115 0 /* sda */ - &tlmm 116 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default","on_i2c","off_i2c"; - pinctrl-0 = <&grip_i2c>; - pinctrl-1 = <&grip_i2c>; - pinctrl-2 = <&grip_gpio>; - - tc3xxk@20 { - compatible = "coreriver,tc3xx-grip"; - pinctrl-names = "default","on_irq","off_irq"; - pinctrl-0 = <&grip_irq>; - pinctrl-1 = <&grip_irq>; - pinctrl-2 = <&grip_input>; - reg = <0x20>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - coreriver,scl-gpio = <&tlmm 116 0>; - coreriver,sda-gpio = <&tlmm 115 0>; - coreriver,irq-gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_LOW>; - coreriver,regulator_ic = "pm6150_l16"; - coreriver,i2c-gpio = "true"; - coreriver,boot-on-ldo = "true"; - coreriver,fw_name = "coreriver/tc305k_a60_grip.fw"; - coreriver,use_bitmap = <1>; - }; - }; - sec_abc { - compatible = "samsung,sec_abc"; - status = "okay"; - gpu { - gpu,label="GPU fault"; - gpu,threshold_count=<20>; - gpu,threshold_time=<1200>; - }; - aicl { - aicl,label="battery aicl"; - aicl,threshold_count=<5>; - aicl,threshold_time=<300>; - }; - }; - - abc_hub { - compatible = "samsung,abc_hub"; - status = "okay"; - - bootc { - bootc,time_spec_user = <100000>; /* user binary user build */ - bootc,time_spec_eng = <100000>; /* user binary eng build */ - bootc,time_spec_fac = <100000>; /* factory binary */ - }; - }; -}; - -/* Grip Sensor */ -&pm6150_l16 { - regulator-min-microvolt = <2200000>; - regulator-max-microvolt = <2200000>; - qcom,init-voltage = <2200000>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-display-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-display-r00.dtsi deleted file mode 100755 index d918d32ecc07..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-display-r00.dtsi +++ /dev/null @@ -1,217 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../drivers/gpu/drm/msm/samsung/NT36672A_B6P064YQ5LP/dsi_panel_NT36672A_B6P064YQ5LP_fhd_video.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - function = "gpio"; - }; - - config { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - function = "gpio"; - }; - - config { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; -#if 1 - bl_i2c_active: bl_i2c_active { - mux { - pins = "gpio21", "gpio22"; - function = "gpio"; - }; - config { - pins = "gpio21", "gpio22"; - drive-strength = <2>; - bias-disable; - }; - - }; - bl_i2c_suspend: bl_i2c_suspend { - mux { - pins = "gpio21", "gpio22"; - function = "gpio"; - }; - config { - pins = "gpio21", "gpio22"; - drive-strength = <2>; - bias-disable; - }; - }; -#endif -}; - -&soc { -#if 1 -/*to do: change hw i2c*/ - i2c_20: i2c@20 { - status = "okay"; - - cell-index = <20>; - compatible = "i2c-gpio"; - gpios = <&tlmm 21 0 /* sda */ - &tlmm 22 0 /* scl */ - >; - i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&bl_i2c_active>; - pinctrl-1 = <&bl_i2c_suspend>; - - isl98611_backlight@29 { - compatible = "isl98611,backlight-control"; - reg = <0x29>; - - isl98611_en_gpio = <&tlmm 25 0x00>; - isl98611_enp_gpio = <&tlmm 97 0x00>; - isl98611_enn_gpio = <&tlmm 103 0x00>; - - pinctrl-names = "i2c_default", "i2c_suspend"; - pinctrl-0 = <&bl_i2c_active>; - pinctrl-1 = <&bl_i2c_suspend>; - - blic_init_data = [ - 01 00 - 02 BF - 03 02 - 04 14 - 05 14 - 06 F4 - 10 FF - 11 07 - 12 BF - 13 80 - 14 FD - 16 F5 - 17 8D - ]; - }; - }; -#else - qupv3_se4_i2c: i2c@a80000 { - status = "okay"; - isl98611_backlight@29 { - compatible = "isl98611,backlight-control"; - reg = <0x29>; - - isl98611_en_gpio = <&tlmm 25 0x00>; - isl98611_enp_gpio = <&tlmm 97 0x00>; - isl98611_enn_gpio = <&tlmm 103 0x00>; - - blic_init_data = [ - 01 00 - 02 BF - 03 02 - 04 14 - 05 14 - 06 F4 - 10 FF - 11 07 - 12 BF - 13 80 - 14 FD - 16 F5 - 17 8D - ]; - }; - }; -#endif - /* A60Q panel */ - ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD_display: qcom,dsi-display@5 { - label = "ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD"; - qcom,display-type = "primary"; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_dsi_active>; - pinctrl-1 = <&sde_dsi_suspend>; - - vddr-supply = <&pm6150_l10>; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@6 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_dsi_active>; - pinctrl-1 = <&sde_dsi_suspend>; - }; -}; - -&sde_dsi { - qcom,dsi-display-list = - <&ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD_display - &ss_dsi_panel_PBA_BOOTING_FHD_display>; -}; - -&ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD_display { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD>; - - qcom,platform-reset-gpio = <&tlmm 91 0>; - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddr"; - qcom,supply-min-voltage = <1800000>; - qcom,supply-max-voltage = <1800000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <0>; - qcom,supply-pre-off-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD_display { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-reset-gpio = <&tlmm 91 0>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-display-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-display-r01.dtsi deleted file mode 100755 index c32424a744b4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-display-r01.dtsi +++ /dev/null @@ -1,253 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../drivers/gpu/drm/msm/samsung/NT36672A_B6P064YQ5LP/dsi_panel_NT36672A_B6P064YQ5LP_fhd_video.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/NT36672A_B6TMA60/dsi_panel_NT36672A_B6TMA60_fhd_video.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/NT36672A_PM6300JB1/dsi_panel_NT36672A_PM6300JB1_fhd_video.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - function = "gpio"; - }; - - config { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - function = "gpio"; - }; - - config { - pins = "gpio25", "gpio97", "gpio103", "gpio91";/*reset*/ - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; -#if 1 - bl_i2c_active: bl_i2c_active { - mux { - pins = "gpio21", "gpio22"; - function = "gpio"; - }; - config { - pins = "gpio21", "gpio22"; - drive-strength = <2>; - bias-disable; - }; - - }; - bl_i2c_suspend: bl_i2c_suspend { - mux { - pins = "gpio21", "gpio22"; - function = "gpio"; - }; - config { - pins = "gpio21", "gpio22"; - drive-strength = <2>; - bias-disable; - }; - }; -#endif -}; - -&soc { - i2c_20: i2c@20 { - status = "okay"; - - cell-index = <20>; - compatible = "i2c-gpio"; - gpios = <&tlmm 21 0 /* sda */ - &tlmm 22 0 /* scl */ - >; - i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&bl_i2c_active>; - pinctrl-1 = <&bl_i2c_suspend>; - - lm36274_backlight@11 { - compatible = "lm36274,backlight-control"; - reg = <0x11>; /* 7bits i2c addr */ - - lm36274_hwen_gpio = <&tlmm 25 0x00>; - lm36274_enp_gpio = <&tlmm 97 0x00>; - lm36274_enn_gpio = <&tlmm 103 0x00>; - - pinctrl-names = "i2c_default", "i2c_suspend"; - pinctrl-0 = <&bl_i2c_active>; - pinctrl-1 = <&bl_i2c_suspend>; - - blic_init_data = [ - 02 2B /*(defalut 28) ramp & PWM enable*/ - 03 8E /*(defalut 8d) LED current ramp, PWM sample rate & hysteris */ - /* TO DO: select a suitable BL value */ - 04 04 /* D[2:0] LSB of 11 bit BL code*/ - 05 D4 /* D[7:0] MSB of 11 bit BL code*/ - 09 99 /* VPOS and VNEG enabled via external pin*/ - 0E 1E /* VNEG -5.5V */ - /* TO DO: set PWM freq to be 10kHz or lower, remove reg 0x10, and set reg 0x03 PWM sample rate lower */ - 10 07 /* PWM sample rate 24MHz */ - 11 75 /* backlight_boost_l_select:10uH */ - 08 1F /* finally: BL_EN, all LEDs enable*/ - ]; - }; - }; - - /* A60Q panel */ - ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD_display: qcom,dsi-display@13 { - label = "ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD>; - }; - - ss_dsi_panel_NT36672A_B6TMA60_FHD_display: qcom,dsi-display@14 { - label = "ss_dsi_panel_NT36672A_B6TMA60_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_NT36672A_B6TMA60_FHD>; - }; - - ss_dsi_panel_NT36672A_PM6300JB1_FHD_display: qcom,dsi-display@15 { - label = "ss_dsi_panel_NT36672A_PM6300JB1_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_NT36672A_PM6300JB1_FHD>; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@16 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - }; -}; - -&sde_dsi { - vddr-supply = <&pm6150_l15>; - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_dsi_active>; - pinctrl-1 = <&sde_dsi_suspend>; - - qcom,dsi-display-list = - <&ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD_display - &ss_dsi_panel_NT36672A_B6TMA60_FHD_display - &ss_dsi_panel_NT36672A_PM6300JB1_FHD_display - &ss_dsi_panel_PBA_BOOTING_FHD_display>; -}; - -&ss_dsi_panel_NT36672A_B6P064YQ5LP_FHD { - qcom,platform-reset-gpio = <&tlmm 91 0>; - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddr"; - qcom,supply-min-voltage = <1800000>; - qcom,supply-max-voltage = <1800000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <1>; - qcom,supply-pre-off-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_NT36672A_B6TMA60_FHD { - qcom,platform-reset-gpio = <&tlmm 91 0>; - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddr"; - qcom,supply-min-voltage = <1800000>; - qcom,supply-max-voltage = <1800000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <1>; - qcom,supply-pre-off-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_NT36672A_PM6300JB1_FHD { - qcom,platform-reset-gpio = <&tlmm 91 0>; - - qcom,panel-supply-entries { - #address-cells = <1>; - #size-cells = <0>; - - qcom,panel-supply-entry@0 { - reg = <0>; - qcom,supply-name = "vddr"; - qcom,supply-min-voltage = <1800000>; - qcom,supply-max-voltage = <1800000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-pre-on-sleep = <0>; /* unit is ms*/ - qcom,supply-post-on-sleep = <1>; - qcom,supply-pre-off-sleep = <0>; - }; - }; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,platform-reset-gpio = <&tlmm 91 0>; - - qcom,display-topology = <1 0 1>; - qcom,mdss-dsi-panel-phy-timings = [24 1e 08 09 05 02 04 a0 - 24 1e 08 09 05 02 04 a0 - 24 1e 08 09 05 02 04 a0 - 24 1e 08 09 05 02 04 a0 - 24 1a 08 09 05 02 04 a0]; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-eif-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-eif-r00.dtsi deleted file mode 100755 index 897f498cbf1f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-eif-r00.dtsi +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - usb_noti: usb-notifier { - compatible = "samsung,usb-notifier"; - qcom,disable_control_en = <1>; - qcom,unsupport_host_en = <0>; - }; - - samsung,usbpd { - compatible = "samsung,usb-pd"; - qcom,samsung-usbpd-detection = <&pm6150_pdphy>; - }; -}; - -&usb0 { - dwc3@a600000 { - usb-phy = <&qusb_phy0>, <&usb_nop_phy>; - maximum-speed = "high-speed"; - }; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = <0xc0 0x80 - 0x53 0x84 - 0x81 0x88 - 0xc7 0x8c - 0x30 0x08 - 0x79 0x0c - 0x21 0x10 - 0x01 0x90 - 0x14 0x9c - 0x9f 0x1c - 0x00 0x18>; - qcom,qusb-phy-host-init-seq = <0xc0 0x80 - 0xc3 0x84 - 0x81 0x88 - 0xc7 0x8c - 0x30 0x08 - 0x79 0x0c - 0x21 0x10 - 0x01 0x90 - 0x14 0x9c - 0x9f 0x1c - 0x00 0x18>; - /* ex) efuse(0xC) + (-7) = 0x5 for tune2 high value */ - qcom,diff_tune2_device = <(-7)>; - qcom,diff_tune2_host = <(0)>; -}; - -&usb_qmp_phy { - status = "disabled"; -}; - -&qupv3_se3_i2c { - tfa9xxx@34 { - haptic_clk_en = <&tlmm 37 0>; - haptic-fw-intensity-max = <41>; - samsung,vib_type = "LINEAR_RCVMOT"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-fingerprint_00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-fingerprint_00.dtsi deleted file mode 100755 index ff3223784148..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-fingerprint_00.dtsi +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - etspi_drdypin { - etspi_drdypin_active: etspi_drdypin_active { - mux { - pins = "gpio93"; - function = "gpio"; - }; - config { - pins = "gpio93"; - drive-strength = <2>; - bias-disable; - }; - }; - etspi_drdypin_suspend: etspi_drdypin_suspend { - mux { - pins = "gpio93"; - function = "gpio"; - }; - config { - pins = "gpio93"; - drive-strength = <2>; - bias-pull-down; - }; - }; - }; - - etspi_ldopin { - etspi_ldopin: etspi_ldopin { - mux { - pins = "gpio42"; - function = "gpio"; - }; - config { - pins = "gpio42"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; - - etspi_rstpin { - etspi_rstpin: etspi_rstpin { - mux { - pins = "gpio94"; - function = "gpio"; - }; - config { - pins = "gpio94"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; -}; - -&qupv3_se2_spi { - status = "okay"; - - etspi-spi@0 { - compatible = "etspi,et5xx"; - reg = <0>; - spi-max-frequency = <50000000>; - etspi-min_cpufreq_limit = <1708800>; - pinctrl-names = "default", "sleep", "idle"; - pinctrl-0 = <&etspi_drdypin_suspend &etspi_ldopin &etspi_rstpin>; - pinctrl-1 = <&etspi_drdypin_suspend>; - pinctrl-2 = <&etspi_drdypin_active>; - - gpio-controller; - #gpio-cells = <2>; - - etspi-sleepPin = <&tlmm 94 0>; - etspi-drdyPin = <&tlmm 93 1>; - etspi-ldoPin = <&tlmm 42 0>; - etspi-chipid = "ET520"; - etspi-orient = <2>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-fingerprint_01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-fingerprint_01.dtsi deleted file mode 100755 index 08425fd5e981..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-fingerprint_01.dtsi +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - etspi_drdypin { - etspi_drdypin_active: etspi_drdypin_active { - mux { - pins = "gpio93"; - function = "gpio"; - }; - config { - pins = "gpio93"; - drive-strength = <2>; - bias-disable; - }; - }; - etspi_drdypin_suspend: etspi_drdypin_suspend { - mux { - pins = "gpio93"; - function = "gpio"; - }; - config { - pins = "gpio93"; - drive-strength = <2>; - bias-pull-down; - }; - }; - }; - - etspi_ldopin { - etspi_ldopin: etspi_ldopin { - mux { - pins = "gpio42"; - function = "gpio"; - }; - config { - pins = "gpio42"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; - - etspi_rstpin { - etspi_rstpin: etspi_rstpin { - mux { - pins = "gpio94"; - function = "gpio"; - }; - config { - pins = "gpio94"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; -}; - -&qupv3_se2_spi { - status = "okay"; - - etspi-spi@0 { - compatible = "etspi,et5xx"; - reg = <0>; - spi-max-frequency = <50000000>; - etspi-min_cpufreq_limit = <1708800>; - pinctrl-names = "default", "sleep", "idle"; - pinctrl-0 = <&etspi_drdypin_suspend &etspi_ldopin &etspi_rstpin>; - pinctrl-1 = <&etspi_drdypin_suspend>; - pinctrl-2 = <&etspi_drdypin_active>; - - gpio-controller; - #gpio-cells = <2>; - - etspi-sleepPin = <&tlmm 94 0>; - etspi-drdyPin = <&tlmm 93 1>; - etspi-ldoPin = <&tlmm 42 0>; - etspi-chipid = "ET520"; - etspi-orient = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-input-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-input-common.dtsi deleted file mode 100755 index 5d790cb48b78..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-input-common.dtsi +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&tlmm { - tsp_int: tsp_int { - mux { - pins = "gpio89"; - function = "gpio"; - }; - - config { - pins = "gpio89"; - input-enable; - bias-disable; - }; - }; -}; - -&pm6150_l18 { - regulator-min-microvolt = <3000000>; - regulator-max-microvolt = <3000000>; - regulator-boot-on; -}; - -&qupv3_se1_i2c { - status = "ok"; - - novatek_ts: touchscreen@62 { - status = "disabled"; - compatible = "novatek,nvt-ts"; - reg = <0x62>; - pinctrl-names = "default"; - pinctrl-0 = <&tsp_int>; - novatek,firmware_name = "tsp_novatek/nt36672_m40.bin"; - novatek,irq-gpio = <&tlmm 89 0x2002>; - novatek,resolution = <1080 2340>; /* x y */ - novatek,max_touch_num = <10>; - novatek,area-size = <133 266 341>; /* indicator: 24dp navigator: 48dp edge: 60px dpi=320 */ - novatek,ss_touch_num = <1>; - novatek,factory_item_version = <1>; - - novatek,mp-support-dt; - - novatek-mp-criteria-1135@0 { /* tima panel */ - #address-cells = <1>; - #size-cells = <0>; - compatible = "novatek-mp-criteria-1135"; - - /* MP Criteria */ - open_test_spec = <0 3650>; - short_test_spec = <11380 14000>; - - diff_test_frame = <50>; - }; - - novatek-mp-criteria-7204@1 { /* csot panel */ - #address-cells = <1>; - #size-cells = <0>; - compatible = "novatek-mp-criteria-7204"; - - /* MP Criteria */ - open_test_spec = <0 3650>; - short_test_spec = <11380 14000>; - - diff_test_frame = <50>; - }; - }; -}; - -/delete-node/&key_vol_up_default; -&pm6150l_gpios { - key_vol_up { - key_vol_up_default: key_vol_up_default { - pins = "gpio8"; - function = "normal"; - input-enable; - bias-pull-up; - power-source = <0>; - }; - }; -}; - -&soc { - /delete-node/gpio_keys; - gpio_keys { - status = "ok"; - compatible = "gpio-keys"; - input-name = "gpio-keys"; - - pinctrl-names = "default"; - pinctrl-0 = <&key_vol_up_default>; - - vol_up { - label = "volume_up"; - gpios = <&pm6150l_gpios 8 0x1>; - linux,input-type = <1>; - linux,code = ; - debounce-interval = <15>; - }; - }; - - ss_touch { - compatible = "samsung,ss_touch"; - ss_touch,numbers = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-nfc-r00.dtsi deleted file mode 100755 index 3ba330450ecd..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-nfc-r00.dtsi +++ /dev/null @@ -1,85 +0,0 @@ - -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi1 = &qupv3_se6_spi; - }; -}; -*/ - -&tlmm { - ese_qupv3_se6_spi_sleep: ese_qupv3_se6_spi_sleep { - mux { - pins = "gpio6", "gpio7", "gpio8", - "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio6", "gpio7", "gpio8", - "gpio9"; - drive-strength = <6>; - bias-pull-down; /* pull down */ - output-low; - }; - }; - - nfc_qupv3_se5_i2c_sleep: nfc_qupv3_se5_i2c_sleep { - mux { - pins = "gpio14", "gpio15"; - function = "gpio"; - }; - - config { - pins = "gpio14", "gpio15"; - drive-strength = <2>; - bias-disable; - }; - }; -}; - -/* gpio14 and gpio15 are used for nfc i2c */ -&qupv3_se5_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se5_i2c_sleep>; - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <86 0>; - pn547,irq-gpio = <&tlmm 86 0>; - pn547,ven-gpio = <&tlmm 84 0>; - pn547,firm-gpio = <&tlmm 85 0>; - pn547,clk_req-gpio = <&tlmm 50 0>; /* BBCLK3 is controled by gpio 50 */ - pn547,pwr_req = <&tlmm 87 0>; - pn547,pvdd-gpio = <&tlmm 23 0>; - pn547,clk_req_wake; - }; -}; - - -/* gpio 6~9 are used for ese spi */ -&qupv3_se6_spi { - status = "okay"; - spi-max-frequency = <19200000>; - pinctrl-1 = <&ese_qupv3_se6_spi_sleep>; - - ese_spi@0 { - compatible = "p61"; - reg = <0>; - spi-max-frequency = <16000000>; - p61-ap_vendor = "qualcomm"; - p61-spi_node = <&qupv3_se6_spi>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-pinctrl-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-pinctrl-common.dtsi deleted file mode 100755 index a979c0d1e2f4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-pinctrl-common.dtsi +++ /dev/null @@ -1,450 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-a60q-audio-pinctrl.dtsi" - -&tlmm { - i2c_22_pinctrl: i2c_22_pinctrl { - mux { - pins = "gpio108", /* DISP_PMIC_SDA_1P8 */ - "gpio109"; /* DISP_PMIC_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio108", /* DISP_PMIC_SDA_1P8 */ - "gpio109"; /* DISP_PMIC_SCL_1P8 */ - drive-strength = <2>; - bias-disable; - }; - }; - /* smb1390 i2c */ - smb1390_i2c: smb1390_i2c { - smb1390_i2c_active: smb1390_i2c_active { - mux { - pins = "gpio113", "gpio114","gpio65","gpio59"; - function = "gpio"; - }; - - config { - pins = "gpio113", "gpio114","gpio65","gpio59"; - drive-strength = <2>; - bias-pull-down; - input-enable; - }; - }; - }; - - - sdc2_cd_on: cd_on { - mux { - pins = "gpio99"; - function = "gpio"; - }; - config { - pins = "gpio99"; - drive-strength = <2>; - bias-disable; - }; - certify_hall_default: certify_hall_default { - mux { - pins = "gpio96"; - function = "gpio"; - }; - config { - pins = "gpio96"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - - sdc2_data_on: sdc2_data_on { - config { - pins = "sdc2_data"; - bias-pull-up; /* pull up */ - drive-strength = <8>; /* 8 MA */ - }; - }; - - i2c17 { - grip_i2c: grip-i2c { - mux { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - bias-disable; - }; - }; - - grip_gpio: grip-gpio { - mux { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio115", /* GRIP_SENSOR_SDA_1P8 */ - "gpio116"; /* GRIP_SENSOR_SCL_1P8 */ - bias-disable; - }; - }; - }; - - cam_sensor_mclk_0_active: cam_sensor_mclk_0_active { - /* REAR MCLK */ - mux { - pins = "gpio28"; - function = "cam_mclk"; - }; - config { - pins = "gpio28"; - bias-disable; /* No PULL */ - drive-strength = <4>; /* 4 MA */ - }; - }; - - cam_sensor_mclk_0_suspend: cam_sensor_mclk_0_suspend { - /* REAR MCLK */ - mux { - pins = "gpio28"; - function = "cam_mclk"; - }; - config { - pins = "gpio28"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <4>; /* 4 MA */ - output-low; - }; - }; - - cam_sensor_rear_active: cam_sensor_rear_active { - /* REAR RESET */ - mux { - pins = "gpio47"; - function = "gpio"; - }; - config { - pins = "gpio47"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_rear_suspend: cam_sensor_rear_suspend { - /* REAR RESET */ - mux { - pins = "gpio47"; - function = "gpio"; - }; - config { - pins = "gpio47"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_mclk_1_active: cam_sensor_mclk_1_active { - /* FRONT MCLK */ - mux { - pins = "gpio29"; - function = "cam_mclk"; - }; - config { - pins = "gpio29"; - bias-disable; /* No PULL */ - drive-strength = <8>; /* 8 MA */ - }; - }; - - cam_sensor_mclk_1_suspend: cam_sensor_mclk_1_suspend { - /* FRONT MCLK */ - mux { - pins = "gpio29"; - function = "cam_mclk"; - }; - config { - pins = "gpio29"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <8>; /* 8 MA */ - output-low; - }; - }; - cam_sensor_front_active: cam_sensor_front_active { - /* FRONT RESET */ - mux { - pins = "gpio45"; - function = "gpio"; - }; - config { - pins = "gpio45"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_front_suspend: cam_sensor_front_suspend { - /* FRONT RESET */ - mux { - pins = "gpio45"; - function = "gpio"; - }; - config { - pins = "gpio45"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_mclk_2_active: cam_sensor_mclk_2_active { - /* REAR2 MCLK */ - mux { - pins = "gpio30"; - function = "cam_mclk"; - }; - config { - pins = "gpio30"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_mclk_2_suspend: cam_sensor_mclk_2_suspend { - /* REAR2 MCLK */ - mux { - pins = "gpio30"; - function = "cam_mclk"; - }; - config { - pins = "gpio30"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - cam_sensor_rear2_active: cam_sensor_rear2_active { - /* REAR2 RESET */ - mux { - pins = "gpio46"; - function = "gpio"; - }; - config { - pins = "gpio46"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_rear2_suspend: cam_sensor_rear2_suspend { - /* REAR2 RESET */ - mux { - pins = "gpio46"; - function = "gpio"; - }; - config { - pins = "gpio46"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - cam_sensor_mclk_3_active: cam_sensor_mclk_3_active { - /* REAR SW-8M */ - mux { - pins = "gpio31"; - function = "cam_mclk"; - }; - config { - pins = "gpio31"; - bias-disable; /* No PULL */ - drive-strength = <4>; /* 2 MA */ - output-low; - }; - }; - - cam_sensor_mclk_3_suspend: cam_sensor_mclk_3_suspend { - /* REAR SW-8M */ - mux { - pins = "gpio31"; - function = "cam_mclk"; - }; - config { - pins = "gpio31"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <4>; /* 2 MA */ - output-low; - }; - }; - - - cam_sensor_rear3sw_active: cam_sensor_rear3sw_active { - /* REAR SUB2 RESET*/ - mux { - pins = "gpio100"; - function = "gpio"; - }; - config { - pins = "gpio100"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear3sw_suspend: cam_sensor_rear3sw_suspend { - /* REAR SUB2 RESET */ - mux { - pins = "gpio100"; - function = "gpio"; - }; - config { - pins = "gpio100"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_rear3_pwr_active: cam_rear3_pwr_active { - /* REAR SUB2 RESET*/ - mux { - pins = "gpio95"; - function = "gpio"; - }; - config { - pins = "gpio95"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_rear3_pwr_suspend: cam_rear3_pwr_suspend { - /* REAR SUB2 RESET */ - mux { - pins = "gpio95"; - function = "gpio"; - }; - config { - pins = "gpio95"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_mipi_sw_active: cam_sensor_mipi_sw_active { - /* MIPI_SWITCH */ - mux { - pins = "gpio49"; - function = "gpio"; - }; - config { - pins = "gpio49"; - bias-disable; /* No PULL */ - output-high; - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_mipi_sw_suspend: cam_sensor_mipi_sw_suspend { - /* MIPI_SWITCH */ - mux { - pins = "gpio49"; - function = "gpio"; - }; - config { - pins = "gpio49"; - bias-disable; /* No PULL */ - output-high; - drive-strength = <2>; /* 2 MA */ - }; - }; - - led_enable: led_enable { - mux { - pins = "gpio39"; - function = "gpio"; - }; - - config { - pins = "gpio39"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - led_disable: led_disable { - mux { - pins = "gpio39"; - function = "gpio"; - }; - - config { - pins = "gpio39"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; -}; - -&lpi_tlmm { - gpio-reserved-ranges = <0 8>, <12 6>, <25 1>; -}; - -&pm6150_gpios { - hall { - hall_default: hall_default { - pins = "gpio10"; - function = "normal"; - output-disable; - input-enable; - bias-disable; - power-source = <0>; - }; - }; - - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&pm6150l_gpios { - grip_irq: grip-irq { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_input: grip-input { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; - - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-pm-common.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-pm-common.dtsi deleted file mode 100755 index 092ccfb204e0..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-pm-common.dtsi +++ /dev/null @@ -1,191 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include - -&soc { - /* AP Thermistor table */ - sec_thermistor@0 { - compatible = "samsung,sec-ap-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "ap_therm"; - adc_array = <1992 2292 2592 3042 3500 4223 4596 4731 4947 5100 - 5210 5455 5528 5820 6017 6222 6422 6485 6808 7004 - 7224 7482 7765 8055 8310 8546 8866 9082 9348 9614 - 9850 10211 10469 10779 11159 11361 11752 12096 12352 12841 - 13112 13485 13790 13982 14456 14802 15169 15486 15706 16215 - 16453 16930 17305 17291 17972 18157 18603 18961 19367 20783 - 21527 23603 24753 25734 26491 27114>; - temp_array = <900 850 800 750 700 650 620 610 600 590 - 580 570 560 550 540 530 520 510 500 490 - 480 470 460 450 440 430 420 410 400 390 - 380 370 360 350 340 330 320 310 300 290 - 280 270 260 250 240 230 220 210 200 190 - 180 170 160 150 140 130 120 110 100 50 - 0 (-50) (-100) (-150) (-200) (-250)>; - }; - - /* PA Thermistor table */ - sec_thermistor@1 { - compatible = "samsung,sec-pa-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "pa_therm"; - adc_array = <1764 2164 2614 3114 3639 4389 4745 4888 5095 5253 - 5413 5605 5789 5983 6184 6383 6596 6750 7006 7237 - 7487 7677 8001 8274 8535 8764 9075 9328 9593 9895 - 10171 10481 10790 11074 11414 11686 12066 12388 12667 13083 - 13378 13740 14053 14321 14731 15079 15439 15776 16040 16483 - 16748 17168 17576 17658 18211 18553 18882 19237 19599 20891 - 22109 23850 24991 25891 26621 27215>; - temp_array = <900 850 800 750 700 650 620 610 600 590 - 580 570 560 550 540 530 520 510 500 490 - 480 470 460 450 440 430 420 410 400 390 - 380 370 360 350 340 330 320 310 300 290 - 280 270 260 250 240 230 220 210 200 190 - 180 170 160 150 140 130 120 110 100 50 - 0 (-50) (-100) (-150) (-200) (-250)>; - }; - - /* WiFi Thermistor table */ - sec_thermistor@2 { - compatible = "samsung,sec-wf-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - io-channel-names = "wf_therm"; - adc_array = <1720 2120 2520 3020 3552 4270 4633 4763 4983 5134 - 5251 5491 5601 5863 6061 6264 6452 6554 6863 7069 - 7281 7533 7818 8110 8371 8597 8916 9134 9399 9675 - 9946 10248 10545 10843 11231 11435 11832 12160 12414 12905 - 13180 13538 13856 13960 14526 14875 15245 15561 15761 16288 - 16539 16996 17383 17376 18047 18253 18680 19039 19431 20881 - 21580 23695 24840 25791 26541 27148>; - temp_array = <900 850 800 750 700 650 620 610 600 590 - 580 570 560 550 540 530 520 510 500 490 - 480 470 460 450 440 430 420 410 400 390 - 380 370 360 350 340 330 320 310 300 290 - 280 270 260 250 240 230 220 210 200 190 - 180 170 160 150 140 130 120 110 100 50 - 0 (-50) (-100) (-150) (-200) (-250)>; - }; - -}; - -&spmi_bus { - qcom,pm6150@0{ - qcom,power-on@800 { - interrupts = <0x0 0x8 0x0 IRQ_TYPE_NONE>, - <0x0 0x8 0x1 IRQ_TYPE_NONE>, - <0x0 0x8 0x4 IRQ_TYPE_NONE>, - <0x0 0x8 0x5 IRQ_TYPE_NONE>; - interrupt-names = "kpdpwr", "resin", - "resin-bark", "kpdpwr-resin-bark"; - qcom,store-hard-reset-reason; - qcom,s3-debounce = <128>; - - qcom,pon_1 { - qcom,support-reset = <0>; - }; - - qcom,pon_2 { - qcom,support-reset = <0>; - }; - - qcom,pon_3 { - qcom,pon-type = ; - qcom,support-reset = <1>; - qcom,pull-up = <1>; - qcom,s1-timer = <6720>; - qcom,s2-timer = <1000>; - qcom,s2-type = ; - qcom,use-bark; - }; - }; - }; - - qcom,pm6150l@5 { - flash_led: qcom,leds@d300 { - pm6150l_flash0: qcom,flash_0 { - label = "flash"; - qcom,led-name = "led:flash_0"; - qcom,max-current = <1500>; - qcom,default-led-trigger = "flash0_trigger"; - qcom,id = <0>; - qcom,current-ma = <1400>; - qcom,duration-ms = <1280>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - qcom,record-current-ma = <200>; - }; - pm6150l_torch0: qcom,torch_0 { - label = "torch"; - qcom,led-name = "led:torch_0"; - qcom,max-current = <500>; - qcom,default-led-trigger = "torch0_trigger"; - qcom,id = <0>; - qcom,current-ma = <300>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - }; - }; - }; -}; -&pm6150_gpios { - interrupts = <0x0 0xc0 0 IRQ_TYPE_NONE>, - <0x0 0xc1 0 IRQ_TYPE_NONE>, - <0x0 0xc2 0 IRQ_TYPE_NONE>, - <0x0 0xc3 0 IRQ_TYPE_NONE>, - <0x0 0xc6 0 IRQ_TYPE_NONE>, - <0x0 0xc7 0 IRQ_TYPE_NONE>, - <0x0 0xc9 0 IRQ_TYPE_NONE>; - interrupt-names = "pm6150_gpio1", "pm6150_gpio2", - "pm6150_gpio3", "pm6150_gpio4", - "pm6150_gpio7", "pm6150_gpio8", - "pm6150_gpio10"; - qcom,gpios-disallowed = <5 6 9>; -}; - -&pm6150_vadc { - sdm_therm { - reg = ; - label = "ap_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; -}; - -&pm6150l_vadc { - rf_pa0_therm { - reg = ; - label = "pa_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - rf_pa1_therm { - reg = ; - label = "wf_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r00.dts deleted file mode 100755 index a6d5d6b90ebc..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r00.dts +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-m40-pm-common.dtsi" - -#include "sm6150-sec-m40-swa-r00.dtsi" -#include "sm6150-sec-m40-swa-pinctrl-r00.dtsi" -#include "sm6150-sec-m40-battery-common.dtsi" -#include "sm6150-sec-m40-nfc-r00.dtsi" -#include "sm6150-sec-m40-eif-r00.dtsi" -#include "sm6150-sec-m40-display-r00.dtsi" -#include "sm6150-sec-m40-fingerprint_00.dtsi" -#include "sm6150-sec-m40-camera.dtsi" - -/ { - model = "Samsung M40 PROJECT Bring-Up (board-id,00)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se1_i2c { - touchscreen@50 { - status = "disabled"; - }; - - touchscreen@20 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r01.dts deleted file mode 100755 index 608230af8280..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r01.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-m40-pm-common.dtsi" - -#include "sm6150-sec-m40-swa-r01.dtsi" -#include "sm6150-sec-m40-swa-pinctrl-r01.dtsi" -#include "sm6150-sec-m40-battery-common.dtsi" -#include "sm6150-sec-m40-nfc-r00.dtsi" -#include "sm6150-sec-m40-eif-r00.dtsi" -#include "sm6150-sec-m40-display-r01.dtsi" -#include "sm6150-sec-m40-fingerprint_00.dtsi" -#include "sm6150-sec-m40-camera.dtsi" - -/ { - model = "Samsung M40 PROJECT (board-id,01)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 1>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r02.dts deleted file mode 100755 index 76cacd11b544..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r02.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-m40-pm-common.dtsi" - -#include "sm6150-sec-m40-swa-r02.dtsi" -#include "sm6150-sec-m40-swa-pinctrl-r02.dtsi" -#include "sm6150-sec-m40-battery-common.dtsi" -#include "sm6150-sec-m40-nfc-r00.dtsi" -#include "sm6150-sec-m40-eif-r00.dtsi" -#include "sm6150-sec-m40-display-r01.dtsi" -#include "sm6150-sec-m40-fingerprint_00.dtsi" -#include "sm6150-sec-m40-camera-r01.dtsi" - -/ { - model = "Samsung M40 PROJECT (board-id,02)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 2>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r03.dts deleted file mode 100755 index f2118e46b086..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r03.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-m40-pm-common.dtsi" - -#include "sm6150-sec-m40-swa-r03.dtsi" -#include "sm6150-sec-m40-swa-pinctrl-r03.dtsi" -#include "sm6150-sec-m40-battery-common.dtsi" -#include "sm6150-sec-m40-nfc-r00.dtsi" -#include "sm6150-sec-m40-eif-r00.dtsi" -#include "sm6150-sec-m40-display-r01.dtsi" -#include "sm6150-sec-m40-fingerprint_01.dtsi" -#include "sm6150-sec-m40-camera-r01.dtsi" - -/ { - model = "Samsung M40 PROJECT (board-id,03)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 3>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r04.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r04.dts deleted file mode 100755 index de649933f4c8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r04.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-m40-pm-common.dtsi" - -#include "sm6150-sec-m40-swa-r04.dtsi" -#include "sm6150-sec-m40-swa-pinctrl-r04.dtsi" -#include "sm6150-sec-m40-battery-common.dtsi" -#include "sm6150-sec-m40-nfc-r00.dtsi" -#include "sm6150-sec-m40-eif-r00.dtsi" -#include "sm6150-sec-m40-display-r01.dtsi" -#include "sm6150-sec-m40-fingerprint_01.dtsi" -#include "sm6150-sec-m40-camera-r01.dtsi" - -/ { - model = "Samsung M40 PROJECT (board-id,04)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 4>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r05.dts deleted file mode 100755 index 772b8ffd473d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r05.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-m40-pm-common.dtsi" - -#include "sm6150-sec-m40-swa-r05.dtsi" -#include "sm6150-sec-m40-swa-pinctrl-r05.dtsi" -#include "sm6150-sec-m40-battery-common.dtsi" -#include "sm6150-sec-m40-nfc-r00.dtsi" -#include "sm6150-sec-m40-eif-r00.dtsi" -#include "sm6150-sec-m40-display-r01.dtsi" -#include "sm6150-sec-m40-fingerprint_01.dtsi" -#include "sm6150-sec-m40-camera-r01.dtsi" - -/ { - model = "Samsung M40 PROJECT (board-id,05)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 5>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r06.dts deleted file mode 100755 index 910a5a32f8b4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r06.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-m40-pm-common.dtsi" - -#include "sm6150-sec-m40-swa-r06.dtsi" -#include "sm6150-sec-m40-swa-pinctrl-r06.dtsi" -#include "sm6150-sec-m40-battery-common.dtsi" -#include "sm6150-sec-m40-nfc-r00.dtsi" -#include "sm6150-sec-m40-eif-r00.dtsi" -#include "sm6150-sec-m40-display-r01.dtsi" -#include "sm6150-sec-m40-fingerprint_01.dtsi" -#include "sm6150-sec-m40-camera-r01.dtsi" - -/ { - model = "Samsung M40 PROJECT (board-id,06)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 6>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r08.dts b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r08.dts deleted file mode 100755 index 28f72b3dc70f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-overlay-r08.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "../qcom/sm6150-idp.dtsi" -#include "sm6150-sec-common.dtsi" - -#include "sm6150-sec-m40-pm-common.dtsi" - -#include "sm6150-sec-m40-swa-r08.dtsi" -#include "sm6150-sec-m40-swa-pinctrl-r08.dtsi" -#include "sm6150-sec-m40-battery-common.dtsi" -#include "sm6150-sec-m40-nfc-r00.dtsi" -#include "sm6150-sec-m40-eif-r00.dtsi" -#include "sm6150-sec-m40-display-r01.dtsi" -#include "sm6150-sec-m40-fingerprint_01.dtsi" -#include "sm6150-sec-m40-camera-r01.dtsi" - -/ { - model = "Samsung M40 PROJECT (board-id,08)"; - compatible = "qcom,sm6150p-idp", "qcom,sm6150p", "qcom,idp"; - qcom,msm-id = <355 0x0>; - qcom,board-id = <34 8>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r00.dtsi deleted file mode 100755 index c69aa3ec16f8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r00.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-pinctrl-common.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r01.dtsi deleted file mode 100755 index 06eb3635badb..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-swa-pinctrl-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r02.dtsi deleted file mode 100755 index 35ce6499b736..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-swa-pinctrl-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r03.dtsi deleted file mode 100755 index 57161ad3d2a9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-swa-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r04.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r04.dtsi deleted file mode 100755 index 2358cb209477..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r04.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-swa-pinctrl-r03.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r05.dtsi deleted file mode 100755 index b0ece161e5cc..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r05.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-swa-pinctrl-r04.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r06.dtsi deleted file mode 100755 index d3449a4d6d48..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r06.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-swa-pinctrl-r05.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r08.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r08.dtsi deleted file mode 100755 index b33ea646a999..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-pinctrl-r08.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-swa-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r00.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r00.dtsi deleted file mode 100755 index d0b6d247deaf..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r00.dtsi +++ /dev/null @@ -1,107 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-common.dtsi" -#include "sm6150-sec-m40-input-common.dtsi" - -&soc { - pinctrl@03000000 { - s2mpb03_i2c_sda { - s2mpb03_i2c_sda_default: s2mpb03_i2c_sda_default { - s2mpb03_i2c_sda { - pins = "gpio117"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - s2mpb03_i2c_scl { - s2mpb03_i2c_scl_default: s2mpb03_i2c_scl_default { - s2mpb03_i2c_scl { - pins = "gpio118"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@2 { - cell-index = <2>; - compatible = "i2c-gpio"; - gpios = <&tlmm 117 0 /* sda */ - &tlmm 118 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_sda_default &s2mpb03_i2c_scl_default>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1000000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1100000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1100000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <3200000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2850000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -&novatek_ts { - status = "okay"; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r01.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r01.dtsi deleted file mode 100755 index f25508bb9d5e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r01.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-swa-r00.dtsi" - -&soc { - -}; - -/* not use ufs */ -&ufsphy_mem { - status = "disabled"; -}; -&ufshc_mem { - status = "disabled"; -}; -&ufs_ice { - status = "disabled"; -}; - -/* use eMMC */ -&sdhc_1 { - status = "ok"; -}; - -&firmware { - android { - fstab { - product { - dev = "/dev/block/platform/soc/7c4000.sdhci/by-name/product"; - }; - vendor { - dev = "/dev/block/platform/soc/7c4000.sdhci/by-name/vendor"; - }; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r02.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r02.dtsi deleted file mode 100755 index 5dda74b8bbec..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r02.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-swa-r01.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r03.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r03.dtsi deleted file mode 100755 index 209de888d9dd..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r03.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-swa-r02.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r04.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r04.dtsi deleted file mode 100755 index d637408328e9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r04.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-swa-r03.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r05.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r05.dtsi deleted file mode 100755 index e9a51af7655e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r05.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-swa-r04.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r06.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r06.dtsi deleted file mode 100755 index de109d950cfc..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r06.dtsi +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-swa-r05.dtsi" - -&soc { - -}; - -&sdhc_2 { - /* remove SD card external LDO load switch from the r06 HW version */ - sec,tflash-en-gpio = <>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r08.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r08.dtsi deleted file mode 100755 index 2a613990c567..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-m40-swa-r08.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm6150-sec-m40-swa-r06.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-qg-batterydata-a60q.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-qg-batterydata-a60q.dtsi deleted file mode 100755 index 6177e57f3f85..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-qg-batterydata-a60q.dtsi +++ /dev/null @@ -1,1067 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -qcom,a60q_3400mAh { - /* 3847662_SS_A60CHN_3400mAh_averaged_MasterSlave_Feb14th2019 */ - qcom,max-voltage-uv = <4350000>; - qcom,fg-cc-cv-threshold-uv = <4340000>; - qcom,fastchg-current-ma = <2450>; - qcom,batt-id-kohm = <107>; - qcom,battery-beta = <4250>; - qcom,battery-therm-kohm = <100>; - qcom,battery-type = "A60Q_BATTERY"; - qcom,qg-batt-profile-ver = <100>; - qcom,fih-batt-profile-ver = <2>; - - qcom,jeita-fcc-ranges = <0 59 300000 - 60 159 800000 - 160 399 2450000 - 400 490 1200000>; - - qcom,jeita-fv-ranges = <0 399 4350000 - 400 500 4150000>; - - qcom,step-chg-ranges = <3400000 4089999 2450000 - 4090000 4189999 2450000 - 4190000 4350000 2450000>; - qcom,vbat-avg-based-step-chg; - qcom,taper-fcc; - - /* COOL = 15 DegC, WARM = 41 DegC */ - qcom,jeita-soft-thresholds = <0x45cd 0x2536>; - /* COLD = 0 DegC, HOT = 50 DegC */ - qcom,jeita-hard-thresholds = <0x583d 0x1be6>; - - qcom,qg-batt-aging-enable; - qcom,vfloat-ranges = <0 299 4350000 - 300 399 4330000 - 400 699 4310000 - 700 999 4290000 - 1000 9999 4240000>; - - qcom,vbat-rechg-ranges = <0 299 4280000 - 300 399 4260000 - 400 699 4240000 - 700 999 4220000 - 1000 9999 4170000>; - - qcom,full-condition-soc-ranges = <0 299 93 - 300 399 92 - 400 699 91 - 700 999 90 - 1000 9999 89>; - - qcom,fcc1-temp-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-data = <3160 3283 3388 3432 3444>; - }; - - qcom,fcc2-temp-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-data = <3365 3371 3389 3404 3396 3393>; - }; - - qcom,pc-temp-v1-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <43061 43428 43647 43737 43749>, - <42830 43175 43414 43510 43525>, - <42603 42940 43180 43281 43300>, - <42379 42713 42944 43050 43076>, - <42161 42485 42708 42819 42846>, - <41950 42259 42473 42585 42612>, - <41745 42036 42242 42353 42381>, - <41546 41818 42014 42122 42153>, - <41356 41604 41789 41894 41927>, - <41171 41397 41565 41668 41700>, - <40979 41200 41347 41444 41474>, - <40776 41007 41134 41225 41255>, - <40572 40808 40927 41010 41041>, - <40371 40609 40725 40804 40833>, - <40168 40416 40525 40603 40630>, - <39990 40228 40336 40410 40434>, - <39851 40051 40161 40227 40246>, - <39730 39900 39995 40051 40068>, - <39608 39771 39838 39883 39897>, - <39485 39632 39694 39730 39740>, - <39363 39469 39525 39572 39582>, - <39243 39292 39269 39362 39384>, - <39125 39100 39002 39108 39141>, - <39004 38872 38842 38914 38940>, - <38870 38691 38734 38783 38799>, - <38733 38602 38640 38673 38680>, - <38621 38541 38547 38565 38567>, - <38531 38486 38461 38464 38464>, - <38457 38437 38382 38373 38371>, - <38401 38392 38306 38289 38286>, - <38359 38346 38240 38214 38210>, - <38324 38303 38179 38146 38139>, - <38296 38260 38126 38087 38073>, - <38272 38221 38079 38032 38012>, - <38247 38183 38040 37985 37959>, - <38218 38147 38000 37938 37906>, - <38184 38116 37963 37888 37844>, - <38142 38076 37923 37836 37777>, - <38082 38007 37863 37769 37700>, - <38007 37908 37775 37682 37611>, - <37910 37801 37674 37581 37511>, - <37780 37678 37562 37470 37399>, - <37633 37537 37433 37342 37270>, - <37467 37372 37272 37184 37114>, - <37320 37231 37132 37045 36982>, - <37220 37141 37045 36963 36902>, - <37184 37115 37026 36940 36879>, - <37156 37095 37006 36923 36865>, - <37125 37075 36985 36905 36844>, - <37040 37005 36929 36838 36764>, - <36777 36744 36660 36545 36454>, - <36319 36294 36218 36102 36009>, - <35743 35716 35643 35524 35430>, - <34964 34932 34859 34740 34644>, - <33706 33677 33623 33504 33402>, - <30000 30000 30000 30000 30000>; - }; - - qcom,pc-temp-v2-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <43720 43695 43685 43675 43605 43580>, - <43287 43334 43385 43402 43343 43326>, - <42898 43006 43103 43140 43090 43078>, - <42558 42716 42839 42890 42846 42838>, - <42260 42462 42594 42653 42612 42606>, - <41984 42219 42356 42419 42380 42376>, - <41693 41979 42120 42185 42149 42146>, - <41425 41744 41888 41954 41920 41916>, - <41266 41506 41662 41727 41695 41691>, - <41184 41257 41439 41503 41472 41469>, - <41080 41037 41223 41283 41254 41251>, - <40778 40877 41019 41068 41039 41037>, - <40317 40739 40821 40856 40829 40828>, - <39999 40548 40615 40653 40628 40626>, - <39795 40273 40396 40453 40431 40429>, - <39610 39998 40190 40262 40243 40239>, - <39407 39788 40012 40081 40063 40060>, - <39206 39601 39844 39907 39889 39887>, - <39017 39403 39649 39739 39722 39720>, - <38832 39187 39422 39583 39567 39563>, - <38669 38979 39201 39408 39395 39391>, - <38538 38792 39002 39173 39166 39166>, - <38425 38621 38819 38925 38921 38926>, - <38334 38469 38666 38746 38744 38749>, - <38260 38331 38536 38608 38610 38615>, - <38196 38218 38419 38489 38494 38499>, - <38137 38141 38309 38385 38388 38392>, - <38082 38081 38207 38292 38292 38295>, - <38028 38027 38117 38206 38205 38205>, - <37976 37979 38035 38126 38125 38121>, - <37924 37934 37965 38052 38053 38046>, - <37872 37889 37904 37982 37986 37980>, - <37820 37846 37851 37917 37924 37918>, - <37766 37800 37807 37855 37859 37851>, - <37711 37754 37773 37798 37794 37779>, - <37653 37704 37736 37739 37721 37697>, - <37591 37647 37691 37673 37628 37591>, - <37527 37585 37638 37604 37525 37473>, - <37456 37514 37577 37532 37437 37376>, - <37375 37431 37507 37457 37363 37299>, - <37288 37340 37423 37375 37284 37219>, - <37202 37239 37310 37280 37187 37121>, - <37117 37127 37174 37171 37074 37008>, - <37031 37006 37030 37030 36930 36864>, - <36944 36879 36901 36909 36831 36772>, - <36850 36765 36819 36855 36793 36737>, - <36795 36718 36789 36844 36779 36722>, - <36737 36668 36774 36825 36762 36707>, - <36662 36614 36738 36796 36728 36674>, - <36552 36518 36651 36724 36632 36545>, - <36340 36329 36385 36467 36307 36198>, - <35966 35912 35899 35990 35821 35704>, - <35399 35302 35249 35372 35186 35059>, - <34575 34470 34367 34546 34321 34172>, - <33218 33139 33060 33268 33044 32883>, - <30242 27893 27843 27859 27886 27882>; - }; - - qcom,pc-temp-z1-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <14428 13558 12762 12399 12301>, - <14421 13492 12695 12338 12234>, - <14412 13456 12645 12305 12209>, - <14374 13430 12618 12285 12194>, - <14333 13407 12601 12272 12184>, - <14312 13386 12587 12264 12177>, - <14283 13373 12572 12259 12175>, - <14265 13366 12561 12256 12174>, - <14262 13360 12559 12254 12174>, - <14263 13352 12558 12253 12174>, - <14257 13333 12558 12252 12174>, - <14238 13317 12558 12252 12174>, - <14212 13314 12558 12252 12175>, - <14189 13316 12557 12253 12175>, - <14166 13318 12555 12254 12177>, - <14151 13312 12554 12255 12179>, - <14142 13305 12556 12257 12180>, - <14133 13306 12561 12259 12182>, - <14131 13314 12566 12261 12183>, - <14136 13322 12576 12264 12186>, - <14143 13330 12584 12267 12189>, - <14149 13338 12587 12271 12191>, - <14155 13341 12590 12275 12194>, - <14161 13338 12594 12279 12196>, - <14171 13336 12599 12285 12201>, - <14183 13338 12604 12291 12206>, - <14189 13340 12611 12295 12210>, - <14186 13344 12618 12300 12214>, - <14181 13361 12624 12304 12219>, - <14181 13377 12632 12309 12223>, - <14184 13376 12639 12313 12227>, - <14187 13366 12646 12318 12230>, - <14199 13362 12652 12322 12233>, - <14220 13366 12656 12327 12237>, - <14232 13372 12658 12332 12240>, - <14229 13379 12661 12336 12244>, - <14225 13392 12667 12341 12248>, - <14227 13401 12674 12346 12252>, - <14237 13405 12681 12350 12255>, - <14247 13408 12686 12355 12259>, - <14252 13411 12692 12360 12262>, - <14254 13414 12699 12365 12267>, - <14265 13422 12706 12370 12272>, - <14284 13443 12711 12375 12275>, - <14256 13456 12724 12381 12277>, - <14259 13442 12725 12387 12280>, - <14258 13454 12739 12389 12282>, - <14254 13436 12731 12390 12283>, - <14257 13450 12735 12394 12287>, - <14275 13465 12754 12401 12291>, - <14294 13465 12753 12410 12300>, - <14301 13482 12767 12424 12311>, - <14334 13529 12797 12440 12326>, - <14390 13555 12820 12467 12346>, - <14390 13555 12820 12467 12346>, - <14390 13555 12820 12467 12346>; - }; - - qcom,pc-temp-z2-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <9954 10072 10312 10282 10230>, - <9953 10134 10319 10291 10160>, - <9956 10115 10318 10349 10158>, - <9970 10083 10309 10380 10158>, - <9984 10057 10282 10355 10192>, - <9989 10030 10256 10316 10261>, - <9992 10010 10229 10286 10269>, - <9994 9996 10209 10237 10179>, - <9987 9987 10214 10208 10110>, - <9972 9985 10240 10205 10115>, - <9955 9994 10256 10206 10128>, - <9934 10007 10259 10212 10134>, - <9912 10020 10259 10218 10135>, - <9897 10035 10264 10223 10138>, - <9884 10049 10279 10218 10154>, - <9877 10063 10288 10212 10176>, - <9883 10077 10289 10217 10190>, - <9896 10089 10292 10226 10200>, - <9902 10100 10296 10232 10212>, - <9904 10111 10303 10240 10235>, - <9905 10127 10307 10252 10260>, - <9908 10142 10294 10262 10275>, - <9914 10142 10270 10269 10286>, - <9921 10119 10247 10271 10293>, - <9932 10101 10221 10287 10297>, - <9946 10106 10210 10307 10294>, - <9956 10120 10273 10309 10258>, - <9961 10130 10356 10306 10169>, - <9966 10137 10359 10298 10120>, - <9973 10143 10319 10274 10108>, - <9985 10147 10293 10243 10101>, - <9996 10152 10286 10205 10105>, - <10001 10157 10283 10163 10121>, - <10004 10164 10290 10155 10142>, - <10009 10173 10318 10190 10179>, - <10021 10181 10345 10234 10224>, - <10035 10187 10361 10262 10266>, - <10038 10195 10377 10287 10309>, - <10011 10210 10398 10320 10339>, - <9989 10227 10431 10369 10364>, - <10008 10231 10449 10399 10377>, - <10073 10227 10450 10401 10372>, - <10540 10226 10452 10401 10362>, - <12169 10235 10458 10404 10364>, - <14641 10334 10471 10408 10373>, - <16171 10363 10490 10444 10394>, - <16365 10391 10478 10440 10355>, - <16147 14850 10451 10429 10401>, - <16310 27487 10482 10466 10460>, - <16343 12036 10545 10655 10538>, - <14691 20046 10736 10386 10237>, - <12946 19041 10620 10287 10156>, - <10998 18325 10639 10251 10121>, - <10233 10418 10501 10304 10122>, - <10233 10418 10501 10304 10122>, - <10233 10418 10501 10304 10122>; - }; - - qcom,pc-temp-z3-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <19865 19565 19423 19347 19339>, - <19919 19671 19458 19386 19365>, - <19933 19693 19483 19407 19377>, - <19932 19704 19495 19417 19386>, - <19930 19707 19504 19423 19397>, - <19917 19706 19507 19426 19407>, - <19878 19705 19501 19425 19407>, - <19852 19701 19491 19417 19396>, - <19845 19696 19482 19410 19385>, - <19841 19688 19472 19404 19382>, - <19841 19672 19463 19398 19380>, - <19846 19655 19455 19394 19377>, - <19852 19644 19449 19390 19371>, - <19860 19634 19446 19386 19365>, - <19874 19625 19443 19381 19363>, - <19882 19617 19440 19375 19361>, - <19859 19609 19431 19371 19359>, - <19815 19597 19420 19369 19357>, - <19795 19583 19418 19366 19355>, - <19790 19576 19417 19364 19352>, - <19788 19585 19417 19363 19349>, - <19789 19599 19429 19362 19346>, - <19793 19604 19445 19362 19342>, - <19799 19605 19442 19362 19340>, - <19810 19605 19421 19358 19353>, - <19825 19604 19409 19356 19372>, - <19830 19601 19416 19371 19381>, - <19826 19598 19429 19400 19389>, - <19819 19595 19441 19409 19391>, - <19811 19592 19456 19407 19386>, - <19803 19592 19463 19404 19377>, - <19793 19593 19460 19399 19372>, - <19782 19593 19454 19392 19368>, - <19768 19592 19449 19385 19363>, - <19755 19589 19443 19379 19355>, - <19743 19585 19437 19373 19350>, - <19730 19579 19433 19369 19349>, - <19700 19573 19429 19366 19349>, - <19583 19567 19425 19364 19349>, - <19479 19561 19421 19363 19351>, - <19410 19556 19418 19362 19352>, - <19283 19551 19414 19360 19351>, - <19261 19544 19411 19358 19348>, - <19258 19531 19407 19357 19351>, - <19257 19494 19396 19356 19348>, - <19257 19480 19391 19345 19336>, - <19257 19459 19370 19343 19335>, - <19257 19399 19376 19342 19323>, - <19257 19267 19371 19328 19318>, - <19257 19338 19360 19318 19316>, - <19257 19340 19341 19356 19353>, - <19257 19310 19353 19358 19356>, - <19259 19308 19344 19363 19359>, - <19261 19348 19356 19340 19349>, - <19261 19348 19356 19340 19349>, - <19261 19348 19356 19340 19349>; - }; - - qcom,pc-temp-z4-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <16452 15609 15216 14914 14824>, - <16262 15692 15137 14967 14900>, - <16075 15551 15065 14933 14883>, - <15880 15338 14999 14894 14859>, - <15709 15207 14938 14861 14832>, - <15590 15112 14889 14830 14801>, - <15498 15036 14851 14805 14781>, - <15415 14975 14821 14784 14769>, - <15335 14925 14801 14769 14759>, - <15261 14885 14785 14759 14749>, - <15191 14851 14773 14751 14740>, - <15122 14826 14764 14741 14732>, - <15061 14810 14755 14731 14726>, - <15011 14799 14746 14723 14719>, - <14966 14792 14735 14716 14710>, - <14933 14790 14727 14709 14700>, - <14915 14787 14722 14701 14691>, - <14902 14780 14717 14692 14682>, - <14887 14765 14711 14686 14677>, - <14868 14757 14703 14681 14674>, - <14850 14763 14700 14679 14673>, - <14838 14780 14777 14715 14698>, - <14827 14815 14884 14825 14799>, - <14822 14917 14907 14871 14850>, - <14831 14992 14910 14866 14830>, - <14853 14981 14905 14854 14796>, - <14869 14949 14880 14826 14770>, - <14880 14919 14840 14773 14745>, - <14888 14892 14806 14742 14727>, - <14888 14865 14772 14726 14716>, - <14875 14842 14749 14715 14708>, - <14859 14819 14738 14707 14699>, - <14845 14803 14731 14701 14691>, - <14830 14792 14727 14699 14687>, - <14817 14783 14724 14698 14686>, - <14804 14774 14722 14698 14686>, - <14794 14764 14723 14701 14690>, - <14805 14759 14724 14708 14701>, - <14912 14762 14728 14715 14707>, - <15008 14765 14738 14723 14710>, - <15070 14765 14744 14728 14711>, - <15196 14751 14733 14721 14707>, - <15208 14742 14722 14712 14700>, - <15186 14739 14722 14716 14704>, - <15075 14716 14712 14708 14701>, - <15065 14703 14690 14694 14684>, - <15060 14708 14691 14679 14671>, - <15051 14760 14666 14659 14660>, - <15038 14899 14657 14651 14643>, - <15030 14818 14672 14666 14649>, - <15036 14824 14720 14660 14649>, - <15063 14874 14712 14662 14650>, - <15080 14884 14726 14660 14650>, - <15097 14855 14716 14686 14660>, - <15097 14855 14716 14686 14660>, - <15097 14855 14716 14686 14660>; - }; - - qcom,pc-temp-z5-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <13067 13427 13992 13847 14641>, - <13329 14498 14832 15347 15592>, - <13574 15086 15600 16387 16294>, - <13857 15561 16316 17047 16947>, - <14072 16130 17054 17524 18069>, - <14105 16758 17480 17932 19289>, - <14049 17407 17674 18197 19505>, - <14033 18173 17863 18465 18902>, - <14153 19022 18112 18544 18438>, - <14382 19750 18439 18530 18725>, - <14671 20546 18616 18568 19261>, - <15090 21283 18666 18743 19359>, - <15661 22107 18796 19235 19189>, - <16641 23200 19258 19441 19074>, - <18322 23682 20209 19342 19512>, - <19311 23384 20674 19419 20456>, - <18792 23009 20358 19923 21421>, - <17804 23057 19945 20796 22562>, - <17481 23176 20085 21699 23616>, - <18119 23416 21158 22825 24644>, - <19254 28360 22821 23683 25421>, - <20583 35581 27600 23373 24554>, - <22470 37063 32849 21939 20509>, - <25012 36348 31590 20554 17765>, - <30035 35305 23116 17480 16724>, - <36817 33264 18193 14900 16096>, - <39379 30046 17911 15527 16659>, - <38823 28073 17879 17704 18450>, - <37807 26923 18597 19656 19687>, - <36688 26271 21327 21330 20164>, - <35230 26616 24176 22864 20619>, - <33563 28051 26568 24164 21593>, - <31557 29768 28736 25330 23098>, - <29202 32299 30325 26315 24104>, - <27556 34683 31698 27339 24756>, - <26385 35230 32263 27925 25119>, - <25313 35377 32059 27439 25094>, - <24137 35436 31580 26106 24949>, - <20458 35019 30498 24661 24653>, - <17201 34065 27687 22800 23551>, - <15137 33181 25591 21341 22315>, - <11475 32087 24993 20763 21522>, - <10929 30409 24414 20289 20926>, - <10949 27216 22947 19283 20599>, - <11103 25680 22306 19418 19604>, - <11073 24198 22849 18159 17942>, - <11058 19660 18501 18745 18440>, - <11027 15884 20796 20523 18040>, - <11020 11272 20876 19051 19444>, - <11066 12576 18099 16092 17522>, - <11105 13785 14386 19344 22325>, - <11066 12143 14736 18683 21663>, - <11007 11857 13836 19079 21115>, - <10940 12155 14331 14504 16923>, - <10940 12155 14331 14504 16923>, - <10940 12155 14331 14504 16923>; - }; - - qcom,pc-temp-z6-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <16839 15737 15079 14834 14772>, - <16711 15790 15051 14865 14807>, - <16582 15712 15023 14855 14802>, - <16447 15592 14997 14843 14796>, - <16323 15512 14971 14831 14789>, - <16222 15450 14947 14818 14781>, - <16134 15397 14925 14805 14772>, - <16060 15354 14905 14791 14760>, - <16001 15318 14889 14780 14750>, - <15949 15285 14876 14772 14744>, - <15899 15254 14866 14765 14739>, - <15846 15229 14857 14759 14733>, - <15800 15210 14850 14752 14727>, - <15768 15195 14843 14746 14721>, - <15744 15185 14837 14740 14716>, - <15722 15178 14832 14734 14711>, - <15696 15173 14824 14729 14706>, - <15671 15165 14818 14723 14701>, - <15657 15155 14815 14720 14697>, - <15649 15150 14812 14717 14695>, - <15644 15157 14812 14716 14693>, - <15644 15173 14853 14732 14703>, - <15646 15197 14909 14781 14745>, - <15649 15244 14916 14800 14767>, - <15660 15276 14909 14797 14765>, - <15681 15271 14903 14793 14763>, - <15692 15258 14896 14788 14759>, - <15695 15246 14889 14782 14753>, - <15697 15235 14882 14776 14747>, - <15696 15226 14877 14770 14739>, - <15688 15217 14871 14764 14732>, - <15678 15209 14866 14758 14726>, - <15670 15204 14861 14752 14721>, - <15661 15200 14857 14747 14716>, - <15653 15197 14852 14743 14711>, - <15646 15195 14850 14741 14709>, - <15639 15192 14850 14741 14710>, - <15636 15191 14850 14743 14714>, - <15632 15193 14850 14744 14718>, - <15630 15197 14854 14748 14721>, - <15629 15198 14856 14751 14722>, - <15628 15195 14852 14747 14720>, - <15630 15194 14847 14743 14717>, - <15633 15195 14847 14745 14720>, - <15597 15179 14840 14743 14718>, - <15599 15170 14829 14732 14705>, - <15598 15164 14819 14725 14699>, - <15597 15159 14812 14715 14689>, - <15597 15156 14807 14705 14678>, - <15600 15160 14810 14707 14680>, - <15616 15175 14825 14727 14702>, - <15643 15192 14831 14732 14707>, - <15672 15208 14838 14738 14712>, - <15713 15234 14848 14743 14716>, - <15713 15234 14848 14743 14716>, - <15713 15234 14848 14743 14716>; - }; - - qcom,pc-temp-y1-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <7431 6658 6171 5723 5528 5453>, - <7426 6657 6183 5721 5529 5456>, - <7416 6657 6191 5717 5530 5457>, - <7406 6657 6195 5714 5530 5458>, - <7397 6657 6196 5710 5529 5459>, - <7392 6658 6196 5709 5528 5459>, - <7391 6665 6193 5708 5525 5459>, - <7391 6677 6187 5706 5522 5458>, - <7392 6679 6186 5706 5521 5457>, - <7400 6672 6185 5703 5520 5456>, - <7409 6667 6185 5702 5520 5456>, - <7416 6671 6187 5702 5520 5456>, - <7422 6679 6191 5703 5521 5457>, - <7423 6688 6191 5703 5521 5457>, - <7422 6703 6186 5702 5521 5457>, - <7419 6714 6182 5701 5522 5458>, - <7412 6710 6186 5702 5523 5460>, - <7400 6702 6193 5703 5524 5463>, - <7397 6701 6196 5704 5526 5464>, - <7407 6714 6197 5706 5529 5464>, - <7415 6726 6199 5709 5531 5464>, - <7411 6726 6201 5711 5531 5466>, - <7399 6720 6203 5715 5531 5468>, - <7395 6716 6203 5717 5532 5470>, - <7405 6703 6199 5720 5535 5471>, - <7416 6691 6196 5723 5539 5472>, - <7415 6694 6198 5727 5541 5474>, - <7410 6703 6200 5732 5543 5477>, - <7408 6706 6203 5736 5545 5479>, - <7408 6701 6207 5740 5548 5481>, - <7408 6695 6210 5744 5550 5483>, - <7404 6699 6214 5750 5553 5486>, - <7392 6708 6220 5756 5556 5489>, - <7387 6712 6222 5759 5558 5492>, - <7397 6707 6220 5762 5561 5494>, - <7409 6701 6220 5764 5564 5495>, - <7410 6703 6221 5770 5568 5497>, - <7408 6711 6223 5776 5572 5498>, - <7405 6715 6227 5779 5575 5500>, - <7410 6710 6236 5780 5577 5504>, - <7417 6705 6248 5783 5579 5508>, - <7416 6704 6258 5786 5581 5508>, - <7411 6703 6266 5790 5583 5509>, - <7405 6705 6254 5794 5585 5512>, - <7395 6715 6254 5802 5588 5515>, - <7422 6735 6264 5804 5594 5519>, - <7428 6743 6263 5807 5593 5519>, - <7431 6777 6256 5806 5594 5519>, - <7432 6768 6271 5807 5595 5520>, - <7423 6743 6263 5811 5596 5522>, - <7456 6767 6271 5817 5600 5526>, - <7451 6769 6295 5823 5609 5534>, - <7489 6795 6327 5841 5622 5544>, - <7520 6834 6334 5866 5638 5558>, - <7520 6834 6334 5866 5638 5558>, - <7520 6834 6334 5866 5638 5558>; - }; - - qcom,pc-temp-y2-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <9653 10274 10831 11076 11088 10990>, - <9654 10329 10804 11072 11060 10983>, - <9655 10374 10778 11058 11019 10963>, - <9656 10407 10754 11037 10976 10936>, - <9656 10428 10731 11014 10940 10911>, - <9657 10436 10711 10993 10919 10894>, - <9658 10424 10691 10967 10912 10879>, - <9658 10403 10674 10940 10907 10861>, - <9659 10409 10667 10930 10901 10850>, - <9660 10483 10665 10916 10893 10835>, - <9660 10539 10664 10908 10889 10826>, - <9660 10526 10669 10913 10887 10834>, - <9659 10501 10679 10921 10881 10849>, - <9658 10502 10697 10918 10871 10852>, - <9658 10556 10740 10902 10858 10849>, - <9658 10600 10779 10895 10847 10841>, - <9658 10603 10806 10915 10842 10823>, - <9658 10604 10829 10951 10843 10803>, - <9658 10605 10829 11001 10873 10813>, - <9657 10607 10808 11079 10997 10896>, - <9657 10612 10792 11119 11085 10959>, - <9657 10620 10800 11080 11080 10957>, - <9657 10632 10819 11022 11057 10945>, - <9656 10603 10839 11017 11049 10955>, - <9656 10229 10867 11043 11032 10977>, - <9656 9865 10892 11073 11020 11002>, - <9656 9812 10907 11107 11055 11027>, - <9655 9789 10920 11139 11114 11053>, - <9655 9773 10929 11153 11133 11076>, - <9654 9748 10938 11161 11130 11103>, - <9654 9722 10943 11165 11126 11122>, - <9654 9703 10946 11165 11139 11127>, - <9654 9686 10947 11162 11165 11130>, - <9653 9677 10942 11161 11181 11138>, - <9653 9672 10919 11161 11194 11155>, - <9653 9669 10887 11161 11199 11168>, - <9653 9665 10855 11159 11177 11166>, - <9653 9662 10817 11158 11141 11157>, - <9653 9660 10772 11164 11134 11144>, - <9653 9659 10715 11176 11138 11109>, - <9653 9657 10644 11184 11141 11082>, - <9653 9656 10423 11178 11146 11072>, - <9653 9655 10149 11167 11154 11067>, - <9653 9654 10177 11146 11160 11111>, - <9652 9654 10153 11103 11128 11096>, - <9652 9653 10002 11102 11067 10951>, - <9652 9653 9979 11030 11029 10878>, - <9652 9653 10207 11080 10996 10853>, - <9652 9653 10259 11075 10984 10835>, - <9652 9653 10245 11009 10972 10860>, - <9652 9652 9962 10995 10952 10833>, - <9652 9652 9758 10943 10907 10760>, - <9651 9651 9692 10898 10822 10724>, - <9651 9651 9671 10790 10694 10598>, - <9651 9651 9671 10790 10694 10598>, - <9651 9651 9671 10790 10694 10598>; - }; - - qcom,pc-temp-y3-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <14200 13457 13348 13294 13278 13274>, - <14159 13462 13352 13294 13279 13275>, - <14114 13471 13355 13295 13280 13277>, - <14065 13480 13359 13295 13281 13278>, - <14013 13488 13362 13295 13281 13279>, - <13959 13492 13365 13295 13282 13280>, - <13889 13494 13368 13295 13282 13279>, - <13821 13494 13370 13295 13282 13279>, - <13805 13493 13373 13295 13282 13279>, - <13812 13481 13375 13295 13283 13280>, - <13816 13470 13377 13295 13283 13281>, - <13790 13465 13378 13296 13283 13281>, - <13738 13461 13379 13297 13283 13281>, - <13703 13457 13379 13298 13283 13281>, - <13675 13453 13374 13302 13286 13281>, - <13651 13449 13369 13305 13288 13280>, - <13634 13440 13367 13306 13289 13282>, - <13619 13428 13365 13308 13289 13284>, - <13614 13417 13362 13309 13291 13286>, - <13612 13407 13353 13310 13294 13289>, - <13611 13398 13344 13311 13297 13291>, - <13613 13390 13339 13306 13292 13286>, - <13621 13384 13334 13297 13283 13279>, - <13632 13369 13332 13292 13280 13278>, - <13658 13314 13331 13287 13280 13278>, - <13692 13268 13330 13285 13279 13278>, - <13728 13267 13327 13287 13279 13278>, - <13768 13269 13322 13290 13278 13277>, - <13812 13271 13321 13292 13278 13277>, - <13859 13276 13321 13293 13279 13276>, - <13911 13283 13322 13293 13280 13276>, - <13970 13297 13321 13292 13280 13276>, - <14036 13323 13320 13292 13280 13277>, - <14103 13350 13320 13292 13280 13277>, - <14172 13376 13325 13292 13281 13277>, - <14242 13405 13329 13292 13281 13277>, - <14315 13441 13331 13292 13280 13277>, - <14391 13484 13332 13291 13278 13276>, - <14463 13534 13334 13290 13278 13276>, - <14530 13593 13339 13287 13278 13276>, - <14594 13660 13344 13285 13278 13276>, - <14661 13737 13342 13289 13278 13277>, - <14730 13828 13339 13292 13278 13277>, - <14805 13933 13345 13290 13278 13276>, - <14887 14049 13353 13290 13278 13276>, - <14972 14129 13358 13286 13281 13279>, - <14905 14096 13362 13291 13282 13280>, - <15003 14165 13382 13292 13286 13286>, - <15097 14251 13398 13298 13289 13288>, - <15205 14326 13412 13302 13291 13286>, - <15323 14409 13412 13298 13286 13284>, - <15479 14491 13427 13299 13286 13285>, - <15697 14698 13476 13303 13288 13287>, - <16155 14978 13569 13311 13295 13291>, - <16155 14978 13569 13311 13295 13291>, - <16155 14978 13569 13311 13295 13291>; - }; - - qcom,pc-temp-y4-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <17401 16867 16710 16497 16467 16465>, - <17477 16936 16722 16492 16466 16462>, - <17554 17025 16745 16491 16466 16461>, - <17627 17117 16772 16491 16466 16460>, - <17692 17194 16794 16493 16466 16459>, - <17742 17238 16804 16496 16466 16459>, - <17774 17253 16803 16501 16468 16460>, - <17802 17263 16802 16507 16471 16463>, - <17875 17275 16802 16514 16475 16465>, - <18089 17290 16806 16521 16479 16468>, - <18240 17312 16814 16529 16485 16471>, - <18017 17412 16832 16537 16491 16475>, - <17569 17564 16863 16547 16499 16481>, - <17403 17578 16889 16557 16506 16488>, - <17373 17381 16915 16567 16512 16496>, - <17346 17207 16939 16581 16519 16504>, - <17293 17180 16968 16602 16531 16513>, - <17222 17167 16995 16630 16547 16522>, - <17150 17134 16988 16668 16571 16539>, - <17065 17035 16898 16721 16613 16570>, - <16999 16923 16796 16748 16636 16589>, - <16975 16828 16718 16666 16588 16555>, - <16959 16742 16650 16542 16507 16495>, - <16950 16723 16617 16507 16481 16473>, - <16943 16764 16599 16496 16472 16466>, - <16939 16805 16588 16492 16468 16463>, - <16940 16812 16580 16493 16470 16464>, - <16944 16813 16574 16493 16474 16467>, - <16948 16813 16566 16495 16480 16471>, - <16955 16819 16555 16503 16488 16479>, - <16966 16823 16548 16511 16497 16488>, - <16975 16821 16547 16521 16511 16501>, - <16985 16816 16547 16530 16525 16515>, - <16995 16815 16550 16534 16529 16519>, - <17005 16827 16565 16536 16530 16519>, - <17012 16843 16584 16537 16531 16518>, - <17014 16854 16602 16523 16512 16502>, - <17014 16864 16622 16503 16482 16477>, - <17014 16868 16642 16496 16476 16472>, - <17014 16867 16662 16493 16477 16472>, - <17013 16865 16680 16491 16478 16473>, - <17016 16866 16696 16491 16477 16472>, - <17026 16871 16710 16491 16474 16469>, - <17049 16885 16689 16495 16466 16457>, - <17093 16923 16680 16488 16463 16454>, - <17131 16972 16702 16496 16469 16464>, - <17088 16968 16728 16508 16482 16480>, - <17122 17047 16770 16525 16502 16507>, - <17169 17125 16834 16550 16534 16548>, - <17216 17205 16917 16576 16543 16518>, - <17210 17253 16892 16537 16474 16466>, - <17162 17212 16868 16516 16475 16466>, - <17145 17209 16907 16535 16486 16476>, - <17248 17260 16988 16594 16536 16524>, - <17248 17260 16988 16594 16536 16524>, - <17248 17260 16988 16594 16536 16524>; - }; - - qcom,pc-temp-y5-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <9680 12999 15496 17492 15414 14304>, - <10310 13244 15456 17018 15701 15493>, - <10826 13594 15413 16531 15770 16216>, - <11213 13970 15368 16034 15700 16589>, - <11458 14288 15326 15533 15570 16728>, - <11549 14467 15289 15030 15456 16748>, - <11412 14538 15262 14485 15095 16244>, - <11175 14586 15232 13960 14511 15342>, - <11354 14441 15159 13582 14161 14897>, - <12996 13412 14949 13283 13893 14687>, - <14260 12639 14670 13049 13632 14472>, - <13823 13406 14208 12837 13280 14161>, - <12899 14896 13706 12681 12950 13812>, - <12496 15438 13635 12703 12942 13467>, - <12353 15557 13847 12931 13215 13076>, - <12274 15657 14173 13086 13396 12874>, - <12221 15808 14745 13086 13264 12960>, - <12128 15993 15508 13076 13052 13165>, - <11996 16178 16033 13293 13129 13434>, - <11726 16388 16439 14341 13860 13929>, - <11416 16551 16700 15345 14623 14410>, - <11133 16633 16771 16043 15173 14877>, - <10862 16689 16773 16560 15643 15480>, - <10783 16447 16886 16344 15850 16126>, - <10801 13538 17311 14995 15982 16975>, - <10827 10786 17610 14185 16039 17451>, - <10861 10575 17065 14957 15751 17096>, - <10913 10600 16076 16164 15270 16333>, - <10933 10621 15915 16664 15156 15658>, - <10941 10647 16523 16982 15299 14933>, - <10962 10713 16987 17114 15410 14541>, - <11004 10873 16698 16969 15415 14625>, - <11066 11144 16153 16763 15458 14835>, - <11129 11320 16116 16860 15690 15153>, - <11186 11447 16905 17454 16466 15902>, - <11247 11561 17524 17885 16973 16439>, - <11335 11644 17234 18113 16865 16493>, - <11451 11725 16634 18265 16607 16475>, - <11498 11760 16431 17724 16279 16395>, - <11372 11769 16510 15835 15756 16201>, - <11196 11773 16596 14790 15427 16030>, - <11128 11764 15721 16224 15411 15908>, - <11095 11735 14440 17414 15420 15834>, - <11087 11687 14222 16421 15596 16926>, - <11096 11608 14070 16358 15833 16944>, - <11244 11579 13408 14300 15343 15611>, - <11211 11624 13202 15212 14742 14931>, - <11397 11595 14536 14258 15472 15737>, - <11519 12028 14834 14609 15205 15333>, - <11691 12370 14872 15108 15089 15033>, - <11700 12651 13771 14977 16281 16723>, - <11512 12051 12479 16195 15680 16929>, - <11199 11447 11736 16068 16132 17247>, - <10820 11262 11673 17274 18370 18447>, - <10820 11262 11673 17274 18370 18447>, - <10820 11262 11673 17274 18370 18447>; - }; - - qcom,pc-temp-y6-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <7193 5961 5414 5100 5056 5044>, - <7158 5970 5415 5099 5056 5045>, - <7122 5975 5416 5099 5056 5046>, - <7084 5977 5416 5099 5057 5046>, - <7047 5978 5416 5099 5057 5047>, - <7008 5978 5416 5100 5058 5047>, - <6959 5975 5413 5101 5059 5048>, - <6914 5966 5407 5102 5060 5048>, - <6911 5956 5404 5103 5061 5049>, - <6960 5941 5402 5105 5062 5050>, - <6997 5931 5401 5108 5064 5052>, - <6922 5949 5403 5110 5066 5054>, - <6767 5983 5409 5113 5068 5055>, - <6696 5985 5411 5117 5071 5057>, - <6671 5933 5413 5122 5074 5059>, - <6651 5882 5415 5128 5078 5062>, - <6629 5866 5419 5136 5082 5065>, - <6607 5857 5426 5145 5087 5070>, - <6587 5840 5422 5156 5095 5076>, - <6565 5808 5390 5172 5109 5087>, - <6552 5775 5354 5181 5118 5094>, - <6554 5752 5328 5154 5100 5081>, - <6561 5733 5306 5112 5071 5058>, - <6571 5721 5298 5099 5061 5051>, - <6591 5712 5294 5093 5058 5049>, - <6618 5707 5291 5091 5057 5048>, - <6647 5714 5289 5092 5057 5048>, - <6682 5735 5288 5095 5058 5049>, - <6719 5758 5287 5098 5060 5050>, - <6760 5783 5288 5101 5063 5052>, - <6804 5812 5289 5104 5067 5054>, - <6851 5846 5291 5107 5071 5058>, - <6902 5887 5296 5110 5075 5063>, - <6955 5932 5302 5112 5077 5065>, - <7009 5980 5315 5114 5078 5065>, - <7065 6032 5331 5115 5078 5065>, - <7120 6088 5347 5112 5073 5061>, - <7176 6148 5364 5106 5064 5053>, - <7230 6211 5384 5104 5062 5051>, - <7280 6278 5410 5102 5062 5052>, - <7329 6348 5436 5101 5062 5053>, - <7382 6425 5461 5104 5063 5053>, - <7438 6508 5486 5107 5063 5052>, - <7503 6604 5516 5109 5060 5049>, - <7578 6710 5559 5107 5060 5048>, - <7655 6791 5580 5108 5064 5054>, - <7602 6769 5597 5116 5069 5059>, - <7683 6845 5646 5122 5078 5071>, - <7768 6937 5696 5133 5090 5085>, - <7868 7020 5751 5145 5093 5075>, - <7962 7106 5760 5132 5070 5059>, - <8076 7167 5794 5128 5072 5061>, - <8251 7338 5898 5140 5078 5067>, - <8678 7577 6055 5167 5099 5085>, - <8678 7577 6055 5167 5099 5085>, - <8678 7577 6055 5167 5099 5085>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm6150-sec-qg-batterydata-a70q.dtsi b/arch/arm64/boot/dts/samsung/sm6150-sec-qg-batterydata-a70q.dtsi deleted file mode 100755 index b5cd847e043f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm6150-sec-qg-batterydata-a70q.dtsi +++ /dev/null @@ -1,1067 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -qcom,a70q_4400mAh { - /* A70Q BATTERY */ - qcom,max-voltage-uv = <4350000>; - qcom,fg-cc-cv-threshold-uv = <4340000>; - qcom,fastchg-current-ma = <3950>; - qcom,batt-id-kohm = <107>; - qcom,battery-beta = <4250>; - qcom,battery-therm-kohm = <100>; - qcom,battery-type = "A70Q_BATTERY"; - qcom,qg-batt-profile-ver = <100>; - qcom,fih-batt-profile-ver = <3>; - - qcom,jeita-fcc-ranges = <0 59 400000 - 60 159 1050000 - 160 189 3150000 - 190 399 3950000 - 400 490 1550000>; - - qcom,jeita-fv-ranges = <0 399 4350000 - 400 500 4150000>; - - qcom,step-chg-ranges = <3500000 4219999 3950000 - 4220000 4350000 3150000>; - qcom,vbat-avg-based-step-chg; - qcom,taper-fcc; - - /* COOL = 18 DegC, WARM = 41 DegC */ - qcom,jeita-soft-thresholds = <0x4205 0x24EC>; - /* COLD = 0 DegC, HOT = 50 DegC */ - qcom,jeita-hard-thresholds = <0x57F0 0x1C52>; - - qcom,qg-batt-aging-enable; - qcom,vfloat-ranges = <0 299 4350000 - 300 399 4330000 - 400 699 4310000 - 700 999 4290000 - 1000 9999 4240000>; - - qcom,vbat-rechg-ranges = <0 299 4280000 - 300 399 4260000 - 400 699 4240000 - 700 999 4220000 - 1000 9999 4170000>; - - qcom,full-condition-soc-ranges = <0 299 93 - 300 399 92 - 400 699 91 - 700 999 90 - 1000 9999 89>; - - qcom,fcc1-temp-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-data = <3806 4043 4238 4296 4314>; - }; - - qcom,fcc2-temp-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-data = <4210 4203 4220 4258 4231 4226>; - }; - - qcom,pc-temp-v1-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <41959 42447 42839 42945 42978>, - <41782 42242 42614 42719 42750>, - <41605 42051 42393 42496 42527>, - <41430 41866 42178 42277 42309>, - <41272 41682 41975 42062 42094>, - <41142 41495 41781 41853 41882>, - <41010 41316 41590 41649 41673>, - <40823 41160 41392 41445 41467>, - <40498 41034 41201 41241 41260>, - <40160 40886 41036 41051 41060>, - <39964 40632 40896 40892 40881>, - <39846 40279 40734 40742 40713>, - <39750 40020 40462 40549 40533>, - <39657 39890 40137 40280 40326>, - <39574 39792 39938 40041 40124>, - <39491 39699 39838 39900 39960>, - <39398 39614 39751 39796 39820>, - <39298 39525 39642 39679 39682>, - <39197 39409 39522 39550 39549>, - <39093 39263 39372 39406 39411>, - <38987 39103 39143 39217 39232>, - <38886 38914 38900 38983 39005>, - <38791 38712 38754 38799 38813>, - <38701 38582 38658 38678 38681>, - <38615 38512 38575 38578 38573>, - <38531 38461 38493 38485 38477>, - <38450 38413 38417 38400 38390>, - <38389 38370 38349 38323 38311>, - <38343 38332 38287 38252 38237>, - <38306 38298 38230 38187 38169>, - <38278 38266 38181 38131 38109>, - <38257 38238 38136 38080 38057>, - <38239 38211 38097 38033 38008>, - <38220 38187 38065 37994 37962>, - <38203 38163 38036 37958 37919>, - <38182 38142 38004 37917 37871>, - <38151 38117 37973 37873 37818>, - <38102 38074 37934 37823 37758>, - <38036 37998 37872 37756 37687>, - <37953 37906 37787 37672 37603>, - <37839 37806 37692 37578 37507>, - <37711 37688 37582 37469 37394>, - <37565 37548 37453 37343 37265>, - <37430 37396 37300 37188 37110>, - <37320 37270 37170 37066 36996>, - <37266 37192 37089 36989 36925>, - <37275 37172 37067 36967 36905>, - <37247 37151 37051 36953 36889>, - <37221 37128 37032 36935 36870>, - <37132 37062 36987 36886 36815>, - <36846 36834 36767 36638 36540>, - <36403 36395 36332 36205 36109>, - <35851 35839 35775 35647 35549>, - <35128 35098 35023 34888 34788>, - <33884 33898 33847 33712 33611>, - <30000 30000 30000 30000 30000>; - }; - - qcom,pc-temp-v2-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <42875 42855 42845 42865 42765 42745>, - <42544 42508 42541 42590 42507 42497>, - <42243 42183 42262 42333 42263 42260>, - <41971 41871 42012 42098 42035 42034>, - <41705 41526 41790 41884 41822 41820>, - <41504 41298 41580 41677 41616 41612>, - <41414 41268 41364 41464 41407 41405>, - <41362 41258 41150 41253 41199 41201>, - <41255 41231 40972 41067 41007 41005>, - <40701 40914 40851 40922 40844 40816>, - <40038 40439 40727 40770 40680 40630>, - <39824 40122 40497 40544 40470 40433>, - <39754 39879 40103 40240 40208 40225>, - <39672 39686 39797 39998 39992 40040>, - <39508 39548 39676 39848 39862 39893>, - <39281 39434 39590 39726 39756 39763>, - <39032 39306 39480 39610 39635 39628>, - <38712 39164 39341 39504 39503 39493>, - <38449 38998 39184 39384 39356 39346>, - <38349 38754 39003 39210 39173 39166>, - <38292 38424 38800 38998 38959 38956>, - <38244 38216 38626 38809 38773 38772>, - <38199 38144 38488 38640 38619 38620>, - <38158 38096 38367 38494 38486 38488>, - <38117 38055 38262 38383 38378 38379>, - <38078 38019 38169 38291 38288 38288>, - <38038 37987 38084 38208 38206 38204>, - <37998 37958 38000 38132 38130 38127>, - <37958 37929 37926 38061 38059 38055>, - <37918 37899 37880 37996 37996 37990>, - <37880 37868 37853 37935 37940 37932>, - <37842 37837 37830 37880 37887 37877>, - <37800 37804 37805 37831 37836 37825>, - <37756 37768 37776 37786 37784 37775>, - <37710 37730 37744 37741 37725 37712>, - <37661 37689 37703 37699 37648 37615>, - <37609 37642 37657 37652 37565 37508>, - <37552 37588 37603 37593 37491 37423>, - <37488 37522 37536 37523 37423 37353>, - <37418 37449 37459 37448 37350 37281>, - <37338 37369 37368 37368 37268 37198>, - <37249 37279 37263 37276 37174 37106>, - <37165 37184 37157 37156 37061 36997>, - <37090 37081 37052 37014 36920 36859>, - <37015 36978 36955 36923 36841 36782>, - <36940 36882 36874 36873 36811 36756>, - <36899 36834 36835 36856 36797 36744>, - <36851 36784 36793 36838 36781 36728>, - <36789 36725 36739 36808 36750 36697>, - <36688 36633 36650 36742 36665 36584>, - <36490 36449 36461 36529 36361 36259>, - <36130 36113 36099 36083 35891 35776>, - <35582 35592 35542 35490 35276 35150>, - <34791 34837 34763 34688 34429 34282>, - <33566 33623 33591 33442 33201 33031>, - <28481 28300 28229 28279 28273 28212>; - }; - - qcom,pc-temp-z1-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <13737 12866 12234 11974 11893>, - <13635 12823 12226 11978 11897>, - <13620 12826 12224 11976 11898>, - <13612 12837 12223 11974 11899>, - <13607 12841 12221 11973 11900>, - <13604 12836 12219 11974 11901>, - <13602 12827 12219 11974 11901>, - <13592 12822 12221 11974 11901>, - <13558 12821 12223 11974 11901>, - <13522 12820 12223 11973 11901>, - <13508 12813 12218 11972 11900>, - <13502 12802 12213 11969 11898>, - <13498 12796 12208 11966 11897>, - <13500 12796 12202 11962 11896>, - <13513 12797 12201 11960 11896>, - <13529 12800 12205 11961 11896>, - <13545 12812 12210 11965 11898>, - <13564 12824 12215 11967 11899>, - <13578 12830 12219 11969 11900>, - <13582 12834 12222 11970 11902>, - <13584 12838 12224 11972 11903>, - <13586 12845 12226 11974 11905>, - <13590 12855 12230 11977 11907>, - <13597 12861 12236 11980 11910>, - <13603 12866 12241 11983 11913>, - <13608 12870 12244 11986 11916>, - <13614 12872 12247 11989 11918>, - <13621 12876 12251 11993 11920>, - <13633 12878 12256 11996 11922>, - <13644 12878 12260 11999 11925>, - <13649 12878 12263 12002 11927>, - <13648 12879 12266 12005 11929>, - <13646 12882 12268 12008 11932>, - <13647 12886 12269 12011 11934>, - <13653 12892 12271 12014 11937>, - <13661 12906 12273 12017 11940>, - <13675 12918 12275 12019 11943>, - <13708 12921 12279 12022 11946>, - <13738 12922 12283 12025 11948>, - <13741 12923 12287 12029 11951>, - <13728 12926 12291 12032 11954>, - <13713 12931 12296 12035 11957>, - <13683 12940 12301 12038 11960>, - <13675 12949 12306 12042 11962>, - <13689 12951 12312 12044 11964>, - <13676 12953 12311 12046 11964>, - <13665 12951 12317 12045 11964>, - <13678 12947 12309 12046 11965>, - <13684 12949 12310 12049 11966>, - <13684 12950 12316 12052 11970>, - <13708 12966 12321 12058 11977>, - <13722 12985 12332 12069 11986>, - <13717 12989 12347 12080 11996>, - <13719 13025 12376 12098 12012>, - <13719 13025 12376 12098 12012>, - <13719 13025 12376 12098 12012>; - }; - - qcom,pc-temp-z2-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <9887 9963 10080 10036 10066>, - <9942 9966 10122 10017 10077>, - <9963 9968 10133 10021 10073>, - <9977 9970 10144 10031 10059>, - <9980 9972 10300 10034 10052>, - <9969 9975 10734 10030 10054>, - <9953 9980 10995 10026 10060>, - <9947 9985 11036 10027 10067>, - <9950 9994 11057 10030 10073>, - <9953 10003 11045 10035 10078>, - <9950 10019 10978 10047 10080>, - <9936 10039 10913 10064 10087>, - <9921 10050 10902 10067 10095>, - <9915 10052 10846 10053 10103>, - <9910 10053 10727 10040 10111>, - <9907 10062 10376 10056 10116>, - <9908 10093 10098 10092 10121>, - <9915 10134 10106 10109 10127>, - <9924 10169 10163 10113 10136>, - <9938 10204 10223 10117 10148>, - <9958 10233 10285 10147 10163>, - <9978 10254 10335 10217 10186>, - <9994 10272 10334 10248 10197>, - <10009 10277 10287 10200 10186>, - <10026 10273 10254 10129 10159>, - <10046 10267 10259 10091 10125>, - <10067 10262 10267 10066 10063>, - <10081 10258 10268 10051 10025>, - <10090 10256 10264 10046 10025>, - <10097 10257 10261 10044 10027>, - <10105 10262 10265 10048 10030>, - <10113 10268 10274 10059 10034>, - <10121 10277 10285 10075 10042>, - <10132 10289 10302 10098 10058>, - <10147 10300 10323 10128 10089>, - <10163 10309 10342 10158 10124>, - <10181 10319 10362 10188 10175>, - <10204 10332 10380 10215 10215>, - <10223 10349 10400 10243 10224>, - <10230 10359 10419 10277 10230>, - <10232 10353 10422 10293 10232>, - <10235 10340 10410 10287 10228>, - <10238 10335 10402 10279 10225>, - <10271 10333 10399 10274 10229>, - <10306 10384 10407 10279 10225>, - <10057 10377 10396 10267 10210>, - <9392 10373 10375 10258 10215>, - <9394 10373 10363 10276 10222>, - <9469 10378 10360 10282 10225>, - <9471 10398 10367 10324 10297>, - <9740 10400 10386 10273 10143>, - <9904 10347 10313 10175 10061>, - <9751 10299 10272 10136 10021>, - <9389 10237 10198 10083 9975>, - <9389 10237 10198 10083 9975>, - <9389 10237 10198 10083 9975>; - }; - - qcom,pc-temp-z3-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <19870 19685 19460 19386 19360>, - <19880 19708 19479 19393 19374>, - <19872 19703 19482 19398 19379>, - <19860 19689 19485 19402 19383>, - <19844 19678 19492 19403 19385>, - <19806 19671 19503 19399 19383>, - <19763 19663 19509 19393 19377>, - <19749 19647 19507 19390 19374>, - <19750 19612 19503 19390 19373>, - <19752 19586 19498 19389 19372>, - <19746 19591 19490 19383 19368>, - <19720 19609 19484 19373 19361>, - <19689 19618 19482 19372 19359>, - <19672 19605 19480 19382 19361>, - <19658 19580 19472 19389 19364>, - <19650 19561 19438 19382 19362>, - <19653 19543 19409 19367 19357>, - <19668 19531 19408 19362 19354>, - <19684 19534 19414 19362 19352>, - <19696 19552 19423 19363 19350>, - <19708 19568 19440 19368 19351>, - <19715 19579 19457 19378 19358>, - <19714 19587 19458 19385 19367>, - <19712 19590 19446 19390 19380>, - <19712 19588 19438 19394 19394>, - <19713 19584 19444 19396 19396>, - <19715 19581 19455 19398 19392>, - <19716 19579 19460 19399 19389>, - <19712 19577 19462 19398 19386>, - <19703 19575 19463 19396 19384>, - <19694 19573 19463 19394 19380>, - <19684 19571 19460 19392 19374>, - <19674 19569 19457 19389 19368>, - <19664 19567 19453 19384 19362>, - <19655 19565 19450 19379 19356>, - <19647 19561 19447 19376 19354>, - <19640 19556 19444 19373 19353>, - <19635 19553 19442 19372 19353>, - <19631 19551 19440 19372 19353>, - <19626 19548 19438 19374 19355>, - <19622 19545 19436 19375 19357>, - <19618 19542 19433 19372 19359>, - <19615 19537 19430 19370 19361>, - <19590 19530 19425 19372 19364>, - <19555 19496 19414 19365 19359>, - <19483 19493 19411 19361 19353>, - <19288 19484 19407 19359 19342>, - <19287 19482 19399 19352 19339>, - <19274 19482 19398 19349 19337>, - <19274 19477 19393 19345 19329>, - <19380 19476 19393 19358 19356>, - <19466 19486 19397 19367 19361>, - <19457 19488 19403 19367 19361>, - <19361 19469 19406 19368 19361>, - <19361 19469 19406 19368 19361>, - <19361 19469 19406 19368 19361>; - }; - - qcom,pc-temp-z4-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <15576 15295 14958 14871 14836>, - <15817 15293 14997 14861 14828>, - <15751 15219 14954 14843 14814>, - <15626 15113 14889 14814 14794>, - <15513 15041 14829 14790 14773>, - <15405 15000 14764 14771 14758>, - <15308 14965 14729 14756 14745>, - <15258 14920 14722 14748 14737>, - <15238 14861 14716 14745 14732>, - <15222 14822 14704 14740 14727>, - <15192 14829 14677 14727 14717>, - <15140 14853 14659 14710 14703>, - <15085 14866 14675 14707 14698>, - <15049 14850 14714 14719 14702>, - <15023 14821 14732 14729 14706>, - <14999 14801 14732 14718 14701>, - <14967 14785 14726 14691 14685>, - <14929 14775 14718 14678 14674>, - <14899 14776 14710 14674 14668>, - <14883 14786 14708 14671 14664>, - <14872 14803 14778 14701 14683>, - <14866 14859 14872 14787 14761>, - <14870 14949 14888 14828 14807>, - <14880 14984 14881 14814 14789>, - <14890 14971 14870 14792 14757>, - <14903 14948 14848 14774 14739>, - <14917 14928 14817 14756 14728>, - <14922 14910 14796 14741 14719>, - <14922 14893 14781 14732 14712>, - <14922 14879 14771 14724 14705>, - <14921 14867 14767 14718 14699>, - <14916 14858 14764 14712 14694>, - <14907 14851 14763 14709 14691>, - <14899 14845 14763 14707 14689>, - <14890 14841 14764 14707 14688>, - <14881 14836 14765 14707 14688>, - <14872 14834 14766 14712 14694>, - <14863 14835 14768 14718 14701>, - <14856 14842 14773 14723 14706>, - <14856 14847 14778 14729 14711>, - <14861 14843 14778 14730 14712>, - <14863 14833 14768 14723 14706>, - <14854 14826 14759 14720 14703>, - <14828 14814 14754 14722 14711>, - <14802 14774 14727 14708 14697>, - <14867 14763 14711 14694 14684>, - <15062 14759 14705 14686 14681>, - <15057 14751 14697 14675 14666>, - <15055 14744 14687 14659 14649>, - <15050 14750 14689 14659 14649>, - <14971 14766 14708 14677 14666>, - <14905 14772 14714 14676 14668>, - <14931 14776 14710 14677 14669>, - <15036 14789 14712 14678 14669>, - <15036 14789 14712 14678 14669>, - <15036 14789 14712 14678 14669>; - }; - - qcom,pc-temp-z5-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <14692 15817 16506 17023 17032>, - <13889 15946 16566 17473 18372>, - <14180 16341 17183 18096 19180>, - <14666 16968 18090 18900 19927>, - <14894 17614 19423 19326 20440>, - <14913 18461 21458 19344 20549>, - <14927 19176 22989 19341 20597>, - <15019 19231 23616 19450 20744>, - <15538 18882 24168 19816 21253>, - <16096 18608 25553 20049 21672>, - <16166 19322 28813 19791 21505>, - <15899 21088 30995 19426 20981>, - <15595 21979 30046 19665 20813>, - <15441 21486 27269 21476 21565>, - <15326 20778 24488 23037 22600>, - <15260 20543 20990 22765 23531>, - <15510 20491 18559 21927 24968>, - <16650 20465 19139 22131 26458>, - <18199 22053 21714 23880 28089>, - <20090 28136 24917 25298 29366>, - <22597 33087 29952 25282 28689>, - <24693 34533 34705 24907 25359>, - <25899 35446 33770 24232 22924>, - <26845 35593 25601 21630 22124>, - <27812 33045 19878 18792 21590>, - <29272 29495 20166 18526 21468>, - <30819 27936 21056 19217 21671>, - <31423 27127 22022 20077 22021>, - <30898 26715 23480 21005 22961>, - <29880 26783 25144 22099 24258>, - <28867 27117 26679 23279 24630>, - <27724 27555 28201 24649 24576>, - <26615 28265 29163 25708 24531>, - <25954 29124 29942 26313 24773>, - <25501 29566 30546 26751 25286>, - <25205 29702 30591 26869 25532>, - <25228 29727 30284 26548 25603>, - <25709 29681 29822 26138 25638>, - <26184 29501 28954 25736 25215>, - <26167 29239 27722 25023 24024>, - <25817 28599 26763 24295 23518>, - <25649 27505 26080 23186 23869>, - <25951 26652 25165 22454 24150>, - <25567 25854 23718 22241 24165>, - <24417 25019 24047 21548 23475>, - <20897 24776 24087 20757 21087>, - <11546 23078 23549 20818 18766>, - <11525 23046 22289 20274 19403>, - <11492 23418 22848 21964 22319>, - <11532 22670 21481 21189 20883>, - <15199 20831 19017 19467 22135>, - <16495 20010 18076 19395 20831>, - <14943 19306 18242 18468 19442>, - <12048 16812 17864 17705 17987>, - <12048 16812 17864 17705 17987>, - <12048 16812 17864 17705 17987>; - }; - - qcom,pc-temp-z6-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <16088 15437 14914 14772 14729>, - <16174 15435 14938 14772 14733>, - <16131 15392 14919 14766 14731>, - <16049 15328 14891 14756 14725>, - <15969 15281 14868 14746 14717>, - <15886 15252 14847 14736 14709>, - <15804 15226 14834 14726 14701>, - <15748 15189 14828 14721 14696>, - <15713 15136 14824 14719 14693>, - <15683 15101 14815 14716 14690>, - <15646 15103 14796 14707 14683>, - <15599 15114 14784 14693 14673>, - <15559 15120 14790 14691 14669>, - <15540 15106 14802 14700 14672>, - <15527 15080 14805 14708 14674>, - <15520 15063 14786 14699 14671>, - <15517 15050 14767 14680 14662>, - <15515 15042 14766 14672 14655>, - <15514 15044 14767 14671 14651>, - <15516 15058 14770 14670 14649>, - <15521 15078 14809 14685 14658>, - <15527 15111 14860 14729 14697>, - <15533 15154 14868 14750 14720>, - <15539 15171 14861 14747 14719>, - <15547 15165 14853 14741 14715>, - <15557 15156 14847 14736 14710>, - <15568 15148 14841 14730 14704>, - <15572 15142 14836 14725 14698>, - <15571 15136 14833 14720 14694>, - <15570 15130 14830 14716 14690>, - <15568 15125 14827 14713 14686>, - <15563 15122 14825 14709 14680>, - <15557 15119 14824 14706 14676>, - <15552 15117 14823 14703 14671>, - <15547 15116 14822 14700 14668>, - <15543 15115 14822 14699 14667>, - <15540 15114 14822 14700 14668>, - <15537 15115 14822 14702 14671>, - <15535 15120 14824 14705 14674>, - <15535 15123 14827 14708 14677>, - <15539 15122 14827 14710 14679>, - <15540 15120 14822 14706 14678>, - <15538 15118 14818 14704 14678>, - <15523 15114 14815 14707 14683>, - <15504 15091 14801 14698 14675>, - <15495 15086 14793 14690 14666>, - <15478 15081 14789 14685 14659>, - <15476 15077 14782 14677 14652>, - <15477 15077 14778 14669 14643>, - <15481 15081 14778 14667 14639>, - <15508 15093 14789 14684 14662>, - <15533 15110 14797 14691 14668>, - <15553 15126 14804 14694 14672>, - <15581 15140 14813 14700 14675>, - <15581 15140 14813 14700 14675>, - <15581 15140 14813 14700 14675>; - }; - - qcom,pc-temp-y1-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <6900 6339 5910 5550 5404 5355>, - <6898 6321 5906 5552 5405 5356>, - <6892 6309 5902 5554 5407 5357>, - <6883 6302 5899 5555 5407 5358>, - <6874 6300 5897 5555 5408 5358>, - <6868 6300 5896 5556 5408 5358>, - <6864 6304 5898 5555 5407 5357>, - <6858 6314 5902 5555 5406 5356>, - <6857 6319 5903 5554 5405 5355>, - <6866 6319 5903 5554 5403 5354>, - <6877 6318 5903 5554 5402 5354>, - <6876 6319 5907 5555 5402 5354>, - <6867 6322 5917 5556 5402 5355>, - <6859 6327 5923 5557 5402 5355>, - <6860 6336 5921 5558 5402 5355>, - <6863 6347 5917 5560 5402 5355>, - <6866 6350 5917 5560 5403 5354>, - <6876 6345 5915 5560 5402 5354>, - <6883 6340 5914 5560 5402 5355>, - <6880 6341 5917 5561 5403 5355>, - <6870 6350 5926 5563 5404 5356>, - <6866 6356 5930 5565 5405 5356>, - <6869 6364 5928 5567 5406 5357>, - <6875 6370 5925 5570 5408 5358>, - <6888 6368 5927 5572 5410 5360>, - <6923 6358 5934 5574 5411 5361>, - <6949 6352 5941 5576 5413 5363>, - <6931 6355 5946 5579 5415 5364>, - <6897 6362 5949 5582 5418 5366>, - <6883 6365 5951 5585 5420 5368>, - <6878 6365 5953 5589 5423 5371>, - <6874 6366 5955 5592 5427 5373>, - <6871 6367 5954 5594 5429 5376>, - <6868 6368 5952 5596 5432 5378>, - <6865 6369 5953 5599 5435 5380>, - <6863 6366 5962 5603 5438 5382>, - <6862 6365 5970 5607 5441 5384>, - <6864 6367 5969 5608 5444 5386>, - <6871 6365 5962 5610 5446 5389>, - <6874 6362 5957 5612 5447 5391>, - <6869 6362 5960 5615 5448 5392>, - <6862 6362 5964 5619 5448 5394>, - <6863 6363 5964 5624 5449 5396>, - <6884 6365 5962 5631 5454 5398>, - <6888 6367 5962 5632 5460 5401>, - <6860 6372 5964 5632 5465 5404>, - <6857 6374 5965 5633 5466 5404>, - <6866 6376 5968 5634 5466 5404>, - <6892 6377 5974 5637 5463 5403>, - <6893 6386 5975 5641 5463 5403>, - <6883 6422 5981 5639 5466 5406>, - <6909 6403 5988 5644 5474 5413>, - <6935 6427 6003 5658 5483 5421>, - <6933 6438 6021 5677 5495 5431>, - <6933 6438 6021 5677 5495 5431>, - <6933 6438 6021 5677 5495 5431>; - }; - - qcom,pc-temp-y2-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <10913 9643 10383 10709 10769 10816>, - <10790 9643 10392 10666 10764 10826>, - <10504 9841 10398 10632 10757 10829>, - <10157 10222 10400 10607 10749 10826>, - <9851 10476 10400 10591 10742 10819>, - <9688 10588 10398 10584 10736 10809>, - <9682 10506 10381 10588 10731 10791>, - <9685 10279 10343 10602 10726 10763>, - <9686 10177 10331 10608 10717 10750>, - <9678 10263 10439 10614 10677 10748>, - <9666 10402 10568 10620 10633 10748>, - <9663 10506 10576 10622 10641 10749>, - <9662 10586 10536 10627 10696 10753>, - <9661 10690 10510 10635 10729 10758>, - <9660 10952 10553 10661 10715 10764>, - <9659 11298 10641 10701 10692 10770>, - <9659 11346 10709 10738 10686 10769>, - <9658 10616 10758 10778 10704 10746>, - <9657 9854 10802 10814 10725 10725>, - <9657 9738 10841 10843 10748 10739>, - <9657 9709 10876 10868 10785 10785>, - <9656 9695 10921 10895 10817 10828>, - <9656 9687 11010 10926 10846 10868>, - <9656 9681 11092 10960 10876 10903>, - <9656 9677 11096 10990 10904 10918>, - <9656 9673 11050 11019 10933 10924>, - <9655 9670 10990 11057 10965 10929>, - <9655 9667 10915 11118 11001 10947>, - <9655 9665 10830 11185 11039 10982>, - <9655 9663 10774 11238 11068 11012>, - <9655 9661 10732 11287 11090 11038>, - <9655 9660 10709 11309 11114 11064>, - <9655 9660 10705 11308 11158 11097>, - <9655 9659 10637 11305 11223 11134>, - <9655 9659 10511 11295 11252 11151>, - <9655 9658 10229 11257 11234 11152>, - <9655 9657 9925 11213 11208 11150>, - <9655 9657 9807 11178 11195 11144>, - <9655 9657 9746 11147 11187 11134>, - <9655 9657 9715 11123 11187 11121>, - <9655 9656 9702 11104 11184 11095>, - <9655 9656 9693 11082 11170 11066>, - <9655 9656 9686 11043 11162 11058>, - <9654 9655 9679 10985 11162 11068>, - <9654 9655 9674 10916 11139 11053>, - <9654 9655 9671 10847 11038 10937>, - <9654 9655 9670 10820 11024 10878>, - <9654 9654 9670 10809 11029 10843>, - <9654 9654 9672 10819 11019 10845>, - <9654 9655 9673 10826 11047 10827>, - <9654 9655 9672 10807 10958 10818>, - <9654 9654 9670 10729 10899 10777>, - <9654 9654 9665 10639 10834 10685>, - <9654 9654 9661 10558 10710 10553>, - <9654 9654 9661 10558 10710 10553>, - <9654 9654 9661 10558 10710 10553>; - }; - - qcom,pc-temp-y3-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <15516 13366 13412 13298 13279 13279>, - <15198 13488 13408 13297 13279 13279>, - <14732 13564 13406 13297 13280 13278>, - <14234 13606 13408 13297 13282 13278>, - <13821 13622 13410 13297 13283 13279>, - <13608 13626 13414 13297 13283 13279>, - <13628 13593 13420 13298 13283 13279>, - <13701 13509 13429 13299 13283 13279>, - <13731 13472 13432 13301 13283 13279>, - <13632 13536 13426 13308 13286 13280>, - <13509 13616 13415 13314 13290 13281>, - <13499 13617 13405 13312 13289 13281>, - <13550 13553 13393 13303 13285 13281>, - <13607 13494 13386 13299 13283 13281>, - <13651 13472 13389 13303 13284 13281>, - <13693 13457 13394 13309 13287 13282>, - <13715 13436 13395 13312 13289 13282>, - <13725 13404 13390 13314 13291 13284>, - <13735 13372 13383 13315 13293 13285>, - <13763 13350 13374 13313 13292 13284>, - <13821 13330 13362 13308 13288 13282>, - <13880 13323 13351 13304 13285 13280>, - <13929 13332 13341 13300 13283 13279>, - <13978 13353 13331 13297 13280 13278>, - <14029 13374 13323 13296 13280 13278>, - <14081 13399 13315 13296 13280 13277>, - <14134 13428 13309 13295 13280 13277>, - <14188 13465 13304 13295 13280 13277>, - <14241 13510 13299 13294 13280 13277>, - <14292 13555 13299 13293 13280 13277>, - <14343 13599 13305 13291 13280 13276>, - <14391 13644 13313 13290 13281 13276>, - <14434 13695 13319 13289 13281 13277>, - <14473 13752 13326 13289 13281 13278>, - <14511 13807 13328 13289 13281 13279>, - <14549 13857 13326 13290 13279 13277>, - <14587 13907 13322 13290 13278 13275>, - <14628 13963 13324 13290 13278 13275>, - <14670 14026 13341 13291 13278 13275>, - <14713 14093 13362 13292 13278 13276>, - <14757 14162 13377 13294 13278 13276>, - <14802 14234 13392 13298 13279 13277>, - <14856 14311 13413 13299 13279 13277>, - <14920 14395 13442 13300 13279 13277>, - <14999 14482 13477 13303 13280 13277>, - <15105 14570 13522 13308 13284 13281>, - <15169 14613 13553 13313 13287 13284>, - <15250 14659 13591 13316 13290 13287>, - <15297 14679 13601 13319 13293 13289>, - <15292 14599 13590 13326 13294 13287>, - <15370 14590 13598 13325 13289 13283>, - <15495 14688 13617 13325 13290 13284>, - <15638 14834 13676 13336 13294 13288>, - <15860 15038 13782 13349 13299 13292>, - <15860 15038 13782 13349 13299 13292>, - <15860 15038 13782 13349 13299 13292>; - }; - - qcom,pc-temp-y4-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <16038 18415 16767 16521 16467 16457>, - <16594 18067 16836 16522 16466 16457>, - <17563 17850 16890 16524 16465 16456>, - <18659 17733 16929 16527 16465 16456>, - <19596 17685 16954 16530 16466 16456>, - <20087 17675 16965 16533 16466 16457>, - <20091 17940 16955 16536 16468 16458>, - <20026 18635 16928 16539 16471 16459>, - <19908 18939 16923 16545 16476 16461>, - <19266 18387 17118 16563 16491 16463>, - <18515 17674 17351 16580 16506 16465>, - <18349 17519 17313 16578 16506 16468>, - <18323 17497 17011 16565 16495 16470>, - <18286 17493 16815 16558 16488 16473>, - <18130 17539 16900 16569 16493 16478>, - <17845 17615 17048 16591 16504 16485>, - <17546 17639 17089 16614 16518 16496>, - <17158 17623 17079 16646 16541 16515>, - <16880 17589 17062 16665 16557 16529>, - <16862 17413 16999 16654 16550 16524>, - <16870 16968 16870 16624 16527 16508>, - <16880 16735 16786 16593 16507 16493>, - <16890 16736 16754 16543 16484 16475>, - <16902 16738 16732 16506 16467 16460>, - <16917 16744 16709 16504 16465 16458>, - <16937 16761 16686 16504 16466 16459>, - <16959 16784 16660 16504 16467 16460>, - <16982 16808 16619 16507 16470 16463>, - <17007 16836 16576 16513 16476 16468>, - <17030 16870 16566 16519 16483 16473>, - <17051 16917 16579 16525 16491 16481>, - <17072 16965 16599 16528 16500 16490>, - <17094 16999 16621 16525 16507 16499>, - <17116 17029 16650 16521 16513 16508>, - <17138 17062 16685 16519 16514 16510>, - <17159 17103 16736 16519 16494 16490>, - <17178 17145 16790 16519 16472 16466>, - <17189 17176 16817 16519 16469 16462>, - <17197 17197 16832 16520 16470 16464>, - <17203 17219 16846 16523 16472 16466>, - <17207 17249 16859 16535 16476 16469>, - <17211 17286 16875 16550 16482 16473>, - <17219 17330 16898 16558 16482 16472>, - <17253 17384 16938 16564 16476 16462>, - <17305 17459 17011 16574 16476 16459>, - <17382 17592 17179 16602 16495 16481>, - <17426 17665 17294 16629 16515 16506>, - <17470 17736 17419 16656 16553 16551>, - <17470 17761 17436 16684 16586 16589>, - <17365 17601 17370 16741 16599 16563>, - <17324 17514 17370 16731 16518 16492>, - <17309 17495 17336 16686 16515 16487>, - <17308 17468 17329 16707 16535 16500>, - <17371 17496 17424 16766 16582 16538>, - <17371 17496 17424 16766 16582 16538>, - <17371 17496 17424 16766 16582 16538>; - }; - - qcom,pc-temp-y5-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <25193 15142 13292 14242 14183 19057>, - <20462 13297 13348 14061 14977 18684>, - <16565 12060 13382 13886 15475 18307>, - <13591 11315 13400 13728 15741 17929>, - <11631 10943 13407 13596 15839 17555>, - <10777 10827 13406 13500 15836 17189>, - <11453 10982 13169 13433 15543 16809>, - <13275 11562 12582 13390 14894 16425>, - <14053 12426 12343 13417 14643 16150>, - <12818 14868 12741 13633 14957 15996>, - <11287 17441 13225 13841 15319 15850>, - <11311 17284 13271 13682 15127 15541>, - <12691 14569 13112 13112 14199 14988>, - <14256 12649 13001 12816 13629 14599>, - <15708 12948 13195 13045 13856 14404>, - <17058 13651 13657 13441 14240 14243>, - <17144 14183 14225 13699 14415 14208>, - <14267 14617 15169 13870 14478 14246>, - <11440 14898 15860 14116 14560 14319>, - <11148 14369 15895 15015 15092 14730>, - <11108 12561 15884 16345 16217 15667>, - <11097 11456 15854 16869 16823 16445>, - <11144 11313 15505 17017 16809 17230>, - <11213 11234 15068 17089 16654 17885>, - <11238 11227 15257 17073 16604 17937>, - <11249 11246 16546 16999 16608 17640>, - <11254 11277 17464 16952 16563 17240>, - <11247 11346 16175 16896 16252 16699>, - <11232 11452 13917 16815 15842 16061>, - <11234 11487 13273 16732 15794 15691>, - <11330 11392 13571 16675 16226 15497>, - <11432 11301 13965 16720 16789 15496>, - <11441 11319 14266 17226 17315 16131>, - <11431 11377 14281 17895 17849 17370>, - <11425 11406 13892 18030 18031 17905>, - <11427 11386 13181 17862 17834 17654>, - <11434 11343 12462 17595 17530 17206>, - <11452 11319 12197 17104 17270 16966>, - <11508 11315 12115 16463 16998 16773>, - <11551 11311 12039 16226 16696 16631>, - <11512 11286 11887 16198 16288 16539>, - <11408 11232 11717 16174 15887 16473>, - <11328 11177 11597 15962 15845 16558>, - <11277 11113 11477 15392 16286 16970>, - <11256 11080 11323 14796 16501 16872>, - <11292 11076 11151 14244 16007 15933>, - <11341 11080 11146 13980 15749 15728>, - <11490 11148 11209 13853 15510 15325>, - <11846 11420 11622 14099 15158 14812>, - <12488 12239 12620 14498 15376 14534>, - <12651 12736 13017 14566 16266 15465>, - <12204 12736 12776 14596 16532 15499>, - <11628 12291 12149 14637 17293 16790>, - <11283 11685 11411 14441 17552 17705>, - <11283 11685 11411 14441 17552 17705>, - <11283 11685 11411 14441 17552 17705>; - }; - - qcom,pc-temp-y6-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <7322 6126 5376 5100 5046 5038>, - <7215 6048 5388 5100 5047 5038>, - <7136 5999 5399 5100 5047 5038>, - <7084 5973 5409 5101 5048 5038>, - <7053 5963 5416 5102 5048 5038>, - <7041 5960 5420 5103 5049 5038>, - <7058 6014 5418 5104 5050 5039>, - <7102 6153 5414 5106 5051 5039>, - <7115 6215 5414 5109 5052 5040>, - <6886 6117 5461 5118 5059 5041>, - <6603 5977 5517 5127 5065 5042>, - <6567 5910 5502 5125 5065 5043>, - <6610 5868 5407 5115 5059 5044>, - <6639 5848 5345 5110 5055 5045>, - <6624 5859 5371 5116 5058 5046>, - <6586 5878 5416 5126 5063 5049>, - <6537 5883 5429 5136 5069 5052>, - <6449 5868 5423 5146 5076 5059>, - <6380 5840 5413 5151 5082 5064>, - <6390 5782 5390 5147 5079 5062>, - <6442 5680 5346 5134 5070 5055>, - <6493 5629 5316 5122 5061 5049>, - <6532 5655 5302 5105 5053 5042>, - <6571 5704 5292 5093 5046 5037>, - <6612 5748 5284 5093 5045 5037>, - <6658 5788 5276 5093 5046 5037>, - <6703 5832 5270 5093 5046 5037>, - <6748 5882 5264 5094 5047 5038>, - <6793 5937 5259 5096 5049 5039>, - <6835 5993 5260 5098 5051 5041>, - <6876 6049 5277 5100 5054 5043>, - <6916 6105 5304 5101 5057 5045>, - <6954 6160 5330 5101 5060 5049>, - <6991 6214 5360 5101 5062 5052>, - <7026 6268 5390 5101 5062 5053>, - <7059 6320 5422 5103 5056 5047>, - <7091 6371 5455 5105 5049 5039>, - <7123 6425 5487 5107 5048 5038>, - <7155 6480 5518 5110 5049 5039>, - <7187 6540 5550 5113 5050 5040>, - <7223 6603 5584 5120 5052 5042>, - <7261 6670 5619 5129 5054 5043>, - <7306 6743 5663 5135 5054 5043>, - <7362 6823 5719 5140 5054 5040>, - <7432 6913 5789 5149 5055 5040>, - <7531 7021 5885 5166 5064 5049>, - <7591 7075 5946 5180 5072 5059>, - <7663 7130 6012 5192 5086 5075>, - <7697 7152 6021 5201 5096 5087>, - <7665 7045 5984 5222 5101 5078>, - <7717 7016 5994 5221 5074 5055>, - <7810 7082 6019 5211 5076 5055>, - <7930 7188 6092 5235 5086 5063>, - <8133 7354 6230 5272 5105 5079>, - <8133 7354 6230 5272 5105 5079>, - <8133 7354 6230 5272 5105 5079>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-camera-sensor-a70sq-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-camera-sensor-a70sq-r00.dtsi deleted file mode 100755 index ae5def541ac9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-camera-sensor-a70sq-r00.dtsi +++ /dev/null @@ -1,428 +0,0 @@ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&pm6150_l6 { - regulator-min-microvolt = <1050000>; - qcom,init-voltage = <1050000>; -}; - -&soc { - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - reg = <0x00 0x00>; - compatible = "qcom,camera-flash"; - flash-source = <&pm6150l_flash0>; - torch-source = <&pm6150l_torch0>; - switch-source = <&pm6150l_switch0>; - status = "ok"; - }; - rpmh-regulator-ldoa18 { - compatible = "qcom,rpmh-vrm-regulator"; - mboxes = <&apps_rsc 0>; - qcom,resource-name = "ldoa18"; - qcom,regulator-type = "pmic5-ldo"; - qcom,supported-modes = - ; - qcom,mode-threshold-currents = <0 1>; - L18A: pm6150_l18: regulator-pm6150-l18 { - regulator-name = "pm6150_l18"; - qcom,set = ; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <3000000>; - qcom,init-voltage = <2800000>; - qcom,init-mode = ; - }; - }; - }; - -&cam_cci0 { - - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vaf-supply = <&s2mpb03_l7>; - cam_vana-supply = <&s2mpb03_l5>; - cam_v_custom1-supply = <&s2mpb03_l3>; // Analog 1.8 - cam_vdig-supply = <&pm6150_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio","cam_vaf", "cam_vana", "cam_v_custom1","cam_vdig","cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 2800000 1800000 1050000 0>; - rgltr-max-voltage = <1800000 2800000 2800000 1800000 1050000 0>; - rgltr-load-current = <200000 200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active &cam_sensor_rear_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend &cam_sensor_rear_suspend>; - - gpios = <&tlmm 13 0>, /* MCLK */ - <&tlmm 33 0>; /* RST */ - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0"; - - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@1 { /* VT 32M */ - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1050000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &cam_sensor_front_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &cam_sensor_front_suspend >; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 23 0>; /*RST */ - - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { /* VT 32M */ - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - csiphy-sd-index = <1>; - sensor-position-roll = <270>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vana-supply = <&s2mpb03_l6>; - cam_vdig-supply = <&s2mpb03_l1>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1050000 0>; - rgltr-max-voltage = <1800000 2900000 1050000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk1_active &cam_sensor_front_active>; - pinctrl-1 = <&cam_sensor_mclk1_suspend &cam_sensor_front_suspend >; - - gpios = <&tlmm 14 0>, /* MCLK */ - <&tlmm 23 0>; /*RST */ - - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK1", "CAM_RESET1"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK1_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@3 { /* REAR CAM 3 - 5M */ - cell-index = <3>; - compatible = "qcom,cam-sensor"; - reg = <0x3>; - csiphy-sd-index = <3>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vdig-supply = <&s2mpb03_l4>; - cam_vana-supply = <&pm6150_l18>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1200000 2800000 0>; - rgltr-max-voltage = <1800000 1200000 2800000 0>; - rgltr-load-current = <200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk2_active &cam_sensor_rear_sub2_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend &cam_sensor_rear_sub2_suspend>; - - gpios = <&tlmm 16 0>, - <&tlmm 67 0>; - - gpio-reset = <1>; - gpio-req-tbl-num = <0 1>; - gpio-req-tbl-flags = <1 0>; - gpio-req-tbl-label = "CAMIF_MCLK3", "CAM_RESET2"; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK3_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@2 { /* REAR CAM 2 - 13MP UW */ - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom2>; - - cam_vio-supply = <&pm6150_l13>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vdig", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 1050000 0>; - rgltr-max-voltage = <1800000 1050000 0>; - rgltr-load-current = <200000 200000 0>; - - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk3_active &cam_sensor_rear3sw_active &cam_rear3_pwr_active>; - pinctrl-1 = <&cam_sensor_mclk3_suspend &cam_sensor_rear3sw_suspend &cam_rear3_pwr_suspend>; - gpios = <&tlmm 15 0>, /* MCLK */ - <&tlmm 53 0>, /* RESET */ - <&tlmm 4 0>; /* VANA */ - - - - gpio-reset = <1>; - gpio-vana = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET3", "CAM_VANA" ; - - sensor-mode = <0>; - cci-device = <0>; - cci-master = <1>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; - }; - -}; - -&cam_cci1 { - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - cam_vio-supply = <&pm6150_l13>; - cam_vaf-supply = <&s2mpb03_l7>; - regulator-names = "cam_vio","cam_vaf"; - rgltr-min-voltage = <1800000 2800000>; - rgltr-max-voltage = <1800000 2800000>; - rgltr-load-current = <200000 200000>; - }; - - eeprom0: qcom,eeprom@50 { - cell-index = <0>; - reg = <0x50>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - cam_vaf-supply = <&s2mpb03_l7>; - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_vaf","cam_vio"; - rgltr-min-voltage = <2800000 1800000>; - rgltr-max-voltage = <2800000 1800000>; - rgltr-load-current = <200000 200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@51 { - cell-index = <1>; - reg = <0x51>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0xA2>; - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@54 { - cell-index = <2>; - reg = <0x54>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - cci-device = <1>; - cci-master = <0>; - slave-addr = <0xA8>; - - cam_vio-supply = <&pm6150_l13>; - - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - sensor-position = <0>; - rgltr-cntrl-support; - }; - - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-camera-sensor-r1q-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-camera-sensor-r1q-r00.dtsi deleted file mode 100755 index 8a7cf138efa5..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-camera-sensor-r1q-r00.dtsi +++ /dev/null @@ -1,619 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&pm6150_l15 { - regulator-min-microvolt = <1850000>; - qcom,init-voltage = <1850000>; -}; - -&s2mpb03_l3 { - regulator-always-on; -}; - -&s2mpb03_l4 { - regulator-min-microvolt = <1150000>; - regulator-max-microvolt = <1150000>; -}; - -&soc { - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - reg = <0x00 0x00>; - compatible = "qcom,camera-flash"; - flash-source = <&pm6150l_flash0>; - torch-source = <&pm6150l_torch0>; - switch-source = <&pm6150l_switch0>; - status = "ok"; - }; -}; - -&cam_cci1 { - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vana-supply = <&s2mpb03_l7>; - cam_v_custom1-supply = <&pm6150_l15>; // Analog 1.85 - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom2-supply = <&s2mpb03_l4>; // Digital PLL 1.15 - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_v_custom1", "cam_vdig", "cam_v_custom2", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-max-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-load-current = <200000 200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear1_active>; - pinctrl-1 = <&cam_sensor_rear1_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 52 0>, - <&expander_gpios 16 0>; - gpio-reset = <1>; - gpio-vaf = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET1", "CAM_VAF"; - use-shared-clk; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@1 { - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vana-supply = <&s2mpb03_l7>; - cam_v_custom1-supply = <&pm6150_l15>; // Analog 1.85 - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom2-supply = <&s2mpb03_l4>; // Digital PLL 1.15 - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_v_custom1", "cam_vdig", "cam_v_custom2", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-max-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-load-current = <200000 200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear1_active>; - pinctrl-1 = <&cam_sensor_rear1_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 52 0>, - <&expander_gpios 16 0>; - gpio-reset = <1>; - gpio-vaf = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET1", "CAM_VAF"; - use-shared-clk; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vana-supply = <&s2mpb03_l7>; - cam_v_custom1-supply = <&pm6150_l15>; // Analog 1.85 - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom2-supply = <&s2mpb03_l4>; // Digital PLL 1.15 - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_v_custom1", "cam_vdig", "cam_v_custom2", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-max-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-load-current = <200000 200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear1_active>; - pinctrl-1 = <&cam_sensor_rear1_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 52 0>, - <&expander_gpios 16 0>; - gpio-reset = <1>; - gpio-vaf = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET1", "CAM_VAF"; - use-shared-clk; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - eeprom0: qcom,eeprom@0 { - cell-index = <0>; - reg = <0x58>; //QUP use 0xB0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - gpios = <&expander_gpios 16 0>; - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF"; - - cam_vio-supply = <&pm6150_l13>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@1 { - cell-index = <1>; - reg = <0x58>; //QUP use 0xB0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - gpios = <&expander_gpios 16 0>; - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF"; - - cam_vio-supply = <&pm6150_l13>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@2 { - cell-index = <2>; - reg = <0x58>; //QUP use 0xB0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - gpios = <&expander_gpios 16 0>; - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF"; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-master = <1>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - - gpios = <&expander_gpios 16 0>; - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF"; - - cam_vio-supply = <&pm6150_l13>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - }; -}; - -&cam_cci0 { - qcom,cam-res-mgr { - compatible = "qcom,cam-res-mgr"; - shared-gpios = <15 316>; - pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; - status = "ok"; - pinctrl-0 = <&cam_sensor_mclk2_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend>; - }; - qcom,cam-sensor@2 { - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom2>; - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vana-supply = <&s2mpb03_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 0>; - rgltr-max-voltage = <1800000 2800000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_rear2_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 55 0>, - <&expander_gpios 16 0>; - gpio-reset = <1>; - gpio-vdig = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2", "CAM_VDIG"; - use-shared-clk; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - qcom,cam-sensor@4 { - cell-index = <4>; - compatible = "qcom,cam-sensor"; - reg = <0x4>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - // LDO - cam_vio-supply = <&pm6150_l13>; - cam_vana-supply = <&s2mpb03_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 0>; - rgltr-max-voltage = <1800000 2800000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_rear2_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 55 0>, - <&expander_gpios 16 0>; - gpio-reset = <1>; - gpio-vdig = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2", "CAM_VDIG"; - use-shared-clk; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - qcom,cam-sensor@6 { - cell-index = <6>; // REAR TOF - compatible = "qcom,cam-sensor"; - reg = <0x6>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom4>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_vio-supply = <&pm6150_l13>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - cam_v_custom1-supply = <&pm6150l_l9>; - regulator-names = "cam_vdig", "cam_vio", "cam_vana", "cam_clk", "cam_v_custom1"; - rgltr-cntrl-support; - rgltr-min-voltage = <1200000 1800000 2700000 0 3300000>; - rgltr-max-voltage = <1200000 1800000 2700000 0 3300000>; - rgltr-load-current = <200000 200000 200000 0 200000>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active - &cam_sensor_tof_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend - &cam_sensor_tof_suspend>; - gpios = <&tlmm 13 0>, // MCLK - <&tlmm 23 0>, // TOF RESET - <&tlmm 24 0>; // TOF DCDC ENABLE - - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2 >; - gpio-req-tbl-flags = <1 0 0 >; - gpio-req-tbl-label = "CAMIF_MCLK0", - "CAM_RESET3", - "TOF_DCDC_ENABLE"; - sensor-mode = <0>; - cci-master = <0>; - cci-device = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@7 { - cell-index = <7>; // REAR TOF - compatible = "qcom,cam-sensor"; - reg = <0x7>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom5>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_vio-supply = <&pm6150_l13>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - cam_v_custom1-supply = <&pm6150l_l9>; - regulator-names = "cam_vdig", "cam_vio", "cam_vana", "cam_clk", "cam_v_custom1"; - rgltr-cntrl-support; - rgltr-min-voltage = <1200000 1800000 2700000 0 3300000>; - rgltr-max-voltage = <1200000 1800000 2700000 0 3300000>; - rgltr-load-current = <200000 200000 200000 0 200000>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active - &cam_sensor_tof_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend - &cam_sensor_tof_suspend>; - gpios = <&tlmm 13 0>, // MCLK - <&tlmm 23 0>, // TOF RESET - <&tlmm 24 0>; // TOF DCDC ENABLE - - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2 >; - gpio-req-tbl-flags = <1 0 0 >; - gpio-req-tbl-label = "CAMIF_MCLK0", - "CAM_RESET3", - "TOF_DCDC_ENABLE"; - sensor-mode = <0>; - cci-master = <0>; - cci-device = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - eeprom4: qcom,eeprom@4 { - cell-index = <4>; - reg = <0x50>;//QUP use 0xA0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&pm6150_l13>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom5: qcom,eeprom@5 { - cell-index = <5>; - reg = <0x50>;//QUP use 0xA0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&pm6150_l13>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <1>; - rgltr-cntrl-support; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-camera-sensor-r1q-r02.dtsi b/arch/arm64/boot/dts/samsung/sm7150-camera-sensor-r1q-r02.dtsi deleted file mode 100755 index 802e3c3682c9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-camera-sensor-r1q-r02.dtsi +++ /dev/null @@ -1,619 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&pm6150_l15 { - regulator-min-microvolt = <1850000>; - qcom,init-voltage = <1850000>; -}; - -&s2mpb03_l3 { - regulator-always-on; -}; - -&s2mpb03_l4 { - regulator-min-microvolt = <1150000>; - regulator-max-microvolt = <1150000>; -}; - -&soc { - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - reg = <0x00 0x00>; - compatible = "qcom,camera-flash"; - flash-source = <&pm6150l_flash0>; - torch-source = <&pm6150l_torch0>; - switch-source = <&pm6150l_switch0>; - status = "ok"; - }; -}; - -&cam_cci1 { - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l7>; - cam_v_custom1-supply = <&pm6150_l15>; // Analog 1.85 - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom2-supply = <&s2mpb03_l4>; // Digital PLL 1.15 - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_v_custom1", "cam_vdig", "cam_v_custom2", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-max-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-load-current = <200000 200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear1_active>; - pinctrl-1 = <&cam_sensor_rear1_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 33 0>, - <&expander_gpios 16 0>; - gpio-reset = <1>; - gpio-vaf = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET1", "CAM_VAF"; - use-shared-clk; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@1 { - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l7>; - cam_v_custom1-supply = <&pm6150_l15>; // Analog 1.85 - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom2-supply = <&s2mpb03_l4>; // Digital PLL 1.15 - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_v_custom1", "cam_vdig", "cam_v_custom2", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-max-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-load-current = <200000 200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear1_active>; - pinctrl-1 = <&cam_sensor_rear1_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 33 0>, - <&expander_gpios 16 0>; - gpio-reset = <1>; - gpio-vaf = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET1", "CAM_VAF"; - use-shared-clk; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@8 { - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l7>; - cam_v_custom1-supply = <&pm6150_l15>; // Analog 1.85 - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom2-supply = <&s2mpb03_l4>; // Digital PLL 1.15 - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_v_custom1", "cam_vdig", "cam_v_custom2", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-max-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-load-current = <200000 200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear1_active>; - pinctrl-1 = <&cam_sensor_rear1_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 33 0>, - <&expander_gpios 16 0>; - gpio-reset = <1>; - gpio-vaf = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET1", "CAM_VAF"; - use-shared-clk; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - eeprom0: qcom,eeprom@0 { - cell-index = <0>; - reg = <0x58>; //QUP use 0xB0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - gpios = <&expander_gpios 16 0>; - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF"; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@1 { - cell-index = <1>; - reg = <0x58>; //QUP use 0xB0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - gpios = <&expander_gpios 16 0>; - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF"; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@2 { - cell-index = <2>; - reg = <0x58>; //QUP use 0xB0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xB0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - gpios = <&expander_gpios 16 0>; - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF"; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-master = <1>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - - gpios = <&expander_gpios 16 0>; - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF"; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - }; -}; - -&cam_cci0 { - qcom,cam-res-mgr { - compatible = "qcom,cam-res-mgr"; - shared-gpios = <15 316>; - pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; - status = "ok"; - pinctrl-0 = <&cam_sensor_mclk2_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend>; - }; - qcom,cam-sensor@2 { - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom2>; - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 0>; - rgltr-max-voltage = <1800000 2800000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_rear2_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 67 0>, - <&expander_gpios 17 0>; - gpio-reset = <1>; - gpio-vdig = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2", "CAM_VDIG"; - use-shared-clk; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - qcom,cam-sensor@4 { - cell-index = <4>; - compatible = "qcom,cam-sensor"; - reg = <0x4>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 0>; - rgltr-max-voltage = <1800000 2800000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_rear2_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 67 0>, - <&expander_gpios 17 0>; - gpio-reset = <1>; - gpio-vdig = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2", "CAM_VDIG"; - use-shared-clk; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - qcom,cam-sensor@6 { - cell-index = <6>; // REAR TOF - compatible = "qcom,cam-sensor"; - reg = <0x6>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom4>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - cam_v_custom1-supply = <&pm6150l_l9>; - regulator-names = "cam_vdig", "cam_vio", "cam_vana", "cam_clk", "cam_v_custom1"; - rgltr-cntrl-support; - rgltr-min-voltage = <1200000 1800000 2700000 0 3300000>; - rgltr-max-voltage = <1200000 1800000 2700000 0 3300000>; - rgltr-load-current = <200000 200000 200000 0 200000>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active - &cam_sensor_tof_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend - &cam_sensor_tof_suspend>; - gpios = <&tlmm 13 0>, // MCLK - <&tlmm 23 0>, // TOF RESET - <&tlmm 24 0>; // TOF DCDC ENABLE - - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2 >; - gpio-req-tbl-flags = <1 0 0 >; - gpio-req-tbl-label = "CAMIF_MCLK0", - "CAM_RESET3", - "TOF_DCDC_ENABLE"; - sensor-mode = <0>; - cci-master = <0>; - cci-device = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@7 { - cell-index = <7>; // REAR TOF - compatible = "qcom,cam-sensor"; - reg = <0x7>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom5>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - cam_v_custom1-supply = <&pm6150l_l9>; - regulator-names = "cam_vdig", "cam_vio", "cam_vana", "cam_clk", "cam_v_custom1"; - rgltr-cntrl-support; - rgltr-min-voltage = <1200000 1800000 2700000 0 3300000>; - rgltr-max-voltage = <1200000 1800000 2700000 0 3300000>; - rgltr-load-current = <200000 200000 200000 0 200000>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active - &cam_sensor_tof_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend - &cam_sensor_tof_suspend>; - gpios = <&tlmm 13 0>, // MCLK - <&tlmm 23 0>, // TOF RESET - <&tlmm 24 0>; // TOF DCDC ENABLE - - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2 >; - gpio-req-tbl-flags = <1 0 0 >; - gpio-req-tbl-label = "CAMIF_MCLK0", - "CAM_RESET3", - "TOF_DCDC_ENABLE"; - sensor-mode = <0>; - cci-master = <0>; - cci-device = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - eeprom4: qcom,eeprom@4 { - cell-index = <4>; - reg = <0x50>;//QUP use 0xA0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom5: qcom,eeprom@5 { - cell-index = <5>; - reg = <0x50>;//QUP use 0xA0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <1>; - rgltr-cntrl-support; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-camera-sensor-r1q-r07.dtsi b/arch/arm64/boot/dts/samsung/sm7150-camera-sensor-r1q-r07.dtsi deleted file mode 100755 index 4c46fca30b5b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-camera-sensor-r1q-r07.dtsi +++ /dev/null @@ -1,614 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&pm6150_l15 { - regulator-min-microvolt = <1850000>; - qcom,init-voltage = <1850000>; -}; - -&s2mpb03_l3 { - regulator-always-on; -}; - -&s2mpb03_l4 { - regulator-min-microvolt = <1150000>; - regulator-max-microvolt = <1150000>; -}; - -&soc { - led_flash0: qcom,camera-flash@0 { - cell-index = <0>; - reg = <0x00 0x00>; - compatible = "qcom,camera-flash"; - flash-source = <&pm6150l_flash0>; - torch-source = <&pm6150l_torch0>; - switch-source = <&pm6150l_switch0>; - status = "ok"; - }; -}; - -&cam_cci1 { - qcom,cam-sensor@0 { - cell-index = <0>; - compatible = "qcom,cam-sensor"; - reg = <0x0>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l7>; - cam_v_custom1-supply = <&pm6150_l15>; // Analog 1.85 - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom2-supply = <&s2mpb03_l4>; // Digital PLL 1.15 - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_v_custom1", "cam_vdig", "cam_v_custom2", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-max-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-load-current = <200000 200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear1_active>; - pinctrl-1 = <&cam_sensor_rear1_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 33 0>, - <&expander_gpios 16 0>; - gpio-reset = <1>; - gpio-vaf = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET1", "CAM_VAF"; - use-shared-clk; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@1 { - cell-index = <1>; - compatible = "qcom,cam-sensor"; - reg = <0x1>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l7>; - cam_v_custom1-supply = <&pm6150_l15>; // Analog 1.85 - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom2-supply = <&s2mpb03_l4>; // Digital PLL 1.15 - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_v_custom1", "cam_vdig", "cam_v_custom2", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-max-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-load-current = <200000 200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear1_active>; - pinctrl-1 = <&cam_sensor_rear1_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 33 0>, - <&expander_gpios 16 0>; - gpio-reset = <1>; - gpio-vaf = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET1", "CAM_VAF"; - use-shared-clk; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - qcom,cam-sensor@8 { - cell-index = <8>; - compatible = "qcom,cam-sensor"; - reg = <0x8>; - csiphy-sd-index = <2>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom1>; - - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l7>; - cam_v_custom1-supply = <&pm6150_l15>; // Analog 1.85 - cam_vdig-supply = <&s2mpb03_l1>; - cam_v_custom2-supply = <&s2mpb03_l4>; // Digital PLL 1.15 - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_v_custom1", "cam_vdig", "cam_v_custom2", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-max-voltage = <1800000 2900000 1850000 1100000 1150000 0>; - rgltr-load-current = <200000 200000 200000 200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear1_active>; - pinctrl-1 = <&cam_sensor_rear1_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 33 0>, - <&expander_gpios 16 0>; - gpio-reset = <1>; - gpio-vaf = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET1", "CAM_VAF"; - use-shared-clk; - - sensor-mode = <0>; - cci-device = <1>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - eeprom0: qcom,eeprom@0 { - cell-index = <0>; - reg = <0x2>; - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - //eeprom-name= "gt24p128ca2"; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - gpios = <&expander_gpios 16 0>; - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF"; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - status = "ok"; - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom1: qcom,eeprom@1 { - cell-index = <1>; - reg = <0x01>; //QUP use 0xB0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - - gpios = <&expander_gpios 16 0>; - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF"; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - status = "ok"; - sensor-position = <0>; - rgltr-cntrl-support; - }; - - eeprom2: qcom,eeprom@2 { - cell-index = <2>; - reg = <0x51>; //QUP use 0xA2 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA2>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vaf", "cam_vio"; - qcom,cam-power-seq-cfg-val = <1 1>; - qcom,cam-power-seq-delay = <2 2>; - gpios = <&expander_gpios 16 0>; - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF"; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <0>; - rgltr-cntrl-support; - }; - - actuator_rear0: qcom,actuator@0xC { - cell-index = <0>; - reg = <0xC>; - cci-master = <1>; - slave-addr = <0x18>; - compatible = "qcom,actuator"; - gpios = <&expander_gpios 16 0>; - gpio-vaf = <0>; - gpio-req-tbl-num = <0>; - gpio-req-tbl-flags = <0>; - gpio-req-tbl-label = "CAM_VAF"; - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - }; -}; - -&cam_cci0 { - qcom,cam-res-mgr { - compatible = "qcom,cam-res-mgr"; - shared-gpios = <15 316>; - pinctrl-names = "cam_res_mgr_default", "cam_res_mgr_suspend"; - status = "ok"; - pinctrl-0 = <&cam_sensor_mclk2_active>; - pinctrl-1 = <&cam_sensor_mclk2_suspend>; - }; - qcom,cam-sensor@2 { - cell-index = <2>; - compatible = "qcom,cam-sensor"; - reg = <0x2>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom2>; - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 0>; - rgltr-max-voltage = <1800000 2800000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_rear2_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 67 0>, - <&expander_gpios 17 0>; - gpio-reset = <1>; - gpio-vdig = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2", "CAM_VDIG"; - use-shared-clk; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - qcom,cam-sensor@4 { - cell-index = <4>; - compatible = "qcom,cam-sensor"; - reg = <0x4>; - csiphy-sd-index = <1>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - actuator-src = <&actuator_rear0>; - led-flash-src = <&led_flash0>; - eeprom-src = <&eeprom0>; - // LDO - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l6>; - cam_clk-supply = <&titan_top_gdsc>; - regulator-names = "cam_vio", "cam_vana", "cam_clk"; - rgltr-cntrl-support; - rgltr-min-voltage = <1800000 2800000 0>; - rgltr-max-voltage = <1800000 2800000 0>; - rgltr-load-current = <200000 200000 0>; - - // GPIO - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_rear2_active>; - pinctrl-1 = <&cam_sensor_rear2_suspend>; - gpios = <&tlmm 15 0>, - <&tlmm 67 0>, - <&expander_gpios 17 0>; - gpio-reset = <1>; - gpio-vdig = <2>; - gpio-req-tbl-num = <0 1 2>; - gpio-req-tbl-flags = <1 0 0>; - gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2", "CAM_VDIG"; - use-shared-clk; - - sensor-mode = <0>; - cci-master = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK2_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <2>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - qcom,cam-sensor@6 { - cell-index = <6>; // REAR TOF - compatible = "qcom,cam-sensor"; - reg = <0x6>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <180>; - eeprom-src = <&eeprom4>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - cam_v_custom1-supply = <&pm6150l_l9>; - regulator-names = "cam_vdig", "cam_vio", "cam_vana", "cam_clk", "cam_v_custom1"; - rgltr-cntrl-support; - rgltr-min-voltage = <1200000 1800000 2700000 0 3300000>; - rgltr-max-voltage = <1200000 1800000 2700000 0 3300000>; - rgltr-load-current = <200000 200000 200000 0 200000>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active - &cam_sensor_tof_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend - &cam_sensor_tof_suspend>; - gpios = <&tlmm 13 0>, // MCLK - <&tlmm 23 0>, // TOF RESET - <&tlmm 24 0>; // TOF DCDC ENABLE - - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2 >; - gpio-req-tbl-flags = <1 0 0 >; - gpio-req-tbl-label = "CAMIF_MCLK0", - "CAM_RESET3", - "TOF_DCDC_ENABLE"; - sensor-mode = <0>; - cci-master = <0>; - cci-device = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - qcom,cam-sensor@7 { - cell-index = <7>; // REAR TOF - compatible = "qcom,cam-sensor"; - reg = <0x7>; - csiphy-sd-index = <0>; - sensor-position-roll = <90>; - sensor-position-pitch = <0>; - sensor-position-yaw = <0>; - eeprom-src = <&eeprom5>; - cam_vdig-supply = <&s2mpb03_l2>; - cam_vio-supply = <&s2mpb03_l3>; - cam_vana-supply = <&s2mpb03_l5>; - cam_clk-supply = <&titan_top_gdsc>; - cam_v_custom1-supply = <&pm6150l_l9>; - regulator-names = "cam_vdig", "cam_vio", "cam_vana", "cam_clk", "cam_v_custom1"; - rgltr-cntrl-support; - rgltr-min-voltage = <1200000 1800000 2700000 0 3300000>; - rgltr-max-voltage = <1200000 1800000 2700000 0 3300000>; - rgltr-load-current = <200000 200000 200000 0 200000>; - gpio-no-mux = <0>; - pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_active - &cam_sensor_tof_active>; - pinctrl-1 = <&cam_sensor_mclk0_suspend - &cam_sensor_tof_suspend>; - gpios = <&tlmm 13 0>, // MCLK - <&tlmm 23 0>, // TOF RESET - <&tlmm 24 0>; // TOF DCDC ENABLE - - gpio-reset = <1>; - gpio-custom1 = <2>; - gpio-req-tbl-num = <0 1 2 >; - gpio-req-tbl-flags = <1 0 0 >; - gpio-req-tbl-label = "CAMIF_MCLK0", - "CAM_RESET3", - "TOF_DCDC_ENABLE"; - sensor-mode = <0>; - cci-master = <0>; - cci-device = <0>; - status = "ok"; - clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; - clock-names = "cam_clk"; - clock-cntl-level = "turbo"; - clock-rates = <24000000>; - - cam,isp = <0>; // 0 : INT , 1 : EXT , 2 : SOC - cam,cal_memory = <0>; // 0 : N , 1 : FROM , 2 : EEPROM , 3 : OTP - cam,read_version = <0>; // 0 : SYSFS , 1 : CAMON - cam,core_voltage = <0>; // 0 : N , 1 : Y - cam,upgrade = <0>; // 0 : N , 1 : SYSFS , 2 : CAMON - cam,fw_write = <0>; // 0 : N , 1 : OS , 2 : SD , 3 : ALL - cam,fw_dump = <0>; // 0 : N , 1 : Y - cam,companion_chip = <0>; // 0 : N , 1 : Y - cam,ois = <0>; // 0 : N , 1 : Y - cam,dual_open = <0>; // 0 : N , 1 : Y - cam,valid = <1>; // 0 : N , 1 : Y - }; - - eeprom4: qcom,eeprom@4 { - cell-index = <4>; - reg = <0x50>;//QUP use 0xA0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <1>; - rgltr-cntrl-support; - }; - - eeprom5: qcom,eeprom@5 { - cell-index = <5>; - reg = <0x50>;//QUP use 0xA0 - compatible = "qcom,eeprom"; - i2c-freq-mode = <1>; - slave-addr = <0xA0>; - sensor-mode = <0>; - cci-master = <1>; - - qcom,cam-power-seq-type = "sensor_vreg"; - qcom,cam-power-seq-val = "cam_vio"; - qcom,cam-power-seq-cfg-val = <1>; - qcom,cam-power-seq-delay = <2>; - - cam_vio-supply = <&s2mpb03_l3>; - regulator-names = "cam_vio"; - rgltr-min-voltage = <1800000>; - rgltr-max-voltage = <1800000>; - rgltr-load-current = <200000>; - - sensor-position = <1>; - rgltr-cntrl-support; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-audio-pinctrl.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-audio-pinctrl.dtsi deleted file mode 100755 index 25a74b8bed1f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-audio-pinctrl.dtsi +++ /dev/null @@ -1,171 +0,0 @@ -/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&lpi_tlmm { - sec_mi2s_clk_active: sec_mi2s_clk_active { - mux { - pins = "gpio8"; - function = "func3"; - }; - config { - pins = "gpio8"; - drive-strength = <8>; - }; - }; - sec_mi2s_clk_sleep: sec_mi2s_clk_sleep { - mux { - pins = "gpio8"; - function = "func3"; - }; - config { - pins = "gpio8"; - drive-strength = <2>; - }; - }; - - sec_mi2s_ws_active: sec_mi2s_ws_active { - mux { - pins = "gpio9"; - function = "func3"; - }; - config { - pins = "gpio9"; - drive-strength = <8>; - }; - }; - - sec_mi2s_ws_sleep: sec_mi2s_ws_sleep { - mux { - pins = "gpio9"; - function = "func3"; - }; - config { - pins = "gpio9"; - drive-strength = <2>; - }; - }; - - sec_mi2s_sd0_active: sec_mi2s_sd0_active { - mux { - pins = "gpio10"; - function = "func4"; - }; - - config { - pins = "gpio10"; - drive-strength = <8>; - }; - }; - - sec_mi2s_sd0_sleep: sec_mi2s_sd0_sleep { - mux { - pins = "gpio10"; - function = "func4"; - }; - config { - pins = "gpio10"; - drive-strength = <2>; - }; - }; - - sec_mi2s_sd1_active: sec_mi2s_sd1_active { - mux { - pins = "gpio11"; - function = "func2"; - }; - config { - pins = "gpio11"; - drive-strength = <8>; - }; - }; - - sec_mi2s_sd1_sleep: sec_mi2s_sd1_sleep { - mux { - pins = "gpio11"; - function = "func2"; - }; - config { - pins = "gpio11"; - drive-strength = <2>; - }; - }; -}; - -&tlmm { - /* TAS2562 speaker pins */ - tas2562_int_active: tas2562_int_active { - mux { - pins = "gpio89"; - function = "gpio"; - }; - config { - pins = "gpio89"; - drive-strength = <2>; /* 2 MA */ - bias-disable; /* No PULL */ - }; - }; - - tas2562_int_sleep: tas2562_int_sleep { - mux { - pins = "gpio89"; - function = "gpio"; - }; - config { - pins = "gpio89"; - drive-strength = <2>; /* 2 MA */ - bias-disable; /* No PULL */ - }; - }; - - tas2562_rst_default: tas2562_rst_default { - mux { - pins = "gpio8"; - function = "gpio"; - }; - config { - pins = "gpio8"; - drive-strength = <2>; /* 2 MA */ - bias-pull-down; /* PULL DOWN*/ - output-low; - }; - }; - - /delete-node/ qupv3_se0_i2c_pins; - qupv3_se0_i2c_pins: qupv3_se0_i2c_pins { - qupv3_se0_amp_i2c_active: qupv3_se0_amp_i2c_active { - mux { - pins = "gpio49", "gpio50"; - function = "qup00"; - }; - - config { - pins = "gpio49", "gpio50"; - drive-strength = <2>; - bias-disable; - }; - }; - - qupv3_se0_amp_i2c_sleep: qupv3_se0_amp_i2c_sleep { - mux { - pins = "gpio49", "gpio50"; - function = "gpio"; - }; - - config { - pins = "gpio49", "gpio50"; - drive-strength = <2>; - bias-disable; - }; - }; - }; -}; - diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-audio.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-audio.dtsi deleted file mode 100755 index 7a64b46cc8ac..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-audio.dtsi +++ /dev/null @@ -1,177 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&bolero { - qcom,num-macros = <3>; - imp_list: imp_list { - #list-imp-cells = <3>; - }; -}; - -&wcd937x_codec { - qcom,cdc-micbias2-mv = <2800>; - imp-table = <&imp_list 0 5 6>, - <&imp_list 6 23 8>, - <&imp_list 24 38 7>, - <&imp_list 39 100 6>, - <&imp_list 101 160 10>, - <&imp_list 161 400 11>, - <&imp_list 401 2000 11>, - <&imp_list 2001 0x7fffffff 6>; -}; - -&sm6150_snd { - qcom,model = "sm6150-idp-snd-card"; - qcom,msm-mi2s-master = <1>, <1>, <1>, <1>, <1>; - qcom,ext-disp-audio-rx = <1>; - - asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>, - <&loopback>, <&compress>, <&hostless>, - <&afe>, <&lsm>, <&routing>, <&compr>, - <&pcm_noirq>, <&samsung_q6audio_adaptation>; - asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", - "msm-pcm-dsp.2", "msm-voip-dsp", - "msm-pcm-voice", "msm-pcm-loopback", - "msm-compress-dsp", "msm-pcm-hostless", - "msm-pcm-afe", "msm-lsm-client", - "msm-pcm-routing", "msm-compr-dsp", - "msm-pcm-dsp-noirq", "q6audio-adaptation"; - qcom,audio-routing = - "AMIC1", "MIC BIAS1", - "MIC BIAS1", "Analog Mic1", - "AMIC2", "MIC BIAS2", - "MIC BIAS2", "Analog Mic2", - "AMIC3", "MIC BIAS3", - "MIC BIAS3", "Analog Mic3", - "IN1_HPHL", "HPHL_OUT", - "IN2_HPHR", "HPHR_OUT", - "IN3_AUX", "AUX_OUT", - "TX SWR_ADC0", "ADC1_OUTPUT", - "TX SWR_ADC2", "ADC2_OUTPUT", - "RX_TX DEC0_INP", "TX DEC0 MUX", - "RX_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC2_INP", "TX DEC2 MUX", - "RX_TX DEC3_INP", "TX DEC3 MUX"; - qcom,msm-mbhc-hs-mic-max-threshold-mv = <9999>; - qcom,msm-mbhc-hs-mic-min-threshold-mv = <640>; - qcom,msm-mbhc-hphl-swh = <1>; - qcom,msm-mbhc-gnd-swh = <0>; - qcom,cdc-dmic01-gpios = <0>; - qcom,cdc-dmic23-gpios = <0>; - qcom,fm-lna-gpios = <&tlmm 21 0>; - asoc-codec = <&stub_codec>, <&bolero>, <&ext_disp_audio_codec>; - asoc-codec-names = "msm-stub-codec.1", "bolero_codec", - "msm-ext-disp-audio-codec-rx"; - qcom,wsa-max-devs = <0>; - - qcom,codec-max-aux-devs = <1>; - qcom,codec-aux-devs = <&wcd937x_codec>; - qcom,msm_audio_ssr_devs = <&audio_apr>, <&q6core>, - <&lpi_tlmm>, <&bolero>; - mbhc-button-thres = <&det_zones 13 13>, - <&det_zones 88 88>, - <&det_zones 125 125>, - <&det_zones 225 225>, - <&det_zones 500 500>, - <&det_zones 620 620>, - <&det_zones 620 620>, - <&det_zones 620 620>; - qcom,sec-mi2s-gpios = <&cdc_sec_mi2s_gpios>; -}; - -&qupv3_se0_i2c { - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&qupv3_se0_amp_i2c_active>; - pinctrl-1 = <&qupv3_se0_amp_i2c_sleep>; - qcom,clk-freq-out = <100000>; - status = "ok"; - - tas2562:tas2562@4c { - pinctrl-names = "default"; - pinctrl-0 = <&tas2562_rst_default>; - #sound-dai-cells = <0>; - compatible = "ti,tas2562"; - reg = <0x4c>; - ti,left-channel = <0x4c>; - ti,channels = <1>; - ti,asi-format = <0>; - ti,reset-gpio = <&tlmm 8 0>; - ti,irq-gpio = <&tlmm 89 0>; - ti,port_id = <0x1002>; - ti,re_min = <2621440>; - ti,re_max = <5242880>; - ti,f0_min = <262144000>; - ti,f0_max = <524288000>; - ti,q_min = <524288>; - ti,q_max = <1572864>; - status = "ok"; - }; -}; - -&soc { - det_zones: det_zones { - #list-det-cells = <2>; - }; - - samsung_q6audio_adaptation: samsung,q6audio-adaptation { - compatible = "samsung,q6audio-adaptation"; - adaptation,voice-tracking-tx-port-id = <0xB037>; - adaptation,amp-rx-port-id = <0x1002>; - adaptation,amp-rx-topology = <0x1000FC01>; - adaptation,amp-tx-topology = <0x1000FD01>; - }; - - cdc_sec_mi2s_gpios: msm_cdc_pinctrl_sec { - compatible = "qcom,msm-cdc-pinctrl"; - pinctrl-names = "aud_active", "aud_sleep"; - pinctrl-0 = <&sec_mi2s_clk_active &sec_mi2s_ws_active - &sec_mi2s_sd0_active &sec_mi2s_sd1_active>; - pinctrl-1 = <&sec_mi2s_clk_sleep &sec_mi2s_ws_sleep - &sec_mi2s_sd0_sleep &sec_mi2s_sd1_sleep>; - }; - - i2c_7: i2c@7 { - status = "ok"; - cell-index = <7>; - compatible = "i2c-gpio"; - gpios = <&tlmm 49 0 - &tlmm 50 0>; - }; -}; - -&dai_mi2s1 { - qcom,msm-mi2s-rx-lines = <2>; - qcom,msm-mi2s-tx-lines = <1>; -}; - -&wsa_swr_gpios { - status = "disabled"; -}; - -&wsa_macro { - status = "disabled"; -}; - -&swr0 { - status = "disabled"; -}; - -&wsa_spkr_en1 { - status = "disabled"; -}; -&wsa_spkr_en2 { - status = "disabled"; -}; -&fsa4480 { - status = "disabled"; -}; - diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-battery-common.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-battery-common.dtsi deleted file mode 100755 index 5c8c061d682a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-battery-common.dtsi +++ /dev/null @@ -1,622 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&smb1390 { - status = "disabled"; -}; - -&smb1390_charger { - status = "disabled"; -}; - -&soc { - battery { - status = "okay"; - compatible = "samsung,sec-battery"; - pinctrl-names = "default"; - - battery,vendor = "Battery"; - battery,charger_name = "sec-direct-charger"; - battery,fuelgauge_name = "s2mu107-fuelgauge"; - battery,technology = <2>; /* POWER_SUPPLY_TECHNOLOGY_LION */ - battery,fgsrc_switch_name = "s2mu107-fuelgauge"; /* Fuelgauge voltage source */ - - battery,batt_data_version = <4>; - - battery,chip_vendor = "LSI"; - battery,temp_channel_raw= <1>; /* BATTERY_TEMP_CHANNEL_RAW */ - battery,temp_adc_type = <1>; /* SEC_BATTERY_ADC_TYPE_AP */ - - battery,temp_check_type = <1>; /* SEC_BATTERY_TEMP_CHECK_ADC */ - battery,chg_temp_check_type = <0>; /* SEC_BATTERY_TEMP_CHECK_NONE temp*/ - - battery,thermal_source = <2>; /* SEC_BATTERY_THERMAL_SOURCE_ADC */ - battery,chg_thermal_source = <0>; /* SEC_CHARGER_THERMAL_SOURCE_FG */ - - battery,dchg_thermal_source = <3>; /* SEC_BATTERY_THERMAL_SOURCE_CHG_ADC */ - battery,polling_time = <10 30 30 30 3600>; - - - battery,temp_table_adc = < - 2127 2475 2966 3377 3975 4632 5454 6390 7499 8709 - 10058 11543 13049 14708 16448 18192 19800 21312 21895 23609 - 24866 25885 26387 - >; - battery,temp_table_data = < - 900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) - (-100) (-150) (-200) - >; - - battery,inbat_voltage = <1>; - - battery,inbat_voltage_table_adc = < - 2820 2795 2767 2737 2706 2686 2659 2630 2602 2574 - 2544 2514 2484 2456 2432 2405 2379 2351 2320 2292 - 2265 2236 2207 - >; - battery,inbat_voltage_table_data = < - 4400 4350 4300 4250 4200 4150 4100 4050 4000 3950 - 3900 3850 3800 3750 3700 3650 3600 3550 3500 3450 - 3400 3350 3300 - >; - battery,dchg_temp_table_adc = <110262 131376 159528 190026 225216 265098 307326 373014 436356 511428 - 593538 685032 783564 886788 992358 1100274 1205844 1299684 1391178 1470942 1538976 1595280 1642200>; - battery,dchg_temp_table_data = <900 850 800 750 700 650 600 550 500 450 - 400 350 300 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - - battery,adc_check_count = <5>; - - battery,cable_check_type = <4>; /* SEC_BATTERY_CABLE_CHECK_PSY */ - battery,cable_source_type = <1>; /* SEC_BATTERY_CABLE_SOURCE_EXTERNAL */ - battery,polling_type = <1>; /* SEC_BATTERY_MONITOR_ALARM */ - battery,monitor_initial_count = <0>; - - battery,pre_afc_input_current = <500>; - battery,prepare_afc_delay = <0>; - - battery,battery_check_type = <0>; /* SEC_BATTERY_CHECK_NONE */ - battery,check_count = <0>; - - battery,ovp_uvlo_check_type = <3>; /* SEC_BATTERY_OVP_UVLO_CHGPOLLING */ - - battery,temp_check_count = <1>; - battery,temp_highlimit_threshold_event = <800>; - battery,temp_highlimit_recovery_event = <750>; - battery,temp_high_threshold_event = <500>; - battery,temp_high_recovery_event = <480>; - battery,temp_low_threshold_event = <0>; - battery,temp_low_recovery_event = <20>; - battery,temp_highlimit_threshold_normal = <800>; - battery,temp_highlimit_recovery_normal = <750>; - battery,temp_high_threshold_normal = <500>; - battery,temp_high_recovery_normal = <480>; - battery,temp_low_threshold_normal = <0>; - battery,temp_low_recovery_normal = <20>; - battery,temp_highlimit_threshold_lpm = <800>; - battery,temp_highlimit_recovery_lpm = <750>; - battery,temp_high_threshold_lpm = <500>; - battery,temp_high_recovery_lpm = <480>; - battery,temp_low_threshold_lpm = <0>; - battery,temp_low_recovery_lpm = <20>; - battery,wpc_high_threshold_normal = <450>; - battery,wpc_high_recovery_normal = <400>; - battery,wpc_low_threshold_normal = <0>; - battery,wpc_low_recovery_normal = <50>; - - battery,full_check_type = <2>; /* SEC_BATTERY_FULLCHARGED_FG_CURRENT */ - battery,full_check_type_2nd = <2>; /* SEC_BATTERY_FULLCHARGED_FG_CURRENT */ - battery,full_check_count = <1>; - battery,chg_gpio_full_check = <0>; - battery,chg_polarity_full_check = <1>; - - battery,chg_heating_prevention_method = <1>; /* SEC_BATTERY_BY_CHANGING_CURRENT */ - battery,chg_high_temp = <470>; - battery,chg_high_temp_recovery = <430>; - battery,chg_input_limit_current = <1000>; - battery,chg_charging_limit_current = <1800>; - battery,dchg_input_limit_current = <1000>; - battery,dchg_charging_limit_current = <2000>; - - battery,mix_high_temp = <420>; - battery,mix_high_chg_temp = <500>; - battery,mix_high_temp_recovery = <390>; - - /* SEC_BATTERY_FULL_CONDITION_SOC | - * SEC_BATTERY_FULL_CONDITION_NOTIMEFULL | - * SEC_BATTERY_FULL_CONDITION_VCELL - */ - battery,full_condition_type = <13>; - battery,full_condition_soc = <93>; - battery,full_condition_vcell = <4250>; - - battery,recharge_check_count = <1>; - battery,recharge_condition_type = <4>; /* SEC_BATTERY_RECHARGE_CONDITION_VCELL */ - battery,recharge_condition_soc = <98>; - battery,recharge_condition_vcell = <4280>; - - battery,charging_total_time = <14400>; - battery,hv_charging_total_time = <10800>; - battery,normal_charging_total_time = <18000>; - battery,usb_charging_total_time = <36000>; - battery,recharging_total_time = <5400>; - battery,charging_reset_time = <0>; - - battery,chg_float_voltage = <4350>; - - battery,swelling_high_temp_block = <410>; - battery,swelling_high_temp_recov = <390>; - battery,swelling_wc_high_temp_recov = <390>; - battery,swelling_low_temp_block_1st = <150>; - battery,swelling_low_temp_recov_1st = <170>; - battery,swelling_low_temp_block_2nd = <50>; - battery,swelling_low_temp_recov_2nd = <70>; - - battery,swelling_low_temp_current = <1150>; /* 0.3C */ - battery,swelling_low_temp_current_2nd = <490>; - battery,swelling_low_temp_topoff = <245>; /* 0.05C */ - battery,swelling_high_temp_current = <1750>; /* 0.45C */ - battery,swelling_high_temp_topoff = <245>; /* 0.05C */ - battery,swelling_wc_high_temp_current = <750>; /* 0.3C */ - battery,swelling_wc_low_temp_current = <750>; /* 0.3C */ - - battery,swelling_drop_float_voltage = <4150>; - battery,swelling_high_rechg_voltage = <4000>; - battery,swelling_low_rechg_voltage = <4000>; - - battery,siop_event_check_type = <1>; - battery,siop_call_cv_current = <330>; - battery,siop_call_cc_current = <330>; - - battery,siop_input_limit_current = <1200>; - battery,siop_charging_limit_current = <1000>; - battery,siop_hv_input_limit_current = <700>; - battery,siop_hv_charging_limit_current = <1000>; - battery,input_current_by_siop_20 = <400>; - - battery,rp_current_rp1 = <500>; - battery,rp_current_rp2 = <1500>; - battery,rp_current_rp3 = <3000>; - battery,rp_current_rdu_rp3 = <2100>; - battery,rp_current_abnormal_rp3 = <1800>; - - battery,pd_charging_charge_power = <15000>; - battery,max_charging_current = <2200>; - battery,battery_full_capacity = <4900>; - - /* cycle, chg_float_voltage, recharge_condition_vcell, full_condition_vcell, full_condition_soc */ - battery,age_data = <0 4350 4280 4250 93 /*4.35*/ - 300 4330 4260 4230 92 /*4.33*/ - 400 4310 4240 4210 91 /*4.31*/ - 700 4290 4220 4190 90 /*4.29*/ - 1000 4240 4170 4140 89 /*4.24*/ - >; - - /* step charging option */ - battery,step_charging_type = <0>; - battery,step_charging_charge_power = <12000>; - battery,step_charging_condition = <45 100>; - battery,step_charging_condition_curr = <3150 3150>; - battery,step_charging_current = <3150 3150>; - battery,step_charging_float_voltage = <4150 4340>; - - /* direct step charging option */ - battery,dc_step_chg_type = <0x6B>; /* origin(0x6B), soc option is temporary removed */ - battery,dc_step_chg_charge_power = <22000>; - battery,dc_step_chg_step = <1>; - battery,dc_step_chg_cond_vol = <4340>; /* STEP_CHARGING_CONDITION_VOLTAGE */ - battery,dc_step_chg_cond_iin = <0>; /* STEP_CHARGING_CONDITION_INPUT_CURRENT */ - battery,dc_step_chg_iin_check_cnt = <1>; - battery,dc_step_chg_cond_soc = <100>; /* STEP_CHARGING_CONDITION_SOC */ - battery,dc_step_chg_val_vfloat = <4340>; /* STEP_CHARGING_CONDITION_FLOAT_VOLTAGE */ - battery,dc_step_chg_val_iout = <5100>; - - battery,max_input_voltage = <9000>; /* mV */ - battery,max_input_current = <3000>; /* mA */ - - battery,standard_curr = <2200>; - battery,expired_time = <12600>; /* 150 + 60 minutes */ - battery,recharging_expired_time = <5400>; - - battery,cisd_alg_index = <7>; - - battery,cisd_max_voltage_thr = <5000>; /* battery ovp detection voltage */ - - io-channels = <&pm6150_vadc ADC_BAT_THERM_PU2>; - io-channel-names = "adc-temp"; - - battery,recovery_cable; - battery,lowtemp_support_full_volt; - battery,enable_water_resistance; - }; - - - s2mu107-charger { - status = "disable"; - compatible = "samsung,s2mu107-switching-charger"; - }; - - s2mu107-direct-charger { - status = "enable"; - dc,direct_charger_name = "s2mu107-direct-charger"; - - dc,step_charge_level = <3>; - dc,dc_step_voltage_45w = <4130 4280 4400>; - dc,dc_step_current_45w = <6800 5200 3500>; - dc,dc_step_voltage_25w = <4090 4190 4350>; - dc,dc_step_current_25w = <4600 3900 3150>; - dc,dc_c_rate = <20 14 9>; - }; - - - sec-direct-charger { - status = "okay"; - compatible = "samsung,sec-direct-charger"; - - charger,battery_name = "battery"; - charger,main_charger = "s2mu107-switching-charger"; - charger,direct_charger = "s2mu107-direct-charger"; - - charger,dchg_min_current = <2000>; - charger,dchg_temp_low_threshold = <180>; - charger,dchg_temp_high_threshold = <410>; - }; - - 12c@13 { - s2mu107-fuelgauge@3B{ - compatible = "samsung,s2mu107-fuelgauge"; - reg = <0x3B>; - pinctrl-names = "default"; - pinctrl-0 = <&fuel_irq>; - fuelgauge,charger_name = "s2mu107-switching-charger"; - fuelgauge,fuel_int = <&tlmm 104 0>; - fuelgauge,fuel_alert_soc = <1>; - fuelgauge,fuel_alert_vol = <3300>; - fuelgauge,low_temp_limit = <100>; - fuelgauge,sw_vbat_l_recovery_vol = <3465>; - fuelgauge,capacity_max = <1000>; - fuelgauge,capacity_max_margin = <200>; - fuelgauge,capacity_min = <0>; - fuelgauge,capacity_calculation_type = <28>; - fuelgauge,capacity_full = <3000>; - fuelgauge,type_str = "SDI"; - fuelgauge,fg_log_enable = <1>; - }; - }; - -battery_params { - battery,battery_data = - < - /***** battery data for 4.35 *****/ - /* battery,battery_table3 */ - 26 11 146 10 10 10 148 9 37 9 - 186 8 98 8 216 7 166 7 88 7 - 237 6 175 6 132 6 98 6 72 6 - 45 6 3 6 219 5 152 5 127 5 - 72 4 159 1 107 8 0 8 149 7 - 42 7 192 6 85 6 234 5 127 5 - 20 5 170 4 63 4 212 3 105 3 - 254 2 148 2 41 2 190 1 83 1 - 233 0 126 0 19 0 225 15 - - /* battery,battery_table4 */ - 10 10 10 10 29 28 28 28 28 27 - 27 28 27 27 27 28 28 29 30 33 - 40 101 - - /* battery,batcap */ - 0x50 0x46 0x94 0x11 /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x08 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 10521 10000 9478 8957 8435 7914 7392 6871 6350 5828 - 5307 4785 4264 3742 3221 2699 2178 1656 1135 614 - 92 (-150) - - /* battery,ocv_arr_val */ - 43878 43212 42546 41974 41433 40907 40480 39806 39562 39181 - 38656 38354 38144 37980 37852 37717 37516 37321 36993 36871 - 35349 32025 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.33 *****/ - /* battery,battery_table3 */ - 76 11 200 10 68 10 193 9 79 9 - 227 8 135 8 251 7 186 7 119 7 - 35 7 198 6 147 6 110 6 82 6 - 59 6 31 6 247 5 196 5 144 5 - 245 4 162 1 240 8 130 8 20 8 - 165 7 55 7 201 6 90 6 236 5 - 126 5 16 5 161 4 51 4 197 3 - 87 3 232 2 122 2 12 2 157 1 - 47 1 193 0 83 0 228 15 - - /* battery,battery_table4 */ - 47 47 47 47 47 47 47 48 47 47 - 47 47 47 47 48 48 49 50 51 53 - 58 95 - - /* battery,batcap */ - 0xC8 0x4B 0xF2 0x12 /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 11172 10633 10096 9557 9019 8480 7942 7403 6865 6327 - 5788 5250 4711 4173 3634 3096 2558 2019 1481 942 - 404 (-135) - /* battery,ocv_arr_val */ - 44121 43477 42833 42192 41634 41106 40660 39975 39657 39330 - 38921 38466 38219 38038 37900 37787 37652 37457 37206 36955 - 36198 32039 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.31 *****/ - /* battery,battery_table3 */ - 76 11 200 10 68 10 193 9 79 9 - 227 8 135 8 251 7 186 7 119 7 - 35 7 198 6 147 6 110 6 82 6 - 59 6 31 6 247 5 196 5 144 5 - 245 4 162 1 24 9 168 8 56 8 - 199 7 87 7 231 6 119 6 7 6 - 150 5 38 5 182 4 70 4 214 3 - 102 3 245 2 133 2 21 2 165 1 - 53 1 196 0 84 0 228 15 - - /* battery,battery_table4 */ - 47 47 47 47 47 47 47 48 47 47 - 47 47 47 47 48 48 49 50 51 53 - 58 95 - - /* battery,batcap */ - 0x38 0x4A 0x8E 0x12 /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 11368 10820 10271 9724 9176 8628 8081 7533 6985 6437 - 5889 5341 4794 4246 3698 3150 2602 2054 1507 959 - 411 (-137) - - /* battery,ocv_arr_val */ - 44121 43477 42833 42192 41634 41106 40660 39975 39657 39330 - 38921 38466 38219 38038 37900 37787 37652 37457 37206 36955 - 36198 32039 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.29 *****/ - /* battery,battery_table3 */ - 76 11 200 10 68 10 193 9 79 9 - 227 8 135 8 251 7 186 7 119 7 - 35 7 198 6 147 6 110 6 82 6 - 59 6 31 6 247 5 196 5 144 5 - 245 4 162 1 71 9 212 8 98 8 - 239 7 125 7 11 7 152 6 38 6 - 179 5 65 5 206 4 92 4 233 3 - 119 3 4 3 146 2 32 2 173 1 - 59 1 200 0 86 0 227 15 - - /* battery,battery_table4 */ - 47 47 47 47 47 47 47 48 47 47 - 47 47 47 47 48 48 49 50 51 53 - 58 95 - - /* battery,batcap */ - 0xA8 0x48 0x2A 0x12 /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 11596 11036 10478 9919 9360 8802 8243 7684 7125 6566 - 6007 5449 4890 4331 3772 3212 2654 2096 1537 978 - 419 (-140) - - /* battery,ocv_arr_val */ - 44121 43477 42833 42192 41634 41106 40660 39975 39657 39330 - 38921 38466 38219 38038 37900 37787 37652 37457 37206 36955 - 36198 32039 - - /* battery,tunning */ - 0x00 - - /***** battery data for 4.24 *****/ - /* battery,battery_table3 */ - 76 11 200 10 68 10 193 9 79 9 - 227 8 135 8 251 7 186 7 119 7 - 35 7 198 6 147 6 110 6 82 6 - 59 6 31 6 247 5 196 5 144 5 - 245 4 162 1 196 9 76 9 211 8 - 91 8 226 7 106 7 241 6 121 6 - 0 6 136 5 15 5 151 4 30 4 - 166 3 45 3 181 2 60 2 196 1 - 75 1 211 0 90 0 226 15 - - /* battery,battery_table4 */ - 47 47 47 47 47 47 47 48 47 47 - 47 47 47 47 48 48 49 50 51 53 - 58 95 - - /* battery,batcap */ - 0x88 0x45 0x62 0x11 /* [0x0E] [0x0F] [0x10] [0x11] */ - /* battery,accum */ - 0x00 0x8 /* [0x44] [0x45] */ - - /* battery,soc_arr_val */ - 12208 11619 11031 10443 9854 9266 8678 8088 7501 6913 - 6324 5736 5148 4559 3971 3383 2795 2206 1618 1030 - 441 (-147) - /* battery,ocv_arr_val */ - 44121 43477 42833 42192 41634 41106 40660 39975 39657 39330 - 38921 38466 38219 38038 37900 37787 37652 37457 37206 36955 - 36198 32039 - - /* battery,tunning */ - 0x00 - >; - - battery,battery_table3 = < - 26 11 146 10 10 10 148 9 37 9 - 186 8 98 8 216 7 166 7 88 7 - 237 6 175 6 132 6 98 6 72 6 - 45 6 3 6 219 5 152 5 127 5 - 72 4 159 1 107 8 0 8 149 7 - 42 7 192 6 85 6 234 5 127 5 - 20 5 170 4 63 4 212 3 105 3 - 254 2 148 2 41 2 190 1 83 1 - 233 0 126 0 19 0 225 15 - >; - - battery,battery_table4 = < - 10 10 10 10 29 28 28 28 28 27 - 27 28 27 27 27 28 28 29 30 33 - 40 101 - >; - - battery,batcap = <0x50 0x46 0x94 0x11>; /* [0x0E] [0x0F] [0x10] [0x11] */ - - battery,soc_arr_val = < - 10521 10000 9478 8957 8435 7914 7392 6871 6350 5828 - 5307 4785 4264 3742 3221 2699 2178 1656 1135 614 - 92 (-150) - >; - - battery,ocv_arr_val = < - 43878 43212 42546 41974 41433 40907 40480 39806 39562 39181 - 38656 38354 38144 37980 37852 37717 37516 37321 36993 36871 - 35349 32025 - >; - - }; - -/* sec_battery_cable - * 0 UNKNOWN, - * 1 NONE, - * 2 PREPARE_TA, - * 3 TA, - * 4 USB, - * 5 USB_CDP, - * 6 9V_TA, - * 7 9V_ERR, - * 8 9V_UNKNOWN, - * 9 12V_TA, - * 10 WIRELESS, - * 11 HV_WIRELESS, - * 12 PMA_WIRELESS, - * 13 WIRELESS_PACK, - * 14 WIRELESS_PACK_TA, - * 15 WIRELESS_STAND, - * 16 WIRELESS_HV_STAND, - * 17 QC20, - * 18 QC30, - * 19 PDIC, - * 20 UARTOFF, - * 21 OTG, - * 22 LAN_HUB, - * 23 POWER_SHARING, - * 24 HMT_CONNECTED, - * 25 HMT_CHARGE, - * 26 HV_TA_CHG_LIMIT, - * 27 WIRELESS_VEHICLE, - * 28 WIRELESS_HV_VEHICLE, - * 29 PREPARE_WIRELESS_HV, - * 30 TIMEOUT, - * 31 SMART_OTG, - * 32 SMART_NOTG, - * 33 WIRELESS_TX, - * 34 WIRELESS_HV_20, - * 35 WIRELESS_HV_20_LIMIT, - * 36 WIRELESS_FAKE, - * 37 WIRELESS_HV_20_PREPARE, - * 38 PDIC_APDO, - * 39 POGO, - */ - - cable-info { - default_input_current = <1800>; - default_charging_current = <2100>; - full_check_current_1st = <500>; - full_check_current_2nd = <250>; - - current_group_1 { - cable_number = <1 4 19 21 22 23 30>; - input_current = <500>; - charging_current = <500>; - }; - - current_group_2 { - cable_number = <2 25>; - input_current = <1000>; - charging_current = <1000>; - }; - - current_group_3 { - cable_number = <5>; - input_current = <1500>; - charging_current = <1500>; - }; - - current_group_4 { - cable_number = <6 7 8>; - input_current = <1650>; - charging_current = <3150>; - }; - - current_group_5 { - cable_number = <9>; - input_current = <1650>; - charging_current = <2200>; - }; - - current_group_6 { - cable_number = <10 12 14 15 27>; - input_current = <900>; - charging_current = <1200>; - }; - - current_group_7 { - cable_number = <13>; - input_current = <700>; - charging_current = <1200>; - }; - - current_group_8 { - cable_number = <24>; - input_current = <1000>; - charging_current = <450>; - }; - - current_group_9 { - cable_number = <26>; - input_current = <2000>; - charging_current = <1800>; - }; - - current_group_10 { - cable_number = <11 16 28>; - input_current = <650>; - charging_current = <1200>; - }; - - current_group_11 { - cable_number = <29>; - input_current = <500>; - charging_current = <1200>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-battery-r02.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-battery-r02.dtsi deleted file mode 100755 index 39f48ad6800c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-battery-r02.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a70sq-battery-r03.dtsi" - -&pm6150_qg { - /* fix bat temp because of hw issue */ - qcom,fake_temp; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-battery-r03.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-battery-r03.dtsi deleted file mode 100755 index 18c501e72200..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-battery-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a70sq-battery-common.dtsi" - -&smb1390_charger { - io-channels = <&pm6150l_vadc ADC_AMUX_THM1_PU2>; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-common.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-common.dtsi deleted file mode 100755 index 803c768902da..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-common.dtsi +++ /dev/null @@ -1,172 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "sm7150-sec-a70sq-audio.dtsi" -#include "sm7150-sec-a70sq-input-common.dtsi" -#include "sm7150-sec-a70sq-mst-r00.dtsi" - -&aliases { - i2c17 = &i2c_17; - hsuart8 = "/soc/qcom,qup_hsuart@0xa88000"; -}; - -&soc { - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = <&tlmm 25 0 /* sda */ - &tlmm 26 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&grip_i2c_active>; - pinctrl-1 = <&grip_i2c_suspend>; - - a96t3x6@21 { - compatible = "a96t3x6"; - reg = <0x21>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_int_active>; - pinctrl-1 = <&grip_int_suspend>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - a96t3x6,irq_gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_LOW>; - a96t3x6,dvdd_vreg_name = "pm6150l_l11"; - a96t3x6,fw_path = "abov/a96t356_a70sq.bin"; - a96t3x6,firmup_cmd = <0x3b>; - }; - - a96t3x6_sub@20 { - compatible = "a96t3x6_sub"; - reg = <0x20>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_sub_int_active>; - pinctrl-1 = <&grip_sub_int_suspend>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - a96t3x6,irq_gpio = <&pm6150l_gpios 6 GPIO_ACTIVE_LOW>; - a96t3x6,dvdd_vreg_name = "pm6150_l16"; - a96t3x6,fw_path = "abov/a96t356_a70sq_sub.bin"; - a96t3x6,firmup_cmd = <0x3b>; - }; - }; - - /* Sensor */ - qcom,lpass@62400000 { - sensor_vdd-supply = <&pm6150l_l8>; - qcom,sensor_vdd-uV-uA = <1800000 0>; - qcom,active-reg-names = "sensor_vdd"; - }; - - ssc_core { - status = "okay"; - compatible = "ssc_core"; - ssc_core,mst_gpio = <&tlmm 30 0x0>; - }; - - sec_detect_conn { - compatible = "samsung,sec_detect_conn"; - sec,det_conn_gpios = <&tlmm 66 0>; /* UB_CON_DETECT */ - - sec,det_conn_name = "UB_CONNECT"; - - sec,det_conn_irq_type = <3>; /* UB_CON_DETECT FALLING, RIGING EDGE*/ - - pinctrl-names = "det_ap_connect"; - pinctrl-0 = <&detect_conn_setting>; - }; - - sec_abc { - compatible = "samsung,sec_abc"; - status = "okay"; - - gpu { - gpu,label="GPU fault"; - gpu,threshold_count=<20>; - gpu,threshold_time=<1200>; - }; - aicl { - aicl,label="battery aicl"; - aicl,threshold_count=<5>; - aicl,threshold_time=<300>; - }; - }; - - abc_hub { - compatible = "samsung,abc_hub"; - status = "okay"; - - pinctrl-names = "det_ap_connect"; - pinctrl-0 = <&detect_conn_setting>; - - bootc { - bootc,time_spec_user = <100000>; /* user binary user build */ - bootc,time_spec_eng = <100000>; /* user binary eng build */ - bootc,time_spec_fac = <100000>; /* factory binary */ - }; - - cond { - sec,det_conn_gpios = <&tlmm 66 0>; /* UB_CONNECT */ - sec,det_conn_name = "ub"; - }; - }; - - qupv3_se8_2hsuart: qcom,qup_hsuart@0xa88000 { - compatible = "qcom,msm-geni-serial-hs", "qcom,msm-geni-uart"; - reg = <0xa88000 0x4000>; - reg-names = "se_phys"; - clock-names = "se-clk", "m-ahb", "s-ahb"; - clocks = <&clock_gcc GCC_QUPV3_WRAP1_S2_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_M_AHB_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_1_S_AHB_CLK>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&qupv3_se8_2uart_active>; - pinctrl-1 = <&qupv3_se8_2uart_sleep>; - interrupts = ; - qcom,wrapper-core = <&qupv3_1>; - status = "ok"; - always-on-clock; - }; -}; - -/* Grip Sensor */ -&pm6150_l16 { - regulator-min-microvolt = <3000000>; - regulator-max-microvolt = <3000000>; - qcom,init-voltage = <3000000>; -}; - -&pm6150l_l11 { - regulator-min-microvolt = <3000000>; - regulator-max-microvolt = <3000000>; - qcom,init-voltage = <3000000>; -}; - -/* not use eMMC */ -&sdhc_1 { - status = "disabled"; -}; -/* not use SDcard */ -&sdhc_2 { - cd-gpios = <&tlmm 88 0x0>; -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-display-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-display-r00.dtsi deleted file mode 100755 index 06f3ee152a73..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-display-r00.dtsi +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../drivers/gpu/drm/msm/samsung/ANA6705_AMS670TD01/dsi_panel_ANA6705_AMS670TD01_fhd_octa_cmd.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio11","gpio69", "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio11","gpio69", "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio11","gpio69", "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio11","gpio69", "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; -}; - -&soc { - /* A70s panel */ - ss_dsi_panel_ANA6705_AMS670TD01_FHD_display: qcom,dsi-display@9 { - label = "ss_dsi_panel_ANA6705_AMS670TD01_FHD"; - qcom,display-type = "primary"; - - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@10 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - - }; -}; - -&sde_dsi { - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_te_active &sde_dsi_active>; - pinctrl-1 = <&sde_te_suspend &sde_dsi_suspend>; - qcom,dsi-display-list = - <&ss_dsi_panel_ANA6705_AMS670TD01_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; -}; - -&ss_dsi_panel_ANA6705_AMS670TD01_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_ANA6705_AMS670TD01_FHD>; - - qcom,platform-en-gpio = <&tlmm 69 0>; /* LCD_EN_3P0 */ - qcom,platform-reset-gpio = <&tlmm 11 0>; /* OCTA_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-en-gpio = <&tlmm 69 0>; - qcom,platform-reset-gpio = <&tlmm 11 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; - diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-display-r01.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-display-r01.dtsi deleted file mode 100755 index 58c49e56f849..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-display-r01.dtsi +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../drivers/gpu/drm/msm/samsung/ANA6705_AMS667UK01/dsi_panel_ANA6705_AMS667UK01_fhd_octa_cmd.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio11","gpio69","gpio64"; - function = "gpio"; - }; - - config { - pins = "gpio11","gpio69","gpio64"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio11","gpio69", "gpio64"; - function = "gpio"; - }; - - config { - pins = "gpio11","gpio69", "gpio64"; - drive-strength = <2>; /* 2 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_esd_active: sde_esd_active { /*EL_ON1_DET gpio*/ - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_esd_suspend: sde_esd_suspend { - mux { - pins = "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; -}; - -&soc { - /* A70s panel */ - ss_dsi_panel_ANA6705_AMS667UK01_FHD_display: qcom,dsi-display@9 { - label = "ss_dsi_panel_ANA6705_AMS667UK01_FHD"; - qcom,display-type = "primary"; - - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@10 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - - }; -}; - -&sde_dsi { - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_te_active &sde_dsi_active &sde_esd_active>; - pinctrl-1 = <&sde_te_suspend &sde_dsi_suspend &sde_esd_suspend>; - qcom,dsi-display-list = - <&ss_dsi_panel_ANA6705_AMS667UK01_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; -}; - -&ss_dsi_panel_ANA6705_AMS667UK01_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_ANA6705_AMS667UK01_FHD>; - - qcom,platform-en-gpio = <&tlmm 69 0>; /* LCD_EN_3P0 */ - qcom,platform-reset-gpio = <&tlmm 11 0>; /* OCTA_RST_N */ - qcom,platform-te-gpio = <&tlmm 10 0>; /* DISP_TE */ - samsung,support-optical-fingerprint; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-en-gpio = <&tlmm 69 0>; - qcom,platform-reset-gpio = <&tlmm 11 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; - diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eif-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eif-r00.dtsi deleted file mode 100755 index b7f5de7b8c7c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eif-r00.dtsi +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - samsung,vibrator { - compatible = "samsung_vib"; -// samsung,vib_pwm = <&tlmm 136 0>; -// samsung,vib_power = <&pm8150_gpios 10 0>; -// samsung,gp_clk = <0x00164000>; // Address of GP1 clock - samsung,chip_model = <4>; // using max77705 driver - samsung,vib_type = "COINDC"; - status = "ok"; - - pinctrl-names = "tlmm_pwm_default"; - pinctrl-0 = <&pwm_out_gpio6_default>; - pwms = <&pm6150l_pwm 0 1000000>; - - }; - - hall { - status = "okay"; - compatible = "hall"; - linux,input-type = <1>; - linux,code = <21>; - hall,gpio_flip_cover = <&tlmm 91 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&hall_default>; - }; - - certify_hall { - status = "okay"; - compatible = "certify_hall"; - linux,input-type = <1>; - linux,code = <27>; - certify_hall,gpio_certify_cover = <&tlmm 93 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&certify_hall_default>; - }; - - samsung,usbpd { - compatible = "samsung,usb-pd"; - qcom,samsung-usbpd-detection = <&pm6150_pdphy>; - }; - - usb_noti: usb-notifier { - compatible = "samsung,usb-notifier"; - qcom,disable_control_en = <1>; - qcom,unsupport_host_en = <0>; - }; -}; - -&i2c_13 { - s2mu107@3A { - status = "okay"; - compatible = "samsung,s2mu107mfd"; - reg = <0x3A>; - pinctrl-names = "default"; - pinctrl-0 = <&if_pmic_irq>; - s2mu107,irq-gpio = <&tlmm 68 0>; - s2mu107,wakeup; - }; - - usbpd-s2mu107@3C { - compatible = "sec-usbpd,i2c"; - reg = <0x3C>; - pinctrl-names = "default"; - pinctrl-0 = <&usbpd_irq>; - usbpd,usbpd_int = <&tlmm 32 0>; - }; -}; - -&usb0 { - dwc3@a600000 { - usb-phy = <&qusb_phy0>, <&usb_nop_phy>; - maximum-speed = "high-speed"; - }; -}; - -&usb_qmp_dp_phy { - status = "disabled"; -}; - -&pm6150l_gpios { - pwm_out_gpio6 { - pwm_out_gpio6_default: pwm_out_gpio6_default { - pins = "gpio6"; - function = "func1"; - bias-disable; - power-source = <0>; - output-low; - qcom,drive-strength = <3>; - drive-push-pull; - }; - }; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x1c 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x77 0x240 /* TUNE1 */ - 0x29 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x02 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,qusb-phy-host-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x20 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x45 0x240 /* TUNE1 */ - 0x29 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x04 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,diff_tune_host = <(0)>; /* efuse(0x3) + 0 = 7 for tune high value */ - qcom,diff_tune_device = <(4)>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-overlay-r00.dts deleted file mode 100755 index 1dd6885504b8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-overlay-r00.dts +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-a70sq-pm-common.dtsi" - -#include "sm7150-sec-a70sq-eur-r00.dtsi" -#include "sm7150-sec-a70sq-eur-pinctrl-r00.dtsi" -#include "sm7150-sec-a70sq-display-r00.dtsi" -#include "sm7150-sec-a70sq-eif-r00.dtsi" -#include "sm7150-sec-a70sq-battery-common.dtsi" -#include "sm7150-sec-a70sq-fingerprint_00.dtsi" -#include "sm7150-sec-a70sq-nfc-r00.dtsi" -#include "sm7150-camera-sensor-a70sq-r00.dtsi" - -/ { - model = "Samsung A70SQ PROJECT Rev0.0 (board-id,00)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "ok"; - }; - mms_ts@48 { - status = "disabled"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-overlay-r01.dts deleted file mode 100755 index 112233322f14..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-overlay-r01.dts +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-a70sq-pm-common.dtsi" - -#include "sm7150-sec-a70sq-eur-r01.dtsi" -#include "sm7150-sec-a70sq-eur-pinctrl-r01.dtsi" -#include "sm7150-sec-a70sq-display-r01.dtsi" -#include "sm7150-sec-a70sq-eif-r00.dtsi" -#include "sm7150-sec-a70sq-battery-common.dtsi" -#include "sm7150-sec-a70sq-fingerprint_00.dtsi" -#include "sm7150-sec-a70sq-nfc-r00.dtsi" -#include "sm7150-camera-sensor-a70sq-r00.dtsi" - -/ { - model = "Samsung A70SQ PROJECT Rev0.1 (board-id,01)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-pinctrl-r00.dtsi deleted file mode 100755 index 036a02e6abdc..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-pinctrl-r00.dtsi +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a70sq-pinctrl-common.dtsi" - -&pm6150_gpios { - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&soc { - -}; - -&tlmm { - usbpd_irq: usbpd_irq { - mux { - pins = "gpio32"; - function = "gpio"; - }; - config { - pins = "gpio32"; - drive-strength = <2>; - bias-disable; - input-enable; - }; - }; - - if_pmic_irq: if_pmic_irq { - mux { - pins = "gpio68"; - function = "gpio"; - }; - config { - pins = "gpio68"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; - - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-pinctrl-r01.dtsi deleted file mode 100755 index 54ddeda241ae..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-pinctrl-r01.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -#include "sm7150-sec-a70sq-eur-pinctrl-r00.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-r00.dtsi deleted file mode 100755 index fb47554d35f5..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-r00.dtsi +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a70sq-common.dtsi" -// #include "sm6150-sec-a70q-input-common.dtsi" - -&soc { - sec_thermistor@0 { - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - }; -}; - -&pm6150l_vadc { - sdm_therm { - reg = ; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-r01.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-r01.dtsi deleted file mode 100755 index 1c1b35f9b793..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-eur-r01.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -#include "sm7150-sec-a70sq-eur-r00.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-fingerprint_00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-fingerprint_00.dtsi deleted file mode 100755 index a097dbca6ad0..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-fingerprint_00.dtsi +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&tlmm { - etspi_rstpin { - etspi_rstpin: etspi_rstpin { - mux { - pins = "gpio58"; - function = "gpio"; - }; - config { - pins = "gpio58"; - driver-strength = <2>; - bias-pull-down; - }; - }; - }; -}; - -&pm6150l_l7 { - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; -}; - -&soc { - qupv3_se6_spi: spi@0xa80000 { - status = "okay"; - - etspi-spi@0 { - compatible = "etspi,et7xx"; - reg = <0>; - spi-max-frequency = <50000000>; - etspi-min_cpufreq_limit = <2169600>; - - pinctrl-names = "default"; - pinctrl-0 = <&etspi_rstpin>; - - gpio-controller; - #gpio-cells = <2>; - - etspi-regulator = "pm6150l_l7"; - etspi-sleepPin = <&tlmm 58 0>; - etspi-chipid = "ET715"; - etspi-modelinfo = "A715"; - etspi-position = "12.71,0.00,9.10,9.10,14.80,14.80,12.00,12.00,5.00"; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-input-common.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-input-common.dtsi deleted file mode 100755 index 84ee63f04396..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-input-common.dtsi +++ /dev/null @@ -1,138 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - -&tlmm { - attn_irq: attn_irq { - mux { - pins = "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio9"; - input-enable; - bias-disable; /* No PULL */ - drive-strength = <2>; - }; - }; - attn_input: attn_input { - mux { - pins = "gpio9"; - function = "gpio"; - }; - - config { - pins = "gpio9"; - /*input-enable;*/ - bias-disable; - drive-strength = <2>; - }; - }; -}; - -&qupv3_se7_i2c { - status = "ok"; - - touchscreen@50 { - compatible = "imagis,ist40xx-ts"; - reg = <0x50>; - imagis,irq-gpio = <&tlmm 9 0>; - imagis,regulator_avdd = "tsp_ldo_en"; - imagis,fw-bin = <1>; - imagis,octa-hw = <1>; - imagis,area-size = <63 126 60>; /* indicator: 24dp~63px navigator:48dp~126px edge:60px | dpi:420*/ - imagis,ic-version = "ist40xx"; - imagis,project-name = "a70s"; - imagis,tclm_level = <1>; - imagis,afe_base = <0x0000>; - imagis,factory_item_version = <1>; - imagis,cm_spec = <300 2200 43>; /* min, max, gap */ - enable_fpcb_noise_test; - enable_settings_aot; - support_fod; - status = "ok"; - }; - - mms_ts@48 { - compatible = "melfas,mms_ts"; - reg = <0x48>; - pinctrl-names = "on_state", "off_state"; - pinctrl-0 = <&attn_irq>; - pinctrl-1 = <&attn_input>; - melfas,irq-gpio = <&tlmm 9 0>; - melfas,scl-gpio = <&tlmm 7 0>; - melfas,sda-gpio = <&tlmm 6 0>; - melfas,vdd_en = "tsp_ldo_en"; - /*melfas,io_en = "tsp_io";*/ - melfas,area-size = <133 266 341>; /* indicator: 24dp navigator:48dp edge:60px TSP resolution is 4095 x 4095 */ - melfas,max_x_y = <4095 4095>; /* x & y */ - melfas,node_info = <16 34 0>; /* x & y & key */ - melfas,event_info = <8 12>; /* event format & event size */ - melfas,support_lpm; - melfas,fw_name = "tsp_melfas/mss100_a70s.bin"; - melfas,project_name = "A715"; - support_ear_detect_mode; - enable_settings_aot; - support_fod; - status = "ok"; - }; -}; - -/delete-node/&key_vol_up_default; -&pm6150l_gpios { - key_vol_up { - key_vol_up_default: key_vol_up_default { - pins = "gpio2"; - function = "normal"; - input-enable; - bias-pull-up; - power-source = <0>; - }; - }; -}; - -&soc { - /delete-node/gpio_keys; - gpio_keys { - status = "ok"; - compatible = "gpio-keys"; - input-name = "gpio-keys"; - - pinctrl-names = "default"; - pinctrl-0 = <&key_vol_up_default>; - - vol_up { - label = "volume_up"; - gpios = <&pm6150l_gpios 2 0x1>; - linux,input-type = <1>; - linux,code = ; - debounce-interval = <15>; - }; - }; - - ss_touch { - compatible = "samsung,ss_touch"; - ss_touch,numbers = <1>; - }; - - tsp_ldo_en { - compatible = "regulator-fixed"; - regulator-name = "tsp_ldo_en"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - gpio = <&tlmm 56 0>; - enable-active-high; - regulator-boot-on; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-mst-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-mst-r00.dtsi deleted file mode 100755 index 46160187ad33..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-mst-r00.dtsi +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2019, Samsung Electronics Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - sec-mst { - compatible = "sec-mst"; - sec-mst,mst-pwr-gpio = <&tlmm 5 0>; - sec-mst,mst-data-gpio = <&tlmm 83 0>; - sec-mst,mst-en-gpio = <&tlmm 84 0>; - sec-mst,mst-support-gpio = <&pm6150l_gpios 4 0>; - - //pinctrl-names = "mst_active"; - //pinctrl-0 = <&mst_data_init &mst_en_init>; - }; -/* - tlmm: pinctrl@03000000 { - mst_data_init: mst_data_init { - mux { - pins = "gpio84"; - function = "gpio"; - }; - config { - pins = "gpio84"; - drive-strength = <16>; - bias-pull-down; - output_low; - }; - }; - mst_en_init: mst_en_init { - mux { - pins = "gpio83"; - function = "gpio"; - }; - config { - pins = "gpio83"; - drive-strength = <16>; - bias-pull-down; - output_low; - }; - }; - }; -*/ -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-nfc-r00.dtsi deleted file mode 100755 index 0e0a9960e7d3..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-nfc-r00.dtsi +++ /dev/null @@ -1,99 +0,0 @@ - -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi2 = &qupv3_se1_spi; - }; -}; -*/ - -&tlmm { - ese_qupv3_se1_spi_sleep: qupv3_se1_spi_sleep { - mux { - pins = "gpio0", "gpio1", "gpio2", - "gpio3"; - function = "gpio"; - }; - - config { - pins = "gpio0", "gpio1", "gpio2", - "gpio3"; - drive-strength = <6>; - bias-pull-down; - output-low; - }; - }; - - nfc_qupv3_se2_i2c_sleep: nfc_qupv3_se2_i2c_sleep { - mux { - pins = "gpio34", "gpio35"; - function = "gpio"; - }; - - config { - pins = "gpio34", "gpio35"; - drive-strength = <2>; - bias-disable; - }; - }; -}; - -&pm6150l_gpios { - nfc_det_gpio: nfc_det_gpio { - pins = "gpio1"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; - -/* gpio34 and gpio35 are used for nfc i2c */ -&qupv3_se2_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se2_i2c_sleep>; - - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <37 0>; - pn547,irq-gpio = <&tlmm 37 0>; - pn547,ven-gpio = <&tlmm 12 0>; - pn547,firm-gpio = <&tlmm 36 0>; - pn547,clk_req-gpio = <&tlmm 31 0>; /* BBCLK3 is controled by gpio 31 */ - pn547,pwr_req = <&tlmm 94 0>; - pn547,pvdd-gpio = <&tlmm 65 0>; - /* pn547,nfc-det-gpio = <&pm6150l_gpios 1 0>; */ /* need to be checked */ - pn547,clk_req_wake; - }; -}; - -/* gpio 0~3 are used for ese spi */ -&qupv3_se1_spi { - status = "okay"; - spi-max-frequency = <19200000>; - pinctrl-1 = <&ese_qupv3_se1_spi_sleep>; - - ese_spi@0 { - compatible = "p61"; - reg = <0>; - spi-max-frequency = <16000000>; - p61-ap_vendor = "qualcomm"; - p61-spi_node = <&qupv3_se1_spi>; - ese-det-gpio = <&pm6150l_gpios 1 0>; /* eSE_UICC_CHECK */ - pinctrl-names = "default"; - pinctrl-0 = <&nfc_det_gpio>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-pinctrl-common.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-pinctrl-common.dtsi deleted file mode 100755 index e7a2d2a44941..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-pinctrl-common.dtsi +++ /dev/null @@ -1,408 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a70sq-audio-pinctrl.dtsi" - -&tlmm { - s2mpb03_i2c_pins { - s2mpb03_i2c_active: s2mpb03_i2c_active { - mux { - pins = "gpio46", "gpio47"; - function = "gpio"; - }; - config { - pins = "gpio46", "gpio47"; - drive-strength = <2>; - bias-disable; - }; - }; - }; - - grip_i2c { - grip_i2c_active: grip_i2c_active { - grip_i2c_active { - pins = "gpio25", "gpio26"; - bias-disable; - }; - }; - grip_i2c_suspend: grip_i2c_suspend { - grip_i2c_suspend { - pins = "gpio25", "gpio26"; - bias-disable; - }; - }; - }; - - fuel_irq: fuel_irq { - config { - pins = "gpio104"; - bias-disable; /* No PULL */ - }; - }; - - hall_default: hall_default { - mux { - pins = "gpio91"; - function = "gpio"; - }; - config { - pins = "gpio91"; - drive-strength = <2>; - bias-disable; - }; - }; - - certify_hall_default: certify_hall_default { - mux { - pins = "gpio93"; - function = "gpio"; - }; - config { - pins = "gpio93"; - drive-strength = <2>; - bias-disable; - }; - }; - - sdc2_cd_on: cd_on { - mux { - pins = "gpio88"; - function = "gpio"; - }; - - config { - pins = "gpio88"; - drive-strength = <2>; - bias-disable; - }; - }; - - sdc2_cd_off: cd_off { - mux { - pins = "gpio88"; - function = "gpio"; - }; - - config { - pins = "gpio88"; - drive-strength = <2>; - bias-disable; - }; - }; - - cam_sensor_mclk0_active: cam_sensor_mclk0_active { - /* Main Rear MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk0_suspend: cam_sensor_mclk0_suspend { - /* Main Rear MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk1_active: cam_sensor_mclk1_active { - /* FRONT MCLK */ - mux { - pins = "gpio14"; - function = "cam_mclk"; - }; - config { - pins = "gpio14"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk1_suspend: cam_sensor_mclk1_suspend { - /* FRONT MCLK */ - mux { - pins = "gpio14"; - function = "cam_mclk"; - }; - config { - pins = "gpio14"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk2_active: cam_sensor_mclk2_active { - /* Bokeh Cam MCLK */ - mux { - pins = "gpio16"; - function = "cam_mclk"; - }; - config { - pins = "gpio16"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk2_suspend: cam_sensor_mclk2_suspend { - /* Bokeh Cam MCLK */ - mux { - pins = "gpio16"; - function = "cam_mclk"; - }; - config { - pins = "gpio16"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - }; - }; - - cam_sensor_mclk3_active: cam_sensor_mclk3_active { - /* UW Cam MCLK */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - config { - pins = "gpio15"; - bias-disable; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - }; - }; - - cam_sensor_mclk3_suspend: cam_sensor_mclk3_suspend { - /* UW Cam MCLK */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - config { - pins = "gpio15"; - bias-pull-down; /* No PULL */ - drive-strength = <6>; /* 6 MA */ - output-low; - - }; - }; - - cam_sensor_rear_active: cam_sensor_rear_active { - /* Main Rear reset */ - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_rear_suspend: cam_sensor_rear_suspend { - /* Main Rear reset */ - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_front_active: cam_sensor_front_active { - /* FRONT RESET */ - mux { - pins = "gpio23"; - function = "gpio"; - }; - config { - pins = "gpio23"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_front_suspend: cam_sensor_front_suspend { - /* FRONT RESET */ - mux { - pins = "gpio23"; - function = "gpio"; - }; - config { - pins = "gpio23"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - - - cam_sensor_rear3sw_active: cam_sensor_rear3sw_active { - /* UW Cam RESET */ - mux { - pins = "gpio53"; - function = "gpio"; - }; - config { - pins = "gpio53"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_rear3sw_suspend: cam_sensor_rear3sw_suspend { - /* UW Cam RESET */ - mux { - pins = "gpio53"; - function = "gpio"; - }; - config { - pins = "gpio53"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_rear3_pwr_active: cam_rear3_pwr_active { - /* UW VANA */ - mux { - pins = "gpio4"; - function = "gpio"; - }; - config { - pins = "gpio4"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_rear3_pwr_suspend: cam_rear3_pwr_suspend { - /* UW VANA */ - mux { - pins = "gpio4"; - function = "gpio"; - }; - config { - pins = "gpio4"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear_sub2_active: cam_sensor_rear_sub2_active { - /* Bokeh Cam RESET */ - mux { - pins = "gpio67"; - function = "gpio"; - }; - config { - pins = "gpio67"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear_sub2_suspend: cam_sensor_rear_sub2_suspend { - /* Bokeh Cam RESET */ - mux { - pins = "gpio67"; - function = "gpio"; - }; - config { - pins = "gpio67"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - led_enable: led_enable { - mux { - pins = "gpio22"; - function = "gpio"; - }; - - config { - pins = "gpio22"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - led_disable: led_disable { - mux { - pins = "gpio22"; - function = "gpio"; - }; - - config { - pins = "gpio22"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - detect_conn { - detect_conn_setting: detect_conn_setting { - config { - pins = "gpio66"; - drive-strength = <2>; - bias-disable; /* No PULL */ - input-enable; - }; - }; - }; -}; - -&pm6150l_gpios { - grip_int_active: grip_int_active { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_int_suspend: grip_int_suspend { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - - grip_sub_int_active: grip_sub_int_active { - pins = "gpio6"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_sub_int_suspend: grip_sub_int_suspend { - pins = "gpio6"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-pm-common.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-pm-common.dtsi deleted file mode 100755 index bdb1c65529f0..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-pm-common.dtsi +++ /dev/null @@ -1,320 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include - -&soc { - /* AP Thermistor table */ - sec_thermistor@0 { - compatible = "samsung,sec-ap-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "ap_therm"; - adc_array = <1806 2208 2620 3076 3638 4355 5223 - 6133 7170 8378 9652 11107 12609 - 14233 15644 17608 19255 20912 22081 23487 24556 25655 26345>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* PA Thermistor table */ - sec_thermistor@1 { - compatible = "samsung,sec-pa-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "pa_therm"; - adc_array = <1861 2268 2690 3132 3730 4397 5278 - 6198 7233 8479 9782 11209 12707 - 14338 15719 17722 19343 20876 22320 23575 24750 25730 26411>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* WiFi Thermistor table */ - sec_thermistor@2 { - compatible = "samsung,sec-wf-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM3_PU2>; - io-channel-names = "wf_therm"; - adc_array = <1875 2270 2703 3149 3738 4416 5279 - 6205 7252 8470 9774 11227 12737 - 14358 15740 17754 19334 20932 22258 23619 24773 25779 26501>; - temp_array = <900 850 800 750 700 650 600 - 550 500 450 400 350 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@26 { - cell-index = <26>; - compatible = "i2c-gpio"; - gpios = <&tlmm 46 0 /* sda */ - &tlmm 47 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_active>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2900000>; - regulator-max-microvolt = <2900000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - }; - }; - }; -}; - -&spmi_bus { - qcom,pm6150@0 { - qcom,power-on@800 { - interrupts = <0x0 0x8 0x0 IRQ_TYPE_NONE>, - <0x0 0x8 0x1 IRQ_TYPE_NONE>, - <0x0 0x8 0x4 IRQ_TYPE_NONE>, - <0x0 0x8 0x5 IRQ_TYPE_NONE>; - interrupt-names = "kpdpwr", "resin", - "resin-bark", "kpdpwr-resin-bark"; - qcom,s3-debounce = <128>; - - qcom,pon_1 { - qcom,support-reset = <0>; - }; - - qcom,pon_2 { - qcom,support-reset = <0>; - }; - - qcom,pon_3 { - qcom,pon-type = ; - qcom,support-reset = <1>; - qcom,pull-up = <1>; - qcom,s1-timer = <6720>; - qcom,s2-timer = <1000>; - qcom,s2-type = ; - qcom,use-bark; - }; - }; - }; - - qcom,pm6150l@5 { - flash_led: qcom,leds@d300 { - pm6150l_flash0: qcom,flash_0 { - label = "flash"; - qcom,led-name = "led:flash_0"; - qcom,max-current = <1500>; - qcom,default-led-trigger = "flash0_trigger"; - qcom,id = <0>; - qcom,current-ma = <1500>; - qcom,duration-ms = <1280>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - qcom,record-current-ma = <200>; - }; - pm6150l_torch0: qcom,torch_0 { - label = "torch"; - qcom,led-name = "led:torch_0"; - qcom,max-current = <500>; - qcom,default-led-trigger = "torch0_trigger"; - qcom,id = <0>; - qcom,current-ma = <300>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - }; - }; - }; - - qcom,pm8009@a { - status = "disabled"; - }; - qcom,pm8009@b { - status = "disabled"; - }; -}; - -&pm6150_gpios { - interrupts = <0x0 0xc0 0 IRQ_TYPE_NONE>, - <0x0 0xc1 0 IRQ_TYPE_NONE>, - <0x0 0xc2 0 IRQ_TYPE_NONE>, - <0x0 0xc3 0 IRQ_TYPE_NONE>, - <0x0 0xc5 0 IRQ_TYPE_NONE>, - <0x0 0xc6 0 IRQ_TYPE_NONE>; - - interrupt-names = "pm6150_gpio1", "pm6150_gpio2", - "pm6150_gpio3", "pm6150_gpio4", - "pm6150_gpio6", - "pm6150_gpio7"; - qcom,gpios-disallowed = <5 8 9 10>; -}; - -&pm6150_adc_tm { - io-channels = <&pm6150_vadc ADC_XO_THERM_PU2>, - <&pm6150_vadc ADC_AMUX_THM2_PU2>, - <&pm6150_vadc ADC_AMUX_THM3_PU2>; - - quiet_therm { - status = "disabled"; - }; -}; - -&pm6150_vadc { - rf_pa0_therm { - reg = ; - label = "pa_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - rf_pa1_therm { - reg = ; - label = "wf_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - quiet_therm { - status = "disabled"; - }; -}; - -&pm6150l_gpios { - interrupts = <0x4 0xc0 0 IRQ_TYPE_NONE>, - <0x4 0xc1 0 IRQ_TYPE_NONE>, - <0x4 0xc2 0 IRQ_TYPE_NONE>, - <0x4 0xc3 0 IRQ_TYPE_NONE>, - <0x4 0xc4 0 IRQ_TYPE_NONE>, - <0x4 0xc5 0 IRQ_TYPE_NONE>, - <0x4 0xc7 0 IRQ_TYPE_NONE>, - <0x4 0xc8 0 IRQ_TYPE_NONE>, - <0x4 0xc9 0 IRQ_TYPE_NONE>, - <0x4 0xca 0 IRQ_TYPE_NONE>, - <0x4 0xcb 0 IRQ_TYPE_NONE>; - interrupt-names = "pm6150l_gpio1", "pm6150l_gpio2", - "pm6150l_gpio3", "pm6150l_gpio4", - "pm6150l_gpio5", "pm6150l_gpio6", - "pm6150l_gpio8", "pm6150l_gpio9", - "pm6150l_gpio10", "pm6150l_gpio11", - "pm6150l_gpio12"; - qcom,gpios-disallowed = <7>; - - dummy_pin { - dummy_pin_default: dummy_pin_default { - pins = "gpio12"; - bias-disable; - }; - }; -}; - -&pm6150l_adc_tm { - status = "disabled"; -/* /delete-property/ io-channels; - - conn_therm { - status = "disabled"; - }; - camera_ftherm { - status = "disabled"; - }; - nvm_therm { - status = "disabled"; - }; */ -}; - -&pm6150l_vadc { - pinctrl-0 = <&dummy_pin_default>; - - sdm_therm { - reg = ; - label = "ap_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - camera_ftherm { - status = "disabled"; - }; - nvm_therm { - status = "disabled"; - }; -}; - -&thermal_zones { - quiet-therm-adc { - status = "disabled"; - }; - conn-therm-adc { - status = "disabled"; - }; - camera-ftherm-adc { - status = "disabled"; - }; - nvm-therm-adc { - status = "disabled"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-overlay-r00.dts deleted file mode 100755 index 2b981705ca92..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-overlay-r00.dts +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-a70sq-pm-common.dtsi" - -#include "sm7150-sec-a70sq-swa-r00.dtsi" -#include "sm7150-sec-a70sq-swa-pinctrl-r00.dtsi" -#include "sm7150-sec-a70sq-display-r00.dtsi" -#include "sm7150-sec-a70sq-eif-r00.dtsi" -#include "sm7150-sec-a70sq-battery-common.dtsi" -#include "sm7150-sec-a70sq-fingerprint_00.dtsi" -#include "sm7150-sec-a70sq-nfc-r00.dtsi" -#include "sm7150-camera-sensor-a70sq-r00.dtsi" - -/ { - model = "Samsung A70SQ PROJECT Rev0.0 (board-id,00)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "ok"; - }; - mms_ts@48 { - status = "disabled"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-overlay-r01.dts deleted file mode 100755 index 1f654b4265e0..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-overlay-r01.dts +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-a70sq-pm-common.dtsi" - -#include "sm7150-sec-a70sq-swa-r01.dtsi" -#include "sm7150-sec-a70sq-swa-pinctrl-r01.dtsi" -#include "sm7150-sec-a70sq-display-r01.dtsi" -#include "sm7150-sec-a70sq-eif-r00.dtsi" -#include "sm7150-sec-a70sq-battery-common.dtsi" -#include "sm7150-sec-a70sq-fingerprint_00.dtsi" -#include "sm7150-sec-a70sq-nfc-r00.dtsi" -#include "sm7150-camera-sensor-a70sq-r00.dtsi" - -/ { - model = "Samsung A70SQ PROJECT Rev0.1 (board-id,01)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-pinctrl-r00.dtsi deleted file mode 100755 index 036a02e6abdc..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-pinctrl-r00.dtsi +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a70sq-pinctrl-common.dtsi" - -&pm6150_gpios { - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&soc { - -}; - -&tlmm { - usbpd_irq: usbpd_irq { - mux { - pins = "gpio32"; - function = "gpio"; - }; - config { - pins = "gpio32"; - drive-strength = <2>; - bias-disable; - input-enable; - }; - }; - - if_pmic_irq: if_pmic_irq { - mux { - pins = "gpio68"; - function = "gpio"; - }; - config { - pins = "gpio68"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - input-enable; - }; - }; - - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-pinctrl-r01.dtsi deleted file mode 100755 index 1992fa129383..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-pinctrl-r01.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -#include "sm7150-sec-a70sq-swa-pinctrl-r00.dtsi" - -&soc { - -}; - diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-r00.dtsi deleted file mode 100755 index 04a3e40f64da..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-r00.dtsi +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a70sq-common.dtsi" -// #include "sm6150-sec-a70q-input-common.dtsi" - - -&soc { - sec_thermistor@0 { - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - }; - - /* S2MPB03 Camera PMIC */ - i2c@26 { - cell-index = <26>; - compatible = "i2c-gpio"; - gpios = <&tlmm 4 0 /* sda */ - &tlmm 5 0 /* scl */ - >; - }; -}; - -&pm6150l_vadc { - sdm_therm { - reg = ; - }; -}; - -&tlmm { - s2mpb03_i2c_pins { - s2mpb03_i2c_active { - mux { - pins = "gpio4", "gpio5"; - function = "gpio"; - }; - config { - pins = "gpio4", "gpio5"; - drive-strength = <2>; - bias-disable; - }; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-r01.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-r01.dtsi deleted file mode 100755 index 5d281b0021c8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a70sq-swa-r01.dtsi +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-a70sq-swa-r00.dtsi" - -&soc { - -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r00.dts deleted file mode 100755 index cdebfa3248f2..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r00.dts +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-can-r00.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-can-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r00.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - -/ { - model = "Samsung A71 PROJECT Rev0.0 (board-id,00)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "ok"; - }; - mms_ts@48 { - status = "disabled"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r01.dts deleted file mode 100755 index a8607ac4f4f0..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r01.dts +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-can-r01.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-can-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r01.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.1 (board-id,01)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r02.dts deleted file mode 100755 index dc59b9ff249b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r02.dts +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-can-r02.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-can-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r02.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - -/ { - model = "Samsung A71 PROJECT Rev0.2 (board-id,02)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r03.dts deleted file mode 100755 index e4f731cceec4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r03.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-can-r03.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-can-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r02.dtsi" -#include "drivers/sm7150-sec-a71-battery-r03.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.3 (board-id,03)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r04.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r04.dts deleted file mode 100755 index df54573b2d80..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r04.dts +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-can-r04.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-can-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r04.dtsi" -#include "drivers/sm7150-sec-a71-battery-r04.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.4 (board-id,04)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 4>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "disabled"; - }; - touchscreen@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r05.dts deleted file mode 100755 index 720f199494cc..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r05.dts +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-can-r05.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-can-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r04.dtsi" -#include "drivers/sm7150-sec-a71-battery-r05.dtsi" -#include "drivers/sm7150-sec-a71-eif-r05.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.5 (board-id,05)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 5>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "disabled"; - }; - touchscreen@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r06.dts deleted file mode 100755 index a5fdec0b1b74..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-can-overlay-r06.dts +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-can-r06.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-can-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r04.dtsi" -#include "drivers/sm7150-sec-a71-battery-r06.dtsi" -#include "drivers/sm7150-sec-a71-eif-r06.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.6 (board-id,06)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 6>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "disabled"; - }; - touchscreen@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r00.dts deleted file mode 100755 index c4993e471bb0..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r00.dts +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-ldu-r00.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-ldu-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r00.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - -/ { - model = "Samsung A71 PROJECT Rev0.0 (board-id,00)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "ok"; - }; - mms_ts@48 { - status = "disabled"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r01.dts deleted file mode 100755 index c27fe4a2015a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r01.dts +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-ldu-r01.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-can-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r01.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.1 (board-id,01)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r02.dts deleted file mode 100755 index 04d2b5a82acf..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r02.dts +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-ldu-r02.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-ldu-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r02.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - -/ { - model = "Samsung A71 PROJECT Rev0.2 (board-id,02)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "ok"; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r03.dts deleted file mode 100755 index 772ce0ef8557..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r03.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-ldu-r03.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-ldu-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r02.dtsi" -#include "drivers/sm7150-sec-a71-battery-r03.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.3 (board-id,03)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r04.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r04.dts deleted file mode 100755 index 373e862d1bbd..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r04.dts +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-ldu-r04.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-ldu-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r04.dtsi" -#include "drivers/sm7150-sec-a71-battery-r04.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.4 (board-id,04)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 4>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "disabled"; - }; - touchscreen@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r05.dts deleted file mode 100755 index 9275deac4ae6..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r05.dts +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-ldu-r05.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r04.dtsi" -#include "drivers/sm7150-sec-a71-battery-r05.dtsi" -#include "drivers/sm7150-sec-a71-eif-r05.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.5 (board-id,05)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 5>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "disabled"; - }; - touchscreen@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r06.dts deleted file mode 100755 index c03bea1fc399..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-ldu-overlay-r06.dts +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-ldu-r06.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r04.dtsi" -#include "drivers/sm7150-sec-a71-battery-r06.dtsi" -#include "drivers/sm7150-sec-a71-eif-r06.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.6 (board-id,06)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 6>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "disabled"; - }; - touchscreen@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r00.dts deleted file mode 100755 index 2f6240f7ed29..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r00.dts +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-r00.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r00.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - -/ { - model = "Samsung A71 PROJECT Rev0.0 (board-id,00)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "ok"; - }; - mms_ts@48 { - status = "disabled"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r01.dts deleted file mode 100755 index 98e4bdcb3b55..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r01.dts +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-r01.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r01.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.1 (board-id,01)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r02.dts deleted file mode 100755 index 0b6a7eaa8829..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r02.dts +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-r02.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r02.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.2 (board-id,02)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r03.dts deleted file mode 100755 index 20586c75cfa1..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r03.dts +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-r03.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r02.dtsi" -#include "drivers/sm7150-sec-a71-battery-r03.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.3 (board-id,03)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r04.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r04.dts deleted file mode 100755 index 1104da4762b9..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r04.dts +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-r04.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r04.dtsi" -#include "drivers/sm7150-sec-a71-battery-r04.dtsi" -#include "drivers/sm7150-sec-a71-eif-r00.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.4 (board-id,04)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 4>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "disabled"; - }; - touchscreen@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r05.dts deleted file mode 100755 index 66b9f9a4b940..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r05.dts +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-r05.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r04.dtsi" -#include "drivers/sm7150-sec-a71-battery-r05.dtsi" -#include "drivers/sm7150-sec-a71-eif-r05.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.5 (board-id,05)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 5>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "disabled"; - }; - touchscreen@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r06.dts deleted file mode 100755 index 1494f11d4e4f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r06.dts +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-r06.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r04.dtsi" -#include "drivers/sm7150-sec-a71-battery-r06.dtsi" -#include "drivers/sm7150-sec-a71-eif-r06.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.6 (board-id,06)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 6>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "disabled"; - }; - touchscreen@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r07.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r07.dts deleted file mode 100755 index 2b6796c04182..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-eur-overlay-r07.dts +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-eur-r07.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r04.dtsi" -#include "drivers/sm7150-sec-a71-battery-r06.dtsi" -#include "drivers/sm7150-sec-a71-eif-r06.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.7 (board-id,07)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 7>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "disabled"; - }; - touchscreen@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r00.dts deleted file mode 100755 index 81b98c41457f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r00.dts +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-swa-r00.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-swa-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r00.dtsi" - -/ { - model = "Samsung A71 PROJECT Rev0.0 (board-id,00)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "ok"; - }; - mms_ts@48 { - status = "disabled"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r01.dts deleted file mode 100755 index a30ce436492e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r01.dts +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-swa-r01.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-swa-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r01.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.1 (board-id,01)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r02.dts deleted file mode 100755 index a090ee57e8ac..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r02.dts +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-swa-r02.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-swa-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r02.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.2 (board-id,02)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r03.dts deleted file mode 100755 index 33bb7bb6449d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-a71-swa-overlay-r03.dts +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "a71/sm7150-sec-a71-swa-r03.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-swa-r0n.dtsi */ -#include "drivers/sm7150-sec-a71-display-r02.dtsi" - - -/ { - model = "Samsung A71 PROJECT Rev0.3 (board-id,03)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - status = "disabled"; - }; - mms_ts@48 { - status = "ok"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-m41-swa-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-m41-swa-overlay-r00.dts deleted file mode 100755 index a4696478bf3e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-m41-swa-overlay-r00.dts +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "m41/sm7150-sec-m41-swa-r00.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-m41-display-r00.dtsi" -#include "drivers/sm7150-sec-m41-battery-r00.dtsi" -#include "drivers/sm7150-sec-m41-eif-r00.dtsi" - - -/ { - model = "Samsung M41 PROJECT Rev0.0 (board-id,00)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 0>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r00.dts deleted file mode 100755 index 8251509f604f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r00.dts +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "m51/sm7150-sec-m51-eur-r00.dtsi" -#include "m51/sm7150-sec-m51-eur-pinctrl-r00.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-m51-display-r00.dtsi" -#include "drivers/sm7150-sec-m51-battery-r00.dtsi" -#include "drivers/sm7150-sec-m51-eif-r00.dtsi" - - -/ { - model = "Samsung M51 PROJECT Rev0.0 (board-id,00)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 0>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r01.dts deleted file mode 100755 index 006f0908d26e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r01.dts +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "m51/sm7150-sec-m51-eur-r01.dtsi" -#include "m51/sm7150-sec-m51-eur-pinctrl-r01.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-m51-display-r00.dtsi" -#include "drivers/sm7150-sec-m51-battery-r00.dtsi" -#include "drivers/sm7150-sec-m51-eif-r00.dtsi" - - -/ { - model = "Samsung M51 PROJECT Rev0.1 (board-id,01)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 1>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r02.dts deleted file mode 100755 index e097cddcfcbd..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r02.dts +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "m51/sm7150-sec-m51-eur-r02.dtsi" -#include "m51/sm7150-sec-m51-eur-pinctrl-r02.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-m51-display-r02.dtsi" -#include "drivers/sm7150-sec-m51-battery-r02.dtsi" -#include "drivers/sm7150-sec-m51-eif-r00.dtsi" - - -/ { - model = "Samsung M51 PROJECT Rev0.2 (board-id,02)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 2>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r04.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r04.dts deleted file mode 100755 index a7bd1435851f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r04.dts +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "m51/sm7150-sec-m51-eur-r04.dtsi" -#include "m51/sm7150-sec-m51-eur-pinctrl-r04.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-m51-display-r04.dtsi" -#include "drivers/sm7150-sec-m51-battery-r02.dtsi" -#include "drivers/sm7150-sec-m51-eif-r00.dtsi" - - -/ { - model = "Samsung M51 PROJECT Rev0.3 (board-id,04)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 4>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r05.dts deleted file mode 100755 index cba2b159fc2e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-eur-overlay-r05.dts +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "m51/sm7150-sec-m51-eur-r05.dtsi" -#include "m51/sm7150-sec-m51-eur-pinctrl-r05.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-m51-display-r05.dtsi" -#include "drivers/sm7150-sec-m51-battery-r02.dtsi" -#include "drivers/sm7150-sec-m51-eif-r00.dtsi" - - -/ { - model = "Samsung M51 PROJECT Rev0.3A (board-id,05)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 5>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-swa-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-m51-swa-overlay-r00.dts deleted file mode 100755 index a4ec96bd6d18..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-swa-overlay-r00.dts +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "m51/sm7150-sec-m51-swa-r00.dtsi" -#include "m51/sm7150-sec-m51-swa-pinctrl-r00.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-m51-display-r00.dtsi" -#include "drivers/sm7150-sec-m51-battery-r00.dtsi" -#include "drivers/sm7150-sec-m51-eif-r00.dtsi" - - -/ { - model = "Samsung M51 PROJECT Rev0.0 (board-id,00)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 0>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-swa-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-m51-swa-overlay-r01.dts deleted file mode 100755 index fa29a43b961c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-swa-overlay-r01.dts +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "m51/sm7150-sec-m51-swa-r01.dtsi" -#include "m51/sm7150-sec-m51-swa-pinctrl-r01.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-m51-display-r00.dtsi" -#include "drivers/sm7150-sec-m51-battery-r00.dtsi" -#include "drivers/sm7150-sec-m51-eif-r00.dtsi" - - -/ { - model = "Samsung M51 PROJECT Rev0.1 (board-id,01)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 1>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-swa-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-m51-swa-overlay-r02.dts deleted file mode 100755 index 4f9796e31c56..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-m51-swa-overlay-r02.dts +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 and -* only version 2 as published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -/dts-v1/; -/plugin/; - -#include "common/sm7150-sec-common.dtsi" -#include "m51/sm7150-sec-m51-swa-r02.dtsi" -#include "m51/sm7150-sec-m51-swa-pinctrl-r02.dtsi" -/* FIXME : strongly recommend to move it to sm7150-sec-a71-eur-r0n.dtsi */ -#include "drivers/sm7150-sec-m51-display-r02.dtsi" -#include "drivers/sm7150-sec-m51-battery-r00.dtsi" -#include "drivers/sm7150-sec-m51-eif-r00.dtsi" - - -/ { - model = "Samsung M51 PROJECT Rev0.2 (board-id,02)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 2>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-qg-batterydata-r1q.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-qg-batterydata-r1q.dtsi deleted file mode 100755 index a08e2345c0eb..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-qg-batterydata-r1q.dtsi +++ /dev/null @@ -1,1068 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -qcom,a90q_3610mAh { /* A9S Battery is used for this (3720mAh) */ - /* A70Q BATTERY */ - qcom,max-voltage-uv = <4350000>; - qcom,fg-cc-cv-threshold-uv = <4340000>; - qcom,fastchg-current-ma = <3800>; - qcom,batt-id-kohm = <107>; - qcom,battery-beta = <4250>; - qcom,battery-therm-kohm = <100>; - qcom,battery-type = "A90Q_BATTERY"; - qcom,qg-batt-profile-ver = <100>; - qcom,fih-batt-profile-ver = <1>; - - qcom,jeita-fcc-ranges = <0 59 350000 - 60 159 850000 - 160 189 2550000 - 190 399 3800000 - 400 490 1250000>; - - qcom,jeita-fv-ranges = <0 399 4350000 - 400 500 4150000>; - - qcom,step-chg-ranges = <3400000 4299999 3800000 - 4300000 4319999 3200000 - 4320000 4350000 2550000>; - qcom,vbat-avg-based-step-chg; - qcom,taper-fcc; - - /* COOL = 18 DegC, WARM = 41 DegC */ - qcom,jeita-soft-thresholds = <0x4205 0x24EC>; - /* COLD = 0 DegC, HOT = 50 DegC */ - qcom,jeita-hard-thresholds = <0x57F0 0x1C52>; - - qcom,qg-batt-aging-enable; - qcom,vfloat-ranges = <0 299 4350000 - 300 399 4330000 - 400 699 4310000 - 700 999 4290000 - 1000 9999 4240000>; - - qcom,vbat-rechg-ranges = <0 299 4280000 - 300 399 4260000 - 400 699 4240000 - 700 999 4220000 - 1000 9999 4170000>; - - qcom,full-condition-soc-ranges = <0 299 93 - 300 399 92 - 400 699 91 - 700 999 90 - 1000 9999 89>; - - qcom,fcc1-temp-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-data = <3436 3559 3640 3676 3683>; - }; - - qcom,fcc2-temp-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-data = <3627 3630 3640 3658 3644 3641>; - }; - - qcom,pc-temp-v1-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <42709 43054 43173 43230 43248>, - <42487 42824 42964 43010 43032>, - <42271 42587 42744 42789 42815>, - <42062 42354 42516 42568 42596>, - <41857 42136 42288 42347 42376>, - <41654 41924 42064 42127 42157>, - <41457 41716 41843 41908 41937>, - <41273 41506 41628 41692 41719>, - <41114 41307 41417 41477 41508>, - <40951 41130 41212 41266 41301>, - <40745 40970 41022 41064 41097>, - <40484 40788 40839 40874 40897>, - <40242 40553 40648 40684 40701>, - <40063 40309 40440 40488 40510>, - <39912 40120 40238 40292 40322>, - <39776 39969 40068 40115 40145>, - <39653 39830 39917 39959 39985>, - <39538 39701 39770 39807 39830>, - <39423 39579 39630 39652 39671>, - <39311 39443 39480 39495 39513>, - <39200 39290 39272 39308 39336>, - <39091 39125 38995 39060 39108>, - <38981 38941 38787 38842 38889>, - <38875 38738 38680 38721 38754>, - <38769 38593 38601 38636 38657>, - <38668 38512 38526 38552 38567>, - <38578 38452 38459 38466 38475>, - <38496 38402 38395 38386 38387>, - <38425 38360 38335 38310 38305>, - <38368 38322 38277 38239 38226>, - <38322 38283 38223 38176 38157>, - <38282 38247 38172 38120 38100>, - <38249 38213 38125 38069 38048>, - <38219 38182 38082 38017 37993>, - <38188 38151 38044 37969 37938>, - <38156 38115 38004 37920 37882>, - <38119 38077 37967 37876 37827>, - <38071 38029 37925 37828 37769>, - <38003 37954 37856 37758 37695>, - <37921 37856 37758 37664 37603>, - <37818 37750 37650 37558 37499>, - <37691 37630 37532 37440 37385>, - <37551 37495 37401 37310 37259>, - <37406 37340 37250 37162 37110>, - <37290 37221 37131 37049 36993>, - <37221 37153 37065 36979 36923>, - <37203 37130 37044 36959 36904>, - <37181 37110 37027 36946 36887>, - <37151 37088 37008 36920 36862>, - <37054 37010 36927 36824 36758>, - <36767 36713 36622 36502 36430>, - <36315 36268 36183 36060 35980>, - <35747 35698 35619 35489 35400>, - <34984 34932 34839 34717 34628>, - <33764 33687 33622 33503 33403>, - <30000 30000 30000 30000 30000>; - }; - - qcom,pc-temp-v2-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <43215 43210 43200 43190 43120 43100>, - <42853 42890 42912 42923 42862 42848>, - <42537 42595 42643 42668 42615 42606>, - <42277 42330 42393 42428 42380 42373>, - <42071 42092 42163 42203 42157 42150>, - <41866 41866 41943 41983 41939 41932>, - <41601 41637 41723 41764 41721 41715>, - <41322 41415 41509 41549 41506 41500>, - <41147 41213 41303 41337 41296 41290>, - <41064 41042 41104 41126 41089 41082>, - <40972 40869 40909 40922 40888 40880>, - <40706 40661 40715 40730 40695 40687>, - <40219 40423 40521 40545 40507 40499>, - <39849 40188 40324 40357 40322 40317>, - <39635 39956 40117 40156 40133 40138>, - <39459 39734 39912 39965 39951 39965>, - <39293 39545 39713 39806 39793 39804>, - <39143 39378 39518 39666 39653 39656>, - <38986 39211 39327 39501 39490 39487>, - <38796 39028 39132 39275 39270 39269>, - <38604 38849 38948 39043 39039 39044>, - <38463 38696 38794 38863 38860 38866>, - <38351 38563 38662 38711 38712 38718>, - <38262 38440 38541 38581 38585 38590>, - <38192 38320 38430 38472 38475 38479>, - <38134 38207 38329 38376 38378 38382>, - <38080 38116 38238 38286 38290 38292>, - <38029 38041 38156 38202 38209 38209>, - <37981 37980 38080 38125 38133 38132>, - <37937 37935 38003 38054 38063 38060>, - <37895 37897 37931 37988 37997 37994>, - <37852 37861 37873 37927 37936 37932>, - <37808 37828 37828 37871 37885 37880>, - <37762 37793 37789 37814 37827 37820>, - <37714 37753 37753 37756 37750 37730>, - <37664 37708 37718 37697 37655 37613>, - <37608 37658 37677 37634 37567 37509>, - <37545 37604 37625 37568 37487 37424>, - <37474 37541 37563 37498 37409 37345>, - <37397 37465 37489 37425 37333 37267>, - <37310 37372 37401 37347 37258 37191>, - <37222 37268 37300 37253 37170 37102>, - <37138 37148 37180 37132 37047 36978>, - <37054 37024 37057 37013 36932 36865>, - <36970 36912 36946 36912 36850 36791>, - <36881 36827 36885 36875 36816 36759>, - <36833 36795 36862 36862 36802 36746>, - <36776 36755 36835 36840 36782 36725>, - <36700 36694 36791 36797 36739 36678>, - <36564 36584 36684 36669 36586 36506>, - <36317 36349 36395 36315 36236 36134>, - <35913 35914 35904 35817 35744 35641>, - <35333 35323 35276 35176 35107 35004>, - <34486 34514 34428 34288 34231 34137>, - <33135 33244 33241 32987 33047 32871>, - <28302 29120 28300 28436 28562 28479>; - }; - - qcom,pc-temp-z1-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <14387 13479 12625 12261 12166>, - <14381 13434 12608 12250 12153>, - <14383 13418 12596 12242 12145>, - <14392 13411 12587 12238 12144>, - <14399 13408 12580 12235 12143>, - <14394 13404 12573 12233 12144>, - <14382 13400 12567 12231 12145>, - <14377 13394 12563 12231 12146>, - <14395 13388 12559 12232 12148>, - <14413 13382 12556 12234 12153>, - <14401 13371 12554 12236 12156>, - <14364 13359 12551 12238 12157>, - <14341 13343 12549 12239 12159>, - <14339 13329 12548 12239 12159>, - <14337 13327 12548 12239 12160>, - <14335 13331 12548 12239 12160>, - <14332 13335 12551 12241 12162>, - <14328 13336 12555 12243 12164>, - <14325 13338 12559 12245 12166>, - <14320 13339 12562 12248 12168>, - <14318 13344 12565 12250 12170>, - <14320 13350 12568 12253 12172>, - <14318 13352 12571 12255 12174>, - <14315 13353 12576 12258 12177>, - <14305 13355 12582 12262 12180>, - <14292 13363 12587 12265 12184>, - <14288 13372 12593 12269 12187>, - <14290 13376 12599 12273 12192>, - <14291 13376 12605 12277 12196>, - <14289 13377 12611 12282 12199>, - <14287 13380 12614 12287 12203>, - <14286 13384 12616 12291 12208>, - <14286 13390 12618 12295 12212>, - <14288 13398 12623 12299 12215>, - <14291 13407 12630 12302 12217>, - <14297 13419 12636 12306 12219>, - <14304 13434 12643 12308 12222>, - <14305 13445 12649 12311 12224>, - <14299 13453 12656 12314 12227>, - <14294 13463 12663 12319 12230>, - <14301 13464 12668 12324 12234>, - <14312 13459 12672 12329 12237>, - <14304 13459 12676 12334 12240>, - <14283 13460 12682 12337 12244>, - <14283 13451 12702 12343 12249>, - <14273 13448 12700 12349 12251>, - <14282 13449 12699 12348 12252>, - <14263 13455 12699 12350 12255>, - <14257 13458 12699 12351 12257>, - <14276 13461 12706 12358 12260>, - <14288 13478 12715 12365 12267>, - <14289 13495 12730 12376 12277>, - <14306 13528 12749 12391 12291>, - <14328 13547 12783 12412 12310>, - <14328 13547 12783 12412 12310>, - <14328 13547 12783 12412 12310>; - }; - - qcom,pc-temp-z2-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <9861 10988 10164 10048 10185>, - <9857 10685 11089 10187 10233>, - <9861 10236 11226 10328 10254>, - <9871 9954 11043 10590 10274>, - <9881 9926 10827 10838 10271>, - <9895 9914 10620 10859 10254>, - <9912 9905 10443 11005 10265>, - <9921 9898 10396 11169 10274>, - <9925 9895 10380 11184 10219>, - <9927 9928 10373 11188 10112>, - <9917 10017 10458 11181 10074>, - <9874 10057 10610 11155 10090>, - <9843 9995 10636 11135 10111>, - <9845 9913 10417 11158 10121>, - <9854 9901 10189 11200 10127>, - <9862 9919 10167 11141 10136>, - <9869 9942 10172 10605 10154>, - <9874 9968 10178 10158 10175>, - <9874 9997 10193 10181 10194>, - <9865 10016 10214 10265 10215>, - <9855 10027 10231 10290 10224>, - <9852 10035 10249 10262 10214>, - <9850 10042 10258 10230 10202>, - <9851 10049 10243 10210 10210>, - <9856 10053 10218 10185 10246>, - <9865 10055 10215 10190 10270>, - <9874 10056 10234 10240 10254>, - <9882 10056 10255 10294 10232>, - <9889 10053 10271 10323 10246>, - <9896 10050 10285 10351 10291>, - <9902 10051 10287 10354 10313>, - <9908 10055 10285 10322 10236>, - <9914 10059 10283 10291 10131>, - <9919 10067 10284 10291 10122>, - <9925 10076 10290 10302 10159>, - <9932 10082 10294 10318 10202>, - <9941 10088 10299 10351 10251>, - <9949 10095 10306 10391 10297>, - <9958 10104 10318 10422 10311>, - <9969 10114 10336 10453 10317>, - <9985 10123 10348 10467 10319>, - <10007 10129 10354 10462 10318>, - <10039 10141 10360 10450 10317>, - <10106 10168 10366 10364 10322>, - <10446 10344 10431 10369 10343>, - <10387 10415 10446 10363 10305>, - <10336 10422 10434 10358 10328>, - <10313 10453 10439 10385 10320>, - <10262 10588 10468 10398 10375>, - <10248 10614 10488 10481 10406>, - <10242 10508 10554 10408 10218>, - <10142 10498 10509 10325 10133>, - <10015 10448 10529 10273 10077>, - <9842 10332 10473 10229 10048>, - <9842 10332 10473 10229 10048>, - <9842 10332 10473 10229 10048>; - }; - - qcom,pc-temp-z3-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <19955 19479 19442 19381 19337>, - <20022 19592 19444 19401 19370>, - <20035 19705 19458 19417 19392>, - <20033 19762 19499 19431 19400>, - <20024 19769 19529 19443 19404>, - <20004 19771 19538 19453 19405>, - <19974 19772 19544 19473 19409>, - <19945 19769 19547 19487 19414>, - <19912 19767 19546 19488 19409>, - <19887 19770 19546 19488 19395>, - <19903 19780 19552 19485 19386>, - <19983 19784 19560 19471 19382>, - <20042 19776 19556 19460 19380>, - <20028 19761 19527 19456 19378>, - <19986 19742 19495 19454 19377>, - <19951 19716 19479 19446 19375>, - <19927 19693 19467 19413 19366>, - <19910 19676 19463 19386 19358>, - <19910 19662 19464 19386 19358>, - <19933 19660 19467 19388 19361>, - <19966 19680 19475 19389 19363>, - <19993 19702 19491 19391 19361>, - <20022 19713 19501 19393 19356>, - <20040 19722 19494 19386 19350>, - <20046 19724 19482 19371 19341>, - <20050 19722 19475 19366 19337>, - <20051 19717 19469 19371 19348>, - <20043 19711 19467 19379 19365>, - <20031 19703 19470 19392 19380>, - <20018 19694 19478 19410 19397>, - <20002 19688 19484 19416 19404>, - <19985 19682 19491 19415 19396>, - <19965 19676 19495 19412 19384>, - <19944 19670 19493 19409 19376>, - <19924 19664 19490 19403 19371>, - <19903 19659 19485 19398 19368>, - <19884 19654 19479 19393 19365>, - <19867 19650 19472 19388 19364>, - <19852 19646 19467 19386 19363>, - <19837 19642 19463 19383 19363>, - <19819 19636 19461 19382 19363>, - <19798 19626 19459 19384 19362>, - <19774 19615 19457 19387 19361>, - <19736 19602 19451 19378 19362>, - <19575 19537 19431 19364 19357>, - <19488 19494 19416 19359 19348>, - <19381 19485 19410 19358 19337>, - <19354 19472 19408 19347 19337>, - <19340 19426 19393 19344 19327>, - <19340 19419 19386 19335 19330>, - <19357 19462 19380 19347 19356>, - <19364 19451 19381 19349 19360>, - <19371 19442 19359 19353 19358>, - <19372 19358 19356 19348 19360>, - <19372 19358 19356 19348 19360>, - <19372 19358 19356 19348 19360>; - }; - - qcom,pc-temp-z4-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <16252 15518 15124 14944 14903>, - <16181 15490 15079 14948 14900>, - <16076 15380 15025 14938 14894>, - <15936 15267 14962 14905 14877>, - <15819 15183 14910 14856 14849>, - <15742 15112 14876 14815 14825>, - <15679 15057 14848 14769 14801>, - <15620 15018 14821 14729 14780>, - <15566 14979 14797 14704 14769>, - <15512 14920 14773 14686 14761>, - <15450 14848 14733 14675 14753>, - <15381 14819 14691 14667 14741>, - <15324 14842 14683 14662 14731>, - <15291 14873 14717 14656 14722>, - <15267 14876 14753 14651 14714>, - <15242 14857 14752 14652 14708>, - <15215 14834 14739 14676 14703>, - <15185 14813 14729 14699 14700>, - <15145 14791 14722 14704 14700>, - <15084 14779 14717 14707 14703>, - <15021 14773 14741 14720 14711>, - <14971 14769 14830 14799 14778>, - <14924 14791 14881 14868 14854>, - <14896 14859 14880 14871 14862>, - <14887 14894 14876 14868 14858>, - <14881 14889 14870 14863 14852>, - <14880 14878 14856 14845 14828>, - <14880 14866 14839 14818 14794>, - <14880 14852 14818 14789 14762>, - <14877 14836 14794 14754 14729>, - <14868 14823 14772 14731 14710>, - <14857 14811 14752 14716 14704>, - <14849 14799 14737 14708 14700>, - <14840 14787 14731 14708 14700>, - <14832 14777 14726 14710 14703>, - <14826 14769 14724 14712 14707>, - <14820 14761 14723 14713 14709>, - <14814 14758 14723 14715 14712>, - <14808 14759 14727 14720 14716>, - <14804 14761 14736 14729 14723>, - <14805 14761 14740 14734 14726>, - <14807 14757 14732 14724 14721>, - <14801 14753 14725 14717 14716>, - <14789 14745 14723 14725 14716>, - <14781 14721 14702 14710 14705>, - <14872 14731 14684 14687 14683>, - <14984 14734 14678 14674 14678>, - <15011 14740 14667 14664 14657>, - <15017 14784 14675 14654 14647>, - <15010 14788 14687 14674 14654>, - <15002 14756 14719 14695 14664>, - <15016 14777 14723 14699 14665>, - <15024 14796 14749 14696 14670>, - <15042 14896 14762 14704 14669>, - <15042 14896 14762 14704 14669>, - <15042 14896 14762 14704 14669>; - }; - - qcom,pc-temp-z5-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <12612 11396 13692 14574 13742>, - <12830 12439 13278 15334 15374>, - <12961 13754 13428 16023 16461>, - <13058 14738 14443 16574 16860>, - <13095 15151 15665 17139 17062>, - <13080 15436 16674 18059 17216>, - <13040 15754 17654 20284 17887>, - <12986 16075 18585 23033 18587>, - <12886 16468 19509 26018 18278>, - <12799 17249 20647 28895 17391>, - <13021 18531 23747 29906 17091>, - <13953 19342 28129 30151 17450>, - <14623 19587 29133 30462 17998>, - <14504 19630 24528 31632 18677>, - <14147 19326 19751 33385 19539>, - <13957 18576 19355 33061 19853>, - <13959 18093 19619 26653 19685>, - <13989 18376 20068 21225 19486>, - <14147 19334 21816 21891 20171>, - <14982 21293 24863 24000 22449>, - <16259 28659 29559 25229 23537>, - <17986 36858 37103 25714 22540>, - <20833 40976 40829 25663 20839>, - <23935 43964 36142 23374 18985>, - <27400 44991 28441 18911 16343>, - <30867 42402 24499 17025 15204>, - <32870 37915 22075 16746 15524>, - <34169 34643 21019 16767 16212>, - <34928 31900 21296 17702 17924>, - <34759 30002 22109 20198 22076>, - <33728 29027 23422 22658 24292>, - <32429 28309 26639 25004 24312>, - <30905 27941 29869 27110 24306>, - <29074 27786 32012 28659 24625>, - <27576 27735 33786 29976 25834>, - <26239 27893 34176 30414 26555>, - <25129 28342 32805 29459 26384>, - <24630 28565 30856 27784 25962>, - <24628 28755 29122 25866 25124>, - <24723 29057 27352 23296 23062>, - <24356 28791 26482 22194 21414>, - <23716 26850 26212 22677 20824>, - <23955 26171 25913 23014 20474>, - <24096 26435 24552 20292 20092>, - <20016 25197 24934 19795 19929>, - <16439 20063 23741 20132 19448>, - <12763 18793 22567 20558 17818>, - <11913 17839 22990 19351 19941>, - <11769 15537 20310 20354 20305>, - <11848 15735 18599 16727 18692>, - <12045 16845 16007 15571 18755>, - <11985 15424 15626 15040 18414>, - <11908 14587 13828 15042 16934>, - <11724 12129 13273 14188 16576>, - <11724 12129 13273 14188 16576>, - <11724 12129 13273 14188 16576>; - }; - - qcom,pc-temp-z6-lut { - qcom,lut-col-legend = <0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200>, - <9000 8800 8600 8400 8200>, - <8000 7800 7600 7400 7200>, - <7000 6800 6600 6400 6200>, - <6000 5800 5600 5400 5200>, - <5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200>, - <3000 2800 2600 2400 2200>, - <2000 1800 1600 1400 1200>, - <1000 900 800 700 600>, - <500 400 300 200 100>, - <0>; - qcom,lut-data = <16480 15484 15022 14842 14786>, - <16455 15507 15002 14853 14802>, - <16406 15496 14988 14857 14810>, - <16326 15480 14978 14850 14806>, - <16251 15449 14969 14836 14797>, - <16194 15405 14958 14825 14789>, - <16143 15372 14946 14816 14782>, - <16093 15349 14934 14807 14774>, - <16038 15327 14923 14798 14766>, - <15994 15300 14911 14791 14757>, - <15980 15270 14898 14782 14749>, - <15975 15256 14884 14772 14742>, - <15969 15253 14876 14763 14736>, - <15949 15251 14873 14759 14731>, - <15911 15244 14870 14756 14727>, - <15878 15221 14863 14751 14723>, - <15853 15196 14851 14742 14715>, - <15832 15177 14845 14737 14710>, - <15814 15161 14844 14737 14710>, - <15799 15158 14843 14740 14712>, - <15787 15164 14856 14747 14718>, - <15779 15175 14904 14783 14746>, - <15773 15195 14932 14814 14776>, - <15769 15230 14929 14813 14778>, - <15768 15246 14923 14805 14773>, - <15767 15243 14916 14799 14767>, - <15764 15238 14909 14794 14763>, - <15758 15232 14901 14789 14758>, - <15750 15223 14895 14784 14754>, - <15740 15213 14889 14779 14750>, - <15727 15205 14885 14774 14746>, - <15714 15199 14880 14768 14738>, - <15699 15192 14876 14762 14731>, - <15684 15186 14874 14760 14728>, - <15672 15180 14871 14758 14726>, - <15660 15176 14868 14756 14725>, - <15650 15173 14864 14755 14725>, - <15643 15172 14862 14753 14726>, - <15637 15173 14863 14754 14726>, - <15630 15175 14866 14757 14729>, - <15623 15175 14868 14759 14731>, - <15615 15171 14865 14757 14729>, - <15604 15167 14862 14755 14727>, - <15585 15162 14860 14754 14728>, - <15508 15124 14843 14742 14721>, - <15501 15111 14828 14730 14708>, - <15493 15107 14822 14724 14700>, - <15491 15104 14817 14714 14691>, - <15490 15102 14814 14709 14681>, - <15492 15102 14817 14713 14686>, - <15506 15117 14831 14731 14707>, - <15526 15129 14836 14736 14712>, - <15547 15142 14840 14740 14716>, - <15578 15160 14851 14746 14721>, - <15578 15160 14851 14746 14721>, - <15578 15160 14851 14746 14721>; - }; - - qcom,pc-temp-y1-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <7367 6625 6201 5740 5540 5474>, - <7406 6671 6210 5740 5540 5475>, - <7438 6707 6212 5739 5540 5476>, - <7462 6732 6210 5738 5539 5477>, - <7477 6747 6206 5736 5539 5478>, - <7483 6753 6204 5735 5538 5478>, - <7476 6752 6202 5733 5538 5478>, - <7462 6750 6197 5732 5537 5478>, - <7454 6747 6195 5732 5536 5478>, - <7449 6733 6193 5731 5536 5478>, - <7446 6719 6192 5730 5535 5478>, - <7447 6718 6192 5730 5536 5479>, - <7451 6723 6191 5730 5537 5480>, - <7457 6727 6191 5729 5537 5480>, - <7471 6729 6191 5730 5538 5480>, - <7485 6730 6192 5731 5538 5480>, - <7483 6731 6195 5732 5539 5481>, - <7469 6733 6200 5733 5542 5482>, - <7463 6734 6202 5734 5543 5483>, - <7474 6733 6204 5737 5543 5484>, - <7486 6732 6205 5740 5542 5484>, - <7481 6735 6204 5743 5543 5485>, - <7456 6747 6203 5745 5544 5487>, - <7438 6755 6203 5748 5546 5489>, - <7445 6756 6204 5751 5549 5493>, - <7460 6756 6205 5754 5552 5496>, - <7469 6754 6207 5757 5554 5497>, - <7471 6741 6210 5762 5555 5497>, - <7470 6729 6215 5765 5557 5498>, - <7460 6730 6218 5769 5561 5499>, - <7445 6733 6222 5773 5566 5503>, - <7439 6734 6225 5778 5570 5506>, - <7436 6742 6228 5784 5573 5511>, - <7435 6751 6230 5789 5575 5515>, - <7433 6754 6232 5793 5579 5516>, - <7432 6751 6234 5795 5582 5516>, - <7430 6746 6236 5797 5584 5518>, - <7439 6750 6239 5799 5585 5520>, - <7448 6756 6242 5801 5587 5522>, - <7443 6753 6244 5806 5588 5524>, - <7423 6737 6247 5814 5589 5525>, - <7408 6728 6250 5818 5591 5527>, - <7423 6728 6256 5818 5595 5532>, - <7454 6731 6257 5820 5599 5535>, - <7427 6745 6260 5821 5601 5536>, - <7408 6746 6262 5831 5604 5536>, - <7417 6743 6258 5835 5606 5537>, - <7408 6753 6259 5833 5606 5538>, - <7428 6767 6272 5832 5604 5539>, - <7450 6753 6275 5837 5603 5539>, - <7440 6755 6273 5846 5612 5543>, - <7449 6767 6285 5858 5622 5550>, - <7474 6799 6305 5881 5633 5559>, - <7568 6854 6338 5906 5648 5571>, - <7568 6854 6338 5906 5648 5571>, - <7568 6854 6338 5906 5648 5571>; - }; - - qcom,pc-temp-y2-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <9971 10284 10659 10912 10858 10796>, - <9983 10300 10636 10901 10859 10850>, - <10010 10311 10613 10888 10858 10879>, - <10044 10318 10591 10874 10855 10890>, - <10078 10321 10572 10861 10851 10888>, - <10106 10321 10558 10849 10846 10881>, - <10168 10313 10549 10815 10841 10856>, - <10268 10302 10542 10764 10835 10814>, - <10299 10304 10534 10754 10826 10796>, - <10273 10368 10524 10775 10808 10790>, - <10249 10438 10517 10792 10792 10786>, - <10213 10463 10530 10787 10790 10780>, - <10098 10485 10569 10777 10795 10771>, - <10029 10492 10606 10779 10795 10766>, - <9876 10500 10642 10791 10776 10764>, - <9709 10515 10671 10808 10760 10768>, - <9682 10536 10680 10836 10789 10802>, - <9674 10573 10685 10881 10876 10878>, - <9669 10607 10693 10905 10927 10918>, - <9666 10638 10722 10912 10911 10918>, - <9664 10666 10762 10917 10886 10913>, - <9662 10681 10790 10937 10902 10921>, - <9661 10695 10817 10974 10952 10941>, - <9660 10703 10840 10999 10987 10963>, - <9659 10714 10866 11020 11008 10984>, - <9658 10734 10891 11042 11028 11009>, - <9658 10748 10896 11057 11041 11038>, - <9657 10770 10897 11069 11066 11075>, - <9656 10777 10902 11076 11087 11095>, - <9656 10669 10919 11076 11095 11071>, - <9655 10387 10940 11076 11099 11034>, - <9655 10238 10944 11079 11106 11045>, - <9654 10218 10925 11091 11143 11222>, - <9654 10199 10897 11098 11177 11388>, - <9654 10104 10874 11081 11169 11349>, - <9654 9913 10851 11056 11141 11193>, - <9653 9792 10826 11053 11127 11105>, - <9653 9724 10799 11064 11126 11091>, - <9653 9683 10769 11073 11127 11085>, - <9653 9673 10734 11070 11117 11081>, - <9653 9668 10694 11059 11097 11072>, - <9653 9664 10652 11048 11087 11064>, - <9653 9660 10612 11038 11077 11065>, - <9653 9658 10566 11009 11053 11058>, - <9652 9656 10502 10941 11004 10971>, - <9652 9654 10432 10937 10996 10886>, - <9652 9654 10402 10925 10981 10827>, - <9652 9653 10380 10948 10962 10796>, - <9652 9653 10358 10930 10934 10779>, - <9652 9653 10321 10920 10946 10792>, - <9652 9652 10117 10862 10917 10773>, - <9652 9652 9902 10804 10833 10699>, - <9651 9651 9704 10743 10766 10627>, - <9650 9651 9666 10629 10692 10518>, - <9650 9651 9666 10629 10692 10518>, - <9650 9651 9666 10629 10692 10518>; - }; - - qcom,pc-temp-y3-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <12819 13493 13362 13294 13279 13275>, - <13407 13497 13360 13295 13279 13276>, - <13781 13502 13361 13296 13280 13276>, - <13989 13508 13363 13297 13280 13277>, - <14078 13515 13366 13298 13281 13278>, - <14099 13522 13369 13299 13281 13279>, - <13980 13533 13371 13299 13281 13279>, - <13729 13544 13375 13298 13282 13280>, - <13643 13545 13377 13298 13283 13280>, - <13682 13524 13381 13299 13286 13280>, - <13725 13501 13386 13299 13289 13280>, - <13720 13500 13391 13303 13291 13282>, - <13691 13505 13395 13311 13292 13286>, - <13664 13506 13397 13315 13292 13288>, - <13606 13497 13395 13316 13291 13287>, - <13549 13485 13392 13317 13289 13286>, - <13549 13475 13387 13318 13290 13287>, - <13572 13465 13380 13320 13295 13290>, - <13586 13454 13372 13321 13298 13292>, - <13573 13439 13362 13316 13293 13289>, - <13550 13424 13353 13309 13287 13283>, - <13540 13412 13349 13304 13284 13280>, - <13535 13404 13347 13300 13282 13279>, - <13540 13396 13345 13298 13281 13278>, - <13565 13386 13340 13299 13281 13277>, - <13605 13376 13335 13300 13281 13277>, - <13642 13368 13335 13300 13281 13278>, - <13678 13355 13337 13299 13282 13279>, - <13718 13347 13338 13298 13283 13280>, - <13764 13351 13334 13299 13283 13279>, - <13816 13363 13329 13300 13283 13278>, - <13869 13370 13326 13301 13283 13278>, - <13925 13372 13328 13302 13284 13280>, - <13985 13372 13330 13302 13285 13281>, - <14048 13370 13335 13301 13285 13279>, - <14115 13372 13341 13300 13285 13277>, - <14188 13382 13344 13299 13284 13276>, - <14269 13407 13344 13298 13282 13276>, - <14357 13436 13344 13298 13280 13277>, - <14446 13460 13344 13298 13280 13277>, - <14538 13490 13345 13298 13282 13277>, - <14631 13529 13347 13297 13283 13277>, - <14722 13606 13352 13298 13283 13278>, - <14817 13717 13357 13299 13282 13278>, - <14927 13862 13362 13300 13283 13278>, - <15061 14072 13374 13303 13288 13284>, - <15123 14174 13380 13307 13290 13287>, - <15073 14178 13383 13309 13295 13290>, - <15139 14251 13394 13315 13297 13292>, - <15294 14428 13405 13318 13295 13288>, - <15479 14623 13416 13312 13293 13285>, - <15747 14870 13437 13315 13296 13289>, - <16146 15236 13494 13326 13299 13294>, - <17279 15608 13622 13338 13303 13297>, - <17279 15608 13622 13338 13303 13297>, - <17279 15608 13622 13338 13303 13297>; - }; - - qcom,pc-temp-y4-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <19661 16907 16667 16532 16486 16478>, - <18770 16960 16666 16525 16485 16476>, - <18205 17003 16668 16523 16486 16476>, - <17892 17037 16671 16523 16487 16476>, - <17757 17059 16674 16526 16489 16477>, - <17726 17069 16678 16530 16492 16478>, - <17906 17062 16685 16536 16495 16480>, - <18307 17045 16696 16545 16499 16484>, - <18507 17052 16704 16554 16502 16487>, - <18594 17197 16710 16562 16504 16492>, - <18617 17351 16719 16570 16506 16497>, - <18378 17367 16758 16577 16511 16501>, - <17856 17315 16835 16585 16519 16504>, - <17623 17260 16878 16593 16528 16509>, - <17651 17170 16896 16604 16539 16518>, - <17688 17077 16905 16618 16552 16530>, - <17646 17040 16887 16645 16572 16545>, - <17531 17020 16820 16685 16600 16565>, - <17404 16994 16755 16699 16611 16573>, - <17264 16945 16698 16647 16583 16553>, - <17131 16888 16650 16577 16540 16522>, - <17073 16850 16626 16543 16514 16503>, - <17042 16823 16611 16519 16494 16487>, - <17025 16796 16605 16508 16486 16481>, - <17015 16753 16607 16507 16487 16481>, - <17010 16709 16610 16507 16488 16482>, - <17009 16698 16610 16510 16491 16485>, - <17012 16701 16608 16519 16498 16490>, - <17016 16707 16604 16527 16506 16498>, - <17017 16716 16599 16534 16516 16507>, - <17018 16732 16592 16542 16527 16518>, - <17019 16750 16590 16547 16539 16529>, - <17027 16768 16593 16552 16554 16543>, - <17035 16785 16599 16554 16563 16552>, - <17041 16810 16606 16548 16548 16538>, - <17048 16846 16615 16536 16512 16502>, - <17051 16867 16623 16524 16492 16483>, - <17049 16876 16631 16512 16485 16478>, - <17047 16883 16639 16505 16481 16476>, - <17047 16891 16648 16508 16484 16477>, - <17049 16899 16658 16518 16491 16483>, - <17054 16901 16667 16526 16494 16487>, - <17065 16896 16676 16532 16494 16485>, - <17087 16892 16686 16532 16493 16481>, - <17135 16908 16697 16526 16487 16476>, - <17214 16963 16737 16551 16500 16492>, - <17253 17012 16765 16566 16517 16514>, - <17218 17044 16780 16580 16539 16545>, - <17220 17089 16832 16613 16571 16569>, - <17238 17148 16880 16620 16540 16530>, - <17218 17172 16882 16566 16497 16486>, - <17183 17158 16885 16576 16497 16489>, - <17186 17158 16959 16611 16511 16500>, - <17466 17205 17058 16694 16564 16554>, - <17466 17205 17058 16694 16564 16554>, - <17466 17205 17058 16694 16564 16554>; - }; - - qcom,pc-temp-y5-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <8712 12228 12659 13047 13823 14190>, - <8712 12145 12923 13268 13745 14202>, - <9136 12225 13085 13356 13640 14188>, - <11630 12403 13170 13344 13518 14152>, - <13149 12613 13202 13259 13386 14099>, - <13728 12789 13207 13134 13251 14030>, - <12872 12997 13180 12913 13079 13895>, - <11072 13251 13141 12609 12900 13676>, - <10587 13243 13136 12395 12906 13455>, - <12047 12565 13072 12224 13416 13168>, - <13644 11944 13019 12130 13870 12972>, - <13866 12490 13059 12247 13790 13169>, - <13352 14114 13132 12565 13490 13675>, - <12993 15015 13290 12814 13200 13849>, - <12175 15046 14039 12975 12864 13443>, - <11341 14907 14974 13139 12619 13014>, - <11552 14908 15556 13339 12691 13046>, - <12376 15088 16032 13602 13059 13318>, - <12873 15147 16189 14020 13504 13650>, - <12523 14950 15711 15165 14198 14203>, - <11879 14758 15096 16243 14834 14807>, - <11541 14777 14975 16148 14964 15052>, - <11059 15133 15097 15484 14998 15168>, - <10777 15426 15139 15117 14992 15173>, - <10793 15289 14719 15485 14817 14985>, - <10822 14746 14179 15931 14568 14763>, - <10829 14196 14247 15823 14606 14783>, - <10817 12941 14988 15398 15043 15053>, - <10805 12046 15494 15237 15333 15233>, - <10851 12073 15199 15474 15217 14993>, - <10965 12231 14510 15901 15015 14573>, - <11029 12423 14160 16406 15049 14555>, - <11051 12689 14221 17325 15773 15392>, - <11064 12851 14479 17801 16634 16149>, - <11086 12537 15045 17628 17232 15969>, - <11121 11850 15840 17225 17725 15444>, - <11130 11640 16079 16896 17787 15270>, - <11138 11712 15696 16504 16854 15534>, - <11147 11787 15145 16280 15696 15768>, - <11118 11741 14722 16075 15294 15602>, - <10989 11536 14333 15533 15318 15044>, - <10906 11421 14186 15187 15496 14737>, - <10936 11446 14369 14866 15373 14862>, - <10997 11462 14491 14894 14996 14977>, - <11060 11407 14206 15014 14906 14554>, - <11158 11468 14194 14246 15037 14856>, - <11243 11549 13934 14443 14678 14859>, - <11345 11502 13767 14408 15147 14895>, - <11540 11646 13870 14707 14982 14794>, - <11616 11938 13851 14964 15040 14382>, - <11534 12006 13258 14914 15966 14486>, - <11239 11610 12568 14715 16823 15844>, - <11069 11538 11865 15827 16913 17224>, - <10470 11375 11776 16371 17420 17500>, - <10470 11375 11776 16371 17420 17500>, - <10470 11375 11776 16371 17420 17500>; - }; - - qcom,pc-temp-y6-lut { - qcom,lut-col-legend = <(-10) 0 10 25 40 50>; - qcom,lut-row-legend = <10000 9800 9600 9400 9200 9000>, - <8800 8600 8400 8200 8000 7800>, - <7600 7400 7200 7000 6800 6600>, - <6400 6200 6000 5800 5600 5400>, - <5200 5000 4800 4600 4400 4200>, - <4000 3800 3600 3400 3200 3000>, - <2800 2600 2400 2200 2000 1800>, - <1600 1400 1200 1000 900 800>, - <700 600 500 400 300 200>, - <100 0>; - qcom,lut-data = <6629 5713 5314 5110 5062 5052>, - <6721 5728 5311 5110 5063 5052>, - <6778 5739 5310 5110 5064 5053>, - <6808 5747 5310 5111 5065 5054>, - <6821 5751 5310 5112 5066 5055>, - <6823 5754 5310 5114 5067 5056>, - <6801 5752 5312 5115 5069 5057>, - <6753 5748 5314 5118 5070 5058>, - <6742 5749 5317 5120 5072 5060>, - <6794 5768 5320 5122 5074 5061>, - <6843 5788 5323 5125 5077 5063>, - <6786 5789 5336 5130 5080 5065>, - <6614 5778 5360 5137 5083 5069>, - <6517 5763 5371 5143 5086 5072>, - <6493 5734 5373 5146 5088 5074>, - <6478 5701 5374 5151 5091 5076>, - <6469 5685 5368 5159 5097 5082>, - <6463 5676 5343 5172 5109 5090>, - <6455 5664 5317 5176 5114 5094>, - <6427 5642 5294 5158 5102 5085>, - <6393 5618 5274 5134 5085 5072>, - <6388 5607 5266 5120 5075 5064>, - <6399 5602 5261 5110 5068 5058>, - <6414 5598 5259 5106 5065 5056>, - <6440 5592 5258 5107 5065 5056>, - <6480 5586 5258 5108 5066 5056>, - <6516 5585 5259 5109 5067 5057>, - <6550 5594 5263 5111 5070 5059>, - <6586 5609 5266 5114 5073 5062>, - <6626 5628 5265 5117 5076 5065>, - <6668 5656 5264 5121 5079 5067>, - <6712 5684 5263 5124 5083 5071>, - <6757 5713 5269 5127 5089 5076>, - <6805 5744 5278 5129 5093 5080>, - <6857 5778 5288 5127 5089 5075>, - <6911 5814 5299 5123 5078 5063>, - <6968 5853 5310 5120 5072 5057>, - <7027 5897 5319 5117 5069 5057>, - <7088 5945 5329 5115 5067 5056>, - <7152 5999 5341 5117 5068 5057>, - <7219 6060 5355 5120 5071 5059>, - <7288 6131 5373 5123 5073 5060>, - <7359 6219 5398 5126 5073 5060>, - <7436 6327 5428 5128 5072 5059>, - <7527 6462 5465 5129 5072 5059>, - <7646 6653 5531 5141 5080 5068>, - <7703 6748 5557 5147 5086 5077>, - <7663 6760 5561 5153 5096 5088>, - <7711 6830 5602 5168 5107 5096>, - <7832 6980 5655 5173 5096 5082>, - <7970 7136 5691 5154 5084 5068>, - <8161 7323 5756 5163 5086 5072>, - <8484 7602 5900 5187 5094 5081>, - <9486 7911 6103 5226 5115 5100>, - <9486 7911 6103 5226 5115 5100>, - <9486 7911 6103 5226 5115 5100>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-audio-pinctrl.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-audio-pinctrl.dtsi deleted file mode 100755 index ef67ebe6aafb..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-audio-pinctrl.dtsi +++ /dev/null @@ -1,326 +0,0 @@ -&lpi_tlmm { - sec_mi2s_clk_active: sec_mi2s_clk_active { - mux { - pins = "gpio8"; - function = "func3"; - }; - config { - pins = "gpio8"; - drive-strength = <8>; - }; - }; - sec_mi2s_clk_sleep: sec_mi2s_clk_sleep { - mux { - pins = "gpio8"; - function = "func3"; - }; - config { - pins = "gpio8"; - drive-strength = <2>; - }; - }; - - sec_mi2s_ws_active: sec_mi2s_ws_active { - mux { - pins = "gpio9"; - function = "func3"; - }; - config { - pins = "gpio9"; - drive-strength = <8>; - }; - }; - - sec_mi2s_ws_sleep: sec_mi2s_ws_sleep { - mux { - pins = "gpio9"; - function = "func3"; - }; - config { - pins = "gpio9"; - drive-strength = <2>; - }; - }; - - sec_mi2s_sd0_active: sec_mi2s_sd0_active { - mux { - pins = "gpio10"; - function = "func4"; - }; - - config { - pins = "gpio10"; - drive-strength = <8>; - }; - }; - - sec_mi2s_sd0_sleep: sec_mi2s_sd0_sleep { - mux { - pins = "gpio10"; - function = "func4"; - }; - config { - pins = "gpio10"; - drive-strength = <2>; - }; - }; - - sec_mi2s_sd1_active: sec_mi2s_sd1_active { - mux { - pins = "gpio11"; - function = "func2"; - }; - config { - pins = "gpio11"; - drive-strength = <8>; - }; - }; - - sec_mi2s_sd1_sleep: sec_mi2s_sd1_sleep { - mux { - pins = "gpio11"; - function = "func2"; - }; - config { - pins = "gpio11"; - drive-strength = <2>; - }; - }; - - /*Quat MI2S*/ - quat_mi2s_clk_active: quat_mi2s_clk_active { - mux { - pins = "gpio23"; - function = "func3"; - }; - - config { - pins = "gpio23"; - drive-strength = <8>; - }; - }; - - quat_mi2s_clk_sleep: quat_mi2s_clk_sleep { - mux { - pins = "gpio23"; - function = "func3"; - }; - - config { - pins = "gpio23"; - drive-strength = <2>; - }; - }; - - quat_mi2s_ws_active: quat_mi2s_ws_active { - mux { - pins = "gpio24"; - function = "func1"; - }; - - config { - pins = "gpio24"; - drive-strength = <8>; - }; - }; - - quat_mi2s_ws_sleep: quat_mi2s_ws_sleep { - mux { - pins = "gpio24"; - function = "func1"; - }; - - config { - pins = "gpio24"; - drive-strength = <2>; - }; - }; - - quat_mi2s_sd0_active: quat_mi2s_sd0_active { - mux { - pins = "gpio25"; - function = "func1"; - }; - - config { - pins = "gpio25"; - drive-strength = <8>; - }; - }; - - quat_mi2s_sd0_sleep: quat_mi2s_sd0_sleep { - mux { - pins = "gpio25"; - function = "func1"; - }; - - config { - pins = "gpio25"; - drive-strength = <2>; - }; - }; - - quat_mi2s_sd1_active: quat_mi2s_sd1_active { - mux { - pins = "gpio26"; - function = "func2"; - }; - - config { - pins = "gpio26"; - drive-strength = <8>; - }; - }; - - quat_mi2s_sd1_sleep: quat_mi2s_sd1_sleep { - mux { - pins = "gpio26"; - function = "func2"; - }; - - config { - pins = "gpio26"; - drive-strength = <2>; - }; - }; - quat_mi2s_sd2_active: quat_mi2s_sd2_active { - mux { - pins = "gpio27"; - function = "func2"; - }; - - config { - pins = "gpio27"; - drive-strength = <8>; - }; - }; - - quat_mi2s_sd2_sleep: quat_mi2s_sd2_sleep { - mux { - pins = "gpio27"; - function = "func2"; - }; - - config { - pins = "gpio27"; - drive-strength = <2>; - }; - }; - quat_mi2s_sd3_active: quat_mi2s_sd3_active { - mux { - pins = "gpio28"; - function = "func2"; - }; - - config { - pins = "gpio28"; - drive-strength = <8>; - }; - }; - - quat_mi2s_sd3_sleep: quat_mi2s_sd3_sleep { - mux { - pins = "gpio28"; - function = "func2"; - }; - - config { - pins = "gpio28"; - drive-strength = <2>; - }; - }; -}; - -&tlmm { - /* WSA speaker reset pins */ - spkr_reset_n { - spkr_reset_n_active: spkr_reset_n_active { - mux { - pins = "gpio8"; - function = "gpio"; - }; - - config { - pins = "gpio8"; - drive-strength = <16>; /* 16 mA */ - bias-disable; - output-high; - }; - }; - - spkr_reset_n_sleep: spkr_reset_n_sleep { - mux { - pins = "gpio8"; - function = "gpio"; - }; - - config { - pins = "gpio8"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; - input-enable; - }; - }; - }; - - /* Cooke int pins */ - cs48l33_int_pins: cs48l33_int_pins { - cs48l33_int_default: cs48l33_int_default { - mux { - pins = "gpio58"; - function = "gpio"; - }; - - config { - pins = "gpio58"; - drive-strength = <2>; - bias-pull-up; - input-enable; - }; - }; - - cs48l33_int_sleep: cs48l33_int_sleep { - mux { - pins = "gpio58"; - function = "gpio"; - }; - - config { - pins = "gpio58"; - drive-strength = <2>; - bias-pull-up; - input-enable; - }; - }; - }; - - /* Cooke ldo pins */ - cs48l33_ldo_pins: cs48l33_ldo_pins { - cs48l33_ldo_sleep: cs48l33_ldo_sleep { - mux { - pins = "gpio64"; - function = "gpio"; - }; - - config { - pins = "gpio64"; - drive-strength = <16>; /* 16 mA */ - bias-disable; - output-low; - }; - }; - }; - - amp_gpio { - amp_gpio_active: amp_gpio_active { - mux { - pins = "gpio14","gpio16"; - function = "gpio"; - }; - config { - pins = "gpio14","gpio16"; - drive-strength = <8>; - }; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-audio.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-audio.dtsi deleted file mode 100755 index 3295a94e9488..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-audio.dtsi +++ /dev/null @@ -1,282 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&bolero { - qcom,num-macros = <3>; -}; - -&sm6150_snd { - qcom,model = "sm6150-idp-snd-card"; - - asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>, - <&loopback>, <&compress>, <&hostless>, - <&afe>, <&lsm>, <&routing>, <&compr>, - <&pcm_noirq>, <&samsung_q6audio_adaptation>, - <&cs48l33>; - asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1", - "msm-pcm-dsp.2", "msm-voip-dsp", - "msm-pcm-voice", "msm-pcm-loopback", - "msm-compress-dsp", "msm-pcm-hostless", - "msm-pcm-afe", "msm-lsm-client", - "msm-pcm-routing", "msm-compr-dsp", - "msm-pcm-dsp-noirq", "q6audio-adaptation", - "cs48l32-codec"; - qcom,audio-routing = - "AMIC1", "MIC BIAS1", - "MIC BIAS1", "Analog Mic1", - "AMIC2", "MIC BIAS2", - "MIC BIAS2", "Analog Mic2", - "SYSCLK", "FLL1", - "TX SWR_ADC0", "ADC1_OUTPUT", - "TX SWR_ADC2", "ADC2_OUTPUT", - "WSA SRC0_INP", "SRC0", - "WSA_TX DEC0_INP", "TX DEC0 MUX", - "WSA_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC0_INP", "TX DEC0 MUX", - "RX_TX DEC1_INP", "TX DEC1 MUX", - "RX_TX DEC2_INP", "TX DEC2 MUX", - "RX_TX DEC3_INP", "TX DEC3 MUX", - "SpkrLeft IN", "WSA_SPK1 OUT"; - qcom,msm-mbhc-hphl-swh = <0>; - qcom,msm-mbhc-gnd-swh = <0>; - qcom,cdc-dmic01-gpios = <0>; - qcom,cdc-dmic23-gpios = <0>; - qcom,fm-lna-gpios = <&expander_gpios 20 0>; - - qcom,sec-mi2s-gpios = <&cdc_sec_mi2s_gpios>; - qcom,quat-mi2s-gpios = <&cdc_quat_mi2s_gpios>; - qcom,wsa-max-devs = <1>; - qcom,wsa-devs = <&wsa881x_0213>; - qcom,wsa-aux-dev-prefix = "SpkrLeft"; - qcom,codec-max-aux-devs = <0>; - - cirrus,sysclk = <1 4 98304000>; - cirrus,fll1-refclk = <1 0 32768 49152000>; - cirrus,fll1-refclk-bclk = <1 8 0 49152000>; -}; - -&wsa_spkr_en1 { - pinctrl-0 = <&spkr_reset_n_active>; - pinctrl-1 = <&spkr_reset_n_sleep>; -}; - -&soc { - sec-audio-sysfs { - compatible = "samsung,audio-sysfs"; - status = "okay"; - audio,no-earjack; - audio,num-amp = <1>; - }; - samsung_q6audio_adaptation: samsung,q6audio-adaptation { - compatible = "samsung,q6audio-adaptation"; - adaptation,voice-tracking-tx-port-id = <0xB037>; - adaptation,amp-rx-port-id = <0xB000>; - }; - - cdc_sec_mi2s_gpios: msm_cdc_pinctrl_sec { - compatible = "qcom,msm-cdc-pinctrl"; - pinctrl-names = "aud_active", "aud_sleep"; - pinctrl-0 = <&sec_mi2s_clk_active &sec_mi2s_ws_active - &sec_mi2s_sd0_active &sec_mi2s_sd1_active>; - pinctrl-1 = <&sec_mi2s_clk_sleep &sec_mi2s_ws_sleep - &sec_mi2s_sd0_sleep &sec_mi2s_sd1_sleep>; - }; - - cdc_quat_mi2s_gpios: msm_cdc_pinctrl_quat { - compatible = "qcom,msm-cdc-pinctrl"; - pinctrl-names = "aud_active", "aud_sleep"; - pinctrl-0 = <&quat_mi2s_clk_active &quat_mi2s_ws_active - &quat_mi2s_sd0_active &quat_mi2s_sd1_active>; - pinctrl-1 = <&quat_mi2s_clk_sleep &quat_mi2s_ws_sleep - &quat_mi2s_sd0_sleep &quat_mi2s_sd1_sleep>; - }; - - regulator_dummy: regulator_dummy@0 { - compatible = "regulator-fixed"; - - regulator-name = "CDC_VDD_1.8V"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - regulator-boot-on; - regulator-always-on; - }; - - cs48l33_dcvdd_1p2: regulator_dcvdd { - compatible = "regulator-fixed"; - regulator-name = "regulator-dcvdd-supply"; - status = "ok"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - gpio = <&tlmm 64 0>; /* VOICE_LDO_ENABLE */ - enable-active-high; - startup-delay-us = <10000>; - }; -}; - -&qupv3_se11_i2c { - status = "okay"; - tfa9xxx_rcv: tfa9xxx@34 { - compatible = "nxp,tfa9xxx"; - reg = <0x34>; - haptic; /* this device has the LRA */ - mclk-gpio = <&tlmm 14 0>; - vddd-supply = <&pm6150_l13>; - - }; -}; - -&qupv3_se4_spi { - status = "okay"; - - cs48l33: cs48l33@0 { - compatible = "cirrus,cs48l33"; - reg = <0x0>; - - spi-max-frequency = <25000000>; - - interrupts = <58 8>; - interrupt-controller; - #interrupt-cells = <2>; - interrupt-parent = <&tlmm>; - gpio-controller; - #gpio-cells = <2>; - #sound-dai-cells = <1>; - - VDD_A-supply = <®ulator_dummy>; - VDD_IO1-supply = <®ulator_dummy>; - VDD1_CP-supply = <®ulator_dummy>; - VDD_D-supply = <&cs48l33_dcvdd_1p2>; - - reset-gpios = <&tlmm 68 0>; - - cirrus,in-type = < - 0 0 0 0 /* IN1 */ - >; - - pinctrl-names = "active", "sleep"; - pinctrl-0 = <&cs48l33_defaults &cs48l33_int_default>; - pinctrl-1 = <&cs48l33_ldo_sleep>; - - tacna_pinctrl: tacna-pinctrl { - compatible = "cirrus,tacna-pinctrl"; - - cs48l33_defaults: defaults { - asp1 { - groups = "asp1"; - function = "asp1"; - bias-bus-hold; - }; - }; - }; - - adsps { - #address-cells = <1>; - #size-cells = <0>; - - adsp@2b80000 { - reg = <0x2b80000>; - firmware { - VoiceCtrl { - cirrus,wmfw-file = "ctrl"; - cirrus,fw-name = "Voice Ctrl"; - cirrus,bin-file = "None"; - cirrus,compr-caps = <0xE 8 0x4 1 16000>; - }; - }; - }; - }; - - micvdd { - regulator-min-microvolt = <2000000>; - regulator-max-microvolt = <2000000>; - }; - - MICBIAS1 { - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - cirrus,ext-cap = <1>; - }; - - MICBIAS1A { - regulator-active-discharge = <1>; - }; - - MICBIAS1B { - regulator-active-discharge = <1>; - }; - }; -}; - -&pm6150_l13 { - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - qcom,init-voltage = <1800000>; -}; - -&dai_mi2s1 { - qcom,msm-mi2s-rx-lines = <1>; - qcom,msm-mi2s-tx-lines = <2>; -}; - -&dai_mi2s3 { - qcom,msm-mi2s-rx-lines = <1>; - qcom,msm-mi2s-tx-lines = <2>; -}; - -&wsa_macro { - #cooling-cells = <2>; -}; - -&thermal_zones { - aoss-lowc { - cooling-maps { - audio_cdev { - cooling-device = <&wsa_macro 1 1>; - }; - }; - }; -}; - -&wsa_spkr_en2 { - status = "disabled"; -}; -&wsa881x_0211 { - status = "disabled"; -}; -&wsa881x_0212 { - status = "disabled"; -}; -&wsa881x_0214 { - status = "disabled"; -}; -&fsa4480 { - status = "disabled"; -}; -&rx_swr_gpios { - status = "disabled"; -}; - -&tx_swr_gpios { - status = "disabled"; -}; - -&rx_macro { - status = "disabled"; -}; - -&wcd937x_codec { - status = "disabled"; -}; - -&swr2 { - status = "disabled"; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-battery-common.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-battery-common.dtsi deleted file mode 100755 index 1b39adf76e60..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-battery-common.dtsi +++ /dev/null @@ -1,242 +0,0 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&mtp_batterydata { - /delete-node/ qcom,alium_860_89032_0000_3600mAh; - /delete-node/ qcom,mlp466076_3200mAh; - #include "sm7150-sec-qg-batterydata-r1q.dtsi" -}; - -&pm6150_qg { - qcom,vbatt-cutoff-mv = <3400>; /* SOC 0% */ - qcom,qg-iterm-ma = <350>; /* SOC 100% */ -}; - -&pm6150_charger { - /delete-property/ qcom,sec-charger-config; - qcom,sec-charger-config = <1>; - qcom,chg-term-src = <1>; /* 0 : ITERM_SRC_UNSPECIFIED, 1 : ITERM_SRC_ADC, 2 : ITERM_SRC_ANALOG */ - qcom,chg-term-current-ma = <(-200)>; - qcom,fcc-max-ua = <3800000>; - qcom,usb-icl-ua = <2200000>; - qcom,sw-jeita-enable; - qcom,float-option = <2>; - qcom,otg-cl-ua = <1500000>; - qcom,hard-jeita-enable; - qcom,wdog-snarl-based-step-chg; - qcom,auto-recharge-soc = <(-22)>; - qcom,auto-recharge-vbat-mv = <4280>; - - qcom,jeita_cold_trigger = <0x56CF>; /* 0 degree */ - qcom,jeita_cold_release = <0x548D>; /* 2 degree */ - qcom,jeita_hot_trigger = <0x1BA0>; /* 50 degree */ - qcom,jeita_hot_release = <0x1D33>; /* 48 degree */ - - qcom,default_pdp_limit_w = <20>; - qcom,final_pdp_limit_w = <20>; - - rid-gnd-gpio = <&pm6150l_gpios 9 GPIO_ACTIVE_LOW>; -}; - -&smb1390_charger { - qcom,min-ilim-ua = <750000>; - qcom,max-soc = <55>; -}; - -&soc { - battery { - status = "okay"; - compatible = "samsung,sec-battery"; - battery,store_mode_polling_time = <30>; - battery,gpio_vbat_sense = <&pm6150l_gpios 12 GPIO_ACTIVE_LOW>; - battery,full_check_current_1st = <350>; - battery,use_temp_adc_table; - - /* if adc table is changed, jeita_*_trigger also will be changed */ - battery,temp_table_adc = <2114 2451 2853 3305 3896 - 4522 5388 6360 7250 8376 - 9721 11193 12793 14423 16240 - 17893 19736 21066 22512 23710 - 24874 25779 26214>; - battery,temp_table_data = <900 840 790 740 690 - 640 590 540 490 440 - 390 340 290 240 190 - 140 90 40 (-10) (-60) - (-110) (-160) (-200)>; - - /* mix temp setting value */ - battery,mix_temp_recovery = <390>; - battery,mix_temp_batt_threshold = <420>; - battery,mix_temp_die_threshold = <700>; - - /* chg temp setting value */ - battery,chg_high_temp = <650>; - battery,chg_high_temp_recovery = <630>; - battery,chg_input_limit_current = <1000>; - battery,chg_charging_limit_current = <1250>; - - /* Safety timer parameters */ - battery,standard_curr = <2550000>; //equal to last step of step_chg_ranges - battery,expired_time = <10920>; - battery,recharging_expired_time = <5400>; //90mins - battery,safety_timer_polling_time = <30>; - - battery,battery_full_capacity = <3610>; /* battery capacity */ - /* disable Vbat ovp dettection */ - battery,cisd_max_voltage_thr = <5000>; /* batttery ovp dettection voltage */ - battery,cisd_alg_index = <7>; - - battery,siop_input_limit_current = <1200>; - battery,siop_charging_limit_current = <1800>; - battery,siop_hv_input_limit_current = <700>; - battery,siop_hv_charging_limit_current = <1800>; - battery,siop_dc_input_limit_current = <1000>; - battery,siop_dc_charging_limit_current = <2000>; - - battery,ttf_hv_charge_current = <2510>; - battery,ttf_dc25_charge_current = <3430>; - - battery,ttf_capacity = <3270>; - battery,cv_data = < - 2635 620 3640 - 2620 633 3600 - 2532 643 3540 - 2432 653 3480 - 2418 664 3450 - 2337 675 3420 - 2323 686 3360 - 2270 692 3330 - 2223 703 3300 - 2119 714 3240 - 2110 725 3180 - 2100 736 3150 - 2088 741 3120 - 1986 752 3060 - 1915 763 3000 - 1816 774 2940 - 1708 785 2880 - 1707 796 2820 - 1603 802 2760 - 1649 808 2700 - 1579 816 2640 - 1519 826 2580 - 1462 836 2520 - 1408 844 2460 - 1360 849 2400 - 1312 856 2340 - 1263 862 2280 - 1223 869 2220 - 1176 876 2160 - 1138 883 2100 - 1097 888 2040 - 1057 896 1980 - 1016 903 1920 - 982 908 1860 - 945 913 1800 - 912 918 1740 - 879 922 1680 - 843 927 1620 - 815 931 1560 - 783 934 1500 - 757 937 1440 - 731 940 1380 - 707 944 1320 - 681 948 1260 - 658 951 1200 - 636 955 1140 - 614 959 1080 - 589 962 1020 - 572 965 960 - 553 968 900 - 535 970 840 - 517 973 780 - 501 976 720 - 485 979 660 - 468 981 600 - 452 983 540 - 440 985 480 - 423 987 420 - 410 989 360 - 393 991 300 - 384 993 240 - 370 995 180 - 360 997 120 - 349 999 60 - 338 1000 0 - >; - }; - -/* sec_battery_cable - * 0 UNKNOWN, - * 1 BATTERY, - * 2 UPS, - * 3 MAINS, - * 4 USB, - * 5 USB_DCP, - * 6 USB_CDP, - * 7 USB_ACA, - * 8 USB_TYPE_C, - * 9 USB_PD, - * 10 USB_PD_DRP, - * 11 APPLE_BRICK_ID, - * 12 USB_HVDCP, - * 13 USB_HVDCP_3, - * 14 WIRELESS, - * 15 USB_FLOAT, - * 16 BMS, - * 17 PARALLEL, - * 18 MAIN, - * 19 WIPOWER, - * 20 UFP, - * 21 DFP, - * 22 CHARGE_PUMP, - * 23 POWER_SHARING, - * 24 OTG, - * 25 AFC, - * 26 CABLE_MAX, -*/ - cable-info { - default_input_current = <1800>; - default_charging_current = <2100>; - - current_group_1 { - cable_number = <12 25>; - input_current = <1650>; - charging_current = <2550>; - }; - current_group_2 { - cable_number = <4 8 15>; - input_current = <500>; - charging_current = <700>; - }; - current_group_3 { - cable_number = <9 13>; - input_current = <2200>; - charging_current = <3800>; - }; - current_group_4 { - cable_number = <6 7>; - input_current = <1500>; - charging_current = <1500>; - }; - current_group_5 { - cable_number = <23 24>; - input_current = <500>; - charging_current = <500>; - }; - current_group_6 { - cable_number = <14>; - input_current = <900>; - charging_current = <2850>; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-battery-r02.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-battery-r02.dtsi deleted file mode 100755 index b5b71aecc13d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-battery-r02.dtsi +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-battery-r03.dtsi" - -&pm6150_qg { - /* fix bat temp because of hw issue */ - qcom,fake_temp; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-battery-r03.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-battery-r03.dtsi deleted file mode 100755 index 0a2a541f37a8..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-battery-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-battery-common.dtsi" - -&smb1390_charger { - io-channels = <&pm6150l_vadc ADC_AMUX_THM1_PU2>; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r00.dts deleted file mode 100755 index 1514b83dba56..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r00.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-chn-r00.dtsi" -#include "sm7150-sec-r1q-chn-pinctrl-r00.dtsi" -#include "sm7150-sec-r1q-display-r00.dtsi" -#include "sm7150-sec-r1q-eif-r00.dtsi" -#include "sm7150-sec-r1q-battery-r02.dtsi" -#include "sm7150-sec-r1q-fingerprint_00.dtsi" -#include "sm7150-sec-r1q-nfc-r00.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung R1Q PROJECT Rev0.0 / BringUp (board-id,00)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,project-name = "a7_2018"; - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r01.dts deleted file mode 100755 index a2226f7ec19d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r01.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-chn-r01.dtsi" -#include "sm7150-sec-r1q-chn-pinctrl-r01.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r00.dtsi" -#include "sm7150-sec-r1q-battery-r02.dtsi" -#include "sm7150-sec-r1q-fingerprint_00.dtsi" -#include "sm7150-sec-r1q-nfc-r00.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung R1Q CHN OPEN PROJECT Rev0.0A / BringUp_1 (board-id,01)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r02.dts deleted file mode 100755 index 2f1d134f2224..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r02.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-chn-r02.dtsi" -#include "sm7150-sec-r1q-chn-pinctrl-r02.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r01.dtsi" -#include "sm7150-sec-r1q-battery-r02.dtsi" -#include "sm7150-sec-r1q-fingerprint_00.dtsi" -#include "sm7150-sec-r1q-nfc-r02.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung R1Q CHN OPEN PROJECT Rev0.1 / DV1 (board-id,02)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r03.dts deleted file mode 100755 index 871a2f4b6705..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r03.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-chn-r03.dtsi" -#include "sm7150-sec-r1q-chn-pinctrl-r03.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r01.dtsi" -#include "sm7150-sec-r1q-battery-r03.dtsi" -#include "sm7150-sec-r1q-fingerprint_00.dtsi" -#include "sm7150-sec-r1q-nfc-r02.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung R1Q CHN OPEN PROJECT Rev0.1 / DV1_AUDIO (board-id,03)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r04.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r04.dts deleted file mode 100755 index 03761cbccbe6..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r04.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-chn-r04.dtsi" -#include "sm7150-sec-r1q-chn-pinctrl-r04.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r04.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-nfc-r02.dtsi" -#include "sm7150-camera-sensor-r1q-r02.dtsi" - -/ { - model = "Samsung R1Q CHN OPEN PROJECT Rev0.2 / DV2 (board-id,04)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 4>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r05.dts deleted file mode 100755 index 290d8205aff1..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r05.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-chn-r05.dtsi" -#include "sm7150-sec-r1q-chn-pinctrl-r05.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r05.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-nfc-r02.dtsi" -#include "sm7150-camera-sensor-r1q-r02.dtsi" - -/ { - model = "Samsung R1Q CHN OPEN PROJECT Rev0.3 / DVR (board-id,05)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 5>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r06.dts deleted file mode 100755 index bfbd4c6bf574..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r06.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-chn-r06.dtsi" -#include "sm7150-sec-r1q-chn-pinctrl-r06.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r05.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-nfc-r02.dtsi" -#include "sm7150-camera-sensor-r1q-r07.dtsi" - -/ { - model = "Samsung R1Q CHN OPEN PROJECT Rev0.4 / PV1 (AF/EEPROM Changed) (board-id,06)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 6>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&expander_gpios 1 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r07.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r07.dts deleted file mode 100755 index 3bed4a417a73..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r07.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-chn-r07.dtsi" -#include "sm7150-sec-r1q-chn-pinctrl-r07.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r05.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-nfc-r02.dtsi" -#include "sm7150-camera-sensor-r1q-r07.dtsi" - -/ { - model = "Samsung R1Q CHN OPEN PROJECT Rev0.4 / PV1 (AF/EEPROM Changed) (board-id,07)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 7>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&expander_gpios 1 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r08.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r08.dts deleted file mode 100755 index 8d14818c8496..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-overlay-r08.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-chn-r08.dtsi" -#include "sm7150-sec-r1q-chn-pinctrl-r08.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r05.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-nfc-r02.dtsi" -#include "sm7150-camera-sensor-r1q-r07.dtsi" - -/ { - model = "Samsung R1Q CHN OPEN PROJECT Rev0.5(board-id,08)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 8>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&expander_gpios 1 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r00.dtsi deleted file mode 100755 index 5ccc3bdc28d3..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r00.dtsi +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-pinctrl-common.dtsi" - -&soc { - -}; - -&tlmm { - muic_int_active: muic_int_active { - mux { - pins = "gpio96"; - function = "gpio"; - }; - config { - pins = "gpio96"; - drive-strength = <2>; - bias-disable; - - }; - }; - - ccic_int_active: ccic_int_active { - mux { - pins = "gpio104"; - function = "gpio"; - }; - config { - pins = "gpio104"; - drive-strength = <2>; - bias-disable; - - }; - }; - - cam_sensor_rear1_active: cam_sensor_rear1_active { - /* RESET REAR1 */ - mux { - pins = "gpio52"; - function = "gpio"; - }; - config { - pins = "gpio52"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear1_suspend: cam_sensor_rear1_suspend { - /* REAR1 RESET */ - mux { - pins = "gpio52"; - function = "gpio"; - }; - config { - pins = "gpio52"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear2_active: cam_sensor_rear2_active { - /* RESET REAR2 */ - mux { - pins = "gpio55"; - function = "gpio"; - }; - config { - pins = "gpio55"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear2_suspend: cam_sensor_rear2_suspend { - /* REAR2 RESET */ - mux { - pins = "gpio55"; - function = "gpio"; - }; - config { - pins = "gpio55"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r01.dtsi deleted file mode 100755 index 98c51498b345..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-pinctrl-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r02.dtsi deleted file mode 100755 index 931ebde04fd2..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r02.dtsi +++ /dev/null @@ -1,98 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-pinctrl-common.dtsi" - -&soc { - -}; - -&tlmm { - muic_int_active: muic_int_active { - mux { - pins = "gpio96"; - function = "gpio"; - }; - config { - pins = "gpio96"; - drive-strength = <2>; - bias-disable; - - }; - }; - - ccic_int_active: ccic_int_active { - mux { - pins = "gpio104"; - function = "gpio"; - }; - config { - pins = "gpio104"; - drive-strength = <2>; - bias-disable; - - }; - }; - - cam_sensor_rear1_active: cam_sensor_rear1_active { - /* RESET REAR1 */ - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear1_suspend: cam_sensor_rear1_suspend { - /* REAR1 RESET */ - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear2_active: cam_sensor_rear2_active { - /* RESET REAR2 */ - mux { - pins = "gpio67"; - function = "gpio"; - }; - config { - pins = "gpio67"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear2_suspend: cam_sensor_rear2_suspend { - /* REAR2 RESET */ - mux { - pins = "gpio67"; - function = "gpio"; - }; - config { - pins = "gpio67"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; -}; - diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r03.dtsi deleted file mode 100755 index f9ec5d2a0921..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r04.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r04.dtsi deleted file mode 100755 index 5db815c4c726..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r04.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-pinctrl-r03.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r05.dtsi deleted file mode 100755 index 44cdc077b76e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r05.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-pinctrl-r04.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r06.dtsi deleted file mode 100755 index f2b50b47f67b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r06.dtsi +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-pinctrl-r05.dtsi" - -&pm6150_gpios { - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r07.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r07.dtsi deleted file mode 100755 index 9fa03045ad65..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r07.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r08.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r08.dtsi deleted file mode 100755 index 698d8b41c935..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-pinctrl-r08.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-pinctrl-r07.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r00.dtsi deleted file mode 100755 index 4fa60feea019..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r00.dtsi +++ /dev/null @@ -1,14 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-common.dtsi" -// #include "sm6150-sec-a70q-input-common.dtsi" diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r01.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r01.dtsi deleted file mode 100755 index 48cdaa5edb72..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r01.dtsi +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-r00.dtsi" - -&soc { - pm6150l_rid_adc { - status = "okay"; - compatible = "pm6150l_rid_adc"; - - interrupt-parent = <&spmi_bus>; - pm6150l_rid_adc,irq-gpio = <&pm6150l_gpios 9 GPIO_ACTIVE_LOW>; - jigon-gpios = <&pm6150l_gpios 11 GPIO_ACTIVE_LOW>; - - pinctrl-names = "default"; - pinctrl-0 = <&rid_adc_irq_default &gpio11_dig_out_default>; - - io-channels = <&pm6150l_vadc ADC_GPIO4>; - io-channel-names = "rid_adc_channel"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r02.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r02.dtsi deleted file mode 100755 index ff0668926082..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r03.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r03.dtsi deleted file mode 100755 index 863624e4823e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r04.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r04.dtsi deleted file mode 100755 index 4e633973029e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r04.dtsi +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-r03.dtsi" - -&soc { - sec_thermistor@0 { - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - }; - - /* S2MPB03 Camera PMIC */ - i2c@26 { - cell-index = <26>; - compatible = "i2c-gpio"; - gpios = <&tlmm 4 0 /* sda */ - &tlmm 5 0 /* scl */ - >; - }; -}; - -&pm6150l_vadc { - sdm_therm { - reg = ; - }; -}; - -&tlmm { - s2mpb03_i2c_pins { - s2mpb03_i2c_active { - mux { - pins = "gpio4", "gpio5"; - function = "gpio"; - }; - config { - pins = "gpio4", "gpio5"; - drive-strength = <2>; - bias-disable; - }; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r05.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r05.dtsi deleted file mode 100755 index 73f284cf7a8d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r05.dtsi +++ /dev/null @@ -1,13 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-r04.dtsi" diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r06.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r06.dtsi deleted file mode 100755 index 041fb0208b46..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r06.dtsi +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-r05.dtsi" - -&pm6150_charger { - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - - water-det-enable; - #sub-short-detect-enable; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r07.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r07.dtsi deleted file mode 100755 index 0670d05a61f4..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r07.dtsi +++ /dev/null @@ -1,13 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-r06.dtsi" diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r08.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r08.dtsi deleted file mode 100755 index fff828e6c678..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-chn-r08.dtsi +++ /dev/null @@ -1,13 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-chn-r07.dtsi" diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-common.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-common.dtsi deleted file mode 100755 index 2974e87848b5..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-common.dtsi +++ /dev/null @@ -1,165 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-audio.dtsi" -#include "sm7150-sec-r1q-input-common.dtsi" -#include "sm7150-sec-r1q-mst-r00.dtsi" - -/{ - aliases { - i2c17 = &i2c_17; - }; -}; - -&soc { - i2c_17: i2c@17 { /* SW I2C */ - status = "ok"; - - cell-index = <17>; - compatible = "i2c-gpio"; - gpios = <&tlmm 25 0 /* sda */ - &tlmm 26 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_i2c_active>; - - sx9360-i2c@28 { - compatible = "sx9360"; - reg = <0x28>; - pinctrl-names = "default"; - pinctrl-0 = <&grip_int_active>; - - interrupt-parent = <&spmi_bus>; - interrupts = <0x4 0xc4 0 IRQ_TYPE_EDGE_FALLING>; - - sx9360,nirq-gpio = <&pm6150l_gpios 5 GPIO_ACTIVE_LOW>; - sx9360,refresolution_reg = <0x0f>; /* same as resolution_reg */ - sx9360,refagainfreq_reg = <0x57>; /* same as againfreq_reg */ - sx9360,resolution_reg = <0x0f>; /* resolution : 1024 */ - sx9360,againfreq_reg = <0x57>; /* freq : 71.43 kHz, again : +/-7.5 pF */ - sx9360,refgainrawfilt_reg = <0x22>; /* same as gainrawfilt_reg */ - sx9360,gainrawfilt_reg = <0x22>; /* rawfilter : 1-1/4, gain : x8 */ - sx9360,hyst_reg = <0x15>; /* hysteresis : +/-6 %, debouncer : 2 samples */ - sx9360,proxthresh_reg = <0x23>; /* threshhold : 612 */ - }; - }; - - /* Sensor */ - qcom,lpass@62400000 { - sensor_vdd-supply = <&pm6150l_l8>; - qcom,sensor_vdd-uV-uA = <1800000 0>; - qcom,active-reg-names = "sensor_vdd"; - }; - - ssc_core { - status = "okay"; - compatible = "ssc_core"; - ssc_core,mst_gpio = <&tlmm 30 0x0>; - }; - - sec_detect_conn { - compatible = "samsung,sec_detect_conn"; - sec,det_conn_gpios = <&tlmm 66 0>; /* UB_CON_DETECT */ - - sec,det_conn_name = "UB_CONNECT"; - - sec,det_conn_irq_type = <3>; /* UB_CON_DETECT FALLING, RIGING EDGE*/ - - pinctrl-names = "det_ap_connect"; - pinctrl-0 = <&detect_conn_setting>; - }; - - sec_abc { - compatible = "samsung,sec_abc"; - status = "okay"; - - gpu { - gpu,label="GPU fault"; - gpu,threshold_count=<20>; - gpu,threshold_time=<1200>; - }; - aicl { - aicl,label="battery aicl"; - aicl,threshold_count=<5>; - aicl,threshold_time=<300>; - }; - }; - - abc_hub { - compatible = "samsung,abc_hub"; - status = "okay"; - - pinctrl-names = "det_ap_connect"; - pinctrl-0 = <&detect_conn_setting>; - - bootc { - bootc,time_spec_user = <100000>; /* user binary user build */ - bootc,time_spec_eng = <100000>; /* user binary eng build */ - bootc,time_spec_fac = <100000>; /* factory binary */ - }; - - cond { - sec,det_conn_gpios = <&tlmm 66 0>; /* UB_CONNECT */ - sec,det_conn_name = "ub"; - }; - }; -}; - -&firmware { - android { - vbmeta { - compatible = "android,vbmeta"; - parts = "vbmeta,boot,system,vendor,product,recovery,dtbo,abl,xbl,tz,hyp"; - }; - fstab { - compatible = "android,fstab"; - product { - compatible = "android,product"; - /* dev = "/dev/block/bootdevice/by-name/product"; */ - dev = "/dev/block/platform/soc/1d84000.ufshc/by-name/product"; - type = "ext4"; - mnt_flags = "ro"; - fsmgr_flags = "wait,avb"; - }; - vendor { - compatible = "android,vendor"; - dev = "/dev/block/platform/soc/1d84000.ufshc/by-name/vendor"; - type = "ext4"; - mnt_flags = "ro,barrier=1,discard"; - fsmgr_flags = "wait,avb"; - }; - }; - }; -}; - -/* Grip Sensor */ -&pm6150_l16 { - regulator-min-microvolt = <3000000>; - regulator-max-microvolt = <3000000>; - qcom,init-voltage = <3000000>; - regulator-always-on; -}; - - -/* not use eMMC */ -&sdhc_1 { - status = "disabled"; -}; -/* not use SDcard */ -&sdhc_2 { - status = "disabled"; -}; - - diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-display-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-display-r00.dtsi deleted file mode 100755 index fc09f56b00cf..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-display-r00.dtsi +++ /dev/null @@ -1,161 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../drivers/gpu/drm/msm/samsung/SELF_DISPLAY/self_display_cmd_FA7_AMS604NL07.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/S6E3FA7_AMS604NL07/dsi_panel_S6E3FA7_AMS604NL07_fhd_octa_cmd.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - - -#if 0 -/{ - aliases { - spi7 = &qupv3_se7_spi; - }; -}; -#endif - -&pm6150l_gpios { - sde_dsi_reset_active: sde_dsi_reset_active { - pins = "gpio9"; - function = "normal"; - power-source = <0>; - output-low; - }; -}; - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio57"; - function = "gpio"; - }; - - config { - pins = "gpio57"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio57"; - function = "gpio"; - }; - - config { - pins = "gpio57"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; - - /delete-node/ pmx_sde_te; -#if 0 - pmx_sde_te { - sde_te_active: sde_te_active { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - - sde_te_suspend: sde_te_suspend { - mux { - pins = "gpio10"; - function = "mdp_vsync"; - }; - - config { - pins = "gpio10"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; -#endif -}; - - -&soc { - /* A50 panel */ - ss_dsi_panel_S6E3FA7_AMS604NL07_FHD_display: qcom,dsi-display@9 { - label = "ss_dsi_panel_S6E3FA7_AMS604NL07_FHD"; - qcom,display-type = "primary"; - - pinctrl-names = "panel_active", "panel_suspend"; -#if 0 - pinctrl-0 = <&sde_dsi_reset_active &sde_dsi_active &sde_te_active>; - pinctrl-1 = <&sde_dsi_suspend &sde_te_suspend>; -#endif - pinctrl-0 = <&sde_dsi_reset_active &sde_dsi_active>; - pinctrl-1 = <&sde_dsi_suspend>; - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@10 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_dsi_active>; - pinctrl-1 = <&sde_dsi_suspend>; - }; -}; - -&sde_dsi { - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_te_active>; - pinctrl-1 = <&sde_te_suspend>; - qcom,dsi-display-list = - <&ss_dsi_panel_S6E3FA7_AMS604NL07_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; -}; - - -&ss_dsi_panel_S6E3FA7_AMS604NL07_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_S6E3FA7_AMS604NL07_FHD>; - - qcom,platform-en-gpio = <&tlmm 57 0>; - qcom,platform-reset-gpio = <&pm6150l_gpios 9 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-en-gpio = <&tlmm 57 0>; - qcom,platform-reset-gpio = <&pm6150l_gpios 9 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; - diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-display-r01.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-display-r01.dtsi deleted file mode 100755 index 32598ae3824e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-display-r01.dtsi +++ /dev/null @@ -1,103 +0,0 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "../../../../../drivers/gpu/drm/msm/samsung/S6E3FC2_AMS670TA01/dsi_panel_S6E3FC2_AMS670TA01_fhd_octa_cmd.dtsi" -#include "../../../../../drivers/gpu/drm/msm/samsung/PBA_BOOTING/dsi_panel_PBA_BOOTING_fhd_video.dtsi" - - -&tlmm { - pmx_sde: pmx_sde { - sde_dsi_active: sde_dsi_active { - mux { - pins = "gpio11","gpio66","gpio69", "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio11","gpio66","gpio69", "gpio63"; - drive-strength = <8>; /* 8 mA */ - bias-disable = <0>; /* no pull */ - }; - }; - sde_dsi_suspend: sde_dsi_suspend { - mux { - pins = "gpio11","gpio66","gpio69", "gpio63"; - function = "gpio"; - }; - - config { - pins = "gpio11","gpio66","gpio69", "gpio63"; - drive-strength = <2>; /* 2 mA */ - bias-pull-down; /* PULL DOWN */ - }; - }; - }; -}; - -&soc { - /* A90 panel */ - ss_dsi_panel_S6E3FC2_AMS670TA01_FHD_display: qcom,dsi-display@9 { - label = "ss_dsi_panel_S6E3FC2_AMS670TA01_FHD"; - qcom,display-type = "primary"; - - }; - - /* PBA */ - ss_dsi_panel_PBA_BOOTING_FHD_display: qcom,dsi-display@10 { - label = "ss_dsi_panel_PBA_BOOTING_FHD"; - qcom,display-type = "primary"; - - }; -}; - -&sde_dsi { - pinctrl-names = "panel_active", "panel_suspend"; - pinctrl-0 = <&sde_te_active &sde_dsi_active>; - pinctrl-1 = <&sde_te_suspend &sde_dsi_suspend>; - qcom,dsi-display-list = - <&ss_dsi_panel_S6E3FC2_AMS670TA01_FHD - &ss_dsi_panel_PBA_BOOTING_FHD>; -}; - -&ss_dsi_panel_S6E3FC2_AMS670TA01_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_S6E3FC2_AMS670TA01_FHD>; - - qcom,platform-en-gpio = <&tlmm 69 0>; - qcom,platform-reset-gpio = <&tlmm 11 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; - samsung,esd-irq-gpio1 = <&tlmm 63 0>; // DISP_DET - samsung,ub-con-det = <&tlmm 66 0>; // UB_CON_DET - samsung,support-optical-fingerprint; -}; - -&ss_dsi_panel_PBA_BOOTING_FHD { - qcom,display-type = "primary"; - qcom,dsi-display-active; - - qcom,dsi-ctrl-num = <0>; - qcom,dsi-phy-num = <0>; - qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0"; - - qcom,dsi-panel = <&ss_dsi_panel_PBA_BOOTING_FHD>; - - qcom,platform-en-gpio = <&tlmm 69 0>; - qcom,platform-reset-gpio = <&tlmm 11 0>; - qcom,platform-te-gpio = <&tlmm 10 0>; -}; - diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r00.dtsi deleted file mode 100755 index baef084875f1..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r00.dtsi +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - /* GPIO EXPANDER */ - i2c_23: i2c@23 { - status = "ok"; - - cell-index = <23>; - compatible = "i2c-gpio"; - gpios = <&tlmm 102 0 /* EXPANDER_I2C_SDA_1P8 */ - &tlmm 101 0 /* EXPANDER_I2C_SCL_1P8 */ - >; - i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&i2c_23_pinctrl>; - - expander_gpios: pcal6524@22 { - compatible = "pcal6524,gpio-expander"; - gpio-controller; - #gpio-cells = <2>; - reg = <0x22>; - pinctrl-names = "expander_reset_setting"; - pinctrl-0 = <&expander_reset_active>; - pcal6524,gpio_start = <300>; - pcal6524,ngpio = <24>; - pcal6524,reset-gpio = <&tlmm 52 0>; - pcal6524,vdd-supply = <&pm6150_l10>; - pcal6524,support_initialize = <1>; - /* config, 24 ~ 0, 1bit configure[1:input, 0:output]*/ - pcal6524,config = <0x7F3FFF>; /* P2[01111111] P1[00111111] P0[11111111] */ - /* data_out, 24 ~ 0, 1bit configure[1:high, 0:low]*/ - pcal6524,data_out = <0x000000>; /* P2[00000000] P1[00000000] P0[00000000] */ - /* pull_reg, 8 ~ 0, 2bit configure[00:no_pull, 01:pull_down, 10:pull_up, 11:not used] */ - pcal6524,pull_reg_p0 = <0x0000>; /* 00 00 00 00 / 00 00 00 00 */ - pcal6524,pull_reg_p1 = <0x0000>; /* 00 00 00 00 / 00 00 00 00 */ - pcal6524,pull_reg_p2 = <0x0000>; /* 00 00 00 00 / 00 00 00 00 */ - }; - }; - - step_motor { - compatible = "st,stspin220"; - pinctrl-names = "pm_gpio6_pwm_active"; - pinctrl-0 = <&pwm_out_gpio6_active>; - pwms = <&pm6150l_pwm 0 1000000>; - - motor,step_dir = <&expander_gpios 2 0>; - motor,step_m0 = <&expander_gpios 3 0>; - motor,step_m1 = <&expander_gpios 4 0>; - motor,step_enable = <&tlmm 58 0>; - motor,step_step = <&expander_gpios 7 0>; - motor,step_sleep = <&expander_gpios 12 0>; - motor,boost_en = <&expander_gpios 18 0>; - }; - hall { - status = "okay"; - compatible = "hall"; - linux,input-type = <1>; - linux,code = <21>; - hall,gpio_flip_cover = <&tlmm 91 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&hall_default>; - }; - - certify_hall { - status = "okay"; - compatible = "certify_hall"; - linux,input-type = <1>; - linux,code = <27>; - certify_hall,gpio_certify_cover = <&tlmm 88 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&certify_hall_default>; - }; - - sliding_up_hall { - status = "okay"; - compatible = "sliding_up_hall"; - linux,input-type = <1>; - linux,code = <21>; - sliding_up_hall,gpio_sliding_up_hall = <&tlmm 93 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&sliding_up_hall_default>; - }; - - sliding_down_hall { - status = "okay"; - compatible = "sliding_down_hall"; - linux,input-type = <1>; - linux,code = <27>; - sliding_down_hall,gpio_sliding_down_hall = <&tlmm 89 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&sliding_down_hall_default>; - }; - - samsung,usbpd { - compatible = "samsung,usb-pd"; - qcom,samsung-usbpd-detection = <&pm6150_pdphy>; - }; -}; - -&pm6150l_gpios { - pwm_out_gpio6 { - pwm_out_gpio6_active: pwm_out_gpio6_active { - pins = "gpio6"; - function = "func1"; - bias-disable; - power-source = <0>; - output-low; - qcom,drive-strength = <3>; - drive-push-pull; - }; - }; -}; - -/* pinctrl */ -&tlmm { - - /* GPIO EXPANDER */ - i2c_23_pinctrl: i2c_23_pinctrl { - mux { - pins = "gpio102", /* EXPANDER_I2C_SDA_1P8 */ - "gpio101"; /* EXPANDER_I2C_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio102", /* EXPANDER_I2C_SDA_1P8 */ - "gpio101"; /* EXPANDER_I2C_SCL_1P8 */ - drive-strength = <2>; - bias-disable; - }; - }; - - expander_reset_active: expander_reset_active { - mux { - pins = "gpio52"; - function = "gpio"; - }; - config { - pins = "gpio52"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - output-high; - }; - }; -}; - -&soc { - usb_noti: usb-notifier { - compatible = "samsung,usb-notifier"; - qcom,disable_control_en = <1>; - qcom,unsupport_host_en = <0>; - }; -}; - -&usb0 { - dwc3@a600000 { - usb-phy = <&qusb_phy0>, <&usb_nop_phy>; - maximum-speed = "high-speed"; - }; -}; - -&usb_qmp_dp_phy { - status = "disabled"; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x1c 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x77 0x240 /* TUNE1 */ - 0x29 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x02 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,qusb-phy-host-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x20 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x45 0x240 /* TUNE1 */ - 0x29 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x04 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,diff_tune_host = <(0)>; /* efuse(0x3) + 0 = 7 for tune high value */ - qcom,diff_tune_device = <(4)>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r01.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r01.dtsi deleted file mode 100755 index 69d1bb247174..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r01.dtsi +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - /* GPIO EXPANDER */ - i2c_23: i2c@23 { - status = "ok"; - - cell-index = <23>; - compatible = "i2c-gpio"; - gpios = <&tlmm 46 0 /* EXPANDER_I2C_SDA_1P8 */ - &tlmm 47 0 /* EXPANDER_I2C_SCL_1P8 */ - >; - i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&i2c_23_pinctrl>; - - expander_gpios: pcal6524@22 { - compatible = "pcal6524,gpio-expander"; - gpio-controller; - #gpio-cells = <2>; - reg = <0x22>; - pinctrl-names = "expander_reset_setting"; - pinctrl-0 = <&expander_reset_active>; - pcal6524,gpio_start = <300>; - pcal6524,ngpio = <24>; - pcal6524,reset-gpio = <&tlmm 65 0>; - pcal6524,vdd-supply = <&pm6150_l10>; - pcal6524,support_initialize = <1>; - /* config, 24 ~ 0, 1bit configure[1:input, 0:output]*/ - pcal6524,config = <0x7F3FFF>; /* P2[01111111] P1[00111111] P0[11111111] */ - /* data_out, 24 ~ 0, 1bit configure[1:high, 0:low]*/ - pcal6524,data_out = <0x000000>; /* P2[00000000] P1[00000000] P0[00000000] */ - /* pull_reg, 8 ~ 0, 2bit configure[00:no_pull, 01:pull_down, 10:pull_up, 11:not used] */ - pcal6524,pull_reg_p0 = <0x0000>; /* 00 00 00 00 / 00 00 00 00 */ - pcal6524,pull_reg_p1 = <0x0000>; /* 00 00 00 00 / 00 00 00 00 */ - pcal6524,pull_reg_p2 = <0x0000>; /* 00 00 00 00 / 00 00 00 00 */ - }; - }; - - step_motor { - compatible = "st,stspin220"; - pinctrl-names = "pm_gpio6_pwm_active"; - pinctrl-0 = <&pwm_out_gpio6_active>; - pwms = <&pm6150l_pwm 0 1000000>; - - motor,step_dir = <&expander_gpios 2 0>; - motor,step_m0 = <&expander_gpios 3 0>; - motor,step_m1 = <&expander_gpios 4 0>; - motor,step_enable = <&expander_gpios 8 0>; - motor,step_step = <&expander_gpios 7 0>; - motor,step_sleep = <&expander_gpios 12 0>; - motor,boost_en = <&expander_gpios 18 0>; - }; - - samsung,usbpd { - compatible = "samsung,usb-pd"; - qcom,samsung-usbpd-detection = <&pm6150_pdphy>; - }; -}; - -&pm6150l_gpios { - pwm_out_gpio6 { - pwm_out_gpio6_active: pwm_out_gpio6_active { - pins = "gpio6"; - function = "func1"; - bias-disable; - power-source = <0>; - output-low; - qcom,drive-strength = <3>; - drive-push-pull; - }; - }; -}; - -/* pinctrl */ -&tlmm { - - /* GPIO EXPANDER */ - i2c_23_pinctrl: i2c_23_pinctrl { - mux { - pins = "gpio46", /* EXPANDER_I2C_SDA_1P8 */ - "gpio47"; /* EXPANDER_I2C_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio46", /* EXPANDER_I2C_SDA_1P8 */ - "gpio47"; /* EXPANDER_I2C_SCL_1P8 */ - drive-strength = <2>; - bias-disable; - }; - }; - - expander_reset_active: expander_reset_active { - mux { - pins = "gpio65"; - function = "gpio"; - }; - config { - pins = "gpio65"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - output-high; - }; - }; -}; - -&soc { - usb_noti: usb-notifier { - compatible = "samsung,usb-notifier"; - qcom,disable_control_en = <1>; - qcom,unsupport_host_en = <0>; - }; -}; - -&usb0 { - dwc3@a600000 { - usb-phy = <&qusb_phy0>, <&usb_nop_phy>; - maximum-speed = "high-speed"; - }; -}; - -&usb_qmp_dp_phy { - status = "disabled"; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x1c 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x77 0x240 /* TUNE1 */ - 0x29 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x02 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,qusb-phy-host-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x20 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x45 0x240 /* TUNE1 */ - 0x29 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x04 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,diff_tune_host = <(0)>; /* efuse(0x3) + 0 = 7 for tune high value */ - qcom,diff_tune_device = <(4)>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r04.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r04.dtsi deleted file mode 100755 index dc6e4b6af880..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r04.dtsi +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include - -&soc { - /* GPIO EXPANDER */ - i2c_23: i2c@23 { - status = "ok"; - - cell-index = <23>; - compatible = "i2c-gpio"; - gpios = <&tlmm 46 0 /* EXPANDER_I2C_SDA_1P8 */ - &tlmm 47 0 /* EXPANDER_I2C_SCL_1P8 */ - >; - i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&i2c_23_pinctrl>; - - expander_gpios: pcal6524@22 { - compatible = "pcal6524,gpio-expander"; - gpio-controller; - #gpio-cells = <2>; - reg = <0x22>; - pinctrl-names = "expander_reset_setting"; - pinctrl-0 = <&expander_reset_active>; - pcal6524,gpio_start = <300>; - pcal6524,ngpio = <24>; - pcal6524,reset-gpio = <&tlmm 65 0>; - pcal6524,vdd-supply = <&pm6150_l10>; - pcal6524,support_initialize = <1>; - /* config, 24 ~ 0, 1bit configure[1:input, 0:output]*/ - pcal6524,config = <0x7F7FFF>; /* P2[01111111] P1[01111111] P0[11111111] */ - /* data_out, 24 ~ 0, 1bit configure[1:high, 0:low]*/ - pcal6524,data_out = <0x000000>; /* P2[00000000] P1[00000000] P0[00000000] */ - /* pull_reg, 8 ~ 0, 2bit configure[00:no_pull, 01:pull_down, 10:pull_up, 11:not used] */ - pcal6524,pull_reg_p0 = <0x0000>; /* 00 00 00 00 / 00 00 00 00 */ - pcal6524,pull_reg_p1 = <0x0000>; /* 00 00 00 00 / 00 00 00 00 */ - pcal6524,pull_reg_p2 = <0x0000>; /* 00 00 00 00 / 00 00 00 00 */ - }; - }; - - step_motor { - compatible = "st,stspin220"; - pinctrl-names = "pm_gpio6_pwm_active"; - pinctrl-0 = <&pwm_out_gpio6_active>; - pwms = <&pm6150l_pwm 0 1000000>; - - motor,step_dir = <&expander_gpios 2 0>; - motor,step_m0 = <&expander_gpios 3 0>; - motor,step_m1 = <&expander_gpios 4 0>; - motor,step_enable = <&expander_gpios 8 0>; - motor,step_step = <&expander_gpios 7 0>; - motor,step_sleep = <&expander_gpios 12 0>; - motor,boost_en = <&expander_gpios 18 0>; - }; - - certify_hall { - status = "okay"; - compatible = "certify_hall"; - linux,input-type = <1>; - linux,code = <27>; - certify_hall,gpio_certify_cover = <&tlmm 91 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&certify_hall_default>; - }; - - sliding_up_hall { - status = "disabled"; - compatible = "sliding_up_hall"; - linux,input-type = <1>; - linux,code = <21>; - sliding_up_hall,gpio_sliding_up_hall = <&tlmm 89 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&sliding_up_hall_default>; - }; - - sliding_down_hall { - status = "okay"; - compatible = "sliding_down_hall"; - linux,input-type = <1>; - linux,code = <27>; - sliding_down_hall,gpio_sliding_down_hall = <&tlmm 93 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&sliding_down_hall_default>; - }; - - qupv3_se4_afc: afc@880000 { - compatible = "pm6150_afc"; - reg = <0x880000 0x4000>; - interrupts = ; - #address-cells = <1>; - #size-cells = <0>; - clock-names = "se-clk", "m-ahb", "s-ahb"; - clocks = <&clock_gcc GCC_QUPV3_WRAP0_S0_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_0_M_AHB_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_0_S_AHB_CLK>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&qupv3_se4_afc_active &gpio1_afc_switch_default>; - pinctrl-1 = <&qupv3_se4_afc_sleep>; - qcom,wrapper-core = <&qupv3_0>; - afc-gpios = <&pm6150_gpios 1 GPIO_ACTIVE_LOW>; - status = "ok"; - }; - - samsung,usbpd { - compatible = "samsung,usb-pd"; - qcom,samsung-usbpd-detection = <&pm6150_pdphy>; - }; -}; - -&qupv3_se11_i2c { - tfa9xxx@34 { - pinctrl-names = "default"; - pinctrl-0 = <&motor_default_pins>; - samsung,vib_type = "LINEAR_RCVMOT"; - haptic-fw-intensity-max = <42>; - }; -}; - -/* Digital HALL IC */ -&i2c_17{ - digital_hall_up_hallic: dw772x@0C { - compatible = "dwanatech,dw772x"; - gpio-controller; - #gpio-cells = <2>; - reg = <0x0C>; - pinctrl-names = "default"; - pinctrl-0 = <&hall_up_active>; - dw772x,en-gpio = <&tlmm 89 0>; - hall,hall_ldo_en = <&expander_gpios 13 0>; - }; - - digital_hall_down_hallic: dw772x@4C { - compatible = "dwanatech,dw772x_reverse"; - gpio-controller; - #gpio-cells = <2>; - reg = <0x4C>; - pinctrl-names = "default"; - pinctrl-0 = <&hall_down_active>; - dw772x_reverse,en-gpio = <&tlmm 90 0>; - hall,hall_ldo_en = <&expander_gpios 13 0>; - }; -}; - -&pm6150l_gpios { - pwm_out_gpio6 { - pwm_out_gpio6_active: pwm_out_gpio6_active { - pins = "gpio6"; - function = "func1"; - bias-disable; - power-source = <0>; - output-low; - qcom,drive-strength = <3>; - drive-push-pull; - }; - }; -}; - -/* pinctrl */ -&tlmm { - /* GPIO EXPANDER */ - i2c_23_pinctrl: i2c_23_pinctrl { - mux { - pins = "gpio46", /* EXPANDER_I2C_SDA_1P8 */ - "gpio47"; /* EXPANDER_I2C_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio46", /* EXPANDER_I2C_SDA_1P8 */ - "gpio47"; /* EXPANDER_I2C_SCL_1P8 */ - drive-strength = <2>; - bias-disable; - }; - }; - - expander_reset_active: expander_reset_active { - mux { - pins = "gpio65"; - function = "gpio"; - }; - config { - pins = "gpio65"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - output-high; - }; - }; - - hall_up_active: hall_up_active { - mux { - pins = "gpio89"; - function = "gpio"; - }; - config { - pins = "gpio89"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - }; - }; - - hall_down_active: hall_down_active { - mux { - pins = "gpio90"; - function = "gpio"; - }; - config { - pins = "gpio90"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - }; - }; - - /* SE 4 pin mappings for AFC*/ - qupv3_se4_afc_pins: qupv3_se4_afc_pins { - qupv3_se4_afc_active: qupv3_se4_afc_active { - mux { - pins = "gpio51"; - function = "qup00"; - }; - - config { - pins = "gpio51"; - drive-strength = <2>; - bias-disable; - }; - }; - - qupv3_se4_afc_sleep: qupv3_se4_afc_sleep { - mux { - pins = "gpio51"; - function = "gpio"; - }; - - config { - pins = "gpio51"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - - motor_default_pins: motor_default_pins { - mux { - pins = "gpio16"; - function = "gpio"; - }; - config { - pins = "gpio16"; - bias-disable; /* No PULL */ - input-enable; - }; - }; -}; - -&soc { - usb_noti: usb-notifier { - compatible = "samsung,usb-notifier"; - qcom,disable_control_en = <1>; - qcom,unsupport_host_en = <0>; - }; -}; - -&usb0 { - dwc3@a600000 { - usb-phy = <&qusb_phy0>, <&usb_nop_phy>; - maximum-speed = "high-speed"; - }; -}; - -&usb_qmp_dp_phy { - status = "disabled"; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x1c 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x77 0x240 /* TUNE1 */ - 0x29 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x02 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,qusb-phy-host-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x20 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x45 0x240 /* TUNE1 */ - 0x29 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x04 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,diff_tune_host = <(0)>; /* efuse(0x3) + 0 = 7 for tune high value */ - qcom,diff_tune_device = <(4)>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r05.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r05.dtsi deleted file mode 100755 index 1c7edce1b71a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eif-r05.dtsi +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include - -&soc { - /* GPIO EXPANDER */ - i2c_23: i2c@23 { - status = "ok"; - - cell-index = <23>; - compatible = "i2c-gpio"; - gpios = <&tlmm 46 0 /* EXPANDER_I2C_SDA_1P8 */ - &tlmm 47 0 /* EXPANDER_I2C_SCL_1P8 */ - >; - i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&i2c_23_pinctrl>; - - expander_gpios: pcal6524@22 { - compatible = "pcal6524,gpio-expander"; - gpio-controller; - #gpio-cells = <2>; - reg = <0x22>; - pinctrl-names = "expander_reset_setting"; - pinctrl-0 = <&expander_reset_active>; - pcal6524,gpio_start = <300>; - pcal6524,ngpio = <24>; - pcal6524,reset-gpio = <&tlmm 65 0>; - pcal6524,vdd-supply = <&pm6150_l10>; - pcal6524,support_initialize = <1>; - /* config, 24 ~ 0, 1bit configure[1:input, 0:output]*/ - pcal6524,config = <0x7F7FFF>; /* P2[01111111] P1[01111111] P0[11111111] */ - /* data_out, 24 ~ 0, 1bit configure[1:high, 0:low]*/ - pcal6524,data_out = <0x000000>; /* P2[00000000] P1[00000000] P0[00000000] */ - /* pull_reg, 8 ~ 0, 2bit configure[00:no_pull, 01:pull_down, 10:pull_up, 11:not used] */ - pcal6524,pull_reg_p0 = <0x0000>; /* 00 00 00 00 / 00 00 00 00 */ - pcal6524,pull_reg_p1 = <0x0000>; /* 00 00 00 00 / 00 00 00 00 */ - pcal6524,pull_reg_p2 = <0x0000>; /* 00 00 00 00 / 00 00 00 00 */ - }; - }; - - step_motor { - compatible = "st,stspin220"; - pinctrl-names = "pm_gpio6_pwm_active"; - pinctrl-0 = <&pwm_out_gpio6_active>; - pwms = <&pm6150l_pwm 0 1000000>; - - motor,step_dir = <&expander_gpios 2 0>; - motor,step_m0 = <&expander_gpios 3 0>; - motor,step_m1 = <&expander_gpios 4 0>; - motor,step_enable = <&expander_gpios 8 0>; - motor,step_step = <&expander_gpios 7 0>; - motor,step_sleep = <&expander_gpios 12 0>; - motor,boost_en = <&expander_gpios 18 0>; - }; - - certify_hall { - status = "disabled"; - compatible = "certify_hall"; - linux,input-type = <1>; - linux,code = <27>; - certify_hall,gpio_certify_cover = <&tlmm 91 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&certify_hall_default>; - }; - - sliding_up_hall { - status = "disabled"; - compatible = "sliding_up_hall"; - linux,input-type = <1>; - linux,code = <21>; - sliding_up_hall,gpio_sliding_up_hall = <&tlmm 89 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&sliding_up_hall_default>; - }; - - sliding_down_hall { - status = "okay"; - compatible = "sliding_down_hall"; - linux,input-type = <1>; - linux,code = <27>; - sliding_down_hall,gpio_sliding_down_hall = <&tlmm 93 0x1>; - debounce-interval = <15>; - pinctrl-names = "default"; - pinctrl-0 = <&sliding_down_hall_default>; - }; - - qupv3_se4_afc: afc@880000 { - compatible = "pm6150_afc"; - reg = <0x880000 0x4000>; - interrupts = ; - #address-cells = <1>; - #size-cells = <0>; - clock-names = "se-clk", "m-ahb", "s-ahb"; - clocks = <&clock_gcc GCC_QUPV3_WRAP0_S0_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_0_M_AHB_CLK>, - <&clock_gcc GCC_QUPV3_WRAP_0_S_AHB_CLK>; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&qupv3_se4_afc_active &gpio1_afc_switch_default>; - pinctrl-1 = <&qupv3_se4_afc_sleep>; - qcom,wrapper-core = <&qupv3_0>; - afc-gpios = <&pm6150_gpios 1 GPIO_ACTIVE_LOW>; - status = "ok"; - }; - - samsung,usbpd { - compatible = "samsung,usb-pd"; - qcom,samsung-usbpd-detection = <&pm6150_pdphy>; - }; -}; - -&qupv3_se11_i2c { - tfa9xxx@34 { - pinctrl-names = "default"; - pinctrl-0 = <&motor_default_pins>; - samsung,vib_type = "LINEAR_RCVMOT"; - haptic-fw-intensity-max = <39>; - }; -}; - -/* Digital HALL IC */ -&i2c_17{ - digital_hall_up_hallic: dw772x@0C { - compatible = "dwanatech,dw772x"; - gpio-controller; - #gpio-cells = <2>; - reg = <0x0C>; - pinctrl-names = "default"; - pinctrl-0 = <&hall_up_active>; - dw772x,en-gpio = <&tlmm 89 0>; - hall,hall_ldo_en = <&expander_gpios 13 0>; - }; - - digital_hall_down_hallic: dw772x@4C { - compatible = "dwanatech,dw772x_reverse"; - gpio-controller; - #gpio-cells = <2>; - reg = <0x4C>; - pinctrl-names = "default"; - pinctrl-0 = <&hall_down_active>; - dw772x_reverse,en-gpio = <&tlmm 90 0>; - hall,hall_ldo_en = <&expander_gpios 13 0>; - }; -}; - -&pm6150l_gpios { - pwm_out_gpio6 { - pwm_out_gpio6_active: pwm_out_gpio6_active { - pins = "gpio6"; - function = "func1"; - bias-disable; - power-source = <0>; - output-low; - qcom,drive-strength = <3>; - drive-push-pull; - }; - }; -}; - -/* pinctrl */ -&tlmm { - /* GPIO EXPANDER */ - i2c_23_pinctrl: i2c_23_pinctrl { - mux { - pins = "gpio46", /* EXPANDER_I2C_SDA_1P8 */ - "gpio47"; /* EXPANDER_I2C_SCL_1P8 */ - function = "gpio"; - }; - config { - pins = "gpio46", /* EXPANDER_I2C_SDA_1P8 */ - "gpio47"; /* EXPANDER_I2C_SCL_1P8 */ - drive-strength = <2>; - bias-disable; - }; - }; - - expander_reset_active: expander_reset_active { - mux { - pins = "gpio65"; - function = "gpio"; - }; - config { - pins = "gpio65"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - output-high; - }; - }; - - hall_up_active: hall_up_active { - mux { - pins = "gpio89"; - function = "gpio"; - }; - config { - pins = "gpio89"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - }; - }; - - hall_down_active: hall_down_active { - mux { - pins = "gpio90"; - function = "gpio"; - }; - config { - pins = "gpio90"; - drive-strength = <2>; /* 16 mA */ - bias-disable; - }; - }; - - /* SE 4 pin mappings for AFC*/ - qupv3_se4_afc_pins: qupv3_se4_afc_pins { - qupv3_se4_afc_active: qupv3_se4_afc_active { - mux { - pins = "gpio51"; - function = "qup00"; - }; - - config { - pins = "gpio51"; - drive-strength = <2>; - bias-disable; - }; - }; - - qupv3_se4_afc_sleep: qupv3_se4_afc_sleep { - mux { - pins = "gpio51"; - function = "gpio"; - }; - - config { - pins = "gpio51"; - drive-strength = <2>; - bias-pull-up; - }; - }; - }; - - motor_default_pins: motor_default_pins { - mux { - pins = "gpio16"; - function = "gpio"; - }; - config { - pins = "gpio16"; - bias-disable; /* No PULL */ - input-enable; - }; - }; -}; - -&soc { - usb_noti: usb-notifier { - compatible = "samsung,usb-notifier"; - qcom,disable_control_en = <1>; - qcom,unsupport_host_en = <0>; - }; -}; - -&usb0 { - dwc3@a600000 { - usb-phy = <&qusb_phy0>, <&usb_nop_phy>; - maximum-speed = "high-speed"; - }; -}; - -&usb_qmp_dp_phy { - status = "disabled"; -}; - -&qusb_phy0 { - qcom,qusb-phy-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x1c 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x77 0x240 /* TUNE1 */ - 0x29 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x02 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,qusb-phy-host-init-seq = - /* */ - <0x23 0x210 /* PWR_CTRL1 */ - 0x03 0x04 /* PLL_ANALOG_CONTROLS_TWO */ - 0x7c 0x18c /* PLL_CLOCK_INVERTERS */ - 0x80 0x2c /* PLL_CMODE */ - 0x0a 0x184 /* PLL_LOCK_DELAY */ - 0x19 0xb4 /* PLL_DIGITAL_TIMERS_TWO */ - 0x40 0x194 /* PLL_BIAS_CONTROL_1 */ - 0x20 0x198 /* PLL_BIAS_CONTROL_2 */ - 0x21 0x214 /* PWR_CTRL2 */ - 0x08 0x220 /* IMP_CTRL1 */ - 0x58 0x224 /* IMP_CTRL2 */ - 0x45 0x240 /* TUNE1 */ - 0x29 0x244 /* TUNE2 */ - 0xca 0x248 /* TUNE3 */ - 0x04 0x24c /* TUNE4 */ - 0x03 0x250 /* TUNE5 */ - 0x30 0x23c /* CHG_CTRL2 */ - 0x22 0x210>; /* PWR_CTRL1 */ - - qcom,diff_tune_host = <(0)>; /* efuse(0x3) + 0 = 7 for tune high value */ - qcom,diff_tune_device = <(4)>; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r00.dts deleted file mode 100755 index d3794969b999..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r00.dts +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-eur-r00.dtsi" -#include "sm7150-sec-r1q-eur-pinctrl-r00.dtsi" -#include "sm7150-sec-r1q-display-r00.dtsi" -#include "sm7150-sec-r1q-eif-r00.dtsi" -#include "sm7150-sec-r1q-battery-r02.dtsi" -#include "sm7150-sec-r1q-fingerprint_00.dtsi" -#include "sm7150-sec-r1q-nfc-r00.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung R1Q PROJECT Rev0.0 / BringUp (board-id,00)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - /* FIXME: This board is deprecated - qcom,board-id = <34 0>; - */ - qcom,board-id = <34 1000>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,project-name = "a7_2018"; - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r01.dts deleted file mode 100755 index 832e3bb9a259..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r01.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-eur-r01.dtsi" -#include "sm7150-sec-r1q-eur-pinctrl-r01.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r00.dtsi" -#include "sm7150-sec-r1q-battery-r02.dtsi" -#include "sm7150-sec-r1q-fingerprint_00.dtsi" -#include "sm7150-sec-r1q-nfc-r00.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung R1Q PROJECT Rev0.0A / BringUp_1 (board-id,01)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r02.dts deleted file mode 100755 index 096c3d716e82..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r02.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-eur-r02.dtsi" -#include "sm7150-sec-r1q-eur-pinctrl-r02.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r01.dtsi" -#include "sm7150-sec-r1q-battery-r02.dtsi" -#include "sm7150-sec-r1q-fingerprint_00.dtsi" -#include "sm7150-sec-r1q-nfc-r02.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung R1Q PROJECT Rev0.1 / DV1 (board-id,02)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r03.dts deleted file mode 100755 index b82d67dd3ad2..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r03.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-eur-r03.dtsi" -#include "sm7150-sec-r1q-eur-pinctrl-r03.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r01.dtsi" -#include "sm7150-sec-r1q-battery-r03.dtsi" -#include "sm7150-sec-r1q-fingerprint_00.dtsi" -#include "sm7150-sec-r1q-nfc-r02.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung R1Q PROJECT Rev0.1A / DV1_AUDIO (board-id,03)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r04.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r04.dts deleted file mode 100755 index 530bf6464fe2..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r04.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-eur-r04.dtsi" -#include "sm7150-sec-r1q-eur-pinctrl-r04.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r04.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-nfc-r02.dtsi" -#include "sm7150-camera-sensor-r1q-r02.dtsi" - -/ { - model = "Samsung R1Q PROJECT Rev0.2 / DV2 (board-id,04)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 4>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r05.dts deleted file mode 100755 index 49f068832de7..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r05.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-eur-r05.dtsi" -#include "sm7150-sec-r1q-eur-pinctrl-r05.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r05.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-nfc-r02.dtsi" -#include "sm7150-camera-sensor-r1q-r02.dtsi" - -/ { - model = "Samsung R1Q PROJECT Rev0.3 / DVR (board-id,05)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 5>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r06.dts deleted file mode 100755 index 08a6eed196f6..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r06.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-eur-r06.dtsi" -#include "sm7150-sec-r1q-eur-pinctrl-r06.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r05.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-nfc-r02.dtsi" -#include "sm7150-camera-sensor-r1q-r07.dtsi" - -/ { - model = "Samsung R1Q PROJECT Rev0.4 / PV1 (AF/EEPROM Changed) (board-id,06)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 6>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&expander_gpios 1 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r07.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r07.dts deleted file mode 100755 index 7fa461eac8db..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r07.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-eur-r07.dtsi" -#include "sm7150-sec-r1q-eur-pinctrl-r07.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r05.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-nfc-r02.dtsi" -#include "sm7150-camera-sensor-r1q-r07.dtsi" - -/ { - model = "Samsung R1Q PROJECT Rev0.4 / PV1 (AF/EEPROM Changed) (board-id,07)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 7>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&expander_gpios 1 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r08.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r08.dts deleted file mode 100755 index 2d5d4c2c4a35..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-overlay-r08.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-eur-r08.dtsi" -#include "sm7150-sec-r1q-eur-pinctrl-r08.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r05.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-nfc-r02.dtsi" -#include "sm7150-camera-sensor-r1q-r07.dtsi" - -/ { - model = "Samsung R1Q PROJECT Rev0.5 / PV2 (board-id,08)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 8>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&expander_gpios 1 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r00.dtsi deleted file mode 100755 index 5ccc3bdc28d3..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r00.dtsi +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-pinctrl-common.dtsi" - -&soc { - -}; - -&tlmm { - muic_int_active: muic_int_active { - mux { - pins = "gpio96"; - function = "gpio"; - }; - config { - pins = "gpio96"; - drive-strength = <2>; - bias-disable; - - }; - }; - - ccic_int_active: ccic_int_active { - mux { - pins = "gpio104"; - function = "gpio"; - }; - config { - pins = "gpio104"; - drive-strength = <2>; - bias-disable; - - }; - }; - - cam_sensor_rear1_active: cam_sensor_rear1_active { - /* RESET REAR1 */ - mux { - pins = "gpio52"; - function = "gpio"; - }; - config { - pins = "gpio52"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear1_suspend: cam_sensor_rear1_suspend { - /* REAR1 RESET */ - mux { - pins = "gpio52"; - function = "gpio"; - }; - config { - pins = "gpio52"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear2_active: cam_sensor_rear2_active { - /* RESET REAR2 */ - mux { - pins = "gpio55"; - function = "gpio"; - }; - config { - pins = "gpio55"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear2_suspend: cam_sensor_rear2_suspend { - /* REAR2 RESET */ - mux { - pins = "gpio55"; - function = "gpio"; - }; - config { - pins = "gpio55"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r01.dtsi deleted file mode 100755 index 4aa1ec97c69f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-pinctrl-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r02.dtsi deleted file mode 100755 index 931ebde04fd2..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r02.dtsi +++ /dev/null @@ -1,98 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-pinctrl-common.dtsi" - -&soc { - -}; - -&tlmm { - muic_int_active: muic_int_active { - mux { - pins = "gpio96"; - function = "gpio"; - }; - config { - pins = "gpio96"; - drive-strength = <2>; - bias-disable; - - }; - }; - - ccic_int_active: ccic_int_active { - mux { - pins = "gpio104"; - function = "gpio"; - }; - config { - pins = "gpio104"; - drive-strength = <2>; - bias-disable; - - }; - }; - - cam_sensor_rear1_active: cam_sensor_rear1_active { - /* RESET REAR1 */ - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear1_suspend: cam_sensor_rear1_suspend { - /* REAR1 RESET */ - mux { - pins = "gpio33"; - function = "gpio"; - }; - config { - pins = "gpio33"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear2_active: cam_sensor_rear2_active { - /* RESET REAR2 */ - mux { - pins = "gpio67"; - function = "gpio"; - }; - config { - pins = "gpio67"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear2_suspend: cam_sensor_rear2_suspend { - /* REAR2 RESET */ - mux { - pins = "gpio67"; - function = "gpio"; - }; - config { - pins = "gpio67"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; -}; - diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r03.dtsi deleted file mode 100755 index 3df674304e6a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r04.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r04.dtsi deleted file mode 100755 index 66b9692bf453..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r04.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-pinctrl-r03.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r05.dtsi deleted file mode 100755 index abc23d0a4986..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r05.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-pinctrl-r04.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r06.dtsi deleted file mode 100755 index c9ac67ea8874..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r06.dtsi +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-pinctrl-r05.dtsi" - -&pm6150_gpios { - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r07.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r07.dtsi deleted file mode 100755 index 818ce71f180e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r07.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r08.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r08.dtsi deleted file mode 100755 index 7b0913b67898..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-pinctrl-r08.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-pinctrl-r07.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r00.dtsi deleted file mode 100755 index 4fa60feea019..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r00.dtsi +++ /dev/null @@ -1,14 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-common.dtsi" -// #include "sm6150-sec-a70q-input-common.dtsi" diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r01.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r01.dtsi deleted file mode 100755 index 8b40df99a13b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r01.dtsi +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-r00.dtsi" - -&soc { - pm6150l_rid_adc { - status = "okay"; - compatible = "pm6150l_rid_adc"; - - interrupt-parent = <&spmi_bus>; - pm6150l_rid_adc,irq-gpio = <&pm6150l_gpios 9 GPIO_ACTIVE_LOW>; - jigon-gpios = <&pm6150l_gpios 11 GPIO_ACTIVE_LOW>; - - pinctrl-names = "default"; - pinctrl-0 = <&rid_adc_irq_default &gpio11_dig_out_default>; - - io-channels = <&pm6150l_vadc ADC_GPIO4>; - io-channel-names = "rid_adc_channel"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r02.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r02.dtsi deleted file mode 100755 index 02351f85a1df..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r03.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r03.dtsi deleted file mode 100755 index a928e6eeecd0..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r04.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r04.dtsi deleted file mode 100755 index cd5294fe9433..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r04.dtsi +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-r03.dtsi" - -&soc { - sec_thermistor@0 { - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - }; - - /* S2MPB03 Camera PMIC */ - i2c@26 { - cell-index = <26>; - compatible = "i2c-gpio"; - gpios = <&tlmm 4 0 /* sda */ - &tlmm 5 0 /* scl */ - >; - }; -}; - -&pm6150l_vadc { - sdm_therm { - reg = ; - }; -}; - -&tlmm { - s2mpb03_i2c_pins { - s2mpb03_i2c_active { - mux { - pins = "gpio4", "gpio5"; - function = "gpio"; - }; - config { - pins = "gpio4", "gpio5"; - drive-strength = <2>; - bias-disable; - }; - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r05.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r05.dtsi deleted file mode 100755 index 7abdbf94a36b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r05.dtsi +++ /dev/null @@ -1,13 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-r04.dtsi" diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r06.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r06.dtsi deleted file mode 100755 index 8df82fb1e72e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r06.dtsi +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-r05.dtsi" - -&pm6150_charger { - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - - water-det-enable; - #sub-short-detect-enable; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r07.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r07.dtsi deleted file mode 100755 index 068a37915c9c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r07.dtsi +++ /dev/null @@ -1,13 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-r06.dtsi" diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r08.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r08.dtsi deleted file mode 100755 index ea4aa76d3c88..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-eur-r08.dtsi +++ /dev/null @@ -1,13 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-eur-r07.dtsi" diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-fingerprint_00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-fingerprint_00.dtsi deleted file mode 100755 index 5a4ad3d33bbc..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-fingerprint_00.dtsi +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - qupv3_se6_spi: spi@0xa80000 { - status = "okay"; - - etspi-spi@0 { - compatible = "etspi,et7xx"; - reg = <0>; - spi-max-frequency = <50000000>; - etspi-min_cpufreq_limit = <2169600>; - gpio-controller; - #gpio-cells = <2>; - - etspi-sleepPin = <&expander_gpios 15 0>; - etspi-ldoPin = <&expander_gpios 14 0>; - etspi-chipid = "ET711"; - etspi-modelinfo = "A805"; - etspi-position = "14.46,0.00,7.30,7.30,14.80,14.80,12.00,12.00,5.00"; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-fingerprint_04.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-fingerprint_04.dtsi deleted file mode 100755 index c57e65e65374..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-fingerprint_04.dtsi +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&pm6150l_l6 { - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - qcom,init-voltage = <3300000>; -}; - -&soc { - qupv3_se6_spi: spi@0xa80000 { - status = "okay"; - - etspi-spi@0 { - compatible = "etspi,et7xx"; - reg = <0>; - spi-max-frequency = <50000000>; - etspi-min_cpufreq_limit = <2169600>; - gpio-controller; - #gpio-cells = <2>; - - etspi-sleepPin = <&expander_gpios 15 0>; - etspi-chipid = "ET713"; - etspi-modelinfo = "A805"; - etspi-regulator = "pm6150l_l6"; - etspi-position = "14.46,0.00,7.30,7.30,14.80,14.80,12.00,12.00,5.00"; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-input-common.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-input-common.dtsi deleted file mode 100755 index 37e53197a5f0..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-input-common.dtsi +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include - - - -&pm6150_l18 { - regulator-min-microvolt = <3000000>; - regulator-max-microvolt = <3000000>; -}; - -&qupv3_se7_i2c { - status = "ok"; - touchscreen@50 { - compatible = "imagis,ist40xx-ts"; - reg = <0x50>; - imagis,irq-gpio = <&tlmm 9 0>; - imagis,regulator_avdd = "pm6150_l18"; - imagis,fw-bin = <1>; - imagis,octa-hw = <1>; - imagis,area-size = <63 126 60>; /* indicator: 24dp~63px navigator:48dp~126px edge:60px | dpi:420*/ - imagis,ic-version = "ist40xx"; - imagis,project-name = "r1"; - imagis,tclm_level = <2>; - imagis,afe_base = <0x0313>; - imagis,factory_item_version = <1>; - enable_fpcb_noise_test; - enable_settings_aot; - support_fod; - status = "ok"; - }; -}; - -/delete-node/&key_vol_up_default; -&pm6150l_gpios { - key_vol_up { - key_vol_up_default: key_vol_up_default { - pins = "gpio2"; - function = "normal"; - input-enable; - bias-pull-up; - power-source = <0>; - }; - }; -}; - -&soc { - /delete-node/gpio_keys; - gpio_keys { - status = "ok"; - compatible = "gpio-keys"; - input-name = "gpio-keys"; - - pinctrl-names = "default"; - pinctrl-0 = <&key_vol_up_default>; - - vol_up { - label = "volume_up"; - gpios = <&pm6150l_gpios 2 0x1>; - linux,input-type = <1>; - linux,code = ; - debounce-interval = <15>; - }; - }; - - ss_touch { - compatible = "samsung,ss_touch"; - ss_touch,numbers = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-nfc-r00.dtsi deleted file mode 100755 index 9378effa778a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-nfc-r00.dtsi +++ /dev/null @@ -1,71 +0,0 @@ - -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi2 = &qupv3_se1_spi; - }; -}; -*/ - -&tlmm { - nfc_qupv3_se2_i2c_sleep: nfc_qupv3_se2_i2c_sleep { - mux { - pins = "gpio34", "gpio35"; - function = "gpio"; - }; - - config { - pins = "gpio34", "gpio35"; - drive-strength = <2>; - bias-disable; - }; - }; - - nfc_clk_req_default: nfc_clk_req_default { - /* active state */ - mux { - /* GPIO 31: NFC CLOCK REQUEST */ - pins = "gpio31"; - function = "gpio"; - }; - - config { - pins = "gpio31"; - drive-strength = <2>; /* 2 MA */ - bias-disable; - }; - }; -}; - -/* gpio34 and gpio35 are used for nfc i2c */ -&qupv3_se2_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se2_i2c_sleep>; - - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <37 0>; - pn547,irq-gpio = <&tlmm 37 0>; - pn547,ven-gpio = <&tlmm 12 0>; - pn547,firm-gpio = <&tlmm 36 0>; - pn547,clk_req-gpio = <&tlmm 31 0>; /* BBCLK3 is controled by gpio 31 */ - pn547,pwr_req = <&tlmm 94 0>; - pn547,pvdd-gpio = <&expander_gpios 9 0>; - pn547,clk_req_wake; - pinctrl-names = "default"; - pinctrl-0 = <&nfc_clk_req_default>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r00.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r00.dts deleted file mode 100755 index 9c671e893ff1..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r00.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-kor-r00.dtsi" -#include "sm7150-sec-r1q-kor-pinctrl-r00.dtsi" -#include "sm7150-sec-r1q-display-r00.dtsi" -#include "sm7150-sec-r1q-eif-r00.dtsi" -#include "sm7150-sec-r1q-battery-r02.dtsi" -#include "sm7150-sec-r1q-fingerprint_00.dtsi" -#include "sm7150-sec-r1q-nfc-r00.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung A90Q PROJECT Rev0.0 / BringUp (board-id,00)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 0>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,project-name = "a7_2018"; - imagis,bringup = <1>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r01.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r01.dts deleted file mode 100755 index 21e893d6ef7e..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r01.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-kor-r01.dtsi" -#include "sm7150-sec-r1q-kor-pinctrl-r01.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r00.dtsi" -#include "sm7150-sec-r1q-battery-r02.dtsi" -#include "sm7150-sec-r1q-fingerprint_00.dtsi" -#include "sm7150-sec-r1q-nfc-r00.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung R1Q KOR SINGLE PROJECT Rev0.0A / BringUp_1 (board-id,01)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 1>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r02.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r02.dts deleted file mode 100755 index e557be348235..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r02.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-kor-r02.dtsi" -#include "sm7150-sec-r1q-kor-pinctrl-r02.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r01.dtsi" -#include "sm7150-sec-r1q-battery-r02.dtsi" -#include "sm7150-sec-r1q-fingerprint_00.dtsi" -#include "sm7150-sec-r1q-kor-nfc-r00.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung R1Q KOR SINGLE PROJECT Rev0.1 / DV1 (board-id,02)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 2>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r03.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r03.dts deleted file mode 100755 index 8cf118481b45..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r03.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-kor-r03.dtsi" -#include "sm7150-sec-r1q-kor-pinctrl-r03.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r01.dtsi" -#include "sm7150-sec-r1q-battery-r03.dtsi" -#include "sm7150-sec-r1q-fingerprint_00.dtsi" -#include "sm7150-sec-r1q-kor-nfc-r00.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung R1Q KOR SINGLE PROJECT Rev0.1 / DV1_AUDIO (board-id,03)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 3>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r04.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r04.dts deleted file mode 100755 index f60b425d2762..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r04.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-kor-r04.dtsi" -#include "sm7150-sec-r1q-kor-pinctrl-r04.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r04.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-kor-nfc-r00.dtsi" -#include "sm7150-camera-sensor-r1q-r02.dtsi" - -/ { - model = "Samsung R1Q KOR SINGLE PROJECT Rev0.2 / DV2 (board-id,04)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 4>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r05.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r05.dts deleted file mode 100755 index 7e49e26b95e5..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r05.dts +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-kor-r05.dtsi" -#include "sm7150-sec-r1q-kor-pinctrl-r05.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r04.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-kor-nfc-r00.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung R1Q KOR SINGLE PROJECT Rev0.3 / DVR (board-id,05)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 5>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,bringup = <1>; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r06.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r06.dts deleted file mode 100755 index d9fbc9d6ff37..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r06.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-kor-r06.dtsi" -#include "sm7150-sec-r1q-kor-pinctrl-r06.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r04.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-kor-nfc-r00.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung R1Q KOR SINGLE PROJECT Rev0.4 / PV1 (board-id,06)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 6>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&expander_gpios 1 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r07.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r07.dts deleted file mode 100755 index 62548762644a..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r07.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-kor-r07.dtsi" -#include "sm7150-sec-r1q-kor-pinctrl-r07.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r04.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-kor-nfc-r00.dtsi" -#include "sm7150-camera-sensor-r1q-r00.dtsi" - -/ { - model = "Samsung R1Q KOR SINGLE PROJECT Rev0.4 / PV1 (AF/EEPROM Changed) (board-id,07)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 7>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&expander_gpios 1 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r08.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r08.dts deleted file mode 100755 index d93cc1eb002d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r08.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-kor-r08.dtsi" -#include "sm7150-sec-r1q-kor-pinctrl-r08.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r05.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-kor-nfc-r00.dtsi" -#include "sm7150-camera-sensor-r1q-r07.dtsi" - -/ { - model = "Samsung R1Q KOR SINGLE PROJECT Rev0.5 / PV2 (board-id,08)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 8>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&expander_gpios 1 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r09.dts b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r09.dts deleted file mode 100755 index 05118c89c235..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-overlay-r09.dts +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/dts-v1/; -/plugin/; - -#include -#include - -#include "common/sm7150-sec-common.dtsi" - -#include "sm7150-sec-r1q-pm-common.dtsi" - -#include "sm7150-sec-r1q-kor-r09.dtsi" -#include "sm7150-sec-r1q-kor-pinctrl-r09.dtsi" -#include "sm7150-sec-r1q-display-r01.dtsi" -#include "sm7150-sec-r1q-eif-r05.dtsi" -#include "sm7150-sec-r1q-battery-common.dtsi" -#include "sm7150-sec-r1q-fingerprint_04.dtsi" -#include "sm7150-sec-r1q-kor-nfc-r00.dtsi" -#include "sm7150-camera-sensor-r1q-r07.dtsi" - -/ { - model = "Samsung R1Q KOR SINGLE PROJECT Rev0.5 / PV2 (board-id,08)"; - compatible = "qcom,sdmmagpie-idp", "qcom,sdmmagpie", "qcom,idp"; - qcom,msm-id = <365 0x0>; - qcom,board-id = <34 8>; -}; - -&qupv3_se7_i2c { - touchscreen@50 { - imagis,power-gpioen = <1>; - imagis,power-gpio = <&expander_gpios 1 0>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r00.dtsi deleted file mode 100755 index 5ccc3bdc28d3..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r00.dtsi +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-pinctrl-common.dtsi" - -&soc { - -}; - -&tlmm { - muic_int_active: muic_int_active { - mux { - pins = "gpio96"; - function = "gpio"; - }; - config { - pins = "gpio96"; - drive-strength = <2>; - bias-disable; - - }; - }; - - ccic_int_active: ccic_int_active { - mux { - pins = "gpio104"; - function = "gpio"; - }; - config { - pins = "gpio104"; - drive-strength = <2>; - bias-disable; - - }; - }; - - cam_sensor_rear1_active: cam_sensor_rear1_active { - /* RESET REAR1 */ - mux { - pins = "gpio52"; - function = "gpio"; - }; - config { - pins = "gpio52"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear1_suspend: cam_sensor_rear1_suspend { - /* REAR1 RESET */ - mux { - pins = "gpio52"; - function = "gpio"; - }; - config { - pins = "gpio52"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear2_active: cam_sensor_rear2_active { - /* RESET REAR2 */ - mux { - pins = "gpio55"; - function = "gpio"; - }; - config { - pins = "gpio55"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - cam_sensor_rear2_suspend: cam_sensor_rear2_suspend { - /* REAR2 RESET */ - mux { - pins = "gpio55"; - function = "gpio"; - }; - config { - pins = "gpio55"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r01.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r01.dtsi deleted file mode 100755 index a7348680f175..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r01.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-pinctrl-r00.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r02.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r02.dtsi deleted file mode 100755 index 9d866eaa588b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-pinctrl-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r03.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r03.dtsi deleted file mode 100755 index 526f07349850..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-pinctrl-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r04.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r04.dtsi deleted file mode 100755 index d259fb71fddb..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r04.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-pinctrl-r03.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r05.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r05.dtsi deleted file mode 100755 index 1e0f8ba3a381..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r05.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-pinctrl-r04.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r06.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r06.dtsi deleted file mode 100755 index 791aad2ef202..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r06.dtsi +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-pinctrl-r05.dtsi" - -&pm6150_gpios { - hiccup { - hiccup_default: hiccup_default { - pins = "gpio4"; - function = "normal"; - output-low; - bias-disable; - power-source = <0>; - }; - }; -}; - - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r07.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r07.dtsi deleted file mode 100755 index fd66d1b08b7c..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r07.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-pinctrl-r06.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r08.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r08.dtsi deleted file mode 100755 index 1164ed44776d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r08.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-pinctrl-r07.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r09.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r09.dtsi deleted file mode 100755 index 409763ac4bc3..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-pinctrl-r09.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-pinctrl-r08.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r00.dtsi deleted file mode 100755 index 4fa60feea019..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r00.dtsi +++ /dev/null @@ -1,14 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-common.dtsi" -// #include "sm6150-sec-a70q-input-common.dtsi" diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r01.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r01.dtsi deleted file mode 100755 index fe7f66dd1a50..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r01.dtsi +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-r00.dtsi" - -&soc { - pm6150l_rid_adc { - status = "okay"; - compatible = "pm6150l_rid_adc"; - - interrupt-parent = <&spmi_bus>; - pm6150l_rid_adc,irq-gpio = <&pm6150l_gpios 9 GPIO_ACTIVE_LOW>; - jigon-gpios = <&pm6150l_gpios 11 GPIO_ACTIVE_LOW>; - - pinctrl-names = "default"; - pinctrl-0 = <&rid_adc_irq_default &gpio11_dig_out_default>; - - io-channels = <&pm6150l_vadc ADC_GPIO4>; - io-channel-names = "rid_adc_channel"; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r02.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r02.dtsi deleted file mode 100755 index b25299887185..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r02.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-r01.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r03.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r03.dtsi deleted file mode 100755 index fb19badc7600..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r03.dtsi +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-r02.dtsi" - -&soc { - -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r04.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r04.dtsi deleted file mode 100755 index 1ac29c560040..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r04.dtsi +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-r03.dtsi" - -&soc { - sec_thermistor@0 { - io-channels = <&pm6150l_vadc ADC_AMUX_THM3_PU2>; - }; - - /* S2MPB03 Camera PMIC */ - i2c@26 { - cell-index = <26>; - compatible = "i2c-gpio"; - gpios = <&tlmm 4 0 /* sda */ - &tlmm 5 0 /* scl */ - >; - }; -}; - -&pm6150l_vadc { - sdm_therm { - reg = ; - }; -}; - -&tlmm { - s2mpb03_i2c_pins { - s2mpb03_i2c_active { - mux { - pins = "gpio4", "gpio5"; - function = "gpio"; - }; - config { - pins = "gpio4", "gpio5"; - drive-strength = <2>; - bias-disable; - }; - }; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r05.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r05.dtsi deleted file mode 100755 index 4e4d0d35befb..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r05.dtsi +++ /dev/null @@ -1,13 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-r04.dtsi" diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r06.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r06.dtsi deleted file mode 100755 index c16337992e0d..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r06.dtsi +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-r05.dtsi" - -&pm6150_charger { - - /* Adding for SBUx short & water detection */ - pinctrl-names = "default"; - pinctrl-0 = <&hiccup_default>; - hiccup-gpio = <&pm6150_gpios 4 GPIO_ACTIVE_LOW>; - - water-det-enable; - #sub-short-detect-enable; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r07.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r07.dtsi deleted file mode 100755 index 69dd3e5a822f..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r07.dtsi +++ /dev/null @@ -1,13 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-r06.dtsi" diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r08.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r08.dtsi deleted file mode 100755 index 94a09c54b275..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r08.dtsi +++ /dev/null @@ -1,13 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-r07.dtsi" diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r09.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r09.dtsi deleted file mode 100755 index 3b20830e2036..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-kor-r09.dtsi +++ /dev/null @@ -1,13 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-kor-r08.dtsi" diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-mst-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-mst-r00.dtsi deleted file mode 100755 index 5fd6354f9881..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-mst-r00.dtsi +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2013, Samsung Electronics Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -&soc { - sec-mst { - compatible = "sec-mst"; - //sec-mst,mst-pwr-gpio = <&expander_gpios 17 0>; - sec-mst,mst-data-gpio = <&tlmm 83 0>; - sec-mst,mst-en-gpio = <&tlmm 84 0>; - sec-mst,mst-support-gpio = <&tlmm 30 0>; - - //pinctrl-names = "mst_active"; - //pinctrl-0 = <&mst_data_init &mst_en_init>; - }; -/* - tlmm: pinctrl@03000000 { - mst_data_init: mst_data_init { - mux { - pins = "gpio84"; - function = "gpio"; - }; - config { - pins = "gpio84"; - drive-strength = <16>; - bias-pull-down; - output_low; - }; - }; - mst_en_init: mst_en_init { - mux { - pins = "gpio83"; - function = "gpio"; - }; - config { - pins = "gpio83"; - drive-strength = <16>; - bias-pull-down; - output_low; - }; - }; - }; -*/ -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-nfc-r00.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-nfc-r00.dtsi deleted file mode 100755 index b1688a7ff7ba..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-nfc-r00.dtsi +++ /dev/null @@ -1,86 +0,0 @@ - -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi2 = &qupv3_se1_spi; - }; -}; -*/ - -&tlmm { - ese_qupv3_se1_spi_sleep: qupv3_se1_spi_sleep { - mux { - pins = "gpio0", "gpio1", "gpio2", - "gpio3"; - function = "gpio"; - }; - - config { - pins = "gpio0", "gpio1", "gpio2", - "gpio3"; - drive-strength = <6>; - bias-pull-down; - output-low; - }; - }; - - nfc_qupv3_se2_i2c_sleep: nfc_qupv3_se2_i2c_sleep { - mux { - pins = "gpio34", "gpio35"; - function = "gpio"; - }; - - config { - pins = "gpio34", "gpio35"; - drive-strength = <2>; - bias-disable; - }; - }; -}; - -/* gpio34 and gpio35 are used for nfc i2c */ -&qupv3_se2_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se2_i2c_sleep>; - - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <37 0>; - pn547,irq-gpio = <&tlmm 37 0>; - pn547,ven-gpio = <&tlmm 12 0>; - pn547,firm-gpio = <&tlmm 36 0>; - pn547,clk_req-gpio = <&tlmm 31 0>; /* BBCLK3 is controled by gpio 31 */ - pn547,pwr_req = <&tlmm 94 0>; - pn547,pvdd-gpio = <&tlmm 72 0>; - pn547,clk_req_wake; - }; -}; - - -/* gpio 0~3 are used for ese spi */ -&qupv3_se1_spi { - status = "okay"; - spi-max-frequency = <19200000>; - pinctrl-1 = <&ese_qupv3_se1_spi_sleep>; - - ese_spi@0 { - compatible = "p61"; - reg = <0>; - spi-max-frequency = <16000000>; - p61-ap_vendor = "qualcomm"; - p61-spi_node = <&qupv3_se1_spi>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-nfc-r02.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-nfc-r02.dtsi deleted file mode 100755 index 53fcc2b5bcde..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-nfc-r02.dtsi +++ /dev/null @@ -1,103 +0,0 @@ - -/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -/* -/ { - aliases { - spi2 = &qupv3_se1_spi; - }; -}; -*/ - -&tlmm { - ese_qupv3_se1_spi_sleep: qupv3_se1_spi_sleep { - mux { - pins = "gpio0", "gpio1", "gpio2", - "gpio3"; - function = "gpio"; - }; - - config { - pins = "gpio0", "gpio1", "gpio2", - "gpio3"; - drive-strength = <6>; - bias-pull-down; - output-low; - }; - }; - - nfc_qupv3_se2_i2c_sleep: nfc_qupv3_se2_i2c_sleep { - mux { - pins = "gpio34", "gpio35"; - function = "gpio"; - }; - - config { - pins = "gpio34", "gpio35"; - drive-strength = <2>; - bias-disable; - }; - }; - - nfc_clk_req_default: nfc_clk_req_default { - /* active state */ - mux { - /* GPIO 31: NFC CLOCK REQUEST */ - pins = "gpio31"; - function = "gpio"; - }; - - config { - pins = "gpio31"; - drive-strength = <2>; /* 2 MA */ - bias-disable; - }; - }; -}; - -/* gpio34 and gpio35 are used for nfc i2c */ -&qupv3_se2_i2c { - status = "okay"; - pinctrl-1 = <&nfc_qupv3_se2_i2c_sleep>; - - pn547@2B { - compatible = "pn547"; - reg = <0x2B>; - interrupt-parent = <&tlmm>; - interrupts = <37 0>; - pn547,irq-gpio = <&tlmm 37 0>; - pn547,ven-gpio = <&tlmm 12 0>; - pn547,firm-gpio = <&tlmm 36 0>; - pn547,clk_req-gpio = <&tlmm 31 0>; /* BBCLK3 is controled by gpio 31 */ - pn547,pwr_req = <&tlmm 94 0>; - pn547,pvdd-gpio = <&expander_gpios 9 0>; - pn547,clk_req_wake; - pinctrl-names = "default"; - pinctrl-0 = <&nfc_clk_req_default>; - }; -}; - - -/* gpio 0~3 are used for ese spi */ -&qupv3_se1_spi { - status = "okay"; - spi-max-frequency = <19200000>; - pinctrl-1 = <&ese_qupv3_se1_spi_sleep>; - - ese_spi@0 { - compatible = "p61"; - reg = <0>; - spi-max-frequency = <16000000>; - p61-ap_vendor = "qualcomm"; - p61-spi_node = <&qupv3_se1_spi>; - }; -}; diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-pinctrl-common.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-pinctrl-common.dtsi deleted file mode 100755 index 58ca9911e51b..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-pinctrl-common.dtsi +++ /dev/null @@ -1,235 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "sm7150-sec-r1q-audio-pinctrl.dtsi" - -&tlmm { - grip_i2c { - grip_i2c_active: grip_i2c_active { - grip_i2c_active { - pins = "gpio25", "gpio26"; - bias-disable; - }; - }; - grip_i2c_suspend: grip_i2c_suspend { - grip_i2c_suspend { - pins = "gpio25", "gpio26"; - bias-disable; - }; - }; - }; - - hall_default: hall_default { - mux { - pins = "gpio91"; - function = "gpio"; - }; - config { - pins = "gpio91"; - drive-strength = <2>; - bias-disable; - }; - }; - - certify_hall_default: certify_hall_default { - mux { - pins = "gpio88"; - function = "gpio"; - }; - config { - pins = "gpio88"; - drive-strength = <2>; - bias-disable; - }; - }; - - sliding_up_hall_default: sliding_up_hall_default { - mux { - pins = "gpio89"; - function = "gpio"; - }; - config { - pins = "gpio89"; - drive-strength = <2>; - bias-disable; - }; - }; - - sliding_down_hall_default: sliding_down_hall_default { - mux { - pins = "gpio93"; - function = "gpio"; - }; - config { - pins = "gpio93"; - drive-strength = <2>; - bias-disable; - }; - }; - cam_sensor_mclk2_active: cam_sensor_mclk2_active { - /* MCLK2 */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - - config { - pins = "gpio15"; - bias-disable; /* No PULL */ - drive-strength = <8>; /* 8 MA */ - }; - }; - cam_sensor_mclk2_suspend: cam_sensor_mclk2_suspend { - /* MCLK2 */ - mux { - pins = "gpio15"; - function = "cam_mclk"; - }; - - config { - pins = "gpio15"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <8>; /* 8 MA */ - }; - }; - cam_sensor_mclk0_active: cam_sensor_mclk0_active { - /* TOF MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-disable; /* No PULL */ - drive-strength = <8>; /* 8 MA */ - }; - }; - - cam_sensor_mclk0_suspend: cam_sensor_mclk0_suspend { - /* TOF MCLK */ - mux { - pins = "gpio13"; - function = "cam_mclk"; - }; - config { - pins = "gpio13"; - bias-pull-down; /* No PULL */ - drive-strength = <8>; /* 8 MA */ - }; - }; - - cam_sensor_tof_active: cam_sensor_tof_active { - /* TOF reset */ - mux { - pins = "gpio23"; - function = "gpio"; - }; - config { - pins = "gpio23"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_tof_suspend: cam_sensor_tof_suspend { - /* TOF reset */ - mux { - pins = "gpio23"; - function = "gpio"; - }; - config { - pins = "gpio23"; - bias-pull-down; /* PULL DOWN */ - drive-strength = <2>; /* 2 MA */ - }; - }; - cam_sensor_tof_dcdc_active: cam_sensor_tof_dcdc_active { - /* TOF dcdc */ - mux { - pins = "gpio24"; - function = "gpio"; - }; - config { - pins = "gpio24"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - output-high; - }; - }; - cam_sensor_tof_dcdc_suspend: cam_sensor_tof_dcdc_suspend { - /* TOF dcdc */ - mux { - pins = "gpio24"; - function = "gpio"; - }; - config { - pins = "gpio24"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - led_enable: led_enable { - mux { - pins = "gpio22"; - function = "gpio"; - }; - - config { - pins = "gpio22"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - }; - }; - - led_disable: led_disable { - mux { - pins = "gpio22"; - function = "gpio"; - }; - - config { - pins = "gpio22"; - bias-disable; /* No PULL */ - drive-strength = <2>; /* 2 MA */ - output-low; - }; - }; - - detect_conn { - detect_conn_setting: detect_conn_setting { - config { - pins = "gpio66"; - drive-strength = <2>; - bias-disable; /* No PULL */ - input-enable; - }; - }; - }; -}; - -&pm6150l_gpios { - grip_int_active: grip_int_active { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; - grip_int_suspend: grip_int_suspend { - pins = "gpio5"; - function = "normal"; - power-source = <0>; - input-enable; - bias-disable; - }; -}; \ No newline at end of file diff --git a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-pm-common.dtsi b/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-pm-common.dtsi deleted file mode 100755 index 682aadfda492..000000000000 --- a/arch/arm64/boot/dts/samsung/sm7150-sec-r1q-pm-common.dtsi +++ /dev/null @@ -1,336 +0,0 @@ -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include - -&tlmm { - s2mpb03_i2c_pins { - s2mpb03_i2c_active: s2mpb03_i2c_active { - mux { - pins = "gpio53", "gpio54"; - function = "gpio"; - }; - config { - pins = "gpio53", "gpio54"; - drive-strength = <2>; - bias-disable; - }; - }; - }; -}; - -&soc { - /* AP Thermistor table */ - sec_thermistor@0 { - compatible = "samsung,sec-ap-thermistor"; - status = "okay"; - io-channels = <&pm6150l_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "ap_therm"; - adc_array = <1782 2170 2489 2972 3464 3876 4745 - 5619 6633 7099 7520 7972 8464 9020 9592 10167 10771 11357 11753 - 13464 15121 16708 18393 20103 21419 23021 24228 25379 26099>; - temp_array = <900 850 800 750 700 650 600 - 550 500 480 460 440 420 400 380 360 340 320 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* PA Thermistor table */ - sec_thermistor@1 { - compatible = "samsung,sec-pa-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM2_PU2>; - io-channel-names = "pa_therm"; - adc_array = <1914 2307 2649 3150 3680 4130 5000 - 5929 6853 7280 7731 8225 8693 9262 9914 10473 11055 11604 12445 - 14125 15966 17690 19306 20877 22060 23411 24563 25536 26339>; - temp_array = <900 850 800 750 700 650 600 - 550 500 480 460 440 420 400 380 360 340 320 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* WiFi Thermistor table */ - sec_thermistor@2 { - compatible = "samsung,sec-wf-thermistor"; - status = "okay"; - io-channels = <&pm6150_vadc ADC_AMUX_THM3_PU2>; - io-channel-names = "wf_therm"; - adc_array = <1910 2302 2639 3140 3668 4120 4983 - 5916 6835 7388 7240 8208 8675 9240 9891 10452 11032 11578 12433 - 14098 15940 17663 19280 20850 22029 23413 24540 25516 26317>; - temp_array = <900 850 800 750 700 650 600 - 550 500 480 460 440 420 400 380 360 340 320 300 - 250 200 150 100 50 0 (-50) (-100) (-150) (-200)>; - }; - - /* S2MPB03 Camera PMIC */ - i2c2: i2c@26 { - cell-index = <26>; - compatible = "i2c-gpio"; - gpios = <&tlmm 53 0 /* sda */ - &tlmm 54 0 /* scl */ - >; - #i2c-gpio,delay-us = <2>; - #address-cells = <1>; - #size-cells = <0>; - - pinctrl-names = "default"; - pinctrl-0 = <&s2mpb03_i2c_active>; - - /* S2MPB03 Camera PMIC */ - s2mpb03@56 { - compatible = "samsung,s2mpb03pmic"; - reg = <0x56>; - additional_reg_init; - - regulators { - s2mpb03_l1: s2mpb03-ldo1 { - regulator-name = "s2mpb03-ldo1"; - regulator-min-microvolt = <1100000>; - regulator-max-microvolt = <1100000>; - }; - - s2mpb03_l2: s2mpb03-ldo2 { - regulator-name = "s2mpb03-ldo2"; - regulator-min-microvolt = <1200000>; - regulator-max-microvolt = <1200000>; - }; - - s2mpb03_l3: s2mpb03-ldo3 { - regulator-name = "s2mpb03-ldo3"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - - s2mpb03_l4: s2mpb03-ldo4 { - regulator-name = "s2mpb03-ldo4"; - regulator-min-microvolt = <1050000>; - regulator-max-microvolt = <1050000>; - }; - - s2mpb03_l5: s2mpb03-ldo5 { - regulator-name = "s2mpb03-ldo5"; - regulator-min-microvolt = <2700000>; - regulator-max-microvolt = <2700000>; - }; - - s2mpb03_l6: s2mpb03-ldo6 { - regulator-name = "s2mpb03-ldo6"; - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - }; - - s2mpb03_l7: s2mpb03-ldo7 { - regulator-name = "s2mpb03-ldo7"; - regulator-min-microvolt = <2900000>; - regulator-max-microvolt = <2900000>; - }; - }; - }; - }; -}; - -&spmi_bus { - qcom,pm6150@0 { - qcom,power-on@800 { - interrupts = <0x0 0x8 0x0 IRQ_TYPE_NONE>, - <0x0 0x8 0x1 IRQ_TYPE_NONE>, - <0x0 0x8 0x4 IRQ_TYPE_NONE>, - <0x0 0x8 0x5 IRQ_TYPE_NONE>; - interrupt-names = "kpdpwr", "resin", - "resin-bark", "kpdpwr-resin-bark"; - qcom,s3-debounce = <128>; - - qcom,pon_1 { - qcom,support-reset = <0>; - }; - - qcom,pon_2 { - qcom,support-reset = <0>; - }; - - qcom,pon_3 { - qcom,pon-type = ; - qcom,support-reset = <1>; - qcom,pull-up = <1>; - qcom,s1-timer = <6720>; - qcom,s2-timer = <1000>; - qcom,s2-type = ; - qcom,use-bark; - }; - }; - }; - - qcom,pm6150l@5 { - flash_led: qcom,leds@d300 { - pm6150l_flash0: qcom,flash_0 { - label = "flash"; - qcom,led-name = "led:flash_0"; - qcom,max-current = <1500>; - qcom,default-led-trigger = "flash0_trigger"; - qcom,id = <0>; - qcom,current-ma = <1500>; - qcom,duration-ms = <1280>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - qcom,record-current-ma = <200>; - }; - pm6150l_torch0: qcom,torch_0 { - label = "torch"; - qcom,led-name = "led:torch_0"; - qcom,max-current = <500>; - qcom,default-led-trigger = "torch0_trigger"; - qcom,id = <0>; - qcom,current-ma = <300>; - qcom,ires-ua = <12500>; - qcom,hdrm-voltage-mv = <325>; - qcom,hdrm-vol-hi-lo-win-mv = <100>; - }; - }; - }; - - qcom,pm8009@a { - status = "disabled"; - }; - qcom,pm8009@b { - status = "disabled"; - }; -}; - -&pm6150_gpios { - interrupts = <0x0 0xc0 0 IRQ_TYPE_NONE>, - <0x0 0xc1 0 IRQ_TYPE_NONE>, - <0x0 0xc2 0 IRQ_TYPE_NONE>, - <0x0 0xc3 0 IRQ_TYPE_NONE>, - <0x0 0xc5 0 IRQ_TYPE_NONE>, - <0x0 0xc6 0 IRQ_TYPE_NONE>; - - interrupt-names = "pm6150_gpio1", "pm6150_gpio2", - "pm6150_gpio3", "pm6150_gpio4", - "pm6150_gpio6", - "pm6150_gpio7"; - qcom,gpios-disallowed = <5 8 9 10>; -}; - -&pm6150_adc_tm { - io-channels = <&pm6150_vadc ADC_XO_THERM_PU2>, - <&pm6150_vadc ADC_AMUX_THM2_PU2>, - <&pm6150_vadc ADC_AMUX_THM3_PU2>; - - quiet_therm { - status = "disabled"; - }; -}; - -&pm6150_vadc { - rf_pa0_therm { - reg = ; - label = "pa_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - rf_pa1_therm { - reg = ; - label = "wf_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - quiet_therm { - status = "disabled"; - }; -}; - -&pm6150l_gpios { - interrupts = <0x4 0xc0 0 IRQ_TYPE_NONE>, - <0x4 0xc1 0 IRQ_TYPE_NONE>, - <0x4 0xc2 0 IRQ_TYPE_NONE>, - <0x4 0xc3 0 IRQ_TYPE_NONE>, - <0x4 0xc4 0 IRQ_TYPE_NONE>, - <0x4 0xc5 0 IRQ_TYPE_NONE>, - <0x4 0xc7 0 IRQ_TYPE_NONE>, - <0x4 0xc8 0 IRQ_TYPE_NONE>, - <0x4 0xc9 0 IRQ_TYPE_NONE>, - <0x4 0xca 0 IRQ_TYPE_NONE>, - <0x4 0xcb 0 IRQ_TYPE_NONE>; - interrupt-names = "pm6150l_gpio1", "pm6150l_gpio2", - "pm6150l_gpio3", "pm6150l_gpio4", - "pm6150l_gpio5", "pm6150l_gpio6", - "pm6150l_gpio8", "pm6150l_gpio9", - "pm6150l_gpio10", "pm6150l_gpio11", - "pm6150l_gpio12"; - qcom,gpios-disallowed = <7>; - - dummy_pin { - dummy_pin_default: dummy_pin_default { - pins = "gpio12"; - bias-disable; - }; - }; -}; - -&pm6150l_adc_tm { - status = "disabled"; -/* /delete-property/ io-channels; - - conn_therm { - status = "disabled"; - }; - camera_ftherm { - status = "disabled"; - }; - nvm_therm { - status = "disabled"; - }; */ -}; - -&pm6150l_vadc { - pinctrl-0 = <&dummy_pin_default>; - - sdm_therm { - reg = ; - label = "ap_therm"; - qcom,ratiometric; - qcom,hw-settle-time = <200>; - qcom,pre-scaling = <1 1>; - qcom,decimation = <840>; - qcom,avg-samples = <8>; - }; - - camera_ftherm { - status = "disabled"; - }; - nvm_therm { - status = "disabled"; - }; -}; - -&thermal_zones { - quiet-therm-adc { - status = "disabled"; - }; - conn-therm-adc { - status = "disabled"; - }; - camera-ftherm-adc { - status = "disabled"; - }; - nvm-therm-adc { - status = "disabled"; - }; -}; diff --git a/arch/arm64/configs/vendor/lineage-a52q_defconfig b/arch/arm64/configs/vendor/lineage-a52q_defconfig index 2749e57b51f6..5e9b07bdc896 100755 --- a/arch/arm64/configs/vendor/lineage-a52q_defconfig +++ b/arch/arm64/configs/vendor/lineage-a52q_defconfig @@ -593,7 +593,7 @@ CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set # CONFIG_TRANSPARENT_HUGEPAGE is not set # CONFIG_ARCH_WANTS_THP_SWAP is not set -CONFIG_CLEANCACHE=y +# CONFIG_CLEANCACHE is not set # CONFIG_FRONTSWAP is not set CONFIG_CMA=y CONFIG_CMA_DEBUG=y @@ -616,11 +616,10 @@ CONFIG_PROCESS_RECLAIM=y # CONFIG_FORCE_ALLOC_FROM_DMA_ZONE is not set CONFIG_INCREASE_MAXIMUM_SWAPPINESS=y CONFIG_DIRECT_RECLAIM_FILE_PAGES_ONLY=y -CONFIG_MMAP_READAROUND_LIMIT=0 -# CONFIG_FAULT_AROUND_4KB is not set -CONFIG_RBIN=y -CONFIG_PAGE_BOOST=y -CONFIG_PAGE_BOOST_RECORDING=y +CONFIG_MMAP_READAROUND_LIMIT=8 +CONFIG_FAULT_AROUND_4KB=y +# CONFIG_RBIN is not set +# CONFIG_PAGE_BOOST is not set CONFIG_LARGE_DIRTY_BUFFER=y CONFIG_MAX_DIRTY_THRESH_PAGES=25600 @@ -792,6 +791,7 @@ CONFIG_NET_EGRESS=y CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y +CONFIG_UNIX_SCM=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y @@ -1439,7 +1439,7 @@ CONFIG_ZRAM_LRU_WRITEBACK_LIMIT=1024 # CONFIG_BLK_DEV_UMEM is not set # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_LOOP_MIN_COUNT=16 +CONFIG_BLK_DEV_LOOP_MIN_COUNT=32 # CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set @@ -2133,6 +2133,7 @@ CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # CONFIG_INPUT_KEYRESET is not set CONFIG_SEC_DEBUG_TSP_LOG=y +CONFIG_INPUT_TOUCHSCREEN_SEC_CMD=y CONFIG_INPUT_TOUCHSCREEN_TCLMV2=y CONFIG_INPUT_SEC_SECURE_TOUCH=y # CONFIG_INPUT_KEYCOMBO is not set @@ -2149,6 +2150,7 @@ CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_INPUT_HALL_IC is not set CONFIG_SENSORS_HALL=y # CONFIG_CERTIFY_HALL is not set # CONFIG_FOLDER_HALL is not set @@ -2264,7 +2266,6 @@ CONFIG_TOUCHSCREEN_PROPERTIES=y # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_ST is not set -# CONFIG_TOUCHSCREEN_HIMAX_CHIPSET is not set # CONFIG_TOUCHSCREEN_SYNAPTICS_DSX is not set CONFIG_TOUCHSCREEN_DUMP_MODE=y # CONFIG_TOUCHSCREEN_ZINITIX_ZT75XX is not set @@ -2276,8 +2277,11 @@ CONFIG_TOUCHSCREEN_DUMP_MODE=y # CONFIG_TOUCHSCREEN_SEC_TS_Y771 is not set CONFIG_TOUCHSCREEN_ZINITIX_ZT7650=y CONFIG_TOUCHSCREEN_STM_FTS5CU56A=y +# CONFIG_TOUCHSCREEN_HIMAX_CHIPSET is not set # CONFIG_TOUCHSCREEN_SYNAPTICS_TCM is not set # CONFIG_TOUCHSCREEN_RAYDIUM_CHIPSET is not set +# CONFIG_EPEN_WACOM_WEZ01 is not set +# CONFIG_EPEN_WACOM_W9019 is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set @@ -2315,6 +2319,13 @@ CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_SMI130 is not set # CONFIG_RMI4_CORE is not set +# CONFIG_SEC_DEBUG_TSP_LOG_LEGO is not set +# CONFIG_INPUT_TOUCHSCREEN_TCLMV2_LEGO is not set +# CONFIG_INPUT_SEC_SECURE_TOUCH_LEGO is not set +# CONFIG_TOUCHSCREEN_DUMP_MODE_LEGO is not set +# CONFIG_INPUT_SEC_NOTIFIER_LEGO is not set +# CONFIG_TOUCHSCREEN_DUAL_FOLDABLE_LEGO is not set +# CONFIG_INPUT_SEC_INPUT_LEGO is not set # # Hardware I/O ports @@ -3314,6 +3325,7 @@ CONFIG_S5KGW1P_SENSOR=y # CONFIG_SAMSUNG_CAMERA_EEPROM_TELE is not set CONFIG_SAMSUNG_CAMERA_OTP_UW=y CONFIG_SAMSUNG_CAMERA_OTP_MACRO=y +# CONFIG_SAMSUNG_CAMERA_OTP_FRONT is not set CONFIG_SAMSUNG_CAMERA_OTP=y # CONFIG_SAMSUNG_OIS_RUMBA_S4 is not set # CONFIG_SAMSUNG_HW_SOFTLANDING is not set @@ -3508,6 +3520,7 @@ CONFIG_DISPLAY_SAMSUNG_LEGO=y CONFIG_PANEL_S6E3FC3_AMS646YD04_FHD=y # CONFIG_PANEL_S6E3FC3_AMS667YM01_FHD is not set # CONFIG_PANEL_EA8076GA_AMS638VL01_FHD is not set +# CONFIG_PANEL_HX83102_TV104WUM_WUXGA is not set CONFIG_DRM_MSM=y CONFIG_DRM_MSM_REGISTER_LOGGING=y # CONFIG_DRM_MSM_HDMI_HDCP is not set @@ -3867,6 +3880,13 @@ CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_TPA6130A2 is not set # CONFIG_SND_SOC_RT5510 is not set # CONFIG_SND_SOC_TFA9894 is not set +# CONFIG_SND_SOC_DBMDX is not set +# CONFIG_SND_SOC_DBMD4_SPI is not set +# CONFIG_SND_SOC_DBMD4_I2C is not set +# CONFIG_SND_SOC_DBMD4_UART is not set +# CONFIG_SND_SOC_DBMD2_SPI is not set +# CONFIG_SND_SOC_DBMD2_I2C is not set +# CONFIG_SND_SOC_DBMD2_UART is not set # CONFIG_SND_SIMPLE_CARD is not set # CONFIG_SND_SIMPLE_SCU_CARD is not set # CONFIG_SND_AUDIO_GRAPH_CARD is not set @@ -4724,7 +4744,6 @@ CONFIG_ION=y # CONFIG_ION_CMA_HEAP is not set # CONFIG_ION_FORCE_DMA_SYNC is not set CONFIG_ION_DEFER_FREE_NO_SCHED_IDLE=y -CONFIG_ION_RBIN_HEAP=y # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_LNET is not set @@ -5625,6 +5644,10 @@ CONFIG_SENSORS_SX9364=y # CONFIG_SENSORS_A96T3X6_SUB is not set # CONFIG_SENSORS_ISG5320A is not set # CONFIG_SENSORS_ISG5320A_SUB is not set +# CONFIG_SENSORS_ISG6320 is not set +# CONFIG_SENSORS_ISG6320_WIFI is not set +# CONFIG_USE_MULTI_CHANNEL is not set +# CONFIG_USE_SINGLE_IRQ_B is not set CONFIG_ESOC=y CONFIG_ESOC_DEV=y CONFIG_ESOC_CLIENT=y @@ -5832,6 +5855,7 @@ CONFIG_AK09918_FACTORY=y CONFIG_NOT_SUPPORT_PROX_FACTORY=y CONFIG_SLPI_MOTOR=y CONFIG_FLIP_COVER_DETECTOR_FACTORY=y +# CONFIG_VEML3328_FACTORY is not set CONFIG_SENSORS_FINGERPRINT=y # CONFIG_SENSORS_ET5XX is not set # CONFIG_SENSORS_ET7XX is not set @@ -5844,18 +5868,12 @@ CONFIG_SENSORS_GW9558X=y CONFIG_SS_VIBRATOR=y # CONFIG_BOOST_POWER_SHARE is not set CONFIG_MSM_VIBRATOR=y -# CONFIG_FIVE_TEE_DRIVER is not set -CONFIG_ICD=y -CONFIG_ICD_USE_QSEECOM=y # # Pdic samsung features # # CONFIG_SEC_SVDM is not set # CONFIG_CCIC_ALTERNATE_MODE is not set -CONFIG_TZIC=y -CONFIG_TZIC_USE_QSEECOM=y -# CONFIG_TZIC_DEFAULT is not set CONFIG_SPU_VERIFY=y CONFIG_KPERFMON=y @@ -6384,7 +6402,7 @@ CONFIG_HARDENED_USERCOPY=y # CONFIG_HARDENED_USERCOPY_PAGESPAN is not set # CONFIG_FORTIFY_SOURCE is not set CONFIG_STATIC_USERMODEHELPER=y -CONFIG_STATIC_USERMODEHELPER_PATH="/system/bin/umh/usermode-helper-replica" +CONFIG_STATIC_USERMODEHELPER_PATH="/vendor/bin/umh/usermode-helper-replica" CONFIG_SECURITY_SELINUX=y # CONFIG_SECURITY_SELINUX_BOOTPARAM is not set # CONFIG_SECURITY_SELINUX_DISABLE is not set diff --git a/arch/arm64/configs/vendor/lineage-a72q_defconfig b/arch/arm64/configs/vendor/lineage-a72q_defconfig index b4e0097cc984..7c80c5dec024 100644 --- a/arch/arm64/configs/vendor/lineage-a72q_defconfig +++ b/arch/arm64/configs/vendor/lineage-a72q_defconfig @@ -591,7 +591,7 @@ CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set # CONFIG_TRANSPARENT_HUGEPAGE is not set # CONFIG_ARCH_WANTS_THP_SWAP is not set -CONFIG_CLEANCACHE=y +# CONFIG_CLEANCACHE is not set # CONFIG_FRONTSWAP is not set CONFIG_CMA=y CONFIG_CMA_DEBUG=y @@ -614,11 +614,10 @@ CONFIG_PROCESS_RECLAIM=y # CONFIG_FORCE_ALLOC_FROM_DMA_ZONE is not set CONFIG_INCREASE_MAXIMUM_SWAPPINESS=y CONFIG_DIRECT_RECLAIM_FILE_PAGES_ONLY=y -CONFIG_MMAP_READAROUND_LIMIT=0 -# CONFIG_FAULT_AROUND_4KB is not set -CONFIG_RBIN=y -CONFIG_PAGE_BOOST=y -CONFIG_PAGE_BOOST_RECORDING=y +CONFIG_MMAP_READAROUND_LIMIT=8 +CONFIG_FAULT_AROUND_4KB=y +# CONFIG_RBIN is not set +# CONFIG_PAGE_BOOST is not set CONFIG_LARGE_DIRTY_BUFFER=y CONFIG_MAX_DIRTY_THRESH_PAGES=25600 @@ -790,6 +789,7 @@ CONFIG_NET_EGRESS=y CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y +CONFIG_UNIX_SCM=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y @@ -1437,7 +1437,7 @@ CONFIG_ZRAM_LRU_WRITEBACK_LIMIT=1024 # CONFIG_BLK_DEV_UMEM is not set # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_LOOP_MIN_COUNT=16 +CONFIG_BLK_DEV_LOOP_MIN_COUNT=32 # CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set @@ -2131,6 +2131,7 @@ CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # CONFIG_INPUT_KEYRESET is not set CONFIG_SEC_DEBUG_TSP_LOG=y +CONFIG_INPUT_TOUCHSCREEN_SEC_CMD=y CONFIG_INPUT_TOUCHSCREEN_TCLMV2=y CONFIG_INPUT_SEC_SECURE_TOUCH=y # CONFIG_INPUT_KEYCOMBO is not set @@ -2147,6 +2148,7 @@ CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_INPUT_HALL_IC is not set CONFIG_SENSORS_HALL=y CONFIG_CERTIFY_HALL=y # CONFIG_FOLDER_HALL is not set @@ -2262,7 +2264,6 @@ CONFIG_TOUCHSCREEN_PROPERTIES=y # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_ST is not set -# CONFIG_TOUCHSCREEN_HIMAX_CHIPSET is not set # CONFIG_TOUCHSCREEN_SYNAPTICS_DSX is not set CONFIG_TOUCHSCREEN_DUMP_MODE=y # CONFIG_TOUCHSCREEN_ZINITIX_ZT75XX is not set @@ -2274,8 +2275,11 @@ CONFIG_TOUCHSCREEN_DUMP_MODE=y # CONFIG_TOUCHSCREEN_SEC_TS_Y771 is not set CONFIG_TOUCHSCREEN_ZINITIX_ZT7650=y CONFIG_TOUCHSCREEN_STM_FTS5CU56A=y +# CONFIG_TOUCHSCREEN_HIMAX_CHIPSET is not set # CONFIG_TOUCHSCREEN_SYNAPTICS_TCM is not set # CONFIG_TOUCHSCREEN_RAYDIUM_CHIPSET is not set +# CONFIG_EPEN_WACOM_WEZ01 is not set +# CONFIG_EPEN_WACOM_W9019 is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_ATMEL_CAPTOUCH is not set @@ -2313,6 +2317,13 @@ CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_SMI130 is not set # CONFIG_RMI4_CORE is not set +# CONFIG_SEC_DEBUG_TSP_LOG_LEGO is not set +# CONFIG_INPUT_TOUCHSCREEN_TCLMV2_LEGO is not set +# CONFIG_INPUT_SEC_SECURE_TOUCH_LEGO is not set +# CONFIG_TOUCHSCREEN_DUMP_MODE_LEGO is not set +# CONFIG_INPUT_SEC_NOTIFIER_LEGO is not set +# CONFIG_TOUCHSCREEN_DUAL_FOLDABLE_LEGO is not set +# CONFIG_INPUT_SEC_INPUT_LEGO is not set # # Hardware I/O ports @@ -3312,6 +3323,7 @@ CONFIG_S5KGW1P_SENSOR=y CONFIG_SAMSUNG_CAMERA_EEPROM_TELE=y CONFIG_SAMSUNG_CAMERA_OTP_UW=y CONFIG_SAMSUNG_CAMERA_OTP_MACRO=y +# CONFIG_SAMSUNG_CAMERA_OTP_FRONT is not set CONFIG_SAMSUNG_CAMERA_OTP=y # CONFIG_SAMSUNG_OIS_RUMBA_S4 is not set # CONFIG_SAMSUNG_HW_SOFTLANDING is not set @@ -3506,6 +3518,7 @@ CONFIG_DISPLAY_SAMSUNG_LEGO=y # CONFIG_PANEL_S6E3FC3_AMS646YD04_FHD is not set CONFIG_PANEL_S6E3FC3_AMS667YM01_FHD=y # CONFIG_PANEL_EA8076GA_AMS638VL01_FHD is not set +# CONFIG_PANEL_HX83102_TV104WUM_WUXGA is not set CONFIG_DRM_MSM=y CONFIG_DRM_MSM_REGISTER_LOGGING=y # CONFIG_DRM_MSM_HDMI_HDCP is not set @@ -3865,6 +3878,13 @@ CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_TPA6130A2 is not set # CONFIG_SND_SOC_RT5510 is not set # CONFIG_SND_SOC_TFA9894 is not set +# CONFIG_SND_SOC_DBMDX is not set +# CONFIG_SND_SOC_DBMD4_SPI is not set +# CONFIG_SND_SOC_DBMD4_I2C is not set +# CONFIG_SND_SOC_DBMD4_UART is not set +# CONFIG_SND_SOC_DBMD2_SPI is not set +# CONFIG_SND_SOC_DBMD2_I2C is not set +# CONFIG_SND_SOC_DBMD2_UART is not set # CONFIG_SND_SIMPLE_CARD is not set # CONFIG_SND_SIMPLE_SCU_CARD is not set # CONFIG_SND_AUDIO_GRAPH_CARD is not set @@ -4722,7 +4742,6 @@ CONFIG_ION=y # CONFIG_ION_CMA_HEAP is not set # CONFIG_ION_FORCE_DMA_SYNC is not set CONFIG_ION_DEFER_FREE_NO_SCHED_IDLE=y -CONFIG_ION_RBIN_HEAP=y # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set # CONFIG_LNET is not set @@ -5623,6 +5642,10 @@ CONFIG_SENSORS_SX9364=y # CONFIG_SENSORS_A96T3X6_SUB is not set # CONFIG_SENSORS_ISG5320A is not set # CONFIG_SENSORS_ISG5320A_SUB is not set +# CONFIG_SENSORS_ISG6320 is not set +# CONFIG_SENSORS_ISG6320_WIFI is not set +# CONFIG_USE_MULTI_CHANNEL is not set +# CONFIG_USE_SINGLE_IRQ_B is not set CONFIG_ESOC=y CONFIG_ESOC_DEV=y CONFIG_ESOC_CLIENT=y @@ -5830,6 +5853,7 @@ CONFIG_AK09918_FACTORY=y CONFIG_NOT_SUPPORT_PROX_FACTORY=y CONFIG_SLPI_MOTOR=y CONFIG_FLIP_COVER_DETECTOR_FACTORY=y +# CONFIG_VEML3328_FACTORY is not set CONFIG_SENSORS_FINGERPRINT=y # CONFIG_SENSORS_ET5XX is not set CONFIG_SENSORS_ET7XX=y @@ -5842,18 +5866,12 @@ CONFIG_SENSORS_ET7XX=y CONFIG_SS_VIBRATOR=y # CONFIG_BOOST_POWER_SHARE is not set CONFIG_MSM_VIBRATOR=y -# CONFIG_FIVE_TEE_DRIVER is not set -CONFIG_ICD=y -CONFIG_ICD_USE_QSEECOM=y # # Pdic samsung features # # CONFIG_SEC_SVDM is not set # CONFIG_CCIC_ALTERNATE_MODE is not set -CONFIG_TZIC=y -CONFIG_TZIC_USE_QSEECOM=y -# CONFIG_TZIC_DEFAULT is not set CONFIG_SPU_VERIFY=y CONFIG_KPERFMON=y @@ -6382,7 +6400,7 @@ CONFIG_HARDENED_USERCOPY=y # CONFIG_HARDENED_USERCOPY_PAGESPAN is not set # CONFIG_FORTIFY_SOURCE is not set CONFIG_STATIC_USERMODEHELPER=y -CONFIG_STATIC_USERMODEHELPER_PATH="/system/bin/umh/usermode-helper-replica" +CONFIG_STATIC_USERMODEHELPER_PATH="/vendor/bin/umh/usermode-helper-replica" CONFIG_SECURITY_SELINUX=y # CONFIG_SECURITY_SELINUX_BOOTPARAM is not set # CONFIG_SECURITY_SELINUX_DISABLE is not set diff --git a/arch/arm64/kernel/armv8_deprecated.c b/arch/arm64/kernel/armv8_deprecated.c index 092046704cbc..b82e32daaf66 100755 --- a/arch/arm64/kernel/armv8_deprecated.c +++ b/arch/arm64/kernel/armv8_deprecated.c @@ -63,6 +63,7 @@ struct insn_emulation { static LIST_HEAD(insn_emulation); static int nr_insn_emulated __initdata; static DEFINE_RAW_SPINLOCK(insn_emulation_lock); +static DEFINE_MUTEX(insn_emulation_mutex); static void register_emulation_hooks(struct insn_emulation_ops *ops) { @@ -208,10 +209,10 @@ static int emulation_proc_handler(struct ctl_table *table, int write, loff_t *ppos) { int ret = 0; - struct insn_emulation *insn = (struct insn_emulation *) table->data; + struct insn_emulation *insn = container_of(table->data, struct insn_emulation, current_mode); enum insn_emulation_mode prev_mode = insn->current_mode; - table->data = &insn->current_mode; + mutex_lock(&insn_emulation_mutex); ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); if (ret || !write || prev_mode == insn->current_mode) @@ -224,7 +225,7 @@ static int emulation_proc_handler(struct ctl_table *table, int write, update_insn_emulation_mode(insn, INSN_UNDEF); } ret: - table->data = insn; + mutex_unlock(&insn_emulation_mutex); return ret; } @@ -254,7 +255,7 @@ static void __init register_insn_emulation_sysctl(struct ctl_table *table) sysctl->maxlen = sizeof(int); sysctl->procname = insn->ops->name; - sysctl->data = insn; + sysctl->data = &insn->current_mode; sysctl->extra1 = &insn->min; sysctl->extra2 = &insn->max; sysctl->proc_handler = emulation_proc_handler; diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index 423a02bf0cde..58693aab2901 100755 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@ -183,64 +183,6 @@ void machine_restart(char *cmd) while (1); } -/* - * dump a block of kernel memory from around the given address - */ -static void show_data(unsigned long addr, int nbytes, const char *name) -{ - int i, j; - int nlines; - u32 *p; - - /* - * don't attempt to dump non-kernel addresses or - * values that are probably just small negative numbers - */ - if (addr < KIMAGE_VADDR || addr > -256UL) - return; - - printk("\n%s: %#lx:\n", name, addr); - - /* - * round address down to a 32 bit boundary - * and always dump a multiple of 32 bytes - */ - p = (u32 *)(addr & ~(sizeof(u32) - 1)); - nbytes += (addr & (sizeof(u32) - 1)); - nlines = (nbytes + 31) / 32; - - - for (i = 0; i < nlines; i++) { - /* - * just display low 16 bits of address to keep - * each line of the dump < 80 characters - */ - printk("%04lx ", (unsigned long)p & 0xffff); - for (j = 0; j < 8; j++) { - u32 data; - if (probe_kernel_address(p, data)) { - pr_cont(" ********"); - } else { - pr_cont(" %08x", data); - } - ++p; - } - pr_cont("\n"); - } -} - -static void show_extra_register_data(struct pt_regs *regs, int nbytes) -{ - mm_segment_t fs; - - fs = get_fs(); - set_fs(KERNEL_DS); - show_data(regs->pc - nbytes, nbytes * 2, "PC"); - show_data(regs->regs[30] - nbytes, nbytes * 2, "LR"); - show_data(regs->sp - nbytes, nbytes * 2, "SP"); - set_fs(fs); -} - void __show_regs(struct pt_regs *regs) { int i, top_reg; @@ -274,8 +216,6 @@ void __show_regs(struct pt_regs *regs) pr_cont("\n"); } - if (!user_mode(regs)) - show_extra_register_data(regs, 64); printk("\n"); } diff --git a/block/elevator.c b/block/elevator.c index 3448f35c931c..5dd4726acb73 100755 --- a/block/elevator.c +++ b/block/elevator.c @@ -235,6 +235,9 @@ int elevator_init(struct request_queue *q, char *name) * to "none". */ if (q->mq_ops) { + if (q->tag_set && q->tag_set->flags & BLK_MQ_F_NO_SCHED_BY_DEFAULT) + return 0; + if (q->nr_hw_queues == 1) e = elevator_get(q, "mq-deadline", false); if (!e) diff --git a/drivers/Makefile b/drivers/Makefile index df3a50f6b2f9..efc6d69b45d7 100755 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -223,7 +223,7 @@ obj-$(CONFIG_ICD) += security/samsung/icdrv/ obj-$(CONFIG_SEC_SVDM) += ccic/ #TZIC -obj-y += security/samsung/tzic/ +obj-$(CONFIG_TZIC) += security/samsung/tzic/ # SPU signature verify obj-$(CONFIG_SPU_VERIFY) += spu_verify/ diff --git a/drivers/adsp_factory/Kconfig b/drivers/adsp_factory/Kconfig index f902b485edab..13418d4b15d1 100755 --- a/drivers/adsp_factory/Kconfig +++ b/drivers/adsp_factory/Kconfig @@ -194,4 +194,13 @@ config FLIP_COVER_DETECTOR_FACTORY default n help flip_cover_detector factory driver. - provide sysfs for cover status by nfc. \ No newline at end of file + provide sysfs for cover status by nfc. + +config VEML3328_FACTORY + tristate "factory test for SSC - veml3328" + default n + help + veml3328 factory driver. + provide sysfs for factory test. + request selftest to adsp_factory. + receive test result from adsp_factory. diff --git a/drivers/adsp_factory/Makefile b/drivers/adsp_factory/Makefile index cf8e9a28286c..16bbc18e234b 100755 --- a/drivers/adsp_factory/Makefile +++ b/drivers/adsp_factory/Makefile @@ -14,4 +14,5 @@ obj-$(CONFIG_YAS539_FACTORY) += yas539_mag.o obj-$(CONFIG_AK09918_FACTORY) += ak09918_mag.o obj-$(CONFIG_MMC5603X_FACTORY) += mmc5603x_mag.o obj-$(CONFIG_LPS22HH_FACTORY) += lps22hh_pressure.o -obj-$(CONFIG_FLIP_COVER_DETECTOR_FACTORY) += flip_cover_detector.o \ No newline at end of file +obj-$(CONFIG_FLIP_COVER_DETECTOR_FACTORY) += flip_cover_detector.o +obj-$(CONFIG_VEML3328_FACTORY) += veml3328_light.o \ No newline at end of file diff --git a/drivers/adsp_factory/ssc_core.c b/drivers/adsp_factory/ssc_core.c index 31b29574094d..c2690a8d0826 100755 --- a/drivers/adsp_factory/ssc_core.c +++ b/drivers/adsp_factory/ssc_core.c @@ -429,6 +429,49 @@ static ssize_t sensor_dump_show(struct device *dev, return snprintf(buf, PAGE_SIZE, "%s\n", SENSOR_DUMP_DONE); } + +static ssize_t ar_mode_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int32_t msg_buf[2] = {OPTION_TYPE_SSC_AUTO_ROTATION_MODE, 0}; + + msg_buf[1] = buf[0] - 48; + pr_info("[FACTORY]%s: ar_mode:%d\n", __func__, msg_buf[1]); + adsp_unicast(msg_buf, sizeof(msg_buf), + MSG_SSC_CORE, 0, MSG_TYPE_OPTION_DEFINE); + + return size; +} + +static int sbm_init; +static ssize_t sbm_init_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + pr_info("[FACTORY] %s sbm_init_show:%d\n", __func__, sbm_init); + + return snprintf(buf, PAGE_SIZE, "%d\n", sbm_init); +} + +static ssize_t sbm_init_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int32_t msg_buf[2] = {OPTION_TYPE_SSC_SBM_INIT, 0}; + + if (kstrtoint(buf, 10, &sbm_init)) { + pr_err("[FACTORY] %s: kstrtoint fail\n", __func__); + return -EINVAL; + } + + if (sbm_init) { + msg_buf[1] = sbm_init; + pr_info("[FACTORY] %s sbm_init_store %d\n", __func__, sbm_init); + adsp_unicast(msg_buf, sizeof(msg_buf), + MSG_SSC_CORE, 0, MSG_TYPE_OPTION_DEFINE); + } + + return size; +} + static DEVICE_ATTR(dumpstate, 0440, dumpstate_show, NULL); static DEVICE_ATTR(operation_mode, 0664, operation_mode_show, operation_mode_store); @@ -442,6 +485,8 @@ static DEVICE_ATTR(ssr_reset, 0440, ssr_reset_show, NULL); static DEVICE_ATTR(ssc_mode, 0664, ssc_mode_show, ssc_mode_store); #endif static DEVICE_ATTR(sensor_dump, 0444, sensor_dump_show, NULL); +static DEVICE_ATTR(sbm_init, 0660, sbm_init_show, sbm_init_store); +static DEVICE_ATTR(ar_mode, 0220, NULL, ar_mode_store); static struct device_attribute *core_attrs[] = { &dev_attr_dumpstate, @@ -456,6 +501,8 @@ static struct device_attribute *core_attrs[] = { #ifdef CONFIG_SUPPORT_SSC_MODE &dev_attr_ssc_mode, #endif + &dev_attr_sbm_init, + &dev_attr_ar_mode, NULL, }; diff --git a/drivers/adsp_factory/veml3328_light.c b/drivers/adsp_factory/veml3328_light.c new file mode 100755 index 000000000000..93b799581fef --- /dev/null +++ b/drivers/adsp_factory/veml3328_light.c @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2012, Samsung Electronics Co. Ltd. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#include +#include +#include +#include "adsp.h" +#define VENDOR "CAPELLA" +#define CHIP_ID "VEML3328" + +/*************************************************************************/ +/* factory Sysfs */ +/*************************************************************************/ +static ssize_t light_vendor_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%s\n", VENDOR); +} + +static ssize_t light_name_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%s\n", CHIP_ID); +} + +static ssize_t light_raw_data_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct adsp_data *data = dev_get_drvdata(dev); + uint8_t cnt = 0; + + mutex_lock(&data->light_factory_mutex); + adsp_unicast(NULL, 0, MSG_LIGHT, 0, MSG_TYPE_GET_RAW_DATA); + + while (!(data->ready_flag[MSG_TYPE_GET_RAW_DATA] & 1 << MSG_LIGHT) && + cnt++ < TIMEOUT_CNT) + usleep_range(500, 550); + + data->ready_flag[MSG_TYPE_GET_RAW_DATA] &= ~(1 << MSG_LIGHT); + + if (cnt >= TIMEOUT_CNT) { + pr_err("[FACTORY] %s: Timeout!!!\n", __func__); + mutex_unlock(&data->light_factory_mutex); + return snprintf(buf, PAGE_SIZE, "0,0,0,0,0,0\n"); + } + + mutex_unlock(&data->light_factory_mutex); + return snprintf(buf, PAGE_SIZE, "%d,%d,%d,%d,%d,%d\n", + data->msg_buf[MSG_LIGHT][0], data->msg_buf[MSG_LIGHT][1], + data->msg_buf[MSG_LIGHT][2], data->msg_buf[MSG_LIGHT][3], + data->msg_buf[MSG_LIGHT][4], data->msg_buf[MSG_LIGHT][5]); +} + +static ssize_t light_get_dhr_sensor_info_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct adsp_data *data = dev_get_drvdata(dev); + uint8_t cnt = 0; + + pr_info("[FACTORY] %s: start\n", __func__); + mutex_lock(&data->light_factory_mutex); + adsp_unicast(NULL, 0, MSG_LIGHT, 0, MSG_TYPE_GET_DHR_INFO); + while (!(data->ready_flag[MSG_TYPE_GET_DHR_INFO] & 1 << MSG_LIGHT) && + cnt++ < TIMEOUT_CNT) + usleep_range(500, 550); + + data->ready_flag[MSG_TYPE_GET_DHR_INFO] &= ~(1 << MSG_LIGHT); + + if (cnt >= TIMEOUT_CNT) + pr_err("[FACTORY] %s: Timeout!!!\n", __func__); + + mutex_unlock(&data->light_factory_mutex); + return data->msg_buf[MSG_LIGHT][0]; +} + +static DEVICE_ATTR(vendor, 0444, light_vendor_show, NULL); +static DEVICE_ATTR(name, 0444, light_name_show, NULL); +static DEVICE_ATTR(lux, 0444, light_raw_data_show, NULL); +static DEVICE_ATTR(raw_data, 0444, light_raw_data_show, NULL); +static DEVICE_ATTR(dhr_sensor_info, 0444, light_get_dhr_sensor_info_show, NULL); + +static struct device_attribute *light_attrs[] = { + &dev_attr_vendor, + &dev_attr_name, + &dev_attr_lux, + &dev_attr_raw_data, + &dev_attr_dhr_sensor_info, + NULL, +}; + +static int __init veml3328_light_factory_init(void) +{ + adsp_factory_register(MSG_LIGHT, light_attrs); + + pr_info("[FACTORY] %s\n", __func__); + + return 0; +} + +static void __exit veml3328_light_factory_exit(void) +{ + adsp_factory_unregister(MSG_LIGHT); + + pr_info("[FACTORY] %s\n", __func__); +} +module_init(veml3328_light_factory_init); +module_exit(veml3328_light_factory_exit); diff --git a/drivers/android/binder.c b/drivers/android/binder.c index 76edda2fb439..1fe4c5227159 100755 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -63,6 +63,7 @@ #include #include #include +#include #include #include #include @@ -462,6 +463,9 @@ struct binder_priority { * @files files_struct for process * (protected by @files_lock) * @files_lock mutex to protect @files + * @cred struct cred associated with the `struct file` + * in binder_open() + * (invariant after initialized) * @deferred_work_node: element for binder_deferred_list * (protected by binder_deferred_lock) * @deferred_work: bitmap of deferred work to perform @@ -510,6 +514,7 @@ struct binder_proc { struct task_struct *tsk; struct files_struct *files; struct mutex files_lock; + const struct cred *cred; struct hlist_node deferred_work_node; int deferred_work; bool is_dead; @@ -1946,6 +1951,18 @@ static int binder_inc_ref_for_node(struct binder_proc *proc, } ret = binder_inc_ref_olocked(ref, strong, target_list); *rdata = ref->data; + if (ret && ref == new_ref) { + /* + * Cleanup the failed reference here as the target + * could now be dead and have already released its + * references by now. Calling on the new reference + * with strong=0 and a tmp_refs will not decrement + * the node. The new_ref gets kfree'd below. + */ + binder_cleanup_ref_olocked(new_ref); + ref = NULL; + } + binder_proc_unlock(proc); if (new_ref && ref != new_ref) /* @@ -2542,7 +2559,7 @@ static int binder_translate_binder(struct flat_binder_object *fp, ret = -EINVAL; goto done; } - if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) { + if (security_binder_transfer_binder(proc->cred, target_proc->cred)) { ret = -EPERM; goto done; } @@ -2588,7 +2605,7 @@ static int binder_translate_handle(struct flat_binder_object *fp, proc->pid, thread->pid, fp->handle); return -EINVAL; } - if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) { + if (security_binder_transfer_binder(proc->cred, target_proc->cred)) { ret = -EPERM; goto done; } @@ -2672,7 +2689,7 @@ static int binder_translate_fd(int fd, ret = -EBADF; goto err_fget; } - ret = security_binder_transfer_file(proc->tsk, target_proc->tsk, file); + ret = security_binder_transfer_file(proc->cred, target_proc->cred, file); if (ret < 0) { ret = -EPERM; goto err_security; @@ -3194,8 +3211,8 @@ static void binder_transaction(struct binder_proc *proc, freecess_sync_binder_report(proc, target_proc, tr); #endif - if (security_binder_transaction(proc->tsk, - target_proc->tsk) < 0) { + if (security_binder_transaction(proc->cred, + target_proc->cred) < 0) { return_error = BR_FAILED_REPLY; return_error_param = -EPERM; return_error_line = __LINE__; @@ -3304,9 +3321,26 @@ static void binder_transaction(struct binder_proc *proc, if (target_node && target_node->txn_security_ctx) { u32 secid; size_t added_size; + int retries = 0; + int max_retries = 100; security_task_getsecid(proc->tsk, &secid); +retry_lowmem: ret = security_secid_to_secctx(secid, &secctx, &secctx_sz); + if (ret == -ENOMEM && retries++ < max_retries) { + /* + * security_secid_to_secctx() can fail + * because of a GFP_ATOMIC allocation in + * which case -ENOMEM is returned. This needs + * to be retried, but there is currently no + * way to tell userspace to retry so we do + * it here. Sleep briefly to allow the low + * memory condition to resolve. + */ + udelay(100); + goto retry_lowmem; + } + if (ret) { return_error = BR_FAILED_REPLY; return_error_param = ret; @@ -4781,6 +4815,7 @@ static void binder_free_proc(struct binder_proc *proc) } binder_alloc_deferred_release(&proc->alloc); put_task_struct(proc->tsk); + put_cred(proc->cred); binder_stats_deleted(BINDER_STAT_PROC); kfree(proc); } @@ -4852,23 +4887,20 @@ static int binder_thread_release(struct binder_proc *proc, } /* - * If this thread used poll, make sure we remove the waitqueue - * from any epoll data structures holding it with POLLFREE. - * waitqueue_active() is safe to use here because we're holding - * the inner lock. + * If this thread used poll, make sure we remove the waitqueue from any + * poll data structures holding it. */ - if ((thread->looper & BINDER_LOOPER_STATE_POLL) && - waitqueue_active(&thread->wait)) { - wake_up_poll(&thread->wait, POLLHUP | POLLFREE); - } + if (thread->looper & BINDER_LOOPER_STATE_POLL) + wake_up_pollfree(&thread->wait); binder_inner_proc_unlock(thread->proc); /* - * This is needed to avoid races between wake_up_poll() above and - * and ep_remove_waitqueue() called for other reasons (eg the epoll file - * descriptor being closed); ep_remove_waitqueue() holds an RCU read - * lock, so we can be sure it's done after calling synchronize_rcu(). + * This is needed to avoid races between wake_up_pollfree() above and + * someone else removing the last entry from the queue for other reasons + * (e.g. ep_remove_wait_queue() being called due to an epoll file + * descriptor being closed). Such other users hold an RCU read lock, so + * we can be sure they're done after we call synchronize_rcu(). */ if (thread->looper & BINDER_LOOPER_STATE_POLL) synchronize_rcu(); @@ -4986,7 +5018,7 @@ static int binder_ioctl_set_ctx_mgr(struct file *filp, ret = -EBUSY; goto out; } - ret = security_binder_set_context_mgr(proc->tsk); + ret = security_binder_set_context_mgr(proc->cred); if (ret < 0) goto out; if (uid_valid(context->binder_context_mgr_uid)) { @@ -5319,6 +5351,7 @@ static int binder_open(struct inode *nodp, struct file *filp) get_task_struct(current->group_leader); proc->tsk = current->group_leader; mutex_init(&proc->files_lock); + proc->cred = get_cred(filp->f_cred); INIT_LIST_HEAD(&proc->todo); if (binder_supported_policy(current->policy)) { proc->default_priority.sched_policy = current->policy; diff --git a/drivers/battery/charger/sm5440_charger.c b/drivers/battery/charger/sm5440_charger.c index c81b4b05a52b..f000a490f35a 100755 --- a/drivers/battery/charger/sm5440_charger.c +++ b/drivers/battery/charger/sm5440_charger.c @@ -29,7 +29,7 @@ static bool wireless_4x_charger = 1; static int offset_4x; #endif -#define SM5440_DC_VERSION "UF2" +#define SM5440_DC_VERSION "VD1" static int sm5440_read_reg(struct sm5440_charger *sm5440, u8 reg, u8 *dest) { @@ -444,23 +444,19 @@ static int get_wpc_mfd_max_power(struct sm5440_charger *sm5440, struct sm_dc_pow static int get_apdo_max_power(struct sm5440_charger *sm5440, struct sm_dc_power_source_info *ta) { - int ret, cnt; + int ret; + struct sm_dc_info *sm_dc = select_sm_dc_info(sm5440); ta->pdo_pos = 0; /* set '0' else return error */ ta->v_max = 10000; /* request voltage level */ ta->c_max = 0; ta->p_max = 0; - for (cnt = 0; cnt < 3; ++cnt) { - ret = sec_pd_get_apdo_max_power(&ta->pdo_pos, &ta->v_max, &ta->c_max, &ta->p_max); - if (ret < 0) - dev_err(sm5440->dev, "%s: error:sec_pd_get_apdo_max_power, RETRY=%d\n", __func__, cnt); - else - break; - } - - if (cnt == 3) + ret = sec_pd_get_apdo_max_power(&ta->pdo_pos, &ta->v_max, &ta->c_max, &ta->p_max); + if (ret < 0) { dev_err(sm5440->dev, "%s: fail to get apdo_max_power(ret=%d)\n", __func__, ret); + sm_dc_report_error_status(sm_dc, SM_DC_ERR_SEND_PD_MSG); + } dev_info(sm5440->dev, "%s: pdo_pos:%d, max_vol:%dmV, max_cur:%dmA, max_pwr:%dmW\n", __func__, ta->pdo_pos, ta->v_max, ta->c_max, ta->p_max); diff --git a/drivers/battery/charger/sm5714_charger.c b/drivers/battery/charger/sm5714_charger.c index 7611778d1d12..c8d4b73307d8 100755 --- a/drivers/battery/charger/sm5714_charger.c +++ b/drivers/battery/charger/sm5714_charger.c @@ -69,6 +69,8 @@ extern int factory_mode; static void sm5714_charger_enable_aicl_irq(struct sm5714_charger_data *charger); +static int sm5714_get_facmode(void) { return factory_mode; } + static int chg_get_en_shipmode(struct sm5714_charger_data *charger) { u8 reg; @@ -92,13 +94,15 @@ static void chg_set_en_shipmode(struct sm5714_charger_data *charger, bool enable static void chg_set_auto_shipmode(struct sm5714_charger_data *charger, u8 vref) { - sm5714_update_reg(charger->i2c, SM5714_CHG_REG_CHGCNTL11, (vref << 1), (0x3 << 1)); /* SHIP_AUTO_VREF */ - pr_info("sm5714-charger: %s: set auto ship vref = %d mV \n", __func__, (2600 + (vref * 200))); + sm5714_update_reg(charger->i2c, SM5714_CHG_REG_CHGCNTL11, + (vref << 1), (0x3 << 1)); /* SHIP_AUTO_VREF */ + pr_info("sm5714-charger: %s: set auto ship vref = %d mV\n", __func__, (2600 + (vref * 200))); } static void chg_set_auto_shipmode_time(struct sm5714_charger_data *charger, u8 deglitch_time) { - sm5714_update_reg(charger->i2c, SM5714_CHG_REG_CHGCNTL11, (deglitch_time << 3), (0x3 << 3)); /* SHIP_AUTO_TIME */ + sm5714_update_reg(charger->i2c, SM5714_CHG_REG_CHGCNTL11, + (deglitch_time << 3), (0x3 << 3)); /* SHIP_AUTO_TIME */ } #if defined(ENABLE_SM5714_ENBYPASS_MODE) @@ -113,9 +117,16 @@ static void chg_set_en_bypass_mode(struct sm5714_charger_data *charger, bool ena union power_supply_propval val = {0, }; if (enable) { - sm5714_update_reg(charger->i2c, SM5714_CHG_REG_FACTORY1, (0x1 << 4), (0x1 << 4)); /* OFFREVERSE deactivated(1) */ + if (!sm5714_get_facmode()) + sm5714_update_reg(charger->i2c, SM5714_CHG_REG_VBUSCNTL, + (0x24 << 0), (0x7F << 0)); /* VBUS_LIMIT = 1000mA */ + + sm5714_update_reg(charger->i2c, SM5714_CHG_REG_FACTORY1, + (0x1 << 4), (0x1 << 4)); /* OFFREVERSE deactivated(1) */ - sm5714_update_reg(charger->i2c, SM5714_CHG_REG_CNTL1, (0x0 << 6), (0x1 << 6)); /* AICLEN_VBUS = disable(0) */ + + sm5714_update_reg(charger->i2c, SM5714_CHG_REG_CNTL1, + (0x0 << 6), (0x1 << 6)); /* AICLEN_VBUS = disable(0) */ chg_set_en_bypass(charger, 1); /* ENBYPASS = enable(1) */ @@ -123,10 +134,14 @@ static void chg_set_en_bypass_mode(struct sm5714_charger_data *charger, bool ena POWER_SUPPLY_PROP_ENERGY_NOW, val); } else { - - sm5714_update_reg(charger->i2c, SM5714_CHG_REG_FACTORY1, (0x0 << 4), (0x1 << 4)); /* OFFREVERSE activated(0) */ + sm5714_update_reg(charger->i2c, SM5714_CHG_REG_FACTORY1, + (0x0 << 4), (0x1 << 4)); /* OFFREVERSE activated(0) */ chg_set_en_bypass(charger, 0); /* ENBYPASS = disable(0) */ + + if (!sm5714_get_facmode()) + sm5714_update_reg(charger->i2c, SM5714_CHG_REG_VBUSCNTL, + (0x00 << 0), (0x7F << 0)); /* VBUS_LIMIT = 100mA */ } pr_info("sm5714-charger: %s: %s\n", __func__, enable ? "Enable" : "Disable"); } @@ -170,7 +185,7 @@ static void chg_set_batreg(struct sm5714_charger_data *charger, u16 float_voltag { u8 offset; - if (factory_mode) { + if (sm5714_get_facmode()) { pr_info("%s: Factory Mode Skip batreg Control\n", __func__); return; } @@ -184,7 +199,8 @@ static void chg_set_batreg(struct sm5714_charger_data *charger, u16 float_voltag else if (float_voltage < 4630) offset = (((float_voltage - 4050) / 10) + 6); /* BATREG = 4.05 ~ 4.62V in 0.01V steps */ else { - dev_err(charger->dev, "%s: can't support BATREG at over voltage 4.62V (mV=%d)\n", __func__, float_voltage); + dev_err(charger->dev, "%s: can't support BATREG at over voltage 4.62V (mV=%d)\n", + __func__, float_voltage); offset = 0x15; /* default Offset : 4.2V */ } @@ -224,7 +240,7 @@ static void chg_set_input_current_limit(struct sm5714_charger_data *charger, int { u8 offset; - if (factory_mode) { + if (sm5714_get_facmode()) { pr_info("%s: Factory Mode Skip current limit Control\n", __func__); return; } @@ -252,7 +268,7 @@ static void chg_set_charging_current(struct sm5714_charger_data *charger, int mA uA = mA * 1000; - if (factory_mode) { + if (sm5714_get_facmode()) { pr_info("%s: Factory Mode Skip charging current Control\n", __func__); return; } @@ -723,7 +739,7 @@ static int sm5714_chg_get_property(struct power_supply *psy, static void sm5714_chg_buck_control(struct sm5714_charger_data *charger, bool buck_on) { - if (factory_mode) { + if (sm5714_get_facmode()) { pr_info("%s: Factory Mode Skip buck_control\n", __func__); return; } @@ -741,7 +757,7 @@ static void sm5714_chg_charging(struct sm5714_charger_data *charger, int chg_en) { u8 reg; - if (factory_mode) { + if (sm5714_get_facmode()) { pr_info("%s: Factory Mode Skip chg charging\n", __func__); return; } @@ -759,12 +775,13 @@ static void sm5714_chg_charging(struct sm5714_charger_data *charger, int chg_en) static void psy_chg_set_charging_enable(struct sm5714_charger_data *charger, int charge_mode) { int buck_off = false; - bool buck_off_status = (sm5714_charger_oper_get_current_status() & (0x1 << SM5714_CHARGER_OP_EVENT_SUSPEND)) ? 1 : 0; + bool buck_off_status = + (sm5714_charger_oper_get_current_status() & (0x1 << SM5714_CHARGER_OP_EVENT_SUSPEND)) ? 1 : 0; dev_info(charger->dev, "charger_mode changed [%d] -> [%d]\n", charger->charge_mode, charge_mode); charger->charge_mode = charge_mode; - if (factory_mode) { + if (sm5714_get_facmode()) { pr_info("%s: Factory Mode Skip charging enable Control\n", __func__); return; } @@ -1130,7 +1147,7 @@ static irqreturn_t chg_done_isr(int irq, void *data) struct sm5714_charger_data *charger = data; dev_info(charger->dev, "%s: irq=%d\n", __func__, irq); - if (factory_mode) { + if (sm5714_get_facmode()) { pr_info("%s: Factory Mode Skip chg done\n", __func__); return IRQ_HANDLED; } @@ -1275,6 +1292,7 @@ static int sm5714_charger_probe(struct platform_device *pdev) struct sm5714_charger_data *charger; struct power_supply_config psy_cfg = {}; int ret = 0; + u8 reg_data1 = 0, reg_data2 = 0, reg_data3 = 0, reg_data4 = 0; dev_info(&pdev->dev, "%s: probe start\n", __func__); charger = kzalloc(sizeof(*charger), GFP_KERNEL); @@ -1304,6 +1322,48 @@ static int sm5714_charger_probe(struct platform_device *pdev) sm5714_chg_init(charger); sm5714_charger_oper_table_init(sm5714); + /* W/A : for Q3 option bit write */ + sm5714_read_reg(charger->i2c, 0xEA, ®_data1); + sm5714_read_reg(charger->i2c, 0xED, ®_data2); + sm5714_read_reg(charger->i2c, 0xE4, ®_data3); + sm5714_read_reg(charger->i2c, 0xCB, ®_data4); + dev_info(&pdev->dev, "%s: read sm5714 option bits [0x%X,0x%X,0x%X,0x%X]\n", + __func__, reg_data1, reg_data2, reg_data3, reg_data4); + + if ((reg_data1 != 0x93) || (reg_data2 != 0x10) || (reg_data3 != 0x9E) || (reg_data4 != 0x80)) { + sm5714_write_reg(charger->i2c, 0x51, 0xEA); + sm5714_write_reg(charger->i2c, 0x51, 0xAE); + sm5714_update_reg(charger->i2c, 0x6B, (0x1 << 2), (0x1 << 2)); + sm5714_write_reg(charger->i2c, 0x4C, 0xFF); + sm5714_write_reg(charger->i2c, 0x57, 0x20); + sm5714_write_reg(charger->i2c, 0x49, 0xE8); + sm5714_write_reg(charger->i2c, 0x4A, 0x02); + sm5714_write_reg(charger->i2c, 0x49, 0xCB); + sm5714_write_reg(charger->i2c, 0x4A, 0x80); + sm5714_write_reg(charger->i2c, 0x49, 0xDA); + sm5714_write_reg(charger->i2c, 0x4A, 0x00); + sm5714_write_reg(charger->i2c, 0x49, 0xEA); + sm5714_write_reg(charger->i2c, 0x4A, 0x93); + sm5714_write_reg(charger->i2c, 0x49, 0xED); + sm5714_write_reg(charger->i2c, 0x4A, 0x10); + sm5714_write_reg(charger->i2c, 0x49, 0xE4); + sm5714_write_reg(charger->i2c, 0x4A, 0x9E); + sm5714_write_reg(charger->i2c, 0x4C, 0x3F); + sm5714_write_reg(charger->i2c, 0x57, 0x00); + sm5714_update_reg(charger->i2c, 0x6B, (0x0 << 2), (0x1 << 2)); + sm5714_write_reg(charger->i2c, 0x51, 0x00); + dev_info(&pdev->dev, "%s: option bit write all\n", __func__); + } + + // re-read, for check write. + sm5714_read_reg(charger->i2c, 0xEA, ®_data1); + sm5714_read_reg(charger->i2c, 0xED, ®_data2); + sm5714_read_reg(charger->i2c, 0xE4, ®_data3); + sm5714_read_reg(charger->i2c, 0xCB, ®_data4); + dev_info(&pdev->dev, "%s: again read sm5714 option bits [0x%X,0x%X,0x%X,0x%X]\n", + __func__, reg_data1, reg_data2, reg_data3, reg_data4); + + /* Re-cycle Buck contdition */ sm5714_chg_buck_control(charger, 0); sm5714_chg_buck_control(charger, 1); /* Init work_queue, ws for Slow-rate-charging */ @@ -1439,7 +1499,7 @@ static void sm5714_charger_shutdown(struct platform_device *pdev) pr_info("%s: ++\n", __func__); if (charger->i2c) { - if (!factory_mode) { + if (!sm5714_get_facmode()) { u8 reg; /* disable charger */ diff --git a/drivers/battery/charger/sm5714_charger_oper.c b/drivers/battery/charger/sm5714_charger_oper.c index bfd9efc60015..7f6f09b8fe54 100755 --- a/drivers/battery/charger/sm5714_charger_oper.c +++ b/drivers/battery/charger/sm5714_charger_oper.c @@ -16,10 +16,10 @@ #include "../common/sec_charging_common.h" enum { - OP_MODE_SUSPEND = 0x0, - OP_MODE_CHG_ON_VBUS = 0x5, - OP_MODE_USB_OTG = 0x7, - OP_MODE_FLASH_BOOST = 0x8, + OP_MODE_SUSPEND = 0x0, + OP_MODE_CHG_ON_VBUS = 0x5, + OP_MODE_USB_OTG = 0x7, + OP_MODE_FLASH_BOOST = 0x8, }; enum { @@ -44,12 +44,13 @@ enum { OTG_CURRENT_1500mA = 0x3, }; -#define make_OP_STATUS(vbus, otg, pwr_shar, flash, torch, suspend) (((vbus & 0x1) << SM5714_CHARGER_OP_EVENT_VBUSIN) | \ - ((otg & 0x1) << SM5714_CHARGER_OP_EVENT_USB_OTG) | \ - ((pwr_shar & 0x1) << SM5714_CHARGER_OP_EVENT_PWR_SHAR) | \ - ((flash & 0x1) << SM5714_CHARGER_OP_EVENT_FLASH) | \ - ((torch & 0x1) << SM5714_CHARGER_OP_EVENT_TORCH) | \ - ((suspend & 0x1) << SM5714_CHARGER_OP_EVENT_SUSPEND)) +#define make_OP_STATUS(vbus, otg, pwr_shar, flash, torch, suspend) \ + (((vbus & 0x1) << SM5714_CHARGER_OP_EVENT_VBUSIN) | \ + ((otg & 0x1) << SM5714_CHARGER_OP_EVENT_USB_OTG) | \ + ((pwr_shar & 0x1) << SM5714_CHARGER_OP_EVENT_PWR_SHAR) | \ + ((flash & 0x1) << SM5714_CHARGER_OP_EVENT_FLASH) | \ + ((torch & 0x1) << SM5714_CHARGER_OP_EVENT_TORCH) | \ + ((suspend & 0x1) << SM5714_CHARGER_OP_EVENT_SUSPEND)) struct sm5714_charger_oper_table_info { unsigned short status; @@ -76,25 +77,40 @@ static struct sm5714_charger_oper_info *oper_info; **/ static struct sm5714_charger_oper_table_info sm5714_charger_op_mode_table[] = { /* Charger=ON Mode in a valid Input */ - { make_OP_STATUS(0, 0, 0, 0, 0, 0), OP_MODE_CHG_ON_VBUS, BSTOUT_4500mV, OTG_CURRENT_500mA}, - { make_OP_STATUS(1, 0, 0, 0, 0, 0), OP_MODE_CHG_ON_VBUS, BSTOUT_4500mV, OTG_CURRENT_500mA}, - { make_OP_STATUS(1, 1, 0, 0, 0, 0), OP_MODE_CHG_ON_VBUS, BSTOUT_4500mV, OTG_CURRENT_500mA}, /* Prevent : VBUS + OTG timing sync */ - { make_OP_STATUS(1, 0, 0, 0, 1, 0), OP_MODE_CHG_ON_VBUS, BSTOUT_4500mV, OTG_CURRENT_500mA}, + { make_OP_STATUS(0, 0, 0, 0, 0, 0), + OP_MODE_CHG_ON_VBUS, BSTOUT_4500mV, OTG_CURRENT_500mA}, + { make_OP_STATUS(1, 0, 0, 0, 0, 0), + OP_MODE_CHG_ON_VBUS, BSTOUT_4500mV, OTG_CURRENT_500mA}, + { make_OP_STATUS(1, 1, 0, 0, 0, 0), /* Prevent : VBUS + OTG timing sync */ + OP_MODE_CHG_ON_VBUS, BSTOUT_4500mV, OTG_CURRENT_500mA}, + { make_OP_STATUS(1, 0, 0, 0, 1, 0), + OP_MODE_CHG_ON_VBUS, BSTOUT_4500mV, OTG_CURRENT_500mA}, /* Flash Boost Mode */ - { make_OP_STATUS(0, 0, 0, 1, 0, 0), OP_MODE_FLASH_BOOST, BSTOUT_5100mV, OTG_CURRENT_500mA}, - { make_OP_STATUS(1, 0, 0, 1, 0, 0), OP_MODE_FLASH_BOOST, BSTOUT_5100mV, OTG_CURRENT_500mA}, - - { make_OP_STATUS(0, 0, 1, 1, 0, 0), OP_MODE_FLASH_BOOST, BSTOUT_5100mV, OTG_CURRENT_900mA}, - { make_OP_STATUS(0, 0, 0, 1, 1, 0), OP_MODE_FLASH_BOOST, BSTOUT_5100mV, OTG_CURRENT_900mA}, - { make_OP_STATUS(0, 0, 0, 0, 1, 0), OP_MODE_FLASH_BOOST, BSTOUT_5100mV, OTG_CURRENT_900mA}, + { make_OP_STATUS(0, 0, 0, 1, 0, 0), + OP_MODE_FLASH_BOOST, BSTOUT_5100mV, OTG_CURRENT_500mA}, + { make_OP_STATUS(1, 0, 0, 1, 0, 0), + OP_MODE_FLASH_BOOST, BSTOUT_5100mV, OTG_CURRENT_500mA}, + + { make_OP_STATUS(0, 0, 1, 1, 0, 0), + OP_MODE_FLASH_BOOST, BSTOUT_5100mV, OTG_CURRENT_900mA}, + { make_OP_STATUS(0, 0, 0, 1, 1, 0), + OP_MODE_FLASH_BOOST, BSTOUT_5100mV, OTG_CURRENT_900mA}, + { make_OP_STATUS(0, 0, 0, 0, 1, 0), + OP_MODE_FLASH_BOOST, BSTOUT_5100mV, OTG_CURRENT_900mA}, /* USB OTG Mode */ - { make_OP_STATUS(0, 1, 0, 0, 0, 0), OP_MODE_USB_OTG, BSTOUT_5100mV, OTG_CURRENT_900mA}, - { make_OP_STATUS(0, 0, 1, 0, 0, 0), OP_MODE_USB_OTG, BSTOUT_5100mV, OTG_CURRENT_900mA}, - { make_OP_STATUS(0, 1, 0, 1, 0, 0), OP_MODE_USB_OTG, BSTOUT_5100mV, OTG_CURRENT_900mA}, - { make_OP_STATUS(0, 1, 0, 0, 1, 0), OP_MODE_USB_OTG, BSTOUT_5100mV, OTG_CURRENT_900mA}, - { make_OP_STATUS(0, 0, 1, 0, 1, 0), OP_MODE_USB_OTG, BSTOUT_5100mV, OTG_CURRENT_900mA}, - /* Suspend Mode */ - { make_OP_STATUS(0, 0, 0, 0, 0, 1), OP_MODE_SUSPEND, BSTOUT_5100mV, OTG_CURRENT_900mA}, /* Reserved position of SUSPEND mode table */ + { make_OP_STATUS(0, 1, 0, 0, 0, 0), + OP_MODE_USB_OTG, BSTOUT_5100mV, OTG_CURRENT_900mA}, + { make_OP_STATUS(0, 0, 1, 0, 0, 0), + OP_MODE_USB_OTG, BSTOUT_5100mV, OTG_CURRENT_900mA}, + { make_OP_STATUS(0, 1, 0, 1, 0, 0), + OP_MODE_USB_OTG, BSTOUT_5100mV, OTG_CURRENT_900mA}, + { make_OP_STATUS(0, 1, 0, 0, 1, 0), + OP_MODE_USB_OTG, BSTOUT_5100mV, OTG_CURRENT_900mA}, + { make_OP_STATUS(0, 0, 1, 0, 1, 0), + OP_MODE_USB_OTG, BSTOUT_5100mV, OTG_CURRENT_900mA}, + /* Suspend Mode : Reserved position of SUSPEND mode table */ + { make_OP_STATUS(0, 0, 0, 0, 0, 1), + OP_MODE_SUSPEND, BSTOUT_5100mV, OTG_CURRENT_900mA}, }; static void sm5714_charger_oper_set_batreg(u16 float_voltage) @@ -139,12 +155,11 @@ static int set_OTG_CURRENT(struct i2c_client *i2c, u8 otg_curr) static inline int change_op_table(unsigned char new_status) { int i = 0; - static u8 reg_vbuscntl = 0; - static bool flag_vbuscntl = 0; - pr_info("sm5714-charger: %s: Old table[%d] info (STATUS: 0x%x, MODE: %d, BST_OUT: 0x%x, OTG_CURRENT: 0x%x)\n", - __func__, oper_info->table_index, oper_info->current_table.status, oper_info->current_table.oper_mode, - oper_info->current_table.BST_OUT, oper_info->current_table.OTG_CURRENT); + pr_info("%s: Old table[%d] info (STATUS: 0x%x, MODE: %d, BST_OUT: 0x%x, OTG_CURRENT: 0x%x)\n", + __func__, oper_info->table_index, oper_info->current_table.status, + oper_info->current_table.oper_mode, oper_info->current_table.BST_OUT, + oper_info->current_table.OTG_CURRENT); /* Check actvated Suspend Mode */ if (new_status & (0x1 << SM5714_CHARGER_OP_EVENT_SUSPEND)) { @@ -152,55 +167,42 @@ static inline int change_op_table(unsigned char new_status) } else { /* Search matched Table */ for (i = 0; i < oper_info->max_table_num; ++i) { - if (new_status == sm5714_charger_op_mode_table[i].status) { + if (new_status == sm5714_charger_op_mode_table[i].status) break; - } } } if (i == oper_info->max_table_num) { - pr_err("sm5714-charger: %s: can't find matched charger op_mode table (status = 0x%x)\n", __func__, new_status); + pr_err("%s: can't find matched charger op_mode table (status = 0x%x)\n", __func__, new_status); return -EINVAL; } - /* Update current table info */ + /* Update current table info */ set_BSTOUT(oper_info->i2c, sm5714_charger_op_mode_table[i].BST_OUT); oper_info->current_table.BST_OUT = sm5714_charger_op_mode_table[i].BST_OUT; - set_OTG_CURRENT(oper_info->i2c, sm5714_charger_op_mode_table[i].OTG_CURRENT); oper_info->current_table.OTG_CURRENT = sm5714_charger_op_mode_table[i].OTG_CURRENT; /* Factory 523K-JIG Test : Torch Light - Prevent VBUS input source */ - if ((oper_info->factory_RID == RID_523K) && (sm5714_charger_op_mode_table[i].status == make_OP_STATUS(0, 0, 0, 0, 1, 0))) { + if ((sm5714_charger_op_mode_table[i].status & 0x02) && + (oper_info->factory_RID == RID_255K || oper_info->factory_RID == RID_523K)) { pr_info("sm5714-charger: %s: skip Flash Boost mode for Factory JIG fled:torch test\n", __func__); /* Factory 523K-JIG Test : Flash Light - Prevent VBUS input source */ - } else if ((oper_info->factory_RID == RID_523K) && (sm5714_charger_op_mode_table[i].status == make_OP_STATUS(0, 0, 0, 1, 0, 0))) { + } else if ((sm5714_charger_op_mode_table[i].status & 0x04) && + (oper_info->factory_RID == RID_255K || oper_info->factory_RID == RID_523K)) { pr_info("sm5714-charger: %s: skip Flash Boost mode for Factory JIG fled:flash test\n", __func__); } else { - /* For Test, vbuspok + Flash on : input current down(500mA) */ - if (sm5714_charger_op_mode_table[i].status == make_OP_STATUS(1, 0, 0, 1, 0, 0)) { - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_SINKADJ, (0x3 << 2), (0x3 << 2)); - sm5714_read_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, ®_vbuscntl); - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, (0x10 << 0), (0x7F << 0)); /* 0x10 : 500mA */ - flag_vbuscntl = 1; - pr_info("sm5714-charger: %s: changed vbus_limit(fixed 500mA) entered FLASH BOOST (vbus_cntl=0x%x)\n", __func__, reg_vbuscntl); - } else if (flag_vbuscntl) { - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_SINKADJ, (0x0 << 2), (0x3 << 2)); - sm5714_write_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, reg_vbuscntl); - flag_vbuscntl = 0; - pr_info("sm5714-charger: %s: restore vbus_limit exited FLASH BOOST\n", __func__); - } - set_OP_MODE(oper_info->i2c, sm5714_charger_op_mode_table[i].oper_mode); oper_info->current_table.oper_mode = sm5714_charger_op_mode_table[i].oper_mode; } oper_info->current_table.status = new_status; oper_info->table_index = i; - pr_info("sm5714-charger: %s: New table[%d] info (STATUS: 0x%x, MODE: %d, BST_OUT: 0x%x, OTG_CURRENT: 0x%x)\n", - __func__, oper_info->table_index, oper_info->current_table.status, oper_info->current_table.oper_mode, - oper_info->current_table.BST_OUT, oper_info->current_table.OTG_CURRENT); + pr_info("%s: New table[%d] (STATUS: 0x%x, MODE: %d, BST_OUT: 0x%x, OTG_CURRENT: 0x%x)\n", + __func__, oper_info->table_index, oper_info->current_table.status, + oper_info->current_table.oper_mode, oper_info->current_table.BST_OUT, + oper_info->current_table.OTG_CURRENT); return 0; } @@ -212,17 +214,16 @@ static inline unsigned char update_status(int event_type, bool enable) return oper_info->current_table.status; } - if (enable) { + if (enable) return (oper_info->current_table.status | (1 << event_type)); - } else { + else return (oper_info->current_table.status & ~(1 << event_type)); - } } int sm5714_charger_oper_push_event(int event_type, bool enable) { unsigned char new_status; - int ret = 0; + int ret = 0; if (oper_info == NULL) { pr_err("sm5714-charger: %s: required init op_mode table\n", __func__); @@ -233,10 +234,10 @@ int sm5714_charger_oper_push_event(int event_type, bool enable) mutex_lock(&oper_info->op_mutex); new_status = update_status(event_type, enable); - if (new_status == oper_info->current_table.status) { + if (new_status == oper_info->current_table.status) goto out; - } - ret = change_op_table(new_status); + + ret = change_op_table(new_status); out: mutex_unlock(&oper_info->op_mutex); @@ -247,7 +248,7 @@ EXPORT_SYMBOL_GPL(sm5714_charger_oper_push_event); static inline int detect_initial_table_index(struct i2c_client *i2c) { - return 0; + return 0; } int sm5714_charger_oper_table_init(struct sm5714_dev *sm5714) { @@ -266,10 +267,9 @@ int sm5714_charger_oper_table_init(struct sm5714_dev *sm5714) } oper_info = kmalloc(sizeof(struct sm5714_charger_oper_info), GFP_KERNEL); - if (oper_info == NULL) { - pr_err("sm5714-charger: %s: failed to alloctae memory\n", __func__); + if (oper_info == NULL) return -ENOMEM; - } + oper_info->i2c = i2c; mutex_init(&oper_info->op_mutex); @@ -301,9 +301,10 @@ int sm5714_charger_oper_table_init(struct sm5714_dev *sm5714) pr_info("%s: battery,chg_float_voltage is %d\n", __func__, oper_info->chg_float_voltage); } - pr_info("sm5714-charger: %s: current table[%d] info (STATUS: 0x%x, MODE: %d, BST_OUT: 0x%x, OTG_CURRENT: 0x%x)\n", \ - __func__, oper_info->table_index, oper_info->current_table.status, oper_info->current_table.oper_mode, \ - oper_info->current_table.BST_OUT, oper_info->current_table.OTG_CURRENT); + pr_info("%s: current table[%d] (STATUS: 0x%x, MODE: %d, BST_OUT: 0x%x, OTG_CURRENT: 0x%x)\n", + __func__, oper_info->table_index, oper_info->current_table.status, + oper_info->current_table.oper_mode, oper_info->current_table.BST_OUT, + oper_info->current_table.OTG_CURRENT); return 0; } @@ -311,18 +312,18 @@ EXPORT_SYMBOL_GPL(sm5714_charger_oper_table_init); int sm5714_charger_oper_get_current_status(void) { - if (oper_info == NULL) { + if (oper_info == NULL) return -EINVAL; - } + return oper_info->current_table.status; } EXPORT_SYMBOL_GPL(sm5714_charger_oper_get_current_status); int sm5714_charger_oper_get_current_op_mode(void) { - if (oper_info == NULL) { + if (oper_info == NULL) return -EINVAL; - } + return oper_info->current_table.oper_mode; } EXPORT_SYMBOL_GPL(sm5714_charger_oper_get_current_op_mode); @@ -330,52 +331,77 @@ EXPORT_SYMBOL_GPL(sm5714_charger_oper_get_current_op_mode); int sm5714_charger_oper_en_factory_mode(int dev_type, int rid, bool enable) { + u8 reg = 0x0; union power_supply_propval val = {0, }; - if (oper_info == NULL) { + if (oper_info == NULL) return -EINVAL; - } if (enable) { switch (rid) { case RID_523K: sm5714_charger_oper_set_batreg(4200); - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_CNTL1, (0x0 << 6), (0x1 << 6)); /* AICLEN_VBUS = 0 (Disable) */ - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_FACTORY1, (0x1 << 0), (0x1 << 0)); /* NOZX = 1 (Disable) */ - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, (0x7F << 0), (0x7F << 0)); /* VBUS_LIMIT = MAX(3275mA) */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_CNTL1, + (0x0 << 6), (0x1 << 6)); /* AICLEN_VBUS = 0 (Disable) */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_FACTORY1, + (0x1 << 0), (0x1 << 0)); /* NOZX = 1 (Disable) */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, + (0x7F << 0), (0x7F << 0)); /* VBUS_LIMIT = MAX(3275mA) */ break; case RID_301K: - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_CNTL1, (0x0 << 6), (0x1 << 6)); /* AICLEN_VBUS = 0 (Disable) */ - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_FACTORY1, (0x0 << 0), (0x1 << 0)); /* NOZX = 0 (Enable) */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_CNTL1, + (0x0 << 6), (0x1 << 6)); /* AICLEN_VBUS = 0 (Disable) */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_FACTORY1, + (0x0 << 0), (0x1 << 0)); /* NOZX = 0 (Enable) */ #if defined(CONFIG_SEC_FACTORY) - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, (0x7F << 0), (0x7F << 0)); /* VBUS_LIMIT = MAX(3275mA) */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, + (0x7F << 0), (0x7F << 0)); /* VBUS_LIMIT = MAX(3275mA) */ #else - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, (0x44 << 0), (0x7F << 0)); /* VBUS_LIMIT = MAX(3275mA) */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, + (0x44 << 0), (0x7F << 0)); /* VBUS_LIMIT = MAX(1800mA) */ #endif break; case RID_619K: - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_CNTL1, (0x0 << 6), (0x1 << 6)); /* AICLEN_VBUS = 0 (Disable) */ - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_FACTORY1, (0x0 << 0), (0x1 << 0)); /* NOZX = 0 (Enable) */ - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, (0x44 << 0), (0x7F << 0)); /* VBUS_LIMIT = 1800mA */ - break; + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_CNTL1, + (0x0 << 6), (0x1 << 6)); /* AICLEN_VBUS = 0 (Disable) */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_FACTORY1, + (0x0 << 0), (0x1 << 0)); /* NOZX = 0 (Enable) */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, + (0x44 << 0), (0x7F << 0)); /* VBUS_LIMIT = 1800mA */ + break; + case RID_255K: + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_CNTL1, + (0x0 << 6), (0x1 << 6)); /* AICLEN_VBUS = 0 (Disable) */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_FACTORY1, + (0x0 << 0), (0x1 << 0)); /* NOZX = 0 (Enable) */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, + (0x7F << 0), (0x7F << 0)); /* VBUS_LIMIT = MAX(3275mA) */ + break; } psy_do_property("sm5714-fuelgauge", set, POWER_SUPPLY_PROP_ENERGY_NOW, val); oper_info->factory_RID = rid; - pr_info("sm5714-charger: %s enable factory mode configuration(RID=%d)\n", __func__, rid); + + sm5714_read_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, ®); + pr_info("%s: enable factory mode configuration(RID=%d, vbuslimit=0x%02X)\n", __func__, rid, reg); } else { sm5714_charger_oper_set_batreg(oper_info->chg_float_voltage); - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_CHGCNTL11, (0x0 << 0), (0x1 << 0)); /* forced_vsys = disable */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_CHGCNTL11, + (0x0 << 0), (0x1 << 0)); /* forced_vsys = disable */ - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_CNTL1, (0x1 << 6), (0x1 << 6)); /* AICLEN_VBUS = 1 (Enable) */ - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_FACTORY1, (0x0 << 0), (0x1 << 0)); /* NOZX = 0 (Enable) */ - sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, (0x10 << 0), (0x7F << 0)); /* VBUS_LIMIT = 500mA */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_CNTL1, + (0x1 << 6), (0x1 << 6)); /* AICLEN_VBUS = 1 (Enable) */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_FACTORY1, + (0x0 << 0), (0x1 << 0)); /* NOZX = 0 (Enable) */ + sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, + (0x10 << 0), (0x7F << 0)); /* VBUS_LIMIT = 500mA */ oper_info->factory_RID = 0; - pr_info("sm5714-charger: %s disable factory mode configuration\n", __func__); + sm5714_read_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, ®); + pr_info("%s: disable factory mode configuration(vbuslimit=0x%02X)\n", __func__, reg); } return 0; @@ -396,13 +422,13 @@ int sm5714_charger_oper_forced_vbus_limit_control(int mA) sm5714_update_reg(oper_info->i2c, SM5714_CHG_REG_VBUSCNTL, ((new_offset & 0x7F) << 0), (0x7F << 0)); msec = (old_mA - mA) / 10; // 10mA/ms - if (msec < 0) { + if (msec < 0) msec *= (-1); - } msleep(msec); - pr_info("sm5714-charger: %s VBUSLIMIT control 0x%X[%dmA] -> 0x%X[%dmA] (%d ms) \n", __func__, old_offset, old_mA, new_offset, mA, msec); + pr_info("sm5714-charger: %s VBUSLIMIT control 0x%X[%dmA] -> 0x%X[%dmA] (%d ms)\n", + __func__, old_offset, old_mA, new_offset, mA, msec); return 0; } diff --git a/drivers/battery/common/sec_battery.c b/drivers/battery/common/sec_battery.c index d0c70df72dda..5a9d29659c61 100755 --- a/drivers/battery/common/sec_battery.c +++ b/drivers/battery/common/sec_battery.c @@ -194,7 +194,7 @@ char *sec_bat_rx_type_str[] = { "SS Buds", }; #if defined(CONFIG_USE_MUIC) -extern int muic_afc_set_voltage(int vol); +extern int muic_afc_request_voltage(int cause, int voltage); #endif //extern int muic_hv_charger_disable(bool en); @@ -775,7 +775,7 @@ static bool sec_bat_change_vbus(struct sec_battery_info *battery) battery->chg_limit = false; battery->vbus_chg_by_siop = target_vbus; #if defined(CONFIG_USE_MUIC) - muic_afc_set_voltage(target_vbus); + muic_afc_request_voltage(AFC_REQUEST_CHARGER, target_vbus); #endif pr_info("%s: vbus set %dV by level(%d), Cable(%s, %s, %d, %d)\n", @@ -2079,8 +2079,7 @@ bool sec_bat_check_full(struct sec_battery_info *battery, int full_check_type) case SEC_BATTERY_FULLCHARGED_FG_CURRENT: if ((battery->current_now > 0 && battery->current_now < - ((battery->swelling_mode == false) ? - battery->pdata->full_check_current_1st : battery->topoff_condition)) && + battery->topoff_condition) && (battery->current_avg > 0 && battery->current_avg < battery->topoff_condition)) { battery->full_check_cnt++; @@ -2201,7 +2200,7 @@ bool sec_bat_check_full(struct sec_battery_info *battery, int full_check_type) } #if defined(CONFIG_BATTERY_CISD) - if (ret && battery->swelling_mode) { + if (ret && (battery->current_event & SEC_BAT_CURRENT_EVENT_SWELLING_MODE)) { battery->cisd.data[CISD_DATA_SWELLING_FULL_CNT]++; battery->cisd.data[CISD_DATA_SWELLING_FULL_CNT_PER_DAY]++; } @@ -2275,7 +2274,7 @@ static void sec_bat_do_fullcharged( battery->vbus_chg_by_full = true; battery->vbus_chg_by_siop = SEC_INPUT_VOLTAGE_5V; #if defined(CONFIG_USE_MUIC) - muic_afc_set_voltage(SEC_INPUT_VOLTAGE_5V); + muic_afc_request_voltage(AFC_REQUEST_CHARGER, SEC_INPUT_VOLTAGE_5V); #endif pr_info("%s: vbus is set 5V by 2nd full\n", __func__); } @@ -2705,12 +2704,12 @@ void sec_bat_get_battery_info(struct sec_battery_info *battery) battery->current_avg, battery->current_adc); #else pr_info("%s:Vnow(%dmV),Vavg(%dmV),Inow(%dmA),Iavg(%dmA),Isysavg(%dmA),Imax(%dmA),Ichg(%dmA),SOC(%d%%)," - "Tbat(%d),Tusb(%d),Tchg(%d),Twpc(%d),Tdchg(%d)\n", __func__, + "Tbat(%d),Tusb(%d),Tchg(%d),Twpc(%d),Tdchg(%d),Tblkt(%d)\n", __func__, battery->voltage_now, battery->voltage_avg, battery->current_now, battery->current_avg, battery->current_sys_avg, battery->current_max, battery->charging_current, battery->capacity, battery->temperature, - battery->usb_temp, battery->chg_temp, battery->wpc_temp, battery->dchg_temp + battery->usb_temp, battery->chg_temp, battery->wpc_temp, battery->dchg_temp, battery->blkt_temp ); #endif @@ -3249,7 +3248,7 @@ static void sec_bat_check_slowcharging_work(struct work_struct *work) battery->cable_type == SEC_BATTERY_CABLE_USB) { if (!get_usb_enumeration_state() && (battery->current_event & SEC_BAT_CURRENT_EVENT_USB_100MA)) { - sec_bat_set_misc_event(battery, BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE, BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE); + battery->usb_slow_chg = true; battery->max_charge_power = battery->input_voltage * battery->current_max; } } @@ -4000,7 +3999,7 @@ static void sec_bat_wpc_tx_work(struct work_struct *work) if (is_hv_wire_type(battery->wire_status)) { pr_info("@Tx_Mode %s : charging voltage change(9V -> 5V).\n", __func__); #if defined(CONFIG_USE_MUIC) - muic_afc_set_voltage(SEC_INPUT_VOLTAGE_5V); + muic_afc_request_voltage(AFC_REQUEST_CHARGER, SEC_INPUT_VOLTAGE_5V); #endif break; } @@ -4046,7 +4045,7 @@ static void sec_bat_wpc_tx_work(struct work_struct *work) if (is_hv_wire_type(battery->wire_status)) { pr_info("@Tx_Mode %s : charging voltage change(9V -> 5V).\n", __func__); #if defined(CONFIG_USE_MUIC) - muic_afc_set_voltage(SEC_INPUT_VOLTAGE_5V); + muic_afc_request_voltage(AFC_REQUEST_CHARGER, SEC_INPUT_VOLTAGE_5V); #endif break; #if defined(CONFIG_PDIC_NOTIFIER) @@ -4074,7 +4073,7 @@ static void sec_bat_wpc_tx_work(struct work_struct *work) if (battery->wire_status == SEC_BATTERY_CABLE_HV_TA_CHG_LIMIT) { pr_info("@Tx_Mode %s : charging voltage change(5V -> 9V)\n", __func__); #if defined(CONFIG_USE_MUIC) - muic_afc_set_voltage(SEC_INPUT_VOLTAGE_9V); + muic_afc_request_voltage(AFC_REQUEST_CHARGER, SEC_INPUT_VOLTAGE_9V); #endif break; #if defined(CONFIG_PDIC_NOTIFIER) @@ -4487,7 +4486,6 @@ static void sec_bat_cable_work(struct work_struct *work) battery->thermal_zone = BAT_THERMAL_NORMAL; battery->chg_limit = false; battery->mix_limit = false; - battery->swelling_mode = false; battery->chg_limit_recovery_cable = SEC_BATTERY_CABLE_NONE; battery->wc_heating_start_time = 0; battery->health = POWER_SUPPLY_HEALTH_GOOD; @@ -4540,6 +4538,7 @@ static void sec_bat_cable_work(struct work_struct *work) /* Discharging has 100mA current unlike non LEGO model */ sec_vote(battery->fcc_vote, VOTER_USB_100MA, true, 100); sec_vote(battery->input_vote, VOTER_USB_100MA, true, 100); + battery->usb_slow_chg = false; } else if (is_slate_mode(battery)) { int j = 0; @@ -4566,8 +4565,6 @@ static void sec_bat_cable_work(struct work_struct *work) sec_vote(battery->fcc_vote, j, false, 0); sec_vote(battery->fv_vote, j, false, 0); } - - battery->swelling_mode = SWELLING_MODE_NONE; sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_DISCHARGING); } else if (battery->current_event & SEC_BAT_CURRENT_EVENT_USB_SUSPENDED) { @@ -4581,7 +4578,6 @@ static void sec_bat_cable_work(struct work_struct *work) battery->is_sysovlo = false; battery->is_vbatovlo = false; battery->is_abnormal_temp = false; - battery->swelling_mode = SWELLING_MODE_NONE; sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_DISCHARGING); if (battery->current_event & SEC_BAT_CURRENT_EVENT_USB_SUSPENDED) { @@ -4605,10 +4601,9 @@ static void sec_bat_cable_work(struct work_struct *work) POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, val); #endif dev_info(battery->dev, - "%s: c: %d, ov: %d, at: %d, cb: %d, sm: %d\n", __func__, + "%s: c: %d, ov: %d, at: %d, cb: %d, tz: %d\n", __func__, battery->cable_type, battery->is_vbatovlo, battery->is_abnormal_temp, - battery->charging_block, battery->swelling_mode); - + battery->charging_block, battery->thermal_zone); if (battery->pdata->full_check_type != SEC_BATTERY_FULLCHARGED_NONE) battery->charging_mode = @@ -4992,7 +4987,7 @@ static int sec_bat_set_property(struct power_supply *psy, sec_vote(battery->input_vote, VOTER_USB_100MA, true, 100); } } else if ((val->intval == USB_CURRENT_HIGH_SPEED) || (val->intval == USB_CURRENT_SUPER_SPEED)) { - sec_bat_set_misc_event(battery, 0, BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE); + battery->usb_slow_chg = false; sec_vote(battery->fcc_vote, VOTER_USB_100MA, false, 0); sec_vote(battery->input_vote, VOTER_USB_100MA, false, 0); if (val->intval == USB_CURRENT_HIGH_SPEED) { @@ -5028,7 +5023,7 @@ static int sec_bat_set_property(struct power_supply *psy, } #endif } else if (val->intval == USB_CURRENT_SUSPENDED) { - sec_bat_set_misc_event(battery, 0, BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE); + battery->usb_slow_chg = false; sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_USB_SUSPENDED, SEC_BAT_CURRENT_EVENT_USB_STATE); sec_vote(battery->chgen_vote, VOTER_SUSPEND, true, SEC_BAT_CHG_MODE_BUCK_OFF); sec_vote(battery->fcc_vote, VOTER_USB_100MA, false, 0); // need to check @@ -5212,6 +5207,8 @@ static int sec_bat_get_property(struct power_supply *psy, val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE; } else if (is_hv_wire_type(battery->cable_type) || is_pd_wire_type(battery->cable_type)) { val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST; + } else if (battery->usb_slow_chg) { + val->intval = POWER_SUPPLY_CHARGE_TYPE_SLOW; } else { psy_do_property(battery->pdata->charger_name, get, POWER_SUPPLY_PROP_CHARGE_TYPE, value); @@ -5343,7 +5340,7 @@ static int sec_bat_get_property(struct power_supply *psy, val->intval = ttf_display(battery); break; case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT: - if (battery->swelling_mode) + if (battery->current_event & SEC_BAT_CURRENT_EVENT_SWELLING_MODE) val->intval = 1; else val->intval = 0; @@ -5572,7 +5569,7 @@ void sec_wireless_set_tx_enable(struct sec_battery_info *battery, bool wc_tx_ena if (is_hv_wire_type(battery->wire_status)) { #endif #if defined(CONFIG_USE_MUIC) - muic_afc_set_voltage(SEC_INPUT_VOLTAGE_5V); + muic_afc_request_voltage(AFC_REQUEST_CHARGER, SEC_INPUT_VOLTAGE_5V); #endif #if defined(CONFIG_PDIC_NOTIFIER) } else if (is_pd_wire_type(battery->wire_status) && battery->hv_pdo) { @@ -5626,7 +5623,7 @@ void sec_wireless_set_tx_enable(struct sec_battery_info *battery, bool wc_tx_ena if (is_hv_wire_type(battery->cable_type)) { #if defined(CONFIG_USE_MUIC) - muic_afc_set_voltage(SEC_INPUT_VOLTAGE_9V); + muic_afc_request_voltage(AFC_REQUEST_CHARGER, SEC_INPUT_VOLTAGE_9V); #endif } @@ -5821,7 +5818,7 @@ static int sec_wireless_set_property(struct power_supply *psy, if (is_hv_wire_type(battery->wire_status)) { pr_info("@Tx_Mode %s : charging voltage change(9V -> 5V).\n", __func__); #if defined(CONFIG_USE_MUIC) - muic_afc_set_voltage(SEC_INPUT_VOLTAGE_5V); + muic_afc_request_voltage(AFC_REQUEST_CHARGER, SEC_INPUT_VOLTAGE_5V); #endif break; /* do not set buck off/uno off untill vbus level get real 5V */ #if defined(CONFIG_PDIC_NOTIFIER) @@ -7237,7 +7234,6 @@ static int sec_battery_probe(struct platform_device *pdev) battery->dchg_temp = 0; battery->blkt_temp = 0; battery->skip_swelling = false; - battery->swelling_mode = false; battery->bat_thm_count = 0; battery->led_cover = 0; battery->hiccup_status = 0; @@ -7298,6 +7294,7 @@ static int sec_battery_probe(struct platform_device *pdev) #endif #endif battery->batt_full_capacity = 0; + battery->usb_slow_chg = false; /* Check High Voltage charging option for wireless charging */ /* '1' means disabling High Voltage charging */ diff --git a/drivers/battery/common/sec_battery.h b/drivers/battery/common/sec_battery.h index 2ddd7d5bb717..dfa6a478c4bf 100755 --- a/drivers/battery/common/sec_battery.h +++ b/drivers/battery/common/sec_battery.h @@ -269,12 +269,6 @@ enum { USB_THM_GAP_OVER, }; -enum swelling_mode_state { - SWELLING_MODE_NONE = 0, - SWELLING_MODE_CHARGING, - SWELLING_MODE_FULL, -}; - enum tx_switch_mode_state { TX_SWITCH_MODE_OFF = 0, TX_SWITCH_CHG_ONLY, @@ -970,7 +964,6 @@ struct sec_battery_info { int normal_warm_thresh; int warm_overheat_thresh; int thermal_zone; - bool swelling_mode; int bat_thm_count; /* charging */ @@ -1172,6 +1165,7 @@ struct sec_battery_info { unsigned int batt_f_mode; #endif int batt_full_capacity; + bool usb_slow_chg; }; /* event check */ diff --git a/drivers/battery/common/sec_battery_thermal.c b/drivers/battery/common/sec_battery_thermal.c index 7267d88f3dc8..fa4f46c274ed 100755 --- a/drivers/battery/common/sec_battery_thermal.c +++ b/drivers/battery/common/sec_battery_thermal.c @@ -642,7 +642,7 @@ void sec_bat_thermal_check(struct sec_battery_info *battery) if (is_hv_afc_wire_type(battery->cable_type) && !battery->vbus_limit) { #if defined(CONFIG_MUIC_HV) || defined(CONFIG_SUPPORT_HV_CTRL) battery->vbus_chg_by_siop = SEC_INPUT_VOLTAGE_0V; - muic_afc_set_voltage(SEC_INPUT_VOLTAGE_0V); + muic_afc_request_voltage(AFC_REQUEST_CHARGER, SEC_INPUT_VOLTAGE_0V); #endif battery->vbus_limit = true; pr_info("%s: Set AFC TA to 0V\n", __func__); @@ -659,7 +659,6 @@ void sec_bat_thermal_check(struct sec_battery_info *battery) #endif break; case BAT_THERMAL_OVERHEAT: - battery->swelling_mode = true; battery->usb_thm_status = USB_THM_NORMAL; battery->warm_overheat_thresh -= THERMAL_HYSTERESIS_2; battery->normal_warm_thresh -= THERMAL_HYSTERESIS_2; @@ -678,7 +677,6 @@ void sec_bat_thermal_check(struct sec_battery_info *battery) SEC_BAT_CURRENT_EVENT_SWELLING_MODE); break; case BAT_THERMAL_WARM: - battery->swelling_mode = true; battery->usb_thm_status = USB_THM_NORMAL; battery->normal_warm_thresh -= THERMAL_HYSTERESIS_2; if (is_wireless_type(battery->cable_type) || @@ -713,7 +711,6 @@ void sec_bat_thermal_check(struct sec_battery_info *battery) SEC_BAT_CURRENT_EVENT_SWELLING_MODE); break; case BAT_THERMAL_COOL1: - battery->swelling_mode = true; battery->usb_thm_status = USB_THM_NORMAL; battery->cool1_normal_thresh += THERMAL_HYSTERESIS_2; if (is_wireless_type(battery->cable_type) || @@ -730,7 +727,6 @@ void sec_bat_thermal_check(struct sec_battery_info *battery) SEC_BAT_CURRENT_EVENT_SWELLING_MODE); break; case BAT_THERMAL_COOL2: - battery->swelling_mode = true; battery->usb_thm_status = USB_THM_NORMAL; battery->cool2_cool1_thresh += THERMAL_HYSTERESIS_2; battery->cool1_normal_thresh += THERMAL_HYSTERESIS_2; @@ -748,7 +744,6 @@ void sec_bat_thermal_check(struct sec_battery_info *battery) SEC_BAT_CURRENT_EVENT_SWELLING_MODE); break; case BAT_THERMAL_COOL3: - battery->swelling_mode = true; battery->usb_thm_status = USB_THM_NORMAL; battery->cool3_cool2_thresh += THERMAL_HYSTERESIS_2; battery->cool2_cool1_thresh += THERMAL_HYSTERESIS_2; @@ -767,7 +762,6 @@ void sec_bat_thermal_check(struct sec_battery_info *battery) SEC_BAT_CURRENT_EVENT_SWELLING_MODE); break; case BAT_THERMAL_COLD: - battery->swelling_mode = true; battery->usb_thm_status = USB_THM_NORMAL; battery->cold_cool3_thresh += THERMAL_HYSTERESIS_2; battery->cool3_cool2_thresh += THERMAL_HYSTERESIS_2; @@ -785,7 +779,6 @@ void sec_bat_thermal_check(struct sec_battery_info *battery) break; case BAT_THERMAL_NORMAL: default: - battery->swelling_mode = false; battery->usb_thm_status = USB_THM_NORMAL; sec_vote(battery->fcc_vote, VOTER_SWELLING, false, 0); sec_vote(battery->fv_vote, VOTER_SWELLING, false, 0); diff --git a/drivers/battery/common/sec_battery_ttf.c b/drivers/battery/common/sec_battery_ttf.c index 8be057b5afbe..4ea50eb4b70c 100755 --- a/drivers/battery/common/sec_battery_ttf.c +++ b/drivers/battery/common/sec_battery_ttf.c @@ -12,6 +12,11 @@ #include "sec_battery.h" #include "sec_battery_ttf.h" +#define is_ttf_thermal_zone(thermal_zone) ( \ + thermal_zone == BAT_THERMAL_NORMAL || \ + thermal_zone == BAT_THERMAL_COOL1 || \ + thermal_zone == BAT_THERMAL_COOL2) + int sec_calc_ttf(struct sec_battery_info * battery, unsigned int ttf_curr) { struct sec_cv_slope *cv_data = battery->ttf_d->cv_data; @@ -328,7 +333,7 @@ int ttf_display(struct sec_battery_info *battery) if (((battery->status == POWER_SUPPLY_STATUS_CHARGING) || (battery->status == POWER_SUPPLY_STATUS_FULL && battery->capacity != 100)) && - !battery->swelling_mode) + is_ttf_thermal_zone(battery->thermal_zone)) return battery->ttf_d->timetofull; else return 0; diff --git a/drivers/battery/common/sec_step_charging.c b/drivers/battery/common/sec_step_charging.c index 9df0cfcb1738..9990e6313e4f 100755 --- a/drivers/battery/common/sec_step_charging.c +++ b/drivers/battery/common/sec_step_charging.c @@ -39,7 +39,7 @@ void sec_bat_exit_step_charging(struct sec_battery_info *battery) sec_vote(battery->fcc_vote, VOTER_STEP_CHARGE, true, battery->pdata->step_charging_current[battery->step_charging_step-1]); if ((battery->step_charging_type & STEP_CHARGING_CONDITION_FLOAT_VOLTAGE) && - (battery->swelling_mode == SWELLING_MODE_NONE)) { + (battery->thermal_zone == BAT_THERMAL_NORMAL)) { union power_supply_propval val; pr_info("%s : float voltage = %d \n", __func__, @@ -165,7 +165,7 @@ bool sec_bat_check_step_charging(struct sec_battery_info *battery) battery->step_charging_status = i; if ((battery->step_charging_type & STEP_CHARGING_CONDITION_FLOAT_VOLTAGE) && - (battery->swelling_mode == SWELLING_MODE_NONE)) { + (battery->thermal_zone == BAT_THERMAL_NORMAL)) { union power_supply_propval val; pr_info("%s : float voltage = %d \n", __func__, battery->pdata->step_charging_float_voltage[i]); @@ -367,7 +367,7 @@ check_dc_step_change: battery->pdata->dc_step_chg_val_iout[step]; if ((battery->dc_step_chg_type & STEP_CHARGING_CONDITION_FLOAT_VOLTAGE) && - (battery->swelling_mode == SWELLING_MODE_NONE)) { + (battery->thermal_zone == BAT_THERMAL_NORMAL)) { if (battery->step_charging_status < 0) { pr_info("%s : step float voltage = %d\n", __func__, battery->pdata->dc_step_chg_val_vfloat[step]); diff --git a/drivers/battery/fuelgauge/sm5714_fuelgauge.c b/drivers/battery/fuelgauge/sm5714_fuelgauge.c index e079f088fb18..37cf466e90b1 100755 --- a/drivers/battery/fuelgauge/sm5714_fuelgauge.c +++ b/drivers/battery/fuelgauge/sm5714_fuelgauge.c @@ -2018,12 +2018,11 @@ static int sm5714_fg_set_property(struct power_supply *psy, /* Battery Temperature */ case POWER_SUPPLY_PROP_CAPACITY: if (val->intval == SEC_FUELGAUGE_CAPACITY_TYPE_RESET) { - fuelgauge->initial_update_of_soc = true; if (!sm5714_fg_reset(fuelgauge, true)) return -EINVAL; - else - break; + fuelgauge->initial_update_of_soc = true; } + break; case POWER_SUPPLY_PROP_TEMP: fuelgauge->info.temperature = val->intval; if (val->intval < 0) { diff --git a/drivers/battery_v2/include/sec_battery.h b/drivers/battery_v2/include/sec_battery.h index 4f20b73e3ad6..60fe8dfea119 100755 --- a/drivers/battery_v2/include/sec_battery.h +++ b/drivers/battery_v2/include/sec_battery.h @@ -115,6 +115,7 @@ extern char *sec_cable_type[]; #define BATT_MISC_EVENT_WIRELESS_AUTH_PASS 0x00001000 #define BATT_MISC_EVENT_TEMP_HICCUP_TYPE 0x00002000 #define BATT_MISC_EVENT_HEALTH_OVERHEATLIMIT 0x00100000 +#define BATT_MISC_EVENT_FULL_CAPACITY 0x01000000 #if defined(CONFIG_SEC_FACTORY) // SEC_FACTORY #define STORE_MODE_CHARGING_MAX 80 @@ -651,6 +652,7 @@ struct sec_battery_info { /* 25w ta alert */ bool ta_alert_wa; int ta_alert_mode; + int batt_full_capacity; }; diff --git a/drivers/battery_v2/include/sec_battery_sysfs.h b/drivers/battery_v2/include/sec_battery_sysfs.h index 86363b1fae8e..255752cf59f1 100755 --- a/drivers/battery_v2/include/sec_battery_sysfs.h +++ b/drivers/battery_v2/include/sec_battery_sysfs.h @@ -257,6 +257,7 @@ enum { NORMAL_MODE_BYPASS, FACTORY_VOLTAGE_REGULATION, FACTORY_MODE_DISABLE, + BATT_FULL_CAPACITY, }; #endif /* __SEC_BATTERY_SYSFS_H */ diff --git a/drivers/battery_v2/sec_battery.c b/drivers/battery_v2/sec_battery.c index 27c932e805a4..3eda0fbf977b 100755 --- a/drivers/battery_v2/sec_battery.c +++ b/drivers/battery_v2/sec_battery.c @@ -1304,6 +1304,8 @@ int sec_bat_set_charging_current(struct sec_battery_info *battery) if (battery->current_event & SEC_BAT_CURRENT_EVENT_HV_DISABLE) { if (battery->charge_power > battery->pdata->nv_charge_power) battery->charge_power = battery->pdata->nv_charge_power; + if (battery->max_charge_power > battery->pdata->nv_charge_power) + battery->max_charge_power = battery->pdata->nv_charge_power; } if (battery->charge_power > battery->max_charge_power) @@ -1408,9 +1410,10 @@ int sec_bat_set_charge(struct sec_battery_info *battery, return 0; #endif - if ((battery->current_event & SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE) && + if ((battery->current_event & SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE || + battery->misc_event & BATT_MISC_EVENT_FULL_CAPACITY) && (chg_mode == SEC_BAT_CHG_MODE_CHARGING)) { - dev_info(battery->dev, "%s: charge disable by HMT\n", __func__); + dev_info(battery->dev, "%s: charge disable by HMT or SOC\n", __func__); chg_mode = SEC_BAT_CHG_MODE_CHARGING_OFF; } @@ -1605,6 +1608,27 @@ static bool sec_bat_check(struct sec_battery_info *battery) return ret; } +static void sec_bat_send_cs100(struct sec_battery_info *battery) +{ + union power_supply_propval value = {0, }; + bool send_cs100_cmd = true; + + if (is_wireless_type(battery->cable_type)) { +#ifdef CONFIG_CS100_JPNCONCEPT + psy_do_property(battery->pdata->wireless_charger_name, get, + POWER_SUPPLY_EXT_PROP_WIRELESS_TX_ID, value); + + /* In case of the JPN PAD, this pad blocks the charge after give the cs100 command. */ + send_cs100_cmd = (battery->charging_mode == SEC_BATTERY_CHARGING_2ND || value.intval); +#endif + if (send_cs100_cmd) { + value.intval = POWER_SUPPLY_STATUS_FULL; + psy_do_property(battery->pdata->wireless_charger_name, set, + POWER_SUPPLY_PROP_STATUS, value); + } + } +} + static bool sec_bat_get_cable_type( struct sec_battery_info *battery, int cable_source_type) @@ -1682,22 +1706,7 @@ static void sec_bat_set_charging_status(struct sec_battery_info *battery, battery->prev_safety_time = 0; break; case POWER_SUPPLY_STATUS_FULL: - if (is_wireless_type(battery->cable_type)) { - bool send_cs100_cmd = true; - -#ifdef CONFIG_CS100_JPNCONCEPT - psy_do_property(battery->pdata->wireless_charger_name, get, - POWER_SUPPLY_EXT_PROP_WIRELESS_TX_ID, value); - - /* In case of the JPN PAD, this pad blocks the charge after give the cs100 command. */ - send_cs100_cmd = (battery->charging_mode == SEC_BATTERY_CHARGING_2ND || value.intval); -#endif - if (send_cs100_cmd) { - value.intval = POWER_SUPPLY_STATUS_FULL; - psy_do_property(battery->pdata->wireless_charger_name, set, - POWER_SUPPLY_PROP_STATUS, value); - } - } + sec_bat_send_cs100(battery); break; default: break; @@ -2673,8 +2682,8 @@ static bool sec_bat_temperature_check( } else { /* if recovered from not charging */ if ((battery->health == POWER_SUPPLY_HEALTH_GOOD) && - (battery->status == - POWER_SUPPLY_STATUS_NOT_CHARGING)) { + (battery->status == POWER_SUPPLY_STATUS_NOT_CHARGING) && + !(battery->misc_event & BATT_MISC_EVENT_FULL_CAPACITY)) { battery->is_abnormal_temp = false; dev_info(battery->dev, "%s: Safe Temperature\n", __func__); @@ -4624,6 +4633,48 @@ static void sec_bat_calculate_safety_time(struct sec_battery_info *battery) pr_info("%s : REMAIN_TIME(%ld) CAL_REMAIN_TIME(%ld)\n", __func__, battery->expired_time, battery->cal_safety_time); } +static void sec_bat_recov_full_capacity(struct sec_battery_info *battery) +{ + sec_bat_set_misc_event(battery, 0, BATT_MISC_EVENT_FULL_CAPACITY); + + if (battery->status == POWER_SUPPLY_STATUS_NOT_CHARGING + && battery->health == POWER_SUPPLY_HEALTH_GOOD) { + sec_bat_set_charging_status(battery, + POWER_SUPPLY_STATUS_CHARGING); + sec_bat_set_charge(battery, SEC_BAT_CHG_MODE_CHARGING); + } +} + +static void sec_bat_check_full_capacity(struct sec_battery_info *battery) +{ + int rechg_capacity = battery->batt_full_capacity - 2; + + if (battery->batt_full_capacity >= 100 || battery->batt_full_capacity <= 0 || + battery->status == POWER_SUPPLY_STATUS_DISCHARGING) { + if (battery->misc_event & BATT_MISC_EVENT_FULL_CAPACITY) { + pr_info("%s: full_capacity(%d) status(%d)\n", + __func__, battery->batt_full_capacity, battery->status); + sec_bat_recov_full_capacity(battery); + } + return; + } + + if (battery->misc_event & BATT_MISC_EVENT_FULL_CAPACITY) { + if (battery->capacity <= rechg_capacity) { + pr_info("%s : start re-charging(%d, %d)\n", __func__, battery->capacity, rechg_capacity); + sec_bat_recov_full_capacity(battery); + } + } else if (battery->capacity >= battery->batt_full_capacity) { + pr_info("%s : stop charging(%d, %d)\n", __func__, battery->capacity, battery->batt_full_capacity); + + sec_bat_set_misc_event(battery, BATT_MISC_EVENT_FULL_CAPACITY, + BATT_MISC_EVENT_FULL_CAPACITY); + sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_NOT_CHARGING); + sec_bat_set_charge(battery, SEC_BAT_CHG_MODE_CHARGING_OFF); + sec_bat_send_cs100(battery); + } +} + static void sec_bat_monitor_work( struct work_struct *work) { @@ -4698,6 +4749,7 @@ static void sec_bat_monitor_work( /* time to full check */ sec_bat_calc_time_to_full(battery); + sec_bat_check_full_capacity(battery); #if defined(CONFIG_WIRELESS_TX_MODE) /* tx mode check */ if (battery->wc_tx_enable) { @@ -8429,6 +8481,7 @@ static int sec_battery_probe(struct platform_device *pdev) battery->health_change = false; battery->usb_temp_flag = false; + battery->batt_full_capacity = 0; /* Check High Voltage charging option for wireless charging */ /* '1' means disabling High Voltage charging */ diff --git a/drivers/battery_v2/sec_battery_sysfs.c b/drivers/battery_v2/sec_battery_sysfs.c index 782f5418f24b..1152238857f0 100755 --- a/drivers/battery_v2/sec_battery_sysfs.c +++ b/drivers/battery_v2/sec_battery_sysfs.c @@ -243,6 +243,7 @@ static struct device_attribute sec_battery_attrs[] = { SEC_BATTERY_ATTR(normal_mode_bypass), SEC_BATTERY_ATTR(factory_voltage_regulation), SEC_BATTERY_ATTR(factory_mode_disable), + SEC_BATTERY_ATTR(batt_full_capacity), }; void update_external_temp_table(struct sec_battery_info *battery, int temp[]) @@ -887,11 +888,23 @@ ssize_t sec_bat_show_attrs(struct device *dev, i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval); break; case FG_FULL_VOLTAGE: - psy_do_property(battery->pdata->charger_name, get, + { + int recharging_voltage = battery->pdata->recharge_condition_vcell; + + if (battery->current_event & SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING) { + recharging_voltage = battery->pdata->swelling_high_rechg_voltage; + } else if (battery->current_event & SEC_BAT_CURRENT_EVENT_LOW_TEMP_MODE) { + /* float voltage - 150mV */ + recharging_voltage = (battery->pdata->chg_float_voltage / + battery->pdata->chg_float_voltage_conv) - battery->pdata->swelling_low_rechg_thr; + } + + psy_do_property(battery->pdata->charger_name, get, POWER_SUPPLY_PROP_VOLTAGE_MAX, value); - i += scnprintf(buf + i, PAGE_SIZE - i, "%d %d\n", - value.intval, battery->pdata->recharge_condition_vcell); - break; + i += scnprintf(buf + i, PAGE_SIZE - i, "%d %d\n", + value.intval, recharging_voltage); + break; + } case FG_FULLCAPNOM: value.intval = SEC_BATTERY_CAPACITY_AGEDCELL; @@ -1739,6 +1752,10 @@ ssize_t sec_bat_show_attrs(struct device *dev, break; case FACTORY_MODE_DISABLE: break; + case BATT_FULL_CAPACITY: + pr_info("%s: BATT_FULL_CAPACITY = %d\n", __func__, battery->batt_full_capacity); + i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", battery->batt_full_capacity); + break; default: i = -EINVAL; break; @@ -3356,6 +3373,21 @@ ssize_t sec_bat_store_attrs( ret = count; } break; + case BATT_FULL_CAPACITY: + if (sscanf(buf, "%10d\n", &x) == 1) { + if (x >= 0 && x <= 100) { + pr_info("%s: update BATT_FULL_CAPACITY(%d)\n", __func__, x); + battery->batt_full_capacity = x; + + wake_lock(&battery->monitor_wake_lock); + queue_delayed_work(battery->monitor_wqueue, + &battery->monitor_work, 0); + } else { + pr_info("%s: out of range(%d)\n", __func__, x); + } + ret = count; + } + break; default: ret = -EINVAL; break; diff --git a/drivers/battery_v2/sec_battery_ttf.c b/drivers/battery_v2/sec_battery_ttf.c index ea79a2c79a64..2c7892d40187 100755 --- a/drivers/battery_v2/sec_battery_ttf.c +++ b/drivers/battery_v2/sec_battery_ttf.c @@ -63,6 +63,51 @@ int sec_calc_ttf(struct sec_battery_info *battery, unsigned int ttf_curr) return 60; /* minimum 1minutes */ } +#define FULL_CAPACITY 850 +int sec_calc_ttf_to_full_capacity(struct sec_battery_info *battery, unsigned int ttf_curr) +{ + struct sec_cv_slope *cv_data = battery->ttf_d->cv_data; + int i, cc_time = 0, cv_time = 0; + int soc = FULL_CAPACITY; + int charge_current = ttf_curr; + int design_cap = battery->ttf_d->ttf_capacity; + + if (!cv_data || (ttf_curr <= 0)) { + pr_info("%s: no cv_data or val: %d\n", __func__, ttf_curr); + return -1; + } + for (i = 0; i < battery->ttf_d->cv_data_length; i++) { + if (charge_current >= cv_data[i].fg_current) + break; + } + i = i >= battery->ttf_d->cv_data_length ? battery->ttf_d->cv_data_length - 1 : i; + if (cv_data[i].soc < soc) { + for (i = 0; i < battery->ttf_d->cv_data_length; i++) { + if (soc <= cv_data[i].soc) + break; + } + cv_time = + ((cv_data[i - 1].time - cv_data[i].time) * (cv_data[i].soc - soc) + / (cv_data[i].soc - cv_data[i - 1].soc)) + cv_data[i].time; + } else { /* CC mode || NONE */ + cv_time = cv_data[i].time; + cc_time = + design_cap * (cv_data[i].soc - soc) / ttf_curr * 3600 / 1000; + pr_debug("%s: cc_time: %d\n", __func__, cc_time); + if (cc_time < 0) + cc_time = 0; + } + + pr_info("%s: cap: %d, soc: %4d, T: %6d, avg: %4d, cv soc: %4d, i: %4d, val: %d\n", + __func__, design_cap, soc, cv_time + cc_time, + battery->current_avg, cv_data[i].soc, i, ttf_curr); + + if (cv_time + cc_time >= 0) + return cv_time + cc_time; + else + return 0; +} + void sec_bat_calc_time_to_full(struct sec_battery_info *battery) { if (!battery->ttf_d) @@ -107,7 +152,13 @@ void sec_bat_calc_time_to_full(struct sec_battery_info *battery) charge = (battery->max_charge_power / 5) > battery->pdata->charging_current[battery->cable_type].fast_charging_current ? battery->pdata->charging_current[battery->cable_type].fast_charging_current : (battery->max_charge_power / 5); } - battery->ttf_d->timetofull = sec_calc_ttf(battery, charge); + if (battery->batt_full_capacity > 0 && battery->batt_full_capacity < 100) { + pr_info("%s: time to 85 percent\n", __func__); + battery->ttf_d->timetofull = + sec_calc_ttf(battery, charge) - sec_calc_ttf_to_full_capacity(battery, charge); + } else { + battery->ttf_d->timetofull = sec_calc_ttf(battery, charge); + } dev_info(battery->dev, "%s: T: %5d sec, passed time: %5ld, current: %d\n", __func__, battery->ttf_d->timetofull, battery->charging_passed_time, charge); } else { diff --git a/drivers/block/loop.c b/drivers/block/loop.c index b1500959b48f..92a621e4d444 100755 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -1934,7 +1934,8 @@ static int loop_add(struct loop_device **l, int i) lo->tag_set.queue_depth = 128; lo->tag_set.numa_node = NUMA_NO_NODE; lo->tag_set.cmd_size = sizeof(struct loop_cmd); - lo->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_SG_MERGE; + lo->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_SG_MERGE | + BLK_MQ_F_NO_SCHED_BY_DEFAULT; lo->tag_set.driver_data = lo; err = blk_mq_alloc_tag_set(&lo->tag_set); diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 344e62ac45ef..d0a6904b2597 100755 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -49,6 +49,8 @@ #include "zram_drv.h" #include "../loop.h" +#define NON_LRU_SWAPPINESS 99 + /* Total bytes used by the compressed storage */ static u64 zram_pool_total_size; @@ -929,9 +931,7 @@ static int read_from_bdev_async(struct zram *zram, struct bio_vec *bvec, } #ifdef CONFIG_ZRAM_LRU_WRITEBACK -static int zram_balance_threshold = 25; /* min swap-used threshold */ static int zram_balance_ratio = 25; /* nand writeback ratio */ -module_param(zram_balance_threshold, int, 0644); module_param(zram_balance_ratio, int, 0644); static bool is_bdev_avail(struct zram *zram) @@ -971,6 +971,16 @@ static bool is_bdev_avail(struct zram *zram) return true; } +static inline bool zram_throttle_writeback_size(struct zram *zram) +{ + long objcnt = atomic64_read(&zram->stats.bd_objcnt); + + if ((unsigned long)objcnt >= zram->nr_pages * 4) + return true; + else + return false; +} + static bool zram_wb_available(struct zram *zram) { if (!zram->wb_table) @@ -982,6 +992,8 @@ static bool zram_wb_available(struct zram *zram) } spin_unlock(&zram->wb_limit_lock); + if (zram_throttle_writeback_size(zram)) + return false; return true; } @@ -1055,12 +1067,11 @@ bool zram_is_app_launch(void) static bool zram_should_writeback(struct zram *zram, unsigned long pages, bool trigger) { - unsigned long total = zram->disksize >> PAGE_SHIFT; - unsigned long stored = atomic64_read(&zram->stats.pages_stored); + unsigned long stored = atomic64_read(&zram->stats.lru_pages); unsigned long writtenback = atomic64_read(&zram->stats.bd_objcnt) - atomic64_read(&zram->stats.bd_ppr_objcnt) - atomic64_read(&zram->stats.bd_expire); - unsigned long min_stored = total * zram_balance_threshold / 100; + unsigned long min_stored_byte; int writtenback_ratio = stored ? (writtenback * 100) / stored : 0; int min_writtenback_ratio = zram_balance_ratio; int margin = max_t(int, 1, zram_balance_ratio / 10); @@ -1084,8 +1095,15 @@ static bool zram_should_writeback(struct zram *zram, min_writtenback_ratio -= margin; else min_writtenback_ratio += margin; + if (min_writtenback_ratio < writtenback_ratio) + ret = false; + + if (zram->disksize / 4 > SZ_1G) + min_stored_byte = SZ_1G; + else + min_stored_byte = zram->disksize / 4; - if (min_stored > stored || min_writtenback_ratio < writtenback_ratio) + if ((stored << PAGE_SHIFT) < min_stored_byte) ret = false; if (trigger && ret == true) @@ -1945,7 +1963,7 @@ static void zram_handle_comp_page(struct work_struct *work) if (ret) { pr_err("%s Decompression failed! err=%d offset=%u size=%u addr=%p\n", __func__, ret, offset, size, src); - print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 16, 1, + print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 16, 1, src, PAGE_SIZE, 1); BUG_ON(ret); } @@ -2575,8 +2593,13 @@ out: if (zram_test_flag(zram, index, ZRAM_UNDER_PPR)) zram_clear_flag(zram, index, ZRAM_UNDER_PPR); spin_lock_irqsave(&zram->list_lock, flags); - if (!list_empty(&zram->table[index].lru_list)) + if (!list_empty(&zram->table[index].lru_list)) { list_del_init(&zram->table[index].lru_list); + if (zram_test_flag(zram, index, ZRAM_LRU)) { + zram_clear_flag(zram, index, ZRAM_LRU); + atomic64_dec(&zram->stats.lru_pages); + } + } spin_unlock_irqrestore(&zram->list_lock, flags); #endif WARN_ON_ONCE(zram->table[index].flags & @@ -2655,7 +2678,7 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, /* Should NEVER happen. BUG() if it does. */ if (unlikely(ret)) { pr_err("Decompression failed! err=%d, page=%u, len=%u, addr=%p\n", ret, index, size, src); - print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 16, 1, src, size, 1); + print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 16, 1, src, size, 1); BUG(); } @@ -2664,8 +2687,13 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, if (zram_test_flag(zram, index, ZRAM_UNDER_PPR)) zram_clear_flag(zram, index, ZRAM_UNDER_PPR); spin_lock_irqsave(&zram->list_lock, flags); - if (!list_empty(&zram->table[index].lru_list)) + if (!list_empty(&zram->table[index].lru_list)) { list_del_init(&zram->table[index].lru_list); + if (zram_test_flag(zram, index, ZRAM_LRU)) { + zram_clear_flag(zram, index, ZRAM_LRU); + atomic64_dec(&zram->stats.lru_pages); + } + } spin_unlock_irqrestore(&zram->list_lock, flags); #endif zram_slot_unlock(zram, index); @@ -2830,9 +2858,14 @@ out: zram_set_entry(zram, index, entry); zram_set_obj_size(zram, index, comp_len); #ifdef CONFIG_ZRAM_LRU_WRITEBACK - spin_lock_irqsave(&zram->list_lock, irq_flags); - list_add_tail(&zram->table[index].lru_list, &zram->list); - spin_unlock_irqrestore(&zram->list_lock, irq_flags); + if (!page->mem_cgroup || + page->mem_cgroup->swappiness != NON_LRU_SWAPPINESS) { + spin_lock_irqsave(&zram->list_lock, irq_flags); + list_add_tail(&zram->table[index].lru_list, &zram->list); + spin_unlock_irqrestore(&zram->list_lock, irq_flags); + zram_set_flag(zram, index, ZRAM_LRU); + atomic64_inc(&zram->stats.lru_pages); + } #endif } zram_slot_unlock(zram, index); diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index b45d38dcf7d5..4c69d24630a1 100755 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -58,6 +58,7 @@ enum zram_pageflags { ZRAM_READ_BDEV, ZRAM_PPR, ZRAM_UNDER_PPR, + ZRAM_LRU, __NR_ZRAM_PAGEFLAGS, }; @@ -126,6 +127,7 @@ struct zram_stats { atomic64_t bd_ppr_max_size; atomic64_t bd_objreads; atomic64_t bd_objwrites; + atomic64_t lru_pages; #endif }; diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c index b1424d29849c..1baa32c4cfcb 100755 --- a/drivers/char/adsprpc.c +++ b/drivers/char/adsprpc.c @@ -403,6 +403,8 @@ struct fastrpc_file { int wake_enable; /* To indicate attempt has been made to allocate memory for debug_buf */ int debug_buf_alloced_attempted; + /* Flag to indicate dynamic process creation status */ + bool in_process_create; }; static struct fastrpc_apps gfa; @@ -2131,6 +2133,13 @@ static int fastrpc_init_process(struct fastrpc_file *fl, remote_arg_t ra[1]; int tgid = fl->tgid; + if (fl->dev_minor == MINOR_NUM_DEV) { + err = -ECONNREFUSED; + pr_err("adsprpc: %s: untrusted app trying to attach to privileged DSP PD\n", + __func__); + return err; + } + ra[0].buf.pv = (void *)&tgid; ra[0].buf.len = sizeof(tgid); ioctl.inv.handle = FASTRPC_STATIC_HANDLE_KERNEL; @@ -2164,6 +2173,15 @@ static int fastrpc_init_process(struct fastrpc_file *fl, int siglen; } inbuf; + spin_lock(&fl->hlock); + if (fl->in_process_create) { + err = -EALREADY; + pr_err("Already in create init process\n"); + spin_unlock(&fl->hlock); + return err; + } + fl->in_process_create = true; + spin_unlock(&fl->hlock); inbuf.pgid = fl->tgid; inbuf.namelen = strlen(current->comm) + 1; inbuf.filelen = init->filelen; @@ -2253,6 +2271,13 @@ static int fastrpc_init_process(struct fastrpc_file *fl, unsigned int pageslen; } inbuf; + if (fl->dev_minor == MINOR_NUM_DEV) { + err = -ECONNREFUSED; + pr_err("adsprpc: %s: untrusted app trying to attach to audio PD\n", + __func__); + return err; + } + if (!init->filelen) goto bail; @@ -2356,6 +2381,11 @@ bail: fastrpc_mmap_free(file, 0); mutex_unlock(&fl->map_mutex); } + if (init->flags == FASTRPC_INIT_CREATE) { + spin_lock(&fl->hlock); + fl->in_process_create = false; + spin_unlock(&fl->hlock); + } return err; } @@ -3034,6 +3064,7 @@ static int fastrpc_file_free(struct fastrpc_file *fl) } spin_lock(&fl->hlock); fl->file_close = 1; + fl->in_process_create = false; spin_unlock(&fl->hlock); if (!IS_ERR_OR_NULL(fl->init_mem)) fastrpc_buf_free(fl->init_mem, 0); @@ -3170,6 +3201,7 @@ static ssize_t fastrpc_debugfs_read(struct file *filp, char __user *buffer, len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len, "%s%s%s%s%s\n", single_line, single_line, single_line, single_line, single_line); + spin_lock(&me->hlock); hlist_for_each_entry_safe(gmaps, n, &me->maps, hn) { len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len, "%-20d|0x%-18llX|0x%-18X|0x%-20lX\n\n", @@ -3177,18 +3209,21 @@ static ssize_t fastrpc_debugfs_read(struct file *filp, char __user *buffer, (uint32_t)gmaps->size, gmaps->va); } + spin_unlock(&me->hlock); len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len, "%-20s|%-20s|%-20s|%-20s\n", "len", "refs", "raddr", "flags"); len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len, "%s%s%s%s%s\n", single_line, single_line, single_line, single_line, single_line); + spin_lock(&me->hlock); hlist_for_each_entry_safe(gmaps, n, &me->maps, hn) { len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len, "0x%-18X|%-20d|%-20lu|%-20u\n", (uint32_t)gmaps->len, gmaps->refs, gmaps->raddr, gmaps->flags); } + spin_unlock(&me->hlock); } else { len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len, "\n%s %13s %d\n", "cid", ":", fl->cid); @@ -3230,12 +3265,14 @@ static ssize_t fastrpc_debugfs_read(struct file *filp, char __user *buffer, "%s%s%s%s%s\n", single_line, single_line, single_line, single_line, single_line); + mutex_lock(&fl->map_mutex); hlist_for_each_entry_safe(map, n, &fl->maps, hn) { len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len, "0x%-20lX|0x%-20llX|0x%-20zu\n\n", map->va, map->phys, map->size); } + mutex_unlock(&fl->map_mutex); len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len, "%-20s|%-20s|%-20s|%-20s\n", "len", "refs", @@ -3244,23 +3281,27 @@ static ssize_t fastrpc_debugfs_read(struct file *filp, char __user *buffer, "%s%s%s%s%s\n", single_line, single_line, single_line, single_line, single_line); + mutex_lock(&fl->map_mutex); hlist_for_each_entry_safe(map, n, &fl->maps, hn) { len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len, "%-20zu|%-20d|0x%-20lX|%-20d\n\n", map->len, map->refs, map->raddr, map->uncached); } + mutex_unlock(&fl->map_mutex); len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len, "%-20s|%-20s\n", "secure", "attr"); len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len, "%s%s%s%s%s\n", single_line, single_line, single_line, single_line, single_line); + mutex_lock(&fl->map_mutex); hlist_for_each_entry_safe(map, n, &fl->maps, hn) { len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len, "%-20d|0x%-20lX\n\n", map->secure, map->attr); } + mutex_unlock(&fl->map_mutex); len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len, "\n======%s %s %s======\n", title, @@ -3413,6 +3454,7 @@ static int fastrpc_device_open(struct inode *inode, struct file *filp) fl->cid = -1; fl->dev_minor = dev_minor; fl->init_mem = NULL; + fl->in_process_create = false; memset(&fl->perf, 0, sizeof(fl->perf)); fl->qos_request = 0; fl->dsp_proc_init = 0; diff --git a/drivers/fingerprint/et5xx-spi.c b/drivers/fingerprint/et5xx-spi.c index 2aa445ffc6dd..44fc03b483c5 100755 --- a/drivers/fingerprint/et5xx-spi.c +++ b/drivers/fingerprint/et5xx-spi.c @@ -136,6 +136,7 @@ int etspi_Interrupt_Free(struct etspi_data *etspi) void etspi_Interrupt_Abort(struct etspi_data *etspi) { + etspi->finger_on = 1; wake_up_interruptible(&interrupt_waitq); } diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_panel.c b/drivers/gpu/drm/msm/dsi-staging/dsi_panel.c index c3682c6cf682..5751041d3541 100755 --- a/drivers/gpu/drm/msm/dsi-staging/dsi_panel.c +++ b/drivers/gpu/drm/msm/dsi-staging/dsi_panel.c @@ -394,6 +394,15 @@ static int dsi_panel_reset(struct dsi_panel *panel) struct dsi_panel_reset_config *r_config = &panel->reset_config; int i; +#if defined(CONFIG_DISPLAY_SAMSUNG_LEGO) + struct samsung_display_driver_data *vdd = panel->panel_private; + + if (vdd->aot_reset_regulator || vdd->aot_reset_regulator_late) { + pr_err("Not here, if reset_regulator enabled\n"); + goto exit; + } +#endif + if (gpio_is_valid(panel->reset_config.disp_en_gpio)) { rc = gpio_direction_output(panel->reset_config.disp_en_gpio, 1); if (rc) { @@ -449,7 +458,95 @@ exit: return rc; } -#if defined(CONFIG_DISPLAY_SAMSUNG) || defined(CONFIG_DISPLAY_SAMSUNG_LEGO) +#if defined(CONFIG_DISPLAY_SAMSUNG) +int dsi_panel_set_pinctrl_state(struct dsi_panel *panel, bool enable) +#elif defined(CONFIG_DISPLAY_SAMSUNG_LEGO) +/* Reset regulater control when aot_reset_regulator enabled + * regulator name should be "panel_reset" or "lcd_rst" + */ +static int dsi_panel_reset_regulator(struct dsi_panel *panel, bool enable) +{ + int rc = 0; + struct dsi_panel_reset_config *r_config = &panel->reset_config; + int i; + struct dsi_vreg *vreg; + u32 pre_on_ms, post_on_ms; + u32 pre_off_ms, post_off_ms; + + /* Find number of "panel-reset" supply-name order among qcom,panel-supply-entries */ + for (i = 0; i < panel->power_info.count; i++) { + if (!strcmp((panel->power_info.vregs + i)->vreg_name, "panel_reset") || + !strcmp((panel->power_info.vregs + i)->vreg_name, "lcd_rst")) + break; + } + + if (i == panel->power_info.count) { + pr_err("Could not find reset regulator name, i:%d\n", i); + goto exit; + } else { + pr_info("name [%s] at %dth(0~%d) enable:%d\n", + (panel->power_info.vregs + i)->vreg_name, i, panel->power_info.count - 1, enable); + } + + vreg = panel->power_info.vregs + i; + if (!vreg) { + pr_err("i th vregs is invalid, rc=%d\n", rc); + goto exit; + } + + if (enable) { /* Enable RESET with sequence*/ + pre_on_ms = vreg->pre_on_sleep; + post_on_ms = vreg->post_on_sleep; + + if (pre_on_ms) + usleep_range((pre_on_ms * 1000), (pre_on_ms * 1000) + 10); + + for (i = 0; i < r_config->count; i++) { + if (r_config->sequence[i].level) { + rc = regulator_enable(vreg->vreg); + if (rc) { + pr_err("enable failed for %s, rc=%d\n", + vreg->vreg_name, rc); + } + } else { + rc = regulator_disable(vreg->vreg); + if (rc) { + pr_err("disable failed for %s, rc=%d\n", + vreg->vreg_name, rc); + } + } + + if (r_config->sequence[i].sleep_ms) + usleep_range(r_config->sequence[i].sleep_ms * 1000, + (r_config->sequence[i].sleep_ms * 1000) + 100); + } + + if (post_on_ms) + usleep_range((post_on_ms * 1000), (post_on_ms * 1000) + 10); + } else { + /* Disable RESET */ + pre_off_ms = vreg->pre_off_sleep; + post_off_ms = vreg->post_off_sleep; + if (pre_off_ms) + usleep_range((pre_off_ms * 1000), (pre_off_ms * 1000) + 10); + + rc = regulator_disable(vreg->vreg); + if (rc) { + pr_err("disable failed for %s, rc=%d\n", + vreg->vreg_name, rc); + } + + if (post_off_ms) + usleep_range((post_off_ms * 1000), (post_off_ms * 1000) + 10); + + if (regulator_is_enabled(vreg->vreg)) + pr_info("%s is still enabled.\n", vreg->vreg_name); + } + +exit: + return rc; +} + int dsi_panel_set_pinctrl_state(struct dsi_panel *panel, bool enable) #else static int dsi_panel_set_pinctrl_state(struct dsi_panel *panel, bool enable) @@ -541,16 +638,36 @@ static int dsi_panel_power_on(struct dsi_panel *panel) pr_err("[%s] failed to set pinctrl, rc=%d\n", panel->name, rc); goto error_disable_vregs; } - if(!vdd->dtsi_data.samsung_reset_after_dsi_on) - { + +#if defined(CONFIG_DISPLAY_SAMSUNG) + if (!vdd->dtsi_data.samsung_reset_after_dsi_on) { rc = dsi_panel_reset(panel); if (rc) { pr_err("[%s] failed to reset panel, rc=%d\n", panel->name, rc); goto error_disable_gpio; } } -#if defined(CONFIG_DISPLAY_SAMSUNG_LEGO) +#elif defined(CONFIG_DISPLAY_SAMSUNG_LEGO) + /* Call reset_regulator func here + * if aot_reset_regulator is true + * not aot_reset_regulator_late + */ + if (vdd->aot_reset_regulator) + rc = dsi_panel_reset_regulator(panel, true); + else if (!vdd->aot_reset_regulator_late) + rc = dsi_panel_reset(panel); + if (rc) { + pr_err("[%s] failed to reset panel, rc=%d\n", panel->name, rc); + goto error_disable_gpio; + } + vdd->reset_time_64 = ktime_to_ms(ktime_get()); +#else + rc = dsi_panel_reset(panel); + if (rc) { + pr_err("[%s] failed to reset panel, rc=%d\n", panel->name, rc); + goto error_disable_gpio; + } #endif goto exit; @@ -601,8 +718,17 @@ static int dsi_panel_power_off(struct dsi_panel *panel) usleep_range(vdd->dtsi_data.samsung_dsi_off_reset_delay, vdd->dtsi_data.samsung_dsi_off_reset_delay); - if (gpio_is_valid(panel->reset_config.reset_gpio)) - gpio_set_value(panel->reset_config.reset_gpio, 0); + /* Reset regulator off when aot_reset_regulator enabled */ + if (vdd->aot_reset_regulator || vdd->aot_reset_regulator_late) { + rc = dsi_panel_reset_regulator(panel, false); + if (rc) { + pr_err("[%s] failed to off reset regulator, rc=%d\n", + panel->name, rc); + } + } else /* AOT disable on factory binary. */ + if (!vdd->aot_enable || vdd->is_factory_mode) + if (gpio_is_valid(panel->reset_config.reset_gpio)) + gpio_set_value(panel->reset_config.reset_gpio, 0); #else if (gpio_is_valid(panel->reset_config.reset_gpio)) gpio_set_value(panel->reset_config.reset_gpio, 0); @@ -3036,7 +3162,9 @@ static int dsi_panel_parse_gpios(struct dsi_panel *panel) !panel->host_config.ext_bridge_num) { rc = panel->reset_config.reset_gpio; pr_err("[%s] failed get reset gpio, rc=%d\n", panel->name, rc); +#if !defined(CONFIG_DISPLAY_SAMSUNG_LEGO) // For No panel reset project.. goto error; +#endif } panel->reset_config.disp_en_gpio = utils->get_named_gpio(utils->data, @@ -4966,6 +5094,17 @@ int dsi_panel_prepare(struct dsi_panel *panel) */ if (!panel->lp11_init) msleep(5); +#elif defined(CONFIG_DISPLAY_SAMSUNG_LEGO) + { + struct samsung_display_driver_data *vdd = panel->panel_private; + + /* Call reset_regulator func here + * if aot_reset_regulator_late is true + * not pure aot_reset_regulator + */ + if (vdd->aot_reset_regulator_late) + rc = dsi_panel_reset_regulator(panel, true); + } #endif rc = dsi_panel_tx_cmd_set(panel, DSI_CMD_SET_PRE_ON); @@ -5400,6 +5539,18 @@ int dsi_panel_enable(struct dsi_panel *panel) } if (!rc) panel->panel_initialized = true; +#elif defined(CONFIG_DISPLAY_SAMSUNG_LEGO) + /* skip cmds during splash booting : from 7225*/ + if (vdd->skip_cmd_set_on_splash_enabled && vdd->samsung_splash_enabled) { + LCD_INFO("skip send DSI_CMD_SET_ON during splash booting\n"); + rc = 0; + } else + rc = dsi_panel_tx_cmd_set(panel, DSI_CMD_SET_ON); + if (rc) + pr_err("[%s] failed to send DSI_CMD_SET_ON cmds, rc=%d\n", + panel->name, rc); + else + panel->panel_initialized = true; #else rc = dsi_panel_tx_cmd_set(panel, DSI_CMD_SET_ON); if (rc) diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_pwr.c b/drivers/gpu/drm/msm/dsi-staging/dsi_pwr.c index 21169bcfdf33..2f1ae56cf2e4 100755 --- a/drivers/gpu/drm/msm/dsi-staging/dsi_pwr.c +++ b/drivers/gpu/drm/msm/dsi-staging/dsi_pwr.c @@ -18,6 +18,10 @@ #include "dsi_pwr.h" #include "dsi_parser.h" +#if defined(CONFIG_DISPLAY_SAMSUNG_LEGO) +#include "dsi_panel.h" +#include "ss_dsi_panel_common.h" +#endif /* * dsi_pwr_parse_supply_node() - parse power supply node from root device node @@ -134,10 +138,49 @@ static int dsi_pwr_enable_vregs(struct dsi_regulator_info *regs, bool enable) int rc = 0, i = 0; struct dsi_vreg *vreg; int num_of_v = 0; +#if defined(CONFIG_DISPLAY_SAMSUNG_LEGO) + struct dsi_panel *panel = NULL; + struct dsi_display *display = NULL; + struct samsung_display_driver_data *vdd = NULL; + + /* qcom supplys has only 1 count for each one */ + /* only samsung count will be 2~5 */ + if (regs->count > 1) { + panel = container_of(regs, struct dsi_panel, power_info); + if (panel) { + if (panel->panel_private) + vdd = panel->panel_private; + else + pr_err("No panel private\n"); + + display = container_of(panel->host, struct dsi_display, host); + if (!display) + pr_err("No dsi_display\n"); + } else + pr_err("No panel\n"); + } +#endif if (enable) { for (i = 0; i < regs->count; i++) { vreg = ®s->vregs[i]; + +#if defined(CONFIG_DISPLAY_SAMSUNG_LEGO) + if (panel && vdd && display) { + /* aot_reset_regulator means reset is set as regulator + * but panel_reset or lcd_rst regulator should not be controlled here + */ + if ((vdd->aot_reset_regulator || vdd->aot_reset_regulator_late) + && !display->is_cont_splash_enabled + && (!strcmp(vreg->vreg_name, "panel_reset") + || !strcmp(vreg->vreg_name, "lcd_rst"))) { + pr_info("aot_reset_regulator(_late) -> dsi_panel_reset_regulator\n"); + continue; + } + } else + pr_debug("count 1 or no panel...\n"); +#endif + if (vreg->pre_on_sleep) usleep_range(vreg->pre_on_sleep*1000, vreg->pre_on_sleep*1000); @@ -172,6 +215,24 @@ static int dsi_pwr_enable_vregs(struct dsi_regulator_info *regs, bool enable) } } else { for (i = (regs->count - 1); i >= 0; i--) { + +#if defined(CONFIG_DISPLAY_SAMSUNG_LEGO) + if (panel && vdd && display) { + if ((vdd->aot_reset_regulator || vdd->aot_reset_regulator_late) + && !display->is_cont_splash_enabled + && (!strcmp(regs->vregs[i].vreg_name, "panel_reset") + || !strcmp(regs->vregs[i].vreg_name, "lcd_rst"))) { + pr_info("aot_reset_regulator skip reset off here\n"); + continue; + } + + if (vdd->boost_early_off && !strcmp(regs->vregs[i].vreg_name, "panel_boost_en")) { + pr_info("boost_early_off skip boost_en off here\n"); + continue; + + } + } +#endif if (regs->vregs[i].pre_off_sleep) usleep_range(regs->vregs[i].pre_off_sleep*1000, regs->vregs[i].pre_off_sleep*1000); diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index 7a9c3285d0b5..f37786f406b2 100755 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark * @@ -60,6 +60,8 @@ #define MSM_VERSION_MINOR 2 #define MSM_VERSION_PATCHLEVEL 0 +static DEFINE_MUTEX(msm_release_lock); + #if defined(CONFIG_DISPLAY_SAMSUNG_LEGO) static BLOCKING_NOTIFIER_HEAD(msm_drm_notifier_list); @@ -1537,14 +1539,27 @@ void msm_mode_object_event_notify(struct drm_mode_object *obj, static int msm_release(struct inode *inode, struct file *filp) { - struct drm_file *file_priv = filp->private_data; - struct drm_minor *minor = file_priv->minor; - struct drm_device *dev = minor->dev; - struct msm_drm_private *priv = dev->dev_private; + struct drm_file *file_priv; + struct drm_minor *minor; + struct drm_device *dev; + struct msm_drm_private *priv; struct msm_drm_event *node, *temp, *tmp_node; u32 count; unsigned long flags; LIST_HEAD(tmp_head); + int ret = 0; + + mutex_lock(&msm_release_lock); + + file_priv = filp->private_data; + if (!file_priv) { + ret = -EINVAL; + goto end; + } + + minor = file_priv->minor; + dev = minor->dev; + priv = dev->dev_private; spin_lock_irqsave(&dev->event_lock, flags); list_for_each_entry_safe(node, temp, &priv->client_event_list, @@ -1572,7 +1587,11 @@ static int msm_release(struct inode *inode, struct file *filp) kfree(node); } - return drm_release(inode, filp); + ret = drm_release(inode, filp); + filp->private_data = NULL; +end: + mutex_unlock(&msm_release_lock); + return ret; } /** diff --git a/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/Makefile b/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/Makefile new file mode 100755 index 000000000000..343f2806df71 --- /dev/null +++ b/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/Makefile @@ -0,0 +1,9 @@ + +ccflags-y := -Iinclude/drm -Idrivers/gpu/drm/msm -Idrivers/gpu/drm/msm/dsi-staging -Idrivers/gpu/drm/msm/dp +ccflags-y += -I$(srctree)/drivers/gpu/drm/msm +ccflags-y += -I$(srctree)/drivers/gpu/drm/msm/sde +ccflags-y += -I$(srctree)/drivers/clk/qcom +ccflags-y += -I$(srctree)/drivers/gpu/drm/msm/samsung_lego + +obj-y += ss_dsi_panel_HX83102_TV104WUM.o +obj-y += ss_buck_isl98609_i2c.o \ No newline at end of file diff --git a/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/dsi_panel_HX83102_TV104WUM_wuxga_video.dtsi b/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/dsi_panel_HX83102_TV104WUM_wuxga_video.dtsi new file mode 100755 index 000000000000..afc8d07230e6 --- /dev/null +++ b/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/dsi_panel_HX83102_TV104WUM_wuxga_video.dtsi @@ -0,0 +1,355 @@ +/* Copyright (c) 2012, Samsung Electronics Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +&mdss_mdp { + ss_dsi_panel_HX83102_TV104WUM_WUXGA: ss_dsi_panel_HX83102_TV104WUM_WUXGA { + qcom,mdss-dsi-panel-name = "ss_dsi_panel_HX83102_TV104WUM_WUXGA"; + label = "ss_dsi_panel_HX83102_TV104WUM_WUXGA"; + + qcom,mdss-dsi-bpp = <24>; + + /*qcom,cmd-sync-wait-broadcast;*/ + + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + + qcom,mdss-dsi-underflow-color = <0xFF>; + qcom,mdss-dsi-border-color = <0>; + + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; + + qcom,mdss-dsi-bl-min-level = <1>; + qcom,mdss-dsi-bl-max-level = <425>; + qcom,mdss-brightness-max-level = <425>; + qcom,mdss-brightness-default-level = <255>; + qcom,mdss-dsi-interleave-mode = <0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + + /*qcom,dynamic-mode-switch-enabled;*/ + /*qcom,dynamic-mode-switch-type = "dynamic-resolution-switch-immediate";*/ + + qcom,mdss-dsi-te-dcs-command = <1>; + qcom,mdss-dsi-wr-mem-start = <0x2C>; + qcom,mdss-dsi-wr-mem-continue = <0x3C>; + + qcom,mdss-dsi-pixel-packing = "loose"; + + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + //qcom,mdss-dsi-lane-map = "lane_map_0123"; + + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + + qcom,mdss-dsi-force-clock-lane-hs; + + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + + qcom,mdss-pan-physical-width-dimension = <135>; /*135.3*/ + qcom,mdss-pan-physical-height-dimension = <226>; /*225.6*/ + + qcom,mdss-dsi-reset-sequence = <1 2>, <0 1>, <1 55>; + /*qcom,mdss-dsi-lp11-init;*/ + /*qcom,mdss-dsi-init-delay-us = <1000>;*/ + + qcom,mdss-dsi-rx-eot-ignore; + qcom,mdss-dsi-tx-eot-append; + + /* HDR Setting */ + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <15635 16450 34000 16000 13250 34500 7500 3000>; + qcom,mdss-dsi-panel-peak-brightness = <4000000>; + qcom,mdss-dsi-panel-average-brightness = <1200000>; + qcom,mdss-dsi-panel-blackness-level = <5>; + + //qcom,ulps-enabled; + /* qcom,suspend-ulps-enabled; */ + //qcom,esd-check-enabled; + /* BELOW 2 LINES ARE DEFINED ON display-r01.dtsi */ + /*qcom,mdss-dsi-panel-status-check-mode ="irq_check"; EL_ON*/ + /*qcom,mdss-dsi-panel-status-irq-trigger1 = "falling";*/ + /*qcom,mdss-dsi-panel-status-read-length;*/ + /*qcom,mdss-dsi-panel-status-value;*/ + /*qcom,mdss-dsi-panel-status-irq-trigger1 = "rising"; FG_ERR*/ + + /* ************************************************************* + * Below parameters are samsung dependent thigs + * ************************************************************* + */ + samsung,panel-vendor = "BOE"; + samsung,disp-model = "TV104WUM"; + samsung,tft-common-support; + //samsung,lp11_sleep_ms_time = <60>; + samsung,support_factory_panel_swap; + samsung,pll_ssc_disabled; + samsung,skip_cmd_set_on_splash_enabled; + samsung,aot_reset_regulator_late; + + /* ************************************************************* + * Tx + * ************************************************************* + */ + + //samsung,mdnie_tx_cmds_revA = [ + // 39 01 00 00 00 00 00 00 00 + //]; + + samsung,packet_size_tx_cmds_revA = [ + 37 01 00 00 00 00 02 07 00 + ]; + + /* use poinging gpara (long write) */ + samsung,reg_read_pos_tx_cmds_revA = [ + 29 00 00 00 00 00 03 B0 00 00 + ]; + + /* ************************************************************* + * Rx (Module Information READ) + * ************************************************************* + */ + //samsung,mdnie_read_rx_cmds_revA = [06 01 00 00 00 00 01 A1 04 00]; /* White color position */ + //samsung,manufacture_date_rx_cmds_revA = [06 01 00 00 00 00 01 A1 04 04]; /* manufacture data 4 byte*/ + //samsung,octa_id_rx_cmds_revA = [06 01 00 00 00 00 01 A1 14 0B]; /* manufacture information */ + //samsung,cell_id_rx_cmds_revA = [06 01 00 00 00 00 01 A1 07 04]; /* manufacture data 7 byte*/ + //samsung,ddi_id_rx_cmds_revA = [06 01 00 00 00 00 01 d6 05 00]; /* CHIP ID : read D6 1~5th */ + + /* Change mipi type from 0x06 to 0x14 for normal mipi read response */ + samsung,manufacture_id0_rx_cmds_revA = [14 01 00 00 00 00 02 da 01 00]; + samsung,manufacture_id1_rx_cmds_revA = [14 01 00 00 00 00 02 db 01 00]; + samsung,manufacture_id2_rx_cmds_revA = [14 01 00 00 00 00 02 dc 01 00]; + + /* 255 bytes, its ddi max size is 512, and sw limit is ff = 255... */ + //samsung,ldi_debug_logbuf_rx_cmds_revA = [06 01 00 00 00 00 01 9C FF 00]; + + samsung,mtp_read_sysfs_rx_cmds_revA = [06 01 00 00 00 00 01 00 00 00]; + + samsung,mtp_write_sysfs_tx_cmds_revA = [ + 29 00 00 00 00 00 3D 00 + 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 + ]; + + /* ************************************************************* + * candela to index mappings + * ************************************************************** + */ + + samsung,brightness_tx_cmds_revA = [ + 39 01 00 00 00 00 03 51 08 00 + ]; + + + /* + * ************************************************************************************************************************ + * DMS (Dynamic Mode Switch) + * ************************************************************************************************************************ + */ + + qcom,mdss-dsi-display-timings { + hd { + qcom,display-topology = <1 0 1>; + qcom,default-topology-index = <0>; + qcom,mdss-dsi-timing-default; + + qcom,mdss-dsi-panel-width = <1200>; + qcom,mdss-dsi-panel-height = <2000>; + + qcom,mdss-dsi-h-pulse-width = <10>; + qcom,mdss-dsi-h-back-porch = <28>; + qcom,mdss-dsi-h-front-porch = <28>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-v-back-porch = <18>; + qcom,mdss-dsi-v-front-porch = <58>; + qcom,mdss-dsi-panel-clockrate = <949000000>; /* 949Mbps*/ + + qcom,mdss-dsi-panel-phy-timings = [00 1F 08 08 24 22 06 08 06 02 04 00]; + + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-mdp-transfer-time-us = <14866>; + + /*qcom,mdss-dsi-timing-switch-command; use samsung,panel_multires_XXX instead*/ + /*qcom,mdss-dsi-timing-switch-command-state;*/ + + qcom,mdss-dsi-on-command = [ + 39 00 00 00 00 00 04 B9 83 10 2E + + 39 00 00 00 00 00 02 E9 CD + 39 00 00 00 00 00 02 BB 01 + 39 00 00 00 00 00 02 E9 00 + + 39 00 00 00 00 00 02 FF 01 + /* Display mode */ + 39 00 00 00 00 00 12 BA + 70 03 A8 83 F2 80 00 0D 10 00 + 00 00 0F 3D 04 77 84 + /* Added for mipi short read response*/ + + /* PWM BRIGHTNESS SETTING */ + /* 39 00 00 00 00 00 03 51 08 00 */ + 39 00 00 00 00 00 02 53 24 + 39 00 00 00 00 00 04 C9 04 0B 5D + 39 00 00 00 00 00 04 CE 00 50 F0 + 39 00 00 00 00 00 03 D2 E8 E8 + 39 00 00 00 00 00 04 D9 04 01 02 + + 39 00 00 00 00 00 2D D5 + 03 02 01 00 07 06 05 04 18 18 + 24 24 19 19 18 18 19 19 21 20 + 23 22 18 18 18 18 18 18 18 18 + 18 18 18 18 18 18 18 18 18 18 + 18 18 18 18 + 39 00 00 00 00 00 2D D6 + 04 05 06 07 00 01 02 03 18 18 + 24 24 19 19 19 19 18 18 22 23 + 20 21 18 18 18 18 18 18 18 18 + 18 18 18 18 18 18 18 18 18 18 + 18 18 18 18 + 39 00 00 00 00 00 11 B4 + 80 60 01 01 80 60 68 50 01 8E + 01 58 00 FF 00 FF + 39 00 00 00 00 00 2B D3 + 00 00 00 00 01 04 00 08 08 27 + 27 22 2F 23 23 04 04 32 10 21 + 00 21 32 10 1F 00 02 32 17 FD + 00 10 00 00 20 30 01 55 21 38 + 01 55 + 39 00 00 00 00 00 05 D1 67 0C FF 05 + + 39 00 00 00 00 00 12 B1 + 10 FA AF AF 29 2D B2 57 4D 36 + 36 36 36 22 21 15 00 + 39 00 00 00 00 00 09 B2 00 B0 47 D0 00 14 3C 2E + + 39 00 00 00 00 00 2F E0 + 00 01 0A 11 19 2B 44 4C 55 53 + 71 76 7D 8C 89 91 9A AD AC 56 + 5E 68 73 00 09 12 19 1F 37 4E + 54 5B 57 6F 74 79 86 83 89 90 + A3 A2 50 58 64 73 + 39 00 00 00 00 00 0F C0 + 23 23 22 11 A2 13 00 80 00 00 + 08 00 63 63 + 39 00 00 00 00 00 02 CC 02 + + 39 00 00 00 00 00 07 C8 00 04 04 00 00 82 + 39 00 00 00 00 00 04 BF FC 85 80 + 39 00 00 00 00 00 04 D0 07 04 05 + + 39 00 00 00 00 00 02 BD 01 + 39 00 00 00 00 00 0A D3 01 00 FC 00 00 11 10 00 0E + + 39 00 00 00 00 00 02 BD 02 + 39 00 00 00 00 00 02 B4 4E + 39 00 00 00 00 00 02 BF F2 + 39 00 00 00 00 00 0D D8 + FF FF FF FF FF F0 FF FF FF FF + FF F0 + + 39 00 00 00 00 00 02 BD 00 + 39 00 00 00 00 00 17 E7 + 12 13 02 02 2B 00 0E 0E 00 02 + 27 76 1E 76 01 27 00 00 00 00 + 17 00 + 39 00 00 00 00 00 02 BD 01 + 39 00 00 00 00 00 08 E7 02 30 01 94 0D B8 0E + 39 00 00 00 00 00 02 BD 02 + 39 00 00 00 00 00 1D E7 + FF 01 FD 01 00 00 22 00 00 00 + 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 81 00 02 40 + + 39 00 00 00 00 00 02 BD 00 + 39 00 00 00 00 00 02 55 01 + 39 00 00 00 00 00 19 E4 + 25 41 2C 33 4C 66 81 99 B2 CC + E5 FF FF FF 03 1E 1E 1E 1E 00 + 00 05 01 14 + 39 00 00 00 00 00 02 BD 01 + 39 00 00 00 00 00 28 E4 + E1 E1 E1 E1 E1 E1 E1 E1 C7 B2 + A0 90 81 75 69 5F 55 4C 44 3D + 36 2F 2A 24 1E 19 14 10 0D 0B + 09 54 55 55 55 55 55 55 55 + + 39 00 00 00 00 00 02 BD 00 + 39 00 00 00 00 00 02 C1 01 + 39 00 00 00 00 00 02 BD 01 + 39 00 00 00 00 00 3B C1 + 01 04 08 0C 10 14 18 1C 20 24 + 27 2C 30 34 38 3C 40 44 48 4C + 54 5C 63 6B 73 7B 83 8A 92 9A + A2 AA B3 BA C1 CA D1 D9 E1 E9 + F1 F5 F7 F8 FA FC 00 40 4C 0B + E4 5F F7 F5 08 95 03 C0 + 39 00 00 00 00 00 02 BD 02 + 39 00 00 00 00 00 3B C1 + 00 04 08 0C 10 14 18 1C 20 24 + 28 2C 30 34 39 3D 41 45 48 4C + 55 5C 64 6C 74 7C 84 8B 93 9B + A3 AB B4 BB C3 CB D3 DB E3 EB + F3 F7 F9 FB FE FF 01 45 92 A1 + 5F 3B F7 FB 13 9B FF 00 + 39 00 00 00 00 00 02 BD 03 + 39 00 00 00 00 00 3B C1 + 00 04 08 0C 10 14 18 1C 20 24 + 28 2D 31 35 3A 3E 42 46 49 4E + 56 5E 66 6E 76 7E 85 8D 95 9D + A4 AC B5 BC C4 CC D4 DB E4 EC + F3 F7 F9 FC FE FF 15 9A FC 21 + 5C 40 18 0B 01 30 FC 00 + + 39 00 00 00 00 00 02 BD 00 + 39 00 00 00 00 00 03 E1 07 00 /* Code version */ + + 39 00 00 00 00 00 04 B9 83 10 2E /* CLOSE PASSWORD */ + + 05 01 00 00 7A 00 01 11 /* 122ms */ + 05 01 00 00 16 00 01 29 /* 22ms */ + ]; + + /* HX needs video packet while display off + * So move some to dsi-pre-off-command + */ + qcom,mdss-dsi-pre-off-command=[ + 05 01 00 00 14 00 02 28 00 + //05 00 00 00 78 00 02 10 00 + ]; + qcom,mdss-dsi-off-command = [ + //05 01 00 00 02 00 01 28 + 39 00 00 00 00 00 04 B9 83 10 2E + 39 00 00 00 00 00 02 E9 FF + 39 00 00 00 00 00 02 BF 02 + 39 00 00 00 00 00 02 E9 00 + 39 01 00 00 00 00 04 B9 00 00 00 + 05 01 00 00 2A 00 01 10 + ]; + + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + }; + }; + }; +}; + diff --git a/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_buck_isl98609_i2c.c b/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_buck_isl98609_i2c.c new file mode 100755 index 000000000000..634757a0ef78 --- /dev/null +++ b/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_buck_isl98609_i2c.c @@ -0,0 +1,249 @@ +/* + * isl98608_hw_i2c.c - Platform data for isl98608 buck driver + * + * Copyright (C) 2011 Samsung Electronics + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ +#include +#include +#include +#include +#include +#include +#include + +#include "ss_buck_isl98609_i2c.h" + +static int ss_buck_i2c_read(struct i2c_client *client, u8 addr, u8 *value) +{ + int retry = 3; + u8 wr[] = {addr}; + + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .buf = wr, + .len = 1 + }, { + .addr = client->addr, + .flags = I2C_M_RD, + .buf = value, + .len = 1 + }, + }; + int ret; + + do { + ret = i2c_transfer(client->adapter, msg, 2); + if (ret != 2) + pr_err("%s : client->addr 0x%02x read_addr 0x%02x error (ret == %d)\n", __func__, client->addr, addr, ret); + else + break; + } while (--retry); + + return ret; +} + +static int ss_buck_i2c_write(struct i2c_client *client, u8 addr, u8 value) +{ + int retry = 3; + u8 wr[] = {addr, value}; + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .buf = wr, + .len = 2 + } + }; + int ret; + + do { + ret = i2c_transfer(client->adapter, msg, 1); + if (ret != 1) { + pr_err("%s : addr 0x%02x value 0x%02x error (ret == %d)\n", __func__, + addr, value, ret); + } else + break; + } while (--retry); + + return ret; +} + +int ss_buck_i2c_read_ex(u8 addr, u8 *value) +{ + int retry = 3; + u8 wr[] = {addr}; + int ret = -1; + + /* Check if it probed or not, to prevent KP */ + if (!buck_pinfo.client) { + pr_err("%s : No isl98609 ic, not probed.\n", __func__); + } else { + struct i2c_msg msg[] = { + { + .addr = buck_pinfo.client->addr, + .flags = 0, + .buf = wr, + .len = 1 + }, { + .addr = buck_pinfo.client->addr, + .flags = I2C_M_RD, + .buf = value, + .len = 1 + }, + }; + + do { + ret = i2c_transfer(buck_pinfo.client->adapter, msg, 2); + if (ret != 2) + pr_err("%s : client->addr 0x%02x read_addr 0x%02x error (ret == %d)\n", __func__, + buck_pinfo.client->addr, addr, ret); + else + break; + } while (--retry); + } + + return ret; +} + + +/* return -1 if no isl98609 ic, not probed */ +int ss_buck_i2c_write_ex(u8 addr, u8 value) +{ + int retry = 3; + u8 wr[] = {addr, value}; + int ret = -1; + + /* Check if it probed or not, to prevent KP */ + if (!buck_pinfo.client) { + pr_err("%s : No isl98609 ic, not probed.\n", __func__); + } else { + struct i2c_msg msg[] = { + { + .addr = buck_pinfo.client->addr, + .flags = 0, + .buf = wr, + .len = 2 + } + }; + + do { + ret = i2c_transfer(buck_pinfo.client->adapter, msg, 1); + if (ret != 1) { + pr_err("%s : addr 0x%02x value 0x%02x error (ret == %d)\n", __func__, + addr, value, ret); + } else + break; + } while (--retry); + } + return ret; +} + +int ss_buck_isl98608_control(struct samsung_display_driver_data *vdd) +{ + u8 buf[2]; + u8 value = 0x08; //VN & VP 5.5V + + if (!buck_pinfo.client) { + LCD_ERR("error pinfo\n"); + return 0; + } + + if (unlikely(vdd->is_factory_mode)) { + if (ub_con_det_status(PRIMARY_DISPLAY_NDX)) { + LCD_ERR("Do not panel power on..\n"); + return 0; + } + } + + ss_buck_i2c_write(buck_pinfo.client, 0x06, 0x08); + ss_buck_i2c_write(buck_pinfo.client, 0x08, value); + ss_buck_i2c_write(buck_pinfo.client, 0x09, value); + + ss_buck_i2c_read(buck_pinfo.client, 0x08, &buf[0]); + ss_buck_i2c_read(buck_pinfo.client, 0x09, &buf[1]); + + if ((value != buf[0]) || (value != buf[1])) + LCD_INFO("0x%x 0x%x fail\n", buf[0], buf[1]); + else + LCD_INFO("0x%x 0x%x success\n", buf[0], buf[1]); + + return 0; +} + +static int ss_buck_isl98608_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); + + pr_info("%s \n", __func__); + + if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) { + pr_err("%s i2c check fail\n", __func__); + return -EIO; + } + + buck_pinfo.client = client; + + i2c_set_clientdata(client, &buck_pinfo); + + return 0; +} + +static int ss_buck_isl98608_remove(struct i2c_client *client) +{ + return 0; +} + +static const struct i2c_device_id ss_buck_isl98608_id[] = { + {"isl98608", 0}, + { } +}; +MODULE_DEVICE_TABLE(i2c, ss_buck_isl98608_id); + +static struct of_device_id ss_buck_isl98608_match_table[] = { + { .compatible = "isl98608,display_buck",}, + { } +}; + +struct i2c_driver ss_buck_isl98608_driver = { + .probe = ss_buck_isl98608_probe, + .remove = ss_buck_isl98608_remove, + .driver = { + .name = "isl98608", + .owner = THIS_MODULE, +#if IS_ENABLED(CONFIG_OF) + .of_match_table = of_match_ptr(ss_buck_isl98608_match_table), +#endif + }, + .id_table = ss_buck_isl98608_id, +}; + +int ss_buck_isl98608_init(void) +{ + + int ret = 0; + + ret = i2c_add_driver(&ss_buck_isl98608_driver); + if (ret) + pr_err("%s : ss_buck_isl98608_init registration failed. ret= %d\n", __func__, ret); + + return ret; +} + +void ss_buck_isl98608_exit(void) +{ + i2c_del_driver(&ss_buck_isl98608_driver); +} + +//module_init(ss_buck_isl98608_init); +//module_exit(ss_buck_isl98608_exit); + +//MODULE_DESCRIPTION("ss_buck_isl98608_i2c driver"); +//MODULE_LICENSE("GPL"); diff --git a/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_buck_isl98609_i2c.h b/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_buck_isl98609_i2c.h new file mode 100755 index 000000000000..c920f921193b --- /dev/null +++ b/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_buck_isl98609_i2c.h @@ -0,0 +1,22 @@ +/* + * isl98608_hw_i2c.h - Platform data for isl98608 buck driver + * + * Copyright (C) 2021 Samsung Electronics + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ +#include "../ss_dsi_panel_common.h" + +struct ss_buck_isl98608_info { + struct i2c_client *client; +}; + +static struct ss_buck_isl98608_info buck_pinfo; + +int ss_buck_i2c_read_ex(u8 addr, u8 *value); +int ss_buck_i2c_write_ex(u8 addr, u8 value); +int ss_buck_isl98608_control(struct samsung_display_driver_data *vdd); +int ss_buck_isl98608_init(void); diff --git a/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_dsi_panel_HX83102_TV104WUM.c b/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_dsi_panel_HX83102_TV104WUM.c new file mode 100755 index 000000000000..9b398d984bed --- /dev/null +++ b/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_dsi_panel_HX83102_TV104WUM.c @@ -0,0 +1,372 @@ +/* + * ================================================================= + * + * + * Description: samsung display panel file + * + * Company: Samsung Electronics Display Team + * + * ================================================================ + */ +/* + +Copyright (C) 2020, Samsung Electronics. All rights reserved. + +* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. +*/ +#include "ss_dsi_panel_HX83102_TV104WUM.h" + +/* AOD Mode status on AOD Service */ + +enum { + HLPM_CTRL_2NIT, + HLPM_CTRL_10NIT, + HLPM_CTRL_30NIT, + HLPM_CTRL_60NIT, + MAX_LPM_CTRL, +}; + +#define ALPM_REG 0x53 /* Register to control brightness level */ +#define ALPM_CTRL_REG 0xBB /* Register to cnotrol ALPM/HLPM mode */ + +#define IRC_MODERATO_MODE_VAL 0x61 +#define IRC_FLAT_GAMMA_MODE_VAL 0x21 + +static int samsung_panel_on_pre(struct samsung_display_driver_data *vdd) +{ + if (IS_ERR_OR_NULL(vdd)) { + LCD_ERR(": Invalid data vdd : 0x%zx", (size_t)vdd); + return false; + } + + LCD_INFO("+: ndx=%d\n", vdd->ndx); + + ss_panel_attach_set(vdd, true); + + return true; +} + +static int samsung_panel_on_post(struct samsung_display_driver_data *vdd) +{ + //ss_buck_isl98608_control(vdd); + return true; +} + +static char ss_panel_revision(struct samsung_display_driver_data *vdd) +{ + if (vdd->manufacture_id_dsi == PBA_ID) + ss_panel_attach_set(vdd, false); + else + ss_panel_attach_set(vdd, true); + + switch (ss_panel_rev_get(vdd)) { + case 0x00: + vdd->panel_revision = 'A'; + break; + default: + vdd->panel_revision = 'A'; + LCD_ERR("Invalid panel_rev(default rev : %c)\n", vdd->panel_revision); + break; + } + + vdd->panel_revision -= 'A'; + LCD_INFO_ONCE("panel_revision = %c %d \n", vdd->panel_revision + 'A', vdd->panel_revision); + + return (vdd->panel_revision + 'A'); +} + +/* Below value is config_display.xml data */ +#define config_screenBrightnessSettingMaximum (255) +#define config_screenBrightnessSettingDefault (128) +#define config_screenBrightnessSettingMinimum (2) +#define config_screenBrightnessSettingzero (0) + +/* Below value is pwm value & candela matching data at the 9bit 20khz PWM*/ +#define PWM_Outdoor (3553) //0x1CE 256~ 480CD +#define PWM_Maximum (2983) //0x17E 255 400CD +#define PWM_Default (1365) //0x85 125 190CD +#define PWM_Minimum (32) //4CD +#define PWM_ZERO (0) //0CD + +#define BIT_SHIFT 10 + +static struct dsi_panel_cmd_set *tft_pwm(struct samsung_display_driver_data *vdd, int *level_key) +{ + struct dsi_panel_cmd_set *pwm_cmds = ss_get_cmds(vdd, TX_BRIGHT_CTRL); + int bl_level = vdd->br_info.common_br.bl_level; + unsigned long long result; + unsigned long long multiple; + + if (IS_ERR_OR_NULL(vdd) || IS_ERR_OR_NULL(pwm_cmds)) { + LCD_ERR("Invalid data vdd : 0x%zx", (size_t)vdd); + return NULL; + } + + /* ?bit PWM */ + if (bl_level > config_screenBrightnessSettingMaximum) { + result = PWM_Outdoor; + } else if ((bl_level > config_screenBrightnessSettingDefault) && (bl_level <= config_screenBrightnessSettingMaximum)) { + /* + (((3030 - 1440 ) / (255 - 128)) * (bl_level - 128)) + 1400 + */ + multiple = (PWM_Maximum - PWM_Default); + multiple <<= BIT_SHIFT; + do_div(multiple, config_screenBrightnessSettingMaximum - config_screenBrightnessSettingDefault); + + result = (bl_level - config_screenBrightnessSettingDefault) * multiple; + result >>= BIT_SHIFT; + result += PWM_Default; + } else if ((bl_level > config_screenBrightnessSettingMinimum) && (bl_level <= config_screenBrightnessSettingDefault)) { + /* + (1400/128) * bl_level + */ + result = bl_level * PWM_Default; + result <<= BIT_SHIFT; + do_div(result, config_screenBrightnessSettingDefault); + result >>= BIT_SHIFT; + } else if ((bl_level > config_screenBrightnessSettingzero) && (bl_level <= config_screenBrightnessSettingMinimum)){ + result = PWM_Minimum; + } else + result = PWM_ZERO; + + pwm_cmds->cmds->ss_txbuf[1] = (u8)(result >> 8); + pwm_cmds->cmds->ss_txbuf[2] = (u8)(result & 0xFF); + + + LCD_INFO("bl_level : %d, tx_buf %x, %x\n", vdd->br_info.common_br.bl_level, + pwm_cmds->cmds->ss_txbuf[1], pwm_cmds->cmds->ss_txbuf[2]); + + *level_key = LEVEL_KEY_NONE; + + return pwm_cmds; +} + +static void make_brightness_packet(struct samsung_display_driver_data *vdd, + struct dsi_cmd_desc *packet, int *cmd_cnt, enum BR_TYPE br_type) +{ + if (br_type == BR_TYPE_NORMAL) { /* TFT: ~255, & 256 here*/ + if (vdd->dtsi_data.tft_common_support) { /* TFT PANEL */ + + /* TFM_PWM */ + ss_add_brightness_packet(vdd, BR_FUNC_TFT_PWM, packet, cmd_cnt); + + } + } else { + LCD_ERR("undefined br_type (%d) \n", br_type); + } + + return; +} + +static int ss_manufacture_date_read(struct samsung_display_driver_data *vdd) +{ + unsigned char date[8]; + int year, month, day; + int hour, min; + + if (IS_ERR_OR_NULL(vdd)) { + LCD_ERR("Invalid data vdd : 0x%zx", (size_t)vdd); + return false; + } + + /* Read mtp (EAh 8~14th) for manufacture date */ + if (ss_get_cmds(vdd, RX_MANUFACTURE_DATE)->count) { + ss_panel_data_read(vdd, RX_MANUFACTURE_DATE, date, LEVEL1_KEY); + + year = date[0] & 0xf0; + year >>= 4; + year += 2011; // 0 = 2011 year + month = date[0] & 0x0f; + day = date[1] & 0x1f; + hour = date[2] & 0x1f; + min = date[3] & 0x3f; + + vdd->manufacture_date_dsi = year * 10000 + month * 100 + day; + vdd->manufacture_time_dsi = hour * 100 + min; + + LCD_INFO("manufacture_date DSI%d = (%d%04d) - year(%d) month(%d) day(%d) hour(%d) min(%d)\n", + vdd->ndx, vdd->manufacture_date_dsi, vdd->manufacture_time_dsi, + year, month, day, hour, min); + + } else { + LCD_ERR("DSI%d no manufacture_date_rx_cmds cmds(%d)", vdd->ndx, vdd->panel_revision); + return false; + } + + return true; +} + +static int ss_ddi_id_read(struct samsung_display_driver_data *vdd) +{ + char ddi_id[5]; + int loop; + + if (IS_ERR_OR_NULL(vdd)) { + LCD_ERR("Invalid data vdd : 0x%zx", (size_t)vdd); + return false; + } + + /* Read mtp (D6h 1~5th) for CHIP ID */ + if (ss_get_cmds(vdd, RX_DDI_ID)->count) { + ss_panel_data_read(vdd, RX_DDI_ID, ddi_id, LEVEL1_KEY); + + for (loop = 0; loop < 5; loop++) + vdd->ddi_id_dsi[loop] = ddi_id[loop]; + + LCD_INFO("DSI%d : %02x %02x %02x %02x %02x\n", vdd->ndx, + vdd->ddi_id_dsi[0], vdd->ddi_id_dsi[1], + vdd->ddi_id_dsi[2], vdd->ddi_id_dsi[3], + vdd->ddi_id_dsi[4]); + } else { + LCD_ERR("DSI%d no ddi_id_rx_cmds cmds", vdd->ndx); + return false; + } + + return true; +} + +static int ss_cell_id_read(struct samsung_display_driver_data *vdd) +{ + char cell_id_buffer[MAX_CELL_ID] = {0,}; + int loop; + + if (IS_ERR_OR_NULL(vdd)) { + LCD_ERR("Invalid data vdd : 0x%zx", (size_t)vdd); + return false; + } + + /* Read Panel Unique Cell ID (C9h 19~34th) */ + if (ss_get_cmds(vdd, RX_CELL_ID)->count) { + memset(cell_id_buffer, 0x00, MAX_CELL_ID); + + ss_panel_data_read(vdd, RX_CELL_ID, cell_id_buffer, LEVEL1_KEY); + + for (loop = 0; loop < MAX_CELL_ID; loop++) + vdd->cell_id_dsi[loop] = cell_id_buffer[loop]; + + LCD_INFO("DSI%d: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", + vdd->ndx, vdd->cell_id_dsi[0], + vdd->cell_id_dsi[1], vdd->cell_id_dsi[2], + vdd->cell_id_dsi[3], vdd->cell_id_dsi[4], + vdd->cell_id_dsi[5], vdd->cell_id_dsi[6], + vdd->cell_id_dsi[7], vdd->cell_id_dsi[8], + vdd->cell_id_dsi[9], vdd->cell_id_dsi[10]); + + } else { + LCD_ERR("DSI%d no cell_id_rx_cmds cmd\n", vdd->ndx); + return false; + } + + return true; +} + +static int ss_octa_id_read(struct samsung_display_driver_data *vdd) +{ + if (IS_ERR_OR_NULL(vdd)) { + LCD_ERR("Invalid data vdd : 0x%zx", (size_t)vdd); + return false; + } + + /* Read Panel Unique OCTA ID (C9h 2nd~21th) */ + if (ss_get_cmds(vdd, RX_OCTA_ID)->count) { + memset(vdd->octa_id_dsi, 0x00, MAX_OCTA_ID); + + ss_panel_data_read(vdd, RX_OCTA_ID, + vdd->octa_id_dsi, LEVEL1_KEY); + + LCD_INFO("octa id: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", + vdd->octa_id_dsi[0], vdd->octa_id_dsi[1], + vdd->octa_id_dsi[2], vdd->octa_id_dsi[3], + vdd->octa_id_dsi[4], vdd->octa_id_dsi[5], + vdd->octa_id_dsi[6], vdd->octa_id_dsi[7], + vdd->octa_id_dsi[8], vdd->octa_id_dsi[9], + vdd->octa_id_dsi[10], vdd->octa_id_dsi[11], + vdd->octa_id_dsi[12], vdd->octa_id_dsi[13], + vdd->octa_id_dsi[14], vdd->octa_id_dsi[15], + vdd->octa_id_dsi[16], vdd->octa_id_dsi[17], + vdd->octa_id_dsi[18], vdd->octa_id_dsi[19]); + + } else { + LCD_ERR("DSI%d no octa_id_rx_cmds cmd\n", vdd->ndx); + return false; + } + + return true; +} + +static int samsung_panel_off_pre(struct samsung_display_driver_data *vdd) +{ + int rc = 0; + return rc; +} + +static int samsung_panel_off_post(struct samsung_display_driver_data *vdd) +{ + int rc = 0; + return rc; +} + +void HX83102_TV104WUM_WUXGA_init(struct samsung_display_driver_data *vdd) +{ + LCD_INFO("HX83102_TV104WUM : ++\n"); + LCD_INFO("%s\n", ss_get_panel_name(vdd)); + + /* Default Panel Power Status is OFF */ + vdd->panel_state = PANEL_PWR_OFF; + + /* ON/OFF */ + vdd->panel_func.samsung_panel_on_pre = samsung_panel_on_pre; + vdd->panel_func.samsung_panel_on_post = samsung_panel_on_post; + vdd->panel_func.samsung_panel_off_pre = samsung_panel_off_pre; + vdd->panel_func.samsung_panel_off_post = samsung_panel_off_post; + + /* DDI RX */ + vdd->panel_func.samsung_panel_revision = ss_panel_revision; + vdd->panel_func.samsung_manufacture_date_read = ss_manufacture_date_read; + vdd->panel_func.samsung_ddi_id_read = ss_ddi_id_read; + vdd->panel_func.samsung_cell_id_read = ss_cell_id_read; + vdd->panel_func.samsung_octa_id_read = ss_octa_id_read; + vdd->panel_func.samsung_elvss_read = NULL; + //vdd->panel_func.samsung_mdnie_read = ss_mdnie_read; + + /* Brightness PWM */ + vdd->panel_func.br_func[BR_FUNC_TFT_PWM] = tft_pwm; + /* Make brightness packet */ + vdd->panel_func.make_brightness_packet = make_brightness_packet; + + /* default brightness */ + //vdd->br_info.common_br.bl_level = 25500; + + /* mdnie */ + vdd->mdnie.support_mdnie = false; + + /* Enable panic on first pingpong timeout */ + //vdd->debug_data->panic_on_pptimeout = true; + + /* COLOR WEAKNESS */ + vdd->panel_func.color_weakness_ccb_on_off = NULL; + + /* COPR */ + //vdd->copr.panel_init = ss_copr_panel_init; + + /* ACL default ON */ + //vdd->br_info.acl_status = 1; + + /* Default br_info.temperature */ + vdd->br_info.temperature = 20; + + vdd->debug_data->print_cmds = false; + + ss_buck_isl98608_init(); + + LCD_INFO("HX83102_TV104WUM : --\n"); +} + diff --git a/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_dsi_panel_HX83102_TV104WUM.h b/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_dsi_panel_HX83102_TV104WUM.h new file mode 100755 index 000000000000..0ea7230590d0 --- /dev/null +++ b/drivers/gpu/drm/msm/samsung_lego/HX83102_TV104WUM/ss_dsi_panel_HX83102_TV104WUM.h @@ -0,0 +1,51 @@ +/* + * ================================================================= + * + * + * Description: samsung display panel file + * + * Company: Samsung Electronics + * + * ================================================================ + */ +/* + +Copyright (C) 2020, Samsung Electronics. All rights reserved. + +* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * +*/ +#ifndef SAMSUNG_DSI_PANEL_TD4150_BOE531_H +#define SAMSUNG_DSI_PANEL_TD4150_BOE531_H + +#include +#include "ss_dsi_panel_common.h" +#include "ss_buck_isl98609_i2c.h" + +#define MAX_BL_PF_LEVEL 255 +#define MAX_HBM_PF_LEVEL 365 /*BL control register is 10 bit*/ + +static unsigned int elvss_table[MAX_HBM_PF_LEVEL + 1] = { + [0 ... 255] = 0x0A, + [256 ... 266] = 0x13, + [267 ... 277] = 0x12, + [278 ... 288] = 0x11, + [289 ... 299] = 0x10, + [300 ... 310] = 0x0F, + [311 ... 321] = 0x0E, + [322 ... 332] = 0x0D, + [333 ... 343] = 0x0C, + [344 ... 354] = 0x0B, + [355 ... MAX_HBM_PF_LEVEL] = 0x0A, +}; + +#endif diff --git a/drivers/gpu/drm/msm/samsung_lego/Kconfig b/drivers/gpu/drm/msm/samsung_lego/Kconfig index e1f755524bdc..0025594bfd84 100755 --- a/drivers/gpu/drm/msm/samsung_lego/Kconfig +++ b/drivers/gpu/drm/msm/samsung_lego/Kconfig @@ -73,3 +73,11 @@ config PANEL_EA8076GA_AMS638VL01_FHD default n ---help--- MAGNA EA8076GA LDI 1080_2400 M42Q_Rev_00 + +config PANEL_HX83102_TV104WUM_WUXGA + depends on DISPLAY_SAMSUNG || DISPLAY_SAMSUNG_LEGO + bool "HIMAX HX83102 LDI" + default n + ---help--- + HIMAX HX83102 LDI 1200_2000 GTS6LITE + diff --git a/drivers/gpu/drm/msm/samsung_lego/Makefile b/drivers/gpu/drm/msm/samsung_lego/Makefile index 388ec9743ccd..3971f3817bd3 100755 --- a/drivers/gpu/drm/msm/samsung_lego/Makefile +++ b/drivers/gpu/drm/msm/samsung_lego/Makefile @@ -33,4 +33,7 @@ obj-$(CONFIG_PANEL_S6E3FC3_AMS667YM01_FHD) += S6E3FC3_AMS667YM01/ obj-$(CONFIG_PANEL_EA8076GA_AMS638VL01_FHD) += EA8076GA_AMS638VL01/ # M42_Rev_02 panel -obj-$(CONFIG_PANEL_S6E3FC3_AMS638YQ01_FHD) += S6E3FC3_AMS638YQ01/ \ No newline at end of file +obj-$(CONFIG_PANEL_S6E3FC3_AMS638YQ01_FHD) += S6E3FC3_AMS638YQ01/ + +# Tab S6 Lite R panel +obj-$(CONFIG_PANEL_HX83102_TV104WUM_WUXGA) += HX83102_TV104WUM/ \ No newline at end of file diff --git a/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS646YD04/dsi_panel_S6E3FC3_AMS646YD04_fhd_octa_cmd.dtsi b/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS646YD04/dsi_panel_S6E3FC3_AMS646YD04_fhd_octa_cmd.dtsi index c08a04c3e3ec..7cfe3c8cb7fa 100755 --- a/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS646YD04/dsi_panel_S6E3FC3_AMS646YD04_fhd_octa_cmd.dtsi +++ b/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS646YD04/dsi_panel_S6E3FC3_AMS646YD04_fhd_octa_cmd.dtsi @@ -98,6 +98,9 @@ samsung,support-optical-fingerprint; + /* To avoid garbage image data from wakeup */ + samsung,delayed-display-on = <1>; + samsung,support_vrr_based_bl; /* VRR Variable Refresh Rate */ samsung,esd-irq-trigger1 = "falling"; /* FG_ERR */ @@ -1300,9 +1303,26 @@ * APLPM * ************************************************************* */ + + /* TIG Enable */ + samsung,self_grid_on_revA = [ + 29 00 00 00 00 00 03 F0 5A 5A + 29 00 00 00 00 00 03 BF 01 00 + 29 01 00 00 11 00 03 F0 A5 A5 + ]; + + /* TIG Disable */ + samsung,self_grid_off_revA = [ + 29 01 00 00 11 00 03 F0 5A 5A /* delay 17ms after dipslay_on */ + 29 00 00 00 00 00 03 BF 00 00 + 29 01 00 00 00 00 03 F0 A5 A5 + ]; + samsung,lpm_on_tx_cmds_revG = [ 29 00 00 00 00 00 03 F0 5A 5A - 29 00 00 00 00 00 03 91 01 01 /* AOD Setting */ + 29 00 00 00 00 00 04 B0 00 4C F4 + 29 00 00 00 00 00 02 F4 28 /* VAINT Setting */ + 29 00 00 00 00 00 03 91 01 01 /* AOD Setting */ 29 00 00 00 00 00 02 53 27 29 00 00 00 00 00 04 B0 01 88 CB 29 00 00 00 00 00 08 CB 40 0A 00 00 00 00 40 /* HFP Setting */ @@ -1316,6 +1336,8 @@ samsung,lpm_on_tx_cmds_revA = [ 29 00 00 00 00 00 03 F0 5A 5A + 29 00 00 00 00 00 04 B0 00 4C F4 + 29 00 00 00 00 00 02 F4 28 /* VAINT Setting */ 29 00 00 00 00 00 03 91 01 01 29 01 00 00 00 00 02 53 26 /* 10ns dealy */ 29 00 00 00 00 00 02 F7 0F diff --git a/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS646YD04/ss_dsi_panel_S6E3FC3_AMS646YD04.c b/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS646YD04/ss_dsi_panel_S6E3FC3_AMS646YD04.c index a22083f7823c..3a1822a09470 100755 --- a/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS646YD04/ss_dsi_panel_S6E3FC3_AMS646YD04.c +++ b/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS646YD04/ss_dsi_panel_S6E3FC3_AMS646YD04.c @@ -795,7 +795,7 @@ static struct dsi_panel_cmd_set *ss_acl_off(struct samsung_display_driver_data * enum LPMON_CMD_ID { LPM_BL_CMDID_CTRL = 1, - LPM_ON_CMDID_BL = 2, + LPM_ON_CMDID_BL = 4, }; static void ss_set_panel_lpm_brightness(struct samsung_display_driver_data *vdd) @@ -855,28 +855,9 @@ static void ss_update_panel_lpm_ctrl_cmd(struct samsung_display_driver_data *vdd if (SS_IS_CMDS_NULL(set_lpm_on) || SS_IS_CMDS_NULL(set_lpm_off)) { LCD_ERR("No cmds for TX_LPM_ON/OFF\n"); - goto start_lpm_bl; - } - -#if 0 - /* LPM_ON: 1. HLPM/ALPM Control: 0x09: HLPM, 0x0B: ALPM */ - /* LPM_OFF: 1. Seamless Control For HLPM: 0x01: HLPM, 0x03: ALPM */ - switch (vdd->panel_lpm.mode) { - case HLPM_MODE_ON: - set_lpm_on->cmds[LPMON_CMDID_CTRL].ss_txbuf[1] = 0x029; - set_lpm_off->cmds[LPMOFF_CMDID_CTRL].ss_txbuf[1] = 0x01; - break; - case ALPM_MODE_ON: - set_lpm_on->cmds[LPMON_CMDID_CTRL].ss_txbuf[1] = 0x2B; - set_lpm_off->cmds[LPMOFF_CMDID_CTRL].ss_txbuf[1] = 0x03; - break; - default: - LCD_ERR("invalid lpm mode: %d\n", vdd->panel_lpm.mode); - break; + return; } -#endif -start_lpm_bl: /* LPM_ON: 3. HLPM brightness */ /* should restore normal brightness in LPM off sequence to prevent flicker.. */ switch (vdd->panel_lpm.lpm_bl_level) { diff --git a/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS667YM01/dsi_panel_S6E3FC3_AMS667YM01_fhd_octa_cmd.dtsi b/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS667YM01/dsi_panel_S6E3FC3_AMS667YM01_fhd_octa_cmd.dtsi index b821e03385e2..32620cc7ae8c 100755 --- a/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS667YM01/dsi_panel_S6E3FC3_AMS667YM01_fhd_octa_cmd.dtsi +++ b/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS667YM01/dsi_panel_S6E3FC3_AMS667YM01_fhd_octa_cmd.dtsi @@ -98,6 +98,9 @@ samsung,support-optical-fingerprint; + /* To avoid garbage image data from wakeup */ + samsung,delayed-display-on = <1>; + samsung,support_vrr_based_bl; /* VRR Variable Refresh Rate */ //samsung,esd-irq-trigger1 = "falling"; /* DISP_DET */ @@ -1351,6 +1354,21 @@ * APLPM * ************************************************************* */ + + /* TIG Enable */ + samsung,self_grid_on_revA = [ + 29 00 00 00 00 00 03 F0 5A 5A + 29 00 00 00 00 00 03 BF 01 00 + 29 01 00 00 11 00 03 F0 A5 A5 + ]; + + /* TIG Disable */ + samsung,self_grid_off_revA = [ + 29 01 00 00 11 00 03 F0 5A 5A /* delay 17ms after dipslay_on */ + 29 00 00 00 00 00 03 BF 00 00 + 29 01 00 00 00 00 03 F0 A5 A5 + ]; + samsung,lpm_on_tx_cmds_revG = [ 29 00 00 00 00 00 03 F0 5A 5A 29 00 00 00 00 00 03 91 01 01 /* AOD Setting */ diff --git a/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS667YM01/ss_dsi_panel_S6E3FC3_AMS667YM01.c b/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS667YM01/ss_dsi_panel_S6E3FC3_AMS667YM01.c index 4ef312e47356..5fa5be7a47fb 100755 --- a/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS667YM01/ss_dsi_panel_S6E3FC3_AMS667YM01.c +++ b/drivers/gpu/drm/msm/samsung_lego/S6E3FC3_AMS667YM01/ss_dsi_panel_S6E3FC3_AMS667YM01.c @@ -849,28 +849,9 @@ static void ss_update_panel_lpm_ctrl_cmd(struct samsung_display_driver_data *vdd if (SS_IS_CMDS_NULL(set_lpm_on) || SS_IS_CMDS_NULL(set_lpm_off)) { LCD_ERR("No cmds for TX_LPM_ON/OFF\n"); - goto start_lpm_bl; - } - -#if 0 - /* LPM_ON: 1. HLPM/ALPM Control: 0x09: HLPM, 0x0B: ALPM */ - /* LPM_OFF: 1. Seamless Control For HLPM: 0x01: HLPM, 0x03: ALPM */ - switch (vdd->panel_lpm.mode) { - case HLPM_MODE_ON: - set_lpm_on->cmds[LPMON_CMDID_CTRL].ss_txbuf[1] = 0x029; - set_lpm_off->cmds[LPMOFF_CMDID_CTRL].ss_txbuf[1] = 0x01; - break; - case ALPM_MODE_ON: - set_lpm_on->cmds[LPMON_CMDID_CTRL].ss_txbuf[1] = 0x2B; - set_lpm_off->cmds[LPMOFF_CMDID_CTRL].ss_txbuf[1] = 0x03; - break; - default: - LCD_ERR("invalid lpm mode: %d\n", vdd->panel_lpm.mode); - break; + return; } -#endif -start_lpm_bl: /* LPM_ON: 3. HLPM brightness */ /* should restore normal brightness in LPM off sequence to prevent flicker.. */ switch (vdd->panel_lpm.lpm_bl_level) { diff --git a/drivers/gpu/drm/msm/samsung_lego/ss_dsi_panel_common.c b/drivers/gpu/drm/msm/samsung_lego/ss_dsi_panel_common.c index 9e8f0d45657a..824d7e2a1c11 100755 --- a/drivers/gpu/drm/msm/samsung_lego/ss_dsi_panel_common.c +++ b/drivers/gpu/drm/msm/samsung_lego/ss_dsi_panel_common.c @@ -4963,6 +4963,19 @@ static void ss_panel_parse_dt(struct samsung_display_driver_data *vdd) LCD_INFO("aot_enable : %s\n", vdd->aot_enable ? "aot_enable support" : "aot_enable doesn't support"); + vdd->aot_reset_regulator = of_property_read_bool(np, "samsung,aot_reset_regulator"); + LCD_INFO("aot_reset_regulator : %s\n", + vdd->aot_reset_regulator ? "aot_reset_regulator enabled" : "Not aot_reset_regulator"); + + vdd->aot_reset_regulator_late = of_property_read_bool(np, "samsung,aot_reset_regulator_late"); + LCD_INFO("aot_reset_regulator_late : %s\n", + vdd->aot_reset_regulator_late ? "aot_reset_regulator LATE enabled" : "Not aot_reset_regulator LATE"); + + /* TDDI, touch notify esd when no esd gpio from ddi */ + vdd->esd_touch_notify = of_property_read_bool(np, "samsung,esd_touch_notify"); + LCD_INFO("esd_touch_notify is %s\n", + vdd->esd_touch_notify ? "enabled" : "Not supported"); + /* Read module ID at probe timing */ vdd->support_early_id_read = of_property_read_bool(np, "samsung,support_early_id_read"); LCD_INFO("support_early_id_read : %s\n", @@ -5018,6 +5031,10 @@ static void ss_panel_parse_dt(struct samsung_display_driver_data *vdd) LCD_INFO("lp11_sleep_ms_time : %d\n", vdd->lp11_sleep_ms_time); + /* skip DSI_CMD_SET_ON durning splash booting */ + vdd->skip_cmd_set_on_splash_enabled = of_property_read_bool(np, "samsung,skip_cmd_set_on_splash_enabled"); + LCD_INFO("skip_cmd_set_on_splash_enabled [%s]\n", vdd->skip_cmd_set_on_splash_enabled ? "enabled" : "disabled"); + /* (mafpc) (self_display) (test_mode) have dependent dtsi file */ ss_mafpc_parse_dt(vdd); ss_self_disp_parse_dt(vdd); @@ -7406,6 +7423,10 @@ int samsung_panel_initialize(char *panel_string, unsigned int ndx) #if defined(CONFIG_PANEL_EA8076GA_AMS638VL01_FHD) else if (!strncmp(panel_string, "ss_dsi_panel_EA8076GA_AMS638VL01_FHD", strlen(panel_string))) vdd->panel_func.samsung_panel_init = EA8076GA_AMS638VL01_FHD_init; +#endif +#if defined(CONFIG_PANEL_HX83102_TV104WUM_WUXGA) + else if (!strncmp(panel_string, "ss_dsi_panel_HX83102_TV104WUM_WUXGA", strlen(panel_string))) + vdd->panel_func.samsung_panel_init = HX83102_TV104WUM_WUXGA_init; #endif else { LCD_ERR("%s not found\n", panel_string); diff --git a/drivers/gpu/drm/msm/samsung_lego/ss_dsi_panel_common.h b/drivers/gpu/drm/msm/samsung_lego/ss_dsi_panel_common.h index 678d8a96fa39..3ba33bba2266 100755 --- a/drivers/gpu/drm/msm/samsung_lego/ss_dsi_panel_common.h +++ b/drivers/gpu/drm/msm/samsung_lego/ss_dsi_panel_common.h @@ -1307,6 +1307,7 @@ void EA8076GA_AMS638VL01_FHD_init(struct samsung_display_driver_data *vdd); void S6E3FC3_AMS667YM01_FHD_init(struct samsung_display_driver_data *vdd); void S6E3FC3_AMS646YD04_FHD_init(struct samsung_display_driver_data *vdd); void S6E3FC3_AMS638YQ01_FHD_init(struct samsung_display_driver_data *vdd); +void HX83102_TV104WUM_WUXGA_init(struct samsung_display_driver_data *vdd); struct panel_func { /* ON/OFF */ @@ -2197,6 +2198,9 @@ struct samsung_display_driver_data { int samsung_splash_enabled; + int cmd_set_on_splash_enabled; + int skip_cmd_set_on_splash_enabled; + /* UB CON DETECT */ struct ub_con_detect ub_con_det; @@ -2241,6 +2245,37 @@ struct samsung_display_driver_data { */ bool aot_enable; + /* AOT support : tddi video panel (Himax) + * Make reset from gpio to regulator + * to control it with touch module + * reset regulator name will be "panel_reset" + * (Power on - reset) + */ + bool aot_reset_regulator; + + /* To call reset seq later then LP11 + * (Power on - LP11 - Reset) + * Only position change of aot_reset_regulator. + * Should not be with panel->lp11_init + */ + bool aot_reset_regulator_late; + + /* + * Condition : TFT has boost_en + * Boost_en should be turned off right after pwm 0 for Tabs7+Lite + * To prevent (fault diode) reverse-voltage loading at backlight input + */ + bool boost_early_off; + /* + * Condition : TFT has boost_en + * Boost_en should be turned on if early off && br goes up for Tabs7+Lite + */ + bool boost_off_while_working; + + /* Some TDDI (Himax) panel can get esd noti from touch driver */ + bool esd_touch_notify; + struct notifier_block nb_esd_touch; + int check_fw_id; /* save ddi_fw id (revision)*/ bool is_recovery_mode; diff --git a/drivers/gpu/drm/msm/sde_dbg.c b/drivers/gpu/drm/msm/sde_dbg.c index aca7e4f4c0a7..1bd0f5e4ec91 100755 --- a/drivers/gpu/drm/msm/sde_dbg.c +++ b/drivers/gpu/drm/msm/sde_dbg.c @@ -5167,19 +5167,15 @@ int sde_dbg_debugfs_register(struct device *dev) &sde_recovery_vbif_dbgbus_fops); if (dbg->dbgbus_sde.entries) { - dbg->dbgbus_sde.cmn.name = DBGBUS_NAME_SDE; snprintf(debug_name, sizeof(debug_name), "%s_dbgbus", dbg->dbgbus_sde.cmn.name); - dbg->dbgbus_sde.cmn.enable_mask = DEFAULT_DBGBUS_SDE; debugfs_create_u32(debug_name, 0600, debugfs_root, &dbg->dbgbus_sde.cmn.enable_mask); } if (dbg->dbgbus_vbif_rt.entries) { - dbg->dbgbus_vbif_rt.cmn.name = DBGBUS_NAME_VBIF_RT; snprintf(debug_name, sizeof(debug_name), "%s_dbgbus", dbg->dbgbus_vbif_rt.cmn.name); - dbg->dbgbus_vbif_rt.cmn.enable_mask = DEFAULT_DBGBUS_VBIFRT; debugfs_create_u32(debug_name, 0600, debugfs_root, &dbg->dbgbus_vbif_rt.cmn.enable_mask); } @@ -5223,10 +5219,14 @@ void sde_dbg_init_dbg_buses(u32 hwversion) dbg->dbgbus_sde.entries = dbg_bus_sde_8998; dbg->dbgbus_sde.cmn.entries_size = ARRAY_SIZE(dbg_bus_sde_8998); dbg->dbgbus_sde.cmn.flags = DBGBUS_FLAGS_DSPP; + dbg->dbgbus_sde.cmn.name = DBGBUS_NAME_SDE; + dbg->dbgbus_sde.cmn.enable_mask = DEFAULT_DBGBUS_SDE; dbg->dbgbus_vbif_rt.entries = vbif_dbg_bus_msm8998; dbg->dbgbus_vbif_rt.cmn.entries_size = ARRAY_SIZE(vbif_dbg_bus_msm8998); + dbg->dbgbus_vbif_rt.cmn.name = DBGBUS_NAME_VBIF_RT; + dbg->dbgbus_vbif_rt.cmn.enable_mask = DEFAULT_DBGBUS_VBIFRT; dbg->dbgbus_dsi.entries = NULL; dbg->dbgbus_dsi.size = 0; } else if (IS_SDM845_TARGET(hwversion) || IS_SDM670_TARGET(hwversion)) { @@ -5234,11 +5234,15 @@ void sde_dbg_init_dbg_buses(u32 hwversion) dbg->dbgbus_sde.cmn.entries_size = ARRAY_SIZE(dbg_bus_sde_sdm845); dbg->dbgbus_sde.cmn.flags = DBGBUS_FLAGS_DSPP; + dbg->dbgbus_sde.cmn.name = DBGBUS_NAME_SDE; + dbg->dbgbus_sde.cmn.enable_mask = DEFAULT_DBGBUS_SDE; /* vbif is unchanged vs 8998 */ dbg->dbgbus_vbif_rt.entries = vbif_dbg_bus_msm8998; dbg->dbgbus_vbif_rt.cmn.entries_size = ARRAY_SIZE(vbif_dbg_bus_msm8998); + dbg->dbgbus_vbif_rt.cmn.name = DBGBUS_NAME_VBIF_RT; + dbg->dbgbus_vbif_rt.cmn.enable_mask = DEFAULT_DBGBUS_VBIFRT; dbg->dbgbus_dsi.entries = dsi_dbg_bus_sdm845; dbg->dbgbus_dsi.size = ARRAY_SIZE(dsi_dbg_bus_sdm845); } else if (IS_SM8150_TARGET(hwversion) || IS_SM6150_TARGET(hwversion) || @@ -5249,12 +5253,16 @@ void sde_dbg_init_dbg_buses(u32 hwversion) dbg->dbgbus_sde.cmn.entries_size = ARRAY_SIZE(dbg_bus_sde_sm8150); dbg->dbgbus_sde.cmn.flags = DBGBUS_FLAGS_DSPP; + dbg->dbgbus_sde.cmn.name = DBGBUS_NAME_SDE; + dbg->dbgbus_sde.cmn.enable_mask = DEFAULT_DBGBUS_SDE; dbg->dbgbus_vbif_rt.entries = vbif_dbg_bus_msm8998; dbg->dbgbus_vbif_rt.cmn.entries_size = ARRAY_SIZE(vbif_dbg_bus_msm8998); dbg->dbgbus_dsi.entries = dsi_dbg_bus_sdm845; dbg->dbgbus_dsi.size = ARRAY_SIZE(dsi_dbg_bus_sdm845); + dbg->dbgbus_vbif_rt.cmn.name = DBGBUS_NAME_VBIF_RT; + dbg->dbgbus_vbif_rt.cmn.enable_mask = DEFAULT_DBGBUS_VBIFRT; } else { pr_err("unsupported chipset id %X\n", hwversion); } diff --git a/drivers/gpu/msm/a6xx_reg.h b/drivers/gpu/msm/a6xx_reg.h index b9aaaeda001d..bb11971f7df3 100755 --- a/drivers/gpu/msm/a6xx_reg.h +++ b/drivers/gpu/msm/a6xx_reg.h @@ -1,4 +1,5 @@ /* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -398,6 +399,8 @@ #define A6XX_RBBM_PERFCTR_RBBM_SEL_2 0x509 #define A6XX_RBBM_PERFCTR_RBBM_SEL_3 0x50A #define A6XX_RBBM_PERFCTR_GPU_BUSY_MASKED 0x50B +#define A6XX_RBBM_PERFCTR_SRAM_INIT_CMD 0x50e +#define A6XX_RBBM_PERFCTR_SRAM_INIT_STATUS 0x50f #define A6XX_RBBM_ISDB_CNT 0x533 #define A6XX_RBBM_NC_MODE_CNTL 0x534 diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index 3a47c03c9cd7..2c0daf71756d 100755 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -1,4 +1,5 @@ /* Copyright (c) 2002,2007-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1444,6 +1445,8 @@ static int adreno_probe(struct platform_device *pdev) adreno_debugfs_init(adreno_dev); adreno_profile_init(adreno_dev); + + adreno_dev->perfcounter = false; adreno_sysfs_init(adreno_dev); diff --git a/drivers/gpu/msm/adreno.h b/drivers/gpu/msm/adreno.h index 1cc4fc05fac5..a3016d77c091 100755 --- a/drivers/gpu/msm/adreno.h +++ b/drivers/gpu/msm/adreno.h @@ -1,4 +1,5 @@ /* Copyright (c) 2008-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -34,6 +35,9 @@ #define DEVICE_3D_NAME "kgsl-3d" #define DEVICE_3D0_NAME "kgsl-3d0" +/* Index to preemption scratch buffer to store KMD postamble */ +#define KMD_POSTAMBLE_IDX 100 + /* ADRENO_DEVICE - Given a kgsl_device return the adreno device struct */ #define ADRENO_DEVICE(device) \ container_of(device, struct adreno_device, dev) @@ -263,6 +267,9 @@ struct adreno_gpudev; /* Time to allow preemption to complete (in ms) */ #define ADRENO_PREEMPT_TIMEOUT 10000 +#define PREEMPT_SCRATCH_ADDR(dev, id) \ + ((dev)->preempt.scratch.gpuaddr + (id * sizeof(u64))) + #define ADRENO_INT_BIT(a, _bit) (((a)->gpucore->gpudev->int_bits) ? \ (adreno_get_int(a, _bit) < 0 ? 0 : \ BIT(adreno_get_int(a, _bit))) : 0) @@ -299,6 +306,7 @@ enum adreno_preempt_states { * skipsaverestore: To skip saverestore during L1 preemption (for 6XX) * usesgmem: enable GMEM save/restore across preemption (for 6XX) * count: Track the number of preemptions triggered + * @postamble_len: Number of dwords in KMD postamble pm4 packet */ struct adreno_preemption { atomic_t state; @@ -310,6 +318,7 @@ struct adreno_preemption { bool skipsaverestore; bool usesgmem; unsigned int count; + u32 postamble_len; }; @@ -604,6 +613,11 @@ struct adreno_device { void *zap_handle_ptr; unsigned int soc_hw_rev; bool gaming_bin; + /* + * @perfcounter: Flag to clear perfcounters across contexts and + * controls perfcounter ioctl read + */ + bool perfcounter; }; /** diff --git a/drivers/gpu/msm/adreno_a6xx_preempt.c b/drivers/gpu/msm/adreno_a6xx_preempt.c index ae757f379f76..4fb89e2d7384 100755 --- a/drivers/gpu/msm/adreno_a6xx_preempt.c +++ b/drivers/gpu/msm/adreno_a6xx_preempt.c @@ -1,4 +1,5 @@ /* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -725,13 +726,27 @@ unsigned int a6xx_preemption_pre_ibsubmit( if (context) { struct adreno_context *drawctxt = ADRENO_CONTEXT(context); struct adreno_ringbuffer *rb = drawctxt->rb; - uint64_t dest = adreno_dev->preempt.scratch.gpuaddr + - sizeof(u64) * rb->id; + uint64_t dest = PREEMPT_SCRATCH_ADDR(adreno_dev, rb->id); *cmds++ = cp_mem_packet(adreno_dev, CP_MEM_WRITE, 2, 2); cmds += cp_gpuaddr(adreno_dev, cmds, dest); *cmds++ = lower_32_bits(gpuaddr); *cmds++ = upper_32_bits(gpuaddr); + + /* + * Add a KMD post amble to clear the perf counters during + * preemption + */ + if (!adreno_dev->perfcounter) { + u64 kmd_postamble_addr = + PREEMPT_SCRATCH_ADDR(adreno_dev, KMD_POSTAMBLE_IDX); + + *cmds++ = cp_type7_packet(CP_SET_AMBLE, 3); + *cmds++ = lower_32_bits(kmd_postamble_addr); + *cmds++ = upper_32_bits(kmd_postamble_addr); + *cmds++ = ((CP_KMD_AMBLE_TYPE << 20) | GENMASK(22, 20)) + | (adreno_dev->preempt.postamble_len | GENMASK(19, 0)); + } } return (unsigned int) (cmds - cmds_orig); @@ -744,8 +759,7 @@ unsigned int a6xx_preemption_post_ibsubmit(struct adreno_device *adreno_dev, struct adreno_ringbuffer *rb = adreno_dev->cur_rb; if (rb) { - uint64_t dest = adreno_dev->preempt.scratch.gpuaddr + - sizeof(u64) * rb->id; + uint64_t dest = PREEMPT_SCRATCH_ADDR(adreno_dev, rb->id); *cmds++ = cp_mem_packet(adreno_dev, CP_MEM_WRITE, 2, 2); cmds += cp_gpuaddr(adreno_dev, cmds, dest); @@ -968,6 +982,33 @@ int a6xx_preemption_init(struct adreno_device *adreno_dev) addr += A6XX_CP_CTXRECORD_PREEMPTION_COUNTER_SIZE; } + /* + * First 8 dwords of the preemption scratch buffer is used to store the + * address for CP to save/restore VPC data. Reserve 11 dwords in the + * preemption scratch buffer from index KMD_POSTAMBLE_IDX for KMD + * postamble pm4 packets + */ + if (!adreno_dev->perfcounter) { + u32 *postamble = preempt->scratch.hostptr + + (KMD_POSTAMBLE_IDX * sizeof(u64)); + u32 count = 0; + + postamble[count++] = cp_type7_packet(CP_REG_RMW, 3); + postamble[count++] = A6XX_RBBM_PERFCTR_SRAM_INIT_CMD; + postamble[count++] = 0x0; + postamble[count++] = 0x1; + + postamble[count++] = cp_type7_packet(CP_WAIT_REG_MEM, 6); + postamble[count++] = 0x3; + postamble[count++] = A6XX_RBBM_PERFCTR_SRAM_INIT_STATUS; + postamble[count++] = 0x0; + postamble[count++] = 0x1; + postamble[count++] = 0x1; + postamble[count++] = 0x0; + + preempt->postamble_len = count; + } + ret = a6xx_preemption_iommu_init(adreno_dev); err: diff --git a/drivers/gpu/msm/adreno_compat.c b/drivers/gpu/msm/adreno_compat.c index 8292a944dc4f..a144097de5d2 100755 --- a/drivers/gpu/msm/adreno_compat.c +++ b/drivers/gpu/msm/adreno_compat.c @@ -1,4 +1,5 @@ /* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -230,6 +231,14 @@ static long adreno_ioctl_perfcounter_read_compat( struct kgsl_perfcounter_read_compat *read32 = data; struct kgsl_perfcounter_read read; + /* + * When performance counter zapping is enabled, the counters are cleared + * across context switches. Reading the counters when they are zapped is + * not permitted. + */ + if (!adreno_dev->perfcounter) + return -EPERM; + read.reads = (struct kgsl_perfcounter_read_group __user *) (uintptr_t)read32->reads; read.count = read32->count; diff --git a/drivers/gpu/msm/adreno_dispatch.c b/drivers/gpu/msm/adreno_dispatch.c index 1d0b39ae2c6a..2042c42e08dd 100755 --- a/drivers/gpu/msm/adreno_dispatch.c +++ b/drivers/gpu/msm/adreno_dispatch.c @@ -1,5 +1,5 @@ /* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. - * + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. @@ -1140,7 +1140,8 @@ static inline bool _verify_ib(struct kgsl_device_private *dev_priv, } /* Make sure that the address is mapped */ - if (!kgsl_mmu_gpuaddr_in_range(private->pagetable, ib->gpuaddr)) { + if (!kgsl_mmu_gpuaddr_in_range(private->pagetable, ib->gpuaddr, + ib->size)) { pr_context(device, context, "ctxt %d invalid ib gpuaddr %llX\n", context->id, ib->gpuaddr); return false; diff --git a/drivers/gpu/msm/adreno_ioctl.c b/drivers/gpu/msm/adreno_ioctl.c index d18aa19ad563..9ff82d6b419a 100755 --- a/drivers/gpu/msm/adreno_ioctl.c +++ b/drivers/gpu/msm/adreno_ioctl.c @@ -1,4 +1,5 @@ /* Copyright (c) 2002,2007-2018,2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -141,6 +142,14 @@ static long adreno_ioctl_perfcounter_read(struct kgsl_device_private *dev_priv, struct adreno_device *adreno_dev = ADRENO_DEVICE(dev_priv->device); struct kgsl_perfcounter_read *read = data; + /* + * When performance counter zapping is enabled, the counters are cleared + * across context switches. Reading the counters when they are zapped is + * not permitted. + */ + if (!adreno_dev->perfcounter) + return -EPERM; + return (long) adreno_perfcounter_read_group(adreno_dev, read->reads, read->count); } diff --git a/drivers/gpu/msm/adreno_iommu.c b/drivers/gpu/msm/adreno_iommu.c index 0fb74151ca0a..db6dff213581 100755 --- a/drivers/gpu/msm/adreno_iommu.c +++ b/drivers/gpu/msm/adreno_iommu.c @@ -1,4 +1,5 @@ /* Copyright (c) 2002,2007-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -13,6 +14,7 @@ #include "adreno.h" #include "kgsl_sharedmem.h" #include "a3xx_reg.h" +#include "a6xx_reg.h" #include "adreno_pm4types.h" #define A5XX_PFP_PER_PROCESS_UCODE_VER 0x5FF064 @@ -586,6 +588,12 @@ static unsigned int _adreno_iommu_set_pt_v2_a6xx(struct kgsl_device *device, cmds += _adreno_iommu_add_idle_cmds(adreno_dev, cmds); cmds += cp_wait_for_me(adreno_dev, cmds); + /* Clear performance counters during contect switches */ + if (!adreno_dev->perfcounter) { + *cmds++ = cp_type4_packet(A6XX_RBBM_PERFCTR_SRAM_INIT_CMD, 1); + *cmds++ = 0x1; + } + /* CP switches the pagetable and flushes the Caches */ *cmds++ = cp_packet(adreno_dev, CP_SMMU_TABLE_UPDATE, 4); *cmds++ = lower_32_bits(ttbr0); @@ -605,6 +613,17 @@ static unsigned int _adreno_iommu_set_pt_v2_a6xx(struct kgsl_device *device, cmds += _adreno_iommu_add_idle_cmds(adreno_dev, cmds); + /* Wait for performance counter clear to finish */ + if (!adreno_dev->perfcounter) { + *cmds++ = cp_type7_packet(CP_WAIT_REG_MEM, 6); + *cmds++ = 0x3; + *cmds++ = A6XX_RBBM_PERFCTR_SRAM_INIT_STATUS; + *cmds++ = 0x0; + *cmds++ = 0x1; + *cmds++ = 0x1; + *cmds++ = 0x0; + } + return cmds - cmds_orig; } diff --git a/drivers/gpu/msm/adreno_perfcounter.c b/drivers/gpu/msm/adreno_perfcounter.c index e7f2fd3f0d58..14053c0171a9 100755 --- a/drivers/gpu/msm/adreno_perfcounter.c +++ b/drivers/gpu/msm/adreno_perfcounter.c @@ -1,4 +1,5 @@ /* Copyright (c) 2002,2007-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -143,7 +144,8 @@ void adreno_perfcounter_restore(struct adreno_device *adreno_dev) struct adreno_perfcount_group *group; unsigned int counter, groupid; - if (counters == NULL) + /* Do not save/restore if not requested */ + if (counters == NULL || !adreno_dev->perfcounter) return; for (groupid = 0; groupid < counters->group_count; groupid++) { @@ -176,7 +178,8 @@ inline void adreno_perfcounter_save(struct adreno_device *adreno_dev) struct adreno_perfcount_group *group; unsigned int counter, groupid; - if (counters == NULL) + /* Do not save/restore if not requested */ + if (counters == NULL || !adreno_dev->perfcounter) return; for (groupid = 0; groupid < counters->group_count; groupid++) { diff --git a/drivers/gpu/msm/adreno_pm4types.h b/drivers/gpu/msm/adreno_pm4types.h index 543496399044..282138e01379 100755 --- a/drivers/gpu/msm/adreno_pm4types.h +++ b/drivers/gpu/msm/adreno_pm4types.h @@ -1,4 +1,5 @@ /* Copyright (c) 2002,2007-2017,2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -55,6 +56,9 @@ /* switches SMMU pagetable, used on a5xx only */ #define CP_SMMU_TABLE_UPDATE 0x53 +/* Designate command streams to be executed before/after state restore */ +#define CP_SET_AMBLE 0x55 + /* Set internal CP registers, used to indicate context save data addresses */ #define CP_SET_PSEUDO_REGISTER 0x56 @@ -162,6 +166,9 @@ #define CP_LOADSTATE_STATETYPE_SHIFT 0x00000000 #define CP_LOADSTATE_EXTSRCADDR_SHIFT 0x00000002 +/* Used to define amble type in SET_AMBLE packet to execute during preemption */ +#define CP_KMD_AMBLE_TYPE 3 + static inline uint pm4_calc_odd_parity_bit(uint val) { return (0x9669 >> (0xf & ((val) ^ diff --git a/drivers/gpu/msm/adreno_ringbuffer.c b/drivers/gpu/msm/adreno_ringbuffer.c index a8770413aa91..388818906b3f 100755 --- a/drivers/gpu/msm/adreno_ringbuffer.c +++ b/drivers/gpu/msm/adreno_ringbuffer.c @@ -1,4 +1,5 @@ /* Copyright (c) 2002,2007-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -592,7 +593,7 @@ adreno_ringbuffer_addcmds(struct adreno_ringbuffer *rb, if (gpudev->preemption_pre_ibsubmit && adreno_is_preemption_enabled(adreno_dev)) - total_sizedwords += 27; + total_sizedwords += 31; if (gpudev->preemption_post_ibsubmit && adreno_is_preemption_enabled(adreno_dev)) diff --git a/drivers/gpu/msm/adreno_sysfs.c b/drivers/gpu/msm/adreno_sysfs.c index 407c05b79bd3..13a5c0a67da8 100755 --- a/drivers/gpu/msm/adreno_sysfs.c +++ b/drivers/gpu/msm/adreno_sysfs.c @@ -1,4 +1,5 @@ /* Copyright (c) 2014-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -528,6 +529,31 @@ static int _acd_data_store(struct adreno_device *adreno_dev, unsigned int val) return 0; } +static unsigned int _perfcounter_show(struct adreno_device *adreno_dev) +{ + return adreno_dev->perfcounter; +} + +static int _perfcounter_store(struct adreno_device *adreno_dev, + unsigned int val) +{ + struct kgsl_device *device = KGSL_DEVICE(adreno_dev); + + if (adreno_dev->perfcounter == val) + return 0; + + mutex_lock(&device->mutex); + + /* Power down the GPU before changing the state */ + kgsl_pwrctrl_change_state(device, KGSL_STATE_SUSPEND); + adreno_dev->perfcounter = val; + kgsl_pwrctrl_change_state(device, KGSL_STATE_SLUMBER); + + mutex_unlock(&device->mutex); + + return 0; +} + static ssize_t _sysfs_store_u32(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) @@ -633,6 +659,7 @@ static ADRENO_SYSFS_BOOL(throttling); static ADRENO_SYSFS_BOOL(ifpc); static ADRENO_SYSFS_RO_U32(ifpc_count); static ADRENO_SYSFS_BOOL(acd); +static ADRENO_SYSFS_BOOL(perfcounter); static ADRENO_SYSFS_U32(acd_data_index); static ADRENO_SYSFS_U32(acd_version); @@ -662,6 +689,7 @@ static const struct device_attribute *_attr_list[] = { &adreno_attr_ifpc_count.attr, &adreno_attr_preempt_count.attr, &adreno_attr_acd.attr, + &adreno_attr_perfcounter.attr, &adreno_attr_acd_data_index.attr, &adreno_attr_acd_version.attr, &adreno_attr_acd_stride.attr, @@ -820,8 +848,11 @@ int adreno_sysfs_init(struct adreno_device *adreno_dev) ret = kgsl_create_device_sysfs_files(device->dev, _attr_list); /* Add the PPD directory and files */ - if (ret == 0) + if (ret == 0) { + /* Notify userspace */ + kobject_uevent(&device->dev->kobj, KOBJ_ADD); ppd_sysfs_init(adreno_dev); + } return 0; } diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index cdea3a6a53e5..2bbc88966670 100755 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -1543,7 +1543,7 @@ kgsl_sharedmem_find(struct kgsl_process_private *private, uint64_t gpuaddr) if (!private) return NULL; - if (!kgsl_mmu_gpuaddr_in_range(private->pagetable, gpuaddr)) + if (!kgsl_mmu_gpuaddr_in_range(private->pagetable, gpuaddr, 0)) return NULL; spin_lock(&private->mem_lock); @@ -2593,15 +2593,6 @@ static int kgsl_setup_anon_useraddr(struct kgsl_pagetable *pagetable, } #ifdef CONFIG_DMA_SHARED_BUFFER -static int match_file(const void *p, struct file *file, unsigned int fd) -{ - /* - * We must return fd + 1 because iterate_fd stops searching on - * non-zero return, but 0 is a valid fd. - */ - return (p == file) ? (fd + 1) : 0; -} - static void _setup_cache_mode(struct kgsl_mem_entry *entry, struct vm_area_struct *vma) { @@ -2639,8 +2630,6 @@ static int kgsl_setup_dmabuf_useraddr(struct kgsl_device *device, vma = find_vma(current->mm, hostptr); if (vma && vma->vm_file) { - int fd; - ret = check_vma_flags(vma, entry->memdesc.flags); if (ret) { up_read(¤t->mm->mmap_sem); @@ -2656,10 +2645,13 @@ static int kgsl_setup_dmabuf_useraddr(struct kgsl_device *device, return -EFAULT; } - /* Look for the fd that matches this the vma file */ - fd = iterate_fd(current->files, 0, match_file, vma->vm_file); - if (fd != 0) - dmabuf = dma_buf_get(fd - 1); + /* + * Take a refcount because dma_buf_put() decrements the + * refcount + */ + get_file(vma->vm_file); + + dmabuf = vma->vm_file->private_data; } if (IS_ERR_OR_NULL(dmabuf)) { diff --git a/drivers/gpu/msm/kgsl_drawobj.c b/drivers/gpu/msm/kgsl_drawobj.c index 05c41362e11d..5a0294c79761 100755 --- a/drivers/gpu/msm/kgsl_drawobj.c +++ b/drivers/gpu/msm/kgsl_drawobj.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-2019,2021, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -569,6 +569,7 @@ static void add_profiling_buffer(struct kgsl_device *device, { struct kgsl_mem_entry *entry; struct kgsl_drawobj *drawobj = DRAWOBJ(cmdobj); + u64 start; if (!(drawobj->flags & KGSL_DRAWOBJ_PROFILING)) return; @@ -585,7 +586,14 @@ static void add_profiling_buffer(struct kgsl_device *device, gpuaddr); if (entry != NULL) { - if (!kgsl_gpuaddr_in_memdesc(&entry->memdesc, gpuaddr, size)) { + start = id ? (entry->memdesc.gpuaddr + offset) : gpuaddr; + /* + * Make sure there is enough room in the object to store the + * entire profiling buffer object + */ + if (!kgsl_gpuaddr_in_memdesc(&entry->memdesc, gpuaddr, size) || + !kgsl_gpuaddr_in_memdesc(&entry->memdesc, start, + sizeof(struct kgsl_drawobj_profiling_buffer))) { kgsl_mem_entry_put(entry); entry = NULL; } @@ -598,28 +606,7 @@ static void add_profiling_buffer(struct kgsl_device *device, return; } - - if (!id) { - cmdobj->profiling_buffer_gpuaddr = gpuaddr; - } else { - u64 off = offset + sizeof(struct kgsl_drawobj_profiling_buffer); - - /* - * Make sure there is enough room in the object to store the - * entire profiling buffer object - */ - if (off < offset || off >= entry->memdesc.size) { - dev_err(device->dev, - "ignore invalid profile offset ctxt %d id %d offset %lld gpuaddr %llx size %lld\n", - drawobj->context->id, id, offset, gpuaddr, size); - kgsl_mem_entry_put(entry); - return; - } - - cmdobj->profiling_buffer_gpuaddr = - entry->memdesc.gpuaddr + offset; - } - + cmdobj->profiling_buffer_gpuaddr = start; cmdobj->profiling_buf_entry = entry; } diff --git a/drivers/gpu/msm/kgsl_iommu.c b/drivers/gpu/msm/kgsl_iommu.c index 5d5ebafa2d08..eee9df0ea2d6 100755 --- a/drivers/gpu/msm/kgsl_iommu.c +++ b/drivers/gpu/msm/kgsl_iommu.c @@ -1,5 +1,5 @@ /* Copyright (c) 2011-2020,2021, The Linux Foundation. All rights reserved. - * + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. @@ -2675,20 +2675,21 @@ static int kgsl_iommu_svm_range(struct kgsl_pagetable *pagetable, } static bool kgsl_iommu_addr_in_range(struct kgsl_pagetable *pagetable, - uint64_t gpuaddr) + uint64_t gpuaddr, uint64_t size) { struct kgsl_iommu_pt *pt = pagetable->priv; if (gpuaddr == 0) return false; - if (gpuaddr >= pt->va_start && gpuaddr < pt->va_end) + if (gpuaddr >= pt->va_start && (gpuaddr + size) < pt->va_end) return true; - if (gpuaddr >= pt->compat_va_start && gpuaddr < pt->compat_va_end) + if (gpuaddr >= pt->compat_va_start && + (gpuaddr + size) < pt->compat_va_end) return true; - if (gpuaddr >= pt->svm_start && gpuaddr < pt->svm_end) + if (gpuaddr >= pt->svm_start && (gpuaddr + size) < pt->svm_end) return true; return false; diff --git a/drivers/gpu/msm/kgsl_mmu.c b/drivers/gpu/msm/kgsl_mmu.c index e5559c8de95a..9f89499486df 100755 --- a/drivers/gpu/msm/kgsl_mmu.c +++ b/drivers/gpu/msm/kgsl_mmu.c @@ -1,5 +1,5 @@ /* Copyright (c) 2002,2007-2017,2021, The Linux Foundation. All rights reserved. - * + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. @@ -636,10 +636,11 @@ enum kgsl_mmutype kgsl_mmu_get_mmutype(struct kgsl_device *device) EXPORT_SYMBOL(kgsl_mmu_get_mmutype); bool kgsl_mmu_gpuaddr_in_range(struct kgsl_pagetable *pagetable, - uint64_t gpuaddr) + uint64_t gpuaddr, uint64_t size) { if (PT_OP_VALID(pagetable, addr_in_range)) - return pagetable->pt_ops->addr_in_range(pagetable, gpuaddr); + return pagetable->pt_ops->addr_in_range(pagetable, + gpuaddr, size); return false; } @@ -675,7 +676,7 @@ EXPORT_SYMBOL(kgsl_mmu_get_qtimer_global_entry); */ static bool nommu_gpuaddr_in_range(struct kgsl_pagetable *pagetable, - uint64_t gpuaddr) + uint64_t gpuaddr, uint64_t size) { return (gpuaddr != 0) ? true : false; } diff --git a/drivers/gpu/msm/kgsl_mmu.h b/drivers/gpu/msm/kgsl_mmu.h index 3a94857f3e4b..ceb0c4400b0c 100755 --- a/drivers/gpu/msm/kgsl_mmu.h +++ b/drivers/gpu/msm/kgsl_mmu.h @@ -1,5 +1,5 @@ /* Copyright (c) 2002,2007-2020, The Linux Foundation. All rights reserved. - * + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. @@ -102,7 +102,8 @@ struct kgsl_mmu_pt_ops { int (*set_svm_region)(struct kgsl_pagetable *, uint64_t, uint64_t); int (*svm_range)(struct kgsl_pagetable *, uint64_t *, uint64_t *, uint64_t); - bool (*addr_in_range)(struct kgsl_pagetable *pagetable, uint64_t); + bool (*addr_in_range)(struct kgsl_pagetable *pagetable, + uint64_t, uint64_t); int (*mmu_map_offset)(struct kgsl_pagetable *pt, uint64_t virtaddr, uint64_t virtoffset, struct kgsl_memdesc *memdesc, uint64_t physoffset, @@ -207,7 +208,8 @@ unsigned int kgsl_virtaddr_to_physaddr(void *virtaddr); unsigned int kgsl_mmu_log_fault_addr(struct kgsl_mmu *mmu, u64 ttbr0, uint64_t addr); enum kgsl_mmutype kgsl_mmu_get_mmutype(struct kgsl_device *device); -bool kgsl_mmu_gpuaddr_in_range(struct kgsl_pagetable *pt, uint64_t gpuaddr); +bool kgsl_mmu_gpuaddr_in_range(struct kgsl_pagetable *pt, uint64_t gpuaddr, + uint64_t size); int kgsl_mmu_get_region(struct kgsl_pagetable *pagetable, uint64_t gpuaddr, uint64_t size); diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 0c262188a927..f0f9b84201a0 100755 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -191,14 +191,14 @@ config HID_CHERRY config HID_CHICONY tristate "Chicony devices" - depends on HID + depends on USB_HID default !EXPERT ---help--- Support for Chicony Tactical pad and special keys on Chicony keyboards. config HID_CORSAIR tristate "Corsair devices" - depends on HID && USB && LEDS_CLASS + depends on USB_HID && LEDS_CLASS ---help--- Support for Corsair devices that are not fully compliant with the HID standard. @@ -209,7 +209,7 @@ config HID_CORSAIR config HID_PRODIKEYS tristate "Prodikeys PC-MIDI Keyboard support" - depends on HID && SND + depends on USB_HID && SND select SND_RAWMIDI ---help--- Support for Prodikeys PC-MIDI Keyboard device support. @@ -448,7 +448,7 @@ config HID_LENOVO config HID_LOGITECH tristate "Logitech devices" - depends on HID + depends on USB_HID default !EXPERT ---help--- Support for Logitech devices that are not fully compliant with HID standard. @@ -791,7 +791,7 @@ config HID_SAITEK config HID_SAMSUNG tristate "Samsung InfraRed remote control or keyboards" - depends on HID + depends on USB_HID ---help--- Support for Samsung InfraRed remote control or keyboards. diff --git a/drivers/hid/hid-chicony.c b/drivers/hid/hid-chicony.c index 397a789a41be..218f0e090f63 100755 --- a/drivers/hid/hid-chicony.c +++ b/drivers/hid/hid-chicony.c @@ -61,8 +61,12 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi, static __u8 *ch_switch12_report_fixup(struct hid_device *hdev, __u8 *rdesc, unsigned int *rsize) { - struct usb_interface *intf = to_usb_interface(hdev->dev.parent); - + struct usb_interface *intf; + + if (!hid_is_usb(hdev)) + return rdesc; + + intf = to_usb_interface(hdev->dev.parent); if (intf->cur_altsetting->desc.bInterfaceNumber == 1) { /* Change usage maximum and logical maximum from 0x7fff to * 0x2fff, so they don't exceed HID_MAX_USAGES */ diff --git a/drivers/hid/hid-corsair.c b/drivers/hid/hid-corsair.c index 9ba5d98a1180..d8cf08b6b31c 100755 --- a/drivers/hid/hid-corsair.c +++ b/drivers/hid/hid-corsair.c @@ -553,7 +553,12 @@ static int corsair_probe(struct hid_device *dev, const struct hid_device_id *id) int ret; unsigned long quirks = id->driver_data; struct corsair_drvdata *drvdata; - struct usb_interface *usbif = to_usb_interface(dev->dev.parent); + struct usb_interface *usbif; + + if (!hid_is_usb(dev)) + return -EINVAL; + + usbif = to_usb_interface(dev->dev.parent); drvdata = devm_kzalloc(&dev->dev, sizeof(struct corsair_drvdata), GFP_KERNEL); diff --git a/drivers/hid/hid-elo.c b/drivers/hid/hid-elo.c index 5eea6fe0d7bd..c3ecac13e620 100755 --- a/drivers/hid/hid-elo.c +++ b/drivers/hid/hid-elo.c @@ -230,6 +230,9 @@ static int elo_probe(struct hid_device *hdev, const struct hid_device_id *id) struct elo_priv *priv; int ret; + if (!hid_is_usb(hdev)) + return -EINVAL; + priv = kzalloc(sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; diff --git a/drivers/hid/hid-holtek-kbd.c b/drivers/hid/hid-holtek-kbd.c index ab9da597106f..2f8eb6639744 100755 --- a/drivers/hid/hid-holtek-kbd.c +++ b/drivers/hid/hid-holtek-kbd.c @@ -143,12 +143,17 @@ static int holtek_kbd_input_event(struct input_dev *dev, unsigned int type, static int holtek_kbd_probe(struct hid_device *hdev, const struct hid_device_id *id) { - struct usb_interface *intf = to_usb_interface(hdev->dev.parent); - int ret = hid_parse(hdev); + struct usb_interface *intf; + int ret; + + if (!hid_is_usb(hdev)) + return -EINVAL; + ret = hid_parse(hdev); if (!ret) ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); + intf = to_usb_interface(hdev->dev.parent); if (!ret && intf->cur_altsetting->desc.bInterfaceNumber == 1) { struct hid_input *hidinput; list_for_each_entry(hidinput, &hdev->inputs, list) { diff --git a/drivers/hid/hid-holtek-mouse.c b/drivers/hid/hid-holtek-mouse.c index 78b3a0c76775..27c08ddab0e1 100755 --- a/drivers/hid/hid-holtek-mouse.c +++ b/drivers/hid/hid-holtek-mouse.c @@ -65,6 +65,14 @@ static __u8 *holtek_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc, return rdesc; } +static int holtek_mouse_probe(struct hid_device *hdev, + const struct hid_device_id *id) +{ + if (!hid_is_usb(hdev)) + return -EINVAL; + return 0; +} + static const struct hid_device_id holtek_mouse_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067) }, @@ -86,6 +94,7 @@ static struct hid_driver holtek_mouse_driver = { .name = "holtek_mouse", .id_table = holtek_mouse_devices, .report_fixup = holtek_mouse_report_fixup, + .probe = holtek_mouse_probe, }; module_hid_driver(holtek_mouse_driver); diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c index 7e55d3f755dd..f8d1d481c838 100755 --- a/drivers/hid/hid-lg.c +++ b/drivers/hid/hid-lg.c @@ -714,12 +714,18 @@ static int lg_raw_event(struct hid_device *hdev, struct hid_report *report, static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id) { - struct usb_interface *iface = to_usb_interface(hdev->dev.parent); - __u8 iface_num = iface->cur_altsetting->desc.bInterfaceNumber; + struct usb_interface *iface; + __u8 iface_num; unsigned int connect_mask = HID_CONNECT_DEFAULT; struct lg_drv_data *drv_data; int ret; + if (!hid_is_usb(hdev)) + return -EINVAL; + + iface = to_usb_interface(hdev->dev.parent); + iface_num = iface->cur_altsetting->desc.bInterfaceNumber; + /* G29 only work with the 1st interface */ if ((hdev->product == USB_DEVICE_ID_LOGITECH_G29_WHEEL) && (iface_num != 0)) { diff --git a/drivers/hid/hid-prodikeys.c b/drivers/hid/hid-prodikeys.c index 205f68251ac0..cc2072ea973f 100755 --- a/drivers/hid/hid-prodikeys.c +++ b/drivers/hid/hid-prodikeys.c @@ -803,12 +803,18 @@ static int pk_raw_event(struct hid_device *hdev, struct hid_report *report, static int pk_probe(struct hid_device *hdev, const struct hid_device_id *id) { int ret; - struct usb_interface *intf = to_usb_interface(hdev->dev.parent); - unsigned short ifnum = intf->cur_altsetting->desc.bInterfaceNumber; + struct usb_interface *intf; + unsigned short ifnum; unsigned long quirks = id->driver_data; struct pk_device *pk; struct pcmidi_snd *pm = NULL; + if (!hid_is_usb(hdev)) + return -EINVAL; + + intf = to_usb_interface(hdev->dev.parent); + ifnum = intf->cur_altsetting->desc.bInterfaceNumber; + pk = kzalloc(sizeof(*pk), GFP_KERNEL); if (pk == NULL) { hid_err(hdev, "can't alloc descriptor\n"); diff --git a/drivers/hid/hid-qvr.c b/drivers/hid/hid-qvr.c index aba3d52c9a05..0318c8916169 100755 --- a/drivers/hid/hid-qvr.c +++ b/drivers/hid/hid-qvr.c @@ -144,7 +144,7 @@ static int read_calibration_len(void) return sensor->calib_data_len; } -static uint8_t *read_calibration_data(void) +static uint8_t *read_calibration_data(int calib_data_len) { struct qvr_external_sensor *sensor = &qvr_external_sensor; __u8 *hid_buf; @@ -152,7 +152,7 @@ static uint8_t *read_calibration_data(void) uint8_t read_len; uint8_t *complete_data = NULL; - if (sensor->calib_data_len < 0) { + if (calib_data_len <= 0) { pr_err("%s: calibration data len missing", __func__); return NULL; } @@ -164,13 +164,13 @@ static uint8_t *read_calibration_data(void) hid_buf[0] = QVR_HID_REPORT_ID_CAL; hid_buf[1] = QVR_CMD_ID_CALIBRATION_BLOCK_DATA; - complete_data = kzalloc(sensor->calib_data_len, GFP_KERNEL); + complete_data = kzalloc(calib_data_len, GFP_KERNEL); if (complete_data == NULL) { kfree(hid_buf); return NULL; } total_read_len = 0; - while (total_read_len < sensor->calib_data_len) { + while (total_read_len < calib_data_len) { sensor->calib_data_recv = 0; ret = hid_hw_raw_request(sensor->hdev, hid_buf[0], hid_buf, @@ -192,7 +192,13 @@ static uint8_t *read_calibration_data(void) return NULL; } read_len = sensor->calib_data_pkt[2]; - if (total_read_len > sensor->calib_data_len - read_len) { + if(read_len <=0) { + pr_err("%s:Viewer returned non positve length\n", __func__); + kfree(hid_buf); + kfree(complete_data); + return NULL; + } + if (total_read_len > calib_data_len - read_len) { kfree(hid_buf); kfree(complete_data); return NULL; @@ -531,6 +537,7 @@ static long qvr_external_sensor_ioctl(struct file *file, unsigned int cmd, struct qvr_external_sensor *sensor = &qvr_external_sensor; struct qvr_calib_data data; uint8_t *calib_data; + int lcalib_data_len; void __user *argp = (void __user *)arg; int ret; @@ -556,13 +563,14 @@ static long qvr_external_sensor_ioctl(struct file *file, unsigned int cmd, return -EFAULT; return 0; case QVR_READ_CALIB_DATA: + lcalib_data_len = sensor->calib_data_len; sensor->calib_data_recv = 0; - calib_data = read_calibration_data(); + calib_data = read_calibration_data(lcalib_data_len); if (calib_data == NULL) return -ENOMEM; data.data_ptr = (__u64)arg; if (copy_to_user(u64_to_user_ptr(data.data_ptr), calib_data, - sensor->calib_data_len)) { + lcalib_data_len)) { kfree(calib_data); return -EFAULT; } diff --git a/drivers/hid/hid-roccat-arvo.c b/drivers/hid/hid-roccat-arvo.c index 329c5d1270f9..fb545a11214f 100755 --- a/drivers/hid/hid-roccat-arvo.c +++ b/drivers/hid/hid-roccat-arvo.c @@ -347,6 +347,9 @@ static int arvo_probe(struct hid_device *hdev, { int retval; + if (!hid_is_usb(hdev)) + return -EINVAL; + retval = hid_parse(hdev); if (retval) { hid_err(hdev, "parse failed\n"); diff --git a/drivers/hid/hid-roccat-isku.c b/drivers/hid/hid-roccat-isku.c index 02db537f8f3e..c07a7ea8a687 100755 --- a/drivers/hid/hid-roccat-isku.c +++ b/drivers/hid/hid-roccat-isku.c @@ -327,6 +327,9 @@ static int isku_probe(struct hid_device *hdev, { int retval; + if (!hid_is_usb(hdev)) + return -EINVAL; + retval = hid_parse(hdev); if (retval) { hid_err(hdev, "parse failed\n"); diff --git a/drivers/hid/hid-roccat-kone.c b/drivers/hid/hid-roccat-kone.c index bf4675a27396..e102e06ad14c 100755 --- a/drivers/hid/hid-roccat-kone.c +++ b/drivers/hid/hid-roccat-kone.c @@ -743,6 +743,9 @@ static int kone_probe(struct hid_device *hdev, const struct hid_device_id *id) { int retval; + if (!hid_is_usb(hdev)) + return -EINVAL; + retval = hid_parse(hdev); if (retval) { hid_err(hdev, "parse failed\n"); diff --git a/drivers/hid/hid-roccat-koneplus.c b/drivers/hid/hid-roccat-koneplus.c index 09e8fc72aa1d..b63de4c5b5dd 100755 --- a/drivers/hid/hid-roccat-koneplus.c +++ b/drivers/hid/hid-roccat-koneplus.c @@ -434,6 +434,9 @@ static int koneplus_probe(struct hid_device *hdev, { int retval; + if (!hid_is_usb(hdev)) + return -EINVAL; + retval = hid_parse(hdev); if (retval) { hid_err(hdev, "parse failed\n"); diff --git a/drivers/hid/hid-roccat-konepure.c b/drivers/hid/hid-roccat-konepure.c index 07de2f9014c6..ef9508822e5f 100755 --- a/drivers/hid/hid-roccat-konepure.c +++ b/drivers/hid/hid-roccat-konepure.c @@ -136,6 +136,9 @@ static int konepure_probe(struct hid_device *hdev, { int retval; + if (!hid_is_usb(hdev)) + return -EINVAL; + retval = hid_parse(hdev); if (retval) { hid_err(hdev, "parse failed\n"); diff --git a/drivers/hid/hid-roccat-kovaplus.c b/drivers/hid/hid-roccat-kovaplus.c index 317c9c2c0a7c..6256c211398a 100755 --- a/drivers/hid/hid-roccat-kovaplus.c +++ b/drivers/hid/hid-roccat-kovaplus.c @@ -504,6 +504,9 @@ static int kovaplus_probe(struct hid_device *hdev, { int retval; + if (!hid_is_usb(hdev)) + return -EINVAL; + retval = hid_parse(hdev); if (retval) { hid_err(hdev, "parse failed\n"); diff --git a/drivers/hid/hid-roccat-lua.c b/drivers/hid/hid-roccat-lua.c index ac1a7313e259..13ae2a7d176d 100755 --- a/drivers/hid/hid-roccat-lua.c +++ b/drivers/hid/hid-roccat-lua.c @@ -163,6 +163,9 @@ static int lua_probe(struct hid_device *hdev, { int retval; + if (!hid_is_usb(hdev)) + return -EINVAL; + retval = hid_parse(hdev); if (retval) { hid_err(hdev, "parse failed\n"); diff --git a/drivers/hid/hid-roccat-pyra.c b/drivers/hid/hid-roccat-pyra.c index b30aa7b82bf8..027aa9d0ec1f 100755 --- a/drivers/hid/hid-roccat-pyra.c +++ b/drivers/hid/hid-roccat-pyra.c @@ -452,6 +452,9 @@ static int pyra_probe(struct hid_device *hdev, const struct hid_device_id *id) { int retval; + if (!hid_is_usb(hdev)) + return -EINVAL; + retval = hid_parse(hdev); if (retval) { hid_err(hdev, "parse failed\n"); diff --git a/drivers/hid/hid-roccat-ryos.c b/drivers/hid/hid-roccat-ryos.c index 47cc8f30ff6d..fda4a396a12e 100755 --- a/drivers/hid/hid-roccat-ryos.c +++ b/drivers/hid/hid-roccat-ryos.c @@ -144,6 +144,9 @@ static int ryos_probe(struct hid_device *hdev, { int retval; + if (!hid_is_usb(hdev)) + return -EINVAL; + retval = hid_parse(hdev); if (retval) { hid_err(hdev, "parse failed\n"); diff --git a/drivers/hid/hid-roccat-savu.c b/drivers/hid/hid-roccat-savu.c index 6dbf6e04dce7..0230fb54f08a 100755 --- a/drivers/hid/hid-roccat-savu.c +++ b/drivers/hid/hid-roccat-savu.c @@ -116,6 +116,9 @@ static int savu_probe(struct hid_device *hdev, { int retval; + if (!hid_is_usb(hdev)) + return -EINVAL; + retval = hid_parse(hdev); if (retval) { hid_err(hdev, "parse failed\n"); diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c index bf8e727988c4..9a694fb27c8d 100755 --- a/drivers/hid/wacom_sys.c +++ b/drivers/hid/wacom_sys.c @@ -578,7 +578,7 @@ static void wacom_retrieve_hid_descriptor(struct hid_device *hdev, * Skip the query for this type and modify defaults based on * interface number. */ - if (features->type == WIRELESS) { + if (features->type == WIRELESS && intf) { if (intf->cur_altsetting->desc.bInterfaceNumber == 0) features->device_type = WACOM_DEVICETYPE_WL_MONITOR; else @@ -2049,7 +2049,7 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix) if ((features->type == HID_GENERIC) && !strcmp("Wacom HID", features->name)) { char *product_name = wacom->hdev->name; - if (hid_is_using_ll_driver(wacom->hdev, &usb_hid_driver)) { + if (hid_is_usb(wacom->hdev)) { struct usb_interface *intf = to_usb_interface(wacom->hdev->dev.parent); struct usb_device *dev = interface_to_usbdev(intf); product_name = dev->product; @@ -2280,6 +2280,9 @@ static void wacom_wireless_work(struct work_struct *work) wacom_destroy_battery(wacom); + if (!usbdev) + return; + /* Stylus interface */ hdev1 = usb_get_intfdata(usbdev->config->interface[1]); wacom1 = hid_get_drvdata(hdev1); @@ -2559,8 +2562,6 @@ static void wacom_mode_change_work(struct work_struct *work) static int wacom_probe(struct hid_device *hdev, const struct hid_device_id *id) { - struct usb_interface *intf = to_usb_interface(hdev->dev.parent); - struct usb_device *dev = interface_to_usbdev(intf); struct wacom *wacom; struct wacom_wac *wacom_wac; struct wacom_features *features; @@ -2593,8 +2594,14 @@ static int wacom_probe(struct hid_device *hdev, wacom_wac->hid_data.inputmode = -1; wacom_wac->mode_report = -1; - wacom->usbdev = dev; - wacom->intf = intf; + if (hid_is_usb(hdev)) { + struct usb_interface *intf = to_usb_interface(hdev->dev.parent); + struct usb_device *dev = interface_to_usbdev(intf); + + wacom->usbdev = dev; + wacom->intf = intf; + } + mutex_init(&wacom->lock); INIT_DELAYED_WORK(&wacom->init_work, wacom_init_work); INIT_WORK(&wacom->wireless_work, wacom_wireless_work); diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig index 445cb1d7462e..373d325c71b0 100755 --- a/drivers/input/Kconfig +++ b/drivers/input/Kconfig @@ -195,6 +195,14 @@ config SEC_DEBUG_TSP_LOG tristate "Support for tsp_msg" default n +config INPUT_TOUCHSCREEN_SEC_CMD + bool "touchscreen sec cmd" + depends on I2C + help + Say Y here if you need to use sec_cmd + + If unsure, say N. + config INPUT_TOUCHSCREEN_TCLMV2 bool "touchscreen tclmv2" depends on I2C @@ -241,12 +249,18 @@ source "drivers/input/tablet/Kconfig" source "drivers/input/touchscreen/Kconfig" +source "drivers/input/wacom/Kconfig" + +source "drivers/input/w9019/Kconfig" + source "drivers/input/misc/Kconfig" source "drivers/input/sensors/smi130/Kconfig" source "drivers/input/rmi4/Kconfig" +source "drivers/input/sec_input/Kconfig" + endif menu "Hardware I/O ports" diff --git a/drivers/input/Makefile b/drivers/input/Makefile index 2906ded12840..94d09317e379 100755 --- a/drivers/input/Makefile +++ b/drivers/input/Makefile @@ -8,7 +8,7 @@ obj-$(CONFIG_INPUT) += input-core.o input-core-y := input.o input-compat.o input-mt.o ff-core.o obj-$(CONFIG_SEC_DEBUG_TSP_LOG) += sec_tsp_log.o -obj-$(CONFIG_INPUT_TOUCHSCREEN) += sec_cmd.o +obj-$(CONFIG_INPUT_TOUCHSCREEN_SEC_CMD) += sec_cmd.o obj-$(CONFIG_INPUT_TOUCHSCREEN_TCLMV2) += sec_tclm_v2.o obj-$(CONFIG_INPUT_FF_MEMLESS) += ff-memless.o @@ -28,6 +28,8 @@ obj-$(CONFIG_INPUT_JOYSTICK) += joystick/ obj-$(CONFIG_INPUT_TABLET) += tablet/ obj-$(CONFIG_INPUT_TOUCHSCREEN) += touchscreen/ obj-$(CONFIG_INPUT_MISC) += misc/ +obj-$(CONFIG_EPEN_WACOM_WEZ01) += wacom/ +obj-$(CONFIG_EPEN_WACOM_W9019) += w9019/ obj-$(CONFIG_INPUT_APMPOWER) += apm-power.o obj-$(CONFIG_INPUT_KEYRESET) += keyreset.o @@ -38,3 +40,4 @@ obj-$(CONFIG_RMI4_CORE) += rmi4/ obj-$(CONFIG_SMI130) += sensors/smi130/ obj-$(CONFIG_INPUT_SEC_SECURE_TOUCH) += sec_secure_touch.o +obj-$(CONFIG_INPUT_SEC_INPUT_LEGO) += sec_input/ diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig index cefb43f72c7d..54561204e2b9 100755 --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig @@ -211,6 +211,13 @@ config KEYBOARD_EP93XX To compile this driver as a module, choose M here: the module will be called ep93xx_keypad. +config INPUT_HALL_IC + tristate "Enable HALL IC" + default n + help + Enable Hall IC Feature + If unsure, say N. + config SENSORS_HALL bool "HALL" default n diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile index c9d5ea2138a6..dbc5d10b7531 100755 --- a/drivers/input/keyboard/Makefile +++ b/drivers/input/keyboard/Makefile @@ -74,3 +74,4 @@ obj-$(CONFIG_KEYBOARD_TM2_TOUCHKEY) += tm2-touchkey.o obj-$(CONFIG_KEYBOARD_TWL4030) += twl4030_keypad.o obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o obj-$(CONFIG_KEYBOARD_W90P910) += w90p910_keypad.o +obj-$(CONFIG_INPUT_HALL_IC) += hall.o diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index 5950e4eb6f30..982a3cb8b17f 100755 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -398,7 +398,7 @@ static ssize_t sysfs_key_onoff_show(struct device *dev, } #endif - pr_info("%s %s: key state:%d\n", SECLOG, __func__, state); + pr_info("[sec_input] %s: key state:%d\n", __func__, state); return snprintf(buf, 5, "%d\n", state); } @@ -426,7 +426,7 @@ static ssize_t wakeup_enable(struct device *dev, if (button->button->type == EV_KEY) { if (button->button->wakeup_default) { - pr_err("%s %s default wakeup status %d\n", SECLOG, button->button->desc, + pr_err("[sec_input] %s default wakeup status %d\n", button->button->desc, button->button->wakeup); continue; } @@ -434,7 +434,7 @@ static ssize_t wakeup_enable(struct device *dev, button->button->wakeup = 1; else button->button->wakeup = 0; - pr_err("%s %s wakeup status %d\n", SECLOG, button->button->desc, + pr_err("[sec_input] %s wakeup status %d\n", button->button->desc, button->button->wakeup); } } @@ -457,7 +457,7 @@ static ssize_t keycode_pressed_show(struct device *dev, buff = kmalloc(len, GFP_KERNEL); if (!buff) { - pr_err("%s %s: failed to mem alloc\n", SECLOG, __func__); + pr_err("[sec_input] %s: failed to mem alloc\n", __func__); return snprintf(buf, 5, "NG\n"); } @@ -487,7 +487,7 @@ static ssize_t keycode_pressed_show(struct device *dev, strncat(buff, tmp, 7); #endif - pr_info("%s %s: %s\n", SECLOG, __func__, buff); + pr_info("[sec_input] %s: %s\n", __func__, buff); count = snprintf(buf, strnlen(buff, len - 2) + 2, "%s\n", buff); kfree(buff); @@ -540,7 +540,7 @@ static ssize_t key_pressed_count_show(struct device *dev, strncat(buff, tmp, 20); #endif - pr_info("%s %s: %s\n", SECLOG, __func__, buff); + pr_info("[sec_input] %s: %s\n", __func__, buff); count = snprintf(buf, len, "%s\n", buff); kfree(buff); @@ -612,7 +612,7 @@ static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata) if (state) bdata->key_press_count++; - pr_info("%s %s: %d, %d, %d\n", SECLOG, __func__, button->code, button->value, state); + pr_info("[sec_input] %s: %d, %d, %d\n", __func__, button->code, button->value, state); } static void gpio_keys_gpio_work_func(struct work_struct *work) diff --git a/drivers/input/keyboard/hall.c b/drivers/input/keyboard/hall.c new file mode 100755 index 000000000000..c848b0ea85f2 --- /dev/null +++ b/drivers/input/keyboard/hall.c @@ -0,0 +1,628 @@ +/* + * + * Copyright 2017 SEC + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if IS_ENABLED(CONFIG_DRV_SAMSUNG) +#include +#endif +#if IS_ENABLED(CONFIG_SEC_FACTORY) +#include +#endif +#if IS_ENABLED(CONFIG_HALL_NOTIFIER) +#include +#endif +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +#if IS_ENABLED(CONFIG_USB_HW_PARAM) +#include +#endif +#endif +#if IS_ENABLED(CONFIG_SAMSUNG_TUI) +#include +#endif + +/* + * Switch events + */ +#define SW_FOLDER 0x00 /* set = folder open, close*/ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) +#define SW_FLIP 0x10 /* set = flip cover open, close*/ +#define SW_CERTIFYHALL 0x0b /* set = certify_hall attach/detach */ +#define SW_WACOM_HALL 0x0c /* set = tablet wacom hall attach/detach(set wacom cover mode) */ +#else +#define SW_FLIP 0x15 /* set = flip cover open, close*/ +#define SW_CERTIFYHALL 0x1b /* set = certify_hall attach/detach */ +#define SW_WACOM_HALL 0x1e /* set = tablet wacom hall attach/detach(set wacom cover mode) */ +#endif + +#define DEFAULT_DEBOUNCE_INTERVAL 50 + +struct device *sec_hall_ic; +EXPORT_SYMBOL(sec_hall_ic); + +struct class *hall_sec_class; + +struct hall_ic_data { + struct delayed_work dwork; + struct wakeup_source *ws; + struct input_dev *input; + struct list_head list; + int gpio; + int irq; + int state; + int active_low; + unsigned int event; + const char *name; +}; + +struct hall_ic_pdata { + struct hall_ic_data *hall; + unsigned int nhalls; + unsigned int debounce_interval; +}; + +struct hall_ic_drvdata { + struct hall_ic_pdata *pdata; + struct work_struct work; + struct device *dev; +#if IS_ENABLED(CONFIG_DRV_SAMSUNG) + struct device *sec_dev; +#endif + struct mutex lock; +}; + +static LIST_HEAD(hall_ic_list); + +#if IS_ENABLED(CONFIG_DRV_SAMSUNG) +struct hall_ic_drvdata *gddata; +/* + * the sysfs just returns the level of the gpio + */ +static ssize_t hall_detect_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct hall_ic_data *hall; + int state; + + list_for_each_entry(hall, &hall_ic_list, list) { + if (hall->event != SW_FLIP) + continue; + hall->state = !!gpio_get_value_cansleep(hall->gpio); + state = hall->state ^ hall->active_low; + if (state) + sprintf(buf, "CLOSE\n"); + else + sprintf(buf, "OPEN\n"); + } + return strlen(buf); +} + +static ssize_t certify_hall_detect_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct hall_ic_data *hall; + int state; + + list_for_each_entry(hall, &hall_ic_list, list) { + if (hall->event != SW_CERTIFYHALL) + continue; + hall->state = !!gpio_get_value_cansleep(hall->gpio); + state = hall->state ^ hall->active_low; + if (state) + sprintf(buf, "CLOSE\n"); + else + sprintf(buf, "OPEN\n"); + } + + return strlen(buf); +} + +static ssize_t hall_wacom_detect_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct hall_ic_data *hall; + int state; + + list_for_each_entry(hall, &hall_ic_list, list) { + if (hall->event != SW_WACOM_HALL) + continue; + hall->state = !!gpio_get_value_cansleep(hall->gpio); + state = hall->state ^ hall->active_low; + if (state) + sprintf(buf, "CLOSE\n"); + else + sprintf(buf, "OPEN\n"); + } + + return strlen(buf); +} + +static ssize_t flip_status_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct hall_ic_data *hall; + int state; + + list_for_each_entry(hall, &hall_ic_list, list) { + if (hall->event != SW_FOLDER) + continue; + hall->state = !!gpio_get_value_cansleep(hall->gpio); + state = hall->state ^ hall->active_low; + if (state) + snprintf(buf, 2, "0"); /* close */ + else + snprintf(buf, 2, "1"); /* open */ + } + + return strlen(buf); +} + +static ssize_t hall_number_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct hall_ic_drvdata *ddata = dev_get_drvdata(dev); + + sprintf(buf, "%u\n", ddata->pdata->nhalls); + + return strlen(buf); +} + +static ssize_t debounce_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct hall_ic_drvdata *ddata = dev_get_drvdata(dev); + + sprintf(buf, "%d\n", ddata->pdata->debounce_interval); + + return strlen(buf); +} + +static DEVICE_ATTR_RO(hall_detect); +static DEVICE_ATTR_RO(certify_hall_detect); +static DEVICE_ATTR_RO(hall_wacom_detect); +static DEVICE_ATTR_RO(flip_status); +static DEVICE_ATTR_RO(hall_number); +static DEVICE_ATTR_RO(debounce); + +static struct device_attribute *hall_ic_attrs[] = { + &dev_attr_hall_detect, + &dev_attr_certify_hall_detect, + &dev_attr_hall_wacom_detect, + &dev_attr_flip_status, + NULL, +}; +#endif + +#if IS_ENABLED(CONFIG_SEC_FACTORY) +static void hall_ic_work(struct work_struct *work) +{ + struct hall_ic_data *hall = container_of(work, + struct hall_ic_data, dwork.work); + struct hall_ic_drvdata *ddata = gddata; + int first, second, state; + char hall_uevent[20] = {0,}; + char *hall_status[2] = {hall_uevent, NULL}; + + first = gpio_get_value_cansleep(hall->gpio); + msleep(50); + second = gpio_get_value_cansleep(hall->gpio); + if (first == second) { + hall->state = first; + state = first ^ hall->active_low; + pr_info("%s %s\n", hall->name, + state ? "close" : "open"); + + if (hall->input) { + input_report_switch(hall->input, hall->event, state); + input_sync(hall->input); + } + + /* send uevent for hall ic */ + snprintf(hall_uevent, sizeof(hall_uevent), "%s=%s", + hall->name, state ? "close" : "open"); + kobject_uevent_env(&ddata->sec_dev->kobj, KOBJ_CHANGE, hall_status); + +#if IS_ENABLED(CONFIG_HALL_NOTIFIER) + hall_notifier_notify(hall->name, state); +#endif + } else + pr_info("%s %d,%d\n", hall->name, + first, second); +} +#else +static void hall_ic_work(struct work_struct *work) +{ + struct hall_ic_data *hall = container_of(work, + struct hall_ic_data, dwork.work); + int state; + + mutex_lock(&gddata->lock); + hall->state = !!gpio_get_value_cansleep(hall->gpio); + state = hall->state ^ hall->active_low; + pr_info("%s %s %s(%d)\n", __func__, hall->name, + state ? "close" : "open", hall->state); + + if (hall->input) { + input_report_switch(hall->input, hall->event, state); + input_sync(hall->input); + } +#if IS_ENABLED(CONFIG_HALL_NOTIFIER) + hall_notifier_notify(hall->name, state); +#endif + mutex_unlock(&gddata->lock); + +#if IS_ENABLED(CONFIG_SAMSUNG_TUI) + if (STUI_MODE_TOUCH_SEC & stui_get_mode()) + stui_cancel_session(); +#endif +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +#if IS_ENABLED(CONFIG_USB_HW_PARAM) + if (strncmp(hall->name, "flip", 4) == 0) { + struct otg_notify *o_notify = get_otg_notify(); + + if (state && o_notify) + inc_hw_param(o_notify, USB_HALL_FOLDING_COUNT); + + } +#endif +#endif +} +#endif + +static irqreturn_t hall_ic_detect(int irq, void *dev_id) +{ + struct hall_ic_data *hall = dev_id; + struct hall_ic_pdata *pdata = gddata->pdata; + int state = !!gpio_get_value_cansleep(hall->gpio); + + pr_info("%s %s(%d)\n", __func__, + hall->name, state); + cancel_delayed_work_sync(&hall->dwork); +#if IS_ENABLED(CONFIG_SEC_FACTORY) + schedule_delayed_work(&hall->dwork, msecs_to_jiffies(pdata->debounce_interval)); +#else + if (state) { + __pm_wakeup_event(hall->ws, pdata->debounce_interval + 5); + schedule_delayed_work(&hall->dwork, msecs_to_jiffies(pdata->debounce_interval)); + } else { + __pm_relax(hall->ws); + schedule_delayed_work(&hall->dwork, msecs_to_jiffies(pdata->debounce_interval)); + } +#endif + return IRQ_HANDLED; +} + +static int hall_ic_open(struct input_dev *input) +{ + struct hall_ic_data *hall = input_get_drvdata(input); + + pr_info("%s: %s\n", __func__, hall->name); + + schedule_delayed_work(&hall->dwork, HZ / 2); + input_sync(input); + + return 0; +} + +static void hall_ic_close(struct input_dev *input) +{ +} + +static int hall_ic_input_dev_register(struct hall_ic_data *hall) +{ + struct input_dev *input; + int ret = 0; + + input = input_allocate_device(); + if (!input) { + pr_err("failed to allocate state\n"); + return -ENOMEM; + } + + hall->input = input; + input_set_capability(input, EV_SW, hall->event); + input->name = hall->name; + input->phys = hall->name; + input->open = hall_ic_open; + input->close = hall_ic_close; + + ret = input_register_device(input); + if (ret) { + pr_err("failed to register input device\n"); + return ret; + } + + input_set_drvdata(input, hall); + + return 0; +} + +static int hall_ic_setup_halls(struct hall_ic_drvdata *ddata) +{ + struct hall_ic_data *hall; + int ret = 0; + int i = 0; + + gddata = ddata; +#if IS_ENABLED(CONFIG_DRV_SAMSUNG) + ddata->sec_dev = sec_device_create(0, ddata, "hall_ic"); + if (IS_ERR(ddata->sec_dev)) + pr_err("%s failed to create hall_ic\n", __func__); +#else + hall_sec_class = class_create(THIS_MODULE, "hall_ic"); + if (unlikely(IS_ERR(hall_sec_class))) { + pr_err("%s %s: Failed to create class(sec) %ld\n", SECLOG, __func__, PTR_ERR(tsp_sec_class)); + return PTR_ERR(tsp_sec_class); + } + ddata->sec_dev = device_create(hall_sec_class, NULL, 17, ddata, "%s", "hall_ic"); + +#endif + sec_hall_ic = ddata->sec_dev; + + sysfs_create_file(&ddata->sec_dev->kobj, &dev_attr_hall_number.attr); + sysfs_create_file(&ddata->sec_dev->kobj, &dev_attr_debounce.attr); + list_for_each_entry(hall, &hall_ic_list, list) { + hall->state = gpio_get_value_cansleep(hall->gpio); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0) + // 4.19 R + wakeup_source_init(hall->ws, "hall_ic_wlock"); + // 4.19 Q + if (!(hall->ws)) { + hall->ws = wakeup_source_create("hall_ic_wlock"); + if (hall->ws) + wakeup_source_add(hall->ws); + } +#else + hall->ws = wakeup_source_register(NULL, "hall_ic_wlock"); +#endif + INIT_DELAYED_WORK(&hall->dwork, hall_ic_work); + ret = request_threaded_irq(hall->irq, NULL, hall_ic_detect, + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + hall->name, hall); + if (ret < 0) + pr_err("failed to request irq %d(%d)\n", + hall->irq, ret); + +#if IS_ENABLED(CONFIG_DRV_SAMSUNG) + if (!ddata->sec_dev) + continue; + + for (i = 0; i < ARRAY_SIZE(hall_ic_attrs); i++) { + if (!strncmp(hall->name, hall_ic_attrs[i]->attr.name, + strlen(hall->name))) { + ret = sysfs_create_file(&ddata->sec_dev->kobj, + &hall_ic_attrs[i]->attr); + if (ret < 0) + pr_err("failed to create sysfr %d(%d)\n", + hall->irq, ret); + break; + } + } +#endif + } + return ret; +} + +static struct hall_ic_pdata *hall_ic_parsing_dt(struct device *dev) +{ + struct device_node *node = dev->of_node, *pp; + struct hall_ic_pdata *pdata; + struct hall_ic_data *hall; + int nhalls = 0, ret = 0, i = 0; + + if (!node) + return ERR_PTR(-ENODEV); + + nhalls = of_get_child_count(node); + if (nhalls == 0) + return ERR_PTR(-ENODEV); + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return ERR_PTR(-ENOMEM); + + pdata->hall = devm_kzalloc(dev, nhalls * sizeof(*hall), GFP_KERNEL); + if (!pdata->hall) + return ERR_PTR(-ENOMEM); + + if (of_property_read_u32(node, "hall_ic,debounce-interval", &pdata->debounce_interval)) { + pr_info("%s failed to get debounce value, set to default\n", __func__); + pdata->debounce_interval = DEFAULT_DEBOUNCE_INTERVAL; + } + pr_info("%s debounce interval: %d\n", __func__, pdata->debounce_interval); + + pdata->nhalls = nhalls; + for_each_child_of_node(node, pp) { + struct hall_ic_data *hall = &pdata->hall[i++]; + enum of_gpio_flags flags; + + hall->gpio = of_get_gpio_flags(pp, 0, &flags); + if (hall->gpio < 0) { + ret = hall->gpio; + if (ret) { + pr_err("Failed to get gpio flags %d\n", ret); + return ERR_PTR(ret); + } + } + + hall->active_low = flags & OF_GPIO_ACTIVE_LOW; + gpio_direction_input(hall->gpio); + hall->irq = gpio_to_irq(hall->gpio); + hall->name = of_get_property(pp, "name", NULL); + + pr_info("%s flags: %d\n", __func__, flags); + pr_info("%s %s\n", __func__, hall->name); + + if (of_property_read_u32(pp, "event", &hall->event)) { + pr_err("failed to get event: 0x%x\n", hall->event); + return ERR_PTR(-EINVAL); + } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + if (hall->event == 0x15) { /* SW_FLIP */ + hall->event = 0x10; + } else if (hall->event == 0x1b) { /* SW_CERTIFYHALL */ + hall->event = 0x0b; + } else if (hall->event == 0x1e) { /* SW_WACOM_HALL */ + hall->event = 0x0c; + } else if (hall->event == 0x00) { /* SW_FOLSW_FLIPDER */ + continue; + } else { + pr_err("failed to get name, not match event\n"); + return ERR_PTR(-EINVAL); + } +#endif + list_add(&hall->list, &hall_ic_list); + } + return pdata; +} + +static int hall_ic_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct hall_ic_pdata *pdata = dev_get_platdata(dev); + struct hall_ic_drvdata *ddata; + struct hall_ic_data *hall; + int ret = 0; + + if (!pdata) { + pdata = hall_ic_parsing_dt(dev); + if (IS_ERR(pdata)) { + pr_err("%s : fail to get the DT\n", __func__); + goto fail1; + } + } + + ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL); + if (!ddata) { + pr_err("failed to allocate drvdata\n"); + ret = -ENOMEM; + goto fail1; + } + + ddata->pdata = pdata; + device_init_wakeup(&pdev->dev, true); + platform_set_drvdata(pdev, ddata); + mutex_init(&ddata->lock); + + list_for_each_entry(hall, &hall_ic_list, list) { + ret = hall_ic_input_dev_register(hall); + if (ret) { + pr_err("hall_ic_input_dev_register failed %d\n", ret); + goto fail2; + } + + hall->input->dev.parent = &pdev->dev; + } + + ret = hall_ic_setup_halls(ddata); + if (ret) { + pr_err("failed to set up hall : %d\n", ret); + goto fail2; + } + + return 0; + +fail2: + platform_set_drvdata(pdev, NULL); +fail1: + return ret; +} + +static int hall_ic_remove(struct platform_device *pdev) +{ + struct hall_ic_data *hall; + + list_for_each_entry(hall, &hall_ic_list, list) { + input_unregister_device(hall->input); + wakeup_source_unregister(hall->ws); + } + device_init_wakeup(&pdev->dev, 0); + platform_set_drvdata(pdev, NULL); + return 0; +} + +static const struct of_device_id hall_ic_dt_ids[] = { + { .compatible = "hall_ic", }, + { }, +}; +MODULE_DEVICE_TABLE(of, hall_ic_dt_ids); + +static int hall_ic_suspend(struct device *dev) +{ + struct hall_ic_data *hall; + + list_for_each_entry(hall, &hall_ic_list, list) + enable_irq_wake(hall->irq); + + return 0; +} + +static int hall_ic_resume(struct device *dev) +{ + struct hall_ic_data *hall; + + list_for_each_entry(hall, &hall_ic_list, list) { + int state = !!gpio_get_value_cansleep(hall->gpio); + + state ^= hall->active_low; + pr_info("%s %s %s(%d)\n", __func__, hall->name, + hall->state ? "open" : "close", hall->state); + disable_irq_wake(hall->irq); + input_report_switch(hall->input, hall->event, state); + input_sync(hall->input); + } + return 0; +} + +static SIMPLE_DEV_PM_OPS(hall_ic_pm_ops, + hall_ic_suspend, hall_ic_resume); + +static struct platform_driver hall_ic_device_driver = { + .probe = hall_ic_probe, + .remove = hall_ic_remove, + .driver = { + .name = "hall_ic", + .owner = THIS_MODULE, + .pm = &hall_ic_pm_ops, + .of_match_table = hall_ic_dt_ids, + } +}; + +static int __init hall_ic_init(void) +{ + return platform_driver_register(&hall_ic_device_driver); +} + +static void __exit hall_ic_exit(void) +{ + platform_driver_unregister(&hall_ic_device_driver); +} + +late_initcall(hall_ic_init); +module_exit(hall_ic_exit); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Hall IC driver for SEC covers"); diff --git a/drivers/input/misc/qpnp-power-on.c b/drivers/input/misc/qpnp-power-on.c index c20b8b8a7f5e..76351d0f4c78 100755 --- a/drivers/input/misc/qpnp-power-on.c +++ b/drivers/input/misc/qpnp-power-on.c @@ -1111,9 +1111,9 @@ again: input_report_key(pon->pon_input, cfg->key_code, key_status); input_sync(pon->pon_input); - pr_info("%s %s: %d, 0x%x, 0x%x, %d\n", SECLOG, __func__, cfg->key_code, pon_rt_sts_ori, pon_rt_sts, !!key_status); + pr_info("[sec_input] %s: %d, 0x%x, 0x%x, %d\n", __func__, cfg->key_code, pon_rt_sts_ori, pon_rt_sts, !!key_status); } else - pr_debug("%s %s: %d, 0x%x, 0x%x, %d (skip)\n", SECLOG, __func__, cfg->key_code, pon_rt_sts_ori, pon_rt_sts, !!key_status); + pr_debug("[sec_input] %s: %d, 0x%x, 0x%x, %d (skip)\n", __func__, cfg->key_code, pon_rt_sts_ori, pon_rt_sts, !!key_status); #if defined(CONFIG_SEC_PM) /* RESIN is used for VOL DOWN key, it should report the keycode for kernel panic */ diff --git a/drivers/input/sec_input/Kconfig b/drivers/input/sec_input/Kconfig new file mode 100755 index 000000000000..bc9ba6d65d2a --- /dev/null +++ b/drivers/input/sec_input/Kconfig @@ -0,0 +1,45 @@ +# +# Sec_Input device configuration +# + +config SEC_DEBUG_TSP_LOG_LEGO + bool "SEC_DEBUG_TSP_LOG_LEGO" + help + Say Y here if you have a SEC_DEBUG_TSP_LOG_LEGO. + If unsure, say N. + +config INPUT_TOUCHSCREEN_TCLMV2_LEGO + bool "INPUT_TOUCHSCREEN_TCLMV2_LEGO" + help + Say Y here if you have a INPUT_TOUCHSCREEN_TCLMV2_LEGO. + If unsure, say N. + +config INPUT_SEC_SECURE_TOUCH_LEGO + bool "INPUT_SEC_SECURE_TOUCH_LEGO" + help + Say Y here if you have a INPUT_SEC_SECURE_TOUCH_LEGO. + If unsure, say N. + +config TOUCHSCREEN_DUMP_MODE_LEGO + bool "TOUCHSCREEN_DUMP_MODE_LEGO" + help + Say Y here if you have a TOUCHSCREEN_DUMP_MODE_LEGO. + If unsure, say N. + +config INPUT_SEC_NOTIFIER_LEGO + bool "INPUT_SEC_NOTIFIER_LEGO" + help + Say Y here if you have a INPUT_SEC_NOTIFIER_LEGO. + If unsure, say N. + +config TOUCHSCREEN_DUAL_FOLDABLE_LEGO + bool "TOUCHSCREEN_DUAL_FOLDABLE_LEGO" + help + Say Y here if you have a TOUCHSCREEN_DUAL_FOLDABLE_LEGO. + If unsure, say N. + +config INPUT_SEC_INPUT_LEGO + bool "INPUT_SEC_INPUT_LEGO" + help + Say Y here if you have a INPUT_SEC_INPUT_LEGO. + If unsure, say N. diff --git a/drivers/input/sec_input/Makefile b/drivers/input/sec_input/Makefile new file mode 100755 index 000000000000..6c374d16cfd9 --- /dev/null +++ b/drivers/input/sec_input/Makefile @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Makefile for the sec_input drivers. +# + +obj-$(CONFIG_SEC_DEBUG_TSP_LOG_LEGO) += sec_tsp_log.o +obj-$(CONFIG_INPUT_TOUCHSCREEN_TCLMV2_LEGO) += sec_tclm_v2.o +obj-$(CONFIG_INPUT_SEC_SECURE_TOUCH_LEGO) += sec_secure_touch.o +obj-$(CONFIG_TOUCHSCREEN_DUMP_MODE_LEGO) += sec_tsp_dumpkey.o +obj-$(CONFIG_INPUT_SEC_NOTIFIER_LEGO) += sec_input_notifier.o +obj-$(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE_LEGO) += sec_virtual_tsp.o +obj-$(CONFIG_INPUT_SEC_INPUT_LEGO) += sec_common_fn.o sec_cmd.o \ No newline at end of file diff --git a/drivers/input/sec_input/sec_cmd.c b/drivers/input/sec_input/sec_cmd.c new file mode 100755 index 000000000000..d7ed52d1d5b3 --- /dev/null +++ b/drivers/input/sec_input/sec_cmd.c @@ -0,0 +1,1110 @@ +/* + * sec_cmd.c - samsung input command driver + * + * Copyright (C) 2014 Samsung Electronics + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include "sec_cmd.h" +#include "sec_input.h" +#include "sec_tsp_log.h" + +struct class *tsp_sec_class; + +#if IS_ENABLED(CONFIG_SEC_KUNIT) +__visible_for_testing struct sec_cmd_data *kunit_sec; +EXPORT_SYMBOL(kunit_sec); +#else +#define __visible_for_testing static +#endif + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +static struct sec_cmd_data *main_sec; +static struct sec_cmd_data *sub_sec; +#endif + +#ifdef USE_SEC_CMD_QUEUE +static void sec_cmd_store_function(struct sec_cmd_data *data); +void sec_cmd_execution(struct sec_cmd_data *data, bool lock) +{ + if (lock) + mutex_lock(&data->fs_lock); + + /* check lock */ + mutex_lock(&data->cmd_lock); + data->cmd_is_running = true; + mutex_unlock(&data->cmd_lock); + + data->cmd_state = SEC_CMD_STATUS_RUNNING; + sec_cmd_store_function(data); + + if (lock) + mutex_unlock(&data->fs_lock); +} +#endif + +void sec_cmd_set_cmd_exit(struct sec_cmd_data *data) +{ +#ifdef USE_SEC_CMD_QUEUE + mutex_lock(&data->fifo_lock); + if (kfifo_len(&data->cmd_queue)) { + pr_info("%s: %s %s: do next cmd, left cmd[%d]\n", dev_name(data->fac_dev), SECLOG, __func__, + (int)(kfifo_len(&data->cmd_queue) / sizeof(struct command))); + mutex_unlock(&data->fifo_lock); + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) + sec_cmd_execution(data, false); +#else + schedule_work(&data->cmd_work.work); +#endif + } else { + mutex_unlock(&data->fifo_lock); + + mutex_lock(&data->cmd_lock); + data->cmd_is_running = false; + mutex_unlock(&data->cmd_lock); + } + if (data->wait_cmd_result_done) + complete_all(&data->cmd_result_done); +#else + mutex_lock(&data->cmd_lock); + data->cmd_is_running = false; + mutex_unlock(&data->cmd_lock); +#endif +} +EXPORT_SYMBOL(sec_cmd_set_cmd_exit); + +#ifdef USE_SEC_CMD_QUEUE +static void cmd_exit_work(struct work_struct *work) +{ + struct sec_cmd_data *data = container_of(work, struct sec_cmd_data, cmd_work.work); + + sec_cmd_execution(data, true); +} +#endif + +void sec_cmd_set_default_result(struct sec_cmd_data *data) +{ + char *delim = ":"; + memset(data->cmd_result, 0x00, SEC_CMD_RESULT_STR_LEN_EXPAND); + memcpy(data->cmd_result, data->cmd, SEC_CMD_STR_LEN); + strlcat(data->cmd_result, delim, SEC_CMD_RESULT_STR_LEN_EXPAND); +} +EXPORT_SYMBOL(sec_cmd_set_default_result); + +void sec_cmd_set_cmd_result_all(struct sec_cmd_data *data, char *buff, int len, char *item) +{ + char *delim1 = " "; + char *delim2 = ":"; + int cmd_result_len; + + cmd_result_len = (int)strlen(data->cmd_result_all) + len + 2 + (int)strlen(item); + + if (cmd_result_len >= SEC_CMD_RESULT_STR_LEN) { + pr_err("%s: %s %s: cmd length is over (%d)!!", dev_name(data->fac_dev), SECLOG, __func__, cmd_result_len); + return; + } + + data->item_count++; + strlcat(data->cmd_result_all, delim1, sizeof(data->cmd_result_all)); + strlcat(data->cmd_result_all, item, sizeof(data->cmd_result_all)); + strlcat(data->cmd_result_all, delim2, sizeof(data->cmd_result_all)); + strlcat(data->cmd_result_all, buff, sizeof(data->cmd_result_all)); +} +EXPORT_SYMBOL(sec_cmd_set_cmd_result_all); + +void sec_cmd_set_cmd_result(struct sec_cmd_data *data, char *buff, int len) +{ + if (strlen(buff) >= (unsigned int)SEC_CMD_RESULT_STR_LEN_EXPAND) { + pr_err("%s %s: cmd length is over (%d)!!", SECLOG, __func__, (int)strlen(buff)); + strlcat(data->cmd_result, "NG", SEC_CMD_RESULT_STR_LEN_EXPAND); + return; + } + + data->cmd_result_expand = (int)strlen(buff) / SEC_CMD_RESULT_STR_LEN; + data->cmd_result_expand_count = 0; + + strlcat(data->cmd_result, buff, SEC_CMD_RESULT_STR_LEN_EXPAND); +} +EXPORT_SYMBOL(sec_cmd_set_cmd_result); + +#ifndef USE_SEC_CMD_QUEUE +__visible_for_testing ssize_t sec_cmd_store(struct device *dev, + struct device_attribute *devattr, const char *buf, size_t count) +{ + struct sec_cmd_data *data = dev_get_drvdata(dev); + char *cur, *start, *end; + char buff[SEC_CMD_STR_LEN] = { 0 }; + int len, i; + struct sec_cmd *sec_cmd_ptr = NULL; + char delim = ','; + bool cmd_found = false; + int param_cnt = 0; + + if (!data) { + pr_err("%s %s: No platform data found\n", SECLOG, __func__); + return -EINVAL; + } + + if (strnlen(buf, SEC_CMD_STR_LEN) >= SEC_CMD_STR_LEN) { + pr_err("%s: %s %s: cmd length(strlen(buf)) is over (%d,%s)!!\n", + dev_name(data->fac_dev), SECLOG, __func__, (int)strlen(buf), buf); + return -EINVAL; + } + + if (count >= (unsigned int)SEC_CMD_STR_LEN) { + pr_err("%s: %s %s: cmd length(count) is over (%d,%s)!!\n", + dev_name(data->fac_dev), SECLOG, __func__, (unsigned int)count, buf); + return -EINVAL; + } + + if (data->cmd_is_running == true) { + pr_err("%s: %s %s: other cmd is running.\n", dev_name(data->fac_dev), SECLOG, __func__); + return -EBUSY; + } + + /* check lock */ + mutex_lock(&data->cmd_lock); + data->cmd_is_running = true; + mutex_unlock(&data->cmd_lock); + + data->cmd_state = SEC_CMD_STATUS_RUNNING; + for (i = 0; i < ARRAY_SIZE(data->cmd_param); i++) + data->cmd_param[i] = 0; + + len = (int)count; + if (*(buf + len - 1) == '\n') + len--; + + memset(data->cmd, 0x00, ARRAY_SIZE(data->cmd)); + memcpy(data->cmd, buf, len); + + cur = strchr(buf, (int)delim); + if (cur) + memcpy(buff, buf, cur - buf); + else + memcpy(buff, buf, len); + + pr_debug("%s: %s %s: COMMAND = %s\n", dev_name(data->fac_dev), SECLOG, __func__, buff); + + /* find command */ + list_for_each_entry(sec_cmd_ptr, &data->cmd_list_head, list) { + if (!strncmp(buff, sec_cmd_ptr->cmd_name, SEC_CMD_STR_LEN)) { + cmd_found = true; + break; + } + } + + /* set not_support_cmd */ + if (!cmd_found) { + list_for_each_entry(sec_cmd_ptr, &data->cmd_list_head, list) { + if (!strncmp("not_support_cmd", sec_cmd_ptr->cmd_name, + SEC_CMD_STR_LEN)) + break; + } + } + + /* parsing parameters */ + if (cur && cmd_found) { + cur++; + start = cur; + memset(buff, 0x00, ARRAY_SIZE(buff)); + + do { + if (*cur == delim || cur - buf == len) { + end = cur; + memcpy(buff, start, end - start); + *(buff + strnlen(buff, ARRAY_SIZE(buff))) = '\0'; + if (kstrtoint(buff, 10, data->cmd_param + param_cnt) < 0) + goto err_out; + start = cur + 1; + memset(buff, 0x00, ARRAY_SIZE(buff)); + param_cnt++; + } + cur++; + } while ((cur - buf <= len) && (param_cnt < SEC_CMD_PARAM_NUM)); + } + + if (cmd_found) { + pr_info("%s: %s %s: cmd = %s", dev_name(data->fac_dev), SECLOG, __func__, sec_cmd_ptr->cmd_name); + for (i = 0; i < param_cnt; i++) { + if (i == 0) + pr_cont(" param ="); + pr_cont(" %d", data->cmd_param[i]); + } + pr_cont("\n"); + } else { + pr_info("%s: %s %s: cmd = %s(%s)\n", dev_name(data->fac_dev), SECLOG, __func__, buff, sec_cmd_ptr->cmd_name); + } + + sec_cmd_ptr->cmd_func(data); + +err_out: + return count; +} + +#else /* defined USE_SEC_CMD_QUEUE */ +static void sec_cmd_store_function(struct sec_cmd_data *data) +{ + char *cur, *start, *end; + char buff[SEC_CMD_STR_LEN] = { 0 }; + int len, i; + struct sec_cmd *sec_cmd_ptr = NULL; + char delim = ','; + bool cmd_found = false; + int param_cnt = 0; + int ret; + const char *buf; + size_t count; + struct command cmd = {{0}}; + + if (!data) { + pr_err("%s %s: No platform data found\n", SECLOG, __func__); + return; + } + + mutex_lock(&data->fifo_lock); + if (kfifo_len(&data->cmd_queue)) { + ret = kfifo_out(&data->cmd_queue, &cmd, sizeof(struct command)); + if (!ret) { + pr_err("%s: %s %s: kfifo_out failed, it seems empty, ret=%d\n", dev_name(data->fac_dev), SECLOG, __func__, ret); + mutex_unlock(&data->fifo_lock); + return; + } + } else { + pr_err("%s: %s %s: left cmd is nothing\n", dev_name(data->fac_dev), SECLOG, __func__); + mutex_unlock(&data->fifo_lock); + mutex_lock(&data->cmd_lock); + data->cmd_is_running = false; + mutex_unlock(&data->cmd_lock); + return; + } + mutex_unlock(&data->fifo_lock); + + buf = cmd.cmd; + count = strlen(buf); + + for (i = 0; i < (int)ARRAY_SIZE(data->cmd_param); i++) + data->cmd_param[i] = 0; + + len = (int)count; + if (*(buf + len - 1) == '\n') + len--; + + memset(data->cmd, 0x00, ARRAY_SIZE(data->cmd)); + memcpy(data->cmd, buf, len); + + cur = strchr(buf, (int)delim); + if (cur) + memcpy(buff, buf, cur - buf); + else + memcpy(buff, buf, len); + + pr_debug("%s: %s %s: COMMAND : %s\n", dev_name(data->fac_dev), SECLOG, __func__, buff); + + /* find command */ + list_for_each_entry(sec_cmd_ptr, &data->cmd_list_head, list) { + if (!strncmp(buff, sec_cmd_ptr->cmd_name, SEC_CMD_STR_LEN)) { + cmd_found = true; + break; + } + } + + /* set not_support_cmd */ + if (!cmd_found) { + list_for_each_entry(sec_cmd_ptr, &data->cmd_list_head, list) { + if (!strncmp("not_support_cmd", sec_cmd_ptr->cmd_name, + SEC_CMD_STR_LEN)) + break; + } + } + + /* parsing parameters */ + if (cur && cmd_found) { + cur++; + start = cur; + memset(buff, 0x00, ARRAY_SIZE(buff)); + + do { + if (*cur == delim || cur - buf == len) { + end = cur; + memcpy(buff, start, end - start); + *(buff + strnlen(buff, ARRAY_SIZE(buff))) = '\0'; + if (kstrtoint(buff, 10, data->cmd_param + param_cnt) < 0) + return; + start = cur + 1; + memset(buff, 0x00, ARRAY_SIZE(buff)); + param_cnt++; + } + cur++; + } while ((cur - buf <= len) && (param_cnt < SEC_CMD_PARAM_NUM)); + } + + if (cmd_found) { + pr_info("%s: %s %s: cmd = %s", dev_name(data->fac_dev), SECLOG, __func__, sec_cmd_ptr->cmd_name); + for (i = 0; i < param_cnt; i++) { + if (i == 0) + pr_cont(" param ="); + pr_cont(" %d", data->cmd_param[i]); + } + pr_cont("\n"); + } else { + pr_info("%s: %s %s: cmd = %s(%s)\n", dev_name(data->fac_dev), SECLOG, __func__, buff, sec_cmd_ptr->cmd_name); + } + + sec_cmd_ptr->cmd_func(data); + + if (cmd_found && sec_cmd_ptr->cmd_log) { + char tbuf[32]; + unsigned long long t; + unsigned long nanosec_rem; + + memset(tbuf, 0x00, sizeof(tbuf)); + t = local_clock(); + nanosec_rem = do_div(t, 1000000000); + snprintf(tbuf, sizeof(tbuf), "[r:%lu.%06lu]", + (unsigned long)t, + nanosec_rem / 1000); +#if IS_ENABLED(CONFIG_SEC_DEBUG_TSP_LOG) + sec_debug_tsp_command_history(tbuf); +#endif + } +} + +__visible_for_testing ssize_t sec_cmd_store(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct sec_cmd_data *data = dev_get_drvdata(dev); + struct command cmd = {{0}}; + struct sec_cmd *sec_cmd_ptr = NULL; + int queue_size; + + if (!data) { + pr_err("%s %s: No platform data found\n", SECLOG, __func__); + return -EINVAL; + } + + if (strnlen(buf, SEC_CMD_STR_LEN) >= SEC_CMD_STR_LEN) { + pr_err("%s: %s %s: cmd length(strlen(buf)) is over (%d,%s)!!\n", + dev_name(data->fac_dev), SECLOG, __func__, (int)strlen(buf), buf); + return -EINVAL; + } + + if (count >= (unsigned int)SEC_CMD_STR_LEN) { + pr_err("%s: %s %s: cmd length(count) is over (%d,%s)!!\n", + dev_name(data->fac_dev), SECLOG, __func__, (unsigned int)count, buf); + return -EINVAL; + } + + if (strnlen(buf, SEC_CMD_STR_LEN) == 0) { + pr_err("%s: %s %s: cmd length is zero (%d,%s) count(%ld)!!\n", + dev_name(data->fac_dev), SECLOG, __func__, (int)strlen(buf), buf, count); + return -EINVAL; + } + + strncpy(cmd.cmd, buf, count); + + if (data->wait_cmd_result_done) { + int ret; + + mutex_lock(&data->wait_lock); + if (!data->cmd_result_done.done) + pr_info("%s: %s %s: %s - waiting prev cmd...\n", dev_name(data->fac_dev), SECLOG, __func__, cmd.cmd); + ret = wait_for_completion_interruptible_timeout(&data->cmd_result_done, msecs_to_jiffies(2000)); + if (ret <= 0) + pr_err("%s: %s %s: completion %d\n", dev_name(data->fac_dev), SECLOG, __func__, ret); + + reinit_completion(&data->cmd_result_done); + mutex_unlock(&data->wait_lock); + } + + list_for_each_entry(sec_cmd_ptr, &data->cmd_list_head, list) { + if (!strncmp(cmd.cmd, sec_cmd_ptr->cmd_name, strlen(sec_cmd_ptr->cmd_name))) { + if (sec_cmd_ptr->cmd_log) { + char task_info[40]; + char tbuf[32]; + unsigned long long t; + unsigned long nanosec_rem; + + memset(tbuf, 0x00, sizeof(tbuf)); + t = local_clock(); + nanosec_rem = do_div(t, 1000000000); + snprintf(tbuf, sizeof(tbuf), "[q:%lu.%06lu]", + (unsigned long)t, + nanosec_rem / 1000); + + snprintf(task_info, 40, "\n[%d:%s:%s]", current->pid, current->comm, dev_name(data->fac_dev)); +#if IS_ENABLED(CONFIG_SEC_DEBUG_TSP_LOG) + sec_debug_tsp_command_history(task_info); + sec_debug_tsp_command_history(cmd.cmd); + sec_debug_tsp_command_history(tbuf); +#endif + } + break; + } + } + + mutex_lock(&data->fifo_lock); + queue_size = (kfifo_len(&data->cmd_queue) / sizeof(struct command)); + + if (kfifo_avail(&data->cmd_queue) && (queue_size < SEC_CMD_MAX_QUEUE)) { + kfifo_in(&data->cmd_queue, &cmd, sizeof(struct command)); + pr_info("%s: %s %s: push cmd: %s\n", dev_name(data->fac_dev), SECLOG, __func__, cmd.cmd); + } else { + pr_err("%s: %s %s: cmd_queue is full!!\n", dev_name(data->fac_dev), SECLOG, __func__); + + kfifo_reset(&data->cmd_queue); + pr_err("%s: %s %s: cmd_queue is reset!!\n", dev_name(data->fac_dev), SECLOG, __func__); + mutex_unlock(&data->fifo_lock); + + mutex_lock(&data->cmd_lock); + data->cmd_is_running = false; + mutex_unlock(&data->cmd_lock); + + if (data->wait_cmd_result_done) + complete_all(&data->cmd_result_done); + + return -ENOSPC; + } + + if (data->cmd_is_running == true) { + pr_err("%s: %s %s: other cmd is running. Wait until previous cmd is done[%d]\n", + dev_name(data->fac_dev), SECLOG, __func__, (int)(kfifo_len(&data->cmd_queue) / sizeof(struct command))); + mutex_unlock(&data->fifo_lock); + return count; + } + mutex_unlock(&data->fifo_lock); + + sec_cmd_execution(data, true); + return count; +} +#endif + +__visible_for_testing ssize_t sec_cmd_show_status(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct sec_cmd_data *data = dev_get_drvdata(dev); + char buff[16] = { 0 }; + + if (!data) { + pr_err("%s %s: No platform data found\n", SECLOG, __func__); + return -EINVAL; + } + + if (data->cmd_state == SEC_CMD_STATUS_WAITING) + snprintf(buff, sizeof(buff), "WAITING"); + + else if (data->cmd_state == SEC_CMD_STATUS_RUNNING) + snprintf(buff, sizeof(buff), "RUNNING"); + + else if (data->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + + else if (data->cmd_state == SEC_CMD_STATUS_FAIL) + snprintf(buff, sizeof(buff), "FAIL"); + + else if (data->cmd_state == SEC_CMD_STATUS_EXPAND) + snprintf(buff, sizeof(buff), "EXPAND"); + + else if (data->cmd_state == SEC_CMD_STATUS_NOT_APPLICABLE) + snprintf(buff, sizeof(buff), "NOT_APPLICABLE"); + + pr_debug("%s: %s %s: %d, %s\n", dev_name(data->fac_dev), SECLOG, __func__, data->cmd_state, buff); + + return snprintf(buf, SEC_CMD_BUF_SIZE, "%s\n", buff); +} + +static ssize_t sec_cmd_show_status_all(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct sec_cmd_data *data = dev_get_drvdata(dev); + char buff[16] = { 0 }; + + if (!data) { + pr_err("%s %s: No platform data found\n", SECLOG, __func__); + return -EINVAL; + } + + if (data->cmd_all_factory_state == SEC_CMD_STATUS_WAITING) + snprintf(buff, sizeof(buff), "WAITING"); + + else if (data->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) + snprintf(buff, sizeof(buff), "RUNNING"); + + else if (data->cmd_all_factory_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + + else if (data->cmd_all_factory_state == SEC_CMD_STATUS_FAIL) + snprintf(buff, sizeof(buff), "FAIL"); + + else if (data->cmd_state == SEC_CMD_STATUS_EXPAND) + snprintf(buff, sizeof(buff), "EXPAND"); + + else if (data->cmd_all_factory_state == SEC_CMD_STATUS_NOT_APPLICABLE) + snprintf(buff, sizeof(buff), "NOT_APPLICABLE"); + + pr_debug("%s: %s %s: %d, %s\n", dev_name(data->fac_dev), SECLOG, __func__, data->cmd_all_factory_state, buff); + + return snprintf(buf, SEC_CMD_BUF_SIZE, "%s\n", buff); +} + +__visible_for_testing ssize_t sec_cmd_show_result(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct sec_cmd_data *data = dev_get_drvdata(dev); + int size; + + if (!data) { + pr_err("%s %s: No platform data found\n", SECLOG, __func__); + return -EINVAL; + } + + size = snprintf(buf, SEC_CMD_RESULT_STR_LEN, "%s\n", + data->cmd_result + (SEC_CMD_RESULT_STR_LEN - 1) * data->cmd_result_expand_count); + + if (data->cmd_result_expand_count != data->cmd_result_expand) { + data->cmd_state = SEC_CMD_STATUS_EXPAND; + data->cmd_result_expand_count++; + } else { + data->cmd_state = SEC_CMD_STATUS_WAITING; + } + + pr_info("%s: %s %s: %s\n", dev_name(data->fac_dev), SECLOG, __func__, buf); + + sec_cmd_set_cmd_exit(data); + + return size; +} + +static ssize_t sec_cmd_show_result_all(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct sec_cmd_data *data = dev_get_drvdata(dev); + int size; + + if (!data) { + pr_err("%s %s: No platform data found\n", SECLOG, __func__); + return -EINVAL; + } + + data->cmd_state = SEC_CMD_STATUS_WAITING; + pr_info("%s: %s %s: %d, %s\n", dev_name(data->fac_dev), SECLOG, __func__, data->item_count, data->cmd_result_all); + size = snprintf(buf, SEC_CMD_RESULT_STR_LEN, "%d%s\n", data->item_count, data->cmd_result_all); + + sec_cmd_set_cmd_exit(data); + + data->item_count = 0; + memset(data->cmd_result_all, 0x00, SEC_CMD_RESULT_STR_LEN); + + return size; +} + +static ssize_t sec_cmd_list_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *data = dev_get_drvdata(dev); + struct sec_cmd *sec_cmd_ptr = NULL; + char *buffer; + char buffer_name[SEC_CMD_STR_LEN]; + int ret = 0; + + buffer = kzalloc(data->cmd_buffer_size + 30, GFP_KERNEL); + if (!buffer) + return -ENOMEM; + + snprintf(buffer, 30, "++factory command list++\n"); + + list_for_each_entry(sec_cmd_ptr, &data->cmd_list_head, list) { + if (strncmp(sec_cmd_ptr->cmd_name, "not_support_cmd", 15)) { + snprintf(buffer_name, SEC_CMD_STR_LEN, "%s\n", sec_cmd_ptr->cmd_name); + strlcat(buffer, buffer_name, data->cmd_buffer_size + 30); + } + } + + ret = snprintf(buf, SEC_CMD_BUF_SIZE, "%s\n", buffer); + kfree(buffer); + + return ret; +} + +static DEVICE_ATTR(cmd, 0220, NULL, sec_cmd_store); +static DEVICE_ATTR(cmd_status, 0444, sec_cmd_show_status, NULL); +static DEVICE_ATTR(cmd_status_all, 0444, sec_cmd_show_status_all, NULL); +static DEVICE_ATTR(cmd_result, 0444, sec_cmd_show_result, NULL); +static DEVICE_ATTR(cmd_result_all, 0444, sec_cmd_show_result_all, NULL); +static DEVICE_ATTR(cmd_list, 0444, sec_cmd_list_show, NULL); + +static struct attribute *sec_fac_attrs[] = { + &dev_attr_cmd.attr, + &dev_attr_cmd_status.attr, + &dev_attr_cmd_status_all.attr, + &dev_attr_cmd_result.attr, + &dev_attr_cmd_result_all.attr, + &dev_attr_cmd_list.attr, + NULL, +}; + +static struct attribute_group sec_fac_attr_group = { + .attrs = sec_fac_attrs, +}; + + +int sec_cmd_init(struct sec_cmd_data *data, struct sec_cmd *cmds, + int len, int devt) +{ + const char *dev_name; + int ret, i; + + INIT_LIST_HEAD(&data->cmd_list_head); + + data->cmd_buffer_size = 0; + for (i = 0; i < len; i++) { + list_add_tail(&cmds[i].list, &data->cmd_list_head); + if (cmds[i].cmd_name) + data->cmd_buffer_size += strlen(cmds[i].cmd_name) + 1; + } + + mutex_init(&data->cmd_lock); + mutex_init(&data->fs_lock); + + mutex_lock(&data->cmd_lock); + data->cmd_is_running = false; + mutex_unlock(&data->cmd_lock); + + data->cmd_result = kzalloc(SEC_CMD_RESULT_STR_LEN_EXPAND, GFP_KERNEL); + if (!data->cmd_result) + goto err_alloc_cmd_result; + +#ifdef USE_SEC_CMD_QUEUE + if (kfifo_alloc(&data->cmd_queue, + SEC_CMD_MAX_QUEUE * sizeof(struct command), GFP_KERNEL)) { + pr_err("%s %s: failed to alloc queue for cmd\n", SECLOG, __func__); + goto err_alloc_queue; + } + mutex_init(&data->fifo_lock); + mutex_init(&data->wait_lock); + init_completion(&data->cmd_result_done); + complete_all(&data->cmd_result_done); + + INIT_DELAYED_WORK(&data->cmd_work, cmd_exit_work); +#endif + + switch (devt) { + case SEC_CLASS_DEVT_TSP: + dev_name = SEC_CLASS_DEV_NAME_TSP; + break; +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) + case SEC_CLASS_DEVT_TSP1: + dev_name = SEC_CLASS_DEV_NAME_TSP1; + break; + case SEC_CLASS_DEVT_TSP2: + dev_name = SEC_CLASS_DEV_NAME_TSP2; + break; +#endif + case SEC_CLASS_DEVT_TKEY: + dev_name = SEC_CLASS_DEV_NAME_TKEY; + break; + case SEC_CLASS_DEVT_WACOM: + dev_name = SEC_CLASS_DEV_NAME_WACOM; + break; + case SEC_CLASS_DEVT_SIDEKEY: + dev_name = SEC_CLASS_DEV_NAME_SIDEKEY; + break; + default: + pr_err("%s %s: not defined devt=%d\n", SECLOG, __func__, devt); + goto err_get_dev_name; + } + +#if IS_ENABLED(CONFIG_DRV_SAMSUNG) + data->fac_dev = sec_device_create(10, data, dev_name); +#else + tsp_sec_class = class_create(THIS_MODULE, "tsp_sec"); + if (unlikely(IS_ERR(tsp_sec_class))) { + pr_err("%s %s: Failed to create class(sec) %ld\n", SECLOG, __func__, PTR_ERR(tsp_sec_class)); + return PTR_ERR(tsp_sec_class); + } + data->fac_dev = device_create(tsp_sec_class, NULL, devt, data, "%s", dev_name); +#endif + + if (IS_ERR(data->fac_dev)) { + pr_err("%s %s: failed to create device for the sysfs\n", SECLOG, __func__); + goto err_sysfs_device; + } + + dev_set_drvdata(data->fac_dev, data); + + ret = sysfs_create_group(&data->fac_dev->kobj, &sec_fac_attr_group); + if (ret < 0) { + pr_err("%s %s: failed to create sysfs group\n", SECLOG, __func__); + goto err_sysfs_group; + } + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) + switch (devt) { + case SEC_CLASS_DEVT_TSP1: + case SEC_CLASS_DEVT_TSP2: + sec_cmd_virtual_tsp_register(data); + break; + }; +#endif + + pr_info("%s: %s %s: done\n", dev_name, SECLOG, __func__); + + return 0; + +err_sysfs_group: +#if IS_ENABLED(CONFIG_DRV_SAMSUNG) + sec_device_destroy(data->fac_dev->devt); +#else + device_destroy(tsp_sec_class, devt); +#endif +err_sysfs_device: +err_get_dev_name: +#ifdef USE_SEC_CMD_QUEUE + mutex_destroy(&data->fifo_lock); + kfifo_free(&data->cmd_queue); + mutex_destroy(&data->wait_lock); +err_alloc_queue: +#endif + kfree(data->cmd_result); +err_alloc_cmd_result: + mutex_destroy(&data->cmd_lock); + list_del(&data->cmd_list_head); + return -ENODEV; +} +EXPORT_SYMBOL(sec_cmd_init); + +void sec_cmd_exit(struct sec_cmd_data *data, int devt) +{ +#ifdef USE_SEC_CMD_QUEUE + struct command cmd = {{0}}; + int ret; +#endif + + pr_info("%s: %s %s\n", dev_name(data->fac_dev), SECLOG, __func__); + sysfs_remove_group(&data->fac_dev->kobj, &sec_fac_attr_group); + dev_set_drvdata(data->fac_dev, NULL); +#if IS_ENABLED(CONFIG_DRV_SAMSUNG) + sec_device_destroy(data->fac_dev->devt); +#else + device_destroy(tsp_sec_class, devt); +#endif +#ifdef USE_SEC_CMD_QUEUE + mutex_lock(&data->fifo_lock); + while (kfifo_len(&data->cmd_queue)) { + ret = kfifo_out(&data->cmd_queue, &cmd, sizeof(struct command)); + if (!ret) { + pr_err("%s %s: kfifo_out failed, it seems empty, ret=%d\n", SECLOG, __func__, ret); + } + pr_info("%s %s: remove pending commands: %s", SECLOG, __func__, cmd.cmd); + } + mutex_unlock(&data->fifo_lock); + mutex_destroy(&data->fifo_lock); + kfifo_free(&data->cmd_queue); + mutex_destroy(&data->wait_lock); + + cancel_delayed_work_sync(&data->cmd_work); + flush_delayed_work(&data->cmd_work); +#endif + data->fac_dev = NULL; + kfree(data->cmd_result); + mutex_destroy(&data->cmd_lock); + list_del(&data->cmd_list_head); +} +EXPORT_SYMBOL(sec_cmd_exit); + +void sec_cmd_send_event_to_user(struct sec_cmd_data *data, char *test, char *result) +{ + char *event[5]; + char timestamp[32]; + char feature[32]; + char stest[32]; + char sresult[64]; + ktime_t calltime; + u64 realtime; + int curr_time; + char *eol = "\0"; + + if (!data || !data->fac_dev) + return; + + calltime = ktime_get(); + realtime = ktime_to_ns(calltime); + do_div(realtime, NSEC_PER_USEC); + curr_time = realtime / USEC_PER_MSEC; + + snprintf(timestamp, 32, "TIMESTAMP=%d", curr_time); + strncat(timestamp, eol, 1); + snprintf(feature, 32, "FEATURE=TSP"); + strncat(feature, eol, 1); + if (!test) { + snprintf(stest, 32, "TEST=NULL"); + } else { + snprintf(stest, 32, "%s", test); + } + strncat(stest, eol, 1); + + if (!result) { + snprintf(sresult, 64, "RESULT=NULL"); + } else { + snprintf(sresult, 64, "%s", result); + } + strncat(sresult, eol, 1); + + pr_info("%s: %s %s: time:%s, feature:%s, test:%s, result:%s\n", + dev_name(data->fac_dev), SECLOG, __func__, timestamp, feature, stest, sresult); + + event[0] = timestamp; + event[1] = feature; + event[2] = stest; + event[3] = sresult; + event[4] = NULL; + + kobject_uevent_env(&data->fac_dev->kobj, KOBJ_CHANGE, event); +} +EXPORT_SYMBOL(sec_cmd_send_event_to_user); + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +void sec_cmd_virtual_tsp_register(struct sec_cmd_data *sec) +{ + if (strcmp(dev_name(sec->fac_dev), SEC_CLASS_DEV_NAME_TSP1) == 0) { + main_sec = sec; + input_info(true, sec->fac_dev, "%s: main\n", __func__); + } else if (strcmp(dev_name(sec->fac_dev), SEC_CLASS_DEV_NAME_TSP2) == 0) { + sub_sec = sec; + input_info(true, sec->fac_dev, "%s: sub\n", __func__); + } +} + +int sec_cmd_virtual_tsp_read_sysfs(struct sec_cmd_data *sec, const char *path, char *buf, int len) +{ + int ret = 0; + mm_segment_t old_fs; + struct file *sysfs; + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 10, 0)) + return 0; +#endif + old_fs = get_fs(); + set_fs(KERNEL_DS); + + sysfs = filp_open(path, O_RDONLY, 0444); + if (IS_ERR(sysfs)) { + ret = PTR_ERR(sysfs); + input_err(true, sec->fac_dev, "%s: %s open fail, %d\n", __func__, path, ret); + set_fs(old_fs); + return ret; + } + + ret = sysfs->f_op->read(sysfs, buf, len, &sysfs->f_pos); + if (ret < 0) { + input_err(true, sec->fac_dev, "%s: failed to read, len:%d, ret:%d\n", __func__, len, ret); + ret = -EIO; + } + + filp_close(sysfs, current->files); + set_fs(old_fs); + + return ret; +} +EXPORT_SYMBOL(sec_cmd_virtual_tsp_read_sysfs); + +int sec_cmd_virtual_tsp_write_sysfs(struct sec_cmd_data *sec, const char *path, const char *cmd) +{ + int ret = 0; + mm_segment_t old_fs; + struct file *sysfs; + int len; + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 10, 0)) + return 0; +#endif + old_fs = get_fs(); + set_fs(KERNEL_DS); + + sysfs = filp_open(path, O_WRONLY, 0220); + if (IS_ERR(sysfs)) { + ret = PTR_ERR(sysfs); + input_err(true, sec->fac_dev, "%s: %s open fail, %d\n", __func__, path, ret); + set_fs(old_fs); + return ret; + } + + len = strlen(cmd); + ret = sysfs->f_op->write(sysfs, cmd, len, &sysfs->f_pos); + if (ret != len) { + input_err(true, sec->fac_dev, "%s: failed to write, len:%d, ret:%d\n", __func__, len, ret); + ret = -EIO; + } + + filp_close(sysfs, current->files); + set_fs(old_fs); + + return ret; +} +EXPORT_SYMBOL(sec_cmd_virtual_tsp_write_sysfs); + +static int sec_cmd_virtual_tsp_get_cmd_status(struct sec_cmd_data *sec, char *path) +{ + u8 buff[16]; + int ret; + + memset(buff, 0x00, sizeof(buff)); + + ret = sec_cmd_virtual_tsp_read_sysfs(sec, path, buff, 16); + if (ret < 0) + return SEC_CMD_STATUS_FAIL; + + if (strncmp(buff, "WAITING", 7) == 0) + return SEC_CMD_STATUS_WAITING; + else if (strncmp(buff, "OK", 2) == 0) + return SEC_CMD_STATUS_OK; + else if (strncmp(buff, "FAIL", 4) == 0) + return SEC_CMD_STATUS_FAIL; + else if (strncmp(buff, "RUNNING", 7) == 0) + return SEC_CMD_STATUS_RUNNING; + else if (strncmp(buff, "EXPAND", 6) == 0) + return SEC_CMD_STATUS_EXPAND; + else + return SEC_CMD_STATUS_NOT_APPLICABLE; +} + +int sec_cmd_virtual_tsp_write_cmd(struct sec_cmd_data *sec, bool main, bool sub) +{ + u8 buff[16]; + int ret_sub = 0; + int ret_main = 0; + bool exit = false; + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 10, 0)) + return 0; +#endif + sec_cmd_set_default_result(sec); + + if (!main && !sub) { + snprintf(buff, sizeof(buff), "%s", "NA"); + sec->cmd_state = SEC_CMD_STATUS_NOT_APPLICABLE; + goto err; + } + + if (sub && sub_sec) { + input_dbg(true, sec->fac_dev, "%s: send to sub\n", sec->cmd); + ret_sub = sec_cmd_virtual_tsp_write_sysfs(sec, PATH_SUB_SEC_CMD, sec->cmd); + if (ret_sub < 0) { + snprintf(buff, sizeof(buff), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto main; + } + sec->cmd_state = sec_cmd_virtual_tsp_get_cmd_status(sec, PATH_SUB_SEC_CMD_STATUS); + input_dbg(true, sec->fac_dev, "%s: sub_sec OK\n", sec->cmd); + if (!sub_sec->cmd_is_running) + exit = true; + sec_cmd_virtual_tsp_read_sysfs(sec, PATH_SUB_SEC_CMD_RESULT, sec->cmd_result, SEC_CMD_RESULT_STR_LEN); + memset(sec->cmd_result, 0x00, SEC_CMD_RESULT_STR_LEN_EXPAND); + sec_cmd_set_cmd_result(sec, sub_sec->cmd_result, strlen(sub_sec->cmd_result)); + } +main: + if (main && main_sec) { + input_dbg(true, sec->fac_dev, "%s: send to main\n", sec->cmd); + ret_main = sec_cmd_virtual_tsp_write_sysfs(sec, PATH_MAIN_SEC_CMD, sec->cmd); + if (ret_main < 0) { + snprintf(buff, sizeof(buff), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto err; + } + sec->cmd_state = sec_cmd_virtual_tsp_get_cmd_status(sec, PATH_MAIN_SEC_CMD_STATUS); + input_dbg(true, sec->fac_dev, "%s: main_sec OK\n", sec->cmd); + if (!main_sec->cmd_is_running) + exit = true; + sec_cmd_virtual_tsp_read_sysfs(sec, PATH_MAIN_SEC_CMD_RESULT, sec->cmd_result, SEC_CMD_RESULT_STR_LEN); + memset(sec->cmd_result, 0x00, SEC_CMD_RESULT_STR_LEN_EXPAND); + sec_cmd_set_cmd_result(sec, main_sec->cmd_result, strlen(main_sec->cmd_result)); + } + if (exit) { + input_dbg(true, sec->fac_dev, "%s: set_cmd_exit\n", sec->cmd); + sec_cmd_set_cmd_exit(sec); + } + + return (ret_sub < 0 || ret_main < 0) ? -1 : 0; + +err: + sec_cmd_set_cmd_result(sec, buff, SEC_CMD_RESULT_STR_LEN); + sec_cmd_set_cmd_exit(sec); + + return -1; +} +EXPORT_SYMBOL(sec_cmd_virtual_tsp_write_cmd); + +void sec_cmd_virtual_tsp_write_cmd_factory_all(struct sec_cmd_data *sec, bool main, bool sub) +{ + u8 buff[16]; + int ret = 0; + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 10, 0)) + return; +#endif + sec_cmd_set_default_result(sec); + + if (!main && !sub) { + snprintf(buff, sizeof(buff), "%s", "NA"); + sec->cmd_state = SEC_CMD_STATUS_NOT_APPLICABLE; + goto err; + } + + if (sub && sub_sec) { + input_dbg(true, sec->fac_dev, "%s: sub\n", sec->cmd); + ret = sec_cmd_virtual_tsp_write_sysfs(sec, PATH_SUB_SEC_CMD, sec->cmd); + if (ret < 0) { + snprintf(buff, sizeof(buff), "%s", "NG"); + sec->cmd_all_factory_state = SEC_CMD_STATUS_FAIL; + goto main; + } + sec->cmd_all_factory_state = sec_cmd_virtual_tsp_get_cmd_status(sec, PATH_SUB_SEC_CMD_STATUS_ALL); + sec_cmd_virtual_tsp_read_sysfs(sec, PATH_SUB_SEC_CMD_RESULT_ALL, sec->cmd_result_all, SEC_CMD_RESULT_STR_LEN); + } +main: + if (main && main_sec) { + input_dbg(true, sec->fac_dev, "%s: main\n", sec->cmd); + ret = sec_cmd_virtual_tsp_write_sysfs(sec, PATH_MAIN_SEC_CMD, sec->cmd); + if (ret < 0) { + snprintf(buff, sizeof(buff), "%s", "NG"); + sec->cmd_all_factory_state = SEC_CMD_STATUS_FAIL; + goto err; + } + sec->cmd_all_factory_state = sec_cmd_virtual_tsp_get_cmd_status(sec, PATH_MAIN_SEC_CMD_STATUS_ALL); + sec_cmd_virtual_tsp_read_sysfs(sec, PATH_MAIN_SEC_CMD_RESULT_ALL, sec->cmd_result_all, SEC_CMD_RESULT_STR_LEN); + } + + return; + +err: + sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_RESULT_STR_LEN, "NONE"); +} +EXPORT_SYMBOL(sec_cmd_virtual_tsp_write_cmd_factory_all); +#endif + +#if IS_ENABLED(CONFIG_SEC_KUNIT) && !IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +kunit_notifier_chain_init(sec_cmd_test_module); + +static int __init sec_cmd_m_init(void) +{ + kunit_notifier_chain_register(sec_cmd_test_module); + return 0; +} + +static void __exit sec_cmd_m_exit(void) +{ + kunit_notifier_chain_unregister(sec_cmd_test_module); +} + +module_init(sec_cmd_m_init); +module_exit(sec_cmd_m_exit); +#endif + +MODULE_DESCRIPTION("Samsung input command"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/sec_input/sec_cmd.h b/drivers/input/sec_input/sec_cmd.h new file mode 100755 index 000000000000..35690d5bc43b --- /dev/null +++ b/drivers/input/sec_input/sec_cmd.h @@ -0,0 +1,129 @@ +#ifndef _SEC_CMD_H_ +#define _SEC_CMD_H_ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if IS_ENABLED(CONFIG_DRV_SAMSUNG) +#include +#endif + +#if !IS_ENABLED(CONFIG_SEC_FACTORY) +#define USE_SEC_CMD_QUEUE +#include +#endif + +#define SEC_CLASS_DEVT_TSP 10 +#define SEC_CLASS_DEVT_TKEY 11 +#define SEC_CLASS_DEVT_WACOM 12 +#define SEC_CLASS_DEVT_SIDEKEY 13 +#define SEC_CLASS_DEV_NAME_TSP "tsp" +#define SEC_CLASS_DEV_NAME_TKEY "sec_touchkey" +#define SEC_CLASS_DEV_NAME_WACOM "sec_epen" +#define SEC_CLASS_DEV_NAME_SIDEKEY "sec_sidekey" + +#define SEC_CLASS_DEVT_TSP1 15 +#define SEC_CLASS_DEVT_TSP2 16 +#define SEC_CLASS_DEV_NAME_TSP1 "tsp1" +#define SEC_CLASS_DEV_NAME_TSP2 "tsp2" + +#define SEC_CMD(name, func) .cmd_name = name, .cmd_func = func +#define SEC_CMD_H(name, func) .cmd_name = name, .cmd_func = func, .cmd_log = 1 +#define SEC_CMD_BUF_SIZE (4096 - 1) +#define SEC_CMD_STR_LEN 256 +#define SEC_CMD_RESULT_STR_LEN (4096 - 1) +#define SEC_CMD_RESULT_STR_LEN_EXPAND (SEC_CMD_RESULT_STR_LEN * 6) +#define SEC_CMD_PARAM_NUM 8 + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +#define DEV_COUNT 2 + +#define FLIP_STATUS_DEFAULT -1 +#define FLIP_STATUS_MAIN 0 +#define FLIP_STATUS_SUB 1 + +#define PATH_MAIN_SEC_CMD "/sys/class/sec/tsp1/cmd" +#define PATH_MAIN_SEC_CMD_STATUS "/sys/class/sec/tsp1/cmd_status" +#define PATH_MAIN_SEC_CMD_RESULT "/sys/class/sec/tsp1/cmd_result" +#define PATH_MAIN_SEC_CMD_STATUS_ALL "/sys/class/sec/tsp1/cmd_status_all" +#define PATH_MAIN_SEC_CMD_RESULT_ALL "/sys/class/sec/tsp1/cmd_result_all" + +#define PATH_SUB_SEC_CMD "/sys/class/sec/tsp2/cmd" +#define PATH_SUB_SEC_CMD_STATUS "/sys/class/sec/tsp2/cmd_status" +#define PATH_SUB_SEC_CMD_RESULT "/sys/class/sec/tsp2/cmd_result" +#define PATH_SUB_SEC_CMD_STATUS_ALL "/sys/class/sec/tsp2/cmd_status_all" +#define PATH_SUB_SEC_CMD_RESULT_ALL "/sys/class/sec/tsp2/cmd_result_all" +#endif + +struct sec_cmd { + struct list_head list; + const char *cmd_name; + void (*cmd_func)(void *device_data); + int cmd_log; +}; + +enum SEC_CMD_STATUS { + SEC_CMD_STATUS_WAITING = 0, + SEC_CMD_STATUS_RUNNING, // = 1 + SEC_CMD_STATUS_OK, // = 2 + SEC_CMD_STATUS_FAIL, // = 3 + SEC_CMD_STATUS_EXPAND, // = 4 + SEC_CMD_STATUS_NOT_APPLICABLE, // = 5 +}; + +#ifdef USE_SEC_CMD_QUEUE +#define SEC_CMD_MAX_QUEUE 10 + +struct command { + char cmd[SEC_CMD_STR_LEN]; +}; +#endif + +struct sec_cmd_data { + struct device *fac_dev; + struct list_head cmd_list_head; + u8 cmd_state; + char cmd[SEC_CMD_STR_LEN]; + int cmd_param[SEC_CMD_PARAM_NUM]; + char *cmd_result; + int cmd_result_expand; + int cmd_result_expand_count; + int cmd_buffer_size; + volatile bool cmd_is_running; + struct mutex cmd_lock; + struct mutex fs_lock; +#ifdef USE_SEC_CMD_QUEUE + struct kfifo cmd_queue; + struct mutex fifo_lock; + struct delayed_work cmd_work; + struct mutex wait_lock; + struct completion cmd_result_done; +#endif + bool wait_cmd_result_done; + int item_count; + char cmd_result_all[SEC_CMD_RESULT_STR_LEN]; + u8 cmd_all_factory_state; +}; + +extern void sec_cmd_set_cmd_exit(struct sec_cmd_data *data); +extern void sec_cmd_set_default_result(struct sec_cmd_data *data); +extern void sec_cmd_set_cmd_result(struct sec_cmd_data *data, char *buff, int len); +extern void sec_cmd_set_cmd_result_all(struct sec_cmd_data *data, char *buff, int len, char *item); +extern int sec_cmd_init(struct sec_cmd_data *data, struct sec_cmd *cmds, int len, int devt); +extern void sec_cmd_exit(struct sec_cmd_data *data, int devt); +extern void sec_cmd_send_event_to_user(struct sec_cmd_data *data, char *test, char *result); + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +void sec_cmd_virtual_tsp_register(struct sec_cmd_data *sec); +int sec_cmd_virtual_tsp_read_sysfs(struct sec_cmd_data *sec, const char *path, char *buf, int len); +int sec_cmd_virtual_tsp_write_sysfs(struct sec_cmd_data *sec, const char *path, const char *cmd); +int sec_cmd_virtual_tsp_write_cmd(struct sec_cmd_data *sec, bool main, bool sub); +void sec_cmd_virtual_tsp_write_cmd_factory_all(struct sec_cmd_data *sec, bool main, bool sub); +#endif +#endif /* _SEC_CMD_H_ */ diff --git a/drivers/input/sec_input/sec_common_fn.c b/drivers/input/sec_input/sec_common_fn.c new file mode 100755 index 000000000000..a050607ab340 --- /dev/null +++ b/drivers/input/sec_input/sec_common_fn.c @@ -0,0 +1,1515 @@ +/* + * sec_common_fn.c - samsung common functions + * + * Copyright (C) 2020 Samsung Electronics + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include "sec_input.h" + +#if !IS_ENABLED(CONFIG_SEC_KUNIT) +#define __visible_for_testing static +#endif + +static char *lcd_id; +module_param(lcd_id, charp, S_IRUGO); + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +static char *lcd_id1; +module_param(lcd_id1, charp, S_IRUGO); +#endif + +struct device *ptsp; +EXPORT_SYMBOL(ptsp); + +struct sec_ts_secure_data *psecuretsp = NULL; +EXPORT_SYMBOL(psecuretsp); + +static int sec_input_lcd_parse_panel_id(char *panel_id) +{ + char *pt; + int lcd_id_p = 0; + + if (IS_ERR_OR_NULL(panel_id)) + return lcd_id_p; + + for (pt = panel_id; *pt != 0; pt++) { + lcd_id_p <<= 4; + switch (*pt) { + case '0' ... '9': + lcd_id_p += *pt - '0'; + break; + case 'a' ... 'f': + lcd_id_p += 10 + *pt - 'a'; + break; + case 'A' ... 'F': + lcd_id_p += 10 + *pt - 'A'; + break; + } + } + return lcd_id_p; +} + +int sec_input_get_lcd_id(struct device *dev) +{ +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) + struct sec_ts_plat_data *pdata = dev->platform_data; +#endif +#if !IS_ENABLED(CONFIG_SMCDSD_PANEL) + int lcdtype = 0; +#endif +#if IS_ENABLED(CONFIG_EXYNOS_DPU30) || IS_ENABLED(CONFIG_MCD_PANEL) + int connected; +#endif + int lcd_id_param = 0; + +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) + lcdtype = get_lcd_attached("GET"); + if (lcdtype == 0xFFFFFF) { + input_err(true, dev, "%s: lcd is not attached(GET)\n", __func__); + return -ENODEV; + } +#endif + +#if IS_ENABLED(CONFIG_EXYNOS_DPU30) || IS_ENABLED(CONFIG_MCD_PANEL) + connected = get_lcd_info("connected"); + if (connected < 0) { + input_err(true, dev, "%s: Failed to get lcd info(connected)\n", __func__); + return -EINVAL; + } + + if (!connected) { + input_err(true, dev, "%s: lcd is disconnected(connected)\n", __func__); + return -ENODEV; + } + + input_info(true, dev, "%s: lcd is connected\n", __func__); + + lcdtype = get_lcd_info("id"); + if (lcdtype < 0) { + input_err(true, dev, "%s: Failed to get lcd info(id)\n", __func__); + return -EINVAL; + } +#endif +#if IS_ENABLED(CONFIG_SMCDSD_PANEL) + if (!lcdtype) { + input_err(true, dev, "%s: lcd is disconnected(lcdtype)\n", __func__); + return -ENODEV; + } +#endif + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) + input_info(true, dev, "%s: %d\n", __func__, pdata->support_dual_foldable); + if (pdata->support_dual_foldable == SUB_TOUCH) + lcd_id_param = sec_input_lcd_parse_panel_id(lcd_id1); + else +#endif + lcd_id_param = sec_input_lcd_parse_panel_id(lcd_id); + + if (lcdtype <= 0 && lcd_id_param != 0) { + lcdtype = lcd_id_param; + if (lcdtype == 0xFFFFFF) { + input_err(true, dev, "%s: lcd is not attached(PARAM)\n", __func__); + return -ENODEV; + } + } + + input_info(true, dev, "%s: lcdtype 0x%08X\n", __func__, lcdtype); + return lcdtype; +} +EXPORT_SYMBOL(sec_input_get_lcd_id); + +int sec_input_handler_start(struct device *dev) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + int ret = 0; + + if (gpio_get_value(pdata->irq_gpio) == 1) + return SEC_ERROR; + + if (pdata->power_state == SEC_INPUT_STATE_LPM) { + __pm_wakeup_event(pdata->sec_ws, SEC_TS_WAKE_LOCK_TIME); + + ret = wait_for_completion_interruptible_timeout(&pdata->resume_done, msecs_to_jiffies(500)); + if (ret == 0) { + input_err(true, dev, "%s: LPM: pm resume is not handled\n", __func__); + return SEC_ERROR; + } + + if (ret < 0) { + input_err(true, dev, "%s: LPM: -ERESTARTSYS if interrupted, %d\n", __func__, ret); + return ret; + } + + input_info(true, dev, "%s: run LPM interrupt handler, %d\n", __func__, ret); + } + + return SEC_SUCCESS; +} +EXPORT_SYMBOL(sec_input_handler_start); + +/************************************************************ + * 720 * 1480 : <48 96 60> + * indicator: 24dp navigator:48dp edge:60px dpi=320 + * 1080 * 2220 : 4096 * 4096 : <133 266 341> (approximately value) + ************************************************************/ +static void location_detect(struct sec_ts_plat_data *pdata, int t_id) +{ + int x = pdata->coord[t_id].x, y = pdata->coord[t_id].y; + + memset(pdata->location, 0x00, SEC_TS_LOCATION_DETECT_SIZE); + + if (x < pdata->area_edge) + strlcat(pdata->location, "E.", SEC_TS_LOCATION_DETECT_SIZE); + else if (x < (pdata->max_x - pdata->area_edge)) + strlcat(pdata->location, "C.", SEC_TS_LOCATION_DETECT_SIZE); + else + strlcat(pdata->location, "e.", SEC_TS_LOCATION_DETECT_SIZE); + + if (y < pdata->area_indicator) + strlcat(pdata->location, "S", SEC_TS_LOCATION_DETECT_SIZE); + else if (y < (pdata->max_y - pdata->area_navigation)) + strlcat(pdata->location, "C", SEC_TS_LOCATION_DETECT_SIZE); + else + strlcat(pdata->location, "N", SEC_TS_LOCATION_DETECT_SIZE); +} + +void sec_delay(unsigned int ms) +{ + if (ms < 20) + usleep_range(ms * 1000, ms * 1000); + else + msleep(ms); +} +EXPORT_SYMBOL(sec_delay); + +int sec_input_set_temperature(struct device *dev, int state) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + int ret = 0; + u8 temperature_data = 0; + bool bforced = false; + + if (pdata->set_temperature == NULL) { + input_dbg(true, dev, "%s: vendor function is not allocated\n", __func__); + return SEC_ERROR; + } + + if (state == SEC_INPUT_SET_TEMPERATURE_NORMAL) { + if (pdata->touch_count) { + pdata->tsp_temperature_data_skip = true; + input_err(true, dev, "%s: skip, t_cnt(%d)\n", + __func__, pdata->touch_count); + return SEC_SUCCESS; + } + } else if (state == SEC_INPUT_SET_TEMPERATURE_IN_IRQ) { + if (pdata->touch_count != 0 || pdata->tsp_temperature_data_skip == false) + return SEC_SUCCESS; + } else if (state == SEC_INPUT_SET_TEMPERATURE_FORCE) { + bforced = true; + } else { + input_err(true, dev, "%s: invalid param %d\n", __func__, state); + return SEC_ERROR; + } + + pdata->tsp_temperature_data_skip = false; + + if (!pdata->psy) + pdata->psy = power_supply_get_by_name("battery"); + + if (!pdata->psy) { + input_err(true, dev, "%s: cannot find power supply\n", __func__); + return SEC_ERROR; + } + + ret = power_supply_get_property(pdata->psy, POWER_SUPPLY_PROP_TEMP, &pdata->psy_value); + if (ret < 0) { + input_err(true, dev, "%s: couldn't get temperature value, ret:%d\n", __func__, ret); + return ret; + } + + temperature_data = (u8)(pdata->psy_value.intval / 10); + + if (bforced || pdata->tsp_temperature_data != temperature_data) { + ret = pdata->set_temperature(dev, temperature_data); + if (ret < 0) { + input_err(true, dev, "%s: failed to write temperature %u, ret=%d\n", + __func__, temperature_data, ret); + return ret; + } + + pdata->tsp_temperature_data = temperature_data; + input_info(true, dev, "%s set temperature:%u\n", __func__, temperature_data); + } else { + input_dbg(true, dev, "%s skip temperature:%u\n", __func__, temperature_data); + } + + return SEC_SUCCESS; +} +EXPORT_SYMBOL(sec_input_set_temperature); + +void sec_input_set_grip_type(struct device *dev, u8 set_type) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + u8 mode = G_NONE; + + if (pdata->set_grip_data == NULL) { + input_dbg(true, dev, "%s: vendor function is not allocated\n", __func__); + return; + } + + input_info(true, dev, "%s: re-init grip(%d), edh:%d, edg:%d, lan:%d\n", __func__, + set_type, pdata->grip_data.edgehandler_direction, + pdata->grip_data.edge_range, pdata->grip_data.landscape_mode); + + if (pdata->grip_data.edgehandler_direction != 0) + mode |= G_SET_EDGE_HANDLER; + + if (set_type == GRIP_ALL_DATA) { + /* edge */ + if (pdata->grip_data.edge_range != 60) + mode |= G_SET_EDGE_ZONE; + + /* dead zone default 0 mode, 32 */ + if (pdata->grip_data.landscape_mode == 1) + mode |= G_SET_LANDSCAPE_MODE; + else + mode |= G_SET_NORMAL_MODE; + } + + if (mode) + pdata->set_grip_data(dev, mode); +} +EXPORT_SYMBOL(sec_input_set_grip_type); + +int sec_input_check_cover_type(struct device *dev) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + int cover_cmd = 0; + + switch (pdata->cover_type) { + case SEC_TS_FLIP_COVER: + case SEC_TS_SVIEW_COVER: + case SEC_TS_SVIEW_CHARGER_COVER: + case SEC_TS_S_VIEW_WALLET_COVER: + case SEC_TS_LED_COVER: + case SEC_TS_CLEAR_COVER: + case SEC_TS_KEYBOARD_KOR_COVER: + case SEC_TS_KEYBOARD_US_COVER: + case SEC_TS_CLEAR_SIDE_VIEW_COVER: + case SEC_TS_MINI_SVIEW_WALLET_COVER: + case SEC_TS_MONTBLANC_COVER: + case SEC_TS_CLEAR_CAMERA_VIEW_COVER: + cover_cmd = pdata->cover_type; + break; + default: + input_err(true, dev, "%s: not change touch state, cover_type=%d\n", + __func__, pdata->cover_type); + break; + } + + return cover_cmd; +} +EXPORT_SYMBOL(sec_input_check_cover_type); + +void sec_input_set_fod_info(struct device *dev, int vi_x, int vi_y, int vi_size, int vi_event) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + int byte_size = vi_x * vi_y / 8; + + if (vi_x * vi_y % 8) + byte_size++; + + pdata->fod_data.vi_x = vi_x; + pdata->fod_data.vi_y = vi_y; + pdata->fod_data.vi_size = vi_size; + pdata->fod_data.vi_event = vi_event; + + if (byte_size != vi_size) + input_err(true, dev, "%s: NEED TO CHECK! vi size %d maybe wrong (byte size should be %d)\n", + __func__, vi_size, byte_size); + + input_info(true, dev, "%s: vi_event:%d, x:%d, y:%d, size:%d\n", + __func__, pdata->fod_data.vi_event, pdata->fod_data.vi_x, pdata->fod_data.vi_y, + pdata->fod_data.vi_size); +} +EXPORT_SYMBOL(sec_input_set_fod_info); + +ssize_t sec_input_get_fod_info(struct device *dev, char *buf) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + + if (!pdata->support_fod) { + input_err(true, dev, "%s: fod is not supported\n", __func__); + return snprintf(buf, SEC_CMD_BUF_SIZE, "NG"); + } + + if (pdata->x_node_num <= 0 || pdata->y_node_num <= 0) { + input_err(true, dev, "%s: x/y node num value is wrong\n", __func__); + return snprintf(buf, SEC_CMD_BUF_SIZE, "NG"); + } + + input_info(true, dev, "%s: x:%d/%d, y:%d/%d, size:%d\n", + __func__, pdata->fod_data.vi_x, pdata->x_node_num, + pdata->fod_data.vi_y, pdata->y_node_num, pdata->fod_data.vi_size); + + return snprintf(buf, SEC_CMD_BUF_SIZE, "%d,%d,%d,%d,%d", + pdata->fod_data.vi_x, pdata->fod_data.vi_y, + pdata->fod_data.vi_size, pdata->x_node_num, pdata->y_node_num); +} +EXPORT_SYMBOL(sec_input_get_fod_info); + +bool sec_input_set_fod_rect(struct device *dev, int *rect_data) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + int i; + + pdata->fod_data.set_val = 1; + + if (rect_data[0] <= 0 || rect_data[1] <= 0 || rect_data[2] <= 0 || rect_data[3] <= 0) + pdata->fod_data.set_val = 0; + + if (pdata->display_x > 0 && pdata->display_y > 0) + if (rect_data[0] >= pdata->display_x || rect_data[1] >= pdata->display_y + || rect_data[2] >= pdata->display_x || rect_data[3] >= pdata->display_y) + pdata->fod_data.set_val = 0; + + if (pdata->fod_data.set_val) + for (i = 0; i < 4; i++) + pdata->fod_data.rect_data[i] = rect_data[i]; + + return pdata->fod_data.set_val; +} +EXPORT_SYMBOL(sec_input_set_fod_rect); + +int sec_input_check_wirelesscharger_mode(struct device *dev, int mode, int force) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + + if (mode != TYPE_WIRELESS_CHARGER_NONE + && mode != TYPE_WIRELESS_CHARGER + && mode != TYPE_WIRELESS_BATTERY_PACK) { + input_err(true, dev, + "%s: invalid param %d\n", __func__, mode); + return SEC_ERROR; + } + + if (pdata->force_wirelesscharger_mode == true && force == 0) { + input_err(true, dev, + "%s: [force enable] skip %d\n", __func__, mode); + return SEC_SKIP; + } + + if (force == 1) { + if (mode == TYPE_WIRELESS_CHARGER_NONE) { + pdata->force_wirelesscharger_mode = false; + input_err(true, dev, + "%s: force enable off\n", __func__); + return SEC_SKIP; + } + + pdata->force_wirelesscharger_mode = true; + } + + pdata->wirelesscharger_mode = mode & 0xFF; + + return SEC_SUCCESS; +} +EXPORT_SYMBOL(sec_input_check_wirelesscharger_mode); + +ssize_t sec_input_get_common_hw_param(struct sec_ts_plat_data *pdata, char *buf) +{ + char buff[SEC_INPUT_HW_PARAM_SIZE]; + char tbuff[SEC_CMD_STR_LEN]; + + memset(buff, 0x00, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"TITO\":\"%02X%02X%02X%02X\",", + pdata->hw_param.ito_test[0], pdata->hw_param.ito_test[1], + pdata->hw_param.ito_test[2], pdata->hw_param.ito_test[3]); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"TMUL\":\"%d\",", pdata->hw_param.multi_count); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"TWET\":\"%d\",", pdata->hw_param.wet_count); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"TNOI\":\"%d\",", pdata->hw_param.noise_count); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"TCOM\":\"%d\",", pdata->hw_param.comm_err_count); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"TCHK\":\"%d\",", pdata->hw_param.checksum_result); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"TTCN\":\"%d\",\"TACN\":\"%d\",\"TSCN\":\"%d\",", + pdata->hw_param.all_finger_count, pdata->hw_param.all_aod_tap_count, + pdata->hw_param.all_spay_count); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"TMCF\":\"%d\",", pdata->hw_param.mode_change_failed_count); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"TRIC\":\"%d\"", pdata->hw_param.ic_reset_count); + strlcat(buff, tbuff, sizeof(buff)); + + return snprintf(buf, SEC_INPUT_HW_PARAM_SIZE, "%s", buff); +} +EXPORT_SYMBOL(sec_input_get_common_hw_param); + +void sec_input_clear_common_hw_param(struct sec_ts_plat_data *pdata) +{ + pdata->hw_param.multi_count = 0; + pdata->hw_param.wet_count = 0; + pdata->hw_param.noise_count = 0; + pdata->hw_param.comm_err_count = 0; + pdata->hw_param.checksum_result = 0; + pdata->hw_param.all_finger_count = 0; + pdata->hw_param.all_aod_tap_count = 0; + pdata->hw_param.all_spay_count = 0; + pdata->hw_param.mode_change_failed_count = 0; + pdata->hw_param.ic_reset_count = 0; +} +EXPORT_SYMBOL(sec_input_clear_common_hw_param); + +void sec_input_print_info(struct device *dev, struct sec_tclm_data *tdata) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + char tclm_buff[INPUT_TCLM_LOG_BUF_SIZE] = { 0 }; + + pdata->print_info_cnt_open++; + + if (pdata->print_info_cnt_open > 0xfff0) + pdata->print_info_cnt_open = 0; + + if (pdata->touch_count == 0) + pdata->print_info_cnt_release++; + +#if IS_ENABLED(CONFIG_INPUT_TOUCHSCREEN_TCLMV2) + if (tdata && (tdata->tclm_level == TCLM_LEVEL_NOT_SUPPORT)) + snprintf(tclm_buff, sizeof(tclm_buff), ""); + else if (tdata && tdata->tclm_string) + snprintf(tclm_buff, sizeof(tclm_buff), "C%02XT%04X.%4s%s Cal_flag:%d fail_cnt:%d", + tdata->nvdata.cal_count, tdata->nvdata.tune_fix_ver, + tdata->tclm_string[tdata->nvdata.cal_position].f_name, + (tdata->tclm_level == TCLM_LEVEL_LOCKDOWN) ? ".L" : " ", + tdata->nvdata.cal_fail_falg, tdata->nvdata.cal_fail_cnt); + else + snprintf(tclm_buff, sizeof(tclm_buff), "TCLM data is empty"); +#else + snprintf(tclm_buff, sizeof(tclm_buff), ""); +#endif + + input_info(true, dev, + "mode:%04X tc:%d noise:%d/%d ext_n:%d wet:%d wc:%d(f:%d) lp:%x fn:%04X/%04X ED:%d PK:%d// v:%02X%02X %s // id:%d,%d tmp:%d // #%d %d\n", + pdata->print_info_currnet_mode, pdata->touch_count, + pdata->touch_noise_status, pdata->touch_pre_noise_status, + pdata->external_noise_mode, pdata->wet_mode, + pdata->wirelesscharger_mode, pdata->force_wirelesscharger_mode, + pdata->lowpower_mode, pdata->touch_functions, pdata->ic_status, pdata->ed_enable, + pdata->pocket_mode, pdata->img_version_of_ic[2], pdata->img_version_of_ic[3], + tclm_buff, pdata->tspid_val, pdata->tspicid_val, + pdata->tsp_temperature_data, + pdata->print_info_cnt_open, pdata->print_info_cnt_release); +} +EXPORT_SYMBOL(sec_input_print_info); + +void sec_input_proximity_report(struct device *dev, int data) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + + if (!pdata->support_ear_detect || !pdata->input_dev_proximity) + return; + + if (!(pdata->ed_enable || pdata->pocket_mode)) + return; + + input_info(true, dev, "%s: PROX(%d)\n", __func__, data); + input_report_abs(pdata->input_dev_proximity, ABS_MT_CUSTOM, data); + input_sync(pdata->input_dev_proximity); +} +EXPORT_SYMBOL(sec_input_proximity_report); + +void sec_input_gesture_report(struct device *dev, int id, int x, int y) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + char buff[SEC_TS_GESTURE_REPORT_BUFF_SIZE] = { 0 }; + + pdata->gesture_id = id; + pdata->gesture_x = x; + pdata->gesture_y = y; + + input_report_key(pdata->input_dev, KEY_BLACK_UI_GESTURE, 1); + input_sync(pdata->input_dev); + input_report_key(pdata->input_dev, KEY_BLACK_UI_GESTURE, 0); + input_sync(pdata->input_dev); + + if (id == SPONGE_EVENT_TYPE_SPAY) { + snprintf(buff, sizeof(buff), "SPAY"); + pdata->hw_param.all_spay_count++; + } else if (id == SPONGE_EVENT_TYPE_SINGLE_TAP) { + snprintf(buff, sizeof(buff), "SINGLE TAP"); + } else if (id == SPONGE_EVENT_TYPE_AOD_DOUBLETAB) { + snprintf(buff, sizeof(buff), "AOD"); + pdata->hw_param.all_aod_tap_count++; + } else if (id == SPONGE_EVENT_TYPE_FOD_PRESS) { + snprintf(buff, sizeof(buff), "FOD PRESS"); + } else if (id == SPONGE_EVENT_TYPE_FOD_RELEASE) { + snprintf(buff, sizeof(buff), "FOD RELEASE"); + } else if (id == SPONGE_EVENT_TYPE_FOD_OUT) { + snprintf(buff, sizeof(buff), "FOD OUT"); + } else if (id == SPONGE_EVENT_TYPE_TSP_SCAN_UNBLOCK) { + snprintf(buff, sizeof(buff), "SCAN UNBLOCK"); + } else if (id == SPONGE_EVENT_TYPE_TSP_SCAN_BLOCK) { + snprintf(buff, sizeof(buff), "SCAN BLOCK"); + } else { + snprintf(buff, sizeof(buff), ""); + } + +#if IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) + input_info(true, dev, "%s: %s: %d\n", __func__, buff, pdata->gesture_id); +#else + input_info(true, dev, "%s: %s: %d, %d, %d\n", + __func__, buff, pdata->gesture_id, pdata->gesture_x, pdata->gesture_y); +#endif +} +EXPORT_SYMBOL(sec_input_gesture_report); + +static void sec_input_coord_report(struct device *dev, u8 t_id) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + int action = pdata->coord[t_id].action; + + if (action == SEC_TS_COORDINATE_ACTION_RELEASE) { + input_mt_slot(pdata->input_dev, t_id); + if (pdata->support_mt_pressure) + input_report_abs(pdata->input_dev, ABS_MT_PRESSURE, 0); + input_mt_report_slot_state(pdata->input_dev, MT_TOOL_FINGER, 0); + + pdata->palm_flag &= ~(1 << t_id); + + if (pdata->touch_count > 0) + pdata->touch_count--; + if (pdata->touch_count == 0) { + input_report_key(pdata->input_dev, BTN_TOUCH, 0); + input_report_key(pdata->input_dev, BTN_TOOL_FINGER, 0); + pdata->hw_param.check_multi = 0; + pdata->print_info_cnt_release = 0; + pdata->palm_flag = 0; + } + input_report_key(pdata->input_dev, BTN_PALM, pdata->palm_flag); + } else if (action == SEC_TS_COORDINATE_ACTION_PRESS || action == SEC_TS_COORDINATE_ACTION_MOVE) { + if (action == SEC_TS_COORDINATE_ACTION_PRESS) { + pdata->touch_count++; + pdata->coord[t_id].p_x = pdata->coord[t_id].x; + pdata->coord[t_id].p_y = pdata->coord[t_id].y; + + pdata->hw_param.all_finger_count++; + if ((pdata->touch_count > 4) && (pdata->hw_param.check_multi == 0)) { + pdata->hw_param.check_multi = 1; + pdata->hw_param.multi_count++; + } + } else { + /* action == SEC_TS_COORDINATE_ACTION_MOVE */ + pdata->coord[t_id].mcount++; + } + + input_mt_slot(pdata->input_dev, t_id); + input_mt_report_slot_state(pdata->input_dev, MT_TOOL_FINGER, 1); + input_report_key(pdata->input_dev, BTN_TOUCH, 1); + input_report_key(pdata->input_dev, BTN_TOOL_FINGER, 1); + input_report_key(pdata->input_dev, BTN_PALM, pdata->palm_flag); + + input_report_abs(pdata->input_dev, ABS_MT_POSITION_X, pdata->coord[t_id].x); + input_report_abs(pdata->input_dev, ABS_MT_POSITION_Y, pdata->coord[t_id].y); + input_report_abs(pdata->input_dev, ABS_MT_TOUCH_MAJOR, pdata->coord[t_id].major); + input_report_abs(pdata->input_dev, ABS_MT_TOUCH_MINOR, pdata->coord[t_id].minor); + + if (pdata->support_mt_pressure) + input_report_abs(pdata->input_dev, ABS_MT_PRESSURE, pdata->coord[t_id].z); + } +} + +static void sec_input_coord_log(struct device *dev, u8 t_id, int action) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + + location_detect(pdata, t_id); + + if (action == SEC_TS_COORDINATE_ACTION_PRESS) { +#if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) + input_info(true, dev, + "[P] tID:%d.%d x:%d y:%d z:%d major:%d minor:%d loc:%s tc:%d type:%X noise:(%x,%d%d), nlvl:%d, maxS:%d, hid:%d\n", + t_id, (pdata->input_dev->mt->trkid - 1) & TRKID_MAX, + pdata->coord[t_id].x, pdata->coord[t_id].y, pdata->coord[t_id].z, + pdata->coord[t_id].major, pdata->coord[t_id].minor, + pdata->location, pdata->touch_count, + pdata->coord[t_id].ttype, + pdata->coord[t_id].noise_status, pdata->touch_noise_status, + pdata->touch_pre_noise_status, pdata->coord[t_id].noise_level, + pdata->coord[t_id].max_strength, pdata->coord[t_id].hover_id_num); +#else + input_info(true, dev, + "[P] tID:%d.%d z:%d major:%d minor:%d loc:%s tc:%d type:%X noise:(%x,%d%d), nlvl:%d, maxS:%d, hid:%d\n", + t_id, (pdata->input_dev->mt->trkid - 1) & TRKID_MAX, + pdata->coord[t_id].z, pdata->coord[t_id].major, + pdata->coord[t_id].minor, pdata->location, pdata->touch_count, + pdata->coord[t_id].ttype, + pdata->coord[t_id].noise_status, pdata->touch_noise_status, + pdata->touch_pre_noise_status, pdata->coord[t_id].noise_level, + pdata->coord[t_id].max_strength, pdata->coord[t_id].hover_id_num); +#endif + + } else if (action == SEC_TS_COORDINATE_ACTION_MOVE) { +#if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) + input_info(true, dev, + "[M] tID:%d.%d x:%d y:%d z:%d major:%d minor:%d loc:%s tc:%d type:%X noise:(%x,%d%d), nlvl:%d, maxS:%d, hid:%d\n", + t_id, pdata->input_dev->mt->trkid & TRKID_MAX, + pdata->coord[t_id].x, pdata->coord[t_id].y, pdata->coord[t_id].z, + pdata->coord[t_id].major, pdata->coord[t_id].minor, + pdata->location, pdata->touch_count, + pdata->coord[t_id].ttype, pdata->coord[t_id].noise_status, + pdata->touch_noise_status, pdata->touch_pre_noise_status, + pdata->coord[t_id].noise_level, pdata->coord[t_id].max_strength, + pdata->coord[t_id].hover_id_num); +#else + input_info(true, dev, + "[M] tID:%d.%d z:%d major:%d minor:%d loc:%s tc:%d type:%X noise:(%x,%d%d), nlvl:%d, maxS:%d, hid:%d\n", + t_id, pdata->input_dev->mt->trkid & TRKID_MAX, pdata->coord[t_id].z, + pdata->coord[t_id].major, pdata->coord[t_id].minor, + pdata->location, pdata->touch_count, + pdata->coord[t_id].ttype, pdata->coord[t_id].noise_status, + pdata->touch_noise_status, pdata->touch_pre_noise_status, + pdata->coord[t_id].noise_level, pdata->coord[t_id].max_strength, + pdata->coord[t_id].hover_id_num); +#endif + } else if (action == SEC_TS_COORDINATE_ACTION_RELEASE || action == SEC_TS_COORDINATE_ACTION_FORCE_RELEASE) { +#if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) + input_info(true, dev, + "[R%s] tID:%d loc:%s dd:%d,%d mc:%d tc:%d lx:%d ly:%d p:%d noise:(%x,%d%d) nlvl:%d, maxS:%d, hid:%d\n", + action == SEC_TS_COORDINATE_ACTION_FORCE_RELEASE ? "A" : "", + t_id, pdata->location, + pdata->coord[t_id].x - pdata->coord[t_id].p_x, + pdata->coord[t_id].y - pdata->coord[t_id].p_y, + pdata->coord[t_id].mcount, pdata->touch_count, + pdata->coord[t_id].x, pdata->coord[t_id].y, + pdata->coord[t_id].palm_count, + pdata->coord[t_id].noise_status, pdata->touch_noise_status, + pdata->touch_pre_noise_status, pdata->coord[t_id].noise_level, + pdata->coord[t_id].max_strength, pdata->coord[t_id].hover_id_num); +#else + input_info(true, dev, + "[R%s] tID:%d loc:%s dd:%d,%d mc:%d tc:%d p:%d noise:(%x,%d%d) nlvl:%d, maxS:%d, hid:%d\n", + action == SEC_TS_COORDINATE_ACTION_FORCE_RELEASE ? "A" : "", + t_id, pdata->location, + pdata->coord[t_id].x - pdata->coord[t_id].p_x, + pdata->coord[t_id].y - pdata->coord[t_id].p_y, + pdata->coord[t_id].mcount, pdata->touch_count, + pdata->coord[t_id].palm_count, + pdata->coord[t_id].noise_status, pdata->touch_noise_status, + pdata->touch_pre_noise_status, pdata->coord[t_id].noise_level, + pdata->coord[t_id].max_strength, pdata->coord[t_id].hover_id_num); +#endif + } +} + +void sec_input_coord_event(struct device *dev, int t_id) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + + if (pdata->coord[t_id].action == SEC_TS_COORDINATE_ACTION_RELEASE) { + if (pdata->prev_coord[t_id].action == SEC_TS_COORDINATE_ACTION_NONE + || pdata->prev_coord[t_id].action == SEC_TS_COORDINATE_ACTION_RELEASE) { + input_err(true, dev, + "%s: tID %d released without press\n", __func__, t_id); + return; + } + + sec_input_coord_report(dev, t_id); + if ((pdata->touch_count == 0) && !IS_ERR_OR_NULL(&pdata->interrupt_notify_work.work)) { + schedule_work(&pdata->interrupt_notify_work.work); + } + sec_input_coord_log(dev, t_id, SEC_TS_COORDINATE_ACTION_RELEASE); + + pdata->coord[t_id].action = SEC_TS_COORDINATE_ACTION_NONE; + pdata->coord[t_id].mcount = 0; + pdata->coord[t_id].palm_count = 0; + pdata->coord[t_id].noise_level = 0; + pdata->coord[t_id].max_strength = 0; + pdata->coord[t_id].hover_id_num = 0; + } else if (pdata->coord[t_id].action == SEC_TS_COORDINATE_ACTION_PRESS) { + sec_input_coord_report(dev, t_id); + if ((pdata->touch_count == 1) && !IS_ERR_OR_NULL(&pdata->interrupt_notify_work.work)) { + schedule_work(&pdata->interrupt_notify_work.work); + } + sec_input_coord_log(dev, t_id, SEC_TS_COORDINATE_ACTION_PRESS); + } else if (pdata->coord[t_id].action == SEC_TS_COORDINATE_ACTION_MOVE) { + if (pdata->prev_coord[t_id].action == SEC_TS_COORDINATE_ACTION_NONE + || pdata->prev_coord[t_id].action == SEC_TS_COORDINATE_ACTION_RELEASE) { + pdata->coord[t_id].action = SEC_TS_COORDINATE_ACTION_PRESS; + sec_input_coord_report(dev, t_id); + sec_input_coord_log(dev, t_id, SEC_TS_COORDINATE_ACTION_MOVE); + } else { + sec_input_coord_report(dev, t_id); + } + } else { + input_dbg(true, dev, + "%s: do not support coordinate action(%d)\n", + __func__, pdata->coord[t_id].action); + } + + if ((pdata->coord[t_id].action == SEC_TS_COORDINATE_ACTION_PRESS) + || (pdata->coord[t_id].action == SEC_TS_COORDINATE_ACTION_MOVE)) { + if (pdata->coord[t_id].ttype != pdata->prev_coord[t_id].ttype) { + input_info(true, dev, "%s : tID:%d ttype(%x->%x)\n", + __func__, pdata->coord[t_id].id, + pdata->prev_coord[t_id].ttype, pdata->coord[t_id].ttype); + } + } + + input_sync(pdata->input_dev); +} +EXPORT_SYMBOL(sec_input_coord_event); + +void sec_input_release_all_finger(struct device *dev) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + int i; + + if (!pdata->input_dev) + return; + + if (pdata->prox_power_off) { + input_report_key(pdata->input_dev, KEY_INT_CANCEL, 1); + input_sync(pdata->input_dev); + input_report_key(pdata->input_dev, KEY_INT_CANCEL, 0); + input_sync(pdata->input_dev); + } + + if (pdata->input_dev_proximity) { + input_report_abs(pdata->input_dev_proximity, ABS_MT_CUSTOM, 0xff); + input_sync(pdata->input_dev_proximity); + } + + for (i = 0; i < SEC_TS_SUPPORT_TOUCH_COUNT; i++) { + input_mt_slot(pdata->input_dev, i); + input_mt_report_slot_state(pdata->input_dev, MT_TOOL_FINGER, false); + + if (pdata->coord[i].action == SEC_TS_COORDINATE_ACTION_PRESS + || pdata->coord[i].action == SEC_TS_COORDINATE_ACTION_MOVE) { + sec_input_coord_log(dev, i, SEC_TS_COORDINATE_ACTION_FORCE_RELEASE); + pdata->coord[i].action = SEC_TS_COORDINATE_ACTION_RELEASE; + } + + pdata->coord[i].mcount = 0; + pdata->coord[i].palm_count = 0; + pdata->coord[i].noise_level = 0; + pdata->coord[i].max_strength = 0; + pdata->coord[i].hover_id_num = 0; + } + + input_mt_slot(pdata->input_dev, 0); + + input_report_key(pdata->input_dev, BTN_PALM, false); + input_report_key(pdata->input_dev, BTN_LARGE_PALM, false); + input_report_key(pdata->input_dev, BTN_TOUCH, false); + input_report_key(pdata->input_dev, BTN_TOOL_FINGER, false); + pdata->palm_flag = 0; + pdata->touch_count = 0; + pdata->hw_param.check_multi = 0; + + input_sync(pdata->input_dev); +} +EXPORT_SYMBOL(sec_input_release_all_finger); + +static void sec_input_set_prop(struct device *dev, struct input_dev *input_dev, u8 propbit, void *data) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + static char sec_input_phys[64] = { 0 }; + + snprintf(sec_input_phys, sizeof(sec_input_phys), "%s/input1", input_dev->name); + input_dev->phys = sec_input_phys; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = dev; + + set_bit(EV_SYN, input_dev->evbit); + set_bit(EV_KEY, input_dev->evbit); + set_bit(EV_ABS, input_dev->evbit); + set_bit(EV_SW, input_dev->evbit); + set_bit(BTN_TOUCH, input_dev->keybit); + set_bit(BTN_TOOL_FINGER, input_dev->keybit); + set_bit(BTN_PALM, input_dev->keybit); + set_bit(BTN_LARGE_PALM, input_dev->keybit); + set_bit(KEY_BLACK_UI_GESTURE, input_dev->keybit); + set_bit(KEY_INT_CANCEL, input_dev->keybit); + + set_bit(propbit, input_dev->propbit); + set_bit(KEY_WAKEUP, input_dev->keybit); + set_bit(KEY_WATCH, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, pdata->max_x, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, pdata->max_y, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, 0, 255, 0, 0); + if (pdata->support_mt_pressure) + input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 255, 0, 0); + + if (propbit == INPUT_PROP_POINTER) + input_mt_init_slots(input_dev, SEC_TS_SUPPORT_TOUCH_COUNT, INPUT_MT_POINTER); + else + input_mt_init_slots(input_dev, SEC_TS_SUPPORT_TOUCH_COUNT, INPUT_MT_DIRECT); + + input_set_drvdata(input_dev, data); +} + +static void sec_input_set_prop_proximity(struct device *dev, struct input_dev *input_dev, void *data) +{ + static char sec_input_phys[64] = { 0 }; + + snprintf(sec_input_phys, sizeof(sec_input_phys), "%s/input1", input_dev->name); + input_dev->phys = sec_input_phys; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = dev; + + set_bit(EV_SYN, input_dev->evbit); + set_bit(EV_SW, input_dev->evbit); + + set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + + input_set_abs_params(input_dev, ABS_MT_CUSTOM, 0, 0xFFFFFFFF, 0, 0); + input_set_drvdata(input_dev, data); +} + +int sec_input_device_register(struct device *dev, void *data) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + int ret = 0; + + /* register input_dev */ + pdata->input_dev = devm_input_allocate_device(dev); + if (!pdata->input_dev) { + input_err(true, dev, "%s: allocate input_dev err!\n", __func__); + return -ENOMEM; + } + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) + if (pdata->support_dual_foldable == SUB_TOUCH) + pdata->input_dev->name = "sec_touchscreen2"; + else +#endif + pdata->input_dev->name = "sec_touchscreen"; + + sec_input_set_prop(dev, pdata->input_dev, INPUT_PROP_DIRECT, data); + ret = input_register_device(pdata->input_dev); + if (ret) { + input_err(true, dev, "%s: Unable to register %s input device\n", + __func__, pdata->input_dev->name); + return ret; + } + + if (pdata->support_dex) { + /* register input_dev_pad */ + pdata->input_dev_pad = devm_input_allocate_device(dev); + if (!pdata->input_dev_pad) { + input_err(true, dev, "%s: allocate input_dev_pad err!\n", __func__); + return -ENOMEM; + } + + pdata->input_dev_pad->name = "sec_touchpad"; + sec_input_set_prop(dev, pdata->input_dev_pad, INPUT_PROP_POINTER, data); + ret = input_register_device(pdata->input_dev_pad); + if (ret) { + input_err(true, dev, "%s: Unable to register %s input device\n", + __func__, pdata->input_dev_pad->name); + return ret; + } + } + + if (pdata->support_ear_detect || pdata->support_lightsensor_detect) { + /* register input_dev_proximity */ + pdata->input_dev_proximity = devm_input_allocate_device(dev); + if (!pdata->input_dev_proximity) { + input_err(true, dev, "%s: allocate input_dev_proximity err!\n", __func__); + return -ENOMEM; + } + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) + if (pdata->support_dual_foldable == SUB_TOUCH) + pdata->input_dev_proximity->name = "sec_touchproximity2"; + else +#endif + pdata->input_dev_proximity->name = "sec_touchproximity"; + sec_input_set_prop_proximity(dev, pdata->input_dev_proximity, data); + ret = input_register_device(pdata->input_dev_proximity); + if (ret) { + input_err(true, dev, "%s: Unable to register %s input device\n", + __func__, pdata->input_dev_proximity->name); + return ret; + } + } + + return 0; +} +EXPORT_SYMBOL(sec_input_device_register); + +int sec_input_pinctrl_configure(struct device *dev, bool on) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + struct pinctrl_state *state; + + input_info(true, dev, "%s: %s\n", __func__, on ? "ACTIVE" : "SUSPEND"); + + if (on) { + state = pinctrl_lookup_state(pdata->pinctrl, "on_state"); + if (IS_ERR(pdata->pinctrl)) + input_err(true, dev, "%s: could not get active pinstate\n", __func__); + } else { + state = pinctrl_lookup_state(pdata->pinctrl, "off_state"); + if (IS_ERR(pdata->pinctrl)) + input_err(true, dev, "%s: could not get suspend pinstate\n", __func__); + } + + if (!IS_ERR_OR_NULL(state)) + return pinctrl_select_state(pdata->pinctrl, state); + + return 0; +} +EXPORT_SYMBOL(sec_input_pinctrl_configure); + +int sec_input_power(struct device *dev, bool on) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + int ret = 0; + + if (pdata->power_enabled == on) { + input_info(true, dev, "%s: power_enabled %d\n", __func__, pdata->power_enabled); + return ret; + } + + if (on) { + if (!pdata->not_support_io_ldo) { + ret = regulator_enable(pdata->dvdd); + if (ret) { + input_err(true, dev, "%s: Failed to enable dvdd: %d\n", __func__, ret); + goto out; + } + + sec_delay(1); + } + ret = regulator_enable(pdata->avdd); + if (ret) { + input_err(true, dev, "%s: Failed to enable avdd: %d\n", __func__, ret); + goto out; + } + } else { + regulator_disable(pdata->avdd); + if (!pdata->not_support_io_ldo) { + sec_delay(4); + regulator_disable(pdata->dvdd); + } + } + + pdata->power_enabled = on; + +out: + if (!pdata->not_support_io_ldo) { + input_info(true, dev, "%s: %s: avdd:%s, dvdd:%s\n", __func__, on ? "on" : "off", + regulator_is_enabled(pdata->avdd) ? "on" : "off", + regulator_is_enabled(pdata->dvdd) ? "on" : "off"); + } else { + input_info(true, dev, "%s: %s: avdd:%s\n", __func__, on ? "on" : "off", + regulator_is_enabled(pdata->avdd) ? "on" : "off"); + } + + return ret; +} +EXPORT_SYMBOL(sec_input_power); + +int sec_input_parse_dt(struct device *dev) +{ + struct sec_ts_plat_data *pdata = dev->platform_data; + struct device_node *np = dev->of_node; + u32 coords[2]; + int ret = 0; + int count = 0, i; + u32 ic_match_value; + u32 px_zone[3] = { 0 }; + int lcd_type = 0, lcd_type_unload = 0; + + if (of_property_read_u32(np, "sec,support_dual_foldable", &pdata->support_dual_foldable) < 0) + pdata->support_dual_foldable = 0; + + lcd_type = sec_input_get_lcd_id(dev); +#if !defined(DUAL_FOLDABLE_GKI) + if (lcd_type < 0) { + input_err(true, dev, "%s: lcd is not attached\n", __func__); + return -ENODEV; + } +#endif + input_info(true, dev, "%s: lcdtype 0x%08X\n", __func__, lcd_type); + + if (!of_property_read_u32(np, "sec,lcd_type_unload", &lcd_type_unload)) { + if ((lcd_type != 0) && (lcd_type == lcd_type_unload)) { + input_err(true, dev, "%s: do not load lcdtype 0x%08X\n", __func__, lcd_type); + return -ENODEV; + } + } + + pdata->tsp_icid = of_get_named_gpio(np, "sec,tsp-icid_gpio", 0); + if (gpio_is_valid(pdata->tsp_icid)) { + input_info(true, dev, "%s: TSP_ICID : %d\n", __func__, gpio_get_value(pdata->tsp_icid)); + if (of_property_read_u32(np, "sec,icid_match_value", &ic_match_value)) { + input_err(true, dev, "%s: not use icid match value\n", __func__); + return -EINVAL; + } + + pdata->tspicid_val = gpio_get_value(pdata->tsp_icid); + if (pdata->tspicid_val != ic_match_value) { + input_err(true, dev, "%s: Do not match TSP_ICID\n", __func__); + return -EINVAL; + } + } else { + input_err(true, dev, "%s: not use tsp-icid gpio\n", __func__); + } + + pdata->irq_gpio = of_get_named_gpio(np, "sec,irq_gpio", 0); + if (gpio_is_valid(pdata->irq_gpio)) { + ret = devm_gpio_request_one(dev, pdata->irq_gpio, GPIOF_DIR_IN, "sec,tsp_int"); + if (ret) { + input_err(true, dev, "%s: Unable to request tsp_int [%d]\n", __func__, pdata->irq_gpio); + return -EINVAL; + } + } else { + input_err(true, dev, "%s: Failed to get irq gpio\n", __func__); + return -EINVAL; + } + + if (of_property_read_u32(np, "sec,irq_flag", &pdata->irq_flag)) + pdata->irq_flag = IRQF_TRIGGER_LOW | IRQF_ONESHOT; + + input_dbg(true, dev, "%s: irq_flag property 0x%X\n", __func__, pdata->irq_flag); + + pdata->gpio_spi_cs = of_get_named_gpio(np, "sec,gpio_spi_cs", 0); + if (gpio_is_valid(pdata->gpio_spi_cs)) { + ret = gpio_request(pdata->gpio_spi_cs, "tsp,gpio_spi_cs"); + input_info(true, dev, "%s: gpio_spi_cs: %d, ret: %d\n", __func__, pdata->gpio_spi_cs, ret); + ret = 0; + } + + if (of_property_read_u32(np, "sec,i2c-burstmax", &pdata->i2c_burstmax)) { + input_dbg(false, dev, "%s: Failed to get i2c_burstmax property\n", __func__); + pdata->i2c_burstmax = 0xffff; + } + + if (of_property_read_u32_array(np, "sec,max_coords", coords, 2)) { + input_err(true, dev, "%s: Failed to get max_coords property\n", __func__); + return -EINVAL; + } + pdata->max_x = coords[0] - 1; + pdata->max_y = coords[1] - 1; + + if (of_property_read_u32(np, "sec,bringup", &pdata->bringup) < 0) + pdata->bringup = 0; + + pdata->tsp_id = of_get_named_gpio(np, "sec,tsp-id_gpio", 0); + if (gpio_is_valid(pdata->tsp_id)) { + pdata->tspid_val = gpio_get_value(pdata->tsp_id); + input_info(true, dev, "%s: TSP_ID : %d\n", __func__, pdata->tspid_val); + } else { + input_err(true, dev, "%s: not use tsp-id gpio\n", __func__); + } + + count = of_property_count_strings(np, "sec,firmware_name"); + if (count <= 0) { + pdata->firmware_name = NULL; + } else { + if (gpio_is_valid(pdata->tsp_id) && pdata->tspid_val) { + of_property_read_string_index(np, "sec,firmware_name", + pdata->tspid_val, &pdata->firmware_name); + if (pdata->bringup == 4) + pdata->bringup = 2; + } else { + u8 lcd_id_num = of_property_count_u32_elems(np, "sec,select_lcdid"); + + if ((lcd_id_num != count) || (lcd_id_num <= 0)) { + of_property_read_string_index(np, "sec,firmware_name", 0, &pdata->firmware_name); + } else { + u32 *lcd_id_t; + u32 lcd_id_mask; + + lcd_id_t = kcalloc(lcd_id_num, sizeof(u32), GFP_KERNEL); + if (!lcd_id_t) + return -ENOMEM; + + of_property_read_u32_array(np, "sec,select_lcdid", lcd_id_t, lcd_id_num); + if (of_property_read_u32(np, "sec,lcdid_mask", &lcd_id_mask) < 0) + lcd_id_mask = 0xFFFFFF; + else + input_info(true, dev, "%s: lcd_id_mask: 0x%06X\n", __func__, lcd_id_mask); + + for (i = 0; i < lcd_id_num; i++) { + if ((lcd_id_t[i] & lcd_id_mask) == (lcd_type & lcd_id_mask)) { + of_property_read_string_index(np, "sec,firmware_name", i, &pdata->firmware_name); + break; + } + + if (i == (lcd_id_num - 1)) + of_property_read_string_index(np, "sec,firmware_name", i, &pdata->firmware_name); + } + if (!pdata->firmware_name) + pdata->bringup = 1; + else if (strlen(pdata->firmware_name) == 0) + pdata->bringup = 1; + + input_info(true, dev, "%s: count: %d, index:%d, lcd_id: 0x%X, firmware: %s\n", + __func__, count, i, lcd_id_t[i], pdata->firmware_name); + kfree(lcd_id_t); + } + + if (pdata->bringup == 4) + pdata->bringup = 3; + } + } + + pdata->not_support_vdd = of_property_read_bool(np, "not_support_vdd"); + if (!pdata->not_support_vdd) { + pdata->not_support_io_ldo = of_property_read_bool(np, "not_support_io_ldo"); + if (!pdata->not_support_io_ldo) { + pdata->dvdd = regulator_get(dev, "tsp_io_ldo"); + if (IS_ERR_OR_NULL(pdata->dvdd)) { + input_err(true, dev, "%s: Failed to get %s regulator.\n", + __func__, "tsp_io_ldo"); + ret = PTR_ERR(pdata->dvdd); +#if !IS_ENABLED(CONFIG_QGKI) + if (gpio_is_valid(pdata->gpio_spi_cs)) + gpio_free(pdata->gpio_spi_cs); +#endif + return -EINVAL; + } + } + + pdata->avdd = regulator_get(dev, "tsp_avdd_ldo"); + if (IS_ERR_OR_NULL(pdata->avdd)) { + input_err(true, dev, "%s: Failed to get %s regulator.\n", + __func__, "tsp_avdd_ldo"); + ret = PTR_ERR(pdata->avdd); +#if !IS_ENABLED(CONFIG_QGKI) + if (gpio_is_valid(pdata->gpio_spi_cs)) + gpio_free(pdata->gpio_spi_cs); +#endif + return -EINVAL; + } + } + + pdata->regulator_boot_on = of_property_read_bool(np, "sec,regulator_boot_on"); + pdata->support_dex = of_property_read_bool(np, "support_dex_mode"); + pdata->support_fod = of_property_read_bool(np, "support_fod"); + pdata->support_fod_lp_mode = of_property_read_bool(np, "support_fod_lp_mode"); + pdata->enable_settings_aot = of_property_read_bool(np, "enable_settings_aot"); + pdata->sync_reportrate_120 = of_property_read_bool(np, "sync-reportrate-120"); + pdata->support_refresh_rate_mode = of_property_read_bool(np, "support_refresh_rate_mode"); + pdata->support_vrr = of_property_read_bool(np, "support_vrr"); + pdata->support_ear_detect = of_property_read_bool(np, "support_ear_detect_mode"); + pdata->support_open_short_test = of_property_read_bool(np, "support_open_short_test"); + pdata->support_mis_calibration_test = of_property_read_bool(np, "support_mis_calibration_test"); + pdata->support_wireless_tx = of_property_read_bool(np, "support_wireless_tx"); + pdata->support_input_monitor = of_property_read_bool(np, "support_input_monitor"); + pdata->chip_on_board = of_property_read_bool(np, "chip_on_board"); + pdata->disable_vsync_scan = of_property_read_bool(np, "disable_vsync_scan"); + pdata->unuse_dvdd_power = of_property_read_bool(np, "sec,unuse_dvdd_power"); + pdata->sense_off_when_cover_closed = of_property_read_bool(np, "sense_off_when_cover_closed"); + of_property_read_u32(np, "support_rawdata_map_num", &pdata->support_rawdata_map_num); + + if (of_property_read_u32(np, "sec,support_sensor_hall", &pdata->support_sensor_hall) < 0) + pdata->support_sensor_hall = 0; + if (of_property_read_u32(np, "sec,dump_ic_ver", &pdata->dump_ic_ver) < 0) + pdata->dump_ic_ver = 0; + pdata->support_flex_mode = of_property_read_bool(np, "support_flex_mode"); + pdata->support_lightsensor_detect = of_property_read_bool(np, "support_lightsensor_detect"); + + pdata->enable_sysinput_enabled = of_property_read_bool(np, "sec,enable_sysinput_enabled"); + input_info(true, dev, "%s: Sysinput enabled %s\n", + __func__, pdata->enable_sysinput_enabled ? "ON" : "OFF"); + + if (of_property_read_u32_array(np, "sec,area-size", px_zone, 3)) { + input_info(true, dev, "Failed to get zone's size\n"); + pdata->area_indicator = 48; + pdata->area_navigation = 96; + pdata->area_edge = 60; + } else { + pdata->area_indicator = px_zone[0]; + pdata->area_navigation = px_zone[1]; + pdata->area_edge = px_zone[2]; + } + input_info(true, dev, "%s : zone's size - indicator:%d, navigation:%d, edge:%d\n", + __func__, pdata->area_indicator, pdata->area_navigation ,pdata->area_edge); + +#if IS_ENABLED(CONFIG_INPUT_SEC_SECURE_TOUCH) + of_property_read_u32(np, "sec,ss_touch_num", &pdata->ss_touch_num); + input_err(true, dev, "%s: ss_touch_num:%d\n", __func__, pdata->ss_touch_num); +#endif +#if IS_ENABLED(CONFIG_SEC_FACTORY) + pdata->support_mt_pressure = true; +#endif + input_err(true, dev, "%s: i2c buffer limit: %d, lcd_id:%06X, bringup:%d," + " id:%d,%d, dex:%d, max(%d/%d), FOD:%d, AOT:%d, ED:%d, FLM:%d," + " COB:%d, disable_vsync_scan:%d, unuse_dvdd_power:%d\n", + __func__, pdata->i2c_burstmax, lcd_type, pdata->bringup, + pdata->tsp_id, pdata->tsp_icid, + pdata->support_dex, pdata->max_x, pdata->max_y, + pdata->support_fod, pdata->enable_settings_aot, + pdata->support_ear_detect, pdata->support_fod_lp_mode, + pdata->chip_on_board, pdata->disable_vsync_scan, pdata->unuse_dvdd_power); + return ret; +} +EXPORT_SYMBOL(sec_input_parse_dt); + +void sec_tclm_parse_dt(struct device *dev, struct sec_tclm_data *tdata) +{ + struct device_node *np = dev->of_node; + + if (of_property_read_u32(np, "sec,tclm_level", &tdata->tclm_level) < 0) { + tdata->tclm_level = 0; + input_err(true, dev, "%s: Failed to get tclm_level property\n", __func__); + } + + if (of_property_read_u32(np, "sec,afe_base", &tdata->afe_base) < 0) { + tdata->afe_base = 0; + input_err(true, dev, "%s: Failed to get afe_base property\n", __func__); + } + + tdata->support_tclm_test = of_property_read_bool(np, "support_tclm_test"); + + input_err(true, dev, "%s: tclm_level %d, sec_afe_base %04X\n", __func__, tdata->tclm_level, tdata->afe_base); +} +EXPORT_SYMBOL(sec_tclm_parse_dt); + +void sec_tclm_parse_dt_dev(struct device *dev, struct sec_tclm_data *tdata) +{ + struct device_node *np = dev->of_node; + + if (of_property_read_u32(np, "sec,tclm_level", &tdata->tclm_level) < 0) { + tdata->tclm_level = 0; + input_err(true, dev, "%s: Failed to get tclm_level property\n", __func__); + } + + if (of_property_read_u32(np, "sec,afe_base", &tdata->afe_base) < 0) { + tdata->afe_base = 0; + input_err(true, dev, "%s: Failed to get afe_base property\n", __func__); + } + + tdata->support_tclm_test = of_property_read_bool(np, "support_tclm_test"); + + input_err(true, dev, "%s: tclm_level %d, sec_afe_base %04X\n", __func__, tdata->tclm_level, tdata->afe_base); +} +EXPORT_SYMBOL(sec_tclm_parse_dt_dev); + +void stui_tsp_init(int (*stui_tsp_enter)(void), int (*stui_tsp_exit)(void), int (*stui_tsp_type)(void)) +{ + pr_info("%s %s: called\n", SECLOG, __func__); + + psecuretsp = kzalloc(sizeof(struct sec_ts_secure_data), GFP_KERNEL); + + psecuretsp->stui_tsp_enter = stui_tsp_enter; + psecuretsp->stui_tsp_exit = stui_tsp_exit; + psecuretsp->stui_tsp_type = stui_tsp_type; +} +EXPORT_SYMBOL(stui_tsp_init); + + +int stui_tsp_enter(void) +{ + struct sec_ts_plat_data *pdata = NULL; + + if (psecuretsp != NULL) { + pr_info("%s %s: psecuretsp->stui_tsp_enter called!\n", SECLOG, __func__); + return psecuretsp->stui_tsp_enter(); + } + + if (ptsp == NULL) { + pr_info("%s: ptsp is null\n", __func__); + return -EINVAL; + } + + pdata = ptsp->platform_data; + if (pdata == NULL) { + pr_info("%s: pdata is null\n", __func__); + return -EINVAL; + } + + pr_info("%s %s: pdata->stui_tsp_enter called!\n", SECLOG, __func__); + return pdata->stui_tsp_enter(); +} +EXPORT_SYMBOL(stui_tsp_enter); + +int stui_tsp_exit(void) +{ + struct sec_ts_plat_data *pdata = NULL; + + if (psecuretsp != NULL) { + pr_info("%s %s: psecuretsp->stui_tsp_exit called!\n", SECLOG, __func__); + return psecuretsp->stui_tsp_exit(); + } + + if (ptsp == NULL) + return -EINVAL; + + pdata = ptsp->platform_data; + if (pdata == NULL) + return -EINVAL; + + pr_info("%s %s: pdata->stui_tsp_exit called!\n", SECLOG, __func__); + return pdata->stui_tsp_exit(); +} +EXPORT_SYMBOL(stui_tsp_exit); + +int stui_tsp_type(void) +{ + struct sec_ts_plat_data *pdata = NULL; + + if (psecuretsp != NULL) { + pr_info("%s %s: psecuretsp->stui_tsp_type called!\n", SECLOG, __func__); + return psecuretsp->stui_tsp_type(); + } + + if (ptsp == NULL) + return -EINVAL; + + pdata = ptsp->platform_data; + if (pdata == NULL) + return -EINVAL; + + pr_info("%s %s: pdata->stui_tsp_type called!\n", SECLOG, __func__); + return pdata->stui_tsp_type(); +} +EXPORT_SYMBOL(stui_tsp_type); + +int sec_input_enable_device(struct input_dev *dev) +{ + int retval; + + retval = mutex_lock_interruptible(&dev->mutex); + if (retval) + return retval; + + if (dev->users && dev->open) + retval = dev->open(dev); + + mutex_unlock(&dev->mutex); + + return retval; +} +EXPORT_SYMBOL(sec_input_enable_device); + +int sec_input_disable_device(struct input_dev *dev) +{ + int retval; + + retval = mutex_lock_interruptible(&dev->mutex); + if (retval) + return retval; + + if (dev->users && dev->close) + dev->close(dev); + + mutex_unlock(&dev->mutex); + return 0; +} +EXPORT_SYMBOL(sec_input_disable_device); + +__visible_for_testing ssize_t sec_input_enabled_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct input_dev *input_dev = to_input_dev(dev); + struct sec_ts_plat_data *pdata = input_dev->dev.parent->platform_data; + + return scnprintf(buf, PAGE_SIZE, "%d\n", pdata->enabled); +} + +__visible_for_testing ssize_t sec_input_enabled_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + bool enable; + struct input_dev *input_dev = to_input_dev(dev); + struct sec_ts_plat_data *pdata = input_dev->dev.parent->platform_data; + + ret = strtobool(buf, &enable); + if (ret) + return ret; + + if (pdata->enabled == enable) { + pr_info("%s %s: device already %s\n", SECLOG, __func__, + enable ? "enabled" : "disabled"); + goto out; + } + + if (enable) + ret = sec_input_enable_device(input_dev); + else + ret = sec_input_disable_device(input_dev); + + if (ret) + return ret; + +out: + return size; +} + +static DEVICE_ATTR(enabled, 0664, sec_input_enabled_show, sec_input_enabled_store); + +static struct attribute *sec_input_attrs[] = { + &dev_attr_enabled.attr, + NULL +}; + +static const struct attribute_group sec_input_attr_group = { + .attrs = sec_input_attrs, +}; + +int sec_input_sysfs_create(struct kobject *kobj) +{ + struct kernfs_node *enabled_sd = NULL; + int retval = 0; + + enabled_sd = sysfs_get_dirent(kobj->sd, "enabled"); + if (IS_ERR_OR_NULL(enabled_sd)) { + pr_info("%s %s: make 'enabled' node\n", SECLOG, __func__); + retval = sysfs_create_group(kobj, &sec_input_attr_group); + if (retval < 0) { + pr_err("%s %s: Failed to create sysfs attributes %d\n", SECLOG, __func__, retval); + } + } else { + pr_info("%s %s: 'enabled' is already exist\n", SECLOG, __func__); + } + + return retval; +} +EXPORT_SYMBOL(sec_input_sysfs_create); + +void sec_input_sysfs_remove(struct kobject *kobj) +{ + sysfs_remove_group(kobj, &sec_input_attr_group); +} +EXPORT_SYMBOL(sec_input_sysfs_remove); + +MODULE_DESCRIPTION("Samsung common functions"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/sec_input/sec_input.h b/drivers/input/sec_input/sec_input.h new file mode 100755 index 000000000000..ef62314f4277 --- /dev/null +++ b/drivers/input/sec_input/sec_input.h @@ -0,0 +1,783 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* drivers/input/sec_input/sec_input.h + * + * Core file for Samsung input device driver + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#if IS_ENABLED(CONFIG_SEC_KUNIT) +#include +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sec_cmd.h" +#include "sec_tclm_v2.h" + +#if !IS_ENABLED(CONFIG_QGKI) && IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 43)) /* default gki */ +#define DUAL_FOLDABLE_GKI +#endif +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0)) +#define sec_input_proc_ops(ops_owner, ops_name, read_fn, write_fn) \ +const struct proc_ops ops_name = { \ + .proc_read = read_fn, \ + .proc_write = write_fn, \ + .proc_lseek = generic_file_llseek, \ +} +#else +#define sec_input_proc_ops(ops_owner, ops_name, read_fn, write_fn) \ +const struct file_operations ops_name = { \ + .owner = ops_owner, \ + .read = read_fn, \ + .write = write_fn, \ + .llseek = generic_file_llseek, \ +} +#endif +/* + * sys/class/sec/tsp/support_feature + * bit value should be made a promise with InputFramework. + */ +#define INPUT_FEATURE_ENABLE_SETTINGS_AOT (1 << 0) /* Double tap wakeup settings */ +#define INPUT_FEATURE_ENABLE_PRESSURE (1 << 1) /* homekey pressure */ +#define INPUT_FEATURE_ENABLE_SYNC_RR120 (1 << 2) /* sync reportrate 120hz */ +#define INPUT_FEATURE_ENABLE_VRR (1 << 3) /* variable refresh rate (support 240hz) */ +#define INPUT_FEATURE_SUPPORT_WIRELESS_TX (1 << 4) /* enable call wireless cmd during wireless power sharing */ +#define INPUT_FEATURE_ENABLE_SYSINPUT_ENABLED (1 << 5) /* resume/suspend called by system input service */ +#define INPUT_FEATURE_ENABLE_PROX_LP_SCAN_ENABLED (1 << 6) /* prox_lp_scan_mode called by system input service */ + +#define INPUT_FEATURE_SUPPORT_OPEN_SHORT_TEST (1 << 8) /* open/short test support */ +#define INPUT_FEATURE_SUPPORT_MIS_CALIBRATION_TEST (1 << 9) /* mis-calibration test support */ +#define INPUT_FEATURE_ENABLE_MULTI_CALIBRATION (1 << 10) /* multi calibration support */ + +#define INPUT_FEATURE_SUPPORT_INPUT_MONITOR (1 << 16) /* input monitor support */ + +/* + * sec Log + */ +#define SECLOG "[sec_input]" +#define INPUT_LOG_BUF_SIZE 512 +#define INPUT_TCLM_LOG_BUF_SIZE 64 + +#if IS_ENABLED(CONFIG_SEC_DEBUG_TSP_LOG) +//#include /* exynos */ +#include "sec_tsp_log.h" + +#define input_dbg(mode, dev, fmt, ...) \ +({ \ + static char input_log_buf[INPUT_LOG_BUF_SIZE]; \ + dev_dbg(dev, SECLOG " " fmt, ## __VA_ARGS__); \ + if (mode) { \ + if (dev) \ + snprintf(input_log_buf, sizeof(input_log_buf), "%s %s", \ + dev_driver_string(dev), dev_name(dev)); \ + else \ + snprintf(input_log_buf, sizeof(input_log_buf), "NULL"); \ + sec_debug_tsp_log_msg(input_log_buf, fmt, ## __VA_ARGS__); \ + } \ +}) +#define input_info(mode, dev, fmt, ...) \ +({ \ + static char input_log_buf[INPUT_LOG_BUF_SIZE]; \ + dev_info(dev, SECLOG " " fmt, ## __VA_ARGS__); \ + if (mode) { \ + if (dev) \ + snprintf(input_log_buf, sizeof(input_log_buf), "%s %s", \ + dev_driver_string(dev), dev_name(dev)); \ + else \ + snprintf(input_log_buf, sizeof(input_log_buf), "NULL"); \ + sec_debug_tsp_log_msg(input_log_buf, fmt, ## __VA_ARGS__); \ + } \ +}) +#define input_err(mode, dev, fmt, ...) \ +({ \ + static char input_log_buf[INPUT_LOG_BUF_SIZE]; \ + dev_err(dev, SECLOG " " fmt, ## __VA_ARGS__); \ + if (mode) { \ + if (dev) \ + snprintf(input_log_buf, sizeof(input_log_buf), "%s %s", \ + dev_driver_string(dev), dev_name(dev)); \ + else \ + snprintf(input_log_buf, sizeof(input_log_buf), "NULL"); \ + sec_debug_tsp_log_msg(input_log_buf, fmt, ## __VA_ARGS__); \ + } \ +}) + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +#define MAIN_TOUCH 1 +#define SUB_TOUCH 2 + +#define input_raw_info(mode, dev, fmt, ...) \ +({ \ + static char input_log_buf[INPUT_LOG_BUF_SIZE]; \ + dev_info(dev, SECLOG " " fmt, ## __VA_ARGS__); \ + if (mode == SUB_TOUCH) { \ + if (dev) \ + snprintf(input_log_buf, sizeof(input_log_buf), "%s %s", \ + dev_driver_string(dev), dev_name(dev)); \ + else \ + snprintf(input_log_buf, sizeof(input_log_buf), "NULL"); \ + sec_debug_tsp_log_msg(input_log_buf, fmt, ## __VA_ARGS__); \ + sec_debug_tsp_raw_data_msg(mode, input_log_buf, fmt, ## __VA_ARGS__); \ + } else { \ + if (dev) \ + snprintf(input_log_buf, sizeof(input_log_buf), "%s %s", \ + dev_driver_string(dev), dev_name(dev)); \ + else \ + snprintf(input_log_buf, sizeof(input_log_buf), "NULL"); \ + sec_debug_tsp_log_msg(input_log_buf, fmt, ## __VA_ARGS__); \ + sec_debug_tsp_raw_data_msg(mode, input_log_buf, fmt, ## __VA_ARGS__); \ + } \ +}) +#define input_raw_data_clear(mode) sec_tsp_raw_data_clear(mode) +#else +#define input_raw_info(mode, dev, fmt, ...) \ +({ \ + static char input_log_buf[INPUT_LOG_BUF_SIZE]; \ + dev_info(dev, SECLOG " " fmt, ## __VA_ARGS__); \ + if (mode) { \ + if (dev) \ + snprintf(input_log_buf, sizeof(input_log_buf), "%s %s", \ + dev_driver_string(dev), dev_name(dev)); \ + else \ + snprintf(input_log_buf, sizeof(input_log_buf), "NULL"); \ + sec_debug_tsp_log_msg(input_log_buf, fmt, ## __VA_ARGS__); \ + sec_debug_tsp_raw_data_msg(input_log_buf, fmt, ## __VA_ARGS__); \ + } \ +}) +#define input_raw_data_clear() sec_tsp_raw_data_clear() +#endif +#define input_log_fix() sec_tsp_log_fix() +#else +#define input_dbg(mode, dev, fmt, ...) \ +({ \ + dev_dbg(dev, SECLOG " " fmt, ## __VA_ARGS__); \ +}) +#define input_info(mode, dev, fmt, ...) \ +({ \ + dev_info(dev, SECLOG " " fmt, ## __VA_ARGS__); \ +}) +#define input_err(mode, dev, fmt, ...) \ +({ \ + dev_err(dev, SECLOG " " fmt, ## __VA_ARGS__); \ +}) +#define input_raw_info(mode, dev, fmt, ...) input_info(mode, dev, fmt, ## __VA_ARGS__) +#define input_log_fix() {} +#define input_raw_data_clear() {} +#endif + +/* + * for input_event_codes.h + */ +#define KEY_HOT 252 +#define KEY_WAKEUP_UNLOCK 253 /* Wake-up to recent view, ex: AOP */ +#define KEY_RECENT 254 + +#define KEY_WATCH 550 /* Premium watch: 2finger double tap */ + +#define BTN_PALM 0x118 /* palm flag */ +#define BTN_LARGE_PALM 0x119 /* large palm flag */ + +#define KEY_BLACK_UI_GESTURE 0x1c7 +#define KEY_EMERGENCY 0x2a0 +#define KEY_INT_CANCEL 0x2be /* for touch event skip */ +#define KEY_DEX_ON 0x2bd +#define KEY_WINK 0x2bf /* Intelligence Key */ +#define KEY_APPS 0x2c1 /* APPS key */ +#define KEY_SIP 0x2c2 /* Sip key */ +#define KEY_SETTING 0x2c5 /* Setting */ +#define KEY_SFINDER 0x2c6 /* Sfinder key */ +#define KEY_SHARE 0x2c9 /* keyboard share */ +#define KEY_FN_LOCK 0x2ca /* fn_lock key */ +#define KEY_FN_UNLOCK 0x2cb /* fn_unlock key */ + +#define ABS_MT_CUSTOM 0x3e /* custom event */ + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) +#define SW_PEN_INSERT 0x0f /* set = pen insert, remove */ +#else +#define SW_PEN_INSERT 0x13 /* set = pen insert, remove */ +#endif + +enum grip_write_mode { + G_NONE = 0, + G_SET_EDGE_HANDLER = 1, + G_SET_EDGE_ZONE = 2, + G_SET_NORMAL_MODE = 4, + G_SET_LANDSCAPE_MODE = 8, + G_CLR_LANDSCAPE_MODE = 16, +}; +enum grip_set_data { + ONLY_EDGE_HANDLER = 0, + GRIP_ALL_DATA = 1, +}; + +enum external_noise_mode { + EXT_NOISE_MODE_NONE = 0, + EXT_NOISE_MODE_MONITOR = 1, /* for dex mode */ + EXT_NOISE_MODE_MAX, /* add new mode above this line */ +}; + +enum wireless_charger_param { + TYPE_WIRELESS_CHARGER_NONE = 0, + TYPE_WIRELESS_CHARGER = 1, + TYPE_WIRELESS_BATTERY_PACK = 3, +}; + +enum charger_param { + TYPE_WIRE_CHARGER_NONE = 0, + TYPE_WIRE_CHARGER = 1, +}; + +enum set_temperature_state { + SEC_INPUT_SET_TEMPERATURE_NORMAL = 0, + SEC_INPUT_SET_TEMPERATURE_IN_IRQ, + SEC_INPUT_SET_TEMPERATURE_FORCE, +}; + +/* FACTORY TEST RESULT SAVING FUNCTION + * bit 3 ~ 0 : OCTA Assy + * bit 7 ~ 4 : OCTA module + * param[0] : OCTA modue(1) / OCTA Assy(2) + * param[1] : TEST NONE(0) / TEST FAIL(1) / TEST PASS(2) : 2 bit + */ +#define TEST_OCTA_MODULE 1 +#define TEST_OCTA_ASSAY 2 +#define TEST_OCTA_NONE 0 +#define TEST_OCTA_FAIL 1 +#define TEST_OCTA_PASS 2 + +/* + * write 0xE4 [ 11 | 10 | 01 | 00 ] + * MSB <-------------------> LSB + * read 0xE4 + * mapping sequnce : LSB -> MSB + * struct sec_ts_test_result { + * * assy : front + OCTA assay + * * module : only OCTA + * union { + * struct { + * u8 assy_count:2; -> 00 + * u8 assy_result:2; -> 01 + * u8 module_count:2; -> 10 + * u8 module_result:2; -> 11 + * } __attribute__ ((packed)); + * unsigned char data[1]; + * }; + *}; + */ + +struct sec_ts_test_result { + union { + struct { + u8 assy_count:2; + u8 assy_result:2; + u8 module_count:2; + u8 module_result:2; + } __attribute__ ((packed)); + unsigned char data[1]; + }; +}; + +typedef enum { + SPONGE_EVENT_TYPE_SPAY = 0x04, + SPONGE_EVENT_TYPE_SINGLE_TAP = 0x08, + SPONGE_EVENT_TYPE_AOD_PRESS = 0x09, + SPONGE_EVENT_TYPE_AOD_LONGPRESS = 0x0A, + SPONGE_EVENT_TYPE_AOD_DOUBLETAB = 0x0B, + SPONGE_EVENT_TYPE_AOD_HOMEKEY_PRESS = 0x0C, + SPONGE_EVENT_TYPE_AOD_HOMEKEY_RELEASE = 0x0D, + SPONGE_EVENT_TYPE_AOD_HOMEKEY_RELEASE_NO_HAPTIC = 0x0E, + SPONGE_EVENT_TYPE_FOD_PRESS = 0x0F, + SPONGE_EVENT_TYPE_FOD_RELEASE = 0x10, + SPONGE_EVENT_TYPE_FOD_OUT = 0x11, + SPONGE_EVENT_TYPE_TSP_SCAN_UNBLOCK = 0xE1, + SPONGE_EVENT_TYPE_TSP_SCAN_BLOCK = 0xE2, +} SPONGE_EVENT_TYPE; + +/* SEC_TS_DEBUG : Print event contents */ +#define SEC_TS_DEBUG_PRINT_ALLEVENT 0x01 +#define SEC_TS_DEBUG_PRINT_ONEEVENT 0x02 +#define SEC_TS_DEBUG_PRINT_READ_CMD 0x04 +#define SEC_TS_DEBUG_PRINT_WRITE_CMD 0x08 + +#define CMD_RESULT_WORD_LEN 10 + +#define SEC_TS_I2C_RETRY_CNT 3 +#define SEC_TS_WAIT_RETRY_CNT 100 + +#define SEC_TS_LOCATION_DETECT_SIZE 6 +#define SEC_TS_SUPPORT_TOUCH_COUNT 10 +#define SEC_TS_GESTURE_REPORT_BUFF_SIZE 20 + +#define SEC_TS_MODE_SPONGE_SWIPE (1 << 1) +#define SEC_TS_MODE_SPONGE_AOD (1 << 2) +#define SEC_TS_MODE_SPONGE_SINGLE_TAP (1 << 3) +#define SEC_TS_MODE_SPONGE_PRESS (1 << 4) +#define SEC_TS_MODE_SPONGE_DOUBLETAP_TO_WAKEUP (1 << 5) +#define SEC_TS_MODE_SPONGE_TWO_FINGER_DOUBLETAP (1 << 7) + +/*SPONGE library parameters*/ +#define SEC_TS_MAX_SPONGE_DUMP_BUFFER 512 +#define SEC_TS_SPONGE_DUMP_EVENT_MASK 0x7F +#define SEC_TS_SPONGE_DUMP_INF_MASK 0x80 +#define SEC_TS_SPONGE_DUMP_INF_SHIFT 7 + +/* SEC_TS SPONGE OPCODE COMMAND */ +#define SEC_TS_CMD_SPONGE_DUMP_FLUSH 0x01 +#define SEC_TS_CMD_SPONGE_AOD_ACTIVE_INFO 0x0A +#define SEC_TS_CMD_SPONGE_OFFSET_UTC 0x10 +#define SEC_TS_CMD_SPONGE_PRESS_PROPERTY 0x14 +#define SEC_TS_CMD_SPONGE_FOD_INFO 0x15 +#define SEC_TS_CMD_SPONGE_FOD_POSITION 0x19 +#define SEC_TS_CMD_SPONGE_GET_INFO 0x90 +#define SEC_TS_CMD_SPONGE_WRITE_PARAM 0x91 +#define SEC_TS_CMD_SPONGE_READ_PARAM 0x92 +#define SEC_TS_CMD_SPONGE_NOTIFY_PACKET 0x93 +#define SEC_TS_CMD_SPONGE_LP_DUMP 0xF0 +#define SEC_TS_CMD_SPONGE_LP_DUMP_CUR_IDX 0xF2 +#define SEC_TS_CMD_SPONGE_LP_DUMP_EVENT 0xF4 + +#define SEC_TS_MAX_FW_PATH 64 +#define TSP_EXTERNAL_FW "tsp.bin" +#define TSP_EXTERNAL_FW_SIGNED "tsp_signed.bin" +#define TSP_SPU_FW_SIGNED "/TSP/ffu_tsp.bin" + +enum power_mode { + SEC_INPUT_STATE_POWER_OFF = 0, + SEC_INPUT_STATE_LPM, + SEC_INPUT_STATE_POWER_ON +}; + +enum sec_ts_cover_id { + SEC_TS_FLIP_COVER = 0, + SEC_TS_SVIEW_COVER, + SEC_TS_NONE, + SEC_TS_SVIEW_CHARGER_COVER, + SEC_TS_HEALTH_COVER, + SEC_TS_S_CHARGER_COVER, + SEC_TS_S_VIEW_WALLET_COVER, + SEC_TS_LED_COVER, + SEC_TS_CLEAR_COVER, + SEC_TS_KEYBOARD_KOR_COVER, + + SEC_TS_KEYBOARD_US_COVER = 10, + SEC_TS_NEON_COVER, + SEC_TS_ALCANTARA_COVER, + SEC_TS_GAMEPACK_COVER, + SEC_TS_LED_BACK_COVER, + SEC_TS_CLEAR_SIDE_VIEW_COVER, + SEC_TS_MINI_SVIEW_WALLET_COVER, + SEC_TS_CLEAR_CAMERA_VIEW_COVER, + + SEC_TS_MONTBLANC_COVER = 100, + SEC_TS_NFC_SMART_COVER = 255, +}; + +#define TEST_MODE_MIN_MAX false +#define TEST_MODE_ALL_NODE true +#define TEST_MODE_READ_FRAME false +#define TEST_MODE_READ_CHANNEL true + +enum offset_fac_position { + OFFSET_FAC_NOSAVE = 0, // FW index 0 + OFFSET_FAC_SUB = 1, // FW Index 2 + OFFSET_FAC_MAIN = 2, // FW Index 3 + OFFSET_FAC_SVC = 3, // FW Index 4 +}; + +enum offset_fw_position { + OFFSET_FW_NOSAVE = 0, + OFFSET_FW_SDC = 1, + OFFSET_FW_SUB = 2, + OFFSET_FW_MAIN = 3, + OFFSET_FW_SVC = 4, +}; + +enum offset_fac_data_type { + OFFSET_FAC_DATA_NO = 0, + OFFSET_FAC_DATA_CM = 1, + OFFSET_FAC_DATA_CM2 = 2, + OFFSET_FAC_DATA_CM3 = 3, + OFFSET_FAC_DATA_MISCAL = 5, + OFFSET_FAC_DATA_SELF_FAIL = 7, +}; + +enum sec_input_notify_t { + NOTIFIER_NOTHING = 0, + NOTIFIER_MAIN_TOUCH_ON, + NOTIFIER_MAIN_TOUCH_OFF, + NOTIFIER_SUB_TOUCH_ON, + NOTIFIER_SUB_TOUCH_OFF, + NOTIFIER_SECURE_TOUCH_ENABLE, /* secure touch is enabled */ + NOTIFIER_SECURE_TOUCH_DISABLE, /* secure touch is disabled */ + NOTIFIER_TSP_BLOCKING_REQUEST, /* wacom called tsp block enable */ + NOTIFIER_TSP_BLOCKING_RELEASE, /* wacom called tsp block disable */ + NOTIFIER_WACOM_PEN_CHARGING_FINISHED, /* to tsp: pen charging finished */ + NOTIFIER_WACOM_PEN_CHARGING_STARTED, /* to tsp: pen charging started */ + NOTIFIER_WACOM_PEN_INSERT, /* to tsp: pen is inserted */ + NOTIFIER_WACOM_PEN_REMOVE, /* to tsp: pen is removed */ + NOTIFIER_WACOM_PEN_HOVER_IN, /* to tsp: pen hover is in */ + NOTIFIER_WACOM_PEN_HOVER_OUT, /* to tsp: pen hover is out */ + NOTIFIER_LCD_VRR_LFD_LOCK_REQUEST, /* to LCD: set LFD min lock */ + NOTIFIER_LCD_VRR_LFD_LOCK_RELEASE, /* to LCD: unset LFD min lock */ + NOTIFIER_LCD_VRR_LFD_OFF_REQUEST, /* to LCD: set LFD OFF */ + NOTIFIER_LCD_VRR_LFD_OFF_RELEASE, /* to LCD: unset LFD OFF */ + NOTIFIER_TSP_ESD_INTERRUPT, + NOTIFIER_WACOM_SAVING_MODE_ON, /* to tsp: multi spen enable cmd on */ + NOTIFIER_WACOM_SAVING_MODE_OFF, /* to tsp: multi spen enable cmd off */ + NOTIFIER_WACOM_KEYBOARDCOVER_FLIP_OPEN, + NOTIFIER_WACOM_KEYBOARDCOVER_FLIP_CLOSE, + NOTIFIER_VALUE_MAX, +}; + +enum notify_set_scan_mode { + DISABLE_TSP_SCAN_BLOCK = 0, + ENABLE_TSP_SCAN_BLOCK = 1, + ENABLE_SPEN_CHARGING_MODE = 2, + DISABLE_SPEN_CHARGING_MODE = 3, + ENABLE_SPEN_IN = 4, + ENABLE_SPEN_OUT = 5, +}; + +enum coord_action { + SEC_TS_COORDINATE_ACTION_NONE = 0, + SEC_TS_COORDINATE_ACTION_PRESS = 1, + SEC_TS_COORDINATE_ACTION_MOVE = 2, + SEC_TS_COORDINATE_ACTION_RELEASE = 3, + SEC_TS_COORDINATE_ACTION_FORCE_RELEASE = 4, +}; + +#define SEC_TS_LFD_CTRL_LOCK_TIME 500 /* msec */ +#define SEC_TS_WAKE_LOCK_TIME 500 /* msec */ + +enum lfd_lock_ctrl { + SEC_TS_LFD_CTRL_LOCK = 0, + SEC_TS_LFD_CTRL_UNLOCK, +}; + +enum notify_tsp_type { + MAIN_TOUCHSCREEN = 0, + SUB_TOUCHSCREEN, +}; + +enum sec_ts_error { + SEC_SKIP = 1, + SEC_SUCCESS = 0, + SEC_ERROR = -1, +}; + +struct sec_input_grip_data { + u8 edgehandler_direction; + int edgehandler_start_y; + int edgehandler_end_y; + u16 edge_range; + u8 deadzone_up_x; + u8 deadzone_dn_x; + int deadzone_y; + u8 deadzone_dn2_x; + int deadzone_dn_y; + u8 landscape_mode; + int landscape_edge; + u16 landscape_deadzone; + u16 landscape_top_deadzone; + u16 landscape_bottom_deadzone; + u16 landscape_top_gripzone; + u16 landscape_bottom_gripzone; +}; + +struct sec_input_notify_data { + u8 dual_policy; +}; + +struct sec_ts_coordinate { + u8 id; + u8 ttype; + u8 action; + u16 x; + u16 y; + u16 p_x; + u16 p_y; + u8 z; + u8 hover_flag; + u8 glove_flag; + u8 touch_height; + u16 mcount; + u8 major; + u8 minor; + bool palm; + int palm_count; + u8 left_event; + u8 noise_level; + u8 max_strength; + u8 hover_id_num; + u8 noise_status; +}; + +struct sec_ts_aod_data { + u16 rect_data[4]; + u16 active_area[3]; +}; + +struct sec_ts_fod_data { + bool set_val; + u16 rect_data[4]; + + u8 vi_x; + u8 vi_y; + u8 vi_size; + u8 vi_data[SEC_CMD_STR_LEN]; + u8 vi_event; + u8 press_prop; +}; + +enum sec_ts_fod_vi_method { + CMD_SYSFS = 0, + CMD_IRQ = 1, +}; + +#define SEC_INPUT_HW_PARAM_SIZE 512 + +struct sec_ts_hw_param_data { + unsigned char ito_test[4]; + bool check_multi; + unsigned int multi_count; + unsigned int wet_count; + unsigned int noise_count; + unsigned int comm_err_count; + unsigned int checksum_result; + unsigned int all_finger_count; + unsigned int all_aod_tap_count; + unsigned int all_spay_count; + int mode_change_failed_count; + int ic_reset_count; +}; + +struct sec_ts_plat_data { + struct input_dev *input_dev; + struct input_dev *input_dev_pad; + struct input_dev *input_dev_proximity; + + int max_x; + int max_y; + int display_x; + int display_y; + int x_node_num; + int y_node_num; + + unsigned irq_gpio; + unsigned int irq_flag; + int gpio_spi_cs; + int i2c_burstmax; + int bringup; + u32 area_indicator; + u32 area_navigation; + u32 area_edge; + char location[SEC_TS_LOCATION_DETECT_SIZE]; + + u8 prox_power_off; + bool power_enabled; + + struct sec_ts_coordinate coord[SEC_TS_SUPPORT_TOUCH_COUNT]; + struct sec_ts_coordinate prev_coord[SEC_TS_SUPPORT_TOUCH_COUNT]; + int touch_count; + unsigned int palm_flag; + volatile u8 touch_noise_status; + volatile u8 touch_pre_noise_status; + int gesture_id; + int gesture_x; + int gesture_y; + + struct sec_ts_fod_data fod_data; + struct sec_ts_aod_data aod_data; + + const char *firmware_name; + struct regulator *dvdd; + struct regulator *avdd; + + u8 core_version_of_ic[4]; + u8 core_version_of_bin[4]; + u8 config_version_of_ic[4]; + u8 config_version_of_bin[4]; + u8 img_version_of_ic[4]; + u8 img_version_of_bin[4]; + + struct pinctrl *pinctrl; + + int (*pinctrl_configure)(struct device *dev, bool on); + int (*power)(struct device *dev, bool on); + int (*start_device)(void *data); + int (*stop_device)(void *data); + int (*lpmode)(void *data, u8 mode); + void (*init)(void *data); + int (*stui_tsp_enter)(void); + int (*stui_tsp_exit)(void); + int (*stui_tsp_type)(void); + + union power_supply_propval psy_value; + struct power_supply *psy; + u8 tsp_temperature_data; + bool tsp_temperature_data_skip; + int (*set_temperature)(struct device *dev, u8 temperature_data); + + struct sec_input_grip_data grip_data; + void (*set_grip_data)(struct device *dev, u8 flag); + + int tsp_icid; + int tsp_id; + int tspicid_val; + int tspid_val; + + volatile bool enabled; + volatile int power_state; + volatile bool shutdown_called; + + u16 touch_functions; + u16 ic_status; + u8 lowpower_mode; + u8 external_noise_mode; + u8 touchable_area; + u8 ed_enable; + u8 pocket_mode; + u8 lightsensor_detect; + u8 fod_lp_mode; + int cover_type; + u8 wirelesscharger_mode; + bool force_wirelesscharger_mode; + int wet_mode; + + bool regulator_boot_on; + bool support_mt_pressure; + bool support_dex; + bool support_ear_detect; +#if IS_ENABLED(CONFIG_INPUT_SEC_SECURE_TOUCH) + int ss_touch_num; +#endif + bool support_fod; + bool support_fod_lp_mode; + bool enable_settings_aot; + bool sync_reportrate_120; + bool support_refresh_rate_mode; + bool support_vrr; + bool support_open_short_test; + bool support_mis_calibration_test; + bool support_wireless_tx; + bool support_flex_mode; + bool support_lightsensor_detect; + bool support_input_monitor; + int support_dual_foldable; + int support_sensor_hall; + int support_rawdata_map_num; + int dump_ic_ver; + bool disable_vsync_scan; + bool unuse_dvdd_power; + bool chip_on_board; + bool enable_sysinput_enabled; + bool not_support_io_ldo; + bool not_support_vdd; + bool sense_off_when_cover_closed; + + struct completion resume_done; + struct wakeup_source *sec_ws; + + struct sec_ts_hw_param_data hw_param; + + struct delayed_work interrupt_notify_work; + + u32 print_info_cnt_release; + u32 print_info_cnt_open; + u16 print_info_currnet_mode; +}; + +struct sec_ts_secure_data { + int (*stui_tsp_enter)(void); + int (*stui_tsp_exit)(void); + int (*stui_tsp_type)(void); +}; + +#ifdef TCLM_CONCEPT +int sec_tclm_data_read(struct i2c_client *client, int address); +int sec_tclm_data_write(struct i2c_client *client, int address); +int sec_tclm_execute_force_calibration(struct i2c_client *client, int cal_mode); +#endif + +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) +extern int get_lcd_attached(char *mode); +#endif + +#if IS_ENABLED(CONFIG_EXYNOS_DPU30) || IS_ENABLED(CONFIG_MCD_PANEL) +extern int get_lcd_info(char *arg); +#endif + +#if IS_ENABLED(CONFIG_SMCDSD_PANEL) +extern unsigned int lcdtype; +#endif + +int sec_input_get_lcd_id(struct device *dev); +int sec_input_handler_start(struct device *dev); +void sec_delay(unsigned int ms); +int sec_input_set_temperature(struct device *dev, int state); +void sec_input_set_grip_type(struct device *dev, u8 set_type); +int sec_input_check_cover_type(struct device *dev); +void sec_input_set_fod_info(struct device *dev, int vi_x, int vi_y, int vi_size, int vi_event); +ssize_t sec_input_get_fod_info(struct device *dev, char *buf); +bool sec_input_set_fod_rect(struct device *dev, int *rect_data); +int sec_input_check_wirelesscharger_mode(struct device *dev, int mode, int force); + +ssize_t sec_input_get_common_hw_param(struct sec_ts_plat_data *pdata, char *buf); +void sec_input_clear_common_hw_param(struct sec_ts_plat_data *pdata); + +void sec_input_print_info(struct device *dev, struct sec_tclm_data *tdata); + +void sec_input_proximity_report(struct device *dev, int data); +void sec_input_gesture_report(struct device *dev, int id, int x, int y); +void sec_input_coord_event(struct device *dev, int t_id); +void sec_input_release_all_finger(struct device *dev); +int sec_input_device_register(struct device *dev, void *data); +void sec_tclm_parse_dt(struct device *dev, struct sec_tclm_data *tdata); +int sec_input_parse_dt(struct device *dev); +void sec_tclm_parse_dt_dev(struct device *dev, struct sec_tclm_data *tdata); +int sec_input_pinctrl_configure(struct device *dev, bool on); +int sec_input_power(struct device *dev, bool on); +int sec_input_sysfs_create(struct kobject *kobj); +void sec_input_sysfs_remove(struct kobject *kobj); + +void sec_input_register_notify(struct notifier_block *nb, notifier_fn_t notifier_call, int priority); +void sec_input_unregister_notify(struct notifier_block *nb); +int sec_input_notify(struct notifier_block *nb, unsigned long noti, void *v); +int sec_input_self_request_notify(struct notifier_block *nb); +int sec_input_enable_device(struct input_dev *dev); +int sec_input_disable_device(struct input_dev *dev); diff --git a/drivers/input/sec_input/sec_input_notifier.c b/drivers/input/sec_input/sec_input_notifier.c new file mode 100755 index 000000000000..858e85794136 --- /dev/null +++ b/drivers/input/sec_input/sec_input_notifier.c @@ -0,0 +1,73 @@ +/* + * sec_notifier.c - samsung common functions + * + * Copyright (C) 2020 Samsung Electronics + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ +//#include +#include +#include + +static BLOCKING_NOTIFIER_HEAD(sec_input_notifier_list); + +/* + * sec_input_register_notify + * @nb: pointer of blocking notifier chain structure + * @notifier_fn_t: register notifier callback function + * + * register universal notifier for any development issue. + * ex) folder open/close, seucre touch enable/disable ... + */ +void sec_input_register_notify(struct notifier_block *nb, notifier_fn_t notifier_call, int priority) +{ + nb->notifier_call = notifier_call; + nb->priority = priority; + blocking_notifier_chain_register(&sec_input_notifier_list, nb); +} +EXPORT_SYMBOL(sec_input_register_notify); + +/* + * sec_input_unregister_notify + * @nb: pointer of blocking notifier chain structure + * + * unregister notifier + */ +void sec_input_unregister_notify(struct notifier_block *nb) +{ + blocking_notifier_chain_unregister(&sec_input_notifier_list, nb); +} +EXPORT_SYMBOL(sec_input_unregister_notify); + +/* + * sec_input_notify + * @nb: pointer of blocking notifier chain structure + * data: notifier type is defined in sec_input.h(enum sec_input_notify_t) + * v: structure data + * + * notifier call function + */ +int sec_input_notify(struct notifier_block *nb, unsigned long noti, void *v) +{ + return blocking_notifier_call_chain(&sec_input_notifier_list, noti, v); +} +EXPORT_SYMBOL(sec_input_notify); + +/* + * sec_input_self_request_notify + * @nb: pointer of blocking notifier chain structure + * + * only test + */ +int sec_input_self_request_notify(struct notifier_block *nb) +{ + return nb->notifier_call(nb, 0, NULL); +} +EXPORT_SYMBOL(sec_input_self_request_notify); + +MODULE_DESCRIPTION("Samsung input notifier"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/sec_input/sec_secure_touch.c b/drivers/input/sec_input/sec_secure_touch.c new file mode 100755 index 000000000000..def17b25efcb --- /dev/null +++ b/drivers/input/sec_input/sec_secure_touch.c @@ -0,0 +1,399 @@ +/* + * sec_secure_touch.c - samsung secure touch driver + * + * Copyright (C) 2018 Samsung Electronics + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +struct sec_secure_touch *g_ss_touch; + +#include "sec_secure_touch.h" +#include +#include "sec_input.h" + +int sec_secure_touch_set_device(struct sec_secure_touch *data, int dev_num); +void sec_secure_touch_sysfs_notify(struct sec_secure_touch *data); + +int sec_secure_touch_set_device(struct sec_secure_touch *data, int dev_num) +{ + int number = dev_num - 1; + int ret; + + if (data->touch_driver[number].registered == 0) + return -ENODEV; + + if (data->device_number > 1) + return -EBUSY; + + mutex_lock(&data->lock); + ret = sysfs_create_link(&data->device->kobj, data->touch_driver[number].kobj, "secure"); + if (ret < 0) { + mutex_unlock(&data->lock); + return -EINVAL; + } + + pr_info("%s: %s: create link ret:%d, %s\n", SECLOG, __func__, ret, data->touch_driver[number].kobj->name); + + data->touch_driver[number].enabled = 1; + + mutex_unlock(&data->lock); + + return ret; +} + +struct sec_touch_driver *sec_secure_touch_register(void *drv_data, int dev_num, struct kobject *kobj) +{ + struct sec_secure_touch *data = g_ss_touch; + int number = dev_num - 1; + + if (!data) { + pr_info("%s %s: null\n", SECLOG, __func__); + return NULL; + } + + pr_info("%s %s\n", SECLOG, __func__); + + if (dev_num < 1) { + dev_err(&data->pdev->dev, "%s: invalid parameter:%d\n", __func__, dev_num); + return NULL; + } + + if (data->touch_driver[number].registered) { + dev_info(&data->pdev->dev, "%s: already registered device number\n", __func__); + return NULL; + } + + pr_info("%s %s: name is %s\n", SECLOG, __func__, kobj->name); + data->touch_driver[number].drv_number = dev_num; + data->touch_driver[number].drv_data = drv_data; + data->touch_driver[number].kobj = kobj; + data->touch_driver[number].registered = 1; + + data->device_number++; + + sec_secure_touch_set_device(data, dev_num); + + return &data->touch_driver[number]; +} +EXPORT_SYMBOL(sec_secure_touch_register); + + +void sec_secure_touch_unregister(int dev_num) +{ + struct sec_secure_touch *data = g_ss_touch; + int number = dev_num - 1; + + pr_info("%s: %s\n", SECLOG, __func__); + + data->touch_driver[number].drv_number = 0; + data->touch_driver[number].drv_data = NULL; + data->touch_driver[number].kobj = NULL; + data->touch_driver[number].registered = 0; + + data->device_number--; + +} + +void sec_secure_touch_sysfs_notify(struct sec_secure_touch *data) +{ + if (!data) + sysfs_notify(&g_ss_touch->device->kobj, NULL, "secure_touch"); + else + sysfs_notify(&data->device->kobj, NULL, "secure_touch"); + + dev_info(&g_ss_touch->pdev->dev, "%s\n", __func__); +} + +static ssize_t secure_dev_count_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_secure_touch *data = dev_get_drvdata(dev); + + if (!data) + return -ENOMEM; + + return snprintf(buf, PAGE_SIZE, "%d", data->device_number); +} + +static DEVICE_ATTR(dev_count, 0444, secure_dev_count_show, NULL); + +static struct attribute *sec_secure_touch_attrs[] = { + &dev_attr_dev_count.attr, + NULL, +}; + +static struct attribute_group sec_secure_touch_attr_group = { + .attrs = sec_secure_touch_attrs, +}; + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +static void sec_secure_touch_hall_ic_work(struct work_struct *work) +{ + struct sec_secure_touch *data = container_of(work, struct sec_secure_touch, folder_work.work); + int ret; + + mutex_lock(&data->lock); + + if (data->hall_ic == SECURE_TOUCH_FOLDER_OPEN) { + if (data->touch_driver[SECURE_TOUCH_SUB_DEV].enabled) { + if (data->touch_driver[SECURE_TOUCH_SUB_DEV].is_running) { + schedule_delayed_work(&data->folder_work, msecs_to_jiffies(10)); + mutex_unlock(&data->lock); + return; + } + + sysfs_remove_link(&data->device->kobj, "secure"); + data->touch_driver[SECURE_TOUCH_SUB_DEV].enabled = 0; + } else { + pr_info("%s: %s: error: %d\n", SECLOG, __func__, __LINE__); + } + + if (data->touch_driver[SECURE_TOUCH_MAIN_DEV].registered) { + if (data->touch_driver[SECURE_TOUCH_MAIN_DEV].enabled == 1) { + pr_info("%s: %s: already created\n", SECLOG, __func__); + mutex_unlock(&data->lock); + return; + } + + ret = sysfs_create_link(&data->device->kobj, data->touch_driver[SECURE_TOUCH_MAIN_DEV].kobj, "secure"); + if (ret < 0) { + mutex_unlock(&data->lock); + return; + } + + pr_info("%s: %s: create link ret:%d, %s\n", SECLOG, __func__, ret, data->touch_driver[SECURE_TOUCH_MAIN_DEV].kobj->name); + data->touch_driver[SECURE_TOUCH_MAIN_DEV].enabled = 1; + } else { + pr_info("%s: %s: error: %d\n", SECLOG, __func__, __LINE__); + } + } else if (data->hall_ic == SECURE_TOUCH_FOLDER_CLOSE) { + if (data->touch_driver[SECURE_TOUCH_MAIN_DEV].enabled) { + if (data->touch_driver[SECURE_TOUCH_MAIN_DEV].is_running) { + schedule_delayed_work(&data->folder_work, msecs_to_jiffies(10)); + mutex_unlock(&data->lock); + return; + } + sysfs_remove_link(&data->device->kobj, "secure"); + data->touch_driver[SECURE_TOUCH_MAIN_DEV].enabled = 0; + } else { + pr_info("%s: %s: error: %d\n", SECLOG, __func__, __LINE__); + } + + if (data->touch_driver[SECURE_TOUCH_SUB_DEV].registered) { + if (data->touch_driver[SECURE_TOUCH_SUB_DEV].enabled == 1) { + pr_info("%s: %s: already created\n", SECLOG, __func__); + mutex_unlock(&data->lock); + return; + } + + ret = sysfs_create_link(&data->device->kobj, data->touch_driver[SECURE_TOUCH_SUB_DEV].kobj, "secure"); + if (ret < 0) { + mutex_unlock(&data->lock); + return; + } + + pr_info("%s: %s: create link ret:%d, %s\n", SECLOG, __func__, ret, data->touch_driver[SECURE_TOUCH_SUB_DEV].kobj->name); + data->touch_driver[SECURE_TOUCH_SUB_DEV].enabled = 1; + } else { + pr_info("%s: %s: error: %d\n", SECLOG, __func__, __LINE__); + } + } else { + mutex_unlock(&data->lock); + return; + } + + mutex_unlock(&data->lock); +} + +#if IS_ENABLED(CONFIG_HALL_NOTIFIER) +static int sec_secure_touch_hall_ic_notifier(struct notifier_block *nb, unsigned long hall_ic, void *ptr) +{ + struct sec_secure_touch *data = container_of(nb, struct sec_secure_touch, nb); + struct hall_notifier_context *hall_notifier; + + if (!data) + return -ENOMEM; + + if (data->device_number < 1) + return -ENODEV; + + hall_notifier = ptr; + + if (strncmp(hall_notifier->name, "flip", 4) != 0) { + pr_info("%s: %s\n", __func__, hall_notifier->name); + return 0; + } + + data->hall_ic = hall_ic; + + pr_info("%s %s: device number:%d,%s %s%s\n", SECLOG, __func__, data->device_number, + data->hall_ic ? "CLOSE" : "OPEN", + data->touch_driver[SECURE_TOUCH_MAIN_DEV].is_running ? "tsp1" : "", + data->touch_driver[SECURE_TOUCH_SUB_DEV].is_running ? "tsp2" : ""); + + schedule_work(&data->folder_work.work); + + return 0; +} +#endif + +#if IS_ENABLED(CONFIG_SUPPORT_SENSOR_FOLD) +static int sec_secure_touch_hall_ic_ssh_notifier(struct notifier_block *nb, unsigned long hall_ic, void *ptr) +{ + struct sec_secure_touch *data = container_of(nb, struct sec_secure_touch, nb_ssh); + + if (!data) + return -ENOMEM; + + if (data->device_number < 1) + return -ENODEV; + + data->hall_ic = hall_ic; + + pr_info("%s %s: device number:%d,%s %s%s\n", SECLOG, __func__, data->device_number, + data->hall_ic ? "CLOSE" : "OPEN", + data->touch_driver[SECURE_TOUCH_MAIN_DEV].is_running ? "tsp1" : "", + data->touch_driver[SECURE_TOUCH_SUB_DEV].is_running ? "tsp2" : ""); + + schedule_work(&data->folder_work.work); + + return 0; +} +#endif +#endif + +static int sec_secure_touch_probe(struct platform_device *pdev) +{ + struct sec_secure_touch *data; + int ret; + +#if !IS_ENABLED(CONFIG_DRV_SAMSUNG) + pr_info("%s %s: sec_class is not support\n", SECLOG, __func__); + return -ENOENT; +#endif + data = kzalloc(sizeof(struct sec_secure_touch), GFP_KERNEL); + if (!data) { + pr_info("%s %s: failed probe: mem\n", SECLOG, __func__); + return -ENOMEM; + } + data->pdev = pdev; + +#if IS_ENABLED(CONFIG_DRV_SAMSUNG) + data->device = sec_device_create(11, data, SECURE_TOUCH_DEV_NAME); + if (IS_ERR(data->device)) { + pr_info("%s %s: failed probe: create\n", SECLOG, __func__); + kfree(data); + return -ENODEV; + } +#endif + g_ss_touch = data; + + dev_set_drvdata(data->device, data); + + platform_set_drvdata(pdev, data); + + mutex_init(&data->lock); + + ret = sysfs_create_group(&data->device->kobj, &sec_secure_touch_attr_group); + if (ret < 0) { + pr_info("%s %s: failed probe: create sysfs\n", SECLOG, __func__); +#if IS_ENABLED(CONFIG_DRV_SAMSUNG) + sec_device_destroy(data->device->devt); +#endif + g_ss_touch = NULL; + kfree(data); + return -ENODEV; + } + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +#if IS_ENABLED(CONFIG_HALL_NOTIFIER) + data->nb.notifier_call = sec_secure_touch_hall_ic_notifier; + data->nb.priority = 1; + hall_notifier_register(&data->nb); +#endif +#if IS_ENABLED(CONFIG_SUPPORT_SENSOR_FOLD) + data->nb_ssh.notifier_call = sec_secure_touch_hall_ic_ssh_notifier; + data->nb_ssh.priority = 1; + sensorfold_notifier_register(&data->nb_ssh); +#endif + INIT_DELAYED_WORK(&data->folder_work, sec_secure_touch_hall_ic_work); +#else + sec_secure_touch_set_device(data, 1); +#endif + pr_info("%s: %s\n", SECLOG, __func__); + + return 0; +} + +static int sec_secure_touch_remove(struct platform_device *pdev) +{ + struct sec_secure_touch *data = platform_get_drvdata(pdev); + int ii; + + pr_info("%s: %s\n", SECLOG, __func__); +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) + mutex_lock(&data->lock); +#if IS_ENABLED(CONFIG_HALL_NOTIFIER) + hall_notifier_unregister(&data->nb); +#endif + mutex_unlock(&data->lock); +#endif + for (ii = 0; ii < data->device_number; ii++) { + if (data->touch_driver[ii].enabled) + sysfs_remove_link(&data->device->kobj, "secure"); + + sysfs_remove_group(&data->device->kobj, &sec_secure_touch_attr_group); + } + + mutex_destroy(&data->lock); +#if IS_ENABLED(CONFIG_DRV_SAMSUNG) + sec_device_destroy(data->device->devt); +#endif + g_ss_touch = NULL; + kfree(data); + return 0; +} + +#if CONFIG_OF +static const struct of_device_id sec_secure_touch_dt_match[] = { + { .compatible = "samsung,ss_touch" }, + {} +}; +#endif + +struct platform_driver sec_secure_touch_driver = { + .probe = sec_secure_touch_probe, + .remove = sec_secure_touch_remove, + .driver = { + .name = "sec_secure_touch", + .owner = THIS_MODULE, +#if CONFIG_OF + .of_match_table = of_match_ptr(sec_secure_touch_dt_match), +#endif + }, +}; + +static int __init sec_secure_touch_init(void) +{ + pr_info("%s: %s\n", SECLOG, __func__); + + platform_driver_register(&sec_secure_touch_driver); + return 0; +} + +static void __exit sec_secure_touch_exit(void) +{ + pr_info("%s; %s\n", SECLOG, __func__); + +}; + +module_init(sec_secure_touch_init); +module_exit(sec_secure_touch_exit); + +MODULE_DESCRIPTION("Samsung Secure Touch Driver"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/sec_input/sec_secure_touch.h b/drivers/input/sec_input/sec_secure_touch.h new file mode 100755 index 000000000000..b0dd490cd852 --- /dev/null +++ b/drivers/input/sec_input/sec_secure_touch.h @@ -0,0 +1,91 @@ +#ifndef _SEC_SECURE_TOUCH_H_ +#define _SEC_SECURE_TOUCH_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#if defined(CONFIG_SEC_SYSFS) +//#include +#if IS_ENABLED(CONFIG_DRV_SAMSUNG) +#include +#endif +//#else +//extern struct class *sec_class; +//#endif + +#if IS_ENABLED(CONFIG_HALL_NOTIFIER) +#include +#endif +#if IS_ENABLED(CONFIG_SUPPORT_SENSOR_FOLD) +#include +#endif + +#define SECURE_TOUCH_DEVICE_FIRST 1 +#define SECURE_TOUCH_DEVICE_SECOND 2 + +/* + * folder open = main screen = 0 + * folder close = sub screen = 1 + */ +#define SECURE_TOUCH_MAIN_DEV 0 +#define SECURE_TOUCH_SUB_DEV 1 + +#define SECURE_TOUCH_FOLDER_OPEN 0 +#define SECURE_TOUCH_FOLDER_CLOSE 1 + +#define SECURE_TOUCH_DEV_NAME "ss_touch" +struct sec_secure_touch_platform_data { + void (*connect)(void *); + void (*disconnect)(void *); + int data; + int temp; +}; + +struct sec_touch_driver { + struct list_head list; + int drv_number; + int (*enable)(void *drv_data); + int (*disable)(void *drv_data); + int (*status)(void *drv_data); + int (*irq_handle)(void *drv_data); + void *drv_data; + struct kobject *kobj; + int enabled; + int registered; + int is_running; +}; + +struct sec_secure_touch { + struct list_head list_head; + int secure_enabled; + void *data; + struct platform_device *pdev; + struct device *device; +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) + struct delayed_work folder_work; +#endif + int hall_ic; + struct mutex lock; + struct notifier_block nb; + struct notifier_block nb_ssh; + struct sec_touch_driver touch_driver[2]; + int device_number; + int current_device; +}; + +void sec_secure_touch_sysfs_notify(struct sec_secure_touch *data); +struct sec_touch_driver *sec_secure_touch_register(void *drv_data, int dev_num, struct kobject *kobj); +void sec_secure_touch_unregister(int dev_num); + + +extern void hall_ic_register_notify(struct notifier_block *nb); +extern void hall_ic_unregister_notify(struct notifier_block *nb); +#endif diff --git a/drivers/input/sec_input/sec_tclm_v2.c b/drivers/input/sec_input/sec_tclm_v2.c new file mode 100755 index 000000000000..ecf3c29a63e8 --- /dev/null +++ b/drivers/input/sec_input/sec_tclm_v2.c @@ -0,0 +1,614 @@ +/* + * sec_tclm.c - samsung tclm command driver + * + * Copyright (C) 2018 Samsung Electronics + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include "sec_input.h" +#include "sec_tclm_v2.h" +#include "sec_tsp_log.h" + +struct sec_cal_position sec_cal_positions[CALPOSITION_MAX] = { + {CAL_POS_CMD("NONE", 'N'),}, /* 0, NONe */ + {CAL_POS_CMD("INIT", 'I'),}, /* 1, INIT case, calcount is 00 or FF */ + {CAL_POS_CMD("FACT", 'F'),}, /* 2, FACTory line, run_force_calibration without value */ + {CAL_POS_CMD("OUTS", 'O'),}, /* 3, OUTSide of factory */ + {CAL_POS_CMD("LCIA", 'L'),}, /* 4, LCIA in factory line */ + {CAL_POS_CMD("CENT", 'C'),}, /* 5, svc CENTer, cal from service center */ + {CAL_POS_CMD("ABNO", 'A'),}, /* 6, ABNOrmal case */ + {CAL_POS_CMD("BOOT", 'B'),}, /* 7, BOOT firmup, when firmup in booting time */ + {CAL_POS_CMD("SPEC", 'S'),}, /* 8, SPECout case */ + {CAL_POS_CMD("TUNE", 'V'),}, /* 9, TUNE Version up, when afe version is lage than tune version */ + {CAL_POS_CMD("EVER", 'E'),}, /* 10, EVERytime, always cal in Booting */ + {CAL_POS_CMD("TEST", 'T'),}, /* 11, TESTmode, firmup case in *#2663# */ + {CAL_POS_CMD("UNDE", 'U'),}, /* 12, UNDEfine, undefined value */ + {CAL_POS_CMD("UNDE", 'U'),}, /* 13 */ + {CAL_POS_CMD("UNDE", 'U'),}, /* 14 */ + {CAL_POS_CMD("UNDE", 'U'),} /* 15 */ +}; + +void sec_tclm_case(struct sec_tclm_data *data, int tclm_case) +{ + switch (tclm_case) { + case 0: + case 'F': + case 'f': + if (data->external_factory == true) + sec_tclm_root_of_cal(data, CALPOSITION_OUTSIDE); + else + sec_tclm_root_of_cal(data, CALPOSITION_FACTORY); + break; + + case 'L': + case 'l': + sec_tclm_root_of_cal(data, CALPOSITION_LCIA); + break; + + case 'C': + case 'c': + sec_tclm_root_of_cal(data, CALPOSITION_SVCCENTER); + break; + + case 'O': + case 'o': + sec_tclm_root_of_cal(data, CALPOSITION_OUTSIDE); + break; + + default: + sec_tclm_root_of_cal(data, CALPOSITION_ABNORMAL); + } +} +EXPORT_SYMBOL(sec_tclm_case); + +int tclm_test_command(struct sec_tclm_data *data, int test_case, int cmd_param1, int cmd_param2, char *buff) +{ + int ret = 1; + const int buff_size = 256; + struct device *dev = NULL; + + if (data->client) + dev = &data->client->dev; + if (data->spi) + dev = &data->spi->dev; + + if (!dev) + return -ENODEV; + + switch (test_case) { + case 0: // get tclm_level,afe_base + snprintf(buff, buff_size, "%d,%04X", data->tclm_level, data->afe_base); + break; + case 1: /* change cal_position & history + * cmd_param[1]: cal_position enum + * cmd_param[2]: tune_fix_ver */ + if (cmd_param1 == 0xff) + sec_tclm_root_of_cal(data, 0); + else + sec_tclm_root_of_cal(data, cmd_param1); + + if (data->root_of_calibration != data->nvdata.cal_position) { + sec_tclm_reposition_history(data); + data->nvdata.cal_count = 0; + } + data->nvdata.cal_count++; + if (cmd_param1 == 0) { + data->nvdata.cal_count = 0; + + data->nvdata.cal_pos_hist_cnt = 0; + data->nvdata.cal_pos_hist_lastp = 0; + + cmd_param2 = 0; + } else if (cmd_param1 == 0xff) { + data->nvdata.cal_count = 0xff; + + data->nvdata.cal_pos_hist_cnt = 0; + data->nvdata.cal_pos_hist_lastp = 0; + + cmd_param2 = 0xffff; + } + data->nvdata.cal_position = data->root_of_calibration; + data->nvdata.tune_fix_ver = cmd_param2; + if (data->client && data->tclm_write) + ret = data->tclm_write(data->client, SEC_TCLM_NVM_ALL_DATA); + else if (data->spi && data->tclm_write_spi) + ret = data->tclm_write_spi(data->spi, SEC_TCLM_NVM_ALL_DATA); + if (ret < 0) { + input_info(true, dev, "%s failed\n", __func__); + snprintf(buff, buff_size, "%s", "FAIL"); + return ret; + } + sec_tclm_root_of_cal(data, CALPOSITION_NONE); + + input_info(true, dev, "%s,1: cal_pos: %d, tune_fix_ver:0x%04X\n", + __func__, cmd_param1, cmd_param2); + + sec_tclm_position_history(data); + + snprintf(buff, buff_size, "%s", "OK"); + break; + case 2: /* change tclm_level, afe_base + * cmd_param[1]: tclm_level + * cmd_param[2]: afe_base */ + { + + data->tclm[0] = (cmd_param1 & 0xFF); + data->tclm[1] = ((cmd_param2 >> 8) & 0xFF); + data->tclm[2] = (cmd_param2 & 0xFF); + + if (data->client && data->tclm_write) + ret = data->tclm_write(data->client, SEC_TCLM_NVM_TEST); + else if (data->spi && data->tclm_write_spi) + ret = data->tclm_write_spi(data->spi, SEC_TCLM_NVM_TEST); + if (ret < 0) { + input_info(true, dev, "%s failed\n", __func__); + snprintf(buff, buff_size, "%s", "FAIL"); + return ret; + } + + memset(data->tclm, 0x00, SEC_TCLM_NVM_OFFSET_LENGTH); + if (data->client && data->tclm_read) + ret = data->tclm_read(data->client, SEC_TCLM_NVM_TEST); + else if (data->spi && data->tclm_read_spi) + ret = data->tclm_read_spi(data->spi, SEC_TCLM_NVM_TEST); + if (ret < 0) { + input_info(true, dev, "%s failed\n", __func__); + snprintf(buff, buff_size, "%s", "FAIL"); + return ret; + } + data->tclm_level = data->tclm[0]; + data->afe_base = (data->tclm[1] << 8) | data->tclm[2]; + + input_err(true, &data->client->dev, "%s,2: tclm_level %d, sec_afe_base %04X\n", __func__, data->tclm_level, data->afe_base); + snprintf(buff, buff_size, "%s", "OK"); + } + break; + case 3: /* clear tclm_level, afe_base nv & set to dt_data */ + { + data->tclm[0]= 0xff; + data->tclm[1]= 0xff; + data->tclm[2]= 0xff; + + /* clear tclm_level, afe_base nvm to 0xff */ + if (data->client && data->tclm_write) + ret = data->tclm_write(data->client, SEC_TCLM_NVM_TEST); + else if (data->spi && data->tclm_write_spi) + ret = data->tclm_write_spi(data->spi, SEC_TCLM_NVM_TEST); + if (ret < 0) { + input_info(true, dev, "%s failed\n", __func__); + snprintf(buff, buff_size, "%s", "FAIL"); + return ret; + } + + /* get dt_data again */ + if (data->client && data->tclm_parse_dt) + data->tclm_parse_dt(&data->client->dev, data); + else if (data->spi && data->tclm_parse_dt_dev) + data->tclm_parse_dt_dev(&data->spi->dev, data); + + input_err(true, dev, "%s,3: tclm_level %d, sec_afe_base %04X\n", __func__, data->tclm_level, data->afe_base); + snprintf(buff, buff_size, "%s", "OK"); + } + break; + } + + return ret; +} +EXPORT_SYMBOL(tclm_test_command); + +int sec_tclm_test_on_probe(struct sec_tclm_data *data) +{ + int retry = 3; + int ret = 0; + struct device *dev = NULL; + + if (data->client) + dev = &data->client->dev; + if (data->spi) + dev = &data->spi->dev; + + if (!dev) + return -ENODEV; + + while (retry--) { + if (data->client && data->tclm_read) + ret = data->tclm_read(data->client, SEC_TCLM_NVM_TEST); + else if (data->spi && data->tclm_read_spi) + ret = data->tclm_read_spi(data->spi, SEC_TCLM_NVM_TEST); + if (ret >= 0) + break; + } + + if (ret < 0) + input_err(true, dev, "%s: failed ret:%d\n", __func__, ret); + + return ret; +} +EXPORT_SYMBOL(sec_tclm_test_on_probe); + +int sec_tclm_get_nvm_all(struct sec_tclm_data *data) +{ + int ret = -1; + int retry = 3; + struct device *dev = NULL; + + if (data->client) + dev = &data->client->dev; + if (data->spi) + dev = &data->spi->dev; + + if (!dev) + return -ENODEV; + + /* just don't read tune_fix_version, because this is write_only_value. */ + while (retry--) { + if (data->client && data->tclm_read) + ret = data->tclm_read(data->client, SEC_TCLM_NVM_ALL_DATA); + else if (data->spi && data->tclm_read_spi) + ret = data->tclm_read_spi(data->spi, SEC_TCLM_NVM_ALL_DATA); + if (ret >= 0) + break; + } + + if (ret < 0) { + input_err(true, dev, "%s: failed ret:%d\n", __func__, ret); + return ret; + } + + if (data->nvdata.cal_count == 0xFF || data->nvdata.cal_position >= CALPOSITION_MAX) { + data->nvdata.cal_count = 0; + data->nvdata.cal_position = 0; + data->nvdata.tune_fix_ver = 0; + data->nvdata.cal_pos_hist_cnt = 0; + data->nvdata.cal_pos_hist_lastp = 0; + input_info(true, dev, "%s: cal data is abnormal\n", __func__); + return TCLM_RESULT_ABNORMAL; + } + + if (data->nvdata.cal_pos_hist_cnt > CAL_HISTORY_QUEUE_MAX) + data->nvdata.cal_pos_hist_cnt = 0; /* error case */ + + input_info(true, dev, "%s: cal_count:%d, pos:%d(%4s), hist_count:%d, lastp:%d\n", + __func__, data->nvdata.cal_count, data->nvdata.cal_position, + data->tclm_string[data->nvdata.cal_position].f_name, + data->nvdata.cal_pos_hist_cnt, data->nvdata.cal_pos_hist_lastp); + + sec_tclm_position_history(data); + + return TCLM_RESULT_DONE; +} + +void sec_tclm_position_history(struct sec_tclm_data *data) +{ + int i; + int now_lastp = data->nvdata.cal_pos_hist_lastp; + unsigned char *pStr = NULL; + unsigned char pTmp[5] = { 0 }; + struct device *dev = NULL; + + if (data->client) + dev = &data->client->dev; + if (data->spi) + dev = &data->spi->dev; + + if (!dev) + return; + + if (data->nvdata.cal_pos_hist_cnt > CAL_HISTORY_QUEUE_MAX + || data->nvdata.cal_pos_hist_lastp >= CAL_HISTORY_QUEUE_MAX) { + input_info(true, dev, "%s: not initial case, count:%X, p:%X\n", __func__, + data->nvdata.cal_pos_hist_cnt, data->nvdata.cal_pos_hist_lastp); + return; + } + + input_info(true, dev, "%s: [Now] %4s%d\n", __func__, + data->tclm_string[data->nvdata.cal_position].f_name, data->nvdata.cal_count); + + pStr = kzalloc(CAL_HISTORY_QUEUE_MAX * 5, GFP_KERNEL); + if (pStr == NULL) + return; + + for (i = 0; i < data->nvdata.cal_pos_hist_cnt; i++) { + snprintf(pTmp, sizeof(pTmp), "%c%d", data->tclm_string[data->nvdata.cal_pos_hist_queue[2 * now_lastp]].s_name, data->nvdata.cal_pos_hist_queue[2 * now_lastp + 1]); + strlcat(pStr, pTmp, CAL_HISTORY_QUEUE_MAX * 5); + if (i < CAL_HISTORY_QUEUE_SHORT_DISPLAY) { + data->cal_pos_hist_last3[2 * i] = data->tclm_string[data->nvdata.cal_pos_hist_queue[2 * now_lastp]].s_name; + data->cal_pos_hist_last3[2 * i + 1] = data->nvdata.cal_pos_hist_queue[2 * now_lastp + 1]; + } + + if (now_lastp <= 0) + now_lastp = CAL_HISTORY_QUEUE_MAX - 1; + else + now_lastp--; + } + + input_info(true, dev, "%s: [Old] %s\n", __func__, pStr); + + if (i < CAL_HISTORY_QUEUE_SHORT_DISPLAY) + data->cal_pos_hist_last3[2 * i] = 0; + else + data->cal_pos_hist_last3[6] = 0; + + kfree(pStr); +} + +void sec_tclm_debug_info(struct sec_tclm_data *data) +{ + sec_tclm_position_history(data); +} +EXPORT_SYMBOL(sec_tclm_debug_info); + +void sec_tclm_root_of_cal(struct sec_tclm_data *data, int pos) +{ + struct device *dev = NULL; + + if (data->client) + dev = &data->client->dev; + if (data->spi) + dev = &data->spi->dev; + + if (!dev) + return; + + data->root_of_calibration = pos; + input_info(true, dev, "%s: root - %d(%4s)\n", __func__, + pos, data->tclm_string[pos].f_name); +} +EXPORT_SYMBOL(sec_tclm_root_of_cal); + +static bool sec_tclm_check_condition_valid(struct sec_tclm_data *data) +{ + struct device *dev = NULL; + + if (data->client) + dev = &data->client->dev; + if (data->spi) + dev = &data->spi->dev; + + if (!dev) + return false; + + input_err(true, dev, "%s tclm_level:%02X, last pos:%d(%4s), now pos:%d(%4s)\n", + __func__, data->tclm_level, data->nvdata.cal_position, data->tclm_string[data->nvdata.cal_position].f_name, + data->root_of_calibration, data->tclm_string[data->root_of_calibration].f_name); + + /* enter case */ + switch (data->tclm_level) { + case TCLM_LEVEL_LOCKDOWN: + if ((data->root_of_calibration == CALPOSITION_TUNEUP) + || (data->root_of_calibration == CALPOSITION_INITIAL)) { + return true; + } else if ((data->root_of_calibration == CALPOSITION_TESTMODE) + && ((data->nvdata.cal_position == CALPOSITION_TESTMODE) + || (data->nvdata.cal_position == CALPOSITION_TUNEUP) + || (data->nvdata.cal_position == CALPOSITION_FIRMUP))) { + return true; + } + break; + + case TCLM_LEVEL_CLEAR_NV: + return true; + + case TCLM_LEVEL_EVERYTIME: + return true; + + case TCLM_LEVEL_NONE: + if ((data->root_of_calibration == CALPOSITION_TESTMODE) + || (data->root_of_calibration == CALPOSITION_INITIAL)) { + return true; + } else { + return false; + } + case TCLM_LEVEL_NOT_SUPPORT: + return false; + } + + return false; +} + +void sec_tclm_reposition_history(struct sec_tclm_data *data) +{ + /* current data of cal count,position save cal history queue */ + + if (data->nvdata.cal_pos_hist_cnt > CAL_HISTORY_QUEUE_MAX || data->nvdata.cal_pos_hist_lastp >= CAL_HISTORY_QUEUE_MAX) { + /* queue nvm clear case */ + data->nvdata.cal_pos_hist_cnt = 0; + data->nvdata.cal_pos_hist_lastp = 0; + } + + /*calculate queue lastpointer */ + if (data->nvdata.cal_pos_hist_cnt == 0) + data->nvdata.cal_pos_hist_lastp = 0; + else if (data->nvdata.cal_pos_hist_lastp >= (CAL_HISTORY_QUEUE_MAX - 1)) + data->nvdata.cal_pos_hist_lastp = 0; + else + data->nvdata.cal_pos_hist_lastp++; + + /*calculate queue count */ + if (data->nvdata.cal_pos_hist_cnt >= CAL_HISTORY_QUEUE_MAX) + data->nvdata.cal_pos_hist_cnt = CAL_HISTORY_QUEUE_MAX; + else + data->nvdata.cal_pos_hist_cnt++; + + data->nvdata.cal_pos_hist_queue[data->nvdata.cal_pos_hist_lastp * 2] = data->nvdata.cal_position; + data->nvdata.cal_pos_hist_queue[data->nvdata.cal_pos_hist_lastp * 2 + 1] = data->nvdata.cal_count; +} + +int sec_execute_tclm_package(struct sec_tclm_data *data, int factory_mode) +{ + int ret; + int retry = 3; + struct device *dev = NULL; + + if (data->client) + dev = &data->client->dev; + if (data->spi) + dev = &data->spi->dev; + + if (!dev) + return -ENODEV; + + /* first read cal data for compare */ + + ret = sec_tclm_get_nvm_all(data); + if (ret < 0) { + input_err(true, dev, "%s: sec_tclm_nvm_all_data i2c read fail", __func__); + goto out; + } + + + input_err(true, dev, "%s: tclm_level:%02X, last pos:%d(%4s), now pos:%d(%4s), factory:%d\n", + __func__, data->tclm_level, data->nvdata.cal_position, data->tclm_string[data->nvdata.cal_position].f_name, + data->root_of_calibration, data->tclm_string[data->root_of_calibration].f_name, + factory_mode); + + /* if is run_for_calibration, don't check cal condition */ + if (!factory_mode) { + + /*check cal condition */ + ret = sec_tclm_check_condition_valid(data); + if (!ret) { + input_err(true, dev, "%s: fail tclm condition,%d, root:%d\n", + __func__, ret, data->root_of_calibration); + return TCLM_RESULT_DONE; /* do not need calibration */ + } + + input_err(true, dev, "%s: RUN OFFSET CALIBRATION,%d\n", __func__, ret); + + /* execute force cal */ + if (data->client && data->tclm_execute_force_calibration) + ret = data->tclm_execute_force_calibration(data->client, TCLM_OFFSET_CAL_SEC); + else if (data->spi && data->tclm_execute_force_calibration_spi) + ret = data->tclm_execute_force_calibration_spi(data->spi, TCLM_OFFSET_CAL_SEC); + if (ret < 0) { + input_err(true, dev, "%s: fail to write OFFSET CAL SEC!\n", __func__); + return ret; + } + } + + if ((data->nvdata.cal_count < 1) || (data->nvdata.cal_count >= 0xFF)) { + /* all nvm clear */ + data->nvdata.cal_count = 0; + data->nvdata.cal_pos_hist_cnt = 0; + data->nvdata.cal_pos_hist_lastp = 0; + } else if (data->root_of_calibration != data->nvdata.cal_position) { + sec_tclm_reposition_history(data); + data->nvdata.cal_count = 0; + } + + if (data->nvdata.cal_count == 0) { + /* saving cal position */ + data->nvdata.cal_position = data->root_of_calibration; + } + + data->nvdata.cal_count++; + + /* saving tune_version */ + if (data->client && data->tclm_read) + ret = data->tclm_read(data->client, SEC_TCLM_NVM_OFFSET_IC_FIRMWARE_VER); + else if (data->spi && data->tclm_read_spi) + ret = data->tclm_read_spi(data->spi, SEC_TCLM_NVM_OFFSET_IC_FIRMWARE_VER); + if (ret < 0) { + input_err(true, dev, "%s: SEC_TCLM_NVM_OFFSET_IC_FIRMWARE_VER i2c read fail", __func__); + goto out; + } + data->nvdata.tune_fix_ver = ret; + + while (retry--) { + if (data->client && data->tclm_write) + ret = data->tclm_write(data->client, SEC_TCLM_NVM_ALL_DATA); + else if (data->spi && data->tclm_write_spi) + ret = data->tclm_write_spi(data->spi, SEC_TCLM_NVM_ALL_DATA); + if (ret >= 0) + break; + } + + if (ret < 0) { + input_err(true, dev, "%s: failed ret:%d\n", __func__, ret); + goto out; + } + + sec_tclm_position_history(data); + + return TCLM_RESULT_CAL_DONE; + +out: + return ret; +} +EXPORT_SYMBOL(sec_execute_tclm_package); + +int sec_tclm_check_cal_case(struct sec_tclm_data *data) +{ + int restore_cal = 0; + int ret = 0; + struct device *dev = NULL; + + if (data->client) + dev = &data->client->dev; + if (data->spi) + dev = &data->spi->dev; + + if (!dev) + return -ENODEV; + + if (data->nvdata.cal_count == 0xFF) { + if (data->client && data->tclm_read) + ret = data->tclm_read(data->client, SEC_TCLM_NVM_ALL_DATA); + else if (data->spi && data->tclm_read_spi) + ret = data->tclm_read_spi(data->spi, SEC_TCLM_NVM_ALL_DATA); + if (ret < 0) { + input_err(true, dev, "%s: fail to read SEC_TCLM_NVM_ALL_DATA !\n", __func__); + return ret; + } + + input_info(true, dev, "%s: cal_count value [%d]\n", __func__, data->nvdata.cal_count); + } + + if ((data->nvdata.cal_count == 0) || (data->nvdata.cal_count == 0xFF)) { + input_err(true, dev, "%s: Calcount is abnormal,%02X\n", __func__, data->nvdata.cal_count); + /* nvm uninitialed case */ + sec_tclm_root_of_cal(data, CALPOSITION_INITIAL); + restore_cal = 1; + } else if (data->tclm_level == TCLM_LEVEL_EVERYTIME) { + /* everytime case */ + sec_tclm_root_of_cal(data, CALPOSITION_EVERYTIME); + restore_cal = 1; + } + + if (restore_cal) { + ret = sec_execute_tclm_package(data, 0); + if (ret < 0) { + input_err(true, dev, "%s: fail sec_execute_tclm_package!\n", __func__); + return ret; + } + sec_tclm_root_of_cal(data, CALPOSITION_NONE); + return ret; + } + + ret = sec_tclm_get_nvm_all(data); + if (ret < 0) { + input_info(true, dev, "%s: sec_tclm_get_nvm_all error \n", __func__); + } + + return ret; +} +EXPORT_SYMBOL(sec_tclm_check_cal_case); + +void sec_tclm_initialize(struct sec_tclm_data *data) +{ + data->root_of_calibration = CALPOSITION_NONE; + data->nvdata.cal_position = 0; + data->nvdata.cal_pos_hist_cnt = 0; + memset(data->cal_pos_hist_last3, 0x00, sizeof(data->cal_pos_hist_last3)); + data->tclm_string = sec_cal_positions; + data->nvdata.cal_count = 0xFF; +} +EXPORT_SYMBOL(sec_tclm_initialize); + +MODULE_DESCRIPTION("Samsung tclm command"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/sec_input/sec_tclm_v2.h b/drivers/input/sec_input/sec_tclm_v2.h new file mode 100755 index 000000000000..2e09f04c9c84 --- /dev/null +++ b/drivers/input/sec_input/sec_tclm_v2.h @@ -0,0 +1,115 @@ + +#ifndef _SEC_TCLM_H_ +#define _SEC_TCLM_H_ + +#include +#include +#include +#include +#include +#include + +/* TCLM_CONCEPT - start */ +#define TCLM_LEVEL_NONE 0x00 +#define TCLM_LEVEL_CLEAR_NV 0x01 +#define TCLM_LEVEL_LOCKDOWN 0x02 +#define TCLM_LEVEL_EVERYTIME 0x05 +#define TCLM_LEVEL_NOT_SUPPORT 0xFF + +#define CAL_HISTORY_QUEUE_MAX 10 +#define CAL_HISTORY_QUEUE_SHORT_DISPLAY 3 + +#define TCLM_AMBIENT_CAL 0 +#define TCLM_OFFSET_CAL_SDC 1 +#define TCLM_OFFSET_CAL_SEC 2 + +#define SEC_TCLM_NVM_OFFSET 1 +#define SEC_TCLM_NVM_OFFSET_LENGTH 4 +/* [0]: tclm_level, [1] afe_base_high, [2] afe_base_low = 3byte */ + +#define SEC_CAL_PASS 1 + +enum tclm_offset { + SEC_TCLM_NVM_OFFSET_IC_FIRMWARE_VER = 1, + SEC_TCLM_NVM_ALL_DATA = 2, + SEC_TCLM_NVM_TEST = 3, +}; + +#define CAL_POS_CMD(full_name, short_name) .f_name = full_name, .s_name = short_name + +enum tclm_root { + CALPOSITION_NONE = 0, + CALPOSITION_INITIAL = 1, + CALPOSITION_FACTORY = 2, + CALPOSITION_OUTSIDE = 3, + CALPOSITION_LCIA = 4, + CALPOSITION_SVCCENTER = 5, + CALPOSITION_ABNORMAL = 6, + CALPOSITION_FIRMUP = 7, + CALPOSITION_SPECOUT = 8, + CALPOSITION_TUNEUP = 9, + CALPOSITION_EVERYTIME = 10, + CALPOSITION_TESTMODE = 11, + CALPOSITION_UNDEFINE = 12, + CALPOSITION_MAX = 16, +}; + +enum tclm_result { + TCLM_RESULT_DONE = 0, + TCLM_RESULT_ABNORMAL = 1, + TCLM_RESULT_CAL_DONE = 2, +}; + +struct sec_cal_position { + const char *f_name; + const char s_name; +}; + +struct sec_tclm_nvdata { + u8 cal_count; + u16 tune_fix_ver; + u8 cal_position; + u8 cal_pos_hist_cnt; + u8 cal_pos_hist_lastp; + u8 cal_pos_hist_queue[2 * CAL_HISTORY_QUEUE_MAX]; + u8 cal_fail_falg; /* pass : 1 fail : etc */ + u8 cal_fail_cnt; /* history cnt */ +} __attribute__ ((packed)); + +/* TCLM_CONCEPT - end */ +struct sec_tclm_data { + int tclm_level; + int afe_base; + bool external_factory; + u8 root_of_calibration; + struct sec_cal_position *tclm_string; + u8 cal_pos_hist_last3[2 * CAL_HISTORY_QUEUE_SHORT_DISPLAY + 1]; /* 7 */ + struct i2c_client *client; + int (*tclm_read)(struct i2c_client *client, int address); + int (*tclm_write)(struct i2c_client *client, int address); + int (*tclm_execute_force_calibration)(struct i2c_client *client, int cal_mode); + void (*tclm_parse_dt)(struct device *dev, struct sec_tclm_data *tdata); + struct spi_device *spi; + int (*tclm_read_spi)(struct spi_device *spi, int address); + int (*tclm_write_spi)(struct spi_device *spit, int address); + int (*tclm_execute_force_calibration_spi)(struct spi_device *spi, int cal_mode); + void (*tclm_parse_dt_dev)(struct device *dev, struct sec_tclm_data *tdata); + + struct sec_tclm_nvdata nvdata; + u8 tclm[SEC_TCLM_NVM_OFFSET_LENGTH]; + bool support_tclm_test; +}; + +void sec_tclm_case(struct sec_tclm_data *data, int tclm_case); +int sec_tclm_get_nvm_all(struct sec_tclm_data *data); +void sec_tclm_position_history(struct sec_tclm_data *data); +void sec_tclm_root_of_cal(struct sec_tclm_data *data, int pos); +void sec_tclm_debug_info(struct sec_tclm_data *data); +void sec_tclm_reposition_history(struct sec_tclm_data *data); +int sec_execute_tclm_package(struct sec_tclm_data *data, int factory_mode); +int sec_tclm_check_cal_case(struct sec_tclm_data *data); +void sec_tclm_initialize(struct sec_tclm_data *data); +int tclm_test_command(struct sec_tclm_data *data, int test_case, int cmd_param1, int cmd_param2, char *buff); +int sec_tclm_test_on_probe(struct sec_tclm_data *data); + +#endif diff --git a/drivers/input/sec_input/sec_tsp_dumpkey.c b/drivers/input/sec_input/sec_tsp_dumpkey.c new file mode 100755 index 000000000000..410975995acb --- /dev/null +++ b/drivers/input/sec_input/sec_tsp_dumpkey.c @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * + * Samsung TN debugging code + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include + +#include "sec_input.h" +#include "sec_tsp_dumpkey.h" + +static DEFINE_SPINLOCK(sec_tsp_dumpkey_event_lock); +static atomic_t sec_tsp_dumpkey_acceptable_event[KEY_MAX] __read_mostly; + +#ifndef ARRAYSIZE +#define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0])) +#endif + +/* Input sequence 9530 */ +#define DUMP_COUNT_FIRST 3 +#define DUMP_COUNT_SECOND 3 +#define DUMP_COUNT_THIRD 3 + +#define KEY_STATE_DOWN 1 +#define KEY_STATE_UP 0 + +struct tsp_dump_callbacks dump_callbacks; +EXPORT_SYMBOL(dump_callbacks); + +extern struct device *ptsp; + +static unsigned int __tsp_dump_keys[] = { + KEY_POWER, + KEY_VOLUMEUP, + KEY_VOLUMEDOWN, + KEY_HOMEPAGE, + KEY_HOT, + KEY_EMERGENCY +}; + +struct dump_key { + unsigned int key_code; + unsigned int dump_count; +}; + +struct dump_key tsp_dump_key_combination[] = { + {KEY_VOLUMEDOWN, DUMP_COUNT_FIRST}, + {KEY_POWER, DUMP_COUNT_SECOND}, + {KEY_VOLUMEDOWN, DUMP_COUNT_THIRD}, +}; + +struct tsp_dump_key_state { + unsigned int key_code; + unsigned int state; +}; + +struct tsp_dump_key_state tsp_dump_key_states[] = { + {KEY_VOLUMEDOWN, KEY_STATE_UP}, + {KEY_VOLUMEUP, KEY_STATE_UP}, + {KEY_POWER, KEY_STATE_UP}, + {KEY_HOMEPAGE, KEY_STATE_UP}, + {KEY_HOT, KEY_STATE_UP}, + {KEY_EMERGENCY, KEY_STATE_UP}, +}; + +static unsigned int hold_key = KEY_VOLUMEUP; +static unsigned int hold_key_hold = KEY_STATE_UP; +static unsigned int check_count; +static unsigned int check_step; + +static int is_hold_key(unsigned int code) +{ + return (code == hold_key); +} + +static void set_hold_key_hold(int state) +{ + hold_key_hold = state; +} + +static unsigned int is_hold_key_hold(void) +{ + return hold_key_hold; +} + +static unsigned int get_current_step_key_code(void) +{ + return tsp_dump_key_combination[check_step].key_code; +} + +static int is_key_matched_for_current_step(unsigned int code) +{ + return (code == get_current_step_key_code()); +} + +static int is_dump_keys(unsigned int code) +{ + unsigned long i; + + for (i = 0; i < ARRAY_SIZE(tsp_dump_key_states); i++) + if (tsp_dump_key_states[i].key_code == code) + return 1; + return 0; +} + +static int get_count_for_next_step(void) +{ + int i; + int count = 0; + + for (i = 0; i < check_step + 1; i++) + count += tsp_dump_key_combination[i].dump_count; + return count; +} + +static int is_reaching_count_for_next_step(void) +{ + return (check_count == get_count_for_next_step()); +} + +static int get_count_for_dump(void) +{ + unsigned long i; + int count = 0; + + for (i = 0; i < ARRAY_SIZE(tsp_dump_key_combination); i++) + count += tsp_dump_key_combination[i].dump_count; + return count - 1; +} + +static unsigned int is_key_state_down(unsigned int code) +{ + unsigned long i; + + if (is_hold_key(code)) + return is_hold_key_hold(); + + for (i = 0; i < ARRAY_SIZE(tsp_dump_key_states); i++) + if (tsp_dump_key_states[i].key_code == code) + return tsp_dump_key_states[i].state == KEY_STATE_DOWN; + return 0; +} + +static void set_key_state_down(unsigned int code) +{ + unsigned long i; + + if (is_hold_key(code)) + set_hold_key_hold(KEY_STATE_DOWN); + + for (i = 0; i < ARRAY_SIZE(tsp_dump_key_states); i++) + if (tsp_dump_key_states[i].key_code == code) + tsp_dump_key_states[i].state = KEY_STATE_DOWN; +} + +static void set_key_state_up(unsigned int code) +{ + unsigned long i; + + if (is_hold_key(code)) + set_hold_key_hold(KEY_STATE_UP); + + for (i = 0; i < ARRAY_SIZE(tsp_dump_key_states); i++) + if (tsp_dump_key_states[i].key_code == code) + tsp_dump_key_states[i].state = KEY_STATE_UP; +} + +static void increase_step(void) +{ + if (check_step < ARRAY_SIZE(tsp_dump_key_combination)) + check_step++; + else if (dump_callbacks.inform_dump) + dump_callbacks.inform_dump(ptsp); +} + +static void reset_step(void) +{ + check_step = 0; +} + +static void increase_count(void) +{ + if (check_count < get_count_for_dump()) + check_count++; + else if (dump_callbacks.inform_dump) + dump_callbacks.inform_dump(ptsp); +} + +static void reset_count(void) +{ + check_count = 0; +} + +static void check_tsp_dump_keys(struct sec_tsp_dumpkey_param *param) +{ + unsigned int code = param->keycode; + int state = param->down; + + if (!is_dump_keys(code)) + return; + + if (state == KEY_STATE_DOWN) { + /* Duplicated input */ + if (is_key_state_down(code)) + return; + set_key_state_down(code); + + if (is_hold_key(code)) { + set_hold_key_hold(KEY_STATE_DOWN); + return; + } + if (is_hold_key_hold()) { + if (is_key_matched_for_current_step(code)) { + increase_count(); + } else { + reset_count(); + reset_step(); + } + if (is_reaching_count_for_next_step()) + increase_step(); + } + + } else { + set_key_state_up(code); + if (is_hold_key(code)) { + set_hold_key_hold(KEY_STATE_UP); + reset_step(); + reset_count(); + } + } + +} + +static void inline update_acceptable_event(unsigned int event_code, bool is_add) +{ + if (is_add) + atomic_inc(&(sec_tsp_dumpkey_acceptable_event[event_code])); + else + atomic_dec(&(sec_tsp_dumpkey_acceptable_event[event_code])); +} + +static inline bool is_event_supported(unsigned int event_type, + unsigned int event_code) +{ + bool ret; + + if (event_type != EV_KEY || event_code >= KEY_MAX) + return false; + + ret = !!atomic_read(&(sec_tsp_dumpkey_acceptable_event[event_code])); + + return ret; +} + +static void sec_tsp_dumpkey_event(struct input_handle *handle, unsigned int event_type, + unsigned int event_code, int value) +{ + struct sec_tsp_dumpkey_param param = { + .keycode = event_code, + .down = value, + }; + + if (!is_event_supported(event_type, event_code)) + return; + + pr_info("%s key_event: %u, %d\n", SECLOG, event_code, value); + + spin_lock(&sec_tsp_dumpkey_event_lock); + + check_tsp_dump_keys(¶m); + + spin_unlock(&sec_tsp_dumpkey_event_lock); +} + +static int sec_tsp_dumpkey_connect(struct input_handler *handler, struct input_dev *dev, + const struct input_device_id *id) +{ + struct input_handle *handle; + int error; + + handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL); + if (!handle) + return -ENOMEM; + + handle->dev = dev; + handle->handler = handler; + handle->name = "sec_tsp_dumpkey"; + + error = input_register_handle(handle); + if (error) + goto err_free_handle; + + error = input_open_device(handle); + if (error) + goto err_unregister_handle; + + return 0; + +err_unregister_handle: + input_unregister_handle(handle); +err_free_handle: + kfree(handle); + return error; +} + +static void sec_tsp_dumpkey_disconnect(struct input_handle *handle) +{ + input_close_device(handle); + input_unregister_handle(handle); + kfree(handle); +} + +static const struct input_device_id sec_tsp_dumpkey_ids[] = { + { + .flags = INPUT_DEVICE_ID_MATCH_EVBIT, + .evbit = { BIT_MASK(EV_KEY) }, + }, + {}, +}; + +static struct input_handler sec_tsp_dumpkey_handler = { + .event = sec_tsp_dumpkey_event, + .connect = sec_tsp_dumpkey_connect, + .disconnect = sec_tsp_dumpkey_disconnect, + .name = "sec_tsp_dumpkey", + .id_table = sec_tsp_dumpkey_ids, +}; + +static int __init sec_tsp_dumpkey_init(void) +{ + int err; + size_t i; + + pr_info("%s %s\n", SECLOG, __func__); + + for (i = 0; i < KEY_MAX; i++) + atomic_set(&(sec_tsp_dumpkey_acceptable_event[i]), 0); + + for (i = 0; i < ARRAY_SIZE(__tsp_dump_keys); i++) + update_acceptable_event(__tsp_dump_keys[i], true); + + spin_lock_init(&sec_tsp_dumpkey_event_lock); + + err = input_register_handler(&sec_tsp_dumpkey_handler); + + return err; + +} + +static void __exit sec_tsp_dumpkey_exit(void) +{ + input_unregister_handler(&sec_tsp_dumpkey_handler); +} + +module_init(sec_tsp_dumpkey_init); +module_exit(sec_tsp_dumpkey_exit); + +MODULE_DESCRIPTION("Samsung tsp dumpkey driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/sec_input/sec_tsp_dumpkey.h b/drivers/input/sec_input/sec_tsp_dumpkey.h new file mode 100755 index 000000000000..4ae3547fdde9 --- /dev/null +++ b/drivers/input/sec_input/sec_tsp_dumpkey.h @@ -0,0 +1,11 @@ +#ifndef __SEC_TSP_DUMPKEY_H__ +#define __SEC_TSP_DUMPKEY_H__ +struct sec_tsp_dumpkey_param { + unsigned int keycode; + int down; +}; + +struct tsp_dump_callbacks { + void (*inform_dump)(struct device *dev); +}; +#endif /* __SEC_TSP_DUMPKEY_H__ */ diff --git a/drivers/input/sec_input/sec_tsp_log.c b/drivers/input/sec_input/sec_tsp_log.c new file mode 100755 index 000000000000..874ad93a5539 --- /dev/null +++ b/drivers/input/sec_input/sec_tsp_log.c @@ -0,0 +1,689 @@ +/* + * sec_tsp_log.c + * + * driver supporting debug functions for Samsung touch device + * + * COPYRIGHT(C) Samsung Electronics Co., Ltd. 2006-2011 All Right Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "sec_input.h" +#include "sec_tsp_log.h" + +static int sec_tsp_log_index; +static int sec_tsp_log_index_fix; +static int sec_tsp_log_index_full; +static char *sec_tsp_log_buf; +static unsigned int sec_tsp_log_size; + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +static int sec_tsp_raw_data_index_main; +static int sec_tsp_raw_data_index_sub; +static char *sec_tsp_raw_data_buf; +static unsigned int sec_tsp_raw_data_size; +#else +static int sec_tsp_raw_data_index; +static int sec_tsp_raw_data_index_full; +static char *sec_tsp_raw_data_buf; +static unsigned int sec_tsp_raw_data_size; +#endif + +static int sec_tsp_command_history_index; +static int sec_tsp_command_history_index_full; +static char *sec_tsp_command_history_buf; +static unsigned int sec_tsp_command_history_size; + +/* Sponge Infinite dump */ +static int sec_tsp_sponge_log_index; +static int sec_tsp_sponge_log_index_full; +static char *sec_tsp_sponge_log_buf; +static unsigned int sec_tsp_sponge_log_size; + +static struct mutex tsp_log_mutex; + +void sec_tsp_sponge_log(char *buf) +{ + int len = 0; + unsigned int idx; + size_t size, total_size; + + /* In case of sec_tsp_log_setup is failed */ + if (!sec_tsp_sponge_log_size || !sec_tsp_sponge_log_buf) + return; + + mutex_lock(&tsp_log_mutex); + idx = sec_tsp_sponge_log_index; + size = strlen(buf); + total_size = size + SEC_TSP_LOG_EXTRA_SIZE; + + /* Overflow buffer size */ + if (idx + total_size >= sec_tsp_sponge_log_size) { + len = scnprintf(&sec_tsp_sponge_log_buf[0], total_size, "%s ", buf); + sec_tsp_sponge_log_index_full = sec_tsp_sponge_log_index; + sec_tsp_sponge_log_index = len; + } else { + len = scnprintf(&sec_tsp_sponge_log_buf[idx], total_size, "%s ", buf); + sec_tsp_sponge_log_index += len; + sec_tsp_sponge_log_index_full = max(sec_tsp_sponge_log_index, sec_tsp_sponge_log_index_full); + } + mutex_unlock(&tsp_log_mutex); +} +EXPORT_SYMBOL(sec_tsp_sponge_log); + +static ssize_t sec_tsp_sponge_log_read(struct file *file, char __user *buf, + size_t len, loff_t *offset) +{ + loff_t pos = *offset; + ssize_t count; + + if (!sec_tsp_sponge_log_buf) + return 0; + + if (pos >= sec_tsp_sponge_log_index_full) + return 0; + + count = min_t(size_t, len, sec_tsp_sponge_log_index_full - pos); + if (copy_to_user(buf, sec_tsp_sponge_log_buf + pos, count)) + return -EFAULT; + + *offset += count; + return count; +} + +static size_t sec_tsp_log_timestamp(unsigned long idx, char *tbuf) +{ + /* Add the current time stamp */ + unsigned long long t; + unsigned long nanosec_rem; + + t = local_clock(); + nanosec_rem = do_div(t, 1000000000); + + snprintf(tbuf, SEC_TSP_LOG_TIMESTAMP_SIZE, "[%5lu.%06lu] ", (unsigned long)t, nanosec_rem / 1000); + + return strlen(tbuf); +} + +#define TSP_BUF_SIZE 512 +void sec_debug_tsp_log(char *fmt, ...) +{ + va_list args; + char buf[TSP_BUF_SIZE]; + char tbuf[SEC_TSP_LOG_TIMESTAMP_SIZE]; + int len = 0; + unsigned int idx; + unsigned long size; + size_t time_size, total_size; + + /* In case of sec_tsp_log_setup is failed */ + if (!sec_tsp_log_size) + return; + + mutex_lock(&tsp_log_mutex); + va_start(args, fmt); + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + + idx = sec_tsp_log_index; + size = strlen(buf); + time_size = sec_tsp_log_timestamp(idx, tbuf); + total_size = size + time_size + SEC_TSP_LOG_EXTRA_SIZE; + + /* Overflow buffer size */ + if (idx + total_size >= sec_tsp_log_size) { + if (sec_tsp_log_index_fix + total_size >= sec_tsp_log_size) { + mutex_unlock(&tsp_log_mutex); + return; + } + len = scnprintf(&sec_tsp_log_buf[sec_tsp_log_index_fix], total_size, "%s%s\n", tbuf, buf); + sec_tsp_log_index_full = sec_tsp_log_index; + sec_tsp_log_index = sec_tsp_log_index_fix + len; + } else { + len = scnprintf(&sec_tsp_log_buf[idx], total_size, "%s%s\n", tbuf, buf); + sec_tsp_log_index += len; + sec_tsp_log_index_full = max(sec_tsp_log_index_full, sec_tsp_log_index); + } + mutex_unlock(&tsp_log_mutex); +} +EXPORT_SYMBOL(sec_debug_tsp_log); + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +void sec_debug_tsp_raw_data(char *fmt, ...) +{ +} +EXPORT_SYMBOL(sec_debug_tsp_raw_data); +#else +void sec_debug_tsp_raw_data(char *fmt, ...) +{ + va_list args; + char buf[TSP_BUF_SIZE]; + char tbuf[SEC_TSP_LOG_TIMESTAMP_SIZE]; + int len = 0; + unsigned int idx; + unsigned long size; + size_t time_size, total_size; + + /* In case of sec_tsp_log_setup is failed */ + if (!sec_tsp_raw_data_size || !sec_tsp_raw_data_buf) + return; + + mutex_lock(&tsp_log_mutex); + va_start(args, fmt); + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + + idx = sec_tsp_raw_data_index; + size = strlen(buf); + time_size = sec_tsp_log_timestamp(idx, tbuf); + total_size = size + time_size + SEC_TSP_LOG_EXTRA_SIZE; + + /* Overflow buffer size */ + if (idx + total_size >= sec_tsp_raw_data_size) { + len = scnprintf(&sec_tsp_raw_data_buf[0], total_size, "%s%s\n", tbuf, buf); + sec_tsp_raw_data_index_full = sec_tsp_raw_data_index; + sec_tsp_raw_data_index = len; + } else { + len = scnprintf(&sec_tsp_raw_data_buf[idx], total_size, "%s%s\n", tbuf, buf); + sec_tsp_raw_data_index += len; + sec_tsp_raw_data_index_full = max(sec_tsp_raw_data_index, sec_tsp_raw_data_index_full); + } + mutex_unlock(&tsp_log_mutex); +} +EXPORT_SYMBOL(sec_debug_tsp_raw_data); +#endif + +void sec_debug_tsp_log_msg(char *msg, char *fmt, ...) +{ + va_list args; + char buf[TSP_BUF_SIZE]; + char tbuf[SEC_TSP_LOG_TIMESTAMP_SIZE]; + int len = 0; + unsigned int idx; + size_t size, size_dev_name, time_size, total_size; + + /* In case of sec_tsp_log_setup is failed */ + if (!sec_tsp_log_size) + return; + + mutex_lock(&tsp_log_mutex); + va_start(args, fmt); + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + + idx = sec_tsp_log_index; + size = strlen(buf); + size_dev_name = strlen(msg); + time_size = sec_tsp_log_timestamp(idx, tbuf); + total_size = size + size_dev_name + time_size + SEC_TSP_LOG_EXTRA_SIZE; + + /* Overflow buffer size */ + if (idx + total_size >= sec_tsp_log_size) { + if (sec_tsp_log_index_fix + total_size >= sec_tsp_log_size) { + mutex_unlock(&tsp_log_mutex); + return; + } + len = scnprintf(&sec_tsp_log_buf[sec_tsp_log_index_fix], total_size, "%s%s : %s", tbuf, msg, buf); + sec_tsp_log_index_full = sec_tsp_log_index; + sec_tsp_log_index = sec_tsp_log_index_fix + len; + } else { + len = scnprintf(&sec_tsp_log_buf[idx], total_size, "%s%s : %s", tbuf, msg, buf); + sec_tsp_log_index += len; + sec_tsp_log_index_full = max(sec_tsp_log_index_full, sec_tsp_log_index); + } + mutex_unlock(&tsp_log_mutex); +} +EXPORT_SYMBOL(sec_debug_tsp_log_msg); + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +void sec_debug_tsp_raw_data_msg(char mode, char *msg, char *fmt, ...) +{ + va_list args; + char buf[TSP_BUF_SIZE]; + char tbuf[SEC_TSP_LOG_TIMESTAMP_SIZE]; + int len = 0; + unsigned int idx; + size_t size, size_dev_name, time_size, total_size; + + /* In case of sec_tsp_log_setup is failed */ + if (!sec_tsp_raw_data_size || !sec_tsp_raw_data_buf) + return; + + mutex_lock(&tsp_log_mutex); + va_start(args, fmt); + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + + if (mode == MAIN_TOUCH) { + idx = sec_tsp_raw_data_index_main; + } else if (mode == SUB_TOUCH) { + idx = sec_tsp_raw_data_index_sub; + } else { + mutex_unlock(&tsp_log_mutex); + return; + } + + size = strlen(buf); + size_dev_name = strlen(msg); + time_size = sec_tsp_log_timestamp(idx, tbuf); + total_size = size + size_dev_name + time_size + SEC_TSP_LOG_EXTRA_SIZE; + + if (mode == MAIN_TOUCH) { + /* Overflow buffer size */ + if (idx + total_size >= (sec_tsp_raw_data_size / 2)) { + len = scnprintf(&sec_tsp_raw_data_buf[0], total_size, "%s%s : %s", tbuf, msg, buf); + sec_tsp_raw_data_index_main = len; + } else { + len = scnprintf(&sec_tsp_raw_data_buf[idx], total_size, "%s%s : %s", tbuf, msg, buf); + sec_tsp_raw_data_index_main += len; + } + } else if (mode == SUB_TOUCH) { + /* Overflow buffer size */ + if (idx + total_size >= sec_tsp_raw_data_size) { + len = scnprintf(&sec_tsp_raw_data_buf[sec_tsp_raw_data_size / 2], + total_size, "%s%s : %s", tbuf, msg, buf); + sec_tsp_raw_data_index_sub = sec_tsp_raw_data_size / 2 + len; + } else { + len = scnprintf(&sec_tsp_raw_data_buf[idx], total_size, "%s%s : %s", tbuf, msg, buf); + sec_tsp_raw_data_index_sub += len; + } + } + mutex_unlock(&tsp_log_mutex); +} +EXPORT_SYMBOL(sec_debug_tsp_raw_data_msg); +#else +void sec_debug_tsp_raw_data_msg(char *msg, char *fmt, ...) +{ + va_list args; + char buf[TSP_BUF_SIZE]; + char tbuf[SEC_TSP_LOG_TIMESTAMP_SIZE]; + int len = 0; + unsigned int idx; + size_t size, size_dev_name, time_size, total_size; + + /* In case of sec_tsp_log_setup is failed */ + if (!sec_tsp_raw_data_size || !sec_tsp_raw_data_buf) + return; + + mutex_lock(&tsp_log_mutex); + va_start(args, fmt); + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + + idx = sec_tsp_raw_data_index; + size = strlen(buf); + size_dev_name = strlen(msg); + time_size = sec_tsp_log_timestamp(idx, tbuf); + total_size = size + size_dev_name + time_size + SEC_TSP_LOG_EXTRA_SIZE; + + /* Overflow buffer size */ + if (idx + total_size >= sec_tsp_raw_data_size) { + len = scnprintf(&sec_tsp_raw_data_buf[0], total_size, "%s%s : %s", tbuf, msg, buf); + sec_tsp_raw_data_index_full = sec_tsp_raw_data_index; + sec_tsp_raw_data_index = len; + } else { + len = scnprintf(&sec_tsp_raw_data_buf[idx], total_size, "%s%s : %s", tbuf, msg, buf); + sec_tsp_raw_data_index += len; + sec_tsp_raw_data_index_full = max(sec_tsp_raw_data_index, sec_tsp_raw_data_index_full); + } + mutex_unlock(&tsp_log_mutex); +} +EXPORT_SYMBOL(sec_debug_tsp_raw_data_msg); +#endif + +void sec_debug_tsp_command_history(char *buf) +{ + int len = 0; + unsigned int idx; + size_t size, total_size; + + /* In case of sec_tsp_log_setup is failed */ + if (!sec_tsp_command_history_size || !sec_tsp_command_history_buf) + return; + + mutex_lock(&tsp_log_mutex); + idx = sec_tsp_command_history_index; + size = strlen(buf); + total_size = size + SEC_TSP_LOG_EXTRA_SIZE; + + /* Overflow buffer size */ + if (idx + total_size >= sec_tsp_command_history_size) { + len = scnprintf(&sec_tsp_command_history_buf[0], total_size, "%s ", buf); + sec_tsp_command_history_index_full = sec_tsp_command_history_index; + sec_tsp_command_history_index = len; + } else { + len = scnprintf(&sec_tsp_command_history_buf[idx], total_size, "%s ", buf); + sec_tsp_command_history_index += len; + sec_tsp_command_history_index_full = max(sec_tsp_command_history_index, + sec_tsp_command_history_index_full); + } + mutex_unlock(&tsp_log_mutex); +} +EXPORT_SYMBOL(sec_debug_tsp_command_history); + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +void sec_tsp_raw_data_clear(char mode) +{ + if (!sec_tsp_raw_data_size || !sec_tsp_raw_data_buf) + return; + + mutex_lock(&tsp_log_mutex); + if (mode == MAIN_TOUCH) { + sec_tsp_raw_data_index_main = 0; + memset(sec_tsp_raw_data_buf, 0x00, sec_tsp_raw_data_size / 2); + } else if (mode == SUB_TOUCH) { + sec_tsp_raw_data_index_sub = sec_tsp_raw_data_size / 2; + memset(sec_tsp_raw_data_buf + sec_tsp_raw_data_index_sub, 0x00, sec_tsp_raw_data_size / 2); + } + mutex_unlock(&tsp_log_mutex); +} +EXPORT_SYMBOL(sec_tsp_raw_data_clear); +#else +void sec_tsp_raw_data_clear(void) +{ + if (!sec_tsp_raw_data_size || !sec_tsp_raw_data_buf) + return; + + mutex_lock(&tsp_log_mutex); + sec_tsp_raw_data_index = 0; + sec_tsp_raw_data_index_full = 0; + memset(sec_tsp_raw_data_buf, 0x00, sec_tsp_raw_data_size); + mutex_unlock(&tsp_log_mutex); +} +EXPORT_SYMBOL(sec_tsp_raw_data_clear); +#endif + +void sec_tsp_log_fix(void) +{ + char *buf = "FIX LOG!\n"; + char tbuf[SEC_TSP_LOG_TIMESTAMP_SIZE]; + int len = 0; + unsigned int idx; + size_t size, time_size, total_size; + + /* In case of sec_tsp_log_setup is failed */ + if (!sec_tsp_log_size) + return; + + mutex_lock(&tsp_log_mutex); + idx = sec_tsp_log_index; + size = strlen(buf); + time_size = sec_tsp_log_timestamp(idx, tbuf); + total_size = size + time_size + SEC_TSP_LOG_EXTRA_SIZE; + + /* Overflow buffer size */ + if (idx + total_size >= sec_tsp_log_size) { + if (sec_tsp_log_index_fix + total_size >= sec_tsp_log_size) { + mutex_unlock(&tsp_log_mutex); + return; + } + len = scnprintf(&sec_tsp_log_buf[sec_tsp_log_index_fix], total_size, "%s%s", tbuf, buf); + sec_tsp_log_index = sec_tsp_log_index_fix + len; + } else { + len = scnprintf(&sec_tsp_log_buf[idx], total_size, "%s%s", tbuf, buf); + sec_tsp_log_index += len; + } + sec_tsp_log_index_fix = sec_tsp_log_index; + sec_tsp_log_index_full = max(sec_tsp_log_index_full, sec_tsp_log_index); + mutex_unlock(&tsp_log_mutex); +} +EXPORT_SYMBOL(sec_tsp_log_fix); + +static ssize_t sec_tsp_log_write(struct file *file, + const char __user *buf, + size_t count, loff_t *ppos) +{ + char *page = NULL; + ssize_t ret; + int new_value; + + if (!sec_tsp_log_buf) + return 0; + + ret = -EINVAL; + if (count >= PAGE_SIZE) + return ret; + + ret = -ENOMEM; + page = (char *)get_zeroed_page(GFP_KERNEL | __GFP_COMP); + if (!page) + return ret; + + ret = -EFAULT; + if (copy_from_user(page, buf, count)) + goto out; + + ret = -EINVAL; + if (sscanf(page, "%u", &new_value) != 1) { + pr_info("%s %s\n", SECLOG, page); + /* print tsp_log to sec_tsp_log_buf */ + sec_debug_tsp_log("%s", page); + } + ret = count; +out: + free_page((unsigned long)page); + return ret; +} + +static ssize_t sec_tsp_raw_data_write(struct file *file, + const char __user *buf, + size_t count, loff_t *ppos) +{ + char *page = NULL; + ssize_t ret; + int new_value; + + if (!sec_tsp_raw_data_buf) + return 0; + + ret = -EINVAL; + if (count >= PAGE_SIZE) + return ret; + + ret = -ENOMEM; + page = (char *)get_zeroed_page(GFP_KERNEL | __GFP_COMP); + if (!page) + return ret; + + ret = -EFAULT; + if (copy_from_user(page, buf, count)) + goto out; + + ret = -EINVAL; + if (sscanf(page, "%u", &new_value) != 1) { + pr_info("%s %s\n", SECLOG, page); + sec_debug_tsp_raw_data("%s", page); + } + ret = count; +out: + free_page((unsigned long)page); + return ret; +} + +static ssize_t sec_tsp_log_read(struct file *file, char __user *buf, + size_t len, loff_t *offset) +{ + loff_t pos = *offset; + ssize_t count; + + if (!sec_tsp_log_buf) + return 0; + + if (pos >= sec_tsp_log_index_full) + return 0; + + count = min_t(size_t, len, sec_tsp_log_index_full - pos); + if (copy_to_user(buf, sec_tsp_log_buf + pos, count)) + return -EFAULT; + + *offset += count; + return count; +} + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +static ssize_t sec_tsp_raw_data_read(struct file *file, char __user *buf, + size_t len, loff_t *offset) +{ + loff_t pos = *offset; + ssize_t count; + int pos_range; + + if (!sec_tsp_raw_data_buf) + return 0; + + pos_range = sec_tsp_raw_data_index_main + (sec_tsp_raw_data_index_sub - (sec_tsp_raw_data_size / 2)); + if (pos_range < 0) + return 0; + if (pos >= pos_range) + return 0; + + if (pos < sec_tsp_raw_data_index_main) { + count = min_t(size_t, len, sec_tsp_raw_data_index_main - pos); + if (copy_to_user(buf, sec_tsp_raw_data_buf + pos, count)) + return -EFAULT; + } else { + count = min_t(size_t, len, sec_tsp_raw_data_index_sub - (sec_tsp_raw_data_size / 2) + - (pos - sec_tsp_raw_data_index_main)); + if (copy_to_user(buf, &sec_tsp_raw_data_buf[sec_tsp_raw_data_size / 2] + (pos - sec_tsp_raw_data_index_main), count)) + return -EFAULT; + } + + *offset += count; + return count; +} +#else +static ssize_t sec_tsp_raw_data_read(struct file *file, char __user *buf, + size_t len, loff_t *offset) +{ + loff_t pos = *offset; + ssize_t count; + + if (!sec_tsp_raw_data_buf) + return 0; + + if (pos >= sec_tsp_raw_data_index_full) + return 0; + + count = min_t(size_t, len, sec_tsp_raw_data_index_full - pos); + if (copy_to_user(buf, sec_tsp_raw_data_buf + pos, count)) + return -EFAULT; + + *offset += count; + return count; +} +#endif + +static ssize_t sec_tsp_command_history_read(struct file *file, char __user *buf, + size_t len, loff_t *offset) +{ + loff_t pos = *offset; + ssize_t count; + + if (!sec_tsp_command_history_buf) + return 0; + + if (pos >= sec_tsp_command_history_index_full) + return 0; + + count = min_t(size_t, len, sec_tsp_command_history_index_full - pos); + if (copy_to_user(buf, sec_tsp_command_history_buf + pos, count)) + return -EFAULT; + + *offset += count; + return count; +} + +static sec_input_proc_ops(THIS_MODULE, tsp_msg_file_ops, sec_tsp_log_read, sec_tsp_log_write); +static sec_input_proc_ops(THIS_MODULE, tsp_raw_data_file_ops, sec_tsp_raw_data_read, sec_tsp_raw_data_write); +static sec_input_proc_ops(THIS_MODULE, tsp_command_history_file_ops, sec_tsp_command_history_read, NULL); +static sec_input_proc_ops(THIS_MODULE, tsp_sponge_log_file_ops, sec_tsp_sponge_log_read, NULL); + +static int __init sec_tsp_log_init(void) +{ + struct proc_dir_entry *entry_tsp_msg, *entry_tsp_raw_data, *entry_tsp_cmd_hist, *entry_tsp_sponge_log; + char *vaddr_tsp_log, *vaddr_tsp_raw_data, *vaddr_tsp_command_history, *vaddr_tsp_sponge_log; + + pr_info("%s %s: init start\n", SECLOG, __func__); + + mutex_init(&tsp_log_mutex); + + sec_tsp_log_size = SEC_TSP_LOG_BUF_SIZE; + vaddr_tsp_log = kmalloc(sec_tsp_log_size, GFP_KERNEL | __GFP_COMP); + if (!vaddr_tsp_log) { + pr_info("%s %s: ERROR! vaddr_tsp_log alloc failed!\n", SECLOG, __func__); + } + sec_tsp_log_buf = vaddr_tsp_log; + + sec_tsp_raw_data_size = SEC_TSP_RAW_DATA_BUF_SIZE; + vaddr_tsp_raw_data = kmalloc(sec_tsp_raw_data_size, GFP_KERNEL | __GFP_COMP); + if (!vaddr_tsp_raw_data) { + pr_info("%s %s: ERROR! vaddr_tsp_raw_data alloc failed!\n", SECLOG, __func__); + } + sec_tsp_raw_data_buf = vaddr_tsp_raw_data; + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) + sec_tsp_raw_data_index_sub = (sec_tsp_raw_data_size / 2); +#endif + + sec_tsp_command_history_size = SEC_TSP_COMMAND_HISTORY_BUF_SIZE; + vaddr_tsp_command_history = kmalloc(sec_tsp_command_history_size, GFP_KERNEL | __GFP_COMP); + if (!vaddr_tsp_command_history) { + pr_info("%s %s: ERROR! vaddr_tsp_command_history alloc failed!\n", SECLOG, __func__); + } + sec_tsp_command_history_buf = vaddr_tsp_command_history; + + sec_tsp_sponge_log_size = SEC_TSP_SPONGE_LOG_BUF_SIZE; + vaddr_tsp_sponge_log = kmalloc(sec_tsp_sponge_log_size, GFP_KERNEL | __GFP_COMP); + if (!vaddr_tsp_sponge_log) { + pr_info("%s %s: ERROR! vaddr_tsp_sponge_log alloc failed!\n", SECLOG, __func__); + } + sec_tsp_sponge_log_buf = vaddr_tsp_sponge_log; + + if (sec_tsp_log_buf) { + entry_tsp_msg = proc_create("tsp_msg", S_IFREG | S_IRUSR | S_IRGRP, + NULL, &tsp_msg_file_ops); + if (!entry_tsp_msg) + pr_err("%s %s: failed to create proc entry of tsp_msg\n", SECLOG, __func__); + } + + if (sec_tsp_raw_data_buf) { + entry_tsp_raw_data = proc_create("tsp_raw_data", S_IFREG | 0444, + NULL, &tsp_raw_data_file_ops); + if (!entry_tsp_raw_data) + pr_err("%s %s: failed to create proc entry of tsp_raw_data\n", SECLOG, __func__); + } + + if (sec_tsp_command_history_buf) { + entry_tsp_cmd_hist = proc_create("tsp_cmd_hist", S_IFREG | 0444, + NULL, &tsp_command_history_file_ops); + if (!entry_tsp_cmd_hist) + pr_err("%s %s: failed to create proc entry of tsp_command_history\n", SECLOG, __func__); + } + + if (sec_tsp_sponge_log_buf) { + entry_tsp_sponge_log = proc_create("tsp_sponge_log", S_IFREG | 0444, + NULL, &tsp_sponge_log_file_ops); + if (!entry_tsp_sponge_log) + pr_err("%s %s: failed to create proc entry of tsp_sponge_log\n", SECLOG, __func__); + } + + pr_info("%s %s: init done\n", SECLOG, __func__); + + return 0; +} +fs_initcall(sec_tsp_log_init); /* earlier than device_initcall */ + +MODULE_DESCRIPTION("Samsung debug sysfs for Input module"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/sec_input/sec_tsp_log.h b/drivers/input/sec_input/sec_tsp_log.h new file mode 100755 index 000000000000..369d1e320978 --- /dev/null +++ b/drivers/input/sec_input/sec_tsp_log.h @@ -0,0 +1,49 @@ + +#ifndef _SEC_TSP_LOG_H_ +#define _SEC_TSP_LOG_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SEC_TSP_LOG_BUF_SIZE (256 * 1024) /* 256 KB */ +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +#define SEC_TSP_RAW_DATA_BUF_SIZE (2 * 50 * 1024) /* 100 KB */ +#else +#define SEC_TSP_RAW_DATA_BUF_SIZE (50 * 1024) /* 50 KB */ +#endif +#define SEC_TSP_COMMAND_HISTORY_BUF_SIZE (10 * 1024) /* 10 KB */ +#define SEC_TSP_SPONGE_LOG_BUF_SIZE (128 * 1024) /* 128 KB */ + +#define SEC_TSP_LOG_TIMESTAMP_SIZE 50 +#define SEC_TSP_LOG_EXTRA_SIZE 10 + +/** + * sec_debug_tsp_log : Leave tsp log in tsp_msg file. + * ( Timestamp + Tsp logs ) + * sec_debug_tsp_log_msg : Leave tsp log in tsp_msg file and + * add additional message between timestamp and tsp log. + * ( Timestamp + additional Message + Tsp logs ) + */ +void sec_tsp_sponge_log(char *buf); +void sec_debug_tsp_log(char *fmt, ...); +void sec_debug_tsp_log_msg(char *msg, char *fmt, ...); +void sec_tsp_log_fix(void); +void sec_debug_tsp_raw_data(char *fmt, ...); + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUAL_FOLDABLE) +void sec_debug_tsp_raw_data_msg(char mode, char *msg, char *fmt, ...); +void sec_tsp_raw_data_clear(char mode); +#else +void sec_debug_tsp_raw_data_msg(char *msg, char *fmt, ...); +void sec_tsp_raw_data_clear(void); +#endif + +void sec_debug_tsp_command_history(char *buf); +#endif /* _SEC_TSP_LOG_H_ */ diff --git a/drivers/input/sec_input/sec_virtual_tsp.c b/drivers/input/sec_input/sec_virtual_tsp.c new file mode 100755 index 000000000000..81b794e81d0b --- /dev/null +++ b/drivers/input/sec_input/sec_virtual_tsp.c @@ -0,0 +1,435 @@ + +#include "sec_cmd.h" +#include "sec_input.h" +#include "sec_tsp_log.h" + +#if IS_ENABLED(CONFIG_HALL_NOTIFIER) +#include +static struct notifier_block hall_ic_nb; +#endif +#if IS_ENABLED(CONFIG_SUPPORT_SENSOR_FOLD) +#include +static struct notifier_block hall_ic_nb_ssh; +#endif + +static int flip_status; +static struct mutex switching_mutex; +static int fac_flip_status; + +static struct sec_cmd_data *dual_sec; + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUMP_MODE) +#include "sec_tsp_dumpkey.h" +extern struct tsp_dump_callbacks dump_callbacks; +struct tsp_dump_callbacks *tsp_callbacks; +EXPORT_SYMBOL(tsp_callbacks); +static struct tsp_dump_callbacks callbacks[DEV_COUNT]; + +static void sec_virtual_tsp_dump(struct device *dev) +{ + input_info(true, dual_sec->fac_dev, "%s: flip_status %s[%d]\n", __func__, + flip_status ? "close:sub_tsp" : "open:main_tsp", flip_status); + + if (flip_status == FLIP_STATUS_MAIN) { + if (callbacks[FLIP_STATUS_MAIN].inform_dump) + callbacks[FLIP_STATUS_MAIN].inform_dump(dual_sec->fac_dev); + } else if (flip_status == FLIP_STATUS_SUB) { + if (callbacks[FLIP_STATUS_SUB].inform_dump) + callbacks[FLIP_STATUS_SUB].inform_dump(dual_sec->fac_dev); + } +} +#endif + +static void sec_virtual_tsp_dual_cmd(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + + sec_cmd_virtual_tsp_write_cmd(sec, true, true); +} + +#if !IS_ENABLED(CONFIG_TOUCHSCREEN_STM_SUB) +static void sec_virtual_tsp_main_cmd(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + bool main = true; + bool sub = false; + + mutex_lock(&switching_mutex); + if (!((fac_flip_status == FLIP_STATUS_DEFAULT && flip_status == FLIP_STATUS_MAIN) + || fac_flip_status == FLIP_STATUS_MAIN)) { + input_err(true, sec->fac_dev, "%s: flip is sub, skip[%d,%d]\n", + __func__, fac_flip_status, flip_status); + main = false; + } + mutex_unlock(&switching_mutex); + + sec_cmd_virtual_tsp_write_cmd(sec, main, sub); +} +#endif + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_ZINITIX_ZTW522) +static void sec_virtual_tsp_sub_cmd(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + bool main = false; + bool sub = true; + + mutex_lock(&switching_mutex); + if (!((fac_flip_status == FLIP_STATUS_DEFAULT && flip_status == FLIP_STATUS_SUB) + || fac_flip_status == FLIP_STATUS_SUB)) { + input_err(true, sec->fac_dev, "%s: flip is main, skip[%d,%d]\n", + __func__, fac_flip_status, flip_status); + sub = false; + } + mutex_unlock(&switching_mutex); + + sec_cmd_virtual_tsp_write_cmd(sec, main, sub); +} +#endif + +static void sec_virtual_tsp_switch_cmd(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + bool main = false; + bool sub = false; + + mutex_lock(&switching_mutex); + if (fac_flip_status == FLIP_STATUS_DEFAULT) { + /* Using hall_ic */ + if (flip_status == FLIP_STATUS_MAIN) { + main = true; + } else if (flip_status == FLIP_STATUS_SUB) { + sub = true; + } + } else if (fac_flip_status == FLIP_STATUS_MAIN) { + main = true; + } else if (fac_flip_status == FLIP_STATUS_SUB) { + sub = true; + } + input_dbg(true, sec->fac_dev, "%s: %d,%d\n", __func__, fac_flip_status, flip_status); + mutex_unlock(&switching_mutex); + + sec_cmd_virtual_tsp_write_cmd(sec, main, sub); +} + +static void sec_virtual_tsp_factory_cmd_result_all(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + bool main = false; + bool sub = false; + + mutex_lock(&switching_mutex); + if (fac_flip_status == FLIP_STATUS_DEFAULT) { + /* Using hall_ic */ + if (flip_status == FLIP_STATUS_MAIN) { + main = true; + } else if (flip_status == FLIP_STATUS_SUB) { + sub = true; + } + } else if (fac_flip_status == FLIP_STATUS_MAIN) { + main = true; + } else if (fac_flip_status == FLIP_STATUS_SUB) { + sub = true; + } + input_dbg(true, sec->fac_dev, "%s: %d,%d\n", __func__, fac_flip_status, flip_status); + mutex_unlock(&switching_mutex); + + sec_cmd_virtual_tsp_write_cmd_factory_all(sec, main, sub); +} + +static void set_factory_panel(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + char buff[16] = { 0 }; + + sec_cmd_set_default_result(sec); + + if (sec->cmd_param[0] < FLIP_STATUS_DEFAULT || sec->cmd_param[0] > FLIP_STATUS_SUB) { + snprintf(buff, sizeof(buff), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto err; + } + + mutex_lock(&switching_mutex); + fac_flip_status = sec->cmd_param[0]; + input_err(true, sec->fac_dev, "%s: %d\n", __func__, fac_flip_status); + mutex_unlock(&switching_mutex); + + snprintf(buff, sizeof(buff), "%s", "OK"); + sec->cmd_state = SEC_CMD_STATUS_OK; + +err: + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} + +static void dev_count(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + char buff[16] = { 0 }; + + sec_cmd_set_default_result(sec); + + snprintf(buff, sizeof(buff), "%s,%d", "OK", DEV_COUNT); + sec->cmd_state = SEC_CMD_STATUS_OK; + + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} + +#if IS_ENABLED(CONFIG_HALL_NOTIFIER) +static int sec_virtual_tsp_hall_ic_notify(struct notifier_block *nb, + unsigned long flip_cover, void *v) +{ + struct hall_notifier_context *hall_notifier; + + hall_notifier = v; + + if (strncmp(hall_notifier->name, "flip", 4)) + return 0; + + input_info(true, dual_sec->fac_dev, "%s: %s\n", __func__, + flip_cover ? "close" : "open"); + + mutex_lock(&switching_mutex); + flip_status = flip_cover; + mutex_unlock(&switching_mutex); + + return 0; +} +#endif + +#if IS_ENABLED(CONFIG_SUPPORT_SENSOR_FOLD) +static int sec_virtual_tsp_hall_ic_ssh_notify(struct notifier_block *nb, + unsigned long flip_cover, void *v) +{ + input_info(true, dual_sec->fac_dev, "%s: %s\n", __func__, + flip_cover ? "close" : "open"); + + mutex_lock(&switching_mutex); + flip_status = flip_cover; + mutex_unlock(&switching_mutex); + + return 0; +} +#endif + +static struct sec_cmd tsp_commands[] = { + {SEC_CMD_H("glove_mode", sec_virtual_tsp_dual_cmd),}, + {SEC_CMD_H("set_wirelesscharger_mode", sec_virtual_tsp_dual_cmd),}, + {SEC_CMD_H("spay_enable", sec_virtual_tsp_dual_cmd),}, + {SEC_CMD_H("aot_enable", sec_virtual_tsp_dual_cmd),}, + {SEC_CMD_H("aod_enable", sec_virtual_tsp_dual_cmd),}, + {SEC_CMD_H("fod_enable", sec_virtual_tsp_dual_cmd),}, + {SEC_CMD("fod_lp_mode", sec_virtual_tsp_dual_cmd),}, + {SEC_CMD_H("external_noise_mode", sec_virtual_tsp_dual_cmd),}, + {SEC_CMD_H("brush_enable", sec_virtual_tsp_dual_cmd),}, + {SEC_CMD_H("singletap_enable", sec_virtual_tsp_dual_cmd),}, + {SEC_CMD_H("set_touchable_area", sec_virtual_tsp_dual_cmd),}, + {SEC_CMD("clear_cover_mode", sec_virtual_tsp_dual_cmd),}, + {SEC_CMD("ear_detect_enable", sec_virtual_tsp_dual_cmd),}, + {SEC_CMD("pocket_mode_enable", sec_virtual_tsp_dual_cmd),}, + + /* SemInputDeviceManagerService */ + {SEC_CMD("set_game_mode", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("set_scan_rate", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("refresh_rate_mode", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("prox_lp_scan_mode", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("set_grip_data", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("set_sip_mode", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("set_note_mode", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("set_temperature", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("set_aod_rect", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("fod_icon_visible", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("set_fod_rect", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("fp_int_control", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("sync_changed", sec_virtual_tsp_switch_cmd),}, + + /* run_xxx_read_all common */ + {SEC_CMD("run_cs_raw_read_all", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("run_cs_delta_read_all", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("run_rawcap_read_all", sec_virtual_tsp_switch_cmd),}, + + /* only main */ + /* only sub */ +#if IS_ENABLED(CONFIG_TOUCHSCREEN_STM_SUB) + /* run_xxx_read_all stm */ + {SEC_CMD("run_ix_data_read_all", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("run_self_raw_read_all", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("run_cx_data_read_all", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("run_cx_gap_data_rx_all", sec_virtual_tsp_switch_cmd),}, + {SEC_CMD("run_cx_gap_data_tx_all", sec_virtual_tsp_switch_cmd),}, +#else + /* run_xxx_read_all main(stm) */ + {SEC_CMD("run_ix_data_read_all", sec_virtual_tsp_main_cmd),}, + {SEC_CMD("run_self_raw_read_all", sec_virtual_tsp_main_cmd),}, + {SEC_CMD("run_cx_data_read_all", sec_virtual_tsp_main_cmd),}, + {SEC_CMD("run_cx_gap_data_rx_all", sec_virtual_tsp_main_cmd),}, + {SEC_CMD("run_cx_gap_data_tx_all", sec_virtual_tsp_main_cmd),}, +#endif + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_ZINITIX_ZTW522) + /* run_xxx_read_all sub(zinitix) */ + {SEC_CMD("run_dnd_read_all", sec_virtual_tsp_sub_cmd),}, + {SEC_CMD("run_dnd_v_gap_read_all", sec_virtual_tsp_sub_cmd),}, + {SEC_CMD("run_dnd_h_gap_read_all", sec_virtual_tsp_sub_cmd),}, + {SEC_CMD("run_selfdnd_read_all", sec_virtual_tsp_sub_cmd),}, + {SEC_CMD("run_selfdnd_h_gap_read_all", sec_virtual_tsp_sub_cmd),}, + {SEC_CMD("run_jitter_read_all", sec_virtual_tsp_sub_cmd),}, + {SEC_CMD("run_self_saturation_read_all", sec_virtual_tsp_sub_cmd),}, + /* sub touch test (fold open) */ + {SEC_CMD("dead_zone_enable", sec_virtual_tsp_dual_cmd),}, +#endif + {SEC_CMD("two_finger_doubletap_enable", sec_virtual_tsp_dual_cmd),}, + {SEC_CMD("factory_cmd_result_all", sec_virtual_tsp_factory_cmd_result_all),}, + {SEC_CMD("factory_cmd_result_all_imagetest", sec_virtual_tsp_factory_cmd_result_all),}, + + {SEC_CMD_H("set_factory_panel", set_factory_panel),}, + {SEC_CMD("dev_count", dev_count),}, + + {SEC_CMD("not_support_cmd", sec_virtual_tsp_switch_cmd),}, +}; + +static ssize_t sec_virtual_tsp_support_feature_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + char buffer[10]; + int ret; + + memset(buffer, 0x00, sizeof(buffer)); + + ret = sec_cmd_virtual_tsp_read_sysfs(dual_sec, "/sys/class/sec/tsp1/support_feature", buffer, sizeof(buffer)); + if (ret < 0) + return snprintf(buf, SEC_CMD_BUF_SIZE, "NG\n"); + + return snprintf(buf, SEC_CMD_BUF_SIZE, "%s", buffer); +} + +static ssize_t sec_virtual_tsp_prox_power_off_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + char buffer[10]; + int ret; + + memset(buffer, 0x00, sizeof(buffer)); + + if (flip_status) + ret = sec_cmd_virtual_tsp_read_sysfs(dual_sec, "/sys/class/sec/tsp2/prox_power_off", buffer, sizeof(buffer)); + else + ret = sec_cmd_virtual_tsp_read_sysfs(dual_sec, "/sys/class/sec/tsp1/prox_power_off", buffer, sizeof(buffer)); + + input_info(false, dual_sec->fac_dev, "%s: %s, ret:%d\n", __func__, + flip_status ? "close" : "open", ret); + + if (ret < 0) + return snprintf(buf, SEC_CMD_BUF_SIZE, "NG\n"); + + return snprintf(buf, SEC_CMD_BUF_SIZE, "%s\n", buffer); +} + +static ssize_t sec_virtual_tsp_prox_power_off_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + + if (flip_status) + ret = sec_cmd_virtual_tsp_write_sysfs(dual_sec, "/sys/class/sec/tsp2/prox_power_off", buf); + else + ret = sec_cmd_virtual_tsp_write_sysfs(dual_sec, "/sys/class/sec/tsp1/prox_power_off", buf); + + input_info(false, dual_sec->fac_dev, "%s: %s, ret:%d\n", __func__, + flip_status ? "close" : "open", ret); + + return count; +} + +static ssize_t dualscreen_policy_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int ret, value; + + ret = kstrtoint(buf, 10, &value); + if (ret != 0) + return ret; + + if (value <= FLIP_STATUS_DEFAULT || value > FLIP_STATUS_SUB) { + input_info(false, dual_sec->fac_dev, "%s: value=%d %s\n", __func__, value, + flip_status ? "close" : "open"); + return count; + } + + mutex_lock(&switching_mutex); + flip_status = value; + mutex_unlock(&switching_mutex); + + if (value == FLIP_STATUS_MAIN) + ret = sec_cmd_virtual_tsp_write_sysfs(dual_sec, "/sys/class/sec/tsp1/dualscreen_policy", buf); + + input_info(false, dual_sec->fac_dev, "%s: value=%d %s, ret:%d\n", __func__, value, + flip_status ? "close" : "open", ret); + + return count; +} + +static DEVICE_ATTR(dualscreen_policy, 0644, NULL, dualscreen_policy_store); +static DEVICE_ATTR(support_feature, 0444, sec_virtual_tsp_support_feature_show, NULL); +static DEVICE_ATTR(prox_power_off, 0644, sec_virtual_tsp_prox_power_off_show, sec_virtual_tsp_prox_power_off_store); + +static struct attribute *sec_virtual_tsp_attrs[] = { + &dev_attr_support_feature.attr, + &dev_attr_prox_power_off.attr, + &dev_attr_dualscreen_policy.attr, + NULL, +}; + +static struct attribute_group sec_virtual_tsp_attrs_group = { + .attrs = sec_virtual_tsp_attrs, +}; + +static int __init __init_sec_virtual_tsp(void) +{ + int ret; + + dual_sec = kzalloc(sizeof(struct sec_cmd_data), GFP_KERNEL); + if (!dual_sec) { + input_err(true, NULL, "%s: failed to alloc sec_cmd_data for dual tsp\n", __func__); + return -ENOMEM; + } + + sec_cmd_init(dual_sec, tsp_commands, + ARRAY_SIZE(tsp_commands), SEC_CLASS_DEVT_TSP); + + input_info(true, dual_sec->fac_dev, "%s\n", __func__); + + fac_flip_status = FLIP_STATUS_DEFAULT; + flip_status = FLIP_STATUS_MAIN; + mutex_init(&switching_mutex); + +#if IS_ENABLED(CONFIG_HALL_NOTIFIER) + hall_ic_nb.priority = 1; + hall_ic_nb.notifier_call = sec_virtual_tsp_hall_ic_notify; + hall_notifier_register(&hall_ic_nb); + input_info(true, dual_sec->fac_dev, "%s: hall ic register\n", __func__); +#endif +#if IS_ENABLED(CONFIG_SUPPORT_SENSOR_FOLD) + hall_ic_nb_ssh.priority = 1; + hall_ic_nb_ssh.notifier_call = sec_virtual_tsp_hall_ic_ssh_notify; + sensorfold_notifier_register(&hall_ic_nb_ssh); + input_info(true, dual_sec->fac_dev, "%s: hall ic(ssh) register\n", __func__); +#endif +#if IS_ENABLED(CONFIG_TOUCHSCREEN_DUMP_MODE) + tsp_callbacks = callbacks; + dump_callbacks.inform_dump = sec_virtual_tsp_dump; +#endif + + ret = sysfs_create_group(&dual_sec->fac_dev->kobj, &sec_virtual_tsp_attrs_group); + if (ret < 0) { + pr_err("%s %s: failed to create sysfs group\n", SECLOG, __func__); + return -ENODEV; + } + + return 0; +} + +module_init(__init_sec_virtual_tsp); + +MODULE_DESCRIPTION("Samsung virtual tsp functions"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 743e2357530c..d9d4c9f86fdc 100755 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -1256,17 +1256,17 @@ config TOUCHSCREEN_ST source "drivers/input/touchscreen/st/Kconfig" -config TOUCHSCREEN_HIMAX_CHIPSET - bool "Himax touchpanel CHIPSET" - depends on I2C - help - Say Y here if you have a Himax CHIPSET touchscreen. - HIMAX controllers are multi touch controllers which can - report 10 touches at a time. - - If unsure, say N. +#config TOUCHSCREEN_HIMAX_CHIPSET +# bool "Himax touchpanel CHIPSET" +# depends on I2C +# help +# Say Y here if you have a Himax CHIPSET touchscreen. +# HIMAX controllers are multi touch controllers which can +# report 10 touches at a time. +# +# If unsure, say N. -source "drivers/input/touchscreen/hxchipset/Kconfig" +# source "drivers/input/touchscreen/hxchipset/Kconfig" config TOUCHSCREEN_SYNAPTICS_DSX bool "Synaptics DSX Touchscreen Driver" @@ -1294,6 +1294,7 @@ source "drivers/input/touchscreen/melfas/mss100/Kconfig" source "drivers/input/touchscreen/sec_ts/y771/Kconfig" source "drivers/input/touchscreen/zinitix/zt7650/Kconfig" source "drivers/input/touchscreen/stm/fts5cu56a/Kconfig" +source "drivers/input/touchscreen/himax/hx831xx/Kconfig" config TOUCHSCREEN_SYNAPTICS_TCM bool "Synaptics TCM Touchscreen Driver" diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 151bc197d85a..20303e9961b3 100755 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -106,7 +106,7 @@ obj-$(CONFIG_TOUCHSCREEN_ZFORCE) += zforce_ts.o obj-$(CONFIG_TOUCHSCREEN_COLIBRI_VF50) += colibri-vf50-ts.o obj-$(CONFIG_TOUCHSCREEN_ROHM_BU21023) += rohm_bu21023.o obj-$(CONFIG_TOUCHSCREEN_ST) += st/ -obj-$(CONFIG_TOUCHSCREEN_HIMAX_CHIPSET) += hxchipset/ +# obj-$(CONFIG_TOUCHSCREEN_HIMAX_CHIPSET) += hxchipset/ obj-$(CONFIG_TOUCHSCREEN_ZINITIX_ZT75XX) += zinitix/ obj-$(CONFIG_TOUCHSCREEN_IST40XX) += imagis_40xx/ obj-$(CONFIG_TOUCHSCREEN_IST4050) += imagis/ist4050/ @@ -118,4 +118,4 @@ obj-$(CONFIG_TOUCHSCREEN_RAYDIUM_CHIPSET) += raydium_wt030/ obj-$(CONFIG_TOUCHSCREEN_SEC_TS_Y771) += sec_ts/y771/ obj-$(CONFIG_TOUCHSCREEN_ZINITIX_ZT7650) += zinitix/zt7650/ obj-$(CONFIG_TOUCHSCREEN_STM_FTS5CU56A) += stm/fts5cu56a/ - +obj-$(CONFIG_TOUCHSCREEN_HIMAX_COMMON) += himax/hx831xx/ diff --git a/drivers/input/touchscreen/himax/hx831xx/Kconfig b/drivers/input/touchscreen/himax/hx831xx/Kconfig new file mode 100755 index 000000000000..bc0eabf45a9c --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/Kconfig @@ -0,0 +1,137 @@ +# +# Himax Touchscreen driver configuration +# + +config TOUCHSCREEN_HIMAX_CHIPSET + bool "Himax touchpanel CHIPSET" + help + Say Y here if you have a Himax CHIPSET touchscreen. + HIMAX controllers are multi touch controllers which can + report 10 touches at a time. + + If unsure, say N. + +config TOUCHSCREEN_HIMAX_COMMON + tristate "HIMAX chipset i2c touchscreen" + depends on TOUCHSCREEN_HIMAX_CHIPSET + help + This enables support for HIMAX CHIPSET over I2C based touchscreens. + +config TOUCHSCREEN_HIMAX_I2C + tristate "HIMAX chipset i2c touchscreen" + depends on TOUCHSCREEN_HIMAX_COMMON + help + This enables support for HIMAX I2C based touchscreens. + +config TOUCHSCREEN_HIMAX_SPI + tristate "HIMAX chipset spi touchscreen" + depends on TOUCHSCREEN_HIMAX_COMMON + help + This enables support for HIMAX SPI based touchscreens. + +# ***************** On-cell Start ***************** +config TOUCHSCREEN_HIMAX_ONCELL + tristate "HIMAX chipset on-cell function" + depends on TOUCHSCREEN_HIMAX_COMMON + help + This enables support for HIMAX CHIPSET of on-cell function. + +config TOUCHSCREEN_HIMAX_IC_HX852xH + tristate "HIMAX chipset HX852xH function" + depends on TOUCHSCREEN_HIMAX_ONCELL + help + This enables support for HIMAX CHIPSET of HX852xH. + +config TOUCHSCREEN_HIMAX_IC_HX852xG + tristate "HIMAX chipset HX852xG function" + depends on TOUCHSCREEN_HIMAX_ONCELL + help + This enables support for HIMAX CHIPSET of HX852xG. + +# ***************** On-cell End ******************* +# ***************** In-cell Start ***************** +config TOUCHSCREEN_HIMAX_INCELL + tristate "HIMAX chipset in-cell function" + depends on TOUCHSCREEN_HIMAX_COMMON + help + This enables support for HIMAX CHIPSET of in-cell function. + +config TOUCHSCREEN_HIMAX_IC_HX83191 + tristate "HIMAX chipset HX83191 function" + depends on TOUCHSCREEN_HIMAX_INCELL + help + This enables support for HIMAX CHIPSET of HX83191. + +config TOUCHSCREEN_HIMAX_IC_HX83113 + tristate "HIMAX chipset HX83113 function" + depends on TOUCHSCREEN_HIMAX_INCELL + help + This enables support for HIMAX CHIPSET of HX83113. + +config TOUCHSCREEN_HIMAX_IC_HX83112 + tristate "HIMAX chipset HX83112 function" + depends on TOUCHSCREEN_HIMAX_INCELL + help + This enables support for HIMAX CHIPSET of HX83112. + +config TOUCHSCREEN_HIMAX_IC_HX83111 + tristate "HIMAX chipset HX83111 function" + depends on TOUCHSCREEN_HIMAX_INCELL + help + This enables support for HIMAX CHIPSET of HX83111. + +config TOUCHSCREEN_HIMAX_IC_HX83106 + tristate "HIMAX chipset HX83106 function" + depends on TOUCHSCREEN_HIMAX_INCELL + help + This enables support for HIMAX CHIPSET of HX83106. + +config TOUCHSCREEN_HIMAX_IC_HX83103 + tristate "HIMAX chipset HX83103 function" + depends on TOUCHSCREEN_HIMAX_INCELL + help + This enables support for HIMAX CHIPSET of HX83103. + +config TOUCHSCREEN_HIMAX_IC_HX83102 + tristate "HIMAX chipset HX83102 function" + depends on TOUCHSCREEN_HIMAX_INCELL + help + This enables support for HIMAX CHIPSET of HX83102. + +config TOUCHSCREEN_HIMAX_IC_HX83121 + tristate "HIMAX chipset HX83121 function" + depends on TOUCHSCREEN_HIMAX_INCELL + help + This enables support for HIMAX CHIPSET of HX83121. + +config SEC_AOT + tristate "HIMAX chipset HX83102 function" + depends on TOUCHSCREEN_HIMAX_INCELL + help + This enables support for notify AOT to LCD. + +# ***************** In-cell End ******************* + +config TOUCHSCREEN_HIMAX_DEBUG + tristate "HIMAX debug function" + depends on TOUCHSCREEN_HIMAX_INCELL || TOUCHSCREEN_HIMAX_ONCELL + help + This enables support for HIMAX debug function. +config TOUCHSCREEN_HIMAX_INSPECT + tristate "HIMAX inspect function" + depends on TOUCHSCREEN_HIMAX_INCELL || TOUCHSCREEN_HIMAX_ONCELL + help + This enables support for HIMAX debug function. + +config TOUCHSCREEN_HIMAX_EMBEDDED_FIRMWARE + tristate "HIMAX embedded firmware function" + depends on TOUCHSCREEN_HIMAX_INCELL || TOUCHSCREEN_HIMAX_ONCELL + help + This enables built-in FW inside kernel as binary array + +config HMX_DB + tristate "HIMAX driver test over Dragon Board" + depends on TOUCHSCREEN_HIMAX_COMMON + help + This enables support for HIMAX driver test over Dragon Board. + diff --git a/drivers/input/touchscreen/himax/hx831xx/Makefile b/drivers/input/touchscreen/himax/hx831xx/Makefile new file mode 100755 index 000000000000..22f5d84605bd --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/Makefile @@ -0,0 +1,12 @@ +# Makefile for the Himax touchscreen drivers. + +obj-$(CONFIG_TOUCHSCREEN_HIMAX_DEBUG) += himax_debug.o +obj-$(CONFIG_TOUCHSCREEN_HIMAX_INSPECT) += himax_inspection.o +obj-$(CONFIG_TOUCHSCREEN_HIMAX_INCELL) += himax_ic_incell_core.o +obj-$(CONFIG_TOUCHSCREEN_HIMAX_ONCELL_CORE) += himax_ic_oncell_core.o +obj-$(CONFIG_TOUCHSCREEN_HIMAX_IC_HX83102) += himax_ic_HX83102.o +obj-$(CONFIG_TOUCHSCREEN_HIMAX_COMMON) += himax_common.o +obj-$(CONFIG_TOUCHSCREEN_HIMAX_I2C) += himax_platform.o +obj-$(CONFIG_TOUCHSCREEN_HIMAX_SPI) += himax_platform_SPI.o + +ccflags-y += -Wformat \ No newline at end of file diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_common.c b/drivers/input/touchscreen/himax/hx831xx/himax_common.c new file mode 100755 index 000000000000..5199c2fc21e7 --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_common.c @@ -0,0 +1,3543 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for common functions + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "himax_inspection.h" +#include "himax_modular.h" + +#define TOUCH_PRINT_INFO_DWORK_TIME 30000 /* 30 secs */ + +#ifdef HX_SMART_WAKEUP +#define GEST_SUP_NUM 1 +/* Setting cust key define (DF = double finger) */ +/* {Double Tap, Up, Down, Left, Rright, C, Z, M, + * O, S, V, W, e, m, @, (reserve), + * Finger gesture, ^, >, <, f(R), f(L), Up(DF), Down(DF), + * Left(DF), Right(DF)} + */ + uint8_t gest_event[GEST_SUP_NUM] = {0x80}; + +/*gest_event mapping to gest_key_def*/ + uint16_t gest_key_def[GEST_SUP_NUM] = {KEY_WAKEUP}; + +uint8_t *wake_event_buffer; +#endif + +#define SUPPORT_FINGER_DATA_CHECKSUM 0x0F +#define TS_WAKE_LOCK_TIMEOUT (1000) +#define FRAME_COUNT 5 + +uint32_t g_hx_chip_inited; + +#if defined(__EMBEDDED_FW__) +struct firmware g_embedded_fw = { + .data = _binary___Himax_firmware_bin_start, +}; +#endif + +#if defined(HX_AUTO_UPDATE_FW) || defined(HX_ZERO_FLASH) +/* + *#if defined(HX_EN_DYNAMIC_NAME) + *char *i_CTPM_firmware_name; + *#else + *char *i_CTPM_firmware_name = "Himax_firmware.bin"; + *#endif + */ +bool g_auto_update_flag; +#endif +#if defined(HX_AUTO_UPDATE_FW) +unsigned char *i_CTPM_FW; +int i_CTPM_FW_len; +int g_i_FW_VER; +int g_i_CFG_VER; +int g_i_CID_MAJ; /*GUEST ID*/ +int g_i_CID_MIN; /*VER for GUEST*/ +#endif +#ifdef HX_ZERO_FLASH +int g_f_0f_updat; +#endif + +#ifdef SEC_FACTORY_MODE +extern int sec_touch_sysfs(struct himax_ts_data *data); +extern void sec_touch_sysfs_remove(struct himax_ts_data *data); +#endif + +struct himax_ts_data *private_ts; +EXPORT_SYMBOL(private_ts); + +struct himax_ic_data *ic_data; +EXPORT_SYMBOL(ic_data); + +struct himax_report_data *hx_touch_data; +EXPORT_SYMBOL(hx_touch_data); + +struct himax_core_fp g_core_fp; +EXPORT_SYMBOL(g_core_fp); + +struct himax_debug *debug_data; +EXPORT_SYMBOL(debug_data); + +struct proc_dir_entry *himax_touch_proc_dir; +EXPORT_SYMBOL(himax_touch_proc_dir); + +struct himax_chip_detect *g_core_chip_dt; +EXPORT_SYMBOL(g_core_chip_dt); + +int g_mmi_refcnt; +EXPORT_SYMBOL(g_mmi_refcnt); + +#define HIMAX_PROC_TOUCH_FOLDER "android_touch" +/*ts_work about start*/ +struct himax_target_report_data *g_target_report_data; +EXPORT_SYMBOL(g_target_report_data); + +static void himax_report_all_leave_event(struct himax_ts_data *ts); +/*ts_work about end*/ +static int HX_TOUCH_INFO_POINT_CNT; + +unsigned long FW_VER_MAJ_FLASH_ADDR; +EXPORT_SYMBOL(FW_VER_MAJ_FLASH_ADDR); + +unsigned long FW_VER_MIN_FLASH_ADDR; +EXPORT_SYMBOL(FW_VER_MIN_FLASH_ADDR); + +unsigned long CFG_VER_MAJ_FLASH_ADDR; +EXPORT_SYMBOL(CFG_VER_MAJ_FLASH_ADDR); + +unsigned long CFG_VER_MIN_FLASH_ADDR; +EXPORT_SYMBOL(CFG_VER_MIN_FLASH_ADDR); + +unsigned long CID_VER_MAJ_FLASH_ADDR; +EXPORT_SYMBOL(CID_VER_MAJ_FLASH_ADDR); + +unsigned long CID_VER_MIN_FLASH_ADDR; +EXPORT_SYMBOL(CID_VER_MIN_FLASH_ADDR); + +unsigned long PANEL_VERSION_ADDR; +EXPORT_SYMBOL(PANEL_VERSION_ADDR); + +unsigned long FW_VER_MAJ_FLASH_LENG; +EXPORT_SYMBOL(FW_VER_MAJ_FLASH_LENG); + +unsigned long FW_VER_MIN_FLASH_LENG; +EXPORT_SYMBOL(FW_VER_MIN_FLASH_LENG); + +unsigned long CFG_VER_MAJ_FLASH_LENG; +EXPORT_SYMBOL(CFG_VER_MAJ_FLASH_LENG); + +unsigned long CFG_VER_MIN_FLASH_LENG; +EXPORT_SYMBOL(CFG_VER_MIN_FLASH_LENG); + +unsigned long CID_VER_MAJ_FLASH_LENG; +EXPORT_SYMBOL(CID_VER_MAJ_FLASH_LENG); + +unsigned long CID_VER_MIN_FLASH_LENG; +EXPORT_SYMBOL(CID_VER_MIN_FLASH_LENG); + +unsigned long PANEL_VERSION_LENG; +EXPORT_SYMBOL(PANEL_VERSION_LENG); + +unsigned long FW_CFG_VER_FLASH_ADDR; + + +unsigned char IC_CHECKSUM; +EXPORT_SYMBOL(IC_CHECKSUM); + +uint8_t g_last_fw_irq_flag = 0; +uint8_t g_last_fw_irq_flag2 = 0; + +#ifdef HX_ESD_RECOVERY +u8 HX_ESD_RESET_ACTIVATE; +EXPORT_SYMBOL(HX_ESD_RESET_ACTIVATE); + +int hx_EB_event_flag; +EXPORT_SYMBOL(hx_EB_event_flag); + +int hx_EC_event_flag; +EXPORT_SYMBOL(hx_EC_event_flag); + +int hx_ED_event_flag; +EXPORT_SYMBOL(hx_ED_event_flag); + +int g_zero_event_count; + +#endif + +static bool chip_test_r_flag; +u8 HX_HW_RESET_ACTIVATE; + +static uint8_t AA_press; +static uint8_t EN_NoiseFilter; +static uint8_t Last_EN_NoiseFilter; + +static int p_point_num = 0xFFFF; +#if defined(HX_EN_SEL_BUTTON) || defined(HX_EN_MUT_BUTTON) +static uint8_t vk_press; +static int tpd_key; +static int tpd_key_old; +#endif +static int probe_fail_flag; +bool USB_detect_flag; +EXPORT_SYMBOL(USB_detect_flag); + +#ifdef HX_GESTURE_TRACK +static int gest_pt_cnt; +static int gest_pt_x[GEST_PT_MAX_NUM]; +static int gest_pt_y[GEST_PT_MAX_NUM]; +static int gest_start_x, gest_start_y, gest_end_x, gest_end_y; +static int gest_width, gest_height, gest_mid_x, gest_mid_y; +static int hx_gesture_coor[16]; +#endif + +int g_ts_dbg; +EXPORT_SYMBOL(g_ts_dbg); + +/* File node for Selftest, SMWP and HSEN - Start*/ +#define HIMAX_PROC_SELF_TEST_FILE "self_test" +struct proc_dir_entry *himax_proc_self_test_file; + +uint8_t HX_PROC_SEND_FLAG; +EXPORT_SYMBOL(HX_PROC_SEND_FLAG); + +#ifdef HX_SMART_WAKEUP + #define HIMAX_PROC_SMWP_FILE "SMWP" + struct proc_dir_entry *himax_proc_SMWP_file = NULL; + #define HIMAX_PROC_GESTURE_FILE "GESTURE" + struct proc_dir_entry *himax_proc_GESTURE_file = NULL; + uint8_t HX_SMWP_EN; +#ifdef HX_P_SENSOR + #define HIMAX_PROC_PSENSOR_FILE "Psensor" + struct proc_dir_entry *himax_proc_psensor_file = NULL; +#endif +#endif +#if defined(HX_SMART_WAKEUP) || IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_INSPECT) +bool FAKE_POWER_KEY_SEND = true; +#endif + +#ifdef HX_HIGH_SENSE + #define HIMAX_PROC_HSEN_FILE "HSEN" + struct proc_dir_entry *himax_proc_HSEN_file = NULL; +#endif + +#if defined(HX_PALM_REPORT) +static int himax_palm_detect(uint8_t *buf) +{ + struct himax_ts_data *ts = private_ts; + int32_t loop_i; + int base = 0; + int x = 0, y = 0, w = 0; + + loop_i = 0; + base = loop_i * 4; + x = buf[base] << 8 | buf[base + 1]; + y = (buf[base + 2] << 8 | buf[base + 3]); + w = buf[(ts->nFinger_support * 4) + loop_i]; + I(" %s HX_PALM_REPORT_loopi=%d,base=%x,X=%x,Y=%x,W=%x\n", __func__, loop_i, base, x, y, w); + if ((!atomic_read(&ts->suspend_mode)) && (x == 0xFA5A) && (y == 0xFA5A) && (w == 0x00)) + return PALM_REPORT; + else + return NOT_REPORT; +} +#endif + +static ssize_t himax_self_test(struct seq_file *s, void *v) +{ + int val = 0x00; + size_t ret = 0; + int i = 0; + + I("%s: enter, %d\n", __func__, __LINE__); + + if (private_ts->suspended == 1) { + E("%s: please do self test in normal active mode\n", __func__); + return HX_INIT_FAIL; + } + + himax_int_enable(0);/* disable irq */ + + private_ts->in_self_test = 1; + + val = g_core_fp.fp_chip_self_test(); +/* + *#ifdef HX_ESD_RECOVERY + * HX_ESD_RESET_ACTIVATE = 1; + *#endif + * himax_int_enable(1); //enable irq + */ + if (val == HX_INSPECT_OK) + seq_puts(s, "Self_Test Pass:\n"); + else + seq_puts(s, "Self_Test Fail:\n"); + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_INSPECT) + for (i = 0; i < HX_CRITERIA_ITEM - 1; i++) { + if (g_test_item_flag[i] == 1) { + seq_printf(s, " %s : %s\n", g_himax_inspection_mode[i], + ((val & (1 << (i + ERR_SFT))) == (1 << (i + ERR_SFT)))?"Fail":"OK"); + } + } + + if ((val & HX_INSPECT_EFILE) == HX_INSPECT_EFILE) + seq_puts(s, " Get criteria File Fail\n"); + if ((val & HX_INSPECT_MEMALLCTFAIL) == HX_INSPECT_MEMALLCTFAIL) + seq_puts(s, " Allocate memory Fail\n"); + if ((val & HX_INSPECT_EGETRAW) == HX_INSPECT_EGETRAW) + seq_puts(s, " Get raw data Fail\n"); + if ((val & HX_INSPECT_ESWITCHMODE) == HX_INSPECT_ESWITCHMODE) + seq_puts(s, " Switch mode Fail\n"); +#endif + + private_ts->in_self_test = 0; + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_INSPECT) + if (g_test_item_flag != NULL) { + kfree(g_test_item_flag); + g_test_item_flag = NULL; + } +#endif + +#ifdef HX_ESD_RECOVERY + HX_ESD_RESET_ACTIVATE = 1; +#endif + himax_int_enable(1);/* enable irq */ + + return ret; +} + +static void *himax_self_test_seq_start(struct seq_file *s, loff_t *pos) +{ + if (*pos >= 1) + return NULL; + + + return (void *)((unsigned long) *pos + 1); +} + +static void *himax_self_test_seq_next(struct seq_file *s, void *v, loff_t *pos) +{ + return NULL; +} + +static void himax_self_test_seq_stop(struct seq_file *s, void *v) +{ +} + +static ssize_t himax_self_test_write(struct file *filp, const char __user *buff, + size_t len, loff_t *data) +{ + char buf[80]; + + if (len >= 80) { + I("%s: no command exceeds 80 chars.\n", __func__); + return -EFAULT; + } + + if (copy_from_user(buf, buff, len)) + return -EFAULT; + + if (buf[0] == 'r') { + chip_test_r_flag = true; + I("%s: Start to read chip test data.\n", __func__); + } else { + chip_test_r_flag = false; + I("%s: Back to do self test.\n", __func__); + } + + return len; +} + +static int himax_self_test_seq_read(struct seq_file *s, void *v) +{ + size_t ret = 0; + + if (chip_test_r_flag) { +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_INSPECT) + if (g_rslt_data) + seq_printf(s, "%s", g_rslt_data); + else +#endif + seq_puts(s, "No chip test data.\n"); + } else { + himax_self_test(s, v); + } + + return ret; +} + +static const struct seq_operations himax_self_test_seq_ops = { + .start = himax_self_test_seq_start, + .next = himax_self_test_seq_next, + .stop = himax_self_test_seq_stop, + .show = himax_self_test_seq_read, +}; + +static int himax_self_test_proc_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &himax_self_test_seq_ops); +}; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) +static const struct proc_ops himax_proc_self_test_ops = { + .proc_open = himax_self_test_proc_open, + .proc_read = seq_read, + .proc_write = himax_self_test_write, + .proc_release = seq_release, +}; +#else +static const struct file_operations himax_proc_self_test_ops = { + .owner = THIS_MODULE, + .open = himax_self_test_proc_open, + .read = seq_read, + .write = himax_self_test_write, + .release = seq_release, +}; +#endif + +#ifdef HX_HIGH_SENSE +static ssize_t himax_HSEN_read(struct file *file, char *buf, + size_t len, loff_t *pos) +{ + struct himax_ts_data *ts = private_ts; + size_t count = 0; + char *temp_buf; + + if (!HX_PROC_SEND_FLAG) { + temp_buf = kcalloc(len, sizeof(char), GFP_KERNEL); + count = snprintf(temp_buf, PAGE_SIZE, "%d\n", ts->HSEN_enable); + + if (copy_to_user(buf, temp_buf, len)) + I("%s,here:%d\n", __func__, __LINE__); + + kfree(temp_buf); + HX_PROC_SEND_FLAG = 1; + } else { + HX_PROC_SEND_FLAG = 0; + } + + return count; +} + +static ssize_t himax_HSEN_write(struct file *file, const char *buff, + size_t len, loff_t *pos) +{ + struct himax_ts_data *ts = private_ts; + char buf[80] = {0}; + + if (len >= 80) { + I("%s: no command exceeds 80 chars.\n", __func__); + return -EFAULT; + } + + if (copy_from_user(buf, buff, len)) + return -EFAULT; + + if (buf[0] == '0') + ts->HSEN_enable = 0; + else if (buf[0] == '1') + ts->HSEN_enable = 1; + else + return -EINVAL; + + g_core_fp.fp_set_HSEN_enable(ts->HSEN_enable, ts->suspended); + I("%s: HSEN_enable = %d.\n", __func__, ts->HSEN_enable); + return len; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) +static const struct proc_ops himax_proc_HSEN_ops = { + .proc_read = himax_HSEN_read, + .proc_write = himax_HSEN_write, +}; +#else +static const struct file_operations himax_proc_HSEN_ops = { + .owner = THIS_MODULE, + .read = himax_HSEN_read, + .write = himax_HSEN_write, +}; +#endif +#endif + +#ifdef HX_SMART_WAKEUP +static ssize_t himax_SMWP_read(struct file *file, char *buf, + size_t len, loff_t *pos) +{ + size_t count = 0; + struct himax_ts_data *ts = private_ts; + char *temp_buf; + + if (!HX_PROC_SEND_FLAG) { + temp_buf = kcalloc(len, sizeof(char), GFP_KERNEL); + count = snprintf(temp_buf, PAGE_SIZE, "%d\n", ts->SMWP_enable); + + if (copy_to_user(buf, temp_buf, len)) + I("%s,here:%d\n", __func__, __LINE__); + + kfree(temp_buf); + HX_PROC_SEND_FLAG = 1; + } else { + HX_PROC_SEND_FLAG = 0; + } + + return count; +} + +static ssize_t himax_SMWP_write(struct file *file, const char *buff, + size_t len, loff_t *pos) +{ + struct himax_ts_data *ts = private_ts; + char buf[80] = {0}; + + if (len >= 80) { + I("%s: no command exceeds 80 chars.\n", __func__); + return -EFAULT; + } + + if (copy_from_user(buf, buff, len)) + return -EFAULT; + + if (buf[0] == '0') + ts->SMWP_enable = 0; + else if (buf[0] == '1') + ts->SMWP_enable = 1; + else + return -EINVAL; + + g_core_fp.fp_set_SMWP_enable(ts->SMWP_enable, ts->suspended); + HX_SMWP_EN = ts->SMWP_enable; + I("%s: SMART_WAKEUP_enable = %d.\n", __func__, HX_SMWP_EN); + return len; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) +static const struct proc_ops himax_proc_SMWP_ops = { + .proc_read = himax_SMWP_read, + .proc_write = himax_SMWP_write, +}; +#else +static const struct file_operations himax_proc_SMWP_ops = { + .owner = THIS_MODULE, + .read = himax_SMWP_read, + .write = himax_SMWP_write, +}; +#endif + +static ssize_t himax_GESTURE_read(struct file *file, char *buf, + size_t len, loff_t *pos) +{ + struct himax_ts_data *ts = private_ts; + int i = 0; + size_t ret = 0; + char *temp_buf; + + if (!HX_PROC_SEND_FLAG) { + temp_buf = kcalloc(len, sizeof(char), GFP_KERNEL); + + for (i = 0; i < GEST_SUP_NUM; i++) + ret += snprintf(temp_buf + ret, len - ret, "ges_en[%d]=%d\n", i, ts->gesture_cust_en[i]); + + if (copy_to_user(buf, temp_buf, len)) + I("%s,here:%d\n", __func__, __LINE__); + + kfree(temp_buf); + HX_PROC_SEND_FLAG = 1; + } else { + HX_PROC_SEND_FLAG = 0; + ret = 0; + } + + return ret; +} + +static ssize_t himax_GESTURE_write(struct file *file, const char *buff, + size_t len, loff_t *pos) +{ + struct himax_ts_data *ts = private_ts; + int i = 0; + int j = 0; + char buf[80] = {0}; + + if (len >= 80) { + I("%s: no command exceeds 80 chars.\n", __func__); + return -EFAULT; + } + + if (copy_from_user(buf, buff, len)) + return -EFAULT; + + I("himax_GESTURE_store= %s, len = %d\n", buf, (int)len); + + for (i = 0; i < len; i++) { + if (buf[i] == '0' && j < GEST_SUP_NUM) { + ts->gesture_cust_en[j] = 0; + I("gesture en[%d]=%d\n", j, ts->gesture_cust_en[j]); + j++; + } else if (buf[i] == '1' && j < GEST_SUP_NUM) { + ts->gesture_cust_en[j] = 1; + I("gesture en[%d]=%d\n", j, ts->gesture_cust_en[j]); + j++; + } else + I("Not 0/1 or >=GEST_SUP_NUM : buf[%d] = %c\n", i, buf[i]); + } + + return len; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) +static const struct proc_ops himax_proc_Gesture_ops = { + .proc_read = himax_GESTURE_read, + .proc_write = himax_GESTURE_write, +}; +#else +static const struct file_operations himax_proc_Gesture_ops = { + .owner = THIS_MODULE, + .read = himax_GESTURE_read, + .write = himax_GESTURE_write, +}; +#endif + +#ifdef HX_P_SENSOR +static ssize_t himax_psensor_read(struct file *file, char *buf, + size_t len, loff_t *pos) +{ + size_t count = 0; + struct himax_ts_data *ts = private_ts; + char *temp_buf; + + if (!HX_PROC_SEND_FLAG) { + temp_buf = kcalloc(len, sizeof(char), GFP_KERNEL); + count = snprintf(temp_buf, PAGE_SIZE, "p-sensor flag = %d\n", ts->psensor_flag); + + if (copy_to_user(buf, temp_buf, len)) + I("%s,here:%d\n", __func__, __LINE__); + + kfree(temp_buf); + HX_PROC_SEND_FLAG = 1; + } else { + HX_PROC_SEND_FLAG = 0; + } + + return count; +} + +static ssize_t himax_psensor_write(struct file *file, const char *buff, + size_t len, loff_t *pos) +{ + struct himax_ts_data *ts = private_ts; + char buf[80] = {0}; + + if (len >= 80) { + I("%s: no command exceeds 80 chars.\n", __func__); + return -EFAULT; + } + + if (copy_from_user(buf, buff, len)) + return -EFAULT; + + if (buf[0] == '0' && ts->SMWP_enable == 1) { + ts->psensor_flag = false; + g_core_fp.fp_black_gest_ctrl(false); + } else if (buf[0] == '1' && ts->SMWP_enable == 1) { + ts->psensor_flag = true; + g_core_fp.fp_black_gest_ctrl(true); + } else if (ts->SMWP_enable == 0) { + I("%s: SMWP is disable, not supprot to ctrl p-sensor.\n", __func__); + } else + return -EINVAL; + + I("%s: psensor_flag = %d.\n", __func__, ts->psensor_flag); + return len; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) +static const struct proc_ops himax_proc_psensor_ops = { + .proc_read = himax_psensor_read, + .proc_write = himax_psensor_write, +}; +#else +static const struct file_operations himax_proc_psensor_ops = { + .owner = THIS_MODULE, + .read = himax_psensor_read, + .write = himax_psensor_write, +}; +#endif +#endif +#endif + +int himax_common_proc_init(void) +{ + himax_touch_proc_dir = proc_mkdir(HIMAX_PROC_TOUCH_FOLDER, NULL); + + if (himax_touch_proc_dir == NULL) { + E(" %s: himax_touch_proc_dir file create failed!\n", __func__); + return -ENOMEM; + } +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_INSPECT) + if (fp_himax_self_test_init != NULL) + fp_himax_self_test_init(); +#endif + + himax_proc_self_test_file = proc_create(HIMAX_PROC_SELF_TEST_FILE, 0444, himax_touch_proc_dir, &himax_proc_self_test_ops); + if (himax_proc_self_test_file == NULL) { + E(" %s: proc self_test file create failed!\n", __func__); + goto fail_1; + } + +#ifdef HX_HIGH_SENSE + himax_proc_HSEN_file = proc_create(HIMAX_PROC_HSEN_FILE, 0666, + himax_touch_proc_dir, &himax_proc_HSEN_ops); + + if (himax_proc_HSEN_file == NULL) { + E(" %s: proc HSEN file create failed!\n", __func__); + goto fail_2; + } + +#endif +#ifdef HX_SMART_WAKEUP + himax_proc_SMWP_file = proc_create(HIMAX_PROC_SMWP_FILE, 0666, + himax_touch_proc_dir, &himax_proc_SMWP_ops); + + if (himax_proc_SMWP_file == NULL) { + E(" %s: proc SMWP file create failed!\n", __func__); + goto fail_3; + } + + himax_proc_GESTURE_file = proc_create(HIMAX_PROC_GESTURE_FILE, 0666, + himax_touch_proc_dir, &himax_proc_Gesture_ops); + + if (himax_proc_GESTURE_file == NULL) { + E(" %s: proc GESTURE file create failed!\n", __func__); + goto fail_4; + } +#ifdef HX_P_SENSOR + himax_proc_psensor_file = proc_create(HIMAX_PROC_PSENSOR_FILE, 0666, + himax_touch_proc_dir, &himax_proc_psensor_ops); + + if (himax_proc_psensor_file == NULL) { + E(" %s: proc GESTURE file create failed!\n", __func__); + goto fail_5; + } +#endif +#endif + return 0; +#ifdef HX_SMART_WAKEUP +#ifdef HX_P_SENSOR +fail_5: +#endif + remove_proc_entry(HIMAX_PROC_GESTURE_FILE, himax_touch_proc_dir); +fail_4: + remove_proc_entry(HIMAX_PROC_SMWP_FILE, himax_touch_proc_dir); +fail_3: +#endif +#ifdef HX_HIGH_SENSE + remove_proc_entry(HIMAX_PROC_HSEN_FILE, himax_touch_proc_dir); +fail_2: +#endif + remove_proc_entry(HIMAX_PROC_SELF_TEST_FILE, himax_touch_proc_dir); +fail_1: + return -ENOMEM; +} + +void himax_common_proc_deinit(void) +{ +remove_proc_entry(HIMAX_PROC_SELF_TEST_FILE, himax_touch_proc_dir); +#ifdef HX_HIGH_SENSE + remove_proc_entry(HIMAX_PROC_HSEN_FILE, himax_touch_proc_dir); +#endif +#ifdef HX_SMART_WAKEUP +#ifdef HX_P_SENSOR + remove_proc_entry(HIMAX_PROC_PSENSOR_FILE, himax_touch_proc_dir); +#endif + remove_proc_entry(HIMAX_PROC_GESTURE_FILE, himax_touch_proc_dir); + remove_proc_entry(HIMAX_PROC_SMWP_FILE, himax_touch_proc_dir); +#endif + remove_proc_entry(HIMAX_PROC_TOUCH_FOLDER, NULL); +} + +/* File node for SMWP and HSEN - End*/ + +int himax_input_register(struct himax_ts_data *ts, struct input_dev *input_dev, u8 propbit) +{ + int ret = 0; +#if defined(HX_SMART_WAKEUP) + int i = 0; +#endif + + if (!input_dev) { + E("%s, input_dev is null\n", __func__); + return -ENODEV; + } + + set_bit(EV_SYN, input_dev->evbit); + set_bit(EV_ABS, input_dev->evbit); + set_bit(EV_KEY, input_dev->evbit); + set_bit(KEY_INT_CANCEL, input_dev->keybit); +#if defined(HX_PLATFOME_DEFINE_KEY) + himax_platform_key(); +#else + //set_bit(KEY_BACK, input_dev->keybit); + //set_bit(KEY_HOME, input_dev->keybit); + //set_bit(KEY_MENU, input_dev->keybit); + //set_bit(KEY_SEARCH, input_dev->keybit); +#endif +#if defined(HX_SMART_WAKEUP) + for (i = 0; i < GEST_SUP_NUM; i++) + set_bit(gest_key_def[i], input_dev->keybit); +#elif IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_INSPECT) || defined(HX_PALM_REPORT) + set_bit(KEY_POWER, input_dev->keybit); +#endif + set_bit(BTN_TOUCH, input_dev->keybit); + set_bit(propbit, input_dev->propbit); +#if defined(HX_EN_SEL_BUTTON) || defined(HX_EN_MUT_BUTTON) + set_bit(KEY_APPSELECT, input_dev->keybit); +#endif +#ifdef HX_PROTOCOL_A + /*input_dev->mtsize = ts->nFinger_support;*/ + input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, 3, 0, 0); +#else + set_bit(MT_TOOL_FINGER, input_dev->keybit); +#if defined(HX_PROTOCOL_B_3PA) + if (propbit == INPUT_PROP_DIRECT) + input_mt_init_slots(input_dev, ts->nFinger_support, INPUT_MT_DIRECT); + else + input_mt_init_slots(input_dev, ts->nFinger_support, INPUT_MT_POINTER); +#else + input_mt_init_slots(input_dev, ts->nFinger_support); +#endif +#endif + I("input_set_abs_params: mix_x %d, max_x %d, min_y %d, max_y %d\n", + ts->pdata->abs_x_min, ts->pdata->abs_x_max, ts->pdata->abs_y_min, ts->pdata->abs_y_max); + input_set_abs_params(input_dev, ABS_MT_POSITION_X, ts->pdata->abs_x_min, + ts->pdata->abs_x_max, ts->pdata->abs_x_fuzz, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, ts->pdata->abs_y_min, + ts->pdata->abs_y_max, ts->pdata->abs_y_fuzz, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, ts->pdata->abs_pressure_min, + ts->pdata->abs_pressure_max, ts->pdata->abs_pressure_fuzz, 0); + +#ifdef SEC_PALM_FUNC + input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, ts->pdata->abs_pressure_min, + ts->pdata->abs_pressure_max, ts->pdata->abs_pressure_fuzz, 0); + set_bit(BTN_PALM, input_dev->keybit); +#endif + +#ifndef HX_PROTOCOL_A + if (propbit != INPUT_PROP_POINTER) + input_set_abs_params(input_dev, ABS_MT_PRESSURE, ts->pdata->abs_pressure_min, + ts->pdata->abs_pressure_max, ts->pdata->abs_pressure_fuzz, 0); + input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, ts->pdata->abs_width_min, + ts->pdata->abs_width_max, ts->pdata->abs_pressure_fuzz, 0); +#endif + + if (himax_input_register_device(input_dev) == 0) + ret = NO_ERR; + else + ret = INPUT_REGISTER_FAIL; + + I("%s, input device %s registered.\n", __func__, input_dev->name); + + return ret; +} +EXPORT_SYMBOL(himax_input_register); + +static void calcDataSize(void) +{ + struct himax_ts_data *ts_data = private_ts; + + ts_data->x_channel = ic_data->HX_RX_NUM; + ts_data->y_channel = ic_data->HX_TX_NUM; + ts_data->nFinger_support = ic_data->HX_MAX_PT; + + ts_data->coord_data_size = 4 * ts_data->nFinger_support; + ts_data->area_data_size = ((ts_data->nFinger_support / 4) + (ts_data->nFinger_support % 4 ? 1 : 0)) * 4; + ts_data->coordInfoSize = ts_data->coord_data_size + ts_data->area_data_size + 4; + ts_data->raw_data_frame_size = 128 - ts_data->coord_data_size - ts_data->area_data_size - 4 - 4 - 1; + + if (ts_data->raw_data_frame_size == 0) { + E("%s: could NOT calculate!\n", __func__); + return; + } + + ts_data->raw_data_nframes = ((uint32_t)ts_data->x_channel * ts_data->y_channel + + ts_data->x_channel + ts_data->y_channel) / ts_data->raw_data_frame_size + + (((uint32_t)ts_data->x_channel * ts_data->y_channel + + ts_data->x_channel + ts_data->y_channel) % ts_data->raw_data_frame_size) ? 1 : 0; + I("%s: coord_data_size: %d, area_data_size:%d, raw_data_frame_size:%d, raw_data_nframes:%d\n", __func__, ts_data->coord_data_size, ts_data->area_data_size, ts_data->raw_data_frame_size, ts_data->raw_data_nframes); +} + +static void calculate_point_number(void) +{ + HX_TOUCH_INFO_POINT_CNT = ic_data->HX_MAX_PT * 4; + + if ((ic_data->HX_MAX_PT % 4) == 0) + HX_TOUCH_INFO_POINT_CNT += (ic_data->HX_MAX_PT / 4) * 4; + else + HX_TOUCH_INFO_POINT_CNT += ((ic_data->HX_MAX_PT / 4) + 1) * 4; +} +#if defined(HX_AUTO_UPDATE_FW) +static int himax_auto_update_check(void) +{ + int32_t ret; + //int flag_sys_ex_is_same = 0; + + I("%s:Entering!\n", __func__); + if (g_core_fp.fp_fw_ver_bin() == 0) { + I("%s: CID major, minor IC: %02X,%02X, bin: %02X,%02X\n", __func__, + ic_data->vendor_cid_maj_ver, ic_data->vendor_cid_min_ver, g_i_CID_MAJ, g_i_CID_MIN); + if ((ic_data->vendor_cid_maj_ver != g_i_CID_MAJ) || (ic_data->vendor_cid_min_ver < g_i_CID_MIN)) { + I("Need to update!\n"); + ret = NO_ERR; + } else if ((ic_data->vendor_cid_maj_ver == g_i_CID_MAJ) && + (ic_data->vendor_cid_min_ver == g_i_CID_MIN) && + (g_core_fp.fp_flash_lastdata_check(ic_data->flash_size, i_CTPM_FW, i_CTPM_FW_len) != 0)) { + I("last 4 bytes check failed!!!!!, need to update\n"); + ret = NO_ERR; + } else { + I("No need to update!\n"); + ret = 1; + } + } else { + E("FW bin fail!\n"); + ret = 1; + } + + return ret; +} + +static int i_get_FW(void) +{ + int ret = 0; + const struct firmware *image = NULL; + + I("file name = %s\n", private_ts->pdata->i_CTPM_firmware_name); + ret = request_firmware(&image, private_ts->pdata->i_CTPM_firmware_name, private_ts->dev); + if (ret < 0) { +#if defined(__EMBEDDED_FW__) + image = &g_embedded_fw; + I("%s: Couldn't find userspace FW, use embedded FW(size:%zu) instead.\n", + __func__, g_embedded_fw.size); +#else + E("%s,fail in line%d error code=%d\n", __func__, __LINE__, ret); + return OPEN_FILE_FAIL; +#endif + } + + if (image != NULL) { + i_CTPM_FW_len = image->size; + i_CTPM_FW = kcalloc(i_CTPM_FW_len, sizeof(char), GFP_KERNEL); + memcpy(i_CTPM_FW, image->data, sizeof(char)*i_CTPM_FW_len); + + I("%s firmware ver bin: %02X%02X%02X, firmware ver IC: %02X%02X%02X\n", __func__, + image->data[CID_VER_MAJ_FLASH_ADDR], image->data[PANEL_VERSION_ADDR], image->data[CID_VER_MIN_FLASH_ADDR], + ic_data->vendor_cid_maj_ver, ic_data->vendor_panel_ver, ic_data->vendor_cid_min_ver); + + } else { + I("%s: i_CTPM_FW = NULL\n", __func__); + return OPEN_FILE_FAIL; + } + + if (ret >= 0) + release_firmware(image); + ret = NO_ERR; + return ret; +} +static int i_update_FW(void) +{ + int upgrade_times = 0; + int8_t ret = 0, result = 0; + + himax_int_enable(0); + + +update_retry: + + if (i_CTPM_FW_len == FW_SIZE_32k) + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_32k(i_CTPM_FW, i_CTPM_FW_len, false); + else if (i_CTPM_FW_len == FW_SIZE_60k) + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_60k(i_CTPM_FW, i_CTPM_FW_len, false); + else if (i_CTPM_FW_len == FW_SIZE_64k) + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_64k(i_CTPM_FW, i_CTPM_FW_len, false); + else if (i_CTPM_FW_len == FW_SIZE_124k) + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_124k(i_CTPM_FW, i_CTPM_FW_len, false); + else if (i_CTPM_FW_len == FW_SIZE_128k) + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_128k(i_CTPM_FW, i_CTPM_FW_len, false); + else if (i_CTPM_FW_len == FW_SIZE_255k) + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_255k(i_CTPM_FW, i_CTPM_FW_len, false); + + if (ret == 0) { + upgrade_times++; + E("%s: TP upgrade error, upgrade_times = %d\n", __func__, upgrade_times); + + if (upgrade_times < 3) + goto update_retry; + else + result = -1; + + + } else { + g_core_fp.fp_read_FW_ver(); + g_core_fp.fp_touch_information(); + calculate_point_number(); + calcDataSize(); + result = 1;/*upgrade success*/ + I("%s: TP upgrade OK\n", __func__); + } + + kfree(i_CTPM_FW); + i_CTPM_FW = NULL; + +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(true, false); +#else + g_core_fp.fp_sense_on(0x00); +#endif + himax_int_enable(1); + return result; +} +#endif + + +static int himax_loadSensorConfig(struct himax_i2c_platform_data *pdata) +{ + I("%s: initialization complete\n", __func__); + return NO_ERR; +} + +#ifdef HX_ESD_RECOVERY +static void himax_esd_hw_reset(void) +{ +#ifdef HX_ZERO_FLASH + int result = 0; +#endif + if (g_ts_dbg != 0) + I("%s: Entering\n", __func__); + + I("START_Himax TP: ESD - Reset\n"); + + if (private_ts->in_self_test == 1) { + I("In self test , not TP: ESD - Reset\n"); + return; + } + + g_core_fp.fp_esd_ic_reset(); +#ifdef HX_ZERO_FLASH + I("It will update fw after esd event in zero flash mode!\n"); + result = g_core_fp.fp_0f_operation_dirly(); + if (result) { + E("Something is wrong! Skip Update with zero flash!\n"); + goto ESCAPE_0F_UPDATE; + } + g_core_fp.fp_reload_disable(0); + g_core_fp.fp_sense_on(0x00); + himax_report_all_leave_event(private_ts); + himax_int_enable(1); +ESCAPE_0F_UPDATE: +#endif + I("END_Himax TP: ESD - Reset\n"); +} +#endif + +#ifdef HX_SMART_WAKEUP +#ifdef HX_GESTURE_TRACK +static void gest_pt_log_coordinate(int rx, int tx) +{ + /*driver report x y with range 0 - 255 , we scale it up to x/y pixel*/ + gest_pt_x[gest_pt_cnt] = rx * (ic_data->HX_X_RES) / 255; + gest_pt_y[gest_pt_cnt] = tx * (ic_data->HX_Y_RES) / 255; +} +#endif +static int himax_wake_event_parse(struct himax_ts_data *ts, int ts_status) +{ + uint8_t *buf = wake_event_buffer; +#ifdef HX_GESTURE_TRACK + int tmp_max_x = 0x00, tmp_min_x = 0xFFFF, tmp_max_y = 0x00, tmp_min_y = 0xFFFF; + int gest_len; +#endif + int i = 0, check_FC = 0, ret; + int j = 0, gesture_pos = 0, gesture_flag = 0; + + if (g_ts_dbg != 0) + I("%s: Entering!, ts_status=%d\n", __func__, ts_status); + + if (buf == NULL) { + ret = -ENOMEM; + goto END; + } + + memcpy(buf, hx_touch_data->hx_event_buf, hx_touch_data->event_size); + + for (i = 0; i < GEST_PTLG_ID_LEN; i++) { + for (j = 0; j < GEST_SUP_NUM; j++) { + if (buf[i] == gest_event[j]) { + gesture_flag = buf[i]; + gesture_pos = j; + break; + } + } + I("0x%2.2X ", buf[i]); + if (buf[i] == gesture_flag) { + check_FC++; + } else { + I("ID START at %x , value = 0x%2X skip the event\n", i, buf[i]); + break; + } + } + + I("Himax gesture_flag= %x\n", gesture_flag); + I("Himax check_FC is %d\n", check_FC); + + if (check_FC != GEST_PTLG_ID_LEN) { + ret = 0; + goto END; + } + + if (buf[GEST_PTLG_ID_LEN] != GEST_PTLG_HDR_ID1 || + buf[GEST_PTLG_ID_LEN + 1] != GEST_PTLG_HDR_ID2) { + ret = 0; + goto END; + } + +#ifdef HX_GESTURE_TRACK + + if (buf[GEST_PTLG_ID_LEN] == GEST_PTLG_HDR_ID1 && + buf[GEST_PTLG_ID_LEN + 1] == GEST_PTLG_HDR_ID2) { + gest_len = buf[GEST_PTLG_ID_LEN + 2]; + I("gest_len = %d\n", gest_len); + i = 0; + gest_pt_cnt = 0; + I("gest doornidate start\n %s", __func__); + + while (i < (gest_len + 1) / 2) { + gest_pt_log_coordinate(buf[GEST_PTLG_ID_LEN + 4 + i * 2], buf[GEST_PTLG_ID_LEN + 4 + i * 2 + 1]); + i++; + I("gest_pt_x[%d]=%d\n", gest_pt_cnt, gest_pt_x[gest_pt_cnt]); + I("gest_pt_y[%d]=%d\n", gest_pt_cnt, gest_pt_y[gest_pt_cnt]); + gest_pt_cnt += 1; + } + + if (gest_pt_cnt) { + for (i = 0; i < gest_pt_cnt; i++) { + if (tmp_max_x < gest_pt_x[i]) + tmp_max_x = gest_pt_x[i]; + if (tmp_min_x > gest_pt_x[i]) + tmp_min_x = gest_pt_x[i]; + if (tmp_max_y < gest_pt_y[i]) + tmp_max_y = gest_pt_y[i]; + if (tmp_min_y > gest_pt_y[i]) + tmp_min_y = gest_pt_y[i]; + } + + I("gest_point x_min= %d, x_max= %d, y_min= %d, y_max= %d\n", tmp_min_x, tmp_max_x, tmp_min_y, tmp_max_y); + gest_start_x = gest_pt_x[0]; + hx_gesture_coor[0] = gest_start_x; + gest_start_y = gest_pt_y[0]; + hx_gesture_coor[1] = gest_start_y; + gest_end_x = gest_pt_x[gest_pt_cnt - 1]; + hx_gesture_coor[2] = gest_end_x; + gest_end_y = gest_pt_y[gest_pt_cnt - 1]; + hx_gesture_coor[3] = gest_end_y; + gest_width = tmp_max_x - tmp_min_x; + hx_gesture_coor[4] = gest_width; + gest_height = tmp_max_y - tmp_min_y; + hx_gesture_coor[5] = gest_height; + gest_mid_x = (tmp_max_x + tmp_min_x) / 2; + hx_gesture_coor[6] = gest_mid_x; + gest_mid_y = (tmp_max_y + tmp_min_y) / 2; + hx_gesture_coor[7] = gest_mid_y; + hx_gesture_coor[8] = gest_mid_x;/*gest_up_x*/ + hx_gesture_coor[9] = gest_mid_y - gest_height / 2; /*gest_up_y*/ + hx_gesture_coor[10] = gest_mid_x;/*gest_down_x*/ + hx_gesture_coor[11] = gest_mid_y + gest_height / 2; /*gest_down_y*/ + hx_gesture_coor[12] = gest_mid_x - gest_width / 2; /*gest_left_x*/ + hx_gesture_coor[13] = gest_mid_y; /*gest_left_y*/ + hx_gesture_coor[14] = gest_mid_x + gest_width / 2; /*gest_right_x*/ + hx_gesture_coor[15] = gest_mid_y; /*gest_right_y*/ + } + } + +#endif + + if (!ts->gesture_cust_en[gesture_pos]) { + I("%s NOT report key [%d] = %d\n", __func__, gesture_pos, gest_key_def[gesture_pos]); + g_target_report_data->SMWP_event_chk = 0; + ret = 0; + } else { + g_target_report_data->SMWP_event_chk = gest_key_def[gesture_pos]; + ret = gesture_pos; + } +END: + return ret; +} + +static void himax_wake_event_report(void) +{ + int KEY_EVENT = g_target_report_data->SMWP_event_chk; + + if (g_ts_dbg != 0) + I("%s: Entering!\n", __func__); + + if (KEY_EVENT) { + I(" %s SMART WAKEUP KEY event %d press\n", __func__, KEY_EVENT); + input_report_key(private_ts->input_dev, KEY_WAKEUP, 1); + input_sync(private_ts->input_dev); + I(" %s SMART WAKEUP KEY event %d release\n", __func__, KEY_EVENT); + input_report_key(private_ts->input_dev, KEY_WAKEUP, 0); + input_sync(private_ts->input_dev); + FAKE_POWER_KEY_SEND = true; +#ifdef HX_GESTURE_TRACK + I("gest_start_x= %d, gest_start_y= %d, gest_end_x= %d, gest_end_y= %d\n", gest_start_x, gest_start_y, + gest_end_x, gest_end_y); + I("gest_width= %d, gest_height= %d, gest_mid_x= %d, gest_mid_y= %d\n", gest_width, gest_height, + gest_mid_x, gest_mid_y); + I("gest_up_x= %d, gest_up_y= %d, gest_down_x= %d, gest_down_y= %d\n", hx_gesture_coor[8], hx_gesture_coor[9], + hx_gesture_coor[10], hx_gesture_coor[11]); + I("gest_left_x= %d, gest_left_y= %d, gest_right_x= %d, gest_right_y= %d\n", hx_gesture_coor[12], hx_gesture_coor[13], + hx_gesture_coor[14], hx_gesture_coor[15]); +#endif + g_target_report_data->SMWP_event_chk = 0; + } +} + +#endif + +int himax_report_data_init(void) +{ + if (hx_touch_data->hx_coord_buf != NULL) { + kfree(hx_touch_data->hx_coord_buf); + hx_touch_data->hx_coord_buf = NULL; + } + + if (hx_touch_data->hx_rawdata_buf != NULL) { + kfree(hx_touch_data->hx_rawdata_buf); + hx_touch_data->hx_rawdata_buf = NULL; + } + +#if defined(HX_SMART_WAKEUP) + hx_touch_data->event_size = g_core_fp.fp_get_touch_data_size(); + + if (hx_touch_data->hx_event_buf != NULL) { + kfree(hx_touch_data->hx_event_buf); + hx_touch_data->hx_event_buf = NULL; + } + + if (wake_event_buffer != NULL) { + kfree(wake_event_buffer); + wake_event_buffer = NULL; + } + +#endif + hx_touch_data->touch_all_size = g_core_fp.fp_get_touch_data_size(); + hx_touch_data->raw_cnt_max = ic_data->HX_MAX_PT / 4; + hx_touch_data->raw_cnt_rmd = ic_data->HX_MAX_PT % 4; + /* more than 4 fingers */ + if (hx_touch_data->raw_cnt_rmd != 0x00) { + hx_touch_data->rawdata_size = g_core_fp.fp_cal_data_len(hx_touch_data->raw_cnt_rmd, ic_data->HX_MAX_PT, hx_touch_data->raw_cnt_max); + hx_touch_data->touch_info_size = (ic_data->HX_MAX_PT + hx_touch_data->raw_cnt_max + 2) * 4; + } else { /* less than 4 fingers */ + hx_touch_data->rawdata_size = g_core_fp.fp_cal_data_len(hx_touch_data->raw_cnt_rmd, ic_data->HX_MAX_PT, hx_touch_data->raw_cnt_max); + hx_touch_data->touch_info_size = (ic_data->HX_MAX_PT + hx_touch_data->raw_cnt_max + 1) * 4; + } +#ifdef SEC_PALM_FUNC + hx_touch_data->touch_info_size += SEC_FINGER_INFO_SZ; + hx_touch_data->rawdata_size -= SEC_FINGER_INFO_SZ; +#endif + if ((ic_data->HX_TX_NUM * ic_data->HX_RX_NUM + ic_data->HX_TX_NUM + ic_data->HX_RX_NUM) % hx_touch_data->rawdata_size == 0) + hx_touch_data->rawdata_frame_size = (ic_data->HX_TX_NUM * ic_data->HX_RX_NUM + ic_data->HX_TX_NUM + ic_data->HX_RX_NUM) / hx_touch_data->rawdata_size; + else + hx_touch_data->rawdata_frame_size = (ic_data->HX_TX_NUM * ic_data->HX_RX_NUM + ic_data->HX_TX_NUM + ic_data->HX_RX_NUM) / hx_touch_data->rawdata_size + 1; + + I("%s: rawdata_frame_size = %d\n", __func__, hx_touch_data->rawdata_frame_size); + I("%s: ic_data->HX_MAX_PT:%d, hx_raw_cnt_max:%d, hx_raw_cnt_rmd:%d, g_hx_rawdata_size:%d, hx_touch_data->touch_info_size:%d\n", __func__, ic_data->HX_MAX_PT, hx_touch_data->raw_cnt_max, hx_touch_data->raw_cnt_rmd, hx_touch_data->rawdata_size, hx_touch_data->touch_info_size); + hx_touch_data->hx_coord_buf = kzalloc(sizeof(uint8_t) * (hx_touch_data->touch_info_size), GFP_KERNEL); + + if (hx_touch_data->hx_coord_buf == NULL) + goto mem_alloc_fail; + + if (g_target_report_data == NULL) { + g_target_report_data = kzalloc(sizeof(struct himax_target_report_data), GFP_KERNEL); + if (g_target_report_data == NULL) + goto mem_alloc_fail; + g_target_report_data->x = kzalloc(sizeof(int)*(ic_data->HX_MAX_PT), GFP_KERNEL); + if (g_target_report_data->x == NULL) + goto mem_alloc_fail; + g_target_report_data->y = kzalloc(sizeof(int)*(ic_data->HX_MAX_PT), GFP_KERNEL); + if (g_target_report_data->y == NULL) + goto mem_alloc_fail; + g_target_report_data->w = kzalloc(sizeof(int)*(ic_data->HX_MAX_PT), GFP_KERNEL); + if (g_target_report_data->w == NULL) + goto mem_alloc_fail; +#ifdef SEC_PALM_FUNC + g_target_report_data->maj = kzalloc(sizeof(int)*(ic_data->HX_MAX_PT), GFP_KERNEL); + if (g_target_report_data->maj == NULL) + goto mem_alloc_fail; + g_target_report_data->min = kzalloc(sizeof(int)*(ic_data->HX_MAX_PT), GFP_KERNEL); + if (g_target_report_data->min == NULL) + goto mem_alloc_fail; + g_target_report_data->palm = kzalloc(sizeof(int)*(ic_data->HX_MAX_PT), GFP_KERNEL); + if (g_target_report_data->palm == NULL) + goto mem_alloc_fail; +#endif + g_target_report_data->finger_id = kzalloc(sizeof(int)*(ic_data->HX_MAX_PT), GFP_KERNEL); + if (g_target_report_data->finger_id == NULL) + goto mem_alloc_fail; + g_target_report_data->mv_cnt = kzalloc(sizeof(int)*(ic_data->HX_MAX_PT), GFP_KERNEL); + if (g_target_report_data->mv_cnt == NULL) + goto mem_alloc_fail; + } +#ifdef HX_SMART_WAKEUP + g_target_report_data->SMWP_event_chk = 0; + wake_event_buffer = kcalloc(hx_touch_data->event_size, sizeof(uint8_t), GFP_KERNEL); + if (wake_event_buffer == NULL) + goto mem_alloc_fail; +#endif + + hx_touch_data->hx_rawdata_buf = kzalloc(sizeof(uint8_t) * (hx_touch_data->touch_all_size - hx_touch_data->touch_info_size), GFP_KERNEL); + + if (hx_touch_data->hx_rawdata_buf == NULL) + goto mem_alloc_fail; + +#if defined(HX_SMART_WAKEUP) + hx_touch_data->hx_event_buf = kzalloc(sizeof(uint8_t) * (hx_touch_data->event_size), GFP_KERNEL); + + if (hx_touch_data->hx_event_buf == NULL) + goto mem_alloc_fail; + +#endif + return NO_ERR; +mem_alloc_fail: + if(g_target_report_data != NULL) { + if (g_target_report_data->finger_id != NULL) { + kfree(g_target_report_data->finger_id); + g_target_report_data->finger_id = NULL; + } +#ifdef SEC_PALM_FUNC + if (g_target_report_data->palm != NULL) { + kfree(g_target_report_data->palm); + g_target_report_data->palm = NULL; + } + if (g_target_report_data->min != NULL) { + kfree(g_target_report_data->min); + g_target_report_data->min = NULL; + } + if (g_target_report_data->maj != NULL) { + kfree(g_target_report_data->maj); + g_target_report_data->maj = NULL; + } +#endif + if (g_target_report_data->w != NULL) { + kfree(g_target_report_data->w); + g_target_report_data->w = NULL; + } + if (g_target_report_data->y != NULL) { + kfree(g_target_report_data->y); + g_target_report_data->y = NULL; + } + if (g_target_report_data->x != NULL) { + kfree(g_target_report_data->x); + g_target_report_data->x = NULL; + } + if (g_target_report_data->mv_cnt != NULL) { + kfree(g_target_report_data->mv_cnt); + g_target_report_data->mv_cnt = NULL; + } + kfree(g_target_report_data); + g_target_report_data = NULL; + } + +#if defined(HX_SMART_WAKEUP) + if (wake_event_buffer != NULL) { + kfree(wake_event_buffer); + wake_event_buffer = NULL; + } + if (hx_touch_data->hx_event_buf != NULL) { + kfree(hx_touch_data->hx_event_buf); + hx_touch_data->hx_event_buf = NULL; + } +#endif + if (hx_touch_data->hx_rawdata_buf != NULL) { + kfree(hx_touch_data->hx_rawdata_buf); + hx_touch_data->hx_rawdata_buf = NULL; + } + if (hx_touch_data->hx_coord_buf != NULL) { + kfree(hx_touch_data->hx_coord_buf); + hx_touch_data->hx_coord_buf = NULL; + } + + I("%s: Memory allocate fail!\n", __func__); + return MEM_ALLOC_FAIL; +} +EXPORT_SYMBOL(himax_report_data_init); + +void himax_report_data_deinit(void) +{ + kfree(g_target_report_data->finger_id); + g_target_report_data->finger_id = NULL; +#ifdef SEC_PALM_FUNC + kfree(g_target_report_data->palm); + g_target_report_data->palm = NULL; + kfree(g_target_report_data->min); + g_target_report_data->min = NULL; + kfree(g_target_report_data->maj); + g_target_report_data->maj = NULL; +#endif + kfree(g_target_report_data->w); + g_target_report_data->w = NULL; + kfree(g_target_report_data->y); + g_target_report_data->y = NULL; + kfree(g_target_report_data->x); + g_target_report_data->x = NULL; + kfree(g_target_report_data); + g_target_report_data = NULL; + +#if defined(HX_SMART_WAKEUP) + kfree(wake_event_buffer); + wake_event_buffer = NULL; + kfree(hx_touch_data->hx_event_buf); + hx_touch_data->hx_event_buf = NULL; +#endif + kfree(hx_touch_data->hx_rawdata_buf); + hx_touch_data->hx_rawdata_buf = NULL; + kfree(hx_touch_data->hx_coord_buf); + hx_touch_data->hx_coord_buf = NULL; +} + +/*start ts_work*/ +#if defined(HX_USB_DETECT_GLOBAL) +void himax_cable_detect_func(bool force_renew) +{ + struct himax_ts_data *ts; + + /*u32 connect_status = 0;*/ + uint8_t connect_status = 0; + + connect_status = USB_detect_flag;/* upmu_is_chr_det(); */ + ts = private_ts; + + /* I("Touch: cable status=%d, cable_config=%p, usb_connected=%d\n", connect_status, ts->cable_config, ts->usb_connected); */ + if (ts->cable_config) { + if ((connect_status != ts->usb_connected) || force_renew) { + if (connect_status) { + ts->cable_config[1] = 0x01; + ts->usb_connected = 0x01; + } else { + ts->cable_config[1] = 0x00; + ts->usb_connected = 0x00; + } + + g_core_fp.fp_usb_detect_set(ts->cable_config); + I("%s: Cable status change: 0x%2.2X\n", __func__, ts->usb_connected); + } + + /*else */ + /*I("%s: Cable status is the same as previous one, ignore.\n", __func__); */ + } +} +#endif + + +static void location_detect(struct himax_ts_data *ts, char *loc, int x, int y) +{ + memset(loc, 0, 4); + + if (ts->pdata) { + if (x < ts->pdata->area_edge) + strncat(loc, "E.", 2); + else if (x < (ts->pdata->screenWidth - ts->pdata->area_edge)) + strncat(loc, "C.", 2); + else + strncat(loc, "e.", 2); + + if (y < ts->pdata->area_indicator) + strncat(loc, "S", 1); + else if (y < (ts->pdata->screenHeight - ts->pdata->area_navigation)) + strncat(loc, "C", 1); + else + strncat(loc, "N", 1); + } +} + +void hx_log_touch_event(struct himax_ts_data *ts) +{ + int loop_i = 0; + char loc[4] = { 0 }; + int x = 0, y = 0, mc = 0, ma = 0, mi = 0; + + for (loop_i = 0; loop_i < ts->nFinger_support; loop_i++) { + if ((((ts->old_finger >> loop_i & 1) == 0) + && (g_target_report_data->finger_id[loop_i] == 1))) { + ts->touch_count++; + ts->p_x[loop_i] = x = ts->pre_finger_data[loop_i][0]; + ts->p_y[loop_i] = y = ts->pre_finger_data[loop_i][1]; +#ifdef SEC_PALM_FUNC + ma = ts->pre_finger_data[loop_i][4]; + mi = ts->pre_finger_data[loop_i][5]; +#else + ma = mi = ts->pre_finger_data[loop_i][2]; +#endif + location_detect(ts, loc, x, y); +#if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) + I("[P] tID:%d.%d x:%d y:%d p:%d major:%d minor:%d loc:%s tc:%d\n", + loop_i, + (ts->input_dev->mt->trkid - 1) & TRKID_MAX, x, y, + g_target_report_data->palm[loop_i], ma, mi, loc, + ts->touch_count); +#else + I("[P] tID:%d.%d p:%d major:%d minor:%d loc:%s tc:%d\n", + loop_i, + (ts->input_dev->mt->trkid - 1) & TRKID_MAX, + g_target_report_data->palm[loop_i], ma, mi, loc, + ts->touch_count); +#endif + } else + if ((((ts->old_finger >> loop_i & 1) == 1) + && (g_target_report_data->finger_id[loop_i] == 0))) { + if (ts->touch_count > 0) + ts->touch_count--; + if (ts->touch_count == 0) + ts->print_info_cnt_release = 0; + + x = ts->pre_finger_data[loop_i][0]; + y = ts->pre_finger_data[loop_i][1]; + mc = ts->pre_finger_data[loop_i][3]; + + location_detect(ts, loc, x, y); +#if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) + I("[R] tID:%d loc:%s dd:%d,%d pc:%d mc:%d tc:%d lx:%d ly:%d\n", + loop_i, loc, x - ts->p_x[loop_i], y - ts->p_y[loop_i], + bitmap_weight(&ts->palm_flag, ts->nFinger_support), + mc, ts->touch_count, x, y); +#else + I("[R] tID:%d loc:%s dd:%d,%d pc:%d mc:%d tc:%d\n", + loop_i, loc, x - ts->p_x[loop_i], y - ts->p_y[loop_i], + bitmap_weight(&ts->palm_flag, ts->nFinger_support), + mc, ts->touch_count); +#endif + } + } +} + +static int himax_ts_work_status(struct himax_ts_data *ts) +{ + /* 1: normal, 2:SMWP */ + int result = HX_REPORT_COORD; + + hx_touch_data->diag_cmd = ts->diag_cmd; + if (hx_touch_data->diag_cmd) + result = HX_REPORT_COORD_RAWDATA; + +#ifdef HX_SMART_WAKEUP + if (atomic_read(&ts->suspend_mode) && (!FAKE_POWER_KEY_SEND) && (ts->SMWP_enable) && (!hx_touch_data->diag_cmd)) + result = HX_REPORT_SMWP_EVENT; +#endif + /* I("Now Status is %d\n", result); */ + return result; +} + +static int himax_touch_get(struct himax_ts_data *ts, uint8_t *buf, int ts_path, int ts_status) +{ + if (g_ts_dbg != 0) + I("%s: Entering, ts_status=%d!\n", __func__, ts_status); + + switch (ts_path) { + /*normal*/ + case HX_REPORT_COORD: + if ((HX_HW_RESET_ACTIVATE) +#ifdef HX_ESD_RECOVERY + || (HX_ESD_RESET_ACTIVATE) +#endif + ) { + if (!g_core_fp.fp_read_event_stack(buf, 128)) { + E("%s: can't read data from chip!\n", __func__); + ts_status = HX_TS_GET_DATA_FAIL; + } + } else { + if (!g_core_fp.fp_read_event_stack(buf, hx_touch_data->touch_info_size)) { + E("%s: can't read data from chip!\n", __func__); + ts_status = HX_TS_GET_DATA_FAIL; + } + } + break; +#if defined(HX_SMART_WAKEUP) + + /*SMWP*/ + case HX_REPORT_SMWP_EVENT: + __pm_wakeup_event(ts->ts_SMWP_wake_lock, TS_WAKE_LOCK_TIMEOUT); + msleep(20); + g_core_fp.fp_burst_enable(0); + + if (!g_core_fp.fp_read_event_stack(buf, hx_touch_data->event_size)) { + E("%s: can't read data from chip!\n", __func__); + ts_status = HX_TS_GET_DATA_FAIL; + } + break; +#endif + case HX_REPORT_COORD_RAWDATA: + if (!g_core_fp.fp_read_event_stack(buf, 128)) { + E("%s: can't read data from chip!\n", __func__); + ts_status = HX_TS_GET_DATA_FAIL; + } + break; + default: + break; + } + + return ts_status; +} + +/* start error_control*/ +static int himax_checksum_cal(struct himax_ts_data *ts, uint8_t *buf, int ts_path, int ts_status) +{ + uint16_t check_sum_cal = 0; + int32_t i = 0; + int length = 0; + int zero_cnt = 0; + int raw_data_sel = 0; + int ret_val = ts_status; + + if (g_ts_dbg != 0) + I("%s: Entering, ts_status=%d!\n", __func__, ts_status); + + /* Normal */ + switch (ts_path) { + case HX_REPORT_COORD: + length = hx_touch_data->touch_info_size; + break; +#if defined(HX_SMART_WAKEUP) +/* SMWP */ + case HX_REPORT_SMWP_EVENT: + length = (GEST_PTLG_ID_LEN + GEST_PTLG_HDR_LEN); + break; +#endif + case HX_REPORT_COORD_RAWDATA: + length = hx_touch_data->touch_info_size; + break; + default: + I("%s, Neither Normal Nor SMWP error!\n", __func__); + ret_val = HX_PATH_FAIL; + goto END_FUNCTION; + } + + for (i = 0; i < length; i++) { + check_sum_cal += buf[i]; + if (buf[i] == 0x00) + zero_cnt++; + } + + if (check_sum_cal % 0x100 != 0) { + I("[HIMAX TP MSG] point data_checksum not match : check_sum_cal: 0x%02X\n", check_sum_cal); + ret_val = HX_CHKSUM_FAIL; + } else if (zero_cnt == length) { + if (ts->use_irq) + I("[HIMAX TP MSG] All Zero event\n"); + + ret_val = HX_CHKSUM_FAIL; + } else { + raw_data_sel = buf[HX_TOUCH_INFO_POINT_CNT]>>4 & 0x0F; + /*I("%s:raw_out_sel=%x , hx_touch_data->diag_cmd=%x.\n", __func__, raw_data_sel, hx_touch_data->diag_cmd);*/ + if ((raw_data_sel != 0x0F) && (raw_data_sel != hx_touch_data->diag_cmd)) {/*raw data out not match skip it*/ + /*I("%s:raw data out not match.\n", __func__);*/ + if (!hx_touch_data->diag_cmd) { + g_core_fp.fp_read_event_stack(buf, (128-hx_touch_data->touch_info_size));/*Need to clear event stack here*/ + /*I("%s: size =%d, buf[0]=%x ,buf[1]=%x, buf[2]=%x, buf[3]=%x.\n", __func__,(128-hx_touch_data->touch_info_size), buf[0], buf[1], buf[2], buf[3]);*/ + /*I("%s:also clear event stack.\n", __func__);*/ + } + ret_val = HX_READY_SERVE; + } + } + +END_FUNCTION: + if (g_ts_dbg != 0) + I("%s: END, ret_val=%d!\n", __func__, ret_val); + return ret_val; +} + +#ifdef HX_ESD_RECOVERY +#ifdef HX_ZERO_FLASH +void hx_update_dirly_0f(void) +{ + I("It will update fw after esd event in zero flash mode!\n"); + g_core_fp.fp_0f_operation_dirly(); +} +#endif +static int himax_ts_event_check(struct himax_ts_data *ts, uint8_t *buf, int ts_path, int ts_status) +{ + int hx_EB_event = 0; + int hx_EC_event = 0; + int hx_ED_event = 0; + int hx_esd_event = 0; + int hx_zero_event = 0; + int shaking_ret = 0; + + int32_t loop_i = 0; + int length = 0; + int ret_val = ts_status; + + if (g_ts_dbg != 0) + I("%s: Entering, ts_status=%d!\n", __func__, ts_status); + + /* Normal */ + switch (ts_path) { + case HX_REPORT_COORD: +#ifdef SEC_PALM_FUNC + length = ts->coordInfoSize; +#else + length = hx_touch_data->touch_info_size; +#endif + break; +#if defined(HX_SMART_WAKEUP) +/* SMWP */ + case HX_REPORT_SMWP_EVENT: + length = (GEST_PTLG_ID_LEN + GEST_PTLG_HDR_LEN); + break; +#endif + case HX_REPORT_COORD_RAWDATA: +#ifdef SEC_PALM_FUNC + length = ts->coordInfoSize; +#else + length = hx_touch_data->touch_info_size; +#endif + break; + default: + I("%s, Neither Normal Nor SMWP error!\n", __func__); + ret_val = HX_PATH_FAIL; + goto END_FUNCTION; + } + + if (g_ts_dbg != 0) + I("Now Path=%d, Now status=%d, length=%d\n", ts_path, ts_status, length); + + if (ts_path == HX_REPORT_COORD || ts_path == HX_REPORT_COORD_RAWDATA) { + for (loop_i = 0; loop_i < length; loop_i++) { + /* case 1 ESD recovery flow */ + if (buf[loop_i] == 0xEB) { + hx_EB_event++; + } else if (buf[loop_i] == 0xEC) { + hx_EC_event++; + } else if (buf[loop_i] == 0xED) { + hx_ED_event++; + } else if (buf[loop_i] == 0x00) { /* case 2 ESD recovery flow-Disable */ + hx_zero_event++; + } else { + g_zero_event_count = 0; + break; + } + } + } + + if (hx_EB_event == length) { + hx_esd_event = length; + hx_EB_event_flag++; + I("[HIMAX TP MSG]: ESD event checked - ALL 0xEB.\n"); + } else if (hx_EC_event == length) { + hx_esd_event = length; + hx_EC_event_flag++; + I("[HIMAX TP MSG]: ESD event checked - ALL 0xEC.\n"); + } else if (hx_ED_event == length) { + hx_esd_event = length; + hx_ED_event_flag++; + I("[HIMAX TP MSG]: ESD event checked - ALL 0xED.\n"); + } + + if ((hx_esd_event == length || hx_zero_event == length) + && (HX_HW_RESET_ACTIVATE == 0) + && (HX_ESD_RESET_ACTIVATE == 0) + && (hx_touch_data->diag_cmd == 0) + && (ts->in_self_test == 0)) { + shaking_ret = g_core_fp.fp_ic_esd_recovery(hx_esd_event, hx_zero_event, length); + + if (shaking_ret == HX_ESD_EVENT) { + himax_esd_hw_reset(); + ret_val = HX_ESD_EVENT; + } else if (shaking_ret == HX_ZERO_EVENT_COUNT) { + ret_val = HX_ZERO_EVENT_COUNT; + } else { + I("I2C running. Nothing to be done!\n"); + ret_val = HX_IC_RUNNING; + } + } else if (HX_ESD_RESET_ACTIVATE) { /* drop 1st interrupts after chip reset */ + HX_ESD_RESET_ACTIVATE = 0; + I("[HX_ESD_RESET_ACTIVATE]:%s: Back from reset, ready to serve.\n", __func__); + ret_val = HX_ESD_REC_OK; + } + +END_FUNCTION: + if (g_ts_dbg != 0) + I("%s: END, ret_val=%d!\n", __func__, ret_val); + + return ret_val; +} +#endif + +static int himax_err_ctrl(struct himax_ts_data *ts, uint8_t *buf, int ts_path, int ts_status) +{ +#ifdef HX_RST_PIN_FUNC + if (HX_HW_RESET_ACTIVATE) { + /* drop 1st interrupts after chip reset */ + HX_HW_RESET_ACTIVATE = 0; + I("[HX_HW_RESET_ACTIVATE]:%s: Back from reset, ready to serve.\n", __func__); + ts_status = HX_RST_OK; + goto END_FUNCTION; + } +#endif + + ts_status = himax_checksum_cal(ts, buf, ts_path, ts_status); + if (ts_status == HX_CHKSUM_FAIL) { + goto CHK_FAIL; + } else { +#ifdef HX_ESD_RECOVERY + /* continuous N times record, not total N times. */ + g_zero_event_count = 0; +#endif + goto END_FUNCTION; + } + +CHK_FAIL: +#ifdef HX_ESD_RECOVERY + ts_status = himax_ts_event_check(ts, buf, ts_path, ts_status); +#endif + + +END_FUNCTION: + if (g_ts_dbg != 0) + I("%s: END, ts_status=%d!\n", __func__, ts_status); + return ts_status; +} +/* end error_control*/ + +/* start distribute_data*/ +static int himax_distribute_touch_data(uint8_t *buf, int ts_path, int ts_status) +{ + uint8_t hx_state_info_pos = hx_touch_data->touch_info_size - 3; + +#ifdef SEC_PALM_FUNC + hx_state_info_pos -= SEC_FINGER_INFO_SZ; +#endif + + if (g_ts_dbg != 0) + I("%s: Entering, ts_status=%d!\n", __func__, ts_status); + + if (ts_path == HX_REPORT_COORD) { + memcpy(hx_touch_data->hx_coord_buf, &buf[0], hx_touch_data->touch_info_size); + + if (buf[hx_state_info_pos] != 0xFF && buf[hx_state_info_pos + 1] != 0xFF) + memcpy(hx_touch_data->hx_state_info, &buf[hx_state_info_pos], 2); + else + memset(hx_touch_data->hx_state_info, 0x00, sizeof(hx_touch_data->hx_state_info)); + + if ((HX_HW_RESET_ACTIVATE) +#ifdef HX_ESD_RECOVERY + || (HX_ESD_RESET_ACTIVATE) +#endif + ) { + memcpy(hx_touch_data->hx_rawdata_buf, &buf[hx_touch_data->touch_info_size], hx_touch_data->touch_all_size - hx_touch_data->touch_info_size); + } + } else if (ts_path == HX_REPORT_COORD_RAWDATA) { + memcpy(hx_touch_data->hx_coord_buf, &buf[0], hx_touch_data->touch_info_size); + + if (buf[hx_state_info_pos] != 0xFF && buf[hx_state_info_pos + 1] != 0xFF) + memcpy(hx_touch_data->hx_state_info, &buf[hx_state_info_pos], 2); + else + memset(hx_touch_data->hx_state_info, 0x00, sizeof(hx_touch_data->hx_state_info)); + + memcpy(hx_touch_data->hx_rawdata_buf, &buf[hx_touch_data->touch_info_size], hx_touch_data->touch_all_size - hx_touch_data->touch_info_size); +#if defined(HX_SMART_WAKEUP) + } else if (ts_path == HX_REPORT_SMWP_EVENT) { + memcpy(hx_touch_data->hx_event_buf, buf, hx_touch_data->event_size); +#endif + } else { + E("%s, Fail Path!\n", __func__); + ts_status = HX_PATH_FAIL; + } + /* debug info start */ + if (buf[hx_state_info_pos] != 0xFF && buf[hx_state_info_pos + 1] != 0xFF) { +#ifdef HX_NEW_EVENT_STACK_FORMAT + if (g_last_fw_irq_flag != hx_touch_data->hx_state_info[0]) { + if ((g_last_fw_irq_flag & 0x03) != (hx_touch_data->hx_state_info[0] & 0x03)) + I("%s ReCal change to %d\n", + HIMAX_LOG_TAG, hx_touch_data->hx_state_info[0] & 0x03); + if ((g_last_fw_irq_flag >> 3 & 0x01) != (hx_touch_data->hx_state_info[0] >> 3 & 0x01)) + I("%s Palm change to %d\n", + HIMAX_LOG_TAG, hx_touch_data->hx_state_info[0] >> 3 & 0x01); + if ((g_last_fw_irq_flag >> 7 & 0x01) != (hx_touch_data->hx_state_info[0] >> 7 & 0x01)) + I("%s AC mode change to %d\n", + HIMAX_LOG_TAG, hx_touch_data->hx_state_info[0] >> 7 & 0x01); + if ((g_last_fw_irq_flag >> 5 & 0x01) != (hx_touch_data->hx_state_info[0] >> 5 & 0x01)) + I("%s Water change to %d\n", + HIMAX_LOG_TAG, hx_touch_data->hx_state_info[0] >> 5 & 0x01); + if ((g_last_fw_irq_flag >> 6 & 0x01) != (hx_touch_data->hx_state_info[0] >> 6 & 0x01)) + I("%s TX Hop change to %d\n", + HIMAX_LOG_TAG, hx_touch_data->hx_state_info[0] >> 6 & 0x01); + } + if (g_last_fw_irq_flag2 != hx_touch_data->hx_state_info[1]) { + if ((g_last_fw_irq_flag2 & 0x01) != (hx_touch_data->hx_state_info[1] & 0x01)) + I("%s High Sensitivity change to %d\n", + HIMAX_LOG_TAG, hx_touch_data->hx_state_info[1] & 0x01); + + private_ts->noise_mode = hx_touch_data->hx_state_info[1] >> 3 & 0x01; + if ((g_last_fw_irq_flag2 >> 3 & 0x01) != private_ts->noise_mode) { + I("%s nosie mode change to %d\n", + HIMAX_LOG_TAG, private_ts->noise_mode); + } + + private_ts->lamp_noise_mode = hx_touch_data->hx_state_info[1] >> 4 & 0x01; + if ((g_last_fw_irq_flag2 >> 4 & 0x01) != private_ts->lamp_noise_mode) { + I("%s lamp noise mode change to %d\n", + HIMAX_LOG_TAG, private_ts->lamp_noise_mode); + } + } + g_last_fw_irq_flag = hx_touch_data->hx_state_info[0]; + g_last_fw_irq_flag2 = hx_touch_data->hx_state_info[1]; +#else + if (g_last_fw_irq_flag != hx_touch_data->hx_state_info[0]) { + if ((g_last_fw_irq_flag & 0x01) != (hx_touch_data->hx_state_info[0] & 0x01)) + I("%s ReCal change to %d\n", + HIMAX_LOG_TAG, hx_touch_data->hx_state_info[0] & 0x01); + if ((g_last_fw_irq_flag >> 1 & 0x01) != (hx_touch_data->hx_state_info[0] >> 1 & 0x01)) + I("%s Palm change to %d\n", + HIMAX_LOG_TAG, hx_touch_data->hx_state_info[0] >> 1 & 0x01); + if ((g_last_fw_irq_flag >> 2 & 0x01) != (hx_touch_data->hx_state_info[0] >> 2 & 0x01)) + I("%s AC mode change to %d\n", + HIMAX_LOG_TAG, hx_touch_data->hx_state_info[0] >> 2 & 0x01); + if ((g_last_fw_irq_flag >> 3 & 0x01) != (hx_touch_data->hx_state_info[0] >> 3 & 0x01)) + I("%s Water change to %d\n", + HIMAX_LOG_TAG, hx_touch_data->hx_state_info[0] >> 3 & 0x01); + if ((g_last_fw_irq_flag >> 4 & 0x01) != (hx_touch_data->hx_state_info[0] >> 4 & 0x01)) + I("%s Glove change to %d\n", + HIMAX_LOG_TAG, hx_touch_data->hx_state_info[0] >> 4 & 0x01); + if ((g_last_fw_irq_flag >> 5 & 0x01) != (hx_touch_data->hx_state_info[0] >> 5 & 0x01)) + I("%s TX Hop change to %d\n", + HIMAX_LOG_TAG, hx_touch_data->hx_state_info[0] >> 5 & 0x01); + } + g_last_fw_irq_flag = hx_touch_data->hx_state_info[0]; +#endif + } + /* debug info end */ + + if (g_ts_dbg != 0) + I("%s: End, ts_status=%d!\n", __func__, ts_status); + return ts_status; +} +/* end assign_data*/ + +/* start parse_report_data*/ +int himax_parse_report_points(struct himax_ts_data *ts, int ts_path, int ts_status) +{ + int x = 0, y = 0, w = 0; +#ifdef SEC_PALM_FUNC + int maj = 0, min = 0, palm = 0; +#endif + int base = 0; + int32_t loop_i = 0; + + if (g_ts_dbg != 0) + I("%s: start!\n", __func__); + + ts->old_finger = ts->pre_finger_mask; + if (ts->hx_point_num == 0) { + if (g_ts_dbg != 0) + I("%s: hx_point_num = 0!\n", __func__); + + for (loop_i = 0; loop_i < ts->nFinger_support; loop_i++) { + if (g_target_report_data->finger_id[loop_i] != 0) { + g_target_report_data->finger_id[loop_i] = 0; + ts->pre_finger_data[loop_i][3] = + g_target_report_data->mv_cnt[loop_i]; + g_target_report_data->mv_cnt[loop_i] = 0; + } + } + return ts_status; + } + ts->pre_finger_mask = 0; + hx_touch_data->finger_num = hx_touch_data->hx_coord_buf[ts->coordInfoSize - 4] & 0x0F; + hx_touch_data->finger_on = 1; + AA_press = 1; + + g_target_report_data->finger_num = hx_touch_data->finger_num; + g_target_report_data->finger_on = hx_touch_data->finger_on; + g_target_report_data->ig_count = hx_touch_data->hx_coord_buf[ts->coordInfoSize - 5]; +#ifdef SEC_PALM_FUNC +#ifdef HX_NEW_EVENT_STACK_FORMAT + palm = (hx_touch_data->hx_state_info[0] >> 3 & 0x01); +#else + palm = (hx_touch_data->hx_state_info[0] >> 1 & 0x01); +#endif +#endif + + if (g_ts_dbg != 0) + I("%s:finger_num = 0x%2X, finger_on = %d\n", __func__, g_target_report_data->finger_num, g_target_report_data->finger_on); + + for (loop_i = 0; loop_i < ts->nFinger_support; loop_i++) { + base = loop_i * 4; + x = hx_touch_data->hx_coord_buf[base] << 8 | hx_touch_data->hx_coord_buf[base + 1]; + y = (hx_touch_data->hx_coord_buf[base + 2] << 8 | hx_touch_data->hx_coord_buf[base + 3]); + w = hx_touch_data->hx_coord_buf[(ts->nFinger_support * 4) + loop_i]; +#ifdef SEC_PALM_FUNC + maj = hx_touch_data->hx_coord_buf[ts->coordInfoSize+(loop_i*2)]; + min = hx_touch_data->hx_coord_buf[ts->coordInfoSize+(loop_i*2)+1]; + //palm = ((hx_touch_data->hx_coord_buf[ts->coordInfoSize+(ts->nFinger_support * 2)] << 8 | hx_touch_data->hx_coord_buf[ts->coordInfoSize+(ts->nFinger_support * 2)+1]) & (1<>(loop_i); +#endif + + if (g_ts_dbg != 0) +#ifndef SEC_PALM_FUNC + D("%s: now parsing[%d]:x=%d, y=%d, w=%d\n", __func__, loop_i, x, y, w); +#else + D("%s: now parsing[%d]:x=%d, y=%d, w=%d, maj=%d, min=%d, palm=%d\n", __func__, loop_i, x, y, w, maj, min, palm); +#endif + + if (x >= 0 && x <= ts->pdata->abs_x_max && y >= 0 && y <= ts->pdata->abs_y_max) { + hx_touch_data->finger_num--; + + g_target_report_data->x[loop_i] = x; + g_target_report_data->y[loop_i] = y; + g_target_report_data->w[loop_i] = w; +#ifdef SEC_PALM_FUNC + g_target_report_data->maj[loop_i] = maj; + g_target_report_data->min[loop_i] = min; + g_target_report_data->palm[loop_i] = palm; + if (palm) + ts->palm_flag |= BIT(loop_i); + else + ts->palm_flag &= ~BIT(loop_i); +#endif + g_target_report_data->finger_id[loop_i] = 1; + g_target_report_data->mv_cnt[loop_i]++; + + /*I("%s: g_target_report_data->x[loop_i]=%d, g_target_report_data->y[loop_i]=%d, g_target_report_data->w[loop_i]=%d",*/ + /*__func__, g_target_report_data->x[loop_i], g_target_report_data->y[loop_i], g_target_report_data->w[loop_i]); */ + + + if (!ts->first_pressed) { + ts->first_pressed = 1; + I("S1@%d, %d\n", x, y); + } + + ts->pre_finger_data[loop_i][0] = x; + ts->pre_finger_data[loop_i][1] = y; +#ifdef SEC_PALM_FUNC + ts->pre_finger_data[loop_i][4] = maj; + ts->pre_finger_data[loop_i][5] = min; +#endif + + ts->pre_finger_mask = ts->pre_finger_mask + (1 << loop_i); + } else {/* report coordinates */ + g_target_report_data->x[loop_i] = x; + g_target_report_data->y[loop_i] = y; + g_target_report_data->w[loop_i] = w; +#ifdef SEC_PALM_FUNC + g_target_report_data->maj[loop_i] = maj; + g_target_report_data->min[loop_i] = min; + g_target_report_data->palm[loop_i] = 0; + ts->palm_flag &= ~BIT(loop_i); +#endif + g_target_report_data->finger_id[loop_i] = 0; + ts->pre_finger_data[loop_i][3] = g_target_report_data->mv_cnt[loop_i]; + g_target_report_data->mv_cnt[loop_i] = 0; + + if (loop_i == 0 && ts->first_pressed == 1) { + ts->first_pressed = 2; + I("E1@%d, %d\n", ts->pre_finger_data[0][0], ts->pre_finger_data[0][1]); + } + } + } + + if (g_ts_dbg != 0) { + for (loop_i = 0; loop_i < 10; loop_i++) + D("DBG X=%d Y=%d ID=%d\n", g_target_report_data->x[loop_i], g_target_report_data->y[loop_i], g_target_report_data->finger_id[loop_i]); + + D("DBG finger number %d\n", g_target_report_data->finger_num); + } + + if (g_ts_dbg != 0) + I("%s: end!\n", __func__); + return ts_status; +} + +static int himax_parse_report_data(struct himax_ts_data *ts, int ts_path, int ts_status) +{ + + if (g_ts_dbg != 0) + I("%s: start now_status=%d!\n", __func__, ts_status); + + + EN_NoiseFilter = (hx_touch_data->hx_coord_buf[HX_TOUCH_INFO_POINT_CNT + 2] >> 3); + /* I("EN_NoiseFilter=%d\n", EN_NoiseFilter); */ + EN_NoiseFilter = EN_NoiseFilter & 0x01; + /* I("EN_NoiseFilter2=%d\n", EN_NoiseFilter); */ +#if defined(HX_EN_SEL_BUTTON) || defined(HX_EN_MUT_BUTTON) + tpd_key = (hx_touch_data->hx_coord_buf[HX_TOUCH_INFO_POINT_CNT + 2] >> 4); + + /* All (VK+AA)leave */ + if (tpd_key == 0x0F) + tpd_key = 0x00; + +#endif + p_point_num = ts->hx_point_num; + + if (hx_touch_data->hx_coord_buf[HX_TOUCH_INFO_POINT_CNT] == 0xff) + ts->hx_point_num = 0; + else + ts->hx_point_num = hx_touch_data->hx_coord_buf[HX_TOUCH_INFO_POINT_CNT] & 0x0f; + + + switch (ts_path) { + case HX_REPORT_COORD: + ts_status = himax_parse_report_points(ts, ts_path, ts_status); + break; + case HX_REPORT_COORD_RAWDATA: + /* touch monitor rawdata */ + if (debug_data != NULL) { + if (debug_data->fp_set_diag_cmd(ic_data, hx_touch_data)) + I("%s: raw data_checksum not match\n", __func__); + } else { + E("%s,There is no init set_diag_cmd\n", __func__); + } + ts_status = himax_parse_report_points(ts, ts_path, ts_status); + break; +#ifdef HX_SMART_WAKEUP + case HX_REPORT_SMWP_EVENT: + himax_wake_event_parse(ts, ts_status); + break; +#endif + default: + E("%s:Fail Path!\n", __func__); + ts_status = HX_PATH_FAIL; + break; + } + if (g_ts_dbg != 0) + I("%s: end now_status=%d!\n", __func__, ts_status); + return ts_status; +} + +/* end parse_report_data*/ + +static void himax_report_all_leave_event(struct himax_ts_data *ts) +{ + int loop_i = 0; + int x = 0, y = 0, mc = 0; + char loc[4] = { 0 }; + + if (ts->prox_power_off == 1) { + input_report_key(ts->input_dev, KEY_INT_CANCEL, 1); + input_sync(ts->input_dev); + input_report_key(ts->input_dev, KEY_INT_CANCEL, 0); + input_sync(ts->input_dev); + } + + for (loop_i = 0; loop_i < ts->nFinger_support; loop_i++) { +#ifndef HX_PROTOCOL_A + input_mt_slot(ts->input_dev, loop_i); + input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 0); +#endif + if (g_target_report_data->finger_id[loop_i] != 0) { + g_target_report_data->finger_id[loop_i] = 0; + ts->touch_count--; + + x = g_target_report_data->x[loop_i]; + y = g_target_report_data->y[loop_i]; + mc = g_target_report_data->mv_cnt[loop_i]; + + location_detect(ts, loc, x, y); + +#if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) + I("[RA] tID:%d loc:%s dd:%d,%d mc:%d tc:%d lx:%d ly:%d\n", loop_i, + loc, x - ts->p_x[loop_i], y - ts->p_y[loop_i], mc, ts->touch_count, x, y); +#else + I("[RA] tID:%d loc:%s dd:%d,%d mc:%d tc:%d\n", loop_i, + loc, x - ts->p_x[loop_i], y - ts->p_y[loop_i], mc, ts->touch_count); +#endif + } + } + +#ifdef SEC_PALM_FUNC + ts->palm_flag = 0; + input_report_key(ts->input_dev, BTN_PALM, 0); +#endif + input_report_key(ts->input_dev, BTN_TOUCH, 0); + input_sync(ts->input_dev); + + ts->touch_count = 0; +} + +/* start report_data */ +#if defined(HX_EN_SEL_BUTTON) || defined(HX_EN_MUT_BUTTON) +static void himax_key_report_operation(int tp_key_index, struct himax_ts_data *ts) +{ + uint16_t x_position = 0, y_position = 0; + + if (g_ts_dbg != 0) + I("%s: Entering\n", __func__); + + if (tp_key_index != 0x00) { + I("virtual key index =%x\n", tp_key_index); + + if (tp_key_index == 0x01) { + vk_press = 1; + I("back key pressed\n"); + + if (ts->pdata->virtual_key) { + if (ts->button[0].index) { + x_position = (ts->button[0].x_range_min + ts->button[0].x_range_max) / 2; + y_position = (ts->button[0].y_range_min + ts->button[0].y_range_max) / 2; + } + +#ifdef HX_PROTOCOL_A + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 100); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, 0); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x_position); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y_position); + input_mt_sync(ts->input_dev); +#else + input_mt_slot(ts->input_dev, 0); + input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 1); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 100); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 100); + input_report_abs(ts->input_dev, ABS_MT_PRESSURE, 100); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x_position); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y_position); +#endif + } else { + input_report_key(ts->input_dev, KEY_BACK, 1); + } + } else if (tp_key_index == 0x02) { + vk_press = 1; + I("home key pressed\n"); + + if (ts->pdata->virtual_key) { + if (ts->button[1].index) { + x_position = (ts->button[1].x_range_min + ts->button[1].x_range_max) / 2; + y_position = (ts->button[1].y_range_min + ts->button[1].y_range_max) / 2; + } + +#ifdef HX_PROTOCOL_A + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, 0); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 100); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x_position); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y_position); + input_mt_sync(ts->input_dev); +#else + input_mt_slot(ts->input_dev, 0); + input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 1); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 100); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 100); + input_report_abs(ts->input_dev, ABS_MT_PRESSURE, 100); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x_position); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y_position); +#endif + } else { + input_report_key(ts->input_dev, KEY_HOME, 1); + } + } else if (tp_key_index == 0x04) { + vk_press = 1; + I("APP_switch key pressed\n"); + + if (ts->pdata->virtual_key) { + if (ts->button[2].index) { + x_position = (ts->button[2].x_range_min + ts->button[2].x_range_max) / 2; + y_position = (ts->button[2].y_range_min + ts->button[2].y_range_max) / 2; + } + +#ifdef HX_PROTOCOL_A + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, 0); + input_report_abs(ts->input_dev, ABS_MT_PRESSURE, 100); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x_position); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y_position); + input_mt_sync(ts->input_dev); +#else + input_mt_slot(ts->input_dev, 0); + input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 1); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 100); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 100); + input_report_abs(ts->input_dev, ABS_MT_PRESSURE, 100); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x_position); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y_position); +#endif + } else { + input_report_key(ts->input_dev, KEY_APPSELECT, 1); + } + } + input_sync(ts->input_dev); + } else { /*tp_key_index =0x00*/ + I("virtual key released\n"); + vk_press = 0; +#ifndef HX_PROTOCOL_A + input_mt_slot(ts->input_dev, 0); + input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 0); +#else + input_mt_sync(ts->input_dev); +#endif + input_report_key(ts->input_dev, KEY_BACK, 0); + input_report_key(ts->input_dev, KEY_HOME, 0); + input_report_key(ts->input_dev, KEY_APPSELECT, 0); +#ifndef HX_PROTOCOL_A + input_sync(ts->input_dev); +#endif + } +} + +void himax_finger_report_key(struct himax_ts_data *ts) +{ + if (ts->hx_point_num != 0) { + /*Touch KEY*/ + if ((tpd_key_old != 0x00) && (tpd_key == 0x00)) { + /* temp_x[0] = 0xFFFF; + * temp_y[0] = 0xFFFF; + * temp_x[1] = 0xFFFF; + * temp_y[1] = 0xFFFF; + */ + hx_touch_data->finger_on = 0; +#ifdef HX_PROTOCOL_A + input_report_key(ts->input_dev, BTN_TOUCH, 0); +#endif + himax_key_report_operation(tpd_key, ts); +#ifndef HX_PROTOCOL_A + input_report_key(ts->input_dev, BTN_TOUCH, 0); +#endif + } + input_sync(ts->input_dev); + } +} + +void himax_finger_leave_key(struct himax_ts_data *ts) +{ + if (tpd_key != 0x00) { + hx_touch_data->finger_on = 1; +#ifdef HX_PROTOCOL_A + input_report_key(ts->input_dev, BTN_TOUCH, 1); +#endif + himax_key_report_operation(tpd_key, ts); +#ifndef HX_PROTOCOL_A + input_report_key(ts->input_dev, BTN_TOUCH, 1); +#endif + } else if ((tpd_key_old != 0x00) && (tpd_key == 0x00)) { + hx_touch_data->finger_on = 0; +#ifdef HX_PROTOCOL_A + input_report_key(ts->input_dev, BTN_TOUCH, 0); +#endif + himax_key_report_operation(tpd_key, ts); +#ifndef HX_PROTOCOL_A + input_report_key(ts->input_dev, BTN_TOUCH, 0); +#endif + } + input_sync(ts->input_dev); +} + +static void himax_report_key(struct himax_ts_data *ts) +{ + if (ts->hx_point_num != 0) { /* Touch KEY */ + himax_finger_report_key(ts); + } else { /* Key */ + himax_finger_leave_key(ts); + } + + tpd_key_old = tpd_key; + Last_EN_NoiseFilter = EN_NoiseFilter; +} +#endif + +/* start report_point*/ +static void himax_finger_report(struct himax_ts_data *ts) +{ + int i = 0; + bool valid = false; + + + if (g_ts_dbg != 0) { + I("%s:start\n", __func__); + I("hx_touch_data->finger_num=%d\n", hx_touch_data->finger_num); + } + for (i = 0; i < ts->nFinger_support; i++) { + if (g_target_report_data->x[i] >= 0 && g_target_report_data->x[i] <= ts->pdata->abs_x_max && g_target_report_data->y[i] >= 0 && g_target_report_data->y[i] <= ts->pdata->abs_y_max) + valid = true; + else + valid = false; + if (g_ts_dbg != 0) + I("valid=%d\n", valid); + if (valid) { + if (g_ts_dbg != 0) + I("g_target_report_data->x[i]=%d, g_target_report_data->y[i]=%d, g_target_report_data->w[i]=%d\n", g_target_report_data->x[i], g_target_report_data->y[i], g_target_report_data->w[i]); +#ifndef HX_PROTOCOL_A + input_mt_slot(ts->input_dev, i); + input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 1); +#else + input_report_key(ts->input_dev, BTN_TOUCH, 1); +#endif +#ifdef SEC_PALM_FUNC + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, g_target_report_data->maj[i]); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MINOR, g_target_report_data->min[i]); +#else + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, g_target_report_data->w[i]); +#endif + +#ifndef HX_PROTOCOL_A + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, g_target_report_data->w[i]); + input_report_abs(ts->input_dev, ABS_MT_PRESSURE, g_target_report_data->w[i]); +#else + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, i); +#endif + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, g_target_report_data->x[i]); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, g_target_report_data->y[i]); +#ifndef HX_PROTOCOL_A + ts->last_slot = i; +#else + input_mt_sync(ts->input_dev); +#endif + } else { +#ifndef HX_PROTOCOL_A + input_mt_slot(ts->input_dev, i); + input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 0); +#endif + } + } +#ifndef HX_PROTOCOL_A +#ifdef SEC_PALM_FUNC + input_report_key(ts->input_dev, BTN_PALM, ts->palm_flag); +#endif + input_report_key(ts->input_dev, BTN_TOUCH, 1); +#endif + input_sync(ts->input_dev); + + if (g_ts_dbg != 0) + I("%s:end\n", __func__); +} + +static void himax_finger_leave(struct himax_ts_data *ts) +{ +#ifndef HX_PROTOCOL_A + int32_t loop_i = 0; +#endif + + if (g_ts_dbg != 0) + I("%s: start!\n", __func__); +#if defined(HX_PALM_REPORT) + if (himax_palm_detect(hx_touch_data->hx_coord_buf) == PALM_REPORT) { + I(" %s HX_PALM_REPORT KEY power event press\n", __func__); + input_report_key(ts->input_dev, KEY_POWER, 1); + input_sync(ts->input_dev); + msleep(100); + + I(" %s HX_PALM_REPORT KEY power event release\n", __func__); + input_report_key(ts->input_dev, KEY_POWER, 0); + input_sync(ts->input_dev); + return; + } +#endif + + hx_touch_data->finger_on = 0; + g_target_report_data->finger_on = 0; + g_target_report_data->finger_num = 0; + AA_press = 0; + +#ifdef HX_PROTOCOL_A + input_mt_sync(ts->input_dev); +#endif +#ifndef HX_PROTOCOL_A + for (loop_i = 0; loop_i < ts->nFinger_support; loop_i++) { + input_mt_slot(ts->input_dev, loop_i); + input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 0); + } +#endif + if (ts->pre_finger_mask > 0) + ts->pre_finger_mask = 0; + + if (ts->first_pressed == 1) { + ts->first_pressed = 2; + I("E1@%d, %d\n", ts->pre_finger_data[0][0], ts->pre_finger_data[0][1]); + } + + /*if (ts->debug_log_level & BIT(1)) */ + /*himax_log_touch_event(x, y, w, loop_i, EN_NoiseFilter, HX_FINGER_LEAVE); */ + +#ifdef SEC_PALM_FUNC + ts->palm_flag = 0; + input_report_key(ts->input_dev, BTN_PALM, ts->palm_flag); +#endif + input_report_key(ts->input_dev, BTN_TOUCH, 0); + input_sync(ts->input_dev); + + if (g_ts_dbg != 0) + I("%s: end!\n", __func__); + + +} + +static void himax_report_points(struct himax_ts_data *ts) +{ + if (g_ts_dbg != 0) + I("%s: start!\n", __func__); + + if (ts->hx_point_num != 0) + himax_finger_report(ts); + else + himax_finger_leave(ts); + + Last_EN_NoiseFilter = EN_NoiseFilter; + + hx_log_touch_event(ts); + + if (g_ts_dbg != 0) + I("%s: end!\n", __func__); +} +/* end report_points*/ + +int himax_report_data(struct himax_ts_data *ts, int ts_path, int ts_status) +{ + if (g_ts_dbg != 0) + I("%s: Entering, ts_status=%d!\n", __func__, ts_status); + + if (ts_path == HX_REPORT_COORD || ts_path == HX_REPORT_COORD_RAWDATA) { + /* Touch Point information */ + himax_report_points(ts); + +#if defined(HX_EN_SEL_BUTTON) || defined(HX_EN_MUT_BUTTON) + /*report key(question mark)*/ + if (tpd_key && tpd_key_old) + himax_report_key(ts); + +#endif +#ifdef HX_SMART_WAKEUP + } else if (ts_path == HX_REPORT_SMWP_EVENT) { + himax_wake_event_report(); +#endif + } else { + E("%s:Fail Path!\n", __func__); + ts_status = HX_PATH_FAIL; + } + + if (g_ts_dbg != 0) + I("%s: END, ts_status=%d!\n", __func__, ts_status); + return ts_status; +} +/* end report_data */ + +static int himax_ts_operation(struct himax_ts_data *ts, int ts_path, int ts_status) +{ + uint8_t hw_reset_check[2]; + + memset(ts->xfer_buff, 0x00, 128 * sizeof(uint8_t)); + memset(hw_reset_check, 0x00, sizeof(hw_reset_check)); + + ts_status = himax_touch_get(ts, ts->xfer_buff, ts_path, ts_status); + if (ts_status == HX_TS_GET_DATA_FAIL) + goto END_FUNCTION; + + ts_status = himax_distribute_touch_data(ts->xfer_buff, ts_path, ts_status); + ts_status = himax_err_ctrl(ts, ts->xfer_buff, ts_path, ts_status); + if (ts_status == HX_REPORT_DATA || ts_status == HX_TS_NORMAL_END) + ts_status = himax_parse_report_data(ts, ts_path, ts_status); + else + goto END_FUNCTION; + + + ts_status = himax_report_data(ts, ts_path, ts_status); + + +END_FUNCTION: + return ts_status; +} + +void himax_ts_work(struct himax_ts_data *ts) +{ + + int ts_status = HX_TS_NORMAL_END; + int ts_path = 0; + int ret = 0; + + if (atomic_read(&ts->suspend_mode) == HIMAX_STATE_POWER_OFF) { + input_err(true, ts->dev, "%s: POWER_OFF & not handled\n", __func__); + return; + } + + if (atomic_read(&ts->suspend_mode) == HIMAX_STATE_LPM) { + __pm_wakeup_event(ts->ts_SMWP_wake_lock, TS_WAKE_LOCK_TIMEOUT); + + /* waiting for blsp block resuming, if not occurs spi error */ + ret = wait_for_completion_interruptible_timeout(&ts->resume_done, msecs_to_jiffies(1000)); + if (ret == 0) { + input_err(true, ts->dev, "%s: LPM: pm resume is not handled\n", __func__); + return; + } + + if (ret < 0) { + input_err(true, ts->dev, "%s: LPM: -ERESTARTSYS if interrupted, %d\n", __func__, ret); + return; + } + + input_info(true, ts->dev, "%s: run LPM interrupt handler, %d\n", __func__, ret); + /* run lpm interrupt handler */ + } + + if (debug_data != NULL) + debug_data->fp_ts_dbg_func(ts, HX_FINGER_ON); + + ts_path = himax_ts_work_status(ts); + switch (ts_path) { + case HX_REPORT_COORD: + ts_status = himax_ts_operation(ts, ts_path, ts_status); + break; + case HX_REPORT_SMWP_EVENT: + ts_status = himax_ts_operation(ts, ts_path, ts_status); + break; + case HX_REPORT_COORD_RAWDATA: + ts_status = himax_ts_operation(ts, ts_path, ts_status); + break; + default: + E("%s:Path Fault! value=%d\n", __func__, ts_path); + goto END_FUNCTION; + } + + if (ts_status == HX_TS_GET_DATA_FAIL) + goto GET_TOUCH_FAIL; + else + goto END_FUNCTION; + +GET_TOUCH_FAIL: + I("%s: Now reset the Touch chip.\n", __func__); +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, true); +#else + g_core_fp.fp_system_reset(); +#endif +#ifdef HX_ZERO_FLASH + if (g_core_fp.fp_0f_reload_to_active) + g_core_fp.fp_0f_reload_to_active(); +#endif +END_FUNCTION: + if (debug_data != NULL) + debug_data->fp_ts_dbg_func(ts, HX_FINGER_LEAVE); + +} +/*end ts_work*/ +EXPORT_SYMBOL(himax_ts_work); + +enum hrtimer_restart himax_ts_timer_func(struct hrtimer *timer) +{ + struct himax_ts_data *ts; + + + ts = container_of(timer, struct himax_ts_data, timer); + queue_work(ts->himax_wq, &ts->work); + hrtimer_start(&ts->timer, ktime_set(0, 12500000), HRTIMER_MODE_REL); + return HRTIMER_NORESTART; +} + +#if defined(HX_USB_DETECT_CALLBACK) +static void himax_cable_tp_status_handler_func(int connect_status) +{ + struct himax_ts_data *ts; + + I("Touch: cable change to %d\n", connect_status); + + ts = private_ts; + + if (ts->cable_config) { + if (!atomic_read(&ts->suspend_mode)) { + if (connect_status != ts->usb_connected) { + if (connect_status) { + ts->cable_config[1] = 0x01; + ts->usb_connected = 0x01; + } else { + ts->cable_config[1] = 0x00; + ts->usb_connected = 0x00; + } + + himax_bus_master_write(ts->cable_config, + sizeof(ts->cable_config), HIMAX_I2C_RETRY_TIMES); + I("%s: Cable status change: 0x%2.2X\n", __func__, ts->cable_config[1]); + } else + I("%s: Cable status is the same as previous one, ignore.\n", __func__); + } else { + if (connect_status) + ts->usb_connected = 0x01; + else + ts->usb_connected = 0x00; + + I("%s: Cable status remembered: 0x%2.2X\n", __func__, ts->usb_connected); + } + } +} + +static struct t_cable_status_notifier himax_cable_status_handler = { + .name = "usb_tp_connected", + .func = himax_cable_tp_status_handler_func, +}; + +#endif + +#ifdef HX_AUTO_UPDATE_FW +static void himax_update_register(struct work_struct *work) +{ + I("%s %s: in\n", HIMAX_LOG_TAG, __func__); + + if (i_get_FW() != 0) + return; + + if (g_auto_update_flag == true) { + I("Update FW Directly"); + goto UPDATE_FW; + } + + if (himax_auto_update_check() != 0) { + I("%s:Don't run auto update fw, so free allocated!\n", __func__); + kfree(i_CTPM_FW); + i_CTPM_FW = NULL; + return; + } + +UPDATE_FW: + if (i_update_FW() <= 0) + I("Auto update FW fail!\n"); + else + I("It have Updated\n"); + +} +#endif + +#ifndef HX_ZERO_FLASH +static int hx_chk_flash_sts(uint32_t size) +{ + int rslt = 0; + + I("%s: Entering, %d\n", __func__, size); + + rslt = (!g_core_fp.fp_calculateChecksum(false, size)); + rslt |= g_core_fp.fp_flash_lastdata_check(size, NULL, 0); + + return rslt; +} +#endif + +#ifdef HX_CONTAINER_SPEED_UP +static void himax_resume_work_func(struct work_struct *work) +{ + himax_chip_common_resume(private_ts); +} + +#endif + +static void himax_print_info(struct himax_ts_data *ts) +{ + if (ic_data->vendor_ic_name_ver == 0x00) { + if (strcmp(HX_83112A_SERIES_PWON, private_ts->chip_name) == 0) + ic_data->vendor_ic_name_ver = 0x01; + else if (strcmp(HX_83102D_SERIES_PWON, private_ts->chip_name) == 0) + ic_data->vendor_ic_name_ver = 0x02; + else if (strcmp(HX_83102E_SERIES_PWON, private_ts->chip_name) == 0) + ic_data->vendor_ic_name_ver = 0x03; + else if (strcmp(HX_83121A_SERIES_PWON, private_ts->chip_name) == 0) + ic_data->vendor_ic_name_ver = 0x04; + else { + ic_data->vendor_ic_name_ver = 0x00; + input_err(true, ts->dev, "%s : have to check ic name(%s)", __func__, private_ts->chip_name); + } + } + + ts->print_info_cnt_open++; + + if (ts->print_info_cnt_open > 0xfff0) + ts->print_info_cnt_open = 0; + + if (ts->touch_count == 0) + ts->print_info_cnt_release++; + + input_info(true, ts->dev, + "tc:%d lp:%x ta:%d noise:%d lamp:%d // v:HX%02X%02X%02X%02X // #%d %d\n", + ts->touch_count, ts->SMWP_enable, USB_detect_flag, + ts->noise_mode, ts->lamp_noise_mode, + ic_data->vendor_ic_name_ver, ic_data->vendor_cid_maj_ver, + ic_data->vendor_panel_ver, ic_data->vendor_cid_min_ver, + ts->print_info_cnt_open, ts->print_info_cnt_release); +} + +static void himax_read_info_work(struct work_struct *work) +{ + struct himax_ts_data *ts = container_of(work, struct himax_ts_data, + work_read_info.work); + + himax_run_rawdata_all(ts); + + schedule_work(&ts->work_print_info.work); +} + +static void himax_print_info_work(struct work_struct *work) +{ + struct himax_ts_data *ts = container_of(work, struct himax_ts_data, + work_print_info.work); + + himax_print_info(ts); + + schedule_delayed_work(&ts->work_print_info, msecs_to_jiffies(TOUCH_PRINT_INFO_DWORK_TIME)); +} + +int hx_ic_register(void) +{ + int ret = !NO_ERR; + + I("%s:Entering!\n", __func__); + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_IC_HX83102) + if (_hx83102_init()) { + ret = NO_ERR; + goto END; + } +#endif + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_IC_HX83121) + if (_hx83121_init()) { + ret = NO_ERR; + goto END; + } +#endif + +END: + if (ret == NO_ERR) + I("%s: detect IC!\n", __func__); + else + E("%s: There is no IC!\n", __func__); + I("%s:END!\n", __func__); + + return ret; +} + +int himax_chip_common_init(void) +{ + + int ret = 0, err = 0; + struct himax_ts_data *ts = private_ts; + struct himax_i2c_platform_data *pdata; + +#if defined(__EMBEDDED_FW__) + g_embedded_fw.size = (size_t)_binary___Himax_firmware_bin_end - + (size_t)_binary___Himax_firmware_bin_start; +#endif + ts->xfer_buff = devm_kzalloc(ts->dev, 128 * sizeof(uint8_t), GFP_KERNEL); + if (ts->xfer_buff == NULL) { + err = -ENOMEM; + goto err_xfer_buff_fail; + } + + I("%s: PDATA START\n", HIMAX_LOG_TAG); + pdata = kzalloc(sizeof(struct himax_i2c_platform_data), GFP_KERNEL); + + if (pdata == NULL) { /*Allocate Platform data space*/ + err = -ENOMEM; + goto err_dt_platform_data_fail; + } + + I("%s ic_data START\n", HIMAX_LOG_TAG); + ic_data = kzalloc(sizeof(struct himax_ic_data), GFP_KERNEL); + if (ic_data == NULL) { /*Allocate IC data space*/ + err = -ENOMEM; + goto err_dt_ic_data_fail; + } + /* default 128k, different size please follow HX83121A style */ + ic_data->flash_size = FW_SIZE_128k; + + /* allocate report data */ + hx_touch_data = kzalloc(sizeof(struct himax_report_data), GFP_KERNEL); + if (hx_touch_data == NULL) { + err = -ENOMEM; + goto err_alloc_touch_data_failed; + } + + if (himax_parse_dt(ts, pdata) < 0) { + I(" pdata is NULL for DT\n"); + err = -ENODEV; + goto err_alloc_dt_pdata_failed; + } + +#ifdef HX_RST_PIN_FUNC + ts->rst_gpio = pdata->gpio_reset; +#endif + himax_gpio_power_config(pdata); + + /* Get pinctrl if target uses pinctrl */ + ts->pinctrl = devm_pinctrl_get(ts->dev); + if (IS_ERR(ts->pinctrl)) { + if (PTR_ERR(ts->pinctrl) == -EPROBE_DEFER) { + err = -EPROBE_DEFER; + goto err_pinctrl; + } + + I("%s: Target does not use pinctrl\n", __func__); + ts->pinctrl = NULL; + } + + ret = himax_pinctrl_configure(ts, true); + if (ret) + I("%s cannot set pinctrl state\n", __func__); + + atomic_set(&ts->suspend_mode, HIMAX_STATE_POWER_ON); + init_completion(&ts->resume_done); + complete_all(&ts->resume_done); + + g_hx_chip_inited = 0; + + if (hx_ic_register() != NO_ERR) { + E("%s: can't detect IC!\n", __func__); + err = -ENODEV; + goto error_ic_detect_failed; + } + + if (g_core_fp.fp_chip_init != NULL) { + g_core_fp.fp_chip_init(); + } else { + E("%s: function point of chip_init is NULL!\n", __func__); + err = -ENXIO; + goto error_ic_detect_failed; + } + + if (pdata->virtual_key) + ts->button = pdata->virtual_key; + +#ifndef HX_ZERO_FLASH + if (hx_chk_flash_sts(ic_data->flash_size) == 1) { + E("%s: check flash fail\n", __func__); +#ifdef HX_AUTO_UPDATE_FW + g_auto_update_flag = true; +#endif + } else { + g_core_fp.fp_read_FW_ver(); + } +#endif + + +#ifdef HX_AUTO_UPDATE_FW + ts->himax_update_wq = create_singlethread_workqueue("HMX_update_reuqest"); + if (!ts->himax_update_wq) { + E(" allocate himax_update_wq failed\n"); + err = -ENOMEM; + goto err_update_wq_failed; + } + INIT_DELAYED_WORK(&ts->work_update, himax_update_register); + //queue_delayed_work(ts->himax_update_wq, &ts->work_update, msecs_to_jiffies(2000)); +#endif +#ifdef HX_ZERO_FLASH + g_auto_update_flag = true; + ts->himax_0f_update_wq = create_singlethread_workqueue("HMX_0f_update_reuqest"); + if (!ts->himax_0f_update_wq) { + E(" allocate himax_0f_update_wq failed\n"); + err = -ENOMEM; + goto err_0f_update_wq_failed; + } + INIT_DELAYED_WORK(&ts->work_0f_update, g_core_fp.fp_0f_operation); + queue_delayed_work(ts->himax_0f_update_wq, &ts->work_0f_update, msecs_to_jiffies(2000)); +#endif + +#ifdef HX_CONTAINER_SPEED_UP + ts->ts_int_workqueue = create_singlethread_workqueue("himax_ts_resume_wq"); + if (!ts->ts_int_workqueue) { + E("%s: create ts_resume workqueue failed\n", __func__); + err = -ENOMEM; + goto err_create_ts_resume_wq_failed; + } + INIT_DELAYED_WORK(&ts->ts_int_work, himax_resume_work_func); +#endif + + /*Himax Power On and Load Config*/ + if (himax_loadSensorConfig(pdata)) { + E("%s: Load Sesnsor configuration failed, unload driver.\n", __func__); + err = -ENODEV; + goto err_detect_failed; + } + + ts->pdata = pdata; + + g_core_fp.fp_power_on_init(); + calculate_point_number(); + + /*calculate the i2c data size*/ + calcDataSize(); + I("%s: calcDataSize complete\n", __func__); +#if IS_ENABLED(CONFIG_OF) + ts->pdata->abs_pressure_min = 0; + ts->pdata->abs_pressure_max = 200; + ts->pdata->abs_width_min = 0; + ts->pdata->abs_width_max = 200; + pdata->cable_config[0] = 0xF0; + pdata->cable_config[1] = 0x00; +#endif + ts->suspended = false; +#if defined(HX_USB_DETECT_CALLBACK) || defined(HX_USB_DETECT_GLOBAL) + ts->usb_connected = 0x00; + ts->cable_config = pdata->cable_config; +#endif +#ifdef HX_PROTOCOL_A + ts->protocol_type = PROTOCOL_TYPE_A; +#else + ts->protocol_type = PROTOCOL_TYPE_B; +#endif + I("%s: Use Protocol Type %c\n", __func__, + ts->protocol_type == PROTOCOL_TYPE_A ? 'A' : 'B'); + + ret = himax_dev_set(ts); + if (ret < 0) { + I("%s, input device alloc fail!\n", __func__); + err = -ENOMEM; + goto err_input_register_device_failed; + } + + ret = himax_input_register(ts, ts->input_dev, INPUT_PROP_DIRECT); + if (ret) { + E("%s: Unable to register input device\n", __func__); + err = -ENODEV; + goto err_input_register_device_failed; + } + + if (ts->pdata->support_dex) { + if (himax_input_register(ts, ts->input_dev_pad, INPUT_PROP_POINTER)) + E("%s: Unable to register dex input device\n", __func__); + } + + mutex_init(&ts->irq_lock); + mutex_init(&ts->device_lock); + ts->initialized = true; + +#ifdef HX_SMART_WAKEUP + ts->SMWP_enable = 0; + ts->gesture_cust_en[0] = 0; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 110)) + ts->ts_SMWP_wake_lock = wakeup_source_register(ts->dev, HIMAX_common_NAME); +#else + wakeup_source_init(ts->ts_SMWP_wake_lock, HIMAX_common_NAME); +#endif + device_init_wakeup(&ts->spi->dev, true); +#endif +#ifdef HX_HIGH_SENSE + ts->HSEN_enable = 0; +#endif + + /*touch data init*/ + ts->glove_enabled = 0; + ts->touch_count = 0; + ts->print_info_cnt_open = 0; + ts->print_info_cnt_release = 0; + + err = himax_report_data_init(); + + if (err) + goto err_report_data_init_failed; + + if (himax_common_proc_init()) { + E(" %s: himax_common proc_init failed!\n", __func__); + goto err_creat_proc_file_failed; + } + +#ifdef SEC_FACTORY_MODE + err = sec_touch_sysfs(ts); + if (err) + goto err_sec_sysfs; +#endif + +#if defined(HX_USB_DETECT_CALLBACK) + + if (ts->cable_config) + cable_detect_register_notifier(&himax_cable_status_handler); + +#endif + himax_ts_register_interrupt(); + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_DEBUG) + if (himax_debug_init()) + E(" %s: debug initial failed!\n", __func__); +#endif + +#if defined(HX_AUTO_UPDATE_FW) || defined(HX_ZERO_FLASH) + + if (g_auto_update_flag) + himax_int_enable(0); + +#endif +#ifdef HX_AUTO_UPDATE_FW + himax_update_register(&ts->work_update.work); +#endif + + INIT_DELAYED_WORK(&ts->work_print_info, himax_print_info_work); + INIT_DELAYED_WORK(&ts->work_read_info, himax_read_info_work); + schedule_work(&ts->work_read_info.work); + + g_hx_chip_inited = true; + return 0; + +#ifdef SEC_FACTORY_MODE +// sec_touch_sysfs_remove(ts); +// sec_cmd_exit(&ts->sec, SEC_CLASS_DEVT_TSP); +err_sec_sysfs: +#endif +err_creat_proc_file_failed: + himax_report_data_deinit(); +err_report_data_init_failed: +#ifdef HX_SMART_WAKEUP +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 110)) + wakeup_source_unregister(ts->ts_SMWP_wake_lock); +#else + wakeup_source_trash(ts->ts_SMWP_wake_lock); +#endif + device_init_wakeup(&ts->spi->dev, false); +#endif + mutex_destroy(&ts->device_lock); + mutex_destroy(&ts->irq_lock); +err_input_register_device_failed: +err_detect_failed: + +#ifdef HX_CONTAINER_SPEED_UP + cancel_delayed_work_sync(&ts->ts_int_work); + destroy_workqueue(ts->ts_int_workqueue); +err_create_ts_resume_wq_failed: +#endif + +#ifdef HX_ZERO_FLASH + cancel_delayed_work_sync(&ts->work_0f_update); + destroy_workqueue(ts->himax_0f_update_wq); +err_0f_update_wq_failed: +#endif + +#ifdef HX_AUTO_UPDATE_FW + if (g_auto_update_flag) { + cancel_delayed_work_sync(&ts->work_update); + destroy_workqueue(ts->himax_update_wq); + } +err_update_wq_failed: +#endif +error_ic_detect_failed: +err_pinctrl: + himax_gpio_power_deconfig(pdata); +err_alloc_dt_pdata_failed: + kfree(hx_touch_data); + hx_touch_data = NULL; +err_alloc_touch_data_failed: + kfree(ic_data); + ic_data = NULL; +err_dt_ic_data_fail: + kfree(pdata); + pdata = NULL; +err_dt_platform_data_fail: + devm_kfree(ts->dev, ts->xfer_buff); + ts->xfer_buff = NULL; +err_xfer_buff_fail: + probe_fail_flag = 1; + return err; +} + +void himax_chip_common_deinit(void) +{ + struct himax_ts_data *ts = private_ts; + + himax_ts_unregister_interrupt(); + + cancel_delayed_work_sync(&ts->work_read_info); + cancel_delayed_work_sync(&ts->work_print_info); + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_DEBUG) + himax_debug_remove(); +#endif + + himax_common_proc_deinit(); + himax_report_data_deinit(); + +#ifdef SEC_FACTORY_MODE + sec_touch_sysfs_remove(ts); + sec_cmd_exit(&ts->sec, SEC_CLASS_DEVT_TSP); +#endif + +#ifdef HX_SMART_WAKEUP + device_init_wakeup(&ts->spi->dev, false); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 110)) + wakeup_source_unregister(ts->ts_SMWP_wake_lock); +#else + wakeup_source_trash(ts->ts_SMWP_wake_lock); +#endif +#endif +#ifdef HX_CONTAINER_SPEED_UP + cancel_delayed_work_sync(&ts->ts_int_work); + destroy_workqueue(ts->ts_int_workqueue); +#endif +#ifdef HX_ZERO_FLASH + cancel_delayed_work_sync(&ts->work_0f_update); + destroy_workqueue(ts->himax_0f_update_wq); +#endif +#ifdef HX_AUTO_UPDATE_FW + cancel_delayed_work_sync(&ts->work_update); + destroy_workqueue(ts->himax_update_wq); +#endif + himax_gpio_power_deconfig(ts->pdata); + if (himax_mcu_cmd_struct_free) + himax_mcu_cmd_struct_free(); + + mutex_destroy(&ts->device_lock); + mutex_destroy(&ts->irq_lock); + + kfree(hx_touch_data); + hx_touch_data = NULL; + kfree(ic_data); + ic_data = NULL; + kfree(ts->pdata->virtual_key); + ts->pdata->virtual_key = NULL; + devm_kfree(ts->dev, ts->xfer_buff); + ts->xfer_buff = NULL; + kfree(ts->pdata); + ts->pdata = NULL; + kfree(ts); + ts = NULL; + probe_fail_flag = 0; + + KI("%s: Common section deinited!\n", __func__); +} + +int himax_pinctrl_configure(struct himax_ts_data *ts, bool active) +{ + struct pinctrl_state *set_state = NULL; + + int retval; + + if (!ts->pinctrl) { + E("%s: pinctrl is null\n", __func__); + return -ENODEV; + } + + I("%s %s\n", __func__, active ? "ACTIVE" : "SUSPEND"); + + set_state = pinctrl_lookup_state(ts->pinctrl, + active ? "on_state" : "off_state"); + if (IS_ERR(set_state)) { + I("%s cannot get active state\n", __func__); + return -EINVAL; + } + + retval = pinctrl_select_state(ts->pinctrl, set_state); + if (retval) { + I("%s cannot set pinctrl %s state, retval = %d\n", + __func__, active ? "active" : "suspend", retval); + return -EINVAL; + } + + return 0; +} + +int himax_ctrl_lcd_reset_regulator(struct himax_ts_data *ts, bool on) +{ + static struct regulator *panel_reset; + + static bool enabled; + int ret = 0; + + if (!ts->pdata->panel_reset) + return 0; + + input_info(true, ts->dev, "%s: called! %s, enabled(%d)\n", + __func__, on ? "on" : "off", enabled); + + if (enabled == on) + return ret; + + if (IS_ERR_OR_NULL(panel_reset)) { + panel_reset = devm_regulator_get(ts->dev, ts->pdata->panel_reset); + if (IS_ERR_OR_NULL(panel_reset)) { + input_err(true, ts->dev, "%s: Failed to get panel_reset(%s) regulator.\n", + __func__, ts->pdata->panel_reset); + ret = PTR_ERR(panel_reset); + goto error; + } + } + + input_info(true, ts->dev, "%s: %s: [BEFORE] reset:%d\n", + __func__, on ? "on" : "off", + regulator_is_enabled(panel_reset)); + + if (on) { + ret = regulator_enable(panel_reset); + if (ret) { + input_err(true, ts->dev, "%s: Failed to enable panel_reset: %d\n", __func__, ret); + goto out; + } + } else { + regulator_disable(panel_reset); + } + + enabled = on; + +out: + input_info(true, ts->dev, "%s: %s: [AFTER] reset:%d\n", + __func__, on ? "on" : "off", + regulator_is_enabled(panel_reset)); + +error: + return ret; + +} + +int himax_ctrl_lcd_regulators(struct himax_ts_data *ts, bool on) +{ + static struct regulator *panel_bl_en; + static struct regulator *panel_vddi; + static bool enabled; + int ret = 0; + + input_info(true, ts->dev, "%s: called! %s, enabled(%d)\n", + __func__, on ? "on" : "off", enabled); + + if (enabled == on) + return ret; + + if (ts->pdata->panel_bl_en) { + if (IS_ERR_OR_NULL(panel_bl_en)) { + panel_bl_en = devm_regulator_get(ts->dev, ts->pdata->panel_bl_en); + if (IS_ERR_OR_NULL(panel_bl_en)) { + input_err(true, ts->dev, "%s: Failed to get panel_bl_en(%s) regulator.\n", + __func__, ts->pdata->panel_bl_en); + ret = PTR_ERR(panel_bl_en); + goto error; + } + } + } + + if (ts->pdata->panel_vddi) { + if (IS_ERR_OR_NULL(panel_vddi)) { + panel_vddi = devm_regulator_get(ts->dev, ts->pdata->panel_vddi); + if (IS_ERR_OR_NULL(panel_vddi)) { + input_err(true, ts->dev, "%s: Failed to get panel_vddi(%s) regulator.\n", + __func__, ts->pdata->panel_vddi); + ret = PTR_ERR(panel_vddi); + goto error; + } + } + } + + if (on) { + if (ts->pdata->panel_vddi) { + ret = regulator_enable(panel_vddi); + if (ret) { + input_err(true, ts->dev, "%s: Failed to enable panel_vddi: %d\n", __func__, ret); + goto out; + } + } + if (ts->pdata->panel_bl_en) { + ret = regulator_enable(panel_bl_en); + if (ret) { + input_err(true, ts->dev, "%s: Failed to enable panel_bl_en: %d\n", __func__, ret); + goto out; + } + } + } else { + if (ts->pdata->panel_vddi) + regulator_disable(panel_vddi); + if (ts->pdata->panel_bl_en) + regulator_disable(panel_bl_en); + } + + enabled = on; + +out: + input_info(true, ts->dev, "%s: %s done", __func__, on ? "on" : "off"); + +error: + return ret; +} + +int himax_chip_common_suspend(struct himax_ts_data *ts) +{ + mutex_lock(&ts->device_lock); + + input_info(true, ts->dev, "%s %s: START lp:%d cover:%d\n", + HIMAX_LOG_TAG, __func__, ts->SMWP_enable, ts->cover_closed); + + if (ts->suspended) { + I("%s: Already suspended. Skipped.\n", __func__); + goto END; + } else { + ts->suspended = true; + I("%s: enter\n", __func__); + } + + if (debug_data != NULL && debug_data->flash_dump_going == true) { + I("[himax] %s: Flash dump is going, reject suspend\n", __func__); + goto END; + } + + if (ts->prox_power_off == 1 && ts->aot_enabled) { + ts->SMWP_enable = 0; + input_info(true, ts->dev, "%s: prox_power_off & disable aot\n", __func__); + } + +#if defined(HX_SMART_WAKEUP) || defined(HX_HIGH_SENSE) || defined(HX_USB_DETECT_GLOBAL) +#ifndef HX_RESUME_SEND_CMD + g_core_fp.fp_resend_cmd_func(ts->suspended); +#endif +#endif +#ifdef HX_SMART_WAKEUP + + if (ts->SMWP_enable) { + +#ifdef HX_CODE_OVERLAY + if (ts->in_self_test == 0) + g_core_fp.fp_0f_overlay(2, 0); +#endif + + atomic_set(&ts->suspend_mode, HIMAX_STATE_LPM); + + himax_ctrl_lcd_regulators(ts, true); + himax_ctrl_lcd_reset_regulator(ts, true); + + ts->pre_finger_mask = 0; + FAKE_POWER_KEY_SEND = false; + + if (device_may_wakeup(&ts->spi->dev)) + enable_irq_wake(ts->hx_irq); + +#ifdef HX_RST_PIN_FUNC + if (!gpio_get_value(ts->pdata->gpio_reset)) { + gpio_set_value(ts->pdata->gpio_reset, 1); + I("%s make TP_RESET high\n", __func__); + } +#endif + I("[himax] %s: SMART_WAKEUP enable, reject suspend\n", __func__); + goto END; + } + +#endif + himax_int_enable(0); + /*if (g_core_fp.fp_suspend_ic_action != NULL)*/ + /*g_core_fp.fp_suspend_ic_action();*/ + + if (!ts->use_irq) { + int32_t cancel_state; + + cancel_state = cancel_work_sync(&ts->work); + if (cancel_state) + himax_int_enable(1); + } + + /*ts->first_pressed = 0;*/ + atomic_set(&ts->suspend_mode, HIMAX_STATE_POWER_OFF); + ts->pre_finger_mask = 0; + +#ifdef HX_RST_PIN_FUNC + if (gpio_get_value(ts->pdata->gpio_reset)) { + gpio_set_value(ts->pdata->gpio_reset, 0); + I("%s make TP_RESET low\n", __func__); + } +#endif + himax_pinctrl_configure(ts, false); + +END: + himax_report_all_leave_event(ts); + + if (ts->in_self_test == 1) + ts->suspend_resume_done = 1; + + cancel_delayed_work(&ts->work_print_info); + himax_print_info(ts); + + input_info(true, ts->dev, "%s: END\n", __func__); + mutex_unlock(&ts->device_lock); + + return 0; +} + +int himax_chip_common_resume(struct himax_ts_data *ts) +{ +#if defined(HX_ZERO_FLASH) && defined(HX_RESUME_SET_FW) + int result = 0; +#endif + + mutex_lock(&ts->device_lock); + + input_info(true, ts->dev, "%s %s: START lp:%d cover:%d\n", + HIMAX_LOG_TAG, __func__, ts->SMWP_enable, ts->cover_closed); + + if (ts->suspended == false) { + I("%s: It had entered resume, skip this step\n", __func__); + goto END; + } else { + ts->suspended = false; + } + +#ifdef HX_ESD_RECOVERY + /* continuous N times record, not total N times. */ + g_zero_event_count = 0; +#endif + +#ifdef HX_RST_PIN_FUNC + if (!gpio_get_value(ts->pdata->gpio_reset)) { + gpio_set_value(ts->pdata->gpio_reset, 1); + I("%s make TP_RESET high\n", __func__); + usleep_range(5000, 5000); + } +#endif + + if (ts->SMWP_enable) + himax_ctrl_lcd_regulators(ts, false); + else + himax_pinctrl_configure(ts, true); + + atomic_set(&ts->suspend_mode, HIMAX_STATE_POWER_ON); + +#if defined(HX_RST_PIN_FUNC) && defined(HX_RESUME_HW_RESET) + if (g_core_fp.fp_ic_reset != NULL) + g_core_fp.fp_ic_reset(false, false); +#endif + +#if defined(HX_ZERO_FLASH) && defined(HX_RESUME_SET_FW) +#ifdef HX_SMART_WAKEUP + if (!ts->SMWP_enable) { +#endif + I("It will update fw after resume in zero flash mode!\n"); + if (g_core_fp.fp_0f_operation_dirly != NULL) { + result = g_core_fp.fp_0f_operation_dirly(); + if (result) { + E("Something is wrong! Skip Update with zero flash!\n"); + goto ESCAPE_0F_UPDATE; + } + } + if (g_core_fp.fp_reload_disable != NULL) + g_core_fp.fp_reload_disable(0); + if (g_core_fp.fp_sense_on != NULL) + g_core_fp.fp_sense_on(0x00); +#ifdef HX_SMART_WAKEUP + } +#endif +#endif + + if (ts->aot_enabled) + ts->SMWP_enable = 1; + ts->prox_power_off = 0; + +#if defined(HX_SMART_WAKEUP) || defined(HX_HIGH_SENSE) || defined(HX_USB_DETECT_GLOBAL) + if (g_core_fp.fp_resend_cmd_func != NULL) + g_core_fp.fp_resend_cmd_func(ts->suspended); + +#ifdef HX_CODE_OVERLAY + if (ts->SMWP_enable && ts->in_self_test == 0) + g_core_fp.fp_0f_overlay(3, 0); +#endif +#endif + himax_report_all_leave_event(ts); + + if (g_core_fp.fp_sense_on != NULL) + g_core_fp.fp_resume_ic_action(); + himax_int_enable(1); +#if defined(HX_ZERO_FLASH) && defined(HX_RESUME_SET_FW) +ESCAPE_0F_UPDATE: +#endif +END: + if (ts->in_self_test == 1) + ts->suspend_resume_done = 1; + + cancel_delayed_work(&ts->work_print_info); + ts->print_info_cnt_open = 0; + ts->print_info_cnt_release = 0; + schedule_work(&ts->work_print_info.work); + + I("%s: END\n", __func__); + mutex_unlock(&ts->device_lock); + return 0; +} + diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_common.h b/drivers/input/touchscreen/himax/hx831xx/himax_common.h new file mode 100755 index 000000000000..981d7b875260 --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_common.h @@ -0,0 +1,632 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for common functions + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef HIMAX_COMMON_H +#define HIMAX_COMMON_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if IS_ENABLED(CONFIG_OF) +#include +#endif + +#if IS_ENABLED(CONFIG_INPUT_SEC_INPUT_LEGO) +#include "../../../sec_input/sec_input.h" +#else +#include +#endif + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_I2C) +#include "himax_platform.h" +#endif + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_SPI) +#include "himax_platform_SPI.h" +#endif + +#if IS_ENABLED(CONFIG_VBUS_NOTIFIER) || IS_ENABLED(CONFIG_MUIC_NOTIFIER) +#include +#include +#include +#endif + +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) +#include +#endif + +#define HIMAX_DRIVER_VER "2.0.0.28_ABCD1234_01" + +#define FLASH_DUMP_FILE "/sdcard/HX_Flash_Dump.bin" + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_DEBUG) + #define HX_TP_PROC_2T2R + /*#define HX_TP_SELF_TEST_DRIVER*/ /*if enable, selftest works in driver*/ +#endif +/*===========Himax Option function=============*/ +#define HX_RST_PIN_FUNC +#define HX_RESUME_SEND_CMD +#define HX_ESD_RECOVERY +#define HX_TP_PROC_GUEST_INFO +#define HX_NEW_EVENT_STACK_FORMAT +#define HX_AUTO_UPDATE_FW +#define HX_SMART_WAKEUP +/*#define HX_GESTURE_TRACK*/ +/*#define HX_HIGH_SENSE*/ +/*#define HX_PALM_REPORT*/ +#define HX_USB_DETECT_GLOBAL +/*#define HX_USB_DETECT_CALLBACK*/ +/*#define HX_PROTOCOL_A*/ /* for MTK special platform.If turning on,it will report to system by using specific format. */ +/*#define HX_RESUME_HW_RESET*/ +#define HX_PROTOCOL_B_3PA +/*#define HX_ZERO_FLASH*/ +/*#define HX_RESUME_SET_FW*/ +/*#define HX_EN_DYNAMIC_NAME*/ /* Support dynamic load fw name ,default is close */ +/*#define HX_PON_PIN_SUPPORT*/ +/*#define HX_CONTAINER_SPEED_UP*/ /*Independent threads run the notification chain notification function resume */ +#define SEC_FACTORY_MODE +#define SEC_PALM_FUNC +#define SEC_FIX_MAX_PT 10 +#define SEC_FIX_INT_EDGE true + +/*#define HX_EN_SEL_BUTTON*/ /* Support Self Virtual key ,default is close*/ +/*#define HX_EN_MUT_BUTTON*/ /* Support Mutual Virtual Key ,default is close*/ +/*=============================================*/ +#if defined(HX_EN_SEL_BUTTON) || defined(HX_EN_MUT_BUTTON) + /*#define HX_PLATFOME_DEFINE_KEY*/ /* for specfic platform to set key(button) */ +#endif + +#if defined(HX_ZERO_FLASH) +#define HX_FIX_TOUCH_INFO /* zero flash case, you need to setup the fix_touch_info of module*/ +/*#define HX_CODE_OVERLAY*/ +#endif + +#if defined(HX_SMART_WAKEUP) +/*#define HX_P_SENSOR*/ +#endif + +#if defined(HX_CONTAINER_SPEED_UP) +#define DELAY_TIME 40 /*Resume queue delay work time after LCM RST (unit:ms)*/ +#endif + +#define HX_MAX_WRITE_SZ (128 * 1024) + +#define HX_KEY_MAX_COUNT 4 +#define DEFAULT_RETRY_CNT 3 + +#define HX_85XX_A_SERIES_PWON "HX85xxA" +#define HX_85XX_B_SERIES_PWON "HX85xxB" +#define HX_85XX_C_SERIES_PWON "HX85xxC" +#define HX_85XX_D_SERIES_PWON "HX85xxD" +#define HX_85XX_E_SERIES_PWON "HX85xxE" +#define HX_85XX_ES_SERIES_PWON "HX85xxES" +#define HX_85XX_F_SERIES_PWON "HX85xxF" +#define HX_85XX_H_SERIES_PWON "HX85xxH" +#define HX_83100A_SERIES_PWON "HX83100A" +#define HX_83102A_SERIES_PWON "HX83102A" +#define HX_83102B_SERIES_PWON "HX83102B" +#define HX_83102D_SERIES_PWON "HX83102D" +#define HX_83102E_SERIES_PWON "HX83102E" +#define HX_83103A_SERIES_PWON "HX83103A" +#define HX_83106A_SERIES_PWON "HX83106A" +#define HX_83110A_SERIES_PWON "HX83110A" +#define HX_83110B_SERIES_PWON "HX83110B" +#define HX_83111B_SERIES_PWON "HX83111B" +#define HX_83112A_SERIES_PWON "HX83112A" +#define HX_83112B_SERIES_PWON "HX83112B" +#define HX_83113A_SERIES_PWON "HX83113A" +#define HX_83112D_SERIES_PWON "HX83112D" +#define HX_83112E_SERIES_PWON "HX83112E" +#define HX_83191A_SERIES_PWON "HX83191A" +#define HX_83121A_SERIES_PWON "HX83121A" + +#define HX_TP_BIN_CHECKSUM_SW 1 +#define HX_TP_BIN_CHECKSUM_HW 2 +#define HX_TP_BIN_CHECKSUM_CRC 3 + +#define SHIFTBITS 5 + +#define FW_SIZE_32k 32768 +#define FW_SIZE_60k 61440 +#define FW_SIZE_64k 65536 +#define FW_SIZE_124k 126976 +#define FW_SIZE_128k 131072 +#define FW_SIZE_255k 261120 + +#define NO_ERR 0 +#define READY_TO_SERVE 1 +#define WORK_OUT 2 +#define I2C_FAIL -1 +#define HX_INIT_FAIL -1 +#define MEM_ALLOC_FAIL -2 +#define CHECKSUM_FAIL -3 +#define GESTURE_DETECT_FAIL -4 +#define INPUT_REGISTER_FAIL -5 +#define FW_NOT_READY -6 +#define LENGTH_FAIL -7 +#define OPEN_FILE_FAIL -8 +#define ERR_WORK_OUT -10 +#define ERR_STS_WRONG -11 +#define ERR_TEST_FAIL -12 +#define HW_CRC_FAIL 1 + +#define HX_FINGER_ON 1 +#define HX_FINGER_LEAVE 2 + +#if defined(HX_PALM_REPORT) +#define PALM_REPORT 1 +#define NOT_REPORT -1 +#endif + +#ifdef SEC_PALM_FUNC +#define SEC_FINGER_INFO_SZ 24 +#endif + +#if defined(__EMBEDDED_FW__) +extern const uint8_t _binary___Himax_firmware_bin_start[]; +extern const uint8_t _binary___Himax_firmware_bin_end[]; +extern struct firmware g_embedded_fw; +#endif + +enum HX_TS_PATH { + HX_REPORT_COORD = 1, + HX_REPORT_SMWP_EVENT, + HX_REPORT_COORD_RAWDATA, +}; + +enum HX_TS_STATUS { + HX_TS_GET_DATA_FAIL = -4, + HX_ESD_EVENT, + HX_CHKSUM_FAIL, + HX_PATH_FAIL, + HX_TS_NORMAL_END = 0, + HX_ESD_REC_OK, + HX_READY_SERVE, + HX_REPORT_DATA, + HX_ESD_WARNING, + HX_IC_RUNNING, + HX_ZERO_EVENT_COUNT, + HX_RST_OK, +}; + +enum cell_type { + CHIP_IS_ON_CELL, + CHIP_IS_IN_CELL +}; + +#if 0//def SEC_FACTORY_MODE +struct sec_rawdata_buffs { + uint32_t *_rawdata; + uint32_t *_open; + uint32_t *_mopen; + uint32_t *_short; + int *_noise; + uint32_t *_lp_rawdata; + int *_lp_noise; + int *_gap_ver; + int *_gap_hor; + int f_ready_rawdata; + int f_ready_open; + int f_ready_mopen; + int f_ready_short; + int f_ready_noise; + int f_ready_lp_rawdata; + int f_ready_lp_noise; + int f_ready_gap_ver; + int f_ready_gap_hor; + int f_crtra_ready; +}; +#endif /* SEC_FACTORY_MODE */ + +#ifdef HX_FIX_TOUCH_INFO +enum fix_touch_info { + FIX_HX_RX_NUM = 60, + FIX_HX_TX_NUM = 40, + FIX_HX_BT_NUM = 0, + FIX_HX_X_RES = 1600, + FIX_HX_Y_RES = 2560, + FIX_HX_MAX_PT = 10, + FIX_HX_XY_REVERSE = true, + FIX_HX_INT_IS_EDGE = true, +#ifdef HX_TP_PROC_2T2R + FIX_HX_RX_NUM_2 = 0, + FIX_HX_TX_NUM_2 = 0, +#endif +}; +#endif + +#ifdef HX_ZERO_FLASH + #define HX_SPI_OPERATION + #define HX_0F_DEBUG +#endif +struct himax_ic_data { + int vendor_fw_ver; + int vendor_config_ver; + int vendor_touch_cfg_ver; + int vendor_display_cfg_ver; + int vendor_cid_maj_ver; + int vendor_cid_min_ver; + int vendor_panel_ver; + int vendor_sensor_id; + int vendor_ic_name_ver; +#if defined(HX_AUTO_UPDATE_FW) || defined(HX_ZERO_FLASH) +#ifdef HX_EN_DYNAMIC_NAME + int vendor_ic_ver; + int vendor_old_ic_ver; + uint8_t vendor_semifac; +#endif +#endif + uint8_t vendor_cus_info[12]; + uint8_t vendor_proj_info[12]; + uint8_t vendor_ic_id[13]; + uint32_t flash_size; + int HX_RX_NUM; + int HX_TX_NUM; + int HX_BT_NUM; + int HX_X_RES; + int HX_Y_RES; + int HX_MAX_PT; + bool HX_XY_REVERSE; + bool HX_INT_IS_EDGE; +#ifdef HX_TP_PROC_2T2R + int HX_RX_NUM_2; + int HX_TX_NUM_2; +#endif +}; + +struct himax_virtual_key { + int index; + int keycode; + int x_range_min; + int x_range_max; + int y_range_min; + int y_range_max; +}; + +struct himax_target_report_data { + int *x; + int *y; + int *w; +#ifdef SEC_PALM_FUNC + int *maj; + int *min; + int *palm; +#endif + int *finger_id; + int finger_on; + int finger_num; + int *mv_cnt; +#ifdef HX_PLATFORM_DEFINE_KEY + int key_size; + int *key_x; + int *key_y; + int *key_w; +#endif +#ifdef HX_SMART_WAKEUP + int SMWP_event_chk; +#endif + int ig_count; + +}; + +struct himax_report_data { + int touch_all_size; + int raw_cnt_max; + int raw_cnt_rmd; + int touch_info_size; + uint8_t finger_num; + uint8_t finger_on; + uint8_t *hx_coord_buf; + uint8_t hx_state_info[2]; +#if defined(HX_SMART_WAKEUP) + int event_size; + uint8_t *hx_event_buf; +#endif + + int rawdata_size; + uint8_t diag_cmd; + uint8_t *hx_rawdata_buf; + uint8_t rawdata_frame_size; +}; + +struct himax_ts_data { + bool initialized; + bool suspended; + atomic_t suspend_mode; + uint8_t x_channel; + uint8_t y_channel; + uint8_t useScreenRes; + uint8_t diag_cmd; + char chip_name[30]; + uint8_t chip_cell_type; + + uint8_t protocol_type; + uint8_t first_pressed; + uint8_t coord_data_size; + uint8_t area_data_size; + uint8_t coordInfoSize; + uint8_t raw_data_frame_size; + uint8_t raw_data_nframes; + uint8_t nFinger_support; + uint8_t irq_enabled; + uint8_t diag_self[50]; + uint8_t touch_count; + + uint16_t finger_pressed; + uint16_t last_slot; + uint16_t pre_finger_mask; + uint16_t old_finger; + int hx_point_num; + + uint32_t debug_log_level; + uint32_t widthFactor; + uint32_t heightFactor; + uint32_t tw_x_min; + uint32_t tw_x_max; + uint32_t tw_y_min; + uint32_t tw_y_max; + uint32_t pl_x_min; + uint32_t pl_x_max; + uint32_t pl_y_min; + uint32_t pl_y_max; + + int comm_err_count; + + int rst_gpio; + int use_irq; + struct pinctrl *pinctrl; + int (*power) (int on); + int pre_finger_data[10][6]; /*0: x, 1:y, 2:w, 3:mv_cnt, 4:major, 5:minor */ + int p_x[10]; + int p_y[10]; + + uint8_t glove_enabled; + bool aot_enabled; + int prox_power_off; + bool cover_closed; + + bool noise_mode; + bool lamp_noise_mode; + + unsigned long palm_flag; + int gpio_cs; + + struct device *dev; + struct workqueue_struct *himax_wq; + struct work_struct work; + struct input_dev *input_dev; + struct input_dev *input_dev_pad; + struct hrtimer timer; + struct i2c_client *client; + struct himax_i2c_platform_data *pdata; + struct himax_virtual_key *button; + struct mutex rw_lock; + atomic_t irq_state; + struct mutex irq_lock; + + struct completion resume_done; + + struct delayed_work work_print_info; + u32 print_info_cnt_open; + u32 print_info_cnt_release; + + struct mutex device_lock; + struct delayed_work work_read_info; + +/******* SPI-start *******/ + struct mutex spi_lock; + struct spi_device *spi; + int hx_irq; + uint8_t *xfer_buff; +/******* SPI-end *******/ + + int in_self_test; + int suspend_resume_done; + int bus_speed; + +#if IS_ENABLED(CONFIG_MUIC_NOTIFIER) + struct notifier_block muic_nb; +#endif +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) + struct notifier_block ccic_nb; +#endif +#if IS_ENABLED(CONFIG_VBUS_NOTIFIER) + struct notifier_block vbus_nb; +#endif + + struct notifier_block reboot_notifier; + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER_LEGO) + struct notifier_block himax_input_nb; +#endif + + struct workqueue_struct *flash_wq; + struct work_struct flash_work; + +#ifdef HX_AUTO_UPDATE_FW + struct workqueue_struct *himax_update_wq; + struct delayed_work work_update; +#endif + +#ifdef HX_ZERO_FLASH + struct workqueue_struct *himax_0f_update_wq; + struct delayed_work work_0f_update; +#endif + +#ifdef HX_CONTAINER_SPEED_UP + struct workqueue_struct *ts_int_workqueue; + struct delayed_work ts_int_work; +#endif + + struct workqueue_struct *himax_diag_wq; + struct delayed_work himax_diag_delay_wrok; + + uint8_t SMWP_enable; +#ifdef HX_SMART_WAKEUP + uint8_t gesture_cust_en[26]; + struct wakeup_source *ts_SMWP_wake_lock; +#ifdef HX_P_SENSOR + bool psensor_flag; +#endif +#endif + +#ifdef HX_HIGH_SENSE + uint8_t HSEN_enable; +#endif + +#if defined(HX_USB_DETECT_CALLBACK) || defined(HX_USB_DETECT_GLOBAL) + uint8_t usb_connected; + uint8_t *cable_config; +#endif + +#ifdef HX_TP_PROC_GUEST_INFO + struct workqueue_struct *guest_info_wq; + struct work_struct guest_info_work; +#endif + +#ifdef SEC_FACTORY_MODE + struct sec_cmd_data sec; +#endif +}; + + +struct himax_debug { + bool flash_dump_going; + void (*fp_ts_dbg_func)(struct himax_ts_data *ts, int start); + int (*fp_set_diag_cmd)(struct himax_ic_data *ic_data, struct himax_report_data *hx_touch_data); +}; + +enum input_protocol_type { + PROTOCOL_TYPE_A = 0x00, + PROTOCOL_TYPE_B = 0x01, +}; + +typedef enum { + HIMAX_STATE_POWER_ON = 0, + HIMAX_STATE_POWER_OFF, + HIMAX_STATE_LPM, +} TOUCH_POWER_MODE; + +enum { + SHUTDOWN = -1, + LCD_NONE = 0, + LCD_OFF, + LCD_ON, + LCD_DOZE, + LCD_DOZE_SUSPEND, + LPM_OFF = 20, + FORCE_OFF, + FORCE_ON, +}; + +enum { + LCD_EARLY_EVENT = 0, + LCD_LATE_EVENT +}; + +enum AP_MODE { + GAME_MODE, + NOTE_MODE, + SIP_MODE, + HIGH_SENSITIVITY_MODE +}; + +#ifdef HX_HIGH_SENSE +void himax_set_HSEN_func(uint8_t HSEN_enable); +#endif + +#ifdef HX_SMART_WAKEUP +void himax_set_SMWP_func(uint8_t SMWP_enable); + +#define GEST_PTLG_ID_LEN (4) +#define GEST_PTLG_HDR_LEN (4) +#define GEST_PTLG_HDR_ID1 (0xCC) +#define GEST_PTLG_HDR_ID2 (0x44) +#define GEST_PT_MAX_NUM (128) + +extern uint8_t *wake_event_buffer; +#endif + +extern int g_mmi_refcnt; +extern int *g_inspt_crtra_flag; +extern uint32_t g_hx_chip_inited; +/*void himax_HW_reset(uint8_t loadconfig,uint8_t int_off);*/ + +int himax_chip_common_suspend(struct himax_ts_data *ts); +int himax_chip_common_resume(struct himax_ts_data *ts); +int himax_ctrl_lcd_regulators(struct himax_ts_data *ts, bool on); +int himax_ctrl_lcd_reset_regulator(struct himax_ts_data *ts, bool on); + +struct himax_core_fp; +extern struct himax_core_fp g_core_fp; +extern struct himax_ts_data *private_ts; +extern struct himax_ic_data *ic_data; +extern struct device *g_device; + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_DEBUG) + int himax_debug_init(void); + int himax_debug_remove(void); +#endif + +#if IS_ENABLED(CONFIG_BATTERY_SAMSUNG) + extern unsigned int lpcharge; +#endif + +#if defined(HX_PLATFOME_DEFINE_KEY) + void himax_platform_key(void); +#endif + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_INSPECT) + extern char *g_rslt_data; + extern void (*fp_himax_self_test_init)(void); +#endif + +int himax_parse_dt(struct himax_ts_data *ts, struct himax_i2c_platform_data *pdata); +int himax_report_data(struct himax_ts_data *ts, int ts_path, int ts_status); + +int himax_report_data_init(void); + +int himax_dev_set(struct himax_ts_data *ts); +int himax_input_register_device(struct input_dev *input_dev); +int himax_pinctrl_configure(struct himax_ts_data *ts, bool active); + +void himax_run_rawdata_all(struct himax_ts_data *data); + +int himax_set_ap_change_mode(int mode, int enable); + +#if defined(HX_USB_DETECT_GLOBAL) +void himax_cable_detect_func(bool force_renew); +extern bool USB_detect_flag; +#endif +#endif diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_debug.c b/drivers/input/touchscreen/himax/hx831xx/himax_debug.c new file mode 100755 index 000000000000..09120598b7de --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_debug.c @@ -0,0 +1,2878 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for debug nodes + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "himax_debug.h" +#include "himax_ic_core.h" + +#ifdef HX_TP_PROC_2T2R +bool Is_2T2R; +EXPORT_SYMBOL(Is_2T2R); +int HX_RX_NUM_2; +int HX_TX_NUM_2; +#endif + +uint8_t g_diag_arr_num; + +int g_max_mutual; +int g_min_mutual = 0xFFFF; +int g_max_self; +int g_min_self = 0xFFFF; + +/* moved from debug.h */ + +struct proc_dir_entry *himax_proc_vendor_file; +uint8_t byte_length; +uint8_t register_command[4]; +uint8_t cfg_flag; + +struct proc_dir_entry *himax_proc_stack_file; +struct proc_dir_entry *himax_proc_iir_file; +struct proc_dir_entry *himax_proc_dc_file; +struct proc_dir_entry *himax_proc_bank_file; +bool dsram_flag; + +#ifdef HX_TP_PROC_2T2R +uint32_t *diag_mutual_2; +#endif +int32_t *diag_mutual; +int32_t *diag_mutual_new; +int32_t *diag_mutual_old; +uint8_t diag_max_cnt; +uint8_t hx_state_info[2]; +uint8_t diag_coor[128]; +int32_t diag_self[100]; +int32_t diag_self_new[100]; +int32_t diag_self_old[100]; + +struct proc_dir_entry *himax_proc_debug_file; +bool fw_update_complete; +int handshaking_result; +unsigned char debug_level_cmd; +uint8_t cmd_set[8]; +uint8_t mutual_set_flag; + +struct proc_dir_entry *himax_proc_flash_dump_file; +uint8_t *flash_buffer; +uint8_t g_flash_cmd; +uint8_t g_flash_progress; +bool g_flash_dump_rst; /*Fail = 0, Pass = 1*/ + +uint32_t **raw_data_array; +uint8_t X_NUM; +uint8_t Y_NUM; +uint8_t sel_type = 0x0D; + +/* Moved from debug.h End */ +char buf_tmp[BUF_SIZE] = {0}; +uint8_t *reg_read_data; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) +struct timespec64 timeStart, timeEnd, timeDelta; +#else +struct timespec timeStart, timeEnd, timeDelta; +#endif + +int g_switch_mode; +/* + * Segment : Himax PROC Debug Function + */ + +static ssize_t himax_crc_test_read(char *buf, size_t len) +{ + ssize_t ret = 0; + uint8_t result = 0; + uint32_t size = 0; + + g_core_fp.fp_sense_off(true); + msleep(20); + size = ic_data->flash_size; + + result = g_core_fp.fp_calculateChecksum(false, size); + g_core_fp.fp_sense_on(0x01); + + if (result) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "CRC test is Pass!\n"); + else + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "CRC test is Fail!\n"); + + return ret; +} + +static ssize_t himax_vendor_read(struct file *file, char *buf, + size_t len, loff_t *pos) +{ + ssize_t ret = 0; + + if (!HX_PROC_SEND_FLAG) { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "FW_VER = 0x%2.2X\n", + ic_data->vendor_fw_ver); + + if (private_ts->chip_cell_type == CHIP_IS_ON_CELL) { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "CONFIG_VER = 0x%2.2X\n", + ic_data->vendor_config_ver); + } else { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "TOUCH_VER = 0x%2.2X\n", + ic_data->vendor_touch_cfg_ver); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "DISPLAY_VER = 0x%2.2X\n", + ic_data->vendor_display_cfg_ver); + } + + if (ic_data->vendor_cid_maj_ver < 0 && + ic_data->vendor_cid_min_ver < 0) { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "CID_VER = NULL\n"); + } else { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "CID_VER = 0x%2.2X\n", + (ic_data->vendor_cid_maj_ver << 8 | + ic_data->vendor_cid_min_ver)); + } + + if (ic_data->vendor_panel_ver < 0) { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "PANEL_VER = NULL\n"); + } else { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "PANEL_VER = 0x%2.2X\n", + ic_data->vendor_panel_ver); + } + if (private_ts->chip_cell_type == CHIP_IS_IN_CELL) { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Cusomer = %s\n", ic_data->vendor_cus_info); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Project = %s\n", ic_data->vendor_proj_info); + } +#if defined(HX_AUTO_UPDATE_FW) || defined(HX_ZERO_FLASH) +#ifdef HX_EN_DYNAMIC_NAME + if (ic_data->vendor_semifac == 1) { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "SEMI_FAC = UMC\n"); + } else if (ic_data->vendor_semifac == 2) { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "SEMI_FAC = PSC\n"); + } else { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "SEMI_FAC = NULL\n"); + } +#endif +#endif + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "\n"); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Himax Touch Driver Version:\n"); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "%s\n", + HIMAX_DRIVER_VER); + HX_PROC_SEND_FLAG = 1; + + if (copy_to_user(buf, buf_tmp, (len > BUF_SIZE)?BUF_SIZE:len)) + I("%s,here:%d\n", __func__, __LINE__); + + } else { + HX_PROC_SEND_FLAG = 0; + } + + return ret; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) +static const struct proc_ops himax_proc_vendor_ops = { + .proc_read = himax_vendor_read, +}; +#else +static const struct file_operations himax_proc_vendor_ops = { + .owner = THIS_MODULE, + .read = himax_vendor_read, +}; +#endif + +static ssize_t himax_attn_read(char *buf, size_t len) +{ + ssize_t ret = 0; + struct himax_ts_data *ts_data; + + ts_data = private_ts; + + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "attn = %x\n", + himax_int_gpio_read(ts_data->pdata->gpio_irq)); + + return ret; +} + +static ssize_t himax_int_en_read(char *buf, size_t len) +{ + struct himax_ts_data *ts = private_ts; + size_t ret = 0; + + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "%d\n", + ts->irq_enabled); + + return ret; +} + +static ssize_t himax_int_en_write(char *buf, size_t len) +{ + struct himax_ts_data *ts = private_ts; + int ret = 0; + + if (len >= 12) { + I("%s: no command exceeds 12 chars.\n", __func__); + return -EFAULT; + } + + if (buf[0] == '0') { + himax_int_enable(0); + } else if (buf[0] == '1') { + himax_int_enable(1); + } else if (buf[0] == '2') { + himax_int_enable(0); + free_irq(ts->hx_irq, ts); + ts->irq_enabled = 0; + } else if (buf[0] == '3') { + ret = himax_int_en_set(); + + if (ret == 0) { + ts->irq_enabled = 1; + atomic_set(&ts->irq_state, 1); + } + } else + return -EINVAL; + + return len; +} + +static ssize_t himax_layout_read(char *buf, size_t len) +{ + struct himax_ts_data *ts = private_ts; + size_t ret = 0; + + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "%d ", + ts->pdata->abs_x_min); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "%d ", + ts->pdata->abs_x_max); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "%d ", + ts->pdata->abs_y_min); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "%d ", + ts->pdata->abs_y_max); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "\n"); + + return ret; +} + +static ssize_t himax_layout_write(char *buf, size_t len) +{ + struct himax_ts_data *ts = private_ts; + char buf_tmp[5] = {0}; + int i = 0, j = 0, k = 0, ret; + unsigned long value; + int layout[4] = {0}; + + if (len >= 80) { + I("%s: no command exceeds 80 chars.\n", __func__); + return -EFAULT; + } + + for (i = 0; i < 20; i++) { + if (buf[i] == ',' || buf[i] == '\n') { + memset(buf_tmp, 0x0, sizeof(buf_tmp)); + + if (i - j <= 5) { + memcpy(buf_tmp, buf + j, i - j); + } else { + I("buffer size is over 5 char\n"); + return len; + } + + j = i + 1; + + if (k < 4) { + ret = kstrtoul(buf_tmp, 10, &value); + layout[k++] = value; + } + } + } + + if (k == 4) { + ts->pdata->abs_x_min = layout[0]; + ts->pdata->abs_x_max = (layout[1] - 1); + ts->pdata->abs_y_min = layout[2]; + ts->pdata->abs_y_max = (layout[3] - 1); + I("%d, %d, %d, %d\n", + ts->pdata->abs_x_min, ts->pdata->abs_x_max, + ts->pdata->abs_y_min, ts->pdata->abs_y_max); + input_unregister_device(ts->input_dev); + if (ts->pdata->support_dex && ts->input_dev_pad) + input_unregister_device(ts->input_dev_pad); + + ret = himax_dev_set(ts); + if (ret >= 0) { + himax_input_register(ts, ts->input_dev, INPUT_PROP_DIRECT); + if (ts->pdata->support_dex) + himax_input_register(ts, ts->input_dev_pad, INPUT_PROP_POINTER); + } + } else { + I("ERR@%d, %d, %d, %d\n", + ts->pdata->abs_x_min, ts->pdata->abs_x_max, + ts->pdata->abs_y_min, ts->pdata->abs_y_max); + } + + return len; +} + +static ssize_t himax_debug_level_read(char *buf, size_t len) +{ + struct himax_ts_data *ts_data; + size_t ret = 0; + + ts_data = private_ts; + + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "%d\n", + ts_data->debug_log_level); + + if (copy_to_user(buf, buf_tmp, (len > BUF_SIZE)?BUF_SIZE:len)) + I("%s,here:%d\n", __func__, __LINE__); + + return ret; +} + +static ssize_t himax_debug_level_write(char *buf, size_t len) +{ + struct himax_ts_data *ts; + unsigned int i; + + ts = private_ts; + + if (len >= 12) { + I("%s: no command exceeds 12 chars.\n", __func__); + return -EFAULT; + } + + ts->debug_log_level = 0; + + for (i = 0; i < len; i++) { + if (buf[i] >= '0' && buf[i] <= '9') + ts->debug_log_level |= (buf[i] - '0'); + else if (buf[i] >= 'A' && buf[i] <= 'F') + ts->debug_log_level |= (buf[i] - 'A' + 10); + else if (buf[i] >= 'a' && buf[i] <= 'f') + ts->debug_log_level |= (buf[i] - 'a' + 10); + + if (i != len - 1) + ts->debug_log_level <<= 4; + } + I("Now debug level value=%d\n", ts->debug_log_level); + if (ts->debug_log_level & BIT(4)) { + I("Turn on/Enable Debug Mode for Inspection!\n"); + goto END_FUNC; + } + + if (ts->debug_log_level & BIT(3)) { + if (ts->pdata->screenWidth > 0 && ts->pdata->screenHeight > 0 && + (ts->pdata->abs_x_max - ts->pdata->abs_x_min) > 0 && + (ts->pdata->abs_y_max - ts->pdata->abs_y_min) > 0) { + ts->widthFactor = (ts->pdata->screenWidth << SHIFTBITS) + / (ts->pdata->abs_x_max - ts->pdata->abs_x_min); + ts->heightFactor = + (ts->pdata->screenHeight << SHIFTBITS) / + (ts->pdata->abs_y_max - ts->pdata->abs_y_min); + + if (ts->widthFactor > 0 && ts->heightFactor > 0) { + ts->useScreenRes = 1; + } else { + ts->heightFactor = 0; + ts->widthFactor = 0; + ts->useScreenRes = 0; + } + } else { + I("Enable finger debug with raw position mode!\n"); + } + } else { + ts->useScreenRes = 0; + ts->widthFactor = 0; + ts->heightFactor = 0; + } +END_FUNC: + return len; +} + +static ssize_t himax_proc_register_read(char *buf, size_t len) +{ + int ret = 0; + uint16_t loop_i; + + memset(reg_read_data, 0x00, 128 * sizeof(uint8_t)); + + I("himax_register_show: %02X,%02X,%02X,%02X\n", + register_command[3], register_command[2], + register_command[1], register_command[0]); + g_core_fp.fp_register_read(register_command, 128, reg_read_data, + cfg_flag); + ret += snprintf(buf_tmp + ret, len - ret, + "command: %02X,%02X,%02X,%02X\n", + register_command[3], register_command[2], + register_command[1], register_command[0]); + + for (loop_i = 0; loop_i < 128; loop_i++) { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "0x%2.2X ", + reg_read_data[loop_i]); + if ((loop_i % 16) == 15) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "\n"); + + } + + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "\n"); + + return ret; +} + +static ssize_t himax_proc_register_write(char *buf, size_t len) +{ + char buff_tmp[16] = {0}; + uint8_t length = 0; + unsigned long result = 0; + uint8_t loop_i = 0; + uint16_t base = 2; + char *data_str = NULL; + uint8_t w_data[20] = {0}; + uint8_t x_pos[20] = {0}; + uint8_t count = 0; + + if (len >= 80) { + I("%s: no command exceeds 80 chars.\n", __func__); + return -EFAULT; + } + + memset(register_command, 0x0, sizeof(register_command)); + + I("himax %s\n", buf); + + if ((buf[0] == 'r' || buf[0] == 'w') && buf[1] == ':' && + buf[2] == 'x') { + length = strlen(buf); + + /* I("%s: length = %d.\n", __func__,length); */ + for (loop_i = 0; loop_i < length; loop_i++) { + /* find postion of 'x' */ + if (buf[loop_i] == 'x') { + x_pos[count] = loop_i; + count++; + } + } + + data_str = strrchr(buf, 'x'); + I("%s: %s.\n", __func__, data_str); + length = strlen(data_str + 1); + + switch (buf[0]) { + case 'r': + if (buf[3] == 'F' && buf[4] == 'E' && length == 4) { + length = length - base; + cfg_flag = 1; + memcpy(buff_tmp, data_str + base + 1, length); + } else { + cfg_flag = 0; + memcpy(buff_tmp, data_str + 1, length); + } + byte_length = length / 2; + if (!kstrtoul(buff_tmp, 16, &result)) { + for (loop_i = 0; loop_i < byte_length; loop_i++) + register_command[loop_i] = + (uint8_t)(result >> loop_i * 8); + } + + if (strcmp(HX_85XX_H_SERIES_PWON, + private_ts->chip_name) == 0 && cfg_flag == 0) + cfg_flag = 2; + break; + case 'w': + if (buf[3] == 'F' && buf[4] == 'E') { + cfg_flag = 1; + memcpy(buff_tmp, buf + base + 3, length); + } else { + cfg_flag = 0; + memcpy(buff_tmp, buf + 3, length); + } + + if (count < 3) { + byte_length = length / 2; + + if (!kstrtoul(buff_tmp, 16, &result)) { + /* command */ + for (loop_i = 0; loop_i < byte_length; + loop_i++) { + register_command[loop_i] = + (uint8_t)(result >> loop_i * 8); + } + } + + if (!kstrtoul(data_str + 1, 16, &result)) { + /* data */ + for (loop_i = 0; loop_i < byte_length; + loop_i++) { + w_data[loop_i] = + (uint8_t)(result >> loop_i * 8); + } + } + + g_core_fp.fp_register_write(register_command, + byte_length, w_data, cfg_flag); + } else { + for (loop_i = 0; loop_i < count; loop_i++) { + /* parsing addr after 'x' */ + memset(buff_tmp, 0x0, sizeof(buff_tmp)); + if (cfg_flag != 0 && loop_i != 0) + byte_length = 2; + else + byte_length = x_pos[1] - + x_pos[0] - 2;/* original */ + memcpy(buff_tmp, buf + x_pos[loop_i] + 1, + byte_length); + + /* I("%s: buff_tmp = %s\n", __func__, + * buff_tmp); + */ + if (!kstrtoul(buff_tmp, 16, &result)) { + if (loop_i == 0) { + register_command[loop_i] + = (uint8_t)(result); + /* I("%s: + * register_command + * = %X\n", __func__, + * register_command[0]); + */ + } else { + w_data[loop_i - 1] = + (uint8_t)(result); + /* I("%s: w_data[%d] = + * %2X\n", __func__, + * loop_i - 1, + * w_data[loop_i - 1]); + */ + } + } + } + + byte_length = count - 1; + if (strcmp(HX_85XX_H_SERIES_PWON, + private_ts->chip_name) == 0 && cfg_flag == 0) + cfg_flag = 2; + g_core_fp.fp_register_write(register_command, + byte_length, &w_data[0], cfg_flag); + + } + break; + }; + } + return len; +} + +int32_t *getMutualBuffer(void) +{ + return diag_mutual; +} +int32_t *getMutualNewBuffer(void) +{ + return diag_mutual_new; +} +int32_t *getMutualOldBuffer(void) +{ + return diag_mutual_old; +} +int32_t *getSelfBuffer(void) +{ + return &diag_self[0]; +} +int32_t *getSelfNewBuffer(void) +{ + return &diag_self_new[0]; +} +int32_t *getSelfOldBuffer(void) +{ + return &diag_self_old[0]; +} +void setMutualBuffer(uint8_t x_num, uint8_t y_num) +{ + diag_mutual = kzalloc(x_num * y_num * sizeof(int32_t), GFP_KERNEL); +} +void setMutualNewBuffer(uint8_t x_num, uint8_t y_num) +{ + diag_mutual_new = kzalloc(x_num * y_num * sizeof(int32_t), GFP_KERNEL); +} +void setMutualOldBuffer(uint8_t x_num, uint8_t y_num) +{ + diag_mutual_old = kzalloc(x_num * y_num * sizeof(int32_t), GFP_KERNEL); +} + +#ifdef HX_TP_PROC_2T2R +int32_t *getMutualBuffer_2(void) +{ + return diag_mutual_2; +} +void setMutualBuffer_2(uint8_t x_num_2, uint8_t y_num_2) +{ + diag_mutual_2 = + kzalloc(x_num_2 * y_num_2 * sizeof(int32_t), GFP_KERNEL); +} +#endif + +int himax_set_diag_cmd(struct himax_ic_data *ic_data, + struct himax_report_data *hx_touch_data) +{ + struct himax_ts_data *ts = private_ts; + int32_t *mutual_data; + int32_t *self_data; + int mul_num; + int self_num; + /* int RawDataLen = 0; */ + hx_touch_data->diag_cmd = ts->diag_cmd; + + if (hx_touch_data->diag_cmd >= 1 && hx_touch_data->diag_cmd <= 7) { + /* Check event stack CRC */ + if (!g_core_fp.fp_diag_check_sum(hx_touch_data)) + goto bypass_checksum_failed_packet; + +#ifdef HX_TP_PROC_2T2R + if (Is_2T2R && (hx_touch_data->diag_cmd >= 4 && + hx_touch_data->diag_cmd <= 6)) { + mutual_data = getMutualBuffer_2(); + self_data = getSelfBuffer(); + /* initiallize the block number of mutual and self */ + mul_num = ic_data->HX_RX_NUM_2 * ic_data->HX_TX_NUM_2; +#ifdef HX_EN_SEL_BUTTON + self_num = ic_data->HX_RX_NUM_2 + + ic_data->HX_TX_NUM_2 + ic_data->HX_BT_NUM; +#else + self_num = ic_data->HX_RX_NUM_2 + ic_data->HX_TX_NUM_2; +#endif + } else +#endif + { + mutual_data = getMutualBuffer(); + self_data = getSelfBuffer(); + /* initiallize the block number of mutual and self */ + mul_num = ic_data->HX_RX_NUM * ic_data->HX_TX_NUM; +#ifdef HX_EN_SEL_BUTTON + self_num = ic_data->HX_RX_NUM + + ic_data->HX_TX_NUM + ic_data->HX_BT_NUM; +#else + self_num = ic_data->HX_RX_NUM + ic_data->HX_TX_NUM; +#endif + } + g_core_fp.fp_diag_parse_raw_data(hx_touch_data, mul_num, + self_num, hx_touch_data->diag_cmd, mutual_data, + self_data); + } else if (hx_touch_data->diag_cmd == 8) { + memset(diag_coor, 0x00, sizeof(diag_coor)); + memcpy(&(diag_coor[0]), &hx_touch_data->hx_coord_buf[0], + hx_touch_data->touch_info_size); + } + + /* assign state info data */ + memcpy(&(hx_state_info[0]), &hx_touch_data->hx_state_info[0], 2); + return NO_ERR; +bypass_checksum_failed_packet: + return 1; +} + +/* #if defined(HX_DEBUG_LEVEL) */ +void himax_log_touch_data(int start) +{ + int loop_i = 0; + int print_size = 0; + uint8_t *buf; + + if (start == 1) + return; /* report data when end of ts_work*/ + + if (hx_touch_data->diag_cmd > 0) { + print_size = hx_touch_data->touch_all_size; + buf = kcalloc(print_size, sizeof(uint8_t), GFP_KERNEL); + memcpy(buf, hx_touch_data->hx_coord_buf, + hx_touch_data->touch_info_size); + memcpy(&buf[hx_touch_data->touch_info_size], + hx_touch_data->hx_rawdata_buf, + print_size - hx_touch_data->touch_info_size); + } +#if defined(HX_SMART_WAKEUP) + else if (private_ts->SMWP_enable > 0 && private_ts->suspended) { + print_size = hx_touch_data->event_size; + buf = kcalloc(print_size, sizeof(uint8_t), GFP_KERNEL); + memcpy(buf, hx_touch_data->hx_event_buf, print_size); + } +#endif + else if (hx_touch_data->diag_cmd == 0) { + print_size = hx_touch_data->touch_info_size; + buf = kcalloc(print_size, sizeof(uint8_t), GFP_KERNEL); + memcpy(buf, hx_touch_data->hx_coord_buf, print_size); + } else { + E("%s:cmd fault\n", __func__); + } + + for (loop_i = 0; loop_i < print_size; loop_i += 8) { + if ((loop_i + 7) >= print_size) { + I("P %2d = 0x%2.2X P %2d = 0x%2.2X ", + loop_i, buf[loop_i], loop_i + 1, buf[loop_i + 1]); + I("P %2d = 0x%2.2X P %2d = 0x%2.2X\n", + loop_i + 2, buf[loop_i + 2], loop_i + 3, buf[loop_i + 3]); + break; + } + + I("P %2d = 0x%2.2X P %2d = 0x%2.2X ", + loop_i, buf[loop_i], loop_i + 1, buf[loop_i + 1]); + I("P %2d = 0x%2.2X P %2d = 0x%2.2X ", + loop_i + 2, buf[loop_i + 2], loop_i + 3, buf[loop_i + 3]); + I("P %2d = 0x%2.2X P %2d = 0x%2.2X ", + loop_i + 4, buf[loop_i + 4], loop_i + 5, buf[loop_i + 5]); + I("P %2d = 0x%2.2X P %2d = 0x%2.2X ", + loop_i + 6, buf[loop_i + 6], loop_i + 7, buf[loop_i + 7]); + I("\n"); + } + kfree(buf); +} +void himax_log_touch_event(struct himax_ts_data *ts, int start) +{ + int loop_i = 0; + + if (start == 1) + return; /*report data when end of ts_work*/ + + if (g_target_report_data->finger_on > 0 && + g_target_report_data->finger_num > 0) { + for (loop_i = 0; loop_i < ts->nFinger_support; loop_i++) { + if (g_target_report_data->x[loop_i] >= 0 + && g_target_report_data->x[loop_i] + <= ts->pdata->abs_x_max + && g_target_report_data->y[loop_i] >= 0 + && g_target_report_data->y[loop_i] + <= ts->pdata->abs_y_max) { + I("Finger %d=> X:%d, Y:%d W:%d, Z:%d, F:%d,Int_Delay_Counter:%d\n", + loop_i + 1, + g_target_report_data->x[loop_i], + g_target_report_data->y[loop_i], + g_target_report_data->w[loop_i], + g_target_report_data->w[loop_i], + loop_i + 1, + g_target_report_data->ig_count); + + } + } + } else if (g_target_report_data->finger_on == 0 && + g_target_report_data->finger_num == 0) { + I("All Finger leave\n"); + } else { + I("%s : wrong input!\n", __func__); + } +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) +void himax_log_touch_int_devation(int touched) +{ + if (touched == HX_FINGER_ON) { + ktime_get_real_ts64(&timeStart); + /* I(" Irq start time = %ld.%06ld s\n", + * timeStart.tv_sec, timeStart.tv_nsec/1000); + */ + } else if (touched == HX_FINGER_LEAVE) { + ktime_get_real_ts64(&timeEnd); + timeDelta.tv_nsec = + (timeEnd.tv_sec * 1000000000 + timeEnd.tv_nsec) - + (timeStart.tv_sec * 1000000000 + timeStart.tv_nsec); + /* I("Irq finish time = %ld.%06ld s\n", + * timeEnd.tv_sec, timeEnd.tv_nsec/1000); + */ + I("Touch latency = %ld us\n", timeDelta.tv_nsec / 1000); + I("bus_speed = %d kHz\n", private_ts->bus_speed); + if (g_target_report_data->finger_on == 0 && g_target_report_data->finger_num == 0) + I("All Finger leave\n"); + } else { + I("%s : wrong input!\n", __func__); + } +} +#else +void himax_log_touch_int_devation(int touched) +{ + if (touched == HX_FINGER_ON) { + getnstimeofday(&timeStart); + /* I(" Irq start time = %ld.%06ld s\n", + * timeStart.tv_sec, timeStart.tv_nsec/1000); + */ + } else if (touched == HX_FINGER_LEAVE) { + getnstimeofday(&timeEnd); + timeDelta.tv_nsec = + (timeEnd.tv_sec * 1000000000 + timeEnd.tv_nsec) - + (timeStart.tv_sec * 1000000000 + timeStart.tv_nsec); + /* I("Irq finish time = %ld.%06ld s\n", + * timeEnd.tv_sec, timeEnd.tv_nsec/1000); + */ + I("Touch latency = %ld us\n", timeDelta.tv_nsec / 1000); + I("bus_speed = %d kHz\n", private_ts->bus_speed); + if (g_target_report_data->finger_on == 0 && g_target_report_data->finger_num == 0) + I("All Finger leave\n"); + } else { + I("%s : wrong input!\n", __func__); + } +} +#endif + +#define RAW_DOWN_STATUS "status: Raw:F:%02d Down, X:%d, Y:%d, W:%d\n" +#define RAW_UP_STATUS "status: Raw:F:%02d Up, X:%d, Y:%d\n" + +void himax_log_touch_event_detail(struct himax_ts_data *ts, int start) +{ + int loop_i = 0; + + if (start == HX_FINGER_LEAVE) { + for (loop_i = 0; loop_i < ts->nFinger_support; loop_i++) { + if (((ts->old_finger >> loop_i & 1) == 0) && + ((ts->pre_finger_mask >> loop_i & 1) == 1)) { + if (g_target_report_data->x[loop_i] >= 0 + && g_target_report_data->x[loop_i] + <= ts->pdata->abs_x_max + && g_target_report_data->y[loop_i] >= 0 + && g_target_report_data->y[loop_i] + <= ts->pdata->abs_y_max) { + I(RAW_DOWN_STATUS, + loop_i + 1, + g_target_report_data->x[loop_i], + g_target_report_data->y[loop_i], + g_target_report_data->w[loop_i]); + } + } else if ((((ts->old_finger >> loop_i & 1) == 1) && + ((ts->pre_finger_mask >> loop_i & 1) == 0))) { + I(RAW_UP_STATUS, + loop_i + 1, ts->pre_finger_data[loop_i][0], + ts->pre_finger_data[loop_i][1]); + } else { + /* I("dbg hx_point_num=%d, old_finger=0x%02X," + * " pre_finger_mask=0x%02X\n", + * ts->hx_point_num, ts->old_finger, + * ts->pre_finger_mask); + */ + } + } + } +} + +void himax_ts_dbg_func(struct himax_ts_data *ts, int start) +{ + if (ts->debug_log_level & BIT(0)) { + /* I("debug level 1\n"); */ + himax_log_touch_data(start); + } + if (ts->debug_log_level & BIT(1)) { + /* I("debug level 2\n"); */ + himax_log_touch_event(ts, start); + } + if (ts->debug_log_level & BIT(2)) { + /* I("debug level 4\n"); */ + himax_log_touch_int_devation(start); + } + if (ts->debug_log_level & BIT(3)) { + /* I("debug level 8\n"); */ + himax_log_touch_event_detail(ts, start); + } +} + +static int himax_change_mode(uint8_t str_pw, uint8_t end_pw) +{ + uint8_t data[4] = {0}; + int count = 0; + + /*sense off*/ + g_core_fp.fp_sense_off(true); + /*mode change*/ + data[1] = str_pw; data[0] = str_pw; + if (g_core_fp.fp_assign_sorting_mode != NULL) + g_core_fp.fp_assign_sorting_mode(data); + + /*sense on*/ + g_core_fp.fp_sense_on(1); + /*wait mode change*/ + do { + if (g_core_fp.fp_check_sorting_mode != NULL) + g_core_fp.fp_check_sorting_mode(data); + if ((data[0] == end_pw) && (data[1] == end_pw)) + return 0; + + I("Now retry %d times!\n", count++); + msleep(50); + } while (count < 50); + + return ERR_WORK_OUT; +} + +static ssize_t himax_diag_cmd_write(char *buf, size_t len) +{ + struct himax_ts_data *ts = private_ts; + char *dbg_map_str = "mode:"; + char *str_ptr = NULL; + int str_len = 0; + int rst = 0; + uint8_t str_pw = 0; + uint8_t end_pw = 0; + + switch (len) { + case 1:/*raw out select - diag,X*/ + if (!kstrtoint(buf, 16, &rst)) { + ts->diag_cmd = rst; + I("%s: dsram_flag = %d\n", __func__, dsram_flag); + if (dsram_flag) { + /*Cancal work queue and return to stack*/ + process_type = 0; + dsram_flag = false; + cancel_delayed_work(&ts->himax_diag_delay_wrok); + himax_int_enable(1); + g_core_fp.fp_return_event_stack(); + } + g_core_fp.fp_diag_register_set(ts->diag_cmd, 0); + I("%s: Set raw out select 0x%X.\n", __func__, ts->diag_cmd); + } + if (!ts->diag_cmd) { + if (mode_flag) /*back to normal mode*/ + himax_change_mode(0x00, 0x99); + } + break; + case 2:/*data processing + rawout select - diag,XY*/ + if (!kstrtoint(buf, 16, &rst)) { + process_type = (rst >> 4) & 0xF; + ts->diag_cmd = rst & 0xF; + } + if (process_type <= 0 || ts->diag_cmd <= 0) + break; + else if (process_type > 0 && process_type <= 3) { + if (!dsram_flag) { + /*Start wrok queue*/ + himax_int_enable(0); + g_core_fp.fp_diag_register_set(ts->diag_cmd, process_type); + queue_delayed_work(ts->himax_diag_wq, + &ts->himax_diag_delay_wrok, 2 * HZ / 100); + dsram_flag = true; + I("%s: Start get raw data in DSRAM\n", __func__); + } else { + g_core_fp.fp_diag_register_set(ts->diag_cmd, process_type); + } + } + break; + case 9:/*change mode - mode:XXYY(start PW,end PW)*/ + str_ptr = strnstr(buf, dbg_map_str, len); + if (str_ptr) { + str_len = strlen(dbg_map_str); + if (!kstrtoint(buf + str_len, 16, &rst)) { + str_pw = (rst >> 8) & 0xFF; + end_pw = rst & 0xFF; + if (!himax_change_mode(str_pw, end_pw)) { + mode_flag = 1; + I("%s: change mode 0x%4X. str_pw = %2X, end_pw = %2X\n", __func__, rst, str_pw, end_pw); + } else + I("%s: change mode failed. str_pw = %2X, end_pw = %2X\n", __func__, str_pw, end_pw); + } + } else { + I("%s: Can't find string [%s].\n", __func__, dbg_map_str); + } + break; + default: + I("%s: Length is not correct.\n", __func__); + } + return len; +} + +static ssize_t himax_diag_arrange_write(char *buf, size_t len) +{ + if (len >= 80) { + I("%s: no command exceeds 80 chars.\n", __func__); + return -EFAULT; + } + + g_diag_arr_num = buf[0] - '0'; + I("%s: g_diag_arr_num = %d\n", __func__, g_diag_arr_num); + return len; +} + +void himax_get_mutual_edge(void) +{ + int i = 0; + + for (i = 0; i < (ic_data->HX_RX_NUM * ic_data->HX_TX_NUM); i++) { + if (diag_mutual[i] > g_max_mutual) + g_max_mutual = diag_mutual[i]; + + if (diag_mutual[i] < g_min_mutual) + g_min_mutual = diag_mutual[i]; + } +} + +void himax_get_self_edge(void) +{ + int i = 0; + + for (i = 0; i < (ic_data->HX_RX_NUM + ic_data->HX_TX_NUM); i++) { + if (diag_self[i] > g_max_self) + g_max_self = diag_self[i]; + + if (diag_self[i] < g_min_self) + g_min_self = diag_self[i]; + } +} + +static void print_state_info(struct seq_file *s) +{ + /* seq_printf(s, "State_info_2bytes:%3d, %3d\n", + * _state_info[0],hx_state_info[1]); + */ + +#ifdef HX_NEW_EVENT_STACK_FORMAT + seq_printf(s, "ReCal = %d\t", hx_state_info[0] & 0x03); + seq_printf(s, "Base Line = %d\t", hx_state_info[0] >> 2 & 0x01); + seq_printf(s, "Palm = %d\t", hx_state_info[0] >> 3 & 0x01); + seq_printf(s, "Idle mode = %d\t", hx_state_info[0] >> 4 & 0x01); + seq_printf(s, "Water = %d\n", hx_state_info[0] >> 5 & 0x01); + seq_printf(s, "TX Hop = %d\t", hx_state_info[0] >> 6 & 0x01); + seq_printf(s, "AC mode = %d\t", hx_state_info[0] >> 7 & 0x01); + seq_printf(s, "High Sensitivity = %d\t", hx_state_info[1] & 0x01); + seq_printf(s, "Noise mode = %d\n", hx_state_info[1] >> 3 & 0x01); + seq_printf(s, "Lamp Noise mode = %d\n", hx_state_info[1] >> 4 & 0x01); +#else + seq_printf(s, "ReCal = %d\t", hx_state_info[0] & 0x01); + seq_printf(s, "Palm = %d\t", hx_state_info[0] >> 1 & 0x01); + seq_printf(s, "AC mode = %d\t", hx_state_info[0] >> 2 & 0x01); + seq_printf(s, "Water = %d\n", hx_state_info[0] >> 3 & 0x01); + seq_printf(s, "Glove = %d\t", hx_state_info[0] >> 4 & 0x01); + seq_printf(s, "TX Hop = %d\t", hx_state_info[0] >> 5 & 0x01); + seq_printf(s, "Base Line = %d\t", hx_state_info[0] >> 6 & 0x01); + seq_printf(s, "OSR Hop = %d\t", hx_state_info[1] >> 3 & 0x01); + seq_printf(s, "KEY = %d\n", hx_state_info[1] >> 4 & 0x0F); +#endif +} + +static void himax_diag_arrange_print(struct seq_file *s, int i, int j, + int transpose) +{ + if (transpose) + seq_printf(s, "%6d", diag_mutual[j + i * ic_data->HX_RX_NUM]); + else + seq_printf(s, "%6d", diag_mutual[i + j * ic_data->HX_RX_NUM]); +} + +/* ready to print second step which is column*/ +static void himax_diag_arrange_inloop(struct seq_file *s, int in_init, + int out_init, bool transpose, int j) +{ + int x_channel = ic_data->HX_RX_NUM; + int y_channel = ic_data->HX_TX_NUM; + int i; + int in_max = 0; + + if (transpose) + in_max = y_channel; + else + in_max = x_channel; + + if (in_init > 0) { /* bit0 = 1 */ + for (i = in_init - 1; i >= 0; i--) + himax_diag_arrange_print(s, i, j, transpose); + + if (transpose) { + if (out_init > 0) + seq_printf(s, " %5d\n", diag_self[j]); + else + seq_printf(s, " %5d\n", + diag_self[x_channel - j - 1]); + } + } else { /* bit0 = 0 */ + for (i = 0; i < in_max; i++) + himax_diag_arrange_print(s, i, j, transpose); + + if (transpose) { + if (out_init > 0) + seq_printf(s, " %5d\n", + diag_self[x_channel - j - 1]); + else + seq_printf(s, " %5d\n", diag_self[j]); + } + } +} + +/* print first step which is row */ +static void himax_diag_arrange_outloop(struct seq_file *s, int transpose, + int out_init, int in_init) +{ + int j; + int x_channel = ic_data->HX_RX_NUM; + int y_channel = ic_data->HX_TX_NUM; + int out_max = 0; + int self_cnt = 0; + + if (transpose) + out_max = x_channel; + else + out_max = y_channel; + + if (out_init > 0) { /* bit1 = 1 */ + self_cnt = 1; + + for (j = out_init - 1; j >= 0; j--) { + seq_printf(s, "%3c%02d%c", '[', j + 1, ']'); + himax_diag_arrange_inloop(s, in_init, out_init, + transpose, j); + + if (!transpose) { + seq_printf(s, " %5d\n", + diag_self[y_channel + x_channel - self_cnt]); + self_cnt++; + } + } + } else { /* bit1 = 0 */ + /* self_cnt = x_channel; */ + for (j = 0; j < out_max; j++) { + seq_printf(s, "%3c%02d%c", '[', j + 1, ']'); + himax_diag_arrange_inloop(s, in_init, out_init, + transpose, j); + + if (!transpose) { + seq_printf(s, " %5d\n", + diag_self[j + x_channel]); + } + } + } +} + +/* determin the output format of diag */ +static void himax_diag_arrange(struct seq_file *s) +{ + int x_channel = ic_data->HX_RX_NUM; + int y_channel = ic_data->HX_TX_NUM; + int bit2, bit1, bit0; + int i; + /* rotate bit */ + bit2 = g_diag_arr_num >> 2; + /* reverse Y */ + bit1 = g_diag_arr_num >> 1 & 0x1; + /* reverse X */ + bit0 = g_diag_arr_num & 0x1; + + if (g_diag_arr_num < 4) { + for (i = 0 ; i <= x_channel; i++) + seq_printf(s, "%3c%02d%c", '[', i, ']'); + + seq_puts(s, "\n"); + himax_diag_arrange_outloop(s, bit2, bit1 * y_channel, + bit0 * x_channel); + seq_printf(s, "%6c", ' '); + + if (bit0 == 1) { + for (i = x_channel - 1; i >= 0; i--) + seq_printf(s, "%6d", diag_self[i]); + } else { + for (i = 0; i < x_channel; i++) + seq_printf(s, "%6d", diag_self[i]); + } + } else { + for (i = 0 ; i <= y_channel; i++) + seq_printf(s, "%3c%02d%c", '[', i, ']'); + + seq_puts(s, "\n"); + himax_diag_arrange_outloop(s, bit2, bit1 * x_channel, + bit0 * y_channel); + seq_printf(s, "%6c", ' '); + + if (bit1 == 1) { + for (i = x_channel + y_channel - 1; i >= x_channel; + i--) + seq_printf(s, "%6d", diag_self[i]); + } else { + for (i = x_channel; i < x_channel + y_channel; i++) + seq_printf(s, "%6d", diag_self[i]); + } + } +} + +static void *himax_diag_seq_start(struct seq_file *s, loff_t *pos) +{ + if (*pos >= 1) + return NULL; + + return (void *)((unsigned long) *pos + 1); +} + +static void *himax_diag_seq_next(struct seq_file *s, void *v, loff_t *pos) +{ + return NULL; +} + +static void himax_diag_seq_stop(struct seq_file *s, void *v) +{ + kfree(v); +} + +/* DSRAM thread */ +bool himax_ts_diag_func(void) +{ + int retry = 3; + int i = 0, j = 0; + unsigned int index = 0; + int x_channel = ic_data->HX_RX_NUM; + int y_channel = ic_data->HX_TX_NUM; + int total_size = (y_channel * x_channel + y_channel + x_channel) * 2; + uint8_t *info_data; + int32_t *mutual_data = NULL; + int32_t *mutual_data_new = NULL; + int32_t *mutual_data_old = NULL; + int32_t *self_data = NULL; + int32_t *self_data_new = NULL; + int32_t *self_data_old = NULL; + int32_t new_data; + /* 1:common dsram,2:100 frame Max,3:N-(N-1)frame */ + int dsram_type = process_type; + + info_data = kcalloc(total_size, sizeof(uint8_t), GFP_KERNEL); + if (info_data == NULL) + return false; + + memset(info_data, 0, total_size * sizeof(uint8_t)); + + I("%s: process type=%d!\n", __func__, process_type); + + g_core_fp.fp_burst_enable(1); + + if (dsram_type <= 2) { + mutual_data = getMutualBuffer(); + self_data = getSelfBuffer(); + } else if (dsram_type == 3) { + mutual_data = getMutualBuffer(); + mutual_data_new = getMutualNewBuffer(); + mutual_data_old = getMutualOldBuffer(); + self_data = getSelfBuffer(); + self_data_new = getSelfNewBuffer(); + self_data_old = getSelfOldBuffer(); + } + + do { + if (retry <= 0) { + E("%s Get DSRAM data failed\n", __func__); + kfree(info_data); + return false; + } + if (g_core_fp.fp_get_DSRAM_data(info_data, dsram_flag)) + break; + } while (retry-- > 0); + + index = 0; + + for (i = 0; i < y_channel; i++) { /*mutual data*/ + for (j = 0; j < x_channel; j++) { + new_data = (((int8_t)info_data[index + 1] << 8) | + info_data[index]); + + if (dsram_type <= 1) { + mutual_data[i * x_channel + j] = new_data; + } else if (dsram_type == 2) { /* Keep max data */ + if (mutual_data[i * x_channel + j] < new_data) + mutual_data[i * x_channel + j] = new_data; + } else if (dsram_type == 3) { + /* Cal data for [N]-[N-1] frame */ + mutual_data_new[i * x_channel + j] = new_data; + mutual_data[i * x_channel + j] = + mutual_data_new[i * x_channel + j] - + mutual_data_old[i * x_channel + j]; + } + index += 2; + } + } + + for (i = 0; i < x_channel + y_channel; i++) { /*self data*/ + new_data = (info_data[index + 1] << 8 | info_data[index]); + if (dsram_type <= 1) { + self_data[i] = new_data; + } else if (dsram_type == 2) { /* Keep max data */ + if (self_data[i] < new_data) + self_data[i] = new_data; + } else if (dsram_type == 3) { /* Cal data for [N]-[N-1] frame */ + self_data_new[i] = new_data; + self_data[i] = self_data_new[i] - self_data_old[i]; + } + index += 2; + } + + kfree(info_data); + + if (dsram_type == 3) { + memcpy(mutual_data_old, mutual_data_new, + x_channel * y_channel * sizeof(int32_t)); + /* copy N data to N-1 array */ + memcpy(self_data_old, self_data_new, + (x_channel + y_channel) * sizeof(int32_t)); + /* copy N data to N-1 array */ + } + + diag_max_cnt++; + + if (dsram_type >= 1 && dsram_type <= 3) { + queue_delayed_work(private_ts->himax_diag_wq, + &private_ts->himax_diag_delay_wrok, 1 / 10 * HZ); + } + return true; +} + +static int himax_diag_print(struct seq_file *s, void *v) +{ + int x_num = ic_data->HX_RX_NUM; + int y_num = ic_data->HX_TX_NUM; + size_t ret = 0; + uint16_t mutual_num, self_num, width; + + mutual_num = x_num * y_num; + self_num = x_num + y_num; + /* don't add KEY_COUNT */ + width = x_num; + seq_printf(s, "ChannelStart: %4d, %4d\n\n", x_num, y_num); + + /* start to show out the raw data in adb shell */ + himax_diag_arrange(s); + seq_puts(s, "\n"); +#ifdef HX_EN_SEL_BUTTON + seq_puts(s, "\n"); + for (loop_i = 0; loop_i < ic_data->HX_BT_NUM; loop_i++) + seq_printf(s, "%6d", diag_self[ic_data->HX_RX_NUM + + ic_data->HX_TX_NUM + loop_i]); +#endif + seq_puts(s, "ChannelEnd"); + seq_puts(s, "\n"); + + /* print Mutual/Slef Maximum and Minimum */ + himax_get_mutual_edge(); + himax_get_self_edge(); + seq_printf(s, "Mutual Max:%3d, Min:%3d\n", g_max_mutual, + g_min_mutual); + seq_printf(s, "Self Max:%3d, Min:%3d\n", g_max_self, + g_min_self); + /* recovery status after print*/ + g_max_mutual = 0; + g_min_mutual = 0xFFFF; + g_max_self = 0; + g_min_self = 0xFFFF; + + /*pring state info*/ + print_state_info(s); + + if (s->count >= s->size) + overflow++; + + return ret; +} + +static int himax_diag_stack_read(struct seq_file *s, void *v) +{ + struct himax_ts_data *ts = private_ts; + + if (ts->diag_cmd) + himax_diag_print(s, v); + else + seq_puts(s, "Please set raw out select 'echo diag,X > debug'\n\n"); + + return 0; +} + +static const struct seq_operations himax_diag_stack_ops = { + .start = himax_diag_seq_start, + .next = himax_diag_seq_next, + .stop = himax_diag_seq_stop, + .show = himax_diag_stack_read, +}; + +static int himax_diag_stack_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &himax_diag_stack_ops); +}; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) +static const struct proc_ops himax_proc_stack_ops = { + .proc_open = himax_diag_stack_open, + .proc_read = seq_read, + .proc_release = seq_release, +}; +#else +static const struct file_operations himax_proc_stack_ops = { + .owner = THIS_MODULE, + .open = himax_diag_stack_open, + .read = seq_read, + .release = seq_release, +}; +#endif + +static int himax_sram_read(struct seq_file *s, void *v, uint8_t rs) +{ + struct himax_ts_data *ts = private_ts; + int d_type = 0; + + d_type = (!ts->diag_cmd)?rs:ts->diag_cmd; + + if (!overflow) { + if (!process_type) { + himax_int_enable(0); + g_core_fp.fp_diag_register_set(d_type, 0); + + if (!himax_ts_diag_func()) + seq_puts(s, "Get sram data failed."); + else + himax_diag_print(s, v); + + ts->diag_cmd = 0; + g_core_fp.fp_diag_register_set(0, 0); + himax_int_enable(1); + } + } + + if ((process_type <= 3 && ts->diag_cmd && dsram_flag) || overflow) { + himax_diag_print(s, v); + overflow = 0; + } + + return 0; +} + +static int himax_diag_iir_read(struct seq_file *s, void *v) +{ + return himax_sram_read(s, v, 0x09); +} + +static const struct seq_operations himax_diag_iir_ops = { + .start = himax_diag_seq_start, + .next = himax_diag_seq_next, + .stop = himax_diag_seq_stop, + .show = himax_diag_iir_read, +}; + +static int himax_diag_iir_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &himax_diag_iir_ops); +}; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) +static const struct proc_ops himax_proc_iir_ops = { + .proc_open = himax_diag_iir_open, + .proc_read = seq_read, + .proc_release = seq_release, +}; +#else +static const struct file_operations himax_proc_iir_ops = { + .owner = THIS_MODULE, + .open = himax_diag_iir_open, + .read = seq_read, + .release = seq_release, +}; +#endif +static int himax_diag_dc_read(struct seq_file *s, void *v) +{ + return himax_sram_read(s, v, 0x0A); +} + +static const struct seq_operations himax_diag_dc_ops = { + .start = himax_diag_seq_start, + .next = himax_diag_seq_next, + .stop = himax_diag_seq_stop, + .show = himax_diag_dc_read, +}; +static int himax_diag_dc_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &himax_diag_dc_ops); +}; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) +static const struct proc_ops himax_proc_dc_ops = { + .proc_open = himax_diag_dc_open, + .proc_read = seq_read, + .proc_release = seq_release, +}; +#else +static const struct file_operations himax_proc_dc_ops = { + .owner = THIS_MODULE, + .open = himax_diag_dc_open, + .read = seq_read, + .release = seq_release, +}; +#endif + +static int himax_diag_bank_read(struct seq_file *s, void *v) +{ + return himax_sram_read(s, v, 0x0B); +} + +static const struct seq_operations himax_diag_bank_ops = { + .start = himax_diag_seq_start, + .next = himax_diag_seq_next, + .stop = himax_diag_seq_stop, + .show = himax_diag_bank_read, +}; +static int himax_diag_bank_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &himax_diag_bank_ops); +}; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) +static const struct proc_ops himax_proc_bank_ops = { + .proc_open = himax_diag_bank_open, + .proc_read = seq_read, + .proc_release = seq_release, +}; +#else +static const struct file_operations himax_proc_bank_ops = { + .owner = THIS_MODULE, + .open = himax_diag_bank_open, + .read = seq_read, + .release = seq_release, +}; +#endif + +static ssize_t himax_reset_write(char *buf, size_t len) +{ + if (len >= 12) { + I("%s: no command exceeds 12 chars.\n", __func__); + return -EFAULT; + } + +#ifdef HX_RST_PIN_FUNC + if (buf[0] == '1') + g_core_fp.fp_ic_reset(false, false); + else if (buf[0] == '2') + g_core_fp.fp_ic_reset(false, true); + else if (buf[0] == '3') + g_core_fp.fp_ic_reset(true, false); + else if (buf[0] == '4') + g_core_fp.fp_ic_reset(true, true); + /* else if (buf[0] == '5') */ + /* ESD_HW_REST(); */ +#endif +#ifdef HX_ZERO_FLASH + if (g_core_fp.fp_0f_reload_to_active) + g_core_fp.fp_0f_reload_to_active(); +#endif + return len; +} + +static ssize_t himax_proc_FW_debug_read(char *buf, size_t len) +{ + ssize_t ret = 0; + uint8_t loop_i = 0; + uint8_t tmp_data[64] = {0}; + + cmd_set[0] = 0x01; + + if (g_core_fp.fp_read_FW_status(cmd_set, tmp_data) == NO_ERR) { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "0x%02X%02X%02X%02X :\t", + cmd_set[5], cmd_set[4], cmd_set[3], cmd_set[2]); + + for (loop_i = 0; loop_i < cmd_set[1]; loop_i++) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "%5d\t", tmp_data[loop_i]); + + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "\n"); + } + + cmd_set[0] = 0x02; + + if (g_core_fp.fp_read_FW_status(cmd_set, tmp_data) == NO_ERR) { + for (loop_i = 0; loop_i < cmd_set[1]; + loop_i = loop_i + 2) { + if ((loop_i % 16) == 0) + ret += snprintf(buf_tmp + ret, + sizeof(buf_tmp) - ret, "0x%02X%02X%02X%02X :\t", + cmd_set[5], cmd_set[4], + cmd_set[3] + + (((cmd_set[2] + loop_i) >> 8) & 0xFF), + (cmd_set[2] + loop_i) & 0xFF); + + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "%5d\t", tmp_data[loop_i] + + (tmp_data[loop_i + 1] << 8)); + + if ((loop_i % 16) == 14) + ret += snprintf(buf_tmp + ret, + sizeof(buf_tmp) - ret, "\n"); + } + } + + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "\n"); + + return ret; +} + +static ssize_t himax_proc_DD_debug_read(char *buf, size_t len) +{ + ssize_t ret = 0; + uint8_t tmp_data[64] = {0}; + uint8_t loop_i = 0; + + if (mutual_set_flag == 1) { + if (g_core_fp.fp_read_DD_status(cmd_set, tmp_data) == + NO_ERR) { + for (loop_i = 0; loop_i < cmd_set[0]; + loop_i++) { + if ((loop_i % 8) == 0) + ret += snprintf(buf_tmp + ret, + sizeof(buf_tmp) - ret, "0x%02X : ", loop_i); + + ret += snprintf(buf_tmp + ret, + sizeof(buf_tmp) - ret, "0x%02X ", tmp_data[loop_i]); + + if ((loop_i % 8) == 7) + ret += snprintf(buf_tmp + ret, + sizeof(buf_tmp) - ret, "\n"); + } + } else { + ret += snprintf(buf_tmp + ret, + sizeof(buf_tmp) - ret, "Get DD status falied!\n"); + } + } + + ret += snprintf(buf_tmp + ret, len - ret, "\n"); + + return ret; +} + +#define STR_TO_UL_ERR "String to ul is fail in cnt = %d, buf_tmp2 = %s\n" + +static ssize_t himax_proc_DD_debug_write(char *buf, size_t len) +{ + uint8_t i = 0; + uint8_t cnt = 2; + unsigned long result = 0; + char buf_tmp2[4]; + + if (len >= 20) { + I("%s: no command exceeds 20 chars.\n", __func__); + return -EFAULT; + } + + memset(buf_tmp2, 0x0, sizeof(buf_tmp2)); + + if (buf[2] == 'x' && buf[6] == 'x' && buf[10] == 'x') { + mutual_set_flag = 1; + + for (i = 3; i < 12; i = i + 4) { + memcpy(buf_tmp2, buf + i, 2); + + if (!kstrtoul(buf_tmp2, 16, &result)) + cmd_set[cnt] = (uint8_t)result; + else + I(STR_TO_UL_ERR, cnt, buf_tmp2); + + cnt--; + } + + I("cmd_set[2] = %02X, cmd_set[1] = %02X, cmd_set[0] = %02X\n", + cmd_set[2], cmd_set[1], cmd_set[0]); + } else { + mutual_set_flag = 0; + } + + return len; +} + +void setFlashBuffer(void) +{ + flash_buffer = kcalloc(ic_data->flash_size, sizeof(uint8_t), GFP_KERNEL); +} + +void flash_dump_prog_set(uint8_t prog) +{ + g_flash_progress = prog; + if (prog == ONGOING) + debug_data->flash_dump_going = ONGOING; + else + debug_data->flash_dump_going = START; +} + +static int himax_proc_flash_read(struct seq_file *s, void *v) +{ + ssize_t ret = 0; + int i; + uint8_t flash_progress = g_flash_progress; + uint8_t flash_cmd = g_flash_cmd; + bool flash_rst = g_flash_dump_rst; + + I("flash_progress = %d\n", flash_progress); + + if (!flash_rst) { + seq_puts(s, "FlashStart:Fail\n"); + seq_puts(s, "FlashEnd\n"); + return ret; + } + + if (flash_progress == START) + seq_puts(s, "Flash dump - Start\n"); + else if (flash_progress == ONGOING) + seq_puts(s, "Flash dump - On-going\n"); + else if (flash_progress == FINISHED) + seq_puts(s, "Flash dump - Finished\n"); + + /*print flash dump data*/ + if (flash_cmd == 1 && flash_progress == FINISHED) { + seq_puts(s, "Start to print flash dump data\n"); + for (i = 0; i < ic_data->flash_size; i++) { + seq_printf(s, "0x%02X,", flash_buffer[i]); + if (i % 16 == 15) + seq_puts(s, "\n"); + } + } + + seq_puts(s, "FlashEnd\n"); + + return ret; +} + +static ssize_t himax_proc_flash_write(struct file *filp, + const char __user *buff, size_t len, loff_t *data) +{ + char buf[80] = {0}; + + if (len >= 80) { + I("%s: no command exceeds 80 chars.\n", __func__); + return -EFAULT; + } + + if (copy_from_user(buf, buff, len)) + return -EFAULT; + + I("%s: buf = %s\n", __func__, buf); + + if (g_flash_progress == ONGOING) { + E("%s: process is busy , return!\n", __func__); + return len; + } + + /*1 : print flash to window, 2 : dump to sdcard*/ + if (buf[0] == '1') { + /* 1_32,1_60,1_64,1_24,1_28 for flash size: + * 32k,60k,64k,124k,128k + */ + g_flash_cmd = 1; + flash_dump_prog_set(START); + g_flash_dump_rst = true; + queue_work(private_ts->flash_wq, &private_ts->flash_work); + } else if (buf[0] == '2') { + /* 2_32,2_60,2_64,2_24,2_28 for flash size: + * 32k,60k,64k,124k,128k + */ + g_flash_cmd = 2; + flash_dump_prog_set(START); + g_flash_dump_rst = true; + queue_work(private_ts->flash_wq, &private_ts->flash_work); + } + + return len; +} + +static void *himax_flash_dump_seq_start(struct seq_file *s, loff_t *pos) +{ + if (*pos >= 1) + return NULL; + + return (void *)((unsigned long) *pos + 1); +} + +static void *himax_flash_dump_seq_next(struct seq_file *s, void *v, loff_t *pos) +{ + return NULL; +} + +static void himax_flash_dump_seq_stop(struct seq_file *s, void *v) +{ +} + +static const struct seq_operations himax_flash_dump_seq_ops = { + .start = himax_flash_dump_seq_start, + .next = himax_flash_dump_seq_next, + .stop = himax_flash_dump_seq_stop, + .show = himax_proc_flash_read, +}; +static int himax_flash_dump_proc_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &himax_flash_dump_seq_ops); +}; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) +static const struct proc_ops himax_proc_flash_ops = { + .proc_open = himax_flash_dump_proc_open, + .proc_read = seq_read, + .proc_write = himax_proc_flash_write, +}; +#else +static const struct file_operations himax_proc_flash_ops = { + .owner = THIS_MODULE, + .open = himax_flash_dump_proc_open, + .read = seq_read, + .write = himax_proc_flash_write, +}; +#endif + +void himax_ts_flash_func(void) +{ + uint8_t flash_command = g_flash_cmd; + + himax_int_enable(0); + flash_dump_prog_set(ONGOING); + + /*msleep(100);*/ + I("%s: flash_command = %d enter.\n", __func__, flash_command); + + if (flash_command == 1 || flash_command == 2) { + g_core_fp.fp_flash_dump_func(flash_command, ic_data->flash_size, + flash_buffer); + g_flash_dump_rst = true; + } + + I("Complete~~~~~~~~~~~~~~~~~~~~~~~\n"); + +/* if (flash_command == 2) { + * struct file *fn; + * struct filename *vts_name; + * + * vts_name = kp_getname_kernel(FLASH_DUMP_FILE); + * fn = kp_file_open_name(vts_name, O_CREAT | O_WRONLY, 0); + * + * if (!IS_ERR(fn)) { + * I("%s create file and ready to write\n", __func__); + * fn->f_op->write(fn, flash_buffer, + * Flash_Size * sizeof(uint8_t), &fn->f_pos); + * filp_close(fn, NULL); + * } else { + * E("%s Open file failed!\n", __func__); + * g_flash_dump_rst = false; + * } + * } + */ + himax_int_enable(1); + flash_dump_prog_set(FINISHED); +} + +static ssize_t himax_sense_on_off_write(char *buf, size_t len) +{ + if (len >= 80) { + I("%s: no command exceeds 80 chars.\n", __func__); + return -EFAULT; + } + + if (buf[0] == '0') { + g_core_fp.fp_sense_off(true); + I("Sense off\n"); + } else if (buf[0] == '1') { + if (buf[1] == 's') { + g_core_fp.fp_sense_on(0x00); + I("Sense on re-map on, run sram\n"); + } else { + g_core_fp.fp_sense_on(0x01); + I("Sense on re-map off, run flash\n"); + } + } else { + I("Do nothing\n"); + } + + return len; +} + +#ifdef HX_ESD_RECOVERY +static ssize_t himax_esd_cnt_read(char *buf, size_t len) +{ + size_t ret = 0; + + I("%s: enter, %d\n", __func__, __LINE__); + + ret += snprintf(buf_tmp + ret, len - ret, + "EB_cnt = %d, EC_cnt = %d, ED_cnt = %d\n", + hx_EB_event_flag, hx_EC_event_flag, hx_ED_event_flag); + + return ret; +} + +static ssize_t himax_esd_cnt_write(char *buf, size_t len) +{ + int i = 0; + + if (len >= 12) { + I("%s: no command exceeds 80 chars.\n", __func__); + return -EFAULT; + } + + I("Clear ESD Flag\n"); + + if (buf[i] == '0') { + hx_EB_event_flag = 0; + hx_EC_event_flag = 0; + hx_ED_event_flag = 0; + } + + return len; +} + +#endif + +static int printMat(char *temp_buf, size_t len, int max_size, + uint8_t *guest_str, int loc) +{ + int ret = loc; + int i; + + for (i = 0; i < max_size; i++) { + if ((i % 16) == 0 && i > 0) + ret += snprintf(temp_buf + ret, len - ret, "\n"); + + ret += snprintf(temp_buf + ret, len - ret, "0x%02X\t", + guest_str[i]); + } + return ret; +} + +static int printUnit(char *temp_buf, size_t len, int max_size, char *info_item, + uint8_t *guest_str, int loc) +{ + int ret = loc; + + ret += snprintf(temp_buf + ret, len - ret, "%s:\n", info_item); + ret = printMat(temp_buf, len, max_size, guest_str, ret); + ret += snprintf(temp_buf + ret, len - ret, "\n"); + return ret; +} + +#ifdef HX_TP_PROC_GUEST_INFO +static ssize_t himax_proc_guest_info_read(char *buf, size_t len) +{ + int ret = 0; + int j = 0; + int max_size = 128; + struct hx_guest_info *info = g_guest_info_data; + + I("guest info progress\n"); + + if (g_core_fp.guest_info_get_status()) { + ret += snprintf(buf_tmp + ret, len - ret, + "Not Ready\n"); + goto END_FUNCTION; + } else { + if (info->g_guest_info_type == 1) { + for (j = 0; j < 3; j++) { + ret = printUnit(buf_tmp, len, max_size, + g_guest_info_item[j], + info->g_guest_str[j], ret); + I("str[%d] %s\n", j, + info->g_guest_str[j]); + } + ret = printUnit(buf_tmp, len, max_size, + g_guest_info_item[8], info->g_guest_str[8], + ret); + + I("str[8] %s\n", + info->g_guest_str[8]); + + ret = printUnit(buf_tmp, len, max_size, + g_guest_info_item[9], info->g_guest_str[9], + ret); + + I("str[9] %s\n", + info->g_guest_str[9]); + } else if (info->g_guest_info_type == 0) { + for (j = 0; j < 10; j++) { + if (j == 3) + j = 8; + ret += snprintf(buf_tmp + ret, + len - ret, "%s:\n", + g_guest_info_item[j]); + if (info->g_guest_data_type[j] == 0) { + ret += snprintf(buf_tmp + ret, + len - ret, "%s", + g_guest_info_data->g_guest_str_in_format[j]); + } else { + ret = printMat(buf_tmp, len, + info->g_guest_data_len[j], + g_guest_info_data->g_guest_str_in_format[j], ret); + } + ret += snprintf(buf_tmp + ret, + len - ret, "\n"); + } + } + } + +END_FUNCTION: + return ret; +} + +static ssize_t himax_proc_guest_info_write(char *buf, size_t len) +{ + if (len >= 80) { + I("%s: no command exceeds 80 chars.\n", __func__); + return -EFAULT; + } + + I("%s: buf = %s\n", __func__, buf); + if (buf[0] == 'r') { + I("%s,Test to get", __func__); + queue_work(private_ts->guest_info_wq, + &private_ts->guest_info_work); + } + return len; +} + +#endif + +static ssize_t himax_debug_read(struct file *file, char *buf, + size_t len, loff_t *pos) +{ + ssize_t ret = 0; + int i = 0; + + if (!HX_PROC_SEND_FLAG) { + I("%s, Enter\n", __func__); + + memset(buf_tmp, 0, sizeof(buf_tmp)); + if (dbg_cmd_flag) { + if (dbg_func_ptr_r[dbg_cmd_flag]) + ret += dbg_func_ptr_r[dbg_cmd_flag](buf, len); + else + goto END_FUNC_R; + } + + if (debug_level_cmd == 't') { + if (fw_update_complete) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "FW Update Complete "); + else + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "FW Update Fail "); + + } else if (debug_level_cmd == 'h') { + if (handshaking_result == 0) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Handshaking Result = %d (MCU Running)\n", + handshaking_result); + else if (handshaking_result == 1) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Handshaking Result = %d (MCU Stop)\n", + handshaking_result); + else if (handshaking_result == 2) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Handshaking Result = %d (I2C Error)\n", + handshaking_result); + else + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Handshaking Result = error\n"); + + } else if (debug_level_cmd == 'v') { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "FW_VER = 0x%2.2X\n", ic_data->vendor_fw_ver); + + if (private_ts->chip_cell_type == CHIP_IS_ON_CELL) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "CONFIG_VER = 0x%2.2X\n", + ic_data->vendor_config_ver); + else { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "TOUCH_VER = 0x%2.2X\n", + ic_data->vendor_touch_cfg_ver); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "DISPLAY_VER = 0x%2.2X\n", + ic_data->vendor_display_cfg_ver); + } + if (ic_data->vendor_cid_maj_ver < 0 && + ic_data->vendor_cid_min_ver < 0) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "CID_VER = NULL\n"); + else + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "CID_VER = 0x%2.2X\n", + (ic_data->vendor_cid_maj_ver << 8 | + ic_data->vendor_cid_min_ver)); + + if (ic_data->vendor_panel_ver < 0) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "PANEL_VER = NULL\n"); + else + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "PANEL_VER = 0x%2.2X\n", + ic_data->vendor_panel_ver); + if (private_ts->chip_cell_type == CHIP_IS_IN_CELL) { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Cusomer = %s\n", ic_data->vendor_cus_info); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Project = %s\n", ic_data->vendor_proj_info); + } +#if defined(HX_AUTO_UPDATE_FW) || defined(HX_ZERO_FLASH) +#ifdef HX_EN_DYNAMIC_NAME + if (ic_data->vendor_semifac == 1) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "SEMI_FAC = UMC\n"); + else if (ic_data->vendor_semifac == 2) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "SEMI_FAC = PSC\n"); + else + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "SEMI_FAC = NULL\n"); +#endif +#endif + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, "\n"); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Himax Touch Driver Version:\n"); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "%s\n", HIMAX_DRIVER_VER); + } else if (debug_level_cmd == 'd') { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Himax Touch IC Information :\n"); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "%s\n", private_ts->chip_name); + + switch (IC_CHECKSUM) { + case HX_TP_BIN_CHECKSUM_SW: + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "IC Checksum : SW\n"); + break; + + case HX_TP_BIN_CHECKSUM_HW: + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "IC Checksum : HW\n"); + break; + + case HX_TP_BIN_CHECKSUM_CRC: + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "IC Checksum : CRC\n"); + break; + + default: + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "IC Checksum error.\n"); + } + + if (ic_data->HX_INT_IS_EDGE) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Driver register Interrupt : EDGE TIRGGER\n"); + else + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Driver register Interrupt : LEVEL TRIGGER\n"); + + if (private_ts->protocol_type == PROTOCOL_TYPE_A) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Protocol : TYPE_A\n"); + else + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Protocol : TYPE_B\n"); + + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "RX Num : %d\n", ic_data->HX_RX_NUM); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "TX Num : %d\n", ic_data->HX_TX_NUM); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "BT Num : %d\n", ic_data->HX_BT_NUM); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "X Resolution : %d\n", ic_data->HX_X_RES); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Y Resolution : %d\n", ic_data->HX_Y_RES); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Max Point : %d\n", ic_data->HX_MAX_PT); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "XY reverse : %d\n", ic_data->HX_XY_REVERSE); +#ifdef HX_TP_PROC_2T2R + if (Is_2T2R) { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "2T2R panel\n"); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "RX Num_2 : %d\n", HX_RX_NUM_2); + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "TX Num_2 : %d\n", HX_TX_NUM_2); + } +#endif + } else if (debug_level_cmd == 'i') { + if (g_core_fp.fp_read_i2c_status()) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "I2C communication is bad.\n"); + else + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "I2C communication is good.\n"); + } else if (debug_level_cmd == 'n') { + /* Edgd = 1, Level = 0 */ + if (g_core_fp.fp_read_ic_trigger_type() == 1) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "IC Interrupt type is edge trigger.\n"); + else if (g_core_fp.fp_read_ic_trigger_type() == 0) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "IC Interrupt type is level trigger.\n"); + else + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Unkown IC trigger type.\n"); + + if (ic_data->HX_INT_IS_EDGE) + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Driver register Interrupt : EDGE TIRGGER\n"); + else + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "Driver register Interrupt : LEVEL TRIGGER\n"); + } else if (debug_level_cmd == 'l') { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "LotID : "); + for (i = 0; i < 13; i++) { + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "%02X", ic_data->vendor_ic_id[i]); + } + ret += snprintf(buf_tmp + ret, sizeof(buf_tmp) - ret, + "\n"); + } + +END_FUNC_R: + if (copy_to_user(buf, buf_tmp, (len > BUF_SIZE)?BUF_SIZE:len)) + I("%s,here:%d\n", __func__, __LINE__); + + HX_PROC_SEND_FLAG = 1; + } else { + HX_PROC_SEND_FLAG = 0; + } + + return ret; +} + +static ssize_t himax_debug_write(struct file *file, const char *buff, + size_t len, loff_t *pos) +{ + char fileName[128]; + char buf[80] = {0}; + int result = 0; +#ifndef HX_ZERO_FLASH + int fw_type = 0; + const struct firmware *fw = NULL; +#endif + + char *str_ptr = NULL; + int str_len = 0; + int i = 0; + + + if (len >= 80) { + I("%s: no command exceeds 80 chars.\n", __func__); + return -EFAULT; + } + + if (copy_from_user(buf, buff, len)) + return -EFAULT; + + str_len = len; + buf[str_len - 1] = 0; /*remove \n*/ + + while (dbg_cmd_str[i]) { + str_ptr = strnstr(buf, dbg_cmd_str[i], len); + if (str_ptr) { + str_len = strlen(dbg_cmd_str[i]); + dbg_cmd_flag = i + 1; + debug_level_cmd = 0; + I("Cmd is correct :%s, dbg_cmd = %d\n", str_ptr, dbg_cmd_flag); + break; + } + i++; + } + if (!str_ptr) { + I("Cmd is not correct\n"); + dbg_cmd_flag = 0; + } + + if (buf[str_len] == ',') { + dbg_cmd_par = buf + str_len + 1; + if (dbg_func_ptr_w[dbg_cmd_flag]) + dbg_func_ptr_w[dbg_cmd_flag](dbg_cmd_par, len - str_len - 2);/* 2 => '/n' + ','*/ + I("string of paremeter is %s, dbg_cmd_par = %s\n", buf + str_len + 1, dbg_cmd_par); + } else + I("No paremeter of this cmd\n"); + + if (dbg_cmd_flag) + return len; + + if (buf[0] == 'h') { /* handshaking */ + debug_level_cmd = buf[0]; + himax_int_enable(0); + /* 0:Running, 1:Stop, 2:I2C Fail */ + handshaking_result = g_core_fp.fp_hand_shaking(); + himax_int_enable(1); + return len; + } else if (buf[0] == 'v') { /* firmware version */ + himax_int_enable(0); +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#endif + debug_level_cmd = buf[0]; + g_core_fp.fp_read_FW_ver(); +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(true, false); +#else + g_core_fp.fp_system_reset(); +#endif +#ifdef HX_ZERO_FLASH + if (g_core_fp.fp_0f_reload_to_active) + g_core_fp.fp_0f_reload_to_active(); +#endif + himax_int_enable(1); + /* himax_check_chip_version(); */ + return len; + } else if (buf[0] == 'd') { /* ic information */ + debug_level_cmd = buf[0]; + return len; + } else if (buf[0] == 't') { + if (buf[1] == 's' && + buf[2] == 'd' && + buf[3] == 'b' && + buf[4] == 'g' + ) { + if (buf[5] == '1') { + I("Open Ts Debug!\n"); + g_ts_dbg = 1; + } else if (buf[5] == '0') { + I("Close Ts Debug!\n"); + g_ts_dbg = 0; + } else { + E("Parameter fault for ts debug\n"); + } + goto ENDFUCTION; + } + himax_int_enable(0); + debug_level_cmd = buf[0]; + fw_update_complete = false; + memset(fileName, 0, 128); + /* parse the file name */ + snprintf(fileName, len - 2, "%s", &buf[2]); + +#ifdef HX_ZERO_FLASH + I("NOW Running Zero flash update!\n"); + I("%s: upgrade from file(%s) start!\n", __func__, fileName); + result = g_core_fp.fp_0f_op_file_dirly(fileName); + if (result) { + fw_update_complete = false; + I("Zero flash update fail!\n"); + goto ENDFUCTION; + } else { + fw_update_complete = true; + I("Zero flash update complete!\n"); + } + goto firmware_upgrade_done; +#else + I("NOW Running common flow update!\n"); + I("%s: upgrade from file(%s) start!\n", __func__, fileName); + result = request_firmware(&fw, fileName, private_ts->dev); + + if (result < 0) { + I("fail to request_firmware fwpath: %s (ret:%d)\n", + fileName, result); + return result; + } + + I("%s: FW image: %02X, %02X, %02X, %02X\n", __func__, + fw->data[0], fw->data[1], fw->data[2], fw->data[3]); + fw_type = (fw->size) / 1024; + /* start to upgrade */ + himax_int_enable(0); + I("Now FW size is : %dk\n", fw_type); + + switch (fw_type) { + case 32: + if (g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_32k( + (unsigned char *)fw->data, fw->size, false) == 0) { + E("%s: TP upgrade error, line: %d\n", + __func__, __LINE__); + fw_update_complete = false; + } else { + I("%s: TP upgrade OK, line: %d\n", + __func__, __LINE__); + fw_update_complete = true; + } + break; + + case 60: + if (g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_60k( + (unsigned char *)fw->data, fw->size, false) == 0) { + E("%s: TP upgrade error, line: %d\n", + __func__, __LINE__); + fw_update_complete = false; + } else { + I("%s: TP upgrade OK, line: %d\n", + __func__, __LINE__); + fw_update_complete = true; + } + break; + + case 64: + if (g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_64k( + (unsigned char *)fw->data, fw->size, false) == 0) { + E("%s: TP upgrade error, line: %d\n", + __func__, __LINE__); + fw_update_complete = false; + } else { + I("%s: TP upgrade OK, line: %d\n", + __func__, __LINE__); + fw_update_complete = true; + } + break; + + case 124: + if (g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_124k( + (unsigned char *)fw->data, fw->size, false) == 0) { + E("%s: TP upgrade error, line: %d\n", + __func__, __LINE__); + fw_update_complete = false; + } else { + I("%s: TP upgrade OK, line: %d\n", + __func__, __LINE__); + fw_update_complete = true; + } + break; + + case 128: + if (g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_128k( + (unsigned char *)fw->data, fw->size, false) == 0) { + E("%s: TP upgrade error, line: %d\n", + __func__, __LINE__); + fw_update_complete = false; + } else { + I("%s: TP upgrade OK, line: %d\n", + __func__, __LINE__); + fw_update_complete = true; + } + break; + case 255: + if (g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_255k( + (unsigned char *)fw->data, fw->size, false) == 0) { + E("%s: TP upgrade error, line: %d\n", + __func__, __LINE__); + fw_update_complete = false; + } else { + I("%s: TP upgrade OK, line: %d\n", + __func__, __LINE__); + fw_update_complete = true; + } + break; + + default: + E("%s: Flash command fail: %d\n", __func__, __LINE__); + fw_update_complete = false; + break; + } + release_firmware(fw); + goto firmware_upgrade_done; +#endif + } else if (buf[0] == 'i' && buf[1] == '2' && buf[2] == 'c') { + /* i2c communication */ + debug_level_cmd = 'i'; + return len; + } else if (buf[0] == 'i' && buf[1] == 'n' && buf[2] == 't') { + /* INT trigger */ + debug_level_cmd = 'n'; + return len; +#ifdef HX_ZERO_FLASH + } else if (buf[0] == 'z') { + result = buf[1] - '0'; + I("check type = %d\n", result); + g_core_fp.fp_0f_operation_check(result); + return len; + } else if (buf[0] == 'p') { + I("NOW debug echo r!\n"); + /* himax_program_sram(); */ + private_ts->himax_0f_update_wq = + create_singlethread_workqueue("HMX_update_0f_reuqest_write"); + + if (!private_ts->himax_0f_update_wq) + E(" allocate syn_update_wq failed\n"); + + INIT_DELAYED_WORK(&private_ts->work_0f_update, + g_core_fp.fp_0f_operation); + queue_delayed_work(private_ts->himax_0f_update_wq, + &private_ts->work_0f_update, msecs_to_jiffies(100)); + return len; + } else if (buf[0] == 'x') { + g_core_fp.fp_system_reset(); +#ifdef HX_ZERO_FLASH + if (g_core_fp.fp_0f_reload_to_active) + g_core_fp.fp_0f_reload_to_active(); +#endif + return len; +#endif + } else if (buf[0] == 'l' && buf[1] == 'o' && buf[2] == 't') { + debug_level_cmd = buf[0]; + g_core_fp.fp_sense_off(true); + g_core_fp.fp_ic_id_read(); + g_core_fp.fp_sense_on(0x01); + return len; + } + /* others,do nothing */ + debug_level_cmd = 0; + return len; + +firmware_upgrade_done: + g_core_fp.fp_reload_disable(0); + g_core_fp.fp_read_FW_ver(); + g_core_fp.fp_touch_information(); +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(true, false); +#ifdef HX_ZERO_FLASH + if (g_core_fp.fp_0f_reload_to_active) + g_core_fp.fp_0f_reload_to_active(); +#endif +#else + g_core_fp.fp_sense_on(0x00); +#endif + + himax_int_enable(1); + /* todo himax_chip->tp_firmware_upgrade_proceed = 0; + * todo himax_chip->suspend_state = 0; + * todo enable_irq(himax_chip->irq); + */ +ENDFUCTION: + return len; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) +static const struct proc_ops himax_proc_debug_ops = { + .proc_read = himax_debug_read, + .proc_write = himax_debug_write, +}; +#else +static const struct file_operations himax_proc_debug_ops = { + .owner = THIS_MODULE, + .read = himax_debug_read, + .write = himax_debug_write, +}; +#endif + +static void himax_himax_data_init(void) +{ + debug_data->fp_ts_dbg_func = himax_ts_dbg_func; + debug_data->fp_set_diag_cmd = himax_set_diag_cmd; + debug_data->flash_dump_going = false; +} + +static void himax_ts_flash_work_func(struct work_struct *work) +{ + himax_ts_flash_func(); +} +#ifdef HX_TP_PROC_GUEST_INFO +static void himax_ts_guest_info_work_func(struct work_struct *work) +{ + g_core_fp.read_guest_info(); +} +#endif + +static void himax_ts_diag_work_func(struct work_struct *work) +{ + himax_ts_diag_func(); +} + +void dbg_func_ptr_init(void) +{ + /*debug function ptr init*/ + dbg_func_ptr_r[1] = himax_crc_test_read; + dbg_func_ptr_r[2] = himax_proc_FW_debug_read; + dbg_func_ptr_r[3] = himax_attn_read; + dbg_func_ptr_r[4] = himax_layout_read; + dbg_func_ptr_w[4] = himax_layout_write; + dbg_func_ptr_r[5] = himax_proc_DD_debug_read; + dbg_func_ptr_w[5] = himax_proc_DD_debug_write; +#ifdef HX_ESD_RECOVERY + dbg_func_ptr_r[6] = himax_esd_cnt_read; + dbg_func_ptr_w[6] = himax_esd_cnt_write; +#endif + dbg_func_ptr_w[7] = himax_sense_on_off_write; + dbg_func_ptr_r[8] = himax_debug_level_read; + dbg_func_ptr_w[8] = himax_debug_level_write; +#ifdef HX_TP_PROC_GUEST_INFO + dbg_func_ptr_r[9] = himax_proc_guest_info_read; + dbg_func_ptr_w[9] = himax_proc_guest_info_write; +#endif + dbg_func_ptr_r[10] = himax_int_en_read; + dbg_func_ptr_w[10] = himax_int_en_write; + dbg_func_ptr_w[11] = himax_proc_register_write; + dbg_func_ptr_r[11] = himax_proc_register_read; + dbg_func_ptr_w[12] = himax_reset_write; + dbg_func_ptr_w[13] = himax_diag_arrange_write; + dbg_func_ptr_w[14] = himax_diag_cmd_write; +} + +int himax_touch_proc_init(void) +{ + himax_proc_diag_dir = proc_mkdir(HIMAX_PROC_DIAG_FOLDER, himax_touch_proc_dir); + + if (himax_proc_diag_dir == NULL) { + E(" %s: himax_proc_diag_dir file create failed!\n", __func__); + return -ENOMEM; + } + + himax_proc_vendor_file = proc_create(HIMAX_PROC_VENDOR_FILE, 0444, + himax_touch_proc_dir, &himax_proc_vendor_ops); + if (himax_proc_vendor_file == NULL) { + E(" %s: proc vendor file create failed!\n", __func__); + goto fail_1; + } + + himax_proc_stack_file = proc_create(HIMAX_PROC_STACK_FILE, 0444, + himax_proc_diag_dir, &himax_proc_stack_ops); + if (himax_proc_stack_file == NULL) { + E(" %s: proc stack file create failed!\n", __func__); + goto fail_2_1; + } + + himax_proc_iir_file = proc_create(HIMAX_PROC_IIR_FILE, 0444, + himax_proc_diag_dir, &himax_proc_iir_ops); + if (himax_proc_iir_file == NULL) { + E(" %s: proc iir file create failed!\n", __func__); + goto fail_2_2; + } + + himax_proc_dc_file = proc_create(HIMAX_PROC_DC_FILE, 0444, + himax_proc_diag_dir, &himax_proc_dc_ops); + if (himax_proc_dc_file == NULL) { + E(" %s: proc dc file create failed!\n", __func__); + goto fail_2_3; + } + + himax_proc_bank_file = proc_create(HIMAX_PROC_BANK_FILE, 0444, + himax_proc_diag_dir, &himax_proc_bank_ops); + if (himax_proc_bank_file == NULL) { + E(" %s: proc bank file create failed!\n", __func__); + goto fail_2_4; + } + + himax_proc_debug_file = proc_create(HIMAX_PROC_DEBUG_FILE, + 0644, himax_touch_proc_dir, + &himax_proc_debug_ops); + if (himax_proc_debug_file == NULL) { + E(" %s: proc debug file create failed!\n", __func__); + goto fail_3; + } + dbg_func_ptr_init(); + + himax_proc_flash_dump_file = proc_create(HIMAX_PROC_FLASH_DUMP_FILE, + 0644, himax_touch_proc_dir, + &himax_proc_flash_ops); + if (himax_proc_flash_dump_file == NULL) { + E(" %s: proc flash dump file create failed!\n", __func__); + goto fail_4; + } + + return 0; +fail_4: remove_proc_entry(HIMAX_PROC_DEBUG_FILE, himax_touch_proc_dir); +fail_3: remove_proc_entry(HIMAX_PROC_BANK_FILE, himax_proc_diag_dir); +fail_2_4: remove_proc_entry(HIMAX_PROC_DC_FILE, himax_proc_diag_dir); +fail_2_3: remove_proc_entry(HIMAX_PROC_IIR_FILE, himax_proc_diag_dir); +fail_2_2: remove_proc_entry(HIMAX_PROC_STACK_FILE, himax_proc_diag_dir); +fail_2_1: remove_proc_entry(HIMAX_PROC_VENDOR_FILE, himax_touch_proc_dir); +fail_1: remove_proc_entry(HIMAX_PROC_DIAG_FOLDER, himax_touch_proc_dir); + return -ENOMEM; +} + +void himax_touch_proc_deinit(void) +{ + remove_proc_entry(HIMAX_PROC_FLASH_DUMP_FILE, himax_touch_proc_dir); + remove_proc_entry(HIMAX_PROC_DEBUG_FILE, himax_touch_proc_dir); + remove_proc_entry(HIMAX_PROC_BANK_FILE, himax_proc_diag_dir); + remove_proc_entry(HIMAX_PROC_DC_FILE, himax_proc_diag_dir); + remove_proc_entry(HIMAX_PROC_IIR_FILE, himax_proc_diag_dir); + remove_proc_entry(HIMAX_PROC_STACK_FILE, himax_proc_diag_dir); + remove_proc_entry(HIMAX_PROC_VENDOR_FILE, himax_touch_proc_dir); +} + +int hx_set_stack_raw(int set_val) +{ + int ret = NO_ERR; + if (dsram_flag) { + /*Cancal work queue and return to stack*/ + process_type = 0; + dsram_flag = false; + cancel_delayed_work(&private_ts->himax_diag_delay_wrok); + himax_int_enable(1); + g_core_fp.fp_return_event_stack(); + } +// if (set_val) { + private_ts->diag_cmd = set_val; + g_core_fp.fp_diag_register_set(private_ts->diag_cmd, 0); +// } else { +// private_ts->diag_cmd = 0; +// g_core_fp.fp_diag_register_set(private_ts->diag_cmd, 0); +// } + return ret; +} + +int himax_debug_init(void) +{ + struct himax_ts_data *ts = private_ts; + + I("%s:Enter\n", __func__); + + if (ts == NULL) { + E("%s: ts struct is NULL\n", __func__); + return -EPROBE_DEFER; + } + + reg_read_data = kzalloc(128 * sizeof(uint8_t), GFP_KERNEL); + if (reg_read_data == NULL) { + goto err_alloc_reg_read_data_fail; + } + + debug_data = kzalloc(sizeof(struct himax_debug), GFP_KERNEL); + if (debug_data == NULL) { /*Allocate debug data space*/ + goto err_alloc_debug_data_fail; + } + + himax_himax_data_init(); + + ts->flash_wq = create_singlethread_workqueue("himax_flash_wq"); + + if (!ts->flash_wq) { + E("%s: create flash workqueue failed\n", __func__); + goto err_create_flash_dump_wq_failed; + } + + INIT_WORK(&ts->flash_work, himax_ts_flash_work_func); + + g_flash_progress = START; + setFlashBuffer(); + if (flash_buffer == NULL) { + E("%s: flash buffer allocate fail failed\n", __func__); + goto err_flash_buf_alloc_failed; + } + +#ifdef HX_TP_PROC_GUEST_INFO + + if (g_guest_info_data == NULL) { + g_guest_info_data = kzalloc(sizeof(struct hx_guest_info), + GFP_KERNEL); + if (g_guest_info_data == NULL) + goto err_guest_info_alloc_failed; + g_guest_info_data->g_guest_info_ongoing = 0; + g_guest_info_data->g_guest_info_type = 0; + } + + ts->guest_info_wq = + create_singlethread_workqueue("himax_guest_info_wq"); + if (!ts->guest_info_wq) { + E("%s: create guest info workqueue failed\n", __func__); + goto err_create_guest_info_wq_failed; + } + INIT_WORK(&ts->guest_info_work, himax_ts_guest_info_work_func); +#endif + + ts->himax_diag_wq = create_singlethread_workqueue("himax_diag"); + + if (!ts->himax_diag_wq) { + E("%s: create diag workqueue failed\n", __func__); + goto err_create_diag_wq_failed; + } + + INIT_DELAYED_WORK(&ts->himax_diag_delay_wrok, himax_ts_diag_work_func); + + setMutualBuffer(ic_data->HX_RX_NUM, ic_data->HX_TX_NUM); + if (getMutualBuffer() == NULL) { + E("%s: mutual buffer allocate fail failed\n", __func__); + goto err_mut_buf_alloc_failed; + } + + setMutualNewBuffer(ic_data->HX_RX_NUM, ic_data->HX_TX_NUM); + if (getMutualNewBuffer() == NULL) { + E("%s: mutual new buffer allocate fail failed\n", __func__); + goto err_mut_new_alloc_failed; + } + + setMutualOldBuffer(ic_data->HX_RX_NUM, ic_data->HX_TX_NUM); + if (getMutualOldBuffer() == NULL) { + E("%s: mutual old buffer allocate fail failed\n", __func__); + goto err_mut_old_alloc_failed; + } + +#ifdef HX_TP_PROC_2T2R + + if (Is_2T2R) { + setMutualBuffer_2(ic_data->HX_RX_NUM_2, ic_data->HX_TX_NUM_2); + + if (getMutualBuffer_2() == NULL) { + E("%s: mutual buffer 2 allocate fail failed\n", + __func__); + goto err_mut_buf2_alloc_failed; + } + } +#endif + + if (himax_touch_proc_init()) + goto err_proc_init_failed; + + return 0; + +err_proc_init_failed: +#if defined(HX_TP_PROC_2T2R) + kfree(diag_mutual_2); + diag_mutual_2 = NULL; +err_mut_buf2_alloc_failed: +#endif + kfree(diag_mutual_old); + diag_mutual_old = NULL; +err_mut_old_alloc_failed: + kfree(diag_mutual_new); + diag_mutual_new = NULL; +err_mut_new_alloc_failed: + kfree(diag_mutual); + diag_mutual = NULL; +err_mut_buf_alloc_failed: + cancel_delayed_work_sync(&ts->himax_diag_delay_wrok); + destroy_workqueue(ts->himax_diag_wq); +err_create_diag_wq_failed: + +#ifdef HX_TP_PROC_GUEST_INFO +err_create_guest_info_wq_failed: + destroy_workqueue(ts->guest_info_wq); + if (g_guest_info_data != NULL) { + kfree(g_guest_info_data); + g_guest_info_data = NULL; + } +err_guest_info_alloc_failed: +#endif + kfree(flash_buffer); + flash_buffer = NULL; +err_flash_buf_alloc_failed: + destroy_workqueue(ts->flash_wq); +err_create_flash_dump_wq_failed: + kfree(debug_data); + debug_data = NULL; +err_alloc_debug_data_fail: + kfree(reg_read_data); + reg_read_data = NULL; +err_alloc_reg_read_data_fail: + return -ENOMEM; +} +EXPORT_SYMBOL(himax_debug_init); + +int himax_debug_remove(void) +{ + struct himax_ts_data *ts = private_ts; + + himax_touch_proc_deinit(); + + cancel_delayed_work_sync(&ts->himax_diag_delay_wrok); +#ifdef HX_TP_PROC_GUEST_INFO + destroy_workqueue(ts->guest_info_wq); + if (g_guest_info_data != NULL) + kfree(g_guest_info_data); +#endif + destroy_workqueue(ts->himax_diag_wq); + destroy_workqueue(ts->flash_wq); + + if (debug_data != NULL) + kfree(debug_data); + if (reg_read_data != NULL) + kfree(reg_read_data); + + return 0; +} +EXPORT_SYMBOL(himax_debug_remove); + diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_debug.h b/drivers/input/touchscreen/himax/hx831xx/himax_debug.h new file mode 100755 index 000000000000..6e57cbb717ed --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_debug.h @@ -0,0 +1,159 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for debug nodes + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef H_HIMAX_DEBUG +#define H_HIMAX_DEBUG + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_I2C) +#include "himax_platform.h" +#endif + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_SPI) +#include "himax_platform_SPI.h" +#endif + +#include "himax_common.h" + +#define HX_NOISE_SELCT 0x01 +#define HX_NORMAL_SELCT 0x00 +#define HX_DSRAM_EN 0x0A +#define HX_DSRAM_DIS 0x00 + +#ifdef HX_ESD_RECOVERY + extern u8 HX_ESD_RESET_ACTIVATE; + extern int hx_EB_event_flag; + extern int hx_EC_event_flag; + extern int hx_ED_event_flag; +#endif + +#define HIMAX_PROC_VENDOR_FILE "vendor" +extern struct proc_dir_entry *himax_proc_vendor_file; + +#define HIMAX_PROC_PEN_POS_FILE "pen_pos" + +int himax_touch_proc_init(void); +void himax_touch_proc_deinit(void); +extern int himax_int_en_set(void); + +extern uint8_t byte_length; +extern uint8_t register_command[4]; +extern uint8_t cfg_flag; + +#define HIMAX_PROC_DIAG_FOLDER "diag" +struct proc_dir_entry *himax_proc_diag_dir; +#define HIMAX_PROC_STACK_FILE "stack" +extern struct proc_dir_entry *himax_proc_stack_file; +#define HIMAX_PROC_IIR_FILE "iir_s" +extern struct proc_dir_entry *himax_proc_iir_file; +#define HIMAX_PROC_DC_FILE "dc_s" +extern struct proc_dir_entry *himax_proc_dc_file; +#define HIMAX_PROC_BANK_FILE "bank_s" +extern struct proc_dir_entry *himax_proc_bank_file; + +#ifdef HX_TP_PROC_2T2R + extern uint32_t *diag_mutual_2; + + int32_t *getMutualBuffer_2(void); + void setMutualBuffer_2(uint8_t x_num, uint8_t y_num); +#endif +extern int32_t *diag_mutual; +extern int32_t *diag_mutual_new; +extern int32_t *diag_mutual_old; +extern uint8_t diag_max_cnt; +extern uint8_t hx_state_info[2]; +extern uint8_t diag_coor[128]; +extern int32_t diag_self[100]; +extern int32_t diag_self_new[100]; +extern int32_t diag_self_old[100]; +int32_t *getMutualBuffer(void); +int32_t *getMutualNewBuffer(void); +int32_t *getMutualOldBuffer(void); +int32_t *getSelfBuffer(void); +int32_t *getSelfNewBuffer(void); +int32_t *getSelfOldBuffer(void); +void setMutualBuffer(uint8_t x_num, uint8_t y_num); +void setMutualNewBuffer(uint8_t x_num, uint8_t y_num); +void setMutualOldBuffer(uint8_t x_num, uint8_t y_num); +uint8_t process_type; +uint8_t mode_flag; +uint8_t overflow; + +#define HIMAX_PROC_DEBUG_FILE "debug" +extern struct proc_dir_entry *himax_proc_debug_file; +extern bool fw_update_complete; +extern int handshaking_result; +extern unsigned char debug_level_cmd; +extern uint8_t cmd_set[8]; +extern uint8_t mutual_set_flag; + +#define HIMAX_PROC_FLASH_DUMP_FILE "flash_dump" +extern struct proc_dir_entry *himax_proc_flash_dump_file; +extern uint8_t *flash_buffer; +extern uint8_t g_flash_cmd; +extern uint8_t g_flash_progress; +extern bool g_flash_dump_rst; /*Fail = 0, Pass = 1*/ +void setFlashBuffer(void); + +enum flash_dump_prog { + START, + ONGOING, + FINISHED, +}; + +extern uint32_t **raw_data_array; +extern uint8_t X_NUM4; +extern uint8_t Y_NUM; +extern uint8_t sel_type; + +/* Moved from debug.c */ +extern struct himax_debug *debug_data; +extern unsigned char IC_CHECKSUM; +extern int i2c_error_count; +extern struct proc_dir_entry *himax_touch_proc_dir; + +#ifdef HX_TP_PROC_GUEST_INFO +extern struct hx_guest_info *g_guest_info_data; +extern char *g_guest_info_item[]; +#endif + +extern int himax_input_register(struct himax_ts_data *ts, struct input_dev *input_dev, u8 propbit); +#ifdef HX_TP_PROC_2T2R + extern bool Is_2T2R; +#endif + +#ifdef HX_RST_PIN_FUNC + extern void himax_ic_reset(uint8_t loadconfig, uint8_t int_off); +#endif + +#if defined(HX_ZERO_FLASH) +//extern char *i_CTPM_firmware_name; +#endif + +extern uint8_t HX_PROC_SEND_FLAG; +extern struct himax_target_report_data *g_target_report_data; +extern struct himax_report_data *hx_touch_data; +extern int g_ts_dbg; + +/* Moved from debug.c end */ +#define BUF_SIZE 1024 +#define CMD_NUM 15 +char *dbg_cmd_str[] = {"crc_test", "fw_debug", "attn", "layout", "dd_debug", + "esd_cnt", "senseonoff", "debug_level", "guest_info", "int_en", + "register", "reset", "diag_arr", "diag", NULL}; +int dbg_cmd_flag; +char *dbg_cmd_par; +ssize_t (*dbg_func_ptr_r[CMD_NUM])(char *buf, size_t len); +ssize_t (*dbg_func_ptr_w[CMD_NUM])(char *buf, size_t len); +#endif diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_ic_HX83102.c b/drivers/input/touchscreen/himax/hx831xx/himax_ic_HX83102.c new file mode 100755 index 000000000000..84ef7af0f073 --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_ic_HX83102.c @@ -0,0 +1,1557 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for HX83102 chipset + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "himax_ic_HX83102.h" +#include "himax_modular.h" + +static void hx83102_chip_init(void) +{ + private_ts->chip_cell_type = CHIP_IS_IN_CELL; + KI("%s:IC cell type = %d\n", __func__, private_ts->chip_cell_type); + IC_CHECKSUM = HX_TP_BIN_CHECKSUM_CRC; + /*Himax: Set FW and CFG Flash Address*/ + CID_VER_MAJ_FLASH_ADDR = 49154; /*0x00C002*/ + CID_VER_MAJ_FLASH_LENG = 1; + CID_VER_MIN_FLASH_ADDR = 49155; /*0x00C003*/ + CID_VER_MIN_FLASH_LENG = 1; + PANEL_VERSION_ADDR = 49156; /*0x00C004*/ + PANEL_VERSION_LENG = 1; + FW_VER_MAJ_FLASH_ADDR = 49157; /*0x00C005*/ + FW_VER_MAJ_FLASH_LENG = 1; + FW_VER_MIN_FLASH_ADDR = 49158; /*0x00C006*/ + FW_VER_MIN_FLASH_LENG = 1; + CFG_VER_MAJ_FLASH_ADDR = 49408; /*0x00C100*/ + CFG_VER_MAJ_FLASH_LENG = 1; + CFG_VER_MIN_FLASH_ADDR = 49409; /*0x00C101*/ + CFG_VER_MIN_FLASH_LENG = 1; +} + +static void hx83102e_chip_init(void) +{ + private_ts->chip_cell_type = CHIP_IS_IN_CELL; + KI("%s:IC cell type = %d\n", __func__, private_ts->chip_cell_type); + IC_CHECKSUM = HX_TP_BIN_CHECKSUM_CRC; + /*Himax: Set FW and CFG Flash Address*/ + CID_VER_MAJ_FLASH_ADDR = 59394; /*0x00E802*/ + CID_VER_MAJ_FLASH_LENG = 1; + CID_VER_MIN_FLASH_ADDR = 59395; /*0x00E803*/ + CID_VER_MIN_FLASH_LENG = 1; + PANEL_VERSION_ADDR = 59396; /*0x00E804*/ + PANEL_VERSION_LENG = 1; + FW_VER_MAJ_FLASH_ADDR = 59397; /*0x00E805*/ + FW_VER_MAJ_FLASH_LENG = 1; + FW_VER_MIN_FLASH_ADDR = 59398; /*0x00E806*/ + FW_VER_MIN_FLASH_LENG = 1; + CFG_VER_MAJ_FLASH_ADDR = 59648; /*0x00E900*/ + CFG_VER_MAJ_FLASH_LENG = 1; + CFG_VER_MIN_FLASH_ADDR = 59649; /*0x00E901*/ + CFG_VER_MIN_FLASH_LENG = 1; +} + +void hx83102_burst_enable(uint8_t auto_add_4_byte) +{ + uint8_t tmp_data[4]; + + tmp_data[0] = 0x31; + if (himax_bus_write(0x13, tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return; + } + + tmp_data[0] = (0x10 | auto_add_4_byte); + if (himax_bus_write(0x0D, tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return; + } +} + +int hx83102_flash_write_burst(uint8_t *reg_byte, uint8_t *write_data) +{ + uint8_t data_byte[8]; + int i = 0, j = 0; + + for (i = 0; i < 4; i++) + data_byte[i] = reg_byte[i]; + for (j = 4; j < 8; j++) + data_byte[j] = write_data[j-4]; + + if (himax_bus_write(0x00, data_byte, 8, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return I2C_FAIL; + } + return 0; +} + +static int hx83102_register_read(uint8_t *read_addr, int read_length, uint8_t *read_data) +{ + uint8_t tmp_data[4]; + int i = 0; + int address = 0; + + if (read_length > 256) { + E("%s: read len over 256!\n", __func__); + return LENGTH_FAIL; + } + if (read_length > 4) + hx83102_burst_enable(1); + else + hx83102_burst_enable(0); + + address = (read_addr[3] << 24) + (read_addr[2] << 16) + (read_addr[1] << 8) + read_addr[0]; + i = address; + tmp_data[0] = (uint8_t)i; + tmp_data[1] = (uint8_t)(i >> 8); + tmp_data[2] = (uint8_t)(i >> 16); + tmp_data[3] = (uint8_t)(i >> 24); + if (himax_bus_write(0x00, tmp_data, 4, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return I2C_FAIL; + } + tmp_data[0] = 0x00; + if (himax_bus_write(0x0C, tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return I2C_FAIL; + } + + if (himax_bus_read(0x08, read_data, read_length, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return I2C_FAIL; + } + if (read_length > 4) + hx83102_burst_enable(0); + + return 0; +} + +#ifdef HX_RST_PIN_FUNC +static void hx83102_pin_reset(void) +{ + KI("%s: Now reset the Touch chip.\n", __func__); + himax_rst_gpio_set(private_ts->rst_gpio, 0); + KI("%s: reset gpio : %d\n", __func__, gpio_get_value(private_ts->rst_gpio)); + + msleep(20); + himax_rst_gpio_set(private_ts->rst_gpio, 1); + KI("%s: reset gpio : %d\n", __func__, gpio_get_value(private_ts->rst_gpio)); + msleep(50); + KI("%s: done\n", __func__); +} +#endif + +static bool hx83102_sense_off(bool check_en) +{ + uint8_t cnt = 0; + uint8_t tmp_addr[DATA_LEN_4]; + uint8_t tmp_writ[DATA_LEN_4]; + uint8_t tmp_data[DATA_LEN_4]; + + do { + if (cnt == 0 || (tmp_data[0] != 0xA5 && tmp_data[0] != 0x00 && tmp_data[0] != 0x87)) { + tmp_addr[3] = 0x90; tmp_addr[2] = 0x00; tmp_addr[1] = 0x00; tmp_addr[0] = 0x5C; + tmp_writ[3] = 0x00; tmp_writ[2] = 0x00; tmp_writ[1] = 0x00; tmp_writ[0] = 0xA5; + hx83102_flash_write_burst(tmp_addr, tmp_writ); + } + msleep(20); + + /* check fw status */ + tmp_addr[3] = 0x90; tmp_addr[2] = 0x00; tmp_addr[1] = 0x00; tmp_addr[0] = 0xA8; + hx83102_register_read(tmp_addr, DATA_LEN_4, tmp_data); + + if (tmp_data[0] != 0x05) { + KI("%s: Do not need wait FW, Status = 0x%02X!\n", __func__, tmp_data[0]); + break; + } + + tmp_addr[3] = 0x90; tmp_addr[2] = 0x00; tmp_addr[1] = 0x00; tmp_addr[0] = 0x5C; + hx83102_register_read(tmp_addr, DATA_LEN_4, tmp_data); + KI("%s: cnt = %d, data[0] = 0x%02X!\n", __func__, cnt, tmp_data[0]); + } while (tmp_data[0] != 0x87 && (++cnt < 50) && check_en == true); + + cnt = 0; + + E("%s: ++ \n", __func__); + + do { + /*=========================================== + *I2C_password[7:0] set Enter safe mode : 0x31 ==> 0x27 + *=========================================== + */ + tmp_data[0] = 0x27; + if (himax_bus_write(0x31, tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return false; + } + + /*=========================================== + *I2C_password[15:8] set Enter safe mode :0x32 ==> 0x95 + *=========================================== + */ + tmp_data[0] = 0x95; + if (himax_bus_write(0x32, tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return false; + } + + /* ====================== + *Check enter_save_mode + *====================== + */ + tmp_addr[3] = 0x90; tmp_addr[2] = 0x00; tmp_addr[1] = 0x00; tmp_addr[0] = 0xA8; + hx83102_register_read(tmp_addr, ADDR_LEN_4, tmp_data); + KI("%s: Check enter_save_mode data[0]=%X, %X %X %X\n", __func__, tmp_data[0], tmp_data[1], tmp_data[2], tmp_data[3]); + + if (tmp_data[0] == 0x0C) { + /*===================================== + *Reset TCON + *===================================== + */ + tmp_addr[3] = 0x80; tmp_addr[2] = 0x02; tmp_addr[1] = 0x00; tmp_addr[0] = 0x20; + tmp_data[3] = 0x00; tmp_data[2] = 0x00; tmp_data[1] = 0x00; tmp_data[0] = 0x00; + hx83102_flash_write_burst(tmp_addr, tmp_data); + usleep_range(1000, 1001); + tmp_data[3] = 0x00; tmp_data[2] = 0x00; tmp_data[1] = 0x00; tmp_data[0] = 0x01; + hx83102_flash_write_burst(tmp_addr, tmp_data); + /*===================================== + *Reset ADC + *===================================== + */ + tmp_addr[3] = 0x80; + tmp_addr[2] = 0x02; + tmp_addr[1] = 0x00; + tmp_addr[0] = 0x94; + tmp_data[3] = 0x00; + tmp_data[2] = 0x00; + tmp_data[1] = 0x00; + tmp_data[0] = 0x00; + hx83102_flash_write_burst(tmp_addr, tmp_data); + usleep_range(1000, 1001); + tmp_data[3] = 0x00; + tmp_data[2] = 0x00; + tmp_data[1] = 0x00; + tmp_data[0] = 0x01; + hx83102_flash_write_burst(tmp_addr, tmp_data); + + return true; + } + usleep_range(10000, 10001); +#ifdef HX_RST_PIN_FUNC + hx83102_pin_reset(); +#endif + + } while (cnt++ < 15); + + return false; +} + +static bool hx83102ab_sense_off(bool check_en) +{ + uint8_t cnt = 0; + uint8_t tmp_addr[DATA_LEN_4]; + uint8_t tmp_data[DATA_LEN_4]; + + do { + /*=========================================== + *I2C_password[7:0] set Enter safe mode : 0x31 ==> 0x27 + *=========================================== + */ + tmp_data[0] = 0x27; + if (himax_bus_write(0x31, tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return false; + } + + /*=========================================== + *I2C_password[15:8] set Enter safe mode :0x32 ==> 0x95 + *=========================================== + */ + tmp_data[0] = 0x95; + if (himax_bus_write(0x32, tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return false; + } + + /* ====================== + *Check enter_save_mode + *====================== + */ + tmp_addr[3] = 0x90; tmp_addr[2] = 0x00; tmp_addr[1] = 0x00; tmp_addr[0] = 0xA8; + hx83102_register_read(tmp_addr, ADDR_LEN_4, tmp_data); + KI("%s: Check enter_save_mode data[0]=%X, %X %X %X\n", __func__, tmp_data[0], tmp_data[1], tmp_data[2], tmp_data[3]); + + if (tmp_data[0] == 0x0C) { + /*===================================== + *Reset TCON + *===================================== + */ + tmp_addr[3] = 0x80; tmp_addr[2] = 0x02; tmp_addr[1] = 0x00; tmp_addr[0] = 0x20; + tmp_data[3] = 0x00; tmp_data[2] = 0x00; tmp_data[1] = 0x00; tmp_data[0] = 0x00; + hx83102_flash_write_burst(tmp_addr, tmp_data); + usleep_range(1000, 1001); + tmp_data[3] = 0x00; tmp_data[2] = 0x00; tmp_data[1] = 0x00; tmp_data[0] = 0x01; + hx83102_flash_write_burst(tmp_addr, tmp_data); + /*===================================== + *Reset ADC + *===================================== + */ + tmp_addr[3] = 0x80; + tmp_addr[2] = 0x02; + tmp_addr[1] = 0x00; + tmp_addr[0] = 0x94; + tmp_data[3] = 0x00; + tmp_data[2] = 0x00; + tmp_data[1] = 0x00; + tmp_data[0] = 0x00; + hx83102_flash_write_burst(tmp_addr, tmp_data); + usleep_range(1000, 1001); + tmp_data[3] = 0x00; + tmp_data[2] = 0x00; + tmp_data[1] = 0x00; + tmp_data[0] = 0x01; + hx83102_flash_write_burst(tmp_addr, tmp_data); + + return true; + } + /*msleep(10);*/ + usleep_range(5000, 5001); +#ifdef HX_RST_PIN_FUNC + himax_rst_gpio_set(private_ts->rst_gpio, 0); + msleep(20); + himax_rst_gpio_set(private_ts->rst_gpio, 1); + msleep(50); +#endif + + } while (cnt++ < 5); + + return false; +} + +static void hx83102ab_set_SMWP_enable(uint8_t SMWP_enable, bool suspended) +{ + uint8_t tmp_data[DATA_LEN_4]; + uint8_t back_data[DATA_LEN_4]; + uint8_t retry_cnt = 0; + + g_core_fp.fp_sense_off(true); + + do { + if (SMWP_enable) { + himax_in_parse_assign_cmd(fw_func_handshaking_pwd, tmp_data, 4); + g_core_fp.fp_register_write(pfw_op->addr_smwp_enable, DATA_LEN_4, tmp_data, 0); + himax_in_parse_assign_cmd(fw_func_handshaking_pwd, back_data, 4); + } else { + himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, tmp_data, 4); + g_core_fp.fp_register_write(pfw_op->addr_smwp_enable, DATA_LEN_4, tmp_data, 0); + himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, back_data, 4); + } + + g_core_fp.fp_register_read(pfw_op->addr_smwp_enable, DATA_LEN_4, tmp_data, false); + /*KI("%s: tmp_data[0]=%d, SMWP_enable=%d, retry_cnt=%d\n", __func__, tmp_data[0],SMWP_enable,retry_cnt);*/ + retry_cnt++; + } while ((tmp_data[3] != back_data[3] || tmp_data[2] != back_data[2] || tmp_data[1] != back_data[1] || tmp_data[0] != back_data[0]) && retry_cnt < HIMAX_REG_RETRY_TIMES); + + g_core_fp.fp_sense_on(0x00); +} + +static void hx83102ab_set_HSEN_enable(uint8_t HSEN_enable, bool suspended) +{ + uint8_t tmp_data[DATA_LEN_4]; + + if (HSEN_enable) { + himax_in_parse_assign_cmd(fw_func_handshaking_pwd, tmp_data, 4); + g_core_fp.fp_register_write(pfw_op->addr_hsen_enable, DATA_LEN_4, tmp_data, 0); + } else { + himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, tmp_data, 4); + g_core_fp.fp_register_write(pfw_op->addr_hsen_enable, DATA_LEN_4, tmp_data, 0); + } + + /*KI("%s: tmp_data[0]=%d, HSEN_enable=%d, retry_cnt=%d\n", __func__, tmp_data[0],HSEN_enable,retry_cnt);*/ +} + +static void hx83102ab_usb_detect_set(uint8_t *cable_config) +{ + uint8_t tmp_data[DATA_LEN_4]; + + if (cable_config[1] == 0x01) { + himax_in_parse_assign_cmd(fw_func_handshaking_pwd, tmp_data, 4); + g_core_fp.fp_register_write(pfw_op->addr_usb_detect, DATA_LEN_4, tmp_data, 0); + KI("%s: USB detect status IN!\n", __func__); + } else { + himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, tmp_data, 4); + g_core_fp.fp_register_write(pfw_op->addr_usb_detect, DATA_LEN_4, tmp_data, 0); + KI("%s: USB detect status OUT!\n", __func__); + } +} + +static uint8_t hx83102ab_read_DD_status(uint8_t *cmd_set, uint8_t *tmp_data) +{ + int cnt = 0; + uint8_t req_size = cmd_set[0]; + + cmd_set[3] = pfw_op->data_dd_request[0]; + + g_core_fp.fp_register_write(pfw_op->addr_dd_handshak_addr, DATA_LEN_4, cmd_set, 0); + KI("%s: cmd_set[0] = 0x%02X,cmd_set[1] = 0x%02X,cmd_set[2] = 0x%02X,cmd_set[3] = 0x%02X\n", + __func__, cmd_set[0], cmd_set[1], cmd_set[2], cmd_set[3]); + + /* Doing hand shaking 0xAA -> 0xBB */ + for (cnt = 0; cnt < 100; cnt++) { + g_core_fp.fp_register_read(pfw_op->addr_dd_handshak_addr, DATA_LEN_4, tmp_data, false); + usleep_range(10000, 10001); + + if (tmp_data[3] == pfw_op->data_dd_ack[0]) { + KI("%s Data ready goto moving data\n", __func__); + break; + } + if (cnt >= 99) { + KI("%s Data not ready in FW\n", __func__); + return FW_NOT_READY; + } + } + + g_core_fp.fp_sense_off(true); + g_core_fp.fp_register_read(pfw_op->addr_dd_data_addr, req_size, tmp_data, false); + g_core_fp.fp_sense_on(0x01); + return NO_ERR; +} + +static int hx83102ab_read_FW_status(uint8_t *state_addr, uint8_t *tmp_addr) +{ + uint8_t i; + uint8_t req_size = 0; + uint8_t status_addr[DATA_LEN_4]; /*0x10007F44*/ + uint8_t cmd_addr[DATA_LEN_4]; /*0x900000F8*/ + + if (state_addr[0] == 0x01) { + state_addr[1] = 0x04; + + for (i = 0; i < DATA_LEN_4; i++) { + /* 0x10007F44 */ + state_addr[i + 2] = pfw_op->addr_fw_dbg_msg_addr[i]; + status_addr[i] = pfw_op->addr_fw_dbg_msg_addr[i]; + } + + req_size = 0x04; + g_core_fp.fp_sense_off(true); + g_core_fp.fp_register_read(status_addr, req_size, tmp_addr, false); + g_core_fp.fp_sense_on(0x01); + } else if (state_addr[0] == 0x02) { + state_addr[1] = 0x30; + + for (i = 0; i < DATA_LEN_4; i++) { + /* 0x900000F8 */ + state_addr[i + 2] = pfw_op->addr_fw_state_addr[i]; + cmd_addr[i] = pfw_op->addr_fw_state_addr[i]; + } + + req_size = 0x30; + g_core_fp.fp_register_read(cmd_addr, req_size, tmp_addr, false); + } + + return NO_ERR; +} + +static void hx83102ab_power_on_init(void) +{ + uint8_t tmp_data[DATA_LEN_4]; + + KI("%s:\n", __func__); + himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, tmp_data, 4); + g_core_fp.fp_register_write(pfw_op->addr_raw_out_sel, DATA_LEN_4, tmp_data, 0); + g_core_fp.fp_register_write(pfw_op->addr_sorting_mode_en, DATA_LEN_4, tmp_data, 0); + g_core_fp.fp_touch_information(); + g_core_fp.fp_sense_on(0x00); +} + +static int hx83102ab_fts_ctpm_fw_upgrade_with_sys_fs_64k(unsigned char *fw, int len, bool change_iref) +{ + int burnFW_success = 0; + uint8_t tmp_data[DATA_LEN_4]; + + if (len != FW_SIZE_64k) { + E("%s: The file size is not 64K bytes\n", __func__); + return false; + } + +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + g_core_fp.fp_system_reset(); +#endif + g_core_fp.fp_sense_off(true); + g_core_fp.fp_chip_erase(); + g_core_fp.fp_flash_programming(fw, FW_SIZE_64k); + + if (g_core_fp.fp_check_CRC(pfw_op->addr_program_reload_from, FW_SIZE_64k) == 0) + burnFW_success = 1; + + himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, tmp_data, 4); + g_core_fp.fp_register_write(pfw_op->addr_raw_out_sel, DATA_LEN_4, tmp_data, 0); + g_core_fp.fp_register_write(pfw_op->addr_sorting_mode_en, DATA_LEN_4, tmp_data, 0); +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + /*System reset*/ + g_core_fp.fp_system_reset(); +#endif + return burnFW_success; +} + +#ifdef HX_ESD_RECOVERY +static void hx83102ab_esd_ic_reset(void) +{ + HX_ESD_RESET_ACTIVATE = 1; +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_pin_reset(); +#else + g_core_fp.fp_system_reset(); +#endif + KI("%s:\n", __func__); +} +#if defined(HX_ZERO_FLASH) +static int hx83102d_0f_esd_check(void) +{ + uint8_t tmp_data[DATA_LEN_4]; + int ret = NO_ERR; + + KI("Enter %s\n", __func__); + + g_core_fp.fp_register_read(pzf_op->addr_sts_chk, DATA_LEN_4, tmp_data, 0); + + if (tmp_data[0] != pzf_op->data_activ_sts[0]) { + ret = ERR_STS_WRONG; + KI("%s:status : %8X = %2X\n", __func__, zf_addr_sts_chk, tmp_data[0]); + } + + g_core_fp.fp_register_read(pzf_op->addr_activ_relod, DATA_LEN_4, tmp_data, 0); + + if (tmp_data[0] != pzf_op->data_activ_in[0]) { + ret = ERR_STS_WRONG; + KI("%s:status : %8X = %2X\n", __func__, zf_addr_activ_relod, tmp_data[0]); + } + + return ret; +} +#endif +#endif + +static bool hx83102d_sense_off(bool check_en) +{ + uint8_t cnt = 0; + uint8_t tmp_addr[DATA_LEN_4]; + uint8_t tmp_data[DATA_LEN_4]; + + do { + if (cnt == 0 || (tmp_data[0] != 0xA5 && tmp_data[0] != 0x00 && tmp_data[0] != 0x87)) + g_core_fp.fp_register_write(pfw_op->addr_ctrl_fw_isr, DATA_LEN_4, pfw_op->data_fw_stop, 0); + /*msleep(20);*/ + usleep_range(10000, 10001); + + /* check fw status */ + g_core_fp.fp_register_read(pic_op->addr_cs_central_state, ADDR_LEN_4, tmp_data, 0); + + if (tmp_data[0] != 0x05) { + KI("%s: Do not need wait FW, Status = 0x%02X!\n", __func__, tmp_data[0]); + break; + } + + g_core_fp.fp_register_read(pfw_op->addr_ctrl_fw_isr, 4, tmp_data, false); + KI("%s: cnt = %d, data[0] = 0x%02X!\n", __func__, cnt, tmp_data[0]); + } while (tmp_data[0] != 0x87 && (++cnt < 10) && check_en == true); + + cnt = 0; + + do { + /*=========================================== + *I2C_password[7:0] set Enter safe mode : 0x31 ==> 0x27 + *=========================================== + */ + tmp_data[0] = 0x27; + if (himax_bus_write(0x31, tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return false; + } + + /*=========================================== + *I2C_password[15:8] set Enter safe mode :0x32 ==> 0x95 + *=========================================== + */ + tmp_data[0] = 0x95; + if (himax_bus_write(0x32, tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return false; + } + + /* ====================== + *Check enter_save_mode + *====================== + */ + tmp_addr[3] = 0x90; tmp_addr[2] = 0x00; tmp_addr[1] = 0x00; tmp_addr[0] = 0xA8; + hx83102_register_read(tmp_addr, ADDR_LEN_4, tmp_data); + KI("%s: Check enter_save_mode data[0]=%X, %X %X %X\n", __func__, tmp_data[0], tmp_data[1], tmp_data[2], tmp_data[3]); + + if (tmp_data[0] == 0x0C) { + /*===================================== + *Reset TCON + *===================================== + */ + tmp_addr[3] = 0x80; tmp_addr[2] = 0x02; tmp_addr[1] = 0x00; tmp_addr[0] = 0x20; + tmp_data[3] = 0x00; tmp_data[2] = 0x00; tmp_data[1] = 0x00; tmp_data[0] = 0x00; + hx83102_flash_write_burst(tmp_addr, tmp_data); + usleep_range(1000, 1001); + /*===================================== + *Reset ADC + *===================================== + */ + tmp_addr[3] = 0x80; + tmp_addr[2] = 0x02; + tmp_addr[1] = 0x00; + tmp_addr[0] = 0x94; + tmp_data[3] = 0x00; + tmp_data[2] = 0x00; + tmp_data[1] = 0x00; + tmp_data[0] = 0x00; + hx83102_flash_write_burst(tmp_addr, tmp_data); + usleep_range(1000, 1001); + tmp_data[3] = 0x00; + tmp_data[2] = 0x00; + tmp_data[1] = 0x00; + tmp_data[0] = 0x01; + hx83102_flash_write_burst(tmp_addr, tmp_data); + + return true; + } + /*msleep(10);*/ + usleep_range(5000, 5001); +#ifdef HX_RST_PIN_FUNC + himax_rst_gpio_set(private_ts->rst_gpio, 0); + msleep(20); + himax_rst_gpio_set(private_ts->rst_gpio, 1); + msleep(50); +#endif + + } while (cnt++ < 5); + + return false; +} + +static void hx83102e_sense_on(uint8_t FlashMode) +{ + uint8_t tmp_data[DATA_LEN_4] = {0}; + + I("Enter %s\n", __func__); + g_core_fp.fp_interface_on(); + g_core_fp.fp_register_write(pfw_op->addr_ctrl_fw_isr, + sizeof(pfw_op->data_clear), pfw_op->data_clear, 0); + /*msleep(20);*/ + usleep_range(10000, 11000); + if (!FlashMode) { +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + g_core_fp.fp_system_reset(); +#endif + } else { + if (himax_bus_write(pic_op->adr_i2c_psw_lb[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) + E("%s: i2c access fail!\n", __func__); + + if (himax_bus_write(pic_op->adr_i2c_psw_ub[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) + E("%s: i2c access fail!\n", __func__); + } +} + +static bool hx83102e_sense_off(bool check_en) +{ + uint8_t cnt = 0; + uint8_t tmp_addr[DATA_LEN_4]; + uint8_t tmp_data[DATA_LEN_4]; + + I("Enter %s\n", __func__); + + do { + if (cnt == 0 || (tmp_data[0] != 0xA5 && tmp_data[0] != 0x00 && tmp_data[0] != 0x87)) + g_core_fp.fp_register_write(pfw_op->addr_ctrl_fw_isr, DATA_LEN_4, pfw_op->data_fw_stop, 0); + /*msleep(20);*/ + usleep_range(10000, 10001); + + /* check fw status */ + g_core_fp.fp_register_read(pic_op->addr_cs_central_state, ADDR_LEN_4, tmp_data, 0); + + if (tmp_data[0] != 0x05) { + KI("%s: Do not need wait FW, Status = 0x%02X!\n", __func__, tmp_data[0]); + break; + } + + g_core_fp.fp_register_read(pfw_op->addr_ctrl_fw_isr, 4, tmp_data, false); + KI("%s: cnt = %d, data[0] = 0x%02X!\n", __func__, cnt, tmp_data[0]); + } while (tmp_data[0] != 0x87 && (++cnt < 10) && check_en == true); + + cnt = 0; + + do { + /*=========================================== + *I2C_password[7:0] set Enter safe mode : 0x31 ==> 0x27 + *=========================================== + */ + tmp_data[0] = 0x27; + if (himax_bus_write(0x31, tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return false; + } + + /*=========================================== + *I2C_password[15:8] set Enter safe mode :0x32 ==> 0x95 + *=========================================== + */ + tmp_data[0] = 0x95; + if (himax_bus_write(0x32, tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return false; + } + + /* ====================== + *Check enter_save_mode + *====================== + */ + tmp_addr[3] = 0x90; tmp_addr[2] = 0x00; tmp_addr[1] = 0x00; tmp_addr[0] = 0xA8; + hx83102_register_read(tmp_addr, ADDR_LEN_4, tmp_data); + KI("%s: Check enter_save_mode data[0]=%X, %X %X %X\n", __func__, tmp_data[0], tmp_data[1], tmp_data[2], tmp_data[3]); + + if (tmp_data[0] == 0x0C) { + /*===================================== + *Reset TCON + *===================================== + */ + tmp_addr[3] = 0x80; tmp_addr[2] = 0x02; tmp_addr[1] = 0x00; tmp_addr[0] = 0x20; + tmp_data[3] = 0x00; tmp_data[2] = 0x00; tmp_data[1] = 0x00; tmp_data[0] = 0x00; + hx83102_flash_write_burst(tmp_addr, tmp_data); + usleep_range(1000, 1001); + return true; + } + /*msleep(10);*/ + usleep_range(5000, 5001); +#ifdef HX_RST_PIN_FUNC + himax_rst_gpio_set(private_ts->rst_gpio, 0); + msleep(20); + himax_rst_gpio_set(private_ts->rst_gpio, 1); + msleep(50); +#endif + + } while (cnt++ < 5); + + return false; +} + +static bool hx83102d_dd_clk_set(bool enable) +{ + uint8_t data[4] = {0}; + + data[0] = (enable)?0xDD:0; + return (g_core_fp.fp_register_write(pic_op->adr_osc_en, + sizeof(pic_op->adr_osc_en), data, 0) == NO_ERR); +} + +static void hx83102d_dd_reg_en(bool enable) +{ + uint8_t data[4] = {0}; + + data[0] = 0xA5; data[1] = 0x00; + data[2] = 0x00; data[3] = 0x00; + g_core_fp.fp_register_write(pic_op->adr_osc_pw, DATA_LEN_4, data, 0); + + data[0] = 0xA5; data[1] = 0x83; + data[2] = 0x10; data[3] = 0x2D; + g_core_fp.fp_dd_reg_write(0xB9, 0, 4, data, 0); +} + +static bool hx83102d_ic_id_read(void) +{ + int i = 0; + uint8_t data[4] = {0}; + + g_core_fp.fp_dd_clk_set(true); + g_core_fp.fp_dd_reg_en(true); + + for (i = 0; i < 13; i++) { + data[0] = 0x2A + i; + g_core_fp.fp_dd_reg_write(0xBB, 3, 1, data, 0); + data[0] = 0x08; + g_core_fp.fp_dd_reg_write(0xBB, 1, 1, data, 0); + g_core_fp.fp_dd_reg_read(0xBB, 6, 1, data, 0); + ic_data->vendor_ic_id[i] = data[0]; + KI("ic_data->vendor_ic_id[%d] = %02X\n", i, ic_data->vendor_ic_id[i]); + } + + g_core_fp.fp_dd_clk_set(false); + + return true; +} + +#if defined(HX_ZERO_FLASH) +static void himax_hx83102d_reload_to_active(void) +{ + uint8_t addr[DATA_LEN_4] = {0}; + uint8_t data[DATA_LEN_4] = {0}; + uint8_t retry_cnt = 0; + + addr[3] = 0x90; + addr[2] = 0x00; + addr[1] = 0x00; + addr[0] = 0x48; + + do { + data[3] = 0x00; + data[2] = 0x00; + data[1] = 0x00; + data[0] = 0xEC; + g_core_fp.fp_register_write(addr, DATA_LEN_4, data, 0); + usleep_range(1000, 1100); + g_core_fp.fp_register_read(addr, DATA_LEN_4, data, 0); + KI("%s: data[1]=%d, data[0]=%d, retry_cnt=%d\n", __func__, data[1], data[0], retry_cnt); + retry_cnt++; + } while ((data[1] != 0x01 || data[0] != 0xEC) && retry_cnt < HIMAX_REG_RETRY_TIMES); +} + +static void himax_hx83102d_resume_ic_action(void) +{ +#ifndef HX_RESUME_HW_RESET + himax_hx83102d_reload_to_active(); +#endif +} + +static void himax_hx83102d_suspend_ic_action(void) +{ +#ifndef HX_RESUME_HW_RESET + himax_hx83102d_reload_to_active(); +#endif +} + +static void himax_hx83102d_sense_on(uint8_t FlashMode) +{ + uint8_t tmp_data[DATA_LEN_4]; + int retry = 0; + + KI("Enter %s\n", __func__); + + g_core_fp.fp_interface_on(); + g_core_fp.fp_register_write(pfw_op->addr_ctrl_fw_isr, + sizeof(pfw_op->data_clear), pfw_op->data_clear, 0); + /*msleep(20);*/ + usleep_range(10000, 10001); + if (!FlashMode) { +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + g_core_fp.fp_system_reset(); +#endif + himax_hx83102d_reload_to_active(); + } else { + himax_hx83102d_reload_to_active(); + do { + g_core_fp.fp_register_write(pfw_op->addr_safe_mode_release_pw, + sizeof(pfw_op->data_safe_mode_release_pw_active), pfw_op->data_safe_mode_release_pw_active, 0); + + g_core_fp.fp_register_read(pfw_op->addr_flag_reset_event, DATA_LEN_4, tmp_data, 0); + KI("%s:Read status from IC = %X,%X\n", __func__, tmp_data[0], tmp_data[1]); + } while ((tmp_data[1] != 0x01 || tmp_data[0] != 0x00) && retry++ < 5); + + if (retry >= 5) { + E("%s: Fail:\n", __func__); +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + g_core_fp.fp_system_reset(); +#endif + himax_hx83102d_reload_to_active(); + } else { + KI("%s:OK and Read status from IC = %X,%X\n", __func__, tmp_data[0], tmp_data[1]); + /* reset code*/ + tmp_data[0] = 0x00; + + if (himax_bus_write(pic_op->adr_i2c_psw_lb[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) + E("%s: i2c access fail!\n", __func__); + + if (himax_bus_write(pic_op->adr_i2c_psw_ub[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) + E("%s: i2c access fail!\n", __func__); + + g_core_fp.fp_register_write(pfw_op->addr_safe_mode_release_pw, + sizeof(pfw_op->data_safe_mode_release_pw_reset), pfw_op->data_safe_mode_release_pw_reset, 0); + } + } +} + +static void hx83102ab_firmware_update_0f(const struct firmware *fw_entry) +{ + uint8_t tmp_addr[4]; + + KI("%s, Entering\n", __func__); + + g_core_fp.fp_register_write(pzf_op->addr_system_reset, 4, pzf_op->data_system_reset, 0); + + g_core_fp.fp_sense_off(false); + + /* first 32K */ + /*bin file start*/ + /*isram*/ + g_core_fp.fp_write_sram_0f(fw_entry, pzf_op->data_sram_start_addr, 0, HX_32K_SZ); + + tmp_addr[3] = 0x10; + tmp_addr[2] = 0x00; + tmp_addr[1] = 0x73; + tmp_addr[0] = 0x00; + g_core_fp.fp_write_sram_0f(fw_entry, tmp_addr, 0x8000, (0x200*4)); + + tmp_addr[3] = 0x10; + tmp_addr[2] = 0x00; + tmp_addr[1] = 0x68; + tmp_addr[0] = 0x00; + g_core_fp.fp_write_sram_0f(fw_entry, tmp_addr, 0x8800, (0x200*4)); + + /*last 16k*/ + /*config info*/ + tmp_addr[3] = 0x10; + tmp_addr[2] = 0x00; + tmp_addr[1] = 0x72; + tmp_addr[0] = 0x04; /*0x10007206 <= size 60,from 0x0000C180*/ + g_core_fp.fp_write_sram_0f(fw_entry, tmp_addr, 0xC178, (84)); + + /*FW config*/ + if (G_POWERONOF == 1) + g_core_fp.fp_write_sram_0f(fw_entry, pzf_op->data_fw_cfg_1, 0xBFFE, 388); + else + g_core_fp.fp_clean_sram_0f(pzf_op->data_fw_cfg_1, 388, 1); + /*ADC config*/ + if (G_POWERONOF == 1) + g_core_fp.fp_write_sram_0f(fw_entry, pzf_op->data_adc_cfg_1, 0xe000, (128 * 4)); + else + g_core_fp.fp_clean_sram_0f(pzf_op->data_adc_cfg_1, (128 * 4), 2); + + KI("%s, END\n", __func__); +} +#if defined(HX_0F_DEBUG) +static void hx83102ab_firmware_read_0f(const struct firmware *fw_entry, int type) +{ + uint8_t tmp_addr[4]; + + KI("%s, Entering\n", __func__); + if (type == 0) { /* first 32K */ + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_sram_start_addr, 0, HX_32K_SZ); + tmp_addr[3] = 0x10; + tmp_addr[2] = 0x00; + tmp_addr[1] = 0x68; + tmp_addr[0] = 0x00; + g_core_fp.fp_read_sram_0f(fw_entry, tmp_addr, 0x8000, (0x200*4)); + + tmp_addr[3] = 0x10; + tmp_addr[2] = 0x00; + tmp_addr[1] = 0x73; + tmp_addr[0] = 0x00; + g_core_fp.fp_read_sram_0f(fw_entry, tmp_addr, 0x8800, (0x200*4)); + + } else { /*last 16k*/ + tmp_addr[3] = 0x10; + tmp_addr[2] = 0x00; + tmp_addr[1] = 0x72; + tmp_addr[0] = 0x04; /*0x10007206 <= size 80,from 0x0000C180*/ + g_core_fp.fp_read_sram_0f(fw_entry, tmp_addr, 0xC178, (84)); + + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_fw_cfg_1, 0xBFFE, 388); + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_adc_cfg_1, 0xE000, (128*4)); + + } + KI("%s, END\n", __func__); +} +static void hx83102d_firmware_read_0f(const struct firmware *fw_entry, int type) +{ + uint8_t tmp_data[4]; + + KI("%s, Entering\n", __func__); + + switch (type) { + case 0: + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_sram_start_addr, 0, HX_40K_SZ); + break; + case 1: + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_cfg_info, 0xC000, 132); + break; + case 2: + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_fw_cfg_1, 0xC0FE, 484); + break; + case 3: + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_adc_cfg_1, 0xD000, 768); + break; + case 4: + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_adc_cfg_2, 0xD300, 1536); + break; + case 5: + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_adc_cfg_3, 0xE000, 1536); + break; + case 6: + himax_in_parse_assign_cmd(hx83102d_zf_data_bor_prevent_info, tmp_data, 4); + g_core_fp.fp_read_sram_0f(fw_entry, tmp_data, 0xC9E0, 32); + break; + case 7: + himax_in_parse_assign_cmd(hx83102d_zf_data_notch_info, tmp_data, 4); + g_core_fp.fp_read_sram_0f(fw_entry, tmp_data, 0xCA00, 128); + break; + case 8: + himax_in_parse_assign_cmd(hx83102d_zf_func_info_en, tmp_data, 4); + g_core_fp.fp_read_sram_0f(fw_entry, tmp_data, 0xCB00, 12); + break; + case 9: + himax_in_parse_assign_cmd(hx83102d_zf_po_sub_func, tmp_data, 4); + g_core_fp.fp_read_sram_0f(fw_entry, tmp_data, 0xA000, HX4K); + break; + default: + break; + } + KI("%s, END\n", __func__); +} +#endif +#if defined(HX_CODE_OVERLAY) +static int hx83102d_0f_overlay(int ovl_type, int mode) +{ + int ret = 0; + uint8_t count = 0; + uint8_t count2 = 0; + const struct firmware *fwp = NULL; + char fwname[32] = "Himax_firmware.bin"; + uint8_t i, j; + uint8_t part_num = 0; + uint8_t buf[16]; + struct zf_info zf_info_arr[3]; + uint8_t sram_addr[4] = {0xE0, 0x8C, 0x00, 0x20}; + uint8_t handshaking_addr[4] = {0xFC, 0x7F, 0x00, 0x10}; + /*uint8_t mpap_addr[4] = {0xEC, 0x73, 0x00, 0x10};*/ + uint8_t request; + uint8_t reply; + uint32_t offset = 0; + uint32_t size = 0; + uint8_t send_data[4] = {0}; + uint8_t recv_data[4] = {0}; + + ret = request_firmware(&fwp, fwname, private_ts->dev); + if (ret < 0) { + E("%s: request firmware FAIL!!!\n", __func__); + return ret; + } + + /*1. get number of partition*/ + part_num = fwp->data[HX64K + 12]; + if (part_num <= 1) { + E("%s, size of cfg part failed! part_num = %d\n", __func__, part_num); + return LENGTH_FAIL; + } + + j = 0; + for (i = 1; i < part_num; i++) { + /* find overlay section */ + memcpy(buf, &fwp->data[i * 0x10 + HX64K], 16); + + if (j < 3 && buf[3] == sram_addr[3] && buf[2] == sram_addr[2] && buf[1] == sram_addr[1] && buf[0] == sram_addr[0]) { + + zf_info_arr[j].write_size = buf[7] << 24 | buf[6] << 16 | buf[5] << 8 | buf[4]; + zf_info_arr[j].fw_addr = buf[11] << 24 | buf[10] << 16 | buf[9] << 8 | buf[8]; + /*KI("j = %d; write_size = %d; fw_addr = %d\n", j, zf_info_arr[j].write_size, zf_info_arr[j].fw_addr);*/ + j++; + } + } + +/* + * if (ovl_type == 1) { + * if (mode == 0) { + * //border overlay when finish self_test + * send_data[3] = 0x00; + * send_data[2] = 0x00; + * send_data[1] = 0x00; + * send_data[0] = 0x00; + * offset = zf_info_arr[2].fw_addr; + * size = zf_info_arr[2].write_size; + * KI("%s: self test overlay section 2\n", __func__); + * } else if (mode == 1) { + * //sorting overlay when call self_test + * send_data[3] = 0x00; + * send_data[2] = 0x10; + * send_data[1] = 0x73; + * send_data[0] = 0x80; + * offset = zf_info_arr[0].fw_addr; + * size = zf_info_arr[0].write_size; + * KI("%s: self test overlay section 0\n", __func__); + * } + * } + */ + if (ovl_type == 2) { + /*gesture overlay when suspend*/ + request = ovl_gesture_request; + reply = ovl_gesture_reply; + offset = zf_info_arr[1].fw_addr; + size = zf_info_arr[1].write_size; + KI("%s: overlay section 1\n", __func__); + } else if (ovl_type == 3) { + /*border overlay when resume*/ + request = ovl_border_request; + reply = ovl_border_reply; + offset = zf_info_arr[2].fw_addr; + size = zf_info_arr[2].write_size; + KI("%s: overlay section 2\n", __func__); + } else { + return HX_INIT_FAIL; + } + +/* + * if (ovl_type == 1) { + * + * g_core_fp.fp_sense_off(false); + * + * //g_core_fp.fp_register_write(mpap_addr, DATA_LEN_4, send_data, 0); + * count = 0; + * do { + * g_core_fp.fp_register_write(mpap_addr, DATA_LEN_4, send_data, 0); + * g_core_fp.fp_register_read(mpap_addr, DATA_LEN_4, recv_data, 0); + * } while ((recv_data[0] != send_data[0] || recv_data[1] != send_data[1] || recv_data[2] != send_data[2] || recv_data[3] != send_data[3]) && count++ < 10); + * + * KI("%s: set mpap pw %d times\n", __func__, count); + * + * //g_core_fp.fp_write_sram_0f(fwp, sram_addr, offset, size); + * if (g_core_fp.fp_write_sram_0f_crc(fwp, sram_addr, offset, size) != 0) + * E("%s, Overlay HW CRC FAIL\n", __func__); + * + * g_core_fp.fp_reload_disable(0); + * + * g_core_fp.fp_sense_on(0x00); + * + * } else { + */ + + count = 0; + do { + g_core_fp.fp_register_read(handshaking_addr, DATA_LEN_4, recv_data, 0); + } while (recv_data[0] != request && count++ < 10); + + if (count < 10) { + /*g_core_fp.fp_write_sram_0f(fwp, sram_addr, offset, size);*/ + if (g_core_fp.fp_write_sram_0f_crc(fwp, sram_addr, offset, size) != 0) + E("%s, Overlay HW CRC FAIL\n", __func__); + + send_data[3] = 0x00; + send_data[2] = 0x00; + send_data[1] = 0x00; + send_data[0] = reply; + + count2 = 0; + do { + g_core_fp.fp_register_write(handshaking_addr, DATA_LEN_4, send_data, 0); + usleep_range(1000, 1100); + g_core_fp.fp_register_read(handshaking_addr, DATA_LEN_4, recv_data, 0); + } while (recv_data[0] != reply && count2++ < 10); + + if (ovl_type == 3) { +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + g_core_fp.fp_system_reset(); +#endif + } + } + + KI("%s: overlay request %d times; reply %d times\n", __func__, count, count2); + + release_firmware(fwp); + + /* rescue mechanism */ + if (count >= 10) { + + g_core_fp.fp_0f_op_file_dirly(fwname); + + g_core_fp.fp_reload_disable(0); + + g_core_fp.fp_sense_on(0x00); + + himax_int_enable(1); + } + + return 0; +} +#endif +#endif + +#if defined(HX_AUTO_UPDATE_FW) || defined(HX_ZERO_FLASH) +#if defined(HX_EN_DYNAMIC_NAME) +static void hx83102a_read_ic_ver(void) +{ + uint8_t tmp_data[DATA_LEN_4]; + uint8_t tmp_addr[DATA_LEN_4]; + + ic_data->vendor_ic_ver = 0xFFFF; + /* Enable read DD */ + tmp_data[0] = 0x00; + tmp_data[1] = 0x83; + tmp_data[2] = 0x10; + tmp_data[3] = 0x2A; + himax_in_parse_assign_cmd(hx83102_ic_b9_en, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, tmp_data, false); + + /* Read DD data */ + himax_in_parse_assign_cmd(hx83102_ic_fw, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, tmp_data, 0); + KI("E8=%X\n", tmp_data[0]); + ic_data->vendor_ic_ver = tmp_data[0]; + + KI("VENDOR_IC_VER : %X\n", (ic_data->vendor_ic_ver)); +} + +static void hx83102b_read_ic_ver(void) +{ + uint8_t tmp_data[DATA_LEN_4]; + uint8_t tmp_addr[DATA_LEN_4]; + + ic_data->vendor_ic_ver = 0xFFFF; + /* Enable read DD */ + himax_in_parse_assign_cmd(hx83102b_ic_osc_en, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, tmp_data, 0); + tmp_data[0] = 0x01; + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, tmp_data, false); + + tmp_data[0] = 0x00; + tmp_data[1] = 0x83; + tmp_data[2] = 0x10; + tmp_data[3] = 0x2B; + himax_in_parse_assign_cmd(hx83102_ic_b9_en, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, tmp_data, false); + + /* Read DD data */ + himax_in_parse_assign_cmd(hx83102_ic_fw, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, tmp_data, 0); + KI("E8=%X\n", tmp_data[0]); + ic_data->vendor_ic_ver = tmp_data[0]; + + /* Disable read DD */ + himax_in_parse_assign_cmd(hx83102b_ic_osc_en, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, tmp_data, 0); + tmp_data[0] = 0x00; + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, tmp_data, false); + + KI("VENDOR_IC_VER : %X\n", (ic_data->vendor_ic_ver)); +} + +static void hx83102d_read_ic_ver(void) +{ + uint8_t tmp_data[DATA_LEN_4]; + uint8_t tmp_addr[DATA_LEN_4]; + + ic_data->vendor_ic_ver = 0xFFFF; + /* Enable read DD */ + himax_in_parse_assign_cmd(hx83102d_ic_osc_pw, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, tmp_data, 0); + tmp_data[0] = 0xA5; + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, tmp_data, false); + + himax_in_parse_assign_cmd(hx83102d_ic_osc_en, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, tmp_data, 0); + tmp_data[0] = 0xDD; + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, tmp_data, false); + + tmp_data[0] = 0x00; + tmp_data[1] = 0x83; + tmp_data[2] = 0x10; + tmp_data[3] = 0x2D; + himax_in_parse_assign_cmd(hx83102_ic_b9_en, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, tmp_data, false); + + /* Read DD data */ + himax_in_parse_assign_cmd(hx83102_ic_fw, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, tmp_data, 0); + KI("E8=%X\n", tmp_data[0]); + ic_data->vendor_ic_ver = tmp_data[0]; + + /* Disable read DD */ + himax_in_parse_assign_cmd(hx83102d_ic_osc_en, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, tmp_data, 0); + tmp_data[0] = 0x00; + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, tmp_data, false); + + KI("VENDOR_IC_VER : %X\n", (ic_data->vendor_ic_ver)); +} + +static void hx83102_dynamic_fw_name(uint8_t ic_name) +{ + char firmware_name[64]; + + if (ic_name == 0x2a) + hx83102a_read_ic_ver(); + else if (ic_name == 0x2b) + hx83102b_read_ic_ver(); + else + hx83102d_read_ic_ver(); + + if (i_CTPM_firmware_name != NULL) { + kfree(i_CTPM_firmware_name); + i_CTPM_firmware_name = NULL; + } + memset(firmware_name, 0x00, sizeof(firmware_name)); + + if ((ic_data->vendor_ic_ver == 0x00) || (ic_data->vendor_ic_ver == 0x21)) { /* Cut 1 */ + memcpy(firmware_name, "Himax_firmware_1.bin", sizeof(char)*strlen("Himax_firmware_1.bin")); + } else if ((ic_data->vendor_ic_ver == 0x01) || (ic_data->vendor_ic_ver == 0x11)) { /* Cut 2 */ + memcpy(firmware_name, "Himax_firmware_2.bin", sizeof(char)*strlen("Himax_firmware_2.bin")); + } else { /* Original */ + memcpy(firmware_name, "Himax_firmware.bin", sizeof(char)*strlen("Himax_firmware.bin")); + } + + i_CTPM_firmware_name = kzalloc((sizeof(char)*(strlen(firmware_name)+1)), GFP_KERNEL); + if (i_CTPM_firmware_name != NULL) + memcpy(i_CTPM_firmware_name, firmware_name, (sizeof(char)*(strlen(firmware_name)+1))); + KI("i_CTPM_firmware_name : %s\n", i_CTPM_firmware_name); +} +#endif +#endif + +static bool hx83102e_read_event_stack(uint8_t *buf, uint8_t length) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) + struct timespec64 t_start, t_end, t_delta; +#else + struct timespec t_start, t_end, t_delta; +#endif + int len = length; + int i2c_speed = 0; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) + if (private_ts->debug_log_level & BIT(2)) + ktime_get_real_ts64(&t_start); +#else + if (private_ts->debug_log_level & BIT(2)) + getnstimeofday(&t_start); +#endif + himax_bus_read(pfw_op->addr_event_addr[0], buf, length, HIMAX_I2C_RETRY_TIMES); + + if (private_ts->debug_log_level & BIT(2)) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) + ktime_get_real_ts64(&t_end); +#else + getnstimeofday(&t_end); +#endif + t_delta.tv_nsec = (t_end.tv_sec * 1000000000 + t_end.tv_nsec) - (t_start.tv_sec * 1000000000 + t_start.tv_nsec); /*ns*/ + i2c_speed = (len * 9 * 1000000 / (int)t_delta.tv_nsec) * 13 / 10; + private_ts->bus_speed = (int)i2c_speed; + } + return 1; +} + +static void himax_hx83102ab_reg_re_init(uint8_t ic_name) +{ + KI("%s:Entering!\n", __func__); + himax_in_parse_assign_cmd(hx83102ab_fw_addr_sorting_mode_en, pfw_op->addr_sorting_mode_en, sizeof(pfw_op->addr_sorting_mode_en)); + himax_in_parse_assign_cmd(hx83102ab_fw_addr_selftest_addr_en, pfw_op->addr_selftest_addr_en, sizeof(pfw_op->addr_selftest_addr_en)); +#ifdef HX_ZERO_FLASH + himax_in_parse_assign_cmd(hx83102ab_data_adc_cfg_1, pzf_op->data_adc_cfg_1, sizeof(pzf_op->data_adc_cfg_1)); +#endif + + if (ic_name == 0x2a) { + himax_in_parse_assign_cmd(hx83102a_data_df_rx, pdriver_op->data_df_rx, sizeof(pdriver_op->data_df_rx)); + himax_in_parse_assign_cmd(hx83102a_data_df_tx, pdriver_op->data_df_tx, sizeof(pdriver_op->data_df_tx)); + } +} + +static void himax_hx83102ab_func_re_init(void) +{ + KI("%s:Entering!\n", __func__); + g_core_fp.fp_chip_init = hx83102_chip_init; + g_core_fp.fp_sense_off = hx83102ab_sense_off; + g_core_fp.fp_set_SMWP_enable = hx83102ab_set_SMWP_enable; + g_core_fp.fp_set_HSEN_enable = hx83102ab_set_HSEN_enable; + g_core_fp.fp_usb_detect_set = hx83102ab_usb_detect_set; + g_core_fp.fp_read_DD_status = hx83102ab_read_DD_status; + g_core_fp.fp_read_FW_status = hx83102ab_read_FW_status; + g_core_fp.fp_power_on_init = hx83102ab_power_on_init; + g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_64k = hx83102ab_fts_ctpm_fw_upgrade_with_sys_fs_64k; +#ifdef HX_ESD_RECOVERY + g_core_fp.fp_esd_ic_reset = hx83102ab_esd_ic_reset; +#endif +#if defined(HX_ZERO_FLASH) + g_core_fp.fp_firmware_update_0f = hx83102ab_firmware_update_0f; +#if defined(HX_0F_DEBUG) + g_core_fp.fp_firmware_read_0f = hx83102ab_firmware_read_0f; +#endif +#endif + +} + +static void himax_hx83102d_reg_re_init(void) +{ + KI("%s:Entering!\n", __func__); + himax_in_parse_assign_cmd(hx83102d_fw_addr_raw_out_sel, pfw_op->addr_raw_out_sel, sizeof(pfw_op->addr_raw_out_sel)); +#if defined(HX_ZERO_FLASH) + himax_in_parse_assign_cmd(hx83102d_zf_data_sram_start_addr, pzf_op->data_sram_start_addr, sizeof(pzf_op->data_sram_start_addr)); + himax_in_parse_assign_cmd(hx83102d_zf_data_adc_cfg_1, pzf_op->data_adc_cfg_1, sizeof(pzf_op->data_adc_cfg_1)); + himax_in_parse_assign_cmd(hx83102d_zf_data_adc_cfg_2, pzf_op->data_adc_cfg_2, sizeof(pzf_op->data_adc_cfg_2)); + himax_in_parse_assign_cmd(hx83102d_zf_data_adc_cfg_3, pzf_op->data_adc_cfg_3, sizeof(pzf_op->data_adc_cfg_3)); +#endif + himax_in_parse_assign_cmd(hx83102d_adr_osc_en, pic_op->adr_osc_en, sizeof(pic_op->adr_osc_en)); + himax_in_parse_assign_cmd(hx83102d_adr_osc_pw, pic_op->adr_osc_pw, sizeof(pic_op->adr_osc_pw)); +} + +static void himax_hx83102d_func_re_init(void) +{ + KI("%s:Entering!\n", __func__); + g_core_fp.fp_chip_init = hx83102_chip_init; + g_core_fp.fp_sense_off = hx83102d_sense_off; + g_core_fp.fp_ic_id_read = hx83102d_ic_id_read; + g_core_fp.fp_dd_clk_set = hx83102d_dd_clk_set; + g_core_fp.fp_dd_reg_en = hx83102d_dd_reg_en; +#if defined(HX_ZERO_FLASH) + /*g_core_fp.fp_firmware_update_0f = hx83102d_firmware_update_0f;*/ + g_core_fp.fp_resume_ic_action = himax_hx83102d_resume_ic_action; + g_core_fp.fp_suspend_ic_action = himax_hx83102d_suspend_ic_action; + g_core_fp.fp_sense_on = himax_hx83102d_sense_on; + g_core_fp.fp_0f_reload_to_active = himax_hx83102d_reload_to_active; +#if defined(HX_0F_DEBUG) + g_core_fp.fp_firmware_read_0f = hx83102d_firmware_read_0f; +#endif +#if defined(HX_CODE_OVERLAY) + g_core_fp.fp_0f_overlay = hx83102d_0f_overlay; +#endif +#ifdef HX_ESD_RECOVERY + g_core_fp.fp_0f_esd_check = hx83102d_0f_esd_check; +#endif +#endif +} + +static void himax_hx83102e_reg_re_init(void) +{ + KI("%s:Entering!\n", __func__); + himax_in_parse_assign_cmd(hx83102e_fw_addr_raw_out_sel, pfw_op->addr_raw_out_sel, sizeof(pfw_op->addr_raw_out_sel)); + himax_in_parse_assign_cmd(hx83102e_data_df_rx, pdriver_op->data_df_rx, sizeof(pdriver_op->data_df_rx)); + himax_in_parse_assign_cmd(hx83102e_data_df_tx, pdriver_op->data_df_tx, sizeof(pdriver_op->data_df_tx)); + himax_in_parse_assign_cmd(hx83102e_ic_adr_tcon_rst, pic_op->addr_tcon_on_rst, sizeof(pic_op->addr_tcon_on_rst)); +} + +static void himax_hx83102e_func_re_init(void) +{ + KI("%s:Entering!\n", __func__); + + g_core_fp.fp_chip_init = hx83102e_chip_init; + g_core_fp.fp_sense_on = hx83102e_sense_on; + g_core_fp.fp_sense_off = hx83102e_sense_off; + g_core_fp.fp_read_event_stack = hx83102e_read_event_stack; +} + + +static bool hx83102_chip_detect(void) +{ + uint8_t tmp_data[DATA_LEN_4]; + uint8_t tmp_addr[DATA_LEN_4]; + bool ret_data = false; + int ret = 0; + int i = 0; + +#ifdef HX_RST_PIN_FUNC + hx83102_pin_reset(); +#endif + + if (himax_bus_read(0x13, tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return false; + } + +#if defined(HX_ZERO_FLASH) + if (hx83102_sense_off(false) == false) { +#else + if (hx83102_sense_off(true) == false) { +#endif + ret_data = false; + E("%s:hx83102_sense_off Fail:\n", __func__); +// return ret_data; + } + + for (i = 0; i < 5; i++) { + tmp_addr[3] = 0x90; + tmp_addr[2] = 0x00; + tmp_addr[1] = 0x00; + tmp_addr[0] = 0xD0; + if (hx83102_register_read(tmp_addr, DATA_LEN_4, tmp_data) != 0) { + ret_data = false; + E("%s:hx83102_register_read Fail:\n", __func__); +// return ret_data;// <-- 1 + } + KI("%s:Read driver IC ID = %X,%X,%X\n", __func__, tmp_data[3], tmp_data[2], tmp_data[1]); /*83,10,2X*/ +// tmp_data[3] = 0x83; +// tmp_data[2] = 0x10; +// tmp_data[1] = 0x2e; +// KI("%s: ++Read driver IC ID = %X,%X,%X\n", __func__, tmp_data[3], tmp_data[2], tmp_data[1]); /*83,10,2X*/ + + if ((tmp_data[3] == 0x83) && (tmp_data[2] == 0x10) && ((tmp_data[1] == 0x2a) || (tmp_data[1] == 0x2b) || (tmp_data[1] == 0x2d) || (tmp_data[1] == 0x2e))) { + if (tmp_data[1] == 0x2a) { + strlcpy(private_ts->chip_name, HX_83102A_SERIES_PWON, 30); + KI("%s:detect IC HX83102A successfully\n", __func__); + } else if (tmp_data[1] == 0x2b) { + strlcpy(private_ts->chip_name, HX_83102B_SERIES_PWON, 30); + KI("%s:detect IC HX83102B successfully\n", __func__); + } else if (tmp_data[1] == 0x2d) { + strlcpy(private_ts->chip_name, HX_83102D_SERIES_PWON, 30); + KI("%s:detect IC HX83102D successfully\n", __func__); + } else {// <-- 2 + strlcpy(private_ts->chip_name, HX_83102E_SERIES_PWON, 30); + KI("%s:detect IC HX83102E successfully\n", __func__); + } + + ret = himax_mcu_in_cmd_struct_init(); + if (ret < 0) { + ret_data = false; + E("%s:cmd_struct_init Fail:\n", __func__); + return ret_data; + } + + himax_mcu_in_cmd_init(); + if ((tmp_data[1] == 0x2a) || (tmp_data[1] == 0x2b)) { + himax_hx83102ab_reg_re_init(tmp_data[1]); + himax_hx83102ab_func_re_init(); + } else if (tmp_data[1] == 0x2d) { + himax_hx83102d_reg_re_init(); + himax_hx83102d_func_re_init(); + } else {/* 0x2e */ + himax_hx83102e_reg_re_init(); + himax_hx83102e_func_re_init(); + } + ret_data = true; + break; + } + + ret_data = false; + E("%s:Read driver ID register Fail:\n", __func__); + E("Could NOT find Himax Chipset\n"); + E("Please check 1.VCCD,VCCA,VSP,VSN\n"); + E("2. LCM_RST,TP_RST\n"); + E("3. Power On Sequence\n"); + + } + +#if defined(HX_AUTO_UPDATE_FW) || defined(HX_ZERO_FLASH) +#if defined(HX_EN_DYNAMIC_NAME) + hx83102_dynamic_fw_name(tmp_data[1]); +#endif +#endif + + return ret_data; +} + +bool _hx83102_init(void) +{ + bool ret = false; + + I("%s\n", __func__); + ret = hx83102_chip_detect(); + return ret; +} + diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_ic_HX83102.h b/drivers/input/touchscreen/himax/hx831xx/himax_ic_HX83102.h new file mode 100755 index 000000000000..06ab455d724d --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_ic_HX83102.h @@ -0,0 +1,65 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for HX83102 chipset + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_I2C) +#include "himax_platform.h" +#endif + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_SPI) +#include "himax_platform_SPI.h" +#endif + +#include "himax_common.h" +#include "himax_ic_core.h" +#include + +#define hx83102ab_fw_addr_sorting_mode_en 0x100007FC +#define hx83102ab_fw_addr_selftest_addr_en 0x100007F8 +#define hx83102ab_data_adc_cfg_1 0x10007B00 +#define hx83102a_data_df_rx 48 +#define hx83102a_data_df_tx 24 + +#define hx83102d_fw_addr_raw_out_sel 0x800204f4 +#define hx83102d_zf_data_adc_cfg_1 0x10007B00 +#define hx83102d_zf_data_adc_cfg_2 0x10006A00 +#define hx83102d_zf_data_adc_cfg_3 0x10007500 +#define hx83102d_zf_data_bor_prevent_info 0x10007268 +#define hx83102d_zf_data_notch_info 0x10007300 +#define hx83102d_zf_func_info_en 0x10007FD0 +#define hx83102d_zf_po_sub_func 0x10005A00 +#define hx83102d_zf_data_sram_start_addr 0x20000000 +#define hx83102d_adr_osc_en 0x9000009C +#define hx83102d_adr_osc_pw 0x90000280 + +#define hx83102e_fw_addr_raw_out_sel 0x100072EC +#define hx83102e_ic_adr_tcon_rst 0x80020004 +#define hx83102e_data_df_rx 48 +#define hx83102e_data_df_tx 30 + +#if defined(HX_AUTO_UPDATE_FW) || defined(HX_ZERO_FLASH) +#ifdef HX_EN_DYNAMIC_NAME +#define hx83102_ic_b9_en 0x300B9000 +#define hx83102_ic_fw 0x300E8006 + +#define hx83102b_ic_osc_en 0x900880A0 +#define hx83102d_ic_osc_en 0x9000009C +#define hx83102d_ic_osc_pw 0x90000280 +#endif +#endif + +#ifdef HX_ESD_RECOVERY + extern u8 HX_ESD_RESET_ACTIVATE; +#endif + diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_ic_core.h b/drivers/input/touchscreen/himax/hx831xx/himax_ic_core.h new file mode 100755 index 000000000000..491e61f0c94d --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_ic_core.h @@ -0,0 +1,972 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for ic core functions + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __HIMAX_IC_CORE_H__ +#define __HIMAX_IC_CORE_H__ + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_I2C) +#include "himax_platform.h" +#endif + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_SPI) +#include "himax_platform_SPI.h" +#endif + +#include "himax_common.h" +#include + +#define DATA_LEN_8 8 +#define DATA_LEN_4 4 +#define ADDR_LEN_4 4 +#define FLASH_RW_MAX_LEN 256 +#define FLASH_WRITE_BURST_SZ 8 +#define PROGRAM_SZ 48 +#define MAX_I2C_TRANS_SZ 128 +#define HIMAX_REG_RETRY_TIMES 5 +#define FW_BIN_16K_SZ 0x4000 +#define HIMAX_TOUCH_DATA_SIZE 128 +#define MASK_BIT_0 0x01 +#define MASK_BIT_1 0x02 +#define MASK_BIT_2 0x04 + +#define FW_SECTOR_PER_BLOCK 8 +#define FW_PAGE_PER_SECTOR 64 +#define FW_PAGE_SEZE 128 +#define HX256B 0x100 +#define HX4K 0x1000 +#define HX_32K_SZ 0x8000 +#define HX_40K_SZ 0xA000 +#define HX_48K_SZ 0xC000 +#define HX64K 0x10000 +#define HX124K 0x1f000 +#define HX4000K 0x1000000 + +#define HX_NORMAL_MODE 1 +#define HX_SORTING_MODE 2 +#define HX_CHANGE_MODE_FAIL (-1) +#define HX_RW_REG_FAIL (-1) +#define HX_DRIVER_MAX_IC_NUM 12 + +#if defined(__HIMAX_HX852xG_MOD__) +#define HX_MOD_KSYM_HX852xG HX_MOD_KSYM_HX852xG +#endif + +#if defined(__HIMAX_HX852xH_MOD__) +#define HX_MOD_KSYM_HX852xH HX_MOD_KSYM_HX852xH +#endif + +#if defined(__HIMAX_HX83102_MOD__) +#define HX_MOD_KSYM_HX83102 HX_MOD_KSYM_HX83102 +#endif + +#if defined(__HIMAX_HX83103_MOD__) +#define HX_MOD_KSYM_HX83103 HX_MOD_KSYM_HX83103 +#endif + +#if defined(__HIMAX_HX83106_MOD__) +#define HX_MOD_KSYM_HX83106 HX_MOD_KSYM_HX83106 +#endif + +#if defined(__HIMAX_HX83111_MOD__) +#define HX_MOD_KSYM_HX83111 HX_MOD_KSYM_HX83111 +#endif + +#if defined(__HIMAX_HX83112_MOD__) +#define HX_MOD_KSYM_HX83112 HX_MOD_KSYM_HX83112 +#endif + +#if defined(__HIMAX_HX83191_MOD__) +#define HX_MOD_KSYM_HX83191 HX_MOD_KSYM_HX83191 +#endif + +#if defined(__HIMAX_HX83113_MOD__) +#define HX_MOD_KSYM_HX83113 HX_MOD_KSYM_HX83113 +#endif + +#if defined(__HIMAX_HX83121_MOD__) +#define HX_MOD_KSYM_HX83121 HX_MOD_KSYM_HX83121 +#endif + +#define CORE_INIT +#define CORE_IC +#define CORE_FW +#define CORE_FLASH +#define CORE_SRAM +#define CORE_DRIVER + +#define HX_0F_DEBUG + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_INCELL) + +#if defined(HX_AUTO_UPDATE_FW) || defined(HX_ZERO_FLASH) +// extern char *i_CTPM_firmware_name; +#endif + +#ifdef HX_ZERO_FLASH + extern int g_f_0f_updat; +#endif + +#ifdef HX_TP_PROC_GUEST_INFO + extern struct hx_guest_info *g_guest_info_data; +#endif + +void himax_mcu_in_cmd_struct_free(void); + +#endif + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_ONCELL) + +void himax_mcu_on_cmd_struct_free(void); + +#endif + +#ifdef HX_AUTO_UPDATE_FW +extern int g_i_FW_VER; +extern int g_i_CFG_VER; +extern int g_i_CID_MAJ; +extern int g_i_CID_MIN; +extern unsigned char *i_CTPM_FW; +#endif + +extern unsigned long FW_VER_MAJ_FLASH_ADDR; +extern unsigned long FW_VER_MIN_FLASH_ADDR; +extern unsigned long CFG_VER_MAJ_FLASH_ADDR; +extern unsigned long CFG_VER_MIN_FLASH_ADDR; +extern unsigned long CID_VER_MAJ_FLASH_ADDR; +extern unsigned long CID_VER_MIN_FLASH_ADDR; +extern unsigned long PANEL_VERSION_ADDR; + +extern unsigned long FW_VER_MAJ_FLASH_LENG; +extern unsigned long FW_VER_MIN_FLASH_LENG; +extern unsigned long CFG_VER_MAJ_FLASH_LENG; +extern unsigned long CFG_VER_MIN_FLASH_LENG; +extern unsigned long CID_VER_MAJ_FLASH_LENG; +extern unsigned long CID_VER_MIN_FLASH_LENG; +extern unsigned long PANEL_VERSION_LENG; + +extern unsigned char IC_CHECKSUM; +#ifdef HX_ESD_RECOVERY +extern int g_zero_event_count; +#endif + +#ifdef HX_RST_PIN_FUNC +extern u8 HX_HW_RESET_ACTIVATE; +void himax_rst_gpio_set(int pinnum, uint8_t value); +#endif + +#if defined(HX_USB_DETECT_GLOBAL) +void himax_cable_detect_func(bool force_renew); +#endif + +int himax_report_data_init(void); +extern int i2c_error_count; + +#ifdef HX_ESD_RECOVERY + extern u8 HX_ESD_RESET_ACTIVATE; +#endif + +#ifdef CORE_INIT + int himax_mcu_in_cmd_struct_init(void); + void himax_in_parse_assign_cmd(uint32_t addr, uint8_t *cmd, int len); + void himax_mcu_in_cmd_init(void); + + int himax_mcu_on_cmd_struct_init(void); + void himax_on_parse_assign_cmd(uint32_t addr, uint8_t *cmd, int len); + void himax_mcu_on_cmd_init(void); + + extern void (*himax_mcu_cmd_struct_free)(void); +#endif + +typedef enum { + HX_FLASH_SPEED_25M = 0, + HX_FLASH_SPEED_12p5M = 0x01, + HX_FLASH_SPEED_8p3M = 0x02, + HX_FLASH_SPEED_6p25M = 0x03, +} HX_FLASH_SPEED_ENUM; + +#ifdef HX_TP_PROC_GUEST_INFO +#define HX_GUEST_INFO_SIZE 10 +#define HX_GUEST_INFO_LEN_SIZE 4 +#define HX_GUEST_INFO_ID_SIZE 4 + +struct hx_guest_info { + int g_guest_info_ongoing; /* 0 stop, 1 ongoing */ + uint8_t g_guest_str[10][128]; + uint8_t g_guest_str_in_format[10][128]; + uint8_t g_guest_data_type[10]; + int g_guest_data_len[10]; + int g_guest_info_type; +}; + +#endif + +#if defined(CORE_IC) + #define ic_adr_ahb_addr_byte_0 0x00 + #define ic_adr_ahb_rdata_byte_0 0x08 + #define ic_adr_ahb_access_direction 0x0c + #define ic_adr_conti 0x13 + #define ic_adr_incr4 0x0D + #define ic_adr_i2c_psw_lb 0x31 + #define ic_adr_i2c_psw_ub 0x32 + #define ic_cmd_ahb_access_direction_read 0x00 + #define ic_cmd_conti 0x31 + #define ic_cmd_incr4 0x10 + #define ic_cmd_i2c_psw_lb 0x27 + #define ic_cmd_i2c_psw_ub 0x95 + #define ic_adr_tcon_on_rst 0x80020020 + #define ic_addr_adc_on_rst 0x80020094 + #define ic_adr_psl 0x900000A0 + #define ic_adr_cs_central_state 0x900000A8 + #define ic_cmd_rst 0x00000000 + #define ic_adr_osc_en 0x900880A8 + #define ic_adr_osc_pw 0x900880E0 + + #define on_ic_adr_ahb_addr_byte_0 0x00 + #define on_ic_adr_ahb_rdata_byte_0 0x08 + #define on_ic_adr_ahb_access_direction 0x0c + #define on_ic_adr_conti 0x13 + #define on_ic_adr_incr4 0x0D + #define on_ic_cmd_ahb_access_direction_read 0x00 + #define on_ic_cmd_conti 0x31 + #define on_ic_cmd_incr4 0x10 + #define on_ic_adr_mcu_ctrl 0x82 + #define on_ic_cmd_mcu_on 0x25 + #define on_ic_cmd_mcu_off 0xDA + #define on_ic_adr_sleep_ctrl 0x99 + #define on_ic_cmd_sleep_in 0x80 + #define on_ic_adr_tcon_ctrl 0x80020000 + #define on_ic_cmd_tcon_on 0x00000000 + #define on_ic_adr_wdg_ctrl 0x9000800C + #define on_ic_cmd_wdg_psw 0x0000AC53 + #define on_ic_adr_wdg_cnt_ctrl 0x90008010 + #define on_ic_cmd_wdg_cnt_clr 0x000035CA +#endif + +#if defined(CORE_FW) + #define fw_addr_system_reset 0x90000018 + #define fw_addr_safe_mode_release_pw 0x90000098 + #define fw_addr_ctrl_fw 0x9000005c + #define fw_addr_flag_reset_event 0x900000e4 + #define fw_addr_hsen_enable 0x10007F14 + #define fw_addr_smwp_enable 0x10007F10 + #define fw_usb_detect_addr 0x10007F38 + #define fw_addr_program_reload_from 0x00000000 + #define fw_addr_program_reload_to 0x08000000 + #define fw_addr_program_reload_page_write 0x0000fb00 + #define fw_addr_raw_out_sel 0x800204b4 + #define fw_addr_reload_status 0x80050000 + #define fw_addr_reload_crc32_result 0x80050018 + #define fw_addr_reload_addr_from 0x80050020 + #define fw_addr_reload_addr_cmd_beat 0x80050028 + #define fw_data_system_reset 0x00000055 + #define fw_data_safe_mode_release_pw_active 0x00000053 + #define fw_data_safe_mode_release_pw_reset 0x00000000 + #define fw_data_clear 0x00000000 + #define fw_data_fw_stop 0x000000A5 + #define fw_data_program_reload_start 0x0A3C3000 + #define fw_data_program_reload_compare 0x04663000 + #define fw_data_program_reload_break 0x15E75678 + #define fw_addr_selftest_addr_en 0x10007F18 + #define fw_addr_selftest_result_addr 0x10007f24 + #define fw_data_selftest_request 0x00006AA6 + #define fw_addr_criteria_addr 0x10007f1c + #define fw_data_criteria_aa_top 0x64 + #define fw_data_criteria_aa_bot 0x00 + #define fw_data_criteria_key_top 0x64 + #define fw_data_criteria_key_bot 0x00 + #define fw_data_criteria_avg_top 0x64 + #define fw_data_criteria_avg_bot 0x00 + #define fw_addr_set_frame_addr 0x10007294 + #define fw_data_set_frame 0x0000000A + #define fw_data_selftest_ack_hb 0xa6 + #define fw_data_selftest_ack_lb 0x6a + #define fw_data_selftest_pass 0xaa + #define fw_data_normal_cmd 0x00 + #define fw_data_normal_status 0x99 + #define fw_data_sorting_cmd 0xaa + #define fw_data_sorting_status 0xcc + #define fw_data_idle_dis_pwd 0x17 + #define fw_data_idle_en_pwd 0x1f + #define fw_addr_sorting_mode_en 0x10007f04 + #define fw_addr_fw_mode_status 0x10007088 + #define fw_addr_icid_addr 0x900000d0 + #define fw_addr_trigger_addr 0x10007088 + #define fw_addr_fw_ver_addr 0x10007004 + #define fw_addr_fw_cfg_addr 0x10007084 + #define fw_addr_fw_vendor_addr 0x10007000 + #define fw_addr_cus_info 0x10007008 + #define fw_addr_proj_info 0x10007014 + #define fw_addr_fw_state_addr 0x900000f8 + #define fw_addr_fw_dbg_msg_addr 0x10007f40 + #define fw_addr_chk_fw_status 0x900000a8 + #define fw_addr_dd_handshak_addr 0x900000fc + #define fw_addr_dd_data_addr 0x10007f80 + #define fw_data_dd_request 0xaa + #define fw_data_dd_ack 0xbb + #define fw_data_rawdata_ready_hb 0xa3 + #define fw_data_rawdata_ready_lb 0x3a + #define fw_addr_ahb_addr 0x11 + #define fw_data_ahb_dis 0x00 + #define fw_data_ahb_en 0x01 + #define fw_addr_event_addr 0x30 + #define fw_func_handshaking_pwd 0xA55AA55A + #define fw_func_handshaking_end 0x77887788 + #define fw_addr_ulpm_33 0x33 + #define fw_addr_ulpm_34 0x34 + #define fw_data_ulpm_11 0x11 + #define fw_data_ulpm_22 0x22 + #define fw_data_ulpm_33 0x33 + #define fw_data_ulpm_aa 0xAA +#ifdef SEC_FACTORY_MODE + #define FW_EDGE_BORDER_ON 0x11 + #define FW_EDGE_BORDER_OFF 0x00 + #define FW_EDGE_BORDER_ADDR 0x10007ff4 +// #define FW_CAL_ON 0x01 +// #define FW_CAL_OFF 0x00 +// #define FW_CAL_ADDR 0x10007088 /*bit[2] */ + #define FW_RPORT_THRSH_ADDR 0x1000708C /*byte[3] */ +#endif + #define on_fw_addr_smwp_enable 0xA2 + #define on_fw_usb_detect_addr 0xA4 + #define on_fw_addr_program_reload_from 0x00000000 + #define on_fw_addr_raw_out_sel 0x98 + #define on_fw_addr_flash_checksum 0x80000044 + #define on_fw_data_flash_checksum 0x00000491 + #define on_fw_addr_crc_value 0x80000050 + #define on_fw_data_safe_mode_release_pw_active 0x00000053 + #define on_fw_data_safe_mode_release_pw_reset 0x00000000 + #define on_fw_addr_criteria_addr 0x9A + #define on_fw_data_selftest_pass 0xaa + #define on_fw_addr_reK_crtl 0x8000000C + #define on_fw_data_reK_en 0x02 + #define on_fw_data_reK_dis 0xFD + #define on_fw_data_rst_init 0xF0 + #define on_fw_data_dc_set 0x02 + #define on_fw_data_bank_set 0x03 + #define on_fw_addr_selftest_addr_en 0x98 + #define on_fw_addr_selftest_result_addr 0x9B + #define on_fw_data_selftest_request 0x06 + #define on_fw_data_thx_avg_mul_dc_lsb 0x22 + #define on_fw_data_thx_avg_mul_dc_msb 0x0B + #define on_fw_data_thx_mul_dc_up_low_bud 0x64 + #define on_fw_data_thx_avg_slf_dc_lsb 0x14 + #define on_fw_data_thx_avg_slf_dc_msb 0x05 + #define on_fw_data_thx_slf_dc_up_low_bud 0x64 + #define on_fw_data_thx_slf_bank_up 0x40 + #define on_fw_data_thx_slf_bank_low 0x00 + #define on_fw_data_idle_dis_pwd 0x40 + #define on_fw_data_idle_en_pwd 0x00 + #define on_fw_addr_fw_mode_status 0x99 + #define on_fw_addr_icid_addr 0x900000d0 + #define on_fw_addr_trigger_addr 0x10007088 + #define on_fw_addr_fw_ver_start 0x90 + #define on_fw_data_rawdata_ready_hb 0xa3 + #define on_fw_data_rawdata_ready_lb 0x3a + #define on_fw_addr_ahb_addr 0x11 + #define on_fw_data_ahb_dis 0x00 + #define on_fw_data_ahb_en 0x01 + #define on_fw_addr_event_addr 0x30 +#endif + +#if defined(CORE_FLASH) + #define flash_addr_ctrl_base 0x80000000 + #define flash_addr_spi200_trans_fmt (flash_addr_ctrl_base + 0x10) + #define flash_addr_spi200_trans_ctrl (flash_addr_ctrl_base + 0x20) + #define flash_addr_spi200_cmd (flash_addr_ctrl_base + 0x24) + #define flash_addr_spi200_addr (flash_addr_ctrl_base + 0x28) + #define flash_addr_spi200_data (flash_addr_ctrl_base + 0x2c) + #define flash_addr_spi200_bt_num (flash_addr_ctrl_base + 0xe8) + #define flash_data_spi200_trans_fmt 0x00020780 + #define flash_data_spi200_trans_ctrl_1 0x42000003 + #define flash_data_spi200_trans_ctrl_2 0x47000000 + #define flash_data_spi200_trans_ctrl_3 0x67000000 + #define flash_data_spi200_trans_ctrl_4 0x610ff000 + #define flash_data_spi200_trans_ctrl_5 0x694002ff + #define flash_data_spi200_cmd_1 0x00000005 + #define flash_data_spi200_cmd_2 0x00000006 + #define flash_data_spi200_cmd_3 0x000000C7 + #define flash_data_spi200_cmd_4 0x000000D8 + #define flash_data_spi200_cmd_5 0x00000020 + #define flash_data_spi200_cmd_6 0x00000002 + #define flash_data_spi200_cmd_7 0x0000003b + #define flash_data_spi200_addr 0x00000000 + #define flash_clk_setup_addr 0x80000040 + + #define on_flash_addr_ctrl_base 0x80000000 + #define on_flash_addr_ctrl_auto 0x80000004 + #define on_flash_data_main_erase 0x0000A50D + #define on_flash_data_auto 0xA5 + #define on_flash_data_main_read 0x03 + #define on_flash_data_page_write 0x05 + #define on_flash_data_spp_read 0x10 + #define on_flash_data_sfr_read 0x14 + #define on_flash_addr_ahb_ctrl 0x80000020 + #define on_flash_data_ahb_squit 0x00000001 + #define on_flash_addr_unlock_0 0x00000000 + #define on_flash_addr_unlock_4 0x00000004 + #define on_flash_addr_unlock_8 0x00000008 + #define on_flash_addr_unlock_c 0x0000000C + #define on_flash_data_cmd0 0x28178EA0 + #define on_flash_data_cmd1 0x0A0E03FF + #define on_flash_data_cmd2 0x8C203D0C + #define on_flash_data_cmd3 0x00300263 + #define on_flash_data_lock 0x03400000 +#endif + +#if defined(CORE_SRAM) + #define sram_adr_mkey 0x100070E8 + #define sram_adr_rawdata_addr 0x10000000 + #define sram_adr_rawdata_end 0x00000000 + #define sram_passwrd_start 0x5AA5 + #define sram_passwrd_end 0xA55A + + #define on_sram_adr_rawdata_addr 0x080002E0 + #define on_sram_adr_rawdata_end 0x00000000 + #define on_sram_cmd_conti 0x44332211 + #define on_sram_cmd_fin 0x00000000 + #define on_sram_passwrd_start 0x5AA5 + #define on_sram_passwrd_end 0xA55A +#endif + +#if defined(CORE_DRIVER) + #define driver_addr_fw_define_flash_reload 0x10007f00 + #define driver_addr_fw_define_2nd_flash_reload 0x100072c0 + #define driver_data_fw_define_flash_reload_dis 0x0000a55a + #define driver_data_fw_define_flash_reload_en 0x00000000 + #define driver_addr_fw_define_int_is_edge 0x10007088 + #define driver_addr_fw_define_rxnum_txnum_maxpt 0x100070f4 + #define driver_data_fw_define_rxnum_txnum_maxpt_sorting 0x00000008 + #define driver_data_fw_define_rxnum_txnum_maxpt_normal 0x00000014 + #define driver_addr_fw_define_xy_res_enable 0x100070f8 + #define driver_addr_fw_define_x_y_res 0x100070fc + #define driver_data_df_rx 36 + #define driver_data_df_tx 18 + #define driver_data_df_pt 10 + #define on_driver_addr_fw_define_int_is_edge 0x10007088 + #define on_driver_data_df_rx 28 + #define on_driver_data_df_tx 14 + #define on_driver_data_df_pt 10 +#ifndef HX_NEW_EVENT_STACK_FORMAT + #define on_driver_addr_fw_rx_tx_maxpt_num 0x0800001C + #define on_driver_addr_fw_xy_rev_int_edge 0x0800000C + #define on_driver_addr_fw_define_x_y_res 0x08000030 +#else + #define on_driver_addr_fw_rx_tx_maxpt_num 0x08000004 + #define on_driver_addr_fw_maxpt_bt_num 0x0800000C + #define on_driver_addr_fw_xy_rev_int_edge 0x08000110 + #define on_driver_addr_fw_define_x_y_res 0x08000010 +#endif + +#endif + +#if defined(HX_ZERO_FLASH) + #define zf_addr_dis_flash_reload 0x10007f00 + #define zf_data_dis_flash_reload 0x00009AA9 + #define zf_addr_system_reset 0x90000018 + #define zf_data_system_reset 0x00000055 + #define zf_data_sram_start_addr 0x08000000 + #define zf_data_sram_clean 0x10000000 + #define zf_data_cfg_info 0x10007000 + #define zf_data_fw_cfg_1 0x10007084 + #define zf_data_fw_cfg_2 0x10007264 + #define zf_data_fw_cfg_3 0x10007300 + #define zf_data_adc_cfg_1 0x10006A00 + #define zf_data_adc_cfg_2 0x10007B28 + #define zf_data_adc_cfg_3 0x10007AF0 + #define zf_data_map_table 0x10007500 +/* #define zf_data_mode_switch 0x10007294*/ + #define zf_addr_sts_chk 0x900000A8 + #define zf_data_activ_sts 0x05 + #define zf_addr_activ_relod 0x90000048 + #define zf_data_activ_in 0xEC + +#if defined(HX_CODE_OVERLAY) + #define ovl_isram_addr 0x20008CE0 + #define ovl_handshaking_addr 0x10007FFC + #define ovl_gesture_request 0x11 + #define ovl_gesture_reply 0x22 + #define ovl_border_request 0x55 + #define ovl_border_reply 0x66 +#endif + +struct zf_info { + uint8_t sram_addr[4]; + int write_size; + uint32_t fw_addr; + uint32_t cfg_addr; +}; +#endif + +struct ic_operation { + uint8_t addr_ahb_addr_byte_0[1]; + uint8_t addr_ahb_rdata_byte_0[1]; + uint8_t addr_ahb_access_direction[1]; + uint8_t addr_conti[1]; + uint8_t addr_incr4[1]; + uint8_t adr_i2c_psw_lb[1]; + uint8_t adr_i2c_psw_ub[1]; + uint8_t data_ahb_access_direction_read[1]; + uint8_t data_conti[1]; + uint8_t data_incr4[1]; + uint8_t data_i2c_psw_lb[1]; + uint8_t data_i2c_psw_ub[1]; + uint8_t addr_tcon_on_rst[4]; + uint8_t addr_adc_on_rst[4]; + uint8_t addr_psl[4]; + uint8_t addr_cs_central_state[4]; + uint8_t data_rst[4]; + uint8_t adr_osc_en[4]; + uint8_t adr_osc_pw[4]; +}; + +struct fw_operation { + uint8_t addr_system_reset[4]; + uint8_t addr_safe_mode_release_pw[4]; + uint8_t addr_ctrl_fw_isr[4]; + uint8_t addr_flag_reset_event[4]; + uint8_t addr_hsen_enable[4]; + uint8_t addr_smwp_enable[4]; + uint8_t addr_program_reload_from[4]; + uint8_t addr_program_reload_to[4]; + uint8_t addr_program_reload_page_write[4]; + uint8_t addr_raw_out_sel[4]; + uint8_t addr_reload_status[4]; + uint8_t addr_reload_crc32_result[4]; + uint8_t addr_reload_addr_from[4]; + uint8_t addr_reload_addr_cmd_beat[4]; + uint8_t addr_selftest_addr_en[4]; + uint8_t addr_criteria_addr[4]; + uint8_t addr_set_frame_addr[4]; + uint8_t addr_selftest_result_addr[4]; + uint8_t addr_sorting_mode_en[4]; + uint8_t addr_fw_mode_status[4]; + uint8_t addr_icid_addr[4]; + uint8_t addr_trigger_addr[4]; + uint8_t addr_fw_ver_addr[4]; + uint8_t addr_fw_cfg_addr[4]; + uint8_t addr_fw_vendor_addr[4]; + uint8_t addr_cus_info[4]; + uint8_t addr_proj_info[4]; + uint8_t addr_fw_state_addr[4]; + uint8_t addr_fw_dbg_msg_addr[4]; + uint8_t addr_chk_fw_status[4]; + uint8_t addr_dd_handshak_addr[4]; + uint8_t addr_dd_data_addr[4]; + uint8_t data_system_reset[4]; + uint8_t data_safe_mode_release_pw_active[4]; + uint8_t data_safe_mode_release_pw_reset[4]; + uint8_t data_clear[4]; + uint8_t data_fw_stop[4]; + uint8_t data_program_reload_start[4]; + uint8_t data_program_reload_compare[4]; + uint8_t data_program_reload_break[4]; + uint8_t data_selftest_request[4]; + uint8_t data_criteria_aa_top[1]; + uint8_t data_criteria_aa_bot[1]; + uint8_t data_criteria_key_top[1]; + uint8_t data_criteria_key_bot[1]; + uint8_t data_criteria_avg_top[1]; + uint8_t data_criteria_avg_bot[1]; + uint8_t data_set_frame[4]; + uint8_t data_selftest_ack_hb[1]; + uint8_t data_selftest_ack_lb[1]; + uint8_t data_selftest_pass[1]; + uint8_t data_normal_cmd[1]; + uint8_t data_normal_status[1]; + uint8_t data_sorting_cmd[1]; + uint8_t data_sorting_status[1]; + uint8_t data_dd_request[1]; + uint8_t data_dd_ack[1]; + uint8_t data_idle_dis_pwd[1]; + uint8_t data_idle_en_pwd[1]; + uint8_t data_rawdata_ready_hb[1]; + uint8_t data_rawdata_ready_lb[1]; + uint8_t addr_ahb_addr[1]; + uint8_t data_ahb_dis[1]; + uint8_t data_ahb_en[1]; + uint8_t addr_event_addr[1]; + uint8_t addr_usb_detect[4]; + uint8_t addr_ulpm_33[1]; + uint8_t addr_ulpm_34[1]; + uint8_t data_ulpm_11[1]; + uint8_t data_ulpm_22[1]; + uint8_t data_ulpm_33[1]; + uint8_t data_ulpm_aa[1]; +#ifdef SEC_FACTORY_MODE + uint8_t addr_edge_border[4]; +// uint8_t addr_cal[4]; + uint8_t addr_rport_thrsh[4]; +#endif +}; + +struct flash_operation { + uint8_t addr_spi200_trans_fmt[4]; + uint8_t addr_spi200_trans_ctrl[4]; + uint8_t addr_spi200_cmd[4]; + uint8_t addr_spi200_addr[4]; + uint8_t addr_spi200_data[4]; + uint8_t addr_spi200_bt_num[4]; + + uint8_t data_spi200_trans_fmt[4]; + uint8_t data_spi200_trans_ctrl_1[4]; + uint8_t data_spi200_trans_ctrl_2[4]; + uint8_t data_spi200_trans_ctrl_3[4]; + uint8_t data_spi200_trans_ctrl_4[4]; + uint8_t data_spi200_trans_ctrl_5[4]; + uint8_t data_spi200_cmd_1[4]; + uint8_t data_spi200_cmd_2[4]; + uint8_t data_spi200_cmd_3[4]; + uint8_t data_spi200_cmd_4[4]; + uint8_t data_spi200_cmd_5[4]; + uint8_t data_spi200_cmd_6[4]; + uint8_t data_spi200_cmd_7[4]; + uint8_t data_spi200_addr[4]; +}; + +struct sram_operation { + uint8_t addr_mkey[4]; + uint8_t addr_rawdata_addr[4]; + uint8_t addr_rawdata_end[4]; + uint8_t passwrd_start[2]; + uint8_t passwrd_end[2]; +}; + +struct driver_operation { + uint8_t addr_fw_define_flash_reload[4]; + uint8_t addr_fw_define_2nd_flash_reload[4]; + uint8_t addr_fw_define_int_is_edge[4]; + uint8_t addr_fw_define_rxnum_txnum_maxpt[4]; + uint8_t addr_fw_define_xy_res_enable[4]; + uint8_t addr_fw_define_x_y_res[4]; + uint8_t data_df_rx[1]; + uint8_t data_df_tx[1]; + uint8_t data_df_pt[1]; + uint8_t data_fw_define_flash_reload_dis[4]; + uint8_t data_fw_define_flash_reload_en[4]; + uint8_t data_fw_define_rxnum_txnum_maxpt_sorting[4]; + uint8_t data_fw_define_rxnum_txnum_maxpt_normal[4]; +}; + +struct zf_operation { + uint8_t addr_dis_flash_reload[4]; + uint8_t data_dis_flash_reload[4]; + uint8_t addr_system_reset[4]; + uint8_t data_system_reset[4]; + uint8_t data_sram_start_addr[4]; + uint8_t data_sram_clean[4]; + uint8_t data_cfg_info[4]; + uint8_t data_fw_cfg_1[4]; + uint8_t data_fw_cfg_2[4]; + uint8_t data_fw_cfg_3[4]; + uint8_t data_adc_cfg_1[4]; + uint8_t data_adc_cfg_2[4]; + uint8_t data_adc_cfg_3[4]; + uint8_t data_map_table[4]; +/* uint8_t data_mode_switch[4];*/ + uint8_t addr_sts_chk[4]; + uint8_t data_activ_sts[1]; + uint8_t addr_activ_relod[4]; + uint8_t data_activ_in[1]; +}; + +struct himax_core_command_operation { + struct ic_operation *ic_op; + struct fw_operation *fw_op; + struct flash_operation *flash_op; + struct sram_operation *sram_op; + struct driver_operation *driver_op; + struct zf_operation *zf_op; +}; + +struct on_ic_operation { + uint8_t addr_ahb_addr_byte_0[1]; + uint8_t addr_ahb_rdata_byte_0[1]; + uint8_t addr_ahb_access_direction[1]; + uint8_t addr_conti[1]; + uint8_t addr_incr4[1]; + uint8_t adr_mcu_ctrl[1]; + uint8_t data_ahb_access_direction_read[1]; + uint8_t data_conti[1]; + uint8_t data_incr4[1]; + uint8_t cmd_mcu_on[1]; + uint8_t cmd_mcu_off[1]; + uint8_t adr_sleep_ctrl[1]; + uint8_t cmd_sleep_in[1]; + uint8_t adr_tcon_ctrl[4]; + uint8_t cmd_tcon_on[4]; + uint8_t adr_wdg_ctrl[4]; + uint8_t cmd_wdg_psw[4]; + uint8_t adr_wdg_cnt_ctrl[4]; + uint8_t cmd_wdg_cnt_clr[4]; +}; + +struct on_fw_operation { + uint8_t addr_smwp_enable[1]; + uint8_t addr_program_reload_from[4]; + uint8_t addr_raw_out_sel[1]; + uint8_t addr_flash_checksum[4]; + uint8_t data_flash_checksum[4]; + uint8_t addr_crc_value[4]; + uint8_t addr_reload_status[4]; + uint8_t addr_reload_crc32_result[4]; + uint8_t addr_reload_addr_from[4]; + uint8_t addr_reload_addr_cmd_beat[4]; + uint8_t addr_set_frame_addr[4]; + uint8_t addr_fw_mode_status[1]; + uint8_t addr_icid_addr[4]; + uint8_t addr_trigger_addr[4]; + uint8_t addr_fw_ver_start[1]; + uint8_t data_safe_mode_release_pw_active[4]; + uint8_t data_safe_mode_release_pw_reset[4]; + uint8_t data_clear[4]; + uint8_t addr_criteria_addr[1]; + uint8_t data_selftest_pass[1]; + uint8_t addr_reK_crtl[4]; + uint8_t data_reK_en[1]; + uint8_t data_reK_dis[1]; + uint8_t data_rst_init[1]; + uint8_t data_dc_set[1]; + uint8_t data_bank_set[1]; + uint8_t addr_selftest_addr_en[1]; + uint8_t addr_selftest_result_addr[1]; + uint8_t data_selftest_request[1]; + uint8_t data_thx_avg_mul_dc_lsb[1]; + uint8_t data_thx_avg_mul_dc_msb[1]; + uint8_t data_thx_mul_dc_up_low_bud[1]; + uint8_t data_thx_avg_slf_dc_lsb[1]; + uint8_t data_thx_avg_slf_dc_msb[1]; + uint8_t data_thx_slf_dc_up_low_bud[1]; + uint8_t data_thx_slf_bank_up[1]; + uint8_t data_thx_slf_bank_low[1]; + uint8_t data_idle_dis_pwd[1]; + uint8_t data_idle_en_pwd[1]; + uint8_t data_rawdata_ready_hb[1]; + uint8_t data_rawdata_ready_lb[1]; + uint8_t addr_ahb_addr[1]; + uint8_t data_ahb_dis[1]; + uint8_t data_ahb_en[1]; + uint8_t addr_event_addr[1]; + uint8_t addr_usb_detect[1]; +}; + +struct on_flash_operation { + uint8_t addr_ctrl_base[4]; + uint8_t addr_ctrl_auto[4]; + uint8_t data_main_erase[4]; + uint8_t data_auto[1]; + uint8_t data_main_read[1]; + uint8_t data_page_write[1]; + uint8_t data_sfr_read[1]; + uint8_t data_spp_read[1]; + uint8_t addr_ahb_ctrl[4]; + uint8_t data_ahb_squit[4]; + + uint8_t addr_unlock_0[4]; + uint8_t addr_unlock_4[4]; + uint8_t addr_unlock_8[4]; + uint8_t addr_unlock_c[4]; + uint8_t data_cmd0[4]; + uint8_t data_cmd1[4]; + uint8_t data_cmd2[4]; + uint8_t data_cmd3[4]; + uint8_t data_lock[4]; +}; + +struct on_sram_operation { + uint8_t addr_rawdata_addr[4]; + uint8_t addr_rawdata_end[4]; + uint8_t data_conti[4]; + uint8_t data_fin[4]; + uint8_t passwrd_start[2]; + uint8_t passwrd_end[2]; +}; + +struct on_driver_operation { + uint8_t addr_fw_define_int_is_edge[4]; + uint8_t addr_fw_rx_tx_maxpt_num[4]; +#ifdef HX_NEW_EVENT_STACK_FORMAT + uint8_t addr_fw_maxpt_bt_num[4]; +#endif + uint8_t addr_fw_xy_rev_int_edge[4]; + uint8_t addr_fw_define_x_y_res[4]; + uint8_t data_fw_define_rxnum_txnum_maxpt_sorting[4]; + uint8_t data_fw_define_rxnum_txnum_maxpt_normal[4]; + uint8_t data_df_rx[1]; + uint8_t data_df_tx[1]; + uint8_t data_df_pt[1]; +}; + +struct himax_on_core_command_operation { + struct on_ic_operation *ic_op; + struct on_fw_operation *fw_op; + struct on_flash_operation *flash_op; + struct on_sram_operation *sram_op; + struct on_driver_operation *driver_op; +}; + +struct himax_chip_detect { + bool (*fp_chip_detect)(void); +}; + +struct himax_chip_entry { + struct himax_chip_detect *core_chip_dt; + uint32_t hx_ic_dt_num; +}; + +struct himax_core_fp { +#ifdef CORE_IC + void (*fp_burst_enable)(uint8_t auto_add_4_byte); + int (*fp_register_read)(uint8_t *read_addr, uint32_t read_length, uint8_t *read_data, uint8_t cfg_flag); + /*int (*fp_flash_write_burst)(uint8_t *reg_byte, uint8_t *write_data);*/ + /*void (*fp_flash_write_burst_lenth)(uint8_t *reg_byte, uint8_t *write_data, uint32_t length);*/ + int (*fp_register_write)(uint8_t *write_addr, uint32_t write_length, uint8_t *write_data, uint8_t cfg_flag); + void (*fp_interface_on)(void); + void (*fp_sense_on)(uint8_t FlashMode); + void (*fp_tcon_on)(void); + bool (*fp_watch_dog_off)(void); + bool (*fp_sense_off)(bool check_en); + void (*fp_sleep_in)(void); + bool (*fp_wait_wip)(int Timing); + void (*fp_init_psl)(void); + void (*fp_resume_ic_action)(void); + void (*fp_suspend_ic_action)(void); + void (*fp_power_on_init)(void); + bool (*fp_dd_clk_set)(bool enable); + void (*fp_dd_reg_en)(bool enable); + bool (*fp_dd_reg_write)(uint8_t addr, uint8_t pa_num, int len, uint8_t *data, uint8_t bank); + bool (*fp_dd_reg_read)(uint8_t addr, uint8_t pa_num, int len, uint8_t *data, uint8_t bank); + bool (*fp_ic_id_read)(void); + bool (*fp_slave_tcon_reset)(void); + bool (*fp_slave_adc_reset_slave)(void); + bool (*fp_slave_wdt_off_slave)(void); +#endif + +#ifdef CORE_FW + void (*fp_parse_raw_data)(struct himax_report_data *hx_touch_data, int mul_num, int self_num, uint8_t diag_cmd, int16_t *mutual_data, int16_t *self_data); + void (*fp_system_reset)(void); + int (*fp_Calculate_CRC_with_AP)(unsigned char *FW_content, int CRC_from_FW, int len); + uint32_t (*fp_check_CRC)(uint8_t *start_addr, int reload_length); + void (*fp_set_reload_cmd)(uint8_t *write_data, int idx, uint32_t cmd_from, uint32_t cmd_to, uint32_t cmd_beat); + bool (*fp_program_reload)(void); + void (*fp_set_SMWP_enable)(uint8_t SMWP_enable, bool suspended); + void (*fp_set_HSEN_enable)(uint8_t HSEN_enable, bool suspended); + void (*fp_diag_register_set)(uint8_t diag_command, uint8_t storage_type); +#ifdef SEC_FACTORY_MODE + int (*set_edge_border) (int set_val); +// int (*set_cal_switch) (int set_val); + int (*get_rport_thrsh) (void); +#endif +#ifdef HX_TP_SELF_TEST_DRIVER + void (*fp_control_reK)(bool enable); +#endif + int (*fp_chip_self_test)(void); + void (*fp_idle_mode)(int disable); + void (*fp_reload_disable)(int disable); + bool (*fp_check_chip_version)(void); + int (*fp_read_ic_trigger_type)(void); + int (*fp_read_i2c_status)(void); + void (*fp_read_FW_ver)(void); + bool (*fp_read_event_stack)(uint8_t *buf, uint8_t length); + void (*fp_return_event_stack)(void); + bool (*fp_calculateChecksum)(bool change_iref, uint32_t size); + int (*fp_read_FW_status)(uint8_t *state_addr, uint8_t *tmp_addr); + void (*fp_irq_switch)(int switch_on); + int (*fp_assign_sorting_mode)(uint8_t *tmp_data); + int (*fp_check_sorting_mode)(uint8_t *tmp_data); + int (*fp_switch_mode)(int mode); + int (*fp_get_max_dc)(void); + uint8_t (*fp_read_DD_status)(uint8_t *cmd_set, uint8_t *tmp_data); + int (*fp_ulpm_in)(void); + int (*fp_black_gest_ctrl)(bool enable); + int (*_diff_overlay_bin)(void); +#endif + +#ifdef CORE_FLASH + void (*fp_chip_erase)(void); + bool (*fp_block_erase)(int start_addr, int length); + bool (*fp_sector_erase)(int start_addr); + void (*fp_flash_programming)(uint8_t *FW_content, int FW_Size); + void (*fp_flash_page_write)(uint8_t *write_addr, int length, uint8_t *write_data); + int (*fp_fts_ctpm_fw_upgrade_with_sys_fs_32k)(unsigned char *fw, int len, bool change_iref); + int (*fp_fts_ctpm_fw_upgrade_with_sys_fs_60k)(unsigned char *fw, int len, bool change_iref); + int (*fp_fts_ctpm_fw_upgrade_with_sys_fs_64k)(unsigned char *fw, int len, bool change_iref); + int (*fp_fts_ctpm_fw_upgrade_with_sys_fs_124k)(unsigned char *fw, int len, bool change_iref); + int (*fp_fts_ctpm_fw_upgrade_with_sys_fs_128k)(unsigned char *fw, int len, bool change_iref); + int (*fp_fts_ctpm_fw_upgrade_with_sys_fs_255k)(unsigned char *fw, int len, bool change_iref); + void (*fp_flash_dump_func)(uint8_t local_flash_command, int Flash_Size, uint8_t *flash_buffer); + bool (*fp_flash_lastdata_check)(uint32_t size, unsigned char *fw, int len); + bool (*fp_ahb_squit)(void); + void (*fp_flash_read)(uint8_t *r_data, int start_addr, int length); + bool (*fp_sfr_rw)(uint8_t *addr, int length, uint8_t *data, uint8_t rw_ctrl); + bool (*fp_lock_flash)(void); + bool (*fp_unlock_flash)(void); + void (*fp_init_auto_func)(void); + int (*_diff_overlay_flash)(void); +#endif + +#ifdef CORE_SRAM + void (*fp_sram_write)(uint8_t *FW_content); + bool (*fp_sram_verify)(uint8_t *FW_File, int FW_Size); + bool (*fp_get_DSRAM_data)(uint8_t *info_data, bool DSRAM_Flag); +#endif + +#ifdef CORE_DRIVER + void (*fp_chip_init)(void); +#ifdef HX_AUTO_UPDATE_FW + int (*fp_fw_ver_bin)(void); +#endif + void (*fp_pin_reset)(void); + void (*fp_touch_information)(void); + void (*fp_reload_config)(void); + int (*fp_get_touch_data_size)(void); + void (*fp_usb_detect_set)(uint8_t *cable_config); + int (*fp_hand_shaking)(void); + int (*fp_determin_diag_rawdata)(int diag_command); + int (*fp_determin_diag_storage)(int diag_command); + int (*fp_cal_data_len)(int raw_cnt_rmd, int HX_MAX_PT, int raw_cnt_max); + bool (*fp_diag_check_sum)(struct himax_report_data *hx_touch_data); + void (*fp_diag_parse_raw_data)(struct himax_report_data *hx_touch_data, int mul_num, int self_num, uint8_t diag_cmd, int32_t *mutual_data, int32_t *self_data); + void (*fp_ic_reset)(uint8_t loadconfig, uint8_t int_off); + int (*fp_ic_esd_recovery)(int hx_esd_event, int hx_zero_event, int length); + void (*fp_esd_ic_reset)(void); + void (*fp_resend_cmd_func)(bool suspended); +#ifdef HX_TP_PROC_GUEST_INFO + int (*guest_info_get_status)(void); + int (*read_guest_info)(void); +#endif +#endif +#ifdef HX_ZERO_FLASH + void (*fp_clean_sram_0f)(uint8_t *addr, int write_len, int type); + void (*fp_write_sram_0f)(const struct firmware *fw_entry, uint8_t *addr, int start_index, uint32_t write_len); + int (*fp_write_sram_0f_crc)(const struct firmware *fw_entry, uint8_t *addr, int start_index, uint32_t write_len); + void (*fp_firmware_update_0f)(const struct firmware *fw_entry); + int (*fp_0f_operation_dirly)(void); + int (*fp_0f_op_file_dirly)(char *file_name); + void (*fp_0f_operation)(struct work_struct *work); + int (*fp_0f_esd_check)(void); + void (*fp_0f_reload_to_active)(void); +#ifdef HX_0F_DEBUG + void (*fp_read_sram_0f)(const struct firmware *fw_entry, uint8_t *addr, int start_index, int read_len); + void (*fp_read_all_sram)(uint8_t *addr, int read_len); + void (*fp_firmware_read_0f)(const struct firmware *fw_entry, int type); + void (*fp_0f_operation_check)(int type); +#endif +#ifdef HX_CODE_OVERLAY + int (*fp_0f_overlay)(int ovl_type, int mode); +#endif +#endif +}; + +#endif diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_ic_incell_core.c b/drivers/input/touchscreen/himax/hx831xx/himax_ic_incell_core.c new file mode 100755 index 000000000000..de24fbfcc5fb --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_ic_incell_core.c @@ -0,0 +1,3931 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for incell ic core functions + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "himax_ic_core.h" + +struct himax_core_command_operation *g_core_cmd_op; +struct ic_operation *pic_op; +EXPORT_SYMBOL(pic_op); + +struct fw_operation *pfw_op; +EXPORT_SYMBOL(pfw_op); + +struct flash_operation *pflash_op; +struct sram_operation *psram_op; +struct driver_operation *pdriver_op; +EXPORT_SYMBOL(pdriver_op); + +#ifdef HX_TP_PROC_GUEST_INFO +struct hx_guest_info *g_guest_info_data = NULL; +#endif + +#ifdef HX_ZERO_FLASH +struct zf_operation *pzf_op; +EXPORT_SYMBOL(pzf_op); +#endif + +void (*himax_mcu_cmd_struct_free)(void); +static uint8_t *g_internal_buffer; + +#ifdef CORE_IC +/* IC side start*/ +static void himax_mcu_burst_enable(uint8_t auto_add_4_byte) +{ + uint8_t tmp_data[DATA_LEN_4]; + + /*I("%s,Entering\n", __func__);*/ + tmp_data[0] = pic_op->data_conti[0]; + + if (himax_bus_write(pic_op->addr_conti[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return; + } + + tmp_data[0] = (pic_op->data_incr4[0] | auto_add_4_byte); + + if (himax_bus_write(pic_op->addr_incr4[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return; + } +} + +static int himax_mcu_register_read(uint8_t *read_addr, uint32_t read_length, uint8_t *read_data, uint8_t cfg_flag) +{ + uint8_t tmp_data[DATA_LEN_4]; + int i = 0; + int address = 0; + + //I("%s,Entering\n",__func__); + + if (cfg_flag == false) { + if (read_length > FLASH_RW_MAX_LEN) { + E("%s: read len over %d!\n", __func__, FLASH_RW_MAX_LEN); + return LENGTH_FAIL; + } + + if (read_length > DATA_LEN_4) + g_core_fp.fp_burst_enable(1); + else + g_core_fp.fp_burst_enable(0); + + address = (read_addr[3] << 24) + (read_addr[2] << 16) + (read_addr[1] << 8) + read_addr[0]; + i = address; + tmp_data[0] = (uint8_t)i; + tmp_data[1] = (uint8_t)(i >> 8); + tmp_data[2] = (uint8_t)(i >> 16); + tmp_data[3] = (uint8_t)(i >> 24); + + if (himax_bus_write(pic_op->addr_ahb_addr_byte_0[0], tmp_data, DATA_LEN_4, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return I2C_FAIL; + } + + tmp_data[0] = pic_op->data_ahb_access_direction_read[0]; + + if (himax_bus_write(pic_op->addr_ahb_access_direction[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return I2C_FAIL; + } + + if (himax_bus_read(pic_op->addr_ahb_rdata_byte_0[0], read_data, read_length, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return I2C_FAIL; + } + + if (read_length > DATA_LEN_4) + g_core_fp.fp_burst_enable(0); + + } else { + if (himax_bus_read(read_addr[0], read_data, read_length, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return I2C_FAIL; + } + } + return NO_ERR; +} + +static int himax_mcu_flash_write_burst_lenth(uint8_t *reg_byte, uint8_t *write_data, uint32_t length) +{ + uint8_t *data_byte; + + if (!g_internal_buffer) { + E("%s: internal buffer not initialized!\n", __func__); + return MEM_ALLOC_FAIL; + } + data_byte = g_internal_buffer; + + memcpy(data_byte, reg_byte, ADDR_LEN_4); /* assign addr 4bytes */ + + memcpy(data_byte + ADDR_LEN_4, write_data, length); /* assign data n bytes */ + + if (himax_bus_write(pic_op->addr_ahb_addr_byte_0[0], data_byte, length + ADDR_LEN_4, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: xfer fail!\n", __func__); + return I2C_FAIL; + } + + return NO_ERR; +} + +static int himax_mcu_register_write(uint8_t *write_addr, uint32_t write_length, uint8_t *write_data, uint8_t cfg_flag) +{ + unsigned int address; + uint8_t tmp_addr[4]; + uint8_t *tmp_data; + unsigned int total_read_times = 0; + uint32_t max_bus_size = MAX_I2C_TRANS_SZ; + uint32_t total_size_temp = 0; + unsigned int i = 0; + + /*I("%s,Entering\n", __func__);*/ + if (cfg_flag == 0) { + total_size_temp = write_length; +#ifdef HX_ZERO_FLASH + max_bus_size = (write_length > HX_MAX_WRITE_SZ) ? HX_MAX_WRITE_SZ : write_length; +#endif + + tmp_addr[3] = write_addr[3]; + tmp_addr[2] = write_addr[2]; + tmp_addr[1] = write_addr[1]; + tmp_addr[0] = write_addr[0]; + + if (total_size_temp % max_bus_size == 0) + total_read_times = total_size_temp / max_bus_size; + else + total_read_times = total_size_temp / max_bus_size + 1; + + if (write_length > DATA_LEN_4) + g_core_fp.fp_burst_enable(1); + else + g_core_fp.fp_burst_enable(0); + + for (i = 0; i < (total_read_times); i++) { + /* I("[log]write %d time start!\n", i); + * I("[log]addr[3]=0x%02X, addr[2]=0x%02X, addr[1]=0x%02X, addr[0]=0x%02X!\n", tmp_addr[3], tmp_addr[2], tmp_addr[1], tmp_addr[0]); + * I("%s, write addr = 0x%02X%02X%02X%02X\n", __func__, tmp_addr[3], tmp_addr[2], tmp_addr[1], tmp_addr[0]); + */ + + if (total_size_temp >= max_bus_size) { + tmp_data = write_data+(i * max_bus_size); + if (himax_mcu_flash_write_burst_lenth(tmp_addr, tmp_data, max_bus_size) < 0) { + I("%s: i2c access fail!\n", __func__); + return I2C_FAIL; + } + total_size_temp = total_size_temp - max_bus_size; + } else { + tmp_data = write_data+(i * max_bus_size); + /* I("last total_size_temp=%d\n", total_size_temp % max_bus_size); */ + if (himax_mcu_flash_write_burst_lenth(tmp_addr, tmp_data, total_size_temp) < 0) { + I("%s: i2c access fail!\n", __func__); + return I2C_FAIL; + } + } + + /*I("[log]write %d time end!\n", i);*/ + address = ((i+1) * max_bus_size); + tmp_addr[0] = write_addr[0] + (uint8_t) ((address) & 0x00FF); + + if (tmp_addr[0] < write_addr[0]) + tmp_addr[1] = write_addr[1] + (uint8_t) ((address>>8) & 0x00FF) + 1; + else + tmp_addr[1] = write_addr[1] + (uint8_t) ((address>>8) & 0x00FF); + + udelay(100); + } + } else if (cfg_flag == 1) { + if (himax_bus_write(write_addr[0], write_data, write_length, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return I2C_FAIL; + } + } else + E("%s: cfg_flag = %d, value is wrong!\n", __func__, cfg_flag); + + return NO_ERR; +} + +static int himax_write_read_reg(uint8_t *tmp_addr, uint8_t *tmp_data, uint8_t hb, uint8_t lb) +{ + int cnt = 0; + + do { + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, tmp_data, 0); + usleep_range(10000, 11000); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, tmp_data, 0); + /* I("%s:Now tmp_data[0]=0x%02X,[1]=0x%02X,[2]=0x%02X,[3]=0x%02X\n", + * __func__, tmp_data[0], tmp_data[1], tmp_data[2], tmp_data[3]); + */ + } while ((tmp_data[1] != hb && tmp_data[0] != lb) && cnt++ < 100); + + if (cnt == 99) + return HX_RW_REG_FAIL; + + //I("Now register 0x%08X : high byte=0x%02X,low byte=0x%02X\n", tmp_addr[3], tmp_data[1], tmp_data[0]); + return NO_ERR; +} + +static void himax_mcu_interface_on(void) +{ + uint8_t tmp_data[DATA_LEN_4]; + uint8_t tmp_data2[DATA_LEN_4]; + int cnt = 0; + + /* Read a dummy register to wake up I2C.*/ + if (himax_bus_read(pic_op->addr_ahb_rdata_byte_0[0], tmp_data, DATA_LEN_4, HIMAX_I2C_RETRY_TIMES) < 0) {/* to knock I2C*/ + E("%s: i2c access fail!\n", __func__); + return; + } + + do { + tmp_data[0] = pic_op->data_conti[0]; + + if (himax_bus_write(pic_op->addr_conti[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return; + } + + tmp_data[0] = pic_op->data_incr4[0]; + + if (himax_bus_write(pic_op->addr_incr4[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return; + } + + /*Check cmd*/ + himax_bus_read(pic_op->addr_conti[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES); + himax_bus_read(pic_op->addr_incr4[0], tmp_data2, 1, HIMAX_I2C_RETRY_TIMES); + + if (tmp_data[0] == pic_op->data_conti[0] && tmp_data2[0] == pic_op->data_incr4[0]) + break; + + usleep_range(1000, 1100); + } while (++cnt < 10); + + if (cnt > 0) + I("%s:Polling burst mode: %d times\n", __func__, cnt); +} + +static bool himax_mcu_wait_wip(int Timing) +{ + uint8_t tmp_data[DATA_LEN_4]; + int retry_cnt = 0; + + g_core_fp.fp_register_write(pflash_op->addr_spi200_trans_fmt, DATA_LEN_4, pflash_op->data_spi200_trans_fmt, 0); + tmp_data[0] = 0x01; + + do { + g_core_fp.fp_register_write(pflash_op->addr_spi200_trans_ctrl, DATA_LEN_4, pflash_op->data_spi200_trans_ctrl_1, 0); + + g_core_fp.fp_register_write(pflash_op->addr_spi200_cmd, DATA_LEN_4, pflash_op->data_spi200_cmd_1, 0); + tmp_data[0] = tmp_data[1] = tmp_data[2] = tmp_data[3] = 0xFF; + g_core_fp.fp_register_read(pflash_op->addr_spi200_data, 4, tmp_data, 0); + + if ((tmp_data[0] & 0x01) == 0x00) + return true; + + retry_cnt++; + + if (tmp_data[0] != 0x00 || tmp_data[1] != 0x00 || tmp_data[2] != 0x00 || tmp_data[3] != 0x00) + I("%s:Wait wip retry_cnt:%d, buffer[0]=%d, buffer[1]=%d, buffer[2]=%d, buffer[3]=%d\n", + __func__, retry_cnt, tmp_data[0], tmp_data[1], tmp_data[2], tmp_data[3]); + + if (retry_cnt > 100) { + E("%s: Wait wip error!\n", __func__); + return false; + } + + msleep(Timing); + } while ((tmp_data[0] & 0x01) == 0x01); + + return true; +} + +static void himax_mcu_sense_on(uint8_t FlashMode) +{ + uint8_t tmp_data[DATA_LEN_4]; + int retry = 0; + + I("Enter %s\n", __func__); + g_core_fp.fp_interface_on(); + g_core_fp.fp_register_write(pfw_op->addr_ctrl_fw_isr, + sizeof(pfw_op->data_clear), pfw_op->data_clear, 0); + /*msleep(20);*/ + usleep_range(10000, 11000); + if (!FlashMode) { +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + g_core_fp.fp_system_reset(); +#endif + } else { + do { + g_core_fp.fp_register_write(pfw_op->addr_safe_mode_release_pw, + sizeof(pfw_op->data_safe_mode_release_pw_active), pfw_op->data_safe_mode_release_pw_active, 0); + + g_core_fp.fp_register_read(pfw_op->addr_flag_reset_event, DATA_LEN_4, tmp_data, 0); + I("%s:Read status from IC = %X,%X\n", __func__, tmp_data[0], tmp_data[1]); + } while ((tmp_data[1] != 0x01 || tmp_data[0] != 0x00) && retry++ < 5); + + if (retry >= 5) { + E("%s: Fail:\n", __func__); +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + g_core_fp.fp_system_reset(); +#endif + } else { + I("%s:OK and Read status from IC = %X,%X\n", __func__, tmp_data[0], tmp_data[1]); + /* reset code*/ + tmp_data[0] = 0x00; + + if (himax_bus_write(pic_op->adr_i2c_psw_lb[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) + E("%s: i2c access fail!\n", __func__); + + if (himax_bus_write(pic_op->adr_i2c_psw_ub[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) + E("%s: i2c access fail!\n", __func__); + + g_core_fp.fp_register_write(pfw_op->addr_safe_mode_release_pw, + sizeof(pfw_op->data_safe_mode_release_pw_reset), pfw_op->data_safe_mode_release_pw_reset, 0); + } + } +} + +static bool himax_mcu_sense_off(bool check_en) +{ + uint8_t cnt = 0; + uint8_t tmp_data[DATA_LEN_4]; + + do { + tmp_data[0] = pic_op->data_i2c_psw_lb[0]; + + if (himax_bus_write(pic_op->adr_i2c_psw_lb[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return false; + } + + tmp_data[0] = pic_op->data_i2c_psw_ub[0]; + + if (himax_bus_write(pic_op->adr_i2c_psw_ub[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return false; + } + + g_core_fp.fp_register_read(pic_op->addr_cs_central_state, ADDR_LEN_4, tmp_data, 0); + I("%s: Check enter_save_mode data[0]=%X\n", __func__, tmp_data[0]); + + if (tmp_data[0] == 0x0C) { + g_core_fp.fp_register_write(pic_op->addr_tcon_on_rst, DATA_LEN_4, pic_op->data_rst, 0); + usleep_range(1000, 1100); + tmp_data[3] = pic_op->data_rst[3]; + tmp_data[2] = pic_op->data_rst[2]; + tmp_data[1] = pic_op->data_rst[1]; + tmp_data[0] = pic_op->data_rst[0] | 0x01; + g_core_fp.fp_register_write(pic_op->addr_tcon_on_rst, DATA_LEN_4, tmp_data, 0); + + g_core_fp.fp_register_write(pic_op->addr_adc_on_rst, DATA_LEN_4, pic_op->data_rst, 0); + usleep_range(1000, 1100); + tmp_data[3] = pic_op->data_rst[3]; + tmp_data[2] = pic_op->data_rst[2]; + tmp_data[1] = pic_op->data_rst[1]; + tmp_data[0] = pic_op->data_rst[0] | 0x01; + g_core_fp.fp_register_write(pic_op->addr_adc_on_rst, DATA_LEN_4, tmp_data, 0); + goto TRUE_END; + } else { + /*msleep(10);*/ +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + g_core_fp.fp_system_reset(); +#endif + } + } while (cnt++ < 15); + + return false; +TRUE_END: + return true; +} + +static void himax_mcu_init_psl(void) /*power saving level*/ +{ + g_core_fp.fp_register_write(pic_op->addr_psl, sizeof(pic_op->data_rst), pic_op->data_rst, 0); + I("%s: power saving level reset OK!\n", __func__); +} + +static void himax_mcu_resume_ic_action(void) +{ + /* Nothing to do */ +} + +static void himax_mcu_suspend_ic_action(void) +{ + /* Nothing to do */ +} + +static void himax_mcu_power_on_init(void) +{ + I("%s:\n", __func__); + g_core_fp.fp_touch_information(); + /*RawOut select initial*/ + g_core_fp.fp_register_write(pfw_op->addr_raw_out_sel, sizeof(pfw_op->data_clear), pfw_op->data_clear, 0); + /*DSRAM func initial*/ + g_core_fp.fp_assign_sorting_mode(pfw_op->data_clear); + g_core_fp.fp_sense_on(0x00); +} + +static bool himax_mcu_dd_clk_set(bool enable) +{ + uint8_t data[4] = {0}; + + data[0] = (enable)?1:0; + return (g_core_fp.fp_register_write(pic_op->adr_osc_en, sizeof(pic_op->adr_osc_en), data, 0) == NO_ERR); +} + +static void himax_mcu_dd_reg_en(bool enable) +{ + uint8_t data[4] = {0}; + + g_core_fp.fp_dd_reg_read(0xCB, 8, 1, data, 0); + + if (data[0] != 0x44) { /*need DD Touch PW*/ + data[0] = 0xA5; data[1] = 0x00; + data[2] = 0x00; data[3] = 0x00; + g_core_fp.fp_register_write(pic_op->adr_osc_pw, DATA_LEN_4, data, 0); + data[0] = 0x00; data[1] = 0x55; + data[2] = 0xAA; data[3] = 0x00; + g_core_fp.fp_dd_reg_write(0xEB, 0, 4, data, 0); + } + + data[0] = 0x00; data[1] = 0x83; + data[2] = 0x11; data[3] = 0x2A; + g_core_fp.fp_dd_reg_write(0xB9, 0, 4, data, 0); +} + +static bool himax_mcu_dd_reg_write(uint8_t addr, uint8_t pa_num, int len, uint8_t *data, uint8_t bank) +{ + /*Calculate total write length*/ + uint32_t data_len = (((len + pa_num - 1) / 4 - pa_num / 4) + 1) * 4; + uint8_t *w_data; + uint8_t tmp_addr[4] = {0}; + uint8_t tmp_data[4] = {0}; + bool *chk_data; + uint32_t chk_idx = 0; + int i = 0; + bool retval = false; + + w_data = kzalloc(data_len * sizeof(uint8_t), GFP_KERNEL); + if (!w_data) { + E("%s: allocate w_data failed\n", __func__); + return retval; + } + + chk_data = kzalloc(data_len * sizeof(bool), GFP_KERNEL); + if (!chk_data) { + E("%s: allocate chk_data failed\n", __func__); + kfree(w_data); + return retval; + } + + /*put input data*/ + chk_idx = pa_num % 4; + for (i = 0; i < len; i++) { + w_data[chk_idx] = data[i]; + chk_data[chk_idx++] = true; + } + + /*get original data*/ + chk_idx = (pa_num / 4) * 4; + for (i = 0; i < data_len; i++) { + if (!chk_data[i]) { + g_core_fp.fp_dd_reg_read(addr, (uint8_t)(chk_idx + i), 1, tmp_data, bank); + w_data[i] = tmp_data[0]; + chk_data[i] = true; + } + D("%s w_data[%d] = %2X\n", __func__, i, w_data[i]); + } + + tmp_addr[3] = 0x30; + tmp_addr[2] = addr >> 4; + tmp_addr[1] = (addr << 4) | (bank * 4); + tmp_addr[0] = chk_idx; + D("%s Addr = %02X%02X%02X%02X.\n", __func__, tmp_addr[3], tmp_addr[2], tmp_addr[1], tmp_addr[0]); + + retval = g_core_fp.fp_register_write(tmp_addr, data_len, w_data, 0) == NO_ERR; + + kfree(chk_data); + kfree(w_data); + + return retval; +} + +static bool himax_mcu_dd_reg_read(uint8_t addr, uint8_t pa_num, int len, uint8_t *data, uint8_t bank) +{ + uint8_t tmp_addr[4] = {0}; + uint8_t tmp_data[4] = {0}; + int i = 0; + + for (i = 0; i < len; i++) { + tmp_addr[3] = 0x30; + tmp_addr[2] = addr >> 4; + tmp_addr[1] = (addr << 4) | (bank * 4); + tmp_addr[0] = pa_num + i; + + if (g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, tmp_data, 0)) + goto READ_FAIL; + data[i] = tmp_data[0]; + + D("%s Addr = %02X%02X%02X%02X.data = %2X\n", __func__, + tmp_addr[3], tmp_addr[2], tmp_addr[1], tmp_addr[0], data[i]); + } + return true; + +READ_FAIL: + E("%s Read DD reg Failed.\n", __func__); + return false; +} + +static bool himax_mcu_ic_id_read(void) +{ + int i = 0; + uint8_t data[4] = {0}; + + g_core_fp.fp_dd_clk_set(true); + g_core_fp.fp_dd_reg_en(true); + + for (i = 0; i < 13; i++) { + data[0] = 0x28 + i; + g_core_fp.fp_dd_reg_write(0xBB, 2, 1, data, 0); + data[0] = 0x80; + g_core_fp.fp_dd_reg_write(0xBB, 4, 1, data, 0); + data[0] = 0x00; + g_core_fp.fp_dd_reg_write(0xBB, 4, 1, data, 0); + g_core_fp.fp_dd_reg_read(0xBB, 5, 1, data, 0); + ic_data->vendor_ic_id[i] = data[0]; + I("ic_data->vendor_ic_id[%d] = %02X\n", i, ic_data->vendor_ic_id[i]); + } + + g_core_fp.fp_dd_clk_set(false); + + return true; +} + +/* IC side end*/ +#endif + +#ifdef CORE_FW +/* FW side start*/ +static void diag_mcu_parse_raw_data(struct himax_report_data *hx_touch_data, int mul_num, int self_num, uint8_t diag_cmd, int32_t *mutual_data, int32_t *self_data) +{ + int RawDataLen_word; + int index = 0; + int temp1, temp2, i; + + if (hx_touch_data->hx_rawdata_buf[0] == pfw_op->data_rawdata_ready_lb[0] + && hx_touch_data->hx_rawdata_buf[1] == pfw_op->data_rawdata_ready_hb[0] + && hx_touch_data->hx_rawdata_buf[2] > 0 + && hx_touch_data->hx_rawdata_buf[3] == diag_cmd) { + RawDataLen_word = hx_touch_data->rawdata_size / 2; + index = (hx_touch_data->hx_rawdata_buf[2] - 1) * RawDataLen_word; + + /* I("Header[%d]: %x, %x, %x, %x, mutual: %d, self: %d\n", index, buf[56], buf[57], buf[58], buf[59], mul_num, self_num); + * I("RawDataLen=%d , RawDataLen_word=%d , hx_touch_info_size=%d\n", RawDataLen, RawDataLen_word, hx_touch_info_size); + */ + for (i = 0; i < RawDataLen_word; i++) { + temp1 = index + i; + + if (temp1 < mul_num) { /*mutual*/ + mutual_data[index + i] = ((int8_t)hx_touch_data->hx_rawdata_buf[i * 2 + 4 + 1]) * 256 + hx_touch_data->hx_rawdata_buf[i * 2 + 4]; + } else { /*self*/ + temp1 = i + index; + temp2 = self_num + mul_num; + + if (temp1 >= temp2) + break; + + self_data[i + index - mul_num] = (((int8_t)hx_touch_data->hx_rawdata_buf[i * 2 + 4 + 1]) << 8) + + hx_touch_data->hx_rawdata_buf[i * 2 + 4]; + } + } + } +} + +static void himax_mcu_system_reset(void) +{ +#ifdef HX_PON_PIN_SUPPORT + g_core_fp.fp_register_write(pfw_op->addr_system_reset, sizeof(pfw_op->data_system_reset), pfw_op->data_system_reset, 0); +#else + uint8_t tmp_data[DATA_LEN_4]; + int retry = 0; + + g_core_fp.fp_interface_on(); + g_core_fp.fp_register_write(pfw_op->addr_ctrl_fw_isr, + sizeof(pfw_op->data_clear), pfw_op->data_clear, 0); + do { + /* reset code*/ + /* =========================================== + * I2C_password[7:0] set Enter safe mode : 0x31 ==> 0x27 + * =========================================== + */ + tmp_data[0] = pic_op->data_i2c_psw_lb[0]; + + if (himax_bus_write(pic_op->adr_i2c_psw_lb[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) + E("%s: i2c access fail!\n", __func__); + + /* =========================================== + * I2C_password[15:8] set Enter safe mode :0x32 ==> 0x95 + * =========================================== + */ + tmp_data[0] = pic_op->data_i2c_psw_ub[0]; + + if (himax_bus_write(pic_op->adr_i2c_psw_ub[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) + E("%s: i2c access fail!\n", __func__); + + /* =========================================== + * I2C_password[7:0] set Enter safe mode : 0x31 ==> 0x00 + * =========================================== + */ + tmp_data[0] = 0x00; + + if (himax_bus_write(pic_op->adr_i2c_psw_lb[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) + E("%s: i2c access fail!\n", __func__); + + usleep_range(10000, 11000); + + g_core_fp.fp_register_read(pfw_op->addr_flag_reset_event, DATA_LEN_4, tmp_data, 0); + I("%s:Read status from IC = %X,%X\n", __func__, tmp_data[0], tmp_data[1]); + } while ((tmp_data[1] != 0x02 || tmp_data[0] != 0x00) && retry++ < 5); +#endif +} + +static int himax_mcu_Calculate_CRC_with_AP(unsigned char *FW_content, int CRC_from_FW, int len) +{ + int i, j, length = 0; + int fw_data; + int fw_data_2; + int CRC = 0xFFFFFFFF; + int PolyNomial = 0x82F63B78; + + length = len / 4; + + for (i = 0; i < length; i++) { + fw_data = FW_content[i * 4]; + + for (j = 1; j < 4; j++) { + fw_data_2 = FW_content[i * 4 + j]; + fw_data += (fw_data_2) << (8 * j); + } + CRC = fw_data ^ CRC; + for (j = 0; j < 32; j++) { + if ((CRC % 2) != 0) + CRC = ((CRC >> 1) & 0x7FFFFFFF) ^ PolyNomial; + else + CRC = (((CRC >> 1) & 0x7FFFFFFF)/*& 0x7FFFFFFF*/); + } + } + + return CRC; +} + +static uint32_t himax_mcu_check_CRC(uint8_t *start_addr, int reload_length) +{ + uint32_t result = 0; + uint8_t tmp_data[DATA_LEN_4]; + int cnt = 0, ret = 0; + int length = reload_length / DATA_LEN_4; + uint8_t dbg_addr[4]; + uint8_t dbg_data[4]; + + ret = g_core_fp.fp_register_write(pfw_op->addr_reload_addr_from, DATA_LEN_4, start_addr, 0); + if (ret < NO_ERR) { + E("%s: i2c access fail!\n", __func__); + return HW_CRC_FAIL; + } + + tmp_data[3] = 0x00; tmp_data[2] = 0x99; tmp_data[1] = (length >> 8); tmp_data[0] = length; + ret = g_core_fp.fp_register_write(pfw_op->addr_reload_addr_cmd_beat, DATA_LEN_4, tmp_data, 0); + if (ret < NO_ERR) { + E("%s: i2c access fail!\n", __func__); + return HW_CRC_FAIL; + } + cnt = 0; + + do { + ret = g_core_fp.fp_register_read(pfw_op->addr_reload_status, DATA_LEN_4, tmp_data, 0); + if (ret < NO_ERR) { + E("%s: i2c access fail!\n", __func__); + return HW_CRC_FAIL; + } + + himax_in_parse_assign_cmd(fw_addr_flag_reset_event, dbg_addr, sizeof(dbg_addr)); + g_core_fp.fp_register_read(dbg_addr, 4, dbg_data, false); + D("%s: 0x900000E4 = %02X%02X%02X%02X\n", __func__, dbg_data[0], dbg_data[1], dbg_data[2], dbg_data[3]); + + if ((tmp_data[0] & 0x01) != 0x01) { + ret = g_core_fp.fp_register_read(pfw_op->addr_reload_crc32_result, DATA_LEN_4, tmp_data, 0); + if (ret < NO_ERR) { + E("%s: i2c access fail!\n", __func__); + return HW_CRC_FAIL; + } + I("%s: tmp_data[3]=%X, tmp_data[2]=%X, tmp_data[1]=%X, tmp_data[0]=%X\n", __func__, tmp_data[3], tmp_data[2], tmp_data[1], tmp_data[0]); + result = ((tmp_data[3] << 24) + (tmp_data[2] << 16) + (tmp_data[1] << 8) + tmp_data[0]); + goto END; + } else { + D("Waiting for HW ready!\n"); + usleep_range(1000, 1100); + } + + } while (cnt++ < 100); + E("%s: timeout, 0x900000E4 = %02X%02X%02X%02X\n", __func__, dbg_data[0], dbg_data[1], dbg_data[2], dbg_data[3]); + +END: + return result; +} + +static void himax_mcu_set_reload_cmd(uint8_t *write_data, int idx, uint32_t cmd_from, uint32_t cmd_to, uint32_t cmd_beat) +{ + int index = idx * 12; + int i; + + for (i = 3; i >= 0; i--) { + write_data[index + i] = (cmd_from >> (8 * i)); + write_data[index + 4 + i] = (cmd_to >> (8 * i)); + write_data[index + 8 + i] = (cmd_beat >> (8 * i)); + } +} + +static bool himax_mcu_program_reload(void) +{ + return true; +} + +#ifdef HX_P_SENSOR +static int himax_mcu_ulpm_in(void) +{ + uint8_t tmp_data[4]; + int rtimes = 0; + + I("%s:entering\n", __func__); + + /* 34 -> 11 */ + do { + if (rtimes > 10) { + I("%s:1/7 retry over 10 times!\n", __func__); + return false; + } + if (himax_bus_write(pfw_op->addr_ulpm_34[0], pfw_op->data_ulpm_11, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + I("%s: spi write fail!\n", __func__); + continue; + } + if (himax_bus_read(pfw_op->addr_ulpm_34[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + I("%s: spi read fail!\n", __func__); + continue; + } + + I("%s:retry times %d, addr = 0x34, correct 0x11 = current 0x%2.2X\n", __func__, rtimes, tmp_data[0]); + rtimes++; + } while (tmp_data[0] != pfw_op->data_ulpm_11[0]); + + rtimes = 0; + /* 34 -> 11 */ + do { + if (rtimes > 10) { + I("%s:2/7 retry over 10 times!\n", __func__); + return false; + } + if (himax_bus_write(pfw_op->addr_ulpm_34[0], pfw_op->data_ulpm_11, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + I("%s: spi write fail!\n", __func__); + continue; + } + if (himax_bus_read(pfw_op->addr_ulpm_34[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + I("%s: spi read fail!\n", __func__); + continue; + } + + I("%s:retry times %d, addr = 0x34, correct 0x11 = current 0x%2.2X\n", __func__, rtimes, tmp_data[0]); + rtimes++; + } while (tmp_data[0] != pfw_op->data_ulpm_11[0]); + + /* 33 -> 33 */ + rtimes = 0; + do { + if (rtimes > 10) { + I("%s:3/7 retry over 10 times!\n", __func__); + return false; + } + if (himax_bus_write(pfw_op->addr_ulpm_33[0], pfw_op->data_ulpm_33, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + I("%s: spi write fail!\n", __func__); + continue; + } + if (himax_bus_read(pfw_op->addr_ulpm_33[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + I("%s: spi read fail!\n", __func__); + continue; + } + + I("%s:retry times %d, addr = 0x33, correct 0x33 = current 0x%2.2X\n", __func__, rtimes, tmp_data[0]); + rtimes++; + } while (tmp_data[0] != pfw_op->data_ulpm_33[0]); + + /* 34 -> 22 */ + rtimes = 0; + do { + if (rtimes > 10) { + I("%s:4/7 retry over 10 times!\n", __func__); + return false; + } + if (himax_bus_write(pfw_op->addr_ulpm_34[0], pfw_op->data_ulpm_22, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + I("%s: spi write fail!\n", __func__); + continue; + } + if (himax_bus_read(pfw_op->addr_ulpm_34[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + I("%s: spi read fail!\n", __func__); + continue; + } + + I("%s:retry times %d, addr = 0x34, correct 0x22 = current 0x%2.2X\n", __func__, rtimes, tmp_data[0]); + rtimes++; + } while (tmp_data[0] != pfw_op->data_ulpm_22[0]); + + /* 33 -> AA */ + rtimes = 0; + do { + if (rtimes > 10) { + I("%s:5/7 retry over 10 times!\n", __func__); + return false; + } + if (himax_bus_write(pfw_op->addr_ulpm_33[0], pfw_op->data_ulpm_aa, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + I("%s: spi write fail!\n", __func__); + continue; + } + if (himax_bus_read(pfw_op->addr_ulpm_33[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + I("%s: spi read fail!\n", __func__); + continue; + } + + I("%s:retry times %d, addr = 0x33, correct 0xAA = current 0x%2.2X\n", __func__, rtimes, tmp_data[0]); + rtimes++; + } while (tmp_data[0] != pfw_op->data_ulpm_aa[0]); + + /* 33 -> 33 */ + rtimes = 0; + do { + if (rtimes > 10) { + I("%s:6/7 retry over 10 times!\n", __func__); + return false; + } + if (himax_bus_write(pfw_op->addr_ulpm_33[0], pfw_op->data_ulpm_33, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + I("%s: spi write fail!\n", __func__); + continue; + } + if (himax_bus_read(pfw_op->addr_ulpm_33[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + I("%s: spi read fail!\n", __func__); + continue; + } + + I("%s:retry times %d, addr = 0x33, correct 0x33 = current 0x%2.2X\n", __func__, rtimes, tmp_data[0]); + rtimes++; + } while (tmp_data[0] != pfw_op->data_ulpm_33[0]); + + /* 33 -> AA */ + rtimes = 0; + do { + if (rtimes > 10) { + I("%s:7/7 retry over 10 times!\n", __func__); + return false; + } + if (himax_bus_write(pfw_op->addr_ulpm_33[0], pfw_op->data_ulpm_aa, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + I("%s: spi write fail!\n", __func__); + continue; + } + if (himax_bus_read(pfw_op->addr_ulpm_33[0], tmp_data, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + I("%s: spi read fail!\n", __func__); + continue; + } + + I("%s:retry times %d, addr = 0x33, correct 0xAA = current 0x%2.2X\n", __func__, rtimes, tmp_data[0]); + rtimes++; + } while (tmp_data[0] != pfw_op->data_ulpm_aa[0]); + + I("%s:END\n", __func__); + return true; +} + +static int himax_mcu_black_gest_ctrl(bool enable) +{ + int ret = 0; + + I("%s:enable=%d, ts->is_suspended=%d\n", __func__, enable, private_ts->suspended); + + if (private_ts->suspended) { + if (enable) { +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + I("%s: Please enable TP reset define\n", __func__); +#endif + } else { + g_core_fp.fp_ulpm_in(); + } + } else { + g_core_fp.fp_sense_on(0); + } + return ret; +} +#endif + +static void himax_mcu_set_SMWP_enable(uint8_t SMWP_enable, bool suspended) +{ + uint8_t tmp_data[DATA_LEN_4]; + uint8_t back_data[DATA_LEN_4]; + uint8_t retry_cnt = 0; + + I("%s: enable:%d, suspended=%d\n", __func__, SMWP_enable, suspended); + + do { + if (SMWP_enable) { + himax_in_parse_assign_cmd(fw_func_handshaking_pwd, tmp_data, 4); + g_core_fp.fp_register_write(pfw_op->addr_smwp_enable, DATA_LEN_4, tmp_data, 0); + himax_in_parse_assign_cmd(fw_func_handshaking_pwd, back_data, 4); + } else { + himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, tmp_data, 4); + g_core_fp.fp_register_write(pfw_op->addr_smwp_enable, DATA_LEN_4, tmp_data, 0); + himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, back_data, 4); + } + + g_core_fp.fp_register_read(pfw_op->addr_smwp_enable, DATA_LEN_4, tmp_data, 0); + /*I("%s: tmp_data[0]=%d, SMWP_enable=%d, retry_cnt=%d\n", __func__, tmp_data[0],SMWP_enable,retry_cnt);*/ + retry_cnt++; + } while ((tmp_data[3] != back_data[3] || tmp_data[2] != back_data[2] || tmp_data[1] != back_data[1] || tmp_data[0] != back_data[0]) && retry_cnt < HIMAX_REG_RETRY_TIMES); +} + +static void himax_mcu_set_HSEN_enable(uint8_t HSEN_enable, bool suspended) +{ + uint8_t tmp_data[DATA_LEN_4]; + uint8_t back_data[DATA_LEN_4]; + uint8_t retry_cnt = 0; + + I("%s: enable:%d, suspended=%d\n", __func__, HSEN_enable, suspended); + + do { + if (HSEN_enable) { + himax_in_parse_assign_cmd(fw_func_handshaking_pwd, tmp_data, 4); + g_core_fp.fp_register_write(pfw_op->addr_hsen_enable, DATA_LEN_4, tmp_data, 0); + himax_in_parse_assign_cmd(fw_func_handshaking_pwd, back_data, 4); + } else { + himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, tmp_data, 4); + g_core_fp.fp_register_write(pfw_op->addr_hsen_enable, DATA_LEN_4, tmp_data, 0); + himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, back_data, 4); + } + + g_core_fp.fp_register_read(pfw_op->addr_hsen_enable, DATA_LEN_4, tmp_data, 0); + /*I("%s: tmp_data[0]=%d, HSEN_enable=%d, retry_cnt=%d\n", __func__, tmp_data[0],HSEN_enable,retry_cnt);*/ + retry_cnt++; + } while ((tmp_data[3] != back_data[3] || tmp_data[2] != back_data[2] || tmp_data[1] != back_data[1] || tmp_data[0] != back_data[0]) && retry_cnt < HIMAX_REG_RETRY_TIMES); +} + +static void himax_mcu_usb_detect_set(uint8_t *cable_config) +{ + uint8_t tmp_data[DATA_LEN_4]; + uint8_t back_data[DATA_LEN_4]; + uint8_t retry_cnt = 0; + + do { + if (cable_config[1] == 0x01) { + himax_in_parse_assign_cmd(fw_func_handshaking_pwd, tmp_data, 4); + g_core_fp.fp_register_write(pfw_op->addr_usb_detect, DATA_LEN_4, tmp_data, 0); + himax_in_parse_assign_cmd(fw_func_handshaking_pwd, back_data, 4); + I("%s: USB detect status IN!\n", __func__); + } else { + himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, tmp_data, 4); + g_core_fp.fp_register_write(pfw_op->addr_usb_detect, DATA_LEN_4, tmp_data, 0); + himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, back_data, 4); + I("%s: USB detect status OUT!\n", __func__); + } + + g_core_fp.fp_register_read(pfw_op->addr_usb_detect, DATA_LEN_4, tmp_data, 0); + /*I("%s: tmp_data[0]=%d, USB detect=%d, retry_cnt=%d\n", __func__, tmp_data[0],cable_config[1] ,retry_cnt);*/ + retry_cnt++; + } while ((tmp_data[3] != back_data[3] || tmp_data[2] != back_data[2] || tmp_data[1] != back_data[1] || tmp_data[0] != back_data[0]) && retry_cnt < HIMAX_REG_RETRY_TIMES); +} + +static void himax_mcu_diag_register_set(uint8_t diag_command, uint8_t storage_type) +{ + uint8_t tmp_data[DATA_LEN_4]; + uint8_t back_data[DATA_LEN_4]; + uint8_t cnt = 50; + + if (diag_command > 0 && storage_type % 8 > 0) + tmp_data[0] = diag_command + 0x08; + else + tmp_data[0] = diag_command; + I("diag_command = %d, tmp_data[0] = %X\n", diag_command, tmp_data[0]); + g_core_fp.fp_interface_on(); + tmp_data[3] = 0x00; tmp_data[2] = 0x00; tmp_data[1] = 0x00; + do { + g_core_fp.fp_register_write(pfw_op->addr_raw_out_sel, DATA_LEN_4, tmp_data, 0); + g_core_fp.fp_register_read(pfw_op->addr_raw_out_sel, DATA_LEN_4, back_data, 0); + I("%s: back_data[3]=0x%02X,back_data[2]=0x%02X,back_data[1]=0x%02X,back_data[0]=0x%02X!\n", + __func__, back_data[3], back_data[2], back_data[1], back_data[0]); + cnt--; + } while (tmp_data[0] != back_data[0] && cnt > 0); +} + +static int himax_mcu_chip_self_test(void) +{ + uint8_t tmp_data[FLASH_WRITE_BURST_SZ]; + uint8_t self_test_info[20]; + int pf_value = 0x00; + uint8_t test_result_id = 0; + int i; + + memset(tmp_data, 0x00, sizeof(tmp_data)); + g_core_fp.fp_interface_on(); + g_core_fp.fp_sense_off(true); + g_core_fp.fp_burst_enable(1); + g_core_fp.fp_register_write(pfw_op->addr_selftest_addr_en, DATA_LEN_4, pfw_op->data_selftest_request, 0); + /*Set criteria 0x10007F1C [0,1]=aa/up,down=, [2-3]=key/up,down, [4-5]=avg/up,down*/ + tmp_data[0] = pfw_op->data_criteria_aa_top[0]; + tmp_data[1] = pfw_op->data_criteria_aa_bot[0]; + tmp_data[2] = pfw_op->data_criteria_key_top[0]; + tmp_data[3] = pfw_op->data_criteria_key_bot[0]; + tmp_data[4] = pfw_op->data_criteria_avg_top[0]; + tmp_data[5] = pfw_op->data_criteria_avg_bot[0]; + tmp_data[6] = 0x00; + tmp_data[7] = 0x00; + g_core_fp.fp_register_write(pfw_op->addr_criteria_addr, FLASH_WRITE_BURST_SZ, tmp_data, 0); + g_core_fp.fp_register_write(pfw_op->addr_set_frame_addr, DATA_LEN_4, pfw_op->data_set_frame, 0); + /*Disable IDLE Mode*/ + g_core_fp.fp_idle_mode(1); + /*Diable Flash Reload*/ + g_core_fp.fp_reload_disable(1); + /*start selftest // leave safe mode*/ + g_core_fp.fp_sense_on(0x01); + + /*Hand shaking*/ + for (i = 0; i < 1000; i++) { + g_core_fp.fp_register_read(pfw_op->addr_selftest_addr_en, 4, tmp_data, 0); + I("%s: tmp_data[0] = 0x%02X,tmp_data[1] = 0x%02X,tmp_data[2] = 0x%02X,tmp_data[3] = 0x%02X, cnt=%d\n", + __func__, tmp_data[0], tmp_data[1], tmp_data[2], tmp_data[3], i); + usleep_range(10000, 11000); + + if (tmp_data[1] == pfw_op->data_selftest_ack_hb[0] && tmp_data[0] == pfw_op->data_selftest_ack_lb[0]) { + I("%s Data ready goto moving data\n", __func__); + break; + } + } + + g_core_fp.fp_sense_off(true); + msleep(20); + /* ===================================== + * Read test result ==> bit[2][1][0] = [key][AA][avg] => 0xF = PASS + * ===================================== + */ + g_core_fp.fp_register_read(pfw_op->addr_selftest_result_addr, 20, self_test_info, 0); + test_result_id = self_test_info[0]; + I("%s: check test result, test_result_id=%x, test_result=%x\n", __func__ + , test_result_id, self_test_info[0]); + I("raw top 1 = %d\n", self_test_info[3] * 256 + self_test_info[2]); + I("raw top 2 = %d\n", self_test_info[5] * 256 + self_test_info[4]); + I("raw top 3 = %d\n", self_test_info[7] * 256 + self_test_info[6]); + I("raw last 1 = %d\n", self_test_info[9] * 256 + self_test_info[8]); + I("raw last 2 = %d\n", self_test_info[11] * 256 + self_test_info[10]); + I("raw last 3 = %d\n", self_test_info[13] * 256 + self_test_info[12]); + I("raw key 1 = %d\n", self_test_info[15] * 256 + self_test_info[14]); + I("raw key 2 = %d\n", self_test_info[17] * 256 + self_test_info[16]); + I("raw key 3 = %d\n", self_test_info[19] * 256 + self_test_info[18]); + + if (test_result_id == pfw_op->data_selftest_pass[0]) { + I("[Himax]: self-test pass\n"); + pf_value = 0x0; + } else { + E("[Himax]: self-test fail\n"); + /* E("[Himax]: bank_avg = %d, bank_max = %d,%d,%d, bank_min = %d,%d,%d, key = %d,%d,%d\n", + * tmp_data[1],tmp_data[2],tmp_data[3],tmp_data[4],tmp_data[5],tmp_data[6],tmp_data[7], + * tmp_data[8],tmp_data[9],tmp_data[10]); + */ + pf_value = 0x1; + } + + /*Enable IDLE Mode*/ + g_core_fp.fp_idle_mode(0); +#ifndef HX_ZERO_FLASH + /* Enable Flash Reload //recovery*/ + g_core_fp.fp_reload_disable(0); +#endif + g_core_fp.fp_sense_on(0x00); + msleep(120); + return pf_value; +} + +static void himax_mcu_idle_mode(int disable) +{ + int retry = 20; + uint8_t tmp_data[DATA_LEN_4]; + uint8_t switch_cmd = 0x00; + + I("%s:entering\n", __func__); + + do { + I("%s,now %d times!\n", __func__, retry); + g_core_fp.fp_register_read(pfw_op->addr_fw_mode_status, DATA_LEN_4, tmp_data, 0); + + if (disable) + tmp_data[0] &= ~(1 << 3); + else + tmp_data[0] |= (1 << 3); + + switch_cmd = tmp_data[0]; + g_core_fp.fp_register_write(pfw_op->addr_fw_mode_status, DATA_LEN_4, tmp_data, 0); + g_core_fp.fp_register_read(pfw_op->addr_fw_mode_status, DATA_LEN_4, tmp_data, 0); + I("%s:After turn ON/OFF IDLE Mode [0] = 0x%02X,[1] = 0x%02X,[2] = 0x%02X,[3] = 0x%02X\n", + __func__, tmp_data[0], tmp_data[1], tmp_data[2], tmp_data[3]); + retry--; + usleep_range(10000, 11000); + } while ((tmp_data[0] != switch_cmd) && retry > 0); + + I("%s: setting OK!\n", __func__); +} + +static void himax_mcu_reload_disable(int disable) +{ + I("%s:entering\n", __func__); + + if (disable) { /*reload disable*/ + g_core_fp.fp_register_write(pdriver_op->addr_fw_define_flash_reload, DATA_LEN_4, pdriver_op->data_fw_define_flash_reload_dis, 0); + } else { /*reload enable*/ + g_core_fp.fp_register_write(pdriver_op->addr_fw_define_flash_reload, DATA_LEN_4, pdriver_op->data_fw_define_flash_reload_en, 0); + } + + I("%s: setting OK!\n", __func__); +} + +static bool himax_mcu_check_chip_version(void) +{ + uint8_t tmp_data[DATA_LEN_4]; + uint8_t ret_data = false; + int i = 0; + + for (i = 0; i < 5; i++) { + g_core_fp.fp_register_read(pfw_op->addr_icid_addr, DATA_LEN_4, tmp_data, 0); + I("%s:Read driver IC ID = %X,%X,%X\n", __func__, tmp_data[3], tmp_data[2], tmp_data[1]); + + if ((tmp_data[3] == 0x83) && (tmp_data[2] == 0x10) && (tmp_data[1] == 0x2a)) { + strlcpy(private_ts->chip_name, HX_83102A_SERIES_PWON, 30); + ret_data = true; + goto END; + } else { + ret_data = false; + E("%s:Read driver ID register Fail:\n", __func__); + } + } +END: + return ret_data; +} + +static int himax_mcu_read_ic_trigger_type(void) +{ + uint8_t tmp_data[DATA_LEN_4]; + int trigger_type = false; + + g_core_fp.fp_register_read(pfw_op->addr_trigger_addr, DATA_LEN_4, tmp_data, 0); + + if ((tmp_data[1] & 0x01) == 1) + trigger_type = true; + + return trigger_type; +} + +static int himax_mcu_read_i2c_status(void) +{ + return i2c_error_count; +} + +static void himax_mcu_read_FW_ver(void) +{ + uint8_t data[12]; + uint8_t data_2[DATA_LEN_4] = { 0 }; + int retry = 200; + int reload_status = 0; + + g_core_fp.fp_register_write(pdriver_op->addr_fw_define_2nd_flash_reload, DATA_LEN_4, data_2, 0); + + g_core_fp.fp_sense_on(0x00); + + while (reload_status == 0) { + //g_core_fp.fp_register_read(pdriver_op->addr_fw_define_flash_reload, DATA_LEN_4, data, 0); + g_core_fp.fp_register_read(pdriver_op->addr_fw_define_2nd_flash_reload, DATA_LEN_4, data_2, 0); + + if (data_2[3] == 0x00 && data_2[2] == 0x00 + && data_2[1] == 0x72 && data_2[0] == 0xC0) { + I("reload OK!\n"); + reload_status = 1; + break; + } else if (retry == 0) { + E("reload 20 times! fail\n"); + E("Maybe NOT have FW in chipset\n"); + E("Maybe Wrong FW in chipset\n"); + ic_data->vendor_panel_ver = 0; + ic_data->vendor_fw_ver = 0; + ic_data->vendor_config_ver = 0; + ic_data->vendor_touch_cfg_ver = 0; + ic_data->vendor_display_cfg_ver = 0; + ic_data->vendor_cid_maj_ver = 0; + ic_data->vendor_cid_min_ver = 0; + g_core_fp.fp_sense_off(true); + goto END; + } else { + retry--; + usleep_range(10000, 11000); + if (retry % 10 == 0) + I("reload fail ,delay 10ms retry=%d\n", retry); + } + } + + I("%s : data_2[3]=0x%2.2X,data_2[2]=0x%2.2X,data_2[1]=0x%2.2X,data_2[0]=0x%2.2X\n", __func__, data_2[3], data_2[2], data_2[1], data_2[0]); + I("reload_status=%d\n", reload_status); + /* ===================================== + * Read FW version + * ===================================== + */ + g_core_fp.fp_sense_off(true); + g_core_fp.fp_register_read(pfw_op->addr_fw_ver_addr, DATA_LEN_4, data, 0); + ic_data->vendor_panel_ver = data[0]; + ic_data->vendor_fw_ver = data[1] << 8 | data[2]; + I("PANEL_VER : %X\n", ic_data->vendor_panel_ver); + I("FW_VER : %X\n", ic_data->vendor_fw_ver); + g_core_fp.fp_register_read(pfw_op->addr_fw_cfg_addr, DATA_LEN_4, data, 0); + ic_data->vendor_config_ver = data[2] << 8 | data[3]; + /*I("CFG_VER : %X\n",ic_data->vendor_config_ver);*/ + ic_data->vendor_touch_cfg_ver = data[2]; + I("TOUCH_VER : %X\n", ic_data->vendor_touch_cfg_ver); + ic_data->vendor_display_cfg_ver = data[3]; + I("DISPLAY_VER : %X\n", ic_data->vendor_display_cfg_ver); + g_core_fp.fp_register_read(pfw_op->addr_fw_vendor_addr, DATA_LEN_4, data, 0); + ic_data->vendor_cid_maj_ver = data[2]; + ic_data->vendor_cid_min_ver = data[3]; + I("CID_VER : %X\n", (ic_data->vendor_cid_maj_ver << 8 | ic_data->vendor_cid_min_ver)); + g_core_fp.fp_register_read(pfw_op->addr_cus_info, 12, data, 0); + memcpy(ic_data->vendor_cus_info, data, 12); + I("Cusomer ID = %s\n", ic_data->vendor_cus_info); + g_core_fp.fp_register_read(pfw_op->addr_proj_info, 12, data, 0); + memcpy(ic_data->vendor_proj_info, data, 12); + I("Project ID = %s\n", ic_data->vendor_proj_info); + +END: + return; +} + +static bool himax_mcu_read_event_stack(uint8_t *buf, uint8_t length) +{ + uint8_t cmd[DATA_LEN_4]; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) + struct timespec64 t_start, t_end, t_delta; +#else + struct timespec t_start, t_end, t_delta; +#endif + int len = length; + int i2c_speed = 0; + + /* AHB_I2C Burst Read Off */ + cmd[0] = pfw_op->data_ahb_dis[0]; + + if (himax_bus_write(pfw_op->addr_ahb_addr[0], cmd, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return 0; + } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) + if (private_ts->debug_log_level & BIT(2)) + ktime_get_real_ts64(&t_start); +#else + if (private_ts->debug_log_level & BIT(2)) + getnstimeofday(&t_start); +#endif + himax_bus_read(pfw_op->addr_event_addr[0], buf, length, HIMAX_I2C_RETRY_TIMES); + + if (private_ts->debug_log_level & BIT(2)) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)) + ktime_get_real_ts64(&t_end); +#else + getnstimeofday(&t_end); +#endif + t_delta.tv_nsec = (t_end.tv_sec * 1000000000 + t_end.tv_nsec) - (t_start.tv_sec * 1000000000 + t_start.tv_nsec); /*ns*/ + i2c_speed = (len * 9 * 1000000 / (int)t_delta.tv_nsec) * 13 / 10; + private_ts->bus_speed = (int)i2c_speed; + } + + /* AHB_I2C Burst Read On */ + cmd[0] = pfw_op->data_ahb_en[0]; + + if (himax_bus_write(pfw_op->addr_ahb_addr[0], cmd, 1, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return 0; + } + + return 1; +} + +static void himax_mcu_return_event_stack(void) +{ + int retry = 20, i; + uint8_t tmp_data[DATA_LEN_4]; + + I("%s:entering\n", __func__); + + do { + I("now %d times!\n", retry); + + for (i = 0; i < DATA_LEN_4; i++) + tmp_data[i] = psram_op->addr_rawdata_end[i]; + + g_core_fp.fp_register_write(psram_op->addr_rawdata_addr, DATA_LEN_4, tmp_data, 0); + g_core_fp.fp_register_read(psram_op->addr_rawdata_addr, DATA_LEN_4, tmp_data, 0); + retry--; + usleep_range(10000, 11000); + } while ((tmp_data[1] != psram_op->addr_rawdata_end[1] && tmp_data[0] != psram_op->addr_rawdata_end[0]) && retry > 0); + + I("%s: End of setting!\n", __func__); +} + +static bool himax_mcu_calculateChecksum(bool change_iref, uint32_t size) +{ + uint32_t CRC_result = 0xFFFFFFFF; + uint8_t i; + uint8_t tmp_data[DATA_LEN_4]; + + I("%s:Now size=%d\n", __func__, size); + for (i = 0; i < DATA_LEN_4; i++) + tmp_data[i] = psram_op->addr_rawdata_end[i]; + + CRC_result = g_core_fp.fp_check_CRC(tmp_data, size); + msleep(50); + + if (CRC_result != 0) + I("%s: CRC Fail=%d\n", __func__, CRC_result); + + return (CRC_result == 0) ? true : false; +} + +static int himax_mcu_read_FW_status(uint8_t *state_addr, uint8_t *tmp_addr) +{ + uint8_t i; + uint8_t req_size = 0; + uint8_t status_addr[DATA_LEN_4]; + uint8_t cmd_addr[DATA_LEN_4]; + + if (state_addr[0] == 0x01) { + state_addr[1] = 0x04; + + for (i = 0; i < DATA_LEN_4; i++) { + state_addr[i + 2] = pfw_op->addr_fw_dbg_msg_addr[i]; + status_addr[i] = pfw_op->addr_fw_dbg_msg_addr[i]; + } + + req_size = 0x04; + g_core_fp.fp_register_read(status_addr, req_size, tmp_addr, 0); + } else if (state_addr[0] == 0x02) { + state_addr[1] = 0x30; + + for (i = 0; i < DATA_LEN_4; i++) { + state_addr[i + 2] = pfw_op->addr_fw_dbg_msg_addr[i]; + cmd_addr[i] = pfw_op->addr_fw_dbg_msg_addr[i]; + } + + req_size = 0x30; + g_core_fp.fp_register_read(cmd_addr, req_size, tmp_addr, 0); + } + + return NO_ERR; +} + +static void himax_mcu_irq_switch(int switch_on) +{ + if (switch_on) { + if (private_ts->use_irq) + himax_int_enable(switch_on); + else + hrtimer_start(&private_ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL); + + } else { + if (private_ts->use_irq) + himax_int_enable(switch_on); + else { + hrtimer_cancel(&private_ts->timer); + cancel_work_sync(&private_ts->work); + } + } +} + +static int himax_mcu_assign_sorting_mode(uint8_t *tmp_data) +{ + + I("%s:Now tmp_data[3]=0x%02X,tmp_data[2]=0x%02X,tmp_data[1]=0x%02X,tmp_data[0]=0x%02X\n", __func__, tmp_data[3], tmp_data[2], tmp_data[1], tmp_data[0]); + g_core_fp.fp_register_write(pfw_op->addr_sorting_mode_en, DATA_LEN_4, tmp_data, 0); + + return NO_ERR; +} + +static int himax_mcu_check_sorting_mode(uint8_t *tmp_data) +{ + + g_core_fp.fp_register_read(pfw_op->addr_sorting_mode_en, DATA_LEN_4, tmp_data, 0); + D("%s: tmp_data[0]=%x,tmp_data[1]=%x\n", __func__, tmp_data[0], tmp_data[1]); + + return NO_ERR; +} + +static int himax_mcu_switch_mode(int mode) +{ + uint8_t tmp_data[DATA_LEN_4]; + uint8_t mode_wirte_cmd; + uint8_t mode_read_cmd; + int result = -1; + int retry = 200; + + I("%s: Entering\n", __func__); + + if (mode == 0) { /* normal mode */ + mode_wirte_cmd = pfw_op->data_normal_cmd[0]; + mode_read_cmd = pfw_op->data_normal_status[0]; + } else { /* sorting mode */ + mode_wirte_cmd = pfw_op->data_sorting_cmd[0]; + mode_read_cmd = pfw_op->data_sorting_status[0]; + } + + g_core_fp.fp_sense_off(true); + /*g_core_fp.fp_interface_on();*/ + /* clean up FW status */ + g_core_fp.fp_register_write(psram_op->addr_rawdata_addr, DATA_LEN_4, psram_op->addr_rawdata_end, 0); + tmp_data[3] = 0x00; + tmp_data[2] = 0x00; + tmp_data[1] = mode_wirte_cmd; + tmp_data[0] = mode_wirte_cmd; + g_core_fp.fp_assign_sorting_mode(tmp_data); + g_core_fp.fp_idle_mode(1); + g_core_fp.fp_reload_disable(1); + + /* To stable the sorting*/ + if (mode) { + g_core_fp.fp_register_write(pdriver_op->addr_fw_define_rxnum_txnum_maxpt, DATA_LEN_4, pdriver_op->data_fw_define_rxnum_txnum_maxpt_sorting, 0); + } else { + g_core_fp.fp_register_write(pfw_op->addr_set_frame_addr, DATA_LEN_4, pfw_op->data_set_frame, 0); + g_core_fp.fp_register_write(pdriver_op->addr_fw_define_rxnum_txnum_maxpt, DATA_LEN_4, pdriver_op->data_fw_define_rxnum_txnum_maxpt_normal, 0); + } + + g_core_fp.fp_sense_on(0x01); + + while (retry != 0) { + I("[%d] %s Read\n", retry, __func__); + g_core_fp.fp_check_sorting_mode(tmp_data); + msleep(100); + I("mode_read_cmd(0)=0x%2.2X,mode_read_cmd(1)=0x%2.2X\n", tmp_data[0], tmp_data[1]); + + if (tmp_data[0] == mode_read_cmd && tmp_data[1] == mode_read_cmd) { + I("Read OK!\n"); + result = 0; + break; + } + + g_core_fp.fp_register_read(pfw_op->addr_chk_fw_status, DATA_LEN_4, tmp_data, 0); + + if (tmp_data[0] == 0x00 && tmp_data[1] == 0x00 && tmp_data[2] == 0x00 && tmp_data[3] == 0x00) { + E("%s,: FW Stop!\n", __func__); + break; + } + + retry--; + } + + if (result == 0) { + if (mode == 0) { /*normal mode*/ + return HX_NORMAL_MODE; + } else { /*sorting mode*/ + return HX_SORTING_MODE; + } + } else { /*change mode fail*/ + return HX_CHANGE_MODE_FAIL; + } +} + +static uint8_t himax_mcu_read_DD_status(uint8_t *cmd_set, uint8_t *tmp_data) +{ + int cnt = 0; + uint8_t req_size = cmd_set[0]; + + cmd_set[3] = pfw_op->data_dd_request[0]; + g_core_fp.fp_register_write(pfw_op->addr_dd_handshak_addr, DATA_LEN_4, cmd_set, 0); + I("%s: cmd_set[0] = 0x%02X,cmd_set[1] = 0x%02X,cmd_set[2] = 0x%02X,cmd_set[3] = 0x%02X\n", + __func__, cmd_set[0], cmd_set[1], cmd_set[2], cmd_set[3]); + + /* Doing hand shaking 0xAA -> 0xBB */ + for (cnt = 0; cnt < 100; cnt++) { + g_core_fp.fp_register_read(pfw_op->addr_dd_handshak_addr, DATA_LEN_4, tmp_data, 0); + usleep_range(10000, 11000); + + if (tmp_data[3] == pfw_op->data_dd_ack[0]) { + I("%s Data ready goto moving data\n", __func__); + goto FINALIZE; + } else { + if (cnt >= 99) { + I("%s Data not ready in FW\n", __func__); + return FW_NOT_READY; + } + } + } +FINALIZE: + g_core_fp.fp_register_read(pfw_op->addr_dd_data_addr, req_size, tmp_data, 0); + return NO_ERR; +} +#ifdef HX_AUTO_UPDATE_FW +static int hx_mcu_diff_overlay_bin(void) +{ + int rslt = 0; + int diff_val = 0; + + diff_val = g_i_FW_VER; + I("%s:Now fw ID is 0x%04X\n", __func__, diff_val); + diff_val = (diff_val >> 12); + I("%s:Now diff value=0x%04X\n", __func__, diff_val); + + if (diff_val == 1) + I("%s:Now size should be 128K!\n", __func__); + else + I("%s:Now size should be 64K!\n", __func__); + rslt = diff_val; + return rslt; +} +#endif + +#ifdef SEC_FACTORY_MODE +int hx_mcu_set_edge_border(int set_val) +{ + int ret = NO_ERR; + int retry = 10; + uint8_t tmp_data[DATA_LEN_4] = { 0 }; + + I("%s %s:Now set_val=%d\n", + HIMAX_LOG_TAG, __func__, set_val); + do { + g_core_fp.fp_register_read(pfw_op->addr_edge_border, DATA_LEN_4, + tmp_data, 0); + I("%s:Now [0]=0x%02X,[1]=0x%02X,[2]=0x%02X,[3]=0x%02X\n", + __func__, tmp_data[0], tmp_data[1], tmp_data[2], + tmp_data[3]); + + I("%s Now write value\n", HIMAX_LOG_TAG); + + tmp_data[0] = set_val; + g_core_fp.fp_register_write(pfw_op->addr_edge_border, + DATA_LEN_4, tmp_data, false); + I("%s 1. After write value\n", HIMAX_LOG_TAG); + g_core_fp.fp_register_read(pfw_op->addr_edge_border, DATA_LEN_4, + tmp_data, 0); + I("%s %s:Now [0]=0x%02X,[1]=0x%02X,[2]=0x%02X,[3]=0x%02X\n", + HIMAX_LOG_TAG, __func__, tmp_data[0], tmp_data[1], + tmp_data[2], tmp_data[3]); + + I("%s 2. After write value\n", HIMAX_LOG_TAG); + g_core_fp.fp_register_read(pfw_op->addr_edge_border, DATA_LEN_4, + tmp_data, 0); + I("%s %s:Now [0]=0x%02X,[1]=0x%02X,[2]=0x%02X,[3]=0x%02X\n", + HIMAX_LOG_TAG, __func__, tmp_data[0], tmp_data[1], + tmp_data[2], tmp_data[3]); + I("%s Now_val=%d, retry times=%d\n", HIMAX_LOG_TAG, + tmp_data[0], retry); + } while (tmp_data[0] != set_val && retry-- > 0); + if (retry <= 0 && tmp_data[0] != set_val) { + I("%s %s:Fail to set value=%d!\n", HIMAX_LOG_TAG, + __func__, tmp_data[0]); + ret = -1; + } + return ret; +} + +#if 0 +int hx_mcu_set_cal_switch(int set_val) +{ + int ret = NO_ERR; + int retry = 10; + int now_val = 0; + uint8_t tmp_data[DATA_LEN_4] = { 0 }; + + I("%s %s:Now set_val=%d\n", + HIMAX_LOG_TAG, __func__, set_val); + do { + g_core_fp.fp_register_read(pfw_op->addr_cal, DATA_LEN_4, + tmp_data, 0); + I("%s %s:Now [0]=0x%02X,[1]=0x%02X,[2]=0x%02X,[3]=0x%02X\n", + HIMAX_LOG_TAG, __func__, tmp_data[0], tmp_data[1], + tmp_data[2], tmp_data[3]); + + I("%s before write tmp_data[2]=0x%02X\n", + HIMAX_LOG_TAG, tmp_data[0]); + I("%s Now write value\n", HIMAX_LOG_TAG); + I("%s Sense off\n", HIMAX_LOG_TAG); + g_core_fp.fp_sense_off(true); + I("%s Disable reload!\n", HIMAX_LOG_TAG); + g_core_fp.fp_reload_disable(1); + /*clear bit*/ + tmp_data[0] = tmp_data[0] & 0xFB; /* force value of 2th bit to zero */ + I("%s After clear bit tmp_data[0]=0x%02X\n", + HIMAX_LOG_TAG, tmp_data[0]); + + tmp_data[0] = tmp_data[0] | (set_val << 2); /* change the value of 2th bit */ + I("%s After assign tmp_data[0]=0x%02X\n", + HIMAX_LOG_TAG, tmp_data[0]); + g_core_fp.fp_register_write(pfw_op->addr_cal, DATA_LEN_4, + tmp_data, false); + + I("%s After write value\n", HIMAX_LOG_TAG); + g_core_fp.fp_register_read(pfw_op->addr_cal, DATA_LEN_4, + tmp_data, 0); + I("%s %s:Now [0]=0x%02X,[1]=0x%02X,[2]=0x%02X,[3]=0x%02X\n", + HIMAX_LOG_TAG, __func__, tmp_data[0], tmp_data[1], + tmp_data[2], tmp_data[3]); + + I("%s Sense on\n", HIMAX_LOG_TAG); + g_core_fp.fp_sense_on(0x00); + + g_core_fp.fp_register_read(pfw_op->addr_cal, DATA_LEN_4, + tmp_data, 0); + I("%s %s:Now [0]=0x%02X,[1]=0x%02X,[2]=0x%02X,[3]=0x%02X\n", + HIMAX_LOG_TAG, __func__, tmp_data[0], tmp_data[1], + tmp_data[2], tmp_data[3]); + now_val = ((tmp_data[0] & 0x04) >> 2); /* get the 2th bit value of byte[0] */ + I("%s %s:Now_val=%d, retry times=%d\n", HIMAX_LOG_TAG, + __func__, now_val, retry); + } while (now_val != set_val && retry-- > 0); + return ret; +} +#endif + +int hx_mcu_get_rport_thrsh(void) +{ + int ret = NO_ERR; + uint8_t tmp_data[DATA_LEN_4] = { 0 }; + + I("%s %s:Entering\n", HIMAX_LOG_TAG, __func__); + g_core_fp.fp_register_read(pfw_op->addr_rport_thrsh, DATA_LEN_4, + tmp_data, 0); + I("%s %s:Now [0]=0x%02X,[1]=0x%02X,[2]=0x%02X,[3]=0x%02X\n", + HIMAX_LOG_TAG, __func__, tmp_data[0], tmp_data[1], + tmp_data[2], tmp_data[3]); + ret = tmp_data[3]; + if (ret == 0x00) { + I("%s Now value=%d, please check FW support this feature or not!\n", + HIMAX_LOG_TAG, ret); + ret = -1; + } + I("%s %s:End\n", HIMAX_LOG_TAG, __func__); + return ret; +} +#endif + +/* FW side end*/ +#endif + +#ifdef CORE_FLASH +/* FLASH side start*/ +static void himax_mcu_chip_erase(void) +{ + g_core_fp.fp_interface_on(); + + /* Reset power saving level */ + if (g_core_fp.fp_init_psl != NULL) + g_core_fp.fp_init_psl(); + + g_core_fp.fp_register_write(pflash_op->addr_spi200_trans_fmt, DATA_LEN_4, pflash_op->data_spi200_trans_fmt, 0); + + g_core_fp.fp_register_write(pflash_op->addr_spi200_trans_ctrl, DATA_LEN_4, pflash_op->data_spi200_trans_ctrl_2, 0); + g_core_fp.fp_register_write(pflash_op->addr_spi200_cmd, DATA_LEN_4, pflash_op->data_spi200_cmd_2, 0); + + g_core_fp.fp_register_write(pflash_op->addr_spi200_cmd, DATA_LEN_4, pflash_op->data_spi200_cmd_3, 0); + msleep(2000); + + if (!g_core_fp.fp_wait_wip(100)) + E("%s: Chip_Erase Fail\n", __func__); + +} + +static bool himax_mcu_block_erase(int start_addr, int length) /*complete not yet*/ +{ + uint32_t page_prog_start = 0; + uint32_t block_size = 0x10000; + + uint8_t tmp_data[4] = {0}; + + g_core_fp.fp_interface_on(); + + g_core_fp.fp_init_psl(); + + g_core_fp.fp_register_write(pflash_op->addr_spi200_trans_fmt, DATA_LEN_4, pflash_op->data_spi200_trans_fmt, 0); + + for (page_prog_start = start_addr; page_prog_start < start_addr + length; page_prog_start = page_prog_start + block_size) { + g_core_fp.fp_register_write(pflash_op->addr_spi200_trans_ctrl, DATA_LEN_4, pflash_op->data_spi200_trans_ctrl_2, 0); + g_core_fp.fp_register_write(pflash_op->addr_spi200_cmd, DATA_LEN_4, pflash_op->data_spi200_cmd_2, 0); + + tmp_data[3] = (page_prog_start >> 24)&0xFF; + tmp_data[2] = (page_prog_start >> 16)&0xFF; + tmp_data[1] = (page_prog_start >> 8)&0xFF; + tmp_data[0] = page_prog_start&0xFF; + g_core_fp.fp_register_write(pflash_op->addr_spi200_addr, DATA_LEN_4, tmp_data, 0); + + g_core_fp.fp_register_write(pflash_op->addr_spi200_trans_ctrl, DATA_LEN_4, pflash_op->data_spi200_trans_ctrl_3, 0); + g_core_fp.fp_register_write(pflash_op->addr_spi200_cmd, DATA_LEN_4, pflash_op->data_spi200_cmd_4, 0); + msleep(1000); + + if (!g_core_fp.fp_wait_wip(100)) { + E("%s:Erase Fail\n", __func__); + return false; + } + } + + I("%s:END\n", __func__); + return true; +} + +static bool himax_mcu_sector_erase(int start_addr) +{ + return true; +} + +static void himax_mcu_flash_programming(uint8_t *FW_content, int FW_Size) +{ + int page_prog_start = 0, i = 0, j = 0, k = 0; + int program_length = PROGRAM_SZ; + uint8_t tmp_data[DATA_LEN_4]; + uint8_t buring_data[FLASH_RW_MAX_LEN]; /* Read for flash data, 128K*/ + /* 4 bytes for padding*/ + g_core_fp.fp_interface_on(); + + g_core_fp.fp_register_write(pflash_op->addr_spi200_trans_fmt, DATA_LEN_4, pflash_op->data_spi200_trans_fmt, 0); + + for (page_prog_start = 0; page_prog_start < FW_Size; page_prog_start += FLASH_RW_MAX_LEN) { + g_core_fp.fp_register_write(pflash_op->addr_spi200_trans_ctrl, DATA_LEN_4, pflash_op->data_spi200_trans_ctrl_2, 0); + g_core_fp.fp_register_write(pflash_op->addr_spi200_cmd, DATA_LEN_4, pflash_op->data_spi200_cmd_2, 0); + + /*Programmable size = 1 page = 256 bytes, word_number = 256 byte / 4 = 64*/ + g_core_fp.fp_register_write(pflash_op->addr_spi200_trans_ctrl, DATA_LEN_4, pflash_op->data_spi200_trans_ctrl_4, 0); + + /* Flash start address 1st : 0x0000_0000*/ + if (page_prog_start < 0x100) { + tmp_data[3] = 0x00; + tmp_data[2] = 0x00; + tmp_data[1] = 0x00; + tmp_data[0] = (uint8_t)page_prog_start; + } else if (page_prog_start >= 0x100 && page_prog_start < 0x10000) { + tmp_data[3] = 0x00; + tmp_data[2] = 0x00; + tmp_data[1] = (uint8_t)(page_prog_start >> 8); + tmp_data[0] = (uint8_t)page_prog_start; + } else if (page_prog_start >= 0x10000 && page_prog_start < 0x1000000) { + tmp_data[3] = 0x00; + tmp_data[2] = (uint8_t)(page_prog_start >> 16); + tmp_data[1] = (uint8_t)(page_prog_start >> 8); + tmp_data[0] = (uint8_t)page_prog_start; + } + g_core_fp.fp_register_write(pflash_op->addr_spi200_addr, DATA_LEN_4, tmp_data, 0); + + for (i = 0; i < ADDR_LEN_4; i++) + buring_data[i] = pflash_op->addr_spi200_data[i]; + + + for (i = page_prog_start, j = 0; i < 16 + page_prog_start; i++, j++) + buring_data[j + ADDR_LEN_4] = FW_content[i]; + + + if (himax_bus_write(pic_op->addr_ahb_addr_byte_0[0], buring_data, ADDR_LEN_4 + 16, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return; + } + + g_core_fp.fp_register_write(pflash_op->addr_spi200_cmd, DATA_LEN_4, pflash_op->data_spi200_cmd_6, 0); + + for (j = 0; j < 5; j++) { + for (i = (page_prog_start + 16 + (j * 48)), k = 0; i < (page_prog_start + 16 + (j * 48)) + program_length; i++, k++) + buring_data[k + ADDR_LEN_4] = FW_content[i]; + + if (himax_bus_write(pic_op->addr_ahb_addr_byte_0[0], buring_data, program_length + ADDR_LEN_4, HIMAX_I2C_RETRY_TIMES) < 0) { + E("%s: i2c access fail!\n", __func__); + return; + } + } + + if (!g_core_fp.fp_wait_wip(1)) + E("%s:Flash_Programming Fail\n", __func__); + + } +} + +static void himax_mcu_flash_page_write(uint8_t *write_addr, int length, uint8_t *write_data) +{ +} + +static void himax_flash_speed_set(HX_FLASH_SPEED_ENUM speed) +{ + uint8_t tmp_addr[4]; + uint8_t tmp_data[4]; + + himax_in_parse_assign_cmd(flash_clk_setup_addr, tmp_addr, 4); + himax_in_parse_assign_cmd((uint32_t)speed, tmp_data, 4); + g_core_fp.fp_register_write(tmp_addr, 4, tmp_data, 0); +} + +static int himax_mcu_fts_ctpm_fw_upgrade_with_sys_fs_32k(unsigned char *fw, int len, bool change_iref) +{ + /* Not use */ + return 0; +} + +static int himax_mcu_fts_ctpm_fw_upgrade_with_sys_fs_60k(unsigned char *fw, int len, bool change_iref) +{ + /* Not use */ + return 0; +} + +static int himax_mcu_fts_ctpm_fw_upgrade_with_sys_fs_64k(unsigned char *fw, int len, bool change_iref) +{ + int burnFW_success = 0; + + if (len != FW_SIZE_64k) { + E("%s: The file size is not 64K bytes\n", __func__); + return false; + } + +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + g_core_fp.fp_system_reset(); +#endif + g_core_fp.fp_sense_off(true); + himax_flash_speed_set(HX_FLASH_SPEED_12p5M); + g_core_fp.fp_block_erase(0x00, FW_SIZE_64k); + g_core_fp.fp_flash_programming(fw, FW_SIZE_64k); + + if (g_core_fp.fp_check_CRC(pfw_op->addr_program_reload_from, FW_SIZE_64k) == 0) + burnFW_success = 1; + + /*RawOut select initial*/ + g_core_fp.fp_register_write(pfw_op->addr_raw_out_sel, sizeof(pfw_op->data_clear), pfw_op->data_clear, 0); + /*DSRAM func initial*/ + g_core_fp.fp_assign_sorting_mode(pfw_op->data_clear); + +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + /*System reset*/ + g_core_fp.fp_system_reset(); +#endif + return burnFW_success; +} + +static int himax_mcu_fts_ctpm_fw_upgrade_with_sys_fs_124k(unsigned char *fw, int len, bool change_iref) +{ + /* Not use */ + return 0; +} + +static int himax_mcu_fts_ctpm_fw_upgrade_with_sys_fs_128k(unsigned char *fw, int len, bool change_iref) +{ + int burnFW_success = 0; + + if (len != FW_SIZE_128k) { + E("%s: The file size is not 128K bytes\n", __func__); + return false; + } + +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + g_core_fp.fp_system_reset(); +#endif + g_core_fp.fp_sense_off(true); + g_core_fp.fp_block_erase(0x00, FW_SIZE_128k); + g_core_fp.fp_flash_programming(fw, FW_SIZE_128k); + + if ((g_core_fp.fp_check_CRC(pfw_op->addr_program_reload_from, FW_SIZE_128k) == 0) + && (g_core_fp.fp_flash_lastdata_check(FW_SIZE_128k, fw, len) == 0)) + burnFW_success = 1; + + /*RawOut select initial*/ + g_core_fp.fp_register_write(pfw_op->addr_raw_out_sel, sizeof(pfw_op->data_clear), pfw_op->data_clear, 0); + /*DSRAM func initial*/ + g_core_fp.fp_assign_sorting_mode(pfw_op->data_clear); + +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + /*System reset*/ + g_core_fp.fp_system_reset(); +#endif + return burnFW_success; +} + +static int himax_mcu_fts_ctpm_fw_upgrade_with_sys_fs_255k(unsigned char *fw, int len, bool change_iref) +{ + int burnFW_success = 0; + + if (len != FW_SIZE_255k) { + E("%s: The file size is not 255K bytes\n", __func__); + return false; + } + +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(false, false); +#else + g_core_fp.fp_system_reset(); +#endif + g_core_fp.fp_sense_off(true); + himax_flash_speed_set(HX_FLASH_SPEED_12p5M); + g_core_fp.fp_block_erase(0x00, FW_SIZE_255k); + g_core_fp.fp_flash_programming(fw, FW_SIZE_255k); + + if ((g_core_fp.fp_check_CRC(pfw_op->addr_program_reload_from, FW_SIZE_255k) == 0) + && (g_core_fp.fp_flash_lastdata_check(FW_SIZE_255k, fw, len) == 0)) + burnFW_success = 1; + + /*RawOut select initial*/ + g_core_fp.fp_register_write(pfw_op->addr_raw_out_sel, sizeof(pfw_op->data_clear), pfw_op->data_clear, 0); + /*DSRAM func initial*/ + g_core_fp.fp_assign_sorting_mode(pfw_op->data_clear); + +//#ifdef HX_RST_PIN_FUNC +// g_core_fp.fp_ic_reset(false, false); +//#else + /*System reset*/ +// g_core_fp.fp_system_reset(); +//#endif + + return burnFW_success; +} + +static void himax_mcu_flash_dump_func(uint8_t local_flash_command, int Flash_Size, uint8_t *flash_buffer) +{ + uint8_t tmp_addr[DATA_LEN_4]; + uint8_t buffer[256]; + int page_prog_start = 0; + + g_core_fp.fp_sense_off(true); + g_core_fp.fp_burst_enable(1); + + for (page_prog_start = 0; page_prog_start < Flash_Size; page_prog_start += 128) { + tmp_addr[0] = page_prog_start % 0x100; + tmp_addr[1] = (page_prog_start >> 8) % 0x100; + tmp_addr[2] = (page_prog_start >> 16) % 0x100; + tmp_addr[3] = page_prog_start / 0x1000000; + himax_mcu_register_read(tmp_addr, 128, buffer, 0); + memcpy(&flash_buffer[page_prog_start], buffer, 128); + } + + g_core_fp.fp_burst_enable(0); + g_core_fp.fp_sense_on(0x01); +} + +static bool himax_mcu_flash_lastdata_check(uint32_t size, unsigned char *fw, int len) +{ + uint8_t tmp_addr[4]; + uint32_t start_addr = 0xFFFFFFFF; /* 64K - 0x80, which is the address of the last 128bytes in 64K, default value*/ + uint32_t temp_addr = 0; + uint32_t flash_page_len = 0x80; + uint8_t flash_tmp_buffer[256]; + + start_addr = size - flash_page_len; /* In order to match other size of fw*/ + I("%s: Now size is %d, the start_addr is 0x%04X\n", __func__, size, start_addr); + for (temp_addr = start_addr; temp_addr < (start_addr + flash_page_len); temp_addr = temp_addr + flash_page_len) { + tmp_addr[0] = temp_addr % 0x100; + tmp_addr[1] = (temp_addr >> 8) % 0x100; + tmp_addr[2] = (temp_addr >> 16) % 0x100; + tmp_addr[3] = temp_addr / 0x1000000; + I("temp_addr=%d,tmp_addr[0]=0x%2X, tmp_addr[1]=0x%2X,tmp_addr[2]=0x%2X,tmp_addr[3]=0x%2X\n", temp_addr,tmp_addr[0], tmp_addr[1], tmp_addr[2],tmp_addr[3]); + g_core_fp.fp_register_read(tmp_addr, flash_page_len, &flash_tmp_buffer[0], 0); + } + + if ((!flash_tmp_buffer[flash_page_len-4]) && (!flash_tmp_buffer[flash_page_len-3]) && (!flash_tmp_buffer[flash_page_len-2]) && (!flash_tmp_buffer[flash_page_len-1])) { + I("Fail, Last four Bytes are flash_buffer[FFFC]=0x%2X,flash_buffer[FFFD]=0x%2X,flash_buffer[FFFE]=0x%2X,flash_buffer[FFFF]=0x%2X\n", + flash_tmp_buffer[flash_page_len-4], flash_tmp_buffer[flash_page_len-3], flash_tmp_buffer[flash_page_len-2], flash_tmp_buffer[flash_page_len-1]); + goto FAIL;/*FAIL*/ + } else if ((flash_tmp_buffer[flash_page_len-4] == 0xFF) && (flash_tmp_buffer[flash_page_len-3] == 0xFF) && (flash_tmp_buffer[flash_page_len-2] == 0xFF) && (flash_tmp_buffer[flash_page_len-1] == 0xFF)) { + I("Fail, Last four Bytes are flash_buffer[FFFC]=0x%2X,flash_buffer[FFFD]=0x%2X,flash_buffer[FFFE]=0x%2X,flash_buffer[FFFF]=0x%2X\n", + flash_tmp_buffer[flash_page_len-4], flash_tmp_buffer[flash_page_len-3], flash_tmp_buffer[flash_page_len-2], flash_tmp_buffer[flash_page_len-1]); + goto FAIL; + } else if (len > 0 && ((flash_tmp_buffer[flash_page_len-4] != fw[len-4]) + || (flash_tmp_buffer[flash_page_len-3] != fw[len-3]) + || (flash_tmp_buffer[flash_page_len-2] != fw[len-2]) + || (flash_tmp_buffer[flash_page_len-1] != fw[len-1]))) { + I("Fail, flash last 4 bytes=0x%02X%02X%02X%02X\n", flash_tmp_buffer[flash_page_len-4], flash_tmp_buffer[flash_page_len-3], flash_tmp_buffer[flash_page_len-2], flash_tmp_buffer[flash_page_len-1]); + I("Fail, FW last 4 bytes=0x%02X%02X%02X%02X\n", fw[len-4], fw[len-3], fw[len-2], fw[len-1]); + goto FAIL; + } else { + I("flash_buffer[FFFC]=0x%2X,flash_buffer[FFFD]=0x%2X,flash_buffer[FFFE]=0x%2X,flash_buffer[FFFF]=0x%2X\n", + flash_tmp_buffer[flash_page_len-4], flash_tmp_buffer[flash_page_len-3], flash_tmp_buffer[flash_page_len-2], flash_tmp_buffer[flash_page_len-1]); + return 0;/*PASS*/ + } + return 0; +FAIL: + return 1; +} +static int hx_mcu_diff_overlay_flash(void) +{ + int rslt = 0; + int diff_val = 0; + + diff_val = (ic_data->vendor_fw_ver); + I("%s:Now fw ID is 0x%04X\n", __func__, diff_val); + diff_val = (diff_val >> 12); + I("%s:Now diff value=0x%04X\n", __func__, diff_val); + + if (diff_val == 1) + I("%s:Now size should be 128K!\n", __func__); + else + I("%s:Now size should be 64K!\n", __func__); + rslt = diff_val; + return rslt; +} + +/* FLASH side end*/ +#endif + +#ifdef CORE_SRAM +/* SRAM side start*/ +static void himax_mcu_sram_write(uint8_t *FW_content) +{ +} + +static bool himax_mcu_sram_verify(uint8_t *FW_File, int FW_Size) +{ + return true; +} + +static bool himax_mcu_get_DSRAM_data(uint8_t *info_data, bool DSRAM_Flag) +{ + unsigned int i = 0; + unsigned char tmp_addr[ADDR_LEN_4]; + unsigned char tmp_data[DATA_LEN_4]; + uint8_t max_i2c_size = MAX_I2C_TRANS_SZ; + uint8_t x_num = ic_data->HX_RX_NUM; + uint8_t y_num = ic_data->HX_TX_NUM; + /*int m_key_num = 0;*/ + int total_size = (x_num * y_num + x_num + y_num) * 2 + 4; + int total_size_temp; + int mutual_data_size = x_num * y_num * 2; + int total_read_times = 0; + int address = 0; + uint8_t *temp_info_data; /*max mkey size = 8*/ + uint16_t check_sum_cal = 0; + int fw_run_flag = -1; + + temp_info_data = kcalloc((total_size + 8), sizeof(uint8_t), GFP_KERNEL); + if (temp_info_data == NULL) { + E("%s: temp_info_data allocate memory fail!!!!!\n", __func__); + return false; + } + /* 1. Read number of MKey R100070E8H to determin data size */ + /* m_key_num = ic_data->HX_BT_NUM; */ + /* I("%s,m_key_num=%d\n",__func__ ,m_key_num); */ + /* total_size += m_key_num * 2; */ + /* 2. Start DSRAM Rawdata and Wait Data Ready */ + tmp_data[3] = 0x00; tmp_data[2] = 0x00; + tmp_data[1] = psram_op->passwrd_start[1]; + tmp_data[0] = psram_op->passwrd_start[0]; + fw_run_flag = himax_write_read_reg(psram_op->addr_rawdata_addr, tmp_data, psram_op->passwrd_end[1], psram_op->passwrd_end[0]); + + if (fw_run_flag < 0) { + I("%s Data NOT ready => bypass\n", __func__); + goto FAIL; + } + + /* 3. Read RawData */ + total_size_temp = total_size; + /*I("%s: tmp_data[0] = 0x%02X,tmp_data[1] = 0x%02X,tmp_data[2] = 0x%02X,tmp_data[3] = 0x%02X\n", + __func__, psram_op->addr_rawdata_addr[0], psram_op->addr_rawdata_addr[1], psram_op->addr_rawdata_addr[2], psram_op->addr_rawdata_addr[3]);*/ + tmp_addr[0] = psram_op->addr_rawdata_addr[0]; + tmp_addr[1] = psram_op->addr_rawdata_addr[1]; + tmp_addr[2] = psram_op->addr_rawdata_addr[2]; + tmp_addr[3] = psram_op->addr_rawdata_addr[3]; + + if (total_size % max_i2c_size == 0) + total_read_times = total_size / max_i2c_size; + else + total_read_times = total_size / max_i2c_size + 1; + + for (i = 0; i < total_read_times; i++) { + address = (psram_op->addr_rawdata_addr[3] << 24) + + (psram_op->addr_rawdata_addr[2] << 16) + + (psram_op->addr_rawdata_addr[1] << 8) + + psram_op->addr_rawdata_addr[0] + i * max_i2c_size; + /*I("%s address = %08X\n", __func__, address);*/ + + tmp_addr[3] = (uint8_t)((address >> 24) & 0x00FF); + tmp_addr[2] = (uint8_t)((address >> 16) & 0x00FF); + tmp_addr[1] = (uint8_t)((address >> 8) & 0x00FF); + tmp_addr[0] = (uint8_t)((address) & 0x00FF); + + if (total_size_temp >= max_i2c_size) { + g_core_fp.fp_register_read(tmp_addr, max_i2c_size, &temp_info_data[i * max_i2c_size], 0); + total_size_temp = total_size_temp - max_i2c_size; + } else { + /*I("last total_size_temp=%d\n",total_size_temp);*/ + g_core_fp.fp_register_read(tmp_addr, total_size_temp % max_i2c_size, &temp_info_data[i * max_i2c_size], 0); + } + } + + /* 4. FW stop outputing */ + tmp_data[3] = temp_info_data[3]; tmp_data[2] = temp_info_data[2]; + tmp_data[1] = 0x00; tmp_data[0] = 0x00; + g_core_fp.fp_register_write(psram_op->addr_rawdata_addr, DATA_LEN_4, tmp_data, 0); + + /* 5. Data Checksum Check */ + for (i = 2; i < total_size; i += 2)/* 2:PASSWORD NOT included */ + check_sum_cal += (temp_info_data[i + 1] * 256 + temp_info_data[i]); + + if (check_sum_cal % 0x10000 != 0) { + I("%s check_sum_cal fail=%2X\n", __func__, check_sum_cal); + goto FAIL; + } else { + memcpy(info_data, &temp_info_data[4], mutual_data_size * sizeof(uint8_t)); + /*I("%s checksum PASS\n", __func__);*/ + } + + kfree(temp_info_data); + return true; +FAIL: + kfree(temp_info_data); + return false; +} +/* SRAM side end*/ +#endif + +#ifdef CORE_DRIVER + +static void himax_mcu_init_ic(void) +{ + I("%s: use default incell init.\n", __func__); +} + +#ifdef HX_AUTO_UPDATE_FW +static int himax_mcu_fw_ver_bin(void) +{ + I("%s: use default incell address.\n", __func__); + I("%s:Entering!\n", __func__); + if (i_CTPM_FW != NULL) { + I("Catch fw version in bin file!\n"); + g_i_FW_VER = (i_CTPM_FW[FW_VER_MAJ_FLASH_ADDR] << 8) | i_CTPM_FW[FW_VER_MIN_FLASH_ADDR]; + g_i_CFG_VER = (i_CTPM_FW[CFG_VER_MAJ_FLASH_ADDR] << 8) | i_CTPM_FW[CFG_VER_MIN_FLASH_ADDR]; + g_i_CID_MAJ = i_CTPM_FW[CID_VER_MAJ_FLASH_ADDR]; + g_i_CID_MIN = i_CTPM_FW[CID_VER_MIN_FLASH_ADDR]; + } else { + I("FW data is null!\n"); + return 1; + } + return NO_ERR; +} +#endif + + +#ifdef HX_RST_PIN_FUNC +static void himax_mcu_pin_reset(void) +{ + I("%s: Now reset the Touch chip.\n", __func__); + himax_rst_gpio_set(private_ts->rst_gpio, 0); + msleep(20); + himax_rst_gpio_set(private_ts->rst_gpio, 1); + msleep(50); +} + +static void himax_mcu_ic_reset(uint8_t loadconfig, uint8_t int_off) +{ + struct himax_ts_data *ts = private_ts; + + HX_HW_RESET_ACTIVATE = 0; + I("%s,status: loadconfig=%d,int_off=%d\n", __func__, loadconfig, int_off); + + if (ts->rst_gpio >= 0) { + if (int_off) + g_core_fp.fp_irq_switch(0); + + g_core_fp.fp_pin_reset(); + + if (loadconfig) + g_core_fp.fp_reload_config(); + + if (int_off) + g_core_fp.fp_irq_switch(1); + + } +} +#endif + +#ifndef HX_FIX_TOUCH_INFO +static uint8_t himax_mcu_tp_info_check(void) +{ + uint8_t rx = pdriver_op->data_df_rx[0]; + uint8_t tx = pdriver_op->data_df_tx[0]; + uint8_t pt = pdriver_op->data_df_pt[0]; + uint8_t err_cnt = 0; + + if (ic_data->HX_RX_NUM < (rx / 2) || ic_data->HX_RX_NUM > (rx * 3 / 2)) { + ic_data->HX_RX_NUM = rx; + err_cnt |= 0x01; + } + if (ic_data->HX_TX_NUM < (tx / 2) || ic_data->HX_TX_NUM > (tx * 3 / 2)) { + ic_data->HX_TX_NUM = tx; + err_cnt |= 0x02; + } + if (ic_data->HX_MAX_PT < (pt / 2) || ic_data->HX_MAX_PT > (pt * 3 / 2)) { + ic_data->HX_MAX_PT = pt; + err_cnt |= 0x04; + } + return err_cnt; +} +#endif + +static void himax_mcu_touch_information(void) +{ +#ifndef HX_FIX_TOUCH_INFO + char data[DATA_LEN_4] = {0}; + uint8_t err_cnt = 0; + + g_core_fp.fp_register_read(pdriver_op->addr_fw_define_rxnum_txnum_maxpt, DATA_LEN_4, data, 0); + ic_data->HX_RX_NUM = data[2]; + ic_data->HX_TX_NUM = data[3]; + + g_core_fp.fp_register_read(pdriver_op->addr_fw_define_xy_res_enable, DATA_LEN_4, data, 0); + ic_data->HX_MAX_PT = SEC_FIX_MAX_PT; + + /*I("%s : c_data->HX_XY_REVERSE=0x%2.2X\n",__func__,data[1]);*/ + if ((data[1] & 0x04) == 0x04) + ic_data->HX_XY_REVERSE = true; + else + ic_data->HX_XY_REVERSE = false; + + ic_data->HX_Y_RES = private_ts->pdata->screenHeight; + ic_data->HX_X_RES = private_ts->pdata->screenWidth; + /*I("%s : ic_data->HX_Y_RES=%d,ic_data->HX_X_RES=%d\n",__func__,ic_data->HX_Y_RES,ic_data->HX_X_RES);*/ + + ic_data->HX_INT_IS_EDGE = SEC_FIX_INT_EDGE; + + /*1. Read number of MKey R100070E8H to determin data size*/ + g_core_fp.fp_register_read(psram_op->addr_mkey, DATA_LEN_4, data, 0); + /* I("%s: tmp_data[0] = 0x%02X,tmp_data[1] = 0x%02X,tmp_data[2] = 0x%02X,tmp_data[3] = 0x%02X\n",*/ + /*__func__, tmp_data[0], tmp_data[1], tmp_data[2], tmp_data[3]);*/ + ic_data->HX_BT_NUM = data[0] & 0x03; + + err_cnt = himax_mcu_tp_info_check(); + if (err_cnt > 0) + E("TP Info from IC is wrong, err_cnt = 0x%X\n", err_cnt); + + g_core_fp.fp_ic_id_read(); + +#else + ic_data->HX_RX_NUM = FIX_HX_RX_NUM; + ic_data->HX_TX_NUM = FIX_HX_TX_NUM; + ic_data->HX_BT_NUM = FIX_HX_BT_NUM; + ic_data->HX_X_RES = FIX_HX_X_RES; + ic_data->HX_Y_RES = FIX_HX_Y_RES; + ic_data->HX_MAX_PT = FIX_HX_MAX_PT; + ic_data->HX_XY_REVERSE = FIX_HX_XY_REVERSE; + ic_data->HX_INT_IS_EDGE = FIX_HX_INT_IS_EDGE; +#endif + I("%s:HX_RX_NUM =%d,HX_TX_NUM =%d,HX_MAX_PT=%d\n", __func__, ic_data->HX_RX_NUM, ic_data->HX_TX_NUM, ic_data->HX_MAX_PT); + I("%s:HX_XY_REVERSE =%d,HX_Y_RES =%d,HX_X_RES=%d\n", __func__, ic_data->HX_XY_REVERSE, ic_data->HX_Y_RES, ic_data->HX_X_RES); + I("%s:HX_INT_IS_EDGE =%d\n", __func__, ic_data->HX_INT_IS_EDGE); +} + +static void himax_mcu_reload_config(void) +{ + if (himax_report_data_init()) + E("%s: allocate data fail\n", __func__); + + g_core_fp.fp_sense_on(0x00); +} + +static int himax_mcu_get_touch_data_size(void) +{ + return HIMAX_TOUCH_DATA_SIZE; +} + +static int himax_mcu_hand_shaking(void) +{ + /* 0:Running, 1:Stop, 2:I2C Fail */ + int result = 0; + return result; +} + +static int himax_mcu_determin_diag_rawdata(int diag_command) +{ + return diag_command % 10; +} + +static int himax_mcu_determin_diag_storage(int diag_command) +{ + return diag_command / 10; +} + +static int himax_mcu_cal_data_len(int raw_cnt_rmd, int HX_MAX_PT, int raw_cnt_max) +{ + int RawDataLen; + + if (raw_cnt_rmd != 0x00) + RawDataLen = MAX_I2C_TRANS_SZ - ((HX_MAX_PT + raw_cnt_max + 3) * 4) - 1; + else + RawDataLen = MAX_I2C_TRANS_SZ - ((HX_MAX_PT + raw_cnt_max + 2) * 4) - 1; + + return RawDataLen; +} + +static bool himax_mcu_diag_check_sum(struct himax_report_data *hx_touch_data) +{ + uint16_t check_sum_cal = 0; + int i; + + /* Check 128th byte CRC */ + for (i = 0, check_sum_cal = 0; i < (hx_touch_data->touch_all_size - hx_touch_data->touch_info_size); i += 2) + check_sum_cal += (hx_touch_data->hx_rawdata_buf[i + 1] * FLASH_RW_MAX_LEN + hx_touch_data->hx_rawdata_buf[i]); + + + if (check_sum_cal % HX64K != 0) { + I("%s fail=%2X\n", __func__, check_sum_cal); + return 0; + } + + return 1; +} + +static void himax_mcu_diag_parse_raw_data(struct himax_report_data *hx_touch_data, int mul_num, int self_num, uint8_t diag_cmd, int32_t *mutual_data, int32_t *self_data) +{ + diag_mcu_parse_raw_data(hx_touch_data, mul_num, self_num, diag_cmd, mutual_data, self_data); +} + +#ifdef HX_ESD_RECOVERY +static int himax_mcu_ic_esd_recovery(int hx_esd_event, int hx_zero_event, int length) +{ + int ret_val = NO_ERR; + + if (hx_esd_event == length) { +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER_LEGO) + if (private_ts->pdata->notify_tsp_esd) { + I("[HIMAX TP MSG]: notify LCD reset.\n"); + sec_input_notify(&private_ts->himax_input_nb, NOTIFIER_TSP_ESD_INTERRUPT, NULL); + } +#endif + g_zero_event_count = 0; + ret_val = HX_ESD_EVENT; + } else if (hx_zero_event == length) { + if (g_zero_event_count > 5) { + g_zero_event_count = 0; + I("[HIMAX TP MSG]: ESD event checked - ALL Zero.\n"); + ret_val = HX_ESD_EVENT; + } else { + g_zero_event_count++; + I("[HIMAX TP MSG]: ALL Zero event is %d times.\n", g_zero_event_count); + ret_val = HX_ZERO_EVENT_COUNT; + } + } + + return ret_val; +} + +static void himax_mcu_esd_ic_reset(void) +{ + HX_ESD_RESET_ACTIVATE = 0; +#ifdef HX_RST_PIN_FUNC + himax_mcu_pin_reset(); +#else + himax_mcu_system_reset(); +#endif + I("%s:\n", __func__); +} +#endif +#ifdef HX_TP_PROC_GUEST_INFO +char *g_checksum_str = "check sum fail"; +char *g_guest_info_item[] = { + "projectID", + "CGColor", + "BarCode", + "Reserve1", + "Reserve2", + "Reserve3", + "Reserve4", + "Reserve5", + "VCOM", + "Vcom-3Gar", + NULL +}; + +static int himax_guest_info_get_status(void) +{ + return g_guest_info_data->g_guest_info_ongoing; +} +static void himax_guest_info_set_status(int setting) +{ + g_guest_info_data->g_guest_info_ongoing = setting; +} + +static int himax_guest_info_read(uint32_t start_addr, uint8_t *flash_tmp_buffer) +{ + uint32_t temp_addr = 0; + uint8_t tmp_addr[4]; + uint32_t flash_page_len = 0x1000; + /* uint32_t checksum = 0x00; */ + int result = 0; + + + I("Reading guest info in start_addr = 0x%08X !\n", start_addr); + + tmp_addr[0] = start_addr % 0x100; + tmp_addr[1] = (start_addr >> 8) % 0x100; + tmp_addr[2] = (start_addr >> 16) % 0x100; + tmp_addr[3] = start_addr / 0x1000000; + I("Now start addr: tmp_addr[0]=0x%2X,tmp_addr[1]=0x%2X,tmp_addr[2]=0x%2X,tmp_addr[3]=0x%2X\n", tmp_addr[0], tmp_addr[1], tmp_addr[2], tmp_addr[3]); + result = g_core_fp.fp_check_CRC(tmp_addr, flash_page_len); + I("Checksum = 0x%8X\n", result); + if (result != 0) + goto END_FUNC; + + for (temp_addr = start_addr; temp_addr < (start_addr + flash_page_len); temp_addr = temp_addr + 128) { + + /* I("temp_addr=%d,tmp_addr[0]=0x%2X,tmp_addr[1]=0x%2X,tmp_addr[2]=0x%2X,tmp_addr[3]=0x%2X\n",temp_addr,tmp_addr[0],tmp_addr[1],tmp_addr[2],tmp_addr[3]); */ + tmp_addr[0] = temp_addr % 0x100; + tmp_addr[1] = (temp_addr >> 8) % 0x100; + tmp_addr[2] = (temp_addr >> 16) % 0x100; + tmp_addr[3] = temp_addr / 0x1000000; + g_core_fp.fp_register_read(tmp_addr, 128, &flash_tmp_buffer[temp_addr - start_addr], false); + /* memcpy(&flash_tmp_buffer[temp_addr - start_addr],buffer,128);*/ + } + +END_FUNC: + return result; +} + +static int hx_read_guest_info(void) +{ + /* uint8_t tmp_addr[4]; */ + uint32_t panel_color_addr = 0x10000;/*64k*/ + + uint32_t info_len; + uint32_t flash_page_len = 0x1000;/*4k*/ + uint8_t *flash_tmp_buffer = NULL; + /* uint32_t temp_addr = 0; */ + uint8_t temp_str[128]; + int i = 0; + unsigned int custom_info_temp = 0; + int checksum = 0; + + himax_guest_info_set_status(1); + + flash_tmp_buffer = kcalloc(HX_GUEST_INFO_SIZE * flash_page_len, sizeof(uint8_t), GFP_KERNEL); + if (flash_tmp_buffer == NULL) { + I("%s: Memory allocate fail!\n", __func__); + return MEM_ALLOC_FAIL; + } + + g_core_fp.fp_sense_off(true); + /* g_core_fp.fp_burst_enable(1); */ + + for (custom_info_temp = 0; custom_info_temp < HX_GUEST_INFO_SIZE; custom_info_temp++) { + checksum = himax_guest_info_read(panel_color_addr+custom_info_temp * flash_page_len, &flash_tmp_buffer[custom_info_temp * flash_page_len]); + if (checksum != 0) { + E("%s:Checksum Fail! g_checksum_str len=%d\n", __func__, (int)strlen(g_checksum_str)); + memcpy(&g_guest_info_data->g_guest_str_in_format[custom_info_temp][0], g_checksum_str, (int)strlen(g_checksum_str)); + memcpy(&g_guest_info_data->g_guest_str[custom_info_temp][0], g_checksum_str, (int)strlen(g_checksum_str)); + continue; + } + + info_len = flash_tmp_buffer[custom_info_temp * flash_page_len] + + (flash_tmp_buffer[custom_info_temp*flash_page_len + 1] << 8) + + (flash_tmp_buffer[custom_info_temp*flash_page_len + 2] << 16) + + (flash_tmp_buffer[custom_info_temp*flash_page_len + 3] << 24); + + I("Now custom_info_temp = %d\n", custom_info_temp); + + I("Now size_buff[0]=0x%02X,[1]=0x%02X,[2]=0x%02X,[3]=0x%02X\n" + , flash_tmp_buffer[custom_info_temp*flash_page_len] + , flash_tmp_buffer[custom_info_temp*flash_page_len + 1] + , flash_tmp_buffer[custom_info_temp*flash_page_len + 2] + , flash_tmp_buffer[custom_info_temp*flash_page_len + 3]); + + I("Now total length=%d\n", info_len); + + g_guest_info_data->g_guest_data_len[custom_info_temp] = info_len; + + I("Now custom_info_id [0]=%d,[1]=%d,[2]=%d,[3]=%d\n" + , flash_tmp_buffer[custom_info_temp*flash_page_len + 4] + , flash_tmp_buffer[custom_info_temp*flash_page_len + 5] + , flash_tmp_buffer[custom_info_temp*flash_page_len + 6] + , flash_tmp_buffer[custom_info_temp*flash_page_len + 7]); + + g_guest_info_data->g_guest_data_type[custom_info_temp] = flash_tmp_buffer[custom_info_temp * flash_page_len + 7]; + + /* if(custom_info_temp < 3) { */ + if (info_len > 128) { + I("%s: info_len=%d\n", __func__, info_len); + info_len = 128; + } + for (i = 0; i < info_len; i++) + temp_str[i] = flash_tmp_buffer[custom_info_temp * flash_page_len + HX_GUEST_INFO_LEN_SIZE + HX_GUEST_INFO_ID_SIZE + i]; + I("g_guest_info_data->g_guest_str_in_format[%d] size = %d\n", custom_info_temp, info_len); + memcpy(&g_guest_info_data->g_guest_str_in_format[custom_info_temp][0], temp_str, info_len); + /*}*/ + + for (i = 0; i < 128; i++) + temp_str[i] = flash_tmp_buffer[custom_info_temp * flash_page_len + i]; + + I("g_guest_info_data->g_guest_str[%d] size = %d\n", custom_info_temp, 128); + memcpy(&g_guest_info_data->g_guest_str[custom_info_temp][0], temp_str, 128); + /*if(custom_info_temp == 0) + *{ + * for( i = 0; i< 256 ; i++) + * { + * if(i % 16 == 0 && i > 0) + * I("\n"); + * I("g_guest_info_data->g_guest_str[%d][%d] = 0x%02X",custom_info_temp,i,g_guest_info_data->g_guest_str[custom_info_temp][i]); + * } + *} + */ + } + /* himax_burst_enable(private_ts->client, 0); */ + + g_core_fp.fp_sense_on(0x01); + + kfree(flash_tmp_buffer); + himax_guest_info_set_status(0); + return NO_ERR; +} +#endif +#endif + +#if defined(HX_SMART_WAKEUP) || defined(HX_HIGH_SENSE) || defined(HX_USB_DETECT_GLOBAL) +static void himax_mcu_resend_cmd_func(bool suspended) +{ + + struct himax_ts_data *ts = private_ts; + + I("%s, Entering\n", __func__); + +#ifdef HX_SMART_WAKEUP + g_core_fp.fp_set_SMWP_enable(ts->SMWP_enable, suspended); +#endif +#ifdef HX_HIGH_SENSE + g_core_fp.fp_set_HSEN_enable(ts->HSEN_enable, suspended); +#endif +#ifdef HX_USB_DETECT_GLOBAL + himax_cable_detect_func(ts->usb_connected); +#endif + if (ts->glove_enabled) + himax_set_ap_change_mode(HIGH_SENSITIVITY_MODE, ts->glove_enabled); +} +#endif + +#ifdef HX_ZERO_FLASH +int G_POWERONOF = 1; +EXPORT_SYMBOL(G_POWERONOF); +void hx_dis_rload_0f(int disable) +{ + /*Diable Flash Reload*/ + g_core_fp.fp_register_write(pzf_op->addr_dis_flash_reload, DATA_LEN_4, pzf_op->data_dis_flash_reload, 0); +} + +void himax_mcu_clean_sram_0f(uint8_t *addr, int write_len, int type) +{ + int total_read_times = 0; + int max_bus_size = MAX_I2C_TRANS_SZ; + int total_size_temp = 0; + int address = 0; + int i = 0; + + uint8_t fix_data = 0x00; + uint8_t tmp_addr[4]; + uint8_t tmp_data[MAX_I2C_TRANS_SZ] = {0}; + + I("%s, Entering\n", __func__); + + max_bus_size = (write_len > HX_MAX_WRITE_SZ) ? HX_MAX_WRITE_SZ : write_len; + + total_size_temp = write_len; + + g_core_fp.fp_burst_enable(1); + + tmp_addr[3] = addr[3]; + tmp_addr[2] = addr[2]; + tmp_addr[1] = addr[1]; + tmp_addr[0] = addr[0]; + I("%s, write addr tmp_addr[3]=0x%2.2X, tmp_addr[2]=0x%2.2X, tmp_addr[1]=0x%2.2X, tmp_addr[0]=0x%2.2X\n", __func__, tmp_addr[3], tmp_addr[2], tmp_addr[1], tmp_addr[0]); + + switch (type) { + case 0: + fix_data = 0x00; + break; + case 1: + fix_data = 0xAA; + break; + case 2: + fix_data = 0xBB; + break; + } + + for (i = 0; i < MAX_I2C_TRANS_SZ; i++) + tmp_data[i] = fix_data; + + I("%s, total size=%d\n", __func__, total_size_temp); + + if (total_size_temp % max_bus_size == 0) + total_read_times = total_size_temp / max_bus_size; + else + total_read_times = total_size_temp / max_bus_size + 1; + + for (i = 0; i < (total_read_times); i++) { + I("[log]write %d time start!\n", i); + if (total_size_temp >= max_bus_size) { + g_core_fp.fp_register_write(tmp_addr, max_bus_size, tmp_data, 0); + total_size_temp = total_size_temp - max_bus_size; + } else { + I("last total_size_temp=%d\n", total_size_temp); + g_core_fp.fp_register_write(tmp_addr, total_size_temp % max_bus_size, tmp_data, 0); + } + address = ((i+1) * max_bus_size); + tmp_addr[1] = addr[1] + (uint8_t) ((address>>8) & 0x00FF); + tmp_addr[0] = addr[0] + (uint8_t) ((address) & 0x00FF); + + usleep_range(10000, 11000); + } + + I("%s, END\n", __func__); +} + +void himax_mcu_write_sram_0f(const struct firmware *fw_entry, uint8_t *addr, int start_index, uint32_t write_len) +{ + int total_read_times = 0; + int max_bus_size = MAX_I2C_TRANS_SZ; + int total_size_temp = 0; + int address = 0; + int i = 0; + + uint8_t tmp_addr[4]; + uint8_t *tmp_data; + + total_size_temp = write_len; + I("%s, Entering - total write size=%d\n", __func__, total_size_temp); + + max_bus_size = (write_len > HX_MAX_WRITE_SZ) ? HX_MAX_WRITE_SZ : write_len; + + g_core_fp.fp_burst_enable(1); + + tmp_addr[3] = addr[3]; + tmp_addr[2] = addr[2]; + tmp_addr[1] = addr[1]; + tmp_addr[0] = addr[0]; + I("%s, write addr = 0x%02X%02X%02X%02X\n", __func__, tmp_addr[3], tmp_addr[2], tmp_addr[1], tmp_addr[0]); + + /* tmp_data = kcalloc(max_bus_size, sizeof(uint8_t), GFP_KERNEL); + * if (tmp_data == NULL) { + * I("%s: Can't allocate enough buf\n", __func__); + * return; + * } + */ + + /*for(i = 0;i<10;i++) + *{ + * I("[%d] 0x%2.2X", i, tmp_data[i]); + *} + *I("\n"); + */ + if (total_size_temp % max_bus_size == 0) + total_read_times = total_size_temp / max_bus_size; + else + total_read_times = total_size_temp / max_bus_size + 1; + + for (i = 0; i < (total_read_times); i++) { + /*I("[log]write %d time start!\n", i);*/ + /*I("[log]addr[3]=0x%02X, addr[2]=0x%02X, addr[1]=0x%02X, addr[0]=0x%02X!\n", tmp_addr[3], tmp_addr[2], tmp_addr[1], tmp_addr[0]);*/ + + if (total_size_temp >= max_bus_size) { + /*memcpy(tmp_data, &fw_entry->data[start_index+i * max_bus_size], max_bus_size);*/ + tmp_data = (uint8_t *)&fw_entry->data[start_index+i * max_bus_size]; + g_core_fp.fp_register_write(tmp_addr, max_bus_size, tmp_data, 0); + total_size_temp = total_size_temp - max_bus_size; + } else { + /*memcpy(tmp_data, &fw_entry->data[start_index+i * max_bus_size], total_size_temp % max_bus_size);*/ + tmp_data = (uint8_t *)&fw_entry->data[start_index+i * max_bus_size]; + I("last total_size_temp=%d\n", total_size_temp % max_bus_size); + g_core_fp.fp_register_write(tmp_addr, total_size_temp % max_bus_size, tmp_data, 0); + } + + /*I("[log]write %d time end!\n", i);*/ + address = ((i+1) * max_bus_size); + tmp_addr[0] = addr[0] + (uint8_t) ((address) & 0x00FF); + + if (tmp_addr[0] < addr[0]) + tmp_addr[1] = addr[1] + (uint8_t) ((address>>8) & 0x00FF) + 1; + else + tmp_addr[1] = addr[1] + (uint8_t) ((address>>8) & 0x00FF); + + udelay(100); + } + I("%s, End\n", __func__); + /* kfree(tmp_data); */ +} + +int himax_sram_write_crc_check(const struct firmware *fw_entry, uint8_t *addr, int strt_idx, uint32_t len) +{ + int retry = 0; + int crc = -1; + + do { + g_core_fp.fp_write_sram_0f(fw_entry, addr, strt_idx, len); + crc = g_core_fp.fp_check_CRC(addr, len); + retry++; + I("%s, HW CRC %s in %d time\n", __func__, (crc == 0)?"OK":"Fail", retry); + } while (crc != 0 && retry < 3); + + return crc; +} +int hx_parse_bin_cfg_data(const struct firmware *fw_entry, struct zf_info *zf_info_arr, uint8_t *FW_buf, uint8_t *sram_min, uint8_t *ovl_sidx) +{ + int part_num = 0; + int i = 0; + uint8_t buf[16]; + int i_max = 0; + int i_min = 0; + uint32_t dsram_base = 0xFFFFFFFF; + uint32_t dsram_max = 0; + int cfg_sz = 0; + /*int different = 0;*/ + /*int j = 0;*/ + + /*1. get number of partition*/ + part_num = fw_entry->data[HX64K + 12]; + I("%s, Number of partition is %d\n", __func__, part_num); + if (part_num <= 1) { + E("%s, size of cfg part failed! part_num = %d\n", __func__, part_num); + return LENGTH_FAIL; + } + /*2. check struct of array*/ + if (zf_info_arr == NULL || FW_buf == NULL) { + E("%s, Struct is NULL, %p,%p\n", __func__, zf_info_arr, FW_buf); + return MEM_ALLOC_FAIL; + } + + /* i = 0 is fw entity, it need to update by itself*/ + for (i = 1; i < part_num; i++) { + /*3. get all partition*/ + memcpy(buf, &fw_entry->data[i * 0x10 + HX64K], 16); + memcpy(zf_info_arr[i].sram_addr, buf, 4); + zf_info_arr[i].write_size = buf[7] << 24 | buf[6] << 16 | buf[5] << 8 | buf[4]; + zf_info_arr[i].fw_addr = buf[11] << 24 | buf[10] << 16 | buf[9] << 8 | buf[8]; + zf_info_arr[i].cfg_addr = zf_info_arr[i].sram_addr[0]; + zf_info_arr[i].cfg_addr += zf_info_arr[i].sram_addr[1] << 8; + zf_info_arr[i].cfg_addr += zf_info_arr[i].sram_addr[2] << 16; + zf_info_arr[i].cfg_addr += zf_info_arr[i].sram_addr[3] << 24; + +#ifdef HX_CODE_OVERLAY + /*overlay section*/ + if (zf_info_arr[i].cfg_addr == ovl_isram_addr) { + if (*ovl_sidx == 0) + *ovl_sidx = i; + + continue; + } +#endif + + if (dsram_base > zf_info_arr[i].cfg_addr) { + dsram_base = zf_info_arr[i].cfg_addr; + i_min = i; + } + if (dsram_max < zf_info_arr[i].cfg_addr) { + dsram_max = zf_info_arr[i].cfg_addr; + i_max = i; + } + } + for (i = 0; i < ADDR_LEN_4; i++) + sram_min[i] = zf_info_arr[i_min].sram_addr[i]; + cfg_sz = (dsram_max - dsram_base) + zf_info_arr[i_max].write_size; + if (cfg_sz % 16 != 0) + cfg_sz = cfg_sz + 16 - (cfg_sz % 16); + + I("%s, cfg_sz = %d!, dsram_base = %X, dsram_max = %X\n", __func__, cfg_sz, dsram_base, dsram_max); + + memset(FW_buf, 0x00, sizeof(uint8_t) * cfg_sz); + for (i = 1; i < part_num; i++) { + if (zf_info_arr[i].cfg_addr % 4 != 0) + zf_info_arr[i].cfg_addr = zf_info_arr[i].cfg_addr - (zf_info_arr[i].cfg_addr % 4); + + I("%s,[%d] SRAM addr = %08X\n", __func__, i, zf_info_arr[i].cfg_addr); + I("%s,[%d] fw_addr = %08X\n", __func__, i, zf_info_arr[i].fw_addr); + I("%s,[%d] write_size = %d\n", __func__, i, zf_info_arr[i].write_size); + +#ifdef HX_CODE_OVERLAY + /*overlay section*/ + if (zf_info_arr[i].cfg_addr == ovl_isram_addr) + continue; +#endif + + memcpy(&FW_buf[zf_info_arr[i].cfg_addr - dsram_base], &fw_entry->data[zf_info_arr[i].fw_addr], zf_info_arr[i].write_size); + } + /* debug info */ + /* for (i = 1; i < part_num; i++) { + * different = 0; + * I("--cfg_addr = 0x%08X\n",zf_info_arr[i].cfg_addr); + * I("--bin_addr = 0x%08X\n",zf_info_arr[i].fw_addr); + * I("--write size = %d\n",zf_info_arr[i].write_size); + * for ( j = 0; j < zf_info_arr[i].write_size; j++) { + * if(FW_buf[zf_info_arr[i].cfg_addr - dsram_base + j] != fw_entry->data[zf_info_arr[i].fw_addr + j]) + * different++; + * } + * I("--There are %d different\n", different); + * } + */ + + return cfg_sz; +} +int himax_zf_part_info(const struct firmware *fw_entry) +{ + int part_num = fw_entry->data[HX64K + 12]; + int ret = 0; + uint8_t buf[16]; + struct zf_info zf_info_arr[part_num]; + uint8_t *FW_buf; + uint8_t sram_min[4]; + int cfg_crc_sw = 0; + int cfg_crc_hw = 0; + int cfg_sz = 0; + int retry = 3; + + uint8_t ovl_sidx = 0; +#if defined(HX_CODE_OVERLAY) && defined(HX_SMART_WAKEUP) + uint8_t tmp_addr[4] = {0xFC, 0x7F, 0x00, 0x10}; + uint8_t send_data[4] = {0}; + uint8_t recv_data[4] = {0}; +#endif + + /*1. get number of partition*/ + /*part_num = fw_entry->data[HX64K + 12];*/ + I("%s, Number of partition is %d\n", __func__, part_num); + if (part_num <= 0) + part_num = 1; + + /*2. initial struct of array*/ + /*zf_info_arr = kcalloc(part_num, sizeof(struct zf_info), GFP_KERNEL);*/ + if (zf_info_arr == NULL) { + E("%s, Allocate ZF info array failed!\n", __func__); + ret = MEM_ALLOC_FAIL; + goto ALOC_ZF_INFO_ARR_FAIL; + } + memset(zf_info_arr, 0x0, part_num * sizeof(struct zf_info)); + FW_buf = kcalloc(FW_BIN_16K_SZ, sizeof(uint8_t), GFP_KERNEL); + if (FW_buf == NULL) { + E("%s, Allocate FW_buf array failed!\n", __func__); + ret = MEM_ALLOC_FAIL; + goto ALOC_FW_BUF_FAIL; + } + + /*3. Find the data in the bin file */ + /*CFG*/ + cfg_sz = hx_parse_bin_cfg_data(fw_entry, zf_info_arr, FW_buf, sram_min, &ovl_sidx); + I("Now cfg_sz=%d\n", cfg_sz); + if (cfg_sz < 0) { + ret = LENGTH_FAIL; + goto END_FUNC; + } else { + cfg_crc_sw = g_core_fp.fp_Calculate_CRC_with_AP(FW_buf, 0, cfg_sz); + I("Now cfg_crc_sw=%X\n", cfg_crc_sw); + } + /*Fw Entity*/ + memcpy(buf, &fw_entry->data[0 * 0x10 + HX64K], 16); + memcpy(zf_info_arr[0].sram_addr, buf, 4); + zf_info_arr[0].write_size = buf[7] << 24 | buf[6] << 16 | buf[5] << 8 | buf[4]; + zf_info_arr[0].fw_addr = buf[11] << 24 | buf[10] << 16 | buf[9] << 8 | buf[8]; + + /* 4. write to sram*/ + if (G_POWERONOF == 1) { + /* FW entity */ + if (himax_sram_write_crc_check(fw_entry, zf_info_arr[0].sram_addr, zf_info_arr[0].fw_addr, zf_info_arr[0].write_size) != 0) + E("%s, HW CRC FAIL\n", __func__); + else + I("%s, HW CRC PASS\n", __func__); + + I("Now sram_min[0]=0x%02X,[1]=0x%02X,[2]=0x%02X,[3]=0x%02X\n", sram_min[0], sram_min[1], sram_min[2], sram_min[3]); + do { + g_core_fp.fp_register_write(sram_min, cfg_sz, FW_buf, 0); + cfg_crc_hw = g_core_fp.fp_check_CRC(sram_min, cfg_sz); + if (cfg_crc_hw != cfg_crc_sw) + E("Config CRC FAIL, HW CRC = %X,SW CRC = %X, retry = %d\n", cfg_crc_hw, cfg_crc_sw, retry); + else + I("Config CRC Pass\n"); + + } while (cfg_crc_hw != cfg_crc_sw && retry-- > 0); + +#ifdef HX_CODE_OVERLAY + if (private_ts->in_self_test == 0) { +#ifdef HX_SMART_WAKEUP + /* ovl_sidx - mpap */ + /* ovl_sidx+1 - gesture */ + /* ovl_sidx+2 - border */ + if (private_ts->suspended && private_ts->SMWP_enable) + ovl_sidx = ovl_sidx + 1; + else + ovl_sidx = ovl_sidx + 2; +#else + ovl_sidx = ovl_sidx + 2; +#endif + + if (himax_sram_write_crc_check(fw_entry, zf_info_arr[ovl_sidx].sram_addr, zf_info_arr[ovl_sidx].fw_addr, zf_info_arr[ovl_sidx].write_size) != 0) + E("%s, Overlay HW CRC FAIL\n", __func__); + else + I("%s, Overlay HW CRC PASS\n", __func__); + +#if defined(HX_SMART_WAKEUP) || defined(HX_HIGH_SENSE) || defined(HX_USB_DETECT_GLOBAL) + /*write back system config*/ + g_core_fp.fp_resend_cmd_func(private_ts->suspended); +#endif + +#if defined(HX_SMART_WAKEUP) + /* write overlay handshaking password */ + if (private_ts->SMWP_enable) { + if (private_ts->suspended) + send_data[0] = ovl_gesture_reply; + else + send_data[0] = ovl_border_reply; + + retry = 0; + + do { + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, send_data, 0); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, recv_data, 0); + retry++; + } while ((send_data[3] != recv_data[3] || send_data[2] != recv_data[2] || send_data[1] != recv_data[1] || send_data[0] != recv_data[0]) && retry < HIMAX_REG_RETRY_TIMES); + } +#endif + } else { + if (himax_sram_write_crc_check(fw_entry, zf_info_arr[ovl_sidx].sram_addr, zf_info_arr[ovl_sidx].fw_addr, zf_info_arr[ovl_sidx].write_size) != 0) + E("%s, Overlay HW CRC FAIL\n", __func__); + else + I("%s, Overlay HW CRC PASS\n", __func__); + } + I("%s: upgraded overlay section = %d\n", __func__, ovl_sidx); +#endif + + } else { + g_core_fp.fp_clean_sram_0f(zf_info_arr[0].sram_addr, zf_info_arr[0].write_size, 2); + } + +END_FUNC: + kfree(FW_buf); +ALOC_FW_BUF_FAIL: + /*kfree(zf_info_arr);*/ +ALOC_ZF_INFO_ARR_FAIL: + return ret; +} + +void himax_mcu_firmware_update_0f(const struct firmware *fw_entry) +{ + int ret = 0; + uint8_t tmp_data[DATA_LEN_4] = {0x01, 0x00, 0x00, 0x00}; + + I("%s,Entering - total FW size=%d\n", __func__, (int)fw_entry->size); + + g_core_fp.fp_register_write(pzf_op->addr_system_reset, 4, pzf_op->data_system_reset, 0); + + g_core_fp.fp_sense_off(false); + + if ((int)fw_entry->size > HX64K) { + ret = himax_zf_part_info(fw_entry); + } else { + /* first 48K */ + if (himax_sram_write_crc_check(fw_entry, pzf_op->data_sram_start_addr, 0, HX_48K_SZ) != 0) + E("%s, HW CRC FAIL - Main SRAM 48K\n", __func__); + + /*config info*/ + if (G_POWERONOF == 1) { + if (himax_sram_write_crc_check(fw_entry, pzf_op->data_cfg_info, 0xC000, 128) != 0) + E("Config info CRC Fail!\n"); + } else { + g_core_fp.fp_clean_sram_0f(pzf_op->data_cfg_info, 128, 2); + } + + if (G_POWERONOF == 1) { + if (himax_sram_write_crc_check(fw_entry, pzf_op->data_fw_cfg_1, 0xC0FE, 528) != 0) + E("FW config 1 CRC Fail!\n"); + } else { + g_core_fp.fp_clean_sram_0f(pzf_op->data_fw_cfg_1, 528, 1); + } + + if (G_POWERONOF == 1) { + if (himax_sram_write_crc_check(fw_entry, pzf_op->data_fw_cfg_3, 0xCA00, 128) != 0) + E("FW config 3 CRC Fail!\n"); + } else { + g_core_fp.fp_clean_sram_0f(pzf_op->data_fw_cfg_3, 128, 2); + } + + /*ADC config*/ + if (G_POWERONOF == 1) { + if (himax_sram_write_crc_check(fw_entry, pzf_op->data_adc_cfg_1, 0xD640, 1200) != 0) + E("ADC config 1 CRC Fail!\n"); + } else { + g_core_fp.fp_clean_sram_0f(pzf_op->data_adc_cfg_1, 1200, 2); + } + + if (G_POWERONOF == 1) { + if (himax_sram_write_crc_check(fw_entry, pzf_op->data_adc_cfg_2, 0xD320, 800) != 0) + E("ADC config 2 CRC Fail!\n"); + } else { + g_core_fp.fp_clean_sram_0f(pzf_op->data_adc_cfg_2, 800, 2); + } + + /*mapping table*/ + if (G_POWERONOF == 1) { + if (himax_sram_write_crc_check(fw_entry, pzf_op->data_map_table, 0xE000, 1536) != 0) + E("Mapping table CRC Fail!\n"); + } else { + g_core_fp.fp_clean_sram_0f(pzf_op->data_map_table, 1536, 2); + } + } + + /* set n frame=0*/ + /*if (G_POWERONOF == 1) + * g_core_fp.fp_write_sram_0f(fw_entry, pfw_op->addr_set_frame_addr, 0xC30C, 4); + *else + * g_core_fp.fp_clean_sram_0f(pfw_op->addr_set_frame_addr, 4, 2); + */ + /* reset N frame back to default value 1 for normal mode */ + g_core_fp.fp_register_write(pfw_op->addr_set_frame_addr, 4, tmp_data, 0); + + I("%s, End\n", __func__); +} + +int hx_0f_op_file_dirly(char *file_name) +{ + int err = NO_ERR, ret; + const struct firmware *fw_entry = NULL; + + + I("%s, Entering\n", __func__); + I("file name = %s\n", file_name); + ret = request_firmware(&fw_entry, file_name, private_ts->dev); + if (ret < 0) { +#if defined(__EMBEDDED_FW__) + fw_entry = &g_embedded_fw; + I("%s: Couldn't find userspace FW, use embedded FW(size:%zu) instead.\n", __func__, g_embedded_fw.size); +#else + E("%s, fail in line%d error code=%d,file maybe fail\n", __func__, __LINE__, ret); + return ret; +#endif + } + + himax_int_enable(0); + + if (g_f_0f_updat == 1) { + I("%s:[Warning]Other thread is updating now!\n", __func__); + err = -1; + goto END; + } else { + I("%s:Entering Update Flow!\n", __func__); + g_f_0f_updat = 1; + } + + g_core_fp.fp_firmware_update_0f(fw_entry); + if (ret >= 0) + release_firmware(fw_entry); + + g_f_0f_updat = 0; +END: + I("%s, END\n", __func__); + return err; +} + +int himax_mcu_0f_operation_dirly(void) +{ + int err = NO_ERR, ret; + const struct firmware *fw_entry = NULL; + + I("%s, Entering\n", __func__); + I("file name = %s\n", private_ts->pdata->i_CTPM_firmware_name); + ret = request_firmware(&fw_entry, private_ts->pdata->i_CTPM_firmware_name, private_ts->dev); + if (ret < 0) { +#if defined(__EMBEDDED_FW__) + fw_entry = &g_embedded_fw; + I("%s: Couldn't find userspace FW, use embedded FW(size:%zu) instead.\n", __func__, g_embedded_fw.size); +#else + E("%s, fail in line%d error code=%d,file maybe fail\n", __func__, __LINE__, ret); + return ret; +#endif + } + + himax_int_enable(0); + + if (g_f_0f_updat == 1) { + I("%s:[Warning]Other thread is updating now!\n", __func__); + err = -1; + goto END; + } else { + I("%s:Entering Update Flow!\n", __func__); + g_f_0f_updat = 1; + } + + g_core_fp.fp_firmware_update_0f(fw_entry); + if (ret >= 0) + release_firmware(fw_entry); + + g_f_0f_updat = 0; +END: + I("%s, END\n", __func__); + return err; +} + +void himax_mcu_0f_operation(struct work_struct *work) +{ + int err = NO_ERR; + const struct firmware *fw_entry = NULL; + + I("%s, Entering\n", __func__); + I("file name = %s\n", private_ts->pdata->i_CTPM_firmware_name); + err = request_firmware(&fw_entry, private_ts->pdata->i_CTPM_firmware_name, private_ts->dev); + if (err < 0) { +#if defined(__EMBEDDED_FW__) + fw_entry = &g_embedded_fw; + I("%s: Couldn't find userspace FW, use embedded FW(size:%zu) instead.\n", __func__, g_embedded_fw.size); +#else + E("%s, fail in line%d error code=%d,file maybe fail\n", __func__, __LINE__, err); + goto END; +#endif + } + + if (g_f_0f_updat == 1) { + I("%s:[Warning]Other thread is updating now!\n", __func__); + goto END; + } else { + I("%s:Entering Update Flow!\n", __func__); + g_f_0f_updat = 1; + } + + himax_int_enable(0); + + g_core_fp.fp_firmware_update_0f(fw_entry); + if (err >= 0) + release_firmware(fw_entry); + + g_core_fp.fp_reload_disable(0); + g_core_fp.fp_read_FW_ver(); + /*msleep (10);*/ + g_core_fp.fp_touch_information(); + /*msleep (10);*/ + g_core_fp.fp_sense_on(0x00); + /*msleep (10);*/ + I("%s:End\n", __func__); + himax_int_enable(1); + + g_f_0f_updat = 0; +END: + I("%s, END\n", __func__); +} + +static int himax_mcu_0f_esd_check(void) +{ + return NO_ERR; +} + + +#ifdef HX_0F_DEBUG +void himax_mcu_read_sram_0f(const struct firmware *fw_entry, uint8_t *addr, int start_index, int read_len) +{ + int total_read_times = 0; + int max_bus_size = MAX_I2C_TRANS_SZ; + int total_size_temp = 0; + int total_size = 0; + int address = 0; + int i = 0, j = 0; + int not_same = 0; + + uint8_t tmp_addr[4]; + uint8_t *temp_info_data; + int *not_same_buff; + + I("%s, Entering\n", __func__); + + g_core_fp.fp_burst_enable(1); + + total_size = read_len; + + total_size_temp = read_len; + +#if defined(HX_SPI_OPERATION) + if (read_len > 2048) + max_bus_size = 2048; + else + max_bus_size = read_len; +#else + if (read_len > 240) + max_bus_size = 240; + else + max_bus_size = read_len; +#endif + + + temp_info_data = kcalloc(total_size, sizeof(uint8_t), GFP_KERNEL); + not_same_buff = kcalloc(total_size, sizeof(int), GFP_KERNEL); + + + tmp_addr[3] = addr[3]; + tmp_addr[2] = addr[2]; + tmp_addr[1] = addr[1]; + tmp_addr[0] = addr[0]; + I("%s, read addr tmp_addr[3]=0x%2.2X, tmp_addr[2]=0x%2.2X, tmp_addr[1]=0x%2.2X, tmp_addr[0]=0x%2.2X\n", __func__, tmp_addr[3], tmp_addr[2], tmp_addr[1], tmp_addr[0]); + + I("%s, total size=%d\n", __func__, total_size); + + g_core_fp.fp_burst_enable(1); + + if (total_size % max_bus_size == 0) + total_read_times = total_size / max_bus_size; + else + total_read_times = total_size / max_bus_size + 1; + + for (i = 0; i < (total_read_times); i++) { + if (total_size_temp >= max_bus_size) { + g_core_fp.fp_register_read(tmp_addr, max_bus_size, &temp_info_data[i*max_bus_size], false); + total_size_temp = total_size_temp - max_bus_size; + } else { + g_core_fp.fp_register_read(tmp_addr, total_size_temp % max_bus_size, &temp_info_data[i*max_bus_size], false); + } + + address = ((i+1) * max_bus_size); + tmp_addr[0] = addr[0] + (uint8_t) ((address) & 0x00FF); + if (tmp_addr[0] < addr[0]) + tmp_addr[1] = addr[1] + (uint8_t) ((address>>8) & 0x00FF) + 1; + else + tmp_addr[1] = addr[1] + (uint8_t) ((address>>8) & 0x00FF); + + /*msleep (10);*/ + } + I("%s, READ Start\n", __func__); + I("%s, start_index = %d\n", __func__, start_index); + j = start_index; + for (i = 0; i < read_len; i++, j++) { + if (fw_entry->data[j] != temp_info_data[i]) { + not_same++; + not_same_buff[i] = 1; + } + + I("0x%2.2X, ", temp_info_data[i]); + + if (i > 0 && i%16 == 15) + pr_info("\n"); + + } + I("%s, READ END\n", __func__); + I("%s, Not Same count=%d\n", __func__, not_same); + if (not_same != 0) { + j = start_index; + for (i = 0; i < read_len; i++, j++) { + if (not_same_buff[i] == 1) + I("bin = [%d] 0x%2.2X\n", i, fw_entry->data[j]); + } + for (i = 0; i < read_len; i++, j++) { + if (not_same_buff[i] == 1) + I("sram = [%d] 0x%2.2X\n", i, temp_info_data[i]); + } + } + I("%s, READ END\n", __func__); + I("%s, Not Same count=%d\n", __func__, not_same); + I("%s, END\n", __func__); + + kfree(not_same_buff); + kfree(temp_info_data); +} + +void himax_mcu_read_all_sram(uint8_t *addr, int read_len) +{ + int total_read_times = 0; + int max_bus_size = MAX_I2C_TRANS_SZ; + int total_size_temp = 0; + int total_size = 0; + int address = 0; + int i = 0; + /* struct file *fn; */ + /* struct filename *vts_name; */ + + uint8_t tmp_addr[4]; + uint8_t *temp_info_data; + + I("%s, Entering\n", __func__); + + g_core_fp.fp_burst_enable(1); + + total_size = read_len; + + total_size_temp = read_len; + + temp_info_data = kcalloc(total_size, sizeof(uint8_t), GFP_KERNEL); + + + tmp_addr[3] = addr[3]; + tmp_addr[2] = addr[2]; + tmp_addr[1] = addr[1]; + tmp_addr[0] = addr[0]; + I("%s, read addr tmp_addr[3]=0x%2.2X, tmp_addr[2]=0x%2.2X, tmp_addr[1]=0x%2.2X, tmp_addr[0]=0x%2.2X\n", __func__, tmp_addr[3], tmp_addr[2], tmp_addr[1], tmp_addr[0]); + + I("%s, total size=%d\n", __func__, total_size); + + if (total_size % max_bus_size == 0) + total_read_times = total_size / max_bus_size; + else + total_read_times = total_size / max_bus_size + 1; + + for (i = 0; i < (total_read_times); i++) { + if (total_size_temp >= max_bus_size) { + g_core_fp.fp_register_read(tmp_addr, max_bus_size, &temp_info_data[i*max_bus_size], false); + total_size_temp = total_size_temp - max_bus_size; + } else { + g_core_fp.fp_register_read(tmp_addr, total_size_temp % max_bus_size, &temp_info_data[i*max_bus_size], false); + } + + address = ((i+1) * max_bus_size); + tmp_addr[1] = addr[1] + (uint8_t) ((address>>8) & 0x00FF); + tmp_addr[0] = addr[0] + (uint8_t) ((address) & 0x00FF); + + /*msleep (10);*/ + } + I("%s, NOW addr tmp_addr[3]=0x%2.2X, tmp_addr[2]=0x%2.2X, tmp_addr[1]=0x%2.2X, tmp_addr[0]=0x%2.2X\n", __func__, tmp_addr[3], tmp_addr[2], tmp_addr[1], tmp_addr[0]); + /*for(i = 0;i 0 && i%16 == 15) + * printk("\n"); + *} + */ + + /* need modify + * I("Now Write File start!\n"); + * vts_name = kp_getname_kernel("/sdcard/dump_dsram.txt"); + * fn = kp_file_open_name(vts_name, O_CREAT | O_WRONLY, 0); + * if (!IS_ERR (fn)) { + * I("%s create file and ready to write\n", __func__); + * fn->f_op->write (fn, temp_info_data, read_len*sizeof (uint8_t), &fn->f_pos); + * filp_close (fn, NULL); + * } + * I("Now Write File End!\n"); + */ + + I("%s, END\n", __func__); + + kfree(temp_info_data); +} + +void himax_mcu_firmware_read_0f(const struct firmware *fw_entry, int type) +{ + uint8_t tmp_addr[4]; + + I("%s, Entering\n", __func__); + if (type == 0) { /* first 48K */ + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_sram_start_addr, 0, HX_48K_SZ); + g_core_fp.fp_read_all_sram(tmp_addr, 0xC000); + } else { /*last 16k*/ + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_cfg_info, 0xC000, 132); + + /*FW config*/ + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_fw_cfg_1, 0xC0FE, 484); + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_fw_cfg_2, 0xC9DE, 36); + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_fw_cfg_3, 0xCA00, 72); + + /*ADC config*/ + + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_adc_cfg_1, 0xD630, 1188); + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_adc_cfg_2, 0xD318, 792); + + + /*mapping table*/ + g_core_fp.fp_read_sram_0f(fw_entry, pzf_op->data_map_table, 0xE000, 1536); + + /* set n frame=0*/ + g_core_fp.fp_read_sram_0f(fw_entry, pfw_op->addr_set_frame_addr, 0xC30C, 4); + } + + I("%s, END\n", __func__); +} + +void himax_mcu_0f_operation_check(int type) +{ + int err = NO_ERR; + const struct firmware *fw_entry = NULL; + /* char *firmware_name = "himax.bin"; */ + + + I("%s, Entering\n", __func__); + I("file name = %s\n", private_ts->pdata->i_CTPM_firmware_name); + + + err = request_firmware(&fw_entry, private_ts->pdata->i_CTPM_firmware_name, private_ts->dev); + if (err < 0) { +#if defined(__EMBEDDED_FW__) + fw_entry = &g_embedded_fw; + I("%s: Couldn't find userspace FW, use embedded FW(size:%zu) instead.\n", __func__, g_embedded_fw.size); +#else + E("%s, fail in line%d error code=%d\n", __func__, __LINE__, err); + return; +#endif + } + + I("first 4 bytes 0x%2X, 0x%2X, 0x%2X, 0x%2X !\n", fw_entry->data[0], fw_entry->data[1], fw_entry->data[2], fw_entry->data[3]); + I("next 4 bytes 0x%2X, 0x%2X, 0x%2X, 0x%2X !\n", fw_entry->data[4], fw_entry->data[5], fw_entry->data[6], fw_entry->data[7]); + I("and next 4 bytes 0x%2X, 0x%2X, 0x%2X, 0x%2X !\n", fw_entry->data[8], fw_entry->data[9], fw_entry->data[10], fw_entry->data[11]); + + g_core_fp.fp_firmware_read_0f(fw_entry, type); + + if (err >= 0) + release_firmware(fw_entry); + I("%s, END\n", __func__); +} +#endif + +#ifdef HX_CODE_OVERLAY +int himax_mcu_0f_overlay(int ovl_type, int mode) +{ + return NO_ERR; +} +#endif + +#endif + +#ifdef CORE_INIT +/* init start */ +static void himax_mcu_fp_init(void) +{ +#ifdef CORE_IC + g_core_fp.fp_burst_enable = himax_mcu_burst_enable; + g_core_fp.fp_register_read = himax_mcu_register_read; + /*g_core_fp.fp_flash_write_burst = himax_mcu_flash_write_burst;*/ + /*g_core_fp.fp_flash_write_burst_lenth = himax_mcu_flash_write_burst_lenth;*/ + g_core_fp.fp_register_write = himax_mcu_register_write; + g_core_fp.fp_interface_on = himax_mcu_interface_on; + g_core_fp.fp_sense_on = himax_mcu_sense_on; + g_core_fp.fp_sense_off = himax_mcu_sense_off; + g_core_fp.fp_wait_wip = himax_mcu_wait_wip; + g_core_fp.fp_init_psl = himax_mcu_init_psl; + g_core_fp.fp_resume_ic_action = himax_mcu_resume_ic_action; + g_core_fp.fp_suspend_ic_action = himax_mcu_suspend_ic_action; + g_core_fp.fp_power_on_init = himax_mcu_power_on_init; + g_core_fp.fp_dd_clk_set = himax_mcu_dd_clk_set; + g_core_fp.fp_dd_reg_en = himax_mcu_dd_reg_en; + g_core_fp.fp_ic_id_read = himax_mcu_ic_id_read; + g_core_fp.fp_dd_reg_write = himax_mcu_dd_reg_write; + g_core_fp.fp_dd_reg_read = himax_mcu_dd_reg_read; +#endif +#ifdef CORE_FW + g_core_fp.fp_system_reset = himax_mcu_system_reset; + g_core_fp.fp_Calculate_CRC_with_AP = himax_mcu_Calculate_CRC_with_AP; + g_core_fp.fp_check_CRC = himax_mcu_check_CRC; + g_core_fp.fp_set_reload_cmd = himax_mcu_set_reload_cmd; + g_core_fp.fp_program_reload = himax_mcu_program_reload; +#ifdef HX_P_SENSOR + g_core_fp.fp_ulpm_in = himax_mcu_ulpm_in; + g_core_fp.fp_black_gest_ctrl = himax_mcu_black_gest_ctrl; +#endif + g_core_fp.fp_set_SMWP_enable = himax_mcu_set_SMWP_enable; + g_core_fp.fp_set_HSEN_enable = himax_mcu_set_HSEN_enable; + g_core_fp.fp_usb_detect_set = himax_mcu_usb_detect_set; + g_core_fp.fp_diag_register_set = himax_mcu_diag_register_set; + g_core_fp.fp_chip_self_test = himax_mcu_chip_self_test; + g_core_fp.fp_idle_mode = himax_mcu_idle_mode; + g_core_fp.fp_reload_disable = himax_mcu_reload_disable; + g_core_fp.fp_check_chip_version = himax_mcu_check_chip_version; + g_core_fp.fp_read_ic_trigger_type = himax_mcu_read_ic_trigger_type; + g_core_fp.fp_read_i2c_status = himax_mcu_read_i2c_status; + g_core_fp.fp_read_FW_ver = himax_mcu_read_FW_ver; + g_core_fp.fp_read_event_stack = himax_mcu_read_event_stack; + g_core_fp.fp_return_event_stack = himax_mcu_return_event_stack; + g_core_fp.fp_calculateChecksum = himax_mcu_calculateChecksum; + g_core_fp.fp_read_FW_status = himax_mcu_read_FW_status; + g_core_fp.fp_irq_switch = himax_mcu_irq_switch; + g_core_fp.fp_assign_sorting_mode = himax_mcu_assign_sorting_mode; + g_core_fp.fp_check_sorting_mode = himax_mcu_check_sorting_mode; + g_core_fp.fp_switch_mode = himax_mcu_switch_mode; + g_core_fp.fp_read_DD_status = himax_mcu_read_DD_status; +#if defined(HX_AUTO_UPDATE_FW) + g_core_fp._diff_overlay_bin = hx_mcu_diff_overlay_bin; +#endif +#endif +#ifdef CORE_FLASH + g_core_fp.fp_chip_erase = himax_mcu_chip_erase; + g_core_fp.fp_block_erase = himax_mcu_block_erase; + g_core_fp.fp_sector_erase = himax_mcu_sector_erase; + g_core_fp.fp_flash_programming = himax_mcu_flash_programming; + g_core_fp.fp_flash_page_write = himax_mcu_flash_page_write; + g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_32k = himax_mcu_fts_ctpm_fw_upgrade_with_sys_fs_32k; + g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_60k = himax_mcu_fts_ctpm_fw_upgrade_with_sys_fs_60k; + g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_64k = himax_mcu_fts_ctpm_fw_upgrade_with_sys_fs_64k; + g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_124k = himax_mcu_fts_ctpm_fw_upgrade_with_sys_fs_124k; + g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_128k = himax_mcu_fts_ctpm_fw_upgrade_with_sys_fs_128k; + g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_255k = himax_mcu_fts_ctpm_fw_upgrade_with_sys_fs_255k; + g_core_fp.fp_flash_dump_func = himax_mcu_flash_dump_func; + g_core_fp.fp_flash_lastdata_check = himax_mcu_flash_lastdata_check; + g_core_fp._diff_overlay_flash = hx_mcu_diff_overlay_flash; +#ifdef SEC_FACTORY_MODE + g_core_fp.set_edge_border = hx_mcu_set_edge_border; +// g_core_fp.set_cal_switch = hx_mcu_set_cal_switch; + g_core_fp.get_rport_thrsh = hx_mcu_get_rport_thrsh; +#endif +#endif +#ifdef CORE_SRAM + g_core_fp.fp_sram_write = himax_mcu_sram_write; + g_core_fp.fp_sram_verify = himax_mcu_sram_verify; + g_core_fp.fp_get_DSRAM_data = himax_mcu_get_DSRAM_data; +#endif +#ifdef CORE_DRIVER + g_core_fp.fp_chip_init = himax_mcu_init_ic; +#ifdef HX_AUTO_UPDATE_FW + g_core_fp.fp_fw_ver_bin = himax_mcu_fw_ver_bin; +#endif +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_pin_reset = himax_mcu_pin_reset; + g_core_fp.fp_ic_reset = himax_mcu_ic_reset; +#endif + g_core_fp.fp_touch_information = himax_mcu_touch_information; + g_core_fp.fp_reload_config = himax_mcu_reload_config; + g_core_fp.fp_get_touch_data_size = himax_mcu_get_touch_data_size; + g_core_fp.fp_hand_shaking = himax_mcu_hand_shaking; + g_core_fp.fp_determin_diag_rawdata = himax_mcu_determin_diag_rawdata; + g_core_fp.fp_determin_diag_storage = himax_mcu_determin_diag_storage; + g_core_fp.fp_cal_data_len = himax_mcu_cal_data_len; + g_core_fp.fp_diag_check_sum = himax_mcu_diag_check_sum; + g_core_fp.fp_diag_parse_raw_data = himax_mcu_diag_parse_raw_data; +#ifdef HX_ESD_RECOVERY + g_core_fp.fp_ic_esd_recovery = himax_mcu_ic_esd_recovery; + g_core_fp.fp_esd_ic_reset = himax_mcu_esd_ic_reset; +#endif +#if defined(HX_SMART_WAKEUP) || defined(HX_HIGH_SENSE) || defined(HX_USB_DETECT_GLOBAL) + g_core_fp.fp_resend_cmd_func = himax_mcu_resend_cmd_func; +#endif +#if defined(HX_TP_PROC_GUEST_INFO) + g_core_fp.guest_info_get_status = himax_guest_info_get_status; + g_core_fp.read_guest_info = hx_read_guest_info; +#endif +#endif +#ifdef HX_ZERO_FLASH + g_core_fp.fp_reload_disable = hx_dis_rload_0f; + g_core_fp.fp_clean_sram_0f = himax_mcu_clean_sram_0f; + g_core_fp.fp_write_sram_0f = himax_mcu_write_sram_0f; + g_core_fp.fp_write_sram_0f_crc = himax_sram_write_crc_check; + g_core_fp.fp_firmware_update_0f = himax_mcu_firmware_update_0f; + g_core_fp.fp_0f_operation = himax_mcu_0f_operation; + g_core_fp.fp_0f_operation_dirly = himax_mcu_0f_operation_dirly; + g_core_fp.fp_0f_op_file_dirly = hx_0f_op_file_dirly; + g_core_fp.fp_0f_esd_check = himax_mcu_0f_esd_check; +#ifdef HX_0F_DEBUG + g_core_fp.fp_read_sram_0f = himax_mcu_read_sram_0f; + g_core_fp.fp_read_all_sram = himax_mcu_read_all_sram; + g_core_fp.fp_firmware_read_0f = himax_mcu_firmware_read_0f; + g_core_fp.fp_0f_operation_check = himax_mcu_0f_operation_check; +#endif +#ifdef HX_CODE_OVERLAY + g_core_fp.fp_0f_overlay = himax_mcu_0f_overlay; +#endif +#endif +} + +void himax_mcu_in_cmd_struct_free(void) +{ + pic_op = NULL; + pfw_op = NULL; + pflash_op = NULL; + psram_op = NULL; + pdriver_op = NULL; + kfree(g_internal_buffer); + g_internal_buffer = NULL; +#ifdef HX_ZERO_FLASH + kfree(g_core_cmd_op->zf_op); + g_core_cmd_op->zf_op = NULL; +#endif + kfree(g_core_cmd_op->driver_op); + g_core_cmd_op->driver_op = NULL; + kfree(g_core_cmd_op->sram_op); + g_core_cmd_op->sram_op = NULL; + kfree(g_core_cmd_op->flash_op); + g_core_cmd_op->flash_op = NULL; + kfree(g_core_cmd_op->fw_op); + g_core_cmd_op->fw_op = NULL; + kfree(g_core_cmd_op->ic_op); + g_core_cmd_op->ic_op = NULL; + kfree(g_core_cmd_op); + g_core_cmd_op = NULL; +#if defined(HX_EN_DYNAMIC_NAME) + if (i_CTPM_firmware_name != NULL) { + kfree(i_CTPM_firmware_name); + i_CTPM_firmware_name = NULL; + } +#endif + + I("%s: release completed\n", __func__); +} + +int himax_mcu_in_cmd_struct_init(void) +{ + int err = 0; + + I("%s: Entering!\n", __func__); + himax_mcu_cmd_struct_free = himax_mcu_in_cmd_struct_free; + + g_core_cmd_op = kzalloc(sizeof(struct himax_core_command_operation), GFP_KERNEL); + if (g_core_cmd_op == NULL) { + err = -ENOMEM; + goto err_g_core_cmd_op_fail; + } + + g_core_cmd_op->ic_op = kzalloc(sizeof(struct ic_operation), GFP_KERNEL); + if (g_core_cmd_op->ic_op == NULL) { + err = -ENOMEM; + goto err_g_core_cmd_op_ic_op_fail; + } + + g_core_cmd_op->fw_op = kzalloc(sizeof(struct fw_operation), GFP_KERNEL); + if (g_core_cmd_op->fw_op == NULL) { + err = -ENOMEM; + goto err_g_core_cmd_op_fw_op_fail; + } + + g_core_cmd_op->flash_op = kzalloc(sizeof(struct flash_operation), GFP_KERNEL); + if (g_core_cmd_op->flash_op == NULL) { + err = -ENOMEM; + goto err_g_core_cmd_op_flash_op_fail; + } + + g_core_cmd_op->sram_op = kzalloc(sizeof(struct sram_operation), GFP_KERNEL); + if (g_core_cmd_op->sram_op == NULL) { + err = -ENOMEM; + goto err_g_core_cmd_op_sram_op_fail; + } + + g_core_cmd_op->driver_op = kzalloc(sizeof(struct driver_operation), GFP_KERNEL); + if (g_core_cmd_op->driver_op == NULL) { + err = -ENOMEM; + goto err_g_core_cmd_op_driver_op_fail; + } + + pic_op = g_core_cmd_op->ic_op; + pfw_op = g_core_cmd_op->fw_op; + pflash_op = g_core_cmd_op->flash_op; + psram_op = g_core_cmd_op->sram_op; + pdriver_op = g_core_cmd_op->driver_op; +#ifdef HX_ZERO_FLASH + g_core_cmd_op->zf_op = kzalloc(sizeof(struct zf_operation), GFP_KERNEL); + if (g_core_cmd_op->zf_op == NULL) { + err = -ENOMEM; + goto err_g_core_cmd_op_zf_op_fail; + } + pzf_op = g_core_cmd_op->zf_op; + +#endif + + g_internal_buffer = kzalloc(sizeof(uint8_t) * (HX_MAX_WRITE_SZ + 6), GFP_KERNEL); + + if (g_internal_buffer == NULL) { + err = -ENOMEM; + goto err_g_core_cmd_op_g_internal_buffer_fail; + } + himax_mcu_fp_init(); + + return NO_ERR; + +err_g_core_cmd_op_g_internal_buffer_fail: +#ifdef HX_ZERO_FLASH + kfree(g_core_cmd_op->zf_op); + g_core_cmd_op->zf_op = NULL; +err_g_core_cmd_op_zf_op_fail: +#endif + kfree(g_core_cmd_op->driver_op); + g_core_cmd_op->driver_op = NULL; +err_g_core_cmd_op_driver_op_fail: + kfree(g_core_cmd_op->sram_op); + g_core_cmd_op->sram_op = NULL; +err_g_core_cmd_op_sram_op_fail: + kfree(g_core_cmd_op->flash_op); + g_core_cmd_op->flash_op = NULL; +err_g_core_cmd_op_flash_op_fail: + kfree(g_core_cmd_op->fw_op); + g_core_cmd_op->fw_op = NULL; +err_g_core_cmd_op_fw_op_fail: + kfree(g_core_cmd_op->ic_op); + g_core_cmd_op->ic_op = NULL; +err_g_core_cmd_op_ic_op_fail: + kfree(g_core_cmd_op); + g_core_cmd_op = NULL; +err_g_core_cmd_op_fail: + + return err; +} +EXPORT_SYMBOL(himax_mcu_in_cmd_struct_init); + +void himax_in_parse_assign_cmd(uint32_t addr, uint8_t *cmd, int len) +{ + /*I("%s: Entering!\n", __func__);*/ + switch (len) { + case 1: + cmd[0] = addr; + /*I("%s: cmd[0] = 0x%02X\n", __func__, cmd[0]);*/ + break; + + case 2: + cmd[0] = addr & 0xFF; + cmd[1] = (addr >> 8) & 0xFF; + /*I("%s: cmd[0] = 0x%02X,cmd[1] = 0x%02X\n", __func__, cmd[0], cmd[1]);*/ + break; + + case 4: + cmd[0] = addr & 0xFF; + cmd[1] = (addr >> 8) & 0xFF; + cmd[2] = (addr >> 16) & 0xFF; + cmd[3] = (addr >> 24) & 0xFF; + /* I("%s: cmd[0] = 0x%02X,cmd[1] = 0x%02X,cmd[2] = 0x%02X,cmd[3] = 0x%02X\n", */ + /* __func__, cmd[0], cmd[1], cmd[2], cmd[3]);*/ + break; + + default: + E("%s: input length fault,len = %d!\n", __func__, len); + } +} +EXPORT_SYMBOL(himax_in_parse_assign_cmd); + +void himax_mcu_in_cmd_init(void) +{ + I("%s: Entering!\n", __func__); +#ifdef CORE_IC + himax_in_parse_assign_cmd(ic_adr_ahb_addr_byte_0, pic_op->addr_ahb_addr_byte_0, sizeof(pic_op->addr_ahb_addr_byte_0)); + himax_in_parse_assign_cmd(ic_adr_ahb_rdata_byte_0, pic_op->addr_ahb_rdata_byte_0, sizeof(pic_op->addr_ahb_rdata_byte_0)); + himax_in_parse_assign_cmd(ic_adr_ahb_access_direction, pic_op->addr_ahb_access_direction, sizeof(pic_op->addr_ahb_access_direction)); + himax_in_parse_assign_cmd(ic_adr_conti, pic_op->addr_conti, sizeof(pic_op->addr_conti)); + himax_in_parse_assign_cmd(ic_adr_incr4, pic_op->addr_incr4, sizeof(pic_op->addr_incr4)); + himax_in_parse_assign_cmd(ic_adr_i2c_psw_lb, pic_op->adr_i2c_psw_lb, sizeof(pic_op->adr_i2c_psw_lb)); + himax_in_parse_assign_cmd(ic_adr_i2c_psw_ub, pic_op->adr_i2c_psw_ub, sizeof(pic_op->adr_i2c_psw_ub)); + himax_in_parse_assign_cmd(ic_cmd_ahb_access_direction_read, pic_op->data_ahb_access_direction_read, sizeof(pic_op->data_ahb_access_direction_read)); + himax_in_parse_assign_cmd(ic_cmd_conti, pic_op->data_conti, sizeof(pic_op->data_conti)); + himax_in_parse_assign_cmd(ic_cmd_incr4, pic_op->data_incr4, sizeof(pic_op->data_incr4)); + himax_in_parse_assign_cmd(ic_cmd_i2c_psw_lb, pic_op->data_i2c_psw_lb, sizeof(pic_op->data_i2c_psw_lb)); + himax_in_parse_assign_cmd(ic_cmd_i2c_psw_ub, pic_op->data_i2c_psw_ub, sizeof(pic_op->data_i2c_psw_ub)); + himax_in_parse_assign_cmd(ic_adr_tcon_on_rst, pic_op->addr_tcon_on_rst, sizeof(pic_op->addr_tcon_on_rst)); + himax_in_parse_assign_cmd(ic_addr_adc_on_rst, pic_op->addr_adc_on_rst, sizeof(pic_op->addr_adc_on_rst)); + himax_in_parse_assign_cmd(ic_adr_psl, pic_op->addr_psl, sizeof(pic_op->addr_psl)); + himax_in_parse_assign_cmd(ic_adr_cs_central_state, pic_op->addr_cs_central_state, sizeof(pic_op->addr_cs_central_state)); + himax_in_parse_assign_cmd(ic_cmd_rst, pic_op->data_rst, sizeof(pic_op->data_rst)); + himax_in_parse_assign_cmd(ic_adr_osc_en, pic_op->adr_osc_en, sizeof(pic_op->adr_osc_en)); + himax_in_parse_assign_cmd(ic_adr_osc_pw, pic_op->adr_osc_pw, sizeof(pic_op->adr_osc_pw)); +#endif +#ifdef CORE_FW + himax_in_parse_assign_cmd(fw_addr_system_reset, pfw_op->addr_system_reset, sizeof(pfw_op->addr_system_reset)); + himax_in_parse_assign_cmd(fw_addr_safe_mode_release_pw, pfw_op->addr_safe_mode_release_pw, sizeof(pfw_op->addr_safe_mode_release_pw)); + himax_in_parse_assign_cmd(fw_addr_ctrl_fw, pfw_op->addr_ctrl_fw_isr, sizeof(pfw_op->addr_ctrl_fw_isr)); + himax_in_parse_assign_cmd(fw_addr_flag_reset_event, pfw_op->addr_flag_reset_event, sizeof(pfw_op->addr_flag_reset_event)); + himax_in_parse_assign_cmd(fw_addr_hsen_enable, pfw_op->addr_hsen_enable, sizeof(pfw_op->addr_hsen_enable)); + himax_in_parse_assign_cmd(fw_addr_smwp_enable, pfw_op->addr_smwp_enable, sizeof(pfw_op->addr_smwp_enable)); + himax_in_parse_assign_cmd(fw_addr_program_reload_from, pfw_op->addr_program_reload_from, sizeof(pfw_op->addr_program_reload_from)); + himax_in_parse_assign_cmd(fw_addr_program_reload_to, pfw_op->addr_program_reload_to, sizeof(pfw_op->addr_program_reload_to)); + himax_in_parse_assign_cmd(fw_addr_program_reload_page_write, pfw_op->addr_program_reload_page_write, sizeof(pfw_op->addr_program_reload_page_write)); + himax_in_parse_assign_cmd(fw_addr_raw_out_sel, pfw_op->addr_raw_out_sel, sizeof(pfw_op->addr_raw_out_sel)); + himax_in_parse_assign_cmd(fw_addr_reload_status, pfw_op->addr_reload_status, sizeof(pfw_op->addr_reload_status)); + himax_in_parse_assign_cmd(fw_addr_reload_crc32_result, pfw_op->addr_reload_crc32_result, sizeof(pfw_op->addr_reload_crc32_result)); + himax_in_parse_assign_cmd(fw_addr_reload_addr_from, pfw_op->addr_reload_addr_from, sizeof(pfw_op->addr_reload_addr_from)); + himax_in_parse_assign_cmd(fw_addr_reload_addr_cmd_beat, pfw_op->addr_reload_addr_cmd_beat, sizeof(pfw_op->addr_reload_addr_cmd_beat)); + himax_in_parse_assign_cmd(fw_addr_selftest_addr_en, pfw_op->addr_selftest_addr_en, sizeof(pfw_op->addr_selftest_addr_en)); + himax_in_parse_assign_cmd(fw_addr_criteria_addr, pfw_op->addr_criteria_addr, sizeof(pfw_op->addr_criteria_addr)); + himax_in_parse_assign_cmd(fw_addr_set_frame_addr, pfw_op->addr_set_frame_addr, sizeof(pfw_op->addr_set_frame_addr)); + himax_in_parse_assign_cmd(fw_addr_selftest_result_addr, pfw_op->addr_selftest_result_addr, sizeof(pfw_op->addr_selftest_result_addr)); + himax_in_parse_assign_cmd(fw_addr_sorting_mode_en, pfw_op->addr_sorting_mode_en, sizeof(pfw_op->addr_sorting_mode_en)); + himax_in_parse_assign_cmd(fw_addr_fw_mode_status, pfw_op->addr_fw_mode_status, sizeof(pfw_op->addr_fw_mode_status)); + himax_in_parse_assign_cmd(fw_addr_icid_addr, pfw_op->addr_icid_addr, sizeof(pfw_op->addr_icid_addr)); + himax_in_parse_assign_cmd(fw_addr_trigger_addr, pfw_op->addr_trigger_addr, sizeof(pfw_op->addr_trigger_addr)); + himax_in_parse_assign_cmd(fw_addr_fw_ver_addr, pfw_op->addr_fw_ver_addr, sizeof(pfw_op->addr_fw_ver_addr)); + himax_in_parse_assign_cmd(fw_addr_fw_cfg_addr, pfw_op->addr_fw_cfg_addr, sizeof(pfw_op->addr_fw_cfg_addr)); + himax_in_parse_assign_cmd(fw_addr_fw_vendor_addr, pfw_op->addr_fw_vendor_addr, sizeof(pfw_op->addr_fw_vendor_addr)); + himax_in_parse_assign_cmd(fw_addr_cus_info, pfw_op->addr_cus_info, sizeof(pfw_op->addr_cus_info)); + himax_in_parse_assign_cmd(fw_addr_proj_info, pfw_op->addr_proj_info, sizeof(pfw_op->addr_proj_info)); + himax_in_parse_assign_cmd(fw_addr_fw_state_addr, pfw_op->addr_fw_state_addr, sizeof(pfw_op->addr_fw_state_addr)); + himax_in_parse_assign_cmd(fw_addr_fw_dbg_msg_addr, pfw_op->addr_fw_dbg_msg_addr, sizeof(pfw_op->addr_fw_dbg_msg_addr)); + himax_in_parse_assign_cmd(fw_addr_chk_fw_status, pfw_op->addr_chk_fw_status, sizeof(pfw_op->addr_chk_fw_status)); + himax_in_parse_assign_cmd(fw_addr_dd_handshak_addr, pfw_op->addr_dd_handshak_addr, sizeof(pfw_op->addr_dd_handshak_addr)); + himax_in_parse_assign_cmd(fw_addr_dd_data_addr, pfw_op->addr_dd_data_addr, sizeof(pfw_op->addr_dd_data_addr)); + himax_in_parse_assign_cmd(fw_data_system_reset, pfw_op->data_system_reset, sizeof(pfw_op->data_system_reset)); + himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_active, pfw_op->data_safe_mode_release_pw_active, sizeof(pfw_op->data_safe_mode_release_pw_active)); + himax_in_parse_assign_cmd(fw_data_clear, pfw_op->data_clear, sizeof(pfw_op->data_clear)); + himax_in_parse_assign_cmd(fw_data_clear, pfw_op->data_clear, sizeof(pfw_op->data_clear)); + himax_in_parse_assign_cmd(fw_data_fw_stop, pfw_op->data_fw_stop, sizeof(pfw_op->data_fw_stop)); + himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, pfw_op->data_safe_mode_release_pw_reset, sizeof(pfw_op->data_safe_mode_release_pw_reset)); + himax_in_parse_assign_cmd(fw_data_program_reload_start, pfw_op->data_program_reload_start, sizeof(pfw_op->data_program_reload_start)); + himax_in_parse_assign_cmd(fw_data_program_reload_compare, pfw_op->data_program_reload_compare, sizeof(pfw_op->data_program_reload_compare)); + himax_in_parse_assign_cmd(fw_data_program_reload_break, pfw_op->data_program_reload_break, sizeof(pfw_op->data_program_reload_break)); + himax_in_parse_assign_cmd(fw_data_selftest_request, pfw_op->data_selftest_request, sizeof(pfw_op->data_selftest_request)); + himax_in_parse_assign_cmd(fw_data_criteria_aa_top, pfw_op->data_criteria_aa_top, sizeof(pfw_op->data_criteria_aa_top)); + himax_in_parse_assign_cmd(fw_data_criteria_aa_bot, pfw_op->data_criteria_aa_bot, sizeof(pfw_op->data_criteria_aa_bot)); + himax_in_parse_assign_cmd(fw_data_criteria_key_top, pfw_op->data_criteria_key_top, sizeof(pfw_op->data_criteria_key_top)); + himax_in_parse_assign_cmd(fw_data_criteria_key_bot, pfw_op->data_criteria_key_bot, sizeof(pfw_op->data_criteria_key_bot)); + himax_in_parse_assign_cmd(fw_data_criteria_avg_top, pfw_op->data_criteria_avg_top, sizeof(pfw_op->data_criteria_avg_top)); + himax_in_parse_assign_cmd(fw_data_criteria_avg_bot, pfw_op->data_criteria_avg_bot, sizeof(pfw_op->data_criteria_avg_bot)); + himax_in_parse_assign_cmd(fw_data_set_frame, pfw_op->data_set_frame, sizeof(pfw_op->data_set_frame)); + himax_in_parse_assign_cmd(fw_data_selftest_ack_hb, pfw_op->data_selftest_ack_hb, sizeof(pfw_op->data_selftest_ack_hb)); + himax_in_parse_assign_cmd(fw_data_selftest_ack_lb, pfw_op->data_selftest_ack_lb, sizeof(pfw_op->data_selftest_ack_lb)); + himax_in_parse_assign_cmd(fw_data_selftest_pass, pfw_op->data_selftest_pass, sizeof(pfw_op->data_selftest_pass)); + himax_in_parse_assign_cmd(fw_data_normal_cmd, pfw_op->data_normal_cmd, sizeof(pfw_op->data_normal_cmd)); + himax_in_parse_assign_cmd(fw_data_normal_status, pfw_op->data_normal_status, sizeof(pfw_op->data_normal_status)); + himax_in_parse_assign_cmd(fw_data_sorting_cmd, pfw_op->data_sorting_cmd, sizeof(pfw_op->data_sorting_cmd)); + himax_in_parse_assign_cmd(fw_data_sorting_status, pfw_op->data_sorting_status, sizeof(pfw_op->data_sorting_status)); + himax_in_parse_assign_cmd(fw_data_dd_request, pfw_op->data_dd_request, sizeof(pfw_op->data_dd_request)); + himax_in_parse_assign_cmd(fw_data_dd_ack, pfw_op->data_dd_ack, sizeof(pfw_op->data_dd_ack)); + himax_in_parse_assign_cmd(fw_data_idle_dis_pwd, pfw_op->data_idle_dis_pwd, sizeof(pfw_op->data_idle_dis_pwd)); + himax_in_parse_assign_cmd(fw_data_idle_en_pwd, pfw_op->data_idle_en_pwd, sizeof(pfw_op->data_idle_en_pwd)); + himax_in_parse_assign_cmd(fw_data_rawdata_ready_hb, pfw_op->data_rawdata_ready_hb, sizeof(pfw_op->data_rawdata_ready_hb)); + himax_in_parse_assign_cmd(fw_data_rawdata_ready_lb, pfw_op->data_rawdata_ready_lb, sizeof(pfw_op->data_rawdata_ready_lb)); + himax_in_parse_assign_cmd(fw_addr_ahb_addr, pfw_op->addr_ahb_addr, sizeof(pfw_op->addr_ahb_addr)); + himax_in_parse_assign_cmd(fw_data_ahb_dis, pfw_op->data_ahb_dis, sizeof(pfw_op->data_ahb_dis)); + himax_in_parse_assign_cmd(fw_data_ahb_en, pfw_op->data_ahb_en, sizeof(pfw_op->data_ahb_en)); + himax_in_parse_assign_cmd(fw_addr_event_addr, pfw_op->addr_event_addr, sizeof(pfw_op->addr_event_addr)); + himax_in_parse_assign_cmd(fw_usb_detect_addr, pfw_op->addr_usb_detect, sizeof(pfw_op->addr_usb_detect)); +#ifdef HX_P_SENSOR + himax_in_parse_assign_cmd(fw_addr_ulpm_33, pfw_op->addr_ulpm_33, sizeof(pfw_op->addr_ulpm_33)); + himax_in_parse_assign_cmd(fw_addr_ulpm_34, pfw_op->addr_ulpm_34, sizeof(pfw_op->addr_ulpm_34)); + himax_in_parse_assign_cmd(fw_data_ulpm_11, pfw_op->data_ulpm_11, sizeof(pfw_op->data_ulpm_11)); + himax_in_parse_assign_cmd(fw_data_ulpm_22, pfw_op->data_ulpm_22, sizeof(pfw_op->data_ulpm_22)); + himax_in_parse_assign_cmd(fw_data_ulpm_33, pfw_op->data_ulpm_33, sizeof(pfw_op->data_ulpm_33)); + himax_in_parse_assign_cmd(fw_data_ulpm_aa, pfw_op->data_ulpm_aa, sizeof(pfw_op->data_ulpm_aa)); +#endif +#ifdef SEC_FACTORY_MODE + himax_in_parse_assign_cmd(FW_EDGE_BORDER_ADDR, pfw_op->addr_edge_border, sizeof(pfw_op->addr_edge_border)); +// himax_in_parse_assign_cmd(FW_CAL_ADDR, pfw_op->addr_cal, sizeof(pfw_op->addr_cal)); + himax_in_parse_assign_cmd(FW_RPORT_THRSH_ADDR, pfw_op->addr_rport_thrsh, sizeof(pfw_op->addr_rport_thrsh)); +#endif +#endif +#ifdef CORE_FLASH + himax_in_parse_assign_cmd(flash_addr_spi200_trans_fmt, pflash_op->addr_spi200_trans_fmt, sizeof(pflash_op->addr_spi200_trans_fmt)); + himax_in_parse_assign_cmd(flash_addr_spi200_trans_ctrl, pflash_op->addr_spi200_trans_ctrl, sizeof(pflash_op->addr_spi200_trans_ctrl)); + himax_in_parse_assign_cmd(flash_addr_spi200_cmd, pflash_op->addr_spi200_cmd, sizeof(pflash_op->addr_spi200_cmd)); + himax_in_parse_assign_cmd(flash_addr_spi200_addr, pflash_op->addr_spi200_addr, sizeof(pflash_op->addr_spi200_addr)); + himax_in_parse_assign_cmd(flash_addr_spi200_data, pflash_op->addr_spi200_data, sizeof(pflash_op->addr_spi200_data)); + himax_in_parse_assign_cmd(flash_addr_spi200_bt_num, pflash_op->addr_spi200_bt_num, sizeof(pflash_op->addr_spi200_bt_num)); + himax_in_parse_assign_cmd(flash_data_spi200_trans_fmt, pflash_op->data_spi200_trans_fmt, sizeof(pflash_op->data_spi200_trans_fmt)); + himax_in_parse_assign_cmd(flash_data_spi200_trans_ctrl_1, pflash_op->data_spi200_trans_ctrl_1, sizeof(pflash_op->data_spi200_trans_ctrl_1)); + himax_in_parse_assign_cmd(flash_data_spi200_trans_ctrl_2, pflash_op->data_spi200_trans_ctrl_2, sizeof(pflash_op->data_spi200_trans_ctrl_2)); + himax_in_parse_assign_cmd(flash_data_spi200_trans_ctrl_3, pflash_op->data_spi200_trans_ctrl_3, sizeof(pflash_op->data_spi200_trans_ctrl_3)); + himax_in_parse_assign_cmd(flash_data_spi200_trans_ctrl_4, pflash_op->data_spi200_trans_ctrl_4, sizeof(pflash_op->data_spi200_trans_ctrl_4)); + himax_in_parse_assign_cmd(flash_data_spi200_trans_ctrl_5, pflash_op->data_spi200_trans_ctrl_5, sizeof(pflash_op->data_spi200_trans_ctrl_5)); + himax_in_parse_assign_cmd(flash_data_spi200_cmd_1, pflash_op->data_spi200_cmd_1, sizeof(pflash_op->data_spi200_cmd_1)); + himax_in_parse_assign_cmd(flash_data_spi200_cmd_2, pflash_op->data_spi200_cmd_2, sizeof(pflash_op->data_spi200_cmd_2)); + himax_in_parse_assign_cmd(flash_data_spi200_cmd_3, pflash_op->data_spi200_cmd_3, sizeof(pflash_op->data_spi200_cmd_3)); + himax_in_parse_assign_cmd(flash_data_spi200_cmd_4, pflash_op->data_spi200_cmd_4, sizeof(pflash_op->data_spi200_cmd_4)); + himax_in_parse_assign_cmd(flash_data_spi200_cmd_5, pflash_op->data_spi200_cmd_5, sizeof(pflash_op->data_spi200_cmd_5)); + himax_in_parse_assign_cmd(flash_data_spi200_cmd_6, pflash_op->data_spi200_cmd_6, sizeof(pflash_op->data_spi200_cmd_6)); + himax_in_parse_assign_cmd(flash_data_spi200_cmd_7, pflash_op->data_spi200_cmd_7, sizeof(pflash_op->data_spi200_cmd_7)); + himax_in_parse_assign_cmd(flash_data_spi200_addr, pflash_op->data_spi200_addr, sizeof(pflash_op->data_spi200_addr)); +#endif +#ifdef CORE_SRAM + /* sram start*/ + himax_in_parse_assign_cmd(sram_adr_mkey, psram_op->addr_mkey, sizeof(psram_op->addr_mkey)); + himax_in_parse_assign_cmd(sram_adr_rawdata_addr, psram_op->addr_rawdata_addr, sizeof(psram_op->addr_rawdata_addr)); + himax_in_parse_assign_cmd(sram_adr_rawdata_end, psram_op->addr_rawdata_end, sizeof(psram_op->addr_rawdata_end)); + himax_in_parse_assign_cmd(sram_passwrd_start, psram_op->passwrd_start, sizeof(psram_op->passwrd_start)); + himax_in_parse_assign_cmd(sram_passwrd_end, psram_op->passwrd_end, sizeof(psram_op->passwrd_end)); + /* sram end*/ +#endif +#ifdef CORE_DRIVER + himax_in_parse_assign_cmd(driver_addr_fw_define_flash_reload, pdriver_op->addr_fw_define_flash_reload, sizeof(pdriver_op->addr_fw_define_flash_reload)); + himax_in_parse_assign_cmd(driver_addr_fw_define_2nd_flash_reload, pdriver_op->addr_fw_define_2nd_flash_reload, sizeof(pdriver_op->addr_fw_define_2nd_flash_reload)); + himax_in_parse_assign_cmd(driver_addr_fw_define_int_is_edge, pdriver_op->addr_fw_define_int_is_edge, sizeof(pdriver_op->addr_fw_define_int_is_edge)); + himax_in_parse_assign_cmd(driver_addr_fw_define_rxnum_txnum_maxpt, pdriver_op->addr_fw_define_rxnum_txnum_maxpt, sizeof(pdriver_op->addr_fw_define_rxnum_txnum_maxpt)); + himax_in_parse_assign_cmd(driver_addr_fw_define_xy_res_enable, pdriver_op->addr_fw_define_xy_res_enable, sizeof(pdriver_op->addr_fw_define_xy_res_enable)); + himax_in_parse_assign_cmd(driver_addr_fw_define_x_y_res, pdriver_op->addr_fw_define_x_y_res, sizeof(pdriver_op->addr_fw_define_x_y_res)); + himax_in_parse_assign_cmd(driver_data_df_rx, pdriver_op->data_df_rx, sizeof(pdriver_op->data_df_rx)); + himax_in_parse_assign_cmd(driver_data_df_tx, pdriver_op->data_df_tx, sizeof(pdriver_op->data_df_tx)); + himax_in_parse_assign_cmd(driver_data_df_pt, pdriver_op->data_df_pt, sizeof(pdriver_op->data_df_pt)); + himax_in_parse_assign_cmd(driver_data_fw_define_flash_reload_dis, pdriver_op->data_fw_define_flash_reload_dis, sizeof(pdriver_op->data_fw_define_flash_reload_dis)); + himax_in_parse_assign_cmd(driver_data_fw_define_flash_reload_en, pdriver_op->data_fw_define_flash_reload_en, sizeof(pdriver_op->data_fw_define_flash_reload_en)); + himax_in_parse_assign_cmd(driver_data_fw_define_rxnum_txnum_maxpt_sorting, pdriver_op->data_fw_define_rxnum_txnum_maxpt_sorting, sizeof(pdriver_op->data_fw_define_rxnum_txnum_maxpt_sorting)); + himax_in_parse_assign_cmd(driver_data_fw_define_rxnum_txnum_maxpt_normal, pdriver_op->data_fw_define_rxnum_txnum_maxpt_normal, sizeof(pdriver_op->data_fw_define_rxnum_txnum_maxpt_normal)); +#endif +#ifdef HX_ZERO_FLASH + himax_in_parse_assign_cmd(zf_addr_dis_flash_reload, pzf_op->addr_dis_flash_reload, sizeof(pzf_op->addr_dis_flash_reload)); + himax_in_parse_assign_cmd(zf_data_dis_flash_reload, pzf_op->data_dis_flash_reload, sizeof(pzf_op->data_dis_flash_reload)); + himax_in_parse_assign_cmd(zf_addr_system_reset, pzf_op->addr_system_reset, sizeof(pzf_op->addr_system_reset)); + himax_in_parse_assign_cmd(zf_data_system_reset, pzf_op->data_system_reset, sizeof(pzf_op->data_system_reset)); + himax_in_parse_assign_cmd(zf_data_sram_start_addr, pzf_op->data_sram_start_addr, sizeof(pzf_op->data_sram_start_addr)); + himax_in_parse_assign_cmd(zf_data_sram_clean, pzf_op->data_sram_clean, sizeof(pzf_op->data_sram_clean)); + himax_in_parse_assign_cmd(zf_data_cfg_info, pzf_op->data_cfg_info, sizeof(pzf_op->data_cfg_info)); + himax_in_parse_assign_cmd(zf_data_fw_cfg_1, pzf_op->data_fw_cfg_1, sizeof(pzf_op->data_fw_cfg_1)); + himax_in_parse_assign_cmd(zf_data_fw_cfg_2, pzf_op->data_fw_cfg_2, sizeof(pzf_op->data_fw_cfg_2)); + himax_in_parse_assign_cmd(zf_data_fw_cfg_3, pzf_op->data_fw_cfg_3, sizeof(pzf_op->data_fw_cfg_3)); + himax_in_parse_assign_cmd(zf_data_adc_cfg_1, pzf_op->data_adc_cfg_1, sizeof(pzf_op->data_adc_cfg_1)); + himax_in_parse_assign_cmd(zf_data_adc_cfg_2, pzf_op->data_adc_cfg_2, sizeof(pzf_op->data_adc_cfg_2)); + himax_in_parse_assign_cmd(zf_data_adc_cfg_3, pzf_op->data_adc_cfg_3, sizeof(pzf_op->data_adc_cfg_3)); + himax_in_parse_assign_cmd(zf_data_map_table, pzf_op->data_map_table, sizeof(pzf_op->data_map_table)); +/* himax_in_parse_assign_cmd(zf_data_mode_switch, pzf_op->data_mode_switch, sizeof(pzf_op->data_mode_switch));*/ + himax_in_parse_assign_cmd(zf_addr_sts_chk, pzf_op->addr_sts_chk, sizeof(pzf_op->addr_sts_chk)); + himax_in_parse_assign_cmd(zf_data_activ_sts, pzf_op->data_activ_sts, sizeof(pzf_op->data_activ_sts)); + himax_in_parse_assign_cmd(zf_addr_activ_relod, pzf_op->addr_activ_relod, sizeof(pzf_op->addr_activ_relod)); + himax_in_parse_assign_cmd(zf_data_activ_in, pzf_op->data_activ_in, sizeof(pzf_op->data_activ_in)); +#endif +} +EXPORT_SYMBOL(himax_mcu_in_cmd_init); + +/* init end*/ +#endif diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_inspection.c b/drivers/input/touchscreen/himax/hx831xx/himax_inspection.c new file mode 100755 index 000000000000..9247871f3530 --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_inspection.c @@ -0,0 +1,5605 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for inspection functions + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "himax_inspection.h" +#if IS_ENABLED(CONFIG_SPU_VERIFY) +#define SUPPORT_FW_SIGNED +#endif + +#ifdef SUPPORT_FW_SIGNED +#include +#endif + +static int g_gap_vertical_partial = 4; +static int *g_gap_vertical_part; +static int g_gap_horizontal_partial = 1; +static int *g_gap_horizontal_part; + +static int g_dc_max; + +static int g_1kind_raw_size; +uint32_t g_rslt_data_len; +int **g_inspection_criteria; +int *g_inspt_crtra_flag; +int *g_test_item_flag; +int do_lpwg_test; +int HX_CRITERIA_ITEM; +int HX_CRITERIA_SIZE; +char *g_rslt_data; +static char g_file_path[256]; +static char g_rslt_log[256]; +static char g_start_log[512]; +#define FAIL_IN_INDEX "%s: %s FAIL in index %d\n" +#define ABS(x) (((x) < 0) ? -(x) : (x)) +static int g_portrait_data[5]; + +char *g_hx_head_str[] = { + "TP_Info", + "Project_Info", + "TestItem", + "TestCriteria_Weight", + "TestCriteria", + NULL +}; + +/*Need to map THP_INSPECTION_ENUM*/ +char *g_himax_inspection_mode[] = { + "HIMAX_OPEN", + "HIMAX_MICRO_OPEN", + "HIMAX_SHORT", + "HIMAX_RAWDATA", + "HIMAX_BPN_RAWDATA", + "HIMAX_SC", + "HIMAX_WEIGHT_NOISE", + "HIMAX_ABS_NOISE", + "HIMAX_SORTING", + "HIMAX_GAPTEST_RAW", + /*"HIMAX_GAPTEST_RAW_X",*/ + /*"HIMAX_GAPTEST_RAW_Y",*/ + + "HIMAX_ACT_IDLE_RAWDATA", + "HIMAX_ACT_IDLE_BPN_RAWDATA", + "HIMAX_ACT_IDLE_NOISE", + + "HIMAX_LPWUG_RAWDATA", + "HIMAX_LPWUG_BPN_RAWDATA", + "HIMAX_LPWUG_WEIGHT_NOISE", + "HIMAX_LPWUG_ABS_NOISE", + "HIMAX_LPWUG_IDLE_RAWDATA", + "HIMAX_LPWUG_IDLE_BPN_RAWDATA", + "HIMAX_LPWUG_IDLE_NOISE", + + "HIMAX_BACK_NORMAL", + NULL +}; + +/* for criteria */ +char *g_hx_inspt_crtra_name[] = { + "CRITERIA_RAW_MIN", + "CRITERIA_RAW_MAX", + "CRITERIA_RAW_BPN_MIN", + "CRITERIA_RAW_BPN_MAX", + "CRITERIA_SC_MIN", + "CRITERIA_SC_MAX", + "CRITERIA_SC_GOLDEN", + "CRITERIA_SHORT_MIN", + "CRITERIA_SHORT_MAX", + "CRITERIA_OPEN_MIN", + "CRITERIA_OPEN_MAX", + "CRITERIA_MICRO_OPEN_MIN", + "CRITERIA_MICRO_OPEN_MAX", + "CRITERIA_NOISE_WT_MIN", + "CRITERIA_NOISE_WT_MAX", + "CRITERIA_NOISE_ABS_MIN", + "CRITERIA_NOISE_ABS_MAX", + "CRITERIA_SORT_MIN", + "CRITERIA_SORT_MAX", + + "CRITERIA_GAP_RAW_HOR_MIN", + "CRITERIA_GAP_RAW_HOR_MAX", + "CRITERIA_GAP_RAW_VER_MIN", + "CRITERIA_GAP_RAW_VER_MAX", + + "ACT_IDLE_NOISE_MIN", + "ACT_IDLE_NOISE_MAX", + "ACT_IDLE_RAWDATA_MIN", + "ACT_IDLE_RAWDATA_MAX", + "ACT_IDLE_RAW_BPN_MIN", + "ACT_IDLE_RAW_BPN_MAX", + + "LPWUG_NOISE_WT_MIN", + "LPWUG_NOISE_WT_MAX", + "LPWUG_NOISE_ABS_MIN", + "LPWUG_NOISE_ABS_MAX", + "LPWUG_RAWDATA_MIN", + "LPWUG_RAWDATA_MAX", + "LPWUG_RAW_BPN_MIN", + "LPWUG_RAW_BPN_MAX", + + "LPWUG_IDLE_NOISE_MIN", + "LPWUG_IDLE_NOISE_MAX", + "LPWUG_IDLE_RAWDATA_MIN", + "LPWUG_IDLE_RAWDATA_MAX", + "LPWUG_IDLE_RAW_BPN_MIN", + "LPWUG_IDLE_RAW_BPN_MAX", + NULL +}; + +/* SEC INSPECTION */ +extern int g_ts_dbg; + +extern struct fw_operation *pfw_op; +/******************/ + + +void (*fp_himax_self_test_init)(void) = himax_inspection_init; + + +static void himax_press_powerkey(void) +{ + I(" %s POWER KEY event %x press\n", __func__, KEY_POWER); + input_report_key(private_ts->input_dev, KEY_POWER, 1); + input_sync(private_ts->input_dev); + + msleep(100); + + I(" %s POWER KEY event %x release\n", __func__, KEY_POWER); + input_report_key(private_ts->input_dev, KEY_POWER, 0); + input_sync(private_ts->input_dev); +} + + +static uint16_t NOISEMAX; +static uint16_t g_recal_thx; + +static int arraydata_max1, arraydata_max2, arraydata_max3; +static int arraydata_min1, arraydata_min2, arraydata_min3; + +void himax_get_arraydata_edge(uint32_t *RAW) +{ + int temp, i, j; + int len = ic_data->HX_RX_NUM * ic_data->HX_TX_NUM; + uint32_t *ArrayData; + + ArrayData = kzalloc(len * sizeof(uint32_t), GFP_KERNEL); + if (!ArrayData) { + E("%s: allocate ArrayData failed\n", __func__); + return; + } + + for (i = 0; i < len; i++) + ArrayData[i] = RAW[i]; + for (j = len-1; j > 0; j--) { /*min to max*/ + for (i = 0; i < j; i++) { + if (ArrayData[i] > ArrayData[i+1]) { + temp = ArrayData[i]; + ArrayData[i] = ArrayData[i+1]; + ArrayData[i+1] = temp; + } + } + } + + arraydata_min1 = ArrayData[0]; + arraydata_min2 = ArrayData[1]; + arraydata_min3 = ArrayData[2]; + arraydata_max1 = ArrayData[len-3]; + arraydata_max2 = ArrayData[len-2]; + arraydata_max3 = ArrayData[len-1]; + + kfree(ArrayData); +} + +#if 0 +static int hx_test_data_pop_out(char *rslt_buf, char *filepath) +{ + struct file *raw_file = NULL; +// struct filename *vts_name = NULL; + mm_segment_t fs; + loff_t pos = 0; + int ret_val = NO_ERR; + + I("%s: Entering!\n", __func__); + I("data size=0x%04X\n", (uint32_t)strlen(rslt_buf)); + +// if (!kp_getname_kernel) { +// E("kp_getname_kernel is NULL, not open file!\n"); +// return -EIO; +// } +// vts_name = kp_getname_kernel(filepath); + +// if (raw_file == NULL) +// raw_file = kp_file_open_name(vts_name, O_TRUNC|O_CREAT|O_RDWR, +// 0660); + + if (raw_file == NULL) { + raw_file = filp_open(g_file_path, O_TRUNC|O_CREAT|O_RDWR, 0660); + + if (IS_ERR(raw_file)) { + E("%s open file failed = %ld\n", __func__, PTR_ERR(raw_file)); + ret_val = -EIO; + goto SAVE_DATA_ERR; + } + } + + fs = get_fs(); +// set_fs(get_ds()); + set_fs(KERNEL_DS); + vfs_write(raw_file, rslt_buf, + g_1kind_raw_size * HX_CRITERIA_ITEM * sizeof(char), &pos); + + filp_close(raw_file, NULL); + + set_fs(fs); + +SAVE_DATA_ERR: + I("%s: End!\n", __func__); + return ret_val; +} +#endif + +static int hx_test_data_get(uint32_t RAW[], char *start_log, char *result, + int now_item) +{ + uint32_t i; + + uint32_t len = 0; + char *testdata = NULL; + uint32_t SZ_SIZE = g_1kind_raw_size; + + I("%s: Entering, Now type=%s!\n", __func__, + g_himax_inspection_mode[now_item]); + + testdata = kzalloc(sizeof(char) * SZ_SIZE, GFP_KERNEL); + if (testdata == NULL) { + E("%s: Memory allocation falied!\n", __func__); + return MEM_ALLOC_FAIL; + } + + len += snprintf((testdata + len), SZ_SIZE - len, "%s", start_log); + for (i = 0; i < ic_data->HX_TX_NUM*ic_data->HX_RX_NUM; i++) { + if (i > 1 && ((i + 1) % ic_data->HX_RX_NUM) == 0) + len += snprintf((testdata + len), SZ_SIZE - len, + "%5d,\n", RAW[i]); + else + len += snprintf((testdata + len), SZ_SIZE - len, + "%5d,", RAW[i]); + } + len += snprintf((testdata + len), SZ_SIZE - len, "\n%s", result); + + memcpy(&g_rslt_data[g_rslt_data_len], testdata, len); + g_rslt_data_len += len; + I("%s: g_rslt_data_len=%d!\n", __func__, g_rslt_data_len); + + /*memcpy(&g_rslt_data[now_item * SZ_SIZE], testdata, SZ_SIZE);*/ + + /* dbg */ + /* for(i = 0; i < SZ_SIZE; i++) + * { + * I("0x%04X, ", g_rslt_data[i + (now_item * SZ_SIZE)]); + * if(i > 0 && (i % 16 == 15)) + * PI("\n"); + * } + */ + + kfree(testdata); + I("%s: End!\n", __func__); + return NO_ERR; + +} + +static int himax_switch_mode_inspection(int mode) +{ + uint8_t tmp_addr[4]; + uint8_t tmp_data[4] = {0}; + + I("%s: Entering\n", __func__); + + /*Stop Handshaking*/ + himax_in_parse_assign_cmd(sram_adr_rawdata_addr, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_write(tmp_addr, 4, tmp_data, 0); + + /*Swtich Mode*/ + switch (mode) { + case HIMAX_SORTING: + tmp_data[3] = 0x00; tmp_data[2] = 0x00; + tmp_data[1] = PWD_SORTING_START; + tmp_data[0] = PWD_SORTING_START; + break; + case HIMAX_OPEN: + tmp_data[3] = 0x00; tmp_data[2] = 0x00; + tmp_data[1] = PWD_OPEN_START; + tmp_data[0] = PWD_OPEN_START; + break; + case HIMAX_MICRO_OPEN: + tmp_data[3] = 0x00; tmp_data[2] = 0x00; + tmp_data[1] = PWD_OPEN_START; + tmp_data[0] = PWD_OPEN_START; + break; + case HIMAX_SHORT: + tmp_data[3] = 0x00; tmp_data[2] = 0x00; + tmp_data[1] = PWD_SHORT_START; + tmp_data[0] = PWD_SHORT_START; + break; + + case HIMAX_GAPTEST_RAW: + case HIMAX_RAWDATA: + case HIMAX_BPN_RAWDATA: + case HIMAX_SC: + tmp_data[3] = 0x00; tmp_data[2] = 0x00; + tmp_data[1] = PWD_RAWDATA_START; + tmp_data[0] = PWD_RAWDATA_START; + break; + + case HIMAX_WEIGHT_NOISE: + case HIMAX_ABS_NOISE: + tmp_data[3] = 0x00; tmp_data[2] = 0x00; + tmp_data[1] = PWD_NOISE_START; + tmp_data[0] = PWD_NOISE_START; + break; + + case HIMAX_ACT_IDLE_RAWDATA: + case HIMAX_ACT_IDLE_BPN_RAWDATA: + case HIMAX_ACT_IDLE_NOISE: + tmp_data[3] = 0x00; tmp_data[2] = 0x00; + tmp_data[1] = PWD_ACT_IDLE_START; + tmp_data[0] = PWD_ACT_IDLE_START; + break; + + case HIMAX_LPWUG_RAWDATA: + case HIMAX_LPWUG_BPN_RAWDATA: + case HIMAX_LPWUG_ABS_NOISE: + case HIMAX_LPWUG_WEIGHT_NOISE: + tmp_data[3] = 0x00; tmp_data[2] = 0x00; + tmp_data[1] = PWD_LPWUG_START; + tmp_data[0] = PWD_LPWUG_START; + break; + case HIMAX_LPWUG_IDLE_RAWDATA: + case HIMAX_LPWUG_IDLE_BPN_RAWDATA: + case HIMAX_LPWUG_IDLE_NOISE: + tmp_data[3] = 0x00; tmp_data[2] = 0x00; + tmp_data[1] = PWD_LPWUG_IDLE_START; + tmp_data[0] = PWD_LPWUG_IDLE_START; + break; + + default: + I("%s,Nothing to be done!\n", __func__); + break; + } + + if (g_core_fp.fp_assign_sorting_mode != NULL) + g_core_fp.fp_assign_sorting_mode(tmp_data); + I("%s: End of setting!\n", __func__); + + return 0; + +} + +static uint32_t himax_get_rawdata(uint32_t RAW[], uint32_t datalen, uint8_t checktype) +{ + uint8_t *tmp_rawdata; + bool get_raw_rlst; + uint8_t retry = 0; + uint32_t i = 0; + uint32_t j = 0; + uint32_t index = 0; + uint32_t Min_DATA = 0xFFFFFFFF; + uint32_t Max_DATA = 0x00000000; + + /* We use two bytes to combine a value of rawdata.*/ + tmp_rawdata = kzalloc(sizeof(uint8_t) * (datalen * 2), GFP_KERNEL); + if (tmp_rawdata == NULL) { + E("%s: Memory allocation falied!\n", __func__); + return HX_INSPECT_MEMALLCTFAIL; + } + + while (retry < 200) { + get_raw_rlst = g_core_fp.fp_get_DSRAM_data(tmp_rawdata, false); + if (get_raw_rlst) + break; + retry++; + } + + if (retry >= 200) + goto DIRECT_END; + + /* Copy Data*/ + for (i = 0; i < ic_data->HX_TX_NUM*ic_data->HX_RX_NUM; i++) + RAW[i] = tmp_rawdata[(i * 2) + 1] * 256 + tmp_rawdata[(i * 2)]; + + for (i = 0; i < ic_data->HX_TX_NUM; i++) { + for (j = 0; j < ic_data->HX_RX_NUM; j++) { + if (RAW[index] > Max_DATA) + Max_DATA = RAW[index]; + + if (RAW[index] < Min_DATA) + Min_DATA = RAW[index]; + + index++; + } + } + I("Max = %5d, Min = %5d\n", Max_DATA, Min_DATA); +DIRECT_END: + kfree(tmp_rawdata); + + if (get_raw_rlst) + return HX_INSPECT_OK; + else + return HX_INSPECT_EGETRAW; + +} + +static void himax_switch_data_type(uint8_t checktype) +{ + uint8_t datatype = 0x00; + + switch (checktype) { + case HIMAX_SORTING: + datatype = DATA_SORTING; + break; + case HIMAX_OPEN: + datatype = DATA_OPEN; + break; + case HIMAX_MICRO_OPEN: + datatype = DATA_MICRO_OPEN; + break; + case HIMAX_SHORT: + datatype = DATA_SHORT; + break; + case HIMAX_RAWDATA: + case HIMAX_BPN_RAWDATA: + case HIMAX_SC: + case HIMAX_GAPTEST_RAW: + datatype = DATA_RAWDATA; + break; + + case HIMAX_WEIGHT_NOISE: + case HIMAX_ABS_NOISE: + datatype = DATA_NOISE; + break; + case HIMAX_BACK_NORMAL: + datatype = DATA_BACK_NORMAL; + break; + case HIMAX_ACT_IDLE_RAWDATA: + case HIMAX_ACT_IDLE_BPN_RAWDATA: + datatype = DATA_ACT_IDLE_RAWDATA; + break; + case HIMAX_ACT_IDLE_NOISE: + datatype = DATA_ACT_IDLE_NOISE; + break; + + case HIMAX_LPWUG_RAWDATA: + case HIMAX_LPWUG_BPN_RAWDATA: + datatype = DATA_LPWUG_RAWDATA; + break; + case HIMAX_LPWUG_WEIGHT_NOISE: + case HIMAX_LPWUG_ABS_NOISE: + datatype = DATA_LPWUG_NOISE; + break; + case HIMAX_LPWUG_IDLE_RAWDATA: + case HIMAX_LPWUG_IDLE_BPN_RAWDATA: + datatype = DATA_LPWUG_IDLE_RAWDATA; + break; + case HIMAX_LPWUG_IDLE_NOISE: + datatype = DATA_LPWUG_IDLE_NOISE; + break; + + default: + E("Wrong type=%d\n", checktype); + break; + } + g_core_fp.fp_diag_register_set(datatype, 0x00); +} + +static void himax_bank_search_set(uint16_t Nframe, uint8_t checktype) +{ + uint8_t tmp_addr[4]; + uint8_t tmp_data[4]; + + /*skip frame 0x100070F4*/ + himax_in_parse_assign_cmd(addr_skip_frame, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, 4, tmp_data, false); + + switch (checktype) { + case HIMAX_ACT_IDLE_RAWDATA: + case HIMAX_ACT_IDLE_BPN_RAWDATA: + case HIMAX_ACT_IDLE_NOISE: + tmp_data[0] = BS_ACT_IDLE; + break; + case HIMAX_LPWUG_RAWDATA: + case HIMAX_LPWUG_BPN_RAWDATA: + case HIMAX_LPWUG_ABS_NOISE: + case HIMAX_LPWUG_WEIGHT_NOISE: + tmp_data[0] = BS_LPWUG; + break; + case HIMAX_LPWUG_IDLE_RAWDATA: + case HIMAX_LPWUG_IDLE_BPN_RAWDATA: + case HIMAX_LPWUG_IDLE_NOISE: + tmp_data[0] = BS_LPWUG_dile; + break; + case HIMAX_RAWDATA: + case HIMAX_BPN_RAWDATA: + case HIMAX_SC: + tmp_data[0] = BS_RAWDATA; + break; + case HIMAX_WEIGHT_NOISE: + case HIMAX_ABS_NOISE: + tmp_data[0] = BS_NOISE; + break; + default: + tmp_data[0] = BS_OPENSHORT; + break; + } + g_core_fp.fp_register_write(tmp_addr, 4, tmp_data, 0); +} + +static void himax_neg_noise_sup(uint8_t *data) +{ + uint8_t tmp_addr[4]; + uint8_t tmp_data[4]; + + /*0x10007FD8 Check support negative value or not */ + himax_in_parse_assign_cmd(addr_neg_noise_sup, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, 4, tmp_data, false); + + if ((tmp_data[3] & 0x04) == 0x04) { + himax_in_parse_assign_cmd(data_neg_noise, tmp_data, sizeof(tmp_data)); + data[2] = tmp_data[2]; data[3] = tmp_data[3]; + } else + I("%s Not support negative noise\n", __func__); +} + +static void himax_set_N_frame(uint16_t Nframe, uint8_t checktype) +{ + uint8_t tmp_addr[4]; + uint8_t tmp_data[4]; + + himax_bank_search_set(Nframe, checktype); + + /*IIR MAX - 0x10007294*/ + himax_in_parse_assign_cmd(fw_addr_set_frame_addr, tmp_addr, sizeof(tmp_addr)); + tmp_data[3] = 0x00; tmp_data[2] = 0x00; + tmp_data[1] = (uint8_t)((Nframe & 0xFF00) >> 8); + tmp_data[0] = (uint8_t)(Nframe & 0x00FF); + g_core_fp.fp_register_write(tmp_addr, 4, tmp_data, 0); + + if (checktype == HIMAX_WEIGHT_NOISE || + checktype == HIMAX_ABS_NOISE || + checktype == HIMAX_LPWUG_WEIGHT_NOISE || + checktype == HIMAX_LPWUG_ABS_NOISE) + himax_neg_noise_sup(tmp_data); + +} + +static void himax_get_noise_base(uint8_t checktype)/*Normal Threshold*/ +{ + uint8_t tmp_addr[4]; + uint8_t tmp_data[4]; + uint8_t tmp_addr2[4]; + uint8_t tmp_data2[4]; + + switch (checktype) { + case HIMAX_WEIGHT_NOISE: + himax_in_parse_assign_cmd(addr_normal_noise_thx, tmp_addr, sizeof(tmp_addr)); + break; + case HIMAX_LPWUG_WEIGHT_NOISE: + himax_in_parse_assign_cmd(addr_lpwug_noise_thx, tmp_addr, sizeof(tmp_addr)); + break; + default: + I("%s Not support type\n", __func__); + } + himax_in_parse_assign_cmd(addr_noise_scale, tmp_addr2, sizeof(tmp_addr2)); + g_core_fp.fp_register_read(tmp_addr2, 4, tmp_data2, false); + tmp_data2[1] = tmp_data2[1] >> 4; + if (tmp_data2[1] == 0) + tmp_data2[1] = 1; + + /*normal : 0x1000708F, LPWUG:0x10007093*/ + g_core_fp.fp_register_read(tmp_addr, 4, tmp_data, false); + NOISEMAX = tmp_data[3] * tmp_data2[1]; + + himax_in_parse_assign_cmd(addr_recal_thx, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, 4, tmp_data, false); + g_recal_thx = tmp_data[2] * tmp_data2[1];/*0x10007092*/ + I("%s: NOISEMAX=%d, g_recal_thx = %d\n", __func__, + NOISEMAX, g_recal_thx); +} + +static uint16_t himax_get_palm_num(void)/*Palm Number*/ +{ + uint8_t tmp_addr[4]; + uint8_t tmp_data[4]; + uint16_t palm_num; + + himax_in_parse_assign_cmd(addr_palm_num, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, 4, tmp_data, false); + palm_num = tmp_data[3];/*0x100070AB*/ + I("%s: palm_num = %d ", __func__, palm_num); + + return palm_num; +} + +static int himax_get_noise_weight_test(uint8_t checktype) +{ + uint8_t tmp_addr[4]; + uint8_t tmp_data[4]; + uint16_t weight = 0; + uint16_t value = 0; + + himax_in_parse_assign_cmd(addr_weight_sup, tmp_addr, sizeof(tmp_addr)); + + /*0x100072C8 weighting value*/ + g_core_fp.fp_register_read(tmp_addr, 4, tmp_data, false); + if (tmp_data[3] != tmp_addr[1] || tmp_data[2] != tmp_addr[0]) + return FW_NOT_READY; + + value = (tmp_data[1] << 8) | tmp_data[0]; + I("%s: value = %d, %d, %d ", __func__, value, tmp_data[2], tmp_data[3]); + + switch (checktype) { + case HIMAX_WEIGHT_NOISE: + himax_in_parse_assign_cmd(addr_normal_weight_a, tmp_addr, sizeof(tmp_addr)); + break; + case HIMAX_LPWUG_WEIGHT_NOISE: + himax_in_parse_assign_cmd(addr_lpwug_weight_a, tmp_addr, sizeof(tmp_addr)); + break; + default: + I("%s Not support type\n", __func__); + } + + /*Normal:0x1000709C, LPWUG:0x100070A0 weighting threshold*/ + g_core_fp.fp_register_read(tmp_addr, 4, tmp_data, false); + weight = tmp_data[0]; + + himax_in_parse_assign_cmd(addr_weight_b, tmp_addr, sizeof(tmp_addr)); + + g_core_fp.fp_register_read(tmp_addr, 4, tmp_data, false); + weight = (tmp_data[1] & 0x0F) * weight;/*0x10007095 weighting threshold*/ + I("%s: weight = %d ", __func__, weight); + + if (value > weight) + return ERR_TEST_FAIL; + else + return 0; +} + +static uint32_t himax_check_mode(uint8_t checktype) +{ + uint8_t tmp_data[4] = {0}; + uint8_t wait_pwd[2] = {0}; + + switch (checktype) { + case HIMAX_SORTING: + wait_pwd[0] = PWD_SORTING_END; + wait_pwd[1] = PWD_SORTING_END; + break; + case HIMAX_OPEN: + wait_pwd[0] = PWD_OPEN_END; + wait_pwd[1] = PWD_OPEN_END; + break; + case HIMAX_MICRO_OPEN: + wait_pwd[0] = PWD_OPEN_END; + wait_pwd[1] = PWD_OPEN_END; + break; + case HIMAX_SHORT: + wait_pwd[0] = PWD_SHORT_END; + wait_pwd[1] = PWD_SHORT_END; + break; + case HIMAX_RAWDATA: + case HIMAX_BPN_RAWDATA: + case HIMAX_SC: + case HIMAX_GAPTEST_RAW: + wait_pwd[0] = PWD_RAWDATA_END; + wait_pwd[1] = PWD_RAWDATA_END; + break; + + case HIMAX_WEIGHT_NOISE: + case HIMAX_ABS_NOISE: + wait_pwd[0] = PWD_NOISE_END; + wait_pwd[1] = PWD_NOISE_END; + break; + + case HIMAX_ACT_IDLE_RAWDATA: + case HIMAX_ACT_IDLE_BPN_RAWDATA: + case HIMAX_ACT_IDLE_NOISE: + wait_pwd[0] = PWD_ACT_IDLE_END; + wait_pwd[1] = PWD_ACT_IDLE_END; + break; + + case HIMAX_LPWUG_RAWDATA: + case HIMAX_LPWUG_BPN_RAWDATA: + case HIMAX_LPWUG_ABS_NOISE: + case HIMAX_LPWUG_WEIGHT_NOISE: + wait_pwd[0] = PWD_LPWUG_END; + wait_pwd[1] = PWD_LPWUG_END; + break; + case HIMAX_LPWUG_IDLE_RAWDATA: + case HIMAX_LPWUG_IDLE_BPN_RAWDATA: + case HIMAX_LPWUG_IDLE_NOISE: + wait_pwd[0] = PWD_LPWUG_IDLE_END; + wait_pwd[1] = PWD_LPWUG_IDLE_END; + break; + + default: + E("Wrong type=%d\n", checktype); + break; + } + + if (g_core_fp.fp_check_sorting_mode != NULL) + g_core_fp.fp_check_sorting_mode(tmp_data); + + if ((wait_pwd[0] == tmp_data[0]) && (wait_pwd[1] == tmp_data[1])) { + I("Change to mode=%s\n", g_himax_inspection_mode[checktype]); + return 0; + } else { + return 1; + } +} + +#define TEMP_LOG "%s: %s, tmp_data[0]=%x,tmp_data[1]=%x,tmp_data[2]=%x,tmp_data[3]=%x\n" + +static uint32_t himax_wait_sorting_mode(uint8_t checktype) +{ + uint8_t tmp_addr[4] = {0}; + uint8_t tmp_data[4] = {0}; + uint8_t wait_pwd[2] = {0}; + int count = 0; + + switch (checktype) { + case HIMAX_SORTING: + wait_pwd[0] = PWD_SORTING_END; + wait_pwd[1] = PWD_SORTING_END; + break; + case HIMAX_OPEN: + wait_pwd[0] = PWD_OPEN_END; + wait_pwd[1] = PWD_OPEN_END; + break; + case HIMAX_MICRO_OPEN: + wait_pwd[0] = PWD_OPEN_END; + wait_pwd[1] = PWD_OPEN_END; + break; + case HIMAX_SHORT: + wait_pwd[0] = PWD_SHORT_END; + wait_pwd[1] = PWD_SHORT_END; + break; + case HIMAX_RAWDATA: + case HIMAX_BPN_RAWDATA: + case HIMAX_SC: + case HIMAX_GAPTEST_RAW: + wait_pwd[0] = PWD_RAWDATA_END; + wait_pwd[1] = PWD_RAWDATA_END; + break; + case HIMAX_WEIGHT_NOISE: + case HIMAX_ABS_NOISE: + wait_pwd[0] = PWD_NOISE_END; + wait_pwd[1] = PWD_NOISE_END; + break; + case HIMAX_ACT_IDLE_RAWDATA: + case HIMAX_ACT_IDLE_BPN_RAWDATA: + case HIMAX_ACT_IDLE_NOISE: + wait_pwd[0] = PWD_ACT_IDLE_END; + wait_pwd[1] = PWD_ACT_IDLE_END; + break; + + case HIMAX_LPWUG_RAWDATA: + case HIMAX_LPWUG_BPN_RAWDATA: + case HIMAX_LPWUG_ABS_NOISE: + case HIMAX_LPWUG_WEIGHT_NOISE: + wait_pwd[0] = PWD_LPWUG_END; + wait_pwd[1] = PWD_LPWUG_END; + break; + case HIMAX_LPWUG_IDLE_RAWDATA: + case HIMAX_LPWUG_IDLE_BPN_RAWDATA: + case HIMAX_LPWUG_IDLE_NOISE: + wait_pwd[0] = PWD_LPWUG_IDLE_END; + wait_pwd[1] = PWD_LPWUG_IDLE_END; + break; + + default: + I("No Change Mode and now type=%d\n", checktype); + break; + } + + do { + if (g_core_fp.fp_check_sorting_mode != NULL) + g_core_fp.fp_check_sorting_mode(tmp_data); + if ((wait_pwd[0] == tmp_data[0]) && + (wait_pwd[1] == tmp_data[1])) + return HX_INSPECT_OK; + + himax_in_parse_assign_cmd(fw_addr_chk_fw_status, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, 4, tmp_data, false); + D(TEMP_LOG, __func__, "0x900000A8", + tmp_data[0], tmp_data[1], tmp_data[2], tmp_data[3]); + + himax_in_parse_assign_cmd(fw_addr_flag_reset_event, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, 4, tmp_data, false); + D(TEMP_LOG, __func__, "0x900000E4", + tmp_data[0], tmp_data[1], tmp_data[2], tmp_data[3]); + + himax_in_parse_assign_cmd(fw_addr_fw_dbg_msg_addr, tmp_addr, sizeof(tmp_addr)); + g_core_fp.fp_register_read(tmp_addr, 4, tmp_data, false); + D(TEMP_LOG, __func__, "0x10007F40", + tmp_data[0], tmp_data[1], tmp_data[2], tmp_data[3]); + D("Now retry %d times!\n", count); + msleep(50); + } while (count++ < 50); + + return HX_INSPECT_ESWITCHMODE; +} + +static int hx_turn_on_mp_func(int on) +{ + int rslt = 0; + int retry = 3; + uint8_t tmp_addr[4] = {0}; + uint8_t tmp_data[4] = {0}; + uint8_t tmp_read[4] = {0}; + + if (strcmp(HX_83102D_SERIES_PWON, private_ts->chip_name) == 0) { /* Only HX83102D needs this flow */ + I("%s: need to enter Mp mode!\n", __func__); + himax_in_parse_assign_cmd(addr_ctrl_mpap_ovl, tmp_addr, sizeof(tmp_addr)); + if (on) { + I("%s : Turn on!\n", __func__); + himax_in_parse_assign_cmd(PWD_TURN_ON_MPAP_OVL, tmp_data, sizeof(tmp_data)); + do { + g_core_fp.fp_register_write(tmp_addr, 4, tmp_data, 0); + usleep_range(10000, 10001); + g_core_fp.fp_register_read(tmp_addr, 4, tmp_read, false); + I("%s: now read[2]=0x%02X, read[1]=0x%02X, read[0]=0x%02X!\n", + __func__, tmp_read[2], tmp_read[1], tmp_read[0]); + retry--; + } while (((retry > 0) && (tmp_read[2] != tmp_data[2] && tmp_read[1] != tmp_data[1] && tmp_read[0] != tmp_data[0]))); + } else { + I("%s : Turn off!\n", __func__); + himax_in_parse_assign_cmd(ic_cmd_rst, tmp_data, sizeof(tmp_data)); + do { + g_core_fp.fp_register_write(tmp_addr, 4, tmp_data, 0); + usleep_range(10000, 10001); + g_core_fp.fp_register_read(tmp_addr, 4, tmp_read, false); + I("%s: now read[2]=0x%02X, read[1]=0x%02X, read[0]=0x%02X!\n", + __func__, tmp_read[2], tmp_read[1], tmp_read[0]); + retry--; + } while ((retry > 0) && (tmp_read[2] != tmp_data[2] && tmp_read[1] != tmp_data[1] && tmp_read[0] != tmp_data[0])); + } + } else { + I("%s:Nothing to be done!\n", __func__); + } + return rslt; +} + +/* HX_GAP START */ +/* gap test function */ +/* extern int himax_write_to_ic_flash_flow(uint32_t start_addr,uint32_t + * *write_data,uint32_t write_len); + */ + +static int himax_gap_test_vertical_setting(void) +{ + g_gap_vertical_part = kcalloc(g_gap_vertical_partial, + sizeof(int), GFP_KERNEL); + if (g_gap_vertical_part == NULL) { + E("%s: Memory allocation falied!\n", __func__); + return MEM_ALLOC_FAIL; + } + g_gap_vertical_part[0] = 0; + g_gap_vertical_part[1] = ic_data->HX_TX_NUM / 4 * 1; + g_gap_vertical_part[2] = ic_data->HX_TX_NUM / 4 * 2; + g_gap_vertical_part[3] = ic_data->HX_TX_NUM / 4 * 3; + + return NO_ERR; +} + +static void himax_cal_gap_data_vertical(int start, int end_idx, int direct, + uint32_t *org_raw, uint32_t *result_raw) +{ + int i = 0; + int rx_num = ic_data->HX_RX_NUM; + + I("%s:start=%d\n", __func__, start); + I("%s:end_idx=%d\n", __func__, end_idx); + for (i = start; i < (start + rx_num*end_idx); i++) { + if (direct == 0) { /* up - down */ + if (i < start+rx_num) + result_raw[i] = 0; + else + result_raw[i] = ABS(((int)org_raw[i-rx_num] - (int)org_raw[i]) * 100 / (int)org_raw[i]); + + } else { /* down - up */ + if (i > (start + rx_num*(end_idx-1)-1)) + result_raw[i] = 0; + else + result_raw[i] = ABS(((int)org_raw[i+rx_num] - (int)org_raw[i]) * 100 / (int)org_raw[i]); + + } + } +} + +static int himax_gap_test_vertical_raw(int test_type, uint32_t *org_raw) +{ + int i_partial = 0; + int tmp_start = 0; + int tmp_end_idx = 0; + uint32_t *result_raw; + int i = 0; + int ret_val = NO_ERR; + + int tx_num = ic_data->HX_TX_NUM; + int rx_num = ic_data->HX_RX_NUM; + + if (himax_gap_test_vertical_setting()) + return MEM_ALLOC_FAIL; + + I("Print vertical ORG RAW\n"); + for (i = 0; i < tx_num*rx_num; i++) { + I("%04d,", org_raw[i]); + if (i > 0 && i%rx_num == (rx_num-1)) + I("\n"); + } + + result_raw = kcalloc(tx_num*rx_num, sizeof(uint32_t), GFP_KERNEL); + if (result_raw == NULL) { + E("%s: Memory allocation falied!\n", __func__); + goto alloc_result_raw_failed; + } + + for (i_partial = 0; i_partial < g_gap_vertical_partial; i_partial++) { + + tmp_start = g_gap_vertical_part[i_partial]*rx_num; + if (i_partial+1 == g_gap_vertical_partial) + tmp_end_idx = tx_num - g_gap_vertical_part[i_partial]; + else + tmp_end_idx = g_gap_vertical_part[i_partial+1] - + g_gap_vertical_part[i_partial]; + + if (i_partial % 2 == 0) + himax_cal_gap_data_vertical(tmp_start, tmp_end_idx, 0, + org_raw, result_raw); + else + himax_cal_gap_data_vertical(tmp_start, tmp_end_idx, 1, + org_raw, result_raw); + + } + + I("Print Vertical New RAW\n"); + for (i = 0; i < tx_num*rx_num; i++) { + I("%04d,", result_raw[i]); + if (i > 0 && i%rx_num == (rx_num-1)) + I("\n"); + } + + for (i = 0; i < tx_num*rx_num; i++) { + if (result_raw[i] < g_inspection_criteria[IDX_GAP_VER_RAWMIN][i] + && + result_raw[i] > g_inspection_criteria[IDX_GAP_VER_RAWMAX][i]) { + ret_val = NO_ERR - i; + break; + } + } + + /* himax_write_to_ic_flash_flow(0x1A000,result_raw,tx_num*rx_num); */ + kfree(result_raw); +alloc_result_raw_failed: + kfree(g_gap_vertical_part); + g_gap_vertical_part = NULL; + + return ret_val; +} + +static int himax_gap_test_horizontal_setting(void) +{ + g_gap_horizontal_part = kcalloc(g_gap_horizontal_partial, + sizeof(int), GFP_KERNEL); + if (g_gap_horizontal_part == NULL) { + E("%s: Memory allocation falied!\n", __func__); + return MEM_ALLOC_FAIL; + } + g_gap_horizontal_part[0] = 0; + + return NO_ERR; +} + +static void himax_cal_gap_data_horizontal(int start, int end_idx, int direct, + uint32_t *org_raw, uint32_t *result_raw) +{ + int i = 0; + int j = 0; + int rx_num = ic_data->HX_RX_NUM; + int tx_num = ic_data->HX_TX_NUM; + + I("start=%d\n", start); + I("end_idx=%d\n", end_idx); + for (j = 0; j < tx_num; j++) { + for (i = (start + (j*rx_num)); + i < (start + (j*rx_num) + end_idx); i++) { + /* left - right */ + if (direct == 0) { + if (i == (start + (j*rx_num))) + result_raw[i] = 0; + else + result_raw[i] = + ABS(((int)org_raw[i-1] - (int)org_raw[i]) * 100 / (int)org_raw[i]); + + } else { /* right - left */ + if (i == ((start + (j*rx_num) + end_idx) - 1)) + result_raw[i] = 0; + else + result_raw[i] = + ABS(((int)org_raw[i+1] - (int)org_raw[i]) * 100 / (int)org_raw[i]); + } + } + } +} + +static int himax_gap_test_honrizontal_raw(int test_type, uint32_t *raw) +{ + int rx_num = ic_data->HX_RX_NUM; + int tx_num = ic_data->HX_TX_NUM; + int tmp_start = 0; + int tmp_end_idx = 0; + int i_partial = 0; + uint32_t *result_raw; + int i = 0; + int ret_val = NO_ERR; + + if (himax_gap_test_horizontal_setting()) + return MEM_ALLOC_FAIL; + + result_raw = kcalloc(ic_data->HX_TX_NUM * ic_data->HX_RX_NUM, + sizeof(uint32_t), GFP_KERNEL); + if (result_raw == NULL) { + E("%s: Memory allocation falied!\n", __func__); + goto alloc_result_raw_failed; + } + + I("Print Horizontal ORG RAW\n"); + for (i = 0; i < tx_num*rx_num; i++) { + I("%04d,", raw[i]); + if (i > 0 && i%rx_num == (rx_num-1)) + I("\n"); + } + + for (i_partial = 0; i_partial < g_gap_horizontal_partial; i_partial++) { + tmp_start = g_gap_horizontal_part[i_partial]; + if (i_partial+1 == g_gap_horizontal_partial) + tmp_end_idx = rx_num - g_gap_horizontal_part[i_partial]; + else + tmp_end_idx = g_gap_horizontal_part[i_partial+1] - + g_gap_horizontal_part[i_partial]; + + if (i_partial % 2 == 0) + himax_cal_gap_data_horizontal(tmp_start, tmp_end_idx, + 0, raw, result_raw); + else + himax_cal_gap_data_horizontal(tmp_start, tmp_end_idx, + 1, raw, result_raw); + + } + I("Print Horizontal New RAW\n"); + for (i = 0; i < tx_num*rx_num; i++) { + I("%04d,", result_raw[i]); + if (i > 0 && i%rx_num == (rx_num-1)) + I("\n"); + } + + for (i = 0; i < tx_num*rx_num; i++) { + if (result_raw[i] < g_inspection_criteria[IDX_GAP_HOR_RAWMIN][i] + && + result_raw[i] > g_inspection_criteria[IDX_GAP_HOR_RAWMAX][i]) { + ret_val = NO_ERR - i; + break; + } + } + + /* himax_write_to_ic_flash_flow(0x1A800,result_raw,tx_num*rx_num); */ + kfree(result_raw); +alloc_result_raw_failed: + kfree(g_gap_horizontal_part); + g_gap_horizontal_part = NULL; + + return ret_val; +} + +static uint32_t himax_data_campare(uint8_t checktype, uint32_t *RAW, int ret_val) +{ + int i = 0; + int idx_max = 0; + int idx_min = 0; + int block_num = ic_data->HX_TX_NUM*ic_data->HX_RX_NUM; + uint16_t palm_num = 0; + uint16_t noise_count = 0; + + switch (checktype) { + case HIMAX_SORTING: + idx_min = IDX_SORTMIN; + break; + case HIMAX_OPEN: + idx_max = IDX_OPENMAX; + idx_min = IDX_OPENMIN; + break; + + case HIMAX_MICRO_OPEN: + idx_max = IDX_M_OPENMAX; + idx_min = IDX_M_OPENMIN; + break; + + case HIMAX_SHORT: + idx_max = IDX_SHORTMAX; + idx_min = IDX_SHORTMIN; + break; + + case HIMAX_RAWDATA: + idx_max = IDX_RAWMAX; + idx_min = IDX_RAWMIN; + break; + + case HIMAX_BPN_RAWDATA: + idx_max = IDX_BPN_RAWMAX; + idx_min = IDX_BPN_RAWMIN; + break; + case HIMAX_SC: + idx_max = IDX_SCMAX; + idx_min = IDX_SCMIN; + break; + case HIMAX_WEIGHT_NOISE: + idx_max = IDX_WT_NOISEMAX; + idx_min = IDX_WT_NOISEMIN; + break; + case HIMAX_ABS_NOISE: + idx_max = IDX_ABS_NOISEMAX; + idx_min = IDX_ABS_NOISEMIN; + break; + case HIMAX_GAPTEST_RAW: + break; + + case HIMAX_ACT_IDLE_RAWDATA: + idx_max = IDX_ACT_IDLE_RAWDATA_MAX; + idx_min = IDX_ACT_IDLE_RAWDATA_MIN; + break; + + case HIMAX_ACT_IDLE_BPN_RAWDATA: + idx_max = IDX_ACT_IDLE_RAW_BPN_MAX; + idx_min = IDX_ACT_IDLE_RAW_BPN_MIN; + break; + + case HIMAX_ACT_IDLE_NOISE: + idx_max = IDX_ACT_IDLE_NOISE_MAX; + idx_min = IDX_ACT_IDLE_NOISE_MIN; + break; + + case HIMAX_LPWUG_RAWDATA: + idx_max = IDX_LPWUG_RAWDATA_MAX; + idx_min = IDX_LPWUG_RAWDATA_MIN; + break; + + case HIMAX_LPWUG_BPN_RAWDATA: + idx_max = IDX_LPWUG_RAW_BPN_MAX; + idx_min = IDX_LPWUG_RAW_BPN_MIN; + break; + + case HIMAX_LPWUG_WEIGHT_NOISE: + idx_max = IDX_LPWUG_WT_NOISEMAX; + idx_min = IDX_LPWUG_WT_NOISEMIN; + break; + + case HIMAX_LPWUG_ABS_NOISE: + idx_max = IDX_LPWUG_NOISE_ABS_MAX; + idx_min = IDX_LPWUG_NOISE_ABS_MIN; + break; + + case HIMAX_LPWUG_IDLE_RAWDATA: + idx_max = IDX_LPWUG_IDLE_RAWDATA_MAX; + idx_min = IDX_LPWUG_IDLE_RAWDATA_MIN; + break; + + case HIMAX_LPWUG_IDLE_BPN_RAWDATA: + idx_max = IDX_LPWUG_IDLE_RAW_BPN_MAX; + idx_min = IDX_LPWUG_IDLE_RAW_BPN_MIN; + break; + + case HIMAX_LPWUG_IDLE_NOISE: + idx_max = IDX_LPWUG_IDLE_NOISE_MAX; + idx_min = IDX_LPWUG_IDLE_NOISE_MIN; + break; + + default: + E("Wrong type=%d\n", checktype); + break; + } + + /*data process*/ + switch (checktype) { + case HIMAX_SORTING: + for (i = 0; i < block_num; i++) + g_inspection_criteria[idx_max][i] = 999999; + break; + case HIMAX_BPN_RAWDATA: + case HIMAX_ACT_IDLE_BPN_RAWDATA: + case HIMAX_LPWUG_BPN_RAWDATA: + case HIMAX_LPWUG_IDLE_BPN_RAWDATA: + for (i = 0; i < block_num; i++) + RAW[i] = (int)RAW[i] * 100 / g_dc_max; + break; + case HIMAX_SC: + for (i = 0; i < block_num; i++) { + RAW[i] = ((int)RAW[i]-g_inspection_criteria[IDX_SC_GOLDEN][i]) * 100 + / g_inspection_criteria[IDX_SC_GOLDEN][i]; + } + break; + } + + /*data campare*/ + switch (checktype) { + case HIMAX_GAPTEST_RAW: + if ( + himax_gap_test_vertical_raw(HIMAX_GAPTEST_RAW, RAW) + != NO_ERR) { + E("%s: HIMAX_GAPTEST_RAW FAIL\n", __func__); + ret_val |= 1 << (checktype + ERR_SFT); + break; + } + if (himax_gap_test_honrizontal_raw(HIMAX_GAPTEST_RAW, + RAW) != NO_ERR) { + E("%s: HIMAX_GAPTEST_RAW FAIL\n", __func__); + ret_val |= 1 << (checktype + ERR_SFT); + break; + } + break; + + case HIMAX_WEIGHT_NOISE: + case HIMAX_LPWUG_WEIGHT_NOISE: + noise_count = 0; + himax_get_noise_base(checktype); + palm_num = himax_get_palm_num(); + for (i = 0; i < (ic_data->HX_TX_NUM * ic_data->HX_RX_NUM); i++) { + if ((int)RAW[i] > NOISEMAX) + noise_count++; + } + I("noise_count=%d\n", noise_count); + if (noise_count > palm_num) { + E("%s: noise test FAIL\n", __func__); + ret_val |= 1 << (checktype + ERR_SFT); + break; + } + snprintf(g_start_log, 256 * sizeof(char), "\n Threshold = %d\n", NOISEMAX); + /*Check weightingt*/ + if (himax_get_noise_weight_test(checktype) < 0) { + I("%s: %s FAIL %X\n", __func__, g_himax_inspection_mode[checktype], ret_val); + ret_val |= 1 << (checktype + ERR_SFT); + break; + } + + /*Check negative side noise*/ + for (i = 0; i < block_num; i++) { + if ((int)RAW[i] > (g_inspection_criteria[idx_max][i] * NOISEMAX / 100) || + (int)RAW[i] < (g_inspection_criteria[idx_min][i] * g_recal_thx / 100)) { + E(FAIL_IN_INDEX, __func__, g_himax_inspection_mode[checktype], i); + ret_val |= 1 << (checktype + ERR_SFT); + break; + } + } + break; + + case HIMAX_SORTING: + case HIMAX_OPEN: + case HIMAX_MICRO_OPEN: + case HIMAX_SHORT: + case HIMAX_RAWDATA: + case HIMAX_BPN_RAWDATA: + case HIMAX_SC: + case HIMAX_ABS_NOISE: + case HIMAX_ACT_IDLE_RAWDATA: + case HIMAX_ACT_IDLE_BPN_RAWDATA: + case HIMAX_ACT_IDLE_NOISE: + case HIMAX_LPWUG_RAWDATA: + case HIMAX_LPWUG_BPN_RAWDATA: + case HIMAX_LPWUG_ABS_NOISE: + case HIMAX_LPWUG_IDLE_RAWDATA: + case HIMAX_LPWUG_IDLE_BPN_RAWDATA: + case HIMAX_LPWUG_IDLE_NOISE: + for (i = 0; i < block_num; i++) { + if ((int)RAW[i] > g_inspection_criteria[idx_max][i] + || + (int)RAW[i] < g_inspection_criteria[idx_min][i]) { + E(FAIL_IN_INDEX, __func__, g_himax_inspection_mode[checktype], i); + ret_val |= 1 << (checktype + ERR_SFT); + break; + } + } + break; + + default: + E("Wrong type=%d\n", checktype); + break; + } + + I("%s: %s %s\n", __func__, g_himax_inspection_mode[checktype], + (ret_val == HX_INSPECT_OK)?"PASS":"FAIL"); + + return ret_val; +} + +static int himax_get_max_dc(void) +{ + uint8_t tmp_data[DATA_LEN_4]; + uint8_t tmp_addr[DATA_LEN_4]; + int dc_max = 0; + + himax_in_parse_assign_cmd(addr_max_dc, tmp_addr, sizeof(tmp_addr)); + + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, tmp_data, 0); + I("%s: tmp_data[0]=%x,tmp_data[1]=%x\n", __func__, tmp_data[0], tmp_data[1]); + + dc_max = tmp_data[1] << 8 | tmp_data[0]; + I("%s: dc max = %d\n", __func__, dc_max); + return dc_max; +} + +/* HX_GAP END*/ +static uint32_t mpTestFunc(uint8_t checktype, uint32_t datalen) +{ + uint32_t len = 0; + uint32_t *RAW; + int n_frame = 0; + uint32_t ret_val = HX_INSPECT_OK; + + RAW = kzalloc(datalen * sizeof(uint32_t), GFP_KERNEL); + if (!RAW) + return HX_INSPECT_MEMALLCTFAIL; + + /*uint16_t* pInspectGridData = &gInspectGridData[0];*/ + /*uint16_t* pInspectNoiseData = &gInspectNoiseData[0];*/ + I("Now Check type = %d\n", checktype); + + if (himax_check_mode(checktype)) { + /*himax_check_mode(checktype);*/ + + I("Need Change Mode ,target=%s\n", + g_himax_inspection_mode[checktype]); + + g_core_fp.fp_sense_off(true); + hx_turn_on_mp_func(1); + +#ifndef HX_ZERO_FLASH + if (g_core_fp.fp_reload_disable != NULL) + g_core_fp.fp_reload_disable(1); +#endif + + himax_switch_mode_inspection(checktype); + + switch (checktype) { + case HIMAX_WEIGHT_NOISE: + case HIMAX_ABS_NOISE: + n_frame = NOISEFRAME; + break; + case HIMAX_ACT_IDLE_RAWDATA: + case HIMAX_ACT_IDLE_NOISE: + case HIMAX_ACT_IDLE_BPN_RAWDATA: + n_frame = NORMAL_IDLE_RAWDATA_NOISEFRAME; + break; + case HIMAX_LPWUG_RAWDATA: + case HIMAX_LPWUG_BPN_RAWDATA: + n_frame = LPWUG_RAWDATAFRAME; + break; + case HIMAX_LPWUG_WEIGHT_NOISE: + case HIMAX_LPWUG_ABS_NOISE: + n_frame = LPWUG_NOISEFRAME; + break; + case HIMAX_LPWUG_IDLE_RAWDATA: + case HIMAX_LPWUG_IDLE_BPN_RAWDATA: + n_frame = LPWUG_IDLE_RAWDATAFRAME; + break; + case HIMAX_LPWUG_IDLE_NOISE: + n_frame = LPWUG_IDLE_NOISEFRAME; + break; + default: + n_frame = OTHERSFRAME; + } + himax_set_N_frame(n_frame, checktype); + + g_core_fp.fp_sense_on(1); + + } + + ret_val |= himax_wait_sorting_mode(checktype); + if (ret_val) { + E("%s: himax_wait_sorting_mode FAIL\n", __func__); + ret_val |= (1 << (checktype + ERR_SFT)); + kfree(RAW); + return ret_val; + } + himax_switch_data_type(checktype); + + ret_val |= himax_get_rawdata(RAW, datalen, 0xFF); + if (ret_val) { + E("%s: himax_get_rawdata FAIL\n", __func__); + ret_val |= (1 << (checktype + ERR_SFT)); + kfree(RAW); + return ret_val; + } + + /*get Max DC from FW*/ + g_dc_max = himax_get_max_dc(); + + /* back to normal */ + himax_switch_data_type(HIMAX_BACK_NORMAL); + + I("%s: Init OK, start to test!\n", __func__); + + len += snprintf(g_start_log+len, 256 * sizeof(char), "\n%s%s\n", + g_himax_inspection_mode[checktype], ": data as follow!\n"); + + ret_val |= himax_data_campare(checktype, RAW, ret_val); + + himax_get_arraydata_edge(RAW); + + len += snprintf(g_start_log + len, 256 * sizeof(char), "\n arraydata_min1 = %d,", arraydata_min1); + len += snprintf(g_start_log + len, 256 * sizeof(char)-len, " arraydata_min2 = %d,", arraydata_min2); + len += snprintf(g_start_log + len, 256 * sizeof(char)-len, " arraydata_min3 = %d,", arraydata_min3); + len += snprintf(g_start_log + len, 256 * sizeof(char), "\n arraydata_max1 = %d,", arraydata_max1); + len += snprintf(g_start_log + len, 256 * sizeof(char)-len, " arraydata_max2 = %d,", arraydata_max2); + len += snprintf(g_start_log + len, 256 * sizeof(char)-len, " arraydata_max3 = %d\n", arraydata_max3); + + if (!ret_val) {/*PASS*/ + snprintf(g_rslt_log, 256 * sizeof(char), "\n%s%s\n", + g_himax_inspection_mode[checktype], " Test Pass!\n"); + I("pass write log\n"); + } else {/*FAIL*/ + snprintf(g_rslt_log, 256 * sizeof(char), "\n%s%s\n", + g_himax_inspection_mode[checktype], " Test Fail!\n"); + I("fail write log\n"); + } + + hx_test_data_get(RAW, g_start_log, g_rslt_log, checktype); + + kfree(RAW); + + return ret_val; +} + +/* claculate 10's power function */ +static int himax_power_cal(int pow, int number) +{ + int i = 0; + int result = 1; + + for (i = 0; i < pow; i++) + result *= 10; + result = result * number; + + return result; + +} + +/* String to int */ +static int hiamx_parse_str2int(char *str) +{ + int i = 0; + int temp_cal = 0; + int result = 0; + unsigned int str_len = strlen(str); + int negtive_flag = 0; + + for (i = 0; i < str_len; i++) { + if (str[i] != '-' && str[i] > '9' && str[i] < '0') { + E("%s: Parsing fail!\n", __func__); + result = -9487; + negtive_flag = 0; + break; + } + if (str[i] == '-') { + negtive_flag = 1; + continue; + } + temp_cal = str[i] - '0'; + result += himax_power_cal(str_len-i-1, temp_cal); + /* str's the lowest char is the number's the highest number + * So we should reverse this number before using the power + * function + * -1: starting number is from 0 ex:10^0 = 1,10^1=10 + */ + } + + if (negtive_flag == 1) + result = 0 - result; + + return result; +} + + +/* Get sub-string from original string by using some charaters + * return size of result + */ +static int himax_saperate_comma(char *str_data, int str_size, + char **result, int item_str_size) +{ + int count = 0; + int str_count = 0; /* now string*/ + int char_count = 0; /* now char count in string*/ + + do { + switch (str_data[count]) { + case ASCII_COMMA: + case ACSII_SPACE: + case ASCII_CR: + case ASCII_LF: + count++; + /* If end of line as above condifiton, + * differencing the count of char. + * If char_count != 0 + * it's meaning this string is parsing over . + * The Next char is belong to next string + */ + if (char_count != 0) { + char_count = 0; + str_count++; + } + break; + default: + result[str_count][char_count++] = + str_data[count]; + count++; + break; + } + } while (count < str_size && str_count < item_str_size); + + return str_count; +} + +static int hx_diff_str(char *str1, char *str2) +{ + int i = 0; + int result = 0; /* zero is all same, non-zero is not same index*/ + int str1_len = strlen(str1); + int str2_len = strlen(str2); + + if (str1_len != str2_len) { + if (private_ts->debug_log_level & BIT(4)) + I("%s:Size different!\n", __func__); + return LENGTH_FAIL; + } + + for (i = 0; i < str1_len; i++) { + if (str1[i] != str2[i]) { + result = i+1; + /*I("%s: different in %d!\n", __func__, result);*/ + return result; + } + } + + return result; +} + +/* get idx of criteria when parsing file */ +int hx_find_crtra_id(char *input) +{ + int i = 0; + int result = 0; + + for (i = 0 ; i < HX_CRITERIA_SIZE ; i++) { + if (hx_diff_str(g_hx_inspt_crtra_name[i], input) == 0) { + result = i; + I("find the str=%s,idx=%d\n", + g_hx_inspt_crtra_name[i], i); + break; + } + } + if (i > (HX_CRITERIA_SIZE - 1)) { + E("%s: find Fail!\n", __func__); + return LENGTH_FAIL; + } + + return result; +} + +int hx_print_crtra_after_parsing(void) +{ + int i = 0, j = 0; + int all_mut_len = ic_data->HX_TX_NUM*ic_data->HX_RX_NUM; + + for (i = 0; i < HX_CRITERIA_SIZE; i++) { + I("Now is %s\n", g_hx_inspt_crtra_name[i]); + if (g_inspt_crtra_flag[i] == 1) { + for (j = 0; j < all_mut_len; j++) { + I("%d, ", g_inspection_criteria[i][j]); + if (j % 16 == 15) + PI("\n"); + } + } else { + I("No this Item in this criteria file!\n"); + } + PI("\n"); + } + + return 0; +} + +static int hx_get_crtra_by_name(char **result, int size_of_result_str) +{ + int i = 0; + /* count of criteria type */ + int count_type = 0; + /* count of criteria data */ + int count_data = 0; + int err = HX_INSPECT_OK; + int all_mut_len = ic_data->HX_TX_NUM*ic_data->HX_RX_NUM; + int temp = 0; + + /* get criteria and assign to a global array(2-Dimensional/int) */ + /* basiclly the size of criteria will be + * (crtra_count * (all_mut_len) + crtra_count) + * but we use file size to be the end of counter + */ + for (i = 0; i < size_of_result_str && result[i] != NULL; i++) { + /* It have get one page(all mutual) criteria data! + * And we should skip the string of criteria name! + */ + if (i == 0 || i == + ((i / (all_mut_len))+(i / (all_mut_len) * (all_mut_len)))) { + count_data = 0; + + if (private_ts->debug_log_level & BIT(4)) + I("Now find str=%s ,idx=%d\n", result[i], i); + + /* check the item of criteria is in criteria file + * or not + */ + count_type = hx_find_crtra_id(result[i]); + if (count_type < 0) { + E("1. %s:Name Not match!\n", __func__); + /* E("can recognize[%d]=%s\n", count_type, + * g_hx_inspt_crtra_name[count_type]); + */ + E("get from file[%d]=%s\n", i, result[i]); + E("Please check criteria file again!\n"); + err = HX_INSPECT_EFILE; + goto END_FUNCTION; + } else { + /*I("Now str=%s, idx=%d\n",*/ + /*g_hx_inspt_crtra_name[count_type], count_type);*/ + g_inspt_crtra_flag[count_type] = 1; + } + continue; + } + /* change string to int*/ + temp = hiamx_parse_str2int(result[i]); + if (temp != -9487) + g_inspection_criteria[count_type][count_data] = temp; + else { + E("%s: Parsing Fail in %d\n", __func__, i); + E("in range:[%d]=%s\n", count_type, + g_hx_inspt_crtra_name[count_type]); + E("btw, get from file[%d]=%s\n", i, result[i]); + break; + } + /* dbg + * I("[%d]g_inspection_criteria[%d][%d]=%d\n", + * i, count_type, count_data, + * g_inspection_criteria[count_type][count_data]); + */ + count_data++; + + } + + if (private_ts->debug_log_level & BIT(4)) { + /* dbg:print all of criteria from parsing file */ + hx_print_crtra_after_parsing(); + } + + /*I("Total loop=%d\n", i);*/ +END_FUNCTION: + return err; +} + +static int himax_parse_criteria_file(char *str_data, int str_size) +{ + int err = HX_INSPECT_OK; + char **result; + int i = 0; + int crtra_count = HX_CRITERIA_SIZE; + int data_size = 0; /* The maximum of number Data*/ + int all_mut_len = ic_data->HX_TX_NUM*ic_data->HX_RX_NUM; + int str_max_len = 0; + int size_of_result_str = 0; + + I("%s,Entering\n", __func__); + + /* size of criteria include name string */ + data_size = ((all_mut_len) * crtra_count) + crtra_count; + while (g_hx_inspt_crtra_name[i] != NULL) { + if (strlen(g_hx_inspt_crtra_name[i]) > str_max_len) + str_max_len = strlen(g_hx_inspt_crtra_name[i]); + i++; + } + + /* init the array which store original criteria and include + * name string + */ + result = kcalloc(data_size, sizeof(char *), GFP_KERNEL); + if (result != NULL) { + for (i = 0 ; i < data_size; i++) { + result[i] = kcalloc(str_max_len, sizeof(char), GFP_KERNEL); + if (result[i] == NULL) { + E("%s: rst_arr Memory allocation falied!\n", __func__); + err = HX_INSPECT_MEMALLCTFAIL; + goto rst_arr_mem_alloc_failed; + } + } + } else { + E("%s: Memory allocation falied!\n", __func__); + err = HX_INSPECT_MEMALLCTFAIL; + goto rst_mem_alloc_failed; + } + + /* dbg */ + if (private_ts->debug_log_level & BIT(4)) { + I("first 4 bytes 0x%2X,0x%2X,0x%2X,0x%2X !\n", + str_data[0], str_data[1], + str_data[2], str_data[3]); + } + + /* parse value in to result array(1-Dimensional/String) */ + size_of_result_str = + himax_saperate_comma(str_data, str_size, result, data_size); + + I("%s: now size_of_result_str=%d\n", __func__, size_of_result_str); + + err = hx_get_crtra_by_name(result, size_of_result_str); + if (err != HX_INSPECT_OK) { + E("%s:Load criteria from file fail, go end!\n", __func__); + goto END_FUNC; + } + + +END_FUNC: +rst_arr_mem_alloc_failed: + for (i = 0 ; i < data_size; i++) + if (result[i] != NULL) + kfree(result[i]); + kfree(result); +rst_mem_alloc_failed: + + I("%s,END\n", __func__); + return err; + /* parsing Criteria end */ +} + +static int himax_test_item_parse(char *str_data, int str_size) +{ + int size = str_size; + char *str_ptr = str_data; + char *end_ptr = NULL; + int i = 0; + int ret = HX_INSPECT_EFILE; + + I("%s,str_data: %p, str_size: %d\n", __func__, str_data, str_size); + + do { + str_ptr = strnstr(str_ptr, "HIMAX", size); + end_ptr = strnstr(str_ptr, "\r\n", size); + if (str_ptr != NULL && end_ptr != NULL) { + while (g_himax_inspection_mode[i]) { + if (strncmp(str_ptr, g_himax_inspection_mode[i], end_ptr - str_ptr) == 0) { + I("%s,Find item : %s\n", __func__, g_himax_inspection_mode[i]); + g_test_item_flag[i] = 1; + ret = HX_INSPECT_OK; + break; + } + i++; + } + size = str_size - (end_ptr - str_data); + str_ptr = end_ptr++; + i = 0; + } else { + I("%s,Can't find %s or %s\n", __func__, "HIMAX", "\x0d\x0a"); + break; + } + } while (size > strlen("HIMAX")); + + return ret; +} + +static int himax_parse_test_file(const struct firmware *file_entry) +{ + int start_str_len = 0; + int str_size = 0; + char *start_ptr = NULL; + char *end_ptr = NULL; + int i = 0; + int j = 0; + char str[2][60]; /*[0]->Start string, [1]->End string*/ + char *str_tail[2] = {"_Begin]\x0d\x0a", "_End]\x0d\x0a"}; + int ret = HX_INSPECT_OK; + + while (g_hx_head_str[i]) { + /*compose header string of .dri file*/ + for (j = 0; j < 2; j++) { + strlcpy(str[j], "[", sizeof(str[j])); + strlcat(str[j], g_hx_head_str[i], sizeof(str[j])); + strlcat(str[j], str_tail[j], sizeof(str[j])); + /*I("%s string[%d] : %s\n", __func__, j, str[j]);*/ + } + + /*find each group of .dri file*/ + start_str_len = strlen(str[0]); + start_ptr = strnstr(file_entry->data, str[0], file_entry->size); + end_ptr = strnstr(file_entry->data, str[1], file_entry->size); + str_size = end_ptr - start_ptr - start_str_len; + /*I("%s,String Length = %d\n", __func__, str_size);*/ + + if (start_ptr == NULL || end_ptr == NULL) + E("%s,Can't find string %s\n", __func__, g_hx_head_str[i]); + else { + /*parse each sub group string*/ + /*if (strncmp(g_hx_head_str[i], "Project_Info", strlen(g_hx_head_str[i])) == 0) {*/ + /* get project informaion - Not Use*/ + /*}*/ + if (strncmp(g_hx_head_str[i], "TestItem", strlen(g_hx_head_str[i])) == 0) { + /*get Test Item*/ + I("%s,Start to parse %s\n", __func__, g_hx_head_str[i]); + ret |= himax_test_item_parse(start_ptr + start_str_len, str_size); + } + /*if (strncmp(g_hx_head_str[i], "TestCriteria_Weight", strlen(g_hx_head_str[i])) == 0) {*/ + /*get Test Criteria Weight - Not Use*/ + /*}*/ + if (strncmp(g_hx_head_str[i], "TestCriteria", strlen(g_hx_head_str[i])) == 0) { + /*get Test Criteria*/ + I("%s,Start to parse %s\n", __func__, g_hx_head_str[i]); + ret |= himax_parse_criteria_file(start_ptr + start_str_len, str_size); + } + } + i++; + } + + return ret; +} + +static void himax_test_item_chk(int csv_test) +{ + int i = 0; + + if (csv_test) + for (i = 0; i < HX_CRITERIA_ITEM - 1; i++) + g_test_item_flag[i] = 1; + + g_test_item_flag[HIMAX_OPEN] &= + (g_inspt_crtra_flag[IDX_OPENMIN] == 1 && + g_inspt_crtra_flag[IDX_OPENMAX] == 1)?1:0; + + g_test_item_flag[HIMAX_MICRO_OPEN] &= + (g_inspt_crtra_flag[IDX_M_OPENMIN] == 1 && + g_inspt_crtra_flag[IDX_M_OPENMAX] == 1)?1:0; + + g_test_item_flag[HIMAX_SHORT] &= + (g_inspt_crtra_flag[IDX_SHORTMIN] == 1 && + g_inspt_crtra_flag[IDX_SHORTMAX] == 1)?1:0; + + g_test_item_flag[HIMAX_RAWDATA] &= + (g_inspt_crtra_flag[IDX_RAWMIN] == 1 && + g_inspt_crtra_flag[IDX_RAWMAX] == 1)?1:0; + + g_test_item_flag[HIMAX_BPN_RAWDATA] &= + (g_inspt_crtra_flag[IDX_BPN_RAWMIN] == 1 && + g_inspt_crtra_flag[IDX_BPN_RAWMAX] == 1)?1:0; + + g_test_item_flag[HIMAX_SC] &= + (g_inspt_crtra_flag[IDX_SCMIN] == 1 && + g_inspt_crtra_flag[IDX_SCMAX] == 1 && + g_inspt_crtra_flag[IDX_SC_GOLDEN] == 1)?1:0; + + g_test_item_flag[HIMAX_WEIGHT_NOISE] &= + (g_inspt_crtra_flag[IDX_WT_NOISEMIN] == 1 && + g_inspt_crtra_flag[IDX_WT_NOISEMAX] == 1)?1:0; + + g_test_item_flag[HIMAX_ABS_NOISE] &= + (g_inspt_crtra_flag[IDX_ABS_NOISEMIN] == 1 && + g_inspt_crtra_flag[IDX_ABS_NOISEMAX] == 1)?1:0; + + g_test_item_flag[HIMAX_SORTING] &= + (g_inspt_crtra_flag[IDX_SORTMIN] == 1 && + g_inspt_crtra_flag[IDX_SORTMAX] == 1)?1:0; + + g_test_item_flag[HIMAX_GAPTEST_RAW] &= + (g_inspt_crtra_flag[IDX_GAP_HOR_RAWMAX] == 1 && + g_inspt_crtra_flag[IDX_GAP_HOR_RAWMIN] == 1 && + g_inspt_crtra_flag[IDX_GAP_VER_RAWMAX] == 1 && + g_inspt_crtra_flag[IDX_GAP_VER_RAWMIN] == 1)?1:0; + + g_test_item_flag[HIMAX_ACT_IDLE_RAWDATA] &= + (g_inspt_crtra_flag[IDX_ACT_IDLE_RAWDATA_MIN] == 1 && + g_inspt_crtra_flag[IDX_ACT_IDLE_RAWDATA_MAX] == 1)?1:0; + + g_test_item_flag[HIMAX_ACT_IDLE_BPN_RAWDATA] &= + (g_inspt_crtra_flag[IDX_ACT_IDLE_RAW_BPN_MIN] == 1 && + g_inspt_crtra_flag[IDX_ACT_IDLE_RAW_BPN_MAX] == 1)?1:0; + + g_test_item_flag[HIMAX_ACT_IDLE_NOISE] &= + (g_inspt_crtra_flag[IDX_ACT_IDLE_NOISE_MIN] == 1 && + g_inspt_crtra_flag[IDX_ACT_IDLE_NOISE_MAX] == 1)?1:0; + + g_test_item_flag[HIMAX_LPWUG_RAWDATA] &= + (g_inspt_crtra_flag[IDX_LPWUG_RAWDATA_MIN] == 1 && + g_inspt_crtra_flag[IDX_LPWUG_RAWDATA_MAX] == 1)?1:0; + + g_test_item_flag[HIMAX_LPWUG_BPN_RAWDATA] &= + (g_inspt_crtra_flag[IDX_LPWUG_RAW_BPN_MIN] == 1 && + g_inspt_crtra_flag[IDX_LPWUG_RAW_BPN_MAX] == 1)?1:0; + + g_test_item_flag[HIMAX_LPWUG_WEIGHT_NOISE] &= + (g_inspt_crtra_flag[IDX_LPWUG_WT_NOISEMAX] == 1 && + g_inspt_crtra_flag[IDX_LPWUG_WT_NOISEMIN] == 1)?1:0; + + g_test_item_flag[HIMAX_LPWUG_ABS_NOISE] &= + (g_inspt_crtra_flag[IDX_LPWUG_NOISE_ABS_MAX] == 1 && + g_inspt_crtra_flag[IDX_LPWUG_NOISE_ABS_MIN] == 1)?1:0; + + g_test_item_flag[HIMAX_LPWUG_IDLE_RAWDATA] &= + (g_inspt_crtra_flag[IDX_LPWUG_IDLE_RAWDATA_MAX] == 1 && + g_inspt_crtra_flag[IDX_LPWUG_IDLE_RAWDATA_MIN] == 1)?1:0; + + g_test_item_flag[HIMAX_LPWUG_IDLE_BPN_RAWDATA] &= + (g_inspt_crtra_flag[IDX_LPWUG_IDLE_RAW_BPN_MIN] == 1 && + g_inspt_crtra_flag[IDX_LPWUG_IDLE_RAW_BPN_MAX] == 1)?1:0; + + g_test_item_flag[HIMAX_LPWUG_IDLE_NOISE] &= + (g_inspt_crtra_flag[IDX_LPWUG_IDLE_NOISE_MAX] == 1 && + g_inspt_crtra_flag[IDX_LPWUG_IDLE_NOISE_MIN] == 1)?1:0; + + do_lpwg_test = g_test_item_flag[HIMAX_LPWUG_RAWDATA] | + g_test_item_flag[HIMAX_LPWUG_BPN_RAWDATA] | + g_test_item_flag[HIMAX_LPWUG_WEIGHT_NOISE] | + g_test_item_flag[HIMAX_LPWUG_ABS_NOISE] | + g_test_item_flag[HIMAX_LPWUG_IDLE_RAWDATA] | + g_test_item_flag[HIMAX_LPWUG_IDLE_BPN_RAWDATA] | + g_test_item_flag[HIMAX_LPWUG_IDLE_NOISE]; + + for (i = 0; i < HX_CRITERIA_ITEM - 1; i++) + I("g_test_item_flag[%d] = %d\n", i, g_test_item_flag[i]); +} + +int hx_get_size_str_arr(char **input) +{ + int i = 0; + int result = 0; + + while (input[i] != NULL) + i++; + + result = i; + if (private_ts->debug_log_level & BIT(4)) + I("There is %d in [0]=%s\n", result, input[0]); + + return result; +} + +static void hx_print_ic_id(void) +{ + uint8_t i; + int len = 0; + char *prt_data = NULL; + + prt_data = kzalloc(sizeof(char) * HX_SZ_ICID, GFP_KERNEL); + if (prt_data == NULL) { + E("%s: Memory allocation falied!\n", __func__); + return; + } + + len += snprintf(prt_data + len, HX_SZ_ICID - len, + "IC ID : "); + for (i = 0; i < 13; i++) { + len += snprintf(prt_data + len, HX_SZ_ICID - len, + "%02X", ic_data->vendor_ic_id[i]); + } + len += snprintf(prt_data + len, HX_SZ_ICID - len, + "\n"); + + memcpy(&g_rslt_data[g_rslt_data_len], prt_data, len); + g_rslt_data_len += len; + I("%s: g_rslt_data_len=%d!\n", __func__, g_rslt_data_len); + + kfree(prt_data); +} + +static int himax_self_test_data_init(void) +{ + const struct firmware *file_entry = NULL; + struct himax_ts_data *ts = private_ts; + char *file_name_1 = "hx_criteria.dri"; + char *file_name_2 = "hx_criteria.csv"; + int ret = HX_INSPECT_OK; + int err = 0; + int i = 0; + + /* + * 5: one value will not over than 99999, so get this size of string + * 2: get twice size + */ + g_1kind_raw_size = 5 * ic_data->HX_RX_NUM * ic_data->HX_TX_NUM * 2; + + /* get test item and its items of criteria*/ + HX_CRITERIA_ITEM = hx_get_size_str_arr(g_himax_inspection_mode); + HX_CRITERIA_SIZE = hx_get_size_str_arr(g_hx_inspt_crtra_name); + I("There is %d HX_CRITERIA_ITEM and %d HX_CRITERIA_SIZE\n", + HX_CRITERIA_ITEM, HX_CRITERIA_SIZE); + + /* init criteria data*/ + g_inspt_crtra_flag = kcalloc(HX_CRITERIA_SIZE, sizeof(int), GFP_KERNEL); + g_inspection_criteria = kcalloc(HX_CRITERIA_SIZE, sizeof(int *), GFP_KERNEL); + g_test_item_flag = kcalloc(HX_CRITERIA_ITEM, sizeof(int), GFP_KERNEL); + if (g_inspt_crtra_flag == NULL || g_inspection_criteria == NULL + || g_test_item_flag == NULL) { + E("%s: %d, Memory allocation falied!\n", __func__, __LINE__); + return MEM_ALLOC_FAIL; + } + + for (i = 0; i < HX_CRITERIA_SIZE; i++) { + g_inspection_criteria[i] = kcalloc( + (ic_data->HX_TX_NUM*ic_data->HX_RX_NUM), sizeof(int), GFP_KERNEL); + if (g_inspection_criteria[i] == NULL) { + E("%s: %d, Memory allocation falied!\n", __func__, __LINE__); + return MEM_ALLOC_FAIL; + } + } + + /* default path is /system/etc/firmware */ + /* request criteria file*/ + err = request_firmware(&file_entry, file_name_1, ts->dev); + if (err < 0) { + E("%s,Fail to get %s\n", __func__, file_name_1); + err = request_firmware(&file_entry, file_name_2, ts->dev); + if (err < 0) { + E("%s,Fail to get %s\n", __func__, file_name_2); + I("No criteria file file"); + ret |= HX_INSPECT_EFILE; + } else { + I("%s,Success to get %s\n", __func__, file_name_2); + /* parsing criteria from file .csv*/ + ret |= himax_parse_criteria_file((char *)file_entry->data, (int)file_entry->size); + himax_test_item_chk(true); + release_firmware(file_entry); + } + } else { + /* parsing test file .dri*/ + I("%s,Success to get %s\n", __func__, file_name_1); + ret |= himax_parse_test_file(file_entry); + himax_test_item_chk(false); + release_firmware(file_entry); + } + + if (private_ts->debug_log_level & BIT(4)) { + /* print get criteria string */ + for (i = 0 ; i < HX_CRITERIA_SIZE ; i++) { + if (g_inspt_crtra_flag[i] != 0) + I("%s: [%d]There is String=%s\n", + __func__, i, g_hx_inspt_crtra_name[i]); + } + } + + if (g_rslt_data == NULL) { + g_rslt_data = kcalloc(g_1kind_raw_size * HX_CRITERIA_ITEM, + sizeof(char), GFP_KERNEL); + if (g_rslt_data == NULL) { + E("%s: %d, Memory allocation falied!\n", __func__, __LINE__); + ret = MEM_ALLOC_FAIL; + } + } else { + memset(g_rslt_data, 0x00, g_1kind_raw_size * HX_CRITERIA_ITEM * + sizeof(char)); + } + + snprintf(g_file_path, + (int)(strlen(HX_RSLT_OUT_PATH) + strlen(HX_RSLT_OUT_FILE)+1), + "%s%s", HX_RSLT_OUT_PATH, HX_RSLT_OUT_FILE); + + return ret; +} + +static void himax_self_test_data_deinit(void) +{ + int i = 0; + + /*dbg*/ + /* for (i = 0; i < HX_CRITERIA_ITEM; i++) + * I("%s:[%d]%d\n", __func__, i, g_inspection_criteria[i]); + */ + if (g_inspection_criteria != NULL) { + for (i = 0; i < HX_CRITERIA_SIZE; i++) { + if (g_inspection_criteria[i] != NULL) + kfree(g_inspection_criteria[i]); + } + kfree(g_inspection_criteria); + I("Now it have free the g_inspection_criteria!\n"); + } else { + I("No Need to free g_inspection_criteria!\n"); + } + + if (g_inspt_crtra_flag != NULL) { + kfree(g_inspt_crtra_flag); + g_inspt_crtra_flag = NULL; + } + + g_rslt_data_len = 0; + +} + +static int himax_chip_self_test(void) +{ + uint32_t ret = HX_INSPECT_OK; + uint32_t test_size = ic_data->HX_TX_NUM * ic_data->HX_RX_NUM + + ic_data->HX_TX_NUM + ic_data->HX_RX_NUM; + int i = 0; + uint8_t tmp_addr[DATA_LEN_4] = {0x94, 0x72, 0x00, 0x10}; + uint8_t tmp_data[DATA_LEN_4] = {0x01, 0x00, 0x00, 0x00}; +#ifdef HX_CODE_OVERLAY + uint8_t normalfw[32] = "Himax_firmware.bin"; + uint8_t mpapfw[32] = "Himax_mpfw.bin"; +#endif + + I("%s: force fail\n", __func__); + return HX_INSPECT_EFILE; + + I("%s:IN\n", __func__); + + private_ts->suspend_resume_done = 0; + +#ifdef HX_CODE_OVERLAY + g_core_fp.fp_0f_op_file_dirly(mpapfw); + g_core_fp.fp_reload_disable(0); + g_core_fp.fp_sense_on(0x00); +#endif + + ret = himax_self_test_data_init(); + + hx_print_ic_id(); + + /*Do normal test items*/ + for (i = 0; i < HX_CRITERIA_ITEM; i++) { + if (i < HIMAX_LPWUG_RAWDATA) { + if (g_test_item_flag[i] == 1) { + I("%d. %s Start\n", i, g_himax_inspection_mode[i]); + ret |= mpTestFunc(i, test_size); + I("%d. %s End, ret = %X\n", i, g_himax_inspection_mode[i], ret); + } + } else { + break; + } + } + + /* Press power key and do LPWUG test items*/ + if (do_lpwg_test) { + himax_press_powerkey(); + /* Wait suspend done */ + while (private_ts->suspend_resume_done != 1) + usleep_range(1000, 1001); + private_ts->suspend_resume_done = 0; + + for (; i < HX_CRITERIA_ITEM; i++) { + if (g_test_item_flag[i] == 1) { + I("%d. %s Start\n", i, g_himax_inspection_mode[i]); + ret |= mpTestFunc(i, test_size); + I("%d. %s End\n", i, g_himax_inspection_mode[i]); + } + } + himax_press_powerkey(); + /* Wait resume done */ + while (private_ts->suspend_resume_done != 1) + usleep_range(1000, 1001); + } + +#if 0 + hx_test_data_pop_out(g_rslt_data, g_file_path); +#endif + +#ifdef HX_CODE_OVERLAY + private_ts->in_self_test = 0; + g_core_fp.fp_0f_op_file_dirly(normalfw); + hx_turn_on_mp_func(0); + /* set N frame back to default value 1*/ + g_core_fp.fp_register_write(tmp_addr, 4, tmp_data, 0); + g_core_fp.fp_reload_disable(0); + g_core_fp.fp_sense_on(0); +#else + g_core_fp.fp_sense_off(true); + hx_turn_on_mp_func(0); + /*himax_set_N_frame(1, HIMAX_INSPECTION_WEIGHT_NOISE);*/ + /* set N frame back to default value 1*/ + g_core_fp.fp_register_write(tmp_addr, 4, tmp_data, 0); +#ifndef HX_ZERO_FLASH + if (g_core_fp.fp_reload_disable != NULL) + g_core_fp.fp_reload_disable(0); +#endif + g_core_fp.fp_sense_on(0); +#endif + + himax_self_test_data_deinit(); + + + I("running status = %X\n", ret); + + /*if (ret != 0)*/ + /*ret = 1;*/ + + I("%s:OUT\n", __func__); + return ret; +} + +void himax_inspect_data_clear(void) +{ + if (!g_rslt_data) { + kfree(g_rslt_data); + g_rslt_data = NULL; + } +} + +void himax_inspection_init(void) +{ + I("%s: enter, %d\n", __func__, __LINE__); + + g_core_fp.fp_chip_self_test = himax_chip_self_test; +} + + + +/* SEC INSPECTION */ +#ifdef SEC_FACTORY_MODE +static void hx_findout_limit(uint32_t *RAW, int *limit_val, int sz_mutual) +{ + int i = 0; + int tmp = 0; + + for (i = 0; i < sz_mutual; i++) { + tmp = ((int32_t)RAW[i]); + if (tmp > limit_val[0]) { + limit_val[0] = tmp; + } + if (tmp < limit_val[1]) { + limit_val[1] = tmp; + } + tmp = 0; + } + I("%s: max=%d, min=%d\n", __func__, limit_val[0], limit_val[1]); +} + +static void himax_osr_ctrl(bool enable) +{ + uint8_t tmp_addr[4] = {0}; + uint8_t tmp_data[4] = {0}; + uint8_t w_byte = 0; + uint8_t back_byte = 0; + uint8_t retry = 10; + + I("%s %s: Entering\n", HIMAX_LOG_TAG, __func__); + + tmp_addr[3] = 0x10; tmp_addr[2] = 0x00; tmp_addr[1] = 0x70; tmp_addr[0] = 0x88; + + do { + g_core_fp.fp_register_read(tmp_addr, 4, tmp_data, false); + + if (enable == 0) { + tmp_data[0] &= ~(1 << 4); + tmp_data[0] &= ~(1 << 5); + } else { + tmp_data[0] |= (1 << 4); + tmp_data[0] |= (1 << 5); + } + + w_byte = tmp_data[0]; + + g_core_fp.fp_register_write(tmp_addr, 4, tmp_data, 0); + g_core_fp.fp_register_read(tmp_addr, 4, tmp_data, false); + back_byte = tmp_data[0]; + if (w_byte != back_byte) + I("%s %s: Write osr_ctrl failed, w_byte = %02X, back_byte = %02X\n", + HIMAX_LOG_TAG, __func__, w_byte, back_byte); + else { + I("%s %s: Write osr_ctrl correctly, w_byte = %02X, back_byte = %02X\n", + HIMAX_LOG_TAG, __func__, w_byte, back_byte); + break; + } + } while (--retry > 0); +} + +static int hx_get_one_raw(uint32_t *RAW, uint8_t checktype, uint32_t datalen) +{ + int ret = 0; +#ifdef HX_ESD_RECOVERY + /* skip zero counter*/ + g_zero_event_count = 0; +#endif + + I("%s Need Change Mode ,target=%s\n", + HIMAX_LOG_TAG, g_himax_inspection_mode[checktype]); + g_core_fp.fp_sense_off(true); + hx_turn_on_mp_func(1); +#ifndef HX_ZERO_FLASH + if (g_core_fp.fp_reload_disable != NULL) + g_core_fp.fp_reload_disable(1); +#endif + /* force to active status */ + g_core_fp.fp_idle_mode(1); + + himax_switch_mode_inspection(checktype); + if (checktype == HIMAX_ABS_NOISE || checktype == HIMAX_WEIGHT_NOISE) { + himax_osr_ctrl(0); /*disable OSR_HOP_EN*/ + himax_set_N_frame(NOISEFRAME, checktype); + /* himax_get_noise_base(); */ + } else if (checktype == HIMAX_ACT_IDLE_RAWDATA + || checktype == HIMAX_ACT_IDLE_NOISE) { + I("N frame = %d\n", 10); + himax_set_N_frame(10, checktype); + } else { + I("N frame = %d\n", 2); + himax_set_N_frame(2, checktype); + } + g_core_fp.fp_sense_on(1); + ret = himax_wait_sorting_mode(checktype); + if (ret) { + E("%s %s: himax_wait_sorting_mode FAIL\n", + HIMAX_LOG_TAG, __func__); + goto END_FUNC; + } + + + himax_switch_data_type(checktype); + + ret = himax_get_rawdata(RAW, datalen, checktype); + if (ret) { + E("%s %s: himax_get_rawdata FAIL\n", + HIMAX_LOG_TAG, __func__); + goto END_FUNC; + } + +// g_dc_max = g_core_fp.fp_get_max_dc(); + g_dc_max = himax_get_max_dc(); + +END_FUNC: + I("%s %s:return normal status!\n", + HIMAX_LOG_TAG, __func__); + g_core_fp.fp_sense_off(true); + + himax_switch_data_type(HIMAX_BACK_NORMAL); + himax_switch_mode_inspection(HIMAX_RAWDATA); + hx_turn_on_mp_func(0); + /* change to auto status */ + himax_set_N_frame(1, HIMAX_ABS_NOISE); +#ifndef HX_ZERO_FLASH + if (g_core_fp.fp_reload_disable != NULL) + g_core_fp.fp_reload_disable(0); +#endif + + msleep(20); + g_core_fp.fp_sense_on(1); + msleep(20); + + return ret; +} + +int hx_raw_2d_to_1d(int x, int y) +{ + if (y == 0) + return x; + return (x + (ic_data->HX_RX_NUM * (y - 1))); +} + +int hx_get_3x3_noise(int *RAW, int mid_pos_x, int mid_pos_y) +{ + int ret = NO_ERR; + int x = 0; + int y = 0; + int mid_idx = 0; + int start_idx = 0; + int now_idx = 0; + int sum = 0; + + mid_idx = hx_raw_2d_to_1d(mid_pos_x, mid_pos_y); + /* in the middle's postion of left and up*/ + start_idx = mid_idx - 1 - ic_data->HX_RX_NUM; + + for (y = 0; y < 3; y++) { + for (x = 0; x < 3; x++) { + now_idx = start_idx + (x * 1) + (y * ic_data->HX_RX_NUM); + sum += RAW[now_idx]; + } + printk("\n"); + } + ret = sum; + return ret; +} + +extern int32_t *diag_mutual; +int hx_sensity_test(int *result) +{ + int ret = NO_ERR; + int *RAW; + int i = 0; + int j = 0; + int index = 0; + int datalen = 0; + int tx_num = ic_data->HX_TX_NUM; + int rx_num = ic_data->HX_RX_NUM; + int sens_pt_grp[9][2]; + + /* 1: y, 0:x*/ + sens_pt_grp[0][1] = 3; + sens_pt_grp[0][0] = 3; + sens_pt_grp[1][1] = tx_num / 2; + sens_pt_grp[1][0] = 3; + sens_pt_grp[2][1] = tx_num - 4; + sens_pt_grp[2][0] = 3; + sens_pt_grp[3][1] = 3; + sens_pt_grp[3][0] = rx_num / 2; + sens_pt_grp[4][1] = tx_num / 2; + sens_pt_grp[4][0] = rx_num / 2; + sens_pt_grp[5][1] = tx_num - 4; + sens_pt_grp[5][0] = rx_num / 2; + sens_pt_grp[6][1] = 3; + sens_pt_grp[6][0] = rx_num - 4; + sens_pt_grp[7][1] = tx_num / 2; + sens_pt_grp[7][0] = rx_num - 4; + sens_pt_grp[8][1] = tx_num - 4; + sens_pt_grp[8][0] = rx_num - 4; + + datalen = (ic_data->HX_TX_NUM * ic_data->HX_RX_NUM) + + ic_data->HX_TX_NUM + ic_data->HX_RX_NUM; + RAW = kzalloc(sizeof(int) * datalen, GFP_KERNEL); + /* get one time, but now markup it*/ + /* ret = hx_get_one_iir(RAW, HIMAX_INSPECTION_RAWDATA, datalen); */ + + memcpy(RAW, diag_mutual, sizeof(int) * datalen); + if (g_ts_dbg != 0) { + for (j = 0; j < ic_data->HX_RX_NUM; j++) { + if (j == 0) { + printk(" RX%2d", j + 1); + } else { + printk(" RX%2d", j + 1); + } + } + printk("\n"); + + for (i = 0; i < ic_data->HX_TX_NUM; i++) { + printk("TX%2d", i + 1); + for (j = 0; j < ic_data->HX_RX_NUM; j++) { + index = i * j; + printk("%5d ", RAW[index]); + } + printk("\n"); + } + } + for (i = 0; i < 9; i++) { + result[i] = + hx_get_3x3_noise(RAW, sens_pt_grp[i][0], sens_pt_grp[i][1]); + } + kfree(RAW); + return ret; +} + +#define TSP_PATH_EXTERNAL_FW_SIGNED "/sdcard/firmware/tsp/tsp_signed.bin" +#define HIMAX_UMS_FW_PATH "/sdcard/Firmware/TSP/tsp.bin" +#define TSP_PATH_SPU_FW_SIGNED "/spu/TSP/ffu_tsp.bin" +#define LEN_RSLT 128 +#define FACTORY_BUF_SIZE PAGE_SIZE +#define BUILT_IN (0) +#define UMS (1) +#define SPU (3) + +#define TSP_NODE_DEBUG (0) +#define TSP_CM_DEBUG (0) +#define TSP_CH_UNUSED (0) +#define TSP_CH_SCREEN (1) +#define TSP_CH_GTX (2) +#define TSP_CH_KEY (3) +#define TSP_CH_UNKNOWN (-1) + +#include +#define MAX_FW_PATH 255 +int g_f_edge_border = 0; +int g_f_cal_en = 0; + +struct sec_rawdata_buffs *g_sec_raw_buff; +extern unsigned long FW_VER_MAJ_FLASH_ADDR; +extern unsigned long FW_VER_MIN_FLASH_ADDR; +extern unsigned long CFG_VER_MAJ_FLASH_ADDR; +extern unsigned long CFG_VER_MIN_FLASH_ADDR; +extern unsigned long CID_VER_MAJ_FLASH_ADDR; +extern unsigned long CID_VER_MIN_FLASH_ADDR; +extern unsigned long PANEL_VERSION_ADDR; +//unsigned long PANEL_VERSION_ADDR = 49156; /* 0x00C004 */ +extern bool fw_update_complete; + +static void not_support_cmd(void *dev_data) +{ + char buf[LEN_RSLT] = { 0 }; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + snprintf(buf, sizeof(buf), "%s", "NA"); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = SEC_CMD_STATUS_NOT_APPLICABLE; + sec_cmd_set_cmd_exit(sec); + + I("%s %s: \"%s(%d)\"\n", + HIMAX_LOG_TAG, __func__, buf, (int)strnlen(buf, + sizeof(buf))); + return; +} + +static void check_connection(void *dev_data) +{ + char buf[LEN_RSLT] = { 0 }; + uint8_t tmp_data[DATA_LEN_4] = { 0 }; + int ret_val = NO_ERR; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + ret_val = + g_core_fp.fp_register_read(pfw_op->addr_chk_fw_status, DATA_LEN_4, + tmp_data, 0); + + if (ret_val == NO_ERR) { + I("R900000A8 : [3]=0x%02X,[2]=0x%02X,[1]=0x%02X,[0]=0x%02X\n", + tmp_data[3], tmp_data[2], tmp_data[1], tmp_data[0]); + snprintf(buf, sizeof(buf), "OK"); + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + snprintf(buf, sizeof(buf), "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static void get_chip_vendor(void *dev_data) +{ + char buf[LEN_RSLT] = { 0 }; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + snprintf(buf, sizeof(buf), "%s", "HIMAX"); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) + sec_cmd_set_cmd_result_all(sec, buf, strnlen(buf, sizeof(buf)), "IC_VENDOR"); + sec->cmd_state = SEC_CMD_STATUS_OK; + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static void get_chip_name(void *dev_data) +{ + char buf[LEN_RSLT] = { 0 }; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + + snprintf(buf, sizeof(buf), "%s", private_ts->chip_name); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) + sec_cmd_set_cmd_result_all(sec, buf, strnlen(buf, sizeof(buf)), "IC_NAME"); + sec->cmd_state = SEC_CMD_STATUS_OK; + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static void get_chip_id(void *dev_data) +{ + char buf[LEN_RSLT] = { 0 }; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + + snprintf(buf, sizeof(buf), "%#02x", ic_data->vendor_sensor_id); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = SEC_CMD_STATUS_OK; + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static int himax_fw_update_kernel(struct himax_ts_data *ts) +{ + int ret = 0; + char fw_path[MAX_FW_PATH + 1]; + const struct firmware *firmware = NULL; + + himax_int_enable(0); + + memset(fw_path, 0, MAX_FW_PATH); + snprintf(fw_path, MAX_FW_PATH, "%s", ts->pdata->i_CTPM_firmware_name); + + ret = request_firmware(&firmware, fw_path, ts->dev); + if (ret) { + E("%s %s: do not request firmware: %d name as=%s\n", + HIMAX_LOG_TAG, __func__, ret, fw_path); + goto FAIL_END; + } + + switch (firmware->size) { + case FW_SIZE_32k: + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_32k( + (unsigned char *) firmware->data, firmware->size, false); + break; + case FW_SIZE_60k: + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_60k( + (unsigned char *) firmware->data, firmware->size, false); + break; + case FW_SIZE_64k: + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_64k( + (unsigned char *) firmware->data, firmware->size, false); + break; + case FW_SIZE_124k: + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_124k( + (unsigned char *) firmware->data, firmware->size, false); + break; + case FW_SIZE_128k: + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_128k( + (unsigned char *) firmware->data, firmware->size, false); + break; + case FW_SIZE_255k: + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_255k( + (unsigned char *) firmware->data, firmware->size, false); + break; + default: + E("%s %s: does not support fw size %d\n", + HIMAX_LOG_TAG, __func__, (int)firmware->size); + } + + if (ret == 0) + ret = FW_ERR_UPTODATE; + else + ret = FW_ERR_NONE; + + release_firmware(firmware); + + g_core_fp.fp_reload_disable(0); + g_core_fp.fp_read_FW_ver(); + g_core_fp.fp_touch_information(); +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(true, false); +#else + g_core_fp.fp_sense_on(0x00); +#endif + +FAIL_END: + himax_int_enable(1); + return ret; +} + +static int himax_fw_update_from_storage(bool signing, const char *file_path) +{ + int ret = 0; + long fsize; + long spu_ret = 0, spu_fw_size; + const struct firmware *fw_entry; + + himax_int_enable(0); + + ret = request_firmware(&fw_entry, file_path, private_ts->dev); + if (ret) { + E("%s: fw is not available %d, %s\n", __func__, ret, file_path); + himax_int_enable(1); + return FW_ERR_FILE_OPEN; + } + + fsize = fw_entry->size; + if (signing) { + spu_fw_size = fsize; + /* name 3, digest 32, signature 512 */ +#ifdef SUPPORT_FW_SIGNED + fsize -= SPU_METADATA_SIZE(TSP); +#endif + } + + I("%s - path [%s] size [%zu]\n", __func__, file_path, fsize); + + if (fsize > 0) { + if (signing) { +#ifdef SUPPORT_FW_SIGNED + spu_ret = spu_firmware_signature_verify("TSP", fw_entry->data, spu_fw_size); +#endif + I("%s: spu_ret : %ld, spu_fw_size:%ld\n", __func__, spu_ret, spu_fw_size); + + if (spu_ret != fsize) { + I("%s: signature verify failed, %ld\n", __func__, spu_ret); + ret = FW_ERR_FILE_SIGN; + release_firmware(fw_entry); + goto FAIL_END; + } + } + } else { + I("%s [ERROR] fsize [%zu]\n", __func__, fsize); + release_firmware(fw_entry); + ret = FW_ERR_FILE_READ; + goto FAIL_END; + } + + switch (fsize) { + case FW_SIZE_32k: + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_32k( + (unsigned char *) fw_entry->data, fsize, false); + break; + case FW_SIZE_60k: + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_60k( + (unsigned char *) fw_entry->data, fsize, false); + break; + case FW_SIZE_64k: + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_64k( + (unsigned char *) fw_entry->data, fsize, false); + break; + case FW_SIZE_124k: + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_124k( + (unsigned char *) fw_entry->data, fsize, false); + break; + case FW_SIZE_128k: + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_128k( + (unsigned char *) fw_entry->data, fsize, false); + break; + case FW_SIZE_255k: + ret = g_core_fp.fp_fts_ctpm_fw_upgrade_with_sys_fs_255k( + (unsigned char *) fw_entry->data, fsize, false); + break; + default: + E("%s %s: does not support fw size %d\n", + HIMAX_LOG_TAG, __func__, (int)fsize); + } + + if (ret == 0) + ret = FW_ERR_UPTODATE; + else + ret = FW_ERR_NONE; + + release_firmware(fw_entry); + + g_core_fp.fp_reload_disable(0); + g_core_fp.fp_read_FW_ver(); + g_core_fp.fp_touch_information(); +#ifdef HX_RST_PIN_FUNC + g_core_fp.fp_ic_reset(true, false); +#else + g_core_fp.fp_sense_on(0x00); +#endif + +FAIL_END: + himax_int_enable(1); + I("%s: DONE\n", __func__); + return ret; +} + +static void fw_update(void *dev_data) +{ + int ret = 0; + char buf[LEN_RSLT] = { 0 }; + + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct himax_ts_data *ts = + container_of(sec, struct himax_ts_data, sec); + + sec_cmd_set_default_result(sec); + + I("%s %s(), %d\n", HIMAX_LOG_TAG, + __func__, sec->cmd_param[0]); + + switch (sec->cmd_param[0]) { + case BUILT_IN: + ret = himax_fw_update_kernel(ts); + break; + case UMS: +#if IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) + ret = himax_fw_update_from_storage(true, TSP_EXTERNAL_FW_SIGNED); +#else + ret = himax_fw_update_from_storage(false, TSP_EXTERNAL_FW); +#endif + break; + case SPU: + ret = himax_fw_update_from_storage(true, TSP_SPU_FW_SIGNED); + break; + default: + ret = -EINVAL; + I("not support param %d", sec->cmd_param[0]); + break; + } + + if (ret == 0) { + sec->cmd_state = SEC_CMD_STATUS_OK; + snprintf(buf, sizeof(buf), "%s", "OK"); + } else { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "%s", "NG"); + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + I("%s %s: %s(%d) ret = %d\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf)), ret); +} + +static void get_fw_ver_bin(void *dev_data) +{ + int ret = 0; + uint8_t bin_ver_ic_name = 0; /* self definition*/ + uint8_t bin_ver_proj = 0; /* CID Maj */ + uint8_t bin_ver_modul = 0; /* Panel Ver */ + uint8_t bin_ver_fw = 0; /* CID Min*/ + int bin_fw_ver = 0; + int bin_cid_ver = 0; + char buf[LEN_RSLT] = { 0 }; + char fw_path[MAX_FW_PATH + 1]; + const struct firmware *firmware = NULL; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + + snprintf(fw_path, MAX_FW_PATH, "%s", + private_ts->pdata->i_CTPM_firmware_name); + I("%s fw_path=%s\n", HIMAX_LOG_TAG, + fw_path); + + ret = request_firmware(&firmware, fw_path, private_ts->dev); + if (ret) { + E("%s %s: do not request firmware: %d name as=%s\n", + HIMAX_LOG_TAG, __func__, ret, fw_path); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), + "HX: get bin fail please check bin file!\n"); + } else { + I("Now project name = %s\n", private_ts->pdata->proj_name); + + if (strcmp(private_ts->pdata->proj_name, "M20") == 0) { + bin_fw_ver = + (firmware->data[FW_VER_MAJ_FLASH_ADDR] << 8) | + firmware->data[FW_VER_MIN_FLASH_ADDR]; + bin_cid_ver = + (firmware->data[CID_VER_MAJ_FLASH_ADDR] << 8) | + firmware->data[CID_VER_MIN_FLASH_ADDR]; + + snprintf(buf, sizeof(buf), "HX%04X%04X", bin_fw_ver, bin_cid_ver); + } else { + if (strcmp(HX_83112A_SERIES_PWON, private_ts->chip_name) == 0) + bin_ver_ic_name = 0x01; + else if (strcmp(HX_83102D_SERIES_PWON, private_ts->chip_name) == 0) + bin_ver_ic_name = 0x02; + else if (strcmp(HX_83102E_SERIES_PWON, private_ts->chip_name) == 0) + bin_ver_ic_name = 0x03; + else if (strcmp(HX_83121A_SERIES_PWON, private_ts->chip_name) == 0) + bin_ver_ic_name = 0x04; + else + bin_ver_ic_name = 0x00; + bin_ver_proj = firmware->data[CID_VER_MAJ_FLASH_ADDR]; + bin_ver_modul = firmware->data[PANEL_VERSION_ADDR]; + bin_ver_fw = firmware->data[CID_VER_MIN_FLASH_ADDR]; + + snprintf(buf, sizeof(buf), "HX%02X%02X%02X%02X", bin_ver_ic_name, bin_ver_proj, bin_ver_modul, bin_ver_fw); + } + } + if (firmware) { + release_firmware(firmware); + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) + sec_cmd_set_cmd_result_all(sec, buf, strnlen(buf, sizeof(buf)), "FW_VER_BIN"); + sec->cmd_state = SEC_CMD_STATUS_OK; + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static void get_config_ver(void *dev_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + char buf[LEN_RSLT] = { 0 }; + + sec_cmd_set_default_result(sec); + + snprintf(buf, sizeof(buf), "%s_%02X%02X", "HX", + ic_data->vendor_touch_cfg_ver, + ic_data->vendor_display_cfg_ver); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = SEC_CMD_STATUS_OK; + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static void get_checksum_data(void *dev_data) +{ + char buf[LEN_RSLT] = { 0 }; + u32 chksum = 0; + u32 chksum_size = 0; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + + if (strcmp(HX_83121A_SERIES_PWON, private_ts->chip_name) == 0) { + chksum_size = FW_SIZE_255k; + } else if ((strcmp(HX_83102D_SERIES_PWON, private_ts->chip_name) == 0) || + (strcmp(HX_83102E_SERIES_PWON, private_ts->chip_name) == 0)) { + chksum_size = FW_SIZE_128k; + } else { + chksum_size = FW_SIZE_64k; + } + I("Now Size = %d\n", chksum_size); + + himax_int_enable(0); + msleep(10); + g_core_fp.fp_sense_off(true); + msleep(10); + + chksum = + g_core_fp.fp_check_CRC(pfw_op->addr_program_reload_from, chksum_size); + msleep(10); + + g_core_fp.fp_sense_on(0); + msleep(10); + himax_int_enable(1); + msleep(10); + /* + chksum == 0 => checksum pass + chksum != 0 => checksum fail + */ + + I("%s: chksum = %d\n", __func__, chksum); + + if (chksum == 0) { + snprintf(buf, sizeof(buf), "OK"); + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + snprintf(buf, sizeof(buf), "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static void get_fw_ver_ic(void *dev_data) +{ + uint8_t ic_ver_ic_name = 0; /* self definition*/ + uint8_t ic_ver_proj = 0; /* CID Maj */ + uint8_t ic_ver_modul = 0; /* Panel Ver */ + uint8_t ic_ver_fw = 0; /* CID Min*/ + + char buf[LEN_RSLT] = { 0 }; + char model[16] = {0}; + + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + + g_core_fp.fp_sense_off(true); + g_core_fp.fp_read_FW_ver(); + g_core_fp.fp_sense_on(0); + + I("Now project name = %s\n", private_ts->pdata->proj_name); + + if (strcmp(private_ts->pdata->proj_name, "M20") == 0) { + snprintf(buf, sizeof(buf), "HX%04X%04X", ic_data->vendor_fw_ver, + (ic_data->vendor_cid_maj_ver << 8 | ic_data->vendor_cid_min_ver)); + } else { + if (strcmp(HX_83112A_SERIES_PWON, private_ts->chip_name) == 0) + ic_ver_ic_name = 0x01; + else if (strcmp(HX_83102D_SERIES_PWON, private_ts->chip_name) == 0) + ic_ver_ic_name = 0x02; + else if (strcmp(HX_83102E_SERIES_PWON, private_ts->chip_name) == 0) + ic_ver_ic_name = 0x03; + else if (strcmp(HX_83121A_SERIES_PWON, private_ts->chip_name) == 0) + ic_ver_ic_name = 0x04; + else + ic_ver_ic_name = 0x00; + ic_ver_proj = ic_data->vendor_cid_maj_ver; + ic_ver_modul = ic_data->vendor_panel_ver; + ic_ver_fw = ic_data->vendor_cid_min_ver; + + snprintf(buf, sizeof(buf), "HX%02X%02X%02X%02X", ic_ver_ic_name, ic_ver_proj, ic_ver_modul, ic_ver_fw); + snprintf(model, sizeof(model), "HX%02X%02X", ic_ver_ic_name, ic_ver_proj); + + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) { + sec_cmd_set_cmd_result_all(sec, buf, strnlen(buf, sizeof(buf)), "FW_VER_IC"); + sec_cmd_set_cmd_result_all(sec, model, strnlen(model, sizeof(model)), "FW_MODEL"); + } + sec->cmd_state = SEC_CMD_STATUS_OK; + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static void set_edge_mode(void *dev_data) +{ + int ret = 0; + char buf[LEN_RSLT] = { 0 }; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + + I("%s %s(), %d\n", HIMAX_LOG_TAG, + __func__, sec->cmd_param[0]); + + switch (sec->cmd_param[0]) { + case 0: + ret = g_core_fp.set_edge_border(FW_EDGE_BORDER_OFF); + if (ret == 0) { + g_f_edge_border = FW_EDGE_BORDER_OFF; + I("%s %s(), Unset Edge Mode\n", HIMAX_LOG_TAG, __func__); + } + break; + case 1: + ret = g_core_fp.set_edge_border(FW_EDGE_BORDER_ON); + if (ret == 0) { + g_f_edge_border = FW_EDGE_BORDER_ON; + I("%s %s(), Set Edge Mode\n", HIMAX_LOG_TAG, __func__); + } + break; + default: + E("%s %s(), Invalid Argument\n", HIMAX_LOG_TAG, + __func__); + break; + } + + if (ret) { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "%s", "NG"); + } else { + sec->cmd_state = SEC_CMD_STATUS_OK; + snprintf(buf, sizeof(buf), "%s", "OK"); + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +/* read write and check register for 4bytes*/ +static int hx_cmd_rw_chk(uint32_t addr, uint8_t chg_len, uint8_t *pos_ary, uint8_t *data_ary) +{ + int retry = 3; + int i = 0; + uint8_t addr_ary[4] = {0}; + uint8_t write_data[4] = {0}; + uint8_t read_data[4] = {0}; + + himax_in_parse_assign_cmd(addr, addr_ary, 4); + g_core_fp.fp_register_read(addr_ary, DATA_LEN_4, write_data, false); + + /*data change*/ + for (i = 0; i < chg_len; i++) + write_data[pos_ary[i]] = data_ary[i]; + + do { + g_core_fp.fp_register_write(addr_ary, DATA_LEN_4, write_data, false); + msleep(10); + g_core_fp.fp_register_read(addr_ary, DATA_LEN_4, read_data, false); + + if (read_data[3] == write_data[3] && read_data[2] == write_data[2] + && read_data[1] == write_data[1] && read_data[0] == write_data[0]) + return 1; + + retry--; + E("%s %s: write register retry(%d)\n", HIMAX_LOG_TAG, __func__, retry); + } while (retry > 0); + + return 0; +} + +static int hx_rotate_mode_set(bool is_portrait) +{ + uint8_t pos_ary[4] = {0, 1, 2, 3}; + uint8_t data_ary[4] = {0}; + + if (is_portrait) + himax_in_parse_assign_cmd(data_portrait, data_ary, 4); + else + himax_in_parse_assign_cmd(data_landscape, data_ary, 4); + + return hx_cmd_rw_chk(addr_rotative_mode, 4, pos_ary, data_ary); +} + +/* only support Letter box */ +static void set_grip_data(void *dev_data) +{ + int ret = 1; + char buf[LEN_RSLT] = { 0 }; + uint8_t pos_ary[4] = {0}; + uint8_t data_ary[4] = {0}; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec); + + sec_cmd_set_default_result(sec); + + if (data->suspended) { + E("%s %s: now IC status is OFF\n", HIMAX_LOG_TAG, __func__); + goto err_grip_data; + } + + if (sec->cmd_param[0] == 1) {/*portrait*/ + ret &= hx_rotate_mode_set(true); + pos_ary[0] = 0; pos_ary[1] = 1; + data_ary[0] = sec->cmd_param[1]; data_ary[1] = sec->cmd_param[1]; + ret &= hx_cmd_rw_chk(addr_grip_zone, 2, pos_ary, data_ary);/*grip zone*/ + data_ary[0] = sec->cmd_param[2]; data_ary[1] = sec->cmd_param[3]; + ret &= hx_cmd_rw_chk(addr_reject_zone, 2, pos_ary, data_ary);/*reject zone*/ + data_ary[0] = sec->cmd_param[4] >> 8; data_ary[1] = sec->cmd_param[4] & 0xFF; + ret &= hx_cmd_rw_chk(addr_reject_zone_boud, 2, pos_ary, data_ary);/*reject zone boundary*/ + memcpy(g_portrait_data, sec->cmd_param, 5 * sizeof(int)); + } else if (sec->cmd_param[0] == 2) {/*landscape*/ + if (sec->cmd_param[1] == 1) { + /*landscape enter*/ + ret &= hx_rotate_mode_set(false); + pos_ary[0] = 0; pos_ary[1] = 1; pos_ary[2] = 2; pos_ary[3] = 3; + data_ary[0] = sec->cmd_param[2]; data_ary[1] = sec->cmd_param[2]; + data_ary[2] = sec->cmd_param[4]; data_ary[3] = sec->cmd_param[5]; + ret &= hx_cmd_rw_chk(addr_reject_zone, 4, pos_ary, data_ary);/*reject zone*/ + data_ary[0] = sec->cmd_param[3]; data_ary[1] = sec->cmd_param[3]; + data_ary[2] = sec->cmd_param[6]; data_ary[3] = sec->cmd_param[7]; + ret &= hx_cmd_rw_chk(addr_grip_zone, 4, pos_ary, data_ary);/*grip zone*/ + } else if (sec->cmd_param[1] == 0) { + /*change to portrait & recovery previous portrait setting*/ + ret &= hx_rotate_mode_set(true); + pos_ary[0] = 0; pos_ary[1] = 1; + data_ary[0] = g_portrait_data[1]; data_ary[1] = g_portrait_data[1]; + ret &= hx_cmd_rw_chk(addr_grip_zone, 2, pos_ary, data_ary);/*grip zone*/ + data_ary[0] = g_portrait_data[2]; data_ary[1] = g_portrait_data[3]; + ret &= hx_cmd_rw_chk(addr_reject_zone, 2, pos_ary, data_ary);/*reject zone*/ + data_ary[0] = g_portrait_data[4] >> 8; data_ary[1] = g_portrait_data[4] & 0xFF; + ret &= hx_cmd_rw_chk(addr_reject_zone_boud, 2, pos_ary, data_ary);/*reject zone boundary*/ + } else { + E("%s %s: cmd0 is abnormal, %d\n", HIMAX_LOG_TAG, __func__, sec->cmd_param[1]); + goto err_grip_data; + } + } else if (sec->cmd_param[0] == 0) {/*exception zone*/ + if (sec->cmd_param[1] >= 0 && sec->cmd_param[1] <= 2) { + /*directoin - off(0), left(1), right(2)*/ + pos_ary[0] = 0; pos_ary[1] = 1; pos_ary[2] = 2; pos_ary[3] = 3; + data_ary[0] = (sec->cmd_param[1] << 6) | sec->cmd_param[2] >> 8; + data_ary[1] = sec->cmd_param[2] & 0xFF; + data_ary[2] = sec->cmd_param[3] >> 8; + data_ary[3] = sec->cmd_param[3] & 0xFF; + ret &= hx_cmd_rw_chk(addr_except_zone, 4, pos_ary, data_ary); + } else { + E("%s %s: cmd0 is abnormal, %d\n", HIMAX_LOG_TAG, __func__, sec->cmd_param[1]); + goto err_grip_data; + } + } else { + E("%s %s: cmd0 is abnormal, %d\n", HIMAX_LOG_TAG, __func__, sec->cmd_param[0]); + goto err_grip_data; + } +err_grip_data: + if (ret == 1) { + sec->cmd_state = SEC_CMD_STATUS_OK; + snprintf(buf, sizeof(buf), "%s", "OK"); + } else { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "%s", "NG"); + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec_cmd_set_cmd_exit(sec); + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static void get_threshold(void *dev_data) +{ + char buf[LEN_RSLT] = { 0 }; + int threshold = 0; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + + threshold = g_core_fp.get_rport_thrsh(); + + if (threshold > 0) { + snprintf(buf, sizeof(buf), "0x%02X", threshold); + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + snprintf(buf, sizeof(buf), "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static void get_scr_x_num(void *dev_data) +{ + int val = -1; + char buf[LEN_RSLT] = { 0 }; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + + val = ic_data->HX_X_RES; + if (val >= 0) { + snprintf(buf, sizeof(buf), "%u", val); + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static void get_scr_y_num(void *dev_data) +{ + int val = -1; + char buf[LEN_RSLT] = { 0 }; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + + val = ic_data->HX_Y_RES; + if (val >= 0) { + snprintf(buf, sizeof(buf), "%u", val); + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static void get_all_x_num(void *dev_data) +{ + int val = -1; + char buf[LEN_RSLT] = { 0 }; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + + val = ic_data->HX_TX_NUM; /* device direction, long side is length */ + if (val >= 0) { + snprintf(buf, sizeof(buf), "%u", val); + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static void get_all_y_num(void *dev_data) +{ + int val = -1; + char buf[LEN_RSLT] = { 0 }; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + + val = ic_data->HX_RX_NUM; /* device direction, short side is width */ + if (val >= 0) { + snprintf(buf, sizeof(buf), "%u", val); + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static void hx_print_frame(struct himax_ts_data *ts, uint32_t *frame) +{ + int i = 0, j = 0; + char msg[15] = { 0 }; + int msg_len = 15; + char *buf = NULL; + int line_size = ic_data->HX_TX_NUM * 15; + + buf = kzalloc(line_size, GFP_KERNEL); + if (!buf) + return; + for (i = 0; i < ic_data->HX_TX_NUM; i++) { + if (i == 0) + snprintf(msg, msg_len, " TX%2d", i); + else + snprintf(msg, msg_len, " TX%2d", i); + + strlcat(buf, msg, line_size); + } + RI("%s\n", buf); + + for (i = 0; i < ic_data->HX_RX_NUM; i++) { + memset(buf, 0x00, line_size); + for (j = 0; j < ic_data->HX_TX_NUM; j++) { + snprintf(msg, msg_len, "%5d ", frame[(j * ic_data->HX_RX_NUM) + i]); + strlcat(buf, msg, line_size); + } + RI("RX%2d %s\n", i, buf); + } + kfree(buf); +} + +#ifdef HX_SAVE_RAW_TO_FLASH +extern int hx_write_4k_flash_flow(uint32_t start_addr, uint8_t *write_data, uint32_t write_len); +#endif +static void get_rawcap(void *dev_data) +{ + uint32_t *RAW = NULL; + uint32_t datalen = 0; + int val = 0; + char buf[LEN_RSLT] = { 0 }; +#ifdef HX_SAVE_RAW_TO_FLASH + int i = 0; + uint8_t *flash_data = NULL; + uint32_t flash_size = HX_SZ_4K; /* 4K */ + uint32_t rawdata_size; +#endif + int limit_val[2] = { 0 }; /* 0: max, 1: min */ + int sz_mutual = ic_data->HX_TX_NUM * ic_data->HX_RX_NUM; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec); + + sec_cmd_set_default_result(sec); + + datalen = + (ic_data->HX_TX_NUM * ic_data->HX_RX_NUM) + ic_data->HX_TX_NUM + + ic_data->HX_RX_NUM; + RAW = kzalloc(sizeof(uint32_t) * datalen, GFP_KERNEL); + if (!RAW) { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "%s:failed to allocate memory", __func__); + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + return; + } +#ifdef HX_SAVE_RAW_TO_FLASH + flash_data = kzalloc(sizeof(uint8_t) * flash_size, GFP_KERNEL); + if (!flash_data) { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "%s:failed to allocate memory", __func__); + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + kfree(RAW); + return; + } +#endif + + himax_int_enable(0); + val = hx_get_one_raw(RAW, HIMAX_RAWDATA, datalen); + + if (val > 0) { + E("%s %s: get rawdata fail!\n", HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s:get fail", __func__); + goto END_OUPUT; + } + + limit_val[0] = -99999; /* max */ + limit_val[1] = 99999; /* min */ + hx_findout_limit(RAW, limit_val, sz_mutual); + + memcpy(&g_sec_raw_buff->_rawdata[0], &RAW[0], + sizeof(uint32_t) * ic_data->HX_TX_NUM * ic_data->HX_RX_NUM); + + RI("%s\n", __func__); + hx_print_frame(data, g_sec_raw_buff->_rawdata); +#ifdef HX_SAVE_RAW_TO_FLASH + /* save to flash */ + /* 1. data size*/ + rawdata_size = sizeof(uint32_t) * datalen; + I("Now rawdata size=%d\n", rawdata_size); + flash_data[0] = rawdata_size % 0x100; + flash_data[1] = (rawdata_size >> 8) % 0x100; + flash_data[2] = (rawdata_size >> 16) % 0x100; + flash_data[3] = (rawdata_size >> 24) % 0x100; + I("Now flash_data[0]=0x%02X,[1]=0x%02X,[2]=0x%02X,[3]=0x%02X\n", + flash_data[0], flash_data[1], flash_data[2], flash_data[3]); + /*2. data type */ + flash_data[4] = 0x02; + flash_data[5] = 0x02; + flash_data[6] = 0x02; + flash_data[7] = 0x02; + /*3. save data to buffer*/ + if (flash_size - 8 > rawdata_size) { + I("Now flash_size > rawdata_size!\n"); + for (i = 0; i < ic_data->HX_TX_NUM * ic_data->HX_RX_NUM; i++) { + flash_data[8 + i * 2] = RAW[i] % 0x100; + flash_data[8 + i * 2 + 1] = (RAW[i] >> 8) % 0x100; + } + } else { + I("Now rawdata_size > flash_size!\n"); + for (i = 0; i * 2 < (flash_size - 8); i++) { + flash_data[8 + i * 2] = RAW[i] % 0x100; + flash_data[8 + i * 2 + 1] = (RAW[i] >> 8) % 0x100; + } + } + /* 4. save to flash*/ + flash_data[0] = rawdata_size % 0x100; + flash_data[1] = (rawdata_size >> 8) % 0x100; + flash_data[2] = (rawdata_size >> 16) % 0x100; + flash_data[3] = (rawdata_size >> 24) % 0x100; + hx_write_4k_flash_flow(HX_ADR_RAW_FLASH, flash_data, flash_size); +#endif +END_OUPUT: + if (val == 0) { + g_sec_raw_buff->f_ready_rawdata = HX_RAWDATA_READY; + I("%s %s: ret val is ok!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%d,%d", limit_val[1], limit_val[0]); /*min,max */ + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + g_sec_raw_buff->f_ready_rawdata = HX_RAWDATA_NOT_READY; + E("%s %s: ret val is fail!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + RI("Min=%d, Max=%d\n", limit_val[1], limit_val[0]); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) + sec_cmd_set_cmd_result_all(sec, buf, strnlen(buf, sizeof(buf)), "RAWCAP"); + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); + kfree(RAW); +#ifdef HX_SAVE_RAW_TO_FLASH + kfree(flash_data); +#endif + himax_int_enable(1); +} + +static void get_rawcap_all(void *dev_data) +{ + char temp[SEC_CMD_STR_LEN] = { 0 }; + char *buf = NULL; + int i = 0, j = 0; + char msg[SEC_CMD_STR_LEN] = { 0 }; + int buff_size = ic_data->HX_TX_NUM * ic_data->HX_RX_NUM * 10; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + get_rawcap(sec); + + sec_cmd_set_default_result(sec); + + if (g_sec_raw_buff->f_ready_rawdata != HX_RAWDATA_READY) { + E("Need to get rawdata first!\n"); + goto END_OUPUT; + } + + buf = kzalloc(buff_size, GFP_KERNEL); + if (!buf) { + E("failed to allocate memory!\n"); + goto END_OUPUT; + } + + for (i = 0; i < ic_data->HX_RX_NUM; i++) { + for (j = 0; j < ic_data->HX_TX_NUM; j++) { + snprintf(msg, SEC_CMD_STR_LEN, "%d,", + (int)g_sec_raw_buff->_rawdata[(j * ic_data->HX_RX_NUM) + i]); + strlcat(buf, msg, buff_size); + } + } + + sec->cmd_state = SEC_CMD_STATUS_OK; + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, buff_size)); + + kfree(buf); + return; +END_OUPUT: + snprintf(temp, SEC_CMD_STR_LEN, "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + sec_cmd_set_cmd_result(sec, temp, strnlen(temp, SEC_CMD_STR_LEN)); +} + +static void get_open(void *dev_data) +{ + uint32_t *RAW = NULL; + int datalen = 0; + int val = 0; + char buf[LEN_RSLT] = { 0 }; + int limit_val[2] = { 0 }; /* 0: max, 1: min */ + int sz_mutual = ic_data->HX_TX_NUM * ic_data->HX_RX_NUM; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec); + + sec_cmd_set_default_result(sec); + + datalen = (ic_data->HX_TX_NUM * ic_data->HX_RX_NUM) + + ic_data->HX_TX_NUM + ic_data->HX_RX_NUM; + RAW = kzalloc(sizeof(uint32_t) * datalen, GFP_KERNEL); + if (!RAW) { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "%s:failed to allocate memory", __func__); + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + return; + } + + himax_int_enable(0); + val = hx_get_one_raw(RAW, HIMAX_OPEN, datalen); + + if (val > 0) { + E("%s %s: get open fail!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s:get fail\n", __func__); + goto END_OUPUT; + } + + limit_val[0] = -9999; /* max */ + limit_val[1] = 9999; /* min */ + hx_findout_limit(RAW, limit_val, sz_mutual); + + memcpy(&g_sec_raw_buff->_open[0], &RAW[0], + sizeof(uint32_t) * ic_data->HX_TX_NUM * ic_data->HX_RX_NUM); + + RI("%s\n", __func__); + hx_print_frame(data, g_sec_raw_buff->_open); + +END_OUPUT: + if (val == 0) { + g_sec_raw_buff->f_ready_open = HX_RAWDATA_READY; + I("%s %s: ret val is ok!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%d,%d", limit_val[1], limit_val[0]); /*min,max */ + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + g_sec_raw_buff->f_ready_open = HX_RAWDATA_NOT_READY; + E("%s %s: ret val is fail!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + RI("Min=%d, Max=%d\n", limit_val[1], limit_val[0]); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) + sec_cmd_set_cmd_result_all(sec, buf, strnlen(buf, sizeof(buf)), "OPEN"); + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); + kfree(RAW); + himax_int_enable(1); +} + +static void get_open_all(void *dev_data) +{ + char temp[SEC_CMD_STR_LEN] = { 0 }; + char *buf = NULL; + int i = 0, j = 0; + char msg[SEC_CMD_STR_LEN] = { 0 }; + int buff_size = ic_data->HX_TX_NUM * ic_data->HX_RX_NUM * 10; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + get_open(sec); + + sec_cmd_set_default_result(sec); + + if (g_sec_raw_buff->f_ready_open != HX_RAWDATA_READY) { + E("Need to get rawdata first!\n"); + goto END_OUPUT; + } + + buf = kzalloc(buff_size, GFP_KERNEL); + if (!buf) { + E("failed to allocate memory!\n"); + goto END_OUPUT; + } + + for (i = 0; i < ic_data->HX_RX_NUM; i++) { + for (j = 0; j < ic_data->HX_TX_NUM; j++) { + snprintf(msg, SEC_CMD_STR_LEN, "%d,", + (int)g_sec_raw_buff->_open[(j * ic_data->HX_RX_NUM) + i]); + strlcat(buf, msg, buff_size); + } + } + + sec->cmd_state = SEC_CMD_STATUS_OK; + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, buff_size)); + + kfree(buf); + return; +END_OUPUT: + snprintf(temp, SEC_CMD_STR_LEN, "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + sec_cmd_set_cmd_result(sec, temp, strnlen(temp, SEC_CMD_STR_LEN)); +} + +static void get_short(void *dev_data) +{ + uint32_t *RAW = NULL; + int datalen = 0; + int val = 0; + char buf[LEN_RSLT] = { 0 }; + int limit_val[2] = { 0 }; /* 0: max, 1: min */ + int sz_mutual = ic_data->HX_TX_NUM * ic_data->HX_RX_NUM; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec); + + sec_cmd_set_default_result(sec); + + datalen = (ic_data->HX_TX_NUM * ic_data->HX_RX_NUM) + + ic_data->HX_TX_NUM + ic_data->HX_RX_NUM; + RAW = kzalloc(sizeof(uint32_t) * datalen, GFP_KERNEL); + if (!RAW) { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "%s:failed to allocate memory", __func__); + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + return; + } + + himax_int_enable(0); + val = hx_get_one_raw(RAW, HIMAX_SHORT, datalen); + + if (val > 0) { + E("%s %s: get short fail!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s:get fail\n", __func__); + goto END_OUPUT; + } + + limit_val[0] = -9999; /* max */ + limit_val[1] = 9999; /* min */ + hx_findout_limit(RAW, limit_val, sz_mutual); + + memcpy(&g_sec_raw_buff->_short[0], &RAW[0], + sizeof(uint32_t) * ic_data->HX_TX_NUM * ic_data->HX_RX_NUM); + + RI("%s\n", __func__); + hx_print_frame(data, g_sec_raw_buff->_short); + +END_OUPUT: + if (val == 0) { + g_sec_raw_buff->f_ready_short = HX_RAWDATA_READY; + I("%s %s: ret val is ok!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%d,%d", limit_val[1], limit_val[0]); /*min,max */ + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + g_sec_raw_buff->f_ready_short = HX_RAWDATA_NOT_READY; + E("%s %s: ret val is fail!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + RI("Min=%d, Max=%d\n", limit_val[1], limit_val[0]); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) + sec_cmd_set_cmd_result_all(sec, buf, strnlen(buf, sizeof(buf)), "SHORT"); + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); + kfree(RAW); + himax_int_enable(1); +} + +static void get_short_all(void *dev_data) +{ + char temp[SEC_CMD_STR_LEN] = { 0 }; + char *buf = NULL; + int i = 0, j = 0; + char msg[SEC_CMD_STR_LEN] = { 0 }; + int buff_size = ic_data->HX_TX_NUM * ic_data->HX_RX_NUM * 10; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + get_short(sec); + + sec_cmd_set_default_result(sec); + + if (g_sec_raw_buff->f_ready_short != HX_RAWDATA_READY) { + E("%s Need to get rawdata first!\n", HIMAX_LOG_TAG); + goto END_OUPUT; + } + + buf = kzalloc(buff_size, GFP_KERNEL); + if (!buf) { + E("%s failed to allocate memory!\n", HIMAX_LOG_TAG); + goto END_OUPUT; + } + + for (i = 0; i < ic_data->HX_RX_NUM; i++) { + for (j = 0; j < ic_data->HX_TX_NUM; j++) { + snprintf(msg, SEC_CMD_STR_LEN, "%d,", + (int)g_sec_raw_buff->_short[(j * ic_data->HX_RX_NUM) + i]); + strlcat(buf, msg, buff_size); + } + } + + sec->cmd_state = SEC_CMD_STATUS_OK; + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, buff_size)); + + kfree(buf); + return; +END_OUPUT: + snprintf(temp, SEC_CMD_STR_LEN, "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + sec_cmd_set_cmd_result(sec, temp, strnlen(temp, SEC_CMD_STR_LEN)); +} + +static void get_mic_open(void *dev_data) +{ + uint32_t *RAW = NULL; + int datalen = 0; + int val = 0; + char buf[LEN_RSLT] = { 0 }; + int limit_val[2] = { 0 }; /* 0: max, 1: min */ + int sz_mutual = ic_data->HX_TX_NUM * ic_data->HX_RX_NUM; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec); + + sec_cmd_set_default_result(sec); + + datalen = (ic_data->HX_TX_NUM * ic_data->HX_RX_NUM) + + ic_data->HX_TX_NUM + ic_data->HX_RX_NUM; + RAW = kzalloc(sizeof(uint32_t) * datalen, GFP_KERNEL); + if (!RAW) { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "%s:failed to allocate memory", __func__); + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + return; + } + + himax_int_enable(0); + val = hx_get_one_raw(RAW, HIMAX_MICRO_OPEN, datalen); + + if (val > 0) { + E("%s %s: get rawdata fail!\n", HIMAX_LOG_TAG, + __func__); + snprintf(buf, sizeof(buf), "%s:get fail\n", __func__); + goto END_OUPUT; + } + + limit_val[0] = -9999; /* max */ + limit_val[1] = 9999; /* min */ + hx_findout_limit(RAW, limit_val, sz_mutual); + + memcpy(&g_sec_raw_buff->_mopen[0], &RAW[0], + sizeof(uint32_t) * ic_data->HX_TX_NUM * ic_data->HX_RX_NUM); + + RI("%s\n", __func__); + hx_print_frame(data, g_sec_raw_buff->_mopen); + +END_OUPUT: + if (val == 0) { + g_sec_raw_buff->f_ready_mopen = HX_RAWDATA_READY; + I("%s %s: ret val is ok!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%d,%d", limit_val[1], limit_val[0]); /*min,max */ + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + g_sec_raw_buff->f_ready_mopen = HX_RAWDATA_NOT_READY; + E("%s %s: ret val is fail!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + RI("Min=%d, Max=%d\n", limit_val[1], limit_val[0]); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) + sec_cmd_set_cmd_result_all(sec, buf, strnlen(buf, sizeof(buf)), "MICRO_OPEN"); + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); + kfree(RAW); + himax_int_enable(1); +} + +static void get_mic_open_all(void *dev_data) +{ + char temp[SEC_CMD_STR_LEN] = { 0 }; + char *buf = NULL; + int i = 0, j = 0; + char msg[SEC_CMD_STR_LEN] = { 0 }; + int buff_size = ic_data->HX_TX_NUM * ic_data->HX_RX_NUM * 10; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + get_mic_open(sec); + + sec_cmd_set_default_result(sec); + + if (g_sec_raw_buff->f_ready_mopen != HX_RAWDATA_READY) { + E("%s Need to get rawdata first!\n", HIMAX_LOG_TAG); + goto END_OUPUT; + } + + buf = kzalloc(buff_size, GFP_KERNEL); + if (!buf) { + E("%s failed to allocate memory!\n", HIMAX_LOG_TAG); + goto END_OUPUT; + } + + for (i = 0; i < ic_data->HX_RX_NUM; i++) { + for (j = 0; j < ic_data->HX_TX_NUM; j++) { + snprintf(msg, SEC_CMD_STR_LEN, "%d,", + (int)g_sec_raw_buff->_mopen[(j * ic_data->HX_RX_NUM) + i]); + strlcat(buf, msg, buff_size); + } + } + + sec->cmd_state = SEC_CMD_STATUS_OK; + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, buff_size)); + + kfree(buf); + return; +END_OUPUT: + snprintf(temp, SEC_CMD_STR_LEN, "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + sec_cmd_set_cmd_result(sec, temp, strnlen(temp, SEC_CMD_STR_LEN)); +} + +static void get_noise(void *dev_data) +{ + int32_t *RAW = NULL; + int datalen = 0; + int val = 0; + char buf[LEN_RSLT] = { 0 }; + int limit_val[2] = { 0 }; /* 0: max, 1: min */ + int sz_mutual = ic_data->HX_TX_NUM * ic_data->HX_RX_NUM; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec); + + int i = 0; + uint16_t noise_count = 0; + uint16_t palm_num = 0; + uint16_t weight = 0; + uint8_t tmp_addr[4]; + uint8_t tmp_data[4]; + + sec_cmd_set_default_result(sec); + + datalen = (ic_data->HX_TX_NUM * ic_data->HX_RX_NUM) + + ic_data->HX_TX_NUM + ic_data->HX_RX_NUM; + RAW = kzalloc(sizeof(int32_t) * datalen, GFP_KERNEL); + if (!RAW) { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "%s:failed to allocate memory", __func__); + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + return; + } + + himax_int_enable(0); + val = hx_get_one_raw(RAW, HIMAX_ABS_NOISE, datalen); + + if (val > 0) { + E("%s %s: get rawdata fail!\n", HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s:get fail\n", __func__); + goto END_OUPUT; + } + + limit_val[0] = -9999; /* max */ + limit_val[1] = 9999; /* min */ + hx_findout_limit(RAW, limit_val, sz_mutual); + + /* noise weight test */ + himax_get_noise_base(HIMAX_WEIGHT_NOISE); + palm_num = himax_get_palm_num(); + for (i = 0; i < sz_mutual; i++) { + if ((int)RAW[i] > NOISEMAX) + noise_count++; + } + I("noise_count = %d\n", noise_count); + if (noise_count > palm_num) { + val = -1; + E("%s: noise test NG, PALM\n", __func__); + } + himax_in_parse_assign_cmd(addr_weight_sup, tmp_addr, sizeof(tmp_addr)); + + g_core_fp.fp_register_read(tmp_addr, 4, tmp_data, false); + if (tmp_data[3] == tmp_addr[1] && tmp_data[2] == tmp_addr[0]) + weight = (tmp_data[1] << 8) | tmp_data[0]; + else + I("%s: FW does not support weight test\n", __func__); + + RI("%s: weight = %d, %02X, %02X\n", __func__, weight, tmp_data[2], tmp_data[3]); + /*********************************/ + + memcpy(&g_sec_raw_buff->_noise[0], &RAW[0], sizeof(int32_t) * ic_data->HX_TX_NUM * ic_data->HX_RX_NUM); + hx_print_frame(data, g_sec_raw_buff->_noise); + +END_OUPUT: + if (val == 0) { + g_sec_raw_buff->f_ready_noise = HX_RAWDATA_READY; + I("%s %s: ret val is ok!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%d,%d", limit_val[1], limit_val[0]); /*min,max */ + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + g_sec_raw_buff->f_ready_noise = HX_RAWDATA_NOT_READY; + E("%s %s: ret val is fail!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + RI("Min=%d, Max=%d\n", limit_val[1], limit_val[0]); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) { + sec_cmd_set_cmd_result_all(sec, buf, strnlen(buf, sizeof(buf)), "NOISE"); + snprintf(buf, sizeof(buf), "%d,%d", 0, weight); + sec_cmd_set_cmd_result_all(sec, buf, strnlen(buf, sizeof(buf)), "NoiseWeight"); + } + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); + kfree(RAW); + himax_int_enable(1); +} + +static void get_noise_all(void *dev_data) +{ + char temp[SEC_CMD_STR_LEN] = { 0 }; + char *buf = NULL; + int i = 0, j = 0; + char msg[SEC_CMD_STR_LEN] = { 0 }; + int buff_size = ic_data->HX_TX_NUM * ic_data->HX_RX_NUM * 10; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + get_noise(sec); + + sec_cmd_set_default_result(sec); + + if (g_sec_raw_buff->f_ready_noise != HX_RAWDATA_READY) { + E("%s Need to get rawdata first!\n", HIMAX_LOG_TAG); + goto END_OUPUT; + } + + buf = kzalloc(buff_size, GFP_KERNEL); + if (!buf) { + E("%s failed to allocate memory!\n", HIMAX_LOG_TAG); + goto END_OUPUT; + } + + for (i = 0; i < ic_data->HX_RX_NUM; i++) { + for (j = 0; j < ic_data->HX_TX_NUM; j++) { + snprintf(msg, SEC_CMD_STR_LEN, "%d,", + (int)g_sec_raw_buff->_noise[(j * ic_data->HX_RX_NUM) + i]); + strlcat(buf, msg, buff_size); + } + } + + sec->cmd_state = SEC_CMD_STATUS_OK; + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, buff_size)); + + kfree(buf); + return; +END_OUPUT: + snprintf(temp, SEC_CMD_STR_LEN, "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + sec_cmd_set_cmd_result(sec, temp, strnlen(temp, SEC_CMD_STR_LEN)); +} + +static void get_lp_rawcap(void *dev_data) +{ + uint32_t *RAW = NULL; + int datalen = 0; + int val = 0; + char buf[LEN_RSLT] = { 0 }; + int limit_val[2] = { 0 }; /* 0: max, 1: min */ + int sz_mutual = ic_data->HX_TX_NUM * ic_data->HX_RX_NUM; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec); + + sec_cmd_set_default_result(sec); + + datalen = (ic_data->HX_TX_NUM * ic_data->HX_RX_NUM) + + ic_data->HX_TX_NUM + ic_data->HX_RX_NUM; + RAW = kzalloc(sizeof(uint32_t) * datalen, GFP_KERNEL); + if (!RAW) { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "%s:failed to allocate memory", __func__); + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + return; + } + + himax_int_enable(0); + val = hx_get_one_raw(RAW, HIMAX_LPWUG_RAWDATA, datalen); + + if (val > 0) { + E("%s %s: get rawdata fail!\n", HIMAX_LOG_TAG, + __func__); + snprintf(buf, sizeof(buf), "%s:get fail\n", __func__); + goto END_OUPUT; + } + + limit_val[0] = -9999; /* max */ + limit_val[1] = 9999; /* min */ + hx_findout_limit(RAW, limit_val, sz_mutual); + + memcpy(&g_sec_raw_buff->_lp_rawdata[0], &RAW[0], + sizeof(uint32_t) * ic_data->HX_TX_NUM * ic_data->HX_RX_NUM); + + RI("%s\n", __func__); + hx_print_frame(data, g_sec_raw_buff->_lp_rawdata); + +END_OUPUT: + if (val == 0) { + g_sec_raw_buff->f_ready_lp_rawdata = HX_RAWDATA_READY; + I("%s %s: ret val is ok!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%d,%d", limit_val[1], limit_val[0]); /*min,max */ + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + g_sec_raw_buff->f_ready_lp_rawdata = HX_RAWDATA_NOT_READY; + E("%s %s: ret val is fail!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + RI("Min=%d, Max=%d\n", limit_val[1], limit_val[0]); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) + sec_cmd_set_cmd_result_all(sec, buf, strnlen(buf, sizeof(buf)), "LP_RAW"); + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); + kfree(RAW); + himax_int_enable(1); +} + +static void get_lp_noise(void *dev_data) +{ + uint32_t *RAW = NULL; + int datalen = 0; + int val = 0; + char buf[LEN_RSLT] = { 0 }; + int limit_val[2] = { 0 }; /* 0: max, 1: min */ + int sz_mutual = ic_data->HX_TX_NUM * ic_data->HX_RX_NUM; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec); + + sec_cmd_set_default_result(sec); + + datalen = (ic_data->HX_TX_NUM * ic_data->HX_RX_NUM) + + ic_data->HX_TX_NUM + ic_data->HX_RX_NUM; + RAW = kzalloc(sizeof(uint32_t) * datalen, GFP_KERNEL); + if (!RAW) { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "%s:failed to allocate memory", __func__); + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + return; + } + + himax_int_enable(0); + val = hx_get_one_raw(RAW, HIMAX_LPWUG_ABS_NOISE, datalen); + + if (val > 0) { + E("%s %s: get rawdata fail!\n", HIMAX_LOG_TAG, + __func__); + snprintf(buf, sizeof(buf), "%s:get fail\n", __func__); + goto END_OUPUT; + } + + limit_val[0] = -9999; /* max */ + limit_val[1] = 9999; /* min */ + hx_findout_limit(RAW, limit_val, sz_mutual); + + memcpy(&g_sec_raw_buff->_lp_noise[0], &RAW[0], + sizeof(uint32_t) * ic_data->HX_TX_NUM * ic_data->HX_RX_NUM); + + RI("%s\n", __func__); + hx_print_frame(data, g_sec_raw_buff->_lp_noise); + +END_OUPUT: + if (val == 0) { + g_sec_raw_buff->f_ready_lp_noise = HX_RAWDATA_READY; + I("%s %s: ret val is ok!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%d,%d", limit_val[1], limit_val[0]); /*min,max */ + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + g_sec_raw_buff->f_ready_lp_noise = HX_RAWDATA_NOT_READY; + E("%s %s: ret val is fail!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + RI("Min=%d, Max=%d\n", limit_val[1], limit_val[0]); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) + sec_cmd_set_cmd_result_all(sec, buf, strnlen(buf, sizeof(buf)), "LP_NOISE"); + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); + kfree(RAW); + himax_int_enable(1); +} + +extern int hx_set_stack_raw(int set_val); +static void run_snr_non_touched(void *dev_data) +{ + int ret = 1; + char buf[LEN_RSLT] = { 0 }; + uint8_t tmp_addr[4] = {0x30, 0x7F, 0x00, 0x10}; + uint8_t send_data[4] = {0x00, 0x00, 0x5A, 0xA5}; + uint8_t recv_data[4] = {0xFF, 0xFF, 0xFF, 0xFF}; + uint8_t retry_cnt = 0; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + + sec_cmd_set_default_result(sec); + + if (sec->cmd_param[0] <= 0 || sec->cmd_param[0] > 1000) { + E("%s: frame is out of range[%d]\n", __func__, sec->cmd_param[0]); + ret = 0; + goto err_frame_data; + } + + send_data[1] = (sec->cmd_param[0] >> 8) & 0xFF; + send_data[0] = sec->cmd_param[0] & 0xFF; + + I("%s: send data = %02X%02X%02X%02X\n", __func__, send_data[3], send_data[2], send_data[1], send_data[0]); + + do { + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, send_data, 0); + usleep_range(1000, 1100); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, recv_data, 0); + retry_cnt++; + } while ((send_data[3] != recv_data[3] || + send_data[2] != recv_data[2] || + send_data[1] != recv_data[1] || + send_data[0] != recv_data[0]) && retry_cnt < HIMAX_REG_RETRY_TIMES); + + if (retry_cnt >= HIMAX_REG_RETRY_TIMES) { + E("%s: write cmd fail %02X%02X%02X%02X\n", __func__, + recv_data[3], recv_data[2], recv_data[1], recv_data[0]); + ret = 0; + goto err_frame_data; + } + + sec->cmd_state = SEC_CMD_STATUS_WAITING; + + retry_cnt = 0; + while (retry_cnt++ < 100) { + usleep_range(100000, 100100); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, recv_data, 0); + if (recv_data[3] != 0xA5 && recv_data[2] != 0x5A) + break; + } + + I("%s: retry cnt = %d, %02X, %02X\n", __func__, retry_cnt, recv_data[3], recv_data[2]); + + if (recv_data[3] == 0xA7 && recv_data[2] == 0x7A) { + I("%s: get data success\n", __func__); + ret = 1; + } else if (recv_data[3] == 0xA9 && recv_data[2] == 0x9A) { + I("%s: get data fail\n", __func__); + ret = 0; + } else { + I("%s: unknow status\n", __func__); + ret = 0; + } + + retry_cnt = 0; + send_data[3] = 0x00; + send_data[2] = 0x00; + send_data[1] = 0x00; + send_data[0] = 0x00; + do { + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, send_data, 0); + usleep_range(1000, 1100); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, recv_data, 0); + retry_cnt++; + } while ((send_data[3] != recv_data[3] || + send_data[2] != recv_data[2] || + send_data[1] != recv_data[1] || + send_data[0] != recv_data[0]) && retry_cnt < HIMAX_REG_RETRY_TIMES); + + if (retry_cnt >= HIMAX_REG_RETRY_TIMES) { + E("%s: write back zero fail %02X%02X%02X%02X\n", __func__, + recv_data[3], recv_data[2], recv_data[1], recv_data[0]); + } + +err_frame_data: + if (ret == 1) { + sec->cmd_state = SEC_CMD_STATUS_OK; + snprintf(buf, sizeof(buf), "%s", "OK"); + } else { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "%s", "NG"); + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec_cmd_set_cmd_exit(sec); + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static void run_snr_touched(void *dev_data) +{ + int ret = 1; + char buf[LEN_RSLT] = { 0 }; + uint8_t tmp_addr[4] = {0x30, 0x7F, 0x00, 0x10}; + uint8_t send_data[4] = {0x00, 0x00, 0x3A, 0xA3}; + uint8_t recv_data[4] = {0xFF, 0xFF, 0xFF, 0xFF}; + uint8_t retry_cnt = 0; + int result[19] = {0}; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + + sec_cmd_set_default_result(sec); + + if (sec->cmd_param[0] <= 0 || sec->cmd_param[0] > 1000) { + E("%s: frame is out of range[%d]\n", __func__, sec->cmd_param[0]); + ret = 0; + goto err_frame_data; + } + + send_data[1] = (sec->cmd_param[0] >> 8) & 0xFF; + send_data[0] = sec->cmd_param[0] & 0xFF; + + I("%s: send data = %02X%02X%02X%02X\n", __func__, send_data[3], send_data[2], send_data[1], send_data[0]); + + do { + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, send_data, 0); + usleep_range(1000, 1100); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, recv_data, 0); + retry_cnt++; + } while ((send_data[3] != recv_data[3] || + send_data[2] != recv_data[2] || + send_data[1] != recv_data[1] || + send_data[0] != recv_data[0]) && retry_cnt < HIMAX_REG_RETRY_TIMES); + + if (retry_cnt >= HIMAX_REG_RETRY_TIMES) { + E("%s: write cmd fail %02X%02X%02X%02X\n", __func__, + recv_data[3], recv_data[2], recv_data[1], recv_data[0]); + ret = 0; + goto err_frame_data; + } + + sec->cmd_state = SEC_CMD_STATUS_WAITING; + + hx_set_stack_raw(6); + + retry_cnt = 0; + while (retry_cnt++ < 100) { + usleep_range(100000, 100100); + memcpy(result, diag_mutual, sizeof(int) * 19); + result[0] = result[0] & 0xFFFF; + if (result[0] == 0xA77A || result[0] == 0xA99A) + break; + } + + I("%s: retry cnt = %d, %08X\n", __func__, retry_cnt, result[0]); + + if (result[0] == 0xA77A) { + I("%s: get data success\n", __func__); + ret = 1; + } else if (result[0] == 0xA99A) { + E("%s: get data fail\n", __func__); + ret = 0; + } else { + E("%s: unknow status\n", __func__); + ret = 0; + } + + hx_set_stack_raw(0); + + retry_cnt = 0; + send_data[3] = 0x00; + send_data[2] = 0x00; + send_data[1] = 0x00; + send_data[0] = 0x00; + do { + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, send_data, 0); + usleep_range(1000, 1100); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, recv_data, 0); + retry_cnt++; + } while ((send_data[3] != recv_data[3] || + send_data[2] != recv_data[2] || + send_data[1] != recv_data[1] || + send_data[0] != recv_data[0]) && retry_cnt < HIMAX_REG_RETRY_TIMES); + + if (retry_cnt >= HIMAX_REG_RETRY_TIMES) { + E("%s: write back zero fail %02X%02X%02X%02X\n", __func__, + recv_data[3], recv_data[2], recv_data[1], recv_data[0]); + } + +err_frame_data: + if (ret == 1) { + sec->cmd_state = SEC_CMD_STATUS_OK; + snprintf(buf, sizeof(buf), "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", + result[1], (result[2] >> 8) & 0xFF, (result[2]) & 0xFF, + result[3], (result[4] >> 8) & 0xFF, (result[4]) & 0xFF, + result[5], (result[6] >> 8) & 0xFF, (result[6]) & 0xFF, + result[7], (result[8] >> 8) & 0xFF, (result[8]) & 0xFF, + result[9], (result[10] >> 8) & 0xFF, (result[10]) & 0xFF, + result[11], (result[12] >> 8) & 0xFF, (result[12]) & 0xFF, + result[13], (result[14] >> 8) & 0xFF, (result[14]) & 0xFF, + result[15], (result[16] >> 8) & 0xFF, (result[16]) & 0xFF, + result[17], (result[18] >> 8) & 0xFF, (result[18]) & 0xFF); + } else { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "%s", "NG"); + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec_cmd_set_cmd_exit(sec); + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} + +static int hx_gap_hor_raw(int test_type, uint32_t *raw, int *result_raw) +{ + int rx_num = ic_data->HX_RX_NUM; + int tx_num = ic_data->HX_TX_NUM; + int tmp_start = 0; + int tmp_end_idx = 0; + int i_partial = 0; + int i = 0; + int now_part = 0; + int ret_val = NO_ERR; + int *tmp_result_raw; + int idx_assign = 0; + int skip_flag = 0; + int rslt_buf_size = ic_data->HX_TX_NUM * (ic_data->HX_RX_NUM - g_gap_horizontal_partial); + + himax_gap_test_horizontal_setting(); + if (g_ts_dbg != 0) { + I("Print Horizontal ORG RAW\n"); + for (i = 0; i < tx_num * rx_num; i++) { + printk("%04d,", raw[i]); + if (i > 0 && i % rx_num == (rx_num - 1)) + I("\n"); + } + } + tmp_result_raw = kzalloc(sizeof(int) * rx_num * tx_num, GFP_KERNEL); + if (!tmp_result_raw) { + kfree(g_gap_horizontal_part); + return -ENOMEM; + } + + for (i_partial = 0; i_partial < g_gap_horizontal_partial; i_partial++) { + tmp_start = g_gap_horizontal_part[i_partial]; + if (i_partial+1 == g_gap_horizontal_partial) { + tmp_end_idx = rx_num - g_gap_horizontal_part[i_partial]; + } else { + tmp_end_idx = g_gap_horizontal_part[i_partial+1] - g_gap_horizontal_part[i_partial]; + } + if (i_partial % 2 == 0) { + himax_cal_gap_data_horizontal(tmp_start, tmp_end_idx, 0, raw, tmp_result_raw); + } else { + himax_cal_gap_data_horizontal(tmp_start, tmp_end_idx, 1, raw, tmp_result_raw); + } + } + + RI("%s\n", __func__); + hx_print_frame(private_ts, tmp_result_raw); + + for (i = 0; i < tx_num*rx_num && idx_assign < rslt_buf_size; i++) { + /* + printk("%4d,", tmp_result_raw[i]); + if (i > 0 && i%rx_num == (rx_num-1)) + I("\n"); + */ + /* difference that it is in which one part now + even part : the first column is all zero in this part + odd part : the last column is all zero in this part + */ + /* the now part will be known in odd or even */ + now_part = (i % rx_num) / (rx_num / g_gap_horizontal_partial); + if (now_part % 2 == 0) { + /*even part + using index i to know is in which TX + if i is in the starting column of even part it will need to skip*/ + if (i % rx_num == g_gap_horizontal_part[now_part]) { + skip_flag = 1; + } + } else { + /*odd part + using index i to know is is in which TX + if i is in the last column of odd part it will need to skip*/ + if ((i % rx_num) == (g_gap_horizontal_part[now_part] + rx_num / g_gap_horizontal_partial - 1)) { + skip_flag = 1; + } + } + if (skip_flag == 1) { + skip_flag = 0; + continue; + } else { + skip_flag = 0; + result_raw[idx_assign++] = tmp_result_raw[i]; + } + } + + kfree(g_gap_horizontal_part); + kfree(tmp_result_raw); + return ret_val; +} + +static void get_gap_data_y(void *dev_data) +{ + int val = 0; + char buf[LEN_RSLT] = { 0 }; + int limit_val[2] = { 0 }; /* 0: max, 1: min */ + int sz_mutual = ic_data->HX_TX_NUM * (ic_data->HX_RX_NUM - g_gap_horizontal_partial); + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + + himax_int_enable(0); + if (g_sec_raw_buff->f_ready_rawdata != HX_RAWDATA_READY) { + E("%s %s: need get rawcap firstly\n", HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s:need get rawcap firstly", __func__); + val = HX_RAW_NOT_READY; + goto END_OUPUT; + } + + val = hx_gap_hor_raw(HIMAX_GAPTEST_RAW, g_sec_raw_buff->_rawdata, + g_sec_raw_buff->_gap_hor); + if (val < 0) { + E("%s %s: failed to get gap Y\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "failed to get gap Y"); + goto END_OUPUT; + } + + limit_val[0] = -9999; /* max */ + limit_val[1] = 9999; /* min */ + hx_findout_limit(g_sec_raw_buff->_gap_hor, limit_val, sz_mutual); + +END_OUPUT: + if (val == 0) { + g_sec_raw_buff->f_ready_gap_hor = HX_RAWDATA_READY; + I("%s %s: ret val is ok!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%d,%d", limit_val[1], limit_val[0]); /*min,max */ + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + g_sec_raw_buff->f_ready_gap_hor = HX_RAWDATA_NOT_READY; + E("%s %s: ret val is fail!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + I("Min=%d, Max=%d\n", limit_val[1], limit_val[0]); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) + sec_cmd_set_cmd_result_all(sec, buf, strnlen(buf, sizeof(buf)), "RAW_GAP_Y"); + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); + himax_int_enable(1); +} + +static void get_gap_y_all(void *dev_data) +{ + char temp[SEC_CMD_STR_LEN] = { 0 }; + char *buf = NULL; + int i = 0; + char msg[SEC_CMD_STR_LEN] = { 0 }; + int sz_mutual = ic_data->HX_TX_NUM * (ic_data->HX_RX_NUM - g_gap_horizontal_partial); + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + get_gap_data_y(sec); + + sec_cmd_set_default_result(sec); + + if (g_sec_raw_buff->f_ready_gap_hor != HX_RAWDATA_READY) { + E("%s Need to get rawdata first!\n", HIMAX_LOG_TAG); + goto END_OUPUT; + } + + buf = kzalloc(sz_mutual * 10, GFP_KERNEL); + if (!buf) { + E("%s failed to allocate memory!\n", HIMAX_LOG_TAG); + goto END_OUPUT; + } + + for (i = 0; i < sz_mutual; i++) { + if (i != (sz_mutual - 1)) { + snprintf(msg, SEC_CMD_STR_LEN, "%d,", (int)g_sec_raw_buff->_gap_hor[i]); + strncat(buf, msg, SEC_CMD_STR_LEN); + } else { + snprintf(msg, SEC_CMD_STR_LEN, "%d", (int)g_sec_raw_buff->_gap_hor[i]); + strncat(buf, msg, SEC_CMD_STR_LEN); + } + + } + + sec->cmd_state = SEC_CMD_STATUS_OK; + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sz_mutual * 10)); + + kfree(buf); + return; +END_OUPUT: + snprintf(temp, SEC_CMD_STR_LEN, "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + sec_cmd_set_cmd_result(sec, temp, strnlen(temp, SEC_CMD_STR_LEN)); +} + +static int hx_gap_ver_raw(int test_type, uint32_t *org_raw, int *result_raw) +{ + int i_partial = 0; + int tmp_start = 0; + int tmp_end_idx = 0; + int i = 0; + int now_part = 0; + int ret_val = NO_ERR; + int tx_num = ic_data->HX_TX_NUM; + int rx_num = ic_data->HX_RX_NUM; + int *tmp_result_raw; + int idx_assign = 0; + int skip_flag = 0; + int rslt_buf_size = (ic_data->HX_TX_NUM - g_gap_vertical_partial) * ic_data->HX_RX_NUM; + + himax_gap_test_vertical_setting(); + if (g_ts_dbg != 0) { + I("Print vertical ORG RAW\n"); + for (i = 0; i < tx_num * rx_num; i++) { + printk("%04d,", org_raw[i]); + if (i > 0 && i % rx_num == (rx_num - 1)) + I("\n"); + } + } + + tmp_result_raw = kzalloc(sizeof(int) * rx_num * tx_num, GFP_KERNEL); + if (!tmp_result_raw) { + kfree(g_gap_vertical_part); + return -ENOMEM; + } + + for (i_partial = 0; i_partial < g_gap_vertical_partial; i_partial++) { + tmp_start = g_gap_vertical_part[i_partial] * rx_num; + if (i_partial + 1 == g_gap_vertical_partial) { + tmp_end_idx = tx_num - g_gap_vertical_part[i_partial]; + } else { + tmp_end_idx = g_gap_vertical_part[i_partial + 1] - g_gap_vertical_part[i_partial]; + } + if (i_partial % 2 == 0) { + himax_cal_gap_data_vertical(tmp_start, tmp_end_idx, 0, org_raw, tmp_result_raw); + } else { + himax_cal_gap_data_vertical(tmp_start, tmp_end_idx, 1, org_raw, tmp_result_raw); + } + } + + RI("%s\n", __func__); + hx_print_frame(private_ts, tmp_result_raw); + + for (i = 0; i < tx_num * rx_num && idx_assign < rslt_buf_size; i++) { + /* + printk("%4d,", tmp_result_raw[i]); + if (i > 0 && i%rx_num == (rx_num-1)) + I("\n"); + */ + /* difference that it is in which one part now + even part : the first line is all zero in this part + odd part : the last line is all zero in this part + */ + /* the now part will be known in odd or even */ + now_part = (i / rx_num) / (tx_num / g_gap_vertical_partial); + if (now_part % 2 == 1) { + /*odd part + using index i to know is in which TX + if i is in the starting line of odd part it will need to skip*/ + if ((i / rx_num) == (g_gap_vertical_part[now_part] + (tx_num / g_gap_vertical_partial) - 1)) + skip_flag = 1; + } else { + /*even part + using index i to know is in which TX + if i is in the last line of even part it will need to skip*/ + if ((i / rx_num) == g_gap_vertical_part[now_part]) { + skip_flag = 1; + } + } + /* If skip_flag is set to 1, it show that it is in the all zero line.. + We don't need to assign this all zero line's vlaue into result buffer.. + */ + if (skip_flag == 1) { + skip_flag = 0; + continue; + } else { + skip_flag = 0; + result_raw[idx_assign++] = tmp_result_raw[i]; + } + } + + kfree(g_gap_vertical_part); + kfree(tmp_result_raw); + return ret_val; +} + +static void get_gap_data_x(void *dev_data) +{ + int val = 0; + char buf[LEN_RSLT] = { 0 }; + int limit_val[2] = { 0 }; /* 0: max, 1: min */ + int sz_mutual = (ic_data->HX_TX_NUM - g_gap_vertical_partial) * ic_data->HX_RX_NUM; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + sec_cmd_set_default_result(sec); + + himax_int_enable(0); + if (g_sec_raw_buff->f_ready_rawdata != HX_RAWDATA_READY) { + E("%s %s: need get rawcap firstly\n", HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s:need get rawcap firstly", __func__); + val = HX_RAW_NOT_READY; + goto END_OUPUT; + } + + val = hx_gap_ver_raw(HIMAX_GAPTEST_RAW, g_sec_raw_buff->_rawdata, + g_sec_raw_buff->_gap_ver); + if (val < 0) { + E("%s %s: failed to get gap X\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "failed to get gap X"); + goto END_OUPUT; + } + + limit_val[0] = -9999; /* max */ + limit_val[1] = 9999; /* min */ + hx_findout_limit(g_sec_raw_buff->_gap_ver, limit_val, sz_mutual); + +END_OUPUT: + if (val == 0) { + g_sec_raw_buff->f_ready_gap_ver = HX_RAWDATA_READY; + I("%s %s: ret val is ok!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%d,%d", limit_val[1], limit_val[0]); /*min,max */ + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + g_sec_raw_buff->f_ready_gap_ver = HX_RAWDATA_NOT_READY; + E("%s %s: ret val is fail!\n", + HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + I("Min=%d, Max=%d\n", limit_val[1], limit_val[0]); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) + sec_cmd_set_cmd_result_all(sec, buf, strnlen(buf, sizeof(buf)), "RAW_GAP_X"); + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); + himax_int_enable(1); +} + +static void get_gap_x_all(void *dev_data) +{ + char temp[SEC_CMD_STR_LEN] = { 0 }; + char *buf = NULL; + int i = 0; + char msg[SEC_CMD_STR_LEN] = { 0 }; + int sz_mutual = (ic_data->HX_TX_NUM - g_gap_vertical_partial) * ic_data->HX_RX_NUM; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + /*struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec);*/ + + get_gap_data_x(sec); + + sec_cmd_set_default_result(sec); + + if (g_sec_raw_buff->f_ready_gap_ver != HX_RAWDATA_READY) { + E("%s Need to get rawdata first!\n", HIMAX_LOG_TAG); + goto END_OUPUT; + } + + buf = kzalloc(sz_mutual * 10, GFP_KERNEL); + if (!buf) { + E("%s failed to allocate memory!\n", HIMAX_LOG_TAG); + goto END_OUPUT; + } + + for (i = 0; i < sz_mutual; i++) { + if (i != (sz_mutual - 1)) { + snprintf(msg, SEC_CMD_STR_LEN, "%d,", (int)g_sec_raw_buff->_gap_ver[i]); + strncat(buf, msg, SEC_CMD_STR_LEN); + } else { + snprintf(msg, SEC_CMD_STR_LEN, "%d", (int)g_sec_raw_buff->_gap_ver[i]); + strncat(buf, msg, SEC_CMD_STR_LEN); + } + + } + + sec->cmd_state = SEC_CMD_STATUS_OK; + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sz_mutual * 10)); + + kfree(buf); + return; +END_OUPUT: + snprintf(temp, SEC_CMD_STR_LEN, "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + sec_cmd_set_cmd_result(sec, temp, strnlen(temp, SEC_CMD_STR_LEN)); +} + +#ifdef HX_HIGH_SENSE +static void glove_mode(void *dev_data) +{ + char buf[LEN_RSLT] = { 0 }; + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct himax_ts_data *data = + container_of(sec, struct himax_ts_data, sec); + + sec_cmd_set_default_result(sec); + I("%s %s,%d\n", HIMAX_LOG_TAG, + __func__, sec->cmd_param[0]); + + data->glove_enabled = sec->cmd_param[0]; + + if (data->suspended) { + E("%s %s: now IC status is not STATE_POWER_ON\n", HIMAX_LOG_TAG, __func__); + snprintf(buf, sizeof(buf), "%s", "TSP_turned_off"); + sec->cmd_state = SEC_CMD_STATUS_NOT_APPLICABLE; + goto out; + } + + switch (sec->cmd_param[0]) { + case 0: + sec->cmd_state = SEC_CMD_STATUS_OK; + I("%s %s(), Unset Glove Mode\n", HIMAX_LOG_TAG, + __func__); + g_core_fp.fp_set_HSEN_enable(0, false); + break; + case 1: + sec->cmd_state = SEC_CMD_STATUS_OK; + I("%s %s(), Set Glove Mode\n", HIMAX_LOG_TAG, + __func__); + g_core_fp.fp_set_HSEN_enable(1, false); + break; + default: + sec->cmd_state = SEC_CMD_STATUS_FAIL; + I("%s %s(), Invalid Argument\n", HIMAX_LOG_TAG, + __func__); + break; + } + + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buf, sizeof(buf), "%s", "OK"); + else + snprintf(buf, sizeof(buf), "%s", "NG"); +out: + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec_cmd_set_cmd_exit(sec); + + I("%s %s: %s(%d)\n", HIMAX_LOG_TAG, + __func__, buf, (int)strnlen(buf, sizeof(buf))); +} +#else +static void glove_mode(void *dev_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct himax_ts_data *data = container_of(sec, struct himax_ts_data, sec); + char buf[SEC_CMD_STR_LEN] = { 0 }; + int ret = -EINVAL; + + sec_cmd_set_default_result(sec); + I("%s %s,%d\n", HIMAX_LOG_TAG, + __func__, sec->cmd_param[0]); + + switch (sec->cmd_param[0]) { + case 0: + data->glove_enabled = 0; + I("%s: Unset High Sensitivity Mode\n", __func__); + ret = himax_set_ap_change_mode(HIGH_SENSITIVITY_MODE, 0); + break; + case 1: + data->glove_enabled = 1; + I("%s: Set High Sensitivity Mode\n", __func__); + ret = himax_set_ap_change_mode(HIGH_SENSITIVITY_MODE, 1); + break; + default: + I("%s: Invalid Argument\n", __func__); + break; + } + + if (ret) { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "NG"); + } else { + sec->cmd_state = SEC_CMD_STATUS_OK; + snprintf(buf, sizeof(buf), "OK"); + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec_cmd_set_cmd_exit(sec); + + I("%s: %s\n", __func__, buf); +} + +#endif + +#ifdef HX_SMART_WAKEUP +static void aot_enable(void *dev_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct himax_ts_data *ts = container_of(sec, struct himax_ts_data, sec); + char buf[16] = { 0 }; + + sec_cmd_set_default_result(sec); + + switch (sec->cmd_param[0]) { + case 0: + sec->cmd_state = SEC_CMD_STATUS_OK; + I("%s: Unset AOT Mode\n", __func__); + ts->gesture_cust_en[0] = 0; + ts->SMWP_enable = 0; + ts->aot_enabled = 0; + g_core_fp.fp_set_SMWP_enable(ts->SMWP_enable, ts->suspended); + break; + case 1: + sec->cmd_state = SEC_CMD_STATUS_OK; + I("%s: Set AOT Mode\n", __func__); + ts->gesture_cust_en[0] = 1; + ts->SMWP_enable = 1; + ts->aot_enabled = 1; + g_core_fp.fp_set_SMWP_enable(ts->SMWP_enable, ts->suspended); + break; + default: + sec->cmd_state = SEC_CMD_STATUS_FAIL; + I("%s: Invalid Argument\n", __func__); + break; + } + + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buf, sizeof(buf), "OK"); + else + snprintf(buf, sizeof(buf), "NG"); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec_cmd_set_cmd_exit(sec); + + I("%s %s: %s\n", HIMAX_LOG_TAG, __func__, buf); +} +#endif + +int himax_set_ap_change_mode(int mode, int enable) +{ + char tmp_addr[4] = {0xE8, 0x7F, 0x00, 0x10}; + char send_data[4] = {0}; + char recv_data[4] = {0xFF, 0xFF, 0xFF, 0xFF}; + char retry_cnt = 0; + int ret = 1; + + switch (mode) { + case GAME_MODE: + tmp_addr[0] = 0xE0; + break; + case NOTE_MODE: + tmp_addr[0] = 0xE8; + break; + case SIP_MODE: + tmp_addr[0] = 0x34; + break; + case HIGH_SENSITIVITY_MODE: + tmp_addr[0] = 0x14; + break; + default: + I("%s: Invalid Mode\n", __func__); + return ret; + } + + if (enable) { + send_data[3] = 0xA5; + send_data[2] = 0x5A; + send_data[1] = 0xA5; + send_data[0] = 0x5A; + } else { + send_data[3] = 0x00; + send_data[2] = 0x00; + send_data[1] = 0x00; + send_data[0] = 0x00; + } + + do { + g_core_fp.fp_register_write(tmp_addr, DATA_LEN_4, send_data, 0); + usleep_range(1000, 1100); + g_core_fp.fp_register_read(tmp_addr, DATA_LEN_4, recv_data, 0); + retry_cnt++; + } while ((send_data[3] != recv_data[3] || + send_data[2] != recv_data[2] || + send_data[1] != recv_data[1] || + send_data[0] != recv_data[0]) && retry_cnt < HIMAX_REG_RETRY_TIMES); + + if (retry_cnt >= HIMAX_REG_RETRY_TIMES) + ret = 1; + else + ret = 0; + + I("%s: mode:%d %s %s\n", __func__, mode,enable ? "enable" : "disable", + ret ? "failed" : "succeed"); + + return ret; +} +EXPORT_SYMBOL(himax_set_ap_change_mode); + +static void set_game_mode(void *dev_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + char buf[16] = {0}; + int ret = -EINVAL; + + sec_cmd_set_default_result(sec); + + switch (sec->cmd_param[0]) { + case 0: + I("%s: Unset Game Mode\n", __func__); + ret = himax_set_ap_change_mode(GAME_MODE, 0); + break; + case 1: + I("%s: Set Game Mode\n", __func__); + ret = himax_set_ap_change_mode(GAME_MODE, 1); + break; + default: + I("%s: Invalid Argument\n", __func__); + break; + } + + if (ret) { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "NG"); + } else { + sec->cmd_state = SEC_CMD_STATUS_OK; + snprintf(buf, sizeof(buf), "OK"); + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec_cmd_set_cmd_exit(sec); + + I("%s: %s\n", __func__, buf); +} + +static void set_note_mode(void *dev_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + char buf[16] = {0}; + int ret = -EINVAL; + + sec_cmd_set_default_result(sec); + + switch (sec->cmd_param[0]) { + case 0: + I("%s: Unset Note Mode\n", __func__); + ret = himax_set_ap_change_mode(NOTE_MODE, 0); + break; + case 1: + I("%s: Set Note Mode\n", __func__); + ret = himax_set_ap_change_mode(NOTE_MODE, 1); + break; + default: + I("%s: Invalid Argument\n", __func__); + break; + } + + if (ret) { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "NG"); + } else { + sec->cmd_state = SEC_CMD_STATUS_OK; + snprintf(buf, sizeof(buf), "OK"); + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec_cmd_set_cmd_exit(sec); + + I("%s: %s\n", __func__, buf); +} + +static void set_sip_mode(void *dev_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + char buf[SEC_CMD_STR_LEN] = { 0 }; + int ret = -EINVAL; + + sec_cmd_set_default_result(sec); + + switch (sec->cmd_param[0]) { + case 0: + I("%s: Unset SIP Mode\n", __func__); + ret = himax_set_ap_change_mode(SIP_MODE, 0); + break; + case 1: + I("%s: Set SIP Mode\n", __func__); + ret = himax_set_ap_change_mode(SIP_MODE, 1); + break; + default: + I("%s: Invalid Argument\n", __func__); + break; + } + + if (ret) { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buf, sizeof(buf), "NG"); + } else { + sec->cmd_state = SEC_CMD_STATUS_OK; + snprintf(buf, sizeof(buf), "OK"); + } + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec_cmd_set_cmd_exit(sec); + + I("%s: %s\n", __func__, buf); +} + +static void himax_set_cover_mode(struct himax_ts_data *ts, bool closed) +{ + u8 tmp_addr[4] = { 0 }; + u8 sdata[4] = { 0 }; + int ret; + + if (atomic_read(&ts->suspend_mode) == HIMAX_STATE_POWER_OFF) { + E("%s: %s, but IC is powered off\n", __func__, closed ? "on" : "off"); + return; + } + + himax_in_parse_assign_cmd(fw_addr_ctrl_fw, tmp_addr, sizeof(tmp_addr)); + + if (closed) + sdata[0] = 0xC1; + else + sdata[0] = 0xC0; + + I("%s: %s\n", __func__, closed ? "on" : "off"); + + ret = g_core_fp.fp_register_write(tmp_addr, sizeof(sdata), sdata, 0); + if (ret < 0) + E("%s: failed to write cover mode\n", __func__); +} + +static void clear_cover_mode(void *dev_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct himax_ts_data *ts = container_of(sec, struct himax_ts_data, sec); + char buf[16] = {0}; + + sec_cmd_set_default_result(sec); + +#if IS_ENABLED(CONFIG_SEC_FACTORY) + I("%s: skip for factory binary\n", __func__); + sec->cmd_state = SEC_CMD_STATUS_OK; + snprintf(buf, sizeof(buf), "%s", "OK"); + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec_cmd_set_cmd_exit(sec); + return; +#endif + + mutex_lock(&ts->device_lock); + switch (sec->cmd_param[0]) { + case 0: + case 1: + ts->cover_closed = false; + sec->cmd_state = SEC_CMD_STATUS_OK; + I("%s: Cover mode off\n", __func__); + himax_set_cover_mode(ts, ts->cover_closed); + break; + case 3: + ts->cover_closed = true; + sec->cmd_state = SEC_CMD_STATUS_OK; + I("%s: Cover mode on\n", __func__); + himax_set_cover_mode(ts, ts->cover_closed); + break; + default: + sec->cmd_state = SEC_CMD_STATUS_FAIL; + I("%s: Invalid Argument\n", __func__); + break; + } + + mutex_unlock(&ts->device_lock); + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buf, sizeof(buf), "%s", "OK"); + else + snprintf(buf, sizeof(buf), "%s", "NG"); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec_cmd_set_cmd_exit(sec); + + I("%s: %s\n", __func__, buf); +} + +static void scan_block(void *dev_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + char buf[SEC_CMD_STR_LEN] = {0}; + + sec_cmd_set_default_result(sec); + + switch (sec->cmd_param[0]) { + case 0: + sec->cmd_state = SEC_CMD_STATUS_OK; + I("%s: Sense on\n", __func__); + g_core_fp.fp_sense_on(0x01); + break; + case 1: + sec->cmd_state = SEC_CMD_STATUS_OK; + I("%s: Sense off\n", __func__); + g_core_fp.fp_sense_off(true); + break; + default: + sec->cmd_state = SEC_CMD_STATUS_FAIL; + I("%s: Invalid Argument\n", __func__); + break; + } + + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buf, sizeof(buf), "%s", "OK"); + else + snprintf(buf, sizeof(buf), "%s", "NG"); + + sec_cmd_set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec_cmd_set_cmd_exit(sec); + + I("%s: %s\n", __func__, buf); +} + +static void factory_cmd_result_all(void *dev_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)dev_data; + struct himax_ts_data *data = container_of(sec, struct himax_ts_data, sec); + + mutex_lock(&data->device_lock); + memset(sec->cmd_result_all, 0x00, SEC_CMD_RESULT_STR_LEN); + + sec->cmd_all_factory_state = SEC_CMD_STATUS_RUNNING; + + get_chip_vendor(sec); + get_chip_name(sec); + get_fw_ver_bin(sec); + get_fw_ver_ic(sec); + + get_rawcap(sec); + get_gap_data_x(sec); + get_gap_data_y(sec); + get_open(sec); + get_mic_open(sec); + get_short(sec); + get_noise(sec); + /*get_lp_rawcap(sec);*/ + /*get_lp_noise(sec);*/ + + sec->cmd_all_factory_state = SEC_CMD_STATUS_OK; + RI("%s %s: %d%s\n", HIMAX_LOG_TAG, + __func__, sec->item_count, sec->cmd_result_all); + mutex_unlock(&data->device_lock); +} + +static ssize_t show_close_tsp_test(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, FACTORY_BUF_SIZE, "%u\n", 0); +} + +struct sec_cmd sec_cmds[] = { + {SEC_CMD("check_connection", check_connection),}, + {SEC_CMD("fw_update", fw_update),}, + {SEC_CMD("get_fw_ver_bin", get_fw_ver_bin),}, + {SEC_CMD("get_fw_ver_ic", get_fw_ver_ic),}, + {SEC_CMD("get_config_ver", get_config_ver),}, + {SEC_CMD("get_checksum_data", get_checksum_data),}, + {SEC_CMD("get_crc_check", get_checksum_data),}, + {SEC_CMD("get_threshold", get_threshold),}, + {SEC_CMD("get_chip_vendor", get_chip_vendor),}, + {SEC_CMD("get_chip_name", get_chip_name),}, + {SEC_CMD("get_chip_id", get_chip_id),}, + {SEC_CMD("get_scr_x_num", get_scr_x_num),}, + {SEC_CMD("get_scr_y_num", get_scr_y_num),}, + {SEC_CMD("get_x_num", get_all_x_num),}, + {SEC_CMD("get_y_num", get_all_y_num),}, + {SEC_CMD("get_rawcap", get_rawcap),}, + {SEC_CMD("run_rawcap_all", get_rawcap_all),}, + {SEC_CMD("get_open", get_open),}, + {SEC_CMD("run_open_all", get_open_all),}, + {SEC_CMD("get_mic_open", get_mic_open),}, + {SEC_CMD("run_mic_open_all", get_mic_open_all),}, + {SEC_CMD("get_short", get_short),}, + {SEC_CMD("run_short_all", get_short_all),}, + {SEC_CMD("get_noise", get_noise),}, + {SEC_CMD("run_noise_all", get_noise_all),}, + {SEC_CMD("get_lp_rawcap", get_lp_rawcap),}, + {SEC_CMD("get_lp_noise", get_lp_noise),}, + {SEC_CMD("run_jitter_test", not_support_cmd),}, + {SEC_CMD("run_snr_non_touched", run_snr_non_touched),}, + {SEC_CMD("run_snr_touched", run_snr_touched),}, + {SEC_CMD("get_gap_data_x", get_gap_data_x),}, + {SEC_CMD("run_gap_x_all", get_gap_x_all),}, + {SEC_CMD("get_gap_data_y", get_gap_data_y),}, + {SEC_CMD("run_gap_y_all", get_gap_y_all),}, + {SEC_CMD("set_tsp_test_result", not_support_cmd),}, + {SEC_CMD("get_tsp_test_result", not_support_cmd),}, + {SEC_CMD("clear_tsp_test_result", not_support_cmd),}, + {SEC_CMD("dead_zone_enable", set_edge_mode),}, + {SEC_CMD("set_grip_data", set_grip_data),}, + {SEC_CMD("factory_cmd_result_all", factory_cmd_result_all),}, + {SEC_CMD("run_cs_raw_read_all", get_rawcap_all),}, + {SEC_CMD_H("glove_mode", glove_mode),}, +#ifdef HX_SMART_WAKEUP + {SEC_CMD_H("aot_enable", aot_enable),}, +#endif + {SEC_CMD_H("set_game_mode", set_game_mode),}, + {SEC_CMD_H("set_note_mode", set_note_mode),}, + {SEC_CMD("set_sip_mode", set_sip_mode),}, + {SEC_CMD_H("clear_cover_mode", clear_cover_mode),}, + {SEC_CMD_H("scan_block", scan_block),}, + {SEC_CMD("not_support_cmd", not_support_cmd),}, +}; + +void himax_run_rawdata_all(struct himax_ts_data *data) +{ + mutex_lock(&data->device_lock); + RI("%s\n", __func__); + get_rawcap(&data->sec); + mutex_unlock(&data->device_lock); +} + +/* sensitivity mode test */ +//extern int hx_set_stack_raw(int set_val); +static ssize_t sensitivity_mode_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int result[9] = { 0 }; + hx_sensity_test(result); + I("%s: %d,%d,%d,%d,%d,%d,%d,%d,%d\n", __func__, + result[0], result[1], result[2], + result[3], result[4], result[5], + result[6], result[7], result[8]); + return snprintf(buf, 256, "%d,%d,%d,%d,%d,%d,%d,%d,%d", + result[0], result[1], result[2], + result[3], result[4], result[5], + result[6], result[7], result[8]); +} + +static ssize_t sensitivity_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int mode; + + if (kstrtoint(buf, 10, &mode) < 0) { + E("%s %s kstrtoint fail\n", HIMAX_LOG_TAG, __func__); + return count; + } + + if (unlikely((mode != 0) && (mode != 1))) + return count; + + if (mode == 0) { + hx_set_stack_raw(0); // stop test + I("%s %sTurn off Sensitivity Measurement\n", + HIMAX_LOG_TAG, __func__); + } else { + hx_set_stack_raw(1); // start test + I("%s %sTurn on Sensitivity Measurement\n", + HIMAX_LOG_TAG, __func__); + } + + return count; +} + +/* + * read_support_feature function + * returns the bit combination of specific feature that is supported. + */ +static ssize_t read_support_feature(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct himax_ts_data *ts = container_of(sec, struct himax_ts_data, sec); + u32 feature = 0; + + if (ts->pdata->support_aot) + feature |= INPUT_FEATURE_ENABLE_SETTINGS_AOT; + + if (ts->pdata->enable_sysinput_enabled) + feature |= INPUT_FEATURE_ENABLE_SYSINPUT_ENABLED; + + input_info(true, ts->dev, "%s: %d%s%s\n", + __func__, feature, + feature & INPUT_FEATURE_ENABLE_SETTINGS_AOT ? " aot" : "", + feature & INPUT_FEATURE_ENABLE_SYSINPUT_ENABLED ? " SE" : ""); + + return snprintf(buf, SEC_CMD_BUF_SIZE, "%d", feature); +} + +static ssize_t prox_power_off_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct himax_ts_data *ts = container_of(sec, struct himax_ts_data, sec); + + input_info(true, ts->dev, "%s: %d\n", __func__, ts->prox_power_off); + + return snprintf(buf, SEC_CMD_BUF_SIZE, "%d", ts->prox_power_off); +} + +static ssize_t prox_power_off_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct himax_ts_data *ts = container_of(sec, struct himax_ts_data, sec); + int data; + int ret; + + ret = kstrtoint(buf, 10, &data); + if (ret < 0) + return ret; + + ts->prox_power_off = data; + + input_info(true, ts->dev, "%s: %d\n", __func__, ts->prox_power_off); + + return count; +} + +static ssize_t enabled_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct himax_ts_data *ts = container_of(sec, struct himax_ts_data, sec); + + input_info(true, ts->dev, "%s: %d\n", __func__, !ts->suspended); + + return snprintf(buf, SEC_CMD_BUF_SIZE, "%d", !ts->suspended); +} + +static ssize_t enabled_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct himax_ts_data *ts = container_of(sec, struct himax_ts_data, sec); + int buff[2]; + int ret; + + if (!ts->pdata->enable_sysinput_enabled) + return count; + + if (!ts->pdata->suspend || !ts->pdata->resume) { + input_err(true, ts->dev, "%s: suspend/resume function is not connected\n", __func__); + return count; + } + + ret = sscanf(buf, "%d,%d", &buff[0], &buff[1]); + if (ret != 2) { + input_err(true, ts->dev, + "%s: failed read params [%d]\n", __func__, ret); + return -EINVAL; + } + + input_info(true, ts->dev, "%s: %d %d\n", __func__, buff[0], buff[1]); + + if (buff[0] == LCD_ON || buff[0] == LCD_DOZE || buff[0] == LCD_DOZE_SUSPEND) { + if (buff[1] == LCD_EARLY_EVENT) { + if (ts->SMWP_enable) { + himax_ctrl_lcd_reset_regulator(ts, false); + } + } else if (buff[1] == LCD_LATE_EVENT) { + ts->pdata->resume(ts->dev); + } + } else if (buff[0] == LCD_OFF) { + if (buff[1] == LCD_EARLY_EVENT) { + ts->pdata->suspend(ts->dev); + } else if (buff[1] == LCD_LATE_EVENT) { + if (ts->SMWP_enable && ts->cover_closed) + himax_set_cover_mode(ts, ts->cover_closed); + } + } else if (buff[0] == SHUTDOWN) { +#ifdef HX_RST_PIN_FUNC + if (gpio_is_valid(ts->pdata->gpio_reset)) { + disable_irq(ts->hx_irq); + gpio_set_value(ts->pdata->gpio_reset, 0); + I("%s make TP_RESET LOW\n", __func__); + } +#endif + } + + return count; +} +static DEVICE_ATTR(sensitivity_mode, S_IRUGO | S_IWUSR | S_IWGRP, + sensitivity_mode_show, sensitivity_mode_store); +static DEVICE_ATTR(close_tsp_test, S_IRUGO, show_close_tsp_test, NULL); +static DEVICE_ATTR(support_feature, 0444, read_support_feature, NULL); +static DEVICE_ATTR(prox_power_off, 0644, prox_power_off_show, prox_power_off_store); +static DEVICE_ATTR(enabled, 0664, enabled_show, enabled_store); + +static struct attribute *sec_touch_factory_attributes[] = { + &dev_attr_sensitivity_mode.attr, + &dev_attr_close_tsp_test.attr, + &dev_attr_support_feature.attr, + &dev_attr_prox_power_off.attr, + &dev_attr_enabled.attr, + NULL, +}; + +static struct attribute_group sec_touch_factory_attr_group = { + .attrs = sec_touch_factory_attributes, +}; + +int sec_touch_sysfs(struct himax_ts_data *data) +{ + int ret; + + /* /sys/class/sec/tsp */ + ret = sec_cmd_init(&data->sec, sec_cmds, + ARRAY_SIZE(sec_cmds), SEC_CLASS_DEVT_TSP); + if (ret < 0) { + E("%s %s Failed to create device (tsp)!\n", + HIMAX_LOG_TAG, __func__); + goto err_init_cmd; + } + + data->sec.wait_cmd_result_done = true; + + ret = sysfs_create_link(&data->sec.fac_dev->kobj, + &data->input_dev->dev.kobj, "input"); + if (ret < 0) + E("%s %s: Failed to create input symbolic link\n", + HIMAX_LOG_TAG, __func__); + + /* /sys/class/sec/tsp/... */ + if (sysfs_create_group + (&data->sec.fac_dev->kobj, &sec_touch_factory_attr_group)) { + E("%s %sFailed to create sysfs group(tsp)!\n", + HIMAX_LOG_TAG, __func__); + goto err_sec_fac_dev_attr; + } + + I("Now init rawdata buffs\n"); + g_sec_raw_buff = kzalloc(sizeof(struct sec_rawdata_buffs), GFP_KERNEL); + g_sec_raw_buff->_rawdata = + kzalloc(sizeof(uint32_t) * ic_data->HX_TX_NUM * ic_data->HX_RX_NUM, + GFP_KERNEL); + g_sec_raw_buff->_open = + kzalloc(sizeof(uint32_t) * ic_data->HX_TX_NUM * ic_data->HX_RX_NUM, + GFP_KERNEL); + g_sec_raw_buff->_mopen = + kzalloc(sizeof(uint32_t) * ic_data->HX_TX_NUM * ic_data->HX_RX_NUM, + GFP_KERNEL); + g_sec_raw_buff->_short = + kzalloc(sizeof(uint32_t) * ic_data->HX_TX_NUM * ic_data->HX_RX_NUM, + GFP_KERNEL); + g_sec_raw_buff->_noise = + kzalloc(sizeof(int) * ic_data->HX_TX_NUM * ic_data->HX_RX_NUM, + GFP_KERNEL); + g_sec_raw_buff->_lp_rawdata = + kzalloc(sizeof(uint32_t) * ic_data->HX_TX_NUM * ic_data->HX_RX_NUM, + GFP_KERNEL); + g_sec_raw_buff->_lp_noise = + kzalloc(sizeof(int) * ic_data->HX_TX_NUM * ic_data->HX_RX_NUM, + GFP_KERNEL); + g_sec_raw_buff->_gap_ver = + kzalloc(sizeof(int) * (ic_data->HX_TX_NUM - g_gap_vertical_partial) * ic_data->HX_RX_NUM, GFP_KERNEL); + g_sec_raw_buff->_gap_hor = + kzalloc(sizeof(int) * ic_data->HX_TX_NUM * (ic_data->HX_RX_NUM - g_gap_horizontal_partial), GFP_KERNEL); + g_sec_raw_buff->f_crtra_ready = HX_THRESHOLD_NOT_READY; + g_sec_raw_buff->f_ready_rawdata = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_open = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_mopen = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_short = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_noise = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_lp_rawdata = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_lp_noise = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_gap_ver = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_gap_hor = HX_RAWDATA_NOT_READY; + + return 0; + +err_sec_fac_dev_attr: +err_init_cmd: + return -ENODEV; +} + +EXPORT_SYMBOL(sec_touch_sysfs); + +void sec_touch_sysfs_remove(struct himax_ts_data *data) +{ + E("%s %s: Entering!\n", HIMAX_LOG_TAG, + __func__); + sysfs_remove_link(&data->sec.fac_dev->kobj, "input"); + sysfs_remove_group(&data->sec.fac_dev->kobj, + &sec_touch_factory_attr_group); + I("Now remove raw data buffs\n"); + + kfree(g_sec_raw_buff->_rawdata); + kfree(g_sec_raw_buff->_open); + kfree(g_sec_raw_buff->_mopen); + kfree(g_sec_raw_buff->_short); + kfree(g_sec_raw_buff->_noise); + kfree(g_sec_raw_buff->_lp_rawdata); + kfree(g_sec_raw_buff->_lp_noise); + kfree(g_sec_raw_buff->_gap_ver); + kfree(g_sec_raw_buff->_gap_hor); + g_sec_raw_buff->f_crtra_ready = HX_THRESHOLD_NOT_READY; + g_sec_raw_buff->f_ready_rawdata = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_open = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_mopen = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_short = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_noise = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_lp_rawdata = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_lp_noise = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_gap_ver = HX_RAWDATA_NOT_READY; + g_sec_raw_buff->f_ready_gap_hor = HX_RAWDATA_NOT_READY; + + kfree(g_sec_raw_buff); + E("%s %s: End!\n", HIMAX_LOG_TAG, + __func__); +} + +EXPORT_SYMBOL(sec_touch_sysfs_remove); +#endif /* SEC_FACTORY_MODE */ + diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_inspection.h b/drivers/input/touchscreen/himax/hx831xx/himax_inspection.h new file mode 100755 index 000000000000..46472a189fa3 --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_inspection.h @@ -0,0 +1,312 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for inspection functions + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_I2C) +#include "himax_platform.h" +#endif + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_SPI) +#include "himax_platform_SPI.h" +#endif + +#include "himax_common.h" +#include "himax_ic_core.h" + +/*#define HX_GAP_TEST*/ +/*#define HX_INSPECT_LPWUG_TEST*/ +/*#define HX_ACT_IDLE_TEST*/ + +#define HX_RSLT_OUT_PATH "/sdcard/" +#define HX_RSLT_OUT_FILE "hx_test_result.txt" +#define PI(x...) pr_info(x) +#define HX_SZ_ICID 60 + +#ifdef HX_ESD_RECOVERY + extern u8 HX_ESD_RESET_ACTIVATE; +#endif + +/* Firmware update error code */ +enum fw_update_errno { + FW_ERR_FILE_READ = -4, + FW_ERR_FILE_OPEN = -3, + FW_ERR_FILE_SIGN = -2, + FW_ERR_DOWNLOAD = -1, + FW_ERR_NONE = 0, + FW_ERR_UPTODATE = 1, +}; + +#define BS_RAWDATA 10 +#define BS_NOISE 100 +#define BS_OPENSHORT 0 +#define BS_LPWUG 1 +#define BS_LPWUG_dile 1 +#define BS_ACT_IDLE 1 + +/* skip notch & dummy */ +#define SKIP_NOTCH_START 5 +#define SKIP_NOTCH_END 10 +/* TX+SKIP_NOTCH_START */ +#define SKIP_DUMMY_START 23 +/* TX+SKIP_NOTCH_END*/ +#define SKIP_DUMMY_END 28 + + +#define NOISEFRAME (BS_NOISE+1) +#define NORMAL_IDLE_RAWDATA_NOISEFRAME 10 +#define LPWUG_RAWDATAFRAME 1 +#define LPWUG_NOISEFRAME 1 +#define LPWUG_IDLE_RAWDATAFRAME 1 +#define LPWUG_IDLE_NOISEFRAME 1 + +#define OTHERSFRAME 2 + +#define UNIFMAX 500 + + +/*Himax MP Password*/ +#define PWD_OPEN_START 0x77 +#define PWD_OPEN_END 0x88 +#define PWD_SHORT_START 0x11 +#define PWD_SHORT_END 0x33 +#define PWD_RAWDATA_START 0x00 +#define PWD_RAWDATA_END 0x99 +#define PWD_NOISE_START 0x00 +#define PWD_NOISE_END 0x99 +#define PWD_SORTING_START 0xAA +#define PWD_SORTING_END 0xCC + + +#define PWD_ACT_IDLE_START 0x22 +#define PWD_ACT_IDLE_END 0x44 + + + +#define PWD_LPWUG_START 0x55 +#define PWD_LPWUG_END 0x66 + +#define PWD_LPWUG_IDLE_START 0x50 +#define PWD_LPWUG_IDLE_END 0x60 + +#define PWD_TURN_ON_MPAP_OVL 0x107380 + +/*Himax DataType*/ +#define DATA_SORTING 0x0A +#define DATA_OPEN 0x0B +#define DATA_MICRO_OPEN 0x0C +#define DATA_SHORT 0x0A +#define DATA_RAWDATA 0x0A +#define DATA_NOISE 0x0F +#define DATA_BACK_NORMAL 0x00 +#define DATA_LPWUG_RAWDATA 0x0C +#define DATA_LPWUG_NOISE 0x0F +#define DATA_ACT_IDLE_RAWDATA 0x0A +#define DATA_ACT_IDLE_NOISE 0x0F +#define DATA_LPWUG_IDLE_RAWDATA 0x0A +#define DATA_LPWUG_IDLE_NOISE 0x0F + +/*Himax Data Ready Password*/ +#define Data_PWD0 0xA5 +#define Data_PWD1 0x5A + +/* ASCII format */ +#define ASCII_LF (0x0A) +#define ASCII_CR (0x0D) +#define ASCII_COMMA (0x2C) +#define ASCII_ZERO (0x30) +#define CHAR_EL '\0' +#define CHAR_NL '\n' +#define ACSII_SPACE (0x20) +/* INSOECTION Setting */ + +void himax_inspection_init(void); +extern int *g_test_item_flag; +extern int HX_CRITERIA_ITEM; +extern int *g_test_item_flag; +extern char *g_himax_inspection_mode[]; + +/*Inspection register*/ +#define addr_normal_noise_thx 0x1000708C +#define addr_lpwug_noise_thx 0x10007090 +#define addr_noise_scale 0x10007094 +#define addr_recal_thx 0x10007090 +#define addr_palm_num 0x100070A8 +#define addr_weight_sup 0x100072C8 +#define addr_normal_weight_a 0x1000709C +#define addr_lpwug_weight_a 0x100070A0 +#define addr_weight_b 0x10007094 +#define addr_max_dc 0x10007FC8 +#define addr_skip_frame 0x100070F4 +#define addr_neg_noise_sup 0x10007FD8 +#define data_neg_noise 0x7F0C0000 +#define addr_ctrl_mpap_ovl 0x100073EC + +/*Compensation Zone register*/ +#define addr_rotative_mode 0x10007F3C +#define data_portrait 0xA55AA55A +#define data_landscape 0xA11AA11A +#define addr_grip_zone 0x10007268 +#define addr_reject_zone 0x1000726C +#define addr_reject_zone_boud 0x10007270 +#define addr_except_zone 0x10007274 + +/*Need to map *g_himax_inspection_mode[]*/ +enum THP_INSPECTION_ENUM { + HIMAX_OPEN, + HIMAX_MICRO_OPEN, + HIMAX_SHORT, + HIMAX_RAWDATA, + HIMAX_BPN_RAWDATA, + HIMAX_SC, + HIMAX_WEIGHT_NOISE, + HIMAX_ABS_NOISE, + HIMAX_SORTING, + + HIMAX_GAPTEST_RAW, + /*HIMAX_GAPTEST_RAW_X,*/ + /*HIMAX_GAPTEST_RAW_Y,*/ + + HIMAX_ACT_IDLE_RAWDATA, + HIMAX_ACT_IDLE_BPN_RAWDATA, + HIMAX_ACT_IDLE_NOISE, +/*LPWUG test must put after Normal test*/ + HIMAX_LPWUG_RAWDATA, + HIMAX_LPWUG_BPN_RAWDATA, + HIMAX_LPWUG_WEIGHT_NOISE, + HIMAX_LPWUG_ABS_NOISE, + HIMAX_LPWUG_IDLE_RAWDATA, + HIMAX_LPWUG_IDLE_BPN_RAWDATA, + HIMAX_LPWUG_IDLE_NOISE, + + HIMAX_BACK_NORMAL,/*Must put in the end*/ +}; + + +enum HX_CRITERIA_ENUM { + IDX_RAWMIN = 0, + IDX_RAWMAX, + IDX_BPN_RAWMIN, + IDX_BPN_RAWMAX, + IDX_SCMIN, + IDX_SCMAX, + IDX_SC_GOLDEN, + IDX_SHORTMIN, + IDX_SHORTMAX, + IDX_OPENMIN, + IDX_OPENMAX, + IDX_M_OPENMIN, + IDX_M_OPENMAX, + IDX_WT_NOISEMIN, + IDX_WT_NOISEMAX, + IDX_ABS_NOISEMIN, + IDX_ABS_NOISEMAX, + IDX_SORTMIN, + IDX_SORTMAX, + + IDX_GAP_HOR_RAWMAX, + IDX_GAP_HOR_RAWMIN, + IDX_GAP_VER_RAWMAX, + IDX_GAP_VER_RAWMIN, + + IDX_ACT_IDLE_NOISE_MIN, + IDX_ACT_IDLE_NOISE_MAX, + IDX_ACT_IDLE_RAWDATA_MIN, + IDX_ACT_IDLE_RAWDATA_MAX, + IDX_ACT_IDLE_RAW_BPN_MIN, + IDX_ACT_IDLE_RAW_BPN_MAX, + + IDX_LPWUG_WT_NOISEMIN, + IDX_LPWUG_WT_NOISEMAX, + IDX_LPWUG_NOISE_ABS_MIN, + IDX_LPWUG_NOISE_ABS_MAX, + IDX_LPWUG_RAWDATA_MIN, + IDX_LPWUG_RAWDATA_MAX, + IDX_LPWUG_RAW_BPN_MIN, + IDX_LPWUG_RAW_BPN_MAX, + + IDX_LPWUG_IDLE_NOISE_MIN, + IDX_LPWUG_IDLE_NOISE_MAX, + IDX_LPWUG_IDLE_RAWDATA_MIN, + IDX_LPWUG_IDLE_RAWDATA_MAX, + IDX_LPWUG_IDLE_RAW_BPN_MIN, + IDX_LPWUG_IDLE_RAW_BPN_MAX, +}; + +#define ERR_SFT 4 +/* Error code of Inspection */ +enum HX_INSPECT_ERR_ENUM { + HX_INSPECT_OK = 0, /* OK */ + HX_INSPECT_EFILE = 1, /*Criteria file error*/ + HX_INSPECT_EGETRAW = 1 << 1, /* Get raw data errors */ + HX_INSPECT_MEMALLCTFAIL = 1 << 2, /* Memory allocate errors */ + HX_INSPECT_ESWITCHMODE = 1 << 3, /*Switch mode error*/ + + HX_EOPEN = 1 << (HIMAX_OPEN + ERR_SFT), /* Sensor open error */ + HX_EMOPEN = 1 << (HIMAX_MICRO_OPEN + ERR_SFT), /* Sensor micro open error */ + HX_ESHORT = 1 << (HIMAX_SHORT + ERR_SFT), /* Sensor short error */ + HX_ERAW = 1 << (HIMAX_RAWDATA + ERR_SFT), /* Raw data error */ + HX_EBPNRAW = 1 << (HIMAX_BPN_RAWDATA + ERR_SFT), /* Raw data BPN error */ + HX_ESC = 1 << (HIMAX_SC + ERR_SFT), /* Get SC errors */ + HX_WT_ENOISE = 1 << (HIMAX_WEIGHT_NOISE + ERR_SFT), /* Noise error */ + HX_ABS_ENOISE = 1 << (HIMAX_ABS_NOISE + ERR_SFT), /* Noise error */ + HX_ESORT = 1 << (HIMAX_SORTING + ERR_SFT), /*Sorting error*/ + HX_EGAP_RAW = 1 << (HIMAX_GAPTEST_RAW + ERR_SFT), /* Raw Data GAP */ + HX_EACT_IDLE_RAW = 1 << (HIMAX_ACT_IDLE_RAWDATA + ERR_SFT), /* ACT_IDLE RAW ERROR */ + HX_EACT_IDLE_NOISE = 1 << (HIMAX_ACT_IDLE_NOISE + ERR_SFT), /* ACT_IDLE NOISE ERROR */ + HX_ELPWUG_RAW = 1 << (HIMAX_LPWUG_RAWDATA + ERR_SFT), /* LPWUG RAW ERROR */ + HX_ELPWUG_WT_NOISE = 1 << (HIMAX_LPWUG_WEIGHT_NOISE + ERR_SFT), /* LPWUG NOISE ERROR */ + HX_ELPWUG_ABS_NOISE = 1 << (HIMAX_LPWUG_ABS_NOISE + ERR_SFT), /* LPWUG NOISE ERROR */ + HX_ELPWUG_IDLE_RAW = 1 << (HIMAX_LPWUG_IDLE_RAWDATA + ERR_SFT), /* LPWUG IDLE RAW ERROR */ + HX_ELPWUG_IDLE_NOISE = 1 << (HIMAX_LPWUG_IDLE_NOISE + ERR_SFT), /* LPWUG IDLE NOISE ERROR */ + HX_EACT_IDLE_BPNRAW = 1 << (HIMAX_ACT_IDLE_BPN_RAWDATA + ERR_SFT), + HX_ELPWUG_BPNRAW = 1 << (HIMAX_LPWUG_BPN_RAWDATA + ERR_SFT), + HX_ELPWUG_IDLE_BPNRAW = 1 << (HIMAX_LPWUG_IDLE_BPN_RAWDATA + ERR_SFT), +}; + +#ifdef SEC_FACTORY_MODE +struct sec_rawdata_buffs { + uint32_t *_rawdata; + uint32_t *_open; + uint32_t *_mopen; + uint32_t *_short; + int *_noise; + uint32_t *_lp_rawdata; + int *_lp_noise; + int *_gap_ver; + int *_gap_hor; + int f_ready_rawdata; + int f_ready_open; + int f_ready_mopen; + int f_ready_short; + int f_ready_noise; + int f_ready_lp_rawdata; + int f_ready_lp_noise; + int f_ready_gap_ver; + int f_ready_gap_hor; + int f_crtra_ready; +}; + +/* Error code of Inspection */ +typedef enum { + HX_NO_SUPPORT = -4, + HX_RAW_NOT_READY, + HX_THRESHOLD_NOT_READY, + HX_RAWDATA_NOT_READY, + HX_NO_ERR = 0, /* OK */ + HX_THRESHOLD_READY, + HX_RAWDATA_READY, +} HX_SEC_TEST_ERR_ENUM; +#endif /* SEC_FACTORY_MODE */ + +extern void himax_inspect_data_clear(void); diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_modular.h b/drivers/input/touchscreen/himax/hx831xx/himax_modular.h new file mode 100755 index 000000000000..ce0c6f7dc32a --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_modular.h @@ -0,0 +1,106 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for modularize functions + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __HIMAX_IC_USAGE_H__ +#define __HIMAX_IC_USAGE_H__ + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_IC_HX83102) +extern bool _hx83102_init(void); +#endif +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_IC_HX83121) +extern bool _hx83121_init(void); +#endif + +#if !defined(__HIMAX_HX852xH_MOD__) && !defined(__HIMAX_HX852xG_MOD__) +#if !defined(__HIMAX_HX852xJ_MOD__) + +extern struct fw_operation *pfw_op; +extern struct ic_operation *pic_op; +extern struct flash_operation *pflash_op; +extern struct driver_operation *pdriver_op; +#endif +#endif + +#if defined(HX_ZERO_FLASH) && IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_INCELL) +extern struct zf_operation *pzf_op; +extern int G_POWERONOF; +#endif + +extern unsigned char IC_CHECKSUM; + +#if defined(HX_EXCP_RECOVERY) +extern u8 HX_EXCP_RESET_ACTIVATE; +#endif + +#if defined(HX_ZERO_FLASH) && defined(HX_CODE_OVERLAY) +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_INCELL) +extern uint8_t *ovl_idx; +#endif +#endif + +extern unsigned long FW_VER_MAJ_FLASH_ADDR; +extern unsigned long FW_VER_MIN_FLASH_ADDR; +extern unsigned long CFG_VER_MAJ_FLASH_ADDR; +extern unsigned long CFG_VER_MIN_FLASH_ADDR; +extern unsigned long CID_VER_MAJ_FLASH_ADDR; +extern unsigned long CID_VER_MIN_FLASH_ADDR; +extern uint32_t CFG_TABLE_FLASH_ADDR; +extern uint32_t CFG_TABLE_FLASH_ADDR_T; + +#if defined(HX_TP_PROC_2T2R) + // static bool Is_2T2R; +#endif + +#if defined(HX_USB_DETECT_GLOBAL) +extern void (himax_cable_detect_func)(bool force_renew); +#endif + +#if defined(HX_RST_PIN_FUNC) +extern void (himax_rst_gpio_set)(int pinnum, uint8_t value); +#endif + +extern struct himax_ts_data *private_ts; +extern struct himax_core_fp g_core_fp; +extern struct himax_ic_data *ic_data; + +#if !defined(__HIMAX_HX852xH_MOD__) && !defined(__HIMAX_HX852xG_MOD__) +#if !defined(__HIMAX_HX852xJ_MOD__) +extern void himax_mcu_in_cmd_init(void); +extern int himax_mcu_in_cmd_struct_init(void); +#else +extern struct on_driver_operation *on_pdriver_op; +extern struct on_flash_operation *on_pflash_op; + +extern void himax_mcu_on_cmd_init(void); +extern int himax_mcu_on_cmd_struct_init(void); +#endif +#else +extern struct on_driver_operation *on_pdriver_op; +extern struct on_flash_operation *on_pflash_op; + +extern void himax_mcu_on_cmd_init(void); +extern int himax_mcu_on_cmd_struct_init(void); +#endif +extern void himax_parse_assign_cmd(uint32_t addr, uint8_t *cmd, + int len); + +extern int himax_bus_read(uint8_t command, uint8_t *data, + uint32_t length, uint8_t toRetry); +extern int himax_bus_write(uint8_t command, uint8_t *data, + uint32_t length, uint8_t toRetry); + +extern void himax_int_enable(int enable); + +#endif diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_platform.c b/drivers/input/touchscreen/himax/hx831xx/himax_platform.c new file mode 100755 index 000000000000..77fe9f35507c --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_platform.c @@ -0,0 +1,982 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for QCT platform + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "himax_platform.h" +#include "himax_common.h" + +int i2c_error_count; + +int himax_dev_set(struct himax_ts_data *ts) +{ + int ret = 0; + + + ts->input_dev = input_allocate_device(); + + if (ts->input_dev == NULL) { + ret = -ENOMEM; + E("%s: Failed to allocate input device-input_dev\n", __func__); + return ret; + } + +// ts->input_dev->name = "himax-touchscreen"; + ts->input_dev->name = "sec_touchscreen"; + ts->input_dev->id.bustype = BUS_I2C; + ts->input_dev->dev.parent = &ts->client->dev; +#if defined(HX_PEN_FUNC_EN) + ts->hx_pen_dev = input_allocate_device(); + + if (ts->hx_pen_dev == NULL) { + ret = -ENOMEM; + E("%s: Failed to allocate input device-hx_pen_dev\n", __func__); + return ret; + } + + ts->hx_pen_dev->name = "himax-pen"; +#endif + return ret; +} +int himax_input_register_device(struct input_dev *input_dev) +{ + return input_register_device(input_dev); +} + +#if defined(HX_PLATFOME_DEFINE_KEY) +void himax_platform_key(void) +{ + I("Nothing to be done! Plz cancel it!\n"); +} +#endif + +void himax_vk_parser(struct device_node *dt, + struct himax_i2c_platform_data *pdata) +{ + u32 data = 0; + uint8_t cnt = 0, i = 0; + uint32_t coords[4] = {0}; + struct device_node *node, *pp = NULL; + struct himax_virtual_key *vk; + + + node = of_parse_phandle(dt, "virtualkey", 0); + + if (node == NULL) { + I(" DT-No vk info in DT\n"); + } else { + while ((pp = of_get_next_child(node, pp))) + cnt++; + + if (!cnt) + return; + + vk = kcalloc(cnt, sizeof(struct himax_virtual_key), GFP_KERNEL); + pp = NULL; + + while ((pp = of_get_next_child(node, pp))) { + if (of_property_read_u32(pp, "idx", &data) == 0) + vk[i].index = data; + + if (of_property_read_u32_array(pp, "range", coords, 4) == 0) { + vk[i].x_range_min = coords[0], vk[i].x_range_max = coords[1]; + vk[i].y_range_min = coords[2], vk[i].y_range_max = coords[3]; + } else { + I(" range faile\n"); + } + + i++; + } + + pdata->virtual_key = vk; + + for (i = 0; i < cnt; i++) + I(" vk[%d] idx:%d x_min:%d, y_max:%d\n", i, pdata->virtual_key[i].index, + pdata->virtual_key[i].x_range_min, pdata->virtual_key[i].y_range_max); + } +} + +int himax_parse_dt(struct himax_ts_data *ts, + struct himax_i2c_platform_data *pdata) +{ + int rc, coords_size = 0; + uint32_t coords[4] = {0}; + struct property *prop; + struct device_node *dt = private_ts->client->dev.of_node; + u32 data = 0; + + + prop = of_find_property(dt, "himax,panel-coords", NULL); + + if (prop) { + coords_size = prop->length / sizeof(u32); + + if (coords_size != 4) + D(" %s:Invalid panel coords size %d\n", __func__, coords_size); + } + + if (of_property_read_u32_array(dt, "himax,panel-coords", coords, coords_size) == 0) { + pdata->abs_x_min = coords[0], pdata->abs_x_max = (coords[1] - 1); + pdata->abs_y_min = coords[2], pdata->abs_y_max = (coords[3] - 1); + input_info(true, &ts->client->dev, "%s %s DT-%s:panel-coords = %d, %d, %d, %d\n", HIMAX_LOG_TAG, __func__, + pdata->abs_x_min, pdata->abs_x_max, pdata->abs_y_min, pdata->abs_y_max); + } + + prop = of_find_property(dt, "himax,display-coords", NULL); + + if (prop) { + coords_size = prop->length / sizeof(u32); + + if (coords_size != 4) + D(" %s:Invalid display coords size %d\n", __func__, coords_size); + } + + rc = of_property_read_u32_array(dt, "himax,display-coords", coords, coords_size); + + if (rc && (rc != -EINVAL)) { + D(" %s:Fail to read display-coords %d\n", __func__, rc); + return rc; + } + + pdata->screenWidth = coords[1]; + pdata->screenHeight = coords[3]; + input_info(true, &ts->client->dev, " DT-%s %s:display-coords = (%d, %d)\n", HIMAX_LOG_TAG, __func__, + pdata->screenWidth, pdata->screenHeight); + pdata->gpio_irq = of_get_named_gpio(dt, "himax,irq-gpio", 0); + + if (!gpio_is_valid(pdata->gpio_irq)) + input_info(true, &ts->client->dev, " DT:gpio_irq value is not valid\n"); + +#ifdef HX_PON_PIN_SUPPORT + pdata->gpio_reset = 262; +#else + pdata->gpio_reset = of_get_named_gpio(dt, "himax,rst-gpio", 0); +#endif + + if (!gpio_is_valid(pdata->gpio_reset)) + input_info(true, &ts->client->dev, " DT:gpio_rst value is not valid\n"); + +#ifdef HX_PON_PIN_SUPPORT + pdata->gpio_pon = of_get_named_gpio(dt, "himax,pon-gpio", 0); + + if (!gpio_is_valid(pdata->gpio_pon)) + input_info(true, &ts->client->dev, " DT:gpio_pon value is not valid\n"); + + + input_info(true, &ts->client->dev, " DT:pdata->gpio_pon=%d\n", pdata->gpio_pon); + +#endif + + pdata->gpio_3v3_en = of_get_named_gpio(dt, "himax,3v3-gpio", 0); + + if (!gpio_is_valid(pdata->gpio_3v3_en)) + input_info(true, &ts->client->dev, " DT:gpio_3v3_en value is not valid\n"); + + input_info(true, &ts->client->dev, " DT:gpio_irq=%d, gpio_rst=%d, gpio_3v3_en=%d\n", pdata->gpio_irq, pdata->gpio_reset, pdata->gpio_3v3_en); + + of_property_read_string(dt, "himax,fw-path", &pdata->i_CTPM_firmware_name); + + if (of_property_read_u32(dt, "report_type", &data) == 0) { + pdata->protocol_type = data; + input_info(true, &ts->client->dev, " DT:protocol_type=%d\n", pdata->protocol_type); + } + + if (of_property_read_u32(dt, "himax,factory_item_version", &pdata->item_version) < 0) + pdata->item_version = 0; + + if (of_property_read_string(dt, "himax,project_name", &pdata->proj_name) < 0) { + /* prevent from kernel panic due to use strcmp with null pointer */ + pdata->proj_name = "HIMAX"; + D("parsing from dt FAIL!!!!!, use default project name = %s\n", pdata->proj_name); + } + + himax_vk_parser(dt, pdata); + return 0; +} +EXPORT_SYMBOL(himax_parse_dt); + +int himax_bus_read(uint8_t command, uint8_t *data, uint32_t length, uint8_t toRetry) +{ + int retry; + struct i2c_client *client = private_ts->client; + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = 1, + .buf = &command, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = length, + .buf = data, + } + }; + mutex_lock(&private_ts->rw_lock); + + for (retry = 0; retry < toRetry; retry++) { + if (i2c_transfer(client->adapter, msg, 2) == 2) + break; + + /*msleep(20);*/ + } + + if (retry == toRetry) { + E("%s: i2c_read_block retry over %d\n", + __func__, toRetry); + i2c_error_count = toRetry; + mutex_unlock(&private_ts->rw_lock); + return -EIO; + } + + mutex_unlock(&private_ts->rw_lock); + return 0; +} +EXPORT_SYMBOL(himax_bus_read); + +int himax_bus_write(uint8_t command, uint8_t *data, uint32_t length, uint8_t toRetry) +{ + int retry/*, loop_i*/; + uint8_t buf[length + 1]; + struct i2c_client *client = private_ts->client; + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = length + 1, + .buf = buf, + } + }; + + + mutex_lock(&private_ts->rw_lock); + buf[0] = command; + memcpy(buf + 1, data, length); + + for (retry = 0; retry < toRetry; retry++) { + if (i2c_transfer(client->adapter, msg, 1) == 1) + break; + + /*msleep(20);*/ + } + + if (retry == toRetry) { + E("%s: i2c_write_block retry over %d\n", + __func__, toRetry); + i2c_error_count = toRetry; + mutex_unlock(&private_ts->rw_lock); + return -EIO; + } + + mutex_unlock(&private_ts->rw_lock); + return 0; +} +EXPORT_SYMBOL(himax_bus_write); + +int himax_bus_write_command(uint8_t command, uint8_t toRetry) +{ + return himax_bus_write(command, NULL, 0, toRetry); +} + +int himax_bus_master_write(uint8_t *data, uint32_t length, uint8_t toRetry) +{ + int retry/*, loop_i*/; + uint8_t buf[length]; + struct i2c_client *client = private_ts->client; + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = length, + .buf = buf, + } + }; + + + mutex_lock(&private_ts->rw_lock); + memcpy(buf, data, length); + + for (retry = 0; retry < toRetry; retry++) { + if (i2c_transfer(client->adapter, msg, 1) == 1) + break; + + /*msleep(20);*/ + } + + if (retry == toRetry) { + E("%s: i2c_write_block retry over %d\n", + __func__, toRetry); + i2c_error_count = toRetry; + mutex_unlock(&private_ts->rw_lock); + return -EIO; + } + + mutex_unlock(&private_ts->rw_lock); + return 0; +} +EXPORT_SYMBOL(himax_bus_master_write); + +void himax_int_enable(int enable) +{ + struct himax_ts_data *ts = private_ts; + int irqnum = ts->client->irq; + + mutex_lock(&ts->irq_lock); + input_info(true, &ts->client->dev, "%s: Entering!\n", __func__); + if (enable == 1 && atomic_read(&ts->irq_state) == 0) { + atomic_set(&ts->irq_state, 1); + enable_irq(irqnum); + private_ts->irq_enabled = 1; + } else if (enable == 0 && atomic_read(&ts->irq_state) == 1) { + atomic_set(&ts->irq_state, 0); + disable_irq_nosync(irqnum); + private_ts->irq_enabled = 0; + } + + input_info(true, &ts->client->dev, "enable = %d\n", enable); + mutex_unlock(&ts->irq_lock); +} +EXPORT_SYMBOL(himax_int_enable); + +#ifdef HX_RST_PIN_FUNC +void himax_rst_gpio_set(int pinnum, uint8_t value) +{ + gpio_direction_output(pinnum, value); +} +EXPORT_SYMBOL(himax_rst_gpio_set); +#endif + +uint8_t himax_int_gpio_read(int pinnum) +{ + return gpio_get_value(pinnum); +} + +#if defined(CONFIG_HMX_DB) +static int himax_regulator_configure(struct himax_i2c_platform_data *pdata) +{ + int retval; + struct i2c_client *client = private_ts->client; + + + pdata->vcc_dig = regulator_get(&client->dev, "vdd"); + + if (IS_ERR(pdata->vcc_dig)) { + E("%s: Failed to get regulator vdd\n", + __func__); + retval = PTR_ERR(pdata->vcc_dig); + return retval; + } + + pdata->vcc_ana = regulator_get(&client->dev, "avdd"); + + if (IS_ERR(pdata->vcc_ana)) { + E("%s: Failed to get regulator avdd\n", + __func__); + retval = PTR_ERR(pdata->vcc_ana); + regulator_put(pdata->vcc_dig); + return retval; + } + + return 0; +}; + +static void himax_regulator_deinit(struct himax_i2c_platform_data *pdata) +{ + I("%s: entered.\n", __func__); + + if (!IS_ERR(pdata->vcc_ana)) + regulator_put(pdata->vcc_ana); + + if (!IS_ERR(pdata->vcc_dig)) + regulator_put(pdata->vcc_dig); + + I("%s: regulator put, completed.\n", __func__); +}; + +static int himax_power_on(struct himax_i2c_platform_data *pdata, bool on) +{ + int retval; + + if (on) { + retval = regulator_enable(pdata->vcc_dig); + + if (retval) { + E("%s: Failed to enable regulator vdd\n", + __func__); + return retval; + } + + /*msleep(100);*/ + usleep_range(1000, 1001); + retval = regulator_enable(pdata->vcc_ana); + + if (retval) { + E("%s: Failed to enable regulator avdd\n", + __func__); + regulator_disable(pdata->vcc_dig); + return retval; + } + } else { + regulator_disable(pdata->vcc_dig); + regulator_disable(pdata->vcc_ana); + } + + return 0; +} + +int himax_gpio_power_config(struct himax_i2c_platform_data *pdata) +{ + int error; + struct i2c_client *client = private_ts->client; + + + error = himax_regulator_configure(pdata); + + if (error) { + E("Failed to intialize hardware\n"); + goto err_regulator_not_on; + } + +#ifdef HX_RST_PIN_FUNC + + if (gpio_is_valid(pdata->gpio_reset)) { + /* configure touchscreen reset out gpio */ + error = gpio_request(pdata->gpio_reset, "hmx_reset_gpio"); + + if (error) { + E("unable to request gpio [%d]\n", pdata->gpio_reset); + goto err_regulator_on; + } + + error = gpio_direction_output(pdata->gpio_reset, 0); + + if (error) { + E("unable to set direction for gpio [%d]\n", + pdata->gpio_reset); + goto err_gpio_reset_req; + } + } + +#endif + error = himax_power_on(pdata, true); + + if (error) { + E("Failed to power on hardware\n"); + goto err_power_on; + } + + if (gpio_is_valid(pdata->gpio_irq)) { + /* configure touchscreen irq gpio */ + error = gpio_request(pdata->gpio_irq, "hmx_gpio_irq"); + + if (error) { + E("unable to request gpio [%d]\n", + pdata->gpio_irq); + goto err_req_irq_gpio; + } + + error = gpio_direction_input(pdata->gpio_irq); + + if (error) { + E("unable to set direction for gpio [%d]\n", + pdata->gpio_irq); + goto err_set_gpio_irq; + } + + client->irq = gpio_to_irq(pdata->gpio_irq); + private_ts->hx_irq = client->irq; + } else { + E("irq gpio not provided\n"); + goto err_req_irq_gpio; + } + + /*msleep(20);*/ + usleep_range(2000, 2001); +#ifdef HX_RST_PIN_FUNC + + if (gpio_is_valid(pdata->gpio_reset)) { + error = gpio_direction_output(pdata->gpio_reset, 1); + + if (error) { + E("unable to set direction for gpio [%d]\n", + pdata->gpio_reset); + goto err_set_gpio_irq; + } + } + +#endif + return 0; +err_set_gpio_irq: + + if (gpio_is_valid(pdata->gpio_irq)) + gpio_free(pdata->gpio_irq); + +err_req_irq_gpio: + himax_power_on(pdata, false); +err_power_on: +#ifdef HX_RST_PIN_FUNC +err_gpio_reset_req: + if (gpio_is_valid(pdata->gpio_reset)) + gpio_free(pdata->gpio_reset); + +err_regulator_on: +#endif + himax_regulator_deinit(pdata); +err_regulator_not_on: + return error; +} + +#else +int himax_gpio_power_config(struct himax_i2c_platform_data *pdata) +{ + int error = 0; + struct i2c_client *client = private_ts->client; +#ifdef HX_RST_PIN_FUNC + + if (pdata->gpio_reset >= 0) { + error = gpio_request(pdata->gpio_reset, "himax-reset"); + + if (error < 0) { + E("%s: request reset pin failed\n", __func__); + goto err_gpio_reset_req; + } + + error = gpio_direction_output(pdata->gpio_reset, 0); + + if (error) { + E("unable to set direction for gpio [%d]\n", + pdata->gpio_reset); + goto err_gpio_reset_dir; + } + } + +#endif + +#ifdef HX_PON_PIN_SUPPORT + if (gpio_is_valid(pdata->gpio_pon)) { + error = gpio_request(pdata->gpio_pon, "hmx_pon_gpio"); + + if (error) { + E("unable to request scl gpio [%d]\n", pdata->gpio_pon); + goto err_gpio_pon_req; + } + + error = gpio_direction_output(pdata->gpio_pon, 0); + + I("gpio_pon LOW [%d]\n", pdata->gpio_pon); + + if (error) { + E("unable to set direction for pon gpio [%d]\n", pdata->gpio_pon); + goto err_gpio_pon_dir; + } + } +#endif + + + if (pdata->gpio_3v3_en >= 0) { + error = gpio_request(pdata->gpio_3v3_en, "himax-3v3_en"); + + if (error < 0) { + E("%s: request 3v3_en pin failed\n", __func__); + goto err_gpio_3v3_req; + } + + gpio_direction_output(pdata->gpio_3v3_en, 1); + I("3v3_en set 1 get pin = %d\n", gpio_get_value(pdata->gpio_3v3_en)); + } + + if (gpio_is_valid(pdata->gpio_irq)) { + /* configure touchscreen irq gpio */ + error = gpio_request(pdata->gpio_irq, "himax_gpio_irq"); + + if (error) { + E("unable to request gpio [%d]\n", pdata->gpio_irq); + goto err_gpio_irq_req; + } + + error = gpio_direction_input(pdata->gpio_irq); + + if (error) { + E("unable to set direction for gpio [%d]\n", pdata->gpio_irq); + goto err_gpio_irq_set_input; + } + + client->irq = gpio_to_irq(pdata->gpio_irq); + private_ts->hx_irq = client->irq; + } else { + E("irq gpio not provided\n"); + goto err_gpio_irq_req; + } +#ifdef HX_PON_PIN_SUPPORT + msleep(20); +#else + usleep_range(2000, 2001); +#endif + +#ifdef HX_RST_PIN_FUNC + + if (pdata->gpio_reset >= 0) { + error = gpio_direction_output(pdata->gpio_reset, 1); + + if (error) { + E("unable to set direction for gpio [%d]\n", + pdata->gpio_reset); + goto err_gpio_reset_set_high; + } + } +#endif + +#ifdef HX_PON_PIN_SUPPORT + msleep(800); + + if (gpio_is_valid(pdata->gpio_pon)) { + + error = gpio_direction_output(pdata->gpio_pon, 1); + + I("gpio_pon HIGH [%d]\n", pdata->gpio_pon); + + if (error) { + E("gpio_pon unable to set direction for gpio [%d]\n", pdata->gpio_pon); + goto err_gpio_pon_set_high; + } + } +#endif + return error; + +#ifdef HX_PON_PIN_SUPPORT +err_gpio_pon_set_high: +#endif +#ifdef HX_RST_PIN_FUNC +err_gpio_reset_set_high: +#endif +err_gpio_irq_set_input: + if (gpio_is_valid(pdata->gpio_irq)) + gpio_free(pdata->gpio_irq); +err_gpio_irq_req: + if (pdata->gpio_3v3_en >= 0) + gpio_free(pdata->gpio_3v3_en); +err_gpio_3v3_req: +#ifdef HX_PON_PIN_SUPPORT +err_gpio_pon_dir: + if (gpio_is_valid(pdata->gpio_pon)) + gpio_free(pdata->gpio_pon); +err_gpio_pon_req: +#endif +#ifdef HX_RST_PIN_FUNC +err_gpio_reset_dir: + if (pdata->gpio_reset >= 0) + gpio_free(pdata->gpio_reset); +err_gpio_reset_req: +#endif + return error; +} + +#endif + +void himax_gpio_power_deconfig(struct himax_i2c_platform_data *pdata) +{ + if (gpio_is_valid(pdata->gpio_irq)) + gpio_free(pdata->gpio_irq); + +#ifdef HX_RST_PIN_FUNC + if (gpio_is_valid(pdata->gpio_reset)) + gpio_free(pdata->gpio_reset); +#endif + +#if defined(CONFIG_HMX_DB) + himax_power_on(pdata, false); + himax_regulator_deinit(pdata); +#else + if (pdata->gpio_3v3_en >= 0) + gpio_free(pdata->gpio_3v3_en); + +#ifdef HX_PON_PIN_SUPPORT + if (gpio_is_valid(pdata->gpio_pon)) + gpio_free(pdata->gpio_pon); +#endif + +#endif +} + +static void himax_ts_isr_func(struct himax_ts_data *ts) +{ + himax_ts_work(ts); +} + +irqreturn_t himax_ts_thread(int irq, void *ptr) +{ + himax_ts_isr_func((struct himax_ts_data *)ptr); + + return IRQ_HANDLED; +} + +static void himax_ts_work_func(struct work_struct *work) +{ + struct himax_ts_data *ts = container_of(work, struct himax_ts_data, work); + + + himax_ts_work(ts); +} + +int himax_int_register_trigger(void) +{ + int ret = 0; + struct himax_ts_data *ts = private_ts; + struct i2c_client *client = private_ts->client; + + if (ic_data->HX_INT_IS_EDGE) { + input_info(true, &ts->client->dev, "%s edge triiger falling\n ", __func__); + ret = request_threaded_irq(client->irq, NULL, himax_ts_thread, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, client->name, ts); + } else { + input_info(true, &ts->client->dev, "%s level trigger low\n ", __func__); + ret = request_threaded_irq(client->irq, NULL, himax_ts_thread, IRQF_TRIGGER_LOW | IRQF_ONESHOT, client->name, ts); + } + + return ret; +} + +int himax_int_en_set(void) +{ + int ret = NO_ERR; + + + ret = himax_int_register_trigger(); + return ret; +} + +int himax_ts_register_interrupt(void) +{ + struct himax_ts_data *ts = private_ts; + struct i2c_client *client = private_ts->client; + int ret = 0; + + + ts->irq_enabled = 0; + + /* Work functon */ + if (client->irq && private_ts->hx_irq) {/*INT mode*/ + ts->use_irq = 1; + ret = himax_int_register_trigger(); + + if (ret == 0) { + ts->irq_enabled = 1; + atomic_set(&ts->irq_state, 1); + input_info(true, &ts->client->dev, "%s: irq enabled at gpio: %d\n", __func__, client->irq); +#ifdef HX_SMART_WAKEUP + irq_set_irq_wake(client->irq, 1); +#endif + } else { + ts->use_irq = 0; + input_err(true, &ts->client->dev, "%s: request_irq failed\n", __func__); + } + } else { + input_info(true, &ts->client->dev, "%s: client->irq is empty, use polling mode.\n", __func__); + } + + if (!ts->use_irq) {/*if use polling mode need to disable HX_ESD_RECOVERY function*/ + ts->himax_wq = create_singlethread_workqueue("himax_touch"); + INIT_WORK(&ts->work, himax_ts_work_func); + hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + ts->timer.function = himax_ts_timer_func; + hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL); + input_info(true, &ts->client->dev, "%s: polling mode enabled\n", __func__); + } + + return ret; +} + +int himax_ts_unregister_interrupt(void) +{ + struct himax_ts_data *ts = private_ts; + int ret = 0; + + + input_info(true, &ts->client->dev, "%s: entered.\n", __func__); + + /* Work functon */ + if (private_ts->hx_irq && ts->use_irq) {/*INT mode*/ +#ifdef HX_SMART_WAKEUP + irq_set_irq_wake(ts->hx_irq, 0); +#endif + free_irq(ts->hx_irq, ts); + input_info(true, &ts->client->dev, "%s: irq disabled at qpio: %d\n", __func__, private_ts->hx_irq); + } + + if (!ts->use_irq) {/*if use polling mode need to disable HX_ESD_RECOVERY function*/ + hrtimer_cancel(&ts->timer); + cancel_work_sync(&ts->work); + if (ts->himax_wq != NULL) + destroy_workqueue(ts->himax_wq); + input_info(true, &ts->client->dev, "%s: polling mode destroyed", __func__); + } + + return ret; +} + +static int himax_common_suspend(struct device *dev) +{ + struct himax_ts_data *ts = dev_get_drvdata(dev); + + input_info(true, &ts->client->dev, "%s: enter\n", __func__); +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) + if (!ts->initialized) + return -ECANCELED; +#endif + himax_chip_common_suspend(ts); + return 0; +} + +static int himax_common_resume(struct device *dev) +{ + struct himax_ts_data *ts = dev_get_drvdata(dev); + + input_info(true, &ts->client->dev, "%s: enter\n", __func__); +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) + /* + * wait until device resume for TDDI + * TDDI: Touch and display Driver IC + */ + if (!ts->initialized) + if (himax_chip_common_init()) + return -ECANCELED; +#endif + himax_chip_common_resume(ts); + return 0; +} + +static int himax_reboot_notifier(struct notifier_block *this, + unsigned long code, void *unused) +{ + struct himax_ts_data *ts = container_of(this, struct himax_ts_data, reboot_notifier); + + input_info(true, &ts->client->dev, "%s %s: enter\n", HIMAX_LOG_TAG, __func__); + + himax_chip_common_suspend(ts); + + input_info(true, &ts->client->dev, "%s %s: exit\n", HIMAX_LOG_TAG, __func__); + + return NOTIFY_DONE; +} + +int himax_chip_common_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + int ret = 0; + struct himax_ts_data *ts; + + input_info(true, &client->dev, "%s:Enter\n", __func__); + + /* Check I2C functionality */ + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + input_err(true, &client->dev, "%s: i2c check functionality error\n", __func__); + ret = -ENODEV; + goto err_check_functionality_failed; + } + + ts = kzalloc(sizeof(struct himax_ts_data), GFP_KERNEL); + if (ts == NULL) { + input_err(true, &client->dev, "%s: allocate himax_ts_data failed\n", __func__); + ret = -ENOMEM; + goto err_alloc_data_failed; + } + + i2c_set_clientdata(client, ts); + ts->client = client; + ts->dev = &client->dev; + mutex_init(&ts->rw_lock); + private_ts = ts; + + ts->initialized = false; + ret = himax_chip_common_init(); + + ts->reboot_notifier.notifier_call = himax_reboot_notifier; + register_reboot_notifier(&ts->reboot_notifier); + +err_alloc_data_failed: +err_check_functionality_failed: + + return ret; +} + +int himax_chip_common_remove(struct i2c_client *client) +{ + if (g_hx_chip_inited) + himax_chip_common_deinit(); + + return 0; +} + +static const struct i2c_device_id himax_common_ts_id[] = { + {HIMAX_common_NAME, 0 }, + {} +}; + +#if IS_ENABLED(CONFIG_PM) +static const struct dev_pm_ops himax_common_pm_ops = { +#if (!IS_ENABLED(CONFIG_FB)) && (!IS_ENABLED(CONFIG_DISPLAY_SAMSUNG)) + .suspend = himax_common_suspend, + .resume = himax_common_resume, +#endif +}; +#endif + +#if IS_ENABLED(CONFIG_OF) +static const struct of_device_id himax_match_table[] = { + {.compatible = "himax,hxcommon" }, + {}, +}; +#else +#define himax_match_table NULL +#endif + +static struct i2c_driver himax_common_driver = { + .id_table = himax_common_ts_id, + .probe = himax_chip_common_probe, + .remove = himax_chip_common_remove, + .driver = { + .name = HIMAX_common_NAME, + .owner = THIS_MODULE, + .of_match_table = himax_match_table, +#if IS_ENABLED(CONFIG_PM) + .pm = &himax_common_pm_ops, +#endif + }, +}; + +static int __init himax_common_init(void) +{ + KI("Himax common touch panel driver init: common\n"); + D("Himax check double loading\n"); + if (g_mmi_refcnt++ > 0) { + + KI("Himax driver has been loaded! ignoring....\n"); + + return 0; + } + + i2c_add_driver(&himax_common_driver); + + KI("%s: i2c_add_driver done\n", __func__); + return 0; +} + +static void __exit himax_common_exit(void) +{ + i2c_del_driver(&himax_common_driver); +} + +module_init(himax_common_init); +module_exit(himax_common_exit); + +MODULE_DESCRIPTION("Himax_common driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_platform.h b/drivers/input/touchscreen/himax/hx831xx/himax_platform.h new file mode 100755 index 000000000000..d19649fb8ec7 --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_platform.h @@ -0,0 +1,149 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for QCT platform + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef HIMAX_PLATFORM_H +#define HIMAX_PLATFORM_H + +#include "himax_common.h" + +#include +#include +#include +#include +#include +#include + +#if defined(CONFIG_HMX_DB) + #include +#endif + +#define HIMAX_I2C_RETRY_TIMES 3 + +#define HIMAX_LOG_TAG "[HXTP]" + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_DEBUG) +#define D(x...) pr_debug("[HXTP] " x) +#define KI(x...) pr_info("[HXTP] " x) +#define I(x...) input_info(true, &private_ts->client->dev, "[HXTP] " x) +#define W(x...) pr_warn("[HXTP][WARNING] " x) +#define KE(x...) pr_err("[HXTP][ERROR] " x) +#define E(x...) input_err(true, &private_ts->client->dev, "[HXTP][ERROR] " x) +#define DIF(x...) \ +do { \ + if (debug_flag) \ + pr_debug("[HXTP][DEBUG] " x) \ + } while (0) +#else + +#define D(x...) +#define I(x...) +#define W(x...) +#define E(x...) +#define DIF(x...) +#endif + +#if defined(CONFIG_HMX_DB) + + /* Analog voltage @2.7 V */ + #define HX_VTG_MIN_UV 2700000 + #define HX_VTG_MAX_UV 3300000 + #define HX_ACTIVE_LOAD_UA 15000 + #define HX_LPM_LOAD_UA 10 + /* Digital voltage @1.8 V */ + #define HX_VTG_DIG_MIN_UV 1800000 + #define HX_VTG_DIG_MAX_UV 1800000 + #define HX_ACTIVE_LOAD_DIG_UA 10000 + #define HX_LPM_LOAD_DIG_UA 10 + #define HX_I2C_VTG_MIN_UV 1800000 + #define HX_I2C_VTG_MAX_UV 1800000 + #define HX_I2C_LOAD_UA 10000 + #define HX_I2C_LPM_LOAD_UA 10 + +#endif + +#define HIMAX_common_NAME "himax_tp" +#define HIMAX_I2C_ADDR 0x48 +#define INPUT_DEV_NAME "himax-touchscreen" + +struct himax_i2c_platform_data { + int abs_x_min; + int abs_x_max; + int abs_x_fuzz; + int abs_y_min; + int abs_y_max; + int abs_y_fuzz; + int abs_pressure_min; + int abs_pressure_max; + int abs_pressure_fuzz; + int abs_width_min; + int abs_width_max; + int screenWidth; + int screenHeight; + u32 area_indicator; + u32 area_navigation; + u32 area_edge; + uint8_t fw_version; + uint8_t tw_id; + uint8_t powerOff3V3; + uint8_t cable_config[2]; + uint8_t protocol_type; + int gpio_irq; + int gpio_reset; + int gpio_3v3_en; + int gpio_pon; + int (*power)(int on); + void (*reset)(void); + struct himax_virtual_key *virtual_key; + struct kobject *vk_obj; + struct kobj_attribute *vk2Use; + int hx_config_size; + + const char *i_CTPM_firmware_name; + const char *proj_name; + int item_version; + +#if defined(CONFIG_HMX_DB) + bool i2c_pull_up; + bool digital_pwr_regulator; + int reset_gpio; + u32 reset_gpio_flags; + int irq_gpio; + u32 irq_gpio_flags; + struct regulator *vcc_ana; /* For Dragon Board */ + struct regulator *vcc_dig; /* For Dragon Board */ + struct regulator *vcc_i2c; /* For Dragon Board */ + +#endif + +}; + +extern int himax_bus_read(uint8_t command, uint8_t *data, uint32_t length, uint8_t toRetry); +extern int himax_bus_write(uint8_t command, uint8_t *data, uint32_t length, uint8_t toRetry); +extern int himax_bus_write_command(uint8_t command, uint8_t toRetry); +extern int himax_bus_master_write(uint8_t *data, uint32_t length, uint8_t toRetry); +extern void himax_int_enable(int enable); +extern int himax_ts_register_interrupt(void); +int himax_ts_unregister_interrupt(void); +extern uint8_t himax_int_gpio_read(int pinnum); +extern int himax_gpio_power_config(struct himax_i2c_platform_data *pdata); +void himax_gpio_power_deconfig(struct himax_i2c_platform_data *pdata); + +extern void himax_ts_work(struct himax_ts_data *ts); +extern enum hrtimer_restart himax_ts_timer_func(struct hrtimer *timer); +extern int himax_chip_common_init(void); +extern void himax_chip_common_deinit(void); + +#endif + diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_platform_SPI.c b/drivers/input/touchscreen/himax/hx831xx/himax_platform_SPI.c new file mode 100755 index 000000000000..bba4e71010bf --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_platform_SPI.c @@ -0,0 +1,1265 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for QCT platform + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "himax_common.h" +#include "himax_platform_SPI.h" +#include + + +int i2c_error_count; +struct spi_device *spi; + +static uint8_t *gBuffer; + +int himax_dev_set(struct himax_ts_data *ts) +{ + int ret = 0; + + ts->input_dev = devm_input_allocate_device(&ts->spi->dev); + if (ts->input_dev == NULL) { + ret = -ENOMEM; + E("%s: Failed to allocate input device\n", __func__); + return ret; + } + ts->input_dev->id.bustype = BUS_SPI; + ts->input_dev->dev.parent = &ts->spi->dev; + ts->input_dev->name = "sec_touchscreen"; + + if (ts->pdata->support_dex) { + ts->input_dev_pad = devm_input_allocate_device(&ts->spi->dev); + if (ts->input_dev_pad == NULL) { + E("%s: Failed to allocate dex input device\n", __func__); + } else { + ts->input_dev_pad->id.bustype = BUS_SPI; + ts->input_dev_pad->dev.parent = &ts->spi->dev; + ts->input_dev_pad->name = "sec_touchpad"; + } + } + + return ret; +} + +int himax_input_register_device(struct input_dev *input_dev) +{ + return input_register_device(input_dev); +} + +#if defined(HX_PLATFOME_DEFINE_KEY) +void himax_platform_key(void) +{ + I("Nothing to be done! Plz cancel it!\n"); +} +#endif + +void himax_vk_parser(struct device_node *dt, + struct himax_i2c_platform_data *pdata) +{ + u32 data = 0; + uint8_t cnt = 0, i = 0; + uint32_t coords[4] = {0}; + struct device_node *node, *pp = NULL; + struct himax_virtual_key *vk; + + node = of_parse_phandle(dt, "virtualkey", 0); + + if (node == NULL) { + I(" DT-No vk info in DT\n"); + return; + } + while ((pp = of_get_next_child(node, pp))) + cnt++; + + if (!cnt) + return; + + vk = kcalloc(cnt, sizeof(struct himax_virtual_key), GFP_KERNEL); + if (vk == NULL) { + E("%s, vk init fail!\n", __func__); + return; + } + pp = NULL; + + while ((pp = of_get_next_child(node, pp))) { + if (of_property_read_u32(pp, "idx", &data) == 0) + vk[i].index = data; + + if (of_property_read_u32_array(pp, "range", coords, 4) == 0) { + vk[i].x_range_min = coords[0], vk[i].x_range_max = coords[1]; + vk[i].y_range_min = coords[2], vk[i].y_range_max = coords[3]; + } else { + I(" range faile\n"); + } + + i++; + } + + pdata->virtual_key = vk; + + for (i = 0; i < cnt; i++) + I(" vk[%d] idx:%d x_min:%d, y_max:%d\n", i, pdata->virtual_key[i].index, + pdata->virtual_key[i].x_range_min, pdata->virtual_key[i].y_range_max); + +} + +int hx_gpio_cs = 0; +int himax_parse_dt(struct himax_ts_data *ts, + struct himax_i2c_platform_data *pdata) +{ + struct device_node *dt = ts->dev->of_node; + u32 data = 0; + int lcdtype = 0; + int fw_count, select_lcd_count = 0; + int lcd_id_num = 1; + int err; + u32 coords[20]; + u32 px_zone[3] = { 0 }; + + pdata->gpio_irq = of_get_named_gpio(dt, "himax,irq-gpio", 0); + + if (!gpio_is_valid(pdata->gpio_irq)) + I(" DT:gpio_irq value is not valid\n"); + + + pdata->gpio_reset = of_get_named_gpio(dt, "himax,rst-gpio", 0); + + if (!gpio_is_valid(pdata->gpio_reset)) + I(" DT:gpio_rst value is not valid\n"); + +// pdata->gpio_cs = of_get_named_gpio(dt, "himax,cs-gpio", 0); +// +// if (!gpio_is_valid(pdata->gpio_cs)) +// I(" DT:gpio_rst value is not valid\n"); +// else +// hx_gpio_cs = pdata->gpio_cs; + + pdata->gpio_3v3_en = of_get_named_gpio(dt, "himax,3v3-gpio", 0); + + if (!gpio_is_valid(pdata->gpio_3v3_en)) + I(" DT:gpio_3v3_en value is not valid\n"); + + pdata->gpio_vendor_check = of_get_named_gpio(dt, "himax,vendor_check-gpio", 0); + if (gpio_is_valid(pdata->gpio_vendor_check)) { + err = of_property_read_u32(dt, "himax,vendor_check_enable_value", &data); + if (err < 0) { + E(" DT: failed to get vendor_check_enable_value, %d\n", err); + } else { + int vendor_check_value = gpio_get_value(pdata->gpio_vendor_check); + + if (vendor_check_value != data) { + E(" DT: gpio_vendor_check is %d, himax ic is not connected\n", + vendor_check_value); + return -ENODEV; + } + } + } + + I(" DT:gpio_irq=%d, gpio_rst=%d, gpio_cs=%d, gpio_3v3_en=%d, gpio_vendor_check=%d\n", + pdata->gpio_irq, pdata->gpio_reset, pdata->gpio_cs,pdata->gpio_3v3_en, pdata->gpio_vendor_check); + +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) + lcdtype = get_lcd_attached("GET"); + if (lcdtype == 0xFFFFFF) { + E("%s: lcd is not attached\n", __func__); + return -ENODEV; + } +#endif + fw_count = of_property_count_strings(dt, "himax,fw-path"); + if (fw_count > 0) { + lcd_id_num = of_property_count_u32_elems(dt, "himax,select_lcdid"); + if (lcd_id_num != fw_count || lcd_id_num <= 0 || lcd_id_num > 10) { + lcd_id_num = 1; + } else { + int ii; + u32 lcd_id[10]; + + of_property_read_u32_array(dt, "himax,select_lcdid", lcd_id, lcd_id_num); + + for (ii = 0; ii < lcd_id_num; ii++) { + if (lcd_id[ii] == lcdtype) { + select_lcd_count = ii; + break; + } + } + + if (ii == lcd_id_num) { + E("%s: can't find matched lcd id %X\n", __func__, lcdtype); + lcd_id_num = 1; + } + } + } + I(" DT:lcdtype=%X, fw_count=%d, lcd_id_num=%d, select_lcd_count=%d\n", + lcdtype, fw_count, lcd_id_num, select_lcd_count); + + of_property_read_string_index(dt, "himax,fw-path", select_lcd_count, &pdata->i_CTPM_firmware_name); + I(" DT:fw-path= \"%s\"\n", pdata->i_CTPM_firmware_name); + + of_property_read_u32_array(dt, "himax,panel-coords", coords, lcd_id_num * 2); + pdata->abs_x_min = 0; + pdata->abs_x_max = (coords[select_lcd_count * 2] - 1); + pdata->abs_y_min = 0; + pdata->abs_y_max = (coords[select_lcd_count * 2 + 1] - 1); + I(" DT-%s:panel-coords = %d, %d, %d, %d\n", __func__, pdata->abs_x_min, + pdata->abs_x_max, pdata->abs_y_min, pdata->abs_y_max); + + if (of_property_read_u32_array(dt, "himax,display-coords", coords, lcd_id_num * 2)) { + E(" %s:Fail to read display-coords\n", __func__); + return -ENOENT; + } + pdata->screenWidth = coords[select_lcd_count * 2]; + pdata->screenHeight = coords[select_lcd_count * 2 + 1]; + I(" DT-%s:display-coords = (%d, %d)\n", __func__, pdata->screenWidth, pdata->screenHeight); + + if (of_property_read_u32_array(dt, "himax,area-size", px_zone, 3)) { + pdata->area_indicator = 48; + pdata->area_navigation = 96; + pdata->area_edge = 60; + } else { + pdata->area_indicator = px_zone[0]; + pdata->area_navigation = px_zone[1]; + pdata->area_edge = px_zone[2]; + } + I(" DT-%s: zone's size - indicator:%d, navigation:%d, edge:%d\n", + __func__, pdata->area_indicator, pdata->area_navigation, pdata->area_edge); + + if (of_property_read_u32(dt, "report_type", &data) == 0) { + pdata->protocol_type = data; + I(" DT:protocol_type=%d\n", pdata->protocol_type); + } + + if (of_property_read_string(dt, "himax,project_name", &pdata->proj_name) < 0) { + /* prevent from kernel panic due to use strcmp with null pointer */ + pdata->proj_name = "HIMAX"; + D("parsing from dt FAIL!!!!!, use default project name = %s\n", pdata->proj_name); + } + + pdata->support_aot = of_property_read_bool(dt, "support_aot"); + pdata->enable_sysinput_enabled = of_property_read_bool(dt, "enable_sysinput_enabled"); + pdata->support_dex = of_property_read_bool(dt, "support_dex"); + pdata->notify_tsp_esd = of_property_read_bool(dt, "himax,notify_tsp_esd"); + + I("%s: notify_tsp_esd:%d\n", __func__, pdata->notify_tsp_esd); + + if (of_property_read_string(dt, "himax,panel_reset", &pdata->panel_reset)) + input_err(true, ts->dev, "%s: Failed to get panel_reset name property\n", __func__); + if (of_property_read_string(dt, "himax,panel_bl_en", &pdata->panel_bl_en)) + input_err(true, ts->dev, "%s: Failed to get panel_bl_en name property\n", __func__); + if (of_property_read_string(dt, "himax,panel_vddi", &pdata->panel_vddi)) + input_err(true, ts->dev, "%s: Failed to get panel_vddi name property\n", __func__); + + himax_vk_parser(dt, pdata); + return 0; +} +EXPORT_SYMBOL(himax_parse_dt); + +static ssize_t himax_spi_sync(struct himax_ts_data *ts, struct spi_message *message) +{ + int status; + + if (atomic_read(&ts->suspend_mode) == HIMAX_STATE_POWER_OFF) { + E("%s: now IC status is OFF\n", __func__); + return -EIO; + } + +// if (gpio_is_valid(hx_gpio_cs)) +// gpio_direction_output(hx_gpio_cs, 0); + + status = spi_sync(ts->spi, message); +// if (gpio_is_valid(hx_gpio_cs)) +// gpio_direction_output(hx_gpio_cs, 1); + + if (status == 0) { + status = message->status; + if (status == 0) + status = message->actual_length; + } + return status; +} + +static int himax_spi_read(uint8_t *command, uint8_t command_len, uint8_t *data, uint32_t length, uint8_t toRetry) +{ + struct himax_ts_data *ts = private_ts; + struct spi_message message; + struct spi_transfer xfer[2]; + uint8_t *rbuff, *cbuff; + int retry; + int error; + + if (atomic_read(&ts->suspend_mode) == HIMAX_STATE_POWER_OFF) { + E("%s: now IC status is OFF\n", __func__); + return -EIO; + } + + rbuff = kzalloc(sizeof(uint8_t) * length, GFP_KERNEL); + if (!rbuff) + return -ENOMEM; + + cbuff = kzalloc(sizeof(uint8_t) * command_len, GFP_KERNEL); + if (!cbuff) { + kfree(rbuff); + return -ENOMEM; + } + + spi_message_init(&message); + memset(xfer, 0, sizeof(xfer)); + + memcpy(cbuff, command, command_len); + xfer[0].tx_buf = cbuff; + xfer[0].len = command_len; +// xfer[0].cs_change = 0; + spi_message_add_tail(&xfer[0], &message); + + xfer[1].rx_buf = rbuff; + xfer[1].len = length; +// xfer[1].cs_change = 0; + spi_message_add_tail(&xfer[1], &message); + + for (retry = 0; retry < toRetry; retry++) { +// if (gpio_is_valid(hx_gpio_cs)) { +// gpio_direction_output(hx_gpio_cs, 0); +// } + + error = spi_sync(private_ts->spi, &message); +// if (gpio_is_valid(hx_gpio_cs)) +// gpio_direction_output(hx_gpio_cs, 1); + + if (unlikely(error)) + E("SPI read error: %d\n", error); + else + break; + } + + if (retry == toRetry) { + E("%s: SPI read error retry over %d\n", + __func__, toRetry); + kfree(cbuff); + kfree(rbuff); + return -EIO; + } + memcpy(data, rbuff, length); + + kfree(cbuff); + kfree(rbuff); + + return 0; +} + +static int himax_spi_write(uint8_t *buf, uint32_t length) +{ + struct himax_ts_data *ts = private_ts; + struct spi_transfer t = { + .tx_buf = buf, + .len = length, +// .cs_change = 0, + }; + struct spi_message m; + + spi_message_init(&m); + spi_message_add_tail(&t, &m); + + if (atomic_read(&ts->suspend_mode) == HIMAX_STATE_POWER_OFF) { + E("%s: now IC status is OFF\n", __func__); + return -EIO; + } + + return himax_spi_sync(private_ts, &m); + +} + +int himax_bus_read(uint8_t command, uint8_t *data, uint32_t length, uint8_t toRetry) +{ + int result = 0; + uint8_t spi_format_buf[3]; + +// E("%s\n", __func__); + mutex_lock(&(private_ts->spi_lock)); + spi_format_buf[0] = 0xF3; + spi_format_buf[1] = command; + spi_format_buf[2] = 0x00; + + result = himax_spi_read(&spi_format_buf[0], 3, data, length, toRetry); + mutex_unlock(&(private_ts->spi_lock)); + + return result; +} +EXPORT_SYMBOL(himax_bus_read); + +int himax_bus_write(uint8_t command, uint8_t *data, uint32_t length, uint8_t toRetry) +{ + uint8_t *spi_format_buf = gBuffer; + int i = 0; + int result = 0; + + mutex_lock(&(private_ts->spi_lock)); + spi_format_buf[0] = 0xF2; + spi_format_buf[1] = command; + + for (i = 0; i < length; i++) + spi_format_buf[i + 2] = data[i]; + + result = himax_spi_write(spi_format_buf, length + 2); + mutex_unlock(&(private_ts->spi_lock)); + + return result; +} +EXPORT_SYMBOL(himax_bus_write); + +int himax_bus_write_command(uint8_t command, uint8_t toRetry) +{ + return himax_bus_write(command, NULL, 0, toRetry); +} + +int himax_bus_master_write(uint8_t *data, uint32_t length, uint8_t toRetry) +{ + uint8_t *buf; + + struct spi_transfer t; + struct spi_message m; + int result = 0; + + buf = kzalloc(length * sizeof(uint8_t), GFP_KERNEL); + if (!buf) + return -ENOMEM; + + mutex_lock(&(private_ts->spi_lock)); + memcpy(buf, data, length); + t.tx_buf = buf; + t.len = length; +// t.cs_change = 0; + + spi_message_init(&m); + spi_message_add_tail(&t, &m); + result = himax_spi_sync(private_ts, &m); + mutex_unlock(&(private_ts->spi_lock)); + + kfree(buf); + return result; +} +EXPORT_SYMBOL(himax_bus_master_write); + +void himax_int_enable(int enable) +{ + struct himax_ts_data *ts = private_ts; + int irqnum = ts->hx_irq; + + mutex_lock(&ts->irq_lock); + I("%s: Entering! irqnum = %d\n", __func__, irqnum); + if (enable == 1 && atomic_read(&ts->irq_state) == 0) { + atomic_set(&ts->irq_state, 1); + enable_irq(irqnum); + private_ts->irq_enabled = 1; + } else if (enable == 0 && atomic_read(&ts->irq_state) == 1) { + atomic_set(&ts->irq_state, 0); + disable_irq_nosync(irqnum); + private_ts->irq_enabled = 0; + } + + I("%s, %d\n", __func__, enable); + mutex_unlock(&ts->irq_lock); +} +EXPORT_SYMBOL(himax_int_enable); + +#ifdef HX_RST_PIN_FUNC +void himax_rst_gpio_set(int pinnum, uint8_t value) +{ + gpio_direction_output(pinnum, value); +} +EXPORT_SYMBOL(himax_rst_gpio_set); +#endif + +uint8_t himax_int_gpio_read(int pinnum) +{ + return gpio_get_value(pinnum); +} + +#if defined(CONFIG_HMX_DB) +static int himax_regulator_configure(struct himax_i2c_platform_data *pdata) +{ + int retval; + /* struct i2c_client *client = private_ts->client; */ + + pdata->vcc_dig = regulator_get(private_ts->dev, "vdd"); + + if (IS_ERR(pdata->vcc_dig)) { + E("%s: Failed to get regulator vdd\n", + __func__); + retval = PTR_ERR(pdata->vcc_dig); + return retval; + } + + pdata->vcc_ana = regulator_get(private_ts->dev, "avdd"); + + if (IS_ERR(pdata->vcc_ana)) { + E("%s: Failed to get regulator avdd\n", + __func__); + retval = PTR_ERR(pdata->vcc_ana); + regulator_put(pdata->vcc_dig); + return retval; + } + + return 0; +}; + +static void himax_regulator_deinit(struct himax_i2c_platform_data *pdata) +{ + I("%s: entered.\n", __func__); + + if (!IS_ERR(pdata->vcc_ana)) + regulator_put(pdata->vcc_ana); + + if (!IS_ERR(pdata->vcc_dig)) + regulator_put(pdata->vcc_dig); + + I("%s: regulator put, completed.\n", __func__); +}; + +static int himax_power_on(struct himax_i2c_platform_data *pdata, bool on) +{ + int retval; + + if (on) { + retval = regulator_enable(pdata->vcc_dig); + + if (retval) { + E("%s: Failed to enable regulator vdd\n", + __func__); + return retval; + } + + /*msleep(100);*/ + usleep_range(1000, 1001); + retval = regulator_enable(pdata->vcc_ana); + + if (retval) { + E("%s: Failed to enable regulator avdd\n", + __func__); + regulator_disable(pdata->vcc_dig); + return retval; + } + } else { + regulator_disable(pdata->vcc_dig); + regulator_disable(pdata->vcc_ana); + } + + return 0; +} + +int himax_gpio_power_config(struct himax_i2c_platform_data *pdata) +{ + int error; + /* struct i2c_client *client = private_ts->client; */ + + error = himax_regulator_configure(pdata); + + if (error) { + E("Failed to intialize hardware\n"); + goto err_regulator_not_on; + } + +#ifdef HX_RST_PIN_FUNC + + if (gpio_is_valid(pdata->gpio_reset)) { + /* configure touchscreen reset out gpio */ + error = gpio_request(pdata->gpio_reset, "hmx_reset_gpio"); + + if (error) { + E("unable to request gpio [%d]\n", pdata->gpio_reset); + goto err_regulator_on; + } + + error = gpio_direction_output(pdata->gpio_reset, 0); + + if (error) { + E("unable to set direction for gpio [%d]\n", + pdata->gpio_reset); + goto err_gpio_reset_req; + } + } + +// if (gpio_is_valid(pdata->gpio_cs)) { +// error = gpio_request(pdata->gpio_cs, "hmx_cs_gpio"); +// +// if (error) { +// E("unable to request gpio [%d]\n", pdata->gpio_cs); +// } +// gpio_direction_output(pdata->gpio_cs, 1); +// } + +#endif + error = himax_power_on(pdata, true); + + if (error) { + E("Failed to power on hardware\n"); + goto err_power_on; + } + + if (gpio_is_valid(pdata->gpio_irq)) { + /* configure touchscreen irq gpio */ + error = gpio_request(pdata->gpio_irq, "hmx_gpio_irq"); + + if (error) { + E("unable to request gpio [%d]\n", + pdata->gpio_irq); + goto err_req_irq_gpio; + } + + error = gpio_direction_input(pdata->gpio_irq); + + if (error) { + E("unable to set direction for gpio [%d]\n", + pdata->gpio_irq); + goto err_set_gpio_irq; + } + + private_ts->hx_irq = gpio_to_irq(pdata->gpio_irq); + } else { + E("irq gpio not provided\n"); + goto err_req_irq_gpio; + } + + /*msleep(20);*/ + usleep_range(2000, 2001); +#ifdef HX_RST_PIN_FUNC + + if (gpio_is_valid(pdata->gpio_reset)) { + error = gpio_direction_output(pdata->gpio_reset, 1); + + if (error) { + E("unable to set direction for gpio [%d]\n", + pdata->gpio_reset); + goto err_set_gpio_irq; + } + usleep_range(5000, 5000); + } + +#endif + return 0; +err_set_gpio_irq: + + if (gpio_is_valid(pdata->gpio_irq)) + gpio_free(pdata->gpio_irq); + +err_req_irq_gpio: + himax_power_on(pdata, false); +err_power_on: +#ifdef HX_RST_PIN_FUNC +err_gpio_reset_req: + if (gpio_is_valid(pdata->gpio_reset)) + gpio_free(pdata->gpio_reset); + +err_regulator_on: +#endif + himax_regulator_deinit(pdata); +err_regulator_not_on: + return error; +} + +#else +int himax_gpio_power_config(struct himax_i2c_platform_data *pdata) +{ + int error = 0; + /* struct i2c_client *client = private_ts->client; */ +#ifdef HX_RST_PIN_FUNC + + if (pdata->gpio_reset >= 0) { + error = gpio_request(pdata->gpio_reset, "himax-reset"); + + if (error < 0) { + E("%s: request reset pin failed\n", __func__); + goto err_gpio_reset_req; + } + + error = gpio_direction_output(pdata->gpio_reset, 0); + + if (error) { + E("unable to set direction for gpio [%d]\n", + pdata->gpio_reset); + goto err_gpio_reset_dir; + } + } + +#endif + +#ifdef HX_PON_PIN_SUPPORT + if (gpio_is_valid(pdata->gpio_pon)) { + error = gpio_request(pdata->gpio_pon, "hmx_pon_gpio"); + + if (error) { + E("unable to request scl gpio [%d]\n", pdata->gpio_pon); + goto err_gpio_pon_req; + } + + error = gpio_direction_output(pdata->gpio_pon, 0); + + I("gpio_pon LOW [%d]\n", pdata->gpio_pon); + + if (error) { + E("unable to set direction for pon gpio [%d]\n", pdata->gpio_pon); + goto err_gpio_pon_dir; + } + } +#endif +// if (gpio_is_valid(pdata->gpio_cs)) { +// error = gpio_request(pdata->gpio_cs, "hmx_cs_gpio"); +// +// if (error) { +// E("unable to request gpio [%d]\n", pdata->gpio_cs); +// } +// +// gpio_direction_output(pdata->gpio_cs, 1); +// } + + + if (pdata->gpio_3v3_en >= 0) { + error = gpio_request(pdata->gpio_3v3_en, "himax-3v3_en"); + + if (error < 0) { + E("%s: request 3v3_en pin failed\n", __func__); + goto err_gpio_3v3_req; + } + + gpio_direction_output(pdata->gpio_3v3_en, 1); + I("3v3_en set 1 get pin = %d\n", gpio_get_value(pdata->gpio_3v3_en)); + } + + if (gpio_is_valid(pdata->gpio_irq)) { + /* configure touchscreen irq gpio */ + error = gpio_request(pdata->gpio_irq, "himax_gpio_irq"); + + if (error) { + E("unable to request gpio [%d]\n", pdata->gpio_irq); + goto err_gpio_irq_req; + } + + error = gpio_direction_input(pdata->gpio_irq); + + if (error) { + E("unable to set direction for gpio [%d]\n", pdata->gpio_irq); + goto err_gpio_irq_set_input; + } + + private_ts->hx_irq = gpio_to_irq(pdata->gpio_irq); + } else { + E("irq gpio not provided\n"); + goto err_gpio_irq_req; + } +#ifdef HX_PON_PIN_SUPPORT + msleep(20); +#else + usleep_range(2000, 2001); +#endif + +#ifdef HX_RST_PIN_FUNC + + if (pdata->gpio_reset >= 0) { + error = gpio_direction_output(pdata->gpio_reset, 1); + + if (error) { + E("unable to set direction for gpio [%d]\n", + pdata->gpio_reset); + goto err_gpio_reset_set_high; + } + usleep_range(5000, 5000); + } +#endif + +#ifdef HX_PON_PIN_SUPPORT + msleep(800); + + if (gpio_is_valid(pdata->gpio_pon)) { + + error = gpio_direction_output(pdata->gpio_pon, 1); + + I("gpio_pon HIGH [%d]\n", pdata->gpio_pon); + + if (error) { + E("gpio_pon unable to set direction for gpio [%d]\n", pdata->gpio_pon); + goto err_gpio_pon_set_high; + } + } +#endif + return error; + +#ifdef HX_PON_PIN_SUPPORT +err_gpio_pon_set_high: +#endif +#ifdef HX_RST_PIN_FUNC +err_gpio_reset_set_high: +#endif +err_gpio_irq_set_input: + if (gpio_is_valid(pdata->gpio_irq)) + gpio_free(pdata->gpio_irq); +err_gpio_irq_req: + if (pdata->gpio_3v3_en >= 0) + gpio_free(pdata->gpio_3v3_en); +err_gpio_3v3_req: +#ifdef HX_PON_PIN_SUPPORT +err_gpio_pon_dir: + if (gpio_is_valid(pdata->gpio_pon)) + gpio_free(pdata->gpio_pon); +err_gpio_pon_req: +#endif +#ifdef HX_RST_PIN_FUNC +err_gpio_reset_dir: + if (pdata->gpio_reset >= 0) + gpio_free(pdata->gpio_reset); +err_gpio_reset_req: +#endif + return error; +} + +#endif + +void himax_gpio_power_deconfig(struct himax_i2c_platform_data *pdata) +{ + if (gpio_is_valid(pdata->gpio_irq)) + gpio_free(pdata->gpio_irq); + +#ifdef HX_RST_PIN_FUNC + if (gpio_is_valid(pdata->gpio_reset)) + gpio_free(pdata->gpio_reset); +#endif + +#if defined(CONFIG_HMX_DB) + himax_power_on(pdata, false); + himax_regulator_deinit(pdata); +#else + if (pdata->gpio_3v3_en >= 0) + gpio_free(pdata->gpio_3v3_en); + +#ifdef HX_PON_PIN_SUPPORT + if (gpio_is_valid(pdata->gpio_pon)) + gpio_free(pdata->gpio_pon); +#endif + +#endif +} + +static void himax_ts_isr_func(struct himax_ts_data *ts) +{ + himax_ts_work(ts); +} + +irqreturn_t himax_ts_thread(int irq, void *ptr) +{ + himax_ts_isr_func((struct himax_ts_data *)ptr); + + return IRQ_HANDLED; +} + +static void himax_ts_work_func(struct work_struct *work) +{ + struct himax_ts_data *ts = container_of(work, struct himax_ts_data, work); + + himax_ts_work(ts); +} + +int himax_int_register_trigger(void) +{ + int ret = 0; + struct himax_ts_data *ts = private_ts; + + if (ic_data->HX_INT_IS_EDGE) { + I("%s edge triiger falling\n", __func__); + ret = request_threaded_irq(ts->hx_irq, NULL, himax_ts_thread, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, HIMAX_common_NAME, ts); + } else { + I("%s level trigger low\n", __func__); + ret = request_threaded_irq(ts->hx_irq, NULL, himax_ts_thread, IRQF_TRIGGER_LOW | IRQF_ONESHOT, HIMAX_common_NAME, ts); + } + + return ret; +} + +int himax_int_en_set(void) +{ + int ret = NO_ERR; + + ret = himax_int_register_trigger(); + return ret; +} + +int himax_ts_register_interrupt(void) +{ + struct himax_ts_data *ts = private_ts; + /* struct i2c_client *client = private_ts->client; */ + int ret = 0; + + ts->irq_enabled = 0; + + /* Work functon */ + if (private_ts->hx_irq) {/*INT mode*/ + ts->use_irq = 1; + ret = himax_int_register_trigger(); + + if (ret == 0) { + ts->irq_enabled = 1; + atomic_set(&ts->irq_state, 1); + I("%s: irq enabled at gpio: %d\n", __func__, private_ts->hx_irq); +#ifdef HX_SMART_WAKEUP + irq_set_irq_wake(private_ts->hx_irq, 1); +#endif + } else { + ts->use_irq = 0; + E("%s: request_irq failed\n", __func__); + } + } else { + I("%s: private_ts->hx_irq is empty, use polling mode.\n", __func__); + } + + if (!ts->use_irq) {/*if use polling mode need to disable HX_ESD_RECOVERY function*/ + ts->himax_wq = create_singlethread_workqueue("himax_touch"); + INIT_WORK(&ts->work, himax_ts_work_func); + hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + ts->timer.function = himax_ts_timer_func; + hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL); + I("%s: polling mode enabled\n", __func__); + } + + return ret; +} + +int himax_ts_unregister_interrupt(void) +{ + struct himax_ts_data *ts = private_ts; + int ret = 0; + + I("%s: entered.\n", __func__); + + /* Work functon */ + if (private_ts->hx_irq && ts->use_irq) {/*INT mode*/ +#ifdef HX_SMART_WAKEUP + irq_set_irq_wake(ts->hx_irq, 0); +#endif + free_irq(ts->hx_irq, ts); + I("%s: irq disabled at qpio: %d\n", __func__, private_ts->hx_irq); + } + + if (!ts->use_irq) {/*if use polling mode need to disable HX_ESD_RECOVERY function*/ + hrtimer_cancel(&ts->timer); + cancel_work_sync(&ts->work); + if (ts->himax_wq != NULL) + destroy_workqueue(ts->himax_wq); + I("%s: polling mode destroyed", __func__); + } + + return ret; +} + +static int himax_common_suspend(struct device *dev) +{ + struct himax_ts_data *ts = dev_get_drvdata(dev); + + I("%s: enter\n", __func__); +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) + if (!ts->initialized) + return -ECANCELED; +#endif + himax_chip_common_suspend(ts); + return 0; +} +#ifndef HX_CONTAINER_SPEED_UP +static int himax_common_resume(struct device *dev) +{ + struct himax_ts_data *ts = dev_get_drvdata(dev); + + I("%s: enter\n", __func__); +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) + /* + * wait until device resume for TDDI + * TDDI: Touch and display Driver IC + */ + if (!ts->initialized) { + if (himax_chip_common_init()) + return -ECANCELED; + } +#endif + himax_chip_common_resume(ts); + return 0; +} +#endif + +static int himax_reboot_notifier(struct notifier_block *this, + unsigned long code, void *unused) +{ + struct himax_ts_data *ts = container_of(this, struct himax_ts_data, reboot_notifier); + + I("%s %s: enter\n", HIMAX_LOG_TAG, __func__); + + himax_chip_common_suspend(ts); + + I("%s %s: exit\n", HIMAX_LOG_TAG, __func__); + + return NOTIFY_DONE; +} + +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) || IS_ENABLED(CONFIG_MUIC_NOTIFIER) +int otg_flag = 0; +#endif + +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) +static int tsp_ccic_notification(struct notifier_block *nb, + unsigned long action, void *data) +{ + PD_NOTI_USB_STATUS_TYPEDEF usb_status = + *(PD_NOTI_USB_STATUS_TYPEDEF *) data; + + switch (usb_status.drp) { + case USB_STATUS_NOTIFY_ATTACH_DFP: + otg_flag = 1; + I("%s : otg_flag 1\n", __func__); + break; + case USB_STATUS_NOTIFY_DETACH: + otg_flag = 0; + I("%s : otg_flag 0\n", __func__); + break; + default: + break; + } + + return 0; +} +#else +#if IS_ENABLED(CONFIG_MUIC_NOTIFIER) +static int tsp_muic_notification(struct notifier_block *nb, + unsigned long action, void *data) +{ + muic_attached_dev_t attached_dev = *(muic_attached_dev_t *)data; + + switch (action) { + case MUIC_NOTIFY_CMD_DETACH: + case MUIC_NOTIFY_CMD_LOGICALLY_DETACH: + otg_flag = 0; + I("%s : otg_flag 0\n", __func__); + break; + case MUIC_NOTIFY_CMD_ATTACH: + case MUIC_NOTIFY_CMD_LOGICALLY_ATTACH: + if (attached_dev == ATTACHED_DEV_OTG_MUIC) { + otg_flag = 1; + I("%s : otg_flag 1\n", __func__); + } + break; + default: + break; + } + + return 0; +} +#endif +#endif + +#if IS_ENABLED(CONFIG_VBUS_NOTIFIER) +static int tsp_vbus_notification(struct notifier_block *nb, + unsigned long cmd, void *data) +{ + vbus_status_t vbus_type = *(vbus_status_t *) data; + + I("%s cmd=%lu, vbus_type=%d\n", __func__, cmd, vbus_type); + + switch (vbus_type) { + case STATUS_VBUS_HIGH: + I("%s : attach\n", __func__); +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) || IS_ENABLED(CONFIG_MUIC_NOTIFIER) + if (!otg_flag) +#endif +#if defined(HX_USB_DETECT_GLOBAL) + { + USB_detect_flag = true; + himax_cable_detect_func(true); + } +#endif + break; + case STATUS_VBUS_LOW: + I("%s : detach\n", __func__); +#if defined(HX_USB_DETECT_GLOBAL) + USB_detect_flag = false; + himax_cable_detect_func(false); +#endif + break; + default: + break; + } + return 0; +} +#endif + +int himax_chip_common_probe(struct spi_device *spi) +{ + struct himax_ts_data *ts; + int ret = 0; + + input_info(true, &spi->dev, "%s:Enter\n", __func__); + + if (spi->master->flags & SPI_MASTER_HALF_DUPLEX) { + dev_err(&spi->dev, + "%s: Full duplex not supported by host\n", __func__); + return -EIO; + } + + gBuffer = kzalloc(sizeof(uint8_t) * (HX_MAX_WRITE_SZ + 6), GFP_KERNEL); + if (gBuffer == NULL) { + KE("%s: allocate gBuffer failed\n", __func__); + ret = -ENOMEM; + goto err_alloc_gbuffer_failed; + } + + ts = kzalloc(sizeof(struct himax_ts_data), GFP_KERNEL); + if (ts == NULL) { + KE("%s: allocate himax_ts_data failed\n", __func__); + ret = -ENOMEM; + goto err_alloc_data_failed; + } + + private_ts = ts; + spi->bits_per_word = 8; + spi->mode = SPI_MODE_3; +// spi->chip_select = 0; + + ts->spi = spi; + mutex_init(&(ts->spi_lock)); + ts->dev = &spi->dev; + dev_set_drvdata(&spi->dev, ts); + spi_set_drvdata(spi, ts); + + ret = spi_setup(spi); + KE("%s: spi_setup: %d\n", __func__, ret); + + ts->initialized = false; + ret = himax_chip_common_init(); + if (ret < 0) + goto err_alloc_data_failed; + + ts->pdata->suspend = himax_common_suspend; + ts->pdata->resume = himax_common_resume; + + ts->reboot_notifier.notifier_call = himax_reboot_notifier; + register_reboot_notifier(&ts->reboot_notifier); + +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) + manager_notifier_register(&ts->ccic_nb, tsp_ccic_notification, + MANAGER_NOTIFY_PDIC_USB); +#else +#if IS_ENABLED(CONFIG_MUIC_NOTIFIER) + muic_notifier_register(&ts->muic_nb, tsp_muic_notification, + MUIC_NOTIFY_DEV_CHARGER); +#endif +#endif +#if IS_ENABLED(CONFIG_VBUS_NOTIFIER) + vbus_notifier_register(&ts->vbus_nb, tsp_vbus_notification, + VBUS_NOTIFY_DEV_CHARGER); +#endif + + return 0; + +err_alloc_data_failed: + kfree(gBuffer); +err_alloc_gbuffer_failed: + return ret; +} + +int himax_chip_common_remove(struct spi_device *spi) +{ + struct himax_ts_data *ts = spi_get_drvdata(spi); + + if (g_hx_chip_inited) + himax_chip_common_deinit(); + + ts->spi = NULL; + /* spin_unlock_irq(&ts->spi_lock); */ + spi_set_drvdata(spi, NULL); + kfree(gBuffer); + + KI("%s: completed.\n", __func__); + + return 0; +} + +static int himax_pm_suspend(struct device *dev) +{ + struct himax_ts_data *ts = dev_get_drvdata(dev); + + input_info(true, ts->dev, "%s: called!\n", __func__); + reinit_completion(&ts->resume_done); + + return 0; +} + +static int himax_pm_resume(struct device *dev) +{ + struct himax_ts_data *ts = dev_get_drvdata(dev); + + input_info(true, ts->dev, "%s: called!\n", __func__); + complete_all(&ts->resume_done); + + return 0; +} + +#if IS_ENABLED(CONFIG_PM) +static const struct dev_pm_ops himax_common_pm_ops = { + .suspend = himax_pm_suspend, + .resume = himax_pm_resume, +}; +#endif + +#if IS_ENABLED(CONFIG_OF) +static const struct of_device_id himax_match_table[] = { + {.compatible = "himax,hxcommon" }, + {}, +}; +#else +#define himax_match_table NULL +#endif + +static struct spi_driver himax_common_driver = { + .driver = { + .name = HIMAX_common_NAME, + .owner = THIS_MODULE, + .of_match_table = himax_match_table, +#if IS_ENABLED(CONFIG_PM) + .pm = &himax_common_pm_ops, +#endif + }, + .probe = himax_chip_common_probe, + .remove = himax_chip_common_remove, +}; + +static int __init himax_common_init(void) +{ + KI("Himax common touch panel driver init: spi\n"); + D("Himax check double loading\n"); + if (g_mmi_refcnt++ > 0) { + KI("Himax driver has been loaded! ignoring....\n"); + return 0; + } + spi_register_driver(&himax_common_driver); + input_log_fix(); + + return 0; +} + +static void __exit himax_common_exit(void) +{ +#if IS_ENABLED(CONFIG_QGKI) + if (spi) { + spi_unregister_device(spi); + spi = NULL; + } + spi_unregister_driver(&himax_common_driver); +#endif +} + +module_init(himax_common_init); +module_exit(himax_common_exit); + +MODULE_DESCRIPTION("Himax_common driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/himax/hx831xx/himax_platform_SPI.h b/drivers/input/touchscreen/himax/hx831xx/himax_platform_SPI.h new file mode 100755 index 000000000000..d2509fe70439 --- /dev/null +++ b/drivers/input/touchscreen/himax/hx831xx/himax_platform_SPI.h @@ -0,0 +1,170 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Himax Android Driver Sample Code for QCT platform + * + * Copyright (C) 2019 Himax Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef HIMAX_PLATFORM_H +#define HIMAX_PLATFORM_H + +#include +#include +#include +#include +#include +#include +#include +#if defined(CONFIG_HMX_DB) + #include +#endif + +#define HIMAX_I2C_RETRY_TIMES 3 + +#define HIMAX_LOG_TAG "[HXTP]" + +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_DEBUG) +#define D(x...) pr_debug("[HXTP] " x) +#if IS_ENABLED(CONFIG_TOUCHSCREEN_HIMAX_SPI) +#define I(x...) input_info(true, &private_ts->spi->dev, "[HXTP] " x) +#define E(x...) input_err(true, &private_ts->spi->dev, "[HXTP] " x) +#define RI(x...) input_raw_info(true, &private_ts->spi->dev, "[HXTP] " x) +#else +#define I(x...) pr_info("[HXTP] " x) +#define E(x...) pr_err("[HXTP][ERROR] " x) +#define RI(x...) pr_info("[HXTP] " x) +#endif +#define KI(x...) pr_info("[HXTP] " x) +#define W(x...) pr_warn("[HXTP][WARNING] " x) +#define KE(x...) pr_err("[HXTP][ERROR] " x) +#define DIF(x...) \ +do { \ + if (debug_flag) \ + pr_debug("[HXTP][DEBUG] " x) \ + } while (0) +#else +#define D(x...) +#define I(x...) +#define W(x...) +#define E(x...) +#define DIF(x...) +#define RI(x...) +#endif + +#if defined(CONFIG_HMX_DB) + /* Analog voltage @2.7 V */ + #define HX_VTG_MIN_UV 2700000 + #define HX_VTG_MAX_UV 3300000 + #define HX_ACTIVE_LOAD_UA 15000 + #define HX_LPM_LOAD_UA 10 + /* Digital voltage @1.8 V */ + #define HX_VTG_DIG_MIN_UV 1800000 + #define HX_VTG_DIG_MAX_UV 1800000 + #define HX_ACTIVE_LOAD_DIG_UA 10000 + #define HX_LPM_LOAD_DIG_UA 10 + + #define HX_I2C_VTG_MIN_UV 1800000 + #define HX_I2C_VTG_MAX_UV 1800000 + #define HX_I2C_LOAD_UA 10000 + #define HX_I2C_LPM_LOAD_UA 10 +#endif + +#define HIMAX_common_NAME "himax_tp" +#define HIMAX_I2C_ADDR 0x48 +#define INPUT_DEV_NAME "himax-touchscreen" + +struct himax_i2c_platform_data { + int abs_x_min; + int abs_x_max; + int abs_x_fuzz; + int abs_y_min; + int abs_y_max; + int abs_y_fuzz; + int abs_pressure_min; + int abs_pressure_max; + int abs_pressure_fuzz; + int abs_width_min; + int abs_width_max; + int screenWidth; + int screenHeight; + u32 area_indicator; + u32 area_navigation; + u32 area_edge; + uint8_t fw_version; + uint8_t tw_id; + uint8_t powerOff3V3; + uint8_t cable_config[2]; + uint8_t protocol_type; + int gpio_irq; + int gpio_reset; + int gpio_cs; + int gpio_3v3_en; + int gpio_vendor_check; + int gpio_pon; + int (*power)(int on); + void (*reset)(void); + struct himax_virtual_key *virtual_key; + struct kobject *vk_obj; + struct kobj_attribute *vk2Use; + int hx_config_size; + bool support_aot; + bool enable_sysinput_enabled; + bool support_dex; + bool notify_tsp_esd; + + const char *panel_reset; + const char *panel_bl_en; + const char *panel_vddi; + + const char *i_CTPM_firmware_name; + const char *proj_name; + +#if defined(CONFIG_HMX_DB) + bool i2c_pull_up; + bool digital_pwr_regulator; + int reset_gpio; + u32 reset_gpio_flags; + int irq_gpio; + u32 irq_gpio_flags; + struct regulator *vcc_ana; /* For Dragon Board */ + struct regulator *vcc_dig; /* For Dragon Board */ + struct regulator *vcc_i2c; /* For Dragon Board */ + +#endif + + int (*suspend)(struct device *dev); + int (*resume)(struct device *dev); +}; + + +extern struct himax_ic_data *ic_data; +extern struct himax_ts_data *private_ts; +int himax_chip_common_init(void); +void himax_chip_common_deinit(void); + +extern void himax_ts_work(struct himax_ts_data *ts); +enum hrtimer_restart himax_ts_timer_func(struct hrtimer *timer); +extern int himax_bus_read(uint8_t command, uint8_t *data, uint32_t length, uint8_t toRetry); +extern int himax_bus_write(uint8_t command, uint8_t *data, uint32_t length, uint8_t toRetry); +extern int himax_bus_write_command(uint8_t command, uint8_t toRetry); +extern int himax_bus_master_write(uint8_t *data, uint32_t length, uint8_t toRetry); +extern void himax_int_enable(int enable); +extern int himax_ts_register_interrupt(void); +int himax_ts_unregister_interrupt(void); +extern uint8_t himax_int_gpio_read(int pinnum); + +extern int himax_gpio_power_config(struct himax_i2c_platform_data *pdata); +void himax_gpio_power_deconfig(struct himax_i2c_platform_data *pdata); + +#if !IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) +extern unsigned int lcdtype; +#endif +#endif diff --git a/drivers/input/w9019/Kconfig b/drivers/input/w9019/Kconfig new file mode 100755 index 000000000000..7fcf8e1af27e --- /dev/null +++ b/drivers/input/w9019/Kconfig @@ -0,0 +1,15 @@ +# +# Wacom configuration +# + +config EPEN_WACOM_W9019 + tristate "Wacom W9019 penabled i2c touchscreen" + depends on I2C + help + Say Y here if you have an Wacom G10PM penabled i2c touchscreen + connected to your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called wacom_W9019. \ No newline at end of file diff --git a/drivers/input/w9019/Makefile b/drivers/input/w9019/Makefile new file mode 100755 index 000000000000..0caee0881a7a --- /dev/null +++ b/drivers/input/w9019/Makefile @@ -0,0 +1,4 @@ +obj-$(CONFIG_EPEN_WACOM_W9019) += w9019.o +w9019-objs := wacom_i2c.o wacom_i2c_sec.o w9019_flash.o + +ccflags-y += -Wformat diff --git a/drivers/input/w9019/w9019_flash.c b/drivers/input/w9019/w9019_flash.c new file mode 100755 index 000000000000..e2d03b5ecf9d --- /dev/null +++ b/drivers/input/w9019/w9019_flash.c @@ -0,0 +1,713 @@ +/* + * Wacom Penabled Driver for I2C + * + * Copyright (c) 2011-2014 Tatsunosuke Tobita, Wacom. + * + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software + * Foundation; either version of 2 of the License, + * or (at your option) any later version. + */ + +#include "w9019_flash.h" +#include "wacom_dev.h" + +static bool wacom_i2c_set_feature(struct wacom_i2c *wac_i2c, u8 report_id, + unsigned int buf_size, u8 *data, u16 cmdreg, + u16 datareg) +{ + int i, ret = -1; + int total = SFEATURE_SIZE + buf_size; + u8 *sFeature = NULL; + bool bRet = false; + + sFeature = kzalloc(sizeof(u8) * total, GFP_KERNEL); + if (!sFeature) { + input_err(true, &wac_i2c->client->dev, + "%s cannot preserve memory\n", __func__); + goto out; + } + memset(sFeature, 0, sizeof(u8) * total); + + sFeature[0] = (u8)(cmdreg & 0x00ff); + sFeature[1] = (u8)((cmdreg & 0xff00) >> 8); + sFeature[2] = (RTYPE_FEATURE << 4) | report_id; + sFeature[3] = CMD_SET_FEATURE; + sFeature[4] = (u8)(datareg & 0x00ff); + sFeature[5] = (u8)((datareg & 0xff00) >> 8); + + if ( (buf_size + 2) > 255) { + sFeature[6] = (u8)((buf_size + 2) & 0x00ff); + sFeature[7] = (u8)(( (buf_size + 2) & 0xff00) >> 8); + } else { + sFeature[6] = (u8)(buf_size + 2); + sFeature[7] = (u8)(0x00); + } + + for (i = 0; i < buf_size; i++) + sFeature[i + SFEATURE_SIZE] = *(data + i); + + ret = w9019_i2c_send_boot(wac_i2c, sFeature, total); + if (ret != total) { + input_err(true, &wac_i2c->client->dev, + "Sending Set_Feature failed sent bytes: %d\n", ret); + goto err; + } + + usleep_range(60, 61); + bRet = true; + err: + kfree(sFeature); + sFeature = NULL; + + out: + return bRet; +} + +static bool wacom_i2c_get_feature(struct wacom_i2c *wac_i2c, u8 report_id, + unsigned int buf_size, u8 *data, u16 cmdreg, + u16 datareg, int delay) +{ + int ret = -1; + u8 *recv = NULL; + bool bRet = false; + u8 gFeature[] = { + (u8)(cmdreg & 0x00ff), + (u8)((cmdreg & 0xff00) >> 8), + (RTYPE_FEATURE << 4) | report_id, + CMD_GET_FEATURE, + (u8)(datareg & 0x00ff), + (u8)((datareg & 0xff00) >> 8) + }; + + /*"+ 2", adding 2 more spaces for organizeing again later in the passed data, "data"*/ + recv = kzalloc(sizeof(u8) * (buf_size + 0), GFP_KERNEL); + if (!recv) { + input_err(true, &wac_i2c->client->dev, + "%s cannot preserve memory\n", __func__); + goto out; + } + + memset(recv, 0, sizeof(u8) * (buf_size + 0)); /*Append 2 bytes for length low and high of the byte*/ + + ret = w9019_i2c_send_boot(wac_i2c, gFeature, GFEATURE_SIZE); + if (ret != GFEATURE_SIZE) { + input_err(true, &wac_i2c->client->dev, + "%s Sending Get_Feature failed; sent bytes: %d\n", + __func__, ret); + goto err; + } + + udelay(delay); + + ret = w9019_i2c_recv_boot(wac_i2c, recv, buf_size); + if (ret != buf_size) { + input_err(true, &wac_i2c->client->dev, + "%s Receiving data failed; received bytes: %d\n", __func__, ret); + goto err; + } + + /*Coppy data pointer, subtracting the first two bytes of the length*/ + memcpy(data, (recv + 0), buf_size); + + bRet = true; + err: + kfree(recv); + recv = NULL; + + out: + return bRet; +} + +static int wacom_flash_cmd(struct wacom_i2c *wac_i2c) +{ + u8 command[10]; + int len = 0; + int ret = -1; + + command[len++] = 0x0d; + command[len++] = FLASH_START0; + command[len++] = FLASH_START1; + command[len++] = FLASH_START2; + command[len++] = FLASH_START3; + command[len++] = FLASH_START4; + command[len++] = FLASH_START5; + command[len++] = 0x0d; + + ret = w9019_i2c_send_boot(wac_i2c, command, len); + if(ret < 0){ + input_err(true, &wac_i2c->client->dev, "Sending flash command failed\n"); + return -EXIT_FAIL; + } + + msleep(300); + + return 0; +} + +int flash_query_w9019(struct wacom_i2c *wac_i2c) +{ + bool bRet = false; + u8 command[CMD_SIZE]; + u8 response[RSP_SIZE]; + int ECH, len = 0; + + command[len++] = BOOT_CMD_REPORT_ID; /* Report:ReportID */ + command[len++] = BOOT_QUERY; /* Report:Boot Query command */ + command[len++] = ECH = 7; /* Report:echo */ + + bRet = wacom_i2c_set_feature(wac_i2c, REPORT_ID_1, len, command, COMM_REG, DATA_REG); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to set feature\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + bRet = wacom_i2c_get_feature(wac_i2c, REPORT_ID_2, RSP_SIZE, response, COMM_REG, DATA_REG, (10 * 1000)); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to get feature\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + if ( (response[3] != QUERY_CMD) || + (response[4] != ECH) ) { + input_err(true, &wac_i2c->client->dev, + "%s res3:%x res4:%x\n", __func__, response[3], response[4]); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + if (response[5] != QUERY_RSP) { + input_err(true, &wac_i2c->client->dev, + "%s res5:%x\n", __func__, response[5]); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + input_info(true, &wac_i2c->client->dev, "QUERY SUCCEEDED\n"); + return 0; +} + +static bool flash_blver_w9019(struct wacom_i2c *wac_i2c, int *blver) +{ + bool bRet = false; + u8 command[CMD_SIZE]; + u8 response[RSP_SIZE]; + int ECH, len = 0; + + command[len++] = BOOT_CMD_REPORT_ID; /* Report:ReportID */ + command[len++] = BOOT_BLVER; /* Report:Boot Version command */ + command[len++] = ECH = 7; /* Report:echo */ + + bRet = wacom_i2c_set_feature(wac_i2c, REPORT_ID_1, len, command, COMM_REG, DATA_REG); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to set feature1\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + bRet = wacom_i2c_get_feature(wac_i2c, REPORT_ID_2, RSP_SIZE, response, COMM_REG, DATA_REG, (10 * 1000)); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s 2 failed to set feature\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + if ( (response[3] != BOOT_CMD) || + (response[4] != ECH) ) { + input_err(true, &wac_i2c->client->dev, + "%s res3:%x res4:%x\n", __func__, response[3], response[4]); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + if (response[5] != QUERY_RSP) { + input_err(true, &wac_i2c->client->dev, + "%s res5:%x\n", __func__, response[5]); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + *blver = (int)response[5]; + + return true; +} + +static bool flash_mputype_w9019(struct wacom_i2c *wac_i2c, int *pMpuType) +{ + bool bRet = false; + u8 command[CMD_SIZE]; + u8 response[RSP_SIZE]; + int ECH, len = 0; + + command[len++] = BOOT_CMD_REPORT_ID; /* Report:ReportID */ + command[len++] = BOOT_MPU; /* Report:Boot Query command */ + command[len++] = ECH = 7; /* Report:echo */ + + bRet = wacom_i2c_set_feature(wac_i2c, REPORT_ID_1, len, command, COMM_REG, DATA_REG); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to set feature\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + bRet = wacom_i2c_get_feature(wac_i2c, REPORT_ID_2, RSP_SIZE, response, COMM_REG, DATA_REG, (10 * 1000)); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to get feature\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + if ( (response[3] != MPU_CMD) || + (response[4] != ECH) ) { + input_err(true, &wac_i2c->client->dev, + "%s res3:%x res4:%x\n", __func__, response[3], response[4]); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + *pMpuType = (int)response[5]; + return true; +} + +static bool flash_end_w9019(struct wacom_i2c *wac_i2c) +{ + bool bRet = false; + u8 command[CMD_SIZE]; + int ECH, len = 0; + + command[len++] = BOOT_CMD_REPORT_ID; + command[len++] = BOOT_EXIT; + command[len++] = ECH = 7; + + bRet = wacom_i2c_set_feature(wac_i2c, REPORT_ID_1, len, command, COMM_REG, DATA_REG); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to set feature 1\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + return true; +} + + +#ifdef PARTIAL_ERASE +static bool erase_datamem(struct wacom_i2c *wac_i2c) +{ + bool bRet = false; + u8 command[CMD_SIZE]; + u8 response[BOOT_RSP_SIZE]; + unsigned char sum = 0; + unsigned char cmd_chksum; + int ECH, j; + int len = 0; + + command[len++] = BOOT_CMD_REPORT_ID; /* Report:ReportID */ + command[len++] = BOOT_ERASE_DATAMEM; /* Report:erase datamem command */ + command[len++] = ECH = BOOT_ERASE_DATAMEM; /* Report:echo */ + command[len++] = DATAMEM_SECTOR0; /* Report:erased block No. */ + + /*Preliminarily store the data that cannnot appear here, but in wacom_set_feature()*/ + sum = 0; + sum += 0x05; + sum += 0x07; + for (j = 0; j < 4; j++) + sum += command[j]; + + cmd_chksum = ~sum + 1; /* Report:check sum */ + command[len++] = cmd_chksum; + + bRet = wacom_i2c_set_feature(wac_i2c, REPORT_ID_1, len, command, COMM_REG, DATA_REG); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, "%s failed to set feature 1\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + udelay(50); + + do { + + bRet = wacom_i2c_get_feature(wac_i2c, REPORT_ID_2, BOOT_RSP_SIZE, response, COMM_REG, DATA_REG, 50); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, "%s failed to get feature\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + if ((response[3] != 0x0e || response[4] != ECH) || (response[5] != 0xff && response[5] != 0x00)) { + input_err(true, &wac_i2c->client->dev, "%s failing resp3: %x resp4: %x resp5: %x\n", + __func__, response[3], response[4], response[5]); + return false; + } + + } while (response[3] == 0x0e && response[4] == ECH && response[5] == 0xff); + + + return true; +} + +static bool erase_codemem(struct wacom_i2c *wac_i2c, int *eraseBlock, int num) +{ + bool bRet = false; + u8 command[CMD_SIZE]; + u8 response[BOOT_RSP_SIZE]; + unsigned char sum = 0; + unsigned char cmd_chksum; + int ECH, len = 0; + int i, j; + + for (i = 0; i < num; i++) { + + len = 0; + command[len++] = BOOT_CMD_REPORT_ID; /* Report:ReportID */ + command[len++] = BOOT_ERASE_FLASH; /* Report:erase command */ + command[len++] = ECH = i; /* Report:echo */ + command[len++] = *eraseBlock; /* Report:erased block No. */ + eraseBlock++; + + /*Preliminarily store the data that cannnot appear here, but in wacom_set_feature()*/ + sum = 0; + sum += 0x05; + sum += 0x07; + for (j = 0; j < 4; j++) + sum += command[j]; + + cmd_chksum = ~sum + 1; /* Report:check sum */ + command[len++] = cmd_chksum; + + bRet = wacom_i2c_set_feature(wac_i2c, REPORT_ID_1, len, command, COMM_REG, DATA_REG); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, "%s failed to set feature\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + udelay(50); + + do { + + bRet = wacom_i2c_get_feature(wac_i2c, REPORT_ID_2, BOOT_RSP_SIZE, response, COMM_REG, DATA_REG, 50); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, "%s failed to get feature\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + if ((response[3] != 0x00 || response[4] != ECH) || (response[5] != 0xff && response[5] != 0x00)) { + input_err(true, &wac_i2c->client->dev, "%s failing resp3: %x resp4: %x resp5: %x\n", + __func__, response[3], response[4], response[5]); + return false; + } + + } while (response[3] == 0x00 && response[4] == ECH && response[5] == 0xff); + } + + return true; +} + +static bool flash_erase_w9019(struct wacom_i2c *wac_i2c, int *eraseBlock, int num) +{ + bool ret; + + ret = erase_datamem(wac_i2c); + if (!ret) { + input_err(true, &wac_i2c->client->dev, "%s erasing datamem failed\n", __func__); + return false; + } + + ret = erase_codemem(wac_i2c, eraseBlock, num); + if (!ret) { + input_err(true, &wac_i2c->client->dev, "%s erasing codemem failed\n", __func__); + return false; + } + + return true; +} +#else +static bool flash_erase_all(struct wacom_i2c *wac_i2c) +{ + bool bRet = false; + u8 command[BOOT_CMD_SIZE]; + u8 response[BOOT_RSP_SIZE]; + int i, len = 0; + int ECH, sum = 0; + + command[len++] = 7; + command[len++] = 16; + command[len++] = ECH = 2; + command[len++] = 3; + + /*Preliminarily store the data that cannnot appear here, but in wacom_set_feature()*/ + sum += 0x05; + sum += 0x07; + for (i = 0; i < len; i++) + sum += command[i]; + + command[len++] = ~sum + 1; + + bRet = wacom_i2c_set_feature(wac_i2c, REPORT_ID_1, len, command, COMM_REG, DATA_REG); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, "%s failed to set feature\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + do { + + + bRet = wacom_i2c_get_feature(wac_i2c, REPORT_ID_2, BOOT_RSP_SIZE, response, COMM_REG, DATA_REG, 0); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, "%s failed to set feature\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + if (!(response[3] & 0x10) || !(response[4] & ECH) || + (!(response[5] & 0xff) && response[5] & 0x00)) { + input_err(true, &wac_i2c->client->dev, "%s failing 4 resp1: %x resp2: %x resp3: %x\n", + __func__, response[3], response[4], response[5]); + return false; + } + + msleep(200); + + } while(response[3] == 0x10 && response[4] == ECH && response[5] == 0xff); + + return true; +} +#endif + +static bool flash_write_block_w9019(struct wacom_i2c *wac_i2c, char *flash_data, + unsigned long ulAddress, u8 *pcommand_id, int *ECH) +{ + const int MAX_COM_SIZE = (8 + FLASH_BLOCK_SIZE + 2); //8: num of command[0] to command[7] + //FLASH_BLOCK_SIZE: unit to erase the block + //Num of Last 2 checksums + bool bRet = false; + u8 command[300]; + unsigned char sum = 0; + int i; + + command[0] = BOOT_CMD_REPORT_ID; /* Report:ReportID */ + command[1] = BOOT_WRITE_FLASH; /* Report:program command */ + command[2] = *ECH = ++(*pcommand_id); /* Report:echo */ + command[3] = ulAddress & 0x000000ff; + command[4] = (ulAddress & 0x0000ff00) >> 8; + command[5] = (ulAddress & 0x00ff0000) >> 16; + command[6] = (ulAddress & 0xff000000) >> 24; /* Report:address(4bytes) */ + command[7] = 8; /* Report:size(8*8=64) */ + + /*Preliminarily store the data that cannnot appear here, but in wacom_set_feature()*/ + sum = 0; + sum += 0x05; + sum += 0x4c; + for (i = 0; i < 8; i++) + sum += command[i]; + command[MAX_COM_SIZE - 2] = ~sum + 1; /* Report:command checksum */ + + sum = 0; + for (i = 8; i < (FLASH_BLOCK_SIZE + 8); i++){ + command[i] = flash_data[ulAddress+(i - 8)]; + sum += flash_data[ulAddress+(i - 8)]; + } + + command[MAX_COM_SIZE - 1] = ~sum+1; /* Report:data checksum */ + + /*Subtract 8 for the first 8 bytes*/ + bRet = wacom_i2c_set_feature(wac_i2c, REPORT_ID_1, (BOOT_CMD_SIZE + 4 - 8), command, COMM_REG, DATA_REG); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, "%s failed to set feature\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + udelay(50); + + return true; +} + +static bool flash_write_w9019(struct wacom_i2c *wac_i2c, unsigned char *flash_data, + unsigned long start_address, unsigned long *max_address) +{ + bool bRet = false; + u8 command_id = 0; + u8 response[BOOT_RSP_SIZE]; + int i, j, ECH = 0, ECH_len = 0; + int ECH_ARRAY[3]; + unsigned long ulAddress; + + j = 0; + for (ulAddress = start_address; ulAddress < *max_address; ulAddress += FLASH_BLOCK_SIZE) { + for (i = 0; i < FLASH_BLOCK_SIZE; i++) { + if (flash_data[ulAddress+i] != 0xFF) + break; + } + if (i == (FLASH_BLOCK_SIZE)) + continue; + + bRet = flash_write_block_w9019(wac_i2c, flash_data, ulAddress, &command_id, &ECH); + if(!bRet) + return false; + if (ECH_len == 3) + ECH_len = 0; + + ECH_ARRAY[ECH_len++] = ECH; + if (ECH_len == 3) { + for (j = 0; j < 3; j++) { + do { + + bRet = wacom_i2c_get_feature(wac_i2c, REPORT_ID_2, BOOT_RSP_SIZE, response, COMM_REG, DATA_REG, 50); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to set feature\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + if ((response[3] != 0x01 || response[4] != ECH_ARRAY[j]) || (response[5] != 0xff && response[5] != 0x00)) { + input_err(true, &wac_i2c->client->dev, + "%s mismatched echo array addr: %ld res:%x\n", + __func__, ulAddress, response[5]); + return false; + } + } while (response[3] == 0x01 && response[4] == ECH_ARRAY[j] && response[5] == 0xff); + } + } + } + return true; +} + +static int wacom_i2c_flash_w9019(struct wacom_i2c *wac_i2c, unsigned char *fw_data) +{ + bool bRet = false; + int result, i; + int eraseBlock[200], eraseBlockNum; + int iBLVer = 0, iMpuType = 0; + unsigned long max_address = 0; /* Max.address of Load data */ + unsigned long start_address = 0x2000; /* Start.address of Load data */ + + wac_i2c->bl_mpu_match = true; + + /*Obtain boot loader version*/ + if (!flash_blver_w9019(wac_i2c, &iBLVer)) { + input_err(true, &wac_i2c->client->dev, + "%s failed to get Boot Loader version\n", __func__); + return -EXIT_FAIL_GET_BOOT_LOADER_VERSION; + } + input_info(true, &wac_i2c->client->dev, "BL version: %x\n", iBLVer); + + /*Obtain MPU type: this can be manually done in user space*/ + if (!flash_mputype_w9019(wac_i2c, &iMpuType)) { + input_err(true, &wac_i2c->client->dev, + "%s failed to get MPU type\n", __func__); + wac_i2c->bl_mpu_match = false; + return -EXIT_FAIL_GET_MPU_TYPE; + } + if (iMpuType != MPU_W9019) { + input_err(true, &wac_i2c->client->dev, + "%s: MPU is not W9019 : %x\n", __func__, iMpuType); + wac_i2c->bl_mpu_match = false; + return -EXIT_FAIL_GET_MPU_TYPE; + } + input_info(true, &wac_i2c->client->dev, "MPU type: %x\n", iMpuType); + + /*-----------------------------------*/ + /*Flashing operation starts from here*/ + + /*Set start and end address and block numbers*/ + eraseBlockNum = 0; + start_address = W9019_START_ADDR; + max_address = W9019_END_ADDR; + for (i = BLOCK_NUM; i >= 8; i--) { + eraseBlock[eraseBlockNum] = i; + eraseBlockNum++; + } + + msleep(300); + + /*Erase the old program*/ + input_info(true, &wac_i2c->client->dev, + "epen - %s erasing the current firmware\n", __func__); +#ifdef PARTIAL_ERASE + bRet = flash_erase_w9019(wac_i2c, eraseBlock, eraseBlockNum); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to erase the user program\n", __func__); + result = -EXIT_FAIL_ERASE; + goto fail; + } +#else + bRet = flash_erase_all(wac_i2c); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to erase the user program\n", __func__); + result = -EXIT_FAIL_ERASE; + goto fail; + } +#endif + + /*Write the new program*/ + input_info(true, &wac_i2c->client->dev, "%s writing new firmware\n", __func__); + bRet = flash_write_w9019(wac_i2c, fw_data, start_address, &max_address); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to write firmware\n", __func__); + result = -EXIT_FAIL_WRITE_FIRMWARE; + goto fail; + } + + /*Return to the user mode*/ + input_info(true, &wac_i2c->client->dev, + "%s closing the boot mode\n", __func__); + + bRet = flash_end_w9019(wac_i2c); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s closing boot mode failed\n", __func__); + result = -EXIT_FAIL_WRITING_MARK_NOT_SET; + goto fail; + } + + input_info(true, &wac_i2c->client->dev, "%s write and verify completed\n", __func__); + result = EXIT_OK; + + fail: + return result; +} + +int w9019_i2c_flash(struct wacom_i2c *wac_i2c) +{ + int ret; + + if (wac_i2c->fw_data == NULL) { + input_info(true, &wac_i2c->client->dev, "%s Data is NULL. Exit.\n", __func__); + return -EINVAL; + } + + w9019_compulsory_flash_mode(wac_i2c, true); + w9019_reset_hw(wac_i2c); + msleep(200); + + + ret = wacom_flash_cmd(wac_i2c); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s cannot send flash command\n", __func__); + ret = -EXIT_FAIL; + goto end_wacom_flash; + } + + input_info(true, &wac_i2c->client->dev, "%s pass wacom_flash_cmd\n", __func__); + + ret = flash_query_w9019(wac_i2c); + if(ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s Error: cannot send query\n", __func__); + ret = -EXIT_FAIL; + goto end_wacom_flash; + } + + input_info(true, &wac_i2c->client->dev, "%s pass flash_query_w9014\n", __func__); + + ret = wacom_i2c_flash_w9019(wac_i2c, wac_i2c->fw_data); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, + "%s Error: flash failed\n", __func__); + ret = -EXIT_FAIL; + goto end_wacom_flash; + } + + msleep(200); +end_wacom_flash: + w9019_compulsory_flash_mode(wac_i2c, false); + w9019_reset_hw(wac_i2c); + msleep(200); + + return ret; +} diff --git a/drivers/input/w9019/w9019_flash.h b/drivers/input/w9019/w9019_flash.h new file mode 100755 index 000000000000..62f262c0ce65 --- /dev/null +++ b/drivers/input/w9019/w9019_flash.h @@ -0,0 +1,149 @@ +/* + * w9012_flash.h - Wacom Digitizer Controller Flash Driver + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef _WACOM_I2C_FLASH_H +#define _WACOM_I2C_FLASH_H + +#define FLASH_START0 'f' +#define FLASH_START1 'l' +#define FLASH_START2 'a' +#define FLASH_START3 's' +#define FLASH_START4 'h' +#define FLASH_START5 '\r' +#define FLASH_ACK 0x06 + +/*Address for boot is 0x09 by default, but it may be different in other models*/ +#define WACOM_FLASH_W9014 0x09 +#define WACOM_QUERY_SIZE 19 +#define pen_QUERY '*' +#define ACK 0 + +#define MPU_W9014 0x2f +#define MPU_W9019 0x43 + +#define FLASH_BLOCK_SIZE 64 +#define DATA_SIZE (65536 * 2) +#define BLOCK_NUM 127 +#define W9019_START_ADDR 0x2000 +#define W9019_END_ADDR 0x1ffff + +#define CMD_GET_FEATURE 2 +#define CMD_SET_FEATURE 3 + +/*Added for using this prog. in Linux user-space program*/ +#define RTYPE_FEATURE 0x03 /*: Report type -> feature(11b)*/ +#define GET_FEATURE 0x02 +#define SET_FEATURE 0x03 +#define GFEATURE_SIZE 6 +#define SFEATURE_SIZE 8 + +#define COMM_REG 0x04 +#define DATA_REG 0x05 +#define REPORT_ID_1 0x07 +#define REPORT_ID_2 0x08 +#define BOOT_QUERY_SIZE 5 + +#define BOOT_CMD_SIZE 78 +#define BOOT_RSP_SIZE 6 +#define BOOT_CMD_REPORT_ID 7 +#define BOOT_ERASE_DATAMEM 0x0e +#define BOOT_ERASE_FLASH 0 +#define BOOT_WRITE_FLASH 1 +#define BOOT_EXIT 3 +#define BOOT_BLVER 4 +#define BOOT_MPU 5 +#define BOOT_QUERY 7 + +#define QUERY_CMD 0x07 +#define BOOT_CMD 0x04 +#define MPU_CMD 0x05 +#define ERS_CMD 0x00 +#define WRITE_CMD 0x01 + +#define QUERY_RSP 0x06 +#define ERS_RSP 0x00 +#define WRITE_RSP 0x00 + +#define CMD_SIZE (72+6) +#define RSP_SIZE 6 + +/*Sector Nos for erasing datamem*/ +#define DATAMEM_SECTOR0 0 +#define DATAMEM_SECTOR1 1 +#define DATAMEM_SECTOR2 2 +#define DATAMEM_SECTOR3 3 +#define DATAMEM_SECTOR4 4 +#define DATAMEM_SECTOR5 5 +#define DATAMEM_SECTOR6 6 +#define DATAMEM_SECTOR7 7 + +// +// exit codes +// +#define EXIT_OK (0) +#define EXIT_REBOOT (1) +#define EXIT_FAIL (2) +#define EXIT_USAGE (3) +#define EXIT_NO_SUCH_FILE (4) +#define EXIT_NO_INTEL_HEX (5) +#define EXIT_FAIL_OPEN_COM_PORT (6) +#define EXIT_FAIL_ENTER_FLASH_MODE (7) +#define EXIT_FAIL_FLASH_QUERY (8) +#define EXIT_FAIL_BAUDRATE_CHANGE (9) +#define EXIT_FAIL_WRITE_FIRMWARE (10) +#define EXIT_FAIL_EXIT_FLASH_MODE (11) +#define EXIT_CANCEL_UPDATE (12) +#define EXIT_SUCCESS_UPDATE (13) +#define EXIT_FAIL_HID2SERIAL (14) +#define EXIT_FAIL_VERIFY_FIRMWARE (15) +#define EXIT_FAIL_MAKE_WRITING_MARK (16) +#define EXIT_FAIL_ERASE_WRITING_MARK (17) +#define EXIT_FAIL_READ_WRITING_MARK (18) +#define EXIT_EXIST_MARKING (19) +#define EXIT_FAIL_MISMATCHING (20) +#define EXIT_FAIL_ERASE (21) +#define EXIT_FAIL_GET_BOOT_LOADER_VERSION (22) +#define EXIT_FAIL_GET_MPU_TYPE (23) +#define EXIT_MISMATCH_BOOTLOADER (24) +#define EXIT_MISMATCH_MPUTYPE (25) +#define EXIT_FAIL_ERASE_BOOT (26) +#define EXIT_FAIL_WRITE_BOOTLOADER (27) +#define EXIT_FAIL_SWAP_BOOT (28) +#define EXIT_FAIL_WRITE_DATA (29) +#define EXIT_FAIL_GET_FIRMWARE_VERSION (30) +#define EXIT_FAIL_GET_UNIT_ID (31) +#define EXIT_FAIL_SEND_STOP_COMMAND (32) +#define EXIT_FAIL_SEND_QUERY_COMMAND (33) +#define EXIT_NOT_FILE_FOR_535 (34) +#define EXIT_NOT_FILE_FOR_514 (35) +#define EXIT_NOT_FILE_FOR_503 (36) +#define EXIT_MISMATCH_MPU_TYPE (37) +#define EXIT_NOT_FILE_FOR_515 (38) +#define EXIT_NOT_FILE_FOR_1024 (39) +#define EXIT_FAIL_VERIFY_WRITING_MARK (40) +#define EXIT_DEVICE_NOT_FOUND (41) +#define EXIT_FAIL_WRITING_MARK_NOT_SET (42) +#define EXIT_FAIL_SET_PDCT (43) +#define ERR_SET_PDCT (44) +#define ERR_GET_PDCT (45) + +/*partial erase*/ +#define PARTIAL_ERASE + +#endif /*_WACOM_I2C_FLASH_H*/ diff --git a/drivers/input/w9019/wacom_dev.h b/drivers/input/w9019/wacom_dev.h new file mode 100755 index 000000000000..40e8f39850d3 --- /dev/null +++ b/drivers/input/w9019/wacom_dev.h @@ -0,0 +1,624 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if IS_ENABLED(CONFIG_SPU_VERIFY) +#define SUPPORT_FW_SIGNED +#endif +#ifdef SUPPORT_FW_SIGNED +#include +#endif +#include "wacom_reg.h" + +#if IS_ENABLED(CONFIG_INPUT_SEC_INPUT_LEGO) +#include "../sec_input/sec_input.h" +#else +#include +#endif + +#undef CONFIG_USB_TYPEC_MANAGER_NOTIFIER +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) +#include +#endif + +#define RETRY_COUNT 3 + +#if IS_ENABLED(CONFIG_SEC_FACTORY) +#define WACOM_SEC_FACTORY 1 +#else +#define WACOM_SEC_FACTORY 0 +#endif + +#if IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) +#define WACOM_PRODUCT_SHIP 1 +#else +#define WACOM_PRODUCT_SHIP 0 +#endif + +#define WACOM_I2C_RETRY 3 +#define WACOM_CMD_RETRY 2 +#define WACOM_INVALID_IRQ_COUNT 2 + +#define WACOM_CMD_RESULT_WORD_LEN 20 + +#define WACOM_I2C_MODE_NORMAL false +#define WACOM_I2C_MODE_BOOT true + +#define WACOM_BLE_HISTORY_SIZE (22 * 150) +#define WACOM_BLE_HISTORY1_SIZE (22) + +/* wacom features */ +#define USE_OPEN_CLOSE +#define WACOM_USE_SURVEY_MODE /* SURVEY MODE is LPM mode : Only detect garage(pdct) & aop */ + +#ifdef WACOM_USE_SURVEY_MODE +#define EPEN_RESUME_DELAY 0 +#else +#define EPEN_RESUME_DELAY 180 +#endif +#define EPEN_OFF_TIME_LIMIT 10000 // usec + +/* query data */ +#define COM_COORD_NUM 13 +#define COM_RESERVED_NUM 1 +#define COM_QUERY_NUM 15 +#define COM_QUERY_POS (COM_COORD_NUM + COM_RESERVED_NUM) +#define COM_QUERY_BUFFER (COM_QUERY_POS + COM_QUERY_NUM) + + +/* packet ID for wacom data */ +enum PACKET_ID { + COORD_PACKET = 1, + AOP_PACKET = 3, + NOTI_PACKET = 13, + REPLY_PACKET, + SEPC_PACKET, +}; + +enum NOTI_SUB_ID { + ERROR_PACKET = 0, + TABLE_SWAP_PACKET, + EM_NOISE_PACKET, + TSP_STOP_PACKET, + OOK_PACKET, + CMD_PACKET, + GCF_PACKET = 7, /* Garage Charging Finished notification data*/ + COVER_DETECT_PACKET = 10, +}; + +enum REPLY_SUB_ID { + OPEN_CHECK_PACKET = 1, + SWAP_PACKET, + SENSITIVITY_PACKET, + TSP_STOP_COND_PACKET, + GARAGE_CHARGE_PACKET = 6, + ELEC_TEST_PACKET = 101, +}; + +enum SEPC_SUB_ID { + QUERY_PACKET = 0, + CHECKSUM_PACKET, +}; + +enum TABLE_SWAP { + TABLE_SWAP_DEX_STATION = 1, + TABLE_SWAP_KBD_COVER = 2, +}; + +enum COVER_STATE { + NOMAL_MODE = 0, + BOOKCOVER_MODE, + KBDCOVER_MODE, +}; + +#define WACOM_PATH_EXTERNAL_FW "wacom.bin" +#define WACOM_PATH_EXTERNAL_FW_SIGNED "wacom_signed.bin" +#define WACOM_PATH_SPU_FW_SIGNED "ffu_wacom.bin" + +#define FW_UPDATE_RUNNING 1 +#define FW_UPDATE_PASS 2 +#define FW_UPDATE_FAIL -1 + +enum { + WACOM_BUILT_IN = 0, + WACOM_SDCARD, + WACOM_NONE, + WACOM_SPU, + WACOM_VERIFICATION, +}; + +enum { + FW_NONE = 0, + FW_BUILT_IN, + FW_SPU, + FW_HEADER, + FW_IN_SDCARD, + FW_IN_SDCARD_SIGNED, +#if WACOM_SEC_FACTORY + FW_FACTORY_GARAGE, + FW_FACTORY_UNIT, +#endif + FW_VERIFICATION, +}; + +/* header ver 1 */ +struct fw_image { + u8 hdr_ver; + u8 hdr_len; + u16 fw_ver1; + u16 fw_ver2; + u16 fw_ver3; + u32 fw_len; + u8 checksum[5]; + u8 alignment_dummy[3]; + u8 data[0]; +} __attribute__ ((packed)); + + +#define PDCT_NOSIGNAL true +#define PDCT_DETECT_PEN false + +/*-------------------------------------------------- + * event + * wac_i2c->function_result + * 7. ~ 4. reserved || 3. Garage | 2. Power Save | 1. AOP | 0. Pen In/Out | + * + * 0. Pen In/Out ( pen_insert ) + * ( 0: IN / 1: OUT ) + *-------------------------------------------------- + */ +#define EPEN_EVENT_PEN_OUT (1 << 0) +#define EPEN_EVENT_GARAGE (1 << 1) +#define EPEN_EVENT_AOP (1 << 2) +#define EPEN_EVENT_COVER_DETECTION (1 << 3) +#define EPEN_EVENT_SURVEY (EPEN_EVENT_GARAGE | EPEN_EVENT_AOP | EPEN_EVENT_COVER_DETECTION) + +#define EPEN_SURVEY_MODE_NONE 0x0 +#define EPEN_SURVEY_MODE_GARAGE_ONLY EPEN_EVENT_GARAGE +#define EPEN_SURVEY_MODE_GARAGE_AOP EPEN_EVENT_AOP +#define EPEN_SURVEY_MODE_COVER_DETECTION_ONLY EPEN_EVENT_COVER_DETECTION + +/*-------------------------------------------------- + * function setting by user or default + * wac_i2c->function_set + * 7~4. reserved | 3. AOT | 2. ScreenOffMemo | 1. AOD | 0. Depend on AOD + * + * 3. AOT - aot_enable sysfs + * 2. ScreenOffMemo - screen_off_memo_enable sysfs + * 1. AOD - aod_enable sysfs + * 0. Depend on AOD - 0 : lcd off status, 1 : lcd on status + *-------------------------------------------------- + */ +#define EPEN_SETMODE_AOP_OPTION_AOD_LCD_STATUS (0x1<<0) +#define EPEN_SETMODE_AOP_OPTION_AOD (0x1<<1) +#define EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO (0x1<<2) +#define EPEN_SETMODE_AOP_OPTION_AOT (0x1<<3) +#define EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON (EPEN_SETMODE_AOP_OPTION_AOD | EPEN_SETMODE_AOP_OPTION_AOD_LCD_STATUS) +#define EPEN_SETMODE_AOP_OPTION_AOD_LCD_OFF EPEN_SETMODE_AOP_OPTION_AOD +#define EPEN_SETMODE_AOP (EPEN_SETMODE_AOP_OPTION_AOD | EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO | \ + EPEN_SETMODE_AOP_OPTION_AOT) + +enum { + EPEN_POS_ID_SCREEN_OF_MEMO = 1, +}; +/* + * struct epen_pos - for using to send coordinate in survey mode + * @id: for extension of function + * 0 -> not use + * 1 -> for Screen off Memo + * 2 -> for oter app or function + * @x: x coordinate + * @y: y coordinate + */ +struct epen_pos { + u8 id; + int x; + int y; +}; + +/*-------------------------------------------------- + * Set S-Pen mode for TSP + * 1 byte input/output parameter + * byte[0]: S-pen mode + * - 0: non block tsp scan + * - 1: block tsp scan + * - others: Reserved for future use + *-------------------------------------------------- + */ +#define DISABLE_TSP_SCAN_BLCOK 0x00 +#define ENABLE_TSP_SCAN_BLCOK 0x01 + +enum WAKEUP_ID { + HOVER_WAKEUP = 2, + SINGLETAP_WAKEUP, + DOUBLETAP_WAKEUP, +}; + +enum SCAN_MODE { + GLOBAL_Y_MODE = 1, + GLOBAL_X_MODE, + FULL_MODE, + LOCAL_MODE, +}; + +#define WACOM_STOP_CMD 0x00 +#define WACOM_START_CMD 0x01 +#define WACOM_STOP_AND_START_CMD 0x02 + +#define EPEN_CHARGER_OFF_TIME 90 /* default 60s + buffer time */ +enum epen_scan_info{ + EPEN_CHARGE_OFF = 0, + EPEN_CHARGE_ON = 1, + EPEN_CHARGE_HAPPENED = 2, + EPEN_NONE, +}; + +typedef enum { + WACOM_ENABLE = 0, + WACOM_DISABLE = 1, +} wacom_disable_mode_t; + +enum epen_fw_ver_info{ + WACOM_FIRMWARE_VERSION_UNIT = 3, + WACOM_FIRMWARE_VERSION_SET = 4, + WACOM_FIRMWARE_VERSION_TEST = 6, +} ; + +/* WACOM_DEBUG : Print event contents */ +#define WACOM_DEBUG_PRINT_I2C_READ_CMD 0x01 +#define WACOM_DEBUG_PRINT_I2C_WRITE_CMD 0x02 +#define WACOM_DEBUG_PRINT_COORDEVENT 0x04 +#define WACOM_DEBUG_PRINT_ALLEVENT 0x08 + +/* digitizer & garage open test */ +#define EPEN_OPEN_TEST_PASS 0 +#define EPEN_OPEN_TEST_NOTSUPPORT -1 +#define EPEN_OPEN_TEST_EIO -2 +#define EPEN_OPEN_TEST_FAIL -3 +#define EPEN_OPEN_TEST_EMODECHG -4 +enum { + WACOM_GARAGE_TEST = 0, + WACOM_DIGITIZER_TEST, +}; + +/* elec data */ +#define COM_ELEC_NUM 38 +#define COM_ELEC_DATA_NUM 12 +#define COM_ELEC_DATA_POS 14 + +#define POWER_OFFSET 1000000000000 + +enum { + SEC_NORMAL = 0, + SEC_SHORT, + SEC_OPEN, +}; + +enum epen_elec_spec_mode { + EPEN_ELEC_DATA_MAIN = 0, + EPEN_ELEC_DATA_UNIT = 1, // pretest +// EPEN_ELEC_DATA_ASSY = 2, // reserved +}; +struct wacom_elec_data { + u32 spec_ver[2]; + u8 max_x_ch; + u8 max_y_ch; + u8 shift_value; + + u16 *elec_data; + + u16 *xx; + u16 *xy; + u16 *yx; + u16 *yy; + + u16 *xx_self; + u16 *yy_self; + u16 *xy_edg; + u16 *yx_edg; + + long long cal_xx; + long long cal_xy; + long long cal_yx; + long long cal_yy; + long long cal_xy_edg; + long long cal_yx_edg; + + long long *xx_xx; + long long *xy_xy; + long long *yx_yx; + long long *yy_yy; + long long *xy_xy_edg; + long long *yx_yx_edg; + + long long *rxx; + long long *rxy; + long long *ryx; + long long *ryy; + long long *rxy_edg; + long long *ryx_edg; + + long long *drxx; + long long *drxy; + long long *dryx; + long long *dryy; + long long *drxy_edg; + long long *dryx_edg; + + long long *xx_ref; + long long *xy_ref; + long long *yx_ref; + long long *yy_ref; + long long *xy_edg_ref; + long long *yx_edg_ref; + + long long *xx_spec; + long long *xy_spec; + long long *yx_spec; + long long *yy_spec; + long long *xx_self_spec; + long long *yy_self_spec; + + long long *rxx_ref; + long long *rxy_ref; + long long *ryx_ref; + long long *ryy_ref; + + long long *drxx_spec; + long long *drxy_spec; + long long *dryx_spec; + long long *dryy_spec; + long long *drxy_edg_spec; + long long *dryx_edg_spec; +}; + +struct wacom_g5_platform_data { + struct wacom_elec_data *edata; /* currnet test spec */ + struct wacom_elec_data *edatas[3]; /* 0:main, 1:sub unit, 2:sub assy(reserved) */ + + volatile bool enabled; + + int irq_gpio; + int pdct_gpio; + int fwe_gpio; + int boot_addr; + struct regulator *avdd; + + int x_invert; + int y_invert; + int xy_switch; + bool use_dt_coord; + u32 origin[2]; + int max_x; + int max_y; + int max_pressure; + int max_x_tilt; + int max_y_tilt; + int max_height; + const char *fw_path; +#if WACOM_SEC_FACTORY + const char *fw_fac_path; +#endif + u8 ic_type; + u8 bl_ver; + u32 module_ver; + u32 support_garage_open_test; + bool use_garage; + u32 table_swap; + bool regulator_boot_on; + u32 bringup; + bool support_cover_noti; + bool support_cover_detection; + + u32 area_indicator; + u32 area_navigation; + u32 area_edge; +}; + + + +struct wacom_i2c { + struct wacom_g5_platform_data *pdata; + struct i2c_client *client; + struct i2c_client *client_boot; + struct input_dev *input_dev; + struct sec_cmd_data sec; + struct mutex i2c_mutex; + struct mutex lock; + struct mutex update_lock; + struct mutex irq_lock; + struct mutex ble_lock; + struct mutex ble_charge_mode_lock; + bool power_enable; + struct wakeup_source *wacom_ws; + bool pm_suspend; + volatile bool probe_done; + bool query_status; + struct completion resume_done; + struct completion i2c_done; + + int irq; + int irq_pdct; + int pen_pdct; + bool pdct_lock_fail; + struct delayed_work open_test_dwork; + + /* survey & garage */ + struct mutex mode_lock; + u8 function_set; + u8 function_result; + volatile bool screen_on; + u8 survey_mode; + u8 check_survey_mode; + int samplerate_state; + volatile u8 report_scan_seq; /* 1:normal, 2:garage+aod, 3:garage only, 4:sync aop*/ + + /* ble(ook) */ + volatile u8 ble_mode; + long chg_time_stamp; + volatile bool ble_mode_change; + volatile bool ble_block_flag; + bool ble_charging_state; + bool ble_disable_flag; + + /* for tui or factory test */ + bool epen_blocked; + + /* coord */ + u16 hi_x; + u16 hi_y; + u16 p_x; + u16 p_y; + u16 x; + u16 y; + s8 tilt_x; + s8 tilt_y; + u16 pressure; + u16 height; + int tool; + u32 mcount; + int pen_prox; + int pen_pressed; + int side_pressed; + + struct epen_pos survey_pos; + + /* fw update */ + struct wakeup_source *wacom_fw_ws; + struct fw_image *fw_img; + const struct firmware *firm_data; + + u16 fw_ver_ic; + u16 fw_ver_bin; + u16 fw_ver_spu; + int update_status; + u8 *fw_data; + u8 fw_update_way; + + bool checksum_result; + char fw_chksum[5]; + bool do_crc_check; + + /* tsp block */ + bool is_tsp_block; + int tsp_scan_mode; + int tsp_block_cnt; + + /* support additional mode */ + bool battery_saving_mode; + int wcharging_mode; + + struct delayed_work nb_reg_work; + + struct notifier_block kbd_nb; + struct work_struct kbd_work; + u8 kbd_conn_state; + u8 kbd_cur_conn_state; + + struct notifier_block typec_nb; + struct work_struct typec_work; + u8 dp_connect_state; + u8 dp_connect_cmd; + + struct notifier_block nb; + + /* open test*/ + volatile bool is_open_test; + // digitizer + bool connection_check; + int fail_channel; + int min_adc_val; + int error_cal; + int min_cal_val; + // garage + bool garage_connection_check; + int garage_fail_channel; + int garage_min_adc_val; + int garage_error_cal; + int garage_min_cal_val; + + /* check abnormal case*/ + struct delayed_work work_print_info; + u32 print_info_cnt_open; + u32 scan_info_fail_cnt; + u32 check_elec; + u32 i2c_fail_count; + u32 abnormal_reset_count; + u32 pen_out_count; + volatile bool reset_flag; + u8 debug_flag; +#if WACOM_SEC_FACTORY + volatile bool fac_garage_mode; + u32 garage_gain0; + u32 garage_gain1; + u32 garage_freq0; + u32 garage_freq1; +#endif + char *ble_hist; + char *ble_hist1; + int ble_hist_index; + char cover; + u8 flip_state; + bool bl_mpu_match; +}; + +extern struct wacom_i2c *g_wac_i2c_w9019; +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) +extern int get_lcd_attached(char *mode); +#endif +#if IS_ENABLED(CONFIG_EXYNOS_DPU30) +extern int get_lcd_info(char *arg); +#endif + +int w9019_power(struct wacom_i2c *, bool on); +void w9019_reset_hw(struct wacom_i2c *); + +void w9019_compulsory_flash_mode(struct wacom_i2c *, bool enable); +int wacom_get_irq_state(struct wacom_i2c *); + +void w9019_wakeup_sequence(struct wacom_i2c *); +void w9019_sleep_sequence(struct wacom_i2c *); + +int w9019_i2c_load_fw(struct wacom_i2c *wac_i2c, u8 fw_path); +void w9019_i2c_unload_fw(struct wacom_i2c *wac_i2c); +int w9019_fw_update_on_hidden_menu(struct wacom_i2c *, u8 fw_update_way); +int w9019_i2c_flash(struct wacom_i2c *); + +void w9019_enable_irq(struct wacom_i2c *, bool enable); + +int w9019_i2c_send(struct wacom_i2c *, const char *buf, int count); +int w9019_i2c_send_boot(struct wacom_i2c *, const char *buf, int count); +int w9019_i2c_recv(struct wacom_i2c *, char *buf, int count); +int w9019_i2c_recv_boot(struct wacom_i2c *, char *buf, int count); + +int w9019_i2c_query(struct wacom_i2c *); +int w9019_checksum(struct wacom_i2c *); +int w9019_i2c_set_sense_mode(struct wacom_i2c *); + +void w9019_forced_release(struct wacom_i2c *); +void w9019_forced_release_fullscan(struct wacom_i2c *wac_i2c); + +void w9019_select_survey_mode(struct wacom_i2c *, bool enable); +int w9019_i2c_set_survey_mode(struct wacom_i2c *, int mode); +int w9019_start_stop_cmd(struct wacom_i2c *wac_i2c, int mode); + +int w9019_open_test(struct wacom_i2c *wac_i2c, int test_mode); + +int w9019_sec_init(struct wacom_i2c *); +void w9019_sec_remove(struct wacom_i2c *); + +void w9019_print_info(struct wacom_i2c *wac_i2c); +void w9019_i2c_coord_modify(struct wacom_i2c *wac_i2c); +void w9019_disable_mode(struct wacom_i2c *wac_i2c, wacom_disable_mode_t mode); + +int w9019_check_ub(struct i2c_client *client); + +void w9019_swap_compensation(struct wacom_i2c *wac_i2c, char cmd); diff --git a/drivers/input/w9019/wacom_i2c.c b/drivers/input/w9019/wacom_i2c.c new file mode 100755 index 000000000000..b1be601d834c --- /dev/null +++ b/drivers/input/w9019/wacom_i2c.c @@ -0,0 +1,3082 @@ +/* + * wacom_i2c.c - Wacom Digitizer Controller (I2C bus) + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "wacom_dev.h" + +struct wacom_i2c *g_wac_i2c_w9019; + +void w9019_forced_release(struct wacom_i2c *wac_i2c) +{ +#if WACOM_PRODUCT_SHIP + if (wac_i2c->pen_pressed) { + input_info(true, &wac_i2c->client->dev, "%s : [R] dd:%d,%d mc:%d & [HO] dd:%d,%d\n", + __func__, wac_i2c->x - wac_i2c->p_x, wac_i2c->y - wac_i2c->p_y, + wac_i2c->mcount, wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y); +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + sec_input_notify(&wac_i2c->nb, NOTIFIER_WACOM_PEN_HOVER_OUT, NULL); +#endif + } else if (wac_i2c->pen_prox) { + input_info(true, &wac_i2c->client->dev, "%s : [HO] dd:%d,%d mc:%d\n", + __func__, wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y, wac_i2c->mcount); +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + sec_input_notify(&wac_i2c->nb, NOTIFIER_WACOM_PEN_HOVER_OUT, NULL); +#endif + } else { + input_info(true, &wac_i2c->client->dev, "%s : pen_prox(%d), pen_pressed(%d)\n", + __func__, wac_i2c->pen_prox, wac_i2c->pen_pressed); + } +#else + if (wac_i2c->pen_pressed) { + input_info(true, &wac_i2c->client->dev, "%s : [R] lx:%d ly:%d dd:%d,%d mc:%d & [HO] dd:%d,%d\n", + __func__, wac_i2c->x, wac_i2c->y, + wac_i2c->x - wac_i2c->p_x, wac_i2c->y - wac_i2c->p_y, + wac_i2c->mcount, wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y); +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + sec_input_notify(&wac_i2c->nb, NOTIFIER_WACOM_PEN_HOVER_OUT, NULL); +#endif + } else if (wac_i2c->pen_prox) { + input_info(true, &wac_i2c->client->dev, "%s : [HO] lx:%d ly:%d dd:%d,%d mc:%d\n", + __func__, wac_i2c->x, wac_i2c->y, + wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y, wac_i2c->mcount); +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + sec_input_notify(&wac_i2c->nb, NOTIFIER_WACOM_PEN_HOVER_OUT, NULL); +#endif + } else { + input_info(true, &wac_i2c->client->dev, "%s : pen_prox(%d), pen_pressed(%d)\n", + __func__, wac_i2c->pen_prox, wac_i2c->pen_pressed); + } +#endif + + input_report_abs(wac_i2c->input_dev, ABS_X, 0); + input_report_abs(wac_i2c->input_dev, ABS_Y, 0); + input_report_abs(wac_i2c->input_dev, ABS_PRESSURE, 0); + input_report_abs(wac_i2c->input_dev, ABS_DISTANCE, 0); + + input_report_key(wac_i2c->input_dev, BTN_STYLUS, 0); + input_report_key(wac_i2c->input_dev, BTN_TOUCH, 0); + input_report_key(wac_i2c->input_dev, BTN_TOOL_RUBBER, 0); + input_report_key(wac_i2c->input_dev, BTN_TOOL_PEN, 0); + + input_sync(wac_i2c->input_dev); + + wac_i2c->hi_x = 0; + wac_i2c->hi_y = 0; + wac_i2c->p_x = 0; + wac_i2c->p_y = 0; + + wac_i2c->pen_prox = 0; + wac_i2c->pen_pressed = 0; + wac_i2c->side_pressed = 0; + wac_i2c->mcount = 0; +} + +int w9019_i2c_send_sel(struct wacom_i2c *wac_i2c, const char *buf, int count, bool mode) +{ + struct i2c_client *client = mode ? wac_i2c->client_boot : wac_i2c->client; + int retry = WACOM_I2C_RETRY; + int ret; + u8 *buff; + int i; + + /* in LPM, waiting blsp block resume */ + if (wac_i2c->pm_suspend) { + __pm_wakeup_event(wac_i2c->wacom_ws, jiffies_to_msecs(500)); + ret = wait_for_completion_interruptible_timeout(&wac_i2c->resume_done, msecs_to_jiffies(500)); + if (ret <= 0) { + input_err(true, &wac_i2c->client->dev, + "%s: LPM: pm resume is not handled [timeout]\n", __func__); + return -ENOMEM; + } else { + input_info(true, &wac_i2c->client->dev, + "%s: run LPM interrupt handler, %d\n", __func__, jiffies_to_msecs(ret)); + } + } + + buff = kzalloc(count, GFP_KERNEL); + if (!buff) + return -ENOMEM; + + mutex_lock(&wac_i2c->i2c_mutex); + + memcpy(buff, buf, count); + + reinit_completion(&wac_i2c->i2c_done); + do { + if (!wac_i2c->power_enable) { + input_err(true, &client->dev, "%s: Power status off\n", __func__); + ret = -EIO; + + goto out; + } + + ret = i2c_master_send(client, buff, count); + if (ret == count) + break; + + if (retry < WACOM_I2C_RETRY) { + input_err(true, &client->dev, "%s: I2C retry(%d) mode(%d)\n", + __func__, WACOM_I2C_RETRY - retry, mode); + wac_i2c->i2c_fail_count++; + } + } while (--retry); + +out: + complete_all(&wac_i2c->i2c_done); + mutex_unlock(&wac_i2c->i2c_mutex); + + if (wac_i2c->debug_flag & WACOM_DEBUG_PRINT_I2C_WRITE_CMD) { + pr_info("sec_input : i2c_cmd: W: "); + for (i = 0; i < count; i++) + pr_cont("%02X ", buf[i]); + pr_cont("\n"); + } + + kfree(buff); + + return ret; +} + +int w9019_i2c_recv_sel(struct wacom_i2c *wac_i2c, char *buf, int count, bool mode) +{ + struct i2c_client *client = mode ? wac_i2c->client_boot : wac_i2c->client; + int retry = WACOM_I2C_RETRY; + int ret; + u8 *buff; + int i; + + /* in LPM, waiting blsp block resume */ + if (wac_i2c->pm_suspend) { + __pm_wakeup_event(wac_i2c->wacom_ws, jiffies_to_msecs(500)); + ret = wait_for_completion_interruptible_timeout(&wac_i2c->resume_done, msecs_to_jiffies(500)); + if (ret <= 0) { + input_err(true, &wac_i2c->client->dev, + "%s: LPM: pm resume is not handled [timeout]\n", __func__); + return -ENOMEM; + } else { + input_info(true, &wac_i2c->client->dev, + "%s: run LPM interrupt handler, %d\n", __func__, jiffies_to_msecs(ret)); + } + } + + buff = kzalloc(count, GFP_KERNEL); + if (!buff) + return -ENOMEM; + + mutex_lock(&wac_i2c->i2c_mutex); + + reinit_completion(&wac_i2c->i2c_done); + do { + if (!wac_i2c->power_enable) { + input_err(true, &client->dev, "%s: Power status off\n", __func__); + ret = -EIO; + + goto out; + } + + ret = i2c_master_recv(client, buff, count); + if (ret == count) + break; + + if (retry < WACOM_I2C_RETRY) { + input_err(true, &client->dev, "%s: I2C retry(%d) mode(%d)\n", + __func__, WACOM_I2C_RETRY - retry, mode); + wac_i2c->i2c_fail_count++; + } + } while (--retry); + + memcpy(buf, buff, count); + + if (wac_i2c->debug_flag & WACOM_DEBUG_PRINT_I2C_READ_CMD) { + pr_info("sec_input : i2c_cmd: R: "); + for (i = 0; i < count; i++) + pr_cont("%02X ", buf[i]); + pr_cont("\n"); + } + +out: + complete_all(&wac_i2c->i2c_done); + mutex_unlock(&wac_i2c->i2c_mutex); + + kfree(buff); + + return ret; +} + +int w9019_i2c_send_boot(struct wacom_i2c *wac_i2c, const char *buf, int count) +{ + return w9019_i2c_send_sel(wac_i2c, buf, count, WACOM_I2C_MODE_BOOT); +} + +int w9019_i2c_send(struct wacom_i2c *wac_i2c, const char *buf, int count) +{ + return w9019_i2c_send_sel(wac_i2c, buf, count, WACOM_I2C_MODE_NORMAL); +} + +int w9019_i2c_recv_boot(struct wacom_i2c *wac_i2c, char *buf, int count) +{ + return w9019_i2c_recv_sel(wac_i2c, buf, count, WACOM_I2C_MODE_BOOT); +} + +int w9019_i2c_recv(struct wacom_i2c *wac_i2c, char *buf, int count) +{ + return w9019_i2c_recv_sel(wac_i2c, buf, count, WACOM_I2C_MODE_NORMAL); +} + +int w9019_start_stop_cmd(struct wacom_i2c *wac_i2c, int mode) +{ + int retry; + int ret = 0; + char buff; + + input_info(true, &wac_i2c->client->dev, "%s: mode (%d)\n", __func__, mode); + +reset_start: + if (mode == WACOM_STOP_CMD) { + buff = COM_SAMPLERATE_STOP; + } else if (mode == WACOM_START_CMD) { + buff = COM_SAMPLERATE_START; + } else if (mode == WACOM_STOP_AND_START_CMD) { + buff = COM_SAMPLERATE_STOP; + wac_i2c->samplerate_state = WACOM_STOP_CMD; + } else { + input_info(true, &wac_i2c->client->dev, "%s: abnormal mode (%d)\n", __func__, mode); + return ret; + } + + retry = WACOM_CMD_RETRY; + do { + ret = w9019_i2c_send(wac_i2c, &buff, 1); + msleep(50); + if (ret < 0) + input_err(true, &wac_i2c->client->dev, + "%s: failed to send 0x%02X(%d)\n", __func__, buff, retry); + else + break; + + } while (--retry); + + if (mode == WACOM_STOP_AND_START_CMD) { + mode = WACOM_START_CMD; + goto reset_start; + } + + if (ret == 1) + wac_i2c->samplerate_state = mode; + + return ret; +} + +int w9019_checksum(struct wacom_i2c *wac_i2c) +{ + struct i2c_client *client = wac_i2c->client; + int ret = 0, retry = 10; + int i = 0; + u8 buf[5] = { 0, }; + + while (retry--) { + buf[0] = COM_CHECKSUM; + ret = w9019_i2c_send(wac_i2c, &buf[0], 1); + if (ret < 0) { + input_err(true, &client->dev, "i2c fail, retry, %d\n", __LINE__); + continue; + } + + msleep(200); + + ret = w9019_i2c_recv(wac_i2c, buf, 5); + if (ret < 0) { + input_err(true, &client->dev, "i2c fail, retry, %d\n", __LINE__); + continue; + } + + if (buf[0] == 0x1F) + break; + + input_info(true, &client->dev, "buf[0]: 0x%x, checksum retry\n", buf[0]); + } + + if (ret >= 0) { + input_info(true, &client->dev, "received checksum %x, %x, %x, %x, %x\n", + buf[0], buf[1], buf[2], buf[3], buf[4]); + } + + for (i = 0; i < 5; ++i) { + if (buf[i] != wac_i2c->fw_chksum[i]) { + input_info(true, &client->dev, "checksum fail %dth %x %x\n", + i, buf[i], wac_i2c->fw_chksum[i]); + break; + } + } + + wac_i2c->checksum_result = (i == 5); + + return wac_i2c->checksum_result; +} + +int w9019_i2c_query(struct wacom_i2c *wac_i2c) +{ + struct wacom_g5_platform_data *pdata = wac_i2c->pdata; + struct i2c_client *client = wac_i2c->client; + u8 data[COM_QUERY_BUFFER] = { 0, }; + u8 *query = data + COM_QUERY_POS; + int read_size = COM_QUERY_BUFFER; + int ret; + int i; + + for (i = 0; i < RETRY_COUNT; i++) { + ret = w9019_i2c_recv(wac_i2c, data, read_size); + if (ret < 0) { + input_err(true, &client->dev, "%s: failed to recv\n", __func__); + continue; + } + + input_info(true, &client->dev, "%s: %dth ret of wacom query=%d\n", __func__, i, ret); + + if (read_size != ret) { + input_err(true, &client->dev, "%s: read size error %d of %d\n", __func__, ret, read_size); + continue; + } + + input_info(true, &client->dev, + "(retry:%d) %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X\n", + i, query[0], query[1], query[2], query[3], query[4], query[5], + query[6], query[7], query[8], query[9], query[10], query[11], + query[12], query[13], query[14]); + + if (query[EPEN_REG_HEADER] == 0x0F) { + wac_i2c->fw_ver_ic = (query[EPEN_REG_FWVER1] << 8) | query[EPEN_REG_FWVER2]; + break; + } + } + + input_info(true, &client->dev, + "%X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X\n", + query[0], query[1], query[2], query[3], query[4], query[5], + query[6], query[7], query[8], query[9], query[10], query[11], + query[12], query[13], query[14]); + + if (ret < 0) { + input_err(true, &client->dev, "%s: failed to read query\n", __func__); + wac_i2c->fw_ver_ic = 0; + wac_i2c->query_status = false; + return ret; + } + + wac_i2c->query_status = true; + + if (pdata->use_dt_coord == false) { + pdata->max_x = ((u16)query[EPEN_REG_X1] << 8) + query[EPEN_REG_X2]; + pdata->max_y = ((u16)query[EPEN_REG_Y1] << 8) + query[EPEN_REG_Y2]; + } + pdata->max_pressure = ((u16)query[EPEN_REG_PRESSURE1] << 8) + query[EPEN_REG_PRESSURE2]; + pdata->max_x_tilt = query[EPEN_REG_TILT_X]; + pdata->max_y_tilt = query[EPEN_REG_TILT_Y]; + pdata->max_height = query[EPEN_REG_HEIGHT]; + pdata->ic_type = query[EPEN_REG_MPUVER]; + pdata->bl_ver = query[EPEN_REG_BLVER]; + + input_info(true, &client->dev, "use_dt_coord: %d, max_x: %d max_y: %d, max_pressure: %d\n", + pdata->use_dt_coord, pdata->max_x, pdata->max_y, pdata->max_pressure); + input_info(true, &client->dev, "fw_ver_ic=0x%X\n", wac_i2c->fw_ver_ic); + + input_info(true, &client->dev, "mpu: 0x%X bl: 0x%X, tiltX: %d, tiltY: %d, maxH: %d\n", + pdata->ic_type, pdata->bl_ver, pdata->max_x_tilt, pdata->max_y_tilt, pdata->max_height); + + return 0; +} + +int w9019_i2c_set_sense_mode(struct wacom_i2c *wac_i2c) +{ + struct i2c_client *client = wac_i2c->client; + int retval; + char data[4] = { 0, 0, 0, 0 }; + + input_info(true, &wac_i2c->client->dev, "%s cmd mod(%d)\n", __func__, wac_i2c->wcharging_mode); + + if (wac_i2c->wcharging_mode == 1) + data[0] = COM_LOW_SENSE_MODE; + else if (wac_i2c->wcharging_mode == 3) + data[0] = COM_LOW_SENSE_MODE2; + else { + /* it must be 0 */ + data[0] = COM_NORMAL_SENSE_MODE; + } + + retval = w9019_i2c_send(wac_i2c, &data[0], 1); + if (retval < 0) { + input_err(true, &client->dev, "%s: failed to send wacom i2c mode, %d\n", __func__, retval); + return retval; + } + + msleep(60); + + retval = w9019_start_stop_cmd(wac_i2c, WACOM_STOP_CMD); + if (retval < 0) { + input_err(true, &client->dev, "%s: failed to set stop cmd, %d\n", + __func__, retval); + return retval; + } + +#if 0 + /* temp block not to receive gabage irq by cmd */ + data[1] = COM_REQUEST_SENSE_MODE; + retval = w9019_i2c_send(wac_i2c, &data[1], 1); + if (retval < 0) { + input_err(true, &client->dev, + "%s: failed to read wacom i2c send2, %d\n", __func__, + retval); + return retval; + } + + msleep(60); + + retval = w9019_i2c_recv(wac_i2c, &data[2], 2); + if (retval != 2) { + input_err(true, &client->dev, + "%s: failed to read wacom i2c recv, %d\n", __func__, + retval); + return retval; + } + + input_info(true, &client->dev, "%s: mode:%X, %X\n", __func__, data[2], + data[3]); + + data[0] = COM_SAMPLERATE_STOP; + retval = w9019_i2c_send(wac_i2c, &data[0], 1); + if (retval < 0) { + input_err(true, &client->dev, + "%s: failed to read wacom i2c send3, %d\n", __func__, + retval); + return retval; + } + + msleep(60); +#endif + retval = w9019_start_stop_cmd(wac_i2c, WACOM_START_CMD); + if (retval < 0) { + input_err(true, &client->dev, "%s: failed to set start cmd, %d\n", + __func__, retval); + return retval; + } + + return retval; //data[3]; +} + +void w9019_select_survey_mode(struct wacom_i2c *wac_i2c, bool enable) +{ + struct i2c_client *client = wac_i2c->client; + + mutex_lock(&wac_i2c->mode_lock); + + if (enable) { + if (wac_i2c->epen_blocked || + (wac_i2c->battery_saving_mode && !(wac_i2c->function_result & EPEN_EVENT_PEN_OUT))) { + if (wac_i2c->pdata->support_cover_detection) { + input_info(true, &client->dev, "%s: %s cover detection only\n", + __func__, wac_i2c->epen_blocked ? "epen blocked" : "ps on & pen in"); + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_COVER_DETECTION_ONLY); + } else if (wac_i2c->pdata->use_garage) { + input_info(true, &client->dev, "%s: %s & garage on. garage only mode\n", + __func__, wac_i2c->epen_blocked ? "epen blocked" : "ps on & pen in"); + + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_GARAGE_ONLY); + } else { + input_info(true, &client->dev, "%s: %s power off\n", __func__, + wac_i2c->epen_blocked ? "epen blocked" : "ps on & pen in"); + + w9019_enable_irq(wac_i2c, false); + w9019_power(wac_i2c, false); + + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + } + } else if (wac_i2c->survey_mode) { + input_info(true, &client->dev, "%s: exit aop mode\n", __func__); + + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_NONE); + } else { + input_info(true, &client->dev, "%s: power on\n", __func__); + + w9019_power(wac_i2c, true); + msleep(100); + + w9019_enable_irq(wac_i2c, true); + } + } else { + if (wac_i2c->epen_blocked || (wac_i2c->battery_saving_mode && + !(wac_i2c->function_result & EPEN_EVENT_PEN_OUT))) { + if (wac_i2c->pdata->support_cover_detection) { + input_info(true, &client->dev, "%s: %s cover detection only\n", + __func__, wac_i2c->epen_blocked ? "epen blocked" : "ps on & pen in"); + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_COVER_DETECTION_ONLY); + } else if (wac_i2c->pdata->use_garage) { + input_info(true, &client->dev, "%s: %s & garage on. garage only mode\n", + __func__, wac_i2c->epen_blocked ? "epen blocked" : "ps on & pen in"); + + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_GARAGE_ONLY); + } else { + input_info(true, &client->dev, "%s: %s power off\n", + __func__, wac_i2c->epen_blocked ? "epen blocked" : "ps on & pen in"); + + w9019_enable_irq(wac_i2c, false); + w9019_power(wac_i2c, false); + + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + } + } else if (!(wac_i2c->function_set & EPEN_SETMODE_AOP)) { + if (wac_i2c->pdata->support_cover_detection) { + input_info(true, &client->dev, "%s: AOP off. cover detection only\n", + __func__); + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_COVER_DETECTION_ONLY); + } else if (wac_i2c->pdata->use_garage) { + input_info(true, &client->dev, "%s: aop off & garage on. garage only mode\n", __func__); + + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_GARAGE_ONLY); + } else { + input_info(true, &client->dev, "%s: aop off & garage off. power off\n", __func__); + + w9019_enable_irq(wac_i2c, false); + w9019_power(wac_i2c, false); + + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + } + } else { + /* aop on => (aod : screen off memo = 1:1 or 1:0 or 0:1) + * double tab & hover + button event will be occurred, + * but some of them will be skipped at reporting by mode + */ + input_info(true, &client->dev, "%s: aop on. aop mode\n", __func__); + + if (!wac_i2c->power_enable) { + input_info(true, &client->dev, "%s: power on\n", __func__); + + w9019_power(wac_i2c, true); + msleep(100); + + w9019_enable_irq(wac_i2c, true); + } + + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_GARAGE_AOP); + } + } + + if (wac_i2c->power_enable) { + input_info(true, &client->dev, "%s: screen %s, survey mode:%d, result:%d\n", + __func__, enable ? "on" : "off", wac_i2c->survey_mode, + wac_i2c->function_result & EPEN_EVENT_SURVEY); + + if ((wac_i2c->function_result & EPEN_EVENT_SURVEY) != wac_i2c->survey_mode) { + input_err(true, &client->dev, "%s: survey mode cmd failed\n", __func__); + + w9019_i2c_set_survey_mode(wac_i2c, wac_i2c->survey_mode); + } + } + + mutex_unlock(&wac_i2c->mode_lock); +} + +int w9019_i2c_set_survey_mode(struct wacom_i2c *wac_i2c, int mode) +{ + struct i2c_client *client = wac_i2c->client; + int retval; + char data[4] = { 0, 0, 0, 0 }; + + switch (mode) { + case EPEN_SURVEY_MODE_NONE: + data[0] = COM_SURVEY_EXIT; + break; + case EPEN_SURVEY_MODE_GARAGE_ONLY: + if (!wac_i2c->pdata->use_garage) { + input_err(true, &client->dev, "%s: garage mode is not supported\n", __func__); + return -EPERM; + } + data[0] = COM_SURVEY_GARAGE_ONLY; + break; + case EPEN_SURVEY_MODE_GARAGE_AOP: + if ((wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON) == EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON) + data[0] = COM_SURVEY_SYNC_SCAN; + else + data[0] = COM_SURVEY_ASYNC_SCAN; + break; + case EPEN_SURVEY_MODE_COVER_DETECTION_ONLY: + data[0] = COM_SURVEY_GARAGE_ONLY; + break; + default: + input_err(true, &client->dev, "%s: wrong param %d\n", __func__, mode); + return -EINVAL; + } + + wac_i2c->survey_mode = mode; + input_info(true, &client->dev, "%s: ps %s & mode : %d cmd(0x%2X)\n", __func__, + wac_i2c->battery_saving_mode ? "on" : "off", mode, data[0]); + + retval = w9019_i2c_send(wac_i2c, &data[0], 1); + if (retval < 0) { + input_err(true, &client->dev, "%s: failed to send data(%02x %d)\n", __func__, data[0], retval); + wac_i2c->reset_flag = true; + + return retval; + } + + wac_i2c->check_survey_mode = mode; + + if (mode) + msleep(300); + + wac_i2c->reset_flag = false; + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + wac_i2c->function_result |= mode; + + return 0; +} + +void w9019_forced_release_fullscan(struct wacom_i2c *wac_i2c) +{ + input_info(true, &wac_i2c->client->dev, "%s: full scan OUT\n", __func__); + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + wac_i2c->tsp_scan_mode = sec_input_notify(&wac_i2c->nb, NOTIFIER_TSP_BLOCKING_RELEASE, NULL); + wac_i2c->is_tsp_block = false; +#endif +} + +int w9019_power(struct wacom_i2c *wac_i2c, bool on) +{ + struct i2c_client *client = wac_i2c->client; + int ret = 0; + static bool boot_on = true; + + if (wac_i2c->power_enable == on) { + input_info(true, &client->dev, "pwr already %s\n", on ? "enabled" : "disabled"); + return 0; + } + + if (on) { + if (!regulator_is_enabled(wac_i2c->pdata->avdd) || boot_on) { + ret = regulator_enable(wac_i2c->pdata->avdd); + if (ret) { + input_err(true, &client->dev, "%s: Failed to enable vdd: %d\n", __func__, ret); + regulator_disable(wac_i2c->pdata->avdd); + goto out; + } + } else { + input_err(true, &client->dev, "%s: avdd is already enabled\n", __func__); + } + } else { + if (regulator_is_enabled(wac_i2c->pdata->avdd)) { + ret = regulator_disable(wac_i2c->pdata->avdd); + if (ret) { + input_err(true, &client->dev, "%s: failed to disable avdd: %d\n", __func__, ret); + goto out; + } + } else { + input_err(true, &client->dev, "%s: avdd is already disabled\n", __func__); + } + } + wac_i2c->power_enable = on; + +out: + input_info(true, &client->dev, "%s: %s: avdd:%s\n", + __func__, on ? "on" : "off", regulator_is_enabled(wac_i2c->pdata->avdd) ? "on" : "off"); + boot_on = false; + + return 0; +} + +void w9019_reset_hw(struct wacom_i2c *wac_i2c) +{ + w9019_power(wac_i2c, false); + /* recommended delay in spec */ + msleep(100); + w9019_power(wac_i2c, true); + + msleep(200); +} + +void w9019_compulsory_flash_mode(struct wacom_i2c *wac_i2c, bool enable) +{ + gpio_direction_output(wac_i2c->pdata->fwe_gpio, enable); + input_info(true, &wac_i2c->client->dev, "%s : enable(%d) fwe(%d)\n", + __func__, enable, gpio_get_value(wac_i2c->pdata->fwe_gpio)); +} + +void w9019_enable_irq(struct wacom_i2c *wac_i2c, bool enable) +{ + struct irq_desc *desc = irq_to_desc(wac_i2c->irq); + + if (desc == NULL) { + input_err(true, &wac_i2c->client->dev, "%s : irq desc is NULL\n", __func__); + return; + } + + mutex_lock(&wac_i2c->irq_lock); + + if (enable) { + while (desc->depth > 0) + enable_irq(wac_i2c->irq); + } else { + disable_irq(wac_i2c->irq); + } + + mutex_unlock(&wac_i2c->irq_lock); +} + +static void w9019_enable_irq_wake(struct wacom_i2c *wac_i2c, bool enable) +{ + + if (enable) { + enable_irq_wake(wac_i2c->irq); + } else { + disable_irq_wake(wac_i2c->irq); + } +} + +void w9019_wakeup_sequence(struct wacom_i2c *wac_i2c) +{ + struct i2c_client *client = wac_i2c->client; + int retry = 1; + int ret; + + mutex_lock(&wac_i2c->lock); +#if WACOM_SEC_FACTORY + if (wac_i2c->fac_garage_mode) + input_info(true, &client->dev, "%s: garage mode\n", __func__); +#endif + + if (wac_i2c->wacom_fw_ws->active) { + input_info(true, &client->dev, "fw wake lock active. pass %s\n", __func__); + goto out_power_on; + } + + if (wac_i2c->screen_on) { + input_info(true, &client->dev, "already enabled. pass %s\n", __func__); + goto out_power_on; + } + +reset: + if (wac_i2c->reset_flag) { + input_info(true, &client->dev, "%s: IC reset start\n", __func__); + + wac_i2c->abnormal_reset_count++; + wac_i2c->reset_flag = false; + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + + w9019_enable_irq(wac_i2c, false); + + w9019_reset_hw(wac_i2c); + + input_info(true, &client->dev, "%s: IC reset end\n", __func__); + + if (wac_i2c->pdata->support_cover_noti && wac_i2c->cover) { + w9019_swap_compensation(wac_i2c, wac_i2c->cover); + } + + w9019_enable_irq(wac_i2c, true); + } + + w9019_select_survey_mode(wac_i2c, true); + + if (wac_i2c->reset_flag && retry--) + goto reset; + + if (wac_i2c->wcharging_mode) + w9019_i2c_set_sense_mode(wac_i2c); + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + if (wac_i2c->tsp_scan_mode < 0) { + wac_i2c->tsp_scan_mode = sec_input_notify(&wac_i2c->nb, NOTIFIER_TSP_BLOCKING_RELEASE, NULL); + wac_i2c->is_tsp_block = false; + } +#endif + + if (!gpio_get_value(wac_i2c->pdata->irq_gpio)) { + u8 data[COM_COORD_NUM + 1] = { 0, }; + + input_info(true, &client->dev, "%s: irq was enabled\n", __func__); + + ret = w9019_i2c_recv(wac_i2c, data, COM_COORD_NUM + 1); + if (ret < 0) { + input_err(true, &client->dev, "%s: failed to receive\n", __func__); + } + + input_info(true, &client->dev, + "%x %x %x %x %x, %x %x %x %x %x, %x %x %x\n", + data[0], data[1], data[2], data[3], data[4], data[5], + data[6], data[7], data[8], data[9], data[10], + data[11], data[12]); + + /* protection codes for cover status - need to check*/ +// if ((data[0] & 0x0F) == NOTI_PACKET && data[1] == COVER_DETECT_PACKET) +// wacom_i2c_cover_handler(wac_i2c, data); + } + + if (!wac_i2c->samplerate_state) { + char cmd = COM_SAMPLERATE_START; + + input_info(true, &client->dev, "%s: samplerate state is %d, need to recovery\n", + __func__, wac_i2c->samplerate_state); + + ret = w9019_i2c_send(wac_i2c, &cmd, 1); + if (ret < 0) + input_err(true, &client->dev, "%s: failed to sned start cmd %d\n", __func__, ret); + else + wac_i2c->samplerate_state = true; + } + + input_info(true, &client->dev, + "%s: i(%d) f_set(0x%x) f_ret(0x%x) samplerate(%d)\n", + __func__, gpio_get_value(wac_i2c->pdata->irq_gpio), wac_i2c->function_set, + wac_i2c->function_result, wac_i2c->samplerate_state); + + cancel_delayed_work(&wac_i2c->work_print_info); + wac_i2c->print_info_cnt_open = 0; + wac_i2c->tsp_block_cnt = 0; + schedule_work(&wac_i2c->work_print_info.work); + + if (device_may_wakeup(&client->dev)) + w9019_enable_irq_wake(wac_i2c, false); + + wac_i2c->screen_on = true; + +out_power_on: + mutex_unlock(&wac_i2c->lock); + + input_info(true, &client->dev, "%s: end\n", __func__); +} + +void w9019_sleep_sequence(struct wacom_i2c *wac_i2c) +{ + struct i2c_client *client = wac_i2c->client; + int retry = 1; + + mutex_lock(&wac_i2c->lock); +#if WACOM_SEC_FACTORY + if (wac_i2c->fac_garage_mode) + input_info(true, &client->dev, "%s: garage mode\n", __func__); + +#endif + + if (wac_i2c->wacom_fw_ws->active) { + input_info(true, &client->dev, "fw wake lock active. pass %s\n", __func__); + goto out_power_off; + } + + if (!wac_i2c->screen_on) { + input_info(true, &client->dev, "already disabled. pass %s\n", __func__); + goto out_power_off; + } + cancel_delayed_work_sync(&wac_i2c->work_print_info); + w9019_print_info(wac_i2c); + +reset: + if (wac_i2c->reset_flag) { + input_info(true, &client->dev, "%s: IC reset start\n", __func__); + + wac_i2c->abnormal_reset_count++; + wac_i2c->reset_flag = false; + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + + w9019_enable_irq(wac_i2c, false); + + w9019_reset_hw(wac_i2c); + + input_info(true, &client->dev, "%s : IC reset end\n", __func__); + + w9019_enable_irq(wac_i2c, true); + } + + w9019_select_survey_mode(wac_i2c, false); + + /* release pen, if it is pressed */ + if (wac_i2c->pen_pressed || wac_i2c->side_pressed || wac_i2c->pen_prox) + w9019_forced_release(wac_i2c); + + w9019_forced_release_fullscan(wac_i2c); + + if (wac_i2c->reset_flag && retry--) + goto reset; + + if (device_may_wakeup(&client->dev)) + w9019_enable_irq_wake(wac_i2c, true); + + wac_i2c->screen_on = false; + +out_power_off: + mutex_unlock(&wac_i2c->lock); + + input_info(true, &client->dev, "%s end\n", __func__); +} + +#if 0 +static void wac_i2c_table_swap_reply(struct wacom_i2c *wac_i2c, char *data) +{ + u8 table_id; + + table_id = data[3]; + + if (table_id == 1) { + if (wac_i2c->pdata->table_swap == TABLE_SWAP_DEX_STATION) + wac_i2c->dp_connect_state = true; + + if (wac_i2c->pdata->table_swap == TABLE_SWAP_KBD_COVER) + wac_i2c->kbd_cur_conn_state = true; + } else if (!table_id) { + if (wac_i2c->pdata->table_swap == TABLE_SWAP_DEX_STATION) + wac_i2c->dp_connect_state = false; + + if (wac_i2c->pdata->table_swap == TABLE_SWAP_KBD_COVER) + wac_i2c->kbd_cur_conn_state = false; + } + +} +#endif + +#define EPEN_LOCATION_DETECT_SIZE 6 +void w9019_epen_location_detect(struct wacom_i2c *wac_i2c, char *loc, int x, int y) +{ + int i; + int max_x = wac_i2c->pdata->max_x; + int max_y = wac_i2c->pdata->max_y; + + if (wac_i2c->pdata->xy_switch) { + max_x = wac_i2c->pdata->max_y; + max_y = wac_i2c->pdata->max_x; + } + + if (wac_i2c->pdata->area_indicator == 0){ + /* approximately value */ + wac_i2c->pdata->area_indicator = max_y * 4 / 100; + wac_i2c->pdata->area_navigation = max_y * 6 / 100; + wac_i2c->pdata->area_edge = max_y * 3 / 100; + + input_raw_info(true, &wac_i2c->client->dev, + "MAX XY(%d/%d), area_edge %d, area_indicator %d, area_navigation %d\n", + max_x, max_y, wac_i2c->pdata->area_edge, + wac_i2c->pdata->area_indicator, wac_i2c->pdata->area_navigation); + } + + for (i = 0; i < EPEN_LOCATION_DETECT_SIZE; ++i) + loc[i] = 0; + + if (x < wac_i2c->pdata->area_edge) + strcat(loc, "E."); + else if (x < (max_x - wac_i2c->pdata->area_edge)) + strcat(loc, "C."); + else + strcat(loc, "e."); + + if (y < wac_i2c->pdata->area_indicator) + strcat(loc, "S"); + else if (y < (max_y - wac_i2c->pdata->area_navigation)) + strcat(loc, "C"); + else + strcat(loc, "N"); +} + +void w9019_i2c_coord_modify(struct wacom_i2c *wac_i2c) +{ + struct wacom_g5_platform_data *pdata = wac_i2c->pdata; + s16 tmp; + + /* origin */ + wac_i2c->x = wac_i2c->x - pdata->origin[0]; + wac_i2c->y = wac_i2c->y - pdata->origin[1]; + + /* change axis from wacom to lcd */ + if (pdata->x_invert) { + wac_i2c->x = pdata->max_x - wac_i2c->x; + wac_i2c->tilt_x = -wac_i2c->tilt_x; + } + + if (pdata->y_invert) { + wac_i2c->y = pdata->max_y - wac_i2c->y; + wac_i2c->tilt_y = -wac_i2c->tilt_y; + } + + if (pdata->xy_switch) { + tmp = wac_i2c->x; + wac_i2c->x = wac_i2c->y; + wac_i2c->y = tmp; + + tmp = wac_i2c->tilt_x; + wac_i2c->tilt_x = wac_i2c->tilt_y; + wac_i2c->tilt_y = tmp; + } +} + +static void wacom_i2c_coord_handler(struct wacom_i2c *wac_i2c, char *data) +{ + struct wacom_g5_platform_data *pdata = wac_i2c->pdata; + struct i2c_client *client = wac_i2c->client; + bool prox = false; + bool rdy = false; + bool stylus; + char location[EPEN_LOCATION_DETECT_SIZE] = { 0, }; + + if (wac_i2c->debug_flag & WACOM_DEBUG_PRINT_COORDEVENT) { + input_info(true, &wac_i2c->client->dev, + "%s : %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", + __func__, data[0], data[1], data[2], data[3], data[4], data[5], + data[6], data[7], data[8], data[9], data[10], data[11], + data[12], data[13]); + } + + rdy = !!(data[0] & 0x80); + + wac_i2c->x = ((u16)data[1] << 8) + (u16)data[2]; + wac_i2c->y = ((u16)data[3] << 8) + (u16)data[4]; + wac_i2c->pressure = ((u16)(data[5] & 0x0F) << 8) + (u16)data[6]; + wac_i2c->height = (u8)data[7]; + wac_i2c->tilt_x = (s8)data[8]; + wac_i2c->tilt_y = (s8)data[9]; + + w9019_i2c_coord_modify(wac_i2c); + + if (rdy) { + prox = !!(data[0] & 0x10); + stylus = !!(data[0] & 0x20); + + /* validation check */ + if (unlikely (pdata->xy_switch == 0 && (wac_i2c->x > pdata->max_x || wac_i2c->y > pdata->max_y) || + pdata->xy_switch == 1 && (wac_i2c->x > pdata->max_y || wac_i2c->y > pdata->max_x))) { +#if WACOM_PRODUCT_SHIP + input_info(true, &client->dev, "%s : Abnormal raw data x & y\n", __func__); +#else + input_info(true, &client->dev, "%s : Abnormal raw data x=%d, y=%d\n", __func__, wac_i2c->x, wac_i2c->y); +#endif + return; + } + + if (data[0] & 0x40) + wac_i2c->tool = BTN_TOOL_RUBBER; + else + wac_i2c->tool = BTN_TOOL_PEN; + + if (!wac_i2c->pen_prox) { + wac_i2c->pen_prox = true; + + w9019_epen_location_detect(wac_i2c, location, wac_i2c->x, wac_i2c->y); + wac_i2c->hi_x = wac_i2c->x; + wac_i2c->hi_y = wac_i2c->y; +#if WACOM_PRODUCT_SHIP + input_info(true, &client->dev, "[HI] loc:%s (%s)\n", + location, wac_i2c->tool == BTN_TOOL_PEN ? "p" : "r"); +#else + input_info(true, &client->dev, "[HI] x:%d y:%d loc:%s (%s) \n", + wac_i2c->x, wac_i2c->y, location, wac_i2c->tool == BTN_TOOL_PEN ? "pen" : "rubber"); +#endif +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + sec_input_notify(&wac_i2c->nb, NOTIFIER_WACOM_PEN_HOVER_IN, NULL); +#endif + return; + } + + /* report info */ + input_report_abs(wac_i2c->input_dev, ABS_X, wac_i2c->x); + input_report_abs(wac_i2c->input_dev, ABS_Y, wac_i2c->y); + input_report_key(wac_i2c->input_dev, BTN_STYLUS, stylus); + input_report_key(wac_i2c->input_dev, BTN_TOUCH, prox); + + input_report_abs(wac_i2c->input_dev, ABS_PRESSURE, wac_i2c->pressure); + input_report_abs(wac_i2c->input_dev, ABS_DISTANCE, wac_i2c->height); + input_report_abs(wac_i2c->input_dev, ABS_TILT_X, wac_i2c->tilt_x); + input_report_abs(wac_i2c->input_dev, ABS_TILT_Y, wac_i2c->tilt_y); + input_report_key(wac_i2c->input_dev, wac_i2c->tool, 1); + input_sync(wac_i2c->input_dev); + + if (wac_i2c->debug_flag & WACOM_DEBUG_PRINT_ALLEVENT) + input_info(true, &client->dev, "[A] x:%d y:%d, p:%d, h:%d, tx:%d, ty:%d\n", + wac_i2c->x, wac_i2c->y, wac_i2c->pressure, wac_i2c->height, + wac_i2c->tilt_x, wac_i2c->tilt_y); + + wac_i2c->mcount++; + + /* log */ + if (prox && !wac_i2c->pen_pressed) { + w9019_epen_location_detect(wac_i2c, location, wac_i2c->x, wac_i2c->y); + wac_i2c->p_x = wac_i2c->x; + wac_i2c->p_y = wac_i2c->y; + +#if WACOM_PRODUCT_SHIP + input_info(true, &client->dev, "[P] p:%d loc:%s tool:%x mc:%d\n", + wac_i2c->pressure, location, wac_i2c->tool, wac_i2c->mcount); +#else + input_info(true, &client->dev, + "[P] x:%d y:%d p:%d loc:%s tool:%x mc:%d\n", + wac_i2c->x, wac_i2c->y, wac_i2c->pressure, location, wac_i2c->tool, wac_i2c->mcount); +#endif + } else if (!prox && wac_i2c->pen_pressed) { + w9019_epen_location_detect(wac_i2c, location, wac_i2c->x, wac_i2c->y); +#if WACOM_PRODUCT_SHIP + input_info(true, &client->dev, "[R] dd:%d,%d loc:%s tool:%x mc:%d\n", + wac_i2c->x - wac_i2c->p_x, wac_i2c->y - wac_i2c->p_y, + location, wac_i2c->tool, wac_i2c->mcount); +#else + input_info(true, &client->dev, + "[R] lx:%d ly:%d dd:%d,%d loc:%s tool:%x mc:%d\n", + wac_i2c->x, wac_i2c->y, + wac_i2c->x - wac_i2c->p_x, wac_i2c->y - wac_i2c->p_y, + location, wac_i2c->tool, wac_i2c->mcount); +#endif + wac_i2c->p_x = wac_i2c->p_y = 0; + } + wac_i2c->pen_pressed = prox; + + /* check side */ + if (stylus && !wac_i2c->side_pressed) + input_info(true, &client->dev, "side on\n"); + else if (!stylus && wac_i2c->side_pressed) + input_info(true, &client->dev, "side off\n"); + + wac_i2c->side_pressed = stylus; + } else { + if (wac_i2c->pen_prox) { + input_report_abs(wac_i2c->input_dev, ABS_PRESSURE, 0); + input_report_key(wac_i2c->input_dev, BTN_STYLUS, 0); + input_report_key(wac_i2c->input_dev, BTN_TOUCH, 0); + /* prevent invalid operation of input booster */ + input_sync(wac_i2c->input_dev); + + input_report_abs(wac_i2c->input_dev, ABS_DISTANCE, 0); + input_report_key(wac_i2c->input_dev, BTN_TOOL_RUBBER, 0); + input_report_key(wac_i2c->input_dev, BTN_TOOL_PEN, 0); + input_sync(wac_i2c->input_dev); + + w9019_epen_location_detect(wac_i2c, location, wac_i2c->x, wac_i2c->y); + + if (wac_i2c->pen_pressed) { +#if WACOM_PRODUCT_SHIP + input_info(true, &client->dev, + "[R] dd:%d,%d loc:%s tool:%x mc:%d & [HO] dd:%d,%d\n", + wac_i2c->x - wac_i2c->p_x, wac_i2c->y - wac_i2c->p_y, + location, wac_i2c->tool, wac_i2c->mcount, + wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y); +#else + input_info(true, &client->dev, + "[R] lx:%d ly:%d dd:%d,%d loc:%s tool:%x mc:%d & [HO] dd:%d,%d\n", + wac_i2c->x, wac_i2c->y, + wac_i2c->x - wac_i2c->p_x, wac_i2c->y - wac_i2c->p_y, + location, wac_i2c->tool, wac_i2c->mcount, + wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y); +#endif + } else { +#if WACOM_PRODUCT_SHIP + input_info(true, &client->dev, "[HO] dd:%d,%d loc:%s mc:%d\n", + wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y, + location, wac_i2c->mcount); + +#else + input_info(true, &client->dev, "[HO] lx:%d ly:%d dd:%d,%d loc:%s mc:%d\n", + wac_i2c->x, wac_i2c->y, + wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y, + location, wac_i2c->mcount); +#endif + } +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + sec_input_notify(&wac_i2c->nb, NOTIFIER_WACOM_PEN_HOVER_OUT, NULL); +#endif + wac_i2c->p_x = wac_i2c->p_y = wac_i2c->hi_x = wac_i2c->hi_y = 0; + + } else { + input_info(true, &client->dev, + "unexpected data : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", + data[0], data[1], data[2], data[3], data[4], data[5], + data[6], data[7], data[8], data[9], data[10], data[11], + data[12], data[13], data[14], data[15]); + } + + wac_i2c->pen_prox = 0; + wac_i2c->pen_pressed = 0; + wac_i2c->side_pressed = 0; + wac_i2c->mcount = 0; + } + + return; +} + +static void wacom_i2c_aop_handler(struct wacom_i2c *wac_i2c, char *data) +{ + struct wacom_g5_platform_data *pdata = wac_i2c->pdata; + //bool stylus, prox = false; + s16 x, y, tmp; +// u8 wacom_mode, wakeup_id; + s16 pressure, height, tilt_x, tilt_y; + + if (wac_i2c->screen_on || !wac_i2c->survey_mode || + !(wac_i2c->function_set & EPEN_SETMODE_AOP)) { + input_info(true, &wac_i2c->client->dev, "%s: unexpected status(%d %d %d)\n", + __func__, wac_i2c->screen_on, wac_i2c->survey_mode, + wac_i2c->function_set & EPEN_SETMODE_AOP); + return; + } + + if (wac_i2c->function_set & EPEN_SETMODE_AOP) { + if (data[10] == AOP_BUTTON_HOVER) { + if (wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO) { + input_info(true, &wac_i2c->client->dev, "Hover & Side Button detected\n"); + + input_report_key(wac_i2c->input_dev, + KEY_WAKEUP_UNLOCK, 1); + input_sync(wac_i2c->input_dev); + + input_report_key(wac_i2c->input_dev, + KEY_WAKEUP_UNLOCK, 0); + input_sync(wac_i2c->input_dev); + + x = ((u16) data[1] << 8) + (u16) data[2]; + y = ((u16) data[3] << 8) + (u16) data[4]; + + /* origin */ + x = x - pdata->origin[0]; + y = y - pdata->origin[1]; + /* change axis from wacom to lcd */ + if (pdata->x_invert) + x = pdata->max_x - x; + + if (pdata->y_invert) + y = pdata->max_y - y; + + if (pdata->xy_switch) { + tmp = x; + x = y; + y = tmp; + } + + wac_i2c->survey_pos.id = EPEN_POS_ID_SCREEN_OF_MEMO; + wac_i2c->survey_pos.x = x; + wac_i2c->survey_pos.y = y; + } else { + input_info(true, &wac_i2c->client->dev, + "AOP detected but skip report, screen_off_memo disabled\n"); + } + } else if (data[10] == AOP_DOUBLE_TAB) { + if ((wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON) == EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON) { + input_info(true, &wac_i2c->client->dev, "Double Tab detected in AOD\n"); + + x = ((u16) data[1] << 8) + (u16) data[2]; + y = ((u16) data[3] << 8) + (u16) data[4]; + pressure = ((u16) data[5] << 8) + (u16) data[6]; + height = data[7]; + tilt_x = (s8) data[9]; + tilt_y = -(s8) data[8]; + + /* origin */ + x = x - pdata->origin[0]; + y = y - pdata->origin[1]; + /* change axis from wacom to lcd */ + if (pdata->x_invert) + x = pdata->max_x - x; + + if (pdata->y_invert) + y = pdata->max_y - y; + + if (pdata->xy_switch) { + tmp = x; + x = y; + y = tmp; + } + + if (data[0] & 0x40) + wac_i2c->tool = BTN_TOOL_RUBBER; + else + wac_i2c->tool = BTN_TOOL_PEN; + + /* make press / release event for AOP double tab gesture */ + input_report_abs(wac_i2c->input_dev, ABS_X, x); + input_report_abs(wac_i2c->input_dev, ABS_Y, y); + input_report_key(wac_i2c->input_dev, wac_i2c->tool, 1); + input_sync(wac_i2c->input_dev); + + input_report_abs(wac_i2c->input_dev, ABS_PRESSURE, pressure); + input_report_key(wac_i2c->input_dev, BTN_TOUCH, 1); + input_sync(wac_i2c->input_dev); + + input_report_abs(wac_i2c->input_dev, ABS_PRESSURE, 0); + input_report_key(wac_i2c->input_dev, BTN_TOUCH, 0); + input_sync(wac_i2c->input_dev); + + input_report_key(wac_i2c->input_dev, wac_i2c->tool, 0); + input_sync(wac_i2c->input_dev); +#if WACOM_PRODUCT_SHIP + input_info(true, &wac_i2c->client->dev, "[P/R] tool:%x\n", + wac_i2c->tool); +#else + input_info(true, &wac_i2c->client->dev, + "[P/R] x:%d y:%d tool:%x\n", x, y, wac_i2c->tool); +#endif + } else if (wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_AOT) { + input_info(true, &wac_i2c->client->dev, "Double Tab detected\n"); + + input_report_key(wac_i2c->input_dev, KEY_HOMEPAGE, 1); + input_sync(wac_i2c->input_dev); + input_report_key(wac_i2c->input_dev, KEY_HOMEPAGE, 0); + input_sync(wac_i2c->input_dev); + } else { + input_info(true, &wac_i2c->client->dev, + "AOP Double Tab detected but skip report, aod & aot disabled\n"); + } + } else { + input_info(true, &wac_i2c->client->dev, + "unexpected AOP data : %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", + data[0], data[1], data[2], data[3], data[4], data[5], + data[6], data[7], data[8], data[9], data[10], data[11], + data[12], data[13]); + } + } +} +static int wacom_event_handler(struct wacom_i2c *wac_i2c) +{ + int ret; + bool debug = true; + char buff[COM_COORD_NUM + 1] = { 0, }; + + ret = w9019_i2c_recv(wac_i2c, buff, COM_COORD_NUM + 1); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: read failed\n", __func__); + return ret; + } + + if (!wac_i2c->screen_on && wac_i2c->survey_mode) { + input_info(true, &wac_i2c->client->dev, + "%s: lcd off & survey mode on\n", __func__); + wacom_i2c_aop_handler(wac_i2c, buff); + } else { + wacom_i2c_coord_handler(wac_i2c, buff); + debug = false; + } + + if (debug) { + input_info(true, &wac_i2c->client->dev, + "%x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", + buff[0], buff[1], buff[2], buff[3], buff[4], buff[5], + buff[6], buff[7], buff[8], buff[9], buff[10], buff[11], + buff[12], buff[13]); + } + return ret; +} + +static irqreturn_t wacom_interrupt(int irq, void *dev_id) +{ + struct wacom_i2c *wac_i2c = dev_id; + int ret = 0; + + /* in LPM, waiting blsp block resume */ + if (wac_i2c->pm_suspend) { + __pm_wakeup_event(wac_i2c->wacom_ws, jiffies_to_msecs(500)); + /* waiting for blsp block resuming, if not occurs i2c error */ + ret = wait_for_completion_interruptible_timeout(&wac_i2c->resume_done, msecs_to_jiffies(500)); + if (ret <= 0) { + input_err(true, &wac_i2c->client->dev, "LPM: pm resume is not handled [%d]\n", ret); + return IRQ_HANDLED; + } else { + input_info(true, &wac_i2c->client->dev, + "%s: run LPM interrupt handler, %d\n", __func__, jiffies_to_msecs(ret)); + } + } + + ret = wacom_event_handler(wac_i2c); + if (ret < 0) { + w9019_forced_release(wac_i2c); + w9019_forced_release_fullscan(wac_i2c); + wac_i2c->reset_flag = true; + } + + return IRQ_HANDLED; +} + +static void open_test_work(struct work_struct *work) +{ + struct wacom_i2c *wac_i2c = + container_of(work, struct wacom_i2c, open_test_dwork.work); + char data; + int ret = 0; + +#if !WACOM_SEC_FACTORY + input_info(true, &wac_i2c->client->dev, "%s : start!\n", __func__); + + if (wac_i2c->pdata->support_garage_open_test) { + ret = w9019_open_test(wac_i2c, WACOM_GARAGE_TEST); + if (ret) { + input_err(true, &wac_i2c->client->dev, "grage test check failed %d\n", ret); + w9019_reset_hw(wac_i2c); + } + } + + ret = w9019_open_test(wac_i2c, WACOM_DIGITIZER_TEST); + if (ret) { + input_err(true, &wac_i2c->client->dev, "open test check failed %d\n", ret); + w9019_reset_hw(wac_i2c); + } + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + if (wac_i2c->is_tsp_block) { + wac_i2c->tsp_scan_mode = sec_input_notify(&wac_i2c->nb, NOTIFIER_TSP_BLOCKING_RELEASE, NULL); + wac_i2c->is_tsp_block = false; + input_err(true, &wac_i2c->client->dev, "%s : release tsp scan block\n", __func__); + } +#endif + + input_info(true, &wac_i2c->client->dev, "%s : end!\n", __func__); +#else + input_info(true, &wac_i2c->client->dev, "open test skiped!\n"); +#endif + + /* occur cover status event*/ + if (wac_i2c->pdata->support_cover_detection) { + data = COM_KBDCOVER_CHECK_STATUS; + ret = w9019_i2c_send(wac_i2c, &data, 1); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to send cover status event %d\n", __func__, ret); + } + } +} + +static void probe_open_test(struct wacom_i2c *wac_i2c) +{ + INIT_DELAYED_WORK(&wac_i2c->open_test_dwork, open_test_work); + + /* update the current status */ + schedule_delayed_work(&wac_i2c->open_test_dwork, msecs_to_jiffies(100)); +} + +static int wacom_i2c_input_open(struct input_dev *dev) +{ + struct wacom_i2c *wac_i2c = input_get_drvdata(dev); + int ret = 0; + + input_info(true, &wac_i2c->client->dev, "%s(%s)\n", __func__, + dev->name); + + wac_i2c->pdata->enabled = true; + +#if WACOM_SEC_FACTORY + if (wac_i2c->epen_blocked){ + input_err(true, &wac_i2c->client->dev, "%s : FAC epen_blocked SKIP!!\n", __func__); + return ret; + } +#else + if (wac_i2c->epen_blocked){ + input_err(true, &wac_i2c->client->dev, "%s : epen_blocked. disable mode \n", __func__); + w9019_disable_mode(wac_i2c, WACOM_DISABLE); + return ret; + } +#endif + + w9019_wakeup_sequence(wac_i2c); + + return ret; +} + +static void wacom_i2c_input_close(struct input_dev *dev) +{ + struct wacom_i2c *wac_i2c = input_get_drvdata(dev); + + input_info(true, &wac_i2c->client->dev, "%s(%s)\n", __func__, + dev->name); + + if (!wac_i2c->probe_done) { + input_err(true, &wac_i2c->client->dev, "%s : not probe done & skip!\n", __func__); + return; + } + + wac_i2c->pdata->enabled = false; + +#if WACOM_SEC_FACTORY + if (wac_i2c->epen_blocked){ + input_err(true, &wac_i2c->client->dev, "%s : FAC epen_blocked SKIP!!\n", __func__); + return; + } +#else + if (wac_i2c->epen_blocked){ + input_err(true, &wac_i2c->client->dev, "%s : epen_blocked. disable mode \n", __func__); + w9019_disable_mode(wac_i2c, WACOM_DISABLE); + return; + } +#endif + + w9019_sleep_sequence(wac_i2c); +} + +static void wacom_i2c_set_input_values(struct wacom_i2c *wac_i2c, + struct input_dev *input_dev) +{ + struct i2c_client *client = wac_i2c->client; + struct wacom_g5_platform_data *pdata = wac_i2c->pdata; + /* Set input values before registering input device */ + + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + input_dev->open = wacom_i2c_input_open; + input_dev->close = wacom_i2c_input_close; + + input_set_abs_params(input_dev, ABS_PRESSURE, 0, pdata->max_pressure, 0, 0); + input_set_abs_params(input_dev, ABS_DISTANCE, 0, pdata->max_height, 0, 0); + input_set_abs_params(input_dev, ABS_TILT_X, -pdata->max_x_tilt, pdata->max_x_tilt, 0, 0); + input_set_abs_params(input_dev, ABS_TILT_Y, -pdata->max_y_tilt, pdata->max_y_tilt, 0, 0); + + if (pdata->xy_switch) { + input_set_abs_params(input_dev, ABS_X, 0, pdata->max_y, 4, 0); + input_set_abs_params(input_dev, ABS_Y, 0, pdata->max_x, 4, 0); + } else { + input_set_abs_params(input_dev, ABS_X, 0, pdata->max_x, 4, 0); + input_set_abs_params(input_dev, ABS_Y, 0, pdata->max_y, 4, 0); + } + + input_set_capability(input_dev, EV_KEY, BTN_TOOL_PEN); + input_set_capability(input_dev, EV_KEY, BTN_TOOL_RUBBER); + input_set_capability(input_dev, EV_KEY, BTN_TOUCH); + input_set_capability(input_dev, EV_KEY, BTN_STYLUS); + + input_set_capability(input_dev, EV_SW, SW_PEN_INSERT); + + /* AOP */ + input_set_capability(input_dev, EV_KEY, KEY_WAKEUP_UNLOCK); + input_set_capability(input_dev, EV_KEY, KEY_HOMEPAGE); + + /* flip cover */ + input_set_capability(input_dev, EV_SW, SW_FLIP); + + input_set_drvdata(input_dev, wac_i2c); +} + +void w9019_print_info(struct wacom_i2c *wac_i2c) +{ + if (!wac_i2c) + return; + + if (!wac_i2c->client) + return; + + wac_i2c->print_info_cnt_open++; + + if (wac_i2c->print_info_cnt_open > 0xfff0) + wac_i2c->print_info_cnt_open = 0; + if (wac_i2c->scan_info_fail_cnt > 1000) + wac_i2c->scan_info_fail_cnt = 1000; + + input_info(true, &wac_i2c->client->dev, + "%s: ps %s, pen %s, report_scan_seq %d, epen %s, count(%u,%u,%u), " + "mode(%d), block_cnt(%d), check(%d), test(%d,%d), ver[0x%x], cover(%d,%d) #%d\n", + __func__, wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_result & EPEN_EVENT_PEN_OUT) ? "out" : "in", + wac_i2c->report_scan_seq, wac_i2c->epen_blocked ? "blocked" : "unblocked", + wac_i2c->i2c_fail_count, wac_i2c->abnormal_reset_count, wac_i2c->scan_info_fail_cnt, + wac_i2c->check_survey_mode, wac_i2c->tsp_block_cnt, wac_i2c->check_elec, + wac_i2c->connection_check, wac_i2c->garage_connection_check, + wac_i2c->fw_ver_ic, wac_i2c->cover, wac_i2c->flip_state, wac_i2c->print_info_cnt_open); +} + +static void wacom_print_info_work(struct work_struct *work) +{ + struct wacom_i2c *wac_i2c = container_of(work, struct wacom_i2c, work_print_info.work); + + w9019_print_info(wac_i2c); + schedule_delayed_work(&wac_i2c->work_print_info, msecs_to_jiffies(30000)); // 30s +} + +int w9019_load_fw_built_in(struct wacom_i2c *wac_i2c, int fw_index) +{ + int ret = 0; + const char *fw_load_path = NULL; +#if WACOM_SEC_FACTORY + int index = 0; +#endif + + input_info(true, &wac_i2c->client->dev, "%s: load_fw_built_in (%d)\n", __func__, fw_index); + + fw_load_path = wac_i2c->pdata->fw_path; + +#if WACOM_SEC_FACTORY + if (fw_index != FW_BUILT_IN) { + if (fw_index == FW_FACTORY_GARAGE) + index = 0; + else if (fw_index == FW_FACTORY_UNIT) + index = 1; + + ret = of_property_read_string_index(wac_i2c->client->dev.of_node, + "wacom,fw_fac_path", index, &wac_i2c->pdata->fw_fac_path); + if (ret) { + input_err(true, &wac_i2c->client->dev, "%s: failed to read fw_fac_path %d\n", __func__, ret); + wac_i2c->pdata->fw_fac_path = NULL; + } + + fw_load_path = wac_i2c->pdata->fw_fac_path; + + input_info(true, &wac_i2c->client->dev, "%s: load %s firmware\n", + __func__, fw_load_path); + } +#endif + + if (fw_load_path == NULL) { + input_err(true, &wac_i2c->client->dev, + "Unable to open firmware. fw_path is NULL\n"); + return -EINVAL; + } + + ret = request_firmware(&wac_i2c->firm_data, fw_load_path, &wac_i2c->client->dev); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "Unable to open firmware. ret %d\n", ret); + return ret; + } + + wac_i2c->fw_img = (struct fw_image *)wac_i2c->firm_data->data; + + return ret; +} + +static int wacom_i2c_get_fw_size(struct wacom_i2c *wac_i2c) +{ + u32 fw_size = 0; + + if (wac_i2c->pdata->ic_type == MPU_W9020) + fw_size = 144 * 1024; + else if (wac_i2c->pdata->ic_type == MPU_W9021) + fw_size = 256 * 1024; + else if (wac_i2c->pdata->ic_type == MPU_WEZ01) + fw_size = 256 * 1024; + else + fw_size = 128 * 1024; + + input_info(true, &wac_i2c->client->dev, "%s: type[%d] size[0x%X]\n", + __func__, wac_i2c->pdata->ic_type, fw_size); + + return fw_size; +} + +static int load_fw_sdcard(struct wacom_i2c *wac_i2c, u8 fw_index, const char *file_path) +{ + struct i2c_client *client = wac_i2c->client; + long fsize; + int ret = 0; + unsigned int nSize; + unsigned long nSize2; +#ifdef SUPPORT_FW_SIGNED + long spu_ret; +#endif + + nSize = wacom_i2c_get_fw_size(wac_i2c); + nSize2 = nSize + sizeof(struct fw_image); + + ret = request_firmware(&wac_i2c->firm_data, file_path, &wac_i2c->client->dev); + if (ret) { + input_err(true, &client->dev, "firmware is not available %d.\n", ret); + ret = -ENOENT; + return ret; + } + + fsize = wac_i2c->firm_data->size; + input_info(true, &client->dev, "start, file path %s, size %ld Bytes\n", file_path, fsize); + +#ifdef SUPPORT_FW_SIGNED + if (fw_index == FW_IN_SDCARD_SIGNED || fw_index == FW_SPU || fw_index == FW_VERIFICATION) { + /* name 5, digest 32, signature 512 */ + fsize -= SPU_METADATA_SIZE(WACOM); + } +#endif + + if ((fsize != nSize) && (fsize != nSize2)) { + input_err(true, &client->dev, "UMS firmware size is different\n"); + ret = -EFBIG; + goto out; + } + +#ifdef SUPPORT_FW_SIGNED + if (fw_index == FW_IN_SDCARD_SIGNED || fw_index == FW_SPU || fw_index == FW_VERIFICATION) { + /* name 5, digest 32, signature 512 */ + + spu_ret = spu_firmware_signature_verify("WACOM", wac_i2c->firm_data->data, wac_i2c->firm_data->size); + + input_info(true, &client->dev, "%s: spu_ret : %ld, spu_fsize : %ld // fsize:%ld\n", + __func__, spu_ret, wac_i2c->firm_data->size, fsize); + + if (spu_ret != fsize) { + input_err(true, &client->dev, "%s: signature verify failed, %ld\n", __func__, spu_ret); + ret = -ENOENT; + goto out; + } + } +#endif + + wac_i2c->fw_img = (struct fw_image *)wac_i2c->firm_data->data; + return 0; + +out: + return ret; +} + +int w9019_i2c_load_fw(struct wacom_i2c *wac_i2c, u8 fw_update_way) +{ + int ret = 0; + struct fw_image *fw_img; + struct i2c_client *client = wac_i2c->client; + + switch (fw_update_way) { + case FW_BUILT_IN: +#if WACOM_SEC_FACTORY + case FW_FACTORY_GARAGE: + case FW_FACTORY_UNIT: +#endif + ret = w9019_load_fw_built_in(wac_i2c, fw_update_way); + break; + case FW_IN_SDCARD: + ret = load_fw_sdcard(wac_i2c, fw_update_way, WACOM_PATH_EXTERNAL_FW); + break; + case FW_IN_SDCARD_SIGNED: + ret = load_fw_sdcard(wac_i2c, fw_update_way, WACOM_PATH_EXTERNAL_FW_SIGNED); + break; + case FW_SPU: + case FW_VERIFICATION: + ret = load_fw_sdcard(wac_i2c, fw_update_way, WACOM_PATH_SPU_FW_SIGNED); + break; + default: + input_info(true, &client->dev, "unknown path(%d)\n", fw_update_way); + goto err_load_fw; + } + + if (ret < 0) + goto err_load_fw; + + fw_img = wac_i2c->fw_img; + + /* header check */ + if (fw_img->hdr_ver == 1 && fw_img->hdr_len == sizeof(struct fw_image)) { + wac_i2c->fw_data = (u8 *) fw_img->data; +#if WACOM_SEC_FACTORY + if ((fw_update_way == FW_BUILT_IN) || + (fw_update_way == FW_FACTORY_UNIT) || (fw_update_way == FW_FACTORY_GARAGE)) { +#else + if (fw_update_way == FW_BUILT_IN) { +#endif + wac_i2c->fw_ver_bin = fw_img->fw_ver1; + memcpy(wac_i2c->fw_chksum, fw_img->checksum, 5); + } else if (fw_update_way == FW_SPU || fw_update_way == FW_VERIFICATION) { + wac_i2c->fw_ver_spu = fw_img->fw_ver1; + memcpy(wac_i2c->fw_chksum, fw_img->checksum, 5); + } + } else { + input_err(true, &client->dev, "no hdr\n"); + wac_i2c->fw_data = (u8 *) fw_img; + } + + return ret; + +err_load_fw: + wac_i2c->fw_data = NULL; + return ret; +} + +void w9019_i2c_unload_fw(struct wacom_i2c *wac_i2c) +{ + switch (wac_i2c->fw_update_way) { + case FW_BUILT_IN: +#if WACOM_SEC_FACTORY + case FW_FACTORY_GARAGE: + case FW_FACTORY_UNIT: +#endif + release_firmware(wac_i2c->firm_data); + break; + case FW_IN_SDCARD: + case FW_IN_SDCARD_SIGNED: + case FW_SPU: + case FW_VERIFICATION: + release_firmware(wac_i2c->firm_data); + break; + default: + break; + } + + wac_i2c->fw_img = NULL; + wac_i2c->fw_update_way = FW_NONE; + wac_i2c->firm_data = NULL; + wac_i2c->fw_data = NULL; +} + +int w9019_fw_update_on_hidden_menu(struct wacom_i2c *wac_i2c, u8 fw_update_way) +{ + struct i2c_client *client = wac_i2c->client; + u32 fw_ver_ic = wac_i2c->fw_ver_ic; + int ret; + int retry = 3; + + input_info(true, &client->dev, "%s: update:%d\n", __func__, fw_update_way); + + if (wac_i2c->wacom_fw_ws->active) { + input_info(true, &client->dev, "update is already running. pass\n"); + return 0; + } + + mutex_lock(&wac_i2c->update_lock); + w9019_enable_irq(wac_i2c, false); + + /* release pen, if it is pressed */ + if (wac_i2c->pen_pressed || wac_i2c->side_pressed || wac_i2c->pen_prox) + w9019_forced_release(wac_i2c); + + if (wac_i2c->is_tsp_block) + w9019_forced_release_fullscan(wac_i2c); + + ret = w9019_i2c_load_fw(wac_i2c, fw_update_way); + if (ret < 0) { + input_info(true, &client->dev, "failed to load fw data\n"); + wac_i2c->update_status = FW_UPDATE_FAIL; + goto err_update_load_fw; + } + wac_i2c->fw_update_way = fw_update_way; + + /* firmware info */ + if (fw_update_way == FW_SPU || fw_update_way == FW_VERIFICATION) + input_info(true, &client->dev, "wacom ic fw ver : 0x%x, new fw ver : 0x%x\n", + wac_i2c->fw_ver_ic, wac_i2c->fw_ver_spu); + else + input_info(true, &client->dev, "wacom ic fw ver : 0x%x, new fw ver : 0x%x\n", + wac_i2c->fw_ver_ic, wac_i2c->fw_ver_bin); + + // have to check it later + if (wac_i2c->fw_update_way == FW_BUILT_IN && wac_i2c->pdata->bringup == 1) { + input_info(true, &client->dev, "bringup #1. do not update\n"); + wac_i2c->update_status = FW_UPDATE_FAIL; + goto out_update_fw; + } + + /* If FFU firmware version is lower than IC's version, do not run update routine */ + if (fw_update_way == FW_SPU && fw_ver_ic >= wac_i2c->fw_ver_spu) { + input_info(true, &client->dev, "FFU. update is skipped\n"); + wac_i2c->update_status = FW_UPDATE_PASS; + + w9019_i2c_unload_fw(wac_i2c); + w9019_enable_irq(wac_i2c, true); + mutex_unlock(&wac_i2c->update_lock); + return 0; + } else if (fw_update_way == FW_VERIFICATION) { + input_info(true, &client->dev, "SPU verified. update is skipped\n"); + wac_i2c->update_status = FW_UPDATE_PASS; + + w9019_i2c_unload_fw(wac_i2c); + w9019_enable_irq(wac_i2c, true); + mutex_unlock(&wac_i2c->update_lock); + return 0; + } + + wac_i2c->update_status = FW_UPDATE_RUNNING; + + while (retry--) { + ret = w9019_i2c_flash(wac_i2c); + if (ret) { + input_info(true, &client->dev, "failed to flash fw(%d) %d\n", ret, retry); + continue; + } + break; + } + + retry = 3; + while (retry--) { + ret = w9019_i2c_query(wac_i2c); + if (ret < 0) { + input_info(true, &client->dev, "%s : failed to query to IC(%d) & reset, %d\n", + __func__, ret, retry); + w9019_compulsory_flash_mode(wac_i2c, false); + w9019_reset_hw(wac_i2c); + continue; + } + break; + } + + if (ret) { + wac_i2c->update_status = FW_UPDATE_FAIL; + wac_i2c->fw_ver_ic = 0; + goto out_update_fw; + } + + wac_i2c->update_status = FW_UPDATE_PASS; + +#if WACOM_SEC_FACTORY + ret = w9019_check_ub(wac_i2c->client); + if (ret < 0) { + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_GARAGE_AOP); + input_info(true, &client->dev, "Change mode for garage scan\n"); + } +#endif + + w9019_i2c_unload_fw(wac_i2c); + w9019_enable_irq(wac_i2c, true); + mutex_unlock(&wac_i2c->update_lock); + + return 0; + +out_update_fw: + w9019_i2c_unload_fw(wac_i2c); +err_update_load_fw: + w9019_enable_irq(wac_i2c, true); + mutex_unlock(&wac_i2c->update_lock); + +#if WACOM_SEC_FACTORY + ret = w9019_check_ub(wac_i2c->client); + if (ret < 0) { + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_GARAGE_AOP); + input_info(true, &client->dev, "Change mode for garage scan\n"); + } +#endif + + return -1; +} + +int w9019_fw_update_on_probe(struct wacom_i2c *wac_i2c) +{ + struct i2c_client *client = wac_i2c->client; + u32 fw_ver_ic = wac_i2c->fw_ver_ic; + int ret; + int retry = 3; + bool bforced = false; + + input_info(true, &client->dev, "%s\n", __func__); + + if (wac_i2c->pdata->bringup == 1) { + input_info(true, &client->dev, "bringup #1. do not update\n"); + wac_i2c->fw_ver_bin = 0; + goto skip_update_fw; + } + + ret = w9019_i2c_load_fw(wac_i2c, FW_BUILT_IN); + if (ret < 0) { + input_info(true, &client->dev, "failed to load fw data\n"); + goto err_update_load_fw; + } + + if (wac_i2c->query_status && (wac_i2c->pdata->ic_type != MPU_W9019)) { + input_err(true, &client->dev, "%s: MPU ver is not matched. unload driver. ic:%02X\n", + __func__, wac_i2c->pdata->ic_type); + goto err_update_fw; + } + + if (wac_i2c->pdata->bringup == 2) { + input_info(true, &client->dev, "bringup #2. do not update\n"); + goto out_update_fw; + } + + wac_i2c->fw_update_way = FW_BUILT_IN; + + /* firmware info */ + input_info(true, &client->dev, "wacom ic fw ver : 0x%x, new fw ver : 0x%x\n", + wac_i2c->fw_ver_ic, wac_i2c->fw_ver_bin); + + if (wac_i2c->pdata->bringup == 3) { + input_info(true, &client->dev, "bringup #3. force update\n"); + bforced = true; + } + + if (bforced) { + if (fw_ver_ic != wac_i2c->fw_ver_bin) + input_info(true, &client->dev, "not equal, update fw\n"); + else + goto out_update_fw; + } else { + if (wac_i2c->fw_ver_ic != wac_i2c->fw_ver_bin) { + input_info(true, &client->dev, "panel firmware is not same with binary firmware, do update\n"); + } else if (fw_ver_ic == wac_i2c->fw_ver_bin) { + ret = w9019_checksum(wac_i2c); + if (ret) { + input_info(true, &client->dev, "crc ok, do not update fw\n"); + goto out_update_fw; + } + input_info(true, &client->dev, "crc err, do update\n"); + + } else if (fw_ver_ic > wac_i2c->fw_ver_bin) { + input_info(true, &client->dev, "ic version is high, do not update fw\n"); + goto out_update_fw; + } + } + +//fw_update: + while (retry--) { + ret = w9019_i2c_flash(wac_i2c); + if (ret) { + input_info(true, &client->dev, "failed to flash fw(%d) %d\n", ret, retry); + if (!wac_i2c->bl_mpu_match) + goto err_update_fw; + else + continue; + continue; + } + break; + } + + retry = 3; + while (retry--) { + ret = w9019_i2c_query(wac_i2c); + if (ret) { + input_info(true, &client->dev, "%s : failed to query to IC(%d) & reset, %d\n", + __func__, ret, retry); + w9019_compulsory_flash_mode(wac_i2c, false); + w9019_reset_hw(wac_i2c); + continue; + } + break; + } + if (ret) { + wac_i2c->fw_ver_ic = 0; + goto err_update_fw; + } + +out_update_fw: + w9019_i2c_unload_fw(wac_i2c); +skip_update_fw: + +#if WACOM_SEC_FACTORY + ret = w9019_check_ub(wac_i2c->client); + if (ret < 0) { + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_GARAGE_AOP); + input_info(true, &client->dev, "Change mode for garage scan\n"); + } +#endif + + return 0; + +err_update_fw: + w9019_i2c_unload_fw(wac_i2c); +err_update_load_fw: + +#if WACOM_SEC_FACTORY + ret = w9019_check_ub(wac_i2c->client); + if (ret < 0) { + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_GARAGE_AOP); + input_info(true, &client->dev, "Change mode for garage scan\n"); + } +#endif + + return -1; +} + +/* epen_disable_mode + * 0 : wacom ic on + * 1 : wacom ic off + */ +void w9019_disable_mode(struct wacom_i2c *wac_i2c, wacom_disable_mode_t mode) +{ + struct i2c_client *client = wac_i2c->client; + + if (wac_i2c->epen_blocked == mode){ + input_info(true, &client->dev, "%s: duplicate call %d!\n", __func__, mode); + return; + } + + if (mode == WACOM_DISABLE) { + input_info(true, &client->dev, "%s: power off\n", __func__); + wac_i2c->epen_blocked = mode; + + w9019_enable_irq(wac_i2c, false); + w9019_power(wac_i2c, false); + + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + wac_i2c->tsp_scan_mode = sec_input_notify(&wac_i2c->nb, NOTIFIER_TSP_BLOCKING_RELEASE, NULL); + wac_i2c->is_tsp_block = false; +#endif + w9019_forced_release(wac_i2c); + } else if (mode == WACOM_ENABLE) { + input_info(true, &client->dev, "%s: power on\n", __func__); + wac_i2c->epen_blocked = mode; + + w9019_power(wac_i2c, true); + msleep(500); + + w9019_enable_irq(wac_i2c, true); + } + input_info(true, &client->dev, "%s: done %d!\n", __func__, mode); +} + +#if IS_ENABLED(CONFIG_MUIC_SUPPORT_KEYBOARDDOCK) +static void wac_i2c_kbd_work(struct work_struct *work) +{ + struct wacom_i2c *wac_i2c = container_of(work, struct wacom_i2c, kbd_work); + char data; + int ret; + + if (wac_i2c->kbd_conn_state == wac_i2c->kbd_cur_conn_state) { + input_info(true, &wac_i2c->client->dev, "%s: already %sconnected\n", + __func__, wac_i2c->kbd_conn_state ? "" : "dis"); + return; + } + + input_info(true, &wac_i2c->client->dev, "%s: %d\n", __func__, wac_i2c->kbd_conn_state); + + if (!wac_i2c->power_enable) { + input_err(true, &wac_i2c->client->dev, "%s: powered off\n", __func__); + return; + } + + if (wac_i2c->wacom_fw_ws->active) { + input_err(true, &wac_i2c->client->dev, "%s: fw update is running\n", __func__); + return; + } + + ret = w9019_start_stop_cmd(wac_i2c, WACOM_STOP_CMD); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to set stop cmd, %d\n", __func__, ret); + return; + } + + if (wac_i2c->kbd_conn_state) + data = COM_SPECIAL_COMPENSATION; + else + data = COM_NORMAL_COMPENSATION; + + ret = w9019_i2c_send(wac_i2c, &data, 1); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to send table swap cmd %d\n", __func__, ret); + } + msleep(30); + + ret = w9019_start_stop_cmd(wac_i2c, WACOM_STOP_AND_START_CMD); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to set stop-start cmd, %d\n", __func__, ret); + return; + } + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, wac_i2c->kbd_conn_state ? "on" : "off"); +} + +static int wacom_i2c_keyboard_notification_cb(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct wacom_i2c *wac_i2c = container_of(nb, struct wacom_i2c, kbd_nb); + int state = !!action; + + if (wac_i2c->kbd_conn_state == state) + goto out; + + cancel_work_sync(&wac_i2c->kbd_work); + wac_i2c->kbd_conn_state = state; + input_info(true, &wac_i2c->client->dev, "%s: current %d change to %d\n", + __func__, wac_i2c->kbd_cur_conn_state, state); + schedule_work(&wac_i2c->kbd_work); + +out: + return NOTIFY_DONE; +} +#endif + +void w9019_swap_compensation(struct wacom_i2c *wac_i2c, char cmd) +{ + char data; + int ret; + + input_info(true, &wac_i2c->client->dev, "%s: %d\n", __func__, cmd); + + if (!wac_i2c->power_enable) { + input_err(true, &wac_i2c->client->dev, + "%s: powered off\n", __func__); + return; + } + + if (wac_i2c->wacom_fw_ws->active) { + input_err(true, &wac_i2c->client->dev, + "%s: fw update is running\n", __func__); + return; + } + + data = COM_SAMPLERATE_STOP; + ret = w9019_i2c_send_sel(wac_i2c, &data, 1, WACOM_I2C_MODE_NORMAL); + if (ret != 1) { + input_err(true, &wac_i2c->client->dev, + "%s: failed to send stop cmd %d\n", + __func__, ret); + wac_i2c->reset_flag = true; + return; + } + wac_i2c->samplerate_state = false; + msleep(50); + + switch (cmd) { + case NOMAL_MODE: + data = COM_NORMAL_COMPENSATION; + break; + case BOOKCOVER_MODE: + data = COM_BOOKCOVER_COMPENSATION; + break; + case KBDCOVER_MODE: + data = COM_KBDCOVER_COMPENSATION; + break; + default: + input_err(true, &wac_i2c->client->dev, + "%s: get wrong cmd %d\n", + __func__, cmd); + } + + ret = w9019_i2c_send_sel(wac_i2c, &data, 1, WACOM_I2C_MODE_NORMAL); + if (ret != 1) { + input_err(true, &wac_i2c->client->dev, + "%s: failed to send table swap cmd %d\n", + __func__, ret); + wac_i2c->reset_flag = true; + return; + } + + data = COM_SAMPLERATE_STOP; + ret = w9019_i2c_send_sel(wac_i2c, &data, 1, WACOM_I2C_MODE_NORMAL); + if (ret != 1) { + input_err(true, &wac_i2c->client->dev, + "%s: failed to send stop cmd %d\n", + __func__, ret); + wac_i2c->reset_flag = true; + return; + } + + msleep(50); + + data = COM_SAMPLERATE_START; + ret = w9019_i2c_send_sel(wac_i2c, &data, 1, WACOM_I2C_MODE_NORMAL); + if (ret != 1) { + input_err(true, &wac_i2c->client->dev, + "%s: failed to send start cmd, %d\n", + __func__, ret); + wac_i2c->reset_flag = true; + return; + } + wac_i2c->samplerate_state = true; + + input_info(true, &wac_i2c->client->dev, "%s:send cover cmd %x\n", + __func__, cmd); + + return; +} + +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) +static void wacom_i2c_usb_typec_work(struct work_struct *work) +{ + struct wacom_i2c *wac_i2c = container_of(work, struct wacom_i2c, typec_work); + char data[5] = { 0 }; + int ret; + + if (wac_i2c->dp_connect_state == wac_i2c->dp_connect_cmd) + return; + + if (!wac_i2c->power_enable) { + input_err(true, &wac_i2c->client->dev, "%s: powered off now\n", __func__); + return; + } + + if (wac_i2c->wacom_fw_ws->active) { + input_err(true, &wac_i2c->client->dev, "%s: fw update is running\n", __func__); + return; + } + + ret = w9019_start_stop_cmd(wac_i2c, WACOM_STOP_CMD); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to set stop cmd, %d\n", __func__, ret); + return; + } + + if (wac_i2c->dp_connect_cmd) + data[0] = COM_SPECIAL_COMPENSATION; + else + data[0] = COM_NORMAL_COMPENSATION; + + ret = w9019_i2c_send(wac_i2c, &data[0], 1); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to send table swap cmd %d\n", __func__, ret); + return; + } + + ret = w9019_start_stop_cmd(wac_i2c, WACOM_STOP_AND_START_CMD); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to set stop-start cmd, %d\n", __func__, ret); + return; + } + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, wac_i2c->dp_connect_cmd ? "on" : "off"); +} + +static int wacom_i2c_usb_typec_notification_cb(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct wacom_i2c *wac_i2c = container_of(nb, struct wacom_i2c, typec_nb); + PD_NOTI_TYPEDEF usb_typec_info = *(PD_NOTI_TYPEDEF *)data; + + if (usb_typec_info.src != PDIC_NOTIFY_DEV_CCIC || + usb_typec_info.dest != PDIC_NOTIFY_DEV_DP || + usb_typec_info.id != PDIC_NOTIFY_ID_DP_CONNECT) + goto out; + + input_info(true, &wac_i2c->client->dev, "%s: %s (vid:0x%04X pid:0x%04X)\n", + __func__, usb_typec_info.sub1 ? "attached" : "detached", + usb_typec_info.sub2, usb_typec_info.sub3); + + switch (usb_typec_info.sub1) { + case PDIC_NOTIFY_ATTACH: + if (usb_typec_info.sub2 != 0x04E8 || usb_typec_info.sub3 != 0xA020) + goto out; + break; + case PDIC_NOTIFY_DETACH: + break; + default: + input_err(true, &wac_i2c->client->dev, "%s: invalid value %d\n", __func__, usb_typec_info.sub1); + goto out; + } + + cancel_work_sync(&wac_i2c->typec_work); + wac_i2c->dp_connect_cmd = usb_typec_info.sub1; + schedule_work(&wac_i2c->typec_work); +out: + return 0; +} +#endif + +static void wacom_i2c_nb_register_work(struct work_struct *work) +{ +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) || IS_ENABLED(CONFIG_MUIC_SUPPORT_KEYBOARDDOCK) + struct wacom_i2c *wac_i2c = container_of(work, struct wacom_i2c, + nb_reg_work.work); + u32 table_swap = wac_i2c->pdata->table_swap; + int ret; +#endif + u32 count = 0; + +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) + if (table_swap == TABLE_SWAP_DEX_STATION) + INIT_WORK(&wac_i2c->typec_work, wacom_i2c_usb_typec_work); +#endif +#if IS_ENABLED(CONFIG_MUIC_SUPPORT_KEYBOARDDOCK) + if (table_swap == TABLE_SWAP_KBD_COVER) + INIT_WORK(&wac_i2c->kbd_work, wac_i2c_kbd_work); +#endif + + do { +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) + if (table_swap == TABLE_SWAP_DEX_STATION) { + static bool manager_flag = false; + + if (!manager_flag) { + ret = manager_notifier_register(&wac_i2c->typec_nb, + wacom_i2c_usb_typec_notification_cb, + MANAGER_NOTIFY_PDIC_WACOM); + if (!ret) { + manager_flag = true; + input_info(true, &wac_i2c->client->dev, + "%s: typec notifier register success\n", + __func__); + break; + } + } + } +#endif +#if IS_ENABLED(CONFIG_MUIC_SUPPORT_KEYBOARDDOCK) + if (table_swap == TABLE_SWAP_KBD_COVER) { + static bool kbd_flag = false; + + if (!kbd_flag) { + ret = keyboard_notifier_register(&wac_i2c->kbd_nb, + wacom_i2c_keyboard_notification_cb, + KEYBOARD_NOTIFY_DEV_WACOM); + if (!ret) { + kbd_flag = true; + input_info(true, &wac_i2c->client->dev, + "%s: kbd notifier register success\n", + __func__); + break; + } + } + } +#endif + count++; + msleep(30); + } while (count < 100); +} + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) +static int wacom_notifier_call(struct notifier_block *n, unsigned long data, void *v) +{ + struct wacom_i2c *wac_i2c = container_of(n, struct wacom_i2c, nb); + + switch (data) { + case NOTIFIER_SECURE_TOUCH_ENABLE: + w9019_disable_mode(wac_i2c, WACOM_DISABLE); + break; + case NOTIFIER_SECURE_TOUCH_DISABLE: + w9019_disable_mode(wac_i2c, WACOM_ENABLE); + break; + default: + break; + } + + return 0; +} +#endif + +static int wacom_request_gpio(struct i2c_client *client, + struct wacom_g5_platform_data *pdata) +{ + int ret; + + ret = devm_gpio_request(&client->dev, pdata->irq_gpio, "wacom_irq"); + if (ret) { + input_err(true, &client->dev, "unable to request gpio for irq\n"); + return ret; + } + + ret = devm_gpio_request(&client->dev, pdata->fwe_gpio, "wacom_fwe"); + if (ret) { + input_err(true, &client->dev, "unable to request gpio for fwe\n"); + return ret; + } + + return 0; +} + +int w9019_check_ub(struct i2c_client *client) +{ + int lcdtype = 0; +#if IS_ENABLED(CONFIG_EXYNOS_DPU30) + int connected; +#endif + +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) + lcdtype = get_lcd_attached("GET"); + if (lcdtype == 0xFFFFFF) { + input_info(true, &client->dev, "lcd is not attached\n"); + return -ENODEV; + } +#endif + +#if IS_ENABLED(CONFIG_EXYNOS_DPU30) + connected = get_lcd_info("connected"); + if (connected < 0) { + input_info(true, &client->dev, "Failed to get connection info\n"); + return -ENODEV; + } + + if (!connected) { + input_info(true, &client->dev, "lcd is not attached\n"); + return -ENODEV; + } + + lcdtype = get_lcd_info("id"); + if (lcdtype < 0) { + input_info(true, &client->dev, "Failed to get id info\n"); + return -ENODEV; + } +#endif + input_info(true, &client->dev, "%s: lcdtype 0x%08x\n", __func__, lcdtype); + + return lcdtype; +} + +#if IS_ENABLED(CONFIG_OF) +static struct wacom_g5_platform_data *wacom_parse_dt(struct i2c_client *client) +{ + struct wacom_g5_platform_data *pdata; + struct device *dev = &client->dev; + struct device_node *np = dev->of_node; + u32 tmp[5] = { 0, }; + int ret; +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) + int count = 0; + int ii; + int lcdtype = 0; +#endif + + if (!np) + return ERR_PTR(-ENODEV); + + pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return ERR_PTR(-ENOMEM); + + pdata->irq_gpio = of_get_named_gpio(np, "wacom,irq-gpio", 0); + if (!gpio_is_valid(pdata->irq_gpio)) { + input_err(true, &client->dev, "failed to get irq-gpio\n"); + return ERR_PTR(-EINVAL); + } + + pdata->fwe_gpio = of_get_named_gpio(np, "wacom,fwe-gpio", 0); + if (!gpio_is_valid(pdata->fwe_gpio)) { + input_err(true, &client->dev, "failed to get fwe-gpio\n"); + return ERR_PTR(-EINVAL); + } + + /* get features */ + ret = of_property_read_u32(np, "wacom,boot_addr", tmp); + if (ret < 0) { + input_err(true, &client->dev, "failed to read boot address %d\n", ret); + return ERR_PTR(-EINVAL); + } + pdata->boot_addr = tmp[0]; + + ret = of_property_read_u32_array(np, "wacom,origin", pdata->origin, 2); + if (ret < 0) { + input_err(true, dev, "failed to read origin %d\n", ret); + return ERR_PTR(-EINVAL); + } + + pdata->use_dt_coord = of_property_read_bool(np, "wacom,use_dt_coord"); + + if (pdata->use_dt_coord) { + ret = of_property_read_u32_array(np, "wacom,max_coords", tmp, 2); + if (ret < 0) { + input_err(true, dev, "failed to read max coords %d\n", ret); + } else { + pdata->max_x = tmp[0]; + pdata->max_y = tmp[1]; + } + } + + ret = of_property_read_u32(np, "wacom,max_pressure", tmp); + if (ret != -EINVAL) { + if (ret) + input_err(true, dev, "failed to read max pressure %d\n", ret); + else + pdata->max_pressure = tmp[0]; + } + + ret = of_property_read_u32_array(np, "wacom,max_tilt", tmp, 2); + if (ret != -EINVAL) { + if (ret) { + input_err(true, dev, "failed to read max x tilt %d\n", ret); + } else { + pdata->max_x_tilt = tmp[0]; + pdata->max_y_tilt = tmp[1]; + } + } + + ret = of_property_read_u32(np, "wacom,max_height", tmp); + if (ret != -EINVAL) { + if (ret) + input_err(true, dev, "failed to read max height %d\n", ret); + else + pdata->max_height = tmp[0]; + } + + ret = of_property_read_u32_array(np, "wacom,invert", tmp, 3); + if (ret) { + input_err(true, &client->dev, + "failed to read inverts %d\n", ret); + return ERR_PTR(-EINVAL); + } + pdata->x_invert = tmp[0]; + pdata->y_invert = tmp[1]; + pdata->xy_switch = tmp[2]; + +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) + lcdtype = get_lcd_attached("GET"); + if (lcdtype == 0xFFFFFF) { + input_err(true, &client->dev, "%s: lcd is not attached\n", __func__); +#if !WACOM_SEC_FACTORY + return ERR_PTR(-ENODEV); +#endif + } + + input_info(true, &client->dev, "%s: lcdtype 0x%08X\n", __func__, lcdtype); + + count = of_property_count_strings(np, "wacom,fw_path"); + if (count <= 0) { + pdata->fw_path = NULL; + } else { + u8 lcd_id_num = of_property_count_u32_elems(np, "wacom,select_lcdid"); + + if ((lcd_id_num != count) || (lcd_id_num <= 0)) { + of_property_read_string_index(np, "wacom,fw_path", 0, &pdata->fw_path); + if (pdata->bringup == 4) + pdata->bringup = 3; + } else { + u32 lcd_id[10]; + + of_property_read_u32_array(np, "wacom,select_lcdid", lcd_id, lcd_id_num); + + for (ii = 0; ii < lcd_id_num; ii++) { + if (lcd_id[ii] == lcdtype) { + of_property_read_string_index(np, "wacom,fw_path", ii, &pdata->fw_path); + break; + } + } + if (!pdata->fw_path) + pdata->bringup = 1; + else if (strlen(pdata->fw_path) == 0) + pdata->bringup = 1; + } + } +#else + ret = of_property_read_string(np, "wacom,fw_path", &pdata->fw_path); + if (ret) { + input_err(true, &client->dev, "failed to read fw_path %d\n", ret); + } +#endif + + ret = of_property_read_u32(np, "wacom,module_ver", &pdata->module_ver); + if (ret) { + input_err(true, &client->dev, "failed to read module_ver %d\n", ret); + /* default setting to open test */ + pdata->module_ver = 1; + } + + ret = of_property_read_u32(np, "wacom,support_garage_open_test", &pdata->support_garage_open_test); + if (ret) { + input_err(true, &client->dev, "failed to read support_garage_open_test %d\n", ret); + pdata->support_garage_open_test = 0; + } + + ret = of_property_read_u32(np, "wacom,table_swap", &pdata->table_swap); + if (ret) { + input_err(true, &client->dev, "failed to read table_swap %d\n", ret); + pdata->table_swap = 0; + } + + pdata->avdd = regulator_get(dev, "wacom_avdd"); + if (IS_ERR_OR_NULL(pdata->avdd)) { + input_err(true, &client->dev, "%s: Failed to get wacom avdd regulator.\n", + __func__); + return ERR_PTR(-ENODEV); + } + + pdata->regulator_boot_on = of_property_read_bool(np, "wacom,regulator_boot_on"); + + ret = of_property_read_u32(np, "wacom,bringup", &pdata->bringup); + if (ret) { + input_err(true, &client->dev, "failed to read bringup %d\n", ret); + /* default setting to open test */ + pdata->bringup = 0; + } + + pdata->support_cover_noti = of_property_read_bool(np, "wacom,support_cover_noti"); + pdata->support_cover_detection = of_property_read_bool(np, "wacom,support_cover_detection"); + + input_info(true, &client->dev, + "boot_addr: 0x%X, origin: (%d,%d), max_coords: (%d,%d), " + "max_pressure: %d, max_height: %d, max_tilt: (%d,%d) " + "invert: (%d,%d,%d), fw_path: %s, " + "module_ver:%d, table_swap:%d%s%s, cover_noti:%d," + "cover_detect:%d\n", + pdata->boot_addr, pdata->origin[0], pdata->origin[1], + pdata->max_x, pdata->max_y, pdata->max_pressure, + pdata->max_height, pdata->max_x_tilt, pdata->max_y_tilt, + pdata->x_invert, pdata->y_invert, pdata->xy_switch, + pdata->fw_path, pdata->module_ver, pdata->table_swap, + pdata->support_garage_open_test ? ", support garage open test" : "", + pdata->regulator_boot_on ? ", boot on" : "", + pdata->support_cover_noti, pdata->support_cover_detection); + + return pdata; +} +#else +static struct wacom_g5_platform_data *wacom_parse_dt(struct i2c_client *client) +{ + input_err(true, &client->dev, "no platform data specified\n"); + return ERR_PTR(-EINVAL); +} +#endif + +static int w9019_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct wacom_g5_platform_data *pdata = dev_get_platdata(&client->dev); + struct wacom_i2c *wac_i2c; + struct input_dev *input; + int ret = 0; + + client->addr = 0x56; + + pr_info("%s: %s: start!\n", SECLOG, __func__); + + ret = i2c_check_functionality(client->adapter, I2C_FUNC_I2C); + if (!ret) { + input_err(true, &client->dev, "I2C functionality not supported\n"); + return -EIO; + } + + wac_i2c = devm_kzalloc(&client->dev, sizeof(*wac_i2c), GFP_KERNEL); + if (!wac_i2c) + return -ENOMEM; + + if (!pdata) { + pdata = wacom_parse_dt(client); + if (IS_ERR(pdata)) { + input_err(true, &client->dev, "failed to parse dt\n"); + return PTR_ERR(pdata); + } + } + + ret = wacom_request_gpio(client, pdata); + if (ret) { + input_err(true, &client->dev, "failed to request gpio\n"); + return ret; + } + + /* using managed input device */ + input = devm_input_allocate_device(&client->dev); + if (!input) { + input_err(true, &client->dev, "failed to allocate input device\n"); + return -ENOMEM; + } + + /* using 2 slave address. one is normal mode, another is boot mode for + * fw update. + */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)) + wac_i2c->client_boot = i2c_new_dummy_device(client->adapter, pdata->boot_addr); +#else + wac_i2c->client_boot = i2c_new_dummy(client->adapter, pdata->boot_addr); +#endif + + if (IS_ERR_OR_NULL(wac_i2c->client_boot)) { + input_err(true, &client->dev, "failed to register sub client[0x%x]\n", pdata->boot_addr); + return -ENOMEM; + } + + wac_i2c->client = client; + wac_i2c->pdata = pdata; + wac_i2c->input_dev = input; + wac_i2c->irq = gpio_to_irq(pdata->irq_gpio); + wac_i2c->fw_img = NULL; + wac_i2c->fw_update_way = FW_NONE; +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + wac_i2c->tsp_scan_mode = DISABLE_TSP_SCAN_BLCOK; +#endif + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + wac_i2c->function_result = EPEN_EVENT_PEN_OUT; + /* Consider about factory, it may be need to as default 1 */ +#if WACOM_SEC_FACTORY + wac_i2c->battery_saving_mode = true; +#else + wac_i2c->battery_saving_mode = false; +#endif + wac_i2c->reset_flag = false; + wac_i2c->pm_suspend = false; + wac_i2c->samplerate_state = true; + wac_i2c->update_status = FW_UPDATE_PASS; + + /*Set client data */ + i2c_set_clientdata(client, wac_i2c); + i2c_set_clientdata(wac_i2c->client_boot, wac_i2c); + + init_completion(&wac_i2c->i2c_done); + complete_all(&wac_i2c->i2c_done); + init_completion(&wac_i2c->resume_done); + complete_all(&wac_i2c->resume_done); + + /* Power on */ + if (gpio_get_value(pdata->fwe_gpio) == 1) { + input_info(true, &client->dev, "%s: fwe gpio is high, change low and reset device\n", __func__); + w9019_compulsory_flash_mode(wac_i2c, false); + w9019_reset_hw(wac_i2c); + msleep(200); + } else { + w9019_compulsory_flash_mode(wac_i2c, false); + w9019_power(wac_i2c, true); + if (!wac_i2c->pdata->regulator_boot_on) + msleep(200); + } + + wac_i2c->screen_on = true; + + input->name = "sec_e-pen"; + + w9019_i2c_query(wac_i2c); + + /*Initializing for semaphor */ + mutex_init(&wac_i2c->i2c_mutex); + mutex_init(&wac_i2c->lock); + mutex_init(&wac_i2c->update_lock); + mutex_init(&wac_i2c->irq_lock); + mutex_init(&wac_i2c->mode_lock); + mutex_init(&wac_i2c->ble_lock); + mutex_init(&wac_i2c->ble_charge_mode_lock); + + wac_i2c->wacom_fw_ws = wakeup_source_register(&wac_i2c->client->dev, "wacom"); + wac_i2c->wacom_ws = wakeup_source_register(&wac_i2c->client->dev, "wacom_wakelock"); + + INIT_DELAYED_WORK(&wac_i2c->work_print_info, wacom_print_info_work); + + ret = w9019_fw_update_on_probe(wac_i2c); + if (ret) + goto err_register_input_dev; + + wacom_i2c_set_input_values(wac_i2c, input); + + ret = input_register_device(input); + if (ret) { + input_err(true, &client->dev, "failed to register input device\n"); + /* managed input devices need not be explicitly unregistred or freed. */ + goto err_register_input_dev; + + } + + /*Request IRQ */ + ret = devm_request_threaded_irq(&client->dev, wac_i2c->irq, NULL, wacom_interrupt, + IRQF_ONESHOT | IRQF_TRIGGER_LOW, "sec_epen_irq", wac_i2c); + if (ret < 0) { + input_err(true, &client->dev, "failed to request irq(%d) - %d\n", wac_i2c->irq, ret); + goto err_request_irq; + } + input_info(true, &client->dev, "init irq %d\n", wac_i2c->irq); + + ret = w9019_sec_init(wac_i2c); + if (ret) + goto err_sec_init; + + device_init_wakeup(&client->dev, true); + + if (wac_i2c->pdata->table_swap) { + INIT_DELAYED_WORK(&wac_i2c->nb_reg_work, wacom_i2c_nb_register_work); + schedule_delayed_work(&wac_i2c->nb_reg_work, msecs_to_jiffies(500)); + } + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + sec_input_register_notify(&wac_i2c->nb, wacom_notifier_call, 2); +#endif + + input_info(true, &client->dev, "probe done\n"); + input_log_fix(); + + wac_i2c->ble_hist = kzalloc(WACOM_BLE_HISTORY_SIZE, GFP_KERNEL); + if (!wac_i2c->ble_hist) + input_err(true, &client->dev, "failed to history mem\n"); + + wac_i2c->ble_hist1 = kzalloc(WACOM_BLE_HISTORY1_SIZE, GFP_KERNEL); + if (!wac_i2c->ble_hist1) + input_err(true, &client->dev, "failed to history1 mem\n"); + + probe_open_test(wac_i2c); + + g_wac_i2c_w9019 = wac_i2c; + wac_i2c->probe_done = true; + pdata->enabled = true; + + return 0; + +err_sec_init: + cancel_delayed_work_sync(&wac_i2c->open_test_dwork); +err_request_irq: +err_register_input_dev: + wakeup_source_unregister(wac_i2c->wacom_fw_ws); + wakeup_source_unregister(wac_i2c->wacom_ws); + + mutex_destroy(&wac_i2c->i2c_mutex); + mutex_destroy(&wac_i2c->irq_lock); + mutex_destroy(&wac_i2c->update_lock); + mutex_destroy(&wac_i2c->lock); + mutex_destroy(&wac_i2c->mode_lock); + mutex_destroy(&wac_i2c->ble_lock); + mutex_destroy(&wac_i2c->ble_charge_mode_lock); + + w9019_power(wac_i2c, false); + i2c_unregister_device(wac_i2c->client_boot); + regulator_put(pdata->avdd); + + if (wac_i2c->input_dev) + input_free_device(wac_i2c->input_dev); + + input_err(true, &client->dev, "failed to probe\n"); + input_log_fix(); + + return ret; +} + +#if IS_ENABLED(CONFIG_PM) +static int w9019_i2c_suspend(struct device *dev) +{ + struct wacom_i2c *wac_i2c = dev_get_drvdata(dev); + int ret; + + if (wac_i2c->i2c_done.done == 0) { + /* completion.done == 0 :: initialized + * completion.done > 0 :: completeted + */ + ret = wait_for_completion_interruptible_timeout(&wac_i2c->i2c_done, msecs_to_jiffies(500)); + if (ret <= 0) + input_err(true, &wac_i2c->client->dev, "%s: completion expired, %d\n", __func__, ret); + } + + wac_i2c->pm_suspend = true; + reinit_completion(&wac_i2c->resume_done); + +#ifndef USE_OPEN_CLOSE + if (wac_i2c->input_dev->users) + w9019_sleep_sequence(wac_i2c); +#endif + + return 0; +} + +static int w9019_i2c_resume(struct device *dev) +{ + struct wacom_i2c *wac_i2c = dev_get_drvdata(dev); + + wac_i2c->pm_suspend = false; + complete_all(&wac_i2c->resume_done); +#ifndef USE_OPEN_CLOSE + if (wac_i2c->input_dev->users) + w9019_wakeup_sequence(wac_i2c); +#endif + + return 0; +} + +static SIMPLE_DEV_PM_OPS(w9019_pm_ops, w9019_i2c_suspend, w9019_i2c_resume); +#endif + +static void w9019_i2c_shutdown(struct i2c_client *client) +{ + struct wacom_i2c *wac_i2c = i2c_get_clientdata(client); + + if (!wac_i2c) + return; + + g_wac_i2c_w9019 = NULL; + wac_i2c->probe_done = false; + + input_info(true, &wac_i2c->client->dev, "%s called!\n", __func__); + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + sec_input_unregister_notify(&wac_i2c->nb); +#endif + + if (wac_i2c->pdata->table_swap) { +#if IS_ENABLED(CONFIG_MUIC_SUPPORT_KEYBOARDDOCK) + if (wac_i2c->pdata->table_swap == TABLE_SWAP_KBD_COVER) + keyboard_notifier_unregister(&wac_i2c->kbd_nb); +#endif + +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) + if (wac_i2c->pdata->table_swap == TABLE_SWAP_DEX_STATION) + manager_notifier_unregister(&wac_i2c->typec_nb); +#endif + } + + cancel_delayed_work_sync(&wac_i2c->open_test_dwork); + cancel_delayed_work_sync(&wac_i2c->work_print_info); + + w9019_enable_irq(wac_i2c, false); + + w9019_power(wac_i2c, false); + + input_info(true, &wac_i2c->client->dev, "%s Done\n", __func__); +} + +static int w9019_i2c_remove(struct i2c_client *client) +{ + struct wacom_i2c *wac_i2c = i2c_get_clientdata(client); + + g_wac_i2c_w9019 = NULL; + wac_i2c->probe_done = false; + + input_info(true, &wac_i2c->client->dev, "%s called!\n", __func__); + + if (wac_i2c->pdata->table_swap) { +#if IS_ENABLED(CONFIG_MUIC_SUPPORT_KEYBOARDDOCK) + if (wac_i2c->pdata->table_swap == TABLE_SWAP_KBD_COVER) + keyboard_notifier_unregister(&wac_i2c->kbd_nb); +#endif + +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) + if (wac_i2c->pdata->table_swap == TABLE_SWAP_DEX_STATION) + manager_notifier_unregister(&wac_i2c->typec_nb); +#endif + } + + cancel_delayed_work_sync(&wac_i2c->open_test_dwork); + cancel_delayed_work_sync(&wac_i2c->work_print_info); + + device_init_wakeup(&client->dev, false); + + w9019_enable_irq(wac_i2c, false); + + w9019_power(wac_i2c, false); + + wakeup_source_unregister(wac_i2c->wacom_fw_ws); + wakeup_source_unregister(wac_i2c->wacom_ws); + + mutex_destroy(&wac_i2c->i2c_mutex); + mutex_destroy(&wac_i2c->irq_lock); + mutex_destroy(&wac_i2c->update_lock); + mutex_destroy(&wac_i2c->lock); + mutex_destroy(&wac_i2c->mode_lock); + mutex_destroy(&wac_i2c->ble_lock); + mutex_destroy(&wac_i2c->ble_charge_mode_lock); + + w9019_sec_remove(wac_i2c); + + i2c_unregister_device(wac_i2c->client_boot); + regulator_put(wac_i2c->pdata->avdd); + + input_info(true, &wac_i2c->client->dev, "%s Done\n", __func__); + + return 0; +} + +static const struct i2c_device_id w9019_i2c_id[] = { + {"wacom_w9019", 0}, + {}, +}; + +MODULE_DEVICE_TABLE(i2c, wacom_i2c_id); + +#if IS_ENABLED(CONFIG_OF) +static const struct of_device_id w9019_dt_ids[] = { + {.compatible = "wacom,w9019"}, + {} +}; +#endif + +static struct i2c_driver w9019_i2c_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "wacom_w9019", +#if IS_ENABLED(CONFIG_PM) + .pm = &w9019_pm_ops, +#endif +#if IS_ENABLED(CONFIG_OF) + .of_match_table = of_match_ptr(w9019_dt_ids), +#endif + }, + .probe = w9019_i2c_probe, + .remove = w9019_i2c_remove, + .shutdown = w9019_i2c_shutdown, + .id_table = w9019_i2c_id, +}; + +static int __init w9019_i2c_init(void) +{ + int ret = 0; + + pr_info("%s: %s start\n", SECLOG, __func__); + + ret = i2c_add_driver(&w9019_i2c_driver); + if (ret) + pr_err("%s: %s: failed to add i2c driver\n", SECLOG, __func__); + + pr_info("%s: %s end\n", SECLOG, __func__); + return ret; +} + +static void __exit w9019_i2c_exit(void) +{ + i2c_del_driver(&w9019_i2c_driver); +} + +module_init(w9019_i2c_init); +module_exit(w9019_i2c_exit); + +MODULE_AUTHOR("Samsung"); +MODULE_DESCRIPTION("Driver for Wacom Digitizer Controller"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/w9019/wacom_i2c.h b/drivers/input/w9019/wacom_i2c.h new file mode 100755 index 000000000000..1dbdaa6e8c1e --- /dev/null +++ b/drivers/input/w9019/wacom_i2c.h @@ -0,0 +1,41 @@ +#ifndef _LINUX_WACOM_I2C_H_ +#define _LINUX_WACOM_I2C_H_ + +#ifdef CONFIG_BATTERY_SAMSUNG +extern unsigned int lpcharge; +#endif + +#define WACOM_WACOM_CMD_RESULT_WORD_LEN 20 +struct wacom_g5_platform_data { + int irq_gpio; + int fwe_gpio; + int boot_addr; + int irq_type; + int x_invert; + int y_invert; + int xy_switch; + bool use_dt_coord; + u32 origin[2]; + int max_x; + int max_y; + int max_pressure; + int max_x_tilt; + int max_y_tilt; + int max_height; + const char *fw_path; +#ifdef CONFIG_SEC_FACTORY + const char *fw_fac_path; +#endif + u32 ic_type; + u32 module_ver; + bool use_garage; + u32 table_swap; + bool use_vddio; + u32 bringup; + + u32 area_indicator; + u32 area_navigation; + u32 area_edge; +}; + +#endif /* _LINUX_WACOM_I2C_H */ diff --git a/drivers/input/w9019/wacom_i2c_elec.c b/drivers/input/w9019/wacom_i2c_elec.c new file mode 100755 index 000000000000..0697320dd498 --- /dev/null +++ b/drivers/input/w9019/wacom_i2c_elec.c @@ -0,0 +1,776 @@ +/* + * wacom_i2c_elec.c - Wacom G5 Digitizer Controller (I2C bus) + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "wacom_dev.h" + +long long median(long long* arr, int length) +{ + long long* internal; + long long ret = -1; + int i, j; + long long temp; + + internal = kzalloc(sizeof(long long)*length, GFP_KERNEL); + memcpy(internal, arr, length * sizeof(long long)); + + for (i = 0; i < length; i++) { + for (j = 0; j < length - (i + 1); j++) { + if (internal[j] > internal[j + 1]) { + temp = internal[j + 1]; + internal[j + 1] = internal[j]; + internal[j] = temp; + } + } + } + + if (length % 2 == 0) + ret = (internal[length / 2 - 1] + internal[length / 2]) / 2; + else + ret = internal[length / 2]; + + kfree(internal); + + return ret; +} + +long long buildS(long long* x, long long* m, int start, int end, int ind) +{ + int i; + long long ret; + long long *temp; + + temp = kzalloc(sizeof(long long)*(end - start + 1), GFP_KERNEL); + memcpy(temp, &x[start], sizeof(long long)*(end - start + 1)); + for (i = 0; i < end - start + 1; i++) { + temp[i] -= m[ind]; + temp[i] = (temp[i] > 0) ? temp[i] : -temp[i]; + } + + ret = median(temp, end - start + 1); + + kfree(temp); + + return ret; +} + +void hampel(long long* x, int length, int k, int nsig) +{ + const long long kappa = 14826; + int i; + + long long *m; + long long *s; + long long *temp; + + m = kzalloc(sizeof(long long)*length, GFP_KERNEL); + s = kzalloc(sizeof(long long)*length, GFP_KERNEL); + temp = kzalloc(sizeof(long long)*length, GFP_KERNEL); + + for (i = 0; i < length; i++) { + if (i < k) { + if (i + k + 1 > length) + continue; + + memcpy(temp, x, sizeof(long long)*(i + k + 1)); + m[i] = median(temp, i + k + 1); + } else if (i >= length - k) { + memcpy(temp, &x[i - k], sizeof(long long)*(length - i + k)); + m[i] = median(temp, length - i + k); + } else { + memcpy(temp, &x[i - k], sizeof(long long)*(2 * k + 1)); + m[i] = median(temp, 2 * k + 1); + } + } + + for (i = 0; i < length; i++) { + if (i < k) + s[i] = buildS(x, m, 0, i + k, i); + else if (i >= length - k) + s[i] = buildS(x, m, i - k, length - 1, i); + else + s[i] = buildS(x, m, i - k, i + k, i); + + s[i] = (s[i] * kappa) / 10000; + } + + for (i = 0; i < length; i++) { + if (x[i] - m[i] > nsig*s[i] || x[i] - m[i] < -(nsig*s[i])) + x[i] = m[i]; + } + + kfree(m); + kfree(s); + kfree(temp); +} + +long long mean(long long* arr, int length) +{ + long long ret = arr[0]; + int n; + + for (n = 1; n < length; n++) + ret = (n*ret + arr[n]) / (n + 1); + + return ret; +} + +int calibration_trx_data(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + long long *cal_xx_raw, *cal_xy_raw, *cal_yx_raw, *cal_yy_raw, *cal_xy_edg_raw, *cal_yx_edg_raw; + int i; + + cal_xx_raw = cal_xy_raw = cal_yx_raw = cal_yy_raw = cal_xy_edg_raw = cal_yx_edg_raw = NULL; + edata->cal_xx = edata->cal_xy = edata->cal_yx = edata->cal_yy = edata->cal_xy_edg = edata->cal_yx_edg = 0; + + cal_xx_raw = kzalloc(edata->max_x_ch * sizeof(long long), GFP_KERNEL); + cal_xy_raw = kzalloc(edata->max_x_ch * sizeof(long long), GFP_KERNEL); + cal_yx_raw = kzalloc(edata->max_y_ch * sizeof(long long), GFP_KERNEL); + cal_yy_raw = kzalloc(edata->max_y_ch * sizeof(long long), GFP_KERNEL); + cal_xy_edg_raw = kzalloc(edata->max_x_ch * sizeof(long long), GFP_KERNEL); + cal_yx_edg_raw = kzalloc(edata->max_y_ch * sizeof(long long), GFP_KERNEL); + + if (!cal_xx_raw || !cal_xy_raw || !cal_yx_raw || !cal_yy_raw || !cal_xy_edg_raw || !cal_yx_edg_raw) { + if (cal_xx_raw) + kfree(cal_xx_raw); + if (cal_xy_raw) + kfree(cal_xy_raw); + if (cal_yx_raw) + kfree(cal_yx_raw); + if (cal_yy_raw) + kfree(cal_yy_raw); + if (cal_xy_edg_raw) + kfree(cal_xy_edg_raw); + if (cal_yx_edg_raw) + kfree(cal_yx_edg_raw); + + return -ENOMEM; + } + + for (i = 0; i < edata->max_x_ch; i++) { + cal_xx_raw[i] = edata->xx_ref[i] * POWER_OFFSET / edata->xx[i]; + cal_xy_raw[i] = edata->xy_ref[i] * POWER_OFFSET / edata->xy[i]; + cal_xy_edg_raw[i] = edata->xy_edg_ref[i] * POWER_OFFSET / edata->xy_edg[i]; + } + + for (i = 0; i < edata->max_y_ch; i++) { + cal_yx_raw[i] = edata->yx_ref[i] * POWER_OFFSET / edata->yx[i]; + cal_yy_raw[i] = edata->yy_ref[i] * POWER_OFFSET / edata->yy[i]; + cal_yx_edg_raw[i] = edata->yx_edg_ref[i] * POWER_OFFSET / edata->yx_edg[i]; + } + + hampel(cal_xx_raw, edata->max_x_ch, 3, 3); + hampel(cal_xy_raw, edata->max_x_ch, 3, 3); + hampel(cal_yx_raw, edata->max_y_ch, 3, 3); + hampel(cal_yy_raw, edata->max_y_ch, 3, 3); + hampel(cal_xy_edg_raw, edata->max_x_ch, 3, 3); + hampel(cal_yx_edg_raw, edata->max_y_ch, 3, 3); + + edata->cal_xx = mean(cal_xx_raw, edata->max_x_ch); + edata->cal_xy = mean(cal_xy_raw, edata->max_x_ch); + edata->cal_yx = mean(cal_yx_raw, edata->max_y_ch); + edata->cal_yy = mean(cal_yy_raw, edata->max_y_ch); + edata->cal_xy_edg = mean(cal_xy_edg_raw, edata->max_x_ch); + edata->cal_yx_edg = mean(cal_yx_edg_raw, edata->max_y_ch); + + for (i = 0; i < edata->max_x_ch; i++) { + edata->xx_xx[i] = edata->cal_xx * edata->xx[i]; + edata->xy_xy[i] = edata->cal_xy * edata->xy[i]; + edata->xy_xy_edg[i] = edata->cal_xy_edg * edata->xy_edg[i]; + } + + for (i = 0; i < edata->max_y_ch; i++) { + edata->yx_yx[i] = edata->cal_yx * edata->yx[i]; + edata->yy_yy[i] = edata->cal_yy * edata->yy[i]; + edata->yx_yx_edg[i] = edata->cal_yx_edg * edata->yx_edg[i]; + } + + input_info(true, &wac_i2c->client->dev, "%s: cal_xx(%lld), cal_xy(%lld), cal_yx(%lld), cal_yy(%lld) , cal_xy_edg(%lld), cal_yx_edg(%lld)\n", + __func__, edata->cal_xx, edata->cal_xy, edata->cal_yx, edata->cal_yy, edata->cal_xy_edg, edata->cal_yx_edg); + + kfree(cal_xx_raw); + kfree(cal_xy_raw); + kfree(cal_yx_raw); + kfree(cal_yy_raw); + kfree(cal_xy_edg_raw); + kfree(cal_yx_edg_raw); + + return 0; +} + +void calculate_ratio(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + int i; + + for (i = 0; i < edata->max_x_ch; i++) + edata->rxx[i] = edata->xx_ref[i] * POWER_OFFSET / edata->xx[i]; + + for (i = 0; i < edata->max_x_ch; i++) { + edata->rxy[i] = edata->xy_ref[i] * POWER_OFFSET / edata->xy[i]; + edata->rxy_edg[i] = edata->xy_edg_ref[i] * POWER_OFFSET / edata->xy_edg[i]; + } + + for (i = 0; i < edata->max_y_ch; i++) { + edata->ryx[i] = edata->yx_ref[i] * POWER_OFFSET / edata->yx[i]; + edata->ryx_edg[i] = edata->yx_edg_ref[i] * POWER_OFFSET / edata->yx_edg[i]; + } + + for (i = 0; i < edata->max_y_ch; i++) + edata->ryy[i] = edata->yy_ref[i] * POWER_OFFSET / edata->yy[i]; + +} + +void make_decision(struct wacom_i2c* wac_i2c, u16* arrResult) +{ + struct wacom_elec_data* edata = wac_i2c->pdata->edata; + u32 open_count, short_count; + int i; + + open_count = short_count = 0; + for (i = 0; i < edata->max_x_ch; i++) { + edata->drxx[i] = edata->rxx[i] - edata->cal_xx; + edata->drxy[i] = edata->rxy[i] - edata->cal_xy; + edata->drxy_edg[i] = edata->rxy_edg[i] - edata->cal_xy_edg; + + if (edata->xy[i] < edata->xy_ref[i] / 2 || edata->xx[i] < edata->xx_ref[i] / 2) + arrResult[i + 1] |= SEC_OPEN; + + if (edata->xy_xy[i] > edata->xy_spec[i] || edata->xx_xx[i] > edata->xx_spec[i]) + arrResult[i + 1] |= SEC_SHORT; + + if (edata->xx_self[i] > edata->xx_self_spec[i]) + arrResult[i + 1] |= SEC_OPEN; + + if (edata->drxy[i] > edata->drxy_spec[i] || edata->drxy[i] < -edata->drxy_spec[i]) + arrResult[i + 1] |= SEC_SHORT; + + if (edata->drxx[i] > edata->drxx_spec[i] || edata->drxx[i] < -edata->drxx_spec[i]) + arrResult[i + 1] |= SEC_SHORT; + + if (edata->drxy_edg[i] > edata->drxy_edg_spec[i] || edata->drxy_edg[i] < -edata->drxy_edg_spec[i]) + arrResult[i + 1] |= SEC_SHORT; + + if (arrResult[i + 1] & SEC_OPEN) + open_count++; + + if (arrResult[i + 1] & SEC_SHORT) + short_count++; + } + + for (i = 0; i < edata->max_y_ch; i++) { + edata->dryy[i] = edata->ryy[i] - edata->cal_yy; + edata->dryx[i] = edata->ryx[i] - edata->cal_yx; + edata->dryx_edg[i] = edata->ryx_edg[i] - edata->cal_yx_edg; + + if (edata->yx[i] < edata->yx_ref[i] / 2 || edata->yy[i] < edata->yy_ref[i] / 2) + arrResult[i + 1 + edata->max_x_ch] |= SEC_OPEN; + + if (edata->yx_yx[i] > edata->yx_spec[i] || edata->yy_yy[i] > edata->yy_spec[i]) + arrResult[i + 1 + edata->max_x_ch] |= SEC_SHORT; + + if (edata->yy_self[i] > edata->yy_self_spec[i]) + arrResult[i + 1 + edata->max_x_ch] |= SEC_OPEN; + + if (edata->dryx[i] > edata->dryx_spec[i] || edata->dryx[i] < -edata->dryx_spec[i]) + arrResult[i + 1 + edata->max_x_ch] |= SEC_SHORT; + + if (edata->dryy[i] > edata->dryy_spec[i] || edata->dryy[i] < -edata->dryy_spec[i]) + arrResult[i + 1 + edata->max_x_ch] |= SEC_SHORT; + + if (edata->dryx_edg[i] > edata->dryx_edg_spec[i] || edata->dryx_edg[i] < -edata->dryx_edg_spec[i]) + arrResult[i + 1 + edata->max_x_ch] |= SEC_SHORT; + + if (arrResult[i + 1 + edata->max_x_ch] & SEC_OPEN) + open_count++; + + if (arrResult[i + 1 + edata->max_x_ch] & SEC_SHORT) + short_count++; + } + + arrResult[0] = (short_count << 8) + open_count; +} + +void print_elec_data(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + u8 *pstr = NULL; + u8 ptmp[WACOM_CMD_RESULT_WORD_LEN] = { 0 }; + int chsize, lsize; + int i, j; + + input_info(true, &wac_i2c->client->dev, "%s\n", __func__); + + chsize = edata->max_x_ch + edata->max_y_ch; + lsize = WACOM_CMD_RESULT_WORD_LEN * (chsize + 1); + + pstr = kzalloc(lsize, GFP_KERNEL); + if (pstr == NULL) + return; + + memset(pstr, 0x0, lsize); + snprintf(ptmp, sizeof(ptmp), " TX"); + strlcat(pstr, ptmp, lsize); + + for (i = 0; i < chsize; i++) { + snprintf(ptmp, sizeof(ptmp), " %02d ", i); + strlcat(pstr, ptmp, lsize); + } + + input_info(true, &wac_i2c->client->dev, "%s\n", pstr); + memset(pstr, 0x0, lsize); + snprintf(ptmp, sizeof(ptmp), " +"); + strlcat(pstr, ptmp, lsize); + + for (i = 0; i < chsize; i++) { + snprintf(ptmp, sizeof(ptmp), "----"); + strlcat(pstr, ptmp, lsize); + } + + input_info(true, &wac_i2c->client->dev, "%s\n", pstr); + + for (i = 0; i < chsize; i++) { + memset(pstr, 0x0, lsize); + snprintf(ptmp, sizeof(ptmp), "Rx%02d | ", i); + strlcat(pstr, ptmp, lsize); + + for (j = 0; j < chsize; j++) { + snprintf(ptmp, sizeof(ptmp), " %4d", + edata->elec_data[(i * chsize) + j]); + + strlcat(pstr, ptmp, lsize); + } + input_info(true, &wac_i2c->client->dev, "%s\n", pstr); + } + kfree(pstr); +} + +void print_trx_data(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + struct i2c_client *client = wac_i2c->client; + u8 tmp_buf[WACOM_CMD_RESULT_WORD_LEN] = { 0 }; + u8 *buff; + int buff_size; + int i; + + buff_size = edata->max_x_ch > edata->max_y_ch ? edata->max_x_ch : edata->max_y_ch; + buff_size = WACOM_CMD_RESULT_WORD_LEN * (buff_size + 1); + + buff = kzalloc(buff_size, GFP_KERNEL); + if (buff == NULL) + return; + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "xx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%d ", edata->xx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "xy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%d ", edata->xy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "yx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%d ", edata->yx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "yy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%d ", edata->yy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "xx_self: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%d ", edata->xx_self[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "yy_self: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%d ", edata->yy_self[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "xy_edg: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%d ", edata->xy_edg[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "yx_edg: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%d ", edata->yx_edg[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + kfree(buff); +} + +void print_cal_trx_data(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + struct i2c_client *client = wac_i2c->client; + u8 tmp_buf[WACOM_CMD_RESULT_WORD_LEN] = { 0 }; + u8 *buff; + int buff_size; + int i; + + buff_size = edata->max_x_ch > edata->max_y_ch ? edata->max_x_ch : edata->max_y_ch; + buff_size = WACOM_CMD_RESULT_WORD_LEN * (buff_size + 1); + + buff = kzalloc(buff_size, GFP_KERNEL); + if (buff == NULL) + return; + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "xx_xx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->xx_xx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "xy_xy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->xy_xy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "yx_yx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->yx_yx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "yy_yy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->yy_yy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "xy_xy_edg: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->xy_xy_edg[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "yx_yx_edg: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->yx_yx_edg[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + kfree(buff); +} + +void print_ratio_trx_data(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + struct i2c_client *client = wac_i2c->client; + u8 tmp_buf[WACOM_CMD_RESULT_WORD_LEN] = { 0 }; + u8 *buff; + int buff_size; + int i; + + buff_size = edata->max_x_ch > edata->max_y_ch ? edata->max_x_ch : edata->max_y_ch; + buff_size = WACOM_CMD_RESULT_WORD_LEN * (buff_size + 1); + + buff = kzalloc(buff_size, GFP_KERNEL); + if (buff == NULL) + return; + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "rxx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->rxx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "rxy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->rxy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "ryx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->ryx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "ryy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->ryy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "rxy_edg: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->rxy_edg[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "ryx_edg: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->ryx_edg[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + kfree(buff); +} + +void print_difference_ratio_trx_data(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + struct i2c_client *client = wac_i2c->client; + u8 tmp_buf[WACOM_CMD_RESULT_WORD_LEN] = { 0 }; + u8 *buff; + int buff_size; + int i; + + buff_size = edata->max_x_ch > edata->max_y_ch ? edata->max_x_ch : edata->max_y_ch; + buff_size = WACOM_CMD_RESULT_WORD_LEN * (buff_size + 1); + + buff = kzalloc(buff_size, GFP_KERNEL); + if (buff == NULL) + return; + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "drxx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->drxx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "drxy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->drxy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "dryx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->dryx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "dryy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->dryy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "drxy_edg: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->drxy_edg[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "dryx_edg: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", edata->dryx_edg[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + kfree(buff); +} diff --git a/drivers/input/w9019/wacom_i2c_sec.c b/drivers/input/w9019/wacom_i2c_sec.c new file mode 100755 index 000000000000..016ae9872e27 --- /dev/null +++ b/drivers/input/w9019/wacom_i2c_sec.c @@ -0,0 +1,3308 @@ +/* + * wacom_i2c_func.c - Wacom G5 Digitizer Controller (I2C bus) + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "wacom_dev.h" + +int calibration_trx_data(struct wacom_i2c *wac_i2c); +void calculate_ratio(struct wacom_i2c *wac_i2c); +void make_decision(struct wacom_i2c *wac_i2c, u16* arrResult); +#if 0 //elec test +void print_elec_data(struct wacom_i2c *wac_i2c); +#endif +void print_trx_data(struct wacom_i2c *wac_i2c); +void print_cal_trx_data(struct wacom_i2c *wac_i2c); +void print_ratio_trx_data(struct wacom_i2c *wac_i2c); +void print_difference_ratio_trx_data(struct wacom_i2c *wac_i2c); + +static inline int power(int num) +{ + int i, ret; + + for (i = 0, ret = 1; i < num; i++) + ret = ret * 10; + + return ret; +} + +#if WACOM_SEC_FACTORY +static ssize_t epen_fac_select_firmware_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + u8 fw_update_way = FW_NONE; + int ret = 0; + + input_info(true, &client->dev, "%s\n", __func__); + + switch (*buf) { + case 'k': + case 'K': + fw_update_way = FW_BUILT_IN; + break; + case 't': + case 'T': + fw_update_way = FW_FACTORY_GARAGE; + break; + case 'u': + case 'U': + fw_update_way = FW_FACTORY_UNIT; + break; + default: + input_err(true, &client->dev, "wrong parameter\n"); + return count; + } + + ret = w9019_i2c_load_fw(wac_i2c, fw_update_way); + if (ret < 0) { + input_info(true, &client->dev, "failed to load fw data\n"); + goto out; + } + + w9019_i2c_unload_fw(wac_i2c); +out: + return count; +} +#endif + +static ssize_t epen_firm_update_status_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int status = wac_i2c->update_status; + int ret = 0; + + input_info(true, &client->dev, "%s:(%d)\n", __func__, status); + + if (status == FW_UPDATE_PASS) + ret = snprintf(buf, PAGE_SIZE, "PASS\n"); + else if (status == FW_UPDATE_RUNNING) + ret = snprintf(buf, PAGE_SIZE, "DOWNLOADING\n"); + else if (status == FW_UPDATE_FAIL) + ret = snprintf(buf, PAGE_SIZE, "FAIL\n"); + else + ret = 0; + + return ret; +} + +static ssize_t epen_firm_version_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + +#ifdef CONFIG_SEC_FACTORY + wac_i2c->fw_ver_ic = 0; + w9019_i2c_query(wac_i2c); +#endif + + input_info(true, &client->dev, "%s: 0x%x|0x%X\n", __func__, + wac_i2c->fw_ver_ic, wac_i2c->fw_ver_bin); + + return snprintf(buf, PAGE_SIZE, "%04X\t%04X\n", + wac_i2c->fw_ver_ic, wac_i2c->fw_ver_bin); +} + +static ssize_t epen_firmware_update_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + u8 fw_update_way = FW_NONE; + + input_info(true, &client->dev, "%s\n", __func__); + + mutex_lock(&wac_i2c->lock); + + switch (*buf) { + case 'i': + case 'I': +#if WACOM_PRODUCT_SHIP + fw_update_way = FW_IN_SDCARD_SIGNED; +#else + fw_update_way = FW_IN_SDCARD; +#endif + break; + case 'k': + case 'K': + fw_update_way = FW_BUILT_IN; + break; +#if WACOM_SEC_FACTORY + case 't': + case 'T': + fw_update_way = FW_FACTORY_GARAGE; + break; + case 'u': + case 'U': + fw_update_way = FW_FACTORY_UNIT; + break; +#endif + default: + input_err(true, &client->dev, "wrong parameter\n"); + mutex_unlock(&wac_i2c->lock); + return count; + } + + w9019_fw_update_on_hidden_menu(wac_i2c, fw_update_way); + mutex_unlock(&wac_i2c->lock); + + return count; +} + +static ssize_t epen_firm_version_of_ic_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + + input_info(true, &wac_i2c->client->dev, "%s: %X\n", __func__, wac_i2c->fw_ver_ic); + + return snprintf(buf, PAGE_SIZE, "%04X", wac_i2c->fw_ver_ic); +} + +static ssize_t epen_firm_version_of_bin_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + + input_info(true, &wac_i2c->client->dev, "%s: %X\n", __func__, wac_i2c->fw_ver_bin); + + return snprintf(buf, PAGE_SIZE, "%04X", wac_i2c->fw_ver_bin); +} + + +static ssize_t epen_reset_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int val; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + + val = !(!val); + if (!val) + goto out; + + w9019_enable_irq(wac_i2c, false); + + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + + /* Reset IC */ + w9019_reset_hw(wac_i2c); + /* I2C Test */ + w9019_i2c_query(wac_i2c); + + w9019_enable_irq(wac_i2c, true); + + input_info(true, &client->dev, + "%s: result %d\n", __func__, wac_i2c->query_status); + return count; + +out: + input_err(true, &client->dev, "%s: invalid value %d\n", __func__, val); + + return count; +} + +static ssize_t epen_reset_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int ret = 0; + + if (wac_i2c->query_status) { + input_info(true, &client->dev, "%s: PASS\n", __func__); + ret = snprintf(buf, PAGE_SIZE, "PASS\n"); + } else { + input_err(true, &client->dev, "%s: FAIL\n", __func__); + ret = snprintf(buf, PAGE_SIZE, "FAIL\n"); + } + + return ret; +} + +static ssize_t epen_checksum_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int val; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + + val = !(!val); + if (!val) + goto out; + + w9019_enable_irq(wac_i2c, false); + + w9019_checksum(wac_i2c); + + w9019_enable_irq(wac_i2c, true); + + input_info(true, &client->dev, + "%s: result %d\n", __func__, wac_i2c->checksum_result); + + return count; + +out: + input_err(true, &client->dev, "%s: invalid value %d\n", __func__, val); + + return count; +} + +static ssize_t epen_checksum_result_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int ret; + + if (wac_i2c->checksum_result) { + input_info(true, &client->dev, "checksum, PASS\n"); + ret = snprintf(buf, PAGE_SIZE, "PASS\n"); + } else { + input_err(true, &client->dev, "checksum, FAIL\n"); + ret = snprintf(buf, PAGE_SIZE, "FAIL\n"); + } + + return ret; +} + +int w9019_open_test(struct wacom_i2c *wac_i2c, int test_mode) +{ + struct i2c_client *client = wac_i2c->client; + u8 cmd = 0; + u8 buf[COM_COORD_NUM + 1] = { 0, }; + int ret = 0, retry = 0, retval = 0; + int retry_int = 30; + + input_info(true, &client->dev, "%s : start (%d)\n", __func__, test_mode); + + /* change normal mode for open test */ + mutex_lock(&wac_i2c->mode_lock); + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_NONE); + // prevent I2C fail + msleep(300); + mutex_unlock(&wac_i2c->mode_lock); + + wac_i2c->connection_check = false; + wac_i2c->fail_channel = 0; + wac_i2c->min_adc_val = 0; + wac_i2c->error_cal = 0; + wac_i2c->min_cal_val = 0; + + ret = w9019_start_stop_cmd(wac_i2c, WACOM_STOP_CMD); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to set stop cmd, %d\n", + __func__, ret); + retval = EPEN_OPEN_TEST_EIO; + goto err1; + } + + msleep(50); + + w9019_enable_irq(wac_i2c, false); + + cmd = COM_OPEN_CHECK_START; + ret = w9019_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, "%s : failed to send data(%02x)\n", __func__, cmd); + retval = EPEN_OPEN_TEST_EIO; + goto err2; + } + + //msleep(50); + msleep(2000); + + retry = 10; + cmd = COM_OPEN_CHECK_STATUS; + do { + input_info(true, &client->dev, "%s : read status, retry %d\n", __func__, retry); + ret = w9019_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s : failed to send data(%02x)\n", __func__, cmd); + continue; + } + usleep_range(500, 500); + + retry_int = 30; + while (retry_int--) { + if (!gpio_get_value(wac_i2c->pdata->irq_gpio)) + break; + else + msleep(10); + } + input_info(true, &client->dev, "%s : retry_int[%d]\n", __func__, retry_int); + + ret = w9019_i2c_recv(wac_i2c, buf, COM_COORD_NUM); + if (ret != COM_COORD_NUM) { + input_err(true, &client->dev, "%s : failed to recv\n", __func__); + continue; + } + + /* + * status value + * 0 : data is not ready + * 1 : PASS + * 2 : Fail (coil function error) + * 3 : Fail (All coil function error) + */ + if (buf[0] == 1) { + input_info(true, &client->dev, "%s : Open check Pass\n", __func__); + break; + } + msleep(50); + } while (retry--); + + if (ret == COM_COORD_NUM) { + if (wac_i2c->pdata->module_ver == 0x2) + wac_i2c->connection_check = ((buf[0] == 1) && !buf[4]); + else + wac_i2c->connection_check = (buf[0] == 1); + } else { + wac_i2c->connection_check = false; + retval = EPEN_OPEN_TEST_EIO; + goto err2; + } + + wac_i2c->fail_channel = buf[1]; + wac_i2c->min_adc_val = buf[2] << 8 | buf[3]; + + if (wac_i2c->pdata->module_ver == 0x2) { + wac_i2c->error_cal = buf[4]; + wac_i2c->min_cal_val = buf[5] << 8 | buf[6]; + + input_info(true, &client->dev, + "%s: %s buf[0]:%d, buf[1]:%d, buf[2]:%d, buf[3]:%d, buf[4]:%d, buf[5]:%d, buf[6]:%d\n", + __func__, wac_i2c->connection_check ? "Pass" : "Fail", + buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); + } else { + input_info(true, &client->dev, + "%s: %s buf[0]:%d, buf[1]:%d, buf[2]:%d, buf[3]:%d\n", + __func__, wac_i2c->connection_check ? "Pass" : "Fail", + buf[0], buf[1], buf[2], buf[3]); + } + + if (!wac_i2c->connection_check) + retval = EPEN_OPEN_TEST_FAIL; + +err2: + w9019_enable_irq(wac_i2c, true); + +err1: + ret = w9019_start_stop_cmd(wac_i2c, WACOM_STOP_AND_START_CMD); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to set stop-start cmd, %d\n", + __func__, ret); + retval = EPEN_OPEN_TEST_EMODECHG; + goto out; + } + +out: + /* recovery wacom mode */ + if (wac_i2c->pdata->use_garage) + w9019_select_survey_mode(wac_i2c, wac_i2c->screen_on); + + return retval; +} + +static int get_connection_test(struct wacom_i2c *wac_i2c, int test_mode) +{ + struct i2c_client *client = wac_i2c->client; + + int retry = 2; + int ret; + + mutex_lock(&wac_i2c->lock); + + input_info(true, &client->dev, "%s : start(%d)\n", __func__, test_mode); + + wac_i2c->is_open_test = true; + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + if (wac_i2c->is_tsp_block) { + input_info(true, &wac_i2c->client->dev, "%s: full scan OUT\n", __func__); + wac_i2c->tsp_scan_mode = sec_input_notify(&wac_i2c->nb, NOTIFIER_TSP_BLOCKING_RELEASE, NULL); + wac_i2c->is_tsp_block = false; + } +#endif + + while (retry--) { + ret = w9019_open_test(wac_i2c, test_mode); + if (ret == EPEN_OPEN_TEST_PASS || ret == EPEN_OPEN_TEST_NOTSUPPORT) + break; + + input_err(true, &client->dev, "failed(%d). retry %d\n", ret, retry); + + w9019_power(wac_i2c, false); + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + /* recommended delay in spec */ + msleep(100); + w9019_power(wac_i2c, true); + + if (ret == EPEN_OPEN_TEST_EIO || ret == EPEN_OPEN_TEST_FAIL) { + msleep(150); + continue; + } else if (ret == EPEN_OPEN_TEST_EMODECHG) { + break; + } + } + + if (!wac_i2c->samplerate_state) { + input_info(true, &client->dev, "%s: samplerate state is %d, need to recovery\n", + __func__, wac_i2c->samplerate_state); + + ret = w9019_start_stop_cmd(wac_i2c, WACOM_START_CMD); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to set start cmd, %d\n", + __func__, ret); + } + } + + wac_i2c->is_open_test = false; + + mutex_unlock(&wac_i2c->lock); + + input_info(true, &client->dev, "connection_check : %s\n", + wac_i2c->connection_check ? "OK" : "NG"); + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + if (wac_i2c->is_tsp_block) { + wac_i2c->tsp_scan_mode = sec_input_notify(&wac_i2c->nb, NOTIFIER_TSP_BLOCKING_RELEASE, NULL); + wac_i2c->is_tsp_block = false; + input_err(true, &client->dev, "%s : release tsp scan block\n", __func__); + } +#endif + + return ret; +} + +static ssize_t epen_connection_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + +#if WACOM_SEC_FACTORY + struct i2c_client *client = wac_i2c->client; + int ret; + + ret = w9019_check_ub(wac_i2c->client); + if (ret < 0) { + input_info(true, &client->dev, "%s: digitizer is not attached\n", __func__); + goto out; + } +#endif + + get_connection_test(wac_i2c, WACOM_DIGITIZER_TEST); + +#if WACOM_SEC_FACTORY +out: +#endif + if (wac_i2c->pdata->module_ver == 0x2) { + return snprintf(buf, PAGE_SIZE, "%s %d %d %d %s %d\n", + wac_i2c->connection_check ? "OK" : "NG", + wac_i2c->pdata->module_ver, wac_i2c->fail_channel, + wac_i2c->min_adc_val, wac_i2c->error_cal ? "NG" : "OK", + wac_i2c->min_cal_val); + } else { + return snprintf(buf, PAGE_SIZE, "%s %d %d %d\n", + wac_i2c->connection_check ? "OK" : "NG", + wac_i2c->pdata->module_ver, wac_i2c->fail_channel, + wac_i2c->min_adc_val); + } +} + +static ssize_t epen_saving_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + static u64 call_count; + int val; + + call_count++; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + + wac_i2c->battery_saving_mode = !(!val); + + input_info(true, &client->dev, "%s: ps %s & pen %s [%llu]\n", + __func__, wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_result & EPEN_EVENT_PEN_OUT) ? "out" : "in", + call_count); + + if (!wac_i2c->power_enable && wac_i2c->battery_saving_mode) { + input_err(true, &wac_i2c->client->dev, + "%s: already power off, save & return\n", __func__); + return count; + } + + if (!(wac_i2c->function_result & EPEN_EVENT_PEN_OUT)) { + w9019_select_survey_mode(wac_i2c, wac_i2c->screen_on); + + if (wac_i2c->battery_saving_mode) + w9019_forced_release_fullscan(wac_i2c); + } + + return count; +} + +static ssize_t epen_screen_off_memo_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int val = 0; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, + "%s : Not support screen off memo mode(%d) in Factory Bin\n", + __func__, val); + + return count; +#endif + + val = !(!val); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO; + else + wac_i2c->function_set &= (~EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO); + + input_info(true, &client->dev, + "%s: ps %s aop(%d) set(0x%x) ret(0x%x)\n", __func__, + wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_set & EPEN_SETMODE_AOP) ? 1 : 0, + wac_i2c->function_set, wac_i2c->function_result); + + if (!wac_i2c->probe_done) { + input_err(true, &wac_i2c->client->dev, "%s: probe is not done\n", __func__); + return count; + } + + if (!wac_i2c->screen_on) + w9019_select_survey_mode(wac_i2c, false); + + return count; +} + +static ssize_t epen_aod_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int val = 0; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, + "%s : Not support aod mode(%d) in Factory Bin\n", + __func__, val); + + return count; +#endif + + val = !(!val); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_AOD_LCD_OFF; + else + wac_i2c->function_set &= ~EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON; + + input_info(true, &client->dev, + "%s: ps %s aop(%d) set(0x%x) ret(0x%x)\n", __func__, + wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_set & EPEN_SETMODE_AOP) ? 1 : 0, + wac_i2c->function_set, wac_i2c->function_result); + + if (!wac_i2c->screen_on) + w9019_select_survey_mode(wac_i2c, false); + + return count; +} + +static ssize_t epen_aod_lcd_onoff_status_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int val = 0; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, + "%s : Not support aod mode(%d) in Factory Bin\n", + __func__, val); + + return count; +#endif + + val = !(!val); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_AOD_LCD_STATUS; + else + wac_i2c->function_set &= ~EPEN_SETMODE_AOP_OPTION_AOD_LCD_STATUS; + + if (!(wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_AOD) || wac_i2c->screen_on) + goto out; + + if (wac_i2c->survey_mode == EPEN_SURVEY_MODE_GARAGE_AOP) { + if ((wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON) + == EPEN_SETMODE_AOP_OPTION_AOD_LCD_OFF) { + w9019_forced_release_fullscan(wac_i2c); + } + + mutex_lock(&wac_i2c->mode_lock); + w9019_i2c_set_survey_mode(wac_i2c, wac_i2c->survey_mode); + mutex_unlock(&wac_i2c->mode_lock); + } + +out: + input_info(true, &client->dev, "%s: screen %s, survey mode:0x%x, set:0x%x\n", + __func__, wac_i2c->screen_on ? "on" : "off", + wac_i2c->survey_mode, wac_i2c->function_set); + + return count; +} + +static ssize_t epen_aot_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int val = 0; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, + "%s : Not support aot mode(%d) in Factory Bin\n", + __func__, val); + + return count; +#endif + + val = !(!val); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_AOT; + else + wac_i2c->function_set &= (~EPEN_SETMODE_AOP_OPTION_AOT); + + input_info(true, &client->dev, + "%s: ps %s aop(%d) set(0x%x) ret(0x%x)\n", __func__, + wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_set & EPEN_SETMODE_AOP) ? 1 : 0, + wac_i2c->function_set, wac_i2c->function_result); + + if (!wac_i2c->screen_on) + w9019_select_survey_mode(wac_i2c, false); + + return count; +} + +static ssize_t epen_wcharging_mode_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + + input_info(true, &client->dev, "%s: %s\n", __func__, + !wac_i2c->wcharging_mode ? "NORMAL" : "LOWSENSE"); + + return snprintf(buf, PAGE_SIZE, "%s\n", + !wac_i2c->wcharging_mode ? "NORMAL" : "LOWSENSE"); +} + +static ssize_t epen_wcharging_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int retval = 0; + + if (kstrtoint(buf, 0, &retval)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + + wac_i2c->wcharging_mode = retval; + + input_info(true, &client->dev, "%s: %d\n", __func__, + wac_i2c->wcharging_mode); + + if (!wac_i2c->power_enable) { + input_err(true, &wac_i2c->client->dev, + "%s: power off, save & return\n", __func__); + return count; + } + + if (!wac_i2c->probe_done) { + input_err(true, &wac_i2c->client->dev, "%s: probe is not done\n", __func__); + return count; + } + + retval = w9019_i2c_set_sense_mode(wac_i2c); + if (retval < 0) { + input_err(true, &client->dev, + "%s: do not set sensitivity mode, %d\n", __func__, + retval); + } + + return count; + +} + +static ssize_t epen_disable_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int val = 0; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + + if (val) + w9019_disable_mode(wac_i2c, WACOM_DISABLE); + else + w9019_disable_mode(wac_i2c, WACOM_ENABLE); + + input_info(true, &client->dev, "%s: %d\n", __func__, val); + + return count; +} + +static ssize_t hardware_param_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[516]; + char tbuff[128]; + + memset(buff, 0x00, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"RESET\":\"%d\",", wac_i2c->abnormal_reset_count); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"I2C_FAIL\":\"%d\",", wac_i2c->i2c_fail_count); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"PEN_OUT\":\"%d\",", wac_i2c->pen_out_count); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"SDCONN\":\"%d\",", wac_i2c->connection_check); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"SECCNT\":\"%d\",", wac_i2c->fail_channel); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"SADCVAL\":\"%d\",", wac_i2c->min_adc_val); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"SECLVL\":\"%d\",", wac_i2c->error_cal); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + /* remove last comma (csv) */ + snprintf(tbuff, sizeof(tbuff), "\"SCALLVL\":\"%d\"", wac_i2c->min_cal_val); + strlcat(buff, tbuff, sizeof(buff)); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + + return snprintf(buf, PAGE_SIZE, "%s", buff); +} + +static ssize_t hardware_param_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + + wac_i2c->abnormal_reset_count = 0; + wac_i2c->i2c_fail_count = 0; + wac_i2c->pen_out_count = 0; + + input_info(true, &wac_i2c->client->dev, "%s: clear\n", __func__); + + return count; +} + +static ssize_t epen_connection_check_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + + input_info(true, &client->dev, "%s: SDCONN:%d,SECCNT:%d,SADCVAL:%d,SECLVL:%d,SCALLVL:%d\n", + __func__, wac_i2c->connection_check, + wac_i2c->fail_channel, wac_i2c->min_adc_val, + wac_i2c->error_cal, wac_i2c->min_cal_val); + + return snprintf(buf, PAGE_SIZE, + "\"SDCONN\":\"%d\",\"SECCNT\":\"%d\",\"SADCVAL\":\"%d\",\"SECLVL\":\"%d\",\"SCALLVL\":\"%d\"", + wac_i2c->connection_check, wac_i2c->fail_channel, + wac_i2c->min_adc_val, wac_i2c->error_cal, + wac_i2c->min_cal_val); +} + +static ssize_t get_epen_pos_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int max_x, max_y; + + if (wac_i2c->pdata->xy_switch) { + max_x = wac_i2c->pdata->max_y; + max_y = wac_i2c->pdata->max_x; + } else { + max_x = wac_i2c->pdata->max_x; + max_y = wac_i2c->pdata->max_y; + } + + input_info(true, &client->dev, + "%s: id(%d), x(%d), y(%d), max_x(%d), max_y(%d)\n", __func__, + wac_i2c->survey_pos.id, wac_i2c->survey_pos.x, wac_i2c->survey_pos.y, + max_x, max_y); + + return snprintf(buf, PAGE_SIZE, "%d,%d,%d,%d,%d\n", + wac_i2c->survey_pos.id, wac_i2c->survey_pos.x, wac_i2c->survey_pos.y, + max_x, max_y); +} + +static ssize_t flip_status_detect_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + + input_info(true, &wac_i2c->client->dev, "%s: %d\n", + __func__, wac_i2c->flip_state); + + return snprintf(buf, PAGE_SIZE, "%d\n", wac_i2c->flip_state); +} + +/* firmware update */ +static DEVICE_ATTR(epen_firm_update, (S_IWUSR | S_IWGRP), + NULL, epen_firmware_update_store); +/* return firmware update status */ +static DEVICE_ATTR(epen_firm_update_status, S_IRUGO, + epen_firm_update_status_show, NULL); +/* return firmware version */ +static DEVICE_ATTR(epen_firm_version, S_IRUGO, epen_firm_version_show, NULL); +static DEVICE_ATTR(ver_of_ic, S_IRUGO, epen_firm_version_of_ic_show, NULL); +static DEVICE_ATTR(ver_of_bin, S_IRUGO, epen_firm_version_of_bin_show, NULL); + +/* For SMD Test */ +static DEVICE_ATTR(epen_reset, (S_IWUSR | S_IWGRP), NULL, epen_reset_store); +static DEVICE_ATTR(epen_reset_result, S_IRUGO, epen_reset_result_show, NULL); +/* For SMD Test. Check checksum */ +static DEVICE_ATTR(epen_checksum, (S_IWUSR | S_IWGRP), + NULL, epen_checksum_store); +static DEVICE_ATTR(epen_checksum_result, S_IRUGO, + epen_checksum_result_show, NULL); +static DEVICE_ATTR(epen_connection, S_IRUGO, epen_connection_show, NULL); +static DEVICE_ATTR(epen_saving_mode, (S_IWUSR | S_IWGRP), + NULL, epen_saving_mode_store); +static DEVICE_ATTR(epen_wcharging_mode, (S_IRUGO | S_IWUSR | S_IWGRP), + epen_wcharging_mode_show, epen_wcharging_mode_store); +static DEVICE_ATTR(epen_disable_mode, (S_IWUSR | S_IWGRP), + NULL, epen_disable_mode_store); +static DEVICE_ATTR(screen_off_memo_enable, (S_IWUSR | S_IWGRP), + NULL, epen_screen_off_memo_enable_store); +static DEVICE_ATTR(get_epen_pos, + S_IRUGO, get_epen_pos_show, NULL); +static DEVICE_ATTR(aod_enable, (S_IWUSR | S_IWGRP), + NULL, epen_aod_enable_store); +static DEVICE_ATTR(aod_lcd_onoff_status, (S_IWUSR | S_IWGRP), + NULL, epen_aod_lcd_onoff_status_store); +static DEVICE_ATTR(aot_enable, (S_IWUSR | S_IWGRP), + NULL, epen_aot_enable_store); +static DEVICE_ATTR(hw_param, 0644, hardware_param_show, hardware_param_store); +static DEVICE_ATTR(epen_connection_check, S_IRUGO, + epen_connection_check_show, NULL); +#if WACOM_SEC_FACTORY +static DEVICE_ATTR(epen_fac_select_firmware, (S_IWUSR | S_IWGRP), + NULL, epen_fac_select_firmware_store); +#endif +static DEVICE_ATTR(flip_status_detect, 0444, + flip_status_detect_show, NULL); + +static struct attribute *epen_attributes[] = { + &dev_attr_epen_firm_update.attr, + &dev_attr_epen_firm_update_status.attr, + &dev_attr_epen_firm_version.attr, + &dev_attr_ver_of_ic.attr, + &dev_attr_ver_of_bin.attr, + &dev_attr_epen_reset.attr, + &dev_attr_epen_reset_result.attr, + &dev_attr_epen_checksum.attr, + &dev_attr_epen_checksum_result.attr, + &dev_attr_epen_connection.attr, + &dev_attr_epen_saving_mode.attr, + &dev_attr_epen_wcharging_mode.attr, + &dev_attr_epen_disable_mode.attr, + &dev_attr_screen_off_memo_enable.attr, + &dev_attr_get_epen_pos.attr, + &dev_attr_aod_enable.attr, + &dev_attr_aod_lcd_onoff_status.attr, + &dev_attr_aot_enable.attr, + &dev_attr_hw_param.attr, + &dev_attr_epen_connection_check.attr, +#if WACOM_SEC_FACTORY + &dev_attr_epen_fac_select_firmware.attr, +#endif + &dev_attr_flip_status_detect.attr, + NULL, +}; + +static struct attribute_group epen_attr_group = { + .attrs = epen_attributes, +}; + +#if 0 //elec test +static void print_spec_data(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + struct i2c_client *client = wac_i2c->client; + u8 tmp_buf[WACOM_CMD_RESULT_WORD_LEN] = { 0 }; + u8 *buff; + int buff_size; + int i; + + buff_size = edata->max_x_ch > edata->max_y_ch ? edata->max_x_ch : edata->max_y_ch; + buff_size = WACOM_CMD_RESULT_WORD_LEN * (buff_size + 1); + + buff = kzalloc(buff_size, GFP_KERNEL); + if (!buff) + return; + + input_info(true, &client->dev, "%s: shift_value %d, spec ver %d.%d", __func__, + edata->shift_value, edata->spec_ver[0], edata->spec_ver[1]); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "xx_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->xx_ref[i] * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "xy_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->xy_ref[i] * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "yx_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->yx_ref[i] * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "yy_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->yy_ref[i] * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "xy_edg_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->xy_edg_ref[i] * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "yx_edg_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->yx_edg_ref[i] * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "xx_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->xx_spec[i] / POWER_OFFSET * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "xy_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->xy_spec[i] / POWER_OFFSET * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "yx_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->yx_spec[i] / POWER_OFFSET * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "yy_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->yy_spec[i] / POWER_OFFSET * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "rxx_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->rxx_ref[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "rxy_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->rxy_ref[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "ryx_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->ryx_ref[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "ryy_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->ryy_ref[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "drxx_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->drxx_spec[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "drxy_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->drxy_spec[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "dryx_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->dryx_spec[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "dryy_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->dryy_spec[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "drxy_edg_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->drxy_edg_spec[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "dryx_edg_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, WACOM_CMD_RESULT_WORD_LEN, "%lld ", + edata->dryx_edg_spec[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, WACOM_CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + kfree(buff); +} + +static void run_elec_test(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct wacom_elec_data *edata = NULL; + struct i2c_client *client = wac_i2c->client; + u8 *buff = NULL; + u8 tmp_buf[WACOM_CMD_RESULT_WORD_LEN] = { 0 }; + u8 data[COM_ELEC_NUM] = { 0, }; + u16 tmp, offset; + u8 cmd; + int i, tx, rx; + int retry = RETRY_COUNT; + int ret; + int max_ch; + int buff_size; + u32 count; + int remain_data_count; + u16 *elec_result = NULL; + + sec_cmd_set_default_result(sec); + + input_info(true, &client->dev, "%s: parm[%d]\n", __func__, sec->cmd_param[0]); + + if (sec->cmd_param[0] < EPEN_ELEC_DATA_MAIN || sec->cmd_param[0] > EPEN_ELEC_DATA_UNIT) { + input_err(true, &client->dev, + "%s: Abnormal parm[%d]\n", __func__, sec->cmd_param[0]); + goto error; + } + + edata = wac_i2c->pdata->edata = wac_i2c->pdata->edatas[sec->cmd_param[0]]; + + if (!edata) { + input_err(true, &client->dev, "%s: test spec is NULL\n", __func__); + goto error; + } + + max_ch = edata->max_x_ch + edata->max_y_ch; + buff_size = max_ch * 2 * WACOM_CMD_RESULT_WORD_LEN + SEC_CMD_STR_LEN; + + buff = kzalloc(buff_size, GFP_KERNEL); + if (!buff) + goto error; + + elec_result = kzalloc((max_ch + 1) * sizeof(u16), GFP_KERNEL); + if (!elec_result) + goto error; + + w9019_enable_irq(wac_i2c, false); + + /* change wacom mode to 0x2D */ + mutex_lock(&wac_i2c->mode_lock); + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_NONE); + mutex_unlock(&wac_i2c->mode_lock); + + /* wait for status event for normal mode of wacom */ + msleep(250); + do { + ret = w9019_i2c_recv(wac_i2c, data, COM_COORD_NUM); + if (ret != COM_COORD_NUM) { + input_err(true, &client->dev, "%s: failed to recv status data\n", + __func__); + msleep(50); + continue; + } + + /* check packet ID */ + if ((data[0] & 0x0F) != NOTI_PACKET && (data[1] != CMD_PACKET)) { + input_info(true, &client->dev, + "%s: invalid status data %d\n", + __func__, (RETRY_COUNT - retry + 1)); + } else { + break; + } + + msleep(50); + } while(retry--); + + retry = RETRY_COUNT; + cmd = COM_ELEC_XSCAN; + ret = w9019_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", __func__, cmd); + goto error_test; + } + msleep(30); + + cmd = COM_ELEC_TRSX0; + ret = w9019_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", __func__, cmd); + goto error_test; + } + msleep(30); + + cmd = COM_ELEC_SCAN_START; + ret = w9019_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", __func__, cmd); + goto error_test; + } + msleep(30); + + for (tx = 0; tx < max_ch; tx++) { + /* x scan mode receive data through x coils */ + remain_data_count = edata->max_x_ch; + + do { + cmd = COM_ELEC_REQUESTDATA; + ret = w9019_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", + __func__, cmd); + goto error_test; + } + msleep(30); + + ret = w9019_i2c_recv(wac_i2c, data, COM_ELEC_NUM); + if (ret != COM_ELEC_NUM) { + input_err(true, &client->dev, + "%s: failed to receive elec data\n", + __func__); + goto error_test; + } +#if 0 + input_info(true, &client->dev, "%X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X\n", + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9], + data[10], data[11], data[12], data[13], data[14], data[15], data[16], data[17], data[18], data[19], + data[20], data[21], data[22], data[23], data[24], data[25], data[26], data[27], data[28], data[29], + data[30], data[31], data[32], data[33], data[34], data[35], data[36], data[37]); +#endif + /* check packet ID & sub packet ID */ + if (((data[0] & 0x0F) != 0x0E) && (data[1] != 0x65)) { + input_info(true, &client->dev, + "%s: %d data of wacom elec\n", + __func__, (RETRY_COUNT - retry + 1)); + if (--retry) { + continue; + } else { + input_err(true, &client->dev, + "%s: invalid elec data %d %d\n", + __func__, (data[0] & 0x0F), data[1]); + goto error_test; + } + } + + if (data[11] != 3) { + input_info(true, &client->dev, + "%s: %d data of wacom elec\n", + __func__, (RETRY_COUNT - retry + 1)); + if (--retry) { + continue; + } else { + input_info(true, &client->dev, + "%s: invalid elec status %d\n", + __func__, data[11]); + goto error_test; + } + } + + for (i = 0; i < COM_ELEC_DATA_NUM; i++) { + if (!remain_data_count) + break; + + offset = COM_ELEC_DATA_POS + (i * 2); + tmp = ((u16)(data[offset]) << 8) + data[offset + 1]; + rx = data[13] + i; + + edata->elec_data[rx * max_ch + tx] = tmp; + + remain_data_count--; + } + } while (remain_data_count); + + cmd = COM_ELEC_TRSCON; + ret = w9019_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to send 0x%02X\n", + __func__, cmd); + goto error_test; + } + msleep(30); + } + + cmd = COM_ELEC_YSCAN; + ret = w9019_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", __func__, cmd); + goto error_test; + } + msleep(30); + + cmd = COM_ELEC_TRSX0; + ret = w9019_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", __func__, cmd); + goto error_test; + } + msleep(30); + + cmd = COM_ELEC_SCAN_START; + ret = w9019_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", __func__, cmd); + goto error_test; + } + msleep(30); + + for (tx = 0; tx < max_ch; tx++) { + /* y scan mode receive data through y coils */ + remain_data_count = edata->max_y_ch; + + do { + cmd = COM_ELEC_REQUESTDATA; + ret = w9019_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", + __func__, cmd); + goto error_test; + } + msleep(30); + + ret = w9019_i2c_recv(wac_i2c, data, COM_ELEC_NUM); + if (ret != COM_ELEC_NUM) { + input_err(true, &client->dev, + "%s: failed to receive elec data\n", + __func__); + goto error_test; + } +#if 0 + input_info(true, &client->dev, "%X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X\n", + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9], + data[10], data[11], data[12], data[13], data[14], data[15], data[16], data[17], data[18], data[19], + data[20], data[21], data[22], data[23], data[24], data[25], data[26], data[27], data[28], data[29], + data[30], data[31], data[32], data[33], data[34], data[35], data[36], data[37]); +#endif + /* check packet ID & sub packet ID */ + if (((data[0] & 0x0F) != 0x0E) && (data[1] != 0x65)) { + input_info(true, &client->dev, + "%s: %d data of wacom elec\n", + __func__, (RETRY_COUNT - retry + 1)); + if (--retry) { + continue; + } else { + input_err(true, &client->dev, + "%s: invalid elec data %d %d\n", + __func__, (data[0] & 0x0F), data[1]); + goto error_test; + } + } + + if (data[11] != 3) { + input_info(true, &client->dev, + "%s: %d data of wacom elec\n", + __func__, (RETRY_COUNT - retry + 1)); + if (--retry) { + continue; + } else { + input_info(true, &client->dev, + "%s: invalid elec status %d\n", + __func__, data[11]); + goto error_test; + } + } + + for (i = 0; i < COM_ELEC_DATA_NUM; i++) { + if (!remain_data_count) + break; + + offset = COM_ELEC_DATA_POS + (i * 2); + tmp = ((u16)(data[offset]) << 8) + data[offset + 1]; + rx = edata->max_x_ch + data[13] + i; + + edata->elec_data[rx * max_ch + tx] = tmp; + + remain_data_count--; + } + } while (remain_data_count); + + cmd = COM_ELEC_TRSCON; + ret = w9019_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to send 0x%02X\n", + __func__, cmd); + goto error_test; + } + msleep(30); + } + + print_spec_data(wac_i2c); + + print_elec_data(wac_i2c); + + /* tx about x coil */ + for (tx = 0, i = 0; tx < edata->max_x_ch; tx++, i++) { + edata->xx[i] = 0; + edata->xy[i] = 0; + /* rx about x coil */ + for (rx = 0; rx < edata->max_x_ch; rx++) { + offset = rx * max_ch + tx; + if ((edata->elec_data[offset] > edata->xx[i]) && (tx != rx)) + edata->xx[i] = edata->elec_data[offset]; + if (tx == rx) + edata->xx_self[i] = edata->elec_data[offset]; + } + /* rx about y coil */ + for (rx = edata->max_x_ch; rx < max_ch; rx++) { + offset = rx * max_ch + tx; + if (edata->elec_data[offset] > edata->xy[i]) + edata->xy[i] = edata->elec_data[offset]; + } + edata->xy_edg[i] = min(edata->elec_data[(edata->max_x_ch + 1) * max_ch + tx] , + edata->elec_data[(max_ch -2) * max_ch + tx]); + } + + /* tx about y coil */ + for (tx = edata->max_x_ch, i = 0; tx < max_ch; tx++, i++) { + edata->yx[i] = 0; + edata->yy[i] = 0; + /* rx about x coil */ + for (rx = 0; rx < edata->max_x_ch; rx++) { + offset = rx * max_ch + tx; + if (edata->elec_data[offset] > edata->yx[i]) + edata->yx[i] = edata->elec_data[offset]; + } + /* rx about y coil */ + for (rx = edata->max_x_ch; rx < max_ch; rx++) { + offset = rx * max_ch + tx; + if ((edata->elec_data[offset] > edata->yy[i]) && (rx != tx)) + edata->yy[i] = edata->elec_data[offset]; + if (rx == tx) + edata->yy_self[i] = edata->elec_data[offset]; + } + edata->yx_edg[i] = min(edata->elec_data[max_ch + tx] , + edata->elec_data[(edata->max_x_ch -2) * max_ch + tx]); + } + + print_trx_data(wac_i2c); + + calibration_trx_data(wac_i2c); + + print_cal_trx_data(wac_i2c); + + calculate_ratio(wac_i2c); + + print_ratio_trx_data(wac_i2c); + + make_decision(wac_i2c, elec_result); + + print_difference_ratio_trx_data(wac_i2c); + + count = elec_result[0] >> 8; + if (!count) { + snprintf(tmp_buf, sizeof(tmp_buf), "0_"); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } else { + if (count > 3) + snprintf(tmp_buf, sizeof(tmp_buf), "3,"); + else + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", count); + + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + + for (i = 0, count = 0; i < max_ch; i++) { + if ((elec_result[i + 1] & SEC_SHORT) && count < 3) { + if (i < edata->max_x_ch) + snprintf(tmp_buf, sizeof(tmp_buf), "X%d,", i); + else + snprintf(tmp_buf, sizeof(tmp_buf), "Y%d,", i - edata->max_x_ch); + + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + count++; + } + } + buff[strlen(buff) - 1] = '_'; + } + + count = elec_result[0] & 0x00FF; + if (!count) { + snprintf(tmp_buf, sizeof(tmp_buf), "0_"); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } else { + if (count > 3) + snprintf(tmp_buf, sizeof(tmp_buf), "3,"); + else + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", count); + + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + + for (i = 0, count = 0; i < max_ch; i++) { + if ((elec_result[i + 1] & SEC_OPEN) && count < 3) { + if (i < edata->max_x_ch) + snprintf(tmp_buf, sizeof(tmp_buf), "X%d,", i); + else + snprintf(tmp_buf, sizeof(tmp_buf), "Y%d,", i - edata->max_x_ch); + + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + count++; + } + } + buff[strlen(buff) - 1] = '_'; + } + + snprintf(tmp_buf, sizeof(tmp_buf), "%d,%d_", edata->max_x_ch, edata->max_y_ch); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", edata->xx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", edata->xy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", edata->yx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", edata->yy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", edata->xx_self[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", edata->yy_self[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", edata->xy_edg[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", edata->yx_edg[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } + + sec_cmd_set_cmd_result(sec, buff, buff_size); + sec->cmd_state = SEC_CMD_STATUS_OK; + + kfree(elec_result); + kfree(buff); + + ret = w9019_start_stop_cmd(wac_i2c, WACOM_STOP_AND_START_CMD); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to set stop-start cmd, %d\n", + __func__, ret); + } + + w9019_enable_irq(wac_i2c, true); + + return; + +error_test: + ret = w9019_start_stop_cmd(wac_i2c, WACOM_STOP_AND_START_CMD); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to set stop-start cmd, %d\n", + __func__, ret); + } + + w9019_enable_irq(wac_i2c, true); + +error: + if (elec_result) + kfree(elec_result); + + if (buff) + kfree(buff); + + snprintf(tmp_buf, sizeof(tmp_buf), "NG"); + sec_cmd_set_cmd_result(sec, tmp_buf, sizeof(tmp_buf)); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + + return; +} + +static void ready_elec_test(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + char data; + int ret; + + sec_cmd_set_default_result(sec); + + if (sec->cmd_param[0]) + data = COM_ASYNC_VSYNC; + else + data = COM_SYNC_VSYNC; + + ret = w9019_i2c_send(wac_i2c, &data, 1); + if (ret != 1) { + input_err(true, &wac_i2c->client->dev, + "%s: failed to send data(%02x, %d)\n", + __func__, data, ret); + snprintf(buff, sizeof(buff), "NG\n"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + + goto out; + } + + msleep(30); + + snprintf(buff, sizeof(buff), "OK\n"); + sec->cmd_state = SEC_CMD_STATUS_OK; + +out: + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + + input_info(true, &wac_i2c->client->dev, "%s: %02x %s\n", + __func__, data, buff); + + return; +} + +static void get_elec_test_ver(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + if (sec->cmd_param[0] < EPEN_ELEC_DATA_MAIN || sec->cmd_param[0] > EPEN_ELEC_DATA_UNIT) { + input_err(true, &wac_i2c->client->dev, + "%s: Abnormal parm[%d]\n", __func__, sec->cmd_param[0]); + goto err_out; + } + + if (wac_i2c->pdata->edatas[sec->cmd_param[0]] == NULL) { + input_err(true, &wac_i2c->client->dev, + "%s: Elec test spec is null[%d]\n", __func__, sec->cmd_param[0]); + goto err_out; + } + + snprintf(buff, sizeof(buff), "%d.%d", + wac_i2c->pdata->edatas[sec->cmd_param[0]]->spec_ver[0], + wac_i2c->pdata->edatas[sec->cmd_param[0]]->spec_ver[1]); + + input_info(true, &wac_i2c->client->dev, "%s: pos[%d] ver(%s)\n", + __func__, sec->cmd_param[0], buff); + + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_OK; + return; + +err_out: + snprintf(buff, sizeof(buff), "NG"); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + return; + +} +#endif + +/* have to add cmd from Q os for garage test */ +static void get_chip_name(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + if (wac_i2c->pdata->ic_type == MPU_W9018) + snprintf(buff, sizeof(buff), "W9018"); + else if (wac_i2c->pdata->ic_type == MPU_W9019) + snprintf(buff, sizeof(buff), "W9019"); + else + snprintf(buff, sizeof(buff), "N/A"); + + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_OK; +} + +/* Factory cmd for firmware update + * argument represent what is source of firmware like below. + * + * 0 : [BUILT_IN] Getting firmware which is for user. + * 1 : [UMS] Getting firmware from sd card. + * 2 : none + * 3 : [FFU] Getting firmware from apk. + */ + +static void fw_update(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + int ret = 0; + + sec_cmd_set_default_result(sec); + + if (!wac_i2c->power_enable) { + input_err(true, &wac_i2c->client->dev, "%s: [ERROR] Wacom is stopped\n", __func__); + goto err_out; + } + + if (sec->cmd_param[0] < 0 || sec->cmd_param[0] > WACOM_VERIFICATION) { + input_err(true, &wac_i2c->client->dev, "%s: [ERROR] parm error![%d]\n", + __func__, sec->cmd_param[0]); + goto err_out; + } + + mutex_lock(&wac_i2c->lock); + + switch (sec->cmd_param[0]) { + case WACOM_BUILT_IN: + ret = w9019_fw_update_on_hidden_menu(wac_i2c, FW_BUILT_IN); + break; + case WACOM_SDCARD: +#if WACOM_PRODUCT_SHIP + ret = w9019_fw_update_on_hidden_menu(wac_i2c, FW_IN_SDCARD_SIGNED); +#else + ret = w9019_fw_update_on_hidden_menu(wac_i2c, FW_IN_SDCARD); +#endif + break; + case WACOM_SPU: + ret = w9019_fw_update_on_hidden_menu(wac_i2c, FW_SPU); + break; + case WACOM_VERIFICATION: + ret = w9019_fw_update_on_hidden_menu(wac_i2c, FW_VERIFICATION); + break; + default: + input_err(true, &wac_i2c->client->dev, "%s: Not support command[%d]\n", + __func__, sec->cmd_param[0]); + mutex_unlock(&wac_i2c->lock); + goto err_out; + } + + mutex_unlock(&wac_i2c->lock); + + if (ret) { + input_err(true, &wac_i2c->client->dev, "%s: Wacom fw upate(%d) fail ret [%d]\n", + __func__, sec->cmd_param[0], ret); + goto err_out; + } + + input_info(true, &wac_i2c->client->dev, "%s: Wacom fw upate[%d]\n", __func__, sec->cmd_param[0]); + + snprintf(buff, sizeof(buff), "OK\n"); + sec->cmd_state = SEC_CMD_STATUS_OK; + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + + input_info(true, &wac_i2c->client->dev, "%s: Done\n", __func__); + + return; + +err_out: + snprintf(buff, sizeof(buff), "NG"); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + return; + +} + +static void get_fw_ver_bin(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + snprintf(buff, sizeof(buff), "%04X", wac_i2c->fw_ver_bin); + + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_OK; +} + +static void get_fw_ver_ic(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + +#if IS_ENABLED(CONFIG_SEC_FACTORY) + wac_i2c->fw_ver_ic = 0; + w9019_i2c_query(wac_i2c); +#endif + + snprintf(buff, sizeof(buff), "%04X", wac_i2c->fw_ver_ic); + + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_OK; +} + +static void set_ic_reset(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + w9019_enable_irq(wac_i2c, false); + + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + + /* Reset IC */ + w9019_reset_hw(wac_i2c); + /* I2C Test */ + w9019_i2c_query(wac_i2c); + + w9019_enable_irq(wac_i2c, true); + + input_info(true, &wac_i2c->client->dev, "%s: result %d\n", __func__, wac_i2c->query_status); + + if (wac_i2c->query_status) { + snprintf(buff, sizeof(buff), "OK"); + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + snprintf(buff, sizeof(buff), "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} + +static void get_checksum(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + w9019_enable_irq(wac_i2c, false); + + w9019_checksum(wac_i2c); + + w9019_enable_irq(wac_i2c, true); + + input_info(true, &wac_i2c->client->dev, + "%s: result %d\n", __func__, wac_i2c->checksum_result); + + if (wac_i2c->checksum_result) { + snprintf(buff, sizeof(buff), "OK"); + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + snprintf(buff, sizeof(buff), "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} + +static void get_digitizer_connection(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + struct i2c_client *client = wac_i2c->client; +#if WACOM_SEC_FACTORY + int ret; +#endif + + input_info(true, &client->dev, "%s\n", __func__); + + sec_cmd_set_default_result(sec); + +#if WACOM_SEC_FACTORY + ret = w9019_check_ub(wac_i2c->client); + if (!ret) { + input_info(true, &client->dev, "%s: digitizer is not attached\n", __func__); + goto out; + } +#endif + + get_connection_test(wac_i2c, WACOM_DIGITIZER_TEST); + +#if WACOM_SEC_FACTORY +out: +#endif + if (wac_i2c->pdata->module_ver == 0x2) { + snprintf(buff, sizeof(buff), "%s %d %d %d %s %d\n", + wac_i2c->connection_check ? "OK" : "NG", + wac_i2c->pdata->module_ver, wac_i2c->fail_channel, + wac_i2c->min_adc_val, wac_i2c->error_cal ? "NG" : "OK", + wac_i2c->min_cal_val); + } else { + snprintf(buff, sizeof(buff), "%s %d %d %d\n", + wac_i2c->connection_check ? "OK" : "NG", + wac_i2c->pdata->module_ver, wac_i2c->fail_channel, + wac_i2c->min_adc_val); + } + + if (wac_i2c->connection_check) { + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} + +static void set_saving_mode(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + static u32 call_count; + + sec_cmd_set_default_result(sec); + + if(sec->cmd_param[0] < 0 || sec->cmd_param[0] > 1) { + input_err(true, &client->dev, "%s: Abnormal parm[%d]\n", + __func__, sec->cmd_param[0]); + snprintf(buff, sizeof(buff), "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto fail; + } + + if (call_count < 0xFFFFFFF0) + call_count++; + + wac_i2c->battery_saving_mode = sec->cmd_param[0]; + + input_info(true, &client->dev, "%s: ps %s & pen %s [%d]\n", + __func__, wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_result & EPEN_EVENT_PEN_OUT) ? "out" : "in", + call_count); + + if (!wac_i2c->power_enable && wac_i2c->battery_saving_mode) { + input_err(true, &client->dev, "%s: already power off, save & return\n", __func__); + goto out; + } + + if (!(wac_i2c->function_result & EPEN_EVENT_PEN_OUT)) { + w9019_select_survey_mode(wac_i2c, wac_i2c->screen_on); + + if (wac_i2c->battery_saving_mode) + w9019_forced_release_fullscan(wac_i2c); + } + +out: + snprintf(buff, sizeof(buff), "OK"); + sec->cmd_state = SEC_CMD_STATUS_OK; + +fail: + input_info(true, &client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void get_insert_status(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + int pen_state = (wac_i2c->function_result & EPEN_EVENT_PEN_OUT); + + sec_cmd_set_default_result(sec); + + input_info(true, &wac_i2c->client->dev, "%s : pen is %s\n", + __func__, pen_state ? "OUT" : "IN"); + + sec->cmd_state = SEC_CMD_STATUS_OK; + snprintf(buff, sizeof(buff), "%d\n", pen_state ? 0 : 1); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} + +static void set_wcharging_mode(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + int ret; + + sec_cmd_set_default_result(sec); + + wac_i2c->wcharging_mode = sec->cmd_param[0]; + input_info(true, &client->dev, "%s: %d\n", __func__, wac_i2c->wcharging_mode); + + if (!wac_i2c->power_enable) { + input_err(true, &wac_i2c->client->dev, + "%s: power off, save & return\n", __func__); + sec->cmd_state = SEC_CMD_STATUS_OK; + goto out; + } + + if (!wac_i2c->probe_done) { + input_err(true, &wac_i2c->client->dev, "%s: probe is not done\n", __func__); + sec->cmd_state = SEC_CMD_STATUS_OK; + goto out; + } + + ret = w9019_i2c_set_sense_mode(wac_i2c); + if (ret < 0) { + input_err(true, &client->dev, "%s: do not set sensitivity mode, %d\n", + __func__, ret); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; + } + sec->cmd_state = SEC_CMD_STATUS_OK; + +out: + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + else + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void get_wcharging_mode(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, + !wac_i2c->wcharging_mode ? "NORMAL" : "LOWSENSE"); + + sec->cmd_state = SEC_CMD_STATUS_OK; + snprintf(buff, sizeof(buff), "%s\n", !wac_i2c->wcharging_mode ? "NORMAL" : "LOWSENSE"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} + +static void set_disable_mode(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + if (sec->cmd_param[0]) + w9019_disable_mode(wac_i2c, WACOM_DISABLE); + else + w9019_disable_mode(wac_i2c, WACOM_ENABLE); + + snprintf(buff, sizeof(buff), "OK"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void set_screen_off_memo(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + int val = 0; + + sec_cmd_set_default_result(sec); + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, "%s : Not support screen off memo mode(%d) in Factory Bin\n", + __func__, sec->cmd_param[0]); + + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; +#endif + + val = !(!sec->cmd_param[0]); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO; + else + wac_i2c->function_set &= (~EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO); + + input_info(true, &client->dev, + "%s: ps %s aop(%d) set(0x%x) ret(0x%x)\n", __func__, + wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_set & EPEN_SETMODE_AOP) ? 1 : 0, + wac_i2c->function_set, wac_i2c->function_result); + + if (!wac_i2c->probe_done) { + input_err(true, &wac_i2c->client->dev, "%s: probe is not done\n", __func__); +#if WACOM_SEC_FACTORY + goto out; +#endif + } + + if (!wac_i2c->screen_on) + w9019_select_survey_mode(wac_i2c, false); + + sec->cmd_state = SEC_CMD_STATUS_OK; + +#if WACOM_SEC_FACTORY +out: +#endif + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + else + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void set_epen_aod_enable(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + int val = 0; + + sec_cmd_set_default_result(sec); + sec->cmd_state = SEC_CMD_STATUS_OK; + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, "%s : Not support aod mode(%d) in Factory Bin\n", + __func__, val); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; +#endif + + val = !(!sec->cmd_param[0]); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_AOD_LCD_OFF; + else + wac_i2c->function_set &= ~EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON; + + input_info(true, &client->dev, + "%s: ps %s aop(%d) set(0x%x) ret(0x%x)\n", __func__, + wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_set & EPEN_SETMODE_AOP) ? 1 : 0, + wac_i2c->function_set, wac_i2c->function_result); + + if (!wac_i2c->screen_on) + w9019_select_survey_mode(wac_i2c, false); + +#if WACOM_SEC_FACTORY +out: +#endif + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + else + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void set_aod_lcd_onoff_status(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + int val = 0; + int ret; + + sec_cmd_set_default_result(sec); + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, "%s : Not support aod mode(%d) in Factory Bin\n", + __func__, val); + + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; +#endif + + val = !(!sec->cmd_param[0]); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_AOD_LCD_STATUS; + else + wac_i2c->function_set &= ~EPEN_SETMODE_AOP_OPTION_AOD_LCD_STATUS; + + if (!(wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_AOD) || wac_i2c->screen_on) { + sec->cmd_state = SEC_CMD_STATUS_OK; + goto out; + } + + if (wac_i2c->survey_mode == EPEN_SURVEY_MODE_GARAGE_AOP) { + if ((wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON) + == EPEN_SETMODE_AOP_OPTION_AOD_LCD_OFF) { + w9019_forced_release_fullscan(wac_i2c); + } + + mutex_lock(&wac_i2c->mode_lock); + w9019_i2c_set_survey_mode(wac_i2c, wac_i2c->survey_mode); + mutex_unlock(&wac_i2c->mode_lock); + } + + ret = w9019_i2c_set_sense_mode(wac_i2c); + if (ret < 0) { + input_err(true, &client->dev, "%s: do not set sensitivity mode, %d\n", + __func__, ret); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; + } + sec->cmd_state = SEC_CMD_STATUS_OK; + +out: + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + else + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void set_epen_aot_enable(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + int val = 0; + + sec_cmd_set_default_result(sec); + sec->cmd_state = SEC_CMD_STATUS_OK; + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, "%s : Not support aod mode(%d) in Factory Bin\n", + __func__, val); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; +#endif + + val = !(!sec->cmd_param[0]); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_AOT; + else + wac_i2c->function_set &= (~EPEN_SETMODE_AOP_OPTION_AOT); + + input_info(true, &client->dev, + "%s: ps %s aop(%d) set(0x%x) ret(0x%x)\n", __func__, + wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_set & EPEN_SETMODE_AOP) ? 1 : 0, + wac_i2c->function_set, wac_i2c->function_result); + + if (!wac_i2c->screen_on) + w9019_select_survey_mode(wac_i2c, false); + +#if WACOM_SEC_FACTORY +out: +#endif + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + else + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +#if WACOM_SEC_FACTORY +/* k|K|0 : FW_BUILT_IN, t|T|1 : FW_FACTORY_GARAGE u|U|2 : FW_FACTORY_UNIT */ +static void set_fac_select_firmware(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + u8 fw_update_way = FW_NONE; + int ret; + + sec_cmd_set_default_result(sec); + + switch (sec->cmd_param[0]) { + case 0: + fw_update_way = FW_BUILT_IN; + break; + case 1: + fw_update_way = FW_FACTORY_GARAGE; + break; + case 2: + fw_update_way = FW_FACTORY_UNIT; + break; + default: + input_err(true, &client->dev, "wrong parameter\n"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; + } + + ret = w9019_i2c_load_fw(wac_i2c, fw_update_way); + if (ret < 0) { + input_info(true, &client->dev, "failed to load fw data\n"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; + } + + w9019_i2c_unload_fw(wac_i2c); + + sec->cmd_state = SEC_CMD_STATUS_OK; + +out: + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + else + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void set_fac_garage_mode(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + int ret; + + sec_cmd_set_default_result(sec); + sec->cmd_state = SEC_CMD_STATUS_OK; + + if (sec->cmd_param[0] < 0 || sec->cmd_param[0] > 1 ) { + input_err(true, &client->dev, "%s: abnormal param(%d)\n", + __func__, sec->cmd_param[0]); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; + } + + if (sec->cmd_param[0]) { + /* change normal mode for garage monitoring */ + mutex_lock(&wac_i2c->mode_lock); + w9019_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_NONE); + mutex_unlock(&wac_i2c->mode_lock); + + ret = w9019_start_stop_cmd(wac_i2c, WACOM_STOP_CMD); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to set stop cmd, %d\n", + __func__, ret); + wac_i2c->fac_garage_mode = 0; + goto fail_out; + } + + wac_i2c->fac_garage_mode = 1; + + } else { + wac_i2c->fac_garage_mode = 0; + + ret = w9019_start_stop_cmd(wac_i2c, WACOM_STOP_AND_START_CMD); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to set stop cmd, %d\n", + __func__, ret); + goto fail_out; + } + + /* recovery wacom mode */ + w9019_select_survey_mode(wac_i2c, wac_i2c->screen_on); + } + + input_info(true, &client->dev, "%s: done(%d)\n", __func__, sec->cmd_param[0]); + +out: + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + else + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); + + return; + +fail_out: + /* recovery wacom mode */ + w9019_select_survey_mode(wac_i2c, wac_i2c->screen_on); + + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buff, sizeof(buff), "NG"); + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); + +} + +static void get_fac_garage_mode(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + sec->cmd_state = SEC_CMD_STATUS_OK; + + snprintf(buff, sizeof(buff), "garage mode %s", + wac_i2c->fac_garage_mode ? "IN" : "OUT"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void get_fac_garage_rawdata(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + char data[17] = { 0, }; + int ret, retry = 1; + u8 cmd; + + sec_cmd_set_default_result(sec); + sec->cmd_state = SEC_CMD_STATUS_OK; + + if (!wac_i2c->fac_garage_mode) { + input_err(true, &client->dev, "not in factory garage mode\n"); + goto out; + } + +get_garage_retry: + w9019_enable_irq(wac_i2c, false); + + cmd = COM_REQUEST_GARAGEDATA; + ret = w9019_i2c_send(wac_i2c, &cmd, 1); + if (ret < 0) { + input_err(true, &client->dev, "failed to send request garage data command %d\n", ret); + msleep(30); + + goto fail_out; + } + + msleep(30); + + ret = w9019_i2c_recv(wac_i2c, data, sizeof(data)); + if (ret < 0) { + input_err(true, &client->dev, "failed to read garage raw data, %d\n", ret); + + wac_i2c->garage_freq0 = wac_i2c->garage_freq1 = 0; + wac_i2c->garage_gain0 = wac_i2c->garage_gain1 = 0; + + goto fail_out; + } + + w9019_enable_irq(wac_i2c, true); + + input_info(true, &client->dev, "%x %x %x %x %x %x %x %x %x %x\n", + data[2], data[3], data[4], data[5], data[6], data[7], + data[8], data[9], data[10], data[11]); + + wac_i2c->garage_gain0 = data[6]; + wac_i2c->garage_freq0 = ((u16)data[7] << 8) + data[8]; + + wac_i2c->garage_gain1 = data[9]; + wac_i2c->garage_freq1 = ((u16)data[10] << 8) + data[11]; + + if (wac_i2c->garage_freq0 == 0 && retry > 0) { + retry--; + goto get_garage_retry; + } + + snprintf(buff, sizeof(buff), "%d,%d,%d,%d", + wac_i2c->garage_gain0, wac_i2c->garage_freq0, + wac_i2c->garage_gain1, wac_i2c->garage_freq1); + + input_info(true, &client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + return; + +fail_out: + w9019_enable_irq(wac_i2c, true); +out: + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} +#endif + +static void debug(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + wac_i2c->debug_flag = sec->cmd_param[0]; + + snprintf(buff, sizeof(buff), "OK"); + + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_NOT_APPLICABLE; + sec_cmd_set_cmd_exit(sec); +} + +static void set_cover_type(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + if (wac_i2c->pdata->support_cover_noti) { + if (sec->cmd_param[0] < 0 || sec->cmd_param[0] > 2) { + input_err(true, &wac_i2c->client->dev, "%s: Not support command[%d]\n", + __func__, sec->cmd_param[0]); + goto err_out; + } else + wac_i2c->cover = sec->cmd_param[0]; + }else { + input_err(true, &wac_i2c->client->dev, "%s: Not support notice cover command\n", + __func__); + goto err_out; + } + + if (!wac_i2c->power_enable) { + input_err(true, &wac_i2c->client->dev, "%s: [ERROR] Wacom is stopped\n", __func__); + goto err_out; + } + + input_info(true, &wac_i2c->client->dev, "%s: %d\n", __func__, sec->cmd_param[0]); + + w9019_swap_compensation(wac_i2c, wac_i2c->cover); + + snprintf(buff, sizeof(buff), "OK\n"); + sec->cmd_state = SEC_CMD_STATUS_OK; + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); + + input_info(true, &wac_i2c->client->dev, "%s: Done\n", __func__); + + return; + +err_out: + snprintf(buff, sizeof(buff), "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); + + input_info(true, &wac_i2c->client->dev, "%s: Fail\n", __func__); + + return; +} + +static void not_support_cmd(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + snprintf(buff, sizeof(buff), "NA"); + + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_NOT_APPLICABLE; + sec_cmd_set_cmd_exit(sec); +} + +static struct sec_cmd sec_cmds[] = { +#if 0 //elec test + {SEC_CMD_H("run_elec_test", run_elec_test),}, + {SEC_CMD_H("ready_elec_test", ready_elec_test),}, + {SEC_CMD_H("get_elec_test_ver", get_elec_test_ver),}, +#endif + {SEC_CMD("fw_update", fw_update),}, + {SEC_CMD("get_fw_ver_bin", get_fw_ver_bin),}, + {SEC_CMD("get_fw_ver_ic", get_fw_ver_ic),}, + {SEC_CMD("set_ic_reset", set_ic_reset),}, + {SEC_CMD("get_chip_name", get_chip_name),}, + {SEC_CMD("get_checksum", get_checksum),}, + {SEC_CMD("get_digitizer_connection", get_digitizer_connection),}, + {SEC_CMD_H("set_saving_mode", set_saving_mode),}, + {SEC_CMD("get_insert_status", get_insert_status),}, + {SEC_CMD_H("set_wcharging_mode", set_wcharging_mode),}, + {SEC_CMD("get_wcharging_mode", get_wcharging_mode),}, + {SEC_CMD_H("set_disable_mode", set_disable_mode),}, + {SEC_CMD("set_screen_off_memo", set_screen_off_memo),}, + {SEC_CMD("set_epen_aod_enable", set_epen_aod_enable),}, + {SEC_CMD("set_aod_lcd_onoff_status", set_aod_lcd_onoff_status),}, + {SEC_CMD("set_epen_aot_enable", set_epen_aot_enable),}, +#if WACOM_SEC_FACTORY + {SEC_CMD_H("set_fac_select_firmware", set_fac_select_firmware),}, + {SEC_CMD("set_fac_garage_mode", set_fac_garage_mode),}, + {SEC_CMD("get_fac_garage_mode", get_fac_garage_mode),}, + {SEC_CMD("get_fac_garage_rawdata", get_fac_garage_rawdata),}, +#endif + {SEC_CMD("debug", debug),}, + {SEC_CMD("set_cover_type", set_cover_type),}, + {SEC_CMD("not_support_cmd", not_support_cmd),}, +}; + +#if 0 //elec test +static int wacom_sec_elec_init(struct wacom_i2c *wac_i2c, int pos) +{ + struct wacom_elec_data *edata = NULL; + struct i2c_client *client = wac_i2c->client; + struct device_node *np = wac_i2c->client->dev.of_node; + u32 tmp[2]; + int max_len; + int ret; + int i; + u8 tmp_name[30] = { 0 }; + + snprintf(tmp_name, sizeof(tmp_name), "wacom_elec%d", pos); + input_info(true, &client->dev, "%s: init : %s\n", __func__, tmp_name); + + np = of_get_child_by_name(np, tmp_name); + if (!np) { + input_err(true, &client->dev, "%s: node is not exist for elec\n", __func__); + return -EINVAL; + } + + edata = devm_kzalloc(&client->dev, sizeof(*edata), GFP_KERNEL); + if (!edata) + return -ENOMEM; + + wac_i2c->pdata->edatas[pos] = edata; + + ret = of_property_read_u32_array(np, "spec_ver", tmp, 2); + if (ret) { + input_err(true, &client->dev, + "failed to read sepc ver %d\n", ret); + return -EINVAL; + } + edata->spec_ver[0] = tmp[0]; + edata->spec_ver[1] = tmp[1]; + + ret = of_property_read_u32_array(np, "max_channel", tmp, 2); + if (ret) { + input_err(true, &client->dev, + "failed to read max channel %d\n", ret); + return -EINVAL; + } + edata->max_x_ch = tmp[0]; + edata->max_y_ch = tmp[1]; + + ret = of_property_read_u32(np, "shift_value", tmp); + if (ret) { + input_err(true, &client->dev, + "failed to read max channel %d\n", ret); + return -EINVAL; + } + edata->shift_value = tmp[0]; + + input_info(true, &client->dev, "channel(%d %d), spec_ver %d.%d shift_value %d\n", + edata->max_x_ch, edata->max_y_ch, edata->spec_ver[0], edata->spec_ver[1], edata->shift_value); + + max_len = edata->max_x_ch + edata->max_y_ch; + + edata->elec_data = devm_kzalloc(&client->dev, + max_len * max_len * sizeof(u16), + GFP_KERNEL); + if (!edata->elec_data) + return -ENOMEM; + + edata->xx = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(u16), GFP_KERNEL); + edata->xy = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(u16), GFP_KERNEL); + edata->yx = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(u16), GFP_KERNEL); + edata->yy = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(u16), GFP_KERNEL); + if (!edata->xx || !edata->xy || !edata->yx || !edata->yy) + return -ENOMEM; + + edata->xx_self = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(u16), GFP_KERNEL); + edata->yy_self = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(u16), GFP_KERNEL); + edata->xy_edg = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(u16), GFP_KERNEL); + edata->yx_edg = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(u16), GFP_KERNEL); + if (!edata->xx_self || !edata->yy_self || !edata->xy_edg || !edata->yx_edg) + return -ENOMEM; + + edata->xx_xx = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->xy_xy = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->yx_yx = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->yy_yy = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->xx_xx || !edata->xy_xy || !edata->yx_yx || !edata->yy_yy) + return -ENOMEM; + + edata->xy_xy_edg = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->yx_yx_edg = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->xy_xy_edg || !edata->yx_yx_edg) + return -ENOMEM; + + edata->rxx = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->rxy = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->ryx = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->ryy = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->rxx || !edata->rxy || !edata->ryx || !edata->ryy) + return -ENOMEM; + + edata->rxy_edg = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->ryx_edg = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->rxy_edg || !edata->ryx_edg) + return -ENOMEM; + + edata->drxx = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->drxy = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->dryx = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->dryy = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->drxx || !edata->drxy || !edata->dryx || !edata->dryy) + return -ENOMEM; + + edata->drxy_edg = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->dryx_edg = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->drxy_edg || !edata->dryx_edg) + return -ENOMEM; + + edata->xx_ref = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->xy_ref = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->yx_ref = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->yy_ref = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->xy_edg_ref = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->yx_edg_ref = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->xx_ref || !edata->xy_ref || !edata->yx_ref || !edata->yy_ref || !edata->xy_edg_ref || !edata->yx_edg_ref) + return -ENOMEM; + + ret = of_property_read_u64_array(np, "xx_ref", edata->xx_ref, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xx reference data %d\n", ret); + return -EINVAL; + } + + ret = of_property_read_u64_array(np, "xy_ref", edata->xy_ref, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xy reference data %d\n", ret); + return -EINVAL; + } + + ret = of_property_read_u64_array(np, "yx_ref", edata->yx_ref, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yx reference data %d\n", ret); + return -EINVAL; + } + + ret = of_property_read_u64_array(np, "yy_ref", edata->yy_ref, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yy reference data %d\n", ret); + return -EINVAL; + } + + ret = of_property_read_u64_array(np, "xy_ref_edg", edata->xy_edg_ref, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xy reference edg data %d\n", ret); + return -EINVAL; + } + + ret = of_property_read_u64_array(np, "yx_ref_edg", edata->yx_edg_ref, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yx reference edg data %d\n", ret); + return -EINVAL; + } + + edata->xx_spec = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->xy_spec = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->yx_spec = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->yy_spec = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->xx_spec || !edata->xy_spec || !edata->yx_spec || !edata->yy_spec) + return -ENOMEM; + + edata->xx_self_spec = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->yy_self_spec = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->xx_self_spec || !edata->yy_self_spec) + return -ENOMEM; + + ret = of_property_read_u64_array(np, "xx_spec", edata->xx_spec, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xx spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_x_ch; i++) + edata->xx_spec[i] = edata->xx_spec[i] * POWER_OFFSET; + + ret = of_property_read_u64_array(np, "xy_spec", edata->xy_spec, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xy spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_x_ch; i++) + edata->xy_spec[i] = edata->xy_spec[i] * POWER_OFFSET; + + ret = of_property_read_u64_array(np, "yx_spec", edata->yx_spec, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yx spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_y_ch; i++) + edata->yx_spec[i] = edata->yx_spec[i] * POWER_OFFSET; + + ret = of_property_read_u64_array(np, "yy_spec", edata->yy_spec, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yy spec data %d\n", ret); + return -EINVAL; + } + + ret = of_property_read_u64_array(np, "xx_spec_self", edata->xx_self_spec, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xx self spec data %d\n", ret); + return -EINVAL; + } + + ret = of_property_read_u64_array(np, "yy_spec_self", edata->yy_self_spec, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yy self spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_y_ch; i++) + edata->yy_spec[i] = edata->yy_spec[i] * POWER_OFFSET; + + edata->rxx_ref = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->rxy_ref = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->ryx_ref = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->ryy_ref = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->rxx_ref || !edata->rxy_ref || !edata->ryx_ref || !edata->ryy_ref) + return -ENOMEM; + + ret = of_property_read_u64_array(np, "rxx_ref", edata->rxx_ref, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xx ratio reference data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_x_ch; i++) + edata->rxx_ref[i] = edata->rxx_ref[i] * POWER_OFFSET / power(edata->shift_value); + + ret = of_property_read_u64_array(np, "rxy_ref", edata->rxy_ref, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xy ratio reference data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_x_ch; i++) + edata->rxy_ref[i] = edata->rxy_ref[i] * POWER_OFFSET / power(edata->shift_value); + + ret = of_property_read_u64_array(np, "ryx_ref", edata->ryx_ref, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yx ratio reference data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_y_ch; i++) + edata->ryx_ref[i] = edata->ryx_ref[i] * POWER_OFFSET / power(edata->shift_value); + + ret = of_property_read_u64_array(np, "ryy_ref", edata->ryy_ref, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yy ratio reference data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_y_ch; i++) + edata->ryy_ref[i] = edata->ryy_ref[i] * POWER_OFFSET / power(edata->shift_value); + + edata->drxx_spec = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->drxy_spec = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->dryx_spec = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->dryy_spec = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->drxx_spec || !edata->drxy_spec || !edata->dryx_spec || !edata->dryy_spec) + return -ENOMEM; + + edata->drxy_edg_spec = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->dryx_edg_spec = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->drxy_edg_spec || !edata->dryx_edg_spec) + return -ENOMEM; + + ret = of_property_read_u64_array(np, "drxx_spec", edata->drxx_spec, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xx difference ratio spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_x_ch; i++) + edata->drxx_spec[i] = edata->drxx_spec[i] * POWER_OFFSET / power(edata->shift_value); + + ret = of_property_read_u64_array(np, "drxy_spec", edata->drxy_spec, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xy difference ratio spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_x_ch; i++) + edata->drxy_spec[i] = edata->drxy_spec[i] * POWER_OFFSET / power(edata->shift_value); + + ret = of_property_read_u64_array(np, "dryx_spec", edata->dryx_spec, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yx difference ratio spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_y_ch; i++) + edata->dryx_spec[i] = edata->dryx_spec[i] * POWER_OFFSET / power(edata->shift_value); + + ret = of_property_read_u64_array(np, "dryy_spec", edata->dryy_spec, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yy difference ratio spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_y_ch; i++) + edata->dryy_spec[i] = edata->dryy_spec[i] * POWER_OFFSET / power(edata->shift_value); + + ret = of_property_read_u64_array(np, "drxy_spec_edg", edata->drxy_edg_spec, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xy difference ratio edg spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_x_ch; i++) + edata->drxy_edg_spec[i] = edata->drxy_edg_spec[i] * POWER_OFFSET / power(edata->shift_value); + + ret = of_property_read_u64_array(np, "dryx_spec_edg", edata->dryx_edg_spec, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yx difference ratio edg spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_y_ch; i++) + edata->dryx_edg_spec[i] = edata->dryx_edg_spec[i] * POWER_OFFSET / power(edata->shift_value); + + return 1; +} +#endif + +int w9019_sec_init(struct wacom_i2c *wac_i2c) +{ + struct i2c_client *client = wac_i2c->client; + int retval = 0; +#if 0 //elec test + int i = 0; +#endif + + retval = sec_cmd_init(&wac_i2c->sec, sec_cmds, ARRAY_SIZE(sec_cmds), + SEC_CLASS_DEVT_WACOM); + if (retval < 0) { + input_err(true, &client->dev, "failed to sec_cmd_init\n"); + return retval; + } + + retval = sysfs_create_group(&wac_i2c->sec.fac_dev->kobj, &epen_attr_group); + if (retval) { + input_err(true, &client->dev, "failed to create sysfs attributes\n"); + goto err_sysfs_create_group; + } + + retval = sysfs_create_link(&wac_i2c->sec.fac_dev->kobj, + &wac_i2c->input_dev->dev.kobj, "input"); + if (retval) { + input_err(true, &client->dev, "failed to create sysfs link\n"); + goto err_create_symlink; + } +#if 0 //elec test + for (i = EPEN_ELEC_DATA_MAIN ; i <= EPEN_ELEC_DATA_UNIT ; i++) { + wacom_sec_elec_init(wac_i2c, i); + } +#endif + + return 0; + +err_create_symlink: + sysfs_remove_group(&wac_i2c->sec.fac_dev->kobj, &epen_attr_group); +err_sysfs_create_group: + sec_cmd_exit(&wac_i2c->sec, SEC_CLASS_DEVT_WACOM); + + return retval; +} + +void w9019_sec_remove(struct wacom_i2c *wac_i2c) +{ + sysfs_remove_link(&wac_i2c->sec.fac_dev->kobj, "input"); + sysfs_remove_group(&wac_i2c->sec.fac_dev->kobj, &epen_attr_group); + sec_cmd_exit(&wac_i2c->sec, SEC_CLASS_DEVT_WACOM); +} diff --git a/drivers/input/w9019/wacom_reg.h b/drivers/input/w9019/wacom_reg.h new file mode 100755 index 000000000000..61bcef2d5296 --- /dev/null +++ b/drivers/input/w9019/wacom_reg.h @@ -0,0 +1,125 @@ +#include + +/* for query request (not use) */ +#define COM_QUERY 0x2A + +/* scan mode*/ +#define COM_SURVEY_ASYNC_SCAN 0x2B +#define COM_SURVEY_EXIT 0x2D +#define COM_SURVEY_SYNC_SCAN 0x2E +#define COM_SURVEY_GARAGE_ONLY 0x3B + +#define COM_SAMPLERATE_STOP 0x30 +#define COM_SAMPLERATE_START 0x31 + +#define COM_CHECKSUM 0x63 + +#define COM_NORMAL_COMPENSATION 0x80 +#define COM_SPECIAL_COMPENSATION 0x81 +#define COM_BOOKCOVER_COMPENSATION 0x81 +#define COM_KBDCOVER_COMPENSATION 0x82 + +#define COM_KBDCOVER_CHECK_STATUS 0x88 + +/* elec test*/ +#define COM_ASYNC_VSYNC 0X28 +#define COM_SYNC_VSYNC 0X29 +#define COM_ELEC_SCAN_START 0xC8 +#define COM_ELEC_XSCAN 0xCA +#define COM_ELEC_YSCAN 0xCB +#define COM_ELEC_TRSCON 0xCE +#define COM_ELEC_TRSX0 0xCF +#define COM_ELEC_REQUESTDATA 0xD6 + +/* digitizer & garage open test */ +#define COM_GARAGE_TEST_MODE 0xC4 +#define COM_DIGITIZER_TEST_MODE 0xC5 +#define COM_OPEN_CHECK_START 0xC9 +#define COM_OPEN_CHECK_STATUS 0xD8 + +/* sensitivity set cmd */ +#define COM_NORMAL_SENSE_MODE 0xDB +#define COM_LOW_SENSE_MODE 0xDC +#define COM_LOW_SENSE_MODE2 0xE7 +#define COM_REQUEST_SENSE_MODE 0xDD + +/* have to check below register*/ +#define COM_REQUEST_GARAGEDATA 0XE5 +#define COM_REQUEST_SCANMODE 0xE6 + +#define COM_BLE_C_DISABLE 0XE8 +#define COM_BLE_C_ENABLE 0XE9 +#define COM_BLE_C_RESET 0XEA +#define COM_BLE_C_START 0XEB +#define COM_BLE_C_KEEP_ON 0XEC +#define COM_BLE_C_KEEP_OFF 0XED +#define COM_BLE_C_MODE_RETURN 0XEE +#define COM_BLE_C_FORCE_RESET 0xEF +#define COM_BLE_C_FULL 0xF3 +#define COM_FLASH 0xFF + +/* pen ble charging */ +enum epen_ble_charge_mode { + EPEN_BLE_C_DISABLE = 0, + EPEN_BLE_C_ENABLE, + EPEN_BLE_C_RESET, + EPEN_BLE_C_START, + EPEN_BLE_C_KEEP_ON, + EPEN_BLE_C_KEEP_OFF, + EPEN_BLE_C_M_RETURN, + EPEN_BLE_C_DSPX, + EPEN_BLE_C_FULL, + EPEN_BLE_C_MAX, +}; + +enum epen_ble_charge_state { + BLE_C_OFF = 0, + BLE_C_START, + BLE_C_TRANSIT, + BLE_C_RESET, + BLE_C_AFTER_START, + BLE_C_AFTER_RESET, + BLE_C_ON_KEEP_1, + BLE_C_OFF_KEEP_1, + BLE_C_ON_KEEP_2, + BLE_C_OFF_KEEP_2, + BLE_C_FULL, +}; + +/* wacom query data format */ +#define EPEN_REG_HEADER 0x00 +#define EPEN_REG_X1 0x01 +#define EPEN_REG_X2 0x02 +#define EPEN_REG_Y1 0x03 +#define EPEN_REG_Y2 0x04 +#define EPEN_REG_PRESSURE1 0x05 +#define EPEN_REG_PRESSURE2 0x06 +#define EPEN_REG_FWVER1 0x07 +#define EPEN_REG_FWVER2 0x08 +#define EPEN_REG_MPUVER 0x09 +#define EPEN_REG_BLVER 0x0A +#define EPEN_REG_TILT_X 0x0B +#define EPEN_REG_TILT_Y 0x0C +#define EPEN_REG_HEIGHT 0x0D +#define EPEN_REG_FMTREV 0x0E +#define EPEN_REG_PROJ_ID 0x0F + +/* wacom status magic number */ +#define WACOM_NOISE_HIGH 0x11 +#define WACOM_NOISE_LOW 0x22 +#define AOP_BUTTON_HOVER 0xBB +#define AOP_DOUBLE_TAB 0xDD + +/* wacom ic values */ +#define MPU_W9018 0x42 +#define MPU_W9019 0x43 +#define MPU_W9020 0x44 +#define MPU_W9021 0x45 +#define MPU_WEZ01 0x46 + +/* Switch events */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) +#define SW_FLIP 0x10 /* set = flip cover open, close*/ +#else +#define SW_FLIP 0x15 /* set = flip cover open, close*/ +#endif \ No newline at end of file diff --git a/drivers/input/wacom/Kconfig b/drivers/input/wacom/Kconfig new file mode 100755 index 000000000000..7892a4839941 --- /dev/null +++ b/drivers/input/wacom/Kconfig @@ -0,0 +1,15 @@ +# +# Wacom configuration +# + +config EPEN_WACOM_WEZ01 + tristate "Wacom penabled i2c touchscreen" + depends on I2C + help + Say Y here if you have an Wacom penabled i2c touchscreen + connected to your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called wacom. \ No newline at end of file diff --git a/drivers/input/wacom/Makefile b/drivers/input/wacom/Makefile new file mode 100755 index 000000000000..922da10b45bf --- /dev/null +++ b/drivers/input/wacom/Makefile @@ -0,0 +1,4 @@ +obj-$(CONFIG_EPEN_WACOM_WEZ01) += wez01.o +wez01-objs := wacom_i2c.o wacom_i2c_sec.o wacom_i2c_elec.o wez01_flash.o + +ccflags-y += -Wformat diff --git a/drivers/input/wacom/wacom_dev.h b/drivers/input/wacom/wacom_dev.h new file mode 100755 index 000000000000..15d2f839644b --- /dev/null +++ b/drivers/input/wacom/wacom_dev.h @@ -0,0 +1,608 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if IS_ENABLED(CONFIG_SPU_VERIFY) +#define SUPPORT_FW_SIGNED +#endif +#ifdef SUPPORT_FW_SIGNED +#include +#endif +#include "wacom_reg.h" + +#if IS_ENABLED(CONFIG_INPUT_SEC_INPUT_LEGO) +#include "../sec_input/sec_input.h" +#else +#include +#define CMD_RESULT_WORD_LEN 20 +#define KEY_WAKEUP_UNLOCK 253 /* Wake-up to recent view, ex: AOP */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) +#define SW_PEN_INSERT 0x0f /* set = pen insert, remove */ +#else +#define SW_PEN_INSERT 0x13 /* set = pen insert, remove */ +#endif +#endif + +#undef CONFIG_USB_TYPEC_MANAGER_NOTIFIER +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) +#include +#endif + +#define RETRY_COUNT 3 + +#if IS_ENABLED(CONFIG_SEC_FACTORY) +#define WACOM_SEC_FACTORY 1 +#else +#define WACOM_SEC_FACTORY 0 +#endif + +#if IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) +#define WACOM_PRODUCT_SHIP 1 +#else +#define WACOM_PRODUCT_SHIP 0 +#endif + +#define WACOM_I2C_RETRY 3 +#define WACOM_CMD_RETRY 2 +#define WACOM_INVALID_IRQ_COUNT 2 + +#define WACOM_I2C_MODE_NORMAL false +#define WACOM_I2C_MODE_BOOT true + +#define WACOM_BLE_HISTORY_SIZE (22 * 150) +#define WACOM_BLE_HISTORY1_SIZE (22) + +/* wacom features */ +#define USE_OPEN_CLOSE +#define WACOM_USE_SURVEY_MODE /* SURVEY MODE is LPM mode : Only detect garage(pdct) & aop */ + +#ifdef WACOM_USE_SURVEY_MODE +#define EPEN_RESUME_DELAY 0 +#else +#define EPEN_RESUME_DELAY 180 +#endif +#define EPEN_OFF_TIME_LIMIT 10000 // usec + +/* query data */ +#define COM_COORD_NUM 16 +#define COM_RESERVED_NUM 0 +#define COM_QUERY_NUM 16 +#define COM_QUERY_POS (COM_COORD_NUM + COM_RESERVED_NUM) +#define COM_QUERY_BUFFER (COM_QUERY_POS + COM_QUERY_NUM) + +/* packet ID for wacom data */ +enum PACKET_ID { + COORD_PACKET = 1, + AOP_PACKET = 3, + NOTI_PACKET = 13, + REPLY_PACKET, + SEPC_PACKET, +}; + +enum NOTI_SUB_ID { + ERROR_PACKET = 0, + TABLE_SWAP_PACKET, + EM_NOISE_PACKET, + TSP_STOP_PACKET, + OOK_PACKET, + CMD_PACKET, + GCF_PACKET = 7, /* Garage Charging Finished notification data*/ + COVER_DETECT_PACKET = 10, +}; + +enum REPLY_SUB_ID { + OPEN_CHECK_PACKET = 1, + SWAP_PACKET, + SENSITIVITY_PACKET, + TSP_STOP_COND_PACKET, + GARAGE_CHARGE_PACKET = 6, + ELEC_TEST_PACKET = 101, +}; + +enum SEPC_SUB_ID { + QUERY_PACKET = 0, + CHECKSUM_PACKET, +}; + +enum TABLE_SWAP { + TABLE_SWAP_DEX_STATION = 1, + TABLE_SWAP_KBD_COVER = 2, +}; + +enum COVER_STATE { + NOMAL_MODE = 0, + BOOKCOVER_MODE, + KBDCOVER_MODE, +}; + +#define WACOM_PATH_EXTERNAL_FW "wacom.bin" +#define WACOM_PATH_EXTERNAL_FW_SIGNED "wacom_signed.bin" +#define WACOM_PATH_SPU_FW_SIGNED "ffu_wacom.bin" + +#define FW_UPDATE_RUNNING 1 +#define FW_UPDATE_PASS 2 +#define FW_UPDATE_FAIL -1 + +enum { + WACOM_BUILT_IN = 0, + WACOM_SDCARD, + WACOM_NONE, + WACOM_SPU, + WACOM_VERIFICATION, +}; + +enum { + FW_NONE = 0, + FW_BUILT_IN, + FW_SPU, + FW_HEADER, + FW_IN_SDCARD, + FW_IN_SDCARD_SIGNED, +#if WACOM_SEC_FACTORY + FW_FACTORY_GARAGE, + FW_FACTORY_UNIT, +#endif + FW_VERIFICATION, +}; + +/* header ver 1 */ +struct fw_image { + u8 hdr_ver; + u8 hdr_len; + u16 fw_ver1; + u16 fw_ver2; + u16 fw_ver3; + u32 fw_len; + u8 checksum[5]; + u8 alignment_dummy[3]; + u8 data[0]; +} __attribute__ ((packed)); + + +#define PDCT_NOSIGNAL true +#define PDCT_DETECT_PEN false + +/*-------------------------------------------------- + * event + * wac_i2c->function_result + * 7. ~ 4. reserved || 3. Garage | 2. Power Save | 1. AOP | 0. Pen In/Out | + * + * 0. Pen In/Out ( pen_insert ) + * ( 0: IN / 1: OUT ) + *-------------------------------------------------- + */ +#define EPEN_EVENT_PEN_OUT (1 << 0) +#define EPEN_EVENT_GARAGE (1 << 1) +#define EPEN_EVENT_AOP (1 << 2) +#define EPEN_EVENT_COVER_DETECTION (1 << 3) +#define EPEN_EVENT_SURVEY (EPEN_EVENT_GARAGE | EPEN_EVENT_AOP | EPEN_EVENT_COVER_DETECTION) + +#define EPEN_SURVEY_MODE_NONE 0x0 +#define EPEN_SURVEY_MODE_GARAGE_ONLY EPEN_EVENT_GARAGE +#define EPEN_SURVEY_MODE_GARAGE_AOP EPEN_EVENT_AOP +#define EPEN_SURVEY_MODE_COVER_DETECTION_ONLY EPEN_EVENT_COVER_DETECTION + +/*-------------------------------------------------- + * function setting by user or default + * wac_i2c->function_set + * 7~4. reserved | 3. AOT | 2. ScreenOffMemo | 1. AOD | 0. Depend on AOD + * + * 3. AOT - aot_enable sysfs + * 2. ScreenOffMemo - screen_off_memo_enable sysfs + * 1. AOD - aod_enable sysfs + * 0. Depend on AOD - 0 : lcd off status, 1 : lcd on status + *-------------------------------------------------- + */ +#define EPEN_SETMODE_AOP_OPTION_AOD_LCD_STATUS (0x1<<0) +#define EPEN_SETMODE_AOP_OPTION_AOD (0x1<<1) +#define EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO (0x1<<2) +#define EPEN_SETMODE_AOP_OPTION_AOT (0x1<<3) +#define EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON (EPEN_SETMODE_AOP_OPTION_AOD | EPEN_SETMODE_AOP_OPTION_AOD_LCD_STATUS) +#define EPEN_SETMODE_AOP_OPTION_AOD_LCD_OFF EPEN_SETMODE_AOP_OPTION_AOD +#define EPEN_SETMODE_AOP (EPEN_SETMODE_AOP_OPTION_AOD | EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO | \ + EPEN_SETMODE_AOP_OPTION_AOT) + +enum { + EPEN_POS_ID_SCREEN_OF_MEMO = 1, +}; +/* + * struct epen_pos - for using to send coordinate in survey mode + * @id: for extension of function + * 0 -> not use + * 1 -> for Screen off Memo + * 2 -> for oter app or function + * @x: x coordinate + * @y: y coordinate + */ +struct epen_pos { + u8 id; + int x; + int y; +}; + +/*-------------------------------------------------- + * Set S-Pen mode for TSP + * 1 byte input/output parameter + * byte[0]: S-pen mode + * - 0: non block tsp scan + * - 1: block tsp scan + * - others: Reserved for future use + *-------------------------------------------------- + */ +#define DISABLE_TSP_SCAN_BLCOK 0x00 +#define ENABLE_TSP_SCAN_BLCOK 0x01 + +enum WAKEUP_ID { + HOVER_WAKEUP = 2, + SINGLETAP_WAKEUP, + DOUBLETAP_WAKEUP, +}; + +enum SCAN_MODE { + GLOBAL_Y_MODE = 1, + GLOBAL_X_MODE, + FULL_MODE, + LOCAL_MODE, +}; + +#define WACOM_STOP_CMD 0x00 +#define WACOM_START_CMD 0x01 +#define WACOM_STOP_AND_START_CMD 0x02 + +#define EPEN_CHARGER_OFF_TIME 90 /* default 60s + buffer time */ +enum epen_scan_info{ + EPEN_CHARGE_OFF = 0, + EPEN_CHARGE_ON = 1, + EPEN_CHARGE_HAPPENED = 2, +}; + +typedef enum { + WACOM_ENABLE = 0, + WACOM_DISABLE = 1, +} wacom_disable_mode_t; + +enum epen_fw_ver_info{ + WACOM_FIRMWARE_VERSION_UNIT = 3, + WACOM_FIRMWARE_VERSION_SET = 4, + WACOM_FIRMWARE_VERSION_TEST = 6, +} ; + +/* WACOM_DEBUG : Print event contents */ +#define WACOM_DEBUG_PRINT_I2C_READ_CMD 0x01 +#define WACOM_DEBUG_PRINT_I2C_WRITE_CMD 0x02 +#define WACOM_DEBUG_PRINT_COORDEVENT 0x04 +#define WACOM_DEBUG_PRINT_ALLEVENT 0x08 + +/* digitizer & garage open test */ +#define EPEN_OPEN_TEST_PASS 0 +#define EPEN_OPEN_TEST_NOTSUPPORT -1 +#define EPEN_OPEN_TEST_EIO -2 +#define EPEN_OPEN_TEST_FAIL -3 +#define EPEN_OPEN_TEST_EMODECHG -4 +enum { + WACOM_GARAGE_TEST = 0, + WACOM_DIGITIZER_TEST, +}; + +/* elec data */ +#define COM_ELEC_NUM 38 +#define COM_ELEC_DATA_NUM 12 +#define COM_ELEC_DATA_POS 14 + +#define POWER_OFFSET 1000000000000 + +enum { + SEC_NORMAL = 0, + SEC_SHORT, + SEC_OPEN, +}; + +enum epen_elec_spec_mode { + EPEN_ELEC_DATA_MAIN = 0, + EPEN_ELEC_DATA_UNIT = 1, // pretest +// EPEN_ELEC_DATA_ASSY = 2, // reserved +}; + +struct wacom_elec_data { + u32 spec_ver[2]; + u8 max_x_ch; + u8 max_y_ch; + u8 shift_value; + + u16 *elec_data; + + u16 *xx; + u16 *xy; + u16 *yx; + u16 *yy; + + long long cal_xx; + long long cal_xy; + long long cal_yx; + long long cal_yy; + + long long *xx_xx; + long long *xy_xy; + long long *yx_yx; + long long *yy_yy; + + long long *rxx; + long long *rxy; + long long *ryx; + long long *ryy; + + long long *drxx; + long long *drxy; + long long *dryx; + long long *dryy; + + long long *xx_ref; + long long *xy_ref; + long long *yx_ref; + long long *yy_ref; + + long long *xx_spec; + long long *xy_spec; + long long *yx_spec; + long long *yy_spec; + + long long *rxx_ref; + long long *rxy_ref; + long long *ryx_ref; + long long *ryy_ref; + + long long *drxx_spec; + long long *drxy_spec; + long long *dryx_spec; + long long *dryy_spec; +}; + +struct wacom_g5_platform_data { + struct wacom_elec_data *edata; /* currnet test spec */ + struct wacom_elec_data *edatas[3]; /* 0:main, 1:sub unit, 2:sub assy(reserved) */ + + volatile bool enabled; + + int irq_gpio; + int pdct_gpio; + int fwe_gpio; + int boot_addr; + struct regulator *avdd; + + int x_invert; + int y_invert; + int xy_switch; + bool use_dt_coord; + u32 origin[2]; + int max_x; + int max_y; + int max_pressure; + int max_x_tilt; + int max_y_tilt; + int max_height; + const char *fw_path; +#if WACOM_SEC_FACTORY + const char *fw_fac_path; +#endif + u8 bl_ver; + u32 module_ver; + u32 support_garage_open_test; + u32 table_swap; + bool regulator_boot_on; + u32 bringup; + bool support_cover_noti; + bool support_cover_detection; + + u32 area_indicator; + u32 area_navigation; + u32 area_edge; + + u8 img_version_of_ic[4]; + u8 img_version_of_bin[4]; + u8 img_version_of_spu[4]; +}; + + + +struct wacom_i2c { + struct wacom_g5_platform_data *pdata; + struct i2c_client *client; + struct i2c_client *client_boot; + struct input_dev *input_dev; + struct sec_cmd_data sec; + struct mutex i2c_mutex; + struct mutex lock; + struct mutex update_lock; + struct mutex irq_lock; + struct mutex ble_lock; + struct mutex ble_charge_mode_lock; + bool power_enable; + struct wakeup_source *wacom_ws; + bool pm_suspend; + volatile bool probe_done; + bool query_status; + struct completion resume_done; + struct completion i2c_done; + + int irq; + int irq_pdct; + int pen_pdct; + bool pdct_lock_fail; + struct delayed_work open_test_dwork; + + /* survey & garage */ + struct mutex mode_lock; + u8 function_set; + u8 function_result; + volatile bool screen_on; + u8 survey_mode; + u8 check_survey_mode; + int samplerate_state; + volatile u8 report_scan_seq; /* 1:normal, 2:garage+aod, 3:garage only, 4:sync aop*/ + + /* ble(ook) */ + volatile u8 ble_mode; + long chg_time_stamp; + volatile bool ble_mode_change; + volatile bool ble_block_flag; + bool ble_charging_state; + bool ble_disable_flag; + + /* for tui or factory test */ + bool epen_blocked; + + /* coord */ + u16 hi_x; + u16 hi_y; + u16 p_x; + u16 p_y; + u16 x; + u16 y; + s8 tilt_x; + s8 tilt_y; + u16 pressure; + u16 height; + int tool; + u32 mcount; + int pen_prox; + int pen_pressed; + int side_pressed; + + struct epen_pos survey_pos; + + /* fw update */ + struct wakeup_source *wacom_fw_ws; + struct fw_image *fw_img; + const struct firmware *firm_data; + + int update_status; + u8 *fw_data; + u8 fw_update_way; + + bool checksum_result; + char fw_chksum[5]; + bool do_crc_check; + + /* tsp block */ + bool is_tsp_block; + int tsp_scan_mode; + int tsp_block_cnt; + + /* support additional mode */ + bool battery_saving_mode; + int wcharging_mode; + + struct delayed_work nb_reg_work; + + struct notifier_block kbd_nb; + struct work_struct kbd_work; + u8 kbd_conn_state; + u8 kbd_cur_conn_state; + + struct notifier_block typec_nb; + struct work_struct typec_work; + u8 dp_connect_state; + u8 dp_connect_cmd; + + struct notifier_block nb; + + /* open test*/ + volatile bool is_open_test; + // digitizer + bool connection_check; + int fail_channel; + int min_adc_val; + int error_cal; + int min_cal_val; + // garage + bool garage_connection_check; + int garage_fail_channel; + int garage_min_adc_val; + int garage_error_cal; + int garage_min_cal_val; + + /* check abnormal case*/ + struct delayed_work work_print_info; + u32 print_info_cnt_open; + u32 scan_info_fail_cnt; + u32 check_elec; + u32 i2c_fail_count; + u32 abnormal_reset_count; + u32 pen_out_count; + volatile bool reset_flag; + u8 debug_flag; +#if WACOM_SEC_FACTORY + volatile bool fac_garage_mode; + u32 garage_gain0; + u32 garage_gain1; + u32 garage_freq0; + u32 garage_freq1; +#endif + char *ble_hist; + char *ble_hist1; + int ble_hist_index; + char cover; + u8 flip_state; + bool bl_mpu_match; +}; + +extern struct wacom_i2c *g_wac_i2c; +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) +extern int get_lcd_attached(char *mode); +#endif +#if IS_ENABLED(CONFIG_EXYNOS_DPU30) +extern int get_lcd_info(char *arg); +#endif + +int wacom_power(struct wacom_i2c *, bool on); +void wacom_reset_hw(struct wacom_i2c *); + +void wacom_compulsory_flash_mode(struct wacom_i2c *, bool enable); +int wacom_get_irq_state(struct wacom_i2c *); + +void wacom_wakeup_sequence(struct wacom_i2c *); +void wacom_sleep_sequence(struct wacom_i2c *); + +int wacom_i2c_load_fw(struct wacom_i2c *wac_i2c, u8 fw_path); +void wacom_i2c_unload_fw(struct wacom_i2c *wac_i2c); +int wacom_fw_update_on_hidden_menu(struct wacom_i2c *, u8 fw_update_way); +int wacom_i2c_flash(struct wacom_i2c *); + +void wacom_enable_irq(struct wacom_i2c *, bool enable); + +int wacom_i2c_send(struct wacom_i2c *, const char *buf, int count); +int wacom_i2c_send_boot(struct wacom_i2c *, const char *buf, int count); +int wacom_i2c_recv(struct wacom_i2c *, char *buf, int count); +int wacom_i2c_recv_boot(struct wacom_i2c *, char *buf, int count); + +int wacom_i2c_query(struct wacom_i2c *); +int wacom_checksum(struct wacom_i2c *); +int wacom_i2c_set_sense_mode(struct wacom_i2c *); + +void wacom_forced_release(struct wacom_i2c *); +void forced_release_fullscan(struct wacom_i2c *wac_i2c); + +void wacom_select_survey_mode(struct wacom_i2c *, bool enable); +int wacom_i2c_set_survey_mode(struct wacom_i2c *, int mode); +int wacom_start_stop_cmd(struct wacom_i2c *wac_i2c, int mode); + +int wacom_open_test(struct wacom_i2c *wac_i2c, int test_mode); + +int wacom_sec_init(struct wacom_i2c *); +void wacom_sec_remove(struct wacom_i2c *); + +void wacom_print_info(struct wacom_i2c *wac_i2c); +void wacom_i2c_coord_modify(struct wacom_i2c *wac_i2c); +void wacom_disable_mode(struct wacom_i2c *wac_i2c, wacom_disable_mode_t mode); + +int wacom_check_ub(struct i2c_client *client); + +void wacom_swap_compensation(struct wacom_i2c *wac_i2c, char cmd); diff --git a/drivers/input/wacom/wacom_i2c.c b/drivers/input/wacom/wacom_i2c.c new file mode 100755 index 000000000000..2205e54c2d9c --- /dev/null +++ b/drivers/input/wacom/wacom_i2c.c @@ -0,0 +1,3250 @@ +/* + * wacom_i2c.c - Wacom Digitizer Controller (I2C bus) + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "wacom_dev.h" + +struct wacom_i2c *g_wac_i2c; +static void wacom_i2c_cover_handler(struct wacom_i2c *wac_i2c, char *data); + +void wacom_forced_release(struct wacom_i2c *wac_i2c) +{ +#if WACOM_PRODUCT_SHIP + if (wac_i2c->pen_pressed) { + input_info(true, &wac_i2c->client->dev, "%s : [R] dd:%d,%d mc:%d & [HO] dd:%d,%d\n", + __func__, wac_i2c->x - wac_i2c->p_x, wac_i2c->y - wac_i2c->p_y, + wac_i2c->mcount, wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y); + } else if (wac_i2c->pen_prox) { + input_info(true, &wac_i2c->client->dev, "%s : [HO] dd:%d,%d mc:%d\n", + __func__, wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y, wac_i2c->mcount); + } else { + input_info(true, &wac_i2c->client->dev, "%s : pen_prox(%d), pen_pressed(%d)\n", + __func__, wac_i2c->pen_prox, wac_i2c->pen_pressed); + } +#else + if (wac_i2c->pen_pressed) { + input_info(true, &wac_i2c->client->dev, "%s : [R] lx:%d ly:%d dd:%d,%d mc:%d & [HO] dd:%d,%d\n", + __func__, wac_i2c->x, wac_i2c->y, + wac_i2c->x - wac_i2c->p_x, wac_i2c->y - wac_i2c->p_y, + wac_i2c->mcount, wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y); + } else if (wac_i2c->pen_prox) { + input_info(true, &wac_i2c->client->dev, "%s : [HO] lx:%d ly:%d dd:%d,%d mc:%d\n", + __func__, wac_i2c->x, wac_i2c->y, + wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y, wac_i2c->mcount); + } else { + input_info(true, &wac_i2c->client->dev, "%s : pen_prox(%d), pen_pressed(%d)\n", + __func__, wac_i2c->pen_prox, wac_i2c->pen_pressed); + } +#endif + + input_report_abs(wac_i2c->input_dev, ABS_X, 0); + input_report_abs(wac_i2c->input_dev, ABS_Y, 0); + input_report_abs(wac_i2c->input_dev, ABS_PRESSURE, 0); + input_report_abs(wac_i2c->input_dev, ABS_DISTANCE, 0); + + input_report_key(wac_i2c->input_dev, BTN_STYLUS, 0); + input_report_key(wac_i2c->input_dev, BTN_TOUCH, 0); + input_report_key(wac_i2c->input_dev, BTN_TOOL_RUBBER, 0); + input_report_key(wac_i2c->input_dev, BTN_TOOL_PEN, 0); + + input_sync(wac_i2c->input_dev); + + wac_i2c->hi_x = 0; + wac_i2c->hi_y = 0; + wac_i2c->p_x = 0; + wac_i2c->p_y = 0; + + wac_i2c->pen_prox = 0; + wac_i2c->pen_pressed = 0; + wac_i2c->side_pressed = 0; + wac_i2c->mcount = 0; +} + +int wacom_i2c_send_sel(struct wacom_i2c *wac_i2c, const char *buf, int count, bool mode) +{ + struct i2c_client *client = mode ? wac_i2c->client_boot : wac_i2c->client; + int retry = WACOM_I2C_RETRY; + int ret; + u8 *buff; + int i; + + /* in LPM, waiting blsp block resume */ + if (wac_i2c->pm_suspend) { + __pm_wakeup_event(wac_i2c->wacom_ws, jiffies_to_msecs(500)); + ret = wait_for_completion_interruptible_timeout(&wac_i2c->resume_done, msecs_to_jiffies(500)); + if (ret <= 0) { + input_err(true, &wac_i2c->client->dev, + "%s: LPM: pm resume is not handled [timeout]\n", __func__); + return -ENOMEM; + } else { + input_info(true, &wac_i2c->client->dev, + "%s: run LPM interrupt handler, %d\n", __func__, jiffies_to_msecs(ret)); + } + } + + buff = kzalloc(count, GFP_KERNEL); + if (!buff) + return -ENOMEM; + + mutex_lock(&wac_i2c->i2c_mutex); + + memcpy(buff, buf, count); + + reinit_completion(&wac_i2c->i2c_done); + do { + if (!wac_i2c->power_enable) { + input_err(true, &client->dev, "%s: Power status off\n", __func__); + ret = -EIO; + + goto out; + } + + ret = i2c_master_send(client, buff, count); + if (ret == count) + break; + + if (retry < WACOM_I2C_RETRY) { + input_err(true, &client->dev, "%s: I2C retry(%d) mode(%d)\n", + __func__, WACOM_I2C_RETRY - retry, mode); + wac_i2c->i2c_fail_count++; + } + } while (--retry); + +out: + complete_all(&wac_i2c->i2c_done); + mutex_unlock(&wac_i2c->i2c_mutex); + + if (wac_i2c->debug_flag & WACOM_DEBUG_PRINT_I2C_WRITE_CMD) { + pr_info("sec_input : i2c_cmd: W: "); + for (i = 0; i < count; i++) + pr_cont("%02X ", buf[i]); + pr_cont("\n"); + } + + kfree(buff); + + return ret; +} + +int wacom_i2c_recv_sel(struct wacom_i2c *wac_i2c, char *buf, int count, bool mode) +{ + struct i2c_client *client = mode ? wac_i2c->client_boot : wac_i2c->client; + int retry = WACOM_I2C_RETRY; + int ret; + u8 *buff; + int i; + + /* in LPM, waiting blsp block resume */ + if (wac_i2c->pm_suspend) { + __pm_wakeup_event(wac_i2c->wacom_ws, jiffies_to_msecs(500)); + ret = wait_for_completion_interruptible_timeout(&wac_i2c->resume_done, msecs_to_jiffies(500)); + if (ret <= 0) { + input_err(true, &wac_i2c->client->dev, + "%s: LPM: pm resume is not handled [timeout]\n", __func__); + return -ENOMEM; + } else { + input_info(true, &wac_i2c->client->dev, + "%s: run LPM interrupt handler, %d\n", __func__, jiffies_to_msecs(ret)); + } + } + + buff = kzalloc(count, GFP_KERNEL); + if (!buff) + return -ENOMEM; + + mutex_lock(&wac_i2c->i2c_mutex); + + reinit_completion(&wac_i2c->i2c_done); + do { + if (!wac_i2c->power_enable) { + input_err(true, &client->dev, "%s: Power status off\n", __func__); + ret = -EIO; + + goto out; + } + + ret = i2c_master_recv(client, buff, count); + if (ret == count) + break; + + if (retry < WACOM_I2C_RETRY) { + input_err(true, &client->dev, "%s: I2C retry(%d) mode(%d)\n", + __func__, WACOM_I2C_RETRY - retry, mode); + wac_i2c->i2c_fail_count++; + } + } while (--retry); + + memcpy(buf, buff, count); + + if (wac_i2c->debug_flag & WACOM_DEBUG_PRINT_I2C_READ_CMD) { + pr_info("sec_input : i2c_cmd: R: "); + for (i = 0; i < count; i++) + pr_cont("%02X ", buf[i]); + pr_cont("\n"); + } + +out: + complete_all(&wac_i2c->i2c_done); + mutex_unlock(&wac_i2c->i2c_mutex); + + kfree(buff); + + return ret; +} + +int wacom_i2c_send_boot(struct wacom_i2c *wac_i2c, const char *buf, int count) +{ + return wacom_i2c_send_sel(wac_i2c, buf, count, WACOM_I2C_MODE_BOOT); +} + +int wacom_i2c_send(struct wacom_i2c *wac_i2c, const char *buf, int count) +{ + return wacom_i2c_send_sel(wac_i2c, buf, count, WACOM_I2C_MODE_NORMAL); +} + +int wacom_i2c_recv_boot(struct wacom_i2c *wac_i2c, char *buf, int count) +{ + return wacom_i2c_recv_sel(wac_i2c, buf, count, WACOM_I2C_MODE_BOOT); +} + +int wacom_i2c_recv(struct wacom_i2c *wac_i2c, char *buf, int count) +{ + return wacom_i2c_recv_sel(wac_i2c, buf, count, WACOM_I2C_MODE_NORMAL); +} + +int wacom_start_stop_cmd(struct wacom_i2c *wac_i2c, int mode) +{ + int retry; + int ret = 0; + char buff; + + input_info(true, &wac_i2c->client->dev, "%s: mode (%d)\n", __func__, mode); + +reset_start: + if (mode == WACOM_STOP_CMD) { + buff = COM_SAMPLERATE_STOP; + } else if (mode == WACOM_START_CMD) { + buff = COM_SAMPLERATE_START; + } else if (mode == WACOM_STOP_AND_START_CMD) { + buff = COM_SAMPLERATE_STOP; + wac_i2c->samplerate_state = WACOM_STOP_CMD; + } else { + input_info(true, &wac_i2c->client->dev, "%s: abnormal mode (%d)\n", __func__, mode); + return ret; + } + + retry = WACOM_CMD_RETRY; + do { + ret = wacom_i2c_send(wac_i2c, &buff, 1); + msleep(50); + if (ret < 0) + input_err(true, &wac_i2c->client->dev, + "%s: failed to send 0x%02X(%d)\n", __func__, buff, retry); + else + break; + + } while (--retry); + + if (mode == WACOM_STOP_AND_START_CMD) { + mode = WACOM_START_CMD; + goto reset_start; + } + + if (ret == 1) + wac_i2c->samplerate_state = mode; + + return ret; +} + +int wacom_checksum(struct wacom_i2c *wac_i2c) +{ + struct i2c_client *client = wac_i2c->client; + int ret = 0, retry = 10; + int i = 0; + u8 buf[5] = { 0, }; + + while (retry--) { + buf[0] = COM_CHECKSUM; + ret = wacom_i2c_send(wac_i2c, &buf[0], 1); + if (ret < 0) { + input_err(true, &client->dev, "i2c fail, retry, %d\n", __LINE__); + continue; + } + + msleep(200); + + ret = wacom_i2c_recv(wac_i2c, buf, 5); + if (ret < 0) { + input_err(true, &client->dev, "i2c fail, retry, %d\n", __LINE__); + continue; + } + + if (buf[0] == 0x1F) + break; + + input_info(true, &client->dev, "buf[0]: 0x%x, checksum retry\n", buf[0]); + } + + if (ret >= 0) { + input_info(true, &client->dev, "received checksum %x, %x, %x, %x, %x\n", + buf[0], buf[1], buf[2], buf[3], buf[4]); + } + + for (i = 0; i < 5; ++i) { + if (buf[i] != wac_i2c->fw_chksum[i]) { + input_info(true, &client->dev, "checksum fail %dth %x %x\n", + i, buf[i], wac_i2c->fw_chksum[i]); + break; + } + } + + wac_i2c->checksum_result = (i == 5); + + return wac_i2c->checksum_result; +} + +int wacom_i2c_query(struct wacom_i2c *wac_i2c) +{ + struct wacom_g5_platform_data *pdata = wac_i2c->pdata; + struct i2c_client *client = wac_i2c->client; + u8 data[COM_QUERY_BUFFER] = { 0, }; + u8 *query = data + COM_QUERY_POS; + int read_size = COM_QUERY_BUFFER; + int ret; + int i; + + for (i = 0; i < RETRY_COUNT; i++) { + ret = wacom_i2c_recv(wac_i2c, data, read_size); + if (ret < 0) { + input_err(true, &client->dev, "%s: failed to recv\n", __func__); + continue; + } + + input_info(true, &client->dev, "%s: %dth ret of wacom query=%d\n", __func__, i, ret); + + if (read_size != ret) { + input_err(true, &client->dev, "%s: read size error %d of %d\n", __func__, ret, read_size); + continue; + } + + input_info(true, &client->dev, + "(retry:%d) %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X\n", + i, query[0], query[1], query[2], query[3], query[4], query[5], + query[6], query[7], query[8], query[9], query[10], query[11], + query[12], query[13], query[14], query[15]); + + if (query[EPEN_REG_HEADER] == 0x0F) { + wac_i2c->pdata->img_version_of_ic[0] = query[EPEN_REG_MPUVER]; + wac_i2c->pdata->img_version_of_ic[1] = query[EPEN_REG_PROJ_ID]; + wac_i2c->pdata->img_version_of_ic[2] = query[EPEN_REG_FWVER1]; + wac_i2c->pdata->img_version_of_ic[3] = query[EPEN_REG_FWVER2]; + break; + } + } + + input_info(true, &client->dev, + "%X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X\n", + query[0], query[1], query[2], query[3], query[4], query[5], + query[6], query[7], query[8], query[9], query[10], query[11], + query[12], query[13], query[14], query[15]); + + if (ret < 0) { + input_err(true, &client->dev, "%s: failed to read query\n", __func__); + for (i = 0; i < 4; i++) + wac_i2c->pdata->img_version_of_ic[i] = 0; + + wac_i2c->query_status = false; + + return ret; + } + + wac_i2c->query_status = true; + + if (pdata->use_dt_coord == false) { + pdata->max_x = ((u16)query[EPEN_REG_X1] << 8) + query[EPEN_REG_X2]; + pdata->max_y = ((u16)query[EPEN_REG_Y1] << 8) + query[EPEN_REG_Y2]; + } + pdata->max_pressure = ((u16)query[EPEN_REG_PRESSURE1] << 8) + query[EPEN_REG_PRESSURE2]; + pdata->max_x_tilt = query[EPEN_REG_TILT_X]; + pdata->max_y_tilt = query[EPEN_REG_TILT_Y]; + pdata->max_height = query[EPEN_REG_HEIGHT]; + pdata->bl_ver = query[EPEN_REG_BLVER]; + + input_info(true, &client->dev, "use_dt_coord: %d, max_x: %d max_y: %d, max_pressure: %d\n", + pdata->use_dt_coord, pdata->max_x, pdata->max_y, pdata->max_pressure); + input_info(true, &client->dev, "fw_ver_ic=%02X%02X%02X%02X\n", + pdata->img_version_of_ic[0], pdata->img_version_of_ic[1], + pdata->img_version_of_ic[2], pdata->img_version_of_ic[3]); + input_info(true, &client->dev, "bl: 0x%X, tiltX: %d, tiltY: %d, maxH: %d\n", + pdata->bl_ver, pdata->max_x_tilt, pdata->max_y_tilt, pdata->max_height); + + return 0; +} + +int wacom_i2c_set_sense_mode(struct wacom_i2c *wac_i2c) +{ + struct i2c_client *client = wac_i2c->client; + int retval; + char data[4] = { 0, 0, 0, 0 }; + + input_info(true, &wac_i2c->client->dev, "%s cmd mod(%d)\n", __func__, wac_i2c->wcharging_mode); + + if (wac_i2c->wcharging_mode == 1) + data[0] = COM_LOW_SENSE_MODE; + else if (wac_i2c->wcharging_mode == 3) + data[0] = COM_LOW_SENSE_MODE2; + else { + /* it must be 0 */ + data[0] = COM_NORMAL_SENSE_MODE; + } + + retval = wacom_i2c_send(wac_i2c, &data[0], 1); + if (retval < 0) { + input_err(true, &client->dev, "%s: failed to send wacom i2c mode, %d\n", __func__, retval); + return retval; + } + + msleep(60); + + retval = wacom_start_stop_cmd(wac_i2c, WACOM_STOP_CMD); + if (retval < 0) { + input_err(true, &client->dev, "%s: failed to set stop cmd, %d\n", + __func__, retval); + return retval; + } + +#if 0 + /* temp block not to receive gabage irq by cmd */ + data[1] = COM_REQUEST_SENSE_MODE; + retval = wacom_i2c_send(wac_i2c, &data[1], 1); + if (retval < 0) { + input_err(true, &client->dev, + "%s: failed to read wacom i2c send2, %d\n", __func__, + retval); + return retval; + } + + msleep(60); + + retval = wacom_i2c_recv(wac_i2c, &data[2], 2); + if (retval != 2) { + input_err(true, &client->dev, + "%s: failed to read wacom i2c recv, %d\n", __func__, + retval); + return retval; + } + + input_info(true, &client->dev, "%s: mode:%X, %X\n", __func__, data[2], + data[3]); + + data[0] = COM_SAMPLERATE_STOP; + retval = wacom_i2c_send(wac_i2c, &data[0], 1); + if (retval < 0) { + input_err(true, &client->dev, + "%s: failed to read wacom i2c send3, %d\n", __func__, + retval); + return retval; + } + + msleep(60); +#endif + retval = wacom_start_stop_cmd(wac_i2c, WACOM_START_CMD); + if (retval < 0) { + input_err(true, &client->dev, "%s: failed to set start cmd, %d\n", + __func__, retval); + return retval; + } + + return retval; //data[3]; +} + +void wacom_select_survey_mode(struct wacom_i2c *wac_i2c, bool enable) +{ + struct i2c_client *client = wac_i2c->client; + + mutex_lock(&wac_i2c->mode_lock); + + if (enable) { + if (wac_i2c->epen_blocked || + (wac_i2c->battery_saving_mode && !(wac_i2c->function_result & EPEN_EVENT_PEN_OUT))) { + if (wac_i2c->pdata->support_cover_detection) { + input_info(true, &client->dev, "%s: %s cover detection only\n", + __func__, wac_i2c->epen_blocked ? "epen blocked" : "ps on & pen in"); + wacom_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_COVER_DETECTION_ONLY); + } else { + input_info(true, &client->dev, "%s: %s power off\n", __func__, + wac_i2c->epen_blocked ? "epen blocked" : "ps on & pen in"); + + wacom_enable_irq(wac_i2c, false); + wacom_power(wac_i2c, false); + + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + } + } else if (wac_i2c->survey_mode) { + input_info(true, &client->dev, "%s: exit aop mode\n", __func__); + + wacom_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_NONE); + +#if IS_ENABLED(CONFIG_EPEN_WACOM_W9020) + wac_i2c->reset_flag = true; + msleep(200); + input_info(true, &client->dev, "%s: reset_flag %d\n", __func__, wac_i2c->reset_flag); +#endif + } else { + input_info(true, &client->dev, "%s: power on\n", __func__); + + wacom_power(wac_i2c, true); + msleep(100); + + wacom_enable_irq(wac_i2c, true); + } + } else { + if (wac_i2c->epen_blocked || (wac_i2c->battery_saving_mode && + !(wac_i2c->function_result & EPEN_EVENT_PEN_OUT))) { + if (wac_i2c->pdata->support_cover_detection) { + input_info(true, &client->dev, "%s: %s cover detection only\n", + __func__, wac_i2c->epen_blocked ? "epen blocked" : "ps on & pen in"); + wacom_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_COVER_DETECTION_ONLY); + } else { + input_info(true, &client->dev, "%s: %s power off\n", + __func__, wac_i2c->epen_blocked ? "epen blocked" : "ps on & pen in"); + + wacom_enable_irq(wac_i2c, false); + wacom_power(wac_i2c, false); + + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + } + } else if (!(wac_i2c->function_set & EPEN_SETMODE_AOP)) { + if (wac_i2c->pdata->support_cover_detection) { + input_info(true, &client->dev, "%s: AOP off. cover detection only\n", + __func__); + wacom_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_COVER_DETECTION_ONLY); + } else { + input_info(true, &client->dev, "%s: aop off & garage off. power off\n", __func__); + + wacom_enable_irq(wac_i2c, false); + wacom_power(wac_i2c, false); + + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + } + } else { + /* aop on => (aod : screen off memo = 1:1 or 1:0 or 0:1) + * double tab & hover + button event will be occurred, + * but some of them will be skipped at reporting by mode + */ + input_info(true, &client->dev, "%s: aop on. aop mode\n", __func__); + + if (!wac_i2c->power_enable) { + input_info(true, &client->dev, "%s: power on\n", __func__); + + wacom_power(wac_i2c, true); + msleep(100); + + wacom_enable_irq(wac_i2c, true); + } + + wacom_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_GARAGE_AOP); + } + } + + if (wac_i2c->power_enable) { + input_info(true, &client->dev, "%s: screen %s, survey mode:%d, result:%d\n", + __func__, enable ? "on" : "off", wac_i2c->survey_mode, + wac_i2c->function_result & EPEN_EVENT_SURVEY); + + if ((wac_i2c->function_result & EPEN_EVENT_SURVEY) != wac_i2c->survey_mode) { + input_err(true, &client->dev, "%s: survey mode cmd failed\n", __func__); + + wacom_i2c_set_survey_mode(wac_i2c, wac_i2c->survey_mode); + } + } + + mutex_unlock(&wac_i2c->mode_lock); +} + +int wacom_i2c_set_survey_mode(struct wacom_i2c *wac_i2c, int mode) +{ + struct i2c_client *client = wac_i2c->client; + int retval; + char data[4] = { 0, 0, 0, 0 }; + + switch (mode) { + case EPEN_SURVEY_MODE_NONE: + data[0] = COM_SURVEY_EXIT; + break; + case EPEN_SURVEY_MODE_GARAGE_ONLY: + input_err(true, &client->dev, "%s: garage mode is not supported\n", __func__); + return -EPERM; + case EPEN_SURVEY_MODE_GARAGE_AOP: + if ((wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON) == EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON) + data[0] = COM_SURVEY_SYNC_SCAN; + else + data[0] = COM_SURVEY_ASYNC_SCAN; + break; + case EPEN_SURVEY_MODE_COVER_DETECTION_ONLY: + data[0] = COM_SURVEY_GARAGE_ONLY; + break; + default: + input_err(true, &client->dev, "%s: wrong param %d\n", __func__, mode); + return -EINVAL; + } + + wac_i2c->survey_mode = mode; + input_info(true, &client->dev, "%s: ps %s & mode : %d cmd(0x%2X)\n", __func__, + wac_i2c->battery_saving_mode ? "on" : "off", mode, data[0]); + + retval = wacom_i2c_send(wac_i2c, &data[0], 1); + if (retval < 0) { + input_err(true, &client->dev, "%s: failed to send data(%02x %d)\n", __func__, data[0], retval); + wac_i2c->reset_flag = true; + + return retval; + } + + wac_i2c->check_survey_mode = mode; + + if (mode) + msleep(300); + + wac_i2c->reset_flag = false; + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + wac_i2c->function_result |= mode; + + return 0; +} + +void forced_release_fullscan(struct wacom_i2c *wac_i2c) +{ + input_info(true, &wac_i2c->client->dev, "%s: full scan OUT\n", __func__); + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + wac_i2c->tsp_scan_mode = sec_input_notify(&wac_i2c->nb, NOTIFIER_TSP_BLOCKING_RELEASE, NULL); + wac_i2c->is_tsp_block = false; +#endif +} + +int wacom_power(struct wacom_i2c *wac_i2c, bool on) +{ + struct i2c_client *client = wac_i2c->client; + int ret = 0; + static bool boot_on = true; + + if (wac_i2c->power_enable == on) { + input_info(true, &client->dev, "pwr already %s\n", on ? "enabled" : "disabled"); + return 0; + } + + if (on) { + if (!regulator_is_enabled(wac_i2c->pdata->avdd) || boot_on) { + ret = regulator_enable(wac_i2c->pdata->avdd); + if (ret) { + input_err(true, &client->dev, "%s: Failed to enable vdd: %d\n", __func__, ret); + regulator_disable(wac_i2c->pdata->avdd); + goto out; + } + } else { + input_err(true, &client->dev, "%s: avdd is already enabled\n", __func__); + } + } else { + if (regulator_is_enabled(wac_i2c->pdata->avdd)) { + ret = regulator_disable(wac_i2c->pdata->avdd); + if (ret) { + input_err(true, &client->dev, "%s: failed to disable avdd: %d\n", __func__, ret); + goto out; + } + } else { + input_err(true, &client->dev, "%s: avdd is already disabled\n", __func__); + } + } + wac_i2c->power_enable = on; + +out: + input_info(true, &client->dev, "%s: %s: avdd:%s\n", + __func__, on ? "on" : "off", regulator_is_enabled(wac_i2c->pdata->avdd) ? "on" : "off"); + boot_on = false; + + return 0; +} + +void wacom_reset_hw(struct wacom_i2c *wac_i2c) +{ + wacom_power(wac_i2c, false); + /* recommended delay in spec */ + msleep(100); + wacom_power(wac_i2c, true); + + msleep(200); +} + +void wacom_compulsory_flash_mode(struct wacom_i2c *wac_i2c, bool enable) +{ + gpio_direction_output(wac_i2c->pdata->fwe_gpio, enable); + input_info(true, &wac_i2c->client->dev, "%s : enable(%d) fwe(%d)\n", + __func__, enable, gpio_get_value(wac_i2c->pdata->fwe_gpio)); +} + +void wacom_enable_irq(struct wacom_i2c *wac_i2c, bool enable) +{ + struct irq_desc *desc = irq_to_desc(wac_i2c->irq); + + if (desc == NULL) { + input_err(true, &wac_i2c->client->dev, "%s : irq desc is NULL\n", __func__); + return; + } + + mutex_lock(&wac_i2c->irq_lock); + + if (enable) { + while (desc->depth > 0) + enable_irq(wac_i2c->irq); + } else { + disable_irq(wac_i2c->irq); + } + mutex_unlock(&wac_i2c->irq_lock); +} + +static void wacom_enable_irq_wake(struct wacom_i2c *wac_i2c, bool enable) +{ + + if (enable) { + enable_irq_wake(wac_i2c->irq); + } else { + disable_irq_wake(wac_i2c->irq); + } +} + +void wacom_wakeup_sequence(struct wacom_i2c *wac_i2c) +{ + struct i2c_client *client = wac_i2c->client; + int retry = 1; + int ret; + + mutex_lock(&wac_i2c->lock); +#if WACOM_SEC_FACTORY + if (wac_i2c->fac_garage_mode) + input_info(true, &client->dev, "%s: garage mode\n", __func__); +#endif + + if (wac_i2c->wacom_fw_ws->active) { + input_info(true, &client->dev, "fw wake lock active. pass %s\n", __func__); + goto out_power_on; + } + + if (wac_i2c->screen_on) { + input_info(true, &client->dev, "already enabled. pass %s\n", __func__); + goto out_power_on; + } + +reset: + if (wac_i2c->reset_flag) { + input_info(true, &client->dev, "%s: IC reset start\n", __func__); + + wac_i2c->abnormal_reset_count++; + wac_i2c->reset_flag = false; + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + + wacom_enable_irq(wac_i2c, false); + + wacom_reset_hw(wac_i2c); + + input_info(true, &client->dev, "%s: IC reset end\n", __func__); + + if (wac_i2c->pdata->support_cover_noti && wac_i2c->cover) { + wacom_swap_compensation(wac_i2c, wac_i2c->cover); + } + + wacom_enable_irq(wac_i2c, true); + } + + wacom_select_survey_mode(wac_i2c, true); + + if (wac_i2c->reset_flag && retry--) + goto reset; + + if (wac_i2c->wcharging_mode) + wacom_i2c_set_sense_mode(wac_i2c); + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + if (wac_i2c->tsp_scan_mode < 0) { + wac_i2c->tsp_scan_mode = sec_input_notify(&wac_i2c->nb, NOTIFIER_TSP_BLOCKING_RELEASE, NULL); + wac_i2c->is_tsp_block = false; + } +#endif + + if (!gpio_get_value(wac_i2c->pdata->irq_gpio)) { + u8 data[COM_COORD_NUM + 1] = { 0, }; + + input_info(true, &client->dev, "%s: irq was enabled\n", __func__); + + ret = wacom_i2c_recv(wac_i2c, data, COM_COORD_NUM + 1); + if (ret < 0) { + input_err(true, &client->dev, "%s: failed to receive\n", __func__); + } + + input_info(true, &client->dev, + "%x %x %x %x %x, %x %x %x %x %x, %x %x %x\n", + data[0], data[1], data[2], data[3], data[4], data[5], + data[6], data[7], data[8], data[9], data[10], + data[11], data[12]); + + /* protection codes for cover status - need to check*/ + if ((data[0] & 0x0F) == NOTI_PACKET && data[1] == COVER_DETECT_PACKET) + wacom_i2c_cover_handler(wac_i2c, data); + } + + if (!wac_i2c->samplerate_state) { + char cmd = COM_SAMPLERATE_START; + + input_info(true, &client->dev, "%s: samplerate state is %d, need to recovery\n", + __func__, wac_i2c->samplerate_state); + + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret < 0) + input_err(true, &client->dev, "%s: failed to sned start cmd %d\n", __func__, ret); + else + wac_i2c->samplerate_state = true; + } + + input_info(true, &client->dev, + "%s: i(%d) f_set(0x%x) f_ret(0x%x) samplerate(%d)\n", + __func__, gpio_get_value(wac_i2c->pdata->irq_gpio), wac_i2c->function_set, + wac_i2c->function_result, wac_i2c->samplerate_state); + + cancel_delayed_work(&wac_i2c->work_print_info); + wac_i2c->print_info_cnt_open = 0; + wac_i2c->tsp_block_cnt = 0; + schedule_work(&wac_i2c->work_print_info.work); + + if (device_may_wakeup(&client->dev)) + wacom_enable_irq_wake(wac_i2c, false); + + wac_i2c->screen_on = true; + +out_power_on: + mutex_unlock(&wac_i2c->lock); + + input_info(true, &client->dev, "%s: end\n", __func__); +} + +void wacom_sleep_sequence(struct wacom_i2c *wac_i2c) +{ + struct i2c_client *client = wac_i2c->client; + int retry = 1; + + mutex_lock(&wac_i2c->lock); +#if WACOM_SEC_FACTORY + if (wac_i2c->fac_garage_mode) + input_info(true, &client->dev, "%s: garage mode\n", __func__); + +#endif + + if (wac_i2c->wacom_fw_ws->active) { + input_info(true, &client->dev, "fw wake lock active. pass %s\n", __func__); + goto out_power_off; + } + + if (!wac_i2c->screen_on) { + input_info(true, &client->dev, "already disabled. pass %s\n", __func__); + goto out_power_off; + } + cancel_delayed_work_sync(&wac_i2c->work_print_info); + wacom_print_info(wac_i2c); + +reset: + if (wac_i2c->reset_flag) { + input_info(true, &client->dev, "%s: IC reset start\n", __func__); + + wac_i2c->abnormal_reset_count++; + wac_i2c->reset_flag = false; + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + + wacom_enable_irq(wac_i2c, false); + + wacom_reset_hw(wac_i2c); + + input_info(true, &client->dev, "%s : IC reset end\n", __func__); + + wacom_enable_irq(wac_i2c, true); + } + + wacom_select_survey_mode(wac_i2c, false); + + /* release pen, if it is pressed */ + if (wac_i2c->pen_pressed || wac_i2c->side_pressed || wac_i2c->pen_prox) + wacom_forced_release(wac_i2c); + + forced_release_fullscan(wac_i2c); + + if (wac_i2c->reset_flag && retry--) + goto reset; + + if (device_may_wakeup(&client->dev)) + wacom_enable_irq_wake(wac_i2c, true); + + wac_i2c->screen_on = false; + +out_power_off: + mutex_unlock(&wac_i2c->lock); + + input_info(true, &client->dev, "%s end\n", __func__); +} + +static void wac_i2c_table_swap_reply(struct wacom_i2c *wac_i2c, char *data) +{ + u8 table_id; + + table_id = data[3]; + + if (table_id == 1) { + if (wac_i2c->pdata->table_swap == TABLE_SWAP_DEX_STATION) + wac_i2c->dp_connect_state = true; + + if (wac_i2c->pdata->table_swap == TABLE_SWAP_KBD_COVER) + wac_i2c->kbd_cur_conn_state = true; + } else if (!table_id) { + if (wac_i2c->pdata->table_swap == TABLE_SWAP_DEX_STATION) + wac_i2c->dp_connect_state = false; + + if (wac_i2c->pdata->table_swap == TABLE_SWAP_KBD_COVER) + wac_i2c->kbd_cur_conn_state = false; + } + +} + +static void wacom_i2c_reply_handler(struct wacom_i2c *wac_i2c, char *data) +{ + char pack_sub_id; +#if !WACOM_SEC_FACTORY && WACOM_PRODUCT_SHIP + int ret; +#endif + + pack_sub_id = data[1]; + + switch (pack_sub_id) { + case SWAP_PACKET: + wac_i2c_table_swap_reply(wac_i2c, data); + break; + case ELEC_TEST_PACKET: + wac_i2c->check_elec++; + +#if 0//!WACOM_SEC_FACTORY + // only for canvas on bring up + if (wac_i2c->check_elec > 1) + panic("elec-test"); +#else + input_info(true, &wac_i2c->client->dev, "%s: ELEC TEST PACKET received(%d)\n", __func__, wac_i2c->check_elec); +#endif + +#if !WACOM_SEC_FACTORY && WACOM_PRODUCT_SHIP + ret = wacom_start_stop_cmd(wac_i2c, WACOM_STOP_AND_START_CMD); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to set stop-start cmd, %d\n", + __func__, ret); + return; + } +#endif + break; + default: + input_info(true, &wac_i2c->client->dev, "%s: unexpected packet %d\n", __func__, pack_sub_id); + break; + }; +} + +static void wac_i2c_cmd_noti_handler(struct wacom_i2c *wac_i2c, char *data) +{ +#if IS_ENABLED(CONFIG_EPEN_WACOM_W9020) + wac_i2c->reset_flag = false; + input_info(true, &wac_i2c->client->dev, "%s: reset_flag %d\n", __func__, wac_i2c->reset_flag); +#endif +} + +static void wac_i2c_block_tsp_scan(struct wacom_i2c *wac_i2c, char *data) +{ + bool tsp; + u8 wacom_mode, scan_mode; + + wacom_mode = (data[2] & 0xF0) >> 4; + scan_mode = data[2] & 0x0F; + tsp = !!(data[5] & 0x80); + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + if (tsp && !wac_i2c->is_tsp_block) { + input_info(true, &wac_i2c->client->dev, "%s: tsp:%d wacom mode:%d scan mode:%d\n", + __func__, tsp, wacom_mode, scan_mode); + wac_i2c->is_tsp_block = true; + wac_i2c->tsp_scan_mode = sec_input_notify(&wac_i2c->nb, NOTIFIER_TSP_BLOCKING_REQUEST, NULL); + wac_i2c->tsp_block_cnt++; + } else if (!tsp && wac_i2c->is_tsp_block) { + input_info(true, &wac_i2c->client->dev, "%s: tsp:%d wacom mode:%d scan mode:%d\n", + __func__, tsp, wacom_mode, scan_mode); + wac_i2c->tsp_scan_mode = sec_input_notify(&wac_i2c->nb, NOTIFIER_TSP_BLOCKING_RELEASE, NULL); + wac_i2c->is_tsp_block = false; + } +#endif +} + +static void wacom_i2c_cover_handler(struct wacom_i2c *wac_i2c, char *data) +{ + char change_status; + + change_status = (data[3] >> 7) & 0x01; + + input_info(true, &wac_i2c->client->dev, "%s: cover status %d\n", __func__, change_status); + input_report_switch(wac_i2c->input_dev, + SW_FLIP, change_status); + input_sync(wac_i2c->input_dev); + wac_i2c->flip_state = change_status; +} + +static void wacom_i2c_noti_handler(struct wacom_i2c *wac_i2c, char *data) +{ + char pack_sub_id; + + pack_sub_id = data[1]; + + switch (pack_sub_id) { + case ERROR_PACKET: + input_err(true, &wac_i2c->client->dev, "%s: ERROR_PACKET\n", __func__); + break; + case TABLE_SWAP_PACKET: + case EM_NOISE_PACKET: + break; + case TSP_STOP_PACKET: + wac_i2c_block_tsp_scan(wac_i2c, data); + break; + case OOK_PACKET: + if (data[4] & 0x80) + input_err(true, &wac_i2c->client->dev, "%s: OOK Fail!\n", __func__); + break; + case CMD_PACKET: + wac_i2c_cmd_noti_handler(wac_i2c, data); + break; + case GCF_PACKET: +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + sec_input_notify(&wac_i2c->nb, NOTIFIER_WACOM_PEN_CHARGING_FINISHED, NULL); +#endif + break; + case COVER_DETECT_PACKET: + wacom_i2c_cover_handler(wac_i2c, data); + break; + default: + input_err(true, &wac_i2c->client->dev, "%s: unexpected packet %d\n", __func__, pack_sub_id); + break; + }; +} + +static void wacom_i2c_aop_handler(struct wacom_i2c *wac_i2c, char *data) +{ + struct wacom_g5_platform_data *pdata = wac_i2c->pdata; + bool stylus, prox = false; + s16 x, y, tmp; + u8 wacom_mode, wakeup_id; + + if (wac_i2c->screen_on || !wac_i2c->survey_mode || + !(wac_i2c->function_set & EPEN_SETMODE_AOP)) { + input_info(true, &wac_i2c->client->dev, "%s: unexpected status(%d %d %d)\n", + __func__, wac_i2c->screen_on, wac_i2c->survey_mode, + wac_i2c->function_set & EPEN_SETMODE_AOP); + return; + } + + prox = !!(data[0] & 0x10); + stylus = !!(data[0] & 0x20); + x = ((u16)data[1] << 8) + (u16)data[2]; + y = ((u16)data[3] << 8) + (u16)data[4]; + wacom_mode = (data[6] & 0xF0) >> 4; + wakeup_id = data[6] & 0x0F; + + /* origin */ + x = x - pdata->origin[0]; + y = y - pdata->origin[1]; + /* change axis from wacom to lcd */ + if (pdata->x_invert) + x = pdata->max_x - x; + + if (pdata->y_invert) + y = pdata->max_y - y; + + if (pdata->xy_switch) { + tmp = x; + x = y; + y = tmp; + } + + if (data[0] & 0x40) + wac_i2c->tool = BTN_TOOL_RUBBER; + else + wac_i2c->tool = BTN_TOOL_PEN; + + /* [for checking */ + input_info(true, &wac_i2c->client->dev, "wacom mode %d, wakeup id %d\n", wacom_mode, wakeup_id); + /* for checking] */ + + if (stylus && (wakeup_id == HOVER_WAKEUP) && + (wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO)) { + input_info(true, &wac_i2c->client->dev, "%s: Hover & Side Button detected\n", __func__); + + input_report_key(wac_i2c->input_dev, KEY_WAKEUP_UNLOCK, 1); + input_sync(wac_i2c->input_dev); + + input_report_key(wac_i2c->input_dev, KEY_WAKEUP_UNLOCK, 0); + input_sync(wac_i2c->input_dev); + + wac_i2c->survey_pos.id = EPEN_POS_ID_SCREEN_OF_MEMO; + wac_i2c->survey_pos.x = x; + wac_i2c->survey_pos.y = y; + } else if (wakeup_id == DOUBLETAP_WAKEUP) { + if ((wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON) == EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON) { + input_info(true, &wac_i2c->client->dev, "%s: Double Tab detected in AOD\n", __func__); + + /* make press / release event for AOP double tab gesture */ + input_report_abs(wac_i2c->input_dev, ABS_X, x); + input_report_abs(wac_i2c->input_dev, ABS_Y, y); + input_report_abs(wac_i2c->input_dev, ABS_PRESSURE, 1); + input_report_key(wac_i2c->input_dev, BTN_TOUCH, 1); + input_report_key(wac_i2c->input_dev, wac_i2c->tool, 1); + input_sync(wac_i2c->input_dev); + + input_report_abs(wac_i2c->input_dev, ABS_PRESSURE, 0); + input_report_key(wac_i2c->input_dev, BTN_TOUCH, 0); + input_report_key(wac_i2c->input_dev, wac_i2c->tool, 0); + input_sync(wac_i2c->input_dev); +#if WACOM_PRODUCT_SHIP + input_info(true, &wac_i2c->client->dev, "[P/R] tool:%x\n", + wac_i2c->tool); +#else + input_info(true, &wac_i2c->client->dev, + "[P/R] x:%d y:%d tool:%x\n", x, y, wac_i2c->tool); +#endif + } else if (wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_AOT) { + input_info(true, &wac_i2c->client->dev, "%s: Double Tab detected\n", __func__); + + input_report_key(wac_i2c->input_dev, KEY_HOMEPAGE, 1); + input_sync(wac_i2c->input_dev); + input_report_key(wac_i2c->input_dev, KEY_HOMEPAGE, 0); + input_sync(wac_i2c->input_dev); + } + } else { + input_info(true, &wac_i2c->client->dev, + "%s: unexpected AOP data : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", + __func__, data[0], data[1], data[2], data[3], data[4], data[5], + data[6], data[7], data[8], data[9], data[10], data[11], + data[12], data[13], data[14], data[15]); + } +} + +#define EPEN_LOCATION_DETECT_SIZE 6 +void epen_location_detect(struct wacom_i2c *wac_i2c, char *loc, int x, int y) +{ + int i; + int max_x = wac_i2c->pdata->max_x; + int max_y = wac_i2c->pdata->max_y; + + if (wac_i2c->pdata->xy_switch) { + max_x = wac_i2c->pdata->max_y; + max_y = wac_i2c->pdata->max_x; + } + + if (wac_i2c->pdata->area_indicator == 0){ + /* approximately value */ + wac_i2c->pdata->area_indicator = max_y * 4 / 100; + wac_i2c->pdata->area_navigation = max_y * 6 / 100; + wac_i2c->pdata->area_edge = max_y * 3 / 100; + + input_raw_info(true, &wac_i2c->client->dev, + "MAX XY(%d/%d), area_edge %d, area_indicator %d, area_navigation %d\n", + max_x, max_y, wac_i2c->pdata->area_edge, + wac_i2c->pdata->area_indicator, wac_i2c->pdata->area_navigation); + } + + for (i = 0; i < EPEN_LOCATION_DETECT_SIZE; ++i) + loc[i] = 0; + + if (x < wac_i2c->pdata->area_edge) + strcat(loc, "E."); + else if (x < (max_x - wac_i2c->pdata->area_edge)) + strcat(loc, "C."); + else + strcat(loc, "e."); + + if (y < wac_i2c->pdata->area_indicator) + strcat(loc, "S"); + else if (y < (max_y - wac_i2c->pdata->area_navigation)) + strcat(loc, "C"); + else + strcat(loc, "N"); +} + +void wacom_i2c_coord_modify(struct wacom_i2c *wac_i2c) +{ + struct wacom_g5_platform_data *pdata = wac_i2c->pdata; + s16 tmp; + + /* origin */ + wac_i2c->x = wac_i2c->x - pdata->origin[0]; + wac_i2c->y = wac_i2c->y - pdata->origin[1]; + + /* change axis from wacom to lcd */ + if (pdata->x_invert) { + wac_i2c->x = pdata->max_x - wac_i2c->x; + wac_i2c->tilt_x = -wac_i2c->tilt_x; + } + + if (pdata->y_invert) { + wac_i2c->y = pdata->max_y - wac_i2c->y; + wac_i2c->tilt_y = -wac_i2c->tilt_y; + } + + if (pdata->xy_switch) { + tmp = wac_i2c->x; + wac_i2c->x = wac_i2c->y; + wac_i2c->y = tmp; + + tmp = wac_i2c->tilt_x; + wac_i2c->tilt_x = wac_i2c->tilt_y; + wac_i2c->tilt_y = tmp; + } +} + +static void wacom_i2c_coord_handler(struct wacom_i2c *wac_i2c, char *data) +{ + struct wacom_g5_platform_data *pdata = wac_i2c->pdata; + struct i2c_client *client = wac_i2c->client; + bool prox = false; + bool rdy = false; + bool stylus; + char location[EPEN_LOCATION_DETECT_SIZE] = { 0, }; + + if (wac_i2c->debug_flag & WACOM_DEBUG_PRINT_COORDEVENT) { + input_info(true, &wac_i2c->client->dev, + "%s : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", + __func__, data[0], data[1], data[2], data[3], data[4], data[5], + data[6], data[7], data[8], data[9], data[10], data[11], + data[12], data[13], data[14], data[15]); + } + + rdy = !!(data[0] & 0x80); + + wac_i2c->x = ((u16)data[1] << 8) + (u16)data[2]; + wac_i2c->y = ((u16)data[3] << 8) + (u16)data[4]; + wac_i2c->pressure = ((u16)(data[5] & 0x0F) << 8) + (u16)data[6]; + wac_i2c->height = (u8)data[7]; + wac_i2c->tilt_x = (s8)data[8]; + wac_i2c->tilt_y = (s8)data[9]; + + wacom_i2c_coord_modify(wac_i2c); + + if (rdy) { + prox = !!(data[0] & 0x10); + stylus = !!(data[0] & 0x20); + + /* validation check */ + if (unlikely (pdata->xy_switch == 0 && (wac_i2c->x > pdata->max_x || wac_i2c->y > pdata->max_y) || + pdata->xy_switch == 1 && (wac_i2c->x > pdata->max_y || wac_i2c->y > pdata->max_x))) { +#if WACOM_PRODUCT_SHIP + input_info(true, &client->dev, "%s : Abnormal raw data x & y\n", __func__); +#else + input_info(true, &client->dev, "%s : Abnormal raw data x=%d, y=%d\n", __func__, wac_i2c->x, wac_i2c->y); +#endif + return; + } + + if (data[0] & 0x40) + wac_i2c->tool = BTN_TOOL_RUBBER; + else + wac_i2c->tool = BTN_TOOL_PEN; + + if (!wac_i2c->pen_prox) { + wac_i2c->pen_prox = true; + + epen_location_detect(wac_i2c, location, wac_i2c->x, wac_i2c->y); + wac_i2c->hi_x = wac_i2c->x; + wac_i2c->hi_y = wac_i2c->y; +#if WACOM_PRODUCT_SHIP + input_info(true, &client->dev, "[HI] loc:%s (%s)\n", + location, wac_i2c->tool == BTN_TOOL_PEN ? "p" : "r"); +#else + input_info(true, &client->dev, "[HI] x:%d y:%d loc:%s (%s) \n", + wac_i2c->x, wac_i2c->y, location, wac_i2c->tool == BTN_TOOL_PEN ? "pen" : "rubber"); +#endif + return; + } + + /* report info */ + input_report_abs(wac_i2c->input_dev, ABS_X, wac_i2c->x); + input_report_abs(wac_i2c->input_dev, ABS_Y, wac_i2c->y); + input_report_key(wac_i2c->input_dev, BTN_STYLUS, stylus); + input_report_key(wac_i2c->input_dev, BTN_TOUCH, prox); + + input_report_abs(wac_i2c->input_dev, ABS_PRESSURE, wac_i2c->pressure); + input_report_abs(wac_i2c->input_dev, ABS_DISTANCE, wac_i2c->height); + input_report_abs(wac_i2c->input_dev, ABS_TILT_X, wac_i2c->tilt_x); + input_report_abs(wac_i2c->input_dev, ABS_TILT_Y, wac_i2c->tilt_y); + input_report_key(wac_i2c->input_dev, wac_i2c->tool, 1); + input_sync(wac_i2c->input_dev); + + if (wac_i2c->debug_flag & WACOM_DEBUG_PRINT_ALLEVENT) + input_info(true, &client->dev, "[A] x:%d y:%d, p:%d, h:%d, tx:%d, ty:%d\n", + wac_i2c->x, wac_i2c->y, wac_i2c->pressure, wac_i2c->height, + wac_i2c->tilt_x, wac_i2c->tilt_y); + + wac_i2c->mcount++; + + /* log */ + if (prox && !wac_i2c->pen_pressed) { + epen_location_detect(wac_i2c, location, wac_i2c->x, wac_i2c->y); + wac_i2c->p_x = wac_i2c->x; + wac_i2c->p_y = wac_i2c->y; + +#if WACOM_PRODUCT_SHIP + input_info(true, &client->dev, "[P] p:%d loc:%s tool:%x mc:%d\n", + wac_i2c->pressure, location, wac_i2c->tool, wac_i2c->mcount); +#else + input_info(true, &client->dev, + "[P] x:%d y:%d p:%d loc:%s tool:%x mc:%d\n", + wac_i2c->x, wac_i2c->y, wac_i2c->pressure, location, wac_i2c->tool, wac_i2c->mcount); +#endif + } else if (!prox && wac_i2c->pen_pressed) { + epen_location_detect(wac_i2c, location, wac_i2c->x, wac_i2c->y); +#if WACOM_PRODUCT_SHIP + input_info(true, &client->dev, "[R] dd:%d,%d loc:%s tool:%x mc:%d\n", + wac_i2c->x - wac_i2c->p_x, wac_i2c->y - wac_i2c->p_y, + location, wac_i2c->tool, wac_i2c->mcount); +#else + input_info(true, &client->dev, + "[R] lx:%d ly:%d dd:%d,%d loc:%s tool:%x mc:%d\n", + wac_i2c->x, wac_i2c->y, + wac_i2c->x - wac_i2c->p_x, wac_i2c->y - wac_i2c->p_y, + location, wac_i2c->tool, wac_i2c->mcount); +#endif + wac_i2c->p_x = wac_i2c->p_y = 0; + } + wac_i2c->pen_pressed = prox; + + /* check side */ + if (stylus && !wac_i2c->side_pressed) + input_info(true, &client->dev, "%s: side on\n", __func__); + else if (!stylus && wac_i2c->side_pressed) + input_info(true, &client->dev, "%s: side off\n", __func__); + + wac_i2c->side_pressed = stylus; + } else { + if (wac_i2c->pen_prox) { + input_report_abs(wac_i2c->input_dev, ABS_PRESSURE, 0); + input_report_key(wac_i2c->input_dev, BTN_STYLUS, 0); + input_report_key(wac_i2c->input_dev, BTN_TOUCH, 0); + /* prevent invalid operation of input booster */ + input_sync(wac_i2c->input_dev); + + input_report_abs(wac_i2c->input_dev, ABS_DISTANCE, 0); + input_report_key(wac_i2c->input_dev, BTN_TOOL_RUBBER, 0); + input_report_key(wac_i2c->input_dev, BTN_TOOL_PEN, 0); + input_sync(wac_i2c->input_dev); + + epen_location_detect(wac_i2c, location, wac_i2c->x, wac_i2c->y); + + if (wac_i2c->pen_pressed) { +#if WACOM_PRODUCT_SHIP + input_info(true, &client->dev, + "[R] dd:%d,%d loc:%s tool:%x mc:%d & [HO] dd:%d,%d\n", + wac_i2c->x - wac_i2c->p_x, wac_i2c->y - wac_i2c->p_y, + location, wac_i2c->tool, wac_i2c->mcount, + wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y); +#else + input_info(true, &client->dev, + "[R] lx:%d ly:%d dd:%d,%d loc:%s tool:%x mc:%d & [HO] dd:%d,%d\n", + wac_i2c->x, wac_i2c->y, + wac_i2c->x - wac_i2c->p_x, wac_i2c->y - wac_i2c->p_y, + location, wac_i2c->tool, wac_i2c->mcount, + wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y); +#endif + } else { +#if WACOM_PRODUCT_SHIP + input_info(true, &client->dev, "[HO] dd:%d,%d loc:%s mc:%d\n", + wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y, + location, wac_i2c->mcount); + +#else + input_info(true, &client->dev, "[HO] lx:%d ly:%d dd:%d,%d loc:%s mc:%d\n", + wac_i2c->x, wac_i2c->y, + wac_i2c->x - wac_i2c->hi_x, wac_i2c->y - wac_i2c->hi_y, + location, wac_i2c->mcount); +#endif + } + wac_i2c->p_x = wac_i2c->p_y = wac_i2c->hi_x = wac_i2c->hi_y = 0; + + } else { + input_info(true, &client->dev, + "unexpected data : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", + data[0], data[1], data[2], data[3], data[4], data[5], + data[6], data[7], data[8], data[9], data[10], data[11], + data[12], data[13], data[14], data[15]); + } + + wac_i2c->pen_prox = 0; + wac_i2c->pen_pressed = 0; + wac_i2c->side_pressed = 0; + wac_i2c->mcount = 0; + } + + return; +} + +static int wacom_event_handler(struct wacom_i2c *wac_i2c) +{ + int ret; + char pack_id; + bool debug = true; + char buff[COM_COORD_NUM + 1] = { 0, }; + + ret = wacom_i2c_recv(wac_i2c, buff, COM_COORD_NUM + 1); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: read failed\n", __func__); + return ret; + } + + pack_id = buff[0] & 0x0F; + + switch (pack_id) { + case COORD_PACKET: + wacom_i2c_coord_handler(wac_i2c, buff); + debug = false; + break; + case AOP_PACKET: + wacom_i2c_aop_handler(wac_i2c, buff); + break; + case NOTI_PACKET: + wac_i2c->report_scan_seq = (buff[2] & 0xF0) >> 4; + wacom_i2c_noti_handler(wac_i2c, buff); + break; + case REPLY_PACKET: + wacom_i2c_reply_handler(wac_i2c, buff); + break; + case SEPC_PACKET: + break; + default: + input_info(true, &wac_i2c->client->dev, "%s: unexpected packet %d\n", + __func__, pack_id); + break; + }; + + if (debug) { + input_info(true, &wac_i2c->client->dev, + "%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x / s:%d\n", + buff[0], buff[1], buff[2], buff[3], buff[4], buff[5], + buff[6], buff[7], buff[8], buff[9], buff[10], buff[11], + buff[12], buff[13], buff[14], buff[15], + pack_id == NOTI_PACKET ? wac_i2c->report_scan_seq : 0); + } + + return ret; +} + +static irqreturn_t wacom_interrupt(int irq, void *dev_id) +{ + struct wacom_i2c *wac_i2c = dev_id; + int ret = 0; + + /* in LPM, waiting blsp block resume */ + if (wac_i2c->pm_suspend) { + __pm_wakeup_event(wac_i2c->wacom_ws, jiffies_to_msecs(500)); + /* waiting for blsp block resuming, if not occurs i2c error */ + ret = wait_for_completion_interruptible_timeout(&wac_i2c->resume_done, msecs_to_jiffies(500)); + if (ret <= 0) { + input_err(true, &wac_i2c->client->dev, "LPM: pm resume is not handled [%d]\n", ret); + return IRQ_HANDLED; + } else { + input_info(true, &wac_i2c->client->dev, + "%s: run LPM interrupt handler, %d\n", __func__, jiffies_to_msecs(ret)); + } + } + + ret = wacom_event_handler(wac_i2c); + if (ret < 0) { + wacom_forced_release(wac_i2c); + forced_release_fullscan(wac_i2c); + wac_i2c->reset_flag = true; + } + + return IRQ_HANDLED; +} + +static void open_test_work(struct work_struct *work) +{ + struct wacom_i2c *wac_i2c = + container_of(work, struct wacom_i2c, open_test_dwork.work); + char data; + int ret = 0; + +#if !WACOM_SEC_FACTORY + if (wac_i2c->pdata->support_garage_open_test) { + ret = wacom_open_test(wac_i2c, WACOM_GARAGE_TEST); + if (ret) { + input_err(true, &wac_i2c->client->dev, "grage test check failed %d\n", ret); + wacom_reset_hw(wac_i2c); + } + } + + ret = wacom_open_test(wac_i2c, WACOM_DIGITIZER_TEST); + if (ret) { + input_err(true, &wac_i2c->client->dev, "open test check failed %d\n", ret); + wacom_reset_hw(wac_i2c); + } +#else + input_info(true, &wac_i2c->client->dev, "open test skiped!\n"); +#endif + + /* occur cover status event*/ + if (wac_i2c->pdata->support_cover_detection) { + data = COM_KBDCOVER_CHECK_STATUS; + ret = wacom_i2c_send(wac_i2c, &data, 1); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to send cover status event %d\n", __func__, ret); + } + } +} + +static void probe_open_test(struct wacom_i2c *wac_i2c) +{ + INIT_DELAYED_WORK(&wac_i2c->open_test_dwork, open_test_work); + + /* update the current status */ + schedule_delayed_work(&wac_i2c->open_test_dwork, HZ * 1); +} + +static int wacom_i2c_input_open(struct input_dev *dev) +{ + struct wacom_i2c *wac_i2c = input_get_drvdata(dev); + int ret = 0; + + input_info(true, &wac_i2c->client->dev, "%s(%s)\n", __func__, + dev->name); + + wac_i2c->pdata->enabled = true; + +#if WACOM_SEC_FACTORY + if (wac_i2c->epen_blocked){ + input_err(true, &wac_i2c->client->dev, "%s : FAC epen_blocked SKIP!!\n", __func__); + return ret; + } +#else + if (wac_i2c->epen_blocked){ + input_err(true, &wac_i2c->client->dev, "%s : epen_blocked. disable mode \n", __func__); + wacom_disable_mode(wac_i2c, WACOM_DISABLE); + return ret; + } +#endif + + wacom_wakeup_sequence(wac_i2c); + + return ret; +} + +static void wacom_i2c_input_close(struct input_dev *dev) +{ + struct wacom_i2c *wac_i2c = input_get_drvdata(dev); + + input_info(true, &wac_i2c->client->dev, "%s(%s)\n", __func__, + dev->name); + + if (!wac_i2c->probe_done) { + input_err(true, &wac_i2c->client->dev, "%s : not probe done & skip!\n", __func__); + return; + } + + wac_i2c->pdata->enabled = false; + +#if WACOM_SEC_FACTORY + if (wac_i2c->epen_blocked){ + input_err(true, &wac_i2c->client->dev, "%s : FAC epen_blocked SKIP!!\n", __func__); + return; + } +#else + if (wac_i2c->epen_blocked){ + input_err(true, &wac_i2c->client->dev, "%s : epen_blocked. disable mode \n", __func__); + wacom_disable_mode(wac_i2c, WACOM_DISABLE); + return; + } +#endif + + wacom_sleep_sequence(wac_i2c); +} + +static void wacom_i2c_set_input_values(struct wacom_i2c *wac_i2c, + struct input_dev *input_dev) +{ + struct i2c_client *client = wac_i2c->client; + struct wacom_g5_platform_data *pdata = wac_i2c->pdata; + /* Set input values before registering input device */ + + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + input_dev->open = wacom_i2c_input_open; + input_dev->close = wacom_i2c_input_close; + + input_set_abs_params(input_dev, ABS_PRESSURE, 0, pdata->max_pressure, 0, 0); + input_set_abs_params(input_dev, ABS_DISTANCE, 0, pdata->max_height, 0, 0); + input_set_abs_params(input_dev, ABS_TILT_X, -pdata->max_x_tilt, pdata->max_x_tilt, 0, 0); + input_set_abs_params(input_dev, ABS_TILT_Y, -pdata->max_y_tilt, pdata->max_y_tilt, 0, 0); + + if (pdata->xy_switch) { + input_set_abs_params(input_dev, ABS_X, 0, pdata->max_y, 4, 0); + input_set_abs_params(input_dev, ABS_Y, 0, pdata->max_x, 4, 0); + } else { + input_set_abs_params(input_dev, ABS_X, 0, pdata->max_x, 4, 0); + input_set_abs_params(input_dev, ABS_Y, 0, pdata->max_y, 4, 0); + } + + input_set_capability(input_dev, EV_KEY, BTN_TOOL_PEN); + input_set_capability(input_dev, EV_KEY, BTN_TOOL_RUBBER); + input_set_capability(input_dev, EV_KEY, BTN_TOUCH); + input_set_capability(input_dev, EV_KEY, BTN_STYLUS); + + input_set_capability(input_dev, EV_SW, SW_PEN_INSERT); + + /* AOP */ + input_set_capability(input_dev, EV_KEY, KEY_WAKEUP_UNLOCK); + input_set_capability(input_dev, EV_KEY, KEY_HOMEPAGE); + + /* flip cover */ + input_set_capability(input_dev, EV_SW, SW_FLIP); + + input_set_drvdata(input_dev, wac_i2c); +} + +void wacom_print_info(struct wacom_i2c *wac_i2c) +{ + if (!wac_i2c) + return; + + if (!wac_i2c->client) + return; + + wac_i2c->print_info_cnt_open++; + + if (wac_i2c->print_info_cnt_open > 0xfff0) + wac_i2c->print_info_cnt_open = 0; + if (wac_i2c->scan_info_fail_cnt > 1000) + wac_i2c->scan_info_fail_cnt = 1000; + + input_info(true, &wac_i2c->client->dev, + "%s: ps %s, pen %s, report_scan_seq %d, epen %s, count(%u,%u,%u), " + "mode(%d), block_cnt(%d), check(%d), test(%d,%d), ver[%02X%02X%02X%02X], cover(%d,%d) #%d\n", + __func__, wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_result & EPEN_EVENT_PEN_OUT) ? "out" : "in", + wac_i2c->report_scan_seq, wac_i2c->epen_blocked ? "blocked" : "unblocked", + wac_i2c->i2c_fail_count, wac_i2c->abnormal_reset_count, wac_i2c->scan_info_fail_cnt, + wac_i2c->check_survey_mode, wac_i2c->tsp_block_cnt, wac_i2c->check_elec, + wac_i2c->connection_check, wac_i2c->garage_connection_check, + wac_i2c->pdata->img_version_of_ic[0], wac_i2c->pdata->img_version_of_ic[1], + wac_i2c->pdata->img_version_of_ic[2], wac_i2c->pdata->img_version_of_ic[3], + wac_i2c->cover, wac_i2c->flip_state, wac_i2c->print_info_cnt_open); +} + +static void wacom_print_info_work(struct work_struct *work) +{ + struct wacom_i2c *wac_i2c = container_of(work, struct wacom_i2c, work_print_info.work); + + wacom_print_info(wac_i2c); + schedule_delayed_work(&wac_i2c->work_print_info, msecs_to_jiffies(30000)); // 30s +} + +int load_fw_built_in(struct wacom_i2c *wac_i2c, int fw_index) +{ + int ret; + const char *fw_load_path = NULL; +#if WACOM_SEC_FACTORY + int index = 0; +#endif + + input_info(true, &wac_i2c->client->dev, "%s: load_fw_built_in (%d)\n", __func__, fw_index); + + fw_load_path = wac_i2c->pdata->fw_path; + +#if WACOM_SEC_FACTORY + if (fw_index != FW_BUILT_IN) { + if (fw_index == FW_FACTORY_GARAGE) + index = 0; + else if (fw_index == FW_FACTORY_UNIT) + index = 1; + + ret = of_property_read_string_index(wac_i2c->client->dev.of_node, + "wacom,fw_fac_path", index, &wac_i2c->pdata->fw_fac_path); + if (ret) { + input_err(true, &wac_i2c->client->dev, "%s: failed to read fw_fac_path %d\n", __func__, ret); + wac_i2c->pdata->fw_fac_path = NULL; + } + + fw_load_path = wac_i2c->pdata->fw_fac_path; + + input_info(true, &wac_i2c->client->dev, "%s: load %s firmware\n", + __func__, fw_load_path); + } +#endif + + if (fw_load_path == NULL) { + input_err(true, &wac_i2c->client->dev, + "%s: Unable to open firmware. fw_path is NULL\n", __func__); + return -EINVAL; + } + + ret = request_firmware(&wac_i2c->firm_data, fw_load_path, &wac_i2c->client->dev); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "Unable to open firmware. ret %d\n", ret); + return ret; + } + + wac_i2c->fw_img = (struct fw_image *)wac_i2c->firm_data->data; + + return ret; +} + +static int wacom_i2c_get_fw_size(struct wacom_i2c *wac_i2c) +{ + u32 fw_size = 0; + + if (wac_i2c->pdata->img_version_of_ic[0] == MPU_W9020) + fw_size = 144 * 1024; + else if (wac_i2c->pdata->img_version_of_ic[0] == MPU_W9021) + fw_size = 256 * 1024; + else if (wac_i2c->pdata->img_version_of_ic[0] == MPU_WEZ01) + fw_size = 256 * 1024; + else + fw_size = 128 * 1024; + + input_info(true, &wac_i2c->client->dev, "%s: type[%d] size[0x%X]\n", + __func__, wac_i2c->pdata->img_version_of_ic[0], fw_size); + + return fw_size; +} + +static int load_fw_sdcard(struct wacom_i2c *wac_i2c, u8 fw_index, const char *file_path) +{ + struct i2c_client *client = wac_i2c->client; + long fsize; + int ret = 0; + unsigned int nSize; + unsigned long nSize2; +#ifdef SUPPORT_FW_SIGNED + long spu_ret; +#endif + + nSize = wacom_i2c_get_fw_size(wac_i2c); + nSize2 = nSize + sizeof(struct fw_image); + + ret = request_firmware(&wac_i2c->firm_data, file_path, &wac_i2c->client->dev); + if (ret) { + input_err(true, &client->dev, "firmware is not available %d.\n", ret); + ret = -ENOENT; + return ret; + } + + fsize = wac_i2c->firm_data->size; + input_info(true, &client->dev, "start, file path %s, size %ld Bytes\n", file_path, fsize); + +#ifdef SUPPORT_FW_SIGNED + if (fw_index == FW_IN_SDCARD_SIGNED || fw_index == FW_SPU || fw_index == FW_VERIFICATION) { + /* name 5, digest 32, signature 512 */ + fsize -= SPU_METADATA_SIZE(WACOM); + } +#endif + + if ((fsize != nSize) && (fsize != nSize2)) { + input_err(true, &client->dev, "%s: UMS firmware size is different\n", __func__); + ret = -EFBIG; + goto out; + } + +#ifdef SUPPORT_FW_SIGNED + if (fw_index == FW_IN_SDCARD_SIGNED || fw_index == FW_SPU || fw_index == FW_VERIFICATION) { + /* name 5, digest 32, signature 512 */ + + spu_ret = spu_firmware_signature_verify("WACOM", wac_i2c->firm_data->data, wac_i2c->firm_data->size); + + input_info(true, &client->dev, "%s: spu_ret : %ld, spu_fsize : %ld // fsize:%ld\n", + __func__, spu_ret, wac_i2c->firm_data->size, fsize); + + if (spu_ret != fsize) { + input_err(true, &client->dev, "%s: signature verify failed, %ld\n", __func__, spu_ret); + ret = -ENOENT; + goto out; + } + } +#endif + + wac_i2c->fw_img = (struct fw_image *)wac_i2c->firm_data->data; + return 0; + +out: + return ret; +} + +int wacom_i2c_load_fw(struct wacom_i2c *wac_i2c, u8 fw_update_way) +{ + int ret = 0; + struct fw_image *fw_img; + struct i2c_client *client = wac_i2c->client; + + switch (fw_update_way) { + case FW_BUILT_IN: +#if WACOM_SEC_FACTORY + case FW_FACTORY_GARAGE: + case FW_FACTORY_UNIT: +#endif + ret = load_fw_built_in(wac_i2c, fw_update_way); + break; + case FW_IN_SDCARD: + ret = load_fw_sdcard(wac_i2c, fw_update_way, WACOM_PATH_EXTERNAL_FW); + break; + case FW_IN_SDCARD_SIGNED: + ret = load_fw_sdcard(wac_i2c, fw_update_way, WACOM_PATH_EXTERNAL_FW_SIGNED); + break; + case FW_SPU: + case FW_VERIFICATION: + ret = load_fw_sdcard(wac_i2c, fw_update_way, WACOM_PATH_SPU_FW_SIGNED); + break; + default: + input_info(true, &client->dev, "unknown path(%d)\n", fw_update_way); + goto err_load_fw; + } + + if (ret < 0) + goto err_load_fw; + + fw_img = wac_i2c->fw_img; + + /* header check */ + if (fw_img->hdr_ver == 1 && fw_img->hdr_len == sizeof(struct fw_image)) { + wac_i2c->fw_data = (u8 *) fw_img->data; +#if WACOM_SEC_FACTORY + if ((fw_update_way == FW_BUILT_IN) || + (fw_update_way == FW_FACTORY_UNIT) || (fw_update_way == FW_FACTORY_GARAGE)) { +#else + if (fw_update_way == FW_BUILT_IN) { +#endif + wac_i2c->pdata->img_version_of_bin[0] = (fw_img->fw_ver1 >> 8) & 0xFF; + wac_i2c->pdata->img_version_of_bin[1] = fw_img->fw_ver1 & 0xFF; + wac_i2c->pdata->img_version_of_bin[2] = (fw_img->fw_ver2 >> 8) & 0xFF; + wac_i2c->pdata->img_version_of_bin[3] = fw_img->fw_ver2 & 0xFF; + memcpy(wac_i2c->fw_chksum, fw_img->checksum, 5); + } else if (fw_update_way == FW_SPU || fw_update_way == FW_VERIFICATION) { + wac_i2c->pdata->img_version_of_spu[0] = (fw_img->fw_ver1 >> 8) & 0xFF; + wac_i2c->pdata->img_version_of_spu[1] = fw_img->fw_ver1 & 0xFF; + wac_i2c->pdata->img_version_of_spu[2] = (fw_img->fw_ver2 >> 8) & 0xFF; + wac_i2c->pdata->img_version_of_spu[3] = fw_img->fw_ver2 & 0xFF; + memcpy(wac_i2c->fw_chksum, fw_img->checksum, 5); + } + } else { + input_err(true, &client->dev, "%s: no hdr\n", __func__); + wac_i2c->fw_data = (u8 *) fw_img; + } + + return ret; + +err_load_fw: + wac_i2c->fw_data = NULL; + return ret; +} + +void wacom_i2c_unload_fw(struct wacom_i2c *wac_i2c) +{ + switch (wac_i2c->fw_update_way) { + case FW_BUILT_IN: +#if WACOM_SEC_FACTORY + case FW_FACTORY_GARAGE: + case FW_FACTORY_UNIT: +#endif + release_firmware(wac_i2c->firm_data); + break; + case FW_IN_SDCARD: + case FW_IN_SDCARD_SIGNED: + case FW_SPU: + case FW_VERIFICATION: + release_firmware(wac_i2c->firm_data); + break; + default: + break; + } + + wac_i2c->fw_img = NULL; + wac_i2c->fw_update_way = FW_NONE; + wac_i2c->firm_data = NULL; + wac_i2c->fw_data = NULL; +} + +int wacom_fw_update_on_hidden_menu(struct wacom_i2c *wac_i2c, u8 fw_update_way) +{ + struct i2c_client *client = wac_i2c->client; + int ret; + int retry = 3; + int i; + + input_info(true, &client->dev, "%s: update:%d\n", __func__, fw_update_way); + + if (wac_i2c->wacom_fw_ws->active) { + input_info(true, &client->dev, "%s: update is already running. pass\n", __func__); + return 0; + } + + mutex_lock(&wac_i2c->update_lock); + wacom_enable_irq(wac_i2c, false); + + /* release pen, if it is pressed */ + if (wac_i2c->pen_pressed || wac_i2c->side_pressed || wac_i2c->pen_prox) + wacom_forced_release(wac_i2c); + + if (wac_i2c->is_tsp_block) + forced_release_fullscan(wac_i2c); + + ret = wacom_i2c_load_fw(wac_i2c, fw_update_way); + if (ret < 0) { + input_info(true, &client->dev, "failed to load fw data %d\n", ret); + wac_i2c->update_status = FW_UPDATE_FAIL; + goto err_update_load_fw; + } + wac_i2c->fw_update_way = fw_update_way; + + /* firmware info */ + if (fw_update_way == FW_SPU || fw_update_way == FW_VERIFICATION) + input_info(true, &client->dev, "ic fw ver : %02X%02X%02X%02X new fw ver : %02X%02X%02X%02X\n", + wac_i2c->pdata->img_version_of_ic[0], wac_i2c->pdata->img_version_of_ic[1], + wac_i2c->pdata->img_version_of_ic[2], wac_i2c->pdata->img_version_of_ic[3], + wac_i2c->pdata->img_version_of_spu[0], wac_i2c->pdata->img_version_of_spu[1], + wac_i2c->pdata->img_version_of_spu[2], wac_i2c->pdata->img_version_of_spu[3]); + else + input_info(true, &client->dev, "ic fw ver : %02X%02X%02X%02X new fw ver : %02X%02X%02X%02X\n", + wac_i2c->pdata->img_version_of_ic[0], wac_i2c->pdata->img_version_of_ic[1], + wac_i2c->pdata->img_version_of_ic[2], wac_i2c->pdata->img_version_of_ic[3], + wac_i2c->pdata->img_version_of_bin[0], wac_i2c->pdata->img_version_of_bin[1], + wac_i2c->pdata->img_version_of_bin[2], wac_i2c->pdata->img_version_of_bin[3]); + + // have to check it later + if (wac_i2c->fw_update_way == FW_BUILT_IN && wac_i2c->pdata->bringup == 1) { + input_info(true, &client->dev, "%s: bringup #1. do not update\n", __func__); + wac_i2c->update_status = FW_UPDATE_FAIL; + goto out_update_fw; + } + + /* If FFU firmware version is lower than IC's version, do not run update routine */ + if (fw_update_way == FW_SPU && (wac_i2c->pdata->img_version_of_ic[0] == wac_i2c->pdata->img_version_of_spu[0] && + wac_i2c->pdata->img_version_of_ic[1] == wac_i2c->pdata->img_version_of_spu[1] && + wac_i2c->pdata->img_version_of_ic[2] == wac_i2c->pdata->img_version_of_spu[2] && + wac_i2c->pdata->img_version_of_ic[3] >= wac_i2c->pdata->img_version_of_spu[3])) { + input_info(true, &client->dev, "%s: FFU. update is skipped\n", __func__); + wac_i2c->update_status = FW_UPDATE_PASS; + + wacom_i2c_unload_fw(wac_i2c); + wacom_enable_irq(wac_i2c, true); + mutex_unlock(&wac_i2c->update_lock); + return 0; + } else if (fw_update_way == FW_VERIFICATION) { + input_info(true, &client->dev, "%s: SPU verified. update is skipped\n", __func__); + wac_i2c->update_status = FW_UPDATE_PASS; + + wacom_i2c_unload_fw(wac_i2c); + wacom_enable_irq(wac_i2c, true); + mutex_unlock(&wac_i2c->update_lock); + return 0; + } + + wac_i2c->update_status = FW_UPDATE_RUNNING; + + while (retry--) { + ret = wacom_i2c_flash(wac_i2c); + if (ret) { + input_info(true, &client->dev, "failed to flash fw(%d) %d\n", ret, retry); + continue; + } + break; + } + + retry = 3; + while (retry--) { + ret = wacom_i2c_query(wac_i2c); + if (ret < 0) { + input_info(true, &client->dev, "%s : failed to query to IC(%d) & reset, %d\n", + __func__, ret, retry); + wacom_compulsory_flash_mode(wac_i2c, false); + wacom_reset_hw(wac_i2c); + continue; + } + break; + } + + if (ret) { + wac_i2c->update_status = FW_UPDATE_FAIL; + for (i = 0; i < 4; i++) + wac_i2c->pdata->img_version_of_ic[i] = 0; + goto out_update_fw; + } + + wac_i2c->update_status = FW_UPDATE_PASS; + +#if WACOM_SEC_FACTORY + ret = wacom_check_ub(wac_i2c->client); + if (ret < 0) { + wacom_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_GARAGE_AOP); + input_info(true, &client->dev, "%s: Change mode for garage scan\n", __func__); + } +#endif + + wacom_i2c_unload_fw(wac_i2c); + wacom_enable_irq(wac_i2c, true); + mutex_unlock(&wac_i2c->update_lock); + + return 0; + +out_update_fw: + wacom_i2c_unload_fw(wac_i2c); +err_update_load_fw: + wacom_enable_irq(wac_i2c, true); + mutex_unlock(&wac_i2c->update_lock); + +#if WACOM_SEC_FACTORY + ret = wacom_check_ub(wac_i2c->client); + if (ret < 0) { + wacom_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_GARAGE_AOP); + input_info(true, &client->dev, "%s: Change mode for garage scan\n", __func__); + } +#endif + + return -1; +} + +int wacom_fw_update_on_probe(struct wacom_i2c *wac_i2c) +{ + struct i2c_client *client = wac_i2c->client; + int ret, i; + int retry = 3; + bool bforced = false; + + input_info(true, &client->dev, "%s\n", __func__); + + if (wac_i2c->pdata->bringup == 1) { + input_info(true, &client->dev, "%s: bringup #1. do not update\n", __func__); + for (i = 0; i < 4; i++) + wac_i2c->pdata->img_version_of_bin[i] = 0; + goto skip_update_fw; + } + + ret = wacom_i2c_load_fw(wac_i2c, FW_BUILT_IN); + if (ret < 0) { + input_info(true, &client->dev, "%s: failed to load fw data\n", __func__); + goto err_update_load_fw; + } + + if ((wac_i2c->pdata->img_version_of_ic[0] != 0) && wac_i2c->query_status && + (wac_i2c->pdata->img_version_of_ic[0] != wac_i2c->pdata->img_version_of_bin[0])) { + input_err(true, &client->dev, "%s: MPU ver is not matched. unload driver. ic:%02X, bin:%02X\n", + __func__, wac_i2c->pdata->img_version_of_ic[0], wac_i2c->pdata->img_version_of_bin[0]); + goto err_update_fw; + } + + if (wac_i2c->pdata->bringup == 2) { + input_info(true, &client->dev, "%s: bringup #2. do not update\n", __func__); + goto out_update_fw; + } + + wac_i2c->fw_update_way = FW_BUILT_IN; + + /* firmware info */ + input_info(true, &client->dev, "ic fw ver : %02X%02X%02X%02X new fw ver : %02X%02X%02X%02X\n", + wac_i2c->pdata->img_version_of_ic[0], wac_i2c->pdata->img_version_of_ic[1], + wac_i2c->pdata->img_version_of_ic[2], wac_i2c->pdata->img_version_of_ic[3], + wac_i2c->pdata->img_version_of_bin[0], wac_i2c->pdata->img_version_of_bin[1], + wac_i2c->pdata->img_version_of_bin[2], wac_i2c->pdata->img_version_of_bin[3]); + + if (wac_i2c->pdata->bringup == 3) { + input_info(true, &client->dev, "%s: bringup #3. force update\n", __func__); + bforced = true; + } + + if (bforced) { + for (i = 0; i < 4; i++) { + if (wac_i2c->pdata->img_version_of_ic[i] != wac_i2c->pdata->img_version_of_bin[i]) + input_info(true, &client->dev, "force update : not equal, update fw (0x%x, 0x%x)\n", + wac_i2c->pdata->img_version_of_ic[i], wac_i2c->pdata->img_version_of_bin[i]); + goto fw_update; + } + input_info(true, &client->dev, "%s: force update : equal, skip update fw\n", __func__); + goto out_update_fw; + } else { + if (wac_i2c->pdata->img_version_of_ic[2] == 0 && wac_i2c->pdata->img_version_of_ic[3] == 0) { + input_info(true, &client->dev, "%s: fw is not written in ic. force update\n", __func__); + goto fw_update; + } + for (i = 0; i < 2; i++) { + if (wac_i2c->pdata->img_version_of_ic[i] != wac_i2c->pdata->img_version_of_bin[i]) { + input_err(true, &wac_i2c->client->dev, "%s: do not matched version info\n", __func__); + goto out_update_fw; + } + } + + if ((wac_i2c->pdata->img_version_of_ic[2] >> 4) == WACOM_FIRMWARE_VERSION_UNIT) { + input_err(true, &wac_i2c->client->dev, "%s: assy fw. force update\n", __func__); + goto fw_update; + } else if ((wac_i2c->pdata->img_version_of_ic[2] >> 4) == WACOM_FIRMWARE_VERSION_SET) { + if ((wac_i2c->pdata->img_version_of_ic[2] & 0x0F) != (wac_i2c->pdata->img_version_of_bin[2] & 0x0F)) { + input_err(true, &wac_i2c->client->dev, "%s: HW ID is different. force update\n", __func__); + goto fw_update; + } else { + if (wac_i2c->pdata->img_version_of_ic[3] == wac_i2c->pdata->img_version_of_bin[3]) { + ret = wacom_checksum(wac_i2c); + if (ret) { + input_info(true, &client->dev, "%s: crc ok, do not update fw\n", __func__); + goto out_update_fw; + } + input_info(true, &client->dev, "%s: crc err, do update\n", __func__); + + } else if (wac_i2c->pdata->img_version_of_ic[3] >= wac_i2c->pdata->img_version_of_bin[3]) { + input_info(true, &client->dev, "%s: ic version is high, do not update fw\n", __func__); + goto out_update_fw; + } + } + } else if ((wac_i2c->pdata->img_version_of_ic[2] >> 4) == WACOM_FIRMWARE_VERSION_TEST) { + input_info(true, &client->dev, "%s: test fw\n", __func__); + if (wac_i2c->pdata->img_version_of_ic[3] == wac_i2c->pdata->img_version_of_bin[3]) { + input_info(true, &client->dev, "%s: fw ver is same, do not update fw\n", __func__); + goto out_update_fw; + } + } + } + +fw_update: + while (retry--) { + ret = wacom_i2c_flash(wac_i2c); + if (ret) { + input_info(true, &client->dev, "failed to flash fw(%d) %d\n", ret, retry); + if (!wac_i2c->bl_mpu_match) + goto err_update_fw; + else + continue; + } + break; + } + + retry = 3; + while (retry--) { + ret = wacom_i2c_query(wac_i2c); + if (ret) { + input_info(true, &client->dev, "%s : failed to query to IC(%d) & reset, %d\n", + __func__, ret, retry); + wacom_compulsory_flash_mode(wac_i2c, false); + wacom_reset_hw(wac_i2c); + continue; + } + break; + } + if (ret) { + for (i = 0; i < 4; i++) + wac_i2c->pdata->img_version_of_ic[i] = 0; + goto err_update_fw; + } + +out_update_fw: + wacom_i2c_unload_fw(wac_i2c); +skip_update_fw: + +#if WACOM_SEC_FACTORY + ret = wacom_check_ub(wac_i2c->client); + if (ret < 0) { + wacom_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_GARAGE_AOP); + input_info(true, &client->dev, "%s: Change mode for garage scan\n", __func__); + } +#endif + + return 0; + +err_update_fw: + wacom_i2c_unload_fw(wac_i2c); +err_update_load_fw: + +#if WACOM_SEC_FACTORY + ret = wacom_check_ub(wac_i2c->client); + if (ret < 0) { + wacom_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_GARAGE_AOP); + input_info(true, &client->dev, "%s: Change mode for garage scan\n", __func__); + } +#endif + + return -1; +} + +/* epen_disable_mode + * 0 : wacom ic on + * 1 : wacom ic off + */ +void wacom_disable_mode(struct wacom_i2c *wac_i2c, wacom_disable_mode_t mode) +{ + struct i2c_client *client = wac_i2c->client; + + if (wac_i2c->epen_blocked == mode){ + input_info(true, &client->dev, "%s: duplicate call %d!\n", __func__, mode); + return; + } + + if (mode == WACOM_DISABLE) { + input_info(true, &client->dev, "%s: power off\n", __func__); + wac_i2c->epen_blocked = mode; + + wacom_enable_irq(wac_i2c, false); + wacom_power(wac_i2c, false); + + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + wac_i2c->tsp_scan_mode = sec_input_notify(&wac_i2c->nb, NOTIFIER_TSP_BLOCKING_RELEASE, NULL); + wac_i2c->is_tsp_block = false; +#endif + wacom_forced_release(wac_i2c); + } else if (mode == WACOM_ENABLE) { + input_info(true, &client->dev, "%s: power on\n", __func__); + + wacom_power(wac_i2c, true); + msleep(500); + + wacom_enable_irq(wac_i2c, true); + wac_i2c->epen_blocked = mode; + } + input_info(true, &client->dev, "%s: done %d!\n", __func__, mode); +} + +#if IS_ENABLED(CONFIG_MUIC_SUPPORT_KEYBOARDDOCK) +static void wac_i2c_kbd_work(struct work_struct *work) +{ + struct wacom_i2c *wac_i2c = container_of(work, struct wacom_i2c, kbd_work); + char data; + int ret; + + if (wac_i2c->kbd_conn_state == wac_i2c->kbd_cur_conn_state) { + input_info(true, &wac_i2c->client->dev, "%s: already %sconnected\n", + __func__, wac_i2c->kbd_conn_state ? "" : "dis"); + return; + } + + input_info(true, &wac_i2c->client->dev, "%s: %d\n", __func__, wac_i2c->kbd_conn_state); + + if (!wac_i2c->power_enable) { + input_err(true, &wac_i2c->client->dev, "%s: powered off\n", __func__); + return; + } + + if (wac_i2c->wacom_fw_ws->active) { + input_err(true, &wac_i2c->client->dev, "%s: fw update is running\n", __func__); + return; + } + + ret = wacom_start_stop_cmd(wac_i2c, WACOM_STOP_CMD); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to set stop cmd, %d\n", __func__, ret); + return; + } + + if (wac_i2c->kbd_conn_state) + data = COM_SPECIAL_COMPENSATION; + else + data = COM_NORMAL_COMPENSATION; + + ret = wacom_i2c_send(wac_i2c, &data, 1); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to send table swap cmd %d\n", __func__, ret); + } + msleep(30); + + ret = wacom_start_stop_cmd(wac_i2c, WACOM_STOP_AND_START_CMD); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to set stop-start cmd, %d\n", __func__, ret); + return; + } + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, wac_i2c->kbd_conn_state ? "on" : "off"); +} + +static int wacom_i2c_keyboard_notification_cb(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct wacom_i2c *wac_i2c = container_of(nb, struct wacom_i2c, kbd_nb); + int state = !!action; + + if (wac_i2c->kbd_conn_state == state) + goto out; + + cancel_work_sync(&wac_i2c->kbd_work); + wac_i2c->kbd_conn_state = state; + input_info(true, &wac_i2c->client->dev, "%s: current %d change to %d\n", + __func__, wac_i2c->kbd_cur_conn_state, state); + schedule_work(&wac_i2c->kbd_work); + +out: + return NOTIFY_DONE; +} +#endif + +void wacom_swap_compensation(struct wacom_i2c *wac_i2c, char cmd) +{ + char data; + int ret; + + input_info(true, &wac_i2c->client->dev, "%s: %d\n", __func__, cmd); + + if (!wac_i2c->power_enable) { + input_err(true, &wac_i2c->client->dev, + "%s: powered off\n", __func__); + return; + } + + if (wac_i2c->wacom_fw_ws->active) { + input_err(true, &wac_i2c->client->dev, + "%s: fw update is running\n", __func__); + return; + } + + data = COM_SAMPLERATE_STOP; + ret = wacom_i2c_send_sel(wac_i2c, &data, 1, WACOM_I2C_MODE_NORMAL); + if (ret != 1) { + input_err(true, &wac_i2c->client->dev, + "%s: failed to send stop cmd %d\n", + __func__, ret); + wac_i2c->reset_flag = true; + return; + } + wac_i2c->samplerate_state = false; + msleep(50); + + switch (cmd) { + case NOMAL_MODE: + data = COM_NORMAL_COMPENSATION; + break; + case BOOKCOVER_MODE: + data = COM_BOOKCOVER_COMPENSATION; + break; + case KBDCOVER_MODE: + data = COM_KBDCOVER_COMPENSATION; + break; + default: + input_err(true, &wac_i2c->client->dev, + "%s: get wrong cmd %d\n", + __func__, cmd); + } + + ret = wacom_i2c_send_sel(wac_i2c, &data, 1, WACOM_I2C_MODE_NORMAL); + if (ret != 1) { + input_err(true, &wac_i2c->client->dev, + "%s: failed to send table swap cmd %d\n", + __func__, ret); + wac_i2c->reset_flag = true; + return; + } + + data = COM_SAMPLERATE_STOP; + ret = wacom_i2c_send_sel(wac_i2c, &data, 1, WACOM_I2C_MODE_NORMAL); + if (ret != 1) { + input_err(true, &wac_i2c->client->dev, + "%s: failed to send stop cmd %d\n", + __func__, ret); + wac_i2c->reset_flag = true; + return; + } + + msleep(50); + + data = COM_SAMPLERATE_START; + ret = wacom_i2c_send_sel(wac_i2c, &data, 1, WACOM_I2C_MODE_NORMAL); + if (ret != 1) { + input_err(true, &wac_i2c->client->dev, + "%s: failed to send start cmd, %d\n", + __func__, ret); + wac_i2c->reset_flag = true; + return; + } + wac_i2c->samplerate_state = true; + + input_info(true, &wac_i2c->client->dev, "%s:send cover cmd %x\n", + __func__, cmd); + + return; +} + +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) +static void wacom_i2c_usb_typec_work(struct work_struct *work) +{ + struct wacom_i2c *wac_i2c = container_of(work, struct wacom_i2c, typec_work); + char data[5] = { 0 }; + int ret; + + if (wac_i2c->dp_connect_state == wac_i2c->dp_connect_cmd) + return; + + if (!wac_i2c->power_enable) { + input_err(true, &wac_i2c->client->dev, "%s: powered off now\n", __func__); + return; + } + + if (wac_i2c->wacom_fw_ws->active) { + input_err(true, &wac_i2c->client->dev, "%s: fw update is running\n", __func__); + return; + } + + ret = wacom_start_stop_cmd(wac_i2c, WACOM_STOP_CMD); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to set stop cmd, %d\n", __func__, ret); + return; + } + + if (wac_i2c->dp_connect_cmd) + data[0] = COM_SPECIAL_COMPENSATION; + else + data[0] = COM_NORMAL_COMPENSATION; + + ret = wacom_i2c_send(wac_i2c, &data[0], 1); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to send table swap cmd %d\n", __func__, ret); + return; + } + + ret = wacom_start_stop_cmd(wac_i2c, WACOM_STOP_AND_START_CMD); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, "%s: failed to set stop-start cmd, %d\n", __func__, ret); + return; + } + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, wac_i2c->dp_connect_cmd ? "on" : "off"); +} + +#if IS_ENABLED(CONFIG_PDIC_NOTIFIER) +static int wacom_i2c_usb_typec_notification_cb(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct wacom_i2c *wac_i2c = container_of(nb, struct wacom_i2c, typec_nb); + PD_NOTI_TYPEDEF usb_typec_info = *(PD_NOTI_TYPEDEF *)data; + + if (usb_typec_info.src != PDIC_NOTIFY_DEV_PDIC || + usb_typec_info.dest != PDIC_NOTIFY_DEV_DP || + usb_typec_info.id != PDIC_NOTIFY_ID_DP_CONNECT) + goto out; + + input_info(true, &wac_i2c->client->dev, "%s: %s (vid:0x%04X pid:0x%04X)\n", + __func__, usb_typec_info.sub1 ? "attached" : "detached", + usb_typec_info.sub2, usb_typec_info.sub3); + + switch (usb_typec_info.sub1) { + case PDIC_NOTIFY_ATTACH: + if (usb_typec_info.sub2 != 0x04E8 || usb_typec_info.sub3 != 0xA020) + goto out; + break; + case PDIC_NOTIFY_DETACH: + break; + default: + input_err(true, &wac_i2c->client->dev, "%s: invalid value %d\n", __func__, usb_typec_info.sub1); + goto out; + } + + cancel_work_sync(&wac_i2c->typec_work); + wac_i2c->dp_connect_cmd = usb_typec_info.sub1; + schedule_work(&wac_i2c->typec_work); +out: + return 0; +} +#else +static int wacom_i2c_usb_typec_notification_cb(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct wacom_i2c *wac_i2c = container_of(nb, struct wacom_i2c, typec_nb); + CC_NOTI_TYPEDEF usb_typec_info = *(CC_NOTI_TYPEDEF *)data; + + if (usb_typec_info.src != CCIC_NOTIFY_DEV_CCIC || + usb_typec_info.dest != CCIC_NOTIFY_DEV_DP || + usb_typec_info.id != CCIC_NOTIFY_ID_DP_CONNECT) + goto out; + + input_info(true, &wac_i2c->client->dev, "%s: %s (vid:0x%04X pid:0x%04X)\n", + __func__, usb_typec_info.sub1 ? "attached" : "detached", + usb_typec_info.sub2, usb_typec_info.sub3); + + switch (usb_typec_info.sub1) { + case CCIC_NOTIFY_ATTACH: + if (usb_typec_info.sub2 != 0x04E8 || usb_typec_info.sub3 != 0xA020) + goto out; + break; + case CCIC_NOTIFY_DETACH: + break; + default: + input_err(true, &wac_i2c->client->dev, "%s: invalid value %d\n", __func__, usb_typec_info.sub1); + goto out; + } + + //need to fix it (build error) + cancel_work(&wac_i2c->typec_work); + wac_i2c->dp_connect_cmd = usb_typec_info.sub1; + schedule_work(&wac_i2c->typec_work); +out: + return 0; +} +#endif +#endif + +static void wacom_i2c_nb_register_work(struct work_struct *work) +{ +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) || IS_ENABLED(CONFIG_MUIC_SUPPORT_KEYBOARDDOCK) + struct wacom_i2c *wac_i2c = container_of(work, struct wacom_i2c, + nb_reg_work.work); + u32 table_swap = wac_i2c->pdata->table_swap; + int ret; +#endif + u32 count = 0; + +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) + if (table_swap == TABLE_SWAP_DEX_STATION) + INIT_WORK(&wac_i2c->typec_work, wacom_i2c_usb_typec_work); +#endif +#if IS_ENABLED(CONFIG_MUIC_SUPPORT_KEYBOARDDOCK) + if (table_swap == TABLE_SWAP_KBD_COVER) + INIT_WORK(&wac_i2c->kbd_work, wac_i2c_kbd_work); +#endif + + do { +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) + if (table_swap == TABLE_SWAP_DEX_STATION) { + static bool manager_flag = false; + + if (!manager_flag) { +#if IS_ENABLED(CONFIG_PDIC_NOTIFIER) + ret = manager_notifier_register(&wac_i2c->typec_nb, + wacom_i2c_usb_typec_notification_cb, + MANAGER_NOTIFY_PDIC_WACOM); +#else + ret = manager_notifier_register(&wac_i2c->typec_nb, + wacom_i2c_usb_typec_notification_cb, + MANAGER_NOTIFY_CCIC_WACOM); +#endif + if (!ret) { + manager_flag = true; + input_info(true, &wac_i2c->client->dev, + "%s: typec notifier register success\n", + __func__); + break; + } + } + } +#endif +#if IS_ENABLED(CONFIG_MUIC_SUPPORT_KEYBOARDDOCK) + if (table_swap == TABLE_SWAP_KBD_COVER) { + static bool kbd_flag = false; + + if (!kbd_flag) { + ret = keyboard_notifier_register(&wac_i2c->kbd_nb, + wacom_i2c_keyboard_notification_cb, + KEYBOARD_NOTIFY_DEV_WACOM); + if (!ret) { + kbd_flag = true; + input_info(true, &wac_i2c->client->dev, + "%s: kbd notifier register success\n", + __func__); + break; + } + } + } +#endif + count++; + msleep(30); + } while (count < 100); +} + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) +static int wacom_notifier_call(struct notifier_block *n, unsigned long data, void *v) +{ + struct wacom_i2c *wac_i2c = container_of(n, struct wacom_i2c, nb); + + switch (data) { + case NOTIFIER_SECURE_TOUCH_ENABLE: + wacom_disable_mode(wac_i2c, WACOM_DISABLE); + break; + case NOTIFIER_SECURE_TOUCH_DISABLE: + wacom_disable_mode(wac_i2c, WACOM_ENABLE); + break; + default: + break; + } + + return 0; +} +#endif + +static int wacom_request_gpio(struct i2c_client *client, + struct wacom_g5_platform_data *pdata) +{ + int ret; + + ret = devm_gpio_request(&client->dev, pdata->irq_gpio, "wacom_irq"); + if (ret) { + input_err(true, &client->dev, "unable to request gpio for irq %d\n", ret); + return ret; + } + + ret = devm_gpio_request(&client->dev, pdata->fwe_gpio, "wacom_fwe"); + if (ret) { + input_err(true, &client->dev, "unable to request gpio for fwe %d\n", ret); + return ret; + } + + return 0; +} + +int wacom_check_ub(struct i2c_client *client) +{ + int lcdtype = 0; +#if IS_ENABLED(CONFIG_EXYNOS_DPU30) + int connected; +#endif + +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) + lcdtype = get_lcd_attached("GET"); + if (lcdtype == 0xFFFFFF) { + input_info(true, &client->dev, "%s: lcd is not attached\n", __func__); + return -ENODEV; + } +#endif + +#if IS_ENABLED(CONFIG_EXYNOS_DPU30) + connected = get_lcd_info("connected"); + if (connected < 0) { + input_info(true, &client->dev, "%s: Failed to get connection info\n", __func__); + return -ENODEV; + } + + if (!connected) { + input_info(true, &client->dev, "%s: lcd is not attached\n", __func__); + return -ENODEV; + } + + lcdtype = get_lcd_info("id"); + if (lcdtype < 0) { + input_info(true, &client->dev, "%s: Failed to get id info\n", __func__); + return -ENODEV; + } +#endif + input_info(true, &client->dev, "%s: lcdtype 0x%08x\n", __func__, lcdtype); + + return lcdtype; +} + +#if IS_ENABLED(CONFIG_OF) +static struct wacom_g5_platform_data *wacom_parse_dt(struct i2c_client *client) +{ + struct wacom_g5_platform_data *pdata; + struct device *dev = &client->dev; + struct device_node *np = dev->of_node; + u32 tmp[5] = { 0, }; + int ret; +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) + int count = 0; + int ii; + int lcdtype = 0; +#endif + + if (!np) + return ERR_PTR(-ENODEV); + + pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return ERR_PTR(-ENOMEM); + + pdata->irq_gpio = of_get_named_gpio(np, "wacom,irq-gpio", 0); + if (!gpio_is_valid(pdata->irq_gpio)) { + input_err(true, &client->dev, "%s: failed to get irq-gpio\n", __func__); + return ERR_PTR(-EINVAL); + } + + pdata->fwe_gpio = of_get_named_gpio(np, "wacom,fwe-gpio", 0); + if (!gpio_is_valid(pdata->fwe_gpio)) { + input_err(true, &client->dev, "%s: failed to get fwe-gpio\n", __func__); + return ERR_PTR(-EINVAL); + } + + /* get features */ + ret = of_property_read_u32(np, "wacom,boot_addr", tmp); + if (ret < 0) { + input_err(true, &client->dev, "failed to read boot address %d\n", ret); + return ERR_PTR(-EINVAL); + } + pdata->boot_addr = tmp[0]; + + ret = of_property_read_u32_array(np, "wacom,origin", pdata->origin, 2); + if (ret < 0) { + input_err(true, dev, "failed to read origin %d\n", ret); + return ERR_PTR(-EINVAL); + } + + pdata->use_dt_coord = of_property_read_bool(np, "wacom,use_dt_coord"); + + if (pdata->use_dt_coord) { + ret = of_property_read_u32_array(np, "wacom,max_coords", tmp, 2); + if (ret < 0) { + input_err(true, dev, "failed to read max coords %d\n", ret); + } else { + pdata->max_x = tmp[0]; + pdata->max_y = tmp[1]; + } + } + + ret = of_property_read_u32(np, "wacom,max_pressure", tmp); + if (ret != -EINVAL) { + if (ret) + input_err(true, dev, "failed to read max pressure %d\n", ret); + else + pdata->max_pressure = tmp[0]; + } + + ret = of_property_read_u32_array(np, "wacom,max_tilt", tmp, 2); + if (ret != -EINVAL) { + if (ret) { + input_err(true, dev, "failed to read max x tilt %d\n", ret); + } else { + pdata->max_x_tilt = tmp[0]; + pdata->max_y_tilt = tmp[1]; + } + } + + ret = of_property_read_u32(np, "wacom,max_height", tmp); + if (ret != -EINVAL) { + if (ret) + input_err(true, dev, "failed to read max height %d\n", ret); + else + pdata->max_height = tmp[0]; + } + + ret = of_property_read_u32_array(np, "wacom,invert", tmp, 3); + if (ret) { + input_err(true, &client->dev, + "failed to read inverts %d\n", ret); + return ERR_PTR(-EINVAL); + } + pdata->x_invert = tmp[0]; + pdata->y_invert = tmp[1]; + pdata->xy_switch = tmp[2]; + +#if IS_ENABLED(CONFIG_DISPLAY_SAMSUNG) + lcdtype = get_lcd_attached("GET"); + if (lcdtype == 0xFFFFFF) { + input_err(true, &client->dev, "%s: lcd is not attached\n", __func__); +#if !WACOM_SEC_FACTORY + return ERR_PTR(-ENODEV); +#endif + } + + input_info(true, &client->dev, "%s: lcdtype 0x%08X\n", __func__, lcdtype); + + count = of_property_count_strings(np, "wacom,fw_path"); + if (count <= 0) { + pdata->fw_path = NULL; + } else { + u8 lcd_id_num = of_property_count_u32_elems(np, "wacom,select_lcdid"); + + if ((lcd_id_num != count) || (lcd_id_num <= 0)) { + of_property_read_string_index(np, "wacom,fw_path", 0, &pdata->fw_path); + if (pdata->bringup == 4) + pdata->bringup = 3; + } else { + u32 lcd_id[10]; + + of_property_read_u32_array(np, "wacom,select_lcdid", lcd_id, lcd_id_num); + + for (ii = 0; ii < lcd_id_num; ii++) { + if (lcd_id[ii] == lcdtype) { + of_property_read_string_index(np, "wacom,fw_path", ii, &pdata->fw_path); + break; + } + } + if (!pdata->fw_path) + pdata->bringup = 1; + else if (strlen(pdata->fw_path) == 0) + pdata->bringup = 1; + } + } +#else + ret = of_property_read_string(np, "wacom,fw_path", &pdata->fw_path); + if (ret) { + input_err(true, &client->dev, "failed to read fw_path %d\n", ret); + } +#endif + + ret = of_property_read_u32(np, "wacom,module_ver", &pdata->module_ver); + if (ret) { + input_err(true, &client->dev, "failed to read module_ver %d\n", ret); + /* default setting to open test */ + pdata->module_ver = 1; + } + + ret = of_property_read_u32(np, "wacom,support_garage_open_test", &pdata->support_garage_open_test); + if (ret) { + input_err(true, &client->dev, "failed to read support_garage_open_test %d\n", ret); + pdata->support_garage_open_test = 0; + } + + ret = of_property_read_u32(np, "wacom,table_swap", &pdata->table_swap); + if (ret) { + input_err(true, &client->dev, "failed to read table_swap %d\n", ret); + pdata->table_swap = 0; + } + + pdata->avdd = regulator_get(dev, "wacom_avdd"); + if (IS_ERR_OR_NULL(pdata->avdd)) { + input_err(true, &client->dev, "%s: Failed to get wacom avdd regulator.\n", + __func__); + return ERR_PTR(-ENODEV); + } + + pdata->regulator_boot_on = of_property_read_bool(np, "wacom,regulator_boot_on"); + + ret = of_property_read_u32(np, "wacom,bringup", &pdata->bringup); + if (ret) { + input_err(true, &client->dev, "failed to read bringup %d\n", ret); + /* default setting to open test */ + pdata->bringup = 0; + } + + pdata->support_cover_noti = of_property_read_bool(np, "wacom,support_cover_noti"); + pdata->support_cover_detection = of_property_read_bool(np, "wacom,support_cover_detection"); + + input_info(true, &client->dev, + "boot_addr: 0x%X, origin: (%d,%d), max_coords: (%d,%d), " + "max_pressure: %d, max_height: %d, max_tilt: (%d,%d) " + "invert: (%d,%d,%d), fw_path: %s, " + "module_ver:%d, table_swap:%d%s%s, cover_noti:%d," + "cover_detect:%d\n", + pdata->boot_addr, pdata->origin[0], pdata->origin[1], + pdata->max_x, pdata->max_y, pdata->max_pressure, + pdata->max_height, pdata->max_x_tilt, pdata->max_y_tilt, + pdata->x_invert, pdata->y_invert, pdata->xy_switch, + pdata->fw_path, pdata->module_ver, pdata->table_swap, + pdata->support_garage_open_test ? ", support garage open test" : "", + pdata->regulator_boot_on ? ", boot on" : "", + pdata->support_cover_noti, pdata->support_cover_detection); + + return pdata; +} +#else +static struct wacom_g5_platform_data *wacom_parse_dt(struct i2c_client *client) +{ + input_err(true, &client->dev, "%s: no platform data specified\n", __func__); + return ERR_PTR(-EINVAL); +} +#endif + +static int wacom_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct wacom_g5_platform_data *pdata = dev_get_platdata(&client->dev); + struct wacom_i2c *wac_i2c; + struct input_dev *input; + int ret = 0; + + pr_info("%s: %s: start!\n", SECLOG, __func__); + + ret = i2c_check_functionality(client->adapter, I2C_FUNC_I2C); + if (!ret) { + input_err(true, &client->dev, "%s: I2C functionality not supported\n", __func__); + return -EIO; + } + + wac_i2c = devm_kzalloc(&client->dev, sizeof(*wac_i2c), GFP_KERNEL); + if (!wac_i2c) + return -ENOMEM; + + if (!pdata) { + pdata = wacom_parse_dt(client); + if (IS_ERR(pdata)) { + input_err(true, &client->dev, "%s: failed to parse dt\n", __func__); + return PTR_ERR(pdata); + } + } + + ret = wacom_request_gpio(client, pdata); + if (ret) { + input_err(true, &client->dev, "failed to request gpio %d\n", ret); + return ret; + } + + /* using managed input device */ + input = devm_input_allocate_device(&client->dev); + if (!input) { + input_err(true, &client->dev, "%s: failed to allocate input device\n", __func__); + return -ENOMEM; + } + + /* using 2 slave address. one is normal mode, another is boot mode for + * fw update. + */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)) + wac_i2c->client_boot = i2c_new_dummy_device(client->adapter, pdata->boot_addr); +#else + wac_i2c->client_boot = i2c_new_dummy(client->adapter, pdata->boot_addr); +#endif + + if (IS_ERR_OR_NULL(wac_i2c->client_boot)) { + input_err(true, &client->dev, "failed to register sub client[0x%x]\n", pdata->boot_addr); + return -ENOMEM; + } + + wac_i2c->client = client; + wac_i2c->pdata = pdata; + wac_i2c->input_dev = input; + wac_i2c->irq = gpio_to_irq(pdata->irq_gpio); + wac_i2c->fw_img = NULL; + wac_i2c->fw_update_way = FW_NONE; +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + wac_i2c->tsp_scan_mode = DISABLE_TSP_SCAN_BLCOK; +#endif + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + wac_i2c->function_result = EPEN_EVENT_PEN_OUT; + /* Consider about factory, it may be need to as default 1 */ +#if WACOM_SEC_FACTORY + wac_i2c->battery_saving_mode = true; +#else + wac_i2c->battery_saving_mode = false; +#endif + wac_i2c->reset_flag = false; + wac_i2c->pm_suspend = false; + wac_i2c->samplerate_state = true; + wac_i2c->update_status = FW_UPDATE_PASS; + + /*Set client data */ + i2c_set_clientdata(client, wac_i2c); + i2c_set_clientdata(wac_i2c->client_boot, wac_i2c); + + init_completion(&wac_i2c->i2c_done); + complete_all(&wac_i2c->i2c_done); + init_completion(&wac_i2c->resume_done); + complete_all(&wac_i2c->resume_done); + + /* Power on */ + if (gpio_get_value(pdata->fwe_gpio) == 1) { + input_info(true, &client->dev, "%s: fwe gpio is high, change low and reset device\n", __func__); + wacom_compulsory_flash_mode(wac_i2c, false); + wacom_reset_hw(wac_i2c); + msleep(200); + } else { + wacom_compulsory_flash_mode(wac_i2c, false); + wacom_power(wac_i2c, true); + if (!wac_i2c->pdata->regulator_boot_on) + msleep(200); + } + + wac_i2c->screen_on = true; + + input->name = "sec_e-pen"; + + wacom_i2c_query(wac_i2c); + + /*Initializing for semaphor */ + mutex_init(&wac_i2c->i2c_mutex); + mutex_init(&wac_i2c->lock); + mutex_init(&wac_i2c->update_lock); + mutex_init(&wac_i2c->irq_lock); + mutex_init(&wac_i2c->mode_lock); + mutex_init(&wac_i2c->ble_lock); + mutex_init(&wac_i2c->ble_charge_mode_lock); + + wac_i2c->wacom_fw_ws = wakeup_source_register(&wac_i2c->client->dev, "wacom"); + wac_i2c->wacom_ws = wakeup_source_register(&wac_i2c->client->dev, "wacom_wakelock"); + + INIT_DELAYED_WORK(&wac_i2c->work_print_info, wacom_print_info_work); + + ret = wacom_fw_update_on_probe(wac_i2c); + if (ret) + goto err_register_input_dev; + + wacom_i2c_set_input_values(wac_i2c, input); + + ret = input_register_device(input); + if (ret) { + input_err(true, &client->dev, "failed to register input device %d\n", ret); + /* managed input devices need not be explicitly unregistred or freed. */ + goto err_register_input_dev; + + } + + /*Request IRQ */ + ret = devm_request_threaded_irq(&client->dev, wac_i2c->irq, NULL, wacom_interrupt, + IRQF_ONESHOT | IRQF_TRIGGER_LOW, "sec_epen_irq", wac_i2c); + if (ret < 0) { + input_err(true, &client->dev, "failed to request irq(%d) - %d\n", wac_i2c->irq, ret); + goto err_request_irq; + } + input_info(true, &client->dev, "init irq %d\n", wac_i2c->irq); + + probe_open_test(wac_i2c); + + ret = wacom_sec_init(wac_i2c); + if (ret) + goto err_sec_init; + + device_init_wakeup(&client->dev, true); + + if (wac_i2c->pdata->table_swap) { + INIT_DELAYED_WORK(&wac_i2c->nb_reg_work, wacom_i2c_nb_register_work); + schedule_delayed_work(&wac_i2c->nb_reg_work, msecs_to_jiffies(500)); + } + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + sec_input_register_notify(&wac_i2c->nb, wacom_notifier_call, 2); +#endif + + input_info(true, &client->dev, "%s: probe done\n", __func__); + input_log_fix(); + + g_wac_i2c = wac_i2c; + wac_i2c->probe_done = true; + pdata->enabled = true; + + wac_i2c->ble_hist = kzalloc(WACOM_BLE_HISTORY_SIZE, GFP_KERNEL); + if (!wac_i2c->ble_hist) + input_err(true, &client->dev, "%s: failed to history mem\n", __func__); + + wac_i2c->ble_hist1 = kzalloc(WACOM_BLE_HISTORY1_SIZE, GFP_KERNEL); + if (!wac_i2c->ble_hist1) + input_err(true, &client->dev, "%s: failed to history1 mem\n", __func__); + + return 0; + +err_sec_init: + cancel_delayed_work_sync(&wac_i2c->open_test_dwork); +err_request_irq: +err_register_input_dev: + wakeup_source_unregister(wac_i2c->wacom_fw_ws); + wakeup_source_unregister(wac_i2c->wacom_ws); + + mutex_destroy(&wac_i2c->i2c_mutex); + mutex_destroy(&wac_i2c->irq_lock); + mutex_destroy(&wac_i2c->update_lock); + mutex_destroy(&wac_i2c->lock); + mutex_destroy(&wac_i2c->mode_lock); + mutex_destroy(&wac_i2c->ble_lock); + mutex_destroy(&wac_i2c->ble_charge_mode_lock); + + i2c_unregister_device(wac_i2c->client_boot); + + wacom_power(wac_i2c, false); + msleep(110); + regulator_put(pdata->avdd); + + if (wac_i2c->input_dev) + input_free_device(wac_i2c->input_dev); + + input_err(true, &client->dev, "%s: failed to probe\n", __func__); + input_log_fix(); + + return ret; +} + +#if IS_ENABLED(CONFIG_PM) +static int wacom_i2c_suspend(struct device *dev) +{ + struct wacom_i2c *wac_i2c = dev_get_drvdata(dev); + int ret; + + if (wac_i2c->i2c_done.done == 0) { + /* completion.done == 0 :: initialized + * completion.done > 0 :: completeted + */ + ret = wait_for_completion_interruptible_timeout(&wac_i2c->i2c_done, msecs_to_jiffies(500)); + if (ret <= 0) + input_err(true, &wac_i2c->client->dev, "%s: completion expired, %d\n", __func__, ret); + } + + wac_i2c->pm_suspend = true; + reinit_completion(&wac_i2c->resume_done); + +#ifndef USE_OPEN_CLOSE + if (wac_i2c->input_dev->users) + wacom_sleep_sequence(wac_i2c); +#endif + + return 0; +} + +static int wacom_i2c_resume(struct device *dev) +{ + struct wacom_i2c *wac_i2c = dev_get_drvdata(dev); + + wac_i2c->pm_suspend = false; + complete_all(&wac_i2c->resume_done); +#ifndef USE_OPEN_CLOSE + if (wac_i2c->input_dev->users) + wacom_wakeup_sequence(wac_i2c); +#endif + + return 0; +} + +static SIMPLE_DEV_PM_OPS(wacom_pm_ops, wacom_i2c_suspend, wacom_i2c_resume); +#endif + +static void wacom_i2c_shutdown(struct i2c_client *client) +{ + struct wacom_i2c *wac_i2c = i2c_get_clientdata(client); + + if (!wac_i2c) + return; + + g_wac_i2c = NULL; + wac_i2c->probe_done = false; + + input_info(true, &wac_i2c->client->dev, "%s called!\n", __func__); + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + sec_input_unregister_notify(&wac_i2c->nb); +#endif + + if (wac_i2c->pdata->table_swap) { +#if IS_ENABLED(CONFIG_MUIC_SUPPORT_KEYBOARDDOCK) + if (wac_i2c->pdata->table_swap == TABLE_SWAP_KBD_COVER) + keyboard_notifier_unregister(&wac_i2c->kbd_nb); +#endif + +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) + if (wac_i2c->pdata->table_swap == TABLE_SWAP_DEX_STATION) + manager_notifier_unregister(&wac_i2c->typec_nb); +#endif + } + + cancel_delayed_work_sync(&wac_i2c->open_test_dwork); + cancel_delayed_work_sync(&wac_i2c->work_print_info); + + wacom_enable_irq(wac_i2c, false); + + wacom_power(wac_i2c, false); + + input_info(true, &wac_i2c->client->dev, "%s Done\n", __func__); +} + +static int wacom_i2c_remove(struct i2c_client *client) +{ + struct wacom_i2c *wac_i2c = i2c_get_clientdata(client); + + g_wac_i2c = NULL; + wac_i2c->probe_done = false; + + input_info(true, &wac_i2c->client->dev, "%s called!\n", __func__); + + if (wac_i2c->pdata->table_swap) { +#if IS_ENABLED(CONFIG_MUIC_SUPPORT_KEYBOARDDOCK) + if (wac_i2c->pdata->table_swap == TABLE_SWAP_KBD_COVER) + keyboard_notifier_unregister(&wac_i2c->kbd_nb); +#endif + +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) + if (wac_i2c->pdata->table_swap == TABLE_SWAP_DEX_STATION) + manager_notifier_unregister(&wac_i2c->typec_nb); +#endif + } + + cancel_delayed_work_sync(&wac_i2c->open_test_dwork); + cancel_delayed_work_sync(&wac_i2c->work_print_info); + + device_init_wakeup(&client->dev, false); + + wacom_enable_irq(wac_i2c, false); + + wacom_power(wac_i2c, false); + + wakeup_source_unregister(wac_i2c->wacom_fw_ws); + wakeup_source_unregister(wac_i2c->wacom_ws); + + mutex_destroy(&wac_i2c->i2c_mutex); + mutex_destroy(&wac_i2c->irq_lock); + mutex_destroy(&wac_i2c->update_lock); + mutex_destroy(&wac_i2c->lock); + mutex_destroy(&wac_i2c->mode_lock); + mutex_destroy(&wac_i2c->ble_lock); + mutex_destroy(&wac_i2c->ble_charge_mode_lock); + + wacom_sec_remove(wac_i2c); + + i2c_unregister_device(wac_i2c->client_boot); + regulator_put(wac_i2c->pdata->avdd); + + input_info(true, &wac_i2c->client->dev, "%s Done\n", __func__); + + return 0; +} + +static const struct i2c_device_id wacom_i2c_id[] = { + {"wacom_w90xx", 0}, + {}, +}; + +MODULE_DEVICE_TABLE(i2c, wacom_i2c_id); + +#if IS_ENABLED(CONFIG_OF) +static const struct of_device_id wacom_dt_ids[] = { + {.compatible = "wacom,w90xx"}, + {} +}; +#endif + +static struct i2c_driver wacom_i2c_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "wacom_w90xx", +#if IS_ENABLED(CONFIG_PM) + .pm = &wacom_pm_ops, +#endif +#if IS_ENABLED(CONFIG_OF) + .of_match_table = of_match_ptr(wacom_dt_ids), +#endif + }, + .probe = wacom_i2c_probe, + .remove = wacom_i2c_remove, + .shutdown = wacom_i2c_shutdown, + .id_table = wacom_i2c_id, +}; + +static int __init wacom_i2c_init(void) +{ + int ret = 0; + + pr_info("%s: %s start\n", SECLOG, __func__); + + ret = i2c_add_driver(&wacom_i2c_driver); + if (ret) + pr_err("%s: %s: failed to add i2c driver\n", SECLOG, __func__); + + pr_info("%s: %s end\n", SECLOG, __func__); + + return ret; +} + +static void __exit wacom_i2c_exit(void) +{ + i2c_del_driver(&wacom_i2c_driver); +} + +module_init(wacom_i2c_init); +module_exit(wacom_i2c_exit); + +MODULE_AUTHOR("Samsung"); +MODULE_DESCRIPTION("Driver for Wacom Digitizer Controller"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/wacom/wacom_i2c_elec.c b/drivers/input/wacom/wacom_i2c_elec.c new file mode 100755 index 000000000000..b5510abc88be --- /dev/null +++ b/drivers/input/wacom/wacom_i2c_elec.c @@ -0,0 +1,609 @@ +/* + * wacom_i2c_elec.c - Wacom G5 Digitizer Controller (I2C bus) + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "wacom_dev.h" + +long long median(long long* arr, int length) +{ + long long* internal; + long long ret = -1; + int i, j; + long long temp; + + internal = kzalloc(sizeof(long long)*length, GFP_KERNEL); + memcpy(internal, arr, length * sizeof(long long)); + + for (i = 0; i < length; i++) { + for (j = 0; j < length - (i + 1); j++) { + if (internal[j] > internal[j + 1]) { + temp = internal[j + 1]; + internal[j + 1] = internal[j]; + internal[j] = temp; + } + } + } + + if (length % 2 == 0) + ret = (internal[length / 2 - 1] + internal[length / 2]) / 2; + else + ret = internal[length / 2]; + + kfree(internal); + + return ret; +} + +long long buildS(long long* x, long long* m, int start, int end, int ind) +{ + int i; + long long ret; + long long *temp; + + temp = kzalloc(sizeof(long long)*(end - start + 1), GFP_KERNEL); + memcpy(temp, &x[start], sizeof(long long)*(end - start + 1)); + for (i = 0; i < end - start + 1; i++) { + temp[i] -= m[ind]; + temp[i] = (temp[i] > 0) ? temp[i] : -temp[i]; + } + + ret = median(temp, end - start + 1); + + kfree(temp); + + return ret; +} + +void hampel(long long* x, int length, int k, int nsig) +{ + const long long kappa = 14826; + int i; + + long long *m; + long long *s; + long long *temp; + + m = kzalloc(sizeof(long long)*length, GFP_KERNEL); + s = kzalloc(sizeof(long long)*length, GFP_KERNEL); + temp = kzalloc(sizeof(long long)*length, GFP_KERNEL); + + for (i = 0; i < length; i++) { + if (i < k) { + if (i + k + 1 > length) + continue; + + memcpy(temp, x, sizeof(long long)*(i + k + 1)); + m[i] = median(temp, i + k + 1); + } else if (i >= length - k) { + memcpy(temp, &x[i - k], sizeof(long long)*(length - i + k)); + m[i] = median(temp, length - i + k); + } else { + memcpy(temp, &x[i - k], sizeof(long long)*(2 * k + 1)); + m[i] = median(temp, 2 * k + 1); + } + } + + for (i = 0; i < length; i++) { + if (i < k) + s[i] = buildS(x, m, 0, i + k, i); + else if (i >= length - k) + s[i] = buildS(x, m, i - k, length - 1, i); + else + s[i] = buildS(x, m, i - k, i + k, i); + + s[i] *= kappa; + } + + for (i = 0; i < length; i++) { + if (x[i] - m[i] > nsig*s[i] || x[i] - m[i] < -(nsig*s[i])) + x[i] = m[i]; + } + + kfree(m); + kfree(s); + kfree(temp); +} + +long long mean(long long* arr, int length) +{ + long long ret = arr[0]; + int n; + + for (n = 1; n < length; n++) + ret = (n*ret + arr[n]) / (n + 1); + + return ret; +} + +int calibration_trx_data(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + long long *cal_xx_raw, *cal_xy_raw, *cal_yx_raw, *cal_yy_raw; + int i; + + cal_xx_raw = cal_xy_raw = cal_yx_raw = cal_yy_raw = NULL; + edata->cal_xx = edata->cal_xy = edata->cal_yx = edata->cal_yy = 0; + + cal_xx_raw = kzalloc(edata->max_x_ch * sizeof(long long), GFP_KERNEL); + cal_xy_raw = kzalloc(edata->max_x_ch * sizeof(long long), GFP_KERNEL); + cal_yx_raw = kzalloc(edata->max_y_ch * sizeof(long long), GFP_KERNEL); + cal_yy_raw = kzalloc(edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!cal_xx_raw || !cal_xy_raw || !cal_yx_raw || !cal_yy_raw) { + if (cal_xx_raw) + kfree(cal_xx_raw); + if (cal_xy_raw) + kfree(cal_xy_raw); + if (cal_yx_raw) + kfree(cal_yx_raw); + if (cal_yy_raw) + kfree(cal_yy_raw); + + return -ENOMEM; + } + + for (i = 0; i < edata->max_x_ch; i++) { + cal_xx_raw[i] = edata->xx_ref[i] * POWER_OFFSET / edata->xx[i]; + cal_xy_raw[i] = edata->xy_ref[i] * POWER_OFFSET / edata->xy[i]; + } + + for (i = 0; i < edata->max_y_ch; i++) { + cal_yx_raw[i] = edata->yx_ref[i] * POWER_OFFSET / edata->yx[i]; + cal_yy_raw[i] = edata->yy_ref[i] * POWER_OFFSET / edata->yy[i]; + } + + hampel(cal_xx_raw, edata->max_x_ch, 3, 3); + hampel(cal_xy_raw, edata->max_x_ch, 3, 3); + hampel(cal_yx_raw, edata->max_y_ch, 3, 3); + hampel(cal_yy_raw, edata->max_y_ch, 3, 3); + + edata->cal_xx = mean(cal_xx_raw, edata->max_x_ch); + edata->cal_xy = mean(cal_xy_raw, edata->max_x_ch); + edata->cal_yx = mean(cal_yx_raw, edata->max_y_ch); + edata->cal_yy = mean(cal_yy_raw, edata->max_y_ch); + + for (i = 0; i < edata->max_x_ch; i++) { + edata->xx_xx[i] = edata->cal_xx * edata->xx[i]; + edata->xy_xy[i] = edata->cal_xy * edata->xy[i]; + } + + for (i = 0; i < edata->max_y_ch; i++) { + edata->yx_yx[i] = edata->cal_yx * edata->yx[i]; + edata->yy_yy[i] = edata->cal_yy * edata->yy[i]; + } + + input_info(true, &wac_i2c->client->dev, "%s: cal_xx(%lld), cal_xy(%lld), cal_yx(%lld), cal_yy(%lld)\n", + __func__, edata->cal_xx, edata->cal_xy, edata->cal_yx, edata->cal_yy); + + kfree(cal_xx_raw); + kfree(cal_xy_raw); + kfree(cal_yx_raw); + kfree(cal_yy_raw); + + return 0; +} + +void calculate_ratio(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + int i; + + for (i = 0; i < edata->max_x_ch; i++) + edata->rxx[i] = edata->xx_ref[i] * POWER_OFFSET / edata->xx[i]; + + for (i = 0; i < edata->max_x_ch; i++) + edata->rxy[i] = edata->xy_ref[i] * POWER_OFFSET / edata->xy[i]; + + for (i = 0; i < edata->max_y_ch; i++) + edata->ryx[i] = edata->yx_ref[i] * POWER_OFFSET / edata->yx[i]; + + for (i = 0; i < edata->max_y_ch; i++) + edata->ryy[i] = edata->yy_ref[i] * POWER_OFFSET / edata->yy[i]; + +} + +void make_decision(struct wacom_i2c* wac_i2c, u16* arrResult) +{ + struct wacom_elec_data* edata = wac_i2c->pdata->edata; + u32 open_count, short_count; + int i; + + open_count = short_count = 0; + for (i = 0; i < edata->max_x_ch; i++) { + edata->drxx[i] = edata->rxx[i] - edata->cal_xx; + edata->drxy[i] = edata->rxy[i] - edata->cal_xy; + + if (edata->xy[i] < edata->xy_ref[i] / 2 || edata->xx[i] < edata->xx_ref[i] / 2) { + arrResult[i + 1] |= SEC_OPEN; + open_count++; + } + + if (edata->xy_xy[i] > edata->xy_spec[i] || edata->xx_xx[i] > edata->xx_spec[i]) + arrResult[i + 1] |= SEC_SHORT; + + if (edata->drxy[i] > edata->drxy_spec[i] || edata->drxy[i] < -edata->drxy_spec[i]) + arrResult[i + 1] |= SEC_SHORT; + + if (edata->drxx[i] > edata->drxx_spec[i] || edata->drxx[i] < -edata->drxx_spec[i]) + arrResult[i + 1] |= SEC_SHORT; + + if (arrResult[i + 1] & SEC_SHORT) + short_count++; + } + + for (i = 0; i < edata->max_y_ch; i++) { + edata->dryy[i] = edata->ryy[i] - edata->cal_yy; + edata->dryx[i] = edata->ryx[i] - edata->cal_yx; + + if (edata->yx[i] < edata->yx_ref[i] / 2 || edata->yy[i] < edata->yy_ref[i] / 2) { + arrResult[i + 1 + edata->max_x_ch] |= SEC_OPEN; + open_count++; + } + + if (edata->yx_yx[i] > edata->yx_spec[i] || edata->yy_yy[i] > edata->yy_spec[i]) + arrResult[i + 1 + edata->max_x_ch] |= SEC_SHORT; + + if (edata->dryx[i] > edata->dryx_spec[i] || edata->dryx[i] < -edata->dryx_spec[i]) + arrResult[i + 1 + edata->max_x_ch] |= SEC_SHORT; + + if (edata->dryy[i] > edata->dryy_spec[i] || edata->dryy[i] < -edata->dryy_spec[i]) + arrResult[i + 1 + edata->max_x_ch] |= SEC_SHORT; + + if (arrResult[i + 1 + edata->max_x_ch] & SEC_SHORT) + short_count++; + } + + arrResult[0] = (short_count << 8) + open_count; +} + +void print_elec_data(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + u8 *pstr = NULL; + u8 ptmp[CMD_RESULT_WORD_LEN] = { 0 }; + int chsize, lsize; + int i, j; + + input_info(true, &wac_i2c->client->dev, "%s\n", __func__); + + chsize = edata->max_x_ch + edata->max_y_ch; + lsize = CMD_RESULT_WORD_LEN * (chsize + 1); + + pstr = kzalloc(lsize, GFP_KERNEL); + if (pstr == NULL) + return; + + memset(pstr, 0x0, lsize); + snprintf(ptmp, sizeof(ptmp), " TX"); + strlcat(pstr, ptmp, lsize); + + for (i = 0; i < chsize; i++) { + snprintf(ptmp, sizeof(ptmp), " %02d ", i); + strlcat(pstr, ptmp, lsize); + } + + input_info(true, &wac_i2c->client->dev, "%s\n", pstr); + memset(pstr, 0x0, lsize); + snprintf(ptmp, sizeof(ptmp), " +"); + strlcat(pstr, ptmp, lsize); + + for (i = 0; i < chsize; i++) { + snprintf(ptmp, sizeof(ptmp), "----"); + strlcat(pstr, ptmp, lsize); + } + + input_info(true, &wac_i2c->client->dev, "%s\n", pstr); + + for (i = 0; i < chsize; i++) { + memset(pstr, 0x0, lsize); + snprintf(ptmp, sizeof(ptmp), "Rx%02d | ", i); + strlcat(pstr, ptmp, lsize); + + for (j = 0; j < chsize; j++) { + snprintf(ptmp, sizeof(ptmp), " %4d", + edata->elec_data[(i * chsize) + j]); + + strlcat(pstr, ptmp, lsize); + } + input_info(true, &wac_i2c->client->dev, "%s\n", pstr); + } + kfree(pstr); +} + +void print_trx_data(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + struct i2c_client *client = wac_i2c->client; + u8 tmp_buf[CMD_RESULT_WORD_LEN] = { 0 }; + u8 *buff; + int buff_size; + int i; + + buff_size = edata->max_x_ch > edata->max_y_ch ? edata->max_x_ch : edata->max_y_ch; + buff_size = CMD_RESULT_WORD_LEN * (buff_size + 1); + + buff = kzalloc(buff_size, GFP_KERNEL); + if (buff == NULL) + return; + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "xx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%d ", edata->xx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "xy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%d ", edata->xy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "yx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%d ", edata->yx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "yy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%d ", edata->yy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + kfree(buff); +} + +void print_cal_trx_data(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + struct i2c_client *client = wac_i2c->client; + u8 tmp_buf[CMD_RESULT_WORD_LEN] = { 0 }; + u8 *buff; + int buff_size; + int i; + + buff_size = edata->max_x_ch > edata->max_y_ch ? edata->max_x_ch : edata->max_y_ch; + buff_size = CMD_RESULT_WORD_LEN * (buff_size + 1); + + buff = kzalloc(buff_size, GFP_KERNEL); + if (buff == NULL) + return; + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "xx_xx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", edata->xx_xx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "xy_xy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", edata->xy_xy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "yx_yx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", edata->yx_yx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "yy_yy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", edata->yy_yy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + kfree(buff); +} + +void print_ratio_trx_data(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + struct i2c_client *client = wac_i2c->client; + u8 tmp_buf[CMD_RESULT_WORD_LEN] = { 0 }; + u8 *buff; + int buff_size; + int i; + + buff_size = edata->max_x_ch > edata->max_y_ch ? edata->max_x_ch : edata->max_y_ch; + buff_size = CMD_RESULT_WORD_LEN * (buff_size + 1); + + buff = kzalloc(buff_size, GFP_KERNEL); + if (buff == NULL) + return; + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "rxx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", edata->rxx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "rxy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", edata->rxy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "ryx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", edata->ryx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "ryy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", edata->ryy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + kfree(buff); +} + +void print_difference_ratio_trx_data(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + struct i2c_client *client = wac_i2c->client; + u8 tmp_buf[CMD_RESULT_WORD_LEN] = { 0 }; + u8 *buff; + int buff_size; + int i; + + buff_size = edata->max_x_ch > edata->max_y_ch ? edata->max_x_ch : edata->max_y_ch; + buff_size = CMD_RESULT_WORD_LEN * (buff_size + 1); + + buff = kzalloc(buff_size, GFP_KERNEL); + if (buff == NULL) + return; + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "drxx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", edata->drxx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "drxy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", edata->drxy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "dryx: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", edata->dryx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "dryy: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", edata->dryy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + kfree(buff); +} diff --git a/drivers/input/wacom/wacom_i2c_sec.c b/drivers/input/wacom/wacom_i2c_sec.c new file mode 100755 index 000000000000..670fce2a6594 --- /dev/null +++ b/drivers/input/wacom/wacom_i2c_sec.c @@ -0,0 +1,3225 @@ +/* + * wacom_i2c_func.c - Wacom G5 Digitizer Controller (I2C bus) + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "wacom_dev.h" + +int calibration_trx_data(struct wacom_i2c *wac_i2c); +void calculate_ratio(struct wacom_i2c *wac_i2c); +void make_decision(struct wacom_i2c *wac_i2c, u16* arrResult); +void print_elec_data(struct wacom_i2c *wac_i2c); +void print_trx_data(struct wacom_i2c *wac_i2c); +void print_cal_trx_data(struct wacom_i2c *wac_i2c); +void print_ratio_trx_data(struct wacom_i2c *wac_i2c); +void print_difference_ratio_trx_data(struct wacom_i2c *wac_i2c); + +static inline int power(int num) +{ + int i, ret; + + for (i = 0, ret = 1; i < num; i++) + ret = ret * 10; + + return ret; +} + +#if WACOM_SEC_FACTORY +static ssize_t epen_fac_select_firmware_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + u8 fw_update_way = FW_NONE; + int ret = 0; + + input_info(true, &client->dev, "%s\n", __func__); + + switch (*buf) { + case 'k': + case 'K': + fw_update_way = FW_BUILT_IN; + break; + case 't': + case 'T': + fw_update_way = FW_FACTORY_GARAGE; + break; + case 'u': + case 'U': + fw_update_way = FW_FACTORY_UNIT; + break; + default: + input_err(true, &client->dev, "%s: wrong parameter\n", __func__); + return count; + } + + ret = wacom_i2c_load_fw(wac_i2c, fw_update_way); + if (ret < 0) { + input_info(true, &client->dev, "%s: failed to load fw data\n", __func__); + goto out; + } + + wacom_i2c_unload_fw(wac_i2c); +out: + return count; +} +#endif + +static ssize_t epen_firm_update_status_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int status = wac_i2c->update_status; + int ret = 0; + + input_info(true, &client->dev, "%s:(%d)\n", __func__, status); + + if (status == FW_UPDATE_PASS) + ret = snprintf(buf, PAGE_SIZE, "PASS\n"); + else if (status == FW_UPDATE_RUNNING) + ret = snprintf(buf, PAGE_SIZE, "DOWNLOADING\n"); + else if (status == FW_UPDATE_FAIL) + ret = snprintf(buf, PAGE_SIZE, "FAIL\n"); + else + ret = 0; + + return ret; +} + +static ssize_t epen_firm_version_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; +#if IS_ENABLED(CONFIG_SEC_FACTORY) + int i; + + for (i = 0; i < 4; i++) + wac_i2c->pdata->img_version_of_ic[i] = 0; + + wacom_i2c_query(wac_i2c); +#endif + + input_info(true, &client->dev, "%s: %02X%02X%02X%02X|%02X%02X%02X%02X\n", __func__, + wac_i2c->pdata->img_version_of_ic[0], wac_i2c->pdata->img_version_of_ic[1], + wac_i2c->pdata->img_version_of_ic[2], wac_i2c->pdata->img_version_of_ic[3], + wac_i2c->pdata->img_version_of_bin[0], wac_i2c->pdata->img_version_of_bin[1], + wac_i2c->pdata->img_version_of_bin[2], wac_i2c->pdata->img_version_of_bin[3]); + + return snprintf(buf, PAGE_SIZE, "%02X%02X%02X%02X\t%02X%02X%02X%02X\n", + wac_i2c->pdata->img_version_of_ic[0], wac_i2c->pdata->img_version_of_ic[1], + wac_i2c->pdata->img_version_of_ic[2], wac_i2c->pdata->img_version_of_ic[3], + wac_i2c->pdata->img_version_of_bin[0], wac_i2c->pdata->img_version_of_bin[1], + wac_i2c->pdata->img_version_of_bin[2], wac_i2c->pdata->img_version_of_bin[3]); +} + +static ssize_t epen_firmware_update_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + u8 fw_update_way = FW_NONE; + + input_info(true, &client->dev, "%s\n", __func__); + + mutex_lock(&wac_i2c->lock); + + switch (*buf) { + case 'i': + case 'I': +#if WACOM_PRODUCT_SHIP + fw_update_way = FW_IN_SDCARD_SIGNED; +#else + fw_update_way = FW_IN_SDCARD; +#endif + break; + case 'k': + case 'K': + fw_update_way = FW_BUILT_IN; + break; +#if WACOM_SEC_FACTORY + case 't': + case 'T': + fw_update_way = FW_FACTORY_GARAGE; + break; + case 'u': + case 'U': + fw_update_way = FW_FACTORY_UNIT; + break; +#endif + default: + input_err(true, &client->dev, "%s : wrong parameter\n", __func__); + mutex_unlock(&wac_i2c->lock); + return count; + } + + wacom_fw_update_on_hidden_menu(wac_i2c, fw_update_way); + mutex_unlock(&wac_i2c->lock); + + return count; +} + +static ssize_t epen_firm_version_of_ic_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + + input_info(true, &wac_i2c->client->dev, "%s: %02X%02X%02X%02X\n", __func__, + wac_i2c->pdata->img_version_of_ic[0], wac_i2c->pdata->img_version_of_ic[1], + wac_i2c->pdata->img_version_of_ic[2], wac_i2c->pdata->img_version_of_ic[3]); + + return snprintf(buf, PAGE_SIZE, "%02X%02X%02X%02X", + wac_i2c->pdata->img_version_of_ic[0], wac_i2c->pdata->img_version_of_ic[1], + wac_i2c->pdata->img_version_of_ic[2], wac_i2c->pdata->img_version_of_ic[3]); +} + +static ssize_t epen_firm_version_of_bin_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + + input_info(true, &wac_i2c->client->dev, "%s: %02X%02X%02X%02X\n", __func__, + wac_i2c->pdata->img_version_of_bin[0], wac_i2c->pdata->img_version_of_bin[1], + wac_i2c->pdata->img_version_of_bin[2], wac_i2c->pdata->img_version_of_bin[3]); + + return snprintf(buf, PAGE_SIZE, "%02X%02X%02X%02X", + wac_i2c->pdata->img_version_of_bin[0], wac_i2c->pdata->img_version_of_bin[1], + wac_i2c->pdata->img_version_of_bin[2], wac_i2c->pdata->img_version_of_bin[3]); +} + + +static ssize_t epen_reset_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int val; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + + val = !(!val); + if (!val) + goto out; + + wacom_enable_irq(wac_i2c, false); + + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + + /* Reset IC */ + wacom_reset_hw(wac_i2c); + /* I2C Test */ + wacom_i2c_query(wac_i2c); + + wacom_enable_irq(wac_i2c, true); + + input_info(true, &client->dev, + "%s: result %d\n", __func__, wac_i2c->query_status); + return count; + +out: + input_err(true, &client->dev, "%s: invalid value %d\n", __func__, val); + + return count; +} + +static ssize_t epen_reset_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int ret = 0; + + if (wac_i2c->query_status) { + input_info(true, &client->dev, "%s: PASS\n", __func__); + ret = snprintf(buf, PAGE_SIZE, "PASS\n"); + } else { + input_err(true, &client->dev, "%s: FAIL\n", __func__); + ret = snprintf(buf, PAGE_SIZE, "FAIL\n"); + } + + return ret; +} + +static ssize_t epen_checksum_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int val; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + + val = !(!val); + if (!val) + goto out; + + wacom_enable_irq(wac_i2c, false); + + wacom_checksum(wac_i2c); + + wacom_enable_irq(wac_i2c, true); + + input_info(true, &client->dev, + "%s: result %d\n", __func__, wac_i2c->checksum_result); + + return count; + +out: + input_err(true, &client->dev, "%s: invalid value %d\n", __func__, val); + + return count; +} + +static ssize_t epen_checksum_result_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int ret; + + if (wac_i2c->checksum_result) { + input_info(true, &client->dev, "%s: checksum, PASS\n", __func__); + ret = snprintf(buf, PAGE_SIZE, "PASS\n"); + } else { + input_err(true, &client->dev, "%s: checksum, FAIL\n", __func__); + ret = snprintf(buf, PAGE_SIZE, "FAIL\n"); + } + + return ret; +} + +int wacom_open_test(struct wacom_i2c *wac_i2c, int test_mode) +{ + struct i2c_client *client = wac_i2c->client; + u8 cmd = 0; + u8 buf[COM_COORD_NUM + 1] = { 0, }; + int ret = 0, retry = 0, retval = 0; + int retry_int = 30; + + input_info(true, &client->dev, "%s : start (%d)\n", __func__, test_mode); + + if(!wac_i2c->pdata->support_garage_open_test && test_mode == WACOM_GARAGE_TEST){ + input_err(true, &client->dev, "%s: not support garage open test", __func__); + retval = EPEN_OPEN_TEST_NOTSUPPORT; + goto err1; + } + + /* change normal mode for open test */ + mutex_lock(&wac_i2c->mode_lock); + wacom_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_NONE); + // prevent I2C fail + msleep(300); + mutex_unlock(&wac_i2c->mode_lock); + + ret = wacom_start_stop_cmd(wac_i2c, WACOM_STOP_CMD); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to set stop cmd, %d\n", + __func__, ret); + retval = EPEN_OPEN_TEST_EIO; + goto err1; + } + + msleep(50); + + wacom_enable_irq(wac_i2c, false); + + if (test_mode == WACOM_GARAGE_TEST) { + wac_i2c->garage_connection_check = false; + wac_i2c->garage_fail_channel = 0; + wac_i2c->garage_min_adc_val = 0; + wac_i2c->garage_error_cal = 0; + wac_i2c->garage_min_cal_val = 0; + + cmd = COM_GARAGE_TEST_MODE; + + } else if (test_mode == WACOM_DIGITIZER_TEST) { + wac_i2c->connection_check = false; + wac_i2c->fail_channel = 0; + wac_i2c->min_adc_val = 0; + wac_i2c->error_cal = 0; + wac_i2c->min_cal_val = 0; + + cmd = COM_DIGITIZER_TEST_MODE; + } + + if (wac_i2c->pdata->support_garage_open_test) { + input_info(true, &client->dev, "%s : send data(%02x)\n", __func__, cmd); + + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, "%s : failed to send data(%02x)\n", __func__, cmd); + retval = EPEN_OPEN_TEST_EIO; + goto err2; + } + msleep(50); + } + + cmd = COM_OPEN_CHECK_START; + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, "%s : failed to send data(%02x)\n", __func__, cmd); + retval = EPEN_OPEN_TEST_EIO; + goto err2; + } + + msleep(50); + + retry = 5; + cmd = COM_OPEN_CHECK_STATUS; + do { + input_info(true, &client->dev, "%s : read status, retry %d\n", __func__, retry); + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s : failed to send data(%02x)\n", __func__, cmd); + usleep_range(4500, 5500); + continue; + } + + retry_int = 30; + while (retry_int--) { + if (!gpio_get_value(wac_i2c->pdata->irq_gpio)) + break; + else + msleep(10); + } + input_info(true, &client->dev, "%s : retry_int[%d]\n", __func__, retry_int); + + ret = wacom_i2c_recv(wac_i2c, buf, COM_COORD_NUM); + if (ret != COM_COORD_NUM) { + input_err(true, &client->dev, "%s : failed to recv\n", __func__); + usleep_range(4500, 5500); + continue; + } + + if (buf[0] != 0x0E && buf[1] != 0x01) { + input_err(true, &client->dev, + "%s : invalid packet(%02x %02x %02x)\n", + __func__, buf[0], buf[1], buf[3]); + continue; + } + /* + * status value + * 0 : data is not ready + * 1 : PASS + * 2 : Fail (coil function error) + * 3 : Fail (All coil function error) + */ + if (buf[2] == 1) { + input_info(true, &client->dev, "%s : Open check Pass\n", __func__); + break; + } + } while (retry--); + + if (test_mode == WACOM_GARAGE_TEST) { + if (ret == COM_COORD_NUM) { + if (wac_i2c->pdata->module_ver == 0x2) + wac_i2c->garage_connection_check = ((buf[2] == 1) && !buf[6]); + else + wac_i2c->garage_connection_check = (buf[2] == 1); + } else { + wac_i2c->garage_connection_check = false; + retval = EPEN_OPEN_TEST_EIO; + goto err2; + } + + wac_i2c->garage_fail_channel = buf[3]; + wac_i2c->garage_min_adc_val = buf[4] << 8 | buf[5]; + wac_i2c->garage_error_cal = buf[6]; + wac_i2c->garage_min_cal_val = buf[7] << 8 | buf[8]; + + input_info(true, &client->dev, + "%s: garage %s buf[3]:%d, buf[4]:%d, buf[5]:%d, buf[6]:%d, buf[7]:%d, buf[8]:%d\n", + __func__, wac_i2c->garage_connection_check ? "Pass" : "Fail", + buf[3], buf[4], buf[5], buf[6], buf[7], buf[8]); + + if (!wac_i2c->garage_connection_check) + retval = EPEN_OPEN_TEST_FAIL; + + } else if (test_mode == WACOM_DIGITIZER_TEST) { + if (ret == COM_COORD_NUM) { + if (wac_i2c->pdata->module_ver == 0x2) + wac_i2c->connection_check = ((buf[2] == 1) && !buf[6]); + else + wac_i2c->connection_check = (buf[2] == 1); + } else { + wac_i2c->connection_check = false; + retval = EPEN_OPEN_TEST_EIO; + goto err2; + } + + wac_i2c->fail_channel = buf[3]; + wac_i2c->min_adc_val = buf[4] << 8 | buf[5]; + wac_i2c->error_cal = buf[6]; + wac_i2c->min_cal_val = buf[7] << 8 | buf[8]; + + input_info(true, &client->dev, + "%s: digitizer %s buf[3]:%d, buf[4]:%d, buf[5]:%d, buf[6]:%d, buf[7]:%d, buf[8]:%d\n", + __func__, wac_i2c->connection_check ? "Pass" : "Fail", + buf[3], buf[4], buf[5], buf[6], buf[7], buf[8]); + + if (!wac_i2c->connection_check) + retval = EPEN_OPEN_TEST_FAIL; + } + +err2: + wacom_enable_irq(wac_i2c, true); + +err1: + ret = wacom_start_stop_cmd(wac_i2c, WACOM_STOP_AND_START_CMD); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to set stop-start cmd, %d\n", + __func__, ret); + retval = EPEN_OPEN_TEST_EMODECHG; + goto out; + } + +out: + return retval; +} + +static int get_connection_test(struct wacom_i2c *wac_i2c, int test_mode) +{ + struct i2c_client *client = wac_i2c->client; + + int retry = 2; + int ret; + + mutex_lock(&wac_i2c->lock); + + input_info(true, &client->dev, "%s : start(%d)\n", __func__, test_mode); + + wac_i2c->is_open_test = true; + +#if IS_ENABLED(CONFIG_INPUT_SEC_NOTIFIER) + if (wac_i2c->is_tsp_block) { + input_info(true, &wac_i2c->client->dev, "%s: full scan OUT\n", __func__); + wac_i2c->tsp_scan_mode = sec_input_notify(&wac_i2c->nb, NOTIFIER_TSP_BLOCKING_RELEASE, NULL); + wac_i2c->is_tsp_block = false; + } +#endif + + while (retry--) { + ret = wacom_open_test(wac_i2c, test_mode); + if (ret == EPEN_OPEN_TEST_PASS || ret == EPEN_OPEN_TEST_NOTSUPPORT) + break; + + input_err(true, &client->dev, "failed(%d). retry %d\n", ret, retry); + + wacom_power(wac_i2c, false); + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + /* recommended delay in spec */ + msleep(100); + wacom_power(wac_i2c, true); + + if (ret == EPEN_OPEN_TEST_EIO || ret == EPEN_OPEN_TEST_FAIL) { + msleep(150); + continue; + } else if (ret == EPEN_OPEN_TEST_EMODECHG) { + break; + } + } + + if (!wac_i2c->samplerate_state) { + input_info(true, &client->dev, "%s: samplerate state is %d, need to recovery\n", + __func__, wac_i2c->samplerate_state); + + ret = wacom_start_stop_cmd(wac_i2c, WACOM_START_CMD); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to set start cmd, %d\n", + __func__, ret); + } + } + + wac_i2c->is_open_test = false; + + mutex_unlock(&wac_i2c->lock); + + input_info(true, &client->dev, "connection_check : %s\n", + wac_i2c->connection_check ? "OK" : "NG"); + + return ret; +} + +static ssize_t epen_connection_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + +#if WACOM_SEC_FACTORY + struct i2c_client *client = wac_i2c->client; + int ret; + + ret = wacom_check_ub(wac_i2c->client); + if (ret < 0) { + input_info(true, &client->dev, "%s: digitizer is not attached\n", __func__); + goto out; + } +#endif + + get_connection_test(wac_i2c, WACOM_DIGITIZER_TEST); + +#if WACOM_SEC_FACTORY +out: +#endif + if (wac_i2c->pdata->module_ver == 0x2) { + return snprintf(buf, PAGE_SIZE, "%s %d %d %d %s %d\n", + wac_i2c->connection_check ? "OK" : "NG", + wac_i2c->pdata->module_ver, wac_i2c->fail_channel, + wac_i2c->min_adc_val, wac_i2c->error_cal ? "NG" : "OK", + wac_i2c->min_cal_val); + } else { + return snprintf(buf, PAGE_SIZE, "%s %d %d %d\n", + wac_i2c->connection_check ? "OK" : "NG", + wac_i2c->pdata->module_ver, wac_i2c->fail_channel, + wac_i2c->min_adc_val); + } +} + +static ssize_t epen_saving_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + static u64 call_count; + int val; + + call_count++; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + + wac_i2c->battery_saving_mode = !(!val); + + input_info(true, &client->dev, "%s: ps %s & pen %s [%llu]\n", + __func__, wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_result & EPEN_EVENT_PEN_OUT) ? "out" : "in", + call_count); + + if (!wac_i2c->power_enable && wac_i2c->battery_saving_mode) { + input_err(true, &wac_i2c->client->dev, + "%s: already power off, save & return\n", __func__); + return count; + } + + if (!(wac_i2c->function_result & EPEN_EVENT_PEN_OUT)) { + wacom_select_survey_mode(wac_i2c, wac_i2c->screen_on); + + if (wac_i2c->battery_saving_mode) + forced_release_fullscan(wac_i2c); + } + + return count; +} + +static ssize_t epen_screen_off_memo_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int val = 0; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, + "%s : Not support screen off memo mode(%d) in Factory Bin\n", + __func__, val); + + return count; +#endif + + val = !(!val); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO; + else + wac_i2c->function_set &= (~EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO); + + input_info(true, &client->dev, + "%s: ps %s aop(%d) set(0x%x) ret(0x%x)\n", __func__, + wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_set & EPEN_SETMODE_AOP) ? 1 : 0, + wac_i2c->function_set, wac_i2c->function_result); + + if (!wac_i2c->screen_on) + wacom_select_survey_mode(wac_i2c, false); + + return count; +} + +static ssize_t epen_aod_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int val = 0; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, + "%s : Not support aod mode(%d) in Factory Bin\n", + __func__, val); + + return count; +#endif + + val = !(!val); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_AOD_LCD_OFF; + else + wac_i2c->function_set &= ~EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON; + + input_info(true, &client->dev, + "%s: ps %s aop(%d) set(0x%x) ret(0x%x)\n", __func__, + wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_set & EPEN_SETMODE_AOP) ? 1 : 0, + wac_i2c->function_set, wac_i2c->function_result); + + if (!wac_i2c->screen_on) + wacom_select_survey_mode(wac_i2c, false); + + return count; +} + +static ssize_t epen_aod_lcd_onoff_status_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int val = 0; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, + "%s : Not support aod mode(%d) in Factory Bin\n", + __func__, val); + + return count; +#endif + + val = !(!val); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_AOD_LCD_STATUS; + else + wac_i2c->function_set &= ~EPEN_SETMODE_AOP_OPTION_AOD_LCD_STATUS; + + if (!(wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_AOD) || wac_i2c->screen_on) + goto out; + + if (wac_i2c->survey_mode == EPEN_SURVEY_MODE_GARAGE_AOP) { + if ((wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON) + == EPEN_SETMODE_AOP_OPTION_AOD_LCD_OFF) { + forced_release_fullscan(wac_i2c); + } + + mutex_lock(&wac_i2c->mode_lock); + wacom_i2c_set_survey_mode(wac_i2c, wac_i2c->survey_mode); + mutex_unlock(&wac_i2c->mode_lock); + } + +out: + input_info(true, &client->dev, "%s: screen %s, survey mode:0x%x, set:0x%x\n", + __func__, wac_i2c->screen_on ? "on" : "off", + wac_i2c->survey_mode, wac_i2c->function_set); + + return count; +} + +static ssize_t epen_aot_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int val = 0; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, + "%s : Not support aot mode(%d) in Factory Bin\n", + __func__, val); + + return count; +#endif + + val = !(!val); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_AOT; + else + wac_i2c->function_set &= (~EPEN_SETMODE_AOP_OPTION_AOT); + + input_info(true, &client->dev, + "%s: ps %s aop(%d) set(0x%x) ret(0x%x)\n", __func__, + wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_set & EPEN_SETMODE_AOP) ? 1 : 0, + wac_i2c->function_set, wac_i2c->function_result); + + if (!wac_i2c->screen_on) + wacom_select_survey_mode(wac_i2c, false); + + return count; +} + +static ssize_t epen_wcharging_mode_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + + input_info(true, &client->dev, "%s: %s\n", __func__, + !wac_i2c->wcharging_mode ? "NORMAL" : "LOWSENSE"); + + return snprintf(buf, PAGE_SIZE, "%s\n", + !wac_i2c->wcharging_mode ? "NORMAL" : "LOWSENSE"); +} + +static ssize_t epen_wcharging_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int retval = 0; + + if (kstrtoint(buf, 0, &retval)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + + wac_i2c->wcharging_mode = retval; + + input_info(true, &client->dev, "%s: %d\n", __func__, + wac_i2c->wcharging_mode); + + if (!wac_i2c->power_enable) { + input_err(true, &wac_i2c->client->dev, + "%s: power off, save & return\n", __func__); + return count; + } + + retval = wacom_i2c_set_sense_mode(wac_i2c); + if (retval < 0) { + input_err(true, &client->dev, + "%s: do not set sensitivity mode, %d\n", __func__, + retval); + } + + return count; + +} + +static ssize_t epen_disable_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int val = 0; + + if (kstrtoint(buf, 0, &val)) { + input_err(true, &client->dev, "%s: failed to get param\n", + __func__); + return count; + } + + if (val) + wacom_disable_mode(wac_i2c, WACOM_DISABLE); + else + wacom_disable_mode(wac_i2c, WACOM_ENABLE); + + input_info(true, &client->dev, "%s: %d\n", __func__, val); + + return count; +} + +static ssize_t hardware_param_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[516]; + char tbuff[128]; + + memset(buff, 0x00, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"RESET\":\"%d\",", wac_i2c->abnormal_reset_count); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"I2C_FAIL\":\"%d\",", wac_i2c->i2c_fail_count); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"PEN_OUT\":\"%d\",", wac_i2c->pen_out_count); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"SDCONN\":\"%d\",", wac_i2c->connection_check); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"SECCNT\":\"%d\",", wac_i2c->fail_channel); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"SADCVAL\":\"%d\",", wac_i2c->min_adc_val); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + snprintf(tbuff, sizeof(tbuff), "\"SECLVL\":\"%d\",", wac_i2c->error_cal); + strlcat(buff, tbuff, sizeof(buff)); + + memset(tbuff, 0x00, sizeof(tbuff)); + /* remove last comma (csv) */ + snprintf(tbuff, sizeof(tbuff), "\"SCALLVL\":\"%d\"", wac_i2c->min_cal_val); + strlcat(buff, tbuff, sizeof(buff)); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + + return snprintf(buf, PAGE_SIZE, "%s", buff); +} + +static ssize_t hardware_param_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + + wac_i2c->abnormal_reset_count = 0; + wac_i2c->i2c_fail_count = 0; + wac_i2c->pen_out_count = 0; + + input_info(true, &wac_i2c->client->dev, "%s: clear\n", __func__); + + return count; +} + +static ssize_t epen_connection_check_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + + input_info(true, &client->dev, "%s: SDCONN:%d,SECCNT:%d,SADCVAL:%d,SECLVL:%d,SCALLVL:%d\n", + __func__, wac_i2c->connection_check, + wac_i2c->fail_channel, wac_i2c->min_adc_val, + wac_i2c->error_cal, wac_i2c->min_cal_val); + + return snprintf(buf, PAGE_SIZE, + "\"SDCONN\":\"%d\",\"SECCNT\":\"%d\",\"SADCVAL\":\"%d\",\"SECLVL\":\"%d\",\"SCALLVL\":\"%d\"", + wac_i2c->connection_check, wac_i2c->fail_channel, + wac_i2c->min_adc_val, wac_i2c->error_cal, + wac_i2c->min_cal_val); +} + +static ssize_t get_epen_pos_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + int max_x, max_y; + + if (wac_i2c->pdata->xy_switch) { + max_x = wac_i2c->pdata->max_y; + max_y = wac_i2c->pdata->max_x; + } else { + max_x = wac_i2c->pdata->max_x; + max_y = wac_i2c->pdata->max_y; + } + + input_info(true, &client->dev, + "%s: id(%d), x(%d), y(%d), max_x(%d), max_y(%d)\n", __func__, + wac_i2c->survey_pos.id, wac_i2c->survey_pos.x, wac_i2c->survey_pos.y, + max_x, max_y); + + return snprintf(buf, PAGE_SIZE, "%d,%d,%d,%d,%d\n", + wac_i2c->survey_pos.id, wac_i2c->survey_pos.x, wac_i2c->survey_pos.y, + max_x, max_y); +} + +static ssize_t flip_status_detect_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct sec_cmd_data *sec = dev_get_drvdata(dev); + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + + input_info(true, &wac_i2c->client->dev, "%s: %d\n", + __func__, wac_i2c->flip_state); + + return snprintf(buf, PAGE_SIZE, "%d\n", wac_i2c->flip_state); +} + +/* firmware update */ +static DEVICE_ATTR(epen_firm_update, (S_IWUSR | S_IWGRP), + NULL, epen_firmware_update_store); +/* return firmware update status */ +static DEVICE_ATTR(epen_firm_update_status, S_IRUGO, + epen_firm_update_status_show, NULL); +/* return firmware version */ +static DEVICE_ATTR(epen_firm_version, S_IRUGO, epen_firm_version_show, NULL); +static DEVICE_ATTR(ver_of_ic, S_IRUGO, epen_firm_version_of_ic_show, NULL); +static DEVICE_ATTR(ver_of_bin, S_IRUGO, epen_firm_version_of_bin_show, NULL); + +/* For SMD Test */ +static DEVICE_ATTR(epen_reset, (S_IWUSR | S_IWGRP), NULL, epen_reset_store); +static DEVICE_ATTR(epen_reset_result, S_IRUGO, epen_reset_result_show, NULL); +/* For SMD Test. Check checksum */ +static DEVICE_ATTR(epen_checksum, (S_IWUSR | S_IWGRP), + NULL, epen_checksum_store); +static DEVICE_ATTR(epen_checksum_result, S_IRUGO, + epen_checksum_result_show, NULL); +static DEVICE_ATTR(epen_connection, S_IRUGO, epen_connection_show, NULL); +static DEVICE_ATTR(epen_saving_mode, (S_IWUSR | S_IWGRP), + NULL, epen_saving_mode_store); +static DEVICE_ATTR(epen_wcharging_mode, (S_IRUGO | S_IWUSR | S_IWGRP), + epen_wcharging_mode_show, epen_wcharging_mode_store); +static DEVICE_ATTR(epen_disable_mode, (S_IWUSR | S_IWGRP), + NULL, epen_disable_mode_store); +static DEVICE_ATTR(screen_off_memo_enable, (S_IWUSR | S_IWGRP), + NULL, epen_screen_off_memo_enable_store); +static DEVICE_ATTR(get_epen_pos, + S_IRUGO, get_epen_pos_show, NULL); +static DEVICE_ATTR(aod_enable, (S_IWUSR | S_IWGRP), + NULL, epen_aod_enable_store); +static DEVICE_ATTR(aod_lcd_onoff_status, (S_IWUSR | S_IWGRP), + NULL, epen_aod_lcd_onoff_status_store); +static DEVICE_ATTR(aot_enable, (S_IWUSR | S_IWGRP), + NULL, epen_aot_enable_store); +static DEVICE_ATTR(hw_param, 0644, hardware_param_show, hardware_param_store); +static DEVICE_ATTR(epen_connection_check, S_IRUGO, + epen_connection_check_show, NULL); +#if WACOM_SEC_FACTORY +static DEVICE_ATTR(epen_fac_select_firmware, (S_IWUSR | S_IWGRP), + NULL, epen_fac_select_firmware_store); +#endif +static DEVICE_ATTR(flip_status_detect, 0444, + flip_status_detect_show, NULL); + +static struct attribute *epen_attributes[] = { + &dev_attr_epen_firm_update.attr, + &dev_attr_epen_firm_update_status.attr, + &dev_attr_epen_firm_version.attr, + &dev_attr_ver_of_ic.attr, + &dev_attr_ver_of_bin.attr, + &dev_attr_epen_reset.attr, + &dev_attr_epen_reset_result.attr, + &dev_attr_epen_checksum.attr, + &dev_attr_epen_checksum_result.attr, + &dev_attr_epen_connection.attr, + &dev_attr_epen_saving_mode.attr, + &dev_attr_epen_wcharging_mode.attr, + &dev_attr_epen_disable_mode.attr, + &dev_attr_screen_off_memo_enable.attr, + &dev_attr_get_epen_pos.attr, + &dev_attr_aod_enable.attr, + &dev_attr_aod_lcd_onoff_status.attr, + &dev_attr_aot_enable.attr, + &dev_attr_hw_param.attr, + &dev_attr_epen_connection_check.attr, +#if WACOM_SEC_FACTORY + &dev_attr_epen_fac_select_firmware.attr, +#endif + &dev_attr_flip_status_detect.attr, + NULL, +}; + +static struct attribute_group epen_attr_group = { + .attrs = epen_attributes, +}; + +static void print_spec_data(struct wacom_i2c *wac_i2c) +{ + struct wacom_elec_data *edata = wac_i2c->pdata->edata; + struct i2c_client *client = wac_i2c->client; + u8 tmp_buf[CMD_RESULT_WORD_LEN] = { 0 }; + u8 *buff; + int buff_size; + int i; + + buff_size = edata->max_x_ch > edata->max_y_ch ? edata->max_x_ch : edata->max_y_ch; + buff_size = CMD_RESULT_WORD_LEN * (buff_size + 1); + + buff = kzalloc(buff_size, GFP_KERNEL); + if (!buff) + return; + + input_info(true, &client->dev, "%s: shift_value %d, spec ver %d.%d", __func__, + edata->shift_value, edata->spec_ver[0], edata->spec_ver[1]); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "xx_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->xx_ref[i] * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "xy_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->xy_ref[i] * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "yx_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->yx_ref[i] * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "yy_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->yy_ref[i] * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "xx_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->xx_spec[i] / POWER_OFFSET * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "xy_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->xy_spec[i] / POWER_OFFSET * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "yx_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->yx_spec[i] / POWER_OFFSET * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "yy_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->yy_spec[i] / POWER_OFFSET * power(edata->shift_value)); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "rxx_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->rxx_ref[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "rxy_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->rxy_ref[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "ryx_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->ryx_ref[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "ryy_ref: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->ryy_ref[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "drxx_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->drxx_spec[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "drxy_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->drxy_spec[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "dryx_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->dryx_spec[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "dryy_spec: "); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, CMD_RESULT_WORD_LEN, "%lld ", + edata->dryy_spec[i] * power(edata->shift_value) / POWER_OFFSET); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, CMD_RESULT_WORD_LEN); + } + + input_info(true, &client->dev, "%s\n", buff); + memset(buff, 0x00, buff_size); + + kfree(buff); +} + +static void run_elec_test(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct wacom_elec_data *edata = NULL; + struct i2c_client *client = wac_i2c->client; + u8 *buff = NULL; + u8 tmp_buf[CMD_RESULT_WORD_LEN] = { 0 }; + u8 data[COM_ELEC_NUM] = { 0, }; + u16 tmp, offset; + u8 cmd; + int i, tx, rx; + int retry = RETRY_COUNT; + int ret; + int max_ch; + int buff_size; + u32 count; + int remain_data_count; + u16 *elec_result = NULL; + + sec_cmd_set_default_result(sec); + + input_info(true, &client->dev, "%s: parm[%d]\n", __func__, sec->cmd_param[0]); + + if (sec->cmd_param[0] < EPEN_ELEC_DATA_MAIN || sec->cmd_param[0] > EPEN_ELEC_DATA_UNIT) { + input_err(true, &client->dev, + "%s: Abnormal parm[%d]\n", __func__, sec->cmd_param[0]); + goto error; + } + + edata = wac_i2c->pdata->edata = wac_i2c->pdata->edatas[sec->cmd_param[0]]; + + if (!edata) { + input_err(true, &client->dev, "%s: test spec is NULL\n", __func__); + goto error; + } + + max_ch = edata->max_x_ch + edata->max_y_ch; + buff_size = max_ch * 2 * CMD_RESULT_WORD_LEN + SEC_CMD_STR_LEN; + + buff = kzalloc(buff_size, GFP_KERNEL); + if (!buff) + goto error; + + elec_result = kzalloc((max_ch + 1) * sizeof(u16), GFP_KERNEL); + if (!elec_result) + goto error; + + wacom_enable_irq(wac_i2c, false); + + /* change wacom mode to 0x2D */ + mutex_lock(&wac_i2c->mode_lock); + wacom_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_NONE); + mutex_unlock(&wac_i2c->mode_lock); + + /* wait for status event for normal mode of wacom */ + msleep(250); + do { + ret = wacom_i2c_recv(wac_i2c, data, COM_COORD_NUM); + if (ret != COM_COORD_NUM) { + input_err(true, &client->dev, "%s: failed to recv status data\n", + __func__); + msleep(50); + continue; + } + + /* check packet ID */ + if ((data[0] & 0x0F) != NOTI_PACKET && (data[1] != CMD_PACKET)) { + input_info(true, &client->dev, + "%s: invalid status data %d\n", + __func__, (RETRY_COUNT - retry + 1)); + } else { + break; + } + + msleep(50); + } while(retry--); + + retry = RETRY_COUNT; + cmd = COM_ELEC_XSCAN; + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", __func__, cmd); + goto error_test; + } + msleep(30); + + cmd = COM_ELEC_TRSX0; + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", __func__, cmd); + goto error_test; + } + msleep(30); + + cmd = COM_ELEC_SCAN_START; + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", __func__, cmd); + goto error_test; + } + msleep(30); + + for (tx = 0; tx < max_ch; tx++) { + /* x scan mode receive data through x coils */ + remain_data_count = edata->max_x_ch; + + do { + cmd = COM_ELEC_REQUESTDATA; + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", + __func__, cmd); + goto error_test; + } + msleep(30); + + ret = wacom_i2c_recv(wac_i2c, data, COM_ELEC_NUM); + if (ret != COM_ELEC_NUM) { + input_err(true, &client->dev, + "%s: failed to receive elec data\n", + __func__); + goto error_test; + } +#if 0 + input_info(true, &client->dev, "%X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X\n", + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9], + data[10], data[11], data[12], data[13], data[14], data[15], data[16], data[17], data[18], data[19], + data[20], data[21], data[22], data[23], data[24], data[25], data[26], data[27], data[28], data[29], + data[30], data[31], data[32], data[33], data[34], data[35], data[36], data[37]); +#endif + /* check packet ID & sub packet ID */ + if (((data[0] & 0x0F) != 0x0E) && (data[1] != 0x65)) { + input_info(true, &client->dev, + "%s: %d data of wacom elec\n", + __func__, (RETRY_COUNT - retry + 1)); + if (--retry) { + continue; + } else { + input_err(true, &client->dev, + "%s: invalid elec data %d %d\n", + __func__, (data[0] & 0x0F), data[1]); + goto error_test; + } + } + + if (data[11] != 3) { + input_info(true, &client->dev, + "%s: %d data of wacom elec\n", + __func__, (RETRY_COUNT - retry + 1)); + if (--retry) { + continue; + } else { + input_info(true, &client->dev, + "%s: invalid elec status %d\n", + __func__, data[11]); + goto error_test; + } + } + + for (i = 0; i < COM_ELEC_DATA_NUM; i++) { + if (!remain_data_count) + break; + + offset = COM_ELEC_DATA_POS + (i * 2); + tmp = ((u16)(data[offset]) << 8) + data[offset + 1]; + rx = data[13] + i; + + edata->elec_data[rx * max_ch + tx] = tmp; + + remain_data_count--; + } + } while (remain_data_count); + + cmd = COM_ELEC_TRSCON; + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to send 0x%02X\n", + __func__, cmd); + goto error_test; + } + msleep(30); + } + + cmd = COM_ELEC_YSCAN; + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", __func__, cmd); + goto error_test; + } + msleep(30); + + cmd = COM_ELEC_TRSX0; + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", __func__, cmd); + goto error_test; + } + msleep(30); + + cmd = COM_ELEC_SCAN_START; + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", __func__, cmd); + goto error_test; + } + msleep(30); + + for (tx = 0; tx < max_ch; tx++) { + /* y scan mode receive data through y coils */ + remain_data_count = edata->max_y_ch; + + do { + cmd = COM_ELEC_REQUESTDATA; + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, + "%s: failed to send 0x%02X\n", + __func__, cmd); + goto error_test; + } + msleep(30); + + ret = wacom_i2c_recv(wac_i2c, data, COM_ELEC_NUM); + if (ret != COM_ELEC_NUM) { + input_err(true, &client->dev, + "%s: failed to receive elec data\n", + __func__); + goto error_test; + } +#if 0 + input_info(true, &client->dev, "%X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X\n", + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9], + data[10], data[11], data[12], data[13], data[14], data[15], data[16], data[17], data[18], data[19], + data[20], data[21], data[22], data[23], data[24], data[25], data[26], data[27], data[28], data[29], + data[30], data[31], data[32], data[33], data[34], data[35], data[36], data[37]); +#endif + /* check packet ID & sub packet ID */ + if (((data[0] & 0x0F) != 0x0E) && (data[1] != 0x65)) { + input_info(true, &client->dev, + "%s: %d data of wacom elec\n", + __func__, (RETRY_COUNT - retry + 1)); + if (--retry) { + continue; + } else { + input_err(true, &client->dev, + "%s: invalid elec data %d %d\n", + __func__, (data[0] & 0x0F), data[1]); + goto error_test; + } + } + + if (data[11] != 3) { + input_info(true, &client->dev, + "%s: %d data of wacom elec\n", + __func__, (RETRY_COUNT - retry + 1)); + if (--retry) { + continue; + } else { + input_info(true, &client->dev, + "%s: invalid elec status %d\n", + __func__, data[11]); + goto error_test; + } + } + + for (i = 0; i < COM_ELEC_DATA_NUM; i++) { + if (!remain_data_count) + break; + + offset = COM_ELEC_DATA_POS + (i * 2); + tmp = ((u16)(data[offset]) << 8) + data[offset + 1]; + rx = edata->max_x_ch + data[13] + i; + + edata->elec_data[rx * max_ch + tx] = tmp; + + remain_data_count--; + } + } while (remain_data_count); + + cmd = COM_ELEC_TRSCON; + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to send 0x%02X\n", + __func__, cmd); + goto error_test; + } + msleep(30); + } + + print_spec_data(wac_i2c); + + print_elec_data(wac_i2c); + + /* tx about x coil */ + for (tx = 0, i = 0; tx < edata->max_x_ch; tx++, i++) { + edata->xx[i] = 0; + edata->xy[i] = 0; + /* rx about x coil */ + for (rx = 0; rx < edata->max_x_ch; rx++) { + offset = rx * max_ch + tx; + if ((edata->elec_data[offset] > edata->xx[i]) && (tx != rx)) + edata->xx[i] = edata->elec_data[offset]; + } + /* rx about y coil */ + for (rx = edata->max_x_ch; rx < max_ch; rx++) { + offset = rx * max_ch + tx; + if (edata->elec_data[offset] > edata->xy[i]) + edata->xy[i] = edata->elec_data[offset]; + } + } + + /* tx about y coil */ + for (tx = edata->max_x_ch, i = 0; tx < max_ch; tx++, i++) { + edata->yx[i] = 0; + edata->yy[i] = 0; + /* rx about x coil */ + for (rx = 0; rx < edata->max_x_ch; rx++) { + offset = rx * max_ch + tx; + if (edata->elec_data[offset] > edata->yx[i]) + edata->yx[i] = edata->elec_data[offset]; + } + /* rx about y coil */ + for (rx = edata->max_x_ch; rx < max_ch; rx++) { + offset = rx * max_ch + tx; + if ((edata->elec_data[offset] > edata->yy[i]) && (rx != tx)) + edata->yy[i] = edata->elec_data[offset]; + } + } + + print_trx_data(wac_i2c); + + calibration_trx_data(wac_i2c); + + print_cal_trx_data(wac_i2c); + + calculate_ratio(wac_i2c); + + print_ratio_trx_data(wac_i2c); + + make_decision(wac_i2c, elec_result); + + print_difference_ratio_trx_data(wac_i2c); + + count = elec_result[0] >> 8; + if (!count) { + snprintf(tmp_buf, sizeof(tmp_buf), "0_"); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } else { + if (count > 3) + snprintf(tmp_buf, sizeof(tmp_buf), "3,"); + else + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", count); + + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + + for (i = 0, count = 0; i < max_ch; i++) { + if ((elec_result[i + 1] & SEC_SHORT) && count < 3) { + if (i < edata->max_x_ch) + snprintf(tmp_buf, sizeof(tmp_buf), "X%d,", i); + else + snprintf(tmp_buf, sizeof(tmp_buf), "Y%d,", i - edata->max_x_ch); + + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + count++; + } + } + buff[strlen(buff) - 1] = '_'; + } + + count = elec_result[0] & 0x00FF; + if (!count) { + snprintf(tmp_buf, sizeof(tmp_buf), "0_"); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } else { + if (count > 3) + snprintf(tmp_buf, sizeof(tmp_buf), "3,"); + else + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", count); + + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + + for (i = 0, count = 0; i < max_ch; i++) { + if ((elec_result[i + 1] & SEC_OPEN) && count < 3) { + if (i < edata->max_x_ch) + snprintf(tmp_buf, sizeof(tmp_buf), "X%d,", i); + else + snprintf(tmp_buf, sizeof(tmp_buf), "Y%d,", i - edata->max_x_ch); + + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + count++; + } + } + buff[strlen(buff) - 1] = '_'; + } + + snprintf(tmp_buf, sizeof(tmp_buf), "%d,%d_", edata->max_x_ch, edata->max_y_ch); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", edata->xx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } + + for (i = 0; i < edata->max_x_ch; i++) { + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", edata->xy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", edata->yx[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } + + for (i = 0; i < edata->max_y_ch; i++) { + snprintf(tmp_buf, sizeof(tmp_buf), "%d,", edata->yy[i]); + strlcat(buff, tmp_buf, buff_size); + memset(tmp_buf, 0x00, sizeof(tmp_buf)); + } + + sec_cmd_set_cmd_result(sec, buff, buff_size); + sec->cmd_state = SEC_CMD_STATUS_OK; + + kfree(elec_result); + kfree(buff); + + ret = wacom_start_stop_cmd(wac_i2c, WACOM_STOP_AND_START_CMD); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to set stop-start cmd, %d\n", + __func__, ret); + } + + wacom_enable_irq(wac_i2c, true); + + return; + +error_test: + ret = wacom_start_stop_cmd(wac_i2c, WACOM_STOP_AND_START_CMD); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to set stop-start cmd, %d\n", + __func__, ret); + } + + wacom_enable_irq(wac_i2c, true); + +error: + if (elec_result) + kfree(elec_result); + + if (buff) + kfree(buff); + + snprintf(tmp_buf, sizeof(tmp_buf), "NG"); + sec_cmd_set_cmd_result(sec, tmp_buf, sizeof(tmp_buf)); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + + return; +} + +static void ready_elec_test(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + char data; + int ret; + + sec_cmd_set_default_result(sec); + + if (sec->cmd_param[0]) + data = COM_ASYNC_VSYNC; + else + data = COM_SYNC_VSYNC; + + ret = wacom_i2c_send(wac_i2c, &data, 1); + if (ret != 1) { + input_err(true, &wac_i2c->client->dev, + "%s: failed to send data(%02x, %d)\n", + __func__, data, ret); + snprintf(buff, sizeof(buff), "NG\n"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + + goto out; + } + + msleep(30); + + snprintf(buff, sizeof(buff), "OK\n"); + sec->cmd_state = SEC_CMD_STATUS_OK; + +out: + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + + input_info(true, &wac_i2c->client->dev, "%s: %02x %s\n", + __func__, data, buff); + + return; +} + +static void get_elec_test_ver(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + if (sec->cmd_param[0] < EPEN_ELEC_DATA_MAIN || sec->cmd_param[0] > EPEN_ELEC_DATA_UNIT) { + input_err(true, &wac_i2c->client->dev, + "%s: Abnormal parm[%d]\n", __func__, sec->cmd_param[0]); + goto err_out; + } + + if (wac_i2c->pdata->edatas[sec->cmd_param[0]] == NULL) { + input_err(true, &wac_i2c->client->dev, + "%s: Elec test spec is null[%d]\n", __func__, sec->cmd_param[0]); + goto err_out; + } + + snprintf(buff, sizeof(buff), "%d.%d", + wac_i2c->pdata->edatas[sec->cmd_param[0]]->spec_ver[0], + wac_i2c->pdata->edatas[sec->cmd_param[0]]->spec_ver[1]); + + input_info(true, &wac_i2c->client->dev, "%s: pos[%d] ver(%s)\n", + __func__, sec->cmd_param[0], buff); + + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_OK; + return; + +err_out: + snprintf(buff, sizeof(buff), "NG"); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + return; + +} + +/* have to add cmd from Q os for garage test */ +static void get_chip_name(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + if (wac_i2c->pdata->img_version_of_ic[0] == MPU_W9018) + snprintf(buff, sizeof(buff), "W9018"); + else if (wac_i2c->pdata->img_version_of_ic[0] == MPU_W9019) + snprintf(buff, sizeof(buff), "W9019"); + else if (wac_i2c->pdata->img_version_of_ic[0] == MPU_W9020) + snprintf(buff, sizeof(buff), "W9020"); + else if (wac_i2c->pdata->img_version_of_ic[0] == MPU_W9021) + snprintf(buff, sizeof(buff), "W9021"); + else if (wac_i2c->pdata->img_version_of_ic[0] == MPU_WEZ01) + snprintf(buff, sizeof(buff), "WEZ01"); + else + snprintf(buff, sizeof(buff), "N/A"); + + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_OK; +} + +/* Factory cmd for firmware update + * argument represent what is source of firmware like below. + * + * 0 : [BUILT_IN] Getting firmware which is for user. + * 1 : [UMS] Getting firmware from sd card. + * 2 : none + * 3 : [FFU] Getting firmware from apk. + */ + +static void fw_update(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + int ret = 0; + + sec_cmd_set_default_result(sec); + + if (!wac_i2c->power_enable) { + input_err(true, &wac_i2c->client->dev, "%s: [ERROR] Wacom is stopped\n", __func__); + goto err_out; + } + + if (sec->cmd_param[0] < 0 || sec->cmd_param[0] > WACOM_VERIFICATION) { + input_err(true, &wac_i2c->client->dev, "%s: [ERROR] parm error![%d]\n", + __func__, sec->cmd_param[0]); + goto err_out; + } + + mutex_lock(&wac_i2c->lock); + + switch (sec->cmd_param[0]) { + case WACOM_BUILT_IN: + ret = wacom_fw_update_on_hidden_menu(wac_i2c, FW_BUILT_IN); + break; + case WACOM_SDCARD: +#if WACOM_PRODUCT_SHIP + ret = wacom_fw_update_on_hidden_menu(wac_i2c, FW_IN_SDCARD_SIGNED); +#else + ret = wacom_fw_update_on_hidden_menu(wac_i2c, FW_IN_SDCARD); +#endif + break; + case WACOM_SPU: + ret = wacom_fw_update_on_hidden_menu(wac_i2c, FW_SPU); + break; + case WACOM_VERIFICATION: + ret = wacom_fw_update_on_hidden_menu(wac_i2c, FW_VERIFICATION); + break; + default: + input_err(true, &wac_i2c->client->dev, "%s: Not support command[%d]\n", + __func__, sec->cmd_param[0]); + mutex_unlock(&wac_i2c->lock); + goto err_out; + } + + mutex_unlock(&wac_i2c->lock); + + if (ret) { + input_err(true, &wac_i2c->client->dev, "%s: Wacom fw upate(%d) fail ret [%d]\n", + __func__, sec->cmd_param[0], ret); + goto err_out; + } + + input_info(true, &wac_i2c->client->dev, "%s: Wacom fw upate[%d]\n", __func__, sec->cmd_param[0]); + + snprintf(buff, sizeof(buff), "OK\n"); + sec->cmd_state = SEC_CMD_STATUS_OK; + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + + input_info(true, &wac_i2c->client->dev, "%s: Done\n", __func__); + + return; + +err_out: + snprintf(buff, sizeof(buff), "NG"); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + return; + +} + +static void get_fw_ver_bin(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + snprintf(buff, sizeof(buff), "%02X%02X%02X%02X", + wac_i2c->pdata->img_version_of_bin[0], wac_i2c->pdata->img_version_of_bin[1], + wac_i2c->pdata->img_version_of_bin[2], wac_i2c->pdata->img_version_of_bin[3]); + + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_OK; +} + +static void get_fw_ver_ic(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; +#if IS_ENABLED(CONFIG_SEC_FACTORY) + int i; +#endif + + sec_cmd_set_default_result(sec); + +#if IS_ENABLED(CONFIG_SEC_FACTORY) + for (i = 0; i < 4; i++) + wac_i2c->pdata->img_version_of_ic[i] = 0; + + wacom_i2c_query(wac_i2c); +#endif + + snprintf(buff, sizeof(buff), "%02X%02X%02X%02X", + wac_i2c->pdata->img_version_of_ic[0], wac_i2c->pdata->img_version_of_ic[1], + wac_i2c->pdata->img_version_of_ic[2], wac_i2c->pdata->img_version_of_ic[3]); + + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_OK; +} + +static void set_ic_reset(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + wacom_enable_irq(wac_i2c, false); + + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + + /* Reset IC */ + wacom_reset_hw(wac_i2c); + /* I2C Test */ + wacom_i2c_query(wac_i2c); + + wacom_enable_irq(wac_i2c, true); + + input_info(true, &wac_i2c->client->dev, "%s: result %d\n", __func__, wac_i2c->query_status); + + if (wac_i2c->query_status) { + snprintf(buff, sizeof(buff), "OK"); + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + snprintf(buff, sizeof(buff), "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} + +static void get_checksum(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + wacom_enable_irq(wac_i2c, false); + + wacom_checksum(wac_i2c); + + wacom_enable_irq(wac_i2c, true); + + input_info(true, &wac_i2c->client->dev, + "%s: result %d\n", __func__, wac_i2c->checksum_result); + + if (wac_i2c->checksum_result) { + snprintf(buff, sizeof(buff), "OK"); + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + snprintf(buff, sizeof(buff), "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} + +static void get_digitizer_connection(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + struct i2c_client *client = wac_i2c->client; +#if WACOM_SEC_FACTORY + int ret; +#endif + + input_info(true, &client->dev, "%s\n", __func__); + + sec_cmd_set_default_result(sec); + +#if WACOM_SEC_FACTORY + ret = wacom_check_ub(wac_i2c->client); + if (!ret) { + input_info(true, &client->dev, "%s: digitizer is not attached\n", __func__); + goto out; + } +#endif + + get_connection_test(wac_i2c, WACOM_DIGITIZER_TEST); + +#if WACOM_SEC_FACTORY +out: +#endif + if (wac_i2c->pdata->module_ver == 0x2) { + snprintf(buff, sizeof(buff), "%s %d %d %d %s %d\n", + wac_i2c->connection_check ? "OK" : "NG", + wac_i2c->pdata->module_ver, wac_i2c->fail_channel, + wac_i2c->min_adc_val, wac_i2c->error_cal ? "NG" : "OK", + wac_i2c->min_cal_val); + } else { + snprintf(buff, sizeof(buff), "%s %d %d %d\n", + wac_i2c->connection_check ? "OK" : "NG", + wac_i2c->pdata->module_ver, wac_i2c->fail_channel, + wac_i2c->min_adc_val); + } + + if (wac_i2c->connection_check) { + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} + +static void get_garage_connection(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + struct i2c_client *client = wac_i2c->client; + + input_info(true, &client->dev, "%s\n", __func__); + + sec_cmd_set_default_result(sec); + + if (!wac_i2c->pdata->support_garage_open_test) { + input_err(true, &client->dev, "%s: not support garage open test", __func__); + + snprintf(buff, sizeof(buff), "NA"); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_NOT_APPLICABLE; + sec_cmd_set_cmd_exit(sec); + return; + } + + get_connection_test(wac_i2c, WACOM_GARAGE_TEST); + + if (wac_i2c->pdata->module_ver == 0x2) { + snprintf(buff, sizeof(buff), "%s %d %d %d %s %d\n", + wac_i2c->garage_connection_check ? "OK" : "NG", + wac_i2c->pdata->module_ver, wac_i2c->garage_fail_channel, + wac_i2c->garage_min_adc_val, wac_i2c->garage_error_cal ? "NG" : "OK", + wac_i2c->garage_min_cal_val); + } else { + snprintf(buff, sizeof(buff), "%s %d %d %d\n", + wac_i2c->garage_connection_check ? "OK" : "NG", + wac_i2c->pdata->module_ver, wac_i2c->garage_fail_channel, + wac_i2c->garage_min_adc_val); + } + + if (wac_i2c->garage_connection_check) { + sec->cmd_state = SEC_CMD_STATUS_OK; + } else { + sec->cmd_state = SEC_CMD_STATUS_FAIL; + } + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} + +static void set_saving_mode(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + static u32 call_count; + + sec_cmd_set_default_result(sec); + + if(sec->cmd_param[0] < 0 || sec->cmd_param[0] > 1) { + input_err(true, &client->dev, "%s: Abnormal parm[%d]\n", + __func__, sec->cmd_param[0]); + snprintf(buff, sizeof(buff), "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto fail; + } + + if (call_count < 0xFFFFFFF0) + call_count++; + + wac_i2c->battery_saving_mode = sec->cmd_param[0]; + + input_info(true, &client->dev, "%s: ps %s & pen %s [%d]\n", + __func__, wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_result & EPEN_EVENT_PEN_OUT) ? "out" : "in", + call_count); + + if (!wac_i2c->power_enable && wac_i2c->battery_saving_mode) { + input_err(true, &client->dev, "%s: already power off, save & return\n", __func__); + goto out; + } + + if (!(wac_i2c->function_result & EPEN_EVENT_PEN_OUT)) { + wacom_select_survey_mode(wac_i2c, wac_i2c->screen_on); + + if (wac_i2c->battery_saving_mode) + forced_release_fullscan(wac_i2c); + } + +out: + snprintf(buff, sizeof(buff), "OK"); + sec->cmd_state = SEC_CMD_STATUS_OK; + +fail: + input_info(true, &client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void get_insert_status(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + int pen_state = (wac_i2c->function_result & EPEN_EVENT_PEN_OUT); + + sec_cmd_set_default_result(sec); + + input_info(true, &wac_i2c->client->dev, "%s : pen is %s\n", + __func__, pen_state ? "OUT" : "IN"); + + sec->cmd_state = SEC_CMD_STATUS_OK; + snprintf(buff, sizeof(buff), "%d\n", pen_state ? 0 : 1); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} + +static void set_wcharging_mode(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + int ret; + + sec_cmd_set_default_result(sec); + + wac_i2c->wcharging_mode = sec->cmd_param[0]; + input_info(true, &client->dev, "%s: %d\n", __func__, wac_i2c->wcharging_mode); + + if (!wac_i2c->power_enable) { + input_err(true, &wac_i2c->client->dev, + "%s: power off, save & return\n", __func__); + sec->cmd_state = SEC_CMD_STATUS_OK; + goto out; + } + + ret = wacom_i2c_set_sense_mode(wac_i2c); + if (ret < 0) { + input_err(true, &client->dev, "%s: do not set sensitivity mode, %d\n", + __func__, ret); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; + } + sec->cmd_state = SEC_CMD_STATUS_OK; + +out: + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + else + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void get_wcharging_mode(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, + !wac_i2c->wcharging_mode ? "NORMAL" : "LOWSENSE"); + + sec->cmd_state = SEC_CMD_STATUS_OK; + snprintf(buff, sizeof(buff), "%s\n", !wac_i2c->wcharging_mode ? "NORMAL" : "LOWSENSE"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} + +static void set_disable_mode(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + if (sec->cmd_param[0]) + wacom_disable_mode(wac_i2c, WACOM_DISABLE); + else + wacom_disable_mode(wac_i2c, WACOM_ENABLE); + + snprintf(buff, sizeof(buff), "OK"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void set_screen_off_memo(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + int val = 0; + + sec_cmd_set_default_result(sec); + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, "%s : Not support screen off memo mode(%d) in Factory Bin\n", + __func__, sec->cmd_param[0]); + + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; +#endif + + val = !(!sec->cmd_param[0]); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO; + else + wac_i2c->function_set &= (~EPEN_SETMODE_AOP_OPTION_SCREENOFFMEMO); + + input_info(true, &client->dev, + "%s: ps %s aop(%d) set(0x%x) ret(0x%x)\n", __func__, + wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_set & EPEN_SETMODE_AOP) ? 1 : 0, + wac_i2c->function_set, wac_i2c->function_result); + + if (!wac_i2c->screen_on) + wacom_select_survey_mode(wac_i2c, false); + + sec->cmd_state = SEC_CMD_STATUS_OK; + +#if WACOM_SEC_FACTORY +out: +#endif + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + else + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void set_epen_aod_enable(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + int val = 0; + + sec_cmd_set_default_result(sec); + sec->cmd_state = SEC_CMD_STATUS_OK; + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, "%s : Not support aod mode(%d) in Factory Bin\n", + __func__, val); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; +#endif + + val = !(!sec->cmd_param[0]); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_AOD_LCD_OFF; + else + wac_i2c->function_set &= ~EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON; + + input_info(true, &client->dev, + "%s: ps %s aop(%d) set(0x%x) ret(0x%x)\n", __func__, + wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_set & EPEN_SETMODE_AOP) ? 1 : 0, + wac_i2c->function_set, wac_i2c->function_result); + + if (!wac_i2c->screen_on) + wacom_select_survey_mode(wac_i2c, false); + +#if WACOM_SEC_FACTORY +out: +#endif + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + else + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void set_aod_lcd_onoff_status(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + int val = 0; + int ret; + + sec_cmd_set_default_result(sec); + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, "%s : Not support aod mode(%d) in Factory Bin\n", + __func__, val); + + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; +#endif + + val = !(!sec->cmd_param[0]); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_AOD_LCD_STATUS; + else + wac_i2c->function_set &= ~EPEN_SETMODE_AOP_OPTION_AOD_LCD_STATUS; + + if (!(wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_AOD) || wac_i2c->screen_on) { + sec->cmd_state = SEC_CMD_STATUS_OK; + goto out; + } + + if (wac_i2c->survey_mode == EPEN_SURVEY_MODE_GARAGE_AOP) { + if ((wac_i2c->function_set & EPEN_SETMODE_AOP_OPTION_AOD_LCD_ON) + == EPEN_SETMODE_AOP_OPTION_AOD_LCD_OFF) { + forced_release_fullscan(wac_i2c); + } + + mutex_lock(&wac_i2c->mode_lock); + wacom_i2c_set_survey_mode(wac_i2c, wac_i2c->survey_mode); + mutex_unlock(&wac_i2c->mode_lock); + } + + ret = wacom_i2c_set_sense_mode(wac_i2c); + if (ret < 0) { + input_err(true, &client->dev, "%s: do not set sensitivity mode, %d\n", + __func__, ret); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; + } + sec->cmd_state = SEC_CMD_STATUS_OK; + +out: + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + else + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void set_epen_aot_enable(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + int val = 0; + + sec_cmd_set_default_result(sec); + sec->cmd_state = SEC_CMD_STATUS_OK; + +#if WACOM_SEC_FACTORY + input_info(true, &client->dev, "%s : Not support aod mode(%d) in Factory Bin\n", + __func__, val); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; +#endif + + val = !(!sec->cmd_param[0]); + + if (val) + wac_i2c->function_set |= EPEN_SETMODE_AOP_OPTION_AOT; + else + wac_i2c->function_set &= (~EPEN_SETMODE_AOP_OPTION_AOT); + + input_info(true, &client->dev, + "%s: ps %s aop(%d) set(0x%x) ret(0x%x)\n", __func__, + wac_i2c->battery_saving_mode ? "on" : "off", + (wac_i2c->function_set & EPEN_SETMODE_AOP) ? 1 : 0, + wac_i2c->function_set, wac_i2c->function_result); + + if (!wac_i2c->screen_on) + wacom_select_survey_mode(wac_i2c, false); + +#if WACOM_SEC_FACTORY +out: +#endif + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + else + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +#if WACOM_SEC_FACTORY +/* k|K|0 : FW_BUILT_IN, t|T|1 : FW_FACTORY_GARAGE u|U|2 : FW_FACTORY_UNIT */ +static void set_fac_select_firmware(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + u8 fw_update_way = FW_NONE; + int ret; + + sec_cmd_set_default_result(sec); + + switch (sec->cmd_param[0]) { + case 0: + fw_update_way = FW_BUILT_IN; + break; + case 1: + fw_update_way = FW_FACTORY_GARAGE; + break; + case 2: + fw_update_way = FW_FACTORY_UNIT; + break; + default: + input_err(true, &client->dev, "wrong parameter\n"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; + } + + ret = wacom_i2c_load_fw(wac_i2c, fw_update_way); + if (ret < 0) { + input_info(true, &client->dev, "%s: failed to load fw data\n", __func__); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; + } + + wacom_i2c_unload_fw(wac_i2c); + + sec->cmd_state = SEC_CMD_STATUS_OK; + +out: + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + else + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void set_fac_garage_mode(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + int ret; + + sec_cmd_set_default_result(sec); + sec->cmd_state = SEC_CMD_STATUS_OK; + + if (sec->cmd_param[0] < 0 || sec->cmd_param[0] > 1 ) { + input_err(true, &client->dev, "%s: abnormal param(%d)\n", + __func__, sec->cmd_param[0]); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + goto out; + } + + if (sec->cmd_param[0]) { + /* change normal mode for garage monitoring */ + mutex_lock(&wac_i2c->mode_lock); + wacom_i2c_set_survey_mode(wac_i2c, EPEN_SURVEY_MODE_NONE); + mutex_unlock(&wac_i2c->mode_lock); + + ret = wacom_start_stop_cmd(wac_i2c, WACOM_STOP_CMD); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to set stop cmd, %d\n", + __func__, ret); + wac_i2c->fac_garage_mode = 0; + goto fail_out; + } + + wac_i2c->fac_garage_mode = 1; + + } else { + wac_i2c->fac_garage_mode = 0; + + ret = wacom_start_stop_cmd(wac_i2c, WACOM_STOP_AND_START_CMD); + if (ret != 1) { + input_err(true, &client->dev, "%s: failed to set stop cmd, %d\n", + __func__, ret); + goto fail_out; + } + + /* recovery wacom mode */ + wacom_select_survey_mode(wac_i2c, wac_i2c->screen_on); + } + + input_info(true, &client->dev, "%s: done(%d)\n", __func__, sec->cmd_param[0]); + +out: + if (sec->cmd_state == SEC_CMD_STATUS_OK) + snprintf(buff, sizeof(buff), "OK"); + else + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); + + return; + +fail_out: + /* recovery wacom mode */ + wacom_select_survey_mode(wac_i2c, wac_i2c->screen_on); + + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buff, sizeof(buff), "NG"); + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); + +} + +static void get_fac_garage_mode(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + sec->cmd_state = SEC_CMD_STATUS_OK; + + snprintf(buff, sizeof(buff), "garage mode %s", + wac_i2c->fac_garage_mode ? "IN" : "OUT"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); +} + +static void get_fac_garage_rawdata(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + struct i2c_client *client = wac_i2c->client; + char buff[SEC_CMD_STR_LEN] = { 0 }; + char data[17] = { 0, }; + int ret, retry = 1; + u8 cmd; + + sec_cmd_set_default_result(sec); + sec->cmd_state = SEC_CMD_STATUS_OK; + + if (!wac_i2c->fac_garage_mode) { + input_err(true, &client->dev, "%s: not in factory garage mode\n", __func__); + goto out; + } + +get_garage_retry: + wacom_enable_irq(wac_i2c, false); + + cmd = COM_REQUEST_GARAGEDATA; + ret = wacom_i2c_send(wac_i2c, &cmd, 1); + if (ret < 0) { + input_err(true, &client->dev, "failed to send request garage data command %d\n", ret); + msleep(30); + + goto fail_out; + } + + msleep(30); + + ret = wacom_i2c_recv(wac_i2c, data, sizeof(data)); + if (ret < 0) { + input_err(true, &client->dev, "failed to read garage raw data, %d\n", ret); + + wac_i2c->garage_freq0 = wac_i2c->garage_freq1 = 0; + wac_i2c->garage_gain0 = wac_i2c->garage_gain1 = 0; + + goto fail_out; + } + + wacom_enable_irq(wac_i2c, true); + + input_info(true, &client->dev, "%x %x %x %x %x %x %x %x %x %x\n", + data[2], data[3], data[4], data[5], data[6], data[7], + data[8], data[9], data[10], data[11]); + + wac_i2c->garage_gain0 = data[6]; + wac_i2c->garage_freq0 = ((u16)data[7] << 8) + data[8]; + + wac_i2c->garage_gain1 = data[9]; + wac_i2c->garage_freq1 = ((u16)data[10] << 8) + data[11]; + + if (wac_i2c->garage_freq0 == 0 && retry > 0) { + retry--; + goto get_garage_retry; + } + + snprintf(buff, sizeof(buff), "%d,%d,%d,%d", + wac_i2c->garage_gain0, wac_i2c->garage_freq0, + wac_i2c->garage_gain1, wac_i2c->garage_freq1); + + input_info(true, &client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + return; + +fail_out: + wacom_enable_irq(wac_i2c, true); +out: + sec->cmd_state = SEC_CMD_STATUS_FAIL; + snprintf(buff, sizeof(buff), "NG"); + + input_info(true, &wac_i2c->client->dev, "%s: %s\n", __func__, buff); + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); +} +#endif + +static void debug(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + wac_i2c->debug_flag = sec->cmd_param[0]; + + snprintf(buff, sizeof(buff), "OK"); + + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_NOT_APPLICABLE; + sec_cmd_set_cmd_exit(sec); +} + +static void set_cover_type(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + struct wacom_i2c *wac_i2c = container_of(sec, struct wacom_i2c, sec); + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + + if (wac_i2c->pdata->support_cover_noti) { + if (sec->cmd_param[0] < 0 || sec->cmd_param[0] > 2) { + input_err(true, &wac_i2c->client->dev, "%s: Not support command[%d]\n", + __func__, sec->cmd_param[0]); + goto err_out; + } else + wac_i2c->cover = sec->cmd_param[0]; + }else { + input_err(true, &wac_i2c->client->dev, "%s: Not support notice cover command\n", + __func__); + goto err_out; + } + + if (!wac_i2c->power_enable) { + input_err(true, &wac_i2c->client->dev, "%s: [ERROR] Wacom is stopped\n", __func__); + goto err_out; + } + + input_info(true, &wac_i2c->client->dev, "%s: %d\n", __func__, sec->cmd_param[0]); + + wacom_swap_compensation(wac_i2c, wac_i2c->cover); + + snprintf(buff, sizeof(buff), "OK\n"); + sec->cmd_state = SEC_CMD_STATUS_OK; + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); + + input_info(true, &wac_i2c->client->dev, "%s: Done\n", __func__); + + return; + +err_out: + snprintf(buff, sizeof(buff), "NG"); + sec->cmd_state = SEC_CMD_STATUS_FAIL; + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec_cmd_set_cmd_exit(sec); + + input_info(true, &wac_i2c->client->dev, "%s: Fail\n", __func__); + + return; +} + +static void not_support_cmd(void *device_data) +{ + struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; + char buff[SEC_CMD_STR_LEN] = { 0 }; + + sec_cmd_set_default_result(sec); + snprintf(buff, sizeof(buff), "NA"); + + sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); + sec->cmd_state = SEC_CMD_STATUS_NOT_APPLICABLE; + sec_cmd_set_cmd_exit(sec); +} + +static struct sec_cmd sec_cmds[] = { + {SEC_CMD_H("run_elec_test", run_elec_test),}, + {SEC_CMD_H("ready_elec_test", ready_elec_test),}, + {SEC_CMD_H("get_elec_test_ver", get_elec_test_ver),}, + {SEC_CMD("fw_update", fw_update),}, + {SEC_CMD("get_fw_ver_bin", get_fw_ver_bin),}, + {SEC_CMD("get_fw_ver_ic", get_fw_ver_ic),}, + {SEC_CMD("set_ic_reset", set_ic_reset),}, + {SEC_CMD("get_chip_name", get_chip_name),}, + {SEC_CMD("get_checksum", get_checksum),}, + {SEC_CMD("get_digitizer_connection", get_digitizer_connection),}, + {SEC_CMD("get_garage_connection", get_garage_connection),}, + {SEC_CMD_H("set_saving_mode", set_saving_mode),}, + {SEC_CMD("get_insert_status", get_insert_status),}, + {SEC_CMD_H("set_wcharging_mode", set_wcharging_mode),}, + {SEC_CMD("get_wcharging_mode", get_wcharging_mode),}, + {SEC_CMD_H("set_disable_mode", set_disable_mode),}, + {SEC_CMD("set_screen_off_memo", set_screen_off_memo),}, + {SEC_CMD("set_epen_aod_enable", set_epen_aod_enable),}, + {SEC_CMD("set_aod_lcd_onoff_status", set_aod_lcd_onoff_status),}, + {SEC_CMD("set_epen_aot_enable", set_epen_aot_enable),}, +#if WACOM_SEC_FACTORY + {SEC_CMD_H("set_fac_select_firmware", set_fac_select_firmware),}, + {SEC_CMD("set_fac_garage_mode", set_fac_garage_mode),}, + {SEC_CMD("get_fac_garage_mode", get_fac_garage_mode),}, + {SEC_CMD("get_fac_garage_rawdata", get_fac_garage_rawdata),}, +#endif + {SEC_CMD("debug", debug),}, + {SEC_CMD("set_cover_type", set_cover_type),}, + {SEC_CMD("not_support_cmd", not_support_cmd),}, +}; + +static int wacom_sec_elec_init(struct wacom_i2c *wac_i2c, int pos) +{ + struct wacom_elec_data *edata = NULL; + struct i2c_client *client = wac_i2c->client; + struct device_node *np = wac_i2c->client->dev.of_node; + u32 tmp[2]; + int max_len; + int ret; + int i; + u8 tmp_name[30] = { 0 }; + + snprintf(tmp_name, sizeof(tmp_name), "wacom_elec%d", pos); + input_info(true, &client->dev, "%s: init : %s\n", __func__, tmp_name); + + np = of_get_child_by_name(np, tmp_name); + if (!np) { + input_err(true, &client->dev, "%s: node is not exist for elec\n", __func__); + return -EINVAL; + } + + edata = devm_kzalloc(&client->dev, sizeof(*edata), GFP_KERNEL); + if (!edata) + return -ENOMEM; + + wac_i2c->pdata->edatas[pos] = edata; + + ret = of_property_read_u32_array(np, "spec_ver", tmp, 2); + if (ret) { + input_err(true, &client->dev, + "failed to read sepc ver %d\n", ret); + return -EINVAL; + } + edata->spec_ver[0] = tmp[0]; + edata->spec_ver[1] = tmp[1]; + + ret = of_property_read_u32_array(np, "max_channel", tmp, 2); + if (ret) { + input_err(true, &client->dev, + "failed to read max channel %d\n", ret); + return -EINVAL; + } + edata->max_x_ch = tmp[0]; + edata->max_y_ch = tmp[1]; + + ret = of_property_read_u32(np, "shift_value", tmp); + if (ret) { + input_err(true, &client->dev, + "failed to read max channel %d\n", ret); + return -EINVAL; + } + edata->shift_value = tmp[0]; + + input_info(true, &client->dev, "channel(%d %d), spec_ver %d.%d shift_value %d\n", + edata->max_x_ch, edata->max_y_ch, edata->spec_ver[0], edata->spec_ver[1], edata->shift_value); + + max_len = edata->max_x_ch + edata->max_y_ch; + + edata->elec_data = devm_kzalloc(&client->dev, + max_len * max_len * sizeof(u16), + GFP_KERNEL); + if (!edata->elec_data) + return -ENOMEM; + + edata->xx = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(u16), GFP_KERNEL); + edata->xy = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(u16), GFP_KERNEL); + edata->yx = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(u16), GFP_KERNEL); + edata->yy = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(u16), GFP_KERNEL); + if (!edata->xx || !edata->xy || !edata->yx || !edata->yy) + return -ENOMEM; + + edata->xx_xx = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->xy_xy = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->yx_yx = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->yy_yy = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->xx_xx || !edata->xy_xy || !edata->yx_yx || !edata->yy_yy) + return -ENOMEM; + + edata->rxx = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->rxy = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->ryx = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->ryy = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->rxx || !edata->rxy || !edata->ryx || !edata->ryy) + return -ENOMEM; + + edata->drxx = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->drxy = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->dryx = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->dryy = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->drxx || !edata->drxy || !edata->dryx || !edata->dryy) + return -ENOMEM; + + edata->xx_ref = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->xy_ref = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->yx_ref = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->yy_ref = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->xx_ref || !edata->xy_ref || !edata->yx_ref || !edata->yy_ref) + return -ENOMEM; + + ret = of_property_read_u64_array(np, "xx_ref", edata->xx_ref, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xx reference data %d\n", ret); + return -EINVAL; + } + + ret = of_property_read_u64_array(np, "xy_ref", edata->xy_ref, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xy reference data %d\n", ret); + return -EINVAL; + } + + ret = of_property_read_u64_array(np, "yx_ref", edata->yx_ref, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yx reference data %d\n", ret); + return -EINVAL; + } + + ret = of_property_read_u64_array(np, "yy_ref", edata->yy_ref, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yy reference data %d\n", ret); + return -EINVAL; + } + + edata->xx_spec = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->xy_spec = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->yx_spec = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->yy_spec = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->xx_spec || !edata->xy_spec || !edata->yx_spec || !edata->yy_spec) + return -ENOMEM; + + ret = of_property_read_u64_array(np, "xx_spec", edata->xx_spec, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xx spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_x_ch; i++) + edata->xx_spec[i] = edata->xx_spec[i] * POWER_OFFSET; + + ret = of_property_read_u64_array(np, "xy_spec", edata->xy_spec, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xy spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_x_ch; i++) + edata->xy_spec[i] = edata->xy_spec[i] * POWER_OFFSET; + + ret = of_property_read_u64_array(np, "yx_spec", edata->yx_spec, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yx spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_y_ch; i++) + edata->yx_spec[i] = edata->yx_spec[i] * POWER_OFFSET; + + ret = of_property_read_u64_array(np, "yy_spec", edata->yy_spec, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yy spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_y_ch; i++) + edata->yy_spec[i] = edata->yy_spec[i] * POWER_OFFSET; + + edata->rxx_ref = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->rxy_ref = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->ryx_ref = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->ryy_ref = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->rxx_ref || !edata->rxy_ref || !edata->ryx_ref || !edata->ryy_ref) + return -ENOMEM; + + ret = of_property_read_u64_array(np, "rxx_ref", edata->rxx_ref, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xx ratio reference data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_x_ch; i++) + edata->rxx_ref[i] = edata->rxx_ref[i] * POWER_OFFSET / power(edata->shift_value); + + ret = of_property_read_u64_array(np, "rxy_ref", edata->rxy_ref, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xy ratio reference data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_x_ch; i++) + edata->rxy_ref[i] = edata->rxy_ref[i] * POWER_OFFSET / power(edata->shift_value); + + ret = of_property_read_u64_array(np, "ryx_ref", edata->ryx_ref, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yx ratio reference data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_y_ch; i++) + edata->ryx_ref[i] = edata->ryx_ref[i] * POWER_OFFSET / power(edata->shift_value); + + ret = of_property_read_u64_array(np, "ryy_ref", edata->ryy_ref, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yy ratio reference data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_y_ch; i++) + edata->ryy_ref[i] = edata->ryy_ref[i] * POWER_OFFSET / power(edata->shift_value); + + edata->drxx_spec = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->drxy_spec = devm_kzalloc(&client->dev, edata->max_x_ch * sizeof(long long), GFP_KERNEL); + edata->dryx_spec = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + edata->dryy_spec = devm_kzalloc(&client->dev, edata->max_y_ch * sizeof(long long), GFP_KERNEL); + if (!edata->drxx_spec || !edata->drxy_spec || !edata->dryx_spec || !edata->dryy_spec) + return -ENOMEM; + + ret = of_property_read_u64_array(np, "drxx_spec", edata->drxx_spec, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xx difference ratio spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_x_ch; i++) + edata->drxx_spec[i] = edata->drxx_spec[i] * POWER_OFFSET / power(edata->shift_value); + + ret = of_property_read_u64_array(np, "drxy_spec", edata->drxy_spec, edata->max_x_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read xy difference ratio spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_x_ch; i++) + edata->drxy_spec[i] = edata->drxy_spec[i] * POWER_OFFSET / power(edata->shift_value); + + ret = of_property_read_u64_array(np, "dryx_spec", edata->dryx_spec, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yx difference ratio spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_y_ch; i++) + edata->dryx_spec[i] = edata->dryx_spec[i] * POWER_OFFSET / power(edata->shift_value); + + ret = of_property_read_u64_array(np, "dryy_spec", edata->dryy_spec, edata->max_y_ch); + if (ret) { + input_err(true, &client->dev, + "failed to read yy difference ratio spec data %d\n", ret); + return -EINVAL; + } + + for (i = 0; i < edata->max_y_ch; i++) + edata->dryy_spec[i] = edata->dryy_spec[i] * POWER_OFFSET / power(edata->shift_value); + + return 1; +} + +int wacom_sec_init(struct wacom_i2c *wac_i2c) +{ + struct i2c_client *client = wac_i2c->client; + int retval = 0; + int i = 0; + + retval = sec_cmd_init(&wac_i2c->sec, sec_cmds, ARRAY_SIZE(sec_cmds), + SEC_CLASS_DEVT_WACOM); + if (retval < 0) { + input_err(true, &client->dev, "%s: failed to sec_cmd_init\n", __func__); + return retval; + } + + retval = sysfs_create_group(&wac_i2c->sec.fac_dev->kobj, &epen_attr_group); + if (retval) { + input_err(true, &client->dev, "failed to create sysfs attributes %d\n", retval); + goto err_sysfs_create_group; + } + + retval = sysfs_create_link(&wac_i2c->sec.fac_dev->kobj, + &wac_i2c->input_dev->dev.kobj, "input"); + if (retval) { + input_err(true, &client->dev, "failed to create sysfs link %d\n", retval); + goto err_create_symlink; + } + for (i = EPEN_ELEC_DATA_MAIN ; i <= EPEN_ELEC_DATA_UNIT ; i++) { + wacom_sec_elec_init(wac_i2c, i); + } + + return 0; + +err_create_symlink: + sysfs_remove_group(&wac_i2c->sec.fac_dev->kobj, &epen_attr_group); +err_sysfs_create_group: + sec_cmd_exit(&wac_i2c->sec, SEC_CLASS_DEVT_WACOM); + + return retval; +} + +void wacom_sec_remove(struct wacom_i2c *wac_i2c) +{ + sysfs_remove_link(&wac_i2c->sec.fac_dev->kobj, "input"); + sysfs_remove_group(&wac_i2c->sec.fac_dev->kobj, &epen_attr_group); + sec_cmd_exit(&wac_i2c->sec, SEC_CLASS_DEVT_WACOM); +} diff --git a/drivers/input/wacom/wacom_reg.h b/drivers/input/wacom/wacom_reg.h new file mode 100755 index 000000000000..88409170882b --- /dev/null +++ b/drivers/input/wacom/wacom_reg.h @@ -0,0 +1,119 @@ +#include + +/* for query request (not use) */ +#define COM_QUERY 0x2A + +/* scan mode*/ +#define COM_SURVEY_ASYNC_SCAN 0x2B +#define COM_SURVEY_EXIT 0x2D +#define COM_SURVEY_SYNC_SCAN 0x2E +#define COM_SURVEY_GARAGE_ONLY 0x3B + +#define COM_SAMPLERATE_STOP 0x30 +#define COM_SAMPLERATE_START 0x31 + +#define COM_CHECKSUM 0x63 + +#define COM_NORMAL_COMPENSATION 0x80 +#define COM_SPECIAL_COMPENSATION 0x81 +#define COM_BOOKCOVER_COMPENSATION 0x81 +#define COM_KBDCOVER_COMPENSATION 0x82 + +#define COM_KBDCOVER_CHECK_STATUS 0x88 + +/* elec test*/ +#define COM_ASYNC_VSYNC 0X28 +#define COM_SYNC_VSYNC 0X29 +#define COM_ELEC_SCAN_START 0xC8 +#define COM_ELEC_XSCAN 0xCA +#define COM_ELEC_YSCAN 0xCB +#define COM_ELEC_TRSCON 0xCE +#define COM_ELEC_TRSX0 0xCF +#define COM_ELEC_REQUESTDATA 0xD6 + +/* digitizer & garage open test */ +#define COM_GARAGE_TEST_MODE 0xC4 +#define COM_DIGITIZER_TEST_MODE 0xC5 +#define COM_OPEN_CHECK_START 0xC9 +#define COM_OPEN_CHECK_STATUS 0xD8 + +/* sensitivity set cmd */ +#define COM_NORMAL_SENSE_MODE 0xDB +#define COM_LOW_SENSE_MODE 0xDC +#define COM_LOW_SENSE_MODE2 0xE7 +#define COM_REQUEST_SENSE_MODE 0xDD + +/* have to check below register*/ +#define COM_REQUEST_GARAGEDATA 0XE5 +#define COM_REQUEST_SCANMODE 0xE6 + +#define COM_BLE_C_DISABLE 0XE8 +#define COM_BLE_C_ENABLE 0XE9 +#define COM_BLE_C_RESET 0XEA +#define COM_BLE_C_START 0XEB +#define COM_BLE_C_KEEP_ON 0XEC +#define COM_BLE_C_KEEP_OFF 0XED +#define COM_BLE_C_MODE_RETURN 0XEE +#define COM_BLE_C_FORCE_RESET 0xEF +#define COM_BLE_C_FULL 0xF3 +#define COM_FLASH 0xFF + +/* pen ble charging */ +enum epen_ble_charge_mode { + EPEN_BLE_C_DISABLE = 0, + EPEN_BLE_C_ENABLE, + EPEN_BLE_C_RESET, + EPEN_BLE_C_START, + EPEN_BLE_C_KEEP_ON, + EPEN_BLE_C_KEEP_OFF, + EPEN_BLE_C_M_RETURN, + EPEN_BLE_C_DSPX, + EPEN_BLE_C_FULL, + EPEN_BLE_C_MAX, +}; + +enum epen_ble_charge_state { + BLE_C_OFF = 0, + BLE_C_START, + BLE_C_TRANSIT, + BLE_C_RESET, + BLE_C_AFTER_START, + BLE_C_AFTER_RESET, + BLE_C_ON_KEEP_1, + BLE_C_OFF_KEEP_1, + BLE_C_ON_KEEP_2, + BLE_C_OFF_KEEP_2, + BLE_C_FULL, +}; + +/* wacom query data format */ +#define EPEN_REG_HEADER 0x00 +#define EPEN_REG_X1 0x01 +#define EPEN_REG_X2 0x02 +#define EPEN_REG_Y1 0x03 +#define EPEN_REG_Y2 0x04 +#define EPEN_REG_PRESSURE1 0x05 +#define EPEN_REG_PRESSURE2 0x06 +#define EPEN_REG_FWVER1 0x07 +#define EPEN_REG_FWVER2 0x08 +#define EPEN_REG_MPUVER 0x09 +#define EPEN_REG_BLVER 0x0A +#define EPEN_REG_TILT_X 0x0B +#define EPEN_REG_TILT_Y 0x0C +#define EPEN_REG_HEIGHT 0x0D +#define EPEN_REG_FMTREV 0x0E +#define EPEN_REG_PROJ_ID 0x0F + +/* wacom ic values */ +#define MPU_W9018 0x42 +#define MPU_W9019 0x43 +#define MPU_W9020 0x44 +#define MPU_W9021 0x45 +#define MPU_WEZ01 0x46 + +/* Switch events */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) +#define SW_FLIP 0x10 /* set = flip cover open, close*/ +#else +#define SW_FLIP 0x15 /* set = flip cover open, close*/ +#endif diff --git a/drivers/input/wacom/wez01_flash.c b/drivers/input/wacom/wez01_flash.c new file mode 100755 index 000000000000..08e844cbef2a --- /dev/null +++ b/drivers/input/wacom/wez01_flash.c @@ -0,0 +1,630 @@ +/* + * Wacom Penabled Driver for I2C + * + * Copyright (c) 2011-2014 Tatsunosuke Tobita, Wacom. + * + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software + * Foundation; either version of 2 of the License, + * or (at your option) any later version. + */ + +#include "wez01_flash.h" +#include "wacom_dev.h" + +static bool wacom_i2c_set_feature(struct wacom_i2c *wac_i2c, u8 report_id, + unsigned int buf_size, u8 *data, u16 cmdreg, + u16 datareg) +{ + int i, ret = -1; + int total = SFEATURE_SIZE + buf_size; + u8 *sFeature = NULL; + bool bRet = false; + + sFeature = kzalloc(sizeof(u8) * total, GFP_KERNEL); + if (!sFeature) { + input_err(true, &wac_i2c->client->dev, + "%s cannot preserve memory\n", __func__); + goto out; + } + + memset(sFeature, 0, sizeof(u8) * total); + + sFeature[0] = (u8)(cmdreg & 0x00ff); + sFeature[1] = (u8)((cmdreg & 0xff00) >> 8); + sFeature[2] = (RTYPE_FEATURE << 4) | report_id; + sFeature[3] = CMD_SET_FEATURE; + sFeature[4] = (u8)(datareg & 0x00ff); + sFeature[5] = (u8)((datareg & 0xff00) >> 8); + + if ((buf_size + 2) > 255) { + sFeature[6] = (u8)((buf_size + 2) & 0x00ff); + sFeature[7] = (u8)(((buf_size + 2) & 0xff00) >> 8); + } else { + sFeature[6] = (u8)(buf_size + 2); + sFeature[7] = (u8)(0x00); + } + + for (i = 0; i < buf_size; i++) + sFeature[i + SFEATURE_SIZE] = *(data + i); + + ret = wacom_i2c_send_boot(wac_i2c, sFeature, total); + if (ret != total) { + input_err(true, &wac_i2c->client->dev, + "Sending Set_Feature failed sent bytes: %d\n", ret); + goto err; + } + + usleep_range(60, 61); + bRet = true; +err: + kfree(sFeature); + sFeature = NULL; + +out: + return bRet; +} + +static bool wacom_i2c_get_feature(struct wacom_i2c *wac_i2c, u8 report_id, + unsigned int buf_size, u8 *data, u16 cmdreg, + u16 datareg, int delay) +{ + /*"+ 2", adding 2 more spaces for organizeing again later in the passed data, "data" */ + unsigned int total = buf_size + 2; + int ret = -1; + u8 *recv = NULL; + bool bRet = false; + u8 gFeature[] = { + (u8)(cmdreg & 0x00ff), + (u8)((cmdreg & 0xff00) >> 8), + (RTYPE_FEATURE << 4) | report_id, + CMD_GET_FEATURE, + (u8)(datareg & 0x00ff), + (u8)((datareg & 0xff00) >> 8) + }; + + recv = kzalloc(sizeof(u8) * total, GFP_KERNEL); + if (!recv) { + input_err(true, &wac_i2c->client->dev, + "%s cannot preserve memory\n", __func__); + goto err_alloc_memory; + } + + /*Append 2 bytes for length low and high of the byte */ + memset(recv, 0, sizeof(u8) * total); + + ret = wacom_i2c_send_boot(wac_i2c, gFeature, GFEATURE_SIZE); + if (ret != GFEATURE_SIZE) { + input_info(true, &wac_i2c->client->dev, + "%s: Sending Get_Feature failed; sent bytes: %d\n", + __func__, ret); + + udelay(delay); + + goto err_fail_i2c; + } + + udelay(delay); + + ret = wacom_i2c_recv_boot(wac_i2c, recv, total); + if (ret != total) { + input_err(true, &wac_i2c->client->dev, + "%s Receiving data failed; recieved bytes: %d\n", + __func__, ret); + goto err_fail_i2c; + } + + /*Coppy data pointer, subtracting the first two bytes of the length */ + memcpy(data, (recv + 2), buf_size); + + bRet = true; +err_fail_i2c: + kfree(recv); + recv = NULL; + +err_alloc_memory: + return bRet; +} + +static int wacom_flash_cmd(struct wacom_i2c *wac_i2c) +{ + u8 command[10] = { 0 }; + int len = 0; + int ret = -1; + + command[len++] = 0x0d; + command[len++] = FLASH_START0; + command[len++] = FLASH_START1; + command[len++] = FLASH_START2; + command[len++] = FLASH_START3; + command[len++] = FLASH_START4; + command[len++] = FLASH_START5; + command[len++] = 0x0d; + + ret = wacom_i2c_send_boot(wac_i2c, command, len); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, + "%s: Sending flash command failed\n", __func__); + return -EXIT_FAIL; + } + + msleep(300); + + return 0; +} + +static int flash_query_w9020(struct wacom_i2c *wac_i2c) +{ + bool bRet = false; + u8 command[BOOT_CMD_SIZE] = { 0 }; + u8 response[BOOT_RSP_SIZE] = { 0 }; + int ECH = 0, len = 0; + + command[len++] = BOOT_CMD_REPORT_ID; /* Report:ReportID */ + command[len++] = BOOT_QUERY; /* Report:Boot Query command */ + command[len++] = ECH = 7; /* Report:echo */ + + bRet = wacom_i2c_set_feature(wac_i2c, REPORT_ID_1, len, command, + COMM_REG, DATA_REG); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to set feature\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + bRet = wacom_i2c_get_feature(wac_i2c, REPORT_ID_2, BOOT_RSP_SIZE, response, + COMM_REG, DATA_REG, (10 * 1000)); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to get feature\n", __func__); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + if ((response[1] != BOOT_CMD_REPORT_ID) || (response[2] != ECH)) { + input_err(true, &wac_i2c->client->dev, "%s res1:%x res2:%x\n", + __func__, response[1], response[2]); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + if (response[3] != QUERY_RSP) { + input_err(true, &wac_i2c->client->dev, "%s res3:%x \n", + __func__, response[3]); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + +/* + if ((response[3] != QUERY_CMD) || (response[4] != ECH)) { + input_err(true, &wac_i2c->client->dev, "%s res3:%x res4:%x\n", + __func__, response[3], response[4]); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } + + if (response[5] != QUERY_RSP) { + input_err(true, &wac_i2c->client->dev, "%s res5:%x\n", + __func__, response[5]); + return -EXIT_FAIL_SEND_QUERY_COMMAND; + } +*/ + input_info(true, &wac_i2c->client->dev, "%s: QUERY SUCCEEDED\n", __func__); + + return 0; +} + +static bool flash_blver_w9020(struct wacom_i2c *wac_i2c, int *blver) +{ + bool bRet = false; + u8 command[BOOT_CMD_SIZE] = { 0 }; + u8 response[BOOT_RSP_SIZE] = { 0 }; + int ECH = 0, len = 0; + + command[len++] = BOOT_CMD_REPORT_ID; /* Report:ReportID */ + command[len++] = BOOT_BLVER; /* Report:Boot Version command */ + command[len++] = ECH = 7; /* Report:echo */ + + bRet = wacom_i2c_set_feature(wac_i2c, REPORT_ID_1, len, command, COMM_REG, + DATA_REG); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to set feature1\n", __func__); + return false; + } + + bRet = wacom_i2c_get_feature(wac_i2c, REPORT_ID_2, BOOT_RSP_SIZE, response, + COMM_REG, DATA_REG, (10 * 1000)); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s 2 failed to set feature\n", __func__); + return false; + } + + if ((response[1] != BOOT_BLVER) || (response[2] != ECH)) { + input_err(true, &wac_i2c->client->dev, "%s res1:%x res2:%x\n", + __func__, response[1], response[2]); + return false; + } +/* + if ((response[3] != BOOT_CMD) || (response[4] != ECH)) { + input_err(true, &wac_i2c->client->dev, "%s res3:%x res4:%x\n", + __func__, response[3], response[4]); + return false; + } +*/ + *blver = (int)response[3]; + + return true; +} + +static bool flash_mputype_w9020(struct wacom_i2c *wac_i2c, int *pMpuType) +{ + bool bRet = false; + u8 command[BOOT_CMD_SIZE] = { 0 }; + u8 response[BOOT_RSP_SIZE] = { 0 }; + int ECH = 0, len = 0; + + command[len++] = BOOT_CMD_REPORT_ID; /* Report:ReportID */ + command[len++] = BOOT_MPU; /* Report:Boot Query command */ + command[len++] = ECH = 7; /* Report:echo */ + + bRet = wacom_i2c_set_feature(wac_i2c, REPORT_ID_1, len, command, COMM_REG, + DATA_REG); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to set feature\n", __func__); + return false; + } + + bRet = wacom_i2c_get_feature(wac_i2c, REPORT_ID_2, BOOT_RSP_SIZE, response, + COMM_REG, DATA_REG, (10 * 1000)); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to get feature\n", __func__); + return false; + } + + if ((response[1] != BOOT_MPU) || (response[2] != ECH)) { + input_err(true, &wac_i2c->client->dev, "%s res1:%x res2:%x\n", + __func__, response[1], response[2]); + return false; + } +/* + if ((response[3] != MPU_CMD) || (response[4] != ECH)) { + input_err(true, &wac_i2c->client->dev, "%s res3:%x res4:%x\n", + __func__, response[3], response[4]); + return false; + } +*/ + *pMpuType = (int)response[3]; + return true; +} + +static bool flash_end_w9020(struct wacom_i2c *wac_i2c) +{ + bool bRet = false; + u8 command[BOOT_CMD_SIZE] = { 0 }; + int len = 0; + + command[len++] = BOOT_CMD_REPORT_ID; + command[len++] = BOOT_EXIT; + command[len++] = 0; + + bRet = wacom_i2c_set_feature(wac_i2c, REPORT_ID_1, len, command, COMM_REG, + DATA_REG); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to set feature 1\n", __func__); + return false; + } + + return true; +} + +static int check_progress(struct wacom_i2c *wac_i2c, u8 *data, size_t size, u8 cmd, u8 ech) +{ + if (data[0] != cmd || data[1] != ech) { + input_err(true, &wac_i2c->client->dev, "%s failed to erase\n", + __func__); + return -EXIT_FAIL; + } + + switch (data[2]) { + case PROCESS_CHKSUM1_ERR: + case PROCESS_CHKSUM2_ERR: + case PROCESS_TIMEOUT_ERR: + input_err(true, &wac_i2c->client->dev, "%s error: %x\n", + __func__, data[2]); + return -EXIT_FAIL; + } + + return data[2]; +} + +static bool flash_erase_all(struct wacom_i2c *wac_i2c) +{ + bool bRet = false; + u8 command[BOOT_CMD_SIZE] = { 0 }; + u8 response[BOOT_RSP_SIZE] = { 0 }; + int i = 0, len = 0; + int ECH = 0, sum = 0; + int ret = -1; + + command[len++] = 7; + command[len++] = ERS_ALL_CMD; + command[len++] = ECH = 2; + command[len++] = ERS_ECH2; + + /* Preliminarily stored data that cannnot appear here, but in wacom_set_feature() */ + sum += 0x05; + sum += 0x07; + for (i = 0; i < len; i++) + sum += command[i]; + + command[len++] = ~sum + 1; + + bRet = wacom_i2c_set_feature(wac_i2c, REPORT_ID_1, len, command, COMM_REG, + DATA_REG); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to set feature\n", __func__); + return false; + } + + do { + bRet = wacom_i2c_get_feature(wac_i2c, REPORT_ID_2, BOOT_RSP_SIZE, + response, COMM_REG, DATA_REG, 0); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to set feature\n", __func__); + return false; + } + + ret = check_progress(wac_i2c, &response[1], (BOOT_RSP_SIZE - 3), ERS_ALL_CMD, ECH); + if (ret < 0) + return false; + + } while (ret == PROCESS_INPROGRESS); + + return true; +} + +static bool flash_write_block_w9020(struct wacom_i2c *wac_i2c, char *flash_data, + unsigned long ulAddress, u8 *pcommand_id, + int *ECH) +{ + const int MAX_COM_SIZE = (8 + FLASH_BLOCK_SIZE + 2); /* 8: num of command[0] to command[7] */ + /* FLASH_BLOCK_SIZE: unit to erase the block */ + /* Num of Last 2 checksums */ + bool bRet = false; + u8 command[300] = { 0 }; + unsigned char sum = 0; + int i = 0; + + command[0] = BOOT_CMD_REPORT_ID; /* Report:ReportID */ + command[1] = BOOT_WRITE_FLASH; /* Report:program command */ + command[2] = *ECH = ++(*pcommand_id); /* Report:echo */ + command[3] = ulAddress & 0x000000ff; + command[4] = (ulAddress & 0x0000ff00) >> 8; + command[5] = (ulAddress & 0x00ff0000) >> 16; + command[6] = (ulAddress & 0xff000000) >> 24; /* Report:address(4bytes) */ + command[7] = 0x20; + + /*Preliminarily stored data that cannnot appear here, but in wacom_set_feature() */ + sum = (0x05 + 0x0c + 0x01); + + for (i = 0; i < 8; i++) + sum += command[i]; + + command[MAX_COM_SIZE - 2] = ~sum + 1; /* Report:command checksum */ + + sum = 0; + + for (i = 8; i < (FLASH_BLOCK_SIZE + 8); i++) { + command[i] = flash_data[ulAddress + (i - 8)]; + sum += flash_data[ulAddress + (i - 8)]; + } + + command[MAX_COM_SIZE - 1] = ~sum + 1; /* Report:data checksum */ + + /*Subtract 8 for the first 8 bytes */ + bRet = wacom_i2c_set_feature(wac_i2c, REPORT_ID_1, (BOOT_CMD_SIZE + 4 - 8), + command, COMM_REG, DATA_REG); + if (!bRet) { + input_err(true, &wac_i2c->client->dev, + "%s failed to set feature\n", __func__); + return false; + } + + udelay(50); + + return true; +} + +static bool flash_write_w9020(struct wacom_i2c *wac_i2c, + unsigned char *flash_data, + unsigned long start_address, + unsigned long *max_address) +{ + bool bRet = false; + u8 command_id = 0; + u8 response[BOOT_RSP_SIZE] = { 0 }; + int i = 0, j = 0, ECH = 0, ECH_len = 0; + int ECH_ARRAY[3] = { 0 }; + int ret = -1; + unsigned long ulAddress = 0; + + j = 0; + for (ulAddress = start_address; ulAddress < *max_address; ulAddress += FLASH_BLOCK_SIZE) { + for (i = 0; i < FLASH_BLOCK_SIZE; i++) { + if (flash_data[ulAddress + i] != 0xFF) + break; + } + if (i == (FLASH_BLOCK_SIZE)) + continue; + + bRet = flash_write_block_w9020(wac_i2c, flash_data, ulAddress, + &command_id, &ECH); + if (!bRet) + return false; + + if (ECH_len == 3) + ECH_len = 0; + + ECH_ARRAY[ECH_len++] = ECH; + if (ECH_len == 3) { + for (j = 0; j < 3; j++) { + do { + bRet = wacom_i2c_get_feature(wac_i2c, + REPORT_ID_2, + BOOT_RSP_SIZE, + response, + COMM_REG, + DATA_REG, 50); + if (!bRet) { + input_err(true, + &wac_i2c->client->dev, + "%s failed to set feature\n", + __func__); + return false; + } + + ret = check_progress(wac_i2c, &response[1], (BOOT_RSP_SIZE - 3), 0x01, ECH_ARRAY[j]); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, + "%s mismatched echo array\n", + __func__); + return false; + } + } while (ret == PROCESS_INPROGRESS); + } + } + } + + return true; +} + +static int wacom_i2c_flash_w9020(struct wacom_i2c *wac_i2c, unsigned char *fw_data) +{ + struct i2c_client *client = wac_i2c->client; + bool bRet = false; + int iBLVer = 0, iMpuType = 0; + unsigned long max_address; /* Max.address of Load data */ + unsigned long start_address; /* Start.address of Load data */ + + max_address = W9021_END_ADDR; /* Max.address of Load data */ + start_address = W9021_START_ADDR; /* Start.address of Load data */ + wac_i2c->bl_mpu_match = true; + + /*Obtain boot loader version */ + if (!flash_blver_w9020(wac_i2c, &iBLVer)) { + input_err(true, &client->dev, + "%s failed to get Boot Loader version\n", __func__); + return -EXIT_FAIL_GET_BOOT_LOADER_VERSION; + } + input_info(true, &client->dev, "%s: BL version: %x\n", __func__, iBLVer); + + /*Obtain MPUtype: this can be manually done in user space */ + if (!flash_mputype_w9020(wac_i2c, &iMpuType)) { + input_err(true, &client->dev, + "%s failed to get MPU type\n", __func__); + wac_i2c->bl_mpu_match = false; + return -EXIT_FAIL_GET_MPU_TYPE; + } + + if (iMpuType != MPU_WEZ01 && iMpuType != MPU_W9021) { + input_err(true, &client->dev, + "MPU is not for WEZ01 : %x\n", iMpuType); + wac_i2c->bl_mpu_match = false; + return -EXIT_FAIL_GET_MPU_TYPE; + } + + input_info(true, &client->dev, "%s: MPU type: %x\n", __func__, iMpuType); + + /*-----------------------------------*/ + /*Flashing operation starts from here */ + + /*Erase the current loaded program */ + input_info(true, &client->dev, + "%s erasing the current firmware\n", __func__); + bRet = flash_erase_all(wac_i2c); + if (!bRet) { + input_err(true, &client->dev, + "%s failed to erase the user program\n", __func__); + return -EXIT_FAIL_ERASE; + } + + /*Write the new program */ + input_info(true, &client->dev, "%s writing new firmware\n", + __func__); + bRet = flash_write_w9020(wac_i2c, wac_i2c->fw_data, start_address, + &max_address); + if (!bRet) { + input_err(true, &client->dev, + "%s failed to write firmware\n", __func__); + return -EXIT_FAIL_WRITE_FIRMWARE; + } + + /*Return to the user mode */ + input_info(true, &client->dev, "%s closing the boot mode\n", + __func__); + bRet = flash_end_w9020(wac_i2c); + if (!bRet) { + input_err(true, &client->dev, + "%s closing boot mode failed\n", __func__); + return -EXIT_FAIL_WRITING_MARK_NOT_SET; + } + + input_info(true, &client->dev, + "%s write and verify completed\n", __func__); + + return EXIT_OK; +} + +int wacom_i2c_flash(struct wacom_i2c *wac_i2c) +{ + int ret; + + if (wac_i2c->fw_data == NULL) { + input_err(true, &wac_i2c->client->dev, + "%s: epen:Data is NULL. Exit.\n", __func__); + return -EINVAL; + } + + wacom_compulsory_flash_mode(wac_i2c, true); + wacom_reset_hw(wac_i2c); + + ret = wacom_flash_cmd(wac_i2c); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, + "epen:%s cannot send flash command\n", __func__); + ret = -EXIT_FAIL; + goto out; + } + + ret = flash_query_w9020(wac_i2c); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, + "epen:%s Error: cannot send query\n", __func__); + ret = -EXIT_FAIL; + goto out; + } + + ret = wacom_i2c_flash_w9020(wac_i2c, wac_i2c->fw_data); + if (ret < 0) { + input_err(true, &wac_i2c->client->dev, + "epen:%s Error: flash failed\n", __func__); + ret = -EXIT_FAIL; + goto out; + } + + msleep(200); + +out: + wac_i2c->function_result &= ~EPEN_EVENT_SURVEY; + wac_i2c->survey_mode = EPEN_SURVEY_MODE_NONE; + + wacom_compulsory_flash_mode(wac_i2c, false); + wacom_reset_hw(wac_i2c); + + return ret; +} diff --git a/drivers/input/wacom/wez01_flash.h b/drivers/input/wacom/wez01_flash.h new file mode 100755 index 000000000000..16d37d60eb9b --- /dev/null +++ b/drivers/input/wacom/wez01_flash.h @@ -0,0 +1,122 @@ +#ifndef _WACOM_I2C_FLASH_H_ +#define _WACOM_I2C_FLASH_H_ + + +#define FLASH_START0 'f' +#define FLASH_START1 'l' +#define FLASH_START2 'a' +#define FLASH_START3 's' +#define FLASH_START4 'h' +#define FLASH_START5 '\r' +#define FLASH_ACK 0x06 + +#define MPU_W9020 0x44 +#define MPU_W9021 0x45 +#define MPU_WEZ01 0x46 + +#define FLASH_BLOCK_SIZE 256 +#define DATA_SIZE (65536 * 5) +#define BLOCK_NUM 143 +#define W9020_START_ADDR 0x2000 +#define W9020_END_ADDR 0x23fff +#define W9021_START_ADDR 0x3000 +#define W9021_END_ADDR 0x3efff + +#define BOOT_CMD_SIZE (0x010c + 0x02) /* 78 */ +#define BOOT_RSP_SIZE 6 + +#define BOOT_WRITE_FLASH 1 +#define BOOT_EXIT 3 +#define BOOT_BLVER 4 +#define BOOT_MPU 5 +#define BOOT_QUERY 7 + +#define ERS_ALL_CMD 0x10 + +#define ERS_ECH2 0x03 +#define QUERY_RSP 0x06 + +#define PROCESS_INPROGRESS 0xff +#define PROCESS_COMPLETED 0x00 +#define PROCESS_CHKSUM1_ERR 0x81 +#define PROCESS_CHKSUM2_ERR 0x82 +#define PROCESS_TIMEOUT_ERR 0x87 + + + +/* + * exit codes + */ +#define EXIT_OK (0) +#define EXIT_REBOOT (1) +#define EXIT_FAIL (2) +#define EXIT_USAGE (3) +#define EXIT_NO_SUCH_FILE (4) +#define EXIT_NO_INTEL_HEX (5) +#define EXIT_FAIL_OPEN_COM_PORT (6) +#define EXIT_FAIL_ENTER_FLASH_MODE (7) +#define EXIT_FAIL_FLASH_QUERY (8) +#define EXIT_FAIL_BAUDRATE_CHANGE (9) +#define EXIT_FAIL_WRITE_FIRMWARE (10) +#define EXIT_FAIL_EXIT_FLASH_MODE (11) +#define EXIT_CANCEL_UPDATE (12) +#define EXIT_SUCCESS_UPDATE (13) +#define EXIT_FAIL_HID2SERIAL (14) +#define EXIT_FAIL_VERIFY_FIRMWARE (15) +#define EXIT_FAIL_MAKE_WRITING_MARK (16) +#define EXIT_FAIL_ERASE_WRITING_MARK (17) +#define EXIT_FAIL_READ_WRITING_MARK (18) +#define EXIT_EXIST_MARKING (19) +#define EXIT_FAIL_MISMATCHING (20) +#define EXIT_FAIL_ERASE (21) +#define EXIT_FAIL_GET_BOOT_LOADER_VERSION (22) +#define EXIT_FAIL_GET_MPU_TYPE (23) +#define EXIT_MISMATCH_BOOTLOADER (24) +#define EXIT_MISMATCH_MPUTYPE (25) +#define EXIT_FAIL_ERASE_BOOT (26) +#define EXIT_FAIL_WRITE_BOOTLOADER (27) +#define EXIT_FAIL_SWAP_BOOT (28) +#define EXIT_FAIL_WRITE_DATA (29) +#define EXIT_FAIL_GET_FIRMWARE_VERSION (30) +#define EXIT_FAIL_GET_UNIT_ID (31) +#define EXIT_FAIL_SEND_STOP_COMMAND (32) +#define EXIT_FAIL_SEND_QUERY_COMMAND (33) +#define EXIT_NOT_FILE_FOR_535 (34) +#define EXIT_NOT_FILE_FOR_514 (35) +#define EXIT_NOT_FILE_FOR_503 (36) +#define EXIT_MISMATCH_MPU_TYPE (37) +#define EXIT_NOT_FILE_FOR_515 (38) +#define EXIT_NOT_FILE_FOR_1024 (39) +#define EXIT_FAIL_VERIFY_WRITING_MARK (40) +#define EXIT_DEVICE_NOT_FOUND (41) +#define EXIT_FAIL_WRITING_MARK_NOT_SET (42) +#define EXIT_FAIL_SET_PDCT (43) +#define ERR_SET_PDCT (44) +#define ERR_GET_PDCT (45) + +#define HEX_READ_ERR (-1) + + +/*-----------------------------------*/ +/*-----------------------------------*/ +/*------ HID requiring items---------*/ +/*-----------------------------------*/ +/*-----------------------------------*/ +#define RTYPE_FEATURE 0x03 /* : Report type -> feature(11b) */ +#define CMD_GET_FEATURE 2 +#define CMD_SET_FEATURE 3 + +#define GFEATURE_SIZE 6 +#define SFEATURE_SIZE 8 + +/*HID specific register*/ +#define HID_DESC_REGISTER 1 +#define COMM_REG 0x04 +#define DATA_REG 0x05 + +#define REPORT_ID_1 0x07 +#define REPORT_ID_2 0x08 +#define FLASH_CMD_REPORT_ID 2 +#define BOOT_CMD_REPORT_ID 7 + +#endif /* _WACOM_I2C_FLASH_H_ */ diff --git a/drivers/media/platform/msm/camera/Kconfig b/drivers/media/platform/msm/camera/Kconfig index 2209757ba701..bd6d6bbbac8b 100755 --- a/drivers/media/platform/msm/camera/Kconfig +++ b/drivers/media/platform/msm/camera/Kconfig @@ -186,6 +186,13 @@ config SAMSUNG_CAMERA_OTP_MACRO ---help--- Enables support for MACRO SENSOR OTP +config SAMSUNG_CAMERA_OTP_FRONT + tristate "Front sensor OTP support" + depends on SPECTRA_CAMERA + default n + ---help--- + Enables support for Front SENSOR OTP + config SAMSUNG_CAMERA_OTP tristate "Sensor OTP support" depends on SPECTRA_CAMERA diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_core.c index fcd967b2c98e..a0b1b4b67fd4 100755 --- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_core.c +++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_core.c @@ -811,6 +811,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl, struct cam_cmd_buf_desc *cmd_desc = NULL; struct cam_actuator_soc_private *soc_private = NULL; struct cam_sensor_power_ctrl_t *power_info = NULL; + int32_t retry = 0; if (!a_ctrl || !arg) { CAM_ERR(CAM_ACTUATOR, "Invalid Args"); @@ -971,8 +972,19 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl, a_ctrl->cam_act_state = CAM_ACTUATOR_CONFIG; } - rc = cam_actuator_apply_settings(a_ctrl, - &a_ctrl->i2c_data.init_settings); + for (retry = 0; retry < 3; retry++) + { + rc = cam_actuator_apply_settings(a_ctrl, + &a_ctrl->i2c_data.init_settings); + if (rc < 0) { + CAM_ERR(CAM_ACTUATOR, "Cannot apply Init settings, retry %d", retry); + cam_actuator_power_down(a_ctrl); + msleep(20); + cam_actuator_power_up(a_ctrl); + } else { + break; + } + } if (rc < 0) { CAM_ERR(CAM_ACTUATOR, "Cannot apply Init settings"); goto rel_pkt_buf; diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_cci/cam_cci_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_cci/cam_cci_core.c index a06a4c6c6339..c4e9baed86ec 100755 --- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_cci/cam_cci_core.c +++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_cci/cam_cci_core.c @@ -13,6 +13,7 @@ #include #include "cam_cci_core.h" #include "cam_cci_dev.h" +#define DUMP_CCI_REGISTERS static int32_t cam_cci_convert_type_to_num_bytes( enum camera_sensor_i2c_type type) diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_core.c index 9d9ce9492082..376a652aa18f 100755 --- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_core.c +++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_core.c @@ -301,7 +301,11 @@ static unsigned int is_cam_otp_enabled(struct cam_eeprom_ctrl_t *e_ctrl) return TRUE; } #endif - +#if defined(CONFIG_SAMSUNG_CAMERA_OTP_FRONT) + if (e_ctrl->soc_info.index == CAM_EEPROM_IDX_FRONT) { + return TRUE; + } +#endif return FALSE; } @@ -2959,7 +2963,11 @@ static int cam_otp_gc5035_read_memory(struct cam_eeprom_ctrl_t *e_ctrl, if(e_ctrl->soc_info.index == 4) offset = 0xF4; else +#if defined(CONFIG_SEC_GTA4XLVE_PROJECT) + offset = 0x100; +#else offset = 0x80; +#endif break; case 7: diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_dev.h b/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_dev.h index 784e8bb4be0e..6bec6f700006 100755 --- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_dev.h +++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_dev.h @@ -149,6 +149,12 @@ #define FROM_FRONT_MODULE_ID_ADDR 0x005E #define FROM_FRONT_SENSOR_ID_ADDR 0x0068 #define FRONT_MODULE_FW_VERSION 0x0048 +#elif defined(CONFIG_SEC_GTA4XLVE_PROJECT) +#define FRONT_CAL_VERSION_ADDR 0x0013 +#define FRONT_CAM_MAP_VERSION_ADDR 0x0013 +#define FROM_FRONT_MODULE_ID_ADDR 0x002A +#define FROM_FRONT_SENSOR_ID_ADDR 0x0033 +#define FRONT_MODULE_FW_VERSION 0x0009 #elif defined(CONFIG_SEC_A90Q_PROJECT) #define FRONT_CAM_MAP_VERSION_ADDR 0x00E0 #define FROM_FRONT_MODULE_ID_ADDR 0x00AE @@ -192,6 +198,8 @@ #endif #if defined(CONFIG_SEC_A52Q_PROJECT) || defined(CONFIG_SEC_A72Q_PROJECT) || defined(CONFIG_SEC_M42Q_PROJECT) #define FRONT_DLL_VERSION_ADDR 0x0034 +#elif defined(CONFIG_SEC_GTA4XLVE_PROJECT) +#define FRONT_DLL_VERSION_ADDR 0x0017 #else #define FRONT_DLL_VERSION_ADDR 0x00CF #endif @@ -209,6 +217,10 @@ #define FROM_REAR_AF_CAL_D10_ADDR 0x010C #define FROM_REAR_AF_CAL_PAN_ADDR 0x0100 #define FROM_REAR_AF_CAL_MACRO_ADDR 0x010C +#elif defined(CONFIG_SEC_GTA4XLVE_PROJECT) +#define FROM_REAR_AF_CAL_D10_ADDR 0x010C +#define FROM_REAR_AF_CAL_PAN_ADDR 0x0100 +#define FROM_REAR_AF_CAL_MACRO_ADDR 0x010C #else #define FROM_REAR_AF_CAL_D10_ADDR 0x0818 #define FROM_REAR_AF_CAL_PAN_ADDR 0x081C @@ -753,6 +765,12 @@ extern char module_info[SYSFS_MODULE_INFO_SIZE]; #define FRONT_VENDOR_INFO ("C") #define FRONT_PROCESS_INFO ("A") #define CRITERION_REV_FRONT (0) +#elif defined(CONFIG_SEC_GTA4XLVE_PROJECT) +#define FRONT_HW_INFO ("V05EG") +#define FRONT_SW_INFO ("PAF0") +#define FRONT_VENDOR_INFO ("H") +#define FRONT_PROCESS_INFO ("A") +#define CRITERION_REV_FRONT (0) #else #define FRONT_HW_INFO ("B32QL") #define FRONT_SW_INFO ("LA00") diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c index 6f45760c0d80..5a655d5e08e5 100755 --- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c +++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c @@ -1181,6 +1181,7 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl, mutex_lock(&(s_ctrl->cam_sensor_mutex)); switch (cmd->op_code) { case CAM_SENSOR_PROBE_CMD: { + CAM_INFO(CAM_SENSOR, "Probe command received for %d", s_ctrl->soc_info.index); if (s_ctrl->is_probe_succeed == 1) { CAM_ERR(CAM_SENSOR, "Already Sensor Probed in the slot"); @@ -1307,6 +1308,24 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl, } #endif +#if defined(CONFIG_SEC_GTA4XLVE_PROJECT) + if ((rc < 0) && + (((s_ctrl->soc_info.index == 0) && (s_ctrl->sensordata->slave_info.sensor_id == SENSOR_ID_S5K4HA)) || + ((s_ctrl->soc_info.index == 1) && (s_ctrl->sensordata->slave_info.sensor_id == SENSOR_ID_GC5035)) || + ((s_ctrl->soc_info.index == 8) && (s_ctrl->sensordata->slave_info.sensor_id == SENSOR_ID_GC5035)))) + { + CAM_ERR(CAM_SENSOR, + "Probe failed - slot:%d,slave_addr:0x%x,sensor_id:0x%x", + s_ctrl->soc_info.index, + s_ctrl->sensordata->slave_info.sensor_slave_addr, + s_ctrl->sensordata->slave_info.sensor_id); + rc = -EINVAL; + cam_sensor_power_down(s_ctrl); + msleep(20); + goto free_power_settings; + } +#endif + #if defined(CONFIG_SEC_A71_PROJECT) if ((rc < 0) && ((s_ctrl->soc_info.index == 0) && @@ -1736,6 +1755,8 @@ init: #if defined(CONFIG_GC5035_MACRO_OTP_DD_AUTOLOAD) #if defined (CONFIG_SEC_A52Q_PROJECT) if ((s_ctrl->soc_info.index == 4)||(s_ctrl->soc_info.index == 3)) { +#elif defined(CONFIG_SEC_GTA4XLVE_PROJECT) + if ((s_ctrl->soc_info.index == 1)||(s_ctrl->soc_info.index == 8)) { #elif defined(CONFIG_SEC_A72Q_PROJECT) if (s_ctrl->soc_info.index == 4) { #endif diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.c index b7a748d8f3ed..7d8dce393efc 100755 --- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.c +++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.c @@ -1707,8 +1707,8 @@ int cam_sensor_core_power_up(struct cam_sensor_power_ctrl_t *ctrl, index); return -EINVAL; } - -#if defined(CONFIG_SEC_A52Q_PROJECT) || defined(CONFIG_SEC_A72Q_PROJECT) +//may be need to add project flag here +#if defined(CONFIG_SEC_A52Q_PROJECT) || defined(CONFIG_SEC_A72Q_PROJECT) || defined(CONFIG_SEC_GTA4XLVE_PROJECT) if (power_setting->seq_type == SENSOR_VIO) { usleep_range(15000, 20000); } diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.h b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.h index 2567722f8d74..7dca399d670f 100755 --- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.h +++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.h @@ -43,6 +43,8 @@ #define SENSOR_ID_IMX616 0x0616 #define SENSOR_ID_S5K3L6 0x30c6 #define SENSOR_ID_S5KGD2 0x0842 +#define SENSOR_ID_S5K4HA 0x48ab +#define SENSOR_ID_GC5035 0x3540 #if defined(CONFIG_SEC_A72Q_PROJECT) #define HI847_SENSOR_ID 0x00 diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sysfs_init.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sysfs_init.c index 1920ced20762..2fc470146997 100755 --- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sysfs_init.c +++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sysfs_init.c @@ -242,6 +242,14 @@ static ssize_t rear_type_show(struct device *dev, return scnprintf(buf, PAGE_SIZE, "%s", cam_type_lsi); } +#elif defined(CONFIG_SEC_GTA4XLVE_PROJECT) +static ssize_t rear_type_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + char cam_type_lsi[] = "SLSI_S5K4HA\n"; + + return scnprintf(buf, PAGE_SIZE, "%s", cam_type_lsi); +} #else static ssize_t rear_type_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -331,7 +339,14 @@ static ssize_t front_camera_type_show(struct device *dev, return rc; return 0; } +#elif defined(CONFIG_SEC_GTA4XLVE_PROJECT) +static ssize_t front_camera_type_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + char cam_type[] = "SLSI_GC5035\n"; + return scnprintf(buf, PAGE_SIZE, "%s", cam_type); +} #else static ssize_t front_camera_type_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -2983,7 +2998,9 @@ char supported_camera_ids[] = { #if defined(CONFIG_SAMSUNG_FRONT_TOF) 41, //FRONT_TOF #endif +#if !defined(CONFIG_SEC_GTA4XLVE_PROJECT) 50, //REAR_2ND = Rear UW +#endif /*#if defined(CONFIG_SAMSUNG_FRONT_DUAL) //Disabling Front 8M for factory mode. 51, //FRONT_2ND = Front UW #endif */ diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c index d9f804fe2be8..e727a1f9e703 100755 --- a/drivers/media/platform/msm/vidc/msm_vidc.c +++ b/drivers/media/platform/msm/vidc/msm_vidc.c @@ -1087,6 +1087,7 @@ static inline int start_streaming(struct msm_vidc_inst *inst) int rc = 0; struct hfi_device *hdev; struct hal_buffer_size_minimum b; + struct hal_buffer_requirements *bufreq; u32 rc_mode; int value = 0; @@ -1202,6 +1203,27 @@ static inline int start_streaming(struct msm_vidc_inst *inst) goto fail_start; } + if (inst->session_type == MSM_VIDC_DECODER && + msm_comm_get_stream_output_mode(inst) == + HAL_VIDEO_DECODER_SECONDARY) { + bufreq = get_buff_req_buffer(inst, + HAL_BUFFER_OUTPUT); + if (!bufreq) { + dprintk(VIDC_ERR, "Buffer requirements failed\n"); + goto fail_start; + } + /* For DPB buffers, Always use min count */ + rc = msm_comm_set_buffer_count(inst, + bufreq->buffer_count_min, + bufreq->buffer_count_min, + HAL_BUFFER_OUTPUT); + if (rc) { + dprintk(VIDC_ERR, + "failed to set buffer count\n"); + goto fail_start; + } + } + rc = msm_comm_set_scratch_buffers(inst); if (rc) { dprintk(VIDC_ERR, diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.c b/drivers/media/platform/msm/vidc/msm_vidc_common.c index fec9ec0c3b21..f3f58b99160b 100755 --- a/drivers/media/platform/msm/vidc/msm_vidc_common.c +++ b/drivers/media/platform/msm/vidc/msm_vidc_common.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2020, 2021 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -2473,6 +2473,7 @@ static bool is_eos_buffer(struct msm_vidc_inst *inst, u32 device_addr) list_for_each_entry_safe(temp, next, &inst->eosbufs.list, list) { if (temp->smem.device_addr == device_addr) { found = true; + temp->is_queued = 0; list_del(&temp->list); msm_comm_smem_free(inst, &temp->smem); kfree(temp); @@ -4098,6 +4099,9 @@ int msm_vidc_send_pending_eos_buffers(struct msm_vidc_inst *inst) mutex_lock(&inst->eosbufs.lock); list_for_each_entry_safe(binfo, temp, &inst->eosbufs.list, list) { + if (binfo->is_queued) + continue; + data.alloc_len = binfo->smem.size; data.device_addr = binfo->smem.device_addr; data.buffer_type = HAL_BUFFER_INPUT; @@ -4113,6 +4117,7 @@ int msm_vidc_send_pending_eos_buffers(struct msm_vidc_inst *inst) rc = call_hfi_op(hdev, session_etb, inst->session, &data); + binfo->is_queued = 1; } mutex_unlock(&inst->eosbufs.lock); @@ -4192,7 +4197,6 @@ int msm_vidc_comm_cmd(void *instance, union msm_v4l2_cmd *cmd) mutex_lock(&inst->eosbufs.lock); list_add_tail(&binfo->list, &inst->eosbufs.list); mutex_unlock(&inst->eosbufs.lock); - rc = msm_vidc_send_pending_eos_buffers(inst); if (rc) { dprintk(VIDC_ERR, @@ -4675,6 +4679,17 @@ int msm_comm_try_get_bufreqs(struct msm_vidc_inst *inst) } } + /* Buffer size will be double when the resolution is + * 360p < resolution <= 720p + */ + for (i = 0; i < HAL_BUFFER_MAX; i++) { + if ((inst->buff_req.buffer[i].buffer_type == HAL_BUFFER_OUTPUT) && + (inst->buff_req.buffer[i].buffer_size >= 175000 && + inst->buff_req.buffer[i].buffer_size <= 900000)) { + inst->buff_req.buffer[i].buffer_size *= 2; + } + } + dprintk(VIDC_DBG, "Buffer requirements driver adjusted:\n"); dprintk(VIDC_DBG, "%15s %8s %8s %8s %8s\n", "buffer type", "count", "mincount_host", "mincount_fw", "size"); diff --git a/drivers/media/platform/msm/vidc/msm_vidc_internal.h b/drivers/media/platform/msm/vidc/msm_vidc_internal.h index b8ebabc7d4fa..b2cad6dab3e2 100755 --- a/drivers/media/platform/msm/vidc/msm_vidc_internal.h +++ b/drivers/media/platform/msm/vidc/msm_vidc_internal.h @@ -177,6 +177,7 @@ struct recon_buf { struct eos_buf { struct list_head list; struct msm_smem smem; + u32 is_queued; }; struct internal_buf { diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index ef086f03abb2..0b4c80430aab 100755 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -3042,6 +3042,10 @@ static int qseecom_unload_app(struct qseecom_dev_handle *data, pr_debug("unload app %d(%s), app_crash flag %d\n", data->client.app_id, data->client.app_name, app_crash); + if (!memcmp(data->client.app_name, "dsms", strlen("dsms"))) { + pr_debug("Do not unload dsms app from tz\n"); + goto unload_exit; + } if (!memcmp(data->client.app_name, "keymaste", strlen("keymaste"))) { pr_debug("Do not unload keymaster app from tz\n"); diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 6885e71e5529..5e5550e7c76d 100755 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -60,6 +60,10 @@ #define ST_LOG(fmt, ...) #endif +#if defined(CONFIG_SEC_ABC) +#include +#endif + /* If the device is not responding */ #define MMC_CORE_TIMEOUT_MS (10 * 60 * 1000) /* 10 minute timeout */ @@ -4260,6 +4264,25 @@ static int mmc_rescan_try_freq(struct mmc_host *host, unsigned freq) return -EIO; } +#if defined(CONFIG_SEC_ABC) +void _mmc_trigger_abc_event(struct mmc_host *host) +{ + if (host->ops->get_cd && host->ops->get_cd(host)) { + host->card_removed_cnt++; + if ((host->card_removed_cnt % 5) == 0) +#if defined(CONFIG_SEC_FACTORY) + sec_abc_send_event("MODULE=storage@INFO=sd_removed_err"); +#else + sec_abc_send_event("MODULE=storage@WARN=sd_removed_err"); +#endif + } +} +#else +void _mmc_trigger_abc_event(struct mmc_host *host) +{ +} +#endif + int _mmc_detect_card_removed(struct mmc_host *host) { int ret, i = 0; @@ -4288,6 +4311,7 @@ int _mmc_detect_card_removed(struct mmc_host *host) if (ret) { mmc_card_set_removed(host->card); pr_err("%s: card remove detected\n", mmc_hostname(host)); + _mmc_trigger_abc_event(host); for (i = 0; i < 6; i++) { if (err_log[i].err_type == -EILSEQ && total_crc_cnt < MAX_CNT_U64) diff --git a/drivers/muic/common/muic-core.c b/drivers/muic/common/muic-core.c index ff874bfea087..35838ab0302f 100755 --- a/drivers/muic/common/muic-core.c +++ b/drivers/muic/common/muic-core.c @@ -538,6 +538,56 @@ int muic_afc_set_voltage(int voltage) pr_err("%s: cannot supported\n", __func__); return -ENODEV; } + +int muic_afc_request_cause_clear(void) +{ + struct muic_platform_data *pdata = &muic_pdata; + + if (pdata == NULL) + return -ENOENT; + pdata->afc_request_cause = 0; + return 0; +} + +int muic_afc_request_voltage_check(int cause, int vol) +{ + int ret = 0; + + if (vol == 9 && cause == 0) + ret = 9; + else + ret = 5; + pr_info("%s: cause=%x %dv->%dv\n", __func__, cause, vol, ret); + return ret; +} + +int muic_afc_request_voltage(int cause, int voltage) +{ + struct muic_platform_data *pdata = &muic_pdata; + int set_vol = 0, ret = 0; + + if (pdata == NULL) { + ret = -ENOENT; + goto out; + } + + if (voltage == 9) { + pr_info("%s: afc request clear, cause(%d), voltage(%d)\n", __func__, cause, voltage); + pdata->afc_request_cause &= ~(cause); + } else if (voltage == 5) { + pr_info("%s: afc request set, cause(%d), voltage(%d)\n", __func__, cause, voltage); + pdata->afc_request_cause |= (cause); + } else { + pr_err("%s: not support. cause(%d), voltage(%d)\n", __func__, cause, voltage); + ret = -EINVAL; + goto out; + } + + set_vol = muic_afc_request_voltage_check(pdata->afc_request_cause, voltage); + ret = muic_afc_set_voltage(set_vol); +out: + return ret; +} int muic_hv_charger_disable(bool en) { diff --git a/drivers/muic/s2mu106-muic.c b/drivers/muic/s2mu106-muic.c index 48325c4ba225..121b94c6ff55 100755 --- a/drivers/muic/s2mu106-muic.c +++ b/drivers/muic/s2mu106-muic.c @@ -2990,7 +2990,7 @@ static int s2mu106_muic_probe(struct platform_device *pdev) s2mu106_muic_attach_isr(-1, muic_data); cancel_delayed_work(&muic_data->rescan_validity_checker); schedule_delayed_work(&muic_data->rescan_validity_checker, - msecs_to_jiffies(1200)); + msecs_to_jiffies(1700)); #endif } return 0; diff --git a/drivers/muic/sm/sm5714/sm5714-muic-afc.c b/drivers/muic/sm/sm5714/sm5714-muic-afc.c index 409e7f33ac37..a63a5fd1d2cb 100755 --- a/drivers/muic/sm/sm5714/sm5714-muic-afc.c +++ b/drivers/muic/sm/sm5714/sm5714-muic-afc.c @@ -141,6 +141,7 @@ EXPORT_SYMBOL(muic_request_disable_afc_state); int muic_check_fled_state(int enable, int mode) { struct sm5714_muic_data *muic_data = afc_init_data; + int hv_voltage = 9; pr_info("[%s:%s] enable(%d), mode(%d)\n", MUIC_DEV_NAME, __func__, enable, mode); @@ -166,7 +167,10 @@ int muic_check_fled_state(int enable, int mode) if ((muic_data->fled_torch_enable == false) && (muic_data->fled_flash_enable == false)) { - if (muic_data->hv_voltage == 5) { + if (muic_data->pdata) + hv_voltage = muic_afc_request_voltage_check(muic_data->pdata->afc_request_cause, 9); + + if (muic_data->hv_voltage == 5 || hv_voltage != 9) { pr_info("[%s:%s] skip high voltage setting\n", MUIC_DEV_NAME, __func__); return 0; @@ -473,11 +477,17 @@ int sm5714_muic_voltage_control(struct sm5714_muic_data *muic_data, static void muic_afc_torch_work(struct work_struct *work) { struct sm5714_muic_data *muic_data = afc_init_data; + int voltage = 5; + + if (muic_data && muic_data->pdata) { + voltage = muic_afc_request_voltage_check(muic_data->pdata->afc_request_cause, 9); + } pr_info("[%s:%s]\n", MUIC_DEV_NAME, __func__); + pr_info("[%s:%s] voltage:%d\n", MUIC_DEV_NAME, __func__, voltage); - if ((muic_data->fled_torch_enable == 1) || (muic_data->fled_flash_enable == 1)) { - pr_info("[%s:%s] FLASH or Torch On, Skip 5V -> 9V\n", + if ((muic_data->fled_torch_enable == 1) || (muic_data->fled_flash_enable == 1) || (voltage != 9)) { + pr_info("[%s:%s] FLASH or Torch On or AFC 5V requested, Skip 5V -> 9V\n", MUIC_DEV_NAME, __func__); return; } @@ -536,6 +546,7 @@ int sm5714_afc_ta_attach(struct sm5714_muic_data *muic_data) union power_supply_propval value; int retry = 0; int dev1 = 0, dev2 = 0; + int afc_voltage = 9; pr_info("[%s:%s] AFC_TA_ATTACHED\n", MUIC_DEV_NAME, __func__); @@ -612,6 +623,18 @@ int sm5714_afc_ta_attach(struct sm5714_muic_data *muic_data) return 0; } + if (muic_data && muic_data->pdata) { + afc_voltage = muic_afc_request_voltage_check(muic_data->pdata->afc_request_cause, 9); + } + + if (afc_voltage == 5) { + pr_info("[%s:%s] Requested AFC Voltage is 5, Skip AFC\n", + MUIC_DEV_NAME, __func__); + muic_data->attached_dev = ATTACHED_DEV_AFC_CHARGER_DISABLED_MUIC; + muic_notifier_attach_attached_dev(muic_data->attached_dev); + return 0; + } + #if defined(CONFIG_MUIC_SUPPORT_PDIC) if (muic_data->pdic_afc_state == SM5714_MUIC_AFC_ABNORMAL) { muic_data->pdic_afc_state_count = 0; diff --git a/drivers/muic/sm/sm5714/sm5714-muic.c b/drivers/muic/sm/sm5714/sm5714-muic.c index e22afc005d29..f22ff5aaace0 100755 --- a/drivers/muic/sm/sm5714/sm5714-muic.c +++ b/drivers/muic/sm/sm5714/sm5714-muic.c @@ -1476,6 +1476,7 @@ static void sm5714_muic_handle_detach(struct sm5714_muic_data *muic_data, muic_data->bc12_retry_count = 0; #endif muic_data->hv_voltage = 0; + muic_afc_request_cause_clear(); } static void sm5714_muic_detect_dev(struct sm5714_muic_data *muic_data, int irq) diff --git a/drivers/net/ethernet/broadcom/Makefile b/drivers/net/ethernet/broadcom/Makefile index 7046ad6d3d0e..eecc432640a5 100755 --- a/drivers/net/ethernet/broadcom/Makefile +++ b/drivers/net/ethernet/broadcom/Makefile @@ -10,7 +10,6 @@ obj-$(CONFIG_BNX2) += bnx2.o obj-$(CONFIG_CNIC) += cnic.o obj-$(CONFIG_BNX2X) += bnx2x/ obj-$(CONFIG_SB1250_MAC) += sb1250-mac.o -obj-$(CONFIG_TIGON3) += tg3.o obj-$(CONFIG_BGMAC) += bgmac.o obj-$(CONFIG_BGMAC_BCMA) += bgmac-bcma.o bgmac-bcma-mdio.o obj-$(CONFIG_BGMAC_PLATFORM) += bgmac-platform.o diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c deleted file mode 100755 index e40d31b40525..000000000000 --- a/drivers/net/ethernet/broadcom/tg3.c +++ /dev/null @@ -1,18330 +0,0 @@ -/* - * tg3.c: Broadcom Tigon3 ethernet driver. - * - * Copyright (C) 2001, 2002, 2003, 2004 David S. Miller (davem@redhat.com) - * Copyright (C) 2001, 2002, 2003 Jeff Garzik (jgarzik@pobox.com) - * Copyright (C) 2004 Sun Microsystems Inc. - * Copyright (C) 2005-2014 Broadcom Corporation. - * - * Firmware is: - * Derived from proprietary unpublished source code, - * Copyright (C) 2000-2003 Broadcom Corporation. - * - * Permission is hereby granted for the distribution of this firmware - * data in hexadecimal or equivalent format, provided this copyright - * notice is accompanying it. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include -#include - -#ifdef CONFIG_SPARC -#include -#include -#endif - -#define BAR_0 0 -#define BAR_2 2 - -#include "tg3.h" - -/* Functions & macros to verify TG3_FLAGS types */ - -static inline int _tg3_flag(enum TG3_FLAGS flag, unsigned long *bits) -{ - return test_bit(flag, bits); -} - -static inline void _tg3_flag_set(enum TG3_FLAGS flag, unsigned long *bits) -{ - set_bit(flag, bits); -} - -static inline void _tg3_flag_clear(enum TG3_FLAGS flag, unsigned long *bits) -{ - clear_bit(flag, bits); -} - -#define tg3_flag(tp, flag) \ - _tg3_flag(TG3_FLAG_##flag, (tp)->tg3_flags) -#define tg3_flag_set(tp, flag) \ - _tg3_flag_set(TG3_FLAG_##flag, (tp)->tg3_flags) -#define tg3_flag_clear(tp, flag) \ - _tg3_flag_clear(TG3_FLAG_##flag, (tp)->tg3_flags) - -#define DRV_MODULE_NAME "tg3" -#define TG3_MAJ_NUM 3 -#define TG3_MIN_NUM 137 -#define DRV_MODULE_VERSION \ - __stringify(TG3_MAJ_NUM) "." __stringify(TG3_MIN_NUM) -#define DRV_MODULE_RELDATE "May 11, 2014" - -#define RESET_KIND_SHUTDOWN 0 -#define RESET_KIND_INIT 1 -#define RESET_KIND_SUSPEND 2 - -#define TG3_DEF_RX_MODE 0 -#define TG3_DEF_TX_MODE 0 -#define TG3_DEF_MSG_ENABLE \ - (NETIF_MSG_DRV | \ - NETIF_MSG_PROBE | \ - NETIF_MSG_LINK | \ - NETIF_MSG_TIMER | \ - NETIF_MSG_IFDOWN | \ - NETIF_MSG_IFUP | \ - NETIF_MSG_RX_ERR | \ - NETIF_MSG_TX_ERR) - -#define TG3_GRC_LCLCTL_PWRSW_DELAY 100 - -/* length of time before we decide the hardware is borked, - * and dev->tx_timeout() should be called to fix the problem - */ - -#define TG3_TX_TIMEOUT (5 * HZ) - -/* hardware minimum and maximum for a single frame's data payload */ -#define TG3_MIN_MTU ETH_ZLEN -#define TG3_MAX_MTU(tp) \ - (tg3_flag(tp, JUMBO_CAPABLE) ? 9000 : 1500) - -/* These numbers seem to be hard coded in the NIC firmware somehow. - * You can't change the ring sizes, but you can change where you place - * them in the NIC onboard memory. - */ -#define TG3_RX_STD_RING_SIZE(tp) \ - (tg3_flag(tp, LRG_PROD_RING_CAP) ? \ - TG3_RX_STD_MAX_SIZE_5717 : TG3_RX_STD_MAX_SIZE_5700) -#define TG3_DEF_RX_RING_PENDING 200 -#define TG3_RX_JMB_RING_SIZE(tp) \ - (tg3_flag(tp, LRG_PROD_RING_CAP) ? \ - TG3_RX_JMB_MAX_SIZE_5717 : TG3_RX_JMB_MAX_SIZE_5700) -#define TG3_DEF_RX_JUMBO_RING_PENDING 100 - -/* Do not place this n-ring entries value into the tp struct itself, - * we really want to expose these constants to GCC so that modulo et - * al. operations are done with shifts and masks instead of with - * hw multiply/modulo instructions. Another solution would be to - * replace things like '% foo' with '& (foo - 1)'. - */ - -#define TG3_TX_RING_SIZE 512 -#define TG3_DEF_TX_RING_PENDING (TG3_TX_RING_SIZE - 1) - -#define TG3_RX_STD_RING_BYTES(tp) \ - (sizeof(struct tg3_rx_buffer_desc) * TG3_RX_STD_RING_SIZE(tp)) -#define TG3_RX_JMB_RING_BYTES(tp) \ - (sizeof(struct tg3_ext_rx_buffer_desc) * TG3_RX_JMB_RING_SIZE(tp)) -#define TG3_RX_RCB_RING_BYTES(tp) \ - (sizeof(struct tg3_rx_buffer_desc) * (tp->rx_ret_ring_mask + 1)) -#define TG3_TX_RING_BYTES (sizeof(struct tg3_tx_buffer_desc) * \ - TG3_TX_RING_SIZE) -#define NEXT_TX(N) (((N) + 1) & (TG3_TX_RING_SIZE - 1)) - -#define TG3_DMA_BYTE_ENAB 64 - -#define TG3_RX_STD_DMA_SZ 1536 -#define TG3_RX_JMB_DMA_SZ 9046 - -#define TG3_RX_DMA_TO_MAP_SZ(x) ((x) + TG3_DMA_BYTE_ENAB) - -#define TG3_RX_STD_MAP_SZ TG3_RX_DMA_TO_MAP_SZ(TG3_RX_STD_DMA_SZ) -#define TG3_RX_JMB_MAP_SZ TG3_RX_DMA_TO_MAP_SZ(TG3_RX_JMB_DMA_SZ) - -#define TG3_RX_STD_BUFF_RING_SIZE(tp) \ - (sizeof(struct ring_info) * TG3_RX_STD_RING_SIZE(tp)) - -#define TG3_RX_JMB_BUFF_RING_SIZE(tp) \ - (sizeof(struct ring_info) * TG3_RX_JMB_RING_SIZE(tp)) - -/* Due to a hardware bug, the 5701 can only DMA to memory addresses - * that are at least dword aligned when used in PCIX mode. The driver - * works around this bug by double copying the packet. This workaround - * is built into the normal double copy length check for efficiency. - * - * However, the double copy is only necessary on those architectures - * where unaligned memory accesses are inefficient. For those architectures - * where unaligned memory accesses incur little penalty, we can reintegrate - * the 5701 in the normal rx path. Doing so saves a device structure - * dereference by hardcoding the double copy threshold in place. - */ -#define TG3_RX_COPY_THRESHOLD 256 -#if NET_IP_ALIGN == 0 || defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) - #define TG3_RX_COPY_THRESH(tp) TG3_RX_COPY_THRESHOLD -#else - #define TG3_RX_COPY_THRESH(tp) ((tp)->rx_copy_thresh) -#endif - -#if (NET_IP_ALIGN != 0) -#define TG3_RX_OFFSET(tp) ((tp)->rx_offset) -#else -#define TG3_RX_OFFSET(tp) (NET_SKB_PAD) -#endif - -/* minimum number of free TX descriptors required to wake up TX process */ -#define TG3_TX_WAKEUP_THRESH(tnapi) ((tnapi)->tx_pending / 4) -#define TG3_TX_BD_DMA_MAX_2K 2048 -#define TG3_TX_BD_DMA_MAX_4K 4096 - -#define TG3_RAW_IP_ALIGN 2 - -#define TG3_MAX_UCAST_ADDR(tp) (tg3_flag((tp), ENABLE_ASF) ? 2 : 3) -#define TG3_UCAST_ADDR_IDX(tp) (tg3_flag((tp), ENABLE_ASF) ? 2 : 1) - -#define TG3_FW_UPDATE_TIMEOUT_SEC 5 -#define TG3_FW_UPDATE_FREQ_SEC (TG3_FW_UPDATE_TIMEOUT_SEC / 2) - -#define FIRMWARE_TG3 "tigon/tg3.bin" -#define FIRMWARE_TG357766 "tigon/tg357766.bin" -#define FIRMWARE_TG3TSO "tigon/tg3_tso.bin" -#define FIRMWARE_TG3TSO5 "tigon/tg3_tso5.bin" - -static char version[] = - DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")"; - -MODULE_AUTHOR("David S. Miller (davem@redhat.com) and Jeff Garzik (jgarzik@pobox.com)"); -MODULE_DESCRIPTION("Broadcom Tigon3 ethernet driver"); -MODULE_LICENSE("GPL"); -MODULE_VERSION(DRV_MODULE_VERSION); -MODULE_FIRMWARE(FIRMWARE_TG3); -MODULE_FIRMWARE(FIRMWARE_TG3TSO); -MODULE_FIRMWARE(FIRMWARE_TG3TSO5); - -static int tg3_debug = -1; /* -1 == use TG3_DEF_MSG_ENABLE as value */ -module_param(tg3_debug, int, 0); -MODULE_PARM_DESC(tg3_debug, "Tigon3 bitmapped debugging message enable value"); - -#define TG3_DRV_DATA_FLAG_10_100_ONLY 0x0001 -#define TG3_DRV_DATA_FLAG_5705_10_100 0x0002 - -static const struct pci_device_id tg3_pci_tbl[] = { - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5700)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5701)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702FE)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705_2)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705M)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705M_2)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702X)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703X)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704S)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702A3)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703A3)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5782)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5788)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5789)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901), - .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY | - TG3_DRV_DATA_FLAG_5705_10_100}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901_2), - .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY | - TG3_DRV_DATA_FLAG_5705_10_100}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704S_2)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705F), - .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY | - TG3_DRV_DATA_FLAG_5705_10_100}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5721)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5722)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5750)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751M)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751F), - .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5752)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5752M)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753M)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753F), - .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754M)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755M)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5756)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5786)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787)}, - {PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5787M, - PCI_VENDOR_ID_LENOVO, - TG3PCI_SUBDEVICE_ID_LENOVO_5787M), - .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787M)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787F), - .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714S)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715S)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780S)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5781)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5906)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5906M)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5784)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5764)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5723)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5761)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5761E)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5761S)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5761SE)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5785_G)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5785_F)}, - {PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57780, - PCI_VENDOR_ID_AI, TG3PCI_SUBDEVICE_ID_ACER_57780_A), - .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY}, - {PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57780, - PCI_VENDOR_ID_AI, TG3PCI_SUBDEVICE_ID_ACER_57780_B), - .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57780)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57760)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57790), - .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57788)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5717)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5717_C)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5718)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57781)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57785)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57761)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57765)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57791), - .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57795), - .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5719)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5720)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57762)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57766)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5762)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5725)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5727)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57764)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57767)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57787)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57782)}, - {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57786)}, - {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX)}, - {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX)}, - {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1000)}, - {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1001)}, - {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1003)}, - {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC9100)}, - {PCI_DEVICE(PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_TIGON3)}, - {PCI_DEVICE(0x10cf, 0x11a2)}, /* Fujitsu 1000base-SX with BCM5703SKHB */ - {} -}; - -MODULE_DEVICE_TABLE(pci, tg3_pci_tbl); - -static const struct { - const char string[ETH_GSTRING_LEN]; -} ethtool_stats_keys[] = { - { "rx_octets" }, - { "rx_fragments" }, - { "rx_ucast_packets" }, - { "rx_mcast_packets" }, - { "rx_bcast_packets" }, - { "rx_fcs_errors" }, - { "rx_align_errors" }, - { "rx_xon_pause_rcvd" }, - { "rx_xoff_pause_rcvd" }, - { "rx_mac_ctrl_rcvd" }, - { "rx_xoff_entered" }, - { "rx_frame_too_long_errors" }, - { "rx_jabbers" }, - { "rx_undersize_packets" }, - { "rx_in_length_errors" }, - { "rx_out_length_errors" }, - { "rx_64_or_less_octet_packets" }, - { "rx_65_to_127_octet_packets" }, - { "rx_128_to_255_octet_packets" }, - { "rx_256_to_511_octet_packets" }, - { "rx_512_to_1023_octet_packets" }, - { "rx_1024_to_1522_octet_packets" }, - { "rx_1523_to_2047_octet_packets" }, - { "rx_2048_to_4095_octet_packets" }, - { "rx_4096_to_8191_octet_packets" }, - { "rx_8192_to_9022_octet_packets" }, - - { "tx_octets" }, - { "tx_collisions" }, - - { "tx_xon_sent" }, - { "tx_xoff_sent" }, - { "tx_flow_control" }, - { "tx_mac_errors" }, - { "tx_single_collisions" }, - { "tx_mult_collisions" }, - { "tx_deferred" }, - { "tx_excessive_collisions" }, - { "tx_late_collisions" }, - { "tx_collide_2times" }, - { "tx_collide_3times" }, - { "tx_collide_4times" }, - { "tx_collide_5times" }, - { "tx_collide_6times" }, - { "tx_collide_7times" }, - { "tx_collide_8times" }, - { "tx_collide_9times" }, - { "tx_collide_10times" }, - { "tx_collide_11times" }, - { "tx_collide_12times" }, - { "tx_collide_13times" }, - { "tx_collide_14times" }, - { "tx_collide_15times" }, - { "tx_ucast_packets" }, - { "tx_mcast_packets" }, - { "tx_bcast_packets" }, - { "tx_carrier_sense_errors" }, - { "tx_discards" }, - { "tx_errors" }, - - { "dma_writeq_full" }, - { "dma_write_prioq_full" }, - { "rxbds_empty" }, - { "rx_discards" }, - { "rx_errors" }, - { "rx_threshold_hit" }, - - { "dma_readq_full" }, - { "dma_read_prioq_full" }, - { "tx_comp_queue_full" }, - - { "ring_set_send_prod_index" }, - { "ring_status_update" }, - { "nic_irqs" }, - { "nic_avoided_irqs" }, - { "nic_tx_threshold_hit" }, - - { "mbuf_lwm_thresh_hit" }, -}; - -#define TG3_NUM_STATS ARRAY_SIZE(ethtool_stats_keys) -#define TG3_NVRAM_TEST 0 -#define TG3_LINK_TEST 1 -#define TG3_REGISTER_TEST 2 -#define TG3_MEMORY_TEST 3 -#define TG3_MAC_LOOPB_TEST 4 -#define TG3_PHY_LOOPB_TEST 5 -#define TG3_EXT_LOOPB_TEST 6 -#define TG3_INTERRUPT_TEST 7 - - -static const struct { - const char string[ETH_GSTRING_LEN]; -} ethtool_test_keys[] = { - [TG3_NVRAM_TEST] = { "nvram test (online) " }, - [TG3_LINK_TEST] = { "link test (online) " }, - [TG3_REGISTER_TEST] = { "register test (offline)" }, - [TG3_MEMORY_TEST] = { "memory test (offline)" }, - [TG3_MAC_LOOPB_TEST] = { "mac loopback test (offline)" }, - [TG3_PHY_LOOPB_TEST] = { "phy loopback test (offline)" }, - [TG3_EXT_LOOPB_TEST] = { "ext loopback test (offline)" }, - [TG3_INTERRUPT_TEST] = { "interrupt test (offline)" }, -}; - -#define TG3_NUM_TEST ARRAY_SIZE(ethtool_test_keys) - - -static void tg3_write32(struct tg3 *tp, u32 off, u32 val) -{ - writel(val, tp->regs + off); -} - -static u32 tg3_read32(struct tg3 *tp, u32 off) -{ - return readl(tp->regs + off); -} - -static void tg3_ape_write32(struct tg3 *tp, u32 off, u32 val) -{ - writel(val, tp->aperegs + off); -} - -static u32 tg3_ape_read32(struct tg3 *tp, u32 off) -{ - return readl(tp->aperegs + off); -} - -static void tg3_write_indirect_reg32(struct tg3 *tp, u32 off, u32 val) -{ - unsigned long flags; - - spin_lock_irqsave(&tp->indirect_lock, flags); - pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off); - pci_write_config_dword(tp->pdev, TG3PCI_REG_DATA, val); - spin_unlock_irqrestore(&tp->indirect_lock, flags); -} - -static void tg3_write_flush_reg32(struct tg3 *tp, u32 off, u32 val) -{ - writel(val, tp->regs + off); - readl(tp->regs + off); -} - -static u32 tg3_read_indirect_reg32(struct tg3 *tp, u32 off) -{ - unsigned long flags; - u32 val; - - spin_lock_irqsave(&tp->indirect_lock, flags); - pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off); - pci_read_config_dword(tp->pdev, TG3PCI_REG_DATA, &val); - spin_unlock_irqrestore(&tp->indirect_lock, flags); - return val; -} - -static void tg3_write_indirect_mbox(struct tg3 *tp, u32 off, u32 val) -{ - unsigned long flags; - - if (off == (MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW)) { - pci_write_config_dword(tp->pdev, TG3PCI_RCV_RET_RING_CON_IDX + - TG3_64BIT_REG_LOW, val); - return; - } - if (off == TG3_RX_STD_PROD_IDX_REG) { - pci_write_config_dword(tp->pdev, TG3PCI_STD_RING_PROD_IDX + - TG3_64BIT_REG_LOW, val); - return; - } - - spin_lock_irqsave(&tp->indirect_lock, flags); - pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off + 0x5600); - pci_write_config_dword(tp->pdev, TG3PCI_REG_DATA, val); - spin_unlock_irqrestore(&tp->indirect_lock, flags); - - /* In indirect mode when disabling interrupts, we also need - * to clear the interrupt bit in the GRC local ctrl register. - */ - if ((off == (MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW)) && - (val == 0x1)) { - pci_write_config_dword(tp->pdev, TG3PCI_MISC_LOCAL_CTRL, - tp->grc_local_ctrl|GRC_LCLCTRL_CLEARINT); - } -} - -static u32 tg3_read_indirect_mbox(struct tg3 *tp, u32 off) -{ - unsigned long flags; - u32 val; - - spin_lock_irqsave(&tp->indirect_lock, flags); - pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off + 0x5600); - pci_read_config_dword(tp->pdev, TG3PCI_REG_DATA, &val); - spin_unlock_irqrestore(&tp->indirect_lock, flags); - return val; -} - -/* usec_wait specifies the wait time in usec when writing to certain registers - * where it is unsafe to read back the register without some delay. - * GRC_LOCAL_CTRL is one example if the GPIOs are toggled to switch power. - * TG3PCI_CLOCK_CTRL is another example if the clock frequencies are changed. - */ -static void _tw32_flush(struct tg3 *tp, u32 off, u32 val, u32 usec_wait) -{ - if (tg3_flag(tp, PCIX_TARGET_HWBUG) || tg3_flag(tp, ICH_WORKAROUND)) - /* Non-posted methods */ - tp->write32(tp, off, val); - else { - /* Posted method */ - tg3_write32(tp, off, val); - if (usec_wait) - udelay(usec_wait); - tp->read32(tp, off); - } - /* Wait again after the read for the posted method to guarantee that - * the wait time is met. - */ - if (usec_wait) - udelay(usec_wait); -} - -static inline void tw32_mailbox_flush(struct tg3 *tp, u32 off, u32 val) -{ - tp->write32_mbox(tp, off, val); - if (tg3_flag(tp, FLUSH_POSTED_WRITES) || - (!tg3_flag(tp, MBOX_WRITE_REORDER) && - !tg3_flag(tp, ICH_WORKAROUND))) - tp->read32_mbox(tp, off); -} - -static void tg3_write32_tx_mbox(struct tg3 *tp, u32 off, u32 val) -{ - void __iomem *mbox = tp->regs + off; - writel(val, mbox); - if (tg3_flag(tp, TXD_MBOX_HWBUG)) - writel(val, mbox); - if (tg3_flag(tp, MBOX_WRITE_REORDER) || - tg3_flag(tp, FLUSH_POSTED_WRITES)) - readl(mbox); -} - -static u32 tg3_read32_mbox_5906(struct tg3 *tp, u32 off) -{ - return readl(tp->regs + off + GRCMBOX_BASE); -} - -static void tg3_write32_mbox_5906(struct tg3 *tp, u32 off, u32 val) -{ - writel(val, tp->regs + off + GRCMBOX_BASE); -} - -#define tw32_mailbox(reg, val) tp->write32_mbox(tp, reg, val) -#define tw32_mailbox_f(reg, val) tw32_mailbox_flush(tp, (reg), (val)) -#define tw32_rx_mbox(reg, val) tp->write32_rx_mbox(tp, reg, val) -#define tw32_tx_mbox(reg, val) tp->write32_tx_mbox(tp, reg, val) -#define tr32_mailbox(reg) tp->read32_mbox(tp, reg) - -#define tw32(reg, val) tp->write32(tp, reg, val) -#define tw32_f(reg, val) _tw32_flush(tp, (reg), (val), 0) -#define tw32_wait_f(reg, val, us) _tw32_flush(tp, (reg), (val), (us)) -#define tr32(reg) tp->read32(tp, reg) - -static void tg3_write_mem(struct tg3 *tp, u32 off, u32 val) -{ - unsigned long flags; - - if (tg3_asic_rev(tp) == ASIC_REV_5906 && - (off >= NIC_SRAM_STATS_BLK) && (off < NIC_SRAM_TX_BUFFER_DESC)) - return; - - spin_lock_irqsave(&tp->indirect_lock, flags); - if (tg3_flag(tp, SRAM_USE_CONFIG)) { - pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); - pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); - - /* Always leave this as zero. */ - pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); - } else { - tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off); - tw32_f(TG3PCI_MEM_WIN_DATA, val); - - /* Always leave this as zero. */ - tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0); - } - spin_unlock_irqrestore(&tp->indirect_lock, flags); -} - -static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val) -{ - unsigned long flags; - - if (tg3_asic_rev(tp) == ASIC_REV_5906 && - (off >= NIC_SRAM_STATS_BLK) && (off < NIC_SRAM_TX_BUFFER_DESC)) { - *val = 0; - return; - } - - spin_lock_irqsave(&tp->indirect_lock, flags); - if (tg3_flag(tp, SRAM_USE_CONFIG)) { - pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); - pci_read_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); - - /* Always leave this as zero. */ - pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); - } else { - tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off); - *val = tr32(TG3PCI_MEM_WIN_DATA); - - /* Always leave this as zero. */ - tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0); - } - spin_unlock_irqrestore(&tp->indirect_lock, flags); -} - -static void tg3_ape_lock_init(struct tg3 *tp) -{ - int i; - u32 regbase, bit; - - if (tg3_asic_rev(tp) == ASIC_REV_5761) - regbase = TG3_APE_LOCK_GRANT; - else - regbase = TG3_APE_PER_LOCK_GRANT; - - /* Make sure the driver hasn't any stale locks. */ - for (i = TG3_APE_LOCK_PHY0; i <= TG3_APE_LOCK_GPIO; i++) { - switch (i) { - case TG3_APE_LOCK_PHY0: - case TG3_APE_LOCK_PHY1: - case TG3_APE_LOCK_PHY2: - case TG3_APE_LOCK_PHY3: - bit = APE_LOCK_GRANT_DRIVER; - break; - default: - if (!tp->pci_fn) - bit = APE_LOCK_GRANT_DRIVER; - else - bit = 1 << tp->pci_fn; - } - tg3_ape_write32(tp, regbase + 4 * i, bit); - } - -} - -static int tg3_ape_lock(struct tg3 *tp, int locknum) -{ - int i, off; - int ret = 0; - u32 status, req, gnt, bit; - - if (!tg3_flag(tp, ENABLE_APE)) - return 0; - - switch (locknum) { - case TG3_APE_LOCK_GPIO: - if (tg3_asic_rev(tp) == ASIC_REV_5761) - return 0; - case TG3_APE_LOCK_GRC: - case TG3_APE_LOCK_MEM: - if (!tp->pci_fn) - bit = APE_LOCK_REQ_DRIVER; - else - bit = 1 << tp->pci_fn; - break; - case TG3_APE_LOCK_PHY0: - case TG3_APE_LOCK_PHY1: - case TG3_APE_LOCK_PHY2: - case TG3_APE_LOCK_PHY3: - bit = APE_LOCK_REQ_DRIVER; - break; - default: - return -EINVAL; - } - - if (tg3_asic_rev(tp) == ASIC_REV_5761) { - req = TG3_APE_LOCK_REQ; - gnt = TG3_APE_LOCK_GRANT; - } else { - req = TG3_APE_PER_LOCK_REQ; - gnt = TG3_APE_PER_LOCK_GRANT; - } - - off = 4 * locknum; - - tg3_ape_write32(tp, req + off, bit); - - /* Wait for up to 1 millisecond to acquire lock. */ - for (i = 0; i < 100; i++) { - status = tg3_ape_read32(tp, gnt + off); - if (status == bit) - break; - if (pci_channel_offline(tp->pdev)) - break; - - udelay(10); - } - - if (status != bit) { - /* Revoke the lock request. */ - tg3_ape_write32(tp, gnt + off, bit); - ret = -EBUSY; - } - - return ret; -} - -static void tg3_ape_unlock(struct tg3 *tp, int locknum) -{ - u32 gnt, bit; - - if (!tg3_flag(tp, ENABLE_APE)) - return; - - switch (locknum) { - case TG3_APE_LOCK_GPIO: - if (tg3_asic_rev(tp) == ASIC_REV_5761) - return; - case TG3_APE_LOCK_GRC: - case TG3_APE_LOCK_MEM: - if (!tp->pci_fn) - bit = APE_LOCK_GRANT_DRIVER; - else - bit = 1 << tp->pci_fn; - break; - case TG3_APE_LOCK_PHY0: - case TG3_APE_LOCK_PHY1: - case TG3_APE_LOCK_PHY2: - case TG3_APE_LOCK_PHY3: - bit = APE_LOCK_GRANT_DRIVER; - break; - default: - return; - } - - if (tg3_asic_rev(tp) == ASIC_REV_5761) - gnt = TG3_APE_LOCK_GRANT; - else - gnt = TG3_APE_PER_LOCK_GRANT; - - tg3_ape_write32(tp, gnt + 4 * locknum, bit); -} - -static int tg3_ape_event_lock(struct tg3 *tp, u32 timeout_us) -{ - u32 apedata; - - while (timeout_us) { - if (tg3_ape_lock(tp, TG3_APE_LOCK_MEM)) - return -EBUSY; - - apedata = tg3_ape_read32(tp, TG3_APE_EVENT_STATUS); - if (!(apedata & APE_EVENT_STATUS_EVENT_PENDING)) - break; - - tg3_ape_unlock(tp, TG3_APE_LOCK_MEM); - - udelay(10); - timeout_us -= (timeout_us > 10) ? 10 : timeout_us; - } - - return timeout_us ? 0 : -EBUSY; -} - -#ifdef CONFIG_TIGON3_HWMON -static int tg3_ape_wait_for_event(struct tg3 *tp, u32 timeout_us) -{ - u32 i, apedata; - - for (i = 0; i < timeout_us / 10; i++) { - apedata = tg3_ape_read32(tp, TG3_APE_EVENT_STATUS); - - if (!(apedata & APE_EVENT_STATUS_EVENT_PENDING)) - break; - - udelay(10); - } - - return i == timeout_us / 10; -} - -static int tg3_ape_scratchpad_read(struct tg3 *tp, u32 *data, u32 base_off, - u32 len) -{ - int err; - u32 i, bufoff, msgoff, maxlen, apedata; - - if (!tg3_flag(tp, APE_HAS_NCSI)) - return 0; - - apedata = tg3_ape_read32(tp, TG3_APE_SEG_SIG); - if (apedata != APE_SEG_SIG_MAGIC) - return -ENODEV; - - apedata = tg3_ape_read32(tp, TG3_APE_FW_STATUS); - if (!(apedata & APE_FW_STATUS_READY)) - return -EAGAIN; - - bufoff = tg3_ape_read32(tp, TG3_APE_SEG_MSG_BUF_OFF) + - TG3_APE_SHMEM_BASE; - msgoff = bufoff + 2 * sizeof(u32); - maxlen = tg3_ape_read32(tp, TG3_APE_SEG_MSG_BUF_LEN); - - while (len) { - u32 length; - - /* Cap xfer sizes to scratchpad limits. */ - length = (len > maxlen) ? maxlen : len; - len -= length; - - apedata = tg3_ape_read32(tp, TG3_APE_FW_STATUS); - if (!(apedata & APE_FW_STATUS_READY)) - return -EAGAIN; - - /* Wait for up to 1 msec for APE to service previous event. */ - err = tg3_ape_event_lock(tp, 1000); - if (err) - return err; - - apedata = APE_EVENT_STATUS_DRIVER_EVNT | - APE_EVENT_STATUS_SCRTCHPD_READ | - APE_EVENT_STATUS_EVENT_PENDING; - tg3_ape_write32(tp, TG3_APE_EVENT_STATUS, apedata); - - tg3_ape_write32(tp, bufoff, base_off); - tg3_ape_write32(tp, bufoff + sizeof(u32), length); - - tg3_ape_unlock(tp, TG3_APE_LOCK_MEM); - tg3_ape_write32(tp, TG3_APE_EVENT, APE_EVENT_1); - - base_off += length; - - if (tg3_ape_wait_for_event(tp, 30000)) - return -EAGAIN; - - for (i = 0; length; i += 4, length -= 4) { - u32 val = tg3_ape_read32(tp, msgoff + i); - memcpy(data, &val, sizeof(u32)); - data++; - } - } - - return 0; -} -#endif - -static int tg3_ape_send_event(struct tg3 *tp, u32 event) -{ - int err; - u32 apedata; - - apedata = tg3_ape_read32(tp, TG3_APE_SEG_SIG); - if (apedata != APE_SEG_SIG_MAGIC) - return -EAGAIN; - - apedata = tg3_ape_read32(tp, TG3_APE_FW_STATUS); - if (!(apedata & APE_FW_STATUS_READY)) - return -EAGAIN; - - /* Wait for up to 1 millisecond for APE to service previous event. */ - err = tg3_ape_event_lock(tp, 1000); - if (err) - return err; - - tg3_ape_write32(tp, TG3_APE_EVENT_STATUS, - event | APE_EVENT_STATUS_EVENT_PENDING); - - tg3_ape_unlock(tp, TG3_APE_LOCK_MEM); - tg3_ape_write32(tp, TG3_APE_EVENT, APE_EVENT_1); - - return 0; -} - -static void tg3_ape_driver_state_change(struct tg3 *tp, int kind) -{ - u32 event; - u32 apedata; - - if (!tg3_flag(tp, ENABLE_APE)) - return; - - switch (kind) { - case RESET_KIND_INIT: - tg3_ape_write32(tp, TG3_APE_HOST_SEG_SIG, - APE_HOST_SEG_SIG_MAGIC); - tg3_ape_write32(tp, TG3_APE_HOST_SEG_LEN, - APE_HOST_SEG_LEN_MAGIC); - apedata = tg3_ape_read32(tp, TG3_APE_HOST_INIT_COUNT); - tg3_ape_write32(tp, TG3_APE_HOST_INIT_COUNT, ++apedata); - tg3_ape_write32(tp, TG3_APE_HOST_DRIVER_ID, - APE_HOST_DRIVER_ID_MAGIC(TG3_MAJ_NUM, TG3_MIN_NUM)); - tg3_ape_write32(tp, TG3_APE_HOST_BEHAVIOR, - APE_HOST_BEHAV_NO_PHYLOCK); - tg3_ape_write32(tp, TG3_APE_HOST_DRVR_STATE, - TG3_APE_HOST_DRVR_STATE_START); - - event = APE_EVENT_STATUS_STATE_START; - break; - case RESET_KIND_SHUTDOWN: - /* With the interface we are currently using, - * APE does not track driver state. Wiping - * out the HOST SEGMENT SIGNATURE forces - * the APE to assume OS absent status. - */ - tg3_ape_write32(tp, TG3_APE_HOST_SEG_SIG, 0x0); - - if (device_may_wakeup(&tp->pdev->dev) && - tg3_flag(tp, WOL_ENABLE)) { - tg3_ape_write32(tp, TG3_APE_HOST_WOL_SPEED, - TG3_APE_HOST_WOL_SPEED_AUTO); - apedata = TG3_APE_HOST_DRVR_STATE_WOL; - } else - apedata = TG3_APE_HOST_DRVR_STATE_UNLOAD; - - tg3_ape_write32(tp, TG3_APE_HOST_DRVR_STATE, apedata); - - event = APE_EVENT_STATUS_STATE_UNLOAD; - break; - default: - return; - } - - event |= APE_EVENT_STATUS_DRIVER_EVNT | APE_EVENT_STATUS_STATE_CHNGE; - - tg3_ape_send_event(tp, event); -} - -static void tg3_disable_ints(struct tg3 *tp) -{ - int i; - - tw32(TG3PCI_MISC_HOST_CTRL, - (tp->misc_host_ctrl | MISC_HOST_CTRL_MASK_PCI_INT)); - for (i = 0; i < tp->irq_max; i++) - tw32_mailbox_f(tp->napi[i].int_mbox, 0x00000001); -} - -static void tg3_enable_ints(struct tg3 *tp) -{ - int i; - - tp->irq_sync = 0; - wmb(); - - tw32(TG3PCI_MISC_HOST_CTRL, - (tp->misc_host_ctrl & ~MISC_HOST_CTRL_MASK_PCI_INT)); - - tp->coal_now = tp->coalesce_mode | HOSTCC_MODE_ENABLE; - for (i = 0; i < tp->irq_cnt; i++) { - struct tg3_napi *tnapi = &tp->napi[i]; - - tw32_mailbox_f(tnapi->int_mbox, tnapi->last_tag << 24); - if (tg3_flag(tp, 1SHOT_MSI)) - tw32_mailbox_f(tnapi->int_mbox, tnapi->last_tag << 24); - - tp->coal_now |= tnapi->coal_now; - } - - /* Force an initial interrupt */ - if (!tg3_flag(tp, TAGGED_STATUS) && - (tp->napi[0].hw_status->status & SD_STATUS_UPDATED)) - tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | GRC_LCLCTRL_SETINT); - else - tw32(HOSTCC_MODE, tp->coal_now); - - tp->coal_now &= ~(tp->napi[0].coal_now | tp->napi[1].coal_now); -} - -static inline unsigned int tg3_has_work(struct tg3_napi *tnapi) -{ - struct tg3 *tp = tnapi->tp; - struct tg3_hw_status *sblk = tnapi->hw_status; - unsigned int work_exists = 0; - - /* check for phy events */ - if (!(tg3_flag(tp, USE_LINKCHG_REG) || tg3_flag(tp, POLL_SERDES))) { - if (sblk->status & SD_STATUS_LINK_CHG) - work_exists = 1; - } - - /* check for TX work to do */ - if (sblk->idx[0].tx_consumer != tnapi->tx_cons) - work_exists = 1; - - /* check for RX work to do */ - if (tnapi->rx_rcb_prod_idx && - *(tnapi->rx_rcb_prod_idx) != tnapi->rx_rcb_ptr) - work_exists = 1; - - return work_exists; -} - -/* tg3_int_reenable - * similar to tg3_enable_ints, but it accurately determines whether there - * is new work pending and can return without flushing the PIO write - * which reenables interrupts - */ -static void tg3_int_reenable(struct tg3_napi *tnapi) -{ - struct tg3 *tp = tnapi->tp; - - tw32_mailbox(tnapi->int_mbox, tnapi->last_tag << 24); - mmiowb(); - - /* When doing tagged status, this work check is unnecessary. - * The last_tag we write above tells the chip which piece of - * work we've completed. - */ - if (!tg3_flag(tp, TAGGED_STATUS) && tg3_has_work(tnapi)) - tw32(HOSTCC_MODE, tp->coalesce_mode | - HOSTCC_MODE_ENABLE | tnapi->coal_now); -} - -static void tg3_switch_clocks(struct tg3 *tp) -{ - u32 clock_ctrl; - u32 orig_clock_ctrl; - - if (tg3_flag(tp, CPMU_PRESENT) || tg3_flag(tp, 5780_CLASS)) - return; - - clock_ctrl = tr32(TG3PCI_CLOCK_CTRL); - - orig_clock_ctrl = clock_ctrl; - clock_ctrl &= (CLOCK_CTRL_FORCE_CLKRUN | - CLOCK_CTRL_CLKRUN_OENABLE | - 0x1f); - tp->pci_clock_ctrl = clock_ctrl; - - if (tg3_flag(tp, 5705_PLUS)) { - if (orig_clock_ctrl & CLOCK_CTRL_625_CORE) { - tw32_wait_f(TG3PCI_CLOCK_CTRL, - clock_ctrl | CLOCK_CTRL_625_CORE, 40); - } - } else if ((orig_clock_ctrl & CLOCK_CTRL_44MHZ_CORE) != 0) { - tw32_wait_f(TG3PCI_CLOCK_CTRL, - clock_ctrl | - (CLOCK_CTRL_44MHZ_CORE | CLOCK_CTRL_ALTCLK), - 40); - tw32_wait_f(TG3PCI_CLOCK_CTRL, - clock_ctrl | (CLOCK_CTRL_ALTCLK), - 40); - } - tw32_wait_f(TG3PCI_CLOCK_CTRL, clock_ctrl, 40); -} - -#define PHY_BUSY_LOOPS 5000 - -static int __tg3_readphy(struct tg3 *tp, unsigned int phy_addr, int reg, - u32 *val) -{ - u32 frame_val; - unsigned int loops; - int ret; - - if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) { - tw32_f(MAC_MI_MODE, - (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL)); - udelay(80); - } - - tg3_ape_lock(tp, tp->phy_ape_lock); - - *val = 0x0; - - frame_val = ((phy_addr << MI_COM_PHY_ADDR_SHIFT) & - MI_COM_PHY_ADDR_MASK); - frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) & - MI_COM_REG_ADDR_MASK); - frame_val |= (MI_COM_CMD_READ | MI_COM_START); - - tw32_f(MAC_MI_COM, frame_val); - - loops = PHY_BUSY_LOOPS; - while (loops != 0) { - udelay(10); - frame_val = tr32(MAC_MI_COM); - - if ((frame_val & MI_COM_BUSY) == 0) { - udelay(5); - frame_val = tr32(MAC_MI_COM); - break; - } - loops -= 1; - } - - ret = -EBUSY; - if (loops != 0) { - *val = frame_val & MI_COM_DATA_MASK; - ret = 0; - } - - if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) { - tw32_f(MAC_MI_MODE, tp->mi_mode); - udelay(80); - } - - tg3_ape_unlock(tp, tp->phy_ape_lock); - - return ret; -} - -static int tg3_readphy(struct tg3 *tp, int reg, u32 *val) -{ - return __tg3_readphy(tp, tp->phy_addr, reg, val); -} - -static int __tg3_writephy(struct tg3 *tp, unsigned int phy_addr, int reg, - u32 val) -{ - u32 frame_val; - unsigned int loops; - int ret; - - if ((tp->phy_flags & TG3_PHYFLG_IS_FET) && - (reg == MII_CTRL1000 || reg == MII_TG3_AUX_CTRL)) - return 0; - - if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) { - tw32_f(MAC_MI_MODE, - (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL)); - udelay(80); - } - - tg3_ape_lock(tp, tp->phy_ape_lock); - - frame_val = ((phy_addr << MI_COM_PHY_ADDR_SHIFT) & - MI_COM_PHY_ADDR_MASK); - frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) & - MI_COM_REG_ADDR_MASK); - frame_val |= (val & MI_COM_DATA_MASK); - frame_val |= (MI_COM_CMD_WRITE | MI_COM_START); - - tw32_f(MAC_MI_COM, frame_val); - - loops = PHY_BUSY_LOOPS; - while (loops != 0) { - udelay(10); - frame_val = tr32(MAC_MI_COM); - if ((frame_val & MI_COM_BUSY) == 0) { - udelay(5); - frame_val = tr32(MAC_MI_COM); - break; - } - loops -= 1; - } - - ret = -EBUSY; - if (loops != 0) - ret = 0; - - if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) { - tw32_f(MAC_MI_MODE, tp->mi_mode); - udelay(80); - } - - tg3_ape_unlock(tp, tp->phy_ape_lock); - - return ret; -} - -static int tg3_writephy(struct tg3 *tp, int reg, u32 val) -{ - return __tg3_writephy(tp, tp->phy_addr, reg, val); -} - -static int tg3_phy_cl45_write(struct tg3 *tp, u32 devad, u32 addr, u32 val) -{ - int err; - - err = tg3_writephy(tp, MII_TG3_MMD_CTRL, devad); - if (err) - goto done; - - err = tg3_writephy(tp, MII_TG3_MMD_ADDRESS, addr); - if (err) - goto done; - - err = tg3_writephy(tp, MII_TG3_MMD_CTRL, - MII_TG3_MMD_CTRL_DATA_NOINC | devad); - if (err) - goto done; - - err = tg3_writephy(tp, MII_TG3_MMD_ADDRESS, val); - -done: - return err; -} - -static int tg3_phy_cl45_read(struct tg3 *tp, u32 devad, u32 addr, u32 *val) -{ - int err; - - err = tg3_writephy(tp, MII_TG3_MMD_CTRL, devad); - if (err) - goto done; - - err = tg3_writephy(tp, MII_TG3_MMD_ADDRESS, addr); - if (err) - goto done; - - err = tg3_writephy(tp, MII_TG3_MMD_CTRL, - MII_TG3_MMD_CTRL_DATA_NOINC | devad); - if (err) - goto done; - - err = tg3_readphy(tp, MII_TG3_MMD_ADDRESS, val); - -done: - return err; -} - -static int tg3_phydsp_read(struct tg3 *tp, u32 reg, u32 *val) -{ - int err; - - err = tg3_writephy(tp, MII_TG3_DSP_ADDRESS, reg); - if (!err) - err = tg3_readphy(tp, MII_TG3_DSP_RW_PORT, val); - - return err; -} - -static int tg3_phydsp_write(struct tg3 *tp, u32 reg, u32 val) -{ - int err; - - err = tg3_writephy(tp, MII_TG3_DSP_ADDRESS, reg); - if (!err) - err = tg3_writephy(tp, MII_TG3_DSP_RW_PORT, val); - - return err; -} - -static int tg3_phy_auxctl_read(struct tg3 *tp, int reg, u32 *val) -{ - int err; - - err = tg3_writephy(tp, MII_TG3_AUX_CTRL, - (reg << MII_TG3_AUXCTL_MISC_RDSEL_SHIFT) | - MII_TG3_AUXCTL_SHDWSEL_MISC); - if (!err) - err = tg3_readphy(tp, MII_TG3_AUX_CTRL, val); - - return err; -} - -static int tg3_phy_auxctl_write(struct tg3 *tp, int reg, u32 set) -{ - if (reg == MII_TG3_AUXCTL_SHDWSEL_MISC) - set |= MII_TG3_AUXCTL_MISC_WREN; - - return tg3_writephy(tp, MII_TG3_AUX_CTRL, set | reg); -} - -static int tg3_phy_toggle_auxctl_smdsp(struct tg3 *tp, bool enable) -{ - u32 val; - int err; - - err = tg3_phy_auxctl_read(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, &val); - - if (err) - return err; - - if (enable) - val |= MII_TG3_AUXCTL_ACTL_SMDSP_ENA; - else - val &= ~MII_TG3_AUXCTL_ACTL_SMDSP_ENA; - - err = tg3_phy_auxctl_write((tp), MII_TG3_AUXCTL_SHDWSEL_AUXCTL, - val | MII_TG3_AUXCTL_ACTL_TX_6DB); - - return err; -} - -static int tg3_phy_shdw_write(struct tg3 *tp, int reg, u32 val) -{ - return tg3_writephy(tp, MII_TG3_MISC_SHDW, - reg | val | MII_TG3_MISC_SHDW_WREN); -} - -static int tg3_bmcr_reset(struct tg3 *tp) -{ - u32 phy_control; - int limit, err; - - /* OK, reset it, and poll the BMCR_RESET bit until it - * clears or we time out. - */ - phy_control = BMCR_RESET; - err = tg3_writephy(tp, MII_BMCR, phy_control); - if (err != 0) - return -EBUSY; - - limit = 5000; - while (limit--) { - err = tg3_readphy(tp, MII_BMCR, &phy_control); - if (err != 0) - return -EBUSY; - - if ((phy_control & BMCR_RESET) == 0) { - udelay(40); - break; - } - udelay(10); - } - if (limit < 0) - return -EBUSY; - - return 0; -} - -static int tg3_mdio_read(struct mii_bus *bp, int mii_id, int reg) -{ - struct tg3 *tp = bp->priv; - u32 val; - - spin_lock_bh(&tp->lock); - - if (__tg3_readphy(tp, mii_id, reg, &val)) - val = -EIO; - - spin_unlock_bh(&tp->lock); - - return val; -} - -static int tg3_mdio_write(struct mii_bus *bp, int mii_id, int reg, u16 val) -{ - struct tg3 *tp = bp->priv; - u32 ret = 0; - - spin_lock_bh(&tp->lock); - - if (__tg3_writephy(tp, mii_id, reg, val)) - ret = -EIO; - - spin_unlock_bh(&tp->lock); - - return ret; -} - -static void tg3_mdio_config_5785(struct tg3 *tp) -{ - u32 val; - struct phy_device *phydev; - - phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); - switch (phydev->drv->phy_id & phydev->drv->phy_id_mask) { - case PHY_ID_BCM50610: - case PHY_ID_BCM50610M: - val = MAC_PHYCFG2_50610_LED_MODES; - break; - case PHY_ID_BCMAC131: - val = MAC_PHYCFG2_AC131_LED_MODES; - break; - case PHY_ID_RTL8211C: - val = MAC_PHYCFG2_RTL8211C_LED_MODES; - break; - case PHY_ID_RTL8201E: - val = MAC_PHYCFG2_RTL8201E_LED_MODES; - break; - default: - return; - } - - if (phydev->interface != PHY_INTERFACE_MODE_RGMII) { - tw32(MAC_PHYCFG2, val); - - val = tr32(MAC_PHYCFG1); - val &= ~(MAC_PHYCFG1_RGMII_INT | - MAC_PHYCFG1_RXCLK_TO_MASK | MAC_PHYCFG1_TXCLK_TO_MASK); - val |= MAC_PHYCFG1_RXCLK_TIMEOUT | MAC_PHYCFG1_TXCLK_TIMEOUT; - tw32(MAC_PHYCFG1, val); - - return; - } - - if (!tg3_flag(tp, RGMII_INBAND_DISABLE)) - val |= MAC_PHYCFG2_EMODE_MASK_MASK | - MAC_PHYCFG2_FMODE_MASK_MASK | - MAC_PHYCFG2_GMODE_MASK_MASK | - MAC_PHYCFG2_ACT_MASK_MASK | - MAC_PHYCFG2_QUAL_MASK_MASK | - MAC_PHYCFG2_INBAND_ENABLE; - - tw32(MAC_PHYCFG2, val); - - val = tr32(MAC_PHYCFG1); - val &= ~(MAC_PHYCFG1_RXCLK_TO_MASK | MAC_PHYCFG1_TXCLK_TO_MASK | - MAC_PHYCFG1_RGMII_EXT_RX_DEC | MAC_PHYCFG1_RGMII_SND_STAT_EN); - if (!tg3_flag(tp, RGMII_INBAND_DISABLE)) { - if (tg3_flag(tp, RGMII_EXT_IBND_RX_EN)) - val |= MAC_PHYCFG1_RGMII_EXT_RX_DEC; - if (tg3_flag(tp, RGMII_EXT_IBND_TX_EN)) - val |= MAC_PHYCFG1_RGMII_SND_STAT_EN; - } - val |= MAC_PHYCFG1_RXCLK_TIMEOUT | MAC_PHYCFG1_TXCLK_TIMEOUT | - MAC_PHYCFG1_RGMII_INT | MAC_PHYCFG1_TXC_DRV; - tw32(MAC_PHYCFG1, val); - - val = tr32(MAC_EXT_RGMII_MODE); - val &= ~(MAC_RGMII_MODE_RX_INT_B | - MAC_RGMII_MODE_RX_QUALITY | - MAC_RGMII_MODE_RX_ACTIVITY | - MAC_RGMII_MODE_RX_ENG_DET | - MAC_RGMII_MODE_TX_ENABLE | - MAC_RGMII_MODE_TX_LOWPWR | - MAC_RGMII_MODE_TX_RESET); - if (!tg3_flag(tp, RGMII_INBAND_DISABLE)) { - if (tg3_flag(tp, RGMII_EXT_IBND_RX_EN)) - val |= MAC_RGMII_MODE_RX_INT_B | - MAC_RGMII_MODE_RX_QUALITY | - MAC_RGMII_MODE_RX_ACTIVITY | - MAC_RGMII_MODE_RX_ENG_DET; - if (tg3_flag(tp, RGMII_EXT_IBND_TX_EN)) - val |= MAC_RGMII_MODE_TX_ENABLE | - MAC_RGMII_MODE_TX_LOWPWR | - MAC_RGMII_MODE_TX_RESET; - } - tw32(MAC_EXT_RGMII_MODE, val); -} - -static void tg3_mdio_start(struct tg3 *tp) -{ - tp->mi_mode &= ~MAC_MI_MODE_AUTO_POLL; - tw32_f(MAC_MI_MODE, tp->mi_mode); - udelay(80); - - if (tg3_flag(tp, MDIOBUS_INITED) && - tg3_asic_rev(tp) == ASIC_REV_5785) - tg3_mdio_config_5785(tp); -} - -static int tg3_mdio_init(struct tg3 *tp) -{ - int i; - u32 reg; - struct phy_device *phydev; - - if (tg3_flag(tp, 5717_PLUS)) { - u32 is_serdes; - - tp->phy_addr = tp->pci_fn + 1; - - if (tg3_chip_rev_id(tp) != CHIPREV_ID_5717_A0) - is_serdes = tr32(SG_DIG_STATUS) & SG_DIG_IS_SERDES; - else - is_serdes = tr32(TG3_CPMU_PHY_STRAP) & - TG3_CPMU_PHY_STRAP_IS_SERDES; - if (is_serdes) - tp->phy_addr += 7; - } else if (tg3_flag(tp, IS_SSB_CORE) && tg3_flag(tp, ROBOSWITCH)) { - int addr; - - addr = ssb_gige_get_phyaddr(tp->pdev); - if (addr < 0) - return addr; - tp->phy_addr = addr; - } else - tp->phy_addr = TG3_PHY_MII_ADDR; - - tg3_mdio_start(tp); - - if (!tg3_flag(tp, USE_PHYLIB) || tg3_flag(tp, MDIOBUS_INITED)) - return 0; - - tp->mdio_bus = mdiobus_alloc(); - if (tp->mdio_bus == NULL) - return -ENOMEM; - - tp->mdio_bus->name = "tg3 mdio bus"; - snprintf(tp->mdio_bus->id, MII_BUS_ID_SIZE, "%x", - (tp->pdev->bus->number << 8) | tp->pdev->devfn); - tp->mdio_bus->priv = tp; - tp->mdio_bus->parent = &tp->pdev->dev; - tp->mdio_bus->read = &tg3_mdio_read; - tp->mdio_bus->write = &tg3_mdio_write; - tp->mdio_bus->phy_mask = ~(1 << tp->phy_addr); - - /* The bus registration will look for all the PHYs on the mdio bus. - * Unfortunately, it does not ensure the PHY is powered up before - * accessing the PHY ID registers. A chip reset is the - * quickest way to bring the device back to an operational state.. - */ - if (tg3_readphy(tp, MII_BMCR, ®) || (reg & BMCR_PDOWN)) - tg3_bmcr_reset(tp); - - i = mdiobus_register(tp->mdio_bus); - if (i) { - dev_warn(&tp->pdev->dev, "mdiobus_reg failed (0x%x)\n", i); - mdiobus_free(tp->mdio_bus); - return i; - } - - phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); - - if (!phydev || !phydev->drv) { - dev_warn(&tp->pdev->dev, "No PHY devices\n"); - mdiobus_unregister(tp->mdio_bus); - mdiobus_free(tp->mdio_bus); - return -ENODEV; - } - - switch (phydev->drv->phy_id & phydev->drv->phy_id_mask) { - case PHY_ID_BCM57780: - phydev->interface = PHY_INTERFACE_MODE_GMII; - phydev->dev_flags |= PHY_BRCM_AUTO_PWRDWN_ENABLE; - break; - case PHY_ID_BCM50610: - case PHY_ID_BCM50610M: - phydev->dev_flags |= PHY_BRCM_CLEAR_RGMII_MODE | - PHY_BRCM_RX_REFCLK_UNUSED | - PHY_BRCM_DIS_TXCRXC_NOENRGY | - PHY_BRCM_AUTO_PWRDWN_ENABLE; - if (tg3_flag(tp, RGMII_INBAND_DISABLE)) - phydev->dev_flags |= PHY_BRCM_STD_IBND_DISABLE; - if (tg3_flag(tp, RGMII_EXT_IBND_RX_EN)) - phydev->dev_flags |= PHY_BRCM_EXT_IBND_RX_ENABLE; - if (tg3_flag(tp, RGMII_EXT_IBND_TX_EN)) - phydev->dev_flags |= PHY_BRCM_EXT_IBND_TX_ENABLE; - /* fallthru */ - case PHY_ID_RTL8211C: - phydev->interface = PHY_INTERFACE_MODE_RGMII; - break; - case PHY_ID_RTL8201E: - case PHY_ID_BCMAC131: - phydev->interface = PHY_INTERFACE_MODE_MII; - phydev->dev_flags |= PHY_BRCM_AUTO_PWRDWN_ENABLE; - tp->phy_flags |= TG3_PHYFLG_IS_FET; - break; - } - - tg3_flag_set(tp, MDIOBUS_INITED); - - if (tg3_asic_rev(tp) == ASIC_REV_5785) - tg3_mdio_config_5785(tp); - - return 0; -} - -static void tg3_mdio_fini(struct tg3 *tp) -{ - if (tg3_flag(tp, MDIOBUS_INITED)) { - tg3_flag_clear(tp, MDIOBUS_INITED); - mdiobus_unregister(tp->mdio_bus); - mdiobus_free(tp->mdio_bus); - } -} - -/* tp->lock is held. */ -static inline void tg3_generate_fw_event(struct tg3 *tp) -{ - u32 val; - - val = tr32(GRC_RX_CPU_EVENT); - val |= GRC_RX_CPU_DRIVER_EVENT; - tw32_f(GRC_RX_CPU_EVENT, val); - - tp->last_event_jiffies = jiffies; -} - -#define TG3_FW_EVENT_TIMEOUT_USEC 2500 - -/* tp->lock is held. */ -static void tg3_wait_for_event_ack(struct tg3 *tp) -{ - int i; - unsigned int delay_cnt; - long time_remain; - - /* If enough time has passed, no wait is necessary. */ - time_remain = (long)(tp->last_event_jiffies + 1 + - usecs_to_jiffies(TG3_FW_EVENT_TIMEOUT_USEC)) - - (long)jiffies; - if (time_remain < 0) - return; - - /* Check if we can shorten the wait time. */ - delay_cnt = jiffies_to_usecs(time_remain); - if (delay_cnt > TG3_FW_EVENT_TIMEOUT_USEC) - delay_cnt = TG3_FW_EVENT_TIMEOUT_USEC; - delay_cnt = (delay_cnt >> 3) + 1; - - for (i = 0; i < delay_cnt; i++) { - if (!(tr32(GRC_RX_CPU_EVENT) & GRC_RX_CPU_DRIVER_EVENT)) - break; - if (pci_channel_offline(tp->pdev)) - break; - - udelay(8); - } -} - -/* tp->lock is held. */ -static void tg3_phy_gather_ump_data(struct tg3 *tp, u32 *data) -{ - u32 reg, val; - - val = 0; - if (!tg3_readphy(tp, MII_BMCR, ®)) - val = reg << 16; - if (!tg3_readphy(tp, MII_BMSR, ®)) - val |= (reg & 0xffff); - *data++ = val; - - val = 0; - if (!tg3_readphy(tp, MII_ADVERTISE, ®)) - val = reg << 16; - if (!tg3_readphy(tp, MII_LPA, ®)) - val |= (reg & 0xffff); - *data++ = val; - - val = 0; - if (!(tp->phy_flags & TG3_PHYFLG_MII_SERDES)) { - if (!tg3_readphy(tp, MII_CTRL1000, ®)) - val = reg << 16; - if (!tg3_readphy(tp, MII_STAT1000, ®)) - val |= (reg & 0xffff); - } - *data++ = val; - - if (!tg3_readphy(tp, MII_PHYADDR, ®)) - val = reg << 16; - else - val = 0; - *data++ = val; -} - -/* tp->lock is held. */ -static void tg3_ump_link_report(struct tg3 *tp) -{ - u32 data[4]; - - if (!tg3_flag(tp, 5780_CLASS) || !tg3_flag(tp, ENABLE_ASF)) - return; - - tg3_phy_gather_ump_data(tp, data); - - tg3_wait_for_event_ack(tp); - - tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_LINK_UPDATE); - tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 14); - tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 0x0, data[0]); - tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 0x4, data[1]); - tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 0x8, data[2]); - tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 0xc, data[3]); - - tg3_generate_fw_event(tp); -} - -/* tp->lock is held. */ -static void tg3_stop_fw(struct tg3 *tp) -{ - if (tg3_flag(tp, ENABLE_ASF) && !tg3_flag(tp, ENABLE_APE)) { - /* Wait for RX cpu to ACK the previous event. */ - tg3_wait_for_event_ack(tp); - - tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_PAUSE_FW); - - tg3_generate_fw_event(tp); - - /* Wait for RX cpu to ACK this event. */ - tg3_wait_for_event_ack(tp); - } -} - -/* tp->lock is held. */ -static void tg3_write_sig_pre_reset(struct tg3 *tp, int kind) -{ - tg3_write_mem(tp, NIC_SRAM_FIRMWARE_MBOX, - NIC_SRAM_FIRMWARE_MBOX_MAGIC1); - - if (tg3_flag(tp, ASF_NEW_HANDSHAKE)) { - switch (kind) { - case RESET_KIND_INIT: - tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX, - DRV_STATE_START); - break; - - case RESET_KIND_SHUTDOWN: - tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX, - DRV_STATE_UNLOAD); - break; - - case RESET_KIND_SUSPEND: - tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX, - DRV_STATE_SUSPEND); - break; - - default: - break; - } - } -} - -/* tp->lock is held. */ -static void tg3_write_sig_post_reset(struct tg3 *tp, int kind) -{ - if (tg3_flag(tp, ASF_NEW_HANDSHAKE)) { - switch (kind) { - case RESET_KIND_INIT: - tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX, - DRV_STATE_START_DONE); - break; - - case RESET_KIND_SHUTDOWN: - tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX, - DRV_STATE_UNLOAD_DONE); - break; - - default: - break; - } - } -} - -/* tp->lock is held. */ -static void tg3_write_sig_legacy(struct tg3 *tp, int kind) -{ - if (tg3_flag(tp, ENABLE_ASF)) { - switch (kind) { - case RESET_KIND_INIT: - tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX, - DRV_STATE_START); - break; - - case RESET_KIND_SHUTDOWN: - tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX, - DRV_STATE_UNLOAD); - break; - - case RESET_KIND_SUSPEND: - tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX, - DRV_STATE_SUSPEND); - break; - - default: - break; - } - } -} - -static int tg3_poll_fw(struct tg3 *tp) -{ - int i; - u32 val; - - if (tg3_flag(tp, NO_FWARE_REPORTED)) - return 0; - - if (tg3_flag(tp, IS_SSB_CORE)) { - /* We don't use firmware. */ - return 0; - } - - if (tg3_asic_rev(tp) == ASIC_REV_5906) { - /* Wait up to 20ms for init done. */ - for (i = 0; i < 200; i++) { - if (tr32(VCPU_STATUS) & VCPU_STATUS_INIT_DONE) - return 0; - if (pci_channel_offline(tp->pdev)) - return -ENODEV; - - udelay(100); - } - return -ENODEV; - } - - /* Wait for firmware initialization to complete. */ - for (i = 0; i < 100000; i++) { - tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val); - if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1) - break; - if (pci_channel_offline(tp->pdev)) { - if (!tg3_flag(tp, NO_FWARE_REPORTED)) { - tg3_flag_set(tp, NO_FWARE_REPORTED); - netdev_info(tp->dev, "No firmware running\n"); - } - - break; - } - - udelay(10); - } - - /* Chip might not be fitted with firmware. Some Sun onboard - * parts are configured like that. So don't signal the timeout - * of the above loop as an error, but do report the lack of - * running firmware once. - */ - if (i >= 100000 && !tg3_flag(tp, NO_FWARE_REPORTED)) { - tg3_flag_set(tp, NO_FWARE_REPORTED); - - netdev_info(tp->dev, "No firmware running\n"); - } - - if (tg3_chip_rev_id(tp) == CHIPREV_ID_57765_A0) { - /* The 57765 A0 needs a little more - * time to do some important work. - */ - mdelay(10); - } - - return 0; -} - -static void tg3_link_report(struct tg3 *tp) -{ - if (!netif_carrier_ok(tp->dev)) { - netif_info(tp, link, tp->dev, "Link is down\n"); - tg3_ump_link_report(tp); - } else if (netif_msg_link(tp)) { - netdev_info(tp->dev, "Link is up at %d Mbps, %s duplex\n", - (tp->link_config.active_speed == SPEED_1000 ? - 1000 : - (tp->link_config.active_speed == SPEED_100 ? - 100 : 10)), - (tp->link_config.active_duplex == DUPLEX_FULL ? - "full" : "half")); - - netdev_info(tp->dev, "Flow control is %s for TX and %s for RX\n", - (tp->link_config.active_flowctrl & FLOW_CTRL_TX) ? - "on" : "off", - (tp->link_config.active_flowctrl & FLOW_CTRL_RX) ? - "on" : "off"); - - if (tp->phy_flags & TG3_PHYFLG_EEE_CAP) - netdev_info(tp->dev, "EEE is %s\n", - tp->setlpicnt ? "enabled" : "disabled"); - - tg3_ump_link_report(tp); - } - - tp->link_up = netif_carrier_ok(tp->dev); -} - -static u32 tg3_decode_flowctrl_1000T(u32 adv) -{ - u32 flowctrl = 0; - - if (adv & ADVERTISE_PAUSE_CAP) { - flowctrl |= FLOW_CTRL_RX; - if (!(adv & ADVERTISE_PAUSE_ASYM)) - flowctrl |= FLOW_CTRL_TX; - } else if (adv & ADVERTISE_PAUSE_ASYM) - flowctrl |= FLOW_CTRL_TX; - - return flowctrl; -} - -static u16 tg3_advert_flowctrl_1000X(u8 flow_ctrl) -{ - u16 miireg; - - if ((flow_ctrl & FLOW_CTRL_TX) && (flow_ctrl & FLOW_CTRL_RX)) - miireg = ADVERTISE_1000XPAUSE; - else if (flow_ctrl & FLOW_CTRL_TX) - miireg = ADVERTISE_1000XPSE_ASYM; - else if (flow_ctrl & FLOW_CTRL_RX) - miireg = ADVERTISE_1000XPAUSE | ADVERTISE_1000XPSE_ASYM; - else - miireg = 0; - - return miireg; -} - -static u32 tg3_decode_flowctrl_1000X(u32 adv) -{ - u32 flowctrl = 0; - - if (adv & ADVERTISE_1000XPAUSE) { - flowctrl |= FLOW_CTRL_RX; - if (!(adv & ADVERTISE_1000XPSE_ASYM)) - flowctrl |= FLOW_CTRL_TX; - } else if (adv & ADVERTISE_1000XPSE_ASYM) - flowctrl |= FLOW_CTRL_TX; - - return flowctrl; -} - -static u8 tg3_resolve_flowctrl_1000X(u16 lcladv, u16 rmtadv) -{ - u8 cap = 0; - - if (lcladv & rmtadv & ADVERTISE_1000XPAUSE) { - cap = FLOW_CTRL_TX | FLOW_CTRL_RX; - } else if (lcladv & rmtadv & ADVERTISE_1000XPSE_ASYM) { - if (lcladv & ADVERTISE_1000XPAUSE) - cap = FLOW_CTRL_RX; - if (rmtadv & ADVERTISE_1000XPAUSE) - cap = FLOW_CTRL_TX; - } - - return cap; -} - -static void tg3_setup_flow_control(struct tg3 *tp, u32 lcladv, u32 rmtadv) -{ - u8 autoneg; - u8 flowctrl = 0; - u32 old_rx_mode = tp->rx_mode; - u32 old_tx_mode = tp->tx_mode; - - if (tg3_flag(tp, USE_PHYLIB)) - autoneg = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr)->autoneg; - else - autoneg = tp->link_config.autoneg; - - if (autoneg == AUTONEG_ENABLE && tg3_flag(tp, PAUSE_AUTONEG)) { - if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES) - flowctrl = tg3_resolve_flowctrl_1000X(lcladv, rmtadv); - else - flowctrl = mii_resolve_flowctrl_fdx(lcladv, rmtadv); - } else - flowctrl = tp->link_config.flowctrl; - - tp->link_config.active_flowctrl = flowctrl; - - if (flowctrl & FLOW_CTRL_RX) - tp->rx_mode |= RX_MODE_FLOW_CTRL_ENABLE; - else - tp->rx_mode &= ~RX_MODE_FLOW_CTRL_ENABLE; - - if (old_rx_mode != tp->rx_mode) - tw32_f(MAC_RX_MODE, tp->rx_mode); - - if (flowctrl & FLOW_CTRL_TX) - tp->tx_mode |= TX_MODE_FLOW_CTRL_ENABLE; - else - tp->tx_mode &= ~TX_MODE_FLOW_CTRL_ENABLE; - - if (old_tx_mode != tp->tx_mode) - tw32_f(MAC_TX_MODE, tp->tx_mode); -} - -static void tg3_adjust_link(struct net_device *dev) -{ - u8 oldflowctrl, linkmesg = 0; - u32 mac_mode, lcl_adv, rmt_adv; - struct tg3 *tp = netdev_priv(dev); - struct phy_device *phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); - - spin_lock_bh(&tp->lock); - - mac_mode = tp->mac_mode & ~(MAC_MODE_PORT_MODE_MASK | - MAC_MODE_HALF_DUPLEX); - - oldflowctrl = tp->link_config.active_flowctrl; - - if (phydev->link) { - lcl_adv = 0; - rmt_adv = 0; - - if (phydev->speed == SPEED_100 || phydev->speed == SPEED_10) - mac_mode |= MAC_MODE_PORT_MODE_MII; - else if (phydev->speed == SPEED_1000 || - tg3_asic_rev(tp) != ASIC_REV_5785) - mac_mode |= MAC_MODE_PORT_MODE_GMII; - else - mac_mode |= MAC_MODE_PORT_MODE_MII; - - if (phydev->duplex == DUPLEX_HALF) - mac_mode |= MAC_MODE_HALF_DUPLEX; - else { - lcl_adv = mii_advertise_flowctrl( - tp->link_config.flowctrl); - - if (phydev->pause) - rmt_adv = LPA_PAUSE_CAP; - if (phydev->asym_pause) - rmt_adv |= LPA_PAUSE_ASYM; - } - - tg3_setup_flow_control(tp, lcl_adv, rmt_adv); - } else - mac_mode |= MAC_MODE_PORT_MODE_GMII; - - if (mac_mode != tp->mac_mode) { - tp->mac_mode = mac_mode; - tw32_f(MAC_MODE, tp->mac_mode); - udelay(40); - } - - if (tg3_asic_rev(tp) == ASIC_REV_5785) { - if (phydev->speed == SPEED_10) - tw32(MAC_MI_STAT, - MAC_MI_STAT_10MBPS_MODE | - MAC_MI_STAT_LNKSTAT_ATTN_ENAB); - else - tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB); - } - - if (phydev->speed == SPEED_1000 && phydev->duplex == DUPLEX_HALF) - tw32(MAC_TX_LENGTHS, - ((2 << TX_LENGTHS_IPG_CRS_SHIFT) | - (6 << TX_LENGTHS_IPG_SHIFT) | - (0xff << TX_LENGTHS_SLOT_TIME_SHIFT))); - else - tw32(MAC_TX_LENGTHS, - ((2 << TX_LENGTHS_IPG_CRS_SHIFT) | - (6 << TX_LENGTHS_IPG_SHIFT) | - (32 << TX_LENGTHS_SLOT_TIME_SHIFT))); - - if (phydev->link != tp->old_link || - phydev->speed != tp->link_config.active_speed || - phydev->duplex != tp->link_config.active_duplex || - oldflowctrl != tp->link_config.active_flowctrl) - linkmesg = 1; - - tp->old_link = phydev->link; - tp->link_config.active_speed = phydev->speed; - tp->link_config.active_duplex = phydev->duplex; - - spin_unlock_bh(&tp->lock); - - if (linkmesg) - tg3_link_report(tp); -} - -static int tg3_phy_init(struct tg3 *tp) -{ - struct phy_device *phydev; - - if (tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) - return 0; - - /* Bring the PHY back to a known state. */ - tg3_bmcr_reset(tp); - - phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); - - /* Attach the MAC to the PHY. */ - phydev = phy_connect(tp->dev, phydev_name(phydev), - tg3_adjust_link, phydev->interface); - if (IS_ERR(phydev)) { - dev_err(&tp->pdev->dev, "Could not attach to PHY\n"); - return PTR_ERR(phydev); - } - - /* Mask with MAC supported features. */ - switch (phydev->interface) { - case PHY_INTERFACE_MODE_GMII: - case PHY_INTERFACE_MODE_RGMII: - if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) { - phydev->supported &= (PHY_GBIT_FEATURES | - SUPPORTED_Pause | - SUPPORTED_Asym_Pause); - break; - } - /* fallthru */ - case PHY_INTERFACE_MODE_MII: - phydev->supported &= (PHY_BASIC_FEATURES | - SUPPORTED_Pause | - SUPPORTED_Asym_Pause); - break; - default: - phy_disconnect(mdiobus_get_phy(tp->mdio_bus, tp->phy_addr)); - return -EINVAL; - } - - tp->phy_flags |= TG3_PHYFLG_IS_CONNECTED; - - phydev->advertising = phydev->supported; - - phy_attached_info(phydev); - - return 0; -} - -static void tg3_phy_start(struct tg3 *tp) -{ - struct phy_device *phydev; - - if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED)) - return; - - phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); - - if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) { - tp->phy_flags &= ~TG3_PHYFLG_IS_LOW_POWER; - phydev->speed = tp->link_config.speed; - phydev->duplex = tp->link_config.duplex; - phydev->autoneg = tp->link_config.autoneg; - phydev->advertising = tp->link_config.advertising; - } - - phy_start(phydev); - - phy_start_aneg(phydev); -} - -static void tg3_phy_stop(struct tg3 *tp) -{ - if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED)) - return; - - phy_stop(mdiobus_get_phy(tp->mdio_bus, tp->phy_addr)); -} - -static void tg3_phy_fini(struct tg3 *tp) -{ - if (tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) { - phy_disconnect(mdiobus_get_phy(tp->mdio_bus, tp->phy_addr)); - tp->phy_flags &= ~TG3_PHYFLG_IS_CONNECTED; - } -} - -static int tg3_phy_set_extloopbk(struct tg3 *tp) -{ - int err; - u32 val; - - if (tp->phy_flags & TG3_PHYFLG_IS_FET) - return 0; - - if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) { - /* Cannot do read-modify-write on 5401 */ - err = tg3_phy_auxctl_write(tp, - MII_TG3_AUXCTL_SHDWSEL_AUXCTL, - MII_TG3_AUXCTL_ACTL_EXTLOOPBK | - 0x4c20); - goto done; - } - - err = tg3_phy_auxctl_read(tp, - MII_TG3_AUXCTL_SHDWSEL_AUXCTL, &val); - if (err) - return err; - - val |= MII_TG3_AUXCTL_ACTL_EXTLOOPBK; - err = tg3_phy_auxctl_write(tp, - MII_TG3_AUXCTL_SHDWSEL_AUXCTL, val); - -done: - return err; -} - -static void tg3_phy_fet_toggle_apd(struct tg3 *tp, bool enable) -{ - u32 phytest; - - if (!tg3_readphy(tp, MII_TG3_FET_TEST, &phytest)) { - u32 phy; - - tg3_writephy(tp, MII_TG3_FET_TEST, - phytest | MII_TG3_FET_SHADOW_EN); - if (!tg3_readphy(tp, MII_TG3_FET_SHDW_AUXSTAT2, &phy)) { - if (enable) - phy |= MII_TG3_FET_SHDW_AUXSTAT2_APD; - else - phy &= ~MII_TG3_FET_SHDW_AUXSTAT2_APD; - tg3_writephy(tp, MII_TG3_FET_SHDW_AUXSTAT2, phy); - } - tg3_writephy(tp, MII_TG3_FET_TEST, phytest); - } -} - -static void tg3_phy_toggle_apd(struct tg3 *tp, bool enable) -{ - u32 reg; - - if (!tg3_flag(tp, 5705_PLUS) || - (tg3_flag(tp, 5717_PLUS) && - (tp->phy_flags & TG3_PHYFLG_MII_SERDES))) - return; - - if (tp->phy_flags & TG3_PHYFLG_IS_FET) { - tg3_phy_fet_toggle_apd(tp, enable); - return; - } - - reg = MII_TG3_MISC_SHDW_SCR5_LPED | - MII_TG3_MISC_SHDW_SCR5_DLPTLM | - MII_TG3_MISC_SHDW_SCR5_SDTL | - MII_TG3_MISC_SHDW_SCR5_C125OE; - if (tg3_asic_rev(tp) != ASIC_REV_5784 || !enable) - reg |= MII_TG3_MISC_SHDW_SCR5_DLLAPD; - - tg3_phy_shdw_write(tp, MII_TG3_MISC_SHDW_SCR5_SEL, reg); - - - reg = MII_TG3_MISC_SHDW_APD_WKTM_84MS; - if (enable) - reg |= MII_TG3_MISC_SHDW_APD_ENABLE; - - tg3_phy_shdw_write(tp, MII_TG3_MISC_SHDW_APD_SEL, reg); -} - -static void tg3_phy_toggle_automdix(struct tg3 *tp, bool enable) -{ - u32 phy; - - if (!tg3_flag(tp, 5705_PLUS) || - (tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) - return; - - if (tp->phy_flags & TG3_PHYFLG_IS_FET) { - u32 ephy; - - if (!tg3_readphy(tp, MII_TG3_FET_TEST, &ephy)) { - u32 reg = MII_TG3_FET_SHDW_MISCCTRL; - - tg3_writephy(tp, MII_TG3_FET_TEST, - ephy | MII_TG3_FET_SHADOW_EN); - if (!tg3_readphy(tp, reg, &phy)) { - if (enable) - phy |= MII_TG3_FET_SHDW_MISCCTRL_MDIX; - else - phy &= ~MII_TG3_FET_SHDW_MISCCTRL_MDIX; - tg3_writephy(tp, reg, phy); - } - tg3_writephy(tp, MII_TG3_FET_TEST, ephy); - } - } else { - int ret; - - ret = tg3_phy_auxctl_read(tp, - MII_TG3_AUXCTL_SHDWSEL_MISC, &phy); - if (!ret) { - if (enable) - phy |= MII_TG3_AUXCTL_MISC_FORCE_AMDIX; - else - phy &= ~MII_TG3_AUXCTL_MISC_FORCE_AMDIX; - tg3_phy_auxctl_write(tp, - MII_TG3_AUXCTL_SHDWSEL_MISC, phy); - } - } -} - -static void tg3_phy_set_wirespeed(struct tg3 *tp) -{ - int ret; - u32 val; - - if (tp->phy_flags & TG3_PHYFLG_NO_ETH_WIRE_SPEED) - return; - - ret = tg3_phy_auxctl_read(tp, MII_TG3_AUXCTL_SHDWSEL_MISC, &val); - if (!ret) - tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_MISC, - val | MII_TG3_AUXCTL_MISC_WIRESPD_EN); -} - -static void tg3_phy_apply_otp(struct tg3 *tp) -{ - u32 otp, phy; - - if (!tp->phy_otp) - return; - - otp = tp->phy_otp; - - if (tg3_phy_toggle_auxctl_smdsp(tp, true)) - return; - - phy = ((otp & TG3_OTP_AGCTGT_MASK) >> TG3_OTP_AGCTGT_SHIFT); - phy |= MII_TG3_DSP_TAP1_AGCTGT_DFLT; - tg3_phydsp_write(tp, MII_TG3_DSP_TAP1, phy); - - phy = ((otp & TG3_OTP_HPFFLTR_MASK) >> TG3_OTP_HPFFLTR_SHIFT) | - ((otp & TG3_OTP_HPFOVER_MASK) >> TG3_OTP_HPFOVER_SHIFT); - tg3_phydsp_write(tp, MII_TG3_DSP_AADJ1CH0, phy); - - phy = ((otp & TG3_OTP_LPFDIS_MASK) >> TG3_OTP_LPFDIS_SHIFT); - phy |= MII_TG3_DSP_AADJ1CH3_ADCCKADJ; - tg3_phydsp_write(tp, MII_TG3_DSP_AADJ1CH3, phy); - - phy = ((otp & TG3_OTP_VDAC_MASK) >> TG3_OTP_VDAC_SHIFT); - tg3_phydsp_write(tp, MII_TG3_DSP_EXP75, phy); - - phy = ((otp & TG3_OTP_10BTAMP_MASK) >> TG3_OTP_10BTAMP_SHIFT); - tg3_phydsp_write(tp, MII_TG3_DSP_EXP96, phy); - - phy = ((otp & TG3_OTP_ROFF_MASK) >> TG3_OTP_ROFF_SHIFT) | - ((otp & TG3_OTP_RCOFF_MASK) >> TG3_OTP_RCOFF_SHIFT); - tg3_phydsp_write(tp, MII_TG3_DSP_EXP97, phy); - - tg3_phy_toggle_auxctl_smdsp(tp, false); -} - -static void tg3_eee_pull_config(struct tg3 *tp, struct ethtool_eee *eee) -{ - u32 val; - struct ethtool_eee *dest = &tp->eee; - - if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP)) - return; - - if (eee) - dest = eee; - - if (tg3_phy_cl45_read(tp, MDIO_MMD_AN, TG3_CL45_D7_EEERES_STAT, &val)) - return; - - /* Pull eee_active */ - if (val == TG3_CL45_D7_EEERES_STAT_LP_1000T || - val == TG3_CL45_D7_EEERES_STAT_LP_100TX) { - dest->eee_active = 1; - } else - dest->eee_active = 0; - - /* Pull lp advertised settings */ - if (tg3_phy_cl45_read(tp, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE, &val)) - return; - dest->lp_advertised = mmd_eee_adv_to_ethtool_adv_t(val); - - /* Pull advertised and eee_enabled settings */ - if (tg3_phy_cl45_read(tp, MDIO_MMD_AN, MDIO_AN_EEE_ADV, &val)) - return; - dest->eee_enabled = !!val; - dest->advertised = mmd_eee_adv_to_ethtool_adv_t(val); - - /* Pull tx_lpi_enabled */ - val = tr32(TG3_CPMU_EEE_MODE); - dest->tx_lpi_enabled = !!(val & TG3_CPMU_EEEMD_LPI_IN_TX); - - /* Pull lpi timer value */ - dest->tx_lpi_timer = tr32(TG3_CPMU_EEE_DBTMR1) & 0xffff; -} - -static void tg3_phy_eee_adjust(struct tg3 *tp, bool current_link_up) -{ - u32 val; - - if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP)) - return; - - tp->setlpicnt = 0; - - if (tp->link_config.autoneg == AUTONEG_ENABLE && - current_link_up && - tp->link_config.active_duplex == DUPLEX_FULL && - (tp->link_config.active_speed == SPEED_100 || - tp->link_config.active_speed == SPEED_1000)) { - u32 eeectl; - - if (tp->link_config.active_speed == SPEED_1000) - eeectl = TG3_CPMU_EEE_CTRL_EXIT_16_5_US; - else - eeectl = TG3_CPMU_EEE_CTRL_EXIT_36_US; - - tw32(TG3_CPMU_EEE_CTRL, eeectl); - - tg3_eee_pull_config(tp, NULL); - if (tp->eee.eee_active) - tp->setlpicnt = 2; - } - - if (!tp->setlpicnt) { - if (current_link_up && - !tg3_phy_toggle_auxctl_smdsp(tp, true)) { - tg3_phydsp_write(tp, MII_TG3_DSP_TAP26, 0x0000); - tg3_phy_toggle_auxctl_smdsp(tp, false); - } - - val = tr32(TG3_CPMU_EEE_MODE); - tw32(TG3_CPMU_EEE_MODE, val & ~TG3_CPMU_EEEMD_LPI_ENABLE); - } -} - -static void tg3_phy_eee_enable(struct tg3 *tp) -{ - u32 val; - - if (tp->link_config.active_speed == SPEED_1000 && - (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_flag(tp, 57765_CLASS)) && - !tg3_phy_toggle_auxctl_smdsp(tp, true)) { - val = MII_TG3_DSP_TAP26_ALNOKO | - MII_TG3_DSP_TAP26_RMRXSTO; - tg3_phydsp_write(tp, MII_TG3_DSP_TAP26, val); - tg3_phy_toggle_auxctl_smdsp(tp, false); - } - - val = tr32(TG3_CPMU_EEE_MODE); - tw32(TG3_CPMU_EEE_MODE, val | TG3_CPMU_EEEMD_LPI_ENABLE); -} - -static int tg3_wait_macro_done(struct tg3 *tp) -{ - int limit = 100; - - while (limit--) { - u32 tmp32; - - if (!tg3_readphy(tp, MII_TG3_DSP_CONTROL, &tmp32)) { - if ((tmp32 & 0x1000) == 0) - break; - } - } - if (limit < 0) - return -EBUSY; - - return 0; -} - -static int tg3_phy_write_and_check_testpat(struct tg3 *tp, int *resetp) -{ - static const u32 test_pat[4][6] = { - { 0x00005555, 0x00000005, 0x00002aaa, 0x0000000a, 0x00003456, 0x00000003 }, - { 0x00002aaa, 0x0000000a, 0x00003333, 0x00000003, 0x0000789a, 0x00000005 }, - { 0x00005a5a, 0x00000005, 0x00002a6a, 0x0000000a, 0x00001bcd, 0x00000003 }, - { 0x00002a5a, 0x0000000a, 0x000033c3, 0x00000003, 0x00002ef1, 0x00000005 } - }; - int chan; - - for (chan = 0; chan < 4; chan++) { - int i; - - tg3_writephy(tp, MII_TG3_DSP_ADDRESS, - (chan * 0x2000) | 0x0200); - tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0002); - - for (i = 0; i < 6; i++) - tg3_writephy(tp, MII_TG3_DSP_RW_PORT, - test_pat[chan][i]); - - tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0202); - if (tg3_wait_macro_done(tp)) { - *resetp = 1; - return -EBUSY; - } - - tg3_writephy(tp, MII_TG3_DSP_ADDRESS, - (chan * 0x2000) | 0x0200); - tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0082); - if (tg3_wait_macro_done(tp)) { - *resetp = 1; - return -EBUSY; - } - - tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0802); - if (tg3_wait_macro_done(tp)) { - *resetp = 1; - return -EBUSY; - } - - for (i = 0; i < 6; i += 2) { - u32 low, high; - - if (tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &low) || - tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &high) || - tg3_wait_macro_done(tp)) { - *resetp = 1; - return -EBUSY; - } - low &= 0x7fff; - high &= 0x000f; - if (low != test_pat[chan][i] || - high != test_pat[chan][i+1]) { - tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000b); - tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4001); - tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4005); - - return -EBUSY; - } - } - } - - return 0; -} - -static int tg3_phy_reset_chanpat(struct tg3 *tp) -{ - int chan; - - for (chan = 0; chan < 4; chan++) { - int i; - - tg3_writephy(tp, MII_TG3_DSP_ADDRESS, - (chan * 0x2000) | 0x0200); - tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0002); - for (i = 0; i < 6; i++) - tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x000); - tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0202); - if (tg3_wait_macro_done(tp)) - return -EBUSY; - } - - return 0; -} - -static int tg3_phy_reset_5703_4_5(struct tg3 *tp) -{ - u32 reg32, phy9_orig; - int retries, do_phy_reset, err; - - retries = 10; - do_phy_reset = 1; - do { - if (do_phy_reset) { - err = tg3_bmcr_reset(tp); - if (err) - return err; - do_phy_reset = 0; - } - - /* Disable transmitter and interrupt. */ - if (tg3_readphy(tp, MII_TG3_EXT_CTRL, ®32)) - continue; - - reg32 |= 0x3000; - tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32); - - /* Set full-duplex, 1000 mbps. */ - tg3_writephy(tp, MII_BMCR, - BMCR_FULLDPLX | BMCR_SPEED1000); - - /* Set to master mode. */ - if (tg3_readphy(tp, MII_CTRL1000, &phy9_orig)) - continue; - - tg3_writephy(tp, MII_CTRL1000, - CTL1000_AS_MASTER | CTL1000_ENABLE_MASTER); - - err = tg3_phy_toggle_auxctl_smdsp(tp, true); - if (err) - return err; - - /* Block the PHY control access. */ - tg3_phydsp_write(tp, 0x8005, 0x0800); - - err = tg3_phy_write_and_check_testpat(tp, &do_phy_reset); - if (!err) - break; - } while (--retries); - - err = tg3_phy_reset_chanpat(tp); - if (err) - return err; - - tg3_phydsp_write(tp, 0x8005, 0x0000); - - tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8200); - tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0000); - - tg3_phy_toggle_auxctl_smdsp(tp, false); - - tg3_writephy(tp, MII_CTRL1000, phy9_orig); - - err = tg3_readphy(tp, MII_TG3_EXT_CTRL, ®32); - if (err) - return err; - - reg32 &= ~0x3000; - tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32); - - return 0; -} - -static void tg3_carrier_off(struct tg3 *tp) -{ - netif_carrier_off(tp->dev); - tp->link_up = false; -} - -static void tg3_warn_mgmt_link_flap(struct tg3 *tp) -{ - if (tg3_flag(tp, ENABLE_ASF)) - netdev_warn(tp->dev, - "Management side-band traffic will be interrupted during phy settings change\n"); -} - -/* This will reset the tigon3 PHY if there is no valid - * link unless the FORCE argument is non-zero. - */ -static int tg3_phy_reset(struct tg3 *tp) -{ - u32 val, cpmuctrl; - int err; - - if (tg3_asic_rev(tp) == ASIC_REV_5906) { - val = tr32(GRC_MISC_CFG); - tw32_f(GRC_MISC_CFG, val & ~GRC_MISC_CFG_EPHY_IDDQ); - udelay(40); - } - err = tg3_readphy(tp, MII_BMSR, &val); - err |= tg3_readphy(tp, MII_BMSR, &val); - if (err != 0) - return -EBUSY; - - if (netif_running(tp->dev) && tp->link_up) { - netif_carrier_off(tp->dev); - tg3_link_report(tp); - } - - if (tg3_asic_rev(tp) == ASIC_REV_5703 || - tg3_asic_rev(tp) == ASIC_REV_5704 || - tg3_asic_rev(tp) == ASIC_REV_5705) { - err = tg3_phy_reset_5703_4_5(tp); - if (err) - return err; - goto out; - } - - cpmuctrl = 0; - if (tg3_asic_rev(tp) == ASIC_REV_5784 && - tg3_chip_rev(tp) != CHIPREV_5784_AX) { - cpmuctrl = tr32(TG3_CPMU_CTRL); - if (cpmuctrl & CPMU_CTRL_GPHY_10MB_RXONLY) - tw32(TG3_CPMU_CTRL, - cpmuctrl & ~CPMU_CTRL_GPHY_10MB_RXONLY); - } - - err = tg3_bmcr_reset(tp); - if (err) - return err; - - if (cpmuctrl & CPMU_CTRL_GPHY_10MB_RXONLY) { - val = MII_TG3_DSP_EXP8_AEDW | MII_TG3_DSP_EXP8_REJ2MHz; - tg3_phydsp_write(tp, MII_TG3_DSP_EXP8, val); - - tw32(TG3_CPMU_CTRL, cpmuctrl); - } - - if (tg3_chip_rev(tp) == CHIPREV_5784_AX || - tg3_chip_rev(tp) == CHIPREV_5761_AX) { - val = tr32(TG3_CPMU_LSPD_1000MB_CLK); - if ((val & CPMU_LSPD_1000MB_MACCLK_MASK) == - CPMU_LSPD_1000MB_MACCLK_12_5) { - val &= ~CPMU_LSPD_1000MB_MACCLK_MASK; - udelay(40); - tw32_f(TG3_CPMU_LSPD_1000MB_CLK, val); - } - } - - if (tg3_flag(tp, 5717_PLUS) && - (tp->phy_flags & TG3_PHYFLG_MII_SERDES)) - return 0; - - tg3_phy_apply_otp(tp); - - if (tp->phy_flags & TG3_PHYFLG_ENABLE_APD) - tg3_phy_toggle_apd(tp, true); - else - tg3_phy_toggle_apd(tp, false); - -out: - if ((tp->phy_flags & TG3_PHYFLG_ADC_BUG) && - !tg3_phy_toggle_auxctl_smdsp(tp, true)) { - tg3_phydsp_write(tp, 0x201f, 0x2aaa); - tg3_phydsp_write(tp, 0x000a, 0x0323); - tg3_phy_toggle_auxctl_smdsp(tp, false); - } - - if (tp->phy_flags & TG3_PHYFLG_5704_A0_BUG) { - tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8d68); - tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8d68); - } - - if (tp->phy_flags & TG3_PHYFLG_BER_BUG) { - if (!tg3_phy_toggle_auxctl_smdsp(tp, true)) { - tg3_phydsp_write(tp, 0x000a, 0x310b); - tg3_phydsp_write(tp, 0x201f, 0x9506); - tg3_phydsp_write(tp, 0x401f, 0x14e2); - tg3_phy_toggle_auxctl_smdsp(tp, false); - } - } else if (tp->phy_flags & TG3_PHYFLG_JITTER_BUG) { - if (!tg3_phy_toggle_auxctl_smdsp(tp, true)) { - tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a); - if (tp->phy_flags & TG3_PHYFLG_ADJUST_TRIM) { - tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x110b); - tg3_writephy(tp, MII_TG3_TEST1, - MII_TG3_TEST1_TRIM_EN | 0x4); - } else - tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x010b); - - tg3_phy_toggle_auxctl_smdsp(tp, false); - } - } - - /* Set Extended packet length bit (bit 14) on all chips that */ - /* support jumbo frames */ - if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) { - /* Cannot do read-modify-write on 5401 */ - tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, 0x4c20); - } else if (tg3_flag(tp, JUMBO_CAPABLE)) { - /* Set bit 14 with read-modify-write to preserve other bits */ - err = tg3_phy_auxctl_read(tp, - MII_TG3_AUXCTL_SHDWSEL_AUXCTL, &val); - if (!err) - tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, - val | MII_TG3_AUXCTL_ACTL_EXTPKTLEN); - } - - /* Set phy register 0x10 bit 0 to high fifo elasticity to support - * jumbo frames transmission. - */ - if (tg3_flag(tp, JUMBO_CAPABLE)) { - if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, &val)) - tg3_writephy(tp, MII_TG3_EXT_CTRL, - val | MII_TG3_EXT_CTRL_FIFO_ELASTIC); - } - - if (tg3_asic_rev(tp) == ASIC_REV_5906) { - /* adjust output voltage */ - tg3_writephy(tp, MII_TG3_FET_PTEST, 0x12); - } - - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5762_A0) - tg3_phydsp_write(tp, 0xffb, 0x4000); - - tg3_phy_toggle_automdix(tp, true); - tg3_phy_set_wirespeed(tp); - return 0; -} - -#define TG3_GPIO_MSG_DRVR_PRES 0x00000001 -#define TG3_GPIO_MSG_NEED_VAUX 0x00000002 -#define TG3_GPIO_MSG_MASK (TG3_GPIO_MSG_DRVR_PRES | \ - TG3_GPIO_MSG_NEED_VAUX) -#define TG3_GPIO_MSG_ALL_DRVR_PRES_MASK \ - ((TG3_GPIO_MSG_DRVR_PRES << 0) | \ - (TG3_GPIO_MSG_DRVR_PRES << 4) | \ - (TG3_GPIO_MSG_DRVR_PRES << 8) | \ - (TG3_GPIO_MSG_DRVR_PRES << 12)) - -#define TG3_GPIO_MSG_ALL_NEED_VAUX_MASK \ - ((TG3_GPIO_MSG_NEED_VAUX << 0) | \ - (TG3_GPIO_MSG_NEED_VAUX << 4) | \ - (TG3_GPIO_MSG_NEED_VAUX << 8) | \ - (TG3_GPIO_MSG_NEED_VAUX << 12)) - -static inline u32 tg3_set_function_status(struct tg3 *tp, u32 newstat) -{ - u32 status, shift; - - if (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5719) - status = tg3_ape_read32(tp, TG3_APE_GPIO_MSG); - else - status = tr32(TG3_CPMU_DRV_STATUS); - - shift = TG3_APE_GPIO_MSG_SHIFT + 4 * tp->pci_fn; - status &= ~(TG3_GPIO_MSG_MASK << shift); - status |= (newstat << shift); - - if (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5719) - tg3_ape_write32(tp, TG3_APE_GPIO_MSG, status); - else - tw32(TG3_CPMU_DRV_STATUS, status); - - return status >> TG3_APE_GPIO_MSG_SHIFT; -} - -static inline int tg3_pwrsrc_switch_to_vmain(struct tg3 *tp) -{ - if (!tg3_flag(tp, IS_NIC)) - return 0; - - if (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720) { - if (tg3_ape_lock(tp, TG3_APE_LOCK_GPIO)) - return -EIO; - - tg3_set_function_status(tp, TG3_GPIO_MSG_DRVR_PRES); - - tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl, - TG3_GRC_LCLCTL_PWRSW_DELAY); - - tg3_ape_unlock(tp, TG3_APE_LOCK_GPIO); - } else { - tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl, - TG3_GRC_LCLCTL_PWRSW_DELAY); - } - - return 0; -} - -static void tg3_pwrsrc_die_with_vmain(struct tg3 *tp) -{ - u32 grc_local_ctrl; - - if (!tg3_flag(tp, IS_NIC) || - tg3_asic_rev(tp) == ASIC_REV_5700 || - tg3_asic_rev(tp) == ASIC_REV_5701) - return; - - grc_local_ctrl = tp->grc_local_ctrl | GRC_LCLCTRL_GPIO_OE1; - - tw32_wait_f(GRC_LOCAL_CTRL, - grc_local_ctrl | GRC_LCLCTRL_GPIO_OUTPUT1, - TG3_GRC_LCLCTL_PWRSW_DELAY); - - tw32_wait_f(GRC_LOCAL_CTRL, - grc_local_ctrl, - TG3_GRC_LCLCTL_PWRSW_DELAY); - - tw32_wait_f(GRC_LOCAL_CTRL, - grc_local_ctrl | GRC_LCLCTRL_GPIO_OUTPUT1, - TG3_GRC_LCLCTL_PWRSW_DELAY); -} - -static void tg3_pwrsrc_switch_to_vaux(struct tg3 *tp) -{ - if (!tg3_flag(tp, IS_NIC)) - return; - - if (tg3_asic_rev(tp) == ASIC_REV_5700 || - tg3_asic_rev(tp) == ASIC_REV_5701) { - tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | - (GRC_LCLCTRL_GPIO_OE0 | - GRC_LCLCTRL_GPIO_OE1 | - GRC_LCLCTRL_GPIO_OE2 | - GRC_LCLCTRL_GPIO_OUTPUT0 | - GRC_LCLCTRL_GPIO_OUTPUT1), - TG3_GRC_LCLCTL_PWRSW_DELAY); - } else if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5761S) { - /* The 5761 non-e device swaps GPIO 0 and GPIO 2. */ - u32 grc_local_ctrl = GRC_LCLCTRL_GPIO_OE0 | - GRC_LCLCTRL_GPIO_OE1 | - GRC_LCLCTRL_GPIO_OE2 | - GRC_LCLCTRL_GPIO_OUTPUT0 | - GRC_LCLCTRL_GPIO_OUTPUT1 | - tp->grc_local_ctrl; - tw32_wait_f(GRC_LOCAL_CTRL, grc_local_ctrl, - TG3_GRC_LCLCTL_PWRSW_DELAY); - - grc_local_ctrl |= GRC_LCLCTRL_GPIO_OUTPUT2; - tw32_wait_f(GRC_LOCAL_CTRL, grc_local_ctrl, - TG3_GRC_LCLCTL_PWRSW_DELAY); - - grc_local_ctrl &= ~GRC_LCLCTRL_GPIO_OUTPUT0; - tw32_wait_f(GRC_LOCAL_CTRL, grc_local_ctrl, - TG3_GRC_LCLCTL_PWRSW_DELAY); - } else { - u32 no_gpio2; - u32 grc_local_ctrl = 0; - - /* Workaround to prevent overdrawing Amps. */ - if (tg3_asic_rev(tp) == ASIC_REV_5714) { - grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3; - tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | - grc_local_ctrl, - TG3_GRC_LCLCTL_PWRSW_DELAY); - } - - /* On 5753 and variants, GPIO2 cannot be used. */ - no_gpio2 = tp->nic_sram_data_cfg & - NIC_SRAM_DATA_CFG_NO_GPIO2; - - grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE0 | - GRC_LCLCTRL_GPIO_OE1 | - GRC_LCLCTRL_GPIO_OE2 | - GRC_LCLCTRL_GPIO_OUTPUT1 | - GRC_LCLCTRL_GPIO_OUTPUT2; - if (no_gpio2) { - grc_local_ctrl &= ~(GRC_LCLCTRL_GPIO_OE2 | - GRC_LCLCTRL_GPIO_OUTPUT2); - } - tw32_wait_f(GRC_LOCAL_CTRL, - tp->grc_local_ctrl | grc_local_ctrl, - TG3_GRC_LCLCTL_PWRSW_DELAY); - - grc_local_ctrl |= GRC_LCLCTRL_GPIO_OUTPUT0; - - tw32_wait_f(GRC_LOCAL_CTRL, - tp->grc_local_ctrl | grc_local_ctrl, - TG3_GRC_LCLCTL_PWRSW_DELAY); - - if (!no_gpio2) { - grc_local_ctrl &= ~GRC_LCLCTRL_GPIO_OUTPUT2; - tw32_wait_f(GRC_LOCAL_CTRL, - tp->grc_local_ctrl | grc_local_ctrl, - TG3_GRC_LCLCTL_PWRSW_DELAY); - } - } -} - -static void tg3_frob_aux_power_5717(struct tg3 *tp, bool wol_enable) -{ - u32 msg = 0; - - /* Serialize power state transitions */ - if (tg3_ape_lock(tp, TG3_APE_LOCK_GPIO)) - return; - - if (tg3_flag(tp, ENABLE_ASF) || tg3_flag(tp, ENABLE_APE) || wol_enable) - msg = TG3_GPIO_MSG_NEED_VAUX; - - msg = tg3_set_function_status(tp, msg); - - if (msg & TG3_GPIO_MSG_ALL_DRVR_PRES_MASK) - goto done; - - if (msg & TG3_GPIO_MSG_ALL_NEED_VAUX_MASK) - tg3_pwrsrc_switch_to_vaux(tp); - else - tg3_pwrsrc_die_with_vmain(tp); - -done: - tg3_ape_unlock(tp, TG3_APE_LOCK_GPIO); -} - -static void tg3_frob_aux_power(struct tg3 *tp, bool include_wol) -{ - bool need_vaux = false; - - /* The GPIOs do something completely different on 57765. */ - if (!tg3_flag(tp, IS_NIC) || tg3_flag(tp, 57765_CLASS)) - return; - - if (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720) { - tg3_frob_aux_power_5717(tp, include_wol ? - tg3_flag(tp, WOL_ENABLE) != 0 : 0); - return; - } - - if (tp->pdev_peer && tp->pdev_peer != tp->pdev) { - struct net_device *dev_peer; - - dev_peer = pci_get_drvdata(tp->pdev_peer); - - /* remove_one() may have been run on the peer. */ - if (dev_peer) { - struct tg3 *tp_peer = netdev_priv(dev_peer); - - if (tg3_flag(tp_peer, INIT_COMPLETE)) - return; - - if ((include_wol && tg3_flag(tp_peer, WOL_ENABLE)) || - tg3_flag(tp_peer, ENABLE_ASF)) - need_vaux = true; - } - } - - if ((include_wol && tg3_flag(tp, WOL_ENABLE)) || - tg3_flag(tp, ENABLE_ASF)) - need_vaux = true; - - if (need_vaux) - tg3_pwrsrc_switch_to_vaux(tp); - else - tg3_pwrsrc_die_with_vmain(tp); -} - -static int tg3_5700_link_polarity(struct tg3 *tp, u32 speed) -{ - if (tp->led_ctrl == LED_CTRL_MODE_PHY_2) - return 1; - else if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5411) { - if (speed != SPEED_10) - return 1; - } else if (speed == SPEED_10) - return 1; - - return 0; -} - -static bool tg3_phy_power_bug(struct tg3 *tp) -{ - switch (tg3_asic_rev(tp)) { - case ASIC_REV_5700: - case ASIC_REV_5704: - return true; - case ASIC_REV_5780: - if (tp->phy_flags & TG3_PHYFLG_MII_SERDES) - return true; - return false; - case ASIC_REV_5717: - if (!tp->pci_fn) - return true; - return false; - case ASIC_REV_5719: - case ASIC_REV_5720: - if ((tp->phy_flags & TG3_PHYFLG_PHY_SERDES) && - !tp->pci_fn) - return true; - return false; - } - - return false; -} - -static bool tg3_phy_led_bug(struct tg3 *tp) -{ - switch (tg3_asic_rev(tp)) { - case ASIC_REV_5719: - case ASIC_REV_5720: - if ((tp->phy_flags & TG3_PHYFLG_MII_SERDES) && - !tp->pci_fn) - return true; - return false; - } - - return false; -} - -static void tg3_power_down_phy(struct tg3 *tp, bool do_low_power) -{ - u32 val; - - if (tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN) - return; - - if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) { - if (tg3_asic_rev(tp) == ASIC_REV_5704) { - u32 sg_dig_ctrl = tr32(SG_DIG_CTRL); - u32 serdes_cfg = tr32(MAC_SERDES_CFG); - - sg_dig_ctrl |= - SG_DIG_USING_HW_AUTONEG | SG_DIG_SOFT_RESET; - tw32(SG_DIG_CTRL, sg_dig_ctrl); - tw32(MAC_SERDES_CFG, serdes_cfg | (1 << 15)); - } - return; - } - - if (tg3_asic_rev(tp) == ASIC_REV_5906) { - tg3_bmcr_reset(tp); - val = tr32(GRC_MISC_CFG); - tw32_f(GRC_MISC_CFG, val | GRC_MISC_CFG_EPHY_IDDQ); - udelay(40); - return; - } else if (tp->phy_flags & TG3_PHYFLG_IS_FET) { - u32 phytest; - if (!tg3_readphy(tp, MII_TG3_FET_TEST, &phytest)) { - u32 phy; - - tg3_writephy(tp, MII_ADVERTISE, 0); - tg3_writephy(tp, MII_BMCR, - BMCR_ANENABLE | BMCR_ANRESTART); - - tg3_writephy(tp, MII_TG3_FET_TEST, - phytest | MII_TG3_FET_SHADOW_EN); - if (!tg3_readphy(tp, MII_TG3_FET_SHDW_AUXMODE4, &phy)) { - phy |= MII_TG3_FET_SHDW_AUXMODE4_SBPD; - tg3_writephy(tp, - MII_TG3_FET_SHDW_AUXMODE4, - phy); - } - tg3_writephy(tp, MII_TG3_FET_TEST, phytest); - } - return; - } else if (do_low_power) { - if (!tg3_phy_led_bug(tp)) - tg3_writephy(tp, MII_TG3_EXT_CTRL, - MII_TG3_EXT_CTRL_FORCE_LED_OFF); - - val = MII_TG3_AUXCTL_PCTL_100TX_LPWR | - MII_TG3_AUXCTL_PCTL_SPR_ISOLATE | - MII_TG3_AUXCTL_PCTL_VREG_11V; - tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_PWRCTL, val); - } - - /* The PHY should not be powered down on some chips because - * of bugs. - */ - if (tg3_phy_power_bug(tp)) - return; - - if (tg3_chip_rev(tp) == CHIPREV_5784_AX || - tg3_chip_rev(tp) == CHIPREV_5761_AX) { - val = tr32(TG3_CPMU_LSPD_1000MB_CLK); - val &= ~CPMU_LSPD_1000MB_MACCLK_MASK; - val |= CPMU_LSPD_1000MB_MACCLK_12_5; - tw32_f(TG3_CPMU_LSPD_1000MB_CLK, val); - } - - tg3_writephy(tp, MII_BMCR, BMCR_PDOWN); -} - -/* tp->lock is held. */ -static int tg3_nvram_lock(struct tg3 *tp) -{ - if (tg3_flag(tp, NVRAM)) { - int i; - - if (tp->nvram_lock_cnt == 0) { - tw32(NVRAM_SWARB, SWARB_REQ_SET1); - for (i = 0; i < 8000; i++) { - if (tr32(NVRAM_SWARB) & SWARB_GNT1) - break; - udelay(20); - } - if (i == 8000) { - tw32(NVRAM_SWARB, SWARB_REQ_CLR1); - return -ENODEV; - } - } - tp->nvram_lock_cnt++; - } - return 0; -} - -/* tp->lock is held. */ -static void tg3_nvram_unlock(struct tg3 *tp) -{ - if (tg3_flag(tp, NVRAM)) { - if (tp->nvram_lock_cnt > 0) - tp->nvram_lock_cnt--; - if (tp->nvram_lock_cnt == 0) - tw32_f(NVRAM_SWARB, SWARB_REQ_CLR1); - } -} - -/* tp->lock is held. */ -static void tg3_enable_nvram_access(struct tg3 *tp) -{ - if (tg3_flag(tp, 5750_PLUS) && !tg3_flag(tp, PROTECTED_NVRAM)) { - u32 nvaccess = tr32(NVRAM_ACCESS); - - tw32(NVRAM_ACCESS, nvaccess | ACCESS_ENABLE); - } -} - -/* tp->lock is held. */ -static void tg3_disable_nvram_access(struct tg3 *tp) -{ - if (tg3_flag(tp, 5750_PLUS) && !tg3_flag(tp, PROTECTED_NVRAM)) { - u32 nvaccess = tr32(NVRAM_ACCESS); - - tw32(NVRAM_ACCESS, nvaccess & ~ACCESS_ENABLE); - } -} - -static int tg3_nvram_read_using_eeprom(struct tg3 *tp, - u32 offset, u32 *val) -{ - u32 tmp; - int i; - - if (offset > EEPROM_ADDR_ADDR_MASK || (offset % 4) != 0) - return -EINVAL; - - tmp = tr32(GRC_EEPROM_ADDR) & ~(EEPROM_ADDR_ADDR_MASK | - EEPROM_ADDR_DEVID_MASK | - EEPROM_ADDR_READ); - tw32(GRC_EEPROM_ADDR, - tmp | - (0 << EEPROM_ADDR_DEVID_SHIFT) | - ((offset << EEPROM_ADDR_ADDR_SHIFT) & - EEPROM_ADDR_ADDR_MASK) | - EEPROM_ADDR_READ | EEPROM_ADDR_START); - - for (i = 0; i < 1000; i++) { - tmp = tr32(GRC_EEPROM_ADDR); - - if (tmp & EEPROM_ADDR_COMPLETE) - break; - msleep(1); - } - if (!(tmp & EEPROM_ADDR_COMPLETE)) - return -EBUSY; - - tmp = tr32(GRC_EEPROM_DATA); - - /* - * The data will always be opposite the native endian - * format. Perform a blind byteswap to compensate. - */ - *val = swab32(tmp); - - return 0; -} - -#define NVRAM_CMD_TIMEOUT 5000 - -static int tg3_nvram_exec_cmd(struct tg3 *tp, u32 nvram_cmd) -{ - int i; - - tw32(NVRAM_CMD, nvram_cmd); - for (i = 0; i < NVRAM_CMD_TIMEOUT; i++) { - usleep_range(10, 40); - if (tr32(NVRAM_CMD) & NVRAM_CMD_DONE) { - udelay(10); - break; - } - } - - if (i == NVRAM_CMD_TIMEOUT) - return -EBUSY; - - return 0; -} - -static u32 tg3_nvram_phys_addr(struct tg3 *tp, u32 addr) -{ - if (tg3_flag(tp, NVRAM) && - tg3_flag(tp, NVRAM_BUFFERED) && - tg3_flag(tp, FLASH) && - !tg3_flag(tp, NO_NVRAM_ADDR_TRANS) && - (tp->nvram_jedecnum == JEDEC_ATMEL)) - - addr = ((addr / tp->nvram_pagesize) << - ATMEL_AT45DB0X1B_PAGE_POS) + - (addr % tp->nvram_pagesize); - - return addr; -} - -static u32 tg3_nvram_logical_addr(struct tg3 *tp, u32 addr) -{ - if (tg3_flag(tp, NVRAM) && - tg3_flag(tp, NVRAM_BUFFERED) && - tg3_flag(tp, FLASH) && - !tg3_flag(tp, NO_NVRAM_ADDR_TRANS) && - (tp->nvram_jedecnum == JEDEC_ATMEL)) - - addr = ((addr >> ATMEL_AT45DB0X1B_PAGE_POS) * - tp->nvram_pagesize) + - (addr & ((1 << ATMEL_AT45DB0X1B_PAGE_POS) - 1)); - - return addr; -} - -/* NOTE: Data read in from NVRAM is byteswapped according to - * the byteswapping settings for all other register accesses. - * tg3 devices are BE devices, so on a BE machine, the data - * returned will be exactly as it is seen in NVRAM. On a LE - * machine, the 32-bit value will be byteswapped. - */ -static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val) -{ - int ret; - - if (!tg3_flag(tp, NVRAM)) - return tg3_nvram_read_using_eeprom(tp, offset, val); - - offset = tg3_nvram_phys_addr(tp, offset); - - if (offset > NVRAM_ADDR_MSK) - return -EINVAL; - - ret = tg3_nvram_lock(tp); - if (ret) - return ret; - - tg3_enable_nvram_access(tp); - - tw32(NVRAM_ADDR, offset); - ret = tg3_nvram_exec_cmd(tp, NVRAM_CMD_RD | NVRAM_CMD_GO | - NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_DONE); - - if (ret == 0) - *val = tr32(NVRAM_RDDATA); - - tg3_disable_nvram_access(tp); - - tg3_nvram_unlock(tp); - - return ret; -} - -/* Ensures NVRAM data is in bytestream format. */ -static int tg3_nvram_read_be32(struct tg3 *tp, u32 offset, __be32 *val) -{ - u32 v; - int res = tg3_nvram_read(tp, offset, &v); - if (!res) - *val = cpu_to_be32(v); - return res; -} - -static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp, - u32 offset, u32 len, u8 *buf) -{ - int i, j, rc = 0; - u32 val; - - for (i = 0; i < len; i += 4) { - u32 addr; - __be32 data; - - addr = offset + i; - - memcpy(&data, buf + i, 4); - - /* - * The SEEPROM interface expects the data to always be opposite - * the native endian format. We accomplish this by reversing - * all the operations that would have been performed on the - * data from a call to tg3_nvram_read_be32(). - */ - tw32(GRC_EEPROM_DATA, swab32(be32_to_cpu(data))); - - val = tr32(GRC_EEPROM_ADDR); - tw32(GRC_EEPROM_ADDR, val | EEPROM_ADDR_COMPLETE); - - val &= ~(EEPROM_ADDR_ADDR_MASK | EEPROM_ADDR_DEVID_MASK | - EEPROM_ADDR_READ); - tw32(GRC_EEPROM_ADDR, val | - (0 << EEPROM_ADDR_DEVID_SHIFT) | - (addr & EEPROM_ADDR_ADDR_MASK) | - EEPROM_ADDR_START | - EEPROM_ADDR_WRITE); - - for (j = 0; j < 1000; j++) { - val = tr32(GRC_EEPROM_ADDR); - - if (val & EEPROM_ADDR_COMPLETE) - break; - msleep(1); - } - if (!(val & EEPROM_ADDR_COMPLETE)) { - rc = -EBUSY; - break; - } - } - - return rc; -} - -/* offset and length are dword aligned */ -static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len, - u8 *buf) -{ - int ret = 0; - u32 pagesize = tp->nvram_pagesize; - u32 pagemask = pagesize - 1; - u32 nvram_cmd; - u8 *tmp; - - tmp = kmalloc(pagesize, GFP_KERNEL); - if (tmp == NULL) - return -ENOMEM; - - while (len) { - int j; - u32 phy_addr, page_off, size; - - phy_addr = offset & ~pagemask; - - for (j = 0; j < pagesize; j += 4) { - ret = tg3_nvram_read_be32(tp, phy_addr + j, - (__be32 *) (tmp + j)); - if (ret) - break; - } - if (ret) - break; - - page_off = offset & pagemask; - size = pagesize; - if (len < size) - size = len; - - len -= size; - - memcpy(tmp + page_off, buf, size); - - offset = offset + (pagesize - page_off); - - tg3_enable_nvram_access(tp); - - /* - * Before we can erase the flash page, we need - * to issue a special "write enable" command. - */ - nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE; - - if (tg3_nvram_exec_cmd(tp, nvram_cmd)) - break; - - /* Erase the target page */ - tw32(NVRAM_ADDR, phy_addr); - - nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR | - NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_ERASE; - - if (tg3_nvram_exec_cmd(tp, nvram_cmd)) - break; - - /* Issue another write enable to start the write. */ - nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE; - - if (tg3_nvram_exec_cmd(tp, nvram_cmd)) - break; - - for (j = 0; j < pagesize; j += 4) { - __be32 data; - - data = *((__be32 *) (tmp + j)); - - tw32(NVRAM_WRDATA, be32_to_cpu(data)); - - tw32(NVRAM_ADDR, phy_addr + j); - - nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | - NVRAM_CMD_WR; - - if (j == 0) - nvram_cmd |= NVRAM_CMD_FIRST; - else if (j == (pagesize - 4)) - nvram_cmd |= NVRAM_CMD_LAST; - - ret = tg3_nvram_exec_cmd(tp, nvram_cmd); - if (ret) - break; - } - if (ret) - break; - } - - nvram_cmd = NVRAM_CMD_WRDI | NVRAM_CMD_GO | NVRAM_CMD_DONE; - tg3_nvram_exec_cmd(tp, nvram_cmd); - - kfree(tmp); - - return ret; -} - -/* offset and length are dword aligned */ -static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len, - u8 *buf) -{ - int i, ret = 0; - - for (i = 0; i < len; i += 4, offset += 4) { - u32 page_off, phy_addr, nvram_cmd; - __be32 data; - - memcpy(&data, buf + i, 4); - tw32(NVRAM_WRDATA, be32_to_cpu(data)); - - page_off = offset % tp->nvram_pagesize; - - phy_addr = tg3_nvram_phys_addr(tp, offset); - - nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR; - - if (page_off == 0 || i == 0) - nvram_cmd |= NVRAM_CMD_FIRST; - if (page_off == (tp->nvram_pagesize - 4)) - nvram_cmd |= NVRAM_CMD_LAST; - - if (i == (len - 4)) - nvram_cmd |= NVRAM_CMD_LAST; - - if ((nvram_cmd & NVRAM_CMD_FIRST) || - !tg3_flag(tp, FLASH) || - !tg3_flag(tp, 57765_PLUS)) - tw32(NVRAM_ADDR, phy_addr); - - if (tg3_asic_rev(tp) != ASIC_REV_5752 && - !tg3_flag(tp, 5755_PLUS) && - (tp->nvram_jedecnum == JEDEC_ST) && - (nvram_cmd & NVRAM_CMD_FIRST)) { - u32 cmd; - - cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE; - ret = tg3_nvram_exec_cmd(tp, cmd); - if (ret) - break; - } - if (!tg3_flag(tp, FLASH)) { - /* We always do complete word writes to eeprom. */ - nvram_cmd |= (NVRAM_CMD_FIRST | NVRAM_CMD_LAST); - } - - ret = tg3_nvram_exec_cmd(tp, nvram_cmd); - if (ret) - break; - } - return ret; -} - -/* offset and length are dword aligned */ -static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf) -{ - int ret; - - if (tg3_flag(tp, EEPROM_WRITE_PROT)) { - tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl & - ~GRC_LCLCTRL_GPIO_OUTPUT1); - udelay(40); - } - - if (!tg3_flag(tp, NVRAM)) { - ret = tg3_nvram_write_block_using_eeprom(tp, offset, len, buf); - } else { - u32 grc_mode; - - ret = tg3_nvram_lock(tp); - if (ret) - return ret; - - tg3_enable_nvram_access(tp); - if (tg3_flag(tp, 5750_PLUS) && !tg3_flag(tp, PROTECTED_NVRAM)) - tw32(NVRAM_WRITE1, 0x406); - - grc_mode = tr32(GRC_MODE); - tw32(GRC_MODE, grc_mode | GRC_MODE_NVRAM_WR_ENABLE); - - if (tg3_flag(tp, NVRAM_BUFFERED) || !tg3_flag(tp, FLASH)) { - ret = tg3_nvram_write_block_buffered(tp, offset, len, - buf); - } else { - ret = tg3_nvram_write_block_unbuffered(tp, offset, len, - buf); - } - - grc_mode = tr32(GRC_MODE); - tw32(GRC_MODE, grc_mode & ~GRC_MODE_NVRAM_WR_ENABLE); - - tg3_disable_nvram_access(tp); - tg3_nvram_unlock(tp); - } - - if (tg3_flag(tp, EEPROM_WRITE_PROT)) { - tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl); - udelay(40); - } - - return ret; -} - -#define RX_CPU_SCRATCH_BASE 0x30000 -#define RX_CPU_SCRATCH_SIZE 0x04000 -#define TX_CPU_SCRATCH_BASE 0x34000 -#define TX_CPU_SCRATCH_SIZE 0x04000 - -/* tp->lock is held. */ -static int tg3_pause_cpu(struct tg3 *tp, u32 cpu_base) -{ - int i; - const int iters = 10000; - - for (i = 0; i < iters; i++) { - tw32(cpu_base + CPU_STATE, 0xffffffff); - tw32(cpu_base + CPU_MODE, CPU_MODE_HALT); - if (tr32(cpu_base + CPU_MODE) & CPU_MODE_HALT) - break; - if (pci_channel_offline(tp->pdev)) - return -EBUSY; - } - - return (i == iters) ? -EBUSY : 0; -} - -/* tp->lock is held. */ -static int tg3_rxcpu_pause(struct tg3 *tp) -{ - int rc = tg3_pause_cpu(tp, RX_CPU_BASE); - - tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); - tw32_f(RX_CPU_BASE + CPU_MODE, CPU_MODE_HALT); - udelay(10); - - return rc; -} - -/* tp->lock is held. */ -static int tg3_txcpu_pause(struct tg3 *tp) -{ - return tg3_pause_cpu(tp, TX_CPU_BASE); -} - -/* tp->lock is held. */ -static void tg3_resume_cpu(struct tg3 *tp, u32 cpu_base) -{ - tw32(cpu_base + CPU_STATE, 0xffffffff); - tw32_f(cpu_base + CPU_MODE, 0x00000000); -} - -/* tp->lock is held. */ -static void tg3_rxcpu_resume(struct tg3 *tp) -{ - tg3_resume_cpu(tp, RX_CPU_BASE); -} - -/* tp->lock is held. */ -static int tg3_halt_cpu(struct tg3 *tp, u32 cpu_base) -{ - int rc; - - BUG_ON(cpu_base == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS)); - - if (tg3_asic_rev(tp) == ASIC_REV_5906) { - u32 val = tr32(GRC_VCPU_EXT_CTRL); - - tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_HALT_CPU); - return 0; - } - if (cpu_base == RX_CPU_BASE) { - rc = tg3_rxcpu_pause(tp); - } else { - /* - * There is only an Rx CPU for the 5750 derivative in the - * BCM4785. - */ - if (tg3_flag(tp, IS_SSB_CORE)) - return 0; - - rc = tg3_txcpu_pause(tp); - } - - if (rc) { - netdev_err(tp->dev, "%s timed out, %s CPU\n", - __func__, cpu_base == RX_CPU_BASE ? "RX" : "TX"); - return -ENODEV; - } - - /* Clear firmware's nvram arbitration. */ - if (tg3_flag(tp, NVRAM)) - tw32(NVRAM_SWARB, SWARB_REQ_CLR0); - return 0; -} - -static int tg3_fw_data_len(struct tg3 *tp, - const struct tg3_firmware_hdr *fw_hdr) -{ - int fw_len; - - /* Non fragmented firmware have one firmware header followed by a - * contiguous chunk of data to be written. The length field in that - * header is not the length of data to be written but the complete - * length of the bss. The data length is determined based on - * tp->fw->size minus headers. - * - * Fragmented firmware have a main header followed by multiple - * fragments. Each fragment is identical to non fragmented firmware - * with a firmware header followed by a contiguous chunk of data. In - * the main header, the length field is unused and set to 0xffffffff. - * In each fragment header the length is the entire size of that - * fragment i.e. fragment data + header length. Data length is - * therefore length field in the header minus TG3_FW_HDR_LEN. - */ - if (tp->fw_len == 0xffffffff) - fw_len = be32_to_cpu(fw_hdr->len); - else - fw_len = tp->fw->size; - - return (fw_len - TG3_FW_HDR_LEN) / sizeof(u32); -} - -/* tp->lock is held. */ -static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base, - u32 cpu_scratch_base, int cpu_scratch_size, - const struct tg3_firmware_hdr *fw_hdr) -{ - int err, i; - void (*write_op)(struct tg3 *, u32, u32); - int total_len = tp->fw->size; - - if (cpu_base == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS)) { - netdev_err(tp->dev, - "%s: Trying to load TX cpu firmware which is 5705\n", - __func__); - return -EINVAL; - } - - if (tg3_flag(tp, 5705_PLUS) && tg3_asic_rev(tp) != ASIC_REV_57766) - write_op = tg3_write_mem; - else - write_op = tg3_write_indirect_reg32; - - if (tg3_asic_rev(tp) != ASIC_REV_57766) { - /* It is possible that bootcode is still loading at this point. - * Get the nvram lock first before halting the cpu. - */ - int lock_err = tg3_nvram_lock(tp); - err = tg3_halt_cpu(tp, cpu_base); - if (!lock_err) - tg3_nvram_unlock(tp); - if (err) - goto out; - - for (i = 0; i < cpu_scratch_size; i += sizeof(u32)) - write_op(tp, cpu_scratch_base + i, 0); - tw32(cpu_base + CPU_STATE, 0xffffffff); - tw32(cpu_base + CPU_MODE, - tr32(cpu_base + CPU_MODE) | CPU_MODE_HALT); - } else { - /* Subtract additional main header for fragmented firmware and - * advance to the first fragment - */ - total_len -= TG3_FW_HDR_LEN; - fw_hdr++; - } - - do { - u32 *fw_data = (u32 *)(fw_hdr + 1); - for (i = 0; i < tg3_fw_data_len(tp, fw_hdr); i++) - write_op(tp, cpu_scratch_base + - (be32_to_cpu(fw_hdr->base_addr) & 0xffff) + - (i * sizeof(u32)), - be32_to_cpu(fw_data[i])); - - total_len -= be32_to_cpu(fw_hdr->len); - - /* Advance to next fragment */ - fw_hdr = (struct tg3_firmware_hdr *) - ((void *)fw_hdr + be32_to_cpu(fw_hdr->len)); - } while (total_len > 0); - - err = 0; - -out: - return err; -} - -/* tp->lock is held. */ -static int tg3_pause_cpu_and_set_pc(struct tg3 *tp, u32 cpu_base, u32 pc) -{ - int i; - const int iters = 5; - - tw32(cpu_base + CPU_STATE, 0xffffffff); - tw32_f(cpu_base + CPU_PC, pc); - - for (i = 0; i < iters; i++) { - if (tr32(cpu_base + CPU_PC) == pc) - break; - tw32(cpu_base + CPU_STATE, 0xffffffff); - tw32(cpu_base + CPU_MODE, CPU_MODE_HALT); - tw32_f(cpu_base + CPU_PC, pc); - udelay(1000); - } - - return (i == iters) ? -EBUSY : 0; -} - -/* tp->lock is held. */ -static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp) -{ - const struct tg3_firmware_hdr *fw_hdr; - int err; - - fw_hdr = (struct tg3_firmware_hdr *)tp->fw->data; - - /* Firmware blob starts with version numbers, followed by - start address and length. We are setting complete length. - length = end_address_of_bss - start_address_of_text. - Remainder is the blob to be loaded contiguously - from start address. */ - - err = tg3_load_firmware_cpu(tp, RX_CPU_BASE, - RX_CPU_SCRATCH_BASE, RX_CPU_SCRATCH_SIZE, - fw_hdr); - if (err) - return err; - - err = tg3_load_firmware_cpu(tp, TX_CPU_BASE, - TX_CPU_SCRATCH_BASE, TX_CPU_SCRATCH_SIZE, - fw_hdr); - if (err) - return err; - - /* Now startup only the RX cpu. */ - err = tg3_pause_cpu_and_set_pc(tp, RX_CPU_BASE, - be32_to_cpu(fw_hdr->base_addr)); - if (err) { - netdev_err(tp->dev, "%s fails to set RX CPU PC, is %08x " - "should be %08x\n", __func__, - tr32(RX_CPU_BASE + CPU_PC), - be32_to_cpu(fw_hdr->base_addr)); - return -ENODEV; - } - - tg3_rxcpu_resume(tp); - - return 0; -} - -static int tg3_validate_rxcpu_state(struct tg3 *tp) -{ - const int iters = 1000; - int i; - u32 val; - - /* Wait for boot code to complete initialization and enter service - * loop. It is then safe to download service patches - */ - for (i = 0; i < iters; i++) { - if (tr32(RX_CPU_HWBKPT) == TG3_SBROM_IN_SERVICE_LOOP) - break; - - udelay(10); - } - - if (i == iters) { - netdev_err(tp->dev, "Boot code not ready for service patches\n"); - return -EBUSY; - } - - val = tg3_read_indirect_reg32(tp, TG3_57766_FW_HANDSHAKE); - if (val & 0xff) { - netdev_warn(tp->dev, - "Other patches exist. Not downloading EEE patch\n"); - return -EEXIST; - } - - return 0; -} - -/* tp->lock is held. */ -static void tg3_load_57766_firmware(struct tg3 *tp) -{ - struct tg3_firmware_hdr *fw_hdr; - - if (!tg3_flag(tp, NO_NVRAM)) - return; - - if (tg3_validate_rxcpu_state(tp)) - return; - - if (!tp->fw) - return; - - /* This firmware blob has a different format than older firmware - * releases as given below. The main difference is we have fragmented - * data to be written to non-contiguous locations. - * - * In the beginning we have a firmware header identical to other - * firmware which consists of version, base addr and length. The length - * here is unused and set to 0xffffffff. - * - * This is followed by a series of firmware fragments which are - * individually identical to previous firmware. i.e. they have the - * firmware header and followed by data for that fragment. The version - * field of the individual fragment header is unused. - */ - - fw_hdr = (struct tg3_firmware_hdr *)tp->fw->data; - if (be32_to_cpu(fw_hdr->base_addr) != TG3_57766_FW_BASE_ADDR) - return; - - if (tg3_rxcpu_pause(tp)) - return; - - /* tg3_load_firmware_cpu() will always succeed for the 57766 */ - tg3_load_firmware_cpu(tp, 0, TG3_57766_FW_BASE_ADDR, 0, fw_hdr); - - tg3_rxcpu_resume(tp); -} - -/* tp->lock is held. */ -static int tg3_load_tso_firmware(struct tg3 *tp) -{ - const struct tg3_firmware_hdr *fw_hdr; - unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size; - int err; - - if (!tg3_flag(tp, FW_TSO)) - return 0; - - fw_hdr = (struct tg3_firmware_hdr *)tp->fw->data; - - /* Firmware blob starts with version numbers, followed by - start address and length. We are setting complete length. - length = end_address_of_bss - start_address_of_text. - Remainder is the blob to be loaded contiguously - from start address. */ - - cpu_scratch_size = tp->fw_len; - - if (tg3_asic_rev(tp) == ASIC_REV_5705) { - cpu_base = RX_CPU_BASE; - cpu_scratch_base = NIC_SRAM_MBUF_POOL_BASE5705; - } else { - cpu_base = TX_CPU_BASE; - cpu_scratch_base = TX_CPU_SCRATCH_BASE; - cpu_scratch_size = TX_CPU_SCRATCH_SIZE; - } - - err = tg3_load_firmware_cpu(tp, cpu_base, - cpu_scratch_base, cpu_scratch_size, - fw_hdr); - if (err) - return err; - - /* Now startup the cpu. */ - err = tg3_pause_cpu_and_set_pc(tp, cpu_base, - be32_to_cpu(fw_hdr->base_addr)); - if (err) { - netdev_err(tp->dev, - "%s fails to set CPU PC, is %08x should be %08x\n", - __func__, tr32(cpu_base + CPU_PC), - be32_to_cpu(fw_hdr->base_addr)); - return -ENODEV; - } - - tg3_resume_cpu(tp, cpu_base); - return 0; -} - -/* tp->lock is held. */ -static void __tg3_set_one_mac_addr(struct tg3 *tp, u8 *mac_addr, int index) -{ - u32 addr_high, addr_low; - - addr_high = ((mac_addr[0] << 8) | mac_addr[1]); - addr_low = ((mac_addr[2] << 24) | (mac_addr[3] << 16) | - (mac_addr[4] << 8) | mac_addr[5]); - - if (index < 4) { - tw32(MAC_ADDR_0_HIGH + (index * 8), addr_high); - tw32(MAC_ADDR_0_LOW + (index * 8), addr_low); - } else { - index -= 4; - tw32(MAC_EXTADDR_0_HIGH + (index * 8), addr_high); - tw32(MAC_EXTADDR_0_LOW + (index * 8), addr_low); - } -} - -/* tp->lock is held. */ -static void __tg3_set_mac_addr(struct tg3 *tp, bool skip_mac_1) -{ - u32 addr_high; - int i; - - for (i = 0; i < 4; i++) { - if (i == 1 && skip_mac_1) - continue; - __tg3_set_one_mac_addr(tp, tp->dev->dev_addr, i); - } - - if (tg3_asic_rev(tp) == ASIC_REV_5703 || - tg3_asic_rev(tp) == ASIC_REV_5704) { - for (i = 4; i < 16; i++) - __tg3_set_one_mac_addr(tp, tp->dev->dev_addr, i); - } - - addr_high = (tp->dev->dev_addr[0] + - tp->dev->dev_addr[1] + - tp->dev->dev_addr[2] + - tp->dev->dev_addr[3] + - tp->dev->dev_addr[4] + - tp->dev->dev_addr[5]) & - TX_BACKOFF_SEED_MASK; - tw32(MAC_TX_BACKOFF_SEED, addr_high); -} - -static void tg3_enable_register_access(struct tg3 *tp) -{ - /* - * Make sure register accesses (indirect or otherwise) will function - * correctly. - */ - pci_write_config_dword(tp->pdev, - TG3PCI_MISC_HOST_CTRL, tp->misc_host_ctrl); -} - -static int tg3_power_up(struct tg3 *tp) -{ - int err; - - tg3_enable_register_access(tp); - - err = pci_set_power_state(tp->pdev, PCI_D0); - if (!err) { - /* Switch out of Vaux if it is a NIC */ - tg3_pwrsrc_switch_to_vmain(tp); - } else { - netdev_err(tp->dev, "Transition to D0 failed\n"); - } - - return err; -} - -static int tg3_setup_phy(struct tg3 *, bool); - -static int tg3_power_down_prepare(struct tg3 *tp) -{ - u32 misc_host_ctrl; - bool device_should_wake, do_low_power; - - tg3_enable_register_access(tp); - - /* Restore the CLKREQ setting. */ - if (tg3_flag(tp, CLKREQ_BUG)) - pcie_capability_set_word(tp->pdev, PCI_EXP_LNKCTL, - PCI_EXP_LNKCTL_CLKREQ_EN); - - misc_host_ctrl = tr32(TG3PCI_MISC_HOST_CTRL); - tw32(TG3PCI_MISC_HOST_CTRL, - misc_host_ctrl | MISC_HOST_CTRL_MASK_PCI_INT); - - device_should_wake = device_may_wakeup(&tp->pdev->dev) && - tg3_flag(tp, WOL_ENABLE); - - if (tg3_flag(tp, USE_PHYLIB)) { - do_low_power = false; - if ((tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) && - !(tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)) { - struct phy_device *phydev; - u32 phyid, advertising; - - phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); - - tp->phy_flags |= TG3_PHYFLG_IS_LOW_POWER; - - tp->link_config.speed = phydev->speed; - tp->link_config.duplex = phydev->duplex; - tp->link_config.autoneg = phydev->autoneg; - tp->link_config.advertising = phydev->advertising; - - advertising = ADVERTISED_TP | - ADVERTISED_Pause | - ADVERTISED_Autoneg | - ADVERTISED_10baseT_Half; - - if (tg3_flag(tp, ENABLE_ASF) || device_should_wake) { - if (tg3_flag(tp, WOL_SPEED_100MB)) - advertising |= - ADVERTISED_100baseT_Half | - ADVERTISED_100baseT_Full | - ADVERTISED_10baseT_Full; - else - advertising |= ADVERTISED_10baseT_Full; - } - - phydev->advertising = advertising; - - phy_start_aneg(phydev); - - phyid = phydev->drv->phy_id & phydev->drv->phy_id_mask; - if (phyid != PHY_ID_BCMAC131) { - phyid &= PHY_BCM_OUI_MASK; - if (phyid == PHY_BCM_OUI_1 || - phyid == PHY_BCM_OUI_2 || - phyid == PHY_BCM_OUI_3) - do_low_power = true; - } - } - } else { - do_low_power = true; - - if (!(tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)) - tp->phy_flags |= TG3_PHYFLG_IS_LOW_POWER; - - if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) - tg3_setup_phy(tp, false); - } - - if (tg3_asic_rev(tp) == ASIC_REV_5906) { - u32 val; - - val = tr32(GRC_VCPU_EXT_CTRL); - tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_DISABLE_WOL); - } else if (!tg3_flag(tp, ENABLE_ASF)) { - int i; - u32 val; - - for (i = 0; i < 200; i++) { - tg3_read_mem(tp, NIC_SRAM_FW_ASF_STATUS_MBOX, &val); - if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1) - break; - msleep(1); - } - } - if (tg3_flag(tp, WOL_CAP)) - tg3_write_mem(tp, NIC_SRAM_WOL_MBOX, WOL_SIGNATURE | - WOL_DRV_STATE_SHUTDOWN | - WOL_DRV_WOL | - WOL_SET_MAGIC_PKT); - - if (device_should_wake) { - u32 mac_mode; - - if (!(tp->phy_flags & TG3_PHYFLG_PHY_SERDES)) { - if (do_low_power && - !(tp->phy_flags & TG3_PHYFLG_IS_FET)) { - tg3_phy_auxctl_write(tp, - MII_TG3_AUXCTL_SHDWSEL_PWRCTL, - MII_TG3_AUXCTL_PCTL_WOL_EN | - MII_TG3_AUXCTL_PCTL_100TX_LPWR | - MII_TG3_AUXCTL_PCTL_CL_AB_TXDAC); - udelay(40); - } - - if (tp->phy_flags & TG3_PHYFLG_MII_SERDES) - mac_mode = MAC_MODE_PORT_MODE_GMII; - else if (tp->phy_flags & - TG3_PHYFLG_KEEP_LINK_ON_PWRDN) { - if (tp->link_config.active_speed == SPEED_1000) - mac_mode = MAC_MODE_PORT_MODE_GMII; - else - mac_mode = MAC_MODE_PORT_MODE_MII; - } else - mac_mode = MAC_MODE_PORT_MODE_MII; - - mac_mode |= tp->mac_mode & MAC_MODE_LINK_POLARITY; - if (tg3_asic_rev(tp) == ASIC_REV_5700) { - u32 speed = tg3_flag(tp, WOL_SPEED_100MB) ? - SPEED_100 : SPEED_10; - if (tg3_5700_link_polarity(tp, speed)) - mac_mode |= MAC_MODE_LINK_POLARITY; - else - mac_mode &= ~MAC_MODE_LINK_POLARITY; - } - } else { - mac_mode = MAC_MODE_PORT_MODE_TBI; - } - - if (!tg3_flag(tp, 5750_PLUS)) - tw32(MAC_LED_CTRL, tp->led_ctrl); - - mac_mode |= MAC_MODE_MAGIC_PKT_ENABLE; - if ((tg3_flag(tp, 5705_PLUS) && !tg3_flag(tp, 5780_CLASS)) && - (tg3_flag(tp, ENABLE_ASF) || tg3_flag(tp, ENABLE_APE))) - mac_mode |= MAC_MODE_KEEP_FRAME_IN_WOL; - - if (tg3_flag(tp, ENABLE_APE)) - mac_mode |= MAC_MODE_APE_TX_EN | - MAC_MODE_APE_RX_EN | - MAC_MODE_TDE_ENABLE; - - tw32_f(MAC_MODE, mac_mode); - udelay(100); - - tw32_f(MAC_RX_MODE, RX_MODE_ENABLE); - udelay(10); - } - - if (!tg3_flag(tp, WOL_SPEED_100MB) && - (tg3_asic_rev(tp) == ASIC_REV_5700 || - tg3_asic_rev(tp) == ASIC_REV_5701)) { - u32 base_val; - - base_val = tp->pci_clock_ctrl; - base_val |= (CLOCK_CTRL_RXCLK_DISABLE | - CLOCK_CTRL_TXCLK_DISABLE); - - tw32_wait_f(TG3PCI_CLOCK_CTRL, base_val | CLOCK_CTRL_ALTCLK | - CLOCK_CTRL_PWRDOWN_PLL133, 40); - } else if (tg3_flag(tp, 5780_CLASS) || - tg3_flag(tp, CPMU_PRESENT) || - tg3_asic_rev(tp) == ASIC_REV_5906) { - /* do nothing */ - } else if (!(tg3_flag(tp, 5750_PLUS) && tg3_flag(tp, ENABLE_ASF))) { - u32 newbits1, newbits2; - - if (tg3_asic_rev(tp) == ASIC_REV_5700 || - tg3_asic_rev(tp) == ASIC_REV_5701) { - newbits1 = (CLOCK_CTRL_RXCLK_DISABLE | - CLOCK_CTRL_TXCLK_DISABLE | - CLOCK_CTRL_ALTCLK); - newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE; - } else if (tg3_flag(tp, 5705_PLUS)) { - newbits1 = CLOCK_CTRL_625_CORE; - newbits2 = newbits1 | CLOCK_CTRL_ALTCLK; - } else { - newbits1 = CLOCK_CTRL_ALTCLK; - newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE; - } - - tw32_wait_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits1, - 40); - - tw32_wait_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits2, - 40); - - if (!tg3_flag(tp, 5705_PLUS)) { - u32 newbits3; - - if (tg3_asic_rev(tp) == ASIC_REV_5700 || - tg3_asic_rev(tp) == ASIC_REV_5701) { - newbits3 = (CLOCK_CTRL_RXCLK_DISABLE | - CLOCK_CTRL_TXCLK_DISABLE | - CLOCK_CTRL_44MHZ_CORE); - } else { - newbits3 = CLOCK_CTRL_44MHZ_CORE; - } - - tw32_wait_f(TG3PCI_CLOCK_CTRL, - tp->pci_clock_ctrl | newbits3, 40); - } - } - - if (!(device_should_wake) && !tg3_flag(tp, ENABLE_ASF)) - tg3_power_down_phy(tp, do_low_power); - - tg3_frob_aux_power(tp, true); - - /* Workaround for unstable PLL clock */ - if ((!tg3_flag(tp, IS_SSB_CORE)) && - ((tg3_chip_rev(tp) == CHIPREV_5750_AX) || - (tg3_chip_rev(tp) == CHIPREV_5750_BX))) { - u32 val = tr32(0x7d00); - - val &= ~((1 << 16) | (1 << 4) | (1 << 2) | (1 << 1) | 1); - tw32(0x7d00, val); - if (!tg3_flag(tp, ENABLE_ASF)) { - int err; - - err = tg3_nvram_lock(tp); - tg3_halt_cpu(tp, RX_CPU_BASE); - if (!err) - tg3_nvram_unlock(tp); - } - } - - tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN); - - tg3_ape_driver_state_change(tp, RESET_KIND_SHUTDOWN); - - return 0; -} - -static void tg3_power_down(struct tg3 *tp) -{ - pci_wake_from_d3(tp->pdev, tg3_flag(tp, WOL_ENABLE)); - pci_set_power_state(tp->pdev, PCI_D3hot); -} - -static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u16 *speed, u8 *duplex) -{ - switch (val & MII_TG3_AUX_STAT_SPDMASK) { - case MII_TG3_AUX_STAT_10HALF: - *speed = SPEED_10; - *duplex = DUPLEX_HALF; - break; - - case MII_TG3_AUX_STAT_10FULL: - *speed = SPEED_10; - *duplex = DUPLEX_FULL; - break; - - case MII_TG3_AUX_STAT_100HALF: - *speed = SPEED_100; - *duplex = DUPLEX_HALF; - break; - - case MII_TG3_AUX_STAT_100FULL: - *speed = SPEED_100; - *duplex = DUPLEX_FULL; - break; - - case MII_TG3_AUX_STAT_1000HALF: - *speed = SPEED_1000; - *duplex = DUPLEX_HALF; - break; - - case MII_TG3_AUX_STAT_1000FULL: - *speed = SPEED_1000; - *duplex = DUPLEX_FULL; - break; - - default: - if (tp->phy_flags & TG3_PHYFLG_IS_FET) { - *speed = (val & MII_TG3_AUX_STAT_100) ? SPEED_100 : - SPEED_10; - *duplex = (val & MII_TG3_AUX_STAT_FULL) ? DUPLEX_FULL : - DUPLEX_HALF; - break; - } - *speed = SPEED_UNKNOWN; - *duplex = DUPLEX_UNKNOWN; - break; - } -} - -static int tg3_phy_autoneg_cfg(struct tg3 *tp, u32 advertise, u32 flowctrl) -{ - int err = 0; - u32 val, new_adv; - - new_adv = ADVERTISE_CSMA; - new_adv |= ethtool_adv_to_mii_adv_t(advertise) & ADVERTISE_ALL; - new_adv |= mii_advertise_flowctrl(flowctrl); - - err = tg3_writephy(tp, MII_ADVERTISE, new_adv); - if (err) - goto done; - - if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) { - new_adv = ethtool_adv_to_mii_ctrl1000_t(advertise); - - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0 || - tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B0) - new_adv |= CTL1000_AS_MASTER | CTL1000_ENABLE_MASTER; - - err = tg3_writephy(tp, MII_CTRL1000, new_adv); - if (err) - goto done; - } - - if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP)) - goto done; - - tw32(TG3_CPMU_EEE_MODE, - tr32(TG3_CPMU_EEE_MODE) & ~TG3_CPMU_EEEMD_LPI_ENABLE); - - err = tg3_phy_toggle_auxctl_smdsp(tp, true); - if (!err) { - u32 err2; - - val = 0; - /* Advertise 100-BaseTX EEE ability */ - if (advertise & ADVERTISED_100baseT_Full) - val |= MDIO_AN_EEE_ADV_100TX; - /* Advertise 1000-BaseT EEE ability */ - if (advertise & ADVERTISED_1000baseT_Full) - val |= MDIO_AN_EEE_ADV_1000T; - - if (!tp->eee.eee_enabled) { - val = 0; - tp->eee.advertised = 0; - } else { - tp->eee.advertised = advertise & - (ADVERTISED_100baseT_Full | - ADVERTISED_1000baseT_Full); - } - - err = tg3_phy_cl45_write(tp, MDIO_MMD_AN, MDIO_AN_EEE_ADV, val); - if (err) - val = 0; - - switch (tg3_asic_rev(tp)) { - case ASIC_REV_5717: - case ASIC_REV_57765: - case ASIC_REV_57766: - case ASIC_REV_5719: - /* If we advertised any eee advertisements above... */ - if (val) - val = MII_TG3_DSP_TAP26_ALNOKO | - MII_TG3_DSP_TAP26_RMRXSTO | - MII_TG3_DSP_TAP26_OPCSINPT; - tg3_phydsp_write(tp, MII_TG3_DSP_TAP26, val); - /* Fall through */ - case ASIC_REV_5720: - case ASIC_REV_5762: - if (!tg3_phydsp_read(tp, MII_TG3_DSP_CH34TP2, &val)) - tg3_phydsp_write(tp, MII_TG3_DSP_CH34TP2, val | - MII_TG3_DSP_CH34TP2_HIBW01); - } - - err2 = tg3_phy_toggle_auxctl_smdsp(tp, false); - if (!err) - err = err2; - } - -done: - return err; -} - -static void tg3_phy_copper_begin(struct tg3 *tp) -{ - if (tp->link_config.autoneg == AUTONEG_ENABLE || - (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)) { - u32 adv, fc; - - if ((tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) && - !(tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN)) { - adv = ADVERTISED_10baseT_Half | - ADVERTISED_10baseT_Full; - if (tg3_flag(tp, WOL_SPEED_100MB)) - adv |= ADVERTISED_100baseT_Half | - ADVERTISED_100baseT_Full; - if (tp->phy_flags & TG3_PHYFLG_1G_ON_VAUX_OK) { - if (!(tp->phy_flags & - TG3_PHYFLG_DISABLE_1G_HD_ADV)) - adv |= ADVERTISED_1000baseT_Half; - adv |= ADVERTISED_1000baseT_Full; - } - - fc = FLOW_CTRL_TX | FLOW_CTRL_RX; - } else { - adv = tp->link_config.advertising; - if (tp->phy_flags & TG3_PHYFLG_10_100_ONLY) - adv &= ~(ADVERTISED_1000baseT_Half | - ADVERTISED_1000baseT_Full); - - fc = tp->link_config.flowctrl; - } - - tg3_phy_autoneg_cfg(tp, adv, fc); - - if ((tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) && - (tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN)) { - /* Normally during power down we want to autonegotiate - * the lowest possible speed for WOL. However, to avoid - * link flap, we leave it untouched. - */ - return; - } - - tg3_writephy(tp, MII_BMCR, - BMCR_ANENABLE | BMCR_ANRESTART); - } else { - int i; - u32 bmcr, orig_bmcr; - - tp->link_config.active_speed = tp->link_config.speed; - tp->link_config.active_duplex = tp->link_config.duplex; - - if (tg3_asic_rev(tp) == ASIC_REV_5714) { - /* With autoneg disabled, 5715 only links up when the - * advertisement register has the configured speed - * enabled. - */ - tg3_writephy(tp, MII_ADVERTISE, ADVERTISE_ALL); - } - - bmcr = 0; - switch (tp->link_config.speed) { - default: - case SPEED_10: - break; - - case SPEED_100: - bmcr |= BMCR_SPEED100; - break; - - case SPEED_1000: - bmcr |= BMCR_SPEED1000; - break; - } - - if (tp->link_config.duplex == DUPLEX_FULL) - bmcr |= BMCR_FULLDPLX; - - if (!tg3_readphy(tp, MII_BMCR, &orig_bmcr) && - (bmcr != orig_bmcr)) { - tg3_writephy(tp, MII_BMCR, BMCR_LOOPBACK); - for (i = 0; i < 1500; i++) { - u32 tmp; - - udelay(10); - if (tg3_readphy(tp, MII_BMSR, &tmp) || - tg3_readphy(tp, MII_BMSR, &tmp)) - continue; - if (!(tmp & BMSR_LSTATUS)) { - udelay(40); - break; - } - } - tg3_writephy(tp, MII_BMCR, bmcr); - udelay(40); - } - } -} - -static int tg3_phy_pull_config(struct tg3 *tp) -{ - int err; - u32 val; - - err = tg3_readphy(tp, MII_BMCR, &val); - if (err) - goto done; - - if (!(val & BMCR_ANENABLE)) { - tp->link_config.autoneg = AUTONEG_DISABLE; - tp->link_config.advertising = 0; - tg3_flag_clear(tp, PAUSE_AUTONEG); - - err = -EIO; - - switch (val & (BMCR_SPEED1000 | BMCR_SPEED100)) { - case 0: - if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES) - goto done; - - tp->link_config.speed = SPEED_10; - break; - case BMCR_SPEED100: - if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES) - goto done; - - tp->link_config.speed = SPEED_100; - break; - case BMCR_SPEED1000: - if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) { - tp->link_config.speed = SPEED_1000; - break; - } - /* Fall through */ - default: - goto done; - } - - if (val & BMCR_FULLDPLX) - tp->link_config.duplex = DUPLEX_FULL; - else - tp->link_config.duplex = DUPLEX_HALF; - - tp->link_config.flowctrl = FLOW_CTRL_RX | FLOW_CTRL_TX; - - err = 0; - goto done; - } - - tp->link_config.autoneg = AUTONEG_ENABLE; - tp->link_config.advertising = ADVERTISED_Autoneg; - tg3_flag_set(tp, PAUSE_AUTONEG); - - if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) { - u32 adv; - - err = tg3_readphy(tp, MII_ADVERTISE, &val); - if (err) - goto done; - - adv = mii_adv_to_ethtool_adv_t(val & ADVERTISE_ALL); - tp->link_config.advertising |= adv | ADVERTISED_TP; - - tp->link_config.flowctrl = tg3_decode_flowctrl_1000T(val); - } else { - tp->link_config.advertising |= ADVERTISED_FIBRE; - } - - if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) { - u32 adv; - - if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) { - err = tg3_readphy(tp, MII_CTRL1000, &val); - if (err) - goto done; - - adv = mii_ctrl1000_to_ethtool_adv_t(val); - } else { - err = tg3_readphy(tp, MII_ADVERTISE, &val); - if (err) - goto done; - - adv = tg3_decode_flowctrl_1000X(val); - tp->link_config.flowctrl = adv; - - val &= (ADVERTISE_1000XHALF | ADVERTISE_1000XFULL); - adv = mii_adv_to_ethtool_adv_x(val); - } - - tp->link_config.advertising |= adv; - } - -done: - return err; -} - -static int tg3_init_5401phy_dsp(struct tg3 *tp) -{ - int err; - - /* Turn off tap power management. */ - /* Set Extended packet length bit */ - err = tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, 0x4c20); - - err |= tg3_phydsp_write(tp, 0x0012, 0x1804); - err |= tg3_phydsp_write(tp, 0x0013, 0x1204); - err |= tg3_phydsp_write(tp, 0x8006, 0x0132); - err |= tg3_phydsp_write(tp, 0x8006, 0x0232); - err |= tg3_phydsp_write(tp, 0x201f, 0x0a20); - - udelay(40); - - return err; -} - -static bool tg3_phy_eee_config_ok(struct tg3 *tp) -{ - struct ethtool_eee eee; - - if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP)) - return true; - - tg3_eee_pull_config(tp, &eee); - - if (tp->eee.eee_enabled) { - if (tp->eee.advertised != eee.advertised || - tp->eee.tx_lpi_timer != eee.tx_lpi_timer || - tp->eee.tx_lpi_enabled != eee.tx_lpi_enabled) - return false; - } else { - /* EEE is disabled but we're advertising */ - if (eee.advertised) - return false; - } - - return true; -} - -static bool tg3_phy_copper_an_config_ok(struct tg3 *tp, u32 *lcladv) -{ - u32 advmsk, tgtadv, advertising; - - advertising = tp->link_config.advertising; - tgtadv = ethtool_adv_to_mii_adv_t(advertising) & ADVERTISE_ALL; - - advmsk = ADVERTISE_ALL; - if (tp->link_config.active_duplex == DUPLEX_FULL) { - tgtadv |= mii_advertise_flowctrl(tp->link_config.flowctrl); - advmsk |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM; - } - - if (tg3_readphy(tp, MII_ADVERTISE, lcladv)) - return false; - - if ((*lcladv & advmsk) != tgtadv) - return false; - - if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) { - u32 tg3_ctrl; - - tgtadv = ethtool_adv_to_mii_ctrl1000_t(advertising); - - if (tg3_readphy(tp, MII_CTRL1000, &tg3_ctrl)) - return false; - - if (tgtadv && - (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0 || - tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B0)) { - tgtadv |= CTL1000_AS_MASTER | CTL1000_ENABLE_MASTER; - tg3_ctrl &= (ADVERTISE_1000HALF | ADVERTISE_1000FULL | - CTL1000_AS_MASTER | CTL1000_ENABLE_MASTER); - } else { - tg3_ctrl &= (ADVERTISE_1000HALF | ADVERTISE_1000FULL); - } - - if (tg3_ctrl != tgtadv) - return false; - } - - return true; -} - -static bool tg3_phy_copper_fetch_rmtadv(struct tg3 *tp, u32 *rmtadv) -{ - u32 lpeth = 0; - - if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) { - u32 val; - - if (tg3_readphy(tp, MII_STAT1000, &val)) - return false; - - lpeth = mii_stat1000_to_ethtool_lpa_t(val); - } - - if (tg3_readphy(tp, MII_LPA, rmtadv)) - return false; - - lpeth |= mii_lpa_to_ethtool_lpa_t(*rmtadv); - tp->link_config.rmt_adv = lpeth; - - return true; -} - -static bool tg3_test_and_report_link_chg(struct tg3 *tp, bool curr_link_up) -{ - if (curr_link_up != tp->link_up) { - if (curr_link_up) { - netif_carrier_on(tp->dev); - } else { - netif_carrier_off(tp->dev); - if (tp->phy_flags & TG3_PHYFLG_MII_SERDES) - tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT; - } - - tg3_link_report(tp); - return true; - } - - return false; -} - -static void tg3_clear_mac_status(struct tg3 *tp) -{ - tw32(MAC_EVENT, 0); - - tw32_f(MAC_STATUS, - MAC_STATUS_SYNC_CHANGED | - MAC_STATUS_CFG_CHANGED | - MAC_STATUS_MI_COMPLETION | - MAC_STATUS_LNKSTATE_CHANGED); - udelay(40); -} - -static void tg3_setup_eee(struct tg3 *tp) -{ - u32 val; - - val = TG3_CPMU_EEE_LNKIDL_PCIE_NL0 | - TG3_CPMU_EEE_LNKIDL_UART_IDL; - if (tg3_chip_rev_id(tp) == CHIPREV_ID_57765_A0) - val |= TG3_CPMU_EEE_LNKIDL_APE_TX_MT; - - tw32_f(TG3_CPMU_EEE_LNKIDL_CTRL, val); - - tw32_f(TG3_CPMU_EEE_CTRL, - TG3_CPMU_EEE_CTRL_EXIT_20_1_US); - - val = TG3_CPMU_EEEMD_ERLY_L1_XIT_DET | - (tp->eee.tx_lpi_enabled ? TG3_CPMU_EEEMD_LPI_IN_TX : 0) | - TG3_CPMU_EEEMD_LPI_IN_RX | - TG3_CPMU_EEEMD_EEE_ENABLE; - - if (tg3_asic_rev(tp) != ASIC_REV_5717) - val |= TG3_CPMU_EEEMD_SND_IDX_DET_EN; - - if (tg3_flag(tp, ENABLE_APE)) - val |= TG3_CPMU_EEEMD_APE_TX_DET_EN; - - tw32_f(TG3_CPMU_EEE_MODE, tp->eee.eee_enabled ? val : 0); - - tw32_f(TG3_CPMU_EEE_DBTMR1, - TG3_CPMU_DBTMR1_PCIEXIT_2047US | - (tp->eee.tx_lpi_timer & 0xffff)); - - tw32_f(TG3_CPMU_EEE_DBTMR2, - TG3_CPMU_DBTMR2_APE_TX_2047US | - TG3_CPMU_DBTMR2_TXIDXEQ_2047US); -} - -static int tg3_setup_copper_phy(struct tg3 *tp, bool force_reset) -{ - bool current_link_up; - u32 bmsr, val; - u32 lcl_adv, rmt_adv; - u16 current_speed; - u8 current_duplex; - int i, err; - - tg3_clear_mac_status(tp); - - if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) { - tw32_f(MAC_MI_MODE, - (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL)); - udelay(80); - } - - tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_PWRCTL, 0); - - /* Some third-party PHYs need to be reset on link going - * down. - */ - if ((tg3_asic_rev(tp) == ASIC_REV_5703 || - tg3_asic_rev(tp) == ASIC_REV_5704 || - tg3_asic_rev(tp) == ASIC_REV_5705) && - tp->link_up) { - tg3_readphy(tp, MII_BMSR, &bmsr); - if (!tg3_readphy(tp, MII_BMSR, &bmsr) && - !(bmsr & BMSR_LSTATUS)) - force_reset = true; - } - if (force_reset) - tg3_phy_reset(tp); - - if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) { - tg3_readphy(tp, MII_BMSR, &bmsr); - if (tg3_readphy(tp, MII_BMSR, &bmsr) || - !tg3_flag(tp, INIT_COMPLETE)) - bmsr = 0; - - if (!(bmsr & BMSR_LSTATUS)) { - err = tg3_init_5401phy_dsp(tp); - if (err) - return err; - - tg3_readphy(tp, MII_BMSR, &bmsr); - for (i = 0; i < 1000; i++) { - udelay(10); - if (!tg3_readphy(tp, MII_BMSR, &bmsr) && - (bmsr & BMSR_LSTATUS)) { - udelay(40); - break; - } - } - - if ((tp->phy_id & TG3_PHY_ID_REV_MASK) == - TG3_PHY_REV_BCM5401_B0 && - !(bmsr & BMSR_LSTATUS) && - tp->link_config.active_speed == SPEED_1000) { - err = tg3_phy_reset(tp); - if (!err) - err = tg3_init_5401phy_dsp(tp); - if (err) - return err; - } - } - } else if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0 || - tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B0) { - /* 5701 {A0,B0} CRC bug workaround */ - tg3_writephy(tp, 0x15, 0x0a75); - tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8c68); - tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8d68); - tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8c68); - } - - /* Clear pending interrupts... */ - tg3_readphy(tp, MII_TG3_ISTAT, &val); - tg3_readphy(tp, MII_TG3_ISTAT, &val); - - if (tp->phy_flags & TG3_PHYFLG_USE_MI_INTERRUPT) - tg3_writephy(tp, MII_TG3_IMASK, ~MII_TG3_INT_LINKCHG); - else if (!(tp->phy_flags & TG3_PHYFLG_IS_FET)) - tg3_writephy(tp, MII_TG3_IMASK, ~0); - - if (tg3_asic_rev(tp) == ASIC_REV_5700 || - tg3_asic_rev(tp) == ASIC_REV_5701) { - if (tp->led_ctrl == LED_CTRL_MODE_PHY_1) - tg3_writephy(tp, MII_TG3_EXT_CTRL, - MII_TG3_EXT_CTRL_LNK3_LED_MODE); - else - tg3_writephy(tp, MII_TG3_EXT_CTRL, 0); - } - - current_link_up = false; - current_speed = SPEED_UNKNOWN; - current_duplex = DUPLEX_UNKNOWN; - tp->phy_flags &= ~TG3_PHYFLG_MDIX_STATE; - tp->link_config.rmt_adv = 0; - - if (tp->phy_flags & TG3_PHYFLG_CAPACITIVE_COUPLING) { - err = tg3_phy_auxctl_read(tp, - MII_TG3_AUXCTL_SHDWSEL_MISCTEST, - &val); - if (!err && !(val & (1 << 10))) { - tg3_phy_auxctl_write(tp, - MII_TG3_AUXCTL_SHDWSEL_MISCTEST, - val | (1 << 10)); - goto relink; - } - } - - bmsr = 0; - for (i = 0; i < 100; i++) { - tg3_readphy(tp, MII_BMSR, &bmsr); - if (!tg3_readphy(tp, MII_BMSR, &bmsr) && - (bmsr & BMSR_LSTATUS)) - break; - udelay(40); - } - - if (bmsr & BMSR_LSTATUS) { - u32 aux_stat, bmcr; - - tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat); - for (i = 0; i < 2000; i++) { - udelay(10); - if (!tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat) && - aux_stat) - break; - } - - tg3_aux_stat_to_speed_duplex(tp, aux_stat, - ¤t_speed, - ¤t_duplex); - - bmcr = 0; - for (i = 0; i < 200; i++) { - tg3_readphy(tp, MII_BMCR, &bmcr); - if (tg3_readphy(tp, MII_BMCR, &bmcr)) - continue; - if (bmcr && bmcr != 0x7fff) - break; - udelay(10); - } - - lcl_adv = 0; - rmt_adv = 0; - - tp->link_config.active_speed = current_speed; - tp->link_config.active_duplex = current_duplex; - - if (tp->link_config.autoneg == AUTONEG_ENABLE) { - bool eee_config_ok = tg3_phy_eee_config_ok(tp); - - if ((bmcr & BMCR_ANENABLE) && - eee_config_ok && - tg3_phy_copper_an_config_ok(tp, &lcl_adv) && - tg3_phy_copper_fetch_rmtadv(tp, &rmt_adv)) - current_link_up = true; - - /* EEE settings changes take effect only after a phy - * reset. If we have skipped a reset due to Link Flap - * Avoidance being enabled, do it now. - */ - if (!eee_config_ok && - (tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN) && - !force_reset) { - tg3_setup_eee(tp); - tg3_phy_reset(tp); - } - } else { - if (!(bmcr & BMCR_ANENABLE) && - tp->link_config.speed == current_speed && - tp->link_config.duplex == current_duplex) { - current_link_up = true; - } - } - - if (current_link_up && - tp->link_config.active_duplex == DUPLEX_FULL) { - u32 reg, bit; - - if (tp->phy_flags & TG3_PHYFLG_IS_FET) { - reg = MII_TG3_FET_GEN_STAT; - bit = MII_TG3_FET_GEN_STAT_MDIXSTAT; - } else { - reg = MII_TG3_EXT_STAT; - bit = MII_TG3_EXT_STAT_MDIX; - } - - if (!tg3_readphy(tp, reg, &val) && (val & bit)) - tp->phy_flags |= TG3_PHYFLG_MDIX_STATE; - - tg3_setup_flow_control(tp, lcl_adv, rmt_adv); - } - } - -relink: - if (!current_link_up || (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)) { - tg3_phy_copper_begin(tp); - - if (tg3_flag(tp, ROBOSWITCH)) { - current_link_up = true; - /* FIXME: when BCM5325 switch is used use 100 MBit/s */ - current_speed = SPEED_1000; - current_duplex = DUPLEX_FULL; - tp->link_config.active_speed = current_speed; - tp->link_config.active_duplex = current_duplex; - } - - tg3_readphy(tp, MII_BMSR, &bmsr); - if ((!tg3_readphy(tp, MII_BMSR, &bmsr) && (bmsr & BMSR_LSTATUS)) || - (tp->mac_mode & MAC_MODE_PORT_INT_LPBACK)) - current_link_up = true; - } - - tp->mac_mode &= ~MAC_MODE_PORT_MODE_MASK; - if (current_link_up) { - if (tp->link_config.active_speed == SPEED_100 || - tp->link_config.active_speed == SPEED_10) - tp->mac_mode |= MAC_MODE_PORT_MODE_MII; - else - tp->mac_mode |= MAC_MODE_PORT_MODE_GMII; - } else if (tp->phy_flags & TG3_PHYFLG_IS_FET) - tp->mac_mode |= MAC_MODE_PORT_MODE_MII; - else - tp->mac_mode |= MAC_MODE_PORT_MODE_GMII; - - /* In order for the 5750 core in BCM4785 chip to work properly - * in RGMII mode, the Led Control Register must be set up. - */ - if (tg3_flag(tp, RGMII_MODE)) { - u32 led_ctrl = tr32(MAC_LED_CTRL); - led_ctrl &= ~(LED_CTRL_1000MBPS_ON | LED_CTRL_100MBPS_ON); - - if (tp->link_config.active_speed == SPEED_10) - led_ctrl |= LED_CTRL_LNKLED_OVERRIDE; - else if (tp->link_config.active_speed == SPEED_100) - led_ctrl |= (LED_CTRL_LNKLED_OVERRIDE | - LED_CTRL_100MBPS_ON); - else if (tp->link_config.active_speed == SPEED_1000) - led_ctrl |= (LED_CTRL_LNKLED_OVERRIDE | - LED_CTRL_1000MBPS_ON); - - tw32(MAC_LED_CTRL, led_ctrl); - udelay(40); - } - - tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX; - if (tp->link_config.active_duplex == DUPLEX_HALF) - tp->mac_mode |= MAC_MODE_HALF_DUPLEX; - - if (tg3_asic_rev(tp) == ASIC_REV_5700) { - if (current_link_up && - tg3_5700_link_polarity(tp, tp->link_config.active_speed)) - tp->mac_mode |= MAC_MODE_LINK_POLARITY; - else - tp->mac_mode &= ~MAC_MODE_LINK_POLARITY; - } - - /* ??? Without this setting Netgear GA302T PHY does not - * ??? send/receive packets... - */ - if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5411 && - tg3_chip_rev_id(tp) == CHIPREV_ID_5700_ALTIMA) { - tp->mi_mode |= MAC_MI_MODE_AUTO_POLL; - tw32_f(MAC_MI_MODE, tp->mi_mode); - udelay(80); - } - - tw32_f(MAC_MODE, tp->mac_mode); - udelay(40); - - tg3_phy_eee_adjust(tp, current_link_up); - - if (tg3_flag(tp, USE_LINKCHG_REG)) { - /* Polled via timer. */ - tw32_f(MAC_EVENT, 0); - } else { - tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED); - } - udelay(40); - - if (tg3_asic_rev(tp) == ASIC_REV_5700 && - current_link_up && - tp->link_config.active_speed == SPEED_1000 && - (tg3_flag(tp, PCIX_MODE) || tg3_flag(tp, PCI_HIGH_SPEED))) { - udelay(120); - tw32_f(MAC_STATUS, - (MAC_STATUS_SYNC_CHANGED | - MAC_STATUS_CFG_CHANGED)); - udelay(40); - tg3_write_mem(tp, - NIC_SRAM_FIRMWARE_MBOX, - NIC_SRAM_FIRMWARE_MBOX_MAGIC2); - } - - /* Prevent send BD corruption. */ - if (tg3_flag(tp, CLKREQ_BUG)) { - if (tp->link_config.active_speed == SPEED_100 || - tp->link_config.active_speed == SPEED_10) - pcie_capability_clear_word(tp->pdev, PCI_EXP_LNKCTL, - PCI_EXP_LNKCTL_CLKREQ_EN); - else - pcie_capability_set_word(tp->pdev, PCI_EXP_LNKCTL, - PCI_EXP_LNKCTL_CLKREQ_EN); - } - - tg3_test_and_report_link_chg(tp, current_link_up); - - return 0; -} - -struct tg3_fiber_aneginfo { - int state; -#define ANEG_STATE_UNKNOWN 0 -#define ANEG_STATE_AN_ENABLE 1 -#define ANEG_STATE_RESTART_INIT 2 -#define ANEG_STATE_RESTART 3 -#define ANEG_STATE_DISABLE_LINK_OK 4 -#define ANEG_STATE_ABILITY_DETECT_INIT 5 -#define ANEG_STATE_ABILITY_DETECT 6 -#define ANEG_STATE_ACK_DETECT_INIT 7 -#define ANEG_STATE_ACK_DETECT 8 -#define ANEG_STATE_COMPLETE_ACK_INIT 9 -#define ANEG_STATE_COMPLETE_ACK 10 -#define ANEG_STATE_IDLE_DETECT_INIT 11 -#define ANEG_STATE_IDLE_DETECT 12 -#define ANEG_STATE_LINK_OK 13 -#define ANEG_STATE_NEXT_PAGE_WAIT_INIT 14 -#define ANEG_STATE_NEXT_PAGE_WAIT 15 - - u32 flags; -#define MR_AN_ENABLE 0x00000001 -#define MR_RESTART_AN 0x00000002 -#define MR_AN_COMPLETE 0x00000004 -#define MR_PAGE_RX 0x00000008 -#define MR_NP_LOADED 0x00000010 -#define MR_TOGGLE_TX 0x00000020 -#define MR_LP_ADV_FULL_DUPLEX 0x00000040 -#define MR_LP_ADV_HALF_DUPLEX 0x00000080 -#define MR_LP_ADV_SYM_PAUSE 0x00000100 -#define MR_LP_ADV_ASYM_PAUSE 0x00000200 -#define MR_LP_ADV_REMOTE_FAULT1 0x00000400 -#define MR_LP_ADV_REMOTE_FAULT2 0x00000800 -#define MR_LP_ADV_NEXT_PAGE 0x00001000 -#define MR_TOGGLE_RX 0x00002000 -#define MR_NP_RX 0x00004000 - -#define MR_LINK_OK 0x80000000 - - unsigned long link_time, cur_time; - - u32 ability_match_cfg; - int ability_match_count; - - char ability_match, idle_match, ack_match; - - u32 txconfig, rxconfig; -#define ANEG_CFG_NP 0x00000080 -#define ANEG_CFG_ACK 0x00000040 -#define ANEG_CFG_RF2 0x00000020 -#define ANEG_CFG_RF1 0x00000010 -#define ANEG_CFG_PS2 0x00000001 -#define ANEG_CFG_PS1 0x00008000 -#define ANEG_CFG_HD 0x00004000 -#define ANEG_CFG_FD 0x00002000 -#define ANEG_CFG_INVAL 0x00001f06 - -}; -#define ANEG_OK 0 -#define ANEG_DONE 1 -#define ANEG_TIMER_ENAB 2 -#define ANEG_FAILED -1 - -#define ANEG_STATE_SETTLE_TIME 10000 - -static int tg3_fiber_aneg_smachine(struct tg3 *tp, - struct tg3_fiber_aneginfo *ap) -{ - u16 flowctrl; - unsigned long delta; - u32 rx_cfg_reg; - int ret; - - if (ap->state == ANEG_STATE_UNKNOWN) { - ap->rxconfig = 0; - ap->link_time = 0; - ap->cur_time = 0; - ap->ability_match_cfg = 0; - ap->ability_match_count = 0; - ap->ability_match = 0; - ap->idle_match = 0; - ap->ack_match = 0; - } - ap->cur_time++; - - if (tr32(MAC_STATUS) & MAC_STATUS_RCVD_CFG) { - rx_cfg_reg = tr32(MAC_RX_AUTO_NEG); - - if (rx_cfg_reg != ap->ability_match_cfg) { - ap->ability_match_cfg = rx_cfg_reg; - ap->ability_match = 0; - ap->ability_match_count = 0; - } else { - if (++ap->ability_match_count > 1) { - ap->ability_match = 1; - ap->ability_match_cfg = rx_cfg_reg; - } - } - if (rx_cfg_reg & ANEG_CFG_ACK) - ap->ack_match = 1; - else - ap->ack_match = 0; - - ap->idle_match = 0; - } else { - ap->idle_match = 1; - ap->ability_match_cfg = 0; - ap->ability_match_count = 0; - ap->ability_match = 0; - ap->ack_match = 0; - - rx_cfg_reg = 0; - } - - ap->rxconfig = rx_cfg_reg; - ret = ANEG_OK; - - switch (ap->state) { - case ANEG_STATE_UNKNOWN: - if (ap->flags & (MR_AN_ENABLE | MR_RESTART_AN)) - ap->state = ANEG_STATE_AN_ENABLE; - - /* fallthru */ - case ANEG_STATE_AN_ENABLE: - ap->flags &= ~(MR_AN_COMPLETE | MR_PAGE_RX); - if (ap->flags & MR_AN_ENABLE) { - ap->link_time = 0; - ap->cur_time = 0; - ap->ability_match_cfg = 0; - ap->ability_match_count = 0; - ap->ability_match = 0; - ap->idle_match = 0; - ap->ack_match = 0; - - ap->state = ANEG_STATE_RESTART_INIT; - } else { - ap->state = ANEG_STATE_DISABLE_LINK_OK; - } - break; - - case ANEG_STATE_RESTART_INIT: - ap->link_time = ap->cur_time; - ap->flags &= ~(MR_NP_LOADED); - ap->txconfig = 0; - tw32(MAC_TX_AUTO_NEG, 0); - tp->mac_mode |= MAC_MODE_SEND_CONFIGS; - tw32_f(MAC_MODE, tp->mac_mode); - udelay(40); - - ret = ANEG_TIMER_ENAB; - ap->state = ANEG_STATE_RESTART; - - /* fallthru */ - case ANEG_STATE_RESTART: - delta = ap->cur_time - ap->link_time; - if (delta > ANEG_STATE_SETTLE_TIME) - ap->state = ANEG_STATE_ABILITY_DETECT_INIT; - else - ret = ANEG_TIMER_ENAB; - break; - - case ANEG_STATE_DISABLE_LINK_OK: - ret = ANEG_DONE; - break; - - case ANEG_STATE_ABILITY_DETECT_INIT: - ap->flags &= ~(MR_TOGGLE_TX); - ap->txconfig = ANEG_CFG_FD; - flowctrl = tg3_advert_flowctrl_1000X(tp->link_config.flowctrl); - if (flowctrl & ADVERTISE_1000XPAUSE) - ap->txconfig |= ANEG_CFG_PS1; - if (flowctrl & ADVERTISE_1000XPSE_ASYM) - ap->txconfig |= ANEG_CFG_PS2; - tw32(MAC_TX_AUTO_NEG, ap->txconfig); - tp->mac_mode |= MAC_MODE_SEND_CONFIGS; - tw32_f(MAC_MODE, tp->mac_mode); - udelay(40); - - ap->state = ANEG_STATE_ABILITY_DETECT; - break; - - case ANEG_STATE_ABILITY_DETECT: - if (ap->ability_match != 0 && ap->rxconfig != 0) - ap->state = ANEG_STATE_ACK_DETECT_INIT; - break; - - case ANEG_STATE_ACK_DETECT_INIT: - ap->txconfig |= ANEG_CFG_ACK; - tw32(MAC_TX_AUTO_NEG, ap->txconfig); - tp->mac_mode |= MAC_MODE_SEND_CONFIGS; - tw32_f(MAC_MODE, tp->mac_mode); - udelay(40); - - ap->state = ANEG_STATE_ACK_DETECT; - - /* fallthru */ - case ANEG_STATE_ACK_DETECT: - if (ap->ack_match != 0) { - if ((ap->rxconfig & ~ANEG_CFG_ACK) == - (ap->ability_match_cfg & ~ANEG_CFG_ACK)) { - ap->state = ANEG_STATE_COMPLETE_ACK_INIT; - } else { - ap->state = ANEG_STATE_AN_ENABLE; - } - } else if (ap->ability_match != 0 && - ap->rxconfig == 0) { - ap->state = ANEG_STATE_AN_ENABLE; - } - break; - - case ANEG_STATE_COMPLETE_ACK_INIT: - if (ap->rxconfig & ANEG_CFG_INVAL) { - ret = ANEG_FAILED; - break; - } - ap->flags &= ~(MR_LP_ADV_FULL_DUPLEX | - MR_LP_ADV_HALF_DUPLEX | - MR_LP_ADV_SYM_PAUSE | - MR_LP_ADV_ASYM_PAUSE | - MR_LP_ADV_REMOTE_FAULT1 | - MR_LP_ADV_REMOTE_FAULT2 | - MR_LP_ADV_NEXT_PAGE | - MR_TOGGLE_RX | - MR_NP_RX); - if (ap->rxconfig & ANEG_CFG_FD) - ap->flags |= MR_LP_ADV_FULL_DUPLEX; - if (ap->rxconfig & ANEG_CFG_HD) - ap->flags |= MR_LP_ADV_HALF_DUPLEX; - if (ap->rxconfig & ANEG_CFG_PS1) - ap->flags |= MR_LP_ADV_SYM_PAUSE; - if (ap->rxconfig & ANEG_CFG_PS2) - ap->flags |= MR_LP_ADV_ASYM_PAUSE; - if (ap->rxconfig & ANEG_CFG_RF1) - ap->flags |= MR_LP_ADV_REMOTE_FAULT1; - if (ap->rxconfig & ANEG_CFG_RF2) - ap->flags |= MR_LP_ADV_REMOTE_FAULT2; - if (ap->rxconfig & ANEG_CFG_NP) - ap->flags |= MR_LP_ADV_NEXT_PAGE; - - ap->link_time = ap->cur_time; - - ap->flags ^= (MR_TOGGLE_TX); - if (ap->rxconfig & 0x0008) - ap->flags |= MR_TOGGLE_RX; - if (ap->rxconfig & ANEG_CFG_NP) - ap->flags |= MR_NP_RX; - ap->flags |= MR_PAGE_RX; - - ap->state = ANEG_STATE_COMPLETE_ACK; - ret = ANEG_TIMER_ENAB; - break; - - case ANEG_STATE_COMPLETE_ACK: - if (ap->ability_match != 0 && - ap->rxconfig == 0) { - ap->state = ANEG_STATE_AN_ENABLE; - break; - } - delta = ap->cur_time - ap->link_time; - if (delta > ANEG_STATE_SETTLE_TIME) { - if (!(ap->flags & (MR_LP_ADV_NEXT_PAGE))) { - ap->state = ANEG_STATE_IDLE_DETECT_INIT; - } else { - if ((ap->txconfig & ANEG_CFG_NP) == 0 && - !(ap->flags & MR_NP_RX)) { - ap->state = ANEG_STATE_IDLE_DETECT_INIT; - } else { - ret = ANEG_FAILED; - } - } - } - break; - - case ANEG_STATE_IDLE_DETECT_INIT: - ap->link_time = ap->cur_time; - tp->mac_mode &= ~MAC_MODE_SEND_CONFIGS; - tw32_f(MAC_MODE, tp->mac_mode); - udelay(40); - - ap->state = ANEG_STATE_IDLE_DETECT; - ret = ANEG_TIMER_ENAB; - break; - - case ANEG_STATE_IDLE_DETECT: - if (ap->ability_match != 0 && - ap->rxconfig == 0) { - ap->state = ANEG_STATE_AN_ENABLE; - break; - } - delta = ap->cur_time - ap->link_time; - if (delta > ANEG_STATE_SETTLE_TIME) { - /* XXX another gem from the Broadcom driver :( */ - ap->state = ANEG_STATE_LINK_OK; - } - break; - - case ANEG_STATE_LINK_OK: - ap->flags |= (MR_AN_COMPLETE | MR_LINK_OK); - ret = ANEG_DONE; - break; - - case ANEG_STATE_NEXT_PAGE_WAIT_INIT: - /* ??? unimplemented */ - break; - - case ANEG_STATE_NEXT_PAGE_WAIT: - /* ??? unimplemented */ - break; - - default: - ret = ANEG_FAILED; - break; - } - - return ret; -} - -static int fiber_autoneg(struct tg3 *tp, u32 *txflags, u32 *rxflags) -{ - int res = 0; - struct tg3_fiber_aneginfo aninfo; - int status = ANEG_FAILED; - unsigned int tick; - u32 tmp; - - tw32_f(MAC_TX_AUTO_NEG, 0); - - tmp = tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK; - tw32_f(MAC_MODE, tmp | MAC_MODE_PORT_MODE_GMII); - udelay(40); - - tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_SEND_CONFIGS); - udelay(40); - - memset(&aninfo, 0, sizeof(aninfo)); - aninfo.flags |= MR_AN_ENABLE; - aninfo.state = ANEG_STATE_UNKNOWN; - aninfo.cur_time = 0; - tick = 0; - while (++tick < 195000) { - status = tg3_fiber_aneg_smachine(tp, &aninfo); - if (status == ANEG_DONE || status == ANEG_FAILED) - break; - - udelay(1); - } - - tp->mac_mode &= ~MAC_MODE_SEND_CONFIGS; - tw32_f(MAC_MODE, tp->mac_mode); - udelay(40); - - *txflags = aninfo.txconfig; - *rxflags = aninfo.flags; - - if (status == ANEG_DONE && - (aninfo.flags & (MR_AN_COMPLETE | MR_LINK_OK | - MR_LP_ADV_FULL_DUPLEX))) - res = 1; - - return res; -} - -static void tg3_init_bcm8002(struct tg3 *tp) -{ - u32 mac_status = tr32(MAC_STATUS); - int i; - - /* Reset when initting first time or we have a link. */ - if (tg3_flag(tp, INIT_COMPLETE) && - !(mac_status & MAC_STATUS_PCS_SYNCED)) - return; - - /* Set PLL lock range. */ - tg3_writephy(tp, 0x16, 0x8007); - - /* SW reset */ - tg3_writephy(tp, MII_BMCR, BMCR_RESET); - - /* Wait for reset to complete. */ - /* XXX schedule_timeout() ... */ - for (i = 0; i < 500; i++) - udelay(10); - - /* Config mode; select PMA/Ch 1 regs. */ - tg3_writephy(tp, 0x10, 0x8411); - - /* Enable auto-lock and comdet, select txclk for tx. */ - tg3_writephy(tp, 0x11, 0x0a10); - - tg3_writephy(tp, 0x18, 0x00a0); - tg3_writephy(tp, 0x16, 0x41ff); - - /* Assert and deassert POR. */ - tg3_writephy(tp, 0x13, 0x0400); - udelay(40); - tg3_writephy(tp, 0x13, 0x0000); - - tg3_writephy(tp, 0x11, 0x0a50); - udelay(40); - tg3_writephy(tp, 0x11, 0x0a10); - - /* Wait for signal to stabilize */ - /* XXX schedule_timeout() ... */ - for (i = 0; i < 15000; i++) - udelay(10); - - /* Deselect the channel register so we can read the PHYID - * later. - */ - tg3_writephy(tp, 0x10, 0x8011); -} - -static bool tg3_setup_fiber_hw_autoneg(struct tg3 *tp, u32 mac_status) -{ - u16 flowctrl; - bool current_link_up; - u32 sg_dig_ctrl, sg_dig_status; - u32 serdes_cfg, expected_sg_dig_ctrl; - int workaround, port_a; - - serdes_cfg = 0; - expected_sg_dig_ctrl = 0; - workaround = 0; - port_a = 1; - current_link_up = false; - - if (tg3_chip_rev_id(tp) != CHIPREV_ID_5704_A0 && - tg3_chip_rev_id(tp) != CHIPREV_ID_5704_A1) { - workaround = 1; - if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID) - port_a = 0; - - /* preserve bits 0-11,13,14 for signal pre-emphasis */ - /* preserve bits 20-23 for voltage regulator */ - serdes_cfg = tr32(MAC_SERDES_CFG) & 0x00f06fff; - } - - sg_dig_ctrl = tr32(SG_DIG_CTRL); - - if (tp->link_config.autoneg != AUTONEG_ENABLE) { - if (sg_dig_ctrl & SG_DIG_USING_HW_AUTONEG) { - if (workaround) { - u32 val = serdes_cfg; - - if (port_a) - val |= 0xc010000; - else - val |= 0x4010000; - tw32_f(MAC_SERDES_CFG, val); - } - - tw32_f(SG_DIG_CTRL, SG_DIG_COMMON_SETUP); - } - if (mac_status & MAC_STATUS_PCS_SYNCED) { - tg3_setup_flow_control(tp, 0, 0); - current_link_up = true; - } - goto out; - } - - /* Want auto-negotiation. */ - expected_sg_dig_ctrl = SG_DIG_USING_HW_AUTONEG | SG_DIG_COMMON_SETUP; - - flowctrl = tg3_advert_flowctrl_1000X(tp->link_config.flowctrl); - if (flowctrl & ADVERTISE_1000XPAUSE) - expected_sg_dig_ctrl |= SG_DIG_PAUSE_CAP; - if (flowctrl & ADVERTISE_1000XPSE_ASYM) - expected_sg_dig_ctrl |= SG_DIG_ASYM_PAUSE; - - if (sg_dig_ctrl != expected_sg_dig_ctrl) { - if ((tp->phy_flags & TG3_PHYFLG_PARALLEL_DETECT) && - tp->serdes_counter && - ((mac_status & (MAC_STATUS_PCS_SYNCED | - MAC_STATUS_RCVD_CFG)) == - MAC_STATUS_PCS_SYNCED)) { - tp->serdes_counter--; - current_link_up = true; - goto out; - } -restart_autoneg: - if (workaround) - tw32_f(MAC_SERDES_CFG, serdes_cfg | 0xc011000); - tw32_f(SG_DIG_CTRL, expected_sg_dig_ctrl | SG_DIG_SOFT_RESET); - udelay(5); - tw32_f(SG_DIG_CTRL, expected_sg_dig_ctrl); - - tp->serdes_counter = SERDES_AN_TIMEOUT_5704S; - tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT; - } else if (mac_status & (MAC_STATUS_PCS_SYNCED | - MAC_STATUS_SIGNAL_DET)) { - sg_dig_status = tr32(SG_DIG_STATUS); - mac_status = tr32(MAC_STATUS); - - if ((sg_dig_status & SG_DIG_AUTONEG_COMPLETE) && - (mac_status & MAC_STATUS_PCS_SYNCED)) { - u32 local_adv = 0, remote_adv = 0; - - if (sg_dig_ctrl & SG_DIG_PAUSE_CAP) - local_adv |= ADVERTISE_1000XPAUSE; - if (sg_dig_ctrl & SG_DIG_ASYM_PAUSE) - local_adv |= ADVERTISE_1000XPSE_ASYM; - - if (sg_dig_status & SG_DIG_PARTNER_PAUSE_CAPABLE) - remote_adv |= LPA_1000XPAUSE; - if (sg_dig_status & SG_DIG_PARTNER_ASYM_PAUSE) - remote_adv |= LPA_1000XPAUSE_ASYM; - - tp->link_config.rmt_adv = - mii_adv_to_ethtool_adv_x(remote_adv); - - tg3_setup_flow_control(tp, local_adv, remote_adv); - current_link_up = true; - tp->serdes_counter = 0; - tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT; - } else if (!(sg_dig_status & SG_DIG_AUTONEG_COMPLETE)) { - if (tp->serdes_counter) - tp->serdes_counter--; - else { - if (workaround) { - u32 val = serdes_cfg; - - if (port_a) - val |= 0xc010000; - else - val |= 0x4010000; - - tw32_f(MAC_SERDES_CFG, val); - } - - tw32_f(SG_DIG_CTRL, SG_DIG_COMMON_SETUP); - udelay(40); - - /* Link parallel detection - link is up */ - /* only if we have PCS_SYNC and not */ - /* receiving config code words */ - mac_status = tr32(MAC_STATUS); - if ((mac_status & MAC_STATUS_PCS_SYNCED) && - !(mac_status & MAC_STATUS_RCVD_CFG)) { - tg3_setup_flow_control(tp, 0, 0); - current_link_up = true; - tp->phy_flags |= - TG3_PHYFLG_PARALLEL_DETECT; - tp->serdes_counter = - SERDES_PARALLEL_DET_TIMEOUT; - } else - goto restart_autoneg; - } - } - } else { - tp->serdes_counter = SERDES_AN_TIMEOUT_5704S; - tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT; - } - -out: - return current_link_up; -} - -static bool tg3_setup_fiber_by_hand(struct tg3 *tp, u32 mac_status) -{ - bool current_link_up = false; - - if (!(mac_status & MAC_STATUS_PCS_SYNCED)) - goto out; - - if (tp->link_config.autoneg == AUTONEG_ENABLE) { - u32 txflags, rxflags; - int i; - - if (fiber_autoneg(tp, &txflags, &rxflags)) { - u32 local_adv = 0, remote_adv = 0; - - if (txflags & ANEG_CFG_PS1) - local_adv |= ADVERTISE_1000XPAUSE; - if (txflags & ANEG_CFG_PS2) - local_adv |= ADVERTISE_1000XPSE_ASYM; - - if (rxflags & MR_LP_ADV_SYM_PAUSE) - remote_adv |= LPA_1000XPAUSE; - if (rxflags & MR_LP_ADV_ASYM_PAUSE) - remote_adv |= LPA_1000XPAUSE_ASYM; - - tp->link_config.rmt_adv = - mii_adv_to_ethtool_adv_x(remote_adv); - - tg3_setup_flow_control(tp, local_adv, remote_adv); - - current_link_up = true; - } - for (i = 0; i < 30; i++) { - udelay(20); - tw32_f(MAC_STATUS, - (MAC_STATUS_SYNC_CHANGED | - MAC_STATUS_CFG_CHANGED)); - udelay(40); - if ((tr32(MAC_STATUS) & - (MAC_STATUS_SYNC_CHANGED | - MAC_STATUS_CFG_CHANGED)) == 0) - break; - } - - mac_status = tr32(MAC_STATUS); - if (!current_link_up && - (mac_status & MAC_STATUS_PCS_SYNCED) && - !(mac_status & MAC_STATUS_RCVD_CFG)) - current_link_up = true; - } else { - tg3_setup_flow_control(tp, 0, 0); - - /* Forcing 1000FD link up. */ - current_link_up = true; - - tw32_f(MAC_MODE, (tp->mac_mode | MAC_MODE_SEND_CONFIGS)); - udelay(40); - - tw32_f(MAC_MODE, tp->mac_mode); - udelay(40); - } - -out: - return current_link_up; -} - -static int tg3_setup_fiber_phy(struct tg3 *tp, bool force_reset) -{ - u32 orig_pause_cfg; - u16 orig_active_speed; - u8 orig_active_duplex; - u32 mac_status; - bool current_link_up; - int i; - - orig_pause_cfg = tp->link_config.active_flowctrl; - orig_active_speed = tp->link_config.active_speed; - orig_active_duplex = tp->link_config.active_duplex; - - if (!tg3_flag(tp, HW_AUTONEG) && - tp->link_up && - tg3_flag(tp, INIT_COMPLETE)) { - mac_status = tr32(MAC_STATUS); - mac_status &= (MAC_STATUS_PCS_SYNCED | - MAC_STATUS_SIGNAL_DET | - MAC_STATUS_CFG_CHANGED | - MAC_STATUS_RCVD_CFG); - if (mac_status == (MAC_STATUS_PCS_SYNCED | - MAC_STATUS_SIGNAL_DET)) { - tw32_f(MAC_STATUS, (MAC_STATUS_SYNC_CHANGED | - MAC_STATUS_CFG_CHANGED)); - return 0; - } - } - - tw32_f(MAC_TX_AUTO_NEG, 0); - - tp->mac_mode &= ~(MAC_MODE_PORT_MODE_MASK | MAC_MODE_HALF_DUPLEX); - tp->mac_mode |= MAC_MODE_PORT_MODE_TBI; - tw32_f(MAC_MODE, tp->mac_mode); - udelay(40); - - if (tp->phy_id == TG3_PHY_ID_BCM8002) - tg3_init_bcm8002(tp); - - /* Enable link change event even when serdes polling. */ - tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED); - udelay(40); - - current_link_up = false; - tp->link_config.rmt_adv = 0; - mac_status = tr32(MAC_STATUS); - - if (tg3_flag(tp, HW_AUTONEG)) - current_link_up = tg3_setup_fiber_hw_autoneg(tp, mac_status); - else - current_link_up = tg3_setup_fiber_by_hand(tp, mac_status); - - tp->napi[0].hw_status->status = - (SD_STATUS_UPDATED | - (tp->napi[0].hw_status->status & ~SD_STATUS_LINK_CHG)); - - for (i = 0; i < 100; i++) { - tw32_f(MAC_STATUS, (MAC_STATUS_SYNC_CHANGED | - MAC_STATUS_CFG_CHANGED)); - udelay(5); - if ((tr32(MAC_STATUS) & (MAC_STATUS_SYNC_CHANGED | - MAC_STATUS_CFG_CHANGED | - MAC_STATUS_LNKSTATE_CHANGED)) == 0) - break; - } - - mac_status = tr32(MAC_STATUS); - if ((mac_status & MAC_STATUS_PCS_SYNCED) == 0) { - current_link_up = false; - if (tp->link_config.autoneg == AUTONEG_ENABLE && - tp->serdes_counter == 0) { - tw32_f(MAC_MODE, (tp->mac_mode | - MAC_MODE_SEND_CONFIGS)); - udelay(1); - tw32_f(MAC_MODE, tp->mac_mode); - } - } - - if (current_link_up) { - tp->link_config.active_speed = SPEED_1000; - tp->link_config.active_duplex = DUPLEX_FULL; - tw32(MAC_LED_CTRL, (tp->led_ctrl | - LED_CTRL_LNKLED_OVERRIDE | - LED_CTRL_1000MBPS_ON)); - } else { - tp->link_config.active_speed = SPEED_UNKNOWN; - tp->link_config.active_duplex = DUPLEX_UNKNOWN; - tw32(MAC_LED_CTRL, (tp->led_ctrl | - LED_CTRL_LNKLED_OVERRIDE | - LED_CTRL_TRAFFIC_OVERRIDE)); - } - - if (!tg3_test_and_report_link_chg(tp, current_link_up)) { - u32 now_pause_cfg = tp->link_config.active_flowctrl; - if (orig_pause_cfg != now_pause_cfg || - orig_active_speed != tp->link_config.active_speed || - orig_active_duplex != tp->link_config.active_duplex) - tg3_link_report(tp); - } - - return 0; -} - -static int tg3_setup_fiber_mii_phy(struct tg3 *tp, bool force_reset) -{ - int err = 0; - u32 bmsr, bmcr; - u16 current_speed = SPEED_UNKNOWN; - u8 current_duplex = DUPLEX_UNKNOWN; - bool current_link_up = false; - u32 local_adv, remote_adv, sgsr; - - if ((tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720) && - !tg3_readphy(tp, SERDES_TG3_1000X_STATUS, &sgsr) && - (sgsr & SERDES_TG3_SGMII_MODE)) { - - if (force_reset) - tg3_phy_reset(tp); - - tp->mac_mode &= ~MAC_MODE_PORT_MODE_MASK; - - if (!(sgsr & SERDES_TG3_LINK_UP)) { - tp->mac_mode |= MAC_MODE_PORT_MODE_GMII; - } else { - current_link_up = true; - if (sgsr & SERDES_TG3_SPEED_1000) { - current_speed = SPEED_1000; - tp->mac_mode |= MAC_MODE_PORT_MODE_GMII; - } else if (sgsr & SERDES_TG3_SPEED_100) { - current_speed = SPEED_100; - tp->mac_mode |= MAC_MODE_PORT_MODE_MII; - } else { - current_speed = SPEED_10; - tp->mac_mode |= MAC_MODE_PORT_MODE_MII; - } - - if (sgsr & SERDES_TG3_FULL_DUPLEX) - current_duplex = DUPLEX_FULL; - else - current_duplex = DUPLEX_HALF; - } - - tw32_f(MAC_MODE, tp->mac_mode); - udelay(40); - - tg3_clear_mac_status(tp); - - goto fiber_setup_done; - } - - tp->mac_mode |= MAC_MODE_PORT_MODE_GMII; - tw32_f(MAC_MODE, tp->mac_mode); - udelay(40); - - tg3_clear_mac_status(tp); - - if (force_reset) - tg3_phy_reset(tp); - - tp->link_config.rmt_adv = 0; - - err |= tg3_readphy(tp, MII_BMSR, &bmsr); - err |= tg3_readphy(tp, MII_BMSR, &bmsr); - if (tg3_asic_rev(tp) == ASIC_REV_5714) { - if (tr32(MAC_TX_STATUS) & TX_STATUS_LINK_UP) - bmsr |= BMSR_LSTATUS; - else - bmsr &= ~BMSR_LSTATUS; - } - - err |= tg3_readphy(tp, MII_BMCR, &bmcr); - - if ((tp->link_config.autoneg == AUTONEG_ENABLE) && !force_reset && - (tp->phy_flags & TG3_PHYFLG_PARALLEL_DETECT)) { - /* do nothing, just check for link up at the end */ - } else if (tp->link_config.autoneg == AUTONEG_ENABLE) { - u32 adv, newadv; - - err |= tg3_readphy(tp, MII_ADVERTISE, &adv); - newadv = adv & ~(ADVERTISE_1000XFULL | ADVERTISE_1000XHALF | - ADVERTISE_1000XPAUSE | - ADVERTISE_1000XPSE_ASYM | - ADVERTISE_SLCT); - - newadv |= tg3_advert_flowctrl_1000X(tp->link_config.flowctrl); - newadv |= ethtool_adv_to_mii_adv_x(tp->link_config.advertising); - - if ((newadv != adv) || !(bmcr & BMCR_ANENABLE)) { - tg3_writephy(tp, MII_ADVERTISE, newadv); - bmcr |= BMCR_ANENABLE | BMCR_ANRESTART; - tg3_writephy(tp, MII_BMCR, bmcr); - - tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED); - tp->serdes_counter = SERDES_AN_TIMEOUT_5714S; - tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT; - - return err; - } - } else { - u32 new_bmcr; - - bmcr &= ~BMCR_SPEED1000; - new_bmcr = bmcr & ~(BMCR_ANENABLE | BMCR_FULLDPLX); - - if (tp->link_config.duplex == DUPLEX_FULL) - new_bmcr |= BMCR_FULLDPLX; - - if (new_bmcr != bmcr) { - /* BMCR_SPEED1000 is a reserved bit that needs - * to be set on write. - */ - new_bmcr |= BMCR_SPEED1000; - - /* Force a linkdown */ - if (tp->link_up) { - u32 adv; - - err |= tg3_readphy(tp, MII_ADVERTISE, &adv); - adv &= ~(ADVERTISE_1000XFULL | - ADVERTISE_1000XHALF | - ADVERTISE_SLCT); - tg3_writephy(tp, MII_ADVERTISE, adv); - tg3_writephy(tp, MII_BMCR, bmcr | - BMCR_ANRESTART | - BMCR_ANENABLE); - udelay(10); - tg3_carrier_off(tp); - } - tg3_writephy(tp, MII_BMCR, new_bmcr); - bmcr = new_bmcr; - err |= tg3_readphy(tp, MII_BMSR, &bmsr); - err |= tg3_readphy(tp, MII_BMSR, &bmsr); - if (tg3_asic_rev(tp) == ASIC_REV_5714) { - if (tr32(MAC_TX_STATUS) & TX_STATUS_LINK_UP) - bmsr |= BMSR_LSTATUS; - else - bmsr &= ~BMSR_LSTATUS; - } - tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT; - } - } - - if (bmsr & BMSR_LSTATUS) { - current_speed = SPEED_1000; - current_link_up = true; - if (bmcr & BMCR_FULLDPLX) - current_duplex = DUPLEX_FULL; - else - current_duplex = DUPLEX_HALF; - - local_adv = 0; - remote_adv = 0; - - if (bmcr & BMCR_ANENABLE) { - u32 common; - - err |= tg3_readphy(tp, MII_ADVERTISE, &local_adv); - err |= tg3_readphy(tp, MII_LPA, &remote_adv); - common = local_adv & remote_adv; - if (common & (ADVERTISE_1000XHALF | - ADVERTISE_1000XFULL)) { - if (common & ADVERTISE_1000XFULL) - current_duplex = DUPLEX_FULL; - else - current_duplex = DUPLEX_HALF; - - tp->link_config.rmt_adv = - mii_adv_to_ethtool_adv_x(remote_adv); - } else if (!tg3_flag(tp, 5780_CLASS)) { - /* Link is up via parallel detect */ - } else { - current_link_up = false; - } - } - } - -fiber_setup_done: - if (current_link_up && current_duplex == DUPLEX_FULL) - tg3_setup_flow_control(tp, local_adv, remote_adv); - - tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX; - if (tp->link_config.active_duplex == DUPLEX_HALF) - tp->mac_mode |= MAC_MODE_HALF_DUPLEX; - - tw32_f(MAC_MODE, tp->mac_mode); - udelay(40); - - tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED); - - tp->link_config.active_speed = current_speed; - tp->link_config.active_duplex = current_duplex; - - tg3_test_and_report_link_chg(tp, current_link_up); - return err; -} - -static void tg3_serdes_parallel_detect(struct tg3 *tp) -{ - if (tp->serdes_counter) { - /* Give autoneg time to complete. */ - tp->serdes_counter--; - return; - } - - if (!tp->link_up && - (tp->link_config.autoneg == AUTONEG_ENABLE)) { - u32 bmcr; - - tg3_readphy(tp, MII_BMCR, &bmcr); - if (bmcr & BMCR_ANENABLE) { - u32 phy1, phy2; - - /* Select shadow register 0x1f */ - tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x7c00); - tg3_readphy(tp, MII_TG3_MISC_SHDW, &phy1); - - /* Select expansion interrupt status register */ - tg3_writephy(tp, MII_TG3_DSP_ADDRESS, - MII_TG3_DSP_EXP1_INT_STAT); - tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &phy2); - tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &phy2); - - if ((phy1 & 0x10) && !(phy2 & 0x20)) { - /* We have signal detect and not receiving - * config code words, link is up by parallel - * detection. - */ - - bmcr &= ~BMCR_ANENABLE; - bmcr |= BMCR_SPEED1000 | BMCR_FULLDPLX; - tg3_writephy(tp, MII_BMCR, bmcr); - tp->phy_flags |= TG3_PHYFLG_PARALLEL_DETECT; - } - } - } else if (tp->link_up && - (tp->link_config.autoneg == AUTONEG_ENABLE) && - (tp->phy_flags & TG3_PHYFLG_PARALLEL_DETECT)) { - u32 phy2; - - /* Select expansion interrupt status register */ - tg3_writephy(tp, MII_TG3_DSP_ADDRESS, - MII_TG3_DSP_EXP1_INT_STAT); - tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &phy2); - if (phy2 & 0x20) { - u32 bmcr; - - /* Config code words received, turn on autoneg. */ - tg3_readphy(tp, MII_BMCR, &bmcr); - tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANENABLE); - - tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT; - - } - } -} - -static int tg3_setup_phy(struct tg3 *tp, bool force_reset) -{ - u32 val; - int err; - - if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) - err = tg3_setup_fiber_phy(tp, force_reset); - else if (tp->phy_flags & TG3_PHYFLG_MII_SERDES) - err = tg3_setup_fiber_mii_phy(tp, force_reset); - else - err = tg3_setup_copper_phy(tp, force_reset); - - if (tg3_chip_rev(tp) == CHIPREV_5784_AX) { - u32 scale; - - val = tr32(TG3_CPMU_CLCK_STAT) & CPMU_CLCK_STAT_MAC_CLCK_MASK; - if (val == CPMU_CLCK_STAT_MAC_CLCK_62_5) - scale = 65; - else if (val == CPMU_CLCK_STAT_MAC_CLCK_6_25) - scale = 6; - else - scale = 12; - - val = tr32(GRC_MISC_CFG) & ~GRC_MISC_CFG_PRESCALAR_MASK; - val |= (scale << GRC_MISC_CFG_PRESCALAR_SHIFT); - tw32(GRC_MISC_CFG, val); - } - - val = (2 << TX_LENGTHS_IPG_CRS_SHIFT) | - (6 << TX_LENGTHS_IPG_SHIFT); - if (tg3_asic_rev(tp) == ASIC_REV_5720 || - tg3_asic_rev(tp) == ASIC_REV_5762) - val |= tr32(MAC_TX_LENGTHS) & - (TX_LENGTHS_JMB_FRM_LEN_MSK | - TX_LENGTHS_CNT_DWN_VAL_MSK); - - if (tp->link_config.active_speed == SPEED_1000 && - tp->link_config.active_duplex == DUPLEX_HALF) - tw32(MAC_TX_LENGTHS, val | - (0xff << TX_LENGTHS_SLOT_TIME_SHIFT)); - else - tw32(MAC_TX_LENGTHS, val | - (32 << TX_LENGTHS_SLOT_TIME_SHIFT)); - - if (!tg3_flag(tp, 5705_PLUS)) { - if (tp->link_up) { - tw32(HOSTCC_STAT_COAL_TICKS, - tp->coal.stats_block_coalesce_usecs); - } else { - tw32(HOSTCC_STAT_COAL_TICKS, 0); - } - } - - if (tg3_flag(tp, ASPM_WORKAROUND)) { - val = tr32(PCIE_PWR_MGMT_THRESH); - if (!tp->link_up) - val = (val & ~PCIE_PWR_MGMT_L1_THRESH_MSK) | - tp->pwrmgmt_thresh; - else - val |= PCIE_PWR_MGMT_L1_THRESH_MSK; - tw32(PCIE_PWR_MGMT_THRESH, val); - } - - return err; -} - -/* tp->lock must be held */ -static u64 tg3_refclk_read(struct tg3 *tp) -{ - u64 stamp = tr32(TG3_EAV_REF_CLCK_LSB); - return stamp | (u64)tr32(TG3_EAV_REF_CLCK_MSB) << 32; -} - -/* tp->lock must be held */ -static void tg3_refclk_write(struct tg3 *tp, u64 newval) -{ - u32 clock_ctl = tr32(TG3_EAV_REF_CLCK_CTL); - - tw32(TG3_EAV_REF_CLCK_CTL, clock_ctl | TG3_EAV_REF_CLCK_CTL_STOP); - tw32(TG3_EAV_REF_CLCK_LSB, newval & 0xffffffff); - tw32(TG3_EAV_REF_CLCK_MSB, newval >> 32); - tw32_f(TG3_EAV_REF_CLCK_CTL, clock_ctl | TG3_EAV_REF_CLCK_CTL_RESUME); -} - -static inline void tg3_full_lock(struct tg3 *tp, int irq_sync); -static inline void tg3_full_unlock(struct tg3 *tp); -static int tg3_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info) -{ - struct tg3 *tp = netdev_priv(dev); - - info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE | - SOF_TIMESTAMPING_RX_SOFTWARE | - SOF_TIMESTAMPING_SOFTWARE; - - if (tg3_flag(tp, PTP_CAPABLE)) { - info->so_timestamping |= SOF_TIMESTAMPING_TX_HARDWARE | - SOF_TIMESTAMPING_RX_HARDWARE | - SOF_TIMESTAMPING_RAW_HARDWARE; - } - - if (tp->ptp_clock) - info->phc_index = ptp_clock_index(tp->ptp_clock); - else - info->phc_index = -1; - - info->tx_types = (1 << HWTSTAMP_TX_OFF) | (1 << HWTSTAMP_TX_ON); - - info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) | - (1 << HWTSTAMP_FILTER_PTP_V1_L4_EVENT) | - (1 << HWTSTAMP_FILTER_PTP_V2_L2_EVENT) | - (1 << HWTSTAMP_FILTER_PTP_V2_L4_EVENT); - return 0; -} - -static int tg3_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) -{ - struct tg3 *tp = container_of(ptp, struct tg3, ptp_info); - bool neg_adj = false; - u32 correction = 0; - - if (ppb < 0) { - neg_adj = true; - ppb = -ppb; - } - - /* Frequency adjustment is performed using hardware with a 24 bit - * accumulator and a programmable correction value. On each clk, the - * correction value gets added to the accumulator and when it - * overflows, the time counter is incremented/decremented. - * - * So conversion from ppb to correction value is - * ppb * (1 << 24) / 1000000000 - */ - correction = div_u64((u64)ppb * (1 << 24), 1000000000ULL) & - TG3_EAV_REF_CLK_CORRECT_MASK; - - tg3_full_lock(tp, 0); - - if (correction) - tw32(TG3_EAV_REF_CLK_CORRECT_CTL, - TG3_EAV_REF_CLK_CORRECT_EN | - (neg_adj ? TG3_EAV_REF_CLK_CORRECT_NEG : 0) | correction); - else - tw32(TG3_EAV_REF_CLK_CORRECT_CTL, 0); - - tg3_full_unlock(tp); - - return 0; -} - -static int tg3_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta) -{ - struct tg3 *tp = container_of(ptp, struct tg3, ptp_info); - - tg3_full_lock(tp, 0); - tp->ptp_adjust += delta; - tg3_full_unlock(tp); - - return 0; -} - -static int tg3_ptp_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts) -{ - u64 ns; - struct tg3 *tp = container_of(ptp, struct tg3, ptp_info); - - tg3_full_lock(tp, 0); - ns = tg3_refclk_read(tp); - ns += tp->ptp_adjust; - tg3_full_unlock(tp); - - *ts = ns_to_timespec64(ns); - - return 0; -} - -static int tg3_ptp_settime(struct ptp_clock_info *ptp, - const struct timespec64 *ts) -{ - u64 ns; - struct tg3 *tp = container_of(ptp, struct tg3, ptp_info); - - ns = timespec64_to_ns(ts); - - tg3_full_lock(tp, 0); - tg3_refclk_write(tp, ns); - tp->ptp_adjust = 0; - tg3_full_unlock(tp); - - return 0; -} - -static int tg3_ptp_enable(struct ptp_clock_info *ptp, - struct ptp_clock_request *rq, int on) -{ - struct tg3 *tp = container_of(ptp, struct tg3, ptp_info); - u32 clock_ctl; - int rval = 0; - - switch (rq->type) { - case PTP_CLK_REQ_PEROUT: - if (rq->perout.index != 0) - return -EINVAL; - - tg3_full_lock(tp, 0); - clock_ctl = tr32(TG3_EAV_REF_CLCK_CTL); - clock_ctl &= ~TG3_EAV_CTL_TSYNC_GPIO_MASK; - - if (on) { - u64 nsec; - - nsec = rq->perout.start.sec * 1000000000ULL + - rq->perout.start.nsec; - - if (rq->perout.period.sec || rq->perout.period.nsec) { - netdev_warn(tp->dev, - "Device supports only a one-shot timesync output, period must be 0\n"); - rval = -EINVAL; - goto err_out; - } - - if (nsec & (1ULL << 63)) { - netdev_warn(tp->dev, - "Start value (nsec) is over limit. Maximum size of start is only 63 bits\n"); - rval = -EINVAL; - goto err_out; - } - - tw32(TG3_EAV_WATCHDOG0_LSB, (nsec & 0xffffffff)); - tw32(TG3_EAV_WATCHDOG0_MSB, - TG3_EAV_WATCHDOG0_EN | - ((nsec >> 32) & TG3_EAV_WATCHDOG_MSB_MASK)); - - tw32(TG3_EAV_REF_CLCK_CTL, - clock_ctl | TG3_EAV_CTL_TSYNC_WDOG0); - } else { - tw32(TG3_EAV_WATCHDOG0_MSB, 0); - tw32(TG3_EAV_REF_CLCK_CTL, clock_ctl); - } - -err_out: - tg3_full_unlock(tp); - return rval; - - default: - break; - } - - return -EOPNOTSUPP; -} - -static const struct ptp_clock_info tg3_ptp_caps = { - .owner = THIS_MODULE, - .name = "tg3 clock", - .max_adj = 250000000, - .n_alarm = 0, - .n_ext_ts = 0, - .n_per_out = 1, - .n_pins = 0, - .pps = 0, - .adjfreq = tg3_ptp_adjfreq, - .adjtime = tg3_ptp_adjtime, - .gettime64 = tg3_ptp_gettime, - .settime64 = tg3_ptp_settime, - .enable = tg3_ptp_enable, -}; - -static void tg3_hwclock_to_timestamp(struct tg3 *tp, u64 hwclock, - struct skb_shared_hwtstamps *timestamp) -{ - memset(timestamp, 0, sizeof(struct skb_shared_hwtstamps)); - timestamp->hwtstamp = ns_to_ktime((hwclock & TG3_TSTAMP_MASK) + - tp->ptp_adjust); -} - -/* tp->lock must be held */ -static void tg3_ptp_init(struct tg3 *tp) -{ - if (!tg3_flag(tp, PTP_CAPABLE)) - return; - - /* Initialize the hardware clock to the system time. */ - tg3_refclk_write(tp, ktime_to_ns(ktime_get_real())); - tp->ptp_adjust = 0; - tp->ptp_info = tg3_ptp_caps; -} - -/* tp->lock must be held */ -static void tg3_ptp_resume(struct tg3 *tp) -{ - if (!tg3_flag(tp, PTP_CAPABLE)) - return; - - tg3_refclk_write(tp, ktime_to_ns(ktime_get_real()) + tp->ptp_adjust); - tp->ptp_adjust = 0; -} - -static void tg3_ptp_fini(struct tg3 *tp) -{ - if (!tg3_flag(tp, PTP_CAPABLE) || !tp->ptp_clock) - return; - - ptp_clock_unregister(tp->ptp_clock); - tp->ptp_clock = NULL; - tp->ptp_adjust = 0; -} - -static inline int tg3_irq_sync(struct tg3 *tp) -{ - return tp->irq_sync; -} - -static inline void tg3_rd32_loop(struct tg3 *tp, u32 *dst, u32 off, u32 len) -{ - int i; - - dst = (u32 *)((u8 *)dst + off); - for (i = 0; i < len; i += sizeof(u32)) - *dst++ = tr32(off + i); -} - -static void tg3_dump_legacy_regs(struct tg3 *tp, u32 *regs) -{ - tg3_rd32_loop(tp, regs, TG3PCI_VENDOR, 0xb0); - tg3_rd32_loop(tp, regs, MAILBOX_INTERRUPT_0, 0x200); - tg3_rd32_loop(tp, regs, MAC_MODE, 0x4f0); - tg3_rd32_loop(tp, regs, SNDDATAI_MODE, 0xe0); - tg3_rd32_loop(tp, regs, SNDDATAC_MODE, 0x04); - tg3_rd32_loop(tp, regs, SNDBDS_MODE, 0x80); - tg3_rd32_loop(tp, regs, SNDBDI_MODE, 0x48); - tg3_rd32_loop(tp, regs, SNDBDC_MODE, 0x04); - tg3_rd32_loop(tp, regs, RCVLPC_MODE, 0x20); - tg3_rd32_loop(tp, regs, RCVLPC_SELLST_BASE, 0x15c); - tg3_rd32_loop(tp, regs, RCVDBDI_MODE, 0x0c); - tg3_rd32_loop(tp, regs, RCVDBDI_JUMBO_BD, 0x3c); - tg3_rd32_loop(tp, regs, RCVDBDI_BD_PROD_IDX_0, 0x44); - tg3_rd32_loop(tp, regs, RCVDCC_MODE, 0x04); - tg3_rd32_loop(tp, regs, RCVBDI_MODE, 0x20); - tg3_rd32_loop(tp, regs, RCVCC_MODE, 0x14); - tg3_rd32_loop(tp, regs, RCVLSC_MODE, 0x08); - tg3_rd32_loop(tp, regs, MBFREE_MODE, 0x08); - tg3_rd32_loop(tp, regs, HOSTCC_MODE, 0x100); - - if (tg3_flag(tp, SUPPORT_MSIX)) - tg3_rd32_loop(tp, regs, HOSTCC_RXCOL_TICKS_VEC1, 0x180); - - tg3_rd32_loop(tp, regs, MEMARB_MODE, 0x10); - tg3_rd32_loop(tp, regs, BUFMGR_MODE, 0x58); - tg3_rd32_loop(tp, regs, RDMAC_MODE, 0x08); - tg3_rd32_loop(tp, regs, WDMAC_MODE, 0x08); - tg3_rd32_loop(tp, regs, RX_CPU_MODE, 0x04); - tg3_rd32_loop(tp, regs, RX_CPU_STATE, 0x04); - tg3_rd32_loop(tp, regs, RX_CPU_PGMCTR, 0x04); - tg3_rd32_loop(tp, regs, RX_CPU_HWBKPT, 0x04); - - if (!tg3_flag(tp, 5705_PLUS)) { - tg3_rd32_loop(tp, regs, TX_CPU_MODE, 0x04); - tg3_rd32_loop(tp, regs, TX_CPU_STATE, 0x04); - tg3_rd32_loop(tp, regs, TX_CPU_PGMCTR, 0x04); - } - - tg3_rd32_loop(tp, regs, GRCMBOX_INTERRUPT_0, 0x110); - tg3_rd32_loop(tp, regs, FTQ_RESET, 0x120); - tg3_rd32_loop(tp, regs, MSGINT_MODE, 0x0c); - tg3_rd32_loop(tp, regs, DMAC_MODE, 0x04); - tg3_rd32_loop(tp, regs, GRC_MODE, 0x4c); - - if (tg3_flag(tp, NVRAM)) - tg3_rd32_loop(tp, regs, NVRAM_CMD, 0x24); -} - -static void tg3_dump_state(struct tg3 *tp) -{ - int i; - u32 *regs; - - regs = kzalloc(TG3_REG_BLK_SIZE, GFP_ATOMIC); - if (!regs) - return; - - if (tg3_flag(tp, PCI_EXPRESS)) { - /* Read up to but not including private PCI registers */ - for (i = 0; i < TG3_PCIE_TLDLPL_PORT; i += sizeof(u32)) - regs[i / sizeof(u32)] = tr32(i); - } else - tg3_dump_legacy_regs(tp, regs); - - for (i = 0; i < TG3_REG_BLK_SIZE / sizeof(u32); i += 4) { - if (!regs[i + 0] && !regs[i + 1] && - !regs[i + 2] && !regs[i + 3]) - continue; - - netdev_err(tp->dev, "0x%08x: 0x%08x, 0x%08x, 0x%08x, 0x%08x\n", - i * 4, - regs[i + 0], regs[i + 1], regs[i + 2], regs[i + 3]); - } - - kfree(regs); - - for (i = 0; i < tp->irq_cnt; i++) { - struct tg3_napi *tnapi = &tp->napi[i]; - - /* SW status block */ - netdev_err(tp->dev, - "%d: Host status block [%08x:%08x:(%04x:%04x:%04x):(%04x:%04x)]\n", - i, - tnapi->hw_status->status, - tnapi->hw_status->status_tag, - tnapi->hw_status->rx_jumbo_consumer, - tnapi->hw_status->rx_consumer, - tnapi->hw_status->rx_mini_consumer, - tnapi->hw_status->idx[0].rx_producer, - tnapi->hw_status->idx[0].tx_consumer); - - netdev_err(tp->dev, - "%d: NAPI info [%08x:%08x:(%04x:%04x:%04x):%04x:(%04x:%04x:%04x:%04x)]\n", - i, - tnapi->last_tag, tnapi->last_irq_tag, - tnapi->tx_prod, tnapi->tx_cons, tnapi->tx_pending, - tnapi->rx_rcb_ptr, - tnapi->prodring.rx_std_prod_idx, - tnapi->prodring.rx_std_cons_idx, - tnapi->prodring.rx_jmb_prod_idx, - tnapi->prodring.rx_jmb_cons_idx); - } -} - -/* This is called whenever we suspect that the system chipset is re- - * ordering the sequence of MMIO to the tx send mailbox. The symptom - * is bogus tx completions. We try to recover by setting the - * TG3_FLAG_MBOX_WRITE_REORDER flag and resetting the chip later - * in the workqueue. - */ -static void tg3_tx_recover(struct tg3 *tp) -{ - BUG_ON(tg3_flag(tp, MBOX_WRITE_REORDER) || - tp->write32_tx_mbox == tg3_write_indirect_mbox); - - netdev_warn(tp->dev, - "The system may be re-ordering memory-mapped I/O " - "cycles to the network device, attempting to recover. " - "Please report the problem to the driver maintainer " - "and include system chipset information.\n"); - - tg3_flag_set(tp, TX_RECOVERY_PENDING); -} - -static inline u32 tg3_tx_avail(struct tg3_napi *tnapi) -{ - /* Tell compiler to fetch tx indices from memory. */ - barrier(); - return tnapi->tx_pending - - ((tnapi->tx_prod - tnapi->tx_cons) & (TG3_TX_RING_SIZE - 1)); -} - -/* Tigon3 never reports partial packet sends. So we do not - * need special logic to handle SKBs that have not had all - * of their frags sent yet, like SunGEM does. - */ -static void tg3_tx(struct tg3_napi *tnapi) -{ - struct tg3 *tp = tnapi->tp; - u32 hw_idx = tnapi->hw_status->idx[0].tx_consumer; - u32 sw_idx = tnapi->tx_cons; - struct netdev_queue *txq; - int index = tnapi - tp->napi; - unsigned int pkts_compl = 0, bytes_compl = 0; - - if (tg3_flag(tp, ENABLE_TSS)) - index--; - - txq = netdev_get_tx_queue(tp->dev, index); - - while (sw_idx != hw_idx) { - struct tg3_tx_ring_info *ri = &tnapi->tx_buffers[sw_idx]; - struct sk_buff *skb = ri->skb; - int i, tx_bug = 0; - - if (unlikely(skb == NULL)) { - tg3_tx_recover(tp); - return; - } - - if (tnapi->tx_ring[sw_idx].len_flags & TXD_FLAG_HWTSTAMP) { - struct skb_shared_hwtstamps timestamp; - u64 hwclock = tr32(TG3_TX_TSTAMP_LSB); - hwclock |= (u64)tr32(TG3_TX_TSTAMP_MSB) << 32; - - tg3_hwclock_to_timestamp(tp, hwclock, ×tamp); - - skb_tstamp_tx(skb, ×tamp); - } - - pci_unmap_single(tp->pdev, - dma_unmap_addr(ri, mapping), - skb_headlen(skb), - PCI_DMA_TODEVICE); - - ri->skb = NULL; - - while (ri->fragmented) { - ri->fragmented = false; - sw_idx = NEXT_TX(sw_idx); - ri = &tnapi->tx_buffers[sw_idx]; - } - - sw_idx = NEXT_TX(sw_idx); - - for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { - ri = &tnapi->tx_buffers[sw_idx]; - if (unlikely(ri->skb != NULL || sw_idx == hw_idx)) - tx_bug = 1; - - pci_unmap_page(tp->pdev, - dma_unmap_addr(ri, mapping), - skb_frag_size(&skb_shinfo(skb)->frags[i]), - PCI_DMA_TODEVICE); - - while (ri->fragmented) { - ri->fragmented = false; - sw_idx = NEXT_TX(sw_idx); - ri = &tnapi->tx_buffers[sw_idx]; - } - - sw_idx = NEXT_TX(sw_idx); - } - - pkts_compl++; - bytes_compl += skb->len; - - dev_consume_skb_any(skb); - - if (unlikely(tx_bug)) { - tg3_tx_recover(tp); - return; - } - } - - netdev_tx_completed_queue(txq, pkts_compl, bytes_compl); - - tnapi->tx_cons = sw_idx; - - /* Need to make the tx_cons update visible to tg3_start_xmit() - * before checking for netif_queue_stopped(). Without the - * memory barrier, there is a small possibility that tg3_start_xmit() - * will miss it and cause the queue to be stopped forever. - */ - smp_mb(); - - if (unlikely(netif_tx_queue_stopped(txq) && - (tg3_tx_avail(tnapi) > TG3_TX_WAKEUP_THRESH(tnapi)))) { - __netif_tx_lock(txq, smp_processor_id()); - if (netif_tx_queue_stopped(txq) && - (tg3_tx_avail(tnapi) > TG3_TX_WAKEUP_THRESH(tnapi))) - netif_tx_wake_queue(txq); - __netif_tx_unlock(txq); - } -} - -static void tg3_frag_free(bool is_frag, void *data) -{ - if (is_frag) - skb_free_frag(data); - else - kfree(data); -} - -static void tg3_rx_data_free(struct tg3 *tp, struct ring_info *ri, u32 map_sz) -{ - unsigned int skb_size = SKB_DATA_ALIGN(map_sz + TG3_RX_OFFSET(tp)) + - SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); - - if (!ri->data) - return; - - pci_unmap_single(tp->pdev, dma_unmap_addr(ri, mapping), - map_sz, PCI_DMA_FROMDEVICE); - tg3_frag_free(skb_size <= PAGE_SIZE, ri->data); - ri->data = NULL; -} - - -/* Returns size of skb allocated or < 0 on error. - * - * We only need to fill in the address because the other members - * of the RX descriptor are invariant, see tg3_init_rings. - * - * Note the purposeful assymetry of cpu vs. chip accesses. For - * posting buffers we only dirty the first cache line of the RX - * descriptor (containing the address). Whereas for the RX status - * buffers the cpu only reads the last cacheline of the RX descriptor - * (to fetch the error flags, vlan tag, checksum, and opaque cookie). - */ -static int tg3_alloc_rx_data(struct tg3 *tp, struct tg3_rx_prodring_set *tpr, - u32 opaque_key, u32 dest_idx_unmasked, - unsigned int *frag_size) -{ - struct tg3_rx_buffer_desc *desc; - struct ring_info *map; - u8 *data; - dma_addr_t mapping; - int skb_size, data_size, dest_idx; - - switch (opaque_key) { - case RXD_OPAQUE_RING_STD: - dest_idx = dest_idx_unmasked & tp->rx_std_ring_mask; - desc = &tpr->rx_std[dest_idx]; - map = &tpr->rx_std_buffers[dest_idx]; - data_size = tp->rx_pkt_map_sz; - break; - - case RXD_OPAQUE_RING_JUMBO: - dest_idx = dest_idx_unmasked & tp->rx_jmb_ring_mask; - desc = &tpr->rx_jmb[dest_idx].std; - map = &tpr->rx_jmb_buffers[dest_idx]; - data_size = TG3_RX_JMB_MAP_SZ; - break; - - default: - return -EINVAL; - } - - /* Do not overwrite any of the map or rp information - * until we are sure we can commit to a new buffer. - * - * Callers depend upon this behavior and assume that - * we leave everything unchanged if we fail. - */ - skb_size = SKB_DATA_ALIGN(data_size + TG3_RX_OFFSET(tp)) + - SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); - if (skb_size <= PAGE_SIZE) { - data = netdev_alloc_frag(skb_size); - *frag_size = skb_size; - } else { - data = kmalloc(skb_size, GFP_ATOMIC); - *frag_size = 0; - } - if (!data) - return -ENOMEM; - - mapping = pci_map_single(tp->pdev, - data + TG3_RX_OFFSET(tp), - data_size, - PCI_DMA_FROMDEVICE); - if (unlikely(pci_dma_mapping_error(tp->pdev, mapping))) { - tg3_frag_free(skb_size <= PAGE_SIZE, data); - return -EIO; - } - - map->data = data; - dma_unmap_addr_set(map, mapping, mapping); - - desc->addr_hi = ((u64)mapping >> 32); - desc->addr_lo = ((u64)mapping & 0xffffffff); - - return data_size; -} - -/* We only need to move over in the address because the other - * members of the RX descriptor are invariant. See notes above - * tg3_alloc_rx_data for full details. - */ -static void tg3_recycle_rx(struct tg3_napi *tnapi, - struct tg3_rx_prodring_set *dpr, - u32 opaque_key, int src_idx, - u32 dest_idx_unmasked) -{ - struct tg3 *tp = tnapi->tp; - struct tg3_rx_buffer_desc *src_desc, *dest_desc; - struct ring_info *src_map, *dest_map; - struct tg3_rx_prodring_set *spr = &tp->napi[0].prodring; - int dest_idx; - - switch (opaque_key) { - case RXD_OPAQUE_RING_STD: - dest_idx = dest_idx_unmasked & tp->rx_std_ring_mask; - dest_desc = &dpr->rx_std[dest_idx]; - dest_map = &dpr->rx_std_buffers[dest_idx]; - src_desc = &spr->rx_std[src_idx]; - src_map = &spr->rx_std_buffers[src_idx]; - break; - - case RXD_OPAQUE_RING_JUMBO: - dest_idx = dest_idx_unmasked & tp->rx_jmb_ring_mask; - dest_desc = &dpr->rx_jmb[dest_idx].std; - dest_map = &dpr->rx_jmb_buffers[dest_idx]; - src_desc = &spr->rx_jmb[src_idx].std; - src_map = &spr->rx_jmb_buffers[src_idx]; - break; - - default: - return; - } - - dest_map->data = src_map->data; - dma_unmap_addr_set(dest_map, mapping, - dma_unmap_addr(src_map, mapping)); - dest_desc->addr_hi = src_desc->addr_hi; - dest_desc->addr_lo = src_desc->addr_lo; - - /* Ensure that the update to the skb happens after the physical - * addresses have been transferred to the new BD location. - */ - smp_wmb(); - - src_map->data = NULL; -} - -/* The RX ring scheme is composed of multiple rings which post fresh - * buffers to the chip, and one special ring the chip uses to report - * status back to the host. - * - * The special ring reports the status of received packets to the - * host. The chip does not write into the original descriptor the - * RX buffer was obtained from. The chip simply takes the original - * descriptor as provided by the host, updates the status and length - * field, then writes this into the next status ring entry. - * - * Each ring the host uses to post buffers to the chip is described - * by a TG3_BDINFO entry in the chips SRAM area. When a packet arrives, - * it is first placed into the on-chip ram. When the packet's length - * is known, it walks down the TG3_BDINFO entries to select the ring. - * Each TG3_BDINFO specifies a MAXLEN field and the first TG3_BDINFO - * which is within the range of the new packet's length is chosen. - * - * The "separate ring for rx status" scheme may sound queer, but it makes - * sense from a cache coherency perspective. If only the host writes - * to the buffer post rings, and only the chip writes to the rx status - * rings, then cache lines never move beyond shared-modified state. - * If both the host and chip were to write into the same ring, cache line - * eviction could occur since both entities want it in an exclusive state. - */ -static int tg3_rx(struct tg3_napi *tnapi, int budget) -{ - struct tg3 *tp = tnapi->tp; - u32 work_mask, rx_std_posted = 0; - u32 std_prod_idx, jmb_prod_idx; - u32 sw_idx = tnapi->rx_rcb_ptr; - u16 hw_idx; - int received; - struct tg3_rx_prodring_set *tpr = &tnapi->prodring; - - hw_idx = *(tnapi->rx_rcb_prod_idx); - /* - * We need to order the read of hw_idx and the read of - * the opaque cookie. - */ - rmb(); - work_mask = 0; - received = 0; - std_prod_idx = tpr->rx_std_prod_idx; - jmb_prod_idx = tpr->rx_jmb_prod_idx; - while (sw_idx != hw_idx && budget > 0) { - struct ring_info *ri; - struct tg3_rx_buffer_desc *desc = &tnapi->rx_rcb[sw_idx]; - unsigned int len; - struct sk_buff *skb; - dma_addr_t dma_addr; - u32 opaque_key, desc_idx, *post_ptr; - u8 *data; - u64 tstamp = 0; - - desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK; - opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK; - if (opaque_key == RXD_OPAQUE_RING_STD) { - ri = &tp->napi[0].prodring.rx_std_buffers[desc_idx]; - dma_addr = dma_unmap_addr(ri, mapping); - data = ri->data; - post_ptr = &std_prod_idx; - rx_std_posted++; - } else if (opaque_key == RXD_OPAQUE_RING_JUMBO) { - ri = &tp->napi[0].prodring.rx_jmb_buffers[desc_idx]; - dma_addr = dma_unmap_addr(ri, mapping); - data = ri->data; - post_ptr = &jmb_prod_idx; - } else - goto next_pkt_nopost; - - work_mask |= opaque_key; - - if (desc->err_vlan & RXD_ERR_MASK) { - drop_it: - tg3_recycle_rx(tnapi, tpr, opaque_key, - desc_idx, *post_ptr); - drop_it_no_recycle: - /* Other statistics kept track of by card. */ - tp->rx_dropped++; - goto next_pkt; - } - - prefetch(data + TG3_RX_OFFSET(tp)); - len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - - ETH_FCS_LEN; - - if ((desc->type_flags & RXD_FLAG_PTPSTAT_MASK) == - RXD_FLAG_PTPSTAT_PTPV1 || - (desc->type_flags & RXD_FLAG_PTPSTAT_MASK) == - RXD_FLAG_PTPSTAT_PTPV2) { - tstamp = tr32(TG3_RX_TSTAMP_LSB); - tstamp |= (u64)tr32(TG3_RX_TSTAMP_MSB) << 32; - } - - if (len > TG3_RX_COPY_THRESH(tp)) { - int skb_size; - unsigned int frag_size; - - skb_size = tg3_alloc_rx_data(tp, tpr, opaque_key, - *post_ptr, &frag_size); - if (skb_size < 0) - goto drop_it; - - pci_unmap_single(tp->pdev, dma_addr, skb_size, - PCI_DMA_FROMDEVICE); - - /* Ensure that the update to the data happens - * after the usage of the old DMA mapping. - */ - smp_wmb(); - - ri->data = NULL; - - skb = build_skb(data, frag_size); - if (!skb) { - tg3_frag_free(frag_size != 0, data); - goto drop_it_no_recycle; - } - skb_reserve(skb, TG3_RX_OFFSET(tp)); - } else { - tg3_recycle_rx(tnapi, tpr, opaque_key, - desc_idx, *post_ptr); - - skb = netdev_alloc_skb(tp->dev, - len + TG3_RAW_IP_ALIGN); - if (skb == NULL) - goto drop_it_no_recycle; - - skb_reserve(skb, TG3_RAW_IP_ALIGN); - pci_dma_sync_single_for_cpu(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE); - memcpy(skb->data, - data + TG3_RX_OFFSET(tp), - len); - pci_dma_sync_single_for_device(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE); - } - - skb_put(skb, len); - if (tstamp) - tg3_hwclock_to_timestamp(tp, tstamp, - skb_hwtstamps(skb)); - - if ((tp->dev->features & NETIF_F_RXCSUM) && - (desc->type_flags & RXD_FLAG_TCPUDP_CSUM) && - (((desc->ip_tcp_csum & RXD_TCPCSUM_MASK) - >> RXD_TCPCSUM_SHIFT) == 0xffff)) - skb->ip_summed = CHECKSUM_UNNECESSARY; - else - skb_checksum_none_assert(skb); - - skb->protocol = eth_type_trans(skb, tp->dev); - - if (len > (tp->dev->mtu + ETH_HLEN) && - skb->protocol != htons(ETH_P_8021Q) && - skb->protocol != htons(ETH_P_8021AD)) { - dev_kfree_skb_any(skb); - goto drop_it_no_recycle; - } - - if (desc->type_flags & RXD_FLAG_VLAN && - !(tp->rx_mode & RX_MODE_KEEP_VLAN_TAG)) - __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), - desc->err_vlan & RXD_VLAN_MASK); - - napi_gro_receive(&tnapi->napi, skb); - - received++; - budget--; - -next_pkt: - (*post_ptr)++; - - if (unlikely(rx_std_posted >= tp->rx_std_max_post)) { - tpr->rx_std_prod_idx = std_prod_idx & - tp->rx_std_ring_mask; - tw32_rx_mbox(TG3_RX_STD_PROD_IDX_REG, - tpr->rx_std_prod_idx); - work_mask &= ~RXD_OPAQUE_RING_STD; - rx_std_posted = 0; - } -next_pkt_nopost: - sw_idx++; - sw_idx &= tp->rx_ret_ring_mask; - - /* Refresh hw_idx to see if there is new work */ - if (sw_idx == hw_idx) { - hw_idx = *(tnapi->rx_rcb_prod_idx); - rmb(); - } - } - - /* ACK the status ring. */ - tnapi->rx_rcb_ptr = sw_idx; - tw32_rx_mbox(tnapi->consmbox, sw_idx); - - /* Refill RX ring(s). */ - if (!tg3_flag(tp, ENABLE_RSS)) { - /* Sync BD data before updating mailbox */ - wmb(); - - if (work_mask & RXD_OPAQUE_RING_STD) { - tpr->rx_std_prod_idx = std_prod_idx & - tp->rx_std_ring_mask; - tw32_rx_mbox(TG3_RX_STD_PROD_IDX_REG, - tpr->rx_std_prod_idx); - } - if (work_mask & RXD_OPAQUE_RING_JUMBO) { - tpr->rx_jmb_prod_idx = jmb_prod_idx & - tp->rx_jmb_ring_mask; - tw32_rx_mbox(TG3_RX_JMB_PROD_IDX_REG, - tpr->rx_jmb_prod_idx); - } - mmiowb(); - } else if (work_mask) { - /* rx_std_buffers[] and rx_jmb_buffers[] entries must be - * updated before the producer indices can be updated. - */ - smp_wmb(); - - tpr->rx_std_prod_idx = std_prod_idx & tp->rx_std_ring_mask; - tpr->rx_jmb_prod_idx = jmb_prod_idx & tp->rx_jmb_ring_mask; - - if (tnapi != &tp->napi[1]) { - tp->rx_refill = true; - napi_schedule(&tp->napi[1].napi); - } - } - - return received; -} - -static void tg3_poll_link(struct tg3 *tp) -{ - /* handle link change and other phy events */ - if (!(tg3_flag(tp, USE_LINKCHG_REG) || tg3_flag(tp, POLL_SERDES))) { - struct tg3_hw_status *sblk = tp->napi[0].hw_status; - - if (sblk->status & SD_STATUS_LINK_CHG) { - sblk->status = SD_STATUS_UPDATED | - (sblk->status & ~SD_STATUS_LINK_CHG); - spin_lock(&tp->lock); - if (tg3_flag(tp, USE_PHYLIB)) { - tw32_f(MAC_STATUS, - (MAC_STATUS_SYNC_CHANGED | - MAC_STATUS_CFG_CHANGED | - MAC_STATUS_MI_COMPLETION | - MAC_STATUS_LNKSTATE_CHANGED)); - udelay(40); - } else - tg3_setup_phy(tp, false); - spin_unlock(&tp->lock); - } - } -} - -static int tg3_rx_prodring_xfer(struct tg3 *tp, - struct tg3_rx_prodring_set *dpr, - struct tg3_rx_prodring_set *spr) -{ - u32 si, di, cpycnt, src_prod_idx; - int i, err = 0; - - while (1) { - src_prod_idx = spr->rx_std_prod_idx; - - /* Make sure updates to the rx_std_buffers[] entries and the - * standard producer index are seen in the correct order. - */ - smp_rmb(); - - if (spr->rx_std_cons_idx == src_prod_idx) - break; - - if (spr->rx_std_cons_idx < src_prod_idx) - cpycnt = src_prod_idx - spr->rx_std_cons_idx; - else - cpycnt = tp->rx_std_ring_mask + 1 - - spr->rx_std_cons_idx; - - cpycnt = min(cpycnt, - tp->rx_std_ring_mask + 1 - dpr->rx_std_prod_idx); - - si = spr->rx_std_cons_idx; - di = dpr->rx_std_prod_idx; - - for (i = di; i < di + cpycnt; i++) { - if (dpr->rx_std_buffers[i].data) { - cpycnt = i - di; - err = -ENOSPC; - break; - } - } - - if (!cpycnt) - break; - - /* Ensure that updates to the rx_std_buffers ring and the - * shadowed hardware producer ring from tg3_recycle_skb() are - * ordered correctly WRT the skb check above. - */ - smp_rmb(); - - memcpy(&dpr->rx_std_buffers[di], - &spr->rx_std_buffers[si], - cpycnt * sizeof(struct ring_info)); - - for (i = 0; i < cpycnt; i++, di++, si++) { - struct tg3_rx_buffer_desc *sbd, *dbd; - sbd = &spr->rx_std[si]; - dbd = &dpr->rx_std[di]; - dbd->addr_hi = sbd->addr_hi; - dbd->addr_lo = sbd->addr_lo; - } - - spr->rx_std_cons_idx = (spr->rx_std_cons_idx + cpycnt) & - tp->rx_std_ring_mask; - dpr->rx_std_prod_idx = (dpr->rx_std_prod_idx + cpycnt) & - tp->rx_std_ring_mask; - } - - while (1) { - src_prod_idx = spr->rx_jmb_prod_idx; - - /* Make sure updates to the rx_jmb_buffers[] entries and - * the jumbo producer index are seen in the correct order. - */ - smp_rmb(); - - if (spr->rx_jmb_cons_idx == src_prod_idx) - break; - - if (spr->rx_jmb_cons_idx < src_prod_idx) - cpycnt = src_prod_idx - spr->rx_jmb_cons_idx; - else - cpycnt = tp->rx_jmb_ring_mask + 1 - - spr->rx_jmb_cons_idx; - - cpycnt = min(cpycnt, - tp->rx_jmb_ring_mask + 1 - dpr->rx_jmb_prod_idx); - - si = spr->rx_jmb_cons_idx; - di = dpr->rx_jmb_prod_idx; - - for (i = di; i < di + cpycnt; i++) { - if (dpr->rx_jmb_buffers[i].data) { - cpycnt = i - di; - err = -ENOSPC; - break; - } - } - - if (!cpycnt) - break; - - /* Ensure that updates to the rx_jmb_buffers ring and the - * shadowed hardware producer ring from tg3_recycle_skb() are - * ordered correctly WRT the skb check above. - */ - smp_rmb(); - - memcpy(&dpr->rx_jmb_buffers[di], - &spr->rx_jmb_buffers[si], - cpycnt * sizeof(struct ring_info)); - - for (i = 0; i < cpycnt; i++, di++, si++) { - struct tg3_rx_buffer_desc *sbd, *dbd; - sbd = &spr->rx_jmb[si].std; - dbd = &dpr->rx_jmb[di].std; - dbd->addr_hi = sbd->addr_hi; - dbd->addr_lo = sbd->addr_lo; - } - - spr->rx_jmb_cons_idx = (spr->rx_jmb_cons_idx + cpycnt) & - tp->rx_jmb_ring_mask; - dpr->rx_jmb_prod_idx = (dpr->rx_jmb_prod_idx + cpycnt) & - tp->rx_jmb_ring_mask; - } - - return err; -} - -static int tg3_poll_work(struct tg3_napi *tnapi, int work_done, int budget) -{ - struct tg3 *tp = tnapi->tp; - - /* run TX completion thread */ - if (tnapi->hw_status->idx[0].tx_consumer != tnapi->tx_cons) { - tg3_tx(tnapi); - if (unlikely(tg3_flag(tp, TX_RECOVERY_PENDING))) - return work_done; - } - - if (!tnapi->rx_rcb_prod_idx) - return work_done; - - /* run RX thread, within the bounds set by NAPI. - * All RX "locking" is done by ensuring outside - * code synchronizes with tg3->napi.poll() - */ - if (*(tnapi->rx_rcb_prod_idx) != tnapi->rx_rcb_ptr) - work_done += tg3_rx(tnapi, budget - work_done); - - if (tg3_flag(tp, ENABLE_RSS) && tnapi == &tp->napi[1]) { - struct tg3_rx_prodring_set *dpr = &tp->napi[0].prodring; - int i, err = 0; - u32 std_prod_idx = dpr->rx_std_prod_idx; - u32 jmb_prod_idx = dpr->rx_jmb_prod_idx; - - tp->rx_refill = false; - for (i = 1; i <= tp->rxq_cnt; i++) - err |= tg3_rx_prodring_xfer(tp, dpr, - &tp->napi[i].prodring); - - wmb(); - - if (std_prod_idx != dpr->rx_std_prod_idx) - tw32_rx_mbox(TG3_RX_STD_PROD_IDX_REG, - dpr->rx_std_prod_idx); - - if (jmb_prod_idx != dpr->rx_jmb_prod_idx) - tw32_rx_mbox(TG3_RX_JMB_PROD_IDX_REG, - dpr->rx_jmb_prod_idx); - - mmiowb(); - - if (err) - tw32_f(HOSTCC_MODE, tp->coal_now); - } - - return work_done; -} - -static inline void tg3_reset_task_schedule(struct tg3 *tp) -{ - if (!test_and_set_bit(TG3_FLAG_RESET_TASK_PENDING, tp->tg3_flags)) - schedule_work(&tp->reset_task); -} - -static inline void tg3_reset_task_cancel(struct tg3 *tp) -{ - cancel_work_sync(&tp->reset_task); - tg3_flag_clear(tp, RESET_TASK_PENDING); - tg3_flag_clear(tp, TX_RECOVERY_PENDING); -} - -static int tg3_poll_msix(struct napi_struct *napi, int budget) -{ - struct tg3_napi *tnapi = container_of(napi, struct tg3_napi, napi); - struct tg3 *tp = tnapi->tp; - int work_done = 0; - struct tg3_hw_status *sblk = tnapi->hw_status; - - while (1) { - work_done = tg3_poll_work(tnapi, work_done, budget); - - if (unlikely(tg3_flag(tp, TX_RECOVERY_PENDING))) - goto tx_recovery; - - if (unlikely(work_done >= budget)) - break; - - /* tp->last_tag is used in tg3_int_reenable() below - * to tell the hw how much work has been processed, - * so we must read it before checking for more work. - */ - tnapi->last_tag = sblk->status_tag; - tnapi->last_irq_tag = tnapi->last_tag; - rmb(); - - /* check for RX/TX work to do */ - if (likely(sblk->idx[0].tx_consumer == tnapi->tx_cons && - *(tnapi->rx_rcb_prod_idx) == tnapi->rx_rcb_ptr)) { - - /* This test here is not race free, but will reduce - * the number of interrupts by looping again. - */ - if (tnapi == &tp->napi[1] && tp->rx_refill) - continue; - - napi_complete_done(napi, work_done); - /* Reenable interrupts. */ - tw32_mailbox(tnapi->int_mbox, tnapi->last_tag << 24); - - /* This test here is synchronized by napi_schedule() - * and napi_complete() to close the race condition. - */ - if (unlikely(tnapi == &tp->napi[1] && tp->rx_refill)) { - tw32(HOSTCC_MODE, tp->coalesce_mode | - HOSTCC_MODE_ENABLE | - tnapi->coal_now); - } - mmiowb(); - break; - } - } - - return work_done; - -tx_recovery: - /* work_done is guaranteed to be less than budget. */ - napi_complete(napi); - tg3_reset_task_schedule(tp); - return work_done; -} - -static void tg3_process_error(struct tg3 *tp) -{ - u32 val; - bool real_error = false; - - if (tg3_flag(tp, ERROR_PROCESSED)) - return; - - /* Check Flow Attention register */ - val = tr32(HOSTCC_FLOW_ATTN); - if (val & ~HOSTCC_FLOW_ATTN_MBUF_LWM) { - netdev_err(tp->dev, "FLOW Attention error. Resetting chip.\n"); - real_error = true; - } - - if (tr32(MSGINT_STATUS) & ~MSGINT_STATUS_MSI_REQ) { - netdev_err(tp->dev, "MSI Status error. Resetting chip.\n"); - real_error = true; - } - - if (tr32(RDMAC_STATUS) || tr32(WDMAC_STATUS)) { - netdev_err(tp->dev, "DMA Status error. Resetting chip.\n"); - real_error = true; - } - - if (!real_error) - return; - - tg3_dump_state(tp); - - tg3_flag_set(tp, ERROR_PROCESSED); - tg3_reset_task_schedule(tp); -} - -static int tg3_poll(struct napi_struct *napi, int budget) -{ - struct tg3_napi *tnapi = container_of(napi, struct tg3_napi, napi); - struct tg3 *tp = tnapi->tp; - int work_done = 0; - struct tg3_hw_status *sblk = tnapi->hw_status; - - while (1) { - if (sblk->status & SD_STATUS_ERROR) - tg3_process_error(tp); - - tg3_poll_link(tp); - - work_done = tg3_poll_work(tnapi, work_done, budget); - - if (unlikely(tg3_flag(tp, TX_RECOVERY_PENDING))) - goto tx_recovery; - - if (unlikely(work_done >= budget)) - break; - - if (tg3_flag(tp, TAGGED_STATUS)) { - /* tp->last_tag is used in tg3_int_reenable() below - * to tell the hw how much work has been processed, - * so we must read it before checking for more work. - */ - tnapi->last_tag = sblk->status_tag; - tnapi->last_irq_tag = tnapi->last_tag; - rmb(); - } else - sblk->status &= ~SD_STATUS_UPDATED; - - if (likely(!tg3_has_work(tnapi))) { - napi_complete_done(napi, work_done); - tg3_int_reenable(tnapi); - break; - } - } - - return work_done; - -tx_recovery: - /* work_done is guaranteed to be less than budget. */ - napi_complete(napi); - tg3_reset_task_schedule(tp); - return work_done; -} - -static void tg3_napi_disable(struct tg3 *tp) -{ - int i; - - for (i = tp->irq_cnt - 1; i >= 0; i--) - napi_disable(&tp->napi[i].napi); -} - -static void tg3_napi_enable(struct tg3 *tp) -{ - int i; - - for (i = 0; i < tp->irq_cnt; i++) - napi_enable(&tp->napi[i].napi); -} - -static void tg3_napi_init(struct tg3 *tp) -{ - int i; - - netif_napi_add(tp->dev, &tp->napi[0].napi, tg3_poll, 64); - for (i = 1; i < tp->irq_cnt; i++) - netif_napi_add(tp->dev, &tp->napi[i].napi, tg3_poll_msix, 64); -} - -static void tg3_napi_fini(struct tg3 *tp) -{ - int i; - - for (i = 0; i < tp->irq_cnt; i++) - netif_napi_del(&tp->napi[i].napi); -} - -static inline void tg3_netif_stop(struct tg3 *tp) -{ - netif_trans_update(tp->dev); /* prevent tx timeout */ - tg3_napi_disable(tp); - netif_carrier_off(tp->dev); - netif_tx_disable(tp->dev); -} - -/* tp->lock must be held */ -static inline void tg3_netif_start(struct tg3 *tp) -{ - tg3_ptp_resume(tp); - - /* NOTE: unconditional netif_tx_wake_all_queues is only - * appropriate so long as all callers are assured to - * have free tx slots (such as after tg3_init_hw) - */ - netif_tx_wake_all_queues(tp->dev); - - if (tp->link_up) - netif_carrier_on(tp->dev); - - tg3_napi_enable(tp); - tp->napi[0].hw_status->status |= SD_STATUS_UPDATED; - tg3_enable_ints(tp); -} - -static void tg3_irq_quiesce(struct tg3 *tp) - __releases(tp->lock) - __acquires(tp->lock) -{ - int i; - - BUG_ON(tp->irq_sync); - - tp->irq_sync = 1; - smp_mb(); - - spin_unlock_bh(&tp->lock); - - for (i = 0; i < tp->irq_cnt; i++) - synchronize_irq(tp->napi[i].irq_vec); - - spin_lock_bh(&tp->lock); -} - -/* Fully shutdown all tg3 driver activity elsewhere in the system. - * If irq_sync is non-zero, then the IRQ handler must be synchronized - * with as well. Most of the time, this is not necessary except when - * shutting down the device. - */ -static inline void tg3_full_lock(struct tg3 *tp, int irq_sync) -{ - spin_lock_bh(&tp->lock); - if (irq_sync) - tg3_irq_quiesce(tp); -} - -static inline void tg3_full_unlock(struct tg3 *tp) -{ - spin_unlock_bh(&tp->lock); -} - -/* One-shot MSI handler - Chip automatically disables interrupt - * after sending MSI so driver doesn't have to do it. - */ -static irqreturn_t tg3_msi_1shot(int irq, void *dev_id) -{ - struct tg3_napi *tnapi = dev_id; - struct tg3 *tp = tnapi->tp; - - prefetch(tnapi->hw_status); - if (tnapi->rx_rcb) - prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]); - - if (likely(!tg3_irq_sync(tp))) - napi_schedule(&tnapi->napi); - - return IRQ_HANDLED; -} - -/* MSI ISR - No need to check for interrupt sharing and no need to - * flush status block and interrupt mailbox. PCI ordering rules - * guarantee that MSI will arrive after the status block. - */ -static irqreturn_t tg3_msi(int irq, void *dev_id) -{ - struct tg3_napi *tnapi = dev_id; - struct tg3 *tp = tnapi->tp; - - prefetch(tnapi->hw_status); - if (tnapi->rx_rcb) - prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]); - /* - * Writing any value to intr-mbox-0 clears PCI INTA# and - * chip-internal interrupt pending events. - * Writing non-zero to intr-mbox-0 additional tells the - * NIC to stop sending us irqs, engaging "in-intr-handler" - * event coalescing. - */ - tw32_mailbox(tnapi->int_mbox, 0x00000001); - if (likely(!tg3_irq_sync(tp))) - napi_schedule(&tnapi->napi); - - return IRQ_RETVAL(1); -} - -static irqreturn_t tg3_interrupt(int irq, void *dev_id) -{ - struct tg3_napi *tnapi = dev_id; - struct tg3 *tp = tnapi->tp; - struct tg3_hw_status *sblk = tnapi->hw_status; - unsigned int handled = 1; - - /* In INTx mode, it is possible for the interrupt to arrive at - * the CPU before the status block posted prior to the interrupt. - * Reading the PCI State register will confirm whether the - * interrupt is ours and will flush the status block. - */ - if (unlikely(!(sblk->status & SD_STATUS_UPDATED))) { - if (tg3_flag(tp, CHIP_RESETTING) || - (tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) { - handled = 0; - goto out; - } - } - - /* - * Writing any value to intr-mbox-0 clears PCI INTA# and - * chip-internal interrupt pending events. - * Writing non-zero to intr-mbox-0 additional tells the - * NIC to stop sending us irqs, engaging "in-intr-handler" - * event coalescing. - * - * Flush the mailbox to de-assert the IRQ immediately to prevent - * spurious interrupts. The flush impacts performance but - * excessive spurious interrupts can be worse in some cases. - */ - tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001); - if (tg3_irq_sync(tp)) - goto out; - sblk->status &= ~SD_STATUS_UPDATED; - if (likely(tg3_has_work(tnapi))) { - prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]); - napi_schedule(&tnapi->napi); - } else { - /* No work, shared interrupt perhaps? re-enable - * interrupts, and flush that PCI write - */ - tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, - 0x00000000); - } -out: - return IRQ_RETVAL(handled); -} - -static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id) -{ - struct tg3_napi *tnapi = dev_id; - struct tg3 *tp = tnapi->tp; - struct tg3_hw_status *sblk = tnapi->hw_status; - unsigned int handled = 1; - - /* In INTx mode, it is possible for the interrupt to arrive at - * the CPU before the status block posted prior to the interrupt. - * Reading the PCI State register will confirm whether the - * interrupt is ours and will flush the status block. - */ - if (unlikely(sblk->status_tag == tnapi->last_irq_tag)) { - if (tg3_flag(tp, CHIP_RESETTING) || - (tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) { - handled = 0; - goto out; - } - } - - /* - * writing any value to intr-mbox-0 clears PCI INTA# and - * chip-internal interrupt pending events. - * writing non-zero to intr-mbox-0 additional tells the - * NIC to stop sending us irqs, engaging "in-intr-handler" - * event coalescing. - * - * Flush the mailbox to de-assert the IRQ immediately to prevent - * spurious interrupts. The flush impacts performance but - * excessive spurious interrupts can be worse in some cases. - */ - tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001); - - /* - * In a shared interrupt configuration, sometimes other devices' - * interrupts will scream. We record the current status tag here - * so that the above check can report that the screaming interrupts - * are unhandled. Eventually they will be silenced. - */ - tnapi->last_irq_tag = sblk->status_tag; - - if (tg3_irq_sync(tp)) - goto out; - - prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]); - - napi_schedule(&tnapi->napi); - -out: - return IRQ_RETVAL(handled); -} - -/* ISR for interrupt test */ -static irqreturn_t tg3_test_isr(int irq, void *dev_id) -{ - struct tg3_napi *tnapi = dev_id; - struct tg3 *tp = tnapi->tp; - struct tg3_hw_status *sblk = tnapi->hw_status; - - if ((sblk->status & SD_STATUS_UPDATED) || - !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) { - tg3_disable_ints(tp); - return IRQ_RETVAL(1); - } - return IRQ_RETVAL(0); -} - -#ifdef CONFIG_NET_POLL_CONTROLLER -static void tg3_poll_controller(struct net_device *dev) -{ - int i; - struct tg3 *tp = netdev_priv(dev); - - if (tg3_irq_sync(tp)) - return; - - for (i = 0; i < tp->irq_cnt; i++) - tg3_interrupt(tp->napi[i].irq_vec, &tp->napi[i]); -} -#endif - -static void tg3_tx_timeout(struct net_device *dev) -{ - struct tg3 *tp = netdev_priv(dev); - - if (netif_msg_tx_err(tp)) { - netdev_err(dev, "transmit timed out, resetting\n"); - tg3_dump_state(tp); - } - - tg3_reset_task_schedule(tp); -} - -/* Test for DMA buffers crossing any 4GB boundaries: 4G, 8G, etc */ -static inline int tg3_4g_overflow_test(dma_addr_t mapping, int len) -{ - u32 base = (u32) mapping & 0xffffffff; - - return base + len + 8 < base; -} - -/* Test for TSO DMA buffers that cross into regions which are within MSS bytes - * of any 4GB boundaries: 4G, 8G, etc - */ -static inline int tg3_4g_tso_overflow_test(struct tg3 *tp, dma_addr_t mapping, - u32 len, u32 mss) -{ - if (tg3_asic_rev(tp) == ASIC_REV_5762 && mss) { - u32 base = (u32) mapping & 0xffffffff; - - return ((base + len + (mss & 0x3fff)) < base); - } - return 0; -} - -/* Test for DMA addresses > 40-bit */ -static inline int tg3_40bit_overflow_test(struct tg3 *tp, dma_addr_t mapping, - int len) -{ -#if defined(CONFIG_HIGHMEM) && (BITS_PER_LONG == 64) - if (tg3_flag(tp, 40BIT_DMA_BUG)) - return ((u64) mapping + len) > DMA_BIT_MASK(40); - return 0; -#else - return 0; -#endif -} - -static inline void tg3_tx_set_bd(struct tg3_tx_buffer_desc *txbd, - dma_addr_t mapping, u32 len, u32 flags, - u32 mss, u32 vlan) -{ - txbd->addr_hi = ((u64) mapping >> 32); - txbd->addr_lo = ((u64) mapping & 0xffffffff); - txbd->len_flags = (len << TXD_LEN_SHIFT) | (flags & 0x0000ffff); - txbd->vlan_tag = (mss << TXD_MSS_SHIFT) | (vlan << TXD_VLAN_TAG_SHIFT); -} - -static bool tg3_tx_frag_set(struct tg3_napi *tnapi, u32 *entry, u32 *budget, - dma_addr_t map, u32 len, u32 flags, - u32 mss, u32 vlan) -{ - struct tg3 *tp = tnapi->tp; - bool hwbug = false; - - if (tg3_flag(tp, SHORT_DMA_BUG) && len <= 8) - hwbug = true; - - if (tg3_4g_overflow_test(map, len)) - hwbug = true; - - if (tg3_4g_tso_overflow_test(tp, map, len, mss)) - hwbug = true; - - if (tg3_40bit_overflow_test(tp, map, len)) - hwbug = true; - - if (tp->dma_limit) { - u32 prvidx = *entry; - u32 tmp_flag = flags & ~TXD_FLAG_END; - while (len > tp->dma_limit && *budget) { - u32 frag_len = tp->dma_limit; - len -= tp->dma_limit; - - /* Avoid the 8byte DMA problem */ - if (len <= 8) { - len += tp->dma_limit / 2; - frag_len = tp->dma_limit / 2; - } - - tnapi->tx_buffers[*entry].fragmented = true; - - tg3_tx_set_bd(&tnapi->tx_ring[*entry], map, - frag_len, tmp_flag, mss, vlan); - *budget -= 1; - prvidx = *entry; - *entry = NEXT_TX(*entry); - - map += frag_len; - } - - if (len) { - if (*budget) { - tg3_tx_set_bd(&tnapi->tx_ring[*entry], map, - len, flags, mss, vlan); - *budget -= 1; - *entry = NEXT_TX(*entry); - } else { - hwbug = true; - tnapi->tx_buffers[prvidx].fragmented = false; - } - } - } else { - tg3_tx_set_bd(&tnapi->tx_ring[*entry], map, - len, flags, mss, vlan); - *entry = NEXT_TX(*entry); - } - - return hwbug; -} - -static void tg3_tx_skb_unmap(struct tg3_napi *tnapi, u32 entry, int last) -{ - int i; - struct sk_buff *skb; - struct tg3_tx_ring_info *txb = &tnapi->tx_buffers[entry]; - - skb = txb->skb; - txb->skb = NULL; - - pci_unmap_single(tnapi->tp->pdev, - dma_unmap_addr(txb, mapping), - skb_headlen(skb), - PCI_DMA_TODEVICE); - - while (txb->fragmented) { - txb->fragmented = false; - entry = NEXT_TX(entry); - txb = &tnapi->tx_buffers[entry]; - } - - for (i = 0; i <= last; i++) { - const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; - - entry = NEXT_TX(entry); - txb = &tnapi->tx_buffers[entry]; - - pci_unmap_page(tnapi->tp->pdev, - dma_unmap_addr(txb, mapping), - skb_frag_size(frag), PCI_DMA_TODEVICE); - - while (txb->fragmented) { - txb->fragmented = false; - entry = NEXT_TX(entry); - txb = &tnapi->tx_buffers[entry]; - } - } -} - -/* Workaround 4GB and 40-bit hardware DMA bugs. */ -static int tigon3_dma_hwbug_workaround(struct tg3_napi *tnapi, - struct sk_buff **pskb, - u32 *entry, u32 *budget, - u32 base_flags, u32 mss, u32 vlan) -{ - struct tg3 *tp = tnapi->tp; - struct sk_buff *new_skb, *skb = *pskb; - dma_addr_t new_addr = 0; - int ret = 0; - - if (tg3_asic_rev(tp) != ASIC_REV_5701) - new_skb = skb_copy(skb, GFP_ATOMIC); - else { - int more_headroom = 4 - ((unsigned long)skb->data & 3); - - new_skb = skb_copy_expand(skb, - skb_headroom(skb) + more_headroom, - skb_tailroom(skb), GFP_ATOMIC); - } - - if (!new_skb) { - ret = -1; - } else { - /* New SKB is guaranteed to be linear. */ - new_addr = pci_map_single(tp->pdev, new_skb->data, new_skb->len, - PCI_DMA_TODEVICE); - /* Make sure the mapping succeeded */ - if (pci_dma_mapping_error(tp->pdev, new_addr)) { - dev_kfree_skb_any(new_skb); - ret = -1; - } else { - u32 save_entry = *entry; - - base_flags |= TXD_FLAG_END; - - tnapi->tx_buffers[*entry].skb = new_skb; - dma_unmap_addr_set(&tnapi->tx_buffers[*entry], - mapping, new_addr); - - if (tg3_tx_frag_set(tnapi, entry, budget, new_addr, - new_skb->len, base_flags, - mss, vlan)) { - tg3_tx_skb_unmap(tnapi, save_entry, -1); - dev_kfree_skb_any(new_skb); - ret = -1; - } - } - } - - dev_consume_skb_any(skb); - *pskb = new_skb; - return ret; -} - -static bool tg3_tso_bug_gso_check(struct tg3_napi *tnapi, struct sk_buff *skb) -{ - /* Check if we will never have enough descriptors, - * as gso_segs can be more than current ring size - */ - return skb_shinfo(skb)->gso_segs < tnapi->tx_pending / 3; -} - -static netdev_tx_t tg3_start_xmit(struct sk_buff *, struct net_device *); - -/* Use GSO to workaround all TSO packets that meet HW bug conditions - * indicated in tg3_tx_frag_set() - */ -static int tg3_tso_bug(struct tg3 *tp, struct tg3_napi *tnapi, - struct netdev_queue *txq, struct sk_buff *skb) -{ - struct sk_buff *segs, *nskb; - u32 frag_cnt_est = skb_shinfo(skb)->gso_segs * 3; - - /* Estimate the number of fragments in the worst case */ - if (unlikely(tg3_tx_avail(tnapi) <= frag_cnt_est)) { - netif_tx_stop_queue(txq); - - /* netif_tx_stop_queue() must be done before checking - * checking tx index in tg3_tx_avail() below, because in - * tg3_tx(), we update tx index before checking for - * netif_tx_queue_stopped(). - */ - smp_mb(); - if (tg3_tx_avail(tnapi) <= frag_cnt_est) - return NETDEV_TX_BUSY; - - netif_tx_wake_queue(txq); - } - - segs = skb_gso_segment(skb, tp->dev->features & - ~(NETIF_F_TSO | NETIF_F_TSO6)); - if (IS_ERR(segs) || !segs) - goto tg3_tso_bug_end; - - do { - nskb = segs; - segs = segs->next; - nskb->next = NULL; - tg3_start_xmit(nskb, tp->dev); - } while (segs); - -tg3_tso_bug_end: - dev_consume_skb_any(skb); - - return NETDEV_TX_OK; -} - -/* hard_start_xmit for all devices */ -static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) -{ - struct tg3 *tp = netdev_priv(dev); - u32 len, entry, base_flags, mss, vlan = 0; - u32 budget; - int i = -1, would_hit_hwbug; - dma_addr_t mapping; - struct tg3_napi *tnapi; - struct netdev_queue *txq; - unsigned int last; - struct iphdr *iph = NULL; - struct tcphdr *tcph = NULL; - __sum16 tcp_csum = 0, ip_csum = 0; - __be16 ip_tot_len = 0; - - txq = netdev_get_tx_queue(dev, skb_get_queue_mapping(skb)); - tnapi = &tp->napi[skb_get_queue_mapping(skb)]; - if (tg3_flag(tp, ENABLE_TSS)) - tnapi++; - - budget = tg3_tx_avail(tnapi); - - /* We are running in BH disabled context with netif_tx_lock - * and TX reclaim runs via tp->napi.poll inside of a software - * interrupt. Furthermore, IRQ processing runs lockless so we have - * no IRQ context deadlocks to worry about either. Rejoice! - */ - if (unlikely(budget <= (skb_shinfo(skb)->nr_frags + 1))) { - if (!netif_tx_queue_stopped(txq)) { - netif_tx_stop_queue(txq); - - /* This is a hard error, log it. */ - netdev_err(dev, - "BUG! Tx Ring full when queue awake!\n"); - } - return NETDEV_TX_BUSY; - } - - entry = tnapi->tx_prod; - base_flags = 0; - - mss = skb_shinfo(skb)->gso_size; - if (mss) { - u32 tcp_opt_len, hdr_len; - - if (skb_cow_head(skb, 0)) - goto drop; - - iph = ip_hdr(skb); - tcp_opt_len = tcp_optlen(skb); - - hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb) - ETH_HLEN; - - /* HW/FW can not correctly segment packets that have been - * vlan encapsulated. - */ - if (skb->protocol == htons(ETH_P_8021Q) || - skb->protocol == htons(ETH_P_8021AD)) { - if (tg3_tso_bug_gso_check(tnapi, skb)) - return tg3_tso_bug(tp, tnapi, txq, skb); - goto drop; - } - - if (!skb_is_gso_v6(skb)) { - if (unlikely((ETH_HLEN + hdr_len) > 80) && - tg3_flag(tp, TSO_BUG)) { - if (tg3_tso_bug_gso_check(tnapi, skb)) - return tg3_tso_bug(tp, tnapi, txq, skb); - goto drop; - } - ip_csum = iph->check; - ip_tot_len = iph->tot_len; - iph->check = 0; - iph->tot_len = htons(mss + hdr_len); - } - - base_flags |= (TXD_FLAG_CPU_PRE_DMA | - TXD_FLAG_CPU_POST_DMA); - - tcph = tcp_hdr(skb); - tcp_csum = tcph->check; - - if (tg3_flag(tp, HW_TSO_1) || - tg3_flag(tp, HW_TSO_2) || - tg3_flag(tp, HW_TSO_3)) { - tcph->check = 0; - base_flags &= ~TXD_FLAG_TCPUDP_CSUM; - } else { - tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, - 0, IPPROTO_TCP, 0); - } - - if (tg3_flag(tp, HW_TSO_3)) { - mss |= (hdr_len & 0xc) << 12; - if (hdr_len & 0x10) - base_flags |= 0x00000010; - base_flags |= (hdr_len & 0x3e0) << 5; - } else if (tg3_flag(tp, HW_TSO_2)) - mss |= hdr_len << 9; - else if (tg3_flag(tp, HW_TSO_1) || - tg3_asic_rev(tp) == ASIC_REV_5705) { - if (tcp_opt_len || iph->ihl > 5) { - int tsflags; - - tsflags = (iph->ihl - 5) + (tcp_opt_len >> 2); - mss |= (tsflags << 11); - } - } else { - if (tcp_opt_len || iph->ihl > 5) { - int tsflags; - - tsflags = (iph->ihl - 5) + (tcp_opt_len >> 2); - base_flags |= tsflags << 12; - } - } - } else if (skb->ip_summed == CHECKSUM_PARTIAL) { - /* HW/FW can not correctly checksum packets that have been - * vlan encapsulated. - */ - if (skb->protocol == htons(ETH_P_8021Q) || - skb->protocol == htons(ETH_P_8021AD)) { - if (skb_checksum_help(skb)) - goto drop; - } else { - base_flags |= TXD_FLAG_TCPUDP_CSUM; - } - } - - if (tg3_flag(tp, USE_JUMBO_BDFLAG) && - !mss && skb->len > VLAN_ETH_FRAME_LEN) - base_flags |= TXD_FLAG_JMB_PKT; - - if (skb_vlan_tag_present(skb)) { - base_flags |= TXD_FLAG_VLAN; - vlan = skb_vlan_tag_get(skb); - } - - if ((unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) && - tg3_flag(tp, TX_TSTAMP_EN)) { - skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; - base_flags |= TXD_FLAG_HWTSTAMP; - } - - len = skb_headlen(skb); - - mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE); - if (pci_dma_mapping_error(tp->pdev, mapping)) - goto drop; - - - tnapi->tx_buffers[entry].skb = skb; - dma_unmap_addr_set(&tnapi->tx_buffers[entry], mapping, mapping); - - would_hit_hwbug = 0; - - if (tg3_flag(tp, 5701_DMA_BUG)) - would_hit_hwbug = 1; - - if (tg3_tx_frag_set(tnapi, &entry, &budget, mapping, len, base_flags | - ((skb_shinfo(skb)->nr_frags == 0) ? TXD_FLAG_END : 0), - mss, vlan)) { - would_hit_hwbug = 1; - } else if (skb_shinfo(skb)->nr_frags > 0) { - u32 tmp_mss = mss; - - if (!tg3_flag(tp, HW_TSO_1) && - !tg3_flag(tp, HW_TSO_2) && - !tg3_flag(tp, HW_TSO_3)) - tmp_mss = 0; - - /* Now loop through additional data - * fragments, and queue them. - */ - last = skb_shinfo(skb)->nr_frags - 1; - for (i = 0; i <= last; i++) { - skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; - - len = skb_frag_size(frag); - mapping = skb_frag_dma_map(&tp->pdev->dev, frag, 0, - len, DMA_TO_DEVICE); - - tnapi->tx_buffers[entry].skb = NULL; - dma_unmap_addr_set(&tnapi->tx_buffers[entry], mapping, - mapping); - if (dma_mapping_error(&tp->pdev->dev, mapping)) - goto dma_error; - - if (!budget || - tg3_tx_frag_set(tnapi, &entry, &budget, mapping, - len, base_flags | - ((i == last) ? TXD_FLAG_END : 0), - tmp_mss, vlan)) { - would_hit_hwbug = 1; - break; - } - } - } - - if (would_hit_hwbug) { - tg3_tx_skb_unmap(tnapi, tnapi->tx_prod, i); - - if (mss && tg3_tso_bug_gso_check(tnapi, skb)) { - /* If it's a TSO packet, do GSO instead of - * allocating and copying to a large linear SKB - */ - if (ip_tot_len) { - iph->check = ip_csum; - iph->tot_len = ip_tot_len; - } - tcph->check = tcp_csum; - return tg3_tso_bug(tp, tnapi, txq, skb); - } - - /* If the workaround fails due to memory/mapping - * failure, silently drop this packet. - */ - entry = tnapi->tx_prod; - budget = tg3_tx_avail(tnapi); - if (tigon3_dma_hwbug_workaround(tnapi, &skb, &entry, &budget, - base_flags, mss, vlan)) - goto drop_nofree; - } - - skb_tx_timestamp(skb); - netdev_tx_sent_queue(txq, skb->len); - - /* Sync BD data before updating mailbox */ - wmb(); - - tnapi->tx_prod = entry; - if (unlikely(tg3_tx_avail(tnapi) <= (MAX_SKB_FRAGS + 1))) { - netif_tx_stop_queue(txq); - - /* netif_tx_stop_queue() must be done before checking - * checking tx index in tg3_tx_avail() below, because in - * tg3_tx(), we update tx index before checking for - * netif_tx_queue_stopped(). - */ - smp_mb(); - if (tg3_tx_avail(tnapi) > TG3_TX_WAKEUP_THRESH(tnapi)) - netif_tx_wake_queue(txq); - } - - if (!skb->xmit_more || netif_xmit_stopped(txq)) { - /* Packets are ready, update Tx producer idx on card. */ - tw32_tx_mbox(tnapi->prodmbox, entry); - mmiowb(); - } - - return NETDEV_TX_OK; - -dma_error: - tg3_tx_skb_unmap(tnapi, tnapi->tx_prod, --i); - tnapi->tx_buffers[tnapi->tx_prod].skb = NULL; -drop: - dev_kfree_skb_any(skb); -drop_nofree: - tp->tx_dropped++; - return NETDEV_TX_OK; -} - -static void tg3_mac_loopback(struct tg3 *tp, bool enable) -{ - if (enable) { - tp->mac_mode &= ~(MAC_MODE_HALF_DUPLEX | - MAC_MODE_PORT_MODE_MASK); - - tp->mac_mode |= MAC_MODE_PORT_INT_LPBACK; - - if (!tg3_flag(tp, 5705_PLUS)) - tp->mac_mode |= MAC_MODE_LINK_POLARITY; - - if (tp->phy_flags & TG3_PHYFLG_10_100_ONLY) - tp->mac_mode |= MAC_MODE_PORT_MODE_MII; - else - tp->mac_mode |= MAC_MODE_PORT_MODE_GMII; - } else { - tp->mac_mode &= ~MAC_MODE_PORT_INT_LPBACK; - - if (tg3_flag(tp, 5705_PLUS) || - (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) || - tg3_asic_rev(tp) == ASIC_REV_5700) - tp->mac_mode &= ~MAC_MODE_LINK_POLARITY; - } - - tw32(MAC_MODE, tp->mac_mode); - udelay(40); -} - -static int tg3_phy_lpbk_set(struct tg3 *tp, u32 speed, bool extlpbk) -{ - u32 val, bmcr, mac_mode, ptest = 0; - - tg3_phy_toggle_apd(tp, false); - tg3_phy_toggle_automdix(tp, false); - - if (extlpbk && tg3_phy_set_extloopbk(tp)) - return -EIO; - - bmcr = BMCR_FULLDPLX; - switch (speed) { - case SPEED_10: - break; - case SPEED_100: - bmcr |= BMCR_SPEED100; - break; - case SPEED_1000: - default: - if (tp->phy_flags & TG3_PHYFLG_IS_FET) { - speed = SPEED_100; - bmcr |= BMCR_SPEED100; - } else { - speed = SPEED_1000; - bmcr |= BMCR_SPEED1000; - } - } - - if (extlpbk) { - if (!(tp->phy_flags & TG3_PHYFLG_IS_FET)) { - tg3_readphy(tp, MII_CTRL1000, &val); - val |= CTL1000_AS_MASTER | - CTL1000_ENABLE_MASTER; - tg3_writephy(tp, MII_CTRL1000, val); - } else { - ptest = MII_TG3_FET_PTEST_TRIM_SEL | - MII_TG3_FET_PTEST_TRIM_2; - tg3_writephy(tp, MII_TG3_FET_PTEST, ptest); - } - } else - bmcr |= BMCR_LOOPBACK; - - tg3_writephy(tp, MII_BMCR, bmcr); - - /* The write needs to be flushed for the FETs */ - if (tp->phy_flags & TG3_PHYFLG_IS_FET) - tg3_readphy(tp, MII_BMCR, &bmcr); - - udelay(40); - - if ((tp->phy_flags & TG3_PHYFLG_IS_FET) && - tg3_asic_rev(tp) == ASIC_REV_5785) { - tg3_writephy(tp, MII_TG3_FET_PTEST, ptest | - MII_TG3_FET_PTEST_FRC_TX_LINK | - MII_TG3_FET_PTEST_FRC_TX_LOCK); - - /* The write needs to be flushed for the AC131 */ - tg3_readphy(tp, MII_TG3_FET_PTEST, &val); - } - - /* Reset to prevent losing 1st rx packet intermittently */ - if ((tp->phy_flags & TG3_PHYFLG_MII_SERDES) && - tg3_flag(tp, 5780_CLASS)) { - tw32_f(MAC_RX_MODE, RX_MODE_RESET); - udelay(10); - tw32_f(MAC_RX_MODE, tp->rx_mode); - } - - mac_mode = tp->mac_mode & - ~(MAC_MODE_PORT_MODE_MASK | MAC_MODE_HALF_DUPLEX); - if (speed == SPEED_1000) - mac_mode |= MAC_MODE_PORT_MODE_GMII; - else - mac_mode |= MAC_MODE_PORT_MODE_MII; - - if (tg3_asic_rev(tp) == ASIC_REV_5700) { - u32 masked_phy_id = tp->phy_id & TG3_PHY_ID_MASK; - - if (masked_phy_id == TG3_PHY_ID_BCM5401) - mac_mode &= ~MAC_MODE_LINK_POLARITY; - else if (masked_phy_id == TG3_PHY_ID_BCM5411) - mac_mode |= MAC_MODE_LINK_POLARITY; - - tg3_writephy(tp, MII_TG3_EXT_CTRL, - MII_TG3_EXT_CTRL_LNK3_LED_MODE); - } - - tw32(MAC_MODE, mac_mode); - udelay(40); - - return 0; -} - -static void tg3_set_loopback(struct net_device *dev, netdev_features_t features) -{ - struct tg3 *tp = netdev_priv(dev); - - if (features & NETIF_F_LOOPBACK) { - if (tp->mac_mode & MAC_MODE_PORT_INT_LPBACK) - return; - - spin_lock_bh(&tp->lock); - tg3_mac_loopback(tp, true); - netif_carrier_on(tp->dev); - spin_unlock_bh(&tp->lock); - netdev_info(dev, "Internal MAC loopback mode enabled.\n"); - } else { - if (!(tp->mac_mode & MAC_MODE_PORT_INT_LPBACK)) - return; - - spin_lock_bh(&tp->lock); - tg3_mac_loopback(tp, false); - /* Force link status check */ - tg3_setup_phy(tp, true); - spin_unlock_bh(&tp->lock); - netdev_info(dev, "Internal MAC loopback mode disabled.\n"); - } -} - -static netdev_features_t tg3_fix_features(struct net_device *dev, - netdev_features_t features) -{ - struct tg3 *tp = netdev_priv(dev); - - if (dev->mtu > ETH_DATA_LEN && tg3_flag(tp, 5780_CLASS)) - features &= ~NETIF_F_ALL_TSO; - - return features; -} - -static int tg3_set_features(struct net_device *dev, netdev_features_t features) -{ - netdev_features_t changed = dev->features ^ features; - - if ((changed & NETIF_F_LOOPBACK) && netif_running(dev)) - tg3_set_loopback(dev, features); - - return 0; -} - -static void tg3_rx_prodring_free(struct tg3 *tp, - struct tg3_rx_prodring_set *tpr) -{ - int i; - - if (tpr != &tp->napi[0].prodring) { - for (i = tpr->rx_std_cons_idx; i != tpr->rx_std_prod_idx; - i = (i + 1) & tp->rx_std_ring_mask) - tg3_rx_data_free(tp, &tpr->rx_std_buffers[i], - tp->rx_pkt_map_sz); - - if (tg3_flag(tp, JUMBO_CAPABLE)) { - for (i = tpr->rx_jmb_cons_idx; - i != tpr->rx_jmb_prod_idx; - i = (i + 1) & tp->rx_jmb_ring_mask) { - tg3_rx_data_free(tp, &tpr->rx_jmb_buffers[i], - TG3_RX_JMB_MAP_SZ); - } - } - - return; - } - - for (i = 0; i <= tp->rx_std_ring_mask; i++) - tg3_rx_data_free(tp, &tpr->rx_std_buffers[i], - tp->rx_pkt_map_sz); - - if (tg3_flag(tp, JUMBO_CAPABLE) && !tg3_flag(tp, 5780_CLASS)) { - for (i = 0; i <= tp->rx_jmb_ring_mask; i++) - tg3_rx_data_free(tp, &tpr->rx_jmb_buffers[i], - TG3_RX_JMB_MAP_SZ); - } -} - -/* Initialize rx rings for packet processing. - * - * The chip has been shut down and the driver detached from - * the networking, so no interrupts or new tx packets will - * end up in the driver. tp->{tx,}lock are held and thus - * we may not sleep. - */ -static int tg3_rx_prodring_alloc(struct tg3 *tp, - struct tg3_rx_prodring_set *tpr) -{ - u32 i, rx_pkt_dma_sz; - - tpr->rx_std_cons_idx = 0; - tpr->rx_std_prod_idx = 0; - tpr->rx_jmb_cons_idx = 0; - tpr->rx_jmb_prod_idx = 0; - - if (tpr != &tp->napi[0].prodring) { - memset(&tpr->rx_std_buffers[0], 0, - TG3_RX_STD_BUFF_RING_SIZE(tp)); - if (tpr->rx_jmb_buffers) - memset(&tpr->rx_jmb_buffers[0], 0, - TG3_RX_JMB_BUFF_RING_SIZE(tp)); - goto done; - } - - /* Zero out all descriptors. */ - memset(tpr->rx_std, 0, TG3_RX_STD_RING_BYTES(tp)); - - rx_pkt_dma_sz = TG3_RX_STD_DMA_SZ; - if (tg3_flag(tp, 5780_CLASS) && - tp->dev->mtu > ETH_DATA_LEN) - rx_pkt_dma_sz = TG3_RX_JMB_DMA_SZ; - tp->rx_pkt_map_sz = TG3_RX_DMA_TO_MAP_SZ(rx_pkt_dma_sz); - - /* Initialize invariants of the rings, we only set this - * stuff once. This works because the card does not - * write into the rx buffer posting rings. - */ - for (i = 0; i <= tp->rx_std_ring_mask; i++) { - struct tg3_rx_buffer_desc *rxd; - - rxd = &tpr->rx_std[i]; - rxd->idx_len = rx_pkt_dma_sz << RXD_LEN_SHIFT; - rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT); - rxd->opaque = (RXD_OPAQUE_RING_STD | - (i << RXD_OPAQUE_INDEX_SHIFT)); - } - - /* Now allocate fresh SKBs for each rx ring. */ - for (i = 0; i < tp->rx_pending; i++) { - unsigned int frag_size; - - if (tg3_alloc_rx_data(tp, tpr, RXD_OPAQUE_RING_STD, i, - &frag_size) < 0) { - netdev_warn(tp->dev, - "Using a smaller RX standard ring. Only " - "%d out of %d buffers were allocated " - "successfully\n", i, tp->rx_pending); - if (i == 0) - goto initfail; - tp->rx_pending = i; - break; - } - } - - if (!tg3_flag(tp, JUMBO_CAPABLE) || tg3_flag(tp, 5780_CLASS)) - goto done; - - memset(tpr->rx_jmb, 0, TG3_RX_JMB_RING_BYTES(tp)); - - if (!tg3_flag(tp, JUMBO_RING_ENABLE)) - goto done; - - for (i = 0; i <= tp->rx_jmb_ring_mask; i++) { - struct tg3_rx_buffer_desc *rxd; - - rxd = &tpr->rx_jmb[i].std; - rxd->idx_len = TG3_RX_JMB_DMA_SZ << RXD_LEN_SHIFT; - rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT) | - RXD_FLAG_JUMBO; - rxd->opaque = (RXD_OPAQUE_RING_JUMBO | - (i << RXD_OPAQUE_INDEX_SHIFT)); - } - - for (i = 0; i < tp->rx_jumbo_pending; i++) { - unsigned int frag_size; - - if (tg3_alloc_rx_data(tp, tpr, RXD_OPAQUE_RING_JUMBO, i, - &frag_size) < 0) { - netdev_warn(tp->dev, - "Using a smaller RX jumbo ring. Only %d " - "out of %d buffers were allocated " - "successfully\n", i, tp->rx_jumbo_pending); - if (i == 0) - goto initfail; - tp->rx_jumbo_pending = i; - break; - } - } - -done: - return 0; - -initfail: - tg3_rx_prodring_free(tp, tpr); - return -ENOMEM; -} - -static void tg3_rx_prodring_fini(struct tg3 *tp, - struct tg3_rx_prodring_set *tpr) -{ - kfree(tpr->rx_std_buffers); - tpr->rx_std_buffers = NULL; - kfree(tpr->rx_jmb_buffers); - tpr->rx_jmb_buffers = NULL; - if (tpr->rx_std) { - dma_free_coherent(&tp->pdev->dev, TG3_RX_STD_RING_BYTES(tp), - tpr->rx_std, tpr->rx_std_mapping); - tpr->rx_std = NULL; - } - if (tpr->rx_jmb) { - dma_free_coherent(&tp->pdev->dev, TG3_RX_JMB_RING_BYTES(tp), - tpr->rx_jmb, tpr->rx_jmb_mapping); - tpr->rx_jmb = NULL; - } -} - -static int tg3_rx_prodring_init(struct tg3 *tp, - struct tg3_rx_prodring_set *tpr) -{ - tpr->rx_std_buffers = kzalloc(TG3_RX_STD_BUFF_RING_SIZE(tp), - GFP_KERNEL); - if (!tpr->rx_std_buffers) - return -ENOMEM; - - tpr->rx_std = dma_alloc_coherent(&tp->pdev->dev, - TG3_RX_STD_RING_BYTES(tp), - &tpr->rx_std_mapping, - GFP_KERNEL); - if (!tpr->rx_std) - goto err_out; - - if (tg3_flag(tp, JUMBO_CAPABLE) && !tg3_flag(tp, 5780_CLASS)) { - tpr->rx_jmb_buffers = kzalloc(TG3_RX_JMB_BUFF_RING_SIZE(tp), - GFP_KERNEL); - if (!tpr->rx_jmb_buffers) - goto err_out; - - tpr->rx_jmb = dma_alloc_coherent(&tp->pdev->dev, - TG3_RX_JMB_RING_BYTES(tp), - &tpr->rx_jmb_mapping, - GFP_KERNEL); - if (!tpr->rx_jmb) - goto err_out; - } - - return 0; - -err_out: - tg3_rx_prodring_fini(tp, tpr); - return -ENOMEM; -} - -/* Free up pending packets in all rx/tx rings. - * - * The chip has been shut down and the driver detached from - * the networking, so no interrupts or new tx packets will - * end up in the driver. tp->{tx,}lock is not held and we are not - * in an interrupt context and thus may sleep. - */ -static void tg3_free_rings(struct tg3 *tp) -{ - int i, j; - - for (j = 0; j < tp->irq_cnt; j++) { - struct tg3_napi *tnapi = &tp->napi[j]; - - tg3_rx_prodring_free(tp, &tnapi->prodring); - - if (!tnapi->tx_buffers) - continue; - - for (i = 0; i < TG3_TX_RING_SIZE; i++) { - struct sk_buff *skb = tnapi->tx_buffers[i].skb; - - if (!skb) - continue; - - tg3_tx_skb_unmap(tnapi, i, - skb_shinfo(skb)->nr_frags - 1); - - dev_consume_skb_any(skb); - } - netdev_tx_reset_queue(netdev_get_tx_queue(tp->dev, j)); - } -} - -/* Initialize tx/rx rings for packet processing. - * - * The chip has been shut down and the driver detached from - * the networking, so no interrupts or new tx packets will - * end up in the driver. tp->{tx,}lock are held and thus - * we may not sleep. - */ -static int tg3_init_rings(struct tg3 *tp) -{ - int i; - - /* Free up all the SKBs. */ - tg3_free_rings(tp); - - for (i = 0; i < tp->irq_cnt; i++) { - struct tg3_napi *tnapi = &tp->napi[i]; - - tnapi->last_tag = 0; - tnapi->last_irq_tag = 0; - tnapi->hw_status->status = 0; - tnapi->hw_status->status_tag = 0; - memset(tnapi->hw_status, 0, TG3_HW_STATUS_SIZE); - - tnapi->tx_prod = 0; - tnapi->tx_cons = 0; - if (tnapi->tx_ring) - memset(tnapi->tx_ring, 0, TG3_TX_RING_BYTES); - - tnapi->rx_rcb_ptr = 0; - if (tnapi->rx_rcb) - memset(tnapi->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp)); - - if (tnapi->prodring.rx_std && - tg3_rx_prodring_alloc(tp, &tnapi->prodring)) { - tg3_free_rings(tp); - return -ENOMEM; - } - } - - return 0; -} - -static void tg3_mem_tx_release(struct tg3 *tp) -{ - int i; - - for (i = 0; i < tp->irq_max; i++) { - struct tg3_napi *tnapi = &tp->napi[i]; - - if (tnapi->tx_ring) { - dma_free_coherent(&tp->pdev->dev, TG3_TX_RING_BYTES, - tnapi->tx_ring, tnapi->tx_desc_mapping); - tnapi->tx_ring = NULL; - } - - kfree(tnapi->tx_buffers); - tnapi->tx_buffers = NULL; - } -} - -static int tg3_mem_tx_acquire(struct tg3 *tp) -{ - int i; - struct tg3_napi *tnapi = &tp->napi[0]; - - /* If multivector TSS is enabled, vector 0 does not handle - * tx interrupts. Don't allocate any resources for it. - */ - if (tg3_flag(tp, ENABLE_TSS)) - tnapi++; - - for (i = 0; i < tp->txq_cnt; i++, tnapi++) { - tnapi->tx_buffers = kzalloc(sizeof(struct tg3_tx_ring_info) * - TG3_TX_RING_SIZE, GFP_KERNEL); - if (!tnapi->tx_buffers) - goto err_out; - - tnapi->tx_ring = dma_alloc_coherent(&tp->pdev->dev, - TG3_TX_RING_BYTES, - &tnapi->tx_desc_mapping, - GFP_KERNEL); - if (!tnapi->tx_ring) - goto err_out; - } - - return 0; - -err_out: - tg3_mem_tx_release(tp); - return -ENOMEM; -} - -static void tg3_mem_rx_release(struct tg3 *tp) -{ - int i; - - for (i = 0; i < tp->irq_max; i++) { - struct tg3_napi *tnapi = &tp->napi[i]; - - tg3_rx_prodring_fini(tp, &tnapi->prodring); - - if (!tnapi->rx_rcb) - continue; - - dma_free_coherent(&tp->pdev->dev, - TG3_RX_RCB_RING_BYTES(tp), - tnapi->rx_rcb, - tnapi->rx_rcb_mapping); - tnapi->rx_rcb = NULL; - } -} - -static int tg3_mem_rx_acquire(struct tg3 *tp) -{ - unsigned int i, limit; - - limit = tp->rxq_cnt; - - /* If RSS is enabled, we need a (dummy) producer ring - * set on vector zero. This is the true hw prodring. - */ - if (tg3_flag(tp, ENABLE_RSS)) - limit++; - - for (i = 0; i < limit; i++) { - struct tg3_napi *tnapi = &tp->napi[i]; - - if (tg3_rx_prodring_init(tp, &tnapi->prodring)) - goto err_out; - - /* If multivector RSS is enabled, vector 0 - * does not handle rx or tx interrupts. - * Don't allocate any resources for it. - */ - if (!i && tg3_flag(tp, ENABLE_RSS)) - continue; - - tnapi->rx_rcb = dma_zalloc_coherent(&tp->pdev->dev, - TG3_RX_RCB_RING_BYTES(tp), - &tnapi->rx_rcb_mapping, - GFP_KERNEL); - if (!tnapi->rx_rcb) - goto err_out; - } - - return 0; - -err_out: - tg3_mem_rx_release(tp); - return -ENOMEM; -} - -/* - * Must not be invoked with interrupt sources disabled and - * the hardware shutdown down. - */ -static void tg3_free_consistent(struct tg3 *tp) -{ - int i; - - for (i = 0; i < tp->irq_cnt; i++) { - struct tg3_napi *tnapi = &tp->napi[i]; - - if (tnapi->hw_status) { - dma_free_coherent(&tp->pdev->dev, TG3_HW_STATUS_SIZE, - tnapi->hw_status, - tnapi->status_mapping); - tnapi->hw_status = NULL; - } - } - - tg3_mem_rx_release(tp); - tg3_mem_tx_release(tp); - - /* tp->hw_stats can be referenced safely: - * 1. under rtnl_lock - * 2. or under tp->lock if TG3_FLAG_INIT_COMPLETE is set. - */ - if (tp->hw_stats) { - dma_free_coherent(&tp->pdev->dev, sizeof(struct tg3_hw_stats), - tp->hw_stats, tp->stats_mapping); - tp->hw_stats = NULL; - } -} - -/* - * Must not be invoked with interrupt sources disabled and - * the hardware shutdown down. Can sleep. - */ -static int tg3_alloc_consistent(struct tg3 *tp) -{ - int i; - - tp->hw_stats = dma_zalloc_coherent(&tp->pdev->dev, - sizeof(struct tg3_hw_stats), - &tp->stats_mapping, GFP_KERNEL); - if (!tp->hw_stats) - goto err_out; - - for (i = 0; i < tp->irq_cnt; i++) { - struct tg3_napi *tnapi = &tp->napi[i]; - struct tg3_hw_status *sblk; - - tnapi->hw_status = dma_zalloc_coherent(&tp->pdev->dev, - TG3_HW_STATUS_SIZE, - &tnapi->status_mapping, - GFP_KERNEL); - if (!tnapi->hw_status) - goto err_out; - - sblk = tnapi->hw_status; - - if (tg3_flag(tp, ENABLE_RSS)) { - u16 *prodptr = NULL; - - /* - * When RSS is enabled, the status block format changes - * slightly. The "rx_jumbo_consumer", "reserved", - * and "rx_mini_consumer" members get mapped to the - * other three rx return ring producer indexes. - */ - switch (i) { - case 1: - prodptr = &sblk->idx[0].rx_producer; - break; - case 2: - prodptr = &sblk->rx_jumbo_consumer; - break; - case 3: - prodptr = &sblk->reserved; - break; - case 4: - prodptr = &sblk->rx_mini_consumer; - break; - } - tnapi->rx_rcb_prod_idx = prodptr; - } else { - tnapi->rx_rcb_prod_idx = &sblk->idx[0].rx_producer; - } - } - - if (tg3_mem_tx_acquire(tp) || tg3_mem_rx_acquire(tp)) - goto err_out; - - return 0; - -err_out: - tg3_free_consistent(tp); - return -ENOMEM; -} - -#define MAX_WAIT_CNT 1000 - -/* To stop a block, clear the enable bit and poll till it - * clears. tp->lock is held. - */ -static int tg3_stop_block(struct tg3 *tp, unsigned long ofs, u32 enable_bit, bool silent) -{ - unsigned int i; - u32 val; - - if (tg3_flag(tp, 5705_PLUS)) { - switch (ofs) { - case RCVLSC_MODE: - case DMAC_MODE: - case MBFREE_MODE: - case BUFMGR_MODE: - case MEMARB_MODE: - /* We can't enable/disable these bits of the - * 5705/5750, just say success. - */ - return 0; - - default: - break; - } - } - - val = tr32(ofs); - val &= ~enable_bit; - tw32_f(ofs, val); - - for (i = 0; i < MAX_WAIT_CNT; i++) { - if (pci_channel_offline(tp->pdev)) { - dev_err(&tp->pdev->dev, - "tg3_stop_block device offline, " - "ofs=%lx enable_bit=%x\n", - ofs, enable_bit); - return -ENODEV; - } - - udelay(100); - val = tr32(ofs); - if ((val & enable_bit) == 0) - break; - } - - if (i == MAX_WAIT_CNT && !silent) { - dev_err(&tp->pdev->dev, - "tg3_stop_block timed out, ofs=%lx enable_bit=%x\n", - ofs, enable_bit); - return -ENODEV; - } - - return 0; -} - -/* tp->lock is held. */ -static int tg3_abort_hw(struct tg3 *tp, bool silent) -{ - int i, err; - - tg3_disable_ints(tp); - - if (pci_channel_offline(tp->pdev)) { - tp->rx_mode &= ~(RX_MODE_ENABLE | TX_MODE_ENABLE); - tp->mac_mode &= ~MAC_MODE_TDE_ENABLE; - err = -ENODEV; - goto err_no_dev; - } - - tp->rx_mode &= ~RX_MODE_ENABLE; - tw32_f(MAC_RX_MODE, tp->rx_mode); - udelay(10); - - err = tg3_stop_block(tp, RCVBDI_MODE, RCVBDI_MODE_ENABLE, silent); - err |= tg3_stop_block(tp, RCVLPC_MODE, RCVLPC_MODE_ENABLE, silent); - err |= tg3_stop_block(tp, RCVLSC_MODE, RCVLSC_MODE_ENABLE, silent); - err |= tg3_stop_block(tp, RCVDBDI_MODE, RCVDBDI_MODE_ENABLE, silent); - err |= tg3_stop_block(tp, RCVDCC_MODE, RCVDCC_MODE_ENABLE, silent); - err |= tg3_stop_block(tp, RCVCC_MODE, RCVCC_MODE_ENABLE, silent); - - err |= tg3_stop_block(tp, SNDBDS_MODE, SNDBDS_MODE_ENABLE, silent); - err |= tg3_stop_block(tp, SNDBDI_MODE, SNDBDI_MODE_ENABLE, silent); - err |= tg3_stop_block(tp, SNDDATAI_MODE, SNDDATAI_MODE_ENABLE, silent); - err |= tg3_stop_block(tp, RDMAC_MODE, RDMAC_MODE_ENABLE, silent); - err |= tg3_stop_block(tp, SNDDATAC_MODE, SNDDATAC_MODE_ENABLE, silent); - err |= tg3_stop_block(tp, DMAC_MODE, DMAC_MODE_ENABLE, silent); - err |= tg3_stop_block(tp, SNDBDC_MODE, SNDBDC_MODE_ENABLE, silent); - - tp->mac_mode &= ~MAC_MODE_TDE_ENABLE; - tw32_f(MAC_MODE, tp->mac_mode); - udelay(40); - - tp->tx_mode &= ~TX_MODE_ENABLE; - tw32_f(MAC_TX_MODE, tp->tx_mode); - - for (i = 0; i < MAX_WAIT_CNT; i++) { - udelay(100); - if (!(tr32(MAC_TX_MODE) & TX_MODE_ENABLE)) - break; - } - if (i >= MAX_WAIT_CNT) { - dev_err(&tp->pdev->dev, - "%s timed out, TX_MODE_ENABLE will not clear " - "MAC_TX_MODE=%08x\n", __func__, tr32(MAC_TX_MODE)); - err |= -ENODEV; - } - - err |= tg3_stop_block(tp, HOSTCC_MODE, HOSTCC_MODE_ENABLE, silent); - err |= tg3_stop_block(tp, WDMAC_MODE, WDMAC_MODE_ENABLE, silent); - err |= tg3_stop_block(tp, MBFREE_MODE, MBFREE_MODE_ENABLE, silent); - - tw32(FTQ_RESET, 0xffffffff); - tw32(FTQ_RESET, 0x00000000); - - err |= tg3_stop_block(tp, BUFMGR_MODE, BUFMGR_MODE_ENABLE, silent); - err |= tg3_stop_block(tp, MEMARB_MODE, MEMARB_MODE_ENABLE, silent); - -err_no_dev: - for (i = 0; i < tp->irq_cnt; i++) { - struct tg3_napi *tnapi = &tp->napi[i]; - if (tnapi->hw_status) - memset(tnapi->hw_status, 0, TG3_HW_STATUS_SIZE); - } - - return err; -} - -/* Save PCI command register before chip reset */ -static void tg3_save_pci_state(struct tg3 *tp) -{ - pci_read_config_word(tp->pdev, PCI_COMMAND, &tp->pci_cmd); -} - -/* Restore PCI state after chip reset */ -static void tg3_restore_pci_state(struct tg3 *tp) -{ - u32 val; - - /* Re-enable indirect register accesses. */ - pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL, - tp->misc_host_ctrl); - - /* Set MAX PCI retry to zero. */ - val = (PCISTATE_ROM_ENABLE | PCISTATE_ROM_RETRY_ENABLE); - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5704_A0 && - tg3_flag(tp, PCIX_MODE)) - val |= PCISTATE_RETRY_SAME_DMA; - /* Allow reads and writes to the APE register and memory space. */ - if (tg3_flag(tp, ENABLE_APE)) - val |= PCISTATE_ALLOW_APE_CTLSPC_WR | - PCISTATE_ALLOW_APE_SHMEM_WR | - PCISTATE_ALLOW_APE_PSPACE_WR; - pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE, val); - - pci_write_config_word(tp->pdev, PCI_COMMAND, tp->pci_cmd); - - if (!tg3_flag(tp, PCI_EXPRESS)) { - pci_write_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, - tp->pci_cacheline_sz); - pci_write_config_byte(tp->pdev, PCI_LATENCY_TIMER, - tp->pci_lat_timer); - } - - /* Make sure PCI-X relaxed ordering bit is clear. */ - if (tg3_flag(tp, PCIX_MODE)) { - u16 pcix_cmd; - - pci_read_config_word(tp->pdev, tp->pcix_cap + PCI_X_CMD, - &pcix_cmd); - pcix_cmd &= ~PCI_X_CMD_ERO; - pci_write_config_word(tp->pdev, tp->pcix_cap + PCI_X_CMD, - pcix_cmd); - } - - if (tg3_flag(tp, 5780_CLASS)) { - - /* Chip reset on 5780 will reset MSI enable bit, - * so need to restore it. - */ - if (tg3_flag(tp, USING_MSI)) { - u16 ctrl; - - pci_read_config_word(tp->pdev, - tp->msi_cap + PCI_MSI_FLAGS, - &ctrl); - pci_write_config_word(tp->pdev, - tp->msi_cap + PCI_MSI_FLAGS, - ctrl | PCI_MSI_FLAGS_ENABLE); - val = tr32(MSGINT_MODE); - tw32(MSGINT_MODE, val | MSGINT_MODE_ENABLE); - } - } -} - -static void tg3_override_clk(struct tg3 *tp) -{ - u32 val; - - switch (tg3_asic_rev(tp)) { - case ASIC_REV_5717: - val = tr32(TG3_CPMU_CLCK_ORIDE_ENABLE); - tw32(TG3_CPMU_CLCK_ORIDE_ENABLE, val | - TG3_CPMU_MAC_ORIDE_ENABLE); - break; - - case ASIC_REV_5719: - case ASIC_REV_5720: - tw32(TG3_CPMU_CLCK_ORIDE, CPMU_CLCK_ORIDE_MAC_ORIDE_EN); - break; - - default: - return; - } -} - -static void tg3_restore_clk(struct tg3 *tp) -{ - u32 val; - - switch (tg3_asic_rev(tp)) { - case ASIC_REV_5717: - val = tr32(TG3_CPMU_CLCK_ORIDE_ENABLE); - tw32(TG3_CPMU_CLCK_ORIDE_ENABLE, - val & ~TG3_CPMU_MAC_ORIDE_ENABLE); - break; - - case ASIC_REV_5719: - case ASIC_REV_5720: - val = tr32(TG3_CPMU_CLCK_ORIDE); - tw32(TG3_CPMU_CLCK_ORIDE, val & ~CPMU_CLCK_ORIDE_MAC_ORIDE_EN); - break; - - default: - return; - } -} - -/* tp->lock is held. */ -static int tg3_chip_reset(struct tg3 *tp) - __releases(tp->lock) - __acquires(tp->lock) -{ - u32 val; - void (*write_op)(struct tg3 *, u32, u32); - int i, err; - - if (!pci_device_is_present(tp->pdev)) - return -ENODEV; - - tg3_nvram_lock(tp); - - tg3_ape_lock(tp, TG3_APE_LOCK_GRC); - - /* No matching tg3_nvram_unlock() after this because - * chip reset below will undo the nvram lock. - */ - tp->nvram_lock_cnt = 0; - - /* GRC_MISC_CFG core clock reset will clear the memory - * enable bit in PCI register 4 and the MSI enable bit - * on some chips, so we save relevant registers here. - */ - tg3_save_pci_state(tp); - - if (tg3_asic_rev(tp) == ASIC_REV_5752 || - tg3_flag(tp, 5755_PLUS)) - tw32(GRC_FASTBOOT_PC, 0); - - /* - * We must avoid the readl() that normally takes place. - * It locks machines, causes machine checks, and other - * fun things. So, temporarily disable the 5701 - * hardware workaround, while we do the reset. - */ - write_op = tp->write32; - if (write_op == tg3_write_flush_reg32) - tp->write32 = tg3_write32; - - /* Prevent the irq handler from reading or writing PCI registers - * during chip reset when the memory enable bit in the PCI command - * register may be cleared. The chip does not generate interrupt - * at this time, but the irq handler may still be called due to irq - * sharing or irqpoll. - */ - tg3_flag_set(tp, CHIP_RESETTING); - for (i = 0; i < tp->irq_cnt; i++) { - struct tg3_napi *tnapi = &tp->napi[i]; - if (tnapi->hw_status) { - tnapi->hw_status->status = 0; - tnapi->hw_status->status_tag = 0; - } - tnapi->last_tag = 0; - tnapi->last_irq_tag = 0; - } - smp_mb(); - - tg3_full_unlock(tp); - - for (i = 0; i < tp->irq_cnt; i++) - synchronize_irq(tp->napi[i].irq_vec); - - tg3_full_lock(tp, 0); - - if (tg3_asic_rev(tp) == ASIC_REV_57780) { - val = tr32(TG3_PCIE_LNKCTL) & ~TG3_PCIE_LNKCTL_L1_PLL_PD_EN; - tw32(TG3_PCIE_LNKCTL, val | TG3_PCIE_LNKCTL_L1_PLL_PD_DIS); - } - - /* do the reset */ - val = GRC_MISC_CFG_CORECLK_RESET; - - if (tg3_flag(tp, PCI_EXPRESS)) { - /* Force PCIe 1.0a mode */ - if (tg3_asic_rev(tp) != ASIC_REV_5785 && - !tg3_flag(tp, 57765_PLUS) && - tr32(TG3_PCIE_PHY_TSTCTL) == - (TG3_PCIE_PHY_TSTCTL_PCIE10 | TG3_PCIE_PHY_TSTCTL_PSCRAM)) - tw32(TG3_PCIE_PHY_TSTCTL, TG3_PCIE_PHY_TSTCTL_PSCRAM); - - if (tg3_chip_rev_id(tp) != CHIPREV_ID_5750_A0) { - tw32(GRC_MISC_CFG, (1 << 29)); - val |= (1 << 29); - } - } - - if (tg3_asic_rev(tp) == ASIC_REV_5906) { - tw32(VCPU_STATUS, tr32(VCPU_STATUS) | VCPU_STATUS_DRV_RESET); - tw32(GRC_VCPU_EXT_CTRL, - tr32(GRC_VCPU_EXT_CTRL) & ~GRC_VCPU_EXT_CTRL_HALT_CPU); - } - - /* Set the clock to the highest frequency to avoid timeouts. With link - * aware mode, the clock speed could be slow and bootcode does not - * complete within the expected time. Override the clock to allow the - * bootcode to finish sooner and then restore it. - */ - tg3_override_clk(tp); - - /* Manage gphy power for all CPMU absent PCIe devices. */ - if (tg3_flag(tp, 5705_PLUS) && !tg3_flag(tp, CPMU_PRESENT)) - val |= GRC_MISC_CFG_KEEP_GPHY_POWER; - - tw32(GRC_MISC_CFG, val); - - /* restore 5701 hardware bug workaround write method */ - tp->write32 = write_op; - - /* Unfortunately, we have to delay before the PCI read back. - * Some 575X chips even will not respond to a PCI cfg access - * when the reset command is given to the chip. - * - * How do these hardware designers expect things to work - * properly if the PCI write is posted for a long period - * of time? It is always necessary to have some method by - * which a register read back can occur to push the write - * out which does the reset. - * - * For most tg3 variants the trick below was working. - * Ho hum... - */ - udelay(120); - - /* Flush PCI posted writes. The normal MMIO registers - * are inaccessible at this time so this is the only - * way to make this reliably (actually, this is no longer - * the case, see above). I tried to use indirect - * register read/write but this upset some 5701 variants. - */ - pci_read_config_dword(tp->pdev, PCI_COMMAND, &val); - - udelay(120); - - if (tg3_flag(tp, PCI_EXPRESS) && pci_is_pcie(tp->pdev)) { - u16 val16; - - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5750_A0) { - int j; - u32 cfg_val; - - /* Wait for link training to complete. */ - for (j = 0; j < 5000; j++) - udelay(100); - - pci_read_config_dword(tp->pdev, 0xc4, &cfg_val); - pci_write_config_dword(tp->pdev, 0xc4, - cfg_val | (1 << 15)); - } - - /* Clear the "no snoop" and "relaxed ordering" bits. */ - val16 = PCI_EXP_DEVCTL_RELAX_EN | PCI_EXP_DEVCTL_NOSNOOP_EN; - /* - * Older PCIe devices only support the 128 byte - * MPS setting. Enforce the restriction. - */ - if (!tg3_flag(tp, CPMU_PRESENT)) - val16 |= PCI_EXP_DEVCTL_PAYLOAD; - pcie_capability_clear_word(tp->pdev, PCI_EXP_DEVCTL, val16); - - /* Clear error status */ - pcie_capability_write_word(tp->pdev, PCI_EXP_DEVSTA, - PCI_EXP_DEVSTA_CED | - PCI_EXP_DEVSTA_NFED | - PCI_EXP_DEVSTA_FED | - PCI_EXP_DEVSTA_URD); - } - - tg3_restore_pci_state(tp); - - tg3_flag_clear(tp, CHIP_RESETTING); - tg3_flag_clear(tp, ERROR_PROCESSED); - - val = 0; - if (tg3_flag(tp, 5780_CLASS)) - val = tr32(MEMARB_MODE); - tw32(MEMARB_MODE, val | MEMARB_MODE_ENABLE); - - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5750_A3) { - tg3_stop_fw(tp); - tw32(0x5000, 0x400); - } - - if (tg3_flag(tp, IS_SSB_CORE)) { - /* - * BCM4785: In order to avoid repercussions from using - * potentially defective internal ROM, stop the Rx RISC CPU, - * which is not required. - */ - tg3_stop_fw(tp); - tg3_halt_cpu(tp, RX_CPU_BASE); - } - - err = tg3_poll_fw(tp); - if (err) - return err; - - tw32(GRC_MODE, tp->grc_mode); - - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A0) { - val = tr32(0xc4); - - tw32(0xc4, val | (1 << 15)); - } - - if ((tp->nic_sram_data_cfg & NIC_SRAM_DATA_CFG_MINI_PCI) != 0 && - tg3_asic_rev(tp) == ASIC_REV_5705) { - tp->pci_clock_ctrl |= CLOCK_CTRL_CLKRUN_OENABLE; - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A0) - tp->pci_clock_ctrl |= CLOCK_CTRL_FORCE_CLKRUN; - tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl); - } - - if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) { - tp->mac_mode = MAC_MODE_PORT_MODE_TBI; - val = tp->mac_mode; - } else if (tp->phy_flags & TG3_PHYFLG_MII_SERDES) { - tp->mac_mode = MAC_MODE_PORT_MODE_GMII; - val = tp->mac_mode; - } else - val = 0; - - tw32_f(MAC_MODE, val); - udelay(40); - - tg3_ape_unlock(tp, TG3_APE_LOCK_GRC); - - tg3_mdio_start(tp); - - if (tg3_flag(tp, PCI_EXPRESS) && - tg3_chip_rev_id(tp) != CHIPREV_ID_5750_A0 && - tg3_asic_rev(tp) != ASIC_REV_5785 && - !tg3_flag(tp, 57765_PLUS)) { - val = tr32(0x7c00); - - tw32(0x7c00, val | (1 << 25)); - } - - tg3_restore_clk(tp); - - /* Increase the core clock speed to fix tx timeout issue for 5762 - * with 100Mbps link speed. - */ - if (tg3_asic_rev(tp) == ASIC_REV_5762) { - val = tr32(TG3_CPMU_CLCK_ORIDE_ENABLE); - tw32(TG3_CPMU_CLCK_ORIDE_ENABLE, val | - TG3_CPMU_MAC_ORIDE_ENABLE); - } - - /* Reprobe ASF enable state. */ - tg3_flag_clear(tp, ENABLE_ASF); - tp->phy_flags &= ~(TG3_PHYFLG_1G_ON_VAUX_OK | - TG3_PHYFLG_KEEP_LINK_ON_PWRDN); - - tg3_flag_clear(tp, ASF_NEW_HANDSHAKE); - tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val); - if (val == NIC_SRAM_DATA_SIG_MAGIC) { - u32 nic_cfg; - - tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg); - if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) { - tg3_flag_set(tp, ENABLE_ASF); - tp->last_event_jiffies = jiffies; - if (tg3_flag(tp, 5750_PLUS)) - tg3_flag_set(tp, ASF_NEW_HANDSHAKE); - - tg3_read_mem(tp, NIC_SRAM_DATA_CFG_3, &nic_cfg); - if (nic_cfg & NIC_SRAM_1G_ON_VAUX_OK) - tp->phy_flags |= TG3_PHYFLG_1G_ON_VAUX_OK; - if (nic_cfg & NIC_SRAM_LNK_FLAP_AVOID) - tp->phy_flags |= TG3_PHYFLG_KEEP_LINK_ON_PWRDN; - } - } - - return 0; -} - -static void tg3_get_nstats(struct tg3 *, struct rtnl_link_stats64 *); -static void tg3_get_estats(struct tg3 *, struct tg3_ethtool_stats *); -static void __tg3_set_rx_mode(struct net_device *); - -/* tp->lock is held. */ -static int tg3_halt(struct tg3 *tp, int kind, bool silent) -{ - int err; - - tg3_stop_fw(tp); - - tg3_write_sig_pre_reset(tp, kind); - - tg3_abort_hw(tp, silent); - err = tg3_chip_reset(tp); - - __tg3_set_mac_addr(tp, false); - - tg3_write_sig_legacy(tp, kind); - tg3_write_sig_post_reset(tp, kind); - - if (tp->hw_stats) { - /* Save the stats across chip resets... */ - tg3_get_nstats(tp, &tp->net_stats_prev); - tg3_get_estats(tp, &tp->estats_prev); - - /* And make sure the next sample is new data */ - memset(tp->hw_stats, 0, sizeof(struct tg3_hw_stats)); - } - - return err; -} - -static int tg3_set_mac_addr(struct net_device *dev, void *p) -{ - struct tg3 *tp = netdev_priv(dev); - struct sockaddr *addr = p; - int err = 0; - bool skip_mac_1 = false; - - if (!is_valid_ether_addr(addr->sa_data)) - return -EADDRNOTAVAIL; - - memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); - - if (!netif_running(dev)) - return 0; - - if (tg3_flag(tp, ENABLE_ASF)) { - u32 addr0_high, addr0_low, addr1_high, addr1_low; - - addr0_high = tr32(MAC_ADDR_0_HIGH); - addr0_low = tr32(MAC_ADDR_0_LOW); - addr1_high = tr32(MAC_ADDR_1_HIGH); - addr1_low = tr32(MAC_ADDR_1_LOW); - - /* Skip MAC addr 1 if ASF is using it. */ - if ((addr0_high != addr1_high || addr0_low != addr1_low) && - !(addr1_high == 0 && addr1_low == 0)) - skip_mac_1 = true; - } - spin_lock_bh(&tp->lock); - __tg3_set_mac_addr(tp, skip_mac_1); - __tg3_set_rx_mode(dev); - spin_unlock_bh(&tp->lock); - - return err; -} - -/* tp->lock is held. */ -static void tg3_set_bdinfo(struct tg3 *tp, u32 bdinfo_addr, - dma_addr_t mapping, u32 maxlen_flags, - u32 nic_addr) -{ - tg3_write_mem(tp, - (bdinfo_addr + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH), - ((u64) mapping >> 32)); - tg3_write_mem(tp, - (bdinfo_addr + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW), - ((u64) mapping & 0xffffffff)); - tg3_write_mem(tp, - (bdinfo_addr + TG3_BDINFO_MAXLEN_FLAGS), - maxlen_flags); - - if (!tg3_flag(tp, 5705_PLUS)) - tg3_write_mem(tp, - (bdinfo_addr + TG3_BDINFO_NIC_ADDR), - nic_addr); -} - - -static void tg3_coal_tx_init(struct tg3 *tp, struct ethtool_coalesce *ec) -{ - int i = 0; - - if (!tg3_flag(tp, ENABLE_TSS)) { - tw32(HOSTCC_TXCOL_TICKS, ec->tx_coalesce_usecs); - tw32(HOSTCC_TXMAX_FRAMES, ec->tx_max_coalesced_frames); - tw32(HOSTCC_TXCOAL_MAXF_INT, ec->tx_max_coalesced_frames_irq); - } else { - tw32(HOSTCC_TXCOL_TICKS, 0); - tw32(HOSTCC_TXMAX_FRAMES, 0); - tw32(HOSTCC_TXCOAL_MAXF_INT, 0); - - for (; i < tp->txq_cnt; i++) { - u32 reg; - - reg = HOSTCC_TXCOL_TICKS_VEC1 + i * 0x18; - tw32(reg, ec->tx_coalesce_usecs); - reg = HOSTCC_TXMAX_FRAMES_VEC1 + i * 0x18; - tw32(reg, ec->tx_max_coalesced_frames); - reg = HOSTCC_TXCOAL_MAXF_INT_VEC1 + i * 0x18; - tw32(reg, ec->tx_max_coalesced_frames_irq); - } - } - - for (; i < tp->irq_max - 1; i++) { - tw32(HOSTCC_TXCOL_TICKS_VEC1 + i * 0x18, 0); - tw32(HOSTCC_TXMAX_FRAMES_VEC1 + i * 0x18, 0); - tw32(HOSTCC_TXCOAL_MAXF_INT_VEC1 + i * 0x18, 0); - } -} - -static void tg3_coal_rx_init(struct tg3 *tp, struct ethtool_coalesce *ec) -{ - int i = 0; - u32 limit = tp->rxq_cnt; - - if (!tg3_flag(tp, ENABLE_RSS)) { - tw32(HOSTCC_RXCOL_TICKS, ec->rx_coalesce_usecs); - tw32(HOSTCC_RXMAX_FRAMES, ec->rx_max_coalesced_frames); - tw32(HOSTCC_RXCOAL_MAXF_INT, ec->rx_max_coalesced_frames_irq); - limit--; - } else { - tw32(HOSTCC_RXCOL_TICKS, 0); - tw32(HOSTCC_RXMAX_FRAMES, 0); - tw32(HOSTCC_RXCOAL_MAXF_INT, 0); - } - - for (; i < limit; i++) { - u32 reg; - - reg = HOSTCC_RXCOL_TICKS_VEC1 + i * 0x18; - tw32(reg, ec->rx_coalesce_usecs); - reg = HOSTCC_RXMAX_FRAMES_VEC1 + i * 0x18; - tw32(reg, ec->rx_max_coalesced_frames); - reg = HOSTCC_RXCOAL_MAXF_INT_VEC1 + i * 0x18; - tw32(reg, ec->rx_max_coalesced_frames_irq); - } - - for (; i < tp->irq_max - 1; i++) { - tw32(HOSTCC_RXCOL_TICKS_VEC1 + i * 0x18, 0); - tw32(HOSTCC_RXMAX_FRAMES_VEC1 + i * 0x18, 0); - tw32(HOSTCC_RXCOAL_MAXF_INT_VEC1 + i * 0x18, 0); - } -} - -static void __tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec) -{ - tg3_coal_tx_init(tp, ec); - tg3_coal_rx_init(tp, ec); - - if (!tg3_flag(tp, 5705_PLUS)) { - u32 val = ec->stats_block_coalesce_usecs; - - tw32(HOSTCC_RXCOAL_TICK_INT, ec->rx_coalesce_usecs_irq); - tw32(HOSTCC_TXCOAL_TICK_INT, ec->tx_coalesce_usecs_irq); - - if (!tp->link_up) - val = 0; - - tw32(HOSTCC_STAT_COAL_TICKS, val); - } -} - -/* tp->lock is held. */ -static void tg3_tx_rcbs_disable(struct tg3 *tp) -{ - u32 txrcb, limit; - - /* Disable all transmit rings but the first. */ - if (!tg3_flag(tp, 5705_PLUS)) - limit = NIC_SRAM_SEND_RCB + TG3_BDINFO_SIZE * 16; - else if (tg3_flag(tp, 5717_PLUS)) - limit = NIC_SRAM_SEND_RCB + TG3_BDINFO_SIZE * 4; - else if (tg3_flag(tp, 57765_CLASS) || - tg3_asic_rev(tp) == ASIC_REV_5762) - limit = NIC_SRAM_SEND_RCB + TG3_BDINFO_SIZE * 2; - else - limit = NIC_SRAM_SEND_RCB + TG3_BDINFO_SIZE; - - for (txrcb = NIC_SRAM_SEND_RCB + TG3_BDINFO_SIZE; - txrcb < limit; txrcb += TG3_BDINFO_SIZE) - tg3_write_mem(tp, txrcb + TG3_BDINFO_MAXLEN_FLAGS, - BDINFO_FLAGS_DISABLED); -} - -/* tp->lock is held. */ -static void tg3_tx_rcbs_init(struct tg3 *tp) -{ - int i = 0; - u32 txrcb = NIC_SRAM_SEND_RCB; - - if (tg3_flag(tp, ENABLE_TSS)) - i++; - - for (; i < tp->irq_max; i++, txrcb += TG3_BDINFO_SIZE) { - struct tg3_napi *tnapi = &tp->napi[i]; - - if (!tnapi->tx_ring) - continue; - - tg3_set_bdinfo(tp, txrcb, tnapi->tx_desc_mapping, - (TG3_TX_RING_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT), - NIC_SRAM_TX_BUFFER_DESC); - } -} - -/* tp->lock is held. */ -static void tg3_rx_ret_rcbs_disable(struct tg3 *tp) -{ - u32 rxrcb, limit; - - /* Disable all receive return rings but the first. */ - if (tg3_flag(tp, 5717_PLUS)) - limit = NIC_SRAM_RCV_RET_RCB + TG3_BDINFO_SIZE * 17; - else if (!tg3_flag(tp, 5705_PLUS)) - limit = NIC_SRAM_RCV_RET_RCB + TG3_BDINFO_SIZE * 16; - else if (tg3_asic_rev(tp) == ASIC_REV_5755 || - tg3_asic_rev(tp) == ASIC_REV_5762 || - tg3_flag(tp, 57765_CLASS)) - limit = NIC_SRAM_RCV_RET_RCB + TG3_BDINFO_SIZE * 4; - else - limit = NIC_SRAM_RCV_RET_RCB + TG3_BDINFO_SIZE; - - for (rxrcb = NIC_SRAM_RCV_RET_RCB + TG3_BDINFO_SIZE; - rxrcb < limit; rxrcb += TG3_BDINFO_SIZE) - tg3_write_mem(tp, rxrcb + TG3_BDINFO_MAXLEN_FLAGS, - BDINFO_FLAGS_DISABLED); -} - -/* tp->lock is held. */ -static void tg3_rx_ret_rcbs_init(struct tg3 *tp) -{ - int i = 0; - u32 rxrcb = NIC_SRAM_RCV_RET_RCB; - - if (tg3_flag(tp, ENABLE_RSS)) - i++; - - for (; i < tp->irq_max; i++, rxrcb += TG3_BDINFO_SIZE) { - struct tg3_napi *tnapi = &tp->napi[i]; - - if (!tnapi->rx_rcb) - continue; - - tg3_set_bdinfo(tp, rxrcb, tnapi->rx_rcb_mapping, - (tp->rx_ret_ring_mask + 1) << - BDINFO_FLAGS_MAXLEN_SHIFT, 0); - } -} - -/* tp->lock is held. */ -static void tg3_rings_reset(struct tg3 *tp) -{ - int i; - u32 stblk; - struct tg3_napi *tnapi = &tp->napi[0]; - - tg3_tx_rcbs_disable(tp); - - tg3_rx_ret_rcbs_disable(tp); - - /* Disable interrupts */ - tw32_mailbox_f(tp->napi[0].int_mbox, 1); - tp->napi[0].chk_msi_cnt = 0; - tp->napi[0].last_rx_cons = 0; - tp->napi[0].last_tx_cons = 0; - - /* Zero mailbox registers. */ - if (tg3_flag(tp, SUPPORT_MSIX)) { - for (i = 1; i < tp->irq_max; i++) { - tp->napi[i].tx_prod = 0; - tp->napi[i].tx_cons = 0; - if (tg3_flag(tp, ENABLE_TSS)) - tw32_mailbox(tp->napi[i].prodmbox, 0); - tw32_rx_mbox(tp->napi[i].consmbox, 0); - tw32_mailbox_f(tp->napi[i].int_mbox, 1); - tp->napi[i].chk_msi_cnt = 0; - tp->napi[i].last_rx_cons = 0; - tp->napi[i].last_tx_cons = 0; - } - if (!tg3_flag(tp, ENABLE_TSS)) - tw32_mailbox(tp->napi[0].prodmbox, 0); - } else { - tp->napi[0].tx_prod = 0; - tp->napi[0].tx_cons = 0; - tw32_mailbox(tp->napi[0].prodmbox, 0); - tw32_rx_mbox(tp->napi[0].consmbox, 0); - } - - /* Make sure the NIC-based send BD rings are disabled. */ - if (!tg3_flag(tp, 5705_PLUS)) { - u32 mbox = MAILBOX_SNDNIC_PROD_IDX_0 + TG3_64BIT_REG_LOW; - for (i = 0; i < 16; i++) - tw32_tx_mbox(mbox + i * 8, 0); - } - - /* Clear status block in ram. */ - memset(tnapi->hw_status, 0, TG3_HW_STATUS_SIZE); - - /* Set status block DMA address */ - tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH, - ((u64) tnapi->status_mapping >> 32)); - tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW, - ((u64) tnapi->status_mapping & 0xffffffff)); - - stblk = HOSTCC_STATBLCK_RING1; - - for (i = 1, tnapi++; i < tp->irq_cnt; i++, tnapi++) { - u64 mapping = (u64)tnapi->status_mapping; - tw32(stblk + TG3_64BIT_REG_HIGH, mapping >> 32); - tw32(stblk + TG3_64BIT_REG_LOW, mapping & 0xffffffff); - stblk += 8; - - /* Clear status block in ram. */ - memset(tnapi->hw_status, 0, TG3_HW_STATUS_SIZE); - } - - tg3_tx_rcbs_init(tp); - tg3_rx_ret_rcbs_init(tp); -} - -static void tg3_setup_rxbd_thresholds(struct tg3 *tp) -{ - u32 val, bdcache_maxcnt, host_rep_thresh, nic_rep_thresh; - - if (!tg3_flag(tp, 5750_PLUS) || - tg3_flag(tp, 5780_CLASS) || - tg3_asic_rev(tp) == ASIC_REV_5750 || - tg3_asic_rev(tp) == ASIC_REV_5752 || - tg3_flag(tp, 57765_PLUS)) - bdcache_maxcnt = TG3_SRAM_RX_STD_BDCACHE_SIZE_5700; - else if (tg3_asic_rev(tp) == ASIC_REV_5755 || - tg3_asic_rev(tp) == ASIC_REV_5787) - bdcache_maxcnt = TG3_SRAM_RX_STD_BDCACHE_SIZE_5755; - else - bdcache_maxcnt = TG3_SRAM_RX_STD_BDCACHE_SIZE_5906; - - nic_rep_thresh = min(bdcache_maxcnt / 2, tp->rx_std_max_post); - host_rep_thresh = max_t(u32, tp->rx_pending / 8, 1); - - val = min(nic_rep_thresh, host_rep_thresh); - tw32(RCVBDI_STD_THRESH, val); - - if (tg3_flag(tp, 57765_PLUS)) - tw32(STD_REPLENISH_LWM, bdcache_maxcnt); - - if (!tg3_flag(tp, JUMBO_CAPABLE) || tg3_flag(tp, 5780_CLASS)) - return; - - bdcache_maxcnt = TG3_SRAM_RX_JMB_BDCACHE_SIZE_5700; - - host_rep_thresh = max_t(u32, tp->rx_jumbo_pending / 8, 1); - - val = min(bdcache_maxcnt / 2, host_rep_thresh); - tw32(RCVBDI_JUMBO_THRESH, val); - - if (tg3_flag(tp, 57765_PLUS)) - tw32(JMB_REPLENISH_LWM, bdcache_maxcnt); -} - -static inline u32 calc_crc(unsigned char *buf, int len) -{ - u32 reg; - u32 tmp; - int j, k; - - reg = 0xffffffff; - - for (j = 0; j < len; j++) { - reg ^= buf[j]; - - for (k = 0; k < 8; k++) { - tmp = reg & 0x01; - - reg >>= 1; - - if (tmp) - reg ^= 0xedb88320; - } - } - - return ~reg; -} - -static void tg3_set_multi(struct tg3 *tp, unsigned int accept_all) -{ - /* accept or reject all multicast frames */ - tw32(MAC_HASH_REG_0, accept_all ? 0xffffffff : 0); - tw32(MAC_HASH_REG_1, accept_all ? 0xffffffff : 0); - tw32(MAC_HASH_REG_2, accept_all ? 0xffffffff : 0); - tw32(MAC_HASH_REG_3, accept_all ? 0xffffffff : 0); -} - -static void __tg3_set_rx_mode(struct net_device *dev) -{ - struct tg3 *tp = netdev_priv(dev); - u32 rx_mode; - - rx_mode = tp->rx_mode & ~(RX_MODE_PROMISC | - RX_MODE_KEEP_VLAN_TAG); - -#if !defined(CONFIG_VLAN_8021Q) && !defined(CONFIG_VLAN_8021Q_MODULE) - /* When ASF is in use, we always keep the RX_MODE_KEEP_VLAN_TAG - * flag clear. - */ - if (!tg3_flag(tp, ENABLE_ASF)) - rx_mode |= RX_MODE_KEEP_VLAN_TAG; -#endif - - if (dev->flags & IFF_PROMISC) { - /* Promiscuous mode. */ - rx_mode |= RX_MODE_PROMISC; - } else if (dev->flags & IFF_ALLMULTI) { - /* Accept all multicast. */ - tg3_set_multi(tp, 1); - } else if (netdev_mc_empty(dev)) { - /* Reject all multicast. */ - tg3_set_multi(tp, 0); - } else { - /* Accept one or more multicast(s). */ - struct netdev_hw_addr *ha; - u32 mc_filter[4] = { 0, }; - u32 regidx; - u32 bit; - u32 crc; - - netdev_for_each_mc_addr(ha, dev) { - crc = calc_crc(ha->addr, ETH_ALEN); - bit = ~crc & 0x7f; - regidx = (bit & 0x60) >> 5; - bit &= 0x1f; - mc_filter[regidx] |= (1 << bit); - } - - tw32(MAC_HASH_REG_0, mc_filter[0]); - tw32(MAC_HASH_REG_1, mc_filter[1]); - tw32(MAC_HASH_REG_2, mc_filter[2]); - tw32(MAC_HASH_REG_3, mc_filter[3]); - } - - if (netdev_uc_count(dev) > TG3_MAX_UCAST_ADDR(tp)) { - rx_mode |= RX_MODE_PROMISC; - } else if (!(dev->flags & IFF_PROMISC)) { - /* Add all entries into to the mac addr filter list */ - int i = 0; - struct netdev_hw_addr *ha; - - netdev_for_each_uc_addr(ha, dev) { - __tg3_set_one_mac_addr(tp, ha->addr, - i + TG3_UCAST_ADDR_IDX(tp)); - i++; - } - } - - if (rx_mode != tp->rx_mode) { - tp->rx_mode = rx_mode; - tw32_f(MAC_RX_MODE, rx_mode); - udelay(10); - } -} - -static void tg3_rss_init_dflt_indir_tbl(struct tg3 *tp, u32 qcnt) -{ - int i; - - for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i++) - tp->rss_ind_tbl[i] = ethtool_rxfh_indir_default(i, qcnt); -} - -static void tg3_rss_check_indir_tbl(struct tg3 *tp) -{ - int i; - - if (!tg3_flag(tp, SUPPORT_MSIX)) - return; - - if (tp->rxq_cnt == 1) { - memset(&tp->rss_ind_tbl[0], 0, sizeof(tp->rss_ind_tbl)); - return; - } - - /* Validate table against current IRQ count */ - for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i++) { - if (tp->rss_ind_tbl[i] >= tp->rxq_cnt) - break; - } - - if (i != TG3_RSS_INDIR_TBL_SIZE) - tg3_rss_init_dflt_indir_tbl(tp, tp->rxq_cnt); -} - -static void tg3_rss_write_indir_tbl(struct tg3 *tp) -{ - int i = 0; - u32 reg = MAC_RSS_INDIR_TBL_0; - - while (i < TG3_RSS_INDIR_TBL_SIZE) { - u32 val = tp->rss_ind_tbl[i]; - i++; - for (; i % 8; i++) { - val <<= 4; - val |= tp->rss_ind_tbl[i]; - } - tw32(reg, val); - reg += 4; - } -} - -static inline u32 tg3_lso_rd_dma_workaround_bit(struct tg3 *tp) -{ - if (tg3_asic_rev(tp) == ASIC_REV_5719) - return TG3_LSO_RD_DMA_TX_LENGTH_WA_5719; - else - return TG3_LSO_RD_DMA_TX_LENGTH_WA_5720; -} - -/* tp->lock is held. */ -static int tg3_reset_hw(struct tg3 *tp, bool reset_phy) -{ - u32 val, rdmac_mode; - int i, err, limit; - struct tg3_rx_prodring_set *tpr = &tp->napi[0].prodring; - - tg3_disable_ints(tp); - - tg3_stop_fw(tp); - - tg3_write_sig_pre_reset(tp, RESET_KIND_INIT); - - if (tg3_flag(tp, INIT_COMPLETE)) - tg3_abort_hw(tp, 1); - - if ((tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN) && - !(tp->phy_flags & TG3_PHYFLG_USER_CONFIGURED)) { - tg3_phy_pull_config(tp); - tg3_eee_pull_config(tp, NULL); - tp->phy_flags |= TG3_PHYFLG_USER_CONFIGURED; - } - - /* Enable MAC control of LPI */ - if (tp->phy_flags & TG3_PHYFLG_EEE_CAP) - tg3_setup_eee(tp); - - if (reset_phy) - tg3_phy_reset(tp); - - err = tg3_chip_reset(tp); - if (err) - return err; - - tg3_write_sig_legacy(tp, RESET_KIND_INIT); - - if (tg3_chip_rev(tp) == CHIPREV_5784_AX) { - val = tr32(TG3_CPMU_CTRL); - val &= ~(CPMU_CTRL_LINK_AWARE_MODE | CPMU_CTRL_LINK_IDLE_MODE); - tw32(TG3_CPMU_CTRL, val); - - val = tr32(TG3_CPMU_LSPD_10MB_CLK); - val &= ~CPMU_LSPD_10MB_MACCLK_MASK; - val |= CPMU_LSPD_10MB_MACCLK_6_25; - tw32(TG3_CPMU_LSPD_10MB_CLK, val); - - val = tr32(TG3_CPMU_LNK_AWARE_PWRMD); - val &= ~CPMU_LNK_AWARE_MACCLK_MASK; - val |= CPMU_LNK_AWARE_MACCLK_6_25; - tw32(TG3_CPMU_LNK_AWARE_PWRMD, val); - - val = tr32(TG3_CPMU_HST_ACC); - val &= ~CPMU_HST_ACC_MACCLK_MASK; - val |= CPMU_HST_ACC_MACCLK_6_25; - tw32(TG3_CPMU_HST_ACC, val); - } - - if (tg3_asic_rev(tp) == ASIC_REV_57780) { - val = tr32(PCIE_PWR_MGMT_THRESH) & ~PCIE_PWR_MGMT_L1_THRESH_MSK; - val |= PCIE_PWR_MGMT_EXT_ASPM_TMR_EN | - PCIE_PWR_MGMT_L1_THRESH_4MS; - tw32(PCIE_PWR_MGMT_THRESH, val); - - val = tr32(TG3_PCIE_EIDLE_DELAY) & ~TG3_PCIE_EIDLE_DELAY_MASK; - tw32(TG3_PCIE_EIDLE_DELAY, val | TG3_PCIE_EIDLE_DELAY_13_CLKS); - - tw32(TG3_CORR_ERR_STAT, TG3_CORR_ERR_STAT_CLEAR); - - val = tr32(TG3_PCIE_LNKCTL) & ~TG3_PCIE_LNKCTL_L1_PLL_PD_EN; - tw32(TG3_PCIE_LNKCTL, val | TG3_PCIE_LNKCTL_L1_PLL_PD_DIS); - } - - if (tg3_flag(tp, L1PLLPD_EN)) { - u32 grc_mode = tr32(GRC_MODE); - - /* Access the lower 1K of PL PCIE block registers. */ - val = grc_mode & ~GRC_MODE_PCIE_PORT_MASK; - tw32(GRC_MODE, val | GRC_MODE_PCIE_PL_SEL); - - val = tr32(TG3_PCIE_TLDLPL_PORT + TG3_PCIE_PL_LO_PHYCTL1); - tw32(TG3_PCIE_TLDLPL_PORT + TG3_PCIE_PL_LO_PHYCTL1, - val | TG3_PCIE_PL_LO_PHYCTL1_L1PLLPD_EN); - - tw32(GRC_MODE, grc_mode); - } - - if (tg3_flag(tp, 57765_CLASS)) { - if (tg3_chip_rev_id(tp) == CHIPREV_ID_57765_A0) { - u32 grc_mode = tr32(GRC_MODE); - - /* Access the lower 1K of PL PCIE block registers. */ - val = grc_mode & ~GRC_MODE_PCIE_PORT_MASK; - tw32(GRC_MODE, val | GRC_MODE_PCIE_PL_SEL); - - val = tr32(TG3_PCIE_TLDLPL_PORT + - TG3_PCIE_PL_LO_PHYCTL5); - tw32(TG3_PCIE_TLDLPL_PORT + TG3_PCIE_PL_LO_PHYCTL5, - val | TG3_PCIE_PL_LO_PHYCTL5_DIS_L2CLKREQ); - - tw32(GRC_MODE, grc_mode); - } - - if (tg3_chip_rev(tp) != CHIPREV_57765_AX) { - u32 grc_mode; - - /* Fix transmit hangs */ - val = tr32(TG3_CPMU_PADRNG_CTL); - val |= TG3_CPMU_PADRNG_CTL_RDIV2; - tw32(TG3_CPMU_PADRNG_CTL, val); - - grc_mode = tr32(GRC_MODE); - - /* Access the lower 1K of DL PCIE block registers. */ - val = grc_mode & ~GRC_MODE_PCIE_PORT_MASK; - tw32(GRC_MODE, val | GRC_MODE_PCIE_DL_SEL); - - val = tr32(TG3_PCIE_TLDLPL_PORT + - TG3_PCIE_DL_LO_FTSMAX); - val &= ~TG3_PCIE_DL_LO_FTSMAX_MSK; - tw32(TG3_PCIE_TLDLPL_PORT + TG3_PCIE_DL_LO_FTSMAX, - val | TG3_PCIE_DL_LO_FTSMAX_VAL); - - tw32(GRC_MODE, grc_mode); - } - - val = tr32(TG3_CPMU_LSPD_10MB_CLK); - val &= ~CPMU_LSPD_10MB_MACCLK_MASK; - val |= CPMU_LSPD_10MB_MACCLK_6_25; - tw32(TG3_CPMU_LSPD_10MB_CLK, val); - } - - /* This works around an issue with Athlon chipsets on - * B3 tigon3 silicon. This bit has no effect on any - * other revision. But do not set this on PCI Express - * chips and don't even touch the clocks if the CPMU is present. - */ - if (!tg3_flag(tp, CPMU_PRESENT)) { - if (!tg3_flag(tp, PCI_EXPRESS)) - tp->pci_clock_ctrl |= CLOCK_CTRL_DELAY_PCI_GRANT; - tw32_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl); - } - - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5704_A0 && - tg3_flag(tp, PCIX_MODE)) { - val = tr32(TG3PCI_PCISTATE); - val |= PCISTATE_RETRY_SAME_DMA; - tw32(TG3PCI_PCISTATE, val); - } - - if (tg3_flag(tp, ENABLE_APE)) { - /* Allow reads and writes to the - * APE register and memory space. - */ - val = tr32(TG3PCI_PCISTATE); - val |= PCISTATE_ALLOW_APE_CTLSPC_WR | - PCISTATE_ALLOW_APE_SHMEM_WR | - PCISTATE_ALLOW_APE_PSPACE_WR; - tw32(TG3PCI_PCISTATE, val); - } - - if (tg3_chip_rev(tp) == CHIPREV_5704_BX) { - /* Enable some hw fixes. */ - val = tr32(TG3PCI_MSI_DATA); - val |= (1 << 26) | (1 << 28) | (1 << 29); - tw32(TG3PCI_MSI_DATA, val); - } - - /* Descriptor ring init may make accesses to the - * NIC SRAM area to setup the TX descriptors, so we - * can only do this after the hardware has been - * successfully reset. - */ - err = tg3_init_rings(tp); - if (err) - return err; - - if (tg3_flag(tp, 57765_PLUS)) { - val = tr32(TG3PCI_DMA_RW_CTRL) & - ~DMA_RWCTRL_DIS_CACHE_ALIGNMENT; - if (tg3_chip_rev_id(tp) == CHIPREV_ID_57765_A0) - val &= ~DMA_RWCTRL_CRDRDR_RDMA_MRRS_MSK; - if (!tg3_flag(tp, 57765_CLASS) && - tg3_asic_rev(tp) != ASIC_REV_5717 && - tg3_asic_rev(tp) != ASIC_REV_5762) - val |= DMA_RWCTRL_TAGGED_STAT_WA; - tw32(TG3PCI_DMA_RW_CTRL, val | tp->dma_rwctrl); - } else if (tg3_asic_rev(tp) != ASIC_REV_5784 && - tg3_asic_rev(tp) != ASIC_REV_5761) { - /* This value is determined during the probe time DMA - * engine test, tg3_test_dma. - */ - tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl); - } - - tp->grc_mode &= ~(GRC_MODE_HOST_SENDBDS | - GRC_MODE_4X_NIC_SEND_RINGS | - GRC_MODE_NO_TX_PHDR_CSUM | - GRC_MODE_NO_RX_PHDR_CSUM); - tp->grc_mode |= GRC_MODE_HOST_SENDBDS; - - /* Pseudo-header checksum is done by hardware logic and not - * the offload processers, so make the chip do the pseudo- - * header checksums on receive. For transmit it is more - * convenient to do the pseudo-header checksum in software - * as Linux does that on transmit for us in all cases. - */ - tp->grc_mode |= GRC_MODE_NO_TX_PHDR_CSUM; - - val = GRC_MODE_IRQ_ON_MAC_ATTN | GRC_MODE_HOST_STACKUP; - if (tp->rxptpctl) - tw32(TG3_RX_PTP_CTL, - tp->rxptpctl | TG3_RX_PTP_CTL_HWTS_INTERLOCK); - - if (tg3_flag(tp, PTP_CAPABLE)) - val |= GRC_MODE_TIME_SYNC_ENABLE; - - tw32(GRC_MODE, tp->grc_mode | val); - - /* On one of the AMD platform, MRRS is restricted to 4000 because of - * south bridge limitation. As a workaround, Driver is setting MRRS - * to 2048 instead of default 4096. - */ - if (tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL && - tp->pdev->subsystem_device == TG3PCI_SUBDEVICE_ID_DELL_5762) { - val = tr32(TG3PCI_DEV_STATUS_CTRL) & ~MAX_READ_REQ_MASK; - tw32(TG3PCI_DEV_STATUS_CTRL, val | MAX_READ_REQ_SIZE_2048); - } - - /* Setup the timer prescalar register. Clock is always 66Mhz. */ - val = tr32(GRC_MISC_CFG); - val &= ~0xff; - val |= (65 << GRC_MISC_CFG_PRESCALAR_SHIFT); - tw32(GRC_MISC_CFG, val); - - /* Initialize MBUF/DESC pool. */ - if (tg3_flag(tp, 5750_PLUS)) { - /* Do nothing. */ - } else if (tg3_asic_rev(tp) != ASIC_REV_5705) { - tw32(BUFMGR_MB_POOL_ADDR, NIC_SRAM_MBUF_POOL_BASE); - if (tg3_asic_rev(tp) == ASIC_REV_5704) - tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE64); - else - tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE96); - tw32(BUFMGR_DMA_DESC_POOL_ADDR, NIC_SRAM_DMA_DESC_POOL_BASE); - tw32(BUFMGR_DMA_DESC_POOL_SIZE, NIC_SRAM_DMA_DESC_POOL_SIZE); - } else if (tg3_flag(tp, TSO_CAPABLE)) { - int fw_len; - - fw_len = tp->fw_len; - fw_len = (fw_len + (0x80 - 1)) & ~(0x80 - 1); - tw32(BUFMGR_MB_POOL_ADDR, - NIC_SRAM_MBUF_POOL_BASE5705 + fw_len); - tw32(BUFMGR_MB_POOL_SIZE, - NIC_SRAM_MBUF_POOL_SIZE5705 - fw_len - 0xa00); - } - - if (tp->dev->mtu <= ETH_DATA_LEN) { - tw32(BUFMGR_MB_RDMA_LOW_WATER, - tp->bufmgr_config.mbuf_read_dma_low_water); - tw32(BUFMGR_MB_MACRX_LOW_WATER, - tp->bufmgr_config.mbuf_mac_rx_low_water); - tw32(BUFMGR_MB_HIGH_WATER, - tp->bufmgr_config.mbuf_high_water); - } else { - tw32(BUFMGR_MB_RDMA_LOW_WATER, - tp->bufmgr_config.mbuf_read_dma_low_water_jumbo); - tw32(BUFMGR_MB_MACRX_LOW_WATER, - tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo); - tw32(BUFMGR_MB_HIGH_WATER, - tp->bufmgr_config.mbuf_high_water_jumbo); - } - tw32(BUFMGR_DMA_LOW_WATER, - tp->bufmgr_config.dma_low_water); - tw32(BUFMGR_DMA_HIGH_WATER, - tp->bufmgr_config.dma_high_water); - - val = BUFMGR_MODE_ENABLE | BUFMGR_MODE_ATTN_ENABLE; - if (tg3_asic_rev(tp) == ASIC_REV_5719) - val |= BUFMGR_MODE_NO_TX_UNDERRUN; - if (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5762 || - tg3_chip_rev_id(tp) == CHIPREV_ID_5719_A0 || - tg3_chip_rev_id(tp) == CHIPREV_ID_5720_A0) - val |= BUFMGR_MODE_MBLOW_ATTN_ENAB; - tw32(BUFMGR_MODE, val); - for (i = 0; i < 2000; i++) { - if (tr32(BUFMGR_MODE) & BUFMGR_MODE_ENABLE) - break; - udelay(10); - } - if (i >= 2000) { - netdev_err(tp->dev, "%s cannot enable BUFMGR\n", __func__); - return -ENODEV; - } - - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5906_A1) - tw32(ISO_PKT_TX, (tr32(ISO_PKT_TX) & ~0x3) | 0x2); - - tg3_setup_rxbd_thresholds(tp); - - /* Initialize TG3_BDINFO's at: - * RCVDBDI_STD_BD: standard eth size rx ring - * RCVDBDI_JUMBO_BD: jumbo frame rx ring - * RCVDBDI_MINI_BD: small frame rx ring (??? does not work) - * - * like so: - * TG3_BDINFO_HOST_ADDR: high/low parts of DMA address of ring - * TG3_BDINFO_MAXLEN_FLAGS: (rx max buffer size << 16) | - * ring attribute flags - * TG3_BDINFO_NIC_ADDR: location of descriptors in nic SRAM - * - * Standard receive ring @ NIC_SRAM_RX_BUFFER_DESC, 512 entries. - * Jumbo receive ring @ NIC_SRAM_RX_JUMBO_BUFFER_DESC, 256 entries. - * - * The size of each ring is fixed in the firmware, but the location is - * configurable. - */ - tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH, - ((u64) tpr->rx_std_mapping >> 32)); - tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW, - ((u64) tpr->rx_std_mapping & 0xffffffff)); - if (!tg3_flag(tp, 5717_PLUS)) - tw32(RCVDBDI_STD_BD + TG3_BDINFO_NIC_ADDR, - NIC_SRAM_RX_BUFFER_DESC); - - /* Disable the mini ring */ - if (!tg3_flag(tp, 5705_PLUS)) - tw32(RCVDBDI_MINI_BD + TG3_BDINFO_MAXLEN_FLAGS, - BDINFO_FLAGS_DISABLED); - - /* Program the jumbo buffer descriptor ring control - * blocks on those devices that have them. - */ - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5719_A0 || - (tg3_flag(tp, JUMBO_CAPABLE) && !tg3_flag(tp, 5780_CLASS))) { - - if (tg3_flag(tp, JUMBO_RING_ENABLE)) { - tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH, - ((u64) tpr->rx_jmb_mapping >> 32)); - tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW, - ((u64) tpr->rx_jmb_mapping & 0xffffffff)); - val = TG3_RX_JMB_RING_SIZE(tp) << - BDINFO_FLAGS_MAXLEN_SHIFT; - tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS, - val | BDINFO_FLAGS_USE_EXT_RECV); - if (!tg3_flag(tp, USE_JUMBO_BDFLAG) || - tg3_flag(tp, 57765_CLASS) || - tg3_asic_rev(tp) == ASIC_REV_5762) - tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_NIC_ADDR, - NIC_SRAM_RX_JUMBO_BUFFER_DESC); - } else { - tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS, - BDINFO_FLAGS_DISABLED); - } - - if (tg3_flag(tp, 57765_PLUS)) { - val = TG3_RX_STD_RING_SIZE(tp); - val <<= BDINFO_FLAGS_MAXLEN_SHIFT; - val |= (TG3_RX_STD_DMA_SZ << 2); - } else - val = TG3_RX_STD_DMA_SZ << BDINFO_FLAGS_MAXLEN_SHIFT; - } else - val = TG3_RX_STD_MAX_SIZE_5700 << BDINFO_FLAGS_MAXLEN_SHIFT; - - tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS, val); - - tpr->rx_std_prod_idx = tp->rx_pending; - tw32_rx_mbox(TG3_RX_STD_PROD_IDX_REG, tpr->rx_std_prod_idx); - - tpr->rx_jmb_prod_idx = - tg3_flag(tp, JUMBO_RING_ENABLE) ? tp->rx_jumbo_pending : 0; - tw32_rx_mbox(TG3_RX_JMB_PROD_IDX_REG, tpr->rx_jmb_prod_idx); - - tg3_rings_reset(tp); - - /* Initialize MAC address and backoff seed. */ - __tg3_set_mac_addr(tp, false); - - /* MTU + ethernet header + FCS + optional VLAN tag */ - tw32(MAC_RX_MTU_SIZE, - tp->dev->mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN); - - /* The slot time is changed by tg3_setup_phy if we - * run at gigabit with half duplex. - */ - val = (2 << TX_LENGTHS_IPG_CRS_SHIFT) | - (6 << TX_LENGTHS_IPG_SHIFT) | - (32 << TX_LENGTHS_SLOT_TIME_SHIFT); - - if (tg3_asic_rev(tp) == ASIC_REV_5720 || - tg3_asic_rev(tp) == ASIC_REV_5762) - val |= tr32(MAC_TX_LENGTHS) & - (TX_LENGTHS_JMB_FRM_LEN_MSK | - TX_LENGTHS_CNT_DWN_VAL_MSK); - - tw32(MAC_TX_LENGTHS, val); - - /* Receive rules. */ - tw32(MAC_RCV_RULE_CFG, RCV_RULE_CFG_DEFAULT_CLASS); - tw32(RCVLPC_CONFIG, 0x0181); - - /* Calculate RDMAC_MODE setting early, we need it to determine - * the RCVLPC_STATE_ENABLE mask. - */ - rdmac_mode = (RDMAC_MODE_ENABLE | RDMAC_MODE_TGTABORT_ENAB | - RDMAC_MODE_MSTABORT_ENAB | RDMAC_MODE_PARITYERR_ENAB | - RDMAC_MODE_ADDROFLOW_ENAB | RDMAC_MODE_FIFOOFLOW_ENAB | - RDMAC_MODE_FIFOURUN_ENAB | RDMAC_MODE_FIFOOREAD_ENAB | - RDMAC_MODE_LNGREAD_ENAB); - - if (tg3_asic_rev(tp) == ASIC_REV_5717) - rdmac_mode |= RDMAC_MODE_MULT_DMA_RD_DIS; - - if (tg3_asic_rev(tp) == ASIC_REV_5784 || - tg3_asic_rev(tp) == ASIC_REV_5785 || - tg3_asic_rev(tp) == ASIC_REV_57780) - rdmac_mode |= RDMAC_MODE_BD_SBD_CRPT_ENAB | - RDMAC_MODE_MBUF_RBD_CRPT_ENAB | - RDMAC_MODE_MBUF_SBD_CRPT_ENAB; - - if (tg3_asic_rev(tp) == ASIC_REV_5705 && - tg3_chip_rev_id(tp) != CHIPREV_ID_5705_A0) { - if (tg3_flag(tp, TSO_CAPABLE) && - tg3_asic_rev(tp) == ASIC_REV_5705) { - rdmac_mode |= RDMAC_MODE_FIFO_SIZE_128; - } else if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) && - !tg3_flag(tp, IS_5788)) { - rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST; - } - } - - if (tg3_flag(tp, PCI_EXPRESS)) - rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST; - - if (tg3_asic_rev(tp) == ASIC_REV_57766) { - tp->dma_limit = 0; - if (tp->dev->mtu <= ETH_DATA_LEN) { - rdmac_mode |= RDMAC_MODE_JMB_2K_MMRR; - tp->dma_limit = TG3_TX_BD_DMA_MAX_2K; - } - } - - if (tg3_flag(tp, HW_TSO_1) || - tg3_flag(tp, HW_TSO_2) || - tg3_flag(tp, HW_TSO_3)) - rdmac_mode |= RDMAC_MODE_IPV4_LSO_EN; - - if (tg3_flag(tp, 57765_PLUS) || - tg3_asic_rev(tp) == ASIC_REV_5785 || - tg3_asic_rev(tp) == ASIC_REV_57780) - rdmac_mode |= RDMAC_MODE_IPV6_LSO_EN; - - if (tg3_asic_rev(tp) == ASIC_REV_5720 || - tg3_asic_rev(tp) == ASIC_REV_5762) - rdmac_mode |= tr32(RDMAC_MODE) & RDMAC_MODE_H2BNC_VLAN_DET; - - if (tg3_asic_rev(tp) == ASIC_REV_5761 || - tg3_asic_rev(tp) == ASIC_REV_5784 || - tg3_asic_rev(tp) == ASIC_REV_5785 || - tg3_asic_rev(tp) == ASIC_REV_57780 || - tg3_flag(tp, 57765_PLUS)) { - u32 tgtreg; - - if (tg3_asic_rev(tp) == ASIC_REV_5762) - tgtreg = TG3_RDMA_RSRVCTRL_REG2; - else - tgtreg = TG3_RDMA_RSRVCTRL_REG; - - val = tr32(tgtreg); - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5719_A0 || - tg3_asic_rev(tp) == ASIC_REV_5762) { - val &= ~(TG3_RDMA_RSRVCTRL_TXMRGN_MASK | - TG3_RDMA_RSRVCTRL_FIFO_LWM_MASK | - TG3_RDMA_RSRVCTRL_FIFO_HWM_MASK); - val |= TG3_RDMA_RSRVCTRL_TXMRGN_320B | - TG3_RDMA_RSRVCTRL_FIFO_LWM_1_5K | - TG3_RDMA_RSRVCTRL_FIFO_HWM_1_5K; - } - tw32(tgtreg, val | TG3_RDMA_RSRVCTRL_FIFO_OFLW_FIX); - } - - if (tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720 || - tg3_asic_rev(tp) == ASIC_REV_5762) { - u32 tgtreg; - - if (tg3_asic_rev(tp) == ASIC_REV_5762) - tgtreg = TG3_LSO_RD_DMA_CRPTEN_CTRL2; - else - tgtreg = TG3_LSO_RD_DMA_CRPTEN_CTRL; - - val = tr32(tgtreg); - tw32(tgtreg, val | - TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_BD_4K | - TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_LSO_4K); - } - - /* Receive/send statistics. */ - if (tg3_flag(tp, 5750_PLUS)) { - val = tr32(RCVLPC_STATS_ENABLE); - val &= ~RCVLPC_STATSENAB_DACK_FIX; - tw32(RCVLPC_STATS_ENABLE, val); - } else if ((rdmac_mode & RDMAC_MODE_FIFO_SIZE_128) && - tg3_flag(tp, TSO_CAPABLE)) { - val = tr32(RCVLPC_STATS_ENABLE); - val &= ~RCVLPC_STATSENAB_LNGBRST_RFIX; - tw32(RCVLPC_STATS_ENABLE, val); - } else { - tw32(RCVLPC_STATS_ENABLE, 0xffffff); - } - tw32(RCVLPC_STATSCTRL, RCVLPC_STATSCTRL_ENABLE); - tw32(SNDDATAI_STATSENAB, 0xffffff); - tw32(SNDDATAI_STATSCTRL, - (SNDDATAI_SCTRL_ENABLE | - SNDDATAI_SCTRL_FASTUPD)); - - /* Setup host coalescing engine. */ - tw32(HOSTCC_MODE, 0); - for (i = 0; i < 2000; i++) { - if (!(tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE)) - break; - udelay(10); - } - - __tg3_set_coalesce(tp, &tp->coal); - - if (!tg3_flag(tp, 5705_PLUS)) { - /* Status/statistics block address. See tg3_timer, - * the tg3_periodic_fetch_stats call there, and - * tg3_get_stats to see how this works for 5705/5750 chips. - */ - tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH, - ((u64) tp->stats_mapping >> 32)); - tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW, - ((u64) tp->stats_mapping & 0xffffffff)); - tw32(HOSTCC_STATS_BLK_NIC_ADDR, NIC_SRAM_STATS_BLK); - - tw32(HOSTCC_STATUS_BLK_NIC_ADDR, NIC_SRAM_STATUS_BLK); - - /* Clear statistics and status block memory areas */ - for (i = NIC_SRAM_STATS_BLK; - i < NIC_SRAM_STATUS_BLK + TG3_HW_STATUS_SIZE; - i += sizeof(u32)) { - tg3_write_mem(tp, i, 0); - udelay(40); - } - } - - tw32(HOSTCC_MODE, HOSTCC_MODE_ENABLE | tp->coalesce_mode); - - tw32(RCVCC_MODE, RCVCC_MODE_ENABLE | RCVCC_MODE_ATTN_ENABLE); - tw32(RCVLPC_MODE, RCVLPC_MODE_ENABLE); - if (!tg3_flag(tp, 5705_PLUS)) - tw32(RCVLSC_MODE, RCVLSC_MODE_ENABLE | RCVLSC_MODE_ATTN_ENABLE); - - if (tp->phy_flags & TG3_PHYFLG_MII_SERDES) { - tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT; - /* reset to prevent losing 1st rx packet intermittently */ - tw32_f(MAC_RX_MODE, RX_MODE_RESET); - udelay(10); - } - - tp->mac_mode |= MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE | - MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | - MAC_MODE_FHDE_ENABLE; - if (tg3_flag(tp, ENABLE_APE)) - tp->mac_mode |= MAC_MODE_APE_TX_EN | MAC_MODE_APE_RX_EN; - if (!tg3_flag(tp, 5705_PLUS) && - !(tp->phy_flags & TG3_PHYFLG_PHY_SERDES) && - tg3_asic_rev(tp) != ASIC_REV_5700) - tp->mac_mode |= MAC_MODE_LINK_POLARITY; - tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_RXSTAT_CLEAR | MAC_MODE_TXSTAT_CLEAR); - udelay(40); - - /* tp->grc_local_ctrl is partially set up during tg3_get_invariants(). - * If TG3_FLAG_IS_NIC is zero, we should read the - * register to preserve the GPIO settings for LOMs. The GPIOs, - * whether used as inputs or outputs, are set by boot code after - * reset. - */ - if (!tg3_flag(tp, IS_NIC)) { - u32 gpio_mask; - - gpio_mask = GRC_LCLCTRL_GPIO_OE0 | GRC_LCLCTRL_GPIO_OE1 | - GRC_LCLCTRL_GPIO_OE2 | GRC_LCLCTRL_GPIO_OUTPUT0 | - GRC_LCLCTRL_GPIO_OUTPUT1 | GRC_LCLCTRL_GPIO_OUTPUT2; - - if (tg3_asic_rev(tp) == ASIC_REV_5752) - gpio_mask |= GRC_LCLCTRL_GPIO_OE3 | - GRC_LCLCTRL_GPIO_OUTPUT3; - - if (tg3_asic_rev(tp) == ASIC_REV_5755) - gpio_mask |= GRC_LCLCTRL_GPIO_UART_SEL; - - tp->grc_local_ctrl &= ~gpio_mask; - tp->grc_local_ctrl |= tr32(GRC_LOCAL_CTRL) & gpio_mask; - - /* GPIO1 must be driven high for eeprom write protect */ - if (tg3_flag(tp, EEPROM_WRITE_PROT)) - tp->grc_local_ctrl |= (GRC_LCLCTRL_GPIO_OE1 | - GRC_LCLCTRL_GPIO_OUTPUT1); - } - tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl); - udelay(100); - - if (tg3_flag(tp, USING_MSIX)) { - val = tr32(MSGINT_MODE); - val |= MSGINT_MODE_ENABLE; - if (tp->irq_cnt > 1) - val |= MSGINT_MODE_MULTIVEC_EN; - if (!tg3_flag(tp, 1SHOT_MSI)) - val |= MSGINT_MODE_ONE_SHOT_DISABLE; - tw32(MSGINT_MODE, val); - } - - if (!tg3_flag(tp, 5705_PLUS)) { - tw32_f(DMAC_MODE, DMAC_MODE_ENABLE); - udelay(40); - } - - val = (WDMAC_MODE_ENABLE | WDMAC_MODE_TGTABORT_ENAB | - WDMAC_MODE_MSTABORT_ENAB | WDMAC_MODE_PARITYERR_ENAB | - WDMAC_MODE_ADDROFLOW_ENAB | WDMAC_MODE_FIFOOFLOW_ENAB | - WDMAC_MODE_FIFOURUN_ENAB | WDMAC_MODE_FIFOOREAD_ENAB | - WDMAC_MODE_LNGREAD_ENAB); - - if (tg3_asic_rev(tp) == ASIC_REV_5705 && - tg3_chip_rev_id(tp) != CHIPREV_ID_5705_A0) { - if (tg3_flag(tp, TSO_CAPABLE) && - (tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A1 || - tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A2)) { - /* nothing */ - } else if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) && - !tg3_flag(tp, IS_5788)) { - val |= WDMAC_MODE_RX_ACCEL; - } - } - - /* Enable host coalescing bug fix */ - if (tg3_flag(tp, 5755_PLUS)) - val |= WDMAC_MODE_STATUS_TAG_FIX; - - if (tg3_asic_rev(tp) == ASIC_REV_5785) - val |= WDMAC_MODE_BURST_ALL_DATA; - - tw32_f(WDMAC_MODE, val); - udelay(40); - - if (tg3_flag(tp, PCIX_MODE)) { - u16 pcix_cmd; - - pci_read_config_word(tp->pdev, tp->pcix_cap + PCI_X_CMD, - &pcix_cmd); - if (tg3_asic_rev(tp) == ASIC_REV_5703) { - pcix_cmd &= ~PCI_X_CMD_MAX_READ; - pcix_cmd |= PCI_X_CMD_READ_2K; - } else if (tg3_asic_rev(tp) == ASIC_REV_5704) { - pcix_cmd &= ~(PCI_X_CMD_MAX_SPLIT | PCI_X_CMD_MAX_READ); - pcix_cmd |= PCI_X_CMD_READ_2K; - } - pci_write_config_word(tp->pdev, tp->pcix_cap + PCI_X_CMD, - pcix_cmd); - } - - tw32_f(RDMAC_MODE, rdmac_mode); - udelay(40); - - if (tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720) { - for (i = 0; i < TG3_NUM_RDMA_CHANNELS; i++) { - if (tr32(TG3_RDMA_LENGTH + (i << 2)) > TG3_MAX_MTU(tp)) - break; - } - if (i < TG3_NUM_RDMA_CHANNELS) { - val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL); - val |= tg3_lso_rd_dma_workaround_bit(tp); - tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val); - tg3_flag_set(tp, 5719_5720_RDMA_BUG); - } - } - - tw32(RCVDCC_MODE, RCVDCC_MODE_ENABLE | RCVDCC_MODE_ATTN_ENABLE); - if (!tg3_flag(tp, 5705_PLUS)) - tw32(MBFREE_MODE, MBFREE_MODE_ENABLE); - - if (tg3_asic_rev(tp) == ASIC_REV_5761) - tw32(SNDDATAC_MODE, - SNDDATAC_MODE_ENABLE | SNDDATAC_MODE_CDELAY); - else - tw32(SNDDATAC_MODE, SNDDATAC_MODE_ENABLE); - - tw32(SNDBDC_MODE, SNDBDC_MODE_ENABLE | SNDBDC_MODE_ATTN_ENABLE); - tw32(RCVBDI_MODE, RCVBDI_MODE_ENABLE | RCVBDI_MODE_RCB_ATTN_ENAB); - val = RCVDBDI_MODE_ENABLE | RCVDBDI_MODE_INV_RING_SZ; - if (tg3_flag(tp, LRG_PROD_RING_CAP)) - val |= RCVDBDI_MODE_LRG_RING_SZ; - tw32(RCVDBDI_MODE, val); - tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE); - if (tg3_flag(tp, HW_TSO_1) || - tg3_flag(tp, HW_TSO_2) || - tg3_flag(tp, HW_TSO_3)) - tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE | 0x8); - val = SNDBDI_MODE_ENABLE | SNDBDI_MODE_ATTN_ENABLE; - if (tg3_flag(tp, ENABLE_TSS)) - val |= SNDBDI_MODE_MULTI_TXQ_EN; - tw32(SNDBDI_MODE, val); - tw32(SNDBDS_MODE, SNDBDS_MODE_ENABLE | SNDBDS_MODE_ATTN_ENABLE); - - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0) { - err = tg3_load_5701_a0_firmware_fix(tp); - if (err) - return err; - } - - if (tg3_asic_rev(tp) == ASIC_REV_57766) { - /* Ignore any errors for the firmware download. If download - * fails, the device will operate with EEE disabled - */ - tg3_load_57766_firmware(tp); - } - - if (tg3_flag(tp, TSO_CAPABLE)) { - err = tg3_load_tso_firmware(tp); - if (err) - return err; - } - - tp->tx_mode = TX_MODE_ENABLE; - - if (tg3_flag(tp, 5755_PLUS) || - tg3_asic_rev(tp) == ASIC_REV_5906) - tp->tx_mode |= TX_MODE_MBUF_LOCKUP_FIX; - - if (tg3_asic_rev(tp) == ASIC_REV_5720 || - tg3_asic_rev(tp) == ASIC_REV_5762) { - val = TX_MODE_JMB_FRM_LEN | TX_MODE_CNT_DN_MODE; - tp->tx_mode &= ~val; - tp->tx_mode |= tr32(MAC_TX_MODE) & val; - } - - tw32_f(MAC_TX_MODE, tp->tx_mode); - udelay(100); - - if (tg3_flag(tp, ENABLE_RSS)) { - u32 rss_key[10]; - - tg3_rss_write_indir_tbl(tp); - - netdev_rss_key_fill(rss_key, 10 * sizeof(u32)); - - for (i = 0; i < 10 ; i++) - tw32(MAC_RSS_HASH_KEY_0 + i*4, rss_key[i]); - } - - tp->rx_mode = RX_MODE_ENABLE; - if (tg3_flag(tp, 5755_PLUS)) - tp->rx_mode |= RX_MODE_IPV6_CSUM_ENABLE; - - if (tg3_asic_rev(tp) == ASIC_REV_5762) - tp->rx_mode |= RX_MODE_IPV4_FRAG_FIX; - - if (tg3_flag(tp, ENABLE_RSS)) - tp->rx_mode |= RX_MODE_RSS_ENABLE | - RX_MODE_RSS_ITBL_HASH_BITS_7 | - RX_MODE_RSS_IPV6_HASH_EN | - RX_MODE_RSS_TCP_IPV6_HASH_EN | - RX_MODE_RSS_IPV4_HASH_EN | - RX_MODE_RSS_TCP_IPV4_HASH_EN; - - tw32_f(MAC_RX_MODE, tp->rx_mode); - udelay(10); - - tw32(MAC_LED_CTRL, tp->led_ctrl); - - tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB); - if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) { - tw32_f(MAC_RX_MODE, RX_MODE_RESET); - udelay(10); - } - tw32_f(MAC_RX_MODE, tp->rx_mode); - udelay(10); - - if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) { - if ((tg3_asic_rev(tp) == ASIC_REV_5704) && - !(tp->phy_flags & TG3_PHYFLG_SERDES_PREEMPHASIS)) { - /* Set drive transmission level to 1.2V */ - /* only if the signal pre-emphasis bit is not set */ - val = tr32(MAC_SERDES_CFG); - val &= 0xfffff000; - val |= 0x880; - tw32(MAC_SERDES_CFG, val); - } - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5703_A1) - tw32(MAC_SERDES_CFG, 0x616000); - } - - /* Prevent chip from dropping frames when flow control - * is enabled. - */ - if (tg3_flag(tp, 57765_CLASS)) - val = 1; - else - val = 2; - tw32_f(MAC_LOW_WMARK_MAX_RX_FRAME, val); - - if (tg3_asic_rev(tp) == ASIC_REV_5704 && - (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)) { - /* Use hardware link auto-negotiation */ - tg3_flag_set(tp, HW_AUTONEG); - } - - if ((tp->phy_flags & TG3_PHYFLG_MII_SERDES) && - tg3_asic_rev(tp) == ASIC_REV_5714) { - u32 tmp; - - tmp = tr32(SERDES_RX_CTRL); - tw32(SERDES_RX_CTRL, tmp | SERDES_RX_SIG_DETECT); - tp->grc_local_ctrl &= ~GRC_LCLCTRL_USE_EXT_SIG_DETECT; - tp->grc_local_ctrl |= GRC_LCLCTRL_USE_SIG_DETECT; - tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl); - } - - if (!tg3_flag(tp, USE_PHYLIB)) { - if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) - tp->phy_flags &= ~TG3_PHYFLG_IS_LOW_POWER; - - err = tg3_setup_phy(tp, false); - if (err) - return err; - - if (!(tp->phy_flags & TG3_PHYFLG_PHY_SERDES) && - !(tp->phy_flags & TG3_PHYFLG_IS_FET)) { - u32 tmp; - - /* Clear CRC stats. */ - if (!tg3_readphy(tp, MII_TG3_TEST1, &tmp)) { - tg3_writephy(tp, MII_TG3_TEST1, - tmp | MII_TG3_TEST1_CRC_EN); - tg3_readphy(tp, MII_TG3_RXR_COUNTERS, &tmp); - } - } - } - - __tg3_set_rx_mode(tp->dev); - - /* Initialize receive rules. */ - tw32(MAC_RCV_RULE_0, 0xc2000000 & RCV_RULE_DISABLE_MASK); - tw32(MAC_RCV_VALUE_0, 0xffffffff & RCV_RULE_DISABLE_MASK); - tw32(MAC_RCV_RULE_1, 0x86000004 & RCV_RULE_DISABLE_MASK); - tw32(MAC_RCV_VALUE_1, 0xffffffff & RCV_RULE_DISABLE_MASK); - - if (tg3_flag(tp, 5705_PLUS) && !tg3_flag(tp, 5780_CLASS)) - limit = 8; - else - limit = 16; - if (tg3_flag(tp, ENABLE_ASF)) - limit -= 4; - switch (limit) { - case 16: - tw32(MAC_RCV_RULE_15, 0); tw32(MAC_RCV_VALUE_15, 0); - case 15: - tw32(MAC_RCV_RULE_14, 0); tw32(MAC_RCV_VALUE_14, 0); - case 14: - tw32(MAC_RCV_RULE_13, 0); tw32(MAC_RCV_VALUE_13, 0); - case 13: - tw32(MAC_RCV_RULE_12, 0); tw32(MAC_RCV_VALUE_12, 0); - case 12: - tw32(MAC_RCV_RULE_11, 0); tw32(MAC_RCV_VALUE_11, 0); - case 11: - tw32(MAC_RCV_RULE_10, 0); tw32(MAC_RCV_VALUE_10, 0); - case 10: - tw32(MAC_RCV_RULE_9, 0); tw32(MAC_RCV_VALUE_9, 0); - case 9: - tw32(MAC_RCV_RULE_8, 0); tw32(MAC_RCV_VALUE_8, 0); - case 8: - tw32(MAC_RCV_RULE_7, 0); tw32(MAC_RCV_VALUE_7, 0); - case 7: - tw32(MAC_RCV_RULE_6, 0); tw32(MAC_RCV_VALUE_6, 0); - case 6: - tw32(MAC_RCV_RULE_5, 0); tw32(MAC_RCV_VALUE_5, 0); - case 5: - tw32(MAC_RCV_RULE_4, 0); tw32(MAC_RCV_VALUE_4, 0); - case 4: - /* tw32(MAC_RCV_RULE_3, 0); tw32(MAC_RCV_VALUE_3, 0); */ - case 3: - /* tw32(MAC_RCV_RULE_2, 0); tw32(MAC_RCV_VALUE_2, 0); */ - case 2: - case 1: - - default: - break; - } - - if (tg3_flag(tp, ENABLE_APE)) - /* Write our heartbeat update interval to APE. */ - tg3_ape_write32(tp, TG3_APE_HOST_HEARTBEAT_INT_MS, - APE_HOST_HEARTBEAT_INT_DISABLE); - - tg3_write_sig_post_reset(tp, RESET_KIND_INIT); - - return 0; -} - -/* Called at device open time to get the chip ready for - * packet processing. Invoked with tp->lock held. - */ -static int tg3_init_hw(struct tg3 *tp, bool reset_phy) -{ - /* Chip may have been just powered on. If so, the boot code may still - * be running initialization. Wait for it to finish to avoid races in - * accessing the hardware. - */ - tg3_enable_register_access(tp); - tg3_poll_fw(tp); - - tg3_switch_clocks(tp); - - tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0); - - return tg3_reset_hw(tp, reset_phy); -} - -#ifdef CONFIG_TIGON3_HWMON -static void tg3_sd_scan_scratchpad(struct tg3 *tp, struct tg3_ocir *ocir) -{ - int i; - - for (i = 0; i < TG3_SD_NUM_RECS; i++, ocir++) { - u32 off = i * TG3_OCIR_LEN, len = TG3_OCIR_LEN; - - tg3_ape_scratchpad_read(tp, (u32 *) ocir, off, len); - off += len; - - if (ocir->signature != TG3_OCIR_SIG_MAGIC || - !(ocir->version_flags & TG3_OCIR_FLAG_ACTIVE)) - memset(ocir, 0, TG3_OCIR_LEN); - } -} - -/* sysfs attributes for hwmon */ -static ssize_t tg3_show_temp(struct device *dev, - struct device_attribute *devattr, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); - struct tg3 *tp = dev_get_drvdata(dev); - u32 temperature; - - spin_lock_bh(&tp->lock); - tg3_ape_scratchpad_read(tp, &temperature, attr->index, - sizeof(temperature)); - spin_unlock_bh(&tp->lock); - return sprintf(buf, "%u\n", temperature * 1000); -} - - -static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, tg3_show_temp, NULL, - TG3_TEMP_SENSOR_OFFSET); -static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, tg3_show_temp, NULL, - TG3_TEMP_CAUTION_OFFSET); -static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO, tg3_show_temp, NULL, - TG3_TEMP_MAX_OFFSET); - -static struct attribute *tg3_attrs[] = { - &sensor_dev_attr_temp1_input.dev_attr.attr, - &sensor_dev_attr_temp1_crit.dev_attr.attr, - &sensor_dev_attr_temp1_max.dev_attr.attr, - NULL -}; -ATTRIBUTE_GROUPS(tg3); - -static void tg3_hwmon_close(struct tg3 *tp) -{ - if (tp->hwmon_dev) { - hwmon_device_unregister(tp->hwmon_dev); - tp->hwmon_dev = NULL; - } -} - -static void tg3_hwmon_open(struct tg3 *tp) -{ - int i; - u32 size = 0; - struct pci_dev *pdev = tp->pdev; - struct tg3_ocir ocirs[TG3_SD_NUM_RECS]; - - tg3_sd_scan_scratchpad(tp, ocirs); - - for (i = 0; i < TG3_SD_NUM_RECS; i++) { - if (!ocirs[i].src_data_length) - continue; - - size += ocirs[i].src_hdr_length; - size += ocirs[i].src_data_length; - } - - if (!size) - return; - - tp->hwmon_dev = hwmon_device_register_with_groups(&pdev->dev, "tg3", - tp, tg3_groups); - if (IS_ERR(tp->hwmon_dev)) { - tp->hwmon_dev = NULL; - dev_err(&pdev->dev, "Cannot register hwmon device, aborting\n"); - } -} -#else -static inline void tg3_hwmon_close(struct tg3 *tp) { } -static inline void tg3_hwmon_open(struct tg3 *tp) { } -#endif /* CONFIG_TIGON3_HWMON */ - - -#define TG3_STAT_ADD32(PSTAT, REG) \ -do { u32 __val = tr32(REG); \ - (PSTAT)->low += __val; \ - if ((PSTAT)->low < __val) \ - (PSTAT)->high += 1; \ -} while (0) - -static void tg3_periodic_fetch_stats(struct tg3 *tp) -{ - struct tg3_hw_stats *sp = tp->hw_stats; - - if (!tp->link_up) - return; - - TG3_STAT_ADD32(&sp->tx_octets, MAC_TX_STATS_OCTETS); - TG3_STAT_ADD32(&sp->tx_collisions, MAC_TX_STATS_COLLISIONS); - TG3_STAT_ADD32(&sp->tx_xon_sent, MAC_TX_STATS_XON_SENT); - TG3_STAT_ADD32(&sp->tx_xoff_sent, MAC_TX_STATS_XOFF_SENT); - TG3_STAT_ADD32(&sp->tx_mac_errors, MAC_TX_STATS_MAC_ERRORS); - TG3_STAT_ADD32(&sp->tx_single_collisions, MAC_TX_STATS_SINGLE_COLLISIONS); - TG3_STAT_ADD32(&sp->tx_mult_collisions, MAC_TX_STATS_MULT_COLLISIONS); - TG3_STAT_ADD32(&sp->tx_deferred, MAC_TX_STATS_DEFERRED); - TG3_STAT_ADD32(&sp->tx_excessive_collisions, MAC_TX_STATS_EXCESSIVE_COL); - TG3_STAT_ADD32(&sp->tx_late_collisions, MAC_TX_STATS_LATE_COL); - TG3_STAT_ADD32(&sp->tx_ucast_packets, MAC_TX_STATS_UCAST); - TG3_STAT_ADD32(&sp->tx_mcast_packets, MAC_TX_STATS_MCAST); - TG3_STAT_ADD32(&sp->tx_bcast_packets, MAC_TX_STATS_BCAST); - if (unlikely(tg3_flag(tp, 5719_5720_RDMA_BUG) && - (sp->tx_ucast_packets.low + sp->tx_mcast_packets.low + - sp->tx_bcast_packets.low) > TG3_NUM_RDMA_CHANNELS)) { - u32 val; - - val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL); - val &= ~tg3_lso_rd_dma_workaround_bit(tp); - tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val); - tg3_flag_clear(tp, 5719_5720_RDMA_BUG); - } - - TG3_STAT_ADD32(&sp->rx_octets, MAC_RX_STATS_OCTETS); - TG3_STAT_ADD32(&sp->rx_fragments, MAC_RX_STATS_FRAGMENTS); - TG3_STAT_ADD32(&sp->rx_ucast_packets, MAC_RX_STATS_UCAST); - TG3_STAT_ADD32(&sp->rx_mcast_packets, MAC_RX_STATS_MCAST); - TG3_STAT_ADD32(&sp->rx_bcast_packets, MAC_RX_STATS_BCAST); - TG3_STAT_ADD32(&sp->rx_fcs_errors, MAC_RX_STATS_FCS_ERRORS); - TG3_STAT_ADD32(&sp->rx_align_errors, MAC_RX_STATS_ALIGN_ERRORS); - TG3_STAT_ADD32(&sp->rx_xon_pause_rcvd, MAC_RX_STATS_XON_PAUSE_RECVD); - TG3_STAT_ADD32(&sp->rx_xoff_pause_rcvd, MAC_RX_STATS_XOFF_PAUSE_RECVD); - TG3_STAT_ADD32(&sp->rx_mac_ctrl_rcvd, MAC_RX_STATS_MAC_CTRL_RECVD); - TG3_STAT_ADD32(&sp->rx_xoff_entered, MAC_RX_STATS_XOFF_ENTERED); - TG3_STAT_ADD32(&sp->rx_frame_too_long_errors, MAC_RX_STATS_FRAME_TOO_LONG); - TG3_STAT_ADD32(&sp->rx_jabbers, MAC_RX_STATS_JABBERS); - TG3_STAT_ADD32(&sp->rx_undersize_packets, MAC_RX_STATS_UNDERSIZE); - - TG3_STAT_ADD32(&sp->rxbds_empty, RCVLPC_NO_RCV_BD_CNT); - if (tg3_asic_rev(tp) != ASIC_REV_5717 && - tg3_asic_rev(tp) != ASIC_REV_5762 && - tg3_chip_rev_id(tp) != CHIPREV_ID_5719_A0 && - tg3_chip_rev_id(tp) != CHIPREV_ID_5720_A0) { - TG3_STAT_ADD32(&sp->rx_discards, RCVLPC_IN_DISCARDS_CNT); - } else { - u32 val = tr32(HOSTCC_FLOW_ATTN); - val = (val & HOSTCC_FLOW_ATTN_MBUF_LWM) ? 1 : 0; - if (val) { - tw32(HOSTCC_FLOW_ATTN, HOSTCC_FLOW_ATTN_MBUF_LWM); - sp->rx_discards.low += val; - if (sp->rx_discards.low < val) - sp->rx_discards.high += 1; - } - sp->mbuf_lwm_thresh_hit = sp->rx_discards; - } - TG3_STAT_ADD32(&sp->rx_errors, RCVLPC_IN_ERRORS_CNT); -} - -static void tg3_chk_missed_msi(struct tg3 *tp) -{ - u32 i; - - for (i = 0; i < tp->irq_cnt; i++) { - struct tg3_napi *tnapi = &tp->napi[i]; - - if (tg3_has_work(tnapi)) { - if (tnapi->last_rx_cons == tnapi->rx_rcb_ptr && - tnapi->last_tx_cons == tnapi->tx_cons) { - if (tnapi->chk_msi_cnt < 1) { - tnapi->chk_msi_cnt++; - return; - } - tg3_msi(0, tnapi); - } - } - tnapi->chk_msi_cnt = 0; - tnapi->last_rx_cons = tnapi->rx_rcb_ptr; - tnapi->last_tx_cons = tnapi->tx_cons; - } -} - -static void tg3_timer(unsigned long __opaque) -{ - struct tg3 *tp = (struct tg3 *) __opaque; - - spin_lock(&tp->lock); - - if (tp->irq_sync || tg3_flag(tp, RESET_TASK_PENDING)) { - spin_unlock(&tp->lock); - goto restart_timer; - } - - if (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_flag(tp, 57765_CLASS)) - tg3_chk_missed_msi(tp); - - if (tg3_flag(tp, FLUSH_POSTED_WRITES)) { - /* BCM4785: Flush posted writes from GbE to host memory. */ - tr32(HOSTCC_MODE); - } - - if (!tg3_flag(tp, TAGGED_STATUS)) { - /* All of this garbage is because when using non-tagged - * IRQ status the mailbox/status_block protocol the chip - * uses with the cpu is race prone. - */ - if (tp->napi[0].hw_status->status & SD_STATUS_UPDATED) { - tw32(GRC_LOCAL_CTRL, - tp->grc_local_ctrl | GRC_LCLCTRL_SETINT); - } else { - tw32(HOSTCC_MODE, tp->coalesce_mode | - HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW); - } - - if (!(tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) { - spin_unlock(&tp->lock); - tg3_reset_task_schedule(tp); - goto restart_timer; - } - } - - /* This part only runs once per second. */ - if (!--tp->timer_counter) { - if (tg3_flag(tp, 5705_PLUS)) - tg3_periodic_fetch_stats(tp); - - if (tp->setlpicnt && !--tp->setlpicnt) - tg3_phy_eee_enable(tp); - - if (tg3_flag(tp, USE_LINKCHG_REG)) { - u32 mac_stat; - int phy_event; - - mac_stat = tr32(MAC_STATUS); - - phy_event = 0; - if (tp->phy_flags & TG3_PHYFLG_USE_MI_INTERRUPT) { - if (mac_stat & MAC_STATUS_MI_INTERRUPT) - phy_event = 1; - } else if (mac_stat & MAC_STATUS_LNKSTATE_CHANGED) - phy_event = 1; - - if (phy_event) - tg3_setup_phy(tp, false); - } else if (tg3_flag(tp, POLL_SERDES)) { - u32 mac_stat = tr32(MAC_STATUS); - int need_setup = 0; - - if (tp->link_up && - (mac_stat & MAC_STATUS_LNKSTATE_CHANGED)) { - need_setup = 1; - } - if (!tp->link_up && - (mac_stat & (MAC_STATUS_PCS_SYNCED | - MAC_STATUS_SIGNAL_DET))) { - need_setup = 1; - } - if (need_setup) { - if (!tp->serdes_counter) { - tw32_f(MAC_MODE, - (tp->mac_mode & - ~MAC_MODE_PORT_MODE_MASK)); - udelay(40); - tw32_f(MAC_MODE, tp->mac_mode); - udelay(40); - } - tg3_setup_phy(tp, false); - } - } else if ((tp->phy_flags & TG3_PHYFLG_MII_SERDES) && - tg3_flag(tp, 5780_CLASS)) { - tg3_serdes_parallel_detect(tp); - } else if (tg3_flag(tp, POLL_CPMU_LINK)) { - u32 cpmu = tr32(TG3_CPMU_STATUS); - bool link_up = !((cpmu & TG3_CPMU_STATUS_LINK_MASK) == - TG3_CPMU_STATUS_LINK_MASK); - - if (link_up != tp->link_up) - tg3_setup_phy(tp, false); - } - - tp->timer_counter = tp->timer_multiplier; - } - - /* Heartbeat is only sent once every 2 seconds. - * - * The heartbeat is to tell the ASF firmware that the host - * driver is still alive. In the event that the OS crashes, - * ASF needs to reset the hardware to free up the FIFO space - * that may be filled with rx packets destined for the host. - * If the FIFO is full, ASF will no longer function properly. - * - * Unintended resets have been reported on real time kernels - * where the timer doesn't run on time. Netpoll will also have - * same problem. - * - * The new FWCMD_NICDRV_ALIVE3 command tells the ASF firmware - * to check the ring condition when the heartbeat is expiring - * before doing the reset. This will prevent most unintended - * resets. - */ - if (!--tp->asf_counter) { - if (tg3_flag(tp, ENABLE_ASF) && !tg3_flag(tp, ENABLE_APE)) { - tg3_wait_for_event_ack(tp); - - tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, - FWCMD_NICDRV_ALIVE3); - tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4); - tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, - TG3_FW_UPDATE_TIMEOUT_SEC); - - tg3_generate_fw_event(tp); - } - tp->asf_counter = tp->asf_multiplier; - } - - spin_unlock(&tp->lock); - -restart_timer: - tp->timer.expires = jiffies + tp->timer_offset; - add_timer(&tp->timer); -} - -static void tg3_timer_init(struct tg3 *tp) -{ - if (tg3_flag(tp, TAGGED_STATUS) && - tg3_asic_rev(tp) != ASIC_REV_5717 && - !tg3_flag(tp, 57765_CLASS)) - tp->timer_offset = HZ; - else - tp->timer_offset = HZ / 10; - - BUG_ON(tp->timer_offset > HZ); - - tp->timer_multiplier = (HZ / tp->timer_offset); - tp->asf_multiplier = (HZ / tp->timer_offset) * - TG3_FW_UPDATE_FREQ_SEC; - - init_timer(&tp->timer); - tp->timer.data = (unsigned long) tp; - tp->timer.function = tg3_timer; -} - -static void tg3_timer_start(struct tg3 *tp) -{ - tp->asf_counter = tp->asf_multiplier; - tp->timer_counter = tp->timer_multiplier; - - tp->timer.expires = jiffies + tp->timer_offset; - add_timer(&tp->timer); -} - -static void tg3_timer_stop(struct tg3 *tp) -{ - del_timer_sync(&tp->timer); -} - -/* Restart hardware after configuration changes, self-test, etc. - * Invoked with tp->lock held. - */ -static int tg3_restart_hw(struct tg3 *tp, bool reset_phy) - __releases(tp->lock) - __acquires(tp->lock) -{ - int err; - - err = tg3_init_hw(tp, reset_phy); - if (err) { - netdev_err(tp->dev, - "Failed to re-initialize device, aborting\n"); - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - tg3_full_unlock(tp); - tg3_timer_stop(tp); - tp->irq_sync = 0; - tg3_napi_enable(tp); - dev_close(tp->dev); - tg3_full_lock(tp, 0); - } - return err; -} - -static void tg3_reset_task(struct work_struct *work) -{ - struct tg3 *tp = container_of(work, struct tg3, reset_task); - int err; - - rtnl_lock(); - tg3_full_lock(tp, 0); - - if (!netif_running(tp->dev)) { - tg3_flag_clear(tp, RESET_TASK_PENDING); - tg3_full_unlock(tp); - rtnl_unlock(); - return; - } - - tg3_full_unlock(tp); - - tg3_phy_stop(tp); - - tg3_netif_stop(tp); - - tg3_full_lock(tp, 1); - - if (tg3_flag(tp, TX_RECOVERY_PENDING)) { - tp->write32_tx_mbox = tg3_write32_tx_mbox; - tp->write32_rx_mbox = tg3_write_flush_reg32; - tg3_flag_set(tp, MBOX_WRITE_REORDER); - tg3_flag_clear(tp, TX_RECOVERY_PENDING); - } - - tg3_halt(tp, RESET_KIND_SHUTDOWN, 0); - err = tg3_init_hw(tp, true); - if (err) - goto out; - - tg3_netif_start(tp); - -out: - tg3_full_unlock(tp); - - if (!err) - tg3_phy_start(tp); - - tg3_flag_clear(tp, RESET_TASK_PENDING); - rtnl_unlock(); -} - -static int tg3_request_irq(struct tg3 *tp, int irq_num) -{ - irq_handler_t fn; - unsigned long flags; - char *name; - struct tg3_napi *tnapi = &tp->napi[irq_num]; - - if (tp->irq_cnt == 1) - name = tp->dev->name; - else { - name = &tnapi->irq_lbl[0]; - if (tnapi->tx_buffers && tnapi->rx_rcb) - snprintf(name, IFNAMSIZ, - "%s-txrx-%d", tp->dev->name, irq_num); - else if (tnapi->tx_buffers) - snprintf(name, IFNAMSIZ, - "%s-tx-%d", tp->dev->name, irq_num); - else if (tnapi->rx_rcb) - snprintf(name, IFNAMSIZ, - "%s-rx-%d", tp->dev->name, irq_num); - else - snprintf(name, IFNAMSIZ, - "%s-%d", tp->dev->name, irq_num); - name[IFNAMSIZ-1] = 0; - } - - if (tg3_flag(tp, USING_MSI) || tg3_flag(tp, USING_MSIX)) { - fn = tg3_msi; - if (tg3_flag(tp, 1SHOT_MSI)) - fn = tg3_msi_1shot; - flags = 0; - } else { - fn = tg3_interrupt; - if (tg3_flag(tp, TAGGED_STATUS)) - fn = tg3_interrupt_tagged; - flags = IRQF_SHARED; - } - - return request_irq(tnapi->irq_vec, fn, flags, name, tnapi); -} - -static int tg3_test_interrupt(struct tg3 *tp) -{ - struct tg3_napi *tnapi = &tp->napi[0]; - struct net_device *dev = tp->dev; - int err, i, intr_ok = 0; - u32 val; - - if (!netif_running(dev)) - return -ENODEV; - - tg3_disable_ints(tp); - - free_irq(tnapi->irq_vec, tnapi); - - /* - * Turn off MSI one shot mode. Otherwise this test has no - * observable way to know whether the interrupt was delivered. - */ - if (tg3_flag(tp, 57765_PLUS)) { - val = tr32(MSGINT_MODE) | MSGINT_MODE_ONE_SHOT_DISABLE; - tw32(MSGINT_MODE, val); - } - - err = request_irq(tnapi->irq_vec, tg3_test_isr, - IRQF_SHARED, dev->name, tnapi); - if (err) - return err; - - tnapi->hw_status->status &= ~SD_STATUS_UPDATED; - tg3_enable_ints(tp); - - tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE | - tnapi->coal_now); - - for (i = 0; i < 5; i++) { - u32 int_mbox, misc_host_ctrl; - - int_mbox = tr32_mailbox(tnapi->int_mbox); - misc_host_ctrl = tr32(TG3PCI_MISC_HOST_CTRL); - - if ((int_mbox != 0) || - (misc_host_ctrl & MISC_HOST_CTRL_MASK_PCI_INT)) { - intr_ok = 1; - break; - } - - if (tg3_flag(tp, 57765_PLUS) && - tnapi->hw_status->status_tag != tnapi->last_tag) - tw32_mailbox_f(tnapi->int_mbox, tnapi->last_tag << 24); - - msleep(10); - } - - tg3_disable_ints(tp); - - free_irq(tnapi->irq_vec, tnapi); - - err = tg3_request_irq(tp, 0); - - if (err) - return err; - - if (intr_ok) { - /* Reenable MSI one shot mode. */ - if (tg3_flag(tp, 57765_PLUS) && tg3_flag(tp, 1SHOT_MSI)) { - val = tr32(MSGINT_MODE) & ~MSGINT_MODE_ONE_SHOT_DISABLE; - tw32(MSGINT_MODE, val); - } - return 0; - } - - return -EIO; -} - -/* Returns 0 if MSI test succeeds or MSI test fails and INTx mode is - * successfully restored - */ -static int tg3_test_msi(struct tg3 *tp) -{ - int err; - u16 pci_cmd; - - if (!tg3_flag(tp, USING_MSI)) - return 0; - - /* Turn off SERR reporting in case MSI terminates with Master - * Abort. - */ - pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd); - pci_write_config_word(tp->pdev, PCI_COMMAND, - pci_cmd & ~PCI_COMMAND_SERR); - - err = tg3_test_interrupt(tp); - - pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd); - - if (!err) - return 0; - - /* other failures */ - if (err != -EIO) - return err; - - /* MSI test failed, go back to INTx mode */ - netdev_warn(tp->dev, "No interrupt was generated using MSI. Switching " - "to INTx mode. Please report this failure to the PCI " - "maintainer and include system chipset information\n"); - - free_irq(tp->napi[0].irq_vec, &tp->napi[0]); - - pci_disable_msi(tp->pdev); - - tg3_flag_clear(tp, USING_MSI); - tp->napi[0].irq_vec = tp->pdev->irq; - - err = tg3_request_irq(tp, 0); - if (err) - return err; - - /* Need to reset the chip because the MSI cycle may have terminated - * with Master Abort. - */ - tg3_full_lock(tp, 1); - - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - err = tg3_init_hw(tp, true); - - tg3_full_unlock(tp); - - if (err) - free_irq(tp->napi[0].irq_vec, &tp->napi[0]); - - return err; -} - -static int tg3_request_firmware(struct tg3 *tp) -{ - const struct tg3_firmware_hdr *fw_hdr; - - if (request_firmware(&tp->fw, tp->fw_needed, &tp->pdev->dev)) { - netdev_err(tp->dev, "Failed to load firmware \"%s\"\n", - tp->fw_needed); - return -ENOENT; - } - - fw_hdr = (struct tg3_firmware_hdr *)tp->fw->data; - - /* Firmware blob starts with version numbers, followed by - * start address and _full_ length including BSS sections - * (which must be longer than the actual data, of course - */ - - tp->fw_len = be32_to_cpu(fw_hdr->len); /* includes bss */ - if (tp->fw_len < (tp->fw->size - TG3_FW_HDR_LEN)) { - netdev_err(tp->dev, "bogus length %d in \"%s\"\n", - tp->fw_len, tp->fw_needed); - release_firmware(tp->fw); - tp->fw = NULL; - return -EINVAL; - } - - /* We no longer need firmware; we have it. */ - tp->fw_needed = NULL; - return 0; -} - -static u32 tg3_irq_count(struct tg3 *tp) -{ - u32 irq_cnt = max(tp->rxq_cnt, tp->txq_cnt); - - if (irq_cnt > 1) { - /* We want as many rx rings enabled as there are cpus. - * In multiqueue MSI-X mode, the first MSI-X vector - * only deals with link interrupts, etc, so we add - * one to the number of vectors we are requesting. - */ - irq_cnt = min_t(unsigned, irq_cnt + 1, tp->irq_max); - } - - return irq_cnt; -} - -static bool tg3_enable_msix(struct tg3 *tp) -{ - int i, rc; - struct msix_entry msix_ent[TG3_IRQ_MAX_VECS]; - - tp->txq_cnt = tp->txq_req; - tp->rxq_cnt = tp->rxq_req; - if (!tp->rxq_cnt) - tp->rxq_cnt = netif_get_num_default_rss_queues(); - if (tp->rxq_cnt > tp->rxq_max) - tp->rxq_cnt = tp->rxq_max; - - /* Disable multiple TX rings by default. Simple round-robin hardware - * scheduling of the TX rings can cause starvation of rings with - * small packets when other rings have TSO or jumbo packets. - */ - if (!tp->txq_req) - tp->txq_cnt = 1; - - tp->irq_cnt = tg3_irq_count(tp); - - for (i = 0; i < tp->irq_max; i++) { - msix_ent[i].entry = i; - msix_ent[i].vector = 0; - } - - rc = pci_enable_msix_range(tp->pdev, msix_ent, 1, tp->irq_cnt); - if (rc < 0) { - return false; - } else if (rc < tp->irq_cnt) { - netdev_notice(tp->dev, "Requested %d MSI-X vectors, received %d\n", - tp->irq_cnt, rc); - tp->irq_cnt = rc; - tp->rxq_cnt = max(rc - 1, 1); - if (tp->txq_cnt) - tp->txq_cnt = min(tp->rxq_cnt, tp->txq_max); - } - - for (i = 0; i < tp->irq_max; i++) - tp->napi[i].irq_vec = msix_ent[i].vector; - - if (netif_set_real_num_rx_queues(tp->dev, tp->rxq_cnt)) { - pci_disable_msix(tp->pdev); - return false; - } - - if (tp->irq_cnt == 1) - return true; - - tg3_flag_set(tp, ENABLE_RSS); - - if (tp->txq_cnt > 1) - tg3_flag_set(tp, ENABLE_TSS); - - netif_set_real_num_tx_queues(tp->dev, tp->txq_cnt); - - return true; -} - -static void tg3_ints_init(struct tg3 *tp) -{ - if ((tg3_flag(tp, SUPPORT_MSI) || tg3_flag(tp, SUPPORT_MSIX)) && - !tg3_flag(tp, TAGGED_STATUS)) { - /* All MSI supporting chips should support tagged - * status. Assert that this is the case. - */ - netdev_warn(tp->dev, - "MSI without TAGGED_STATUS? Not using MSI\n"); - goto defcfg; - } - - if (tg3_flag(tp, SUPPORT_MSIX) && tg3_enable_msix(tp)) - tg3_flag_set(tp, USING_MSIX); - else if (tg3_flag(tp, SUPPORT_MSI) && pci_enable_msi(tp->pdev) == 0) - tg3_flag_set(tp, USING_MSI); - - if (tg3_flag(tp, USING_MSI) || tg3_flag(tp, USING_MSIX)) { - u32 msi_mode = tr32(MSGINT_MODE); - if (tg3_flag(tp, USING_MSIX) && tp->irq_cnt > 1) - msi_mode |= MSGINT_MODE_MULTIVEC_EN; - if (!tg3_flag(tp, 1SHOT_MSI)) - msi_mode |= MSGINT_MODE_ONE_SHOT_DISABLE; - tw32(MSGINT_MODE, msi_mode | MSGINT_MODE_ENABLE); - } -defcfg: - if (!tg3_flag(tp, USING_MSIX)) { - tp->irq_cnt = 1; - tp->napi[0].irq_vec = tp->pdev->irq; - } - - if (tp->irq_cnt == 1) { - tp->txq_cnt = 1; - tp->rxq_cnt = 1; - netif_set_real_num_tx_queues(tp->dev, 1); - netif_set_real_num_rx_queues(tp->dev, 1); - } -} - -static void tg3_ints_fini(struct tg3 *tp) -{ - if (tg3_flag(tp, USING_MSIX)) - pci_disable_msix(tp->pdev); - else if (tg3_flag(tp, USING_MSI)) - pci_disable_msi(tp->pdev); - tg3_flag_clear(tp, USING_MSI); - tg3_flag_clear(tp, USING_MSIX); - tg3_flag_clear(tp, ENABLE_RSS); - tg3_flag_clear(tp, ENABLE_TSS); -} - -static int tg3_start(struct tg3 *tp, bool reset_phy, bool test_irq, - bool init) -{ - struct net_device *dev = tp->dev; - int i, err; - - /* - * Setup interrupts first so we know how - * many NAPI resources to allocate - */ - tg3_ints_init(tp); - - tg3_rss_check_indir_tbl(tp); - - /* The placement of this call is tied - * to the setup and use of Host TX descriptors. - */ - err = tg3_alloc_consistent(tp); - if (err) - goto out_ints_fini; - - tg3_napi_init(tp); - - tg3_napi_enable(tp); - - for (i = 0; i < tp->irq_cnt; i++) { - err = tg3_request_irq(tp, i); - if (err) { - for (i--; i >= 0; i--) { - struct tg3_napi *tnapi = &tp->napi[i]; - - free_irq(tnapi->irq_vec, tnapi); - } - goto out_napi_fini; - } - } - - tg3_full_lock(tp, 0); - - if (init) - tg3_ape_driver_state_change(tp, RESET_KIND_INIT); - - err = tg3_init_hw(tp, reset_phy); - if (err) { - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - tg3_free_rings(tp); - } - - tg3_full_unlock(tp); - - if (err) - goto out_free_irq; - - if (test_irq && tg3_flag(tp, USING_MSI)) { - err = tg3_test_msi(tp); - - if (err) { - tg3_full_lock(tp, 0); - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - tg3_free_rings(tp); - tg3_full_unlock(tp); - - goto out_napi_fini; - } - - if (!tg3_flag(tp, 57765_PLUS) && tg3_flag(tp, USING_MSI)) { - u32 val = tr32(PCIE_TRANSACTION_CFG); - - tw32(PCIE_TRANSACTION_CFG, - val | PCIE_TRANS_CFG_1SHOT_MSI); - } - } - - tg3_phy_start(tp); - - tg3_hwmon_open(tp); - - tg3_full_lock(tp, 0); - - tg3_timer_start(tp); - tg3_flag_set(tp, INIT_COMPLETE); - tg3_enable_ints(tp); - - tg3_ptp_resume(tp); - - tg3_full_unlock(tp); - - netif_tx_start_all_queues(dev); - - /* - * Reset loopback feature if it was turned on while the device was down - * make sure that it's installed properly now. - */ - if (dev->features & NETIF_F_LOOPBACK) - tg3_set_loopback(dev, dev->features); - - return 0; - -out_free_irq: - for (i = tp->irq_cnt - 1; i >= 0; i--) { - struct tg3_napi *tnapi = &tp->napi[i]; - free_irq(tnapi->irq_vec, tnapi); - } - -out_napi_fini: - tg3_napi_disable(tp); - tg3_napi_fini(tp); - tg3_free_consistent(tp); - -out_ints_fini: - tg3_ints_fini(tp); - - return err; -} - -static void tg3_stop(struct tg3 *tp) -{ - int i; - - tg3_reset_task_cancel(tp); - tg3_netif_stop(tp); - - tg3_timer_stop(tp); - - tg3_hwmon_close(tp); - - tg3_phy_stop(tp); - - tg3_full_lock(tp, 1); - - tg3_disable_ints(tp); - - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - tg3_free_rings(tp); - tg3_flag_clear(tp, INIT_COMPLETE); - - tg3_full_unlock(tp); - - for (i = tp->irq_cnt - 1; i >= 0; i--) { - struct tg3_napi *tnapi = &tp->napi[i]; - free_irq(tnapi->irq_vec, tnapi); - } - - tg3_ints_fini(tp); - - tg3_napi_fini(tp); - - tg3_free_consistent(tp); -} - -static int tg3_open(struct net_device *dev) -{ - struct tg3 *tp = netdev_priv(dev); - int err; - - if (tp->pcierr_recovery) { - netdev_err(dev, "Failed to open device. PCI error recovery " - "in progress\n"); - return -EAGAIN; - } - - if (tp->fw_needed) { - err = tg3_request_firmware(tp); - if (tg3_asic_rev(tp) == ASIC_REV_57766) { - if (err) { - netdev_warn(tp->dev, "EEE capability disabled\n"); - tp->phy_flags &= ~TG3_PHYFLG_EEE_CAP; - } else if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP)) { - netdev_warn(tp->dev, "EEE capability restored\n"); - tp->phy_flags |= TG3_PHYFLG_EEE_CAP; - } - } else if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0) { - if (err) - return err; - } else if (err) { - netdev_warn(tp->dev, "TSO capability disabled\n"); - tg3_flag_clear(tp, TSO_CAPABLE); - } else if (!tg3_flag(tp, TSO_CAPABLE)) { - netdev_notice(tp->dev, "TSO capability restored\n"); - tg3_flag_set(tp, TSO_CAPABLE); - } - } - - tg3_carrier_off(tp); - - err = tg3_power_up(tp); - if (err) - return err; - - tg3_full_lock(tp, 0); - - tg3_disable_ints(tp); - tg3_flag_clear(tp, INIT_COMPLETE); - - tg3_full_unlock(tp); - - err = tg3_start(tp, - !(tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN), - true, true); - if (err) { - tg3_frob_aux_power(tp, false); - pci_set_power_state(tp->pdev, PCI_D3hot); - } - - return err; -} - -static int tg3_close(struct net_device *dev) -{ - struct tg3 *tp = netdev_priv(dev); - - if (tp->pcierr_recovery) { - netdev_err(dev, "Failed to close device. PCI error recovery " - "in progress\n"); - return -EAGAIN; - } - - tg3_stop(tp); - - if (pci_device_is_present(tp->pdev)) { - tg3_power_down_prepare(tp); - - tg3_carrier_off(tp); - } - return 0; -} - -static inline u64 get_stat64(tg3_stat64_t *val) -{ - return ((u64)val->high << 32) | ((u64)val->low); -} - -static u64 tg3_calc_crc_errors(struct tg3 *tp) -{ - struct tg3_hw_stats *hw_stats = tp->hw_stats; - - if (!(tp->phy_flags & TG3_PHYFLG_PHY_SERDES) && - (tg3_asic_rev(tp) == ASIC_REV_5700 || - tg3_asic_rev(tp) == ASIC_REV_5701)) { - u32 val; - - if (!tg3_readphy(tp, MII_TG3_TEST1, &val)) { - tg3_writephy(tp, MII_TG3_TEST1, - val | MII_TG3_TEST1_CRC_EN); - tg3_readphy(tp, MII_TG3_RXR_COUNTERS, &val); - } else - val = 0; - - tp->phy_crc_errors += val; - - return tp->phy_crc_errors; - } - - return get_stat64(&hw_stats->rx_fcs_errors); -} - -#define ESTAT_ADD(member) \ - estats->member = old_estats->member + \ - get_stat64(&hw_stats->member) - -static void tg3_get_estats(struct tg3 *tp, struct tg3_ethtool_stats *estats) -{ - struct tg3_ethtool_stats *old_estats = &tp->estats_prev; - struct tg3_hw_stats *hw_stats = tp->hw_stats; - - ESTAT_ADD(rx_octets); - ESTAT_ADD(rx_fragments); - ESTAT_ADD(rx_ucast_packets); - ESTAT_ADD(rx_mcast_packets); - ESTAT_ADD(rx_bcast_packets); - ESTAT_ADD(rx_fcs_errors); - ESTAT_ADD(rx_align_errors); - ESTAT_ADD(rx_xon_pause_rcvd); - ESTAT_ADD(rx_xoff_pause_rcvd); - ESTAT_ADD(rx_mac_ctrl_rcvd); - ESTAT_ADD(rx_xoff_entered); - ESTAT_ADD(rx_frame_too_long_errors); - ESTAT_ADD(rx_jabbers); - ESTAT_ADD(rx_undersize_packets); - ESTAT_ADD(rx_in_length_errors); - ESTAT_ADD(rx_out_length_errors); - ESTAT_ADD(rx_64_or_less_octet_packets); - ESTAT_ADD(rx_65_to_127_octet_packets); - ESTAT_ADD(rx_128_to_255_octet_packets); - ESTAT_ADD(rx_256_to_511_octet_packets); - ESTAT_ADD(rx_512_to_1023_octet_packets); - ESTAT_ADD(rx_1024_to_1522_octet_packets); - ESTAT_ADD(rx_1523_to_2047_octet_packets); - ESTAT_ADD(rx_2048_to_4095_octet_packets); - ESTAT_ADD(rx_4096_to_8191_octet_packets); - ESTAT_ADD(rx_8192_to_9022_octet_packets); - - ESTAT_ADD(tx_octets); - ESTAT_ADD(tx_collisions); - ESTAT_ADD(tx_xon_sent); - ESTAT_ADD(tx_xoff_sent); - ESTAT_ADD(tx_flow_control); - ESTAT_ADD(tx_mac_errors); - ESTAT_ADD(tx_single_collisions); - ESTAT_ADD(tx_mult_collisions); - ESTAT_ADD(tx_deferred); - ESTAT_ADD(tx_excessive_collisions); - ESTAT_ADD(tx_late_collisions); - ESTAT_ADD(tx_collide_2times); - ESTAT_ADD(tx_collide_3times); - ESTAT_ADD(tx_collide_4times); - ESTAT_ADD(tx_collide_5times); - ESTAT_ADD(tx_collide_6times); - ESTAT_ADD(tx_collide_7times); - ESTAT_ADD(tx_collide_8times); - ESTAT_ADD(tx_collide_9times); - ESTAT_ADD(tx_collide_10times); - ESTAT_ADD(tx_collide_11times); - ESTAT_ADD(tx_collide_12times); - ESTAT_ADD(tx_collide_13times); - ESTAT_ADD(tx_collide_14times); - ESTAT_ADD(tx_collide_15times); - ESTAT_ADD(tx_ucast_packets); - ESTAT_ADD(tx_mcast_packets); - ESTAT_ADD(tx_bcast_packets); - ESTAT_ADD(tx_carrier_sense_errors); - ESTAT_ADD(tx_discards); - ESTAT_ADD(tx_errors); - - ESTAT_ADD(dma_writeq_full); - ESTAT_ADD(dma_write_prioq_full); - ESTAT_ADD(rxbds_empty); - ESTAT_ADD(rx_discards); - ESTAT_ADD(rx_errors); - ESTAT_ADD(rx_threshold_hit); - - ESTAT_ADD(dma_readq_full); - ESTAT_ADD(dma_read_prioq_full); - ESTAT_ADD(tx_comp_queue_full); - - ESTAT_ADD(ring_set_send_prod_index); - ESTAT_ADD(ring_status_update); - ESTAT_ADD(nic_irqs); - ESTAT_ADD(nic_avoided_irqs); - ESTAT_ADD(nic_tx_threshold_hit); - - ESTAT_ADD(mbuf_lwm_thresh_hit); -} - -static void tg3_get_nstats(struct tg3 *tp, struct rtnl_link_stats64 *stats) -{ - struct rtnl_link_stats64 *old_stats = &tp->net_stats_prev; - struct tg3_hw_stats *hw_stats = tp->hw_stats; - - stats->rx_packets = old_stats->rx_packets + - get_stat64(&hw_stats->rx_ucast_packets) + - get_stat64(&hw_stats->rx_mcast_packets) + - get_stat64(&hw_stats->rx_bcast_packets); - - stats->tx_packets = old_stats->tx_packets + - get_stat64(&hw_stats->tx_ucast_packets) + - get_stat64(&hw_stats->tx_mcast_packets) + - get_stat64(&hw_stats->tx_bcast_packets); - - stats->rx_bytes = old_stats->rx_bytes + - get_stat64(&hw_stats->rx_octets); - stats->tx_bytes = old_stats->tx_bytes + - get_stat64(&hw_stats->tx_octets); - - stats->rx_errors = old_stats->rx_errors + - get_stat64(&hw_stats->rx_errors); - stats->tx_errors = old_stats->tx_errors + - get_stat64(&hw_stats->tx_errors) + - get_stat64(&hw_stats->tx_mac_errors) + - get_stat64(&hw_stats->tx_carrier_sense_errors) + - get_stat64(&hw_stats->tx_discards); - - stats->multicast = old_stats->multicast + - get_stat64(&hw_stats->rx_mcast_packets); - stats->collisions = old_stats->collisions + - get_stat64(&hw_stats->tx_collisions); - - stats->rx_length_errors = old_stats->rx_length_errors + - get_stat64(&hw_stats->rx_frame_too_long_errors) + - get_stat64(&hw_stats->rx_undersize_packets); - - stats->rx_frame_errors = old_stats->rx_frame_errors + - get_stat64(&hw_stats->rx_align_errors); - stats->tx_aborted_errors = old_stats->tx_aborted_errors + - get_stat64(&hw_stats->tx_discards); - stats->tx_carrier_errors = old_stats->tx_carrier_errors + - get_stat64(&hw_stats->tx_carrier_sense_errors); - - stats->rx_crc_errors = old_stats->rx_crc_errors + - tg3_calc_crc_errors(tp); - - stats->rx_missed_errors = old_stats->rx_missed_errors + - get_stat64(&hw_stats->rx_discards); - - stats->rx_dropped = tp->rx_dropped; - stats->tx_dropped = tp->tx_dropped; -} - -static int tg3_get_regs_len(struct net_device *dev) -{ - return TG3_REG_BLK_SIZE; -} - -static void tg3_get_regs(struct net_device *dev, - struct ethtool_regs *regs, void *_p) -{ - struct tg3 *tp = netdev_priv(dev); - - regs->version = 0; - - memset(_p, 0, TG3_REG_BLK_SIZE); - - if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) - return; - - tg3_full_lock(tp, 0); - - tg3_dump_legacy_regs(tp, (u32 *)_p); - - tg3_full_unlock(tp); -} - -static int tg3_get_eeprom_len(struct net_device *dev) -{ - struct tg3 *tp = netdev_priv(dev); - - return tp->nvram_size; -} - -static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data) -{ - struct tg3 *tp = netdev_priv(dev); - int ret, cpmu_restore = 0; - u8 *pd; - u32 i, offset, len, b_offset, b_count, cpmu_val = 0; - __be32 val; - - if (tg3_flag(tp, NO_NVRAM)) - return -EINVAL; - - offset = eeprom->offset; - len = eeprom->len; - eeprom->len = 0; - - eeprom->magic = TG3_EEPROM_MAGIC; - - /* Override clock, link aware and link idle modes */ - if (tg3_flag(tp, CPMU_PRESENT)) { - cpmu_val = tr32(TG3_CPMU_CTRL); - if (cpmu_val & (CPMU_CTRL_LINK_AWARE_MODE | - CPMU_CTRL_LINK_IDLE_MODE)) { - tw32(TG3_CPMU_CTRL, cpmu_val & - ~(CPMU_CTRL_LINK_AWARE_MODE | - CPMU_CTRL_LINK_IDLE_MODE)); - cpmu_restore = 1; - } - } - tg3_override_clk(tp); - - if (offset & 3) { - /* adjustments to start on required 4 byte boundary */ - b_offset = offset & 3; - b_count = 4 - b_offset; - if (b_count > len) { - /* i.e. offset=1 len=2 */ - b_count = len; - } - ret = tg3_nvram_read_be32(tp, offset-b_offset, &val); - if (ret) - goto eeprom_done; - memcpy(data, ((char *)&val) + b_offset, b_count); - len -= b_count; - offset += b_count; - eeprom->len += b_count; - } - - /* read bytes up to the last 4 byte boundary */ - pd = &data[eeprom->len]; - for (i = 0; i < (len - (len & 3)); i += 4) { - ret = tg3_nvram_read_be32(tp, offset + i, &val); - if (ret) { - if (i) - i -= 4; - eeprom->len += i; - goto eeprom_done; - } - memcpy(pd + i, &val, 4); - if (need_resched()) { - if (signal_pending(current)) { - eeprom->len += i; - ret = -EINTR; - goto eeprom_done; - } - cond_resched(); - } - } - eeprom->len += i; - - if (len & 3) { - /* read last bytes not ending on 4 byte boundary */ - pd = &data[eeprom->len]; - b_count = len & 3; - b_offset = offset + len - b_count; - ret = tg3_nvram_read_be32(tp, b_offset, &val); - if (ret) - goto eeprom_done; - memcpy(pd, &val, b_count); - eeprom->len += b_count; - } - ret = 0; - -eeprom_done: - /* Restore clock, link aware and link idle modes */ - tg3_restore_clk(tp); - if (cpmu_restore) - tw32(TG3_CPMU_CTRL, cpmu_val); - - return ret; -} - -static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data) -{ - struct tg3 *tp = netdev_priv(dev); - int ret; - u32 offset, len, b_offset, odd_len; - u8 *buf; - __be32 start = 0, end; - - if (tg3_flag(tp, NO_NVRAM) || - eeprom->magic != TG3_EEPROM_MAGIC) - return -EINVAL; - - offset = eeprom->offset; - len = eeprom->len; - - if ((b_offset = (offset & 3))) { - /* adjustments to start on required 4 byte boundary */ - ret = tg3_nvram_read_be32(tp, offset-b_offset, &start); - if (ret) - return ret; - len += b_offset; - offset &= ~3; - if (len < 4) - len = 4; - } - - odd_len = 0; - if (len & 3) { - /* adjustments to end on required 4 byte boundary */ - odd_len = 1; - len = (len + 3) & ~3; - ret = tg3_nvram_read_be32(tp, offset+len-4, &end); - if (ret) - return ret; - } - - buf = data; - if (b_offset || odd_len) { - buf = kmalloc(len, GFP_KERNEL); - if (!buf) - return -ENOMEM; - if (b_offset) - memcpy(buf, &start, 4); - if (odd_len) - memcpy(buf+len-4, &end, 4); - memcpy(buf + b_offset, data, eeprom->len); - } - - ret = tg3_nvram_write_block(tp, offset, len, buf); - - if (buf != data) - kfree(buf); - - return ret; -} - -static int tg3_get_link_ksettings(struct net_device *dev, - struct ethtool_link_ksettings *cmd) -{ - struct tg3 *tp = netdev_priv(dev); - u32 supported, advertising; - - if (tg3_flag(tp, USE_PHYLIB)) { - struct phy_device *phydev; - if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED)) - return -EAGAIN; - phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); - phy_ethtool_ksettings_get(phydev, cmd); - - return 0; - } - - supported = (SUPPORTED_Autoneg); - - if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) - supported |= (SUPPORTED_1000baseT_Half | - SUPPORTED_1000baseT_Full); - - if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) { - supported |= (SUPPORTED_100baseT_Half | - SUPPORTED_100baseT_Full | - SUPPORTED_10baseT_Half | - SUPPORTED_10baseT_Full | - SUPPORTED_TP); - cmd->base.port = PORT_TP; - } else { - supported |= SUPPORTED_FIBRE; - cmd->base.port = PORT_FIBRE; - } - ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported, - supported); - - advertising = tp->link_config.advertising; - if (tg3_flag(tp, PAUSE_AUTONEG)) { - if (tp->link_config.flowctrl & FLOW_CTRL_RX) { - if (tp->link_config.flowctrl & FLOW_CTRL_TX) { - advertising |= ADVERTISED_Pause; - } else { - advertising |= ADVERTISED_Pause | - ADVERTISED_Asym_Pause; - } - } else if (tp->link_config.flowctrl & FLOW_CTRL_TX) { - advertising |= ADVERTISED_Asym_Pause; - } - } - ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising, - advertising); - - if (netif_running(dev) && tp->link_up) { - cmd->base.speed = tp->link_config.active_speed; - cmd->base.duplex = tp->link_config.active_duplex; - ethtool_convert_legacy_u32_to_link_mode( - cmd->link_modes.lp_advertising, - tp->link_config.rmt_adv); - - if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) { - if (tp->phy_flags & TG3_PHYFLG_MDIX_STATE) - cmd->base.eth_tp_mdix = ETH_TP_MDI_X; - else - cmd->base.eth_tp_mdix = ETH_TP_MDI; - } - } else { - cmd->base.speed = SPEED_UNKNOWN; - cmd->base.duplex = DUPLEX_UNKNOWN; - cmd->base.eth_tp_mdix = ETH_TP_MDI_INVALID; - } - cmd->base.phy_address = tp->phy_addr; - cmd->base.autoneg = tp->link_config.autoneg; - return 0; -} - -static int tg3_set_link_ksettings(struct net_device *dev, - const struct ethtool_link_ksettings *cmd) -{ - struct tg3 *tp = netdev_priv(dev); - u32 speed = cmd->base.speed; - u32 advertising; - - if (tg3_flag(tp, USE_PHYLIB)) { - struct phy_device *phydev; - if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED)) - return -EAGAIN; - phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); - return phy_ethtool_ksettings_set(phydev, cmd); - } - - if (cmd->base.autoneg != AUTONEG_ENABLE && - cmd->base.autoneg != AUTONEG_DISABLE) - return -EINVAL; - - if (cmd->base.autoneg == AUTONEG_DISABLE && - cmd->base.duplex != DUPLEX_FULL && - cmd->base.duplex != DUPLEX_HALF) - return -EINVAL; - - ethtool_convert_link_mode_to_legacy_u32(&advertising, - cmd->link_modes.advertising); - - if (cmd->base.autoneg == AUTONEG_ENABLE) { - u32 mask = ADVERTISED_Autoneg | - ADVERTISED_Pause | - ADVERTISED_Asym_Pause; - - if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) - mask |= ADVERTISED_1000baseT_Half | - ADVERTISED_1000baseT_Full; - - if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) - mask |= ADVERTISED_100baseT_Half | - ADVERTISED_100baseT_Full | - ADVERTISED_10baseT_Half | - ADVERTISED_10baseT_Full | - ADVERTISED_TP; - else - mask |= ADVERTISED_FIBRE; - - if (advertising & ~mask) - return -EINVAL; - - mask &= (ADVERTISED_1000baseT_Half | - ADVERTISED_1000baseT_Full | - ADVERTISED_100baseT_Half | - ADVERTISED_100baseT_Full | - ADVERTISED_10baseT_Half | - ADVERTISED_10baseT_Full); - - advertising &= mask; - } else { - if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES) { - if (speed != SPEED_1000) - return -EINVAL; - - if (cmd->base.duplex != DUPLEX_FULL) - return -EINVAL; - } else { - if (speed != SPEED_100 && - speed != SPEED_10) - return -EINVAL; - } - } - - tg3_full_lock(tp, 0); - - tp->link_config.autoneg = cmd->base.autoneg; - if (cmd->base.autoneg == AUTONEG_ENABLE) { - tp->link_config.advertising = (advertising | - ADVERTISED_Autoneg); - tp->link_config.speed = SPEED_UNKNOWN; - tp->link_config.duplex = DUPLEX_UNKNOWN; - } else { - tp->link_config.advertising = 0; - tp->link_config.speed = speed; - tp->link_config.duplex = cmd->base.duplex; - } - - tp->phy_flags |= TG3_PHYFLG_USER_CONFIGURED; - - tg3_warn_mgmt_link_flap(tp); - - if (netif_running(dev)) - tg3_setup_phy(tp, true); - - tg3_full_unlock(tp); - - return 0; -} - -static void tg3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) -{ - struct tg3 *tp = netdev_priv(dev); - - strlcpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver)); - strlcpy(info->version, DRV_MODULE_VERSION, sizeof(info->version)); - strlcpy(info->fw_version, tp->fw_ver, sizeof(info->fw_version)); - strlcpy(info->bus_info, pci_name(tp->pdev), sizeof(info->bus_info)); -} - -static void tg3_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) -{ - struct tg3 *tp = netdev_priv(dev); - - if (tg3_flag(tp, WOL_CAP) && device_can_wakeup(&tp->pdev->dev)) - wol->supported = WAKE_MAGIC; - else - wol->supported = 0; - wol->wolopts = 0; - if (tg3_flag(tp, WOL_ENABLE) && device_can_wakeup(&tp->pdev->dev)) - wol->wolopts = WAKE_MAGIC; - memset(&wol->sopass, 0, sizeof(wol->sopass)); -} - -static int tg3_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) -{ - struct tg3 *tp = netdev_priv(dev); - struct device *dp = &tp->pdev->dev; - - if (wol->wolopts & ~WAKE_MAGIC) - return -EINVAL; - if ((wol->wolopts & WAKE_MAGIC) && - !(tg3_flag(tp, WOL_CAP) && device_can_wakeup(dp))) - return -EINVAL; - - device_set_wakeup_enable(dp, wol->wolopts & WAKE_MAGIC); - - if (device_may_wakeup(dp)) - tg3_flag_set(tp, WOL_ENABLE); - else - tg3_flag_clear(tp, WOL_ENABLE); - - return 0; -} - -static u32 tg3_get_msglevel(struct net_device *dev) -{ - struct tg3 *tp = netdev_priv(dev); - return tp->msg_enable; -} - -static void tg3_set_msglevel(struct net_device *dev, u32 value) -{ - struct tg3 *tp = netdev_priv(dev); - tp->msg_enable = value; -} - -static int tg3_nway_reset(struct net_device *dev) -{ - struct tg3 *tp = netdev_priv(dev); - int r; - - if (!netif_running(dev)) - return -EAGAIN; - - if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) - return -EINVAL; - - tg3_warn_mgmt_link_flap(tp); - - if (tg3_flag(tp, USE_PHYLIB)) { - if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED)) - return -EAGAIN; - r = phy_start_aneg(mdiobus_get_phy(tp->mdio_bus, tp->phy_addr)); - } else { - u32 bmcr; - - spin_lock_bh(&tp->lock); - r = -EINVAL; - tg3_readphy(tp, MII_BMCR, &bmcr); - if (!tg3_readphy(tp, MII_BMCR, &bmcr) && - ((bmcr & BMCR_ANENABLE) || - (tp->phy_flags & TG3_PHYFLG_PARALLEL_DETECT))) { - tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANRESTART | - BMCR_ANENABLE); - r = 0; - } - spin_unlock_bh(&tp->lock); - } - - return r; -} - -static void tg3_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) -{ - struct tg3 *tp = netdev_priv(dev); - - ering->rx_max_pending = tp->rx_std_ring_mask; - if (tg3_flag(tp, JUMBO_RING_ENABLE)) - ering->rx_jumbo_max_pending = tp->rx_jmb_ring_mask; - else - ering->rx_jumbo_max_pending = 0; - - ering->tx_max_pending = TG3_TX_RING_SIZE - 1; - - ering->rx_pending = tp->rx_pending; - if (tg3_flag(tp, JUMBO_RING_ENABLE)) - ering->rx_jumbo_pending = tp->rx_jumbo_pending; - else - ering->rx_jumbo_pending = 0; - - ering->tx_pending = tp->napi[0].tx_pending; -} - -static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) -{ - struct tg3 *tp = netdev_priv(dev); - int i, irq_sync = 0, err = 0; - bool reset_phy = false; - - if ((ering->rx_pending > tp->rx_std_ring_mask) || - (ering->rx_jumbo_pending > tp->rx_jmb_ring_mask) || - (ering->tx_pending > TG3_TX_RING_SIZE - 1) || - (ering->tx_pending <= MAX_SKB_FRAGS) || - (tg3_flag(tp, TSO_BUG) && - (ering->tx_pending <= (MAX_SKB_FRAGS * 3)))) - return -EINVAL; - - if (netif_running(dev)) { - tg3_phy_stop(tp); - tg3_netif_stop(tp); - irq_sync = 1; - } - - tg3_full_lock(tp, irq_sync); - - tp->rx_pending = ering->rx_pending; - - if (tg3_flag(tp, MAX_RXPEND_64) && - tp->rx_pending > 63) - tp->rx_pending = 63; - - if (tg3_flag(tp, JUMBO_RING_ENABLE)) - tp->rx_jumbo_pending = ering->rx_jumbo_pending; - - for (i = 0; i < tp->irq_max; i++) - tp->napi[i].tx_pending = ering->tx_pending; - - if (netif_running(dev)) { - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - /* Reset PHY to avoid PHY lock up */ - if (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720) - reset_phy = true; - - err = tg3_restart_hw(tp, reset_phy); - if (!err) - tg3_netif_start(tp); - } - - tg3_full_unlock(tp); - - if (irq_sync && !err) - tg3_phy_start(tp); - - return err; -} - -static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause) -{ - struct tg3 *tp = netdev_priv(dev); - - epause->autoneg = !!tg3_flag(tp, PAUSE_AUTONEG); - - if (tp->link_config.flowctrl & FLOW_CTRL_RX) - epause->rx_pause = 1; - else - epause->rx_pause = 0; - - if (tp->link_config.flowctrl & FLOW_CTRL_TX) - epause->tx_pause = 1; - else - epause->tx_pause = 0; -} - -static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause) -{ - struct tg3 *tp = netdev_priv(dev); - int err = 0; - bool reset_phy = false; - - if (tp->link_config.autoneg == AUTONEG_ENABLE) - tg3_warn_mgmt_link_flap(tp); - - if (tg3_flag(tp, USE_PHYLIB)) { - u32 newadv; - struct phy_device *phydev; - - phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); - - if (!(phydev->supported & SUPPORTED_Pause) || - (!(phydev->supported & SUPPORTED_Asym_Pause) && - (epause->rx_pause != epause->tx_pause))) - return -EINVAL; - - tp->link_config.flowctrl = 0; - if (epause->rx_pause) { - tp->link_config.flowctrl |= FLOW_CTRL_RX; - - if (epause->tx_pause) { - tp->link_config.flowctrl |= FLOW_CTRL_TX; - newadv = ADVERTISED_Pause; - } else - newadv = ADVERTISED_Pause | - ADVERTISED_Asym_Pause; - } else if (epause->tx_pause) { - tp->link_config.flowctrl |= FLOW_CTRL_TX; - newadv = ADVERTISED_Asym_Pause; - } else - newadv = 0; - - if (epause->autoneg) - tg3_flag_set(tp, PAUSE_AUTONEG); - else - tg3_flag_clear(tp, PAUSE_AUTONEG); - - if (tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) { - u32 oldadv = phydev->advertising & - (ADVERTISED_Pause | ADVERTISED_Asym_Pause); - if (oldadv != newadv) { - phydev->advertising &= - ~(ADVERTISED_Pause | - ADVERTISED_Asym_Pause); - phydev->advertising |= newadv; - if (phydev->autoneg) { - /* - * Always renegotiate the link to - * inform our link partner of our - * flow control settings, even if the - * flow control is forced. Let - * tg3_adjust_link() do the final - * flow control setup. - */ - return phy_start_aneg(phydev); - } - } - - if (!epause->autoneg) - tg3_setup_flow_control(tp, 0, 0); - } else { - tp->link_config.advertising &= - ~(ADVERTISED_Pause | - ADVERTISED_Asym_Pause); - tp->link_config.advertising |= newadv; - } - } else { - int irq_sync = 0; - - if (netif_running(dev)) { - tg3_netif_stop(tp); - irq_sync = 1; - } - - tg3_full_lock(tp, irq_sync); - - if (epause->autoneg) - tg3_flag_set(tp, PAUSE_AUTONEG); - else - tg3_flag_clear(tp, PAUSE_AUTONEG); - if (epause->rx_pause) - tp->link_config.flowctrl |= FLOW_CTRL_RX; - else - tp->link_config.flowctrl &= ~FLOW_CTRL_RX; - if (epause->tx_pause) - tp->link_config.flowctrl |= FLOW_CTRL_TX; - else - tp->link_config.flowctrl &= ~FLOW_CTRL_TX; - - if (netif_running(dev)) { - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - /* Reset PHY to avoid PHY lock up */ - if (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720) - reset_phy = true; - - err = tg3_restart_hw(tp, reset_phy); - if (!err) - tg3_netif_start(tp); - } - - tg3_full_unlock(tp); - } - - tp->phy_flags |= TG3_PHYFLG_USER_CONFIGURED; - - return err; -} - -static int tg3_get_sset_count(struct net_device *dev, int sset) -{ - switch (sset) { - case ETH_SS_TEST: - return TG3_NUM_TEST; - case ETH_SS_STATS: - return TG3_NUM_STATS; - default: - return -EOPNOTSUPP; - } -} - -static int tg3_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info, - u32 *rules __always_unused) -{ - struct tg3 *tp = netdev_priv(dev); - - if (!tg3_flag(tp, SUPPORT_MSIX)) - return -EOPNOTSUPP; - - switch (info->cmd) { - case ETHTOOL_GRXRINGS: - if (netif_running(tp->dev)) - info->data = tp->rxq_cnt; - else { - info->data = num_online_cpus(); - if (info->data > TG3_RSS_MAX_NUM_QS) - info->data = TG3_RSS_MAX_NUM_QS; - } - - return 0; - - default: - return -EOPNOTSUPP; - } -} - -static u32 tg3_get_rxfh_indir_size(struct net_device *dev) -{ - u32 size = 0; - struct tg3 *tp = netdev_priv(dev); - - if (tg3_flag(tp, SUPPORT_MSIX)) - size = TG3_RSS_INDIR_TBL_SIZE; - - return size; -} - -static int tg3_get_rxfh(struct net_device *dev, u32 *indir, u8 *key, u8 *hfunc) -{ - struct tg3 *tp = netdev_priv(dev); - int i; - - if (hfunc) - *hfunc = ETH_RSS_HASH_TOP; - if (!indir) - return 0; - - for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i++) - indir[i] = tp->rss_ind_tbl[i]; - - return 0; -} - -static int tg3_set_rxfh(struct net_device *dev, const u32 *indir, const u8 *key, - const u8 hfunc) -{ - struct tg3 *tp = netdev_priv(dev); - size_t i; - - /* We require at least one supported parameter to be changed and no - * change in any of the unsupported parameters - */ - if (key || - (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP)) - return -EOPNOTSUPP; - - if (!indir) - return 0; - - for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i++) - tp->rss_ind_tbl[i] = indir[i]; - - if (!netif_running(dev) || !tg3_flag(tp, ENABLE_RSS)) - return 0; - - /* It is legal to write the indirection - * table while the device is running. - */ - tg3_full_lock(tp, 0); - tg3_rss_write_indir_tbl(tp); - tg3_full_unlock(tp); - - return 0; -} - -static void tg3_get_channels(struct net_device *dev, - struct ethtool_channels *channel) -{ - struct tg3 *tp = netdev_priv(dev); - u32 deflt_qs = netif_get_num_default_rss_queues(); - - channel->max_rx = tp->rxq_max; - channel->max_tx = tp->txq_max; - - if (netif_running(dev)) { - channel->rx_count = tp->rxq_cnt; - channel->tx_count = tp->txq_cnt; - } else { - if (tp->rxq_req) - channel->rx_count = tp->rxq_req; - else - channel->rx_count = min(deflt_qs, tp->rxq_max); - - if (tp->txq_req) - channel->tx_count = tp->txq_req; - else - channel->tx_count = min(deflt_qs, tp->txq_max); - } -} - -static int tg3_set_channels(struct net_device *dev, - struct ethtool_channels *channel) -{ - struct tg3 *tp = netdev_priv(dev); - - if (!tg3_flag(tp, SUPPORT_MSIX)) - return -EOPNOTSUPP; - - if (channel->rx_count > tp->rxq_max || - channel->tx_count > tp->txq_max) - return -EINVAL; - - tp->rxq_req = channel->rx_count; - tp->txq_req = channel->tx_count; - - if (!netif_running(dev)) - return 0; - - tg3_stop(tp); - - tg3_carrier_off(tp); - - tg3_start(tp, true, false, false); - - return 0; -} - -static void tg3_get_strings(struct net_device *dev, u32 stringset, u8 *buf) -{ - switch (stringset) { - case ETH_SS_STATS: - memcpy(buf, ðtool_stats_keys, sizeof(ethtool_stats_keys)); - break; - case ETH_SS_TEST: - memcpy(buf, ðtool_test_keys, sizeof(ethtool_test_keys)); - break; - default: - WARN_ON(1); /* we need a WARN() */ - break; - } -} - -static int tg3_set_phys_id(struct net_device *dev, - enum ethtool_phys_id_state state) -{ - struct tg3 *tp = netdev_priv(dev); - - if (!netif_running(tp->dev)) - return -EAGAIN; - - switch (state) { - case ETHTOOL_ID_ACTIVE: - return 1; /* cycle on/off once per second */ - - case ETHTOOL_ID_ON: - tw32(MAC_LED_CTRL, LED_CTRL_LNKLED_OVERRIDE | - LED_CTRL_1000MBPS_ON | - LED_CTRL_100MBPS_ON | - LED_CTRL_10MBPS_ON | - LED_CTRL_TRAFFIC_OVERRIDE | - LED_CTRL_TRAFFIC_BLINK | - LED_CTRL_TRAFFIC_LED); - break; - - case ETHTOOL_ID_OFF: - tw32(MAC_LED_CTRL, LED_CTRL_LNKLED_OVERRIDE | - LED_CTRL_TRAFFIC_OVERRIDE); - break; - - case ETHTOOL_ID_INACTIVE: - tw32(MAC_LED_CTRL, tp->led_ctrl); - break; - } - - return 0; -} - -static void tg3_get_ethtool_stats(struct net_device *dev, - struct ethtool_stats *estats, u64 *tmp_stats) -{ - struct tg3 *tp = netdev_priv(dev); - - if (tp->hw_stats) - tg3_get_estats(tp, (struct tg3_ethtool_stats *)tmp_stats); - else - memset(tmp_stats, 0, sizeof(struct tg3_ethtool_stats)); -} - -static __be32 *tg3_vpd_readblock(struct tg3 *tp, u32 *vpdlen) -{ - int i; - __be32 *buf; - u32 offset = 0, len = 0; - u32 magic, val; - - if (tg3_flag(tp, NO_NVRAM) || tg3_nvram_read(tp, 0, &magic)) - return NULL; - - if (magic == TG3_EEPROM_MAGIC) { - for (offset = TG3_NVM_DIR_START; - offset < TG3_NVM_DIR_END; - offset += TG3_NVM_DIRENT_SIZE) { - if (tg3_nvram_read(tp, offset, &val)) - return NULL; - - if ((val >> TG3_NVM_DIRTYPE_SHIFT) == - TG3_NVM_DIRTYPE_EXTVPD) - break; - } - - if (offset != TG3_NVM_DIR_END) { - len = (val & TG3_NVM_DIRTYPE_LENMSK) * 4; - if (tg3_nvram_read(tp, offset + 4, &offset)) - return NULL; - - offset = tg3_nvram_logical_addr(tp, offset); - } - } - - if (!offset || !len) { - offset = TG3_NVM_VPD_OFF; - len = TG3_NVM_VPD_LEN; - } - - buf = kmalloc(len, GFP_KERNEL); - if (buf == NULL) - return NULL; - - if (magic == TG3_EEPROM_MAGIC) { - for (i = 0; i < len; i += 4) { - /* The data is in little-endian format in NVRAM. - * Use the big-endian read routines to preserve - * the byte order as it exists in NVRAM. - */ - if (tg3_nvram_read_be32(tp, offset + i, &buf[i/4])) - goto error; - } - } else { - u8 *ptr; - ssize_t cnt; - unsigned int pos = 0; - - ptr = (u8 *)&buf[0]; - for (i = 0; pos < len && i < 3; i++, pos += cnt, ptr += cnt) { - cnt = pci_read_vpd(tp->pdev, pos, - len - pos, ptr); - if (cnt == -ETIMEDOUT || cnt == -EINTR) - cnt = 0; - else if (cnt < 0) - goto error; - } - if (pos != len) - goto error; - } - - *vpdlen = len; - - return buf; - -error: - kfree(buf); - return NULL; -} - -#define NVRAM_TEST_SIZE 0x100 -#define NVRAM_SELFBOOT_FORMAT1_0_SIZE 0x14 -#define NVRAM_SELFBOOT_FORMAT1_2_SIZE 0x18 -#define NVRAM_SELFBOOT_FORMAT1_3_SIZE 0x1c -#define NVRAM_SELFBOOT_FORMAT1_4_SIZE 0x20 -#define NVRAM_SELFBOOT_FORMAT1_5_SIZE 0x24 -#define NVRAM_SELFBOOT_FORMAT1_6_SIZE 0x50 -#define NVRAM_SELFBOOT_HW_SIZE 0x20 -#define NVRAM_SELFBOOT_DATA_SIZE 0x1c - -static int tg3_test_nvram(struct tg3 *tp) -{ - u32 csum, magic, len; - __be32 *buf; - int i, j, k, err = 0, size; - - if (tg3_flag(tp, NO_NVRAM)) - return 0; - - if (tg3_nvram_read(tp, 0, &magic) != 0) - return -EIO; - - if (magic == TG3_EEPROM_MAGIC) - size = NVRAM_TEST_SIZE; - else if ((magic & TG3_EEPROM_MAGIC_FW_MSK) == TG3_EEPROM_MAGIC_FW) { - if ((magic & TG3_EEPROM_SB_FORMAT_MASK) == - TG3_EEPROM_SB_FORMAT_1) { - switch (magic & TG3_EEPROM_SB_REVISION_MASK) { - case TG3_EEPROM_SB_REVISION_0: - size = NVRAM_SELFBOOT_FORMAT1_0_SIZE; - break; - case TG3_EEPROM_SB_REVISION_2: - size = NVRAM_SELFBOOT_FORMAT1_2_SIZE; - break; - case TG3_EEPROM_SB_REVISION_3: - size = NVRAM_SELFBOOT_FORMAT1_3_SIZE; - break; - case TG3_EEPROM_SB_REVISION_4: - size = NVRAM_SELFBOOT_FORMAT1_4_SIZE; - break; - case TG3_EEPROM_SB_REVISION_5: - size = NVRAM_SELFBOOT_FORMAT1_5_SIZE; - break; - case TG3_EEPROM_SB_REVISION_6: - size = NVRAM_SELFBOOT_FORMAT1_6_SIZE; - break; - default: - return -EIO; - } - } else - return 0; - } else if ((magic & TG3_EEPROM_MAGIC_HW_MSK) == TG3_EEPROM_MAGIC_HW) - size = NVRAM_SELFBOOT_HW_SIZE; - else - return -EIO; - - buf = kmalloc(size, GFP_KERNEL); - if (buf == NULL) - return -ENOMEM; - - err = -EIO; - for (i = 0, j = 0; i < size; i += 4, j++) { - err = tg3_nvram_read_be32(tp, i, &buf[j]); - if (err) - break; - } - if (i < size) - goto out; - - /* Selfboot format */ - magic = be32_to_cpu(buf[0]); - if ((magic & TG3_EEPROM_MAGIC_FW_MSK) == - TG3_EEPROM_MAGIC_FW) { - u8 *buf8 = (u8 *) buf, csum8 = 0; - - if ((magic & TG3_EEPROM_SB_REVISION_MASK) == - TG3_EEPROM_SB_REVISION_2) { - /* For rev 2, the csum doesn't include the MBA. */ - for (i = 0; i < TG3_EEPROM_SB_F1R2_MBA_OFF; i++) - csum8 += buf8[i]; - for (i = TG3_EEPROM_SB_F1R2_MBA_OFF + 4; i < size; i++) - csum8 += buf8[i]; - } else { - for (i = 0; i < size; i++) - csum8 += buf8[i]; - } - - if (csum8 == 0) { - err = 0; - goto out; - } - - err = -EIO; - goto out; - } - - if ((magic & TG3_EEPROM_MAGIC_HW_MSK) == - TG3_EEPROM_MAGIC_HW) { - u8 data[NVRAM_SELFBOOT_DATA_SIZE]; - u8 parity[NVRAM_SELFBOOT_DATA_SIZE]; - u8 *buf8 = (u8 *) buf; - - /* Separate the parity bits and the data bytes. */ - for (i = 0, j = 0, k = 0; i < NVRAM_SELFBOOT_HW_SIZE; i++) { - if ((i == 0) || (i == 8)) { - int l; - u8 msk; - - for (l = 0, msk = 0x80; l < 7; l++, msk >>= 1) - parity[k++] = buf8[i] & msk; - i++; - } else if (i == 16) { - int l; - u8 msk; - - for (l = 0, msk = 0x20; l < 6; l++, msk >>= 1) - parity[k++] = buf8[i] & msk; - i++; - - for (l = 0, msk = 0x80; l < 8; l++, msk >>= 1) - parity[k++] = buf8[i] & msk; - i++; - } - data[j++] = buf8[i]; - } - - err = -EIO; - for (i = 0; i < NVRAM_SELFBOOT_DATA_SIZE; i++) { - u8 hw8 = hweight8(data[i]); - - if ((hw8 & 0x1) && parity[i]) - goto out; - else if (!(hw8 & 0x1) && !parity[i]) - goto out; - } - err = 0; - goto out; - } - - err = -EIO; - - /* Bootstrap checksum at offset 0x10 */ - csum = calc_crc((unsigned char *) buf, 0x10); - if (csum != le32_to_cpu(buf[0x10/4])) - goto out; - - /* Manufacturing block starts at offset 0x74, checksum at 0xfc */ - csum = calc_crc((unsigned char *) &buf[0x74/4], 0x88); - if (csum != le32_to_cpu(buf[0xfc/4])) - goto out; - - kfree(buf); - - buf = tg3_vpd_readblock(tp, &len); - if (!buf) - return -ENOMEM; - - i = pci_vpd_find_tag((u8 *)buf, 0, len, PCI_VPD_LRDT_RO_DATA); - if (i > 0) { - j = pci_vpd_lrdt_size(&((u8 *)buf)[i]); - if (j < 0) - goto out; - - if (i + PCI_VPD_LRDT_TAG_SIZE + j > len) - goto out; - - i += PCI_VPD_LRDT_TAG_SIZE; - j = pci_vpd_find_info_keyword((u8 *)buf, i, j, - PCI_VPD_RO_KEYWORD_CHKSUM); - if (j > 0) { - u8 csum8 = 0; - - j += PCI_VPD_INFO_FLD_HDR_SIZE; - - for (i = 0; i <= j; i++) - csum8 += ((u8 *)buf)[i]; - - if (csum8) - goto out; - } - } - - err = 0; - -out: - kfree(buf); - return err; -} - -#define TG3_SERDES_TIMEOUT_SEC 2 -#define TG3_COPPER_TIMEOUT_SEC 6 - -static int tg3_test_link(struct tg3 *tp) -{ - int i, max; - - if (!netif_running(tp->dev)) - return -ENODEV; - - if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES) - max = TG3_SERDES_TIMEOUT_SEC; - else - max = TG3_COPPER_TIMEOUT_SEC; - - for (i = 0; i < max; i++) { - if (tp->link_up) - return 0; - - if (msleep_interruptible(1000)) - break; - } - - return -EIO; -} - -/* Only test the commonly used registers */ -static int tg3_test_registers(struct tg3 *tp) -{ - int i, is_5705, is_5750; - u32 offset, read_mask, write_mask, val, save_val, read_val; - static struct { - u16 offset; - u16 flags; -#define TG3_FL_5705 0x1 -#define TG3_FL_NOT_5705 0x2 -#define TG3_FL_NOT_5788 0x4 -#define TG3_FL_NOT_5750 0x8 - u32 read_mask; - u32 write_mask; - } reg_tbl[] = { - /* MAC Control Registers */ - { MAC_MODE, TG3_FL_NOT_5705, - 0x00000000, 0x00ef6f8c }, - { MAC_MODE, TG3_FL_5705, - 0x00000000, 0x01ef6b8c }, - { MAC_STATUS, TG3_FL_NOT_5705, - 0x03800107, 0x00000000 }, - { MAC_STATUS, TG3_FL_5705, - 0x03800100, 0x00000000 }, - { MAC_ADDR_0_HIGH, 0x0000, - 0x00000000, 0x0000ffff }, - { MAC_ADDR_0_LOW, 0x0000, - 0x00000000, 0xffffffff }, - { MAC_RX_MTU_SIZE, 0x0000, - 0x00000000, 0x0000ffff }, - { MAC_TX_MODE, 0x0000, - 0x00000000, 0x00000070 }, - { MAC_TX_LENGTHS, 0x0000, - 0x00000000, 0x00003fff }, - { MAC_RX_MODE, TG3_FL_NOT_5705, - 0x00000000, 0x000007fc }, - { MAC_RX_MODE, TG3_FL_5705, - 0x00000000, 0x000007dc }, - { MAC_HASH_REG_0, 0x0000, - 0x00000000, 0xffffffff }, - { MAC_HASH_REG_1, 0x0000, - 0x00000000, 0xffffffff }, - { MAC_HASH_REG_2, 0x0000, - 0x00000000, 0xffffffff }, - { MAC_HASH_REG_3, 0x0000, - 0x00000000, 0xffffffff }, - - /* Receive Data and Receive BD Initiator Control Registers. */ - { RCVDBDI_JUMBO_BD+0, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { RCVDBDI_JUMBO_BD+4, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { RCVDBDI_JUMBO_BD+8, TG3_FL_NOT_5705, - 0x00000000, 0x00000003 }, - { RCVDBDI_JUMBO_BD+0xc, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { RCVDBDI_STD_BD+0, 0x0000, - 0x00000000, 0xffffffff }, - { RCVDBDI_STD_BD+4, 0x0000, - 0x00000000, 0xffffffff }, - { RCVDBDI_STD_BD+8, 0x0000, - 0x00000000, 0xffff0002 }, - { RCVDBDI_STD_BD+0xc, 0x0000, - 0x00000000, 0xffffffff }, - - /* Receive BD Initiator Control Registers. */ - { RCVBDI_STD_THRESH, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { RCVBDI_STD_THRESH, TG3_FL_5705, - 0x00000000, 0x000003ff }, - { RCVBDI_JUMBO_THRESH, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - - /* Host Coalescing Control Registers. */ - { HOSTCC_MODE, TG3_FL_NOT_5705, - 0x00000000, 0x00000004 }, - { HOSTCC_MODE, TG3_FL_5705, - 0x00000000, 0x000000f6 }, - { HOSTCC_RXCOL_TICKS, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { HOSTCC_RXCOL_TICKS, TG3_FL_5705, - 0x00000000, 0x000003ff }, - { HOSTCC_TXCOL_TICKS, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { HOSTCC_TXCOL_TICKS, TG3_FL_5705, - 0x00000000, 0x000003ff }, - { HOSTCC_RXMAX_FRAMES, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { HOSTCC_RXMAX_FRAMES, TG3_FL_5705 | TG3_FL_NOT_5788, - 0x00000000, 0x000000ff }, - { HOSTCC_TXMAX_FRAMES, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { HOSTCC_TXMAX_FRAMES, TG3_FL_5705 | TG3_FL_NOT_5788, - 0x00000000, 0x000000ff }, - { HOSTCC_RXCOAL_TICK_INT, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { HOSTCC_TXCOAL_TICK_INT, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { HOSTCC_RXCOAL_MAXF_INT, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { HOSTCC_RXCOAL_MAXF_INT, TG3_FL_5705 | TG3_FL_NOT_5788, - 0x00000000, 0x000000ff }, - { HOSTCC_TXCOAL_MAXF_INT, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { HOSTCC_TXCOAL_MAXF_INT, TG3_FL_5705 | TG3_FL_NOT_5788, - 0x00000000, 0x000000ff }, - { HOSTCC_STAT_COAL_TICKS, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { HOSTCC_STATS_BLK_HOST_ADDR, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { HOSTCC_STATS_BLK_HOST_ADDR+4, TG3_FL_NOT_5705, - 0x00000000, 0xffffffff }, - { HOSTCC_STATUS_BLK_HOST_ADDR, 0x0000, - 0x00000000, 0xffffffff }, - { HOSTCC_STATUS_BLK_HOST_ADDR+4, 0x0000, - 0x00000000, 0xffffffff }, - { HOSTCC_STATS_BLK_NIC_ADDR, 0x0000, - 0xffffffff, 0x00000000 }, - { HOSTCC_STATUS_BLK_NIC_ADDR, 0x0000, - 0xffffffff, 0x00000000 }, - - /* Buffer Manager Control Registers. */ - { BUFMGR_MB_POOL_ADDR, TG3_FL_NOT_5750, - 0x00000000, 0x007fff80 }, - { BUFMGR_MB_POOL_SIZE, TG3_FL_NOT_5750, - 0x00000000, 0x007fffff }, - { BUFMGR_MB_RDMA_LOW_WATER, 0x0000, - 0x00000000, 0x0000003f }, - { BUFMGR_MB_MACRX_LOW_WATER, 0x0000, - 0x00000000, 0x000001ff }, - { BUFMGR_MB_HIGH_WATER, 0x0000, - 0x00000000, 0x000001ff }, - { BUFMGR_DMA_DESC_POOL_ADDR, TG3_FL_NOT_5705, - 0xffffffff, 0x00000000 }, - { BUFMGR_DMA_DESC_POOL_SIZE, TG3_FL_NOT_5705, - 0xffffffff, 0x00000000 }, - - /* Mailbox Registers */ - { GRCMBOX_RCVSTD_PROD_IDX+4, 0x0000, - 0x00000000, 0x000001ff }, - { GRCMBOX_RCVJUMBO_PROD_IDX+4, TG3_FL_NOT_5705, - 0x00000000, 0x000001ff }, - { GRCMBOX_RCVRET_CON_IDX_0+4, 0x0000, - 0x00000000, 0x000007ff }, - { GRCMBOX_SNDHOST_PROD_IDX_0+4, 0x0000, - 0x00000000, 0x000001ff }, - - { 0xffff, 0x0000, 0x00000000, 0x00000000 }, - }; - - is_5705 = is_5750 = 0; - if (tg3_flag(tp, 5705_PLUS)) { - is_5705 = 1; - if (tg3_flag(tp, 5750_PLUS)) - is_5750 = 1; - } - - for (i = 0; reg_tbl[i].offset != 0xffff; i++) { - if (is_5705 && (reg_tbl[i].flags & TG3_FL_NOT_5705)) - continue; - - if (!is_5705 && (reg_tbl[i].flags & TG3_FL_5705)) - continue; - - if (tg3_flag(tp, IS_5788) && - (reg_tbl[i].flags & TG3_FL_NOT_5788)) - continue; - - if (is_5750 && (reg_tbl[i].flags & TG3_FL_NOT_5750)) - continue; - - offset = (u32) reg_tbl[i].offset; - read_mask = reg_tbl[i].read_mask; - write_mask = reg_tbl[i].write_mask; - - /* Save the original register content */ - save_val = tr32(offset); - - /* Determine the read-only value. */ - read_val = save_val & read_mask; - - /* Write zero to the register, then make sure the read-only bits - * are not changed and the read/write bits are all zeros. - */ - tw32(offset, 0); - - val = tr32(offset); - - /* Test the read-only and read/write bits. */ - if (((val & read_mask) != read_val) || (val & write_mask)) - goto out; - - /* Write ones to all the bits defined by RdMask and WrMask, then - * make sure the read-only bits are not changed and the - * read/write bits are all ones. - */ - tw32(offset, read_mask | write_mask); - - val = tr32(offset); - - /* Test the read-only bits. */ - if ((val & read_mask) != read_val) - goto out; - - /* Test the read/write bits. */ - if ((val & write_mask) != write_mask) - goto out; - - tw32(offset, save_val); - } - - return 0; - -out: - if (netif_msg_hw(tp)) - netdev_err(tp->dev, - "Register test failed at offset %x\n", offset); - tw32(offset, save_val); - return -EIO; -} - -static int tg3_do_mem_test(struct tg3 *tp, u32 offset, u32 len) -{ - static const u32 test_pattern[] = { 0x00000000, 0xffffffff, 0xaa55a55a }; - int i; - u32 j; - - for (i = 0; i < ARRAY_SIZE(test_pattern); i++) { - for (j = 0; j < len; j += 4) { - u32 val; - - tg3_write_mem(tp, offset + j, test_pattern[i]); - tg3_read_mem(tp, offset + j, &val); - if (val != test_pattern[i]) - return -EIO; - } - } - return 0; -} - -static int tg3_test_memory(struct tg3 *tp) -{ - static struct mem_entry { - u32 offset; - u32 len; - } mem_tbl_570x[] = { - { 0x00000000, 0x00b50}, - { 0x00002000, 0x1c000}, - { 0xffffffff, 0x00000} - }, mem_tbl_5705[] = { - { 0x00000100, 0x0000c}, - { 0x00000200, 0x00008}, - { 0x00004000, 0x00800}, - { 0x00006000, 0x01000}, - { 0x00008000, 0x02000}, - { 0x00010000, 0x0e000}, - { 0xffffffff, 0x00000} - }, mem_tbl_5755[] = { - { 0x00000200, 0x00008}, - { 0x00004000, 0x00800}, - { 0x00006000, 0x00800}, - { 0x00008000, 0x02000}, - { 0x00010000, 0x0c000}, - { 0xffffffff, 0x00000} - }, mem_tbl_5906[] = { - { 0x00000200, 0x00008}, - { 0x00004000, 0x00400}, - { 0x00006000, 0x00400}, - { 0x00008000, 0x01000}, - { 0x00010000, 0x01000}, - { 0xffffffff, 0x00000} - }, mem_tbl_5717[] = { - { 0x00000200, 0x00008}, - { 0x00010000, 0x0a000}, - { 0x00020000, 0x13c00}, - { 0xffffffff, 0x00000} - }, mem_tbl_57765[] = { - { 0x00000200, 0x00008}, - { 0x00004000, 0x00800}, - { 0x00006000, 0x09800}, - { 0x00010000, 0x0a000}, - { 0xffffffff, 0x00000} - }; - struct mem_entry *mem_tbl; - int err = 0; - int i; - - if (tg3_flag(tp, 5717_PLUS)) - mem_tbl = mem_tbl_5717; - else if (tg3_flag(tp, 57765_CLASS) || - tg3_asic_rev(tp) == ASIC_REV_5762) - mem_tbl = mem_tbl_57765; - else if (tg3_flag(tp, 5755_PLUS)) - mem_tbl = mem_tbl_5755; - else if (tg3_asic_rev(tp) == ASIC_REV_5906) - mem_tbl = mem_tbl_5906; - else if (tg3_flag(tp, 5705_PLUS)) - mem_tbl = mem_tbl_5705; - else - mem_tbl = mem_tbl_570x; - - for (i = 0; mem_tbl[i].offset != 0xffffffff; i++) { - err = tg3_do_mem_test(tp, mem_tbl[i].offset, mem_tbl[i].len); - if (err) - break; - } - - return err; -} - -#define TG3_TSO_MSS 500 - -#define TG3_TSO_IP_HDR_LEN 20 -#define TG3_TSO_TCP_HDR_LEN 20 -#define TG3_TSO_TCP_OPT_LEN 12 - -static const u8 tg3_tso_header[] = { -0x08, 0x00, -0x45, 0x00, 0x00, 0x00, -0x00, 0x00, 0x40, 0x00, -0x40, 0x06, 0x00, 0x00, -0x0a, 0x00, 0x00, 0x01, -0x0a, 0x00, 0x00, 0x02, -0x0d, 0x00, 0xe0, 0x00, -0x00, 0x00, 0x01, 0x00, -0x00, 0x00, 0x02, 0x00, -0x80, 0x10, 0x10, 0x00, -0x14, 0x09, 0x00, 0x00, -0x01, 0x01, 0x08, 0x0a, -0x11, 0x11, 0x11, 0x11, -0x11, 0x11, 0x11, 0x11, -}; - -static int tg3_run_loopback(struct tg3 *tp, u32 pktsz, bool tso_loopback) -{ - u32 rx_start_idx, rx_idx, tx_idx, opaque_key; - u32 base_flags = 0, mss = 0, desc_idx, coal_now, data_off, val; - u32 budget; - struct sk_buff *skb; - u8 *tx_data, *rx_data; - dma_addr_t map; - int num_pkts, tx_len, rx_len, i, err; - struct tg3_rx_buffer_desc *desc; - struct tg3_napi *tnapi, *rnapi; - struct tg3_rx_prodring_set *tpr = &tp->napi[0].prodring; - - tnapi = &tp->napi[0]; - rnapi = &tp->napi[0]; - if (tp->irq_cnt > 1) { - if (tg3_flag(tp, ENABLE_RSS)) - rnapi = &tp->napi[1]; - if (tg3_flag(tp, ENABLE_TSS)) - tnapi = &tp->napi[1]; - } - coal_now = tnapi->coal_now | rnapi->coal_now; - - err = -EIO; - - tx_len = pktsz; - skb = netdev_alloc_skb(tp->dev, tx_len); - if (!skb) - return -ENOMEM; - - tx_data = skb_put(skb, tx_len); - memcpy(tx_data, tp->dev->dev_addr, ETH_ALEN); - memset(tx_data + ETH_ALEN, 0x0, 8); - - tw32(MAC_RX_MTU_SIZE, tx_len + ETH_FCS_LEN); - - if (tso_loopback) { - struct iphdr *iph = (struct iphdr *)&tx_data[ETH_HLEN]; - - u32 hdr_len = TG3_TSO_IP_HDR_LEN + TG3_TSO_TCP_HDR_LEN + - TG3_TSO_TCP_OPT_LEN; - - memcpy(tx_data + ETH_ALEN * 2, tg3_tso_header, - sizeof(tg3_tso_header)); - mss = TG3_TSO_MSS; - - val = tx_len - ETH_ALEN * 2 - sizeof(tg3_tso_header); - num_pkts = DIV_ROUND_UP(val, TG3_TSO_MSS); - - /* Set the total length field in the IP header */ - iph->tot_len = htons((u16)(mss + hdr_len)); - - base_flags = (TXD_FLAG_CPU_PRE_DMA | - TXD_FLAG_CPU_POST_DMA); - - if (tg3_flag(tp, HW_TSO_1) || - tg3_flag(tp, HW_TSO_2) || - tg3_flag(tp, HW_TSO_3)) { - struct tcphdr *th; - val = ETH_HLEN + TG3_TSO_IP_HDR_LEN; - th = (struct tcphdr *)&tx_data[val]; - th->check = 0; - } else - base_flags |= TXD_FLAG_TCPUDP_CSUM; - - if (tg3_flag(tp, HW_TSO_3)) { - mss |= (hdr_len & 0xc) << 12; - if (hdr_len & 0x10) - base_flags |= 0x00000010; - base_flags |= (hdr_len & 0x3e0) << 5; - } else if (tg3_flag(tp, HW_TSO_2)) - mss |= hdr_len << 9; - else if (tg3_flag(tp, HW_TSO_1) || - tg3_asic_rev(tp) == ASIC_REV_5705) { - mss |= (TG3_TSO_TCP_OPT_LEN << 9); - } else { - base_flags |= (TG3_TSO_TCP_OPT_LEN << 10); - } - - data_off = ETH_ALEN * 2 + sizeof(tg3_tso_header); - } else { - num_pkts = 1; - data_off = ETH_HLEN; - - if (tg3_flag(tp, USE_JUMBO_BDFLAG) && - tx_len > VLAN_ETH_FRAME_LEN) - base_flags |= TXD_FLAG_JMB_PKT; - } - - for (i = data_off; i < tx_len; i++) - tx_data[i] = (u8) (i & 0xff); - - map = pci_map_single(tp->pdev, skb->data, tx_len, PCI_DMA_TODEVICE); - if (pci_dma_mapping_error(tp->pdev, map)) { - dev_kfree_skb(skb); - return -EIO; - } - - val = tnapi->tx_prod; - tnapi->tx_buffers[val].skb = skb; - dma_unmap_addr_set(&tnapi->tx_buffers[val], mapping, map); - - tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE | - rnapi->coal_now); - - udelay(10); - - rx_start_idx = rnapi->hw_status->idx[0].rx_producer; - - budget = tg3_tx_avail(tnapi); - if (tg3_tx_frag_set(tnapi, &val, &budget, map, tx_len, - base_flags | TXD_FLAG_END, mss, 0)) { - tnapi->tx_buffers[val].skb = NULL; - dev_kfree_skb(skb); - return -EIO; - } - - tnapi->tx_prod++; - - /* Sync BD data before updating mailbox */ - wmb(); - - tw32_tx_mbox(tnapi->prodmbox, tnapi->tx_prod); - tr32_mailbox(tnapi->prodmbox); - - udelay(10); - - /* 350 usec to allow enough time on some 10/100 Mbps devices. */ - for (i = 0; i < 35; i++) { - tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE | - coal_now); - - udelay(10); - - tx_idx = tnapi->hw_status->idx[0].tx_consumer; - rx_idx = rnapi->hw_status->idx[0].rx_producer; - if ((tx_idx == tnapi->tx_prod) && - (rx_idx == (rx_start_idx + num_pkts))) - break; - } - - tg3_tx_skb_unmap(tnapi, tnapi->tx_prod - 1, -1); - dev_kfree_skb(skb); - - if (tx_idx != tnapi->tx_prod) - goto out; - - if (rx_idx != rx_start_idx + num_pkts) - goto out; - - val = data_off; - while (rx_idx != rx_start_idx) { - desc = &rnapi->rx_rcb[rx_start_idx++]; - desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK; - opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK; - - if ((desc->err_vlan & RXD_ERR_MASK) != 0 && - (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII)) - goto out; - - rx_len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - - ETH_FCS_LEN; - - if (!tso_loopback) { - if (rx_len != tx_len) - goto out; - - if (pktsz <= TG3_RX_STD_DMA_SZ - ETH_FCS_LEN) { - if (opaque_key != RXD_OPAQUE_RING_STD) - goto out; - } else { - if (opaque_key != RXD_OPAQUE_RING_JUMBO) - goto out; - } - } else if ((desc->type_flags & RXD_FLAG_TCPUDP_CSUM) && - (desc->ip_tcp_csum & RXD_TCPCSUM_MASK) - >> RXD_TCPCSUM_SHIFT != 0xffff) { - goto out; - } - - if (opaque_key == RXD_OPAQUE_RING_STD) { - rx_data = tpr->rx_std_buffers[desc_idx].data; - map = dma_unmap_addr(&tpr->rx_std_buffers[desc_idx], - mapping); - } else if (opaque_key == RXD_OPAQUE_RING_JUMBO) { - rx_data = tpr->rx_jmb_buffers[desc_idx].data; - map = dma_unmap_addr(&tpr->rx_jmb_buffers[desc_idx], - mapping); - } else - goto out; - - pci_dma_sync_single_for_cpu(tp->pdev, map, rx_len, - PCI_DMA_FROMDEVICE); - - rx_data += TG3_RX_OFFSET(tp); - for (i = data_off; i < rx_len; i++, val++) { - if (*(rx_data + i) != (u8) (val & 0xff)) - goto out; - } - } - - err = 0; - - /* tg3_free_rings will unmap and free the rx_data */ -out: - return err; -} - -#define TG3_STD_LOOPBACK_FAILED 1 -#define TG3_JMB_LOOPBACK_FAILED 2 -#define TG3_TSO_LOOPBACK_FAILED 4 -#define TG3_LOOPBACK_FAILED \ - (TG3_STD_LOOPBACK_FAILED | \ - TG3_JMB_LOOPBACK_FAILED | \ - TG3_TSO_LOOPBACK_FAILED) - -static int tg3_test_loopback(struct tg3 *tp, u64 *data, bool do_extlpbk) -{ - int err = -EIO; - u32 eee_cap; - u32 jmb_pkt_sz = 9000; - - if (tp->dma_limit) - jmb_pkt_sz = tp->dma_limit - ETH_HLEN; - - eee_cap = tp->phy_flags & TG3_PHYFLG_EEE_CAP; - tp->phy_flags &= ~TG3_PHYFLG_EEE_CAP; - - if (!netif_running(tp->dev)) { - data[TG3_MAC_LOOPB_TEST] = TG3_LOOPBACK_FAILED; - data[TG3_PHY_LOOPB_TEST] = TG3_LOOPBACK_FAILED; - if (do_extlpbk) - data[TG3_EXT_LOOPB_TEST] = TG3_LOOPBACK_FAILED; - goto done; - } - - err = tg3_reset_hw(tp, true); - if (err) { - data[TG3_MAC_LOOPB_TEST] = TG3_LOOPBACK_FAILED; - data[TG3_PHY_LOOPB_TEST] = TG3_LOOPBACK_FAILED; - if (do_extlpbk) - data[TG3_EXT_LOOPB_TEST] = TG3_LOOPBACK_FAILED; - goto done; - } - - if (tg3_flag(tp, ENABLE_RSS)) { - int i; - - /* Reroute all rx packets to the 1st queue */ - for (i = MAC_RSS_INDIR_TBL_0; - i < MAC_RSS_INDIR_TBL_0 + TG3_RSS_INDIR_TBL_SIZE; i += 4) - tw32(i, 0x0); - } - - /* HW errata - mac loopback fails in some cases on 5780. - * Normal traffic and PHY loopback are not affected by - * errata. Also, the MAC loopback test is deprecated for - * all newer ASIC revisions. - */ - if (tg3_asic_rev(tp) != ASIC_REV_5780 && - !tg3_flag(tp, CPMU_PRESENT)) { - tg3_mac_loopback(tp, true); - - if (tg3_run_loopback(tp, ETH_FRAME_LEN, false)) - data[TG3_MAC_LOOPB_TEST] |= TG3_STD_LOOPBACK_FAILED; - - if (tg3_flag(tp, JUMBO_RING_ENABLE) && - tg3_run_loopback(tp, jmb_pkt_sz + ETH_HLEN, false)) - data[TG3_MAC_LOOPB_TEST] |= TG3_JMB_LOOPBACK_FAILED; - - tg3_mac_loopback(tp, false); - } - - if (!(tp->phy_flags & TG3_PHYFLG_PHY_SERDES) && - !tg3_flag(tp, USE_PHYLIB)) { - int i; - - tg3_phy_lpbk_set(tp, 0, false); - - /* Wait for link */ - for (i = 0; i < 100; i++) { - if (tr32(MAC_TX_STATUS) & TX_STATUS_LINK_UP) - break; - mdelay(1); - } - - if (tg3_run_loopback(tp, ETH_FRAME_LEN, false)) - data[TG3_PHY_LOOPB_TEST] |= TG3_STD_LOOPBACK_FAILED; - if (tg3_flag(tp, TSO_CAPABLE) && - tg3_run_loopback(tp, ETH_FRAME_LEN, true)) - data[TG3_PHY_LOOPB_TEST] |= TG3_TSO_LOOPBACK_FAILED; - if (tg3_flag(tp, JUMBO_RING_ENABLE) && - tg3_run_loopback(tp, jmb_pkt_sz + ETH_HLEN, false)) - data[TG3_PHY_LOOPB_TEST] |= TG3_JMB_LOOPBACK_FAILED; - - if (do_extlpbk) { - tg3_phy_lpbk_set(tp, 0, true); - - /* All link indications report up, but the hardware - * isn't really ready for about 20 msec. Double it - * to be sure. - */ - mdelay(40); - - if (tg3_run_loopback(tp, ETH_FRAME_LEN, false)) - data[TG3_EXT_LOOPB_TEST] |= - TG3_STD_LOOPBACK_FAILED; - if (tg3_flag(tp, TSO_CAPABLE) && - tg3_run_loopback(tp, ETH_FRAME_LEN, true)) - data[TG3_EXT_LOOPB_TEST] |= - TG3_TSO_LOOPBACK_FAILED; - if (tg3_flag(tp, JUMBO_RING_ENABLE) && - tg3_run_loopback(tp, jmb_pkt_sz + ETH_HLEN, false)) - data[TG3_EXT_LOOPB_TEST] |= - TG3_JMB_LOOPBACK_FAILED; - } - - /* Re-enable gphy autopowerdown. */ - if (tp->phy_flags & TG3_PHYFLG_ENABLE_APD) - tg3_phy_toggle_apd(tp, true); - } - - err = (data[TG3_MAC_LOOPB_TEST] | data[TG3_PHY_LOOPB_TEST] | - data[TG3_EXT_LOOPB_TEST]) ? -EIO : 0; - -done: - tp->phy_flags |= eee_cap; - - return err; -} - -static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest, - u64 *data) -{ - struct tg3 *tp = netdev_priv(dev); - bool doextlpbk = etest->flags & ETH_TEST_FL_EXTERNAL_LB; - - if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) { - if (tg3_power_up(tp)) { - etest->flags |= ETH_TEST_FL_FAILED; - memset(data, 1, sizeof(u64) * TG3_NUM_TEST); - return; - } - tg3_ape_driver_state_change(tp, RESET_KIND_INIT); - } - - memset(data, 0, sizeof(u64) * TG3_NUM_TEST); - - if (tg3_test_nvram(tp) != 0) { - etest->flags |= ETH_TEST_FL_FAILED; - data[TG3_NVRAM_TEST] = 1; - } - if (!doextlpbk && tg3_test_link(tp)) { - etest->flags |= ETH_TEST_FL_FAILED; - data[TG3_LINK_TEST] = 1; - } - if (etest->flags & ETH_TEST_FL_OFFLINE) { - int err, err2 = 0, irq_sync = 0; - - if (netif_running(dev)) { - tg3_phy_stop(tp); - tg3_netif_stop(tp); - irq_sync = 1; - } - - tg3_full_lock(tp, irq_sync); - tg3_halt(tp, RESET_KIND_SUSPEND, 1); - err = tg3_nvram_lock(tp); - tg3_halt_cpu(tp, RX_CPU_BASE); - if (!tg3_flag(tp, 5705_PLUS)) - tg3_halt_cpu(tp, TX_CPU_BASE); - if (!err) - tg3_nvram_unlock(tp); - - if (tp->phy_flags & TG3_PHYFLG_MII_SERDES) - tg3_phy_reset(tp); - - if (tg3_test_registers(tp) != 0) { - etest->flags |= ETH_TEST_FL_FAILED; - data[TG3_REGISTER_TEST] = 1; - } - - if (tg3_test_memory(tp) != 0) { - etest->flags |= ETH_TEST_FL_FAILED; - data[TG3_MEMORY_TEST] = 1; - } - - if (doextlpbk) - etest->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE; - - if (tg3_test_loopback(tp, data, doextlpbk)) - etest->flags |= ETH_TEST_FL_FAILED; - - tg3_full_unlock(tp); - - if (tg3_test_interrupt(tp) != 0) { - etest->flags |= ETH_TEST_FL_FAILED; - data[TG3_INTERRUPT_TEST] = 1; - } - - tg3_full_lock(tp, 0); - - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - if (netif_running(dev)) { - tg3_flag_set(tp, INIT_COMPLETE); - err2 = tg3_restart_hw(tp, true); - if (!err2) - tg3_netif_start(tp); - } - - tg3_full_unlock(tp); - - if (irq_sync && !err2) - tg3_phy_start(tp); - } - if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) - tg3_power_down_prepare(tp); - -} - -static int tg3_hwtstamp_set(struct net_device *dev, struct ifreq *ifr) -{ - struct tg3 *tp = netdev_priv(dev); - struct hwtstamp_config stmpconf; - - if (!tg3_flag(tp, PTP_CAPABLE)) - return -EOPNOTSUPP; - - if (copy_from_user(&stmpconf, ifr->ifr_data, sizeof(stmpconf))) - return -EFAULT; - - if (stmpconf.flags) - return -EINVAL; - - if (stmpconf.tx_type != HWTSTAMP_TX_ON && - stmpconf.tx_type != HWTSTAMP_TX_OFF) - return -ERANGE; - - switch (stmpconf.rx_filter) { - case HWTSTAMP_FILTER_NONE: - tp->rxptpctl = 0; - break; - case HWTSTAMP_FILTER_PTP_V1_L4_EVENT: - tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V1_EN | - TG3_RX_PTP_CTL_ALL_V1_EVENTS; - break; - case HWTSTAMP_FILTER_PTP_V1_L4_SYNC: - tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V1_EN | - TG3_RX_PTP_CTL_SYNC_EVNT; - break; - case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ: - tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V1_EN | - TG3_RX_PTP_CTL_DELAY_REQ; - break; - case HWTSTAMP_FILTER_PTP_V2_EVENT: - tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_EN | - TG3_RX_PTP_CTL_ALL_V2_EVENTS; - break; - case HWTSTAMP_FILTER_PTP_V2_L2_EVENT: - tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | - TG3_RX_PTP_CTL_ALL_V2_EVENTS; - break; - case HWTSTAMP_FILTER_PTP_V2_L4_EVENT: - tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | - TG3_RX_PTP_CTL_ALL_V2_EVENTS; - break; - case HWTSTAMP_FILTER_PTP_V2_SYNC: - tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_EN | - TG3_RX_PTP_CTL_SYNC_EVNT; - break; - case HWTSTAMP_FILTER_PTP_V2_L2_SYNC: - tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | - TG3_RX_PTP_CTL_SYNC_EVNT; - break; - case HWTSTAMP_FILTER_PTP_V2_L4_SYNC: - tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | - TG3_RX_PTP_CTL_SYNC_EVNT; - break; - case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ: - tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_EN | - TG3_RX_PTP_CTL_DELAY_REQ; - break; - case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ: - tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | - TG3_RX_PTP_CTL_DELAY_REQ; - break; - case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ: - tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | - TG3_RX_PTP_CTL_DELAY_REQ; - break; - default: - return -ERANGE; - } - - if (netif_running(dev) && tp->rxptpctl) - tw32(TG3_RX_PTP_CTL, - tp->rxptpctl | TG3_RX_PTP_CTL_HWTS_INTERLOCK); - - if (stmpconf.tx_type == HWTSTAMP_TX_ON) - tg3_flag_set(tp, TX_TSTAMP_EN); - else - tg3_flag_clear(tp, TX_TSTAMP_EN); - - return copy_to_user(ifr->ifr_data, &stmpconf, sizeof(stmpconf)) ? - -EFAULT : 0; -} - -static int tg3_hwtstamp_get(struct net_device *dev, struct ifreq *ifr) -{ - struct tg3 *tp = netdev_priv(dev); - struct hwtstamp_config stmpconf; - - if (!tg3_flag(tp, PTP_CAPABLE)) - return -EOPNOTSUPP; - - stmpconf.flags = 0; - stmpconf.tx_type = (tg3_flag(tp, TX_TSTAMP_EN) ? - HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF); - - switch (tp->rxptpctl) { - case 0: - stmpconf.rx_filter = HWTSTAMP_FILTER_NONE; - break; - case TG3_RX_PTP_CTL_RX_PTP_V1_EN | TG3_RX_PTP_CTL_ALL_V1_EVENTS: - stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT; - break; - case TG3_RX_PTP_CTL_RX_PTP_V1_EN | TG3_RX_PTP_CTL_SYNC_EVNT: - stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_SYNC; - break; - case TG3_RX_PTP_CTL_RX_PTP_V1_EN | TG3_RX_PTP_CTL_DELAY_REQ: - stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ; - break; - case TG3_RX_PTP_CTL_RX_PTP_V2_EN | TG3_RX_PTP_CTL_ALL_V2_EVENTS: - stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT; - break; - case TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | TG3_RX_PTP_CTL_ALL_V2_EVENTS: - stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT; - break; - case TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | TG3_RX_PTP_CTL_ALL_V2_EVENTS: - stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_EVENT; - break; - case TG3_RX_PTP_CTL_RX_PTP_V2_EN | TG3_RX_PTP_CTL_SYNC_EVNT: - stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_SYNC; - break; - case TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | TG3_RX_PTP_CTL_SYNC_EVNT: - stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_SYNC; - break; - case TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | TG3_RX_PTP_CTL_SYNC_EVNT: - stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_SYNC; - break; - case TG3_RX_PTP_CTL_RX_PTP_V2_EN | TG3_RX_PTP_CTL_DELAY_REQ: - stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_DELAY_REQ; - break; - case TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | TG3_RX_PTP_CTL_DELAY_REQ: - stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ; - break; - case TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | TG3_RX_PTP_CTL_DELAY_REQ: - stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ; - break; - default: - WARN_ON_ONCE(1); - return -ERANGE; - } - - return copy_to_user(ifr->ifr_data, &stmpconf, sizeof(stmpconf)) ? - -EFAULT : 0; -} - -static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) -{ - struct mii_ioctl_data *data = if_mii(ifr); - struct tg3 *tp = netdev_priv(dev); - int err; - - if (tg3_flag(tp, USE_PHYLIB)) { - struct phy_device *phydev; - if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED)) - return -EAGAIN; - phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); - return phy_mii_ioctl(phydev, ifr, cmd); - } - - switch (cmd) { - case SIOCGMIIPHY: - data->phy_id = tp->phy_addr; - - /* fallthru */ - case SIOCGMIIREG: { - u32 mii_regval; - - if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) - break; /* We have no PHY */ - - if (!netif_running(dev)) - return -EAGAIN; - - spin_lock_bh(&tp->lock); - err = __tg3_readphy(tp, data->phy_id & 0x1f, - data->reg_num & 0x1f, &mii_regval); - spin_unlock_bh(&tp->lock); - - data->val_out = mii_regval; - - return err; - } - - case SIOCSMIIREG: - if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) - break; /* We have no PHY */ - - if (!netif_running(dev)) - return -EAGAIN; - - spin_lock_bh(&tp->lock); - err = __tg3_writephy(tp, data->phy_id & 0x1f, - data->reg_num & 0x1f, data->val_in); - spin_unlock_bh(&tp->lock); - - return err; - - case SIOCSHWTSTAMP: - return tg3_hwtstamp_set(dev, ifr); - - case SIOCGHWTSTAMP: - return tg3_hwtstamp_get(dev, ifr); - - default: - /* do nothing */ - break; - } - return -EOPNOTSUPP; -} - -static int tg3_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec) -{ - struct tg3 *tp = netdev_priv(dev); - - memcpy(ec, &tp->coal, sizeof(*ec)); - return 0; -} - -static int tg3_set_coalesce(struct net_device *dev, struct ethtool_coalesce *ec) -{ - struct tg3 *tp = netdev_priv(dev); - u32 max_rxcoal_tick_int = 0, max_txcoal_tick_int = 0; - u32 max_stat_coal_ticks = 0, min_stat_coal_ticks = 0; - - if (!tg3_flag(tp, 5705_PLUS)) { - max_rxcoal_tick_int = MAX_RXCOAL_TICK_INT; - max_txcoal_tick_int = MAX_TXCOAL_TICK_INT; - max_stat_coal_ticks = MAX_STAT_COAL_TICKS; - min_stat_coal_ticks = MIN_STAT_COAL_TICKS; - } - - if ((ec->rx_coalesce_usecs > MAX_RXCOL_TICKS) || - (!ec->rx_coalesce_usecs) || - (ec->tx_coalesce_usecs > MAX_TXCOL_TICKS) || - (!ec->tx_coalesce_usecs) || - (ec->rx_max_coalesced_frames > MAX_RXMAX_FRAMES) || - (ec->tx_max_coalesced_frames > MAX_TXMAX_FRAMES) || - (ec->rx_coalesce_usecs_irq > max_rxcoal_tick_int) || - (ec->tx_coalesce_usecs_irq > max_txcoal_tick_int) || - (ec->rx_max_coalesced_frames_irq > MAX_RXCOAL_MAXF_INT) || - (ec->tx_max_coalesced_frames_irq > MAX_TXCOAL_MAXF_INT) || - (ec->stats_block_coalesce_usecs > max_stat_coal_ticks) || - (ec->stats_block_coalesce_usecs < min_stat_coal_ticks)) - return -EINVAL; - - /* Only copy relevant parameters, ignore all others. */ - tp->coal.rx_coalesce_usecs = ec->rx_coalesce_usecs; - tp->coal.tx_coalesce_usecs = ec->tx_coalesce_usecs; - tp->coal.rx_max_coalesced_frames = ec->rx_max_coalesced_frames; - tp->coal.tx_max_coalesced_frames = ec->tx_max_coalesced_frames; - tp->coal.rx_coalesce_usecs_irq = ec->rx_coalesce_usecs_irq; - tp->coal.tx_coalesce_usecs_irq = ec->tx_coalesce_usecs_irq; - tp->coal.rx_max_coalesced_frames_irq = ec->rx_max_coalesced_frames_irq; - tp->coal.tx_max_coalesced_frames_irq = ec->tx_max_coalesced_frames_irq; - tp->coal.stats_block_coalesce_usecs = ec->stats_block_coalesce_usecs; - - if (netif_running(dev)) { - tg3_full_lock(tp, 0); - __tg3_set_coalesce(tp, &tp->coal); - tg3_full_unlock(tp); - } - return 0; -} - -static int tg3_set_eee(struct net_device *dev, struct ethtool_eee *edata) -{ - struct tg3 *tp = netdev_priv(dev); - - if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP)) { - netdev_warn(tp->dev, "Board does not support EEE!\n"); - return -EOPNOTSUPP; - } - - if (edata->advertised != tp->eee.advertised) { - netdev_warn(tp->dev, - "Direct manipulation of EEE advertisement is not supported\n"); - return -EINVAL; - } - - if (edata->tx_lpi_timer > TG3_CPMU_DBTMR1_LNKIDLE_MAX) { - netdev_warn(tp->dev, - "Maximal Tx Lpi timer supported is %#x(u)\n", - TG3_CPMU_DBTMR1_LNKIDLE_MAX); - return -EINVAL; - } - - tp->eee = *edata; - - tp->phy_flags |= TG3_PHYFLG_USER_CONFIGURED; - tg3_warn_mgmt_link_flap(tp); - - if (netif_running(tp->dev)) { - tg3_full_lock(tp, 0); - tg3_setup_eee(tp); - tg3_phy_reset(tp); - tg3_full_unlock(tp); - } - - return 0; -} - -static int tg3_get_eee(struct net_device *dev, struct ethtool_eee *edata) -{ - struct tg3 *tp = netdev_priv(dev); - - if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP)) { - netdev_warn(tp->dev, - "Board does not support EEE!\n"); - return -EOPNOTSUPP; - } - - *edata = tp->eee; - return 0; -} - -static const struct ethtool_ops tg3_ethtool_ops = { - .get_drvinfo = tg3_get_drvinfo, - .get_regs_len = tg3_get_regs_len, - .get_regs = tg3_get_regs, - .get_wol = tg3_get_wol, - .set_wol = tg3_set_wol, - .get_msglevel = tg3_get_msglevel, - .set_msglevel = tg3_set_msglevel, - .nway_reset = tg3_nway_reset, - .get_link = ethtool_op_get_link, - .get_eeprom_len = tg3_get_eeprom_len, - .get_eeprom = tg3_get_eeprom, - .set_eeprom = tg3_set_eeprom, - .get_ringparam = tg3_get_ringparam, - .set_ringparam = tg3_set_ringparam, - .get_pauseparam = tg3_get_pauseparam, - .set_pauseparam = tg3_set_pauseparam, - .self_test = tg3_self_test, - .get_strings = tg3_get_strings, - .set_phys_id = tg3_set_phys_id, - .get_ethtool_stats = tg3_get_ethtool_stats, - .get_coalesce = tg3_get_coalesce, - .set_coalesce = tg3_set_coalesce, - .get_sset_count = tg3_get_sset_count, - .get_rxnfc = tg3_get_rxnfc, - .get_rxfh_indir_size = tg3_get_rxfh_indir_size, - .get_rxfh = tg3_get_rxfh, - .set_rxfh = tg3_set_rxfh, - .get_channels = tg3_get_channels, - .set_channels = tg3_set_channels, - .get_ts_info = tg3_get_ts_info, - .get_eee = tg3_get_eee, - .set_eee = tg3_set_eee, - .get_link_ksettings = tg3_get_link_ksettings, - .set_link_ksettings = tg3_set_link_ksettings, -}; - -static void tg3_get_stats64(struct net_device *dev, - struct rtnl_link_stats64 *stats) -{ - struct tg3 *tp = netdev_priv(dev); - - spin_lock_bh(&tp->lock); - if (!tp->hw_stats || !tg3_flag(tp, INIT_COMPLETE)) { - *stats = tp->net_stats_prev; - spin_unlock_bh(&tp->lock); - return; - } - - tg3_get_nstats(tp, stats); - spin_unlock_bh(&tp->lock); -} - -static void tg3_set_rx_mode(struct net_device *dev) -{ - struct tg3 *tp = netdev_priv(dev); - - if (!netif_running(dev)) - return; - - tg3_full_lock(tp, 0); - __tg3_set_rx_mode(dev); - tg3_full_unlock(tp); -} - -static inline void tg3_set_mtu(struct net_device *dev, struct tg3 *tp, - int new_mtu) -{ - dev->mtu = new_mtu; - - if (new_mtu > ETH_DATA_LEN) { - if (tg3_flag(tp, 5780_CLASS)) { - netdev_update_features(dev); - tg3_flag_clear(tp, TSO_CAPABLE); - } else { - tg3_flag_set(tp, JUMBO_RING_ENABLE); - } - } else { - if (tg3_flag(tp, 5780_CLASS)) { - tg3_flag_set(tp, TSO_CAPABLE); - netdev_update_features(dev); - } - tg3_flag_clear(tp, JUMBO_RING_ENABLE); - } -} - -static int tg3_change_mtu(struct net_device *dev, int new_mtu) -{ - struct tg3 *tp = netdev_priv(dev); - int err; - bool reset_phy = false; - - if (!netif_running(dev)) { - /* We'll just catch it later when the - * device is up'd. - */ - tg3_set_mtu(dev, tp, new_mtu); - return 0; - } - - tg3_phy_stop(tp); - - tg3_netif_stop(tp); - - tg3_set_mtu(dev, tp, new_mtu); - - tg3_full_lock(tp, 1); - - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - - /* Reset PHY, otherwise the read DMA engine will be in a mode that - * breaks all requests to 256 bytes. - */ - if (tg3_asic_rev(tp) == ASIC_REV_57766 || - tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720) - reset_phy = true; - - err = tg3_restart_hw(tp, reset_phy); - - if (!err) - tg3_netif_start(tp); - - tg3_full_unlock(tp); - - if (!err) - tg3_phy_start(tp); - - return err; -} - -static const struct net_device_ops tg3_netdev_ops = { - .ndo_open = tg3_open, - .ndo_stop = tg3_close, - .ndo_start_xmit = tg3_start_xmit, - .ndo_get_stats64 = tg3_get_stats64, - .ndo_validate_addr = eth_validate_addr, - .ndo_set_rx_mode = tg3_set_rx_mode, - .ndo_set_mac_address = tg3_set_mac_addr, - .ndo_do_ioctl = tg3_ioctl, - .ndo_tx_timeout = tg3_tx_timeout, - .ndo_change_mtu = tg3_change_mtu, - .ndo_fix_features = tg3_fix_features, - .ndo_set_features = tg3_set_features, -#ifdef CONFIG_NET_POLL_CONTROLLER - .ndo_poll_controller = tg3_poll_controller, -#endif -}; - -static void tg3_get_eeprom_size(struct tg3 *tp) -{ - u32 cursize, val, magic; - - tp->nvram_size = EEPROM_CHIP_SIZE; - - if (tg3_nvram_read(tp, 0, &magic) != 0) - return; - - if ((magic != TG3_EEPROM_MAGIC) && - ((magic & TG3_EEPROM_MAGIC_FW_MSK) != TG3_EEPROM_MAGIC_FW) && - ((magic & TG3_EEPROM_MAGIC_HW_MSK) != TG3_EEPROM_MAGIC_HW)) - return; - - /* - * Size the chip by reading offsets at increasing powers of two. - * When we encounter our validation signature, we know the addressing - * has wrapped around, and thus have our chip size. - */ - cursize = 0x10; - - while (cursize < tp->nvram_size) { - if (tg3_nvram_read(tp, cursize, &val) != 0) - return; - - if (val == magic) - break; - - cursize <<= 1; - } - - tp->nvram_size = cursize; -} - -static void tg3_get_nvram_size(struct tg3 *tp) -{ - u32 val; - - if (tg3_flag(tp, NO_NVRAM) || tg3_nvram_read(tp, 0, &val) != 0) - return; - - /* Selfboot format */ - if (val != TG3_EEPROM_MAGIC) { - tg3_get_eeprom_size(tp); - return; - } - - if (tg3_nvram_read(tp, 0xf0, &val) == 0) { - if (val != 0) { - /* This is confusing. We want to operate on the - * 16-bit value at offset 0xf2. The tg3_nvram_read() - * call will read from NVRAM and byteswap the data - * according to the byteswapping settings for all - * other register accesses. This ensures the data we - * want will always reside in the lower 16-bits. - * However, the data in NVRAM is in LE format, which - * means the data from the NVRAM read will always be - * opposite the endianness of the CPU. The 16-bit - * byteswap then brings the data to CPU endianness. - */ - tp->nvram_size = swab16((u16)(val & 0x0000ffff)) * 1024; - return; - } - } - tp->nvram_size = TG3_NVRAM_SIZE_512KB; -} - -static void tg3_get_nvram_info(struct tg3 *tp) -{ - u32 nvcfg1; - - nvcfg1 = tr32(NVRAM_CFG1); - if (nvcfg1 & NVRAM_CFG1_FLASHIF_ENAB) { - tg3_flag_set(tp, FLASH); - } else { - nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; - tw32(NVRAM_CFG1, nvcfg1); - } - - if (tg3_asic_rev(tp) == ASIC_REV_5750 || - tg3_flag(tp, 5780_CLASS)) { - switch (nvcfg1 & NVRAM_CFG1_VENDOR_MASK) { - case FLASH_VENDOR_ATMEL_FLASH_BUFFERED: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE; - tg3_flag_set(tp, NVRAM_BUFFERED); - break; - case FLASH_VENDOR_ATMEL_FLASH_UNBUFFERED: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->nvram_pagesize = ATMEL_AT25F512_PAGE_SIZE; - break; - case FLASH_VENDOR_ATMEL_EEPROM: - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; - tg3_flag_set(tp, NVRAM_BUFFERED); - break; - case FLASH_VENDOR_ST: - tp->nvram_jedecnum = JEDEC_ST; - tp->nvram_pagesize = ST_M45PEX0_PAGE_SIZE; - tg3_flag_set(tp, NVRAM_BUFFERED); - break; - case FLASH_VENDOR_SAIFUN: - tp->nvram_jedecnum = JEDEC_SAIFUN; - tp->nvram_pagesize = SAIFUN_SA25F0XX_PAGE_SIZE; - break; - case FLASH_VENDOR_SST_SMALL: - case FLASH_VENDOR_SST_LARGE: - tp->nvram_jedecnum = JEDEC_SST; - tp->nvram_pagesize = SST_25VF0X0_PAGE_SIZE; - break; - } - } else { - tp->nvram_jedecnum = JEDEC_ATMEL; - tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE; - tg3_flag_set(tp, NVRAM_BUFFERED); - } -} - -static void tg3_nvram_get_pagesize(struct tg3 *tp, u32 nvmcfg1) -{ - switch (nvmcfg1 & NVRAM_CFG1_5752PAGE_SIZE_MASK) { - case FLASH_5752PAGE_SIZE_256: - tp->nvram_pagesize = 256; - break; - case FLASH_5752PAGE_SIZE_512: - tp->nvram_pagesize = 512; - break; - case FLASH_5752PAGE_SIZE_1K: - tp->nvram_pagesize = 1024; - break; - case FLASH_5752PAGE_SIZE_2K: - tp->nvram_pagesize = 2048; - break; - case FLASH_5752PAGE_SIZE_4K: - tp->nvram_pagesize = 4096; - break; - case FLASH_5752PAGE_SIZE_264: - tp->nvram_pagesize = 264; - break; - case FLASH_5752PAGE_SIZE_528: - tp->nvram_pagesize = 528; - break; - } -} - -static void tg3_get_5752_nvram_info(struct tg3 *tp) -{ - u32 nvcfg1; - - nvcfg1 = tr32(NVRAM_CFG1); - - /* NVRAM protection for TPM */ - if (nvcfg1 & (1 << 27)) - tg3_flag_set(tp, PROTECTED_NVRAM); - - switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { - case FLASH_5752VENDOR_ATMEL_EEPROM_64KHZ: - case FLASH_5752VENDOR_ATMEL_EEPROM_376KHZ: - tp->nvram_jedecnum = JEDEC_ATMEL; - tg3_flag_set(tp, NVRAM_BUFFERED); - break; - case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: - tp->nvram_jedecnum = JEDEC_ATMEL; - tg3_flag_set(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, FLASH); - break; - case FLASH_5752VENDOR_ST_M45PE10: - case FLASH_5752VENDOR_ST_M45PE20: - case FLASH_5752VENDOR_ST_M45PE40: - tp->nvram_jedecnum = JEDEC_ST; - tg3_flag_set(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, FLASH); - break; - } - - if (tg3_flag(tp, FLASH)) { - tg3_nvram_get_pagesize(tp, nvcfg1); - } else { - /* For eeprom, set pagesize to maximum eeprom size */ - tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; - - nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; - tw32(NVRAM_CFG1, nvcfg1); - } -} - -static void tg3_get_5755_nvram_info(struct tg3 *tp) -{ - u32 nvcfg1, protect = 0; - - nvcfg1 = tr32(NVRAM_CFG1); - - /* NVRAM protection for TPM */ - if (nvcfg1 & (1 << 27)) { - tg3_flag_set(tp, PROTECTED_NVRAM); - protect = 1; - } - - nvcfg1 &= NVRAM_CFG1_5752VENDOR_MASK; - switch (nvcfg1) { - case FLASH_5755VENDOR_ATMEL_FLASH_1: - case FLASH_5755VENDOR_ATMEL_FLASH_2: - case FLASH_5755VENDOR_ATMEL_FLASH_3: - case FLASH_5755VENDOR_ATMEL_FLASH_5: - tp->nvram_jedecnum = JEDEC_ATMEL; - tg3_flag_set(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, FLASH); - tp->nvram_pagesize = 264; - if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_1 || - nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_5) - tp->nvram_size = (protect ? 0x3e200 : - TG3_NVRAM_SIZE_512KB); - else if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_2) - tp->nvram_size = (protect ? 0x1f200 : - TG3_NVRAM_SIZE_256KB); - else - tp->nvram_size = (protect ? 0x1f200 : - TG3_NVRAM_SIZE_128KB); - break; - case FLASH_5752VENDOR_ST_M45PE10: - case FLASH_5752VENDOR_ST_M45PE20: - case FLASH_5752VENDOR_ST_M45PE40: - tp->nvram_jedecnum = JEDEC_ST; - tg3_flag_set(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, FLASH); - tp->nvram_pagesize = 256; - if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE10) - tp->nvram_size = (protect ? - TG3_NVRAM_SIZE_64KB : - TG3_NVRAM_SIZE_128KB); - else if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE20) - tp->nvram_size = (protect ? - TG3_NVRAM_SIZE_64KB : - TG3_NVRAM_SIZE_256KB); - else - tp->nvram_size = (protect ? - TG3_NVRAM_SIZE_128KB : - TG3_NVRAM_SIZE_512KB); - break; - } -} - -static void tg3_get_5787_nvram_info(struct tg3 *tp) -{ - u32 nvcfg1; - - nvcfg1 = tr32(NVRAM_CFG1); - - switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { - case FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ: - case FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ: - case FLASH_5787VENDOR_MICRO_EEPROM_64KHZ: - case FLASH_5787VENDOR_MICRO_EEPROM_376KHZ: - tp->nvram_jedecnum = JEDEC_ATMEL; - tg3_flag_set(tp, NVRAM_BUFFERED); - tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; - - nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; - tw32(NVRAM_CFG1, nvcfg1); - break; - case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: - case FLASH_5755VENDOR_ATMEL_FLASH_1: - case FLASH_5755VENDOR_ATMEL_FLASH_2: - case FLASH_5755VENDOR_ATMEL_FLASH_3: - tp->nvram_jedecnum = JEDEC_ATMEL; - tg3_flag_set(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, FLASH); - tp->nvram_pagesize = 264; - break; - case FLASH_5752VENDOR_ST_M45PE10: - case FLASH_5752VENDOR_ST_M45PE20: - case FLASH_5752VENDOR_ST_M45PE40: - tp->nvram_jedecnum = JEDEC_ST; - tg3_flag_set(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, FLASH); - tp->nvram_pagesize = 256; - break; - } -} - -static void tg3_get_5761_nvram_info(struct tg3 *tp) -{ - u32 nvcfg1, protect = 0; - - nvcfg1 = tr32(NVRAM_CFG1); - - /* NVRAM protection for TPM */ - if (nvcfg1 & (1 << 27)) { - tg3_flag_set(tp, PROTECTED_NVRAM); - protect = 1; - } - - nvcfg1 &= NVRAM_CFG1_5752VENDOR_MASK; - switch (nvcfg1) { - case FLASH_5761VENDOR_ATMEL_ADB021D: - case FLASH_5761VENDOR_ATMEL_ADB041D: - case FLASH_5761VENDOR_ATMEL_ADB081D: - case FLASH_5761VENDOR_ATMEL_ADB161D: - case FLASH_5761VENDOR_ATMEL_MDB021D: - case FLASH_5761VENDOR_ATMEL_MDB041D: - case FLASH_5761VENDOR_ATMEL_MDB081D: - case FLASH_5761VENDOR_ATMEL_MDB161D: - tp->nvram_jedecnum = JEDEC_ATMEL; - tg3_flag_set(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, FLASH); - tg3_flag_set(tp, NO_NVRAM_ADDR_TRANS); - tp->nvram_pagesize = 256; - break; - case FLASH_5761VENDOR_ST_A_M45PE20: - case FLASH_5761VENDOR_ST_A_M45PE40: - case FLASH_5761VENDOR_ST_A_M45PE80: - case FLASH_5761VENDOR_ST_A_M45PE16: - case FLASH_5761VENDOR_ST_M_M45PE20: - case FLASH_5761VENDOR_ST_M_M45PE40: - case FLASH_5761VENDOR_ST_M_M45PE80: - case FLASH_5761VENDOR_ST_M_M45PE16: - tp->nvram_jedecnum = JEDEC_ST; - tg3_flag_set(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, FLASH); - tp->nvram_pagesize = 256; - break; - } - - if (protect) { - tp->nvram_size = tr32(NVRAM_ADDR_LOCKOUT); - } else { - switch (nvcfg1) { - case FLASH_5761VENDOR_ATMEL_ADB161D: - case FLASH_5761VENDOR_ATMEL_MDB161D: - case FLASH_5761VENDOR_ST_A_M45PE16: - case FLASH_5761VENDOR_ST_M_M45PE16: - tp->nvram_size = TG3_NVRAM_SIZE_2MB; - break; - case FLASH_5761VENDOR_ATMEL_ADB081D: - case FLASH_5761VENDOR_ATMEL_MDB081D: - case FLASH_5761VENDOR_ST_A_M45PE80: - case FLASH_5761VENDOR_ST_M_M45PE80: - tp->nvram_size = TG3_NVRAM_SIZE_1MB; - break; - case FLASH_5761VENDOR_ATMEL_ADB041D: - case FLASH_5761VENDOR_ATMEL_MDB041D: - case FLASH_5761VENDOR_ST_A_M45PE40: - case FLASH_5761VENDOR_ST_M_M45PE40: - tp->nvram_size = TG3_NVRAM_SIZE_512KB; - break; - case FLASH_5761VENDOR_ATMEL_ADB021D: - case FLASH_5761VENDOR_ATMEL_MDB021D: - case FLASH_5761VENDOR_ST_A_M45PE20: - case FLASH_5761VENDOR_ST_M_M45PE20: - tp->nvram_size = TG3_NVRAM_SIZE_256KB; - break; - } - } -} - -static void tg3_get_5906_nvram_info(struct tg3 *tp) -{ - tp->nvram_jedecnum = JEDEC_ATMEL; - tg3_flag_set(tp, NVRAM_BUFFERED); - tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; -} - -static void tg3_get_57780_nvram_info(struct tg3 *tp) -{ - u32 nvcfg1; - - nvcfg1 = tr32(NVRAM_CFG1); - - switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { - case FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ: - case FLASH_5787VENDOR_MICRO_EEPROM_376KHZ: - tp->nvram_jedecnum = JEDEC_ATMEL; - tg3_flag_set(tp, NVRAM_BUFFERED); - tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; - - nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; - tw32(NVRAM_CFG1, nvcfg1); - return; - case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: - case FLASH_57780VENDOR_ATMEL_AT45DB011D: - case FLASH_57780VENDOR_ATMEL_AT45DB011B: - case FLASH_57780VENDOR_ATMEL_AT45DB021D: - case FLASH_57780VENDOR_ATMEL_AT45DB021B: - case FLASH_57780VENDOR_ATMEL_AT45DB041D: - case FLASH_57780VENDOR_ATMEL_AT45DB041B: - tp->nvram_jedecnum = JEDEC_ATMEL; - tg3_flag_set(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, FLASH); - - switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { - case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED: - case FLASH_57780VENDOR_ATMEL_AT45DB011D: - case FLASH_57780VENDOR_ATMEL_AT45DB011B: - tp->nvram_size = TG3_NVRAM_SIZE_128KB; - break; - case FLASH_57780VENDOR_ATMEL_AT45DB021D: - case FLASH_57780VENDOR_ATMEL_AT45DB021B: - tp->nvram_size = TG3_NVRAM_SIZE_256KB; - break; - case FLASH_57780VENDOR_ATMEL_AT45DB041D: - case FLASH_57780VENDOR_ATMEL_AT45DB041B: - tp->nvram_size = TG3_NVRAM_SIZE_512KB; - break; - } - break; - case FLASH_5752VENDOR_ST_M45PE10: - case FLASH_5752VENDOR_ST_M45PE20: - case FLASH_5752VENDOR_ST_M45PE40: - tp->nvram_jedecnum = JEDEC_ST; - tg3_flag_set(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, FLASH); - - switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { - case FLASH_5752VENDOR_ST_M45PE10: - tp->nvram_size = TG3_NVRAM_SIZE_128KB; - break; - case FLASH_5752VENDOR_ST_M45PE20: - tp->nvram_size = TG3_NVRAM_SIZE_256KB; - break; - case FLASH_5752VENDOR_ST_M45PE40: - tp->nvram_size = TG3_NVRAM_SIZE_512KB; - break; - } - break; - default: - tg3_flag_set(tp, NO_NVRAM); - return; - } - - tg3_nvram_get_pagesize(tp, nvcfg1); - if (tp->nvram_pagesize != 264 && tp->nvram_pagesize != 528) - tg3_flag_set(tp, NO_NVRAM_ADDR_TRANS); -} - - -static void tg3_get_5717_nvram_info(struct tg3 *tp) -{ - u32 nvcfg1; - - nvcfg1 = tr32(NVRAM_CFG1); - - switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { - case FLASH_5717VENDOR_ATMEL_EEPROM: - case FLASH_5717VENDOR_MICRO_EEPROM: - tp->nvram_jedecnum = JEDEC_ATMEL; - tg3_flag_set(tp, NVRAM_BUFFERED); - tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; - - nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; - tw32(NVRAM_CFG1, nvcfg1); - return; - case FLASH_5717VENDOR_ATMEL_MDB011D: - case FLASH_5717VENDOR_ATMEL_ADB011B: - case FLASH_5717VENDOR_ATMEL_ADB011D: - case FLASH_5717VENDOR_ATMEL_MDB021D: - case FLASH_5717VENDOR_ATMEL_ADB021B: - case FLASH_5717VENDOR_ATMEL_ADB021D: - case FLASH_5717VENDOR_ATMEL_45USPT: - tp->nvram_jedecnum = JEDEC_ATMEL; - tg3_flag_set(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, FLASH); - - switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { - case FLASH_5717VENDOR_ATMEL_MDB021D: - /* Detect size with tg3_nvram_get_size() */ - break; - case FLASH_5717VENDOR_ATMEL_ADB021B: - case FLASH_5717VENDOR_ATMEL_ADB021D: - tp->nvram_size = TG3_NVRAM_SIZE_256KB; - break; - default: - tp->nvram_size = TG3_NVRAM_SIZE_128KB; - break; - } - break; - case FLASH_5717VENDOR_ST_M_M25PE10: - case FLASH_5717VENDOR_ST_A_M25PE10: - case FLASH_5717VENDOR_ST_M_M45PE10: - case FLASH_5717VENDOR_ST_A_M45PE10: - case FLASH_5717VENDOR_ST_M_M25PE20: - case FLASH_5717VENDOR_ST_A_M25PE20: - case FLASH_5717VENDOR_ST_M_M45PE20: - case FLASH_5717VENDOR_ST_A_M45PE20: - case FLASH_5717VENDOR_ST_25USPT: - case FLASH_5717VENDOR_ST_45USPT: - tp->nvram_jedecnum = JEDEC_ST; - tg3_flag_set(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, FLASH); - - switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) { - case FLASH_5717VENDOR_ST_M_M25PE20: - case FLASH_5717VENDOR_ST_M_M45PE20: - /* Detect size with tg3_nvram_get_size() */ - break; - case FLASH_5717VENDOR_ST_A_M25PE20: - case FLASH_5717VENDOR_ST_A_M45PE20: - tp->nvram_size = TG3_NVRAM_SIZE_256KB; - break; - default: - tp->nvram_size = TG3_NVRAM_SIZE_128KB; - break; - } - break; - default: - tg3_flag_set(tp, NO_NVRAM); - return; - } - - tg3_nvram_get_pagesize(tp, nvcfg1); - if (tp->nvram_pagesize != 264 && tp->nvram_pagesize != 528) - tg3_flag_set(tp, NO_NVRAM_ADDR_TRANS); -} - -static void tg3_get_5720_nvram_info(struct tg3 *tp) -{ - u32 nvcfg1, nvmpinstrp; - - nvcfg1 = tr32(NVRAM_CFG1); - nvmpinstrp = nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK; - - if (tg3_asic_rev(tp) == ASIC_REV_5762) { - if (!(nvcfg1 & NVRAM_CFG1_5762VENDOR_MASK)) { - tg3_flag_set(tp, NO_NVRAM); - return; - } - - switch (nvmpinstrp) { - case FLASH_5762_EEPROM_HD: - nvmpinstrp = FLASH_5720_EEPROM_HD; - break; - case FLASH_5762_EEPROM_LD: - nvmpinstrp = FLASH_5720_EEPROM_LD; - break; - case FLASH_5720VENDOR_M_ST_M45PE20: - /* This pinstrap supports multiple sizes, so force it - * to read the actual size from location 0xf0. - */ - nvmpinstrp = FLASH_5720VENDOR_ST_45USPT; - break; - } - } - - switch (nvmpinstrp) { - case FLASH_5720_EEPROM_HD: - case FLASH_5720_EEPROM_LD: - tp->nvram_jedecnum = JEDEC_ATMEL; - tg3_flag_set(tp, NVRAM_BUFFERED); - - nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS; - tw32(NVRAM_CFG1, nvcfg1); - if (nvmpinstrp == FLASH_5720_EEPROM_HD) - tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; - else - tp->nvram_pagesize = ATMEL_AT24C02_CHIP_SIZE; - return; - case FLASH_5720VENDOR_M_ATMEL_DB011D: - case FLASH_5720VENDOR_A_ATMEL_DB011B: - case FLASH_5720VENDOR_A_ATMEL_DB011D: - case FLASH_5720VENDOR_M_ATMEL_DB021D: - case FLASH_5720VENDOR_A_ATMEL_DB021B: - case FLASH_5720VENDOR_A_ATMEL_DB021D: - case FLASH_5720VENDOR_M_ATMEL_DB041D: - case FLASH_5720VENDOR_A_ATMEL_DB041B: - case FLASH_5720VENDOR_A_ATMEL_DB041D: - case FLASH_5720VENDOR_M_ATMEL_DB081D: - case FLASH_5720VENDOR_A_ATMEL_DB081D: - case FLASH_5720VENDOR_ATMEL_45USPT: - tp->nvram_jedecnum = JEDEC_ATMEL; - tg3_flag_set(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, FLASH); - - switch (nvmpinstrp) { - case FLASH_5720VENDOR_M_ATMEL_DB021D: - case FLASH_5720VENDOR_A_ATMEL_DB021B: - case FLASH_5720VENDOR_A_ATMEL_DB021D: - tp->nvram_size = TG3_NVRAM_SIZE_256KB; - break; - case FLASH_5720VENDOR_M_ATMEL_DB041D: - case FLASH_5720VENDOR_A_ATMEL_DB041B: - case FLASH_5720VENDOR_A_ATMEL_DB041D: - tp->nvram_size = TG3_NVRAM_SIZE_512KB; - break; - case FLASH_5720VENDOR_M_ATMEL_DB081D: - case FLASH_5720VENDOR_A_ATMEL_DB081D: - tp->nvram_size = TG3_NVRAM_SIZE_1MB; - break; - default: - if (tg3_asic_rev(tp) != ASIC_REV_5762) - tp->nvram_size = TG3_NVRAM_SIZE_128KB; - break; - } - break; - case FLASH_5720VENDOR_M_ST_M25PE10: - case FLASH_5720VENDOR_M_ST_M45PE10: - case FLASH_5720VENDOR_A_ST_M25PE10: - case FLASH_5720VENDOR_A_ST_M45PE10: - case FLASH_5720VENDOR_M_ST_M25PE20: - case FLASH_5720VENDOR_M_ST_M45PE20: - case FLASH_5720VENDOR_A_ST_M25PE20: - case FLASH_5720VENDOR_A_ST_M45PE20: - case FLASH_5720VENDOR_M_ST_M25PE40: - case FLASH_5720VENDOR_M_ST_M45PE40: - case FLASH_5720VENDOR_A_ST_M25PE40: - case FLASH_5720VENDOR_A_ST_M45PE40: - case FLASH_5720VENDOR_M_ST_M25PE80: - case FLASH_5720VENDOR_M_ST_M45PE80: - case FLASH_5720VENDOR_A_ST_M25PE80: - case FLASH_5720VENDOR_A_ST_M45PE80: - case FLASH_5720VENDOR_ST_25USPT: - case FLASH_5720VENDOR_ST_45USPT: - tp->nvram_jedecnum = JEDEC_ST; - tg3_flag_set(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, FLASH); - - switch (nvmpinstrp) { - case FLASH_5720VENDOR_M_ST_M25PE20: - case FLASH_5720VENDOR_M_ST_M45PE20: - case FLASH_5720VENDOR_A_ST_M25PE20: - case FLASH_5720VENDOR_A_ST_M45PE20: - tp->nvram_size = TG3_NVRAM_SIZE_256KB; - break; - case FLASH_5720VENDOR_M_ST_M25PE40: - case FLASH_5720VENDOR_M_ST_M45PE40: - case FLASH_5720VENDOR_A_ST_M25PE40: - case FLASH_5720VENDOR_A_ST_M45PE40: - tp->nvram_size = TG3_NVRAM_SIZE_512KB; - break; - case FLASH_5720VENDOR_M_ST_M25PE80: - case FLASH_5720VENDOR_M_ST_M45PE80: - case FLASH_5720VENDOR_A_ST_M25PE80: - case FLASH_5720VENDOR_A_ST_M45PE80: - tp->nvram_size = TG3_NVRAM_SIZE_1MB; - break; - default: - if (tg3_asic_rev(tp) != ASIC_REV_5762) - tp->nvram_size = TG3_NVRAM_SIZE_128KB; - break; - } - break; - default: - tg3_flag_set(tp, NO_NVRAM); - return; - } - - tg3_nvram_get_pagesize(tp, nvcfg1); - if (tp->nvram_pagesize != 264 && tp->nvram_pagesize != 528) - tg3_flag_set(tp, NO_NVRAM_ADDR_TRANS); - - if (tg3_asic_rev(tp) == ASIC_REV_5762) { - u32 val; - - if (tg3_nvram_read(tp, 0, &val)) - return; - - if (val != TG3_EEPROM_MAGIC && - (val & TG3_EEPROM_MAGIC_FW_MSK) != TG3_EEPROM_MAGIC_FW) - tg3_flag_set(tp, NO_NVRAM); - } -} - -/* Chips other than 5700/5701 use the NVRAM for fetching info. */ -static void tg3_nvram_init(struct tg3 *tp) -{ - if (tg3_flag(tp, IS_SSB_CORE)) { - /* No NVRAM and EEPROM on the SSB Broadcom GigE core. */ - tg3_flag_clear(tp, NVRAM); - tg3_flag_clear(tp, NVRAM_BUFFERED); - tg3_flag_set(tp, NO_NVRAM); - return; - } - - tw32_f(GRC_EEPROM_ADDR, - (EEPROM_ADDR_FSM_RESET | - (EEPROM_DEFAULT_CLOCK_PERIOD << - EEPROM_ADDR_CLKPERD_SHIFT))); - - msleep(1); - - /* Enable seeprom accesses. */ - tw32_f(GRC_LOCAL_CTRL, - tr32(GRC_LOCAL_CTRL) | GRC_LCLCTRL_AUTO_SEEPROM); - udelay(100); - - if (tg3_asic_rev(tp) != ASIC_REV_5700 && - tg3_asic_rev(tp) != ASIC_REV_5701) { - tg3_flag_set(tp, NVRAM); - - if (tg3_nvram_lock(tp)) { - netdev_warn(tp->dev, - "Cannot get nvram lock, %s failed\n", - __func__); - return; - } - tg3_enable_nvram_access(tp); - - tp->nvram_size = 0; - - if (tg3_asic_rev(tp) == ASIC_REV_5752) - tg3_get_5752_nvram_info(tp); - else if (tg3_asic_rev(tp) == ASIC_REV_5755) - tg3_get_5755_nvram_info(tp); - else if (tg3_asic_rev(tp) == ASIC_REV_5787 || - tg3_asic_rev(tp) == ASIC_REV_5784 || - tg3_asic_rev(tp) == ASIC_REV_5785) - tg3_get_5787_nvram_info(tp); - else if (tg3_asic_rev(tp) == ASIC_REV_5761) - tg3_get_5761_nvram_info(tp); - else if (tg3_asic_rev(tp) == ASIC_REV_5906) - tg3_get_5906_nvram_info(tp); - else if (tg3_asic_rev(tp) == ASIC_REV_57780 || - tg3_flag(tp, 57765_CLASS)) - tg3_get_57780_nvram_info(tp); - else if (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5719) - tg3_get_5717_nvram_info(tp); - else if (tg3_asic_rev(tp) == ASIC_REV_5720 || - tg3_asic_rev(tp) == ASIC_REV_5762) - tg3_get_5720_nvram_info(tp); - else - tg3_get_nvram_info(tp); - - if (tp->nvram_size == 0) - tg3_get_nvram_size(tp); - - tg3_disable_nvram_access(tp); - tg3_nvram_unlock(tp); - - } else { - tg3_flag_clear(tp, NVRAM); - tg3_flag_clear(tp, NVRAM_BUFFERED); - - tg3_get_eeprom_size(tp); - } -} - -struct subsys_tbl_ent { - u16 subsys_vendor, subsys_devid; - u32 phy_id; -}; - -static struct subsys_tbl_ent subsys_id_to_phy_id[] = { - /* Broadcom boards. */ - { TG3PCI_SUBVENDOR_ID_BROADCOM, - TG3PCI_SUBDEVICE_ID_BROADCOM_95700A6, TG3_PHY_ID_BCM5401 }, - { TG3PCI_SUBVENDOR_ID_BROADCOM, - TG3PCI_SUBDEVICE_ID_BROADCOM_95701A5, TG3_PHY_ID_BCM5701 }, - { TG3PCI_SUBVENDOR_ID_BROADCOM, - TG3PCI_SUBDEVICE_ID_BROADCOM_95700T6, TG3_PHY_ID_BCM8002 }, - { TG3PCI_SUBVENDOR_ID_BROADCOM, - TG3PCI_SUBDEVICE_ID_BROADCOM_95700A9, 0 }, - { TG3PCI_SUBVENDOR_ID_BROADCOM, - TG3PCI_SUBDEVICE_ID_BROADCOM_95701T1, TG3_PHY_ID_BCM5701 }, - { TG3PCI_SUBVENDOR_ID_BROADCOM, - TG3PCI_SUBDEVICE_ID_BROADCOM_95701T8, TG3_PHY_ID_BCM5701 }, - { TG3PCI_SUBVENDOR_ID_BROADCOM, - TG3PCI_SUBDEVICE_ID_BROADCOM_95701A7, 0 }, - { TG3PCI_SUBVENDOR_ID_BROADCOM, - TG3PCI_SUBDEVICE_ID_BROADCOM_95701A10, TG3_PHY_ID_BCM5701 }, - { TG3PCI_SUBVENDOR_ID_BROADCOM, - TG3PCI_SUBDEVICE_ID_BROADCOM_95701A12, TG3_PHY_ID_BCM5701 }, - { TG3PCI_SUBVENDOR_ID_BROADCOM, - TG3PCI_SUBDEVICE_ID_BROADCOM_95703AX1, TG3_PHY_ID_BCM5703 }, - { TG3PCI_SUBVENDOR_ID_BROADCOM, - TG3PCI_SUBDEVICE_ID_BROADCOM_95703AX2, TG3_PHY_ID_BCM5703 }, - - /* 3com boards. */ - { TG3PCI_SUBVENDOR_ID_3COM, - TG3PCI_SUBDEVICE_ID_3COM_3C996T, TG3_PHY_ID_BCM5401 }, - { TG3PCI_SUBVENDOR_ID_3COM, - TG3PCI_SUBDEVICE_ID_3COM_3C996BT, TG3_PHY_ID_BCM5701 }, - { TG3PCI_SUBVENDOR_ID_3COM, - TG3PCI_SUBDEVICE_ID_3COM_3C996SX, 0 }, - { TG3PCI_SUBVENDOR_ID_3COM, - TG3PCI_SUBDEVICE_ID_3COM_3C1000T, TG3_PHY_ID_BCM5701 }, - { TG3PCI_SUBVENDOR_ID_3COM, - TG3PCI_SUBDEVICE_ID_3COM_3C940BR01, TG3_PHY_ID_BCM5701 }, - - /* DELL boards. */ - { TG3PCI_SUBVENDOR_ID_DELL, - TG3PCI_SUBDEVICE_ID_DELL_VIPER, TG3_PHY_ID_BCM5401 }, - { TG3PCI_SUBVENDOR_ID_DELL, - TG3PCI_SUBDEVICE_ID_DELL_JAGUAR, TG3_PHY_ID_BCM5401 }, - { TG3PCI_SUBVENDOR_ID_DELL, - TG3PCI_SUBDEVICE_ID_DELL_MERLOT, TG3_PHY_ID_BCM5411 }, - { TG3PCI_SUBVENDOR_ID_DELL, - TG3PCI_SUBDEVICE_ID_DELL_SLIM_MERLOT, TG3_PHY_ID_BCM5411 }, - - /* Compaq boards. */ - { TG3PCI_SUBVENDOR_ID_COMPAQ, - TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE, TG3_PHY_ID_BCM5701 }, - { TG3PCI_SUBVENDOR_ID_COMPAQ, - TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE_2, TG3_PHY_ID_BCM5701 }, - { TG3PCI_SUBVENDOR_ID_COMPAQ, - TG3PCI_SUBDEVICE_ID_COMPAQ_CHANGELING, 0 }, - { TG3PCI_SUBVENDOR_ID_COMPAQ, - TG3PCI_SUBDEVICE_ID_COMPAQ_NC7780, TG3_PHY_ID_BCM5701 }, - { TG3PCI_SUBVENDOR_ID_COMPAQ, - TG3PCI_SUBDEVICE_ID_COMPAQ_NC7780_2, TG3_PHY_ID_BCM5701 }, - - /* IBM boards. */ - { TG3PCI_SUBVENDOR_ID_IBM, - TG3PCI_SUBDEVICE_ID_IBM_5703SAX2, 0 } -}; - -static struct subsys_tbl_ent *tg3_lookup_by_subsys(struct tg3 *tp) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(subsys_id_to_phy_id); i++) { - if ((subsys_id_to_phy_id[i].subsys_vendor == - tp->pdev->subsystem_vendor) && - (subsys_id_to_phy_id[i].subsys_devid == - tp->pdev->subsystem_device)) - return &subsys_id_to_phy_id[i]; - } - return NULL; -} - -static void tg3_get_eeprom_hw_cfg(struct tg3 *tp) -{ - u32 val; - - tp->phy_id = TG3_PHY_ID_INVALID; - tp->led_ctrl = LED_CTRL_MODE_PHY_1; - - /* Assume an onboard device and WOL capable by default. */ - tg3_flag_set(tp, EEPROM_WRITE_PROT); - tg3_flag_set(tp, WOL_CAP); - - if (tg3_asic_rev(tp) == ASIC_REV_5906) { - if (!(tr32(PCIE_TRANSACTION_CFG) & PCIE_TRANS_CFG_LOM)) { - tg3_flag_clear(tp, EEPROM_WRITE_PROT); - tg3_flag_set(tp, IS_NIC); - } - val = tr32(VCPU_CFGSHDW); - if (val & VCPU_CFGSHDW_ASPM_DBNC) - tg3_flag_set(tp, ASPM_WORKAROUND); - if ((val & VCPU_CFGSHDW_WOL_ENABLE) && - (val & VCPU_CFGSHDW_WOL_MAGPKT)) { - tg3_flag_set(tp, WOL_ENABLE); - device_set_wakeup_enable(&tp->pdev->dev, true); - } - goto done; - } - - tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val); - if (val == NIC_SRAM_DATA_SIG_MAGIC) { - u32 nic_cfg, led_cfg; - u32 cfg2 = 0, cfg4 = 0, cfg5 = 0; - u32 nic_phy_id, ver, eeprom_phy_id; - int eeprom_phy_serdes = 0; - - tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg); - tp->nic_sram_data_cfg = nic_cfg; - - tg3_read_mem(tp, NIC_SRAM_DATA_VER, &ver); - ver >>= NIC_SRAM_DATA_VER_SHIFT; - if (tg3_asic_rev(tp) != ASIC_REV_5700 && - tg3_asic_rev(tp) != ASIC_REV_5701 && - tg3_asic_rev(tp) != ASIC_REV_5703 && - (ver > 0) && (ver < 0x100)) - tg3_read_mem(tp, NIC_SRAM_DATA_CFG_2, &cfg2); - - if (tg3_asic_rev(tp) == ASIC_REV_5785) - tg3_read_mem(tp, NIC_SRAM_DATA_CFG_4, &cfg4); - - if (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720) - tg3_read_mem(tp, NIC_SRAM_DATA_CFG_5, &cfg5); - - if ((nic_cfg & NIC_SRAM_DATA_CFG_PHY_TYPE_MASK) == - NIC_SRAM_DATA_CFG_PHY_TYPE_FIBER) - eeprom_phy_serdes = 1; - - tg3_read_mem(tp, NIC_SRAM_DATA_PHY_ID, &nic_phy_id); - if (nic_phy_id != 0) { - u32 id1 = nic_phy_id & NIC_SRAM_DATA_PHY_ID1_MASK; - u32 id2 = nic_phy_id & NIC_SRAM_DATA_PHY_ID2_MASK; - - eeprom_phy_id = (id1 >> 16) << 10; - eeprom_phy_id |= (id2 & 0xfc00) << 16; - eeprom_phy_id |= (id2 & 0x03ff) << 0; - } else - eeprom_phy_id = 0; - - tp->phy_id = eeprom_phy_id; - if (eeprom_phy_serdes) { - if (!tg3_flag(tp, 5705_PLUS)) - tp->phy_flags |= TG3_PHYFLG_PHY_SERDES; - else - tp->phy_flags |= TG3_PHYFLG_MII_SERDES; - } - - if (tg3_flag(tp, 5750_PLUS)) - led_cfg = cfg2 & (NIC_SRAM_DATA_CFG_LED_MODE_MASK | - SHASTA_EXT_LED_MODE_MASK); - else - led_cfg = nic_cfg & NIC_SRAM_DATA_CFG_LED_MODE_MASK; - - switch (led_cfg) { - default: - case NIC_SRAM_DATA_CFG_LED_MODE_PHY_1: - tp->led_ctrl = LED_CTRL_MODE_PHY_1; - break; - - case NIC_SRAM_DATA_CFG_LED_MODE_PHY_2: - tp->led_ctrl = LED_CTRL_MODE_PHY_2; - break; - - case NIC_SRAM_DATA_CFG_LED_MODE_MAC: - tp->led_ctrl = LED_CTRL_MODE_MAC; - - /* Default to PHY_1_MODE if 0 (MAC_MODE) is - * read on some older 5700/5701 bootcode. - */ - if (tg3_asic_rev(tp) == ASIC_REV_5700 || - tg3_asic_rev(tp) == ASIC_REV_5701) - tp->led_ctrl = LED_CTRL_MODE_PHY_1; - - break; - - case SHASTA_EXT_LED_SHARED: - tp->led_ctrl = LED_CTRL_MODE_SHARED; - if (tg3_chip_rev_id(tp) != CHIPREV_ID_5750_A0 && - tg3_chip_rev_id(tp) != CHIPREV_ID_5750_A1) - tp->led_ctrl |= (LED_CTRL_MODE_PHY_1 | - LED_CTRL_MODE_PHY_2); - - if (tg3_flag(tp, 5717_PLUS) || - tg3_asic_rev(tp) == ASIC_REV_5762) - tp->led_ctrl |= LED_CTRL_BLINK_RATE_OVERRIDE | - LED_CTRL_BLINK_RATE_MASK; - - break; - - case SHASTA_EXT_LED_MAC: - tp->led_ctrl = LED_CTRL_MODE_SHASTA_MAC; - break; - - case SHASTA_EXT_LED_COMBO: - tp->led_ctrl = LED_CTRL_MODE_COMBO; - if (tg3_chip_rev_id(tp) != CHIPREV_ID_5750_A0) - tp->led_ctrl |= (LED_CTRL_MODE_PHY_1 | - LED_CTRL_MODE_PHY_2); - break; - - } - - if ((tg3_asic_rev(tp) == ASIC_REV_5700 || - tg3_asic_rev(tp) == ASIC_REV_5701) && - tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL) - tp->led_ctrl = LED_CTRL_MODE_PHY_2; - - if (tg3_chip_rev(tp) == CHIPREV_5784_AX) - tp->led_ctrl = LED_CTRL_MODE_PHY_1; - - if (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP) { - tg3_flag_set(tp, EEPROM_WRITE_PROT); - if ((tp->pdev->subsystem_vendor == - PCI_VENDOR_ID_ARIMA) && - (tp->pdev->subsystem_device == 0x205a || - tp->pdev->subsystem_device == 0x2063)) - tg3_flag_clear(tp, EEPROM_WRITE_PROT); - } else { - tg3_flag_clear(tp, EEPROM_WRITE_PROT); - tg3_flag_set(tp, IS_NIC); - } - - if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) { - tg3_flag_set(tp, ENABLE_ASF); - if (tg3_flag(tp, 5750_PLUS)) - tg3_flag_set(tp, ASF_NEW_HANDSHAKE); - } - - if ((nic_cfg & NIC_SRAM_DATA_CFG_APE_ENABLE) && - tg3_flag(tp, 5750_PLUS)) - tg3_flag_set(tp, ENABLE_APE); - - if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES && - !(nic_cfg & NIC_SRAM_DATA_CFG_FIBER_WOL)) - tg3_flag_clear(tp, WOL_CAP); - - if (tg3_flag(tp, WOL_CAP) && - (nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)) { - tg3_flag_set(tp, WOL_ENABLE); - device_set_wakeup_enable(&tp->pdev->dev, true); - } - - if (cfg2 & (1 << 17)) - tp->phy_flags |= TG3_PHYFLG_CAPACITIVE_COUPLING; - - /* serdes signal pre-emphasis in register 0x590 set by */ - /* bootcode if bit 18 is set */ - if (cfg2 & (1 << 18)) - tp->phy_flags |= TG3_PHYFLG_SERDES_PREEMPHASIS; - - if ((tg3_flag(tp, 57765_PLUS) || - (tg3_asic_rev(tp) == ASIC_REV_5784 && - tg3_chip_rev(tp) != CHIPREV_5784_AX)) && - (cfg2 & NIC_SRAM_DATA_CFG_2_APD_EN)) - tp->phy_flags |= TG3_PHYFLG_ENABLE_APD; - - if (tg3_flag(tp, PCI_EXPRESS)) { - u32 cfg3; - - tg3_read_mem(tp, NIC_SRAM_DATA_CFG_3, &cfg3); - if (tg3_asic_rev(tp) != ASIC_REV_5785 && - !tg3_flag(tp, 57765_PLUS) && - (cfg3 & NIC_SRAM_ASPM_DEBOUNCE)) - tg3_flag_set(tp, ASPM_WORKAROUND); - if (cfg3 & NIC_SRAM_LNK_FLAP_AVOID) - tp->phy_flags |= TG3_PHYFLG_KEEP_LINK_ON_PWRDN; - if (cfg3 & NIC_SRAM_1G_ON_VAUX_OK) - tp->phy_flags |= TG3_PHYFLG_1G_ON_VAUX_OK; - } - - if (cfg4 & NIC_SRAM_RGMII_INBAND_DISABLE) - tg3_flag_set(tp, RGMII_INBAND_DISABLE); - if (cfg4 & NIC_SRAM_RGMII_EXT_IBND_RX_EN) - tg3_flag_set(tp, RGMII_EXT_IBND_RX_EN); - if (cfg4 & NIC_SRAM_RGMII_EXT_IBND_TX_EN) - tg3_flag_set(tp, RGMII_EXT_IBND_TX_EN); - - if (cfg5 & NIC_SRAM_DISABLE_1G_HALF_ADV) - tp->phy_flags |= TG3_PHYFLG_DISABLE_1G_HD_ADV; - } -done: - if (tg3_flag(tp, WOL_CAP)) - device_set_wakeup_enable(&tp->pdev->dev, - tg3_flag(tp, WOL_ENABLE)); - else - device_set_wakeup_capable(&tp->pdev->dev, false); -} - -static int tg3_ape_otp_read(struct tg3 *tp, u32 offset, u32 *val) -{ - int i, err; - u32 val2, off = offset * 8; - - err = tg3_nvram_lock(tp); - if (err) - return err; - - tg3_ape_write32(tp, TG3_APE_OTP_ADDR, off | APE_OTP_ADDR_CPU_ENABLE); - tg3_ape_write32(tp, TG3_APE_OTP_CTRL, APE_OTP_CTRL_PROG_EN | - APE_OTP_CTRL_CMD_RD | APE_OTP_CTRL_START); - tg3_ape_read32(tp, TG3_APE_OTP_CTRL); - udelay(10); - - for (i = 0; i < 100; i++) { - val2 = tg3_ape_read32(tp, TG3_APE_OTP_STATUS); - if (val2 & APE_OTP_STATUS_CMD_DONE) { - *val = tg3_ape_read32(tp, TG3_APE_OTP_RD_DATA); - break; - } - udelay(10); - } - - tg3_ape_write32(tp, TG3_APE_OTP_CTRL, 0); - - tg3_nvram_unlock(tp); - if (val2 & APE_OTP_STATUS_CMD_DONE) - return 0; - - return -EBUSY; -} - -static int tg3_issue_otp_command(struct tg3 *tp, u32 cmd) -{ - int i; - u32 val; - - tw32(OTP_CTRL, cmd | OTP_CTRL_OTP_CMD_START); - tw32(OTP_CTRL, cmd); - - /* Wait for up to 1 ms for command to execute. */ - for (i = 0; i < 100; i++) { - val = tr32(OTP_STATUS); - if (val & OTP_STATUS_CMD_DONE) - break; - udelay(10); - } - - return (val & OTP_STATUS_CMD_DONE) ? 0 : -EBUSY; -} - -/* Read the gphy configuration from the OTP region of the chip. The gphy - * configuration is a 32-bit value that straddles the alignment boundary. - * We do two 32-bit reads and then shift and merge the results. - */ -static u32 tg3_read_otp_phycfg(struct tg3 *tp) -{ - u32 bhalf_otp, thalf_otp; - - tw32(OTP_MODE, OTP_MODE_OTP_THRU_GRC); - - if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_INIT)) - return 0; - - tw32(OTP_ADDRESS, OTP_ADDRESS_MAGIC1); - - if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_READ)) - return 0; - - thalf_otp = tr32(OTP_READ_DATA); - - tw32(OTP_ADDRESS, OTP_ADDRESS_MAGIC2); - - if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_READ)) - return 0; - - bhalf_otp = tr32(OTP_READ_DATA); - - return ((thalf_otp & 0x0000ffff) << 16) | (bhalf_otp >> 16); -} - -static void tg3_phy_init_link_config(struct tg3 *tp) -{ - u32 adv = ADVERTISED_Autoneg; - - if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) { - if (!(tp->phy_flags & TG3_PHYFLG_DISABLE_1G_HD_ADV)) - adv |= ADVERTISED_1000baseT_Half; - adv |= ADVERTISED_1000baseT_Full; - } - - if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) - adv |= ADVERTISED_100baseT_Half | - ADVERTISED_100baseT_Full | - ADVERTISED_10baseT_Half | - ADVERTISED_10baseT_Full | - ADVERTISED_TP; - else - adv |= ADVERTISED_FIBRE; - - tp->link_config.advertising = adv; - tp->link_config.speed = SPEED_UNKNOWN; - tp->link_config.duplex = DUPLEX_UNKNOWN; - tp->link_config.autoneg = AUTONEG_ENABLE; - tp->link_config.active_speed = SPEED_UNKNOWN; - tp->link_config.active_duplex = DUPLEX_UNKNOWN; - - tp->old_link = -1; -} - -static int tg3_phy_probe(struct tg3 *tp) -{ - u32 hw_phy_id_1, hw_phy_id_2; - u32 hw_phy_id, hw_phy_id_masked; - int err; - - /* flow control autonegotiation is default behavior */ - tg3_flag_set(tp, PAUSE_AUTONEG); - tp->link_config.flowctrl = FLOW_CTRL_TX | FLOW_CTRL_RX; - - if (tg3_flag(tp, ENABLE_APE)) { - switch (tp->pci_fn) { - case 0: - tp->phy_ape_lock = TG3_APE_LOCK_PHY0; - break; - case 1: - tp->phy_ape_lock = TG3_APE_LOCK_PHY1; - break; - case 2: - tp->phy_ape_lock = TG3_APE_LOCK_PHY2; - break; - case 3: - tp->phy_ape_lock = TG3_APE_LOCK_PHY3; - break; - } - } - - if (!tg3_flag(tp, ENABLE_ASF) && - !(tp->phy_flags & TG3_PHYFLG_ANY_SERDES) && - !(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) - tp->phy_flags &= ~(TG3_PHYFLG_1G_ON_VAUX_OK | - TG3_PHYFLG_KEEP_LINK_ON_PWRDN); - - if (tg3_flag(tp, USE_PHYLIB)) - return tg3_phy_init(tp); - - /* Reading the PHY ID register can conflict with ASF - * firmware access to the PHY hardware. - */ - err = 0; - if (tg3_flag(tp, ENABLE_ASF) || tg3_flag(tp, ENABLE_APE)) { - hw_phy_id = hw_phy_id_masked = TG3_PHY_ID_INVALID; - } else { - /* Now read the physical PHY_ID from the chip and verify - * that it is sane. If it doesn't look good, we fall back - * to either the hard-coded table based PHY_ID and failing - * that the value found in the eeprom area. - */ - err |= tg3_readphy(tp, MII_PHYSID1, &hw_phy_id_1); - err |= tg3_readphy(tp, MII_PHYSID2, &hw_phy_id_2); - - hw_phy_id = (hw_phy_id_1 & 0xffff) << 10; - hw_phy_id |= (hw_phy_id_2 & 0xfc00) << 16; - hw_phy_id |= (hw_phy_id_2 & 0x03ff) << 0; - - hw_phy_id_masked = hw_phy_id & TG3_PHY_ID_MASK; - } - - if (!err && TG3_KNOWN_PHY_ID(hw_phy_id_masked)) { - tp->phy_id = hw_phy_id; - if (hw_phy_id_masked == TG3_PHY_ID_BCM8002) - tp->phy_flags |= TG3_PHYFLG_PHY_SERDES; - else - tp->phy_flags &= ~TG3_PHYFLG_PHY_SERDES; - } else { - if (tp->phy_id != TG3_PHY_ID_INVALID) { - /* Do nothing, phy ID already set up in - * tg3_get_eeprom_hw_cfg(). - */ - } else { - struct subsys_tbl_ent *p; - - /* No eeprom signature? Try the hardcoded - * subsys device table. - */ - p = tg3_lookup_by_subsys(tp); - if (p) { - tp->phy_id = p->phy_id; - } else if (!tg3_flag(tp, IS_SSB_CORE)) { - /* For now we saw the IDs 0xbc050cd0, - * 0xbc050f80 and 0xbc050c30 on devices - * connected to an BCM4785 and there are - * probably more. Just assume that the phy is - * supported when it is connected to a SSB core - * for now. - */ - return -ENODEV; - } - - if (!tp->phy_id || - tp->phy_id == TG3_PHY_ID_BCM8002) - tp->phy_flags |= TG3_PHYFLG_PHY_SERDES; - } - } - - if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES) && - (tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720 || - tg3_asic_rev(tp) == ASIC_REV_57766 || - tg3_asic_rev(tp) == ASIC_REV_5762 || - (tg3_asic_rev(tp) == ASIC_REV_5717 && - tg3_chip_rev_id(tp) != CHIPREV_ID_5717_A0) || - (tg3_asic_rev(tp) == ASIC_REV_57765 && - tg3_chip_rev_id(tp) != CHIPREV_ID_57765_A0))) { - tp->phy_flags |= TG3_PHYFLG_EEE_CAP; - - tp->eee.supported = SUPPORTED_100baseT_Full | - SUPPORTED_1000baseT_Full; - tp->eee.advertised = ADVERTISED_100baseT_Full | - ADVERTISED_1000baseT_Full; - tp->eee.eee_enabled = 1; - tp->eee.tx_lpi_enabled = 1; - tp->eee.tx_lpi_timer = TG3_CPMU_DBTMR1_LNKIDLE_2047US; - } - - tg3_phy_init_link_config(tp); - - if (!(tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN) && - !(tp->phy_flags & TG3_PHYFLG_ANY_SERDES) && - !tg3_flag(tp, ENABLE_APE) && - !tg3_flag(tp, ENABLE_ASF)) { - u32 bmsr, dummy; - - tg3_readphy(tp, MII_BMSR, &bmsr); - if (!tg3_readphy(tp, MII_BMSR, &bmsr) && - (bmsr & BMSR_LSTATUS)) - goto skip_phy_reset; - - err = tg3_phy_reset(tp); - if (err) - return err; - - tg3_phy_set_wirespeed(tp); - - if (!tg3_phy_copper_an_config_ok(tp, &dummy)) { - tg3_phy_autoneg_cfg(tp, tp->link_config.advertising, - tp->link_config.flowctrl); - - tg3_writephy(tp, MII_BMCR, - BMCR_ANENABLE | BMCR_ANRESTART); - } - } - -skip_phy_reset: - if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) { - err = tg3_init_5401phy_dsp(tp); - if (err) - return err; - - err = tg3_init_5401phy_dsp(tp); - } - - return err; -} - -static void tg3_read_vpd(struct tg3 *tp) -{ - u8 *vpd_data; - unsigned int block_end, rosize, len; - u32 vpdlen; - int j, i = 0; - - vpd_data = (u8 *)tg3_vpd_readblock(tp, &vpdlen); - if (!vpd_data) - goto out_no_vpd; - - i = pci_vpd_find_tag(vpd_data, 0, vpdlen, PCI_VPD_LRDT_RO_DATA); - if (i < 0) - goto out_not_found; - - rosize = pci_vpd_lrdt_size(&vpd_data[i]); - block_end = i + PCI_VPD_LRDT_TAG_SIZE + rosize; - i += PCI_VPD_LRDT_TAG_SIZE; - - if (block_end > vpdlen) - goto out_not_found; - - j = pci_vpd_find_info_keyword(vpd_data, i, rosize, - PCI_VPD_RO_KEYWORD_MFR_ID); - if (j > 0) { - len = pci_vpd_info_field_size(&vpd_data[j]); - - j += PCI_VPD_INFO_FLD_HDR_SIZE; - if (j + len > block_end || len != 4 || - memcmp(&vpd_data[j], "1028", 4)) - goto partno; - - j = pci_vpd_find_info_keyword(vpd_data, i, rosize, - PCI_VPD_RO_KEYWORD_VENDOR0); - if (j < 0) - goto partno; - - len = pci_vpd_info_field_size(&vpd_data[j]); - - j += PCI_VPD_INFO_FLD_HDR_SIZE; - if (j + len > block_end) - goto partno; - - if (len >= sizeof(tp->fw_ver)) - len = sizeof(tp->fw_ver) - 1; - memset(tp->fw_ver, 0, sizeof(tp->fw_ver)); - snprintf(tp->fw_ver, sizeof(tp->fw_ver), "%.*s bc ", len, - &vpd_data[j]); - } - -partno: - i = pci_vpd_find_info_keyword(vpd_data, i, rosize, - PCI_VPD_RO_KEYWORD_PARTNO); - if (i < 0) - goto out_not_found; - - len = pci_vpd_info_field_size(&vpd_data[i]); - - i += PCI_VPD_INFO_FLD_HDR_SIZE; - if (len > TG3_BPN_SIZE || - (len + i) > vpdlen) - goto out_not_found; - - memcpy(tp->board_part_number, &vpd_data[i], len); - -out_not_found: - kfree(vpd_data); - if (tp->board_part_number[0]) - return; - -out_no_vpd: - if (tg3_asic_rev(tp) == ASIC_REV_5717) { - if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717_C) - strcpy(tp->board_part_number, "BCM5717"); - else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718) - strcpy(tp->board_part_number, "BCM5718"); - else - goto nomatch; - } else if (tg3_asic_rev(tp) == ASIC_REV_57780) { - if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57780) - strcpy(tp->board_part_number, "BCM57780"); - else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57760) - strcpy(tp->board_part_number, "BCM57760"); - else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57790) - strcpy(tp->board_part_number, "BCM57790"); - else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57788) - strcpy(tp->board_part_number, "BCM57788"); - else - goto nomatch; - } else if (tg3_asic_rev(tp) == ASIC_REV_57765) { - if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57761) - strcpy(tp->board_part_number, "BCM57761"); - else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57765) - strcpy(tp->board_part_number, "BCM57765"); - else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57781) - strcpy(tp->board_part_number, "BCM57781"); - else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57785) - strcpy(tp->board_part_number, "BCM57785"); - else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57791) - strcpy(tp->board_part_number, "BCM57791"); - else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57795) - strcpy(tp->board_part_number, "BCM57795"); - else - goto nomatch; - } else if (tg3_asic_rev(tp) == ASIC_REV_57766) { - if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57762) - strcpy(tp->board_part_number, "BCM57762"); - else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57766) - strcpy(tp->board_part_number, "BCM57766"); - else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57782) - strcpy(tp->board_part_number, "BCM57782"); - else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57786) - strcpy(tp->board_part_number, "BCM57786"); - else - goto nomatch; - } else if (tg3_asic_rev(tp) == ASIC_REV_5906) { - strcpy(tp->board_part_number, "BCM95906"); - } else { -nomatch: - strcpy(tp->board_part_number, "none"); - } -} - -static int tg3_fw_img_is_valid(struct tg3 *tp, u32 offset) -{ - u32 val; - - if (tg3_nvram_read(tp, offset, &val) || - (val & 0xfc000000) != 0x0c000000 || - tg3_nvram_read(tp, offset + 4, &val) || - val != 0) - return 0; - - return 1; -} - -static void tg3_read_bc_ver(struct tg3 *tp) -{ - u32 val, offset, start, ver_offset; - int i, dst_off; - bool newver = false; - - if (tg3_nvram_read(tp, 0xc, &offset) || - tg3_nvram_read(tp, 0x4, &start)) - return; - - offset = tg3_nvram_logical_addr(tp, offset); - - if (tg3_nvram_read(tp, offset, &val)) - return; - - if ((val & 0xfc000000) == 0x0c000000) { - if (tg3_nvram_read(tp, offset + 4, &val)) - return; - - if (val == 0) - newver = true; - } - - dst_off = strlen(tp->fw_ver); - - if (newver) { - if (TG3_VER_SIZE - dst_off < 16 || - tg3_nvram_read(tp, offset + 8, &ver_offset)) - return; - - offset = offset + ver_offset - start; - for (i = 0; i < 16; i += 4) { - __be32 v; - if (tg3_nvram_read_be32(tp, offset + i, &v)) - return; - - memcpy(tp->fw_ver + dst_off + i, &v, sizeof(v)); - } - } else { - u32 major, minor; - - if (tg3_nvram_read(tp, TG3_NVM_PTREV_BCVER, &ver_offset)) - return; - - major = (ver_offset & TG3_NVM_BCVER_MAJMSK) >> - TG3_NVM_BCVER_MAJSFT; - minor = ver_offset & TG3_NVM_BCVER_MINMSK; - snprintf(&tp->fw_ver[dst_off], TG3_VER_SIZE - dst_off, - "v%d.%02d", major, minor); - } -} - -static void tg3_read_hwsb_ver(struct tg3 *tp) -{ - u32 val, major, minor; - - /* Use native endian representation */ - if (tg3_nvram_read(tp, TG3_NVM_HWSB_CFG1, &val)) - return; - - major = (val & TG3_NVM_HWSB_CFG1_MAJMSK) >> - TG3_NVM_HWSB_CFG1_MAJSFT; - minor = (val & TG3_NVM_HWSB_CFG1_MINMSK) >> - TG3_NVM_HWSB_CFG1_MINSFT; - - snprintf(&tp->fw_ver[0], 32, "sb v%d.%02d", major, minor); -} - -static void tg3_read_sb_ver(struct tg3 *tp, u32 val) -{ - u32 offset, major, minor, build; - - strncat(tp->fw_ver, "sb", TG3_VER_SIZE - strlen(tp->fw_ver) - 1); - - if ((val & TG3_EEPROM_SB_FORMAT_MASK) != TG3_EEPROM_SB_FORMAT_1) - return; - - switch (val & TG3_EEPROM_SB_REVISION_MASK) { - case TG3_EEPROM_SB_REVISION_0: - offset = TG3_EEPROM_SB_F1R0_EDH_OFF; - break; - case TG3_EEPROM_SB_REVISION_2: - offset = TG3_EEPROM_SB_F1R2_EDH_OFF; - break; - case TG3_EEPROM_SB_REVISION_3: - offset = TG3_EEPROM_SB_F1R3_EDH_OFF; - break; - case TG3_EEPROM_SB_REVISION_4: - offset = TG3_EEPROM_SB_F1R4_EDH_OFF; - break; - case TG3_EEPROM_SB_REVISION_5: - offset = TG3_EEPROM_SB_F1R5_EDH_OFF; - break; - case TG3_EEPROM_SB_REVISION_6: - offset = TG3_EEPROM_SB_F1R6_EDH_OFF; - break; - default: - return; - } - - if (tg3_nvram_read(tp, offset, &val)) - return; - - build = (val & TG3_EEPROM_SB_EDH_BLD_MASK) >> - TG3_EEPROM_SB_EDH_BLD_SHFT; - major = (val & TG3_EEPROM_SB_EDH_MAJ_MASK) >> - TG3_EEPROM_SB_EDH_MAJ_SHFT; - minor = val & TG3_EEPROM_SB_EDH_MIN_MASK; - - if (minor > 99 || build > 26) - return; - - offset = strlen(tp->fw_ver); - snprintf(&tp->fw_ver[offset], TG3_VER_SIZE - offset, - " v%d.%02d", major, minor); - - if (build > 0) { - offset = strlen(tp->fw_ver); - if (offset < TG3_VER_SIZE - 1) - tp->fw_ver[offset] = 'a' + build - 1; - } -} - -static void tg3_read_mgmtfw_ver(struct tg3 *tp) -{ - u32 val, offset, start; - int i, vlen; - - for (offset = TG3_NVM_DIR_START; - offset < TG3_NVM_DIR_END; - offset += TG3_NVM_DIRENT_SIZE) { - if (tg3_nvram_read(tp, offset, &val)) - return; - - if ((val >> TG3_NVM_DIRTYPE_SHIFT) == TG3_NVM_DIRTYPE_ASFINI) - break; - } - - if (offset == TG3_NVM_DIR_END) - return; - - if (!tg3_flag(tp, 5705_PLUS)) - start = 0x08000000; - else if (tg3_nvram_read(tp, offset - 4, &start)) - return; - - if (tg3_nvram_read(tp, offset + 4, &offset) || - !tg3_fw_img_is_valid(tp, offset) || - tg3_nvram_read(tp, offset + 8, &val)) - return; - - offset += val - start; - - vlen = strlen(tp->fw_ver); - - tp->fw_ver[vlen++] = ','; - tp->fw_ver[vlen++] = ' '; - - for (i = 0; i < 4; i++) { - __be32 v; - if (tg3_nvram_read_be32(tp, offset, &v)) - return; - - offset += sizeof(v); - - if (vlen > TG3_VER_SIZE - sizeof(v)) { - memcpy(&tp->fw_ver[vlen], &v, TG3_VER_SIZE - vlen); - break; - } - - memcpy(&tp->fw_ver[vlen], &v, sizeof(v)); - vlen += sizeof(v); - } -} - -static void tg3_probe_ncsi(struct tg3 *tp) -{ - u32 apedata; - - apedata = tg3_ape_read32(tp, TG3_APE_SEG_SIG); - if (apedata != APE_SEG_SIG_MAGIC) - return; - - apedata = tg3_ape_read32(tp, TG3_APE_FW_STATUS); - if (!(apedata & APE_FW_STATUS_READY)) - return; - - if (tg3_ape_read32(tp, TG3_APE_FW_FEATURES) & TG3_APE_FW_FEATURE_NCSI) - tg3_flag_set(tp, APE_HAS_NCSI); -} - -static void tg3_read_dash_ver(struct tg3 *tp) -{ - int vlen; - u32 apedata; - char *fwtype; - - apedata = tg3_ape_read32(tp, TG3_APE_FW_VERSION); - - if (tg3_flag(tp, APE_HAS_NCSI)) - fwtype = "NCSI"; - else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5725) - fwtype = "SMASH"; - else - fwtype = "DASH"; - - vlen = strlen(tp->fw_ver); - - snprintf(&tp->fw_ver[vlen], TG3_VER_SIZE - vlen, " %s v%d.%d.%d.%d", - fwtype, - (apedata & APE_FW_VERSION_MAJMSK) >> APE_FW_VERSION_MAJSFT, - (apedata & APE_FW_VERSION_MINMSK) >> APE_FW_VERSION_MINSFT, - (apedata & APE_FW_VERSION_REVMSK) >> APE_FW_VERSION_REVSFT, - (apedata & APE_FW_VERSION_BLDMSK)); -} - -static void tg3_read_otp_ver(struct tg3 *tp) -{ - u32 val, val2; - - if (tg3_asic_rev(tp) != ASIC_REV_5762) - return; - - if (!tg3_ape_otp_read(tp, OTP_ADDRESS_MAGIC0, &val) && - !tg3_ape_otp_read(tp, OTP_ADDRESS_MAGIC0 + 4, &val2) && - TG3_OTP_MAGIC0_VALID(val)) { - u64 val64 = (u64) val << 32 | val2; - u32 ver = 0; - int i, vlen; - - for (i = 0; i < 7; i++) { - if ((val64 & 0xff) == 0) - break; - ver = val64 & 0xff; - val64 >>= 8; - } - vlen = strlen(tp->fw_ver); - snprintf(&tp->fw_ver[vlen], TG3_VER_SIZE - vlen, " .%02d", ver); - } -} - -static void tg3_read_fw_ver(struct tg3 *tp) -{ - u32 val; - bool vpd_vers = false; - - if (tp->fw_ver[0] != 0) - vpd_vers = true; - - if (tg3_flag(tp, NO_NVRAM)) { - strcat(tp->fw_ver, "sb"); - tg3_read_otp_ver(tp); - return; - } - - if (tg3_nvram_read(tp, 0, &val)) - return; - - if (val == TG3_EEPROM_MAGIC) - tg3_read_bc_ver(tp); - else if ((val & TG3_EEPROM_MAGIC_FW_MSK) == TG3_EEPROM_MAGIC_FW) - tg3_read_sb_ver(tp, val); - else if ((val & TG3_EEPROM_MAGIC_HW_MSK) == TG3_EEPROM_MAGIC_HW) - tg3_read_hwsb_ver(tp); - - if (tg3_flag(tp, ENABLE_ASF)) { - if (tg3_flag(tp, ENABLE_APE)) { - tg3_probe_ncsi(tp); - if (!vpd_vers) - tg3_read_dash_ver(tp); - } else if (!vpd_vers) { - tg3_read_mgmtfw_ver(tp); - } - } - - tp->fw_ver[TG3_VER_SIZE - 1] = 0; -} - -static inline u32 tg3_rx_ret_ring_size(struct tg3 *tp) -{ - if (tg3_flag(tp, LRG_PROD_RING_CAP)) - return TG3_RX_RET_MAX_SIZE_5717; - else if (tg3_flag(tp, JUMBO_CAPABLE) && !tg3_flag(tp, 5780_CLASS)) - return TG3_RX_RET_MAX_SIZE_5700; - else - return TG3_RX_RET_MAX_SIZE_5705; -} - -static const struct pci_device_id tg3_write_reorder_chipsets[] = { - { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_FE_GATE_700C) }, - { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE) }, - { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8385_0) }, - { }, -}; - -static struct pci_dev *tg3_find_peer(struct tg3 *tp) -{ - struct pci_dev *peer; - unsigned int func, devnr = tp->pdev->devfn & ~7; - - for (func = 0; func < 8; func++) { - peer = pci_get_slot(tp->pdev->bus, devnr | func); - if (peer && peer != tp->pdev) - break; - pci_dev_put(peer); - } - /* 5704 can be configured in single-port mode, set peer to - * tp->pdev in that case. - */ - if (!peer) { - peer = tp->pdev; - return peer; - } - - /* - * We don't need to keep the refcount elevated; there's no way - * to remove one half of this device without removing the other - */ - pci_dev_put(peer); - - return peer; -} - -static void tg3_detect_asic_rev(struct tg3 *tp, u32 misc_ctrl_reg) -{ - tp->pci_chip_rev_id = misc_ctrl_reg >> MISC_HOST_CTRL_CHIPREV_SHIFT; - if (tg3_asic_rev(tp) == ASIC_REV_USE_PROD_ID_REG) { - u32 reg; - - /* All devices that use the alternate - * ASIC REV location have a CPMU. - */ - tg3_flag_set(tp, CPMU_PRESENT); - - if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717_C || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5719 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5720 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57767 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57764 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5762 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5725 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5727 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57787) - reg = TG3PCI_GEN2_PRODID_ASICREV; - else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57781 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57785 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57761 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57765 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57791 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57795 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57762 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57766 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57782 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57786) - reg = TG3PCI_GEN15_PRODID_ASICREV; - else - reg = TG3PCI_PRODID_ASICREV; - - pci_read_config_dword(tp->pdev, reg, &tp->pci_chip_rev_id); - } - - /* Wrong chip ID in 5752 A0. This code can be removed later - * as A0 is not in production. - */ - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5752_A0_HW) - tp->pci_chip_rev_id = CHIPREV_ID_5752_A0; - - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5717_C0) - tp->pci_chip_rev_id = CHIPREV_ID_5720_A0; - - if (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720) - tg3_flag_set(tp, 5717_PLUS); - - if (tg3_asic_rev(tp) == ASIC_REV_57765 || - tg3_asic_rev(tp) == ASIC_REV_57766) - tg3_flag_set(tp, 57765_CLASS); - - if (tg3_flag(tp, 57765_CLASS) || tg3_flag(tp, 5717_PLUS) || - tg3_asic_rev(tp) == ASIC_REV_5762) - tg3_flag_set(tp, 57765_PLUS); - - /* Intentionally exclude ASIC_REV_5906 */ - if (tg3_asic_rev(tp) == ASIC_REV_5755 || - tg3_asic_rev(tp) == ASIC_REV_5787 || - tg3_asic_rev(tp) == ASIC_REV_5784 || - tg3_asic_rev(tp) == ASIC_REV_5761 || - tg3_asic_rev(tp) == ASIC_REV_5785 || - tg3_asic_rev(tp) == ASIC_REV_57780 || - tg3_flag(tp, 57765_PLUS)) - tg3_flag_set(tp, 5755_PLUS); - - if (tg3_asic_rev(tp) == ASIC_REV_5780 || - tg3_asic_rev(tp) == ASIC_REV_5714) - tg3_flag_set(tp, 5780_CLASS); - - if (tg3_asic_rev(tp) == ASIC_REV_5750 || - tg3_asic_rev(tp) == ASIC_REV_5752 || - tg3_asic_rev(tp) == ASIC_REV_5906 || - tg3_flag(tp, 5755_PLUS) || - tg3_flag(tp, 5780_CLASS)) - tg3_flag_set(tp, 5750_PLUS); - - if (tg3_asic_rev(tp) == ASIC_REV_5705 || - tg3_flag(tp, 5750_PLUS)) - tg3_flag_set(tp, 5705_PLUS); -} - -static bool tg3_10_100_only_device(struct tg3 *tp, - const struct pci_device_id *ent) -{ - u32 grc_misc_cfg = tr32(GRC_MISC_CFG) & GRC_MISC_CFG_BOARD_ID_MASK; - - if ((tg3_asic_rev(tp) == ASIC_REV_5703 && - (grc_misc_cfg == 0x8000 || grc_misc_cfg == 0x4000)) || - (tp->phy_flags & TG3_PHYFLG_IS_FET)) - return true; - - if (ent->driver_data & TG3_DRV_DATA_FLAG_10_100_ONLY) { - if (tg3_asic_rev(tp) == ASIC_REV_5705) { - if (ent->driver_data & TG3_DRV_DATA_FLAG_5705_10_100) - return true; - } else { - return true; - } - } - - return false; -} - -static int tg3_get_invariants(struct tg3 *tp, const struct pci_device_id *ent) -{ - u32 misc_ctrl_reg; - u32 pci_state_reg, grc_misc_cfg; - u32 val; - u16 pci_cmd; - int err; - - /* Force memory write invalidate off. If we leave it on, - * then on 5700_BX chips we have to enable a workaround. - * The workaround is to set the TG3PCI_DMA_RW_CTRL boundary - * to match the cacheline size. The Broadcom driver have this - * workaround but turns MWI off all the times so never uses - * it. This seems to suggest that the workaround is insufficient. - */ - pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd); - pci_cmd &= ~PCI_COMMAND_INVALIDATE; - pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd); - - /* Important! -- Make sure register accesses are byteswapped - * correctly. Also, for those chips that require it, make - * sure that indirect register accesses are enabled before - * the first operation. - */ - pci_read_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL, - &misc_ctrl_reg); - tp->misc_host_ctrl |= (misc_ctrl_reg & - MISC_HOST_CTRL_CHIPREV); - pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL, - tp->misc_host_ctrl); - - tg3_detect_asic_rev(tp, misc_ctrl_reg); - - /* If we have 5702/03 A1 or A2 on certain ICH chipsets, - * we need to disable memory and use config. cycles - * only to access all registers. The 5702/03 chips - * can mistakenly decode the special cycles from the - * ICH chipsets as memory write cycles, causing corruption - * of register and memory space. Only certain ICH bridges - * will drive special cycles with non-zero data during the - * address phase which can fall within the 5703's address - * range. This is not an ICH bug as the PCI spec allows - * non-zero address during special cycles. However, only - * these ICH bridges are known to drive non-zero addresses - * during special cycles. - * - * Since special cycles do not cross PCI bridges, we only - * enable this workaround if the 5703 is on the secondary - * bus of these ICH bridges. - */ - if ((tg3_chip_rev_id(tp) == CHIPREV_ID_5703_A1) || - (tg3_chip_rev_id(tp) == CHIPREV_ID_5703_A2)) { - static struct tg3_dev_id { - u32 vendor; - u32 device; - u32 rev; - } ich_chipsets[] = { - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_8, - PCI_ANY_ID }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_8, - PCI_ANY_ID }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_11, - 0xa }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_6, - PCI_ANY_ID }, - { }, - }; - struct tg3_dev_id *pci_id = &ich_chipsets[0]; - struct pci_dev *bridge = NULL; - - while (pci_id->vendor != 0) { - bridge = pci_get_device(pci_id->vendor, pci_id->device, - bridge); - if (!bridge) { - pci_id++; - continue; - } - if (pci_id->rev != PCI_ANY_ID) { - if (bridge->revision > pci_id->rev) - continue; - } - if (bridge->subordinate && - (bridge->subordinate->number == - tp->pdev->bus->number)) { - tg3_flag_set(tp, ICH_WORKAROUND); - pci_dev_put(bridge); - break; - } - } - } - - if (tg3_asic_rev(tp) == ASIC_REV_5701) { - static struct tg3_dev_id { - u32 vendor; - u32 device; - } bridge_chipsets[] = { - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_0 }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_1 }, - { }, - }; - struct tg3_dev_id *pci_id = &bridge_chipsets[0]; - struct pci_dev *bridge = NULL; - - while (pci_id->vendor != 0) { - bridge = pci_get_device(pci_id->vendor, - pci_id->device, - bridge); - if (!bridge) { - pci_id++; - continue; - } - if (bridge->subordinate && - (bridge->subordinate->number <= - tp->pdev->bus->number) && - (bridge->subordinate->busn_res.end >= - tp->pdev->bus->number)) { - tg3_flag_set(tp, 5701_DMA_BUG); - pci_dev_put(bridge); - break; - } - } - } - - /* The EPB bridge inside 5714, 5715, and 5780 cannot support - * DMA addresses > 40-bit. This bridge may have other additional - * 57xx devices behind it in some 4-port NIC designs for example. - * Any tg3 device found behind the bridge will also need the 40-bit - * DMA workaround. - */ - if (tg3_flag(tp, 5780_CLASS)) { - tg3_flag_set(tp, 40BIT_DMA_BUG); - tp->msi_cap = tp->pdev->msi_cap; - } else { - struct pci_dev *bridge = NULL; - - do { - bridge = pci_get_device(PCI_VENDOR_ID_SERVERWORKS, - PCI_DEVICE_ID_SERVERWORKS_EPB, - bridge); - if (bridge && bridge->subordinate && - (bridge->subordinate->number <= - tp->pdev->bus->number) && - (bridge->subordinate->busn_res.end >= - tp->pdev->bus->number)) { - tg3_flag_set(tp, 40BIT_DMA_BUG); - pci_dev_put(bridge); - break; - } - } while (bridge); - } - - if (tg3_asic_rev(tp) == ASIC_REV_5704 || - tg3_asic_rev(tp) == ASIC_REV_5714) - tp->pdev_peer = tg3_find_peer(tp); - - /* Determine TSO capabilities */ - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5719_A0) - ; /* Do nothing. HW bug. */ - else if (tg3_flag(tp, 57765_PLUS)) - tg3_flag_set(tp, HW_TSO_3); - else if (tg3_flag(tp, 5755_PLUS) || - tg3_asic_rev(tp) == ASIC_REV_5906) - tg3_flag_set(tp, HW_TSO_2); - else if (tg3_flag(tp, 5750_PLUS)) { - tg3_flag_set(tp, HW_TSO_1); - tg3_flag_set(tp, TSO_BUG); - if (tg3_asic_rev(tp) == ASIC_REV_5750 && - tg3_chip_rev_id(tp) >= CHIPREV_ID_5750_C2) - tg3_flag_clear(tp, TSO_BUG); - } else if (tg3_asic_rev(tp) != ASIC_REV_5700 && - tg3_asic_rev(tp) != ASIC_REV_5701 && - tg3_chip_rev_id(tp) != CHIPREV_ID_5705_A0) { - tg3_flag_set(tp, FW_TSO); - tg3_flag_set(tp, TSO_BUG); - if (tg3_asic_rev(tp) == ASIC_REV_5705) - tp->fw_needed = FIRMWARE_TG3TSO5; - else - tp->fw_needed = FIRMWARE_TG3TSO; - } - - /* Selectively allow TSO based on operating conditions */ - if (tg3_flag(tp, HW_TSO_1) || - tg3_flag(tp, HW_TSO_2) || - tg3_flag(tp, HW_TSO_3) || - tg3_flag(tp, FW_TSO)) { - /* For firmware TSO, assume ASF is disabled. - * We'll disable TSO later if we discover ASF - * is enabled in tg3_get_eeprom_hw_cfg(). - */ - tg3_flag_set(tp, TSO_CAPABLE); - } else { - tg3_flag_clear(tp, TSO_CAPABLE); - tg3_flag_clear(tp, TSO_BUG); - tp->fw_needed = NULL; - } - - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0) - tp->fw_needed = FIRMWARE_TG3; - - if (tg3_asic_rev(tp) == ASIC_REV_57766) - tp->fw_needed = FIRMWARE_TG357766; - - tp->irq_max = 1; - - if (tg3_flag(tp, 5750_PLUS)) { - tg3_flag_set(tp, SUPPORT_MSI); - if (tg3_chip_rev(tp) == CHIPREV_5750_AX || - tg3_chip_rev(tp) == CHIPREV_5750_BX || - (tg3_asic_rev(tp) == ASIC_REV_5714 && - tg3_chip_rev_id(tp) <= CHIPREV_ID_5714_A2 && - tp->pdev_peer == tp->pdev)) - tg3_flag_clear(tp, SUPPORT_MSI); - - if (tg3_flag(tp, 5755_PLUS) || - tg3_asic_rev(tp) == ASIC_REV_5906) { - tg3_flag_set(tp, 1SHOT_MSI); - } - - if (tg3_flag(tp, 57765_PLUS)) { - tg3_flag_set(tp, SUPPORT_MSIX); - tp->irq_max = TG3_IRQ_MAX_VECS; - } - } - - tp->txq_max = 1; - tp->rxq_max = 1; - if (tp->irq_max > 1) { - tp->rxq_max = TG3_RSS_MAX_NUM_QS; - tg3_rss_init_dflt_indir_tbl(tp, TG3_RSS_MAX_NUM_QS); - - if (tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720) - tp->txq_max = tp->irq_max - 1; - } - - if (tg3_flag(tp, 5755_PLUS) || - tg3_asic_rev(tp) == ASIC_REV_5906) - tg3_flag_set(tp, SHORT_DMA_BUG); - - if (tg3_asic_rev(tp) == ASIC_REV_5719) - tp->dma_limit = TG3_TX_BD_DMA_MAX_4K; - - if (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720 || - tg3_asic_rev(tp) == ASIC_REV_5762) - tg3_flag_set(tp, LRG_PROD_RING_CAP); - - if (tg3_flag(tp, 57765_PLUS) && - tg3_chip_rev_id(tp) != CHIPREV_ID_5719_A0) - tg3_flag_set(tp, USE_JUMBO_BDFLAG); - - if (!tg3_flag(tp, 5705_PLUS) || - tg3_flag(tp, 5780_CLASS) || - tg3_flag(tp, USE_JUMBO_BDFLAG)) - tg3_flag_set(tp, JUMBO_CAPABLE); - - pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE, - &pci_state_reg); - - if (pci_is_pcie(tp->pdev)) { - u16 lnkctl; - - tg3_flag_set(tp, PCI_EXPRESS); - - pcie_capability_read_word(tp->pdev, PCI_EXP_LNKCTL, &lnkctl); - if (lnkctl & PCI_EXP_LNKCTL_CLKREQ_EN) { - if (tg3_asic_rev(tp) == ASIC_REV_5906) { - tg3_flag_clear(tp, HW_TSO_2); - tg3_flag_clear(tp, TSO_CAPABLE); - } - if (tg3_asic_rev(tp) == ASIC_REV_5784 || - tg3_asic_rev(tp) == ASIC_REV_5761 || - tg3_chip_rev_id(tp) == CHIPREV_ID_57780_A0 || - tg3_chip_rev_id(tp) == CHIPREV_ID_57780_A1) - tg3_flag_set(tp, CLKREQ_BUG); - } else if (tg3_chip_rev_id(tp) == CHIPREV_ID_5717_A0) { - tg3_flag_set(tp, L1PLLPD_EN); - } - } else if (tg3_asic_rev(tp) == ASIC_REV_5785) { - /* BCM5785 devices are effectively PCIe devices, and should - * follow PCIe codepaths, but do not have a PCIe capabilities - * section. - */ - tg3_flag_set(tp, PCI_EXPRESS); - } else if (!tg3_flag(tp, 5705_PLUS) || - tg3_flag(tp, 5780_CLASS)) { - tp->pcix_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_PCIX); - if (!tp->pcix_cap) { - dev_err(&tp->pdev->dev, - "Cannot find PCI-X capability, aborting\n"); - return -EIO; - } - - if (!(pci_state_reg & PCISTATE_CONV_PCI_MODE)) - tg3_flag_set(tp, PCIX_MODE); - } - - /* If we have an AMD 762 or VIA K8T800 chipset, write - * reordering to the mailbox registers done by the host - * controller can cause major troubles. We read back from - * every mailbox register write to force the writes to be - * posted to the chip in order. - */ - if (pci_dev_present(tg3_write_reorder_chipsets) && - !tg3_flag(tp, PCI_EXPRESS)) - tg3_flag_set(tp, MBOX_WRITE_REORDER); - - pci_read_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, - &tp->pci_cacheline_sz); - pci_read_config_byte(tp->pdev, PCI_LATENCY_TIMER, - &tp->pci_lat_timer); - if (tg3_asic_rev(tp) == ASIC_REV_5703 && - tp->pci_lat_timer < 64) { - tp->pci_lat_timer = 64; - pci_write_config_byte(tp->pdev, PCI_LATENCY_TIMER, - tp->pci_lat_timer); - } - - /* Important! -- It is critical that the PCI-X hw workaround - * situation is decided before the first MMIO register access. - */ - if (tg3_chip_rev(tp) == CHIPREV_5700_BX) { - /* 5700 BX chips need to have their TX producer index - * mailboxes written twice to workaround a bug. - */ - tg3_flag_set(tp, TXD_MBOX_HWBUG); - - /* If we are in PCI-X mode, enable register write workaround. - * - * The workaround is to use indirect register accesses - * for all chip writes not to mailbox registers. - */ - if (tg3_flag(tp, PCIX_MODE)) { - u32 pm_reg; - - tg3_flag_set(tp, PCIX_TARGET_HWBUG); - - /* The chip can have it's power management PCI config - * space registers clobbered due to this bug. - * So explicitly force the chip into D0 here. - */ - pci_read_config_dword(tp->pdev, - tp->pdev->pm_cap + PCI_PM_CTRL, - &pm_reg); - pm_reg &= ~PCI_PM_CTRL_STATE_MASK; - pm_reg |= PCI_PM_CTRL_PME_ENABLE | 0 /* D0 */; - pci_write_config_dword(tp->pdev, - tp->pdev->pm_cap + PCI_PM_CTRL, - pm_reg); - - /* Also, force SERR#/PERR# in PCI command. */ - pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd); - pci_cmd |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR; - pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd); - } - } - - if ((pci_state_reg & PCISTATE_BUS_SPEED_HIGH) != 0) - tg3_flag_set(tp, PCI_HIGH_SPEED); - if ((pci_state_reg & PCISTATE_BUS_32BIT) != 0) - tg3_flag_set(tp, PCI_32BIT); - - /* Chip-specific fixup from Broadcom driver */ - if ((tg3_chip_rev_id(tp) == CHIPREV_ID_5704_A0) && - (!(pci_state_reg & PCISTATE_RETRY_SAME_DMA))) { - pci_state_reg |= PCISTATE_RETRY_SAME_DMA; - pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE, pci_state_reg); - } - - /* Default fast path register access methods */ - tp->read32 = tg3_read32; - tp->write32 = tg3_write32; - tp->read32_mbox = tg3_read32; - tp->write32_mbox = tg3_write32; - tp->write32_tx_mbox = tg3_write32; - tp->write32_rx_mbox = tg3_write32; - - /* Various workaround register access methods */ - if (tg3_flag(tp, PCIX_TARGET_HWBUG)) - tp->write32 = tg3_write_indirect_reg32; - else if (tg3_asic_rev(tp) == ASIC_REV_5701 || - (tg3_flag(tp, PCI_EXPRESS) && - tg3_chip_rev_id(tp) == CHIPREV_ID_5750_A0)) { - /* - * Back to back register writes can cause problems on these - * chips, the workaround is to read back all reg writes - * except those to mailbox regs. - * - * See tg3_write_indirect_reg32(). - */ - tp->write32 = tg3_write_flush_reg32; - } - - if (tg3_flag(tp, TXD_MBOX_HWBUG) || tg3_flag(tp, MBOX_WRITE_REORDER)) { - tp->write32_tx_mbox = tg3_write32_tx_mbox; - if (tg3_flag(tp, MBOX_WRITE_REORDER)) - tp->write32_rx_mbox = tg3_write_flush_reg32; - } - - if (tg3_flag(tp, ICH_WORKAROUND)) { - tp->read32 = tg3_read_indirect_reg32; - tp->write32 = tg3_write_indirect_reg32; - tp->read32_mbox = tg3_read_indirect_mbox; - tp->write32_mbox = tg3_write_indirect_mbox; - tp->write32_tx_mbox = tg3_write_indirect_mbox; - tp->write32_rx_mbox = tg3_write_indirect_mbox; - - iounmap(tp->regs); - tp->regs = NULL; - - pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd); - pci_cmd &= ~PCI_COMMAND_MEMORY; - pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd); - } - if (tg3_asic_rev(tp) == ASIC_REV_5906) { - tp->read32_mbox = tg3_read32_mbox_5906; - tp->write32_mbox = tg3_write32_mbox_5906; - tp->write32_tx_mbox = tg3_write32_mbox_5906; - tp->write32_rx_mbox = tg3_write32_mbox_5906; - } - - if (tp->write32 == tg3_write_indirect_reg32 || - (tg3_flag(tp, PCIX_MODE) && - (tg3_asic_rev(tp) == ASIC_REV_5700 || - tg3_asic_rev(tp) == ASIC_REV_5701))) - tg3_flag_set(tp, SRAM_USE_CONFIG); - - /* The memory arbiter has to be enabled in order for SRAM accesses - * to succeed. Normally on powerup the tg3 chip firmware will make - * sure it is enabled, but other entities such as system netboot - * code might disable it. - */ - val = tr32(MEMARB_MODE); - tw32(MEMARB_MODE, val | MEMARB_MODE_ENABLE); - - tp->pci_fn = PCI_FUNC(tp->pdev->devfn) & 3; - if (tg3_asic_rev(tp) == ASIC_REV_5704 || - tg3_flag(tp, 5780_CLASS)) { - if (tg3_flag(tp, PCIX_MODE)) { - pci_read_config_dword(tp->pdev, - tp->pcix_cap + PCI_X_STATUS, - &val); - tp->pci_fn = val & 0x7; - } - } else if (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720) { - tg3_read_mem(tp, NIC_SRAM_CPMU_STATUS, &val); - if ((val & NIC_SRAM_CPMUSTAT_SIG_MSK) != NIC_SRAM_CPMUSTAT_SIG) - val = tr32(TG3_CPMU_STATUS); - - if (tg3_asic_rev(tp) == ASIC_REV_5717) - tp->pci_fn = (val & TG3_CPMU_STATUS_FMSK_5717) ? 1 : 0; - else - tp->pci_fn = (val & TG3_CPMU_STATUS_FMSK_5719) >> - TG3_CPMU_STATUS_FSHFT_5719; - } - - if (tg3_flag(tp, FLUSH_POSTED_WRITES)) { - tp->write32_tx_mbox = tg3_write_flush_reg32; - tp->write32_rx_mbox = tg3_write_flush_reg32; - } - - /* Get eeprom hw config before calling tg3_set_power_state(). - * In particular, the TG3_FLAG_IS_NIC flag must be - * determined before calling tg3_set_power_state() so that - * we know whether or not to switch out of Vaux power. - * When the flag is set, it means that GPIO1 is used for eeprom - * write protect and also implies that it is a LOM where GPIOs - * are not used to switch power. - */ - tg3_get_eeprom_hw_cfg(tp); - - if (tg3_flag(tp, FW_TSO) && tg3_flag(tp, ENABLE_ASF)) { - tg3_flag_clear(tp, TSO_CAPABLE); - tg3_flag_clear(tp, TSO_BUG); - tp->fw_needed = NULL; - } - - if (tg3_flag(tp, ENABLE_APE)) { - /* Allow reads and writes to the - * APE register and memory space. - */ - pci_state_reg |= PCISTATE_ALLOW_APE_CTLSPC_WR | - PCISTATE_ALLOW_APE_SHMEM_WR | - PCISTATE_ALLOW_APE_PSPACE_WR; - pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE, - pci_state_reg); - - tg3_ape_lock_init(tp); - } - - /* Set up tp->grc_local_ctrl before calling - * tg3_pwrsrc_switch_to_vmain(). GPIO1 driven high - * will bring 5700's external PHY out of reset. - * It is also used as eeprom write protect on LOMs. - */ - tp->grc_local_ctrl = GRC_LCLCTRL_INT_ON_ATTN | GRC_LCLCTRL_AUTO_SEEPROM; - if (tg3_asic_rev(tp) == ASIC_REV_5700 || - tg3_flag(tp, EEPROM_WRITE_PROT)) - tp->grc_local_ctrl |= (GRC_LCLCTRL_GPIO_OE1 | - GRC_LCLCTRL_GPIO_OUTPUT1); - /* Unused GPIO3 must be driven as output on 5752 because there - * are no pull-up resistors on unused GPIO pins. - */ - else if (tg3_asic_rev(tp) == ASIC_REV_5752) - tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3; - - if (tg3_asic_rev(tp) == ASIC_REV_5755 || - tg3_asic_rev(tp) == ASIC_REV_57780 || - tg3_flag(tp, 57765_CLASS)) - tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_UART_SEL; - - if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5761S) { - /* Turn off the debug UART. */ - tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_UART_SEL; - if (tg3_flag(tp, IS_NIC)) - /* Keep VMain power. */ - tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE0 | - GRC_LCLCTRL_GPIO_OUTPUT0; - } - - if (tg3_asic_rev(tp) == ASIC_REV_5762) - tp->grc_local_ctrl |= - tr32(GRC_LOCAL_CTRL) & GRC_LCLCTRL_GPIO_UART_SEL; - - /* Switch out of Vaux if it is a NIC */ - tg3_pwrsrc_switch_to_vmain(tp); - - /* Derive initial jumbo mode from MTU assigned in - * ether_setup() via the alloc_etherdev() call - */ - if (tp->dev->mtu > ETH_DATA_LEN && !tg3_flag(tp, 5780_CLASS)) - tg3_flag_set(tp, JUMBO_RING_ENABLE); - - /* Determine WakeOnLan speed to use. */ - if (tg3_asic_rev(tp) == ASIC_REV_5700 || - tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0 || - tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B0 || - tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B2) { - tg3_flag_clear(tp, WOL_SPEED_100MB); - } else { - tg3_flag_set(tp, WOL_SPEED_100MB); - } - - if (tg3_asic_rev(tp) == ASIC_REV_5906) - tp->phy_flags |= TG3_PHYFLG_IS_FET; - - /* A few boards don't want Ethernet@WireSpeed phy feature */ - if (tg3_asic_rev(tp) == ASIC_REV_5700 || - (tg3_asic_rev(tp) == ASIC_REV_5705 && - (tg3_chip_rev_id(tp) != CHIPREV_ID_5705_A0) && - (tg3_chip_rev_id(tp) != CHIPREV_ID_5705_A1)) || - (tp->phy_flags & TG3_PHYFLG_IS_FET) || - (tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) - tp->phy_flags |= TG3_PHYFLG_NO_ETH_WIRE_SPEED; - - if (tg3_chip_rev(tp) == CHIPREV_5703_AX || - tg3_chip_rev(tp) == CHIPREV_5704_AX) - tp->phy_flags |= TG3_PHYFLG_ADC_BUG; - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5704_A0) - tp->phy_flags |= TG3_PHYFLG_5704_A0_BUG; - - if (tg3_flag(tp, 5705_PLUS) && - !(tp->phy_flags & TG3_PHYFLG_IS_FET) && - tg3_asic_rev(tp) != ASIC_REV_5785 && - tg3_asic_rev(tp) != ASIC_REV_57780 && - !tg3_flag(tp, 57765_PLUS)) { - if (tg3_asic_rev(tp) == ASIC_REV_5755 || - tg3_asic_rev(tp) == ASIC_REV_5787 || - tg3_asic_rev(tp) == ASIC_REV_5784 || - tg3_asic_rev(tp) == ASIC_REV_5761) { - if (tp->pdev->device != PCI_DEVICE_ID_TIGON3_5756 && - tp->pdev->device != PCI_DEVICE_ID_TIGON3_5722) - tp->phy_flags |= TG3_PHYFLG_JITTER_BUG; - if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5755M) - tp->phy_flags |= TG3_PHYFLG_ADJUST_TRIM; - } else - tp->phy_flags |= TG3_PHYFLG_BER_BUG; - } - - if (tg3_asic_rev(tp) == ASIC_REV_5784 && - tg3_chip_rev(tp) != CHIPREV_5784_AX) { - tp->phy_otp = tg3_read_otp_phycfg(tp); - if (tp->phy_otp == 0) - tp->phy_otp = TG3_OTP_DEFAULT; - } - - if (tg3_flag(tp, CPMU_PRESENT)) - tp->mi_mode = MAC_MI_MODE_500KHZ_CONST; - else - tp->mi_mode = MAC_MI_MODE_BASE; - - tp->coalesce_mode = 0; - if (tg3_chip_rev(tp) != CHIPREV_5700_AX && - tg3_chip_rev(tp) != CHIPREV_5700_BX) - tp->coalesce_mode |= HOSTCC_MODE_32BYTE; - - /* Set these bits to enable statistics workaround. */ - if (tg3_asic_rev(tp) == ASIC_REV_5717 || - tg3_asic_rev(tp) == ASIC_REV_5762 || - tg3_chip_rev_id(tp) == CHIPREV_ID_5719_A0 || - tg3_chip_rev_id(tp) == CHIPREV_ID_5720_A0) { - tp->coalesce_mode |= HOSTCC_MODE_ATTN; - tp->grc_mode |= GRC_MODE_IRQ_ON_FLOW_ATTN; - } - - if (tg3_asic_rev(tp) == ASIC_REV_5785 || - tg3_asic_rev(tp) == ASIC_REV_57780) - tg3_flag_set(tp, USE_PHYLIB); - - err = tg3_mdio_init(tp); - if (err) - return err; - - /* Initialize data/descriptor byte/word swapping. */ - val = tr32(GRC_MODE); - if (tg3_asic_rev(tp) == ASIC_REV_5720 || - tg3_asic_rev(tp) == ASIC_REV_5762) - val &= (GRC_MODE_BYTE_SWAP_B2HRX_DATA | - GRC_MODE_WORD_SWAP_B2HRX_DATA | - GRC_MODE_B2HRX_ENABLE | - GRC_MODE_HTX2B_ENABLE | - GRC_MODE_HOST_STACKUP); - else - val &= GRC_MODE_HOST_STACKUP; - - tw32(GRC_MODE, val | tp->grc_mode); - - tg3_switch_clocks(tp); - - /* Clear this out for sanity. */ - tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0); - - /* Clear TG3PCI_REG_BASE_ADDR to prevent hangs. */ - tw32(TG3PCI_REG_BASE_ADDR, 0); - - pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE, - &pci_state_reg); - if ((pci_state_reg & PCISTATE_CONV_PCI_MODE) == 0 && - !tg3_flag(tp, PCIX_TARGET_HWBUG)) { - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0 || - tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B0 || - tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B2 || - tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B5) { - void __iomem *sram_base; - - /* Write some dummy words into the SRAM status block - * area, see if it reads back correctly. If the return - * value is bad, force enable the PCIX workaround. - */ - sram_base = tp->regs + NIC_SRAM_WIN_BASE + NIC_SRAM_STATS_BLK; - - writel(0x00000000, sram_base); - writel(0x00000000, sram_base + 4); - writel(0xffffffff, sram_base + 4); - if (readl(sram_base) != 0x00000000) - tg3_flag_set(tp, PCIX_TARGET_HWBUG); - } - } - - udelay(50); - tg3_nvram_init(tp); - - /* If the device has an NVRAM, no need to load patch firmware */ - if (tg3_asic_rev(tp) == ASIC_REV_57766 && - !tg3_flag(tp, NO_NVRAM)) - tp->fw_needed = NULL; - - grc_misc_cfg = tr32(GRC_MISC_CFG); - grc_misc_cfg &= GRC_MISC_CFG_BOARD_ID_MASK; - - if (tg3_asic_rev(tp) == ASIC_REV_5705 && - (grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788 || - grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788M)) - tg3_flag_set(tp, IS_5788); - - if (!tg3_flag(tp, IS_5788) && - tg3_asic_rev(tp) != ASIC_REV_5700) - tg3_flag_set(tp, TAGGED_STATUS); - if (tg3_flag(tp, TAGGED_STATUS)) { - tp->coalesce_mode |= (HOSTCC_MODE_CLRTICK_RXBD | - HOSTCC_MODE_CLRTICK_TXBD); - - tp->misc_host_ctrl |= MISC_HOST_CTRL_TAGGED_STATUS; - pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL, - tp->misc_host_ctrl); - } - - /* Preserve the APE MAC_MODE bits */ - if (tg3_flag(tp, ENABLE_APE)) - tp->mac_mode = MAC_MODE_APE_TX_EN | MAC_MODE_APE_RX_EN; - else - tp->mac_mode = 0; - - if (tg3_10_100_only_device(tp, ent)) - tp->phy_flags |= TG3_PHYFLG_10_100_ONLY; - - err = tg3_phy_probe(tp); - if (err) { - dev_err(&tp->pdev->dev, "phy probe failed, err %d\n", err); - /* ... but do not return immediately ... */ - tg3_mdio_fini(tp); - } - - tg3_read_vpd(tp); - tg3_read_fw_ver(tp); - - if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) { - tp->phy_flags &= ~TG3_PHYFLG_USE_MI_INTERRUPT; - } else { - if (tg3_asic_rev(tp) == ASIC_REV_5700) - tp->phy_flags |= TG3_PHYFLG_USE_MI_INTERRUPT; - else - tp->phy_flags &= ~TG3_PHYFLG_USE_MI_INTERRUPT; - } - - /* 5700 {AX,BX} chips have a broken status block link - * change bit implementation, so we must use the - * status register in those cases. - */ - if (tg3_asic_rev(tp) == ASIC_REV_5700) - tg3_flag_set(tp, USE_LINKCHG_REG); - else - tg3_flag_clear(tp, USE_LINKCHG_REG); - - /* The led_ctrl is set during tg3_phy_probe, here we might - * have to force the link status polling mechanism based - * upon subsystem IDs. - */ - if (tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL && - tg3_asic_rev(tp) == ASIC_REV_5701 && - !(tp->phy_flags & TG3_PHYFLG_PHY_SERDES)) { - tp->phy_flags |= TG3_PHYFLG_USE_MI_INTERRUPT; - tg3_flag_set(tp, USE_LINKCHG_REG); - } - - /* For all SERDES we poll the MAC status register. */ - if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) - tg3_flag_set(tp, POLL_SERDES); - else - tg3_flag_clear(tp, POLL_SERDES); - - if (tg3_flag(tp, ENABLE_APE) && tg3_flag(tp, ENABLE_ASF)) - tg3_flag_set(tp, POLL_CPMU_LINK); - - tp->rx_offset = NET_SKB_PAD + NET_IP_ALIGN; - tp->rx_copy_thresh = TG3_RX_COPY_THRESHOLD; - if (tg3_asic_rev(tp) == ASIC_REV_5701 && - tg3_flag(tp, PCIX_MODE)) { - tp->rx_offset = NET_SKB_PAD; -#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS - tp->rx_copy_thresh = ~(u16)0; -#endif - } - - tp->rx_std_ring_mask = TG3_RX_STD_RING_SIZE(tp) - 1; - tp->rx_jmb_ring_mask = TG3_RX_JMB_RING_SIZE(tp) - 1; - tp->rx_ret_ring_mask = tg3_rx_ret_ring_size(tp) - 1; - - tp->rx_std_max_post = tp->rx_std_ring_mask + 1; - - /* Increment the rx prod index on the rx std ring by at most - * 8 for these chips to workaround hw errata. - */ - if (tg3_asic_rev(tp) == ASIC_REV_5750 || - tg3_asic_rev(tp) == ASIC_REV_5752 || - tg3_asic_rev(tp) == ASIC_REV_5755) - tp->rx_std_max_post = 8; - - if (tg3_flag(tp, ASPM_WORKAROUND)) - tp->pwrmgmt_thresh = tr32(PCIE_PWR_MGMT_THRESH) & - PCIE_PWR_MGMT_L1_THRESH_MSK; - - return err; -} - -#ifdef CONFIG_SPARC -static int tg3_get_macaddr_sparc(struct tg3 *tp) -{ - struct net_device *dev = tp->dev; - struct pci_dev *pdev = tp->pdev; - struct device_node *dp = pci_device_to_OF_node(pdev); - const unsigned char *addr; - int len; - - addr = of_get_property(dp, "local-mac-address", &len); - if (addr && len == ETH_ALEN) { - memcpy(dev->dev_addr, addr, ETH_ALEN); - return 0; - } - return -ENODEV; -} - -static int tg3_get_default_macaddr_sparc(struct tg3 *tp) -{ - struct net_device *dev = tp->dev; - - memcpy(dev->dev_addr, idprom->id_ethaddr, ETH_ALEN); - return 0; -} -#endif - -static int tg3_get_device_address(struct tg3 *tp) -{ - struct net_device *dev = tp->dev; - u32 hi, lo, mac_offset; - int addr_ok = 0; - int err; - -#ifdef CONFIG_SPARC - if (!tg3_get_macaddr_sparc(tp)) - return 0; -#endif - - if (tg3_flag(tp, IS_SSB_CORE)) { - err = ssb_gige_get_macaddr(tp->pdev, &dev->dev_addr[0]); - if (!err && is_valid_ether_addr(&dev->dev_addr[0])) - return 0; - } - - mac_offset = 0x7c; - if (tg3_asic_rev(tp) == ASIC_REV_5704 || - tg3_flag(tp, 5780_CLASS)) { - if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID) - mac_offset = 0xcc; - if (tg3_nvram_lock(tp)) - tw32_f(NVRAM_CMD, NVRAM_CMD_RESET); - else - tg3_nvram_unlock(tp); - } else if (tg3_flag(tp, 5717_PLUS)) { - if (tp->pci_fn & 1) - mac_offset = 0xcc; - if (tp->pci_fn > 1) - mac_offset += 0x18c; - } else if (tg3_asic_rev(tp) == ASIC_REV_5906) - mac_offset = 0x10; - - /* First try to get it from MAC address mailbox. */ - tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_HIGH_MBOX, &hi); - if ((hi >> 16) == 0x484b) { - dev->dev_addr[0] = (hi >> 8) & 0xff; - dev->dev_addr[1] = (hi >> 0) & 0xff; - - tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_LOW_MBOX, &lo); - dev->dev_addr[2] = (lo >> 24) & 0xff; - dev->dev_addr[3] = (lo >> 16) & 0xff; - dev->dev_addr[4] = (lo >> 8) & 0xff; - dev->dev_addr[5] = (lo >> 0) & 0xff; - - /* Some old bootcode may report a 0 MAC address in SRAM */ - addr_ok = is_valid_ether_addr(&dev->dev_addr[0]); - } - if (!addr_ok) { - /* Next, try NVRAM. */ - if (!tg3_flag(tp, NO_NVRAM) && - !tg3_nvram_read_be32(tp, mac_offset + 0, &hi) && - !tg3_nvram_read_be32(tp, mac_offset + 4, &lo)) { - memcpy(&dev->dev_addr[0], ((char *)&hi) + 2, 2); - memcpy(&dev->dev_addr[2], (char *)&lo, sizeof(lo)); - } - /* Finally just fetch it out of the MAC control regs. */ - else { - hi = tr32(MAC_ADDR_0_HIGH); - lo = tr32(MAC_ADDR_0_LOW); - - dev->dev_addr[5] = lo & 0xff; - dev->dev_addr[4] = (lo >> 8) & 0xff; - dev->dev_addr[3] = (lo >> 16) & 0xff; - dev->dev_addr[2] = (lo >> 24) & 0xff; - dev->dev_addr[1] = hi & 0xff; - dev->dev_addr[0] = (hi >> 8) & 0xff; - } - } - - if (!is_valid_ether_addr(&dev->dev_addr[0])) { -#ifdef CONFIG_SPARC - if (!tg3_get_default_macaddr_sparc(tp)) - return 0; -#endif - return -EINVAL; - } - return 0; -} - -#define BOUNDARY_SINGLE_CACHELINE 1 -#define BOUNDARY_MULTI_CACHELINE 2 - -static u32 tg3_calc_dma_bndry(struct tg3 *tp, u32 val) -{ - int cacheline_size; - u8 byte; - int goal; - - pci_read_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, &byte); - if (byte == 0) - cacheline_size = 1024; - else - cacheline_size = (int) byte * 4; - - /* On 5703 and later chips, the boundary bits have no - * effect. - */ - if (tg3_asic_rev(tp) != ASIC_REV_5700 && - tg3_asic_rev(tp) != ASIC_REV_5701 && - !tg3_flag(tp, PCI_EXPRESS)) - goto out; - -#if defined(CONFIG_PPC64) || defined(CONFIG_IA64) || defined(CONFIG_PARISC) - goal = BOUNDARY_MULTI_CACHELINE; -#else -#if defined(CONFIG_SPARC64) || defined(CONFIG_ALPHA) - goal = BOUNDARY_SINGLE_CACHELINE; -#else - goal = 0; -#endif -#endif - - if (tg3_flag(tp, 57765_PLUS)) { - val = goal ? 0 : DMA_RWCTRL_DIS_CACHE_ALIGNMENT; - goto out; - } - - if (!goal) - goto out; - - /* PCI controllers on most RISC systems tend to disconnect - * when a device tries to burst across a cache-line boundary. - * Therefore, letting tg3 do so just wastes PCI bandwidth. - * - * Unfortunately, for PCI-E there are only limited - * write-side controls for this, and thus for reads - * we will still get the disconnects. We'll also waste - * these PCI cycles for both read and write for chips - * other than 5700 and 5701 which do not implement the - * boundary bits. - */ - if (tg3_flag(tp, PCIX_MODE) && !tg3_flag(tp, PCI_EXPRESS)) { - switch (cacheline_size) { - case 16: - case 32: - case 64: - case 128: - if (goal == BOUNDARY_SINGLE_CACHELINE) { - val |= (DMA_RWCTRL_READ_BNDRY_128_PCIX | - DMA_RWCTRL_WRITE_BNDRY_128_PCIX); - } else { - val |= (DMA_RWCTRL_READ_BNDRY_384_PCIX | - DMA_RWCTRL_WRITE_BNDRY_384_PCIX); - } - break; - - case 256: - val |= (DMA_RWCTRL_READ_BNDRY_256_PCIX | - DMA_RWCTRL_WRITE_BNDRY_256_PCIX); - break; - - default: - val |= (DMA_RWCTRL_READ_BNDRY_384_PCIX | - DMA_RWCTRL_WRITE_BNDRY_384_PCIX); - break; - } - } else if (tg3_flag(tp, PCI_EXPRESS)) { - switch (cacheline_size) { - case 16: - case 32: - case 64: - if (goal == BOUNDARY_SINGLE_CACHELINE) { - val &= ~DMA_RWCTRL_WRITE_BNDRY_DISAB_PCIE; - val |= DMA_RWCTRL_WRITE_BNDRY_64_PCIE; - break; - } - /* fallthrough */ - case 128: - default: - val &= ~DMA_RWCTRL_WRITE_BNDRY_DISAB_PCIE; - val |= DMA_RWCTRL_WRITE_BNDRY_128_PCIE; - break; - } - } else { - switch (cacheline_size) { - case 16: - if (goal == BOUNDARY_SINGLE_CACHELINE) { - val |= (DMA_RWCTRL_READ_BNDRY_16 | - DMA_RWCTRL_WRITE_BNDRY_16); - break; - } - /* fallthrough */ - case 32: - if (goal == BOUNDARY_SINGLE_CACHELINE) { - val |= (DMA_RWCTRL_READ_BNDRY_32 | - DMA_RWCTRL_WRITE_BNDRY_32); - break; - } - /* fallthrough */ - case 64: - if (goal == BOUNDARY_SINGLE_CACHELINE) { - val |= (DMA_RWCTRL_READ_BNDRY_64 | - DMA_RWCTRL_WRITE_BNDRY_64); - break; - } - /* fallthrough */ - case 128: - if (goal == BOUNDARY_SINGLE_CACHELINE) { - val |= (DMA_RWCTRL_READ_BNDRY_128 | - DMA_RWCTRL_WRITE_BNDRY_128); - break; - } - /* fallthrough */ - case 256: - val |= (DMA_RWCTRL_READ_BNDRY_256 | - DMA_RWCTRL_WRITE_BNDRY_256); - break; - case 512: - val |= (DMA_RWCTRL_READ_BNDRY_512 | - DMA_RWCTRL_WRITE_BNDRY_512); - break; - case 1024: - default: - val |= (DMA_RWCTRL_READ_BNDRY_1024 | - DMA_RWCTRL_WRITE_BNDRY_1024); - break; - } - } - -out: - return val; -} - -static int tg3_do_test_dma(struct tg3 *tp, u32 *buf, dma_addr_t buf_dma, - int size, bool to_device) -{ - struct tg3_internal_buffer_desc test_desc; - u32 sram_dma_descs; - int i, ret; - - sram_dma_descs = NIC_SRAM_DMA_DESC_POOL_BASE; - - tw32(FTQ_RCVBD_COMP_FIFO_ENQDEQ, 0); - tw32(FTQ_RCVDATA_COMP_FIFO_ENQDEQ, 0); - tw32(RDMAC_STATUS, 0); - tw32(WDMAC_STATUS, 0); - - tw32(BUFMGR_MODE, 0); - tw32(FTQ_RESET, 0); - - test_desc.addr_hi = ((u64) buf_dma) >> 32; - test_desc.addr_lo = buf_dma & 0xffffffff; - test_desc.nic_mbuf = 0x00002100; - test_desc.len = size; - - /* - * HP ZX1 was seeing test failures for 5701 cards running at 33Mhz - * the *second* time the tg3 driver was getting loaded after an - * initial scan. - * - * Broadcom tells me: - * ...the DMA engine is connected to the GRC block and a DMA - * reset may affect the GRC block in some unpredictable way... - * The behavior of resets to individual blocks has not been tested. - * - * Broadcom noted the GRC reset will also reset all sub-components. - */ - if (to_device) { - test_desc.cqid_sqid = (13 << 8) | 2; - - tw32_f(RDMAC_MODE, RDMAC_MODE_ENABLE); - udelay(40); - } else { - test_desc.cqid_sqid = (16 << 8) | 7; - - tw32_f(WDMAC_MODE, WDMAC_MODE_ENABLE); - udelay(40); - } - test_desc.flags = 0x00000005; - - for (i = 0; i < (sizeof(test_desc) / sizeof(u32)); i++) { - u32 val; - - val = *(((u32 *)&test_desc) + i); - pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, - sram_dma_descs + (i * sizeof(u32))); - pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); - } - pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); - - if (to_device) - tw32(FTQ_DMA_HIGH_READ_FIFO_ENQDEQ, sram_dma_descs); - else - tw32(FTQ_DMA_HIGH_WRITE_FIFO_ENQDEQ, sram_dma_descs); - - ret = -ENODEV; - for (i = 0; i < 40; i++) { - u32 val; - - if (to_device) - val = tr32(FTQ_RCVBD_COMP_FIFO_ENQDEQ); - else - val = tr32(FTQ_RCVDATA_COMP_FIFO_ENQDEQ); - if ((val & 0xffff) == sram_dma_descs) { - ret = 0; - break; - } - - udelay(100); - } - - return ret; -} - -#define TEST_BUFFER_SIZE 0x2000 - -static const struct pci_device_id tg3_dma_wait_state_chipsets[] = { - { PCI_DEVICE(PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_PCI15) }, - { }, -}; - -static int tg3_test_dma(struct tg3 *tp) -{ - dma_addr_t buf_dma; - u32 *buf, saved_dma_rwctrl; - int ret = 0; - - buf = dma_alloc_coherent(&tp->pdev->dev, TEST_BUFFER_SIZE, - &buf_dma, GFP_KERNEL); - if (!buf) { - ret = -ENOMEM; - goto out_nofree; - } - - tp->dma_rwctrl = ((0x7 << DMA_RWCTRL_PCI_WRITE_CMD_SHIFT) | - (0x6 << DMA_RWCTRL_PCI_READ_CMD_SHIFT)); - - tp->dma_rwctrl = tg3_calc_dma_bndry(tp, tp->dma_rwctrl); - - if (tg3_flag(tp, 57765_PLUS)) - goto out; - - if (tg3_flag(tp, PCI_EXPRESS)) { - /* DMA read watermark not used on PCIE */ - tp->dma_rwctrl |= 0x00180000; - } else if (!tg3_flag(tp, PCIX_MODE)) { - if (tg3_asic_rev(tp) == ASIC_REV_5705 || - tg3_asic_rev(tp) == ASIC_REV_5750) - tp->dma_rwctrl |= 0x003f0000; - else - tp->dma_rwctrl |= 0x003f000f; - } else { - if (tg3_asic_rev(tp) == ASIC_REV_5703 || - tg3_asic_rev(tp) == ASIC_REV_5704) { - u32 ccval = (tr32(TG3PCI_CLOCK_CTRL) & 0x1f); - u32 read_water = 0x7; - - /* If the 5704 is behind the EPB bridge, we can - * do the less restrictive ONE_DMA workaround for - * better performance. - */ - if (tg3_flag(tp, 40BIT_DMA_BUG) && - tg3_asic_rev(tp) == ASIC_REV_5704) - tp->dma_rwctrl |= 0x8000; - else if (ccval == 0x6 || ccval == 0x7) - tp->dma_rwctrl |= DMA_RWCTRL_ONE_DMA; - - if (tg3_asic_rev(tp) == ASIC_REV_5703) - read_water = 4; - /* Set bit 23 to enable PCIX hw bug fix */ - tp->dma_rwctrl |= - (read_water << DMA_RWCTRL_READ_WATER_SHIFT) | - (0x3 << DMA_RWCTRL_WRITE_WATER_SHIFT) | - (1 << 23); - } else if (tg3_asic_rev(tp) == ASIC_REV_5780) { - /* 5780 always in PCIX mode */ - tp->dma_rwctrl |= 0x00144000; - } else if (tg3_asic_rev(tp) == ASIC_REV_5714) { - /* 5714 always in PCIX mode */ - tp->dma_rwctrl |= 0x00148000; - } else { - tp->dma_rwctrl |= 0x001b000f; - } - } - if (tg3_flag(tp, ONE_DMA_AT_ONCE)) - tp->dma_rwctrl |= DMA_RWCTRL_ONE_DMA; - - if (tg3_asic_rev(tp) == ASIC_REV_5703 || - tg3_asic_rev(tp) == ASIC_REV_5704) - tp->dma_rwctrl &= 0xfffffff0; - - if (tg3_asic_rev(tp) == ASIC_REV_5700 || - tg3_asic_rev(tp) == ASIC_REV_5701) { - /* Remove this if it causes problems for some boards. */ - tp->dma_rwctrl |= DMA_RWCTRL_USE_MEM_READ_MULT; - - /* On 5700/5701 chips, we need to set this bit. - * Otherwise the chip will issue cacheline transactions - * to streamable DMA memory with not all the byte - * enables turned on. This is an error on several - * RISC PCI controllers, in particular sparc64. - * - * On 5703/5704 chips, this bit has been reassigned - * a different meaning. In particular, it is used - * on those chips to enable a PCI-X workaround. - */ - tp->dma_rwctrl |= DMA_RWCTRL_ASSERT_ALL_BE; - } - - tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl); - - - if (tg3_asic_rev(tp) != ASIC_REV_5700 && - tg3_asic_rev(tp) != ASIC_REV_5701) - goto out; - - /* It is best to perform DMA test with maximum write burst size - * to expose the 5700/5701 write DMA bug. - */ - saved_dma_rwctrl = tp->dma_rwctrl; - tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK; - tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl); - - while (1) { - u32 *p = buf, i; - - for (i = 0; i < TEST_BUFFER_SIZE / sizeof(u32); i++) - p[i] = i; - - /* Send the buffer to the chip. */ - ret = tg3_do_test_dma(tp, buf, buf_dma, TEST_BUFFER_SIZE, true); - if (ret) { - dev_err(&tp->pdev->dev, - "%s: Buffer write failed. err = %d\n", - __func__, ret); - break; - } - - /* Now read it back. */ - ret = tg3_do_test_dma(tp, buf, buf_dma, TEST_BUFFER_SIZE, false); - if (ret) { - dev_err(&tp->pdev->dev, "%s: Buffer read failed. " - "err = %d\n", __func__, ret); - break; - } - - /* Verify it. */ - for (i = 0; i < TEST_BUFFER_SIZE / sizeof(u32); i++) { - if (p[i] == i) - continue; - - if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) != - DMA_RWCTRL_WRITE_BNDRY_16) { - tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK; - tp->dma_rwctrl |= DMA_RWCTRL_WRITE_BNDRY_16; - tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl); - break; - } else { - dev_err(&tp->pdev->dev, - "%s: Buffer corrupted on read back! " - "(%d != %d)\n", __func__, p[i], i); - ret = -ENODEV; - goto out; - } - } - - if (i == (TEST_BUFFER_SIZE / sizeof(u32))) { - /* Success. */ - ret = 0; - break; - } - } - if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) != - DMA_RWCTRL_WRITE_BNDRY_16) { - /* DMA test passed without adjusting DMA boundary, - * now look for chipsets that are known to expose the - * DMA bug without failing the test. - */ - if (pci_dev_present(tg3_dma_wait_state_chipsets)) { - tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK; - tp->dma_rwctrl |= DMA_RWCTRL_WRITE_BNDRY_16; - } else { - /* Safe to use the calculated DMA boundary. */ - tp->dma_rwctrl = saved_dma_rwctrl; - } - - tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl); - } - -out: - dma_free_coherent(&tp->pdev->dev, TEST_BUFFER_SIZE, buf, buf_dma); -out_nofree: - return ret; -} - -static void tg3_init_bufmgr_config(struct tg3 *tp) -{ - if (tg3_flag(tp, 57765_PLUS)) { - tp->bufmgr_config.mbuf_read_dma_low_water = - DEFAULT_MB_RDMA_LOW_WATER_5705; - tp->bufmgr_config.mbuf_mac_rx_low_water = - DEFAULT_MB_MACRX_LOW_WATER_57765; - tp->bufmgr_config.mbuf_high_water = - DEFAULT_MB_HIGH_WATER_57765; - - tp->bufmgr_config.mbuf_read_dma_low_water_jumbo = - DEFAULT_MB_RDMA_LOW_WATER_5705; - tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo = - DEFAULT_MB_MACRX_LOW_WATER_JUMBO_57765; - tp->bufmgr_config.mbuf_high_water_jumbo = - DEFAULT_MB_HIGH_WATER_JUMBO_57765; - } else if (tg3_flag(tp, 5705_PLUS)) { - tp->bufmgr_config.mbuf_read_dma_low_water = - DEFAULT_MB_RDMA_LOW_WATER_5705; - tp->bufmgr_config.mbuf_mac_rx_low_water = - DEFAULT_MB_MACRX_LOW_WATER_5705; - tp->bufmgr_config.mbuf_high_water = - DEFAULT_MB_HIGH_WATER_5705; - if (tg3_asic_rev(tp) == ASIC_REV_5906) { - tp->bufmgr_config.mbuf_mac_rx_low_water = - DEFAULT_MB_MACRX_LOW_WATER_5906; - tp->bufmgr_config.mbuf_high_water = - DEFAULT_MB_HIGH_WATER_5906; - } - - tp->bufmgr_config.mbuf_read_dma_low_water_jumbo = - DEFAULT_MB_RDMA_LOW_WATER_JUMBO_5780; - tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo = - DEFAULT_MB_MACRX_LOW_WATER_JUMBO_5780; - tp->bufmgr_config.mbuf_high_water_jumbo = - DEFAULT_MB_HIGH_WATER_JUMBO_5780; - } else { - tp->bufmgr_config.mbuf_read_dma_low_water = - DEFAULT_MB_RDMA_LOW_WATER; - tp->bufmgr_config.mbuf_mac_rx_low_water = - DEFAULT_MB_MACRX_LOW_WATER; - tp->bufmgr_config.mbuf_high_water = - DEFAULT_MB_HIGH_WATER; - - tp->bufmgr_config.mbuf_read_dma_low_water_jumbo = - DEFAULT_MB_RDMA_LOW_WATER_JUMBO; - tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo = - DEFAULT_MB_MACRX_LOW_WATER_JUMBO; - tp->bufmgr_config.mbuf_high_water_jumbo = - DEFAULT_MB_HIGH_WATER_JUMBO; - } - - tp->bufmgr_config.dma_low_water = DEFAULT_DMA_LOW_WATER; - tp->bufmgr_config.dma_high_water = DEFAULT_DMA_HIGH_WATER; -} - -static char *tg3_phy_string(struct tg3 *tp) -{ - switch (tp->phy_id & TG3_PHY_ID_MASK) { - case TG3_PHY_ID_BCM5400: return "5400"; - case TG3_PHY_ID_BCM5401: return "5401"; - case TG3_PHY_ID_BCM5411: return "5411"; - case TG3_PHY_ID_BCM5701: return "5701"; - case TG3_PHY_ID_BCM5703: return "5703"; - case TG3_PHY_ID_BCM5704: return "5704"; - case TG3_PHY_ID_BCM5705: return "5705"; - case TG3_PHY_ID_BCM5750: return "5750"; - case TG3_PHY_ID_BCM5752: return "5752"; - case TG3_PHY_ID_BCM5714: return "5714"; - case TG3_PHY_ID_BCM5780: return "5780"; - case TG3_PHY_ID_BCM5755: return "5755"; - case TG3_PHY_ID_BCM5787: return "5787"; - case TG3_PHY_ID_BCM5784: return "5784"; - case TG3_PHY_ID_BCM5756: return "5722/5756"; - case TG3_PHY_ID_BCM5906: return "5906"; - case TG3_PHY_ID_BCM5761: return "5761"; - case TG3_PHY_ID_BCM5718C: return "5718C"; - case TG3_PHY_ID_BCM5718S: return "5718S"; - case TG3_PHY_ID_BCM57765: return "57765"; - case TG3_PHY_ID_BCM5719C: return "5719C"; - case TG3_PHY_ID_BCM5720C: return "5720C"; - case TG3_PHY_ID_BCM5762: return "5762C"; - case TG3_PHY_ID_BCM8002: return "8002/serdes"; - case 0: return "serdes"; - default: return "unknown"; - } -} - -static char *tg3_bus_string(struct tg3 *tp, char *str) -{ - if (tg3_flag(tp, PCI_EXPRESS)) { - strcpy(str, "PCI Express"); - return str; - } else if (tg3_flag(tp, PCIX_MODE)) { - u32 clock_ctrl = tr32(TG3PCI_CLOCK_CTRL) & 0x1f; - - strcpy(str, "PCIX:"); - - if ((clock_ctrl == 7) || - ((tr32(GRC_MISC_CFG) & GRC_MISC_CFG_BOARD_ID_MASK) == - GRC_MISC_CFG_BOARD_ID_5704CIOBE)) - strcat(str, "133MHz"); - else if (clock_ctrl == 0) - strcat(str, "33MHz"); - else if (clock_ctrl == 2) - strcat(str, "50MHz"); - else if (clock_ctrl == 4) - strcat(str, "66MHz"); - else if (clock_ctrl == 6) - strcat(str, "100MHz"); - } else { - strcpy(str, "PCI:"); - if (tg3_flag(tp, PCI_HIGH_SPEED)) - strcat(str, "66MHz"); - else - strcat(str, "33MHz"); - } - if (tg3_flag(tp, PCI_32BIT)) - strcat(str, ":32-bit"); - else - strcat(str, ":64-bit"); - return str; -} - -static void tg3_init_coal(struct tg3 *tp) -{ - struct ethtool_coalesce *ec = &tp->coal; - - memset(ec, 0, sizeof(*ec)); - ec->cmd = ETHTOOL_GCOALESCE; - ec->rx_coalesce_usecs = LOW_RXCOL_TICKS; - ec->tx_coalesce_usecs = LOW_TXCOL_TICKS; - ec->rx_max_coalesced_frames = LOW_RXMAX_FRAMES; - ec->tx_max_coalesced_frames = LOW_TXMAX_FRAMES; - ec->rx_coalesce_usecs_irq = DEFAULT_RXCOAL_TICK_INT; - ec->tx_coalesce_usecs_irq = DEFAULT_TXCOAL_TICK_INT; - ec->rx_max_coalesced_frames_irq = DEFAULT_RXCOAL_MAXF_INT; - ec->tx_max_coalesced_frames_irq = DEFAULT_TXCOAL_MAXF_INT; - ec->stats_block_coalesce_usecs = DEFAULT_STAT_COAL_TICKS; - - if (tp->coalesce_mode & (HOSTCC_MODE_CLRTICK_RXBD | - HOSTCC_MODE_CLRTICK_TXBD)) { - ec->rx_coalesce_usecs = LOW_RXCOL_TICKS_CLRTCKS; - ec->rx_coalesce_usecs_irq = DEFAULT_RXCOAL_TICK_INT_CLRTCKS; - ec->tx_coalesce_usecs = LOW_TXCOL_TICKS_CLRTCKS; - ec->tx_coalesce_usecs_irq = DEFAULT_TXCOAL_TICK_INT_CLRTCKS; - } - - if (tg3_flag(tp, 5705_PLUS)) { - ec->rx_coalesce_usecs_irq = 0; - ec->tx_coalesce_usecs_irq = 0; - ec->stats_block_coalesce_usecs = 0; - } -} - -static int tg3_init_one(struct pci_dev *pdev, - const struct pci_device_id *ent) -{ - struct net_device *dev; - struct tg3 *tp; - int i, err; - u32 sndmbx, rcvmbx, intmbx; - char str[40]; - u64 dma_mask, persist_dma_mask; - netdev_features_t features = 0; - - printk_once(KERN_INFO "%s\n", version); - - err = pci_enable_device(pdev); - if (err) { - dev_err(&pdev->dev, "Cannot enable PCI device, aborting\n"); - return err; - } - - err = pci_request_regions(pdev, DRV_MODULE_NAME); - if (err) { - dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting\n"); - goto err_out_disable_pdev; - } - - pci_set_master(pdev); - - dev = alloc_etherdev_mq(sizeof(*tp), TG3_IRQ_MAX_VECS); - if (!dev) { - err = -ENOMEM; - goto err_out_free_res; - } - - SET_NETDEV_DEV(dev, &pdev->dev); - - tp = netdev_priv(dev); - tp->pdev = pdev; - tp->dev = dev; - tp->rx_mode = TG3_DEF_RX_MODE; - tp->tx_mode = TG3_DEF_TX_MODE; - tp->irq_sync = 1; - tp->pcierr_recovery = false; - - if (tg3_debug > 0) - tp->msg_enable = tg3_debug; - else - tp->msg_enable = TG3_DEF_MSG_ENABLE; - - if (pdev_is_ssb_gige_core(pdev)) { - tg3_flag_set(tp, IS_SSB_CORE); - if (ssb_gige_must_flush_posted_writes(pdev)) - tg3_flag_set(tp, FLUSH_POSTED_WRITES); - if (ssb_gige_one_dma_at_once(pdev)) - tg3_flag_set(tp, ONE_DMA_AT_ONCE); - if (ssb_gige_have_roboswitch(pdev)) { - tg3_flag_set(tp, USE_PHYLIB); - tg3_flag_set(tp, ROBOSWITCH); - } - if (ssb_gige_is_rgmii(pdev)) - tg3_flag_set(tp, RGMII_MODE); - } - - /* The word/byte swap controls here control register access byte - * swapping. DMA data byte swapping is controlled in the GRC_MODE - * setting below. - */ - tp->misc_host_ctrl = - MISC_HOST_CTRL_MASK_PCI_INT | - MISC_HOST_CTRL_WORD_SWAP | - MISC_HOST_CTRL_INDIR_ACCESS | - MISC_HOST_CTRL_PCISTATE_RW; - - /* The NONFRM (non-frame) byte/word swap controls take effect - * on descriptor entries, anything which isn't packet data. - * - * The StrongARM chips on the board (one for tx, one for rx) - * are running in big-endian mode. - */ - tp->grc_mode = (GRC_MODE_WSWAP_DATA | GRC_MODE_BSWAP_DATA | - GRC_MODE_WSWAP_NONFRM_DATA); -#ifdef __BIG_ENDIAN - tp->grc_mode |= GRC_MODE_BSWAP_NONFRM_DATA; -#endif - spin_lock_init(&tp->lock); - spin_lock_init(&tp->indirect_lock); - INIT_WORK(&tp->reset_task, tg3_reset_task); - - tp->regs = pci_ioremap_bar(pdev, BAR_0); - if (!tp->regs) { - dev_err(&pdev->dev, "Cannot map device registers, aborting\n"); - err = -ENOMEM; - goto err_out_free_dev; - } - - if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761 || - tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761E || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5761S || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5761SE || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717_C || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5719 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5720 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57767 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57764 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5762 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5725 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_5727 || - tp->pdev->device == TG3PCI_DEVICE_TIGON3_57787) { - tg3_flag_set(tp, ENABLE_APE); - tp->aperegs = pci_ioremap_bar(pdev, BAR_2); - if (!tp->aperegs) { - dev_err(&pdev->dev, - "Cannot map APE registers, aborting\n"); - err = -ENOMEM; - goto err_out_iounmap; - } - } - - tp->rx_pending = TG3_DEF_RX_RING_PENDING; - tp->rx_jumbo_pending = TG3_DEF_RX_JUMBO_RING_PENDING; - - dev->ethtool_ops = &tg3_ethtool_ops; - dev->watchdog_timeo = TG3_TX_TIMEOUT; - dev->netdev_ops = &tg3_netdev_ops; - dev->irq = pdev->irq; - - err = tg3_get_invariants(tp, ent); - if (err) { - dev_err(&pdev->dev, - "Problem fetching invariants of chip, aborting\n"); - goto err_out_apeunmap; - } - - /* The EPB bridge inside 5714, 5715, and 5780 and any - * device behind the EPB cannot support DMA addresses > 40-bit. - * On 64-bit systems with IOMMU, use 40-bit dma_mask. - * On 64-bit systems without IOMMU, use 64-bit dma_mask and - * do DMA address check in tg3_start_xmit(). - */ - if (tg3_flag(tp, IS_5788)) - persist_dma_mask = dma_mask = DMA_BIT_MASK(32); - else if (tg3_flag(tp, 40BIT_DMA_BUG)) { - persist_dma_mask = dma_mask = DMA_BIT_MASK(40); -#ifdef CONFIG_HIGHMEM - dma_mask = DMA_BIT_MASK(64); -#endif - } else - persist_dma_mask = dma_mask = DMA_BIT_MASK(64); - - /* Configure DMA attributes. */ - if (dma_mask > DMA_BIT_MASK(32)) { - err = pci_set_dma_mask(pdev, dma_mask); - if (!err) { - features |= NETIF_F_HIGHDMA; - err = pci_set_consistent_dma_mask(pdev, - persist_dma_mask); - if (err < 0) { - dev_err(&pdev->dev, "Unable to obtain 64 bit " - "DMA for consistent allocations\n"); - goto err_out_apeunmap; - } - } - } - if (err || dma_mask == DMA_BIT_MASK(32)) { - err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); - if (err) { - dev_err(&pdev->dev, - "No usable DMA configuration, aborting\n"); - goto err_out_apeunmap; - } - } - - tg3_init_bufmgr_config(tp); - - /* 5700 B0 chips do not support checksumming correctly due - * to hardware bugs. - */ - if (tg3_chip_rev_id(tp) != CHIPREV_ID_5700_B0) { - features |= NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_RXCSUM; - - if (tg3_flag(tp, 5755_PLUS)) - features |= NETIF_F_IPV6_CSUM; - } - - /* TSO is on by default on chips that support hardware TSO. - * Firmware TSO on older chips gives lower performance, so it - * is off by default, but can be enabled using ethtool. - */ - if ((tg3_flag(tp, HW_TSO_1) || - tg3_flag(tp, HW_TSO_2) || - tg3_flag(tp, HW_TSO_3)) && - (features & NETIF_F_IP_CSUM)) - features |= NETIF_F_TSO; - if (tg3_flag(tp, HW_TSO_2) || tg3_flag(tp, HW_TSO_3)) { - if (features & NETIF_F_IPV6_CSUM) - features |= NETIF_F_TSO6; - if (tg3_flag(tp, HW_TSO_3) || - tg3_asic_rev(tp) == ASIC_REV_5761 || - (tg3_asic_rev(tp) == ASIC_REV_5784 && - tg3_chip_rev(tp) != CHIPREV_5784_AX) || - tg3_asic_rev(tp) == ASIC_REV_5785 || - tg3_asic_rev(tp) == ASIC_REV_57780) - features |= NETIF_F_TSO_ECN; - } - - dev->features |= features | NETIF_F_HW_VLAN_CTAG_TX | - NETIF_F_HW_VLAN_CTAG_RX; - dev->vlan_features |= features; - - /* - * Add loopback capability only for a subset of devices that support - * MAC-LOOPBACK. Eventually this need to be enhanced to allow INT-PHY - * loopback for the remaining devices. - */ - if (tg3_asic_rev(tp) != ASIC_REV_5780 && - !tg3_flag(tp, CPMU_PRESENT)) - /* Add the loopback capability */ - features |= NETIF_F_LOOPBACK; - - dev->hw_features |= features; - dev->priv_flags |= IFF_UNICAST_FLT; - - /* MTU range: 60 - 9000 or 1500, depending on hardware */ - dev->min_mtu = TG3_MIN_MTU; - dev->max_mtu = TG3_MAX_MTU(tp); - - if (tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A1 && - !tg3_flag(tp, TSO_CAPABLE) && - !(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH)) { - tg3_flag_set(tp, MAX_RXPEND_64); - tp->rx_pending = 63; - } - - err = tg3_get_device_address(tp); - if (err) { - dev_err(&pdev->dev, - "Could not obtain valid ethernet address, aborting\n"); - goto err_out_apeunmap; - } - - intmbx = MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW; - rcvmbx = MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW; - sndmbx = MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW; - for (i = 0; i < tp->irq_max; i++) { - struct tg3_napi *tnapi = &tp->napi[i]; - - tnapi->tp = tp; - tnapi->tx_pending = TG3_DEF_TX_RING_PENDING; - - tnapi->int_mbox = intmbx; - if (i <= 4) - intmbx += 0x8; - else - intmbx += 0x4; - - tnapi->consmbox = rcvmbx; - tnapi->prodmbox = sndmbx; - - if (i) - tnapi->coal_now = HOSTCC_MODE_COAL_VEC1_NOW << (i - 1); - else - tnapi->coal_now = HOSTCC_MODE_NOW; - - if (!tg3_flag(tp, SUPPORT_MSIX)) - break; - - /* - * If we support MSIX, we'll be using RSS. If we're using - * RSS, the first vector only handles link interrupts and the - * remaining vectors handle rx and tx interrupts. Reuse the - * mailbox values for the next iteration. The values we setup - * above are still useful for the single vectored mode. - */ - if (!i) - continue; - - rcvmbx += 0x8; - - if (sndmbx & 0x4) - sndmbx -= 0x4; - else - sndmbx += 0xc; - } - - /* - * Reset chip in case UNDI or EFI driver did not shutdown - * DMA self test will enable WDMAC and we'll see (spurious) - * pending DMA on the PCI bus at that point. - */ - if ((tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE) || - (tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) { - tg3_full_lock(tp, 0); - tw32(MEMARB_MODE, MEMARB_MODE_ENABLE); - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - tg3_full_unlock(tp); - } - - err = tg3_test_dma(tp); - if (err) { - dev_err(&pdev->dev, "DMA engine test failed, aborting\n"); - goto err_out_apeunmap; - } - - tg3_init_coal(tp); - - pci_set_drvdata(pdev, dev); - - if (tg3_asic_rev(tp) == ASIC_REV_5719 || - tg3_asic_rev(tp) == ASIC_REV_5720 || - tg3_asic_rev(tp) == ASIC_REV_5762) - tg3_flag_set(tp, PTP_CAPABLE); - - tg3_timer_init(tp); - - tg3_carrier_off(tp); - - err = register_netdev(dev); - if (err) { - dev_err(&pdev->dev, "Cannot register net device, aborting\n"); - goto err_out_apeunmap; - } - - if (tg3_flag(tp, PTP_CAPABLE)) { - tg3_ptp_init(tp); - tp->ptp_clock = ptp_clock_register(&tp->ptp_info, - &tp->pdev->dev); - if (IS_ERR(tp->ptp_clock)) - tp->ptp_clock = NULL; - } - - netdev_info(dev, "Tigon3 [partno(%s) rev %04x] (%s) MAC address %pM\n", - tp->board_part_number, - tg3_chip_rev_id(tp), - tg3_bus_string(tp, str), - dev->dev_addr); - - if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED)) { - char *ethtype; - - if (tp->phy_flags & TG3_PHYFLG_10_100_ONLY) - ethtype = "10/100Base-TX"; - else if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES) - ethtype = "1000Base-SX"; - else - ethtype = "10/100/1000Base-T"; - - netdev_info(dev, "attached PHY is %s (%s Ethernet) " - "(WireSpeed[%d], EEE[%d])\n", - tg3_phy_string(tp), ethtype, - (tp->phy_flags & TG3_PHYFLG_NO_ETH_WIRE_SPEED) == 0, - (tp->phy_flags & TG3_PHYFLG_EEE_CAP) != 0); - } - - netdev_info(dev, "RXcsums[%d] LinkChgREG[%d] MIirq[%d] ASF[%d] TSOcap[%d]\n", - (dev->features & NETIF_F_RXCSUM) != 0, - tg3_flag(tp, USE_LINKCHG_REG) != 0, - (tp->phy_flags & TG3_PHYFLG_USE_MI_INTERRUPT) != 0, - tg3_flag(tp, ENABLE_ASF) != 0, - tg3_flag(tp, TSO_CAPABLE) != 0); - netdev_info(dev, "dma_rwctrl[%08x] dma_mask[%d-bit]\n", - tp->dma_rwctrl, - pdev->dma_mask == DMA_BIT_MASK(32) ? 32 : - ((u64)pdev->dma_mask) == DMA_BIT_MASK(40) ? 40 : 64); - - pci_save_state(pdev); - - return 0; - -err_out_apeunmap: - if (tp->aperegs) { - iounmap(tp->aperegs); - tp->aperegs = NULL; - } - -err_out_iounmap: - if (tp->regs) { - iounmap(tp->regs); - tp->regs = NULL; - } - -err_out_free_dev: - free_netdev(dev); - -err_out_free_res: - pci_release_regions(pdev); - -err_out_disable_pdev: - if (pci_is_enabled(pdev)) - pci_disable_device(pdev); - return err; -} - -static void tg3_remove_one(struct pci_dev *pdev) -{ - struct net_device *dev = pci_get_drvdata(pdev); - - if (dev) { - struct tg3 *tp = netdev_priv(dev); - - tg3_ptp_fini(tp); - - release_firmware(tp->fw); - - tg3_reset_task_cancel(tp); - - if (tg3_flag(tp, USE_PHYLIB)) { - tg3_phy_fini(tp); - tg3_mdio_fini(tp); - } - - unregister_netdev(dev); - if (tp->aperegs) { - iounmap(tp->aperegs); - tp->aperegs = NULL; - } - if (tp->regs) { - iounmap(tp->regs); - tp->regs = NULL; - } - free_netdev(dev); - pci_release_regions(pdev); - pci_disable_device(pdev); - } -} - -#ifdef CONFIG_PM_SLEEP -static int tg3_suspend(struct device *device) -{ - struct pci_dev *pdev = to_pci_dev(device); - struct net_device *dev = pci_get_drvdata(pdev); - struct tg3 *tp = netdev_priv(dev); - int err = 0; - - rtnl_lock(); - - if (!netif_running(dev)) - goto unlock; - - tg3_reset_task_cancel(tp); - tg3_phy_stop(tp); - tg3_netif_stop(tp); - - tg3_timer_stop(tp); - - tg3_full_lock(tp, 1); - tg3_disable_ints(tp); - tg3_full_unlock(tp); - - netif_device_detach(dev); - - tg3_full_lock(tp, 0); - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - tg3_flag_clear(tp, INIT_COMPLETE); - tg3_full_unlock(tp); - - err = tg3_power_down_prepare(tp); - if (err) { - int err2; - - tg3_full_lock(tp, 0); - - tg3_flag_set(tp, INIT_COMPLETE); - err2 = tg3_restart_hw(tp, true); - if (err2) - goto out; - - tg3_timer_start(tp); - - netif_device_attach(dev); - tg3_netif_start(tp); - -out: - tg3_full_unlock(tp); - - if (!err2) - tg3_phy_start(tp); - } - -unlock: - rtnl_unlock(); - return err; -} - -static int tg3_resume(struct device *device) -{ - struct pci_dev *pdev = to_pci_dev(device); - struct net_device *dev = pci_get_drvdata(pdev); - struct tg3 *tp = netdev_priv(dev); - int err = 0; - - rtnl_lock(); - - if (!netif_running(dev)) - goto unlock; - - netif_device_attach(dev); - - tg3_full_lock(tp, 0); - - tg3_ape_driver_state_change(tp, RESET_KIND_INIT); - - tg3_flag_set(tp, INIT_COMPLETE); - err = tg3_restart_hw(tp, - !(tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN)); - if (err) - goto out; - - tg3_timer_start(tp); - - tg3_netif_start(tp); - -out: - tg3_full_unlock(tp); - - if (!err) - tg3_phy_start(tp); - -unlock: - rtnl_unlock(); - return err; -} -#endif /* CONFIG_PM_SLEEP */ - -static SIMPLE_DEV_PM_OPS(tg3_pm_ops, tg3_suspend, tg3_resume); - -static void tg3_shutdown(struct pci_dev *pdev) -{ - struct net_device *dev = pci_get_drvdata(pdev); - struct tg3 *tp = netdev_priv(dev); - - rtnl_lock(); - netif_device_detach(dev); - - if (netif_running(dev)) - dev_close(dev); - - if (system_state == SYSTEM_POWER_OFF) - tg3_power_down(tp); - - rtnl_unlock(); -} - -/** - * tg3_io_error_detected - called when PCI error is detected - * @pdev: Pointer to PCI device - * @state: The current pci connection state - * - * This function is called after a PCI bus error affecting - * this device has been detected. - */ -static pci_ers_result_t tg3_io_error_detected(struct pci_dev *pdev, - pci_channel_state_t state) -{ - struct net_device *netdev = pci_get_drvdata(pdev); - struct tg3 *tp = netdev_priv(netdev); - pci_ers_result_t err = PCI_ERS_RESULT_NEED_RESET; - - netdev_info(netdev, "PCI I/O error detected\n"); - - rtnl_lock(); - - /* Could be second call or maybe we don't have netdev yet */ - if (!netdev || tp->pcierr_recovery || !netif_running(netdev)) - goto done; - - /* We needn't recover from permanent error */ - if (state == pci_channel_io_frozen) - tp->pcierr_recovery = true; - - tg3_phy_stop(tp); - - tg3_netif_stop(tp); - - tg3_timer_stop(tp); - - /* Want to make sure that the reset task doesn't run */ - tg3_reset_task_cancel(tp); - - netif_device_detach(netdev); - - /* Clean up software state, even if MMIO is blocked */ - tg3_full_lock(tp, 0); - tg3_halt(tp, RESET_KIND_SHUTDOWN, 0); - tg3_full_unlock(tp); - -done: - if (state == pci_channel_io_perm_failure) { - if (netdev) { - tg3_napi_enable(tp); - dev_close(netdev); - } - err = PCI_ERS_RESULT_DISCONNECT; - } else { - pci_disable_device(pdev); - } - - rtnl_unlock(); - - return err; -} - -/** - * tg3_io_slot_reset - called after the pci bus has been reset. - * @pdev: Pointer to PCI device - * - * Restart the card from scratch, as if from a cold-boot. - * At this point, the card has exprienced a hard reset, - * followed by fixups by BIOS, and has its config space - * set up identically to what it was at cold boot. - */ -static pci_ers_result_t tg3_io_slot_reset(struct pci_dev *pdev) -{ - struct net_device *netdev = pci_get_drvdata(pdev); - struct tg3 *tp = netdev_priv(netdev); - pci_ers_result_t rc = PCI_ERS_RESULT_DISCONNECT; - int err; - - rtnl_lock(); - - if (pci_enable_device(pdev)) { - dev_err(&pdev->dev, - "Cannot re-enable PCI device after reset.\n"); - goto done; - } - - pci_set_master(pdev); - pci_restore_state(pdev); - pci_save_state(pdev); - - if (!netdev || !netif_running(netdev)) { - rc = PCI_ERS_RESULT_RECOVERED; - goto done; - } - - err = tg3_power_up(tp); - if (err) - goto done; - - rc = PCI_ERS_RESULT_RECOVERED; - -done: - if (rc != PCI_ERS_RESULT_RECOVERED && netdev && netif_running(netdev)) { - tg3_napi_enable(tp); - dev_close(netdev); - } - rtnl_unlock(); - - return rc; -} - -/** - * tg3_io_resume - called when traffic can start flowing again. - * @pdev: Pointer to PCI device - * - * This callback is called when the error recovery driver tells - * us that its OK to resume normal operation. - */ -static void tg3_io_resume(struct pci_dev *pdev) -{ - struct net_device *netdev = pci_get_drvdata(pdev); - struct tg3 *tp = netdev_priv(netdev); - int err; - - rtnl_lock(); - - if (!netdev || !netif_running(netdev)) - goto done; - - tg3_full_lock(tp, 0); - tg3_ape_driver_state_change(tp, RESET_KIND_INIT); - tg3_flag_set(tp, INIT_COMPLETE); - err = tg3_restart_hw(tp, true); - if (err) { - tg3_full_unlock(tp); - netdev_err(netdev, "Cannot restart hardware after reset.\n"); - goto done; - } - - netif_device_attach(netdev); - - tg3_timer_start(tp); - - tg3_netif_start(tp); - - tg3_full_unlock(tp); - - tg3_phy_start(tp); - -done: - tp->pcierr_recovery = false; - rtnl_unlock(); -} - -static const struct pci_error_handlers tg3_err_handler = { - .error_detected = tg3_io_error_detected, - .slot_reset = tg3_io_slot_reset, - .resume = tg3_io_resume -}; - -static struct pci_driver tg3_driver = { - .name = DRV_MODULE_NAME, - .id_table = tg3_pci_tbl, - .probe = tg3_init_one, - .remove = tg3_remove_one, - .err_handler = &tg3_err_handler, - .driver.pm = &tg3_pm_ops, - .shutdown = tg3_shutdown, -}; - -module_pci_driver(tg3_driver); diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h deleted file mode 100755 index b057f71aed48..000000000000 --- a/drivers/net/ethernet/broadcom/tg3.h +++ /dev/null @@ -1,3431 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* $Id: tg3.h,v 1.37.2.32 2002/03/11 12:18:18 davem Exp $ - * tg3.h: Definitions for Broadcom Tigon3 ethernet driver. - * - * Copyright (C) 2001, 2002, 2003, 2004 David S. Miller (davem@redhat.com) - * Copyright (C) 2001 Jeff Garzik (jgarzik@pobox.com) - * Copyright (C) 2004 Sun Microsystems Inc. - * Copyright (C) 2007-2014 Broadcom Corporation. - */ - -#ifndef _T3_H -#define _T3_H - -#define TG3_64BIT_REG_HIGH 0x00UL -#define TG3_64BIT_REG_LOW 0x04UL - -/* Descriptor block info. */ -#define TG3_BDINFO_HOST_ADDR 0x0UL /* 64-bit */ -#define TG3_BDINFO_MAXLEN_FLAGS 0x8UL /* 32-bit */ -#define BDINFO_FLAGS_USE_EXT_RECV 0x00000001 /* ext rx_buffer_desc */ -#define BDINFO_FLAGS_DISABLED 0x00000002 -#define BDINFO_FLAGS_MAXLEN_MASK 0xffff0000 -#define BDINFO_FLAGS_MAXLEN_SHIFT 16 -#define TG3_BDINFO_NIC_ADDR 0xcUL /* 32-bit */ -#define TG3_BDINFO_SIZE 0x10UL - -#define TG3_RX_STD_MAX_SIZE_5700 512 -#define TG3_RX_STD_MAX_SIZE_5717 2048 -#define TG3_RX_JMB_MAX_SIZE_5700 256 -#define TG3_RX_JMB_MAX_SIZE_5717 1024 -#define TG3_RX_RET_MAX_SIZE_5700 1024 -#define TG3_RX_RET_MAX_SIZE_5705 512 -#define TG3_RX_RET_MAX_SIZE_5717 4096 - -#define TG3_RSS_INDIR_TBL_SIZE 128 - -/* First 256 bytes are a mirror of PCI config space. */ -#define TG3PCI_VENDOR 0x00000000 -#define TG3PCI_VENDOR_BROADCOM 0x14e4 -#define TG3PCI_DEVICE 0x00000002 -#define TG3PCI_DEVICE_TIGON3_1 0x1644 /* BCM5700 */ -#define TG3PCI_DEVICE_TIGON3_2 0x1645 /* BCM5701 */ -#define TG3PCI_DEVICE_TIGON3_3 0x1646 /* BCM5702 */ -#define TG3PCI_DEVICE_TIGON3_4 0x1647 /* BCM5703 */ -#define TG3PCI_DEVICE_TIGON3_5761S 0x1688 -#define TG3PCI_DEVICE_TIGON3_5761SE 0x1689 -#define TG3PCI_DEVICE_TIGON3_57780 0x1692 -#define TG3PCI_DEVICE_TIGON3_5787M 0x1693 -#define TG3PCI_DEVICE_TIGON3_57760 0x1690 -#define TG3PCI_DEVICE_TIGON3_57790 0x1694 -#define TG3PCI_DEVICE_TIGON3_57788 0x1691 -#define TG3PCI_DEVICE_TIGON3_5785_G 0x1699 /* GPHY */ -#define TG3PCI_DEVICE_TIGON3_5785_F 0x16a0 /* 10/100 only */ -#define TG3PCI_DEVICE_TIGON3_5717 0x1655 -#define TG3PCI_DEVICE_TIGON3_5717_C 0x1665 -#define TG3PCI_DEVICE_TIGON3_5718 0x1656 -#define TG3PCI_DEVICE_TIGON3_57781 0x16b1 -#define TG3PCI_DEVICE_TIGON3_57785 0x16b5 -#define TG3PCI_DEVICE_TIGON3_57761 0x16b0 -#define TG3PCI_DEVICE_TIGON3_57765 0x16b4 -#define TG3PCI_DEVICE_TIGON3_57791 0x16b2 -#define TG3PCI_DEVICE_TIGON3_57795 0x16b6 -#define TG3PCI_DEVICE_TIGON3_5719 0x1657 -#define TG3PCI_DEVICE_TIGON3_5720 0x165f -#define TG3PCI_DEVICE_TIGON3_57762 0x1682 -#define TG3PCI_DEVICE_TIGON3_57766 0x1686 -#define TG3PCI_DEVICE_TIGON3_57786 0x16b3 -#define TG3PCI_DEVICE_TIGON3_57782 0x16b7 -#define TG3PCI_DEVICE_TIGON3_5762 0x1687 -#define TG3PCI_DEVICE_TIGON3_5725 0x1643 -#define TG3PCI_DEVICE_TIGON3_5727 0x16f3 -#define TG3PCI_DEVICE_TIGON3_57764 0x1642 -#define TG3PCI_DEVICE_TIGON3_57767 0x1683 -#define TG3PCI_DEVICE_TIGON3_57787 0x1641 -/* 0x04 --> 0x2c unused */ -#define TG3PCI_SUBVENDOR_ID_BROADCOM PCI_VENDOR_ID_BROADCOM -#define TG3PCI_SUBDEVICE_ID_BROADCOM_95700A6 0x1644 -#define TG3PCI_SUBDEVICE_ID_BROADCOM_95701A5 0x0001 -#define TG3PCI_SUBDEVICE_ID_BROADCOM_95700T6 0x0002 -#define TG3PCI_SUBDEVICE_ID_BROADCOM_95700A9 0x0003 -#define TG3PCI_SUBDEVICE_ID_BROADCOM_95701T1 0x0005 -#define TG3PCI_SUBDEVICE_ID_BROADCOM_95701T8 0x0006 -#define TG3PCI_SUBDEVICE_ID_BROADCOM_95701A7 0x0007 -#define TG3PCI_SUBDEVICE_ID_BROADCOM_95701A10 0x0008 -#define TG3PCI_SUBDEVICE_ID_BROADCOM_95701A12 0x8008 -#define TG3PCI_SUBDEVICE_ID_BROADCOM_95703AX1 0x0009 -#define TG3PCI_SUBDEVICE_ID_BROADCOM_95703AX2 0x8009 -#define TG3PCI_SUBVENDOR_ID_3COM PCI_VENDOR_ID_3COM -#define TG3PCI_SUBDEVICE_ID_3COM_3C996T 0x1000 -#define TG3PCI_SUBDEVICE_ID_3COM_3C996BT 0x1006 -#define TG3PCI_SUBDEVICE_ID_3COM_3C996SX 0x1004 -#define TG3PCI_SUBDEVICE_ID_3COM_3C1000T 0x1007 -#define TG3PCI_SUBDEVICE_ID_3COM_3C940BR01 0x1008 -#define TG3PCI_SUBVENDOR_ID_DELL PCI_VENDOR_ID_DELL -#define TG3PCI_SUBDEVICE_ID_DELL_VIPER 0x00d1 -#define TG3PCI_SUBDEVICE_ID_DELL_JAGUAR 0x0106 -#define TG3PCI_SUBDEVICE_ID_DELL_MERLOT 0x0109 -#define TG3PCI_SUBDEVICE_ID_DELL_SLIM_MERLOT 0x010a -#define TG3PCI_SUBDEVICE_ID_DELL_5762 0x07f0 -#define TG3PCI_SUBVENDOR_ID_COMPAQ PCI_VENDOR_ID_COMPAQ -#define TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE 0x007c -#define TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE_2 0x009a -#define TG3PCI_SUBDEVICE_ID_COMPAQ_CHANGELING 0x007d -#define TG3PCI_SUBDEVICE_ID_COMPAQ_NC7780 0x0085 -#define TG3PCI_SUBDEVICE_ID_COMPAQ_NC7780_2 0x0099 -#define TG3PCI_SUBVENDOR_ID_IBM PCI_VENDOR_ID_IBM -#define TG3PCI_SUBDEVICE_ID_IBM_5703SAX2 0x0281 -#define TG3PCI_SUBDEVICE_ID_ACER_57780_A 0x0601 -#define TG3PCI_SUBDEVICE_ID_ACER_57780_B 0x0612 -#define TG3PCI_SUBDEVICE_ID_LENOVO_5787M 0x3056 - -/* 0x30 --> 0x64 unused */ -#define TG3PCI_MSI_DATA 0x00000064 -/* 0x66 --> 0x68 unused */ -#define TG3PCI_MISC_HOST_CTRL 0x00000068 -#define MISC_HOST_CTRL_CLEAR_INT 0x00000001 -#define MISC_HOST_CTRL_MASK_PCI_INT 0x00000002 -#define MISC_HOST_CTRL_BYTE_SWAP 0x00000004 -#define MISC_HOST_CTRL_WORD_SWAP 0x00000008 -#define MISC_HOST_CTRL_PCISTATE_RW 0x00000010 -#define MISC_HOST_CTRL_CLKREG_RW 0x00000020 -#define MISC_HOST_CTRL_REGWORD_SWAP 0x00000040 -#define MISC_HOST_CTRL_INDIR_ACCESS 0x00000080 -#define MISC_HOST_CTRL_IRQ_MASK_MODE 0x00000100 -#define MISC_HOST_CTRL_TAGGED_STATUS 0x00000200 -#define MISC_HOST_CTRL_CHIPREV 0xffff0000 -#define MISC_HOST_CTRL_CHIPREV_SHIFT 16 - -#define CHIPREV_ID_5700_A0 0x7000 -#define CHIPREV_ID_5700_A1 0x7001 -#define CHIPREV_ID_5700_B0 0x7100 -#define CHIPREV_ID_5700_B1 0x7101 -#define CHIPREV_ID_5700_B3 0x7102 -#define CHIPREV_ID_5700_ALTIMA 0x7104 -#define CHIPREV_ID_5700_C0 0x7200 -#define CHIPREV_ID_5701_A0 0x0000 -#define CHIPREV_ID_5701_B0 0x0100 -#define CHIPREV_ID_5701_B2 0x0102 -#define CHIPREV_ID_5701_B5 0x0105 -#define CHIPREV_ID_5703_A0 0x1000 -#define CHIPREV_ID_5703_A1 0x1001 -#define CHIPREV_ID_5703_A2 0x1002 -#define CHIPREV_ID_5703_A3 0x1003 -#define CHIPREV_ID_5704_A0 0x2000 -#define CHIPREV_ID_5704_A1 0x2001 -#define CHIPREV_ID_5704_A2 0x2002 -#define CHIPREV_ID_5704_A3 0x2003 -#define CHIPREV_ID_5705_A0 0x3000 -#define CHIPREV_ID_5705_A1 0x3001 -#define CHIPREV_ID_5705_A2 0x3002 -#define CHIPREV_ID_5705_A3 0x3003 -#define CHIPREV_ID_5750_A0 0x4000 -#define CHIPREV_ID_5750_A1 0x4001 -#define CHIPREV_ID_5750_A3 0x4003 -#define CHIPREV_ID_5750_C2 0x4202 -#define CHIPREV_ID_5752_A0_HW 0x5000 -#define CHIPREV_ID_5752_A0 0x6000 -#define CHIPREV_ID_5752_A1 0x6001 -#define CHIPREV_ID_5714_A2 0x9002 -#define CHIPREV_ID_5906_A1 0xc001 -#define CHIPREV_ID_57780_A0 0x57780000 -#define CHIPREV_ID_57780_A1 0x57780001 -#define CHIPREV_ID_5717_A0 0x05717000 -#define CHIPREV_ID_5717_C0 0x05717200 -#define CHIPREV_ID_57765_A0 0x57785000 -#define CHIPREV_ID_5719_A0 0x05719000 -#define CHIPREV_ID_5720_A0 0x05720000 -#define CHIPREV_ID_5762_A0 0x05762000 - -#define ASIC_REV_5700 0x07 -#define ASIC_REV_5701 0x00 -#define ASIC_REV_5703 0x01 -#define ASIC_REV_5704 0x02 -#define ASIC_REV_5705 0x03 -#define ASIC_REV_5750 0x04 -#define ASIC_REV_5752 0x06 -#define ASIC_REV_5780 0x08 -#define ASIC_REV_5714 0x09 -#define ASIC_REV_5755 0x0a -#define ASIC_REV_5787 0x0b -#define ASIC_REV_5906 0x0c -#define ASIC_REV_USE_PROD_ID_REG 0x0f -#define ASIC_REV_5784 0x5784 -#define ASIC_REV_5761 0x5761 -#define ASIC_REV_5785 0x5785 -#define ASIC_REV_57780 0x57780 -#define ASIC_REV_5717 0x5717 -#define ASIC_REV_57765 0x57785 -#define ASIC_REV_5719 0x5719 -#define ASIC_REV_5720 0x5720 -#define ASIC_REV_57766 0x57766 -#define ASIC_REV_5762 0x5762 -#define CHIPREV_5700_AX 0x70 -#define CHIPREV_5700_BX 0x71 -#define CHIPREV_5700_CX 0x72 -#define CHIPREV_5701_AX 0x00 -#define CHIPREV_5703_AX 0x10 -#define CHIPREV_5704_AX 0x20 -#define CHIPREV_5704_BX 0x21 -#define CHIPREV_5750_AX 0x40 -#define CHIPREV_5750_BX 0x41 -#define CHIPREV_5784_AX 0x57840 -#define CHIPREV_5761_AX 0x57610 -#define CHIPREV_57765_AX 0x577650 -#define METAL_REV_A0 0x00 -#define METAL_REV_A1 0x01 -#define METAL_REV_B0 0x00 -#define METAL_REV_B1 0x01 -#define METAL_REV_B2 0x02 -#define TG3PCI_DMA_RW_CTRL 0x0000006c -#define DMA_RWCTRL_DIS_CACHE_ALIGNMENT 0x00000001 -#define DMA_RWCTRL_TAGGED_STAT_WA 0x00000080 -#define DMA_RWCTRL_CRDRDR_RDMA_MRRS_MSK 0x00000380 -#define DMA_RWCTRL_READ_BNDRY_MASK 0x00000700 -#define DMA_RWCTRL_READ_BNDRY_DISAB 0x00000000 -#define DMA_RWCTRL_READ_BNDRY_16 0x00000100 -#define DMA_RWCTRL_READ_BNDRY_128_PCIX 0x00000100 -#define DMA_RWCTRL_READ_BNDRY_32 0x00000200 -#define DMA_RWCTRL_READ_BNDRY_256_PCIX 0x00000200 -#define DMA_RWCTRL_READ_BNDRY_64 0x00000300 -#define DMA_RWCTRL_READ_BNDRY_384_PCIX 0x00000300 -#define DMA_RWCTRL_READ_BNDRY_128 0x00000400 -#define DMA_RWCTRL_READ_BNDRY_256 0x00000500 -#define DMA_RWCTRL_READ_BNDRY_512 0x00000600 -#define DMA_RWCTRL_READ_BNDRY_1024 0x00000700 -#define DMA_RWCTRL_WRITE_BNDRY_MASK 0x00003800 -#define DMA_RWCTRL_WRITE_BNDRY_DISAB 0x00000000 -#define DMA_RWCTRL_WRITE_BNDRY_16 0x00000800 -#define DMA_RWCTRL_WRITE_BNDRY_128_PCIX 0x00000800 -#define DMA_RWCTRL_WRITE_BNDRY_32 0x00001000 -#define DMA_RWCTRL_WRITE_BNDRY_256_PCIX 0x00001000 -#define DMA_RWCTRL_WRITE_BNDRY_64 0x00001800 -#define DMA_RWCTRL_WRITE_BNDRY_384_PCIX 0x00001800 -#define DMA_RWCTRL_WRITE_BNDRY_128 0x00002000 -#define DMA_RWCTRL_WRITE_BNDRY_256 0x00002800 -#define DMA_RWCTRL_WRITE_BNDRY_512 0x00003000 -#define DMA_RWCTRL_WRITE_BNDRY_1024 0x00003800 -#define DMA_RWCTRL_ONE_DMA 0x00004000 -#define DMA_RWCTRL_READ_WATER 0x00070000 -#define DMA_RWCTRL_READ_WATER_SHIFT 16 -#define DMA_RWCTRL_WRITE_WATER 0x00380000 -#define DMA_RWCTRL_WRITE_WATER_SHIFT 19 -#define DMA_RWCTRL_USE_MEM_READ_MULT 0x00400000 -#define DMA_RWCTRL_ASSERT_ALL_BE 0x00800000 -#define DMA_RWCTRL_PCI_READ_CMD 0x0f000000 -#define DMA_RWCTRL_PCI_READ_CMD_SHIFT 24 -#define DMA_RWCTRL_PCI_WRITE_CMD 0xf0000000 -#define DMA_RWCTRL_PCI_WRITE_CMD_SHIFT 28 -#define DMA_RWCTRL_WRITE_BNDRY_64_PCIE 0x10000000 -#define DMA_RWCTRL_WRITE_BNDRY_128_PCIE 0x30000000 -#define DMA_RWCTRL_WRITE_BNDRY_DISAB_PCIE 0x70000000 -#define TG3PCI_PCISTATE 0x00000070 -#define PCISTATE_FORCE_RESET 0x00000001 -#define PCISTATE_INT_NOT_ACTIVE 0x00000002 -#define PCISTATE_CONV_PCI_MODE 0x00000004 -#define PCISTATE_BUS_SPEED_HIGH 0x00000008 -#define PCISTATE_BUS_32BIT 0x00000010 -#define PCISTATE_ROM_ENABLE 0x00000020 -#define PCISTATE_ROM_RETRY_ENABLE 0x00000040 -#define PCISTATE_FLAT_VIEW 0x00000100 -#define PCISTATE_RETRY_SAME_DMA 0x00002000 -#define PCISTATE_ALLOW_APE_CTLSPC_WR 0x00010000 -#define PCISTATE_ALLOW_APE_SHMEM_WR 0x00020000 -#define PCISTATE_ALLOW_APE_PSPACE_WR 0x00040000 -#define TG3PCI_CLOCK_CTRL 0x00000074 -#define CLOCK_CTRL_CORECLK_DISABLE 0x00000200 -#define CLOCK_CTRL_RXCLK_DISABLE 0x00000400 -#define CLOCK_CTRL_TXCLK_DISABLE 0x00000800 -#define CLOCK_CTRL_ALTCLK 0x00001000 -#define CLOCK_CTRL_PWRDOWN_PLL133 0x00008000 -#define CLOCK_CTRL_44MHZ_CORE 0x00040000 -#define CLOCK_CTRL_625_CORE 0x00100000 -#define CLOCK_CTRL_FORCE_CLKRUN 0x00200000 -#define CLOCK_CTRL_CLKRUN_OENABLE 0x00400000 -#define CLOCK_CTRL_DELAY_PCI_GRANT 0x80000000 -#define TG3PCI_REG_BASE_ADDR 0x00000078 -#define TG3PCI_MEM_WIN_BASE_ADDR 0x0000007c -#define TG3PCI_REG_DATA 0x00000080 -#define TG3PCI_MEM_WIN_DATA 0x00000084 -#define TG3PCI_MISC_LOCAL_CTRL 0x00000090 -/* 0x94 --> 0x98 unused */ -#define TG3PCI_STD_RING_PROD_IDX 0x00000098 /* 64-bit */ -#define TG3PCI_RCV_RET_RING_CON_IDX 0x000000a0 /* 64-bit */ -/* 0xa8 --> 0xb8 unused */ -#define TG3PCI_DEV_STATUS_CTRL 0x000000b4 -#define MAX_READ_REQ_SIZE_2048 0x00004000 -#define MAX_READ_REQ_MASK 0x00007000 -#define TG3PCI_DUAL_MAC_CTRL 0x000000b8 -#define DUAL_MAC_CTRL_CH_MASK 0x00000003 -#define DUAL_MAC_CTRL_ID 0x00000004 -#define TG3PCI_PRODID_ASICREV 0x000000bc -#define PROD_ID_ASIC_REV_MASK 0x0fffffff -/* 0xc0 --> 0xf4 unused */ - -#define TG3PCI_GEN2_PRODID_ASICREV 0x000000f4 -#define TG3PCI_GEN15_PRODID_ASICREV 0x000000fc -/* 0xf8 --> 0x200 unused */ - -#define TG3_CORR_ERR_STAT 0x00000110 -#define TG3_CORR_ERR_STAT_CLEAR 0xffffffff -/* 0x114 --> 0x200 unused */ - -/* Mailbox registers */ -#define MAILBOX_INTERRUPT_0 0x00000200 /* 64-bit */ -#define MAILBOX_INTERRUPT_1 0x00000208 /* 64-bit */ -#define MAILBOX_INTERRUPT_2 0x00000210 /* 64-bit */ -#define MAILBOX_INTERRUPT_3 0x00000218 /* 64-bit */ -#define MAILBOX_GENERAL_0 0x00000220 /* 64-bit */ -#define MAILBOX_GENERAL_1 0x00000228 /* 64-bit */ -#define MAILBOX_GENERAL_2 0x00000230 /* 64-bit */ -#define MAILBOX_GENERAL_3 0x00000238 /* 64-bit */ -#define MAILBOX_GENERAL_4 0x00000240 /* 64-bit */ -#define MAILBOX_GENERAL_5 0x00000248 /* 64-bit */ -#define MAILBOX_GENERAL_6 0x00000250 /* 64-bit */ -#define MAILBOX_GENERAL_7 0x00000258 /* 64-bit */ -#define MAILBOX_RELOAD_STAT 0x00000260 /* 64-bit */ -#define MAILBOX_RCV_STD_PROD_IDX 0x00000268 /* 64-bit */ -#define TG3_RX_STD_PROD_IDX_REG (MAILBOX_RCV_STD_PROD_IDX + \ - TG3_64BIT_REG_LOW) -#define MAILBOX_RCV_JUMBO_PROD_IDX 0x00000270 /* 64-bit */ -#define TG3_RX_JMB_PROD_IDX_REG (MAILBOX_RCV_JUMBO_PROD_IDX + \ - TG3_64BIT_REG_LOW) -#define MAILBOX_RCV_MINI_PROD_IDX 0x00000278 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_0 0x00000280 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_1 0x00000288 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_2 0x00000290 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_3 0x00000298 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_4 0x000002a0 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_5 0x000002a8 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_6 0x000002b0 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_7 0x000002b8 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_8 0x000002c0 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_9 0x000002c8 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_10 0x000002d0 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_11 0x000002d8 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_12 0x000002e0 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_13 0x000002e8 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_14 0x000002f0 /* 64-bit */ -#define MAILBOX_RCVRET_CON_IDX_15 0x000002f8 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_0 0x00000300 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_1 0x00000308 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_2 0x00000310 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_3 0x00000318 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_4 0x00000320 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_5 0x00000328 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_6 0x00000330 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_7 0x00000338 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_8 0x00000340 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_9 0x00000348 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_10 0x00000350 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_11 0x00000358 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_12 0x00000360 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_13 0x00000368 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_14 0x00000370 /* 64-bit */ -#define MAILBOX_SNDHOST_PROD_IDX_15 0x00000378 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_0 0x00000380 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_1 0x00000388 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_2 0x00000390 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_3 0x00000398 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_4 0x000003a0 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_5 0x000003a8 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_6 0x000003b0 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_7 0x000003b8 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_8 0x000003c0 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_9 0x000003c8 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_10 0x000003d0 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_11 0x000003d8 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_12 0x000003e0 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_13 0x000003e8 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_14 0x000003f0 /* 64-bit */ -#define MAILBOX_SNDNIC_PROD_IDX_15 0x000003f8 /* 64-bit */ - -/* MAC control registers */ -#define MAC_MODE 0x00000400 -#define MAC_MODE_RESET 0x00000001 -#define MAC_MODE_HALF_DUPLEX 0x00000002 -#define MAC_MODE_PORT_MODE_MASK 0x0000000c -#define MAC_MODE_PORT_MODE_TBI 0x0000000c -#define MAC_MODE_PORT_MODE_GMII 0x00000008 -#define MAC_MODE_PORT_MODE_MII 0x00000004 -#define MAC_MODE_PORT_MODE_NONE 0x00000000 -#define MAC_MODE_PORT_INT_LPBACK 0x00000010 -#define MAC_MODE_TAGGED_MAC_CTRL 0x00000080 -#define MAC_MODE_TX_BURSTING 0x00000100 -#define MAC_MODE_MAX_DEFER 0x00000200 -#define MAC_MODE_LINK_POLARITY 0x00000400 -#define MAC_MODE_RXSTAT_ENABLE 0x00000800 -#define MAC_MODE_RXSTAT_CLEAR 0x00001000 -#define MAC_MODE_RXSTAT_FLUSH 0x00002000 -#define MAC_MODE_TXSTAT_ENABLE 0x00004000 -#define MAC_MODE_TXSTAT_CLEAR 0x00008000 -#define MAC_MODE_TXSTAT_FLUSH 0x00010000 -#define MAC_MODE_SEND_CONFIGS 0x00020000 -#define MAC_MODE_MAGIC_PKT_ENABLE 0x00040000 -#define MAC_MODE_ACPI_ENABLE 0x00080000 -#define MAC_MODE_MIP_ENABLE 0x00100000 -#define MAC_MODE_TDE_ENABLE 0x00200000 -#define MAC_MODE_RDE_ENABLE 0x00400000 -#define MAC_MODE_FHDE_ENABLE 0x00800000 -#define MAC_MODE_KEEP_FRAME_IN_WOL 0x01000000 -#define MAC_MODE_APE_RX_EN 0x08000000 -#define MAC_MODE_APE_TX_EN 0x10000000 -#define MAC_STATUS 0x00000404 -#define MAC_STATUS_PCS_SYNCED 0x00000001 -#define MAC_STATUS_SIGNAL_DET 0x00000002 -#define MAC_STATUS_RCVD_CFG 0x00000004 -#define MAC_STATUS_CFG_CHANGED 0x00000008 -#define MAC_STATUS_SYNC_CHANGED 0x00000010 -#define MAC_STATUS_PORT_DEC_ERR 0x00000400 -#define MAC_STATUS_LNKSTATE_CHANGED 0x00001000 -#define MAC_STATUS_MI_COMPLETION 0x00400000 -#define MAC_STATUS_MI_INTERRUPT 0x00800000 -#define MAC_STATUS_AP_ERROR 0x01000000 -#define MAC_STATUS_ODI_ERROR 0x02000000 -#define MAC_STATUS_RXSTAT_OVERRUN 0x04000000 -#define MAC_STATUS_TXSTAT_OVERRUN 0x08000000 -#define MAC_EVENT 0x00000408 -#define MAC_EVENT_PORT_DECODE_ERR 0x00000400 -#define MAC_EVENT_LNKSTATE_CHANGED 0x00001000 -#define MAC_EVENT_MI_COMPLETION 0x00400000 -#define MAC_EVENT_MI_INTERRUPT 0x00800000 -#define MAC_EVENT_AP_ERROR 0x01000000 -#define MAC_EVENT_ODI_ERROR 0x02000000 -#define MAC_EVENT_RXSTAT_OVERRUN 0x04000000 -#define MAC_EVENT_TXSTAT_OVERRUN 0x08000000 -#define MAC_LED_CTRL 0x0000040c -#define LED_CTRL_LNKLED_OVERRIDE 0x00000001 -#define LED_CTRL_1000MBPS_ON 0x00000002 -#define LED_CTRL_100MBPS_ON 0x00000004 -#define LED_CTRL_10MBPS_ON 0x00000008 -#define LED_CTRL_TRAFFIC_OVERRIDE 0x00000010 -#define LED_CTRL_TRAFFIC_BLINK 0x00000020 -#define LED_CTRL_TRAFFIC_LED 0x00000040 -#define LED_CTRL_1000MBPS_STATUS 0x00000080 -#define LED_CTRL_100MBPS_STATUS 0x00000100 -#define LED_CTRL_10MBPS_STATUS 0x00000200 -#define LED_CTRL_TRAFFIC_STATUS 0x00000400 -#define LED_CTRL_MODE_MAC 0x00000000 -#define LED_CTRL_MODE_PHY_1 0x00000800 -#define LED_CTRL_MODE_PHY_2 0x00001000 -#define LED_CTRL_MODE_SHASTA_MAC 0x00002000 -#define LED_CTRL_MODE_SHARED 0x00004000 -#define LED_CTRL_MODE_COMBO 0x00008000 -#define LED_CTRL_BLINK_RATE_MASK 0x7ff80000 -#define LED_CTRL_BLINK_RATE_SHIFT 19 -#define LED_CTRL_BLINK_PER_OVERRIDE 0x00080000 -#define LED_CTRL_BLINK_RATE_OVERRIDE 0x80000000 -#define MAC_ADDR_0_HIGH 0x00000410 /* upper 2 bytes */ -#define MAC_ADDR_0_LOW 0x00000414 /* lower 4 bytes */ -#define MAC_ADDR_1_HIGH 0x00000418 /* upper 2 bytes */ -#define MAC_ADDR_1_LOW 0x0000041c /* lower 4 bytes */ -#define MAC_ADDR_2_HIGH 0x00000420 /* upper 2 bytes */ -#define MAC_ADDR_2_LOW 0x00000424 /* lower 4 bytes */ -#define MAC_ADDR_3_HIGH 0x00000428 /* upper 2 bytes */ -#define MAC_ADDR_3_LOW 0x0000042c /* lower 4 bytes */ -#define MAC_ACPI_MBUF_PTR 0x00000430 -#define MAC_ACPI_LEN_OFFSET 0x00000434 -#define ACPI_LENOFF_LEN_MASK 0x0000ffff -#define ACPI_LENOFF_LEN_SHIFT 0 -#define ACPI_LENOFF_OFF_MASK 0x0fff0000 -#define ACPI_LENOFF_OFF_SHIFT 16 -#define MAC_TX_BACKOFF_SEED 0x00000438 -#define TX_BACKOFF_SEED_MASK 0x000003ff -#define MAC_RX_MTU_SIZE 0x0000043c -#define RX_MTU_SIZE_MASK 0x0000ffff -#define MAC_PCS_TEST 0x00000440 -#define PCS_TEST_PATTERN_MASK 0x000fffff -#define PCS_TEST_PATTERN_SHIFT 0 -#define PCS_TEST_ENABLE 0x00100000 -#define MAC_TX_AUTO_NEG 0x00000444 -#define TX_AUTO_NEG_MASK 0x0000ffff -#define TX_AUTO_NEG_SHIFT 0 -#define MAC_RX_AUTO_NEG 0x00000448 -#define RX_AUTO_NEG_MASK 0x0000ffff -#define RX_AUTO_NEG_SHIFT 0 -#define MAC_MI_COM 0x0000044c -#define MI_COM_CMD_MASK 0x0c000000 -#define MI_COM_CMD_WRITE 0x04000000 -#define MI_COM_CMD_READ 0x08000000 -#define MI_COM_READ_FAILED 0x10000000 -#define MI_COM_START 0x20000000 -#define MI_COM_BUSY 0x20000000 -#define MI_COM_PHY_ADDR_MASK 0x03e00000 -#define MI_COM_PHY_ADDR_SHIFT 21 -#define MI_COM_REG_ADDR_MASK 0x001f0000 -#define MI_COM_REG_ADDR_SHIFT 16 -#define MI_COM_DATA_MASK 0x0000ffff -#define MAC_MI_STAT 0x00000450 -#define MAC_MI_STAT_LNKSTAT_ATTN_ENAB 0x00000001 -#define MAC_MI_STAT_10MBPS_MODE 0x00000002 -#define MAC_MI_MODE 0x00000454 -#define MAC_MI_MODE_CLK_10MHZ 0x00000001 -#define MAC_MI_MODE_SHORT_PREAMBLE 0x00000002 -#define MAC_MI_MODE_AUTO_POLL 0x00000010 -#define MAC_MI_MODE_500KHZ_CONST 0x00008000 -#define MAC_MI_MODE_BASE 0x000c0000 /* XXX magic values XXX */ -#define MAC_AUTO_POLL_STATUS 0x00000458 -#define MAC_AUTO_POLL_ERROR 0x00000001 -#define MAC_TX_MODE 0x0000045c -#define TX_MODE_RESET 0x00000001 -#define TX_MODE_ENABLE 0x00000002 -#define TX_MODE_FLOW_CTRL_ENABLE 0x00000010 -#define TX_MODE_BIG_BCKOFF_ENABLE 0x00000020 -#define TX_MODE_LONG_PAUSE_ENABLE 0x00000040 -#define TX_MODE_MBUF_LOCKUP_FIX 0x00000100 -#define TX_MODE_JMB_FRM_LEN 0x00400000 -#define TX_MODE_CNT_DN_MODE 0x00800000 -#define MAC_TX_STATUS 0x00000460 -#define TX_STATUS_XOFFED 0x00000001 -#define TX_STATUS_SENT_XOFF 0x00000002 -#define TX_STATUS_SENT_XON 0x00000004 -#define TX_STATUS_LINK_UP 0x00000008 -#define TX_STATUS_ODI_UNDERRUN 0x00000010 -#define TX_STATUS_ODI_OVERRUN 0x00000020 -#define MAC_TX_LENGTHS 0x00000464 -#define TX_LENGTHS_SLOT_TIME_MASK 0x000000ff -#define TX_LENGTHS_SLOT_TIME_SHIFT 0 -#define TX_LENGTHS_IPG_MASK 0x00000f00 -#define TX_LENGTHS_IPG_SHIFT 8 -#define TX_LENGTHS_IPG_CRS_MASK 0x00003000 -#define TX_LENGTHS_IPG_CRS_SHIFT 12 -#define TX_LENGTHS_JMB_FRM_LEN_MSK 0x00ff0000 -#define TX_LENGTHS_CNT_DWN_VAL_MSK 0xff000000 -#define MAC_RX_MODE 0x00000468 -#define RX_MODE_RESET 0x00000001 -#define RX_MODE_ENABLE 0x00000002 -#define RX_MODE_FLOW_CTRL_ENABLE 0x00000004 -#define RX_MODE_KEEP_MAC_CTRL 0x00000008 -#define RX_MODE_KEEP_PAUSE 0x00000010 -#define RX_MODE_ACCEPT_OVERSIZED 0x00000020 -#define RX_MODE_ACCEPT_RUNTS 0x00000040 -#define RX_MODE_LEN_CHECK 0x00000080 -#define RX_MODE_PROMISC 0x00000100 -#define RX_MODE_NO_CRC_CHECK 0x00000200 -#define RX_MODE_KEEP_VLAN_TAG 0x00000400 -#define RX_MODE_RSS_IPV4_HASH_EN 0x00010000 -#define RX_MODE_RSS_TCP_IPV4_HASH_EN 0x00020000 -#define RX_MODE_RSS_IPV6_HASH_EN 0x00040000 -#define RX_MODE_RSS_TCP_IPV6_HASH_EN 0x00080000 -#define RX_MODE_RSS_ITBL_HASH_BITS_7 0x00700000 -#define RX_MODE_RSS_ENABLE 0x00800000 -#define RX_MODE_IPV6_CSUM_ENABLE 0x01000000 -#define RX_MODE_IPV4_FRAG_FIX 0x02000000 -#define MAC_RX_STATUS 0x0000046c -#define RX_STATUS_REMOTE_TX_XOFFED 0x00000001 -#define RX_STATUS_XOFF_RCVD 0x00000002 -#define RX_STATUS_XON_RCVD 0x00000004 -#define MAC_HASH_REG_0 0x00000470 -#define MAC_HASH_REG_1 0x00000474 -#define MAC_HASH_REG_2 0x00000478 -#define MAC_HASH_REG_3 0x0000047c -#define MAC_RCV_RULE_0 0x00000480 -#define MAC_RCV_VALUE_0 0x00000484 -#define MAC_RCV_RULE_1 0x00000488 -#define MAC_RCV_VALUE_1 0x0000048c -#define MAC_RCV_RULE_2 0x00000490 -#define MAC_RCV_VALUE_2 0x00000494 -#define MAC_RCV_RULE_3 0x00000498 -#define MAC_RCV_VALUE_3 0x0000049c -#define MAC_RCV_RULE_4 0x000004a0 -#define MAC_RCV_VALUE_4 0x000004a4 -#define MAC_RCV_RULE_5 0x000004a8 -#define MAC_RCV_VALUE_5 0x000004ac -#define MAC_RCV_RULE_6 0x000004b0 -#define MAC_RCV_VALUE_6 0x000004b4 -#define MAC_RCV_RULE_7 0x000004b8 -#define MAC_RCV_VALUE_7 0x000004bc -#define MAC_RCV_RULE_8 0x000004c0 -#define MAC_RCV_VALUE_8 0x000004c4 -#define MAC_RCV_RULE_9 0x000004c8 -#define MAC_RCV_VALUE_9 0x000004cc -#define MAC_RCV_RULE_10 0x000004d0 -#define MAC_RCV_VALUE_10 0x000004d4 -#define MAC_RCV_RULE_11 0x000004d8 -#define MAC_RCV_VALUE_11 0x000004dc -#define MAC_RCV_RULE_12 0x000004e0 -#define MAC_RCV_VALUE_12 0x000004e4 -#define MAC_RCV_RULE_13 0x000004e8 -#define MAC_RCV_VALUE_13 0x000004ec -#define MAC_RCV_RULE_14 0x000004f0 -#define MAC_RCV_VALUE_14 0x000004f4 -#define MAC_RCV_RULE_15 0x000004f8 -#define MAC_RCV_VALUE_15 0x000004fc -#define RCV_RULE_DISABLE_MASK 0x7fffffff -#define MAC_RCV_RULE_CFG 0x00000500 -#define RCV_RULE_CFG_DEFAULT_CLASS 0x00000008 -#define MAC_LOW_WMARK_MAX_RX_FRAME 0x00000504 -/* 0x508 --> 0x520 unused */ -#define MAC_HASHREGU_0 0x00000520 -#define MAC_HASHREGU_1 0x00000524 -#define MAC_HASHREGU_2 0x00000528 -#define MAC_HASHREGU_3 0x0000052c -#define MAC_EXTADDR_0_HIGH 0x00000530 -#define MAC_EXTADDR_0_LOW 0x00000534 -#define MAC_EXTADDR_1_HIGH 0x00000538 -#define MAC_EXTADDR_1_LOW 0x0000053c -#define MAC_EXTADDR_2_HIGH 0x00000540 -#define MAC_EXTADDR_2_LOW 0x00000544 -#define MAC_EXTADDR_3_HIGH 0x00000548 -#define MAC_EXTADDR_3_LOW 0x0000054c -#define MAC_EXTADDR_4_HIGH 0x00000550 -#define MAC_EXTADDR_4_LOW 0x00000554 -#define MAC_EXTADDR_5_HIGH 0x00000558 -#define MAC_EXTADDR_5_LOW 0x0000055c -#define MAC_EXTADDR_6_HIGH 0x00000560 -#define MAC_EXTADDR_6_LOW 0x00000564 -#define MAC_EXTADDR_7_HIGH 0x00000568 -#define MAC_EXTADDR_7_LOW 0x0000056c -#define MAC_EXTADDR_8_HIGH 0x00000570 -#define MAC_EXTADDR_8_LOW 0x00000574 -#define MAC_EXTADDR_9_HIGH 0x00000578 -#define MAC_EXTADDR_9_LOW 0x0000057c -#define MAC_EXTADDR_10_HIGH 0x00000580 -#define MAC_EXTADDR_10_LOW 0x00000584 -#define MAC_EXTADDR_11_HIGH 0x00000588 -#define MAC_EXTADDR_11_LOW 0x0000058c -#define MAC_SERDES_CFG 0x00000590 -#define MAC_SERDES_CFG_EDGE_SELECT 0x00001000 -#define MAC_SERDES_STAT 0x00000594 -/* 0x598 --> 0x5a0 unused */ -#define MAC_PHYCFG1 0x000005a0 -#define MAC_PHYCFG1_RGMII_INT 0x00000001 -#define MAC_PHYCFG1_RXCLK_TO_MASK 0x00001ff0 -#define MAC_PHYCFG1_RXCLK_TIMEOUT 0x00001000 -#define MAC_PHYCFG1_TXCLK_TO_MASK 0x01ff0000 -#define MAC_PHYCFG1_TXCLK_TIMEOUT 0x01000000 -#define MAC_PHYCFG1_RGMII_EXT_RX_DEC 0x02000000 -#define MAC_PHYCFG1_RGMII_SND_STAT_EN 0x04000000 -#define MAC_PHYCFG1_TXC_DRV 0x20000000 -#define MAC_PHYCFG2 0x000005a4 -#define MAC_PHYCFG2_INBAND_ENABLE 0x00000001 -#define MAC_PHYCFG2_EMODE_MASK_MASK 0x000001c0 -#define MAC_PHYCFG2_EMODE_MASK_AC131 0x000000c0 -#define MAC_PHYCFG2_EMODE_MASK_50610 0x00000100 -#define MAC_PHYCFG2_EMODE_MASK_RT8211 0x00000000 -#define MAC_PHYCFG2_EMODE_MASK_RT8201 0x000001c0 -#define MAC_PHYCFG2_EMODE_COMP_MASK 0x00000e00 -#define MAC_PHYCFG2_EMODE_COMP_AC131 0x00000600 -#define MAC_PHYCFG2_EMODE_COMP_50610 0x00000400 -#define MAC_PHYCFG2_EMODE_COMP_RT8211 0x00000800 -#define MAC_PHYCFG2_EMODE_COMP_RT8201 0x00000000 -#define MAC_PHYCFG2_FMODE_MASK_MASK 0x00007000 -#define MAC_PHYCFG2_FMODE_MASK_AC131 0x00006000 -#define MAC_PHYCFG2_FMODE_MASK_50610 0x00004000 -#define MAC_PHYCFG2_FMODE_MASK_RT8211 0x00000000 -#define MAC_PHYCFG2_FMODE_MASK_RT8201 0x00007000 -#define MAC_PHYCFG2_FMODE_COMP_MASK 0x00038000 -#define MAC_PHYCFG2_FMODE_COMP_AC131 0x00030000 -#define MAC_PHYCFG2_FMODE_COMP_50610 0x00008000 -#define MAC_PHYCFG2_FMODE_COMP_RT8211 0x00038000 -#define MAC_PHYCFG2_FMODE_COMP_RT8201 0x00000000 -#define MAC_PHYCFG2_GMODE_MASK_MASK 0x001c0000 -#define MAC_PHYCFG2_GMODE_MASK_AC131 0x001c0000 -#define MAC_PHYCFG2_GMODE_MASK_50610 0x00100000 -#define MAC_PHYCFG2_GMODE_MASK_RT8211 0x00000000 -#define MAC_PHYCFG2_GMODE_MASK_RT8201 0x001c0000 -#define MAC_PHYCFG2_GMODE_COMP_MASK 0x00e00000 -#define MAC_PHYCFG2_GMODE_COMP_AC131 0x00e00000 -#define MAC_PHYCFG2_GMODE_COMP_50610 0x00000000 -#define MAC_PHYCFG2_GMODE_COMP_RT8211 0x00200000 -#define MAC_PHYCFG2_GMODE_COMP_RT8201 0x00000000 -#define MAC_PHYCFG2_ACT_MASK_MASK 0x03000000 -#define MAC_PHYCFG2_ACT_MASK_AC131 0x03000000 -#define MAC_PHYCFG2_ACT_MASK_50610 0x01000000 -#define MAC_PHYCFG2_ACT_MASK_RT8211 0x03000000 -#define MAC_PHYCFG2_ACT_MASK_RT8201 0x01000000 -#define MAC_PHYCFG2_ACT_COMP_MASK 0x0c000000 -#define MAC_PHYCFG2_ACT_COMP_AC131 0x00000000 -#define MAC_PHYCFG2_ACT_COMP_50610 0x00000000 -#define MAC_PHYCFG2_ACT_COMP_RT8211 0x00000000 -#define MAC_PHYCFG2_ACT_COMP_RT8201 0x08000000 -#define MAC_PHYCFG2_QUAL_MASK_MASK 0x30000000 -#define MAC_PHYCFG2_QUAL_MASK_AC131 0x30000000 -#define MAC_PHYCFG2_QUAL_MASK_50610 0x30000000 -#define MAC_PHYCFG2_QUAL_MASK_RT8211 0x30000000 -#define MAC_PHYCFG2_QUAL_MASK_RT8201 0x30000000 -#define MAC_PHYCFG2_QUAL_COMP_MASK 0xc0000000 -#define MAC_PHYCFG2_QUAL_COMP_AC131 0x00000000 -#define MAC_PHYCFG2_QUAL_COMP_50610 0x00000000 -#define MAC_PHYCFG2_QUAL_COMP_RT8211 0x00000000 -#define MAC_PHYCFG2_QUAL_COMP_RT8201 0x00000000 -#define MAC_PHYCFG2_50610_LED_MODES \ - (MAC_PHYCFG2_EMODE_MASK_50610 | \ - MAC_PHYCFG2_EMODE_COMP_50610 | \ - MAC_PHYCFG2_FMODE_MASK_50610 | \ - MAC_PHYCFG2_FMODE_COMP_50610 | \ - MAC_PHYCFG2_GMODE_MASK_50610 | \ - MAC_PHYCFG2_GMODE_COMP_50610 | \ - MAC_PHYCFG2_ACT_MASK_50610 | \ - MAC_PHYCFG2_ACT_COMP_50610 | \ - MAC_PHYCFG2_QUAL_MASK_50610 | \ - MAC_PHYCFG2_QUAL_COMP_50610) -#define MAC_PHYCFG2_AC131_LED_MODES \ - (MAC_PHYCFG2_EMODE_MASK_AC131 | \ - MAC_PHYCFG2_EMODE_COMP_AC131 | \ - MAC_PHYCFG2_FMODE_MASK_AC131 | \ - MAC_PHYCFG2_FMODE_COMP_AC131 | \ - MAC_PHYCFG2_GMODE_MASK_AC131 | \ - MAC_PHYCFG2_GMODE_COMP_AC131 | \ - MAC_PHYCFG2_ACT_MASK_AC131 | \ - MAC_PHYCFG2_ACT_COMP_AC131 | \ - MAC_PHYCFG2_QUAL_MASK_AC131 | \ - MAC_PHYCFG2_QUAL_COMP_AC131) -#define MAC_PHYCFG2_RTL8211C_LED_MODES \ - (MAC_PHYCFG2_EMODE_MASK_RT8211 | \ - MAC_PHYCFG2_EMODE_COMP_RT8211 | \ - MAC_PHYCFG2_FMODE_MASK_RT8211 | \ - MAC_PHYCFG2_FMODE_COMP_RT8211 | \ - MAC_PHYCFG2_GMODE_MASK_RT8211 | \ - MAC_PHYCFG2_GMODE_COMP_RT8211 | \ - MAC_PHYCFG2_ACT_MASK_RT8211 | \ - MAC_PHYCFG2_ACT_COMP_RT8211 | \ - MAC_PHYCFG2_QUAL_MASK_RT8211 | \ - MAC_PHYCFG2_QUAL_COMP_RT8211) -#define MAC_PHYCFG2_RTL8201E_LED_MODES \ - (MAC_PHYCFG2_EMODE_MASK_RT8201 | \ - MAC_PHYCFG2_EMODE_COMP_RT8201 | \ - MAC_PHYCFG2_FMODE_MASK_RT8201 | \ - MAC_PHYCFG2_FMODE_COMP_RT8201 | \ - MAC_PHYCFG2_GMODE_MASK_RT8201 | \ - MAC_PHYCFG2_GMODE_COMP_RT8201 | \ - MAC_PHYCFG2_ACT_MASK_RT8201 | \ - MAC_PHYCFG2_ACT_COMP_RT8201 | \ - MAC_PHYCFG2_QUAL_MASK_RT8201 | \ - MAC_PHYCFG2_QUAL_COMP_RT8201) -#define MAC_EXT_RGMII_MODE 0x000005a8 -#define MAC_RGMII_MODE_TX_ENABLE 0x00000001 -#define MAC_RGMII_MODE_TX_LOWPWR 0x00000002 -#define MAC_RGMII_MODE_TX_RESET 0x00000004 -#define MAC_RGMII_MODE_RX_INT_B 0x00000100 -#define MAC_RGMII_MODE_RX_QUALITY 0x00000200 -#define MAC_RGMII_MODE_RX_ACTIVITY 0x00000400 -#define MAC_RGMII_MODE_RX_ENG_DET 0x00000800 -/* 0x5ac --> 0x5b0 unused */ -#define SERDES_RX_CTRL 0x000005b0 /* 5780/5714 only */ -#define SERDES_RX_SIG_DETECT 0x00000400 -#define SG_DIG_CTRL 0x000005b0 -#define SG_DIG_USING_HW_AUTONEG 0x80000000 -#define SG_DIG_SOFT_RESET 0x40000000 -#define SG_DIG_DISABLE_LINKRDY 0x20000000 -#define SG_DIG_CRC16_CLEAR_N 0x01000000 -#define SG_DIG_EN10B 0x00800000 -#define SG_DIG_CLEAR_STATUS 0x00400000 -#define SG_DIG_LOCAL_DUPLEX_STATUS 0x00200000 -#define SG_DIG_LOCAL_LINK_STATUS 0x00100000 -#define SG_DIG_SPEED_STATUS_MASK 0x000c0000 -#define SG_DIG_SPEED_STATUS_SHIFT 18 -#define SG_DIG_JUMBO_PACKET_DISABLE 0x00020000 -#define SG_DIG_RESTART_AUTONEG 0x00010000 -#define SG_DIG_FIBER_MODE 0x00008000 -#define SG_DIG_REMOTE_FAULT_MASK 0x00006000 -#define SG_DIG_PAUSE_MASK 0x00001800 -#define SG_DIG_PAUSE_CAP 0x00000800 -#define SG_DIG_ASYM_PAUSE 0x00001000 -#define SG_DIG_GBIC_ENABLE 0x00000400 -#define SG_DIG_CHECK_END_ENABLE 0x00000200 -#define SG_DIG_SGMII_AUTONEG_TIMER 0x00000100 -#define SG_DIG_CLOCK_PHASE_SELECT 0x00000080 -#define SG_DIG_GMII_INPUT_SELECT 0x00000040 -#define SG_DIG_MRADV_CRC16_SELECT 0x00000020 -#define SG_DIG_COMMA_DETECT_ENABLE 0x00000010 -#define SG_DIG_AUTONEG_TIMER_REDUCE 0x00000008 -#define SG_DIG_AUTONEG_LOW_ENABLE 0x00000004 -#define SG_DIG_REMOTE_LOOPBACK 0x00000002 -#define SG_DIG_LOOPBACK 0x00000001 -#define SG_DIG_COMMON_SETUP (SG_DIG_CRC16_CLEAR_N | \ - SG_DIG_LOCAL_DUPLEX_STATUS | \ - SG_DIG_LOCAL_LINK_STATUS | \ - (0x2 << SG_DIG_SPEED_STATUS_SHIFT) | \ - SG_DIG_FIBER_MODE | SG_DIG_GBIC_ENABLE) -#define SG_DIG_STATUS 0x000005b4 -#define SG_DIG_CRC16_BUS_MASK 0xffff0000 -#define SG_DIG_PARTNER_FAULT_MASK 0x00600000 /* If !MRADV_CRC16_SELECT */ -#define SG_DIG_PARTNER_ASYM_PAUSE 0x00100000 /* If !MRADV_CRC16_SELECT */ -#define SG_DIG_PARTNER_PAUSE_CAPABLE 0x00080000 /* If !MRADV_CRC16_SELECT */ -#define SG_DIG_PARTNER_HALF_DUPLEX 0x00040000 /* If !MRADV_CRC16_SELECT */ -#define SG_DIG_PARTNER_FULL_DUPLEX 0x00020000 /* If !MRADV_CRC16_SELECT */ -#define SG_DIG_PARTNER_NEXT_PAGE 0x00010000 /* If !MRADV_CRC16_SELECT */ -#define SG_DIG_AUTONEG_STATE_MASK 0x00000ff0 -#define SG_DIG_IS_SERDES 0x00000100 -#define SG_DIG_COMMA_DETECTOR 0x00000008 -#define SG_DIG_MAC_ACK_STATUS 0x00000004 -#define SG_DIG_AUTONEG_COMPLETE 0x00000002 -#define SG_DIG_AUTONEG_ERROR 0x00000001 -#define TG3_TX_TSTAMP_LSB 0x000005c0 -#define TG3_TX_TSTAMP_MSB 0x000005c4 -#define TG3_TSTAMP_MASK 0x7fffffffffffffffLL -/* 0x5c8 --> 0x600 unused */ -#define MAC_TX_MAC_STATE_BASE 0x00000600 /* 16 bytes */ -#define MAC_RX_MAC_STATE_BASE 0x00000610 /* 20 bytes */ -/* 0x624 --> 0x670 unused */ - -#define MAC_RSS_INDIR_TBL_0 0x00000630 - -#define MAC_RSS_HASH_KEY_0 0x00000670 -#define MAC_RSS_HASH_KEY_1 0x00000674 -#define MAC_RSS_HASH_KEY_2 0x00000678 -#define MAC_RSS_HASH_KEY_3 0x0000067c -#define MAC_RSS_HASH_KEY_4 0x00000680 -#define MAC_RSS_HASH_KEY_5 0x00000684 -#define MAC_RSS_HASH_KEY_6 0x00000688 -#define MAC_RSS_HASH_KEY_7 0x0000068c -#define MAC_RSS_HASH_KEY_8 0x00000690 -#define MAC_RSS_HASH_KEY_9 0x00000694 -/* 0x698 --> 0x6b0 unused */ - -#define TG3_RX_TSTAMP_LSB 0x000006b0 -#define TG3_RX_TSTAMP_MSB 0x000006b4 -/* 0x6b8 --> 0x6c8 unused */ - -#define TG3_RX_PTP_CTL 0x000006c8 -#define TG3_RX_PTP_CTL_SYNC_EVNT 0x00000001 -#define TG3_RX_PTP_CTL_DELAY_REQ 0x00000002 -#define TG3_RX_PTP_CTL_PDLAY_REQ 0x00000004 -#define TG3_RX_PTP_CTL_PDLAY_RES 0x00000008 -#define TG3_RX_PTP_CTL_ALL_V1_EVENTS (TG3_RX_PTP_CTL_SYNC_EVNT | \ - TG3_RX_PTP_CTL_DELAY_REQ) -#define TG3_RX_PTP_CTL_ALL_V2_EVENTS (TG3_RX_PTP_CTL_SYNC_EVNT | \ - TG3_RX_PTP_CTL_DELAY_REQ | \ - TG3_RX_PTP_CTL_PDLAY_REQ | \ - TG3_RX_PTP_CTL_PDLAY_RES) -#define TG3_RX_PTP_CTL_FOLLOW_UP 0x00000100 -#define TG3_RX_PTP_CTL_DELAY_RES 0x00000200 -#define TG3_RX_PTP_CTL_PDRES_FLW_UP 0x00000400 -#define TG3_RX_PTP_CTL_ANNOUNCE 0x00000800 -#define TG3_RX_PTP_CTL_SIGNALING 0x00001000 -#define TG3_RX_PTP_CTL_MANAGEMENT 0x00002000 -#define TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN 0x00800000 -#define TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN 0x01000000 -#define TG3_RX_PTP_CTL_RX_PTP_V2_EN (TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | \ - TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN) -#define TG3_RX_PTP_CTL_RX_PTP_V1_EN 0x02000000 -#define TG3_RX_PTP_CTL_HWTS_INTERLOCK 0x04000000 -/* 0x6cc --> 0x800 unused */ - -#define MAC_TX_STATS_OCTETS 0x00000800 -#define MAC_TX_STATS_RESV1 0x00000804 -#define MAC_TX_STATS_COLLISIONS 0x00000808 -#define MAC_TX_STATS_XON_SENT 0x0000080c -#define MAC_TX_STATS_XOFF_SENT 0x00000810 -#define MAC_TX_STATS_RESV2 0x00000814 -#define MAC_TX_STATS_MAC_ERRORS 0x00000818 -#define MAC_TX_STATS_SINGLE_COLLISIONS 0x0000081c -#define MAC_TX_STATS_MULT_COLLISIONS 0x00000820 -#define MAC_TX_STATS_DEFERRED 0x00000824 -#define MAC_TX_STATS_RESV3 0x00000828 -#define MAC_TX_STATS_EXCESSIVE_COL 0x0000082c -#define MAC_TX_STATS_LATE_COL 0x00000830 -#define MAC_TX_STATS_RESV4_1 0x00000834 -#define MAC_TX_STATS_RESV4_2 0x00000838 -#define MAC_TX_STATS_RESV4_3 0x0000083c -#define MAC_TX_STATS_RESV4_4 0x00000840 -#define MAC_TX_STATS_RESV4_5 0x00000844 -#define MAC_TX_STATS_RESV4_6 0x00000848 -#define MAC_TX_STATS_RESV4_7 0x0000084c -#define MAC_TX_STATS_RESV4_8 0x00000850 -#define MAC_TX_STATS_RESV4_9 0x00000854 -#define MAC_TX_STATS_RESV4_10 0x00000858 -#define MAC_TX_STATS_RESV4_11 0x0000085c -#define MAC_TX_STATS_RESV4_12 0x00000860 -#define MAC_TX_STATS_RESV4_13 0x00000864 -#define MAC_TX_STATS_RESV4_14 0x00000868 -#define MAC_TX_STATS_UCAST 0x0000086c -#define MAC_TX_STATS_MCAST 0x00000870 -#define MAC_TX_STATS_BCAST 0x00000874 -#define MAC_TX_STATS_RESV5_1 0x00000878 -#define MAC_TX_STATS_RESV5_2 0x0000087c -#define MAC_RX_STATS_OCTETS 0x00000880 -#define MAC_RX_STATS_RESV1 0x00000884 -#define MAC_RX_STATS_FRAGMENTS 0x00000888 -#define MAC_RX_STATS_UCAST 0x0000088c -#define MAC_RX_STATS_MCAST 0x00000890 -#define MAC_RX_STATS_BCAST 0x00000894 -#define MAC_RX_STATS_FCS_ERRORS 0x00000898 -#define MAC_RX_STATS_ALIGN_ERRORS 0x0000089c -#define MAC_RX_STATS_XON_PAUSE_RECVD 0x000008a0 -#define MAC_RX_STATS_XOFF_PAUSE_RECVD 0x000008a4 -#define MAC_RX_STATS_MAC_CTRL_RECVD 0x000008a8 -#define MAC_RX_STATS_XOFF_ENTERED 0x000008ac -#define MAC_RX_STATS_FRAME_TOO_LONG 0x000008b0 -#define MAC_RX_STATS_JABBERS 0x000008b4 -#define MAC_RX_STATS_UNDERSIZE 0x000008b8 -/* 0x8bc --> 0xc00 unused */ - -/* Send data initiator control registers */ -#define SNDDATAI_MODE 0x00000c00 -#define SNDDATAI_MODE_RESET 0x00000001 -#define SNDDATAI_MODE_ENABLE 0x00000002 -#define SNDDATAI_MODE_STAT_OFLOW_ENAB 0x00000004 -#define SNDDATAI_STATUS 0x00000c04 -#define SNDDATAI_STATUS_STAT_OFLOW 0x00000004 -#define SNDDATAI_STATSCTRL 0x00000c08 -#define SNDDATAI_SCTRL_ENABLE 0x00000001 -#define SNDDATAI_SCTRL_FASTUPD 0x00000002 -#define SNDDATAI_SCTRL_CLEAR 0x00000004 -#define SNDDATAI_SCTRL_FLUSH 0x00000008 -#define SNDDATAI_SCTRL_FORCE_ZERO 0x00000010 -#define SNDDATAI_STATSENAB 0x00000c0c -#define SNDDATAI_STATSINCMASK 0x00000c10 -#define ISO_PKT_TX 0x00000c20 -/* 0xc24 --> 0xc80 unused */ -#define SNDDATAI_COS_CNT_0 0x00000c80 -#define SNDDATAI_COS_CNT_1 0x00000c84 -#define SNDDATAI_COS_CNT_2 0x00000c88 -#define SNDDATAI_COS_CNT_3 0x00000c8c -#define SNDDATAI_COS_CNT_4 0x00000c90 -#define SNDDATAI_COS_CNT_5 0x00000c94 -#define SNDDATAI_COS_CNT_6 0x00000c98 -#define SNDDATAI_COS_CNT_7 0x00000c9c -#define SNDDATAI_COS_CNT_8 0x00000ca0 -#define SNDDATAI_COS_CNT_9 0x00000ca4 -#define SNDDATAI_COS_CNT_10 0x00000ca8 -#define SNDDATAI_COS_CNT_11 0x00000cac -#define SNDDATAI_COS_CNT_12 0x00000cb0 -#define SNDDATAI_COS_CNT_13 0x00000cb4 -#define SNDDATAI_COS_CNT_14 0x00000cb8 -#define SNDDATAI_COS_CNT_15 0x00000cbc -#define SNDDATAI_DMA_RDQ_FULL_CNT 0x00000cc0 -#define SNDDATAI_DMA_PRIO_RDQ_FULL_CNT 0x00000cc4 -#define SNDDATAI_SDCQ_FULL_CNT 0x00000cc8 -#define SNDDATAI_NICRNG_SSND_PIDX_CNT 0x00000ccc -#define SNDDATAI_STATS_UPDATED_CNT 0x00000cd0 -#define SNDDATAI_INTERRUPTS_CNT 0x00000cd4 -#define SNDDATAI_AVOID_INTERRUPTS_CNT 0x00000cd8 -#define SNDDATAI_SND_THRESH_HIT_CNT 0x00000cdc -/* 0xce0 --> 0x1000 unused */ - -/* Send data completion control registers */ -#define SNDDATAC_MODE 0x00001000 -#define SNDDATAC_MODE_RESET 0x00000001 -#define SNDDATAC_MODE_ENABLE 0x00000002 -#define SNDDATAC_MODE_CDELAY 0x00000010 -/* 0x1004 --> 0x1400 unused */ - -/* Send BD ring selector */ -#define SNDBDS_MODE 0x00001400 -#define SNDBDS_MODE_RESET 0x00000001 -#define SNDBDS_MODE_ENABLE 0x00000002 -#define SNDBDS_MODE_ATTN_ENABLE 0x00000004 -#define SNDBDS_STATUS 0x00001404 -#define SNDBDS_STATUS_ERROR_ATTN 0x00000004 -#define SNDBDS_HWDIAG 0x00001408 -/* 0x140c --> 0x1440 */ -#define SNDBDS_SEL_CON_IDX_0 0x00001440 -#define SNDBDS_SEL_CON_IDX_1 0x00001444 -#define SNDBDS_SEL_CON_IDX_2 0x00001448 -#define SNDBDS_SEL_CON_IDX_3 0x0000144c -#define SNDBDS_SEL_CON_IDX_4 0x00001450 -#define SNDBDS_SEL_CON_IDX_5 0x00001454 -#define SNDBDS_SEL_CON_IDX_6 0x00001458 -#define SNDBDS_SEL_CON_IDX_7 0x0000145c -#define SNDBDS_SEL_CON_IDX_8 0x00001460 -#define SNDBDS_SEL_CON_IDX_9 0x00001464 -#define SNDBDS_SEL_CON_IDX_10 0x00001468 -#define SNDBDS_SEL_CON_IDX_11 0x0000146c -#define SNDBDS_SEL_CON_IDX_12 0x00001470 -#define SNDBDS_SEL_CON_IDX_13 0x00001474 -#define SNDBDS_SEL_CON_IDX_14 0x00001478 -#define SNDBDS_SEL_CON_IDX_15 0x0000147c -/* 0x1480 --> 0x1800 unused */ - -/* Send BD initiator control registers */ -#define SNDBDI_MODE 0x00001800 -#define SNDBDI_MODE_RESET 0x00000001 -#define SNDBDI_MODE_ENABLE 0x00000002 -#define SNDBDI_MODE_ATTN_ENABLE 0x00000004 -#define SNDBDI_MODE_MULTI_TXQ_EN 0x00000020 -#define SNDBDI_STATUS 0x00001804 -#define SNDBDI_STATUS_ERROR_ATTN 0x00000004 -#define SNDBDI_IN_PROD_IDX_0 0x00001808 -#define SNDBDI_IN_PROD_IDX_1 0x0000180c -#define SNDBDI_IN_PROD_IDX_2 0x00001810 -#define SNDBDI_IN_PROD_IDX_3 0x00001814 -#define SNDBDI_IN_PROD_IDX_4 0x00001818 -#define SNDBDI_IN_PROD_IDX_5 0x0000181c -#define SNDBDI_IN_PROD_IDX_6 0x00001820 -#define SNDBDI_IN_PROD_IDX_7 0x00001824 -#define SNDBDI_IN_PROD_IDX_8 0x00001828 -#define SNDBDI_IN_PROD_IDX_9 0x0000182c -#define SNDBDI_IN_PROD_IDX_10 0x00001830 -#define SNDBDI_IN_PROD_IDX_11 0x00001834 -#define SNDBDI_IN_PROD_IDX_12 0x00001838 -#define SNDBDI_IN_PROD_IDX_13 0x0000183c -#define SNDBDI_IN_PROD_IDX_14 0x00001840 -#define SNDBDI_IN_PROD_IDX_15 0x00001844 -/* 0x1848 --> 0x1c00 unused */ - -/* Send BD completion control registers */ -#define SNDBDC_MODE 0x00001c00 -#define SNDBDC_MODE_RESET 0x00000001 -#define SNDBDC_MODE_ENABLE 0x00000002 -#define SNDBDC_MODE_ATTN_ENABLE 0x00000004 -/* 0x1c04 --> 0x2000 unused */ - -/* Receive list placement control registers */ -#define RCVLPC_MODE 0x00002000 -#define RCVLPC_MODE_RESET 0x00000001 -#define RCVLPC_MODE_ENABLE 0x00000002 -#define RCVLPC_MODE_CLASS0_ATTN_ENAB 0x00000004 -#define RCVLPC_MODE_MAPOOR_AATTN_ENAB 0x00000008 -#define RCVLPC_MODE_STAT_OFLOW_ENAB 0x00000010 -#define RCVLPC_STATUS 0x00002004 -#define RCVLPC_STATUS_CLASS0 0x00000004 -#define RCVLPC_STATUS_MAPOOR 0x00000008 -#define RCVLPC_STATUS_STAT_OFLOW 0x00000010 -#define RCVLPC_LOCK 0x00002008 -#define RCVLPC_LOCK_REQ_MASK 0x0000ffff -#define RCVLPC_LOCK_REQ_SHIFT 0 -#define RCVLPC_LOCK_GRANT_MASK 0xffff0000 -#define RCVLPC_LOCK_GRANT_SHIFT 16 -#define RCVLPC_NON_EMPTY_BITS 0x0000200c -#define RCVLPC_NON_EMPTY_BITS_MASK 0x0000ffff -#define RCVLPC_CONFIG 0x00002010 -#define RCVLPC_STATSCTRL 0x00002014 -#define RCVLPC_STATSCTRL_ENABLE 0x00000001 -#define RCVLPC_STATSCTRL_FASTUPD 0x00000002 -#define RCVLPC_STATS_ENABLE 0x00002018 -#define RCVLPC_STATSENAB_ASF_FIX 0x00000002 -#define RCVLPC_STATSENAB_DACK_FIX 0x00040000 -#define RCVLPC_STATSENAB_LNGBRST_RFIX 0x00400000 -#define RCVLPC_STATS_INCMASK 0x0000201c -/* 0x2020 --> 0x2100 unused */ -#define RCVLPC_SELLST_BASE 0x00002100 /* 16 16-byte entries */ -#define SELLST_TAIL 0x00000004 -#define SELLST_CONT 0x00000008 -#define SELLST_UNUSED 0x0000000c -#define RCVLPC_COS_CNTL_BASE 0x00002200 /* 16 4-byte entries */ -#define RCVLPC_DROP_FILTER_CNT 0x00002240 -#define RCVLPC_DMA_WQ_FULL_CNT 0x00002244 -#define RCVLPC_DMA_HIPRIO_WQ_FULL_CNT 0x00002248 -#define RCVLPC_NO_RCV_BD_CNT 0x0000224c -#define RCVLPC_IN_DISCARDS_CNT 0x00002250 -#define RCVLPC_IN_ERRORS_CNT 0x00002254 -#define RCVLPC_RCV_THRESH_HIT_CNT 0x00002258 -/* 0x225c --> 0x2400 unused */ - -/* Receive Data and Receive BD Initiator Control */ -#define RCVDBDI_MODE 0x00002400 -#define RCVDBDI_MODE_RESET 0x00000001 -#define RCVDBDI_MODE_ENABLE 0x00000002 -#define RCVDBDI_MODE_JUMBOBD_NEEDED 0x00000004 -#define RCVDBDI_MODE_FRM_TOO_BIG 0x00000008 -#define RCVDBDI_MODE_INV_RING_SZ 0x00000010 -#define RCVDBDI_MODE_LRG_RING_SZ 0x00010000 -#define RCVDBDI_STATUS 0x00002404 -#define RCVDBDI_STATUS_JUMBOBD_NEEDED 0x00000004 -#define RCVDBDI_STATUS_FRM_TOO_BIG 0x00000008 -#define RCVDBDI_STATUS_INV_RING_SZ 0x00000010 -#define RCVDBDI_SPLIT_FRAME_MINSZ 0x00002408 -/* 0x240c --> 0x2440 unused */ -#define RCVDBDI_JUMBO_BD 0x00002440 /* TG3_BDINFO_... */ -#define RCVDBDI_STD_BD 0x00002450 /* TG3_BDINFO_... */ -#define RCVDBDI_MINI_BD 0x00002460 /* TG3_BDINFO_... */ -#define RCVDBDI_JUMBO_CON_IDX 0x00002470 -#define RCVDBDI_STD_CON_IDX 0x00002474 -#define RCVDBDI_MINI_CON_IDX 0x00002478 -/* 0x247c --> 0x2480 unused */ -#define RCVDBDI_BD_PROD_IDX_0 0x00002480 -#define RCVDBDI_BD_PROD_IDX_1 0x00002484 -#define RCVDBDI_BD_PROD_IDX_2 0x00002488 -#define RCVDBDI_BD_PROD_IDX_3 0x0000248c -#define RCVDBDI_BD_PROD_IDX_4 0x00002490 -#define RCVDBDI_BD_PROD_IDX_5 0x00002494 -#define RCVDBDI_BD_PROD_IDX_6 0x00002498 -#define RCVDBDI_BD_PROD_IDX_7 0x0000249c -#define RCVDBDI_BD_PROD_IDX_8 0x000024a0 -#define RCVDBDI_BD_PROD_IDX_9 0x000024a4 -#define RCVDBDI_BD_PROD_IDX_10 0x000024a8 -#define RCVDBDI_BD_PROD_IDX_11 0x000024ac -#define RCVDBDI_BD_PROD_IDX_12 0x000024b0 -#define RCVDBDI_BD_PROD_IDX_13 0x000024b4 -#define RCVDBDI_BD_PROD_IDX_14 0x000024b8 -#define RCVDBDI_BD_PROD_IDX_15 0x000024bc -#define RCVDBDI_HWDIAG 0x000024c0 -/* 0x24c4 --> 0x2800 unused */ - -/* Receive Data Completion Control */ -#define RCVDCC_MODE 0x00002800 -#define RCVDCC_MODE_RESET 0x00000001 -#define RCVDCC_MODE_ENABLE 0x00000002 -#define RCVDCC_MODE_ATTN_ENABLE 0x00000004 -/* 0x2804 --> 0x2c00 unused */ - -/* Receive BD Initiator Control Registers */ -#define RCVBDI_MODE 0x00002c00 -#define RCVBDI_MODE_RESET 0x00000001 -#define RCVBDI_MODE_ENABLE 0x00000002 -#define RCVBDI_MODE_RCB_ATTN_ENAB 0x00000004 -#define RCVBDI_STATUS 0x00002c04 -#define RCVBDI_STATUS_RCB_ATTN 0x00000004 -#define RCVBDI_JUMBO_PROD_IDX 0x00002c08 -#define RCVBDI_STD_PROD_IDX 0x00002c0c -#define RCVBDI_MINI_PROD_IDX 0x00002c10 -#define RCVBDI_MINI_THRESH 0x00002c14 -#define RCVBDI_STD_THRESH 0x00002c18 -#define RCVBDI_JUMBO_THRESH 0x00002c1c -/* 0x2c20 --> 0x2d00 unused */ - -#define STD_REPLENISH_LWM 0x00002d00 -#define JMB_REPLENISH_LWM 0x00002d04 -/* 0x2d08 --> 0x3000 unused */ - -/* Receive BD Completion Control Registers */ -#define RCVCC_MODE 0x00003000 -#define RCVCC_MODE_RESET 0x00000001 -#define RCVCC_MODE_ENABLE 0x00000002 -#define RCVCC_MODE_ATTN_ENABLE 0x00000004 -#define RCVCC_STATUS 0x00003004 -#define RCVCC_STATUS_ERROR_ATTN 0x00000004 -#define RCVCC_JUMP_PROD_IDX 0x00003008 -#define RCVCC_STD_PROD_IDX 0x0000300c -#define RCVCC_MINI_PROD_IDX 0x00003010 -/* 0x3014 --> 0x3400 unused */ - -/* Receive list selector control registers */ -#define RCVLSC_MODE 0x00003400 -#define RCVLSC_MODE_RESET 0x00000001 -#define RCVLSC_MODE_ENABLE 0x00000002 -#define RCVLSC_MODE_ATTN_ENABLE 0x00000004 -#define RCVLSC_STATUS 0x00003404 -#define RCVLSC_STATUS_ERROR_ATTN 0x00000004 -/* 0x3408 --> 0x3600 unused */ - -#define TG3_CPMU_DRV_STATUS 0x0000344c - -/* CPMU registers */ -#define TG3_CPMU_CTRL 0x00003600 -#define CPMU_CTRL_LINK_IDLE_MODE 0x00000200 -#define CPMU_CTRL_LINK_AWARE_MODE 0x00000400 -#define CPMU_CTRL_LINK_SPEED_MODE 0x00004000 -#define CPMU_CTRL_GPHY_10MB_RXONLY 0x00010000 -#define TG3_CPMU_LSPD_10MB_CLK 0x00003604 -#define CPMU_LSPD_10MB_MACCLK_MASK 0x001f0000 -#define CPMU_LSPD_10MB_MACCLK_6_25 0x00130000 -/* 0x3608 --> 0x360c unused */ - -#define TG3_CPMU_LSPD_1000MB_CLK 0x0000360c -#define CPMU_LSPD_1000MB_MACCLK_62_5 0x00000000 -#define CPMU_LSPD_1000MB_MACCLK_12_5 0x00110000 -#define CPMU_LSPD_1000MB_MACCLK_MASK 0x001f0000 -#define TG3_CPMU_LNK_AWARE_PWRMD 0x00003610 -#define CPMU_LNK_AWARE_MACCLK_MASK 0x001f0000 -#define CPMU_LNK_AWARE_MACCLK_6_25 0x00130000 -/* 0x3614 --> 0x361c unused */ - -#define TG3_CPMU_HST_ACC 0x0000361c -#define CPMU_HST_ACC_MACCLK_MASK 0x001f0000 -#define CPMU_HST_ACC_MACCLK_6_25 0x00130000 -/* 0x3620 --> 0x3630 unused */ - -#define TG3_CPMU_CLCK_ORIDE 0x00003624 -#define CPMU_CLCK_ORIDE_MAC_ORIDE_EN 0x80000000 - -#define TG3_CPMU_CLCK_ORIDE_ENABLE 0x00003628 -#define TG3_CPMU_MAC_ORIDE_ENABLE (1 << 13) - -#define TG3_CPMU_STATUS 0x0000362c -#define TG3_CPMU_STATUS_FMSK_5717 0x20000000 -#define TG3_CPMU_STATUS_FMSK_5719 0xc0000000 -#define TG3_CPMU_STATUS_FSHFT_5719 30 -#define TG3_CPMU_STATUS_LINK_MASK 0x180000 - -#define TG3_CPMU_CLCK_STAT 0x00003630 -#define CPMU_CLCK_STAT_MAC_CLCK_MASK 0x001f0000 -#define CPMU_CLCK_STAT_MAC_CLCK_62_5 0x00000000 -#define CPMU_CLCK_STAT_MAC_CLCK_12_5 0x00110000 -#define CPMU_CLCK_STAT_MAC_CLCK_6_25 0x00130000 -/* 0x3634 --> 0x365c unused */ - -#define TG3_CPMU_MUTEX_REQ 0x0000365c -#define CPMU_MUTEX_REQ_DRIVER 0x00001000 -#define TG3_CPMU_MUTEX_GNT 0x00003660 -#define CPMU_MUTEX_GNT_DRIVER 0x00001000 -#define TG3_CPMU_PHY_STRAP 0x00003664 -#define TG3_CPMU_PHY_STRAP_IS_SERDES 0x00000020 -#define TG3_CPMU_PADRNG_CTL 0x00003668 -#define TG3_CPMU_PADRNG_CTL_RDIV2 0x00040000 -/* 0x3664 --> 0x36b0 unused */ - -#define TG3_CPMU_EEE_MODE 0x000036b0 -#define TG3_CPMU_EEEMD_APE_TX_DET_EN 0x00000004 -#define TG3_CPMU_EEEMD_ERLY_L1_XIT_DET 0x00000008 -#define TG3_CPMU_EEEMD_SND_IDX_DET_EN 0x00000040 -#define TG3_CPMU_EEEMD_LPI_ENABLE 0x00000080 -#define TG3_CPMU_EEEMD_LPI_IN_TX 0x00000100 -#define TG3_CPMU_EEEMD_LPI_IN_RX 0x00000200 -#define TG3_CPMU_EEEMD_EEE_ENABLE 0x00100000 -#define TG3_CPMU_EEE_DBTMR1 0x000036b4 -#define TG3_CPMU_DBTMR1_PCIEXIT_2047US 0x07ff0000 -#define TG3_CPMU_DBTMR1_LNKIDLE_2047US 0x000007ff -#define TG3_CPMU_DBTMR1_LNKIDLE_MAX 0x0000ffff -#define TG3_CPMU_EEE_DBTMR2 0x000036b8 -#define TG3_CPMU_DBTMR2_APE_TX_2047US 0x07ff0000 -#define TG3_CPMU_DBTMR2_TXIDXEQ_2047US 0x000007ff -#define TG3_CPMU_EEE_LNKIDL_CTRL 0x000036bc -#define TG3_CPMU_EEE_LNKIDL_PCIE_NL0 0x01000000 -#define TG3_CPMU_EEE_LNKIDL_UART_IDL 0x00000004 -#define TG3_CPMU_EEE_LNKIDL_APE_TX_MT 0x00000002 -/* 0x36c0 --> 0x36d0 unused */ - -#define TG3_CPMU_EEE_CTRL 0x000036d0 -#define TG3_CPMU_EEE_CTRL_EXIT_16_5_US 0x0000019d -#define TG3_CPMU_EEE_CTRL_EXIT_36_US 0x00000384 -#define TG3_CPMU_EEE_CTRL_EXIT_20_1_US 0x000001f8 -/* 0x36d4 --> 0x3800 unused */ - -/* Mbuf cluster free registers */ -#define MBFREE_MODE 0x00003800 -#define MBFREE_MODE_RESET 0x00000001 -#define MBFREE_MODE_ENABLE 0x00000002 -#define MBFREE_STATUS 0x00003804 -/* 0x3808 --> 0x3c00 unused */ - -/* Host coalescing control registers */ -#define HOSTCC_MODE 0x00003c00 -#define HOSTCC_MODE_RESET 0x00000001 -#define HOSTCC_MODE_ENABLE 0x00000002 -#define HOSTCC_MODE_ATTN 0x00000004 -#define HOSTCC_MODE_NOW 0x00000008 -#define HOSTCC_MODE_FULL_STATUS 0x00000000 -#define HOSTCC_MODE_64BYTE 0x00000080 -#define HOSTCC_MODE_32BYTE 0x00000100 -#define HOSTCC_MODE_CLRTICK_RXBD 0x00000200 -#define HOSTCC_MODE_CLRTICK_TXBD 0x00000400 -#define HOSTCC_MODE_NOINT_ON_NOW 0x00000800 -#define HOSTCC_MODE_NOINT_ON_FORCE 0x00001000 -#define HOSTCC_MODE_COAL_VEC1_NOW 0x00002000 -#define HOSTCC_STATUS 0x00003c04 -#define HOSTCC_STATUS_ERROR_ATTN 0x00000004 -#define HOSTCC_RXCOL_TICKS 0x00003c08 -#define LOW_RXCOL_TICKS 0x00000032 -#define LOW_RXCOL_TICKS_CLRTCKS 0x00000014 -#define DEFAULT_RXCOL_TICKS 0x00000048 -#define HIGH_RXCOL_TICKS 0x00000096 -#define MAX_RXCOL_TICKS 0x000003ff -#define HOSTCC_TXCOL_TICKS 0x00003c0c -#define LOW_TXCOL_TICKS 0x00000096 -#define LOW_TXCOL_TICKS_CLRTCKS 0x00000048 -#define DEFAULT_TXCOL_TICKS 0x0000012c -#define HIGH_TXCOL_TICKS 0x00000145 -#define MAX_TXCOL_TICKS 0x000003ff -#define HOSTCC_RXMAX_FRAMES 0x00003c10 -#define LOW_RXMAX_FRAMES 0x00000005 -#define DEFAULT_RXMAX_FRAMES 0x00000008 -#define HIGH_RXMAX_FRAMES 0x00000012 -#define MAX_RXMAX_FRAMES 0x000000ff -#define HOSTCC_TXMAX_FRAMES 0x00003c14 -#define LOW_TXMAX_FRAMES 0x00000035 -#define DEFAULT_TXMAX_FRAMES 0x0000004b -#define HIGH_TXMAX_FRAMES 0x00000052 -#define MAX_TXMAX_FRAMES 0x000000ff -#define HOSTCC_RXCOAL_TICK_INT 0x00003c18 -#define DEFAULT_RXCOAL_TICK_INT 0x00000019 -#define DEFAULT_RXCOAL_TICK_INT_CLRTCKS 0x00000014 -#define MAX_RXCOAL_TICK_INT 0x000003ff -#define HOSTCC_TXCOAL_TICK_INT 0x00003c1c -#define DEFAULT_TXCOAL_TICK_INT 0x00000019 -#define DEFAULT_TXCOAL_TICK_INT_CLRTCKS 0x00000014 -#define MAX_TXCOAL_TICK_INT 0x000003ff -#define HOSTCC_RXCOAL_MAXF_INT 0x00003c20 -#define DEFAULT_RXCOAL_MAXF_INT 0x00000005 -#define MAX_RXCOAL_MAXF_INT 0x000000ff -#define HOSTCC_TXCOAL_MAXF_INT 0x00003c24 -#define DEFAULT_TXCOAL_MAXF_INT 0x00000005 -#define MAX_TXCOAL_MAXF_INT 0x000000ff -#define HOSTCC_STAT_COAL_TICKS 0x00003c28 -#define DEFAULT_STAT_COAL_TICKS 0x000f4240 -#define MAX_STAT_COAL_TICKS 0xd693d400 -#define MIN_STAT_COAL_TICKS 0x00000064 -/* 0x3c2c --> 0x3c30 unused */ -#define HOSTCC_STATS_BLK_HOST_ADDR 0x00003c30 /* 64-bit */ -#define HOSTCC_STATUS_BLK_HOST_ADDR 0x00003c38 /* 64-bit */ -#define HOSTCC_STATS_BLK_NIC_ADDR 0x00003c40 -#define HOSTCC_STATUS_BLK_NIC_ADDR 0x00003c44 -#define HOSTCC_FLOW_ATTN 0x00003c48 -#define HOSTCC_FLOW_ATTN_MBUF_LWM 0x00000040 -/* 0x3c4c --> 0x3c50 unused */ -#define HOSTCC_JUMBO_CON_IDX 0x00003c50 -#define HOSTCC_STD_CON_IDX 0x00003c54 -#define HOSTCC_MINI_CON_IDX 0x00003c58 -/* 0x3c5c --> 0x3c80 unused */ -#define HOSTCC_RET_PROD_IDX_0 0x00003c80 -#define HOSTCC_RET_PROD_IDX_1 0x00003c84 -#define HOSTCC_RET_PROD_IDX_2 0x00003c88 -#define HOSTCC_RET_PROD_IDX_3 0x00003c8c -#define HOSTCC_RET_PROD_IDX_4 0x00003c90 -#define HOSTCC_RET_PROD_IDX_5 0x00003c94 -#define HOSTCC_RET_PROD_IDX_6 0x00003c98 -#define HOSTCC_RET_PROD_IDX_7 0x00003c9c -#define HOSTCC_RET_PROD_IDX_8 0x00003ca0 -#define HOSTCC_RET_PROD_IDX_9 0x00003ca4 -#define HOSTCC_RET_PROD_IDX_10 0x00003ca8 -#define HOSTCC_RET_PROD_IDX_11 0x00003cac -#define HOSTCC_RET_PROD_IDX_12 0x00003cb0 -#define HOSTCC_RET_PROD_IDX_13 0x00003cb4 -#define HOSTCC_RET_PROD_IDX_14 0x00003cb8 -#define HOSTCC_RET_PROD_IDX_15 0x00003cbc -#define HOSTCC_SND_CON_IDX_0 0x00003cc0 -#define HOSTCC_SND_CON_IDX_1 0x00003cc4 -#define HOSTCC_SND_CON_IDX_2 0x00003cc8 -#define HOSTCC_SND_CON_IDX_3 0x00003ccc -#define HOSTCC_SND_CON_IDX_4 0x00003cd0 -#define HOSTCC_SND_CON_IDX_5 0x00003cd4 -#define HOSTCC_SND_CON_IDX_6 0x00003cd8 -#define HOSTCC_SND_CON_IDX_7 0x00003cdc -#define HOSTCC_SND_CON_IDX_8 0x00003ce0 -#define HOSTCC_SND_CON_IDX_9 0x00003ce4 -#define HOSTCC_SND_CON_IDX_10 0x00003ce8 -#define HOSTCC_SND_CON_IDX_11 0x00003cec -#define HOSTCC_SND_CON_IDX_12 0x00003cf0 -#define HOSTCC_SND_CON_IDX_13 0x00003cf4 -#define HOSTCC_SND_CON_IDX_14 0x00003cf8 -#define HOSTCC_SND_CON_IDX_15 0x00003cfc -#define HOSTCC_STATBLCK_RING1 0x00003d00 -/* 0x3d00 --> 0x3d80 unused */ - -#define HOSTCC_RXCOL_TICKS_VEC1 0x00003d80 -#define HOSTCC_TXCOL_TICKS_VEC1 0x00003d84 -#define HOSTCC_RXMAX_FRAMES_VEC1 0x00003d88 -#define HOSTCC_TXMAX_FRAMES_VEC1 0x00003d8c -#define HOSTCC_RXCOAL_MAXF_INT_VEC1 0x00003d90 -#define HOSTCC_TXCOAL_MAXF_INT_VEC1 0x00003d94 -/* 0x3d98 --> 0x4000 unused */ - -/* Memory arbiter control registers */ -#define MEMARB_MODE 0x00004000 -#define MEMARB_MODE_RESET 0x00000001 -#define MEMARB_MODE_ENABLE 0x00000002 -#define MEMARB_STATUS 0x00004004 -#define MEMARB_TRAP_ADDR_LOW 0x00004008 -#define MEMARB_TRAP_ADDR_HIGH 0x0000400c -/* 0x4010 --> 0x4400 unused */ - -/* Buffer manager control registers */ -#define BUFMGR_MODE 0x00004400 -#define BUFMGR_MODE_RESET 0x00000001 -#define BUFMGR_MODE_ENABLE 0x00000002 -#define BUFMGR_MODE_ATTN_ENABLE 0x00000004 -#define BUFMGR_MODE_BM_TEST 0x00000008 -#define BUFMGR_MODE_MBLOW_ATTN_ENAB 0x00000010 -#define BUFMGR_MODE_NO_TX_UNDERRUN 0x80000000 -#define BUFMGR_STATUS 0x00004404 -#define BUFMGR_STATUS_ERROR 0x00000004 -#define BUFMGR_STATUS_MBLOW 0x00000010 -#define BUFMGR_MB_POOL_ADDR 0x00004408 -#define BUFMGR_MB_POOL_SIZE 0x0000440c -#define BUFMGR_MB_RDMA_LOW_WATER 0x00004410 -#define DEFAULT_MB_RDMA_LOW_WATER 0x00000050 -#define DEFAULT_MB_RDMA_LOW_WATER_5705 0x00000000 -#define DEFAULT_MB_RDMA_LOW_WATER_JUMBO 0x00000130 -#define DEFAULT_MB_RDMA_LOW_WATER_JUMBO_5780 0x00000000 -#define BUFMGR_MB_MACRX_LOW_WATER 0x00004414 -#define DEFAULT_MB_MACRX_LOW_WATER 0x00000020 -#define DEFAULT_MB_MACRX_LOW_WATER_5705 0x00000010 -#define DEFAULT_MB_MACRX_LOW_WATER_5906 0x00000004 -#define DEFAULT_MB_MACRX_LOW_WATER_57765 0x0000002a -#define DEFAULT_MB_MACRX_LOW_WATER_JUMBO 0x00000098 -#define DEFAULT_MB_MACRX_LOW_WATER_JUMBO_5780 0x0000004b -#define DEFAULT_MB_MACRX_LOW_WATER_JUMBO_57765 0x0000007e -#define BUFMGR_MB_HIGH_WATER 0x00004418 -#define DEFAULT_MB_HIGH_WATER 0x00000060 -#define DEFAULT_MB_HIGH_WATER_5705 0x00000060 -#define DEFAULT_MB_HIGH_WATER_5906 0x00000010 -#define DEFAULT_MB_HIGH_WATER_57765 0x000000a0 -#define DEFAULT_MB_HIGH_WATER_JUMBO 0x0000017c -#define DEFAULT_MB_HIGH_WATER_JUMBO_5780 0x00000096 -#define DEFAULT_MB_HIGH_WATER_JUMBO_57765 0x000000ea -#define BUFMGR_RX_MB_ALLOC_REQ 0x0000441c -#define BUFMGR_MB_ALLOC_BIT 0x10000000 -#define BUFMGR_RX_MB_ALLOC_RESP 0x00004420 -#define BUFMGR_TX_MB_ALLOC_REQ 0x00004424 -#define BUFMGR_TX_MB_ALLOC_RESP 0x00004428 -#define BUFMGR_DMA_DESC_POOL_ADDR 0x0000442c -#define BUFMGR_DMA_DESC_POOL_SIZE 0x00004430 -#define BUFMGR_DMA_LOW_WATER 0x00004434 -#define DEFAULT_DMA_LOW_WATER 0x00000005 -#define BUFMGR_DMA_HIGH_WATER 0x00004438 -#define DEFAULT_DMA_HIGH_WATER 0x0000000a -#define BUFMGR_RX_DMA_ALLOC_REQ 0x0000443c -#define BUFMGR_RX_DMA_ALLOC_RESP 0x00004440 -#define BUFMGR_TX_DMA_ALLOC_REQ 0x00004444 -#define BUFMGR_TX_DMA_ALLOC_RESP 0x00004448 -#define BUFMGR_HWDIAG_0 0x0000444c -#define BUFMGR_HWDIAG_1 0x00004450 -#define BUFMGR_HWDIAG_2 0x00004454 -/* 0x4458 --> 0x4800 unused */ - -/* Read DMA control registers */ -#define RDMAC_MODE 0x00004800 -#define RDMAC_MODE_RESET 0x00000001 -#define RDMAC_MODE_ENABLE 0x00000002 -#define RDMAC_MODE_TGTABORT_ENAB 0x00000004 -#define RDMAC_MODE_MSTABORT_ENAB 0x00000008 -#define RDMAC_MODE_PARITYERR_ENAB 0x00000010 -#define RDMAC_MODE_ADDROFLOW_ENAB 0x00000020 -#define RDMAC_MODE_FIFOOFLOW_ENAB 0x00000040 -#define RDMAC_MODE_FIFOURUN_ENAB 0x00000080 -#define RDMAC_MODE_FIFOOREAD_ENAB 0x00000100 -#define RDMAC_MODE_LNGREAD_ENAB 0x00000200 -#define RDMAC_MODE_SPLIT_ENABLE 0x00000800 -#define RDMAC_MODE_BD_SBD_CRPT_ENAB 0x00000800 -#define RDMAC_MODE_SPLIT_RESET 0x00001000 -#define RDMAC_MODE_MBUF_RBD_CRPT_ENAB 0x00001000 -#define RDMAC_MODE_MBUF_SBD_CRPT_ENAB 0x00002000 -#define RDMAC_MODE_FIFO_SIZE_128 0x00020000 -#define RDMAC_MODE_FIFO_LONG_BURST 0x00030000 -#define RDMAC_MODE_JMB_2K_MMRR 0x00800000 -#define RDMAC_MODE_MULT_DMA_RD_DIS 0x01000000 -#define RDMAC_MODE_IPV4_LSO_EN 0x08000000 -#define RDMAC_MODE_IPV6_LSO_EN 0x10000000 -#define RDMAC_MODE_H2BNC_VLAN_DET 0x20000000 -#define RDMAC_STATUS 0x00004804 -#define RDMAC_STATUS_TGTABORT 0x00000004 -#define RDMAC_STATUS_MSTABORT 0x00000008 -#define RDMAC_STATUS_PARITYERR 0x00000010 -#define RDMAC_STATUS_ADDROFLOW 0x00000020 -#define RDMAC_STATUS_FIFOOFLOW 0x00000040 -#define RDMAC_STATUS_FIFOURUN 0x00000080 -#define RDMAC_STATUS_FIFOOREAD 0x00000100 -#define RDMAC_STATUS_LNGREAD 0x00000200 -/* 0x4808 --> 0x4890 unused */ - -#define TG3_RDMA_RSRVCTRL_REG2 0x00004890 -#define TG3_LSO_RD_DMA_CRPTEN_CTRL2 0x000048a0 - -#define TG3_RDMA_RSRVCTRL_REG 0x00004900 -#define TG3_RDMA_RSRVCTRL_FIFO_OFLW_FIX 0x00000004 -#define TG3_RDMA_RSRVCTRL_FIFO_LWM_1_5K 0x00000c00 -#define TG3_RDMA_RSRVCTRL_FIFO_LWM_MASK 0x00000ff0 -#define TG3_RDMA_RSRVCTRL_FIFO_HWM_1_5K 0x000c0000 -#define TG3_RDMA_RSRVCTRL_FIFO_HWM_MASK 0x000ff000 -#define TG3_RDMA_RSRVCTRL_TXMRGN_320B 0x28000000 -#define TG3_RDMA_RSRVCTRL_TXMRGN_MASK 0xffe00000 -/* 0x4904 --> 0x4910 unused */ - -#define TG3_LSO_RD_DMA_CRPTEN_CTRL 0x00004910 -#define TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_BD_4K 0x00030000 -#define TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_LSO_4K 0x000c0000 -#define TG3_LSO_RD_DMA_TX_LENGTH_WA_5719 0x02000000 -#define TG3_LSO_RD_DMA_TX_LENGTH_WA_5720 0x00200000 -/* 0x4914 --> 0x4be0 unused */ - -#define TG3_NUM_RDMA_CHANNELS 4 -#define TG3_RDMA_LENGTH 0x00004be0 - -/* Write DMA control registers */ -#define WDMAC_MODE 0x00004c00 -#define WDMAC_MODE_RESET 0x00000001 -#define WDMAC_MODE_ENABLE 0x00000002 -#define WDMAC_MODE_TGTABORT_ENAB 0x00000004 -#define WDMAC_MODE_MSTABORT_ENAB 0x00000008 -#define WDMAC_MODE_PARITYERR_ENAB 0x00000010 -#define WDMAC_MODE_ADDROFLOW_ENAB 0x00000020 -#define WDMAC_MODE_FIFOOFLOW_ENAB 0x00000040 -#define WDMAC_MODE_FIFOURUN_ENAB 0x00000080 -#define WDMAC_MODE_FIFOOREAD_ENAB 0x00000100 -#define WDMAC_MODE_LNGREAD_ENAB 0x00000200 -#define WDMAC_MODE_RX_ACCEL 0x00000400 -#define WDMAC_MODE_STATUS_TAG_FIX 0x20000000 -#define WDMAC_MODE_BURST_ALL_DATA 0xc0000000 -#define WDMAC_STATUS 0x00004c04 -#define WDMAC_STATUS_TGTABORT 0x00000004 -#define WDMAC_STATUS_MSTABORT 0x00000008 -#define WDMAC_STATUS_PARITYERR 0x00000010 -#define WDMAC_STATUS_ADDROFLOW 0x00000020 -#define WDMAC_STATUS_FIFOOFLOW 0x00000040 -#define WDMAC_STATUS_FIFOURUN 0x00000080 -#define WDMAC_STATUS_FIFOOREAD 0x00000100 -#define WDMAC_STATUS_LNGREAD 0x00000200 -/* 0x4c08 --> 0x5000 unused */ - -/* Per-cpu register offsets (arm9) */ -#define CPU_MODE 0x00000000 -#define CPU_MODE_RESET 0x00000001 -#define CPU_MODE_HALT 0x00000400 -#define CPU_STATE 0x00000004 -#define CPU_EVTMASK 0x00000008 -/* 0xc --> 0x1c reserved */ -#define CPU_PC 0x0000001c -#define CPU_INSN 0x00000020 -#define CPU_SPAD_UFLOW 0x00000024 -#define CPU_WDOG_CLEAR 0x00000028 -#define CPU_WDOG_VECTOR 0x0000002c -#define CPU_WDOG_PC 0x00000030 -#define CPU_HW_BP 0x00000034 -/* 0x38 --> 0x44 unused */ -#define CPU_WDOG_SAVED_STATE 0x00000044 -#define CPU_LAST_BRANCH_ADDR 0x00000048 -#define CPU_SPAD_UFLOW_SET 0x0000004c -/* 0x50 --> 0x200 unused */ -#define CPU_R0 0x00000200 -#define CPU_R1 0x00000204 -#define CPU_R2 0x00000208 -#define CPU_R3 0x0000020c -#define CPU_R4 0x00000210 -#define CPU_R5 0x00000214 -#define CPU_R6 0x00000218 -#define CPU_R7 0x0000021c -#define CPU_R8 0x00000220 -#define CPU_R9 0x00000224 -#define CPU_R10 0x00000228 -#define CPU_R11 0x0000022c -#define CPU_R12 0x00000230 -#define CPU_R13 0x00000234 -#define CPU_R14 0x00000238 -#define CPU_R15 0x0000023c -#define CPU_R16 0x00000240 -#define CPU_R17 0x00000244 -#define CPU_R18 0x00000248 -#define CPU_R19 0x0000024c -#define CPU_R20 0x00000250 -#define CPU_R21 0x00000254 -#define CPU_R22 0x00000258 -#define CPU_R23 0x0000025c -#define CPU_R24 0x00000260 -#define CPU_R25 0x00000264 -#define CPU_R26 0x00000268 -#define CPU_R27 0x0000026c -#define CPU_R28 0x00000270 -#define CPU_R29 0x00000274 -#define CPU_R30 0x00000278 -#define CPU_R31 0x0000027c -/* 0x280 --> 0x400 unused */ - -#define RX_CPU_BASE 0x00005000 -#define RX_CPU_MODE 0x00005000 -#define RX_CPU_STATE 0x00005004 -#define RX_CPU_PGMCTR 0x0000501c -#define RX_CPU_HWBKPT 0x00005034 -#define TX_CPU_BASE 0x00005400 -#define TX_CPU_MODE 0x00005400 -#define TX_CPU_STATE 0x00005404 -#define TX_CPU_PGMCTR 0x0000541c - -#define VCPU_STATUS 0x00005100 -#define VCPU_STATUS_INIT_DONE 0x04000000 -#define VCPU_STATUS_DRV_RESET 0x08000000 - -#define VCPU_CFGSHDW 0x00005104 -#define VCPU_CFGSHDW_WOL_ENABLE 0x00000001 -#define VCPU_CFGSHDW_WOL_MAGPKT 0x00000004 -#define VCPU_CFGSHDW_ASPM_DBNC 0x00001000 - -/* Mailboxes */ -#define GRCMBOX_BASE 0x00005600 -#define GRCMBOX_INTERRUPT_0 0x00005800 /* 64-bit */ -#define GRCMBOX_INTERRUPT_1 0x00005808 /* 64-bit */ -#define GRCMBOX_INTERRUPT_2 0x00005810 /* 64-bit */ -#define GRCMBOX_INTERRUPT_3 0x00005818 /* 64-bit */ -#define GRCMBOX_GENERAL_0 0x00005820 /* 64-bit */ -#define GRCMBOX_GENERAL_1 0x00005828 /* 64-bit */ -#define GRCMBOX_GENERAL_2 0x00005830 /* 64-bit */ -#define GRCMBOX_GENERAL_3 0x00005838 /* 64-bit */ -#define GRCMBOX_GENERAL_4 0x00005840 /* 64-bit */ -#define GRCMBOX_GENERAL_5 0x00005848 /* 64-bit */ -#define GRCMBOX_GENERAL_6 0x00005850 /* 64-bit */ -#define GRCMBOX_GENERAL_7 0x00005858 /* 64-bit */ -#define GRCMBOX_RELOAD_STAT 0x00005860 /* 64-bit */ -#define GRCMBOX_RCVSTD_PROD_IDX 0x00005868 /* 64-bit */ -#define GRCMBOX_RCVJUMBO_PROD_IDX 0x00005870 /* 64-bit */ -#define GRCMBOX_RCVMINI_PROD_IDX 0x00005878 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_0 0x00005880 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_1 0x00005888 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_2 0x00005890 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_3 0x00005898 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_4 0x000058a0 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_5 0x000058a8 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_6 0x000058b0 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_7 0x000058b8 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_8 0x000058c0 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_9 0x000058c8 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_10 0x000058d0 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_11 0x000058d8 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_12 0x000058e0 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_13 0x000058e8 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_14 0x000058f0 /* 64-bit */ -#define GRCMBOX_RCVRET_CON_IDX_15 0x000058f8 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_0 0x00005900 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_1 0x00005908 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_2 0x00005910 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_3 0x00005918 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_4 0x00005920 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_5 0x00005928 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_6 0x00005930 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_7 0x00005938 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_8 0x00005940 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_9 0x00005948 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_10 0x00005950 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_11 0x00005958 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_12 0x00005960 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_13 0x00005968 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_14 0x00005970 /* 64-bit */ -#define GRCMBOX_SNDHOST_PROD_IDX_15 0x00005978 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_0 0x00005980 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_1 0x00005988 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_2 0x00005990 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_3 0x00005998 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_4 0x000059a0 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_5 0x000059a8 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_6 0x000059b0 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_7 0x000059b8 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_8 0x000059c0 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_9 0x000059c8 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_10 0x000059d0 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_11 0x000059d8 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_12 0x000059e0 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_13 0x000059e8 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_14 0x000059f0 /* 64-bit */ -#define GRCMBOX_SNDNIC_PROD_IDX_15 0x000059f8 /* 64-bit */ -#define GRCMBOX_HIGH_PRIO_EV_VECTOR 0x00005a00 -#define GRCMBOX_HIGH_PRIO_EV_MASK 0x00005a04 -#define GRCMBOX_LOW_PRIO_EV_VEC 0x00005a08 -#define GRCMBOX_LOW_PRIO_EV_MASK 0x00005a0c -/* 0x5a10 --> 0x5c00 */ - -/* Flow Through queues */ -#define FTQ_RESET 0x00005c00 -/* 0x5c04 --> 0x5c10 unused */ -#define FTQ_DMA_NORM_READ_CTL 0x00005c10 -#define FTQ_DMA_NORM_READ_FULL_CNT 0x00005c14 -#define FTQ_DMA_NORM_READ_FIFO_ENQDEQ 0x00005c18 -#define FTQ_DMA_NORM_READ_WRITE_PEEK 0x00005c1c -#define FTQ_DMA_HIGH_READ_CTL 0x00005c20 -#define FTQ_DMA_HIGH_READ_FULL_CNT 0x00005c24 -#define FTQ_DMA_HIGH_READ_FIFO_ENQDEQ 0x00005c28 -#define FTQ_DMA_HIGH_READ_WRITE_PEEK 0x00005c2c -#define FTQ_DMA_COMP_DISC_CTL 0x00005c30 -#define FTQ_DMA_COMP_DISC_FULL_CNT 0x00005c34 -#define FTQ_DMA_COMP_DISC_FIFO_ENQDEQ 0x00005c38 -#define FTQ_DMA_COMP_DISC_WRITE_PEEK 0x00005c3c -#define FTQ_SEND_BD_COMP_CTL 0x00005c40 -#define FTQ_SEND_BD_COMP_FULL_CNT 0x00005c44 -#define FTQ_SEND_BD_COMP_FIFO_ENQDEQ 0x00005c48 -#define FTQ_SEND_BD_COMP_WRITE_PEEK 0x00005c4c -#define FTQ_SEND_DATA_INIT_CTL 0x00005c50 -#define FTQ_SEND_DATA_INIT_FULL_CNT 0x00005c54 -#define FTQ_SEND_DATA_INIT_FIFO_ENQDEQ 0x00005c58 -#define FTQ_SEND_DATA_INIT_WRITE_PEEK 0x00005c5c -#define FTQ_DMA_NORM_WRITE_CTL 0x00005c60 -#define FTQ_DMA_NORM_WRITE_FULL_CNT 0x00005c64 -#define FTQ_DMA_NORM_WRITE_FIFO_ENQDEQ 0x00005c68 -#define FTQ_DMA_NORM_WRITE_WRITE_PEEK 0x00005c6c -#define FTQ_DMA_HIGH_WRITE_CTL 0x00005c70 -#define FTQ_DMA_HIGH_WRITE_FULL_CNT 0x00005c74 -#define FTQ_DMA_HIGH_WRITE_FIFO_ENQDEQ 0x00005c78 -#define FTQ_DMA_HIGH_WRITE_WRITE_PEEK 0x00005c7c -#define FTQ_SWTYPE1_CTL 0x00005c80 -#define FTQ_SWTYPE1_FULL_CNT 0x00005c84 -#define FTQ_SWTYPE1_FIFO_ENQDEQ 0x00005c88 -#define FTQ_SWTYPE1_WRITE_PEEK 0x00005c8c -#define FTQ_SEND_DATA_COMP_CTL 0x00005c90 -#define FTQ_SEND_DATA_COMP_FULL_CNT 0x00005c94 -#define FTQ_SEND_DATA_COMP_FIFO_ENQDEQ 0x00005c98 -#define FTQ_SEND_DATA_COMP_WRITE_PEEK 0x00005c9c -#define FTQ_HOST_COAL_CTL 0x00005ca0 -#define FTQ_HOST_COAL_FULL_CNT 0x00005ca4 -#define FTQ_HOST_COAL_FIFO_ENQDEQ 0x00005ca8 -#define FTQ_HOST_COAL_WRITE_PEEK 0x00005cac -#define FTQ_MAC_TX_CTL 0x00005cb0 -#define FTQ_MAC_TX_FULL_CNT 0x00005cb4 -#define FTQ_MAC_TX_FIFO_ENQDEQ 0x00005cb8 -#define FTQ_MAC_TX_WRITE_PEEK 0x00005cbc -#define FTQ_MB_FREE_CTL 0x00005cc0 -#define FTQ_MB_FREE_FULL_CNT 0x00005cc4 -#define FTQ_MB_FREE_FIFO_ENQDEQ 0x00005cc8 -#define FTQ_MB_FREE_WRITE_PEEK 0x00005ccc -#define FTQ_RCVBD_COMP_CTL 0x00005cd0 -#define FTQ_RCVBD_COMP_FULL_CNT 0x00005cd4 -#define FTQ_RCVBD_COMP_FIFO_ENQDEQ 0x00005cd8 -#define FTQ_RCVBD_COMP_WRITE_PEEK 0x00005cdc -#define FTQ_RCVLST_PLMT_CTL 0x00005ce0 -#define FTQ_RCVLST_PLMT_FULL_CNT 0x00005ce4 -#define FTQ_RCVLST_PLMT_FIFO_ENQDEQ 0x00005ce8 -#define FTQ_RCVLST_PLMT_WRITE_PEEK 0x00005cec -#define FTQ_RCVDATA_INI_CTL 0x00005cf0 -#define FTQ_RCVDATA_INI_FULL_CNT 0x00005cf4 -#define FTQ_RCVDATA_INI_FIFO_ENQDEQ 0x00005cf8 -#define FTQ_RCVDATA_INI_WRITE_PEEK 0x00005cfc -#define FTQ_RCVDATA_COMP_CTL 0x00005d00 -#define FTQ_RCVDATA_COMP_FULL_CNT 0x00005d04 -#define FTQ_RCVDATA_COMP_FIFO_ENQDEQ 0x00005d08 -#define FTQ_RCVDATA_COMP_WRITE_PEEK 0x00005d0c -#define FTQ_SWTYPE2_CTL 0x00005d10 -#define FTQ_SWTYPE2_FULL_CNT 0x00005d14 -#define FTQ_SWTYPE2_FIFO_ENQDEQ 0x00005d18 -#define FTQ_SWTYPE2_WRITE_PEEK 0x00005d1c -/* 0x5d20 --> 0x6000 unused */ - -/* Message signaled interrupt registers */ -#define MSGINT_MODE 0x00006000 -#define MSGINT_MODE_RESET 0x00000001 -#define MSGINT_MODE_ENABLE 0x00000002 -#define MSGINT_MODE_ONE_SHOT_DISABLE 0x00000020 -#define MSGINT_MODE_MULTIVEC_EN 0x00000080 -#define MSGINT_STATUS 0x00006004 -#define MSGINT_STATUS_MSI_REQ 0x00000001 -#define MSGINT_FIFO 0x00006008 -/* 0x600c --> 0x6400 unused */ - -/* DMA completion registers */ -#define DMAC_MODE 0x00006400 -#define DMAC_MODE_RESET 0x00000001 -#define DMAC_MODE_ENABLE 0x00000002 -/* 0x6404 --> 0x6800 unused */ - -/* GRC registers */ -#define GRC_MODE 0x00006800 -#define GRC_MODE_UPD_ON_COAL 0x00000001 -#define GRC_MODE_BSWAP_NONFRM_DATA 0x00000002 -#define GRC_MODE_WSWAP_NONFRM_DATA 0x00000004 -#define GRC_MODE_BSWAP_DATA 0x00000010 -#define GRC_MODE_WSWAP_DATA 0x00000020 -#define GRC_MODE_BYTE_SWAP_B2HRX_DATA 0x00000040 -#define GRC_MODE_WORD_SWAP_B2HRX_DATA 0x00000080 -#define GRC_MODE_SPLITHDR 0x00000100 -#define GRC_MODE_NOFRM_CRACKING 0x00000200 -#define GRC_MODE_INCL_CRC 0x00000400 -#define GRC_MODE_ALLOW_BAD_FRMS 0x00000800 -#define GRC_MODE_NOIRQ_ON_SENDS 0x00002000 -#define GRC_MODE_NOIRQ_ON_RCV 0x00004000 -#define GRC_MODE_FORCE_PCI32BIT 0x00008000 -#define GRC_MODE_B2HRX_ENABLE 0x00008000 -#define GRC_MODE_HOST_STACKUP 0x00010000 -#define GRC_MODE_HOST_SENDBDS 0x00020000 -#define GRC_MODE_HTX2B_ENABLE 0x00040000 -#define GRC_MODE_TIME_SYNC_ENABLE 0x00080000 -#define GRC_MODE_NO_TX_PHDR_CSUM 0x00100000 -#define GRC_MODE_NVRAM_WR_ENABLE 0x00200000 -#define GRC_MODE_PCIE_TL_SEL 0x00000000 -#define GRC_MODE_PCIE_PL_SEL 0x00400000 -#define GRC_MODE_NO_RX_PHDR_CSUM 0x00800000 -#define GRC_MODE_IRQ_ON_TX_CPU_ATTN 0x01000000 -#define GRC_MODE_IRQ_ON_RX_CPU_ATTN 0x02000000 -#define GRC_MODE_IRQ_ON_MAC_ATTN 0x04000000 -#define GRC_MODE_IRQ_ON_DMA_ATTN 0x08000000 -#define GRC_MODE_IRQ_ON_FLOW_ATTN 0x10000000 -#define GRC_MODE_4X_NIC_SEND_RINGS 0x20000000 -#define GRC_MODE_PCIE_DL_SEL 0x20000000 -#define GRC_MODE_MCAST_FRM_ENABLE 0x40000000 -#define GRC_MODE_PCIE_HI_1K_EN 0x80000000 -#define GRC_MODE_PCIE_PORT_MASK (GRC_MODE_PCIE_TL_SEL | \ - GRC_MODE_PCIE_PL_SEL | \ - GRC_MODE_PCIE_DL_SEL | \ - GRC_MODE_PCIE_HI_1K_EN) -#define GRC_MISC_CFG 0x00006804 -#define GRC_MISC_CFG_CORECLK_RESET 0x00000001 -#define GRC_MISC_CFG_PRESCALAR_MASK 0x000000fe -#define GRC_MISC_CFG_PRESCALAR_SHIFT 1 -#define GRC_MISC_CFG_BOARD_ID_MASK 0x0001e000 -#define GRC_MISC_CFG_BOARD_ID_5700 0x0001e000 -#define GRC_MISC_CFG_BOARD_ID_5701 0x00000000 -#define GRC_MISC_CFG_BOARD_ID_5702FE 0x00004000 -#define GRC_MISC_CFG_BOARD_ID_5703 0x00000000 -#define GRC_MISC_CFG_BOARD_ID_5703S 0x00002000 -#define GRC_MISC_CFG_BOARD_ID_5704 0x00000000 -#define GRC_MISC_CFG_BOARD_ID_5704CIOBE 0x00004000 -#define GRC_MISC_CFG_BOARD_ID_5704_A2 0x00008000 -#define GRC_MISC_CFG_BOARD_ID_5788 0x00010000 -#define GRC_MISC_CFG_BOARD_ID_5788M 0x00018000 -#define GRC_MISC_CFG_BOARD_ID_AC91002A1 0x00018000 -#define GRC_MISC_CFG_EPHY_IDDQ 0x00200000 -#define GRC_MISC_CFG_KEEP_GPHY_POWER 0x04000000 -#define GRC_LOCAL_CTRL 0x00006808 -#define GRC_LCLCTRL_INT_ACTIVE 0x00000001 -#define GRC_LCLCTRL_CLEARINT 0x00000002 -#define GRC_LCLCTRL_SETINT 0x00000004 -#define GRC_LCLCTRL_INT_ON_ATTN 0x00000008 -#define GRC_LCLCTRL_GPIO_UART_SEL 0x00000010 /* 5755 only */ -#define GRC_LCLCTRL_USE_SIG_DETECT 0x00000010 /* 5714/5780 only */ -#define GRC_LCLCTRL_USE_EXT_SIG_DETECT 0x00000020 /* 5714/5780 only */ -#define GRC_LCLCTRL_GPIO_INPUT3 0x00000020 -#define GRC_LCLCTRL_GPIO_OE3 0x00000040 -#define GRC_LCLCTRL_GPIO_OUTPUT3 0x00000080 -#define GRC_LCLCTRL_GPIO_INPUT0 0x00000100 -#define GRC_LCLCTRL_GPIO_INPUT1 0x00000200 -#define GRC_LCLCTRL_GPIO_INPUT2 0x00000400 -#define GRC_LCLCTRL_GPIO_OE0 0x00000800 -#define GRC_LCLCTRL_GPIO_OE1 0x00001000 -#define GRC_LCLCTRL_GPIO_OE2 0x00002000 -#define GRC_LCLCTRL_GPIO_OUTPUT0 0x00004000 -#define GRC_LCLCTRL_GPIO_OUTPUT1 0x00008000 -#define GRC_LCLCTRL_GPIO_OUTPUT2 0x00010000 -#define GRC_LCLCTRL_EXTMEM_ENABLE 0x00020000 -#define GRC_LCLCTRL_MEMSZ_MASK 0x001c0000 -#define GRC_LCLCTRL_MEMSZ_256K 0x00000000 -#define GRC_LCLCTRL_MEMSZ_512K 0x00040000 -#define GRC_LCLCTRL_MEMSZ_1M 0x00080000 -#define GRC_LCLCTRL_MEMSZ_2M 0x000c0000 -#define GRC_LCLCTRL_MEMSZ_4M 0x00100000 -#define GRC_LCLCTRL_MEMSZ_8M 0x00140000 -#define GRC_LCLCTRL_MEMSZ_16M 0x00180000 -#define GRC_LCLCTRL_BANK_SELECT 0x00200000 -#define GRC_LCLCTRL_SSRAM_TYPE 0x00400000 -#define GRC_LCLCTRL_AUTO_SEEPROM 0x01000000 -#define GRC_TIMER 0x0000680c -#define GRC_RX_CPU_EVENT 0x00006810 -#define GRC_RX_CPU_DRIVER_EVENT 0x00004000 -#define GRC_RX_TIMER_REF 0x00006814 -#define GRC_RX_CPU_SEM 0x00006818 -#define GRC_REMOTE_RX_CPU_ATTN 0x0000681c -#define GRC_TX_CPU_EVENT 0x00006820 -#define GRC_TX_TIMER_REF 0x00006824 -#define GRC_TX_CPU_SEM 0x00006828 -#define GRC_REMOTE_TX_CPU_ATTN 0x0000682c -#define GRC_MEM_POWER_UP 0x00006830 /* 64-bit */ -#define GRC_EEPROM_ADDR 0x00006838 -#define EEPROM_ADDR_WRITE 0x00000000 -#define EEPROM_ADDR_READ 0x80000000 -#define EEPROM_ADDR_COMPLETE 0x40000000 -#define EEPROM_ADDR_FSM_RESET 0x20000000 -#define EEPROM_ADDR_DEVID_MASK 0x1c000000 -#define EEPROM_ADDR_DEVID_SHIFT 26 -#define EEPROM_ADDR_START 0x02000000 -#define EEPROM_ADDR_CLKPERD_SHIFT 16 -#define EEPROM_ADDR_ADDR_MASK 0x0000ffff -#define EEPROM_ADDR_ADDR_SHIFT 0 -#define EEPROM_DEFAULT_CLOCK_PERIOD 0x60 -#define EEPROM_CHIP_SIZE (64 * 1024) -#define GRC_EEPROM_DATA 0x0000683c -#define GRC_EEPROM_CTRL 0x00006840 -#define GRC_MDI_CTRL 0x00006844 -#define GRC_SEEPROM_DELAY 0x00006848 -/* 0x684c --> 0x6890 unused */ -#define GRC_VCPU_EXT_CTRL 0x00006890 -#define GRC_VCPU_EXT_CTRL_HALT_CPU 0x00400000 -#define GRC_VCPU_EXT_CTRL_DISABLE_WOL 0x20000000 -#define GRC_FASTBOOT_PC 0x00006894 /* 5752, 5755, 5787 */ - -#define TG3_EAV_REF_CLCK_LSB 0x00006900 -#define TG3_EAV_REF_CLCK_MSB 0x00006904 -#define TG3_EAV_REF_CLCK_CTL 0x00006908 -#define TG3_EAV_REF_CLCK_CTL_STOP 0x00000002 -#define TG3_EAV_REF_CLCK_CTL_RESUME 0x00000004 -#define TG3_EAV_CTL_TSYNC_GPIO_MASK (0x3 << 16) -#define TG3_EAV_CTL_TSYNC_WDOG0 (1 << 17) - -#define TG3_EAV_WATCHDOG0_LSB 0x00006918 -#define TG3_EAV_WATCHDOG0_MSB 0x0000691c -#define TG3_EAV_WATCHDOG0_EN (1 << 31) -#define TG3_EAV_WATCHDOG_MSB_MASK 0x7fffffff - -#define TG3_EAV_REF_CLK_CORRECT_CTL 0x00006928 -#define TG3_EAV_REF_CLK_CORRECT_EN (1 << 31) -#define TG3_EAV_REF_CLK_CORRECT_NEG (1 << 30) - -#define TG3_EAV_REF_CLK_CORRECT_MASK 0xffffff - -/* 0x692c --> 0x7000 unused */ - -/* NVRAM Control registers */ -#define NVRAM_CMD 0x00007000 -#define NVRAM_CMD_RESET 0x00000001 -#define NVRAM_CMD_DONE 0x00000008 -#define NVRAM_CMD_GO 0x00000010 -#define NVRAM_CMD_WR 0x00000020 -#define NVRAM_CMD_RD 0x00000000 -#define NVRAM_CMD_ERASE 0x00000040 -#define NVRAM_CMD_FIRST 0x00000080 -#define NVRAM_CMD_LAST 0x00000100 -#define NVRAM_CMD_WREN 0x00010000 -#define NVRAM_CMD_WRDI 0x00020000 -#define NVRAM_STAT 0x00007004 -#define NVRAM_WRDATA 0x00007008 -#define NVRAM_ADDR 0x0000700c -#define NVRAM_ADDR_MSK 0x00ffffff -#define NVRAM_RDDATA 0x00007010 -#define NVRAM_CFG1 0x00007014 -#define NVRAM_CFG1_FLASHIF_ENAB 0x00000001 -#define NVRAM_CFG1_BUFFERED_MODE 0x00000002 -#define NVRAM_CFG1_PASS_THRU 0x00000004 -#define NVRAM_CFG1_STATUS_BITS 0x00000070 -#define NVRAM_CFG1_BIT_BANG 0x00000008 -#define NVRAM_CFG1_FLASH_SIZE 0x02000000 -#define NVRAM_CFG1_COMPAT_BYPASS 0x80000000 -#define NVRAM_CFG1_VENDOR_MASK 0x03000003 -#define FLASH_VENDOR_ATMEL_EEPROM 0x02000000 -#define FLASH_VENDOR_ATMEL_FLASH_BUFFERED 0x02000003 -#define FLASH_VENDOR_ATMEL_FLASH_UNBUFFERED 0x00000003 -#define FLASH_VENDOR_ST 0x03000001 -#define FLASH_VENDOR_SAIFUN 0x01000003 -#define FLASH_VENDOR_SST_SMALL 0x00000001 -#define FLASH_VENDOR_SST_LARGE 0x02000001 -#define NVRAM_CFG1_5752VENDOR_MASK 0x03c00003 -#define NVRAM_CFG1_5762VENDOR_MASK 0x03e00003 -#define FLASH_5752VENDOR_ATMEL_EEPROM_64KHZ 0x00000000 -#define FLASH_5752VENDOR_ATMEL_EEPROM_376KHZ 0x02000000 -#define FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED 0x02000003 -#define FLASH_5752VENDOR_ST_M45PE10 0x02400000 -#define FLASH_5752VENDOR_ST_M45PE20 0x02400002 -#define FLASH_5752VENDOR_ST_M45PE40 0x02400001 -#define FLASH_5755VENDOR_ATMEL_FLASH_1 0x03400001 -#define FLASH_5755VENDOR_ATMEL_FLASH_2 0x03400002 -#define FLASH_5755VENDOR_ATMEL_FLASH_3 0x03400000 -#define FLASH_5755VENDOR_ATMEL_FLASH_4 0x00000003 -#define FLASH_5755VENDOR_ATMEL_FLASH_5 0x02000003 -#define FLASH_5755VENDOR_ATMEL_EEPROM_64KHZ 0x03c00003 -#define FLASH_5755VENDOR_ATMEL_EEPROM_376KHZ 0x03c00002 -#define FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ 0x03000003 -#define FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ 0x03000002 -#define FLASH_5787VENDOR_MICRO_EEPROM_64KHZ 0x03000000 -#define FLASH_5787VENDOR_MICRO_EEPROM_376KHZ 0x02000000 -#define FLASH_5761VENDOR_ATMEL_MDB021D 0x00800003 -#define FLASH_5761VENDOR_ATMEL_MDB041D 0x00800000 -#define FLASH_5761VENDOR_ATMEL_MDB081D 0x00800002 -#define FLASH_5761VENDOR_ATMEL_MDB161D 0x00800001 -#define FLASH_5761VENDOR_ATMEL_ADB021D 0x00000003 -#define FLASH_5761VENDOR_ATMEL_ADB041D 0x00000000 -#define FLASH_5761VENDOR_ATMEL_ADB081D 0x00000002 -#define FLASH_5761VENDOR_ATMEL_ADB161D 0x00000001 -#define FLASH_5761VENDOR_ST_M_M45PE20 0x02800001 -#define FLASH_5761VENDOR_ST_M_M45PE40 0x02800000 -#define FLASH_5761VENDOR_ST_M_M45PE80 0x02800002 -#define FLASH_5761VENDOR_ST_M_M45PE16 0x02800003 -#define FLASH_5761VENDOR_ST_A_M45PE20 0x02000001 -#define FLASH_5761VENDOR_ST_A_M45PE40 0x02000000 -#define FLASH_5761VENDOR_ST_A_M45PE80 0x02000002 -#define FLASH_5761VENDOR_ST_A_M45PE16 0x02000003 -#define FLASH_57780VENDOR_ATMEL_AT45DB011D 0x00400000 -#define FLASH_57780VENDOR_ATMEL_AT45DB011B 0x03400000 -#define FLASH_57780VENDOR_ATMEL_AT45DB021D 0x00400002 -#define FLASH_57780VENDOR_ATMEL_AT45DB021B 0x03400002 -#define FLASH_57780VENDOR_ATMEL_AT45DB041D 0x00400001 -#define FLASH_57780VENDOR_ATMEL_AT45DB041B 0x03400001 -#define FLASH_5717VENDOR_ATMEL_EEPROM 0x02000001 -#define FLASH_5717VENDOR_MICRO_EEPROM 0x02000003 -#define FLASH_5717VENDOR_ATMEL_MDB011D 0x01000001 -#define FLASH_5717VENDOR_ATMEL_MDB021D 0x01000003 -#define FLASH_5717VENDOR_ST_M_M25PE10 0x02000000 -#define FLASH_5717VENDOR_ST_M_M25PE20 0x02000002 -#define FLASH_5717VENDOR_ST_M_M45PE10 0x00000001 -#define FLASH_5717VENDOR_ST_M_M45PE20 0x00000003 -#define FLASH_5717VENDOR_ATMEL_ADB011B 0x01400000 -#define FLASH_5717VENDOR_ATMEL_ADB021B 0x01400002 -#define FLASH_5717VENDOR_ATMEL_ADB011D 0x01400001 -#define FLASH_5717VENDOR_ATMEL_ADB021D 0x01400003 -#define FLASH_5717VENDOR_ST_A_M25PE10 0x02400000 -#define FLASH_5717VENDOR_ST_A_M25PE20 0x02400002 -#define FLASH_5717VENDOR_ST_A_M45PE10 0x02400001 -#define FLASH_5717VENDOR_ST_A_M45PE20 0x02400003 -#define FLASH_5717VENDOR_ATMEL_45USPT 0x03400000 -#define FLASH_5717VENDOR_ST_25USPT 0x03400002 -#define FLASH_5717VENDOR_ST_45USPT 0x03400001 -#define FLASH_5720_EEPROM_HD 0x00000001 -#define FLASH_5720_EEPROM_LD 0x00000003 -#define FLASH_5762_EEPROM_HD 0x02000001 -#define FLASH_5762_EEPROM_LD 0x02000003 -#define FLASH_5720VENDOR_M_ATMEL_DB011D 0x01000000 -#define FLASH_5720VENDOR_M_ATMEL_DB021D 0x01000002 -#define FLASH_5720VENDOR_M_ATMEL_DB041D 0x01000001 -#define FLASH_5720VENDOR_M_ATMEL_DB081D 0x01000003 -#define FLASH_5720VENDOR_M_ST_M25PE10 0x02000000 -#define FLASH_5720VENDOR_M_ST_M25PE20 0x02000002 -#define FLASH_5720VENDOR_M_ST_M25PE40 0x02000001 -#define FLASH_5720VENDOR_M_ST_M25PE80 0x02000003 -#define FLASH_5720VENDOR_M_ST_M45PE10 0x03000000 -#define FLASH_5720VENDOR_M_ST_M45PE20 0x03000002 -#define FLASH_5720VENDOR_M_ST_M45PE40 0x03000001 -#define FLASH_5720VENDOR_M_ST_M45PE80 0x03000003 -#define FLASH_5720VENDOR_A_ATMEL_DB011B 0x01800000 -#define FLASH_5720VENDOR_A_ATMEL_DB021B 0x01800002 -#define FLASH_5720VENDOR_A_ATMEL_DB041B 0x01800001 -#define FLASH_5720VENDOR_A_ATMEL_DB011D 0x01c00000 -#define FLASH_5720VENDOR_A_ATMEL_DB021D 0x01c00002 -#define FLASH_5720VENDOR_A_ATMEL_DB041D 0x01c00001 -#define FLASH_5720VENDOR_A_ATMEL_DB081D 0x01c00003 -#define FLASH_5720VENDOR_A_ST_M25PE10 0x02800000 -#define FLASH_5720VENDOR_A_ST_M25PE20 0x02800002 -#define FLASH_5720VENDOR_A_ST_M25PE40 0x02800001 -#define FLASH_5720VENDOR_A_ST_M25PE80 0x02800003 -#define FLASH_5720VENDOR_A_ST_M45PE10 0x02c00000 -#define FLASH_5720VENDOR_A_ST_M45PE20 0x02c00002 -#define FLASH_5720VENDOR_A_ST_M45PE40 0x02c00001 -#define FLASH_5720VENDOR_A_ST_M45PE80 0x02c00003 -#define FLASH_5720VENDOR_ATMEL_45USPT 0x03c00000 -#define FLASH_5720VENDOR_ST_25USPT 0x03c00002 -#define FLASH_5720VENDOR_ST_45USPT 0x03c00001 -#define NVRAM_CFG1_5752PAGE_SIZE_MASK 0x70000000 -#define FLASH_5752PAGE_SIZE_256 0x00000000 -#define FLASH_5752PAGE_SIZE_512 0x10000000 -#define FLASH_5752PAGE_SIZE_1K 0x20000000 -#define FLASH_5752PAGE_SIZE_2K 0x30000000 -#define FLASH_5752PAGE_SIZE_4K 0x40000000 -#define FLASH_5752PAGE_SIZE_264 0x50000000 -#define FLASH_5752PAGE_SIZE_528 0x60000000 -#define NVRAM_CFG2 0x00007018 -#define NVRAM_CFG3 0x0000701c -#define NVRAM_SWARB 0x00007020 -#define SWARB_REQ_SET0 0x00000001 -#define SWARB_REQ_SET1 0x00000002 -#define SWARB_REQ_SET2 0x00000004 -#define SWARB_REQ_SET3 0x00000008 -#define SWARB_REQ_CLR0 0x00000010 -#define SWARB_REQ_CLR1 0x00000020 -#define SWARB_REQ_CLR2 0x00000040 -#define SWARB_REQ_CLR3 0x00000080 -#define SWARB_GNT0 0x00000100 -#define SWARB_GNT1 0x00000200 -#define SWARB_GNT2 0x00000400 -#define SWARB_GNT3 0x00000800 -#define SWARB_REQ0 0x00001000 -#define SWARB_REQ1 0x00002000 -#define SWARB_REQ2 0x00004000 -#define SWARB_REQ3 0x00008000 -#define NVRAM_ACCESS 0x00007024 -#define ACCESS_ENABLE 0x00000001 -#define ACCESS_WR_ENABLE 0x00000002 -#define NVRAM_WRITE1 0x00007028 -/* 0x702c unused */ - -#define NVRAM_ADDR_LOCKOUT 0x00007030 -/* 0x7034 --> 0x7500 unused */ - -#define OTP_MODE 0x00007500 -#define OTP_MODE_OTP_THRU_GRC 0x00000001 -#define OTP_CTRL 0x00007504 -#define OTP_CTRL_OTP_PROG_ENABLE 0x00200000 -#define OTP_CTRL_OTP_CMD_READ 0x00000000 -#define OTP_CTRL_OTP_CMD_INIT 0x00000008 -#define OTP_CTRL_OTP_CMD_START 0x00000001 -#define OTP_STATUS 0x00007508 -#define OTP_STATUS_CMD_DONE 0x00000001 -#define OTP_ADDRESS 0x0000750c -#define OTP_ADDRESS_MAGIC1 0x000000a0 -#define OTP_ADDRESS_MAGIC2 0x00000080 -/* 0x7510 unused */ - -#define OTP_READ_DATA 0x00007514 -/* 0x7518 --> 0x7c04 unused */ - -#define PCIE_TRANSACTION_CFG 0x00007c04 -#define PCIE_TRANS_CFG_1SHOT_MSI 0x20000000 -#define PCIE_TRANS_CFG_LOM 0x00000020 -/* 0x7c08 --> 0x7d28 unused */ - -#define PCIE_PWR_MGMT_THRESH 0x00007d28 -#define PCIE_PWR_MGMT_L1_THRESH_MSK 0x0000ff00 -#define PCIE_PWR_MGMT_L1_THRESH_4MS 0x0000ff00 -#define PCIE_PWR_MGMT_EXT_ASPM_TMR_EN 0x01000000 -/* 0x7d2c --> 0x7d54 unused */ - -#define TG3_PCIE_LNKCTL 0x00007d54 -#define TG3_PCIE_LNKCTL_L1_PLL_PD_EN 0x00000008 -#define TG3_PCIE_LNKCTL_L1_PLL_PD_DIS 0x00000080 -/* 0x7d58 --> 0x7e70 unused */ - -#define TG3_PCIE_PHY_TSTCTL 0x00007e2c -#define TG3_PCIE_PHY_TSTCTL_PCIE10 0x00000040 -#define TG3_PCIE_PHY_TSTCTL_PSCRAM 0x00000020 - -#define TG3_PCIE_EIDLE_DELAY 0x00007e70 -#define TG3_PCIE_EIDLE_DELAY_MASK 0x0000001f -#define TG3_PCIE_EIDLE_DELAY_13_CLKS 0x0000000c -/* 0x7e74 --> 0x8000 unused */ - - -/* Alternate PCIE definitions */ -#define TG3_PCIE_TLDLPL_PORT 0x00007c00 -#define TG3_PCIE_DL_LO_FTSMAX 0x0000000c -#define TG3_PCIE_DL_LO_FTSMAX_MSK 0x000000ff -#define TG3_PCIE_DL_LO_FTSMAX_VAL 0x0000002c -#define TG3_PCIE_PL_LO_PHYCTL1 0x00000004 -#define TG3_PCIE_PL_LO_PHYCTL1_L1PLLPD_EN 0x00001000 -#define TG3_PCIE_PL_LO_PHYCTL5 0x00000014 -#define TG3_PCIE_PL_LO_PHYCTL5_DIS_L2CLKREQ 0x80000000 - -#define TG3_REG_BLK_SIZE 0x00008000 - -/* OTP bit definitions */ -#define TG3_OTP_AGCTGT_MASK 0x000000e0 -#define TG3_OTP_AGCTGT_SHIFT 1 -#define TG3_OTP_HPFFLTR_MASK 0x00000300 -#define TG3_OTP_HPFFLTR_SHIFT 1 -#define TG3_OTP_HPFOVER_MASK 0x00000400 -#define TG3_OTP_HPFOVER_SHIFT 1 -#define TG3_OTP_LPFDIS_MASK 0x00000800 -#define TG3_OTP_LPFDIS_SHIFT 11 -#define TG3_OTP_VDAC_MASK 0xff000000 -#define TG3_OTP_VDAC_SHIFT 24 -#define TG3_OTP_10BTAMP_MASK 0x0000f000 -#define TG3_OTP_10BTAMP_SHIFT 8 -#define TG3_OTP_ROFF_MASK 0x00e00000 -#define TG3_OTP_ROFF_SHIFT 11 -#define TG3_OTP_RCOFF_MASK 0x001c0000 -#define TG3_OTP_RCOFF_SHIFT 16 - -#define TG3_OTP_DEFAULT 0x286c1640 - - -/* Hardware Legacy NVRAM layout */ -#define TG3_NVM_VPD_OFF 0x100 -#define TG3_NVM_VPD_LEN 256 - -/* Hardware Selfboot NVRAM layout */ -#define TG3_NVM_HWSB_CFG1 0x00000004 -#define TG3_NVM_HWSB_CFG1_MAJMSK 0xf8000000 -#define TG3_NVM_HWSB_CFG1_MAJSFT 27 -#define TG3_NVM_HWSB_CFG1_MINMSK 0x07c00000 -#define TG3_NVM_HWSB_CFG1_MINSFT 22 - -#define TG3_EEPROM_MAGIC 0x669955aa -#define TG3_EEPROM_MAGIC_FW 0xa5000000 -#define TG3_EEPROM_MAGIC_FW_MSK 0xff000000 -#define TG3_EEPROM_SB_FORMAT_MASK 0x00e00000 -#define TG3_EEPROM_SB_FORMAT_1 0x00200000 -#define TG3_EEPROM_SB_REVISION_MASK 0x001f0000 -#define TG3_EEPROM_SB_REVISION_0 0x00000000 -#define TG3_EEPROM_SB_REVISION_2 0x00020000 -#define TG3_EEPROM_SB_REVISION_3 0x00030000 -#define TG3_EEPROM_SB_REVISION_4 0x00040000 -#define TG3_EEPROM_SB_REVISION_5 0x00050000 -#define TG3_EEPROM_SB_REVISION_6 0x00060000 -#define TG3_EEPROM_MAGIC_HW 0xabcd -#define TG3_EEPROM_MAGIC_HW_MSK 0xffff - -#define TG3_NVM_DIR_START 0x18 -#define TG3_NVM_DIR_END 0x78 -#define TG3_NVM_DIRENT_SIZE 0xc -#define TG3_NVM_DIRTYPE_SHIFT 24 -#define TG3_NVM_DIRTYPE_LENMSK 0x003fffff -#define TG3_NVM_DIRTYPE_ASFINI 1 -#define TG3_NVM_DIRTYPE_EXTVPD 20 -#define TG3_NVM_PTREV_BCVER 0x94 -#define TG3_NVM_BCVER_MAJMSK 0x0000ff00 -#define TG3_NVM_BCVER_MAJSFT 8 -#define TG3_NVM_BCVER_MINMSK 0x000000ff - -#define TG3_EEPROM_SB_F1R0_EDH_OFF 0x10 -#define TG3_EEPROM_SB_F1R2_EDH_OFF 0x14 -#define TG3_EEPROM_SB_F1R2_MBA_OFF 0x10 -#define TG3_EEPROM_SB_F1R3_EDH_OFF 0x18 -#define TG3_EEPROM_SB_F1R4_EDH_OFF 0x1c -#define TG3_EEPROM_SB_F1R5_EDH_OFF 0x20 -#define TG3_EEPROM_SB_F1R6_EDH_OFF 0x4c -#define TG3_EEPROM_SB_EDH_MAJ_MASK 0x00000700 -#define TG3_EEPROM_SB_EDH_MAJ_SHFT 8 -#define TG3_EEPROM_SB_EDH_MIN_MASK 0x000000ff -#define TG3_EEPROM_SB_EDH_BLD_MASK 0x0000f800 -#define TG3_EEPROM_SB_EDH_BLD_SHFT 11 - - -/* 32K Window into NIC internal memory */ -#define NIC_SRAM_WIN_BASE 0x00008000 - -/* Offsets into first 32k of NIC internal memory. */ -#define NIC_SRAM_PAGE_ZERO 0x00000000 -#define NIC_SRAM_SEND_RCB 0x00000100 /* 16 * TG3_BDINFO_... */ -#define NIC_SRAM_RCV_RET_RCB 0x00000200 /* 16 * TG3_BDINFO_... */ -#define NIC_SRAM_STATS_BLK 0x00000300 -#define NIC_SRAM_STATUS_BLK 0x00000b00 - -#define NIC_SRAM_FIRMWARE_MBOX 0x00000b50 -#define NIC_SRAM_FIRMWARE_MBOX_MAGIC1 0x4B657654 -#define NIC_SRAM_FIRMWARE_MBOX_MAGIC2 0x4861764b /* !dma on linkchg */ - -#define NIC_SRAM_DATA_SIG 0x00000b54 -#define NIC_SRAM_DATA_SIG_MAGIC 0x4b657654 /* ascii for 'KevT' */ - -#define NIC_SRAM_DATA_CFG 0x00000b58 -#define NIC_SRAM_DATA_CFG_LED_MODE_MASK 0x0000000c -#define NIC_SRAM_DATA_CFG_LED_MODE_MAC 0x00000000 -#define NIC_SRAM_DATA_CFG_LED_MODE_PHY_1 0x00000004 -#define NIC_SRAM_DATA_CFG_LED_MODE_PHY_2 0x00000008 -#define NIC_SRAM_DATA_CFG_PHY_TYPE_MASK 0x00000030 -#define NIC_SRAM_DATA_CFG_PHY_TYPE_UNKNOWN 0x00000000 -#define NIC_SRAM_DATA_CFG_PHY_TYPE_COPPER 0x00000010 -#define NIC_SRAM_DATA_CFG_PHY_TYPE_FIBER 0x00000020 -#define NIC_SRAM_DATA_CFG_WOL_ENABLE 0x00000040 -#define NIC_SRAM_DATA_CFG_ASF_ENABLE 0x00000080 -#define NIC_SRAM_DATA_CFG_EEPROM_WP 0x00000100 -#define NIC_SRAM_DATA_CFG_MINI_PCI 0x00001000 -#define NIC_SRAM_DATA_CFG_FIBER_WOL 0x00004000 -#define NIC_SRAM_DATA_CFG_NO_GPIO2 0x00100000 -#define NIC_SRAM_DATA_CFG_APE_ENABLE 0x00200000 - -#define NIC_SRAM_DATA_VER 0x00000b5c -#define NIC_SRAM_DATA_VER_SHIFT 16 - -#define NIC_SRAM_DATA_PHY_ID 0x00000b74 -#define NIC_SRAM_DATA_PHY_ID1_MASK 0xffff0000 -#define NIC_SRAM_DATA_PHY_ID2_MASK 0x0000ffff - -#define NIC_SRAM_FW_CMD_MBOX 0x00000b78 -#define FWCMD_NICDRV_ALIVE 0x00000001 -#define FWCMD_NICDRV_PAUSE_FW 0x00000002 -#define FWCMD_NICDRV_IPV4ADDR_CHG 0x00000003 -#define FWCMD_NICDRV_IPV6ADDR_CHG 0x00000004 -#define FWCMD_NICDRV_FIX_DMAR 0x00000005 -#define FWCMD_NICDRV_FIX_DMAW 0x00000006 -#define FWCMD_NICDRV_LINK_UPDATE 0x0000000c -#define FWCMD_NICDRV_ALIVE2 0x0000000d -#define FWCMD_NICDRV_ALIVE3 0x0000000e -#define NIC_SRAM_FW_CMD_LEN_MBOX 0x00000b7c -#define NIC_SRAM_FW_CMD_DATA_MBOX 0x00000b80 -#define NIC_SRAM_FW_ASF_STATUS_MBOX 0x00000c00 -#define NIC_SRAM_FW_DRV_STATE_MBOX 0x00000c04 -#define DRV_STATE_START 0x00000001 -#define DRV_STATE_START_DONE 0x80000001 -#define DRV_STATE_UNLOAD 0x00000002 -#define DRV_STATE_UNLOAD_DONE 0x80000002 -#define DRV_STATE_WOL 0x00000003 -#define DRV_STATE_SUSPEND 0x00000004 - -#define NIC_SRAM_FW_RESET_TYPE_MBOX 0x00000c08 - -#define NIC_SRAM_MAC_ADDR_HIGH_MBOX 0x00000c14 -#define NIC_SRAM_MAC_ADDR_LOW_MBOX 0x00000c18 - -#define NIC_SRAM_WOL_MBOX 0x00000d30 -#define WOL_SIGNATURE 0x474c0000 -#define WOL_DRV_STATE_SHUTDOWN 0x00000001 -#define WOL_DRV_WOL 0x00000002 -#define WOL_SET_MAGIC_PKT 0x00000004 - -#define NIC_SRAM_DATA_CFG_2 0x00000d38 - -#define NIC_SRAM_DATA_CFG_2_APD_EN 0x00004000 -#define SHASTA_EXT_LED_MODE_MASK 0x00018000 -#define SHASTA_EXT_LED_LEGACY 0x00000000 -#define SHASTA_EXT_LED_SHARED 0x00008000 -#define SHASTA_EXT_LED_MAC 0x00010000 -#define SHASTA_EXT_LED_COMBO 0x00018000 - -#define NIC_SRAM_DATA_CFG_3 0x00000d3c -#define NIC_SRAM_ASPM_DEBOUNCE 0x00000002 -#define NIC_SRAM_LNK_FLAP_AVOID 0x00400000 -#define NIC_SRAM_1G_ON_VAUX_OK 0x00800000 - -#define NIC_SRAM_DATA_CFG_4 0x00000d60 -#define NIC_SRAM_GMII_MODE 0x00000002 -#define NIC_SRAM_RGMII_INBAND_DISABLE 0x00000004 -#define NIC_SRAM_RGMII_EXT_IBND_RX_EN 0x00000008 -#define NIC_SRAM_RGMII_EXT_IBND_TX_EN 0x00000010 - -#define NIC_SRAM_CPMU_STATUS 0x00000e00 -#define NIC_SRAM_CPMUSTAT_SIG 0x0000362c -#define NIC_SRAM_CPMUSTAT_SIG_MSK 0x0000ffff - -#define NIC_SRAM_DATA_CFG_5 0x00000e0c -#define NIC_SRAM_DISABLE_1G_HALF_ADV 0x00000002 - -#define NIC_SRAM_RX_MINI_BUFFER_DESC 0x00001000 - -#define NIC_SRAM_DMA_DESC_POOL_BASE 0x00002000 -#define NIC_SRAM_DMA_DESC_POOL_SIZE 0x00002000 -#define NIC_SRAM_TX_BUFFER_DESC 0x00004000 /* 512 entries */ -#define NIC_SRAM_RX_BUFFER_DESC 0x00006000 /* 256 entries */ -#define NIC_SRAM_RX_JUMBO_BUFFER_DESC 0x00007000 /* 256 entries */ -#define NIC_SRAM_MBUF_POOL_BASE 0x00008000 -#define NIC_SRAM_MBUF_POOL_SIZE96 0x00018000 -#define NIC_SRAM_MBUF_POOL_SIZE64 0x00010000 -#define NIC_SRAM_MBUF_POOL_BASE5705 0x00010000 -#define NIC_SRAM_MBUF_POOL_SIZE5705 0x0000e000 - -#define TG3_SRAM_RXCPU_SCRATCH_BASE_57766 0x00030000 -#define TG3_SRAM_RXCPU_SCRATCH_SIZE_57766 0x00010000 -#define TG3_57766_FW_BASE_ADDR 0x00030000 -#define TG3_57766_FW_HANDSHAKE 0x0003fccc -#define TG3_SBROM_IN_SERVICE_LOOP 0x51 - -#define TG3_SRAM_RX_STD_BDCACHE_SIZE_5700 128 -#define TG3_SRAM_RX_STD_BDCACHE_SIZE_5755 64 -#define TG3_SRAM_RX_STD_BDCACHE_SIZE_5906 32 - -#define TG3_SRAM_RX_JMB_BDCACHE_SIZE_5700 64 -#define TG3_SRAM_RX_JMB_BDCACHE_SIZE_5717 16 - - -/* Currently this is fixed. */ -#define TG3_PHY_MII_ADDR 0x01 - - -/*** Tigon3 specific PHY MII registers. ***/ -#define MII_TG3_MMD_CTRL 0x0d /* MMD Access Control register */ -#define MII_TG3_MMD_CTRL_DATA_NOINC 0x4000 -#define MII_TG3_MMD_ADDRESS 0x0e /* MMD Address Data register */ - -#define MII_TG3_EXT_CTRL 0x10 /* Extended control register */ -#define MII_TG3_EXT_CTRL_FIFO_ELASTIC 0x0001 -#define MII_TG3_EXT_CTRL_LNK3_LED_MODE 0x0002 -#define MII_TG3_EXT_CTRL_FORCE_LED_OFF 0x0008 -#define MII_TG3_EXT_CTRL_TBI 0x8000 - -#define MII_TG3_EXT_STAT 0x11 /* Extended status register */ -#define MII_TG3_EXT_STAT_MDIX 0x2000 -#define MII_TG3_EXT_STAT_LPASS 0x0100 - -#define MII_TG3_RXR_COUNTERS 0x14 /* Local/Remote Receiver Counts */ -#define MII_TG3_DSP_RW_PORT 0x15 /* DSP coefficient read/write port */ -#define MII_TG3_DSP_CONTROL 0x16 /* DSP control register */ -#define MII_TG3_DSP_ADDRESS 0x17 /* DSP address register */ - -#define MII_TG3_DSP_TAP1 0x0001 -#define MII_TG3_DSP_TAP1_AGCTGT_DFLT 0x0007 -#define MII_TG3_DSP_TAP26 0x001a -#define MII_TG3_DSP_TAP26_ALNOKO 0x0001 -#define MII_TG3_DSP_TAP26_RMRXSTO 0x0002 -#define MII_TG3_DSP_TAP26_OPCSINPT 0x0004 -#define MII_TG3_DSP_AADJ1CH0 0x001f -#define MII_TG3_DSP_CH34TP2 0x4022 -#define MII_TG3_DSP_CH34TP2_HIBW01 0x01ff -#define MII_TG3_DSP_AADJ1CH3 0x601f -#define MII_TG3_DSP_AADJ1CH3_ADCCKADJ 0x0002 -#define MII_TG3_DSP_EXP1_INT_STAT 0x0f01 -#define MII_TG3_DSP_EXP8 0x0f08 -#define MII_TG3_DSP_EXP8_REJ2MHz 0x0001 -#define MII_TG3_DSP_EXP8_AEDW 0x0200 -#define MII_TG3_DSP_EXP75 0x0f75 -#define MII_TG3_DSP_EXP96 0x0f96 -#define MII_TG3_DSP_EXP97 0x0f97 - -#define MII_TG3_AUX_CTRL 0x18 /* auxiliary control register */ - -#define MII_TG3_AUXCTL_SHDWSEL_AUXCTL 0x0000 -#define MII_TG3_AUXCTL_ACTL_TX_6DB 0x0400 -#define MII_TG3_AUXCTL_ACTL_SMDSP_ENA 0x0800 -#define MII_TG3_AUXCTL_ACTL_EXTPKTLEN 0x4000 -#define MII_TG3_AUXCTL_ACTL_EXTLOOPBK 0x8000 - -#define MII_TG3_AUXCTL_SHDWSEL_PWRCTL 0x0002 -#define MII_TG3_AUXCTL_PCTL_WOL_EN 0x0008 -#define MII_TG3_AUXCTL_PCTL_100TX_LPWR 0x0010 -#define MII_TG3_AUXCTL_PCTL_SPR_ISOLATE 0x0020 -#define MII_TG3_AUXCTL_PCTL_CL_AB_TXDAC 0x0040 -#define MII_TG3_AUXCTL_PCTL_VREG_11V 0x0180 - -#define MII_TG3_AUXCTL_SHDWSEL_MISCTEST 0x0004 - -#define MII_TG3_AUXCTL_SHDWSEL_MISC 0x0007 -#define MII_TG3_AUXCTL_MISC_WIRESPD_EN 0x0010 -#define MII_TG3_AUXCTL_MISC_FORCE_AMDIX 0x0200 -#define MII_TG3_AUXCTL_MISC_RDSEL_SHIFT 12 -#define MII_TG3_AUXCTL_MISC_WREN 0x8000 - - -#define MII_TG3_AUX_STAT 0x19 /* auxiliary status register */ -#define MII_TG3_AUX_STAT_LPASS 0x0004 -#define MII_TG3_AUX_STAT_SPDMASK 0x0700 -#define MII_TG3_AUX_STAT_10HALF 0x0100 -#define MII_TG3_AUX_STAT_10FULL 0x0200 -#define MII_TG3_AUX_STAT_100HALF 0x0300 -#define MII_TG3_AUX_STAT_100_4 0x0400 -#define MII_TG3_AUX_STAT_100FULL 0x0500 -#define MII_TG3_AUX_STAT_1000HALF 0x0600 -#define MII_TG3_AUX_STAT_1000FULL 0x0700 -#define MII_TG3_AUX_STAT_100 0x0008 -#define MII_TG3_AUX_STAT_FULL 0x0001 - -#define MII_TG3_ISTAT 0x1a /* IRQ status register */ -#define MII_TG3_IMASK 0x1b /* IRQ mask register */ - -/* ISTAT/IMASK event bits */ -#define MII_TG3_INT_LINKCHG 0x0002 -#define MII_TG3_INT_SPEEDCHG 0x0004 -#define MII_TG3_INT_DUPLEXCHG 0x0008 -#define MII_TG3_INT_ANEG_PAGE_RX 0x0400 - -#define MII_TG3_MISC_SHDW 0x1c -#define MII_TG3_MISC_SHDW_WREN 0x8000 - -#define MII_TG3_MISC_SHDW_APD_WKTM_84MS 0x0001 -#define MII_TG3_MISC_SHDW_APD_ENABLE 0x0020 -#define MII_TG3_MISC_SHDW_APD_SEL 0x2800 - -#define MII_TG3_MISC_SHDW_SCR5_C125OE 0x0001 -#define MII_TG3_MISC_SHDW_SCR5_DLLAPD 0x0002 -#define MII_TG3_MISC_SHDW_SCR5_SDTL 0x0004 -#define MII_TG3_MISC_SHDW_SCR5_DLPTLM 0x0008 -#define MII_TG3_MISC_SHDW_SCR5_LPED 0x0010 -#define MII_TG3_MISC_SHDW_SCR5_SEL 0x1400 - -#define MII_TG3_TEST1 0x1e -#define MII_TG3_TEST1_TRIM_EN 0x0010 -#define MII_TG3_TEST1_CRC_EN 0x8000 - -/* Clause 45 expansion registers */ -#define TG3_CL45_D7_EEERES_STAT 0x803e -#define TG3_CL45_D7_EEERES_STAT_LP_100TX 0x0002 -#define TG3_CL45_D7_EEERES_STAT_LP_1000T 0x0004 - - -/* Fast Ethernet Tranceiver definitions */ -#define MII_TG3_FET_PTEST 0x17 -#define MII_TG3_FET_PTEST_TRIM_SEL 0x0010 -#define MII_TG3_FET_PTEST_TRIM_2 0x0002 -#define MII_TG3_FET_PTEST_FRC_TX_LINK 0x1000 -#define MII_TG3_FET_PTEST_FRC_TX_LOCK 0x0800 - -#define MII_TG3_FET_GEN_STAT 0x1c -#define MII_TG3_FET_GEN_STAT_MDIXSTAT 0x2000 - -#define MII_TG3_FET_TEST 0x1f -#define MII_TG3_FET_SHADOW_EN 0x0080 - -#define MII_TG3_FET_SHDW_MISCCTRL 0x10 -#define MII_TG3_FET_SHDW_MISCCTRL_MDIX 0x4000 - -#define MII_TG3_FET_SHDW_AUXMODE4 0x1a -#define MII_TG3_FET_SHDW_AUXMODE4_SBPD 0x0008 - -#define MII_TG3_FET_SHDW_AUXSTAT2 0x1b -#define MII_TG3_FET_SHDW_AUXSTAT2_APD 0x0020 - -/* Serdes PHY Register Definitions */ -#define SERDES_TG3_1000X_STATUS 0x14 -#define SERDES_TG3_SGMII_MODE 0x0001 -#define SERDES_TG3_LINK_UP 0x0002 -#define SERDES_TG3_FULL_DUPLEX 0x0004 -#define SERDES_TG3_SPEED_100 0x0008 -#define SERDES_TG3_SPEED_1000 0x0010 - -/* APE registers. Accessible through BAR1 */ -#define TG3_APE_GPIO_MSG 0x0008 -#define TG3_APE_GPIO_MSG_SHIFT 4 -#define TG3_APE_EVENT 0x000c -#define APE_EVENT_1 0x00000001 -#define TG3_APE_LOCK_REQ 0x002c -#define APE_LOCK_REQ_DRIVER 0x00001000 -#define TG3_APE_LOCK_GRANT 0x004c -#define APE_LOCK_GRANT_DRIVER 0x00001000 -#define TG3_APE_OTP_CTRL 0x00e8 -#define APE_OTP_CTRL_PROG_EN 0x200000 -#define APE_OTP_CTRL_CMD_RD 0x000000 -#define APE_OTP_CTRL_START 0x000001 -#define TG3_APE_OTP_STATUS 0x00ec -#define APE_OTP_STATUS_CMD_DONE 0x000001 -#define TG3_APE_OTP_ADDR 0x00f0 -#define APE_OTP_ADDR_CPU_ENABLE 0x80000000 -#define TG3_APE_OTP_RD_DATA 0x00f8 - -#define OTP_ADDRESS_MAGIC0 0x00000050 -#define TG3_OTP_MAGIC0_VALID(val) \ - ((((val) & 0xf0000000) == 0xa0000000) ||\ - (((val) & 0x0f000000) == 0x0a000000)) - -/* APE shared memory. Accessible through BAR1 */ -#define TG3_APE_SHMEM_BASE 0x4000 -#define TG3_APE_SEG_SIG 0x4000 -#define APE_SEG_SIG_MAGIC 0x41504521 -#define TG3_APE_FW_STATUS 0x400c -#define APE_FW_STATUS_READY 0x00000100 -#define TG3_APE_FW_FEATURES 0x4010 -#define TG3_APE_FW_FEATURE_NCSI 0x00000002 -#define TG3_APE_FW_VERSION 0x4018 -#define APE_FW_VERSION_MAJMSK 0xff000000 -#define APE_FW_VERSION_MAJSFT 24 -#define APE_FW_VERSION_MINMSK 0x00ff0000 -#define APE_FW_VERSION_MINSFT 16 -#define APE_FW_VERSION_REVMSK 0x0000ff00 -#define APE_FW_VERSION_REVSFT 8 -#define APE_FW_VERSION_BLDMSK 0x000000ff -#define TG3_APE_SEG_MSG_BUF_OFF 0x401c -#define TG3_APE_SEG_MSG_BUF_LEN 0x4020 -#define TG3_APE_HOST_SEG_SIG 0x4200 -#define APE_HOST_SEG_SIG_MAGIC 0x484f5354 -#define TG3_APE_HOST_SEG_LEN 0x4204 -#define APE_HOST_SEG_LEN_MAGIC 0x00000020 -#define TG3_APE_HOST_INIT_COUNT 0x4208 -#define TG3_APE_HOST_DRIVER_ID 0x420c -#define APE_HOST_DRIVER_ID_LINUX 0xf0000000 -#define APE_HOST_DRIVER_ID_MAGIC(maj, min) \ - (APE_HOST_DRIVER_ID_LINUX | (maj & 0xff) << 16 | (min & 0xff) << 8) -#define TG3_APE_HOST_BEHAVIOR 0x4210 -#define APE_HOST_BEHAV_NO_PHYLOCK 0x00000001 -#define TG3_APE_HOST_HEARTBEAT_INT_MS 0x4214 -#define APE_HOST_HEARTBEAT_INT_DISABLE 0 -#define APE_HOST_HEARTBEAT_INT_5SEC 5000 -#define TG3_APE_HOST_HEARTBEAT_COUNT 0x4218 -#define TG3_APE_HOST_DRVR_STATE 0x421c -#define TG3_APE_HOST_DRVR_STATE_START 0x00000001 -#define TG3_APE_HOST_DRVR_STATE_UNLOAD 0x00000002 -#define TG3_APE_HOST_DRVR_STATE_WOL 0x00000003 -#define TG3_APE_HOST_WOL_SPEED 0x4224 -#define TG3_APE_HOST_WOL_SPEED_AUTO 0x00008000 - -#define TG3_APE_EVENT_STATUS 0x4300 - -#define APE_EVENT_STATUS_DRIVER_EVNT 0x00000010 -#define APE_EVENT_STATUS_STATE_CHNGE 0x00000500 -#define APE_EVENT_STATUS_SCRTCHPD_READ 0x00001600 -#define APE_EVENT_STATUS_SCRTCHPD_WRITE 0x00001700 -#define APE_EVENT_STATUS_STATE_START 0x00010000 -#define APE_EVENT_STATUS_STATE_UNLOAD 0x00020000 -#define APE_EVENT_STATUS_STATE_WOL 0x00030000 -#define APE_EVENT_STATUS_STATE_SUSPEND 0x00040000 -#define APE_EVENT_STATUS_EVENT_PENDING 0x80000000 - -#define TG3_APE_PER_LOCK_REQ 0x8400 -#define APE_LOCK_PER_REQ_DRIVER 0x00001000 -#define TG3_APE_PER_LOCK_GRANT 0x8420 -#define APE_PER_LOCK_GRANT_DRIVER 0x00001000 - -/* APE convenience enumerations. */ -#define TG3_APE_LOCK_PHY0 0 -#define TG3_APE_LOCK_GRC 1 -#define TG3_APE_LOCK_PHY1 2 -#define TG3_APE_LOCK_PHY2 3 -#define TG3_APE_LOCK_MEM 4 -#define TG3_APE_LOCK_PHY3 5 -#define TG3_APE_LOCK_GPIO 7 - -#define TG3_EEPROM_SB_F1R2_MBA_OFF 0x10 - - -/* There are two ways to manage the TX descriptors on the tigon3. - * Either the descriptors are in host DMA'able memory, or they - * exist only in the cards on-chip SRAM. All 16 send bds are under - * the same mode, they may not be configured individually. - * - * This driver always uses host memory TX descriptors. - * - * To use host memory TX descriptors: - * 1) Set GRC_MODE_HOST_SENDBDS in GRC_MODE register. - * Make sure GRC_MODE_4X_NIC_SEND_RINGS is clear. - * 2) Allocate DMA'able memory. - * 3) In NIC_SRAM_SEND_RCB (of desired index) of on-chip SRAM: - * a) Set TG3_BDINFO_HOST_ADDR to DMA address of memory - * obtained in step 2 - * b) Set TG3_BDINFO_NIC_ADDR to NIC_SRAM_TX_BUFFER_DESC. - * c) Set len field of TG3_BDINFO_MAXLEN_FLAGS to number - * of TX descriptors. Leave flags field clear. - * 4) Access TX descriptors via host memory. The chip - * will refetch into local SRAM as needed when producer - * index mailboxes are updated. - * - * To use on-chip TX descriptors: - * 1) Set GRC_MODE_4X_NIC_SEND_RINGS in GRC_MODE register. - * Make sure GRC_MODE_HOST_SENDBDS is clear. - * 2) In NIC_SRAM_SEND_RCB (of desired index) of on-chip SRAM: - * a) Set TG3_BDINFO_HOST_ADDR to zero. - * b) Set TG3_BDINFO_NIC_ADDR to NIC_SRAM_TX_BUFFER_DESC - * c) TG3_BDINFO_MAXLEN_FLAGS is don't care. - * 3) Access TX descriptors directly in on-chip SRAM - * using normal {read,write}l(). (and not using - * pointer dereferencing of ioremap()'d memory like - * the broken Broadcom driver does) - * - * Note that BDINFO_FLAGS_DISABLED should be set in the flags field of - * TG3_BDINFO_MAXLEN_FLAGS of all unused SEND_RCB indices. - */ -struct tg3_tx_buffer_desc { - u32 addr_hi; - u32 addr_lo; - - u32 len_flags; -#define TXD_FLAG_TCPUDP_CSUM 0x0001 -#define TXD_FLAG_IP_CSUM 0x0002 -#define TXD_FLAG_END 0x0004 -#define TXD_FLAG_IP_FRAG 0x0008 -#define TXD_FLAG_JMB_PKT 0x0008 -#define TXD_FLAG_IP_FRAG_END 0x0010 -#define TXD_FLAG_HWTSTAMP 0x0020 -#define TXD_FLAG_VLAN 0x0040 -#define TXD_FLAG_COAL_NOW 0x0080 -#define TXD_FLAG_CPU_PRE_DMA 0x0100 -#define TXD_FLAG_CPU_POST_DMA 0x0200 -#define TXD_FLAG_ADD_SRC_ADDR 0x1000 -#define TXD_FLAG_CHOOSE_SRC_ADDR 0x6000 -#define TXD_FLAG_NO_CRC 0x8000 -#define TXD_LEN_SHIFT 16 - - u32 vlan_tag; -#define TXD_VLAN_TAG_SHIFT 0 -#define TXD_MSS_SHIFT 16 -}; - -#define TXD_ADDR 0x00UL /* 64-bit */ -#define TXD_LEN_FLAGS 0x08UL /* 32-bit (upper 16-bits are len) */ -#define TXD_VLAN_TAG 0x0cUL /* 32-bit (upper 16-bits are tag) */ -#define TXD_SIZE 0x10UL - -struct tg3_rx_buffer_desc { - u32 addr_hi; - u32 addr_lo; - - u32 idx_len; -#define RXD_IDX_MASK 0xffff0000 -#define RXD_IDX_SHIFT 16 -#define RXD_LEN_MASK 0x0000ffff -#define RXD_LEN_SHIFT 0 - - u32 type_flags; -#define RXD_TYPE_SHIFT 16 -#define RXD_FLAGS_SHIFT 0 - -#define RXD_FLAG_END 0x0004 -#define RXD_FLAG_MINI 0x0800 -#define RXD_FLAG_JUMBO 0x0020 -#define RXD_FLAG_VLAN 0x0040 -#define RXD_FLAG_ERROR 0x0400 -#define RXD_FLAG_IP_CSUM 0x1000 -#define RXD_FLAG_TCPUDP_CSUM 0x2000 -#define RXD_FLAG_IS_TCP 0x4000 -#define RXD_FLAG_PTPSTAT_MASK 0x0210 -#define RXD_FLAG_PTPSTAT_PTPV1 0x0010 -#define RXD_FLAG_PTPSTAT_PTPV2 0x0200 - - u32 ip_tcp_csum; -#define RXD_IPCSUM_MASK 0xffff0000 -#define RXD_IPCSUM_SHIFT 16 -#define RXD_TCPCSUM_MASK 0x0000ffff -#define RXD_TCPCSUM_SHIFT 0 - - u32 err_vlan; - -#define RXD_VLAN_MASK 0x0000ffff - -#define RXD_ERR_BAD_CRC 0x00010000 -#define RXD_ERR_COLLISION 0x00020000 -#define RXD_ERR_LINK_LOST 0x00040000 -#define RXD_ERR_PHY_DECODE 0x00080000 -#define RXD_ERR_ODD_NIBBLE_RCVD_MII 0x00100000 -#define RXD_ERR_MAC_ABRT 0x00200000 -#define RXD_ERR_TOO_SMALL 0x00400000 -#define RXD_ERR_NO_RESOURCES 0x00800000 -#define RXD_ERR_HUGE_FRAME 0x01000000 - -#define RXD_ERR_MASK (RXD_ERR_BAD_CRC | RXD_ERR_COLLISION | \ - RXD_ERR_LINK_LOST | RXD_ERR_PHY_DECODE | \ - RXD_ERR_MAC_ABRT | RXD_ERR_TOO_SMALL | \ - RXD_ERR_NO_RESOURCES | RXD_ERR_HUGE_FRAME) - - u32 reserved; - u32 opaque; -#define RXD_OPAQUE_INDEX_MASK 0x0000ffff -#define RXD_OPAQUE_INDEX_SHIFT 0 -#define RXD_OPAQUE_RING_STD 0x00010000 -#define RXD_OPAQUE_RING_JUMBO 0x00020000 -#define RXD_OPAQUE_RING_MINI 0x00040000 -#define RXD_OPAQUE_RING_MASK 0x00070000 -}; - -struct tg3_ext_rx_buffer_desc { - struct { - u32 addr_hi; - u32 addr_lo; - } addrlist[3]; - u32 len2_len1; - u32 resv_len3; - struct tg3_rx_buffer_desc std; -}; - -/* We only use this when testing out the DMA engine - * at probe time. This is the internal format of buffer - * descriptors used by the chip at NIC_SRAM_DMA_DESCS. - */ -struct tg3_internal_buffer_desc { - u32 addr_hi; - u32 addr_lo; - u32 nic_mbuf; - /* XXX FIX THIS */ -#ifdef __BIG_ENDIAN - u16 cqid_sqid; - u16 len; -#else - u16 len; - u16 cqid_sqid; -#endif - u32 flags; - u32 __cookie1; - u32 __cookie2; - u32 __cookie3; -}; - -#define TG3_HW_STATUS_SIZE 0x50 -struct tg3_hw_status { - u32 status; -#define SD_STATUS_UPDATED 0x00000001 -#define SD_STATUS_LINK_CHG 0x00000002 -#define SD_STATUS_ERROR 0x00000004 - - u32 status_tag; - -#ifdef __BIG_ENDIAN - u16 rx_consumer; - u16 rx_jumbo_consumer; -#else - u16 rx_jumbo_consumer; - u16 rx_consumer; -#endif - -#ifdef __BIG_ENDIAN - u16 reserved; - u16 rx_mini_consumer; -#else - u16 rx_mini_consumer; - u16 reserved; -#endif - struct { -#ifdef __BIG_ENDIAN - u16 tx_consumer; - u16 rx_producer; -#else - u16 rx_producer; - u16 tx_consumer; -#endif - } idx[16]; -}; - -typedef struct { - u32 high, low; -} tg3_stat64_t; - -struct tg3_hw_stats { - u8 __reserved0[0x400-0x300]; - - /* Statistics maintained by Receive MAC. */ - tg3_stat64_t rx_octets; - u64 __reserved1; - tg3_stat64_t rx_fragments; - tg3_stat64_t rx_ucast_packets; - tg3_stat64_t rx_mcast_packets; - tg3_stat64_t rx_bcast_packets; - tg3_stat64_t rx_fcs_errors; - tg3_stat64_t rx_align_errors; - tg3_stat64_t rx_xon_pause_rcvd; - tg3_stat64_t rx_xoff_pause_rcvd; - tg3_stat64_t rx_mac_ctrl_rcvd; - tg3_stat64_t rx_xoff_entered; - tg3_stat64_t rx_frame_too_long_errors; - tg3_stat64_t rx_jabbers; - tg3_stat64_t rx_undersize_packets; - tg3_stat64_t rx_in_length_errors; - tg3_stat64_t rx_out_length_errors; - tg3_stat64_t rx_64_or_less_octet_packets; - tg3_stat64_t rx_65_to_127_octet_packets; - tg3_stat64_t rx_128_to_255_octet_packets; - tg3_stat64_t rx_256_to_511_octet_packets; - tg3_stat64_t rx_512_to_1023_octet_packets; - tg3_stat64_t rx_1024_to_1522_octet_packets; - tg3_stat64_t rx_1523_to_2047_octet_packets; - tg3_stat64_t rx_2048_to_4095_octet_packets; - tg3_stat64_t rx_4096_to_8191_octet_packets; - tg3_stat64_t rx_8192_to_9022_octet_packets; - - u64 __unused0[37]; - - /* Statistics maintained by Transmit MAC. */ - tg3_stat64_t tx_octets; - u64 __reserved2; - tg3_stat64_t tx_collisions; - tg3_stat64_t tx_xon_sent; - tg3_stat64_t tx_xoff_sent; - tg3_stat64_t tx_flow_control; - tg3_stat64_t tx_mac_errors; - tg3_stat64_t tx_single_collisions; - tg3_stat64_t tx_mult_collisions; - tg3_stat64_t tx_deferred; - u64 __reserved3; - tg3_stat64_t tx_excessive_collisions; - tg3_stat64_t tx_late_collisions; - tg3_stat64_t tx_collide_2times; - tg3_stat64_t tx_collide_3times; - tg3_stat64_t tx_collide_4times; - tg3_stat64_t tx_collide_5times; - tg3_stat64_t tx_collide_6times; - tg3_stat64_t tx_collide_7times; - tg3_stat64_t tx_collide_8times; - tg3_stat64_t tx_collide_9times; - tg3_stat64_t tx_collide_10times; - tg3_stat64_t tx_collide_11times; - tg3_stat64_t tx_collide_12times; - tg3_stat64_t tx_collide_13times; - tg3_stat64_t tx_collide_14times; - tg3_stat64_t tx_collide_15times; - tg3_stat64_t tx_ucast_packets; - tg3_stat64_t tx_mcast_packets; - tg3_stat64_t tx_bcast_packets; - tg3_stat64_t tx_carrier_sense_errors; - tg3_stat64_t tx_discards; - tg3_stat64_t tx_errors; - - u64 __unused1[31]; - - /* Statistics maintained by Receive List Placement. */ - tg3_stat64_t COS_rx_packets[16]; - tg3_stat64_t COS_rx_filter_dropped; - tg3_stat64_t dma_writeq_full; - tg3_stat64_t dma_write_prioq_full; - tg3_stat64_t rxbds_empty; - tg3_stat64_t rx_discards; - tg3_stat64_t rx_errors; - tg3_stat64_t rx_threshold_hit; - - u64 __unused2[9]; - - /* Statistics maintained by Send Data Initiator. */ - tg3_stat64_t COS_out_packets[16]; - tg3_stat64_t dma_readq_full; - tg3_stat64_t dma_read_prioq_full; - tg3_stat64_t tx_comp_queue_full; - - /* Statistics maintained by Host Coalescing. */ - tg3_stat64_t ring_set_send_prod_index; - tg3_stat64_t ring_status_update; - tg3_stat64_t nic_irqs; - tg3_stat64_t nic_avoided_irqs; - tg3_stat64_t nic_tx_threshold_hit; - - /* NOT a part of the hardware statistics block format. - * These stats are here as storage for tg3_periodic_fetch_stats(). - */ - tg3_stat64_t mbuf_lwm_thresh_hit; - - u8 __reserved4[0xb00-0x9c8]; -}; - -#define TG3_SD_NUM_RECS 3 -#define TG3_OCIR_LEN (sizeof(struct tg3_ocir)) -#define TG3_OCIR_SIG_MAGIC 0x5253434f -#define TG3_OCIR_FLAG_ACTIVE 0x00000001 - -#define TG3_TEMP_CAUTION_OFFSET 0xc8 -#define TG3_TEMP_MAX_OFFSET 0xcc -#define TG3_TEMP_SENSOR_OFFSET 0xd4 - - -struct tg3_ocir { - u32 signature; - u16 version_flags; - u16 refresh_int; - u32 refresh_tmr; - u32 update_tmr; - u32 dst_base_addr; - u16 src_hdr_offset; - u16 src_hdr_length; - u16 src_data_offset; - u16 src_data_length; - u16 dst_hdr_offset; - u16 dst_data_offset; - u16 dst_reg_upd_offset; - u16 dst_sem_offset; - u32 reserved1[2]; - u32 port0_flags; - u32 port1_flags; - u32 port2_flags; - u32 port3_flags; - u32 reserved2[1]; -}; - - -/* 'mapping' is superfluous as the chip does not write into - * the tx/rx post rings so we could just fetch it from there. - * But the cache behavior is better how we are doing it now. - * - * This driver uses new build_skb() API : - * RX ring buffer contains pointer to kmalloc() data only, - * skb are built only after Hardware filled the frame. - */ -struct ring_info { - u8 *data; - DEFINE_DMA_UNMAP_ADDR(mapping); -}; - -struct tg3_tx_ring_info { - struct sk_buff *skb; - DEFINE_DMA_UNMAP_ADDR(mapping); - bool fragmented; -}; - -struct tg3_link_config { - /* Describes what we're trying to get. */ - u32 advertising; - u16 speed; - u8 duplex; - u8 autoneg; - u8 flowctrl; - - /* Describes what we actually have. */ - u8 active_flowctrl; - - u8 active_duplex; - u16 active_speed; - u32 rmt_adv; -}; - -struct tg3_bufmgr_config { - u32 mbuf_read_dma_low_water; - u32 mbuf_mac_rx_low_water; - u32 mbuf_high_water; - - u32 mbuf_read_dma_low_water_jumbo; - u32 mbuf_mac_rx_low_water_jumbo; - u32 mbuf_high_water_jumbo; - - u32 dma_low_water; - u32 dma_high_water; -}; - -struct tg3_ethtool_stats { - /* Statistics maintained by Receive MAC. */ - u64 rx_octets; - u64 rx_fragments; - u64 rx_ucast_packets; - u64 rx_mcast_packets; - u64 rx_bcast_packets; - u64 rx_fcs_errors; - u64 rx_align_errors; - u64 rx_xon_pause_rcvd; - u64 rx_xoff_pause_rcvd; - u64 rx_mac_ctrl_rcvd; - u64 rx_xoff_entered; - u64 rx_frame_too_long_errors; - u64 rx_jabbers; - u64 rx_undersize_packets; - u64 rx_in_length_errors; - u64 rx_out_length_errors; - u64 rx_64_or_less_octet_packets; - u64 rx_65_to_127_octet_packets; - u64 rx_128_to_255_octet_packets; - u64 rx_256_to_511_octet_packets; - u64 rx_512_to_1023_octet_packets; - u64 rx_1024_to_1522_octet_packets; - u64 rx_1523_to_2047_octet_packets; - u64 rx_2048_to_4095_octet_packets; - u64 rx_4096_to_8191_octet_packets; - u64 rx_8192_to_9022_octet_packets; - - /* Statistics maintained by Transmit MAC. */ - u64 tx_octets; - u64 tx_collisions; - u64 tx_xon_sent; - u64 tx_xoff_sent; - u64 tx_flow_control; - u64 tx_mac_errors; - u64 tx_single_collisions; - u64 tx_mult_collisions; - u64 tx_deferred; - u64 tx_excessive_collisions; - u64 tx_late_collisions; - u64 tx_collide_2times; - u64 tx_collide_3times; - u64 tx_collide_4times; - u64 tx_collide_5times; - u64 tx_collide_6times; - u64 tx_collide_7times; - u64 tx_collide_8times; - u64 tx_collide_9times; - u64 tx_collide_10times; - u64 tx_collide_11times; - u64 tx_collide_12times; - u64 tx_collide_13times; - u64 tx_collide_14times; - u64 tx_collide_15times; - u64 tx_ucast_packets; - u64 tx_mcast_packets; - u64 tx_bcast_packets; - u64 tx_carrier_sense_errors; - u64 tx_discards; - u64 tx_errors; - - /* Statistics maintained by Receive List Placement. */ - u64 dma_writeq_full; - u64 dma_write_prioq_full; - u64 rxbds_empty; - u64 rx_discards; - u64 rx_errors; - u64 rx_threshold_hit; - - /* Statistics maintained by Send Data Initiator. */ - u64 dma_readq_full; - u64 dma_read_prioq_full; - u64 tx_comp_queue_full; - - /* Statistics maintained by Host Coalescing. */ - u64 ring_set_send_prod_index; - u64 ring_status_update; - u64 nic_irqs; - u64 nic_avoided_irqs; - u64 nic_tx_threshold_hit; - - u64 mbuf_lwm_thresh_hit; -}; - -struct tg3_rx_prodring_set { - u32 rx_std_prod_idx; - u32 rx_std_cons_idx; - u32 rx_jmb_prod_idx; - u32 rx_jmb_cons_idx; - struct tg3_rx_buffer_desc *rx_std; - struct tg3_ext_rx_buffer_desc *rx_jmb; - struct ring_info *rx_std_buffers; - struct ring_info *rx_jmb_buffers; - dma_addr_t rx_std_mapping; - dma_addr_t rx_jmb_mapping; -}; - -#define TG3_RSS_MAX_NUM_QS 4 -#define TG3_IRQ_MAX_VECS_RSS (TG3_RSS_MAX_NUM_QS + 1) -#define TG3_IRQ_MAX_VECS TG3_IRQ_MAX_VECS_RSS - -struct tg3_napi { - struct napi_struct napi ____cacheline_aligned; - struct tg3 *tp; - struct tg3_hw_status *hw_status; - - u32 chk_msi_cnt; - u32 last_tag; - u32 last_irq_tag; - u32 int_mbox; - u32 coal_now; - - u32 consmbox ____cacheline_aligned; - u32 rx_rcb_ptr; - u32 last_rx_cons; - u16 *rx_rcb_prod_idx; - struct tg3_rx_prodring_set prodring; - struct tg3_rx_buffer_desc *rx_rcb; - - u32 tx_prod ____cacheline_aligned; - u32 tx_cons; - u32 tx_pending; - u32 last_tx_cons; - u32 prodmbox; - struct tg3_tx_buffer_desc *tx_ring; - struct tg3_tx_ring_info *tx_buffers; - - dma_addr_t status_mapping; - dma_addr_t rx_rcb_mapping; - dma_addr_t tx_desc_mapping; - - char irq_lbl[IFNAMSIZ]; - unsigned int irq_vec; -}; - -enum TG3_FLAGS { - TG3_FLAG_TAGGED_STATUS = 0, - TG3_FLAG_TXD_MBOX_HWBUG, - TG3_FLAG_USE_LINKCHG_REG, - TG3_FLAG_ERROR_PROCESSED, - TG3_FLAG_ENABLE_ASF, - TG3_FLAG_ASPM_WORKAROUND, - TG3_FLAG_POLL_SERDES, - TG3_FLAG_POLL_CPMU_LINK, - TG3_FLAG_MBOX_WRITE_REORDER, - TG3_FLAG_PCIX_TARGET_HWBUG, - TG3_FLAG_WOL_SPEED_100MB, - TG3_FLAG_WOL_ENABLE, - TG3_FLAG_EEPROM_WRITE_PROT, - TG3_FLAG_NVRAM, - TG3_FLAG_NVRAM_BUFFERED, - TG3_FLAG_SUPPORT_MSI, - TG3_FLAG_SUPPORT_MSIX, - TG3_FLAG_USING_MSI, - TG3_FLAG_USING_MSIX, - TG3_FLAG_PCIX_MODE, - TG3_FLAG_PCI_HIGH_SPEED, - TG3_FLAG_PCI_32BIT, - TG3_FLAG_SRAM_USE_CONFIG, - TG3_FLAG_TX_RECOVERY_PENDING, - TG3_FLAG_WOL_CAP, - TG3_FLAG_JUMBO_RING_ENABLE, - TG3_FLAG_PAUSE_AUTONEG, - TG3_FLAG_CPMU_PRESENT, - TG3_FLAG_40BIT_DMA_BUG, - TG3_FLAG_BROKEN_CHECKSUMS, - TG3_FLAG_JUMBO_CAPABLE, - TG3_FLAG_CHIP_RESETTING, - TG3_FLAG_INIT_COMPLETE, - TG3_FLAG_MAX_RXPEND_64, - TG3_FLAG_PCI_EXPRESS, /* BCM5785 + pci_is_pcie() */ - TG3_FLAG_ASF_NEW_HANDSHAKE, - TG3_FLAG_HW_AUTONEG, - TG3_FLAG_IS_NIC, - TG3_FLAG_FLASH, - TG3_FLAG_FW_TSO, - TG3_FLAG_HW_TSO_1, - TG3_FLAG_HW_TSO_2, - TG3_FLAG_HW_TSO_3, - TG3_FLAG_TSO_CAPABLE, - TG3_FLAG_TSO_BUG, - TG3_FLAG_ICH_WORKAROUND, - TG3_FLAG_1SHOT_MSI, - TG3_FLAG_NO_FWARE_REPORTED, - TG3_FLAG_NO_NVRAM_ADDR_TRANS, - TG3_FLAG_ENABLE_APE, - TG3_FLAG_PROTECTED_NVRAM, - TG3_FLAG_5701_DMA_BUG, - TG3_FLAG_USE_PHYLIB, - TG3_FLAG_MDIOBUS_INITED, - TG3_FLAG_LRG_PROD_RING_CAP, - TG3_FLAG_RGMII_INBAND_DISABLE, - TG3_FLAG_RGMII_EXT_IBND_RX_EN, - TG3_FLAG_RGMII_EXT_IBND_TX_EN, - TG3_FLAG_CLKREQ_BUG, - TG3_FLAG_NO_NVRAM, - TG3_FLAG_ENABLE_RSS, - TG3_FLAG_ENABLE_TSS, - TG3_FLAG_SHORT_DMA_BUG, - TG3_FLAG_USE_JUMBO_BDFLAG, - TG3_FLAG_L1PLLPD_EN, - TG3_FLAG_APE_HAS_NCSI, - TG3_FLAG_TX_TSTAMP_EN, - TG3_FLAG_4K_FIFO_LIMIT, - TG3_FLAG_5719_5720_RDMA_BUG, - TG3_FLAG_RESET_TASK_PENDING, - TG3_FLAG_PTP_CAPABLE, - TG3_FLAG_5705_PLUS, - TG3_FLAG_IS_5788, - TG3_FLAG_5750_PLUS, - TG3_FLAG_5780_CLASS, - TG3_FLAG_5755_PLUS, - TG3_FLAG_57765_PLUS, - TG3_FLAG_57765_CLASS, - TG3_FLAG_5717_PLUS, - TG3_FLAG_IS_SSB_CORE, - TG3_FLAG_FLUSH_POSTED_WRITES, - TG3_FLAG_ROBOSWITCH, - TG3_FLAG_ONE_DMA_AT_ONCE, - TG3_FLAG_RGMII_MODE, - - /* Add new flags before this comment and TG3_FLAG_NUMBER_OF_FLAGS */ - TG3_FLAG_NUMBER_OF_FLAGS, /* Last entry in enum TG3_FLAGS */ -}; - -struct tg3_firmware_hdr { - __be32 version; /* unused for fragments */ - __be32 base_addr; - __be32 len; -}; -#define TG3_FW_HDR_LEN (sizeof(struct tg3_firmware_hdr)) - -struct tg3 { - /* begin "general, frequently-used members" cacheline section */ - - /* If the IRQ handler (which runs lockless) needs to be - * quiesced, the following bitmask state is used. The - * SYNC flag is set by non-IRQ context code to initiate - * the quiescence. - * - * When the IRQ handler notices that SYNC is set, it - * disables interrupts and returns. - * - * When all outstanding IRQ handlers have returned after - * the SYNC flag has been set, the setter can be assured - * that interrupts will no longer get run. - * - * In this way all SMP driver locks are never acquired - * in hw IRQ context, only sw IRQ context or lower. - */ - unsigned int irq_sync; - - /* SMP locking strategy: - * - * lock: Held during reset, PHY access, timer, and when - * updating tg3_flags. - * - * netif_tx_lock: Held during tg3_start_xmit. tg3_tx holds - * netif_tx_lock when it needs to call - * netif_wake_queue. - * - * Both of these locks are to be held with BH safety. - * - * Because the IRQ handler, tg3_poll, and tg3_start_xmit - * are running lockless, it is necessary to completely - * quiesce the chip with tg3_netif_stop and tg3_full_lock - * before reconfiguring the device. - * - * indirect_lock: Held when accessing registers indirectly - * with IRQ disabling. - */ - spinlock_t lock; - spinlock_t indirect_lock; - - u32 (*read32) (struct tg3 *, u32); - void (*write32) (struct tg3 *, u32, u32); - u32 (*read32_mbox) (struct tg3 *, u32); - void (*write32_mbox) (struct tg3 *, u32, - u32); - void __iomem *regs; - void __iomem *aperegs; - struct net_device *dev; - struct pci_dev *pdev; - - u32 coal_now; - u32 msg_enable; - - struct ptp_clock_info ptp_info; - struct ptp_clock *ptp_clock; - s64 ptp_adjust; - - /* begin "tx thread" cacheline section */ - void (*write32_tx_mbox) (struct tg3 *, u32, - u32); - u32 dma_limit; - u32 txq_req; - u32 txq_cnt; - u32 txq_max; - - /* begin "rx thread" cacheline section */ - struct tg3_napi napi[TG3_IRQ_MAX_VECS]; - void (*write32_rx_mbox) (struct tg3 *, u32, - u32); - u32 rx_copy_thresh; - u32 rx_std_ring_mask; - u32 rx_jmb_ring_mask; - u32 rx_ret_ring_mask; - u32 rx_pending; - u32 rx_jumbo_pending; - u32 rx_std_max_post; - u32 rx_offset; - u32 rx_pkt_map_sz; - u32 rxq_req; - u32 rxq_cnt; - u32 rxq_max; - bool rx_refill; - - - /* begin "everything else" cacheline(s) section */ - unsigned long rx_dropped; - unsigned long tx_dropped; - struct rtnl_link_stats64 net_stats_prev; - struct tg3_ethtool_stats estats_prev; - - DECLARE_BITMAP(tg3_flags, TG3_FLAG_NUMBER_OF_FLAGS); - - union { - unsigned long phy_crc_errors; - unsigned long last_event_jiffies; - }; - - struct timer_list timer; - u16 timer_counter; - u16 timer_multiplier; - u32 timer_offset; - u16 asf_counter; - u16 asf_multiplier; - - /* 1 second counter for transient serdes link events */ - u32 serdes_counter; -#define SERDES_AN_TIMEOUT_5704S 2 -#define SERDES_PARALLEL_DET_TIMEOUT 1 -#define SERDES_AN_TIMEOUT_5714S 1 - - struct tg3_link_config link_config; - struct tg3_bufmgr_config bufmgr_config; - - /* cache h/w values, often passed straight to h/w */ - u32 rx_mode; - u32 tx_mode; - u32 mac_mode; - u32 mi_mode; - u32 misc_host_ctrl; - u32 grc_mode; - u32 grc_local_ctrl; - u32 dma_rwctrl; - u32 coalesce_mode; - u32 pwrmgmt_thresh; - u32 rxptpctl; - - /* PCI block */ - u32 pci_chip_rev_id; - u16 pci_cmd; - u8 pci_cacheline_sz; - u8 pci_lat_timer; - - int pci_fn; - int msi_cap; - int pcix_cap; - int pcie_readrq; - - struct mii_bus *mdio_bus; - int old_link; - - u8 phy_addr; - u8 phy_ape_lock; - - /* PHY info */ - u32 phy_id; -#define TG3_PHY_ID_MASK 0xfffffff0 -#define TG3_PHY_ID_BCM5400 0x60008040 -#define TG3_PHY_ID_BCM5401 0x60008050 -#define TG3_PHY_ID_BCM5411 0x60008070 -#define TG3_PHY_ID_BCM5701 0x60008110 -#define TG3_PHY_ID_BCM5703 0x60008160 -#define TG3_PHY_ID_BCM5704 0x60008190 -#define TG3_PHY_ID_BCM5705 0x600081a0 -#define TG3_PHY_ID_BCM5750 0x60008180 -#define TG3_PHY_ID_BCM5752 0x60008100 -#define TG3_PHY_ID_BCM5714 0x60008340 -#define TG3_PHY_ID_BCM5780 0x60008350 -#define TG3_PHY_ID_BCM5755 0xbc050cc0 -#define TG3_PHY_ID_BCM5787 0xbc050ce0 -#define TG3_PHY_ID_BCM5756 0xbc050ed0 -#define TG3_PHY_ID_BCM5784 0xbc050fa0 -#define TG3_PHY_ID_BCM5761 0xbc050fd0 -#define TG3_PHY_ID_BCM5718C 0x5c0d8a00 -#define TG3_PHY_ID_BCM5718S 0xbc050ff0 -#define TG3_PHY_ID_BCM57765 0x5c0d8a40 -#define TG3_PHY_ID_BCM5719C 0x5c0d8a20 -#define TG3_PHY_ID_BCM5720C 0x5c0d8b60 -#define TG3_PHY_ID_BCM5762 0x85803780 -#define TG3_PHY_ID_BCM5906 0xdc00ac40 -#define TG3_PHY_ID_BCM8002 0x60010140 -#define TG3_PHY_ID_INVALID 0xffffffff - -#define PHY_ID_RTL8211C 0x001cc910 -#define PHY_ID_RTL8201E 0x00008200 - -#define TG3_PHY_ID_REV_MASK 0x0000000f -#define TG3_PHY_REV_BCM5401_B0 0x1 - - /* This macro assumes the passed PHY ID is - * already masked with TG3_PHY_ID_MASK. - */ -#define TG3_KNOWN_PHY_ID(X) \ - ((X) == TG3_PHY_ID_BCM5400 || (X) == TG3_PHY_ID_BCM5401 || \ - (X) == TG3_PHY_ID_BCM5411 || (X) == TG3_PHY_ID_BCM5701 || \ - (X) == TG3_PHY_ID_BCM5703 || (X) == TG3_PHY_ID_BCM5704 || \ - (X) == TG3_PHY_ID_BCM5705 || (X) == TG3_PHY_ID_BCM5750 || \ - (X) == TG3_PHY_ID_BCM5752 || (X) == TG3_PHY_ID_BCM5714 || \ - (X) == TG3_PHY_ID_BCM5780 || (X) == TG3_PHY_ID_BCM5787 || \ - (X) == TG3_PHY_ID_BCM5755 || (X) == TG3_PHY_ID_BCM5756 || \ - (X) == TG3_PHY_ID_BCM5906 || (X) == TG3_PHY_ID_BCM5761 || \ - (X) == TG3_PHY_ID_BCM5718C || (X) == TG3_PHY_ID_BCM5718S || \ - (X) == TG3_PHY_ID_BCM57765 || (X) == TG3_PHY_ID_BCM5719C || \ - (X) == TG3_PHY_ID_BCM5720C || (X) == TG3_PHY_ID_BCM5762 || \ - (X) == TG3_PHY_ID_BCM8002) - - u32 phy_flags; -#define TG3_PHYFLG_IS_LOW_POWER 0x00000001 -#define TG3_PHYFLG_IS_CONNECTED 0x00000002 -#define TG3_PHYFLG_USE_MI_INTERRUPT 0x00000004 -#define TG3_PHYFLG_USER_CONFIGURED 0x00000008 -#define TG3_PHYFLG_PHY_SERDES 0x00000010 -#define TG3_PHYFLG_MII_SERDES 0x00000020 -#define TG3_PHYFLG_ANY_SERDES (TG3_PHYFLG_PHY_SERDES | \ - TG3_PHYFLG_MII_SERDES) -#define TG3_PHYFLG_IS_FET 0x00000040 -#define TG3_PHYFLG_10_100_ONLY 0x00000080 -#define TG3_PHYFLG_ENABLE_APD 0x00000100 -#define TG3_PHYFLG_CAPACITIVE_COUPLING 0x00000200 -#define TG3_PHYFLG_NO_ETH_WIRE_SPEED 0x00000400 -#define TG3_PHYFLG_JITTER_BUG 0x00000800 -#define TG3_PHYFLG_ADJUST_TRIM 0x00001000 -#define TG3_PHYFLG_ADC_BUG 0x00002000 -#define TG3_PHYFLG_5704_A0_BUG 0x00004000 -#define TG3_PHYFLG_BER_BUG 0x00008000 -#define TG3_PHYFLG_SERDES_PREEMPHASIS 0x00010000 -#define TG3_PHYFLG_PARALLEL_DETECT 0x00020000 -#define TG3_PHYFLG_EEE_CAP 0x00040000 -#define TG3_PHYFLG_1G_ON_VAUX_OK 0x00080000 -#define TG3_PHYFLG_KEEP_LINK_ON_PWRDN 0x00100000 -#define TG3_PHYFLG_MDIX_STATE 0x00200000 -#define TG3_PHYFLG_DISABLE_1G_HD_ADV 0x00400000 - - u32 led_ctrl; - u32 phy_otp; - u32 setlpicnt; - u8 rss_ind_tbl[TG3_RSS_INDIR_TBL_SIZE]; - -#define TG3_BPN_SIZE 24 - char board_part_number[TG3_BPN_SIZE]; -#define TG3_VER_SIZE ETHTOOL_FWVERS_LEN - char fw_ver[TG3_VER_SIZE]; - u32 nic_sram_data_cfg; - u32 pci_clock_ctrl; - struct pci_dev *pdev_peer; - - struct tg3_hw_stats *hw_stats; - dma_addr_t stats_mapping; - struct work_struct reset_task; - - int nvram_lock_cnt; - u32 nvram_size; -#define TG3_NVRAM_SIZE_2KB 0x00000800 -#define TG3_NVRAM_SIZE_64KB 0x00010000 -#define TG3_NVRAM_SIZE_128KB 0x00020000 -#define TG3_NVRAM_SIZE_256KB 0x00040000 -#define TG3_NVRAM_SIZE_512KB 0x00080000 -#define TG3_NVRAM_SIZE_1MB 0x00100000 -#define TG3_NVRAM_SIZE_2MB 0x00200000 - - u32 nvram_pagesize; - u32 nvram_jedecnum; - -#define JEDEC_ATMEL 0x1f -#define JEDEC_ST 0x20 -#define JEDEC_SAIFUN 0x4f -#define JEDEC_SST 0xbf - -#define ATMEL_AT24C02_CHIP_SIZE TG3_NVRAM_SIZE_2KB -#define ATMEL_AT24C02_PAGE_SIZE (8) - -#define ATMEL_AT24C64_CHIP_SIZE TG3_NVRAM_SIZE_64KB -#define ATMEL_AT24C64_PAGE_SIZE (32) - -#define ATMEL_AT24C512_CHIP_SIZE TG3_NVRAM_SIZE_512KB -#define ATMEL_AT24C512_PAGE_SIZE (128) - -#define ATMEL_AT45DB0X1B_PAGE_POS 9 -#define ATMEL_AT45DB0X1B_PAGE_SIZE 264 - -#define ATMEL_AT25F512_PAGE_SIZE 256 - -#define ST_M45PEX0_PAGE_SIZE 256 - -#define SAIFUN_SA25F0XX_PAGE_SIZE 256 - -#define SST_25VF0X0_PAGE_SIZE 4098 - - unsigned int irq_max; - unsigned int irq_cnt; - - struct ethtool_coalesce coal; - struct ethtool_eee eee; - - /* firmware info */ - const char *fw_needed; - const struct firmware *fw; - u32 fw_len; /* includes BSS */ - - struct device *hwmon_dev; - bool link_up; - bool pcierr_recovery; -}; - -/* Accessor macros for chip and asic attributes - * - * nb: Using static inlines equivalent to the accessor macros generates - * larger object code with gcc 4.7. - * Using statement expression macros to check tp with - * typecheck(struct tg3 *, tp) also creates larger objects. - */ -#define tg3_chip_rev_id(tp) \ - ((tp)->pci_chip_rev_id) -#define tg3_asic_rev(tp) \ - ((tp)->pci_chip_rev_id >> 12) -#define tg3_chip_rev(tp) \ - ((tp)->pci_chip_rev_id >> 8) - -#endif /* !(_T3_H) */ diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c index 2a21dbdba973..51028e825914 100755 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c @@ -28,6 +28,7 @@ #include #define CREATE_TRACE_POINTS #include +#include /* RX/TX Fixup */ @@ -176,6 +177,46 @@ static u16 rmnet_vnd_select_queue(struct net_device *dev, return (txq < dev->real_num_tx_queues) ? txq : 0; } +static int rmnet_vnd_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) +{ + int rc = 0; + struct rmnet_ioctl_data_s ioctl_data; + + pr_err("%s: [%s]: rmnet_ipa got ioctl number 0x%08x", __func__, dev->name, cmd); + + switch (cmd) { + /* Flow enable */ + case RMNET_IOCTL_FLOW_ENABLE: + pr_err("[%s] %s: enabled flow +++", dev->name, __func__); + if (copy_from_user(&ioctl_data, ifr->ifr_ifru.ifru_data, + sizeof(struct rmnet_ioctl_data_s))) { + rc = -EFAULT; + break; + } + tc_qdisc_flow_control(dev, ioctl_data.u.tcm_handle, 1); + pr_err("[%s] %s: enabled flow ---", dev->name, __func__); + break; + + /* Flow disable */ + case RMNET_IOCTL_FLOW_DISABLE: + pr_err("[%s] %s: disabled flow +++", dev->name, __func__); + if (copy_from_user(&ioctl_data, ifr->ifr_ifru.ifru_data, + sizeof(struct rmnet_ioctl_data_s))) { + rc = -EFAULT; + break; + } + tc_qdisc_flow_control(dev, ioctl_data.u.tcm_handle, 0); + pr_err("[%s] %s: disabled flow ---", dev->name, __func__); + break; + + default: + pr_err("%s: [%s] unsupported cmd[%d]", __func__, dev->name, cmd); + rc = -EINVAL; + } + + return rc; +} + static const struct net_device_ops rmnet_vnd_ops = { .ndo_start_xmit = rmnet_vnd_start_xmit, .ndo_change_mtu = rmnet_vnd_change_mtu, @@ -186,6 +227,7 @@ static const struct net_device_ops rmnet_vnd_ops = { .ndo_uninit = rmnet_vnd_uninit, .ndo_get_stats64 = rmnet_get_stats64, .ndo_select_queue = rmnet_vnd_select_queue, + .ndo_do_ioctl = rmnet_vnd_ioctl, }; static const char rmnet_gstrings_stats[][ETH_GSTRING_LEN] = { diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/target_if/wifi_pos/src/target_if_wifi_pos.c b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/target_if/wifi_pos/src/target_if_wifi_pos.c index e1aa7640a8eb..b1a2f3d06de2 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/target_if/wifi_pos/src/target_if_wifi_pos.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/target_if/wifi_pos/src/target_if_wifi_pos.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -92,6 +92,7 @@ static QDF_STATUS target_if_wifi_pos_get_indirect_data( void *paddr = NULL; uint32_t addr_hi; uint8_t ring_idx = 0, num_rings; + uint32_t allocated_len; if (!indirect) { target_if_debug("no indirect data. regular event received"); @@ -104,6 +105,16 @@ static QDF_STATUS target_if_wifi_pos_get_indirect_data( target_if_err("incorrect pdev_id: %d", indirect->pdev_id); return QDF_STATUS_E_INVAL; } + + allocated_len = priv_obj->dma_cap[ring_idx].min_buf_size + + (priv_obj->dma_cap[ring_idx].min_buf_align - 1); + if (indirect->len > allocated_len || + indirect->len > OEM_DATA_DMA_BUFF_SIZE) { + target_if_err("Invalid indirect len: %d, allocated_len:%d", + indirect->len, allocated_len); + return QDF_STATUS_E_INVAL; + } + addr_hi = (uint64_t)WMI_OEM_DMA_DATA_ADDR_HI_GET( indirect->addr_hi); paddr = (void *)((uint64_t)addr_hi << 32 | indirect->addr_lo); diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h index 8ae88d5cf4eb..aedf5fd9b129 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h +++ b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h @@ -193,9 +193,17 @@ #define WLAN_HE_6GHZ_CHWIDTH_160_80_80 3 /* 160/80+80 MHz Oper Ch width */ #define WLAN_RATE_VAL 0x7f +#define WLAN_BASIC_RATE_MASK 0x80 #define WLAN_RV(v) ((v) & WLAN_RATE_VAL) +#define WLAN_BSS_MEMBERSHIP_SELECTOR_HT_PHY 127 +#define WLAN_BSS_MEMBERSHIP_SELECTOR_VHT_PHY 126 +#define WLAN_BSS_MEMBERSHIP_SELECTOR_GLK 125 +#define WLAN_BSS_MEMBERSHIP_SELECTOR_EPD 124 +#define WLAN_BSS_MEMBERSHIP_SELECTOR_SAE_H2E 123 +#define WLAN_BSS_MEMBERSHIP_SELECTOR_HE_PHY 122 + #define WLAN_CHAN_IS_5GHZ(chanidx) \ ((chanidx > 30) ? true : false) #define WLAN_CHAN_IS_2GHZ(chanidx) \ diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h index abc3c24c77c9..87756c3ff630 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h +++ b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h @@ -711,6 +711,16 @@ bool wlan_crypto_check_wpa_match(struct wlan_objmgr_psoc *psoc, uint16_t ie_len, struct wlan_crypto_params * peer_crypto_params); +/** + * wlan_crypto_parse_rsnxe_ie() - parse RSNXE IE + * @rsnxe_ie: RSNXE IE pointer + * @cap_len: pointer to hold len of ext capability + * + * Return: pointer to RSNXE capability or NULL + */ +uint8_t * +wlan_crypto_parse_rsnxe_ie(uint8_t *rsnxe_ie, uint8_t *cap_len); + /** * wlan_set_vdev_crypto_prarams_from_ie - Sets vdev crypto params from IE info * @vdev: vdev pointer diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/crypto/inc/wlan_crypto_global_def.h b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/crypto/inc/wlan_crypto_global_def.h index 1d193750337f..3bf666fe058f 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/crypto/inc/wlan_crypto_global_def.h +++ b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/crypto/inc/wlan_crypto_global_def.h @@ -178,6 +178,12 @@ typedef enum wlan_crypto_rsn_cap { WLAN_CRYPTO_RSN_CAP_MFP_REQUIRED = 0x40, } wlan_crypto_rsn_cap; +enum wlan_crypto_rsnx_cap { + WLAN_CRYPTO_RSNX_CAP_PROTECTED_TWT = 0x10, + WLAN_CRYPTO_RSNX_CAP_SAE_H2E = 0x20, + WLAN_CRYPTO_RSNX_CAP_SAE_PK = 0x40, +}; + typedef enum wlan_crypto_key_mgmt { WLAN_CRYPTO_KEY_MGMT_IEEE8021X = 0, WLAN_CRYPTO_KEY_MGMT_PSK = 1, diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/crypto/src/wlan_crypto_global_api.c b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/crypto/src/wlan_crypto_global_api.c index 0f03ae7904a0..16c0d331a0cf 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/crypto/src/wlan_crypto_global_api.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/cmn_services/crypto/src/wlan_crypto_global_api.c @@ -4074,6 +4074,27 @@ wlan_crypto_reset_prarams(struct wlan_crypto_params *params) params->rsn_caps = 0; } +uint8_t * +wlan_crypto_parse_rsnxe_ie(uint8_t *rsnxe_ie, uint8_t *cap_len) +{ + uint8_t len; + uint8_t *ie; + + if (!rsnxe_ie) + return NULL; + + ie = rsnxe_ie; + len = ie[1]; + ie += 2; + + if (!len) + return NULL; + + *cap_len = ie[0] & 0xf; + + return ie; +} + QDF_STATUS wlan_set_vdev_crypto_prarams_from_ie(struct wlan_objmgr_vdev *vdev, uint8_t *ie_ptr, uint16_t ie_len) diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/core/src/wlan_scan_bss_score.c b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/core/src/wlan_scan_bss_score.c index f990d5a53202..d2be2f970176 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/core/src/wlan_scan_bss_score.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/core/src/wlan_scan_bss_score.c @@ -26,6 +26,7 @@ #include "wlan_policy_mgr_api.h" #endif #include "wlan_reg_services_api.h" +#include "wlan_crypto_global_api.h" #define SCM_20MHZ_BW_INDEX 0 #define SCM_40MHZ_BW_INDEX 1 @@ -671,6 +672,36 @@ static uint32_t scm_get_sta_nss(struct wlan_objmgr_psoc *psoc, } #endif +/** + * scm_calculate_sae_pk_ap_weightage() - Calculate SAE-PK AP weightage + * @entry: bss entry + * @score_params: bss score params + * @sae_pk_cap_present: sae_pk cap presetn in RSNXE capability field + * + * Return: SAE-PK AP weightage score + */ +static uint32_t +scm_calculate_sae_pk_ap_weightage(struct scan_cache_entry *entry, + struct scoring_config *score_params, + bool *sae_pk_cap_present) +{ + uint8_t *rsnxe_ie, *rsnxe_cap, cap_len; + + rsnxe_ie = util_scan_entry_rsnxe(entry); + + rsnxe_cap = wlan_crypto_parse_rsnxe_ie(rsnxe_ie, &cap_len); + + if (!rsnxe_cap) + return 0; + + *sae_pk_cap_present = *rsnxe_cap & WLAN_CRYPTO_RSNX_CAP_SAE_PK; + if (*sae_pk_cap_present) + return score_params->weight_cfg.sae_pk_ap_weightage * + MAX_INDEX_SCORE; + + return 0; +} + int scm_calculate_bss_score(struct wlan_objmgr_psoc *psoc, struct scan_default_params *params, struct scan_cache_entry *entry, @@ -695,6 +726,8 @@ int scm_calculate_bss_score(struct wlan_objmgr_psoc *psoc, int8_t rssi_pref_5g_rssi_thresh; bool same_bucket = false; bool ap_su_beam_former = false; + uint32_t sae_pk_score = 0; + bool sae_pk_cap_present = 0; struct wlan_ie_vhtcaps *vht_cap; struct scoring_config *score_config; struct weight_config *weight_config; @@ -805,6 +838,10 @@ int scm_calculate_bss_score(struct wlan_objmgr_psoc *psoc, score += oce_wan_score; } + sae_pk_score = scm_calculate_sae_pk_ap_weightage(entry, score_config, + &sae_pk_cap_present); + score += sae_pk_score; + pdev = wlan_objmgr_get_pdev_by_id(psoc, entry->pdev_id, WLAN_SCAN_ID); if (!pdev) { scm_err("pdev is NULL"); @@ -834,19 +871,20 @@ int scm_calculate_bss_score(struct wlan_objmgr_psoc *psoc, score_config->beamformee_cap, score_config->cb_mode_24G, score_config->cb_mode_5G, sta_nss); - scm_nofl_debug("Candidate(%pM freq %d): rssi %d HT %d VHT %d HE %d su bfer %d phy %d air time frac %d qbss %d cong_pct %d NSS %d", + scm_nofl_debug("Candidate("QDF_MAC_ADDR_FMT" freq %d): rssi %d HT %d VHT %d HE %d su bfer %d phy %d air time frac %d qbss %d cong_pct %d NSS %d sae_pk_cap_present %d", entry->bssid.bytes, entry->channel.chan_freq, entry->rssi_raw, util_scan_entry_htcap(entry) ? 1 : 0, util_scan_entry_vhtcap(entry) ? 1 : 0, util_scan_entry_hecap(entry) ? 1 : 0, ap_su_beam_former, entry->phy_mode, entry->air_time_fraction, - entry->qbss_chan_load, congestion_pct, entry->nss); + entry->qbss_chan_load, congestion_pct, entry->nss, + sae_pk_cap_present); scm_nofl_debug("Scores: prorated_pcnt %d rssi %d pcl %d ht %d vht %d he %d bfee %d bw %d band %d congestion %d nss %d oce wan %d TOTAL %d", prorated_pcnt, rssi_score, pcl_score, ht_score, vht_score, he_score, beamformee_score, bandwidth_score, band_score, congestion_score, nss_score, oce_wan_score, - score); + sae_pk_score, score); entry->bss_score = score; return score; diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/dispatcher/inc/wlan_scan_public_structs.h b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/dispatcher/inc/wlan_scan_public_structs.h index da91a8c096f4..707a4a5fe3cc 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/dispatcher/inc/wlan_scan_public_structs.h +++ b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/dispatcher/inc/wlan_scan_public_structs.h @@ -72,6 +72,7 @@ typedef uint32_t wlan_scan_id; #define BEST_CANDIDATE_MAX_WEIGHT 100 #define MAX_INDEX_SCORE 100 #define MAX_INDEX_PER_INI 4 +#define SAE_PK_AP_WEIGHTAGE 3 #define WLAN_GET_BITS(_val, _index, _num_bits) \ (((_val) >> (_index)) & ((1 << (_num_bits)) - 1)) @@ -162,6 +163,7 @@ struct element_info { * @rnrie: reduced neighbor report IE * @adaptive_11r: pointer to adaptive 11r IE * @single_pmk: Pointer to sae single pmk IE + * @rsnxe: Pointer to rsnxe IE */ struct ie_list { uint8_t *tim; @@ -214,6 +216,7 @@ struct ie_list { uint8_t *extender; uint8_t *adaptive_11r; uint8_t *single_pmk; + uint8_t *rsnxe; }; enum scan_entry_connection_state { @@ -480,6 +483,7 @@ struct scan_cache_entry { * @pcl_weightage: PCL weightage * @channel_congestion_weightage: channel congestion weightage * @oce_wan_weightage: OCE WAN metrics weightage + * @sae_pk_ap_weightage: SAE-PK AP weigtage */ struct weight_config { uint8_t rssi_weightage; @@ -493,6 +497,7 @@ struct weight_config { uint8_t pcl_weightage; uint8_t channel_congestion_weightage; uint8_t oce_wan_weightage; + uint8_t sae_pk_ap_weightage; }; /** diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/dispatcher/inc/wlan_scan_utils_api.h b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/dispatcher/inc/wlan_scan_utils_api.h index 36df0055a134..b05d40c48e63 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/dispatcher/inc/wlan_scan_utils_api.h +++ b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/dispatcher/inc/wlan_scan_utils_api.h @@ -709,7 +709,7 @@ util_scan_copy_beacon_data(struct scan_cache_entry *new_entry, ie_lst->extender = conv_ptr(ie_lst->extender, old_ptr, new_ptr); ie_lst->adaptive_11r = conv_ptr(ie_lst->adaptive_11r, old_ptr, new_ptr); ie_lst->single_pmk = conv_ptr(ie_lst->single_pmk, old_ptr, new_ptr); - + ie_lst->rsnxe = conv_ptr(ie_lst->rsnxe, old_ptr, new_ptr); return QDF_STATUS_SUCCESS; } /** @@ -1600,6 +1600,20 @@ util_scan_entry_mbo_oce(struct scan_cache_entry *scan_entry) return scan_entry->ie_list.mbo_oce; } + /** + * util_scan_entry_rsnxe() - function to read RSNXE ie + * @scan_entry: scan entry + * + * API, function to read RSNXE ie + * + * Return: RSNXE ie + */ +static inline uint8_t * +util_scan_entry_rsnxe(struct scan_cache_entry *scan_entry) +{ + return scan_entry->ie_list.rsnxe; +} + /** * util_scan_scm_chan_to_band() - function to tell band for channel number * @chan: Channel number diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/dispatcher/src/wlan_scan_utils_api.c b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/dispatcher/src/wlan_scan_utils_api.c index fada6be8bc80..24b08cfa2cd8 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/dispatcher/src/wlan_scan_utils_api.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/scan/dispatcher/src/wlan_scan_utils_api.c @@ -1024,6 +1024,11 @@ util_scan_populate_bcn_ie_list(struct scan_cache_entry *scan_params, goto err; scan_params->ie_list.fils_indication = (uint8_t *)ie; break; + case WLAN_ELEMID_RSNXE: + if (!ie->ie_len) + goto err; + scan_params->ie_list.rsnxe = (uint8_t *)ie; + break; case WLAN_ELEMID_EXTN_ELEM: status = util_scan_parse_extn_ie(scan_params, ie); if (QDF_IS_STATUS_ERROR(status)) @@ -1233,7 +1238,7 @@ util_scan_add_hidden_ssid(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t bcnbuf) uint16_t tmplen, ie_length; uint8_t *pbeacon, *tmp; bool set_ssid_flag = false; - struct ie_ssid *ssid; + struct ie_ssid ssid = {0}; uint8_t pdev_id; if (!pdev) { @@ -1282,8 +1287,15 @@ util_scan_add_hidden_ssid(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t bcnbuf) sizeof(struct ie_header))) { return QDF_STATUS_E_INVAL; } - ssid = (struct ie_ssid *)ie; - if (util_scan_is_hidden_ssid(ssid)) { + ssid.ssid_id = ie->ie_id; + ssid.ssid_len = ie->ie_len; + + if (ssid.ssid_len) + qdf_mem_copy(ssid.ssid, + ie + sizeof(struct ie_header), + ssid.ssid_len); + + if (util_scan_is_hidden set_ssid_flag = true; ssid_ie_start_offset = bcn_ie_offset - sizeof(struct ie_header); @@ -1310,7 +1322,7 @@ util_scan_add_hidden_ssid(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t bcnbuf) if (set_ssid_flag) { /* Hidden SSID if the Length is 0 */ - if (!ssid->ssid_len) { + if (!ssid.ssid_len) { /* increase the taillength by length of ssid */ if (qdf_nbuf_put_tail(bcnbuf, conf_ssid->length) == NULL) { @@ -1343,7 +1355,7 @@ util_scan_add_hidden_ssid(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t bcnbuf) qdf_mem_free(tmp); /* Hidden ssid with all 0's */ - } else if (ssid->ssid_len == conf_ssid->length) { + } else if (ssid.ssid_len == conf_ssid->length) { /* Insert the SSID string */ qdf_mem_copy((pbeacon + ssid_ie_start_offset + sizeof(struct ie_header)), diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/wifi_pos/src/wifi_pos_utils_i.h b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/wifi_pos/src/wifi_pos_utils_i.h index 619e26a1d3dd..465de82a8ef7 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/wifi_pos/src/wifi_pos_utils_i.h +++ b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/umac/wifi_pos/src/wifi_pos_utils_i.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -63,6 +63,8 @@ struct wifi_pos_req_msg; #ifndef OEM_DATA_RSP_SIZE #define OEM_DATA_RSP_SIZE 1724 +/* Header + VHT80 CIR * 2 chains */ +#define OEM_DATA_DMA_BUFF_SIZE (64 + 512 * 4 * 2) #endif /** diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/utils/fwlog/dbglog_host.c b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/utils/fwlog/dbglog_host.c index 6a6d30ffd8d0..fec9ae40bf37 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/utils/fwlog/dbglog_host.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/utils/fwlog/dbglog_host.c @@ -1683,7 +1683,7 @@ process_fw_diag_event_data(uint8_t *datap, uint32_t num_data) uint32_t diag_data_len; /* each fw diag payload */ struct wlan_diag_data *diag_data; - while (num_data > 0) { + while (num_data >= sizeof(struct wlan_diag_data)) { diag_data = (struct wlan_diag_data *)datap; diag_type = WLAN_DIAG_0_TYPE_GET(diag_data->word0); diag_data_len = WLAN_DIAG_0_LEN_GET(diag_data->word0); diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/wmi/src/wmi_unified_tlv.c b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/wmi/src/wmi_unified_tlv.c index 0cfb18f64712..9528541abee6 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/wmi/src/wmi_unified_tlv.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qca-wifi-host-cmn/wmi/src/wmi_unified_tlv.c @@ -9014,6 +9014,11 @@ static QDF_STATUS extract_mgmt_rx_params_tlv(wmi_unified_t wmi_handle, return QDF_STATUS_E_INVAL; } + if (ev_hdr->buf_len > param_tlvs->num_bufp) { + wmi_err("Rx mgmt frame length mismatch, discard it"); + return QDF_STATUS_E_INVAL; + } + hdr->pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host( wmi_handle, ev_hdr->pdev_id); @@ -10879,6 +10884,9 @@ static QDF_STATUS extract_fips_event_data_tlv(wmi_unified_t wmi_handle, param_buf = (WMI_PDEV_FIPS_EVENTID_param_tlvs *) evt_buf; event = (wmi_pdev_fips_event_fixed_param *) param_buf->fixed_param; + if (event->data_len > param_buf->num_data) + return QDF_STATUS_E_FAILURE; + if (fips_conv_data_be(event->data_len, param_buf->data) != QDF_STATUS_SUCCESS) return QDF_STATUS_E_FAILURE; @@ -13212,6 +13220,9 @@ extract_time_sync_ftm_offset_event_tlv(wmi_unified_t wmi, void *buf, param->vdev_id = resp_event->vdev_id; param->num_qtime = param_buf->num_audio_sync_q_master_slave_times; + if (param->num_qtime > FTM_TIME_SYNC_QTIME_PAIR_MAX) + param->num_qtime = FTM_TIME_SYNC_QTIME_PAIR_MAX; + q_pair = param_buf->audio_sync_q_master_slave_times; if (!q_pair) { WMI_LOGE("Invalid q_master_slave_times buffer"); diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/components/mlme/core/src/wlan_mlme_main.c b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/components/mlme/core/src/wlan_mlme_main.c index cfe89715c308..987b21086ba0 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/components/mlme/core/src/wlan_mlme_main.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/components/mlme/core/src/wlan_mlme_main.c @@ -1854,6 +1854,8 @@ static void mlme_init_scoring_cfg(struct wlan_objmgr_psoc *psoc, cfg_get(psoc, CFG_SCORING_CHAN_CONGESTION_WEIGHTAGE); scoring_cfg->weight_cfg.oce_wan_weightage = cfg_get(psoc, CFG_SCORING_OCE_WAN_WEIGHTAGE); + scoring_cfg->weight_cfg.sae_pk_ap_weightage = + cfg_get(psoc, CFG_SAE_PK_AP_WEIGHTAGE); total_weight = scoring_cfg->weight_cfg.rssi_weightage + scoring_cfg->weight_cfg.ht_caps_weightage + @@ -1865,7 +1867,8 @@ static void mlme_init_scoring_cfg(struct wlan_objmgr_psoc *psoc, scoring_cfg->weight_cfg.beamforming_cap_weightage + scoring_cfg->weight_cfg.pcl_weightage + scoring_cfg->weight_cfg.channel_congestion_weightage + - scoring_cfg->weight_cfg.oce_wan_weightage; + scoring_cfg->weight_cfg.oce_wan_weightage + + scoring_cfg->weight_cfg.sae_pk_ap_weightage; /* * If configured weights are greater than max weight, @@ -1891,6 +1894,8 @@ static void mlme_init_scoring_cfg(struct wlan_objmgr_psoc *psoc, scoring_cfg->weight_cfg.channel_congestion_weightage = CHANNEL_CONGESTION_WEIGHTAGE; scoring_cfg->weight_cfg.oce_wan_weightage = OCE_WAN_WEIGHTAGE; + scoring_cfg->weight_cfg.sae_pk_ap_weightage = + SAE_PK_AP_WEIGHTAGE; } scoring_cfg->rssi_score.best_rssi_threshold = diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/components/mlme/dispatcher/inc/cfg_mlme_scoring.h b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/components/mlme/dispatcher/inc/cfg_mlme_scoring.h index cbcb0e9c939c..5de8c83b95a5 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/components/mlme/dispatcher/inc/cfg_mlme_scoring.h +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/components/mlme/dispatcher/inc/cfg_mlme_scoring.h @@ -321,6 +321,36 @@ CFG_VALUE_OR_DEFAULT, \ "OCE WAN Weightage") +/* + * + * sae_pk_ap_weightage - update scoring param based on SAE PK ap weightage + * @Min: 0 + * @Max: 10 + * @Default: 3 + * + * This ini is used to calculate SAE PK ap weightage in roam score. SAE Public + * Key (SAE-PK) authentication is an extension of SAE that is intended for use + * cases where authentication is based on a password that might be + * distributed to or obtained by a potential adversary. With SAE-PK, the AP in + * an infrastructure network is additionally authenticated based on a static + * public/private key pair. This ini is also used for WFA certification. + * + * Related: None + * + * Supported Feature: STA + * + * Usage: External + * + * + */ +#define CFG_SAE_PK_AP_WEIGHTAGE CFG_INI_UINT( \ + "sae_pk_ap_weightage", \ + 0, \ + 10, \ + PLATFORM_VALUE(3, 0), \ + CFG_VALUE_OR_DEFAULT,\ + "SAE-PK AP weightage") + /* * * best_rssi_threshold - Best Rssi for score calculation @@ -1267,6 +1297,7 @@ CFG(CFG_SCORING_PCL_WEIGHTAGE) \ CFG(CFG_SCORING_CHAN_CONGESTION_WEIGHTAGE) \ CFG(CFG_SCORING_OCE_WAN_WEIGHTAGE) \ + CFG(CFG_SAE_PK_AP_WEIGHTAGE) \ CFG(CFG_SCORING_BEST_RSSI_THRESHOLD) \ CFG(CFG_SCORING_GOOD_RSSI_THRESHOLD) \ CFG(CFG_SCORING_BAD_RSSI_THRESHOLD) \ diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index b07bd6aaec0d..7a17c069b291 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -1847,6 +1847,7 @@ struct wlan_mlme_wmm_params { * @pcl_weightage: PCL weightage * @channel_congestion_weightage: channel congestion weightage * @oce_wan_weightage: OCE WAN metrics weightage + * @sae_pk_ap_weightage: SAE-PK AP weigtage */ struct wlan_mlme_weight_config { uint8_t rssi_weightage; @@ -1860,6 +1861,7 @@ struct wlan_mlme_weight_config { uint8_t pcl_weightage; uint8_t channel_congestion_weightage; uint8_t oce_wan_weightage; + uint8_t sae_pk_ap_weightage; }; /** diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/hdd/src/wlan_hdd_cfg80211.h b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/hdd/src/wlan_hdd_cfg80211.h index c785b6ac1a41..5daaef9299f4 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/hdd/src/wlan_hdd_cfg80211.h +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/hdd/src/wlan_hdd_cfg80211.h @@ -73,8 +73,6 @@ struct hdd_context; #define VENDOR1_AP_OUI_TYPE "\x00\xE0\x4C" #define VENDOR1_AP_OUI_TYPE_SIZE 3 -#define WLAN_BSS_MEMBERSHIP_SELECTOR_VHT_PHY 126 -#define WLAN_BSS_MEMBERSHIP_SELECTOR_HT_PHY 127 #define BASIC_RATE_MASK 0x80 #define RATE_MASK 0x7f diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/hdd/src/wlan_hdd_hostapd.c b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/hdd/src/wlan_hdd_hostapd.c index 2287c612fdc8..83782ee00ce0 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/hdd/src/wlan_hdd_hostapd.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/hdd/src/wlan_hdd_hostapd.c @@ -113,6 +113,23 @@ #define MAX_SAP_NUM_CONCURRENCY_WITH_NAN 1 #endif +#ifndef BSS_MEMBERSHIP_SELECTOR_HT_PHY +#define BSS_MEMBERSHIP_SELECTOR_HT_PHY 127 +#endif + +#ifndef BSS_MEMBERSHIP_SELECTOR_VHT_PHY +#define BSS_MEMBERSHIP_SELECTOR_VHT_PHY 126 +#endif + +#ifndef BSS_MEMBERSHIP_SELECTOR_SAE_H2E +#define BSS_MEMBERSHIP_SELECTOR_SAE_H2E 123 +#endif + +#ifndef BSS_MEMBERSHIP_SELECTOR_HE_PHY +#define BSS_MEMBERSHIP_SELECTOR_HE_PHY 122 +#endif + + /* * 11B, 11G Rate table include Basic rate and Extended rate * The IDX field is the rate index @@ -3907,15 +3924,36 @@ static void wlan_hdd_check_11gmode(const u8 *ie, u8 *require_ht, } } else { if ((BASIC_RATE_MASK | - WLAN_BSS_MEMBERSHIP_SELECTOR_HT_PHY) == ie[i]) + BSS_MEMBERSHIP_SELECTOR_HT_PHY) == ie[i]) *require_ht = true; else if ((BASIC_RATE_MASK | - WLAN_BSS_MEMBERSHIP_SELECTOR_VHT_PHY) == ie[i]) + BSS_MEMBERSHIP_SELECTOR_VHT_PHY) == ie[i]) *require_vht = true; } } } +/** + * wlan_hdd_check_h2e() - check SAE/H2E require flag from support rate sets + * @rs: support rate or extended support rate set + * @require_h2e: pointer to store require h2e flag + * + * Return: none + */ +static void wlan_hdd_check_h2e(const tSirMacRateSet *rs, bool *require_h2e) +{ + uint8_t i; + + if (!rs || !require_h2e) + return; + + for (i = 0; i < rs->numRates; i++) { + if (rs->rate[i] == (BASIC_RATE_MASK | + BSS_MEMBERSHIP_SELECTOR_SAE_H2E)) + *require_h2e = true; + } +} + #ifdef WLAN_FEATURE_11AX /** * wlan_hdd_add_extn_ie() - add extension IE @@ -4271,6 +4309,8 @@ int wlan_hdd_cfg80211_update_apies(struct hdd_adapter *adapter) WLAN_EID_INTERWORKING); wlan_hdd_add_extra_ie(adapter, genie, &total_ielen, WLAN_EID_ADVERTISEMENT_PROTOCOL); + + wlan_hdd_add_extra_ie(adapter, genie, &total_ielen, WLAN_ELEMID_RSNXE); #ifdef FEATURE_WLAN_WAPI if (QDF_SAP_MODE == adapter->device_mode) { wlan_hdd_add_extra_ie(adapter, genie, &total_ielen, @@ -4327,6 +4367,9 @@ int wlan_hdd_cfg80211_update_apies(struct hdd_adapter *adapter) wlan_hdd_add_sap_obss_scan_ie(adapter, proberesp_ies, &proberesp_ies_len); + wlan_hdd_add_extra_ie(adapter, proberesp_ies, &proberesp_ies_len, + WLAN_ELEMID_RSNXE); + if (test_bit(SOFTAP_BSS_STARTED, &adapter->event_flags)) { update_ie.ieBufferlength = proberesp_ies_len; update_ie.pAdditionIEBuffer = proberesp_ies; @@ -5518,6 +5561,13 @@ int wlan_hdd_cfg80211_start_bss(struct hdd_adapter *adapter, config->extended_rates.rate, config->extended_rates.numRates); } + + config->require_h2e = false; + wlan_hdd_check_h2e(&config->supported_rates, + &config->require_h2e); + wlan_hdd_check_h2e(&config->extended_rates, + &config->require_h2e); + } if (!cds_is_sub_20_mhz_enabled()) diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/include/dot11f.h b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/include/dot11f.h index 5be65573fa53..43036e701b1a 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/include/dot11f.h +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/include/dot11f.h @@ -26,7 +26,7 @@ * * * This file was automatically generated by 'framesc' - * Mon Jun 8 09:41:47 2020 from the following file(s): + * Wed Sep 29 13:23:21 2021 from the following file(s): * * dot11f.frms * diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/pe/lim/lim_api.c b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/pe/lim/lim_api.c index 83fd5f74370d..2e34e008dca1 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/pe/lim/lim_api.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/pe/lim/lim_api.c @@ -1173,12 +1173,15 @@ static bool pe_filter_bcn_probe_frame(struct mac_context *mac_ctx, ssid_ie = wlan_get_ie_ptr_from_eid(WLAN_ELEMID_SSID, body + SIR_MAC_B_PR_SSID_OFFSET, - frame_len); + frame_len - SIR_MAC_B_PR_SSID_OFFSET); if (!ssid_ie) return false; bcn_ssid.length = ssid_ie[1]; + if (bcn_ssid.length > WLAN_SSID_MAX_LEN) + return false; + qdf_mem_copy(&bcn_ssid.ssId, &ssid_ie[2], bcn_ssid.length); diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/pe/lim/lim_assoc_utils.c b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/pe/lim/lim_assoc_utils.c index ae9ac5e9ce09..9c8a9cd03b69 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/pe/lim/lim_assoc_utils.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/pe/lim/lim_assoc_utils.c @@ -1534,6 +1534,41 @@ static bool lim_check_valid_mcs_for_nss(struct pe_session *session, } #endif +/** + * lim_remove_membership_selectors() - remove elements from rate set + * + * @rate_set: pointer to rate set + * + * Removes the BSS membership selector elements from the rate set, and keep + * only the rates + * + * Return: none + */ +static void lim_remove_membership_selectors(tSirMacRateSet *rate_set) +{ + int i, selector_count = 0; + + for (i = 0; i < rate_set->numRates; i++) { + if ((rate_set->rate[i] == (WLAN_BASIC_RATE_MASK | + WLAN_BSS_MEMBERSHIP_SELECTOR_HT_PHY)) || + (rate_set->rate[i] == (WLAN_BASIC_RATE_MASK | + WLAN_BSS_MEMBERSHIP_SELECTOR_VHT_PHY)) || + (rate_set->rate[i] == (WLAN_BASIC_RATE_MASK | + WLAN_BSS_MEMBERSHIP_SELECTOR_GLK)) || + (rate_set->rate[i] == (WLAN_BASIC_RATE_MASK | + WLAN_BSS_MEMBERSHIP_SELECTOR_EPD)) || + (rate_set->rate[i] == (WLAN_BASIC_RATE_MASK | + WLAN_BSS_MEMBERSHIP_SELECTOR_SAE_H2E)) || + (rate_set->rate[i] == (WLAN_BASIC_RATE_MASK | + WLAN_BSS_MEMBERSHIP_SELECTOR_HE_PHY))) + selector_count++; + + if (i + selector_count < rate_set->numRates) + rate_set->rate[i] = rate_set->rate[i + selector_count]; + } + rate_set->numRates -= selector_count; +} + QDF_STATUS lim_populate_peer_rate_set(struct mac_context *mac, struct supported_rates *pRates, uint8_t *pSupportedMCSSet, @@ -1582,6 +1617,10 @@ QDF_STATUS lim_populate_peer_rate_set(struct mac_context *mac, } } else tempRateSet2.numRates = 0; + + lim_remove_membership_selectors(&tempRateSet); + lim_remove_membership_selectors(&tempRateSet2); + if ((tempRateSet.numRates + tempRateSet2.numRates) > WLAN_SUPPORTED_RATES_IE_MAX_LEN) { pe_err("more than 12 rates in CFG"); @@ -1730,8 +1769,8 @@ QDF_STATUS lim_populate_peer_rate_set(struct mac_context *mac, * the rate sets received in the Assoc request on AP * or Beacon/Probe Response from peer in IBSS. * - * 1. It makes the intersection between our own rate Sat - * and extemcded rate set and the ones received in the + * 1. It makes the intersection between our own rate set + * and extended rate set and the ones received in the * association request. * 2. It creates a combined rate set of 12 rates max which * comprised the basic and extended rates @@ -1780,14 +1819,16 @@ QDF_STATUS lim_populate_matching_rate_set(struct mac_context *mac_ctx, } else { temp_rate_set2.numRates = 0; } + lim_remove_membership_selectors(&temp_rate_set); + lim_remove_membership_selectors(&temp_rate_set2); /* * absolute sum of both num_rates should be less than 12. following - * 16-bit sum avoids false codition where 8-bit arthematic overflow + * 16-bit sum avoids false condition where 8-bit arithmetic overflow * might have caused total sum to be less than 12 */ if (((uint16_t)temp_rate_set.numRates + - (uint16_t)temp_rate_set2.numRates) > 12) { + (uint16_t)temp_rate_set2.numRates) > SIR_MAC_MAX_NUMBER_OF_RATES) { pe_err("more than 12 rates in CFG"); return QDF_STATUS_E_FAILURE; } @@ -2438,9 +2479,11 @@ lim_add_sta(struct mac_context *mac_ctx, assoc_req = (tpSirAssocReq) session_entry->parsedAssocReq[aid]; - add_sta_params->wpa_rsn = assoc_req->rsnPresent; - add_sta_params->wpa_rsn |= - (assoc_req->wpaPresent << 1); + if (assoc_req) { + add_sta_params->wpa_rsn = assoc_req->rsnPresent; + add_sta_params->wpa_rsn |= + (assoc_req->wpaPresent << 1); + } } } diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/sys/legacy/src/utils/src/dot11f.c b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/sys/legacy/src/utils/src/dot11f.c index c7cffbf52705..666350169642 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/sys/legacy/src/utils/src/dot11f.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/sys/legacy/src/utils/src/dot11f.c @@ -24,7 +24,7 @@ * * * This file was automatically generated by 'framesc' - * Mon Jun 8 09:41:47 2020 from the following file(s): + * Wed Sep 29 13:23:21 2021 from the following file(s): * * dot11f.frms * @@ -335,7 +335,7 @@ static uint32_t get_container_ies_len(tpAniSirGlobal pCtx, len += *(pBufRemaining+1); pBufRemaining += len + 2; len += 2; - while (len < nBuf) { + while (len + 1 < nBuf) { pIe = find_ie_defn(pCtx, pBufRemaining, nBuf - len, IEs); if (NULL == pIe) break; @@ -14933,25 +14933,30 @@ static uint32_t unpack_tlv_core(tpAniSirGlobal pCtx, } /* & length, */ if (pTlv->sLen == 2) { - framesntohs(pCtx, &len, pBufRemaining, pTlv->fMsb); if (2 > nBufRemaining) { FRAMES_LOG0(pCtx, FRLOGE, FRFL("This frame reports " "fewer two byte(s) remaining.\n")); status |= DOT11F_INCOMPLETE_TLV; FRAMES_DBG_BREAK(); goto MandatoryCheck; - } - pBufRemaining += 2; - nBufRemaining -= 2; + } + framesntohs(pCtx, &len, pBufRemaining, pTlv->fMsb); + pBufRemaining += 2; + nBufRemaining -= 2; } else { len = *pBufRemaining; pBufRemaining += 1; nBufRemaining -= 1; } } else { + if (TLVs[0].sType > nBufRemaining) { + FRAMES_LOG0(pCtx, FRLOGE, FRFL("This frame reports " + "fewer LVs[0].sType byte(s) remaining.\n")); + status |= DOT11F_INCOMPLETE_TLV; + goto MandatoryCheck; + } pBufRemaining += TLVs[0].sType; nBufRemaining -= TLVs[0].sType; - framesntohs(pCtx, &len, pBufRemaining, (TLVs[0].sType == 2)); if (2 > nBufRemaining) { FRAMES_LOG0(pCtx, FRLOGE, FRFL("This frame reports " "fewer two byte(s) remaining.\n")); @@ -14959,6 +14964,7 @@ static uint32_t unpack_tlv_core(tpAniSirGlobal pCtx, FRAMES_DBG_BREAK(); goto MandatoryCheck; } + framesntohs(pCtx, &len, pBufRemaining, (TLVs[0].sType == 2)); pBufRemaining += 2; nBufRemaining -= 2; } diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/sys/legacy/src/utils/src/parser_api.c b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/sys/legacy/src/utils/src/parser_api.c index dc09698a6657..8cab4e440db5 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/sys/legacy/src/utils/src/parser_api.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/mac/src/sys/legacy/src/utils/src/parser_api.c @@ -604,7 +604,7 @@ populate_dot11f_ext_supp_rates(struct mac_context *mac, uint8_t nChannelNum, struct pe_session *pe_session) { QDF_STATUS nsir_status; - qdf_size_t nRates = 0; + qdf_size_t n_rates = 0; uint8_t rates[WLAN_SUPPORTED_RATES_IE_MAX_LEN]; /* Use the ext rates present in session entry whenever nChannelNum is set to OPERATIONAL @@ -613,28 +613,29 @@ populate_dot11f_ext_supp_rates(struct mac_context *mac, uint8_t nChannelNum, */ if (POPULATE_DOT11F_RATES_OPERATIONAL == nChannelNum) { if (pe_session) { - nRates = pe_session->extRateSet.numRates; + n_rates = pe_session->extRateSet.numRates; qdf_mem_copy(rates, pe_session->extRateSet.rate, - nRates); + n_rates); } else { pe_err("no session context exists while populating Operational Rate Set"); } } else if (HIGHEST_24GHZ_CHANNEL_NUM >= nChannelNum) { - nRates = mac->mlme_cfg->rates.ext_opr_rate_set.len; + n_rates = mac->mlme_cfg->rates.ext_opr_rate_set.len; nsir_status = wlan_mlme_get_cfg_str( rates, - &mac->mlme_cfg->rates.ext_opr_rate_set, &nRates); + &mac->mlme_cfg->rates.ext_opr_rate_set, &n_rates); if (QDF_IS_STATUS_ERROR(nsir_status)) { - nRates = 0; + n_rates = 0; pe_err("Failed to retrieve nItem from CFG status: %d", (nsir_status)); return nsir_status; } } - if (0 != nRates) { - pDot11f->num_rates = (uint8_t) nRates; - qdf_mem_copy(pDot11f->rates, rates, nRates); + if (0 != n_rates) { + pe_debug("ext supp rates present, num %d", (uint8_t)n_rates); + pDot11f->num_rates = (uint8_t)n_rates; + qdf_mem_copy(pDot11f->rates, rates, n_rates); pDot11f->present = 1; } diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sap/inc/sap_api.h b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sap/inc/sap_api.h index 09d2f33b5408..5f3eff964c34 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sap/inc/sap_api.h +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sap/inc/sap_api.h @@ -529,6 +529,7 @@ struct sap_config { uint8_t long_retry_limit; tSirMacRateSet supported_rates; tSirMacRateSet extended_rates; + bool require_h2e; enum sap_acs_dfs_mode acs_dfs_mode; struct hdd_channel_info *channel_info; uint32_t channel_info_count; diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sap/src/sap_fsm.c b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sap/src/sap_fsm.c index 28d48143fb24..6efd72984632 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sap/src/sap_fsm.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sap/src/sap_fsm.c @@ -3001,6 +3001,8 @@ sapconvert_to_csr_profile(struct sap_config *config, eCsrRoamBssType bssType, config->extended_rates.numRates; } + profile->require_h2e = config->require_h2e; + qdf_status = ucfg_mlme_get_sap_chan_switch_rate_enabled( mac_ctx->psoc, &chan_switch_hostapd_rate_enabled); diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sme/inc/csr_api.h b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sme/inc/csr_api.h index 35a6e47e4734..07a6c6e74b79 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sme/inc/csr_api.h +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sme/inc/csr_api.h @@ -766,6 +766,7 @@ struct csr_roam_profile { uint16_t beacon_tx_rate; tSirMacRateSet supported_rates; tSirMacRateSet extended_rates; + bool require_h2e; struct qdf_mac_addr bssid_hint; bool force_24ghz_in_ht20; uint32_t cac_duration_ms; diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sme/src/csr/csr_api_roam.c b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sme/src/csr/csr_api_roam.c index 95d431b6c20b..32dc88f4e9d9 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sme/src/csr/csr_api_roam.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/sme/src/csr/csr_api_roam.c @@ -8593,6 +8593,7 @@ QDF_STATUS csr_roam_copy_profile(struct mac_context *mac, pDstProfile->extended_rates.numRates = pSrcProfile->extended_rates.numRates; } + pDstProfile->require_h2e = pSrcProfile->require_h2e; pDstProfile->cac_duration_ms = pSrcProfile->cac_duration_ms; pDstProfile->dfs_regdomain = pSrcProfile->dfs_regdomain; pDstProfile->chan_switch_hostapd_rate_enabled = @@ -14519,6 +14520,7 @@ csr_roam_get_bss_start_parms(struct mac_context *mac, uint32_t opr_ch_freq = 0; tSirNwType nw_type; uint32_t tmp_opr_ch_freq = 0; + uint8_t h2e; tSirMacRateSet *opr_rates = &pParam->operationalRateSet; tSirMacRateSet *ext_rates = &pParam->extendedRateSet; @@ -14617,6 +14619,22 @@ csr_roam_get_bss_start_parms(struct mac_context *mac, pParam->operation_chan_freq = opr_ch_freq; } + if (pProfile->require_h2e) { + h2e = WLAN_BASIC_RATE_MASK | + WLAN_BSS_MEMBERSHIP_SELECTOR_SAE_H2E; + if (ext_rates->numRates < SIR_MAC_MAX_NUMBER_OF_RATES) { + ext_rates->rate[ext_rates->numRates] = h2e; + ext_rates->numRates++; + sme_debug("H2E bss membership add to ext support rate"); + } else if (opr_rates->numRates < SIR_MAC_MAX_NUMBER_OF_RATES) { + opr_rates->rate[opr_rates->numRates] = h2e; + opr_rates->numRates++; + sme_debug("H2E bss membership add to support rate"); + } else { + sme_err("rates full, can not add H2E bss membership"); + } + } + pParam->sirNwType = nw_type; pParam->ch_params.ch_width = pProfile->ch_params.ch_width; pParam->ch_params.center_freq_seg0 = @@ -19826,6 +19844,7 @@ csr_roam_switch_to_deinit(struct mac_context *mac, uint8_t vdev_id, uint8_t reason) { QDF_STATUS status; + bool sup_disabled_roam; enum roam_offload_state cur_state = mlme_get_roam_state(mac->psoc, vdev_id); switch (cur_state) { @@ -19833,6 +19852,28 @@ csr_roam_switch_to_deinit(struct mac_context *mac, uint8_t vdev_id, csr_roam_switch_to_rso_stop(mac, vdev_id, reason); break; case ROAM_RSO_STOPPED: + /* + * When Supplicant disabled roaming is set and roam invoke + * command is received from userspace, fw starts to roam. + * But meanwhile if a disassoc/deauth is received from AP or if + * NB disconnect is initiated while supplicant disabled roam, + * RSO stop with ROAM scan mode as 0 is not sent to firmware + * since the previous state was RSO_STOPPED. This could lead + * to firmware not sending peer unmap event for the current + * AP. To avoid this, if previous RSO stop was sent with + * ROAM scan mode as 4, send RSO stop with Roam scan mode as 0 + * and then switch to ROAM_DEINIT. + */ + sup_disabled_roam = + mlme_get_supplicant_disabled_roaming(mac->psoc, + vdev_id); + if (sup_disabled_roam) { + sme_debug("vdev[%d]: supplicant disabled roam. clear roam scan mode", + vdev_id); + csr_post_rso_stop(mac, vdev_id, REASON_DISCONNECTED); + } + break; + case ROAM_INIT: break; diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/wma/src/wma_scan_roam.c b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/wma/src/wma_scan_roam.c index 723253f5af57..3179f79e4e65 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/wma/src/wma_scan_roam.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/wma/src/wma_scan_roam.c @@ -2039,8 +2039,7 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle, if (roam_req->reason == REASON_ROAM_STOP_ALL || roam_req->reason == REASON_DISCONNECTED || - roam_req->reason == REASON_ROAM_SYNCH_FAILED || - roam_req->reason == REASON_SUPPLICANT_DISABLED_ROAMING) { + roam_req->reason == REASON_ROAM_SYNCH_FAILED) { mode = WMI_ROAM_SCAN_MODE_NONE; } else { if (csr_is_roam_offload_enabled(mac)) @@ -3772,7 +3771,7 @@ int wma_roam_stats_event_handler(WMA_HANDLE handle, uint8_t *event, num_tlv = MAX_ROAM_SCAN_STATS_TLV; } - rem_len = WMI_SVC_MSG_MAX_SIZE - sizeof(*fixed_param); + rem_len = len - sizeof(*fixed_param); if (rem_len < num_tlv * sizeof(wmi_roam_trigger_reason)) { wma_err_rl("Invalid roam trigger data"); goto err; diff --git a/drivers/nfc/pn547.c b/drivers/nfc/pn547.c index 1656afb318fe..f66e4e0a3af5 100755 --- a/drivers/nfc/pn547.c +++ b/drivers/nfc/pn547.c @@ -389,14 +389,14 @@ static int release_dwp_onoff(void) static int set_nfc_pid(unsigned long arg) { pid_t pid = arg; - struct task_struct *task; + struct task_struct *task = NULL; pn547_dev->nfc_service_pid = arg; if (arg == 0) goto done; - task = pid_task(find_vpid(pid), PIDTYPE_PID); + task = get_pid_task(find_vpid(pid), PIDTYPE_PID); if (task) { NFC_LOG_INFO("task->comm: %s\n", task->comm); if (!strncmp(task->comm, "com.android.nfc", 15)) { @@ -409,6 +409,9 @@ static int set_nfc_pid(unsigned long arg) pn547_dev->nfc_service_pid = 0; done: + if (task) + put_task_struct(task); + NFC_LOG_INFO("The NFC Service PID is %ld\n", pn547_dev->nfc_service_pid); return 0; @@ -447,7 +450,7 @@ static int signal_handler(int state, long nfc_pid) { struct siginfo sinfo; pid_t pid; - struct task_struct *task; + struct task_struct *task = NULL; int sigret = 0; int ret = 0; @@ -463,7 +466,7 @@ static int signal_handler(int state, long nfc_pid) sinfo.si_int = state; pid = nfc_pid; - task = pid_task(find_vpid(pid), PIDTYPE_PID); + task = get_pid_task(find_vpid(pid), PIDTYPE_PID); if (task) { NFC_LOG_INFO("task->comm: %s.\n", task->comm); sigret = send_sig_info(SIG_NFC, &sinfo, task); @@ -471,6 +474,8 @@ static int signal_handler(int state, long nfc_pid) NFC_LOG_ERR("send_sig_info failed.. %d.\n", sigret); ret = -EPERM; } + + put_task_struct(task); } else { NFC_LOG_ERR("finding task from PID failed\n"); ret = -EPERM; diff --git a/drivers/samsung/Kconfig b/drivers/samsung/Kconfig index 96e73178d1db..908832ca0de2 100755 --- a/drivers/samsung/Kconfig +++ b/drivers/samsung/Kconfig @@ -62,6 +62,12 @@ config SEC_EXT bool "Samsung TN extension Feature" default y +config SAMSUNG_LMKD_DEBUG + bool "record lmkd kill history" + default y + help + record lmkd kill history + menu "Samsung Factory Feature" config SEC_FACTORY bool "when it comes to sec factory mode" diff --git a/drivers/samsung/Makefile b/drivers/samsung/Makefile index 9881ad063580..32bfcaa2baae 100755 --- a/drivers/samsung/Makefile +++ b/drivers/samsung/Makefile @@ -9,5 +9,6 @@ obj-$(CONFIG_SEC_MISC) += misc/ obj-$(CONFIG_SEC_QUEST) += quest/ obj-$(CONFIG_SEC_DEBUG_TEST) += debug/ -obj-$(CONFIG_SEC_KUNIT) += kunit_test/ GCOV_PROFILE_sec_class.o :=y + +obj-$(CONFIG_SAMSUNG_LMKD_DEBUG) += lmkd_debug.o \ No newline at end of file diff --git a/drivers/samsung/debug/Makefile b/drivers/samsung/debug/Makefile index a7ca658bb0ba..951ec6570ff9 100755 --- a/drivers/samsung/debug/Makefile +++ b/drivers/samsung/debug/Makefile @@ -27,5 +27,4 @@ obj-$(CONFIG_KERNEL_MODE_NEON_DEBUG) += sec_kernel_mode_neon_debug.o obj-$(CONFIG_SEC_SLUB_DEBUG) += sec_slub_debug.o -obj-$(CONFIG_SEC_KUNIT) += kunit_test/ GCOV_PROFILE_sec_debug.o :=y diff --git a/drivers/samsung/debug/kunit_test/Makefile b/drivers/samsung/debug/kunit_test/Makefile deleted file mode 100755 index 54279e0738e7..000000000000 --- a/drivers/samsung/debug/kunit_test/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -obj-$(CONFIG_SEC_DEBUG) += sec_debug_test.o -obj-$(CONFIG_SEC_DEBUG_TEST) += sec_debug_test.o diff --git a/drivers/samsung/debug/kunit_test/sec_debug_test.c b/drivers/samsung/debug/kunit_test/sec_debug_test.c deleted file mode 100755 index 2f8b241c7389..000000000000 --- a/drivers/samsung/debug/kunit_test/sec_debug_test.c +++ /dev/null @@ -1,105 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * TODO: Add test description. - */ - -#include -#include -#include - -/* - * This is the most fundamental element of KUnit, the test case. A test case - * makes a set EXPECTATIONs and ASSERTIONs about the behavior of some code; if - * any expectations or assertions are not met, the test fails; otherwise, the - * test passes. - * - * In KUnit, a test case is just a function with the signature - * `void (*)(struct test *)`. `struct test` is a context object that stores - * information about the current test. - */ - -#if !defined(CONFIG_UML) -/* NOTE: Target running TC must be in the #ifndef CONFIG_UML */ -static void kunit_sec_debug_level(struct test *test) -{ - /* EXPECT_EQ(test, 0x494D, sec_debug_level()); */ - return; -} -#endif - -/* NOTE: UML TC */ -static void sec_debug_test_bar(struct test *test) -{ - /* Test cases for UML */ - return; -} - -/* - * This is run once before each test case, see the comment on - * example_test_module for more information. - */ -static int sec_debug_test_init(struct test *test) -{ - return 0; -} - -/* - * This is run once after each test case, see the comment on example_test_module - * for more information. - */ -static void sec_debug_test_exit(struct test *test) -{ -} - -/* - * Here we make a list of all the test cases we want to add to the test module - * below. - */ -static struct test_case sec_debug_test_cases[] = { - /* - * This is a helper to create a test case object from a test case - * function; its exact function is not important to understand how to - * use KUnit, just know that this is how you associate test cases with a - * test module. - */ -#if !defined(CONFIG_UML) - /* NOTE: Target running TC */ - TEST_CASE(kunit_sec_debug_level), -#endif - /* NOTE: UML TC */ - TEST_CASE(sec_debug_test_bar), - {}, -}; - -/* - * This defines a suite or grouping of tests. - * - * Test cases are defined as belonging to the suite by adding them to - * `test_cases`. - * - * Often it is desirable to run some function which will set up things which - * will be used by every test; this is accomplished with an `init` function - * which runs before each test case is invoked. Similarly, an `exit` function - * may be specified which runs after every test case and can be used to for - * cleanup. For clarity, running tests in a test module would behave as follows: - * - * module.init(test); - * module.test_case[0](test); - * module.exit(test); - * module.init(test); - * module.test_case[1](test); - * module.exit(test); - * ...; - */ -static struct test_module sec_debug_test_module = { - .name = "sec_debug_test", - .init = sec_debug_test_init, - .exit = sec_debug_test_exit, - .test_cases = sec_debug_test_cases, -}; - -/* - * This registers the above test module telling KUnit that this is a suite of - * tests that need to be run. - */ -module_test(sec_debug_test_module); diff --git a/drivers/samsung/debug/sec_bootstat.c b/drivers/samsung/debug/sec_bootstat.c index b60d81ed3784..978ea3a5179f 100755 --- a/drivers/samsung/debug/sec_bootstat.c +++ b/drivers/samsung/debug/sec_bootstat.c @@ -109,6 +109,9 @@ enum boot_events_type { RIL_COMPLETE_CONNECTION, RIL_CS_REG, RIL_GPRS_ATTACH, +#ifdef CONFIG_SEC_FACTORY + FACTORY_BOOT_COMPLETE, +#endif /* CONFIG_SEC_FACTORY */ NUM_BOOT_EVENTS, }; @@ -210,6 +213,10 @@ static struct boot_event boot_events[] = { "CS Registered", 0, 0}, {RIL_GPRS_ATTACH, EVT_RIL, "GPRS Attached", 0, 0}, +#ifdef CONFIG_SEC_FACTORY + {FACTORY_BOOT_COMPLETE, EVT_PLATFORM, + "Factory Process [Boot Completed]", 0, 0}, +#endif /* CONFIG_SEC_FACTORY */ {0, EVT_INVALID, NULL, 0, 0}, }; diff --git a/drivers/samsung/debug/sec_debug.c b/drivers/samsung/debug/sec_debug.c index a5ecf82137f7..d57347958ab2 100755 --- a/drivers/samsung/debug/sec_debug.c +++ b/drivers/samsung/debug/sec_debug.c @@ -540,6 +540,9 @@ void sec_peripheral_secure_check_fail(void) { if (!sec_debug_is_enabled()) { sec_debug_set_qc_dload_magic(0); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,4,0) + sec_debug_update_restart_reason("peripheral_hw_reset", 0, RESTART_NORMAL); +#endif sec_debug_pm_restart("peripheral_hw_reset"); /* never reach here */ } @@ -987,7 +990,9 @@ void dump_cpu_stat(void) guest = guest_nice = 0; getboottime64(&boottime); - for_each_possible_cpu(i) { + for_each_present_cpu(i) { + BUG_ON(i >= NR_CPUS); + user += kcpustat_cpu(i).cpustat[CPUTIME_USER]; nice += kcpustat_cpu(i).cpustat[CPUTIME_NICE]; system += kcpustat_cpu(i).cpustat[CPUTIME_SYSTEM]; diff --git a/drivers/samsung/debug/sec_debug_force_err.c b/drivers/samsung/debug/sec_debug_force_err.c index 02f0fabf6b26..09c26dbf979f 100755 --- a/drivers/samsung/debug/sec_debug_force_err.c +++ b/drivers/samsung/debug/sec_debug_force_err.c @@ -68,9 +68,11 @@ static void __simulate_apps_wdog_bite(void) { unsigned long time_out_jiffies; #ifdef CONFIG_HOTPLUG_CPU - int cpu; + unsigned int cpu; for_each_online_cpu(cpu) { + BUG_ON(cpu >= NR_CPUS); + if (cpu == 0) continue; cpu_down(cpu); diff --git a/drivers/samsung/debug/sec_debug_sched_log.c b/drivers/samsung/debug/sec_debug_sched_log.c index 6d9db573bee8..099ca4b77254 100755 --- a/drivers/samsung/debug/sec_debug_sched_log.c +++ b/drivers/samsung/debug/sec_debug_sched_log.c @@ -90,6 +90,27 @@ static inline long get_switch_state(bool preempt, struct task_struct *p) return preempt ? TASK_RUNNING | TASK_STATE_MAX : p->state; } +struct sec_debug_sched_clock { + u64 val; + u64 comp; +}; +static DEFINE_PER_CPU(struct sec_debug_sched_clock, sched_clock_per_cpu); + +static inline u64 sec_debug_cpu_clock(int cpu) +{ + struct sec_debug_sched_clock *last = &per_cpu(sched_clock_per_cpu, cpu); + u64 cur = cpu_clock(cpu); + + if (unlikely(last->val == cur)) { + last->comp++; + } else { + last->val = cur; + last->comp = 0; + } + + return last->val + last->comp; +} + void sec_debug_task_sched_log(int cpu, bool preempt, struct task_struct *task, struct task_struct *prev) { @@ -113,7 +134,7 @@ void sec_debug_task_sched_log(int cpu, bool preempt, sched_buf = &secdbg_log->sched[cpu].buf[i]; #endif - sched_buf->time = cpu_clock(cpu); + sched_buf->time = sec_debug_cpu_clock(cpu); sec_debug_strcpy_task_comm(sched_buf->comm, task->comm); sched_buf->pid = task->pid; sched_buf->pTask = task; @@ -148,7 +169,7 @@ void sec_debug_softirq_sched_log(unsigned int irq, void *fn, irq_buf = &secdbg_log->irq[cpu].buf[i]; #endif - irq_buf->time = cpu_clock(cpu); + irq_buf->time = sec_debug_cpu_clock(cpu); irq_buf->irq = irq; irq_buf->fn = fn; irq_buf->name = name; @@ -186,7 +207,7 @@ void sec_debug_irq_sched_log(unsigned int irq, void *desc_or_fn, irq_buf = &secdbg_log->irq[cpu].buf[i]; #endif - irq_buf->time = cpu_clock(cpu); + irq_buf->time = sec_debug_cpu_clock(cpu); irq_buf->irq = irq; #if defined(CONFIG_SEC_DEBUG_SCHED_LOG_IRQ_V2) irq_buf->fn = action->handler; @@ -303,7 +324,7 @@ int sec_debug_sched_msg(char *fmt, ...) } va_end(args); - sched_buf->time = cpu_clock(cpu); + sched_buf->time = sec_debug_cpu_clock(cpu); sched_buf->pid = current->pid; sched_buf->pTask = NULL; diff --git a/drivers/samsung/debug/sec_debug_user_reset.c b/drivers/samsung/debug/sec_debug_user_reset.c index 4aa9e36baa53..fda52ac59638 100755 --- a/drivers/samsung/debug/sec_debug_user_reset.c +++ b/drivers/samsung/debug/sec_debug_user_reset.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -462,11 +463,16 @@ static const struct file_operations sec_debug_rdx_bootdev_fops = { .write = sec_debug_rdx_bootdev_proc_write, }; -static int __init sec_debug_map_rdx_bootdev_region(void) +static int sec_debug_get_rdx_bootdev_region(phys_addr_t *paddr, u64 *size) { struct device_node *parent, *node; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0) + struct reserved_mem *res_mem; +#else int ret = 0; u64 temp[2]; +#endif parent = of_find_node_by_path("/reserved-memory"); if (!parent) { @@ -480,15 +486,43 @@ static int __init sec_debug_map_rdx_bootdev_region(void) return -EINVAL; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0) + res_mem = of_reserved_mem_lookup(node); + if (!res_mem) + goto fail; + + *paddr = res_mem->base; + *size = (u64)res_mem->size; +#else ret = of_property_read_u64_array(node, "reg", &temp[0], 2); - if (ret) { - pr_err("failed to get address from node\n"); - return -1; - } + if (ret) + goto fail; + + *paddr = (phys_addr_t)temp[0]; + *size = temp[1]; +#endif + + return 0; + +fail: + pr_err("failed to get address from node\n"); + return -1; +} + +static int __init sec_debug_map_rdx_bootdev_region(void) +{ + int ret; + phys_addr_t paddr; + u64 size; + + ret = sec_debug_get_rdx_bootdev_region(&paddr, &size); mutex_lock(&rdx_bootdev_mutex); - sec_debug_rdx_bootdev_paddr = temp[0]; - sec_debug_rdx_bootdev_size = temp[1]; + + if (!ret) { + sec_debug_rdx_bootdev_paddr = paddr; + sec_debug_rdx_bootdev_size = size; + } pr_info("sec_debug_rdx_bootdev : %pa, 0x%llx\n", &sec_debug_rdx_bootdev_paddr, sec_debug_rdx_bootdev_size); diff --git a/drivers/samsung/debug/sec_log_buf.c b/drivers/samsung/debug/sec_log_buf.c index 085458d34826..9edb9063d8ac 100755 --- a/drivers/samsung/debug/sec_log_buf.c +++ b/drivers/samsung/debug/sec_log_buf.c @@ -294,7 +294,7 @@ static int sec_log_store(struct notifier_block *nb, struct rtc_time tm; struct rtc_device *rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE); struct timespec64 now; - time64_t local_time, rtc_offset; + time64_t local_time, rtc_offset = 0; struct rtc_time local_tm; if (!rtc) { @@ -316,7 +316,7 @@ static int sec_log_store(struct notifier_block *nb, ktime_get_real_ts64(&now); local_time = now.tv_sec; - local_time -= sys_tz.tz_minuteswest * 60; // adjust time zone + local_time -= (time64_t)sys_tz.tz_minuteswest * 60; // adjust time zone rtc_time64_to_tm(local_time, &local_tm); #if IS_ENABLED(CONFIG_SEC_STORE_POWER_ONOFF_HISTORY) diff --git a/drivers/samsung/kunit_test/Makefile b/drivers/samsung/kunit_test/Makefile deleted file mode 100755 index 3c8b907c25ba..000000000000 --- a/drivers/samsung/kunit_test/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -obj-$(CONFIG_DRV_SAMSUNG) += sec_class_test.o -obj-$(CONFIG_SEC_CLASS_TEST) += sec_class_test.o diff --git a/drivers/samsung/kunit_test/sec_class_test.c b/drivers/samsung/kunit_test/sec_class_test.c deleted file mode 100755 index 7fceabe8389a..000000000000 --- a/drivers/samsung/kunit_test/sec_class_test.c +++ /dev/null @@ -1,108 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * TODO: Add test description. - */ - -#include -#include -#include -#include - -/* - * This is the most fundamental element of KUnit, the test case. A test case - * makes a set EXPECTATIONs and ASSERTIONs about the behavior of some code; if - * any expectations or assertions are not met, the test fails; otherwise, the - * test passes. - * - * In KUnit, a test case is just a function with the signature - * `void (*)(struct test *)`. `struct test` is a context object that stores - * information about the current test. - */ - -#if !defined(CONFIG_UML) -/* NOTE: Target running TC must be in the #ifndef CONFIG_UML */ -static void kunit_sec_dev_get_by_name(struct test *test) -{ - struct device *pdevice; - - pdevice = sec_dev_get_by_name("sec_debug"); - EXPECT_NOT_NULL(test, pdevice); -} -#endif - -/* NOTE: UML TC */ -static void sec_class_test_bar(struct test *test) -{ - /* Test cases for UML */ - return; -} - -/* - * This is run once before each test case, see the comment on - * example_test_module for more information. - */ -static int sec_class_test_init(struct test *test) -{ - return 0; -} - -/* - * This is run once after each test case, see the comment on example_test_module - * for more information. - */ -static void sec_class_test_exit(struct test *test) -{ -} - -/* - * Here we make a list of all the test cases we want to add to the test module - * below. - */ -static struct test_case sec_class_test_cases[] = { - /* - * This is a helper to create a test case object from a test case - * function; its exact function is not important to understand how to - * use KUnit, just know that this is how you associate test cases with a - * test module. - */ -#if !defined(CONFIG_UML) - /* NOTE: Target running TC */ - TEST_CASE(kunit_sec_dev_get_by_name), -#endif - /* NOTE: UML TC */ - TEST_CASE(sec_class_test_bar), - {}, -}; - -/* - * This defines a suite or grouping of tests. - * - * Test cases are defined as belonging to the suite by adding them to - * `test_cases`. - * - * Often it is desirable to run some function which will set up things which - * will be used by every test; this is accomplished with an `init` function - * which runs before each test case is invoked. Similarly, an `exit` function - * may be specified which runs after every test case and can be used to for - * cleanup. For clarity, running tests in a test module would behave as follows: - * - * module.init(test); - * module.test_case[0](test); - * module.exit(test); - * module.init(test); - * module.test_case[1](test); - * module.exit(test); - * ...; - */ -static struct test_module sec_class_test_module = { - .name = "sec_class_test", - .init = sec_class_test_init, - .exit = sec_class_test_exit, - .test_cases = sec_class_test_cases, -}; - -/* - * This registers the above test module telling KUnit that this is a suite of - * tests that need to be run. - */ -module_test(sec_class_test_module); diff --git a/drivers/samsung/lmkd_debug.c b/drivers/samsung/lmkd_debug.c new file mode 100755 index 000000000000..f3d801382838 --- /dev/null +++ b/drivers/samsung/lmkd_debug.c @@ -0,0 +1,147 @@ +/* + * Copyright (c) Samsung Technologies Co., Ltd. 2001-2020. All rights reserved. + * + * File name: lmkd_debug.c + * Description: debug for lmkd + * Author: jiman.kwon@samsung.com + * Version: 0.1 + * Date: 2020/05/13 + */ + +#include +#include +#include +#include +#include + +#define RET_OK 0 +#define RET_ERR 1 + +static int lmkd_count; +static int lmkd_cricount; + +static atomic_t lmkd_debug_init_suc; +static struct proc_dir_entry *lmkd_debug_rootdir; + +static ssize_t psi_lmkd_count_read(struct file *file, char __user *buf, + size_t count, loff_t *ppos) +{ + size_t len; + char buffer[32]; + + len = snprintf(buffer, sizeof(buffer), "%d\n", lmkd_count); + + return simple_read_from_buffer(buf, count, ppos, buffer, len); +} + +static ssize_t psi_lmkd_cricount_read(struct file *file, char __user *buf, + size_t count, loff_t *ppos) +{ + size_t len; + char buffer[32]; + + len = snprintf(buffer, sizeof(buffer), "%d\n", lmkd_cricount); + + return simple_read_from_buffer(buf, count, ppos, buffer, len); +} + +static ssize_t psi_lmkd_count_write(struct file *file, const char __user *user_buf, + size_t count, loff_t *ppos) +{ + char buffer[32]; + int err; + + memset(buffer, 0, sizeof(buffer)); + + if (count > sizeof(buffer) - 1) + count = sizeof(buffer) - 1; + if (copy_from_user(buffer, user_buf, count)) { + err = -EFAULT; + return err; + } + + buffer[count] = '\0'; + err = kstrtoint(strstrip(buffer), 0, &lmkd_count); + if (err) + return err; + + return count; +} + +static ssize_t psi_lmkd_cricount_write(struct file *file, const char __user *user_buf, + size_t count, loff_t *ppos) +{ + char buffer[32]; + int err; + + memset(buffer, 0, sizeof(buffer)); + + if (count > sizeof(buffer) - 1) + count = sizeof(buffer) - 1; + if (copy_from_user(buffer, user_buf, count)) { + err = -EFAULT; + return err; + } + + buffer[count] = '\0'; + err = kstrtoint(strstrip(buffer), 0, &lmkd_cricount); + if (err) + return err; + + return count; +} + +static const struct file_operations psi_lmkd_count_fops = { + .read = psi_lmkd_count_read, + .write = psi_lmkd_count_write, + .llseek = default_llseek, +}; + +static const struct file_operations psi_lmkd_cricount_fops = { + .read = psi_lmkd_cricount_read, + .write = psi_lmkd_cricount_write, + .llseek = default_llseek, +}; + +static int __init klmkd_debug_init(void) +{ + struct proc_dir_entry *lmkd_count_entry = NULL; + struct proc_dir_entry *lmkd_cricount_entry = NULL; + + lmkd_debug_rootdir = proc_mkdir("lmkd_debug", NULL); + if (!lmkd_debug_rootdir) + pr_err("create /proc/lmkd_debug failed\n"); + else { + lmkd_count_entry = proc_create("lmkd_count", 0644, lmkd_debug_rootdir, &psi_lmkd_count_fops); + if (!lmkd_count_entry) { + pr_err("create /proc/lmkd_debug/lmkd_count failed, remove /proc/lmkd_debug dir\n"); + remove_proc_entry("lmkd_debug", NULL); + lmkd_debug_rootdir = NULL; + } else { + lmkd_cricount_entry = proc_create("lmkd_cricount", 0644, lmkd_debug_rootdir, &psi_lmkd_cricount_fops); + if (!lmkd_cricount_entry) { + pr_err("create /proc/lmkd_debug/lmkd_cricount failed, remove /proc/lmkd_debug dir\n"); + remove_proc_entry("lmkd_debug/lmkd_count", NULL); + remove_proc_entry("lmkd_debug", NULL); + lmkd_debug_rootdir = NULL; + } + } + } + + atomic_set(&lmkd_debug_init_suc, 1); + return RET_OK; +} + +static void __exit klmkd_debug_exit(void) +{ + if (lmkd_debug_rootdir) { + remove_proc_entry("lmkd_count", lmkd_debug_rootdir); + remove_proc_entry("lmkd_cricount", lmkd_debug_rootdir); + remove_proc_entry("lmkd_debug", NULL); + } +} + +module_init(klmkd_debug_init); +module_exit(klmkd_debug_exit); + +MODULE_LICENSE("GPL"); diff --git a/drivers/samsung/quest/sec_quest.c b/drivers/samsung/quest/sec_quest.c index fc57d6521647..e80dddd4ba1d 100755 --- a/drivers/samsung/quest/sec_quest.c +++ b/drivers/samsung/quest/sec_quest.c @@ -1513,14 +1513,30 @@ static ssize_t store_quest_main(struct device *dev, QUEST_PRINT("%s : start STEP_MAIN\n", __func__); param_quest_data.curr_step = STEP_MAIN; param_quest_data.main_item_result = 0; +#if defined(CONFIG_SEC_A73XQ_PROJECT) + param_quest_data.hlos_remained_count = 3; +#else param_quest_data.hlos_remained_count = 1; +#endif #if defined(CONFIG_SEC_QUEST_UEFI) +#if defined(CONFIG_SEC_A73XQ_PROJECT) + param_quest_data.quefi_remained_count = 3*MAIN_QUEST_QUEFI_REPEATS; +#else param_quest_data.quefi_remained_count = MAIN_QUEST_QUEFI_REPEATS; #endif +#endif #if defined(CONFIG_SEC_QUEST_UEFI_ENHANCEMENT) +#if defined(CONFIG_SEC_A73XQ_PROJECT) + param_quest_data.suefi_remained_count = 3; +#else param_quest_data.suefi_remained_count = 1; #endif +#endif +#if defined(CONFIG_SEC_A73XQ_PROJECT) + param_quest_data.ddrscan_remained_count = 3; +#else param_quest_data.ddrscan_remained_count = 1; +#endif param_quest_data.hlos_remained_count--; QUEST_SET_ITEM_SUBITEM_RESULT(param_quest_data.main_item_result, QUESTHLOS_HLOS_ITEM_MAIN_CAL, ITEM_RESULT_INCOMPLETED); diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 574375a7a87a..132103764c3a 100755 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -403,13 +403,13 @@ static int queuing_req[UFS_CMDQ_DEPTH_MAX]; struct ufs_data_log_summary { u64 start_time; - u64 end_time; - sector_t sector; - int segments_cnt; + u64 end_time; + sector_t sector; + int segments_cnt; int done; #if defined(CONFIG_UFS_DATA_LOG_MAGIC_CODE) u64 *virt_addr; - char datbuf[UFS_DATA_BUF_SIZE]; + char datbuf[UFS_DATA_BUF_SIZE]; #endif }; @@ -884,7 +884,6 @@ static void SEC_ufs_update_tw_info(struct ufs_hba *hba, int write_transfer_len) disable_tw_info: /* disable tw_info updating when MSB is set */ tw_info->tw_info_disable = true; - return; } static void SEC_ufs_update_h8_info(struct ufs_hba *hba, bool hibern8_enter) @@ -916,9 +915,8 @@ static void SEC_ufs_update_h8_info(struct ufs_hba *hba, bool hibern8_enter) } else { calc_h8_time_ms = (u64)ktime_ms_delta(ktime_get(), tw_info->hibern8_enter_ts); #if defined(CONFIG_SCSI_UFS_QCOM) - if (ufshcd_is_auto_hibern8_supported(hba)) { + if (ufshcd_is_auto_hibern8_supported(hba)) calc_h8_time_ms += (u64)(hba->clk_gating.delay_ms - hba->hibern8_on_idle.delay_ms); - } #endif if (calc_h8_time_ms > 99) { @@ -5282,15 +5280,14 @@ static int __ufshcd_query_vendor_func(struct ufs_hba *hba, BUG_ON(!hba); - pm_runtime_get_sync(hba->dev); - ufshcd_hold_all(hba); if (!desc_buf) { dev_err(hba->dev, "%s: descriptor buffer required for opcode 0x%x\n", __func__, opcode); - err = -EINVAL; - goto out; + return -EINVAL; } + pm_runtime_get_sync(hba->dev); + ufshcd_hold_all(hba); mutex_lock(&hba->dev_cmd.lock); request = &hba->dev_cmd.query.request; @@ -5322,7 +5319,6 @@ static int __ufshcd_query_vendor_func(struct ufs_hba *hba, out_unlock: mutex_unlock(&hba->dev_cmd.lock); -out: ufshcd_release_all(hba); pm_runtime_put_sync(hba->dev); return err; @@ -5580,7 +5576,6 @@ static int ufshcd_tw_flush_ctrl(struct ufs_hba *hba) #endif #endif // CONFIG_BLK_TURBO_WRITE - /** * ufshcd_memory_alloc - allocate memory for host memory space data structures * @hba: per adapter instance @@ -6734,7 +6729,6 @@ static int ufshcd_link_startup(struct ufs_hba *hba) link_startup_again = true; link_startup: - do { ufshcd_vops_link_startup_notify(hba, PRE_CHANGE); @@ -6755,7 +6749,8 @@ link_startup: * but we can't be sure if the link is up until link startup * succeeds. So reset the local Uni-Pro and try again. */ - if ((ret && !retries && !link_startup_again) || (ret && ufshcd_hba_enable(hba))) + if ((ret && !retries && !link_startup_again) || + (ret && ufshcd_hba_enable(hba))) goto out; } while (ret && retries--); @@ -6894,7 +6889,7 @@ static void ufshcd_set_queue_depth(struct scsi_device *sdev) } /** - * ufshcd_get_boot_lun - get boot lun + * ufshcd_get_bootlunID - get boot lun * @sdev: pointer to SCSI device * * Read bBootLunID in UNIT Descriptor to find boot LUN @@ -6911,10 +6906,9 @@ static void ufshcd_get_bootlunID(struct scsi_device *sdev) UNIT_DESC_PARAM_BOOT_LUN_ID, &bBootLunID, sizeof(bBootLunID)); - /* Some WLUN doesn't support unit descriptor */ - if (ret == -EOPNOTSUPP) - bBootLunID = 0; + if (ret) + sdev->bootlunID = 0; else sdev->bootlunID = bBootLunID; } @@ -8311,7 +8305,6 @@ static void ufshcd_fatal_mode_handler(struct work_struct *work) UFS_Toshiba_K2_query_fatal_mode(hba); ufshcd_scsi_unblock_requests(hba); - return; } /** @@ -8979,6 +8972,7 @@ out: if ((hba->dev_info.quirks & UFS_DEVICE_QUIRK_SUPPORT_QUERY_FATAL_MODE) && !hba->UFS_fatal_mode_done) { unsigned long max_doorbells = (1UL << hba->nutrs) - 1; + if (hba->outstanding_reqs == max_doorbells) __ufshcd_transfer_req_compl(hba, (1UL << (hba->nutrs - 1))); @@ -9490,7 +9484,8 @@ get_model_string: dev_desc->wspecversion = desc_buf[DEVICE_DESC_PARAM_SPEC_VER] << 8 | desc_buf[DEVICE_DESC_PARAM_SPEC_VER + 1]; - dev_info(hba->dev, "%s: UFS spec 0x%04x.\n", __func__, dev_desc->wspecversion); + dev_info(hba->dev, "%s: UFS spec 0x%04x.\n", + __func__, dev_desc->wspecversion); out: return err; } @@ -9850,7 +9845,8 @@ static int ufshcd_get_dev_ref_clk_gating_wait(struct ufs_hba *hba, * 20 digits : manid + mandate + serial number * (sec, hynix : 7byte hex, toshiba : 6byte + 00, ascii) */ -static void ufs_set_sec_unique_number(struct ufs_hba *hba, u8 *str_desc_buf, u8 *desc_buf) +static void ufs_set_sec_unique_number(struct ufs_hba *hba, + u8 *str_desc_buf, u8 *desc_buf) { u8 manid; u8 snum_buf[UFS_UN_MAX_DIGITS + 1]; @@ -9863,14 +9859,17 @@ static void ufs_set_sec_unique_number(struct ufs_hba *hba, u8 *str_desc_buf, u8 sprintf(hba->unique_number, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", manid, - desc_buf[DEVICE_DESC_PARAM_MANF_DATE], desc_buf[DEVICE_DESC_PARAM_MANF_DATE+1], - snum_buf[0], snum_buf[1], snum_buf[2], snum_buf[3], snum_buf[4], snum_buf[5], snum_buf[6]); + desc_buf[DEVICE_DESC_PARAM_MANF_DATE], + desc_buf[DEVICE_DESC_PARAM_MANF_DATE + 1], + snum_buf[0], snum_buf[1], snum_buf[2], snum_buf[3], + snum_buf[4], snum_buf[5], snum_buf[6]); /* Null terminate the unique number string */ hba->unique_number[UFS_UN_MAX_DIGITS] = '\0'; hba->dev_info.w_manufacturer_date = - desc_buf[DEVICE_DESC_PARAM_MANF_DATE] << 8 | desc_buf[DEVICE_DESC_PARAM_MANF_DATE+1]; + desc_buf[DEVICE_DESC_PARAM_MANF_DATE] << 8 | + desc_buf[DEVICE_DESC_PARAM_MANF_DATE + 1]; } static int ufs_read_device_desc_data(struct ufs_hba *hba) @@ -9927,7 +9926,8 @@ static int ufs_read_device_desc_data(struct ufs_hba *hba) __func__, err); } else { hba->dev_info.i_lt = health_buf[HEALTH_DESC_PARAM_LIFE_TIME_EST_A]; - dev_err(hba->dev, "LT: 0x%01x%01x\n", health_buf[HEALTH_DESC_PARAM_LIFE_TIME_EST_A], + dev_info(hba->dev, "LT: 0x%01x%01x\n", + health_buf[HEALTH_DESC_PARAM_LIFE_TIME_EST_A], health_buf[HEALTH_DESC_PARAM_LIFE_TIME_EST_B]); } @@ -11449,7 +11449,7 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op) /* UFS device & link must be active before we enter in this function */ if (!ufshcd_is_ufs_dev_active(hba) || !ufshcd_is_link_active(hba)) - goto set_vreg_lpm; + goto disable_clks; if (ufshcd_is_runtime_pm(pm_op)) { if (ufshcd_can_autobkops_during_suspend(hba)) { @@ -11494,9 +11494,6 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op) ufshcd_is_hibern8_on_idle_allowed(hba)) hba->hibern8_on_idle.state = HIBERN8_ENTERED; -set_vreg_lpm: - if (!hba->auto_bkops_enabled) - ufshcd_vreg_set_lpm(hba); disable_clks: /* * Call vendor specific suspend callback. As these callbacks may access @@ -11507,6 +11504,19 @@ disable_clks: if (ret) goto set_link_active; + /* + * Disable the host irq as host controller as there won't be any + * host controller transaction expected till resume. + */ + ufshcd_disable_irq(hba); + + /* reset the connected UFS device during power down */ + if (ufshcd_is_link_off(hba)) { + ret = ufshcd_assert_device_reset(hba); + if (ret) + goto set_link_active; + } + if (!ufshcd_is_link_active(hba)) ret = ufshcd_disable_clocks(hba, false); else @@ -11523,16 +11533,18 @@ disable_clks: trace_ufshcd_clk_gating(dev_name(hba->dev), hba->clk_gating.state); } - /* - * Disable the host irq as host controller as there won't be any - * host controller transaction expected till resume. - */ - ufshcd_disable_irq(hba); + + if (!hba->auto_bkops_enabled || + !(req_dev_pwr_mode == UFS_ACTIVE_PWR_MODE && + req_link_state == UIC_LINK_ACTIVE_STATE)) + ufshcd_vreg_set_lpm(hba); + /* Put the host controller in low power mode if possible */ ufshcd_hba_vreg_set_lpm(hba); goto out; set_link_active: + ufshcd_enable_irq(hba); if (hba->clk_scaling.is_allowed) ufshcd_resume_clkscaling(hba); ufshcd_vreg_set_hpm(hba); @@ -11540,6 +11552,7 @@ set_link_active: ufshcd_set_link_active(hba); } else if (ufshcd_is_link_off(hba)) { ufshcd_update_error_stats(hba, UFS_ERR_VOPS_SUSPEND); + ufshcd_deassert_device_reset(hba); ufshcd_host_reset_and_restore(hba); } set_dev_active: @@ -11592,17 +11605,19 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) old_pwr_mode = hba->curr_dev_pwr_mode; ufshcd_hba_vreg_set_hpm(hba); + + ret = ufshcd_vreg_set_hpm(hba); + if (ret) + goto out; + /* Make sure clocks are enabled before accessing controller */ ret = ufshcd_enable_clocks(hba); if (ret) - goto out; + goto disable_vreg; /* enable the host irq as host controller would be active soon */ ufshcd_enable_irq(hba); - ret = ufshcd_vreg_set_hpm(hba); - if (ret) - goto disable_irq_and_vops_clks; if (hba->restore) { /* Configure UTRL and UTMRL base address registers */ ufshcd_writel(hba, lower_32_bits(hba->utrdl_dma_addr), @@ -11623,7 +11638,7 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) */ ret = ufshcd_vops_resume(hba, pm_op); if (ret) - goto disable_vreg; + goto disable_irq_and_vops_clks; if (hba->extcon && (ufshcd_is_card_offline(hba) || @@ -11700,8 +11715,6 @@ set_old_link_state: hba->hibern8_on_idle.state = HIBERN8_ENTERED; vendor_suspend: ufshcd_vops_suspend(hba, pm_op); -disable_vreg: - ufshcd_vreg_set_lpm(hba); disable_irq_and_vops_clks: ufshcd_disable_irq(hba); if (hba->clk_scaling.is_allowed) @@ -11709,6 +11722,8 @@ disable_irq_and_vops_clks: ufshcd_disable_clocks(hba, false); if (ufshcd_is_clkgating_allowed(hba)) hba->clk_gating.state = CLKS_OFF; +disable_vreg: + ufshcd_vreg_set_lpm(hba); out: hba->pm_op_in_progress = 0; @@ -12387,18 +12402,22 @@ UFS_DEV_ATTR(sense_err_logging, "\"LBA0\":\"%lx\",\"LBA1\":\"%lx\",\"LBA2\":\"%l , hba->host->issue_LBA_list[8], hba->host->issue_LBA_list[9] , hba->host->issue_region_map); -static ssize_t ufs_unique_number_show(struct device *dev, struct device_attribute *attr, char *buf) +static ssize_t ufs_unique_number_show(struct device *dev, + struct device_attribute *attr, char *buf) { struct Scsi_Host *host = container_of(dev, struct Scsi_Host, shost_dev); struct ufs_hba *hba = shost_priv(host); + return sprintf(buf, "%s\n", hba->unique_number); } static DEVICE_ATTR(unique_number, 0440, ufs_unique_number_show, NULL); -static ssize_t ufs_lc_info_show(struct device *dev, struct device_attribute *attr, char *buf) +static ssize_t ufs_lc_info_show(struct device *dev, + struct device_attribute *attr, char *buf) { struct Scsi_Host *host = container_of(dev, struct Scsi_Host, shost_dev); struct ufs_hba *hba = shost_priv(host); + return sprintf(buf, "%u\n", hba->lc_info); } @@ -12419,7 +12438,8 @@ static ssize_t ufs_lc_info_store(struct device *dev, static DEVICE_ATTR(lc, 0664, ufs_lc_info_show, ufs_lc_info_store); -static ssize_t ufs_lt_info_show(struct device *dev, struct device_attribute *attr, char *buf) +static ssize_t ufs_lt_info_show(struct device *dev, + struct device_attribute *attr, char *buf) { struct Scsi_Host *host = container_of(dev, struct Scsi_Host, shost_dev); struct ufs_hba *hba = shost_priv(host); @@ -12436,7 +12456,8 @@ static ssize_t ufs_lt_info_show(struct device *dev, struct device_attribute *att __func__, err); } else { hba->dev_info.i_lt = health_buf[HEALTH_DESC_PARAM_LIFE_TIME_EST_A]; - dev_err(hba->dev, "LT: 0x%01x%01x\n", health_buf[HEALTH_DESC_PARAM_LIFE_TIME_EST_A], + dev_info(hba->dev, "LT: 0x%01x%01x\n", + health_buf[HEALTH_DESC_PARAM_LIFE_TIME_EST_A], health_buf[HEALTH_DESC_PARAM_LIFE_TIME_EST_B]); } diff --git a/drivers/security/samsung/five_tee_driver/Kconfig b/drivers/security/samsung/five_tee_driver/Kconfig index 66c4124ad281..805280a2c21e 100755 --- a/drivers/security/samsung/five_tee_driver/Kconfig +++ b/drivers/security/samsung/five_tee_driver/Kconfig @@ -4,7 +4,7 @@ config FIVE_TEE_DRIVER tristate "Integrity TEE Driver" - depends on FIVE + depends on FIVE && !PROCA_S_OS default y ---help--- Enable Integrity Trusted Execution Environment support diff --git a/drivers/security/samsung/icdrv/Kconfig b/drivers/security/samsung/icdrv/Kconfig index 1aa429133c37..975f74913989 100755 --- a/drivers/security/samsung/icdrv/Kconfig +++ b/drivers/security/samsung/icdrv/Kconfig @@ -4,7 +4,7 @@ config ICD bool "IC Driver" - depends on FIVE + depends on FIVE && !PROCA_S_OS default y ---help--- Enable Integrity Check Driver support. diff --git a/drivers/security/samsung/icdrv/test/Makefile b/drivers/security/samsung/icdrv/test/Makefile index 8c7d1d6eab7f..5688e4199b25 100755 --- a/drivers/security/samsung/icdrv/test/Makefile +++ b/drivers/security/samsung/icdrv/test/Makefile @@ -1,2 +1 @@ -obj-y += icdrv_kunit_test.o ccflags-y += -I$(src)/.. \ No newline at end of file diff --git a/drivers/security/samsung/tzic/Kconfig b/drivers/security/samsung/tzic/Kconfig index 48f1ec2ae636..33336a45d7a8 100755 --- a/drivers/security/samsung/tzic/Kconfig +++ b/drivers/security/samsung/tzic/Kconfig @@ -4,6 +4,7 @@ config TZIC tristate "TZIC Driver" + depends on !PROCA_S_OS default y ---help--- Enable TZIC Driver support. diff --git a/drivers/sensors/Kconfig b/drivers/sensors/Kconfig index aba21f192cfb..ee5ebbe90b30 100755 --- a/drivers/sensors/Kconfig +++ b/drivers/sensors/Kconfig @@ -117,3 +117,35 @@ config SENSORS_ISG5320A_SUB If you say yes here if you use ISG5320A_SUB for grip sub. This option enables grip sensors using IMAGIS ISG5320A_SUB device driver for grip sub. + +config SENSORS_ISG6320 + depends on I2C + tristate "ISG6320 grip" + default n + help + If you say yes here if you use ISG6320 for grip. + This option enables grip sensors using + IMAGIS ISG6320 device driver for grip. + +config SENSORS_ISG6320_WIFI + depends on I2C + tristate "ISG6320 grip wifi" + default n + help + If you say yes here if you use ISG6320_WIFI for grip. + This option enables grip sensors using + IMAGIS ISG6320_WIFI device driver for grip. + +config USE_MULTI_CHANNEL + tristate "Grip sensor multi chennel" + default n + help + Enable grip multi channel + This option enables feature that is related multi-Channel for grip Sensor. + +config USE_SINGLE_IRQ_B + tristate "Grip sensor single irq b" + default n + help + Enable grip single irq b + This option enables feature that is related single irq b for grip Sensor. \ No newline at end of file diff --git a/drivers/sensors/Makefile b/drivers/sensors/Makefile index c2e8ee006bc5..a959fe7db4a5 100755 --- a/drivers/sensors/Makefile +++ b/drivers/sensors/Makefile @@ -10,3 +10,4 @@ obj-$(CONFIG_SENSORS_A96T3X6) += a96t3x6.o obj-$(CONFIG_SENSORS_A96T3X6_SUB) += a96t3x6_sub.o obj-$(CONFIG_SENSORS_ISG5320A) += isg5320a.o obj-$(CONFIG_SENSORS_ISG5320A_SUB) += isg5320a_sub.o +obj-$(CONFIG_SENSORS_ISG6320) += isg6320.o \ No newline at end of file diff --git a/drivers/sensors/isg6320.c b/drivers/sensors/isg6320.c new file mode 100755 index 000000000000..dd20b38db590 --- /dev/null +++ b/drivers/sensors/isg6320.c @@ -0,0 +1,3389 @@ +/* + * Copyright (C) 2021,Imagis Technology Co. Ltd. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if IS_ENABLED(CONFIG_CCIC_NOTIFIER) || IS_ENABLED(CONFIG_PDIC_NOTIFIER) +#include +#endif +#if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) +#include +#endif +#if IS_ENABLED(CONFIG_HALL_NOTIFIER) +#include +#define HALL_NAME "hall" +#define HALL_CERT_NAME "certify_hall" +#define HALL_FLIP_NAME "flip" +#define HALL_ATTACH 1 +#define HALL_DETACH 0 +#else +#define HALLIC_PATH "/sys/class/sec/hall_ic/hall_detect" +#define WACOM_HALLIC_PATH "/sys/class/sec/hall_ic/hall_wacom_detect" +#endif + +#include "isg6320_reg.h" + +#define VENDOR_NAME "IMAGIS" + +#define ISG6320_MODE_SLEEP 0 +#define ISG6320_MODE_NORMAL 1 +#define ISG6320_DIFF_AVR_CNT 10 +#define ISG6320_DISPLAY_TIME 30 +#define ISG6320_TAG "[ISG6320]" + +#define ISG6320_INIT_DELAYEDWORK +#define GRIP_LOG_TIME 5 + +#define SHCEDULE_INTERVAL 2000 // 2 sec * 5 = 10 sec +#define SHCEDULE_INTERVAL_MAX 20000 // 20 sec * 5 = 100 sec + +#ifdef CONFIG_USE_MULTI_CHANNEL +#if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) +#define SENSOR_ATTR_SIZE 60 +#else +#define SENSOR_ATTR_SIZE 45 +#endif +#endif + +#define TYPE_USB 1 +#define TYPE_HALL 2 +#define TYPE_BOOT 3 +#define TYPE_FORCE 4 +#define TYPE_COVER 5 + +#define COUNTRY_KOR 1 +#define COUNTRY_ETC 0 + +#pragma pack(1) +typedef struct { + char cmd; + u8 addr; + u8 val; +} direct_info; +#pragma pack() + +#ifdef CONFIG_USE_MULTI_CHANNEL +struct multi_channel { + int state_a; + int state_b; + + u32 cdc_b; + u32 base_b; + s32 diff_b; + s32 max_diff_b; + s32 max_normal_diff_b; + + int diff_cnt_b; + int diff_sum_b; + int diff_avg_b; + int cdc_sum_b; + int cdc_avg_b; + + u32 cfcal_th_b; + u16 normal_th_b; + u16 fine_coarse_b; + int is_unknown_mode; + bool first_working; +}; +#endif + +struct isg6320_data { + struct i2c_client *client; + struct input_dev *input_dev; + struct input_dev *noti_input_dev; + struct device *dev; + struct work_struct irq_work; + struct work_struct cfcal_work; + struct delayed_work cal_work; +#ifdef ISG6320_INIT_DELAYEDWORK + struct delayed_work init_work; +#endif + struct wakeup_source *grip_ws; + struct mutex lock; +#if IS_ENABLED(CONFIG_CCIC_NOTIFIER) || IS_ENABLED(CONFIG_PDIC_NOTIFIER) + struct notifier_block cpuidle_ccic_nb; + int pdic_status; + int pdic_pre_attach; +#endif +#if IS_ENABLED(CONFIG_HALL_NOTIFIER) + struct notifier_block hall_nb; +#else + int hall_flag; + int wacom_hall_flag; + unsigned char hall_ic[6]; + unsigned char wacom_hall_ic[6]; +#endif +#if IS_ENABLED(CONFIG_FLIP_COVER_DETECTOR_NOTIFIER) + struct notifier_block fcd_nb; +#endif + direct_info direct; + + int gpio_int; + int enable; + int noti_enable; + int country_code; + int initialized; + int reg_size; + + int irq_count; + u16 schedule_time; + u8 abnormal_mode; + u8 debug_cnt; + + int pre_attach; + + int state; + + u32 multi_use; + u32 cdc; + u32 base; + s32 diff; + s32 max_diff; + s32 max_normal_diff; + + int diff_cnt; + int diff_sum; + int diff_avg; + int cdc_sum; + int cdc_avg; + + u32 cfcal_th; + u16 normal_th; + u16 fine_coarse; + +#ifdef CONFIG_USE_MULTI_CHANNEL + struct multi_channel *mul_ch; +#endif + + u8 setup_reg[320]; + + u8 ic_num; + + bool skip_data; + bool setup_reg_exist; + bool in_suspend; + +#if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) + u32 debug_cdc[4]; + u32 debug_base[2]; + s32 debug_diff[4]; + + int irq_debug_size; + u8 irq_debug_addr; + + u8 freq_step; + u8 freq_value; +#endif +#if defined(CONFIG_TABLET_MODEL_CONCEPT) + u8 lsum_a; + u8 lsum_b; +#endif +#if !defined(CONFIG_SEC_FACTORY) && defined(CONFIG_SUPPORT_MCC_THRESHOLD_CHANGE) + struct work_struct mcc_work; + int mcc; + u8 default_threshold; + u8 default_hysteresis; + u8 mcc_threshold; + u8 mcc_hysteresis; +#endif + int ldo_en; + int otg_attach_state; + int is_unknown_mode; + int motion; + bool first_working; +}; + +static void isg6320_set_debug_work(struct isg6320_data *data, bool enable, + unsigned int delay_ms); + +static int check_hallic_state(char *file_path, unsigned char hall_ic_status[]) +{ + int ret = 0; + mm_segment_t old_fs; + struct file *filep; + u8 hall_sysfs[5]; + + old_fs = get_fs(); + set_fs(KERNEL_DS); + + filep = filp_open(file_path, O_RDONLY, 0666); + if (IS_ERR(filep)) { + ret = PTR_ERR(filep); + set_fs(old_fs); + goto exit; + } + + ret = filep->f_op->read(filep, hall_sysfs, + sizeof(hall_sysfs), &filep->f_pos); + + if (ret != sizeof(hall_sysfs)) { + pr_err("%s %s: file read fail %d\n", ISG6320_TAG, __func__, ret); + ret = -EIO; + } else { + strncpy(hall_ic_status, hall_sysfs, sizeof(hall_sysfs)); + } + + filp_close(filep, current->files); + set_fs(old_fs); + +exit: + return ret; +} + +static int isg6320_i2c_write(struct isg6320_data *data, u8 cmd, u8 val) +{ + int ret; + u8 buf[2]; + struct i2c_msg msg; + + buf[0] = cmd; + buf[1] = val; + + msg.addr = data->client->addr; + msg.flags = 0; /*I2C_M_WR*/ + msg.len = 2; + msg.buf = buf; + + ret = i2c_transfer(data->client->adapter, &msg, 1); + if (ret < 0) + pr_err("[GRIP_%d] %s fail(%d)\n", data->ic_num, __func__, + ret); + + return ret; +} + +static int isg6320_i2c_read(struct isg6320_data *data, u8 cmd, u8 *val, + int len) +{ + int ret; + struct i2c_msg msgs[2] = { + { + .addr = data->client->addr, + .flags = 0, + .len = sizeof(cmd), + .buf = &cmd, + }, + { + .addr = data->client->addr, + .flags = I2C_M_RD, + .len = len, + .buf = val, + }, + }; + + ret = i2c_transfer(data->client->adapter, msgs, 2); + if (ret < 0) + pr_err("[GRIP_%d] %s fail(%d)\n", data->ic_num, __func__, + ret); + + return ret; +} + +static int isg6320_reset(struct isg6320_data *data) +{ + int ret = 0; + int cnt = 0; + u8 val; + + pr_info("[GRIP_%d] %s\n", data->ic_num, __func__); + + if (data->initialized == OFF) + usleep_range(5000, 5100); + + ret = isg6320_i2c_read(data, ISG6320_IRQSRC_REG, &val, 1); + if (ret < 0) { + pr_err("[GRIP_%d] irq to high failed(%d)\n", data->ic_num, ret); + return ret; + } + + while (gpio_get_value_cansleep(data->gpio_int) == 0 && cnt++ < 10) + usleep_range(5000, 5100); + + if (cnt >= 10) + pr_err("[GRIP_%d] wait irq to high failed\n", data->ic_num); + + ret = isg6320_i2c_write(data, ISG6320_PROTECT_REG, ISG6320_PRT_VALUE); + if (ret < 0) { + pr_err("[GRIP_%d] unlock protect failed(%d)\n", data->ic_num, ret); + return ret; + } + + ret = isg6320_i2c_write(data, ISG6320_SOFTRESET_REG, ISG6320_RST_VALUE); + if (ret < 0) { + pr_err("[GRIP_%d] soft reset failed(%d)\n", data->ic_num, ret); + return ret; + } + + usleep_range(1000, 1100); + + return ret; +} + +static int isg6320_force_calibration(struct isg6320_data *data) +{ + int ret = 0; + int retry = 3; + + isg6320_set_debug_work(data, OFF, 0); + mutex_lock(&data->lock); +#if IS_ENABLED(CONFIG_CCIC_NOTIFIER) || IS_ENABLED(CONFIG_PDIC_NOTIFIER) + if (data->pdic_status == ON) { + if (data->initialized == ON) { +#endif +#if defined(CONFIG_TABLET_MODEL_CONCEPT) + isg6320_i2c_write(data, ISG6320_SCANCTRL1_REG, ISG6320_DFE_ENABLE); + usleep_range(10000, 10010); + isg6320_i2c_write(data, ISG6320_SCANCTRL1_REG, ISG6320_SCAN_STOP); + usleep_range(10000, 10010); + isg6320_i2c_write(data, ISG6320_A_PROXCTL4_REG, 0xFF); + isg6320_i2c_write(data, ISG6320_A_LSUM_TYPE_REG, 0x10); +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + isg6320_i2c_write(data, ISG6320_B_PROXCTL4_REG, 0xFF); + isg6320_i2c_write(data, ISG6320_B_LSUM_TYPE_REG, 0x10); + } +#endif +#endif +#if IS_ENABLED(CONFIG_CCIC_NOTIFIER) || IS_ENABLED(CONFIG_PDIC_NOTIFIER) + } + } +#endif +#if IS_ENABLED(CONFIG_CCIC_NOTIFIER) || IS_ENABLED(CONFIG_PDIC_NOTIFIER) + else if (data->pdic_status == OFF) { + if (data->initialized == ON) { +#endif +#if defined(CONFIG_TABLET_MODEL_CONCEPT) + isg6320_i2c_write(data, ISG6320_SCANCTRL1_REG, ISG6320_DFE_ENABLE); + usleep_range(10000, 10010); + isg6320_i2c_write(data, ISG6320_SCANCTRL1_REG, ISG6320_SCAN_STOP); + usleep_range(10000, 10010); + isg6320_i2c_write(data, ISG6320_A_PROXCTL4_REG, 0x58); + isg6320_i2c_write(data, ISG6320_A_LSUM_TYPE_REG, data->lsum_a); +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + isg6320_i2c_write(data, ISG6320_B_PROXCTL4_REG, 0x58); + isg6320_i2c_write(data, ISG6320_B_LSUM_TYPE_REG, data->lsum_b); + } +#endif +#endif +#if IS_ENABLED(CONFIG_CCIC_NOTIFIER) || IS_ENABLED(CONFIG_PDIC_NOTIFIER) + } + } +#endif + pr_info("[GRIP_%d] %s\n", data->ic_num, __func__); + + while (retry--) { + u8 val = 0; + + ret = 0; + + isg6320_i2c_write(data, ISG6320_SCANCTRL1_REG, ISG6320_DFE_ENABLE); + usleep_range(10000, 10010); + isg6320_i2c_write(data, ISG6320_SCANCTRL1_REG, ISG6320_SCAN_STOP); + usleep_range(10000, 10010); +#if defined(CONFIG_TABLET_MODEL_CONCEPT) + isg6320_i2c_write(data, ISG6320_PROTECT_REG, ISG6320_RST_VALUE); + isg6320_i2c_write(data, ISG6320_RESETCON_REG, ISG6320_DFE_RESET_ON); + usleep_range(10000, 10010); + isg6320_i2c_write(data, ISG6320_PROTECT_REG, ISG6320_RST_VALUE); + isg6320_i2c_write(data, ISG6320_RESETCON_REG, ISG6320_DFE_RESET_OFF); + usleep_range(10000, 10010); +#endif + isg6320_i2c_write(data, ISG6320_SCANCTRL1_REG, ISG6320_CFCAL_START); + msleep(450); + + isg6320_i2c_read(data, ISG6320_CFCAL_RTN_REG, &val, 1); + pr_info("[GRIP_%d] reg read : %02x\n", data->ic_num, val); + if (!(val & ISG6320_CAL_RTN_A_MASK)) { + pr_err("[GRIP_%d] fail calibration(%d)\n", data->ic_num, retry); + ret = -EAGAIN; + } +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + if (!(val & ISG6320_CAL_RTN_B_MASK)) { + pr_err("[GRIP_%d] [B] fail calibration(%d)\n", data->ic_num, retry); + ret = -EAGAIN; + } + } +#endif + if (!ret) + break; + } + + mutex_unlock(&data->lock); + if (!data->in_suspend) + isg6320_set_debug_work(data, ON, SHCEDULE_INTERVAL + (data->ic_num << 3)); + return ret; +} + +static inline unsigned char str2int(unsigned char c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + + if (c >= 'A' && c <= 'F') + return c - 'A' + 10; + + if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + + return 0; +} + +#if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) +static void isg6320_irq_debug(struct isg6320_data *data) +{ + int ret; + u8 *buf8; + + buf8 = kzalloc(data->irq_debug_size, GFP_KERNEL); + if (buf8) { + int i = 0; + pr_info("[GRIP_%d] Intr_debug1 (0x%02X)\n", data->ic_num, + data->irq_debug_addr); + ret = isg6320_i2c_read(data, data->irq_debug_addr, buf8, + data->irq_debug_size); + if (ret < 0) { + pr_err("[GRIP_%d] fail to read irq_debug_addr(%d)\n", + data->ic_num, ret); + kfree(buf8); + return; + } + + for (; i < data->irq_debug_size; i++) + pr_info("[GRIP_%d] \t%02X\n", data->ic_num, buf8[i]); + kfree(buf8); + } +} +#endif + +static int isg6320_get_raw_data(struct isg6320_data *data, bool log_print) +{ + int ret = 0; + u8 buf[4]; + u16 cpbuf; + u32 temp, temp1; + bool valid[2] = {true, true}; + + mutex_lock(&data->lock); + ret = isg6320_i2c_read(data, ISG6320_CDC16_TA_H_REG, buf, sizeof(buf)); + + if (ret < 0) { + pr_err("[GRIP_%d] fail to get data\n", data->ic_num); + } else { + temp = ((u32)buf[0] << 8) | (u32)buf[1]; + temp1 = ((u32)buf[2] << 8) | (u32)buf[3]; + + if (!((temp != 0) && (temp < 0x7FFF))) { + valid[0] = false; + pr_err("[GRIP_%d] cdc is invalid(%04x)\n", data->ic_num, temp); + } + + if (!((temp1 != 0) && (temp1 < 0x7FFF))) { + valid[1] = false; + pr_err("[GRIP_%d] base is invalid(%04x)\n", data->ic_num, temp1); + } + + if (valid[0] && valid[1]) { + data->cdc = temp; + data->base = temp1; + } + + data->diff = (s32)data->cdc - (s32)data->base; + + ret = isg6320_i2c_read(data, ISG6320_A_COARSE_OUT_REG, + (u8 *)&cpbuf, 2); + if (ret < 0) + pr_err("[GRIP_%d] fail to get capMain\n", data->ic_num); + else + data->fine_coarse = cpbuf; + } + +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + ret = isg6320_i2c_read(data, ISG6320_CDC16_TB_H_REG, buf, sizeof(buf)); + + if (ret < 0) { + pr_err("[GRIP_%d] [B] fail to get data\n", data->ic_num); + } else { + valid[0] = valid[1] = true; + temp = ((u32)buf[0] << 8) | (u32)buf[1]; + temp1 = ((u32)buf[2] << 8) | (u32)buf[3]; + + if (!((temp != 0) && (temp < 0x7FFF))) { + valid[0] = false; + pr_err("[GRIP_%d] [B] cdc is invalid(%04x)\n", data->ic_num, temp); + } + + if (!((temp1 != 0) && (temp1 < 0x7FFF))) { + valid[1] = false; + pr_err("[GRIP_%d] [B] base is invalid(%04x)\n", data->ic_num, temp1); + } + + if (valid[0] && valid[1]) { + data->mul_ch->cdc_b = temp; + data->mul_ch->base_b = temp1; + } + + data->mul_ch->diff_b = (s32)data->mul_ch->cdc_b - (s32)data->mul_ch->base_b; + + ret = isg6320_i2c_read(data, ISG6320_B_COARSE_OUT_REG, + (u8 *)&cpbuf, 2); + if (ret < 0) + pr_err("[GRIP_%d] [B] fail to get capMain\n", data->ic_num); + else + data->mul_ch->fine_coarse_b = cpbuf; + } + } +#endif + mutex_unlock(&data->lock); + + if (log_print || (data->debug_cnt >= GRIP_LOG_TIME)) { + pr_info("[GRIP_%d] CapMain: %d%02d, cdc: %d, baseline:%d, diff:%d, " + "skip_data:%d\n", + data->ic_num, (data->fine_coarse & 0xFF), + ((data->fine_coarse >> 8) & 0x3F), data->cdc, data->base, + data->diff, data->skip_data); +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + pr_info("[GRIP_%d] [B] CapMain: %d%02d, cdc: %d, baseline:%d, diff:%d, " + "skip_data:%d\n", + data->ic_num, (data->mul_ch->fine_coarse_b & 0xFF), + ((data->mul_ch->fine_coarse_b >> 8) & 0x3F), data->mul_ch->cdc_b, + data->mul_ch->base_b, data->mul_ch->diff_b, data->skip_data); + } +#endif + data->debug_cnt = 0; + } else { + data->debug_cnt++; + } + + return ret; +} + +static void force_far_grip(struct isg6320_data *data) +{ + if (data->state == CLOSE) { + pr_info("[GRIP_%d] %s\n", data->ic_num, __func__); + + if (data->skip_data == true) + return; + + input_report_rel(data->input_dev, REL_MISC, 2); + input_report_rel(data->input_dev, REL_X, data->is_unknown_mode); + input_sync(data->input_dev); + data->state = FAR; + } +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + if (data->mul_ch->state_b == CLOSE) { + pr_info("[GRIP_%d] [B] %s\n", data->ic_num, __func__); + + if (data->skip_data == true) + return; + + input_report_rel(data->input_dev, REL_DIAL, 2); + input_report_rel(data->input_dev, REL_Y, data->mul_ch->is_unknown_mode); + input_sync(data->input_dev); + data->mul_ch->state_b = FAR; + } + } +#endif +} + +static void report_event_data(struct isg6320_data *data, u8 irq_msg) +{ + int state_a; +#ifdef CONFIG_USE_MULTI_CHANNEL + int state_b; +#endif + if (data->skip_data == true) { + pr_info("[GRIP_%d] skip grip event\n", data->ic_num); + return; + } + + state_a = (irq_msg & (1 << ISG6320_PROX_A_STATE)) ? CLOSE : FAR; +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + state_b = (irq_msg & (1 << ISG6320_PROX_B_STATE)) ? CLOSE : FAR; + } +#endif + + if (data->abnormal_mode) { + if (state_a == CLOSE) { + if (data->max_diff < data->diff) + data->max_diff = data->diff; + data->irq_count++; + } +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + if (state_b == CLOSE) { + if (data->mul_ch->max_diff_b < data->mul_ch->diff_b) + data->mul_ch->max_diff_b = data->mul_ch->diff_b; + data->irq_count++; + } + } +#endif + } + + if (state_a == CLOSE) { + if (data->state == FAR) { + pr_info("[GRIP_%d] CLOSE\n", data->ic_num); + data->state = CLOSE; + } + } else { + if (data->state == CLOSE) { + pr_info("[GRIP_%d] FAR\n", data->ic_num); + data->state = FAR; + } + } +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + if (state_b == CLOSE) { + if (data->mul_ch->state_b == FAR) { + pr_info("[GRIP_%d] [B] CLOSE\n", data->ic_num); + data->mul_ch->state_b = CLOSE; + } + } else { + if (data->mul_ch->state_b == CLOSE) { + pr_info("[GRIP_%d] [B] FAR\n", data->ic_num); + data->mul_ch->state_b = FAR; + } + } + } +#endif + + if (data->state == CLOSE) { + input_report_rel(data->input_dev, REL_MISC, 1); + if (data->is_unknown_mode == UNKNOWN_ON && data->motion) + data->first_working = true; + } else { + input_report_rel(data->input_dev, REL_MISC, 2); + if (data->is_unknown_mode == UNKNOWN_ON && data->motion) { + if (data->first_working) { + pr_info("[GRIP_%d] unknown mode off\n", data->ic_num); + data->is_unknown_mode = UNKNOWN_OFF; + data->first_working = false; + } + } + } +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + if (data->mul_ch->state_b == CLOSE) { + input_report_rel(data->input_dev, REL_DIAL, 1); + if (data->mul_ch->is_unknown_mode == UNKNOWN_ON && data->motion) + data->mul_ch->first_working = true; + } else { + input_report_rel(data->input_dev, REL_DIAL, 2); + if (data->mul_ch->is_unknown_mode == UNKNOWN_ON && data->motion) { + if (data->mul_ch->first_working) { + pr_info("[GRIP_%d] [B] unknown mode off\n", data->ic_num); + data->mul_ch->is_unknown_mode = UNKNOWN_OFF; + data->mul_ch->first_working = false; + } + } + } + } +#endif + input_report_rel(data->input_dev, REL_X, data->is_unknown_mode); +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + input_report_rel(data->input_dev, REL_Y, data->mul_ch->is_unknown_mode); + } +#endif + input_sync(data->input_dev); +} + +static u8 isg6320_read_irqstate(struct isg6320_data *data) +{ + int ret = 0; + u8 irq_msg = 0; + int retry = 3; + + while (retry--) { + ret = isg6320_i2c_read(data, ISG6320_IRQSRC_REG, &irq_msg, 1); + if (ret < 0) { + pr_err("[GRIP_%d] fail to read source(%d)\n", data->ic_num, ret); + usleep_range(10000, 10010); + } + else + break; + } + +#if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) + if (data->irq_debug_size > 0) + isg6320_irq_debug(data); +#endif + retry = 3; + + while (retry--) { + ret = isg6320_i2c_read(data, ISG6320_IRQSTS_REG, &irq_msg, 1); + if (ret < 0) { + pr_err("[GRIP_%d] fail to read state(%d)\n", data->ic_num, ret); + usleep_range(10000, 10010); + } + else + break; + } + + return irq_msg; +} + +static void irq_work_func(struct work_struct *work) +{ + struct isg6320_data *data = container_of((struct work_struct *)work, + struct isg6320_data, irq_work); + int ret; + u8 irq_msg; + + irq_msg = isg6320_read_irqstate(data); + pr_info("[GRIP_%d] irq_msg: 0x%02X\n", data->ic_num, irq_msg); + + msleep(100); + ret = isg6320_get_raw_data(data, true); + if (ret < 0) + pr_err("[GRIP_%d] fail to update data\n", data->ic_num); + + report_event_data(data, irq_msg); +} + +static void cfcal_work_func(struct work_struct *work) +{ + struct isg6320_data *data = container_of((struct work_struct *)work, + struct isg6320_data, cfcal_work); + + data->schedule_time = SHCEDULE_INTERVAL; + isg6320_force_calibration(data); +} + +#if !defined(CONFIG_SEC_FACTORY) && defined(CONFIG_SUPPORT_MCC_THRESHOLD_CHANGE) +static void mcc_work_func(struct work_struct *work) +{ + struct isg6320_data *data = container_of((struct work_struct *)work, + struct isg6320_data, mcc_work); + u8 threshold, hysteresis; + u8 val; + + // 001 : call box, 440/441 : jpn, 450 : kor, 460 : chn + if (data->mcc != 450) { + pr_info("[GRIP_%d] %s - default threshold %u, %u\n", data->ic_num, __func__, + data->default_threshold * 4, data->default_threshold * 4 - data->default_hysteresis); + threshold = data->default_threshold; + hysteresis = data->default_hysteresis; + } else { + threshold = data->mcc_threshold; + hysteresis = data->mcc_hysteresis; + } + + cancel_work_sync(&data->cfcal_work); + isg6320_set_debug_work(data, OFF, 0); + + mutex_lock(&data->lock); + isg6320_i2c_write(data, ISG6320_SCANCTRL1_REG, ISG6320_DFE_ENABLE); + usleep_range(10000, 10010); + isg6320_i2c_write(data, ISG6320_SCANCTRL1_REG, ISG6320_SCAN_STOP); + usleep_range(10000, 10010); + + isg6320_i2c_write(data, ISG6320_A_PROXCTL4_REG, threshold); + isg6320_i2c_write(data, ISG6320_A_PROXCTL8_REG, hysteresis); + + isg6320_i2c_write(data, ISG6320_SCANCTRL1_REG, ISG6320_CFCAL_START); + msleep(450); + + pr_info("[GRIP_%d] %s - change threshold %d,%d\n", data->ic_num, __func__, + threshold * 4, threshold * 4 - hysteresis); + + isg6320_i2c_read(data, ISG6320_CFCAL_RTN_REG, &val, 1); + if (!(val & ISG6320_CAL_RTN_A_MASK)) + pr_err("[GRIP_%d] %s - fail calibration\n", data->ic_num, __func__); + + mutex_unlock(&data->lock); + + isg6320_set_debug_work(data, ON, SHCEDULE_INTERVAL + (data->ic_num << 3)); +} +#endif + +static irqreturn_t isg6320_irq_thread(int irq, void *ptr) +{ + struct isg6320_data *data = (struct isg6320_data *)ptr; + + if (data->initialized == OFF) + return IRQ_HANDLED; + + __pm_wakeup_event(data->grip_ws, jiffies_to_msecs(3 * HZ)); + schedule_work(&data->irq_work); + + return IRQ_HANDLED; +} + +static void isg6320_enter_unknown_mode(struct isg6320_data *data, int type) +{ + if (data->noti_enable) { + data->motion = 0; + data->first_working = false; + if (data->is_unknown_mode == UNKNOWN_OFF) { + data->is_unknown_mode = UNKNOWN_ON; + if (!data->skip_data) { + input_report_rel(data->input_dev, REL_X, data->is_unknown_mode); + input_sync(data->input_dev); + } + pr_info("[GRIP_%d] UNKNOWN Re-enter\n", data->ic_num); + } else { + pr_info("[GRIP_%d] already UNKNOWN\n", data->ic_num); + } +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + data->mul_ch->first_working = false; + if (data->mul_ch->is_unknown_mode == UNKNOWN_OFF) { + data->mul_ch->is_unknown_mode = UNKNOWN_ON; + if (!data->skip_data) { + input_report_rel(data->input_dev, REL_Y, data->mul_ch->is_unknown_mode); + input_sync(data->input_dev); + } + pr_info("[GRIP_%d] [B] UNKNOWN Re-enter\n", data->ic_num); + } else { + pr_info("[GRIP_%d] [B] already UNKNOWN\n", data->ic_num); + } + } +#endif + input_report_rel(data->noti_input_dev, REL_X, type); + input_sync(data->noti_input_dev); + } +} + +static int isg6320_set_normal_mode(struct isg6320_data *data) +{ + int ret = -EINVAL; + u8 state; + + pr_info("[GRIP_%d] %s\n", data->ic_num, __func__); + + ret = isg6320_i2c_read(data, ISG6320_IRQSRC_REG, &state, 1); + if (ret < 0) { + pr_err("[GRIP_%d] %s - i2c read fail(%d)\n", data->ic_num, __func__, ret); + return ret; + } + + schedule_work(&data->cfcal_work); + + return ret; +} + +static void isg6320_initialize(struct isg6320_data *data) +{ + int ret; + u8 val; + u8 buf8[2] = {0, 0}; + + pr_info("[GRIP_%d] %s\n", data->ic_num, __func__); + mutex_lock(&data->lock); + force_far_grip(data); + + ret = isg6320_i2c_read(data, ISG6320_IRQSRC_REG, &val, 1); + if (ret < 0) { + pr_err("[GRIP_%d] %s IRQSRC read fail\n", data->ic_num, __func__); + mutex_unlock(&data->lock); + return; + } + ret = isg6320_i2c_write(data, ISG6320_SCANCTRL1_REG, ISG6320_SCAN_STOP); + if (ret < 0) { + pr_err("[GRIP_%d] %s SCANCTRL write fail\n", data->ic_num, __func__); + mutex_unlock(&data->lock); + return; + } + msleep(30); + + if (data->setup_reg_exist) { + int i = 0; + for (; i < data->reg_size ; i++) { + int index = i * 2; + isg6320_i2c_write(data, data->setup_reg[index], + data->setup_reg[index + 1]); + } + } + + ret = isg6320_i2c_write(data, ISG6320_IRQFUNC_REG, ISG6320_IRQ_DISABLE); + if (ret < 0) { + pr_err("[GRIP_%d] %s IRQFUNC write fail\n", data->ic_num, __func__); + } + + if (data->normal_th > 0) { + val = data->normal_th / 4; + isg6320_i2c_write(data, ISG6320_A_PROXCTL4_REG, val); + } +#if !defined(CONFIG_SEC_FACTORY) && defined(CONFIG_SUPPORT_MCC_THRESHOLD_CHANGE) + if (data->ic_num == MAIN_GRIP) { + isg6320_i2c_read(data, ISG6320_A_PROXCTL4_REG, &val, 1); + data->default_threshold = val; + if (data->mcc_threshold == 0) + data->mcc_threshold = data->default_threshold; + + isg6320_i2c_read(data, ISG6320_A_PROXCTL8_REG, &val, 1); + data->default_hysteresis = val; + if (data->mcc_hysteresis == 0) + data->mcc_hysteresis = data->default_hysteresis; + } +#endif + +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + if (data->mul_ch->normal_th_b > 0) { + val = data->mul_ch->normal_th_b / 4; + isg6320_i2c_write(data, ISG6320_B_PROXCTL4_REG, val); + } + } +#endif + + ret = isg6320_i2c_read(data, ISG6320_A_DIGITAL_ACC_REG, &val, 1); + if (ret < 0) + pr_err("[GRIP_%d] DIGITAL ACC read fail\n", data->ic_num); + else + data->cfcal_th = ISG6320_CS_RESET_CONDITION * val / 8; + +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + ret = isg6320_i2c_read(data, ISG6320_B_DIGITAL_ACC_REG, &val, 1); + if (ret < 0) + pr_err("[GRIP_%d] [B] DIGITAL ACC read fail\n", data->ic_num); + else + data->mul_ch->cfcal_th_b = ISG6320_CS_RESET_CONDITION * val / 8; + } +#endif +#ifdef CONFIG_USE_IC_TYPE + { + u16 target; + u8 sample; + u8 isum_val; + + ret = isg6320_i2c_read(data, ISG6320_IC_TYPE_REG, &sample, 1); + if (ret < 0) { + pr_err("[GRIP_%d] IC Type read fail\n", data->ic_num); + } else { + if (sample == ES) { + pr_info("[GRIP_%d] %s - ES Sample\n", data->ic_num, __func__); + target = ISG6320_ES_TARGET; + data->cfcal_th = ISG6320_ES_RESET_CONDITION * val / 8; +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) + data->mul_ch->cfcal_th_b = ISG6320_ES_RESET_CONDITION * val / 8; +#endif + } else { + pr_info("[GRIP_%d] %s - CS Sample\n", data->ic_num, __func__); + target = ISG6320_CS_TARGET; + } + + isg6320_i2c_write(data, ISG6320_A_ACALCTL4_REG, (target >> 8) & 0xFF); + isg6320_i2c_write(data, ISG6320_A_ACALCTL5_REG, target & 0xFF); + isg6320_i2c_write(data, ISG6320_B_ACALCTL4_REG, (target >> 8) & 0xFF); + isg6320_i2c_write(data, ISG6320_B_ACALCTL5_REG, target & 0xFF); + } + + if (sample == ES) { + //integrate count + ret = isg6320_i2c_read(data, ISG6320_A_LSUM_TYPE_REG, &isum_val, 1); + if (ret < 0) { + pr_err("[GRIP_%d] %s A_LSUM read fail\n", data->ic_num, __func__); + } else { + isum_val = isum_val & 0xF0; + val = isum_val >> 4; + + if (val <= 6) + val = val >> 1; + else if (val <= 14) + val = val - 4; + else + val = val - 3; + + isum_val = isum_val | val; + isg6320_i2c_write(data, ISG6320_A_LSUM_TYPE_REG, isum_val); + } +#if defined(CONFIG_TABLET_MODEL_CONCEPT) + ret = isg6320_i2c_read(data, ISG6320_A_LSUM_TYPE_REG, &isum_val, 1); + data->lsum_a = isum_val; + if (ret < 0) { + pr_err("[GRIP_%d] %s A_LSUM read fail\n", data->ic_num, __func__); + mutex_unlock(&data->lock); + return; + } +#endif +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + ret = isg6320_i2c_read(data, ISG6320_B_LSUM_TYPE_REG, &isum_val, 1); + if (ret < 0) { + pr_err("[GRIP_%d] %s B_LSUM read fail\n", data->ic_num, __func__); + } else { + isum_val = isum_val & 0xF0; + val = isum_val >> 4; + + if (val <= 6) + val = val >> 1; + else if (val <= 14) + val = val - 4; + else + val = val - 3; + + isum_val = isum_val | val; + isg6320_i2c_write(data, ISG6320_B_LSUM_TYPE_REG, isum_val); + } + } +#if defined(CONFIG_TABLET_MODEL_CONCEPT) + ret = isg6320_i2c_read(data, ISG6320_B_LSUM_TYPE_REG, &isum_val, 1); + data->lsum_b = isum_val; + if (ret < 0) { + pr_err("[GRIP_%d] %s B_LSUM read fail\n", data->ic_num, __func__); + mutex_unlock(&data->lock); + return; + } +#endif +#endif + } + } +#endif + mutex_unlock(&data->lock); + + data->initialized = ON; + + isg6320_set_normal_mode(data); + + isg6320_i2c_read(data, ISG6320_A_PROXCTL4_REG, buf8, sizeof(buf8)); + data->normal_th = (u32)buf8[0] * 4; +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + isg6320_i2c_read(data, ISG6320_B_PROXCTL4_REG, buf8, sizeof(buf8)); + data->mul_ch->normal_th_b = (u32)buf8[0] * 4; + } +#endif +} + +static void isg6320_set_debug_work(struct isg6320_data *data, bool enable, + unsigned int delay_ms) +{ + if (enable == ON) { + data->debug_cnt = GRIP_LOG_TIME; + schedule_delayed_work(&data->cal_work, msecs_to_jiffies(delay_ms)); + } else { + cancel_delayed_work_sync(&data->cal_work); + } +} + +static void isg6320_set_enable(struct isg6320_data *data, int enable) +{ + u8 state; + int ret = 0; + int retry = 3; + + pr_info("[GRIP_%d] %s\n", data->ic_num, __func__); + + if (data->enable == enable) { + pr_info("[GRIP_%d] already enabled\n", data->ic_num); + return; + } + + if (enable == ON) { + pr_info("[GRIP_%d] %s enable\n", data->ic_num, __func__); + + data->diff_avg = 0; + data->diff_cnt = 0; + data->cdc_avg = 0; + +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + data->mul_ch->diff_avg_b = 0; + data->mul_ch->diff_cnt_b = 0; + data->mul_ch->cdc_avg_b = 0; + } +#endif + while (retry--) { + ret = isg6320_i2c_read(data, ISG6320_IRQSTS_REG, &state, 1); + if (ret < 0) + pr_err("[GRIP_%d] %s IRQSTS read fail\n", data->ic_num, __func__); + else + break; + } + + isg6320_get_raw_data(data, true); + + if (data->skip_data == true) { + input_report_rel(data->input_dev, REL_MISC, 2); +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + input_report_rel(data->input_dev, REL_DIAL, 2); + } +#endif + input_report_rel(data->input_dev, REL_X, UNKNOWN_OFF); +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + input_report_rel(data->input_dev, REL_Y, UNKNOWN_OFF); + } +#endif + } else { + if (state & (1 << ISG6320_PROX_A_STATE)) { + data->state = CLOSE; + input_report_rel(data->input_dev, REL_MISC, 1); + } else { + data->state = FAR; + input_report_rel(data->input_dev, REL_MISC, 2); + } +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + if (state & (1 << ISG6320_PROX_B_STATE)) { + data->mul_ch->state_b = CLOSE; + input_report_rel(data->input_dev, REL_DIAL, 1); + } else { + data->mul_ch->state_b = FAR; + input_report_rel(data->input_dev, REL_DIAL, 2); + } + } +#endif + input_report_rel(data->input_dev, REL_X, data->is_unknown_mode); +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + input_report_rel(data->input_dev, REL_Y, data->mul_ch->is_unknown_mode); + } +#endif + } + input_sync(data->input_dev); + + isg6320_i2c_read(data, ISG6320_IRQSRC_REG, &state, 1); +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { +#ifdef CONFIG_USE_SINGLE_IRQ_B + isg6320_i2c_write(data, ISG6320_IRQFUNC_REG, ISG6320_IRQ_ENABLE_B); +#else + isg6320_i2c_write(data, ISG6320_IRQFUNC_REG, ISG6320_IRQ_ENABLE); +#endif + } + else + isg6320_i2c_write(data, ISG6320_IRQFUNC_REG, ISG6320_IRQ_ENABLE_A); +#else + isg6320_i2c_write(data, ISG6320_IRQFUNC_REG, ISG6320_IRQ_ENABLE_A); +#endif + + enable_irq(data->client->irq); + enable_irq_wake(data->client->irq); + } else { + pr_info("[GRIP_%d] %s disable\n", data->ic_num, __func__); + + while (retry--) { + ret = isg6320_i2c_write(data, ISG6320_IRQFUNC_REG, ISG6320_IRQ_DISABLE); + if (ret < 0) + pr_err("[GRIP_%d] %s IRQFUNC write fail\n", data->ic_num, __func__); + else + break; + } + + disable_irq(data->client->irq); + disable_irq_wake(data->client->irq); + } + + data->enable = enable; +} + +static ssize_t isg6320_name_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + pr_info("[GRIP_%d] %s %s\n", data->ic_num, __func__, + device_name[data->ic_num]); + + return sprintf(buf, "%s\n", device_name[data->ic_num]); +} + +static ssize_t isg6320_vendor_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + pr_info("[GRIP_%d] %s%s\n", data->ic_num, __func__, VENDOR_NAME); + + return sprintf(buf, "%s\n", VENDOR_NAME); +} + +static ssize_t isg6320_mode_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "1\n"); +} + +static ssize_t isg6320_manual_acal_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "OK\n"); +} + +static ssize_t isg6320_acal_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "2,0,0\n"); +} + +static ssize_t isg6320_onoff_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + u8 val; + int ret; + struct isg6320_data *data = dev_get_drvdata(dev); + + ret = kstrtou8(buf, 2, &val); + if (ret) { + pr_err("[GRIP_%d] invalid argument\n", data->ic_num); + return ret; + } + + if (val == 0) { + data->skip_data = true; + if (data->enable == ON) { + data->state = FAR; + input_report_rel(data->input_dev, REL_MISC, 2); +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + data->mul_ch->state_b = FAR; + input_report_rel(data->input_dev, REL_DIAL, 2); + } +#endif + input_report_rel(data->input_dev, REL_X, UNKNOWN_OFF); +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + input_report_rel(data->input_dev, REL_Y, UNKNOWN_OFF); + } +#endif + input_sync(data->input_dev); + } + data->motion = 1; + data->is_unknown_mode = UNKNOWN_OFF; + data->first_working = false; +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + data->mul_ch->is_unknown_mode = UNKNOWN_OFF; + data->mul_ch->first_working = false; + } +#endif + } else { + data->skip_data = false; + } + + pr_info("[GRIP_%d] %d\n", data->ic_num, (int)val); + + return count; +} + +static ssize_t isg6320_onoff_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", !data->skip_data); +} + +static ssize_t isg6320_sw_reset_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + int ret = 0; + + pr_info("[GRIP_%d] %s\n", data->ic_num, __func__); + + cancel_delayed_work_sync(&data->cal_work); + + ret = isg6320_force_calibration(data); + isg6320_get_raw_data(data, true); + + schedule_delayed_work(&data->cal_work, msecs_to_jiffies(1000)); + + if (ret) + return sprintf(buf, "-1\n"); + + return sprintf(buf, "%d\n", 0); +} + +static ssize_t isg6320_normal_threshold_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int val = 0; + u8 buf8; + struct isg6320_data *data = dev_get_drvdata(dev); + + sscanf(buf, "%d", &val); + + if (val < 0) { + pr_err("[GRIP_%d] invalid argument\n", data->ic_num); + return size; + } + + pr_info("[GRIP_%d] change threshold(%d->%d)\n", data->ic_num, + data->normal_th, val); + + data->normal_th = val; + + buf8 = data->normal_th / 4; + + isg6320_i2c_write(data, ISG6320_A_PROXCTL4_REG, buf8); + + return size; +} + +static ssize_t isg6320_normal_threshold_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u32 threshold = 0; + u32 hyst = 0; + u8 buf8[2]; + struct isg6320_data *data = dev_get_drvdata(dev); + + isg6320_i2c_read(data, ISG6320_A_PROXCTL4_REG, buf8, sizeof(buf8)); + + threshold = (u32)buf8[0] * 4; + hyst = buf8[1]; + + return sprintf(buf, "%d,%d\n", threshold, threshold - hyst); +} + +static ssize_t isg6320_raw_data_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + isg6320_get_raw_data(data, true); + if (data->diff_cnt == 0) { + data->diff_sum = data->diff; + data->cdc_sum = data->cdc; + } else { + data->diff_sum += data->diff; + data->cdc_sum += data->cdc; + } + + if (++data->diff_cnt >= ISG6320_DIFF_AVR_CNT) { + data->diff_avg = data->diff_sum / ISG6320_DIFF_AVR_CNT; + data->cdc_avg = data->cdc_sum / ISG6320_DIFF_AVR_CNT; + data->diff_cnt = 0; + } + + return sprintf(buf, "%d%02d,%d,%d,%d,%d\n", (data->fine_coarse & 0xFF), + ((data->fine_coarse >> 8) & 0x3F), data->cdc, + data->fine_coarse, data->diff, data->base); +} + +static ssize_t isg6320_diff_avg_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + return sprintf(buf, "%d\n", data->diff_avg); +} + +static ssize_t isg6320_cdc_avg_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%d\n", data->cdc_avg); +} + +static ssize_t isg6320_ch_state_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int count; + struct isg6320_data *data = dev_get_drvdata(dev); + + if (data->skip_data == true) + count = snprintf(buf, PAGE_SIZE, "%d,%d\n", NONE_ENABLE, NONE_ENABLE); +#ifdef CONFIG_USE_MULTI_CHANNEL + else if (data->enable == ON && data->multi_use) + count = snprintf(buf, PAGE_SIZE, "%d,%d\n", data->state, + data->mul_ch->state_b); +#else + else if (data->enable == ON) + count = snprintf(buf, PAGE_SIZE, "%d,%d\n", data->state, + NONE_ENABLE); +#endif + else + count = snprintf(buf, PAGE_SIZE, "%d,%d\n", NONE_ENABLE, NONE_ENABLE); + + return count; +} + +static ssize_t isg6320_hysteresis_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u8 buf8; + struct isg6320_data *data = dev_get_drvdata(dev); + + isg6320_i2c_read(data, ISG6320_A_PROXCTL8_REG, &buf8, 1); + + + return sprintf(buf, "%d\n", buf8); +} + +static ssize_t isg6320_sampling_freq_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + u8 buff; + int sampling_freq; + + isg6320_i2c_read(data, ISG6320_NUM_OF_CLK, &buff, 1); + sampling_freq = (int)(8000 / ((int)buff + 1)); + + return snprintf(buf, PAGE_SIZE, "%dkHz\n", sampling_freq); +} + +static ssize_t isg6320_isum_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + const char *table[16] = { + "1", "2", "4", "6", "8", "10", "12", "14", "16", + "20", "24", "28", "32", "40", "48", "64" + }; + u8 buff = 0; + + isg6320_i2c_read(data, ISG6320_A_LSUM_TYPE_REG, &buff, 1); + buff = (buff & 0xf0) >> 4; + + return snprintf(buf, PAGE_SIZE, "%s\n", table[buff]); +} + +static ssize_t isg6320_scan_period_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + u8 buff[2]; + int scan_period; + + isg6320_i2c_read(data, ISG6320_WUTDATA_REG, (u8 *)&buff, sizeof(buff)); + + scan_period = (int)(((u16)buff[1] & 0xff) | (((u16)buff[0] & 0x3f) << 8)); + if (!scan_period) + return snprintf(buf, PAGE_SIZE, "%d\n", scan_period); + + scan_period = (int)(4000 / (scan_period + 1)); + + return snprintf(buf, PAGE_SIZE, "%d\n", scan_period); +} + +static ssize_t isg6320_again_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + u8 buff; + u8 temp1, temp2; + + isg6320_i2c_read(data, ISG6320_A_ANALOG_GAIN, &buff, 1); + temp1 = (buff & 0x38) >> 3; + temp2 = (buff & 0x07); + + return snprintf(buf, PAGE_SIZE, "%d/%d\n", (int)temp2 + 1, (int)temp1 + 1); +} + +static ssize_t isg6320_cdc_up_coef_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + u8 buff; + int coef; + + isg6320_i2c_read(data, ISG6320_A_CDC_UP_COEF_REG, &buff, 1); + coef = (int)buff; + + return snprintf(buf, PAGE_SIZE, "0x%x, %d\n", buff, coef); +} + +static ssize_t isg6320_cdc_down_coef_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + u8 buff; + int coef; + + isg6320_i2c_read(data, ISG6320_A_CDC_DN_COEF_REG, &buff, 1); + coef = (int)buff; + + return snprintf(buf, PAGE_SIZE, "0x%x, %d\n", buff, coef); +} + +static ssize_t isg6320_temp_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + u8 buff; + + isg6320_i2c_read(data, ISG6320_A_TEMPERATURE_ENABLE_REG, &buff, 1); + + return snprintf(buf, PAGE_SIZE, "%d\n", ((buff & 0x80) >> 7)); +} + +static ssize_t isg6320_irq_count_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + int ret = 0; + s16 max_diff_val; + + if (data->irq_count) { + ret = -1; + max_diff_val = data->max_diff; + } else { + max_diff_val = data->max_normal_diff; + } + + pr_info("[GRIP_%d] %s - called\n", data->ic_num, __func__); + + return snprintf(buf, PAGE_SIZE, "%d,%d,%d\n", ret, data->irq_count, + max_diff_val); +} + +static ssize_t isg6320_irq_count_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + int ret; + u8 onoff; + + ret = kstrtou8(buf, 10, &onoff); + if (ret < 0) { + pr_err("[GRIP_%d] invalid arg\n", data->ic_num); + return count; + } + + mutex_lock(&data->lock); + + if (onoff == 0) { + data->abnormal_mode = OFF; + } else if (onoff == 1) { + data->abnormal_mode = ON; + data->schedule_time = SHCEDULE_INTERVAL; + data->irq_count = 0; + data->max_diff = 0; + data->max_normal_diff = 0; + } else { + pr_err("[GRIP_%d] invalid val %d\n", data->ic_num, onoff); + } + + mutex_unlock(&data->lock); + + pr_info("[GRIP_%d] %s - %d\n", data->ic_num, __func__, onoff); + + return count; +} +static ssize_t isg6320_motion_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + if (data->motion) + return snprintf(buf, PAGE_SIZE, "motion_detect\n"); + else + return snprintf(buf, PAGE_SIZE, "motion_non_detect\n"); +} + +static ssize_t isg6320_motion_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int val; + int ret; + struct isg6320_data *data = dev_get_drvdata(dev); + + ret = kstrtoint(buf, 10, &val); + if (ret) { + pr_info("[GRIP_%d] %s - Invalid Argument\n", data->ic_num, __func__); + return ret; + } + + if (val == 0) { + pr_info("[GRIP_%d] %s - motion event off\n", data->ic_num, __func__); + data->motion = val; + } else if (val == 1) { + pr_info("[GRIP_%d] %s - motion event\n", data->ic_num, __func__); + data->motion = val; + } else { + pr_info("[GRIP_%d] %s - Invalid Argument : %u\n", data->ic_num, __func__, val); + } + pr_info("[GRIP_%d] %s - %u\n", data->ic_num, __func__, val); + return count; +} + +static ssize_t isg6320_unknown_state_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s\n", + (data->is_unknown_mode == 1) ? "UNKNOWN" : "NORMAL"); +} + +static ssize_t isg6320_unknown_state_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int val; + int ret; + struct isg6320_data *data = dev_get_drvdata(dev); + + ret = kstrtoint(buf, 10, &val); + if (ret) { + pr_info("[GRIP_%d] %s - Invalid Argument\n", data->ic_num, __func__); + return ret; + } + + if (val == 1) + isg6320_enter_unknown_mode(data, TYPE_FORCE); + else if (val == 0) { + data->is_unknown_mode = UNKNOWN_OFF; +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) + data->mul_ch->is_unknown_mode = UNKNOWN_OFF; +#endif + } + else + pr_info("[GRIP_%d] %s - Invalid Argument(%d)\n", data->ic_num, __func__, val); + + pr_info("[GRIP_%d] %s - %u\n", data->ic_num, __func__, val); + return count; +} +#if 0 +static ssize_t isg6320_cml_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s/%s\n", + (data->motion) ? "MOTION_DETECT" : "MOTION_NON_DETECT", (data->is_unknown_mode == 1) ? "UNKNOWN" : "NORMAL"); +} +#endif +#ifdef CONFIG_USE_MULTI_CHANNEL +static ssize_t isg6320_normal_threshold_b_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int val = 0; + u8 buf8; + struct isg6320_data *data = dev_get_drvdata(dev); + + sscanf(buf, "%d", &val); + + if (val < 0) { + pr_err("[GRIP_%d] [B] invalid arg\n", data->ic_num); + return size; + } + + pr_info("[GRIP_%d] [B] change threshold(%d->%d)\n", + data->ic_num, data->mul_ch->normal_th_b, val); + + data->mul_ch->normal_th_b = val; + + buf8 = data->mul_ch->normal_th_b / 4; + + isg6320_i2c_write(data, ISG6320_B_PROXCTL4_REG, buf8); + + return size; +} + +static ssize_t isg6320_normal_threshold_b_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u32 threshold = 0; + u32 hyst = 0; + u8 buf8[2]; + struct isg6320_data *data = dev_get_drvdata(dev); + + isg6320_i2c_read(data, ISG6320_B_PROXCTL4_REG, buf8, sizeof(buf8)); + + threshold = (u32)buf8[0] * 4; + hyst = buf8[1]; + + return sprintf(buf, "%d,%d\n", threshold, threshold - hyst); +} + +static ssize_t isg6320_raw_data_b_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + isg6320_get_raw_data(data, true); + if (data->mul_ch->diff_cnt_b == 0) { + data->mul_ch->diff_sum_b = data->mul_ch->diff_b; + data->mul_ch->cdc_sum_b = data->mul_ch->cdc_b; + } else { + data->mul_ch->diff_sum_b += data->mul_ch->diff_b; + data->mul_ch->cdc_sum_b += data->mul_ch->cdc_b; + } + + if (++data->mul_ch->diff_cnt_b >= ISG6320_DIFF_AVR_CNT) { + data->mul_ch->diff_avg_b = data->mul_ch->diff_sum_b / ISG6320_DIFF_AVR_CNT; + data->mul_ch->cdc_avg_b = data->mul_ch->cdc_sum_b / ISG6320_DIFF_AVR_CNT; + data->mul_ch->diff_cnt_b = 0; + } + + return sprintf(buf, "%d%02d,%d,%d,%d,%d\n", (data->mul_ch->fine_coarse_b & 0xFF), + ((data->mul_ch->fine_coarse_b >> 8) & 0x3F), data->mul_ch->cdc_b, + data->mul_ch->fine_coarse_b, data->mul_ch->diff_b, data->mul_ch->base_b); +} + +static ssize_t isg6320_debug_data_b_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + return sprintf(buf, "%d,%d,%d\n", data->mul_ch->cdc_b, data->mul_ch->base_b, + data->mul_ch->diff_b); +} + +static ssize_t isg6320_diff_avg_b_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + return sprintf(buf, "%d\n", data->mul_ch->diff_avg_b); +} + +static ssize_t isg6320_cdc_avg_b_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + return snprintf(buf, PAGE_SIZE, "%d\n", data->mul_ch->cdc_avg_b); +} + +static ssize_t isg6320_hysteresis_b_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u8 buf8; + struct isg6320_data *data = dev_get_drvdata(dev); + + isg6320_i2c_read(data, ISG6320_B_PROXCTL8_REG, &buf8, 1); + + return sprintf(buf, "%d\n", buf8); +} + +static ssize_t isg6320_isum_b_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + const char *table[16] = { + "1", "2", "4", "6", "8", "10", "12", "14", "16", + "20", "24", "28", "32", "40", "48", "64" + }; + u8 buff = 0; + + isg6320_i2c_read(data, ISG6320_B_LSUM_TYPE_REG, &buff, 1); + buff = (buff & 0xf0) >> 4; + + return snprintf(buf, PAGE_SIZE, "%s\n", table[buff]); +} + +static ssize_t isg6320_again_b_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + u8 buff; + u8 temp1, temp2; + + isg6320_i2c_read(data, ISG6320_B_ANALOG_GAIN, &buff, 1); + temp1 = (buff & 0x38) >> 3; + temp2 = (buff & 0x07); + + return snprintf(buf, PAGE_SIZE, "%d/%d\n", (int)temp2 + 1, (int)temp1 + 1); +} + +static ssize_t isg6320_cdc_up_coef_b_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + u8 buff; + int coef; + + isg6320_i2c_read(data, ISG6320_B_CDC_UP_COEF_REG, &buff, 1); + coef = (int)buff; + + return snprintf(buf, PAGE_SIZE, "0x%x, %d\n", buff, coef); +} + +static ssize_t isg6320_cdc_down_coef_b_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + u8 buff; + int coef; + + isg6320_i2c_read(data, ISG6320_B_CDC_DN_COEF_REG, &buff, 1); + coef = (int)buff; + + return snprintf(buf, PAGE_SIZE, "0x%x, %d\n", buff, coef); +} + +static ssize_t isg6320_temp_enable_b_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + u8 buff; + + isg6320_i2c_read(data, ISG6320_B_TEMPERATURE_ENABLE_REG, &buff, 1); + + return snprintf(buf, PAGE_SIZE, "%d\n", ((buff & 0x80) >> 7)); +} + +static ssize_t isg6320_irq_count_b_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + int ret = 0; + s16 max_diff_b_val = 0; + + if (data->irq_count) { + ret = -1; + max_diff_b_val = data->mul_ch->max_diff_b; + } else { + max_diff_b_val = data->mul_ch->max_normal_diff_b; + } + + pr_info("[GRIP_%d] %s called\n", data->ic_num, __func__); + + return snprintf(buf, PAGE_SIZE, "%d,%d,%d\n", ret, data->irq_count, + max_diff_b_val); +} + +static ssize_t isg6320_irq_count_b_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + u8 onoff; + int ret; + + ret = kstrtou8(buf, 10, &onoff); + if (ret < 0) { + pr_err("[GRIP_%d] invalid arg\n", data->ic_num); + return count; + } + + mutex_lock(&data->lock); + + if (onoff == 0) { + data->abnormal_mode = OFF; + } else if (onoff == 1) { + data->abnormal_mode = ON; + data->schedule_time = SHCEDULE_INTERVAL; + data->irq_count = 0; + data->mul_ch->max_diff_b = 0; + data->mul_ch->max_normal_diff_b = 0; + } else { + pr_err("[GRIP_%d] invalid val %d\n", data->ic_num, onoff); + } + + mutex_unlock(&data->lock); + + pr_info("[GRIP_%d] %s %d\n", data->ic_num, __func__, onoff); + + return count; +} + +static ssize_t isg6320_sampling_freq_b_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + u8 buff; + int sampling_freq; + + isg6320_i2c_read(data, ISG6320_SCANCTRL13_REG, &buff, 1); + + if (buff & 0x04) + isg6320_i2c_read(data, ISG6320_NUM_OF_CLK_B, &buff, 1); + else + isg6320_i2c_read(data, ISG6320_NUM_OF_CLK, &buff, 1); + + sampling_freq = (int)(8000 / ((int)buff + 1)); + + return snprintf(buf, PAGE_SIZE, "%dkHz\n", sampling_freq); +} + +static ssize_t isg6320_unknown_state_2ch_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s\n", + (data->mul_ch->is_unknown_mode == 1) ? "UNKNOWN" : "NORMAL"); +} + +#endif + +static ssize_t isg6320_enable_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int ret; + u8 enable; + struct isg6320_data *data = dev_get_drvdata(dev); + int pre_enable = data->enable; + + ret = kstrtou8(buf, 2, &enable); + if (ret) { + pr_err("[GRIP_%d] invalid arg\n", data->ic_num); + return size; + } + + pr_info("[GRIP_%d] new_val=%d old_val=%d\n", data->ic_num, (int)enable, + pre_enable); + + if (pre_enable == enable) + return size; + + isg6320_set_enable(data, (int)enable); + + return size; +} + +static ssize_t isg6320_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + return sprintf(buf, "%d\n", data->enable); +} + +#if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) +static ssize_t isg6320_debug_raw_data_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret = 0; + u8 buff[6]; + u8 buff2[6]; + u16 temp; + struct isg6320_data *data = dev_get_drvdata(dev); + + mutex_lock(&data->lock); + ret = isg6320_i2c_read(data, ISG6320_CDC16_A_H_REG, buff, sizeof(buff)); + if (ret < 0) { + pr_info("[GRIP_%d] fail to get A data\n", data->ic_num); + } else { + ret = isg6320_i2c_read(data, ISG6320_CDC16_B_H_REG, buff2, + sizeof(buff2)); + if (ret < 0) { + pr_info("[GRIP_%d] fail to get B data\n", data->ic_num); + } else { + temp = ((u32)buff[0] << 8) | (u32)buff[1]; + if ((temp != 0) && (temp != 0xFFFF)) + data->debug_cdc[0] = temp; + + temp = ((u32)buff[2] << 8) | (u32)buff[3]; + if ((temp != 0) && (temp != 0xFFFF)) + data->debug_cdc[1] = temp; + + temp = ((u32)buff[4] << 8) | (u32)buff[5]; + if ((temp != 0) && (temp != 0xFFFF)) + data->debug_base[0] = temp; + + data->debug_diff[0] = + (s32)data->debug_cdc[0] - (s32)data->debug_base[0]; + + data->debug_diff[1] = + (s32)data->debug_cdc[1] - (s32)data->debug_base[0]; + + temp = ((u32)buff2[0] << 8) | (u32)buff2[1]; + if ((temp != 0) && (temp != 0xFFFF)) + data->debug_cdc[2] = temp; + + temp = ((u32)buff2[2] << 8) | (u32)buff2[3]; + if ((temp != 0) && (temp != 0xFFFF)) + data->debug_cdc[3] = temp; + + temp = ((u32)buff2[4] << 8) | (u32)buff2[5]; + if ((temp != 0) && (temp != 0xFFFF)) + data->debug_base[1] = temp; + + data->debug_diff[2] = + (s32)data->debug_cdc[2] - (s32)data->debug_base[1]; + + data->debug_diff[3] = + (s32)data->debug_cdc[3] - (s32)data->debug_base[1]; + } + } + mutex_unlock(&data->lock); + + return sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", data->debug_cdc[0], + data->debug_diff[0], data->debug_base[0], data->debug_cdc[1], + data->debug_diff[1], data->debug_cdc[2], data->debug_diff[2], + data->debug_base[1], data->debug_cdc[3], data->debug_diff[3]); +} + +static ssize_t isg6320_debug_data_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + return sprintf(buf, "%d,%d,%d\n", data->cdc, data->base, data->diff); +} + +static ssize_t isg6320_reg_update_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int enable_backup; + struct isg6320_data *data = dev_get_drvdata(dev); + + enable_backup = data->enable; + + if (enable_backup) + isg6320_set_enable(data, OFF); + isg6320_reset(data); + isg6320_initialize(data); + if (enable_backup) + isg6320_set_enable(data, ON); + + return sprintf(buf, "OK\n"); +} + +#define DIRECT_CMD_WRITE 'w' +#define DIRECT_CMD_READ 'r' +#define DIRECT_BUF_COUNT 16 +static ssize_t isg6320_direct_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int i, count = 0; + int ret = 0; + int len; + u8 addr; + const int msg_len = 256; + char msg[256]; + struct isg6320_data *data = dev_get_drvdata(dev); + direct_info *direct = (direct_info *)&data->direct; + u8 buf8[DIRECT_BUF_COUNT] = {0,}; + int max_len = DIRECT_BUF_COUNT; + + if (direct->cmd != DIRECT_CMD_READ) + return sprintf(buf, "ex) echo r addr len size(display) > direct\n"); + + len = direct->val; + addr = direct->addr; + + while (len > 0) { + if (len < max_len) max_len = len; + + ret = isg6320_i2c_read(data, addr, buf8, max_len); + if (ret < 0) { + count = sprintf(buf, "i2c read fail\n"); + break; + } + addr += max_len; + + for (i = 0; i < max_len; i++) { + count += snprintf(msg, msg_len, "0x%02X ", buf8[i]); + strncat(buf, msg, msg_len); + } + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + + len -= max_len; + } + + return count; +} + +static ssize_t isg6320_direct_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int ret = -EPERM; + u32 tmp1, tmp2; + struct isg6320_data *data = dev_get_drvdata(dev); + direct_info *direct = (direct_info *)&data->direct; + + sscanf(buf, "%c %x %x", &direct->cmd, &tmp1, &tmp2); + + direct->addr = tmp1; + direct->val = tmp2; + + pr_info("[GRIP_%d] direct cmd: %c, addr: %x, val: %x\n", data->ic_num, + direct->cmd, direct->addr, direct->val); + + if ((direct->cmd != DIRECT_CMD_WRITE) && (direct->cmd != DIRECT_CMD_READ)) { + pr_err("[GRIP_%d] direct cmd is not correct!\n", data->ic_num); + return size; + } + + if (direct->cmd == DIRECT_CMD_WRITE) { + ret = isg6320_i2c_write(data, direct->addr, direct->val); + if (ret < 0) + pr_err("[GRIP_%d] direct write fail\n", data->ic_num); + else + pr_info("[GRIP_%d] direct write addr: %x, val: %x\n", data->ic_num, + direct->addr, direct->val); + } + + return size; +} + +static ssize_t isg6320_intr_debug_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + pr_info("[GRIP_%d] intr debug addr: 0x%x, count: %d\n", + data->ic_num, data->irq_debug_addr, data->irq_debug_size); + + return sprintf(buf, "intr debug addr: 0x%x, count: %d\n", + data->irq_debug_addr, data->irq_debug_size); +} + +static ssize_t isg6320_intr_debug_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + u32 tmp1; + struct isg6320_data *data = dev_get_drvdata(dev); + + if (sscanf(buf, "%x %d", &tmp1, &data->irq_debug_size) != 2) { + pr_err("[GRIP_%d] The number of data are wrong\n", data->ic_num); + + return -EINVAL; + } + + data->irq_debug_addr = tmp1; + + pr_info("[GRIP_%d] intr debug addr: 0x%x, count: %d\n", + data->ic_num, data->irq_debug_addr, data->irq_debug_size); + + return size; +} + +static ssize_t isg6320_cp_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + u16 buff; + struct isg6320_data *data = dev_get_drvdata(dev); + + ret = isg6320_i2c_read(data, ISG6320_A_COARSE_REG, (u8 *)&buff, 2); + if (ret < 0) { + pr_info("[GRIP_%d] fail to get cp\n", data->ic_num); + } else { + data->fine_coarse = buff; + pr_info("[GRIP_%d] coarse: %04X\n", data->ic_num, data->fine_coarse); + } + +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + ret = isg6320_i2c_read(data, ISG6320_B_COARSE_REG, (u8 *)&buff, 2); + if (ret < 0) { + pr_info("[GRIP_%d] [B] fail to get cp\n", data->ic_num); + } else { + data->mul_ch->fine_coarse_b = buff; + pr_info("[GRIP_%d] [B] coarse: %04X\n", data->ic_num, + data->mul_ch->fine_coarse_b); + } + + return sprintf(buf, "%d%02d,%d%02d\n", (data->fine_coarse & 0xFF), + (data->fine_coarse >> 8) & 0x3F, (data->mul_ch->fine_coarse_b & 0xFF), + (data->mul_ch->fine_coarse_b >> 8) & 0x3F); + } +#endif + return sprintf(buf, "%d%02d,0\n", (data->fine_coarse & 0xFF), + (data->fine_coarse >> 8) & 0x3F); +} + +#define SCAN_INT 0x10 +#define FAR_CLOSE_INT 0x08 +static ssize_t isg6320_scan_int_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + struct isg6320_data *data = dev_get_drvdata(dev); + + ret = isg6320_i2c_write(data, ISG6320_IRQCON_REG, SCAN_INT); + if (ret < 0) { + pr_err("[GRIP_%d] fail to set scan done int\n", data->ic_num); + return sprintf(buf, "FAIL\n"); + } else { + pr_info("[GRIP_%d] set scan done int\n", data->ic_num); + return sprintf(buf, "OK\n"); + } +} + +static ssize_t isg6320_far_close_int_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + struct isg6320_data *data = dev_get_drvdata(dev); + + ret = isg6320_i2c_write(data, ISG6320_IRQCON_REG, FAR_CLOSE_INT); + if (ret < 0) { + pr_err("[GRIP_%d] fail to set normal int\n", data->ic_num); + return sprintf(buf, "FAIL\n"); + } else { + pr_info("[GRIP_%d] set normal int\n", data->ic_num); + return sprintf(buf, "OK\n"); + } +} + +static ssize_t isg6320_toggle_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int enable; + struct isg6320_data *data = dev_get_drvdata(dev); + + enable = (data->enable == OFF) ? ON : OFF; + isg6320_set_enable(data, (int)enable); + + return sprintf(buf, "%d\n", data->enable); +} + +static ssize_t isg6320_init_freq_test_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + data->freq_step = 1; + data->freq_value = 0; + + return sprintf(buf, "OK\n"); +} + +static ssize_t isg6320_change_freq_step_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + data->freq_step++; + + if (data->freq_step > ISG6320_MAX_FREQ_STEP) + data->freq_step = 1; + + return sprintf(buf, "%d\n", data->freq_step); +} + +static ssize_t isg6320_change_freq_value_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + data->freq_value += data->freq_step; + + return sprintf(buf, "%d\n", data->freq_value); +} + +static ssize_t isg6320_change_freq_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + pr_info("[GRIP_%d] %s\n", data->ic_num, __func__); + + mutex_lock(&data->lock); + isg6320_i2c_write(data, ISG6320_SCANCTRL1_REG, ISG6320_DFE_ENABLE); + usleep_range(10000, 10010); + isg6320_i2c_write(data, ISG6320_SCANCTRL1_REG, ISG6320_SCAN_STOP); + usleep_range(10000, 10010); + isg6320_i2c_write(data, ISG6320_NUM_OF_CLK, data->freq_value); + isg6320_i2c_write(data, ISG6320_SCANCTRL1_REG, ISG6320_CFCAL_START); + mutex_unlock(&data->lock); + + msleep(400); + + return sprintf(buf, "OK\n"); +} + +#ifdef CONFIG_USE_IC_TYPE +static ssize_t isg6320_ic_type_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + u8 val; + struct isg6320_data *data = dev_get_drvdata(dev); + + ret = isg6320_i2c_read(data, ISG6320_IC_TYPE_REG, &val, 1); + if (ret < 0) + pr_err("[GRIP_%d] fail to read IC Type(%d)\n", data->ic_num, ret); + + return sprintf(buf, "%s\n", (val == ES) ? "ES Sample" : "CS Sample"); +} +#endif +#endif + +#if !defined(CONFIG_SEC_FACTORY) && defined(CONFIG_SUPPORT_MCC_THRESHOLD_CHANGE) +static ssize_t isg6320_mcc_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int ret, mcc; + struct isg6320_data *data = dev_get_drvdata(dev); + + ret = kstrtoint(buf, 10, &mcc); + if (ret) { + pr_err("[GRIP_%d] %s - Invalid Argument(%d)\n", data->ic_num, __func__, ret); + return count; + } + + data->mcc = mcc; + pr_info("[GRIP_%d] %s - mcc value %d\n", data->ic_num, __func__, data->mcc); + + if (data->ic_num == MAIN_GRIP) + schedule_work(&data->mcc_work); + + return count; +} + +static ssize_t isg6320_mcc_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%d\n", data->mcc); +} + +static DEVICE_ATTR(mcc, 0664, isg6320_mcc_show, isg6320_mcc_store); +#endif + +static ssize_t isg6320_noti_enable_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int ret; + u8 enable; + struct isg6320_data *data = dev_get_drvdata(dev); + + ret = kstrtou8(buf, 2, &enable); + if (ret) { + pr_err("[GRIP_%d] %s - invalid argument\n", data->ic_num, __func__); + return size; + } + + pr_info("[GRIP_%d] %s - new_value=%d\n", data->ic_num, __func__, (int)enable); + + data->noti_enable = enable; + + if (data->noti_enable) + isg6320_enter_unknown_mode(data, TYPE_BOOT); + + return size; +} + +static ssize_t isg6320_noti_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + pr_info("[GRIP_%d] %s - noti_enable = %d\n", data->ic_num, __func__, data->noti_enable); + return sprintf(buf, "%d\n", data->noti_enable); +} + +static ssize_t isg6320_country_code_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int ret; + u8 country_code; + struct isg6320_data *data = dev_get_drvdata(dev); + + ret = kstrtou8(buf, 2, &country_code); + if (ret) { + pr_err("[GRIP_%d] %s - invalid argument\n", data->ic_num, __func__); + return size; + } + + pr_info("[GRIP_%d] %s - country_code=%d\n", data->ic_num, __func__, (int)country_code); + + data->country_code = country_code; + + return size; +} + +static ssize_t isg6320_country_code_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + pr_info("[GRIP_%d] %s - country_code = %s\n", data->ic_num, __func__, + data->country_code == 1 ? "KOR" : "ETC(EUR,JPN,CHN)"); + return sprintf(buf, "%d\n", data->country_code); +} + +static DEVICE_ATTR(name, 0444, isg6320_name_show, NULL); +static DEVICE_ATTR(vendor, 0444, isg6320_vendor_show, NULL); +static DEVICE_ATTR(mode, 0444, isg6320_mode_show, NULL); +static DEVICE_ATTR(manual_acal, 0444, isg6320_manual_acal_show, NULL); +static DEVICE_ATTR(calibration, 0444, isg6320_acal_show, NULL); +static DEVICE_ATTR(onoff, 0664, isg6320_onoff_show, isg6320_onoff_store); +static DEVICE_ATTR(reset, 0444, isg6320_sw_reset_show, NULL); +static DEVICE_ATTR(normal_threshold, 0664, + isg6320_normal_threshold_show, isg6320_normal_threshold_store); +static DEVICE_ATTR(raw_data, 0444, isg6320_raw_data_show, NULL); +static DEVICE_ATTR(diff_avg, 0444, isg6320_diff_avg_show, NULL); +static DEVICE_ATTR(cdc_avg, 0444, isg6320_cdc_avg_show, NULL); +static DEVICE_ATTR(useful_avg, 0444, isg6320_cdc_avg_show, NULL); +static DEVICE_ATTR(ch_state, 0444, isg6320_ch_state_show, NULL); +static DEVICE_ATTR(hysteresis, 0444, isg6320_hysteresis_show, NULL); +static DEVICE_ATTR(sampling_freq, 0440, isg6320_sampling_freq_show, NULL); +static DEVICE_ATTR(isum, 0444, isg6320_isum_show, NULL); +static DEVICE_ATTR(scan_period, 0444, isg6320_scan_period_show, NULL); +static DEVICE_ATTR(analog_gain, 0444, isg6320_again_show, NULL); +static DEVICE_ATTR(cdc_up, 0444, isg6320_cdc_up_coef_show, NULL); +static DEVICE_ATTR(cdc_down, 0444, isg6320_cdc_down_coef_show, NULL); +static DEVICE_ATTR(temp_enable, 0444, isg6320_temp_enable_show, NULL); +static DEVICE_ATTR(irq_count, 0664, + isg6320_irq_count_show, isg6320_irq_count_store); +static DEVICE_ATTR(motion, 0664, isg6320_motion_show, isg6320_motion_store); +static DEVICE_ATTR(unknown_state, 0664, + isg6320_unknown_state_show, isg6320_unknown_state_store); +static DEVICE_ATTR(noti_enable, 0664, isg6320_noti_enable_show, isg6320_noti_enable_store); +static DEVICE_ATTR(country_code, 0664, isg6320_country_code_show, isg6320_country_code_store); +//static DEVICE_ATTR(cml, S_IRUGO, isg6320_cml_show, NULL); +#ifdef CONFIG_USE_MULTI_CHANNEL +static DEVICE_ATTR(normal_threshold_b, 0664, + isg6320_normal_threshold_b_show, isg6320_normal_threshold_b_store); +static DEVICE_ATTR(raw_data_b, 0444, isg6320_raw_data_b_show, NULL); +static DEVICE_ATTR(debug_data_b, 0444, isg6320_debug_data_b_show, NULL); +static DEVICE_ATTR(diff_avg_b, 0444, isg6320_diff_avg_b_show, NULL); +static DEVICE_ATTR(cdc_avg_b, 0444, isg6320_cdc_avg_b_show, NULL); +static DEVICE_ATTR(useful_avg_b, 0444, isg6320_cdc_avg_b_show, NULL); +static DEVICE_ATTR(hysteresis_b, 0444, isg6320_hysteresis_b_show, NULL); +static DEVICE_ATTR(isum_b, 0444, isg6320_isum_b_show, NULL); +static DEVICE_ATTR(analog_gain_b, 0444, isg6320_again_b_show, NULL); +static DEVICE_ATTR(cdc_down_b, 0444, isg6320_cdc_down_coef_b_show, NULL); +static DEVICE_ATTR(cdc_up_b, 0444, isg6320_cdc_up_coef_b_show, NULL); +static DEVICE_ATTR(temp_enable_b, 0444, isg6320_temp_enable_b_show, NULL); +static DEVICE_ATTR(irq_count_b, 0664, + isg6320_irq_count_b_show, isg6320_irq_count_b_store); +static DEVICE_ATTR(sampling_freq_b, 0440, isg6320_sampling_freq_b_show, NULL); +static DEVICE_ATTR(unknown_state_2ch, 0664, + isg6320_unknown_state_2ch_show, isg6320_unknown_state_store); +#endif +#if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) +static DEVICE_ATTR(debug_raw_data, 0444, isg6320_debug_raw_data_show, NULL); +static DEVICE_ATTR(debug_data, 0444, isg6320_debug_data_show, NULL); +static DEVICE_ATTR(reg_update, 0444, isg6320_reg_update_show, NULL); +static DEVICE_ATTR(direct, 0664, isg6320_direct_show, isg6320_direct_store); +static DEVICE_ATTR(intr_debug, 0664, + isg6320_intr_debug_show, isg6320_intr_debug_store); +static DEVICE_ATTR(cp, 0444, isg6320_cp_show, NULL); +static DEVICE_ATTR(scan_int, 0444, isg6320_scan_int_show, NULL); +static DEVICE_ATTR(far_close_int, 0444, isg6320_far_close_int_show, NULL); +static DEVICE_ATTR(toggle_enable, 0444, isg6320_toggle_enable_show, NULL); +static DEVICE_ATTR(init_freq_test, 0444, isg6320_init_freq_test_show, NULL); +static DEVICE_ATTR(change_freq_step, 0444, + isg6320_change_freq_step_show, NULL); +static DEVICE_ATTR(change_freq_value, 0444, + isg6320_change_freq_value_show, NULL); +static DEVICE_ATTR(change_freq, 0444, isg6320_change_freq_show, NULL); +#ifdef CONFIG_USE_IC_TYPE +static DEVICE_ATTR(adc_filt, 0440, isg6320_ic_type_show, NULL); +#endif +#endif + +static struct device_attribute *sensor_attrs[] = { + &dev_attr_name, + &dev_attr_vendor, + &dev_attr_mode, + &dev_attr_manual_acal, + &dev_attr_calibration, + &dev_attr_onoff, + &dev_attr_reset, + &dev_attr_normal_threshold, + &dev_attr_raw_data, + &dev_attr_diff_avg, + &dev_attr_useful_avg, + &dev_attr_cdc_avg, + &dev_attr_ch_state, + &dev_attr_hysteresis, + &dev_attr_sampling_freq, + &dev_attr_isum, + &dev_attr_scan_period, + &dev_attr_analog_gain, + &dev_attr_cdc_up, + &dev_attr_cdc_down, + &dev_attr_temp_enable, + &dev_attr_irq_count, + &dev_attr_motion, + &dev_attr_unknown_state, + &dev_attr_noti_enable, + &dev_attr_country_code, + //&dev_attr_cml, +#if !defined(CONFIG_SEC_FACTORY) && defined(CONFIG_SUPPORT_MCC_THRESHOLD_CHANGE) + &dev_attr_mcc, +#endif +#if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) + &dev_attr_debug_raw_data, + &dev_attr_debug_data, + &dev_attr_reg_update, + &dev_attr_direct, + &dev_attr_intr_debug, + &dev_attr_cp, + &dev_attr_scan_int, + &dev_attr_far_close_int, + &dev_attr_toggle_enable, + &dev_attr_init_freq_test, + &dev_attr_change_freq_step, + &dev_attr_change_freq_value, + &dev_attr_change_freq, +#ifdef CONFIG_USE_IC_TYPE + &dev_attr_adc_filt, +#endif +#endif + NULL, +}; + +#ifdef CONFIG_USE_MULTI_CHANNEL +static struct device_attribute *multi_sensor_attrs[] = { + &dev_attr_normal_threshold_b, + &dev_attr_raw_data_b, + &dev_attr_debug_data_b, + &dev_attr_diff_avg_b, + &dev_attr_cdc_avg_b, + &dev_attr_useful_avg_b, + &dev_attr_hysteresis_b, + &dev_attr_isum_b, + &dev_attr_analog_gain_b, + &dev_attr_cdc_down_b, + &dev_attr_cdc_up_b, + &dev_attr_temp_enable_b, + &dev_attr_irq_count_b, + &dev_attr_sampling_freq_b, + &dev_attr_unknown_state_2ch, + NULL, +}; +#endif + +static DEVICE_ATTR(enable, 0664, isg6320_enable_show, isg6320_enable_store); + +static struct attribute *isg6320_attributes[] = { + &dev_attr_enable.attr, + NULL, +}; + +static struct attribute_group isg6320_attribute_group = { + .attrs = isg6320_attributes, +}; + +#ifdef ISG6320_INIT_DELAYEDWORK +static void init_work_func(struct work_struct *work) +{ + struct delayed_work *delayed_work = to_delayed_work(work); + struct isg6320_data *data = container_of(delayed_work, + struct isg6320_data, init_work); + + isg6320_initialize(data); + isg6320_set_debug_work(data, ON, SHCEDULE_INTERVAL); +} +#endif + +static void isg6320_check_first_working(struct isg6320_data *data, int channel_num) +{ + if (data->noti_enable && data->motion) { + if (channel_num == 1) { + if (data->normal_th < data->diff) { + if (!data->first_working) { + data->first_working = true; + pr_info("[GRIP_%d] first working detected %d\n", data->ic_num, data->diff); + } + } else { + if (data->first_working && + (data->is_unknown_mode == UNKNOWN_ON)) { + data->is_unknown_mode = UNKNOWN_OFF; + pr_info("[GRIP_%d] Release detected %d unknown mode off\n", data->ic_num, data->diff); + } + } + } +#ifdef CONFIG_USE_MULTI_CHANNEL + else if (channel_num == 2) { + if (data->multi_use) { + if (data->mul_ch->normal_th_b < data->mul_ch->diff_b) { + if (!data->mul_ch->first_working) { + data->mul_ch->first_working = true; + pr_info("[GRIP_%d] [B] first working detected %d\n", data->ic_num, data->mul_ch->diff_b); + } + } else { + if (data->mul_ch->first_working && + (data->mul_ch->is_unknown_mode == UNKNOWN_ON)) { + data->mul_ch->is_unknown_mode = UNKNOWN_OFF; + pr_info("[GRIP_%d] [B] Release detected %d unknown mode off\n", data->ic_num, data->mul_ch->diff_b); + } + } + } + } +#endif + } +} + +static void cal_work_func(struct work_struct *work) +{ + + struct delayed_work *delayed_work = to_delayed_work(work); + struct isg6320_data *data = container_of(delayed_work, + struct isg6320_data, cal_work); + bool force_cal = false; + int ret = 0; + + ret = check_hallic_state(WACOM_HALLIC_PATH, data->wacom_hall_ic); + if (ret < 0) + pr_err("[GRIP_%d] wacom hallic detect fail = %d\n", data->ic_num, ret); + + if (strcmp(data->wacom_hall_ic, "CLOSE") == 0) { + if (data->wacom_hall_flag) { + pr_info("[GRIP_%d] wacom hall IC is closed\n", data->ic_num); + schedule_work(&data->cfcal_work); + data->wacom_hall_flag = 0; + } + } else { + data->wacom_hall_flag = 1; + } + + if (data->abnormal_mode && data->enable == ON) { + ret = isg6320_get_raw_data(data, true); + if (ret < 0) { + schedule_delayed_work(&data->cal_work, msecs_to_jiffies(SHCEDULE_INTERVAL)); + return; + } + if (data->max_normal_diff < data->diff) + data->max_normal_diff = data->diff; +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + if (data->mul_ch->max_normal_diff_b < data->mul_ch->diff_b) + data->mul_ch->max_normal_diff_b = data->mul_ch->diff_b; + } +#endif + } else { + ret = isg6320_get_raw_data(data, false); + if (data->is_unknown_mode == UNKNOWN_ON && data->motion && !data->first_working) + isg6320_check_first_working(data, 1); +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + if (data->mul_ch->is_unknown_mode == UNKNOWN_ON && data->motion && !data->mul_ch->first_working) + isg6320_check_first_working(data, 2); + } +#endif + if (ret < 0) { + schedule_delayed_work(&data->cal_work, msecs_to_jiffies(SHCEDULE_INTERVAL)); + return; + } + } + + if (data->cdc < data->cfcal_th) { + pr_info("[GRIP_%d] cdc %d cfcal_th %d\n", data->ic_num, data->cdc, + data->cfcal_th); + force_cal = true; + } +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + if (data->mul_ch->cdc_b < data->mul_ch->cfcal_th_b) { + pr_info("[GRIP_%d] [B] cdc %d cfcal_th_b %d\n", data->ic_num, + data->mul_ch->cdc_b, data->mul_ch->cfcal_th_b); + force_cal = true; + } + } +#endif + if (force_cal) { + data->schedule_time = SHCEDULE_INTERVAL; + schedule_work(&data->cfcal_work); + } else if (data->abnormal_mode == OFF) { +#if 0 + if (data->schedule_time < SHCEDULE_INTERVAL_MAX) + data->schedule_time += SHCEDULE_INTERVAL + (data->ic_num << 2); +#else + data->schedule_time = SHCEDULE_INTERVAL; +#endif + } + + schedule_delayed_work(&data->cal_work, + msecs_to_jiffies(data->schedule_time)); +} + +#if (IS_ENABLED(CONFIG_CCIC_NOTIFIER) || IS_ENABLED(CONFIG_PDIC_NOTIFIER)) && IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) +static int isg6320_ccic_handle_notification(struct notifier_block *nb, + unsigned long action, void *data) +{ + PD_NOTI_ATTACH_TYPEDEF usb_typec_info = *(PD_NOTI_ATTACH_TYPEDEF *)data; + struct isg6320_data *pdata = container_of(nb, struct isg6320_data, cpuidle_ccic_nb); + + if (usb_typec_info.id != PDIC_NOTIFY_ID_ATTACH) + return 0; + + if (pdata->pre_attach == usb_typec_info.attach) + return 0; + + pr_info("[GRIP_%d] src %d id %d attach %d rprd %d\n", pdata->ic_num, + usb_typec_info.src, usb_typec_info.id, usb_typec_info.attach, usb_typec_info.rprd); + + //usb host (otg) + if (usb_typec_info.rprd == PDIC_NOTIFY_HOST) { + pdata->otg_attach_state = usb_typec_info.rprd; + pr_info("[GRIP_%d] otg attach, grip reset skip\n", pdata->ic_num); + } else if (pdata->otg_attach_state) { + pdata->otg_attach_state = usb_typec_info.rprd; + pr_info("[GRIP_%d] otg detach, grip reset skip\n", pdata->ic_num); + } else { + if (pdata->initialized == ON) { + schedule_work(&pdata->cfcal_work); + isg6320_enter_unknown_mode(pdata, TYPE_USB); + } + } + + pdata->pre_attach = usb_typec_info.attach; + + return 0; +} +#endif + +#if IS_ENABLED(CONFIG_HALL_NOTIFIER) +static int isg6320_hall_notifier(struct notifier_block *nb, + unsigned long action, void *hall_data) +{ + struct hall_notifier_context *hall_notifier; + struct isg6320_data *data = + container_of(nb, struct isg6320_data, hall_nb); + hall_notifier = hall_data; + + if (action == HALL_ATTACH) { + pr_info("[GRIP_%d] %s attach\n", data->ic_num, hall_notifier->name); + schedule_work(&data->cfcal_work); + } else { + pr_info("[GRIP_%d] %s detach\n", + data->ic_num, hall_notifier->name); + } + isg6320_enter_unknown_mode(data, TYPE_HALL); + return 0; +} +#endif + +#if IS_ENABLED(CONFIG_FLIP_COVER_DETECTOR_NOTIFIER) +static int isg6320_fcd_notifier(struct notifier_block *nb, + unsigned long action, void *fcd_data) +{ + struct isg6320_data *data = container_of(nb, struct isg6320_data, fcd_nb); + + if (action == FCD_ATTACH) { + pr_info("[GRIP_%d] fcd attach\n", data->ic_num); + schedule_work(&data->cfcal_work); + isg6320_enter_unknown_mode(data, TYPE_COVER); + } + + return 0; +} +#endif + +static int isg6320_parse_dt(struct isg6320_data *data, struct device *dev) +{ + struct device_node *node = dev->of_node; + enum of_gpio_flags flags; + int ret = 0; + + data->ldo_en = of_get_named_gpio_flags(node, "isg6320,ldo-en", 0, &flags); + if (data->ldo_en < 0) { + pr_err("[GRIP_%d] get ldo_en err\n", data->ic_num); + return -ENODEV; + } else { + pr_info("[GRIP_%d] get ldo_en %d %d\n", data->ic_num, data->ldo_en, gpio_get_value_cansleep(data->ldo_en)); + } + + if (data->ic_num == MAIN_GRIP) + data->gpio_int = of_get_named_gpio_flags(node, "isg6320,irq-gpio", 0, &flags); +#if defined(CONFIG_SENSORS_ISG6320_SUB) + else if (data->ic_num == SUB_GRIP) + data->gpio_int = of_get_named_gpio_flags(node, "isg6320_sub,irq-gpio", 0, + &flags); +#endif +#if defined(CONFIG_SENSORS_ISG6320_WIFI) + else if (data->ic_num == WIFI_GRIP) + data->gpio_int = of_get_named_gpio_flags(node, "isg6320_wifi,irq-gpio", 0, + &flags); +#endif + if (data->gpio_int < 0) { + pr_err("[GRIP_%d] get gpio_int err\n", data->ic_num); + return -ENODEV; + } + + pr_info("[GRIP_%d] gpio_int:%d\n", data->ic_num, data->gpio_int); + + if (data->ic_num == MAIN_GRIP) + ret = of_property_read_u32(node, "isg6320,reg_num", &data->reg_size); +#if defined(CONFIG_SENSORS_ISG6320_SUB) + else if (data->ic_num == SUB_GRIP) + ret = of_property_read_u32(node, "isg6320_sub,reg_num", &data->reg_size); +#endif +#if defined(CONFIG_SENSORS_ISG6320_WIFI) + else if (data->ic_num == WIFI_GRIP) + ret = of_property_read_u32(node, "isg6320_wifi,reg_num", &data->reg_size); +#endif + + if(ret < 0) + data->reg_size = 68; + + if (data->ic_num == MAIN_GRIP) + ret = of_property_read_u8_array(node, "isg6320,set_reg", data->setup_reg, + data->reg_size * 2); +#if defined(CONFIG_SENSORS_ISG6320_SUB) + else if (data->ic_num == SUB_GRIP) + ret = of_property_read_u8_array(node, "isg6320_sub,set_reg", data->setup_reg, + data->reg_size * 2); +#endif +#if defined(CONFIG_SENSORS_ISG6320_WIFI) + else if (data->ic_num == WIFI_GRIP) + ret = of_property_read_u8_array(node, "isg6320_wifi,set_reg", data->setup_reg, + data->reg_size * 2); +#endif + if (ret < 0) { + pr_err("[GRIP_%d] set_reg fail\n", data->ic_num); + data->setup_reg_exist = false; + } else { + data->setup_reg_exist = true; + } +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->ic_num == MAIN_GRIP) + ret = of_property_read_u32(node, "isg6320,multi_use", &data->multi_use); +#if defined(CONFIG_SENSORS_ISG6320_SUB) + else if (data->ic_num == SUB_GRIP) + ret = of_property_read_u32(node, "isg6320_sub,multi_use", &data->multi_use); +#endif +#if defined(CONFIG_SENSORS_ISG6320_WIFI) + else if (data->ic_num == WIFI_GRIP) + ret = of_property_read_u32(node, "isg6320_wifi,multi_use", &data->multi_use); +#endif + if (ret < 0) { + pr_err("[GRIP_%d] multi_use set err\n", data->ic_num); + data->multi_use = 0; + } +#if !defined(CONFIG_SEC_FACTORY) && defined(CONFIG_SUPPORT_MCC_THRESHOLD_CHANGE) + if (data->ic_num == MAIN_GRIP) { + ret = of_property_read_u8(node, "isg6320,mcc_threshold", &data->mcc_threshold); + if (ret < 0) { + pr_err("[GRIP_%d] mcc_threshold set err\n", data->ic_num); + data->mcc_threshold = 0; + } + pr_info("[GRIP_%d] mcc_threshold = 0x%X\n", data->ic_num, data->mcc_threshold); + + ret = of_property_read_u8(node, "isg6320,mcc_hysteresis", &data->mcc_hysteresis); + if (ret < 0) { + pr_err("[GRIP_%d] mcc_hysteresis set err\n", data->ic_num); + data->mcc_hysteresis = 0; + } + pr_info("[GRIP_%d] mcc_hysteresis = 0x%X\n", data->ic_num, data->mcc_hysteresis); + } +#endif +#endif + + return 0; +} + +static int isg6320_gpio_init(struct isg6320_data *data) +{ + int ret = 0; + + ret = gpio_request(data->gpio_int, "isg6320_irq"); + if (ret < 0) { + pr_err("[GRIP_%d] gpio %d req fail\n", data->ic_num, data->gpio_int); + return ret; + } + + ret = gpio_direction_input(data->gpio_int); + if (ret < 0) { + pr_err("[GRIP_%d] fail to set gpio %d(%d)\n", data->ic_num, data->gpio_int, + ret); + gpio_free(data->gpio_int); + return ret; + } + + if (data->ic_num == MAIN_GRIP) { + ret = gpio_request(data->ldo_en, "isg6320_ldo-en"); + if (ret < 0) { + pr_err("[GRIP_%d] gpio %d request failed\n", data->ic_num, data->ldo_en); + return ret; + } + + ret = gpio_direction_output(data->ldo_en, 1); + if (ret < 0) { + pr_err("[GRIP_%d] failed to set gpio %d(%d)\n", data->ic_num, data->ldo_en, + ret); + gpio_free(data->ldo_en); + return ret; + } else { + pr_info("[GRIP_%d] set gpio %d as output (%d)\n", data->ic_num, data->ldo_en, gpio_get_value_cansleep(data->ldo_en)); + msleep(100); + } + } + + return ret; +} + +#ifdef CONFIG_USE_MULTI_CHANNEL +static int isg6320_sensor_attr_offset(void) +{ + int i; + int offset_max = SENSOR_ATTR_SIZE - + (sizeof(multi_sensor_attrs) / sizeof(ssize_t *)); + + for (i = 0; i < offset_max; i++) { + if (sensor_attrs[i] == NULL) + return i; + } + + return -1; +} +#endif + +static int isg6320_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + int ret = -ENODEV; + struct isg6320_data *data; + struct input_dev *input_dev; + struct input_dev *noti_input_dev; + int ic_num = MAIN_GRIP; +#ifdef CONFIG_USE_MULTI_CHANNEL + struct device_attribute *grip_sensor_attrs[SENSOR_ATTR_SIZE]; +#endif + if (strcmp(client->name, "isg6320") == 0) + ic_num = MAIN_GRIP; +#if defined(CONFIG_SENSORS_ISG6320_SUB) + else if (strcmp(client->name, "isg6320_sub") == 0) + ic_num = SUB_GRIP; +#endif +#if defined(CONFIG_SENSORS_ISG6320_WIFI) + else if (strcmp(client->name, "isg6320_wifi") == 0) + ic_num = WIFI_GRIP; +#endif + else + goto err; + + pr_info("[GRIP_%d] %s # probe #\n", ic_num, device_name[ic_num]); + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + pr_info("[GRIP_%d] i2c_check_functionality err\n", ic_num); + goto err; + } + + data = kzalloc(sizeof(struct isg6320_data), GFP_KERNEL); + if (!data) { + pr_info("[GRIP_%d] fail to alloc mem\n", ic_num); + goto err_kzalloc; + } + + data->ic_num = ic_num; + + ret = isg6320_parse_dt(data, &client->dev); + if (ret) { + pr_err("[GRIP_%d] fail to parse dt\n", data->ic_num); + goto err_parse_dt; + } + + pr_info("[GRIP_%d] multi_channel : %d", data->ic_num, data->multi_use); +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + data->mul_ch = kzalloc(sizeof(struct multi_channel), GFP_KERNEL); + if (!data->mul_ch) { + pr_err("[GRIP_%d] multi_channel alloc failed", data->ic_num); + data->multi_use = 0; + } + } +#endif + + ret = isg6320_gpio_init(data); + if (ret) { + pr_err("[GRIP_%d] fail to init sys\n", data->ic_num); + goto err_gpio_init; + } + + data->client = client; + i2c_set_clientdata(client, data); + + input_dev = input_allocate_device(); + if (!input_dev) { + pr_err("[GRIP_%d] input_allocate_device fail\n", data->ic_num); + goto err_input_alloc; + } + + data->dev = &client->dev; + data->input_dev = input_dev; + + input_dev->name = module_name[data->ic_num]; + input_dev->id.bustype = BUS_I2C; + + input_set_capability(input_dev, EV_REL, REL_MISC); + input_set_capability(input_dev, EV_REL, REL_X); +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + input_set_capability(input_dev, EV_REL, REL_DIAL); + input_set_capability(input_dev, EV_REL, REL_Y); + } +#endif + input_set_drvdata(input_dev, data); + + noti_input_dev = input_allocate_device(); + if (!noti_input_dev) { + pr_err("[GRIP_%d] input_allocate_device failed\n", data->ic_num); + goto err_noti_input_alloc; + } + + data->dev = &client->dev; + data->noti_input_dev = noti_input_dev; + + noti_input_dev->name = NOTI_MODULE_NAME; + noti_input_dev->id.bustype = BUS_I2C; + + input_set_capability(noti_input_dev, EV_REL, REL_X); + input_set_drvdata(noti_input_dev, data); + + ret = isg6320_reset(data); + if (ret < 0) { + pr_err("[GRIP_%d] reset fail\n", data->ic_num); + goto err_soft_reset; + } + + data->skip_data = false; + data->state = FAR; + data->cfcal_th = ISG6320_CS_RESET_CONDITION; + data->schedule_time = SHCEDULE_INTERVAL; + + data->is_unknown_mode = UNKNOWN_OFF; + data->first_working = false; +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + data->mul_ch->is_unknown_mode = UNKNOWN_OFF; + data->mul_ch->first_working = false; + } +#endif + data->motion = 1; + +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) { + data->mul_ch->state_b = FAR; + data->mul_ch->cfcal_th_b = ISG6320_CS_RESET_CONDITION; + } +#endif +#if !IS_ENABLED(CONFIG_SAMSUNG_PRODUCT_SHIP) + data->freq_step = 1; +#endif + + client->irq = gpio_to_irq(data->gpio_int); + ret = request_threaded_irq(client->irq, NULL, isg6320_irq_thread, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, device_name[data->ic_num], data); + + if (ret < 0) { + pr_err("[GRIP_%d] fail to reg client->irq %d err %d\n", client->irq, data->ic_num, ret); + goto err_irq; + } + disable_irq(client->irq); + mutex_init(&data->lock); + + ret = input_register_device(input_dev); + if (ret) { + input_free_device(input_dev); + pr_err("[GRIP_%d] fail to reg input dev %d\n", data->ic_num, ret); + goto err_register_input_dev; + } + + ret = sensors_create_symlink(&input_dev->dev.kobj, + input_dev->name); + if (ret < 0) { + pr_err("[GRIP_%d] fail to create symlink %d\n", data->ic_num, ret); + goto err_create_symlink; + } + + ret = sysfs_create_group(&data->input_dev->dev.kobj, &isg6320_attribute_group); + if (ret < 0) { + pr_err("[GRIP_%d] fail to create sysfs group (%d)\n", data->ic_num, ret); + goto err_sysfs_create_group; + } + +#ifdef CONFIG_USE_MULTI_CHANNEL + memcpy(grip_sensor_attrs, sensor_attrs, sizeof(sensor_attrs)); + if (data->multi_use) { + int offset = isg6320_sensor_attr_offset(); + + if (offset < 0) { + data->multi_use = 0; + pr_err("[GRIP_%d] fail mem size of attr is exceeded\n", + data->ic_num); + } else + memcpy(grip_sensor_attrs + offset, multi_sensor_attrs, sizeof(multi_sensor_attrs)); + } + ret = sensors_register(&data->dev, data, grip_sensor_attrs, + (char *)module_name[data->ic_num]); +#else + ret = sensors_register(&data->dev, data, sensor_attrs, + (char *)module_name[data->ic_num]); +#endif + + if (ret) { + pr_err("[GRIP_%d] fail to reg sensor(%d)\n", data->ic_num, ret); + goto err_sensor_register; + } + ret = input_register_device(noti_input_dev); + if (ret) { + input_free_device(noti_input_dev); + pr_err("[GRIP_U] failed to register input dev for noti (%d)\n", ret); + goto err_register_input_dev_noti; + } + + data->grip_ws = wakeup_source_register(&client->dev, "grip_wake_lock"); + INIT_WORK(&data->irq_work, irq_work_func); + INIT_WORK(&data->cfcal_work, cfcal_work_func); + INIT_DELAYED_WORK(&data->cal_work, cal_work_func); +#if !defined(CONFIG_SEC_FACTORY) && defined(CONFIG_SUPPORT_MCC_THRESHOLD_CHANGE) + INIT_WORK(&data->mcc_work, mcc_work_func); +#endif +#ifdef ISG6320_INIT_DELAYEDWORK + INIT_DELAYED_WORK(&data->init_work, init_work_func); + schedule_delayed_work(&data->init_work, msecs_to_jiffies(SHCEDULE_INTERVAL)); +#else + isg6320_initialize(data); + isg6320_set_debug_work(data, ON, SHCEDULE_INTERVAL); +#endif +#if IS_ENABLED(CONFIG_PDIC_NOTIFIER) && IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) + data->pdic_status = OFF; + data->pdic_pre_attach = 0; + manager_notifier_register(&data->cpuidle_ccic_nb, + isg6320_ccic_handle_notification, + MANAGER_NOTIFY_PDIC_SENSORHUB); +#endif + +#if IS_ENABLED(CONFIG_FLIP_COVER_DETECTOR_NOTIFIER) + pr_info("[GRIP_%d] reg fcd notifier\n", data->ic_num); + data->fcd_nb.priority = 1; + data->fcd_nb.notifier_call = isg6320_fcd_notifier; + fcd_notifier_register(&data->fcd_nb); +#endif + +#if IS_ENABLED(CONFIG_HALL_NOTIFIER) + pr_info("[GRIP_%d] reg hall notifier\n", data->ic_num); + data->hall_nb.priority = 1; + data->hall_nb.notifier_call = isg6320_hall_notifier; + hall_notifier_register(&data->hall_nb); +#else + data->hall_flag = 1; + data->wacom_hall_flag = 1; +#endif + + pr_info("[GRIP_%d] # probe done #\n", data->ic_num); + + return 0; + +err_sensor_register: +err_register_input_dev_noti: + sysfs_remove_group(&input_dev->dev.kobj, &isg6320_attribute_group); +err_sysfs_create_group: + sensors_remove_symlink(&data->input_dev->dev.kobj, data->input_dev->name); +err_create_symlink: + input_unregister_device(input_dev); +err_register_input_dev: + mutex_destroy(&data->lock); + free_irq(client->irq, data); +err_irq: +err_soft_reset: +err_noti_input_alloc: +err_input_alloc: + gpio_free(data->gpio_int); +err_gpio_init: +err_parse_dt: +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) + kfree(data->mul_ch); +#endif + kfree(data); +err_kzalloc: +err: + pr_err("[GRIP_%d] # probe fail \n", ic_num); + + return -ENODEV; +} + +static int isg6320_remove(struct i2c_client *client) +{ + struct isg6320_data *data = i2c_get_clientdata(client); + + pr_info("[GRIP_%d] %s\n", data->ic_num, __func__); + + isg6320_set_debug_work(data, OFF, 0); + if (data->enable == ON) + isg6320_set_enable(data, OFF); + + free_irq(client->irq, data); + gpio_free(data->gpio_int); + + wakeup_source_unregister(data->grip_ws); + sensors_unregister(data->dev, sensor_attrs); + sensors_remove_symlink(&data->input_dev->dev.kobj, data->input_dev->name); + sysfs_remove_group(&data->input_dev->dev.kobj, &isg6320_attribute_group); + input_unregister_device(data->input_dev); + mutex_destroy(&data->lock); + +#ifdef CONFIG_USE_MULTI_CHANNEL + if (data->multi_use) + kfree(data->mul_ch); +#endif +#if IS_ENABLED(CONFIG_FLIP_COVER_DETECTOR_NOTIFIER) + fcd_notifier_unregister(&data->fcd_nb); +#endif + kfree(data); + + return 0; +} + +static int isg6320_suspend(struct device *dev) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + data->in_suspend = true; + pr_info("[GRIP_%d] %s\n", data->ic_num, __func__); + isg6320_set_debug_work(data, OFF, 0); + + return 0; +} + +static int isg6320_resume(struct device *dev) +{ + struct isg6320_data *data = dev_get_drvdata(dev); + + pr_info("[GRIP_%d] %s\n", data->ic_num, __func__); + isg6320_set_debug_work(data, ON, SHCEDULE_INTERVAL + (data->ic_num << 4)); + data->in_suspend = false; + + return 0; +} + +static void isg6320_shutdown(struct i2c_client *client) +{ + struct isg6320_data *data = i2c_get_clientdata(client); + + pr_info("[GRIP_%d] %s\n", data->ic_num, __func__); + + isg6320_set_debug_work(data, OFF, 0); + if (data->enable == ON) + isg6320_set_enable(data, OFF); +} + +static const struct dev_pm_ops isg6320_pm_ops = { + .suspend = isg6320_suspend, + .resume = isg6320_resume, +}; + +static const struct of_device_id isg6320_match_table[] = { + { .compatible = "isg6320", }, + { }, +}; + +static struct i2c_device_id isg6320_id_table[] = { + {"ISG6320", 0}, + { }, +}; +MODULE_DEVICE_TABLE(i2c, isg6320_id_table); + + +static struct i2c_driver isg6320_driver = { + .driver = { + .name = isg6320_id_table[0].name, + .owner = THIS_MODULE, + .of_match_table = isg6320_match_table, + .pm = &isg6320_pm_ops, + }, + .id_table = isg6320_id_table, + .probe = isg6320_probe, + .remove = isg6320_remove, + .shutdown = isg6320_shutdown, +}; + +#if defined(CONFIG_SENSORS_ISG6320_SUB) +static const struct of_device_id isg6320_sub_match_table[] = { + { .compatible = "isg6320_sub", }, + { }, +}; + +static struct i2c_device_id isg6320_sub_id_table[] = { + {"ISG6320_SUB", 0}, + { }, +}; +MODULE_DEVICE_TABLE(i2c, isg6320_sub_id_table); + +static struct i2c_driver isg6320_sub_driver = { + .driver = { + .name = isg6320_sub_id_table[0].name, + .owner = THIS_MODULE, + .of_match_table = isg6320_sub_match_table, + .pm = &isg6320_pm_ops, + }, + .id_table = isg6320_sub_id_table, + .probe = isg6320_probe, + .remove = isg6320_remove, + .shutdown = isg6320_shutdown, +}; +#endif + +#if defined(CONFIG_SENSORS_ISG6320_WIFI) +static const struct of_device_id isg6320_wifi_match_table[] = { + { .compatible = "isg6320_wifi", }, + { }, +}; + +static struct i2c_device_id isg6320_wifi_id_table[] = { + {"ISG6320_WIFI", 0}, + { }, +}; +MODULE_DEVICE_TABLE(i2c, isg6320_wifi_id_table); + +static struct i2c_driver isg6320_wifi_driver = { + .driver = { + .name = isg6320_wifi_id_table[0].name, + .owner = THIS_MODULE, + .of_match_table = isg6320_wifi_match_table, + .pm = &isg6320_pm_ops, + }, + .id_table = isg6320_wifi_id_table, + .probe = isg6320_probe, + .remove = isg6320_remove, + .shutdown = isg6320_shutdown, +}; +#endif + +static int __init isg6320_init(void) +{ + int ret = 0; +#if 0 //IS_ENABLED(CONFIG_BATTERY_SAMSUNG) + if (lpcharge) { + pr_err("lpm : Do not load driver\n"); + return 0; + } +#endif + ret = i2c_add_driver(&isg6320_driver); + if (ret != 0) + pr_err("isg6320_driver probe fail\n"); +#if defined(CONFIG_SENSORS_ISG6320_SUB) + ret = i2c_add_driver(&isg6320_sub_driver); + if (ret != 0) + pr_err("isg6320_sub_driver probe fail\n"); +#endif +#if defined(CONFIG_SENSORS_ISG6320_WIFI) + ret = i2c_add_driver(&isg6320_wifi_driver); + if (ret != 0) + pr_err("isg6320_wifi_driver probe fail\n"); +#endif + + return ret; +} + +static void __exit isg6320_exit(void) +{ + i2c_del_driver(&isg6320_driver); +#if defined(CONFIG_SENSORS_ISG6320_SUB) + i2c_del_driver(&isg6320_sub_driver); +#endif +#if defined(CONFIG_SENSORS_ISG6320_WIFI) + i2c_del_driver(&isg6320_wifi_driver); +#endif +} + +module_init(isg6320_init); +module_exit(isg6320_exit); + +MODULE_DESCRIPTION("Imagis Grip Sensor driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/sensors/isg6320_reg.h b/drivers/sensors/isg6320_reg.h new file mode 100755 index 000000000000..04de1881f7ac --- /dev/null +++ b/drivers/sensors/isg6320_reg.h @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2021, Imagis Technology Co. Ltd. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __ISG6320_REG_H__ +#define __ISG6320_REG_H__ + +#define CONFIG_USE_IC_TYPE + +#ifdef CONFIG_USE_IC_TYPE +#define ISG6320_ES_TARGET 20000 +#define ISG6320_CS_TARGET 16384 +enum { + ES = 0, + CS, +}; +#endif +#define ISG6320_MAX_FREQ_STEP 16 + +#if IS_ENABLED(CONFIG_FLIP_COVER_DETECTOR_NOTIFIER) +#include +#define FCD_ATTACH 1 +#define FCD_DETACH 0 +#endif + +enum ic_num { + MAIN_GRIP = 0, + SUB_GRIP, + WIFI_GRIP, + GRIP_MAX_CNT +}; + +const char *device_name[GRIP_MAX_CNT] = { + "ISG6320", + "ISG6320_SUB", + "ISG6320_WIFI" +}; + +const char *module_name[GRIP_MAX_CNT] = { + "grip_sensor", + "grip_sensor_sub", + "grip_sensor_wifi" +}; +#define NOTI_MODULE_NAME "grip_notifier" +enum registers { + ISG6320_IRQSRC_REG = 0x00, + ISG6320_IRQSTS_REG, + ISG6320_IRQMSK_REG = 0x04, + ISG6320_IRQCON_REG, + ISG6320_OSCCON_REG, + ISG6320_IRQFUNC_REG, + ISG6320_WUTDATA_REG = 0x08, + ISG6320_WUTDATD_REG = 0x0A, + ISG6320_BS_ON_WD_REG = 0x0B, + ISG6320_CML_BIAS_REG = 0x0E, + ISG6320_NUM_OF_CLK = 0x17, + ISG6320_SCANCTRL1_REG = 0x29, + ISG6320_SCANCTRL2_REG, + ISG6320_SCANCTRL11_REG = 0x30, + ISG6320_SCANCTRL13_REG, + ISG6320_A_COARSE_OUT_REG, + ISG6320_FINE_OUT_A_REG, + ISG6320_B_COARSE_OUT_REG, + ISG6320_FINE_OUT_B_REG, + ISG6320_CFCAL_RTN_REG, + ISG6320_CDC16_A_H_REG = 0x3D, + ISG6320_CDC16_A_L_REG, + ISG6320_CDC16_TA_H_REG, + ISG6320_CDC16_TA_L_REG, + ISG6320_BSL16_A_H_REG, + ISG6320_BSL16_A_L_REG, + ISG6320_CDC16_B_H_REG = 0x45, + ISG6320_CDC16_B_L_REG, + ISG6320_CDC16_TB_H_REG, + ISG6320_CDC16_TB_L_REG, + ISG6320_BSL16_B_H_REG, + ISG6320_BSL16_B_L_REG, + ISG6320_NUM_OF_CLK_B, + ISG6320_A_TEMPERATURE_ENABLE_REG = 0x61, + ISG6320_A_ANALOG_GAIN, + ISG6320_A_COARSE_REG, + ISG6320_A_FINE_REG, + ISG6320_A_PROXCTL1_REG, + ISG6320_A_PROXCTL2_REG, + ISG6320_A_PROXCTL4_REG, + ISG6320_A_PROXCTL8_REG, + ISG6320_A_ACALCTL4_REG, + ISG6320_A_ACALCTL5_REG, + ISG6320_A_LSUM_TYPE_REG = 0X6D, + ISG6320_A_DIGITAL_ACC_REG = 0x6F, + ISG6320_A_CDC_UP_COEF_REG = 0x71, + ISG6320_A_CDC_DN_COEF_REG, + ISG6320_B_TEMPERATURE_ENABLE_REG = 0x95, + ISG6320_B_ANALOG_GAIN, + ISG6320_B_COARSE_REG, + ISG6320_B_FINE_REG, + ISG6320_B_PROXCTL1_REG, + ISG6320_B_PROXCTL2_REG, + ISG6320_B_PROXCTL4_REG, + ISG6320_B_PROXCTL8_REG, + ISG6320_B_ACALCTL4_REG, + ISG6320_B_ACALCTL5_REG, + ISG6320_B_LSUM_TYPE_REG = 0XA1, + ISG6320_B_DIGITAL_ACC_REG = 0xA3, + ISG6320_B_CDC_UP_COEF_REG = 0xA5, + ISG6320_B_CDC_DN_COEF_REG, + ISG6320_RESETCON_REG = 0xC9, + ISG6320_PROTECT_REG = 0xCD, + ISG6320_IC_TYPE_REG = 0xFB, + ISG6320_SOFTRESET_REG = 0xFD, +}; + +#define ISG6320_PROX_A_STATE 4 +#define ISG6320_PROX_B_STATE 0 + +#define ISG6320_IRQ_ENABLE 0x0C +#define ISG6320_IRQ_ENABLE_A 0x09 +#define ISG6320_IRQ_ENABLE_B 0x0A +#define ISG6320_IRQ_DISABLE 0x0D + +#define ISG6320_DFE_ENABLE 0x80 +#define ISG6320_BFCAL_START 0x03 +#define ISG6320_CFCAL_START 0xD7 +#define ISG6320_CHECK_TIME 50 + +#define ISG6320_SCAN_STOP 0x00 +#define ISG6320_SCAN_READY 0x2A + +#define ISG6320_OSC_SLEEP 0xB0 +#define ISG6320_OSC_NOMAL 0xF0 +#define ISG6320_ES_RESET_CONDITION 17000 +#define ISG6320_CS_RESET_CONDITION 5000 + +#define ISG6320_RST_VALUE 0xDE +#define ISG6320_PRT_VALUE 0xDE + +#define ISG6320_BS_WD_OFF 0x1A +#define ISG6320_BS_WD_ON 0x9A + +#define ISG6320_DFE_RESET_ON 0x10 +#define ISG6320_DFE_RESET_OFF 0x00 + +#define MAX_REGISTRY_CNT 70 + +#define ISG6320_CAL_RTN_A_MASK 0x02 +#define ISG6320_CAL_RTN_B_MASK 0x01 + +#define UNKNOWN_ON 1 +#define UNKNOWN_OFF 2 + +enum { + OFF = 0, + ON, +}; + +enum { + NONE_ENABLE = -1, + FAR = 0, + CLOSE, +}; + +struct isg6320_reg_data { + unsigned char addr; + unsigned char val; +}; + +static const struct isg6320_reg_data setup_reg[MAX_REGISTRY_CNT] = { + { .addr = 0X17, .val = 0X31, }, + { .addr = 0X18, .val = 0X2B, }, + { .addr = 0X19, .val = 0X00, }, + { .addr = 0X1A, .val = 0X19, }, + { .addr = 0X1B, .val = 0X11, }, + { .addr = 0X1C, .val = 0X19, }, + { .addr = 0X1D, .val = 0X2A, }, + { .addr = 0X1E, .val = 0X00, }, + { .addr = 0X1F, .val = 0X05, }, + { .addr = 0X20, .val = 0X11, }, + { .addr = 0X21, .val = 0X11, }, + { .addr = 0X22, .val = 0X1E, }, + { .addr = 0X23, .val = 0X2A, }, + { .addr = 0X24, .val = 0X05, }, + { .addr = 0X25, .val = 0X1E, }, + { .addr = 0X26, .val = 0X2A, }, + { .addr = 0X27, .val = 0X05, }, + { .addr = 0X28, .val = 0X11, }, + { .addr = 0X61, .val = 0X08, }, + { .addr = 0X62, .val = 0XA8, }, + { .addr = 0X91, .val = 0XA8, }, + { .addr = 0X67, .val = 0X58, }, + { .addr = 0X68, .val = 0X34, }, + { .addr = 0X69, .val = 0X5D, }, + { .addr = 0X6A, .val = 0XC0, }, + { .addr = 0X6C, .val = 0X80, }, + { .addr = 0X6D, .val = 0X88, }, + { .addr = 0X6E, .val = 0X44, }, + { .addr = 0X6F, .val = 0X08, }, + { .addr = 0X70, .val = 0X60, }, + { .addr = 0X71, .val = 0X80, }, + { .addr = 0X72, .val = 0X40, }, + { .addr = 0X73, .val = 0X00, }, + { .addr = 0X74, .val = 0XED, }, + { .addr = 0X75, .val = 0X40, }, + { .addr = 0X76, .val = 0XED, }, + { .addr = 0X77, .val = 0X80, }, + { .addr = 0X78, .val = 0XF0, }, + { .addr = 0X79, .val = 0XF0, }, + { .addr = 0X95, .val = 0X08, }, + { .addr = 0X96, .val = 0XA8, }, + { .addr = 0XC5, .val = 0XA8, }, + { .addr = 0X9B, .val = 0X58, }, + { .addr = 0X9C, .val = 0X34, }, + { .addr = 0X9D, .val = 0X5D, }, + { .addr = 0X9E, .val = 0XC0, }, + { .addr = 0XA0, .val = 0X80, }, + { .addr = 0XA1, .val = 0X88, }, + { .addr = 0XA2, .val = 0X44, }, + { .addr = 0XA3, .val = 0X08, }, + { .addr = 0XA4, .val = 0X60, }, + { .addr = 0XA5, .val = 0X80, }, + { .addr = 0XA6, .val = 0X40, }, + { .addr = 0XA7, .val = 0X00, }, + { .addr = 0XA8, .val = 0XED, }, + { .addr = 0XA9, .val = 0X40, }, + { .addr = 0XAA, .val = 0XED, }, + { .addr = 0XAB, .val = 0X80, }, + { .addr = 0XAC, .val = 0XF0, }, + { .addr = 0XAD, .val = 0XF0, }, + { .addr = 0X05, .val = 0XB8, }, + { .addr = 0X06, .val = 0X80, }, + { .addr = 0X07, .val = 0X0C, }, + { .addr = 0X08, .val = 0X01, }, + { .addr = 0X09, .val = 0X80, }, + { .addr = 0X11, .val = 0X06, }, + { .addr = 0X12, .val = 0X08, }, + { .addr = 0X2C, .val = 0X03, }, +}; + +#if 0 //IS_ENABLED(CONFIG_BATTERY_SAMSUNG) +extern unsigned int lpcharge; +#endif + +#if IS_ENABLED(CONFIG_FLIP_COVER_DETECTOR_NOTIFIER) +extern int fcd_notifier_register(struct notifier_block *nb); +extern int fcd_notifier_unregister(struct notifier_block *nb); +#endif + +#endif /* __ISG6320_REG_H__ */ diff --git a/drivers/sensors/sx9360.c b/drivers/sensors/sx9360.c index fbff19fc824c..816077fe49db 100755 --- a/drivers/sensors/sx9360.c +++ b/drivers/sensors/sx9360.c @@ -31,7 +31,7 @@ #include #include #include "sx9360_reg.h" -#ifdef CONFIG_CCIC_NOTIFIER +#if IS_ENABLED(CONFIG_CCIC_NOTIFIER) || IS_ENABLED(CONFIG_PDIC_NOTIFIER) #if defined(CONFIG_USE_PDIC_LEGO) #include #else @@ -49,9 +49,12 @@ #include #endif +//#define DEBUG_FACTORY_APP_ENABLE + #define VENDOR_NAME "SEMTECH" #define MODEL_NAME "SX9360" #define MODULE_NAME "grip_sensor" +#define NOTI_MODULE_NAME "grip_notifier" #define I2C_M_WR 0 /* for i2c Write */ #define I2c_M_RD 1 /* for i2c Read */ @@ -76,6 +79,14 @@ | SX9360_IRQSTAT_RELEASE_FLAG \ | SX9360_IRQSTAT_COMPDONE_FLAG) +#define UNKNOWN_ON 1 +#define UNKNOWN_OFF 2 + +#define TYPE_USB 1 +#define TYPE_HALL 2 +#define TYPE_BOOT 3 +#define TYPE_FORCE 4 + #if defined(CONFIG_FOLDER_HALL) #define HALLIC_PATH "/sys/class/sec/sec_flip/flipStatus" #else @@ -91,6 +102,7 @@ struct sx9360_p { struct i2c_client *client; struct input_dev *input; + struct input_dev *noti_input_dev; struct device *factory_device; struct delayed_work init_work; struct delayed_work irq_work; @@ -98,7 +110,7 @@ struct sx9360_p { struct wake_lock grip_wake_lock; struct mutex mode_mutex; struct mutex read_mutex; -#ifdef CONFIG_CCIC_NOTIFIER +#if IS_ENABLED(CONFIG_CCIC_NOTIFIER) || IS_ENABLED(CONFIG_PDIC_NOTIFIER) struct notifier_block ccic_nb; #endif #ifdef CONFIG_VBUS_NOTIFIER @@ -113,6 +125,7 @@ struct sx9360_p { int init_done; atomic_t enable; + atomic_t noti_enable; #ifdef CONFIG_SUPPORT_CAMERA_FREEFALL int poll_delay; #endif @@ -140,6 +153,10 @@ struct sx9360_p { int debug_zero_count; char hall_ic[6]; + int is_unknown_mode; + int motion; + bool first_working; + u32 hallic_cert_detect; #if !defined(CONFIG_SEC_FACTORY) && defined(CONFIG_SUPPORT_MCC_THRESHOLD_CHANGE) int mcc; @@ -147,7 +164,7 @@ struct sx9360_p { u8 mcc_threshold; #endif }; - +#if !IS_ENABLED(CONFIG_HALL_NOTIFIER) static int sx9360_check_hallic_state(char *file_path, char hall_ic_status[]) { int iRet = 0; @@ -183,7 +200,7 @@ static int sx9360_check_hallic_state(char *file_path, char hall_ic_status[]) return iRet; } - +#endif static int sx9360_get_nirq_state(struct sx9360_p *data) { return gpio_get_value_cansleep(data->gpio_nirq); @@ -317,6 +334,7 @@ static void sx9360_send_event(struct sx9360_p *data, u8 state) else input_report_rel(data->input, REL_MISC, 2); + input_report_rel(data->input, REL_X, data->is_unknown_mode); input_sync(data->input); } @@ -464,6 +482,7 @@ static void sx9360_check_status(struct sx9360_p *data) if (data->skip_data == true) { input_report_rel(data->input, REL_MISC, 2); + input_report_rel(data->input, REL_X, UNKNOWN_OFF); input_sync(data->input); return; } @@ -528,6 +547,26 @@ static void sx9360_set_debug_work(struct sx9360_p *data, u8 enable, } } +static void sx9360_enter_unknown_mode(struct sx9360_p *data, int type) +{ + if (atomic_read(&data->noti_enable) && !data->skip_data) { + data->motion = 0; + data->first_working = false; + if (data->is_unknown_mode == UNKNOWN_OFF) { + data->is_unknown_mode = UNKNOWN_ON; + if (!data->skip_data) { + input_report_rel(data->input, REL_X, data->is_unknown_mode); + input_sync(data->input); + } + pr_info("[SX9360]: %s UNKNOWN Re-enter\n", __func__); + } else { + pr_info("[SX9360]: %s already UNKNOWN\n", __func__); + } + input_report_rel(data->noti_input_dev, REL_X, type); + input_sync(data->noti_input_dev); + } +} + static ssize_t sx9360_get_offset_calibration_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -658,8 +697,17 @@ static ssize_t sx9360_raw_data_show(struct device *dev, data->diff_cnt = 0; } - return snprintf(buf, PAGE_SIZE, "%ld,%ld,%u,%d,%d\n", (long int)data->capMain, +#ifdef DEBUG_FACTORY_APP_ENABLE + return snprintf(buf, PAGE_SIZE, "%ld/%s/%s,%ld,%u,%d,%d\n", + (long int)data->capMain, + data->is_unknown_mode == UNKNOWN_ON ? "unknown_enter" : "unknown_exit", + data->motion == 1 ? "motion_detect" : "motion_non_detect", (long int)data->useful, data->offset, data->diff, data->avg); +#else + return snprintf(buf, PAGE_SIZE, "%ld,%ld,%u,%d,%d\n", + (long int)data->capMain, + (long int)data->useful, data->offset, data->diff, data->avg); +#endif } static ssize_t sx9360_diff_avg_show(struct device *dev, @@ -968,8 +1016,12 @@ static ssize_t sx9360_onoff_store(struct device *dev, if (atomic_read(&data->enable) == ON) { data->state = IDLE; input_report_rel(data->input, REL_MISC, 2); + input_report_rel(data->input, REL_X, UNKNOWN_OFF); input_sync(data->input); - } + } + data->motion = 1; + data->is_unknown_mode = UNKNOWN_OFF; + data->first_working = false; } else { data->skip_data = false; } @@ -978,6 +1030,112 @@ static ssize_t sx9360_onoff_store(struct device *dev, return count; } +static ssize_t sx9360_motion_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sx9360_p *data = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s\n", + data->motion == 1 ? "motion_detect" : "motion_non_detect"); +} + +static ssize_t sx9360_motion_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + u8 val; + int ret; + struct sx9360_p *data = dev_get_drvdata(dev); + + ret = kstrtou8(buf, 2, &val); + if (ret) { + pr_info("[SX9360]: %s Invalid Argument\n", __func__); + return ret; + } + + if (val == 0) { + pr_info("[SX9360]: %s motion event off\n", __func__); + data->motion = val; + } else if (val == 1) { + pr_info("[SX9360]: %s motion event\n", __func__); + data->motion = val; + } else { + pr_info("[SX9360]: %s Invalid Argument : %u\n", __func__, val); + } + + pr_info("[SX9360]: %s %u\n", __func__, val); + return count; +} +static ssize_t sx9360_unknown_state_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sx9360_p *data = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s\n", + (data->is_unknown_mode == UNKNOWN_ON) ? \ + "UNKNOWN" : "NORMAL"); +} + +static ssize_t sx9360_unknown_state_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + u8 val; + int ret; + struct sx9360_p *data = dev_get_drvdata(dev); + + ret = kstrtou8(buf, 2, &val); + if (ret) { + pr_info("[SX9360]: %s Invalid Argument\n", __func__); + return ret; + } + + if (val == 1) + sx9360_enter_unknown_mode(data, TYPE_FORCE); + else if (val == 0) + data->is_unknown_mode = UNKNOWN_OFF; + else + pr_info("[SX9360]: %s Invalid Argument\n", __func__); + + pr_info("[SX9360]: %s %u\n", __func__, val); + + return count; +} + +static ssize_t sx9360_noti_enable_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int ret; + u8 enable; + struct sx9360_p *data = dev_get_drvdata(dev); + + ret = kstrtou8(buf, 2, &enable); + if (ret) { + pr_info("[SX9360]: %s invalid argument\n", __func__); + return size; + } + + pr_info("[SX9360]: %s new_value=%d\n", __func__, (int)enable); + + atomic_set(&data->noti_enable, enable); + + if (atomic_read(&data->noti_enable)) + sx9360_enter_unknown_mode(data, TYPE_BOOT); + else { + data->motion = 1; + data->first_working = false; + data->is_unknown_mode = UNKNOWN_OFF; + } + + return size; +} + +static ssize_t sx9360_noti_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sx9360_p *data = dev_get_drvdata(dev); + + return sprintf(buf, "%d\n", atomic_read(&data->noti_enable)); +} + #if !defined(CONFIG_SEC_FACTORY) && defined(CONFIG_SUPPORT_MCC_THRESHOLD_CHANGE) static ssize_t sx9360_mcc_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) @@ -1061,6 +1219,12 @@ static DEVICE_ATTR(irq_count, S_IRUGO | S_IWUSR | S_IWGRP, static DEVICE_ATTR(resolution, S_IRUGO, sx9360_resolution_show, NULL); static DEVICE_ATTR(adc_filt, S_IRUGO, sx9360_adc_filt_show, NULL); static DEVICE_ATTR(useful_filt, S_IRUGO, sx9360_useful_filt_show, NULL); +static DEVICE_ATTR(motion, S_IRUGO | S_IWUSR | S_IWGRP, + sx9360_motion_show, sx9360_motion_store); +static DEVICE_ATTR(unknown_state, S_IRUGO | S_IWUSR | S_IWGRP, + sx9360_unknown_state_show, sx9360_unknown_state_store); +static DEVICE_ATTR(noti_enable, 0664, + sx9360_noti_enable_show, sx9360_noti_enable_store); static struct device_attribute *sensor_attrs[] = { &dev_attr_menual_calibrate, @@ -1091,6 +1255,9 @@ static struct device_attribute *sensor_attrs[] = { &dev_attr_resolution, &dev_attr_adc_filt, &dev_attr_useful_filt, + &dev_attr_motion, + &dev_attr_unknown_state, + &dev_attr_noti_enable, #if !defined(CONFIG_SEC_FACTORY) && defined(CONFIG_SUPPORT_MCC_THRESHOLD_CHANGE) &dev_attr_mcc, #endif @@ -1254,17 +1421,22 @@ static void sx9360_touch_process(struct sx9360_p *data) } if (data->state == IDLE) { - if (status & CSX_STATUS_REG) + if (status & CSX_STATUS_REG) { + if (data->is_unknown_mode == UNKNOWN_ON && data->motion) + data->first_working = true; sx9360_send_event(data, ACTIVE); - else - pr_info("[SX9360]: %s - 0x%x already released.\n", - __func__, status); + } else { + pr_info("[SX9360]: %s 0x%x already released\n", __func__, status); + } } else { /* User released button */ if (!(status & CSX_STATUS_REG)) { + if (data->is_unknown_mode == UNKNOWN_ON && data->motion) { + pr_info("[SX9360]: %s unknown mode off\n", __func__); + data->is_unknown_mode = UNKNOWN_OFF; + } sx9360_send_event(data, IDLE); } else { - pr_info("[SX9360]: %s - 0x%x still touched\n", - __func__, status); + pr_info("[SX9360]: %s 0x%x still touched\n", __func__, status); } } } @@ -1325,6 +1497,23 @@ static void sx9360_read_register(struct sx9360_p *data) } } +static void sx9360_check_first_working(struct sx9360_p *data) +{ + if (atomic_read(&data->noti_enable) && data->motion) { + if (data->detect_threshold < data->diff) { + if (!data->first_working) { + data->first_working = true; + pr_info("[SX9360]: %s first working detected %d\n", __func__, data->diff); + } + } else { + if(data->first_working && (data->is_unknown_mode == UNKNOWN_ON)) { + data->is_unknown_mode = UNKNOWN_OFF; + pr_info("[SX9360]: %s Release detected %d, unknown mode off\n", __func__, data->diff); + } + } + } +} + static void sx9360_debug_work_func(struct work_struct *work) { struct sx9360_p *data = container_of((struct delayed_work *)work, @@ -1340,6 +1529,7 @@ static void sx9360_debug_work_func(struct work_struct *work) char str[6] = "CLOSE"; #endif +#if !IS_ENABLED(CONFIG_HALL_NOTIFIER) sx9360_check_hallic_state(HALLIC_PATH, data->hall_ic); data->hall_ic[sizeof(str)-1] = '\0'; @@ -1347,11 +1537,16 @@ static void sx9360_debug_work_func(struct work_struct *work) if (strcmp(data->hall_ic, str) == 0) { if (hall_flag) { pr_info("[SX9360]: %s - hall IC is closed\n", __func__); + sx9360_enter_unknown_mode(data, TYPE_HALL); sx9360_set_offset_calibration(data); hall_flag = 0; } } else { - hall_flag = 1; + if (!hall_flag) { + pr_info("[SX9360]: %s hall IC is opened\n", __func__); + sx9360_enter_unknown_mode(data, TYPE_HALL); + hall_flag = 1; + } } if (data->hallic_cert_detect) { @@ -1362,29 +1557,47 @@ static void sx9360_debug_work_func(struct work_struct *work) if (strcmp(data->hall_ic, str) == 0) { if (hall_cert_flag) { pr_info("[SX9360]: %s - cert hall IC is closed\n", __func__); + sx9360_enter_unknown_mode(data, TYPE_HALL); sx9360_set_offset_calibration(data); hall_cert_flag = 0; } } else { - hall_cert_flag = 1; + if (!hall_cert_flag) { + pr_info("[SX9360]: %s certi hall IC is opened\n", __func__); + sx9360_enter_unknown_mode(data, TYPE_HALL); + hall_cert_flag = 1; + } } } - +#endif if (atomic_read(&data->enable) == ON) { if (data->abnormal_mode) { sx9360_get_data(data); if (data->max_normal_diff < data->diff) data->max_normal_diff = data->diff; - } else { +/* } else { if (data->debug_count >= GRIP_LOG_TIME) { sx9360_get_data(data); data->debug_count = 0; } else { data->debug_count++; - } + }*/ } } + if (data->debug_count >= GRIP_LOG_TIME) { + sx9360_get_data(data); + if (data->is_unknown_mode == UNKNOWN_ON && data->motion) + sx9360_check_first_working(data); + data->debug_count = 0; + } else { + if (data->is_unknown_mode == UNKNOWN_ON && data->motion) { + sx9360_get_data(data); + sx9360_check_first_working(data); + } + data->debug_count++; + } + /* Zero Detect Defence code*/ if(data->debug_zero_count >= ZERO_DETECT_TIME) { ret = sx9360_i2c_read(data, SX9360_GNRLCTRL0_REG, &value); @@ -1433,6 +1646,7 @@ static int sx9360_input_init(struct sx9360_p *data) dev->id.bustype = BUS_I2C; input_set_capability(dev, EV_REL, REL_MISC); + input_set_capability(dev, EV_REL, REL_X); input_set_drvdata(dev, data); ret = input_register_device(dev); @@ -1461,6 +1675,36 @@ static int sx9360_input_init(struct sx9360_p *data) return 0; } +static int sx9360_noti_input_init(struct sx9360_p *data) +{ + int ret = 0; + struct input_dev *noti_input_dev; + + /* Create the input device */ + noti_input_dev = input_allocate_device(); + if (!noti_input_dev) { + return -ENOMEM; + } + + noti_input_dev->name = NOTI_MODULE_NAME; + noti_input_dev->id.bustype = BUS_I2C; + + input_set_capability(noti_input_dev, EV_REL, REL_X); + input_set_drvdata(noti_input_dev, data); + + + ret = input_register_device(noti_input_dev); + if (ret < 0) { + input_free_device(noti_input_dev); + return ret; + } + + /* save the input pointer and finish initialization */ + data->noti_input_dev = noti_input_dev; + + return 0; +} + static int sx9360_setup_pin(struct sx9360_p *data) { int ret; @@ -1489,6 +1733,10 @@ static void sx9360_initialize_variable(struct sx9360_p *data) data->skip_data = false; data->state = IDLE; + data->is_unknown_mode = UNKNOWN_OFF; + data->motion = 1; + data->first_working = false; + atomic_set(&data->enable, OFF); } @@ -1561,38 +1809,29 @@ static int sx9360_parse_dt(struct sx9360_p *data, struct device *dev) return 0; } -#if defined(CONFIG_CCIC_NOTIFIER) && defined(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) +#if (IS_ENABLED(CONFIG_CCIC_NOTIFIER) || IS_ENABLED(CONFIG_PDIC_NOTIFIER)) && IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) static int sx9360_ccic_handle_notification(struct notifier_block *nb, unsigned long action, void *data) { - CC_NOTI_USB_STATUS_TYPEDEF usb_status = - *(CC_NOTI_USB_STATUS_TYPEDEF *) data; + PD_NOTI_ATTACH_TYPEDEF usb_typec_info = *(PD_NOTI_ATTACH_TYPEDEF *)data; struct sx9360_p *pdata = container_of(nb, struct sx9360_p, ccic_nb); static int pre_attach; - if ((usb_status.drp != USB_STATUS_NOTIFY_ATTACH_DFP) && (usb_status.drp != USB_STATUS_NOTIFY_DETACH)) + if (usb_typec_info.id != PDIC_NOTIFY_ID_ATTACH) return 0; - if (pre_attach == usb_status.drp) + if (pre_attach == usb_typec_info.attach) return 0; + pr_info("[SX9360]: %s src %d id %d attach %d\n", __func__, + usb_typec_info.src, usb_typec_info.id, usb_typec_info.attach); if (pdata->init_done == ON) { - switch (usb_status.drp) { - case USB_STATUS_NOTIFY_ATTACH_DFP: - case USB_STATUS_NOTIFY_DETACH: - pr_info("[SX9360]: %s accept attach = %d\n", - __func__, usb_status.drp); - sx9360_set_offset_calibration(pdata); - break; - default: - pr_info("[SX9360]: %s skip attach = %d\n", - __func__, usb_status.drp); - break; - } + sx9360_enter_unknown_mode(pdata, TYPE_USB); + sx9360_set_offset_calibration(pdata); } - pre_attach = usb_status.drp; + pre_attach = usb_typec_info.attach; return 0; } @@ -1601,6 +1840,7 @@ static int sx9360_ccic_handle_notification(struct notifier_block *nb, static int sx9360_vbus_handle_notification(struct notifier_block *nb, unsigned long action, void *data) { +#if 0 vbus_status_t vbus_type = *(vbus_status_t *) data; struct sx9360_p *pdata = container_of(nb, struct sx9360_p, vbus_nb); @@ -1615,6 +1855,7 @@ static int sx9360_vbus_handle_notification(struct notifier_block *nb, case STATUS_VBUS_LOW: pr_info("[SX9360]: %s accept attach = %d\n", __func__, vbus_type); + sx9360_enter_unknown_mode(pdata, TYPE_USB); sx9360_set_offset_calibration(pdata); break; default: @@ -1625,7 +1866,7 @@ static int sx9360_vbus_handle_notification(struct notifier_block *nb, } pre_attach = vbus_type; - +#endif return 0; } #endif @@ -1675,6 +1916,9 @@ static int sx9360_probe(struct i2c_client *client, data->factory_device = &client->dev; ret = sx9360_input_init(data); + if (ret < 0) + goto exit_input_init; + ret = sx9360_noti_input_init(data); if (ret < 0) goto exit_input_init; @@ -1737,11 +1981,12 @@ static int sx9360_probe(struct i2c_client *client, schedule_delayed_work(&data->init_work, msecs_to_jiffies(300)); sx9360_set_debug_work(data, ON, 20000); -#if defined(CONFIG_CCIC_NOTIFIER) && defined(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) + +#if IS_ENABLED(CONFIG_PDIC_NOTIFIER) && IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) pr_info("[SX9360]: %s - register ccic notifier\n", __func__); manager_notifier_register(&data->ccic_nb, sx9360_ccic_handle_notification, - MANAGER_NOTIFY_CCIC_USB); + MANAGER_NOTIFY_PDIC_SENSORHUB); #endif #ifdef CONFIG_VBUS_NOTIFIER pr_info("[SX9360]: %s - register vbus notifier\n", __func__); @@ -1766,6 +2011,7 @@ exit_of_node: sysfs_remove_group(&data->input->dev.kobj, &sx9360_attribute_group); sensors_remove_symlink(&data->input->dev.kobj, data->input->name); input_unregister_device(data->input); + input_unregister_device(data->noti_input_dev); exit_input_init: kfree(data); exit_kzalloc: @@ -1794,6 +2040,7 @@ static int sx9360_remove(struct i2c_client *client) sensors_remove_symlink(&data->input->dev.kobj, data->input->name); sysfs_remove_group(&data->input->dev.kobj, &sx9360_attribute_group); input_unregister_device(data->input); + input_unregister_device(data->noti_input_dev); mutex_destroy(&data->mode_mutex); mutex_destroy(&data->read_mutex); diff --git a/drivers/sensors/sx9360_reg.h b/drivers/sensors/sx9360_reg.h index 6b8fe523ea8a..df7e74160e3f 100755 --- a/drivers/sensors/sx9360_reg.h +++ b/drivers/sensors/sx9360_reg.h @@ -188,7 +188,7 @@ static struct smtc_reg_data setup_reg[] = { }, { .reg = SX9360_PROXCTRL3_REG, - .val = 0x0C, + .val = 0x0D, //Average Positive Filter Strength 1-1/512 }, { .reg = SX9360_PROXCTRL4_REG, diff --git a/drivers/soc/qcom/hgsl/hgsl.c b/drivers/soc/qcom/hgsl/hgsl.c index f459774e3911..a8b207d1c98f 100755 --- a/drivers/soc/qcom/hgsl/hgsl.c +++ b/drivers/soc/qcom/hgsl/hgsl.c @@ -688,7 +688,7 @@ static int hgsl_dbq_assign(struct file *filep, unsigned long arg) if (copy_from_user(&dbq_idx, USRPTR(arg), sizeof(dbq_idx))) return -EFAULT; - if (dbq_idx > MAX_DB_QUEUE) + if (dbq_idx >= MAX_DB_QUEUE) return -EINVAL; priv->dbq_idx = dbq_idx; diff --git a/drivers/soc/qcom/icnss.c b/drivers/soc/qcom/icnss.c index 9d570259f109..c4ff13841069 100755 --- a/drivers/soc/qcom/icnss.c +++ b/drivers/soc/qcom/icnss.c @@ -3812,18 +3812,24 @@ static ssize_t show_wificableinfo(struct kobject *kobj, np = of_find_compatible_node(NULL, NULL, "samsung,rome_cable"); if (!np) { - printk(KERN_ERR "[WIFI] %s : can not fine the rome_cable\n",__FUNCTION__); + icnss_pr_err("can't find the rome_cable\n"); return 0; } - wifi_cable1 = of_get_named_gpio(np, "wlan_cable_wifi1", 0); - wifi_cable2 = of_get_named_gpio(np, "wlan_cable_wifi2", 0); - - printk(KERN_INFO "%s : gpio=%d value = %d \n",__FUNCTION__, wifi_cable1, gpio_get_value(wifi_cable1)); - printk(KERN_INFO "%s : gpio=%d value = %d \n",__FUNCTION__, wifi_cable2, gpio_get_value(wifi_cable2)); + wifi_cable1 = of_get_named_gpio(np, "wlan_cable_wifi_1", 0); + if (!gpio_is_valid(wifi_cable1)) + { + icnss_pr_err("can't get wlan_cable_wifi1\n"); + return 0; + } + wifi_cable2 = of_get_named_gpio(np, "wlan_cable_wifi_2", 0); + if (!gpio_is_valid(wifi_cable2)) + { + icnss_pr_err("can't get wlan_cable_wifi2\n"); + return 0; + } - printk(KERN_ERR "%s : gpio=%d value = %d \n",__FUNCTION__, wifi_cable1, gpio_get_value(wifi_cable1)); - printk(KERN_ERR "%s : gpio=%d value = %d \n",__FUNCTION__, wifi_cable2, gpio_get_value(wifi_cable2)); + icnss_pr_info("wlan_cable_wifi1 = %d wlan_cable_wifi2 = %d\n", gpio_get_value(wifi_cable1), gpio_get_value(wifi_cable2)); sprintf(antbuffer, "%c%c\n", (gpio_get_value(wifi_cable1) > 0) ? 'D' : 'E' , (gpio_get_value(wifi_cable2) > 0) ? 'D' : 'E'); diff --git a/drivers/staging/sti/abc/abc_common.c b/drivers/staging/sti/abc/abc_common.c index 5f6265e421ed..ebc8bf8cfb3f 100755 --- a/drivers/staging/sti/abc/abc_common.c +++ b/drivers/staging/sti/abc/abc_common.c @@ -26,7 +26,6 @@ static struct device *sec_abc; static int abc_enabled; static int abc_init; -#define ABC_PRINT(format, ...) pr_info("[sec_abc] " format, ##__VA_ARGS__) #ifdef CONFIG_OF static int parse_gpu_data(struct device *dev, @@ -240,23 +239,28 @@ static ssize_t store_abc_enabled(struct device *dev, struct abc_info *pinfo = dev_get_drvdata(sec_abc); if (!strncmp(buf, "1", 1)) { - ABC_PRINT("ABC driver enabled.\n"); - abc_enabled = ABC_TYPE1_ENABLED; - complete(&pinfo->enable_done); - } else if (!strncmp(buf, "2", 1)) { - ABC_PRINT("Common driver enabled.\n"); - abc_enabled = ABC_TYPE2_ENABLED; + ABC_PRINT("ERROR report mode enabled.\n"); + abc_enabled |= ERROR_REPORT_MODE_BIT; complete(&pinfo->enable_done); } else if (!strncmp(buf, "0", 1)) { - ABC_PRINT("ABC/Common driver disabled.\n"); - if (abc_enabled == ABC_TYPE1_ENABLED) { - sec_abc_reset_gpu_buffer(); - sec_abc_reset_gpu_page_buffer(); - sec_abc_reset_aicl_buffer(); - } + ABC_PRINT("ERROR report mode disabled.\n"); + abc_enabled &= ~(ERROR_REPORT_MODE_BIT); + } else if (!strncmp(buf, "ALL_REPORT=1", 12)) { + ABC_PRINT("ALL report mode enabled.\n"); + abc_enabled |= ALL_REPORT_MODE_BIT; + complete(&pinfo->enable_done); + } else if (!strncmp(buf, "ALL_REPORT=0", 12)) { + ABC_PRINT("ALL report mode disabled.\n"); + abc_enabled &= ~(ALL_REPORT_MODE_BIT); + } else + ABC_PRINT("Invalid input.\n"); - abc_enabled = ABC_DISABLED; + if (abc_enabled == ABC_DISABLED) { + sec_abc_reset_gpu_buffer(); + sec_abc_reset_gpu_page_buffer(); + sec_abc_reset_aicl_buffer(); } + return count; } @@ -264,7 +268,10 @@ static ssize_t show_abc_enabled(struct device *dev, struct device_attribute *attr, char *buf) { - return sprintf(buf, "%d\n", abc_enabled); + if (abc_enabled) + return sprintf(buf, "1\n"); + else + return sprintf(buf, "0\n"); } static DEVICE_ATTR(enabled, 0644, show_abc_enabled, store_abc_enabled); @@ -371,6 +378,25 @@ int sec_abc_get_enabled(void) } EXPORT_SYMBOL(sec_abc_get_enabled); +static void sec_abc_get_uevent_level_str(char *uevent_level_str, char *event_level, char *event_type) +{ + if (abc_enabled & ALL_REPORT_MODE_BIT) { +#if IS_ENABLED(CONFIG_SEC_FACTORY) + if (!strncmp(event_type, "gpu_", 4)) + snprintf(uevent_level_str, ABC_BUFFER_MAX, "WARN=%s", event_type); + else + snprintf(uevent_level_str, ABC_BUFFER_MAX, "INFO=%s", event_type); +#else + if (!strncmp(event_level, "INFO", 4)) + snprintf(uevent_level_str, ABC_BUFFER_MAX, "INFO=%s", event_type); + else + snprintf(uevent_level_str, ABC_BUFFER_MAX, "WARN=%s", event_type); +#endif + } else { + snprintf(uevent_level_str, ABC_BUFFER_MAX, "%s=%s", event_level, event_type); + } +} + static void sec_abc_work_func(struct work_struct *work) { struct abc_info *pinfo = container_of(work, struct abc_info, work); @@ -382,9 +408,11 @@ static void sec_abc_work_func(struct work_struct *work) struct rtc_time tm; unsigned long local_time; - char *c, *p; + char *c, *p, *p2; char *uevent_str[ABC_UEVENT_MAX] = {0,}; - char temp[ABC_BUFFER_MAX], timestamp[ABC_BUFFER_MAX], event_type[ABC_BUFFER_MAX]; + char temp[ABC_BUFFER_MAX], timestamp[ABC_BUFFER_MAX], temp2[ABC_BUFFER_MAX]; + char uevent_level_str[ABC_BUFFER_MAX] = {0,}; + char *event_level, *event_type; int idx = 0; int i = 0; u64 ktime; @@ -396,8 +424,9 @@ static void sec_abc_work_func(struct work_struct *work) /* Caculate current kernel time */ ktime = local_clock(); - ktime_ms = ktime / NSEC_PER_MSEC; - ktime_rem = do_div(ktime, NSEC_PER_SEC); + ktime_rem = do_div(ktime, NSEC_PER_MSEC); + ktime_ms = (unsigned long)ktime; + ktime_rem = do_div(ktime, MSEC_PER_SEC); /* Caculate current local time */ getnstimeofday(&ts); @@ -412,9 +441,29 @@ static void sec_abc_work_func(struct work_struct *work) sprintf(timestamp, "TIMESTAMP=%lu", ktime_ms); uevent_str[idx++] = ×tamp[0]; uevent_str[idx] = NULL; - strlcpy(event_type, uevent_str[1] + 6, sizeof(event_type)); - ABC_PRINT("event type : %s\n", event_type); + strcpy(temp2, uevent_str[1]); + p2 = &temp2[0]; + event_level = strsep(&p2, "="); + event_type = p2; + if (event_level == NULL || event_type == NULL) { + ABC_PRINT("invalid event\n"); + return; + } + + ABC_PRINT("event_level : %s, event type : %s\n", event_level, event_type); + + sec_abc_get_uevent_level_str(uevent_level_str, event_level, event_type); + + if (abc_enabled & ALL_REPORT_MODE_BIT) { + uevent_str[1] = uevent_level_str; + kobject_uevent_env(&sec_abc->kobj, KOBJ_CHANGE, uevent_str); + } + + if (!strncmp(uevent_level_str, "INFO=", 5)) { + ABC_PRINT("event_level is INFO. Don't Send uevent\n"); + return; + } #if defined(DEBUG_ABC) /* print except for TIMESTAMP(uevent_str[idx - 1]) */ @@ -445,14 +494,17 @@ static void sec_abc_work_func(struct work_struct *work) mutex_unlock(&pinfo->log_mutex); - if (abc_enabled == ABC_TYPE1_ENABLED) { + if (abc_enabled != ABC_DISABLED) { + snprintf(uevent_level_str, ABC_BUFFER_MAX, "ERROR=%s", event_type); + uevent_str[1] = uevent_level_str; + pgpu = pinfo->pdata->gpu_items; pgpu_page = pinfo->pdata->gpu_page_items; paicl = pinfo->pdata->aicl_items; /* GPU fault */ if (!strncasecmp(event_type, "gpu_fault", 9)) { - in.cur_time = (unsigned long)ktime / USEC_PER_SEC; + in.cur_time = (unsigned long)ktime; in.cur_cnt = pgpu->fail_cnt++; ABC_PRINT("gpu fail count : %d\n", pgpu->fail_cnt); @@ -478,13 +530,8 @@ static void sec_abc_work_func(struct work_struct *work) ABC_PRINT("cur_time : %lu cur_cnt : %d\n", out.cur_time, out.cur_cnt); } -#ifdef ABC_WARNING_REPORT - /* Send GPU fault warning */ - strcat(uevent_str[1], "_w"); - kobject_uevent_env(&sec_abc->kobj, KOBJ_CHANGE, uevent_str); -#endif } else if (!strncasecmp(event_type, "gpu_page_fault", 14)) { /* gpu page fault */ - in.cur_time = (unsigned long)ktime / USEC_PER_SEC; + in.cur_time = (unsigned long)ktime; in.cur_cnt = pgpu_page->fail_cnt++; ABC_PRINT("gpu_page fail count : %d\n", pgpu_page->fail_cnt); @@ -510,7 +557,7 @@ static void sec_abc_work_func(struct work_struct *work) ABC_PRINT("cur_time : %lu cur_cnt : %d\n", out.cur_time, out.cur_cnt); } } else if (!strncasecmp(event_type, "aicl", 4)) { /* AICL fault */ - in.cur_time = (unsigned long)ktime / USEC_PER_SEC; + in.cur_time = (unsigned long)ktime; in.cur_cnt = paicl->fail_cnt++; ABC_PRINT("aicl fail count : %d\n", paicl->fail_cnt); @@ -535,9 +582,6 @@ static void sec_abc_work_func(struct work_struct *work) kobject_uevent_env(&sec_abc->kobj, KOBJ_CHANGE, uevent_str); ABC_PRINT("Send uevent.\n"); } - } else { /* ABC_TYPE2_ENABLED */ - kobject_uevent_env(&sec_abc->kobj, KOBJ_CHANGE, uevent_str); - ABC_PRINT("Send uevent.\n"); } } diff --git a/drivers/staging/sti/abc/abc_hub.c b/drivers/staging/sti/abc/abc_hub.c index 13c9d256b2ca..ab0befd379bf 100755 --- a/drivers/staging/sti/abc/abc_hub.c +++ b/drivers/staging/sti/abc/abc_hub.c @@ -205,6 +205,35 @@ static ssize_t show_abc_hub_bootc_offset(struct device *dev, return res; } static DEVICE_ATTR(bootc_offset, 0644, show_abc_hub_bootc_offset, store_abc_hub_bootc_offset); + +static ssize_t store_abc_hub_bootc_time(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct abc_hub_info *pinfo = dev_get_drvdata(dev); + + if (kstrtoint(buf, 0, &(pinfo->pdata->bootc_pdata.bootc_time))) { + pr_err("%s: failed to get bootc_time\n", __func__); + pinfo->pdata->bootc_pdata.bootc_time = -1; + return count; + } + + pr_info("%s: bootc_time(%d)\n", __func__, pinfo->pdata->bootc_pdata.bootc_time); + + return count; +} + +static ssize_t show_abc_hub_bootc_time(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct abc_hub_info *pinfo = dev_get_drvdata(dev); + + int res = sprintf(buf, "%d\n", pinfo->pdata->bootc_pdata.bootc_time); + + return res; +} +static DEVICE_ATTR(bootc_time, 0644, show_abc_hub_bootc_time, store_abc_hub_bootc_time); #endif int abc_hub_get_enabled(void) @@ -317,6 +346,13 @@ static int abc_hub_probe(struct platform_device *pdev) ret = -ENODEV; goto err_create_abc_hub_bootc_offset_sysfs; } + + ret = device_create_file(pinfo->dev, &dev_attr_bootc_time); + if (ret) { + pr_err("%s: Failed to create device bootc_time file\n", __func__); + ret = -ENODEV; + goto err_create_abc_hub_bootc_time_sysfs; + } #endif pinfo->pdata = pdata; @@ -347,6 +383,8 @@ static int abc_hub_probe(struct platform_device *pdev) return ret; #ifdef CONFIG_SEC_ABC_HUB_BOOTC +err_create_abc_hub_bootc_time_sysfs: + device_remove_file(pinfo->dev, &dev_attr_bootc_offset); err_create_abc_hub_bootc_offset_sysfs: device_remove_file(pinfo->dev, &dev_attr_enable); #endif diff --git a/drivers/staging/sti/abc/abc_hub_bootc.c b/drivers/staging/sti/abc/abc_hub_bootc.c index 6bc345708f66..efeca2fb0754 100755 --- a/drivers/staging/sti/abc/abc_hub_bootc.c +++ b/drivers/staging/sti/abc/abc_hub_bootc.c @@ -21,65 +21,8 @@ #include #include -#define BOOT_STATE_PATH "proc/boot_stat" -#define BOOT_STATE_LEN 4000 -#define BOOTC_BUF_MAX 21 - -char boot_stat[BOOT_STATE_LEN]; - char bootc_offset_module[BOOTC_OFFSET_DATA_CNT][BOOTC_OFFSET_STR_MAX] = {"fsck"}; -static int abc_hub_bootc_get_boot_time(void) -{ - int ret = 0; - int pos = 0; - int offset; - int boot_time = -1; - char buf[BOOTC_BUF_MAX]; - - mm_segment_t old_fs; - struct file *filep; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - - filep = filp_open(BOOT_STATE_PATH, O_RDONLY, 0); - if (IS_ERR(filep)) { - ret = PTR_ERR(filep); - set_fs(old_fs); - pr_err("%s: boot_stat open fail\n", __func__); - return ret; - } - - ret = filep->f_op->read(filep, boot_stat, - sizeof(boot_stat)-1, &filep->f_pos); - - if (ret < 0) { - pr_err("%s: boot_stat read fail\n", __func__); - filp_close(filep, current->files); - set_fs(old_fs); - return -EIO; - } - - boot_time = -1; - while (1) { - if (sscanf(boot_stat + pos, "%20s %n", buf, &offset) != 1) - break; - pos += offset; - if (!strcmp(buf, "bootcomplete")) { - if (sscanf(boot_stat + pos, "%20s %d %n", buf, &boot_time, &offset) != 2) - break; - } - } - - filp_close(filep, current->files); - set_fs(old_fs); - - pr_info("%s: boot_time (%d)\n", __func__, boot_time); - - return boot_time; -} - static int abc_hub_bootc_get_total_offset(struct sub_bootc_pdata *bootc_pdata) { int total_offset = 0; @@ -95,20 +38,25 @@ static int abc_hub_bootc_get_total_offset(struct sub_bootc_pdata *bootc_pdata) static void abc_hub_bootc_work_func(struct work_struct *work) { struct sub_bootc_pdata *bootc_pdata = container_of(work, struct sub_bootc_pdata, bootc_work.work); - int boot_time; int fixed_time_spec; - boot_time = abc_hub_bootc_get_boot_time(); bootc_pdata->time_spec_offset = abc_hub_bootc_get_total_offset(bootc_pdata); fixed_time_spec = bootc_pdata->time_spec + bootc_pdata->time_spec_offset; - pr_info("%s: boot_time : %d, time_spec : %d(%d + %d))\n", - __func__, boot_time, fixed_time_spec, bootc_pdata->time_spec, bootc_pdata->time_spec_offset); - - if (boot_time > fixed_time_spec) { - pr_info("%s: booting time is spec out\n", __func__); - abc_hub_send_event("MODULE=bootc@ERROR=boot_time_fail"); - } else if (boot_time < 0) { - pr_err("%s: boot_time_parse fail(%d)\n", __func__, boot_time); + + pr_info("%s: bootc_time : %d, time_spec : %d(%d + %d))\n", + __func__, bootc_pdata->bootc_time, fixed_time_spec, + bootc_pdata->time_spec, bootc_pdata->time_spec_offset); + + if (bootc_pdata->bootc_time < 0) { + pr_err("%s: boot_time_parse fail(%d)\n", __func__, bootc_pdata->bootc_time); + } else { +#if IS_ENABLED(CONFIG_SEC_ABC_MOTTO) + motto_send_bootcheck_info(bootc_pdata->bootc_time / MSEC_PER_SEC); +#endif + if (bootc_pdata->bootc_time > fixed_time_spec) { + pr_info("%s: booting time is spec out\n", __func__); + abc_hub_send_event("MODULE=bootc@ERROR=boot_time_fail"); + } } } @@ -166,6 +114,7 @@ int abc_hub_bootc_init(struct device *dev) strcpy(pinfo->pdata->bootc_pdata.offset_data[i].module, bootc_offset_module[i]); pinfo->pdata->bootc_pdata.offset_data[i].offset = 0; } + pinfo->pdata->bootc_pdata.bootc_time = -1; INIT_DELAYED_WORK(&pinfo->pdata->bootc_pdata.bootc_work, abc_hub_bootc_work_func); diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index e98f8974c38d..426020b90668 100755 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -1834,6 +1834,18 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) struct usb_function *f = NULL; u8 endp; + if (w_length > USB_COMP_EP0_BUFSIZ) { + if (ctrl->bRequestType & USB_DIR_IN) { + /* Cast away the const, we are going to overwrite on purpose. */ + __le16 *temp = (__le16 *)&ctrl->wLength; + + *temp = cpu_to_le16(USB_COMP_EP0_BUFSIZ); + w_length = USB_COMP_EP0_BUFSIZ; + } else { + goto done; + } + } + /* partial re-init of the response message; the function or the * gadget might need to intercept e.g. a control-OUT completion * when we delegate to it. @@ -2163,6 +2175,9 @@ unknown: if (w_index != 0x5 || (w_value >> 8)) break; interface = w_value & 0xFF; + if (interface >= MAX_CONFIG_INTERFACES || + !os_desc_cfg->interface[interface]) + break; buf[6] = w_index; count = count_ext_prop(os_desc_cfg, interface); @@ -2404,7 +2419,7 @@ int composite_dev_prepare(struct usb_composite_driver *composite, if (!cdev->req) return -ENOMEM; - cdev->req->buf = kmalloc(USB_COMP_EP0_BUFSIZ, GFP_KERNEL); + cdev->req->buf = kzalloc(USB_COMP_EP0_BUFSIZ, GFP_KERNEL); if (!cdev->req->buf) goto fail; diff --git a/drivers/usb/gadget/function/f_mtp_samsung.c b/drivers/usb/gadget/function/f_mtp_samsung.c index 7140931b7244..fbf27655a71f 100755 --- a/drivers/usb/gadget/function/f_mtp_samsung.c +++ b/drivers/usb/gadget/function/f_mtp_samsung.c @@ -585,23 +585,19 @@ static int mtp_send_signal(int value) info.si_signo = SIG_SETUP; info.si_code = SI_QUEUE; info.si_int = value; - rcu_read_lock(); if (!current->nsproxy) { pr_info("process has gone\n"); - rcu_read_unlock(); return -ENODEV; } - t = pid_task(find_vpid(mtp_pid), PIDTYPE_PID); + t = get_pid_task(find_vpid(mtp_pid), PIDTYPE_PID); if (t == NULL) { pr_info("no such pid\n"); - rcu_read_unlock(); return -ENODEV; } - rcu_read_unlock(); /*send the signal*/ ret = send_sig_info(SIG_SETUP, &info, t); if (ret < 0) { diff --git a/drivers/usb/gadget/function/rndis.c b/drivers/usb/gadget/function/rndis.c index 6811bb64ac18..de3c3737cdeb 100755 --- a/drivers/usb/gadget/function/rndis.c +++ b/drivers/usb/gadget/function/rndis.c @@ -647,14 +647,18 @@ static int rndis_set_response(struct rndis_params *params, rndis_set_cmplt_type *resp; rndis_resp_t *r; + BufLength = le32_to_cpu(buf->InformationBufferLength); + BufOffset = le32_to_cpu(buf->InformationBufferOffset); + if ((BufLength > RNDIS_MAX_TOTAL_SIZE) || + (BufOffset > RNDIS_MAX_TOTAL_SIZE) || + (BufOffset + 8 >= RNDIS_MAX_TOTAL_SIZE)) + return -EINVAL; + r = rndis_add_response(params, sizeof(rndis_set_cmplt_type)); if (!r) return -ENOMEM; resp = (rndis_set_cmplt_type *)r->buf; - BufLength = le32_to_cpu(buf->InformationBufferLength); - BufOffset = le32_to_cpu(buf->InformationBufferOffset); - #ifdef VERBOSE_DEBUG pr_debug("%s: Length: %d\n", __func__, BufLength); pr_debug("%s: Offset: %d\n", __func__, BufOffset); diff --git a/drivers/usb/notify_v34/usb_notify_sysfs.c b/drivers/usb/notify_v34/usb_notify_sysfs.c index 5bd6a8b48743..d5d929601be8 100755 --- a/drivers/usb/notify_v34/usb_notify_sysfs.c +++ b/drivers/usb/notify_v34/usb_notify_sysfs.c @@ -225,6 +225,66 @@ error: return ret; } +static ssize_t usb_data_enabled_show( + struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct usb_notify_dev *udev = (struct usb_notify_dev *) + dev_get_drvdata(dev); + + pr_info("read usb_data_enabled %lu\n", udev->usb_data_enabled); + return sprintf(buf, "%lu\n", udev->usb_data_enabled); +} + +static ssize_t usb_data_enabled_store( + struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + struct usb_notify_dev *udev = (struct usb_notify_dev *) + dev_get_drvdata(dev); + size_t ret = -ENOMEM; + int sret = -EINVAL; + int param = 0; + char *usb_data_enabled; + + if (size > PAGE_SIZE) { + pr_err("%s size(%zu) is too long.\n", __func__, size); + goto error; + } + + usb_data_enabled = kzalloc(size+1, GFP_KERNEL); + if (!usb_data_enabled) + goto error; + + sret = sscanf(buf, "%s", usb_data_enabled); + if (sret != 1) + goto error1; + + if (udev->set_disable) { + if (strcmp(usb_data_enabled, "0") == 0) { + param = NOTIFY_BLOCK_TYPE_ALL; + udev->usb_data_enabled = 0; + } else if (strcmp(usb_data_enabled, "1") == 0) { + param = NOTIFY_BLOCK_TYPE_NONE; + udev->usb_data_enabled = 1; + } else { + pr_err("%s usb_data_enabled(%s) error.\n", + __func__, usb_data_enabled); + goto error1; + } + pr_info("%s usb_data_enabled=%s\n", + __func__, usb_data_enabled); + udev->set_disable(udev, param); + ret = size; + } else { + pr_err("%s set_disable func is NULL\n", __func__); + } +error1: + kfree(usb_data_enabled); +error: + return ret; +} + static ssize_t support_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -746,6 +806,7 @@ err: EXPORT_SYMBOL_GPL(usb_notify_dev_uevent); static DEVICE_ATTR_RW(disable); +static DEVICE_ATTR_RW(usb_data_enabled); static DEVICE_ATTR_RO(support); static DEVICE_ATTR_RO(otg_speed); static DEVICE_ATTR_RO(gadget_speed); @@ -758,6 +819,7 @@ static DEVICE_ATTR_RW(hw_param); static struct attribute *usb_notify_attrs[] = { &dev_attr_disable.attr, + &dev_attr_usb_data_enabled.attr, &dev_attr_support.attr, &dev_attr_otg_speed.attr, &dev_attr_gadget_speed.attr, @@ -804,6 +866,7 @@ int usb_notify_dev_register(struct usb_notify_dev *udev) return PTR_ERR(udev->dev); udev->disable_state = 0; + udev->usb_data_enabled = 1; strncpy(udev->disable_state_cmd, "OFF", sizeof(udev->disable_state_cmd)-1); ret = sysfs_create_group(&udev->dev->kobj, &usb_notify_attr_grp); diff --git a/drivers/usb/notify_v34/usb_notify_sysfs.h b/drivers/usb/notify_v34/usb_notify_sysfs.h index 0f45b6d7642a..78e866239779 100755 --- a/drivers/usb/notify_v34/usb_notify_sysfs.h +++ b/drivers/usb/notify_v34/usb_notify_sysfs.h @@ -50,6 +50,7 @@ struct usb_notify_dev { struct device *dev; struct otg_notify *o_notify; int index; + unsigned long usb_data_enabled; unsigned long disable_state; char disable_state_cmd[MAX_DISABLE_STR_LEN]; int (*set_disable)(struct usb_notify_dev *udev, int param); diff --git a/drivers/usb/phy/phy-msm-qusb-v2.c b/drivers/usb/phy/phy-msm-qusb-v2.c index 3afb9b752fcc..1e3f02f6ca9f 100755 --- a/drivers/usb/phy/phy-msm-qusb-v2.c +++ b/drivers/usb/phy/phy-msm-qusb-v2.c @@ -81,6 +81,11 @@ #ifdef CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE #define BIAS_CTRL_2_OVERRIDE_VAL_HOST 0x15 #endif +#elif defined(CONFIG_SEC_GTA4XLVE_PROJECT) +#define BIAS_CTRL_2_OVERRIDE_VAL 0x16 +#ifdef CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE +#define BIAS_CTRL_2_OVERRIDE_VAL_HOST 0x18 +#endif #else #define BIAS_CTRL_2_OVERRIDE_VAL 0x20 #ifdef CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE diff --git a/drivers/usb/typec/manager/lego/usb_typec_manager_notifier.c b/drivers/usb/typec/manager/lego/usb_typec_manager_notifier.c index 7f4c3fbc81ec..0fb9fca979c2 100755 --- a/drivers/usb/typec/manager/lego/usb_typec_manager_notifier.c +++ b/drivers/usb/typec/manager/lego/usb_typec_manager_notifier.c @@ -1088,7 +1088,7 @@ int manager_notifier_register(struct notifier_block *nb, notifier_fn_t notifier, return -1; } - if (listener == MANAGER_NOTIFY_PDIC_MUIC) { + if (listener == MANAGER_NOTIFY_PDIC_MUIC || listener == MANAGER_NOTIFY_PDIC_SENSORHUB) { SET_MANAGER_NOTIFIER_BLOCK(nb, notifier, listener); ret = blocking_notifier_chain_register(&(typec_manager.manager_muic_notifier), nb); if (ret < 0) @@ -1204,7 +1204,7 @@ int manager_notifier_unregister(struct notifier_block *nb) pr_info("%s: listener=%d unregister\n", __func__, nb->priority); - if (nb->priority == MANAGER_NOTIFY_PDIC_MUIC) { + if (nb->priority == MANAGER_NOTIFY_PDIC_MUIC || nb->priority == MANAGER_NOTIFY_PDIC_SENSORHUB) { ret = blocking_notifier_chain_unregister(&(typec_manager.manager_muic_notifier), nb); if (ret < 0) pr_err("%s: muic blocking_notifier_chain_unregister error(%d)\n", diff --git a/drivers/usb/typec/sm/sm5714/sm5714_policy.c b/drivers/usb/typec/sm/sm5714/sm5714_policy.c index 074fae0d3322..9749d7bcc3fe 100755 --- a/drivers/usb/typec/sm/sm5714/sm5714_policy.c +++ b/drivers/usb/typec/sm/sm5714/sm5714_policy.c @@ -570,10 +570,11 @@ static policy_state sm5714_usbpd_policy_snk_discovery( struct sm5714_policy_data *policy) { struct sm5714_usbpd_data *pd_data = policy_to_usbpd(policy); + struct sm5714_phydrv_data *pdic_data = pd_data->phy_driver_data; /* ST_PE_SNK_DISCOVERY */ sm5714_cc_state_hold_on_off(pd_data, 0); /* CC State Hold Off */ - if (sm5714_check_vbus_state(pd_data)) { + if (sm5714_check_vbus_state(pd_data) || pdic_data->pd_support) { sm5714_set_enable_pd_function(pd_data, PD_ENABLE); return PE_SNK_Wait_for_Capabilities; } @@ -585,6 +586,9 @@ static policy_state sm5714_usbpd_policy_snk_wait_for_capabilities( struct sm5714_policy_data *policy) { struct sm5714_usbpd_data *pd_data = policy_to_usbpd(policy); +#if !defined(CONFIG_SEC_FACTORY) + struct sm5714_phydrv_data *pdic_data = pd_data->phy_driver_data; +#endif dev_info(pd_data->dev, "%s\n", __func__); @@ -596,7 +600,7 @@ static policy_state sm5714_usbpd_policy_snk_wait_for_capabilities( return PE_SNK_Wait_for_Capabilities; #if !defined(CONFIG_SEC_FACTORY) if (pd_data->counter.hard_reset_counter <= USBPD_nHardResetCount) { - if (!sm5714_check_vbus_state(pd_data)) { + if (!sm5714_check_vbus_state(pd_data) && !pdic_data->pd_support) { sm5714_set_enable_pd_function(pd_data, PD_DISABLE); return PE_SNK_Discovery; } @@ -1385,9 +1389,6 @@ static policy_state sm5714_usbpd_policy_prs_src_snk_wait_source_on( complete(&pdic_data->typec_reverse_completion); } #endif - msleep(tSwapSinkReady); - if (!sm5714_check_vbus_state(pd_data)) - return Error_Recovery; return PE_SNK_Startup; } if (policy->abnormal_state) /* Detach */ diff --git a/drivers/usb/typec/sm/sm5714/sm5714_typec.c b/drivers/usb/typec/sm/sm5714/sm5714_typec.c index 3cffb32a0ce2..295348e716c5 100755 --- a/drivers/usb/typec/sm/sm5714/sm5714_typec.c +++ b/drivers/usb/typec/sm/sm5714/sm5714_typec.c @@ -443,6 +443,40 @@ void sm5714_short_state_check(void *_data) #endif } } +#if !defined(CONFIG_SEC_FACTORY) && defined(CONFIG_SM5714_WATER_DETECTION_ENABLE) +static int sm5714_saline_water_check(void *data) +{ + struct sm5714_phydrv_data *pdic_data = data; + struct i2c_client *i2c = pdic_data->i2c; + u8 cc_status = 0, adc_sbu1 = 0, adc_sbu2 = 0; + int ret = 0; + + sm5714_usbpd_read_reg(i2c, SM5714_REG_CC_STATUS, &cc_status); + + if (((cc_status & SM5714_ATTACH_TYPE) == SM5714_ATTACH_SOURCE) || + ((cc_status & SM5714_ATTACH_TYPE) == SM5714_ATTACH_UN_ORI_DEBUG_SOURCE) || + ((cc_status & SM5714_ATTACH_TYPE) == SM5714_ATTACH_ORI_DEBUG_SOURCE)) + goto out; + + pr_info("%s, cc_status : 0x%x\n", __func__, cc_status); + sm5714_corr_sbu_volt_read(pdic_data, &adc_sbu1, &adc_sbu2, + SBU_SOURCING_OFF); + + if ((adc_sbu1 >= 0x4) && (adc_sbu2 >= 0x4)) { + sm5714_usbpd_write_reg(i2c, SM5714_REG_CC_CNTL3, 0x00); + + sm5714_usbpd_write_reg(i2c, 0x93, 0x02); + sm5714_usbpd_write_reg(i2c, 0x93, 0x00); + sm5714_usbpd_write_reg(i2c, 0x93, 0x02); + sm5714_usbpd_write_reg(i2c, 0x93, 0x00); + + sm5714_usbpd_write_reg(i2c, SM5714_REG_CC_CNTL3, 0x80); + ret = 1; + } +out: + return ret; +} +#endif #endif static void sm5714_check_cc_state(struct sm5714_phydrv_data *pdic_data) @@ -3035,6 +3069,11 @@ static irqreturn_t sm5714_pdic_irq_thread(int irq, void *data) } if (sm5714_get_status(pd_data, PLUG_ATTACH)) { +#if !defined(CONFIG_SEC_FACTORY) && defined(CONFIG_SM5714_WATER_DETECTION_ENABLE) + if (!lpcharge && + sm5714_saline_water_check(pdic_data)) + goto out; +#endif pr_info("%s PLUG_ATTACHED +++\n", __func__); rid_status = sm5714_get_status(pd_data, MSG_RID); ret = sm5714_usbpd_notify_attach(pdic_data); @@ -3169,9 +3208,14 @@ static void sm5714_power_off_water_check(struct sm5714_phydrv_data *_data) return; sm5714_corr_sbu_volt_read(_data, &adc_sbu1, &adc_sbu2, SBU_SOURCING_OFF); - if (adc_sbu1 > 0xA && adc_sbu2 > 0xA) { + if (adc_sbu1 > 0x24 && adc_sbu2 > 0x24) { _data->is_water_detect = true; sm5714_process_cc_water_det(_data, WATER_MODE_ON); + /* Enter water state */ + sm5714_usbpd_write_reg(i2c, 0x93, 0x02); + sm5714_usbpd_write_reg(i2c, 0x93, 0x00); + sm5714_usbpd_write_reg(i2c, 0x93, 0x02); + sm5714_usbpd_write_reg(i2c, 0x93, 0x00); pr_info("%s, TA with water.\n", __func__); return; } else if (adc_sbu1 > 0x3E || adc_sbu2 > 0x3E) { @@ -3182,6 +3226,11 @@ static void sm5714_power_off_water_check(struct sm5714_phydrv_data *_data) } _data->is_water_detect = true; sm5714_process_cc_water_det(_data, WATER_MODE_ON); + /* Enter water state */ + sm5714_usbpd_write_reg(i2c, 0x93, 0x02); + sm5714_usbpd_write_reg(i2c, 0x93, 0x00); + sm5714_usbpd_write_reg(i2c, 0x93, 0x02); + sm5714_usbpd_write_reg(i2c, 0x93, 0x00); pr_info("%s, TA with water.\n", __func__); return; } diff --git a/firmware/Makefile b/firmware/Makefile index 0a17011aa0ec..40730653007f 100755 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -33,6 +33,7 @@ fw-external-$(CONFIG_TOUCHSCREEN_SEC_TS_Y771) += tsp_sec/y771_a71.bin tsp_sec/y7 fw-external-$(CONFIG_TOUCHSCREEN_ZINITIX_ZT7650) += tsp_zinitix/zt7650_a52.bin tsp_zinitix/zt7650_a72.bin tsp_zinitix/zt7650_a72_3rd.bin fw-external-$(CONFIG_TOUCHSCREEN_STM_FTS5CU56A) += tsp_stm/fts5cu56a_a52.bin tsp_stm/fts5cu56a_a72.bin tsp_stm/fts5cu56a_m42.bin +fw-external-$(CONFIG_TOUCHSCREEN_HIMAX_IC_HX83102) += tsp_himax/hx83102e_gts6litereresh.bin ifdef CONFIG_SEC_A70Q_PROJECT ifdef CONFIG_SEC_A70Q_USA_PROJECT @@ -65,6 +66,9 @@ endif fw-external-$(CONFIG_TOUCHSCREEN_NOVATEK_NT36672) += tsp_novatek/nt36672_a60.bin tsp_novatek/nt36672_m40.bin \ tsp_novatek/nt36672_a60_tianma.bin +fw-external-$(CONFIG_EPEN_WACOM_WEZ01) += epen/w9021_gts6lite.bin +fw-external-$(CONFIG_EPEN_WACOM_W9019) += epen/w9019_gts6lite.bin + #touch based grip sensor fw-shipped-$(CONFIG_SENSORS_TC3XXK_A60) += coreriver/tc305k_a60_grip.fw diff --git a/firmware/epen/w9019_gts6lite.bin b/firmware/epen/w9019_gts6lite.bin new file mode 100755 index 0000000000000000000000000000000000000000..d492951998c4b9d37bd2cc592a66a2d198a839e2 GIT binary patch literal 131092 zcmeFa2Y6Lg);GS-xxJ(kdb?sBWi+980)!AqNN*H@&;>>b!q_Mwv@}v^qN1XsGmhdo zzBBJMVFddqFAOs(h=eF52_)pE+}_UrxAwXB<_2+I-shS3`=00jW#8OW*ZQrs*Iv7x zb#8>1e39`avcdbmdgn77TcRaNYciT5O);iErU53C=`PcKrlF=-(+JZT(*#qzDZ!Lv zN-?FIvQ7D>`KCptrKXjpHKw&DiKimdc2kL|!c=YAXF6y)WIAkm&Gd%pi0QZf`;zog z@JQwe-Fp7Ty->OzKi()^Q_6Xw?WZS9YPUl=sbUrClq0ojY(K9X=9#Bpiw~*J)IH!i z6~ph;X>ISNYmSO$ZLF5PmpI=oK&eQRB@Hjk=jqrc47u`)&o~j zHyOM~#Uo~Tb2pz9M;`uGw3@TB6a1yAYC-^UhTeeX!*QRR{FqasNA9#Z%AWRrSe?{g&l z*tsK-$IfTyz3=vT``l5jC!OEog2Tuf(Xa*ta}zUmL<=DGQ86}x70guDsbi&xf|+8$ zInSkNc2Zy!(Q#u_g@S*^RR}MhvwUMacK(QX?7|VHcSDcs=L-IGKB{zGg%DR+po@$t zEtp!XI?0O6s)9L!`IACzH7k#+ijLHG%DYWrKl$&4Eq;!KoFXAyK)_@Cr5ig*E>tbM zaNC8dr9v%5p>~#$8mgO=D51FRuS6FbUa`IRR>A~!QNvilQ_S2E`}ZE1tixl9fnzGp z)M-7%G0gKCoKrz|R(^8UQxd}p^{<@$!g2UY;WIAVyB^kyd0JJ>GdzlUa+J*To{=>( z6AM!O^}D}b`s?3MU6D>*l}^>$Pc=xVzLLIZl%y}N<9iO@W_(-ly&y@}F_LwxM0oKd z#OQ*?)7ZuyzT&BjVSZ5%QTVj$tK#}v9dhT{sA1-IDB^i3MizVO@RU=(P!~S)inW8q z?RixNBD4L}Yq6yCr`C~;SBvYdlNzm)8?A#Ht%Dn_rbg=>jn*NJ*7(L;wtQnz%Jz%B zm&a8p;~HZ=XN-SG0ds2qM& z?RiASju>Mq!e8=6l^#-%=N-|;ROtDsctjafq2`AIm39RTJ)}b1TBoWIw${c}h-c{N zOs$@dbhuXFh*Jt#+`vy6xskh=1m>vsT#00hUoL6*D!#EcoQyLtXq@=78&`;S?d$b`V_OaGV9aK!YqPCv?we}i^`(5Xe>rcm?hjA%dBzCI-FTY zFzZNW9nGv0m~|4frZZ~>vt}`C4ztEH>l9|4#;nuX=|#+QdJXfPew1yw`g3;5B%Qj$ zerkwx>Q3p@UDBz$rBnAvr|y+b4V6wkxP^+knW5;o3!ixq+q1T=ZX?}} z+fb88u6phn%e#uqA-L&e&DHABS<`9l@hM%2_AYYH4Ke`hrXjV*eCS_C0Q zd$E7jpvLsfua#fd$5aStRa7yh;o>2Y>SSH#tqg7FtuqCUCly;;KIM&ykYc=Dh?Ecr zG%t#+=4nv(q+o;|DYpwUI}~L4Nky?aUe3vFt6>a5;5m`&IBy_~WJLovVO--GSnGdcpvEzy8vXa;Dm^3BXe;y;`ZKlalLnzBPeGJ%jYCDSRl>-Q76;${L!jef zilGYZJ{IZZ4TiEAK}Vx;-q_M#;Ss1y)Ssz~w0SN^@x$7%llm~T76PCp$_p|&M7eO! z)P>7M6FsxG{*caW44i$BvkD!Q1I9myEsWTX-X7bUA}|gSWJWG;+wC!e?G%&Qj3h55 z$o62T2bJm8mg%F*G;7PWN7ciRYC}|3^;8IEK>OoxR_pPPV0IrR^+$Fp46+%Bf8#t zIJ%RoZ`WHg7ui!q`CB6dis64TfB#a0>;77PrtY>i2>TydI11EVH8@O`JE>aJW#RdwEhLzhS_Q!Uyi5+r8*^T_kRs4JY*m zv)Wo*4}P@SRYMxnXMe41HpfhfsL)3}uac`;ijnG0urS7Sx=(MVl0~O0%QUYiG4_k< zI$MahDg0!Y>))Gsss51GJnDyhhMW1|cLBZz@YRE_QzR5#?CH`Up)z|_Ziz!_fLWFB0l?FCag*-2gdhV8YqDsTH zhqMKAbml))Xg5k*L->j5`IN&$8b=IiES;}-j#{s{Ms|2m#)aafH<6Bwbld)pqxcb8JmkML!#M8q>?djq8VnAZelupNr#?x`4v2ZPj7R8Fh zl(s+zeY&(kT~*RBw1^r(MGYFmb1j$H8JtBZhAL|x zNn+jv^5~}tzoT)X`)JE6T_N}Qk zneX``fi3?cku5h5z|k-q4KqjM$b=)4S&O4c97Pu1cfVjAA;c=#`}fIkA}chQ3Qa?V z!q_1~OPE5|6l0OCb?Vbq4N7w)j*I!RXjbBi*01#TdY+5z^?_XMkT2{AUMQEdRUXV| zjeMadc%e(iF^ELQzbS2KBjZ(-Hehyx`tr2+O?gAx%askh z^~cU(VsKP^``mlq)HJm5vy4dZfgW#Rsvu&j@V0z29*P5OJ0q|YBX-t*d_;_X%flOq zDr5z=k08z8-`U{Y-Egh4;hmig(=JARyR%{D&iaUohLko^^5V zy>c1vy>%IPb?%qhH+x|exeJHD?Lp8T|0B>a@CIs(IhkY1eF6vuU?9Y+jA)rgZ1TSYTIb^-fZ7vzBBH% zOFar7xKx=~r52vZ&=lmYcsX1!pNZRd>Awp5<1!{=#9nB)wEU%nxZ+Eq*@el8sg=v+ zRT_2q^gV(ib_jbvMu>g3==}i#Rprh~s$Ikiwdt(TUs2HlP-X3dtNl!evBTTecP#Asa$e$Q((&eLGNgDF~t23a%DJE_)IXt84O_Inx1qsrc%?ZmIC&}^*> z=lGsxe!+aBLW9MOJ5Q<=ME>5tAoP42#W;9i^8O>Dmz`8Ak7%*rpg(s0Zx>i377@JL zvFh+%MGUQAU}Yhi7G*jWGB6gUj_sfMuDFBtimjrK;W!+}v)&btvq6jr4=|A_z(q;PRBV-Mial@&C8|FWQsEz-ukuhd3W z2+vIkk4kHlF2qDRuSo?{FBmhK$03EIJhWypQ+50$@9~dNog%BXXQjeEwEggXradic zBQi}y_`%r^Gw(24rB6Tp@I;}hS_{cjB1R=O4okW=qDUY0)}Md%tJh!eJ?(;(kUjvE zOc^UvGOQ;ITiJ6&k)h?ElJxP3O3#K$@A^}oh({cTf-j&Yl+27IIsd4OS+TH4`*M+X z#e9J>RHV&}GDjBXS8JEOpJ z1w!*xw^GYWU-;GQzq3uNvuCgm)_wBPS&yswDg2lU2w*|T_&~1Tk z3v^qc+XCGd_Dsb0bf=6(5~_m$Q5u;b#d*jN1@KoS6Duz$E~@LIB24tv)z= zqG09f3#)67*Y?6RsMqxi&DQsEQd6dpgD zc)m`1;_VBG=Z@pr6W`+U@w1;P*l!&7){eh0Hf}+*ZCdTU?;RD7Dvzp+$vY~h1fA4)i zx#xkq9vmJUH|(JiKOHq@fS9kTCv&!ce5UNhnDgIT{IM zOb``Hy-vse)wlD>+nthBbpF}Q{Ft6S1`Zq)ey1X#@6ZwV&t%gEPVf1^l<9-kY+m;C zG0^Zo>D*uT7jGdDPTJ9h3YdiwEo>z*vyTC`)w#?8C;KKsTe|M0z7#3cJS@4WT;3kUaC zm+vYr-c`DL_wHTAn>KIUy0f&jvSP>fs{IFF{nLq~zhS?SEa#8B^wM+t_tjLC?%c7X zq`a(j*Y<5i#oKq4l$KSLlg%4&Z3c1>Tl?fu4+zuC91x~g(_MOkS{X=!N*QYjIXmEy0ow7jhPl{cz; zvt2vSeDsUm)s>*ywQDEvc5B^93f=+{*{pLuH2#;2cp>ZzxnerDrlU~hZ|+pWdLz$~kH_E*2H#v2~9 zjvjxry7-AFH$DTyKl$WSPd~G1^OnsUvD;F#6()eK4!rRn)p&M2;t%itx@zl_PjA`? z!Y7^pDKyx$>6vFh3d)_OWxJpK^&j`cQ^x-B#F2fwAZbeglyu!hX>-xG9lOdZDxZDx zk1s_rHs((szVmDqif1bneG-^YJ+pBWG6x-sP*OX~cUK*J^A9iHbw3++?BjP|*k7}| zblc`Yr#U9!65_6s^4%rd zUU+A(im?g*ar}3OUpTmT_s*>x^eKYl(uuO9ysD;T)1F`N?$6kRzdP~!S6+N>Z{@CH zfFc2I3vvWCiL#=4Z+TJ8o6p_Dq}9Lw=#Q_z1j>?aMVmJQ5QIfVn?cB}SzfiLa@T=h z9vICe)q9`)ffj5|4lSr`KQHUsb-d zn2Mf2i4ryiYVo!mB_+jGFTcDif)(}p^us^A{^H)sijp1Mwia#KyoL1JPHx4$xwN9J zX!kE(fA;RwqMgV8{M*CNR-;nv04NAIZz+b)Z!Oxo9T_SqtEn!n{`I@Rxxc9B{K=31 zeE7ibZK#qPpM2uy8-Bk2=TB{cy`Fet)5a}Zi+Aje?CDJh_PzE@Ztf#H*1TTuLe=ggm(cdQrDoCyM-LViC9V9bY3! zQIhmdku+KQ>$gP`(R8*ufg=@MQFR2b2i@L>sPT!X&tCKGeq?%?_nLUSpHNv_9k=@l zm6fmf_k2P%Vb}gmA8tb#IY#mC`Go5Ea>KvpBir+#`y!`|hzT?H&?{Xwr-U9*5EM$p z-iQdxL3gN7Db<48<`T7regk@H746Me%x*zMu$Rx}5j0xS$CN6KUM&dPNMlc@_2Q?s zzyG%Aq3@cE{lg7vjY@F4oDvV^0W$YZ0k8m83O=`2P^(o6QSf;@UP%y?B1pVmhE7Pf#fpxa{-!BniDX z3HEuJK+hSNLa9-SOjH|`lI5C9J@|p1m(G55wT)+&P`zENl0dkmmQNBC(3DUKhEN%k zNC!F#Lglc~2zDlPNk*lsp{NRtS|x}Yy~<;0 zQuMw%?haq=*OzX1B(FzeZl}ZJH$kAvV^6lFQyB=VLAd}bj>#aR0!C+|#-Mh$Ul;of zjl17>>DwzU9-rIoV{VtjeUl0Na0Gh`RFc5WOsIlrh|s#*t_i(vOt% z%;U1(3RT9#7SIGjrspEarlF|DD1*DTk@dVkc1SPBwN{rX+1ov${feeZ(<`?Xs=qRQLeWKoK4yVL#Op>jBQl$<0gN1&?6 z2f};lrS?WoLK*A+I9b?s!9GmNVts&?Kb6A-F4T(7pZI8nE+4Um{pr}N&p+QLK+ z*)?E+E?oTNU!kIkC^TVut+T@|DA|R62A_yfLQ8Wy9M<8&(3or56%#c#^g`ET+(NBJ z>!va4bZ!S4G|zW24mZ;nR5pv%<8jF@&{-e>b{X}D*8}%qdD7LOLtvbnG3Uj84iD3W zX`Obf)9rS9e^_IKoL%$KRRlFd3bjG2_1N7Kb9`&!s5+O!>Tsj!l=J^D@(Uqk-%eTb z5xfMt0@dO2`8v)Ih>`?tm=>r`s#oNIlwUc|H}lHpKZXijHEyfR=XHL02iiETQR8&r z6ighI`{$4Aduvpb7EsYk`Mi#Q4$@0Zty4K1HWz709!Wm`Kh+h@uR^WYXq;B3&*S`i ze~(8}X_a=nj4D^bfSz5=M>@)1P<3@cD8f-ts2W0rOUT_2?E@AJWhN|+ z$`3d$iKTAF{z1{A0J5Ke4JHY}D zhussvlJ^09JFjv*aY}nXV&EpPTd=Fj-r?|g9G~^@c$iA7ayq-B-m0`nDgXD@s5-UE z+2QbdoS(;FtPn&E)i3lopi*#uGb**fq6!vpbU1t-+h;w1s@AGqT-Sez6omAv9C}V3 z4!dg9PK(p)aeYR*%BZNox0h~VSMmZv)wnz0ua3|Ap+Qj_psVeFh8n5>sY9r!TT~0Y zj?eptO9F-mK;<6G1MSa2)-W`w*Yy^oA-^g??K-gu?Iu)S z3); z<-^_}FJg;*)fl4)&>&j6>a6kRso}TnS-{W>6SK-btP0H^^=Gyg~H`hMfQxe zNiF6MpIYm2J4x4&)Y&TD0ylt)eF!S%b}pATrf*+NyRMr(H=~B)cNTX*B&1M+ro0fK zE3l!2fN7r7ZRl+pthrI&aKo+Ep{c!vu3Ql^9;E=N>{pcgPEj4c;WG9a0@SPZ z&F(OR&+EFW86XP;P&sZ_)LZIGsA0YDFhw<9slVZg2$L`YCXCKrFcg(E4eCmI%j%P^ zTo&e@G~Pi3q0Oo8Wf~OKboFYB6s>2HAJsn-Bz##{Znmzd{)$aDkh9|>R1A$JkNt+C z$KZi|T}@3EP46B`hOsMnMR^h|=N9KQdEu&s=n6U_(>t}0ZZIWgffrqD%&>GguExuMyD`6;0iHr@7md>9j}RLp$k z?AMotu)l3F^uK>ZY(#`)als9kLa)&)v6MleUa!xH!IDzWB~uLO6{&Z7FMRP?gUUk% zAPP{i3Ak>zM-aloqm;%$_y6_7)9x>dio(Og`#uWPHig;8G|EW5PNHd!C}>pZCR|J} z3N9NHy>3YtrdFP_o0}WWXqg497{qv_dll-QI=6REt0dX)#vdlT}q$eQ;OQKh)5`3w-bweTkf4QcH#pa*E_BY z3VYL)CT*C?WwSUvn660N=`m=>z>6`J(I_zcg@2y-$KN|5``i~j!0oYg2pV^5y%`!} z9tIW|geD_CFIrlNw&BP#Vqi>39#^_F&$VHv@!#I)J!k}W`6lEb+$DHh#6QLP1!``Qh= zgIU|qZMoW;+m#A8nL3akSu?7LwASR3M3q`=v$1xI&Fb`aSlvFit;2<-1d>DOvgII! z*9SqZQhDGVN@a^B(&2Jq9Rp)}w}-kh<_)aCNR%ILG-49fYBj1KDu%BG9swe!(`t8< zDN%|ZngxQ2^8`m%f=aESg)QcFxAhUclvfmy%jb5Xmk=c=#VeE-6$yes2R{&$YAtr6 z&tjMfXB~O3{zT;ymjgDbO(CfB;KTwSt=kPczHaLunECT|# z8}WEZ4nz=-pw{XY;1N8Yt9KaG_&p()9Xx0gQ36<@1GS%rw>!jxL8;E5RHFs*dF$`e zsujqRwH<>?D1|jYtVkky)Em z9rRjp}SZ<<;$R?6{n}YEC;%Y5_D^A>}Sv*KMt9Pq(BbW4#Y&?MUG06 zypGnZLv(7=%iPbX6?`@a=izQ5>qc@&fGh{K zL2U@5t`By+tFfOB59!c^kepla1i920Dq=;R3BHbI6PCe!E*s=Hcm?C-(Hs;k##k>vzP{QH0fC_lys zgH8trc01~0@JcsUdu2KPdK}~k9teU4x@qytY4Dv(Jz+j?fTvTpAhmpeWi{xg(c!_d z!+ALxeUXpKhiq_DE;v2EM)?UhXyInCK|{0(y^+^p^Yh5Q;|K2)Cdxco4A@+*>)|vW zwxfL7@n|3*C*VH;CYqG{{Q&K9gC559S)A>y0o^+31O5t5S&mvKN@&+^Xz>_@xovIc zHap27x`4ER6zu)^(V%vD-AzUidL54T);6nbgHAaiJR%-5!3KJa(>#`Ih{xbfycw(W z!TiY7A>0C*_;8~JzA5*n&P9AOp@SwR7n7aurFY{RJt$vtJIbY0A2Yj44_8FdSx=)nweIT2wx9rZuf8(Jc>JKDLNAQ3+Z$b>C!a~FqTE%)oyOLcWn+N_lXpX9K0m;+_Xv%)t4Nt7Q22C+sx?51F@ z4h_0$uNAtr@-n@Z98!(s7_>T(Do!ie0B`QMf#>G>BkRUXmlpG(n+ij7g{=btBdFu{ zwiePYP`71j+WLv|uX)`L*o>>^*N(EI)P%uzG3@c35&A4R`_@rO!b?LfbPWizyI zKh%w@22Oh3gvVIa?x;j~nl*+g6c}B1fQRIeq@dSvV?#B1q(=P@+5=IkbazB4(XCp+ zBiB>^uz;v#GstrA_yK*1TH%A5E^7pQ$K$nkw6@x*O#OMH!Xc4l0kSmb!FUwYZ{~6u zy&lXv9qlb<3yrD$T{kHG1_|&`pGB>kN-s$oOuCuV-hpK!Jd@*NJjxLjIBEtJC|OOE z`+8ASX~T6cH-=zdo6XwN!g=H|0-uudF&|jSZUNnpt*|ikJWfn4J@&Tdb{b$~o%d%um#b_8k`my-_*#K^Q)JHw@1=$& zWJuw%-?(7~kAIE@O0pa1ITz(euh%O?LwHOdh2q~a6u>^m0qh8L|sJhJG9#G&o#AU z{^qi_wAx{0@B~{qxk#}^nTjf%R!gIv9)kyKFMfjs45iO$xzXyt3=jE1^CK_(Q0e$f zi1Sd3sEY1CAgc9(&q$#m=GImx)mX^!hVt<8g&dwArOo1viiuH0_3fo-vRaxN&0ZyD zL~a)*b0motm(WxQ7(XCk5nHGBH8q~AYqPRG!|uOFq43z6uC}>FbQE?fR!r^4tH}Yt ziw8dlw1|k*cpc|YoH~1oZCN{VKziGi%QvoGS8IG&uy#mpjA?)_Fj0pX5T&TcTvCh< zk96tk>yI438p;d**HguRpZq#jAk^(&r;2XM7rL$VuYBbH#~yOq_2~azm1p?*Yx{GF z(}#_^SJUUNAz^pjKW6Ad4-Omm(@_tO8Z>6&l!^K4w_Qg7C&O22{`@}=ZGU|ABTE*{ zUHtIU6>HWkD_FL;VEJQf7OdH@bnTAqrN_~i9Q-|d)q45(pWZmQyJF{NMA&ZGzO$@k z>!yuQ{(SScUE6k*Y%Q*O?%8+#UfcK$x?si&t)#Vk{&%Jo$gTEc$hW_mOh2I{2@!-Bah#W52Ra#M5xx2h{C!i5oTwSxfa?i5| zU;E2@M;0@7tl=NOIe-}3ii$FXY$K!_!QB)Lj=1jfigIi!D-XW??*4n(AKx*b`@;** z)=)8(mxF#c9aNN6?5?b&!0-wP+5fBG92khu?l1p#WZ$0M2oa|+aUcPTm_P|a@K#kn z`^&fY4g%%b)Bmvtk?h4=5zvdE@0~jlcwJUf%ITp>d1cMPH{LzaheTiF(Jb($Za|Cq}ef{+$v6 zp?4p6^N-Kp!`SQ(K7DuJj;Eg9LQ%+atTHs%PNB^_$i1w*{MonOdvOS3Gv5F7xBH5p z-U#Uk{`N;T@8rSq9JUOBJih9D0t9S>^}IL zzrKnehf6sAw?DkNudb;E3{P^TwUVY)&J=Nt< z4o?nXtnFO*&RwwZuF}ft%Dr#C_v$#tazFp#=r3P6bZ~!F8Aw3~J0V9Tx)iyosH`b3 zdF4M3J;Yeb(a(;)@r%QU4({0vQi`NU@bxa}2~6^mJ^Lz(559YNIAa+{KR@>7FJFD} zdAxg20xV=_S4jz6M5e6Xd!Tarfp=a^Kmh!)lgEGa#;Y&EOLmu)>;wU_fii+y5oYzC z{WTSbjyxa7q`~i>I`NxdzWl;-`)ex8$>WfVa&kZz9yY41uBqDp%9{u7p2Y6^_={t2 zz52rb1AD4u58X*VN^dHVx8jY4(#_Ss_+|NE#`3@T+h5-L#S70q_iRlSoUE*zT(b)3 z@FpBoAE@53=dHJ2j$uVxKRWvRU%vAE!2|oa^wM4B<<(VHyGtudDykrQ|DoshJonDA zcc!zVUw-uYvDg26aPKa>cCqd0qT;PTE8bqQYX_pxx9!-ur?lePgU`S6{{vvVTf#FdNy3w*qaXl@Bu5EYZe&sS+}ES-tAC!qX7SQvE{6?Eqa+@Ba&nGJayTnYgNIf$Dl5-4BS{UIt7j8Pg}(|4X8KY8e+vj>cz1!P-O_5-TQH$fP%09J^@V)VAAdQZfiLru{g7LTNG+-PXU!xK9+ zCW{hY7hSng2^3Ogf8ru}rci5OSBlQ=X>i`Ccd7af>CxMXNJo|Z+IP)@=)!|j_yVDV zi4r*j5Gmo|2;8a*DmN4e{HS3)4Bpm;4n>cijy{NH(5h{X7n?*ph_<270LGtpb5v4I z#^vSjHvsvSERqW)R3*iH>#)pcVLF|&pI1=oH1@`e2qQ^m5hTL3&SGbSA%FQ zCsX*Y_jgMOoAS0@GvkpYN()_|->x!dP*=J5NDjXK{QI*3R1Hum+SP?fa>4aoe>lEI zr|4*Fb2uG%0#6MBIU~bOpmoKplX2XbR#C^>=3+eqcy1TVAG1{`#=qZd=f5|f52Z!H@{6g1yWhzD)(3= zP}Lr%oB5poxDRVwc#4C^aVR`IYjry1B|4cr1UCr9ZOcW-0_g^9pi(N;O04a8fqMFG zu&cGAwWGr&DpeenIxgyGWX^!LH=zd1BR6q)B>|`!S~2o6uk*k9qv^yuPF9Nr;Uc7~ z9P9NjP)V3voH+0cr(Q;h+N8rWp@hiX!B{2(s?BOc|B7e;?pvVslM`bgqXg$qeoZ+l zky7V{Wj~!xLTP&(e;Ww7O0{US+kNN|5w$=JL`aDaZwnQ^h6mzCgU*L8*lqiCAP?aX z?GA^J9&QmPHZmqh3<$yg7KszWToU?xH6HYM@urK*{{8@ts&D`m3x^O10@@CZ>UCRB^oJC6AU-`{0oVaZ0Zds0orOShY`Wx6Kvi*61lib*55gV1qaeqn%4+a7 zgcFD2{t%Um4MCN4bxAJU2Yu1xXmmX0o4X5FN7gllcNQGl?3jOx!haotka01$3=q6SEzoKA!G6&CogA9)t}fXxX% zmEmqe4d_Z(o#Olwf)`)`JjN$fuj8X0KK_=5(_s&yhJgCb7f>f;AELJZDxpGGtcklm zi9om#np>x%Q`ehOL$EpzZ$_1C0qKhW#CSR!!+Q*B>75!rwg4Y*hW-2@x$i`jNn}S1 z(BWN4_$yF70<)erdfZ-)3LoI32x93pR_JjEY(UchAt@rL^;+~WUQu*>t;4IDq8jZ0 zp~^k%k06DBcJV6S3ZS3~RpUXlyUKG>r==}9VpJsv~Pe!U%zYuC(fl^T(%^gvBS#DU)fC}WglwPe=d78kps;$293JT16A z5s3NrSg$tRaH%wSPK41#S5z58M!nerlz|Wh5b`Jo3A;QIeN2NCwk!3`E|m`BbCe?W zvYonyq6W1LUJTI{nL_vu&z#F0-rHnS*y^uRBsrF3QT{-sr?8weU;)1ky28pdeo8Wx zj4DYEm!{VpgVl&nZ}COp@p#ay0<=LKvO(}fJ_tqS<|hjXcpux|ridOipqHzu*{kgv zr4iv){Qgb+IOPS?c^MM87@3-~1iRr4ZZ!XHTT5ey*fXYMfJ5l<(9qrnyq^urV8}?= zq42V;0WBE95IN3Ni%m zVz>#QXW|M}VF%T^xq4b&m* zs)Ud?Nz@}$49o~E@*%!aLVISH96p4ExfNO2M%q7%|_PFuc)gL98&v;lih>b%I$KmM)BfR_ASNFeBI)Gk*kD%QI8h z+P?-QV4(yrmvK3pgl9+8HQ+F`ljVbmkK2%)i-%L5H+ zmE>@CP|P<(Pzvyn6L1h*1CIeO%)r^59T)o>(5l!GGlW=QFj4&?9yFwss86IO0aFOQ zK_}vE5s%Apu^$4cu#`q}cwV@bsP0g$;~W9q42YM3;;xSR0Xq1XJIF(I1@(bTplv`o zlB35DAxM(Td3_)St63?|mCGR>x#~c#t~^G)N`+{Br=`9R?1tF#Kz;%_;*vsi6S10UoFm#BOY zzfEIBN5cU4v1H+~W3t`+Og!`42GsS?gcUO@^hXM>y`is8MRm*{J0>$=%Lg|8(h2fl zc?u5f_6|nSBI-?tKYlL2B-@y81NlL0xf(qLvs(usb`^CD@n(qm=C?W94|()qJWdZ? zqHO>LjFYV?2Dg(*9y9nkkt5_M%z#iu)Dy3z9}MUX#?J)>ftqsV|8N_G8FUCz#QQ0> zKJ+BQOR;bigG+>R@^cd}eMk<)`chciwFv6@;MZ;K6c@^Q0unmq_;u4zd+Bg}AB|Bb zb9$_8ZHQTw^Ap13mqK;HfZwQ~*mAGqMikz2Vh)P=wqnR1)Q$AHNe)&_5UYrm+7pds zIi=ffMT|7HG6AMQ?)e@Uxg6+*+Tgw%NyALMZbLk1XDNly%erApHqdiFklLE@zuSE1 zLMaxT)}Lj1nGai%%dcUH$Y{X)1*?LNW&`?fH;=34al1ikSt8LBpX{S*#C(fhYg0Hp z$YZs%A_kYQtcGgF={tGgI~WyvTP;R(eRv(J^+q5*m{3VWN?cPe2lW*GhB$EqP&VMF zza+cWYUVMxa&F`;=ke?2w*fU#qSyCbIL1s~ONaS}Im8A*IZ#YS@cRyiieBgCaP-g~ zixYBqJZ(TmKsPEeZUYVX1HADnwF`Pgu1XH*)+tBM32n&;ejf5s^xWw6?`nh#;X#>& zU`3!EWF|JUW8#1nX4|d`0Cp5;~kbOxR)LJaR`s#Ik0x zAIQ4ly%9ZD<1y>9HX9N9j~PJgjTVdCdy-B!@gPqO?=n!VFCNr&ut=IHSZ$Oaj8ty2 zfox~m%DU+gn2t9&jMOZ+>}?@D0UP+Oz@=jO3GdFp)(XMXiWfe8KAVN|L!%qHJY@R@ zc(@#mf#Pyg)dM(ybaOQ@Xy(-L!aTI{IqoNQ52^Mlq4je z2PS#wOQ4$`b`xw(VTk__iV!@9e;!RZUqw+`+aw!p)Uqj-dSYN#sy}d%Pw^DoUvRDJ<y1 zfC(XZ_@f(@qcsL&S+B)*gO?A6k^~A4lE!(+ZZrYHOaXHE3(HrcaE@1~P(CzKrKxIw zhsH@XL82X`1@m@l62OdFz2Ne%-(rC;v`jvf_ z&o>mtC?k4apHJy(cei^mgh3n9+>RG9iN}laBVN1}FbJl35b6%Fy~@bwFbzg7c%`_V zb=dIEy`$|$QyYH~6D%0oIwd7dBj^Dz@nHC;itb^c*VR;b_Z2^ZfO&(nqouhGzYv5; zDR?jw@X`xU^utSJ1A17X?$JY!={8g81?Sb4c9)ysy^&_TFu-ROKj497NlvsDG3p9c zxT>M)T8qbpH_1AhTCCuq#Wz$97uOBXQ@G`6z^x1q$Ll#a^;LpK`s!_UYkxZQY$pqo;S-!$l8Jso1Z6yC?> zxM6N;Y{R;T&*7x?5Nho4_9VsUqd=+Qz)}jvlQ+IScd^~UA_hHR(wkik4VTRxmE^-Z z2zedxU`rzKjx;q*3SETC-hAnce}34=p1N~dOiWA5_g5Ql&=eVE<)f7=craRGJkdnd z3~G~vRU)huUu^sEO{}5pMOwY)i7lJA)@4H9b8&BNKnvAZ6y{%z1dx8d-&<+36|C zGZLpGB_<}$m_ZzrQc_a*E;TJ9Cx1C&>p;FTFKt%R^l5TRNJyAI!=I9p=pZRMB|Rs1 z$=bDRLAx*~ZAMbU)M?Z3H*Fdb`xB%jLe$JzsW~}|WZL}P%o#ykq6IbI`niCdnf>tQ z&6|OnpOv0CBSZ&3oxFnx{YHD)RQW6srg6ei5#R;@Xnw^=CyzSYuCl9pK z{j@R%DZ(}9eA5$Wq-5mEc9@eoi}dr8@tu6iDLHUTMmC}VtE;PXXD21dS@Pe!X$K`z z(z6kbiU`!~50kdgp1!;&P<*Wl;4$Qr73{+j^~ z4nf4p={caSs;bJIl?YOvWSlOfgbdnj1kJ)`xygxBryzlv0|l++Kbw{?eO6jFh1Txg zoj!BAOi8qUOcYlDopb;#aAAtnq!8L5bqFbFQ?n83i$Kowq=W$OO-fMt5YP0PX}J_# z3)~sg;^RqSu5zc=L3I-nl2WORL7p*V>g36OV#*+;0G+%~n30l;-&$U^YE|xxDIoRJ z1l1&e=kn=b#_YNH-RBJ(Hsr#~;H0Q9NlB<{a^f{EnQ9)LC#OFw*UfEtdD&Un+4RlH z$<9T>e(s#yygVG{<>%()&7Hqsy-d4(JAOWU?_O$I^7mHD*Rb7FQ^SvIcGmE{M^~*{gWal?t8l#L z(RB;gu3fWk?V43}6r{qzzI}k+SG;zCti#+@ zm7pZtef!XC(if++@n1buQ?za&dXBWTwEPw25KqLQk`uJSfuH!$A=qJYMn(oYkOgaY z5G~I--9{o2w1;>oad=P^3esz7{@J#wfIfglFWSQHGB`h_8RS81Mi{obqi4t=$!Lb zmdGwcPDa_6>4}G@*A5>nUq2rTz}NF1h0O@}5KKX|WPUlxyax}}tep$ci4!MgEd6;g zei5H4MG>zbs1iGhQ6I{86jLQBsVpg4nTr;8%$PCL(-*H;`RJN8D^{Soty#4Of2-Ck zT8z!w6*yeCa?OhQ3uccPF=E1m3FD_E&6|>EZd}@wl=umgCQgW-JYmYXaaofljvqU6#0bz) z`d^{NND#q(VLFWF5z&AFr5#VF7#^V`l-P}jD_UJEezC{J@Lr)CTfH$n@_I8ZR?!0z zNok0Pj_Gx^;aW3Zo5f&Mp^J>^-M9buSL&}dV}Tn_!op&D_Zu*{?)%I2*RWEJ7(bBm13iAA z=@0VqgWUeW9;Q2D$BZ01V$6uR*oP>^#l;SN09zDa+(U80M~oafZ0NlYJb3@usqu;N z({ZRRS5}|4`bumsk3LJ%Hk*m&0_Mj zusaf-L7v!d;;zF9-Tw)9VO;1ZrO@j}oCuOY8o0FbBKW|}P2FBxZ%E;i(ot1@_ zFf%(RH)nS4`UMMeav#oHFeeNCP6_>gHvJ*d8G5mKS@SopShP5Ae)haMG&G<=0h-5L zc_)t$=FD4^w|K|T7B9=4n>BatoP6s1@@RuC-_v%^oQD_BUAkx8Qcg7=Wcm2xQ~_ep z%$YlX>AYoSh0B)b&dZuRZ{A#7A|OgKEr{mMnfvgv`O8ZSm#-kI`Jj?1I2Fk7M^JMY zET6x;Y~Avex$}vNh-9?_SVR+`TJcC8VUhZNt?9rI1;Pc(<}Kg-_==Ue^D^hmn@dQX z3>17%0`sBQ(z(kHtY5J*XKqG5L6OP0z5EAI0fh6H%vn-exNJqv+;q}5FP98X6#hL& zoHMT=Z}IlWmM+hplPcemhiJT@1V=p9};nK|H^cktE^HS2L&X~mKe5f86sPnlFpEuwT^&>HP zTGG;t=`$xz9g8tDYFd0e26xy@#vcugF)WIoJSB1RwEUTqr;VL7YQn@xlP6D_I1&3v z*ztrT98Z{(Fky1S#L*LmjfovKdhGadW5L8abMX$BrH`a@@#qcMSdMu;IKRiH(ho8$Rs8p%2kPZ0v)v z!-kI@Ic)f_haUXt$e#=wGjZ~GK+sf`KV!x; zYDkbU!jGRwgZ^pL_=tW6Ca_Z{jGvq`dfc?+6bxx8!8X&UP9alaB8x^RVb%-`=%-Cd z%$z)aMtVjvw>6nM3G-<(`>dImS0~L*nVCF$X4343r%#-fos&lG1~0-CdBUACn;)QC zOHZGjk-I!Oes+F-7PTAP3FO8mH7z|2g`bv{nF`;@pSM0OA${(=9C9oDtF_j2SnOSI0;Fejr*%^5`1xp^;H9uqC{P}aZr&Al_Pvqce zcJhd7$@0f47iBL%twzO=>jYXWf7L)e$;->h$j@E&$m2ByISc3dsX#y#h#2Gqs`UKa zm8;g*EY4ksIw#jfKUF6Yu;%2hTC-vQ;=Ha@a@8e5s*Rw^TfOGzdqD+>G8k9IkAw!1 z+Qf`G`Kx6tv@4v-U$FyZgq4>uH;*JP$y?;d^5=~c<>X}X*+X8&oSYS_9^XS$)CT79 zw%Kowtjx3w(knM>c24$^73-kaBDqb1P5C?yR!>J~fazRLW_ngie*U6mh1CVH1ld6@ zk}MQV`fRMcWMZF|fe}xB{(^#^l`qVCI6pT#8!I_f${FdisTV>=laYc!Qf6i{CWi}F z?wFT8HzzA2HF*}C2Mxu{q?zPr=&aC0pfyR#$jr%KyfJ@vUS?WK(u|pCL}qbMg`d*o z6MwigefI41>;)ULW@V*f4wpCs{UR1!$oDDn)gD}$3hdPU)v41{F#|@Gm_BXlPXG#b>NOrAIv?Z?!lIa9~Sj~_d3 z!bA+(&@x~kIAOv>j0SOm4#tieH(}hQshMMjjU7F56qBU_uzE?j&LseUg|XG%%zSoCo^sKtibpcve6sgRED7E|-QT;BC_H8NAu6DE%w zGYuNdPKQVggs9>YCH3T#QQGBXXJ(|O%$zwHBm6|tHUokKjRy@2c%sGu>i}7(BeP~C zP8dCI3>GG4!liM8H$?IPf+La*aT(PrWfrD1@H)}~DrA#*G7?YxfEZ|4kd={^oHS$7 z=+P4rlW5Ts0}L3R>`8*@gG9unaC&O;Owf)T57>h;ii4#YUorq40^yRG_xf@93;()S5if$kqc}s%L zCe2Jv!z#-hj11?^#}|%>Lc%x*zuER&c>QDoO0o!#Y>hfUc7`pl$I{V zQNf}`56?w+Gn;HSX7uE#i6~?gTt0B-Kg`pD1q-mBKY#w*x#&w^v1##>Mhzb~5m`g8 zh&8bS;4NLcWa+YH%a&7GwhU*B7tYVm&YV3fAz}RJ;ln2+q~<zm_8{Pe*w6Q<5Y!NCqFB62WZ8oWT@KisFYK%6*b^oY?@rzIt0*nsYX zmcn@Hl0Wham4~W{B2G_BPM$e=^vH4363~RFXP|GQYD6vxXW$9PsM(l!r=cj|4gI^? z2?=oav~)BNbf2SfM88U?^66BEk|vEoi#B5xe4RH7x#)RiHMn$86T_VBj8r_Om^fd<(y+4Ll| zJ6U8;PAg~M4+`e&jEuBYvsk#IH0Ci!_8c&d^(X~H<@fV|~E zUEJrRHELh+(1vzobKU}zeaDX+IVnCNiE@Yg7!1gXMg?fOktk!SR57NE8#8GV+9;S| z4(3_Z=pZ3mJn<9glb40+mY6Uxe)8D(sbnwJ(;&~ z@see{x}n|_Ea5ee*Pw#MiwYi|o0~yeq|Bb2fJZHP^A;4KVxnHkHEuZ;f>uBB$RjJL ze_JpwCj$-I)Wk%z4_R~O7c5=A5`EyBpJ5gDu}2?!>``=_YjLz@^{Qn{=I3Q#Q7b+v zVM20R{(_||*Q|Z~@t;5WMJHzkExbKhmPx)#4Lnnuw8L1q*asrD#HSOye15$pG z{%B6|+$#$YF8jr5-MTYRvLcnB6JHT_2s+^vtP1rNej@f{cMJQ)4Z>D&zpz2QRRM}v zU0lztcW>FC-7jucA3v@_Y%6#~o#_>(o2pCDP1jA(&D9Mf&JDtTH8@3??;cZrqA7n_ zR8H82$o)Xn#ohDWh{W$kY!#=oWh{pQDfS*IVymcTl1{lndym8tB?kKNts?GC?0Mqu z$sPgEf%c<|eK2cbuw9|)j{p#bcWR&@ zfB+i*XLmuePyj*>>W0@@Isp)K*O>)+dnA}sWhek02LbTgoSgs&Q|Sc2TiGFG#1zmC z>>($3px&LjEzoU&ZVPlw*|T_&~1Tk3v^qc+XCGd=(a$&1-dQJZGmnJ zbX%a?0^Jtqwm`Q9x-HOcfo=w*|T_ z&~1Tk3v^qc+XCGd=(a$&1-dQJZGmnJbX%a?0^Jt)KVgASO?SB+(n$@oy6sh)+TwE5 z))u?f!;kM&v^0rd71|0KTP}-LE%q}7j+QF1rnXN_?SdK{*E8B);oGyUWxZH9=9#wB zEq3v$%U&-iefF4l*0w({XrKEAKX8tJTH}a$XI;p-9_OF6(S7Wu>Kzx=@8})xf7aIW zxL6qbOj}|4CIVBOcG<;P{HXN*1W$Af@!6x}e2Tci?_2EeXdOe84*#jm{!X}Kh(2)Y zuy++sXGT)R$W>_+U<+uWB#q*s$wk#+m))$ey6kjzL09Fn4;2ro%^DmSg+ppNtGA!^ zAbsiDG9kJ`-5R%SX8+1%uhl}AnnNlx?Trc? z-6TX6SH-OvU_L5V1TWoEi}w-?tk8EscSPJ+l<>x;3sG-jZ`*P)=7^XuN5mZim3(3R z);2iLO`3A#5KRNZ=u)S!5P}~QwjdxZCq$Sz>1vCe&gBA8TpSt9>uvfT73as`Zn-YN z#cOJ#Yib{?sm-scT};mXuF&$C5b(yXo?_ikxo!E~kKFF+NPgm-oY;TzRNw^urKU@3uMp?i)FS8O+u?5o2UyhkO_%&bX?H4onmWDqrOGFGn#Io?2 zr1h4@cq##9ctoP19Sr$(Gk`n`Nrk*Y!wd)(`bW@;RlsKei$ZA(OnL{zgtFMTW=_2I zUxKCla6HuG|wL>o%SG?bx= ziZ=8c(=dR=l#FTU!(xiYG!%Q=qWhZdr}iCvJCMUg;yng&&o%E096jnO+1Kppv+rn+ z`1&5)b4MHcJlEV%;*E3xTm<0aBycf+i#&azlU?7mnmi>{_AKXHs98N_YD_7`G=~mx z9yOz<-@brn03!wJ&mG+te7o6}71?+6xxj(vf(JaMNG_w~{riIZ0T9#}B~Xpk%&U(Z z$ZO2vp*8*hv=Lui29}z8#6KUzIh)bqgd&_y?iuqS5bWVE{KI;z#v zU^7@<@uAFCw`HYRy=Gpp2drHPYg=trb3q>C<(@G5w&#%j(ntmPUv7#<0+;=o-+_wW8dqm=YAH)S+nG)~% zGV&s&2CnhsA!|OeCXAWPIyO^cB5R4qib~p(hYDKE^L`Vh8rw+KwU>+etTC@S<|~dJ z|2i7tjHn$=s2!t*L^DH8wo*@~H1leWsnw64#JBa}RG}0nO05!=bcJ&zJ!38SuD&*4 zwcx9#tquO2Yr#;UQ)Tx@y?Cs$JH2@S&Xt`~rS0uhrNM;BqRpx_$atEf{qJ0*kqOgk zE|@SW9;>-dFW$d%%>@&-<|pe0>djlr-)MTXbT$Tv=nP%Pcb_!uoxpJ0Fs@;iXI51a z4GAWBW??At$08(dTG|~W7ywQVRya4!5(AM0SgAoZ+2@9<8@JN*%c1^^r1tu)MK5 zZwm#{;mhZ3kA2Z#Y0TkmZ~Upj*l6Z$EB>~(QQ*b0#_mQ+V=$K-R$x~AO@S#s%3!YR zgw~KiyXBo!w2R);&*&78?ryMo zuH2mxG17CT5l*0osX)~5)Tj|2ps^Iy<)~;%85&*002Pfcs-KER7uClz>%~I*O@p1; z*D}V8MRjHs<1j$O%GtW8p^S(wq8u=#sW4^47*|v$sAx)5G`gr_hDH}rq@vM971nj% z+LB$@y;?vAU@{Ne8!cR+$9C{*q0naGnDITO@!Ub2!Ty~>`zibH4EA{qRT|vL6u1HD zaFaB+iWInh>2MAWZbS-PpLDoOG`L|Ya3$$*7in-qQ{alz;l^ul2PB;xUv+u z!gRRGkb_6bNmXGric=;Ps&EMvGPn#XRN)dTWN;Z&sKO;w$lx-lP=!mVkilh8p$eB! zA%n}HLKQBdLI#&Xg(_S^g$%B<3O!ZM>`BgShco*U^0$z|KB{4&=OSnJcxU!lXLe;G za?ycSVsfvMb6=4b-<}utHGFtbu3_YfT>sk81f|9os`N! zDpEbGs$7%0L`=XMyW>+iNX4pWRh4UemspA2+cic1DfAmX=h>Gyhfl;mUFK9udj0`> zw!CLoI){(Ozb^6WB>?Q{xql(aGI%&!zsMk4svY&}1`lWJ85v|t#S7V}HO92c?@nD4?iE zxsfaEiQ3wJfqnX3QHbnC|FgEPFf!aalcio+2Xbr=jAueBdXdKIVwheKqt{E#xPXOJIb&RkUJ&IRE|B9G6OOZ;IgXWS zNG(2!;|x{(NO2t1J(G@uX>!eTASpcOM)!2)IWUXrIaA0)TtSej2qL9<&TvXzJ4#g% zy^ny3z;*42G*HqXa~(XH>p+i5*Fhw69Ym_GgBa#ITFgK~fS81e5Y${}X`1V>0!FU0 zT`Etw&Ofdg>)hZCofPw3RWYncbymzUO6JF@MT*`>qev|aSB%b}7fd|PCh=aJ3)h)3 zk4mUoq!8JCE*!-=7m=(;A;xu+E{5p^F?zimngiE?;@+E+>N-oA>nv4Wrw{6!NJDW$ zi992^Gq*0cIy-oad%HC1VJSbiT4>2jyr0+Ft1g#T^JZc-j~2SvY9y_8rbH`sF%|@x zF)eZwll3(BS6G)@KO?H-I)#OYF%2co8*;_13gMb0;T_VbM>N9Pdx=JPVP?W=beDu{ zG7yGT1v8=$vVKL>y+bOfiGptZol*CU=+;AlTzWtehEGIZI@Hpgf;!1XKH^&$Jv<{C z$ac(#Ccp}g%%D|aRXqe$OZe6*_|~T4TbqV&Rn%Rhkj6s~iXefiLK4>1(Ze-Fx<*gB zhDhsx))78N8jnH~*AQ39)@;K6;b z5?B}Yfz}!&a8J~CPt>s@Y79<+x!>1}<-vI6Ag<86 zDr)crBjT;VHZ(xkDpYJ0LMpZj;ViJNRIv5)u8fwgQo0s8TD2@S;yW7geH3AZz!1E= zE;r9Wn72fjyJM!{XoSraWRV{OR&o1e@<;mQk0RvY|IwJsG1jN$IzK2^G8~gMd>Jyl z&(x!q!%i8}7$6ECp>{I{tyFK+W(E6sw~-WL5n_i1@+p>|7chGtAi*MKknboSA5qA0 zC$mzGY9)H=^-AGXzbo{v>ujZapt)mYr8}d&V5J(>O7u*{rdTQIbs4d(RWFIb5h%n7j4P7*9q2KfSbG*igEIkLL8dR@@eSip-z-So*!fL|hTzUZXDftx5WLcEp&=xZS`9Nkp}F8dw@hKU!kJU3F{Jn;gSXEp_f zilr>i^%NK)_F#EtQJ`EjyH`Zl?(A0Atr|;@P#|80I^TlkyjE4(JSHtdOxipqEkaD% zJSHtdOxipqE#)I=^O&@hkEG3G(o#N>HjkvGY$RZ&sB*Ig z_|C)jExxLl_}$Zk09O^^5?TkO1L`Oey?kOVKfzi>C)RrJ1Z#!9D*y^8#v0fe-5Idk zF0eL5Wvy!v;F?0XG}byJB8s4gcE`}V6fKjmD(YO)vd9~Z@XBx!acD!5V@?G|4P)qe zv>C9}czKU~i!8^GRDC(g$1F{0+>I_s@r%_FW^^B)dO@NTB3~dUd3RQAT%mbr1 zU>^7<95A3Guu$!E9E}JcMeG9&n0ixssaVM1Z+oVFoMgY_QH`({%J)v+rcY zEhz>&nK0PN2&)WpSPFCm)?hF_GtHTpx%{-uz#M5#o5lFrtue)4>_Js%h`C4T=R9lp=LO2} zteBS>(m+0Y3yRaB*3|%GKu5MqOykOY;oHr%0`0L$**m7p>LE_qyQ6Q2I_kA!BL))LQk>L z!8@Cu*ca$Q8{$A#V?UKNm0$68R;wwE{DOay0hN|2Gb)(Q^r+jRS7|-(B37O1y5)B_fVZMAapNj9uj{i3EsSLn;`DDI-j)8AyK1EG1AJuV6M`*!6 z$-rsNr_hTuSQ^X?M)(POvzTi>%u&^kmu(!i3rclqtIea5skJh12Mmhi*K|_~sK+w6 z!NO`Fd!+1SSDDOdnaqP5%;NV^5p+Q$1)i3y%zz)mIL*Rbc9J<(ZD`EZm|4}qIHOFK z221D&8-MUOV&)G68fs?yp&5*dZJQBqh%CFGpX1p|55P!wa#6e=u}UdL)H$Eb{Ae02|=r;)JLcGuf9odgrx6f{9D@dgT@%^0HP zB`-JWxl@``MyP^-*X9MvHDFqqNvVuXWQAZgC6s~J;DwocWBtbGanfOV<((NMZt`DD0bZ=R{?I@X3wPxdYLVDKc6s`ZVp z+MXs`(JrB=XYf1LLk-@jNOMgF+?~5QOov+EA%Q&&PVF^_a}^t1&v>svKxueSmkpiF z4BV&TS9^t|Pa5MUbcjO&ZwI&=Bg&YvwvxTzq*W%ZDy&_r$bNNa-t=nKdWfCmP6MJ| z$^SmBvH^PS)n}nhX6I>VrOOOP)+poB6R=4;Q|Lo;B{>_Q0_Rs3K^XWrBDsU-~H zXZB^3F>+1jqFS5Bl*tV{oidg3t}rw$gUIQ6LXqjrjvh!YF8|Lf(_;}rG?D5t3nyuQ z&Rfm4y_C=s+dQn^Y1qYL#`X+6rHcYN5nnjsYm0=eIB~vCQjX5H40TM!@$4KweqFY8 zk~oaQtrRw}a0%XwV&UPb(bnwaQ*k^LFh+uoe=v~ueiQKtQ7;$u8KYhSheI*PDn#w0 zKuFAsl+i2A{e~l6qmpQ(#5R^luawvpvDI)Nha=dFg)a7`tc#5t6xo&<*%tAJBULkL zmzo91M8t|19IE!N37T!*Q$(mu4*^P6#ONRt91aD?rFt9(2*&{pM-n25LxX6Gkd9i+ z_%*c7g}~rDN8!6V3Q3c}X;Ey7s>&v6X6%ddA-OsVZem0$c8bE&^yz?~rca+1RjkyS zrP@vr_nS4C>Vhf^KpgC?2#B}>5}w7G_D_Kwi;p9rdosoVTTY1z z);_eqE03-;$TqvzN%k=YOk>FAsM0F*O;iKQu=Ba2zE}j)#*v6PAXy-lH0l8-)0I-& zH&GrF`Qw!TE0$lYI#Tkh=^*U;hGv6(Tr_lvL18Bw5Bm=ra>QIBZvP=|V9N32sN?rY zWM9A=>!Lyl4B3M%L&CnJb=kC@;njfIak_+1HWi3uQ2><_%LLvG+=*kzT8^_MezDq> zG4842a{{Y9LgAirF2~vY8`@oZ6!Le?(sUh5ZwL4scG@v8AtjbWEb3DQ&lxy|6v~-d z$b>oQ;-qL=cJ%N1C1Xhy^p{LkOq-2|W(#^twZ&Iti}+dELIYN8p*cvGwg7lDa3^h{ z=1AB=!u|CYU3LRLyY=6-LCE^dS z74@J!clz|g#cNgQ3`u#yY0?ax(q2y|`Fc2oq?)dhL?}rzk))99B8`#M(zbe0t(YEk13EXt&RhF+CfhdvRbL!TC>sh|`3G+nP( zY{5odNiAW$N^yEsOUx5g3JPdKZ3$3SZ5u+tZ%B0`6xGejVh(o?9Ip32?QkjwNncG9 zMomw1oNb}Ibq>IeQD?HhmY_3#@6(z8EfPs@{sFLc?-cV7Fl06>%ce4m(}`NPM2s$5 znuP2B_2wFRip=Ot*JUHF_fCWJ27z6&FwGDgQkO;B zGU033+{rdyvoPEf+XyM_ydg_Gj5Icwt7B{Gx)QZ4EnY29fcI60fx$N|92&|K?F)_Z z|1+4q4Kc>WavuEJe{778Kq}sDHpU4KZ`T>)N6uq#NPTn|uS!Q({+wQ-BhO0MvfO2% zLEnI+VAFId^&M*}AQ-j@(3BncPGC}1qJ*Ims$e@;iG&$?&|%iJKuwJf^E4H6Qn|aH zl~5q38Jusyo*2wAC2RMW;JzRw97wx>gt|G+zS0;*d#M=)oHj#Q3>19*D4TCU%xa;5 z0Qr=6CeW}QE!RQ{ys!qrJ4*|Ye6w`{Oe>j5QyKCRXy$xO!mv+Z?=a zZaDO7HVN-B)4f61A3;-l%0wBqLp;}vZ3_UZnn5F=67Srw{Q``-`l%bN=7t9&QM?85 zRl5kHKi!WeV0`CA2>L|`Wg41<}uVdKdz;QFvs2cLnIPHhmBsV!kIO^?rI zGMJ_`=s1J2kyX)rx(3xbyrj}BwpxKi9!7J^nRTYj_>;z)0ZANt=PRB9la*Z?KA>@o zvuvR) zSz1hoAC_88@!2+>!db07ye~=Uw7np)t?~o31Re=5P{K<}f|4Tz_8Q8M=>z6IVkO}< zM@VzS0p^<-_C7E9t_=f=Z&uj-u%v8HS2xr9W{2Z}^Lgy~kw(|z>=-Z1rPFncMHS09 zpcin)OhG@K@FZ{oKf|ePQtt{UJdojhgo*tKiTwzP{Rk8LRg&%%O>8xR#D0YmUe&~= z1cZ{X*HC_)*ubla{VHSeWhVA3jKxP(vDMAyn%Fz^VlRW(U@;-~BPn7755!h*0zbrl zL{h}=3MYw8IALuS=b)r*iaXmT-s1uu$7{A?r*VoYk~|GMoDi}Yx=1p_gk<@5q~-_x zH_84p!#LPrXuXcCcWoGZgd|>gBU_bMX{&&JzFgYyNcJ4C>qi~B6njlw}$k6M1Po!PDcv##{D-DGP8|ageP%}U5k4- zg<z0^em^Sft8jdtEnZU3sxQTgToo+ zo6bmCVRiq4;CZ(F3(iJ1;60C6?4W#wC`)CFq!n>JrPsbmU>8L^pIF3aRW`Z zugwaW{hMU7IE6w`9ED6cUxCnW6AKx!`2itb2^quz6ml9_nt(}agrGmu@l7&rN!=ue z)^c>Xs`W-n;N}Gh;Z@?56oUU#s9Kyyp<_zuYO#hwwN92c4F{wVDqX-r)5QxZgknJX zW{BtEw?-U<$|BiP=AtgO_ug6$@)q`rH|Fs-(Bc7;Z!?n*Atv8uCLcmfzRfbphY*u* zvrO_K#N^v7lY9s<`8Jb$o0)t#mIV2bP&)yfZI&;9dozl`^{<6Pa`?lXf!zJQ5XdFHaf}An1b8Bb$J#lA+qHp!y3?eW^!9uEs8LB9DcAmCoAw%E^wo!X{YQd4fhG6{c(&5 z_O&_2pvkh|zISvEITkz;ImknBItvZ2V~j3o@1$knU^dd7!#P4hRck5jdoM*52e>^N zj=htXhJ!;GH>^8Cx3remmg+&s>&d6d5#KD$K}E-=6jovqVYV`n;97zwrWn+7#uV0OeTL+>}^YG_PU%*Njm{5jwSi_{fK z!eM4O${7w+r@+xu!Erfo09L~>1Ds4zam+w`8Q}&@sRnbM(KTO%AzJg5X%Lgy-qQfT zk8d2#$Nw~yS13EbK$Oe6n$47$rrUcC{qsW-jGz6cZTe=(+3YG=EvYf@*rwkv1xHYf zSgywTIzj!OLCs=NGl;VU#;#yfG5%*KjC%>A!U@&sHS+>_IK+?H2}Yxk;%r&L9NZ_X z#!=0PwckA3$%`=SqCz3gY6g_mtj4)!ucnCx%9|bWtqS{AgvF_dz^w@gRSlXQ$hDQu zRugRA72!#%!oi;2RpGJ~;ld-omZUM01HD}{po|_!EL){TI^Uv5;sNx4d3D&gk}yvT zmxK1|aMdT3zWnu%qzoXtF=fK^Tue^7%q?lBe|cq;qLB< zUc?MkW1gd!5fqcF#&{^EBr<7Zw1wr_LtzW${x#k-FK9Gz>WtbZE&@qg`an|FQK&J} z7I4gTEtN2ezFiXgM&iI!%P$q@*H%&YYfNc|CIUdA$~B&nIzWYB~ekQpiqZ7?7h zog64h=cK`cNf)!&HzOZPBBledqZ`|TZpUE#6DY_=*a_D@D9mf@1guog2?idivPlQ2?B zf@1G9BP}B%{pc)>qyZ~N()_ARBLTb_xRXXwb0mzU;UjHz+9nn_gOL*06GqY)`u0Xj z;8HIK*UAjISBTGB~V}A5h01YMELyaU_pZ#6lgmWD~>Asm8!a=PkVWaU(yl zj<5bsurvusbL=Wyp~pBG*Kgjyi%0A7^GfYk?#!>t%V+=DhcBxWoHZ{My_QRBGgIBw4=$GmSyw9Z1Rq6 z`v+5J1u8TM>@2cI3>Ro*B9=H#tjqzQj@W5Hi5MM0UJUL?GTbVm5lgU}cB(i{GGIt5 z;q;(5`@l{fYs7HrL?&YT!^CGGb{bF+J2D|A9XPTqa=>GZcQ|;fv4?Mc^vFdNxg3## z7P&#$1)xmv)1(YO&4Km~=QI%5Z=e8=D+3VVu(Y6#Fy?M7oCP($FrMHJ`_YCAy9SZBn{pnB}yggXfK zvMUG{ZnSUVeRWaq`lzrWTIj8dPR4c#7AUKW`Zh+X3%)VBhXK$3nSIO08>7_szNf() zzjzAoEo%2|j#hCzc8EWKH=0C`uepr>(l?oB8!G~<61yr&+S7Jbl(eU8aZuCMm1=~N zTO1Ne%C>gm? z+6F>P*eXqI$7T6YpQMxtj%(5!gM3T=$JE8KqA+-1u@j61`l{O9p zCM9+asI-$y|Cx!TDRi6o+ay74fnTSW-Wl`~T%@k+YvK+}EYK%n{&``=pOdV8R9Ug= z{y!n>#{U6X53t!YwTJz4&b4x#Bp0`z^@?sI&(-l*qb{oBsr`gSJZ5D{nio%a%-HJK zhx#+Lgq2vBRt=8bir6NlPgA?xYC5(`6}5+WZDqRfa&2Y$Kk=rlOn?6hZDrc8ykTW} z`ggUJ>Am0m7Aw=m?O2&s9V$c7KpzZpBvxKAZcw>I8CUy2)^@gaFH!IzFYBn{BwW9w z*K1v%WGZ%p6}2DH=qu{mRZR5+TXZgNSJpG>qDXB_6gtYQUt;(o7Q(%#1GN_KHS?_R=tNetvMQZGL{4x^#_(EpZHH6wb`-rp|POFsV8m%mp}IF<8we zMzA>mxiQ*2kH(&*v)RB(pSxVijnnYen4A?>Ip->p&7a$e*h@<86v;GV86>+B z3*s8FE+qS8ydv2#Wl~(Pmuw7(kQ>Al$&~9Ihf7pFqVU6aSi33@~ZQ(GL8%D z%XwpUIQ1ray0E^SZk5--aH~APrlo<=t?~dvBTX09kNi7OS8@$yp0cVw3hFZ67}Mub zFRU*k)EXF21MI6bFhWgW&Z*^e6MPzRm1o^e@Wska@TIs3eim+mFQ=Q}!F(#u8M8H% z;wJbr1FCsbF02PpcKo&!Y?cw5X@ZbokYC4Uk;3KxuvrN<%ZN=VB31s3*%}6b%`*e4 zc~dT|2T{i608iPAqi12tQE+CLzt~Wsn-xE4zXM;aDcPMCW%ZO8XK`tf`G~weJu=Tz z{vw+v2ktV$otyzD+!o}i2s0&}9|6d#?L6 z^z#f*f%5^Y11#zUsAAm%q!!Es>tIun_5oiSQX^n>fT>6Uh!x)ix7Jh!QjzL8RmHM) ziI{*j9hg%&NX4pSRTWEXu1Hs%xy3ElikjIi*BS{}EYCSS2mf>&r4rJ!57@J1JzKzR zIR15sS0{i6u&3u9w_Iy1gNL*AiVU))Dn_qu@Nl+{kwLapypRojoqnB{uq>W_0=u&o z$$e-^L7V?jmZdD7K7w*r^iT{JiWfar^+uD6TP+=bN^*~s?d~s6)bLGB?uVp9ExB7; zx^HdiwY8 z?K`lE8Uv8H^1eX~`akHXC204!*d3dt`Xe1mrVYXK|NID>jxV<@Ll)!59YqUhhq{ro zu_YQ7d7L6QhzI>2cFgeal19kybyObe*fi(T+Z@}E?2@E-^m$xv+APTd$@jeEzgH@i zH%jt)tU&xka!uwTGiLL%ACTr0)Zb5&{q%aWetb;f;TORIJ>wh1zW_h+d;D;RzrDjG zAL@|b?*Q#m|5qIrCC^WT-H6GKj-o$u+y?PW`Rfij-XRO$#81`mOwRGKJMJer<)f;o zn}g@80@Bp1)-Y7Zq$zk9;Y{)DQ zIDL95nnmeo;CFg7cXXA$A++!mHU~|b*%9pPo!J5B@m|~EJ1DtpItn&Q^$$zlSsm~z zcR-pxyCZ0J&+e!X(8&S!dK49W9rFkD@wyp2{hs7Q_Y0a{M`m#98Z(KQ$*O9e5+52RxHm{BWse0c{`HdJTKPeu1dYl-48UDc`y;3g%0x|L{?gN{o~3rF z@eLT7e_MrCZjd(RnYUMNWRFl4?^^mnhuqxp@5iXZAq-#$J;o7xHG{U+XQ+(+$5e?* zPretcr#~St)wsAawX`G(-KH}Xy7cr7q8HnysIc^;!tydJCYz-CM_4gAD!E&d#iS)s zOz?%|?@<9c#J-KZi4_*35Lziv6)U5PJ=#%gE4TR;M*NE+T)cfZPnGWJs(Sx@l36Vl zqXqYU5=vES{$0|{Ob$-76DG6cA&GCvrFVn<@Iz8-g{GbE-bEe0_oX8@bhvNq@O>nS zg-7n_a4$`XtGti-C>6obD?DhUNV)^%l(x^OM04TUG@*w-x@1gAK<@$(S-LILcjb6>hJ%04ihfwMkje$1ij_@ z2{AONRl^5k!lv5`o2A2>rPdM0H%sCWispJ_M{?g?o3$-0UfNs|%t0Twd$!kBzgZ%n zAr%?(HupF~UUdr$!|D8ekz-t}G?-sGF19Jpy1jC~=zF18#ySR1I=S}gtn|LzY?gF}D!2eTeTeOM7Ehg7D*dfEM0u0)A)|!oC+ucgh zrWu2MFo0Y7$$Kp(d+!HYzrM4kn{(cw7SpbWB=H!f2S$hfz?}x%k_wLA`Zg|pRN-5G zuZ^)j^zcR*Tk$?w!N5$Vkt3*&)MQnOsj!(WX4( zvbwyj&MO0>u{H4?8ZpsI9lkP7NxGP#9{4)bUfMU6je~)`?OO`PiwUS2p3o_0Mb|m| zP)0`I)KH42STr;WzYK{M<1AwzAKfe7L~zxX zKurqTX$)5NgAc<50v5}w|a$_2Dh36CvOs1O$1@XL$xS6VSxB<9` z0P`%%>X=Hd$-sMFD(_j~2Kh#2BA|e#5->6NJyo-Q5j5|q+H-60!aA#c%K=aRfjYB& zOZ?)6@SDiwmIW!XQ`Ok&I&)qYS@AlLKp3*{=!8N89+-kcL!1p1`Gle{C3&Y4blJKR zdFTCkeF3r`{;P!gsUfzphPuZo6C*TJf^z{zY#!h_u@J9TEcWvSVwM}{iVQpXI_$hj zcI+|tv6KxCx|sh-PWOU1cB?=e} zkEl-hya|;x>u#F1wsaH6VOXmSUBn7>fA6u~!=`u`W(y6f9*l~42pL+<6nY?<=n%Yl z_?c)+UVQj%JZlj`uXBgDL|aVqmMHe#KP35=MyOtF$)@`(t$TRUd}22}<9p`ua13KK z^m8u06u z8N_UQ{fV=ARtLI2&ip&oM%rt0em5|HbwBdd?#IIqKP+k+dA+tf#XgIXbDh!?VK8W| z@4N3lQMjI8jHWoPH_|0lY{N}Z{f$DEItF>v{-e{Qr}`T`RrC=UjGij zicwvrY0MdCF^%~T%murjh}JiExSx#vOC~*0+~=oH;<94Ym*x_DY%XCDn@iXtP)uA1 zEizy>p{DkZ$D{Qhbm+OE83t`Md!yqScFWT<*fYkaa53TRekrKi!N#>%;cFNjyh}6kQivr?24Vf%5XCyM`}_g zrZ$Mrpjyd1`=QRfp4BvmG9!m!x)3T5z@r%#V?7hiYCZq(ucECzl&Q!^16Kfm&3lLw zm8dO&F^Q<*I?%@geG~EB6;L;u$Yi-S+g#g~GWsD44Tm#oLrcr7j;Cmr?sU@||LkmM z+T`UYx@ndFTDpn3NTc{e67s)zDl%neQTg2H(@~xpme)At7 z7k#fpKPoVOFWBAM_!Ifg{aDzGKuyjjRvmHP(3&}rjC6+PVL(3QKckQ&Cg~GIBzhB zZ;BI@+(rLTZpI5K!L@R=COx+uZm)+~$2ts{g3Xjo+p=??I`)xy_B=BW>RIr23<6Zv1{sh;kVsBII6; z(=%qEJcTLJLv7z+qY5F$FAy&a6Jq=V@q3c};C$ewmud5X9@~}(J$f#e7oq~l<3R>< zW_TWL6N|Ao72jvfGg2h`6eM23zyxjBzAUn|rl)fl*g^MCZK9W}ae+4Pr;>fm{Q8zQ z?`P~K*ycUKURv9{U$B>BZQj4ImrvTfU$U1^+q`Y;tyv_R!d-;OYQIb^0kXZepHW?Zyk3j=SGqAKb+1L-gWYSrku(iS%upDYdUzx`T z*mzE6c@n0QKWdYk+T`Xo`AD05w9S(TF>6lE&8rWzp+|k!vbvl(ymP?<$Oi)5h=68y zm-TM4z2Ejt#r;BDBpjiZ4L0tAGaM3w8_901axbg z|5#hL|C6>{|EFyR`Aa%t;iM~OVW^*fH< z^0d}*$5%)MZE3xLL7&H<2Qlcr47w+SE&%iut=Wz~@)gdQe5a&!rZy{Ux;X&IoUEutcjFl&bvoWKR(uza&sg9yV?_Z1vauouk1I?SMm(-JRg~lL zEH@axk8>6HB2?%+V}%Ki}})N<9)`Sl@GmR zjNi1Bzn-JsG}N&eT^vOn_hE^IbZ_y)QiwH%*0GFVgjN|3_m^9H`+LZXj`x>oHmN&wyhzotXpF~}@}cVpGv8Y3 z090!qKP(R%0s)@~;M+9dJ`BnVsO7lYRE1Je6cP#}*dSN2_~9x*VG4b1K(qkNc}z&;zC=wN%Ur?iT5=CAt)<^k zxf(McG2|6`38pa#a9|X0ah~)!iS(z|b^B4*RiLi3pswrVKioDRmE9VDQ(Kn5x$RQa zaF_azwh8`^+h+R%h%c1$s4Bo*AS(qNO2MxfN^?AZ2QOL`t#0Ef6yH*d9RX@;`R$3+ zm3$l_mij|A^@qvS8~HdwEOk1sJ*_%l)e6VU?ylTjmP9T3M1`vhy69Oy~4jy(Kw zwAFO{P@8CVyd0g-O3gc6NPDPFaKB7_3hyfzpS8L1`(c}yr*FIbID(TvoXB4LFLvmUU#78$uS=u^nPM?25El=sbQL=kW=+N4{$q z%E0)$B{>w8IcK;}hq%m@xagM=$1CFBMF~PaO`=c;FCyROql`<|G_PrwGR$`W^)wV!|ekk3$Tro{ZC3c@xRsZVimDH6=GXDd zvk$eEjFjm>++W>=a{ZGML6b6i7P?CAmQw34b|&rsJJeKXIfRz&Lr$moH#tr5Kfa5k zH6%-Rx6Pa~<4)a5a2>M$qNp=b!|P&G7KhWtz$WHAP-@PPGIUVc`i| zWd)CAZ&95xeY(G_y!SA8FcYVvz=Yq;aRwlY{S0 z7>yL$U>SouoPXxON*-93RbMUFnd`5X>rD02;A-{LWp-OFl`#@Gei(m2{9Uqv`V(U`^cqdW|4PTo<2k+lAX|>+OPT_9{tL@U}&VT6(d% zh3-*Yg*yrbF$=hy9pYyRe2+fgr6HDp9Hb)=w6!t!Es;5vLzue#-CewE{4Ehz=`E2@ z<{fOaZ^5@=b6|Pbh@tV=0Pb)++A=ua`=>m;6jOb{yxr{hxttqli({2dJRa|lNn5-C5*bO-@%PL9!sT8XJhGa8X zXiX~?a`1FJxXBP2hqf4uKYBCYqZmo8x$ZT9GM!)($%9_tBh=d!nC%$WT$i<0IxjCj-qM?)dLw@qs(}!;i?Vh0Gn)obu0Q zY}$<1*VDXn&v-Gk4gY2YjnrQVebPaJAxlurwthdp{YgIl3a&rNxtxzT{)&lmoi#o( z&e4Q3rMPB8l~i^2i8t)wNhA}SC4b4oi;#^TKTa46inzJJwPc;7(G4x{5NBxtaVoJQ zPG(5HLsoWK)<|fLNSh||(-Nl2LZ(N6QdCbYRf<;D0H9JLL(+0-sBedBJd_QC!_$p6 zBb&A-w}tIgbv?|fTIi;eKFHjB$PkjgG$B0{nWBLl(g1p+h-b1}NcQ*&*aq~8$D6ZA zN__r}c)!rfBvcJRd}Z=b)sqXwIpmYUS=2)HG!nwYUq@RmjT9gG8Z#QbCI{_$&+Ww< ztueOdhxQ_2L!&NJd0^4C%LHQXZd4f#0L-o#O;>1(vwgbl6hJm%?WfM>Cn z3k{*GsW71A;~d5nWP&6v#pin zF|u5VzW0)d_yZiBvQJ&%S~^m$94T*d-o71e&knxk)I2-{G(kHIc*nztCUS=f?|7JX z&82&D6z!-x96?j!Zi}GNl*h~R1X;c)wFmG6(IqZsU4TI({>_5uq-KHIdLle$>2~6b zbp(1)o1sO5F@n*HLrHhsCvVqtlq3qNXe)Spb1gbNbPAqs!NQ>ybIUTOcR{>Wt!x(1 z^Fl$q5lU~pj@n!jcrT`6cAD%{cbcFxkARK`CL09wI`-7t@p@DJXj#!8noyZFpB{7l zcmgulPmt^K=kWCq9b6Cxw3O%?!#BA`qdmi<8uc5xQ?FrJO@C+p@&)KTY!LtKvfjd= z;TrbWY7C)2DtjS%qduQgd#I%wJ=dUKXU(K*1`4UehA|2Romev#ziUYlv=eo#Kk?&n zh(&)buZ4 z{TVt-~ZvwnRyRB zc*}?19B7Sg=~%iYegIP0f1K@Fsmf(vUsLIt0=b3(8RRhyW@hT|zBRJ?)Vy0F^=N5I zAgl$`Y-Bg1Yy6T3wshDZs>zDKL}L?R&GaXwV7{I!_&W0SJUzmLGfts4 zJTn{Udl#2+YwHKXnS-Fq?zJ zj1`SYwLY4ww48U@@W++&)L*0Fr#T+Jmq*P!8NCy9-{NbjyKs`TWpTb&aEjpp{_T>i z@3^k|)VGa)XOTb4b@!*gJNCOzU3VXI-Tj&CsuQm7ed7AwarW|O*Z2PBTJ?qN?k`lDpujf_A0@WBxDlXP#y8o@ zIA0NOd$`uukAJ6%8!cC=K(10il$P->fpg`Sy84vb%6MNfAgg=>_;;@0M!OK<%Kg-p zd&1TCQ&-;;uJb>2oqwXq<-nc0E8&$Fop4?Jsmo>;{G$bne+>RA1&=)Ql;0-g`RziU zYbk)>>#p3PuD(MF_Tm#wZ(=@!lfMw;KMV3-1o^Lm{H5SOCUjIfIu_RFb)bH7t@?^O z%T3O|HQ8T(5-a)#pD?@b-fe&Ian=Efx~_Z@>+SZ}p2X_&Kv(W=WohYwpcxJ82J!E% ztDdxf_@n}gwP$9YVUQFes#bDY5F7>}?tUu%7A&*sD`!WOYp}V=Rc3C&TK?xvs3c2E zQAaio%t2j@e5WL@kmMy1G&ew0 zH?TTCm{&J&+4zw%=e%K{81he)3;f@KpI;)E`Y(l_JLF^j%Mdq7KINY*3;rs3wtTrP zUm?>1B**{B#uaZ!%t`0Unn6D2k z(+Ae;1Kae0XZ3;C^nru=z)^kRgc5+ALwB5#e;bqc#^i>Wyf21+ck0!H#&+CEhzkjo zI|yCYbrL4+0%bJBig zeNd{b!I`;&?QnH9wYIgaQ|jgc47ydSyn{ijp!-_~bp{=+f!?ctX6m+}2F31CSQsOG zoGRSfQd*JUQdVJY8BtN%Qh~pbcrU?Ug*ZCC@Rz(;5x)b!L*p}M^I~ay_RYN5CqDc- zUM!0L`9@yMkJm53##3#&psRj^GkySsX=pQ~Ck-%jl|kk4M`SU3*UvFcPh&UqF93A- zVN4#pfS))EI^JueD>&b4qpD8hK55A*K<(+7z^9zom&bRJ!!NlU)vx8UH`k4iRvI%d=Al|9r`J!pPVl{_KU@k9%O4WmI3qwY|z^FuCFm z>T+4iq5XiJ5AAX^$Dly;ItHD3D7J znBVY;$m1MmcM6gpsMJLC!ha_ra;*ZoHWhSj8fXJMBJ)Sdnon&Y^UcQ;-z-sllMbjc z-`p?xZjU(bW4_sAH;=a-@XZaoPv@Iz$%1d*r}-v(DM|HB6du(#_a}UFKl$dPs&6vd zoqbb7-^n+dznyQMhQ9aqgm2<4)i?K%Z=!R<+=+a1f0}P1?F_yN%HI8*eN!iVx^JrV z3XeQWzDXgyZ=w^X^G$@h@=dkAO7Trxkj8uyPkcZ90>`7wH`&3jhsZaX72unXGT+1* zFU2=mwEI!TH}TLr9D?L zkBaK+QPiGlJ&GEYogh)_(VH8y@g+rYa7~S6WcE%=UADe9HBu#N(P~pmHPxm@)TYKd zwiTXgQzMmXR+}18n;Jp1&cbTbZ1EYjHvJi=5CNvI@(p<7nkH;LHx3m`j`m97bmW2jj2+&dZ(tBp^VBRAk84+~c(Q z62tN7*pvUyodQff`L|w`Lpi%QjL!WH_9BwW(e=qa0%3Bb=VNkooi8zoFde)6|G5)? z>R1=`L)9O$16Efl*7lcRk?A3+erZG;N%1YFKrc2hOT^P1fnN`z&*Gs`Aa z2?DTc%Xg`(0FzS3K+6u3?n^bPT0v$osg{QcgHbLfLFj4){e?T2al2h85koE%sVL#{2LA^^NiSIcyF)=OT0xWd_ zOC74F7PC~w5W64@gA1iOHD0isf=F*m%*}+?>H>F+H!G_Y98(@7?7Pw!% z)P@D%8Oapwx*L{)u~#x>w>}SgzAR;fxHbNC9Uq_M=Hs!)`1p70u~2+JAIF9r63vQL zbR2}!3JG)H99n!fv9(hON*_Tm<=J~?DiTCri8V zO)5{{5Kk8HB%Fq)5{0K;#8bUgpR4hd%Xnfz;wcwA-3OjV;1@h?3l5_D5(;wLw`xtfe=W zK#;(TpsNHWkuDMVg;ei~uySZZWh2gXprH(Ob1hYRA&C0C38J*Hi?%tFGF5_WwNoMJ zGH;fMCvNyoO{9$nm-l2fS`sU@eV;c)86TfFc}L@tIl7P6Ytz0YhYuFK9T0HmDZ4Y? zH#+Pcslim}V7w!Afwu#OLfHxjEV6=C0quy0t{yEEo{408fIV!lUWzHPClB)YCh zjtnQ+s?<^Oj@1RyNR9@{%CK*2*f&1x-KCIxJmz~c=6f0>t27BFrC>-(Srzs=G?+_t zFy4u}fS%-}u+IUKmxO&2!@i5~ZOWMM1xV?M`F2nzE@*v_Xl(8hgt?9Rj+{&5!`3nnkaBj6_1mr&N-cNy`1mkvUfd|R)habtI5udI`5^doZyqB$rQ{t(=48ng2mWm ziaNiiq+n%M>ky%Guiq}ADz4u_Gr{!_vx&1uBsZ$?Z4%8*;i^E)XW)LM2Fdq=4EwVf>=sb8R_RiHpWh9+e}X=YRrQS6_R zhR@=$u$IgM>Q`NLsMPU?0=qC3m6oQV(vmlX=3z1E;Af`}9zS*P#HoXypTY)?&uAk| zF55hUog*j2Y{ez82SnZ5a`%ZQ+yaqz3e6zS?(Luk6ib>o({~CDE@HM*3mrwpMZ49g zDZFknb|PTgbDasjs`bI1btbw_()jlx92r#B4ou>o@XjU+YqW2h-yX)d6mAP6-ZulE zmOj$hh8baGBJ;4@e!aJ$Zuj1fk9*_02K2#ZV9P;P8Xeuhmus<@MPY{S<*oBjC3TM0UX+oWE2GX~i=7?lrqaN;bw9bNfw2hYB_ zg$ZZnlO7Z4Qy$}xqgR0Czy}!drH)=0sv-xzzlcDI*oy-A;35LO#hgY{AJOFAhW&e} z&4>^#LuZ7{oOm4t7$GySd;*gZG7I9xjb?*57CDB35apN$bmpO$yrCTPDR3V8^$6h0 zl?V(Ivm4FBMI$PIGt9DO^axrPvE-Za1&;=c@EXq6zs}Cq@5Ch~_Nxn_FGGdJ_a4os zY;Cb@ZOPl(VikMhE3>#UrHAs!QywPvz_A8hF8UA{eI5)q*yjLMUJ)>fB^1+>3s~_i zFXHS!WK@uX6|?FXZNY!@dbW%3x)Jh~G3;nTsbY?lPsjYr|6YV$j<|vLuXOJ8SNOsm zPAu)<99PC@srbqmUQEG(NTY3py}HP%MR!**ZkqlyHoV@qLHt6^IGj%1-5andG{m8c zw_m!9Um>%wI-!o^h&7*Ks&HLl!k z7}rbb<$YWoLsLC<>5aP8${Gvv_-5=kEg!()mv{c&cmhxCG_B&SK#^xVRe&&kfQ7|^ z?U6`SP$oV%o`_JtD}Jg#>p~(EIC@V~7&0AyTEh0dr)k0o4T#Ii-f(=RICjBVf%J_m>id`jZl(U@mbJ|^2_D;9eByO##zo{KQF}Ix}is2L3 zEF)gm{-Fn?(Bp92YDpH?? zo3kGMaIWcK71@bmFKYK|1ar4Qw`kGsYdR==3D@0FWsD@01FIwzi7Bmyq|cW z6D@1-fkwvg2?x%_wVK8b$QKP`|D#(kIz^5P!LU!5?Xg$=X_4b;iElL_BpUIv6`NIC zEwo9*Z;P3{BV$zp%7c4sZ2HquOCsKFi&Yo`n6&G+wPhf_w+gURr-Ip!kBk9D{n!}t z8pIs@8b$2E#P3YndOf&TWYVx$OLtHdT5`3M891b&pfgtpfuZ6s?=Xg}J1|Wj5o^gN zXlLy4VGQ+%7!DHPoR}@fPVn?7Q?i1S9Mk}!6(>K$eEP{I5V(Pj-Id~=(|%{QvBg+z zYVAiyL|SUR6|t(_JVregvGUzKEtplr#ETbK8&m)r0SpurfPsPv(1&F%qO@n7O4_qd zB@N1D%?v)GgiX(rM#oT!M#u1xL{vu>#FUN3EFE@2PpXXJbDfnjeB^Min1zV4%Gh4a zoXR|QWOUo3JW=t|scmYga61yU12*jZ#~FkZP+)5xhb_jp7LiJa;K&$GRUWYI-5WR5 z^7|u`M#frt&>ZTy!=PZVC<~*c_>JwN5n9)&YD{482YK$99trTZQ4{RiC=J zmw4v%<~a1zy;u6iFEV=xY6fiR6lg=|h-Z?UJmXJx=N9bj6=}$$#D@Gx zgLP+NT`z173w^*f7UIxVUX8KA+RK>7#n<;F(7Il0Tk|=N&UbvtBE-Md^{VdMTHaV_ zU}#Pcd8l;-(Asji25V$5Q9Tp*cN+_hXNDToSZF>yRQ%)aoM>?6?6#I@<-o>SM;D+i z9@Aiqe_F_SgrYhl8}s4x&;$6453~@sdU^8gQ|JCWr-5@CIH!Sg8aStca~e3OfpZ!- zr-5@CIH!Sg8aStca~e3OfpZ!-r-5@CIH!Sg8aStca~e3OfpZ!-r-A=54REGiCWrZ$ zxi+iRvfna4o6FgiJQ1|E0B)Yp2v+T|1Mz z(eb@w->aQddei=!=FjEk?V9J9e{6oO^K9|$zi|FoZrrYMj`7FF*G?$CX#Yj?FXkqe zl=SZ1XH1`>eD43Y_hmhjWY>9-OYD&mkrBCPR@Tzh)ji$Q)2*4IW=M^swuUxsS|V)I zS^!akL_je7WIq@-1lgE^|A1jX7%&XOevn}ph6NB1AhkrAEx;tDp=KzuXPUiKcU9%S zXKWdJWca(0Jwwv=tKpZv6_uIY=iGCbxc8jzd^f7f*#^GndK=$1O>gbluDKr0g3wDS zOjXoqnC9! zxWX__yus54PoIAKUw-z^yN!BDQu#c!#qf4zn`WO9FG{S%XtAC@KmGhq{oGz%DV0T@ zCeyGhNt%!k+aTUX^ReN$=cjMKR`1kGC57XPF!+hyHq%SPWNR-brt6GPU%S=pR3%A~ z=zK0k%h27z8b*KuJ+y0V?8)iR+&*sCWb}_I!U-V-)XgG?|t>FK3_~rd`ad-NmNx;l-M$AN)l$PT+^Bd&1Q2(^h{GK z6xfPy6zBrY(1LiB<^-0_6&c0IQ?%5Wp=5egfoCf%c2OzNRbf~tSkcO6rG!-smZBS( zp6mXzfAq!Y-ziQe?^mez?Q*Bk4S%}ZeV6&X?f&O`_guHaxx-DoN+{2=R>9T}lvky) z#P=QxmFw5<>>HtdzF4iMd2h9_Y}*TBCKs{(;_3qFf8-`)p>$UG% zUcS?EZEs~*;byk9-5HTtxNO7N`c9Nhp!XOI$5I;S!EjHWxJYSS`DGty?0GFO5WLrlOlk<|i+Np6oSM9cCG>}q-d?73F zCQQx^l6=zDc)rr@C{&TnQ}E@*LIF;73*){QQ(j%+rP_W+&C?ulw1KhB%2_hYD@W4}yc5B-gtgrpWLw#0V%!g=#bC{J(jJB!RHU0eRpjNFM9_({4 zPE%ym1=6+1-G&<{C}*44 z6AGK7s$OaDwK;~*#AMuv-hs1?9VhhNLsivVd+p5lt}>h?#8kA|gt@cBs-_?Ax5>DP zadK^UV#khD=T5hKaP6=wu%f_W$P{AVHu60)@Yc(X$bIhc@aWpr1Ncb}L4f#QDvo^D zh}`MQE(xDGIX-^v`dI2uDHCC2YITLk4}*Yxf2K8a^>)R^{B3Q zuCz;V&xjL5jG*Z{3)`8m?NX@FHL2dIm$;I;Ydc5Ub{3X7TZCa)8FNad-b7SY1w@ZL zRUnwfU%S@0w;|KeRGZftx>B!}IZi^LDCTH7NxkLM=S2Kwvwm>%hEhE`=$2JQ;CWt> zxB?w6?>%2ol=$8+y;D89`q$rl>#f({xO)8<##?)@ohWl^oTY&lfFxKxbeBteH99-E)@W6M|3r8wY;xin zi^V*kM-iAdUo33Q@nk(8e*fg!wI=YI!eLEisEI(B9e$yxD5U}mVPQS|H@9D@x2rND zmcY_GaD`Qz02%@A5IuLbusyeb`u44QyHYBtJX-_~`vkA;a2;?{x>-&w-1qICEgOehP?qCwwze5Jv+UAt%mV(L~jQuNd$;@xNaK&|Gm(=bFjs!)`upA2%Cifs^1^DZ~?W5ls{PhlZ079hi>{$9nGQNA)K3MC_$B zN=TvrO9{bsc#i=r$Ajs7@K>h?*IJ}qVlR!h1or*d{2>pBCxglS{JWWVzMz*mEYySEWHx&8uWsDj->YGvv2-p4 z%zTjvAX6cV7_&**y?k=-cDLK93cLh|ib3x5GNZ&pLeH8Gr_27?;C6SvQxO;mA>+sO zU=J2i&z{eh>uGPW=*-&{o>e6pA&2yj_}Nd!ky3frf=8Rp&3Xs>Ut|zNwg~AFMV11| z$;jHlwC7!WX}RmwL@#Mdsjx}hU;|`f`o3p*MjCjYO%lDB+5qrO^7)CbD@vWG;+%1L zdD$CI#>3gn8BV8@ac?vpJUV-L`Skl!W&%C^_g?7z@pm6Qe027pf4+G3l^6|iR)ky4W3I)E=}0qJF(+L*D{t~s@KOK!>>Q!ObNV3~kw zwNh?0@m@?)P?VCYnp?RniPGzL5s9hjli!9PK@xmk;^yUzc_i0T= zZJyu?vXF@{@WUh=59iLtST$J*LkQWIm$%H#`Fz(F_dp^)O1f(MK$+VE#Thg`R<;1j?vkFa6L0&>WyGxJ( z#~=={uMJ~0Z16g|#v%+52T#mrJr72gQ`<3@b+)XPXj;m|nKY{%4*FBaTRdtO)w0Ag zA{iL*7WhWn+h|N`FUQ9P|7n z*UM?Y$ye%FDmup&06K_k0_2Lf)}(*FTv(%8sfs{Csla2oBBTULg3z(yDAy}{B+B(# znJegmz(7pEBphL!TBH8NT-ak7%Ul=BDsgBuk>bX}Z9B8!#5C4V@+6oe%*$A=1ZonL z8z+=K9nT$O{fyHU^Wa&g4C8<4~tbN~J=UwE=JfkC0qc(}IxipNh9OePi zi#YH1Ynqxv?8O$y96T0N5c!Kmk}xJUGAc*=^IhOFww<;PKPTOOK#| z?UvntrNW3s4!B2P0ro%!z{!?4QDBRyH9325)_?l!+4j=Y8`z&zfn~6)i`d2jqX1N3 zOC!s2jFknw51z4MNQI18pz;h7H3S0e=K_6^XovsF3Dp;A1Q_ z65~*dL?ZxybF`R@`-|jWsi_O)n!>_fF;6xc(L;_%^kQ#g^yicFi?b*9Dp$H{4G}3< z;0Tbwj)Df!BkK(IE+?bQ=g)s|zxHaU*6h}ClSste>7|)H^fmCz;dprQ{PD;4-}~uy zqt$KGc^WQYw+pGA9_$95buk(B&L92Y&zo=TH`~bT3eY1kI}6aTm%V$g-J1-1&maBp zQR`N#b=2*sRGx>uof`T_#tVDC-5U>K@8Jjk;-uO>LXNtnSm?bdyLkb=g1u?Kck%SW z`~UEyS*!0iq$FjeAL;E_z%+F2{&d*8ID7cvKfZEOuI$z193x1X6D3oZwTnzDaGj;G z820+#?!9+KSE>gMf(Z$mh}-t5UJhxhvqbD2KKc6aHxJ6P-fd!;vxM#3sUpK5HK4Zv z+b|h?|4#@>?ZO_}x};#eS1TQb^uBnd#BrJ~0)oJOg8C%|G;oZML9nrB%f;~W?D@lkD*mL8pcde0VlWM$Bk&#g zA%F+i3CEZ$R^$HpMPHKgDOD_`ei#v&dRIVKXCG{PJ)T4F;$nn75ro@f=n^{{#|C%v zX#oeb9L|=b{^f9(Y`u*gr67N7#{oA3o+V>iz_x&ISG}p^r zS%K6+SuEz$-gr71jK(9>SBWLx;()qL@IFj&|_)3BUPfbo(t_Z$nK zENeD5hMUk`txi{q#m_GmMamB@6BV}u(;El!+Vy=<_>LRgyy)Ab`1JG?T}GjNKb+>- z$n$uwtG>Mt-y6(VZaSV{^hcu+^Z+&fc|((K6x6SL_OrKN|J)bedE*PeaOa($V;=w0 zQ+ONhZbPXF&4U}Szg26nf>u)%9jsc5c|7~*n`!#4(x?^7YM#IHibCiE3AA{<&e2jh z`zW+hI^tNpDbWSBA*M0hJ(3MBA5ulnnu2cSS z*4ul994pgdNPG|iQMj?F&?QoQ6#Wn~kd|S5FQ)$NMb+ zOsN-zEnhbgOnI|H>qzsVS#`3u-QJ@Z*m1zWRVsT zF=pG_P=w5(^;h>A^}{_KV2qlO9z3VL2-(gMz1pn$eL{550O z3AcK?EQ#HNJ%nExsa}?XVBEeBmTKdta$8|}z1t~L1qLZx<{&Y$&`slw4HQt7Al_>s z!Z4qJ1291w7YvyRj8HG}oW9qgsRB*YggewPv*lZwb5PjzJs-m{iox1?`ep zs%RAesF{0 zShi`*!}Vh2NfL6{1dK%tsYCpNWn09B%{^mfy2xjdUgsH*tEfk0xQz9BFpA;%-7SETPn?h&3uVag&cJ` zpF%Q2j)#aj1>AF#;>Cr(m`>-b8IGQac!7UGbTJqr^C*I|AHfNOB}Ze+`C>U+PN9W_ zck*xB`D8p=4u0!M5k#e&4^oB&;6T9{HJF$l9(;Z98%JeH?KD97F(mte z8ZLsbP!hsxTkFa2&;M}vEBmUXb?P+mAA$5cD29wC(}T|=w{-O6{^)m4GQ37k%80d{ zJwhm=5WEJ`Y&Lp+fAp2BNH+EePDDaVI!7ALlXeN+?vi$=z3HF!zH%L`?Hc#Jw-<`Yy?>;aeS#;lu~RRfef$^q{>h!aO5+nf*no4) zk`=tAaB=noi|_2gckaFS=6<#L6M7`{WS%mOkOz!2y}$h0dv71qkuLxXfG8x6l9UX9 z;#@p%&GBs7Kl|vrU#oov_V#M(?hcUni$X9e-a_ObV?eBDAAjKM2MrAjD$zslNR;2{ zkvHgB{p*Rbnd7KbnnXR@C4FE7StC5qy!SL!S|xdf|ArkUJ5 za+;J!nDrL+dNG)cFEowQn%5P9=D_u^C6;6GJb)&Ma4I~5q{<3CqcT608;d?pPPW_mRp$6D zpI#3xKU vpBmvfAIL?{DNZ-^ zR^Z~0!?_@~vF`vDYz9-X?*7(rO1dI~5}{%`!qXU80NwbT!62r#?uJL6pn!RXc{a>? z16bmRPQP!YmTw7S6;zRoOe|$yh!F?FP48m9F(z}C#fb(v#n~oB5U=PgkV6o;7v~dW zHF_+|m70cUN8%*OgBFJvcO!`1^XKR0${OmWO1;FS0!Y>z#3WULYl*${XAmz2bqPl} z1;2zN(KN=gdm;8Ookz1@GhQ@A%1i{k;_7k%Ger0Rl_X> z9$eh{vx#jjCQ4J*q$1(C(0Opsq-$`S{^j}9a^{0OcuGJd{2C##AS2%%Ai%Ik__g6R zr3^wNU)pg!JGqa;+VSNaOwsH$9HpT4jtV06q2WiVNrF|)Ll;vU$L=jjV3>(`6Bvu@aK%lwC@{lE5av^J*RK<4;e$ASIox}NCi_>+9 zr(e)enemvgb0c)kHhMY>GBm4Q$P-=y^$ANAjQUftoVm6OZOlto~j0lNHJW_ZZsnHDRy-ZBZ6Z$P2UQTh&zi6-uq5jZwj5{ls7Kr=3 z2?(?wbl7saMB2_yB#F<;SV?n2__ft+KaYnuco}VzhjTK#hi7Bbcr+LraHDpjX)?=I zWKqOf5ksSZ2`eOq5rg`4oSdL=JWiS=@c(!;1m~gvcvxOu3IYNTKY<w*oMf;pyVXU+=>;wtTr2!YQ2W1M#!li4(KFN)?i7c z1hoo&Zm)s8gcCt>LRbY8E=zd!1W$BOf>Kp$O1pxj3{gZw2P%qIQNe~Y^}0%}&yNq= zM_{ixOujA)nhN?|Z`La@4YG9MI>EtFjJ$43X(bUO6Xc?zOASGi7$T+e6W$PA-W|J$>4vvx{y>b60b?feHr?>ClpftNGzat2<`z{?qUIRh_e;N=XwoPqzJGeD)kmj7Sy C_*>fm literal 0 HcmV?d00001 diff --git a/firmware/epen/w9021_gts6lite.bin b/firmware/epen/w9021_gts6lite.bin new file mode 100755 index 0000000000000000000000000000000000000000..a54def6116fa5b45feeac81cc738e72c2c6c5fa5 GIT binary patch literal 262164 zcmeFaeRxyHl|MdLlBFwKVEF|QwgcB-!Zk68NJ!!&B*^j$G9kgFr0cY7BM5CpOB#`- z{h5|+1aT6P(5;iwmbPT;WYb;RC0pY{3Juh5N?Vg_;1*Mk2M-|t+fAiI7-y*A#GyZ{9>9=Kjg3 zUiv{mK5dj_!F>_#;iVVEXPn`fQW+Ly8^engBm7F;(hHZum8+UoNy@&JSxQq_=w~lU zb*GIB4iV`*->JlQpEk}poME*opmz#2`sFn(F6W8U#ye%JOCD5OYrSFDu`bsijtiu% z42S9t_6|I~RDaHW@vL|6X=9&bsUEJ9!a@8ekj_I#^1;IZvrJ{{W#J3;)Z}O5jVSin3o5%C|I0 z*`~$zCWpS8YyxjD19O6r92!Xe24(pze1A?J?6rZfOW~5UHl&l4mo@KRyOJFGRkC%z z4c}iRWBVn14<^I>eI*&#?$)TM|xjzJH zJ#9$fEd=O}WaXN`g@C_u4jKSl=`$=Bgbqb zCuT-&3a^UH3BL;W9-Mc+_-^n*EO>WVeD9v{t&xubXX%Ab`)y(GyiLI~$C5+QB$cf7 zics4U2YW9*_e%Yyw(N*_NvLAGvm+n}L_n8>9G2Rmi@sa0?!HfnL%X`d3l*m}Pm#k; zD}1LC0zCd$bdhiGi;H733&K)a0Dnb!K}39`Fzo3FUX-NZfK;_Cy!1jqdNFJ-?G7ty z;YzvV*^n#YQ{|3lLiU7L^>j3co(VOq%scoM@FIsdh9oLGm%|no-;u&!0%S3jL=WfN zn6pi7(CilHjCCPtP1S|iJZa?@>lcUR8PA9BoRN+1;>X6*_%zXQrf94*^VlwIVj`8) z*z2sDR44W4I)pw4x>ztw`ji}cF$p~zcJ}{!AUV{QT=AeyiH4<8p|pj|+_x$Iu+Rt5 z#*#y?CMhO((JL)LoEl;~s27T1UB?iYHKA!g)hbr-!(XIKhXKX_+kik_Q$IYFA~ zy;bPh&`}xAX|(q_rhjk@Z9FibO^ehTj?WWsx%1p^S6yM<1WD*Uz&m7^+y%ki0mH@I ztxVp&)TW3Vo5DX2-$p%<{v+n>VQ|)DakdYfRf4mo$HdGTp*f3%ev>h6v7~wDdvE*a z;IyOQ(B%S$MN9v~5S=C9@ls++yVUz zgHkvcE?8_^8C?{6S7;*W2|W8?Za};zv>2R2$qg*`Bm9apAYOF_9Ig1;Jpn=AL!uRK zJ6sD~+(B@uQ;0+M*2=x2Oze)73B49lh=}H(A2Pfb{`qis8V#t4|GXk}KSH;{mBUpS zw*z_<(CKJjf4Gu`9!~*$24v_%3|fL-WMuU@W@Qb={AlwCdl6p$B{Lb>&z1V{a5 z{C(;#o_SwVR=qEjFx=Yrz36K$qcsn}4JNZd^LtmQXG{+5xr3Xv4)*p}FV#*PYmw(# zBqeLa#C?cmJD|-(B(D`~6Moexmi=OG2rP-J<0V9Pz7R8~pyLOPi`^=g#VW z^n=6Eg5#C(#@*!+cN1YheaX!2uK40j;AxU9y_Ow(=G;a7AWVo~~w0p6Hk{)m0d;j+g8+cA^{_z8^FNK_5C3%FZy*1FP z!RI%=7IMbF2RVJu5W;qIU|>SwXS)v=!izTJmCBvnxdRu_Ql=>?mHz9tat9!7fXr0} z&)Ul;bbqH_Zu0IIGv>tp=WOmkZ|Pkq<+ge?CP&{tn^i7%*wpvBf8HDtplSHd|Xgc2o(e`BDB zE6dT$Z$9EYi5Ybi*Uxd^F|tHbbtdA52-_J8Ev@V;p^BJPDn(yC>$th7+o7ODVuxWD zFW@VwI}Dpw(sOOUI4|YBU`Waf2!E~n)Ae%nGmz|I`LK|}&z#M=`RSgY8KUj9@!BhI z_Gje=^smGY7`BGjOa3J&ci7ecMw`esBtd19J6v=A*e$jf8It!?4?w>Lrsl~_^-V6- z-Tld>OCA(6?vCCX1&_+|rFTc?L?2pucN63g{;QH?yW%`2DMU$oS%x^>!(Pir@n(nWEtYngE*X{OsCr|gHXPz`=cIiz2EWi10YR-h*yz-kS zDATk&r9{hBiZrj{(`?FQ&8`%pr^(lH6mL{g8ln@GmZ(R`27H26tK?`-#jRy2HZ5Nf zT7e=*g+2>9)2cMAE2%3FRYYA;arVuANABfro9gU#-t6c&U^qmUdcHgFtX^< zgs(t&7yNB-PLXumUXh-0O%gXI#TR9__?BDRZF>fuZ`wE6+yefI0A>T&32rc*mgWkZ zunQ+bG<(kypUZk&vUAA%)7hS--g5tKTo?A7g5sGs`I>~T3tM&YgDPoiG`grUBm4-$ z+cU!7LHJ}w`1c6=He{qY5kRnxj41Gv+k#}$LlIqBeh+Q}A1=Uiyr=wc;+U@$E z?bTuLLI2+Drh*4-`W4$-;kP5zktLXA+4br6>JMrPD8-AzvbUgGlow{C@|8*}{ReIM ziuD)P2#jYb0Hhs&tg0NQoAX$>1DAOTo=2ab_H}LCOW)#yN>zy?C!1fdhc$<-{GVF10Qphb?okyy{&LH9m@>I zJps6*fX*{)Hz{y69XU;Q$R&UJlw+S1?ry>X{GMV@{&f0YJes2sjB+f_PQ_5@{L#ve z{2LycR@RZ?$T&%SN+SFCX``_$;C{$ZgrrZGx&i_-NW>}8MUrqImu6t>6*jCOP8;*f z>fJ%36tP%mC{kq8c{%>%8_A*XV9xd9OEfc`FhXza5Kw#i81d zJzM&x=(Ebdg0j#b9L5YyKX0u0%3m9$-rt5WJGtDcZMx-_O>&1ru_rd);_0v{va)lX z(ErP5MUQmS(D3(!p#pN$pc4Mh5c)6S)ZyMH$$9#C`Gy~D_-wpOL^jED)UUYu#G;$J zXWVdDRAT0_?b0hvTGN_!RlYUrgp#GrxM9tP{1wX(3X}-_dE?@-$cE19KuKg>E81kz z(C~KzJ$05=dV{<|=obw&PMBY0%rzQhyveQ!y#@J4;no<&F`;jP@5_edoOOKX1_#FJ z@(ro{U%hm4_a^klqma)Gx9r}mLmld&m6OnKV;b+BRW{tHIyzQv_(FMBck70F z_}|^&FP9R}DaSDeV}5w4vt6jaOKee&oNYxuwEF7ZAk?QWX#bMcrXN&eYqqHIcrdzX zPQ3Jn`0^PysPXbGB(?HQfs*K=$hz_^0iU|5vpv&K{1ea7MP{r}=4w%_kUw7k@dsfQ z2+QGEshBk{{6$y=bgYLih5f6dunDxS%)+`M4`Wnv=o46zT}qH|^_9i-64qMl*2G=? zCqnfP!vA>54}yKiMCrQlym0hjbnoUiXWhL^f)Cg<7gF4R<-Wxamga^1qNGD@5~`F) zDqlKCF}HxKo=`ArcyIV?m;<~#j1EXW(@l_HV*O7z6<4(OFJXo%Vcf$^aM-5Z#METO zee9sg5hj~MM9+344(hSxw9cFf44v8Q$$B#+DP}J2No?+n|AJ3Hzc7&Yc?dy-3h@y zQSPvONobijA~|ixr$)M5RVR`|U%>o+E7oNvFJBqD8Q&VLGsxcZ55s<}SRu0)BPiWc z^m3mZq5kfh!>iu7`GH#=B!6M@S;HxnH@&i7Q!jQu`Gym)`JngQht%`UuAd#cx-V2v z+kZ~X;QE67=hDTqSZy~{MP3Q742wt%{i|FTTO^r20vV3zp|B50p66OFh)r*LL)EAvD{p9QP-xZ;O1sy8ZHbBT#bgY+#y@9C`rje!ozv?Ru`=S6#Vs z&F-%L)pASC(huak)ynS6nBeS}lnrYzHi@Q{``6sM#yh7<_X;_o%*pOHA{di}5eA>a zr457M(~=F}DqW#6K+E>6JlLym+IM;2{DL)~sNUCSlRO<|$h8LU;903I9;uH6gn(^F z(vy;09bNQRx8leIh06_a#unwhXn;XC}FIH1!9pM zPTK9jUy`b`E?$R4tbSVPVKKW6-2Yj$t;8A{z6m*oNA53Vlx;Oy#YWs+SF*d4mxQBrNgdZMs;{>t#~ zU-hrfdSL2YX|=M~lGr+ySahY%64JwMYXXp38%tyLjJ=l!25wuktU6NU>6i(6)o_Wk zS)r`^rHC&gvT5d!D>es6_sD)M!)B1RxFAAvG+*`14=^)4?-t%L#Wx@>$?LS&B&n}c zs&C32h}%C#bCNm1h^Hg3dd3G5OVGr^+z(iXH{=e4Ev(I-Pho9>Rm;R`G-&~Afra(f z=Tca|SOu&(Sy&m)x7qqSZP_(1A+Pav7R&6^Yg zmgfJeBy+Rf`nPc5!h7KsKK0b}sZZgbH)EcJnjFT=ryx7BIq2(uQ7b0q*Rcl`eFwD}0#lW5RHX`S!p zn);G&8HFq7PnFBhv|l{d(BznUrd?E2CFW`Q8;%NE)8A)|9Lw{4!S^jg$@3t#>`hOp zQ(NS_1!=!+6s}tU*p_x%zsI#dc>dV8j8chcIDWEu<}~CX^l8ROPs0X+?b+?rgg!YP z_Uzs?)1&1z-B|AEXlVL^n$`VcQ$75NCci2YPtWw#=?61;^ngcdCkE^T`(8S29C-CR zhKSYGW%ptAGx*%6E1EmZWovliQj3EW0SkjIdS^~@?~fLKTccY%ez?`eCbJPpt#^MtYw_Kd-m){ zSMk5PvQ<;_O6xxP_gG=dH7!Q5bY;()cNb2-B*TQ9r;DO`%N=^W$3pb7ISLf zeqW?`LyvH1jgjIn_Xufl+mrbfatCI@Vrt!$p|u}kO^I3Hm7%+@*tEZ{M~jR;`36a1 zX?1p=%hs?C67*;H*&W-A%JrUGd>#3>1iIb*4ySzCuFv)9E3yWrPf_=uFpA$@*pxN+ zQq-Zr(x@%mkTtk1`j+9;U_H_=JhgHL|ChH!u0_nX{-9^i^VN!*Y`J?604#wSafjYP+>Rd0}Ght}fHgMWb@vl4R~vibh@L$VcCESdWN?NTUV*!jYeqC6=SEv!NZ-ZSX0 zceu2UzJE5#>J`k-q!|Z$D+BgYvg|#+PYH?As;~#GFt>Emsw&vNH-)KJDXtGi6pR(2 zu>5)Y%8zw@j>e9zRq@Z$H=dq-$dS#?w?8*SS8Pi<@|8B_ZS*!C*b8XPr7<=&-qILL z<1g6;j>Atj1?o;wWJ#88&$7>Tckc+w-N)8^d`WS3vF#s%w(f`Pg;rYkP{gLYY>qh- z(JE~EM0=JiThz<4wncWrPI*|yKFV&l8)Yh89FoHRgPXA0!(0mg7uCljLLKQAWc7~- z=ZcQq*q68mdjXPCwb&be`*UxdFR;D6iln@%p=(ukB&geL*`2?7cxtHoA^9OeRLT~2o-g3^0lg~>I%`OV zT`RlR&`wI%%C}ci&R6G<;!Dh+csr+Lyp_)rZ`Vq(hBya3jHnLg)B#Ru?*eujvZa?@ z5W;=05MDhbLcJ1=msBUBQw~hk8Vtux$6PfXKkS$6-}SktihGi(`$50drC)wnzfj z10_Nngi(yBnYsQ9v+*k(f60;TX*~bv-~Ubm4SyA!TT@wC*~nGH6Qlnffse31lE6n2 z_(%dDN#G+1d?bO7B=C_0K9ayk68K00A4%XN34A1h|KBA*wwz!6KoV8|D2ZCQpS&oE zy>LH;8~?8!@ejb!zh(G-1vuR;k~ju;0`5QHYT@>-mc)PJ+XMG|xU+DJfcsgv4RGIv z`wraq;9iFNA>2R1y$<(dxZQC70QUp9e}ely+$(U`5>{+)fqvKJ0{z=bCtH%FZaODH zRwYT5y7Tl$lG4E|ZrHG3|M}tto8k2_k;lD7@jcA0y`* z*oBG|OfYPu1UpP=*f|fS?JaTR%tY2v#Blg{i5%Pc2ka+#M5KXp-c8yU6{uy7i-!qYbF@SZl7;|mjLk-Ocdyomir zNC{lvyrmVt;Hvlq9A9C@mt7UFaJ_1mrpDKM$0C6V~SN;d8 zxt+yw)Pe5~d=bh?Ndw_9pg963TV1Ch75D;Fdf?eLN*Uu6O^o5}fnLBDn?@%%XooM% z_!L4ZnTN*W)5emUQZ==NVM_q3Ov3^U3jkJ@hABCy_hNUGe>e{kEX=`e3B^C0KSqjP zE~xR;>~p6$*>%|DBms!YNf$%7rVkS*dGAr{SU;8YB$iHxaF}qS3}5ROO?Gt_^kuc1 zba3@l)P8xY&Knul2v|)TwuE6z0Q09|WuQX3Rsx!ICJN<;uN(b@AyZG{Mo;o4dXh&H zv$-Gn`le4GYe#IaoYG#+XSU@-KH?T|>H&PI9^f4gANR>IqJ0K9^xc8)_d(^gG?ncZ zm5odVa8PMYQ`yept)K#JV1KhO)yg)?)XJh(4lyf-N_@Y790KVa0AcBcEes#Ne+>*J zjZtV}EI>>axV$ihN;DsG=yV18k0I|0;C7xDIDsEb;FuE5zXbVv)A@TD<^^oz#uT3wX&xNR zQ&~D}OqOFCHR{n1OeWb0&TGU;eQ}i!P$x-6cM@-U8oG<2txl52j>#x}I;U+6YXNLy z8rBAwDUoL6hTbC`ZbJB8&ON}n$2gx@I-doc&w7SN(@;M{70yXPPKD{53K>=im`KC? z>D*+_T}_8aCdskeHS~B{)Z-N-P*?B;rlFQ6kt`5Ojee6%O*{^G4pQtuj5#82vtl+P zCKoZy>6j)fW;J4{1vN6w<;X$8=>GQ@`9tvA)qwu>O&I;ML_ABFUnjmb2)nFr3_a?S zEUJ;8_I0`_j{N)jI%SL`?Dr17AKn)XqW5e_hj#{J1M%2CoQA+CGHLg)@a7G^zp}nK zRK20N<#NC7_dN}|WfuNh;iqf!k-m__Vh{!QH`clV8F5fvO2A(C7oXV0rV^7J&l-zL+n`I`+{T|XiWZ}FO-fT&(nIW?N zZE&}-ASJm6nYa5Pxos8|DrJoMie*5a4c>K%_*%;;rNPKDecsiaEwOTa-;&${ivra~ zV{JBbR*^x~85i}E!U-(i*RS~_{NMUV2!>zQMv zHT98N%IpkkW{y<8obFuK8UEWkDP+#Q3UCjD&i;swo3e%SA6T=M<68lD9DWbJjaawM z!FL+MtvFYs;JXvw5gF%K@%=Kw8{xhR7X$8l_+Eeu!H>C{(hRp5?pe4txOO<4$6Wf2 zw$sJ}UPD#haCmDxn15_GT0>cTLB%xm9}34PHayBKRHu;v+)nC|1CTZWc8rQ7VYn>}Uie&mUM2R_kPBm9QV<1UKV1?pn$0U0j% zI%cwWYGv)SD+;?;V;pQqrwLs%4dG8mucfB(lyP{NQPH{#xjIrY!;~xKxx24H0tN5f zb}@G{xTHR$H)k%moCN%L;1hkd7MELab1ucDQ{1l2ZJ$23p!;#~xF?-r*ELf(#WZl( zlE!Kthec~Mlf$*C80L`jBMv8mtL21&Z$mNljPc+cNIbx>KoB}%L32+@%GV4V@G5fL zE%aB$Up2?Yf1NFNX$~vi%ke&r_i(&7$JtU2KF?)SPDJ%gk(pQSDZ7>GWHwRl%_geH zvx%yf?QEH-*{t{k$9Hmk7su~I{A|o6vjS?ROSrdpw0Hj1>qZ^>Dr;JXVM{S;(xKT1 z1=ArFp@5LBG`SGoNQWrRoOFoNsN!WvUBV3@`r0s3{33R6xDNHOV=Bo|o_BEg4h1@J*H4Cp z|5(3l|3tNPSty-CDW&oJbz`zPI9vn#wQ2nMzz<&+zYzFA;4ety-wJ&Hb@B6oPb&gX z8s86mab0{b@b3fuJH8bEHv>OWc|HCo0)GMUcct+wfZuvud=K#N2L8r0{v6;(uZy1z z{7T?2N#m=)4_p^t79E;d14=pt)qwZ9DN;3{Pf3-SYCya5dL>TPKxZ1CYM|}9_^BFb zN#j!u#IB2#%JFZvWR1G91r{qI5(0N^a z88tT9dvLfAtGI)(2+?0J{yNyU_B!sp9vq&Ccn`;9^Ith5-hp_h*j#sT*ddN_hGNBd4dVp-pyE^*8+l9?`9+jpe$le(>6hZhiA^=M z@q+qa=1OK74yHkWGijI{%Aj#Au4*j#cu}_N*A8h2Nr}ovf5+EUBWVIC$bPDcPZoWG z>-eS1#^vHZk**)oBa#zQp}%9PoWJ$o9l8fy>J=pODpceu(+IK#XVhDteGiyTCsmb?D&*ht+@XflM-u5 zyNDO{(HP%YKsJgM2%}60Hy~WlhWkHXAHY0t!?|P<799mv9wmxt&rxw_sh;Z+J9+5zCA3a*Hzn{F@`?LVq_$GZokD?`;wFSM?t z@oa8Uk@gyJY6qlc@u01TQsrr_CIqx|dMMovq}x5%T9ug&c750#+6Lc$;(p9LW9+~5 z1X;M(oA7WT=n(g6kQaw-PuNdArGH;I#BG2zFwFIY8~CP;qHWL>Cd-dQ%tXAO@Si z{xLPN=$bVVB)MPQR5e-?_i{~aT9>McySOHPJgz1LbI_d^4?av1fIe1VoQIH%nlal( z^~FS9pvWO=QTF2;|1S8o_n0+uH=qX?`XZp&JyaUZ5LiEHmnDP@RN!nUoPmCDBU?Ce z3&$gTh;K^A+j^*OCIUvSrFvi)(zw7)BjZ;OG^`_TM(Za4EKv;W6IxIdcR^`A_Q4b^ zvhc0+*+dxMPr_1(Sy*H`v{kUT zl%XBH$+8YJwo|{4W&PJy=+3mP8!ZTK%U;!^eGF7DadI4~%2c!&HSDKKttmm_=Lt|up8*pkblAhjw%Fq7Y;KkK5mwBnZXlm@eS~~XICg}JhEc0>O0e3Y9PEFy)pdr zhRHr5gX)OO5k-HT!f#n!@@v>MOb*(x|4SoZii6iYlvk@~EC*W|x-|{;F$XcvSPr5k zqa3V;f0Toehd5|R;WG!=Uw2VnD_o+9b}H!WF2btYBLTOBbMzudilZ;Z6>=PQLty2{ zE+ZXLk>LScPNU&rC&f)|^OP--7g%D_KLy25RQHjVaX7uCc{;CHpfe z5Z@J;Ta{oxc$DvOn#OXbA&@RJ74dCg54D%}hGAEQUZhi~oZ<-fgHwEWvOhCD@x2e} zcOrd?Z`xZo`R?Vt=VrE)pyVeonxw5JYdLOhMqD@@x18fzGvcRgPQuMuUdKDVZe;|9RdCo^yxfJ=ipjmOYAk1jUN!L>?YKHQ)t=dK2^$79PzS4L6|ZQy`hC za%^=;H`_wbv_oI)RQBdzA+Syo7N7UziYRu}+XnR~rog|#Ew-Ta!0~Fo2F8u52em?b?zIJ7t^maoCp*dpL}Bfu%p&;Y;byR`!pt*=F=G>#ZJURDbsQNPpT)n+a;G z`SPg#?2}FXX#l+`tUvRKvZX&N`^V=}f?PbQek`p&OE{NMI+tY`xhzL6q(2oh>5n3t zc2CoaL;7=12CfQR(wj1CCtu<3sQwgU#2`DfsXrrZ=`cqW!)3;h{+!_*>0Urg9XM&> zkq#sX%KCE%Seg1$i5@hiKW*u>J2KL4Pp6G@TGAgusWS9ueLAIS=P@-eoK6|ylxLCh z2zmrlgKDsMP8#F`e|~H?q5QzggUogUXA0{OMitD~H|3c+31Fc`@GdslchB)| z^tp6cv%)Q~9@teo+meMS2Hkg@1dEl-R_$2JeGN8uFQD5wCHe@q2w~>Jc4EAT$M#@a zx$fk2DOwV*!M0npd=@RdoB~>_En1BhtsJI>x1qEt*hir`$Qd}4Tp?St1lnEbuk7js z%p+>B??LjgV|Ds9!!BOZ$O>*3e+Rm)z;ZAa?T*m=+J1^C*u_)W^{4MwfVB}=S&U_1 z7o%-31T3O}BGJ0fN~w)fn` z@wM6<{#F4`2Hq^jYi2xJpV@oLIewm|@^>!qH1s%SjJLw1S4w!ZIsOLiM*dC(-ag>X zWW4!=H$bZbd(SM6cWY(*%>rHv@B$@NwwK{#)n?T*h00V~M^OF35)C|4zP&j2H7Z}5 zc!A|>6VHKK4X{l49%8JNe6d(!`P#&KtqVPyDcx4aNlDixKEu+riB(z$a7@{5WSo?2 zZDKjg)+QRXH-IyROV|h;Q@iawCE(X4std$Tr`zjL&I z0M;bN@-UVueILgbYg70;h4zS>3K{E6Hq&C+Pv%%zo5Wv-)&eY&sEv04QWC|9Q9veH z5=96tNK)+y`r6f-x)JNWaRy1jdnwI*#W?PdTPfJK z3o8fOsFl*Ln%r-hK0eLPbS|#}*W~_ctmdmI<6Il_l;VCo-B6lt4KOjY;E|HvRhxpd zE`>Y>x3WD8CxJEejSSiP=tT6XSoNT{)YbfW`(W#;23WO1t6K2VjU@cQJSmHK-N2^& z7G85p;zqy@0R~&wLoLB#jMy4N7(q!y%k*I8ocPYW@E$w;zUE(D^nYu#t#<2RjM$8h#WNXkKWo#PKDa_50N84bk zuDWmp48dZgIZg*W>&gR)v&UiYeYu-z+FVf6Kj?L3ngWhN0aIR5_ zz%7QWgA2lWAX`|8cn=;kDkTJ01Lp(032<85=0fgXxIDOgxPyk%lA4(hX)?wToIJ6s zOTgid3Fd5M`whGYg58KJnj=r3vuSaPQyv2Tdh+>EZ;V|G8#QXmf~{cKFMTgvKCjcd zuwjCP^5HKigeZtTYW%gNz~{)pqj{cul*b6?5M~Oz3Sm{7BKIj4$hrRWfwR#`} zw+8D7$G8~|eaJQ?V^==~etMZ7p*EhNQk}#|_c5e6!(%{-%TC5gap?n>y9fel93Z^w za*5ppaM28!*q>k;l1gU**K=xpc zfyd;`e(`qT_{Z?g?G3nQPcpWCe;Xr6jLA**k&`s?_6t(x`TVAgEr zC{H!Jhu2>znQ{Mty|vMr<$eTtY$ZJEKd)1>u+o8}UEJo(nr$UNYIL+_x1tSG%{FsP zs%D!2HOC05S+kv`YIX&vQq6kDa2eoSQe0Ba`k5k)Pk)I^vu0)HR4@&*W-qX&rE0bp z`bRa(?F;;m*6a~(om6{Nvz@HPshVwL&2C^mC6(@D)bLn~bK_Y1(}{6Y4;-uqDxfr1 zR~W~K5JnS=9;IE4IV&^(G%2llHVCIrIBf_}N^9QMs6@z(I;Z(No%=sR5)clyaO*4E z`smiiK8&Rmnjhogt#F@l+3?CUy$@{@+wryGVV&>dd$GVKcHlb$Zap04OjuEw>zfIr z|4bRHO5AhVjq|i#roDpKoF}m&X&Zd!37TCkvG5K7uY2&Fm0N_##eBvz*G#Wq?UDN%s_?g93r_;n943x9JS)o*oEA4;>)t(c8g^4j-l-dTRLU*t;Ywam~{x?9lx z@@BT-P4jQUiQcU|er(IJH7&iMM8)O&ycYmn4~;PE;#TZlzi|0Yyd6KShkb*sPfY-9 z%P@s{2JtHJWw(yB>u9HzPDT)1#fhn$G0;-%Wt(Y=uaPDnv1Tq4kju4c|Ey1Bo9hM@ z?cp8n326>B%6Z;k>$(@}-W=4wVp2<$9p#xIHFftpC4%Q%mikrn^Hg3Mhlppa6ow^8 z@J3LMWz(2klR+1|%IoTb*QQ(o%7u5O=uR6)7j?=lF-vz{qPgD=-uKPY#icunesYZ( zn#OXAas5#3oO2T|hI_P(R68fxqW6ns@gUiDyLhefdVzCp8I9$N?4lj6SOHgITa?sQY0 zW7@}fT_;`$zo#FAbcU`Fe6)p(Z&ehV(L&O#Z#;FXv(Xl^&+6@(vPU_;ehXQiJ+_4u zj^i$~g@pM|jgmq4FSQWEeZ3Y!<-$D5Y7<|=X#XhJO_m-tuB~C?+s6^UNpsRUT0&|c z`}ow!FQ83#p-s^39I~$6hPJYUV@eS-nWcEO&MR0`(;AxAmb4zEH6X3`SUWC!Kl*fS zZo0;^uR+5slh-Pf2W2u(hiBo}bgo^d@vX+-8!L%HTbS;%oWrS+z(wLXHt_ElBhK(C z5^6WUL+Cg{sdn=lgtv1GmDJ+vw3{McHR)wmbXsi?1D^VuVSiOgLw)ZTfapO&#wj!&e z18K1SFU6Vh9`nqDq)zBDQ}q_oOu#&QFq(?$Whc{j=np4HN4Hyfblc^i{&SxrQ$Ni1 z`bzG^w2ZFR-llUuS=`^6JMk~Jx14MCM5G1gh!W8Mc2kV`yH984|60mwtu-bqkpNLdL!$RP-k@iJS4?`kwNeJJp|8+!Dn zo^LYrT|o0#R%3e;I<+P`Qg)&Ss}Fe-^+g&*btrP(*BE(;d#}a)xewW5#H$B~{>Klm z&HvaQB+8|&zNkrKN8QHFp9R0Q1A&#)mn_@78lhC*u^40S4qg{Z*zZYcM`j;D8hveD zr+#2;3Ul0@TQm)$F0BB~dFe@Baa?=c9p4TXavgNqGwa}Pmb?Ch-_(0(=nbYE$FzX) zW8&N*lJ)rUc5cyV8yMea<`!kNfpp6nPq%ie*#>Uz&gV8zn4z=RYXdps+CZkx&Mmr) z*G%EoWRliR+OLwy_wl7%ggOiJ(j7c6-SK}p>aNFlKH54mTie_sSd)2P=g<#~kbVU$ zZQDC?ZT%YCJ}`F!C-IE((wHk_MR*h0(qQVbUl%x@Nq(C0%(o^H3acID+!J(Y5&qMRDfxA0Z~ z_<8;kis_lA|?r-(P}&W;pRcW%yAsJYMw zr^Ug)utjxL8zySBHd~0blb3g|{xKt-B=;)kN_G2#7-<6QrgsPDm8x5k$TwL}zQMVC zGlPb&uc7kAG>xa32J5Dm&U7aRGim&d_AFr419ZmW@g8$+BdN9MdE>_4aw)&clpboR z!hMjcYO^L9c@8Voi6|wsjzfXqdhoD&@FA=OO|AE!7BKE|?Bf}6RK_)wE3biW<-AsL zUiHDpIJeIrH?mofM5)J*8?2kK^L#Rc&OVg$uhMjAwh=cPEIP~5bVw(N&SHjaMeqBq zSRKpEfnS9tyPSDi)1j9b`}>6ZfjYYJOLo>Qv4HV}I`ahGil7#sb82q;w~vz^8qu@+uy=BSp3ZCeY`H#xfidUIzzh&Sf;ddFj74poXvC}Y8a*D)n+hk z>!Ue*gJv4&bPsMFLuU$Om^<}ZxZ_;FVf~40a7Smkv5TLoa5P_~xhqCCvLEwpoz8)mF-COp+~2M@CrNrsc)n@Z|28>Z zde&YjX1ue}r*8)plAwnrNKzj!!+X%n;3XA1@`@qo3!{k1}vlvZWcoHjX77{QDR<;rXjw*RGHpd5=)o_1|B)T8_Okt$9s3 zhM2~v94iqXtBWK@1yHljQgZYbksN=-v&ED?k{oGvZ}#gcIi3N8dgsw{k{lBZ9hGC} z)N9GHjj>XiNm6WOh|VnsJLYD5hIZ1~#EpQO`kBp=hCS;#8cO5u50C;YaZ67+S(b-* zHfh)IW?8D1WN*8MEO#)bDNDS$Fh(cOA$+wgj{`bZmWO!eeYGrUmOoaO+c}5vvTSDP zs4Um>3Sev-#~cq>)fXl7%;pUql4b+LNKZ|j3?Q5sjApcD+V!ho`k_Znoixw&+?Roq z(n)WhESs}91v4r0Wh0^9ht|5D=Z<#$r4LCrPg>G_;luH|Ik(-;J;!gR&a~!a(?QAH zwUSht%~x2I9%o8hElQucE~SOAN0FVO40OU)T~&jli-SDoz?^+XF_%lFb)<8rQ55|j&v`FkMocG< z_T3~(fd{Fou&lkp)$lN7NaaE-KnsFqRR!T8W zE2+7Vr)gKuEKitY&H6>2Y)hsYK9xpUMy2^H%dSrM)-cbts8Q{_p5`P|=S+#GYNrw> zUCnWY^zDK*Tc>iooK8Jjv!=X9%dst^9Q&+VqH_El!!yfa%G)dlUQ3Es`kui(GL#;( za38Oyn(TOeDaNx;Z(!iPKo!mzHDd%5@YAmD2H+njy6M=}8L_`*YK`fa8J85vVValF zn@}oBRs)|6_bcc{(8?luJFSA>Y@|0!72sBAJYEt`w;eczi~}1Oo)aRR5xkRFq&W}+ zUzF|x(_I{#RKcq-I5)ztCt?@Z!cG9&u2Eh`I0ieqI3Xw{guY}L^BbHBz?^~4oo?ed zdFcKK&d%|OC8>0Oc02oHbhZI;bm}F}kU%izrS(jVQ#56ySes5!h!ZN5qH#Qp_7958~{|11JsMBFO<|2UGU;KalId?dl~0eFvXG z*}=2I6!un7Anay_W@4{r+6QFPynyQJSqR!~pfC}AHLZ&<`ZM0sg`F@DmLxt4CMbr^i<#$D z?5YE|7NE1Z#aO063#_q=>?##J>!x!(q?ag3v_K~4#|DGp0O3X?5^~X-kHG>JtyOUpvO`TUF?d0=-B1X5h@y;yiTB}(v!I(ta zxt(91-NrCepUw3ZrD(QNG>u8ImQ$?2JRK!xjifXDn1kSa&YwX)V9}x*Pc+AmNexykaU=KCf_1ie|RRHi0mmI^&tnl~!dg6z>!`LoSZslXX6 zRf$!q!iU!w3i1=K#yX&DMy^8N+%=cE#woYwa_;roD>$SG{xcBQFVP(cML1tQ)P+aSkQ$>NUl6-CGpJ@5w1> z_jBlX4bhVLi(imzca%SYK7igSejYb^^F<6Axphu``wPO>S8aPJ{!;r(a(-WnjkJcK zqOV%S;<0uU7EZ%D)37CgDJ-`Te4|t==Uj_wS(?HqRc{(LN_E7YqI$t?gMRcPO!sm( zqkWxm+fa6m;m0%J3Bc=1wn9of>6OOzn2a7{t{1X!S+zd*c#vy-dwEK}EqA4Ay*Ulr z2w1At*QcS8G-fyrTb{-YO#3bJ4VC9d9zqQS?xNZWSfNS|6{2=1&Xca4l5(?leEc=M6PdNoUWa7YJL0t>DqY+wbOvwISCw7>WMMfhpvgeD~-KVCTVU*I3>+(GD#DE z0dLNL#{jP{*@IHy)FPxAfHWH_NSd*A_?_Qz5)G*-i7u#2NpyZ1rUI6dsFH^I(wLq! z%#p@4C5l@hEK&VVlIS@rbcRER@cuVR^uRqSeearWO7swaNuqK&Npzty18GG46gn6LQV|>%}4A1vqC9+=M?c{Ob0Eg)|RvW?&jIuU`_K0ZQ z@Z&d5u~)}<+c_LScq@nF999tC$l>*A{0N6J1Ge6dwk2K{ZB5Y|J?L z%lxk9Q^m_I_S$5~LuzSPf$>FtNa8CKoE<;5TL)AuD?K2fC%8 zrg=VtK928hSApAJf*?lY7#jH!?8`@->GKwu(ovoSxhcs~<60e05j(Kk!QnGGn<1H{fIs7hgPO_Z|y@M4KL|t_v zoeMK#NClj>;bu9#^t205@Q+_UL5~R7G{ESDC)Uh-_k20uAB?a+&hRk%V@|>_-@1qa zy8+PTP#pb68D3z)xo}9^+##pCwCDk|q*xHN7a%{Bo%5?enmK@}fZ5cnQzmDHfYST1 zKF;kN-eX74$Nn?yAAw~F{UiGg^e(-VOfLL*O&0AP@Z?Yp_}JlOK5&-_WoH`|wJDrt z1idy6d-+TSUdF;4qLm@}MGYc0gKm}vZjc07DB=tkY7S=98`&QSiuRa=B?&q&vYO$o zD!p;m$o|pzY{Z*3%GSz225s0r9JaW-9ks|Qs;XtS4v=Qc4qHq@AJU6Ek*Y%|@8GM! zk?th$o`9)4hu|}H=bm93bY~C3rtX-fLs|KS_c-3u5PJEr4o+HtW9m)|=L#*ia7cHi z4F4B!uuz4jL-VZ|(w#=8ozk84IJrT(Q^OpXbr}YXbZ0)-&U`-GL2tW3$Jvho82&Q$ zm!Q^UtJX+&3IR+uPWIETKkC}@!={sZM}>7~E8xkY8^Om$$Efa@ud}<0j)q8cn%L%+sX40| za<%3xu`GL}IRW-xtvM>gP0cA`|5(kD&G<2z(-t!IW-GVxQN8(5h_r@uv?9GZ)4b2hV8ImbD5)NaI_Eau9#(}7khSbh{{|Hj9XFSsrcTE@~#E- z8<-L--=N-LQ7U0rCBqh2u*rZWhaLv?6=SF`;gEN5WrH0Uc9eBfK!Q&?sGwZgaG33- z-&TJXelJ`;Tp`?KxDvP`xXo}rIP8!r@5}hY(LHjMnl)`E$}bRwpd@Z`Y6T6@x|U3C?-`W#^&Yl(R^_U!_g8zzY%E?A;{2c?m4)Neh2OR zS6J8o6(##Oe90<)m@&}4_zZ@-=r_PQggEp(uzf}sy$AkjpP%MC^yUEeKa~&Qdg16E zJe~QA?Zxlf8_A)sC5MObE~&m@SUOm_R|2188{CKYE$nzDB02O$jC5^SL80tyGu+9) zMCV<_wl$NEWYpz*bM3IY7q^ z{0)~e`eE&4a&?Z^SItOamTWW9AIBa7be(qwXoc6H+mIe>pYS6ZY6G}t+1e22=eV6r z#k5_b&1LWy9$APyfAAsgj=^Gy7fDDeWEnJ5uH}^G&27xaGg4NM%s|TchcvRB0Y_7~ ze7Ax>tn0uZ?g*oN=I#dZhj%=@J&$Z1*aqID}WC#=-{24i9N8Zz&DF$c$!Qw2Vme0T68CT zeo!@ky-7yTK|D9Gje&TkeE~1W$FMqfA>P69w8v#k;nh8?|9+jy(97X7944Mma`-sH z)-Q}9{2b`vbPc#JI00RQ&&eG6;45PeaXJAo;&48ElbA!)0XP)kfH*`gSsXTjB5@ey z_!NhQ%pq~)VJS5r*3ZAThS#sckR^wS!%7bOnI7S*2;ZTBL#CI?&&%;7b=k^KaD2d$ z$ZH%=^mZ^k&6&#YB-=j{947i*9L8D({1g5@4!0rP>B@#YaN3t@0@e?ELQ=4@!*57k z89H-C!f)6>zStG)blFc(OcVdQ6zUq3s3oCa4Wm6VrH4UjMViuVNNguwQQV1F6ay=; zV#XJ*f*m#cRI~Rm`_!$#idk6Aj1|LeF02rci;0ID;$b@1xfYm>7UuFay#;B!`OM8b z!17yI^BHReaz#yB)I7kV+xBgkftaPf5xjblY6NdD60ZinCa<*DV)Ag3d%75~j$2qK z8S7@yHtl9453-xh0&N|5yDU6<(b1%~Eln-X)DpmoTUcAuSZmW*s~Jl+PcZUtK%tMt zUGI31>Nh{*SE&y`c^vESUP1B=Njd(BA`m*zE@L6;Gs<_<*8)nb-)78d@R~Y$2Ar-!v57_(T6h6ch8UCHC?L!gj7cv! zQ;%w5wsKzp4S_uN@VG<2f<>?Q5&unAIq-X=G5Wo)ZCsA6>2kb^v;d9Ma?JGgVunOBP>px&%eWi`C`So%*9EA%=*J-{1-l5kzLthgHx0uEtPCK!}er%HaW!$SFiUKOsN?@YrK^p4)-yt6?B8|{$ zvK}9yF*PW77q^C62{hlrEh8UrkE5LvZXv=cT(iGwL2B^97D$>?Q12wi-o|V@gahp0 zfOE@&4;)0)BA1YEq20`P+)|`c_<4^u;g*2%pW2e`Gi z0#fOtSG>0Y%dL&@+#n8$+ElWf#Xt}G04xb74VZ_B$U`mQJb@FX2qT8V^m~#ROVS+b zXz`;QYS?d0ad;g2tt=~Gq&Oryzscdgbh;FWuK{9mNLKz7hb^FJa@Y)d;1gIThwI@Z zj`mm_uC~IjF^3r4A=fgT77P?g`k~=m{Ki;3NH2$0qCP;!iuviVn`3By+F-jGetQxn z40C$S|6mzbFs~VeqcvV?Efd}25IJI&!05U5jjzAnzBf4O=(Jg6ofhR~iNo#P{R^^G z#Cld7ZqMqg%DUaKt+-LVL3qdNr}dqk&barMPdt^vC0g%%{&4#pMqZfcNyq9-{`>6F zcIDQW+VkD9_MY~m?I(Ok+aI1v&fE74_CBMq!V0kqywUn2wI*2&K5LyeL2DISlU8C* zMrVjgx2Ufn%`#UK=G(gKtuqGb^`M97N6em`-}&V?hj5x4mLrZcR}yAAbH+|_82ONH zenz^~i39Wk9B0na&2%E2-v!YC}|NqWC_uPAF@4Lm#Vyz}-nEs@+_i$&JNg^9QTZTq) zr%SWRrAb^yvjUn9Vwgw*A3TxxVh zGC+I1fpx@^ytPDtk*4=;>rv;;jGNQ!tI;#L*8q&XH1+{7Cln)^)Lt;xfJrH)A4~z5 zIxu};98DB2w}|@9EO2`i_ludLHM{_voQ@MMZ*bB!z1gQ^*=b&R=um ziTBtvaFW6yMyaf>b2T_gq1+g_{JfKsDsYm*qwGsWY6{KyWS#Y9(p)NJK|m`i;_a{x zN3iwjIJaN#wCK`(lWs!UQu)Ux0_kA3YZCf^k}Jj!isTaBRe)$AXhRx3!E<5B!tIyiVQ! z7vBc#Y0QsfCY~P|eCC~z!ArxQ7qk2Ii;g&YFTr`){d(VZ+5P&Vxmlcj?dX2}i5&L0 zixs_>R1SN<#fpZ?Z`jk_H`mcn>Aki(#=6hdNf}zAd-Udh(j~od$6VQ|cXS@ElkzH5 z-4Wj8p>52~YK|l?c&#Uc<)?ettyl|%qmLr@L_4@>9*(z!l&&6}vyUGxl%4rnV0n{U zb{T34We5HMsa&r*4Wc0uQ=NtnldgODie^njYrxE}JaP*QIaRtFGUmJn5`C9MG<_kX6%~$UN(U@33d=K)qP-h}PE~6i0o|hRKP8I&MiCL`+ zj>eIjY!kkT)S>4WAKlXz4#<%YjPB{j6enx+_tI-9geyN%FhY8#Mjov>$GeiAy24|% z$%>1GHY38MK&&ubn~W{%jmQklUJRwxQ{YP^()0ukIjgmB9iukmHSuS)7B+%8p_o36 zePr;bV2(I6F6Q@O`V`}&aAa`O2;=Y=UrRZOJ88r^2zPT*nfikC-|vlPNeQ4^em(dA~}{f*x}lM z@-+>Hc%S3!i*u=`AoV2r0Y;?~=4|<9_(tY}z9MtB47OKc&LUa=yl*(T^4lfy|Ehu1)VY<`JDf%CzGq$9WRdWWnBIxqsQt%0e)8J#V+&G zXzYKJ7kfA_cA1$Z_L^MmL5;l({PJ_p%ywcQDw5bUMH2f!kxyffoO{8_#(um=Voxz6 z^uF!=%yja80K42tAbEc>FYZ0pjpn=u8i~96x@^w3V}qLmf7AJUKi171Bychs_ePC- zlNgnAf^7OQ|yz=31P{k2#)?^`OdU zMZRkB39r9m$YUPCZ1#A~KVi}mtWA6i|2VRecJck6WlRt9(ieW7Y3+UOri#Ps?AuFP zxrHbcnn`)ZT=%svm}KecNa+n3?|!HbMP|HtaveA9Ih49uaw+Sfyde`LEYIOc&7T>m zYh4$MIIeQzxVq%_rs8DPe2K&7x|oY-ewfp(eRR8RBY3YZXe%N#ccO9&I-bKr5?|VPHASGLyb-Uo*FKKX6@blAmm)=bYnE6h+ zZztX6d&Q)CB7RWn%9Vup`AAdpUFp7qbQdSDo4uH znL%Bb?=*hnf+x?d1hx3x&R^_=B_O7$9CT>&xv$ORY_Ys$JY}`J= z*q0Z^)p=ofaod^amY*(zTO!Y`KI^aK2rnU)_3{d0Pc=2di-@jSsOCD`SMtqE7cYKL z-p_=}>$(~>CtTb9^&{8~IH= zT|``EJwHEPqH&5@ddYj~N6Bwqdi!EE=kccTMrME*9h%Zh1(#mH?Yz2`b4SNlhUJ@a zdOZGpZa7BG{BVkkB^*OI4o!YI#l^3s%jG4`yjaGj;N2-Labp;p8p7ymt}$(EF7LesHq+MJrWG5K@K%=ypHp;Jaso3x}PmcYBpc(ktGE2U#gN>W07xG{{4 zUGV>NO7l|#Pu3$Nrkri0txPC^CDLJ$@_n-Ev=n=CKP>%lW{i(pYQB#Z@R5HILp{iXVwjD3bSs6@2%wYSK9^O z4}&uWXY3`Hp3Vf>849Fsv<&ZWezGa+LV4N0zhvxlmjb=P7vs-&^_n@$&aw9Fke4@} z<{LrRRb&JoOB?%o^{MW5Ibn{vwx&hydp=pVsOZo-dnD}p!TIFU%v^MW2Tn?CD+f%g zu`?GPs^Frc*V>!TClenQy3RYZRLjnhO8dWaRDnFI#f^cDkJP+%G8;lMd$!pS7B_Cr zSj2Viq?i2hHq;NpZj3ABHL5z#LCJx!A0Ve+xD-M^IoK=j%KZUeBK_wA^UI)89$QN*?q=B42EMTf(CpF7nM3|`;E|Aj;0{dW}AzVzIwK(L3e z@uk}{z8fNZhrsgM{goD9<4dI-1*}raub6uH9#ec!Xu#hvt*rbCG0z_=O$$z9oK})` z5$LT$4KI~XUp1rlrEH2aM@2>{XI4s%cxDCdD?DG0z@<)Mg=X$4UYeP0#c%fLnzf7_ z-8HOsOU$a`*32w35!(Jp5PsNDNAa6443fDi|4jb41%$$}&^%W9&ZSvM^7O z5@UZqGv%zb`+1tWZ)a8x^v6dASK!Ao@fR2V@$AYiy^l9dHvf?c^ei&m0`*4qf^~0{ zESPq7Lg~6UrcGP-M(MP5Hzn*x6C;EBaxryiOpm)U{a9n#kf}Z!C8l#3$;lU7w`Vep zSm-RZ4n)Gpr7L75+74{GO!tJa{L@yzGAp1DhE(a0*b+@%c2N@XM3b>LH~r$K_p#os z$5)^C;%~$4s@E91cDmTmYIJRtIa^R|rn_|@L7in-{YoroEfTj~fX)k{tQ+Vv>~w*v zIvXth%}Ggfkd%)MzBHUIPk*}l?ZoG&zMc5&7fxE{#Z$viY=-~XJE^$ce3d=!gXXE` zK(j%T_SEgR=-KX^Ju&9#rI*mwJ}{G29v0`60 z5CL0>tpM5zOz{)Mw9sdVel|Vfs_Ixpx>8{Sd;pjiG8GIN%j2or2NFxk>n!s86tY%K<}ciurL^rBJ3Je~iQg@~G`=o!>6Lbopk1^QQlSL~ zGl01U^E%AcE-dbFtI&J8JX)`v&Gh$fv>IcauWpYNUi$5qFijUR1-F1T-KMNB=_R&> zf6OfRna613yPK-cPAFdYMpf0iH;Su_{WaR{$Y5wh`pd{*%ZNbZM=H+#E;2Is#E92= zNW#(otE~qmKKkp(V1v>n-&~u z!tHLC2K~j@8qyrJCrr4Qx(i#8>Cc#WUjDdpJ9-{4z3?_$PJau*} z;|2DYhMkoDpJ9Q%H|*zs-iVAgBZL1wJTiDA{aE~T4_h)1p|>h@yIf!W>g&tHh2Y9Y zgl-#hTZiUJm*xef>EK+-$l%3cp?NSzlW=KvDb0PuKgIQw(!`+gSQh#ASZF=QZnV&I zq-@Z9%>CD@-T9xb_R0Lq%wtUAb(1!~H|YeQSymSD@s;see6@U)d=-4F!xJJEJ%te; zpZN~oGkgVQkpN#ApO3GB&)^>5E8`0a?E%xn*Ui_($L?>RF$W5ILeSRnh52Oenwj#3 z7N+JL_OZJhK3o`Dp1R?1Aaq-*>2OKtL#f*jmxbC=YY&ePeJ1sZ!@@OvrOy9zOp(tqVbHvqM#Z*Zaa1Kpc$aG`5~?oMCpLiIp*q_1|N#Xv3T#V+(dpqtW*T&ND{ z1L-;!S^#uidcF(I0}7|-xzHS-`RQ60ngui~JR2u6ChH zpu%*e3rztUIVm+Cylq0{KE6-zwe#K2_es7_@vY~3fG@$fnQsfxnAft~`AciNlB;@#hPVYKUla6Gi%5z!Gg!SNB< z=Qs;5jINXAX_s-|L+f1l$KjRiF&X&xV&UOUt(hld9ClWfCg8EWT|Udxb*g=9(=_|7 z(rNZfd_$!h+T-_omf!wHY3V(-r}S5>$xq!c6n`%5ZEsbq4{S~EZv5SR?%VMoI9pwQ z#Q`Om-PyzUn07BC?vk11?d2uq_5|-&BfZ>7y}2m_f8+V>x;L7O_nqyZP;fYMZfPuW z)0D%e&U?^nZE5nSe|9!8!F$NlZ7!8uY;GzpZe#x^+|K&lmOY?EQ(MjJC)=!j*o#bv zl(liw@YIBye7M1mlzP(l@ITG|H$J;GHp6&=cGyU|r`i+LoMt~t`h&e$e^sfYXWKji z6-^9y+Ga{Rg$F>&4S#I9+KEG6dobOMiWG1s$-zi4X|1zgy{`4u;H8~Z##}1OJVPdc3?El~sFSnQ5k9teZJ%LGfqM&;D%Q25V zQm|Y{mH>4cV9c=hn%UIc9BOW+nYHt_Yum3elLr!ygpHiGd+N5U;Sjs|?{-{lZ{cDy z+4dA(Wz77Flvz-o>bmVG%gPRR;eKt&wcaOI{_`^L!6$C3H-%|4x84-!ze(4a$Dx>F z7ZsXCg(>f%vQ*(=-=eD2xWlv3U%ah8HY?4lC9rkn2V%TvXkI`y=>xIKv}nD|HRl6g z0P+&jUt^AQvDX%V*2O;Tnh#;xXccVjHM4lNq)S>OEw;9_v2-?-Tk0Q`&}|yXq+4kG9^6eYM)XW)=1iiyeOL9_)83 z-ecBa{~-3D?KMsv`%^NnIq>NgTLxBM2cKM5sCr|jN?sUmt2vJxnB9+dQ*1o&$f|303OH`X7x#e(d|98u`xH*JBH>kdx59l9q#O!&tAFA4xZ4C@oeCS^gu)$4 zFFV?Cg=3{Jcfb*rdOFxOv}@!_Js|KvoREg5N_d$fg(GtIQQ%V!Y$4fJ_^1OLc77D@7uXj6`xV{? zY}xS$J7K^g^I*kT)F(XyT=&#|D0e7qfIESG7P+7LN_*_B0?NIk=ogBKE2apJxeW|b ze*A>#UGT#iMytXGxKZJV;|^uL!eNEugk7t!<-i91U*RCIWj`8W{S0iZA0b6y^nEJ! z*7lj^tB!5uV%9hoIuZ*5uf2#ndI(cIr*HCfZhZiG3U$s2Kl07#!2ekxiToP zLdkxohqU$3_O?}j6>Ol9TvnqaNQyYwo$%Yk)Mh6-zO4gN5((DsQpa~(k~Q~QD8xiZ zkG4vlU9*;x3?AUH>JImnNspXpSe?`aVvAWRlN)Lp?IXA|WB)pF?coB<1)I0NF8l3< z5|p?^mf$6nvMI%sdhtwpO`#`74YLnurn45(esdxqdOF#(A3)R2Z|{1ioHTmKEBoh4 zyBk^wYda}yC6?}DDFa|MV~UvL$|n}guQ(T7Z3p*`QPVp^Kx;FMm>FrmxCB3H`z2%QNJJ`-WM&KutAM5*oSwxs8Dqo??9 z&^To+-dob9FG-uf(cT_!t9gz#K@Zn*p?{Oxoi4Nk=oe{RS-(4V(8c zrmCAK(Y}#(kpfddO){3jOH1l!j!FH#0_pYH5~UB!ADjA4_e^ouBzncXcc;Ds|Lb%9 zoz$;Z&7Rdo*&5*#1*wmaB6`7Pskib{Z@Hx#(D{EcI0FbIhL72uT>pa?&q@p zm@c#m?Y~09XHSU{9RT+CA3!S5qq+-Lidw|xfjjffG3he=BKzgs&poes=s8`Qvdxh) zHp=^w*0Lh#H>tJ~Ykksi^5o6b`&tdT4<1UwYq>1E77g!e4KMN@;mIj&+0W-qZ^DyP zKmj)d__TC@6a_Sdat&dqP|9j-icT>`NeF4i4Y}*#C@?RFAEU*iFDx#{Crh~^59IXI zx?^{zM+Wa2^4mv7HbklW(3DhMP2a&HyW~=lef_0^bdl}96tJiArqi86CHAIwxZAhm ze%39W%T63Fw0#-)BzzW2dC=#blUH&2yvGWsjlFr8v0hL5M$Z3=do4Y@R98#RB5q0> zbc73QI$t`!_{Vod$v@}4ow@yX>T)HRpo_813NX`=GlC;09^{6J=RLCwHN@*X9bWt2 zS-ps4K*o>Sx-w?|WzDR8nEAy|7k%5|0{(oGJAZXdzJWE+qt^SIA7hLx@?00)9HVve zB7^+Ph~J+PE{b_A9M(0uGg@1Owv+ReQp?Ouxv_s6{hjfu#QO!LRfHnrSv_s8uEYbT zmJq%6J(T!c^eAR&#>#1K=pq@AQMU<64dXjAgT&E590F(P4`P;Su4ToBOiE@IofkM! z9}CK=&HRq_+A!Zmz7f7I`292{8pIZ(lC=X^c&I(hSo=AZoaLc4`me2 zQ&@PYJqmXQgoi>afjW9j=6Q9G;J)2;$G`GWn-uO4_W|L7)+^lZz!u|x!fPBD|1Anf zH9X;=mMGi+?C?-^z$1g-ps&;h`lPK9W@V-DP!$Rr-~h1jP^L1=LuFhZ%FgjnCzOXu zJ3JCCDTRfHI-qc$<4)*%74B77c&J?p_c*YDgHyN**x{kJ0snvHq1H^z=b<9p z)(3NA?AG=x?8Uu>Gea{)K;2 zXK3T3l=VL+3cPS&1FP%et7@8ScAt#YJaf`HKkzzvdW}zbVMdA$(LxLgugY4}8(NZ@ z4@Z1o>a%IMnH(?H&)6&+>M8h|3QTyjIJtwD+E$U}e^ZPle!G@2*lYjwJM?VseW(bt zI)S#8(AN57)(!I7p@g(kxxaWW2B>0`2O-wyLfoXIQ?2@|4S8Pk*>59N_u4IJ3D=LD zNP6oE^j^|d4Qq(=P!ivOo(4B=?Ck5rC&Gz&?X~!-!at)V^kS}e*AR_x4Z`;rGeBFA z^WO2jBH;-k)$@g}7f$-_uTeWURY|Q+o*xF&aCanE-zO;lM(TTkVdT5xmE@evL_)8* zTWa*lQAAR+(rDYu~yMcf*@5+Bw*3p-}yYAkrqmGMZ;%O{a(B9|#klp=#< zJeD-(hjRFd zwO)H)=6T?4uItMkNuZ4iEnO?+`#EZFh~DM2h=x=pE#jKg%JgpNT3lbsDaCyBNa=fz z4T<)@j3~5J`q=x^PeW_vX!kM}`0OcKdk+ka46dXf`&{}Vt-TY>9pd{qP_@?AHt24E zZlm<`P!arQpG&h3nxeGS;2t=4F}E?dk1+Z~3w?2^$N!}N%DI?B)a5Po?e*BDA1Bu2 z_v1CWetbLqc=CeV=*O(1*SxzY$8U4`F(cHwT%{+k&AHdEky>v9c6xE}wR=}&`*5KB zn#3xBv27M%sq-wJ@cly_R-<9re{}Q)z4kNA+i_+Y=|k;M$_c@k z^4juxkoJCh^84Jdxv?TvOIS;CVR1)BjM`TpleM?b&~P8VG%~m}uea{fv4fFTV;WK} zR=978SGaGdw|)^{bG5f}myPz;K5iY7y6&b&OK*+&fvDf>sNZ9l-};fq{0rZC>~ep@ ze_*~B569?5%i~}9w(V*cZjEx0`@PK4a~C;*A@AM5mvx9fAzT@*Yo)#NcCO5n@MUq) z9&~OK?tT07pQ)BHLFid2z?DHCfg|j9PX=3P9y@E|5ZGQ98&J9mC)V@-u-J)pfL1QC zo*C^Ip?MnXQ82TJHLYvh$oWrjK2zeAej)KnzaY*4>2qV)U73xy7i@!z?NYk!_@Xo` z>8EJOKem<=w})AYfDMM^OvpyDg@r@Y+ynKIs?`d$0(nDnF1Q7o35`p^$qRi0EkY^k zgq}3jDrCW15>LR}afs7xhqxQxT=F8hI$A6;pn$p#(IPy^h59L>t_9^Cn^(&{VEeUx zIO_=AKDF;tyK}qvXkG1)vL}7nnjEdGP0&kSZP#1Cvvq|wu9lf_1hTrIFSw=ClB=sS zus#=CuXIrjV`;9gEH~Clb#-P@r>=Zpq^>H|$7o%hp`xwqW-w-9CI#H&xUMC6lcyWT$Rj^@uGjwJD(@Gu666VhSWR>eLmoQ@5_-LQh?_ zE5#b2Cr!>g+M>15@~*lvDzB?o*APCWu540z0!@6WD_K9uT{r<+T8g}6*GIM5!|ftz zpAJ^mM@ZPvF!^=HZ(p5}a3p1=ses)#RBWGQ{$b@sj?-Efe>&{9AAqV~sbszUs;p>i z58?E&qVZUAx5=boDDu|Jh1{d|b@IQ9(`Ilx)WvSc_1q8XX>#hdM{gF8P`Ww2%kJBY zUh;5)PxvF@1szF9OwPY@TLC8(?4M=4X>_#g7f4Twrl*edM6u<|KbDX_M@}L)nDo)I zee@QQhU|S0=|vCj(k8l9dO_<~`q;7Gk!D5%Lh3^{Z^^+?YE`5sDPUjd5$>zGFXOY9 z={O$Lw&o)qZsjL0Ay)M4Rvj#~ALKmBcP}Pf3v2LXm{NbHYR7UYpnMovF>tM9r<)-f5TYLe>+)W6JtM_)J-I$ho(b7ku`QX}>ZLI{jb?CGasyK;%$Tu2KSj zq6Gd3Ri9F638)-HTJSzNEc7KPfsfOBj<_>KR&F#Q{cK(tNZa2<{W?8pCtS9){lxQ= z(cFpFuw9*!W#hQ*b272ltR3IsKi%YC z_*mDax7oYem7HAXJ9aEtb#*1D1FO>k%5w^_4wPnnoVv&HaZM($cC4Rj^@Hw)<*Zj^ z9VYj%`^-2q1wJ`GV}3{R^v-2hNG?j}cbL;ljd@J^@PZDJT|buWJ$?HX-b0jZ)3wy? zHfXr(Hi$H>bOF@Mpf0ZNYzn1A+>17gP}aJkgfl_zCv43NXW|tFhtLR(B%0(ko`zgV zVK*f4Az_Ignoxzvr<{f;%Y_&q#G&fTQ^xJHgm>3VH8(SF!R$+J_C$Y z7UAuOQuFy`T5n!x+4L0|8Q;2d;dQy;nJ-IdPU?!x6=)DQpS!Cyag+Zwu{WK6)?%ms zwX3Mt`E336agGxiT4+%!AF~w9oYaZriRl(~IWPTEQo{J#Wxm&5N=gWS%PZsg^z)$~ zHztG{Fg`*UUoRmPrbnqq29KbTWN#KePR_vyFDGYWgnzpexkF!aTG%AxH}@rL)QmrG z<}#{3ObchV$NZ`DgP*aWN9PO9w9z}$y2CRL>``pRXat~r`HnLiICqQvDDAO|?JsAH z-G!D@ZPL^gLcI~mN1xsd@ieUu{V>AfZM_co>x09C8;9hSow1&vq*p7pl(D^$TgPN> zC?LFFUG&Pjj1%`GgTEhg!WAEnq)Y73CC7I>{p+ZX=z2!ZW3{J63)$GKFYu-wF_otF z6GAq`ofnH)%@y0-7yaoU@%ox*WE9(9y~yap%Gv3^C*ZqB2A8?1i!cJr8g}Bko_L2Z zI`(=uo(tSq_Al=^xCPMqT-sV_f9KN9aA`}}5u#Ng6%v!%`&CNRh500TXhj>Ki&cP= z{_>1tej4q__=|F`dpqMCv$&pVY5DpI=}0nowqSyn*D|~wktH^$ zEO=>U3Adg%CmCz6pV?B|G3~>}oD_I!Sq1%o%jP+O!WdU+z;nfi3ucW|a3sU*k!8W|k0Re^m)}+*egfTRKox z)^Q?PTYMr}Fw=9%cQqV*O=&!+cP@y`yVI`U7Gk z{pN;j`Uk4#zAODF$fc8hx&KGfpOXCM(!al2(!aM_(!a0z^7Jop(=S>~mTD;7$o$Do zGf;DNA2W*Fe0_i!nU$Z){$wSgauGspRJsiNslgW||4XPpSx=3I)A zOAI#N2SGc<&#uzaCg&dS>EtG*@ua4`nVgRv{sVHZYz$2)G<)Iu(7paJ9AS>`O}Lis zQgc7;d|LEg`0vtnjF6GWU;H&vgHp4}V^61L%kH<&nJl6W z`OgL#6PdcmiR4{%{zE5{mMO8zFNy}a+&>Nnlt-OGu4;V9W5D+SHh!xkDR%*%V^1FS`D7SrKo4z<^adZPIdgI( znW>T7ma*6G?CftMER{=dd!Qz9^2JkcZ4M(PlXm3`%_F?_TXtM95nt6zWMpmg<=o|( zTab~>@n14;*EQB|pGA5GmcNp$Rq5E0Jh#1>Xk<37b+@Q%I8t-uWLW!MEA2q`WKcd* zo@o>NQ-$XJi;9s#|FL;yW{Lr?rkuEN))7Hor_~A-s(W#~u0@(oKb93d@enYK2>K{u>pJ zIPPJjWD18BmK~W|g)N08{tAVI#eFK>WBpmxPb@~^1nC*jy$zfF4`+Yogzkr=b$>*3 zT#hK5Qdq{+0}A&6x9aV1dll|g*us66!aYi_`B%70VBN3Trf|Z6iGQQQaR;`@zrryG zCcM=Ow+gH}FO3REfSvuCdW9>>ywpOlOr-iAd+8-ONOo%+?Uf46VVT0R^Wsx@NOx8e zF-kypR?av(Eu`Rt!p9w$6gWFKuL3(eFS2tZBZz1-dsKVHgZ7HpRxbABX|G7n?ateI zaYh}^2iR8_(}l#s?G0n~UD_NU^a;^-;m&;WRfkN@V>e$ky1N=?MDo}R*o_J4*i=6? zyB`uN+Dv{bRd>l_FTOZorj*7G_BXlHW6?}{&;j*frplQj9k&R5U<%N~vbX4GH-`Kd z%2-p#SYy$LkF!#cKHSF0_ejk#(v%>4;eFvQ?4P40;<1w#VwBraZt9VFy_YqQnA~!v z^Eo>;|8}FBd4sL74A`ZRMTc3nl=wH#>@If*3zhd_;TowPn(v*q%=*#)oq&|}BV*)k0Th_2ht$Uys2`M-2#s3L^{p>z)za!>QKjn1QFTK_4`MVT?>XuHHn1au*J-Z5 z0{>XR3UiOhKFIkl4MFyL1Y#E_zKGe)V}B32KeK*qbzP#kNC`7u#-}6Sr=3IbpM*&s z^roQI&X@=s)iDs6iliNQ39y*5voLZ}bgV7flDs=Ig-^~Z%KAap3$lJdW>d>JTjK8s zpcC+Wc$7M738@L3_{;G90sAW#U!h&|T2m?zT9GQD1@1^ZMXHfqQOd^t(gkM?KST zwhHwQDW@Fu=Q2_=9prVT#>$LCnwGd}LMH8|X|1}hb<@N=6Ti{=xvp9EA)UyUA$ig` zK1v*CRB|FIdR|i$#1Cy2>KaW^4bnWh&vaz)R;Wd4<)r^xnj+czD?~5lKQ3v@0U9~^ zS<2DNn&n~40(9yg!t}8k5}g=-sD!q@Cy={agYqX0yu;?mL(#d)^iU9?rUCQA7x_eZoM(1J@AUYXG3kQ z2_#k=v};)*>z{Tvw%EKNxj3r1cqLh(ch{`e5Z8_gu{9TBy@nWhSBMpE zh-Gew%(t5U_|3xaOFxs{Ch6ZkBYEK!0b1itnF9NRi~>7#_h~BQT&0dfzJq@Iab&tb z&lIHn_Lnk+c6TOVk6c6sqH6)U^R#o>@7ZUl^!efiw!D3_M#B(k*7lqvacgDG?`PT;Z{TX7>D6+M5B3UwTxihz|PFDUExlFbtc%PaEAj! z$sREO?FtM3wpQUa3im~5PYOqY(Jcux7AZ`dmDvxNaT)(1r5FCGM&U|_-eP^KaKNDl z9@3tcp%)Wgkp7_XDTPHV)EP;R7H9dpSF56g-w*8S-zdCKVb#A;csH=a-|bYmTVd%3 z+ZFCqSkkvi;STYy{M~wm+Z{MU{uN&1z?O{75`WZz@xMgj27#5ot5Y}x?C^Irz`u-o zJ6?_oZ)fZ~hTma^rB&rP*dgWT1|0s57|#I9%y1&7opUtcXgH@7BO1>AU>K2dJmNkL zqc_JR?pCCpmvXTH2-tHgZ}6+nTA-jjPnw zI<<2n=L*3!PVL{gLTyW?1|GgeZQ-fWhofo>P3?U6CbiW}?MFISiDaI+J3{+cy`y_n z3&+?G4?U{-OCF1Jjq&fQ6ltP)1}V~{7iI5O_HaekP(#0-u49kHDd%c<(KEG%*}EBk ztKlDvy^&V6PbJ|uGqMUdEVt?IE;OebO>ZVj3H3}7jYZaUiZkfr>`+Ww&8d^D?DWMN zMw$e@LhYN>-l6u5YDY_nQF{FpxsTXS=xY^Tt8Qzsa}U4<_L3OSTXJJpBV(70lo9x9 z*{8mRF{>|GkJRgxWWCC+GILh7Uu6fq)c-Yi$BNQ$vS3yz<~SIKx-WSbZvly)QvUB! zpMC1n!slMs=N|Pbm|bAx9GvVk$o`ecSn9u08mZuu{qgmTpK->@J&d=GJUwCL;i_|Dwp**!n49XPtIWUw%Xw|`oBWn&1$c%GF;S&nWjB{LJeXZ6|q#d^aPrw(FZb>ni2BoOaQG^t(b=-sWeuXO>_u$Kv@h_szeD+dvH1^Nf zWiH!~{pV^An4el>~Hb2l2y{}AnyTt>du+#lPab`yCL z`&Y3W&OJSW{VRf}uD4@<+@X&@hP~6FkADgK7ae?TEA}mFk6Q`sk2-eq1?-!!%lz|s z?Ei1G53LmWgUBAgK)M6=pGM?nhf_Hjos59Kx^|t5?rR>Mi9Y7ow~2Oota)^{sWY6$ z>$oQmv(S79%m?!@i;T<%tMV}KGp%55%fp1tEm4s__>ezjWtdHQ?u*T`G43BncKLxZ z?$?iTzb?=1D$bnkIO)t(-?=bBXDt8450C=1k2WsBys|mE@p{bp&7B(?Fy}S*Z@d0j3fCv<-*4b4=Zz= z@UX}EPVp522l&u-v3|yvVhoq@`&G<(#w9dgESVo=E|IZa#(32Y+{>Pw>TS+XO;#}hltUZ_SYX8_(1EEXTPG*gxX&NjZcSW|H^g!CGdaDe%W>H0~+BjYtMqhgOASMuh=5r&%pll z)^E07JrFPWUoGE_y`c8U)qAo31bedOyZ6d&i^%=`#?%^acac-kA!g5j{VMluaPp>3 z-ZBf=-NSOHyR7B^9^0GADX0BYrkv%5XckCQ?V<^CPB_sNVP8OY7iGu7GjqIBduC3+ zd}6q}S>Rs||3kCDFAWFmj}3p#ofZC`S{K&`hsEtP!{e=y!M)rKb1^jm+mErmji$=V z;m4pyvT5Xgi6VRZP>}NzGIO%SHsaWwSl0}1(%7~WOL+LN-B>>7#&V;EzfHpr*tNr~ zp*7SE8tT1ns7|`C9{!Z3_Y;IvI?Q^_K$@qE&^Xq>xu`wF`gvj1D0VQ-K!F5;G=Kb>pQ?jgop!))zIN@36Ul`iHs4}|C^TQc8fZ@A104cCHpP4$uDW#r zT9t*TmlZz0wJ-S~Ev18#*uL6oqyuwl1ETX>b?BAkIP=@cn?>cnoiQdBZe(~m_SP?n zM?#vK3u#r&f1TVwSi!yJw@#yNCT0g)X2&LAzhl769*4cm!A~l|UaWRAsR(sJ=moUOFysRtK(b4cVV~3aI*%bSrCdaNAIZaOD@g?nJfG2`jWHMmH_8D z9q~MdF2i21-qR89!Gx?(p}i0cn)&j2N_UL|H7{drm-8ES{XTc047zd9#i5hXp1V*O z6xvuW#7NE0<-UZx)Rg5?6Ul{`sTxg9DCZZx3;bwmf_bU&<^1-!en(StYTDS;9KAA| zKPNRAbaT6qDE`Zg7n1Ylv0hUtWznTV&dv)Dvg!UX<0?ETCS#h&!1NSaArhwb3PsS6 zx(*4G%!K*Z*o)a{{j}u6V$kc%bGNq^4UW(4hxYv?;U|cYN|%bX}&9jQHlR(FG;&~eq3X3WkovLOBxk=cP|MR zI&~_&WT%EV+Do?Q;L2PtIpNQ?)Q$RfL$;;1l}JnN(H0@SWVOD#v6_^O?Ik_m}`Oo$uE1Wwe*H7D+ET z>bA=Nsh7kx71Ur`elI!T%l491t;6lb@9rfDC*+unW%S0pUa}q+r!oI6)0!N-sGAozqJ? zl`h*$Ho0^inDjtt)ow4@rS|+5F1=)L0X@@g;Z85vflsHGbZQvL^K-oaz8 z^ys`kvL@%hMg7+Y7@cu<#=Rwqt0WxO=YFLQg7?(UGS0jIS-Kz3Z6H8I09n>s@TU(nXwDNA>#MSV#4Nje7>e2mLJCL7Dm( ztr0mxE%BaEnc0A!9;Eugj_JgE9PEA(oe(*r*Y1m?Sry zKvE+Kg*E{>HG*W$t&zCUQzPw4Av-HlBdrRxsBS`w|MD8?A15_p3{1X-tjOx;>)~Uj z(Q`F_Vy$^ScG1fcnHXn5Sw&XxT6E;xG^BCkk9jQG3~|WJ=hL{3B4>jKLhg10WrdUv zTG6_nt~0Gj?1c8H%IQQVM-NhaN~LNdvpb+tGm+s*sqV*hiq5P(IX{Bm1thUM=MlSd zzB|=-gN7WfVEm|cN_Q6g;#x_~`Nut-%cj9A$o{m4d&4C?jT*LKBy8ESmaus#o3eN0 zeUdUq-d6(^s%Q3=1bl>s!K$g2y9Owmqe#^xgp}?NzY4^jsOH?!PaQxq=FH612jxt_ z?gAN!H%DXz7FZTcQQvL|NbscIHH1HE2%Es1ILSB-4nA;_NKU6~C~adx5uJ@zH8nLf8s_^WZRKI)6w8o()Y5h$m_6V)-=p{0%ih7<(5!=hhn{QX z+&Egrc=)s=q3qT5tk+;i>L+E`3pSkI3T5xxZ#;S>be!6aKdWv(z&0zrNkgfYc8F^a zxbL{3U`OUBq3~LEd|aA6Y2y0<@fAV&b#PCq>px(79NQDkowqoxWa`2DgjUgUVYI^B4_L_Bc+%7@RO)c3<-?B|qDm{Z9gkKTt)XE-y-lvhtQk0qJQ z&E{pL#~w>Q2d69P*mz4YF1zTFnuoDTKRid7vBpsO&}qs|bY^PCWu?Kv=@MI+!Xgbe z3b&SsBp_jE!@A$tn1dUDjs44v_BZz4X`S4O6INZYSJBjA+*UY(-#%bt-9g@jdLPtc za&wNFy{@^(HFxt4pt$dHO?f$4;GMYBf(cb*BlJy;rBh>({*zF+Lt)`M;|jMcEIXPp zh1UW*r_fgei_V9fm4KtRmS6@Mta$ThzKEdo}_(Y}eap?skXPx9Nt1fy=r>kFOKF6*cl(HKvoDUMp zaZYGX+%4lI?w0A|vP4~+xR-#LLs%h~x-v9DR(Iq2zCh1W>Yz(Km6+*48nYS4&QgtY zdR<~3pxsK$wzluT%M=)6{T-`ya?9&WvS!!5qxX$#uj$y*#5{%DR?Jsfm(_<#IGvsK zDfGx~p_-It4X^IB`{kqP#Y7tD#67G^nSCFUf|AZ7(E zD1bQ`(_l`)%mfmdsl9hM9ZKHbgyhW{9{l?7)8xU!iB*w3P!g)~eMO4229OHq2ymb> z8WUH}QyrAN@6GMO?`FrnDlNF49Bv0V*$LW?e@EM38~#Nyk=4uF$UeGAIGk7|U%ON@ zTw-0Lv0C6-G*()P8|#wXK7V~K)=&;-xv^Gitm3~+V+|0iv*R{|h9~#^qNnLWPg68I z%Vv7eT9$U1p4z$1u^pY-@7i9S8u+4vJ1{l+MMrw!TbMXEZwoJ{E#zjfg~om+@qxny zm`4-Wy$%N>yN2)vHb7!5cky8q(qLIP>g&vFO49=akc)H;BgZmMp2a-p78G{{8~-h2E|$6)`1H;Y15MyW#H}vH&iA0+MxN$ z6ru+P?o^ee_c_I#0Jjv}kt#{=tE^pLMSrD;wDuQ1f)05C?sPvG$-y_lcGIeza@&E8 zxqA6NyDYqTqz6Xx8c9h!=R;=82rsdWV$d=nS zFj8)Ek3mO(Tjx89%%js^nlX}WFh%zH3yG!^?0+nUgI$BGl%{WT{s{olDv96{!R1Uv zzKdvt zgx7?sS`d2H8H5%#3~{K*-JbU{Ad zRW4os7`m&V+c$44s76HHPjg_tZwm7`m&FRv!6pkL)PM%NdI=T>M>B=5rG{ z0=MY34mHbc{|~qGu43%pqUMwTySe|~-$WCie6>0HQMt>0-NnZ){PgVj3FBYukBU9Y z-s<({SIuH?=2S?XsXFT^KFuom0HK?lkej)ufqCs> zAL)=iqkkqHLYq)m#^N#jx(}U^TE5Klo;hZ&Zyvp`&QZ9)}PS4QdMVse>jQS_4PU!7| zorH4a-88E4b0A04R`Wah(VpV`R7)s3tNJ(7`||PXvs3Y#^6?jDLBGB#u!VI}K0b2` z_%+}+Mzf=GCA~6|PjjIbns8NrLT2*3G-O)9*MRR#x2bPr$@mQv_aSdIRgyQ(dSK5~ zb|xN4-=j1hr8yBufInUth32^0k6>?0uTmPX()0x)(Cn)WK(kNnz1UZ!o0aAYrP&$i zV~2_HhkWf&`*!S+bVO+^rRfMHpov#XS;f_khTP^w>FbncrqZkqM4)M@?1ZL8?Ty%L z(ube{=dKBR574DF=AU#q?f~wSlZTh6hja z*2S5N!-IESls83XukGLAu@jggpD3drEazhlWZlHaZjtp7z8K$OzPQjNxEdIKJ$rvh z8hit^q9^qy_SrvxJ@b6Q9Iv+hwxax8NZYR@9ppM6uWjF_`1*Xjw*6Dnq}FQk@!Ix} zfX{FHLrCM_tL^WeHrn=&zMIBr!8sbI?e`Yur&`*6Y?{<(cRpTywkST4kJq*zo+fRi zJs+=azXtqgw3cONmA2oQPowobP~A_C>+2>PcY5T91NP9m}-3k2xweQFN zNct|NaoYaw5^4KAj1>H5yeK3XF4j%Y5YgtN3?;dKRPEnP+Xzmaw>>tNMU zWc}+yMkDfuGr~dX9SfY`!RDim=_A+*QifQMYWi5|au#6%yUnlW_F(0#t*m;yNW3I{ zdz5lFm;x{|U+q+k@Ppn^-#J5x$j+TNG=Vt6C0^>VPIs2JRF=Qp^We$>E6$tV%vcp^ zDQj^rQ}=TA$7PqX7tXl6dMs@*vH^Jw+GBjYuQzYL=h$5AjGM{<2CA7s<_F`HiNXaT zpPq*416N8c`&_QkJHaPslkvA(sdu^jV=a4v-D;l`l5>u7lP~2>F1A!MqZWG!xx=OP z{Z`6rJ^qUcxy|)eaI6;WY7KRJAe;MWvE(jVEIE3w-1C+;?jdz|a&I~IznJ?aBwA6RFXsu!D+s$Hb2M^-<&3vmmn+9RQmsy+CXRP88| zRQ2eMjn2Kdg6&c)?0m;m(kl6udv7JJZMn3fxa6j_HJ8>Fs3fgRa%n~PTGP5jsk3S2 zjuAJlHQ1b2SZM3)R2X~PkRM%XS?^h-nweMkJIXW%KJCi^FtX!kz?HEtF1_}I_{Eg_ zxWtrQ4Y_59($alo!|erfhsyyVN0Pwqjq;PbT_3w#bGN%MAUhZyOEhi0FG`3@aQ9eQ zePusm&;awY>_Ldk_&oElyvXC6!DQw_*IM*;gJ^=6bH7Re$wZ+k(tn@+d-R_XTPcI7 zV1qX_?%yLk9(!pnUW_oX$a7c6CE>JKdd`4!n z*q3tZvhu7aa2igMTY&GUJSIo)b<#v$Tz$;Za1!=o2}Td}q_ZLU32TpEAX%vd;AlCU z+4^Sku7&?(k2Lo4p2n`RR66A(Q~R+H$^B)*mO|r>LVFpQ(byAq`DXeL zw>bON?@Ii#yW`#-keW2MUh1gred-!&jL_G5FLRgmY`5z!>)@`-+!x{A;kwIeIDVPC ztfAMq?y@d#z05sqZc9@Nc@*KxC?tiIc`*bpbC(n%z9WC3MoFPvJ~oGv!lSOc|KnX8oUiOcA&GLK(I=dA0$cp2Sdv-vVQXI=l-m(g8iL~H92#g4Y|Q-2uYK7_Md zjgh_62F9^Iy%I&Qp?lpqw86Lua7>!{{!y-r?G!J>imBO z`)8uge;j)}>immV=!U5L&tyl7b2YfE&HX#?h&lhCj(!BZ^Z!6pbU>Z|_0br1=bu|f zZ-$H0HIwX9$hs*?niJ1|963Q>(YW7!Ow6|;$ZCtY17~n#oyrfqM&2u1t8NM0#--35 zhptcQMh5S_aHrA*47*9ORq7^TT#=Gj${f0?)X3nsF5U_(`$U}UiE);Q*~Dv_uydLS zyU%cQufFCIwgV=D-SeXCwa7Zo#~SX3nBU?1KA-HB$(m2raC`WWvs>_;x{odEK-oW% zy-C>vl06<-Gs-@VtQ(KJysxY!WnCz`)^dJb&LhDATb%E+J_{Z_BI~vvcsSCHo;Kzt z%x#znOdE3>=G-584Du}Ne`9XP{5)nC=B#HuW(VefCpkxg8Th5g?8JQP|K@FP+Vv>f20>6EHq=a;RK+_olKB91?rc+#I@%A1ZEiS*-oA^0uWD-ekw;qu<_Gan7 zhyA>QnSSmcbLJ0k+)W#ANJ4u3Q&teUHU?x;J-0!W_E&) zkS8;9+bt6lTacQ*!t18nNa;50zj&)}B0AXrEgsiX5f zso&4%1^Wf8zOjfb3AoF-}x!sNBp>$=-#l*FHYHO8p7%?ALKn zIOi2YVYg&(>+A>xjy0>#gt=LLw%}75I{W?v{q+^_e(OSMr{qUb)51W4ryz~XmvcwAQO_>G2eY|ulXI}(A7rf`iD+y&2 z>6)#fL=2~6h?(;>i5Wt#TG*v22}|@3B&E-0yv|#U^2vLQCrrBXO_R1F zyv4}Z%6Mil>xh+A#{bIn&keHc;W6W>gTA@JxQv_o=Cjw=VQYK-CrWEOd6Ari<2UpAri8C!Fja}e^ znu`+(ryQ6xN>8syG0*9ZsiF~fKq-QhaUX3ky*w88QkO>ymf^AlmjZT{iAOaC{RchJ?B^b|*lM|thec^e z4Qorzn&?{wJ?i31i==di+9?Uu_3H#GYm5;luT#6Nd!yodz#UgksZHUut1G!${mZ!5 z;`-Gw(DftsdY4|fBzbkvV@Q$WELw3_E}k;SKe$aA&(JbSOAm0|rTJNlVA5b>U|vwj zdT=6-pg!MX#h=sp!DoKlV(IxPxjAl+o}Wq-{BXsUF>b%-^#afA8j*$YKYsT2S6mtQ z&EB=*Q{*jp^|X#@o@Z7(8}GUGX~u;K1=E**>(-~^X7ph?Qo@cTh@n5<8Yrtmqjup@H|Ky6({C{=Dl@FTPPptS9|6f`0EdSeAoaX=W6<0oF zW_@>Ey4NSKJdC}Tm!YHa$-E5R8TVW9=6+^uR&^W3TMslxH~6jf&7B**68(y3 zQr;zeNYH+i^L+gq9<@H+9C#3|vF0fMA8qb@&|}@(+|NHNxrcn#N1CG#G3PaRK2&Vo z)7<~iB{LgZ5fj)SsyT>c zp)}I5KJ;m9Ev1Q$dqekQYb@>Scqr6{t)bL>u06C4TUV*+6t0ocf*pyw(svSyMJPq+ zbW&Fu%B|P}g!1uF6Skp}K5U}7Fi>JX7Y{ALcB&-uxs}>4(j|${-4?n^`$Yq{e=Q`u z6nba@G_L8%C6cPy*!Go3cr&o=(eSFU?b7fnuyt#AvWL(`cujiu(6*93Y<}cH^h)+g zOj>wAIr+xDgrUOMWEPGsh%oy`YTo9YF=eoTmxgB+@usjx{|n$UWmfatqH~%N9wWq? zzOo*?1fNmJcM;xVh|i1N$9GQfxQqUu=oVUhqWdT7Qdxukflt-pM{A$0Hw|B}6npaZ%Tar_K(Ki@*!)(~b^C$T|q_~dOG`<9FeMeJX0v(S1R8GPiT zm?gaDGLF}#=b*3r%+>|`d$wN5|KDs`$p6>3EaLy4w!Dx3Pj3zL|I^Kj`G0%!Rs4_N zay9?+wp`Eu(_3!f|C?JP{C{fea{j-*rHTLgEw}Oiqb)1>@7(+m{u{R5%l})6kA?m! z_3_Xxsrz{4x*g1Io7eOI^+cTigNcXuFWa2p|A$*Q^Z(M;e*TYaeTDzuZ9U4rz4iC} z4{!Yg|CQVR%zxcBZl~U_s{_k#9!Qofq#mi??#c&}(K{cIdIaiXFTmK5{j$d)+`GOW zLK}7Xh`qEjV=u`a)@be$1oCtF7S3??%I=`f*kb*U#M;=)cVE_I?6s_SQ7 zv5a}rBZEH}{*V7dA3)mg(cZNe+kJ$(9zVOMM&mL|?9xzA&||o#SzV6P)+N-VnEbN? z=!E(zJAkr_CVFL}(d_I$JVdS~JZ^o_@OV!!E^&Wq_}j$Y2rcj6LEBIyy}0P0+^17F zHNe=#Iv?8YP+3rUo&H}W}FmKc^-~Hxy#Z-pU)lmsTt9hKO0Gp@oQt)}{7< z#yOdiz~=JQ@|GJii3sIfC2|wS9`dWZ7if}6JtNg}X^(($Xw#KKdlVOk_ElV-C5?S> zmNIgDe@o=tJwZxY>2@kz!f20*!6oGUiT>IX_>(g!;_u7&tA?UO{k7%%t$|ManH%3) z;D_+n>iYZi7AIX1^;ehkXQ{t%E7BFt{i zYDkamf~rVMJmHhsph&4UR`hQOKoy5-F=4%`99hJ!+amo4tx(!iKl)~^cEnI3++5^n zv&p$5;?3ck8sUlX@T&F@fO$n{)bo$5>U*&JV+fG@p%@%0O@XI|H{Ct6x>ZHD)v z&q!+o3$?76WnJcI1-9fck^hIiHvzAzIv2n9-e=4N86iNx69^g*ZBP_cs)s>{ii(!D z^j2$B)Hp|E2=hJ=But8mh!vGyt;JSbOtrPQ+Dlt+8(Z6(C{_e)4~i1zL#A_b#_#v8 zz0V<_9lr1B^ZcLZd;TX`^Sj>lu5qvRu6M14&mLkrGtgC;wAlBn85mS^H@i$WI;=9e z2Fenu%eX81HO`j!zJATKb1}a>EWC zVMZ&XN6Z_1Q$hMemj+Vd;W0gQadI3mRx1~nu@P_Zr#8$eV7?OJ4$$P8z*u+M3CuIV z{LqFO2+R|}^h*{4(;&BXs+DcMx>4%|%92K9`bwIWSz02qKk{87^FR81N#pDsOzV6V_bS=t5>cF2xkrinEL)c< zYPtO)^qa(vpcUWC4*Od%YErdZ11|o;ls7oX&exBTDVd$pLqAMx3rc$q(l?Uf?*qRv z1AhzfwKn`F;Qs^o#}XS9{A<9kRW^C2sV^9|VG1TWn{Y!gv_N{LWN^2`6uHc?#5H_VU<-_sZ(SqN}X~df?dFR)tb+8zjVV%e?ktp=*r2e< zx2OSZLigMFi@8IE*D1Po5Njwnw=0~o26-9V^w3t~y#U-QaLc&3lC?{NvK!iR?9?mq zg-6La0sixY$Ai?S;PedsV1c5@g!keP?KkJ)l2LCC@k}2r$fl#ZP`-nu#IeT2T=4V- z%e%Vx=o%CkaDI#!q@XA-RWV4VQH@8KTtEqjUd#43`SYz&EmTllCw`{aat8|Szu)eW0UR-Bg$svoG)^FuY-L9HNEs(UBVJ_=q%&g7kff{;hK8w(nV zvw@8!^a9DrI%Qv{?29wFY6_Zxo0D-*FOX4qn!X+0lWw0$yg|j8LHr#ZQ^@zIg6i4X zcZKZ$9Ace=!THDwU?}wQpX)y5+!RlSy!d+7?d+z z^7a5SY`*L9=PaG#K_A0?9JQJB(tD&M2pffxz0yw9Ho}HtR-n#AU5~mDH3KycH3t{X~%Dm%mXsB-ga zcVTz<&{f;4k#$69NXiKPCT@go<{rMwd3Witxa`U}c)jOl70c9Q7nqrcoFY?SuTiWs zoS|pwVnRyPVKd>#g`SlXM|o) zou!Sd-*Cw5h5d$^mGuVZ<^Blz6o19wLkHx0;~N-=$T(lhIX0hW&FFG%KWDZXDK}}| zoWL5o0p14Yu<5cQF(VZ#+QIOn768dV(mMw!IXfM2Yj zYVem@Vn%|$Gt|hJeI|ZY>iabvKk6k^OUv6zeN0n0cYw1Loa4pCdpN0ZG|8B&TyEL{ zt(}x*goU>f`T_5B9^w_5qr}KpFnK#^B??CRy2$oKyebB+Y@qgwOX2-<(!n=A6%K>{ zZ3QDS&I0C5uZF~zd~tRt+hFx|c|+FPOlOr;xF~aIUBXdvf0bZ zJ@hSdCa~6*a2PmeDVOB44A%^CDS94a$5RjWiO2}=&-gA%D!Cybr{QO{a@H#~7H5Fj zhkCj1tAtmQ9wR8JQ%cx%WYy$7-IA6ZZn_`TGAzhlcQ3@C235Q&BHIdzDX%^6|vvjF7B3eCfzxjKx=CRH>ED9EESc;!}Kw*u@quYDQqofn_y9T03l?Qha1pVwG=x z3!lZ%J-n+V*t3Y?B|KkYm+`@?u*aGCBY6t;PHcv{A%6}j>bx~YyH|TWY5Z*oX`}tX z!d$9Xx_cAUfQpmTA`mVhYEOaqBM=oTAERl7`N}q`MGviwJ41(}iSRE|j?ivqTuwNd z!l%?4li`UGmoF8rOz5F`ah(?vjL>t~XUCJ_DC-Hc*+?X!kBqGeN|H{6zQuG zwGwzuaXI>tnv7;zrJUE>hD~;QwkmGN7Ul1vlxUUsB*U+96MhJ}ZiBx0hS2CKpwB%6 z?Jwi9UWM7JI7C};TP=Qra>I+Qx9T+q=mv>P&(%W-T=mM;SEXYDoeKBo-6u=t^9I~T z5NYt}p#!>lZ?R0Rp47X1tSzjXj4%uTDS4~{6FTF*eCG{n^r@)4wjx|#N9AYa@D0VE zki1gHw6t7C0M;b-$g`K(xa792*lRxdnOb)P;{s+EavvI8y)5RK^2MMHpKxG*ITM%F zLrqWE5p`+ja5hu;yYkJjzFynam!K9{%Y6f|l!C%39IK5Aquk)coe$tPc1kO0k9UWE z9_tQ&921OM=x1gk{Bv3kXUi!)8Lh?%v})aQivsHtMj2_jKJe@0LslD-A8vv$#gtJg z9zL7a@m+4a{wYf2ZOc?Wi{yMUww%h2J+yu0x1c2vUcy^jb+lSq9pic;Jek0=$HQ;NCA|%#*BRa#6UrMDcd1%o_tTsEv^YX%(;se7ok2u~yjUyFQi|BPTFJRbYik*D_yZ+bIyYYO+W zuE$@tc7=59C+Z8|#@K3osrE9quGlZqDLXuloi8JSATvhwO~9w{gXakmNVzxK89F2K zf`YiL^RAb_hs{5Pn;*|TAC^ocGC{BcrQIq#Df?MN94Ll~d3O6+;;i>TGUuv3$?24?fd#4fE=D(SN_mJ#^kol7~~J_!#&OB z;O@bmpJ`?O(EH+6Ve)lNW5PH=hw7*L1bkf?tn2qUL(V_{#gqN4z?Ie0l8s{Jo{sxcB3R2g@!LrIiWW!G06I zDvbH>17eqTyjIALIJwwbT8*E~oB8sUHe%nd!qe;g$*RAMSNHO9PXpn!L||)6g(twO z7W)mQ!j+xj^)H|tO66{h>4$!uPmUGt3U7LpFH^JMV&#@EW3F=ha9b^_6!+V~KLyo3 z7;SYVeYh<%!uUhKHm#A);=RCmSM5$yv-${Q1$k3^b>_RYU8$qD)vWQ&48LYO{F(va z=j07Fqyxb|SPkD|72D#uXehsjo5WVyS~`wuFtW#>-X5)^;vM&rG4B`(yYuGC0?W}sQ(g?vY^IG8kIS|q#3CuS^Zd? zskkc3<2|~sUGb;RrTm0HbPQ8?N3!N;M@jLIM6OZR|FxJRzpeu(cVx-?RewftH_%j< zmdhK*FR*Unt8A*>E*am|ci>mJt@V$ea`rQCRr@ItuG~MyJx7hU{?In;TbKu%+$bYv z0P_aIJlu|}pW|*RY< za|9lcG7c75J0H7>ys8dbimH{_T-2z{9YxK`e51&!o9#tb-E1qe>Sk+^)J?708IkWu z4eK$ak9&?b8Rs}#hLG1HaxClZ85x*qz{q-gvhoq`3HvfNvfi#zK0bUZ@saZ#p;ele zOMQu~#oyE^8mnfcSIi;?!&I+c@ojweX1>nS6RyW+r`nGY*H!cZS$hxH9QZfm@6z&o zKU4g?*O3^a2MDa*gxt`p)&GNgo75-V=2ws&QoE3iKSF{?^Sy)w5i=2FhLj99W%PX| zGxR(%L!6F4W=P$OM*DqE$qYS%%#h~Wg3J(KEGV>EGHV)2YfZ#@n@jGiT1-2YH~VBP z7_Q}=={jpQBg)A<-vr%AruEA6H}E+*OORY%jZaYR9f)g6upf1fZ#;thlJ=0 z$YFi8$(Y~Fjz>YLFFkh-eh-ps#S0~0bt76R4NKN5$JJM0q zhsx=#DyK+Ik<;l=YULCueR5htPTSw&D~G?yGR|66PgDClvL31mNgMLxmfI@FNItzg z@TpV~l^JYhg3U*J;Os)()UzoszCcRuX9p&CCHh2;U+&YBwR6^czpAF*ZybNc{-$#7 z@$m7&!SMtC#b_xj%r_{RRJa+LejnpOHn_~!M`gJ=s_O0yeGud30ZJEAdTF7I05Pk8kud_!{L~&%;6A+=)Rj-R@|lN^gxsC_ZqSP1Y!UZe z_&*vH+iloxpcML6n(eF2|G+k(Y$iFJNe**oEF+erSJ+}<{aZ4PC8biCoVrh8xr9=v zNY&EPv-{rG8uDDS^Kvjvq`Vs^=DasiVVwZh$*SBgqukC)T^F=!S@JQY#3r>;im;IMCPWCiaA8_L@rSq#~9rJ}b)Q{|O%s|QdN954t+trSe zwT`S`8nMfohSAbrPkq0QTlQ-zsejqS31Np1;zKkPm_B~_R>~fWv=3=Jr|*;0miFE! zIX!gRKMWmnN@(x%O=aUwo^L9~e(L!q?e$gLwNSm<6G3`QMn?7(w9tFe?rg7JnZcIOBJEnd2vR+wd&xlRT=|0y6-fc$dp-|MdO%M6tJyt3H4Kvspk(QW+DSYo5+nkOmb19K0 zk;`Z239MRskn9qz}Rg}Vy#cbH=^eYSfd<|y0&%u3APVpd=ZUY~82*=DJ2 zdTlfJG&l2L6;HEGHGcw6MCMVL+%>GskZp4QT)8=quFSN1ukB{8TqAoUJ29o)T9njC zvzi5Q?l;sHVSX7(MYK@=p04m$;Ee4^bcI{sCuVJ}=x3V{2@M2mzZq#SRjQS+r4M2Y$mv}Rlh$9x6TzqMOwv&<)I5dTgZTt*FXp33 zqg>9tt;fv9T#YHGs8(X;Vg`WE!(4(X@0l#Xl-EM$V&-E$fH?s3Ud(}*cVZS`-iBF- zc{64a=8dFRjQK6xC754N3U!l|J`^sh#TCeH6`IB+g~AJxVlP(qf@EG$PO!=Nz6uVT z5jq@~Tn$T#Zje{u9T=e-<6`q-o2hKua*fc};-2l=ThcRGRpxbtzm~kVv!7q1_Vf+Z z49c;giV}vCv_a~jEw?K?C27T3x&3A8gE=?7XnlltVt|D=kxTD{NA@=6I8`HWV#|rU zNXPneztH3#<#|t9rdj+#(}YL`-)nj2d5#l$Vp5Vu=+2n5yjjIEAE6x-SI;iQoKf6d zlZ}bQ${cB-lZ&gBIlj12nPZBZl?e}duJD-YQ;IuNfvvQ-x<+cp2wkFZzd6{#{o3H_ z*@M9K@?Z=13xh4(TLxRWHx9ONuN!RPZWt`McR5%ms9R!Nu+66fR$-xHV%UPiw@N>e9-DR1fFB?9K`8DqbvIA8R zBqUVGjL#8T2p*T_1x~$ngU-QKR zF#c*kk$9>dJr5nz8O6VMRjJ%ET&p>>oM*8Mw|RP~x#nr?v;uXjt)VgEju-c2!KHR% z$Kigwnh_UsgNmbT4--eY(D{7tNoBK~aFRK<RqERu?L~%DYPhsW2PO$%7@^n&iHhZ<~UqdNmMC{b;SwLH7~VbY*(jy zLr%u+GNhR_P2`%IQ@{4f3`c5l61A8Lk6^C#SH_%mUP;>x{c?w*)mEi#rovAqWki*6 zwTQcsW&vlVDN?A+LZp?4)`BGIr+^=mu4EPiwSGM}kLc~QBjaVV#b zKdKVtMdhMKp{h{hP)>tzR3*xb%0-PrRiVbAoKC_~l_)PN7c~l1g&Kzvc^5e!Dd!-y zGV4vDUCfb86Fx#9$6v!affuyTCshfZ`Jw7u%(|)ky}o?ArX;|Qz(=uev4#I;-(nk7 zHcgZ9Y8M!i)l63XX3Yo zcSC)c8+kQ!4CXrC3=Lv7@M5UMSoP-zK?tI&XtE&9HrsH_IIm&I~zDK$DXZX{5ne)=m zaLam5^{^V1J~!;b1SBje!-OXu-W#P z@|N%owkc&U?nX>9%kHF~$CFp4op-tZNBMK60du}hgvzI;I?TI}sFt6?0H=W*PQ!)!vtubwg8*KlXwmHN0pKiOS+3?l2 z|76?rV@gWnZTC3a9An3;!hLObiriM(J{7jS@!ITXF4_TX>uH z3?f%utVOpLz->(+qSvG_LnzY1mhc+4>C*P zH<52T-(ZpT-sTcM@e8hoi4Il}zM6``Vb$IWN4eFCVnd0wp6EVM=!=Bg6m2HFW@<#m zTzpDQYDW3qbBeFLyP@Ux@eAKXcq!f6bS;dEpk(hscr(JMN%P;*GO!Wo^TETk%BL6} zCM!*5Nb;)7_AYIi+}+x#Mlzi|Ah!cm`;}Yrv`e|+W!tmHX548hOG*zuwcyBZy`a;) zP51Gt!SJt#oG!7sO7!5@Lptx^G&)`2gvYI5?`k=HZSnWq-w5e$%EIZc`TG!t`x~9+ zh0HjCO3}lmj{J&7k2bb5(tm8Ie*V~yb_cU>rw7UzXKYEHO55}mSF2uFTHL72{NiS1 zdW*e*k<6WCu3gFO@ht2znsXmUO)PwWf)#0947mssoIyCkazE`T>PGlp!t)ZIu7>(6 zJkQm2; ziNqK+fUi(fp`a=a44@Y{e2QpRI& zUy5SyU-7k%VhS%)_Wgv%Dg4b*s5r_Xz5_J~Rfdwc?T4U54&8@J-%~OSdj;xDR3+*f z;!a1Ud9FqHeFt|9N_gudQL^VCdydR3e9ZCHJ3IN%SAiObdW|(gGYZ*N-%J#%AYUCy z?l`^-u?KODYSmti+h=O7wp;jBvR3k4srIKVog2Hoe%YffLy5f4c+|PT%UxrfPw>lI%t&;oH=CuOHKXJ{8tG>u7bN{y`lyV@>9Yb- zKXvpeZMc4>7Fre2dG%rnrRvg3LJzryPnuNiqGaVHg}2cgrnO zTBYKIRx{oVG6nLi!lzIBH(?$?vs@II~vnl@ge$`TF{uC@+fHIq%|(X2*$n@!4_)pKpeequGwX z>_qXMRsIsP&bm)`gxm#H_qt2d&XkwR8sRipcYNK?SWu74+Uu+1tb>$$chkUgFJfge zQ_1km7|`8xo-S|WWwll^VoX-jz8vb(?a_h>dhHr(~EJBHJtXm%u~vF+yH4sJ<8+&rdX3 zC$u{prP_N2zBLh|FRqAGfa|3cS!I;4L=oberLH7sz=+gp|(60|nLBBO{4f@T2 zYtipicM{wYxEcGrz^&+a1#UxsAaFbS{efEax$0(u2LpA=|3T$%qTd?`DEo5dzXJWi zKm+>Rz)JLafrrrN2Ueli2i`_s5cnVTg@NCpn}Oe>FAX%KFAlt;{Qsc*|ET=mRsMfc z{(nZV5Bx9syg&>3oB+))G&}GfdR^ds^!oxk(eDX-fPPotFX**_57BQA$V~~e0w19_ z26m%A6xf5_5ZH^pJn%8P8Tc#u(!k%)7Y9B;Ul{mQ`R`Z$pDF*(l|PKo(CR=N`l`S| z^p$}_=qmz;(F1`a=*t2}(U$~{p)U#?M_&*Kp)U-aK(7z9qt6R;pw9_(qR$R=q1Oev z(eDd{(eDY|z3;AlckZJHu=dormBZr{E$@SAyxUq5`RPw~maXUr)+ zPJDz%A(D=1Dh;)Na|!8m(I=dzz#qX!&OMxjmp-=Hl21h1NA5J&b}* zY+lt~h7!hFDU&ysa&J+Rr|B{o7aSYBFnB?5Oz`~RdBM?OdYf^T_%eo3j+Mc)f@cPY z<3A=-8-hnhF{FefFLvn`1q*`(+&$Mf*e945%njxQQ(=?R@dVvLSI`-B1d*9yCLkws z;=I~jrS4xDmv}+upe^D`gg;5h3&XrH#rK1m3*RAG$s^}l^Fq^WUFJ>t9+8L}2W&g@ z0GHN>M->I$XgS*CI!D`cMXE{)B8!+b37~h%DB&Q(#gDcJM`!Tx{grmBIav*LI$`&Z`+g_!XG)y^;A%9$!75W>ABU z%CEKD4W3$W`rBWl`2X+_;OPlZW2WNeRTFM~TjA{1$hQqnuPG*O%5yy7R(ZnVt>Md; zfrnp+yG*&IRl>=wNrh)dEe;C&TT|%WZ}Yk0n0mQSwUC_DFRHDX)6bbRm6C@O(-l|V zlwHHu>=^I%iqW2Y#g6eKVx$g?R{LF&TYZ$fg%&Yte9Oh}J4ab9VvgcB3QchEYUrUE z{v%vF+_ku^Ji*Pw&Ddv`0o*&>jC{ByKHNI;bgU;$`H$Io8AqsfDsmK|=^ilpt?QWc zrswA(U;6Hgx+doy4f{ zBghI9pUFeoCW)-GbD~JW?@)64(t}=O_uu7X{DgA^my`SXjLIU;3UG>y+1VCe`bGAJ z_AAnpR{b{EG2m?xqXsy7dZm+_;s>?(hYV>MN{ZFsfe-aS<3u^(G7gvUjp0t2Dh$lR z(Q=S3e5tzHpc7juwp*1g7u$D&H-d*dU+np3IaIg7VX;mfI!V>wT#K}?op6?<9m08n zo*jzICuI(2sfG~(w^c`QoN#ZqMy5&!^zzc)N7A!5fY+k72x_+h!FPkVhOL}$#%-vx zO)LylKHwjkKq$DGq$=%GOzY-3c`;ZcCKX~$O)C%%u1Pww!GKm8Y%C| zbQWhdY9pqSlQwMUYCmgwb)x5eS_7^t22ozKMw{b;S~+tAZ084MPAl==RPoLx-gazf zX5w+W$G+|CT|txfS$_A73S zNjaCaNX)CdKfcaM%q~t^v38gK!mL1I%3Tyzf80(?xsz9BGhb&9^Oy4a3wQ77l^0VI z*yuqQV4IV{eJ=6qaao+4I+b#*!Y5qQ8s(mx!9QNP=Qxb|bUx(V*Eof32b2mm!X>g= zrcXf^lfLAEexhvoio>jNXN9zrPHs>T6CRSOmCsZCeJy9yDIFv~d$$2OKZzf0;4*M^ z7G^b;jquQ;kBIFeM$+>JnCGcl*@f*KRsSWeKfOX?oZ0d!roVl3(NhyWdwy)&-x>I$ zs|J|dA6xzsW^r(vg3WJvQH4J+Okkh4?e7fS3XB2lvzV-MG~vtTzoz>%ZiL(f)Kk+c z8o$Sl2TxwXy$t@xM9-f!aH!@9KB9ac&G@VX`Vkv?y$V}phYbU|;WVGZCVzWZ!5UsD z9;9q*CmOqDUChh^eTQ1139rb9l6I%=y6{Zic`s$@s?2G<8*{FbHFR-y^Tm|N8ujK}gphMR_NBT5he@8j+YaZ^7igLG#i=H#8GMctq{E zg|8*w$cM34phPBCzMaCeO7p8011tP1;a8=3R|VA@IQ`=v0>`DUud-`{`(V$5{yarn z-PBwghBF{_*)|NfYt(sxLHdCl)lHQ<2=}7oKEflY{V2Js@N<;){&XUIB9RQ2!5g}f zIMN<;?i?_Xy>)PsD!+1YOCe|WeVnEDW3NGmbt$96GG<;T_F=*9@SvnG7!H5CXK*kQ zekC;!{pYFv!JhE*(c)ld_~AqW`p@Hi&>v0a0DqX9mpa0gDOYeJsmZ-4eoCHuZA7-g z{xe^9A;a^>9+C9O@^yqS=REf_iLt8HnY5>}mJ7(Gv@3N3Hg8~AH(-w@52ID>7ieFh z_I2Oc_~Zm>5wtOB11@#riL~`$5)S@c@Rxx9-o#*_Qk>1?{t}?My+pmY)0c1;;Ws9t z;Xgr9-BdVcv^(zy18n&I3cdvRH2q(0CJ)G;uH_^HybN1`rVm~2 zFPJpIy6JN070lngt^K(DbfBgWTj3u#spzVKHJ)HmFQ0sTY)(@-dkKW-6&wA-`~x&u z3+Tg2W!yrC&&PMuxx?xAqHA{hGxp#mQHM zw<1y=%@LH9>QmT`HuXR3>c6SSt4-$)k4;mWnR!Sn-PDth+Z?y4rvOu{ z-PBVkZp^HSV z+MujKdUmbGOy$bjqDgu%8~qQc-_~T`Y231=cH%8{Qv)~GP4zc%^FwQvEiKP|qBX9d z@HvH(=};wXHW^keX-d9mhu6=YxWi<9cs5)%?QCz0arV%bqW7I=U(zz_eb?DjTD}&n zzWSW{qfMi<;!wzWeN*wIE1G5;n&6yx^{BebgA>0rY&>COgX6z6>_Wmu1TXy3uqwg^ z1*^U^Y$RcM!I57YRzX1N-=Gd+*T<)OPcDZq}5}oQZ9sY9EP}DF~ z1!_3zbgA*?;(sJl{_;Nz-FQl9)$1#^^I|%u!f#eGX&*64rox}4q@BL6^uKX?3$F<) z{iBp{RerDZ_fztH{k78nloFZVUn>3gDUq6eUFpA0iR|o8l>W<<$oIaa^w+`69GgAO zZ2X>6FG>7J`Nf%siQMlKDbc^D{Epx!GQew7qCctpIAv8M^1y+V=<8D=6TC?2t5QlX zSm}Y3$Ohl9^hGI=2fkD3b5kM{e5=y$Pbs-zrQewn+2C&~dT&jMeDHNjzcJMh`&CN+ zW~x8-%awjzsucTWO1~;4^2Zk`{qmH^AfK=F%Xk;VV5Gku6D~pM8cdO&*FsmMwBa)M z&Sw^?RYuiZ(@VZsQ{W@}E1ctI1J=>{sx|wpsj{UvYo{c`OL)y~eQYeFdk^n-_aM{K z6Mhl7mY?#aNrvx>ylQ`WxSas^GqE45Zw7C)&~K3z^y#$itP$nAU#fnG6X^xowkzLh z8jAS?+x?>L{=V&g!FE4yyZ_U6Us1OEz*fEvTd&No`xnec;7s8DznaY9eA=^D=GRy` zaE~b1y~U>JX`7<&+U}<^6dpRTKxPlVMQRRFIPmdmqwXX18@=F{*zk)p@C!2V^D|Wbff2yu z#8oQX&yx8}O3%wrN}tP966)DWku&!wd48voNY|6n!;%Tq@A}Wq=o-EA#MAQ z32D{M>WxF``>!Rgpqzv+Dpb9q&KmqMF&RI(SxH8L=MzHRRz=-2in{MA>YfCLCck|r zWmZdD4o<2^?Lx`kS$ZEWJ#Sz|sP2~DipeTa?GwwMaX#~hHcXl8$(&E-fHD`9w~}No zcnBqP#5UBYsAIr?g6fobs1RyDsvC6()sFfc6+sa@*KaT9=_+59c6@{X5=LV)tzG z*z22yMGCd+%jBK7M*K_-bF9cU*DDBfY$+TAkw10R3jYf($JC1YDx}N?vEH8n%x_D@ zbP!`YyeiYHgQ41^n~L8>8e_&Hn?#&p#DV((O~M%}g&xKtTu%G;0Vh5(^9eyYxrHN> zd&hK(9&l}1ogpYyGh@b=gO#HWirGMpMR?iz1#O*g3yZaMXN?3#Pxf`ES zeEQ;3r+n)08Gw&FI1pXhU4lMv% zephY{ZGe#cAfGj6uii#%8mZb_@IxGix)5$FSMtTgdGd51tTJJ5J#odnZk`5xK6Yc@oVyX;T0-3BMmLgyjDtho3d+u+BadYAmxD%oNooWL2WA0Z)Fyo{FZayvO1UX@#^Jg=>b2VK$NS zP0l^cW~N)IIN>vnQ(;dmjZ8-lM0ME=Ip;41g{+aIZ_ z7+BHtVzqF>$fx8idn>af-ot2o7V{a*P2--%_FWa5FC3$kya%>Pxh2;gMcrfg!DsVr zz^UXk@7xC`#fkDOx*KYcc1#Ix>_H=ls&fl z@w*ed!B_Pj<>!?9GdXMRPuB6SqE%bPt#=S6ydwBFq*WS(JBGXXgF97v8ZT7qa=zTm z2@3y9PGa9;hsa$P+^q@stBM9SsHsfThUW5Gj*@HPgcvQeCLQq~IgqbuO|o{9)$sJIwoK864b%#oJR`lk9hl>L3e7=HlP=fyTwm64 zps-0B2|WrzLJFI54^MQQ-(!q_n$$JFOCqYElc<)Noen42`X& z+HV~4_v;smxZ7&oliF$vuACSt*PehwA-l-Eah3XfH`g(0kttGtC1sSC->jo<=5@RH z2b}vPrY~Q~_G*3nJ7w-vZroYGZNNeOI&K8k;V_Uha+G~1ZHCbe9>txbLlg7~gaqJL zNWRy=JF>#qdlBA4XWcFSrt1%BLvOSBHrmiz;n}Qi%5@FZ1~~@hoZo3aC@W=nHz-%I zXp#fL*mra>GfPkeCDiYq7J zg)b*3;L~xd?6}r_G9J0dTk&nrv0=Ey1P)aDTavTf)=I^b(e*Ro!VFiXVm>eodrq)i zg&6u7xQ2+m(|n*z@oEND8?_=+QrM|IXywx4YSm3G0dBQ-HTd;Og$foG9^j2e% z7F<5*G1p^xd8)jHo7X#}FjP13`jB}&ybCEw&5K;GoZ}MtaXH5|9W?``S92F{wKjFc zA2jXj?4xR-oQS$-CzQ>X^d}vf*%rP#!3k&1HwvEo*F9G(m|QyAJ#F#ieq)^QsJw#< zCO1yir+jZ>q&5GoU2BplZ7nLKz2TWMZVHlDk=Oyg8m|j3nQRU#S7X=@IAI?|UZy_e&>q$9GG!&d`QAM@)=3FX?&jrbB_nMN^y~TpQAI z|1+ZPc)IKz;5cPmN1Q9x= zAz67!e85k2pGKd<#+SzLI1QiUG<DuN>y1wQ9FSpOL&Xe*i@J78WvWl}`$)27Q z&uPkiFwfs-K;Kl~j{L3ycTr{Ww@bG6i}b&3K-<9OWn+f0`Yb;@tk0R(RsMYBgmc=z z^6q)97dS7f9k2QSJn1h}%cea){l2d+|BwAQZNBaKyR&Au)@!DwrB3;IFL!9!kf+mv z9hy^va9yXlICQ7(Vi}=342Q$vbhsRDhsWXdI6O{|%j5QVJdD-E8lp{ezTjS$o$4!j zd_sFAd0}!&YP+Vndu@3by-{Coa- zQ}V0B|DM0zbaop5p1C_E})8+Pfv$At?^ZNA7FDNW3F6r05 zbilwtWrK&D;VU0HY#F~X7hE`Y+(j2(GXATVUgn=Lanj_=r%bJufG_+Qz5Y2$g>%`M zFU2Zo$Be!BtNuw-E*N*or4uGkz3`&(mrcAJe}!4b#~iOW>mMmi+mw2v{lz&qed}xI z`Y)Ya{ne>cFS+!B34U<;uNpsQ!ndZ3{nm{){=(FLFh6DPY5Cc6>zCKpJ#g3Ex7~i{ z9e3B=ch8-*wXxLGtjWI;i2{G zR!!5cc;bi8tdY=Vrd8+?hkq2mKw$au6@i9_*CO_rGJo>iBLOQYAiw4OR;*aQqG5&n z8X8tKn9EnM4xFQ1F#owH8<#Fyx@0L>1&KnlLO~OQ-}1nU# zx{Yhbn)iQm^HYzm0(3c~Qv<5H6;xUaEM2tfu{D>P+BJ`E+CXChYo@cMVK4(!>#_wa z9%+Qm>o#n9WYtQ6lmbz|Qy?2wnhTddyk>%S_XUrnaS8yC=(HI72hNqtmo}_lasEo} zrWJydc96!XU{4}nzG8VpVq2}UbDiaLY6FAw2&Y5zj*1Ag$ou)X-ym|8$ETVtjH+McAaKU2JT-vbd@eMED{)&0` z@?Spr{K9$bzu&l|e)c_eiqn?ykzy7^4M{A9jHfn4*g z*%h~a^Xg0P_~;yc%8b#~S4_NU>tD~C{vS8qnSX_LWFioknl*>cnQ&3j2+rfX5{bCx zV9PJ_W7=oPWKWMrqRyOLXCj(%FwJuriLM@3P9L|S8O|(^%ybJpgN_CN@`vW;W6vE3 z9xWeI)W@CeawTF>=8hS3SeQwI)1jy0al`F4QVC5>CJha@OXk$N!|8T9QaW-P-3R{C z^0_gjB({6^VMkV$Py)h)piA|_sW9qVBB8sSthpG&fi$#4Qg^`aPC+6FnSEyK@xy;T z=&C%UB>R&O_I0Ejsg&+WM0?_bEOi=6C`p0Zzp4i$cg@;*>kv5k0sklz-M) zWy!yMxc5jxOT+|WB$oVggc|9oWsXd!WxbS6Sa-Mup|_7K{Mm=ciYiBxrS|Rm_;4&0 zjT)|GPdJ)L34Nz!TFOJAchPYh?N0uEU|YGkM~8+^hF=c1M%R6gXAt>5L1B zCtFh*p_L%D>~= z(2-0P49<@3YyOK?Iw-G{H$SrTl5HO!%5lZIx_aUXF01=;3N0!vdToj=gqmJZmJ|E9 zWmlr0AU438bm#R+w(V`pa>u*7dt&i_hOk$)(1e_BR-KMM{j(DX{_@wP*L%EQe$3NH z5FYfp6W!rR6cSZ-PN@{Dp7FP9*(y_r6@*U1nUkMoocQFZ=63GuUl4QU_DvlM9(Fnt z;RqD|J%o0}NCkk-px)r-Fzp+%>S&d#z$p~|yGVGmi}H7KV?^Y-;ddphm0@c#uuMp`?|Su~q4mEs70 zSQd#}2)m+IA3i0w%3-%Z+fKQqDdhWNSY?=%N3%JObb9E+0r7-F810JnZp^*Wo`O&+ zqBla8GBlj5Jh!|1SVVJ$-x~YJ0=J~mucExhA>TC8e?yST-oh8@s}?_C}r9E*PB8RW}3C4khPXgp;U^iGK@vL?Mg|hPrylZ()L81)GZRB zFI|cXp*JE3PkcB?k4YH{!jnV)7qi?Op(;Ox%+9pKl`TC5gzgi&h7|PBQ!Ip3NBZxJ z6k1d&IxUPgN|ouHK3U!{mEsQV8I~W{>C3TbICk>$*_%RQ+t^iwWU554Dhj2dbNgg@ z6vEDr2799EEL+nMYj8cCLUAjEHg%Q(LZ*)(%<1E0fMvu!@^Nt_n)2FZsIvSI5uT1t zwQPsOLU@#(((zH>STyPG^Bgt#v6su1HulYuzyJ`(stl@GRG5-_t%%Zww~JPG`8&*?;gLPy45z98TnTFCtWBDoKFQ2C+yMKXwynHy~{Hl$|-O^z(gxYm4{IO`V2NL8`dc z2zfI8X$T3RR-A4_?>z1h3P0cT*TY(2o|a;45Lhs&D9W@7z$yrpgcX{BP)=5X4i`(+ zj$>NCilGAr1wU=~mK8aT2u+$LA?|J*(uZRE8*%ld+Jq(q*kINHsl0&K$XY2YRv( z|F!k(Px=hWpYF-J=Bt-ps&(nzNpO1m^(k;W08S-YKF2w_#LCr~)RPXw<1`pL64Q46UH`JjO?fTvC?mvEf`{3J0kEsgoI&{$M>HKV8;*3GwL{F%zE1XP5 znM1Ia4@0ZdU^Umj$B2Ia`|rR1({EpP(U_c$@WGfTD|&EWSKmTs0<6EGPJJ;{0z z+8s_$eqT>4^3iXf`_Wo=Zh2{+j;_v*ysYSv{q1>q4y{KmvQi0IBqY_qMA>?>^Bk$3 zPe1(2(a+mH=rQ!}Xt$$pcJ%1}<2hMcJlYeDG3O)!3eT!?O>=midc5bvv96+nhu-`2 zL?jaH@#JU6j_f<;_K;s$hENRrh-kM7gQZn05!F1!$^9*VJKWwA4ZHKRqenhH>T)Mz zc9dis(qyERA3O`gV8Y?*Q*0b<{rC`3x?Id=j(&Q~<;p~11z<%{4OtihMDg_LXLPsz z^>9Z|Pp6A%?$Q03C`odkPQ{ACxX9(`p1gk9j*mV++8K*=X<6>*@wRrSBPn^2b*^M4 zGlZuM275}+4F|{b`H|z1B+K@chQLY8VI<>GDKNMli40+6#$YnaDCY3wg>sLzcO`VA zrzaeX_o%Tl8H-78l9r=Vu?oO&J6#Mby3>22uq(n!#To7CjtY8uiI#{{GhQksgp{|b39@Qg-Zh%iE z44e*+H=C_=`p%&WMhHr$v!gRY6QmA^p`w7GS5;CU-fUesVex}L;b#%0T}1(%3{~n| zuXJh2Lb&eA@@DAQibk@YtHc18YB`=DAG+`==#Na20+}Wf8uQ1;8nUB3_qEKQgik*s`n{+zT#Ig~O zN=1os;0$^jRYNL0g3bC#X<5lwq=6_CCHmPgD~hTYRW=gIDqzaW&W$3BRFctHJk~Z8 z(E`a!yHsU59qC}IcvVj9yhs#S7SRL4h$4iY7DZqs6{VA|?#{7ONgW!-_(ZGfZtsi= z-t^A`O-G?kxO0&1B9%ny_%LJ=AgsHcHLq2il9%+Kq@@0=C@I)mTE}q7i>k_=Q&O=& z?I?;cNriz#580`lY-1K_Y3!DnjzYa8jPOu|IjjgiVPCHe!WvM+}YXL zy202RJzU20fkNx9#m3Zmp>8wMYp_~Aj!ZD7iGlZyKIWPAaF;Wyi6ikQWt&0ko|@)k630`jSGHID!SGr}M&>?dTweM>y%7eXqU#HMxHS3KMx*K(Ak#o2otHE{K=!gq?MsO<@+VS8Pf;?VNfaxU%y5y$Zkt3= zgb_vW%3(>ySE;l8gv$OYxKGBjQqlRoBvMDcaVB(5{fl`y36G81SM?I3UJm6kw{W}v zd6abR$7B1c7dC&a{_>^0Ql(}SrW(wlVuk|h<)0F!N{kUE5&yi5)rZteN5_}8F*`@; zRHX5L&Tt`JOhw5Q@#*D8FSPO^pU}25nE$dD$P6B?@9CiFQX`7hD`lKNRPJK2Mz8D? zMsXS>V@cCxbuojrO3G*}XB3kzMwDI+IUUz-HZ)ypgy9SAI5Hewf(%MsL;laYqlI}qj&K*lg#uJG z$%l;|m+8ht@p`@SNLNq76)I&%(Bomb-`-9C%n)X%38thZsj_$k$iqZEX?UVV;C6dl zk**V+NdrKY0rn(WQnBR8M3IK*VH&7=^KB!W|lLNrQ{F@zAVA*`J??<&_lWXzhnjXdXUO3Xqu)tw~~}qrkx+iX$t( z_?Rnrq${gmQI^(mvBKUh9Y5TbG_ONMLC z_Txv7B(ic?hD#LbuU3610%fB+CpX928QuNguRgPD*w?-`nedKdJ3~Ev`gpZSw43#` zG%uJnRFCun=EZJ@H!IfD^WJ-=`S6SX$A3@$^Pf%Qla2rE_vHVDeDVL5(m!e?|37Xa z|8hV2KiB2Wm(0U2EqvfQ|K%4BuDbZ*QT_|AKL7Gd{TF|AqW_{xue^5bj63i9_Lh`6 zFZE;d_kVi%=`{^=@4vhDj$3b?b$ji-ci(mEt+hAZc+1^)+;qo%chxOkY(D$*AAD@4 z%(q|OvhJZ3i|Y}Py#N0DXV0BKf9~wMd+)jD{yB4I&z<++JjAfpJo(g9KQvRTw>`6} zVa2jV3m43rJ7>D8RHkzi$9xkY_pN}vl zHY6_>Sdxf~k*N!;T(^4VrP^7KY@Mys)rVh(ema$yXm1tix$kEFM@(;AweKS!XCfc%$ zA_%u+$@10fR#a%_qAiWIClFCtl7D@qGits7sQnDFX_r#-@Y3BJGH?CPS zkIJE(BtJr7I@eg2Aym11{ia7JYv$xl$Wks9iAw>q#6zWo_#ro`inigAO^;lneR}<7 zk&qPX(PA3U0xYtyB0qZ)vT?;yn%$_BIrXv4kFQ^=kfuR_S6LF8SFC(! z4XYobC@2`asIXAp zQe6VMY`(d6&9d`o1Ek$xE?$6GBvmXwKo&1rV2R%@T52wvzijQp>+Uhl|9bB6hu1G( zGN*nCVv%#_%$+L@fIj!2YKHR{(sP!qdvWul=8zYkz4{l6>%P8Z?N=AyyLfK>oJUqR zZrIw;FzZ92-}#S=FPd@x z^VdIUe&gzkzhO>EnGb6FuIkLX{Op`$?!fG9CR{plW-vKq-ed`sF?EECj0~Iu{yN*8 zMpm}RNWqVGdU9B(uy5;jq~gi`*=3cxb~XR;)&DW~?)`{u8YCn=9+8k_(JV7qnfM7q zQKo-5;U;M;CX=kIk=9{?i##HNlgz!?K0+dsxnr{X&6lr=z_LK0wNFVjE`go=JO$(3AyA2~7*=IA~9cONYpIb0C#IuuRCkT;4)M0i4e zf=rR9D8$XQU-r195F|nQQOYQpoHM8P_Hji1+H$0LCKD*Kc zp`M846}h`UZr)um;+)};Pv6^jES~J{(wxbNl8`(N;Yk!FpWM6Ank%g@ojRy$7>E*b!!@>5B+$1g9Z{ zJ{IqYTpG^YzV6hKy@yg+J^P%_Zf9QK)WN?Ua#M!AC?w+w&&g5~XKxqi$gzjv1c@NG zabo{*%^UvMEoGR`qo2og_CIOa{L=OO4-iVJ3WW|g2oW*LbvruRSiE-b@i^L(IR&21 z&Mr1**u#@P3?0&RgqoAhMq$rrX@rJQh=gR0%h`FjQ}?v*$#!<6vI?^!-5u<;#%L^d z;s0ZVLL5J+M6g!mzOpI0BVoM(k-xenPteca;p%^2A{|C z|Frkz!EqkheKVN*zA-a62!J4|lcFe!BtU>5NaDWl8z3q17R8n1wN{SIXuMwAYb#kt z36m%>{&n~3?)Sa!mdRBTSr{%xkkGD(i?k*%48`b0BE5nWD2tMA;j-nH#6v*S5lQ7r zB}A0S$bm;0`fQsfA=a5xiFhcPhY5wu4uUts-^5U02Ym*-C15C*5<^HRP5i7%85e1c z%0xU21qK647JfXW`u@hS$q;Dn&98Nt040`@{d9p#UPe z5kNbjTalwnf{PKns^UM>NMZ$*Q3WvoU;lEPL5+a>hLkuay^yP%jv-c* zjrg!Y12myp7omjzp++9{f??us2VbQIM3CHBy!mL>LwlZYm2@IKsq%7u%l_{gQL}k!6 z77b%q;>A88M5!=}s(_Wi76FTO5F$#|T7@j?NlH|)dxbPHWEege2ocAJ8In9(b6k>- z-jyrXFC$l%EvF)p ztkSBYC@QHznElOC*WRV@xA_i3FSVb&;r(Yl;7N{t|FeEMCRw?&m zb&uFa-hDJn!pK1=mraKFD(Jwi3|SqZAJFHK&Zd_Il2}+#xudpXt}2Bjo|kA;;w+X3LPX?*1fkbi^p6QhxfK|)!X{xUWk`&!St%+6 zSL3$rbrsLwN-!#07&<33n+Hg5E`75RICG=7Yg6%Pu^ZP^5U9gYrcs z!&nKOkW#5vXgv3Cet6Gj6ZaTucYpA~AOGI_|21#6>m|ykoHeSlv`m5}Zm5$Iu~Mdy z$qEvYOsXiuYb5m95{XW2z)Knh{Pj?IGm(VWv?FkM`x|d8E_yt_QqxyiS?Te-zowSN zJ!`q0mD)nmANEHx@j^_bP!u3RxmY1r>dVW;>Wdfu_;)`3SC?xChws(YKCw+3$@tP5P2TTLn)OmqHkPE9 zt>|O%>J?skOl>LE21z!t_W4cEvVSqJl%_ICsY#O$u0?ceR77(4qiz|qYM~~h7^F&> zB!lTj&JtSx*=iJCgc+roqJ&gR40qu-3Sf{5iiZk_$_?-SByfjQ>K)s>AKdrB)i0&8 zs3{80D1r3?j)=w1UxdTjPP7OTIWf)a4XqJ*<)!vY3C+J3}_aU{R>@pnfBYOmDJz^7l7_Nq9)Yal8=m zB(Xw}qU5QS2pwTjdr1{ipd``iEm4g-ghfXAcn0r1G4>^c2_~IvEM4k5S=*993#HOx zh05Ty#8V_WCX?dg>qQzlLLmvJ3_)k0{*1*l5Q%!^|c8u-H{n5LrA{8BA35ks&vi&DU_L@I(Y3u2PHijWLe z%_)=$4L)R&f_po)YLPgRLe?NyL8DVq6iAJE&1Mw5Pe&@W8doOs)$I#N&w^FiPj~?iHW3%9o}RrEwQ(rAnd1 zn_sMdU8zU&hsRee7SE#hLUknlLd?+|(aZ=h1k_4Ip#~($FV%r5MZp48JOT-6B!P5` z%?IiQ@BQ&Ja(GwpE6ZbkjVP#3#VEvnv&X~(ypvU_pk6Q?y;ocGkc`AqrCQ5|^Tqy< zq(VR{@LhzU=#B2dxdM8PIfxdcu)LJ2q!0snQ6LJNK&S83l8+pm_ez3MtEJ}kAnTM! zF$%SBN~IVjD&&QlQ!z>ju3{7oMndRqvv+E#dtxqvTca?5zcNZ8yM*i`N**qPY$Y1& zpa`pCGZylKU*TKAQYmDXw!`F!DCF))k0}a$ZYdM?bD5H&kc}g=T!UJUC^1AKK@f#V zww4Kf#RO2JMJgCF71rvoP@JMfVsLDyC@hhOO9gQ#3QWPYY-FV#t(@{wjDkqS^^2*H zFP2srjP%^wOGQaeFAs?nk zU`)Qv3rhv+3TBrjYL%!k@kkU7Z<`cbZiFApC>2Bj$cx*k9H{ik-Ej-$7j6+nqo&R^ zpI)kFBT1A#oRPjV3i}bIuhyzqlSYq3>Q#Y20k!q7tw&!R{;zNvy9NX729M1ca&+;O5Ak}no{ zuYF}+SS)J$Diy2V*<~9l;uqWEW@E>IXqW!Z|#4lNfW7r|mGTcZ?XK8R9C zuUScT!P#|-SD_H46p?*W6pbKQepwG)iVl)IBujdJYZSW29~C7^pUevRyBd6zl_3gw z;ytKkrJ78iEDB2n_MAcnyJyqt68K>XQG^s2XO@kk4iMA@IU5!7t7>pYkNUMygjCQf zQO97}0t=58rGrsdEci94l%kM^!D}EGP`wTkOk9Wt!!g14N`SQ}5Q{*m;B2+Jh0znSeX)C8vbsO^izK4&RPDHQ<#q*6kH5Mvq!dC9?-CuqVWi8vpnR2a&e zQ3MHbrC*>fkQZwEVvibAoi9ZZN~0K=MHS1b7o#ZIWpuMb_Jfp4F)t*QkgL)se0{0o zqoTa8L;r`;j|Lw^0U67RKrTcrMS+G9q7cZzs4!-s2!iqYK@>nMW2sOtcHhd%1=%m9 zg6w`N3TPmhk_5|V?mE%L@a`cRAjE_g^W`X%3hTsKUs;E8LI2N6pN(0*lnN^#LQF|| zOq9D*O>-bo9!(6J3kWTym`V{fp-d?i2uAASejVmE7~xP9DoO!nf&dZeTB>F6T@+F& zEW$$)lYs)9kWt4-%l$^C_lnZJ@mNt{1 zWTY50(`%SbQ4vKR4~F6I=u>0mwoFkL4F;kpClEoPTn1ycLOO|QOer0#@RG|D;b>N* z2rI*>9OiAYkUv6ED1SIth{mR=1ROO>Q3@0#8Hwe~)KN_&Q;;j+hZ$f|AT_Omi{+)_ zGN)Fa7lAOFz_19Nt@z$$Hm<{;X0>TLNMB3v#pqN~M4o+*w>jGA(9= z!JmBp_kZt)HE$d^a3Gdk4*WP!rqyUEFEmZe<nni9T!4dTSt3) zM+g3QcH-Bz_Rg-JzTRmNg8aF0aBV++?ATEjjvYJRhInnD0wv;ibo31NO}kt!(9Vtx zb#}FbvQ-E|6kLz7=*QaIdxrZb;fn*>$??&yt_OTKNsBkf+SvG2O1{p>m18DntI*IbDWF^6wynVzMp&ztIzmAeh?|55xUlE6)-p(RrYwJS@6u%rh z*4EWG0H!2wcZWdBs>7G5!MLlp8xBeceGk!6goo)FZ65%G&r^RlRkF=$_9bG_cJ>ZH z0C+Q@*uFr@gb^-y0*E?#hJNEWegj@q!`*F1DcRQ6Bf|6IM~N7;?cF2rbpq`~cN>xs zs^lil#b5CKI5m>4anPbTCVRU&JG;7ZDFw8&&MpM{PM=*}y_0bI18m=!njRk;8yy=N z9vWt0Xozk`Mn>oxKE@`erhbJ=?aeoT?bm)E#%$YOK zA)LnN>C@*gx2|4$`|WGj-^TT=YuBz{ zfBkfKcQ;Dr+?Ds%Fd+)t>@P8{EqbJ(y?_7WPy=&jT45qWQvzJ`>b{(`3 zyTnrXWFmm}oolX(lPsLSa*dKE#$QQ`^sc>r9;9<~a~EA#-+f1r;9Wt&P42`P$-Q&+ z_4ANnYHI5ImAB{@$bgJ*lCc{>2+&@+2&TmM%G<~*qyX24X&EW~cJ0c=6DLkAEG&Q) zAbtgD5ns?=y>baMAe?{gDr5LC&rKO9&9|An$lkfv-hSuW7jspV8%zMs^|xQYh>T54 zOq{=hl4p`$BT*g>OyqaoxjGSe3 zlRbUA=DGx0g!8YXEFKQ1AOI01L=SNHwu@wds(`$L1Y0VPAPyvBT&`bporkak0|Vz= zSE=d(iDHcvKB$TdQQiUH^QgaQLvydZc@@n7Edz~$H4S!y7V*|wZ(n`u?Q2)x{_ZOa zXm2Qsp_8u&ZR^VG)Z)zd1$8P_|evZ-hs&@Z7l=+ZG!_HLqo^gnp<0% zdygDzp&sz`>C=B(v>2yjZmLs>5)sU0VE&HcB~L-7QeZj)OTJRA^@k#`He;9zUr@PP zXE1Mg{g{T*025tQ9owYa>x;iaW%WeT0uUQtzZcX4TT1Jhj* zcJH%SRM*tqzPq@*<_m+P-r}sPsjI(r=ibt)H-z2t4AzS3+U+~OMDZmaUrOama(qeB zFXiP+x&0CzJL{imYG^sow13~;r=Na$FT&HipWK7%-o1OC+KYXbpLzPRUAv!oqN)9O zcWe8R!%aZytigf)fx*Gy!NHE>!{^7QhsPEsPK*!WQ7H_MB2Z6^Zg_OGuXEzX>4lN; zlT*)64G)i^*G9l)Y+?es8@>40_~gXINYBhG^QT59PtBZ}85u=$A0KB88QnN3V%$$o zPfbq@&i~T$r>Cc$n>jN#J~2HrjTStG%k<35GzHwDCCpEra$P)qZu->Jb92*Z7_+49 zaDncpJNlfRTR1g)`Zr%bdwvSi&(F;-%+Il(@q|7R5N~eo#Pf4!|Jg5|yD+sd4(+-C zD*9Cj0ukMxI6Z&vw|`*^7060~7_l&a;`GA#zyHm17pG5*FPvCFij1mA`he=piSxhx zi|1cpR1getOV1z~ahgXsapvUt?=h+|K`16LOQ%RhbVT(JKsB{63PvPvQDuM+-3g3I zu7CC|M#VB;go+Ue7ouD^y>RZ$UpRMha(;veC;;`X7h*sE{QTKpfBDS$iMb&v4*X+9 zM5V;;sE|-3!2a8ppF1-;Gr)=#r8`dlSdkaY9p!yu>clT!SU5E_**i8mLbV20{2QTr z;XBo$+0of=ot~cWAI10rgFsZmLHajHwUJ%$IXpTwIQ8mcYLE z503SWUYZ^lZtFSPh33+YmP0LMbNET$G3y(|@MyTR=SX|=amF+TnDo(3?8lBCInvVFak#DH$RV`<+3=EKd64M-BH zHy&tgI()R{K=XlTpKWZ}+tAw8)rQeKo5y0hc&r^rbYtp@xo>~(vF^6k_TJHkrndh6 zE=;HKj6mz`=gpLD>=@|j92{L}J<>HY(gzLHivaw4d-?~UL)oIi8nmxnt?=H@4$f#?Z^QC6`gN$E_?&W_AaJ$LrS?@aVfEG$gn7eU96 znn7J9rGtO7b7Lo_&!2hu@6C_REi6n=P70NoC|EtFsyvMj7gR4?_~t)&ZtCRx9I891 zA|ffa53~|$Kl7lvbn(@Hbb9*K9H{Us<3UZR7+BjLJ30O03$I>1J$Y(wmiQN`iY*S5 zMXH(0m%jCnpC>978;OCKS}VTd5AAz)ZuHdbOD_`D$t_g$SfIjZk?Q5kul!8y;chH8wIf zF+H>}d;07v-&;U=qLUaOp)LiT%J9J8$Qa$RkEwyV=~K^L{*BqenF&l8`_Z+HqEhw2 z9D@3V(b^Ezqw&7!iMjdnuF1a1(V_mH?mpDI0s2H$Wi^srM!LsGrly|z)@b+WAnYQr z0rg>0-qF>AS}z1rD}x=w10y5z-xz2g=su3K3(zz=jvs3ys}pGx`i{_Zw5O}5ckFam zYuB;EEv--*N1+mE=tixM&5xm2+76=;w)M>%YdVJBzXj87bpPn`j~tCk}#4TlavF&u0>gaGZ(h$A2{YQUIb@4>pRrk z(>XLTf9lMI7hbq{;rs=J^XJcBy!7Iw7ZLgLOP61`c>e6^lXKIPBi#+nlcTdIPhWWP zrI)|);w8|(aPi{B7eI$JzVVHhUitpH1tW!*gbX7racQ)7c&M_Qge(AGKBkKqxi ztl?tEQ&cKUv(S(R)v3RyqwV1S-A^58>gXFn$23WTY)PFpC-!}Ma%^azx20+Cf!1SP z#CB+OQfMWhp{C0k9ziZ_V*oaK76F7 zcL4PtS`DPEy$ZDKiYU{Q6Qje>%pJ`rdzhm7hsU7Y9&mjiH4zgnY%|RV4jh76aByUt zgcal^DHyTv0f-rKcgsPb(A_^gK1B)(6h&<)(6YFIcLMFS2eb#9J9`F3K+8~PG*D*H zJOVkzh9MMfvg`1{gH0V>eIzcB5)fiarI<-di9{Ie@9sL>(9jIpq0wGSNMqySBN()dPRz`mI0e4v&Y`)TN1Ho$ z;XK+OKGA+=k+r_A&X(q9o^9R4Cr_Q6pB-yG)X|L& zcW&Y2bElZ~fea9oI=)aqM&}{M_~>9?=fQo4+91HfnF}wX8B>}tIw6oCOaYubd-lxP z(>V2|zo+>?Lu>!w=;Z8)=bkTeW{tAMn7+)T?hN&H9BaUUrr~f~&)^7V1B5)4Fg{ot zqWU3xo1Pf%?`g$A>X^`os7idf5m8a26B$Ff9X*7)-rkK4Vgx-B5!1shwE|r{ejOhf z=;>-{K>dX!b%?b%*5Cx<2UnEE2-*Oa* zog76UDzvv|)UqL_Rg1)%w2YDlJg8}X;CtX;Q+p?Bq>!^sGIqlh7Rf8LA+$}Bm)fTA znDhzBNZ*7j#vN$M)ZQ8np&j=QjX^;OPeCByAzYcRKt&tw>pp_M?+B*6y@H|^#)l7G zF##Q+Cf|Pi(1DgCz+q&38lyWjN~$Uk1xT=f1~&n|=w=Tcg~=YxjXD-#EFxUl*n|xn zXQ#%7dOMCc9U8z3k&&tSQ)ka#pel~`!@4-S!7Zx#x$|ey)yDD9^uAQ#OU3*;5x*Bm}%5hhhtKT)^niS2n z&fc4K&DGA|m_NB7I&u9(>&bg3U8nv}x!u@*@_^{z^@FVq_ZnP{wTEsTI@u&@7JWey zlH-O>WN09c?}4I)0-~)Y01M>blV_>TT_F z_1_o}4YdxtMsAFX##<*`lQ*U)j}PaN^7k-S|F0z6iiD`SP*AIPRXc5E$y?Y`C=v<< z!*0(~aMkAvhCf_26{2{HZV3JRgN4dtH5KIsy(BA2CKGY&OB+as(xF%c-Y*4(T$0OM z4A%OCt(A}JY<8R_GSR%tbto3Tj~IX{ZY zS&iNSW8YA*Sdz!SJ7v;TvT=8Hh23Jcn^h_}&cbhuk%|!`4?lQWdSf*JbKmm*ipmOy z$z(HOw>xsgMIf&VB7={zJh}4uQqUi|x1-uw;V_#lMrU0*3T7qNVO96M- z@l6IY|D8MTjrAYyaM+Dj16J@Tif)!5Ag4Vfnih+d`QW{~KL5QRI*oM(lN#Ig;?N*^ zanC4lK_K^BD$`WP_g8h>w(HFr8FnPXzRQGuDd0{Fe+jH8%w>Z=)>~_IW;HfoQ^>Gv zcncZ127oZ?PvkS9_mjpNok)r(>QS3N``xI zL!$mzJ{|aryupCo!)0o$yP^G=AIJtW__m3{zIZ<8`-_Z9Yc{9_GI&oA8C`@Mc=SX( z(PYf?KcX203QDP?tiqdGCc~8uZovM|GWb|40ZKth zr{8HraFW69YvH)eVAN_%CY@f3z5h_1O8+$)on8-zZN$VD?ID@Lpw(I|s3dy)u4fk= z?sR&i$z)I{@K`QO#j!iHPH(eX%qA0lHyPQ5-I%R5vq}dJR$~fFZOsNldAZGIMF6=4 zAMDS9)A-7b7JIqXY|e^|X0yR)vzOa#La-u+5bRE;-CSPjEVr8#3XR3AHhwAtV(LwLjlpR(S?eBm1p=+HfGe?)bbYs6s>)*LTWMZ~J?5~|Tc%N) z9cJgo#{aB;>WM(i<8iqnZ@8X(a@Ug{l~Gd=>kIivzA_bS)*80u%c9YjUV7q*^)XC; zSC)gHuPV(c?5Ul|OVui8xl^Tz2UdgW568ydkKg>v?+Y!Zlh`5{&WCv&KryMJfhQ|| z@aI*b$m-(a+Oj9O8Vv*^p&&N86N#|dc*5=Zvw!#JRp0-_ySB2ty5^4gf&pv_76=3q zP$IE_H-IH?cNfE}>l#H7*-{bLmy*{7c@AXIgo>1m~VRd6;ea+)`udlhi9`@Md z_4%<8e#jGvON|>|_qr$K_qyGFpN}GYy&gRF#Ug>YMEA5W6z~P&F~8p*3i|zl0RH38 z=f^thglv~%2@ANRnM5cUio)}dLKydfa5@oANuAPgHi;J=8Pw%Cwg-)}5Q&5%xl}YG zw@BT&bh;qV$MG&C8I5DRWqA5y$G&Jj9ZPC$y0Su9UV#I$VhOA>Nn;5M{;>0NLYz&c zWrmm;i#`kv9UQUXx<%Jj)k7%mls%LQM(eklX2c9tRarQV44+V5-3;1ro?G| zK{_oh#L^PAsv4T!TxpVGAy;vycyg(SlFi4mGK0)1Rw^vj>@i%1pfwQ+5Dkwr5@X(p zH4s)j#wrc?rn3O%nT(_mOF>bYl`5qLX=C*UbuFdXIjIO4(@0D>Y|>U`!pf%2*hoB+ z!DB4TGFM@Fwyl~TW3`BoHhiHoSqajXX>C^M7F(4OlH;+!8;{e-cOr#7NX%F|V0Pj$ zL@Opuu68L&E}l_p4Ao^SrMbdDlB0Ve#EY=t@HmNDy$!9hyv8iW@^>L)aB9n8gK_X)!O{$9bc#)n6M^7fQNp0sshy8hD6p;s z%gC9+#~M#8^p6F?aZy5o-S&;O4po^9$0ZA8hUl?qIu?lJ)BbuJcItFkRp`}JSSo`x z{&J*|Or*m8jmWCMsllnpne0Z=$||UNy-uxEDS%9Hao_GAeR{CvjVH@A6{hN4b@k?L zjtVCfYgLuenF)-~*Z%a=fw}!}?5uvW{_(v{&5pX-n%er>{ZG}|o$2&qdF|ux9zANU zu5&3}H{1V>7)QY9v|z5#s`P4&-m0i21-vKsFRuEIc8@yioQ`cyQ`BiNo6#wljRunr ze^yJSt*Ww8Q?rr!oeih++3JewN{8LPy~12hf%G`~2b;rTui92uRc@*}x^stfz-X^8>K?r>CASCv;_ z2vu(FE7MqPW@|--6*a`R*};_K9t^9UR%fNtYF#lE6h^bbggKpQy7X!)s9rNb5kp*)--vpT8Gq>&r73e8Axal4`L|>je)Sw{nJOQYqvQp1~W#4MKZ<`Q-UIyHyHM> z+!(d5`kQ@ zJ5^QXFk^cRoTUK|?=0M1;UG)<@#IKH!`(QZTTw~6?^>#LIMhLw$F8AatfLEIofFnz zMbm*uP^`$W-OSyn{n@pB>mPq?Q6`j$y1#b&1&G2M zA*|6&I%NtA9;;MX$<68|RVt`~@OqFI4obyxvqqZ7`c9z}rue9HXjYLtJg~9Q+6+%@ zg@T4H#2f)_I**Nl;b~t`OA%X=gSLZu5gw!MiVES4KsuF7YVeq1gSikDNn;9^53dKZ zSci{wF9vm47BeOcTUcPL#0!y)Fx>Jnfv2>y$n1mIP+R%1JA~0CT-_BWq^+Q{H;aLo zBkfR@T;6j^lcp@IBIZTyQc63GGufm#;7(h%8JjgV7JEIIE?~)QQVA`LqdXs$ybyMW zb66mZO^(bu8P>AH$WTh0Wo#`-3kcLor4?;Y4b4_EG|=z^q6M+xG$tB|tq>JsGi^nC zx8;NP-7(q~Ut+NtWY`5x$Qc(yrUHiJrH1aqw5qlp`0 zm&s6>(&DHmP_C2OVNKBC_%w)wb=df$O_yS!GELUI;Z&;aKoz|Z&KHJV2$mt*h&mq$ z%M07};zjY);})$%Daj`@n3Kd}QS7r3NhO0>GI zx>;B;ENoa|z)S+RAO~jNRjK5iPj2S&|Mo|9niJ0?{a93hv7i*AZa4%M@9DeL#yl0T4hq0r9>iZ`9-UG1R8e5{%f&t zBJK-(c5m^pQ!de%b(Bd^Z3$R=gc)!+0abW+`Sa~MrC4pkrY>9g2-F#nMG{e8`1aCI zcbauljR~ro$Q~la+NuQVY{VbAd+%pYlq;lKkP$ZlR`x+3_}sJAmBeP_y~r4zDU^b%?CrUjQDBb;)8u77ziTJMfih3#1jhnePJxC zTJ>yf_#?gzx5opEhtCIti63$3#_M%^0$>n>5?ftcU3UA{@wx8aa0>x;6t{Z=VSU}} zL)A>i*4NjU;AFYFva-5H4<3Z|wRQaWf^{e!yLa!C`}Y{x3bX|%*Vi||Xr2DAkm&|$ z!Rrb(G?abv>4qEDo)r(IETxM(kAL0k*@&bfVbRCwWZ!?i`|;10S5`tR00s6KUmz6l z`ylz6Z{@aUuiq49<6;`g~v}k@+Tu7 zg^g0ZO=sD;%jDGBH85IYA|)?Kk~izG{_dXy?<&i*Hlspma=^Tf%~-I84pxg)F79!s z*56I(EO=s+N|ie7(n7ruy0Kh5hS|F}qqACS%w|WmUW$dvlCm7SFjU%X5(ChLKN{AU zZ8eVax>^IaqtIfIO06Y_LwMpa4Fsb(t;$(nRasYSl1Y^~&5PB1tY^gJK8MjVwz9G9 ztghT%XM$~3C6-dhjk$k1k%;AE!AM%2gB{2V<$ib*rlN{h`}zrzZJEfq=8aYObzEh-cxL)e%lS&Id$<+Ubs zZCKh&-9PPBfbCh!vhkEur>};=!BR!0AhOo5K<1bXGl9v~mDqO?kFhkAMr$-Rf?Ywd zaiwIkq!XJcTB?|xi5@fduyLhehDyoRvMM+(TPh92oIN7Y1rt~TXBXI<*fEhTWMpR& zVpG;L85zuPa=peXQ7LUTurtxlwXCmUHm-~`pMU`^Ym+J!Rwf$l^1u>D>~uzwN5_VosVpknqIjoZO#)++eM|H_!EQKvkl-7EAT7(U|wAjQJ3qY|i4UC%5=_v1X z6w4hA;dnMK)+v*iJi!zSizqHo<>7oPl2VxLK3IlDN*Na5VuFQX32dd$ zi#HO-kOn$SFa^U*?DmAQcr&M4x_{rd=JxwHR@ccy3_~*hZ+JJ{0lz1lF4HdG_P95^ zp0(8tAM~mlwq{WIH@pGwMl>$gJQ)kEu414B^-3BS25MYkW)5w5Q_!$0}c;Ag8I zFVu7ZhUQ=}8;<5kUwMPefBw7iJwHi2cJCvvJDfj35f>6SmY46twC-P7S#o2H=q5~nB{1>2y%;un-0Lf$ zvj21g4BY5R)>cUXb3!XSV$7)dpBT& zg+36ETR{Vny&&>2b3H-HO4{cE^x1=Jk~QO5@|6_*x0B5ANWjS+~5!AFx1XvWA%2KNQ(WdlCZ?mn_2`qmkmaTG%Tv2 za2C53XY%PsEh@PIyJEsxq+pGZ%s&{Gp z(88H`Fm!KYM`O{8*%F011d&M3V_JcF@N~p z@|}8|pQ15pzC;H3$RZt0f$aYJjYplBQ=70e9`SgXBlS)(kOh}l79VlK4ralAcbin3 z89_G`ize~PXw4VgU8~b!V>7&;gfs{bSTZAdI1%x=eH$BlEA&P)#^h|3GtnUsa0qx; z6A8w`-qrQB)dQ6_lf|ho6S_P0xOfqfT{{>Jc~;k!mk&6~%~pr5j3(m35LDB2IDnz$((=lu2P?`g)(Rb+_{GMQG!SLoEy!^A zkw4^LU%J2e*%QukjLEf_)fdTV8bIlzgMe&-aA19D`PNT$cz0=W=rKuQNj<;=9ViZL z@?w0yviki$(_u>kM~zj6Q3JNL!&ZKnO5%bSI5>GN6AdJjp}_s${lin9%&b$bEfYy~ z8m%0rURV=xVmb^**z~-tEbIU4vOoR)AO7Km@}=`94(zgswpTy0%eiC6P7IH>@2IZd z{z!$RMk^D2^uz!3eUR0~{Ug;56ZRnd=%YXR z6ObM0e)^ehE|>e$AO7&a|KR64WW`L{VsExq!DI*Qit(rJ~%V zRbdZnF?P+v^qOADV59fIdQ6;@NRm=bIcz~%Yy}`Kz%Bp^;qgik+vQ_l6b)IZap)lC zvSc=(>A6^%3$FN42_pf8+J-&IRG5S!K27}bSR}~>mwXu1c>)r&2c-n2OA&TvCf;Os zz+=RYN8AAknzBr+fk_x=Ulr&6V)huP5&Og$G&-qBhmHENc^*1>2tkquR|2UhMpgwG zycM!AV$nM&8agmTQZBUO&tUrohg@!f5etTSWDSpLfPiX^*mxXEC}HDLOPGy|B2s*6 z-}x}?OlA4J8g?d?B&UQug$-JW0qSlJ)*95mJYEnnBNhz$^hAgar2!)rh6yRHoJ?SO znC6gkDv+XRu&-sZ$rOxOu=C|`QkY<+Vri36V*}gzW4{Ec%A_vKY#OnOkCAo=2R&h^ z4I>t8TyRpMC&a&K#0t_}uOLzz1sm6<6^a>>LhAv%n1!My`xg6eA(EgS|nqyF*qX1uUi5C=xOr;+QmS-xtBo7da)&jv84WR(UEb;Xj$7 zA{#J)A@!8ptd-#edhA&)r`-@yV`#h_^@K5!&U&L715m>bbt>$6hjAs|kCII@iQSc@ zDoxm{gLN(sD-|3v;8#ILQMg5@#Ce5I=P=^DZi7}PHkbv63G$nO%?3Mqi1FsZVE8B~ zHR$DKaEX8=77B*~y(Ln}4fJB`qo^Ej6XYiNLNFV$1qNNb5HqXv7CT%bqG^@Ys8Pdj z!p4li%oyx|`-I6^VbSS656Wy7qYjp5_*9S+g&pSPN-`@u97Z)B=fFe{?+3gUg9#Y~ z4tqsKh0|VHWi_gs9hIhX3pP=-n9Mf3rXw0Fye^#fTIbWd)y;a z!w2}oEvdQ&lf0EcL!r)qGvx2XF%Em*>(s!(Zmp?$?C`g0YX0=pQ#pl0BfXyvW+T#& zT!XhyR=w4*UAE`R8a&?GVeos707rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDi zfFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15#R`L z1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC490861 zM}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$z!BgG za0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL3 z07rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h z2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762 zjsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W z;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd5 z0geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;1 z5#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC4 z90861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A0vrL307rl$ zz!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1Bft^h2yg^A z0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8I0762jsQo1 zBft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15#R`L1ULd50geDifFr;W;0SO8 zI0762jsQo1Bft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15%|ABU}*B#?zV=8 zhAEK{CdA@RHll*8b@L0q;RtX9I0762jsQo1Bft^h2yg^A0vrL307u~eTLk_WgE`o= literal 0 HcmV?d00001 diff --git a/firmware/tsp_himax/hx83102e_gts6litereresh.bin b/firmware/tsp_himax/hx83102e_gts6litereresh.bin new file mode 100755 index 0000000000000000000000000000000000000000..f1d1b24092a32ceee57689167996f1229a16aa71 GIT binary patch literal 131072 zcmb@v4R{k(zCV6uGD#+BXs4w}EtMv1c@eR+1tGH8It?MVSWCdJ)GSJYimdDIqUEms z@AY0L?Es<1ZY?FPu8Tzr*1cL`x68KbYAUEfU1je&yQu40Dz~P-ENKh2l#u*BXOi;b zdVkMz|Id#;lXK?0pYQpe@ALrm(KJ#7{NfDlo6K8Rn9z#u`qoAh!RXEy&vc2W{y7AGD#ryp5&V z9dTG}04yHpV1E^a#UjnT#=g7VyC zX|$q28yY}ZM(Z5l$xTB1pW!MKrvS(bkIehTqP9e9rL@FrWhd4t4P(o}Iu&7L**@Fe z6*Xx@^UrOeB~m3wy&J>B6kM495O~7mJe6I7}Pxhkqw&?4!jOu@(voOa z)FG09;rXlN>@f(h6B!$4UJ1t^$(L@}c+cj*swWbZ0P}Z0=lLoPGMZm3WwRMkC2+GucGj zjF6k&KUX6&WkfH^0ckdkrCOxfzCM|>9z=YGdo%Zq%oOX#BE|ag@8Ow==USQIw;az( zJO(_QP-3{(Bu{r|u=-vSO?LC#bVaX*Q+tS;X9Z`qfj9_xK21XeghgdU$dd_uQ?yRP zn`LvC!zo}5NIH=UoCR9Gs!%#AnVn`Wsj?&=x2Adw)>OveW86vR^ARaR^7W^0$)A3@ zEPu}F6=h_~n`K0EjTCT`yi7U|-CxyKEnSW>LT+*r^e&K3(gae0b@>x|Tb{2U8x3ku z@^wjv_C&F%fETMfd1=6V40UFC-=ejg1sb)c_Xw?fpdb=J$@YsS-}dBsUq|U=r>G&c zy!Ys2Kf-Q8B7sED`_lwQoXl~uCwZr!>2(neIm~>rw^$$L^(+6C@;WoHBuavf)qvE@yXtNv=lG`j!g%6ialLCUA?F_ zkz+%?HptSp3J7qr$;Y@Xq_jK7DH@vm&STm}CO9#XuFRE5`$<}lq><|Uo1=Q4#ddvk zDB2ONL<_onj4moipB%^up|?gx;oKyq_c7RkCe+e71+9UW6G-EI6wj_0JFAY}jNh8X z*e}G#PO)li0@$R%lSi>Lf6n-w6oY*ZC2g;LFej9hFJ#JYqTyPM3NNFt@k~XZPcnD3 zuwJov&Uj{7EcSQ0mah9rf$h#{Y0I8H=Uh+kAacNE(Gk&;L1d|IP;BxMYf%%^@}U?u z5m(_3ksXtWw^|&NQq#^zq~nCxY$m%b{*QfiX^SM{F0KCDwOXq7zE%E%ZJz=I7-xZj zuomg(&87Zd2n!^g8egHt^#t#O%R=ci^fz@$Bt_EuiJPznj9eGw>hF}yj72#G$`>2rya`7qaA<6Mvub6HZ5<1E;MoWl;J<X*%j&C1pCyJMclzA%HGx}Q=&!{6T=k&U1(?}b5A46W#4 zM2$70-q*^hve<=n2U*!HWJ`QkN!PM2N7wSDgu}jN9!;#)&UArHM+-#`q6r~ts!a!EVzF`}tpnaxbH9*Sdp)Uj zFvp2k8?NupmaEq`5pJj4a&_1f)>wrp%-XQ$u~25CMKp)6@;CWO#cpDhy<)g&@u|Ea zZZ#nqKatIcIO_;U%EM%q&*IMDCX`u~VM!zErKzIXOZUz7tMwA=C#x;wI)4+|Fs&Bq zXZ~|L)=?R)h@2nuQ(HP`H$PMxW_;_ddBoth7W~fFM|ZM==*Wr3BS+BQJmmytdcz<) z{l?Og6g+S=*iCzrBy^HoG(SM<&zd^)%=32AX$lj+%E~$)$DOJTr@ylFeB2 z%*)!i>)2&&$T{E6y}XBbUG>DDq~cr`uTs!UC)i{TPjl!gVUqE@hB4gH$PVg4I-K{5 ztVALTE7RN|>~?{##-2&XK4YWOM_IC-E8l3XHKq&$b&Ok5=% z(z!3rDLKvHZgz+Sr=P{lH=Cl@|-odUyL+0yZZC`hL0Ez#Sb zcRK}kh41@briDE~c@Ac2ifks?5|J6vEU}0&Q70|!%>l(^qdQuf)tCmc-D-?OtVNA! zqgScZkZh{19h`k)Da;IOD+gZ2rz2 zwNKqq66FyooW6rr9lVTIEp4{?oqarLMj3d7WZ6uAL9LcHXHuG)pac7#cYbF}hiFTH ziwIt<^gBxg5`7i;_-AEsh9)9x8;|+@>!P=`J{4;OjZ{-)OP6>6>ue}^`vO+l)Vjkj z(G~ZT_w;_DOY4l4S+o2a*oK9PsWk%ipQ&InaV_5wunsCWIU&NjeIit>gxt@6*Hp6 zfebpoqz9GsBkAC6O~altV!U;jkw6Fa$IA$>C`oFG9e~taMJwl0tV-H;U?KVkAI8%a zP&qN|IXwz`!1e<$LTB&vIm!ekMV^y%}jK01xxM%XO31^-V7+0p{4;i zejnwt0PU-sFGl7R-!p!rvk50Y(VTEi)5Kg`Oib}FPG`AVq$eHiFTx{hdovx z<>BnI*u?L^w zy(FQRtJE_dTLPM4a-m;V|2rg|;~g3+;_~GvQ4Db#-;;$e?t` zE;!Am{=+$-KtBWozCfwjD0K}=>19YG+H4hmMx05QL2lr~O+(H~`bD4`S0Vfa(qV1C{_yXB>jJ&@J8Abp!Op?_oy=ZO%yx3Knus$K{Fz& zc#B22eEt{5nWWYxVg^d%6xF<}mTo6F-Nr=~%Q*tMa_sbX);7g!8~*T}xl`h~-1P6v zO^)XlLpuA8J()stL17#;7u2+mhM=Y#cFn=!l!>{$OAz}{Wf6WgpuW<90)Mif1TSD8 znkoNvxFp>y89-|ptRM)@_AG=n&f?MF;h@jK+D-`HUQ6`E5Tebh&_qMB7QD`V${6q$ zJ6e3FjFkN3^6|82mJ%IuG_h5- z7o%U;o{D~nUGu&R`v>WeYsp)X#4-{88tv^VesJOg2Vsx*e1_7$N9i6XVXg&N{Y1|o zVrCafzPsmhl-wyVm#Hi!mBq$>cKImiX?JlPY4LH4&n+W2<#XxMQmMb$A``!}jNI}9 z$4N_7T1I&i9&KDaJ!O{iC)(YYw|lY8sp`7v%E+?aWyG$Yd-S}!f~!oYWgy2d>bha6 zhNF=B?zX1Ua&$fA>D?vKs}3`gKGGMVtEMNaZU7wnvf^0jD^|Tk#ITJ}?RTEel$J5m zQB8iJB;$9Jl7!y}6&}BjD_Z>i8XQ&ttv*ECxSY#C+LjIz_8s%Q30zDToqdqU=nO$% z!J;BaDIDtmfS!!4htjHvs|H6O)kRFO5f6A4v-4W$7%kiboefmuXuCCfhpUK~T0XSq zJjQtMPBYi(Iv&R_@5+I$@iFi6j%K_WX}dD%G!~~&U1KT(xs~b~Nu!B!w^yD?-~3$N zlNz3lpGx2SRNb%7@Hmye*__Cur_vSmJb>{xcc{5jX-x^|**B{$t9gqWujjwJrj6zv zcpy>lhIl=C4t}#BUQay-opi6!ac|Em-d31V%+H$fOR5QkCX(OMZg*DmuHm|FbMwG( zeR~P;uxVI6Q0Xrn-VVq$9eCG&VsyuWCPxAJ$lo-w^FXP?ED+>+p@p>{7O9rGvm~t$ z$XSs5FD}cDhg{2ux$|jf4mdMM=X!B!2O0KsZlEgy%_q}6J3WOT$}IZ#bC#dK+ITsmPLDWAro$;u3j ze9Od^t{`;U?>f^6NuNr1XO1F!Hb4_%8#N-HC*>l(7_qs-(4{biRL?GHXbJKqZGF^;kvl5|!WgoYQJuBdBohu6MJhZ9zr={xKX{wkSFd+UkE#?1^rlb|@d`1*Rn%beJ zGT6)erPB7*aoBaHfqJM^HmId*RvL@hhH*j}u-e0#!{%YGvjqDyokF z%4ukZh$P~X!1FLvH;R1--5S~~!^trN{MQ|gIfK`Q7Kc5>v0Kg7=`v`{D=LjyRBEcK za#i7gqbZUSSleH=VX({-OK>1y~RRa2rVi=8r__CC+IF+!?1?~)&)|nk4iq@SWA{HgyzUX2K%Vt5`SOD!u^SjX95pSSd7ik9t zYj+w-|34QLP=JLv*}tfPWJo*~H;>j*)Yf>kmV(v-mCz)p-2cT9UL4)H`=Qtsqtm>L z(WTMW=m`Ae$`Sm2Hu?`><^gC}DK||m6VyVXS|^wXVUvhWKqttXDL2m&7h%Z(5!&sT zY_@5}{@Yo=NX@Ks*iq^0@s7N5nsp^ZKKx-v#f*mB1Pz17Wj8MdI& z0QB$t<5ycZ>|pog_$-HyD&t-jB|cZ%LK&~7c;#7uGXK6YULr7B}pekKY+wtEtx7coXy$Jn}Zpx zzj(7;m}aUHv?h|@dU`oR*up@6v>MKpCoyt%{ynE}_BW+zb*!>*rD09qVp|H|DvRT~nq)sR> z~zY^pTNwzoO|%47Mk!%T;+F^58TNG~rF3K|Loa|2Oy zvWTz%??jCWcw0nExrq)t+MuOt(O@cGaQZ7N)*{_p=P6zgHd`6QNnIVZR47YZ$X|l? zHw>||9dA@tyY1K#*#nD>E`LcBbb&Xgi*-9>8Nb_MlhE1jJg-EbS2)|P=Rb&ch!)ct zw7nA+JFV^d^M6q^`28zVylTod=T9Kzn)4r0n4}BrE{e;>xpFRkRk_%>h@SO>Iort) zxA*NzkE9?CFODort?7-qdO=#)O0ca|kH1F&=B%2#q2h~q(B%-(l)Gju1Z(0|r z5Nc#S;x!`2^HmarQJN;p;9*AGGONCEvH@?mwS0e1#M|#X1>HJP)3?gTv}BU5K&NjY zeyWe7yD>1xg{}id==WG;Mw(Mb*e>WPrIzpeYP{7rGwyD*_)EJr-ADQ|V>{oQ!0BBB z{L+beUW0=Rkm!?My=dXqv}k=Lhec@)wJ)*{!D<+ofGthk?-puFl}`4OUY}gjBgp~S zlq0Z6eGkt}Jl8@;Q;ugP9s{0D#rKR2qs#?r*BY7{_LRkjzoJyzVTRmmmMU=W9+KT% z4JdaK53CNCX!={6Y{u;GhgK+d{@SwGS)%GbzU(0s??M>~tP^Ewy*9sV^snqocEIS9 zmdYj0XpL;4;RRUaSzb0@q&!Az5l32BpQS6{&Jdt+B)bN`4BY`OGRZPk z3Y_g2?@tM=qW$Bf2`M;f<1t4;0qJh9Tz!yytfjh@u~Ef5%4&bq5Z(T=02V?lg-8bmMkkNmEJZa~;0M^(gV59s4@JK=^!ji8F%`QSdJD zS(+`K%Vo=9GiZc5^AIeckilYbMq%VUMF79BGr-EQA5%N>_>Vy=e@t;a_9F6UA^cC7 zrJA|ev$94FpNU9~On?)ir&l7FnHjn=%qxvybo8{6n6`IYI8rE0Z?xbnyeVAi&K@66 zXUHy@NanV-mU3bt*^P`h$DJ}h0h(5jE|3OCcB~!eVwOWlA%NmH^i*TQoIqOR93#rK za%R%%$R@Gq?evYplrKQNAT)rB@K{wHVSv&_cxt%V`IHXR{*R^M+;`cgjxS9Uwk>vM zkG<~_9vyFc&T8>8nK=@B;`}Fj6D59rsYK(JD@(xIfjwKi66cO;+SHB;;L0Uqa4OvNX`$0JR(Mxo?2 zD49x2!WTvGu9xjyZ3o)?O>akiCa<~6dw>tpT4sabEA{4d@!)7h+FByje3z)aM1qY= z^?5O0Q4W^k$y!UFDR+qv!f<<_H@EghzFIgQN z0hJ<4DuVx*0Oz`7MevJ>sR*6H!3kR49vql}1hb?#`1gq{giC`TVV(tu-4Ikj;|m~} z?{bRpZLt&1C6EHUz}LzmQvcOa?cVP-+ZIOd!Wy|Sy44c-i}vx`#MScH3;o8`gz=Sl zwF4!7W@tEyRn!tcq!Ox^o1BSz{|U~Kvfr&}94XIG8#3{&M+sv4UgR!t#=stUFA(Vg zs+|uesWA>Qof@N>@x>U&41|CVwdMhfH_JKrt-e^3meM(sUwzd@lD$YyyN zPT(Kly&U1M6KM{-JCL`Wz9W7u&WV!NI=uY}Z#lB)=GSQ^MA;H+rD;+LQm4~Y@!P2; z+3e=GX(kGy4;D`!&!XNFDxWkPRB(C#dJHxnr)86EN@RIi?5oqtZ1A`%2btoru?VD< zh@W~ttyE^noJ#-U0Y&r1zlT!aQ}YbUlz`sNYm(w66dj;Q$fYqtVB$#?WR^Z(MTp!S-a=#{QrqF2?T0GpHA_rtVrcqUPMBRHZ)ZjcS3 zteW@lT@FfbFZ>DbW>THZw;p_N3dXSt{wuuE;C_hFgLhda1>gmGk8Ag~7=5d#W&R9^ z9|B)w$9hea#lGG`tuvqJH>&oTiV^0G;@A({tgZVQ@ysjalawsd#K!;3iP+yXThza1 z;KtWa^=K+IWDvb^@Iw9MEv1~wEl4vb5(A|&=e=$;3_^9Zf z8yu%+jl42iDX*Y0slK;I7OksxF$1$gTI*^9)4+Ja$D!mHJ!hbk^q`m1unLSrSA3wS ztGCb#o#VFH0M4~n-~q=#?+rY8u;(!BdlohJJHX^2P*i$KZKY*<596#_dyIN6{R_qQ zWaPsgZx_xxvfyE*@Y) zg=k@GAis>v`yEO%RYaTT5=@eE4O-3X(FU_@n#dNEG>4`mcK_NibB5YvlvHS(r`nPt z_oHSTYC>bfbhw0C3GaV^tN{vunIpfa2sobt{(E6@O1N^*Z@dADgYAW7u`g=@m2Y~M zP`%wCV~a(1s@&U3>N$g18lbz*g6=vtek+Y3H1sYhC$Igj8<@X;RQYS~^^k49-}8d9 z^exW4MN_1FuO}I+q^~OU7WkN+MoDi?{T1Uo>1C*%rOLt=xF5pWZOIywQ({MDqgX4A zNgH1KEj_8NB@8og3aeM*VH)Om^QebPaIClM5{4_uJ=X&!TG`zDLeFn{;8}C+#~8oA zqL#G0y5vp049XMP1a4!t0=^URYDp)}2KQWtQuW)-J({4?y@k2{Ey4W|yW+dx@x_-Y z`GmWg<=mU~Jk}*a5tK#lYAw=?SgT3e&{GtM`$($(kxFi&7JT9+X$9Kaih4SnG8D&u zikt-Pz}r0-_1%}vO@sG4-J4;2?(*}0r@NeLo;35eo0aQ|W9w|z)&p#Ok3JlU#lDJO`FvN}yRleo z^7#kipzwbK_Pp&eLl<_tWQYWsN!%8fpf#X|Dy{hs_*r*e;>AO~Ytw`?~%M3dx7 zdz=&Zr4#S9tQJl>l0-fuAuWw}lqy^Y&rTzxf$0wnX)tf>VaNqhMdN$=Z>JJ1Ym1k_ zA97Ltnz85~3;$5xOH{qzd`L*x?Uh8<1`V)S=k(=*iZWGptyxK(j5$D6T%S#<@N>}n zG4gvfy|E9tH@o#9m2@T+yf;pLbm)mAf3L?tZR#4zp>enf(5#-Gi)D+F)WZa|fL8S& zqp;iiai%Vo^FU2ARr`&AoW+4D@Fpf~5=O8?g}}H>K*uU!sc-*-&q0``s0mbtsVdxV zmX^2t$eZiimu7B${lt0I3mF`paVqpW6n2B)brW93R7Wb$h$e#)slLY0qF(J5lBR=m zVylG4Jeg3+lPO9Jr9?g^O{~ubB*rkJ2SE!Z!0~@9DZNE$Rh)KGx=A%a7sh05)Z{0X z0?{1P_~0w!gFi5I&IJAxZ$n!hIYvF>{#DW7cY`0g#0wXi8JDnwh(ucBC$B?C=QOJ_ zQZ9DP_mR59Px@$TTyiP|PeuJqYSex$^rRsI`xVZv6*39eSEMmTNTb+Cs#>Ir9Cf*i znN8E<9QHFy@jla?k)rP@e5qhStQcjc?==kSL$EkvCKhn3V&*RC>HLCBubnmJ`Pdf5 zYw*_WNgY_`l|tML)xHvCqLN5szBSz1K>nUel_(DLly#U_J)iq*n)Cg~Q!aZOI8N<|lX;(=n1Zu^1)ZlV&1>Mx0{h$? zf!gQfeehV`1swK9O+M&Hefy4c*7QA)Ruk~RI7X>t4;nIzeYH>uo>Qh;Qzb^slZbb= zk9~eMFzp;L4LuMF$=k}v_4g<%hc!L=azRXn8h)etPaE%@bG4Mws{u0EXYvP;$Z?U`O_nW*LXuxIDryKj0jYoNqy2)zS}TJ6!= zJzTA99+($Oe@pK%k{@+IAc4@gom{JP5RO$ttdtUnRyxe|icRPqlYWuP8X?1@`KnGHyYgNqr52}9$ z_NTv;PW_I6uTRSXc!s?wAIZOYe66f;iz@z8>a!dCmU{rF;L9Wg3J-5vLGv;V;V$sf zfG$M6lyyF8%X~?haU`=>qIxB@)Jus{FAr!hEA_I%y9-#H%?aLeInIEs?`V4L0h3CB zIIOiMsFUGwt@57B!Ks;mBj78?&R{I-Z8IW20X`)uvw^W!BPS=3vvD#9@1LWD3A?!l z`Nequ8sSaK3}E$4#B#4}Yi!Kv0 z!<$R0N4yDjI990NJ+NC-h@61~$MG=*xUuxBRIY)G?#hcp)749I*h z@)OW)%7@z~=HeInQFR>S7stT^GxS_x{lq(v>=b$m(6{k-lGNC$`iT#96SJHJ6cXbV z?zt?5)GP`q+UnTnbZ!%+(9~8S-PTND@HN$WBSo)p69On6_9%XB)RKYTp}T@^q?z*4 zz;8h!j)GWBg1s6Pr}oiy$5XLx;JTq|;}kEXcth3dM_X{(>Zr`{sDs_|{{(Ui&c)xnK4r zBe#t9;Af(aXnG5SlXY{80l#;ak(7ZlBAmr&wn8?Od+hl2^rQnqlz)9#m3eejCjee# zl=`U6^Y&!*njphW4WuD097utLvN_%+Vt1-B+U{Yr3o9ZZTS{Ab$<$2SS=1v?UTM%i zv;h0eK!hatUsK{NaQoyQoX{yM{5Cgp(ewl)Flu3oVpPWr zKg_W(9XlSnR$DP@LysN5x?Z8j1b!79&DfWC2hTF44$@Y%#{^$UKqv*AA#NanE2o%z zxvp7-CNwgTA=j3XwChwjtFydp9>4H1e!4N1jvlP&G@GBWKiWn>n7^{_(PVqOcMqiY~T(bE{0Kgn$OrTB~&)IKvPZi6f0af5(? zuC)2^O*92>@KS&uH)@$b#oZrhLe9O59B`%Z_Xzjcdnk2O+ogOToe$QOa&Rkx)H5=6 z_RnRpP+tHN(ZtapC`C577~#jaM(y435h4 zV?+5jb9DSWzzGgvQ%bzc2a+Uo@XGDuEkhW&XvMe(2@vUz4~$@Y2mF4i96vp5HHn(QXZ6| z;rDxUFO{M=J9Y|EGOPvaXx_LuUJWSVt&{No_E^hZ1peO?dY5L1wB5bQdyP0@r+{m^ z4ICImGW7nhg>~7dmhF9yBq734{u@vyhA9| zd=zR*CXFLEpT6}{sKB2V`o>`zL-+z(A5vj>MmeQ=KEs1Q4&l?ECc(@mkb< zANe$Vq}OyAjG^gJB^;dfJ(8;D!@UeD@c>G*F=k35(&2$sqzG~VvrR^NVPbxl)`Oim zfwM)#$zj*!Ng}je9o8Z(yin_#q5Y>l z@@t1l9cUdq`RbehsfVj3p&S5|$8V*+yn`$tbu09NXeVAvp*k&!7gVZEN4d3t7xpkt z>We(gtI$Vi4A?!hTgv>mKq|OXF+od0QwkF)cYyygOP+rkg9iLUjV!)4LwZ`;Fewd# zr!`dV*X6kwQ=KSryvXGdm%J&mOW#3Q8B#FsXGDplR%|D_es9Rwz$rSBgAbCPfS2}b zFgAjE#HuwIDnOE8ssGT^U%?S>HMrKh#vbV%(pKn*Cdzu-p$WXU>5rHfAJ8>2ayw?r zOLwcZJs-2uzcEeaDf5+7?9xXe$4|i=V4>3Lpt(3hz3f2o&S0nR!KqC--dm&9lRPfC z-%{`cY*lSzoqP+eU17uj}ur(UF z26r~j_n2VINcSEa(7_WyrZbu-_=D*Uo!pLd$q>3-5mb3O3nOHzY7_GEoJo0E`P%kE zv>Ge82J^PKOHGuDegSz&WH~Q`+n4jeDO4eEmYv~hslFWCcl)rXg<2#uRYF6D^xxLA z*D$R4T%f+MVWs~uaTqK14b}j6EpgLQ2i-;(GS159z3c*5bflkDdrSR~Ii!yQpRv9i zc$4fKfqoD^LVxcufqMAdRg8s>SZ;qwh{8`j-iznIb0mqpX7cT8Juh}#bNl||-Y+um zCroBoVou;TSdR~DyN2Er7+-^V>xSSlGEpG6(-gqNC;j)Od=(x?d+CX+sUpUX9B8NZ zdqqp$?OvyEU#3}NGU2EG@mYC#Oy@4;%%Dw!fIUMBroYnS8pE__Sl0s zwa3>6uR~ermIHI}wiTy+E%qYSnEY$N0G{fOwPEfc{4R`x{7@1kbwg+>O%=o1v9)9M z@{mczyR_``@V0C!@<%sx|3FG@KV(2`Vo(P-t9+w-uK z`?p&}?nzusm#GvvRQ&9C9jy_@@A%g6PQXQh!@4drcwpNg4%F^(zVHRh*eweWek1=V2?tT`J zB!+e1srjnaJE5_H)4(os9iiG;f!&ni^(f?CAuwE@|eNr+1~FK3piNOpN3RSZwpq3J#MSH9+HSE z+d{MTAGY(6QasC5J}XOlUwTnmK(&Cf*f!0p$sxLh7_-i+^I2Lw{xYB4J-7NS-S>YB z+kT9iGa}37cGwXwd|N_}yn$2j9%z?fEyZf21oH4(1gyM$fEmhA=~@b?)VkW7mRHo<3oxte$w*eM`GS$Pf0*%egQrS#>PEHy@d+!0RBw#ct`}@eG?B8>3 z0G=188=*U)t=0GB)7vpr%fWQeZwO!(u#Y6<>T2a0N~2YNv>)TiP-l^$n80Pyvv!h# z_xmXQrX^riP_1`)IP1)S(7&s6oT=KVHOm_vX6PFJUDc54_VXPC`mWk0*3UpI!GCl{ z)zCd4bF3}MvK@w^kmMw%fCBqfuv#a_;*8gTBB}?z7cgEMr9WQk;glc3q9R&zbw)Zn zJ|gApF;s4m^xj?8`k5*Wd={_Qx@;!C7E%Chh;^Bcm7SuU_ahdsGp>A8`2f*dYiF_* z4-#u`zeM_@p&P|*Sl!AEI7gbw#iW#xx`CBL z$49jIo&htmT`n1EP>yx4Yq;6}*x_{}n#q!PjYdr)^`TeCz%Zer$O z-I)UjC)<7)xfg59b+3cvjNbUr!H+v#5R%Uf8+$z{L9n~-K&V5w1|f^E7PTsXAFsA( z``J(`#fQOZL*M2l*#s}?2}7o1Gl0$6fpoR3aY$G@tO@;74fA9TjDy}U8lfYjdQIp! zrqZ!d%t>&n;E=(oT6#S=pa0=ydUk;eSRMHz{K=qWpEVTF=HD~ILz}al>g8vh45~W$ zS)T-FQJws(4}%u9oD#f->f~qrDR?#2$}Mo&2o6paDA& z6n@q#pnCTV_b3@^z261sTTn?=YvIy?+RCrh)Nw_pw((4GLWT_(b@v8zHqFFF+w~WU z6s=8jZq#;tWTM&OU)5j+x8{tRM3ONjA{CF%$`E6(FgVe_4{a>wJuR&1m8r)N=I?}E z1(ucGhHOAZ)#yT>+e^KH=u@11E`*b`=m3A9tdXI9I2X^L5^8g4F<48sGsW4_<6cc` z?h8CCZi^wDvLCzfg=AJFMF>p@3lSO-E<~7wum+(4;YNh;kRf-2CgK*bE7jD2HZ5wK zuXsU|!2z4M#SlK);lXbsi_swTAuL4LfN&wgM-bK^+=Xx>!e3l!6Q?tD|FI`+n%I5d zfwa(?-gJI#{`7MpTW;(=E3=&$U_%=8X((PfF`lnKH)Jh>O?^YfDDgs1TLd~Q`f4ZT z7FUs}LmIFyo04j8;`8ibFTM!?-CLn=s<=whRjeirPaL_cP+}_5bn*LJy*1DIePSpFe^xKf<(i+l>>Rv*h1yZ}+g+2?w#})46tgH5D!1~1d^azi4!$9uEcY|Auu6K*) z*U>e$6K}1nz|;XLZ4+I0*$xT*6lMyK0jnz#P+_5t%T?s-n1qKl2Xq$DpktE;C>$tU zC@d&!DsGGYYeTgPkD}PW(lRKKCa#hJDdy`Z-bv*ABr&r`E<$P-O}PlE20-eOi;&ut zn0*7N&X4J+?8H|Kzp4&!3!AJ{8S1xY-~@K<>pb+DYo9Ek@9@Z`T%8^|z&V#@2cNUg zFf+`a;=|;eC=P5lOV#!QK%~&uLFY$tWqZGWx4ZN_w7QI6?w3XM53hshs^AIm`l#Pm z1RT2yJjbTiW&d>@#W!0nw8;x&oBbN-Ay{Z!lhwY^z6x!OSz2$^FsW|-{Io{s+s=j1 z-mlUBDaw_qg%g_85< zoErk2DU#~!B~q=6HFYHVN~d-VwJ%6G=T1@i=8C@X6{B-Qa`o#A(QY+`YU{E;%~$)F zs?O(Lbv_K$AWIwQxM(l-0`$T7I;0I3XN0eZsbeoenN#SA&LyPI3^Tg$XW9$u>&GEs zVMh7rVSS>vxfgp|7W=U}BL*{qE#$Jk=*noOP}rsWCVMhn-jg~n+7s-`=Ry@}WDV`H zBA0xO^_uLp96i-goNrzBffGE-X0_*Kbj<)qZ9fOw?rz(%*nO?J$oX;Wk+%8$dZdAq zi*2^uhLj)MYGXeI$G9wVr&sIcTK}zI8%nwekxQe@h_CSESTDdY3hRtpB5}A}9PQ0? zw25^#SBwB3;-mh{rBNgGDfGW7KJN0>#ch|3JdOeJkx&1QkxxO*A6*>zmT!%G%0G>q z0OMoPd*V2AarA5G=o`N^dX&4ZVSRj8U#P>|G`f$Y&D{NUU(%TWF>Y1ekh-@AK*_$K zJIwClYo%p0Ej>{R_t6uj(k*pg(0z7cCC0oFvI17=&lP}le3d457T2!9-$(5Q5z%Auh%LLokr?nL#t8Hl@I068W#k6RsliXd;1KT?c&jj* zwF>i$;?^ehzB1CcwmH4}rRH=JFK1k|)ZAj8Or!C5dQvx}GDDTcc*gs>_vXoVmRizD zarXJ6OLNnq!IGVJEnjO-_txSr@L%zLI<{Cc9lA|+N;BzMalrGe_-x$)jrVD9z`nX8&%QA)uW4UXpTBU# z<9{w(KT;=?0X=GL7y!*+ekgB}?xMYseS|r1oWs|sy!YA*JMx;=w_bflem3pEZm+{` zK^rBlsb{vI;Rd|LE6*Pd@glw)a@UxYK4bv5+b#~bsBh4cK7}^4kQOwbrQmI+ILgzU zY#NWl;gQH5k9E~{VzqdPcX?CEo-*$<;Hr4EZ^k{2mUqP(AK5jFt0ydXMq+oRq{n0Ace-6Ezt?fH#BjR_vukcTesN;M zik#GKt!G*5ZXLU8E`E*iHX9cG?^^)fqV8j7N>}M$<-4kD)+BT#I6!$dTeQF!v z^w_8t`I>>vA^j7-IaP@iFK~ZjgHw%zTE_0AElWr3E>o?&+E@GRW@*#22L}#>*cYq5 zm2)q0elzd}a@^m_`7v^StJa}7ppNs|&I3b^FsW(S+OdY49de}OVS zXrecxqPOCUr_f{jaYs1%ln?jK5CWfJt6(BW;87r9m1VJ>VZILcFQ6! z|K$CZO;W6#l?J7(jw#sbk!7+(^%x0VvzWOClqjy}Xol{DYWB9$TO(B8N-b{KwQJut!pjT3 z0RtuJ`2MWI9nMx**nr!iq1aD8!riAcv<>f0wyC~Z%;60!1O5-i95MrSzV@e%*2&ew za=2c4Mq1|5KCn9M0WS0K{^39?tDn5XzFw;J7$w8-_U*WlRdPz^*-=7D`p3yIOC|jN z1<)y!_#dOG>iaK3S3_4EO-m=FID_L!OiH(gJ-ir(jR<#|SDliW)Xyb+a}L%q3t-JC zGilvnO`Rc3v${GJVkg7l7Jx(5KIzC<3P)$qDPI z9z>I7HgzCgn20O%P9t>BHOImjg|7_liZ@LSp=Vr47xIPslt^_`pLCaAI+u!%Fk52Wk z59y(4tc3TB15b5OkMUPxHtKHa<)QN`rn5h$mse2f2753F+24V<(-CIoBaa-T-l-hB z8oG=ZLrLi6-hteqY1CprUX3SPNrA>Q+ihj^$Fz8N&~)6To)Nj1<_4#zHF84Ke}(o; zEg5R>&^=ebse`R0vvo%W?hQ+W#cdofCt;rdMrQ{au4?I7m!?^U{t`D-i*R=!t7VtB z%<9-qh=<@y1NNM`wXR`E8^eD{b&p4r==VjfmR+gP?r{E8DJX&K^_MEA;KT7tU`Y1) zwQ`Bo?4jSU<#XuW$?S>oODRRF?+VrloPjS**kVefCpzx%R-2|mLdAC@3!zOPPs!go zb|!y%L|?pMVqDtn5ShQ`>m$(4kgXmOR+wv$2jBFF0q5{qHUBx};l|}STl{RqSgemE z(Y2#(Q>l?^L*g_nj=hvRKxa*Fd^iHs1{4N9=wR21!U6$JZ-m-crIXfG*DwRm3~|!4Qa~{d=tGgllda>*S$tJWPqEed z*wxHuxkKj$2Bl4*45?4iQZK$nnp1c+gPYOkqyx|%YoRgF(;M8@`=>C211NuFXz8ED zC$8HwwC8bHzGhler!m&YrZBScGfT+ib=o;8uj4W4Zqdx&?r)N2fpX9H-W)ZtmTgqC zN%*Vq9ZONk@eWv-X^cFNt;H8op`FUQiuT}jMj!5Y%(q@Ndv9;t=dbePzPUf7Bw>#R zWs!aj4b~!PzolG>ZCLMR<$1pKc1EuCGciglYebe@EevRg(@(wJs1IK==u%P~AE<2=C;v+rpHms`$qH8Wni?&GxuHr> z|It1p^ijRg>XFO^iVnZ|s@0?DO=?FjpwQ7j$YW1t(3IKai?2&*@)NqF8*S&$(L%`M10QJmNy}aPzr5j47Z-h*F82(A7M9$YV zC&a;?%J%pYn7gjW)NFwr>J!y3YjtlHcEw8DMtEVumKmfzT3-e^F_$yI8bdO1hhPNv zpAfqqv2sbIyCgurv-2U|9cm7Z-PFSPJ#p_1!`9v`s?C81;KMJQsD`Ji_K|LAsIpp2 zUT!d_ovnYpnJM|qHe+CBNYm?61S>1U%RQE4)$Cvgb1vl$jrc6eDf(@TRk8C;lt%x7 zRIFx0@Do`A-$V1EmP7rnr=)|f!e7J=dR;5)3Mfy1u*W);HPV=Cfk&`Tt(%OC*7S?< zEs6Yg8sdy7u#5CQqP56qq<5uE7bx8_{Z*EF1gT~~E1AP}V%jS+^5A&=~xG4c!B3 z%{gNlvDTKUuw$CT1M0W63zXA7k6ScR>%l|Ln`1GDixjx*DKVUo!X!*&f_C)w>U7v3 zttA;o8xPKRy$GBZXR-&at4>QUD@kKrzmTMG9cWO2 z{b^FGLNeDnQpbj7j8x&9sE25{Ysf*T!&zQS2=vOZJC9ez!H+<3B%U3n@Nl2-PY3~`4(IMlABS|4a&-`82UHn847{L)d6SRI(#4*VLG zzZ~=)3|cK|taTZ%f@wBZ%pyALG9zw!E2FrNgWEb4Y^+o!2ixVR&_6$_v6f)|Me2OV zarUr>=JzudBe7f1&iXpKmRc)Ip@aFJX?y5#$5J!Co4!#p`uL?eKJ#;`j=E|!^;xbS z!51$;2jJ@$fXw&QLEcI-*>154cUBuLeI&PG9;|ymw0CsmL8o=Ay&bmTF<+j%(Z0l& z2Pri<&M`G&Pw&OoRw?(?i2c6TsJIXEfMz=#g_Wsems(7uMdQ^jHJcK;5|htbokjI4 z)H)Up+AmTEVWu$=w^^HJ;%jEHHf#G#qf#gnO3SQ^G;GVV@sQ6( zEtJy%b(iCumT7)mHk|UX9FV^7P+B{tLitzSzjnao^2CjPSlRTgaoxkCTOha9;QZvQ zmNwqXw9%6raCvkKEI>)1FQg4O?qkuz#&pm=?6;p6&n0tZV&yV;>#7;7oUN9?SH4>o z{^_1X-RHe#FALbIb5N*_p)`>E<`mnM*dS!BV?)%hycXYRl)!10;+%&+J=&v^a2k3< z%XFMA_s9E;L)VnN|YNW$4$pdB@nb24dt~gE-uwB@^bACTDM#vS!nfaU&fQW zT8g|Pz9vmQe_FcD?TmLHH;ph}hnHz)I#Y{NqNkeo;cM~){EvEU7rdX^vgUl^{G1lfGjxa92{vErDZK*4F zNYh@%ZTgp`@|y!`j~97M)RoNvR;g=_S&6CeMN$mb?Tqnpqxa^?d>@NG;7>Ys7GLXl z5nMU$qOnh6r5!iDf8ncqDRZ%ki$bysyu=OEAEX)g!u;9tJa`tw{i@`ELF6FmN@Qvn zcdh(PxDIvnxT$i1{{I5021xI#u=4b~BtN0Id})XWw@b&)R-T!X{$&lQh!)GqS+;?P|?yf=9@FRvwDw6 z%bn5CHkR7cY5H&R4Rdi|sM~^5deM`Nq7fH%FrVG*{}AuXI_dlJET+{0NodhqQ{nZM zVYOtC!4;rBW1s1VxX+A;eN(({Vv(=Jn$yNBdVDorSMdz)8tub8P%B+47=5>RY#ra_`(s%NJ(=N^Am; zK%KB7n=m5VTT3yg8}sK(6uo`J2>13v*yhMUS!ltj^w9N_a98P(c?Q0}=4CoP#XOm7 zb3aijYj+H0g z9;R>ZjM#EWjz8%uc~AWOI>dfDWF7o+Xz}N_3@yT4gX$sbQ)S@Hnk0A}7Y(KL;Hw+k z-W$Nz#S`f!q%RrL^+1}~b_|s0YTJBfm0A|xUrv-wLfYzYmD3K+f}CbiG<_VkRgC|X z%6QP6{fgqXV!)`kU{7Zvv>?1HauixF+~=7nf_#5X^HIq6Ka=_=p`YJ+0e3bp#Kd-v z2km;e!5D@w#Dyq)g?ZaGv40auJN6W;69f=k^$qLU$XT7JODM!@oL(c0b@u9 zZleg^qlL@!ZX~6WMrJ}g3J5hMR8oWwuY2%AKwTsF*DOnWe5?8fk_7y+^6QSiNRD-XK zQt4}=2wz~aMve?}Ls_DkGsxAVz%TLUKqFIv+c6E`X-fuI3~|!Wq!MM+w|;QrP{cv- zO#}E7*=G203suIKt0K$rnW2>}W_-QWe2~(2^C(9#`WsDo0hucel$*&c$x$wnoL?sY zva8`9ds;@`FaK(1g*>+mP0-t#)%bCIT=hB@qqUnCEoRO~jbNWDgNb}3(7RkinzueD|mGvENjMMW_g5Yx;Q)O0Gs4I+w}j!0@`CrnDMPMTWU<>W?29SIGI z@RCQd)X*%gNWrWIvl{K9p3{__>V#t%oTroEC6QqE_x;&3nDv}O2Tx_I0ffj;wLKc%F9NKdMMzNWeflzBa33L2BRV}gwXWmwC zZyHlQ-vvhZ@Lg1ApSkhticzj4d#WL<`Y_f;SPL7(cGox2t20hdZZccT6jsVh6Mg2U z^WJcKU&b)5TvR{{^`6VOspm^GUU7MwwUWzFa>XhMVw{1RRN;A>rPWF`!GgCDS^(gK zy%6<4yCXq7`(|KIX<7FLsDt+0gfOd-F{=dH>;MKA5b0-6iW8mbR3EODaaq% z{86Vw3+a{6>gEb@9n|vdgIPmWBQSqI3Qj()R;4FbC9cZwJ_l~+9F3-E!`k6mN7)kf z`$X*d1ZY139LpL0ENJYlYAIGm@0obaXisvQOSgD6i7z_++MA$Y6&`peVdn#@p|IfW z^;A1{k+kbgJHUM3V$6TsZrI8^H*dTFr^OExzgsb<#W`NE;oEO#gPEZuiMW9M<0{9V z9@r@P$Ady=0KNCo?dzDzM9D;2wfoB}%TA9+Xa(r%2JD3&btP4fh3sOebEG|HE6(SV z&CbM@rC!rnsUf3LYQej1DJtcY&M@KqFfeMa%)%^=6Sz$R^peP``Op{|jWK#i&DAw# z7vCFF^-xt5o>RT1N|-DGpKS6u$@6!jIJgb9!@(~Fs)IWM>Be177j|X3(vzjfRykH# zOYg?0x9kFMF?<2Zhvuct7<2f@ci2%Q>=Dp4z&R>ymHIgCk7S8;FQ+v_0p1(>d)mwD z6S6Tb6uT@5oXk$81a&Tj#2eO8;Ba)ctQf@N4UVp$=cRy`HKAo$W|S-0?`&Cl_9^Gh zpn%$>1)1Q^M6HeIOPY($mJV9mIshyDkmgm*;o}R~J+KF3L(7FSqj`BvLJem1tET|Z z6lVcAyMBK*M7z&9Y&>jg0Zu>?GJPbwu{T6ZIZl~T1B(`4HZ=5nLIdwJhrnu%H( zgO6!6M`?!&@Al@!R{YYQ7zI2GmuX8g~8WYo!V@68>>=Vj2q0=sknzCbwo=T z)~H<&w+o(3EhMifElZ5utniwIQctNB=N-?n1VzHkW5k;^L66%2>i0DBg5SFvw86ei z&lHB|I6S`+=mDhzPyf(p1{&OM+ZuZ|3#{Be$QsnV0k_ z*{zN*d0Ngb+vmC`Hf4#bIl4KJ$Q#j`0|~nZth%oCL}PqR8q~cFT7B@HC1duM zn|ff5lQG9%i+hGQ8skpXkx0bJ(BeQ6xhor zt{P$o6~v2*BG;(xYx4X1yHqTvIl%64i9buOj4gRz#?pQZ{5GHc5(18hqZEewhtedJ zGs*oyMnjz0v6)$ATPrM!8S5FVnIqxc+V_N%tf1G)6D+i*&1mMnaeFu8`8G2>PwLO@ z3ls(oFxvxkl2ui~=S_nawJy9^bTlzABZOP+^9{oHK@rZ!Sy|d2)W=t!EIECOo>o5l zuDrAt!;s8<9y}Kz^oh%%kNNJU*iDg+Vh~kBP8piQeA!J&7&V@Fn&VkCb#1Swuv6f< z%Pm&;N`qHCMJK$H?}?_VUP<;_LYl5Z8gn3xTo}iF2ODptCr2UH90!rE5IeMkn9mRT zvXO3Fld--2RA!TCum6dEVyxL*zNNfq?`Gch<4?Pf% zQK7&$uF>dwzOhTmXm6NnblRP0!xrE3a*`HG{i^UI zowF!rD(n3Zy~oX3V*gm-l-mwD*9D~UYu$wi{0H;L+0VvaXaHt8pOp)uoi2WT4h~&`e1*5#@J$yxnd}GGqetg ziVv&KaGiFtwq&b8DX_*U58%GMg#)|&XrCMRU8Lh%90V8Pwib>S+$n8U$mbQDhdo(q zJ;j>LwXqnl!PBemIVCsst&N0Vm)frIGh;pSs ze)nGCvoH8g47pX(ZiLk#mBFECvG?aTn~t4|Y%=63rlZvA0M=e3P$r#(%h#okJcB-J zWe=Pl)>u%geIu1)5%K^e5mo@t0-vE`XyZ-!De8^(iSeA)LvjMPRLNGp^+@F!8cBRh zH{4&D(`d%n6XGkv8bG%1jt}!?!DkeFu*!Ry+l!wI^A$FR`R<1AjK&bTSYgZL*sT~< zli`zuczqhBb&FST*^%Qiy}_#Lz0od{ebjRT=M;HXF85`;tx$!w26^eKZgQ&Sk(H9G z0N+uxN2~{fom_WeYk3I)#2KojxPlF z1GwG-UE(O^NGl!st~B?6sGS&jX0w!~bI9M3$a|uHK2XX3GPE+s2c89W5BO7h;$8#0 zK~&03TFHB99K-WIvg?C;E#-!{bsutj&{u$1ugNKCJ+)XjsdZXtqPQQSbA58!wd(7# z4W}#v!E=BTP!4i+lK*S8yQOf9=QX(Apjx3uzsJ5eP!Fw*o$Ww=^AP%w4EvM*NU8_Y z*5TT(mB<7%iN}SecUK?LazB96%_M}r)kt~~OqGL?_TkHE4_uM!BM4b^Ipi%0(J%{J z1gnmw$BvQA<~)o&;h+Hz1ihf3Z9L?{t=iZ%&ufOyK!gN*1FNXH_!3{mm$3)+j8R|H zeqZ-Po=khMbK4c13P+F~KWBy4M)rupq+Nu(bO-lF}aU=tEy{ zM(Y^kkYt4P^>zWB%{pk-#S{4jDk!gzFoe$VtODp}H-WW8a8u4~{o0N1s+2I9I7tG+_` zCxQp1Mb5Q`rd_8#u{J@DvW)OQfUi8hW2|$hM&(HQRMUyZ5!b895jtIBjz;!Avv|;5%_Kded&zz5qXp~RF&lUmY-Zc zw0`2+&2naJrGHr3EgcRy#q!8n=)*!ulVld#4W;E`hjmW2T0;ko=un*|ND%D98hmux zwH=ew?&!$FX{ul5th?W`p#b&04YC@uk!lK3oyVOdu`l3GQrBlGm&ycK;r$4y^MTk+ z9k(lT`pC8?G--uI;xr*Wr(tc#X%Mc#xKePXlBEQ+X`iMI7d!U%I|j|V^bywW^Xo|u z&w_f`iN$_r0r+vS7H?gE&>uY4qE`ec^H<9;Ht1B9v5$3y$T0X=Nsneotz{hPW@MO~|!YJOAKEln?> zX3v2?yP#>i6S^Hx23k+wrdtZM0^zl=02>`R&$)O)qo>wtd{^`F?tW;4wiomcOTO9I zUXnd-+lLW`w-iA(_IA>^QC|fu&NjwYv^p4c(X*uySgojk z0(TTvN9ysn0vZC_%p_^ftvTv@!|P!81M3P4w00T}OHN4ts$W3!1hlt7x{=Wi4|&sC zn}OGBA>>fzLx$3#jiL)RPOydOzYn9fMcx<>_@Y2viG(HV`1Xb1qsH$@dP7Ni zbRp%0Rr@^1@>gr=AJO!PY$wejwOhc41?jmQ_2W;;g?kxE-v=~@P?;A`X&608+Eu6w zl>HdWejJyxU4cY#0wjuqves#kzlMY}yHbN$a5o~OW=l?kH-R|XTbF2006NB8M{e^ssIfHD{i5YI>=&PamfI7gnJyS7-~&xApP)Qw0}V)UlZIP7&(ZpUg!dhS^)P+E zZ(e@q4m{Q57ieGgp4#hy!XluMFugeer{&s==nS?y>Yuhdf!ghj4YoOs+U);YYcup! zwNjhAXgx_oDnL#6rR8s|hyoX+o*b;>wZq&IhapYV{s?-@A4tU-IdFq2R&EV;KRf%&}W`=7)c`?!Nc7%;DlFd%pnyi3x zPr2J0>dc1Jl8u>(N;N*wJ;#{=EjDH;g;})OZ-{*TDoC{|GMy=*myAGP zU+C^xJKP=jL3i|!chN(JG(~9RM4t8~UFL7kVcmWJKMzKwws*bSs` zTnISJ90qG@IXLC|>Bz@hLTNoy^P(0p_6Em)>p=Ys!@(!dM&=m8!#f>ctpa}!w0W{mY&G{!^@K~TSmiY`VmMC!oSP@ z>!-IwZfP{`A2z)OBZtA64a#J{)}n(Ut1~odQ@H8*h~ymQkM)WQ*eY*c>g`gQ0N)2s zk7_bhfEHFEnwM7IRhoGE8inJnnDeS=t$Wc&CxxY)o}hg)_mte&ffK(=>4V!X>C=o^ zb{jdVs8TWwKBai3B1J>dtJ}l<#p_hzFV4te1op>Yuxtn3*E#cfHRlyDx9&^ z*likr1Nb?D`G9W_93S(Zqj82b2z*MM9N0@d;q0&RLReaOW(-@P@O_Cp4&y9%Sj8i* zq|*AT39xJgYasz@RMQ^JFK2PC$(NmER;66NxXuFFL==ouMJZ$D?oKJY8M$9v{b@9w z?cH%UtWhuE0%s4-je7>ZyHzgd7W*WWZ)YyojMD!0HLft%-8;U3C9l@b`nvc&+m3o~ zO-%w$T0!Li<<3x(P!f6ynpyEYw2HoyVZC^>A=Aom=2*HwX3o&&Wt}M8&=AKao?<5G zxEP9eJ`8Wq)^h}0cIws5PPZNBOH$MIf%q1U<8zvIWfqWQc58`1tbSN=^?@dn#MRmjC9bWV>%9=T2Q0gB!5=r*i(s3CZaH{hVFRO)BrwTp=9_@f=U_=DkS-u8n5ya z=jvkQLUt+WWUMss_E26k%FBH_P@WN1PYhVMXMqEFEXG z;R}_qVn;c@LpfA>XE{ir&5Wc?yvS{=SOX1P$O&ZTSdZ~^|Hf|4{@&R4Vo>gMk2QU;`h=Zpd_bg? zUcwv=Ne1|s?NM=zxKcd5<>WFmC@_!bGQ}!Siru$%cFkRxj;)%+q+DJWO4ON(1A&lC z2Tq+GwgvM1vQTdfIE2uLU7+$|v;)ob#Ft9Qd1p&8G`vK$7|vsr$p1_{q_U|DykDS# zy1;QHQ;$=gSH$?+SXa4w8KeGr!^st*;ucpQSMRDESH>Y}(~PyyFX>zXX_499ALQGl zP?ym)I`}PC;9PzLzBJgp=?}e9WEsJXvp4$os73CH__~LI%ffiMUfJJ|cd|x{5^`3n z-T8y0XG|7KNQ>dDgtx!&y&g47oI8DU(C3E%CqvDWk~x@Xtfx%Q`x=e%WYGEU@fw~o zf#x29U1_0LQtm;|n48WKi? z>TGW~&UI4arJ$dAkOOWLLR9ByucX~+4W~(_IE$R_Bx}gfqE2@NV zNRk!$hba~_eWrzm1VR~5Ran^vBx;fd zjrsY#K~sM|G-wfY-pu;>gAIL4L79@e(TM0WGTT$&;F-K^0r2@Zm!X0q&jOd> za*7v#7D@YPvP{Tf8=)6?mfkL>Jhxxr^ScO=|R5(*~rhlSzY4%W}A<+dBXAwl2yh`op0 zC^HW3SD|TB(-ov~ypSAT2=u#L&{9}I^@Ii@oJPNP#q$L`zfLDZIN@w|lCGq&q*;mb zM1D0`(>y@6Kn>pL^w(^KcF*QA?9 z%<_Ce+GxZ~kC(L5h`T(;Ngs{4!}Brev=LK1hd~7dx2?$a9I73S8Rj7B44VOr)y1MF zF4BHV_3&qvCROCDi}Dg@?AMixNc%hLB5=YyG?Z6Na@i`sD9zaA$?xC$5>~UD?L&81u&D|B=*+OFdNwQ9kbK!zxH~}swVJ^(8!$&xt5i+ zq3$G#OFaNJBowE6df;~<(JOF&%pI+*cC3N54)}LL(Q2Q%nuF?qb$#th;02u-pa_|M z$w$(9R-pXgP98KEl(q(6Y_3;ZSzKAW6QR&Fv=Y65G!3o6UON}{8dDcVKH##z$_%nW zNa-F*eU9EN`rTII^1|Dtz3i{rdP3vcB3rk`Z-Y9sscv|^s4ef*c?){Xfx6zH7@5eG zqaJ#Ii8!g)Z0}PPx;+PUUPcy-{ZmOFjK)L$!{uCtBNtCFmkG$F;r}KV?K`uWy2dhP zTkQwIr&v6_Nw%zLoymg!&M@q`Xdh$3cQF}m@Jn$e&`M=_y16I5p4hEGza-t%aS?GG zxOafB$dzu=Y?q-AA>UVPApx7C?yo}3UXVaEc4{T2obb+%#H4Z2)W+e0t?)WmAl-a7%G^V8RIqMj&MLe92<(5u zx@g_+6t^c7^|(aON(lWza}HzLJOyhonterB4kf#QX2HpVTAq#ZBiYy+%`Z>RV+!|V zYVHBBahy&uG`ngP6IR&W*Q0&$;M5F7D8_Zzr%Z&UO3=#dqEJdpyHb->Ii=nYD{JO* zAbI_fN~|DIlMGJ?mFh@UwAi(OL+rDN-KTtDXK94UY z4sY63)Z?q5Z&GukvtPvXM(x>ZsLx{S*W>w_U&5axIiAuhp6BA(`AhsYYw-NIM$dgk zal55uC-J<*Y4lF}CC#0G_1^c((;Z)VXLdeKVOd$;>0}{Rh5Zk*3adT^{=m>rzV^}z zjI^MkPCIvcbAEZ+waZK6XE5xekGwZIp$Sr*i*(_i)O&k%=Ivk)p79R)<>`UHd;9(J zH2!1Q#U>ud$>=BB+lWd!!RPiScE*^(7A^8>qXc0#g)Ls}rIll_RF}&i4$C%SZA8Z& zqPQm*)Maf(?_ZZSD3SEOI&&c#rs&<)ojWo1pe4I@9Un*i7SzT1W25Oe%lgqr$K^n* zsHi}!n3&@uF2@=Yh&6QR@#_My7A*?ITDNPE8pj*Hs(Pw9=2q2zn5;umEdzBvk(kARb1LRr)&C~!xS*H& z_j%6HDUknlw}exoEa=cD-(B>yM$32oda51e3#;^(bBl>Nffz%FdbLrvvn40OvaqG= zjIYtECQ@xi9&Jl@KHoVnLqDW7MA%ci!oG-;ebJ8DYB{bInhtau#`*3871)@34SvgT zxw5SDJ+)kR$e~|g-BJtdsubc4g_SqU7a^B@5Kr~jLaGY0FZRTUM;MI3jvHTi<%o3r zdaYX9Z}wc&+J1xQoYwa1J!fh$L-4<+N1h`YAWxeN%j&gwYQP@V>>P`ySJNXeDCuzq zmln1&_!NlwLV7~WE>Lw`8b`P-)<*XJ)QZdR0onr4zecnxRCpD)jY4it;85VR% zH=x>a)YGcv{-Ni5yOMA2(nWhZmc`r$E!;p-A%JUc&)%)pgdH{GnoQOZmfToZCZ}HX)9BE%1Ujov1yq|Eh^NW&>J@$ zk`fJPE7#a)(TvI-lV$qsedoCmG0@PaV%?NkMAZz?2 z%oBy^hj`QNmtcnjc8bU+KaR9{$4`c&mNh=tZvl5%I$`F;soQ6;{H}e0XMtER%@zkn z{o=E8(9Yy}pQtMIRgDC7L9xR@k(eOv;*PVU8h6!Md*NdzMtmWwFfuOfv6T#`t)# zq)mC@o3phk(8d9+bRCD<-8jK30qtTXP9{hO1$AYwRThC`XF$1CX0o|5$7Lh`SSx#t z>V-bm8zUB#s;%3xKhg9Ll0Bl0_f_P$lALV)GW(46++GmS){xSM_nPt*T2APa%?sls zdcV#vCKnB4)}k9!Nhu^;NynBmx$+BVq>`a*MLdi4Re~qWXuq7|I+jv&qbf05(O^mg z?KP9oJDSkP1}R(RD4gnV&SBCSEhUu|ucgFUL(veVyh%$r>^CWgUXk)oTFR=df)LrB z0UZV@&+?K&rMU7-q8m6ByG$eDU(Zo24X@5o|BBH&Ir&5^-d4Cb2I$@nduyPjNwDMQ zpNBSNuTbM=qy6r3j2DG;K8$hClRfdpH4d0~&K~(< z`CeQ0;1??#QA>Gsh9gSi)tL_Ko2tX%;ts1TYR4!?CXdR#YektOb!n6%QHm;7>RcH4 zOX{AgE3I2qx4Q1>9a%e!)$doYcxz>w4d1~Av_{+*S!yG_t<5AmYt@YpL05}Gk(G>~&rga8TIw+~81AQas@oj+IwFo`F@p`-t_#p>XRNGXA*>Mg;mhnp!+CUyx-s8n{l@!g z02yU7MvYt11Bc|!icWj8+DyhY$&o+7*A}!oYr$I&Se-S)4r~ZcohL!xhk@?YPuj{cmMvFixVxOb zt|`KiqMoZffiKzs-Dg|TM}u<+aI#?@N;D?dvIz$E$Dl>oJ3okqMOoVE)#GG;*l#VL z?)eEJHPB8TQE$w*hEu$kQJbK>PdshUFOXpIGc>|!lxMQfE52~u>tu?p@&x+vK!jHY zt$LQ{TP;$4To3f%PRpRA!>)C?)`C=Ofjc}uPAj4C^o`KuH@BANH5nj>vfOzcr8^yt69-!f=#i+|3Mj>MS|B zm$Ww3{~$g4XH|@oGg{5%N&Z>YqpPyziZXLK>QQTcCb|4>xuRO~AKhoGexLe!MfuCc zd*vIo9^dg1NqT25X^vE?9A#{nW5Ls`<~{Z8mv-R$?eKrA)R$zy;=;h^9$GuQ;f2Pu z>E~Es<8b^IG=|GBB;%~)+522o@(b0LH;nSu{?fkD-cYHES>(y*ueX zjd7u%(JJR|o0_+csq!|nd8J&s=Z!FVa)kxwvC`h1-Y%5RkqdrJ@(ZSQ9a_7`dk}TB zJ$uB}Q2AobtgN{Wsyqoah@Y}2M5_KXq{*T*MNTX*`%hPl^M4K*rCBvLb+x)k9pry; zuZ*!P!#Pow%R=Rps!*u_q-oSip63#3H~(i@gPT?P9Ny|un^~QrR*pFnsZPR`aj;5~ zXQoMr+eKc`V3ubt7V?%Vv-*xYMb533{C(C<6*IvqK zXa+X(%<>l8*UU3#&4p%_6*bG6xikc(c89B`W+5f1e*aJY51I}Bz5W%FP&-;o{^9<} z=H+m=w?IbTKfFB4A1NoMNs28NvEl#o*%1G5gp4fDk`rxGg#`bOXOkIx|j!)gU*bi4698rN10$ug7gmK z;Iqq7-!XeHJ=^x|YbAfnW+6=3=|bQ9%((96=XdOtNoJ628e6Rbv^G#oFad$vp>?}* z&{&gEnz1*-i+Rymu(pS9X`>06T!dX-P1;;qG2YnHXB#lHcZpU)99CyCM)U5p0!Uws zUD;q-*(f1xeK2mVt9m>uvOUrtQGJv18tB-Y2)}u_C$^F6ez^K*u6q@ev%fO~`8VY`W?$;vD8qQ(W)B!F2!4k$@E@3h_#6epHoqwoTwDn0h8(c`0PWNCPGHJzz z82~52;Rmo68Ux9}B5xN+X^m;-0gCx98J0`1s%s`)dUDe_yce6lv@|pAPXCySHCQvl z+PVU50nUPFd-!I!mNkYc2g4p>{N;viDWx-95;X6f$J(Q>A2u>JmOv7H%q}xp&a~Ze zh`Vc!`szV9XwhwlPDeEbcu5YmD;jUfA^5(hx!%Jb6)VTL-$H$9_0Wqr9f?c9`OU_R z)x1oAiteeny)?0wL4TH_WE>3J)-Zm)BE4MYZC{;HSysB#dl9wZIKODGRY-a<*XlP^ z!p21vS!~2?u}wa1*d=>AN=1NbNcMN@`@=RWr1OYhhIjz5CVK}tuN!|ilU|+{%=vEQ zywZhKpm+NHdAU~DXZk1kYG+z`^xmlr&Vsa6{=2aw{c-O|{5DsPZ7HHPHE1!v*wi%8 zSqV6)y0^|Pvb8J)?^O5JhekK3YD@6}R_fdgU5yG+}{q+0J(a>OU&UB>Fpk#x7V>2D0Sf{UUGEHxG?rbtba%m?{ zy!(QyxpZyi`>|_R%I9q6wJXa#@~m~z+E-t$Ub{x~S##NEhd1Wm`BneBbUQFxgjSZh zM!S5ntt!;zs~qb(x%Sekj8f;Sf!>Xf+K6S~R-!ioDchV~v+-m*pum6NWxqMpT4*`z z3g0Y*+b@UQSL)Q_PKU4KvhV#`{A-%5@SS}C;?WFz{FJ|vRhiQ>ii!P-)3$2{v|;u` zU)qI{AWX4kM#nC|Zrxm3MD_Fj1d2kh^2EyQ`e8WvD%dZ#@XFXcnYWSf`zB6Na~9WBr&(d(rwXjVhtC}4IPfwi6Vo1mtQ!|2gBN8SCmWj1gM_-doc z%5i6SW0c406r^>u@$=ef>=a@Dvvoe=fg8N>&sdrM;Fba$-#O}Aec=BsebMJ%cfPTz2c3%( zUFA)pSR-UHty$W+HbqJs ztUeCEHFz$gw+fja@ao}Br9fh5L^*VtcK9nHo6@0HGQSkigYj2rGlh1No7Kn5XOZ^G z^bxK15pUR_F&+MLQ?O?_+J<14nTed}PBu}8<30+z^~lUg)?|4|=_BRIunjy(wU8W& zf1}JIK0lXv9 zsF)qBK^Lvui{2RcW&PR@KBEIZ7r)c$NnaeaQ-nifJ;wGWPSQbTw5KxSYyMg55ks`z z>@XbaJYzf|!CqS#2feiC6pEkMT~Sdla7m*s*>Gi`lnJQ)kKl}%*p@~73mQL75~vk(Xwa6O7^$^QENZsZs*vyGu10b3^hT8n|52|e;) zz(yL6Eis1KexDRTRka8kivvCDDidfITkPeCT5f{}; z$p5t7h>&dL^Sh%NmD%sCqBjyd&(Km2ZL~NGb<-SCcd+xc{OK%3?$n&yyTfV28#YZ# zj8tG%Bvmp)Z#T3P$?f?5Ldd>R@O}ZM+<*(3I)EikRJG6sx@%kn`^kl|=uO~7JP!vo z`<`T5u?^#6vBzASd77s|@t4-dVrUGdvyZ@;h7m4MPxw}P_mJy|^an<>SgebGV@c2H z)~wV2jD3W8D_dqOCq2&7(l+~Zab~mvU&cKcO}@qREw~=UH8n?V*cX^FN!G^MA93d6 zT7WX8=rY)=zrQ^X7mX`-A?+#L2jkv|doC`HJnqE3FK7+W+>~rym6*TI(xLVI2hq-* zM@8)>w4Kh_F4V5C-G;H8Ic4HmRPLq~Z~EMyYb&~ynq5X`GHHdI=HfuUTf5f^RyDZEeR@jwdub5v6)ud)}(Vt;mvUMJ=ho~$KapL-=Qt5nw zkbfJgGqSNdBY(^;*n`lMgdLmaO2B#sR*ahi93jtBAGuNb>;gkrx0985aE9#Y@&aBJfq_?9A`<==79*)BzJ-92KHf2VRS{*|^u$MN9_#W{L z84$eR*;nRsIhXE%Qq(0uDmiR`qQ!aHkKMM@>2@qwmY-dQy(oJ0ON*$6rAD;+lJ+L1 z2V3*W=QR7E^@dB3rV6Adjo`VOe(+r6JJ}7{^Vab=wdkUiVm4q#u8!Ao8UN2~MJXp3 z_!Oj_7?c?zt$m?E_mmuUFLuxW0J$F2CMK;m(_5;18QaPT&<<6 zrjyIFvB6YZ0wl+V{ym3ueYNv=Lo4Ee*_W}38^2O z;2K9r{rD|hqv^Ex$8S6`_~O(bzx1SmFHZgObB`T-aq5qM_6!4GociNYPYU?r)E__e zKocIl*&pBc^wV%P^JJ|yHmx>S!JX^II==o-Xxlil_`ai#R*9q~`iE6s;PA%t2|%>n$BmwzS`F8Ex@q;R@I-61EAvEXwJY_6X|;2CLV~p@c55@q?unib za6QW?eX=JB`QL$jd*W%XryG7B^w9a%R8PPzJ?gMyu?JeuTl-_BJjByZ@!Wm9{pkzd zJ;2l9ZH3QdQpb4Oy(hJF5lHtH!e+Wh;&+7y@2>g? z`qJ&N3m=isaE=gXx|({Jlf&XIN@~l~VoTb%GgC`ra6%KL(?YU`uYU}m$(~qfmcUz8 zLNLrNn{NC^Ux6YK~ad#mEu1!i7m0 z;KUoL=>lm^6YS^UZN6Tqts=}g^Hkp=9ub`H8l=E{hu`s9{tqJmr(t=T?73fuyru$~ ze#m!fAYX$Cqbd5=>)&|k8(MKVl=yyLpM%^2vuP+=hFZT~0H4dVYM>14qQ0TCkU%*! z+rob;%A3mAm}8RV_P?%f9O+?fWNRw;%vcgG^v3qjysVsgnUfV7zcpkti4}@u+>Ov^ zQV6?5h0#nnd-x*?VZxx0F*BX&f-?8Fb|pPBHI8PFLdkta$o8Ey&!I&}gZH0;_X~mh zj^x07XKcH|m{ajyCvTBM*Jj}SS*{*Yd0e)-&Hgdqn@z@fdFbZEb>kqVYJ}TB?hRvc zX4YNCNwt5l|0AEFF?5~SlmpF)Mz{^+-e8b35jyMZO=nKrICp1NM@mOVvGc=8&=1!W zTx*Pd)V#uNk)6zv>tHr{a%{M~K(VN2a5iP>Feqcuwz?JO1nh(r~Itvsp?|LV=v}Lw|6O6rAeUWbk>K z!q9e?Jj%vPntX>!&M1ex;+zXPzN>!k{l1)KI$X)JRSqRPHI+D9kU`7OY_=rhRU|`$ zhsni!uupQgar z58QO6-ptvnT^SUu9M4Lf^cvqA4p00o)qZ6L{%f|8eTDyK?Y|xVvEVKINB@lF@lVA+ z`bU`}k1Jde>JoK{nQ=z<&VMWNRF`P=MU{W~180>Qi7>i~aDf(xl!18kNa6I?9=K`0 zooOh%GYz>ZknR+Y+0o`~Xcc#12@3;BT^Rb9uU+zZ(&nb(4?N9LvtPa*3{~&&3#~^=v< z$m_Bj`CWD+-`}Qx#`WmgXOiZeeI^T6)Eq6(A;G-0`XCL}O{*8`Ie^Ogjo&|OerLNn z+eGoEAw6B>M)=t%lpTe#qg->&UZc)AOa4^uEhys_lzR*6e@n33-}+J9fAl9!;OviV z0&m{vjRuCpnBu|YUN8zI?3GC>?GS$ZN-Uge8Hr|UImjfuCIT-vwmUtEO{6^60yZ-n~f@=s?0rs z-Q=YDA$=H2*~G%wfK8M?lhZP|oW^h3vRF%R_>b%VFWZmw|FV53|6hh{!x>fdKmDgV z@P7yXt@txT^g}s1a%z{=?O9_6&Q*YO~tdz3kowTZ2tYPkB%p`u|ty zjjA#7naDu;Zmiqo^#7UiDScH#l~(>Vb(&Uom>Tvk%O9_;VS)04 z>Hn+vQ4yh`>(_S{)p^$@e~U9Wvx!M)_Y67{wBbXF^g|o-=;V)8p?7i;a!3#>8}sF^&&6 z8lwuW*4rdrm{FJ!X<^w>;1G|p^au?N36o+AA-KdA7xo@fSZH1vX_gFu=7tf^to8>^ z(9XZ!wxnd{5Zow4iY+YU0y72==^^=xzaeumT@ZBofbKob^ z5?|=(+p{Xt!1_O57?O5d?;%=n|NPzq3WqS!#<(py%X-gHRtc7wkg%}DX`Ugmi$e<4 zd6Yq9ZwELi>CYH~pWfsW$BZn@sD^>dywM=|dGNCan$01DPh=APPe(vUKu6&J2?R(F!em^#pKbpdH#2kN7k}o!P5;#q&=JrP z&=JrP&=L55907s$k#-L{tfnA;f4r9q`_*4GDI6<46%l;hHi%LhB!kHLr+7zp_kz*LvO=7!Y%5>LGi9QB;FJ6 ziw}fH92Q5!hvFmgvG_zB701MJ@h9VCnOGyr#WSKpJS!^2TCq;77aPQLVx#z@*d#WK zDzQa8FJ2H^#Wt~ByeO*04zW|bBzB3H#VcaB*dtyQuZh=1jd(-s75hZ3s1y6eo8o|Y zOS~=a5(Q$0xLeE=h2kD@ub3rfi#g&xald##{9ZgL=8AdZAu(Sp5DUe_;t{b(EEbQ7 z$He2}3GoNPDW zUECmU6gP=9akEGlBZVw7M5Y)evczbSEyjqkB1eo9w}|oLRxv?L6b>;-FNZ;UYpr3af|`(IQ5~imsxY z=q}{37^Ds`DC8QZ{t(=R6dR0&hz;ld^*3A|Bm0q3-}CvH=oH1`91tzK8w%hbNGGy ze*OUeJ%5nT<@5MMd_G^m7xIVsBYY8G%pc{C@yGcS{15y|zJx10ktgv!Jel|9SMz?n zKfi_#;Mekj{5n2}59TR6l@H-V`7nMxAI?W`JHLV7$Zz6l{AQlcM{=2G@Jv36XYtWI zn~&jRc@7`PZ{g$lt$YHX$Q`_eon`0Pd3J&Q#4fT{c8RsIpIJNWV1A}D#yJ<72xJd}s=F5JSyc?6H-RvyKpc?^%`U3oX&oyYMWyeE(6z4%qUH&5U;Ue6A)ciAEK z9($jCz&z|QJHkF>AF+?wC+sLY#*VW;u|Km2{gek0uEoH^b$(FI@Yz1?%m8^t4#Y)*KwwgW7%2+BJ!iKV8?0Pnw zjbL_m1G|yk#M0Q!ES-&HGRt6@Y!u64qggf^!^W~4HjdrG#c|W-%<5 zb!FXHcNWKbu%0ZQ^uG zJ%1em9RVEy9RVEy9RVEy9RVEy9RVEy9RVEy9RVEy9RVEy9RVEy9RVEy9RVEy9RVEy r9RVEy9RVEy9RVEy9RVEy9RVEy9RVEy9RVEy9fAKw1kQEaHS_-fXSY$e literal 0 HcmV?d00001 diff --git a/firmware/tsp_stm/fts5cu56a_a52.bin b/firmware/tsp_stm/fts5cu56a_a52.bin index 74f9ffa8e4d999e7d2c7d522036cdec128ab2bfc..dbde85dbf4986520055e0f89907269a9096ef144 100755 GIT binary patch delta 43795 zcmZs@3w#q*_BeiL@|v`1JAFS$%OriJg+j`+AZVJlLsAL_1m&Siil{+l4T@M4NeWeq zqNWUD3#bKO1s|Ifa4Arz%DS-Pep9q7w00SHRm7@0RiHOXll;$3(e?ZL{`>jd&fGiq zdG0yqp4ZLc#vduy0RvMv9$WMioO;O|%DrFI36$pL)KNQ*< zM@mNjdU~HZ_GMDhzpg%vQ0|Za$ZoDNI#+C<&|Q$o-*M>cet3Tvk`vOikY0lH8l*o# zIu7ZtkUoQS7V2Jt=OCnEND)Y?M=6v5X$+)XNaG;=zkidV?56*gzx2%8RBG(4v~7+N zMIx|(mm1!t(u7iKvU22g3e~(J+()&ieHh4;wg-`%MY6+@;h~7^M5gq7P%zN-TK(}H zNuHoN^`BoD*MELdyJ{txs+AC(B&8k~PS6=z=KoZX->48gCP;J!^V2bOBwhO0FR(I> z?mH$-l1-v9Bitk7>E?j&o~%GI!T>;pi?XTCW0p)QHbCjRzGF>@OP89Dl^v1uM=Xcu zaW;-mlg>qu{(hd)v3$C84(gFQZwCzZ$Uys&q=SJUE|+zcT#@E9@l@e~c@2E+Rc5^^ zzzpw020l}o89)V>aO3_&vCUFrj12cg`Y;U5Ex{aD>Sv8v!gKOMr`y6FsWGNWwUOto z8m^|4S@(hk+1+>xiq1-sQQIxYFT*IcTlpr-(={)9kX=4xQk>C|I^DlCC@BsFl$e7N zCI1sJQkqm0dE81vU#PHYU9F^37mJTZXW)!n!k_Qs^oi|#Sj%Qg)BTmPdOP2TImndy zg_{+#Qdd_eaOl)xC@L-2W0p1L;PW=&1x2cJxpf7=D}Xuu?bc=Rb`58Hy1tWMU;$?H zqT~K8Jl9G^*HB|wWF@N@L`ae$#*rXh3+s5YqB)jQvYK)wPoP;Dpy7XcKnDMB4qU<+ z4L4a}))+a+I`)T+s#=Ls$a{@^#5ue?a*IXbm{ubxVtP6IY^xh@iep@}EGow=C@0VH zwH}pfs75umw*@0~^mrL;qANUmT^Wz0S(uB06(&R#SR%v!36uP*$fZ*BPO#KoJzj_G znNo~@JoJ?%I#e0G8PP@AqV=9eGrN_F-W1F1bu~sLrC~}`ab@fN+hrnj`Ei)6_<%BLy!81j{ zA_b&wcvr&ns**(~g{i6{XS(!K80p4xs-Xu1#k|hm^_{~sHuq6Wy3}#fab&$^!~EK- zXg#u*KVh_&uh#+cI>XudNN3d5e zs8A!KQ_3M2{}CfSiPBoMrV08rbOjt-`Ole<_PzNHz zZ$+qFq}TC@9C|TD>KhRrV6G}@80BjZDC;f*)tH~2sD1pCpi9+s20p377?2!z~8AQ5fE>Vg^{1!?_IX-Z( zUF?xe=_Y)whO0l?+17*%ZB0twSHjEcWbGY6(WMkKq@_WwAwyaoq&Ut&P&-5FJ|&z} z7t=980jrJ0CD5yZ&ycDy;$#3>k>7WcE_ov_{jW~4v5*(b(bs|kA8VYFC{YoL`_7@_u3cu2 zP<)O4aSKc&{41|ZlYD?Ga_DyfcFZ%ZNtYI4;b820vknD+WqE1RA*hbHG-*fJSYPHv z`H50mswvcc^YD^2<#n!OS-@K6oOf!GLw5ac)qbF)0mqEUDa1H4`s`7gXuy973&l0F&~Zc8xI zuLgxCcsvypjwMW@9|#IRC6v(zM+5`gKItdF3fRt%{y4tDD(7pZH1!L0A6#J-wURz2 zP5N^f6;PbVRA$!sqz&HN-D7`iS)IvU_iMJA?VEL5YQT4Pwa zC($fVla`$n-buWf{x%@|kob8~qErne9I4&v*}^L<$c?yoo^~sE%Dqwi5>}J}D@3kH z#3o!x%BL3x1UC8a@rhD5;I|xDaGEqHDEyFo+k|PyORkKp94$%>5|AYYW$-^CD5`Gt zMTYZm?bW7LPgpktTz2{eN6I3a@(ZU^W^!>bai^A@_j>g3iYR$TX9t+gi^%zh(5i}bzMP*5!*ZmnvGb|Yw_&7LzD*A7H0fLaDE9uv z&(+(!iPB#{BuFzlQ-NtH=C#+QN|Pghxx!L!*clJO1%d?xR)j5|Xo4*On7L+CoHrgJ z0>>09V*|FjkgREWXW0?*yzc+g&*>;#dJBeyZ;S8ebvzkb@av+WeaKI0h5bs)8+ytv zx5TVRNp?gi2ZgE|P{{KWu|@7nlyd!}G_3L%yBO|Ym(`qj znHKI%kBdo__Jmp3oZVqzbNYDt4}RgD^gOx|3+L0v0|#Ce5$KHh^y+}HD5H^13kVl7 z>`?qcSg6d*gO_*1!ULI=@Ukr|9L_Xp?+D3ZGAlw`dEl+O^!9XVO(ahj56`iHiis2=kr@cFQFzRri$e2+>l_@mNEJf z1k2Qo2o7zQ=1foy=tmIoqoA-$TOd!8J`W4s+F9I%pbHl8MQ}?E>75+)mk}%35@bFT zpCr8*7PQ<&gr2A)huTZwLb)jyh6S_+y!q92wMGDP$9kiikj)tnBVwfsy@jYJIbeJ1UP9iRa)MLgA#DxDb-mgbq`Umr2$eAqEs)HWit=b7l+{lfQo zdGviF0-K*j|6xQJpMPJBVMNC-fT`(6gtq)iFvWG7K5l@ zA1`megI|CPTub;29SdkQ2w1Ly=jDi?DY_c}5C1vq{xzmj+XJbR&o9Imf2sd!#88(a zi6iLLU#_G87ku85Dm_19uiI{6bS7h})HEV!#!X|jcUtDegX+Avsw;=G# zbz8-9MJm*NEKqr)?!$t5V!nD+UYNCziy{36xkA^`s}0@ZiMMn&|<~8fVu) z-WV|OpwC7~_#uBB|H&I(I z3nah*q2ZAKyABooyG*WoEaG8`%~CQwcf zy#4^#OLpc7NQ7{&&SN=!!PS~8YpB94&p|EpZ%|d34X6;+H{!`iv~afX9&f}Ys9iW- z8duP7sr{a3#Jl3fnS3eVZcmgh`YB#-R|ZuQJ!nE^IGuU}!cV1HcYk78UUA?);Cg|- zS^j24_3C=2!lXLfd)9i!Vza63%{Vh@o2oitCoW}oXsavMtRV~{O?vy-ej@kHIbpek zuWmtw3i}1nwGqEeym-Ge=$nmH6}( zl>$a$>sGC^?_1R-{CiTq^RpnDsPMtO=1@998|-m-f4byKxOQ7@88GGNv(KtF``p;6 z=~g}Fd&YvAx)mFGFX6oXyJ5~sgQKU(^3=Sh`KbO9_BD^^mwGQ=QBjnX9Ym+z_alT1 ziUCuO(e+0WaYom*%d~E@MI*&TXx$U=R1$sqy9Q22004?6=&z!;Qr92NZ4BHu7s@%r z&F3d$wtHwzDQMI03{sT3gXq-<%xEBvH)&bJfBG-sre&`&Emzovr+v%GdiJ^R>du|!mvh4GK5R-E4HH@NHmI{ zUZGf|r*vFB`9@3M2WVXltUwJbnF~)v1k~;(q!`m%ZJk?zg&- zSdR`NX@@X0C7XUQB(PIcoK2BJ$5h7|j26uOHs5CbwiwJH2qYA?Cj&5pF=#;KJRMP3 z+}Ol+-%m+hfynUAFwwF?-?CjUV0d@j%A%ub6gL7SNAx(9NpV-<9Yd1RN163uAVZ>K zzYn@K(X;;rPeP(!&xU_Q!g~rTY=Kk>%5@E-0Z5ym;y6&aiy_fj6sLp~hR!k68-etV zTnJCy6t9uahsW2Tf&!aTx*8Iirrohb7~$+KUc!wC`&j6Y6N$Q_Qgy2sACmkLrPL5& zI+6561WB7m2>*mVmsXtk8fHVd2ANt6j7H1=gz=bQ2Iazx=|zhckBkhj4?kw1?79ld zHZuG`6coRX6w}FeJwyNqqj``^N%bO_93_?iIrBeV`|0~D?tm)Sgo;)gSFU!jLJTx6DmP-spCh-YudbA2f zmb>PtaJpbS>klqoV zo6#zdm%cb96whqeo{q2pveN;11qVk?lqt>uHKj0Fsv8l0n)!Fy9~4gB^f^dKS7GX8 zMhu@UJ$4dA^t^a!OaOVQyfwU>OO_6Xh4*Lera#Ss)Cct!Aw;NB+46BfT&=$&0fcXb`o-dsRsB}->QNLn0J@JbkMAcRV0 z`4GHyg@ik9S)iK@(<4*UhV}r88@(_&0ALy5K(e&2D>D3{@aZk3>?b2YJ>`fa3rUtv zpAh0rdGx>uVT$QAy}~a9Ok9@BUtyh7ZQYpYP;7v_1__vIW0_nyi_Co@~Ld+kz+xNl;E;L)J;Qjlk#EwO_tTm}$1r&ww^& zexR6)Kzei>A?v*q{JaL`E4jNJ$rDw!Ompq>0?4uWm!^+M1|#iiX;Qu))~O3fsk;%GS8U;#;ak6iEMrOAFL_Tl9L1p z*dr;@!{JyCNw45qNz{QfVMBQzU{D00$KF7#r7~)gA-OAHQ~0e;{s-7ak#<{finJ(9 zzMl+K){tqx0Tcf$@P>`dY;+HjrCH8n1irH^?`QFMFB_JGYq`bR*)YowP0hxYRE z6rCCn-kFm}(*fc99G?E*xR7PxGYNr_E_{$kcPAlFER8l{qvZqGou9+P%~pLHD=m*4 z>~_yWw@2(0-1@f6ns<=S>+m_E?H!I)vJx|v z%z%0rhhq+)U#*h&3zO%U()N&W&-{nz2_d0xzJod>%&nc{oSU<+h82-MR+JB#Ra5*) z3;yh~WN{JEQ)EbtU@-7oqNs#EehC3MB_) z?-W0~z@#mzY%%-$n}a_~s6zrHkwN#2B?T0?rz}X<(C|S6wWS=4qtcNr)j%VfyM-|e z#-@DtRic+F()ui7&l;+z>f%ZXQ9{iEx3k%^hfn9@c^Nl=H@T7|JW^wUW-;&LDQ%Sf z66Tth@Xh$)I9iRQ1i5BMGyX%I(%tD#0m&=v%T}!9EIcaS*mHCUJW)N(cvE)6mNzkK zb74i>Eb9kbtQu9`QlOlpsiJ-%#kdw7z#z?8#aSYpnm5A{+0pzw}g|jV9+|F;?*xCtm&9>yY&G9|N zLLr1DtI%V~ zz7|uj*ugjktOtiuV$^moexl@1P0%&i!UZpVuE_)a(`jj1;HX zt!dD-9)Nk8zNeW{;O_|mHlR-}xjdzhJCIWLDMl_yC%nnn|;Q3}e4b|}` zRr2R_3o97|TX?}j)yKknaX>jy)^psC+K&5kP|R+owb`8fS%pZxX`$XWs7KnQ-KduX z_0Wxa#*0r_$p$=Ka?l*t=f&Gf7FALGTg|iIU}$C(Kxlc%b&rj zTN=#N04Z}=5^^cM@<2=(5_7~+(0ly%SyIZ(P37AbWtm+Kt~7Bqpqd9ioqfQ3sm~J~ zq92|cN$)y$a46dQ`O9|#Zlug;a;>Pjgl+p$W*zoBY4$5uUzBW~2k<8Kj^hve<(&N5 zVMk>6h0p@_g` zHfL@ibiSoQz3qbr88G7i3AAlY^~4I(my9(Q&NUupD_$E?$PCukhGcYxkE_Ypm}lRK z_utWOmYp|gGu9bTIOd#LW0DwjrcQWj$u#G=I?XzYH=ei;%;0Jwi>(xRW%V;4k0sho z-^a)%0DpV+Tr+OlbnExAvbgApM(8&Q=$X(m@#>w2MCcs!>8+ufB46&tabC?(jK-O* zks_K%M>9|J*Fo!gMcb{73^zs?FO@%muj4P_(0ka-aAmwVk98-y4fgkhmA8*`-hqqkH1Ea7HCv#m7k6nA+^@_l=U=fD z*CT0r;N|L~dJwIpnBZPMt1zrR-#D)o-+_vNLF^C`mad44$KW9aV(8YG zDjI}GmKM^UMYgqDtxCrg81%3Ef*Wpd4=c@5?%{bO1+ElpUwH3v6t0*|W}wVnQM`PVoKj4+}$T&%KxB?a9E@Bg3DD{(bp>e^-W7 zEy(agPdf<1S9)Ype}v`%F&9L1E{w)>*O^ilw8qoni>h7ViWQAQc9cPiav2kdBaXR^SbXqf4Q~mrJhvvT`dglMY5u z9vtCr7-mT>IIJlBi+=R@MT~5mD0HuIkv(G4g)Pa_{BX!(0{e8bWDN_8 z?-*|aln+Z5y)F%kV!}UJSX~*sDZ+zLM%35&kP8D(9IoBz(eSB!9ys}urSx!~PTig? zC4-aY4n0u8KSPJUy`zt!nGxZ`KkSXI>78YbsgLQbuK!tBv$8O@3sd@X@Gv9ksIX^c z_Dv;XZgeEFLpjw0S7>VNT+gJ)@LiG9P@;vg=NrklwxKdvS~U_?;=mO-brfnW5{6gi zS`z_A$dKnFdtRk7L99rv6fu5$1)-0x&}`|0Bvw$sDW>7u4 z;YKLW*MEh+S0DBECQGWI(v)DjxgygS1FU>(z!g}nwb!@7fvXZD5~sa&iyh(_pg0a`esR1wenmv%w$`u|(#l^QazTlMLxTvP819phZ5! zC=fWxQ*V^PF*^}XI@p-EN22OYd9w88i5NbYXLUosOjiV@b^pHnlVu!l=JmSqMkFl? zde(h?8Ab&yT-aIXaGKZabq(u@Qt(MN${)uk*~f$Q&EHk(PvKB8)eqAUZ#VzhEbA+- zT%k?v7}K#@%Z~p~KN=V7dolRS&&eG~Uy74VUuSXff033g9`2W-c8x#JMTKrSax}b> z7cl?POo;EG@@McwSxGeRtx^o!REdOFSEWv6i+=1+aH z&{J>{i01|Hf3$A{zY3^9O4uX(xavQ%DH3upF1hEYNclTG1>09>j z!t&Kws+YqzgDfctkFOqE?(lJsBllE`UZ2(~vyZbJE=!PJ@NhfkOL)1>;0GTb`L=oH!hYT6(?L;J=U3K1+=zT&X65scr}DGXc96k9 z8X4Xn{>Ym9xL%J-PeDjjS|k@3+!H?WG2}jFVfCp1fKJO^008Y5A0q%j?jrzzSohu; zpYUuh0YLih1nFB0p=vvTD@8%jt;+B@J1lPlp|LdBzK6zB$iVP2FcQawQGSdV88(I? z=E0!o*>C0a<7c!31p4r=%@ItPDoOC|iGJG$-_DV5H=uJ{6gu}EH;TIYPp`y}*$4mG zF}jWM?HV`R9^+1G|MW`Im{_Nq1uuIJBAv<(x^ZRla}Y!aJVf?XbYq^wIy8O;!!wd2 zLbisBZcQ6(4JGD_Y7t7-oxZ#kw&3Sqw*VkX_inI^2jM%lZ;eAJy?3nhU3_=l8+DE- z%e~vWqNdT)4B$l^JBx7u%ijmdYkLSZ8^<1C_u@J?-?k3y@_6w)a+coIBZCmA*Zm+? zyTQ=Efw0Y*xeKc!!*_&<{Bn!8DhfZcMaj}wOo@$H<@%?W*tqA&x>fW{-&~Mc%Dl4x z2}vb%Dp}ItII#@;Iec}rL>e2I0$&}alP%KaMyzy^A)oT!A|%^$V-52t{m$72P^otb z<@OTFCOl}*bh6@1e+p}@(hT%oLHCl0=y?;5bV-sWqO3@$_zRS-&iUbd)I|6+17?by zW!+a$V)qp~5zMVtW&=qM2(Bg8|0#g*d2uWvQVSq8B1qo=iCB^dvJ-CsL3m;pBLwnA z0sJFO|6uN@U7kocM9SF=1AXA2>rruh&zAa4!cA+koevWmNwiGk`>=l9+(p{+9UnTz z*aiIjq>jPlvD8HpT1J9A)<9TUU44_8hGSYIwTwWB3RqQuDb3l&ueR>siAuL1$$O1) zR`#s4+U6m>+Wz3C6*XS}=2gvj%ZJp&Sl^GEs1nAPSFiPY{Vpio=lqZ^+>^tJ2;$Ko zQc9%r4i3>wB8cinfZz;&$^uk``mAQJSvi18P~Tef5s)AkX?FlWuB`f@9}QL`^@1ID8h3D?S#R)9ev=e`=Kd&6$J2$7Vx}pNi2a2n_ zHAnt)&f-;foToa1Bg5t#*F?p@Ux!?>TPuX1bX_UF1@E#TeSH_?UKumhpJa4Rd${7C z>9WDw?&?p>$4SOTIbWZDW6-3q=JcN@M6c&uy3^G(fMhgCH+bGL$0)q|fbJ%64?h$S zo(Lv-f*zW8xW)h~Y=#JGeX_^@&Rr*g)G43G|IA%))lc-k2mFXCrg}X7W6AFbp$F2( zyfya{-uq#u>m6VbZu~&*wyf8yNt;C1Yr@2}>C`L2oV7F5=Ywu5<0`Fp3)|M_$Be9m z6HpD#P_MB2kB*hgAil;3Tw#^WrK;^kEk_T@LG(+MZVP_ULCWp2CUeC_Q;zAEIW*Ey zEpd`*gvyf#6hqb=%0xBGbyRzzbW5<*-rdoR?a2*h!^Jf@@&F}Kt&BNQ=zLHYpD3n? zXH@avU{L`Ogs&eoQZs~9M?O_5+~g>tGKISx)8YTijw16|@%)YBjSw-}*Dryn$?@if z=MG3aA?<=hB)k@Q?uKN6cj68tN22htqs+{xEbeDE(kih2)2P@ z9b495mrgLeO7e6{V5X3cDEVGX@4RH5w%Z?n&Qp6mvL1O=`t#r!j|~45l0kUVDZdLLW!H=c|CJr}^49wsn5D(cS56uXlC+1%zjN=V|!AAo{SI8+tB zHcK^6*-6BJEm+F8&M)TKn?10y#>fnNBi|x)K9ueB+R5r#su`Hv9U-DNsRo_0`*yP zjuVq8fh5hJRjGYNn`d~5nd~gUx73cLT0hON2HCU8>s&pTb^%XfjZpkBNK}mt;BiMw zy@t(Hp@}p?-7+~ef;tFEnST3YW!_~lO&9nu2^}*XLPkSkdiKg?7;$q88fVt5Q zRtPwMTLToQ^1S}Fj0;|#Z-t&sRKCVG$EvZ(9bmWDbvv)f;TTpXS}bSbKEYX>$I2Z% z1Xz>*|0lVo!76(q2EO+)2bM&3hPk@QHr-l2mvLlA?T_~*C%QcNo!l(f?75k)+140W zvDJgG(~Jua_al+vZ-aMY`QXa0!H~34!xvjoffHoNws_lC@Ig%F4+1}{y}EQA2eEr6 zAgG!=zl7L7q+1Ga=OJPxqZ?wh^@t-zhgxwd&_6i~h?GEh27-4vq^O7tPr@r4kcb!U zC*UiD#}LhMJfyFn%~c{YV|ZD=heEU9Ntj9-q$Wr%NEy)ZB0R}q(+E!@ix)sLK+1sut+Po=j@wWcB=x(#U8msB&u^bUQPUXf}(W#rDi``&li?y%N#@b9d*U!sZ z6gIiXNIYP#BIJQd5$KSK!wFfQXGQsJA&DB&mN(<9!j zi>lP0?syAif?50`?W(G4{VTL{tA6T#5$7bX*4I^l&uU2B(L`hho*~oRnn-3ytgOR? z^nfE?6Q0{JhWd|iU_)K8ytC>lxYat*}kC6RnI`xS#_0g&o$7*sNsvh|e zE6Z@nhFG-BMZ3%{w(Ia*!{iLtGFKne_s(7F$jGLkoVe*m=Da&^8}H&#fnjPKga)HL z6@PSyNkBb6G*P+t@zeneA1BTBzb5oPI#s``_C@fPmw|fDOhH~|N*u%|EBVoSCa9O_ z7sl65ptcAr>YbBU)u{NodE|)Y>gV$rQ=tJ2vBK}V(Vz?(yoI|UP{-D^)r|V7f+a%S z#@C!gP*Z`K_#MyzifYtD2K5d;uf7uqp^;bca3hKz@72_&9ICF@6_52z6t~ysfodXi z9UV$YF!X4>=js#2qaHmEr&5w?aEm;q-dfMVsRUj|$Dhp5q#>RZ&zj>?4N1t3HbRnaG@A)YxQ6;M;~WlqkQnp7MgvtEs57yeYG@p-J7@ z-L%wO27EpvQszC3_fj)>XJq(bm>A2aiH9**Toj7l(GQVfN7!#sz6rjLH!U>U zIh$=e;YOybE}O0KQIUM7B`Jsu>wF8N?bb&WJei7oh@<6(I3I0@^)Uvu@6JPsypwdi zIs%^)siJAVrQ&nmg%F>vk(kK%=tksZTPqsCZN!u$-dIn0k5Xg|H}@=rmX|`d<1<8g ziOffrP(G%ltmk#Sci~jf`ZhLD2361K#HU2$2C9d<&uD|M>qaN|Vo)zqCER?U+>iq^ z()wT}tK`rLUDDq}b5N1Gyejd=YMu$&U|M9V31q4iZRm@3M~3OWY~inei_kv_P6$&s zJxzZc5>9SP(;o{dAh5Ug`|sDy%+nU?2O+U3Q&}bwZC@}pN%lm+eB)w@W{4O z>WuK#wtVOQV^(b=UXwTjZaX2VIr4qfcu1Jj6EzBcEch*&Aw~f1^~i{Jk5nwMe=~$< z659v@QHWRsHbxYpVn{j_?LxPc?Yj>keG zc=978687VQXPKD6$4YNR$oNEd^x^|7IC(BYo{d<$pmZOuLa*b+Z zEe7~3xl`=LS7Vrf@@Lk3n{a&l#A!G8{0|(-%Ho+lKsqFf*2o0tp;+@ISaWR8ZWxQW zHdxr&q+mv;j+la_4+8@CoMBu-KLHP@l2HKBK3bINAX-4zh#ybn_!#NW{ta62a>RPf zFAI-9SEY6bN~6th70y1Vb3Pu}1++>@d%@;TYPFfW`^dDBA>OwgHq4}o>3z25S&(o* zdGsx*0=T>=t%UDK8>|qH2}t6CYePu-0fIfj<}cB3 zaR?+%4!PGvIbL}fo(ZtqNs%&$wMl_Jc{wE1KR?A8+esuXIJKnnM>z;pe=?lmB~NEK zT_gy@WXDR55XIjY?Pv3dg5QZZQ42bkSw6>&z#rT=O-`!~(4h-hWidE}jX--Id>S_{ zz+E@`)+6cEQNke_cn#0mEv3j!qIK+i>{Q7dij}Mo$|xVIp^VVYOvsnRg&18n2f4|R zn+X?Ez?(pEFqLtTpA-~qFPKu8FPo}l13PgOXjQbY5jUZ?z81t6CMaI`+IS>WNOs>c zC0Qhf6~e=OfTsi}i7Z?OX$quYan=U!&1UM$x?d8Iu}iSI-xL^dZe9=Qd6dgaKL>=x z%_rz%K_O{}J8P$3f#Tp^PAnMK>nq&BYZ6ySa!r2W#EweyA+V@xw$xsAJqDBmdX>e; zJpdOlb7{Tm05ik@)o=8x4v;*we5_Br zAGzFpaV zys|T^_`PUvDbSMiWrO`4?QJJcfU-%y_4XDP{YC>z5@%M7t>}I;?m#s!r@83>!l!?`?Z&`zpEJ|g(5q4nWiOU6&UBK1)pA#RaNjb zM7Y0iA={1agVGKvF=_Sn`KX@5j` ze^-G#Mmh}0mqTV}%azX%KV76-h%92UN8$(S7@y%65{oeIvGO4(L; zHsVbSd~hpR&dc<%QXc$rKxDXhgaq7(w!;v`Wy<2}ARZ946PZIOZOx{YSXj`yNEHL_ zX=hi9aG-S!h^5P4YKKR6Gfbkonr4pbXP|GsP~yrn}1@k8BXr(g+%q?e|d}3rDOeofuD(;@bI}{WcVvM zomf+N_&SMcu2u2Rd0fOkwhowGcndgp2Q9JEtzlO8Jv?i}FX6?o@V2eQxEbdh%81<# z63qqRo*tZ2m^2uZknp*D@H9mYmQ$+124(3BF)HQfXI1i^buYLvr)q#O6!?zNpb4o4 zU8oJOUeJbDEm#Ah<}$PkFLl#yWLV`(0Lxe>sCjq7e_g_IpT|zOCP-T&l$&lb<$TcL zu_s8IB2ER#YDcq=M5tE9?oxkdH#KObG|i=$)>6%ra3&ZDtn|9dNtm8>S7l};1h}!9 zR%?@@c~R54%2kz#P?E(OaVCcbt%zzhLcPSw(VALT(Q0Z+th7}!P%8(1zys-OA!2K? zKatyFMpOD&-l~-s4fi7h31oZ|ukK#0(*&uJz2Inm6R$$6b531d_oujD<(~?ayIWZM z%078AKuus@H9G%sf#E*~O=7sV(NhOeu#uUcLX;=6qr5hdeVQnsMM21L18e4EpaDUTYicu{b-6@WD&uW)M1zh{_8$MLFP&QmQc zUL38%{8ne3b3|DY2h~WGtLHn1DE0aC`4X)tkSJwncx#X{r1@r91~BVp3sKY}JS;QH}vQZ}>xei1~$pwix|9~9I0qCG4QR7!#^jrKw z+`jaMSLfbYAJ@63KGwSf@00yJcWiwEytT=4`4~|)_>n>}Sfx;ct^SC=dckvGbt>Xl z-=l=8Mw9=8Gb(+vNaE`yD5DiTK{5^NyYdySW_7XX_2bxcB*LK38=Ug;@{o)72>w_ z9fkb8QH^T7$_2)^!xnG~`wvbW}DV|EfmPOf3k#!OX25DSkt@k zHs@qJ_|{0x1>QHU?NDPbehYe-Hqr*(;0)m9q~^fo{ZO`LWOf@gNscyt1>TBI(o(@O z_DD+&1p@41Wr88@JR0nd!blD|8<_rD2(aE_>cJyfiRS1}L(CzU?5i!rg6^1OA&`k0 z@1*i_A@%j?&b^Vf+O-`CC13ZKU%$%9bzEh<)Q=~DtLx9-5-icdg|DfgR+jP}T>f+k z*rgNTLI@2dDA$84=B$(u0v{#&m08w1>THdxBqrCZ{gsneXxVW;_3JFzH3)8Rir)6B zoBQNCIgAr89l$iKU*;UcT3Qdm(h7EB`lj9H2^Xze_*D|B5zEFjVtSklFWxYzXOgIo zDtknDJ__h-f`giPu*k_kyjTR+iLaZWIl+A`lo5fO1N3L$9W2vPC6NYGj_mPR5ynev zHmfdD`Xx{>4h9-S2BHd#{OoTF0Y(i`Sd;au2y?nEcm6F9gk{M6A!_S=9&*CjWZbzg>tJA@D37(=}-47@Qr^`~z@tAgnf>Lb%726NY;k~eiU zjXH$|?Z@aNSkN4Jie86>od@oatEKP5!qo$_bZ(e4X+XSnq!C#=>EwD5#r+fBj|vM9 zPKN5k5uxc|CH+MB(BBUhQ?znK2)w-|fz%`|VF{p^UKO5w=RwWxungkLED%cbVpveV z%TXJJ!gnWXY`+z+2n(y;U9G(Dh1YQKCX4XZgIRN<}nzM_z@?N4KjYr~WwsmBO$qyLmSymIigEe^Z9 zM*9(~2Y;Qbwm)N5LqPSvWb#Ud7%%Z~JLFG=%9xmda)=Qq&lqy!Bgd0wQuv6P3-&f2 z)1naFQLjj!%v8a+T~(;h#Xk!rZhTRORQaFlK~qz-tEKRWK07fx7T)|L!b2W?Dig6a zb%9@koO1<;gLgSwD!lC(x9G3Ys-)3}BVB$a>hhzCEi@{x6yf0ZQ^gD$w~pea>L%SL3psY=ne zs-u)A(phBq)$nTV*BvhcwziqSy|6*Mq2nb#5`Ofmod`i#xE&S!0V0Or$CC0+X2BkOC5Fs_;lhLiENyAwvxy zB0*)M=MD(19of@4J7xEp-~2K$Dm^?yxRNb;^QRo;DS2ff3Dx98N=Gav`%H{E6GD}3 z6-pu0QMzW-VA0n{PKE}&aox4cM53ke5QrKhbHE(|zXt5$2lfb}H`+ z=*fKue%tI|DFo9*hGQU#s#a2}^FUgGZ&~1r2dkCVNBr%XJr8sC3I;}-=v=D>h{m>? zzvx5xdJ)EJzINFJx9kr`hAyL1sFk#1%qcyjYvDf;folqIw#!vu>ww_V76B z@4~giPdalTe8^Qd<}yMAp2RLnh+H}nu1m9lh>O6_oMukbRX5zD7t*re%<&Rok1^M_vxn{MN!&-+9(mUqs5GK=M z9vmQE>PYQ3mM5JaklcPgUng(&;QllZ9wB>*Byjwj)Y2ZqN8r+9YZRO;I;`9APbf6cnc)xwBv-ULIEZ(P%!ER(hnSKd@PmD$r` z{$+qf!^&E>@J;5(^~e6CjuObYrWIMvLBQ`wEv$bB;u_}?wdxXDN4=}z zYh(DeK}LQ8ZqbqOsB{tfH?Kr#;U4>ft^l#Tjd7r-8t`fJO|eq(97e;Y=_DK zhgeF4|1oz}$p=nW(F1#V*`7?7HRt5{;{d6c9wODo`p9&JG0k{M%Cp2>$t|(|ZG+s? ze3_It;{_?r=BuAwjV^HRysbdOaR0!w1IS_V&biUsJ`0kZBsOew53RER&HOtwrv`!} z?kNR1Bwo7HPwOh7^g`$oW*SO)qO-+Ii~Qi2JH-R zUSS^7@!BB89IZ+a2_GO%U&3Pvza{?lO5hLVet!VM{OD+eS+@8|R$S||=F9=6)vDdr z!8H4$KC#=TEX!#&Yx)ij%HWnCGtdCro6>qVs{yu`+-#$O563o}oZ7~!cfL$%S)^4! zRF-_uBwtkZO24MX)*0LKotJ4T&H6UF&Lwiv5S=2JLF@hn+p;c1>%M~L+R%VyIZqDk zg(<0?0ShqjT1NWe(9Qqoa$);!820(1sn>O@Z#6h_7^=`xC7%HjSl=H zV8Ex)+1Deq?i@VDk+bmQe@%D8&-DQ&EXRMXE#k}IZ3zT_Faj7NVj;|7E1(%@@imJH z79=%Kv)^J*ZAHy#t)JpbkE$8zKE);v(;VA;0eWE2d*QcCzd&OrI-&YZ#-ylu-y(NU-@% zh&T9f2x)-FVN|r8r~1x~=0>(fZ)he28p6N_sRL&D05Do=Y@i{SBPO-B4{GRVZeW8N zu;I~BY)Gljar3)D#Z2G5C~LP_HQ)k?qb{q#8AS&+iVg|QpF<@2dtmi`$oend;)->d za$fII4pu5vgO#ck+VqyK=GJ}|a3i6m9URI`E3&^0KLp~&1Uujk50~h^gdJbq0agJN z`%ehZUB>%>W#28{Hi`==%c_3(?8nRS+a97>i-PhrI_Q)qO~+}j=@1$?3nu~LFtS;Y zAJegakfD=03UQioJWk{O0c+l1p7tA!pkmaw$eaYVWK27-D1d-$Y+!3JPke2VW|H=_ zRE-^o-LpbFrUUN8LF}f0Z=0eLR^%v!t)Qt6;5%HZJ%j|eI^kxGa?i6s9I8G4&U%(W zBbOC`IC2w&MFbjV*}x8dLiIuy3o$2_s@M9h+I{9%`tvOJB3R*q)7O~wO1omP63u|% z1ttQ}ioVGrnNj8T2^v9U8wCD5X6R&d^?Ksd3k*+(-z!N1G(R77(z--=`FoIUSqfln z^8SB)eF=OM)!P1?$=)?Bh3+tE3k^^pWi6YwX&aIjD64{swgshZ5=1e|k`(k>qG@PfHXbyA~7Iko15omAK(sy@TR7N&bSbk7-ROyP6vR;2wx@4S$Pxq;3Z zbgrOt1f4rRgqt3%*kYP*W>OgVBrX&#+bE_trrH}@!OqZT)6K$2v7|g-EV*-0ItSOC zz{(gTFxz9$jL2kNH@^ov2h05*fVwigcpeJ`jJlEi^pT?js=&8)m=s? z12od}uJO{gHdc5v{DVbVe;UiP#s+PioVi%uWcOC6(PZdgEJm|)n+Xj_Hkq=rHNw9_ zvrHPqp>YYwdI998eg9FHgIo?#yO%#X5JUw^1}& z8^uCBUYf%XU6bZ03M(IKJ*GeBCwBzGH>` zKwx#5?6s1SFLYXomc#L-Yh@V#l&@JwuCQdm&v&f=D^|^wIgX4wb``-It{_Y651=w#BtP)CQ6Yu z!xJpEjq34C&INH&!_>+c>tqYbZ7`{82AU`(a}T%Iv<);RhEp`Yd9kR>Se|H0x1~{` zz(I7a063|!Rb}+ZxM-m(q^)OhPR<9<)z%XBJ>{=-zXs-9qevu1`3N(!lhhCh?9UF{ zmENId3eD^ecqk}04KODR>|THhRejIA)RJi?8+0xG(P#h%txs{&M|>ZO_h$Yf-|c{c zBn_l7Uxkv~>%HJ;JL4g4t!XK;)gIh%kl9f4js}2Er&yl!kxK7P!8{@DDX3DL-pPYb z810Cl8;|hF|DHU0HT+U}0yzvt3sOMeS4d9xxNDjjANve~gJE4Wt>{;8SueWCZ&5%%X|})11Mw`m0eB*v5GlY zXxxYOgi;n}x!!!g?;TpR#-J8r1AQ#DVoqW04-oBvfJLH&xV+Q2MOu5TQ)czQ(N1ZN zjD+v(RZc=lZx6s|VQ6=uVkf;_;iZ|bu_p@R9t}o2>w$<%11ug`q;)51;!1)^PHdz| zB}VM{pzGR+8~rZ$aZG!_ky6yj5FooBV6tO{&;7382O|?({10fmBSwN+5i7X;uEGze zCvN^zaIN3f@Zs=&Oa6y~?(w_6`|vMhk!#sMGh=8q-+};WtZ=o(wf&#w0dx8#K#U^M zORgUOZI%ERNX|-__ZnB%KgW{*voIsA?PX&MC8tXjpecTT%DSGXs4u9lDzsWLVMI~JoH@jX zvaO3GVnl=S+Edq^ixizZftJFfRtfckoLfI#2uZwF8$FEkiEa-a=V(;>Rc4^8) z*TPQ+#;w5Uy-n0ZacC?+`L5?at&yvQ8_-~U>NfL7!MT8VyTSY@1rcvih9a-CgUV8? zgd@SE*Hld|FrQVR56YX4`m6EOyWx8?sD$r6)TI(3cOm5O(A9aWKf5jHYCV-{$bP$X zSbWr1jpA(?jpDo*bsEzZB{;jT3+l8eti^Xop)qN%b`B#`i??@Ocg22|ZJ!(jEraU@ za%TmYPKuKMpb70DeFDl|sTFISte5H}__mj>X32&w3t!zEyFKY#>$8n-mbM7Uv z%;6O0wLS*p6z9X9kIWO0dV-XC0(_I;nB%eJ4-aL5oByS#k9DJPQpsSk z5kEL`bM2dtR-V4BOeERfr9=?JUij3BOg0C#e4SygsuBe9`5n+p#UNdi_iop^+fR;^)odApDo1bWghOCLa6TIo}frVs*pT>;PC0tzF%{x zkkZR2<7au+9~eTtotcrCL*rwFsUe9u)E~?t<%<5_wp%grj~AxIV;28fT<)Z#m`Pxv z$|2Y$?@K3#zGA}4lhCGUXuIhq!yldWMdP^TtcEv2=N+LvZ%47Y<2kcfKoJ{zn})j}R!b*{Utr%2FcYs)LT9K7@n!BrA!VS$&`-_>?MmPewW z*S12k=d>+{U3rlHn-2nQrA^0Xz!i*gZUX%P z0E_}7I|?IvbU?LZQLY*2ET2F}eGI|@_Z0L2*VOj0i+^8DEE$``8VY%Mc^v2P$kdu)|OE@(Z_%dM%Bg8d{XGsL24a`>)Px%x@VA z(Ezfu79foyzTz-Vk%@n3x~z!!65ghLgHF|ST7D4yf=OY9^@D1@g_N_vk1-3iBr|YdCgD-3vOg9FXlew z1!Z?d#_JG}++@6g{3Z60e>MKx{&x{`ucR|oEdFp>KT|EVn|x4Khi&4T#6(+$DGIdf zM-q=$On^p)M{VrE2^+4pIK|sond&GcppK$x6=$9_%D!R&!I5LzsQ`0IsgG$(bGywB zs*9pM8yf8?pH1}rC(P&{^0>>p{R0_cGGNjxJhpYtce;6p!`lY`fp?gBKH$rARh>>I z39d&@>+C!5Fi3cNo&JA5-6CWn#M(*mZqG1kl6yh zH32{iXXfPg1p!wq&M-LvsRT-R z4`9pTc^0f3z}8wAtQoM&nKIYwXY%d0TFTZ>v5+BA9*wQ2rNEsHZ3~p-!SF=r7kc7i zuRr4Z5{-D%6ZAb5W}c&r+o2|`OTAkQvbS?NJHnhXKJ2>@S$=VZbheXow6!i=9E1-t z&z)@^UdGfU;!ThD*=kg@JH=OJ4%dP&;uUFSpQr}8R#9yiuBX1x*`bIv_i7_J?eKymEgunb%N9Jq3DnALf6(6{M0=+zsbhMTfx8^(4EL(wro=S)glq30%wws;JF z%CDj0W;^U_W>yG+DB218O{mZlV80gn+AbbC2zjlCUhCwd2b=CPb%+^EjIh){*i^YR zMz{}}`Rb}TxT+BHJthLXpBZ?sRrKu(ertY8e0nCyW-x~^S=|1HC5%wo^>6c{XBF1J ziBFRTE6MSAxqT4QR4Devb~@DL+2uOuZ`c|m+~sE=<$pi(xjBxhQ94ylN-KFvv=+KN zUnY_DuJ6ChEq^MUZCdoIVn0WrdJbSGLh1V$;c36#eN>#v6bkgTI+YP%>8Lx-5cFv8CwttI1ByawT^oeIpY>%t^= ziWgfNXYZ3EzSPhTGcAuo8ETCMkkbAzTzT-QIGs`83YO2q1qaD)MSW~%l12uNHTOHp zF%EHr7wo}qmkj0Bgq-f6-8Ue_Y^Qxmw(F05=}|N7O^pS#H$5IEgH(U2z}euUdPOlk z7cF{LYF6XBH-^0Vkj1>}A+yT*kXdP6DeVc$z|x&Z2Nu)0co z>6e0bx$Yh~8iIGCYcT^@!4R5HU70Lk#jNf&#N~#TNt~a1C~MSuHxNGez*whLz|W1J zUZ$?Dt2$Ywt(;b-t-P&FYo*4F_$fGJa^tZ)SgGWn3BAN9mYN$S?KF)AF~UTkpM66s zCYxhTTtSg7elWqzSY#!bMa`Ct;+;-%bu*Mdk;?tHamYN#?;3J0O&%>o1Lt|JApIAd zBKO*AFysZC9vp<}0U0^yvl{Ekd}g1gA38!T_Dwdvfgws<}9(9iZFyb>p`Tx7*4%zYDa-b(R##jZCr`eriZfkR z#uQ(Pk&P-Yxe_NwUgf0XFD^6da*L;4k;Onc&bluyv%mS+bzjWBEdR|bUq>JDiOpsF zSNlBz!%B}v5uaaXi;=aM#%hOL|6FZTV^LFE%{HB$fa7Vl)=43C)|2!F+Fg^*XH2nx zmd7MwBNWxG@Mc5@vm?(&uAYqMyd9uMb}P(@7H)>R73L&)pkN0qLP%$MQr!R2K@W~L z$~)2ZxAW<79p|DtOQL!e=(s*U-=E{qiEF_g9AkUf7Vk|F72F-AnzkV(?0m2tI23Y4 zUCB~>0?*Rg@?!+t`YwpV1J@9GC0BWq^Zc3C3Q5$o27G#th3d2s!1!g2;GME!r;shxJSG%>Tx?JN`12B+I9se~(>cj=(nR(NoB*{qsGys_DeTm&U(^2I|V zI0%JCId))bQ3}Jma1Lj7KuHQ`QVK)iBg~F!5LF7`<=|xzDU*De@X2sk{jQ1BA25FM zd5(c%B#E=x`2Ob%5UB4p)roOBAjS2JH`*KPdEsg_ zi_xxpZ?lSy@48*Y<@5doaj@^dSsarc>YgWnwhp=GeOqFu!<=G~DAiQ&c+#{3+Oal) zUYd)YQnYX_Xz-^p`;3Dx?8B!jZKATf1H9T{sqL4W<{|#u;C?W!EKT^PY>YQ+u(BN* zQVa%vLhFE%m@e6Ui!v;zjs;?w!UZCIA_{6NExm9d-c7s!Iofld!xo%rqB9a@E^dOF zR&D)O6M;~rrT?c*wUT|RiOw)|Mr6D?U90W0COSw#Ve`gw|7`lSWuFN&Ad{>fazw$6 z&=+-w$wFl(9C9oyTO&inB!;T30?$x(y5Xs9`%LM*88;*2sQ=3Nkn5ZO z4Cre`c!Md%E0f}Y+eeXix@LaYC!0bx;zy*kjh7xg_rKHeG+iOm4Y1!uF$q!gy@RE6 zql2I@0Zc4MWwW82Vz7z2`UkU2C0>y3wDU_RUSM{#_!$SeYQ$}a`F{4(m@f4w061G) z{H&wf&B873aU0=Q_P9&nR`<9~a7Q^}>{8~xz!TFGQ3rQikNZiuwOXKu^S5>dI>|1m z6oG20_NFG|TW9GD9yPvrwws!tad^|zoEoy79ALIbe40o`4_!0pu5V1jmWaw`4N9=| zuL#rz05nOkWK;lzqEB$G`##048^Ltwa+%@Gd1g=xM0!a_g%Gb=8FYsE?QmJU4$Gc{mW_uZ(Zs?uh$rQ6A{p_iiz~uzwh`vZd zlb>zv_LCmJyvHxKm_1>nzvN%t31olDAT=Wj=*^&z;(t#sHSHfBpz3`9_W~G;&-&G^ zY*$P|@=hxAz0`DPMi!L#y<^;ec1_0g(miKsyWC|00$M+FF7%!hwlbZC?Eh8s-yi%x zSM>Mz-zwHq5tUSteo{rEUw!-H<)#$0+>L;)W*KXWc1^iB(VpIT^9P2ZD?J_dcfrQF zprW7Y!sX~k>rGKO8-#(o)&o#9ADh4#E-gOCzJMIEAbPmofL`zUxT2BDD7_dUrh2?v zy+}BcUD(3e8jbQcbW-Lmz(|H#38x!kY}+pCxF(|l;YRLlBe7q2T+|u3tg)E-lfYFz zRBC90f`HZ|rFj=VEdiG<8m#ibMD%#9G;tWft(2Sn4tl)@S`;yg;xOHvo#>bU)$^xt z4yQX1%#dD&^m3$^ou>#Vrfuk)!VIVJpJ#DadS(`#VfHjKT;85kXNvO!bEfJ2GMVj! zxoDlXW;TwO3yK^4cjM|9a4SY7S{@k8pp!4c=Kunk z2l*JP_m=TSd8zK(CoP&fK$)5j*nYNcH08MCypK!h;+q%2{ws^^TnD;qJqVveaUQ)E zCOPrLquLO&^uJ@i562Cv?0?+eL@T<-Ukf0*@@xafA@%eAC?|n(UcFOiqW)+6(auW9 zLQwZ+f2^~i$Gyp~MG6l6&*qPZYXDpu{E*s$*h`wT>Knan$~W;l``o32Hs%d&Oje(5 z>Dw~4MehWOz|ePRk}Ivm9v|2kPTrYTa%V|;6LF14L}JtGQq_gnJyhH44FH-*ZXZ5_ zXY^}5I{hP_=skdBs51F+es2~x*f*PmpympZ6frD`i{y&ZX{rw_@k1Y?jie#H>ku+7-J_Wywl5iCMUr zEMw;#ZiBl!M5mXDBu~~8e}}a&W2tQ;&W?xPh+bMxdwGc=+8JA~=`7Kd7-F5;`VxcI z8DF1ch<7URZ^=+N-A4P(U2mk+6Mdhy?tUICQWf}vZE|n%U8jaJZB*sRGTRoT4}*D8 z#vx=?qC>u`1JNu6usUPq`WD=Awav_6X&qm4RUvC0q@;_WhKXcRIARhmY1B z{Amc|w(vQzNz#x_wd+hpMiejId9D9*ku7HEs0yYW@AfJ0g+-JPHvW|o7=$85XYG#hmb`U!1Qjao~3{J6R2NjA?dC>sag6ULRH*Kir!-@lUny9d4*!OQg zqyG*cVY}V01iFsWS1^|TM5|MRRu}RG0-lQnhx^vZpI>k<-RGUd)sT!-0SN_Ov7rpD zACqKTU#7^TsB`Qjkh+Y)m z%6jIRe7;E7wdmLTQ@;8wSm7b{3OW^4_+Eao3ja382~c5W@d6ybdOn2SOt6*tN$0M(wA30=4cg_g(bCGq>!7gx-R-B zYtEa$tboF0TZd~{U__t&0ALrsXvDGjZP0e1SWtM%wK7mlj<^m6hLR@N*MZdZmr<_= zB0A{ZG9_bUiIw{m?5LT6yUlxCeY!?1<3m)LkoXL!1yi=+J+?LOFk#Jl2%5@r^8oIv z0YM`k%!_f45 zk)B>Hr$zdQUB|mJE39UjE~X&jQ{YnG6>vKSM9_m5qh;KpIoF-G-^iYKq%}~~dTwH4 z0VRJtVLe>klS_mW-g|m-T?^k~S?C%OOt&lm*6r_5js#k*b%r_1RTAypk4`}YElZ^M3{TV=yC;z+T9@|F6^M!pb5VHA+1iq z$#7Eb#s<-g*VIDsTiT-|Ee49FWy@`hO;$X_tZFN^-I>wRRBTlYWzUlAa;vdNCH)Af z%6qJ_wvnpmrw2#mf?9W4s}j?DrdCyds)BEK3bf)6F|j)Ue6ocL+~E2Z7G6<{T$M>FlPJ zp*_L@%+yizZ5Ch^ELAyh_r`_GGIHT^Tz16Q2sMp#yi@Jx1h+4;kz7<*?UuV=Few^m z&~N&TbxJn$q7rM7)JlR(xrZ5%hC7*XC6|J-D<^@<%|7#KBtw-#}lszt0C*Kjo^<{m-E zi~|@Pm~jV{8_+auF~*;35m!7>CmlSJ9EGJSK$+E&PQ3U)oruRewtyerA}&N4*##K{ z0yIsstyGYc8B97bqP@o<4C9612NtxR{91>d66U%K&^ka>rS1R~^I$za1FQer?Z-Mv z91AR}5|~s~XNl^~b|}X;D}?m0(xlbB16RNBU!b$iVETuJ?4-kN_PAYXvr7kcxW$>{ z$j)79avawNbTpN11MAf--kUq5WicLyc@B*usi#kNmhbMR-^Rl))%=+mZafy8>6Fd z_N(t>@Y?#}k(d1u--w88f4-M)br=}RoT8Xjy8WS(RIh9?-5Swtk`-YqU><~_HwpG$ z?pOmioxtd%RzfE(D-utFq5CI_h@g8Xuv;%>Gcxeo=@;$t@sYwSN<{-;|K3MaTDZ09 zmddqy_Y(7cWs3oZl?nGp7Q65Jtzng(d!fL#u6iNjG{Vpz?Hz~kNuvVvVvc&Z;HwDS zZN9sV)FkR_5~MYwG;kMsI9)Y32sF_ZLj|!Jy-Cw}n&Jn zUS<>)bqZp71safK$Z&V4tgPIOmVN<~MFx zGozCU*G2wGIq9!kh}rvNsBiJ1lZ1TVcKLng&`qBz1paTZ%NL30_>bgd=)%E>Y(r!Y zuB1HNb<@`wjK=(1WUYmsafYFy;q)`oPfI^3RbWa#HC;}U5T=Ep>kfr0d*SZg@zO3q zzastgDf|KjNhf*yBMMSMJ`Dhg`Q<%z+SCM;ke}yL0 zmymlja?^XXg~L9JubircgvxByXwR>F3r&51zo;U&+P^ZN#aE58G1t;K$6e-C(pe~e zlc^mG_Egu`;*1xW8nAn;D{)_@Qyg3E6vwa=#N@(?E7}wmbO|VGiTP(a!?CzP0!k8% zE^+ioMaSRMm0fBm+78|vRr2n1u!vg6)*ONEm*>RPYBdy2vhiw-BE5d$HH@Ijw0bD3S`4xgcuzAh(Z%n+ zNdK)<{?7jd@N>dWGe1>k+hI&-tHOVphv$nlWXzx~=4xq2BqK$uwMVy!*;&HHZtY=a z>q+ZlmUU%ntHZ+Y){qqYL*?k~52jU~tW;M$1kGaRN}b7O)(G4EI@2l%AFVcMgr}fo zi~(wsVJLATH?r7VGmY+|QrJT1)C2RqQ0`r9(c6;pF`X1bEZ9N8GWSR5|H<%uW>Sac zt6lEU+wQU;1#`D$uh^Fth;qh#@$|Jmt6Q~6J7VFw|y-d zYMFuEhvJmP&5$I4p1nkjlcYw!VdQi(b9D-f1N+q}gdQ{UM5R|&Uyb8A^=pJCNU0@# zgWL^_?$MO-{sabxP(uo2n4py^;0X2^Z&riPm1tO4%AVUP7HlNmo&2dNk~(1@Hlzw@ zXwg8;=vN&>%$(S7#&FzihLV}AEII?qb|{2Z;+p=u+uy<09^}a~>&lHb^(dZ;Cd2K0 z&9bW{vLpj8AkoeOjIjHBcFRS{rkn3#C^~W~r!%?eF%HdC^cmA+sCQ-JAz3tVnYa5O z@_f&zp_5|LM8X|{eHMmJfDgjXn?yLOna>6@X)^9Ubrbzm&r~nNw?&iJ$QFKm3`xB+ zHmtIkp|3*)^&60!6@b-;F6{TD%XY0l(9ufErK8h&I0DpvI>6Znsx(5Xm{7P7y8rSz6#};2kj<0Tqo2;w8&X6{s9;>ex5szfQPsoFxS)%G1#KBw{{)ci; z;(r+T5&lPLKayf9q?nmf%xo!Uu2z}@ia^NN7z4hEW8@XN5?FbwfGdx0`l`ee*BLEU z#(3g-tD#Qp1G})W4t@6@X0}E-j$ zemahSwWn~cp~Z|DK1KQm*BBcK+=K=F)bqm2APyF-V%sLS`z5yN46-4+pM0JWwR@*<3|NQ|ELtjIB~Dy=7$ACW*Z?e%`S zDc?(bES=M7Po;NUi!k)!)Op2(bD*b=UI`mvwAayH|9h}c!1OA-rptUO4DIzN5icN) z_SAhaRNjHE8JCvKa8GTKp(-8W0p`m~!oEhoY!JM^;Eq%k%or$Y7NE1LB%o-dI6Ffj z+Tob>aNp@k{FVf)$uEX9-b)ZCiTHM7lk#Zj5tKBw4pRv;=HArEogL?9ds-HcGhL zgoga8rvc74A5J9kB=ts%_V6#h%0R0n4$2*V@y&+}n1W-4G5m!-#7=%~UXX;cQ*R3_ zkoGodv4twdnJnO4kFNslN#OXceMxfal)%jYj=p)E&}cP(ye}D(IyEr)&(R4q`WrsJ zA1Stk{1AD;I`CWJH;?OR^g$7qn@dy-rmm_EiaOr5yglpfo4&q*v_GfMr|Ea`yZRB` zl&~M?T&cLe-h$@|a{#YQ_YWl#fK!5PMSq}uiuMJAy89k*+9!J6?B?+zTG(P z`W*d;$^&IZRWi05sC!VLl@fIyK(OtH0AHOocP)2!iHMG5n(02B$G^xTOESnoJ6+5SHbY?3gO=voe(pvr;2nr z9Su2yTaOu4G-fO6`;32zBbl?`h4v}6juX@vNdy9nm&A`RGE#+Tg=qy3!O%W%3FdW4 zg*lMmAX~JqkM=XseL{UXeG=Z!Lx2Z1|de_FU^B>WHD>{ z5iLR$h|)q+U@~C1Q}}kUUqb8Tz|Mj(zzl-X!wi8bfO$*VJ-N**=D)}$_mMvQil#Hj#bP_1qD!^nIfhY)E4g9SGNoJoI|7@MkI!9M!B~g2EWsg!& z@hbPd0dOGhZIYgVRGf8%p{De4?l z=SUrvy1#U{>C`>V0J$9_v9E}anM<-<7K1@0?B#zNLIz;1jU7t1kdOHtLrE?f#~&X` z%1Htrn};|DKP(Roc?Z8Fk1Vi{dW+IlRk)Z~jl08iCT)Qd_ZOys{;I+aVf|n$g_HnY z?^MF+w{kE>X+NNMoYOv0hzW?2=*)W1Nm>I<9*ssNMrnZ~d3!eS!m# zQG{7Ah)A;<1XQNY)9FolbxPrf$fArqhxO=7Gx?>%$fLx>e?N@qQnR|k7h9WfwiYts zqO}K}4ZeQ-fZ-&2fczZ>NAN_>584L9Sbrhhn~E6$2ke5M81G$t)o?Q4mM^P1%}U{+ zNDa2g2O~dEB?B4mUTcG+VHL}HS1ADY=V}$g;-HdM2#bQID_X9yw(#0)j@wvrtasM{6=rN~dcmQ`9_MMKu_6sk z@f1?L&LZ3SgZp3n z_^~9L9OV~`C3DF({@_?*8L|$O%BLv60YgUA~d&?6+X(W-6#^9yE^RkbxgU zV^gH|NKZDJg$}+CX)+j4@QR?&fL~dF?e()=DQ=yq7?W!=bZsm1zU%0V1I)fL3M#3o zGuF(-P2h4tBc&=qs+W*Tg_|Oyk*aT}SHb8YVTcrWgHWb3l_G@;DHM6vaHUA3mY7Tk zdGc+B$!H)<#f^kj=3=PM;!+IV!074OI5N|{_)orpfr=Xr5Jbz&FrH*2Tm9r!y0McB?^3d;hsl`$CdQ}yit%J+(gD9RAQwIWeR&_UnN2_WPWpLa zJV}f0_gl7m`Mwj##9Q<54JoB#^lN{6G=-5<&}Z@EjdG^kBg?aV#d30CHa5KPMN(QK zz6xxApM!ZMB7+Wk(3ylP{+S6R7uUcV${46Qf+~1I*@QCZ5TGUt!7W|Ow;{pUpL|BZ zTjWA6HqIb9^r+;Q3H?!0e<*4BvML=tXqcbL8-(ZPNYB0L=Z9mnP9EedCX(co8mhUx zh!*k-y@jKek*YmuEx%zR=`Rafy7)a4N$%kN(sTaqmm%Sc{!a5R(|@T@)F?T{wOIpy zguD$E%AgqA7x`Z%l4bUPSv(+cUyaNu-P=SiFxd?BgD_bvh+*xxe@YH%4*JB!PzM>V z!21c+E#hI20RD4KR97AoqpZh_^V{P(W8}BAw3KBzUT{RRUa)>^ePPwNtL_nq?2w;n z&G+}=`ZCO!xyA#f@^jtlO|l&Su}aDo?HwcwJXK0EkO=v)(ET*c_!EuNxGdd&C35_m!0^ItQ7}R?S z6EzEy*6oBluz+w)qOx^c-S*O3akX92e<-0px{XT0R{(pE3%Up{P&Jg=#jI8;V1G=M zbH_lwK?25x53mc_SnG`xXJVwl82*^YVa6XMDxfD9G zC)5Ju)nkffuBtxfo1G|zi2uH!91s0N1al<;d4P<#rnh*QpyXJ!|xfB|PkwG}{pwu+*IfJ!CcN1Npv*K1h-bj-B zOf*j{O9YpVx%n&uiKTrC;W2)^k*tkP#n?L)Ol_?HUS`tr$Bjfcar*a$BPph7KXACR zKEZVEJL;>uNH=h_XWX@faJ{`li{3$37TSwwZ~B?fFDCyY19?(HN?A6~ z7xuLURQSKZPo6?@=a+~HmUy$eGQpyy|KYc_fUXTYvfsp^oj+%X)zfhzv6pUY<_StIWN=M5S3pI;co1X{#eWr z)R)#_ck`-cc=^QL*6yNc`V~koTi6^}LB^8A1AoZ)=qh}lnr7ol5|-uA2S0|?v{X8s zJ-D54x52%BY4^vZrSsEQk(B0jtH}%*`&p3xYz=w3KWzaTcL{~jeG6^9-m=y&I~#5(bu6DWHI8m6-O@*^1e(mi6doO;APj}|ubscXrtnh_5o z35va|xoRzXeGcv-7RHH;ZVK1sI}f5t+))O&kKcc@*~%$=!#XlG|HY&9q#N;Fi74pq z*LumfAq13wL3>mNY9Ygj^krcf4NiG5YCdy4`5QURzq6hUh+Bj!Jvitt(VH$or5b-} zJ;_MBJp}nLEHMHkg2&>j5^|ME8jkql5Z`|TnRHto;_1R}JsfM&S!nDfUs~v!n*GJ! zR9^CBO1UBJWJ;rPeHo5JXjJHOjShC)Z)L}t5-t5H>PX5T2=a{^NSg9S@RILJkoRmL zNpTm04A*jzVV=jB3#$2R8%R#vhq#`E!=;I|z9)lx4*EmCW~BQWH`=FK7%Y$kIu|ba zUJmki(75LjM^7X%e~5cB$UE(%f6PWHZqkEN>2KRfHCr6y`#VShJ3PqGbCA2DR3LDE=X7k|z{t|)(0E-k&lzR<7nIw7#g1GXx{xed4OnI5g=vaQ=cHCqINlGzRIkp9L={qLCOd@ z!SAgjU$fd5nm2AHpQ*@q%`>->T`W1-{F95wt69}gv@d&53ODf+^v;1DG z|I6LnQz4pWSWjVpPG5_ckkdf?n*ZRw2)C*`m>H8m7)_6Rs~sL?kLNhty_tJ!O{4xd z_rkv2Z$i_2)YJU`SNcDeGYl^ii^O)?6ia%V>d%?){lgpEdos}UPyHc09`4?s9p%t( zOnwgHpib`LEQ6)>Zoq46(AqCQiUNfLy_uEZ`O@B0;{%-FHABB80F2_xl?3e=HopIVdII*Rb|=VB>rT-7Kv0jR488tdJJOTx zS3DpB6OD4xVQBma*aI>MGX$MUVIGFz$KwyuEKItNFhgM`!&Jaj z!K{XP9EOM45AzPpDVVQeI(7X0FOhSaePDXf*R}97UnYI*`)=>{zC0Cgh#!4XYG{M( zyAyG0G+1M)hXqWn^0QYyzx!)Z^Et)@zriJlARyopL3HzY-xx;1|BYJ z2sK}VHW|X!2l0=55EwMz~%M^WkIIY5nSZI?U(2OKdbPgugruZK&MW*dF0f6_@Icb+Dh%`sn+EM;7DA~VvYW)3mxxaXKj{GfpJ-ac0GB&F1X(RpThZK_?6G5+O{LDDmROd9 zR};(<%L>hk0o@gq#BzJ=TED@SQjm3OD^l9Jl*yR~Gym@yw0->fd=B@#AK&vm-}8N) zIeJoY^rWI{(cwjhDTL5W9-%)N5h|t;N``bHgfxmGMJSI!h>;<5;r}SKFM{NZ|4sSV zw+SD;_{W^_*2D#eBcONLV_fTbL@DN;4|q zJ_$$v>KERXlx+h%~%Nsc=x2?K?tGTXRtMDpE4Xmk6mW~)?pJ+*)o?jZ|6pOra%)*EZ{p(?*MDYdB zQzjbvLb;7=YDBFn-@Pt016%M4b{$|dqTBkhhDjD*_LYWbn7Mw;LSna1xLr0k{@#ix z7M)%QS%t+Jm|+a*`22EVhb-Q9w`mE$>-Ro3<4)6Jh~4c=Yw!ME+`$0MszT#V_Eeat z&>AZF1tzkJVT42pQd$^M>(O##MI2v9R#PnJ2sGRLH2iMU6;FrG0uXXd7J;yq%X?W>kwZWuMMG*W|$KBb4^rAP<7Qpr&1+7^zZB=xfFZ z9Y0wFoAw=^yQYXk;#{l?ffOb~|tQk6hL_Gmf9Trb>^*1WdUVY|)y3cNq;`ei9&SSQc8(-F|>eF zvn7c^jIt(Hp?hj3ap z(&{+H$P({FE`uu!wRsp?P+epbP+B9mx;oM<5Dg8#D?tDr|t30IV9(j;*@-l@v5C5x|n!iH5SpF=Il;wv6XYXBI$;3`Z?rC#jq{vPi@p8-?)pl2LlvtzJLa~_-AQ847~7B}elSL{tc4taWKnlQ zxS-0XA068nrqACEof6P@co8dsZ9onxgQPck&+#aeq>@8h^P^W-5>_RR5xYFX;V^w& zjJV&ED4NFH9fStqlGkd0PAW^eB6H1+;5rAss77LxEKw}F*}v(3`cL-m`LF(;@d^du zEPYQvm>;g69wSzJDE51cg8g-fIYx0+8BfEB@4)}2l|_JZQaEDAy_Ra-1BqgnSLg_T zmrV`)n`EW}+{q#EV!gGh2AZ6U`LfT2njE3uFtnMGgr3$>9s8HwUn?6y)m%0 z6dAQHu>)xn#dMDl7Hxzn{{jc}c5W&MG+&z}vSX|v&!8-s0M#g{_5&6ki8e|T#WTl+ zqtUn1^T&ki(H8(`_8u3`#Uw>sCpRC=AK8OJt1uFiO`q}$NwJ?t#)!;uLdFrBAif8U zV(*;%Dqxj=`FPfbF&YY<8k4~PC&t{0-?@ULI$U$TapeZnMp(7qCs^a^=m&hlxwtuV zBE=?b(=b#1G(hUl4z-;*2IqA->AsNMn8gX)1kTRYh`|{sE92&BruYOyeEysSQSGH2 z31YbSv#W@bYU#E_@q|atDYa(U;A0*s_b6IflE@WvGhpZkeRFQc?(+!;<7Y|}#9WW? zkN6ZAYQ6_$$loT{H^kwZC&N$jv(|cNv=|KwPte;EfH=si+g2oqFMIxSm7(4+E8EFF zlN~0IB7|Dn2+#(Iwa=y4Ly-s(D8`wT^+0SFkS;$sS#*qifA4?q=R}kwM!~R9w(vnt z%aNgdK5YoF{XSCbKEIrQBZD$a`LMNUk(m{3#)=h5VzQ^GyPgaP1Jg+AqVlCKS|@YS zZWtV{n*@^0)g4 z_ab#gi+}V9%M#hJ1X1E)0NS)ics8+s{>UdBP0XTy@CyBj1wc;!3W%39pFZaomLzSV zHv)zxnISvRBUB}4K_uQItW7S3$OslrB^xwngHkSD{4ltg14^k)Y)cY*Jz3gF_XH+rR<&fJbSMC+P^qh$d(H<1r!Y~s>Fl{b2V85yDKPkMxhQX1n?ID-x(jMITF zPf;u(#|A-_`V&3k6}+kGbYDcx=t;_;Q1&4Rs_d@=FMmrK zQ(5ui+A%py@3ArAV0yvt6U0|NIy2m5Kj+#tQ?4!679Br^yNtwE8z^LwdP|r-|a`-$-J-s5(vX)C>!O^B2Z$VrBkY zI2td?f&@q7#cu-RILe402ZSRmM=t`3#CFhcjtOnr`SixIPOSZbQdPnH&2VCxgnwn; zlTZ{4>LU9Mnh!e2HJHay&GDi>DAZ>eBh^7e`Uf53S<0Z$o@Jm<`-GpfveM57kWM`a z4Z;~6HNX@hH)3zq{3swy&t4to2xz%lnD27|p)GrA*sw24D*=KuzMaa-6Z(HpD}#h-!r^&lIHKMV06gKinAvlZgs2U|n& zMu>kMte2Dg=OKPM$O5aK2SZv6+aZ17G`VxF!jqGy#ruM&xj_-vH#YjF_fB4Bme!Ar z?ibEX&Xb)EQewIA)8xePjo#9mB~J*^Q?ga}d1pg6S=syKtrIJC0&KdeB%JvB)f4I4WyCF`<1g>V- zj2v8b^#Llk*trGk(G8x>VBvDxIJN~BS@Kq+Je6yN-+~M43-qNK^-!_~N@f9HI!>jo zRx#{QHEEf_LM=1|vXOEf%0<>KcpCbKXY0RzdJCR}+RX5ojdtT)v<1&WSNNK1oYH-7 zqg)HUGyi zDLJ$nNb=a{{O2ZQRauoK2F207&rIipiBr=i#dg0&WXAFy{tA|EM!7QcMG*01B^1DI zU7$*Pj870>8@qzVogMQ#gvY097ro8bA&b6#)k}DWeo0A!_>G^+eV0d8yF8}vdpQG# zpgPE896&@vYqu-#Y1Ppyq{|A|SahrhTf|=yG5pzdYpvS-!DHwyy6Ap8nci zn6q4G>D|shSA7NRHzDg2^9#6o=NDHM6eU*r(COnI#GpLIpeel#M%@lajeLI@qO}ct zgjnREwRRgsrhBene*-MnNhIB3Gywk-#IOBN19;p`$Xbjpg>o+Wjlg(Z!3V#($Uz-_ zgnQ(HLd^8s4r2X*VKt@d$b{G-BN~k044Pjzg)OlXC`bO%AmBYm6X%sfLH0RG9gxFrJNK?bI}|vK8R_p0hXR(10dW1 zkpzz(K#OFleI=%n3Q{@78eM|mt}8Y+=L&Wgm!**mD11SoAA1MGfglkds}Ge zaB*X>`}@ESa%$L`Syga6Wn}Z7gZuJ9*Yx>%E9ykz0YGBbtSn{gr&?p2bIj-Q^J|39 zr-#{EgV11M9L}<_R)a_bUlzvtM;{L6T4q>2!Kk+2I}QkJGZ57J-!aIQK(T%}szi)T zN~YNB5XTUdN#obSIXJ#V8SpbG0f<5%T|=?tXnzBN@SU$h`Cd{-4g?y)RU7=f2H{r- zXQ2Vn7SIr;K$r|6B?UTxkN|-Jk`V_XyZ-BM!$H-Afc;~7!{8_=b!uSa*9Von0~?s0 z2PtujH#j;8Zg$4-(svAy-EVJBf-J;xjN`d#sg-aQ!toi8L`H}ga6uKy$*Gr%XW_1# zxopv~0Bde`)&R*Q1nqfWgqze>CQkoaW~i5o#hVlf~ViAztBg_4_y zEII?`?1DHUg{82TGU3~qdF;A?f3za-6i=D8B~-nC)EJuOt&vJk3X^B0$JP4?J?Qm4 zXrkB#T!7-l?|ef2ES^>cgu}B|FZ*dU$LWv@RBv6q&$*TkR;a)Ynf4mZCYd(<>Y)s+~ucLZ(mleh+-V zhh>qaZG!kS5T1pw6~cB14hVJ#TObfhe^!`1yG0r${@NvcF}sc0C)nmB(=P{vy>mXN zrv-%7w_V6e5GUUh!TrTf@TCY35t?k-vw!MySyYc%qycuPj`MYFNaEr6KRaZ zg+3W4htU!-nl#si*jRBiC@Al!)jk1yoDx{(JA*F+n(3V|IXG-Zu-UP|E(S+^!jpFt zGBR?8iV;iTA1eml7f#%fMJJvX+;^O%K^6I?flWE#D>0Q6>$%qd}dX;DnPcpD}{(mc@ReL^@iENm>z(!`5hc+_Gb z%vSO5P4VK6UrC!^(gxcwo~D7mNwyd zaXTjE*k4*j=J*E8GGgqFdNPf1fX9mKP7%5{k1r0XXd4j{bN!^vKm4;u8*8k19aPt4 z&fsW+Pv;~hy?#kK+gcy%ZZ#v_pE%$_3IBZ-nHx>o z6-ssb?)nn8eRUjFDU?-fQ)0zB931Vymxhr1 z%f7%U_S-|qTn?JN>gf~jJ{2cEbqa-`PuAvx6K^T^nuuCWqC>q(5ETH~YUJDv;YxKO z{aR3nng1wl4hqlCw@~fE==^fqE2dW~oF0wg-t=hTc+{YNriY6aQ$5kOfA-Mz$Bgt~ z29B=ZU^i)6j3Wa})6vA?%hKTsYbu!?CKX)sYpP!#UPyh~ac|OK2g;N}duUs4(o8Eo zWb_OOzUw2DUF?1aE|q}}4N^}?TPvSVCdMLVgyR9Cq> zdNq|-dI@O-vBqH&+Mnkntag8lSQxAT7K?3ygQS#LrNTRSx*gagri^RCk44Zb^-j>a z%A4@-BjljBoy$`bRlQAk{k(QhoZ)q&q&LyogkPBV;ih&^f*y2Vb84>rbrzb)45Eys z>8TwbZd%&aiW6GxSY}sjUav0Q3~kdIY@6*^ZqEb0B>`Bbb^WKHHF1qvxj$>%| zVlFs(E^q`VS;}t&*BrqqOc-!I2(A}`33YIhUxe@57}-xj{d&%nuIeBy_hA`Zr`Znw zubvE6wBoqdO;CrdnktwPM=dio+ntAxI%8$t;lrKbF?Z zQ(_dYQqc{?4U(@uGaWZl{WW&v=Ix-p&ykn~{Ah$-vA*w9z?*`90^X=-^T#~BQ)+z` zdRUcST0#$((&0NhJRQDoRhlP*L7Zp0gc>^naZf@JwV-BwwJL8F4SDlivfDJRIV?fQOB5mV>Z$*p$$$ zvceiIXt)^ZJ+wyEyv3OE_Y^m&XNNYgK^xNkshe$7y{|wUo635#!TN+|XwHyk=n|E) zlaJGX)WGbeH>vg-H*MMUmraVz#hYK`S7jjcy3TgIb>7>?sD9+0<8H^>=AATB1J4^3 z{SN$m8s$@sH2HoWfwcnApNRMj>rl5Ri3w|NFj9k%i=O7AGN}ytp)mbtw$L60eCv2) zWAV1S6r;Vt9tVg41Ed`?{<9xCPwO&Xf$x(M$fpt=zMtXBOhR7_tu`Hi?J`%bo`2Ls zGhf+>A?iigj<~*w+)YWE+YqgDls&JHbT9O|pR{59m&osn0-z(Rt zdZ7b2amw36 z$u&b*uqa-sTx}4QNV!sYWYJ8UdZl^|#pzG2W+Oz?X&|l31unJXIpB+;%~$X;yWv`x zqzUgo*MwWw$5l<{es?Wgq8w2xi(HvcPIRhA!qm1jwHQ0*tz{|85&%tF=$%h zR_L#w*cfYFx)P{A*wzi5_~`mma8MqGa)IUP~fz%dtbE9$c<>+QgH_=tjqm7hK;^IuIjZ~hrw-mm`B@4>Z2ab7S*r*mz z`wddML}B^eskS5D4D(L>S52ca{L)VRH;od`tGxeNpx(PN3*;yMg4R7AV=kN+p`ucH ziLU&(CIafk4MxIvluOlY?EhjXLc2D!%<6sJiaub1=+)YHvCU{HmSEmN{A4C9x*Men<#>O~WjH*HC+97w-hoo&t zd<+xaKwCjby%W&`ibMJ2TvtpBC@xYZhhP|_d^tEeJpfB*wkf0+lAOY^STRr{B<*_P~; z*=t&@yb~l_=tbd@gK-II$+`Q3{|$?!Tc*XJWBX-!#%4|`0?p03f_FJ!kVTnb#-cKI zd(hKx>D6oDfC;CTTC#|sPGCkvE&@~Lm_ZxhmH|j? zz@1+&>!;||0pb1M?+c&bH`f$q4eP3~UK9SXJU9GPOl1^vH0;({VbAikJEpjGrVO5~ zP+5!gM8Px&_Mr62_Nl?qmBF)+)|ygzm34lo47tPHts_N}xQfB6QtCL=sTF=&p1B|f zK!tQV7uokRg+Y9Uge6D~?w<^qxyD-GcQUhB!%H1=9)O#?u`D~e_UsqbE zk#)p$tkN7c{xE>@BV4=TTBkced*KF!q~Tyn9{e|GG}cz*je&78E-pv8&dPVIc5;#2 zW^N8Rc~A-2v$t`A|n~S!C}XpD3bi z)RE80+%s_uqe__w|LZhbuzcJY2rZsmPEmsJ&dQ(Wm7M|^bz*GqqRP9fHRgw(Jc_r@ zq9#$jNAYvBcHw95lK3RQysKDHJ;_Y>y={!RZ0Ua6=pUS4xzu`FSG92I-f59DiPlj$ zh#fs&J(bZcXjY{tUJT3vKG7x2TQ#A~=whEnj!BT-)t=BIF=z0gZDo%ZMS+HkeOd|X zeaew$+Je=NqqCtzPmNem(%vZXm@he`yULd!#XRAaRTFFxCO81*(%F*3N=_wad)3Xz zT5k!1|87e-iLc3YSGq+)3jt++f-gZ^B6$)TNl^Nh#F_0!ex*+oA9%W4-^@$y_jOBc3rep#8|%u!KWw%F13h9)b z1XQ4S3}uJAgQHmiFw*Mey{z>RtfyeM6IPVyyVV-O#HmS)i?tpIl^%vtB`F1Ig{*g3 zXuV5L&Tx~3A@;MYk<81OWErY+pTT3^8FAx-@~oaC?r zm&U#TA`eg+$+pmjy@0ha39@D2isPOH(hAu)U1;OlLK~-Bb9$%&pzFN}-Bf@s-S-q< z0EW!?X07$Wj;%AT0c;A_XIRe_78C_X>jO{nuv-je zNhTCxhvnGARgVjO_f4>M;y-m+ zZYW6km#e6;iQB}fIZ#5Jp5uvQOl9i9zN_edGSLjqz#%PY9zF7ss1m4q|ElyK&WDtB zTf;$_u&b!&DvIv8N=GZX1e0&DXFdn)VaqpVc(OE|jc?&?m@#zzIbY11j-@4{U-)>D&}u1VH3 zXQ$0$hk^r}0GjG_Fr@1&-&=CrD4TKXJ@NWNPkcR^i29crPa5TeXfo`E6Cythdpm5TK9T_y~eG#GAr<6AdoZQY_$XO$N(oY091%sG{6iI7VNW?mMpngCJ-a zR)zmVxVm}@lKZf6cWY)~bgWuKFfA z2gexd(!V-yOMi3NAb(2pWiL=ey@0>X*eRdTce(~;NJ@X+@ffJ{eCWDjxKy@p*>}{R zd_Mnj5lLrw;_Br-^^KZq-&y6ui|@M;osHw_S828wNB&+1a@IG0Cxj@2wQJuKK7Oz; z_VtPm4*~_|$3bPt67WiOtDt%)?XDJ}e^frz+wM6LyQiWK;)-4eemFC_)Pdj2RCP=( zP3YKJc?DN}kZeB!B+7vw%G{RXsCXaHBig>hM1!ez`#&kS1Hb#vH-{tTk#^u0+|LOc z9-6J{9b0cw+6&=$oqj0W7F>P>f6|0<9<6HRK82nVxfxuJz2^GjH3sm6I2T0VV;U>| zgf|1FK+Un@*BG2RGwz46TMtZu^8j>2eFfKll@3e~V?SOd8w>}|gv8fr%1U3wQFel| zk*-iF#HjvHMv#)!I|_)cw2e^8gAg%j1oFS^@_RHe%N_W1$uwYq_JIg1F)!6f>P_jtoR>7q>ZR>^Vs!xK#=jg6 zFW^yodj#m8fM$ajGXS^QPOgUA`S9;;-~j6&N|conyW;Ua)a-B)r>bbMuAk{3`DRI@ z@qtT*bi*&@G`NX0M~I(~QCT_e49{qmlCNKrI8W3 zAJ&FNxj#`vxDYFM3qL%prvgISBiYmqq2!S~>IdQBM`lr1gf||^6PQ01**-C;ti@|T zhW`y~&j2f4yi!?sW`(klT4^a4kG*d?Gaoc^kB7lg)oB^`bgO`K3Ky23;Zmsts6!Tx ztzD{#GVj5;YxWyQ`|C8}Kzs9wcNwqti{0YUcPpLqQFb!$N4n@JXuT8XXsbf4X>y2b z>uj0{p~iclu}PBx!{iljH(u-CiL)uYLeaO6--+|J4QBC_l2eFZc8RCRwB+1A{*~%j zjy9X0exV(lf7c?XBBKSI5rU(SgUco(o(SyWXPW^X^e+KA=z-^*7|Q=N@Lb4cVP%Ll zYJ1Yw-u3;HtzB(aN7pleMb@t8;eUPTKi~EJ`XXlouwFJ$5`s7W=u~i|BaXWXL1JoG zO6>CJzWj}do#V7u#F)=ZBz;XdIeMEy-Us}Lp^&42`&5eSeG%;}Cx-Y58Mlt#(oQa4 zskMm%N!Df$j^>Qr%hOt=UIm_>_s)NyhM<)JEXWEV

$kDqt{IgOi5a4@R3R@JNGI zZVVQhw{Xj zW$ZTah^l}MPj0kc9LcVHAYluE`o-4 z`bq7)3bMoAsd}?Q?8bx`=$txh608bbrgc^q%B8egUM0#rS{~{%S8#1RU<4wYM01}i zZg=HvbaoD48)80{6!lGW*TShI4hFaQ|68Ig;aUhsl63Q0(!iIPT0_?rv>`UQ{7i}^ zC!UDFdI%n9L-d6V1iqC*Rgfm9TMBG#p&5xEgFfR5Mh9-MblTuG3S#uIt1tNH&DYo0 zJ9QhWT;2&}2=z#0ePr%X18kOX-k&OR&Ipk^NuN|pF#R?ERMQS{8c|y4?CBuYPXTNp z(4u~>(~g6=$9LC|guQbpzv3f8M!65*zqW$PCf^1KHl#g!RT_QvsvLqcT5BSi(TL1@P} zXr&$4!(+kGe|qo1(&6CfvnRn{1RzpHd^;Qv^Z=?6_>$Y75J4iE$8 zz%Y`nBHQ%8gp`1o2>3ZBluZm}n&Kv$wj#?EWzB;d>uYemRJcL6<2EidX`DviK$iYt zjj(U6+Sb6O@F+K>Qff`)4}v5ODn)xNc(?5i85!ul-8gMc6lnT1#cFpEr*P9gwY<=i zQ2#1uT&ICwP%CI$>omqPabP!2r&ehfmpFVQBI+=44Zuw)$!)WlO!yW~5o_ldY$PFP zz6vCyKAuedD$IC%#l*{Sy`y|dZ-0eyDq~*&Q2VlyIi|6q0%@;gBuUEJSJ;=>88G4X z3TGZKTiR2VX;Jh_M;J+xT>_6-?zYo*Bb1-0)J;pW-)--Q9{yap*pie+K|Zlf`pY}3 zw}CG@%F)e;5L!^DayoJ< zr$>MvwVWHTXMlPqy~6Qzlc`2wXq|1Exk|y^Urnx5);ga{ngI=92$|1*vq2FwSm5mj zx>Vn|*@ym8HWDnh}w@Q;`>o{08(*I;*ixFLh_@aEexg?xxV1q^F!p zJ=K`kRos}|)zGNw>S?q(i-54s3@&ya#rvq)5dS2gBL)RGoi~2-AH|@xk}3Lbl|L6y zI+fY!?p1st_<8+je>T#gJ#N6JvqQ2R zJXavD*^!(;WIB~prvkbMu6GA&M5$7yOLD1n@x2yzG{?dOcY)(}q-&R_g<_}EV!8hy zUcW$ZX6x&1+ksV68Lr#w>$j|PlM1w0=cmAP@9t1TYY-+7E#sskERyC$xQIee367Ox zPH-24j?JNRDlgx4m;1BMyJ3_2Fd=G9I6ci&(g6IIa#C5Z%q^WHanX|~mvT}`??Jq8 zfdM4nCmX0do1%BTqtc*MNA-fSq#labj88=3pX8<{O>{|hdGJ0U*99|PDTPkxN!nhT zg?iM`N{u_==CntB6s&lB+G%836s=Rbl)5i^2@TagcnhLr3^Mp%hj^|#jOYka7}+;L z_ViYIXHa4c1DgEH`huDNz?%^a=-n7)m{P2dt%bM5NQ^tzz%(bJF6hXTUP^>b

^DHL565Of>Y(qZ6{zwv_R zzQ9KvXNZtj9KpdW!IACKM6Mnln?-}Kr|_Z;RJuSq)&tGk-1(L5Hj1(eX$>=24t%)@ zh;m)+M&fq%t0cKM!u>N`?GM0nk68iX(FSk&M}9C}_Di{S8rkG;2J$!=Y@u2_>6b(2 zZ;!qH+$LH|i*vB>;+9v_ZpmMSP2B{6Tzcd}WMT9hg6Ww*&`Exw{h3eLQONwy%H%bc z2Obe5g7aV_80LiLXL;&d;j3qp<(xYjUK#G(niW;(ehEJXyAkc8bgVf=n6fo-f~?bl zr%PwLiP0o3t{talfpJ-)R<+~gI8#ZKP`&jI>ZtI-*38%}?_BWc!C<>0>RW>IZwMc5 zok0nLXX_N|MIo=TkosI$+L&!Sc*3OFf***U&FSDBt7Py9hXwgL z5_-5OA$ks^hz8s=uE6ZnOioZreq^Oz|ETtt|ktANn!xk?n3A{ zIC{!QaxO{?a%m`sf=5$!@`j=UGVS2qO{yU=&Rb{((TQP!Rhi2C32drrc&%fxlk{{* zBS=s1=ppUEjZ!=CjupIpeNvYmc!X}DeA}WK(@YBPnRdh~>kCaFj@f0Lvc3^e8HB9X zEBF*}laxyFtNqRn_ZMJTQ+Z_~Wn3@(ecKeo!x4qqq*e1MQ@+sMrc+ z8WQcE2SE)-9U>=qT99@`RZxedBU!NA$2_}Wt0eH|SE@^KY22V^U`!eql}T_DR3v*( z5aZdKNJ6xvItT<&WN}-bdCa$_ZYVi` zm!X4rA*lf#1}R`}QoF#NU_IY8KD)qZwLm>TdmjIuBBZN>tpvfeKu~bcb1hhflz{CP zctCaqYhEW?3eZ@z!rh0jhbg`CpBdv4Ff>|(FSkvcY3w})x2rt=_FgzQT41pBN-sSU zZk!404Da0w;}bg(!%?Eym(-;t`gAeDCtQ49H!XI6fCNN5cuGV=kdok*Xlb`pi`+8p z7W{NH%Y}(ced{z}ISOw#wg?lqm#N&|!caG_3r}v>+WzK!2@WhJ{^(s5s?}=j=_gA- zx=5D=Hp`$0>-%HXAAx&e%|%Y7T_v9Ps6@9X8*pFTPbMhWd3qxt|056NEQj*0KbXMB z70_c9JkUa-2wtXOEfHm1i07i8ch_8wEQZ87u;i&p0kzygMl9UYKr+>>|Q2 z+*M-VaYAy6agvjKZ^Mahf-K6kaIqjrajQf9JmQyuePKOS+cl5BfVaSd6bDX_(kdNv zI2Y(;J{ZOIfcTyGEZ$O!yKnZLfy58M;)TH=qUIPgUx*xua0<;__zW=+2p45zNRRpLoHmVx)K8GQ0ptqoG!zR{8G`hW@YelBgCYHLW0_=d7j9&zyd>8a+=$-z zrWsI>=!^*MB8EDGiiESQg-`|I7OE077FNADS@y&?`eQM|o)_XM!N21aJYyA3I2dp+|D}s7q75)XA1qTSNPM;jQqo1A`8)(%8`1?fg_~Ik-{lq5)N;n zi40U!W{tiF!h3ABvNCHTMF$%Q;P1wF)cwfj`INy5=2%W5j$~2_N9LPa~ zTT2o2knCNRTMV2a0S4L=E=GHe9GxjY#BgMWiJ_G8W{UCtXU!iy!pvQ4T^w`_XY{{1 zUJM;y@f7|?w--HA|D)S~gi^P<{qnzR9`guoy9_h`=25hPvcC4StCF%3jt0m4Kk;O9 zPJ1Fi*#sq(9hH(@%4wuT0ox{p**ZN!`tE|baG*S@W_YsswIZ%-2d4QK4rZb~C zy`F$5)+5~hQc6;|7~=u8r;5%@0XI%n8z7b=9NyUpmY1?_4;QcF`Ty1G9~hRvOLj?j z$wvw#XcwKKffoiaTk#4eU1)#nq7@70Uz!6`+kpjUkA)2v7h%15m6pzI$KlcxjxVt* zrNoZpAP4~tk*#}D=*u4A)Se_+I}yo*OMBAj_rdvMPn{xM6g;->R$)Q&1GWP-+c+uL zuXHK&E-W&W{Jd3kUd(^w>sNuJ;-+RC%k(-|Y%F$uwPBkx9JHL17JjD~a^Qkh zKMe^fEg5vaSGc_;NlE;758_B9ENjul8Brwg&y><2r}}7?UAG(f3t@XplI=0qTK80d z5V^}A$B($_oA>3)pycgtaKh69u?vnC0AnbHw3OARk#ts2!4Yo|iK}%3r7Lyu?rx77 z{JkRK_9N2Z70fgdvAzjU%%Xwesks)T$=FEe%X*veb^~qZiH9T7J}^$1>tU--LA$f?4o2#x zSoh=g>tNxIE#P>0|KlN}L9Z0N%SeBEb8EeUlega!vN)v77q;w8lHUm%wbCQJwzt%# z8$!RSNC<_slm~cXULnpHKAsWRW5dsy6<&xvfj#`Vvj!yw;FX0XfW&rxVDv>_aI_O# z#2G_i^!N$5%4_K!eb zRjLO;xj+r`R3WCfH{G9tqf}S=y5cIhO2Za ztW=NbbNfnHLLtKrLS;kaiqfP~C8T5EH&~E1VnnT;E8Md$iPf*tR+b20<9`#c1jozM z*X#eyK$W0OLD;kJ03G8N=Dwo0eR)yI^}(i()@*5C%7Z7wZ7}tAWJX!7z$$N0NF4I! z7ces9Kq^U|%OTwcR|A*lRt;~XY01Ny z;%iFfzd8<={c@gaX7IvL9p!IzhHYcS%J{H`RJne>YlKprKYs;ZY^7MFh3#PL(xb#n zV>#Cl%DqO(Sdo&Cjq<)J;B>8a>G?s-I0zrI1*REgh59|yFPwb&Y z=|i46k*ku*OX;O_NxgJ)>u@*~2stj;a+{1%gATkAkTkqslHdG{QF#fQh*A%O22S2A z1+S+ijPpAp`~dtxMx+W>Uiyh25z_W2F8HDH9&1F`%hqt`PJBRet#X1j3SzC2OfJkV z8Qv_D4Sy(;5C27W%u`YO0??m4ZfW|@=Zi~Lu}y#+S4^k_j$Z9QOwU`xyHp#aotK4Y z_G@ih;iPzv7l&rs$J^Xw?`rLk4%-*l**Hn5I8 z3o|4l7jx`n6_IP!hLqW-c!QPgI$hCY>fwWgFY41wIAZM9?=v ze!QZ`1~%}cP;tc=$#^wn6K{v~{UJ$gt%B%@kMKx*!}B)(o{1o3;~J*>oe(eFxaJTz zDbK}k@qy9a5UqIwVx!%yV3i~_Yn`u}TA{}Mct7;O`#+6#HR{PUWj z$vB~U31XMJY4On$(7cKQ_BTl$rHeR^hV3*B@R33=XGDqdW2D3Y!e^53Rcmi@9gxO_ z5Ndfcs0Ch6HW-jjHBcvfd?0OJ1@FTC{O3w~;6G?ab;<$GL}hF;^kRQXv@!G(9p&Wb z4~luBw6>JrL7)@T--*RVg7&ppw!OiJH4k@0P5Ne__{Mcss%1+f#WHUm81Rk}Oes%* zw`wy$BrW9Haq*rkK(#2bX^e&(1owH#$1E?kvb@3y=6^N}lw+W?XQGGIQIfuKi*H0J z(QE!PK>W3rYEBx52NFO>%2Xk19+3iVs2T8?nDPmq?Sd~63yDdK+ziC5Mb1LV9{_Nl zoQ(p=BfL2|9}L8af;?pAf;bT;zjq!gOYN6xrLdexka}nUbz!RX#&mrP@C!*f@ObvN zy+FoInrJad-2=~cQ{mz6L_1De7ug#Lx}?IV$%UVk&}39xqB0;o5z13ZIh7N#_-)Mv zC^m$4gPbJ=p=Nhx&cDN*$s5+YPs)a$0j&QExgUh4*ORFg!rQN>Qoj>Eetll-z_(;M zDgVhets((O2iKcTkZ$5)iYZ4Pe6z_R>Bh<$sC`owQ7js=DJ zZ?BS@p=v1-j=w!!xc+u-q!#q-16%N+6&LUk?It1b$X%)M`yI^)bin2({orwRnmP*g z4}hTB{e4i_apWsXDy(@YRsWYDrHkp+gVz5a5{pv`X0{{XI;}S!t7ymH#KxGLj4E&* z{#qg}mANCuSA)W-cXH(^VP3gN30L1qz4O^XSPNf*d=%aX!Y}yb!u#kaDJiHqiLfoz z0Y4P7DfCMWB}#{~rLhe4H*(uUMDr4Od*xin04Y({rV{T8WTZu>g+r_^AS`<~BT*Hs zZ|sJb9pqxnK`g|j5Pw1t-kn%CAyk<(O9^y)U1MK0Dw-Y`0yr$dU!iv{y7BGp=WdC zolAtUpglF7ARsxiae#ybjfwdDtI*J%R=&clG`Abyyc`|U$-D<{9pKba-%uZV{RBV$ zQGA2ePuA*yCK<<2mONJmIw}^}Pokx2HBiQ6(8|=8$b>&SK~tr92^Q9B?C&S{Mgx9w z&96h`_XfTVjsQ>MF9$_N?sh&BghomWzY@4d2258YF9V~gO!VRLkqGs}{>|0Fj7i!y zbEJ69KgA;b)qWRY>%RnDkfRfR*Y0p(NQvkJt(uKC_`#9jf>dOlY1Xy z%_Y)dJJl3I#$=aFmk2t`BzWGH;0n`4yTWx*t_U6DiUh4q6mTGnF3k0?hU`t7@ymXc zUCwFUu!yGXL!hIDpGy&kfK0*&N@H9v$ypXex~PH2w8bz=10@@_Jp=d1U+4zhLdl0e zps7rvk<0KutbrR>-ez=PoDV;~h0lSKR{Fnt!YQSb0SgZdkC(eD6KMiL%~U z>%EJjCQ|2@YGN&ruYGM<1N;X!BbxrzUe|Cp zP1r(xw;=B@QjB2gc*b`5yDiwh;?j5E@(X)URKf%o2*Z8_D|dy=4Zx%z_Bn2>ro&Tp z_EnAp*2rHuuwiLuho|nW&OHZSC7=Ro0CXqrmB!n^DjeT|CQ<__kX~Yp=}3h~Sxb$n z9ru>S4E|J^YW=(OFt|sVG}}6$Uz@%Y&!7G_dD)b60v^OAa_<7IGo)WQk4{4|P`z4d zqcQsYI%kyoFqD&K*M^|vX1j0t0U>j)4w3D@#M^N$6Y^by_wT`)^VNIWui%B7^UQrU z4e*d{VO&JhMd0ATZpxDPR<$u2&emky&`WDS=cVHDAQYg#&4(vMfLE)1wDwcTeJ7Or zaZNEQg52fsOGk0=d;(>FF#8nqm-N*x|gg(Wwu_8QVR zfoY{y)6=1HtV|cciJ168L)~!1KH`qpi`dsvxZfC7%9f@UKp|Ap&%{ja(o|9b zoQ2uLDSJ~SFUOD{RAA@A-gbiPPRM~rlG=gtseyRdO|(Hr^p|%lCqB*(T%bmnF^W;ZilYn;?mU z8ZHIFu2dl(E|sfboymI}IEQijKz)eGtc{BUpK;0g_-17nd2B&z>tU1b2-4c+@VyPV zMrN-AFNjNRU&aHGsZoi)98YZ@1x6`Yv#0$zuCAuq6x}r2yrA075e%?_rU{Ti!!;S# z10GaECw~gi+A8>V1SWH)YNER@MmpI0d%YxHb`w9AdFKL;5#vw-+p5zlVK;NMfD45Z z0dV0fz=flL3DX&&50p03%(QTu8Rf?9iQhA&hT|4-!3~n1>oTL9?KWI@lpw+xMRIfN z2o)CRQZ_T7vgqkhI>MZF>E}Bn&9!AT{Qgf*hs3cW{YBXQ$eWmgw6D8auF0KJa|d|W zWUmRr4-q^u ztzo4CxgYrI$gn~UzUMup`V9EWZdRA>CskwJ#FkBH1Gygv3rOyZTP}PHfo_mraL9*H z1mZ5~6Z%sSarcf6z%0utZnlT9{P`C4DDLP`?OA?JZ3E}yb0Y|nr$Ay3#nn;X?f%PU zIfL-@XK(S1KWPyFA3&keaj%rx}4%RUCYjscubZi#n%4(_*c4&Xkyc*kX4 zZoUi;mJoZ78)+B2;ThY9)f&ntm0X5p$$V1TJ{!(Hv;5k*_2IB{D%d&2{&IotJ$Q8EapOKk%%ddMp7ErZuknejsO%cST?W%TaF_GEaO zyrAsh0Fe*&4;%uI{Ue+1M>2C8Kbw;ik5hzF0ZUM%coCD-Y!0OYl0o|aHTEX(O%?0k z_?eTvYq|g}4JGM9Q>ao_3karZdq`TKEH0p+WwoGa5XGQq(uz_QH4xyGsuxhN7ZkNE zV5xu>MFrQkin3mUS7j+`%9fL~P5$2}ZN0w!-v9gg<@1@GGs~GXXO?GXp5;5u(yQU& z`UKCZbVvVT;U251OY#s!z)NKV15f$CI2V4aqv*5K3?fjHYWG?9#kmcZVS>!Q0g6dR zA>jKALvbyJ;*2id@I0=iT?S}-OwA}RVrUp3FX~B4oEw~21A()N5aq6);|tbd{I9mC zy@BBB;z}vY#bfmQO4rwNX%!ImzayFS??{FE-10{!*Gi75JSYILUT79rhF9$CB;GS5 zZWZ|)CJTHEA++3&n0Lc5izjzegEA>sK)h2{KHrkCg+?=9ZY2G=boF(D zT#400k^woId5@)41q-DPu3b|%vJ}fjdr4Ce!@tP z=#Gs5Wr+GuH{GYyk+QaYUe%T_Q^TBGF3PsZ+wx=JXR>vpJ-38S$1~%OK(nmYtiUWF zJ2kn8eRo@t@%V5IM8e4VR~w50d=ZOjbC^`bp5i>?&(bL0jxkGgK)xjl6o8V08Z;q= z4unGm!Vv{F*H;9wv$DU8(f~#Gvz8o;81C|PV;Zh;9tcVS?*c`dh-tnQt>Vz#??Dg;+GJFTGXvUXuucV5p&QzJ_4V}83=RVSH z667^1H%#bx`FdFmQYh$Nwq9MFV2^b#_7G9}HwY9Fsa}HAtCHEPkYfaa>Lpxbhcmt7 z`k#}gs=1^{adHN#tIo{6n^ly4Tvf9NjX_GP@l`w9c)pgJ24w2BwkRIVs3xf0>M6yC zxHcfw|4b7VPV?_#N*!;H0=w{Q+|kfhw3!v~I}kuzL0wZ!8vxyqfV9QsZDzTu&8+$w z;diCJ)B3HYxwyHMD~~THgJpa*i~R?5oZ4;b!_XGbaj!`2>q&<(bAf`Zq5`qD0@=W9SH~)H)7%`5VVc<5v|Az3(rzO6O zv8(Uu6W(xW_e2S9BrN8bunAo#JGj<@O)I+A2Kdr~ZY#0Rv!OV1l^zz zR=_{kRn&4BZ?~%>v98&Azx7K=Zh9X4QFS>Rlm)KB7Ja6$P1q`|2b&5OT($o^_i*te zCGqwYd;bCkOEac%NyYLeRbjIXQkI)T+G-vkMe{HU${T~e1^%gyx_uH03+(4xxEfZ@ zpmzCAm)bMKBD3EPDhL3oaM<<^xiHxhm&swdQ7kv9`W@ZfSZZNU8X8McJJ2h7BB_pE zF(?%8Da5lA@hsxQ&#neCWnw19_6zCi3Ot2j)xTSy?y6~YG} zd)Zx*ctjP|LNDV~eU9c^#sN}=D!5jf%2%1AnoXAR#S;+5dB4CWw$z&o5I&}oHOF~! zkUi_c5x}=YO?8BI1ek5>q*0kH3wyjlyeA!LWX@>sE=Q0FH(Ho&_O3_kNYxaYD|!{+ zP5RbRP4o?sbz{gE3?_S+0rA?I0;+#%YF&PLJ^{e*S z(~Dn1j4e{2p@M_2ac*XqEomuJ+p5a+hTG9WXLQ|aDKzAO$W7^*fo=&ZX+RC8O$&4T zD$UAyEoN>KR;pT)4T%oy4;!oG7f+5Ail=0QEkE2|=Pyenq0}&#wL~-<%ZsMeB4oHd z4}6~`;ZUxHWf;rT&>iO`V$GX>lO-}&?XBELvmWfk+{c>+OdDZgg9fz-16i5-Rp#mSH!u5ZZLGZ27s~xWA5!rbZIc1lz|M)>T)mn_-fy-00c=7Ig|3+IR;Jghq&};FC^>_e=a0_120F zQXcTt+4r9Evbht&$_9I3NF42r+~ zxtD)BiY2*se7ack40tx5g}Id}pJnp70k`?Hv50!&v+=k5SJ1_FaEqC%oYcAf>JD{# zg*p24`eLv;8Q)gH$yW9+RHVzmhq(1tw$iF&%NFP$VsraH8>8uFhC&439`|{2-|ieq zAn@NDU-7$_e4ZLf45|~S!u$%i`}3g#{+o26j$6#RjGkW3DrI)&^AU!LJw=iAz!Jzk zz1)u0Q{V=n03!~+uBiZDOkeKa}<4OwC@ z6C1i3j@ZdNM|LC35es^-Fb-OYagsalNJeI~_pC&MD~PQiP@&|q*WC*wcV>a*fx*rAa^N}GPnggMNa$4 z(--2I%6qCS@oiPT`@D)%c@K5T>ks(n;jMSW_idLFzC}|H_{$J78zG-{xs$$39cK6d? zraR_zL9PgmEt-l90q$}u_K2U>Q(dsOPf;HSS%tL7#d}P;SmW;}*OmOG0p)j=<5?T0 z&kAtuM^ww3pEfUR*5Ez@rX5Z^-xPj+w`6Xrlg!RTg>T>v3}pBU!@k0%-43Y?-mB2sT4&EGibHd&n`1J7U!#+KH8SrImA&YTc*59?~b|y9^dGhBLWTKtcl&7;2!@?zezF0D*(Ka&-RW55uoElB3r;L*Q|@Mo)C@;R{I=myh3?98dcav zeGD*^UP4R6cl!vY?;UGo;^}sNGnj34zx~YsMC;?j$SX<#lhZ%PpC{2iL@DsQL@A|+Rr$CGSY8S6s*faEpFQm_s9gp)0Kt4+oV zmh5Pg@v{5gZj*6bI)gyD_t~>u70Fs`##JY}^E%GD+?H>1^80k1-^Xx7h}t{H!y9L} zEWupHj5Avnhp)G`l;c{qi~cRUHux3V6s#yd>Wpx0fYk=wH@f$HJ8bmg&ZxF$*b1Gx zOm-vZN%veiNeUbX{1F&{&JNY)1z8p-efhjJIHM2_RZ=e?q;<`s@BJ^`w(6de7U{9b z9R0lc@+snt2cZg6DVQ#^xM7wkz|@vr-LxzhcPqPwV%cpeBeC+y&}Ot5Gv*&BU!Wsv z%H9dNcKa@4xZo6)2(A4zcVqL=h1Ef$AU8yMe+fV}@$?;%QA_dmt_8XU^|`QcGWR&uW?FkP0q< zU3y`1o?R#Og@i%fXtyWr%6n41Z!q?^xAQX9f3S4?56Y-Ix?Wn5_MBPv9S_#H+^7Z% zoi!_sQ7y@JKU$oG#?hKC3YrV1(yfyo?T0nzsen)6{;k#E_z>@AMn$t+zaLU7$VRXQ zAkFA*ozlIlrZzTM=Djpb;K~EOhoO3;f5`+eLH(NCa?b)B6(YQY)#wXQ*nAsTp@W_* zfy%G)Xn|0S*ne8M4S-1PfCBnLz0m3VHpuinD#;U{6;LPrgl&^$?K9Qu>`^!bKqb`K z%gUp?W4qjYzq>V?Mjt6a>I4@QAECv&h4U5#E3F`tkgSz)-4eEW+#~K0-w#__ZY_Rd znUxKWXoh`WV_sc4uqMJ9#Uk^r?Rw^1uRrAb1+{m*xf9k0+$Qw1zC#488+zwWwynLK zpJhoJ6Y@PS-G_B3)reeAb#wY$DOzG?-4x4Acgyz%Ls9XUs#0rwxyG(+j)VR{eS*TX zUfPwwduG8`n_zV(95p!1kN{sGGpen*mI*i~NSDidt3x+HK9PYtcW4MKy7ahv5scS7 z3-2|BtG$xzHy0VmghM7o_K=v2@N+KG4Ob4cxJHF^7$1hGqUnh3!>f*lxA4j1JGh?OfYx zg<^Yj`zkftSZ+8itz8%8%>Zlu1?d3}rX1x;mkKB~Hj^40<-s0~8;Q&RgX-)*X;0aV9VA@FsDrn)5#QXP7!1hN)jWt!UKgx1gKg z+PA~`f{mSAXNSeN*|K7_ULoW;Z_z)YU`rGR>y5?6a3TSgMe`C0@%pYA1z5Afm zvg|>N%J!f|X#*(^Z(j*Ex6?PEE9iTmgL5shV8^XxPTo+C9;6A%4UT(pqX4@8B3w5G z7oyv#(b?7o=b_ti19hf(23_8JDDcuF(#Isy>IV&4u*5?sn3};Efx0cx`TG8pW01;MPx0s`J#=Nch7T^xim%F z$4V~!vkTk^!cRyVeEqxU0L;UI8S>o)Zp9rJm9q5aht;JQZ<6(EQ^g2v%BaGNQSy-m z1s7vv^z68TA1-jK1{O@ZD33xetA4n^JO1?Y@XG)6$yd=UzO=i|-?nmTOG-%X1X;-O zGS&AN_ywO|;1*B{o&7cQ`{6%B58KFW zD|An^5VLu^-M#ZfR8eWMwLIQ##yZCw;S|o>O+`aba@9FthaHYg^_&ExMK_pGr1#m7 z(iCf&P!Qh?@F7mNnQ$W1b>HgMo_u%cL`wYW6E|5k?HL+U^V8TP+VUgZ#*?XO26Xfa zOy;BPkJqQvOXpp25s~c?)@io48)Ue}Tp4=(&%W1iF`=a4X51q*jtDM!TBom9AJwNseGc zR-qsXT*SsP_-gQ?InBmH^%BMZK!}(Tir+l9 zPP5ri7_*LIDa;y**=)7bU12E60d?JJ>QMB`Co1ERxu25K;|O}cH;Zas>P_PqREMD=7L zBbRfH@!Trpdh~_NpqY7LSH3-e*No!nIJ2D zcPFs(xXl2JAzvMQ3_f0KgzruGc=%*t-|O(nu(A8Oo~zz%{_;DrF#WBba~&{$@}07p zj^(J5VhnLmEag0rp6KS++9EjyxW%~5vGLUjwFRU(S9<(cs)tkO65NmcyCIfF`RuK% zS5?YA;>>Tb05f>*jru1JlOd`S>3uWk-ry;8&^$(?fXh5BRF9TsF&Bp9FR>Q*l!wG7}X(LL|}uz)tl;pqko!tesjP>>(0WW?@!0pF%R?LgEU)G2 ziKY>Y=Be6s0yIzT9ESFx`l|31X9m9hX?-!NZgK^wHR$LrZ)D*6om$3-u-XBwMBm% zr}m`+no`%8lUl}vi*)e6&x*azX1VYBX`o|a3vJ})d9uUlwswItlX|dTj?Y*NsEKTW z?$&e}gvl6Lx&Ao4^5q({`7~G4=;xdy)!@>H`}wb(i%404o)TVW0Ce<#)h7v~f=sJMG-Dq<%~15SVOWTOCeCarv(3%f0)D+joEFa+wz zG4#Q;tz(DBhC0hcP5spQ6n2!addA^Agn0Xm)XnBdNQy?FhDNu%0lDu+)EYjD+l8<1 z_A_Uc0|Bx&GuZrGPoV5?iNY00X{h>gfn$t}lufdZC=S)Ae=Y1+Z9RIu5@ACIPqzD&}ii7#`Pu?djH)*`zkL&-Xm_5Z-^%Ps)Q*5l4 zMx)&FaJe;aS#@brU#`*YxPH%jD|Aze9M@;O*C#BYHBL+QT&T}LCEwC%DA&B*#~u62 zI7e3Pzo8M-O=hH01#tBG3K3}E(-$IFo|cT*8BBe>8b&Ev7#&=NXkr#DCt%G5;QU!o zYEyI6jJ!~d;ZhA^%F<1ZdV8%|-hvOnIVs%fAvUHzBW-ts@P>t*bBlzQM2R)+E|RwZ z$x-Hb!3z=1B9MPS;bUi^H`zhTLib7U(C(vF{73 z5^bsF^!;7Qt`98(gncEv{eUHBOa7{)^67OhX-+|{|L*jp^5(3moe21y zQp8LR$4n2${43oJCjI1`R#iM=OQ6{pb97c+l*c87%viLCQ}UE@ivOSK7obSc-*su% z=?i)myH2?ydR@ehsC7H+k>2qga@P*~UQ7oQIx2J z_&!Lo>@tj9D&z4$1=QG;$G7(QTLMuo27KyVmqDQTBLSJKOxKysI#!p1Glak{e&Y94aLI7DC*;TEw4bSz2*`$Qf5QPbj^`9xpml_nMbC z%eJVXB9kiKgwAyp=~K4=uifeGN#92&Y7mXcwO@nj=qieYYKYohaX!Ie0!$Zg>m!N) z(c;6IAk`|7{{TD=sx3QYuSc*}cW?TBy0RK9iKDCBzAwu+l zIqJW;tz}#G7RgU@o_Y@zUMI3GA3&`_Nl!V#kL?4?F%U$Y*&gNW9vP{*M- zIpSn^Qnx|4je4Wl0@)Enb zIh@V~MYQg)88(w{iQQ3&EpOesM=aF4Wi_0gT3NQ9uR(v&&^^CChFYGBaV1n|3vtK6l|7lkDq(o;{L5|F1y!VdMSC# zz1&PJW;?@+zA2WcYo|<>mlMP)?|NB~U#ohIrKvU>%Y(l3kb<})wXX9qP^Sy|K5=im z)Nh76v_XntWYq0(!8yUeJhoYi<2d6Z%^kiG0p?Ov%U!20C~b2v{m5J+N@Q=1!RjgK z+aI*m$#x8d(S|0-iGu~%jvR~pOFF(q10jf;F4~aRhmnVGyQfGUn6sA%|+nl$1t!NkADCmkIAd$-;(n5 zNUMEI8mo=8$lIRgx%C(7XP{g`-*W-FQ&_Z~uw;2b53`BJ8S#y1=T19&;u}r(a5Wq% zphLRd`T@9tGX#TF7W)A-?=8;hmJ9V18}uFWgU{O{t6rhIUT?an(JaLoV=-*Ic}r`D z?^VB(EE?Pwels|_1u^3->b8SC-#(Se%Ewu{eEA);TwS2sZ~o;tyOD3+RHvz(^ed~z zQ%YKqv(023q4H1_xFmy0TSry(a!|4JE@1=6c+j`P&l!J46U_2M%Y7a3f)xLQ7i6#` zImUGPB0HMTNsxpn|Di3Pxo`lOCt)^ELMia*txC<&WUJLa7fP>p%95<60!?{^S$!&O zx3CGlASfMxG)vYVwqywU#^JTs@Y+;Aw~<~7Fy6nhIpttLb@^HX(g9+VIC^WAs2cH5 zNOL``n~qb(Ke4Q-rNsen|Jb4!Oog)Kj%%)!iuE$sUQRdnt*`Y@(r*?%0jiF|{Xxlq zCvQM8@6&h3EJdd%Afek!of0K?cj!?R0K}I*dC+l1FDVk5tB?(2Cp`mK&gbt8% zBou?ljt~lUq-3>Ljw`GLouqI@s~c!S946%>(vGBbur-9=(Hp=uVNP?BzNNY&N-Dj0 zJ_&PJcLtcKXqnR!u7fq9b34>PDWlz3if;h%4KJ6l6WiOOfD)0stpMsr1uAU$BThr2 z_EXW0lYKo2o}nImD(MK@I{K&7XEx%a=iBZnn0V#egk3<{aYL1+H=~QKOD$YgQr$vJ z)8ibd8m+6eE%NFpd@+E-^rR-Pc!lrKT$Xjn)8ga80Ai`_t=*dpFU~7YBpbf)8pi#~ zANqvpB`H-YbtNSyALoYjZQ*W6Y@X=;_75u?=}z{hI3RB+AWRkJ{R5}vZFiC-L3iIS z1bRE5#=O^n(~@a%KB;envIC?CP@2fP^`eT)YdH^b03+|w|IO($hcQGQOBg|ukW;qP&W(q#v$u4(U`vYj4Z`=Fu zdk^gTwLPAhCk0?CuEj|aoWfPMDxZ775&?!hkVZYHaa8bNP{%2O*H$&D7B$a(HcwDM zqu{kwm4M-J2~5u!BD^^P_t-1CxV%6lj#}8Zifo|^0Ufczeeacl%5TJ-+LH6zL5m(dMtL{6l4!vbPS`o6)OhPq1 zjcK&RlMR!KCY7QE5OH{F9warRk4C_HtN8*4=wV)~#-Xp{I; zyKC#JYOr;ZORCIVOL7T7<%A?yO6nmC*+wz?1j{2u70BP?ll;RY@UL6#~Ew?okm;tBK~(z5>5K8v7)LCFI)^93jYx zvjwQ>V4qwW3PQ!j4m;mmfDt@;ZQyv|_du1kUp&fijOqV?0?k5wE)YAQeVmbGSZzCG zyM#vh!rx|z%9EF^b~Z^$Q(*<2;wBf)xxc$MUUSUyU1=4N$$xYwUmu$ACHg(~g5ZvP zfW0gr*SzQ4cU>=Fd)-^E4`J`Rzr3EDvJK^WC}hBK3qn6E^D*xK1-igx)>vM4hpvxs zGX|tsG&Ty&R0Na@5^e`vtTt2i(~3F^ebYm_?V_ zcM?dg6|1cF(rPfrqQ*?e%%+_>&OQtBKc#mPp0gqkdX7lIYcTpq#Bp#=8KUw+zOJB3ScrS)z>p7Tj|=yp^=l%0|`hd&D>Gd{?CC#4y_`EBsxcud|0|nt;wVyWuhElLh zwwhLk*{99Dyz_A|CZ&G2KmJ)&*3q%g0BME0k3>NtCSrK`F_uFeS zT~vduNbIbi>tihr-7T1-00)B}DFfY76uzS?E&BOnW)FjadL>PRt3WnJj>SlW5R2CJ zG!yocl(ju1g=F}(aBXmJj6#A-xS2!>0P1n*ew=es-B^e|3k0spDpb~!v?@nZc}5e} z(#r6OIF@d|UzhnW;A7JGrGo<)&Ku=JB(GN2$?IOj!b$;S3){p@cgUa5vya^7fZ0)j z_fTP|AOyHhg}v_U_aSw&PE669fh&)IE}PsHfO#3+FOX!ItGn;-mQab2mBKZws@1ia z5#hL6X1`mgQY&0u%PA-_poFG5!oP*6Mw)*vp*Xp97(URJto4^VKCkuPCSJgtJ<}5* z6r=a$O7S*XHU7E0{y&v+^|zEaNORZFX3kj@d!j*Fy2csa)FnF2MXD2+JDtQrjSW;u zcr~aJrBfl@e5Awn1DtBEp1FXUjAbi32@pI&{8u+flOH9mX~*88h|>z}(qt$2E!3dA z2u`~yHn66HW<|akT^Yz-^6KfS^)NQh=j1L~H3=W+Ugo+h^^Mkj7KOJQ17a@(?~S;h z7bLD)p0Eoka_Z{p1F#?jN8o``g_sI*plY zieJR6SXH96Jp-BC@bY?TPF8=X9FOtYNi9gIue4UWKk3YJZ1ZQ?z(lTiG(1gfTb5cX zp5Sn*1bY%^{I)EIwku#FTbiEWfFg1?2JegKXt@_E1$fq=b#!=2*-ZkkS9z}nPhU`A z_v7%p{&UN|j z4a4pf3JNTI0=`JUwl3g1EtxR$DU1;a;r)4y0UuP6FygQJ2I9FcDK|`qOezN7ODBndV z-R^G+!(Mrmn{S5U7M5(n25t?U6OO1AQ7}@@b;3C&;g423q}tbe2CU(UF?A@0hNW=^s`_ibhoE-; zFur-8Kjga<<;$}p=8H2q_IHE-mhaSj!wcMZFVx* zeivYwGQ44PS4r_?3qI~OB5$nRTB58WLHyEAc{u)!E@8?}2+pQ=hJ5-?E5r#Q-^EU| z#RQ00XlVcuyBi`_<^8^Mqz(Eizd)}DX#?QO;(&!NZ-R}mUm}~&+m}B({8`Q*!wJJ1 z^H{238tC{J=d^o#K0)g8IRk#*wGNPF0Jpr?*#V8Rw2hClA&&8gdk}Fg9USJk>ps>I z4Z@sntANrywHX0kP>fiIBxt*lXCCr&nzbCzmaYC0T5AC*UNy4WC(e~2^=|Pc8M{Sx!g5kOLdQe4UkpKWyXl>!i{1pt2r6R_bSZ(94+t)sqwnYfZrRC=Qo!hP61pYq!}g zjU28x`DTi;Lw$Wy$F*xi3J>CBD^_+xIlFPAlssM8%-^VLR(NH~1P{yn>D;GRDwHvv zPp`1Pk(h|aO1i0Uf!jAYS11#9fZ}H3q%jt?yXf+1IYCb_5FYP73| zf%=$WK;pv?l#&Rft6jyXw#{TL?t z`LMgJmhvi@r&?U9WXWS|vF20?R-LAPoB8O;!4|#L2WX8sSeS6G29ylvB7Y z%_MXpXX4GH%l8Z8f!fQ(4rt~x@AuFM+u1Xk!b(iICopBAptQc5J&x%oVIBAk?yKNv zD|!FTIHR|Y87GO0RqQ>-)4#%|CM^0%=9{jt_@*lrI5Jqq$-K7&RaOgtSya#?XyYhM zjWZqghYy5a@+-ai5VE6zY}@0XjDs@_l4a*yjkiR~nRjV!$QK2&b5qwplv3VYUZQs1gdDEo+Lq48&wwRxPw%9!Xh=V=s zv651cZQ=kZnkaGusdEcj*Y;PNkU&sNR5!m-0(;m*5~&pr=dKVj_Q&v2X} zzoxj#yym&8$~8x-4zBqaAzPu?S&aX3{d4$VqCbNF`?cNh2RI~VY-JR*{G1o%%4&(X zc>yeT&9^Xk=n5uTjEzHAnsTe81YAv~Dya|m9$@N~gI6@)O*3tPpo4g!&U zID8PZ_xHWF12N#TEJB4C+9Rv3QY=l*fln~QM<+EhAS zz8SCyaRurEiq{@c1H8L1c;5sZ@epa?^-6$3a@E*>H?y!$jU&$INI(ry{dN>PZ^Va! z=g(=eOVVOiNW(!O8kS$#R|M)&vLhxC^gS(I_er>}3nNzI@ZNphoDU-U)NSbucRI_R z4*!MTioO=zb=3n*UyXi7eT{Yxv~xIt`%`d)u96E!3kNIQF~oV`)X0PSXcHV6UAsZoYRzM$T6VR6tm z)la_25QN-aA#krD*8;woF`%d=bG2-M{=3xGYuVayS@?orYh}iazHmMXx)1cdYa2Z3g43WjLe#wo}wEr{u z`awp~QR1*THY)i;Y5d=#<0$$U(GkZAtPe`v?43U|zkbj_(G4JS|M%>MQTi=nWIQuWv`M4}N@eZiiQ2}vL-<@;jabHZAGBdd$Ds~LoyG!3 zr`c1L^nBU%gZY%%ed6+XR-nr`aD=ALw1_g!o&nry1!^hY@F}bm`3|u)p52%#bPV=f z@tHc*jaPkV{iRo(D}MJ43GTKi%YKL2vzVH|M)L>!;_V6SeYQZ1PGqy#PVwGEHZgjG zpT-<=w=-15zC<=qb!tC(eiP3oGT->aC{!UF6?F6?Oiv$i>uWe@0RAa(RQSSaOg|mh zsc>{&{3#+V}k{hwh61LCjAZ20Xv0&xgS^BhB|zQUWSs;RV8 zy;Pb_aP$?I;9?Li;o1pDU$Px;H{4#hS~ws%}2 z(ii7o-A%b7cPbzip85cXuy?|6hY8^2$zd$3@{SJbg>K%P%G=mQ_bTruajA|aC#>>o z!>2tmyleS~+5^n{T*GD^yO$T5UT0xkTFNvRZX}%kYqTA%+fh3=<2n}30yhE91ZReu z3fHV;VM_b69@EcmsQou|?uLX>8zaPY2Qfphu`%Hj~Qx zXr7+`;u!oYH$}pLWkf?{oS> zsPU@2qeMeGOJ=LZap`OZAi<5;3@ci`m()DYS#42yr-|FrQIgNZP&!MG+#Q(rzV<-g z6sDgk-jKlx(wg>@>frPNO5@eYx4|r2-!Mg*Y%>^zoGO(!Lt3EAaoQjt z6Hge~V{D#yTQ)N!59$b>YpTZ{+H1famA(o~$ zyiav1c?C}17A|V_Wfi8&`Fee2;pK&T@y5YyH8c`-4Q5+LJ=2kC%R6A(qYz53o|wB4 z*`5e)n&h@_tupB<>tBPJI`4f8X>3SCDPBN|BjTDNY=-K@+!gS=BAy+>(xYvRExQj# zj;8Uf-6_W9uu&RY+C1yla&#-PG=~jfd&H$Vn8E%fK8wqM&0R)i4U!MXmlz|U%dWgSF**K#>y!! z-ombJU#9ftf|OHy4C24+ibKcfj*me61;p!n;+2Ts*QK#6>WSwOe;M&)2+Q;(1-A)F zY9Q}Xk2$uY+a?zFtl{+%^%7bmQIDZ@lIaV{Y?h0o0-%jdy(kfxXJ zFID49?&wm5xkYA9iK&3<1K$HnXQg+?e)Mj95pe}piO=51GMP(!??(2iVij`C6ITvJ z$R2UaP-b9u@!(K4l)c{2K9o&ktVAprhC%+NxNR6qXN}^g!`N-?MKNVKvksp61}G~s zsD`6Dq9PK7rEL!}qndF~3#&wR!;8aN2Fv^yBDYY5tLHI#ga#qmexHW}`!HYbO%i_` zfyMJX9Z7Wtp#Vg7ml!#cr9>LS0fh+IDh?aT`lYRaNs&P)LcmMFcURF^Y{-6ry&V;(<|Yz<~R(oc%bI)EM%W zVsX0(Ze>X3eJljNly{}*8wL7zOdL2GgxD>P8O^drUjkEz*8^<{YhY|#d(LQ(c}L^1 z(fHC6b5qb6iu_#8pk`T4#xY786A(9zX8PQ<()q=?WyU48GF5vTS9(?bkfJ?XZ^<(0%qgkr#y7ii0BBQ)>$jg2a|g%!`V4t z`4PlvG;;4_u=|h-KE%=Nsn70`BAONz&2E*oN69BN?y~5eTb&{OR!o6gmwA@GkK@?; z*<gSiva&1p`L4WL$g&A*>~2QyxT9jKdODH(*VQ@Lz* z60%KCsrdjn@LczKiy)mOJG*ppg|4+4PmQRe=%68UMB2s!jWLiTlzA#*kDo|h(NNO~<0?zl?ZCt%kRXXSazv$eXzFPztL z(T8O_SD%mODvG)EAF5nc&zLh>SBvd=?2*{n#atHfg=6B&`Rf}sbHqo+U>h)Ayf%g% zch~|Wu%;k66OAGwKtzyeG!s#xX^S|(#CM<-Th4=+^8U%V>6p^UCK9s5WnY2IaqE8| zfX@F=Qs#ar$@Slqelz9U$c_mvC~;nToX=2?)9G-1pjT4p$YM@^nDGYoFe!N ziXvNH>A2hp$csv2PYUu=oHg}_R^+X6*|ZnwNk;1XqT5Y=lc z^}u4#F1C)tX^ppwUE^54xy8ZJejPWnNO|HZ*lqy*UeCQ8^4$^+1v1;|%5bPG96B;M z3fPmZ-U>{}XOUJO4$bZf-3A4_D1<7)p{YR}P8zkd^$GEjo7upePXb%3&aUL-ri)C! zZ6!AFFm3JaEqJ9T&I41lz}Dx^KEcVwrkh#P;B8ot1i@+Q%%5jv8KqZkx3z%r52hIl z`htPGOJJG@Y-t5*eA9TAF?UW!(03^i@3HE3n7x33;*Fk@m;@1eHgIztXGjN=pc$Po z3c}CM3TC)|?uHBPrG=L2T77Qp&X~iiq3fkO9Q8Jr@f4JbOcqmdJmh=a^^F`X^tLO! zFN#l(XOBmxLZtO$XL9X}zsQ6{F?s?slotMyyFW>|`&Ye?yFX6&>Syv*oukzpt&Vhe zKyWg zqcS#cRT;mJGyDsa`vVORny^eryQfjNr_I+ATz|suBu>mSv++0vw9D5Rly49E z_5@V;KPWz828}g}ubNrE{6Z9)M$x3@;NlUHCf@ZK7M}j;GsYBRV)=t{a>P|+bx(gQ z0ntzMSCNr%m&9vkY&v`a@$Le^zI-fxUcicmZO#C14=KLJ^(wCS;zl~_0tik zDCFqRy}XrIU)`JzHEfn+bf8zv124tX`Js!~?oF8P`$9xQDT%k^c7ZD|qm;hNsKeITrsJGN4T9 znVaS^?(4bYlk?bM`30X4Y}h%Eost<`i1IIDTrE~he=UQ&rwp$(>{x`4kAKb9ofV}Y zbuZ(-ytiTaVm6w^U;WF2PcFlbacRS2OIT2rMlXH^sVP??jr-k9f9FGJqzAhj^Jiy6 z%>!(Sj9(NGl@GBOQ|Z&`vo9eRTDVZP^=4A^pjiJ9wtsdpc{v-!`#)%yx||(i(cAHY z!^kuPHDYftJc2cA96dw%)FSTZO7MZjX)D+*8lN3W5LMQ&c?EiR^tCR|dlR_e6ZIXw zCh_2-EJ2>nFEoqC9%Yk;-Lj8%xsWi06twcSo%i+cAZ1SN0U6m6a#{@*Rd7jgIyk*} zo1MLSS4YAbV$*=8Az%TuHO!$u14bp_7*on?c{iTpxUFchM2$H3F_sZCFF+;E4VQR9K%9*>nKT3Gem`g1lWYZk0ms^$^7FoY zq=Q8xs{qnkq6NqEF@i*@l00DJdCKT}^Lk7Em!}2=#KVuV)Tq>Ooay24doN?7#-9O~ z=y8_Ef8iHhkF(i>)Q@ymG*!BZR8dGMmd2N{vI&zG>-Edz`tv@wUyNVHE-MeA;TOEw z5b*>P7{456b3Dm*@;d2#2b;?Je}za&a2W38r-(da`r*pbUU*7e;$(NnP~7)$6#mQV zh98{lA*MNofbc`&v`RK2V*b>Cw3-|*~O z_A<{r4Vf=7nVel}$ab^$7_P@RFd1VR4W~D<`7&PffoR^$=E>EMg7sFmnI(x$n^_J! zFaEX}JAhs&Fbu0k*mmuxeLW^6lA;PO!4&7H(xPE1L_C7chD`h8dW;pi^8{ zgWZBr+*rd#n5LrJ6QhNN(Pb*Q%v{?<9_;>U05HjimMBdZ|F1Z)vxZ%AJPfU`rqMu0 z=u2PEanXIcud@=muM2yw%X_Ym_FP}Zl}Gx4iHxI^PxM^3^jx>~Twm|G?!lGPH}<^e z^X_m5fDyYhi0rv8PVV-v>A9Zmd0=4Ai+eNp`*lZBcY*yq=@0hn_V=di2S0^u>A9wd z^LHQwzurXuultET1)?+u@RIKA|IcUR@DXxKfZxQw+&_wYRd+D=Deg5r_XYUF+JAZY2Kb(--5DIjl@j#6kp0cy z8~)P3?sQKh!1;y=O_j7IK9xRY=%z-@th8}2k#DlCgZZk;BO_|+i?5f zzJ@yk*A6Ee#JE0iS#V?EO5ni8;~s>o7$nwgVJ93rXMm{TbMtRRiSeU?Q!OaqcHYq) z=br=*eiTQJYG>zNh*NXie`339mBOjH$nBip9d|JOzj5>orP+BO;*bcMu<&vH!h!TM z^6q>9s}fu{#)%Qz*o(rDMT|SJka6EW#<+jp!??)%8Mh4X2*O`@0M`|a`vq~m@x5V` zhSE~HUmk1t_cr#NoQ)J0zsZIuM`EhDx>T%rlYJxJyp!e0eZJg4gMBAk&v3iYFUGvf z?#A6n|G#YSG8XUi)k`wNQvi_T_0XF zLXOPaLk;JFM8tScP)ypzrt%Fzamg-rH@_y>@Wn26jOY7zHN5dYi(<@bHGENL z!<4-&M=rnayCKl<d(!F^|^GM@2rx%?p0M)4*V zo9JbFXT$k#!1+$vwr=ktG)&{&4@}(L844wH!#IW(%Wk-#na$zl5i$kW@M0@#X4*c? z&K*V<*@Rva8_RJG4}8y7@?!m)EUO{rM~D(*SUfjeP;xVQ`Or-qC*FLT-I|ejn0sI5 e!aQ~u6O@sg8XF-y%<(yF0rH~%KG%oO`~LujhHdQt diff --git a/firmware/tsp_stm/fts5cu56a_a52xq.bin b/firmware/tsp_stm/fts5cu56a_a52xq.bin new file mode 100755 index 0000000000000000000000000000000000000000..ed466fec472b03a839d42765c84ea44da4049040 GIT binary patch literal 122292 zcmagG3w%>W+CM&%d)l-;z0m@pob&=Iv=|Vzc-c+U_K=j8R@7auONyweE^8`^WxbFB zO2u0WxVETkL2<#oHANJJN>SVeFKYtS6-t-m?rMRqucut>N!sT8zH?e!ci;E_`RDVQ zb0%|r=9!u2HqV@!-n{8eN(i~qO~_9KLTWXHOvL}W2vaC!S;WB+!s!V)_8BEFC$W^V zpSyqm+6{XH-&|Nu$g=WPX^GD$3ej=oOVpZ&c5XmehOiD{3&MZ@?pZ;}{Rr&07x@n( zz6#-KgclKBL--@YUW7j*97Q;Va2RC=@E$_YK1@j>LOQ}^gy{&EAzX#<-@hLtZT|m} z{=;&$nx6;`q9~Wf{=+;qE@@;U`Q(K5;Avu6UB0IL%|U8BQ9&a_xHC)(5E`uwPWKIZ4@{QZrG8V|(2SY*uK z?>OW*P`+R1vv^q^$s_rsfK21Aw(oB|FpLuR{f-0f{fWq(x@&3|w~OmKC0oMEkgQ}$ zhhh_@4a006wQngygNk_TW?8*wWlw`#DGg3;km+VSJUY7J?j6r8|n>-0VjhFbEe4*1) zO4E6B^Fm3Nd(k*1^9^5VGWL|NI9KoH?Trb^Yw3LRId& z?uk-rjM}4aVGx2kzBFHDe*C?xkjf!a7BOFDvbtV}3oZzOh2I8Ew^ z{j0yEtN4sGzgeKucT_hCH5W_|8e^uREyONNl$tgQ;>wB(&-laJ=$@##APqAU@roQ-8?D%5WFGOW zqA7gRU^%_iSoHW_1uEkuso#$czB+}+*GU3hvN%8RK-M(|y4kPxU zUf1Igl%ZRdAG`JbE2|`ZLJ#k|&J&a$O)>?pbsPQHBAva9YC4R@!7Ag_o>rNV-Fr*0 zR-TMs*H9u5=~|gr=LYc5X>Mic+c^9GDhU|%J+s_37xvZ>-$aRv7NM<4qTiU^ldX>F zZnfMx(rwW9WVo+usB#c#f=optU()dJ7E{sUpW$BZ4+BKLD< zgRaNo@ieA}v^Lt{pRchE_gk?)_Gk%t)Ws36kt1{Or@ZAM%9kKKV5Pi(up8-&KJCXl zL(dUCLO0?Dye}9y@*d*cE}GwM)PyNdrJNC7;JOI$?+R4ae5W)x&)stc?<-whh~4r^ zoY$KlFHSb|}mbCjl|E>q!D;CyVAP*8>>0=IG>4P?ue%_5o7EZke2?9&NUu%rC4IGJt{$$rBiU_5WUoaPn^4x~57 zi>F*UWtH_euEC>UU~b63T6#z(9I(_>d}gHdma1FbG|0_mxN}Bxcw#dSPKj|gwl@Ts z@O+@%PYbFRe&xrA9@rXi_-Yo=^-o|dYniE7#_iUX_QQBAke93HEYrshV}+~>w?q^oIvR@2t1HC9>v zT_an~-L2+6q_7dhnw(0qA=$T0!*Nff{K5DTxv{-v2NOReLUjD=lIRpPDVm)R{&&UaAX;os1{RWm{`%Bw{KTN_<$!D=v*G zOZq&OMK5)2j$PO0ySYGT@yVWQieQ$z$O@T=V0{>4=Y2Z z_7vICLc6fk`p-_TsQ;)F^jKb_SI1>kD1X{-2uHr9iaP(?60=hXGuSmUze+hj`#ZcXYN05A^|JE*3P%zxk%noY{&5?;BFZqenp;6zpjq^|3U<&`NY$3n!|Ix46t_=M}fdn>B+F71E$6Z*TEj=(w^G^%EQ}eo&AkvG~^t(rA zRF(>MIm1uDYc&H-?Hrlw-YIuq>9oE!VA0N&GrDu_cb41a49B;VthddUQ%ctqYWS9U5XF@A0mYE*CdYdqH8_)FHO}@TZ_|a4iGXZ z^4)SE)j!{un~HUC_+9@lQm~Xa+GgP2`?19m(J4cQ_)@FBTwfGDs^@nNOHxxO;mgi- z+*wxH=F%RgeEGRasRq&Yot)R^(jC|EuJ7)d-O}XmD*f)}%iCPB<67Qz?pb=VA8liP zu8m(&bwxGdMZbM)@0+uwGo!?A_oan9ysrE$vOp&<$}tNJt`DLMA5N^5Vum&_4Jo(b~JVC)H}*QYPL%lk8t{XY}a z2o!uYTY7K!*cnqES2nTi;29IG5iiyF0yRX`_{v+M)(C%JV;gE%#%oyUmEYIcj~eZ$ zvCUhg)_CXp8qc6c!g!4YI_3KsZ=eQWuP-a8OIK_BI!5y}0-yqIegJin$Ll0ht>~?P z)(QCQc%ReCd&eXLsWeN_2}uH(W)?-GHar_VE>-FnSz%pfsyRDXcjH+-ITtyN6|$B+DnlPB zOOPV^l%WriW}$Z?ty@`&w05NJMOp&A3u$jFcO#9jXA%ZlrS~B1cZ#>3Nm4%KZ0q;4 zIa|C&U{rpBbRlX4^*J9+5}G_Zq)jkCUw7aPr>~K66DCMqaWaka9nKP$Ei82s+XQJ} zycF{2;N`*L5kg~ zm{wR9R(#$&L27{%_9J1=rTLHX&O)cDY%2Po=wtnOA5Wu?dBUCF_mPM`<_UGIj|<(a zF7+`_xC?#kjjysQohz(AsW{q)nOQtRS`7J5saexO_+-d2MIjp0gA1>K?5AzT*v(Z! z`ye&lhyS`^L+#X9Am+6a#MX7%z?svff5q&fAF29M0qr(sMKVLSVolg2ZVKtdwIN+m za#&wv2`3jNg!Qcsc@pQ4vxsRD=_GbtFBP=VT8a4@vD9@-MM59;CDI7~rNo+s3p;6x zt&_AE+L~ROzCD8^B`IuZ^SGK_6Hc&y<}j;k6Yj>iYT^^o5;bRtWV%kAr>0e4tiN%| z$1UPm>9LYm$F;42oV6|*sk46Bztmb@vEk@4>n_*2qkU&cnz7?%a8s!!RjM7w%W6UI zCP9WB4KPE4E5(!8>)D{aB%mm4|Bqqm4PeP9>W2+Z;Aq%uMU1TLEEIU)=vLq;@;#0+ zBN-vSNE0@QPlPn$Lm_>!C7e<`hM&p*pZFo0TU2`qKTXva8y{;uL@6Yz6W#nVS$Ic+3H#-D(lKS8q8LGzm+ zRS&=9A$*2pNio&Az0KZ3-UDZn$$>K_gaqQQGvU95m?NUWc&y!^Kjt-PkBNGEj5la{ zcu@PQcst}D9+d8RSs7AB8HZ!-Ub`3i#Nx3&CJ!?zo;|F^Gjmup-T>QDzFc#mdC6m* z$3bg1M^DNB43X)NR{zp%95AN-!a@d`OsCVEgw+C{UlPqA+g+qjFLb!b34=h3GLM-C z%IWN=#yTcb^+JOQ$y{o)%ha1YzT1q^!n4FY<19^Bn$ve=`(!42jg?Eb1zjm8Lb8Q! zcO~{UO(cb;K4Say455|64MHwt`6TSzRaWk@w|g1He}!&5K{^(LF0q)6?6Y?nH<%zy z6#}3n$`vI4QlFp74(B}Va9wzrwE{LkUReCqQmeD*e~uFV)~|}s#LKV(c_LjQ2ZT)N zO+^#Tly)erXPu47I5#T>!DRD+Qr)2Fga^oyvMixgxB?h5N3R}_>7ui0P8*Hk5}!-3 z2_5p^984!49o=p;_WWnss(9Dw_!|GNW=K#z^!H(W8g_za*2J)G*5t4rApug9j@YVL z?!V$B*YI0r%b6hkD>^2beH`T*y`fa;pFBQ_NK+Z1NJOCX^}0gLC_XWj3lb~`?gw}&oH>)2N+y1j=>pGW)0JYQ>DV_ zm~3n8aCDjYzxSJYv0tO&^ly-J2WvKUWJ+7&99Beoyh%7&mC?FhAa>qogpBoMYDTLv z^s15?{HvQ2gK|INBro_5*P1RZjdDTW*C9WqmU$LsK64v_Jg*NPhJDeQ*lp`B$(GhL z{Vd2@`IYhkr0DB}fG;sf`5y@>cyetWPLsE75X>r(6O6@Te{eY~9rN(9h;liEHF6Fw!l%&Ko)VSUoIt2d>U0&ChSXBU=E11m6HttO{+_AL?_g0Tk&-E zK}MJ$Sz}!;dSahTd$P-A>f7fsoOu0Wyi}P7Yh@eFU4K(r+tWY2eCOH8uMZe0=~?6= zh2(_CwccetNs4JNw0-ejm4>v)t5WBcuXk}LNf8CbA>tC0GM_wthE%vz`jaL7Ij$>9 zDoYd3u+}uB$KxV1$caU+7SNm@mfIO$3yJ73YUYZGJ5x8OMNM3jOCL#ZOO;LhA}hr+ zwGB^#l&Fa?8rA|0pc&i*?c8{&zvtunG7D?xMkXC7-#z-ruG7k^OgktN%;KLwqi?)v znf04a59Bom(G61F%dYdiY)`V)w;ii*$*2yixNdZf05gOwYkQV-zmjiD#``|S-s%or z1rEs8q8+Q~mbgKf>rNBrR5P96(t2dP(kkl&ySg4(xeAn<=~i-A3sckeBsbkd zhIP^Id32x~cKB7v2hNb(`QIrIr3)PL%>x>`$eJKiN1tr(w!lVce)W+Xr@lH}POUW| zw$=4buhZ(RIMGY^X~9JCbOJ|qOc>L{u6=~^%qGM1E+!Y$2y7H1qj5JW2>7N4e~k90 zx9Nv<5*={T{FbS0rp<_vykJ5rQgacgx%JaCnmWYDr)P9LsQb3QGkJ58cQ9`GYW!b6 zSpT-ofwPI^dT@+{@TW3q|MU#~$)&PH`f=1Kn#Uwc^MML_lurMd$oR^8z0y4^!+cEo=7%XLi|-!=_dvtGoX7jJLGji$yk4zSIpJT1b>NANJ02d^4U_Lq$^O+OzsTLm->2QS?L`p|<5bC#9+u?UnR^F*!_N zUnfMcP90&X^B)e#)&OgvUTxv-_-R1Bz)c!CHm}kF zoP``>bF{cgD0R0A+^fU~N$2WuTC1A_8Vjk+%gMS9P3x_ovl+FF!e)X}5Zl0HSWQ9k zZX2g~8$lVnpaHD18+#MQgcIE0suaUXgSZQ6>|~FM{pFb76AX#sklL2)38Rq@nNLeju;JLjgaY1 z6lM!#N~UzJV)xZt2*ASEL<7JB1unbez(ZuVz-D3LD5GFam^V|H<;@!z%VU^#j#55J zr4LMQ`RC&}4;ZHpOrH1-K^gj=VP2R6OOG_hRP(Y?$$-hTa+Ik%7IJ`tdBZ;za)i1yIlJK54+2`VXTx=mb0>ptr?=i z%ErLtE(ZH0c_&M%Cn^Nu@WaeYl4iU3r_?z z&@_(gg%wuktZ$B#!*o6#eRQQ#Z3c4I`-O6+32 zG0bChbh=o#8yrX*P7ryF@wUdCRE9%riMqzLtjw?eyk7tEgNlj$$AWaM(A+N5= zdEq~L$W`?J(Ssg6Xb3G3>vBS@b>fx(qxA%6eysJ)X#KjlK9sy?RZho7${;AhVM$4>5ZOn4<3Ri0QnrK>W zmn-390xZ^)H;M4&N#t+<&XKmM@LiBKfklwa*So&##TruOYmyJDY}zbj2?eky9oi%a zee$&(MPkChS41xvHMG$X(?}*)Zg?`ZM~b~qAY*6nd!h+swJYaDp+H+RrO!tcd-4gV z_5DszK+{;-Uq(<;&ft<;c|56@DC@jSt;?+YT;X1)pz`HcliOxTGdT04tvIq)rDi)h z;dC{*PM;iW_lT_m3!^y4W4hmYPj)i*{V`*|_^o{l7A0c)Ncoj+H zVBz9Qh)DQLFf1LRVsfkDCN_?$iuZeO7B;heHlGxbJ^uO-1|P`nl&3c7){K!Ss=qd70tJ4@qQxOJrKYFI*~ z__4?|VY@)4Ck;9hf3*iv^E<4s4GYi*Pkh|v$K?{#G-02#0Z&>xiO^|m4<<*n+fmwx zezqnJ~U*S6RK6ecF3U9@&Dn$uyyqBwYN$R|O1b zNyp^&`cmRV>@yi>DMn>z#mJL;#%1$&_{f6%y0Cq@WG^wMYHF>AD%$MI=xrZJ)Qpum5@UNdQT!M=3D~31 zM|;WlxgW&FR@q0`v-yBRT1*NyV6CrF*LrJ!PP<=v%sd73;?jCI#OOJVD;@U9o3V;t zj=3vzC%yn5ER~$F5J4y?Z>wpx|()p}fZV)b1HJ(jIi4O=1k5A89Im&@laj;~WE)@eCPP6D^k zsVgJgnRq*Y*Rxf;ANA0(THO04uwFnd*0sKmDh~)L4g?8-hX!IynoKsz6L^>Ds zuB;9H#j^yhXTn?H6VKLq=WH+HpGQSl0ofYXkBB&_t!v~_`%tv5(Tn%ND8JH#lkY!| z(&8EDZ3cRq5nd}3uQK#S%&X>2R`#fx=OG$^)fim7*ct{WjnU%EP~$SxaD+LVSWl!6 zqhh@mbL{WZ@^AF(`Pci6{8re>G@=gnIs?XVw7+%FZ`@P}%0u>`e1Az$ZZJ*BZjqxU z^t&jXRK8t3W$*6HE;sp=p%-IL+mU`q7Y(2Fn{1zAzS!B~3)L2ZyH0DL9?p>ZN9=VO z($^zo|A%KXV26DUTHB@(U)?iqlg;VKl%5;eUZ)!jknKyH*3$^~JDpbFonhxmiU(X98b*s@JyP{-<2VKptkq^$X}roJPyk`Fr%z=KkDI1=o0gk(j^bWTW^E> z;_MI3JGCG9Cx^86k=#jsgQ&f4gZ#Q}lAq;nvz6U9$Re}G^T*WSBPzVEs`f4c7=Vn0`7C|!N#IE6uIAZn zRb8cA;c>Y6*<6XEvUCZt(Yn$)2I-;F3>DJ*ZD&Zkp(|%dyW)up7oT-A{NeO)n{gs^ z_5>vva#bVf3!^Q}e)Q-n%GW~9%4izbw=fbNH17|gdGodF9$tLb|7hO&N8W(M+SA{6==EbHS8u61!NC;aFJtB7?JbX;Hq!9u(3FwwMv9zeBR=(A zG*WXRPYNy&ud}tk@2vDbZKyN|*RWaU^1fT8EAqUzW9kR3BhS_2hVY&9$)NvSX zYOij_v#-w;OGzSfC&nhK5TzrJgTHo-6e!IQDb*qGtvE{7C5cYD>f)+Djt*&KDS%^i zXf%4dlY<{G%GNOqeKO+ie}=7RgiQ#o2rnbFBdmE<8hIUW3BhjSh+~(_O?@u6#q6iGjWuNb2Q${ODV9qAte_nMzxHj(;x*;r0B+LxzsW)jd%Tc z3R%Qb$Rdq5;ZllPhOjc@Efcjbg1!zi*KM@zs(Ry(nj1}JPUBlWhdqbfUN7TN6VskD zR;Fx{XLB2@m1Xttz`)t46nb~7ss-(HpOP=ECe!skrqAfhDArZRNR=(*o*+4gPs!qj zKP>!1)oEiE=-e~PX#>SBxks_96D~9JiKDkXFa& z^fzIx3>eaSP8&GXsaD{XQ~8SL4R@OKv)D_X+`Mg-MYFfz-%n#nl5^xWP}GBGjCw%9 z)h%i8ZCTRpF#~f&+!95C`op=(qiKh+TAdQ7+B!0%6iPS}h1 zI-KOzJXKQy8vWdq!^X$MW3>90;q`9P+^t{Hb4t$N%Ct^{-5+UoKUv+pkTjl>!!1R^ z&7tFGjFd`KhROc7qtI|6`#N(RfnPwQbObK;Yiy6ZEfNQ6^%&k3c$=SY;%y9f@SuiY zwiqh6v2(8p(yG|K3y{teexYzVyx0coXTxj!cLS7~JDLCZ4xE@L!S2P`zlE;T+=5yt zJNsUg>Yj)EEd!SEl3P&Hf|9u?InU>HL&}&!8n?hY%i173q+9+D!ExV>0>;GO;z6$t zD%s<+@15Zz8;Ix-q4jXEgWLE`D?XLn!@DtdPi@_hGwRO*T; zLz{4_&N)ZF=DGsl@3-FoJz@goN3h?SA1|3m`3s242vXLVuJIOV0P`h(8$RUBpZxE5 zGy3pP1a|)YB=T1yl*5O-3ZW0-QIwmh=g15M%_Pbj5aMWCM!6A$uTa;&OK=O-x<+Qd zUS&NDpMY|Yx%n`-Zdqke-eSGpAC!&8Zle}=k$x*vX^E^aS{ybM-4SLrI!FLKnMh0H z@STN?e5|Y{Or#UAXaJw6;gQw!ERWH6jNKua<-u(U+#;|@U&M=`WlZxLBtFi{tm8hy z-qqw1QJ0(Rg(r9J5qOE^`dpGp!~PqMt6_UTY_Nf%+t{rb(I)Ar&C6imaawO8yf@oT z;VG+$82njogP+>;n76hO-q#wc0pDXB>8H^o@e-saKpIsH((gx2dx-Q`Slu6ob=?mM z7$+V37;c$N!SI{_-0eo3@iHgyS&9HJC7xkyH6&$5#n`?l;Y8IFKu6NTW4+%xGBWgF z{FmTtwleA+f!&YI{UvC)JzUoVY{iUY6K4_9kvNq~hBY=u=Zd22`AYOY4}}L}5y_A` zaT@_Ly7V@DvX`nSr)+*0&UxS*`VvMFP`to{d5;z{92+Z}C)VPuw(D<0pK!|E2|M@Z#;g$*u9vZoQ9O1k)dOwSD|*PWTFg%AFKXBz#wJwc|Yp;cRAbz3-vzu|DV@UCg&S)=#CUKwB7IACuG7z8HS=zz-QEQaaXh4DYou zB8|k0oMW}wvjvzvirk;ZzUU{#e~n}SA9_2*2}UGx1$-R+&WZhOy|6XH_Vg;ePh;({ z^>Z)c%MgBna6iI>2#p9ngr6g{Bm545t+{xm+R*|72HHLr|XRdfj+Fk|zbUR`Dd{KbB)1&(TR*ou=rYNAfNN zmM4iX>rbh?`4urM~@}4S(vfcsW4wKI6)zpSzi- z2kW7nJ8X1^k9iUsH8Tssx|!Orer8VCFw+X2R#E$z8}~nae{mapE38AIPiubMtmr58 z=x1h!lLhMigKK8r;p$n9zYbAvp~XS2Icv+U-k!Op*ARQ#C@G!*e{Rw8@yll zr@@L~_n+yf-v0j7d?M|QInV0!1a#Gjxu?=Wg~MJx7}J%FX*7U!K0L^#r%U(1dbU;B zzCaIaYRCH%eS2Wlr-l~!xukAmb{PH`(3LX6`@k8y^<2+3NFAG2Z>tQ*B#1jq!L-H= z2GV2jZ>>ygP7AS}K&P`h^Cix>85)j$ye93Lk8_BMvqsb6vxod9w7U-QYp}Xrj1keu z^9?xO>UpDKt(+V@fxd$BT>ADva4Lj&1k_1<-EBlDq! z%rH_4-$sGHNM1~rl;MXKuB>KvUKr%iQ6M*Hj@cWXMs@~Vtk58lieRZTl@Y{>zmHXn z$7X|OF`BOr7lPtzdYm{>z-@~iKCJbwI6NWs`m)n1Ww|=WH`L=~n8KRwZ8&3?(!=Ur zW!r$&*CKmtY4H5hhZj{Y0@qB)-P%CJ_J-dqZ;|Jwb_}#&WbJHZxt)lU$kyeBpd8`@ z*L!HI$y@6oc#hq$VRsd(VL6F`J}}B)!l_c=J@{|sCrh>%@SR^T==gN0BTib`KVB%o z&YxQy$T8XreN$9lYMn75Bg;C8w8+moGsPD98D|=v%}y%)O4iyf5k?K4cAAj(oKuhI z^G?X&`9!4ob|0Mv9t1N#=}DNT41J(byE#(m%iuACoEfQy__Z!_L?^t3=Un)7GAmGS zwY@RHo^;%{Ft^IlXlsO*YB&`55uvIa?G>MaOUV*W9kS55xM3s@-LC-WJM9RlWfF^RlNO+3%M|p<( zbm@bxb4-`^U+f=Lb!z|oZ^z%@R#L*qHy&nxH#O?)M%5e6)Cj)=@D+Antsj(8V^73+ zb7I(oJ^F>BwV#XhsSrHv{HDJ)f1rO({uxF`=AV)u+;~d9ea*>gCaw1_bZQypy8K4%hFLqMUzhBHN38PuDqh84z>tjH{M0Zzu`pmg{sr9P#$mm{;{O;W#n*-jVjqm| zsQ#nJ-e~gw0psREM7mj(iM|}R15>ZTqJOD1CP6JhYr60s&;2&l4lmfL3VS{)Q+qP} zJnj=nF53%b*ca@bJNgpvi#rjL4Vc(q=La1^TyKSlM z@w%OjrjQnS8iYlvl>KA}+xxld&Nu077S5JIe860vJXvJ#yW}kO&CBU{D?`zd6!t$q zU8;jzm1KkGD!0I6@h*V9NTZfmIO=gT&w+I5$!M8pex+w+s^8Et=1BoAQh;-F_*<+R zF<^%|3kp^JZA@;SIW9L3VsBO8hTI^0K^Q$@v|kx&Q^sijpn*}*q@MN$rmy_p^syd% zhJRp;O6Iu@-aK%Cwtq67i}PJTpald!8qo=pAmeQ*I|K?X8pttc!6`W-K&Q_QjjiO3 zpk#A;W{I;!Mo$=BV00u5z2G3;jGkPQJs6!~vIvt&F3Bl`QX(Op(IZA%m>k1s(j|J+ ze+?l_Ur~l~6n)t{50*pPVmt^w*@~mV2Wt6ng9tvS;X5Ehgq8y)XvT9>-%d)p_LN^BODj+Y$IF02jF&Xjjq|L=hC%eQyJ0pskNkiJ{b5Q2XT_JW? zVM=(KNOAK)Q>+i$Aj9k;T2Y5H^`QJNwDf2sYdlvQ)*@Y2y7@j0< z8BEY&p$wcFn#IFYHH9o?FC5%;f`*4}7c`W~SY0XvyFo#ep$_yKEC8(G72 zcby*V;k3WW!^85r1$vO*IYx(`RlVUG;cHBdj7#kdjBzU3^ROqy->@*$ND7O?O@`ba zf3*|RhaFsphKVgx%#e&&9T}1tccBkKqW{Ne`FFgROs=``%ZA|aAa1R_esPskDba=* z)n)z{_C`lT2JS)+`PrRGsq|-_4C%J_5W^kc3~6PY-B$gzjC-y&Mx{vp0T~{QSQEXm z8h5#RKEnQei#v1Qmnk?P2PmtzTF#Jejt z-@j{OHGu>)hV?AaWMj`{@LpSp;d$)r(F9&jr1Qh@cnN2M7TZItJhl*a7Rfic*FwTE zx&vtK|F~MCs{=PN`MsV? zxv#};MI85uW4Bc4A*bPt7h|Kq8ISrms5SlbuOENcsP7uJ4gY*bi>nq^LgLfd`7oJY zRjmW}*4ypS1#gL511MULA{R*_E2`7p7z)n5}!-gNgKmo(U$^=G3aoXT$WNRf!`ZKdpHjxXB z4cDLTejwFD!#Z9gx}aGw{DKGL1Vhh9``-t*GvKB%(O>8>@q_(lm5+n#jY|ehw`Fr3 zMqu;)9{%q~VCw*Lov&L#^R)hQzf!rzf6$-i>y&5S@I-(;Kg9F08!DP&)y0j~kl2dV z^kOyr8l;=W3)RJsUxA!w)tu*%rd`3x>6<#`Yi@X==^ND47n>uUvK@KsiS#>n!8h-T zrVaAtH$1WYgXJ6Kxi{z^WX})r%(_AU&<45mhKh&Q;yowt{fEjPY=ep0ViL@l4i>cyfBncIKUJ4szQ&Jqf|)*_t;^0&K2NB}n3E zVk>F%`ptN@`xEdK{U?~@y_gg}7$)`y!lYnF<(t9|;kQEWw6sQw?@GK}`3LC8n^vd$ z8icy@M%_;N`A@f2IuTFFC;R6_Q~mc;82Z+^bbTdiKIpdDV-3LMBfqbMP*$(DgM7Uerao1m-jSZ7=h?NDVVz?d0%Axh07feA(ILG9Kl@sSchu+L~PS zXmTMrP70o^eA2ycVQM4wKk26VSA;VB4SROV8>Y~}T)$adEyKtjnhi=tn^QwOW3@*%x+aM*-%7hM28iM0-4>&imNC4=$y24+oXc8Y+JechxG zlIL1^wSZK|0{6m&JEJe~%~z7giOm$+8J%P!yhXe+%5`r74mZl1x;@rsD(J}yL5J@! zba!sYxoI`v(%Taw*X_|u>xWs->+l_bb)&OH?@Dm#@J%~QKzTSooE$FLskdi_?c!Ql z9|UYcWoY@RURpj(3;xxAnRt!60G0-0fcU!iFgZhtW{CVs-yVklgh)XHZoQ1->f^Xk zWW8!58PZZvBedL5tWpI_4@);k_>}~h03H`7N&9v)JoNP6(4XlhEB*7+J#Ksj1>YO8 z(Ol|Z-H@BBX=2|+xyV*psj13{ox}S`K~R2)H@ll1ob>#th8Wz1!p&h?FkO{VmqRx7 zm5kAeFF-3CuvNcZMEMBP*W=CfUS{iFG==ih5Z2*;Gs0Q~rVBHh8LpDvZyd&)HQb+%xmSQrGUa`MrK+Xf=FO?}iNf zw~?9ZZZ|P2dKkR=LZG(Y%XGTGscZCRSTjm-`W+v7c~obcB2qQJGHSAAi3gzf#D|JU zI9sY%3QFs=C5cV&>>FF%Iq>uBl#lll!(UNK9to)JrN_hl8X?*3cnkja-zm$P4x%$^ z238a8Stl{|7#B=#)X&tx&ZY?`%pkqNPRG6sso>oVNq~^bXf&hEuoi%mk3z@Cc|LrP z7|mx?&>%$JZSdHI@1DAEg7OVXJ8<`9iHN;{_jNvtQuu z!M(!k112pe>W0anVW2d5LYq-sB=dnEMN_f<50<-RzWZs{#gk4eP7raYhWQrUfo~Sw zQlaU4zw>D!bHnw};nxcXIx|{W8L2n375g?Z5kA^kt--R4&51G1Adj1xwYc$-AVCbbn@%^<5Xc?^7=rL{@j>aP-_Xnd4ch?|OH#FMAX*iEd+2wlJX&(&PLF zA?Qjz$@cnP$k|fGi6l2s z)D5_dbK!aWPE_M%_Z;%&H1A{ZwA~Ckdt1&LoV3z`h`*HEq^_@q;w=M}iBPpO=t!y0yrk$PHKaeT2vs3V%{m{Lv# zO0^#A&S-`sq0m}>;iz4`E&Dg9#f37|(>vfl7{YDbWMPYX zdbrG*QGDSjYLG3HJLDO6>~LkA=#U*#wz#;y4tdU$HuxDvREQ!?LAfZY*`+`6*QTGs zi-y7p@~=%^K?0{%YFav8f*)hDpym7IM+0e6e54AR1xfh5Jhz?tPRV@BO+t&jJV|55 z7ie^r4K4D|k_^E;xFJmJ6Hd0t2Hp*C`IQmo8TxPp=Q>lGR=tGde|OJ8(~7IKUc}*s9zPexUTGT1W4{7co6Ejt)ODZtcuTs?{McTa|_1De~7|5u7*HpJygz?*hE zZe>vOcHGKn#f=A3s2O;B3K*IoJ|jG}vTY9_o#M{H`j0T}a${WbI08%pe+H#V?#qB^ z3m}4K3;*A)}qc!_hUE2_o(MJ0x$MJ-?RFsNZ1n_j%qN%t$c%Lh@t9 z??w&WdY9&eE}z;gEqkIS;BqV0L@1izux#E498zAt+0tZb+W{z@XEmlV%)c~>l|Vjq z=Ls}7X-7s0^SR}u2V#fZ42Kyd?7Y}CsRQ(Y`9@CdecyvM>(7{H6Zd<%+)Y>s?|Cxj z{a^TFyMOr$5#g6WD)osxJ!%tKvKZ?XwUC)%CLJY zyiGQ+v;OV@lCBvj(aNZ6Pv=4=kh>#l=b#c#&# z%{Q@TGKJi7K)8G}Mx4?4ey3@JGiTsP3%tPV1gA0mn5LDJu8ge~Ho{(%h`1wWxJ(<_ z8zt>~qd6pDv#G7cm438LWO=zL_Y}&pI@a-WIVcA&f3=+B_+z+F1PF@XbS2^b`%}e> zDroO&m+?f4{B)AHY-w%~lm-x!Q1sy>bFeF#&6!&v&GoS~zdI$5<{EY+ln^mT9K-wD z(Rcc&}uw+n7$zS~}8y2i8T#yyn1d zRi|X{mW*rPifXto17jyD&jGh-Ju`*3qB>r8@hx!U=SOStb)c^Te6u59x3RPgiNtou zmRiGQ2@%xA-Z%82Hmp>aO>s{0;;UBr)@m2Z{P0H z;;v4%dh&Oup835Ws@o*LW~ucz!yL4(SnqI|P{UDHD6qRQ(qe{z=k|?j2W5X*_{oAMVByL}$`=WfeTQpS5nAhlpPu>!_(5DeX@?Ohov>%eYQ192(rNXb>Ga8u( z`zw`&jW{ci5{5T>xLnhUR=2e+yM(~+=LPqRm7I;mM`D{iWV&fZW-GZExcPCB;x_Ds zNxPlY^>BDOpV`(}Mh61sHrziYQ}y;`N7h!i$+we2P_PYFd{^{~wLO(&n*( z4$I|yQd??yQcKN+SRKB+b{u)BZSpUvY9oQ|k(K?fpYo}}LLaN$BJW2_^f+vlL62a* zDEd<*e2-SW0p4wKmNDu<`Q#v4CRz9n3^@+Gv?UDE1XH;#NbzmJj2-4d+{?i?F=qJo zL?>~b@&}eC+|KWmuj08$%`R;p?j>7EXJQbr*S5)b1dZYh*hYyhUCLB+W$aG-j*5%; zmS$^|B<^?YCJ~d`uL)lzsIK^1?>q9#R$c4mRdcGFTyuLTw^>@7U5=Bft<+u| zp5rEu<3>(+w#WQ9E!0OY!Rs0%w7}2WJM&?r!K1rm`nJoa(1_NYx>fnkR6hXf-s6XJyWbTbl?LIKZ>JG<|Yy zH*AnaZ^E~1W%ZkKS~s|TB4)u%ckY9vl^=dV)&%zA>joXsUwzUMZM~MsU(8ay`59=I z7PdRHC#A%m8PRsuRnR`P9E3E6w<%~4H9NH1iS#JGxfhhT7ri1|xHlnlydsW$o{N0S^~{_TG7u+ zMctI}f2LnQYVNqFU$;FS{1c}bqyOmt&wRtE5%c-4$ad)1XCm;WmNf!)Vy$9>=fUJ| z`9fvscc$4KPDDP6ABXk-3am?0$?Ph9;0eE_1eCG%!v_oeU)2>fv^Tm#@SQ7 z&%?%O8z0*S%dFleLlZxbZ&_)j&lQpni3(pu2;7v1@1W4!7oy}5P)RQ@_Q)4L(!{82 zJ!?wI4%bM_Ep*s2LI$2m*etI+@Vh~sW#6DaCGp5+`S$K#$s0fiHDA1oZ+6^S&Ynxl zJ=W)4Cr|uJ-iFg>dg5uE(vDHzH}GHE8@Bd-#be=u2-@fCJ9#qDz1 z;_h_m#`vh)iMtc&QcXMtO(o#KcL7qn&uCJ)|08A+&fx@)vzG%@~n_dh&LS0FxfV~5=w+HPojEt`6|dR*k4}xu zImq;hVsi+dz80p1SY`SN__pO>MbZfapk)8|4St4uta_2o)E>Jnr&q1D%8Hrqep&wg z`=6XIwd||tJ4y3ua`w6AM(E5r5wvD>S|5dPM3H!B4*n(dcCMG{|D){dnAhfA@O~Y@esG5LHdgy7vy!C5}dV5jDV zL8};0Zp;)1&02$Q{)xFBW0SGFy6M~f*H%MTTfzh9!UyZ}pz>4url$1a^-5VN7`rEP zI;{9QOJNnIaP|sFr=bl|>E4Yz>7z?PB}zl7gL-{CkmWbxH(f4J=L*rh{OSSVXiTgL zmM4a8PaH#v1+!;iDc$QFoF$B{hAvwk_)6s7MvleE!E>p=6-$)9{}p5Jf5kIAgCEa+ zi{o!`goYN}Xd&>XU=gNs0Mq&Zl^aqIb=|Onr~EV45uytYoRduO3LNhTeYjMjHi)kZ zoA$(QW3ckIDmR-s*uLA1GK>IZ1M3WU{Ux9Ms;<5}PM9{j#S%1qZrcu>uB9mD_GuFB@m<`*_qhC<3UYWg*5 z`n5=>6cPWgb!~)y)%C88_Z@}pmcu39PydhM|2UWUK&w*Ws(fGrj@M-!dBAzU-PU|R z$&LO{&5EWkG)mHCI`TIo8V0hyQuf(040(unhl)-(Z=0Xnt^L8 z8GV^9)+NY%A3wgP`?ZFjp=3f@G70~a zbrnm?X|AR3@~oEzzA`urKK-+;*z;@}2kM`~MFkUaL(F~+W-IakB)1eI6+Cu`bz{80 z#z=BlTK%lcTQ%4Z*${pEbm%w_&xvI+ND=B_8$3BveNIz+RV>HfQpNfzBtLcy4v9_Y z2ky2HU3XSR`W?AbAO%`%$?SU0dAc9F`IXG7!}GJTDm;#TeFkK#tc&D~ z7t_IeEXFftNFS5ws1;tKJiO&0XOXE*l(L+8U5iMvm@Y&d3^5`I>vd{Y@2xerEwK3R zeei(t*frdAuJ?fQ_%&_HqdyYj!gs&Y-LzmjY^+~(rk-v*^r~}Y;KrI|P1knc0Ld|% zdM@0iR9&-7H+X^-806AeR$W;v%kctMby(RrmRa(;wgD50bY_X#?Lh}w+Up0DK+k6n z+1qzXgp)iE-*aV%vwgP8_AnRXtk(MkXwRM*y$-UFXeZ&vh%zVr@0pzn$MoIuL(u$A zMkxkb1scQFhgo2z+ioA*A^4`c56nuBZjV_XCcO+7nC#gIj_<&1d%?{TH`s_B!9zd= z+!9RcXP|G>Sx?lH)@=M|q%|8~|6tla6Le-DeU&-h7|4VUZL9}W&R02Gfd0%7bt)!R zcV<+zW~v@-rAAKmRN5n3?9`T)y)l~z1GZkOrXnOhgy{?SiI-TCqc6c zLA(BfBk3%Nrd`r=m~c)yZ=!2MIPS)g^c~~mu_qkRuYTZW^4NB}?RV8^lkImk{L{jq z!oTl<73=7Go`Q$%cBSmFJ25miQ2-8dZ5TZjIP5mt$Dn7r-Mi5<`k4F>^$ZIfM9-uI zcF+EUWGw?VG#aDV1&1`+0k)_w#HQ zd!Kq9Um!0fV75M?-M8Y_nIsQOi&P;6}4Y`vt9u1?T*f&T^mcQ&T9 zb8?YvkddW)<;qw@0J z_5WB^bRUCE>W=ys>S@#u)!yM*Hh*KV6}=8`$+`MQ@Y;Lu3wc-VL@b0|;IrkG0jU$Z zx2?*O1;piC+baN%{FNAFOab_>tfsYfe$Arl#LzA9v*YyFhpNa>K<7ID6X<$OCf6$O-TOdY7(OfF(gN z=FL2FrW9+Kw)X^h0KH4wI}2Arm|3l>bU`on_`^hH=S_gFi0QF*x3mJy0)Er-oLIKm zQ)L=Jd3Vwq+9l9M*by&GXkF?0qN1NrXSgqkRQwp z%&)>!Gow8y%^{j&&G?bdkmeTo&CvWJy91h!G#81dc%>le(?NSx+Oxu<(RQSfZ(=2B zz3ZDEtRW5J`o=tH5T7g;KtQ)aVn=IiGxo8Kq&-pdn!-n$eyZj@dNFTTBx@q18Nl8r z+mxRGcfVe>3uZP`^w|+Bbn#|d>E?Av^)-3E{YqW={&V_ADtm9K`7wM`^L#s$jGmLIACN>Z<+uNvLESt)}u#F`BoC;m;ABw@3YQ*Fd^@(!W!h>;u32mA;%6wL_NhR&1T~X=VMSF_6 zn76g~PTFd&u>!Uw(8$=glJ$_SVkPOOiMOP&(tsb0hrNq9E51vu-DR4uve}*Y8j?{kr&-+c0B@LfvfE#iw&j0NA zBl#~z9NLF0f9VC~E#0R4!@gBJ@x-rdnO*qysr%sL9cO2Cc%R+3e8IgLkB{6&_Sryg z)5cBbYrp=YNgG*;b{8qxz~R}5m>`RR1oZjGL^`;0Hlg zn&l`5?{JUn^9+@5$Uk=+n5GBWwk(S9vnnn6$_2g34|XirIlmav?;JT8yDKXgd+qk$ z&~7jsj6Ht)OHEgX+SGjz*BgxeI%_LD5V#T@v}E@dWK;%}Hwp}0<&|T*o~Zd$nQ?Ty z|25FwfO1d4rrgJ?sgw-=CJztk(U!lHCFZaG{$eCeo91uBetY9Wx}O@}fpa?3W1rRj zx94#MSrh-O2xDgdp?GLp&3A?17~=STlw|1tvf6=wKU@rP0+mHI1UfOv|nQmqt<-M*nlnkWl#;~=oG zfnK&m>TqPsrijRw#xlK_$$WW?pY|rSfUBM5T~6rA*|TXbw&T~B@#7?}wITmY?2})0 z4)mi;_G92(+*x1`F&k@7jb01XM6%diF8Fn|Cs_O2`w1&C1D1tJcS6YD_1KY(FIbQLSU~~p%5n;L?8n9y9Hm`Z0gv5SUV#(;a|_nv zKWf$TpR_93S)AOejKMz5Y^zXrYJc%mEZ3JEsn-L?gX}$fNvHV$;e-^!wuEpT_-w@S z5w|Im$^={&Dp_^QENNJaCf7gf9O_$aA-|O=6>ZM1`Wg>K4;-msh2!xhifv{Y&yHb{ zUuasDNg4EPk&@x?Sn}0ppH!cvoKqHU$Fr?U5l0A$``xWdiOoE#*%y6RFX^If-BEb6 zMGtDFU%7v^AWPzXzK5R((l=)zo&8nV*~50}f&e_laToTH*ZO_4eY~#}yS+_7FEmFd zUwB5f#a|9?Xl!`jgPq-9J{aiU*W~YRhwQ=Ey&M1Q)c>=(zg$xsvfIrz!o0o?*284G zmzN-We7)e;W}GNl$Edu zpS4Lh?!;}d)g2!K&ju-o2GnnP)`yT|f3;>&cQ9rYRG!il^4SZZ143WFktl{G$C^F* zZXcvTKX&s?17B&l#L%8$P6mFSqgJYxLQ=@L6gJ+O(SHrQFTPQ=vhQK8*c+}!Up9v3 zNQ-LAe6x^aVE81cOKtURaD>CDeGp3u)j8ch+Z%AA=*idm*!$m_+@Zz4euwaSc=pTb}gU#KR~HV zL&fX3$qssk^#~%KAu7kB1u@@4vqEKPr60CbqK(GKE%7Vdk73WrHS$G2lc%}o;7gSH zpj`paxptVd>VhwRE?DDdCV5b@gDWz5C&Dj81VSvdk6($9JZm$o?hj#+^dT_9#KwF# z{eB=5|3Le>rJx7IdlLO%NE3;tz>jD~BYtG}`Y+HIqBSJTnugzJ$bS|;1wa2Tj?Kl9 zXiF!4EtG~|4xT%OBk?F3aiqQEB>al;6B{MOcoG|{(3Xooe-(OoHN1y*oT-F~HvLF551SW)N!XFZvuxR#1mWkUTFyeW7+VCiwPa|zkJ z#`_CP?*(4oIg&GDMUT41RkKOs=8u5~uibPNc(<$3A7;a1>_oSt1Ww+rSdNrSLPW^X zfp)reWwCLMFF|iSS6XaYUUja2nWd)cU;W#a{EP;By$hCGg9b#f0*@@|>FqX9`$-2s zMDq|d^Bm9+GA5WC>ly>zu-9B)S0AVk*PEBuE!TVh*TWC$1%5C`NAHk#>jeL;e!Rs9%5m5BzKW@A^mlJfzMA{@eX8`oF+=u@F*h3oOW2u;3Q_ zFT&HH^%G9{>-^C}f5sZdN`&4|s`ce&|00Z}-Wu~kOB0(W_6mbJqSasTzuB)!3g-_f z***FhkY#Hi{nUzRRb6P0|8M?R{Vyomo{;}r|2zJda27qptQ1#lpZ`mL&>!``?N?9} z{1~SiPyTv-L8Go0We7QbVbIKO^7DQt%0Ez3d{vJBCVwAV5UN?)m;*~-C(glR&3k>p zCd64_lZt1iM#C{ysKdTRpU!&!*}@gvC2=pi5v^fd4EP>RzR=4phd`BVmCzdZ&*_2% z7ugX_qH#6y7~KOignQ@u=K%JL{Bd{GZihATEXa5DGgwGJBQ^TV7~)H)TJCK6riD!~N<3+huFMOU$%Rd~gz)wbUCX=9 z64biUIl0d`z37y&s6eK+Th+Et=+jHaDcmWeJxAuHvH$T@y84u<&v=FLlyQ=`;DU(~xh1Q*m({`Y*Sg&0I zual{ZtQU<Wt6OM zu9god4(MDpCoZKoj=JAj;Vx@3&-%YhQ7%8ddGv!&z5BDf$i8g?>@LMq^n7WEhc619 z>ET}jT2`b*)SbkTgu3)aK=DvVl}Z!gflmnLY4D+-kwrek3^H9&uYo;-0r;g4%Ng(- zP7DQrZJrixi*-P(!^016ud-%QsSk$LTj)zV&icLHjX#&^J|B$&?RsT+k^0>IKtH6G zh=W#MEKUuR_pu(9^0)3!mfMiP-3)HZ)#0V`6QMI0{37u2lU@$`7;vml&) zKD9Ke<-{4cbp8v*{(5mdU{IR&V^lKC*re_ERd_*hxF#l>1`J@z(B42 z`sJdgBFN`gKIh?TM#wwNaz6IPbZ53at9RLwxA(zP(UWs>ZXv z6Hmx1ODgkx??#xZ_UpejIlnbO_*8|i@3to&$*=wT%$ncjt&Es-S^XGIraL9d^;8Ad zcgvFvB;TFFOH+YVWyLpsYlO$qf_O)>rNg-^BYIBT*YTt$|9{3U%56e~j`aS2-{Jap zC!aT51s@K2x_!hB?V{T&wDVpy>JecZ*KP`Kg)D6BJVYDF6e7PvtOP!3D-wB(1wrdI ztutbi&0=d1_NhAj7nwGoeOcT$04o$0%^&tlo23=1PBsUgU1>NM_pxZ^uqZk5LKV~c zic#}3@n*FJ9pJBY-IeCIBO31Eh?Z&k9Ju>ryc27MD3Sk+Da>^U?QAD(7F~QtARdcu z$|bHLHVCUiD<^R~`3US8+JTF2FtkI8x-&J{0V$01h#cV; z`#AZBN||+BWwncsb2p5IMaLdk+dmE8cVKY)Af499J|SRTfw&af&K25#j5D2vysP&k z=8P3Nn6A^u2V|THTJH)?pc6T?8tYy9z~hL5L-8xH7C-Ivae+?c;kDKkBGA1*`bwh# zigtkVZC3Mb9!=e4Xni>@OftrWdebgexGyfOK_rT?DRJS5M$*Sc^YQUgg`uNv{K|^j zvkxpUz=-?dh^gbqJ9nuw+flexTYh2%_L{CjU@?KBR~Eh;=dU)#`FfONejdktaefVp z^JW22H&WvKQIuNHQ20_@oQ9P5Af1S_(ykngztu0qweu<}4DGPaX~PTzp3Jf zz(381=8WX*JPJOS{)_&cjwih7!7m8;u@=6IZJQ!#220sh*kS)U!38OfkXkDOt(2d+%EJyCe6U2bw<_T* z5w?mC)YE(h7TMrwfenUvye;=ZX=149f+olgtvRSs-#-Lyg9|{~2b0q6%7eBvNh~pk zH6__$T}fs*1?OocX<>7TDXcHa2pdY$!={qdaE7e4uRx?c#JowQ$Xf7G6gN+eQgivv zn~5~lkK+_%5E|?h9>l83g-yWNpf$VE-}zLjf6bw4pUY?PG2iiAeXavDlxIiAksgHh z1au_4O=jJwtmR;LumA`O*!t$T#Ap<=q#Lgt2c~dwWW(KO!3ct6$7zaPr zbUAtNtT5R7k26ysy0TNzKi)mDQ-}p;-9q+_1=}#p}n}ZBC>i!#G4auGWmiR$f-x|d>Po@cD zsPS=0%HM!lj&+W_;|(Pe+3FR@`oUzvM(8nf258TXJKLI}r`@dYn zurA6uSHk+Y38ne9J1`b`d{r&5?2N_f;q>AXAPtlvZZ&X;5hwjo+`p2pqeF@g_#(;v z?*;WrXOH4rr>Hqd+BQ8wWeIBJ4;T2e`550fgj0&E!{%aR_(%VK((tIVjx(#z?ZBCL z|LyV)#R;$CtT5H{lF~%j_U0Ym8&}w`opR(-eVmN{AxJ!$93jfF^qpjjh6K7xDOOoj z%XZ3(<#8x^9oO^@l~3{_y?ST9Y=G{P@-|+)!<{g}zd6Pkux5iuf|kye7rqp*-+!mzgSe zBAP(5>{a-YOoQardZhgoM=IHaQK-fmek!2c3O)NR*2i;$iW3$xd`Swdhi|h2ITKPA zO>ae%<2rGNvo_ANT|6gj7ub?a5+%Q~uKpVLtOX3xKB6K4K10rkP8x=MPQ_GG1fmb? zIM5xun>L&V-ElxcD#pjRDs@-~>TocNMKa8kFTcA@{T8X86#Mqv6;NW7lW%ouPPHlP zGPsCY%>^km=tN!(S7hnVZZd@?G(u`nXn_|sn-U9W;Qx78z{19Li7+V#@j=ec(F}7# z*E-FZB{eRVoFyy8EA_qGl!sPwSBkwGln3jxnwI5fHF_+buC^GvcC+(uebGaoqQ5Tb z3aLLS^7lBYg;vC(QSe1UIc~3Me_*L8YJ&luj@if{HEMBdw4z7tT&#lq8)bv|+5aVXSV-J*M1}(Wcyns~@XZ-i$qWA5)fQ?Dk;i z*K$m0$e{I8=xtM0V3uZ`q@%;Kk*=@?uE-Fkh^J;_9R?14LXgz|!!ZCxKwa>6y-qRon@D z46;B`=LRU?g9(kS!Fy>2|H)X?sz&xYB{)EL%2bZv4{`d&Ck2NV@@%AV(Q6UsGnqy> zmy`yK!r?OChoBZ1d$Dr!o8U=OqLqn8KV8qjHQ}AkO_buA-oy{>#ZtF_O-?t-&tDua z^%8d>qMtSBZ@sz$AB&#K4v&>*wY;D#VVSbkH&a=1Wk4BARGd2kIa{@Bb_*A0R%R&n zbMistn&nU0XTYw!w!)(WPmA@<>+pQ4ux4=Q-WIHpupa1ye^8LtF5Nl*jR&#D{8?RN zG+1Nq!y4mr=^}oSdRi>bLW?rcqIAdvQnA*gU}P9DGIVI22BT$JFMO$+w8cN_m9cv` zpe)9U%@Bvs#M!F#6M)_syIT@o;Xn@)Lsua(>V#_UWpS_&J-sqU)JFhi6*0E-a=S`# z(LysXkMoeWkZboYKZMfu;>}2-fOF8lH_VG%z>--Nf)sXh7iudFDz93D%FE`ls_dWW z0@2mg_z{gIn=UhcL}$OjkNm0qIL?xDq?G6*32HA&H-}IH{3%Z1+MMuEy?d0Z%XI^L z5uOO9@G!obyF2+tqeIIQu%~ByM{B61n}@dsu)*3p>yvH1k!jo8lnxu`Gr-fCb7|W- z@4c2CSS9wsn?-u#((W~i$d_%~bl8D*CJ^)7ju=ZQC z^G1B1#{ZA+b6xNMU@xOBnbQldk}!r#_3+A0ah9XkQ+lz=G4f47q#?v%%jvd}WhanZ z=*x(}=A$v7$9Faq3;5GZi*x;dQ+o(L8VU>*0 z*4Szbt&2hDGkvUZ4!uXNepviA!+BNsK3hHBqnUV_36Oq*j7D8} zhgy%&Pm#&FXka*b{NZr=f8|WMm{WH#=flH0z(sS2O46XVpwrpYNBzq{*R~KJqBEY@ zJbyEE30B{%klt^IniNAcS1AI0jQ*1PMGJJORHQQnDYxPN+s)vEX+HVk*}$UzRHMGJ zD35ry#No5R3djc%LlvXRV`hSo-?A~retyB`Bbl|;YsQ`^Nq33ruF;~8F~8C=zph5# z&Okqx_0okanj#KHdenLvL`T{52rPjJ`L?g8+Yq+}Z zo7|r$8!_~WQt*ai)PFN1KqZhV5T6!Qjwu`KltUNGwzKHrw`uikCL1uHyNm_MPuqv5 zEEiIu1wi`}2j_F8xX#9P9%3lkCRlNmimPly?t|8Vv!W#$T$|$1HCej{#q^Y3b{PDz z=9uDVsE=&~rqVv?3efFO6u*^^Xaw9TMLVtKmAG#;gts|$rw%&xr(3Fofi|TDT2nqu zPrdXxhw;|JNMe5=R?Q5#Dj^{@{8%TV_>6{FCid-gAS()lxc!LgtEf7UPw^5;13 zaJxF=u+6q%MY#c9Zi}9aYjv!Mi)&Z%aZSc8E;}T6=4g1>F0lf0^pC^e)G&Kq?&B5Q z@dzxsFh`nOpEMWnKl|hiz0nyrdH<3%eQ6j`=MXc_Xf@>eu}8)#p?)`!;>cZ0JLN%S z&wC6$Zda?4T3F{gI_T$r=sG%%MHYL7h-|htAU#{Yo9%SFjtu&_YS$6mTjb?&PriN4 zp#w1qrB(k|4V6f9Urb{Gaj=dF*z;>JdfVcdD-3H7e0MkE>^<1NXGl4c4r`$%(xYAN zE3dpkDfO0Bk{%Os&}eJ?yTQAB=G+pW!?h@vi*p?0PmP$>&;d4BD=;R%i+28G4cSN4 ziV|dws9THCDOw%5^u7+)CVEOgdBuw>bU^8cw1{oO8q5risxhZhqCbskSZdgTwylUY zxdQQXQENS2Esr&-SG??&jw$9qXZ=D*jj{tDDLMFA@UsTEqSV1`13wv3q?;h&d!PlL z3?^ZhGzW9uTFRbIi9P|FYt#DLv;K#$%0l<=4kMlt{4{yH?q&U;9=yp9W4f2=8W=?i z>r9FMAjZRDTlcbNAKRW1T@=&o(C*Of(C@fZ$Innlw!qu-B}m)VI+n$fWls#_I|c4^ zUo5>eC0g`fWv8R;^2=ox#0;uUFIhYsgZ%5mGs!azr)pMep9r!^eBq_~4LgiGQg&$G zFi}h9X`}^i&7egP+Qhb9k{vP}w52U2Iwl4mFe7qQSJm)#x?6fxhJ<&)JstXjHG=~R zB-=Ztci&I>0{x(uV}V?05BRE-=pR)p>SSs_Nfqgi9$%wNDf3Xjc*_iGS-(~Ovt7wn z6{Ahl&^J`?#r{FPe^97Bw*RX=hm}k1$n{W5yr99C+R>u6BO7&6E0TAp9Y0mlkyd`W z9nDH=@D`E^)}~7a&*q>;>V?#eP1+_=`?x}k52J2}F3BG`(^)%sq+?jXKl(}!IXPEd z8|4k)fzglcur#qrqi&3XfQVK%DhDx^H62`mBUck(0p6~Cc@|o5t^~Lp-m_C z)aV8+Y=NY|s#@|uLrwi)M6@s+$!P14r^=9!2E+^P(Trgv84TTT=01f?JHn~(4f~>YF;*|GY~cSp>2(BO+b#VrfBx1 zbQq&+5;Whawf}Bkd(A@Bt{a@js9k!D>1I6nY_fG;v`(r~Tlb`!?Vu8=Wt+d>vK`d2 zM`3M5tzv4c&W$8n#T6vm#M>{m$n(7xnb4xE5`R#8@kyW!X|`*(>$dZS`t648#_cKF zF(bF5ws~6!gUG0rgtmKY7GorNReD0T)+AQAHLvgm8B!_cs4+T|`c98$+*-`wzvLHst9P+sy68=-9-<|EP&k zKe%Z&YB4Wa8*jI$^%$dEf@-i`uHootM)2)_%sP0z`?~p@&pa19T%qSXmT7McDJf!Z zsKMrTL3<$gD!L^zJ$^l3P46d2@BJYmHHZNd_j;}Ah}(B z{oX+cVFTi&(H5qoXPYf5`~p zY{*_(s~ox3dJ%G}eV`4*+hEmV-g>NHxYJp0KJ*Br`N?Nx^;y#hal4PH|EI$L7GpQS z2ZR9sN|OJbH+t!8|Ak9u@@VHKpTG0*V!sAFIC-uJ_9@^YE15BRF!9JCqDv$*j~=XS zS=hoA?aeFfV$-<(N$_3!iSx()8=Y_%kH-pgk$!G4dW? znHRa?dvr3(p#AO>@ICq{v|4L2W_Ksk$AS#oRv4pVf<__4!4G&>?^V(Q8YXn4O%p^8xPz@QguS@&huyAxS)Ry&Xyx_K6fxJ)pFSa`O+)kUW9r z1nmic!R96}62br&cBe-_7_B|~hx!=K-WyfiNsItUqY+bPCn8g<85te=Bai|=!!D9y zgr6s**;<|SM9@$6qbtE_jjo6HXvCcoojz)|eU0Ok(WjLqc&pA0WD%S?n3J*veCbK_ zc2LQmoEb5ur+*?wj&WS1f}4RxK$ z^12n+GvCB^C`&O;<9oP>hcmU7DZGViEmy|FYR<#2tSndfxwlu2uLK^D8Q3E&n%2cFD=U{* zW*{ZkT&j$>vWSOq9i_;ZQJKtXF>5*;Eg6;GNSsXM;H)ny4LuDu>@>-bBKo4ToHgVhKD+XbRF#KB-?~`A&V?P4MVcVxN`J=MdX3DN z==)%quPaqDdk(j-NiV@pAxHjGeiv{kkgi2~{JJ&&(Qb6*W$PRR+3PXoYm#W zp11>hHlWdi;^=67GyxCjuxVKQPWW0cTAvga-2QhJ;)i3A1{jXnn_Vkdtqn;uC* zHV*o*o23FrmTL^+yC$wT0sGbgnlwY&C)r_jWHzOte_)Fk_~J}D{JS5_Z-MLw)?7e< za^-h8Y>o^U7v{Qn6>0F#{dY^tLA40$b0MsZ@Ycb*vD+b!{lrjJVm9nsm|OtAsi9Fq z)yyAw2DFEplG_WcmflPc-)``AMvU0+KQcMsOdn`f){TP&V4u+b3#a~6iid+vFa??z zZMz74=FMhZF#H8$)^sx~E-^FfM6>GSMsc5rCiw9q-!^>f3iLd_GB<7cshB%f!)&}S zuW76DOF=Ug7$#G>-mS`W!r7Wzn^L=XHKl~MDtm-)YbG|ORB5!Z z-9H$su6qLe%PG>b{BMs}xEidj81ZL3tP4Cu-4~wCO)1?5tT&%itgX5$fx6qCxmDR| z-;|pQ#8TF;ktUOs&0$^ScPb^&f)WH{)rcTw1{%ncv7Y>Hry+caj%Xvz+&%VtW~WER zk%s)wyG)@+;D_`m-iLPf=7YagBQ4wyt9f1c7(5iM-M_2;0MX(oPBh817pPGhj(UFU z79dGGrs`EGeGH!9!|x*B2B3NdlxJ1n$hUEQrz&Z`U+0Gv?g2MEFJt@NZ$ZbrMBB2` zeCVJmYin5z_nUq2E~A`vp%*>-kfTO<2_;-T(g~l-9IU=X zYX{CehqU!b8y(70pM4f*Q+~ro^}jYBY@g3TUbaM=UYvTIMS9d8f@YQ7V^5E6fOKGq zmLvm9v}VGs2KEcHg`uzF?C{GN=FS#4Q+glAXa*L{oIs3C1rAUjVZ*q)%!fRd^eO*@ z6;z`1(zC5f2ka{Fe97~Uo%Bozvp2(1fu3xI9l+yGT`%tDhK8F5j|@)as3h~D(qz5% zu%aMlG&?K|^XH~HwY}RM7L=h>HzR6n>7m7z#a+gdXnz8+sCIIt7hBt^>{M%1F4m}& zB=4IK-Hf&CCO7q6<2=sR>|n)){$*}zo6#wT!^%jB5v7lmfD0?u^;3=?;_gVvSKt2^MVX@oZfF)_wGdaiJ8`e&-mdiNpZ8asKWi0j*2=W#L8TmCTyJ3q z60NWyO4&@v(#oWuQt=otaj{ZyWLM^6;FDeRZi_NTILDtkg%e5N#nei&V?WzpS-#9- zp8BtTn|s21hA4}2XkXQJeWFc7J!#PmK>BG@ggmpmV?X+6Qk%kGyVH5aDUT&1n&39# z&PIiw>Q|PmF7GXu?J~`Ok`ca*qXWEa8_tPGAm1dS732#`bb@Gy1!*K#B>JJp`C0sk zui#~r`)~?)!zE)|AqC~^xSoo7@~9pTtH2Mwn2bJcR=*j&y^bjSjRgy@mkZpEHS#-} z$Zys0o7CFe47pZ$Z<+5v%nJ&)GONXDJADDDv~|$oE?{lSeDL#SKtTrz3aDNh?(J2$ z;_;C6*W&KN%Xe4P-2vi(XpS0A07slS_OM>1k0PY9H?w>54;}y4Kfo;EU8yhV-N~1N zXkz2M1m-YklXcX?3QX%R5S=oMAtR(?OC4=aBM=0g*5j~z-2yZ)&gO>=3~+o4auBVC z*3D0qo^2fp?=ZnimdUK>U-L7H;Ro3B&HTwt-^`!nTdBqvX*3uN<>ig|!~a#Q8drf( z=lDO+S$(=NP}@Ya|Ctc!gZGJPa!?83dV+fWny8gEK>sA%MY{h#xYGd+ixpRe*WP1H=oa`Y*M8AI{V|vyEzEQXmLI(f$wp|DO?543-}(T=gyFH*oe5{8kw`-7G(l_KF!N4 z+nmGwn9soXYsv5{PvEyDqxtS0r4`cSEUEFJQF>CfBFZv$0 zsYZx2i#o(s`83grI2k3F$$x?#_tN=0*f%C41gAv%pmq2TxMQO9&;nT70A&wr#kk+= z4#c`L^x-|{MxBW{V)$p(TY;^^*~P8UL>)O03))_~8&-9hY*H|m`&KYE_N5>!ab8#S z-q#hAw;VoF?+#|9FT}_&MHgUXEL^w%fB65`zb^PIcEC?UD@7K~+V<`)@I*Wh%D=3d z2i+fQhg})$d>v-tRsIz(avd5yr0CgWgpD-`<8RVN<%xR87bh5_Pbqtqr#KM^597mc zVpeV8tgx#H#&TW?#w>4f?Mtgt`dE8imA;SO%BIT+wJC=)AS?cuLn&M82cYYIGNTMO z2_I%Zg?s>3 z`Eyxuu}^zCpd1%9GQHu%#1hbxkHwxrzu+Y4zZKTIVWd+83E-l*^8U(p`7Z) zYtXv|2ezXn! zMbXOIln*lC-`1P#u`KjhrW^omBYHsonnV+bP7;kcKZUcBy$jLIWUo$yZ@@9cGCiiW zg2ryQEkOS~!F{>^`|p4L0==^#+MD?PJM-#0lczA=^_>5{^bQ7wyRoi5&Bmi*JebeajRB_LD)Bl;m^9r z3UTG=(r!A!udo|9JcSJ zeT$UdyvuDyTpiU;V%#XAZz11JVjWQ@Zj)` zR#8r~^0LOtc%wfVTYX3*6)}&{uMUCIk4aYoQ+) zH0dMzVVS>jJ60vqPj6Iq0%c`wJ*=1N_bN{Bi_4EG$Lc5D{>5_0!I1h$J#1=`b3J!Z zsb+ie)OO`IT<_z)gipYizGF%cC)g`6=M2&NN9l}a#Lq^_4k4gCpxdbYhAVz*ukrzE zdZ2!uoH#@F=`8wSyz?%HrE_`GdV-=Ch`rXkD=ZxLc-GtHyOL+}@=ImUxm@;4jLBw{ zwqCW$g2x0#%FRrKwM851@3tt368(# z_T3dc=f9rsCvvx z&Wiu|j%=o~JbkYcJuZCuz{`=Z}%==Wn0DhJQfam{xt`g%_2iW zBUB@{j7!Lbgv6=l`?2p1->*pWup=K9Aun5c#BZd)o4W=T>8ZJ71YLcRB}r_|?J6I4#S3_zDFo|hJ#hxwO@h)+S~uRgJvm~ZkTD?zXCIFo0{VMH z=?BH)$wRTR>KPDR3YaVuq`abencJ5b(kHwvhv2G9a-&JiigVFihPC5CPE&j(Y?G#g z3QYwCngUugIox^Im;1S5JEYAb$L+f(Y>4hrYomI1qc$x=J!aHu)mJ*quPayJS~O== zdJr^xrTjW#iZ6!@Ia!mw(j`-yIXt`Waw!j9E(QHjeDwgHM;X~>x?=Jb^7Mg)(3Fd0 z&F&Ln&mK^E1u+0ScW7>Sj16bNVHs!}aoO*hcO{$G*3`>9oDRGD_ zzygr;24aSu^mZdGiUeP~l;W)HHSaPGo1znaKa_ONAN0%z;vH!JWWqW? zdg_^;quq#f#0Ap zMs~$C<}Om;Hi~&59wQpO0bX~Z*!=r>$ofWW`q!p}Lb1j7vySUzZWpB14$@c^KmvKY zGkq8m1xl+sILOktzCR5z&D5^nL`0FDXu#c#qt8e5;=9-bEVgXz8YiQ4$G(Vwm2ct3 zs;YEYLfu%o+Hyz!n_W);wVXXOEpH3*fvu8hD-l63Y`a@-1-jQZrKqeQ*cR?8U4LU0Afa{vwVUUqcOl z&lPs(brqrv#FxP+V0{fv=r2|5FN}l{-LBUnqP`v9EM<@rCJt|iTV>-eDrL7bZ$R8d z-pJxMpW4P7D{s%=hVcqS+#Wn-YD46%4HyHjL_~O{W6xNi-Nr#$qS$Ji+xzZIGtq8L_gE9$iNL94=2@)mxi zOaprJE%+_PZx()a!SieRZx`FsXhhvlui{DG1=>p95YtXfQ^60{=fw@yu ze_m(Ac+>amo(;ms!0>DcBTmHswFBiCM{^Xj_qB-D1k7cvX2;bEzr~0%9Pil&4`I4< z1#%&$_bMEL8mfOWVlru-orRo~>&1wka%l$?vFGZpX~=g#x(<;K-W+6luJ40EroFn$ zxZ}33O^8?ZNA>DmjAr%RM9AzPDf4>|ZF@y7I8%(|-4FoJuFgZhHl|FTX)gj*)JzUgS6X z9hOYA`-y(?CVs5{M)#fU*g5_E=nel8_iRby)1!A&qt_%fIL-#bM0uh{)d8*L8PK8- zi{YW-ZgYVh_8Sgqc*vXJZ9u#sDZH%`#|!as?REG9{*cX=-A-#zDWX0QrAY}~hkXJo zPHESNQ@&=rPA0ujofvdRKOQ_&gA}@6ls(g}k2YMG>G{*@iNU?VzZt6C3g6K3g(BpA zrB=iXvX=TbLH=LI2SI1nfX)=5-XF&c79>}wVqa?XB&eAcsXvU*mh!PerAGf}bbNKG zl;IO#A6(2C13*pTc>JHjrQrW$P7|Qk7G?B&r@JC8l4hRnyWZzu!ncbHKGYS5jU5>w zPyUBp##a8~8Q+@Hkv@e#PBD^FS~VTEDPz?043%Gf|9iB7=mqHrazG<4(G5*2W-}*7 z9D;%7e#DWY1Ma#F(mGyG)GayUQo=mGl)hhs|C-arXMR=1f1HB5V4e%=ubkM!mM$?V&OG&Ionnmehq62@cO6ea^ zrs1eNJ)r1&{$3?~Oo%jpugW`B(()$e=K+kz=OQLPgmYSh>3ojAq-8&@gUNd)V++l> z*D%juGh;QtryG_lMh2@Q_;+&x?4Mv^Bx(jLHQK>St!}VV_v_<5?jFyPg@`EtK4sc< zEK-A2vxd_SHtO)47*r~ISPPyOUW>pJ0QLZ{DLl(*F=H)BgtT zEBuXRdVi^ZmLG2j`4G*K^b@aOj(EFYsxjN_*2=3Oi{zdkY~=aD-Q08T;i2&uo6llw z`oKj!gJT0?!=%1iS^nH$Bm68AL+=fDR3qx{tBvJPd+fM=XZUG&rIcE${f992js7d3$uuuwYGzesjUx&O@HD478%Ddvxf9m^bt)ER}-_r+OG6eJAJR z5Vh^w3tIU{Zaa|FlGkqmpJAap1Mv{4OowjFiM`$P+}t`_w;MeMES9yvRX`1YxsWb< zzW3Z3pgm+4(VgF4$PV2g!?Pza8*#S`-4#uP`~S6{tvmV7EH%b<4gB|wy;M5WWu2IY ze!oP8Ot68NT|LJGX$mCTBCCy-YOvnudH9}gRybHG;i>EowS_0jYJxFu_7#ZnY_{h> zZrG`imtCpPZm0BOq&%(I5#^C9gol`%1_}4_Y`c^)C@?*uSI;aG$&N%11UHlm4llX{ zo*?;duJQDKvXz=0hUaPkKGIfg^zVsrA?hbXf?^0HhM-!Jzt6LbmM483h*lAOBHo5* z6k+rdelKD4iue&;8sT=G#6806y%h74^qAz&I$mB3>@)J1)ih2FRro5RJXhgesA`MW z*pKUk-d5$c%nuQ9lkVwp4_L%sP&--E`7d0mzTfTDH@0}KwhD~W;kd(H2~_>m=(#vn z3?IYJ;8H*9dS`9n!T6;6OF^_ACcC*wl@e>ZMzV&IUu3$XmFyUOgiMINayyF_DmqCU z`epY`5-SAu8EgT{fGtmUNe<^etZgJqS)70N`1~sF6n!14%ZYJ+TXu@uP^yn!h^51? zt@JrF3^c@Hli z7tjPK8r4T`6LzK5U`*jRY`SDG(hjeBFXr~Dkrddw^X6QjhOQh*rSryCvTdweFCSJ% z@YzgbEBR31X-l=M!L~I%IJl|H(3;v&eQO~i9SOZD?G$UNM*g1?H%5OAd?YJRB-8K> ztyuvn|088CEY7qB1GME-)7+8l0G(3{%0?ioFU#I}ch2!!9t!;rFc=7fetDJH3q<0c z^qtEq)3@TRG;3#WW!6^m_vNOX0T;Boi@V~JfplowGy@Eh#w;MJ3`Q9wKE@7@-q>ou ze?x2Xy2Y6~AnvTl)x=3>sM)!>QWxiJn$}Fj!P?Z7iM%b~kQ}-Cj`fwAILpwtnmT|c zVm2Wf6k?e%^2}>`Bc;8vGzGh+!qP`9)KdbZ_){z1c)+dcU`1FH1HT{Fjd+Efaqeo= zR1fc&v5>@Kc`}lag>K4?GHfi>Q>5`*ijp` z8K{)skGoh-2J)TGRBUlxQi!-&qt;{eV9k(aW&`Rdz;yktBze-OpcwB8~^M959U`!|J zQ9}8DmY})#o>~oXjhIb9?>?@!um1n>on21Eua*1wdlHwx3vl2AJj@wcGXpPlLEUy z;pccQlwF+)l1XoQzh_dA-S_vtpMO4|$;>%(X6DS9bA6ug^LBgH zX5&`57iisMNZ|m^_;Ci3$=h`(%Rk59<*TU)XhVJfzQn81FKNNYaS=IspG3;YaR?Li6(wwA&0=(_B!ty%H^Qacyi}HOcq$`)17&edFm99pqe%vJmM8H`x*+y=dm=SiSKO~v?Lmp|WtZ(q##ZGvjnVfI}Jm|tl{q?HbOToT=PIZJ#Qn59a0>*16;W zu9^AEHHH&cN7Fp?n%gLU`#DwFGT2})Fk1`z6pu9>@Q-*E43rh+#NcjZ)_Yi zFh7nf&Ml8cJ_IYx|x8(;4;JYsQzDI-@Iv zgtBAffmSK&I=f8uS=L+f8vDVsbu0@F)%{o-sw|p4}wd2tBTs8)5rJwRoxFVP&5Lo}Q%sCC02j-2^>TEHXZ3Jo_l{ z1$vLF=;xl|WPQtZ;z$tpvR#F`I36w4wVSlnTS%TAT03J4)frM<8pb#5i%8Zk@I{ft z*L2dqMqokN0F2p*wAT$;3*KDT`QXrva-NCeIm&S-dUbyf^&O~__6%jb zp$l$-EsPEtKQ&rG9ZK>xg#I|BMd(hHF9w|G62!bXRBx#&Wf5CX>T~Co-U1f?$oXdn zFZ5Gyx;kmo5EFdIRaI&Y()kwcqt!=u!y8Xxz+IXUyfXLQ{wq@wj&;a4nLFfLjQT8s z-jH(Y>9Z2V4*6Ck)|mBr|CLM??tBjR%+wn(l}%mIaSO%V0$(DRg3kn_9%X?~l&&5+ zh1G4G$=3=7cgoNF=OF5nQqw7Zw-I&_Ec7EOwjX+0t1tEe>%6$mj=HBNmfQhG>e8(b zJ>^^%GT@k{E#*>Q1${f#)K34QGHBYd@-9QDObL}C_1d)fY!dk z4{M9AN3pfYi?CmW)Yl^QwMy!15t@zAY$Y@sq3aR4UI|^_bp%p?kZeQf5RQ&O@)(jc zl~5)^W`xX2$c#`CLPbib2q6w3P6=@cq$XInBY58 zi+Bzzv}*^hapCS94HNG`_Fmp4`L0c=Uz?tgmW0)rR zHHmx7E#{NO6!GFZgZ70hXD}S?2Wfvu*LW1^eR16U0DZsoc*>slT(s9C-qwx`p4$!y z`%3T@73ns=Q$cN0Sky@>mk-NYlc6=}KEWU7-M*#h9b?67N~i9B8#9uM0K5rJTA+Pno`~7bV!$yHfuwvklHui!-yU7!j)@Ef3HY9I^?Fi)|3)1cWs(z$*fq* zSXv!P@WAmQZ3k@jc83{bK9jN{;qG_Ks#k0&+h4Z9*>{rUR`BzoV`il2u)anAnqikt zdSi%8GPO(+#qo}{@a`K&fvd7%C$WL3RzPROl&*N~tcq3L{l-}pA-RmybLrZrh8oA4 zAS>3Lh~MkCL#CFLw(0@D{D_%byU%&#B>rLPkP>2ThHz3_@&2vQ;%|*=OxakApBXy+ z9>b9Vy|h$hZA-%UDt+xO;d_+*!thG$J-g|@Yxl)#whSe-;2z5LPhmCJ87;&Zew8WV zZM}k5n1+xITagJ~1dZ`HJ2bL410@iP{A$Pu`P~}YZ(l`iBhG>EI2nCi0{Xh50p0fc zNiNu#MpZ*9x0^D}cy`m6(*qsU zdaBW)XDo%(n>jt39$1`1&&TD|G|i!Nx{?%L@EWB%ftvpZmwNBZzC!IfZ|3SuRsW8*Zr5{%}@_(LN>@)LYd2nv; z_xUn+7eB0juMirOn^={u3sST$d^;UhF>9=lBphae6pXVS0f7yknel-=E+nvi# zgB6d9mm?=ei0y&U?#g%=y)C#8?+N+Vx4cJJe=6Hm;eyLB?h{T9L>y7ae!(}@2hV+% z@a;y#&%hTS7nXd1OK0NPc8bo8W80w*Qn2l6Zo8Y}+NlLld<>vz=m?M=+P{9|exk5K z(K+ty*fUDsKb5CF|MmfJvyArpcCT1(1uFSbSf4xszM3ZNXARQ(P>G55Xeli0r}7WE z$W|h48UzFJ9TWla&Ikhpo5IXBXCtiF#`3vtK$Pc55CqjgDhs!?RCGG zJtP4Cneg-_#S+rQaWd)p9R3yY&A_T+>w3faf-;_}Pf^CF34F86v^&hJeH)x-lrNY! zO9IaL%WjO_HQ88a$fah!1)L?|h?W86U|&h*x|Th|;(Pj_W14-8 zasb^*Hp>;cgxjKHjx3-)oVc%_Q56zMu&ht*loPoUcf~_)H&d7pGWbgN7YA~AC*B*9 z&20?0WSV;~hGUUa_|pE+P$V!yo}+8$$^2#WcV=h*N_MKte9cH?Aa+mhR7FA^w>~)4 zYeTKMB{0!tuOQwul<>iHXyv+FiqCX5cN%;M(@|x!98A}U zo8{f<&1`3- zNh4awJo9j59Z|t22Zy5xkn5XV7BLU)pY|7Y{M2I~Lb!cq+}8x{H|Us3b;(qwNA1TR zMVMkvXy39G`xmg+z|d z$~Br@N&S93^Xy6sBy+7sX)*AQPs#U^Zp?$UExHz}5qwG(93Ao=$lxi{*F0kLX0_BK z)k9ckG5Q|ZG6Vno^O!zEil&7LYuZ?`2eWWZi{=gZX8?NrnUP$+9{4?u+VuP3*>5;| z7x?6&wm>Jarw*W3-@=}OwDp-wae5^VGj-Ga@~f#l;o+9|-gdoR*(uNC81G_Vt1PH0 z>Gk$(tUz1k)#=pN&MNSiHaW)}*X$xKue!1zIl{NI(;R}kNv7{kMsuaXi2Tq9GieTF zilpUY{$desc$cIVi<&mdy`qBm@q7K1=)0g7 z0U|Jdq{4mg8*T{SERyBb!zbi!(vR=|7#wY~z#aXs2k>hMU!I!IdXbwMLzV*IRSC2GzqLu$(s z>|YvMg1Sm;?Udm~qqVkh_~y}Cn?HQFBAZ)EwOPUvSU=u|O_)=S@Zt)6U32XxwI)wR zg~_w9!X(hmg|lF9(WwI@|Y!I%r?g29)Oup zf~;6qSGbCjNOy3|oB(zcWe_r1(31Ui6*)kltf9YKTR? z#XSAWkPWE%icwVk#FIOH-}uIfoUhK8jCJf-Dnl*Tg=a-g{$tRY8{%k)D8+*`Ie)~P zXLcj zOiKHVs_CU=eaUKEtDRl?k27Tbq|&NBmGLh)`o|geQiw%JeJP|~PoMCaZ;SKq-M34G zRi2DH96rOA;>uEb)>L@zupW%xjvT$<@>y(5x5Mlbnw6Ml;S-vF#C!tIP-r-APvVoe z??O%JQn6<@Kxdk7aC^yFl7_i`LfqT)lpeCZ$j6|raQ{(PE)2)(N=69YrHKj>e|0D` z@OKNmK*Qt4buQ}Xl4|VEvyISXs@kY`=y;9lL5(U)xad>*GjK`9AeW5YzSTDtn(jmF z6Fh-55t6w6d_9M@+6Wxr)xO{OQp8MI!`)hL2p5jl*FD1}eF+JUK7)a=P^<2@o&WAu zJ+JT2)2q%NQq`OBO?G@6lrZb;=~j0rK4e}Jz@7SpZ!Y{)tOytb)CSjbCDTo>PQ?7J zCm3%*p9Wzg%pxBwnV3J#0F)6cj)iymF4+7I9H%zvdDEV7o;xmd`t9+0X5ZTp0D39J zcE_2+{#tQ^R|Uj@+4m&uf0y828+z7TxP--gaiO_r;r4}k-VP>L$V=6)`XEIBrtC4T z=*yeA%b9YR^XbG{ncHNhYil_PuNCN%@A5s4nIX;T*Sx}F+* zv(|)#6hA0;19?YOEfg!LYlCDCNajWzS~p?0U4wR?fFowxp%C&2cxmzO zRGBdYX%^7)%yz?41AJZH7)#h*8(_9u$~3L?ERCy-X|}t4^oWmT1`@?@(QiY~*LI~% z)m;K~2x(WX^;M<^KZx1;8mdbvJU5m$Kee?x(|{#_zi$vQeCA%1lpH1dow(G zAUYi8m$4E+u7Lpg=`h{7I@R}zAgb*K~nEG zOhx%~;3P<(R)!|6bk!i_#$>w;hykyaCL_ck#F~l`;t*mHQYoPc2&vFAz;Dp@rt`DI zR2voxGA;kd`O#qleuxi)&2qBE0KFWwmP!h}d^V9VSnC?L>)H}KN~sL1y61aZ3MYHx zoW`_o)6rPd z!l_^p{xryn8Nh3%D>ZkY^T)&S)~BiHKEtE|M}8m`<(IyMOdbdeb7)_@6@I{^y|5B- zXuW&TW9){_h#l4(CF&VbcFA6+`UI`#Q=_aoA6BYGe07cyYp0B^J;1a8oo0ML%Ho*m z$w%(%&F{l=!?frahYFgM>CrKE*sGY>v*ql}>`${`x571)re#x0l<{SZhqe!?M8jue zlqWwezrnDZEtnWm6-N z%%!CcvVwFBo|l4y=YMJe!?y*D>J@%_C-zfZ*wZ{`@GNrO3=R(3)2>JdON~xnrVA48 z6|7u#`b>~#=E7eI9hnoQJYW}I_Kn5pJ397u9V*v{sYkN+z}UW5_ShGjU&X(}ybRy* zhZBk~vYDc<#rfR{YIQ~5>(ySGZ(74B`o!kn#BT=+;|AbPCSg69DE%~KkB*1lsNmEt zwDIyF^=@{BXu5KI_n9E&7W;Y#m}15qL|?!fMQee!8{>rC9!>4KqRcp`y0hNwMoo6Z zn~-#hQQ9`u9F>=!I+YS&L~uS#dJb|D5~L$P)zEL~c%C=4wSw)R0b=a)V574CB1lJU zIujzI#nR>bTQENAQQNnVgP-r;#Y1PvtJ)H!SBIMTT>e(bF6ca2jhSR?tPm1zI^O~E zS?}QYm7h6ITc_o!@!?;t+lcF?|HpL?;JUH@bscR%f8Jl9JW0S6?YvP`DOZ8J49{AO zYcP|)^sJ8ZACJ?Pl`;fW%vR=2vX!E0%&74cUosSEgA|ndI|OPu)tys4&^Q3p za;n>09i&KjVBi^dj>9}J2q|HdBJ`P)bS$$>Aw8B!@C$vCOxzFORt&f!QVc8S+IU#k zn8vlXKt?yVrAW~MY#u1GB<@O-o*q~#3MjkrD6!uT-oW1=5{qT>;t*s_)c@=kzsH;v zyu0+>Qqik)#ly^KSUnn6$}n|WwCwNk^Q!+!uaqmUznEU5oc|@gQr4H`& ze>SS`Vh4?><95*gYz4pAY=uv<_nfaCUt^wE{?c(;QcHl2vCY3x?1(zLNWX*q|I7C; z&;8%?`OEoB`5MiKPRYkuB_D~ezuS8zn2B;bKVb3R%_she`beey4s4oqGoxd;Sy6WV zx>EGb!sfxqPn?{}xy@EcJ|#wS3UG6F^%TLL)}070*Eq2b~ep ztB_ue^s18|puUpuWXv>MoF5;DqzWso81$WlD|%^sOJ>WTT@(0^DpbBhu9Ed8?+uXZ zFD>ne-Zp*A7U0>YkHh~f(-TFeAS2WwSK~~La%O>Y=8w~%K`VNm?}k?#DkUSjd3L%6 zSYy_<1j@hZ*0rhp32m&uGn%JJ)~QD)=r+X!kz$ZGxed+wG7@~#_k*vA&kH1rzg0L; zF7!h3T#?kj9$MZuXd5SEefZM|lb3Q;LKtUO{O6hPMv^Cb(3WY=Uy3$@JxF`JeKfo+ zn$W_CK+?BZczXVsXkv>8TwL^cV>GFyee`%k)PxiqYPBz#f}<;N^l%h>onUv%YN`Fo z=9}|X%8v9UmK|H14~L00eRK9^^X9}IR9-k{N5+<{vXp_Qk#Rs?EiTIrGFz@ed|GgI zx$acbOIQPUorjGPGbw$Wc^k1k7_!*bh7w-_Qdu`)8*MGWDNh7W|Nbt_bo>(P5_);y z_p7?TkXLpA*KC{}WuN>4n#2|*-3&kGruuzI+k*Oqw0flV(^=9NvJ0yU1MW4W%NW1z z^R1|>4DvgE$4|SN9ovB3N`m(+2TOZ3X2->|^o$nQsk_p4)Qw&-VFwK(9amSLdg-1- zJSfuq&~xH{<(0+(k9I2c(mj@y8%LkVh%?1|F|T7kzx=5{Eeo1UGp17%>pcs6@8XG`e*4Xiw9yc+S~Ua@9xP89WG`i^P)Gj=RM zjOKa9nzgV<%-*qJw|R$i_Xw~>h4`m75dFY%UJ+ufnVYkBtO!gEXm)&&%TnEfY@MCn zt$F?ntEy~+Y~_+f^Nw2s_CP$wVpGXXk!tk(t(bkU@HIi6wdYTXZM1&J5qA{3U1m>e zF#&-`^=Wzblok#C-DXWo!1>69=l_)1#@N!s@fw~a6Kf*cwpuJ*^2KBlrruxg29_#< zR$Oo1v+0-kez`!trM2Zd84Q{qZ;1E6!f0; z@j*5>LAo#;NAKbMT8iMS0QN3HIy>C(w3^>JsGqGF)OS_)on8fO9XpqQWl&=TSN4Z- zT%2X}9!G{(j3W2qSARZ?KEUyuf>+am4UO8f5sdDzXC7d-I}}U_*-lx-T$Ts#daz

osG1 zz_mz!qn+~3U5mOGjGk|z{)ggLCOQ!|DEdRNoBKu11)b>$xA__8S0~`_-F{0c2~G_X zoBmXzQ+u*LcM+`RB}o&c&)qDmRlA&;9%`A#hR~i9S-2O&8A5Rk6xkK47F@sW5az1E z3m3DqEzk4npPSb)R^4`+cOhhe2my?!J!x;6sDIwaQ~n(j<& zE8?hUgq5w>8lk5y9&)*BtB)RcosAYUuit;nhoX z{9WiDN+c8ex?Id5t?707TGN#-HPC5f^O@ic$n8i(HE44w$FRAJMV3Zw?suVqxq-LH z?v!_-gMqyP&J&y+iIfk(XHR&I`9cuV0?{o}InzC6S~|O&Z+8zyk_P;!F$=Xouw`Sd zkig_+;=31sm!u0LtO(gh!dVSaA6*pr!6dkV=!1lK|0f?E7k9gGgl>v z7v+^yp6S3wbr@8ZN#&Mo=(&KQWA67%oANx!_L%LIr%E^KH_Dy z$UIzu?_$jGJyfA7qCJz#J}DHGD;&XSl~C`T7^Ggx$bmI;Kk7HBp9QJ}$asS$G)=zy zzBNwtiNeevP~3&EQ2uHGS`HW={Zr+%8d{HEJ*(GT8PtQNFeop;{T3?s%QhVAy*`@e z*AHrB*SWus*$XeTosbC7@s1G}u&smUjt{bbxXQaJMeg@?}#QbDxG{a+$W(eA|s$|$|^}r%e3qOOWfP59} zbAAk$S7tY72b`5X50c4a!{o}0(DjNnnA@Ihpl_Lg@BIJuEU8o2yTf_vjC!H=#W5%D zalY&UI5? z7aL(skqa~iQ$WHD$Cb_qOW>~I+{Lh`iAAQyGUrO#F-L7)6Ra6-ft!Sm=uP(V?qcBF znqy!gLhKSH_E!5Cw-2!o#q652qsesk#8FM@0~4M)Jr?VzHNQ%BCA(>?at=6#-^E5y z2STWSbk0rdCiUOWW-;7KgsGjvMY{zp;?~1{VPt$9GvCqxvI_bIQ$-6H7|8)xYg7NhC#%sP8o_L!FJ(kGz7@4FTws3PdA5hK5{m}*Is`Ia zkfb2L)JmBR-NHvA*}y(dqcY0mM95eh;1BXQu#`!`eQ)pkaJ?=J=@Dk?suQ1MmhwG3 zc`krNxJ>nk`EBP9J#YPz-XL0V@MsAbCTkQSkbO4WnoinN0n zH<7&C`x04Qcr~fWF%GiRHV?`_InT{g6KlCMO+?JHEras8Y{hf53bO7uFlV34Uki5D zUuO@(el5*T`BwXS9)}iNs(!p98I0(Rg>Y#vfDN4)$G^NDl0?gboCK*a3KnqckpbFB z&-xOw$&~<>UXuTac6`jk@e0^i6tP(rWBAoBP99^jfS;3C=n=J?fWC3Z zE9=33j`Z82PxJ4fUVqgLuVbg+_j5MaXCznksghq=uZ^$bi@*zsGfdNceXNlvXZ6WQ zX+hj4U~6TZeMXjXuzkrav<(O)vU*2yAIrS_phkK+Y7lA8v?9X+mm}RBbmg+a6!pTvvee74N5Qa6)>ii}ksXS7>5s9S6f#4%TP3 z+Ob%fO)N2-{fjOUEGY5&Ul;x78Is#n`b6o+*w>rs6_c2DNbA-p#|5bY=Qk&G9lNQ$ z_#87ZvRWRPw)|7T>CF*sV4|Q5MtMqYt^-bD+EL_`gw7BXxKT`c3k#(Ao|t8Qqci;k zv9vd14#n(T4~wQ;TH>#ca6T!pbNx7%6+O~8R|Sxu(2e+N0`2S5Dybb+TBQ?lnfS`p zD4F*4*YHka=OexCs0nt&eiUtAe~S?efk zG$DnWhyN9;MugvU`v$CKGZhA6YL7tAVg4!*s}}8b^!$lm&QobcBY)EMPv~G6U(dW^ z?-riP2j(vNh0`cD_&TB=J0VF9u?67$f{f-%7E*C$8Tjf6F%W`*~KUJJO}q9N8j&$9@QYI6o}V>530ma1)>#!I%g>ai*u) zIrbFo9WiggK>i&i&m4rtuSxg2$NYf!08r<9r5ErMR^f13RlPyMxs`F*aV~ zC;40Ca$ObQrOOHlK2N}Cc@^JcRm|cI$ox30*|9SEBYIAf|Dx-qibkIms7I;^XcUYE z3^WCe0+s2EWvN#-0k#Ts#xgNR&}+uublb2EGg&I}kmhX0m)_j5otEnZ3{NH%@zz`~ zbSEjm=HAPL_W`yKhr?86jA?90s`&js%y=Vl0kDG%+oI503p;#3HegyHIlivTITx z>oq5P(x26iI>1ay>nNsj@yCU|b)#3wBO3np(W`y}!e?1kqIb7kF|GnL0p?^AN|NDp z;ug7ToYl7!_Nae=&v?RdLXFGnD|xW)oG!Iwwa^K>ZHr#gRCAPIP` zQl2!s`6lSgh*TpNiWZUf8FZdP=gKQ_JajF3OJIJeT!8BTzeXILzpTgperzveJB;l~ zoI8Sj1GX7-R%BA4G)BO#!X(glS&I36xz4XkJ4!u9V^)(Ji*$^rdD`oi>m0y7#UgBM z67s7Lr~@zanvNP;8=ev7Pm4f?0=n17C7+U{-ECcr1RfBG!C|k2gpS5Fc_}}zL*>^3~1y`_`L<= za}>(FG9xUf?=e5+{0Xy*$j?CY*VN~H-~ClDeP8NZnwH6h$e9Cl?2fq}?|^RIn;@Bi z)PVJYay%CJjlt1llZSQlWP+W%exc?|Hmgky~Z>9pyT3E$IDJca$>FEaR#ECx8InFE2wH)hQLM3=Kh5E2KLn zQh;8KXT*b8S&Lxu!Tf&odeddsoBYr?(|Zk2-X1nI+85-!+xMvFBx{5ohk6bVD|atF$2Q}L{uZ;nOsVL@Y%GGh!zSCY3KC9N$0-(dl(aL_Hf`Ad2B z*IO$H_ab^;x)LIx*#VP>ne_YeaiOxn(=rj##dPl*&Yw>#Hm7@j>P_>$?o8;}Sb;NS zW2H%W99W}i-k`j6QkGwhJF^9uVcd(`;C{4jND1WJnCsv%@u2;)BwA^Tpvv_3%LCgXloy8O2+c#`b-9AW}C# zY+r{M?mWtLAaeV_$=>0}Uk0f@pp4f*+BFcFKVS+BL~;ilcuRN)MT~2pc>h2oYk)(a zbsk!%fk^4V45e>&fN@Y7UqQmk%>U94n$Is zo13GI1y@VfffswZhnja!si0WwbT4=#C_4>DxfOD;r=!&Qp06Iva_tNhx;OCSD-Aw6 z6GL9PN$#|^pCkGxmE~Zj-2!WL_*7GQwW8&rk^t6BEr{JrEcCs8jvN9X&{#b2Of(jm z5>vf4RitY-f{kLNsGT`o&(Xf~B8N6z>(O0;1k77DW9J29-j++$Tq#NgM=-ABP=lhrMlw8)4@#5`$jDe0*#!wBequ7Tr zgY#U4zUi2sQHzs5!vCTQPrYrpqN37;l7AU}5Xdm+RBCrnwBd#!c<90T<-_Ik-UJfG zI~0q|9CAZr3qHEx5|?8ge9NFU_<>_qTWHGdLo)=9PyQYn3ZymRdV`cUED3ZrmKZwi zTfK4GM#wXzbF$aB5A5vv{e-hOlAK z4i&=yUJPD{d_R6@ajaDI{^OPU={G>Prt&;iSt?ry!__PV zS2l0oLoC|D)b2+rcPv>Ic&G~UvKb3yD<;9Z@Pn1x7e0v8Ruki~zYp9o?q+}Ajr*zJ zr~M|Aw`%U{YBJHbv^a3pjW@$WtpevR49=1BJoRQ((NAKTHG}8cFdaSb?=W}r@?hB~J;v#YbJZ4Oh5l+)e}o1fv#%O< z+dn!3^1l|S;U|5fAt3iT^}r3U4rIAX3$m%^(Nva6W4OWIW3J=qjS_t1r!3CD#MPikMpHKM-I)DW zZTV8Jd4+g^{1WbyNJ)!4vko50*=yx-j_N*BCJQ|dd^Z_Ct|T1rI$jOG$GJtGF-_C+ zhivVj{=##ELl>r(9he8SSl3K1Wv72m9$%*iPd%HW4{0TpF%6O~#`r(Ie>vA^G>U&Y z2PB*b*^DQE)x=c(Xs`oo8#~scb>-(yy@5LA$!fz}-31*R^=X4Tl=33Q9Hj_z{!n4s zo8~2!plqAA0T}+xa^|#b%wtusq7TXwFU2iJ9Ba`dE)Q{PnhxtWSRYt+xVBZPeA}I= z;adD>g|@-EEWK10YV^8u8a<>S^(3r^gk+Hs8oiO;jRCfR2{V(ELYrl)waLQ>;NLn~ zD?H(WChEdOXtGZ2wj zAE?CmaDSHP6OX?30eA^^c`UroWstT;EqsH*SfaNZq^IC9m~d~QJgC-ZQtU35cP?Es zWwH)QG5$Kh849i;AmtUS>Q6@QbTQ4CCw8m-Hs2CAQjpu+JLNH? z7&w%3)r(x#ybT?^?+H3bX>L(4g|l-QD)%XpwW6x64q5^lHb_DFOF82!T-{DA>oTu_1|8CHd!}MT z4w>rEH7>oKvYIR_XHV>qi<=m6hkQ*FB!lNZ`PuKIc%AGt>U)5$`gdWKs)5$s5ZviJ z)>8;++1Q$^Tq(JD7O`6C9745SBQ?lta$f9y4>fOM$m+6GI(_=-3(Q$SyKp?^CIaqF zJ3R_+t0=qjt!#4i9_N){%A`JX961E~svp8*TvT3~VaIb#3t&wdmyllH8<&rwXNI4N zycX>|G6}WZZ>T~&=YPf1(a#)W^Y0ep@}Cz*#}qpM$heN-_F#V;8=Y(1kA2Z>hNJ$* zeb{FIis8}&jIAnEC6ZhgEV1wl9(qnb>(@&veRKKra7+2r@G^gvSljG2*ZN<9hbnrO z$&a5m;e0aAKL=0AJ0Ts^9;e(TJN=uSd0_$`*H`?U*y_v)y@C{vaMa5#l@rpEtVNnM zim@`Lh|By*NR=3(&!A`GsW&-UQW2XV96GBpL4a!cFrlZ%2Vwdgj-9UO|9~D?n8u& zIPlZRS8{Aat9%vb#Qzko3ID|$yQ)>5#eLY&SK+KTVn}>+8-D zhVpLIohxBN%KjsUx&LqOgywd+fUCg&WNs7wujD?({}j`w%9(2A%zWj{4a%7tO-k=w z0*zFY5$GX*pIS?KdL&5AE<|pU51oSt0JPmh=eq38ays@7M>AUfJ1*9%Eqnl$0l%*V zCYKP)7P*M9wtK;_yE4=)YfWm~{jjrJg=3uwoT0YW2sI$2H<1Ili?JDFJnlZbSvGWO z3hz?n{mpVh7gJb2dYstB7S@g)8@u#{w}o_tOK^uI6Rw}uET?jZ&iS!V^*d(FYNetW0Ut!-+-GHu zbm>f?Bv(?u+DQ6mGyhti{OOaYbI3t2X$_rG=c+!5McSfjeyT|OM>@Zz{o)Y%15`J% zSeVY@mOi@-T>q-;RbL2WAS4wTLZ!rn3SGOGS@ zM#nIvu=Qsh(Bd@q5sfNr!aC`dVS{)YBY7+E%&6;kb1sQd)wYrgm$eK-2fNk9uERoQ@3aF}hLA0y?1dZ`UQ@i?y`

a^XRaW zBL{wr%p9~IINQr9agp8(yqD?UM8r6B`xSG)l>IH(+Oc));yFt;nEZY-Ou3pfUCndm zPg-v+xA~P&Kk;uRG`4iO5e#;0^x@*uYZQoa$YJ1 zA0Ye?N-qvC2L@3q9T_IuElxR1_39h&-Hwfx_et!Lr#U3Qy}wIOWg+|ebt(E|BURKg zdLeq@mO1LPpD>)*-fv=51?(}|)m*GW$j%rGw8zf7yu~&0RDpn9q5!cDHCvQ=4E@>$ zH?Qw^=xg{}>9Pr;`ud;N!$^-0l5!WM_X1qZUOR`*7UG z%$Mx~1LOi)w1)S(_<7|l)+06izByDzPvzajN(#oFQu*9D8I#kXwJp_zD;?%ru%gQc z>i)NyyTLJ~?b(jC?BsO}eDbx=VR;iTbbdlDOFe2!EVA;zpXvC4V}^@G?l_>6&Vw21 z$H=V%UG8MW{}{OeoQ)c+HLg~?dd64wu}IAUVefu7>mzvyg40(aFuqFNJMIK8d(??_ zluq1JIl-$5FnJio5uV^l@UXr#UHm-DGNM&t*#r;q(OIBVg5?)tOhoU|EBUa*NKtaA z-CceDaRFBRcs?Wj4E}XtR6dT?`vIYo_#nlGwet?VLB)eip)QmtZbomW5BMzxQEkzQ zTOn7&Cb(8_g@vC4nlDIjrC`X=-$zwc{bt6L58N+E9nLL6fW1tK+DTaP7HhS#CAOKD?HJ%Hnp^F?HKmuwS}c=U=1U9`l^9n z{rBBc>D|7P(Yq@?q6wF;+)c$l6!?GNEgg5uD*a|{4x77fdTDl$Y)KC$1Q~b-x&S%g z#Q(lGz9K8_#=T|b%}8@?GyF%q>wb5^yB8wY4ZwC8>x)YzapB-pn*MpDkCz1Tz3jtB z^p*6PQn4Z=v`j>lN!|c-9?F$t#IhF{@+SHPDrYIX7WRqQ3+St9e^2{qJ0=s4U{Cw& z(GtIKu!KJ6F6BAYZZTfRj*iwb|9o1<@IP9|I)>x<(KmkqPk)R>g|Gbwc$P-JlhQjs zrM9M4+CK8&VL*d+m}dDiddTkw=vBhr16Alle4Mvox2hmH#GUsGj`MyyH+t_T$dXEi zZN78xsZ=PQi`+7--+w-00sDl1&5x0L78kci+8?p_c9Zk6B$E79=;KN0o*dtDmbmCnB)8y$Tni)Y@gJo9cmlg?XK zKyI0io@rMn11%y0%`xUa9-14iWuP~KUxv3x^s0TTpLaDZ$mtFm%XVg}e)@a*cBl66 z`0NVk3ZXfH<-V!2#LR(<%s1Lv(ZZ##Vhfc%x=~BtfBO*q?(Uqw235Wib0*M9$KI!@ z&b%M5W!GKo$&^|~F4eM!lFtX~x8JtF*@= zUA!&+09iL}r%(QlAv4e}XJVu6b7(%pU5kA&wuf-O9-9rvw9O{+c#fsL*kIEh8*$H< zIY%n+676#s*k?lSiZ3YajaHFdQjqIOJ;h>tRTn08pP!2v&($}|(;Tq*Wfyo!p{l19 zwYGhZ3RlPTPApx}@iOpn&5Vwz?+wOVdVKWRGx(h{-hStHt^OK4eY`zGyPju&)H|Qo z7UYGrC$$AvVWeOrQ`)%k**PY}sZZ((vO@X-YdA|xEyxLR1rx$Hk;y9(**u0L()9yl zM0H-W$mJ2yftX~`pEuZBecpe+jDK?f&-A#S<<9i#k;0Vsp*us$Ofh;6RwaevIlF5x z-;*MCLF!NHHNpXxMj%{wuf^L4n__PCU2ep?P#GgFnG~g5G=+)Xe?qyqE-RP+E|U*+ zZ^pkTSaR__>Hp~WymGW`=r@05Gz~l!Ar1aV(_~+kX2)n6Ius5vtH5n`{%^JC(5aow$0C!K6wq=I%QH}R5b3O5(lqqd3LxCZ%wfRKSZ8_ zCW+34?i<9{1Wq6pc~ZGE?L$zbNAJUo-iK9}jNXqZd%b!k?sv~{^`-mWf&0{oJQ{ahQ5XN^6M}&rDgg{StwHV5eV zT1)fsq0*1XzX|FUax&d^T`1?|INOX+^2s#YRJ3pg-nvY-qEM>sx^RJ*4xe2awwd8P z(QccFww`IbA~YVXKW1^NEhjY1RuIk>TWr%phLi2UF6#;`O7CFBkK?SQwOC`zL=2J4 zS4=D@B1H1Vs9fDFGkHerJ@N!s4(6l=uf9|rGNb0{_s1gRWDb2D1Ig9dUIuHb)4eW? zDB9?^2&F{7!oNBCKlq3G0RNk!$9k0-1`gUpw;E$JqoeOy6@OQY4Kr~SMqGG6qfFjt zJ7|kaIni>ZH$mgeoc* zxW=O9G!lDBEL{n2KRQCC1c{Im(DUHr#Qeq~=}CNU6G7T8?LUv2 zl(Pqvv)rY#r{%x)66IUdywYz^>xBo~X>4!7leB4XI`B|xFyZT@Ebx8O76%{q((i`p zu})go`6}%nd|G%jd_{RP9o`IX1+YRlDLf$za&_|uw9FrS7kZjJH9W;X>Dcbt0p=jB zH_59Gy;%Bcsn(O^5jv-r7L}?zMjTQ3IcdSVCO3;$d&fgZ-#({!H1^5SSjIv}uZyvd zkH)h95!*N#tNxGJ^`o)+OR*0?KI4E7|z~Pn)KhoYT zAR>Q>U5;4BiqiL9p2uZ~rEyu8a*nl1{%utn&k~o$Bcc}s`--1i?w_+1dk?~3Wbw3P zznF#*e=GLw*e`-_yidb{KII6}JGZ-cKoRcEzhwa2e+q}S0qtZW3nkcLWBXVn>ZG%^Kh z=<8VM>qsbOxfovyWY><=Dlk;2Gb}h>m#Qwnxm49zCUxV3<3bjRVaS1tsduiXN2x}d zx|ZgUQJp2GCVxJ9A?ia>=qy3{-d=g{Sjbd2>$sz1=D}7+%9uONTixeS9|o40Y|XAD z)+t_%*aGYx*_v571)g7NOWQZc?juT^3gIGedZiw+-O-VzXnLh|Pwr5L+>}eOkz`e#LN9o+a#^G8c#|aCm@QqevT47wJNpBIw16 z5~0J4MfQ#8@ZU9}#{VZH4E{qSMS{?2b?GrGaaCPvRzYcLMKnf#yPvBS{amA`F?%j; z-H%vQXc_6lr0pQyvwdSM^4k%{a)sCk{z;n;_l3WeOtAzlo3@~vfS02_B9_N!XazW< z62yb(17eY#BWT;ALwf|rZ;UvUyM8wG1==--_xTsfftJM;F3i$_3Tp%|%(T~BrQ+Lt zCR;{#N&z{ZVj1tUf{BGSCGbRMvT0j?YmfsMGF>ThLOYJyp_v!E zg-r!B#^OSxes0h+n%X0*dI#xq+J(AzY;=YJ{w~@l&PHC!uEBb8ZwBTZI#|CG$afeV zwbLU4{}v`rpz|z0XQF%L5}e?YF?xf=A}qAj3QWRIK@_x-F3L4%F!I~?u6L>6>uaWC z(bH{D=Ytn&x;*QOTbjQCN4P2>U8oU^30sA*kls+!u(cuFU=R}#J6}*EHiX#uhz&KE zIMXUCSFrQuHk9~=-<5VO@@S4f$?r!9~Ow0c{sJ9aHck1^t2;W@!JWB34tcfqi+)&wrn5Qm_nOB)Tfk=;D7E@8V z7%>lC7E@mNJYrUj#?U8~RQ4cd`RKD~%iNhZU!9KQ~4U% zUqyRk4L??q5hfI*9UJS;n0oPS*OE+r7tUTEpkA&ij+#+Mq>4dBs@Ev&oxrPK7|UN1 zfadc!>@?ujBoj4j`G6H3#qE&%2@ai9r|>gU*@WpOhETsIs)l(kofH|U!n*OGtY#}w z&r3Xvppzzot&+;Usib??d#1gs-XUBWZ69u zvfjENhn22i(@Q^szMtkagXS@95tt^run);mHI#_(zblOe+1`v$Qo*>84j7R>iro{T*+74F z+Aa46<(D!UU;=h#CM2*5y7jnb=x9)W&a4xUYa&NQH*A}L$t18Hh^J^04&qu`bBXP? z(BZkqE1y+xF|$&phSE;{sh>;!pnqIS17?uP(jNMI@t2hPOxD*JVX->As&sD-N4rD8xyVUMxa<>tR|BS3mxBhqUo z#jX~M#1q0av5nTlP;np+v)O!X1tR>v_5Z7Pf3UAN5Io(xG5CG&Fo(cJoh?7=Dzk2J+i|>8ZgiRK1m1odgR8l}_hvO546b*@B1ebf?YRyzljnP5z2nzz zbQJ`EpPtJ28-ovU@Aj(w{k;c+4Xz#DSmd9>O=x!v_ZYS5xqa2VRdYAO`V3g6L`eM; zj5BS%UFdCeHiI(1SLaT0uH5tjp%`X%iZS$%Ncq^(Vl1RxRO0o3sLERni9mzsMeens zTU;iKsaPldRfdnHk%jzYz%wip*(tY&NZuUmv%<@&s$IvR8?~Y~>ZDmRQgnck!B3Hk z>O631LPtp)@Rgt(7YXn5vUoN#ODuc3=|bL*9O!%VeeZN<~j> z7m8h`V!^-1ugRN)JZWv}(Dczf`ITqw@oV$4kP|&tztjeRAw|Mem(fl&I9{LHmJpic zHeJJdi%dp_A$yi|IVZQ-U>9 zG3Fv)%E$bN&anB1&X7hhsZ)Mkc>L(_w%1BtvDUtvs}q)c>N=LU*GbF8x*`|sk-Xfp zLX;-)dY0MnPQ=^3Y@$n#y|@gvNfU6s-s+k`&)0LV4D1h`Nz-T~KFZy3=**ZqzPls; z&O7dW_0I3^%)jf7yAGYnxdl$jtvgo$Svxq=3;(57B2B;%ElaR@AvAU{#jW@1ZLqzr z$N;+r)_|R~ma;ZIaDJ(LI!7e+d-N!ci$do?i0~uBy{)Mk@MB*L-Qf~iHm)d8r>)=& zk%4ol5NIh-dEH|j)#v|N+waoCQ?D0@p53t@s+fGj-66F5+Z$L;Y|u#e4sned>8>Fy z3!BCvzR$#Y8mrG|2wYRyPd9lyP2XbORNYqZvi_!3 zt})mC<`isD-0OG#20p$_2hSa3zWNQg(duBuUdL|VSqB@1w30s7@>N~qa?7%V%WIc) zBmK^0toQ3>&ZpsHp7Y~>0j7B1JSSF8E#H{(nd=aE$nxaLDU9^+fLhKme(d5JKX!Sr zwPO>paZLzgYsV&H<2E3StsR?)je87XZ0*=YY~14rV{6AIV#AXO{a---g8zl&HTR#f zzlk(AJIu}gSFLKONq~fN!X>wpNf>5AfN;nn;MzfS2X~PPDkg|B;n0A(CJ4UZ zu^Utr?HN?*%=erek7g6wVytaUJZ663saW5D?Ff` zI``g?{%>c+dj!gaE4g8KxnZ*iTio9I4W z=RGhmcQ>&1AXiDz94}-AAwN~(o8$9Nw-S$9*&i|Kx%O#p(9~jdO8>Qk$RvH zdf;GZKbH^Q=;&Fzi{qq2CnbQQq~|es{&r^^aA@dx1fE~Qb4~cU4$uGCX>{Ecey+mv zpYiM?B{>Tj^p(>R@>@bO&}olyVHNI4 zcAEUUF+A_+2d~imx$rRV$8QShN;BZ;*Kq&4jgW1_^L@B%xM)vIdt=%Y)83fy^&Yw( zzy!2|T#zq$lwu^euGuFkuFEn;y-TOZS>{HkdU( zpG$brp*fM7xQNbyhVn0UQV~u-Ot3~d(mgWQ=;>9;uQcDkp=w^~y;YF6Enum~MyS6o zmoF9|{H8>{kXa&M%ml~n8`5^>gF+`>(S9>zZ!ct#wKU|(IyQ_`-U3RC#FLBRCl|v{ zF5=0>EGi#iTxL$hAa_zZ|>H|zXfXnPvx&IcbaWndcH${Esw?z z+Z*vD_diOu9AMIY`r=c@t`4upv@x)j%f9IOHyWG(thDVWuXZ@+>03WF%;wm(^_j zOy~=mB57F^T5OvV>87yrWjm6m!spas25|4;91&*1Xkc}+Il~we-9Ki~jwYZO9StwBpDjIZOEkR{~zMl5v6gt`Tl05L=AX5@7 zNyb?mE9d2^a&>un)!okQCG#M+uFq&YO?eK;$&mI9LQ-&BO~i9iO}41#>I0@H=t2*m z)lG2`Xme9P{AvWW7t(b$b$Vp&{3;;^ureWvU;{jM0eK>ok+M}j1bZ7S&FW-TrcAM! zbCp1P%%28{i|S}lr#w}?rCReGEEFo~A0i#Rtdw3(wv~3|bXxvy&;TA=DfV=qW1RYM z(Rd|XVMa(YvX>F=!$opaMAs$nb{Hi9n^DCv+~DDs6|q0c@w?#CVGu} zX(*Kl^hHldLcFWxV@UY~OOA!xl-iScb{|t4;!hRnmk6{|g zsN~8)u9uKYKkTQ|k;v7%DWGLm(yoA~WoVCCozsxxDdf;98Z5yQ?sOt$%X^HaSC9-r zT%jwQUGWKKTgVpwEby_3GxkGEa@*|7KH!>M*9S19(lfA;C9)9_B0Fr(cI5`vb>`OL?xJRUUBhO}O8L;D6;hQa$8~GsAxCXXz8gU}u zSYxuz)HnJVX*>}WZ?x)QP3I^yMfU(|m-7dlZ;=+yKcU4V&puGMc5m;QJZ+c8oI<(# zT!Z;ez+$Y0t~~VcqTT7s;bXqmvpn=21iQ|S=Q#6Ffg^ORnn?xw=r>{?(fz|PSV`Yx z%Dgj=uA@z7TXvR6#Y{)=9jjK4QmX^Y!o?0q^E=*mu z7Cs*6>&E4ge;`{>Q%2!1*sGxSC5yl{GJGj)W$Jkb# zyw>QOb`@l}&lPNxfd(+Dg6XQ`cFRV@G_O)yz`h!w84USLv@H2W!>Xc|k^oCmkZ7R( zpbdt%vSF}gJ1k9s{3@g_scp=)3A2_Z#m>CR89>hk;A4&8qBguwu3v5w)9?0*`X=Z# zT{f)J0z#eS0k(uD66*VDKlLM1+Gz5FkTpd+Ip@#4m1qs}J5ys-m1AF2o&vnu;cm~H z4VzAA>+~vl*B)c7THs~L7>$PnRauq%;-1-(%7|8gpG_+JWk{H6q!(M8TtChFX|~p* z6Ua;U_po#WO1FS)C%*_j;3rL{$YFt8=-`sgti?$J{P5YM#zLp~1ISlHgWRwSddAQ% zHtmyDijMIcjU0N$gOS2A9(VFnpEt26vVlpQDz_u5+HTq5ICFZgC1-5TxSX4wn&v-4 zl=a`-ewS8i49=gns~Wa}Qo#vJWhpA?_#N*gIPX?q{!J@+t)XvNx?kQ4&5iFqlnvsC za)kFo$F0X>nxZsQ_wUb5@x9;+ro7-i?|q^0eBtd9SHBAjHJPowgx-vuyv6axG|j1y zXZjT1cizPo(@@x{Nr4p=(&A9GoTFizVW#7C=o5#a-sO9tkbLodPd?kK-@;n6&tZk; z!fqGh`ESV)&=+Idx4|ae`6AS1(gI)jJ19kGJ70{FO**9f4au{(X}8?n#+gh5CXVWm*yBeZ8%C(&KViuFEO zC#*;sk{w;!+j+S0upSyKy1l;peS+LKKTl4{pKCD=`T4}MTsAnmDJmx3qq@4?cxUd( zQr-6WqAz5NFhJG|w@VDVWvcku4UWhpS(k5o=C&L|2JAu${bY5%w)U)S@$G?T_?~I~ zYL7M^jj**Q!dfCfCCG^aYs`&!PqCiJ&%Oq@&xR~p#rE?rkq7!5IeGFxVX*$77WK%ZC#L0|C|!({6Ta=GuRESOq0i9c>#hFV0+gFdxmX97)E_l|q=ls#Sg&HI z<~ms8G+li4pITMmF5A!qE7YmKJo}?hn9}r@ebORRlkM!YR5Rz5<3GK=0^W& zbBVU`F5T0xEw`}bomL$*kNm5VqTP;^9VIH%XDSkXJ4!2jOvv{Uy>VaLXmAO;X2;Ej zMUKLln?K72*2;{T6+81W=QFUlz0;}7?H3@M3$$+1zKHfoM32*6iTF+u;^`}~x7o#6 z#9Zu$e#M11ZsS6=tgG2tx^3Fc$7$}6274s-(#a{n8&QLyO*9CaOweAeAs^EpV*UP5 z)&=m~`U3jxCfJRJ?P%L`u<|rmj0UMJnfF0X^2PGKGptnGd#Q; z9u|H|_w>Y_^!4%Gu0z;`ZmvG$TVGo4c&L_H5BW-byIiPk7#CB7=h~$vvM)~|YmciT z+Z8vpT9^vH4|JzgWgMP&n82P5w%p!D>73Hf!h0*yfzOdXuWKCA7f#ci+5kGvfm3Np zbt$R&({yLoE2*IRkUFJnEVN5F^tQCHTjFqPl+;n-R5z?xZbmA&7RWoe3tEFwZytXj zuVVAL2bsp+z=d588nPKYnMK&nuX(rCV4`01w^fv$D-J&|4n6P24=OybX{*?B?jbCC zfhbtJLm3Z+^2FQDuYDKR7D!U`EpQ*n|3^pGZEjd}yzITD7Mkgxet1_)Z2PUyalG3J z`X?|~7DUqNbX#5pAB9;-j||$rBGQ2wp(&r%)v~g^tEHMKZ-b^^`p*2*eB^I;nu4dgH5w+D2AK^7O3Vj#Q{qg48j3W)lqnj+StJ)X#R#m40&UCqNfb0Q2;<%*vfOyPt7Pi63 z^2&v3^^m`vAd7zL;YUxzr|4hphqdF2j((LpE~=d-7j&9EQINfl1kDizeW4h?9(xl5 z*ySZ=FXDkTA zD#UyH;}DPcS1Nw_Oo&JMzpegz^%vDXXTN}ez1T3e2ra>^X@c(BJxQ<*1czr}r;@|8 zC<8hp^6+)~fzF~K@Mtw2v}jYS9lvd@UjfDq9qM!oP99*fBE3&7y%W$cf*cUD4nZj@ zrIbM5MHz(fZ|cgLCnFQC}(&1=IaT1K!90Uj7LCMelSOEeRfW+TEzf0gDbC zQe2UNbPxQCu@BIr86EGTZWo@A%$(qqA!GihnSYvX8f(8gKWi^?+}E)ju##^*I_FV= z$6Sx|kce7sfLSYq4E*jA1_kyM8TO}_nlQ#+5RwD0xGq6{u0qbUyb8^=S(c17KJa_l zj^$2J!+I+1onR59oFIu|y> z_Q#Eg@yCyd_4gWK@|#C|RhuK(HDA_cI`;_wsLPSK=CAlwX+FcRL30ehCe6`0ll7}Q zK_B@gysDu^*T!GB9>o3e)=%mJx=+9CWj%`hs~R#|YH3F&$=&n=9@0v%vj!O%ZUxmQ zL08C17^k`mx)6jl5E>A^*0n;>eXKNn3OiMsbt6tP(1~U8QOL#CG^NMzVM4tr384QJ3BtiEu&Jv^?4Y2^a@c;nz-u zmKTJ0*wU)FVlVv7gqB*Xb5frD>T`1ik5>AoP4H->Dac3T&x-yy0BzvY@>uLMaKcv0 zq`|0X8Kl?O<1}n~mj*Hi!ItxoBFkuH(jNe?#ePd2!&x(V*|Zyd*jWaI8rc_z9my|K zVYrL!eWJ3fB}?vXIoYMz)74VjrpGTV9PfdU;2u?3#2$5-2eAJkEM@s)r&c=LuE>Da zcD3Zlaqd``L5y>o=+_nJP7Sa!zuJ!VnbvIAy^s?D-cj`KzvYa0poDKOW-})J#M$?V zccz4R4_5|rWq*7ql`Arf2637@8>LQj=it{F{+)*SbT|D*S2FB7r_G|)wE@B>)k4+V7&9SyP+pI`*NFID@~M{ zH61nmqYa*ZmutZp)S!eQY-Nx=5BQ!zXu!O5ASB9qDng>CCw6kH5#c!86JI)3uw7)V zx4;#hFE_$7XuI#wb^(O72rnRe$wB#(*D%;r4Dw&KvvUFKx=9`?!H#;z7F5v zS$C=uo~C;h=#SZ?w-DHDD0g&xtq)|IpK_?aKAs4x`^;|GY+xBzYS%-y15(M5Xjqi3 zdQOLRFJDfvJ=K1>ISV1tStOT1&w#U(XLn?Wp2&D&+pB)=j%-~ZUrx2pkyG=B3UEO`O{93WsfHz1(|Ab zI;vEPJv5aU(*ECQyx6w|G+r}gC2iolK{GcHm2<(Ok<{8{{TExFa?($dOR;T)eBE|3l)P z+1uNH{&@~;H(zeLHPMm16&61YIX0Z?LM<3G0Wz6%9N+X#JbyJ~fLjKYU7m(=8#V$va9UX>Xb<$V00wjEn zlOzDN5x2r-qz~RPM>rQHLBkPNbA>XE)ERtyKh=J)ZoHged$G}o8sEcybZ!nC!p~~6 zW5T5^OZxG6I_B={N@+XcV>2nBGUMz`J0u%luGcqkt=c);plVRl_iNx0Mg@rjHd|s` zBYhfVuneck&alU3YY@{nX!+`-e;nUfC+(fxkQFs5H7$?EtfuiJJtP~({^b(8WiiGq zOEm^q<43x`ng4!?EzmUnMZegBXA7QkG@oVz69Oa!5$R-u41u@%;c3i2F0qFvz>cR{ zz1niuw96O)M|CSKA75g8)})FLh{fpMj8{2IV!K zr2g6J5Pn43S(=9|z2g+612+Mt_3C-DCeI?mu1l@a!*TKq4I?Ez%0sEG%B-SqBA;>h zUQ$i_2p8sIEhuX%q<*Y6yfLpdue5*vY+rn-v2;!%_nE*GCT=kCsiok7R%SZTs$yDZpN8HXWGn zc+t^*suWL1mx5J$r{`zW`31vyXv;Sy=N0PJtR3+D7s*u4hy1tCq;rE&HIM!tww@V$ zVKfC>9tok1t0O_$KjN~aB^Yk8!&aisu%hS z*BD_#PYgfv!S12CbbKPKHiw^t-!d6tvveOURgA2ygna_+a9IIb;8oO^?wR1MlqVpK zv0zI@kZKK7ovBi||9y@6J}0w&Unbwo;IsZ`*mF?cdm>0Rmh?ym)F`hc*bQY3BpDZ$ z_A9;B*Zmb@skOAgC-_((E|Bg41SUWN&y^gOf(Z)LkCX}F6tj=0P3jMRhR)ciH-ZS~ zCfXB&R$n{kC;Don`@3qYO$VYN0~X;KC67v;_u%}}DxB54+uq!4td1{+H(`7K>N{Yq z{y4a*ci@gJ*F#_E8s9&2Z=W=_gQuwAhn%D5mL;{q_LK)4!OuJB988as614z}i#sdq zhV1d^_pZEr=mJMTuHVFrVcvgST3Q;h{fDqQpswepC;I25oBazAroL_)c(fdI`j6$wcO0I7@G>Ct##J^JB&{zX5wY0uN6#wBe zSWPyyw6>!{Bo0&Xb`5Oq#=cH4uj(jq8my{4YH3A>9@tQDjty{u?Id5`2FGwe8#ux_ zI53L#)!?;Pc9Ml!lf56ltiL~QhghX)*GsUz&a)OEPh+Io>WtZ;mOhpv@lGhdS4N&D zU4{#3Xs&xTF4b0>es)O3t7;s zR!e`DO@Yv}ujPcD_QXh>zJ;E=NO}3E{UTwffp(Y#AMqY$PW$Zi_-k!20&SoRx4}@< zSy83ITfKMmm$`}R&2)0q`-ZG(bcgGOz9mu~l;Z=TXV1yKcj6rt)vbawDLuWD@`vlD zb6wi~e&9HA+CV&K@;RXNSsj>(OTzLFltS*Wmqo$Mrso@KdiW zg#1QB5WOOdk?4VOO1=B+ z2FFPM1g8-_q?U%u+3ub4dK+1g$~sgo+vB2O{b{acUN+`Tqs7A7qekzPeN5FD7YF%w zn`vji{jghJ$QyiYD6D@>!1;qpIvdnBMyPzuk+Z@w6fpi!P2T!$!C1NZ+LtZw@nw*? zK>bS?W=${^^>4_h`m?R&vLj9fyZMVPw`KEGbz^)y=%Befr)INW0(}mmT6WHL^V0^yjR0mw3FGbLu zwtiXcRb^-0(lIf>t-v2`u$1Yr`R6zzXtXh0*eHIqvJ709sZI$PX?DlkGijAd zFBS^Z*NBC0y2|8x%)1K9z%s=!5c4#-j`%m z*~v?s8*+M~ZS2fvQ0$7*3DGa$Y;WIm1DqQG=T!yH76ndOfwNVC^Rfcx6~Jk%U8CTA ztBD{rwWh2qYvtmqFr;tjdP3@T6Rf3~Jz>2?fwk9lSmWbzXouo6yh_x?FQDAhzT^fd zZv~XPL~2caBDJO=ky_K3NUfQJZ92Y@UBT(o)mAD z7S&!qDvv_S}LjO4YS=lJ(1e^~t>G@U-Fij}_ z8LYu5ei=)K!t*4hkv`1jy6(6x_~W(sykI@y&aA%RZ$%?tuwCzZxhWrh2}~MZoKeWv zEHC74{gAoGBLjpR2uF0wKCNBHg@h6=d|MAYi@I1#PEIB}hm-nq)Mg1}n})op$Q@$> zM$g$9@{AV^3|W@6BofzX9-n2)uEjE_v_U|F$gCf!%oMcfQWH_gR$pXyv~`r?0dfD9hbc%+l7&_bfbG zyk1_paMPOgvUlN8{1z_MKDb`~-NI@3U9s@7+*D`0XZyO{!_~E0Ta)cuTLs&rxqKkJ zhXE^(v7&{usilA!=022*b`rY3sRA&30vOi(0tSv2`k>AmhTy6KL5l)`tU%DJKyX=s z;L5_^DiCayt@#8)d~3?=t*zX4*EJa47}OJnCAp=edO~phPX0OunHVEP!B|GX7)Xkp#SQ z$Q|StYNQ8SVVz(&FScU*7ZmDhGa-Aj<>B2!cx`!We=!|ee_Cg`yeIXALf{CM`l%=C zoe&lwoC}*7ZG>?l$Lsx#kMON4yO+&p&{U42H5i&YJ?oj?+V6&X`l6nQb)k9&h%u-q zCbwLk-**?)gBio9PwxPZ3D@OS>Wcf9x{lQ`WscH0eD@rsc}qMzn!~`QbYAxWxGsB3 zoL$*mc*eOAG*WNuHAi6&pD8E!UTidgXYf8ONG3bqfla?8CmTw>c32cF7@tDOmL=66 z7pmxF4r2zp?0k4H*ZGD0p_I`$m!5>xZ!#n{KEt_sj8e8qgvCVP%Z&!z)x>et3*d?6 zE}YTbl(WoY2bV*$pQrr~xFY5pO(0Y5EvRxb@Vf$bPl<;kfrq1mPg}E-%EFnRoekrs z2cw?fIQ|EoYH@dVU=9nU=D1N-h|BRhS>uOPplz>SslS&!Q|^_&tiK@l3iGC4UkT2|Ew6gE(K$hcBONK7(MvFrRz|kqy-A@A$60^W87r`5~_RoeOo4 zRTeY>__h(iWjkwfy75hrP*nUwTuVRIovwnvO6WSk-(6hTr$i{fs#FuO;e_%jaOx73 zGECTqL#J}DmZ|-aeX(;X=0iEp>J*D$*D1Xp&KZ*Y0%WX6l8H;-bXkjYSrfFv?EEKJ zDfU>U!HS|EXBAa_@3Iz`+PGBH6&Z+d*1LIADdW9?g$h;BHLNI z^OL&silhuQBye7%hE0=lIa*Ja2_fHz7;G0Ru~@y&NOJHRP{?~)Pq3(d}=6IvlMcc1)zOiQ@)7tP<$@FE=!3Y)SW9L3C?p~I+N)g zELbNtYk0u}EAT}p<-j8uo-wi}wo3jJ>WE}%vdS1Ie>YM<-3%=kQ4~)lF^z19ESLYH zJ!}j;(a60bp`Qv_PK}&tESJw}9m*3ObV$qPW7;fZ#hQZVk66Vj?*YqRF4@T=A2)y} zp~C*(V+5=tkW}zZaz-ExkUj~`dnVZ+#Sw&u zyKVAKkb2edjR?&F3!bl2o(nRa58QFX^NNQBNyY4--78kBlrp2`x4ab(+tI#uOTE{i zP}8sLd`1tn7w$vSK3HN0b@ zDqVfNo$Sdl2A(9By55IJ7g$HEe9t@mGVzs)AwNz&LJA|-JmZM?+O@`2rINZ@)j~td zi|s#RBz)gW{3(_6KW$|9*<3}E{#-is{>40DjiKtFGkM_R%wbc`xy9nmIMGZ8P8jC@ zhs$n(b+C?IMY-%-1>dA&*Ey&2v@5mv1)N6?8_%U-uuJ-3kO4zg6n{07rziMNxQ30d zUm7Uh1TLU}-!Y8p+6lWwe|4t=e>J!N1Ni7O_t$lwxONp$8NccHCv*m`L-pkQ2NkFe z0jfhYOUHfys6GKyLjctX|2_q(1s&%A)&6Tx={f^N)?x?SJIj?_I!=c%0}t6!JD^($ z=mr3~w*g(ef5aWvAseeemIugQQ6PJ{{R|*`$^G}b7hUIy2$S~jNWX(%+ofR2ayg+d zX%*>#Ewz5GV9G-ZmORwVO(7h~r9Q!JE)Jg#AskuR{`f5L)|{(~RMN^;E@iiO2!@F^$bNF=}nKS%4j&uySD)`b0O9lDEuj9r1;ah=ULU?iV01>=L zjKspbl|2{XMSUXSMeMl{H%5r7@5HxMcM)D(3cSdrHxTc}i!%U42rtf@avd+um~tI2 z&Kz(ZFWRFCFLLS2u6*D{EU8p6Jr^!kEOu&rRbxNHN zz^oKTvbZ04}yfhcKk>D6%$y7yw56mUk(y3Tz^B}w+gS}wL;>2(<$lJU^6hvuWrEQ zUjmn(4CC_gZG_8XfXibQTpq$aIj~eRBhNLnqUfHnu6IPxIT>h!4D4G(FV269f-QFk z9r&X32caEDi`an8pdYlR^m_}6(t-6OO?R(-oLeQ0+DEZp zUsMTyuQLc=0>Y7b!)FFiTfR~o;gTVKeyz6A!9hy<Kk-XEu5?~3McBOVojXU3b`>U7e4cF_62^oO1dJ)#`$ zP7nSE?9ZiO7h(UGkA0q4pLTvG!PtzfMLHxiC@(n2ll5@Jgr!#dtm>veV-~&eF~^PnVB=?V+H#YR7Vu3 zZfzyZ|4|R93~dJi)p@K)IVkTtNMGEiK=mG=%9(Ipf$ErCQT%5Gs&`#E-zN}A8+hu46I z+e2%>n7E#6z!-dIXbl)+y}kyFitD)sjIv%|14db|uL09}_Zk2z($cK<>o|WZO8q6y zH_6k7c4K|M=0D^7l6BWHe%6}n_};#z8{1of?LXK@*uD?2Jx;(4BMLXkI^T#@eP$ER zk4(Q?;Q=n!&Co5q<<8~HmycnD$Ik}~9 z2AwRE-P|Na#ajKe=SyETK*{}lIQRQX?p}c{z*R&g2V2U5J!xKTU?ZNaSDtJL{_6_i z-TTlDE5lK&3?C~i1Cxfrk1cq*SQ)g}Rt8Yy2fcf}H@tHU?|c$|Cr)`shj;Wn-Wh;* zxN})v!AxKA<_GT?yK9yC9Yea+&oh$!g0}$Hkq5xm(f~*p6<~Dej9T!kJq0S9{zKn~!5%6h)eU=3gu;m%yFTGwkaq88P^)WXBHuy8GN z!?nC~t(LQp4tqQ}QK{u@M|Ul1)M7*}Q};4yTbHVgN!z=+*A6ay)j2G@c5tb-GXU*c zNcbyjN0c+oo$?@TIl#Jy5j1YO?98NHY6@0NXPmNP#;3qy`Hs#6*zcizjTKV=pb@U+ znitmyeflV8e7Kz6kY4Sjltc6QT1ma9WSu{S2F+OAO;LNmt zX6_94oB~+#0k)q(cAwDu{ciA+(AiSlX}5e_O?xqIyB%}(K84r7QXnmcej41KfW538 z`z>g*M+Vm2)vRKH2P)PHIJK&HAl;K7_pyL(#oXpx6OM;)9o>zQ6D=#1S)Yhp2IR0t z2@eU_xe50ZEXKG9V}fk3(9RnBVdP1S-vw&8fBZT8TH=Wk91vfC-$;GILo`>Eo%a3S z17_EDh1cI_mc7{Yj!mISnAFf2H+!;2bM-8HS3Z!gxf-wCCVyat4?ygI-|VFM*VVU7 z4(g%df|U0=4Q`U~{HZNuA(jj6b#L^T*J}z*42tHg%N>cHPExSP0AqCYfB^&Idz*Ev zT#nKAh9+)=!mpvQdv%J?YmgqRhZR-)cJp;2!fO`cD4oK2f*lvB_5;$C<>|v~FV6gD z9@*7N@n3XRh@K+hzWSoTy_ZUNm1L~hbuU>fD3|-he+sMioAog#hZLWgT@L;q&gZ;( zSTNseQAv}#xbVu-jq+fenf$Hp?&6H%<1Pl>^RLKX4eSwpk>|(W{9KXS@@e&X@2;XP zj^wYc#bR+*_A&TSH+ORBet9=IO^1~oH2D^dI2kB9>}JFfXslu86kDblJe8SU2bGyL z7cEDW1g*jI3B|PI z7Yet@SM@({JqeR54=hDZyMotO)*ta5-7D+)U+kt>ASqydfEWMgwUtgoOVHB^ zaw_4fIH$|%wb?Lk@HIo3_kb0xCjt|bOuQJJirSYddu=AQwcix(W%4K2dU>tV%b`C0@>(CCy4J^^_vqulUhCsZ*)Md{Y$o~S z4gDRR5vQEpZ3Ipwo)PKb+_#Mj3lQIYcSw$x*8Kl8D#-TbRkYS;*ms9U#i#$DM@7xG zQ9<(6)txjdSRgGB8X0F$+cssNy{oiRKCX<5T|Se1e&jCVKJr~&lbo0luZ*x=URHES z;VClk6vcJKc@!TA_4Z<{O&aGtDW70p7vFKrl~vr$|2^y~llSxzFlNKiEmq{osXohaNk1*Mjv()KhXa!Nx>H)i5>8V)Z zt$wU023kvqTgs$I+iVznp|u2lXOTvGQ6_DD?_IeD`3{Ej-K*qdpq;p(vF=^@BRo4C zes-twOoeA^!&zl5E1by(vq2-hZ+X9!_mxCBfApG$L}ArYNgEAO1Moj@V*axGJP&PD zxBw%94+MxCFht=RyxGx{gZed2ER6I4e}QN?$V`HUd#Cj}4R=MhfQAza=^W=LSu9Kd4fjgNRP=QG zOil4UW1p)cTYSNmo5OqtCLL=fio2~V8kR9*u*xy%TkPdSRH@@<*ho~;PD3t$_{TK= z>p>^%1MNlUh9W}37la@1)^x&}VwRwv=f|xhe1i-+YYJ|esYR}T`k|Y!=r`Z z5={rlyM`Y87rnnPB>dW2dcU6lo_%jYuInRQtutFyQVqC6zs>vIO!$6*S4F|J+$Gpb zA$c1QDMY(P5Dn?gCq&OOx7{*6lck7agx4kRYBDqKF(V&Q?1V9dlqK%P;C)YNt5}N~ zYj1`18GH*fZsP{tnf)%rY_Wc#bw*A5yVZT^xf*(@`K6aif&pI9_L2KG_U1nJ8 z5)e1HIbmCtdgO1x9KZz099Rpb+PJ{rqd||~WwHUk1+o^uzm}u%yI79G??RdKh)SN@ zlst=+Jik)%%vbWvk-79DdgptbXftVyk~dSyI|6znCOegxvCq3VEl$u=!! z8UB&BMtl*Z^=nCHJaosyci_0AeQ2)kK$|^>Ga%B*A&GJ(jqEg35!VmiTBUe}2WV8R z!)r6{W`Zy0TDy*a$)u=G%0216P@9u4r77TJhV0xkY3+w5*uB0QBuQ|1 zrwxZchQo#+mkzdvo?XD2+1M6}{{!ipJ3{fV5&tY4KaO}zXDA)kBBXiY_{WIv2*+y> zKO2s}hxnkbQ2uv=bfy}LzlC^AIKC$g%S+*~A{;)4cV~s)eL9@BH5~pv9Bv7Rk04}< z52%>EkuT_B(?`#u(0;FU(wXC)&W@HJI@(*JF|TgI8b4iVZ#jdx7=w3g?D}86YJoEm z+*Gn5(+`-+AohcujqZy{>#$$whwCAkc&YHTiT%a1T{zH&ga>SzIAFgVYXDB_;3djr zuWxz&KLl*2>3|yZ59j^p`wm>pXkr>%23#Rs&qK?7p3hToax9-) zUg2RWh8*bq6xwBt#d^2>lGGNd^gM;p$*7-niKvmbqV$G2%`l@CA})$S>GaduEZ+q#diu`Cfp?kL`{q^ENft_tlsW1ZvNY#?uB2_uj`rPJpOc*bXka_g}|e%~1tIOjQhcbo&7cd#AL z2eH5kO9o_Gaf;N*(xuuM_#K-VwBzkTC^fXJjCNXaD#!p+LgzWptJ&wodeB(Fd4M+x zJ&b3)nIIrl(|O5bMQFGNQ8YLpNu-sdynh)o;F#B*qf5_uG9Z11uK-0v%d~D>M^IOe@%OjSx2DF7AS3|?6#dlu!ntw^+i2CO?^vE z2eq9|X}iN6)OPeG(9~C257rmGB*O^#3Z?z3Q2vkD|6q*5fG zMN&r0!=zFJ@gw{X-{Wly3ury53gnyQ553^q3Dowdq4lke;P zj@g%`LgJ$~DW?gv!j{QtjHE|spWC-nCE#p~jd9c6_c(c7q2$9C->!2;?13*}URKXy zhPnp8P61CS!#A6&!e9GG^gmjgnM^3aG4!5r-b)X<9J(gz)CB^UUC zxGM+L@d|yVLBHEQH0Cw;hvp~srJZoGm5Y!n7r8h!Z@C~8YJ~chrgj5jq51wpa028| zVF_Gh((AAv0^4@dJ@0X8=KH`Gu#ya12@C8_XuX^4|E#+wWdu%-Ucv05_VmGH0iC+t zLw-1HLQYNdY=(22Mjj8Yk%~2zU^EGCVTPu7)o3o?GkarcT11|AWAWqOn&M*^Em5Q5 zmh^)K%#`%D(|AwHLY=4I>kX*w9uv;|0Sn{@pwS4dfB4~$1$w<79@01uz*`!(;!Klb zHhyTeclu%QO^FY2xKQ;CJv~%N?NO#-DX@Ynyn*(34r@L9JaZN7x!IR+_*?^?WOfJg z4b?zD?R0gv&X)~8;4~)Kz`o8M&dtsZkm(11JR$ceW6{UkhucX~W1i$_k5R_<7O|{NumWJ_MR;j^ou1$*1B0 zm9$RfK&=w=1AD`I&qimelMjv!=o-IcYDv#ok-m-pta6|ZXgiCj;ak+O*z$(s2k45~ zmw2alzm4|>MF)7}cUrusA6}$u(|1@Jw6I9b1|FSH?`(7Y)Z?A*ck#W`$K;KXhdud9 z(OsT_Yrd6_m2vAQGBeG-EMR4*ZDY#aOEUAl;=M~8xC-C&XgbD`AP-9}!C2y}6#5`- z`8zxn)C9aLa48kst7MnWhOt-}Z21ECg-L^C2Jd+A7!SG>RGn<7B0X@D(NN*OuX3-! z{hx3W44kUm8*u*?JR@VoSWD~?E|xOP2FEAKc&0%%i$8K^>hL0?I7q+rK9F3OA5~0mo$bH`F zH(}=R9lfDB-kb3z8?0zMa1@}wAmqrlktvWT16RCIc$oI~ z!s_G$CVA{g;=!r#ZnRsC^*+iS4UOoSF#LKKFmEaRV1B5{oufb==X& z#m)svKQ2(pnyWnT*^jf7^nc$EYg_rwU7I4Jw#g$*5je-!LS|wF}RGSrdzwC=S*uDPezOd~b_QKmqu`}@cSbV)S&IV z`<-F%aIVH5Q=ubp7y9Fz(s8f8_D`i!Gxkcjzji92T9}C%45B^-zM15~BO_BvH^C}vRmLW)o=R-~`GslufZbcS2I^VXK*b?b3)n+oj2GZ7&*%n_!acx)hV+Z4o6LE zi@LnAL0ER7dT!DJInBPYfeAmKTx@yF@jcc68!$*JEasRd83Id}Kp#v?nqarx7GIQ} zV}f+^<>NMtpN$^1=R)?2j)>YLo@^zitzB%16q&~)($0>kmdPjybTVuz1Y7-}D#@95{zO$zJQM5$m72imt*(j~1`AMYPphe0D4iqoy)bN_HN&c-3-gyFK7r>5- zbn9XJ2b47F)?c2@Qzwb))DBQy4FY2WNH!$<2N5gb6C78hVvec*QU0-Pj4BGC^Y(P?f=x#P-- zwEeoq4UqJs^^J7*p?eKad%>0`pxH({<9x-o7RMmeE>>E#3QeY%yGeObrk z1XB#wL311Ny@WOu`^W`agq!_beCdjBjNK{7t5)Xt#1wdK8FnByPJBQ2$f!8ccCe&) z)%eYN*iIZcy&&XYgRt^HiF0~;Z|Ao%ER#dVi~KsF-X&F6N=NoS@nS@<#U8xX`I*eT z)S{1vTXb%?l@?oGM~lXYM9-X&6Uq)XKWRAcBsf10!+E5Y-X&N+ZRKo-tDj%5!1fI>c#vaD}T#MOsB-4Oz58N|I+=Ly74z|Hy z4V%R!_jYcEHuy~VPWs{GGRxzRI%PiP%Z3@a7Te?~3)%7tw){N^ z?n`YTdlPh`fpaihY|u59viP9;^&02O<@8ma0{W`Kt@v8QQF*P8T5o8pin-kAX@-+- zr3H7R^#toCv>OZ^h*@Yi`qJ%k5$vy`mj|sZusI{^U{lF=sgCW9#28!Lwcf)$$FpGz zxYpsR@zi9m#~yL6CDF$P21uCVq1I$0n?o3%U1V>F!M7|~-VC;!4ITi$nI)H0+i*7? zEr)wkO*T#!#0v2kS`F5xF(00-)H_!=g;_k!VbVl>V?rl`~bts(%&ZUBaS8wqvEF(w4%?#~!H2h=7>(XCVlJ zEs;w7=Gp`DL}A*`ugzh?7PQgx@&Mt;B_=#CCkfwUov$_S5DF41VK-d7 zQ`{|H6bBZxV0=ANNl=cMl>jK2^rs-RE|9GZ7TuWJqRo&`upNTPcZi~DM@@BwsKzh$ zvG^4V$ksgUeN-mr>7DmDmrdpa6Rf10w+%G%e6*ZXX+15z)U32#g3@}LrUVvjd83P3 zFQV3*qG>wAsr?27zm%~K4BS`10;+-9%5=2iFFB?@a6y4XZ|29rYXEIVYm0cZhP|zS z`4)`5d}j5@Q%pX2Dz2MNH>ddIOu+{a-adIOQbq|(wk7jbS*uD`9a=>@tw(`v9?50a zF~B$R0}NGhB9&^wuMIxlHrfN#D0M!|P(Qy-9%TaEoy`Iz*&7kxCfiIARo(YC+>bFu zUb`P-N|47UM~Clmwn{7NTx~k}kjANt&KTR5#miG-H39n7<98~~t6~}UVBxp~t0vrJ z!s;C_-yAE|@zf3WuL+uYEaNG8{54oMAl^%!klYPRKfG~c-ibZ(PDI{`H{_*V6Z{bi zd+bN5lbz+zqKts0Mxg>cY?&-TdE^NEdX@MJ8TBuCS{~0TvLC_k)AB?mHW9HAN^Arh zlgosC&~$Rh16iaWc}-TzYeHTnHqnG9-lydWrd>#%fb>a9Y!YH4mDosAs$0n1k212t zWlUfKw6(m!oM}Ikf{;wQ&jh3ZcSRL{) zpS9*wXf`v>{kLFu!3RI2-y~o3Zjvu}kIFTsqjJ4zlY9=>ccyRU@w;?uG@ghiy-`1c zeFMvI))j$V%L%f{u1b(qz6hE7{IaGdC1nSK+sSW9u1TRpEiIZ%|Nt4PZ~aFM#{` zI9VYIf=P$o2c8yK%Io<30Bvr9t!?a((sqg^up6S<{EW{6sa-bjMLE&>qMQ_0Q~IJT z@GKWksgb|7*2rgY9l`ZEt}m^t{^W;uDVEV*>k!F{6s=a{W}cLn@X@nJXn5Lt9{W3g zk}V~-!#Yls|D-&hyQ;D<2g;@&mA`h-y`k!;{H5bP59~=Gl^2D42*MI;Agh!Gic4Px z3_koO^2zA^GY))p$w@hf`>IfGoEqC<09qRD)}ibUjROqgf4Z)~ zhgO8x3}0pjaSnDb`LV&&8D1`HqheEM__p|d#ER?^OT}ZNp})^u^p4=!V0`ro}U+h^RR z_B~#QUV{hS+U0)q-(m0;=2T_oR*W*yc+Ic*9jzULw9amr9t3o+D$r@*hv3m} z_)H|dQQ7{p1PwCSIyq)%>Pl!$C%X+x(f7m&xrL~_?eZLEtP()mRbV}v!?w#aSj4sa z8LT(3Wn}n1Jw(fa*8YeHhX^Mh`rXfZxgd#I=42>w6T=Vdpid zq985d!|FT(`E_h)^1*l7He6A+X)mX>X|Mj;9)GY;c6HnOD=MTMZ4$Ie2UFU#9XSnA z8e!~$22I}VhJ+mR!DTpOWd>ZvGDl&fI%>iRmeKEERa;35Z_{6`Z1c6i6TsEKGzt2o zg96SHoDESr;if;eU+#FNQL8uIte27_KWh?nQEid!!`gILa}K@(>juKemk$1#_zIDW z8+1{IgV@JL_G^qZzTU1{>uS^)YWnNiRi8(;t3NMnjN*stBAqH{7Azcr5_qf^jVxLt z`PP0MQ(co^^dhp zEm4_7RppsBHq6s#V4?g_6XW9#x|8}lG$-deK5Am>@dp=>u3QUYfJxAmX2amosTR#U{Pbq*3iSi2KjR)9<7> z_#a`?K%Ze^jb!l6ku{SH6Y=|5MZLjvr7nKJl7p0nllV#0ddKx?N-0#Pi(*65lv1cX z7sZBBdk82i(pOb)&KD+D;Fn?)9=v?z?b{nvYts&Pr{o+oe`2m7%yE0edZc&PWq_X7 zaeey1Oj$K4R8RUrL5YXzP{HnXc7r;_(V%kB{sKLr(qz;~@!=Ne@B17!OsECS3RHXO z?V<3az?l@i@Aig6sEbOXs~c`AgMk~j&H1!bn2>U?qCN^xN99*F3H;#YmbZ<7hwfbm zqiSx09kIPD(*H5uYcH8HwYEcUYRR6 z9$p7A2Z<_3gsX8_CEQOFf+j zmf+m>0cCIWZ_61GE@%9|lruspXT%NV&>oA<#g5Sq7c0wX6D;rnvjS$i0C$MCBe)s3 z(A;2Rdbch&!j}u$RhNsCG%M^Suj1A$oZ&H+FbDeG6XD0_kDO_t)1I;4S7hFg^XB5~ z=Q1R}=hdNJoYv4g6lW{F)63-5N?U30o~p=K6qjQ#cc0~$k;l8&kJ|EJd2^KdX*29` zYRTVwuk5I7Krsdq8A=;hSXGca{Qg6x_~Ryj-E=lfr^^FvfFGX5DNeC}mkLOj1{cRQ zDtzH|f`J>)^vuX2Srp8an^-*S1wo6xtRL$Sr;o|B6#yG*5I%AUTp^5PnQSy0%Wh&5 z*(wy|ee1$&vj z$=+ojup{gX_IGxUea~d3g$N9-kss~iZR3p@XRzIM5T6>?~ z7Fp1T17^B3;gAF7ApT(&jW_UN`1@TZWGTm)SYbSUEn}Naq3~o(C_EPqe+q}q;jmvU zmCV?)2q|Z4IP8!2>3%>sOb&;c2r2*Aa6Q@K^iARL(QtS%A@shwcPP9qod4Nyz1{Es zYd8?^(ck^y{8M^`?z{6ng>*{kk8}$E7_Nuj>CW@t;ve6E|wzB`QUA4=zVKN448T!V4Z^GOJYS~#1B>sPppxcdLU_Pz%^s_NQz?{nr~ zCId4G10*qoGXcT`BMwn(L@bjLPZAUo|J17jGSRe7XsZJlOp!llLY0{yZBXGxZ@muE z+Jx#g6QL578qi*&mTS_87Zjg^wg#ly0U?<{$h_Y=XC_2%+wZ;ad+&Sid(V@sS!@3} zd+)RVti8`Zd#weS4!B+7>_NZ=zz)C}z;p*^R{|;kivT|ctOslX>;UWrya_lAH~}~h zcvi5AtVKu{*$S4wA_qxp#dvqY7waJ=>hZ<_D@>auORG17ljc} zd$%k?mPfr*5Q<(``?$*MtnS3FP?x8p>KSUTJ-G}z1i~J}ra<$xRV+wG_mh{3s5^rFaxBxbf^LmO(usiW2}r6~h~W;Id@fM9f{B z`HS#eB9%Lln43k##TRacD#e1!n0&B&j7eN2nBuNs*z{NCHqULF+c}p!M=l8zrW{N< zB7q=^R0WtdnQ{r>JD^K}?*RT0-~rH202)B=0=xkF5b*23X8>PtXyasR&=rB6jD|)7E25bX;6!4;{LsLZF97|Z1HexLKL>aT^z8r-==%ZpfzARJfv*6}1by7d zlv9}0-T-_Ix&`<};D-SJ3fd3&A?PIl8T2gR8Nj&!Bj~g=retCwoC=r=x*Ygs;O_(0 zfo=k90=*aTEa)EKw}FQMeV`?b_p41z83ULAx*B*j@C|@}0^I?42K3{ApM#DAe+qmM z@E@Sv>5MH(XUdNOt3Y$$9N;3rm7os;_JckR_$%mU;0?gL0sjWN*36U@X2#|LmV$Ny zUk0oPPJsRh@b91_z&n9|0oVvy!36v-W0>+h;J2Xn0e=Ae7r+4MY=8jza=@ja zZv(y-xDIeH=vE6;+QB-03V0gyG2pL&e-HR?pk08AK~Dl0KraVg2D}(h2Kp^4-tMf7 z{Rxl&9Rz+1_*a16fvy5v4|*-&2cR>6&A@X2(?LhaG8jBy$^pRpptl3R4EzY-pF#fw za2M!X0F|IifTsYD2aF~E|G+@h*;p?6BBn<69J$xnm>Xle9^_x(_J7PJ8u#R;@LW1W zelOY-?l<1$tUSskVyxu;_WHI4zO8|8Yv9`&_&-wvu3f?}+}L+FW8d8htF&YXj>U%d zxLzgOw3om_Z4Yd9?|?t#OW_OazG2!m>mT?sQCdrTX1cJctOEN@X#f_xz5{E*D~hk6 zrwQXM^sfAXvQH@u1Oh^!bX8#0zE%8z(gy+$;4A6wW@y?dtPdLbdtF9Lw*>5k92w*Y z2U)GNn$EhjSl{{a(J(@ykUyYPRb!*+be;hF#JdE3@NT2{UWHM2&|wq~wkXGx8G#}{ zY=}W$Cdn2CKn=XQUfro8`3e@(4eE;4_B?n)*r${++)J43b4!HDFSh^u{kUuCAhe3Z zmW2NXsb1&A7i?#Ck3M=-wbOW1apoJNj!;FOBd}fd*{;mVkHDg%aBf^iVMleSBDXr= zsIAC#RNob1j`lOv_ldpLfoDQD%gC`fR%|oBvjOy3?Va zxp5c@oYIVNqKK6$MTqM@0g1DwSu>?*5hs5Bm_e11K6=Nm6t+NMCk5Zm)f7ymGkxFqpVN) z&{|{80lYV1{}ZM5s(Y3n;zZsqJM1Eo&cw7H*Q?pG4ZUOG?IBZ#xPIIYH}_7C`nMaKqTKF&Ebm-P?S4ihb^mbY|L7J4?>^1ESy6%xWzSyhC7 zalg-*q`1!|2g}H=1%)u@i5~47;@db`Mt5GbV1jyQFd4s8jh{-Vb0nR8-$>_A$#kAo zrQ~rgc@zYIB}v;0W}_jooXs2`7!4Q zkRBvU+Obkf*}l-BrX2lR$}QhWc}y~8R_jiN@LDPXopS!qz6)s|?&FdEFMYLvMo^XFv91mtI|TR~@B*OpWd@zqL#4wwlP86y`EW*ppN5TzQZ{pv zPw9u|AF);nne*xF1nKX*3jJORonGM1RobP1!&gxs#Hl=Kt-IqO^ywV{^bagOU+VMW zNgX~ZR8ik{qSQL3mq}7UTFW4vdk_+FTDgecGs#f~4I=Qd*a}kw`TzUTAL+nU`F) zuu6xO<3757PoO&J{mPnAtrXUhI}W}^?(NE~T3t)9>}XKe45<=+RH;?-<8nzu6e(<= zueLm@h=oG0J7!_g2^aJ}Cw!ptP#FJ3`*C8Xb;6 ztD1MGX|j_Yo-7?j2^uqwD#!ne@4F6^L-lnh<5CLmA_dht47BpoN%Q`Je;xW}eJPV9 zJTbKjZ{`-#W!V6fo79R+ZNU>$>X7!NFpfZ`{6(ZAw|~Ld;is*G~eN#X60bcZZ3WjLbbn2iaD> z^*&kH+COkzvcx6mUpRBisEw7}=RqCyiD(BMN=^P$?hC#Kl>B*E&e7r+nx98&`*7BF z+py~=9C^Bp6Ax0JN;1z*qqUpzbijs}uoYkB&Qk34!&lT@v8t|aciow~x>Xe4wfv}B zS3+}4sS6m}VmJ{teC-vLid^EmD&($*<*8l)a<9C=RX(_Oyvw}!rd;za@wJ$-q>_2i zT(H*cyy$SrT3aLwJoro><(ZI#ttG2URqJ6FC+4iyMJeynVd4ZOK6kzU+OX#gMtVtI zd~J)Gj(e>L8&M@|VZ*kEQV_OYv+9~UEd_Ie?#>^EW#A3aE=bMQ4T;S{S4Xc5L*sFf)o;M z=UG8{RBW-u4dDYgw|yY41DG(HtEg|{M5acG&dYiQ*z z`6}nh!jcoEZu7Js@)C}FSySXXIaNN2O=ZMP9;Z9*IZv^|ac|YyfL3FJL7}+<95LXz zv?q1fkJWqn2M(Rp#-ejn&t{V@^x^-xo?Qs(X&S{sb6lwpxpV8$J25x?JonEtKJ$Eb z?z1(!ZNBkI{z)g?$DRlOJIJIpdwnQ#XOQwGiiK$05akYHT)|$II(Fbz;1*Q3fz7Io zwg=J1Cw+vMsajB;8}fFf{7=EZDd`^`V$OHEVHE*mC86^2G0AcmQI5BV46OXU{(&2l zwL$AAjgv!j$lu^hRI(-W-eV;>q3p5u8)?Z}jAJKkUis&RC$P&-5o0SQ0CdEyWm( z=iIOnH;?=nTkQgu#}fs#9FCzb2KsOo0IMwM4`A-qv|j%y)`dSsy=2etJc(^goQ2Kw zal|MdBpEULi0@6Ke8-OXK03-bZN&GFqkP5r9!PHB+!r)3D8Nm~%a6IBpqyk3%~*3z ztr!byZ4lV^nHDp&6Qpn}Dv$y`$l(-3E-ZZ~L+|jHWmiBlP>T!K_zJ@)S7wE2lxu8- zd6X-CR34pQxsitfr;k&)LOynWhEnB4De+cA=pH9`7ERu4ZF$CkWt+(BAZeCV|Hx=$^c74)PZ z0{3I?{?|CHj`lupu0Hj3a&SQ=cyXxUcf`l>3k3 zcTCNv@L4pDeji)$XZT#XoPIOCf9{K`t1;Bb+D@FT;FR%Uq zm7lGxnnE?!;-4*N%kP)7ZP11}M0033!3t)=?vq5dHmE+UqqL5&#Su_(mSdla4Xb7@ zkMFH1cpq=lZb}nv!0eYt&J5g|(B2uLTc?a9+O^dR6yzpb#fUeWJ=gD1Tjs%`Fx@+{ zO4RsyrqsT$L4IF-$I$a|ty1>f0-Qridww#lOz2(zp}43#6*n__vn36g`tDE^eod$Q z9*VQ3j%C!|!7|Y)cH1JPWqdV4@meT96z8h+nPu>O_02@&>U@~CIX;$AU%=ZG7r^r; z+cw9o(&o60of-IYSZn!9m;cqT)`;5rHvUx9S08=ls#-0t4f3E*qXP49mrXSO2YnH$ z$4}$VpSW{7+uP2aJ>^_(K9|Wz%ls^qh&R0t8=vT3{{yA?O|lf&e^96tENa8qJnDxw z^h2r-Q}q4g1~s)a1CJ+TYjtFY9GJmIZ%224NAHg_r=^>Egr(=0T6g-^614p%aoATs z%p`4%q2__rC?xNs_m7)0QOZoJtIhE-(3A6z>g(2Tl=MO=FVvn}9XoHS{M3N=2kMh* zkHx-&IMr48+T=Yb**NO4-}kGb4w-uF9zS$U#cqauawqVO=V(76RyyyqnrSE0v>4)2 zYC2h3aMahb8Y@WIQA^k;Z(l|j^JP!g{HtIa9sECTi*S`IGiZ7pU+%;>_CrI3UM`Sp zeZevb_LP3vF0aZe8tC;?KfZQj8}==xWx>YE`GHG^CQQd{SbrS51TN&seWHZ)eS_`M zcF1XgAG{3s19(DHnH$!bxVlm~Zqmn$LU|-RP8OLtBy5Bs_vaRt2KSGlnd_JB&$ru( z-tS$X`&xVcr9HiD>H?W+K$=&$ghESEn*Lt3jW)O-UkB-|S|8>*yy@k?(awr=-IcLo zUKv})#Aszq2IWOQQ^heSO&0#xBhbqvAcm1)6%fOxttN7b0=WcOiOv*(c?0U!bDq{h zLMRYizaV2?sGV)u7jy?RuQAQr(B6^@9e8n81ieK4Pa`FF|HoQNr|(?}*Qx%?5OQj< zhf;l9pd1uVw1@wwJPbWVEY=xkurH^FbbpF_KxY0u1?xF3(asrhjRe-BYR>>?QA}w4 z2|jRwMK^fsT7bjQ)tKV)v}VT#&GX?0!5`9G5h{80gGzjv?WggvO_h~Tf$Q_BnR8*~ zp@*c;%-ys%K;s<;;$i{xf{oxBmgvGr%Ado(4w^aU_<1w|*&Iqia8ANF62gen1f6Lo z-ViEaS@zM~;eqUg6rps}x@ShLQJUd}qAz<5(UN+p!x;Teqy&8#`jaFbtyVS`C1(}E zR#K1jFrw1b5oHDk!uov_2TBJAvVa3UKUC@y@LpU3y%9d2u{$*bN$M!-?Mu0JyuZ(+ za${<@3#~?NHm2NGf_>q*X|F|{uWY-8UvR~vY*5}%Y+YHPsH^6gl7P$dev9W@UmT$gC-I3U^$C9#c4^^#f}E$MZc7=-`1qK7AV- zY2(hXIx$Pr8v|MvZFuS5ZOf@cT8&>pHBLJ@{%H%@R0HaqtS}A_c!#AI^GE8DYLR%- z->*SSvIePVX#B{e)}7iSSd-af3EjJBA+`S0-kf?0Bc6h4&G0vB&3=?i`KX^F`WC#K z*74wDn2Xp{ZM{uvVgFuj#dij~Vx<2n6$={irl!{Nx^68_|KE*6vI3*yP`ZCBEwYO9 z&3NEjusJ^&cH)C_0M_Xu>U%?T+uJ-x0VxJu(~pc^EomosqP--c7cUue(l6 zruS(t^TS3r{6{=E{$`S0V$)%{=zyKpXqd6j2Zw5n8fBlb@Z zb1AyQyBfMnur{Ld()(U$S(BPhYR4{|+`)?~QX?;D?$|ZRY`X?^QZR=dtjgIDYWA3p zz=pZBYtUe;f?qJF8TRHrLq2ZgNcphCpRI7L{v^btEm%8xS43AkJG8k(yp;8LS3u6Z zZ(qP)R@y+)5yCG5f&BroVO|4$U#cOi1lK;)#tJO5uua^i+h&xrgHq!pIV}h8?6%v3 zTVxX`0b=EjM(u6=SducZT0F_{Kst1_6+)t5c))O;w4YhJUGnzT-WA@jCdwsVytNk8 zdw=KE6UW)WIto_&P@a#S8KGr(;Ikp`>WLLt?Mkp_<*I&^>GVUvtg2ljA!5iGM z+WXaHPndQ`4N?3~mL>QY@%}2UnC*p~bjLbxhxgq+$cU`qN~xlL`%>kmY0X}QF@cbz zKM&AXv3&u4f9d^vodf)hL$ejN?}U148EQjnU+UAe2K^+VwQo3}wQn>atwFx`f0=B} ziMZ=6b>H5A_gmU!SMbhESaeo)heIw{wU-pMo(-*Z#3Xw`>N|hjUFBH3#mRjM&XWiZy9-yJBE1+-^aAxCat6R625a$FDq?m zXn4J0-YVCt-=*5R)*^?Xy}(t$r1A3RcouB2LXXFzrY&NVu1VkIUFV9-xZa#EwqAty z=H@aUr8(6glZ7~n-MTD*S|tg9+ai2sT2E_jIo#XP`^7`8KBApi;U)&s5}3o3eC#?r zg}bOd3b86C3ahU*#+ItM!)4e>`rVq#XtoPuKMFGoesv1<^5^3QuXoL6ynkWT-p`s# zpi`jUyBF?~K$_Nr*$v>amuvmXU+U)@N;m9l*yo?0w_gzgoyI) zUx(neAqTP({^o;ot!B=;V~R(M~`%eu)BN&`yyELxWMzM^jr?FVFg&3I;ZrA zQ3<(88}gzi)bpDObaO2;X8Gw+FoSriim1It0NfGX}j_ zd7!5hP-%%5Qu?T)>Cnboum|4-_1zNQkIb-pRn}vS7C_U8pok8)eAG|8I@;*YjW#%u zb7KNL#2;QmJGHw9XR<iQWEy5%h%39($Zoxv^1ST5V=L?hPj z!D8EtP|Cm9wv1@_OB)>Z*=nhO8|P84UzlDZzuFhu_0e(NEgu~>uKFmR)k!ilBz42j zW!{{`9w}~spKdYSH?X(`7D-KifZrMx*ZnB=YTsvg>Pm3hY1dZ@Tg9!qt){sXpfe>P zulA)q65Z5Ph7;M)TD(E#JOxOdWa&Y0$uOTTI5T=8%VsXm6H1@fPL*T8*{>R4)E=YQKrFEsY(Hf)^vleKaq6!6S+D zg##J~46kfe-IC(O%%D44jul9Br4eiIgv%QU2cBJ7pq%XcY-OR!FQxm_iG%z1H+nW; zM1}S#fe;UHM=8dV8)NMY98jJ79A{GimjSK>Tn#wNJAVeU>sl;U@ibU8rdR1E#LvbG(ZU8(UM@# zgMJ;*3+MsRg*OU>?_>Sq5z|62N4ge@NsP**YoUf%@2i}Z?d9wqz=qdQegKXEDzLzvOk44e$V9{2Ld-*S^VF1i%x#uGmm)eez1vlSfT=_lowW zrMwuDbA_hTR#RGzrM;%mQd?fAGiT^*{FXdAb*$6DVz132xVhCH!>0OdTY1{tCH#Y( z3Cr!AXX|c(E-csX6~E#5&!_9@`$Hpm=wpf95D zYUNWn;{S7hF2WPF;vcA9lvY*L}g7B0Lo z+a?%I>0D+tOyS*D_AiqVJ&^>apr?HvzRAf-E-T@zFt0EVE%-fzq7)%WykH*3Cj4Zm z>cRnLT(2aKiHY?Y88}TFhTT}4dY{P(nzXQjrU`1Cr3_DjiK#%(c(?I1FXHS;!;^*@ zk_qD04KX~g80{=c>=o= z!WnC+jOzHqru4{_>NQ$df;V^7jRdl>7bFE#PhNwzIKa{>^*D%65=K>CgQ!-%8k`4t zwUO%*q&4CoLSRUZ*Pv3nnPQ3I)d^y4nN_?BLy+*-BC8IOUj~6xOBOl!S*_VzYDgZ^ zGTSAlpjFaX6W!ZwwKwr5o>-q)e>#~~Hr14lpbEKCs}uv*ur4)?8fF&pIEu}IVoS9+$%)ikl0THjHfA?VVinTnNZFuvHKyTi?91p)x6LSaj=qUK zfu7;Q9~#x;=EcmemPPB1cJwLYT?zOV;VEQD?b(?@XBD{3pp}4kq4e9>c}YAb)*z7U zwjnA#kR6@fh{9WuGSiKfn9W{;)Zj8REB?3_eI%XwKiBKKpg;)^=>(6%Ujp}j{rVou zt5G}HC~wY+i;;w#{5jIajx8=WE`xf#&;>V@!Htyth~h^2mSi7`>x;xF?*uTRh8bcg zaXF&cs^|w}8>KTddqaku!I7DXds*{rekhA&u``dKak_s+!jJ?t>@>IDZJ*ZQ-qodr>4 z)>HR1Lu!D{`s%x&=eS&1)b*_NaJY*2Hg+eViJxWsHeo;ClO7zmA4BzseouN6nuoCo z)SnRXmKd;w5)3S-fQNqD71Dxcv_NE?TsBG5nT#z17v# z-n;HX@gEM-7233^F%)XVH98&0qmR1gsaI+8np0AGT{5mdJ$(XGd5s>;bQZN~8(Wl9 za8dU~7v)M=!{{-fy4aKa7DIk|G<~6EhouE=I04N>4{RH|Ca3YDFE29ZX5^-;{or2a zMqFRI%d*_^bIU*Dxc~qAS6bS(ovZ~S9X3{mKQE0~mG9Cppldv?hq;?y$N!|UbM3+=uQK3z0GFkP9=7!(-nV=cPVNOdg32+-24 zS+r#7Qt#4gbi%vtuBk!h|KO_1tID*uNr`S|u-j+Mc8^50-+OOaP6?dcngF1CyiH?%b7r7K8x9P|=54lf7DKb$S8%mYBw9<`-fH{?I1_a8lVx??8 zQdq+7L3$6ehuF_>YGONU#X9OG=w#f_{++$e-oaAf0Dj+wYd?HnLTD>uH6!*zxNAA? zUV>ESBekoL>I}6E*)-d$B}nBz8k6Aow}1bC)xhZX|6f6ijlwaJ=IS-$!`3z9ZF6oD zOh&r_>(sn$nBj}K&R&FR+m>hT!be5poi71iP>w>4Zq0UF>2) Q5mvx-)v!}LztjHT0T_`R3jhEB literal 0 HcmV?d00001 diff --git a/fs/crypto/keysetup.c b/fs/crypto/keysetup.c index 67325a1f7695..039d9a7732a6 100755 --- a/fs/crypto/keysetup.c +++ b/fs/crypto/keysetup.c @@ -570,6 +570,25 @@ int fscrypt_get_encryption_info(struct inode *inode) memcpy(&ctx, dummy_ctx, res); } +#if defined(CONFIG_FSCRYPT_SDP) || defined(CONFIG_DDAR) + switch (ctx.version) { + case FSCRYPT_CONTEXT_V1: { + if (res == offsetof(struct fscrypt_context_v1, knox_flags)) { + ctx.v1.knox_flags = 0; + res = sizeof(ctx.v1); + } + break; + } + case FSCRYPT_CONTEXT_V2: { + if (res == offsetof(struct fscrypt_context_v2, knox_flags)) { + ctx.v2.knox_flags = 0; + res = sizeof(ctx.v2); + } + break; + } + } +#endif + crypt_info = kmem_cache_zalloc(fscrypt_info_cachep, GFP_NOFS); if (!crypt_info) return -ENOMEM; @@ -1016,4 +1035,4 @@ int fscrypt_get_encryption_kek( return res; } EXPORT_SYMBOL(fscrypt_get_encryption_kek); -#endif \ No newline at end of file +#endif diff --git a/fs/crypto/policy.c b/fs/crypto/policy.c index 67355ddf5195..284013714696 100755 --- a/fs/crypto/policy.c +++ b/fs/crypto/policy.c @@ -267,9 +267,13 @@ static int fscrypt_new_context_from_policy(union fscrypt_context *ctx_u, get_random_bytes(ctx->nonce, sizeof(ctx->nonce)); #if defined(CONFIG_FSCRYPT_SDP) || defined(CONFIG_DDAR) + BUILD_BUG_ON((sizeof(*ctx) - sizeof(ctx->knox_flags)) + != offsetof(struct fscrypt_context_v1, knox_flags)); ctx->knox_flags = 0; -#endif + return offsetof(struct fscrypt_context_v1, knox_flags); +#else return sizeof(*ctx); +#endif } case FSCRYPT_POLICY_V2: { const struct fscrypt_policy_v2 *policy = &policy_u->v2; @@ -287,9 +291,13 @@ static int fscrypt_new_context_from_policy(union fscrypt_context *ctx_u, get_random_bytes(ctx->nonce, sizeof(ctx->nonce)); #if defined(CONFIG_FSCRYPT_SDP) || defined(CONFIG_DDAR) + BUILD_BUG_ON((sizeof(*ctx) - sizeof(ctx->knox_flags)) + != offsetof(struct fscrypt_context_v2, knox_flags)); ctx->knox_flags = 0; -#endif + return offsetof(struct fscrypt_context_v2, knox_flags); +#else return sizeof(*ctx); +#endif } } BUG(); @@ -378,6 +386,25 @@ static int fscrypt_get_policy(struct inode *inode, union fscrypt_policy *policy) if (ret < 0) return (ret == -ERANGE) ? -EINVAL : ret; +#if defined(CONFIG_FSCRYPT_SDP) || defined(CONFIG_DDAR) + switch (ctx.version) { + case FSCRYPT_CONTEXT_V1: { + if (ret == offsetof(struct fscrypt_context_v1, knox_flags)) { + ctx.v1.knox_flags = 0; + ret = sizeof(ctx.v1); + } + break; + } + case FSCRYPT_CONTEXT_V2: { + if (ret == offsetof(struct fscrypt_context_v2, knox_flags)) { + ctx.v2.knox_flags = 0; + ret = sizeof(ctx.v2); + } + break; + } + } +#endif + return fscrypt_policy_from_context(policy, &ctx, ret); } @@ -552,6 +579,26 @@ int fscrypt_ioctl_get_nonce(struct file *filp, void __user *arg) ret = inode->i_sb->s_cop->get_context(inode, &ctx, sizeof(ctx)); if (ret < 0) return ret; + +#if defined(CONFIG_FSCRYPT_SDP) || defined(CONFIG_DDAR) + switch (ctx.version) { + case FSCRYPT_CONTEXT_V1: { + if (ret == offsetof(struct fscrypt_context_v1, knox_flags)) { + ctx.v1.knox_flags = 0; + ret = sizeof(ctx.v1); + } + break; + } + case FSCRYPT_CONTEXT_V2: { + if (ret == offsetof(struct fscrypt_context_v2, knox_flags)) { + ctx.v2.knox_flags = 0; + ret = sizeof(ctx.v2); + } + break; + } + } +#endif + if (!fscrypt_context_is_valid(&ctx, ret)) return -EINVAL; if (copy_to_user(arg, fscrypt_context_nonce(&ctx), @@ -687,6 +734,19 @@ int fscrypt_inherit_context(struct inode *parent, struct inode *child, "%s: Failed to set sensitive ongoing flag (err:%d)\n", __func__, res); return res; } + + switch (ctx.version) { + case FSCRYPT_CONTEXT_V1: { + if (ctx.v1.knox_flags != 0) + ctxsize = sizeof(ctx.v1); + break; + } + case FSCRYPT_CONTEXT_V2: { + if (ctx.v2.knox_flags != 0) + ctxsize = sizeof(ctx.v2); + break; + } + } #endif res = parent->i_sb->s_cop->set_context(child, &ctx, ctxsize, fs_data); diff --git a/fs/crypto/sdp/sdp_dek.c b/fs/crypto/sdp/sdp_dek.c index 0db95f9dd63d..a73b6a78a095 100755 --- a/fs/crypto/sdp/sdp_dek.c +++ b/fs/crypto/sdp/sdp_dek.c @@ -151,6 +151,22 @@ int fscrypt_sdp_set_sdp_policy(struct inode *inode, int engine_id) } res = inode->i_sb->s_cop->get_context(inode, &ctx, sizeof(ctx)); + switch (ctx.version) { + case FSCRYPT_CONTEXT_V1: { + if (res == offsetof(struct fscrypt_context_v1, knox_flags)) { + ctx.v1.knox_flags = 0; + res = sizeof(ctx.v1); + } + break; + } + case FSCRYPT_CONTEXT_V2: { + if (res == offsetof(struct fscrypt_context_v2, knox_flags)) { + ctx.v2.knox_flags = 0; + res = sizeof(ctx.v2); + } + break; + } + } if (res != fscrypt_context_size(&ctx)) { if (res >= 0) { DEK_LOGE("set_policy: failed to get fscrypt ctx (err:%d)\n", res); @@ -289,6 +305,22 @@ int fscrypt_sdp_set_sensitive(struct inode *inode, int engine_id, struct fscrypt DEK_LOGE("%s: Failed to get fscrypt ctx (err:%d)\n", __func__, rc); return rc; } + switch (ctx.version) { + case FSCRYPT_CONTEXT_V1: { + if (rc == offsetof(struct fscrypt_context_v1, knox_flags)) { + ctx.v1.knox_flags = 0; + rc = sizeof(ctx.v1); + } + break; + } + case FSCRYPT_CONTEXT_V2: { + if (rc == offsetof(struct fscrypt_context_v2, knox_flags)) { + ctx.v2.knox_flags = 0; + rc = sizeof(ctx.v2); + } + break; + } + } if (!is_dir) { //run setsensitive with nonce from ctx @@ -338,6 +370,22 @@ int fscrypt_sdp_set_protected(struct inode *inode, int engine_id) } rc = inode->i_sb->s_cop->get_context(inode, &ctx, sizeof(ctx)); + switch (ctx.version) { + case FSCRYPT_CONTEXT_V1: { + if (rc == offsetof(struct fscrypt_context_v1, knox_flags)) { + ctx.v1.knox_flags = 0; + rc = sizeof(ctx.v1); + } + break; + } + case FSCRYPT_CONTEXT_V2: { + if (rc == offsetof(struct fscrypt_context_v2, knox_flags)) { + ctx.v2.knox_flags = 0; + rc = sizeof(ctx.v2); + } + break; + } + } if (rc != fscrypt_context_size(&ctx)) { DEK_LOGE("set_protected: failed to get fscrypt ctx (err:%d)\n", rc); return -EINVAL; @@ -475,6 +523,22 @@ int fscrypt_sdp_initialize(struct inode *inode, int engine_id, struct fscrypt_ke return res; res = inode->i_sb->s_cop->get_context(inode, &ctx, sizeof(ctx)); + switch (ctx.version) { + case FSCRYPT_CONTEXT_V1: { + if (res == offsetof(struct fscrypt_context_v1, knox_flags)) { + ctx.v1.knox_flags = 0; + res = sizeof(ctx.v1); + } + break; + } + case FSCRYPT_CONTEXT_V2: { + if (res == offsetof(struct fscrypt_context_v2, knox_flags)) { + ctx.v2.knox_flags = 0; + res = sizeof(ctx.v2); + } + break; + } + } if (res != fscrypt_context_size(&ctx)) { if (res >= 0) res = -EEXIST; @@ -550,6 +614,22 @@ int fscrypt_sdp_add_chamber_directory(int engine_id, struct inode *inode) "%s: Failed to get fscrypt ctx (err:%d)\n", __func__, rc); return rc; } + switch (ctx.version) { + case FSCRYPT_CONTEXT_V1: { + if (rc == offsetof(struct fscrypt_context_v1, knox_flags)) { + ctx.v1.knox_flags = 0; + rc = sizeof(ctx.v1); + } + break; + } + case FSCRYPT_CONTEXT_V2: { + if (rc == offsetof(struct fscrypt_context_v2, knox_flags)) { + ctx.v2.knox_flags = 0; + rc = sizeof(ctx.v2); + } + break; + } + } if (!ci->ci_sdp_info) { struct sdp_info *ci_sdp_info = fscrypt_sdp_alloc_sdp_info(); @@ -613,6 +693,22 @@ int fscrypt_sdp_remove_chamber_directory(struct inode *inode) "%s: Failed to get fscrypt ctx (err:%d)\n", __func__, rc); return rc; } + switch (ctx.version) { + case FSCRYPT_CONTEXT_V1: { + if (rc == offsetof(struct fscrypt_context_v1, knox_flags)) { + ctx.v1.knox_flags = 0; + rc = sizeof(ctx.v1); + } + break; + } + case FSCRYPT_CONTEXT_V2: { + if (rc == offsetof(struct fscrypt_context_v2, knox_flags)) { + ctx.v2.knox_flags = 0; + rc = sizeof(ctx.v2); + } + break; + } + } if (!ci->ci_sdp_info) return -EINVAL; @@ -1187,6 +1283,22 @@ inline int __fscrypt_sdp_thread_convert_sdp_key(void *arg) if (ci && ci->ci_sdp_info) { rc = inode->i_sb->s_cop->get_context(inode, &ctx, sizeof(ctx)); + switch (ctx.version) { + case FSCRYPT_CONTEXT_V1: { + if (rc == offsetof(struct fscrypt_context_v1, knox_flags)) { + ctx.v1.knox_flags = 0; + rc = sizeof(ctx.v1); + } + break; + } + case FSCRYPT_CONTEXT_V2: { + if (rc == offsetof(struct fscrypt_context_v2, knox_flags)) { + ctx.v2.knox_flags = 0; + rc = sizeof(ctx.v2); + } + break; + } + } if (rc != fscrypt_context_size(&ctx)) { if (rc > 0) rc = -EINVAL; diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index c25774c2e542..6bc925dcfbee 100755 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c @@ -1635,7 +1635,7 @@ int f2fs_write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) goto out; } - if (NM_I(sbi)->dirty_nat_cnt == 0 && + if (NM_I(sbi)->nat_cnt[DIRTY_NAT] == 0 && SIT_I(sbi)->dirty_sentries == 0 && prefree_segments(sbi) == 0) { f2fs_flush_sit_entries(sbi, cpc); diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c index 20e06426a681..101e6cfa62cb 100755 --- a/fs/f2fs/compress.c +++ b/fs/f2fs/compress.c @@ -784,6 +784,10 @@ static int __f2fs_cluster_blocks(struct compress_ctx *cc, bool compr) ret++; } } + + f2fs_bug_on(F2FS_I_SB(cc->inode), + !compr && ret != cc->cluster_size && + !is_inode_flag_set(cc->inode, FI_COMPRESS_RELEASED)); } fail: f2fs_put_dnode(&dn); @@ -854,21 +858,16 @@ static int prepare_compress_overwrite(struct compress_ctx *cc, struct f2fs_sb_info *sbi = F2FS_I_SB(cc->inode); struct address_space *mapping = cc->inode->i_mapping; struct page *page; - struct dnode_of_data dn; sector_t last_block_in_bio; unsigned fgp_flag = FGP_LOCK | FGP_WRITE | FGP_CREAT; pgoff_t start_idx = start_idx_of_cluster(cc); int i, ret; - bool prealloc; retry: ret = f2fs_cluster_blocks(cc, false); if (ret <= 0) return ret; - /* compressed case */ - prealloc = (ret < cc->cluster_size); - ret = f2fs_init_compress_ctx(cc); if (ret) return ret; @@ -924,25 +923,6 @@ retry: } } - if (prealloc) { - __do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO, true); - - set_new_dnode(&dn, cc->inode, NULL, NULL, 0); - - for (i = cc->cluster_size - 1; i > 0; i--) { - ret = f2fs_get_block(&dn, start_idx + i); - if (ret) { - i = cc->cluster_size; - break; - } - - if (dn.data_blkaddr != NEW_ADDR) - break; - } - - __do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO, false); - } - if (likely(!ret)) { *fsdata = cc->rpages; *pagep = cc->rpages[offset_in_cluster(cc, index)]; @@ -1330,6 +1310,8 @@ int f2fs_write_multi_pages(struct compress_ctx *cc, err = f2fs_write_compressed_pages(cc, submitted, wbc, io_type); cops->destroy_compress_ctx(cc); + kfree(cc->cpages); + cc->cpages = NULL; if (!err) return 0; f2fs_bug_on(F2FS_I_SB(cc->inode), err != -EAGAIN); diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 505f83700aef..dcd2871d8299 100755 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -1747,9 +1747,12 @@ skip: sync_out: /* for hardware encryption, but to avoid potential issue in future */ - if (flag == F2FS_GET_BLOCK_DIO && map->m_flags & F2FS_MAP_MAPPED) + if (flag == F2FS_GET_BLOCK_DIO && map->m_flags & F2FS_MAP_MAPPED) { f2fs_wait_on_block_writeback_range(inode, map->m_pblk, map->m_len); + invalidate_mapping_pages(META_MAPPING(sbi), + map->m_pblk, map->m_pblk); + } if (flag == F2FS_GET_BLOCK_PRECACHE) { if (map->m_flags & F2FS_MAP_MAPPED) { diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c index 05e9ad91167e..272ea59e1f3e 100755 --- a/fs/f2fs/debug.c +++ b/fs/f2fs/debug.c @@ -145,8 +145,8 @@ static void update_general_status(struct f2fs_sb_info *sbi) si->node_pages = NODE_MAPPING(sbi)->nrpages; if (sbi->meta_inode) si->meta_pages = META_MAPPING(sbi)->nrpages; - si->nats = NM_I(sbi)->nat_cnt; - si->dirty_nats = NM_I(sbi)->dirty_nat_cnt; + si->nats = NM_I(sbi)->nat_cnt[TOTAL_NAT]; + si->dirty_nats = NM_I(sbi)->nat_cnt[DIRTY_NAT]; si->sits = MAIN_SEGS(sbi); si->dirty_sits = SIT_I(sbi)->dirty_sentries; si->free_nids = NM_I(sbi)->nid_cnt[FREE_NID]; @@ -258,9 +258,10 @@ get_cache: si->cache_mem += (NM_I(sbi)->nid_cnt[FREE_NID] + NM_I(sbi)->nid_cnt[PREALLOC_NID]) * sizeof(struct free_nid); - si->cache_mem += NM_I(sbi)->nat_cnt * sizeof(struct nat_entry); - si->cache_mem += NM_I(sbi)->dirty_nat_cnt * - sizeof(struct nat_entry_set); + si->cache_mem += NM_I(sbi)->nat_cnt[TOTAL_NAT] * + sizeof(struct nat_entry); + si->cache_mem += NM_I(sbi)->nat_cnt[DIRTY_NAT] * + sizeof(struct nat_entry_set); si->cache_mem += si->inmem_pages * sizeof(struct inmem_pages); for (i = 0; i < MAX_INO_ENTRY; i++) si->cache_mem += sbi->im[i].ino_num * sizeof(struct ino_entry); diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index a65a4cedd924..cecc97ef033f 100755 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -798,6 +798,7 @@ enum { FI_VERITY_IN_PROGRESS, /* building fs-verity Merkle tree */ FI_COMPRESSED_FILE, /* indicate file's data can be compressed */ FI_MMAP_FILE, /* indicate file was mmapped */ + FI_COMPRESS_RELEASED, /* compressed blocks were released */ FI_MAX, /* max flag, never be used */ }; @@ -850,7 +851,7 @@ struct f2fs_inode_info { struct timespec i_disk_time[4]; /* inode disk times */ /* for file compress */ - u64 i_compr_blocks; /* # of compressed blocks */ + atomic_t i_compr_blocks; /* # of compressed blocks */ unsigned char i_compress_algorithm; /* algorithm type */ unsigned char i_log_cluster_size; /* log of cluster size */ unsigned int i_cluster_size; /* cluster size */ @@ -999,6 +1000,13 @@ enum nid_state { PREALLOC_NID, /* it is preallocated */ MAX_NID_STATE, }; + +enum nat_state { + TOTAL_NAT, + DIRTY_NAT, + RECLAIMABLE_NAT, + MAX_NAT_STATE, +}; struct f2fs_nm_info { block_t nat_blkaddr; /* base disk address of NAT */ @@ -1015,8 +1023,7 @@ struct f2fs_nm_info { struct rw_semaphore nat_tree_lock; /* protect nat_tree_lock */ struct list_head nat_entries; /* cached nat entry list (clean) */ spinlock_t nat_list_lock; /* protect clean nat entry list */ - unsigned int nat_cnt; /* the # of cached nat entries */ - unsigned int dirty_nat_cnt; /* total num of nat entries in set */ + unsigned int nat_cnt[MAX_NAT_STATE]; /* the # of cached nat entries */ unsigned int nat_blocks; /* # of nat blocks */ /* free node ids management */ @@ -2859,6 +2866,7 @@ static inline void __mark_inode_dirty_flag(struct inode *inode, case FI_DATA_EXIST: case FI_INLINE_DOTS: case FI_PIN_FILE: + case FI_COMPRESS_RELEASED: f2fs_mark_inode_dirty_sync(inode, true); } } @@ -2980,6 +2988,8 @@ static inline void get_inline_info(struct inode *inode, struct f2fs_inode *ri) set_bit(FI_EXTRA_ATTR, fi->flags); if (ri->i_inline & F2FS_PIN_FILE) set_bit(FI_PIN_FILE, fi->flags); + if (ri->i_inline & F2FS_COMPRESS_RELEASED) + set_bit(FI_COMPRESS_RELEASED, fi->flags); } static inline void set_raw_inline(struct inode *inode, struct f2fs_inode *ri) @@ -3000,6 +3010,8 @@ static inline void set_raw_inline(struct inode *inode, struct f2fs_inode *ri) ri->i_inline |= F2FS_EXTRA_ATTR; if (is_inode_flag_set(inode, FI_PIN_FILE)) ri->i_inline |= F2FS_PIN_FILE; + if (is_inode_flag_set(inode, FI_COMPRESS_RELEASED)) + ri->i_inline |= F2FS_COMPRESS_RELEASED; } static inline int f2fs_has_extra_attr(struct inode *inode) @@ -4134,17 +4146,19 @@ static inline void set_compress_context(struct inode *inode) f2fs_mark_inode_dirty_sync(inode, true); } -static inline u64 f2fs_disable_compressed_file(struct inode *inode) +static inline u32 f2fs_disable_compressed_file(struct inode *inode) { struct f2fs_inode_info *fi = F2FS_I(inode); + u32 i_compr_blocks; if (!f2fs_compressed_file(inode)) return 0; if (S_ISREG(inode->i_mode)) { if (get_dirty_pages(inode)) return 1; - if (fi->i_compr_blocks) - return fi->i_compr_blocks; + i_compr_blocks = atomic_read(&fi->i_compr_blocks); + if (i_compr_blocks) + return i_compr_blocks; } fi->i_flags &= ~F2FS_COMPR_FL; @@ -4261,16 +4275,17 @@ static inline void f2fs_i_compr_blocks_update(struct inode *inode, u64 blocks, bool add) { int diff = F2FS_I(inode)->i_cluster_size - blocks; + struct f2fs_inode_info *fi = F2FS_I(inode); /* don't update i_compr_blocks if saved blocks were released */ - if (!add && !F2FS_I(inode)->i_compr_blocks) + if (!add && !atomic_read(&fi->i_compr_blocks)) return; if (add) { - F2FS_I(inode)->i_compr_blocks += diff; + atomic_add(diff, &fi->i_compr_blocks); stat_add_compr_blocks(inode, diff); } else { - F2FS_I(inode)->i_compr_blocks -= diff; + atomic_sub(diff, &fi->i_compr_blocks); stat_sub_compr_blocks(inode, diff); } f2fs_mark_inode_dirty_sync(inode, true); diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index a65a2fa4d7f4..d14a9e318dc4 100755 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -62,6 +62,12 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf) bool need_alloc = true; int err = 0; + if (unlikely(IS_IMMUTABLE(inode))) + return VM_FAULT_SIGBUS; + + if (is_inode_flag_set(inode, FI_COMPRESS_RELEASED)) + return VM_FAULT_SIGBUS; + if (unlikely(f2fs_cp_error(sbi))) { err = -EIO; goto err; @@ -80,10 +86,6 @@ static int f2fs_vm_page_mkwrite(struct vm_fault *vmf) err = ret; goto err; } else if (ret) { - if (ret < F2FS_I(inode)->i_cluster_size) { - err = -EAGAIN; - goto err; - } need_alloc = false; } } @@ -599,7 +601,7 @@ void f2fs_truncate_data_blocks_range(struct dnode_of_data *dn, int count) bool compressed_cluster = false; int cluster_index = 0, valid_blocks = 0; int cluster_size = F2FS_I(dn->inode)->i_cluster_size; - bool released = !F2FS_I(dn->inode)->i_compr_blocks; + bool released = !atomic_read(&F2FS_I(dn->inode)->i_compr_blocks); if (IS_INODE(dn->node_page) && f2fs_has_extra_attr(dn->inode)) base = get_extra_isize(dn->inode); @@ -914,6 +916,14 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr) if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) return -EIO; + if (unlikely(IS_IMMUTABLE(inode))) + return -EPERM; + + if (unlikely(IS_APPEND(inode) && + (attr->ia_valid & (ATTR_MODE | ATTR_UID | + ATTR_GID | ATTR_TIMES_SET)))) + return -EPERM; + if ((attr->ia_valid & ATTR_SIZE) && !f2fs_is_compress_backend_ready(inode)) return -EOPNOTSUPP; @@ -3414,7 +3424,7 @@ static int f2fs_get_compress_blocks(struct file *filp, unsigned long arg) if (!f2fs_compressed_file(inode)) return -EINVAL; - blocks = F2FS_I(inode)->i_compr_blocks; + blocks = atomic_read(&F2FS_I(inode)->i_compr_blocks); return put_user(blocks, (u64 __user *)arg); } @@ -3504,7 +3514,7 @@ static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg) goto out; } - if (IS_IMMUTABLE(inode)) { + if (is_inode_flag_set(inode, FI_COMPRESS_RELEASED)) { ret = -EINVAL; goto out; } @@ -3513,14 +3523,13 @@ static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg) if (ret) goto out; - if (!F2FS_I(inode)->i_compr_blocks) - goto out; - - F2FS_I(inode)->i_flags |= F2FS_IMMUTABLE_FL; - f2fs_set_inode_flags(inode); + set_inode_flag(inode, FI_COMPRESS_RELEASED); inode->i_ctime = current_time(inode); f2fs_mark_inode_dirty_sync(inode, true); + if (!atomic_read(&F2FS_I(inode)->i_compr_blocks)) + goto out; + down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); down_write(&F2FS_I(inode)->i_mmap_sem); @@ -3566,14 +3575,15 @@ out: if (ret >= 0) { ret = put_user(released_blocks, (u64 __user *)arg); - } else if (released_blocks && F2FS_I(inode)->i_compr_blocks) { + } else if (released_blocks && + atomic_read(&F2FS_I(inode)->i_compr_blocks)) { set_sbi_flag(sbi, SBI_NEED_FSCK); f2fs_warn(sbi, "%s: partial blocks were released i_ino=%lx " - "iblocks=%llu, released=%u, compr_blocks=%llu, " + "iblocks=%llu, released=%u, compr_blocks=%u, " "run fsck to fix.", __func__, inode->i_ino, (u64)inode->i_blocks, released_blocks, - F2FS_I(inode)->i_compr_blocks); + atomic_read(&F2FS_I(inode)->i_compr_blocks)); } return ret; @@ -3661,14 +3671,14 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg) if (ret) return ret; - if (F2FS_I(inode)->i_compr_blocks) + if (atomic_read(&F2FS_I(inode)->i_compr_blocks)) goto out; f2fs_balance_fs(F2FS_I_SB(inode), true); inode_lock(inode); - if (!IS_IMMUTABLE(inode)) { + if (!is_inode_flag_set(inode, FI_COMPRESS_RELEASED)) { ret = -EINVAL; goto unlock_inode; } @@ -3713,8 +3723,7 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg) up_write(&F2FS_I(inode)->i_mmap_sem); if (ret >= 0) { - F2FS_I(inode)->i_flags &= ~F2FS_IMMUTABLE_FL; - f2fs_set_inode_flags(inode); + clear_inode_flag(inode, FI_COMPRESS_RELEASED); inode->i_ctime = current_time(inode); f2fs_mark_inode_dirty_sync(inode, true); } @@ -3725,14 +3734,15 @@ out: if (ret >= 0) { ret = put_user(reserved_blocks, (u64 __user *)arg); - } else if (reserved_blocks && F2FS_I(inode)->i_compr_blocks) { + } else if (reserved_blocks && + atomic_read(&F2FS_I(inode)->i_compr_blocks)) { set_sbi_flag(sbi, SBI_NEED_FSCK); f2fs_warn(sbi, "%s: partial blocks were released i_ino=%lx " - "iblocks=%llu, reserved=%u, compr_blocks=%llu, " + "iblocks=%llu, reserved=%u, compr_blocks=%u, " "run fsck to fix.", __func__, inode->i_ino, (u64)inode->i_blocks, reserved_blocks, - F2FS_I(inode)->i_compr_blocks); + atomic_read(&F2FS_I(inode)->i_compr_blocks)); } return ret; @@ -3762,7 +3772,7 @@ static int f2fs_ioc_stat_compress_file(struct file *filp, unsigned long arg) compStat.st_blocks = inode->i_blocks; if (unlikely(f2fs_compressed_file(inode))) { - compStat.st_compressed_blocks = F2FS_I(inode)->i_compr_blocks; + compStat.st_compressed_blocks = atomic_read(&F2FS_I(inode)->i_compr_blocks); compStat.out_compressed = 1; } else { compStat.out_compressed = 0; @@ -3935,6 +3945,16 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) inode_lock(inode); } + if (unlikely(IS_IMMUTABLE(inode))) { + ret = -EPERM; + goto unlock; + } + + if (is_inode_flag_set(inode, FI_COMPRESS_RELEASED)) { + ret = -EPERM; + goto unlock; + } + ret = generic_write_checks(iocb, from); if (ret > 0) { bool preallocated = false; @@ -3999,6 +4019,7 @@ write: if (ret > 0) f2fs_update_iostat(F2FS_I_SB(inode), APP_WRITE_IO, ret); } +unlock: inode_unlock(inode); out: trace_f2fs_file_write_iter(inode, iocb->ki_pos, diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 0a64391bde83..6bbc45bab494 100755 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -448,7 +448,8 @@ static int do_read_inode(struct inode *inode) (fi->i_flags & F2FS_COMPR_FL)) { if (F2FS_FITS_IN_INODE(ri, fi->i_extra_isize, i_log_cluster_size)) { - fi->i_compr_blocks = le64_to_cpu(ri->i_compr_blocks); + atomic_set(&fi->i_compr_blocks, + le64_to_cpu(ri->i_compr_blocks)); fi->i_compress_algorithm = ri->i_compress_algorithm; fi->i_log_cluster_size = ri->i_log_cluster_size; fi->i_cluster_size = 1 << fi->i_log_cluster_size; @@ -473,7 +474,7 @@ static int do_read_inode(struct inode *inode) stat_inc_inline_inode(inode); stat_inc_inline_dir(inode); stat_inc_compr_inode(inode); - stat_add_compr_blocks(inode, F2FS_I(inode)->i_compr_blocks); + stat_add_compr_blocks(inode, atomic_read(&fi->i_compr_blocks)); return 0; } @@ -632,7 +633,8 @@ void f2fs_update_inode(struct inode *inode, struct page *node_page) F2FS_FITS_IN_INODE(ri, F2FS_I(inode)->i_extra_isize, i_log_cluster_size)) { ri->i_compr_blocks = - cpu_to_le64(F2FS_I(inode)->i_compr_blocks); + cpu_to_le64(atomic_read( + &F2FS_I(inode)->i_compr_blocks)); ri->i_compress_algorithm = F2FS_I(inode)->i_compress_algorithm; ri->i_log_cluster_size = @@ -781,7 +783,8 @@ no_delete: stat_dec_inline_dir(inode); stat_dec_inline_inode(inode); stat_dec_compr_inode(inode); - stat_sub_compr_blocks(inode, F2FS_I(inode)->i_compr_blocks); + stat_sub_compr_blocks(inode, + atomic_read(&F2FS_I(inode)->i_compr_blocks)); if (likely(!is_set_ckpt_flags(sbi, CP_ERROR_FLAG) && !is_sbi_flag_set(sbi, SBI_CP_DISABLED))) diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index d9d139ab908a..fae53020680e 100755 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -62,8 +62,8 @@ bool f2fs_available_free_memory(struct f2fs_sb_info *sbi, int type) sizeof(struct free_nid)) >> PAGE_SHIFT; res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 2); } else if (type == NAT_ENTRIES) { - mem_size = (nm_i->nat_cnt * sizeof(struct nat_entry)) >> - PAGE_SHIFT; + mem_size = (nm_i->nat_cnt[TOTAL_NAT] * + sizeof(struct nat_entry)) >> PAGE_SHIFT; res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 2); if (excess_cached_nats(sbi)) res = false; @@ -177,7 +177,8 @@ static struct nat_entry *__init_nat_entry(struct f2fs_nm_info *nm_i, list_add_tail(&ne->list, &nm_i->nat_entries); spin_unlock(&nm_i->nat_list_lock); - nm_i->nat_cnt++; + nm_i->nat_cnt[TOTAL_NAT]++; + nm_i->nat_cnt[RECLAIMABLE_NAT]++; return ne; } @@ -207,7 +208,8 @@ static unsigned int __gang_lookup_nat_cache(struct f2fs_nm_info *nm_i, static void __del_from_nat_cache(struct f2fs_nm_info *nm_i, struct nat_entry *e) { radix_tree_delete(&nm_i->nat_root, nat_get_nid(e)); - nm_i->nat_cnt--; + nm_i->nat_cnt[TOTAL_NAT]--; + nm_i->nat_cnt[RECLAIMABLE_NAT]--; __free_nat_entry(e); } @@ -253,7 +255,8 @@ static void __set_nat_cache_dirty(struct f2fs_nm_info *nm_i, if (get_nat_flag(ne, IS_DIRTY)) goto refresh_list; - nm_i->dirty_nat_cnt++; + nm_i->nat_cnt[DIRTY_NAT]++; + nm_i->nat_cnt[RECLAIMABLE_NAT]--; set_nat_flag(ne, IS_DIRTY, true); refresh_list: spin_lock(&nm_i->nat_list_lock); @@ -273,7 +276,8 @@ static void __clear_nat_cache_dirty(struct f2fs_nm_info *nm_i, set_nat_flag(ne, IS_DIRTY, false); set->entry_cnt--; - nm_i->dirty_nat_cnt--; + nm_i->nat_cnt[DIRTY_NAT]--; + nm_i->nat_cnt[RECLAIMABLE_NAT]++; } static unsigned int __gang_lookup_nat_set(struct f2fs_nm_info *nm_i, @@ -3015,14 +3019,17 @@ int f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc) LIST_HEAD(sets); int err = 0; - /* during unmount, let's flush nat_bits before checking dirty_nat_cnt */ + /* + * during unmount, let's flush nat_bits before checking + * nat_cnt[DIRTY_NAT]. + */ if (enabled_nat_bits(sbi, cpc)) { down_write(&nm_i->nat_tree_lock); remove_nats_in_journal(sbi); up_write(&nm_i->nat_tree_lock); } - if (!nm_i->dirty_nat_cnt) + if (!nm_i->nat_cnt[DIRTY_NAT]) return 0; down_write(&nm_i->nat_tree_lock); @@ -3033,7 +3040,8 @@ int f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc) * into nat entry set. */ if (enabled_nat_bits(sbi, cpc) || - !__has_cursum_space(journal, nm_i->dirty_nat_cnt, NAT_JOURNAL)) + !__has_cursum_space(journal, + nm_i->nat_cnt[DIRTY_NAT], NAT_JOURNAL)) remove_nats_in_journal(sbi); while ((found = __gang_lookup_nat_set(nm_i, @@ -3157,7 +3165,6 @@ static int init_node_manager(struct f2fs_sb_info *sbi) F2FS_RESERVED_NODE_NUM; nm_i->nid_cnt[FREE_NID] = 0; nm_i->nid_cnt[PREALLOC_NID] = 0; - nm_i->nat_cnt = 0; nm_i->ram_thresh = DEF_RAM_THRESHOLD; nm_i->ra_nid_pages = DEF_RA_NID_PAGES; nm_i->dirty_nats_ratio = DEF_DIRTY_NAT_RATIO_THRESHOLD; @@ -3294,7 +3301,7 @@ void f2fs_destroy_node_manager(struct f2fs_sb_info *sbi) __del_from_nat_cache(nm_i, natvec[idx]); } } - f2fs_bug_on(sbi, nm_i->nat_cnt); + f2fs_bug_on(sbi, nm_i->nat_cnt[TOTAL_NAT]); /* destroy nat set cache */ nid = 0; diff --git a/fs/f2fs/node.h b/fs/f2fs/node.h index 69e5859e993c..f84541b57acb 100755 --- a/fs/f2fs/node.h +++ b/fs/f2fs/node.h @@ -126,13 +126,13 @@ static inline void raw_nat_from_node_info(struct f2fs_nat_entry *raw_ne, static inline bool excess_dirty_nats(struct f2fs_sb_info *sbi) { - return NM_I(sbi)->dirty_nat_cnt >= NM_I(sbi)->max_nid * + return NM_I(sbi)->nat_cnt[DIRTY_NAT] >= NM_I(sbi)->max_nid * NM_I(sbi)->dirty_nats_ratio / 100; } static inline bool excess_cached_nats(struct f2fs_sb_info *sbi) { - return NM_I(sbi)->nat_cnt >= DEF_NAT_CACHE_THRESHOLD; + return NM_I(sbi)->nat_cnt[TOTAL_NAT] >= DEF_NAT_CACHE_THRESHOLD; } static inline bool excess_dirty_nodes(struct f2fs_sb_info *sbi) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 385e5e1de86b..2ee64bd9eb5a 100755 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -3336,6 +3336,9 @@ int f2fs_inplace_write_data(struct f2fs_io_info *fio) return -EFSCORRUPTED; } + invalidate_mapping_pages(META_MAPPING(sbi), + fio->new_blkaddr, fio->new_blkaddr); + stat_inc_inplace_blocks(fio->sbi); atomic64_inc(&(sbi->sec_stat.inplace_count)); diff --git a/fs/f2fs/shrinker.c b/fs/f2fs/shrinker.c index d66de5999a26..dd3c3c7a90ec 100755 --- a/fs/f2fs/shrinker.c +++ b/fs/f2fs/shrinker.c @@ -18,9 +18,7 @@ static unsigned int shrinker_run_no; static unsigned long __count_nat_entries(struct f2fs_sb_info *sbi) { - long count = NM_I(sbi)->nat_cnt - NM_I(sbi)->dirty_nat_cnt; - - return count > 0 ? count : 0; + return NM_I(sbi)->nat_cnt[RECLAIMABLE_NAT]; } static unsigned long __count_free_nids(struct f2fs_sb_info *sbi) diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 1190aee3e25d..8d6b46a87a45 100755 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "f2fs.h" #include "node.h" @@ -1121,6 +1122,7 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb) it will be reinitialize after a reboot.*/ fi->vfs_inode.i_version = 1; atomic_set(&fi->dirty_pages, 0); + atomic_set(&fi->i_compr_blocks, 0); init_rwsem(&fi->i_sem); spin_lock_init(&fi->i_size_lock); INIT_LIST_HEAD(&fi->dirty_list); @@ -4007,6 +4009,7 @@ reset_checkpoint: f2fs_update_time(sbi, CP_TIME); f2fs_update_time(sbi, REQ_TIME); clear_sbi_flag(sbi, SBI_CP_DISABLED_QUICK); + cleancache_init_fs(sbi->sb); return 0; sync_free_meta: diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 01e6100e2889..e98b973e856d 100755 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c @@ -1250,7 +1250,7 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file, /* @fs.sec -- 6101dd42ae34a95fe90de8d0463135d3d84a2558 -- */ if ((current->flags & PF_NOFREEZE) == 0) { - current->flags |= PF_NOFREEZE; + current->flags |= PF_NOFREEZE | PF_MEMALLOC_NOFS; printk_ratelimited(KERN_WARNING "%s(%d): This thread should not be frozen\n", current->comm, task_pid_nr(current)); } diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 49a24ecfb247..9c1843c0ccdc 100755 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -17,6 +17,7 @@ #include #include #include +#include #include static const struct file_operations fuse_direct_io_file_operations; @@ -415,9 +416,6 @@ static int fuse_flush(struct file *file, fl_owner_t id) if (is_bad_inode(inode)) return -EIO; - if (fc->no_flush) - return 0; - err = write_inode_now(inode, 1); if (err) return err; @@ -430,6 +428,9 @@ static int fuse_flush(struct file *file, fl_owner_t id) if (err) return err; + if (fc->no_flush) + return 0; + req = fuse_get_req_nofail_nopages(fc, file); memset(&inarg, 0, sizeof(inarg)); inarg.fh = ff->fh; @@ -1624,12 +1625,15 @@ int fuse_write_inode(struct inode *inode, struct writeback_control *wbc) struct fuse_inode *fi = get_fuse_inode(inode); struct fuse_file *ff; int err; + /* @fs.sec -- E8B3F75DDB82DFE8F52508F039ABE4FF -- */ + unsigned int nofs_flag = memalloc_nofs_save(); ff = __fuse_write_file_get(fc, fi); err = fuse_flush_times(inode, ff); if (ff) fuse_file_put(ff, false, false); + memalloc_nofs_restore(nofs_flag); return err; } diff --git a/fs/quota/quota_tree.c b/fs/quota/quota_tree.c index bb3f59bcfcf5..656f9ff63edd 100755 --- a/fs/quota/quota_tree.c +++ b/fs/quota/quota_tree.c @@ -61,7 +61,7 @@ static ssize_t read_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf) memset(buf, 0, info->dqi_usable_bs); return sb->s_op->quota_read(sb, info->dqi_type, buf, - info->dqi_usable_bs, blk << info->dqi_blocksize_bits); + info->dqi_usable_bs, (loff_t)blk << info->dqi_blocksize_bits); } static ssize_t write_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf) @@ -70,7 +70,7 @@ static ssize_t write_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf) ssize_t ret; ret = sb->s_op->quota_write(sb, info->dqi_type, buf, - info->dqi_usable_bs, blk << info->dqi_blocksize_bits); + info->dqi_usable_bs, (loff_t)blk << info->dqi_blocksize_bits); if (ret != info->dqi_usable_bs) { quota_error(sb, "dquota write failed"); if (ret >= 0) @@ -283,7 +283,7 @@ static uint find_free_dqentry(struct qtree_mem_dqinfo *info, blk); goto out_buf; } - dquot->dq_off = (blk << info->dqi_blocksize_bits) + + dquot->dq_off = ((loff_t)blk << info->dqi_blocksize_bits) + sizeof(struct qt_disk_dqdbheader) + i * info->dqi_entry_size; kfree(buf); @@ -558,7 +558,7 @@ static loff_t find_block_dqentry(struct qtree_mem_dqinfo *info, ret = -EIO; goto out_buf; } else { - ret = (blk << info->dqi_blocksize_bits) + sizeof(struct + ret = ((loff_t)blk << info->dqi_blocksize_bits) + sizeof(struct qt_disk_dqdbheader) + i * info->dqi_entry_size; } out_buf: diff --git a/fs/quota/quota_v2.c b/fs/quota/quota_v2.c index a73e5b34db41..2f02474a2825 100755 --- a/fs/quota/quota_v2.c +++ b/fs/quota/quota_v2.c @@ -158,6 +158,25 @@ static int v2_read_file_info(struct super_block *sb, int type) qinfo->dqi_entry_size = sizeof(struct v2r1_disk_dqblk); qinfo->dqi_ops = &v2r1_qtree_ops; } + ret = -EUCLEAN; + /* Some sanity checks of the read headers... */ + if ((loff_t)qinfo->dqi_blocks << qinfo->dqi_blocksize_bits > + i_size_read(sb_dqopt(sb)->files[type])) { + quota_error(sb, "Number of blocks too big for quota file size (%llu > %llu).", + (loff_t)qinfo->dqi_blocks << qinfo->dqi_blocksize_bits, + i_size_read(sb_dqopt(sb)->files[type])); + goto out; + } + if (qinfo->dqi_free_blk >= qinfo->dqi_blocks) { + quota_error(sb, "Free block number too big (%u >= %u).", + qinfo->dqi_free_blk, qinfo->dqi_blocks); + goto out; + } + if (qinfo->dqi_free_entry >= qinfo->dqi_blocks) { + quota_error(sb, "Block with free entry too big (%u >= %u).", + qinfo->dqi_free_entry, qinfo->dqi_blocks); + goto out; + } ret = 0; out: up_read(&dqopt->dqio_sem); diff --git a/fs/signalfd.c b/fs/signalfd.c index 1c667af86da5..0b7c6c2c95b8 100755 --- a/fs/signalfd.c +++ b/fs/signalfd.c @@ -35,17 +35,7 @@ void signalfd_cleanup(struct sighand_struct *sighand) { - wait_queue_head_t *wqh = &sighand->signalfd_wqh; - /* - * The lockless check can race with remove_wait_queue() in progress, - * but in this case its caller should run under rcu_read_lock() and - * sighand_cachep is SLAB_TYPESAFE_BY_RCU, we can safely return. - */ - if (likely(!waitqueue_active(wqh))) - return; - - /* wait_queue_entry_t->func(POLLFREE) should do remove_wait_queue() */ - wake_up_poll(wqh, POLLHUP | POLLFREE); + wake_up_pollfree(&sighand->signalfd_wqh); } struct signalfd_ctx { diff --git a/include/linux/adsp/adsp_ft_common.h b/include/linux/adsp/adsp_ft_common.h index 737866bddca2..d8d2eccff293 100755 --- a/include/linux/adsp/adsp_ft_common.h +++ b/include/linux/adsp/adsp_ft_common.h @@ -134,4 +134,18 @@ enum { }; #endif +// for ssc_core sensor type +enum { + OPTION_TYPE_SSC_CHARGING_STATE, // for pocket mode + OPTION_TYPE_SSC_ABS_LCD_TYPE, // for pocket mode + OPTION_TYPE_SSC_LCD_TYPE, // for pocket mode + auto roation + OPTION_TYPE_SSC_LCD_INTENT_TYPE, // for auto rotation + OPTION_TYPE_SSC_DUMP_TYPE, // for pocket mode + OPTION_TYPE_SSC_AOD_RECT, // for AOD + OPTION_TYPE_SSC_AOD_LIGHT_CIRCLE, // for AOD + OPTION_TYPE_SSC_LIGHT_SEAMLESS, // for light seamless + OPTION_TYPE_SSC_AUTO_ROTATION_MODE, // for auto rotation + OPTION_TYPE_SSC_SBM_INIT, // for sar backoff motion + OPTION_TYPE_SSC_MAX +}; #endif diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h index 608efe564607..ecd18d2dfc2b 100755 --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h @@ -162,7 +162,13 @@ enum { BLK_MQ_F_TAG_SHARED = 1 << 1, BLK_MQ_F_SG_MERGE = 1 << 2, BLK_MQ_F_BLOCKING = 1 << 5, + /* Do not allow an I/O scheduler to be configured. */ BLK_MQ_F_NO_SCHED = 1 << 6, + /* + * Select 'none' during queue registration in case of a single hwq + * or shared hwqs instead of 'mq-deadline'. + */ + BLK_MQ_F_NO_SCHED_BY_DEFAULT = 1 << 7, BLK_MQ_F_ALLOC_POLICY_START_BIT = 8, BLK_MQ_F_ALLOC_POLICY_BITS = 1, diff --git a/include/linux/dbmdx.h b/include/linux/dbmdx.h new file mode 100755 index 000000000000..89103799b08d --- /dev/null +++ b/include/linux/dbmdx.h @@ -0,0 +1,133 @@ +/* + * dbmdx-interface.h -- DBMDX interface definitions + * + * Copyright (C) 2014 DSP Group + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _DBMDX_H +#define _DBMDX_H + +#include +#include + +#define MAX_NUM_OF_INTERFACES 4 + +enum dbmdx_va_speeds { + DBMDX_VA_SPEED_NORMAL = 0, + DBMDX_VA_SPEED_BUFFERING, + DBMDX_VA_SPEED_MAX, + DBMDX_VA_NR_OF_SPEEDS, +}; + +struct va_speed { + u32 cfg; + u32 uart_baud; + u32 i2c_rate; + u32 spi_rate; +}; + +enum dbmdx_clocks { + DBMDX_CLK_CONSTANT = 0, + DBMDX_CLK_MASTER, + DBMDX_NR_OF_CLKS, +}; + +enum dbmdx_interface_type { + DBMDX_PREBOOT_INTERFACE = 0, + DBMDX_BOOT_INTERFACE, + DBMDX_CMD_INTERFACE, + DBMDX_DEBUG_INTERFACE, + DBMDX_MAX_INTERFACES, +}; + +struct dbmdx_platform_data { + int gpio_wakeup; + int gpio_reset; + int gpio_sv; + int gpio_d2strap1; + int gpio_d2strap1_rst_val; + int wakeup_disabled; + int wakeup_set_value; + int send_wakeup_seq; + int use_gpio_for_wakeup; + + const char *cd_interfaces[MAX_NUM_OF_INTERFACES]; + const char *va_firmware_name; + const char *va_preboot_firmware_name; + const char *vqe_firmware_name; + const char *vqe_non_overlay_firmware_name; +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + const char *va_asrp_params_firmware_name; +#endif + int firmware_id; + + int clock_rates[DBMDX_NR_OF_CLKS]; + + int feature_va; + int feature_vqe; + int feature_fw_overlay; + + unsigned int va_cfg_values; + u32 *va_cfg_value; + +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + unsigned int va_ns_supported; + unsigned int mic_config_source; + unsigned int va_ns_cfg_values; + unsigned int va_ns_num_of_configs; + u32 *va_ns_cfg_value; +#endif + + unsigned int vqe_cfg_values; + u32 *vqe_cfg_value; + unsigned int vqe_modes_values; + u32 *vqe_modes_value; + + int auto_buffering; + int auto_detection; + int detection_after_buffering; + int send_uevent_on_detection; + int send_uevent_after_buffering; + int uart_low_speed_enabled; + u32 va_backlog_length; + u32 va_backlog_length_okg; + + int max_detection_buffer_size; + + int detection_buffer_channels; + u32 min_samples_chunk_size; + u32 pcm_streaming_mode; + int buffering_timeout; + u32 retrigger_interval_sec; + + struct va_speed va_speed_cfg[DBMDX_VA_NR_OF_SPEEDS]; + u32 va_mic_config[5]; + u32 va_initial_mic_config; + u32 va_mic_gain_config[3]; + int va_audio_channels; + u32 vqe_tdm_bypass_config; + unsigned int va_buffering_pcm_rate; + + unsigned int va_recovery_disabled; + u32 multi_interface_support; + u32 boot_options; + u32 amodel_options; + + int va_interfaces[DBMDX_MAX_INTERFACES]; + int vqe_interfaces[DBMDX_MAX_INTERFACES]; + +}; + +int dbmdx_get_samples(struct snd_soc_codec *codec, + char *buffer, unsigned int samples); +int dbmdx_codec_lock(struct snd_soc_codec *codec); +int dbmdx_start_pcm_streaming(struct snd_soc_codec *codec, + struct snd_pcm_substream *substream); +int dbmdx_stop_pcm_streaming(struct snd_soc_codec *codec); +int dbmdx_codec_unlock(struct snd_soc_codec *component); + +#endif diff --git a/include/linux/defex.h b/include/linux/defex.h index 8fa60cc7e9d4..cd3d08f83394 100755 --- a/include/linux/defex.h +++ b/include/linux/defex.h @@ -10,7 +10,7 @@ #define __CONFIG_SECURITY_DEFEX_H /* Defex init API */ -int task_defex_enforce(struct task_struct *p, struct file *f, int syscall); +int task_defex_enforce(struct task_struct *p, struct file *f, int syscall, ...); int task_defex_zero_creds(struct task_struct *tsk); void __init defex_load_rules(void); #endif /* CONFIG_SECURITY_DEFEX_H */ diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h index 4fcdcdbb5e50..933b4e952a3d 100755 --- a/include/linux/f2fs_fs.h +++ b/include/linux/f2fs_fs.h @@ -230,6 +230,7 @@ struct f2fs_extent { #define F2FS_INLINE_DOTS 0x10 /* file having implicit dot dentries */ #define F2FS_EXTRA_ATTR 0x20 /* file having extra attribute */ #define F2FS_PIN_FILE 0x40 /* file should not be gced */ +#define F2FS_COMPRESS_RELEASED 0x80 /* file released compressed blocks */ struct f2fs_inode { __le16 i_mode; /* file mode */ diff --git a/include/linux/hid.h b/include/linux/hid.h index 3b2a782de69a..7943870595a7 100755 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -806,6 +806,11 @@ static inline bool hid_is_using_ll_driver(struct hid_device *hdev, return hdev->ll_driver == driver; } +static inline bool hid_is_usb(struct hid_device *hdev) +{ + return hid_is_using_ll_driver(hdev, &usb_hid_driver); +} + #define PM_HINT_FULLON 1<<5 #define PM_HINT_NORMAL 1<<1 diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index 7e9f59aeadb6..ecf1510f6639 100755 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -1170,22 +1170,22 @@ * * @binder_set_context_mgr: * Check whether @mgr is allowed to be the binder context manager. - * @mgr contains the task_struct for the task being registered. + * @mgr contains the struct cred for the current binder process. * Return 0 if permission is granted. * @binder_transaction: * Check whether @from is allowed to invoke a binder transaction call * to @to. - * @from contains the task_struct for the sending task. - * @to contains the task_struct for the receiving task. + * @from contains the struct cred for the sending process. + * @to contains the struct cred for the receiving process. * @binder_transfer_binder: * Check whether @from is allowed to transfer a binder reference to @to. - * @from contains the task_struct for the sending task. - * @to contains the task_struct for the receiving task. + * @from contains the struct cred for the sending process. + * @to contains the struct cred for the receiving process. * @binder_transfer_file: * Check whether @from is allowed to transfer @file to @to. - * @from contains the task_struct for the sending task. + * @from contains the struct cred for the sending process. * @file contains the struct file being transferred. - * @to contains the task_struct for the receiving task. + * @to contains the struct cred for the receiving process. * * @ptrace_access_check: * Check permission before allowing the current process to trace the @@ -1387,13 +1387,13 @@ * */ union security_list_options { - int (*binder_set_context_mgr)(struct task_struct *mgr); - int (*binder_transaction)(struct task_struct *from, - struct task_struct *to); - int (*binder_transfer_binder)(struct task_struct *from, - struct task_struct *to); - int (*binder_transfer_file)(struct task_struct *from, - struct task_struct *to, + int (*binder_set_context_mgr)(const struct cred *mgr); + int (*binder_transaction)(const struct cred *from, + const struct cred *to); + int (*binder_transfer_binder)(const struct cred *from, + const struct cred *to); + int (*binder_transfer_file)(const struct cred *from, + const struct cred *to, struct file *file); int (*ptrace_access_check)(struct task_struct *child, diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 6438ac93203c..94b1caa45741 100755 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -693,7 +693,9 @@ struct mmc_host { bool sdr104_wa; unsigned int card_detect_cnt; - +#if defined(CONFIG_SEC_ABC) + unsigned int card_removed_cnt; +#endif /* * Set to 1 to just stop the SDCLK to the card without * actually disabling the clock from it's source. diff --git a/include/linux/muic/common/muic.h b/include/linux/muic/common/muic.h index b869e05ead76..92df62609db7 100755 --- a/include/linux/muic/common/muic.h +++ b/include/linux/muic/common/muic.h @@ -25,6 +25,10 @@ #ifndef __MUIC_H__ #define __MUIC_H__ +#define SIOP (1 << 0) +#define AFC_REQUEST_CHARGER SIOP +#define FLED (1 << 1) + #define MUIC_CORE "MUIC_CORE" /* Status of IF PMIC chip (suspend and resume) */ enum { @@ -315,6 +319,8 @@ struct muic_platform_data { #if defined(CONFIG_NOVBUS_MUIC) int usb_en_gpio; #endif + /* muic request afc cause */ + int afc_request_cause; /* muic switch dev register function for DockObserver */ void (*init_switch_dev_cb) (void); @@ -541,6 +547,9 @@ int muic_set_hiccup_mode(int on_off); int muic_hv_charger_init(void); extern int muic_afc_set_voltage(int voltage); +extern int muic_afc_request_voltage(int cause, int voltage); +extern int muic_afc_request_cause_clear(void); +extern int muic_afc_request_voltage_check(int cause, int vol); void muic_set_hmt_status(int status); int muic_core_handle_attach(struct muic_platform_data *muic_pdata, muic_attached_dev_t new_dev, int adc, u8 vbvolt); diff --git a/include/linux/olog.pb.h b/include/linux/olog.pb.h new file mode 100755 index 000000000000..745214eb3c2e --- /dev/null +++ b/include/linux/olog.pb.h @@ -0,0 +1,82 @@ +// Generated by the protocol buffer compiler for perflog!! DO NOT EDIT! +#ifndef _OLOG_PROTOCOL_BUFFER_H_ +#define _OLOG_PROTOCOL_BUFFER_H_ + +//EnumGenerator::GenerateDefinition in perflog_enum.cc +enum OlogTestEnum_Type { + PERFLOG_DEF = 0, + PERFLOG_LOG = 1, + PERFLOG_EVT = 2, + PERFLOG_WRN = 3, + PERFLOG_CRI = 4 +}; +#if defined(KPERFMON_KERNEL) +int OlogTestEnum_Type_maxnum = 5; +char * OlogTestEnum_Type_strings[5] = { + "DEF", + "LOG", + "EVT", + "WRN", + "CRI" +}; +#endif //KPERFMON_KERNEL +//EnumGenerator::GenerateDefinition in perflog_enum.cc +enum OlogTestEnum_ID { + PERFLOG_UNKNOWN = 0, + PERFLOG_LCDV = 2, + PERFLOG_ARGOS = 3, + PERFLOG_APPLAUNCH = 4, + PERFLOG_LOADAPK = 5, + PERFLOG_MAINLOOPER = 6, + PERFLOG_EXCESSIVECPUUSAGE = 7, + PERFLOG_ACTIVITYSLOW = 8, + PERFLOG_BROADCAST = 9, + PERFLOG_STORE = 10, + PERFLOG_CPUTOP = 11, + PERFLOG_LCD = 12, + PERFLOG_CPU = 13, + PERFLOG_LOCKCONTENTION = 14, + PERFLOG_CPUFREQ = 15, + PERFLOG_MEMPRESSURE = 16, + PERFLOG_INPUTD = 17, + PERFLOG_AMPSS = 18, + PERFLOG_SERVICEMANAGERSLOW = 19, + PERFLOG_IPCSTARVE = 20, + PERFLOG_SCREENSHOT = 21, + PERFLOG_MUTEX = 22, + PERFLOG_SYSTEMSERVER = 23, + PERFLOG_PERFETTOLOGGINGENABLED = 24 +}; +#if defined(KPERFMON_KERNEL) +int OlogTestEnum_ID_maxnum = 25; +char * OlogTestEnum_ID_strings[25] = { + "UNKNOWN", + " ", + "LCDV", + "ARGOS", + "APPLAUNCH", + "LOADAPK", + "MAINLOOPER", + "EXCESSIVECPUUSAGE", + "ACTIVITYSLOW", + "BROADCAST", + "STORE", + "CPUTOP", + "LCD", + "CPU", + "LOCKCONTENTION", + "CPUFREQ", + "MEMPRESSURE", + "INPUTD", + "AMPSS", + "SERVICEMANAGERSLOW", + "IPCSTARVE", + "SCREENSHOT", + "MUTEX", + "SYSTEMSERVER", + "PERFETTOLOGGINGENABLED" +}; +#endif //KPERFMON_KERNEL + +#endif //_OLOG_PROTOCOL_BUFFER_H_ + diff --git a/include/linux/ologk.h b/include/linux/ologk.h index e20e136b1ac3..0af51d89eb10 100755 --- a/include/linux/ologk.h +++ b/include/linux/ologk.h @@ -2,12 +2,14 @@ #define _OLOG_KERNEL_H_ #include +#include "olog.pb.h" #define OLOG_CPU_FREQ_FILTER 1500000 #define PERFLOG_MUTEX_THRESHOLD 20 -#define ologk(...) -#define perflog(...) -#define perflog_evt(...) +#define ologk(...) _perflog(PERFLOG_LOG, PERFLOG_UNKNOWN, __VA_ARGS__) +#define perflog(...) _perflog(PERFLOG_LOG, __VA_ARGS__) +extern void _perflog(int type, int logid, const char *fmt, ...); +extern void perflog_evt(int logid, int arg1); #endif diff --git a/include/linux/perflog.h b/include/linux/perflog.h new file mode 100755 index 000000000000..75d41de3a85e --- /dev/null +++ b/include/linux/perflog.h @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * System performance team / System Group + * + * All right reserved. This software is the confidential and proprietary + * information of Samsung Electronics ("Confidential Information"). + * You shall not disclose such Confidential Information and shall use it + * only in accordance with the terms of the license agreement you + * entered into with Samsung Electronics. + */ + +#ifndef PERFLOG_H_ +#define PERFLOG_H_ + +#define PERFLOG_LOC __FILE__, __LINE__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "olog.pb.h" + +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef unsigned int uint32; + +// extern FILE* perflog_fout; +#define PERFLOG_PACKET_SIZE 256 +#define PERFLOG_HEADER_SIZE 24 +#define PERFLOG_BUFF_STR_MAX_SIZE (PERFLOG_PACKET_SIZE - PERFLOG_HEADER_SIZE) +#define PERFLOG_BUFF_STR_MAX_SIZE_FOR_MULTILINE 4096 +#define PERFLOG_BUFF_STR_MAX_SIZE_FOR_EVTI PERFLOG_BUFF_STR_MAX_SIZE - PERFLOG_UINT16_SIZE +#define PERFLOG_BUFF_STR_MAX_SIZE_FOR_EVTII PERFLOG_BUFF_STR_MAX_SIZE - PERFLOG_UINT16_SIZE - PERFLOG_UINT16_SIZE +#define PERFLOG_UINT16_SIZE 2 + +/* PerfLog Phase 2 :: header format modification + should be changed to protobuff type +*/ +typedef enum PerfLogAffectTag { + AFFECT_K, + AFFECT_F, + AFFECT_A +}PerfLogAffect; + +typedef enum EvtNamingTag { + NAMING_LockC, + NAMING_AppLaunch, +}EvtNamingTag; + +typedef enum PerfLevelTag{ + LOW, + MID, + HIGH, + CRITICAL +}PerfLevelTag; + +// ############################################################################### + +#pragma pack(1) + +typedef union{ + + struct { + uint16 param1; + char logbuffer[PERFLOG_BUFF_STR_MAX_SIZE_FOR_EVTI + 1]; + } EvtPacket; + + struct { + uint16 param1; + uint16 param2; + char logbuffer[PERFLOG_BUFF_STR_MAX_SIZE_FOR_EVTII + 1]; + } EvtIIPacket; + + struct { + int param1; + int param2; + char logbuffer[PERFLOG_BUFF_STR_MAX_SIZE_FOR_EVTII + 1]; + } EvtIntIntPacket; + + char logbuffer[PERFLOG_BUFF_STR_MAX_SIZE + 1]; +} Payload; + +struct LogPacket { + struct timespec logtime; + uint16 logtype; + uint16 logid; + uint16 pid; + uint16 tid; + Payload payload; +}; + +struct _Timestamp { + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; + uint16 msecond; +}; + +struct _PLogPacket { + struct _Timestamp timestamp; + uint16 pid; + uint16 tid; + + uint8 type; + uint8 id; + + char pname[10]; + uint8 context_length; + char context_buffer[PERFLOG_BUFF_STR_MAX_SIZE + 1]; +}; + +union _uPLogPacket { + struct _PLogPacket itemes; + char stream[PERFLOG_HEADER_SIZE + PERFLOG_BUFF_STR_MAX_SIZE]; +}; +#pragma pack(0) + +// Start API +int perflog_write(char const * fmt, ...); +int perflog_write_log(uint16 type, uint16 logid, char const * fmt, ...); + +int perflog_write_evt(uint16 maintype, uint16 logid, uint16 param1, char const * fmt, ...); + +int perflog_write_evt_iis(uint16 maintype, uint16 logid, uint16 param1, uint16 param2, char const * fmt, ...); + +int perflog_write_evt_IIS(uint16 maintype, uint16 logid, int param1, int param2, char const * fmt, ...); + +// int perflog_getlog(char **buff); +// End API + +#ifdef __cplusplus +} +#endif /* #ifdef __cplusplus */ + +#endif diff --git a/include/linux/samsung/debug/sec_debug.h b/include/linux/samsung/debug/sec_debug.h index 3d4209bbe564..d8d3252d15f8 100755 --- a/include/linux/samsung/debug/sec_debug.h +++ b/include/linux/samsung/debug/sec_debug.h @@ -207,6 +207,9 @@ enum pon_restart_reason { #if IS_ENABLED(CONFIG_SEC_QUEST) PON_RESTART_REASON_QUEST_UEFI_START = 0x0A, #endif + /* TODO : CDSP feature is not used MSM8953 families */ + PON_RESTART_REASON_CDSP_BLOCK = 0x0B, + PON_RESTART_REASON_CDSP_ON = 0x0C, PON_RESTART_REASON_FORCE_UPLOAD_ON = 0x10, PON_RESTART_REASON_FORCE_UPLOAD_OFF = 0x11, #endif /* CONFIG_SEC_QPNP_PON_SPARE_BITS == 6 */ diff --git a/include/linux/samsung/debug/sec_debug_summary_type.h b/include/linux/samsung/debug/sec_debug_summary_type.h index b1d5ae2b6eda..d2dbbcc5285f 100755 --- a/include/linux/samsung/debug/sec_debug_summary_type.h +++ b/include/linux/samsung/debug/sec_debug_summary_type.h @@ -150,6 +150,11 @@ struct sec_debug_summary_data { struct sec_debug_summary_simple_var_mon var_mon; }; +struct sec_summary_data_modem_ext_log { + uint32_t idx; + uint8_t log[0]; +}; + struct sec_debug_summary_data_modem { unsigned int magic; char name[16]; @@ -158,6 +163,10 @@ struct sec_debug_summary_data_modem { struct sec_debug_summary_excp excp; struct sec_debug_summary_simple_var_mon var_mon; unsigned int separate_debug; + union { + struct sec_summary_data_modem_ext_log ext_log; + uint8_t __reserved_0[1024];\ + }; }; struct sec_debug_summary_avc_log { diff --git a/include/linux/samsung/sec_param.h b/include/linux/samsung/sec_param.h index 1cb3c87dca75..00f25082e5aa 100755 --- a/include/linux/samsung/sec_param.h +++ b/include/linux/samsung/sec_param.h @@ -81,6 +81,11 @@ struct sec_param_data { #else unsigned int reserved9; #endif +#if defined(CONFIG_VIB_STORE_LE_PARAM) + unsigned int vib_le_est; +#else + unsigned int Reserved_VibLeEst; +#endif }; struct sec_param_data_s { @@ -133,6 +138,9 @@ enum sec_param_index { param_index_quest_bps_data, #endif param_index_VrrStatus, +#if defined(CONFIG_VIB_STORE_LE_PARAM) + param_vib_le_est, +#endif #ifdef CONFIG_PD_CHARGER_HV_DISABLE param_index_pd_hv_disable, #endif diff --git a/include/linux/security.h b/include/linux/security.h index 11c87757d70d..e7eac9b12f1e 100755 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -225,13 +225,13 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) extern int security_init(void); /* Security operations */ -int security_binder_set_context_mgr(struct task_struct *mgr); -int security_binder_transaction(struct task_struct *from, - struct task_struct *to); -int security_binder_transfer_binder(struct task_struct *from, - struct task_struct *to); -int security_binder_transfer_file(struct task_struct *from, - struct task_struct *to, struct file *file); +int security_binder_set_context_mgr(const struct cred *mgr); +int security_binder_transaction(const struct cred *from, + const struct cred *to); +int security_binder_transfer_binder(const struct cred *from, + const struct cred *to); +int security_binder_transfer_file(const struct cred *from, + const struct cred *to, struct file *file); int security_ptrace_access_check(struct task_struct *child, unsigned int mode); int security_ptrace_traceme(struct task_struct *parent); int security_capget(struct task_struct *target, @@ -452,25 +452,25 @@ static inline int security_init(void) return 0; } -static inline int security_binder_set_context_mgr(struct task_struct *mgr) +static inline int security_binder_set_context_mgr(const struct cred *mgr) { return 0; } -static inline int security_binder_transaction(struct task_struct *from, - struct task_struct *to) +static inline int security_binder_transaction(const struct cred *from, + const struct cred *to) { return 0; } -static inline int security_binder_transfer_binder(struct task_struct *from, - struct task_struct *to) +static inline int security_binder_transfer_binder(const struct cred *from, + const struct cred *to) { return 0; } -static inline int security_binder_transfer_file(struct task_struct *from, - struct task_struct *to, +static inline int security_binder_transfer_file(const struct cred *from, + const struct cred *to, struct file *file) { return 0; diff --git a/include/linux/sizes.h b/include/linux/sizes.h index ce3e8150c174..475d4f0105ec 100755 --- a/include/linux/sizes.h +++ b/include/linux/sizes.h @@ -8,6 +8,8 @@ #ifndef __LINUX_SIZES_H__ #define __LINUX_SIZES_H__ +#include + #define SZ_1 0x00000001 #define SZ_2 0x00000002 #define SZ_4 0x00000004 @@ -44,4 +46,6 @@ #define SZ_1G 0x40000000 #define SZ_2G 0x80000000 +#define SZ_4G _AC(0x100000000, ULL) + #endif /* __LINUX_SIZES_H__ */ diff --git a/include/linux/sti/abc_common.h b/include/linux/sti/abc_common.h index 1513b859601a..60f1ed178e9b 100755 --- a/include/linux/sti/abc_common.h +++ b/include/linux/sti/abc_common.h @@ -40,28 +40,24 @@ extern struct class *sec_class; #include #include #include +#include + +#if (KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE) #include +#else +#include +#endif #define ABC_UEVENT_MAX 20 #define ABC_BUFFER_MAX 256 #define ABC_LOG_STR_LEN 50 -#define ABC_LOG_MAX 80 - +#define ABC_LOG_MAX 80 +#define ABC_DISABLED 0 +#define ERROR_REPORT_MODE_BIT (1<<0) +#define ALL_REPORT_MODE_BIT (1<<1) #define ABC_WAIT_ENABLE_TIMEOUT 10000 -enum { - ABC_DISABLED, - /* TYPE1 : ABC Driver - ABC Daemon is not used. ABC Driver manage ABC Error */ - ABC_TYPE1_ENABLED, - /* TYPE2 : Common Driver - ABC Daemon is used. ABC Daemon manage ABC Error. Common Driver send uevent bypass */ - ABC_TYPE2_ENABLED, -}; - -enum { - ABC_EVENT_I2C = 1, - ABC_EVENT_UNDERRUN, - ABC_EVENT_GPU_FAULT, -}; +#define ABC_PRINT(format, ...) pr_info("[sec_abc] " format, ##__VA_ARGS__) struct abc_fault_info { unsigned long cur_time; diff --git a/include/linux/sti/abc_hub.h b/include/linux/sti/abc_hub.h index 2a9fcabc93fd..bfb7c3b2c02e 100755 --- a/include/linux/sti/abc_hub.h +++ b/include/linux/sti/abc_hub.h @@ -61,6 +61,7 @@ struct sub_bootc_pdata { // common int init; int enabled; + int bootc_time; // custom int time_spec; int time_spec_offset; diff --git a/include/linux/usb/typec/sm/sm5714/sm5714_typec.h b/include/linux/usb/typec/sm/sm5714/sm5714_typec.h index f455608dc744..135a13cfceec 100755 --- a/include/linux/usb/typec/sm/sm5714/sm5714_typec.h +++ b/include/linux/usb/typec/sm/sm5714/sm5714_typec.h @@ -96,9 +96,11 @@ SM5714_REG_INT_STATUS5_SBU2_OVP |\ SM5714_REG_INT_STATUS5_CC_ABNORMAL) -#define SM5714_ATTACH_SOURCE 0x01 +#define SM5714_ATTACH_SOURCE 0x01 #define SM5714_ATTACH_SINK (0x01 << SM5714_ATTACH_SOURCE) #define SM5714_ATTACH_AUDIO 0x03 +#define SM5714_ATTACH_UN_ORI_DEBUG_SOURCE (0x01 << SM5714_ATTACH_SINK) +#define SM5714_ATTACH_ORI_DEBUG_SOURCE 0x05 #define SM5714_ATTACH_AUDIO_CHARGE (0x01 << 2) #define SM5714_ATTACH_TYPE 0x07 #define SM5714_ADV_CURR 0x18 diff --git a/include/linux/wait.h b/include/linux/wait.h index 158715445ffb..42e648083610 100755 --- a/include/linux/wait.h +++ b/include/linux/wait.h @@ -191,6 +191,7 @@ void __wake_up_locked_key_bookmark(struct wait_queue_head *wq_head, void __wake_up_sync_key(struct wait_queue_head *wq_head, unsigned int mode, int nr, void *key); void __wake_up_locked(struct wait_queue_head *wq_head, unsigned int mode, int nr); void __wake_up_sync(struct wait_queue_head *wq_head, unsigned int mode, int nr); +void __wake_up_pollfree(struct wait_queue_head *wq_head); #define wake_up(x) __wake_up(x, TASK_NORMAL, 1, NULL) #define wake_up_nr(x, nr) __wake_up(x, TASK_NORMAL, nr, NULL) @@ -215,6 +216,31 @@ void __wake_up_sync(struct wait_queue_head *wq_head, unsigned int mode, int nr); #define wake_up_interruptible_sync_poll(x, m) \ __wake_up_sync_key((x), TASK_INTERRUPTIBLE, 1, (void *) (m)) +/** + * wake_up_pollfree - signal that a polled waitqueue is going away + * @wq_head: the wait queue head + * + * In the very rare cases where a ->poll() implementation uses a waitqueue whose + * lifetime is tied to a task rather than to the 'struct file' being polled, + * this function must be called before the waitqueue is freed so that + * non-blocking polls (e.g. epoll) are notified that the queue is going away. + * + * The caller must also RCU-delay the freeing of the wait_queue_head, e.g. via + * an explicit synchronize_rcu() or call_rcu(), or via SLAB_TYPESAFE_BY_RCU. + */ +static inline void wake_up_pollfree(struct wait_queue_head *wq_head) +{ + /* + * For performance reasons, we don't always take the queue lock here. + * Therefore, we might race with someone removing the last entry from + * the queue, and proceed while they still hold the queue lock. + * However, rcu_read_lock() is required to be held in such cases, so we + * can safely proceed with an RCU-delayed free. + */ + if (waitqueue_active(wq_head)) + __wake_up_pollfree(wq_head); +} + #define ___wait_cond_timeout(condition) \ ({ \ bool __cond = (condition); \ diff --git a/include/linux/zsmalloc.h b/include/linux/zsmalloc.h index 2219cce81ca4..e9a1624afe1e 100755 --- a/include/linux/zsmalloc.h +++ b/include/linux/zsmalloc.h @@ -57,4 +57,7 @@ unsigned long zs_get_total_pages(struct zs_pool *pool); unsigned long zs_compact(struct zs_pool *pool); void zs_pool_stats(struct zs_pool *pool, struct zs_pool_stats *stats); + +void try_schedule_zs_compact(void); +extern void register_on_app_mmput_callback(void (*callback)(void)); #endif diff --git a/include/net/af_unix.h b/include/net/af_unix.h index a5ba41b3b867..7ec1cdb66be8 100755 --- a/include/net/af_unix.h +++ b/include/net/af_unix.h @@ -10,6 +10,7 @@ void unix_inflight(struct user_struct *user, struct file *fp); void unix_notinflight(struct user_struct *user, struct file *fp); +void unix_destruct_scm(struct sk_buff *skb); void unix_gc(void); void wait_for_unix_gc(void); struct sock *unix_get_socket(struct file *filp); diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index c1f71dd464d3..5831a304e61b 100755 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h @@ -441,7 +441,7 @@ struct sctp_af { int saddr); void (*from_sk) (union sctp_addr *, struct sock *sk); - void (*from_addr_param) (union sctp_addr *, + bool (*from_addr_param) (union sctp_addr *, union sctp_addr_param *, __be16 port, int iif); int (*to_addr_param) (const union sctp_addr *, diff --git a/include/sound/dbmdx-export.h b/include/sound/dbmdx-export.h new file mode 100755 index 000000000000..d5eabdb4f862 --- /dev/null +++ b/include/sound/dbmdx-export.h @@ -0,0 +1,26 @@ +/* + * dbmdx-export.h -- DBMDX exported interface + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _DBMDX_EXPORT_H +#define _DBMDX_EXPORT_H + +#include +#include + +int dbmdx_remote_add_component_controls(struct snd_soc_component *component); + +typedef void (*event_cb)(int); +void dbmdx_remote_register_event_callback(event_cb func); + +enum i2c_freq_t { + I2C_FREQ_SLOW, + I2C_FREQ_FAST +}; +typedef void (*set_i2c_freq_cb)(struct i2c_adapter*, enum i2c_freq_t); +void dbmdx_remote_register_set_i2c_freq_callback(set_i2c_freq_cb func); +#endif diff --git a/include/uapi/linux/android/binderfs.h b/include/uapi/linux/android/binderfs.h index 65b2efd1a0a5..b638098b29dd 100755 --- a/include/uapi/linux/android/binderfs.h +++ b/include/uapi/linux/android/binderfs.h @@ -22,8 +22,8 @@ */ struct binderfs_device { char name[BINDERFS_MAX_NAME + 1]; - __u8 major; - __u8 minor; + __u32 major; + __u32 minor; }; /** diff --git a/include/uapi/linux/input.h b/include/uapi/linux/input.h index fa39bd9fe816..6b3f40946ef8 100755 --- a/include/uapi/linux/input.h +++ b/include/uapi/linux/input.h @@ -19,6 +19,7 @@ #include "input-event-codes.h" +#ifndef CONFIG_SEC_DEBUG_TSP_LOG_LEGO /* * sys/class/sec/tsp/support_feature * bit value should be made a promise with InputFramework. @@ -122,7 +123,7 @@ #define input_log_fix() {} #define input_raw_data_clear() {} #endif - +#endif /* * The event structure itself diff --git a/kernel/fork.c b/kernel/fork.c index 201ae1e5106f..3aa6131ccfba 100755 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -994,6 +994,57 @@ static inline void __mmput(struct mm_struct *mm) mmdrop(mm); } +/* + * Store pids of zygote and zygote64. + * Both processes uses "main" as its comm. + */ +static pid_t zygote_pids[2]; + +bool is_app(struct task_struct *p) +{ + struct task_struct *parent; + + parent = rcu_dereference(p->real_parent); + + if (parent->pid == zygote_pids[0]) + return true; + + if (parent->pid == zygote_pids[1]) + return true; + + if (zygote_pids[0] && zygote_pids[1]) + return false; + + if (strncmp(parent->comm, "main", 4) == 0) { + if (!zygote_pids[0]) { + zygote_pids[0] = parent->pid; + pr_info("set zygote_pids[0]=%d", parent->pid); + return true; + } + if (!zygote_pids[1]) { + zygote_pids[1] = parent->pid; + pr_info("set zygote_pids[1]=%d", parent->pid); + return true; + } + } + return false; +} + +void (*on_app_mmput_callback)(void); + +void call_on_app_mmput_callback(void) +{ + if (on_app_mmput_callback) { + on_app_mmput_callback(); + } +} + +void register_on_app_mmput_callback(void (*callback)(void)) +{ + on_app_mmput_callback = callback; +} +EXPORT_SYMBOL_GPL(register_on_app_mmput_callback); + /* * Decrement the use count and release all resources for an mm. */ @@ -1005,6 +1056,9 @@ int mmput(struct mm_struct *mm) if (atomic_dec_and_test(&mm->mm_users)) { __mmput(mm); mm_freed = 1; + if (is_app(current)) { + call_on_app_mmput_callback(); + } } return mm_freed; diff --git a/kernel/sched/wait.c b/kernel/sched/wait.c index e29608464382..174585abc9b5 100755 --- a/kernel/sched/wait.c +++ b/kernel/sched/wait.c @@ -11,6 +11,7 @@ #include #include #include +#include void __init_waitqueue_head(struct wait_queue_head *wq_head, const char *name, struct lock_class_key *key) { @@ -213,6 +214,13 @@ void __wake_up_sync(struct wait_queue_head *wq_head, unsigned int mode, int nr_e } EXPORT_SYMBOL_GPL(__wake_up_sync); /* For internal use only */ +void __wake_up_pollfree(struct wait_queue_head *wq_head) +{ + __wake_up(wq_head, TASK_NORMAL, 0, (void *)(POLLHUP | POLLFREE)); + /* POLLFREE must have cleared the queue. */ + WARN_ON_ONCE(waitqueue_active(wq_head)); +} + /* * Note: we use "set_current_state()" _after_ the wait-queue add, * because we need a memory barrier there on SMP, so that any diff --git a/lib/iov_iter.c b/lib/iov_iter.c index 7b2fd5f251f2..695b09a4bdc4 100755 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -393,6 +393,7 @@ static size_t copy_page_to_iter_pipe(struct page *page, size_t offset, size_t by return 0; pipe->nrbufs++; buf->ops = &page_cache_pipe_buf_ops; + buf->flags = 0; get_page(buf->page = page); buf->offset = offset; buf->len = bytes; @@ -517,6 +518,7 @@ static size_t push_pipe(struct iov_iter *i, size_t size, break; pipe->nrbufs++; pipe->bufs[idx].ops = &default_pipe_buf_ops; + pipe->bufs[idx].flags = 0; pipe->bufs[idx].page = page; pipe->bufs[idx].offset = 0; if (left <= PAGE_SIZE) { diff --git a/mm/page_alloc.c b/mm/page_alloc.c index bb3b8545c1da..1d660049a149 100755 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3194,11 +3194,15 @@ static inline bool zone_watermark_fast(struct zone *z, unsigned int order, * need to be calculated. */ if (!order) { - long fast_free; + long usable_free; + long reserved; - fast_free = free_pages; - fast_free -= __zone_watermark_unusable_free(z, 0, alloc_flags); - if (fast_free > mark + z->lowmem_reserve[classzone_idx]) + usable_free = free_pages; + reserved = __zone_watermark_unusable_free(z, 0, alloc_flags); + + /* reserved may over estimate high-atomic reserves. */ + usable_free -= min(usable_free, reserved); + if (usable_free > mark + z->lowmem_reserve[classzone_idx]) return true; } diff --git a/mm/rbincache.c b/mm/rbincache.c index b9ff36cff382..6f2645c14645 100755 --- a/mm/rbincache.c +++ b/mm/rbincache.c @@ -27,6 +27,7 @@ #include #include #include +#include /* * rbincache: a cleancache API implementation @@ -366,6 +367,9 @@ static void rc_store_page(int pool_id, struct cleancache_filekey key, int ret; bool zero; + if (!current_is_kswapd()) + return; + atomic_inc(&rc_num_puts); zero = is_zero_page(src); if (zero) { diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c index 33e9e0dd420e..20cce41e25e4 100755 --- a/mm/zsmalloc.c +++ b/mm/zsmalloc.c @@ -2444,6 +2444,54 @@ static int zs_register_shrinker(struct zs_pool *pool) return register_shrinker(&pool->shrinker); } +#define ZS_COMPACT_THRESHOLD 1024 +#define ZS_COMPACT_INTERVAL 1 + +struct zs_pool *g_pool; + +static void do_zs_compact(struct work_struct *work) +{ + unsigned long pages_freed; + if (g_pool) { + pages_freed = zs_compact(g_pool); + pr_info("zs_compact pages_freed=%d", pages_freed); + } +} +static DECLARE_WORK(zs_compact_work, do_zs_compact); + +static bool zs_compactable(struct zs_pool *pool, unsigned int pages) +{ + int i; + struct size_class *class; + unsigned long pages_to_free = 0; + + for (i = ZS_SIZE_CLASSES - 1; i >= 0; i--) { + class = pool->size_class[i]; + if (!class) + continue; + if (class->index != i) + continue; + + pages_to_free += zs_can_compact(class); + + if (pages_to_free >= pages) + return true; + } + return false; +} + +void try_schedule_zs_compact() +{ + static unsigned long resume = INITIAL_JIFFIES; + + if (time_is_before_jiffies(resume) && + !work_pending(&zs_compact_work) && + zs_compactable(g_pool, ZS_COMPACT_THRESHOLD)) { + resume = jiffies + ZS_COMPACT_INTERVAL * HZ; + schedule_work(&zs_compact_work); + } +} + /** * zs_create_pool - Creates an allocation pool to work from. * @name: pool name to be created @@ -2554,6 +2602,11 @@ struct zs_pool *zs_create_pool(const char *name) if (zs_register_migration(pool)) goto err; + if (!g_pool) + g_pool = pool; + + register_on_app_mmput_callback(try_schedule_zs_compact); + /* * Not critical, we still can use the pool * and user can trigger compaction manually. diff --git a/net/Makefile b/net/Makefile index ede55bd287ac..b1edf343ff11 100755 --- a/net/Makefile +++ b/net/Makefile @@ -18,7 +18,7 @@ obj-$(CONFIG_NETFILTER) += netfilter/ obj-$(CONFIG_INET) += ipv4/ obj-$(CONFIG_TLS) += tls/ obj-$(CONFIG_XFRM) += xfrm/ -obj-$(CONFIG_UNIX) += unix/ +obj-$(CONFIG_UNIX_SCM) += unix/ obj-$(CONFIG_NET) += ipv6/ obj-$(CONFIG_PACKET) += packet/ obj-$(CONFIG_NET_KEY) += key/ diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index b6f0ee01f2e0..3979e5af6e49 100755 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c @@ -2694,6 +2694,7 @@ int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u rv = 1; } else if (im) { if (src_addr) { + spin_lock_bh(&im->lock); for (psf = im->sources; psf; psf = psf->sf_next) { if (psf->sf_inaddr == src_addr) break; @@ -2704,6 +2705,7 @@ int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u im->sfcount[MCAST_EXCLUDE]; else rv = im->sfcount[MCAST_EXCLUDE] != 0; + spin_unlock_bh(&im->lock); } else rv = 1; /* unspecified source; tentatively allow */ } diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index bf41f89c57b9..97b8a362c8b2 100755 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -4470,9 +4470,10 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, } out_free_pg_vec: - bitmap_free(rx_owner_map); - if (pg_vec) + if (pg_vec) { + bitmap_free(rx_owner_map); free_pg_vec(pg_vec, order, req->tp_block_nr); + } out: return err; } diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c index 38d01cfb313e..f8a283245672 100755 --- a/net/sctp/bind_addr.c +++ b/net/sctp/bind_addr.c @@ -285,22 +285,19 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list, rawaddr = (union sctp_addr_param *)raw_addr_list; af = sctp_get_af_specific(param_type2af(param->type)); - if (unlikely(!af)) { + if (unlikely(!af) || + !af->from_addr_param(&addr, rawaddr, htons(port), 0)) { retval = -EINVAL; - sctp_bind_addr_clean(bp); - break; + goto out_err; } - af->from_addr_param(&addr, rawaddr, htons(port), 0); if (sctp_bind_addr_state(bp, &addr) != -1) goto next; retval = sctp_add_bind_addr(bp, &addr, sizeof(addr), SCTP_ADDR_SRC, gfp); - if (retval) { + if (retval) /* Can't finish building the list, clean up. */ - sctp_bind_addr_clean(bp); - break; - } + goto out_err; next: len = ntohs(param->length); @@ -309,6 +306,12 @@ next: } return retval; + +out_err: + if (retval) + sctp_bind_addr_clean(bp); + + return retval; } /******************************************************************** diff --git a/net/sctp/input.c b/net/sctp/input.c index 3c0affecf272..0877f1692f8b 100755 --- a/net/sctp/input.c +++ b/net/sctp/input.c @@ -1081,7 +1081,8 @@ static struct sctp_association *__sctp_rcv_init_lookup(struct net *net, if (!af) continue; - af->from_addr_param(paddr, params.addr, sh->source, 0); + if (!af->from_addr_param(paddr, params.addr, sh->source, 0)) + continue; asoc = __sctp_lookup_association(net, laddr, paddr, transportp); if (asoc) @@ -1117,6 +1118,9 @@ static struct sctp_association *__sctp_rcv_asconf_lookup( union sctp_addr_param *param; union sctp_addr paddr; + if (ntohs(ch->length) < sizeof(*asconf) + sizeof(struct sctp_paramhdr)) + return NULL; + /* Skip over the ADDIP header and find the Address parameter */ param = (union sctp_addr_param *)(asconf + 1); @@ -1124,7 +1128,8 @@ static struct sctp_association *__sctp_rcv_asconf_lookup( if (unlikely(!af)) return NULL; - af->from_addr_param(&paddr, param, peer_port, 0); + if (!af->from_addr_param(&paddr, param, peer_port, 0)) + return NULL; return __sctp_lookup_association(net, laddr, &paddr, transportp); } @@ -1195,7 +1200,7 @@ static struct sctp_association *__sctp_rcv_walk_lookup(struct net *net, ch = (struct sctp_chunkhdr *)ch_end; chunk_num++; - } while (ch_end < skb_tail_pointer(skb)); + } while (ch_end + sizeof(*ch) < skb_tail_pointer(skb)); return asoc; } diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index b61e9ed109f6..295466379ea0 100755 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c @@ -490,15 +490,20 @@ static void sctp_v6_to_sk_daddr(union sctp_addr *addr, struct sock *sk) } /* Initialize a sctp_addr from an address parameter. */ -static void sctp_v6_from_addr_param(union sctp_addr *addr, +static bool sctp_v6_from_addr_param(union sctp_addr *addr, union sctp_addr_param *param, __be16 port, int iif) { + if (ntohs(param->v6.param_hdr.length) < sizeof(struct sctp_ipv6addr_param)) + return false; + addr->v6.sin6_family = AF_INET6; addr->v6.sin6_port = port; addr->v6.sin6_flowinfo = 0; /* BUG */ addr->v6.sin6_addr = param->v6.addr; addr->v6.sin6_scope_id = iif; + + return true; } /* Initialize an address parameter from a sctp_addr and return the length diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 8fe9c0646205..d5cf05efddfd 100755 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c @@ -279,14 +279,19 @@ static void sctp_v4_to_sk_daddr(union sctp_addr *addr, struct sock *sk) } /* Initialize a sctp_addr from an address parameter. */ -static void sctp_v4_from_addr_param(union sctp_addr *addr, +static bool sctp_v4_from_addr_param(union sctp_addr *addr, union sctp_addr_param *param, __be16 port, int iif) { + if (ntohs(param->v4.param_hdr.length) < sizeof(struct sctp_ipv4addr_param)) + return false; + addr->v4.sin_family = AF_INET; addr->v4.sin_port = port; addr->v4.sin_addr.s_addr = param->v4.addr.s_addr; memset(addr->v4.sin_zero, 0, sizeof(addr->v4.sin_zero)); + + return true; } /* Initialize an address parameter from a sctp_addr and return the length diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index e698edd56bd5..11db09e52819 100755 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c @@ -2161,9 +2161,16 @@ static enum sctp_ierror sctp_verify_param(struct net *net, break; case SCTP_PARAM_SET_PRIMARY: - if (net->sctp.addip_enable) - break; - goto fallthrough; + if (!net->sctp.addip_enable) + goto fallthrough; + + if (ntohs(param.p->length) < sizeof(struct sctp_addip_param) + + sizeof(struct sctp_paramhdr)) { + sctp_process_inv_paramlength(asoc, param.p, + chunk, err_chunk); + retval = SCTP_IERROR_ABORT; + } + break; case SCTP_PARAM_HOST_NAME_ADDRESS: /* Tell the peer, we won't support this param. */ @@ -2341,11 +2348,13 @@ int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk, /* Process the initialization parameters. */ sctp_walk_params(param, peer_init, init_hdr.params) { - if (!src_match && (param.p->type == SCTP_PARAM_IPV4_ADDRESS || - param.p->type == SCTP_PARAM_IPV6_ADDRESS)) { + if (!src_match && + (param.p->type == SCTP_PARAM_IPV4_ADDRESS || + param.p->type == SCTP_PARAM_IPV6_ADDRESS)) { af = sctp_get_af_specific(param_type2af(param.p->type)); - af->from_addr_param(&addr, param.addr, - chunk->sctp_hdr->source, 0); + if (!af->from_addr_param(&addr, param.addr, + chunk->sctp_hdr->source, 0)) + continue; if (sctp_cmp_addr_exact(sctp_source(chunk), &addr)) src_match = 1; } @@ -2523,7 +2532,8 @@ static int sctp_process_param(struct sctp_association *asoc, break; do_addr_param: af = sctp_get_af_specific(param_type2af(param.p->type)); - af->from_addr_param(&addr, param.addr, htons(asoc->peer.port), 0); + if (!af->from_addr_param(&addr, param.addr, htons(asoc->peer.port), 0)) + break; scope = sctp_scope(peer_addr); if (sctp_in_scope(net, &addr, scope)) if (!sctp_assoc_add_peer(asoc, &addr, gfp, SCTP_UNCONFIRMED)) @@ -2620,15 +2630,13 @@ do_addr_param: addr_param = param.v + sizeof(struct sctp_addip_param); af = sctp_get_af_specific(param_type2af(addr_param->p.type)); - if (af == NULL) + if (!af) break; - af->from_addr_param(&addr, addr_param, - htons(asoc->peer.port), 0); + if (!af->from_addr_param(&addr, addr_param, + htons(asoc->peer.port), 0)) + break; - /* if the address is invalid, we can't process it. - * XXX: see spec for what to do. - */ if (!af->addr_valid(&addr, NULL, NULL)) break; @@ -3045,7 +3053,8 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc, if (unlikely(!af)) return SCTP_ERROR_DNS_FAILED; - af->from_addr_param(&addr, addr_param, htons(asoc->peer.port), 0); + if (!af->from_addr_param(&addr, addr_param, htons(asoc->peer.port), 0)) + return SCTP_ERROR_DNS_FAILED; /* ADDIP 4.2.1 This parameter MUST NOT contain a broadcast * or multicast address. @@ -3310,7 +3319,8 @@ static void sctp_asconf_param_success(struct sctp_association *asoc, /* We have checked the packet before, so we do not check again. */ af = sctp_get_af_specific(param_type2af(addr_param->p.type)); - af->from_addr_param(&addr, addr_param, htons(bp->port), 0); + if (!af->from_addr_param(&addr, addr_param, htons(bp->port), 0)) + return; switch (asconf_param->param_hdr.type) { case SCTP_PARAM_ADD_IP: diff --git a/net/unix/Kconfig b/net/unix/Kconfig index 8b31ab85d050..3b9e450656a4 100755 --- a/net/unix/Kconfig +++ b/net/unix/Kconfig @@ -19,6 +19,11 @@ config UNIX Say Y unless you know what you are doing. +config UNIX_SCM + bool + depends on UNIX + default y + config UNIX_DIAG tristate "UNIX: socket monitoring interface" depends on UNIX diff --git a/net/unix/Makefile b/net/unix/Makefile index ffd0a275c3a7..54e58cc4f945 100755 --- a/net/unix/Makefile +++ b/net/unix/Makefile @@ -10,3 +10,5 @@ unix-$(CONFIG_SYSCTL) += sysctl_net_unix.o obj-$(CONFIG_UNIX_DIAG) += unix_diag.o unix_diag-y := diag.o + +obj-$(CONFIG_UNIX_SCM) += scm.o diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 091e93798eac..73622a567e11 100755 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -119,6 +119,8 @@ #include #include +#include "scm.h" + struct hlist_head unix_socket_table[2 * UNIX_HASH_SIZE]; EXPORT_SYMBOL_GPL(unix_socket_table); DEFINE_SPINLOCK(unix_table_lock); @@ -1512,65 +1514,51 @@ out: return err; } -static void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb) -{ - int i; - - scm->fp = UNIXCB(skb).fp; - UNIXCB(skb).fp = NULL; - - for (i = scm->fp->count-1; i >= 0; i--) - unix_notinflight(scm->fp->user, scm->fp->fp[i]); -} - -static void unix_destruct_scm(struct sk_buff *skb) -{ - struct scm_cookie scm; - memset(&scm, 0, sizeof(scm)); - scm.pid = UNIXCB(skb).pid; - if (UNIXCB(skb).fp) - unix_detach_fds(&scm, skb); - - /* Alas, it calls VFS */ - /* So fscking what? fput() had been SMP-safe since the last Summer */ - scm_destroy(&scm); - sock_wfree(skb); -} - -/* - * The "user->unix_inflight" variable is protected by the garbage - * collection lock, and we just read it locklessly here. If you go - * over the limit, there might be a tiny race in actually noticing - * it across threads. Tough. - */ -static inline bool too_many_unix_fds(struct task_struct *p) -{ - struct user_struct *user = current_user(); - - if (unlikely(user->unix_inflight > task_rlimit(p, RLIMIT_NOFILE))) - return !capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN); - return false; -} - -static int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb) +static void unix_peek_fds(struct scm_cookie *scm, struct sk_buff *skb) { - int i; - - if (too_many_unix_fds(current)) - return -ETOOMANYREFS; + scm->fp = scm_fp_dup(UNIXCB(skb).fp); /* - * Need to duplicate file references for the sake of garbage - * collection. Otherwise a socket in the fps might become a - * candidate for GC while the skb is not yet queued. + * Garbage collection of unix sockets starts by selecting a set of + * candidate sockets which have reference only from being in flight + * (total_refs == inflight_refs). This condition is checked once during + * the candidate collection phase, and candidates are marked as such, so + * that non-candidates can later be ignored. While inflight_refs is + * protected by unix_gc_lock, total_refs (file count) is not, hence this + * is an instantaneous decision. + * + * Once a candidate, however, the socket must not be reinstalled into a + * file descriptor while the garbage collection is in progress. + * + * If the above conditions are met, then the directed graph of + * candidates (*) does not change while unix_gc_lock is held. + * + * Any operations that changes the file count through file descriptors + * (dup, close, sendmsg) does not change the graph since candidates are + * not installed in fds. + * + * Dequeing a candidate via recvmsg would install it into an fd, but + * that takes unix_gc_lock to decrement the inflight count, so it's + * serialized with garbage collection. + * + * MSG_PEEK is special in that it does not change the inflight count, + * yet does install the socket into an fd. The following lock/unlock + * pair is to ensure serialization with garbage collection. It must be + * done between incrementing the file count and installing the file into + * an fd. + * + * If garbage collection starts after the barrier provided by the + * lock/unlock, then it will see the elevated refcount and not mark this + * as a candidate. If a garbage collection is already in progress + * before the file count was incremented, then the lock/unlock pair will + * ensure that garbage collection is finished before progressing to + * installing the fd. + * + * (*) A -> B where B is on the queue of A or B is on the queue of C + * which is on the queue of listening socket A. */ - UNIXCB(skb).fp = scm_fp_dup(scm->fp); - if (!UNIXCB(skb).fp) - return -ENOMEM; - - for (i = scm->fp->count - 1; i >= 0; i--) - unix_inflight(scm->fp->user, scm->fp->fp[i]); - return 0; + spin_lock(&unix_gc_lock); + spin_unlock(&unix_gc_lock); } static int unix_scm_to_skb(struct scm_cookie *scm, struct sk_buff *skb, bool send_fds) @@ -2197,7 +2185,7 @@ static int unix_dgram_recvmsg(struct socket *sock, struct msghdr *msg, sk_peek_offset_fwd(sk, size); if (UNIXCB(skb).fp) - scm.fp = scm_fp_dup(UNIXCB(skb).fp); + unix_peek_fds(&scm, skb); } err = (flags & MSG_TRUNC) ? skb->len - skip : size; @@ -2438,7 +2426,7 @@ unlock: /* It is questionable, see note in unix_dgram_recvmsg. */ if (UNIXCB(skb).fp) - scm.fp = scm_fp_dup(UNIXCB(skb).fp); + unix_peek_fds(&scm, skb); sk_peek_offset_fwd(sk, chunk); diff --git a/net/unix/garbage.c b/net/unix/garbage.c index c36757e72844..8bbe1b8e4ff7 100755 --- a/net/unix/garbage.c +++ b/net/unix/garbage.c @@ -86,77 +86,13 @@ #include #include +#include "scm.h" + /* Internal data structures and random procedures: */ -static LIST_HEAD(gc_inflight_list); static LIST_HEAD(gc_candidates); -static DEFINE_SPINLOCK(unix_gc_lock); static DECLARE_WAIT_QUEUE_HEAD(unix_gc_wait); -unsigned int unix_tot_inflight; - -struct sock *unix_get_socket(struct file *filp) -{ - struct sock *u_sock = NULL; - struct inode *inode = file_inode(filp); - - /* Socket ? */ - if (S_ISSOCK(inode->i_mode) && !(filp->f_mode & FMODE_PATH)) { - struct socket *sock = SOCKET_I(inode); - struct sock *s = sock->sk; - - /* PF_UNIX ? */ - if (s && sock->ops && sock->ops->family == PF_UNIX) - u_sock = s; - } - return u_sock; -} - -/* Keep the number of times in flight count for the file - * descriptor if it is for an AF_UNIX socket. - */ - -void unix_inflight(struct user_struct *user, struct file *fp) -{ - struct sock *s = unix_get_socket(fp); - - spin_lock(&unix_gc_lock); - - if (s) { - struct unix_sock *u = unix_sk(s); - - if (atomic_long_inc_return(&u->inflight) == 1) { - BUG_ON(!list_empty(&u->link)); - list_add_tail(&u->link, &gc_inflight_list); - } else { - BUG_ON(list_empty(&u->link)); - } - unix_tot_inflight++; - } - user->unix_inflight++; - spin_unlock(&unix_gc_lock); -} - -void unix_notinflight(struct user_struct *user, struct file *fp) -{ - struct sock *s = unix_get_socket(fp); - - spin_lock(&unix_gc_lock); - - if (s) { - struct unix_sock *u = unix_sk(s); - - BUG_ON(!atomic_long_read(&u->inflight)); - BUG_ON(list_empty(&u->link)); - - if (atomic_long_dec_and_test(&u->inflight)) - list_del_init(&u->link); - unix_tot_inflight--; - } - user->unix_inflight--; - spin_unlock(&unix_gc_lock); -} - static void scan_inflight(struct sock *x, void (*func)(struct unix_sock *), struct sk_buff_head *hitlist) { diff --git a/net/unix/scm.c b/net/unix/scm.c new file mode 100755 index 000000000000..e13d320c41c7 --- /dev/null +++ b/net/unix/scm.c @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "scm.h" + +unsigned int unix_tot_inflight; +EXPORT_SYMBOL(unix_tot_inflight); + +LIST_HEAD(gc_inflight_list); +EXPORT_SYMBOL(gc_inflight_list); + +DEFINE_SPINLOCK(unix_gc_lock); +EXPORT_SYMBOL(unix_gc_lock); + +struct sock *unix_get_socket(struct file *filp) +{ + struct sock *u_sock = NULL; + struct inode *inode = file_inode(filp); + + /* Socket ? */ + if (S_ISSOCK(inode->i_mode) && !(filp->f_mode & FMODE_PATH)) { + struct socket *sock = SOCKET_I(inode); + struct sock *s = sock->sk; + + /* PF_UNIX ? */ + if (s && sock->ops && sock->ops->family == PF_UNIX) + u_sock = s; + } + return u_sock; +} +EXPORT_SYMBOL(unix_get_socket); + +/* Keep the number of times in flight count for the file + * descriptor if it is for an AF_UNIX socket. + */ +void unix_inflight(struct user_struct *user, struct file *fp) +{ + struct sock *s = unix_get_socket(fp); + + spin_lock(&unix_gc_lock); + + if (s) { + struct unix_sock *u = unix_sk(s); + + if (atomic_long_inc_return(&u->inflight) == 1) { + BUG_ON(!list_empty(&u->link)); + list_add_tail(&u->link, &gc_inflight_list); + } else { + BUG_ON(list_empty(&u->link)); + } + unix_tot_inflight++; + } + user->unix_inflight++; + spin_unlock(&unix_gc_lock); +} + +void unix_notinflight(struct user_struct *user, struct file *fp) +{ + struct sock *s = unix_get_socket(fp); + + spin_lock(&unix_gc_lock); + + if (s) { + struct unix_sock *u = unix_sk(s); + + BUG_ON(!atomic_long_read(&u->inflight)); + BUG_ON(list_empty(&u->link)); + + if (atomic_long_dec_and_test(&u->inflight)) + list_del_init(&u->link); + unix_tot_inflight--; + } + user->unix_inflight--; + spin_unlock(&unix_gc_lock); +} + +/* + * The "user->unix_inflight" variable is protected by the garbage + * collection lock, and we just read it locklessly here. If you go + * over the limit, there might be a tiny race in actually noticing + * it across threads. Tough. + */ +static inline bool too_many_unix_fds(struct task_struct *p) +{ + struct user_struct *user = current_user(); + + if (unlikely(user->unix_inflight > task_rlimit(p, RLIMIT_NOFILE))) + return !capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN); + return false; +} + +int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb) +{ + int i; + + if (too_many_unix_fds(current)) + return -ETOOMANYREFS; + + /* + * Need to duplicate file references for the sake of garbage + * collection. Otherwise a socket in the fps might become a + * candidate for GC while the skb is not yet queued. + */ + UNIXCB(skb).fp = scm_fp_dup(scm->fp); + if (!UNIXCB(skb).fp) + return -ENOMEM; + + for (i = scm->fp->count - 1; i >= 0; i--) + unix_inflight(scm->fp->user, scm->fp->fp[i]); + return 0; +} +EXPORT_SYMBOL(unix_attach_fds); + +void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb) +{ + int i; + + scm->fp = UNIXCB(skb).fp; + UNIXCB(skb).fp = NULL; + + for (i = scm->fp->count-1; i >= 0; i--) + unix_notinflight(scm->fp->user, scm->fp->fp[i]); +} +EXPORT_SYMBOL(unix_detach_fds); + +void unix_destruct_scm(struct sk_buff *skb) +{ + struct scm_cookie scm; + + memset(&scm, 0, sizeof(scm)); + scm.pid = UNIXCB(skb).pid; + if (UNIXCB(skb).fp) + unix_detach_fds(&scm, skb); + + /* Alas, it calls VFS */ + /* So fscking what? fput() had been SMP-safe since the last Summer */ + scm_destroy(&scm); + sock_wfree(skb); +} +EXPORT_SYMBOL(unix_destruct_scm); diff --git a/net/unix/scm.h b/net/unix/scm.h new file mode 100755 index 000000000000..5a255a477f16 --- /dev/null +++ b/net/unix/scm.h @@ -0,0 +1,10 @@ +#ifndef NET_UNIX_SCM_H +#define NET_UNIX_SCM_H + +extern struct list_head gc_inflight_list; +extern spinlock_t unix_gc_lock; + +int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb); +void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb); + +#endif diff --git a/scripts/basic/.fixdep.cmd b/scripts/basic/.fixdep.cmd new file mode 100755 index 000000000000..9279ed74c15f --- /dev/null +++ b/scripts/basic/.fixdep.cmd @@ -0,0 +1,105 @@ +cmd_scripts/basic/fixdep := /home/dpi/qb5_8814/workspace/P4_1716/android/prebuilts/clang/host/linux-x86/clang-r383902b/bin/clang -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89 -Wno-unused-value -Wno-unused-parameter -Wno-missing-field-initializers -o scripts/basic/fixdep scripts/basic/fixdep.c + +source_scripts/basic/fixdep := scripts/basic/fixdep.c + +deps_scripts/basic/fixdep := \ + $(wildcard include/config/his/driver.h) \ + $(wildcard include/config/my/option.h) \ + $(wildcard include/config/foo.h) \ + $(wildcard include/config/boom.h) \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/include/features.h \ + /usr/include/stdc-predef.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /home/dpi/qb5_8814/workspace/P4_1716/android/prebuilts/clang/host/linux-x86/clang-r383902b/lib64/clang/11.0.2/include/stddef.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h \ + /usr/include/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap-16.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/sys/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/sysmacros.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/sys/stat.h \ + /usr/include/x86_64-linux-gnu/bits/stat.h \ + /usr/include/x86_64-linux-gnu/sys/mman.h \ + /usr/include/x86_64-linux-gnu/bits/mman.h \ + /usr/include/x86_64-linux-gnu/bits/mman-linux.h \ + /usr/include/x86_64-linux-gnu/bits/mman-shared.h \ + /usr/include/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/environments.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_posix.h \ + /usr/include/x86_64-linux-gnu/bits/getopt_core.h \ + /usr/include/fcntl.h \ + /usr/include/x86_64-linux-gnu/bits/fcntl.h \ + /usr/include/x86_64-linux-gnu/bits/fcntl-linux.h \ + /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/alloca.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/libio.h \ + /usr/include/x86_64-linux-gnu/bits/_G_config.h \ + $(wildcard include/config/h.h) \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /home/dpi/qb5_8814/workspace/P4_1716/android/prebuilts/clang/host/linux-x86/clang-r383902b/lib64/clang/11.0.2/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \ + /usr/include/x86_64-linux-gnu/bits/stdio.h \ + /home/dpi/qb5_8814/workspace/P4_1716/android/prebuilts/clang/host/linux-x86/clang-r383902b/lib64/clang/11.0.2/include/limits.h \ + /usr/include/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h \ + /usr/include/ctype.h \ + /usr/include/arpa/inet.h \ + /usr/include/netinet/in.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ + /usr/include/x86_64-linux-gnu/sys/socket.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h \ + /usr/include/x86_64-linux-gnu/bits/socket.h \ + /usr/include/x86_64-linux-gnu/bits/socket_type.h \ + /usr/include/x86_64-linux-gnu/bits/sockaddr.h \ + /usr/include/x86_64-linux-gnu/asm/socket.h \ + /usr/include/asm-generic/socket.h \ + /usr/include/x86_64-linux-gnu/asm/sockios.h \ + /usr/include/asm-generic/sockios.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_osockaddr.h \ + /usr/include/x86_64-linux-gnu/bits/in.h \ + +scripts/basic/fixdep: $(deps_scripts/basic/fixdep) + +$(deps_scripts/basic/fixdep): diff --git a/scripts/basic/fixdep b/scripts/basic/fixdep new file mode 100755 index 0000000000000000000000000000000000000000..a13b3178b203e8983a3a69d0858d139f0ce20db8 GIT binary patch literal 13832 zcmeHOeQ;CPmA~=_7-K9a!QccF9*sz$sbz~#n?NFgO`fwNaS5dC1|rMSldX*`xzbZ& z8k(AsNuvsXmoypK?yGcKmhHhh`^V1gOfTr2dw%zvbI-l^-22|U@A`{v?ky!23zMmY-NuMh<~liKTp6oq zqYfiU4~dow z%pgv|8MNaDgOwC5;Q;B8uQfMv7POORBpnxiD07W+sYfvBDMC*XdXkO{$0U{Qqqfm+ zyRf^x#0idgClTS*6eU?o9dGM?%8%7?7SzczlC~N!lT_+`272V@|1{MI!EK_xV*N5H z+9#=CSz{>JwRUx5$lnkOhU5JW{mp9|)~>e4BKDQM-DIC+@3?CRuZhN6bVZJ*p&}XX zw?$zCmYNd67U4%}#o`0?fgRqOmiJRK42%NP_2F2!6N-{$vsS0&oSt!qfp^CVxI#1pj;y{QE`lSP^`<2!4GLoTlSU zekO|G8;jsi7s2l@g0};|hAm{Ll}_Za{_!hg%RmXAEWkqoXG=S|q?BivCq9}MYnj#` z)S0LKZckra_pv@L8jVC5@-Y_E{lPHn?e+GtK)1$$Xh;hKkK#XzYF zdsweG6pHwm$K%uY^l6?h4{;EIQPvv|lO>NQ&>z#iItx4$4eA>6g(5MHMfzYj&=(Dc z^*~NtkAxx*X;E&Z%h%gS6%+Az$a@d0M0HQE7d{4}n#S&Mw{P0)S!rLD%Q;r(vMcRt zpx50S2@5?B`lF=CKgLRDC@I4VVrbC%P|DW`ns1b@3kK)W%KGof6ZXVczlPrO73ooYESDf?T?6!eKC%k#+z{SB2_2iV>WQP zW|F*O!p-a9auZ%kf+97UaJkk~QL_oBx@B^jaP$2@HR0rwOdTdX7qckbX~HX|FleU< z&)q74_n7c1lYE~EuQuWRCfsVm2TZseb1Ht!gkNKlA2#9Ub>izL{5q5TK@&dTgdZ~D zwI=*I6TZNNKX1Ypn(#3bE^gtx^c53MYn@DL;%tSQD(_vOFm?Z!UXmSG6E9U9lf^8% zrVB;cWqw?(OPt6N-$Uh@(^;fte?>fnSZ18_+lZ&o%8YUTPU1_6e~$B;h^J7>9OV3Z z;wgkO!<=79JcUkXfb*XsodXLm$GP_8>-Ve4Giu^@lO5aJ zPmGP#I+=RnXa^@JYN{|Mwa?5~*q^LRaFaiOEMT`T8H76HXZcG0=n2~-%#D)G z+A&m+jtL1L|$ff{S_g}OQu0nh|vOgiQBNY0scOPZ5iOcn0 zSdzHB&^q+bKoghCtOq`#Ciq^-oB`$W0p`3lGFat@A~FZ6`j81&^?5%;KY_N|Is(== zj|Qx##`k@g%|dH%4uULkdGX#=T+vsk_~k;yv5kh_>lo`?T`*lf0Li>MJzVuo^!llz zTq$0Wc?w$6$)Mp|d3T}WmO@4ApbvWcep3<^QQ=O07})=+e)|!c8P+8OxS|Jt2F>}^>i&~@tva;TGVq~Cf7kls`5lQf6@mRH z<8QSO&9_g?mHxnnn%r(v-O0VSj4)c(3N=kgVto4rhA=ra0FHFJOA?2_4`_bAN`GmSzL)L7VF^m$RkYl zx}hyub?Dx!iPNP=Xb9EBho#Z`)Z~lmrIV`VeaEZ0`RuZe=+zaij;q0o+>CW(Z}l9< zrQoF;SDDAnbzEungjD;5bRc^~4k)Q22Iko%_TSr!31M989tA@^t zSRKaWnTc7hQS!dcdic_vsj>?-OFLP+?;N#GAzRIAYL`u!m@}-V7SVVtZ*6(FD*k?J z%L5hhv+B^pHPp)GYVzImcP>+e#ZP7G5$^#k7P`%;4t=2}9Yp~j;Tti+Di+)12{mz| z#!ZUu`!knlE}e5Ddg`o?AHp*2 zcynSgU$0VY_Eak@{RAX%kFd12{MI`7B?urYK7He8Bk%kx9{rTzPl}~B9GZBI!mv4A zLpmv1U+YFUqoRrO(QOp16>tk-{uvZI#xg?)L_USBgC{YTiH#~AFt9AW%*VQRE^1eY z_S!l}Isl|MkWHFS&wz6e>9)>^#;M^53>)*|nTu3&?a${am_wHg%@RXX@1qIzBm@$d zORNVjP%XY+4eYJ=R9g4{p18!Ztn8P^A?Cs=@a9CloDZorL0C->QVm9b=qc4Y5~}Z< z>Wnwi8gDx9jGw`gFz(=^Z}0`_m+0XXPi z#?*Z;(GC4R*Dlv?*ZnTf?qj&~eq4p_N!6Ca)X1NVdvXh;Cte+$1H`cCL>Rz+dyFHHo|`Zw?~!`PR4H`=p;c)0U1tRxWP4U?QmCJLXvYAwxaw;!zm3hCRBAtrtxuS2Q$moZ!AZIq$iZvLIPwmN5 z^aSM|TK10>3LfT$8i?NGN?vJCUUaW`n?Lg(y;7Rao`+xi&*_TeP1E{^$=90vgDX4# z*AyUX%WvZE(mTO@yXC+g8=k84{4t6+yhDh$1`FPO&50gn{EgnY9`QxO0eer5eIT}{ zH)ijlN1S+XsDVm@-6)UxdH^)a#~#QLh4VE$r9AzMvLUx`PjD zVI>k)__jzTgQ90yOj*BCSr)6TWJW#f6~2F>(0)cR+)Wm!!u3i)d4RS+J~^`lj0R(h z*4wA=nKH|FVPq@iFOp z6;Rm$ecotHGrHkcB^*(Vo{lMjNIdMXWR=Te>lNE_VPge)Zi-nyWhK8GjbX-E{`F-A~A0c5pavSCwrLfZF^(%g_ z?lr}Py=R58i{jj}sPtA$J4O#Crzf-7gP@)7XS1E4!=ML1J21^&0d?Y;xDL07VbCVJ z?c+AoPZVjsL73(9+nA-l#*-~A1r*-Z_6$9+{8*cs7D%&T>tQ)_b_zl44GxYrAs;=2oUAL)P*;KuJ zQ+1Q8y7`Xkv6~XJ56l`Wf4uA~rH_`BzCOFU*;U=d1t13D8dr6N3t~ol4#A9qCqEY` z*&{-IHHP0#;2J1{(pO5L{CH_wwK7x&V+YFB>ZV6$snyMi*;}ifQC^9QybzUas;=OB zZ}jv#06Vg+WbV)D&pq(x9{7LU1K7`^G(Oj$VtHheR`F8I`#DDWJi)(&?J!DmZ&Q9( zUBuC;?l}@g@K+u~7T`TAo zLGKkbAn1dFJ}T(f1bs%(!-5_c^p}FZBj`mzXNfpnAZTGb?%2F}y|R2qS3Io8m38(t z_NInaan3m&aWvbTRVI zi$_iD9>s#d9S(bweWkLzN7wse>l+)rh6Q_fB+?zyjHfxfFVfqnMF5FTkBufs3C!fQ`?HPkpz}mzS&36iVw* z8T%tPa`O|d^Chf`br#Gk`Y=QIZ~?wl;PSp9t*t}Gf>pF)X(xx|y0?Yn)BC3vIN4|7 zKE#!9*~8_h_w(0*&*c9dr_U}w~{V)5S&ncK|0p>k9m&b8<8JxfQq~ z8*ie!$WF-u_N#*a4;Hbrm*m;hdRQiGrMP?*qtBg`_&X!$Q$_4NTLgaQSY?# zOuncd)8m1F-N$g+Nb3&9betU0dp$T`6xL!m`{R#zxFQ4 z?(Jf6+LeUXmTj)BZJxHfT0Pi>%GdKVPwQXa<=Wc5IlqLTcLId7i=H-BSWsKHG0z?D zyEnPqp1ZefxuudY8?N{FQOf~d}P{zul!uJ zO3EW=`DF#?#9%8H@$}$1I;4q%Zd39&Vnz+*o#ct*(cIkc6b|A{+?0lK63sXSSAhCM zo~VW+bJz_h*Y%*!(-+hjoqa2i^mN5yqIJf(y8Lou7u&;ku|2fa3NLU>j&`N<1&!l= z`4}At%twr)dij{gvwiDk5x`;(ojMx-3+0TnfTqKIQv$2dTc)Fe<^uF6_JF4l>NaM_ z*8!SEc2r}~9+|_*K`q+H?BR&6*U@bSbmbih!~Rp9OZUN2~!oe&|Zh&@dJQLqq0a*xMWQq1Fg& z;bP|%7{)NJjNZI#0_BrqfkbCZGE^&gJI^Qn$IXH+5$(qwmU}$dv%Q{cn zOPqpoGVLBO?^i}CPQM_7Z)Fjw-(TY7Mg0PxJ!nc&Pd@(`C}X!GGZ#Opf2hO>j`mqN zVb2R%4wihE`gKMz+YE|ZMowS8FVg83N^*b3;HJ0#FHk^xBeH(^UMUZ?uNR8ae<>&F zPL$JLi{uZ^a&nD>V#CPbjQu3D|6B-{Zv4o$)ITlsPYeBiAt>uFZ2#wk{w5(O_ltIl z4I{a~MEbNRRjB_kF!D?8Z^`|&fjIz?78)dXm3~OzL1fJO^8NUr&>x^eQ{o>3z)QLh zd9%JEp2rjl3Z!pV8dP4Tp5(uTj9Fj4Z@)y1MG|fp46cR#4*?^6+5hsrd|c?ClLf*; zVf{}Q=*z#Ckbg(fD)b~Ntp8gD`tm)$LTqTNDngf*N`<(o{ib8qG zOL_!4R{W&C+&8Ebe|I9~$TlU(OZqY}iXEvh_ZQ^ft&9u*#dOT+%YHQ8Pp9PAjBC@U4Ejz%p{!TRUV}`52rpV-HzX#dprD2N{{d3xAOT%nz{?`2Afj|L+yo5)h5YYZ-81Qk+3)+F|NkdXrmId> zojP^u)TvXas(O|c_=hLBTvF_lAYCOfmUmvB09oIXwEeT@JbBU}slAjZb(7AQ+9FpX z{$u&_>`?64Xcvn;laQC6Huz_`K?#iUna4-`*-gYG)M0&Mweu<4FzbGukCij_ zlq8QxCzQ0hAF$Hh4@?vA*fT9zM5XPstn^qplE-o$yPU@^7kh58v&WvX_OWgJA8WU7 zY(gGljOXzodBk_~lX>|m`aUp&;n`Cx#IvV(1w8hgVK+YZjFr0%^lsEPe; zvmze%A;dg_Zn=k4=IWL}*hu{Q@!u!?{%*6bpXSavs(0(R;rQ8ay>R?&fPeS14v2m) zaZD@l#lZ4=`S-N~FK7i$9KVNWX)ExIR_J-R75Ii$@FcgA|Ie-DKix|HtXAMBTY=x& z3jSa#@a?U@8(V>wwo>mKt-yyusD6+C7qx;vr4>A5Tgm@ZEBT*l1^z}WcrI)u|B_bV z*{#5DY6YI&3Vc^9^qg)5erYTG%xNY6N3FoiTcKxbEBP;OrQU~H$?t6?|LuT#Q0BLv z4*>W*Icd`hoqbw?SGEG*+Y0=OR^T05p{IQ-?V8w1{Ui2II96Nv6Z{US?{_!?EW* zg@FadrFTd(7taYu3riQwnHQKPP4Qhjr8F2QmKM$ol*})lRx(psxM1468Pcrzr8DQT z$h_jYrPBP;z#IS(T~IuGfwW-e%`+FzES5@VE?6*sfi$D|=9z)O%*6pF%vvyWrZo4~ z8FQFzS_zP%*o-*>S73fg36YdeUvR60GNp3_&Kbc{Y08vo3m48@5STJ++8mJwd8IiE zrv(CcNVAZ2p#Z!u-s zf}7bo)`3KD3Hjy`1h%0#o`Ly6w0YJX&^%w7wP?Ydz)WTh%$YlL{;V0(?f|xV)8>Nf z=p1nNwuSQ-G*^qlrQorsJVpxmGJjDVws>Ix^`HrJ=ife43JO%y(N*k?8T02(1K-)j zsIgd@&YrYLm=c_a2HiSSu%F;5Qz$M|fDK(BirqfTX4we8Z|JZo{Vu)y(*9B`oZTGk zcj_KE2c!mo(|@l30-=xm2DR7m{e zalq{+iL~AhIBoveC(8kk=_IBNa==-4?33q!i}it>pgQ2BDfTIHz+<|TY2zJmbV&R& z)dBAihhp93fOC$HeM%j0d#Nar7CYeR;P|J^0Y57am82C8xZ;3UIp8rFWAYOYcqd2x z=N)jTU9-vo@9fC`rUQPC1HRe;Pj$en9q=v=_$CMZTnBuM1D@u9Z+E~s=f*y}9q_I( zAfAQ;e!c^K!~u`_1eo0DfTuh1OAj^6Ep33Zt9s}a(cECLjc$x#=!vXg=;5{Ai z-VXSM4tSOW-pc_Wxaxqbp#w>(F6Z9WLsBcM0|`xA)X;{c+IWtp0sWBF)T=+fmF{^6F+Q8==I$nZ zdR@Y}i}5WY-ji`oVP>_6cV(PYm-(iMpUpU@Ec1C0@4z^xDzi$&6By?dWtNHf$vY9} z)MS>5_)*3=C7Dx2d_Uuyip(Mr-@`bkATv+IcQDSW$IKG(ZH#luF+C#wA>*8COt*-y zXPi@vDT(+R#yPc^M@|FK>z|BsN-=kf_^XU_DlxZ+_zR443Nfoi{7J?+b(n98_#YYP zlwm$E;wu^FRAE+$_&tnsiZIJW{7%L>HJGI$zJPH~3FcH0zlCv51!j?mPiLG{fSD)a zH!)7tZ)S=3XvV4XO^=9=WSpwrbc^^<#;M{>NyM*YoT}YCa*FNm$GC^_-6DPo<5cD5 z77_2sI90e=E#h4nr|LG}6!Eher-^1hFX9~-rwTW#L_C3Us&2DP#82LVI90Y;D&j{O zr>ZumiuiuUsiMsy5#Pf&RkN8V;yW0pN;b1Zd>i951x=5Lf5vER zD$?|b_(;a78cnx|4`rMx(Ue5|O2(-Q%_F~v{%1Uo@!cYR3FB0K<`xm}$v9P>SuNsS z8K>sR;2id@YV-`e+qb5}Eksx4(wgutfVqTHm~ zS>hQc?0R+iA-jNDbGnVH9Z_qHt5sK>y7hD*HIAWUGX^PEzAX2lG6;Y0-0M~Cd*f~} zs7_u6h-*@?Y&qlTA%%2bJ3B%(YuMZdpcyw*3(WR7!06~`E>waxX zMv`AUT&Nw-ZZO6Io1UMMmahjgJfUirH&o}!SKc@hDPcZcg}?o{)HLmm!HN0=*H=Zdk*LjTEpGwU!?s6?*1bs5U$R zn9Q%x)uD~2LZ=cJbySNts(QDLS>TGJ=r(jKi~fVPzk)I`obTHSPgpqDECtSg5a$Zu zEUah1EVPA%HrR!}i5EI5c;P72!!AS@bXo3|Aj=iZH1xkpQh9YCE%Fl?xRhuhDDA;H zrD8sKq{}JDsmTvRMd&1O#0;*+sM>_h+k_m!ay!qV?06;(laxO z`&CD=5`h~!sZP~)pyaQh-zqU(lt};OPL#OHLCuv;YCeuiuN_D_o^aQI~}<;9cZf!4>MI>05KhivXOr< z)R&>J80yK;rQH!qW2lUwvl#l6p+ttVJqVrr385Jb9bsq{Lq9NdjG?a>y1EBK+Zei^ zp-l{Z$xxV~3!qNMn{Ocqd3MYFK8y^Z?V*gO&t73BvSD1Hi~4@J;(>4UISLOYdqveOir}e{Z?udSeT6 z0=>Ji0uzuAh`kLXO593C4&>FVk8p>oPk~tFzKMwY^huc7Ft5 zJZ_A>3$pg>O);Id5XcFB4LKeCsb`J?Wuc8tf-QP!T1;HNI|kMcM@O#VM6DfCwHkDJ zCP~y6CPfO7f_OUPQ02jAsoys;cngEzgc2EpJgRmG*&2XMjF>}4M<^t6e>#Sz5|$?} zwnp<6n6!c^Wx0ODJ1FJ7G1xzN^GT=;ei^r;d|lZa2ujf|&D5j6)rx~k`4z}*qhIoc z)!P{WnWv%L$S8eSiI$&{Nb1%>S3te?VV`Az#f0^K06Ow6Pl9q!9STIpGwmFtnPEir zVIGqEHv}=?2M6ov>9>L8S}^mlaR}PO(baDp1<&pSyDXl4WAW?+pk@imtJ*}^BQO)( zeyt=UDLPE8oS5Mu1@A5r-G{MftUYKE^)UL$(S2_N33DDm&SnP8s?yURD2M79y->P~+8pY&gZ>Zj-57;!nhqQ)P zd4cw;Kj%mwX^lrj4n!UUa){7dsEFn7YFYmf*8e23FQBGZ8DgBY%mRLQso0P}K4lWkAG;V2eCF?~P^ zNDtLDi9WZGv_lzhsL2)V5t#|)WSon9-U!$U+Yuda-iM&ly$o?F@;>l^c2vC;xkNf8 zYr}5ArcSCpU~>SpaDig5zDR@wR2wg{Zuu0_D%B>~rVCS#L&WKHS1LLJztIm898H4k zR-_>cQ*t@-8r?+ir&bUrhgO)o5yo(~nqoedB~>w6VPj!kQj3;5^}niw^?#t88me_Q z98M=)&qIks36SSCejc>@+N_kjV%Y{JTbtNg~M-dg3 z!R`}1M}GRW`e?UEW)XS(1GqL91Oi9%2%_Xi&uWfSWQDxGNbI4dX;R<-#cnUGN9c{+ zkk+Q)jWeZ2M)a$u4hJfwB+4h+!c*GlM|Dnqgqs!q`4rx2$yP%y{qawTG+ z>eHHBPOyGHN(Q%kL(4ocCqwc)0281Di7?Qqip93m61DOj!CVt)7m`)vI^A+=v(|T9 zzK!vr`@Vae3{c9WAi}3l#@OAdl&?pmVc0wvjGV-Xd!ogs8+Ca)=at5eN;xzx4YuGI zzkXMenA>zwti+>KEJtW<1(*`ym+`;>A&06`us!0N;04BS{Mt$M+dBu*m-=LP^p=KU zCGJ2W)pg*hXn`(wMm3eHOH1j1Kt(kMb_p=W26j5iSz~e`LY)8p@HGjQKZ6oSg7GgH zOagHyYkac}Nf7xMepB@xiD>*j9t|d$K0UMxxBNM}m}TW~3GDlf6FY6(b1b+SMdQa=;ja;< zx*PDAJptAk`%xWL(M@<_!b~>a$LQknRF{19buHD=tSX-pet`POhxN6sj|wZpF@1Cu z(8DajA}`RnvY>@JdKmIhaWF7IEG9d)R7M_K8G&CyA2Hdfj`l+vy$G#esn&!}T&djG zj*i5PkH?>j!A)kB;k}|og&YHBSI#@y(mBepSB&kg$vA--o*BsnV}pMMemzc<qUZ#Z0!oR4`y+vw8{6!!VmxAj*aNOGy#e$}-fVnYL9n&`%f8Ck>`s%@u+zH9Wm zqH4|e@JQ}bp*Qo8-?)<5D)Tdnd^z<2IMkYq6+bjJjjZfDleGI?2Sd5j9}pZU#1dju zWyW{3X0t$5fuk|^ZUsFwxbsw9$kUmg zzFsNx%S%dm5jd;M`#1K)^mRIz7RudUDeCp1UgJd+)#Q(nh}J*wAV~9mKsA_qF-k4! zpjGE9@2;xO1ghM(M6vP;q(b1XytRiE_CdVYY*&S@Jr5G$*K>OU?hT#lvu5HLue5p` zzEoxCmVC`n_2i9PhCzZx0S10Rh<@0I!NffQ^3{h3WO5JY8cQYz0TAt4FZTs;{J@A0 zTC-lp8Q2fIiD zCwyI{u&WEv?~Ufa0BxS)boojU6s9D+&o4D+Q=qfZvR22mQ{H`(y&@WRqK!Zo@K?!1Ts=$giL(a`{PRVNZ>{2 zswJ%VrW+uQ?ZGR{iro(4eZY3#473gk#H&QkMH8<>*6<8ug}@E~k-kuUf-mRr?Yqq( z>=<2M1+1zzED4n*Q8%?A_j4;)mr{Nkwh)0NnMlNF`2ozL{@g1@%TG7=0PBt@@0O8v zxInFO^S(W9w*Jnb`3FkI2hBN%fQ_#Mjm5?`0GPja#xOqqO}=)_oXk1*z5CC8b2!lJ zx#h^{(>@QaZwkLSj)eHNjm8v|@o9!%+h0)L0Gkg*uBl8M=+}p2`1;hdz04QL=nVwJ zfIzJ*f=V2l;SPTY9I$E7p7VhNI|>=ZuS623{BK)y9A$TX7jIF6ANsSmkqZc#^~J1M zv-$#HktjA6RBe+l=M$>LK}z{cSeTg8&==VLFe|X73o@TZ$#5B1t?FYlvQWoeKwv(G zEf&8nzX4x?*&V|kjaRi#eW>z?4Fb$}p>C(oVEX0QKtQMX&>Yaw zH$#vS#@LaJNA{p7YyAvmd|GwAxHV!1F#)P9(ao9p=2+&x#4=M9&A(%Y7u`qP=%Y7- z=p%h{Z?W`wDg~J6e0mT8KeV13lsE|J9K$&VIO}nej}?zkQnlGI*)~FC{Lo%*b1X{x zATQYs=Es=bxl%X+rzCn}C~8ynYt!`G+&OhhxgYCvXyx+uV4lT(Rrg`3uz5|}>(E_91gnBKFva*F2aRH%4jxTo?xpPDizbT>CP^5^*WGJ(@HR4+9sCIbg%lAmdPzoO z82Kb)I*@S-NS*7BOeJ9Xw{{n0W2h@PR4bkG-1slTe;)p`@b6JNk!$efq|}z97EQ%r zj+EJ~P*V~5rUF|bY7s(z6Ui7|@(Us)w}H2SOI}3`Z+f-28E<65D8}TCts%r}`m!xI zO%iQ6C}@`}fKZ6d`LVW~i$F}=6El`CPHKm_N~z$!3aZUyW%_lhIyiM3iYgW95MfnI zNf&T0x?ApmV1s;YqNwIP@E9z+AXd$~*qB(2K&s{~`wo;m(u2keK{KaAtnBtP$dU?O4V>oueSQw*eu@^N>6_6uU!SiyZAj)=xF)C{8pZYwltuQo?9Jv? zV7|r72Kn0wf+ODxM#{-#7{_Z^#34j<;ls-}Ue|52WgEk}bbd43`!f)J;(5VGX?E0Iij-X=ow<#bs5MxJ+FLJ5B2 zCc(%*Sd6T_$7ZB~-V&p6F9Iz|{|{Q!g7k*3ZHB&rq540PKB$@WuUVTIienJ6NbeCR z{alOm#ieJGo*_v8`bI%|sUTHOijkflBR$VbxPl1uJdY5N)#&T`Jh#x$8xW2SPB9lz zSHZ%SjJ>_B@nk@mQmnQL?&KcClG-tr)&k10^rlGtKdIAdY_liEG%6KrZ2WY9%fOrt zgfYS_U0R$$f=C}_mAbS?ANJmk@qz_XNA{L1lVhZpC%{DS%|O7y5VMVo=H}HKp^VddNJ#}#j3ALv{-%=M>#}&DY5$6i-5dg9vPLF zwp=Zdpzs>xepb23R=G(iXHg|e??sygwY%dTVvUJsV$>CaI!myAqu;6XQ8wkfyHTMv z9#)VjAylWA#f0i#BAMf1y$Hz{g1}}4L+xVZf%6Trc7tH(8Y><0e)u>iAg|TW*#rSvv0gFQo za>F=5QlcP1?h(toy{*l)&k!InsNX-AZTIGxKcl>8pHEM=Y!#tIfzlYi5fb(mdbJhx z_{5jCNNk5R2=xeDl6eP)Oe-a3#Y(&qD}iQ7=7`oy^pBMY#7aOxN@glcz?=z#r)bBg zMhT_{*gJ$7)n5o(6qAd2uHX*Dl;*H%8(A-$;-s1hn9FPX*&gb5Sd;7yPn5a~&1AimEM{@PdjTWBP z6NZU#DJT+#Gp$|KvdEU8m%ye5Iq!PWYXLM2BlFg!wjj~#AY`3x0IP>>K{`taQXWh_ zbY$lxaY0&*qDsXgN{W`!M!GlGV%wafKgyg4h zi48+qxMCQ-zn;S|!D?1-t67a(+q$7a0LPp%9Ul|{}X*DP#y(iV+QtYG=DsVs@6{={4P)pIwR6f_rE%+tOF9Zj3k3k=|SQu~n9Q@GJcLM%fHHkuh!rtC#|fhR zfTvL2S`q*F8J1Y*!}%T)a%&=c60}$o3%SOLY4VWz_aiN`3wX?p$ZP{Y zCvXXYZxVy{wNIPZTa0Y;ZvqgFt+;^Q;8I*0pVc5wvTD_=T2}yxpqaSVFnLs~)VCLDMf?cnGC3XRxGmU&@r8R5=qs1!delS(kF@%$WCcgw)>gA)0 zdWc(L_3{CP_^E?T%MT)vpL%(DJTw9!$d6=x0@^gM+q}G)#(yv7VB~uIRbp&58HfwvOK>-2Wc(FFdPz|3Y~ zE`SzA>yQF29oWis0W`g_J_C*5^<}&K*(|@(%2kJ4mgbrWt_pr7Ly`Pf&GiDD6Sn3W z0aTXe`T*>-G?y-tskxSmki2ImNdqN9<79lm?x4mATuw9l4-QSEl3i3@E5P_OG))xV zYfHN12Z<7b<*URBUX#;MkzbSB<6&L|C15wS4`_;fOh(c2uz}|gXjrY^w1s2Nb`Tsy zUwid%)|1mfZT}2of(LB7>O@l$`o2MadXyM8>yZh9UC)-mN!eBm7}-YsKA>C!8M^9@ z9He06iLz6zviDnM$scQ=pNV0Sjo}C}{M(YD3qfSG(5_+}GDL0y_0j$|B%hGi3F&D= z`VsO7A#NMuA>=Nr&7b|7B1u04{J(%>!Yl(}e(h)V_}5~wnTW;a5jc!r-2#WPud>?# zx(y4p`~ykD;PA{m4JfPzB_g?MmY>K3XBSX04&x1a)w?jN5mk{+Eaf z#sSXbeS(gC1lS+?9qb1|I$XVrE-cgz!OhzRXm4?#9R;+o(BS4hB(RQ(V|@u&&2J8q zwya1vHt|6rOu*IvM0f83h_0@}sgrvi3c&<->uOPW7jk-6i#c*Zyd>vHlfODzQ&n%BK*5vVc9}Pu%D*Op8y`) zW(ZCTkMo#p09MT$~6N3$eZE@cWSy_)#@m zT4ePjt5DrWKZIKBpW-}dSuTCk&@C?mcb$B43QiV>a*yL7Ddl&;+ogtbw_33ZEB28U zdzdjjZKlS zK(&C0DT4ViQ@nB;aV2BdqCJ)fMF6gpR>);|V($)ngYyWHOY!Yp(N0epfq-8-1@UQ8 zi))m33tb4}bVG8bbhVe;y49*{GnC?TX&|=RHZR+8{7dG;wvaT85|}#>^=U?apGHl7 ztrVyWP}|u+T33KpXqiouIgcF()!<;+CCYtQ!A+0j4bny2tt!b#_UoxXvy{9G`BoH= zF&`l0*HglHjMDpV_J)=YkpfA&{5b&89$p-|)#S|xgKrD)@M+gu`RWUXxHwoKX9V-` zOYs&opo?Gc^$_at!S#J_J}gJT`r$m7i-7xT;9&D>NBn(o9BU~K#+Sbd9F;hs!Mzn6 zkyW+)jNVJ`D$u_39{;q!b*!Lb=NeX%uZ-H^#nDadcX&g;bYIXfU)z0rOTOy}CiiQ% zU~k7)nRpIsQBh0ihXhe=7pvM0O6YR}pikZTIA~~}2gGfY#33sZufk@yt1|K2ob5{v zk^z2D;vp9jf`6!&Kbiyq!^c}+;NjD(0yWsPa^+*v!C|5CKx`hR5n7BTv3DJYR+BG# zLt&elX$2K~l?R0*7;Q>Zk8feyvLJ(gCEr8^8EE}FSe7{91$PflJys^82kX?DLv3)s z2m6}JwLki_V44c8jM>Ln@*z-b1=u)%J)^T=pKpA{pQx@)5W{w$6PYyvMTJQ2-CA6!aO_O}Z8@ypg{mQ5#7!e_0 zF>c>X#h>!Hh4=~aptRqX42lgi<@B5$S)(QqWX>-3L$-iv2s5KB~TB>kny>L zh^nJNmD`u$?iSiSfiKl79x=2(SZMtM?IhIr#9>?@7SRK7c@Bfa_rr1!gOx~=zs-ZtuP@$43YR-No^bGQ= z#jr8^;hb^s-(hfDivF9fiZ>9#u{@#FXw;~@^RBu+Y{~iKTz^{U~n@PpITIWDjK1#b}fEpXz-ScQf%f`db$tw?8pe~T?f6DE!J`$(`oAG+|H8g! z5`{^Klamrju1FA!#H6KVK4hUcGl3eW#FMwso(^-sD=OJ0ADMHeaj_S$@W00kn_~M0 zm^o=tND*IyA!kVJ8+vPO3eW72Pmh^32e$1*;-W^6mylF)N9+=K` z8(Ge=MSF>%&(~`4$3EA;^0ibtw)3?cJXGbroS&3?_S5y}+FYCb3dA$v)jmeLQ8dfAO{(Wt-Uz^huE`8FDlIW`kzu;vYVvJXZt;rWtE(4mQQ@(FK1-PIP>4%TZEX3pzPTorP9nZn_IO>*dWj z3V=xqp<0Ca5ss36NQ6HHS9BYM3=IdWP+pqLtVUcPP>(8kqKV!LRKx?0+R@M+SLig9 zWHx}=o3js^6Rgw@c3C}T2CAsM&NVpo1_YGKZWftGuLsF_g8Tu8fS4yw!O&s^(atPn zRlykcDLZs(^d<0N`@h?2rwRJtGYTN^p zmjRfsE4-AX+F8ZA1}WuElqZ6{sGpXfS@MCUJiiD9MU;lDU?bl!|vah`ZEAI}d1q zv%A1~8*!%2C(Z?~mAHdYylq9YTN^M*;QB<6R|-@ZDyrJ&3(Cx_s>-EFp?!_8zRQLr zwO8^FH^-MGxd^~eN>Fn?34WnsI&)WEpA_2DoPEER`5G4fy8KssQ`p_W-)Ez8e+PJ) z^z`qFNzs@14xMVh^meaySo?BlW#62f&zIf-&%&{UJOnuYr+$OpSQ#kE#vH(oz;7MJ@iZE-_2WuUy)weH1zcJNMMx z4El+%%4cF~1?S(H;7pJ!~TCFaDX8T_h^2MSY(Ei28Z~o1StZzDciId_r~Y z@)iFleCQglWQ>oXi!$4a3OCjzwvo*9aO0$2E0kr}8eP5$T_^NFKkyTXE@fAe&;JryKM%VFa#zB1Ir>yj zJaD$>pi=%L7aV%-CO8F*wXnvK{1w6|8Mq8ue>=l^w@vgDc30~YX*b{kS%ws7ui}b> zv3)IBzsuOdC+u?LV!RFkIG(U@;9#l1pHe08oU=*I*`bs#C9GnbQhqf8D^trw+JGP) zE8t~8CT)RRPpuH({+qOM9k3goXKePL>X<+p(BN5H^=4=S=itVfIF*=3CzS_tB%Ga5z zUS3z!1MhVfP5T`9!OP)zVAEKW3s@gnxel~=8w!$ff%hK>`nAk|A_)t^B=beoxw;o= z{S!kO3_ZxuMGRFiK$VU=OP&yODOoTm? z(@0p|6JI7TiLbtxAv)(*b1pKcGnCE{7mz?U1qjgD+fe~J8$Eqii~hab(Z3mM&gkE4 zbU7A6A2(DSK=;CU?F6j8%DY|0e<;W#>>fbqCD-Hwa2{Ldy196}7a4}uC0-6t`ZmE4aGJP87xJ*E_^kwil=<-s0pE1Y1 z4gP59(~)G&sEMGu7ac{b&u5+cDE7@2d{ap3zA-Kk6>ysR7a&^t1)_p(`2OuQHCEtH zh~sZZt~?&ce;@GMUhg60%1A3(BSSq6-P)>sdDcv^d zV?0{wI7aj_*o;X1gMg!4?F8oc-au8X+@`D-g2p%kZ@$ zTL8la6WkNIf~RMSls^89sY;)*8Kp{}r!&fss`Pm&qe?vgmhrrJzMb)=c&^K+##0rC zc;VB@QgH-+5O)Rg{0ONb`PE0Q!{WuD2y&V~>CCmtAi%=E-eCDZ*@LUuTr>oDap0Vnx8Mi3)gF-$+#YjTQ5axAEj#0`+n{I z0P>Kss*_UwI%um>t^1S#ESi?W>C_ZBMANn{sE4ZAqZgF$O6b=7iX(x~qsw^N<0&u* zmR@8PN*j~eN-7>)J_IW^iVZ*sN1NREhrggqbXupfG9&{6H$uzfqiTKG^GM>yuPsi( zu`veowbBxd0YR#&VNTI3vQ_Lwhc+aMD}R$}LnrPCq=rt+3!ED|F;}VB1fTN<#v^Fl z_7AEa#bfISd5mH0mvVE?nbKGb(k*HHD?;)6PGca5*3RZV?~1ksN~~Q?wx|gIdHB!5 zzo+@=>n7nR5Jz9mo zz}rS^2AxT4mpHM%f~sco0Q(oX|A3lk`p7sB=B{1MUHInvV!C`2lAGfWSrqTv`Tu$R zVU+B@0_5rPM`-(RcOW8w#RlG6Z-d?c%YpYeQCb6U-8(3z52ygd8hAV30w6x{sx)jL z=RQ7yB-lr_14WQ%-|w8s{XZYhHY4ybVXM}`(<)Wln!U{&hj&_7_i38%hZXs>FMQf@ zFR!F#%Ag2Wo6{mikay!;ww=Rh8Df~f;}XX~6BoFAZ7L=ToS@O=wnC7G0X;hfQLg;Kl=*QkygJ3usUb$HbJVLXYCX_7k!cE|Fm274r+qhsOLFKR6jlmlu4khnF(jJ zbeR`5&Tj0Y&RA8n2bQW48-G?0+Wqi{jXmTVS76C0^Gxc1#hjxrdtC zDEIw@>7ps))cA|N9Auw7fJG8iL3ikp7xF3ezBGFAaVaV(k~Uh*a4X?8L)MT;&P#(@ zdIF`)*MJD(iDl~?r1BCEjvKnh&ZVn^y=eh|WU}Z1 zCyrC_EvdSfy)Y7GqP>9$^yXoBlwzykI49#f-r!^$NC}UeTo*1vo?gI#CS(~UtX`{S&tAqk?_x)nRsCJ?H_*pAvm>O!Ivp5o z%{N}wKR(N9&}2@JPi3FkkmKNx)sU|dY95TZA8wBqSeZ!>W#iPPl=3>uh55Wy zKi+18xfjaGvR+W_gRGV;M}0cOFvz30D@H!*7-5s9SbEE>*3X@LqrV;yPI}5$rp8Eth*ShJ5-mH{MRG@DlK*e!-+!zmR`j|A7AC5iZ$O06E(+dT=i-LlHKrS%+8+fA| zz4gP>z*TIS+>IeNU=4sU7$_c`2KhP(Y#=$XeEDijx|UHP=qYKJohgC=Bv~SO6EoGz z7hl~2b%=i20)K^AEZR*hMH4pw=F>;HBke&gNDag*>5B5rB3xvN>d%%C1+Ic@bOPpj zdCIjhPy3As@gqF#zg}fU>g7Z6(Ax;Xzb1|6_?d9&nZ&;b23o{FgHUtj_V}Sq4ByFh zKvSsS-J7o@Ib$qu0R3#9CpMNBLotYxz8uTH__WD*odJ0Z61HcaNkacP30+%|AnbAW zmSs;&va3mMHY9}6T=6?7zXi{%R@Eb9ub-}mdg2={MS_L1y^S-)nwy2L5%>PHeh2CO zaij|n;`tT6e&vk${++*C?D(Deen;OkTR$+4wHvX<-zaL~$2ols*SM0|&%th?Q^RpG z02~RO%7e#81g;D$wakf%rZuy%ki~Vw|6o>_kE+BOWC++8P=rpL2oNr@i~H;1Ae^fB zw}^Law7A61+p9fL!oH8&V3e<-=nqII@nV6y5CD==5ws2(wLyxix3SKMS%<@JvzF9f zilXuheq`(NRxsC>*PrYU=g*? z(Eb9tu7c{tC9l_yz@wb!rgZb-qFVWO1~~$aX(WX3#5hDTzTXhR`>|fPgXaPI1fbzk zxI4rZIB_)oS-h?Sq)malC8E<2^32OtKX#~>R{{u%B%?k2tfAb|6+P+Y{+zXia>p_j z?1)N6AjE|y)J+;nKu4wF1Xb)+8JVw;jVY&5J!TP1`}M}j1YpopqBh8S593C(DC)-e zqqEYt{4`hdfh$Jp-F_D9_vH9`)p`$3V0-8;ciX^GPDUqrX%{2$`;h$ia`--?UxjjC zMnDSo4do_X18(9Slq0RS@XVro0udJAySJBbAnPGZwbsa~MBg=wBlUskA1X^I1u<(G z?b*N3$yWhMFbA_=V5v3pO?}B?-aMc7gFWlPhO%e93sK6R^^O~L=u+_gc#cJhYAHR5 zP!Kj6Ne4nbt>eY0cb75nV%9G=p*8jJv#}3i8XQJKz5FT=@e}#k??pzwF|jjx(rVND zM60Ka?sMii{5wU9=!{1Y67!cOjAgmsV9_q*@N)!&9J+|nmcw3$T9v~)%LH}gYc1C6 z_41=YV2j~Nto7~SeSlIT9g9iUFYGD4Z}16Fh4(xu;dbE2P2QEGT;(_;@F1WAgtMsn zVHcc5n*$g5D#s-_x-5+I4_&is=F~8qM&X@T8kW&c74PP>Tr;(yM*3wM>6dAQ zUuH6f^;+SV*|}EuWjsW%!dNm9xyI9Rk= zOm&#}!!U;=;}T}(y0K8CZ4@sQj{d>c_mCF9cF1@ceHAa!_yS7cW-be*i9-AReK>a5 zwp)SD_<_S7=Mr50${?6_VoCrnOmHjjoij4DCuvs2wjd0LJ<%&L9`JN9ySucagE)So zXW_+1qg))l%6t7sg?_+G6oBR1SvZLDRb2wkJivvBj-0x3Y(}SY>?*y4ra({~eW~J< zz}Zzwc$@O>dD-jdthf3P{=OY8`|m^H@7rwkALh1br)Gj?RoUIyS9GWMgOAg_QdDWq zP-Qy{lycrzi}?WebI&>fj6f%U(@=m;-X6`d`U`y;=)>Mk7hX1YcK4Qai#HZnzBgGo z5ziZv`OvoFWREqA;q8rB{^WKjgOhsz@C)g>V1lg8Fbes%j2UV~>ZDX^s6~%$|xmnTfar}k)K(xfK z&wyJThb8my&N*xc`t-ZAjODkmF!+1e7&sY0ym$qy&I@FtgV@}BM~xM+8at!LGfYS_ z3b(U%p;WLl-*>qrUcY#&x1N~`pGCcVIllSv>Q`5e5Rz8NcW@;+6Mp(V`qYo0u5*E~InV$oObwd_>A~-xW%ELxg=9Q{S zevM!E6yh*w`F=Q}`MxKph(JbG^g^D-?CsayTme+P@suSJ3-yc)k$o+)7v=;q1_clB zwu{FYIfrb6dLTuoCL+Saa;PYfEtJ;Iz|{`M`Jc19Y6q;cGw!~SaahNL1-NoW?wy5A z$NB6AKtZCOo`?q3%O|m17foF%*^JA#^(T}kuDTfVbn@#9W@9%eVZQ*~`rH(fiuXte ze$fXZkTmlv{bj&Jbz~UZ&;<^p1f0)C>8(@arSWbKyo$&RPT_cPJEi+duN8w#Ga+3+d+OIYAHODt=8ZvtvU<$WQJjzaEOp=VJjCUo#j zVch~0Vtf2*)bA+q%`&Wb;~(DOf%g0Pz?Ke%Uf#KsYISTUNKy_4@^9wbIyv=3e@9=yrXp7AHy9gHJYaIEtniZzH1^Sx+k#yhjE7eWm~DfFQQ%$g(K1NgLH4xko)UIkQ) zZyGj}W;&QOQ_l>Fwf(KO?*I(C7DxPDi-tM$ofwZnC{)}fVLnoxgb4)L6lx1=F!pYV zB4I(DmYD{aaAU=^%X8zc{DaiWCDbcE8HRyHoCbz1&eD#U6{e*1bh2irTiwTG_i(dMj z8-f=-X^-2tA)@tS87Fp9Vjc?I5cFwN77L+wnn&DUqy4LtmqN_NyHN+DhpqR1muIoF z^ep ze%rv+p{4G`pb~yTlsJqMd+ue4fMCtovBN`AmA0n0yp<3*g1If0_{b=^)Xd8Oq zLp51(d-`K`MWxDN9sJRuVAelj^O&cnVm@_@LH!ymb5*Qm%S2WBFwSL4`HPSmqJkkQPn%ES|?R&gWW5vL8+`z#zDo97!@DV z4B1Ju3s0Nrp<==Y zo3MQBml8k42INc{gqJSE0?oUg5;_x2tPXqv1xRUj&OcR;+Z?;VQR`yNCQ~t+Y=}N3 zjgK48k4MB zJ$T7VaA)(&?-${w{IIOhppJpgKK+KI@E<3|a9;@Ac3SXNApv5PK!Qy-aL4Rb%=+)w zgD#(vk5^-1?}nnOyF+_Uhfa0~cA~^bQ&3O9xH8{BaFhE66Zp$E{{kl;4TJ^6Gp zVb?3%4Xrb|uWHG6GpP%d@SJ$dE5vYwVBp{zT+o%*odUjvHzA5^j&@YJ=PiLNI_fc3*=X)@peeV}%mXaCf~~sN9jZA6 z<*(eg7%&GFb42mrIWY=+R?&*<02kG5j#u~hdr(~t;H#xF^mxY+C0=br$zQ1em5M)s zDYUI9pO#0lP=AlM6{Otb7#!v!LQDg9#Vr*Kr6extscU;Vaz^Z&*TpQ8*}|AYIqv^B zb3SV4yx3C4j;$Y`_MD(0v_WlNa$ycmdEwkMms_VFjV-tKB1C?-TyNoc4TjFDq+rfp zB@f$tCtAJ=8hSmNxe7nsumJItBqWh9>`wm@p*Fl_H_S^wb1sIZ{Z`=ge@6*$wr=p=h4--|8RtU+X8an%wVySHC-6 zKW?orPJ;c=WIRqu!)B;1AG`t$#T2i}-!TMwsb^tfa<*&;oRwW&m~+~v6x5l&K*zx> zGmqfe8sAc$6-YLdZ@8$s_y{3m}PM` zYcA?J7~E^lhFW9qFGohayE3P-P{}`TF0}f?9Enta&O$eSvdJ>fk7C^1at_ALvI$-( zd=YwO4MbWp>i!62H473{sQr|U>utlJ%6?{}u>ps7py;>4J#jE77hTSr+D9H*8 zq^c+-IWkTuM=u5=U>a@?rlR|W5#jv+m<7FiqwR6~&~88aFRw7?r(k!uc6N2Kq-=5W>VTjBn^xwxtJsjs~hp4{qPs0 zaS>UbdkwvF-h=D{YZvt_zh3MX zxXe1N5_ufbt>(x-T;4+pp2w94HOqFyC`@rx;KwPfmiipR0eb)+J>~X(IQx-Xif`zX zxqNWAVw!!l1}l$8*AMy-I}^L{YX@b_A3OhoynnT-QOZ|ArNC|MjnKSn9;{;g@i?)L z7gWOElp)+}lX2cQDV#Q*b`f{E20wracWRs-E&)8kMoIuySUmjYq4I?oD!g7-@gxF~ z$FVaMZVzJ2nTR?o%#$JtFo&rC#YppOKN>fJe?(-xk*+gdj=cC{uN28(MsB4=2S;u| zIGP^0j36G6iuR5a#FM*4iWqK7xH~eKVODO9uQeRctmPQmfnF+&dcvOk7_ByDo6jyU#51@?vbb)4gd4~>qFj=aoF?NEC> zQ>i0U1~Qpzks6uHd~9btpDOa*l@+c&oCiX&$}kG1ajfA`8ch*O2299cTdZx80(V4a z6GNgCLt6`jCt4U;%tS5);^<8@8qGA%fi{e2OeVYVV#$XQj>?gz32M^tk&6h$R z>s)q`%H%f80FOdbV1Kvs=lP|2M+l5=Zp}P{qb4wLT|MrQ)Bsp^M*h-~yb{7ZEMQ z;s-i&Z=g@ijtuOg`5pW+@>Xn>(*TBFt0E|GQ2g7yx_Gxqq8Vf;pVqCI5yVh!|Z zyTtFX7}qcYjW8AqsA&JH$iLWo5UysHoB+FU!~neEDec^O{|3b+7pqB@`2!&NaY8G zw%v&RYu-L_N~~ock15iACd2cP(|FQiuu}dtVsv*EpHj8OX}GbSVB9V0gj0;elJh%w zT0bm^1oztMHLivIGa8~Oi!{|%lQgBhT<{QC7!A_<~Mx4Ca2rJ;DBrN zbN1;A@CK99UCGJOn2b|DWl&4q+n3b!->2#WRc*in0IocHMQRw&W=0XonS4#UMo-+Q zs~#<7mB1?Ai?UQ;l^+mTlYy1*MHxh_cvH!2CWfq2#XRz(bZllK&+{1XL3d#6^kzPc zP@Z4QVE8xZ*E|9?pc5X>^J_f>xPQy@YkSXQGwt(hO^jIAYCaS2)bIa5NbLODg8=gU zS_Dt$?F{VKnL5O}ncOOl^ARK(^e!eY&8{w`WVU4g6_6U=Ar&)Bt zJCgDh!-B38fh1AkiC`n(8wC8EO+q|&iHH!7w;9w@H(tVGG5*X4koTQ z5GOkFkno(#Qv|-0seFk33=P>N1^TZ{oh%XtT#JXZ2d(^~2l)$daR1dnb*FfkJJyGT zMNx4E(JkPqJzCKC(YY3lzu<{JjLlcj&+-<4NC(_EDgR>Fz6(0?cRJ`_%S8tn8~D`a zM@9CO$M~>&ldHY6K_U7vAzG7FA#gh%=YiLp>xId#@-i7(0PMEw!W%>yI(E z3xH(oa6Bi#q>asgq0LXxWm%O;P~YcW|Zqh;?+%(%1VbQq;#0 z^a5Amq1w~f#er!?*WqG!eO`tT9&38g#(UJ&j8j$mwBfyd^}`1-ZuAo#dHKaIBrxSA zKG2|kY>+?aXh37DGFGNOCDI4nkB74hpB7-zg?_F7Ca*pY*V*m^(5H{1+L_37Ep={h zXYTy~@J z=Yx0TQ{3@X8+noh{s*jz)G_oiLd~O<=b`xX**K5y)sExG#=Mmy68yzSXeAG`2^)$j zwVbzQ zJG4cd_EH`o)T1|oxFHPd-Rh&4TI&}y-%#&H+wopGktBEJqdrlHudt(7^a9L_*a@=1 z;x6|_ahE$8Wut50lWIdG_3{?1)&(Ex<&T?#S7yYa5gS@3Kh03R{8)3gh0VcIJD6SV zoFHaZnLEpz5@4TKY;hj$1agqvq3F+GF3-aaw9dm7Ew%di;@>+D*BL?)KM(gVP>7wn z=2LC<`nSl~zs$mta3j5<_b0$H@|$<887M8hvc@MZh>htR$}3;wT(*P5s}8ovvlDxY zy*B*p>UU1@&O=`<6bBK00(&8zIkscThkOcZrTzI|318tc7ac=b3}UM$?^wg7FxJGJeF9EfeLUs25${vPM8vbcUIvdAg0DYto7b7RcE1DmImdN9@I7nu?0 zKo>Ix)6wke7UoDkyJ|!h^DA*S$z&6Lxd#}LPBX=tH~&fDL(Z<)%!8D+$wQOuO+*@5 z__;TZry)(AGse>sWD#UZGVVsG<@m5n!(~_@H3ekj?mM8F`AaEngh@jBVBbuPO%gt> z0pkv*zu?y1Wq82@h$jceKn7hK@XkqB;oysJhbe$b;Rj>B7%#OxZ3JGVda*TAI3@=3 z-$-x45X+vx_{L#M<6^ezQ!HRHmHxlFTP=Q{t;Mx!bu~RM-0h%OQ>`q|aAOh1Jr2hW zX@BLq4B>>;z76xY>A1b}^mTzDqW4AV}@e7;T!IG*X;}T2M0+zm>m_#_@-dJBh~b35yJZoWo!XBvxK)W!jDg6Ss3lvPBEECZPy~y-pqv4})Z# zjXewOhRiGCr~)h`Og!Fo;&3Cb7?c4O%(X>n5u!KlA)nws$pF;&9OPR56THD509-3m z`|J=I;m?+gs%-p^GuB!*gs zL_4cc;Bua7$~xm{{U#KRn-aIi@ElYsW}#X=RfglCawL9{_gArymQU~jzTqe+-0i~g zE`07=z^!-Sd-1MAG3HRp+rfDPcRDmQyc8$lRuu#|fAT%%U;Y}2*qBQU9-^nwNJT+Z z@h$h%=$zax<}&Oj8iP;SoE8)t>#T7SEGWyZ0$rB{{%$q-oPgj{;JM~e1DUV}&UTcE zxA!g!0bVZ1zSlN}r((Ruu3!8eSj1ooTO*1;mwF3MoJOw|m-d?AXtSz&d7-FIDL(+v z?{j&&vsRh4+DFRYM-iS5!?Bn23b+O84>uNvD14(o*_`R)H7_TD@`sv_$fuS*gL38CWx zA_2XD0AWi&MF|i{lZ6f>gk6v&hAbpQHj{1wDjMxXY}+W~=;+Kij?TEw=;)~90Adnk z#|_*S5!`RvAgCkY0{wo^sk+^_6AoZ3#EI(5#e?-Sqi?Ar8k z!loZC%u4*Y`!3JiN_YDS%%_HbnHhPnjY_7`{jl+Cw6OnA0E#YX!YR0P;(Z^0kihw0 z9tp_VZ(cMK$m0abl=U$RFm7SA&pFitErA%a=pCQevKsUBVT>>mbA^q_{VN8*9M4Fd zVANo@{V?I1GCAOJ?M^q&+rBMpq=~((8gWV{nuBS-Mo(O z!v-~Fki=#KS^~=ym-ZFLq;V6*8ShpxX_^JPj_y$fZlzios}P%C@|5}*mIPbe=5bbYaV6PDu8(fJiDpK-(H(QsJf8w4{VPV7>g?@V5j~pEbFi5){!h`& ze+F7Gn>ot1CKG#qoVOjod7J%~Zocv88z`K>8Z?ZbA^k0LHBt+ii@sFWV0Qk76nG$Q z3R|m3aHIr_FlbNK59u>{SH&)V4W${SAF{*L?}4FMV`N1;>xXReue6(`G@?YiD(1q| z7ZYjiz>NR2JeaZ-V!cu+dWCV5<+32~Pt5gV1mc-GMwlvJ8E!N;NdEn-WAvWyaSS-L z(}XJ5xt76+M8fwSekWAhnx>$iC#=Gy-tb%E5W~o~2VwTcNdue-zFqWqOKL_Fa70@ueJfwuPdIt$ zH4z*NUdG4Z0Za8oaJUd2^j;JZTF*Ir>@HiAlS=*w(38!arq9qcu%H8(6+EzZ7L4lH znljLk)wz)a}^xQ6v_e*yOD4#g!NyI@b;w za^GV;s<5{6O$hP*K%kPeny(z~#>!{DCG^B$htME0>=Qhdt!-@sQl!NMOw9epeN{la zk0FH2eA3bEKA;tK8wt288IC79p%j$K8k46 zA)rxRlVI37byOGEWsH(vlqh)xiowC_2z%m`N`HTjAr#X7LdKYb7`dKBsmYLcNgV}Y z8j-fcHf4w1lb1TmcLi3Qz;54c{L-;eTkI7yrs-;}{z%4}wrwL2h5)+t$2W{4E=ua- z?=6Wvej`Dr+_B5ZmA<{4yGZB05qXfCk0(;v#kj$k(i z93cE1o@qzG>ScD`7eEN;h`%SB826AiP1rMM#G4K`(%_0JPyc+ko5JHB>X1%WjNsh`k;bqF&>GrZA?QL zSXSfFq?fr*L^z8fpyGs3OCGk~-gA?PrfIsIV1c+w6JfQ{?GP?Y+hhAvdxq`aZ9|Xv zV?j96)JjB0W_btNAy@a4`+F=&kD%#sk3cyZmrSnP?%b^H^`#;U#6oww51fRwudTT| zLR1zXVodm3xhF0Lf+kqe7s>Rv8L9zO_W6!bcT!KC6M7$QzMs6$x7&RGEl>tG_|VNP zH!^x}+cPsDuW=!#9)w}ajWu8Q{Sis<_6xkt@_ddlJhlSUd<};J>bn57|JqH)1%TJH z*;{}DfiF04LAv`p~cGOSiny^%-*hN8+?&IeDyUyS-W z{vz9p_|cvIT5KX67HlO4A15>`qT1mh)CR@*7ceIP(Eia!H_(&u*fSzt9r*Z6-Sv0>vw$MbT0X=J zRr#Im3s45wCLZxltMu%;;bR@8+<=u8W$p9!dNL+a#Lg~vb*C$%PX;{G%w6Lqssk+= zV}RG2+Fk#+p}6vT#BfJlgCv^&0dHJA9!9sv#w~+uyQ|&XtBl_4_Czg#3x@1MdVdIq zun<7Oe3LW{W_kPA7i~>{Lr7qc??E_rUIQrX5R5{eI~&pccF*+6 zZ|%04oIYi?>mfgd)6w{rx)bh`5%p(nSoB-4{^sMSZ3ce)39P$-eHWcPZYTkr(t0I+ z+UDaY%RA1SlIKl*RCmRoX@Mc_o*vLtJ!bT>6OmNi$L^`tvpv@(*}XZ?&49Wt$b8>PREk$$_;Pp z&hqczBJ~>SGaWlyNb|+G_XSbU#W$yImmTVin9W{AcBRtCRgzsQW08X_I$&Ua`Ad8xaw= zhT(~!L$_d&Lk8sIWbPB1D~);aU_1o%4`6l+ zqDd-2peQ29_MN0 z%>m!2-5KLvSuViwAqZip(BIeE0U1CA^xg$axqQ~9^x&ZPwOTiJe}^W{ra}1;^< zI(M4`(gkgVjA%;h+=3UbTz@+6kMofauHk`(z<0Uce5BdwObV4q=WS9yz{bU%W2y%j z=IFwD&!m+{lN}M^Jd25-ZvelY&6LogR}9w%6Dq>o&yqAK#!$4$|0K}me1dL#pV3Dl z4PZP~#Ec1^U^vmEhD^s!iaBzTP8*_twsZAhc91`61MoYB=V~N2R#3{ct=CReX+azw zHndRMI7--4!bR|fl2W;2W$NojV;IFptgl~a7p*Jt19sNe4rs3H$W3xquUkqq|6$`{ zxHRWT!aMp~TMd{&PT;jN+dJ*)fdIG=O%G9fG)}L=WjHyte(U=(e^O=E5qG!|yo z((!5&AfN^!MM3Ag4sRXQ6ON+1=~Ny%4>w$Gk0R6NH2ZB$q$&mt{xJ0$p8wsEHRJnS z8ZEB#{L8|}3*SNx){h!E*>+If$6h4F;_S)eFB+DJx~NdhXy?oD1ImnAe-xkZ(zsm* z$$h~0I^dfs;fn;$LN__P50ZGE{0MO7!-j|jNZ4DTUW;-ah4rvee&j3RLD$U0e0<$$ zJ36^qa~azwkD})A?;mu1;Hy9!t<-i8j_TZ7$}Rh~T<;1fy|&(rn8wpc04^4m+_6~R z+v-7Yg~W!9JFg@vt5<)#VtH7ib#@xJT}&;W-VLFU`-yJ7P7-NfEWvQ`Ubhkn4t}H( zAoi6UJMKLMwSCnW*%O+Q^wJp09!tl*en9BQu@g7@Gqj%1fJR)49oxW2+nP6#l8jY) ze#B<*o@B7lU>66XQttL=+{Z`Q*8B_a9h@^z8^-ltUbNjv*3up8sYv=q*e2VJ#T-WM zPX8R{z6N35%yL@ss_4Ahm-2aJq!Pl+!F^=q=V|_&%>b?f+s?D8#uLdG?9lAtdqelY^ zD{!fIS~*b95=BVQ^ZtfM#-0_q?&t4E%r4Fh$^_eHVmI8?P8z9qY>Ix@KZu8ubAUON zR`ikaUZg$xUF{%k@7xr6=NSl(-w|$cHrZYY+xCH6I_MteKuWTNo`4VQCu~L-F@7shr=6jbx1~Xv%3jM$$K--MA1-yBC zhAOGsnmz`sxnUZgH2;J2meltQ;~!qh{KHRkaZ*<6kCyXI(nW(YS0YIt9(2*VgC?$! zbdgC2z2Tph3k5C9>Je6+gQ=mxp~}hpt@IE`TV7sV#^`oTKkiZ21*~G1m1wxm<(>c& z(*~t<9Sy$?ls|>hc%-{S$%aeQKlmZa1tpQ|`xsvEucXuq@FP(fJB|6Xxy6i(dEn!a zoV=Q0Q)S0G=c7}dR}iywEIRbdG3d}<-*AV1h-d214b-0?U*7WfmGTX~I)Y>)vu&2) z5qi<2yF^UTorWJU^I>dvrM3=6p10SCG4)`M>n{M>V0(2Zbyc zm@+O$=9G`eo{XNoODXXz*$jfOT6;?K9}bNn%u_i{!6O4tNzA}#P~ACJif3F#y_rV6 zIRw4g54AI#=wRNCx%4e+=H=M%n)`}U%lujC3(gX2nVb{>G_bX@wyqurERg> zrfi`qU%&&4(7y|Nji?I%Dr&6BWoWm6&Vpx;`)kd!&3#ns{wh-|w(K1(lW_(gQ8!$& z3L5%*-S-2Pq;0}Z62wRSIdpHIH*)K{Q@}6nZf_-VKpcRbf&t0)HD{o$V1=yKPv=e2 zewQiMa0lCU-1OMxwSCdEUpho!ejV(x`GG!0zi)`=rR3~WkD z#>;e(fqnK6N6WpO6Vn2p8xgZGrZM=Rhg-J2DUu3F75-eH?$%UfZJdqc6PlAaJiL$6VicUe6XwkRPS5kfgktAJlF_13RN6`~WR(ir; zWTH&KO(JcXgfp`Vfec0?87XL_bNt*$AK*EB1&qcWuuZw%xkQYhHmJ(+X&5*+$;IwV zx!8SzmqsIM)wod(Ea%(~^P^tPk3S%injR@Nl_lGnA|tuyS{|3fSPJM2qS%-lG&1S* zz8CzMhf_e%w&tK2OaZKs$c@A}c?Nh${K^kQMDFz3f9u3vFCzyZX0I2)qeh0jZJp48 zW%J7Gu{(VXrNN?vC4u+vQ*=rMdzJ6s7^&c_Z^Ae%*LwHwv^_5!X7-ae0gF%+N!y|P0C1TAGb4?ua#O~ zZkik4p&^j|-Uwt6Nf~Hh;ut?584<1|(?KG*_anZ2BcU{$1n%??3ss)Ra~1?jVD5=H z1MONC4%eCY0xOOvhGcv5ywY?iCY-J5PY8rPhaUcmFnn6=C}6{b2tqG@hkhl=u75%r zDQ!9rcDX(i|BWW=-Nb~$`2kJT`Lw?9L`8eM_JIu;O`OCx<)H=6F0ey)Zu95kR6AaJ z5?buE0@f$dY{hlUV~r9Nf&n(vf1f&#y$}WH!qvy$q5^u-+_8_(&agE#U~=8E7<2La zroGNl#&H^ikUM}M^mjZ&62A4G`*hprge`6la-A8Py${{Zp!1XB<31ePjqewJmw#W`M)h9l~xR( z6&Z68#RM0IkTscE*%o0gZXlMwH1=`lI&lMVp!E=%-pE6#7+C9ILyX72-Set%B+^Mp z+HeXf41?py;p2*xE?w)?D+>owH*BF%Z<$tY*JBvUy=5vInTG8<*jKjQ5)AG`!Ng1= zAa`K9({^9*-A{7R;;;tcB>RH%#&2j2IA8|*Q^GMc9y_i$zXgOKSmlcI{S>71M!o;F zOx7{(uMihn!Y~6z%hSs;@)M_toQ}v45oCrYMcOZa3D$%XrU1=}}Ms4bW~)w~3W*gB^K)wX630=(3k&MRqYEydDmYo=3w z;8V{Kfcoqw+>)#D+_@!vU*af^*HhmUNW)92j||$$u(3b~GAxCjSd3sDrQq%8-|`+4Kv9YLZCOdx36F0ZpZFg<;9l_}VfwdfE`#w>gB?Jh;IF~|S zL8!x%zVo0(AHwl-{0x5-@T=5W!dmPA;j7~!%k z&a^&-_+5|?!g1$GcK{+Ntw`F|9dZ}OPuakAZHe$de-VBdB|VJ?P|Yt;sI6%W1w&3A zT*mE^c{(304~7JC8LYvFjsdjpDdA8Zu}}V2z&VPQL-&ukp^*{hm;3 z?Rxt^HG9i+$X!J=JOL4+c4EnsJv0Cy{EM-OV`xYlp+X!a)$EM3W0_P_*>%u(1o-54 z_G3RWbD+6B*Yg!uuZ=`IWF1{&36$d|+)rt~>rgQ0o$Yeod#|cYJbA;bJm;?hn-&a) z7n#)9Vd9B4nEQMkv8jt4o@vScmmLte1U>;imgjRBqeA$_*7OD=Z^ki_56O7ufGW@b z4ooUGex})@L6OKcVHXnkR^x}li4t;e>0=>-FmBGF{aNrl($+MFi%>lDvn9O+kpmnZ zd1j&xd@%W%Jec&(tn|En!{^lL?vwG(_dIXAKi8dm{kx6jcI>Cb0Mtq%u)SGCxWj8C z0+p>Lb{Wo?bmAC0VLnV4PZ z(L}3J)8Mr{-v*U&`D(3nN}EGL?V1yxm(n zmp39<-r1q@i1o7;*@1D@)(5Wfxh%%kbTfP)PH9(-^XYgS&W~(ob@fK@Iv>+8g(U2O zi)`_k(Rh&)?Joe?5N$jR#6U`g@WdOxlb(40#mI(4OQQWmnnjZuHOB%|*?VbQe=IlH z>AaL7*U8^ZVoQ7^XwJtqT%(g)I@jn5bb;*P4DO78^J3ywdM|UIjBQ9;cO(|`;x9+) z#;@y&y5OlE7WGj08z`K?+l2>z|IH8{!u>MzW<3S;Xd5lz84q|c*%$h{03fq}z!;uH zLt-H`P95H!wC>LEc59gdE2&yTFPs~CJ|y;40kx@jytiAfx2Lyz+74$QK48@v;ytga zC?jMPgV3166OrqkXgr3;To0HYd=+b_^_t8%y@7H)C;S5(?rqUTeZOyf3ZQ{&aF`t* zLN1tJx!y~?UDFIF&MD9F#-#aN=i&Ygq#>2!r;vtbt9x_2{~h=7Sl4j(_p!tQLC1}s z9PR42UfQ7EA#E3}CmZAroYXeGMnDrS{kHM=IV6pPd(IK$j_UO(rV!P^#Z!5_Q3V$= zG0u6AwXrqdjY!;8@*0FAXi+98nh>rm%EP!N6@&U)B5s!vorU3%{8KD({-WZH55*zq z!!x>0Md}?M2@Nl=ck;&F`(o!2b{s=Mj<65$WNqFI)_-Q!=>qf`<^|3%ucp02b1ro# z4X5`5G=QKIO>^ND>4~Q|Wba$YwW-n4emTTmo1Q~MY>G>`vaD}!&tmG&poK5!tR9V}{HT<5Qo zLpU?u)iYQD22B+JdYJAn!{!%7z+8OJM>@D>6Yxu);H?*vz|>Xi1Mer_H?YwI7q|CE zI(Tb1`~gM(3AQ1$iQgV|;s8SNQReu&)V<^xc?e;|6=EY4G|?f(%=HV=+1APbbgM zcK~HBNkopv-k8KIUbV^D{R&>tcKKB(d=S%tZK-nPiN-CECION&ZiH)@kLOH4FkyyA zqfRlo9iHL-(tPh=6omr;Dymo&m4SIf#t({76gClb?FA_ON2q z)X(#bcSkku2U3#QGMCruzMMuMOC*;hhaKWLNzwc`ez{64*wf zUf_w1@=kOIVjKRoVHBtMq5cW#l{_!*gKEIm=NN{f3yi*rG^_7`wqbPM_#rNj-3#)% z<#JjVU}u^dI{@5p0qV$7Zetuy?*xbj77{iI$alAQ*XI0e~ZSD`@%O$M{ss(V;+1`t= zdfL{|d2^er@G+Zv9elKUIK0DhTP}~Lh5=qV+dU2_>R$8R_+iq{JWPDF)CJrpQSU~) zBXF7t&(py`(why_Ft5D9IZyU2s9oAI4=NXw&qJICxG8f zEI5a^DvGeu39>c6jA*`J zqt&6nAMd}MTRYertEjcj)v);iM75OP*DU`@q{d{~&UZudUAfyc;#nzbBT!^6X&Sc4 zOitRG{*Ln7WC8Hetyv`A(wt4u0?1?r@-l`U2P-Lf$oJO7(+Lgq-7aKrNm9IjFgI^3 z;N$Vtm0w^Vt0Epn!H}bX7kfG+{2YD@=!M{{(40#HwVljG(V-vq8|Xs9|fLJddyVwTcBx=iJ=0=aZ*I2t5A_m5#I zo-|Wrohk*jt#2k$u#HV~W;rhj0?B^-?8B3l01DdYVjAcG)x#5j9d|5d zG}(!J(6z+@^{42%{y6)NHeM#wg)IO)@kX2UKz_d~COmlhNRaO>izXRTxx=unxgTAN zUB=j<#PR5gc_I83new#=Lj?5CBFrXwlBDHbW7JrhgB05ZFadgCK5ahY?b{=h$e#=T z39tRW`2Zsyh#J`b3nKvshs38l2d5$mg^bJBn8B7Svpc(H_f2xe7 z>c784Rh=kOb0%`tqhXs)5@OS-hNCYc?v33&A*rkF&UUTc-QLZgLNEFRUvyJ1y83(3 zi@<0zMI>IhcSMrNYd#&-2W9HW9wp7UXtSQqtPuF%Qw8y+YZvAC1ahPfkuw0vXyD?8 zxb0nKh=TV%ihD!HxHOmijjY!>MQ+w^1LUE!awnnc?7JL2$Z=Q8xJ$$1@*-r$9getE zWY3O8@=PJN7sPn4damxR$mE5w6}!%-?ln^iJDz zo6M~q&y=q9HrSYtc8()U^Wc^GKV(9;OZ`Y9bZOuAD9ZnbhSRw%M2=I)ZxJ$jC&-|? zHhFgVpZbU9e++A!>(7)CW$}m5e5CusK~p&`@IX4#%z7U(f~XQKJF@%|Y-vuz7m2`i93wVJb2}r!^XYR9^<8m zCO!`Oc07L6eITBo`ICV>%GgS|B1O6bKmCg}G_loVDwy z(s+VB0n9nBFnq2H{fYFtU+DFfmew*o-$3_N1}}JWm587`B$fwkR@ZoAYuLQb~vT4x+uoGATSoCey+* zk$cuqMzm+ObVr<7k*$=sXEQV0e1GDCmPcD6ehQkF`;EnpAQ43NhRF(BZM?4%MOvb+ zmr8XNEwS|Wq;bI`xe^}NG&p^fb$h(}2ugMh(A*EV#{SJr!-^5tM2BM3zgirM5(C}oe z^ttgm2BsQuBq_F;y}0EMyv1pV2BArLNxh{f506xxJ`NE~4k}q$MW@qROOs=vpR(OX zOY;nV#Fp@=GllnsmaHB$vpS60n_1BfLMzeixUUqeJIE5Ga-EG8+9m!@#!`|+}B9U#oAhBtnI66Kv-pA|#dK-7ks5YX*67AX&|(p>+Vj=4cl z(`lnohsGeYM*xEM++b{>)yei1REG<&SUAQzqG_=(e3S)|cgB7^dHP?4eEeY2z^EXs z^q?jCEL`mS6!?JZ$2H<~>cpahetC#LgLX{Dl9dbE2UQZVpz~x&r@&d~8kg{U~5b4jqx$0|#)jkm7+FLyU8X zA9B4g&@dkvt&aey@9)We2l;7p1}28*#rm^1T+8-VkeNO3R=&sZp2L?j=*E3tWlg*=pS$nGLeAG_UF>x-0
63)L&%1E}E!z9)xb$_8+c@3!tNWWC{B{P_EKe%*atZ+bleKP0wd z76MyfFZx~sAoKU?6nsANG* zdpk~T1Kk_)CI^yE=)*0OVI)n4WPc<^`~Vv7{fT!Q(=bqu^%#0S&m8CVaT_8bOsfEY zD}2^$23>r}|DhGU-M(wF7)kyr)8oWgg}B!{#sz~h>rrGT3;YpTMJvtMM%SSTCvi|h z53sY!hfg>B6*%@u6x^Cf&5qv0=_SAQy^ZZ*+hTfEhM)D<;%CD`8hwjVK!_Ni^G@7% zG2;mIaCiFtfz7;CJ`#8tI(NA+=0;an&%vT{IqQE&y8_UIBs<`K=6-3+s}y0pxJ%Y}598A$MAEiG93qm?^jq+v-?6@C*|L80yqh)j zc$RiRGqTc-&^3i9Z`U@1di-zHdel#} zmZ8a{*=AfgB5Y@6WZ)mSkYwoK1W9%cbPK&vckj{>bxMXeDh^M$D$ha7C5+;4uBE*Q zAE>*&%kzxIkZ1W+qgNF-o`nGV3)+K*^10S6|CCYEvOOq-&5v}Z5H3VpNeUqfPh1~& zAgZB(f1K(o?OUG&&B~|fDY>|f&7>E@fDNA^EwcmJfh`f(gm7EB+yQ^zU^O~6fAw&y+~fs5?4vU1nOP+f+> z1Y7e&WW!3e$bW{h|-nCONw;|f`lYYD73KtM=yCUS*HGH4oKd1sm<=fE#rFI6SUq?Vb*iL{%F(AnKeq`vHB(b5iJ8t)IaUs~cOZ-cl51Jh-XdA0w^s~D%#JsSgZ za?4b()U}3jIGb=q;b6vjzLymr?P={RdQxBycN+oH#T5Zrb~|t_RFVrS-5@07AZcqE#>7)xr(T7UXgh?I~vil$i5)|?BUS1Bn zNg&25F#x4}fNc#i3M70O5CgI#fLUoTuIP>~wfmB{$|)gR!%zHY`5N4@v!btSvL+-B-hW#G%Hi)tdhcPs6BZG-{}on5?~m z{TY%6qDvNksXpx;o0a^S2M<7~H<3fgCuE|}G`X7|b0Sd~W7Y$g;7pnN6~m{OXNUWM z4*LS=-sY!>Vx;S4NAFGhrtUrJ=9?ad*Z(TU<6K7fC%uKbXCKXX9G>Dn!s4yo5zUJV znI^$%a|~n?xM-1Se%F4F!J-8wex&r+IPvZZiuQM4oH;z-L2Vu6c`XPcvL5N)^o;xa zk@c$_>muTXpnu03Mv~^QhKzmVk0V_JZ&{4C-rB`~0SAn7ExILJ>!D9r>6&@V;x7CK zdSqKQ<9eMY8SVC8qOE?kb8zF2qg*{;V^O%&ebjiDkEYrQjS!^ZSS~*{qtFOpxStti zq^Vr+9{Q~+uXyMC78!n@|24J046P5eB$_qV8WzHW0B$Sgs=9UdERT1vBnx*`!P8~di$<;d*ehjvHg}D*~YVI0fOmmY=Mp% z>HS$|xak1Epd}@@_$T8rgfWhLk73J9_S*p=m<~)%q2h{cWJKwE2~;3bMo`KcGbJ;~ zJekR5+r_Arm=ZAi10Kdvn)&kn z_n0qHSfotOZSZ1=+COzBDPBeuBuVi!p2`$`OV`Z=jHduKSUDisB7!D7?@d7U8z*!V z&Wk||=4n4#sb%yR(RYrPYcx(^R3modwGkTl0E;3t7Yz0tGsdB>xVcGq2HE3Sg``O` zQ5bGbi|jf;1Pe<=aw>%tl}XP2LqxLQGU7tY=WIOZX-8lz)43#9+poqmdSDTZ_bk(R zX^|<7M-WwI`i1d6JZ7e!Q>Gru)b?EEg;0PwW;}mBXNw%k_&%B9d>nZW0Ktt3rYzWj zJWIN-b6Yl|X0k2I@FdsIF#dys6*YZ4%uW((Bzi*xJjM_}z_$3BFU3^C{v8t$cT{7_h3YdB5dY>chrTPot z-<+4`ThR-;T$iJ?kCDgdy^sR;y^AN3euja9of{(IffV~5+ymkmx@Yw3&;(@q*%l8e z$+NrK;-_cW&YlihKk^ORS$S{7LvA7x0wY)Aki@muvu)_BB#M3Pb%*w%!~J=LbEKnX zLN5MKAX|~A9S*IB-c*NY#7m?z1)&n$8n`Xs@;lr=MAT(DTFyn1bKjClzLev`;l0S= zx#T67=K+(?`4V;)b))D3>u;Td9+1T*K=L9W+2PtVb$jHGoE|Nm*c&ZPonsuMCq4vm zgxFD1{wg&7W)Kt6+bs`b2zkS6APGa<)?>y?NQ<4I1A3Qa!D{$&ydjou!1xE=@LQ^|-sNgJ)9;2PS7Vw`S= zy>zMWtgEIXoZ9o5G=W2fioRiw7K@C@)?sdfW)~LJEw>#caAv(epf>b0Glh zZvPRqVBH}HteJz`h#kpmD*i}bDBdI@Io|aOUZKfh#@l#Oy^jmRV&74oO)O3A)76%!yU4P_#2C_CU++?#6dFC88XF&0Hb26z6hGd?y%3pnh>zaV0 zlqADT1Od8yJeD@|Fmt8#c3#?g!D7iHY&W_AMA&2k-L*N48;9|U1oB!GPUSiRKzBZ@ zi}g2eEFxKFXKyHI=&%6TnikA$J&I)JLNOxWi^ybR$se2V`2t|-fF8W{L(Uvnvq+|a z@|AJVZUT5aBwKX4%=bMaAosL|y4W~dcJWyA-0Dj7AfH?LpFk05C;~mIW2?0{*Rurb zl63q7u4M3d8vXm}U7hAMwMgE`r@+?V4aT+vehEB(;Lw*EWhh5jL-O|M!VbdF`oAG{Q=mH!2&ela@RpL z!Uf2BW*i4bl}O-8;@Kh70pIlGBAhuG zsw9y_Eq4-OY)mL%d`pk!6e08amSExj!5}(oQoC;7leD^T@|{$I3)J@(KJP zRb8Us$!|b-N?@Q$52;rY(I;4Iu}uq(v9*dmt_Q^s?Natn|IB<%45N=*w+8e3 z4e}#Of=>%@vIO<$#!mo=>Y0)_YIowlcgY=}!rei9?myas-I41_p)MSch{RKm0Wh#~ z1=N)1DM{*MYg!tK)_Z}5J5xjcL>{knnvL6*5reqzgv~$^!8Ab+Y%Cn^)nLXRY)uBE z!!$Utu?H9E@Vfe#L60E_!;U56>E5lKcTg10EPE`Ow9QNNJMU)Jq1=~*nx||n?BWyk z2*B%}3k0Tm7X5ovQ#-EY!3Wk|Ao_m@&WT+2$*%b=E3^ij^)8Ig1tp*%Q`d_m?f|5_ z*IBlXQt&}Mu&rdqw-IaDh^1i;qMgp@c}5NFhKRDRtH&BYfe8viB^ApBU?rpP9(x~0 zT7na&ESb?>hfajJ7l$*Rsk(m%h&jr~KY|aRfwU>A3+I7|uzj-5Fd!N3lg2-k945n2 zXD(R8S}(CQWPL2)qN5TVL7~y^{550(FywDrj)*UytAu|j(;wVp)ILj*Kz1yR0r!?b zE*Rdn+r}fl-SgE{@1jr9dzDnlLr#cd{pbR=qC<7M6lyRP=E3EN(9tIR1*o~-LEDlMYAKeDsmqG;-)kgdmOjsise8jilzY@vJk!+W zlPy#EeuqCs;ydtl`m|2907z4(-N*)H<{{EhSv+>WUFhVh5G#d+qwCuM<8&7lqAhyQ-YL^Xj>CW6t{kC$!#L#hW?wzIJ+97 z>##8uVG3tYqQ@|tjXm<`#!Bw}t+b5fdw{cf%1{1jr zzB2YB(0?ms$t?kzTUGpMw^LR;l{2wc{1rr0*w(!<>1L{tlG1{ zc`#gzR8--V{gs1EPEqCSITLG@`y*ngzwWX0*ZGzfcqav~0 zrvAE?h9mlmin8?ALwhM$_LqlB>)c;2ayMFmzY-A@@G9x_VA2RHRlws-5@~9J4l;2+IU$M;>YK(_71ROE;y zXZFoH=m%EgU57!^HV@-LZo8KFrU2$n=N*b(Cv);rV&gnqh*j-6iw;+&m>V`Cg`W>q z{=P0;dDQD&qCBHp=Kuy?58luB9B07<-sd5i?;F5n=QfiKw^XJ@!yT7t?J_OjlVT~) zw;lRJl}$%_V>g51;?FtR&=@`5D{Xcj+TWm#@qTb?NES?en4e0(Ax%L#8RyH z;ivZ9(Wa}A9SD)ET_*oYfMzQVM3BMGKVjTB)?nO(3(go1B7*-$$({(Uo@)Hy{%k(l zkIA#O4ggtG4b3{WjcEjrWx9w zwkwgg75f4y3q{@jD%#UOC=?y^yk&gdk6tmyS6y&?{T`t-zDg)JI{8y4EngdrYNWLW zN7@p^?J&|7A`*|ZyD-u|Z0bDH#vy{w1!h~@GAe;cX|n_#e!lY&Av8afe#BUyDS5uO z8M{4R!3KFRme*u8WRoldf?FPbF1s8@=m}fO!8v z_=4NwC6M_(+SYY3ExvsCyHT+Tfa5JMD^#LeQr5Yf|2@j8$V5>|o zn4O!KJ$=sH8Cmu@*@F9hPPuiMP_NaMUgfH&E3MZ{SJqZm6jwNPS8Yj=vos|pMkdLw zt3zoet~v};y`iqcNp4LUWUo48b?Ou{x6>x5rV7g<8p>%x)EBLw0?=HtU3F*8IDJq( zpus3Es$Z^JyB=|?oxy=EkgPPAMs`eCzl1#KmXIfugnC4US60+Jt4kY{4`o!>sOP!$ zMaxPF9DU))`o;Rfnp&Eri}eW#tdTUQCt{ipD~`cG!A+0w*W;0bDTrL54=PE4N9Z(e z@jE^H@}U&3xV)yKxKu10J#tWqSUgS_MN4byoTZrdF(R|3y1oW&R8d{)a;Da}oN)At zdh}rly093rQgks3=wL|rv>$>-RNWdrkh#lb>sQcFC@SI3tWZq&9A%PFc6gf0a{>uZogFe*QBi`N)P&TF>h-0-&75P0p{nwo zT?CAcXu%;YCpac!sk3s`2)(GJ1XHc1n$U{bcO|8@!D#S;s6Gz=k};y zRkgIHvYti+W^e^&wnFABiYi?aV9SUPWv<(+^`goOg1C%;4wlb#4Epp5JOyOB>F6!h zm<<)q@?cSjjrK3WI9Aa)kFY5m%x5+xHshMAit380qDsBkRab{@>(CRZjx3q8V#M63 z8?E4!m)4>AD=W>>q+=1+i>m7z5MH7)wAD3cUcl=eGy4zoLJnqTLHwf!KmTE7$id7k z)b6Luj2fLPX?8kB0d+i5(fZAqgz#Q42Rv9IqD^&SsS^)-KEcK*gJ*#@E0OLUiDtxU9 z|BDKrKS$b>bV;c8I%4N>nuR{q$zGQYCadq-GFMB=T*H;*QL@qRQ`Wd`Ttld)47*PH@!@{HOl{(NBTD^cZYJ{RPF)gX5Av= zMJTsIxxZHK5#`#vGG2mm2PpU1hh+E%4@-CFqv3ACBho)uxz5L>|4!vTtK2XDD#L%N zyHllmUAa?~dqTOqy8CoBKy+)uue`J8u1x^tBKYvpcG?ibN{T~UwK^SXS%DE|2E|s%8fZ!@|jFGPx`SLD4+cgc|J%U6eK2spctRuymzW_g76I`!u9JO_ zW0*M}SFx9i%Pn7e`*-n_cplIWMP3`l3wZlr;H_ZVSNUlZzkewhYUUbpKf}APPx=1c zQ-qEXpNS9gpMn3+P~wH+3y$@fI0*j;JpWpJ!y(^_e~a%B_9Od_;aAgE^Rp~FQlp+Q zzh?i4F8^(xLwC%^y7DY9V680&#`7NBmCwUi?AaEB+`v;xe&Xq=`l`Uc`#u zh)Lp3@d(aUZsD_)-(tSrB@P72#6l<<9SDSfmx%{CtQ@};;#Xq1s1#MA8onBw%hZZ7 zqNlJy|K%)kwm3(eE3Oh_MK94?Y!K0+yI3qHi%gU_4kfM=6U37uOEilz;Dw1ITkHz# z3MBF`JuMUe;OBC&QmhhJi)$F3HR1uW7IU#yvW~SPNOMtk2qiS1@`JE`il#I z3+4eM=%_ixXy@ObkVm4J-zkq0@zQDXC>8f1k3Wg~#be?j@vwLd_4q6Dcq|b9{hRnZ zhn07FQ-+qT6;B7kzjpv83Mm)Qbb{u2#HSiP4J`Vs_@{VI{7c*+Hi;L-X0Zjhbq8+j zSt1I>m7+*2g)ncTxK!*ETSc+hB`y)yW2Nu{i_@noMnQz=+O@O{!v~*h=tqd2=h)(V zoptuP)M(uX_8pi2Z30K1!kOLsU2%SlSl%TsPAn7GigH9Hz>Y`MMhq)~ukzwi{V|ZLmJA;;GDV1sCQVMggbDyY*1F)3 z5ueD&2rc{*(S^PWWk*Ef6BU8lBTU0Dr-{I|A6+7(HzFeVfOixD@906(;Ar%KDD>%q zn3`$EOf zgR4~({MN5#S;?&7eJtVo#0R3CQ$2$-{!HXuEnWybgb-?G^AiX}h)59y1;l}(P9%vz zph|{_X`)^@#iKBsm5lZLMlnp}i|fR6F3Dug>pkiDYFSA4g zsES*~pT%E5TXX}pkRztxI>@k3MAER~BeLct^qV6z6R%pZZ9>w>6l&zOaT78oXXiN3 zbaO`}4WE}ZCuvT?75Gm`=r=HV{(>Y;yX2DeNtrWq3mE$*&7VJL@H~Zple8Z3aveKA zAt`mtrTNom(7KkCI&u1pl<{*@CfFTw`y>_2N|`XlF*hl7#(??r7w{)3sqdWGbLJ-` zEVvBI!JOF%JujbsdD7+hEJ#R7!qa>%?D8RF;m!%G*UxxjMGwXRJ>c5#f2!{i)G)L;?UaA3oFFwzp=c2oGDIk#>%~cm+49V(v$q24>y*d&%^J}#j)aa z9hg0l$K$}@cuYn?O$iH)#e7W_hXV9_x^JvF7@!$_FmU>BEatmE z;165`_jKP_V1SFUR$VN<4A7JOr6>6%f2{BY&h(ANty^dM#)6I*gB6l~Pxp-#p9jwL zjTN5-F2n!NePhL^firz$#V3K&eaEVIvEt*vnZB{064S&-0s1}NH#Uq$92e#@X~$Tx zKX9gRY$v)coQfk~tk@Um{2dQEHWV5wJ_wxdJ3+mR6?+3``o@a)1E>3@t9P;Dy})~c ziTq1Xr~1Z@0`FkH({JZ*tav+crtdGC@4o~myb(ClH&(nJ==@Cy z3zhSI&l%?XZl3SE1E>Gee19$Q+8O5itAR6pLpb3T#tHJ*#0VD)^2dso184fiikAW} z1uo@ZdOFoNHn@|a-OQ=Kv0^9Y`_916ePhLrz?r^so^C(GJlz&J(>GRZ4Rrp}{0fD} ziYEz3zOiCc;7ng4duZeFbN^lNKH>~VHhza$ST z>nuz8X8r$vH#8RhUuz2thf{n8V?JW9jalCfv#=}Z_(be4`w1O9n+rh6pO4)~9QGjR z;hAR2D6TkXIR`?wsX#CFPyKg}`SiR8HvAeVTNaDSw@E zS1Y$kxwk3zZsp#u+{cysoO0Wg`?7N1Q0|Ay{Y1Hb<$kAJF-O6p+<4{oRqjCL4p;8Q z%1u{pj&i3dcb0Msm0O|QTIH@*?i%IZt=xx{`?PY`Dfb2CZdUF~%H5;f_mn$jo~*}y z<@YJ~JLPI~<@>XhJ5;$nl{-keW0dPq?mXp|D7QhmhgEqV<^Qd6A5iWS%57KftIFN0 z+)tJ3SMImU{Ykk8RQ@r_?WJ6y+zXUDRJrSB%KD8_{>jSCSMDt37Akj{avPL;y>dsW zaZ#+?+g11-%DqduFG7)kKEGFf_V7;?IL1|?2H&fg%R`)-25@<=1xLE$w+Z~=o5UJ$ zXg%Qb-Uhz$z2NTr6+BDgSgr%7c>_*_TEU@wS-cH?)5pRPesM?~7vGDMqMO!3J6AhT zJ6{8XUF)ay*K}>LHd?z(vul}}Lz|(^*A{AvwIy1iR-!G}>a+&!dhJH7No&?_(mdL) zwR^NbX%A_SYk$|C)Sl9w(Vo{{&|0-k+74}(_L{a^dqaCudrNyydtck9eW-n;eXM<= zeX4z?eXf0>8JbV~QuAwHX@|9Mv~M-p0(q(*&Vl+RedZ|tBIRDGT)IS>K4dPJKBVkR zAG7_<{xruy?*a0?Iquq3KHHW1igKS-uGv3i8izi=6fTy$BoWKnqPqIh7y*Cra=pId zY7$y4hJa~3r0XC)HmK4SBeEfU$x_AjP6!-BAT~zKQX;5Dh_t-4dYmq%*EHxwPE#P2 zC0`+tI=yryNwOgdkf)ekUQtG3$--3)DP|Ug`>YY_ODoYRW`v5W+R9a?2ZDXe z&`&`qDwb74EEXMTwwS6hB$ZVKSw7iJPPGdQkkN}O%?Jt_(_2wyJ|ShuLv^>juzKrj zTy@1593(caTDS`DgSDYm(|iT_SY(S8vpPnMoTw)y>FJ_=RkgEdrCv%>?1Dv|$LS>% z^~FVXBOZwy>j2~lyVN0gL0m0*2tFs!!7Sw1dC4@x3)A>;HRgX)J+A8=w41~0>; zZxI&00A`s!rv0@NEB@;fTEWZP9v8zDO8L>P{0UQ zv|wKLtjlNR&dFBQ8&pp{AS;&wwTqa6F#`b<9FYQ1cOl=HIs~Kx0}yx_Lp5nwl$3UA znv~)ybZ{_R%VQxXFJpL1SW0;iIBIrBwmmC*Rxs~nrI^Q{WOtl)KpP^K#`WQ_!jgc3lI30wwb z2fPW&qEsqDL1RY^_)cl+N-L!T9Veb3hr&dWC?=#svS4DmNK6;{wbugi4jzo3B~WV- z6U-$~HO53Sce*`4yKq)^UbcO9wpkstv$J$rX`Lu9T`43YHpv4qY0{+7Qi`)ls9n&? zTTd+p^`_!-y&MV@uIeht;Y*brh4)LViz_f>lf{5VqO^JiMjWpXLZ%nIWD8!aF(HV~ z2(AhuxMDNd&|VpMbZM1VJZoVS8M$cC>XdZOOdds5)-y$ z6@Ziq8%tN2Lx6K})~!+#+027t%GshK3N;J4FZC)cs%QdW*dmjpvEYt6bINk$4y#*u zMlPZwu{_lStLPPIU{%brx*Aulny)6PCh(-xK`R=ylbPEo0GeK-R~0#n%h4XJP)GVt zKpx|OYtf7NOBPIc3R*m?L=u*3k%ZM!Hj$W9m~YRWo}WE^E2$o9(!z_BgjGFRZKuykFR^#Y<~LRm=I z$txSk(xCzpG6XgpdS6kd21HRMDpD3&iOECD6(M(_&>zK6{mx^+qEuG6O6_d1sU%HK zkp(=@J5Y(8O|@5Mw2J7*7+1V&X}cox*_#0NkLkIR{dab%MZ= zXk3*>%I8eB1L2ceE~R5C5DSH_77So6P=m68=t1hBQ=qP^g_<5ss)3&6;zmzu$)iWC zdgNfGBS&^HR?vzvxrvdA;dnDp7Ns*Tr>Jr%qgcF}(E~4N^gx4?Tyq6RwzX*1L|Gs< zcmyXzI6JI;!KKet9oz-!Aph#Hizx+RGN>5MPDWUrSR=l8Cbc<=(M}2RjUe@l{yQ-vv7v?MPVDXT33Df$fYzbf<>J+ zH{KSNq9N+cEg4PQ;^o*s5jm^Sl|fVI!C!R0x%JVhoX+ z14VUx*ig9}r*;hLnRir0j+<1v*v4Tt`U6@~xH5V)0K)HHzT~XW7F}TMdERf&CbPS3SsZej$hv6?3?n1Q6 zVlk)^I|f*LsH|LRo#3I(r9_&b_`qi%u7o*L*+W|-a~EofXl_F>BXZDNMTiAWa2HSd zx>6tqBHFWRid}?f7#E~2U+Su;EHV3JWF+gG zraW~tiE2P0Vlg3j3TkTW6Lp8&+JLgdeBylp_B5>U4$>U^nc5=k78#{r(kjGe(zPW* zJ<&o10==THhSpYWZzUm3TYVITH74|mjakr14k{R;4>8i%b_Pv4)$l40#`a8*E+zVy zG}Vzkhu!18>%k#awB7{ z#cXaxX;^_KQH+>F8&aJ@z!awaJf5*YWT}k^IKsRZ&;pSacNedFFw@{#>v= zvCpzR(-?tw2J=^Cak`$T)>DujFx3D~B6^nWG{_k~6#N0=iEH?$^L_eg2@&HnA75ux<@+Zmr9>!)w9pcu$N?(^C?S2J4T|y<`Vyc* z#0r7S_2j*&&C4N4ODgqFu(f2y0uf4yP=_iEM8RujtQbdh`f-q3wRrRS(2GS;qf?lA zFL%r^9jwCi-0xa@?ep^FoI75f&;6_W({w%0Z?C=f-fQo@_TJBVp1uCpvGhTqoW3-V zmj`O(Y%J(OPMO*Y9pvb%5$Fi?Ip`R49J&vBNN^60D&vKN3eHWN3$27!L(4eZY_s5; z8@CVI4?O}s$k~7Gyqs_px*1x*@r6Us5$JQ!b`BqX2YMJg%o4B7%MpATAF!X3S{Jh+7m?M;Hp*5VN-2!cg_CsqqMf(Y8C8xX}feybXonFq14Yd~` z584lXLhdh3rzfC?p)+{t;V3i#9jk&Lx(_GG1A;?$Kx-DD59mSY8_>g0c~PQvA?cv? z(8bWB&|2v5BFZK4i__^riN8FZ-UBULLb;%W&}v?I7=|u~jzH_7W6%!hKIj1SAan=x zFmwcZ6#5*rY$@e|RzMFyE1^dv9(p=2GL+S%)0NPE=o;u4G$r>}q|?tpYu*n(v>sYM zi}FC{K}Vo9(6TE@2d#vrpu^A+p&uYW=m_*E^f2`F)5sTE39a~GIvqj>p)Js|FrD5l z`1R-wS_|dJ@u21g>J2>zZGev5NI!%gh7LoAKb%fK4{g5{`M8$ozn%7l9!-MFeM36^ zDzu`JemRG7LgzvUp|#MlCgefuo2jqhYbh^u7&_w&^b1Wuk9JW%XjwP>(01rBw7!pe zLILh(x*U2C zS`R%6?GXAD{R}$x*XSME{x|TQN50SwX#LkHC-f-v2(*6>`JYcYzD~Z-{%5H#wCo$S zFP63++O8HikZz};_kXU{mXY^dbKa)u3WVFW?lo@2Zt=|W*%_l}bAu7TIv z?|Ix;^SAq}$I>ZzVJlv~GG1}rsVCoAHV|BO*84ABG>;PTJ1Bqk{2e6i_ps%`vUvH` z@rtYCiL2w4SI4WD#cNi@CrY-QxPAJ)C)_vf{?cu+(kG_HYnH{Ul>s)G%a_H=mci!g zGa@pX8$J&ed9jD%WgT4ZflH_A)0;hXxdqqArUkwoJRP^!`}v9WD3OapsX)qHl-iiSHgu|5y|_RR_!C z4Y_42{Z6b%z6`Tq1X(rTJH|I%PS$mz92!*G<9Xt?6ZdW@lgr1-v@I6_aL27amNa2Epco9RicCCPAVp z)HZqpSzF(>zWeXX`e89yl@z6h@n8E6Yp-m%GJS4sPM1p&-vaMucyB}RHfD0#YP*h| z(z|loiXpTjUfrM5dJfr?kI>d1%|}S(ba{|G+c`RusYQe6_YJVV98BsFV4nuSw#c;_ z9Uaf5_r+p2%g|?Z=`xAT{?;uC5cPiKJdnx0PoOxk(sI9U}RkL3=!(&2)Jdj)LH z*0vyTKKp?V*5L)@Eoa`zlUH?0;gL6hE^8672YIXKq|;B)&VPu!`%Wk%&*@5DupT`- z&9@USh;2O`Y(Ln3+Q$0g)baXUX?{0{RrFj(+JhUcaEO4`X6 zdDGa(-43?I`l?&2czHIg=SA!jwnzG5NZN+;>E|Yox#Y9b5v3pAPTV2lq?shhdMX7r z0d}(hD|PN+IC82=)ZnT(AeYmLU0#fsKGYEWmXtXS?K^;PwD<^XIWH zmN=)wwW_@s#tf*EzoYPs!Bdv4bEch|d^3TF-J8dRwCla;^y6G-`vXfgnQNzSKjB`t z`uU_R?h>jzXEm!~7ya_eS}@}R*57&Q^Yt5Blha;mbE{P!yGdI|+T1yJ57=rjsfz^B z(LS)+2=*%2@<`fAurR_mjs5nO5kA?g*F^Z{gDs9=Ay{=J?HaK8IheFpJ6I*y^HN~f zCg1h_WGiv666f1o+GiN-AlN$LkJ!Wi4BKvuG=U$lR+a3b4uXjU5bw5E|NZi*Y z4mpMTc5Gm(?rUM6I|JFI{f6|B%s9)e;UjC0(l3-0HZ!^(X-8HK&m`Cis;pb6ytLZ@ zcnE%;-~_>TfZYzpwoil9aRjU#>?T1}f9tiDT7Tl6Ax`IdjjPvwz8KaC;zo&Ul60$z z)W0^r{xz^x$TJhty)Ef-^~PLN=jZy^YxxObmGZA4?K2l=+f&Ne4mJW7Z6o2|O5A?p ze1Dcb*)Z5Xuv~p5z(>Ky!P~eNJus=3U~_KwYfCBn0eI$Kl1|^59ox=+vrdWmvX?eS z44Ru;%6aC~Fh8A+({Bp2`KtJ2B5$sG^Q6L!F7>({S@V{rGkeVtECm*V{X=wa#g;5* zF^f5|9pR5+vQx~O6wD;)MVEV!@dnR#KF2j}I#J?GZjj(so?WHhmrnm!;#5CuG-I(B zy?&%zN8p+N{%oI<@m9tpR15Yc>+9JyQ>;#hn=P7F!z<6f_Vb)*pBN?baAPVnE|yD^ zU$U6;q} z^0I9xSk-0mI*~8WQ#*K$c@ftVq;1>52En=n$k(|JHNVdi-W~An{{wmV!dw2Ic}6@{ z?&H2KrO(OQ>kWAK!22=b)wP#fS~gg}n8CA)BgFSimGyBiYd&#{;amN&box`-zGrJE z9%Ox#&5hPiw~cDA*M@6 z?f#M}0w~;KWDFvsCY4SvG8we>a#q*!X!KNi6g`8+=IO>7e@&Ve{`QhCyaNv^h3$Ie z8Ds1th176OyrJ}>f(CzCyn#HVe3f%plknR>FW32PoAS*?+ur7{S4caHEodO!1nEwd zbc6=}`oLZV`&Lw6u1%x1hQ|dpXj13bg!V_Li@N27aBPr_(Szh6zg_&0YwO20M%jn% z%Gux$E#)lZLEl06{qsH<3v;z>}Od! z@D=O;ZR>30cH;Z);&&-Y07_jmb_Fdvt3s62Zw%f+cwZ^N8yoS=I^6V`#$hSXX4ZB8 zx4N7cSrXFUV$b9+acKyB7FJWidg7CK^NhA33^|Lq*^&8IlIwiaPx`VyV?9!MTu*r> z(o}GsV~t7u<@cy7?>4*R^ybE2VH;6jxZ8x+6~e_1&tnnZfqd1qwgO`_)JIc4@*Q67 zAAIvZl}-&4j{ zXfAJ_QvL3Hgd%k2Bf6fe!JrKydq-Aw*1oceR&|%Ty0^gl4!nL{Rj3?OAOEoWM>z>) zmenEcOJ1YMs^&M~*?&-fj@@6VRhagROdVnDhC&I*x01j4{8n~=ynkG%&fm}0S?0@n zcnA4ydb{yv+sGcm>)s}DYo@{ATh8AQ=_W|mYU%Dr4Hfs5GN0Z%4TWq!p*CK)5$2Blj z1BtUj1t-sRRJIxtJe}cggVEDNz4E_d9GbIC?`6v^q5Qr^rEJ4Au!YgUwp2rf#j~Z+ z;N$=G7{{s;`eUIGc}2;ElR~9_e>@s<_xz--;nVUgh2Vcl-P-ppqtj=*^35@Nfzc&KR~o(9Xq(ZEMz&l-Kf=*vc5H~N;* z>2oZ9qZb%mVsxd^n~k;^-Dq^1(Va%0H2SR37mU7a^mU_e8J&KHm=#xgDHTr_lmyNz|^ev;)D=dGb7Z_b)bfwXojkX!xXmp#=okpKD`mE6x zjJ|C2b)#67R>)Z3!pe^ZR`Kxcs%H z_xwKIKco9?5&7Oul;V57P?%<5d69T;x6UaN@9o&dMdH1kxx7fcw|lo({i9{{cJP`a z>3w`OUG!e`ma98|KRz>GFaEqSpFVo;@jr#${ih_hwEjFaFUsHN*3rlPvGhNpoc_Ev zUj~04?dLxJkD>n&<$N*HzoPelOu3?I2BN_K!~Fp}KMuBmdQCOg8Oq9PmbUvw=B~#MDbG% zKLvho+k|n3;qizZe~#m+5qy^Mmq&1ae&A^l+@Ci%GlKi`3uhVb`}Nr--^=m%e8W9I z$u#(L2cvjpM2_cQ5Rv0`;m=R>a=d-_=P7#J+jW0F;^~ok`STKIM{s|B;+zQX&&NC? zg120|OzT$>!3VE*_?h5dH^O+i)eAWAWf%Mdh6`^l?$2?Q`sd=SjbE@_eAPAAyf0Dt z(WVVueH#)>t1hpqzI4$By<6~K7SvQ#FTTj3!LqKF9{H}na>?aO7hS$^aYEc&b9w^a z!xz;ox}thv(?yA9`PMwa*$8@q+JXgD)l~}C!2UR&s3)2hU9q&SWgLuZElaBxR4-oGw6td7 zf~5;vTNW&8YHh8#qNZu-75X2{`S`m6zfZ}>Ps;4q^6`^{aa-T#<1>P=z`CxKGmrf~ zFP}diOwMurG9N!RXipZx%Y*TjLO6b33hYNpIbGTB7xU$x78KgQl=7zD5i{k-r>*u-Cn_~41?c^JG<`5yxpIg=NLTyaLd zW&CBX1)sPi6c}$@F8mcl@ZE_}0sS_St7i?boA2;N_kk>l6r`a3x(KWX^n=R=jF??-cWzsYGZIb^2cX~Qcb^1o?#`O}TcS7Q2H z$c9A9nJ|8@|5xGH{_vGh`9G)s2f?pZ&YYme^yBN5Hu;qiIWw5RL{9i$otz(=oHM~C z-+2-K3k@IrvMZ;Tf4Sjdq+VAW-X76&o#83NeZ4*gF6C+Xi7Su3e@K~n4KF|F@b%P3 zf;^uR{=NS*)cZw--)ngFVTX@tY!E!=`G4bZefNww`TkDi)J-~E-y;Km5nS{z&DzD6 zQ{Elaa-O&ht{~8NI-su^9?W*Q*XQpIpE%9ovW}4uXQ3eDWnyQe-q+f~N#2#zdd+hD zJ2W;378zb{_)~^UIw@yuME|!K9z@EYG&vJ7Ctu&?K~|^XfyYh$W|b2Uc3MqaO~fgbsbm ztDLFp($~Rfp@-B%p_Z>-{||!S zdi*hm>$gh8mGMAP_$O=~ZffSt9>J%ErN&?V-<%x%<^s0si|{9nKX}9O>pR!*f86l# zF^B7SJm3#8J__agDdR6Mar!?CUI`C@&t!h7vH4}h!NC`efA=GyB4--@Eye97hrD9^ zBK*g|XJVK9I^WwRIaeq_d7}G*Sv;5(J?}ojm0#cMB&USoLmOPa`n@xF zmEpl(J6yk;0{?*GTtvc$jelY|)R=FSIEDtp_wI1`;|>mbz@_{Hk@d-D<8OGt@jq<* z4=QdqIpj&>pR{$z_buPEcu-uZ9lzt{KkVewEj9eGi2R=y!QV7FDYI{DOil?6A@!<@ zti$E|>_X+aL~-oo9idA2iOE@Pc=%a|`*L1oc=dGGj%Ln-4;7K$X#9yLC&$zi%q-H+ zQ}CD5e=4o~R-E8YlQa2}lhb7p+YC~uJ{8lE;<&yaX=#nY42H@=TbV$rqd)hMR_eHvXd#{a_wD#W!-Jy^uQC4mBJ%%&Obg|Ue-D*k_f;q7OC?Uw#v*cN zYrnG0a>#a*Gy0&DQ)Y7hvWT3o6~SLHISuVj&RLen0mB2E2j6S>p(1jQ6~WIeVkhOh zd6_Q~_qlxi^Aq`YUhptdo*N8ruzu_3yC#pPoSZkToOc*LG3anTw}QC44BtKE@CS|m z0ncxCd!gZvC~h}7Hsq>$lqt zPettKqlSTo^N3;b^I1T-4td`KyOo$VuhKis8wl-r#-Ff%qMsDHre!E=1O2>(l7 zeq>($MG^itJ-@9_Zng}jv(=o*e$zi!_xhi0_<-%F*g0r8U-2`7a?|I?Qr9q5;8NdF zlke9*HHur}9J1Q@6OsOTTM_4g1=b=m$MS2{0))zoo)DJ zWM6Qx;RDuh*I3@~0~fnA7O_iLd;Ca~a(a7pqvCUd>d1J!+2rs2Zm9hFy*^ishL=am z*=6|dq~m|s#_uM>2O{l0Xn5i+$FJXSB7YYhshsj3wsHb#c+B{R_J(?2@8CerMV%F+ z-R<`dzdzlt{Kk|+j+!0wze8POalb6W|1U-GvU1m6L)H(SR)gR)!xNpMO1{D5pKo}> zj~wpxf2HEaltXSc{;<*UKVfn0h7Ww%;lBKzG`!mE^F7A@KoR**8UK*=E0%v6z5y=! zkM1x2-uP2iU%$@T@8vXynqGcKk?<36vGYR@Ir}!^;NUgm4{aUzis5f5ZZ|pP6b71% zi|VsNMfL1Uu4WlNdY!}dj70FW4WD?$;hzALaGBwW--UXw-|TX=-1C3S;d+(__^pa7 zYu36(*8%NKZ zod0fkgRR56441Pf3e9&v^Z8nN=Gi!v^D9Kpd(ECdU~*0@BIhi{neSc;l~aBXkZ`Ht ziSLGT8+bWk5jk?Mh2&fQOUJKgB#^GT2>+eNzt^7IoF|zO28;0jCAhTLP-MUPC6hDx zP^jro)c@Jf8b0xN4&Q0`_YH3_`~Po-|5S0i$sxZ1mwd+~?fACI32Yti=grd7oF1y} z`PF`tb&BBw)}L=T{2XwRe=s8dLgmjXh+SS;1izsO-lRBo)$G+xCZ``<)-6%{u+{kM zIzr{#X#B&5kD9&GGm412lzu1e9=z=MdyId?_$RG>&o+Ea@}<7}Y+m!@?)!?*2|}B{ zyq$T;Ve~+#croLZso5?A+dMz~hO@=3io&2vG-eq{o_GRk~ z|AgoNs^j~j2X8~zoKKj`ph48M)0rK?W~f3N&g;NVw9@V8C= zKy#>xPO_vYvp|)08Mpp+t>NbwUcJ-tml=Kuxb&Za$bKPc?&<68!;xfFGj4Z!TGxt~ zzn)}YXR^5iuZg`uGTG9dT-(vz)Yy@1>Fe(4O*U@m7f(+q9PhNYR4rX{MNMI*q_{)F z2UAbuCUcn7)`OR*WXp!m&P^oAxl4-Uv^-Yv&_I#YXM{Ruw9DQ;97m}0g=AyzdUb)} z?wau*B#DyvZEzPGdhxn}bCnj{MFdo4t$01c2SRsu-wJU;72u(?Iccs_f<9a*iSX_K zq3c@ox+_rME>(SvO_U{>RBv~!;+dmM{BO42VTJ1JcCOEo&I4kLc+u++?=h|*=6NF7 z+1e{bio_z6H?y42J;$GmRN-$VH%?q$ny)SDDqd{7bg8_=RJCpB=*Y5IrcQF<65zxK z&v4G$V$%HEIexprv*(5$af4*-=y?sgASoGrjcZeYTXEoBdlPQ(sJ^bZ? z=Ilc|Lz33lUK?27h$PHMEoDa|Iin$bo2AH6Zz+gqDB0N3f(ZJE-nlM~W0s(+TYY@> z;f4seCsM~dHgq$leB~vLwg)}6Q>9p2>pgu8PmLM>Uk+0boQxMtkv!qPwWoxql>QE}_Jj!v~j)zbgaXk_zg%{eTNUvU^RuJ;Vh1#Y~ zs&}a9uvq{u)^_)G>lM9ZgM#>?k+_t_^eo_}XQBKjKGC4Pecd7*lYpBwsE#zK=mgi7 zt!b-YPPv= z7QZyfKHNGo;*xke3&T~buf6)3&(axJX7JZGS4zjC8G z>D;X))pdhhW6lS|`BMSk4fk19h&)LutNHop`jR*0pU)svFa+bea*bKh41%y?CR}Pq(hO zk$Ej2Q(2lK*>`6*bznlx=h)cWrCqZvAC}6ai56FGm#3-+S4L`qr3a+ewdAK#4*a~? z)RAlzFT<{1xI!@bxjv91v6tqS?%=YL#%I!({Bg0?+uGRE+#a;CKIv^Oke6`F9M5#i z>?95xyCOx>t|3{-knZZ%6@fB0!73K71xII5rD#1wwpc{%QRb~sW@pzi#J`oZshUGe zYtsh&PwJY4bW`TumS)6BcKMZH4JJ;2^FgV*EemW6xup*`bftV=KRZiL%#I#gnppRf zGB>wR>1PxOg)ySK*5=F9P9qMBU3#xMDOO+iT3#p5cyzSIiVThRNH11Zh|vj>*WQ>+ zZRpD}DPk;a$TnxZmCFE|DrSR>{`}%)I+-?Orl~M3m=Nifed{_~yW3hCBV!@S+}7LL z!{P#uf%ziaC|_?rBDX>QaeS7yIjOSpsKF1IDnq9W9y> z2>LtSK%nkj7`FT(Xs33Qo$6jpwC17>q-!BJt7xvevYslKspC;6f~5F&c1D9LXwRZLc&sMN-gcK(tW%)-knRE* zOZ(~UmQ423tdagJy3wT?b(1#Djvtqel}3$%Y*TL;r? zeksNFP{>H{&nQhgdqyx#B)cBD&z-V#X{;%1T4LSf8oD{B>*^xFRY;T~f~EQ$-QDYP zm7U4ZrH~k%^~_12H>1Fk7|YF#U1bZu*YYfi-$RV@yh zru1)QrJ8!y=W9jUqmh*!ld*O|Rc4YW0NDv_%I4O27-cy^QP#Ic279LEbW@}?mjU2} z*yh1z73aXxk5609yc+{7~sRc=Ou>)7M8 z_KEsBqSFXg%r#60F6Om#`I}cKDcT-tB>a-k#=VTZPJGAaS3?`UixKO}l-WGxEr_MG ztUpy#y35d1Nv3rjkA8Y*bCfA7_699<#dwS}Y}QC_CwvQto^fsiX93891^52sS#K7g=(u)88Zu zt(=vhS!Qi))Z{&0i!=s>?gXS~P1A|RX+WiSjb(#cce;!gd>^% z{qH0mSir?woDJjC_s2qw>NlW9@8lhK7yR>cyA9sY#mW5n^rNwmJKkq8pw50sli#(Z z>^^;kFcGfduarNZKJ(qGJ=mA;nQ}w4{?`*JXWe)<|9$H=es7Sl%aKg^J)fub#LL+^ z{@#BFTWLSc)>-;!`3=_Z5k)sXz5iae-_rZvpQ8Hn^}mC(5_h!;OvFRIO7MG+1b<$T z@bHtx6#d-=COVnUp9Fti(kQ=^NbtWSySr>V`g{3ZE;qgZPIuhWs}D-g4CQBe4W8c3 zU2b~+9z}Sj(Sre%Y|@y{rmTrCM|t` zt><*qm)oNcagm$ee@EP&boq-f<=ha>|M5tA|Gn{ei%Vbe?%dSb_VeghxR9onF(AQz z&ryD#OYg^vi_NC@_&15*m6S|+|NThCADI4oq?Nwo^Y`C5CoKKAD@NvgET6B}^&~Eyk8?@ t#n;>0k9UFjvO7-q|HyY-4p)iM$O%4Q56$GFQ2Kv-$#G74Mx)X6{|CVhm7f3r literal 0 HcmV?d00001 diff --git a/scripts/kconfig/conf.o b/scripts/kconfig/conf.o new file mode 100755 index 0000000000000000000000000000000000000000..b11aab834fcd56b710de92e6ecf8e7e5883a471a GIT binary patch literal 24136 zcmeHPdw5&LmA|$_Vw}`+c&#ZUxiL0zQsP(%Ax_A{imgNjB?OZ2Xb6fdUE2a#@=8~E zlu}G(6STr$+HIk`Z5LWf`PywaZFgHvfs8-J?QUwzampHEY+J>7f!&`d~?`>mN?+!>*#$2jiL9+ho}1`!a|8 znOEFDcHpePwyJlj(dueF;mfW-x^PQt=1nrPHS@M$uFIVCXF=!4g7NY3gTmI5k&ECu zJ+{i#|3SDIxvLBu9uiGUkGcA`U^TmZSak0dvP)7mj@rzyZ(vhxwQ#U6b5MZ&L$3bo zpig!_nvs5gs%!T~n1IKoR2qisi^r1F$eSZ85FG;!psw_za4}(=uD%O_;L8l-aF>eV z_%bh&3cDVz-J?$cL(Z(L?{%p79JPWz@=KWN^nv%&?@!t>)fYP8%U*Z@C?NBcuHOJy zXjf%Epvt@pWUlKUO_d8v+A;_Ipxpnt57^|?a zPLG|Ly1X!Db~CrcJ^loGLf8tk1oP(4FQ6w;cW%1-2piZJ0LmQp-SPCJaIwX6qi3t< zCQo4N@abhzEI0y(M5InooLvNKn@Il5_%UP@QWy{L3EeO!9rR^>K|Ohog0Cm`z!9E8 zKh+@2G^4qhq9J!iv3AIYr^xAOaLwui(+y*AgD-PZM3y8WD!g0>*#C#C>qpQIh-bFn zq+f4p%e*ga>w{RGIR#dG_O|M_tk;Cx>+1Uy^vE_>rN>I`73r}uS3eF>#@Eyxb006A zh6!zda+ZIoNPzZvkluair<)4#G4e~;!2osQ3>IpOvl`svFdu~obTXOnOXh_q=7FBf z^Pb1>y)Cop10YNk$$>rT|aCR$@+>dCIHN)Npc#=3Uj2=%t? zR@mBLZ^^BYO90G($rVy0Bs3NxL&9u6DYYLM7jDV+RP(SB-Nja!Iqu8srz!VkljWjC z)+v?yG6!I#@(~Gp)6gq;-&9=i;0- zf{P`VzSS&sef%JF$X$iJ;S%=y)aB0nriaJntSeK^eD*@YXCqPQ z@5|f>=Mgw2RQWT}+VWhBZ{WsSQ(6G>VC^~XBR7%<<-(TCf&)4R|1@)acr@|DY&*vW za8h@bM`-grg-#Y;oep8n$-*9o%jaZNwsK~kp*s=?sMetTP1Dbqj8eefNvbmrpa^P zh7dR4$nEN%3i6LFgb2=+L+tifLzRw_PIzU{&8yxEr*zsSG0Zn%Pi(}+oHcxhhGFF6 zg@7CMx%Os7dwRHJwAEK)rrz)mJc$VIZ}<-9C~-FO46G^fg`N}k`ZFg*n-}Ke(zeh+ zUv`}Vk_M4K+In?~Y0vZx^kVHGnkpJMjQi3<l%l*$MU3lo&58fV!tq%lGch)zK zp&UY9`ezFs1BVOoG2whs-v-Gl8?Vlt3!VF5D7dx34c|0aNHCfC+}sA~)`Wbd+g#a3 z(Uwh#tTj!HUr9(?K!FH0Pj;&b(|K0<-4c6#`rXph(tS5TTkhgPnJ?B$YHmfrcs%c~ zg9aiAQIKrtb`_>=f>sn>1I>FOCpcW zNBwWui^a|4)QQQ+q+|sC68Q+5c{+NHveAHVfBKzeuH92$1&`PM5bY4oqV(YE|K0oJ z<2k>3ROSm$hjT9$clE!BO>W^i*?N)dJ7T#mwvw+G{oevEt$*pPzM<4| z%rsSU(SfJ`z~jS67{tL^uP+>9hx75fLEbEuUO#-wURT)N{9y5utR%1}Jk5$QBLB2mlijwF+jSZ9SXZ{EBLc$qDtF_j3~k$BAE)YK(w%vjtu zJL0KWcs9}mbwkt&CM`3OikZoHw`DqVv1>eG)>{po4Q5Su@D|IAN5f8AjTujft`6R9 z#ZrX^BJU(*Zi7%%Ff16G113abVKZ!X1XEF)DMVY*OvkwV$glNW)8<*fNv+q{CFimc z7X)t)CL+PuA0W8ZyL$85yjW4w3JqKBsm|YTtHBH~&7@_8iwZD; z(P%8*;CKuxyR0Oub;rZ323}*eL@*YPcQZgLF zXe+Rw5{pyA=47zbLVL|E^OIZ6E%6>)$Xm_jWcPer_A4P1%nMb(3kQamP*1`o!U*BJ zVb+BkpkkO9+VFS1_qw^r3w6aKAwk|V`x^RUNY>y{w3$jCn(Grg(szEl36s z2soq$2o}e17>8+~$)>TT4qRXe!@6 z3Ay?k8Xy6|V4Q?%z(rxd9w#GC`kCn@}q+|}J4k0vorVDU#FDbP-^Js3?n2D7zL5N>*6W-uB- zi#yQhynZppe9c@g7KhVsJ`k+!b;D}*$C@jq^a&mEYcl} znxRx80n?_;1PsT~EJU$1;aDR6a&x+@1h_vMmCyT*`tiL5+z& zQWi*%!t!aVVA&rj3?xWl1;6K|abf6m9Hg9dhyt8==!KiV5K>5wc?oc#3URhNauAAO zu7fNF8O;5^a$3VX>eCgxC+9`wm-9xrR{3Wt?P?XjlsjF4Pa02K#EtA}81UibX$yQ= zbJ~J8U#BZmPuB=-zpq_(N52W*d1B#2JQ6nRFI&81(c*=dinInh2J9h=nief>T-ZL> z3`K*GRJU7+B%Vdw?uN#Og=T%1ZTBRXEm#2CFG^_WjK@2pRx+MSge*vt-3#n^JR0f> zMq&%1(e2&yA&1@!JDb_QXz7xUCU@gyjUnr@@RCM%>jd&}-DEqi!UWs|3}Q4oLzHU@Eh&i8t z8OD`3d8g`Wt?c1yO0O%X#ar1^x~6icr?R)Ct+J==qmzq~Kzu#CegiKolW~H;NHEn? zX{IOLQ+97@>3hQN)s?Uie9&x)Ni>Xq!-Z1Jwr$+Dvc07mz17e?O0qiP8f9I9&Vi57 z8=-m^wavtLM-SO_XKCp>1z(!be7e#D3viP0U*jt0MUYzx|Axe;1~hgc;g>at@0srO z5VpbP%Y^sPf)jHC_?v{AXE}UfFI?UQuM%Ujf#bv?*ZC^qKL~U-24f9Je`ybKhZP4JyHTE=V^x_Ylis`*bV^2`SpP`ZeX$^mt z20yC7n>6NnFn>gDoxC~`JZJ+0w?f^dA}_S{dnwC5(OKSJ-Q7h_Y7_Ztl7eimQo z0#C}Rp>Yi}{yZk<`-DsWLgN37@iDhZy{|Bw`{6A`&aET|^CuRxpX-$YEcIrHUqOM5 ze6IHbhI74h2}dMW>_;PQ$m2k9k8FBILPK7V`n0pmm>V1T8^aJkQ65pfnscJmM_}p)Y z7(ScH`6EuMsZ&kLM38C1@ZNerhC2 zJ>mGq{m`KB$sA*ahTo#$U!&mC&tWF#BG4`IIOB8w*n~^}tS5tdnVecCXOQ81A9;}B ze7=SWSLfv!!lmBFkO1YUOinG-rTs54oa=oh_2$TL`14{cI4-U?&Ty`G7sKnI zj~wsE2$%AYqfjV+#rRzQ{R)3A<)zOnxI71ZMI*=gC6Hr3pO^iNUk7$bJAbCgpMe91 z@=M0&a$ZvSDXPE1_)DR`l%G@hpP~8*4ga?a|7oiKPQxEp_~+3_ER*Cr*uw2OlW;jN zT~x2s@XuEGPg1>F!=It>&!-!J8V!Gr!uJ#Z5)I$2@CS*1nTCJ4!aqX%W)0t~@aL3c zG#JJe8va!Z-zNSh4gUs(zn}OwY4{<9KbgLOh-mm9XZT{UTgKrx3CCs5_xEQMd>RfG z$}uJf@7<)Fw-_JK4@0z0OUbWl-Y6#=^>Y3P2$yl_rFC}+lf&0tC&O1WdlC%CZ;+&& zA7QwM;kOem^~!vmVSKLlK880lIbR@L9oOTG&-2?}!lm9Bv~GtL98`$%uS^cN=di+; z`^SqK{;LdM3zDUO-qhgl5iaeVM|Mu8IK^q=_LzjrxRT$QG-~kWgrj_nLla(DJQ{or z;i$J2UebO);ds76Ie0e0(!=;yKwa_&8Q#Y5hZ(+x;Xff<9{i`dHk;=T-qb!-^ch|?*@i9gH6((?S!lT z>1KTHpN}$}`{xeAr9IL=cPhB_&nK81Zs$XU%Q%#uhdj%0o_~JCtWaP-eAc*%I%&-mvu{6~c28;1F45pu z5{~nQcFO%RPPnS~R>D!Qm+9?ie2lmIXddrnd_IrQFr4R~!-PwFWS%_A%EWR3mN|b!lgYFX2wZ|^Land zh1Q<>ImQKqOMl99xT)YyZ}`rI$>DY`Q~2^6?$PjlgrogDe_q4*JZ~p8{M$7A2Q>W8 zY4~4exF2ki^RkC<>7QjZkKbW@?uTa?&gJ}Ak+Xv2JkR)CPLAPR&TkYs^7F5E8K283 zqYt7n{`tN+jc_@x7P9AT#^-XX75*CH&(iScFr43KwJ@CTUtz*!{*?RIb_F+K99TZa zD+u()eZ4JL1Nl;Wd zXKC<@HF%?f<9A3{mMgd%*CxU-9{7G?F?=<&Nq_b*+|BTv4CnV#w-GMmO5RWHW_%u3 z_cFYh$^RDN=pW2u;!!tv|E?ncQ#cSP&oVi+P?z@qgyCH8VMUJooc%u;pUXMUa4zR9 zMa}`TXPoi5oHH>fp&*URIh)~i&?fEw5W{^8Zz5d!S$;m=%J^LGdWLhon+cb3D1Y}5 zV0^wWM-;xa^G?R+=llVMFXcbPaGw7kVRHES`D={N&(Gf^TwU)^F**GF`~xNjFX?Ng z@t-rC+jEr3;rr2R4CmuLslm^{Ln;(GUrQ)|Rxlj9nn;2&op3cyY6-{r;^)S>Ob%Yk zb7K>e!_SSV14{|KFh!lD@2BWvm^_ZZAH_mx>=eA(Y0l#{XfPC0{4L0To8;6h_!8nb zD)?K($5_Q8?R=2%W`P!P$;UNOT?+mlows^4_)ZPp ztHJNm;DZ|c0S*4327gq8@6q6oY49Np{)`5HPQg!9Ily5BpG1B>s^HSk$29l}4L+v9 zMIb<%j1wup9DyQul?KQE6Qvm6)Zq0Ryivhtkst7Pcg5s4YjFHMUNQa#4Su}_-=@L4 zGJcSHTYc`d{Bcwpur#1;E!tXJsSKm4L+p7pV8pYDR@5q6+9pR3NGXGmg%yS-}U1zfHmA{?)7CUm^a33jP@3Lkj*h z;YStxM}!N*p-tNV0^ueC49^kXtl*=BZ&UC|v|sls_;h98M>kT67y5d{U*~=YarvBw z-0vh`K3^j9w#4OgDz&6n;_^9?9tD@ruiUNRCY{fwE~_vi$)IiTG7|B)?Ty)qT}G#6 z+mUW7-VqM&GLm*85VLk5XvMY*7XIG=2L1^E80di~9AkDsfZ-7KwRYM@L&Ay%8^mSO z4#R`StV1H+-2)7GRtq}W2K=`H_=ZnH210OQ?Tpw$Eyywgft~Q=uWi6{%1I*{k97v% zG2Num0c}a6p*@*&`oRN;0eEx}Ee+5^i6A0uB@!qp)ZJ5157q^`tSBK}!K70I7X+Y3 zByNPdtk5muI%dGbtC28Ww}YWLAb2((9xg+<@N7A$-_?zEc+lKvfd7rbYFN8|^L(&7 zbW6d!ZYzn;e+S^dgNU|cOGigEmFzNLJi$aK`WLPOI7FiXA6yH-le+NaTc?rS6$=IA zqwT^=_@KQN$UmcLbo9XU_jZS)%V`XzZ1LDRjRw1c3%a}G+bxF%k2gC{=7PHd=svI? zo?#9YK(Odk5Sc*4Ik6ZQ1{I=ehcJNI;#@+QB;mio0A(oG-qm9n_^>nuiq#e9fG4HN zHe@&t#>OUK^n9skE41K4=YeFTy9fT84H1=*WMF$F8EMD=b_4W56&?qSbp{0hPeIfF z$N^3Hk>G>5kyrp8N9`mVQaD*SsbH98L6AZO2H*)<3nvUB!ARn>tIpVjy{N(>08KIi zZC3@LQwU->gyRjg!|aAckA{%ZfbkM+hxc9G;$1A5L>&Hmg&;YFE(L^icY~YK$N%_k z2jn$MZ4+dD@>-`V?-yhvr4Ly(w!jr)^s|pV-b`03>3&N#@EnL3s-aXVDdK(4Jg0iJ z#(Bq&^DxJiJJtMiba#XCs2|&S=_S3}lm^*fa(6@jV)_TyISiA2?|}M|C;L~EfF}u4 zeRvdaj-i;!fR(E8cVz!Uho1i{`)@ik4~YxufBF6y>aXf=rVqH}`AbSs_5U?=EH?f< zo17j^qzK24V^_z&6ELJS!i$&k*-q_q9E59Ww|vLv1>`lSerYzZ6|PloAIvXcJ<2p2 zk5YemUX>E0{jz>LbSyUhW1AhuqeR5<<97 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE zconfrestart(zconfin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int zconfleng; + +extern FILE *zconfin, *zconfout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up zconftext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up zconftext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via zconfrestart()), so that the user can continue scanning by + * just pointing zconfin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when zconftext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int zconfleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow zconfwrap()'s to do buffer switches + * instead of setting up a fresh zconfin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void zconfrestart (FILE *input_file ); +void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE zconf_create_buffer (FILE *file,int size ); +void zconf_delete_buffer (YY_BUFFER_STATE b ); +void zconf_flush_buffer (YY_BUFFER_STATE b ); +void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer ); +void zconfpop_buffer_state (void ); + +static void zconfensure_buffer_stack (void ); +static void zconf_load_buffer_state (void ); +static void zconf_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER zconf_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE zconf_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE zconf_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE zconf_scan_bytes (yyconst char *bytes,int len ); + +void *zconfalloc (yy_size_t ); +void *zconfrealloc (void *,yy_size_t ); +void zconffree (void * ); + +#define yy_new_buffer zconf_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + zconfensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + zconf_create_buffer(zconfin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + zconfensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + zconf_create_buffer(zconfin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define zconfwrap(n) 1 +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +FILE *zconfin = (FILE *) 0, *zconfout = (FILE *) 0; + +typedef int yy_state_type; + +extern int zconflineno; + +int zconflineno = 1; + +extern char *zconftext; +#define yytext_ptr zconftext +static yyconst flex_int16_t yy_nxt[][18] = + { + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + }, + + { + 11, 12, 13, 14, 12, 12, 15, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12 + }, + + { + 11, 12, 13, 14, 12, 12, 15, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12 + }, + + { + 11, 16, 16, 17, 16, 16, 16, 16, 16, 16, + 16, 18, 16, 16, 16, 16, 16, 16 + }, + + { + 11, 16, 16, 17, 16, 16, 16, 16, 16, 16, + 16, 18, 16, 16, 16, 16, 16, 16 + + }, + + { + 11, 19, 20, 21, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19 + }, + + { + 11, 19, 20, 21, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19 + }, + + { + 11, 22, 22, 23, 22, 24, 22, 22, 24, 22, + 22, 22, 22, 22, 22, 22, 25, 22 + }, + + { + 11, 22, 22, 23, 22, 24, 22, 22, 24, 22, + 22, 22, 22, 22, 22, 22, 25, 22 + }, + + { + 11, 26, 27, 28, 29, 30, 31, 32, 30, 33, + 34, 35, 35, 36, 37, 38, 39, 40 + + }, + + { + 11, 26, 27, 28, 29, 30, 31, 32, 30, 33, + 34, 35, 35, 36, 37, 38, 39, 40 + }, + + { + -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, + -11, -11, -11, -11, -11, -11, -11, -11 + }, + + { + 11, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12 + }, + + { + 11, -13, 41, 42, -13, -13, 43, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13 + }, + + { + 11, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14, -14 + + }, + + { + 11, 44, 44, 45, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44 + }, + + { + 11, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16 + }, + + { + 11, -17, -17, -17, -17, -17, -17, -17, -17, -17, + -17, -17, -17, -17, -17, -17, -17, -17 + }, + + { + 11, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, 46, -18, -18, -18, -18, -18, -18 + }, + + { + 11, 47, 47, -19, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47 + + }, + + { + 11, -20, 48, 49, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20, -20 + }, + + { + 11, 50, -21, -21, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50 + }, + + { + 11, 51, 51, 52, 51, -22, 51, 51, -22, 51, + 51, 51, 51, 51, 51, 51, -22, 51 + }, + + { + 11, -23, -23, -23, -23, -23, -23, -23, -23, -23, + -23, -23, -23, -23, -23, -23, -23, -23 + }, + + { + 11, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, -24, -24 + + }, + + { + 11, 53, 53, 54, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53 + }, + + { + 11, -26, -26, -26, -26, -26, -26, -26, -26, -26, + -26, -26, -26, -26, -26, -26, -26, -26 + }, + + { + 11, -27, 55, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27, -27 + }, + + { + 11, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, -28, -28, -28, -28 + }, + + { + 11, -29, -29, -29, -29, -29, -29, -29, -29, -29, + -29, -29, -29, -29, 56, -29, -29, -29 + + }, + + { + 11, -30, -30, -30, -30, -30, -30, -30, -30, -30, + -30, -30, -30, -30, -30, -30, -30, -30 + }, + + { + 11, 57, 57, -31, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57 + }, + + { + 11, -32, -32, -32, -32, -32, -32, 58, -32, -32, + -32, -32, -32, -32, -32, -32, -32, -32 + }, + + { + 11, -33, -33, -33, -33, -33, -33, -33, -33, -33, + -33, -33, -33, -33, -33, -33, -33, -33 + }, + + { + 11, -34, -34, -34, -34, -34, -34, -34, -34, -34, + -34, -34, -34, -34, -34, -34, -34, -34 + + }, + + { + 11, -35, -35, -35, -35, -35, -35, -35, -35, -35, + -35, 59, 59, -35, -35, -35, -35, -35 + }, + + { + 11, -36, -36, -36, -36, -36, -36, -36, -36, -36, + -36, -36, -36, -36, 60, -36, -36, -36 + }, + + { + 11, -37, -37, -37, -37, -37, -37, -37, -37, -37, + -37, -37, -37, -37, -37, -37, -37, -37 + }, + + { + 11, -38, -38, -38, -38, -38, -38, -38, -38, -38, + -38, -38, -38, -38, 61, -38, -38, -38 + }, + + { + 11, -39, -39, 62, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -39, -39 + + }, + + { + 11, -40, -40, -40, -40, -40, -40, -40, -40, -40, + -40, -40, -40, -40, -40, -40, -40, 63 + }, + + { + 11, -41, 41, 42, -41, -41, 43, -41, -41, -41, + -41, -41, -41, -41, -41, -41, -41, -41 + }, + + { + 11, -42, -42, -42, -42, -42, -42, -42, -42, -42, + -42, -42, -42, -42, -42, -42, -42, -42 + }, + + { + 11, 44, 44, 45, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44 + }, + + { + 11, 44, 44, 45, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44 + + }, + + { + 11, -45, -45, -45, -45, -45, -45, -45, -45, -45, + -45, -45, -45, -45, -45, -45, -45, -45 + }, + + { + 11, -46, -46, -46, -46, -46, -46, -46, -46, -46, + -46, 46, -46, -46, -46, -46, -46, -46 + }, + + { + 11, 47, 47, -47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47 + }, + + { + 11, -48, 48, 49, -48, -48, -48, -48, -48, -48, + -48, -48, -48, -48, -48, -48, -48, -48 + }, + + { + 11, 50, -49, -49, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50 + + }, + + { + 11, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50 + }, + + { + 11, 51, 51, 52, 51, -51, 51, 51, -51, 51, + 51, 51, 51, 51, 51, 51, -51, 51 + }, + + { + 11, -52, -52, -52, -52, -52, -52, -52, -52, -52, + -52, -52, -52, -52, -52, -52, -52, -52 + }, + + { + 11, -53, -53, 54, -53, -53, -53, -53, -53, -53, + -53, -53, -53, -53, -53, -53, -53, -53 + }, + + { + 11, -54, -54, -54, -54, -54, -54, -54, -54, -54, + -54, -54, -54, -54, -54, -54, -54, -54 + + }, + + { + 11, -55, 55, -55, -55, -55, -55, -55, -55, -55, + -55, -55, -55, -55, -55, -55, -55, -55 + }, + + { + 11, -56, -56, -56, -56, -56, -56, -56, -56, -56, + -56, -56, -56, -56, -56, -56, -56, -56 + }, + + { + 11, 57, 57, -57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57 + }, + + { + 11, -58, -58, -58, -58, -58, -58, -58, -58, -58, + -58, -58, -58, -58, -58, -58, -58, -58 + }, + + { + 11, -59, -59, -59, -59, -59, -59, -59, -59, -59, + -59, 59, 59, -59, -59, -59, -59, -59 + + }, + + { + 11, -60, -60, -60, -60, -60, -60, -60, -60, -60, + -60, -60, -60, -60, -60, -60, -60, -60 + }, + + { + 11, -61, -61, -61, -61, -61, -61, -61, -61, -61, + -61, -61, -61, -61, -61, -61, -61, -61 + }, + + { + 11, -62, -62, -62, -62, -62, -62, -62, -62, -62, + -62, -62, -62, -62, -62, -62, -62, -62 + }, + + { + 11, -63, -63, -63, -63, -63, -63, -63, -63, -63, + -63, -63, -63, -63, -63, -63, -63, -63 + }, + + } ; + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up zconftext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + zconfleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 37 +#define YY_END_OF_BUFFER 38 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[64] = + { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 38, 5, 4, 2, 3, 7, 8, 6, 36, 33, + 35, 28, 32, 31, 30, 26, 25, 21, 13, 20, + 23, 26, 11, 12, 22, 18, 14, 19, 26, 26, + 4, 2, 3, 3, 1, 6, 36, 33, 35, 34, + 28, 27, 30, 29, 25, 15, 23, 9, 22, 16, + 17, 24, 10 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 4, 5, 6, 1, 1, 7, 8, 9, + 10, 1, 1, 1, 11, 12, 12, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 1, 1, 13, + 14, 15, 1, 1, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 1, 16, 1, 1, 11, 1, 11, 11, 11, 11, + + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 1, 17, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +extern int zconf_flex_debug; +int zconf_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *zconftext; +#define YY_NO_INPUT 1 + +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include + +#include "lkc.h" + +#define START_STRSIZE 16 + +static struct { + struct file *file; + int lineno; +} current_pos; + +static char *text; +static int text_size, text_asize; + +struct buffer { + struct buffer *parent; + YY_BUFFER_STATE state; +}; + +struct buffer *current_buf; + +static int last_ts, first_ts; + +static void zconf_endhelp(void); +static void zconf_endfile(void); + +static void new_string(void) +{ + text = xmalloc(START_STRSIZE); + text_asize = START_STRSIZE; + text_size = 0; + *text = 0; +} + +static void append_string(const char *str, int size) +{ + int new_size = text_size + size + 1; + if (new_size > text_asize) { + new_size += START_STRSIZE - 1; + new_size &= -START_STRSIZE; + text = realloc(text, new_size); + text_asize = new_size; + } + memcpy(text + text_size, str, size); + text_size += size; + text[text_size] = 0; +} + +static void alloc_string(const char *str, int size) +{ + text = xmalloc(size + 1); + memcpy(text, str, size); + text[size] = 0; +} + +static void warn_ignored_character(char chr) +{ + fprintf(stderr, + "%s:%d:warning: ignoring unsupported character '%c'\n", + zconf_curname(), zconf_lineno(), chr); +} + +#define INITIAL 0 +#define COMMAND 1 +#define HELP 2 +#define STRING 3 +#define PARAM 4 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int zconflex_destroy (void ); + +int zconfget_debug (void ); + +void zconfset_debug (int debug_flag ); + +YY_EXTRA_TYPE zconfget_extra (void ); + +void zconfset_extra (YY_EXTRA_TYPE user_defined ); + +FILE *zconfget_in (void ); + +void zconfset_in (FILE * in_str ); + +FILE *zconfget_out (void ); + +void zconfset_out (FILE * out_str ); + +int zconfget_leng (void ); + +char *zconfget_text (void ); + +int zconfget_lineno (void ); + +void zconfset_lineno (int line_number ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int zconfwrap (void ); +#else +extern int zconfwrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO do { if (fwrite( zconftext, zconfleng, 1, zconfout )) {} } while (0) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + errno=0; \ + while ( (result = read( fileno(zconfin), (char *) buf, max_size )) < 0 ) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(zconfin); \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int zconflex (void); + +#define YY_DECL int zconflex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after zconftext and zconfleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + + int str = 0; + int ts, i; + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! zconfin ) + zconfin = stdin; + + if ( ! zconfout ) + zconfout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + zconfensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + zconf_create_buffer(zconfin,YY_BUF_SIZE ); + } + + zconf_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of zconftext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); +yy_match: + while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)] ]) > 0 ) + ++yy_cp; + + yy_current_state = -yy_current_state; + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +/* rule 1 can match eol */ +case 2: +/* rule 2 can match eol */ +YY_RULE_SETUP +{ + current_file->lineno++; + return T_EOL; +} + YY_BREAK +case 3: +YY_RULE_SETUP + + YY_BREAK +case 4: +YY_RULE_SETUP +{ + BEGIN(COMMAND); +} + YY_BREAK +case 5: +YY_RULE_SETUP +{ + unput(zconftext[0]); + BEGIN(COMMAND); +} + YY_BREAK + +case 6: +YY_RULE_SETUP +{ + const struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng); + BEGIN(PARAM); + current_pos.file = current_file; + current_pos.lineno = current_file->lineno; + if (id && id->flags & TF_COMMAND) { + zconflval.id = id; + return id->token; + } + alloc_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD; + } + YY_BREAK +case 7: +YY_RULE_SETUP +warn_ignored_character(*zconftext); + YY_BREAK +case 8: +/* rule 8 can match eol */ +YY_RULE_SETUP +{ + BEGIN(INITIAL); + current_file->lineno++; + return T_EOL; + } + YY_BREAK + +case 9: +YY_RULE_SETUP +return T_AND; + YY_BREAK +case 10: +YY_RULE_SETUP +return T_OR; + YY_BREAK +case 11: +YY_RULE_SETUP +return T_OPEN_PAREN; + YY_BREAK +case 12: +YY_RULE_SETUP +return T_CLOSE_PAREN; + YY_BREAK +case 13: +YY_RULE_SETUP +return T_NOT; + YY_BREAK +case 14: +YY_RULE_SETUP +return T_EQUAL; + YY_BREAK +case 15: +YY_RULE_SETUP +return T_UNEQUAL; + YY_BREAK +case 16: +YY_RULE_SETUP +return T_LESS_EQUAL; + YY_BREAK +case 17: +YY_RULE_SETUP +return T_GREATER_EQUAL; + YY_BREAK +case 18: +YY_RULE_SETUP +return T_LESS; + YY_BREAK +case 19: +YY_RULE_SETUP +return T_GREATER; + YY_BREAK +case 20: +YY_RULE_SETUP +{ + str = zconftext[0]; + new_string(); + BEGIN(STRING); + } + YY_BREAK +case 21: +/* rule 21 can match eol */ +YY_RULE_SETUP +BEGIN(INITIAL); current_file->lineno++; return T_EOL; + YY_BREAK +case 22: +YY_RULE_SETUP +{ + const struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng); + if (id && id->flags & TF_PARAM) { + zconflval.id = id; + return id->token; + } + alloc_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD; + } + YY_BREAK +case 23: +YY_RULE_SETUP +/* comment */ + YY_BREAK +case 24: +/* rule 24 can match eol */ +YY_RULE_SETUP +current_file->lineno++; + YY_BREAK +case 25: +YY_RULE_SETUP + + YY_BREAK +case 26: +YY_RULE_SETUP +warn_ignored_character(*zconftext); + YY_BREAK +case YY_STATE_EOF(PARAM): +{ + BEGIN(INITIAL); + } + YY_BREAK + +case 27: +/* rule 27 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + append_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD_QUOTE; + } + YY_BREAK +case 28: +YY_RULE_SETUP +{ + append_string(zconftext, zconfleng); + } + YY_BREAK +case 29: +/* rule 29 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + append_string(zconftext + 1, zconfleng - 1); + zconflval.string = text; + return T_WORD_QUOTE; + } + YY_BREAK +case 30: +YY_RULE_SETUP +{ + append_string(zconftext + 1, zconfleng - 1); + } + YY_BREAK +case 31: +YY_RULE_SETUP +{ + if (str == zconftext[0]) { + BEGIN(PARAM); + zconflval.string = text; + return T_WORD_QUOTE; + } else + append_string(zconftext, 1); + } + YY_BREAK +case 32: +/* rule 32 can match eol */ +YY_RULE_SETUP +{ + printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno()); + current_file->lineno++; + BEGIN(INITIAL); + return T_EOL; + } + YY_BREAK +case YY_STATE_EOF(STRING): +{ + BEGIN(INITIAL); + } + YY_BREAK + +case 33: +YY_RULE_SETUP +{ + ts = 0; + for (i = 0; i < zconfleng; i++) { + if (zconftext[i] == '\t') + ts = (ts & ~7) + 8; + else + ts++; + } + last_ts = ts; + if (first_ts) { + if (ts < first_ts) { + zconf_endhelp(); + return T_HELPTEXT; + } + ts -= first_ts; + while (ts > 8) { + append_string(" ", 8); + ts -= 8; + } + append_string(" ", ts); + } + } + YY_BREAK +case 34: +/* rule 34 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + current_file->lineno++; + zconf_endhelp(); + return T_HELPTEXT; + } + YY_BREAK +case 35: +/* rule 35 can match eol */ +YY_RULE_SETUP +{ + current_file->lineno++; + append_string("\n", 1); + } + YY_BREAK +case 36: +YY_RULE_SETUP +{ + while (zconfleng) { + if ((zconftext[zconfleng-1] != ' ') && (zconftext[zconfleng-1] != '\t')) + break; + zconfleng--; + } + append_string(zconftext, zconfleng); + if (!first_ts) + first_ts = last_ts; + } + YY_BREAK +case YY_STATE_EOF(HELP): +{ + zconf_endhelp(); + return T_HELPTEXT; + } + YY_BREAK + +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(COMMAND): +{ + if (current_file) { + zconf_endfile(); + return T_EOL; + } + fclose(zconfin); + yyterminate(); +} + YY_BREAK +case 37: +YY_RULE_SETUP +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed zconfin at a new source and called + * zconflex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = zconfin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( zconfwrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * zconftext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of zconflex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + zconfrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), (size_t) num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + zconfrestart(zconfin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) zconfrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + + yy_current_state = yy_nxt[yy_current_state][1]; + yy_is_jam = (yy_current_state <= 0); + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up zconftext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + zconfrestart(zconfin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( zconfwrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve zconftext */ + (yy_hold_char) = *++(yy_c_buf_p); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void zconfrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + zconfensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + zconf_create_buffer(zconfin,YY_BUF_SIZE ); + } + + zconf_init_buffer(YY_CURRENT_BUFFER,input_file ); + zconf_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * zconfpop_buffer_state(); + * zconfpush_buffer_state(new_buffer); + */ + zconfensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + zconf_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (zconfwrap()) processing, but the only time this flag + * is looked at is after zconfwrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void zconf_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + zconfin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE zconf_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) zconfalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + zconf_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with zconf_create_buffer() + * + */ + void zconf_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + zconffree((void *) b->yy_ch_buf ); + + zconffree((void *) b ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a zconfrestart() or at EOF. + */ + static void zconf_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + zconf_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then zconf_init_buffer was _probably_ + * called from zconfrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void zconf_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + zconf_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + zconfensure_buffer_stack(); + + /* This block is copied from zconf_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from zconf_switch_to_buffer. */ + zconf_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void zconfpop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + zconf_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + zconf_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void zconfensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in zconfensure_buffer_stack()" ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)zconfrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in zconfensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE zconf_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + zconf_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to zconflex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * zconf_scan_bytes() instead. + */ +YY_BUFFER_STATE zconf_scan_string (yyconst char * yystr ) +{ + + return zconf_scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE zconf_scan_bytes (yyconst char * yybytes, int _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) zconfalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = zconf_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in zconf_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up zconftext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + zconftext[zconfleng] = (yy_hold_char); \ + (yy_c_buf_p) = zconftext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + zconfleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int zconfget_lineno (void) +{ + + return zconflineno; +} + +/** Get the input stream. + * + */ +FILE *zconfget_in (void) +{ + return zconfin; +} + +/** Get the output stream. + * + */ +FILE *zconfget_out (void) +{ + return zconfout; +} + +/** Get the length of the current token. + * + */ +int zconfget_leng (void) +{ + return zconfleng; +} + +/** Get the current token. + * + */ + +char *zconfget_text (void) +{ + return zconftext; +} + +/** Set the current line number. + * @param line_number + * + */ +void zconfset_lineno (int line_number ) +{ + + zconflineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see zconf_switch_to_buffer + */ +void zconfset_in (FILE * in_str ) +{ + zconfin = in_str ; +} + +void zconfset_out (FILE * out_str ) +{ + zconfout = out_str ; +} + +int zconfget_debug (void) +{ + return zconf_flex_debug; +} + +void zconfset_debug (int bdebug ) +{ + zconf_flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from zconflex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + zconfin = stdin; + zconfout = stdout; +#else + zconfin = (FILE *) 0; + zconfout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * zconflex_init() + */ + return 0; +} + +/* zconflex_destroy is for both reentrant and non-reentrant scanners. */ +int zconflex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + zconf_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + zconfpop_buffer_state(); + } + + /* Destroy the stack itself. */ + zconffree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * zconflex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *zconfalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *zconfrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void zconffree (void * ptr ) +{ + free( (char *) ptr ); /* see zconfrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +void zconf_starthelp(void) +{ + new_string(); + last_ts = first_ts = 0; + BEGIN(HELP); +} + +static void zconf_endhelp(void) +{ + zconflval.string = text; + BEGIN(INITIAL); +} + +/* + * Try to open specified file with following names: + * ./name + * $(srctree)/name + * The latter is used when srctree is separate from objtree + * when compiling the kernel. + * Return NULL if file is not found. + */ +FILE *zconf_fopen(const char *name) +{ + char *env, fullname[PATH_MAX+1]; + FILE *f; + + f = fopen(name, "r"); + if (!f && name != NULL && name[0] != '/') { + env = getenv(SRCTREE); + if (env) { + sprintf(fullname, "%s/%s", env, name); + f = fopen(fullname, "r"); + } + } + return f; +} + +void zconf_initscan(const char *name) +{ + zconfin = zconf_fopen(name); + if (!zconfin) { + printf("can't find file %s\n", name); + exit(1); + } + + current_buf = xmalloc(sizeof(*current_buf)); + memset(current_buf, 0, sizeof(*current_buf)); + + current_file = file_lookup(name); + current_file->lineno = 1; +} + +void zconf_nextfile(const char *name) +{ + struct file *iter; + struct file *file = file_lookup(name); + struct buffer *buf = xmalloc(sizeof(*buf)); + memset(buf, 0, sizeof(*buf)); + + current_buf->state = YY_CURRENT_BUFFER; + zconfin = zconf_fopen(file->name); + if (!zconfin) { + printf("%s:%d: can't open file \"%s\"\n", + zconf_curname(), zconf_lineno(), file->name); + exit(1); + } + zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE)); + buf->parent = current_buf; + current_buf = buf; + + for (iter = current_file->parent; iter; iter = iter->parent ) { + if (!strcmp(current_file->name,iter->name) ) { + printf("%s:%d: recursive inclusion detected. " + "Inclusion path:\n current file : '%s'\n", + zconf_curname(), zconf_lineno(), + zconf_curname()); + iter = current_file->parent; + while (iter && \ + strcmp(iter->name,current_file->name)) { + printf(" included from: '%s:%d'\n", + iter->name, iter->lineno-1); + iter = iter->parent; + } + if (iter) + printf(" included from: '%s:%d'\n", + iter->name, iter->lineno+1); + exit(1); + } + } + file->lineno = 1; + file->parent = current_file; + current_file = file; +} + +static void zconf_endfile(void) +{ + struct buffer *parent; + + current_file = current_file->parent; + + parent = current_buf->parent; + if (parent) { + fclose(zconfin); + zconf_delete_buffer(YY_CURRENT_BUFFER); + zconf_switch_to_buffer(parent->state); + } + free(current_buf); + current_buf = parent; +} + +int zconf_lineno(void) +{ + return current_pos.lineno; +} + +const char *zconf_curname(void) +{ + return current_pos.file ? current_pos.file->name : ""; +} + diff --git a/scripts/kconfig/zconf.tab.c b/scripts/kconfig/zconf.tab.c new file mode 100755 index 000000000000..a22b285d759f --- /dev/null +++ b/scripts/kconfig/zconf.tab.c @@ -0,0 +1,2471 @@ +/* A Bison parser, made by GNU Bison 3.0.4. */ + +/* Bison implementation for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "3.0.4" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + + +/* Substitute the variable and function names. */ +#define yyparse zconfparse +#define yylex zconflex +#define yyerror zconferror +#define yydebug zconfdebug +#define yynerrs zconfnerrs + +#define yylval zconflval +#define yychar zconfchar + +/* Copy the first part of user declarations. */ + + +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include +#include + +#include "lkc.h" + +#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) + +#define PRINTD 0x0001 +#define DEBUG_PARSE 0x0002 + +int cdebug = PRINTD; + +extern int zconflex(void); +static void zconfprint(const char *err, ...); +static void zconf_error(const char *err, ...); +static void zconferror(const char *err); +static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken); + +struct symbol *symbol_hash[SYMBOL_HASHSIZE]; + +static struct menu *current_menu, *current_entry; + + + + +# ifndef YY_NULLPTR +# if defined __cplusplus && 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + + +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 1 +#endif +#if YYDEBUG +extern int zconfdebug; +#endif + +/* Token type. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + T_MAINMENU = 258, + T_MENU = 259, + T_ENDMENU = 260, + T_SOURCE = 261, + T_CHOICE = 262, + T_ENDCHOICE = 263, + T_COMMENT = 264, + T_CONFIG = 265, + T_MENUCONFIG = 266, + T_HELP = 267, + T_HELPTEXT = 268, + T_IF = 269, + T_ENDIF = 270, + T_DEPENDS = 271, + T_OPTIONAL = 272, + T_PROMPT = 273, + T_TYPE = 274, + T_DEFAULT = 275, + T_SELECT = 276, + T_IMPLY = 277, + T_RANGE = 278, + T_VISIBLE = 279, + T_OPTION = 280, + T_ON = 281, + T_WORD = 282, + T_WORD_QUOTE = 283, + T_UNEQUAL = 284, + T_LESS = 285, + T_LESS_EQUAL = 286, + T_GREATER = 287, + T_GREATER_EQUAL = 288, + T_CLOSE_PAREN = 289, + T_OPEN_PAREN = 290, + T_EOL = 291, + T_OR = 292, + T_AND = 293, + T_EQUAL = 294, + T_NOT = 295 + }; +#endif + +/* Value type. */ +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED + +union YYSTYPE +{ + + + char *string; + struct file *file; + struct symbol *symbol; + struct expr *expr; + struct menu *menu; + const struct kconf_id *id; + + +}; + +typedef union YYSTYPE YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 +#endif + + +extern YYSTYPE zconflval; + +int zconfparse (void); + + + +/* Copy the second part of user declarations. */ + + +/* Include kconf_id.c here so it can see the token constants. */ +#include "kconf_id.c" + + + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#else +typedef signed char yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) +# endif +# endif +# ifndef YY_ +# define YY_(Msgid) Msgid +# endif +#endif + +#ifndef YY_ATTRIBUTE +# if (defined __GNUC__ \ + && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ + || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C +# define YY_ATTRIBUTE(Spec) __attribute__(Spec) +# else +# define YY_ATTRIBUTE(Spec) /* empty */ +# endif +#endif + +#ifndef YY_ATTRIBUTE_PURE +# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) +#endif + +#if !defined _Noreturn \ + && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) +# if defined _MSC_VER && 1200 <= _MSC_VER +# define _Noreturn __declspec (noreturn) +# else +# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(E) ((void) (E)) +#else +# define YYUSE(E) /* empty */ +#endif + +#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else +# define YY_INITIAL_VALUE(Value) Value +#endif +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS +# include /* INFRINGES ON USER NAME SPACE */ + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +# define YYCOPY_NEEDED 1 + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 11 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 301 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 41 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 50 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 124 +/* YYNSTATES -- Number of states. */ +#define YYNSTATES 204 + +/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned + by yylex, with out-of-bounds checking. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 295 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, without out-of-bounds checking. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40 +}; + +#if YYDEBUG + /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 109, 109, 109, 111, 111, 113, 115, 116, 117, + 118, 119, 120, 124, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 132, 133, 134, 135, 136, 137, 141, + 142, 148, 156, 162, 170, 180, 182, 183, 184, 185, + 186, 187, 190, 198, 204, 214, 220, 226, 232, 235, + 237, 248, 249, 254, 263, 268, 276, 279, 281, 282, + 283, 284, 285, 288, 294, 305, 311, 321, 323, 328, + 336, 344, 347, 349, 350, 351, 356, 363, 370, 375, + 383, 386, 388, 389, 390, 393, 401, 408, 415, 421, + 428, 430, 431, 432, 435, 443, 445, 446, 449, 456, + 458, 463, 464, 467, 468, 469, 473, 474, 477, 478, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 494, 495, 498, 499 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || 0 +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU", + "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG", + "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS", + "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT", "T_SELECT", "T_IMPLY", + "T_RANGE", "T_VISIBLE", "T_OPTION", "T_ON", "T_WORD", "T_WORD_QUOTE", + "T_UNEQUAL", "T_LESS", "T_LESS_EQUAL", "T_GREATER", "T_GREATER_EQUAL", + "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND", "T_EQUAL", + "T_NOT", "$accept", "input", "start", "stmt_list", "option_name", + "common_stmt", "option_error", "config_entry_start", "config_stmt", + "menuconfig_entry_start", "menuconfig_stmt", "config_option_list", + "config_option", "symbol_option", "symbol_option_list", + "symbol_option_arg", "choice", "choice_entry", "choice_end", + "choice_stmt", "choice_option_list", "choice_option", "choice_block", + "if_entry", "if_end", "if_stmt", "if_block", "mainmenu_stmt", "menu", + "menu_entry", "menu_end", "menu_stmt", "menu_block", "source_stmt", + "comment", "comment_stmt", "help_start", "help", "depends_list", + "depends", "visibility_list", "visible", "prompt_stmt_opt", "prompt", + "end", "nl", "if_expr", "expr", "symbol", "word_opt", YY_NULLPTR +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[NUM] -- (External) token number corresponding to the + (internal) symbol number NUM (which must be that of a token). */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295 +}; +# endif + +#define YYPACT_NINF -92 + +#define yypact_value_is_default(Yystate) \ + (!!((Yystate) == (-92))) + +#define YYTABLE_NINF -88 + +#define yytable_value_is_error(Yytable_value) \ + 0 + + /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +static const yytype_int16 yypact[] = +{ + 17, 41, -92, 15, -92, 150, -92, 19, -92, -92, + -13, -92, 28, 41, 38, 41, 50, 47, 41, 79, + 82, 44, 76, -92, -92, -92, -92, -92, -92, -92, + -92, -92, 118, -92, 129, -92, -92, -92, -92, -92, + -92, -92, -92, -92, -92, -92, -92, -92, -92, -92, + -92, -92, 184, -92, -92, 107, -92, 111, -92, 113, + -92, 116, -92, 139, 140, 151, -92, -92, 44, 44, + 142, 256, -92, 160, 173, 27, 117, 80, 51, 255, + -15, 255, 217, -92, -92, -92, -92, -92, -92, -8, + -92, 44, 44, 107, 87, 87, 87, 87, 87, 87, + -92, -92, 174, 176, 187, 41, 41, 44, 188, 189, + 87, -92, 213, -92, -92, -92, -92, 206, -92, -92, + 193, 41, 41, 203, -92, -92, -92, -92, -92, -92, + -92, -92, -92, -92, -92, -92, -92, 229, -92, 241, + -92, -92, -92, -92, -92, -92, -92, -92, -92, -92, + 216, -92, -92, -92, -92, -92, -92, -92, -92, -92, + 44, 229, 222, 229, 64, 229, 229, 87, 31, 231, + -92, -92, 229, 236, 229, 44, -92, 145, 242, -92, + -92, 243, 244, 245, 229, 251, -92, -92, 247, -92, + 257, 125, -92, -92, -92, -92, -92, 260, 41, -92, + -92, -92, -92, -92 +}; + + /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 6, 0, 106, 0, 3, 0, 6, 6, 101, 102, + 0, 1, 0, 0, 0, 0, 123, 0, 0, 0, + 0, 0, 0, 14, 19, 15, 16, 21, 17, 18, + 20, 22, 0, 23, 0, 7, 35, 26, 35, 27, + 57, 67, 8, 72, 24, 95, 81, 9, 28, 90, + 25, 10, 0, 107, 2, 76, 13, 0, 103, 0, + 124, 0, 104, 0, 0, 0, 121, 122, 0, 0, + 0, 110, 105, 0, 0, 0, 0, 0, 0, 0, + 90, 0, 0, 77, 85, 53, 86, 31, 33, 0, + 118, 0, 0, 69, 0, 0, 0, 0, 0, 0, + 11, 12, 0, 0, 0, 0, 99, 0, 0, 0, + 0, 49, 0, 41, 40, 36, 37, 0, 39, 38, + 0, 0, 99, 0, 61, 62, 58, 60, 59, 68, + 56, 55, 73, 75, 71, 74, 70, 108, 97, 0, + 96, 82, 84, 80, 83, 79, 92, 93, 91, 117, + 119, 120, 116, 111, 112, 113, 114, 115, 30, 88, + 0, 108, 0, 108, 108, 108, 108, 0, 0, 0, + 89, 65, 108, 0, 108, 0, 98, 0, 0, 42, + 100, 0, 0, 0, 108, 51, 48, 29, 0, 64, + 0, 109, 94, 43, 44, 45, 46, 0, 0, 50, + 63, 66, 47, 52 +}; + + /* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -92, -92, 285, 291, -92, 32, -66, -92, -92, -92, + -92, 261, -92, -92, -92, -92, -92, -92, -92, 1, + -92, -92, -92, -92, -92, -92, -92, -92, -92, -92, + -92, 24, -92, -92, -92, -92, -92, 221, 220, -64, + -92, -92, 179, -1, 67, 0, 110, -67, -91, -92 +}; + + /* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 3, 4, 5, 34, 35, 114, 36, 37, 38, + 39, 75, 115, 116, 168, 199, 40, 41, 130, 42, + 77, 126, 78, 43, 134, 44, 79, 6, 45, 46, + 143, 47, 81, 48, 49, 50, 117, 118, 82, 119, + 80, 140, 162, 163, 51, 7, 176, 70, 71, 61 +}; + + /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ +static const yytype_int16 yytable[] = +{ + 10, 89, 90, 152, 153, 154, 155, 156, 157, 137, + 55, 125, 57, 128, 59, 11, 147, 63, 148, 167, + 1, 138, 1, 2, 150, 151, 149, -32, 102, 91, + 92, -32, -32, -32, -32, -32, -32, -32, -32, 103, + 164, -32, -32, 104, -32, 105, 106, 107, 108, 109, + 110, -32, 111, 2, 112, 53, 14, 15, 185, 17, + 18, 19, 20, 113, 56, 21, 22, 186, 8, 9, + 93, 66, 67, 147, 58, 148, 184, 60, 175, 68, + 133, 102, 142, 62, 69, -54, -54, 33, -54, -54, + -54, -54, 103, 177, -54, -54, 104, 120, 121, 122, + 123, 91, 92, 135, 161, 144, 64, 112, 191, 65, + 129, 132, 72, 141, 66, 67, 124, -34, 102, 73, + 172, -34, -34, -34, -34, -34, -34, -34, -34, 103, + 74, -34, -34, 104, -34, 105, 106, 107, 108, 109, + 110, -34, 111, 53, 112, 131, 136, 83, 145, 84, + -5, 12, 85, 113, 13, 14, 15, 16, 17, 18, + 19, 20, 91, 92, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 86, 87, 32, 2, 91, + 92, 192, 91, 92, -4, 12, 33, 88, 13, 14, + 15, 16, 17, 18, 19, 20, 100, 203, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 101, + 158, 32, 159, 160, 169, 165, 166, -87, 102, 170, + 33, -87, -87, -87, -87, -87, -87, -87, -87, 171, + 174, -87, -87, 104, -87, -87, -87, -87, -87, -87, + -87, -87, 102, 175, 112, -78, -78, -78, -78, -78, + -78, -78, -78, 146, 92, -78, -78, 104, 179, 13, + 14, 15, 16, 17, 18, 19, 20, 187, 112, 21, + 22, 178, 189, 180, 181, 182, 183, 146, 193, 194, + 195, 196, 188, 200, 190, 94, 95, 96, 97, 98, + 198, 33, 54, 201, 197, 99, 202, 52, 127, 76, + 139, 173 +}; + +static const yytype_uint8 yycheck[] = +{ + 1, 68, 69, 94, 95, 96, 97, 98, 99, 24, + 10, 77, 13, 77, 15, 0, 82, 18, 82, 110, + 3, 36, 3, 36, 91, 92, 34, 0, 1, 37, + 38, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 107, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 36, 27, 36, 5, 6, 27, 8, + 9, 10, 11, 36, 36, 14, 15, 36, 27, 28, + 70, 27, 28, 139, 36, 139, 167, 27, 14, 35, + 79, 1, 81, 36, 40, 5, 6, 36, 8, 9, + 10, 11, 12, 160, 14, 15, 16, 17, 18, 19, + 20, 37, 38, 79, 105, 81, 27, 27, 175, 27, + 78, 79, 36, 81, 27, 28, 36, 0, 1, 1, + 121, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 1, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 36, 27, 78, 79, 36, 81, 36, + 0, 1, 36, 36, 4, 5, 6, 7, 8, 9, + 10, 11, 37, 38, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 36, 36, 27, 36, 37, + 38, 36, 37, 38, 0, 1, 36, 36, 4, 5, + 6, 7, 8, 9, 10, 11, 36, 198, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 36, + 36, 27, 36, 26, 1, 27, 27, 0, 1, 13, + 36, 4, 5, 6, 7, 8, 9, 10, 11, 36, + 27, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 1, 14, 27, 4, 5, 6, 7, 8, + 9, 10, 11, 36, 38, 14, 15, 16, 36, 4, + 5, 6, 7, 8, 9, 10, 11, 36, 27, 14, + 15, 161, 36, 163, 164, 165, 166, 36, 36, 36, + 36, 36, 172, 36, 174, 29, 30, 31, 32, 33, + 39, 36, 7, 36, 184, 39, 36, 6, 77, 38, + 80, 122 +}; + + /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 3, 36, 42, 43, 44, 68, 86, 27, 28, + 84, 0, 1, 4, 5, 6, 7, 8, 9, 10, + 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 27, 36, 45, 46, 48, 49, 50, 51, + 57, 58, 60, 64, 66, 69, 70, 72, 74, 75, + 76, 85, 44, 36, 43, 86, 36, 84, 36, 84, + 27, 90, 36, 84, 27, 27, 27, 28, 35, 40, + 88, 89, 36, 1, 1, 52, 52, 61, 63, 67, + 81, 73, 79, 36, 36, 36, 36, 36, 36, 88, + 88, 37, 38, 86, 29, 30, 31, 32, 33, 39, + 36, 36, 1, 12, 16, 18, 19, 20, 21, 22, + 23, 25, 27, 36, 47, 53, 54, 77, 78, 80, + 17, 18, 19, 20, 36, 47, 62, 78, 80, 46, + 59, 85, 46, 60, 65, 72, 85, 24, 36, 79, + 82, 46, 60, 71, 72, 85, 36, 47, 80, 34, + 88, 88, 89, 89, 89, 89, 89, 89, 36, 36, + 26, 84, 83, 84, 88, 27, 27, 89, 55, 1, + 13, 36, 84, 83, 27, 14, 87, 88, 87, 36, + 87, 87, 87, 87, 89, 27, 36, 36, 87, 36, + 87, 88, 36, 36, 36, 36, 36, 87, 39, 56, + 36, 36, 36, 84 +}; + + /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 41, 42, 42, 43, 43, 44, 44, 44, 44, + 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 46, 46, 46, 46, 46, 46, 47, + 47, 48, 49, 50, 51, 52, 52, 52, 52, 52, + 52, 52, 53, 53, 53, 53, 53, 53, 54, 55, + 55, 56, 56, 57, 58, 59, 60, 61, 61, 61, + 61, 61, 61, 62, 62, 62, 62, 63, 63, 64, + 65, 66, 67, 67, 67, 67, 68, 69, 70, 71, + 72, 73, 73, 73, 73, 74, 75, 76, 77, 78, + 79, 79, 79, 79, 80, 81, 81, 81, 82, 83, + 83, 84, 84, 85, 85, 85, 86, 86, 87, 87, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 89, 89, 90, 90 +}; + + /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 2, 1, 2, 1, 0, 2, 2, 2, + 2, 4, 4, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 2, 3, 2, 3, 2, 0, 2, 2, 2, 2, + 2, 2, 3, 4, 4, 4, 4, 5, 3, 0, + 3, 0, 2, 3, 2, 1, 3, 0, 2, 2, + 2, 2, 2, 4, 3, 2, 4, 0, 2, 3, + 1, 3, 0, 2, 2, 2, 3, 3, 3, 1, + 3, 0, 2, 2, 2, 3, 3, 2, 2, 2, + 0, 2, 2, 2, 4, 0, 2, 2, 2, 0, + 2, 1, 1, 2, 2, 2, 1, 2, 0, 2, + 1, 3, 3, 3, 3, 3, 3, 3, 2, 3, + 3, 1, 1, 0, 1 +}; + + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (0) + +/* Error token number */ +#define YYTERROR 1 +#define YYERRCODE 256 + + + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +/* This macro is provided for backward compatibility. */ +#ifndef YY_LOCATION_PRINT +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +#endif + + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*----------------------------------------. +| Print this symbol's value on YYOUTPUT. | +`----------------------------------------*/ + +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +{ + FILE *yyo = yyoutput; + YYUSE (yyo); + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + YYUSE (yytype); +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +{ + YYFPRINTF (yyoutput, "%s %s (", + yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +static void +yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule) +{ + unsigned long int yylno = yyrline[yyrule]; + int yynrhs = yyr2[yyrule]; + int yyi; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + yystos[yyssp[yyi + 1 - yynrhs]], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +yystrlen (const char *yystr) +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +yystpcpy (char *yydest, const char *yysrc) +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message + about the unexpected token YYTOKEN for the state stack whose top is + YYSSP. + + Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is + not large enough to hold the message. In that case, also set + *YYMSG_ALLOC to the required number of bytes. Return 2 if the + required number of bytes is too large to store. */ +static int +yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, + yytype_int16 *yyssp, int yytoken) +{ + YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); + YYSIZE_T yysize = yysize0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + /* Internationalized format string. */ + const char *yyformat = YY_NULLPTR; + /* Arguments of yyformat. */ + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + /* Number of reported tokens (one for the "unexpected", one per + "expected"). */ + int yycount = 0; + + /* There are many possibilities here to consider: + - If this state is a consistent state with a default action, then + the only way this function was invoked is if the default action + is an error action. In that case, don't check for expected + tokens because there are none. + - The only way there can be no lookahead present (in yychar) is if + this state is a consistent state with a default action. Thus, + detecting the absence of a lookahead is sufficient to determine + that there is no unexpected or expected token to report. In that + case, just report a simple "syntax error". + - Don't assume there isn't a lookahead just because this state is a + consistent state with a default action. There might have been a + previous inconsistent state, consistent state with a non-default + action, or user semantic action that manipulated yychar. + - Of course, the expected token list depends on states to have + correct lookahead information, and it depends on the parser not + to perform extra reductions after fetching a lookahead from the + scanner and before detecting a syntax error. Thus, state merging + (from LALR or IELR) and default reductions corrupt the expected + token list. However, the list is correct for canonical LR with + one exception: it will still contain any token that will not be + accepted due to an error action in a later state. + */ + if (yytoken != YYEMPTY) + { + int yyn = yypact[*yyssp]; + yyarg[yycount++] = yytname[yytoken]; + if (!yypact_value_is_default (yyn)) + { + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. In other words, skip the first -YYN actions for + this state because they are default actions. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yyx; + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR + && !yytable_value_is_error (yytable[yyx + yyn])) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + break; + } + yyarg[yycount++] = yytname[yyx]; + { + YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); + if (! (yysize <= yysize1 + && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + } + } + } + + switch (yycount) + { +# define YYCASE_(N, S) \ + case N: \ + yyformat = S; \ + break + YYCASE_(0, YY_("syntax error")); + YYCASE_(1, YY_("syntax error, unexpected %s")); + YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); + YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); + YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); + YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); +# undef YYCASE_ + } + + { + YYSIZE_T yysize1 = yysize + yystrlen (yyformat); + if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + + if (*yymsg_alloc < yysize) + { + *yymsg_alloc = 2 * yysize; + if (! (yysize <= *yymsg_alloc + && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) + *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; + return 1; + } + + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + { + char *yyp = *yymsg; + int yyi = 0; + while ((*yyp = *yyformat) != '\0') + if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyformat += 2; + } + else + { + yyp++; + yyformat++; + } + } + return 0; +} +#endif /* YYERROR_VERBOSE */ + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +{ + YYUSE (yyvaluep); + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + switch (yytype) + { + case 58: /* choice_entry */ + + { + fprintf(stderr, "%s:%d: missing end statement for this entry\n", + ((*yyvaluep).menu)->file->name, ((*yyvaluep).menu)->lineno); + if (current_menu == ((*yyvaluep).menu)) + menu_end_menu(); +} + + break; + + case 64: /* if_entry */ + + { + fprintf(stderr, "%s:%d: missing end statement for this entry\n", + ((*yyvaluep).menu)->file->name, ((*yyvaluep).menu)->lineno); + if (current_menu == ((*yyvaluep).menu)) + menu_end_menu(); +} + + break; + + case 70: /* menu_entry */ + + { + fprintf(stderr, "%s:%d: missing end statement for this entry\n", + ((*yyvaluep).menu)->file->name, ((*yyvaluep).menu)->lineno); + if (current_menu == ((*yyvaluep).menu)) + menu_end_menu(); +} + + break; + + + default: + break; + } + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; +/* Number of syntax errors so far. */ +int yynerrs; + + +/*----------. +| yyparse. | +`----------*/ + +int +yyparse (void) +{ + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + 'yyss': related to states. + 'yyvs': related to semantic values. + + Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yyssp = yyss = yyssa; + yyvsp = yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = yylex (); + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yytable_value_is_error (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + '$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 10: + + { zconf_error("unexpected end statement"); } + + break; + + case 11: + + { zconf_error("unknown statement \"%s\"", (yyvsp[-2].string)); } + + break; + + case 12: + + { + zconf_error("unexpected option \"%s\"", (yyvsp[-2].id)->name); +} + + break; + + case 13: + + { zconf_error("invalid statement"); } + + break; + + case 29: + + { zconf_error("unknown option \"%s\"", (yyvsp[-2].string)); } + + break; + + case 30: + + { zconf_error("invalid option"); } + + break; + + case 31: + + { + struct symbol *sym = sym_lookup((yyvsp[-1].string), 0); + sym->flags |= SYMBOL_OPTIONAL; + menu_add_entry(sym); + printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string)); +} + + break; + + case 32: + + { + menu_end_entry(); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +} + + break; + + case 33: + + { + struct symbol *sym = sym_lookup((yyvsp[-1].string), 0); + sym->flags |= SYMBOL_OPTIONAL; + menu_add_entry(sym); + printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string)); +} + + break; + + case 34: + + { + if (current_entry->prompt) + current_entry->prompt->type = P_MENU; + else + zconfprint("warning: menuconfig statement without prompt"); + menu_end_entry(); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +} + + break; + + case 42: + + { + menu_set_type((yyvsp[-2].id)->stype); + printd(DEBUG_PARSE, "%s:%d:type(%u)\n", + zconf_curname(), zconf_lineno(), + (yyvsp[-2].id)->stype); +} + + break; + + case 43: + + { + menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +} + + break; + + case 44: + + { + menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr)); + if ((yyvsp[-3].id)->stype != S_UNKNOWN) + menu_set_type((yyvsp[-3].id)->stype); + printd(DEBUG_PARSE, "%s:%d:default(%u)\n", + zconf_curname(), zconf_lineno(), + (yyvsp[-3].id)->stype); +} + + break; + + case 45: + + { + menu_add_symbol(P_SELECT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno()); +} + + break; + + case 46: + + { + menu_add_symbol(P_IMPLY, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:imply\n", zconf_curname(), zconf_lineno()); +} + + break; + + case 47: + + { + menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[-3].symbol), (yyvsp[-2].symbol)), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); +} + + break; + + case 50: + + { + const struct kconf_id *id = kconf_id_lookup((yyvsp[-1].string), strlen((yyvsp[-1].string))); + if (id && id->flags & TF_OPTION) + menu_add_option(id->token, (yyvsp[0].string)); + else + zconfprint("warning: ignoring unknown option %s", (yyvsp[-1].string)); + free((yyvsp[-1].string)); +} + + break; + + case 51: + + { (yyval.string) = NULL; } + + break; + + case 52: + + { (yyval.string) = (yyvsp[0].string); } + + break; + + case 53: + + { + struct symbol *sym = sym_lookup((yyvsp[-1].string), SYMBOL_CHOICE); + sym->flags |= SYMBOL_AUTO; + menu_add_entry(sym); + menu_add_expr(P_CHOICE, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); +} + + break; + + case 54: + + { + (yyval.menu) = menu_add_menu(); +} + + break; + + case 55: + + { + if (zconf_endtoken((yyvsp[0].id), T_CHOICE, T_ENDCHOICE)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno()); + } +} + + break; + + case 63: + + { + menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +} + + break; + + case 64: + + { + if ((yyvsp[-2].id)->stype == S_BOOLEAN || (yyvsp[-2].id)->stype == S_TRISTATE) { + menu_set_type((yyvsp[-2].id)->stype); + printd(DEBUG_PARSE, "%s:%d:type(%u)\n", + zconf_curname(), zconf_lineno(), + (yyvsp[-2].id)->stype); + } else + YYERROR; +} + + break; + + case 65: + + { + current_entry->sym->flags |= SYMBOL_OPTIONAL; + printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); +} + + break; + + case 66: + + { + if ((yyvsp[-3].id)->stype == S_UNKNOWN) { + menu_add_symbol(P_DEFAULT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:default\n", + zconf_curname(), zconf_lineno()); + } else + YYERROR; +} + + break; + + case 69: + + { + printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); + menu_add_entry(NULL); + menu_add_dep((yyvsp[-1].expr)); + (yyval.menu) = menu_add_menu(); +} + + break; + + case 70: + + { + if (zconf_endtoken((yyvsp[0].id), T_IF, T_ENDIF)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno()); + } +} + + break; + + case 76: + + { + menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL); +} + + break; + + case 77: + + { + menu_add_entry(NULL); + menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL); + printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno()); +} + + break; + + case 78: + + { + (yyval.menu) = menu_add_menu(); +} + + break; + + case 79: + + { + if (zconf_endtoken((yyvsp[0].id), T_MENU, T_ENDMENU)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno()); + } +} + + break; + + case 85: + + { + printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string)); + zconf_nextfile((yyvsp[-1].string)); +} + + break; + + case 86: + + { + menu_add_entry(NULL); + menu_add_prompt(P_COMMENT, (yyvsp[-1].string), NULL); + printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno()); +} + + break; + + case 87: + + { + menu_end_entry(); +} + + break; + + case 88: + + { + printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno()); + zconf_starthelp(); +} + + break; + + case 89: + + { + current_entry->help = (yyvsp[0].string); +} + + break; + + case 94: + + { + menu_add_dep((yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno()); +} + + break; + + case 98: + + { + menu_add_visibility((yyvsp[0].expr)); +} + + break; + + case 100: + + { + menu_add_prompt(P_PROMPT, (yyvsp[-1].string), (yyvsp[0].expr)); +} + + break; + + case 103: + + { (yyval.id) = (yyvsp[-1].id); } + + break; + + case 104: + + { (yyval.id) = (yyvsp[-1].id); } + + break; + + case 105: + + { (yyval.id) = (yyvsp[-1].id); } + + break; + + case 108: + + { (yyval.expr) = NULL; } + + break; + + case 109: + + { (yyval.expr) = (yyvsp[0].expr); } + + break; + + case 110: + + { (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); } + + break; + + case 111: + + { (yyval.expr) = expr_alloc_comp(E_LTH, (yyvsp[-2].symbol), (yyvsp[0].symbol)); } + + break; + + case 112: + + { (yyval.expr) = expr_alloc_comp(E_LEQ, (yyvsp[-2].symbol), (yyvsp[0].symbol)); } + + break; + + case 113: + + { (yyval.expr) = expr_alloc_comp(E_GTH, (yyvsp[-2].symbol), (yyvsp[0].symbol)); } + + break; + + case 114: + + { (yyval.expr) = expr_alloc_comp(E_GEQ, (yyvsp[-2].symbol), (yyvsp[0].symbol)); } + + break; + + case 115: + + { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); } + + break; + + case 116: + + { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); } + + break; + + case 117: + + { (yyval.expr) = (yyvsp[-1].expr); } + + break; + + case 118: + + { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); } + + break; + + case 119: + + { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[-2].expr), (yyvsp[0].expr)); } + + break; + + case 120: + + { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); } + + break; + + case 121: + + { (yyval.symbol) = sym_lookup((yyvsp[0].string), 0); free((yyvsp[0].string)); } + + break; + + case 122: + + { (yyval.symbol) = sym_lookup((yyvsp[0].string), SYMBOL_CONST); free((yyvsp[0].string)); } + + break; + + case 123: + + { (yyval.string) = NULL; } + + break; + + + + default: break; + } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + /* Now 'shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ +yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); + + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (YY_("syntax error")); +#else +# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ + yyssp, yytoken) + { + char const *yymsgp = YY_("syntax error"); + int yysyntax_error_status; + yysyntax_error_status = YYSYNTAX_ERROR; + if (yysyntax_error_status == 0) + yymsgp = yymsg; + else if (yysyntax_error_status == 1) + { + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); + if (!yymsg) + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + yysyntax_error_status = 2; + } + else + { + yysyntax_error_status = YYSYNTAX_ERROR; + yymsgp = yymsg; + } + } + yyerror (yymsgp); + if (yysyntax_error_status == 2) + goto yyexhaustedlab; + } +# undef YYSYNTAX_ERROR +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule whose action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#if !defined yyoverflow || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + } + /* Do not reclaim the symbols of the rule whose action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + return yyresult; +} + + + +void conf_parse(const char *name) +{ + struct symbol *sym; + int i; + + zconf_initscan(name); + + sym_init(); + _menu_init(); + rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL); + + if (getenv("ZCONF_DEBUG")) + zconfdebug = 1; + zconfparse(); + if (zconfnerrs) + exit(1); + if (!modules_sym) + modules_sym = sym_find( "n" ); + + rootmenu.prompt->text = _(rootmenu.prompt->text); + rootmenu.prompt->text = sym_expand_string_value(rootmenu.prompt->text); + + menu_finalize(&rootmenu); + for_all_symbols(i, sym) { + if (sym_check_deps(sym)) + zconfnerrs++; + } + if (zconfnerrs) + exit(1); + sym_set_change_count(1); +} + +static const char *zconf_tokenname(int token) +{ + switch (token) { + case T_MENU: return "menu"; + case T_ENDMENU: return "endmenu"; + case T_CHOICE: return "choice"; + case T_ENDCHOICE: return "endchoice"; + case T_IF: return "if"; + case T_ENDIF: return "endif"; + case T_DEPENDS: return "depends"; + case T_VISIBLE: return "visible"; + } + return ""; +} + +static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken) +{ + if (id->token != endtoken) { + zconf_error("unexpected '%s' within %s block", + id->name, zconf_tokenname(starttoken)); + zconfnerrs++; + return false; + } + if (current_menu->file != current_file) { + zconf_error("'%s' in different file than '%s'", + id->name, zconf_tokenname(starttoken)); + fprintf(stderr, "%s:%d: location of the '%s'\n", + current_menu->file->name, current_menu->lineno, + zconf_tokenname(starttoken)); + zconfnerrs++; + return false; + } + return true; +} + +static void zconfprint(const char *err, ...) +{ + va_list ap; + + fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); + va_start(ap, err); + vfprintf(stderr, err, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +static void zconf_error(const char *err, ...) +{ + va_list ap; + + zconfnerrs++; + fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); + va_start(ap, err); + vfprintf(stderr, err, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +static void zconferror(const char *err) +{ + fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err); +} + +static void print_quoted_string(FILE *out, const char *str) +{ + const char *p; + int len; + + putc('"', out); + while ((p = strchr(str, '"'))) { + len = p - str; + if (len) + fprintf(out, "%.*s", len, str); + fputs("\\\"", out); + str = p + 1; + } + fputs(str, out); + putc('"', out); +} + +static void print_symbol(FILE *out, struct menu *menu) +{ + struct symbol *sym = menu->sym; + struct property *prop; + + if (sym_is_choice(sym)) + fprintf(out, "\nchoice\n"); + else + fprintf(out, "\nconfig %s\n", sym->name); + switch (sym->type) { + case S_BOOLEAN: + fputs(" boolean\n", out); + break; + case S_TRISTATE: + fputs(" tristate\n", out); + break; + case S_STRING: + fputs(" string\n", out); + break; + case S_INT: + fputs(" integer\n", out); + break; + case S_HEX: + fputs(" hex\n", out); + break; + default: + fputs(" ???\n", out); + break; + } + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->menu != menu) + continue; + switch (prop->type) { + case P_PROMPT: + fputs(" prompt ", out); + print_quoted_string(out, prop->text); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_DEFAULT: + fputs( " default ", out); + expr_fprint(prop->expr, out); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_CHOICE: + fputs(" #choice value\n", out); + break; + case P_SELECT: + fputs( " select ", out); + expr_fprint(prop->expr, out); + fputc('\n', out); + break; + case P_IMPLY: + fputs( " imply ", out); + expr_fprint(prop->expr, out); + fputc('\n', out); + break; + case P_RANGE: + fputs( " range ", out); + expr_fprint(prop->expr, out); + fputc('\n', out); + break; + case P_MENU: + fputs( " menu ", out); + print_quoted_string(out, prop->text); + fputc('\n', out); + break; + default: + fprintf(out, " unknown prop %d!\n", prop->type); + break; + } + } + if (menu->help) { + int len = strlen(menu->help); + while (menu->help[--len] == '\n') + menu->help[len] = 0; + fprintf(out, " help\n%s\n", menu->help); + } +} + +void zconfdump(FILE *out) +{ + struct property *prop; + struct symbol *sym; + struct menu *menu; + + menu = rootmenu.list; + while (menu) { + if ((sym = menu->sym)) + print_symbol(out, menu); + else if ((prop = menu->prompt)) { + switch (prop->type) { + case P_COMMENT: + fputs("\ncomment ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + case P_MENU: + fputs("\nmenu ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + default: + ; + } + if (!expr_is_yes(prop->visible.expr)) { + fputs(" depends ", out); + expr_fprint(prop->visible.expr, out); + fputc('\n', out); + } + } + + if (menu->list) + menu = menu->list; + else if (menu->next) + menu = menu->next; + else while ((menu = menu->parent)) { + if (menu->prompt && menu->prompt->type == P_MENU) + fputs("\nendmenu\n", out); + if (menu->next) { + menu = menu->next; + break; + } + } + } +} + +#include "zconf.lex.c" +#include "util.c" +#include "confdata.c" +#include "expr.c" +#include "symbol.c" +#include "menu.c" diff --git a/scripts/kconfig/zconf.tab.o b/scripts/kconfig/zconf.tab.o new file mode 100755 index 0000000000000000000000000000000000000000..d080490c8fac73157008c526cd060fb2f38b3ad5 GIT binary patch literal 170400 zcmc$H349b)ws&_Dpn*U&0vZLR(N+@$NnB}znkF5nmJZ_JI=Ib58GJ^KPz|Uc!Ri)@ znx5g!8)x}u(Rs5xXWlH%jH9?gLLdpu=m2gAgCcHS6bNn*MCk8-&b`%Dodm^s-+YhX zkMylucRBamv)yygy|uV5F}cX^_c{OkzDs=WlauT7-TY8d{-K6bHNGJzc~$h9=+)7y zqF2sPm+USN_8p5GZ|qf<98%8k`IM!j(1YsVhUXxjSJEF< zsojEVKTqO}(w3s=w8h@Y`zZJH@K;hH7fz8k85sGO_UVc%(xMB#a#AT$UMoEA^G|@5y7J z9s{113BRS9F*KSfsq+lx!A*ciMQ=5#NnILa!})rPfa<7zWT292mW3)4Mq@Y>Z+Kr> z{o`@ejeh7CN@_YVYcf*xt|Q5^eEm4`vOh;vgI{9w-}*M{M4zK6y!Z^%nm@p3i78J! z%1y}$OQrFon*6kiUOY{Is#36USw4_9#ZN_wX%lQzbTtZJ67qerd;e8?)RE0CAR zt9d>ZSv>%MxIz0QmmKPb&%esU8Od>2ps*19#;YwU!r1Py;-tWwoh|6K}p{OATqW4^{%^>r8|eC z5Ve^LGeYVy?_Jj4kUQ&aWps)flJm8SDB&skqeeQlp{v}9>8CvL7?-1w94zMMv_yJ6 zfvKc_idQ;Ms$b5O92QRs=v*sN&FMjN5H+E<`guyCj2$^E_KoQlYU}=*)l`P-Wxqes ziz&O>O9e6GLs^wcGJVJ4T+Ygt0YzY{(i6R7Q%2Wd!r!t-sNHAV9e=!`T~$_plllgO z9?UH)YkrE-{-hF9o_xGNrDtJ!7cWjk_9&@wC(x8IMi^ez*qXJfscKsns3Cbo)z=-7 zGot-m6$9sztEj1`Y2KLL;%IH@EkHN~NK{#Uf_I2=d~v;_C?456Z-+IJCPvVUYSaeM zS%73yF&cBID|Pp_wt(iq>fZO~ z9?In~DRB%3aEuKz7^}cLf+o4wmry5ev~>9TBHKzr0jgAEWUqz)%PCBxX#F12l&6o{ zcIL>uv0P1WQ&K+y*lHRq^lc;(ka|Ht(i;FX&}N5^B#>%c8&Hken1pp8nFOR)(7F<} zFy`fD=H0Ga;8I_yr{Di9~?th2gGMDCf(59gTtHo7Fpl zt8bJ}6`WvJ8hdEhQVZ}JCf zMq!<(8n1&q|1b_Jk_uGq$5ZQA&sg>_>@Km6aK>^15)QeSgqJJ`^aHIc>4~5Xr(5$1 zRjnq{ME)p{uxemZ>2(y-%}wTc;zZ!si?U}Oo>+;5Gx-@cryukyOIL6stZr485Nc79 z2!XkX`LGv4c#Z%#3LO*)>7&Hn*Sq|JViHQ-I)@@ITTdg{S`UiY!o(R1XY~a^pOX3* zBLA|?$WN&4djEb>bBT&i9EqJ?kFmuo{y}QPXI*&^tO@zhwVGH7!lG(()q3j^U_&4? zkCAs6kuKs_@iU0%X(Yagxeox_%-sFZiS+|85X%v}mPM0DhZwD@St%Zeh@UZTiK-TW z2dJ_ePeUU!0SXt%XFo;RF=Ts48qD#X(`j5p&;D-o{53%J|An64IMYMHXLUnl7PH0N z_%;%SpudU{^$z;4z^eaWKo5ICZ(>k^VSq(~B<6r#<9T7$g!tu3%ymaikR|k5q#fpD zT|}}97OpS*cDdlEEQBdFxrwpUotK_LF7eW1{Ps(U)0UjxRnnV89ncPP`8pbO028vb zAxr=fd_=1xOUG1rX3sZ}X3IsvY|t{#-YrOomZC}!tf*8#ZSH(b~tZwq1WIpN&iTNevyDMNwx@2pB`8=S1@Q@A>z|{_jU&(_QhYbROUcv(XUXYCg zhF73JNE35(fv$Gz=CFgugGdMrrcwB@tz0n2<*jbAx6Ff5-n4Wd*U7KD`BJBLC^X|Z!go% zjhjEE#^5&KMkCqedsrAl$-}PVoODa_<>>wgsZfcMeiry;nU3W$OxoF}5|HSPi?ZQN z)~+fnvW1u>pea9V8V2U&O!7MLti_QKGb{;dFcVS@Og(2Jy@WKMDCOvclw)EbBnlbW z&d<<;YbbGall5aTB+oJE6bZ60cUdb@M}XFi4ck%rU&MxF;W8UOwZ_AS<=uwW#cYOQ zeT;--HuGdSI5uZjX1~`;V{T*nx|Z-s7Wain^d|T|1Y#Wndp3rDEr_bkDn;opqV|=j z$+!b7KKuGFDsDK%(X`JV_eI6O>J%qlpqYuo_6LDlCou&HdxWibd!%EYh{r(%kD%BK zM&xb)?{q5aTU2xQ%w{k=T@N`Dbd4?1kRCFc>M^@VP5F5bhJjikCmTX?FmKp zf6#?cEQB>uWY?bJneYo4JeQ7x{EP`NMWWEK+A*5&Lh>NbY&pmeNeH4>s22_Xj;5e} z5|7qoJDc0F)}e5Z%*Ut&V|(1Vvz$5G`YmVJ&Wg(+GvnIIe6NPvE332Fm|$k{Taf6{ z!?a$ymB_Sy1(bBJ;2@e;K{P$w$3#*FVs#*#X!P3k*|mEg+-#8|>{>4XHX|Ce&Mkyd ztjDPvd$7SzQ=4@R$yXRv}7bDI!9 z*69!ep6L*HCd;FHrkoy!T&+Er$*9St;^ukb?933*b_rHjnEN~duR$S)u)#2WnPK{P znx-{S)>MPsuU+G<`%Sm5%W}Q9u+M2h0%_NKx)4pD*CXeY9y!AO<>BN!Ns=ETzn*Lc zU>v8^zHA~{%vi70H8!*Fd&8-vl_%^6D@ zA|bW9Bs~8#8cIl6J=8k}2itvR84&G(>0j-^kD zD7hnGT@U|mlr3A(2=>#&a?ROhNPaC(xjN<>?sctv)(SY|>k2&V31eq=DMTOkNV>?m z4s0g3s$#!u9qo7RW$6dswz_03ZTQWMULU<7dSmpa8`^r=$KdH_ip*A_RR@IBB6hJ4 zBFgKHLTC<8Nf`F$P)5X__ht{mpiP5xIoh`3+yR>*5|s=E>FY1rBZ=}j>W#zJ)1YJQ zM)Drf@4M49+(}+%Z}2S#`aMS$~ZMU<$_UBP{AF!q7 zpV9?S|3Oc3k(yqwK_svp0*>5-5hu&Du}M^bn_uOtfdk?r&fp1f3L7Px%%+fWKKe%4 zyozvqmS!n-E&9tP!g3!e8``VgBliZE^K*1rKLJL{FN+G%;6?5({HkQw8s8a8tER`?;$RF+-> zH+?SrJmtoW#&Bsu3|;`VtjP1B_`nyHk?eU`9wTk{SWk8+=W5$}QoY>EdDo>P5Tvl=kHpBgy zk`p3Z7Ve>eB>+i?uuzmd%eCI39d#iZm9+wc#-5cwhTY6kC3P(twmu{yv;pcS`Yc#0 z7q41dUwms>UHWb1+bd9q##E*r*hs&XaQi2en1v3)82z&_9pmN=aQD=eshLs~ZC6|0 zFIN5S*w<7p{~&H8%T!2ZXSp0V>acMDpNL5nD_)Odm%!hdCqpmICd{#$>djlr62-TK zE8|8xz`6ecQZHrL>t_~&(G*?snGfUYprQHV4Qr#T=rN&8+b20f6qM}aa1K%X-GPMv zeTokFkc$W!Nw?f{O+Bcu8Y}mYAOt#q7(zT#t!&Dh_QH$Z4%zIxJ)2$dTgk#+N;T?2 zRolSAQRwcVPaA?cnuzJ}Jwt!0TI>p^d3^1h_EOgpSF7a_~ z^DBX35W4z<_L3sxl&nvfH$#Cip2UU#U*8nty-A5~xDj~bh!`p#mI>&JR-pz8k+zy#y1JNs1S&`I?^C0JUGY8UNOhLm0e_6x-$ zpC;d_kF?bz=!CdbNzK9768`pj|5_`KBuTuD*j!N?tc3p^Ddz-LLTD)8?8GEOJu|B9 z)6Mh#f@iQ~J9uin>TiMkT*f&-iW=Fa=s)4turbfUccGQ6^?y>_B?Gqxzrk4iw{P z8HyeYP`l=i?Fkf=5ac)zS(+Azgwhh)hM*XSrllznQ&u?)|2f75TZhs{vtH@S<%Faq zUbH&!sG6+FlvVW<-lC+gfs0H?pUfP8HLGDI^A?F+!5!8BC>qfQi5yEu8gDZcxqn0X1_c?B3mTn-UG9XmknlnzDFiEVLHZ6q%9df{Kgc`k~yy zvF`F?)(Yi`+8o~Gmet`0>fDr#MLwGUHnmW(U2S+i?*Cg%@P5p=CPbn<9{E^#U>CXm z{OjwM#ln~q0p46al2yp8T3@xtn(4l!x?*-SSNP@DZf2wlrd8vP5$he8UW`yVP8EouIi(48##_!6 z7#k2i4w)h0vql0&NI3m1M_ncw4mojMP`PsKF=4gkF|RftcK1p#rav5A7v^0fMmAh7EY|S<2@@*HPFIkBV?js6h8X#r__^ z_48TJd`!S?Jtp9ovmqXq*Mn*|FDng7bG_jO2CoTCfmKws;uWHqSt~M&0{VMhu)doo z2Kp1|~$(i06IIe5sE4$C@Yt7tJZ6-M?)>gtgE zry3J0<-SD22kj-5zF1~am+@EqFznpJ_kSD3BbyfeSn`d%R$mv?-*IL*(eR1eSzBR$ zf`JHLwc()Ze`_u5(1N4D-V~*Ja5b3 zWkDfhPSDXi=XDxahpgjKaOD_?5bHWholL3ADK(l>bx6sTV@#~2>Ki`BY7*32<|?2S zkWppolEW(Sp^a0`pU_a8bwV_E$B1XlKLZ(2|@5!5C*KDqtBJ65v)I?RG3oVrWE-~tu&=Vl)4Y8gg&Guv<@QuKkn+-6av|4a(=9xNIOU* zDNw|k2zw?+@M7gD_+!mO)=CO3w#YfZl5~;vbxMt*6fGcoOg3hEaKZeZdu;Q&KTXpM z<8=sHjc4xn^UO2bJb)bXl1r}PxNc|hHmSYjT)bp0wDKf^Y7PGU^VpOKA@+4}Bf51t zd}S$hGZTNj+=^gEm9l8n;EF{@7yZ*ZPA;TYj-Wo@BeFkQ2mhR!lH@GfUyAm-`^_D< ztN~q*=f!QNzH1`z-ELHC{7M7K^z8IUL;LLufP**y7E-U5R<2n@{}%sdz_SfJjc1+K_+Ol21L6PyH4t zIZENzEc6n(u0LgTGqp*_CN|<%H4dd(v9B)1$_IHJ#JGj(7@Xl>!6)rs(o1 z{uE>j3EU+gtozBxCAYoyAATS5v{U1m%ZntwlvORt6GN)D+_r^Y!g%o;8&jK;S!2sn zS2d}dRpk$zYO6Kww$@Kh_xUQ??9#fbT-7#v`ZIKX1%BM^0LW(#dUS}AA}z5(HSd60 z+oNI8vi>_^orT1ws+l!sU9&w{%^`ofm3ZC!diFS7=O4NtY zrXc>qU(n2xHl(>3uaN^cLSgu*+R^+7UeUjVu^@o3F-pdarbg8)VNg{AI>iuRtJsUy z*9K+^XS;sz9&NaO@J{Un{oox+x)VO<=cu;5Mf_|MKUn**%K3b1gtIV3l|hfjp@N-F ztx@c1(uk(xe+~Xu;(zFW9{L(|LtkfFf5!aGY&$k!^QS4We<7p|q`%gOeAaEevDKCz zk9h4qduWl*d;E*}&*2gQMsGV1|60adVPO0CVw%`|gswIn6dms+CihDRXIra(!dv_v zoUTxfO;ww%s~>jG)42N^)8ob~apOSL_$(p(9&z)IvenZ8n#)Fu2~eXgPjSRFd4h`> zH$zb%f<{icQClNYMy*OLd=hNMCgKsn(#eliqfB;{Fm8uXybs5y4rI3iXq@T@sU5Wx zi4QeNES2BG`jQk_I6l?*2;*ZR-!07lFX#zkql4lo(fzf7qa$HCm-r`A7NM>BmqPx$t42 z3>4mne;^7*%UJ}Kmys7AhoS;30AZsnXV04`inV|=6s-S7Lm*GNY)zPR%c4uBHTocs z<^1N zvtXA)h6COjutyWN3J$o+SR2HW5^Fyg^f+SX0s!6O28#DH%6vh1Ra_DOz$l^FmjXAhrERNmgrg;@^W3*jWJ7pGgy8{+%~ z3a}?&ccXJkOvJd-;3gA8M4PL}E2&RGg*@M`aDNY3apP^C#)R=6ZQ&TN z$wh;cDN0M^(o*v|RKodOv1fg0n30*Cf2uoC02AjGC7A51&>G2=b2g41jjA?8{yk?U-B!tm4eY{a`V6 z;lNTS@*p(`&Thj7Qnyx^YQ^Ln3oof+y+vFpyA{kUhS(&B7&oVhfG-KE+li~drWcT^ zc8TOR(LO-_G9iiA{*(MeHnDWm)SLI0*JG7%R9+4_yu1K{fg^p1mk-5_8_U^l|FR&k zJx;S#U{7eJt|4)ZMzdT$T?O%U6x}>X=w_BR$EukTzw)ou_tZY(^bO}2S8}9&crqdb zfD!$0jgoqR6BlWVggKGU2^(9fd)2EIB!S6EMD#JQ5@gZDMzvvGxAVB&Pp?YSXJ&B^ zu@fliq&Lv07!0hcrW+iV=R#p{R2M7huTX^^`opS5_N)~&+$Fo0VaBunjz2OWD0zVl z22zdp7!+nt9P;|zK6sRCg48%2TvRiUhY2H)nAsv7zaBp9HOXwrN8mU#{-^&zbs1Fd zK@1yQJ3!PXLd^DGh5aDbxCm5wnR=5?$${SfqXjg>L2ADv`ze%< zBfya*`dx?8b`biDoR#qaKIZY6Yf|jW|2or6^e2jAqNTdpry9ngc0deo*xpH5DJVviKA_hO%Ul3Xg_UH zA@c5w8}CX52OFxV))NxkAqhaD77D$u$X8N7V~iJ^LH#r29q_Z!95@mjMuI!j3Kuk*6S{Cy(c}3Nz$Ld_jI^rl++I} z$hdJtS=A2+`f7CfG=B;)0^dgN`RpueVQ0~L?euu&>LOQvD60^8a8gz4ZLPvzw8n3| zmfDug8m&)Df6*ocl8n1;1N)0Q?LI4oqiEzhwCqFdw4kq1v~fc2p}o#_66X4?{k4t$ zk^q;!a@5iDeu`{exDmCtbsEVWM7qWrCo^% z;vHvfqCdnX_!F5VoNNbg(r{ryP5#s)!Oe zZiTXHv+~4=RcmfrllS*+Eu6m%?C)DI<`25f9^wKtYlWQ7u{@p8=XfF%x4;VNEKpK( zUd{0V?sE35G0Cs*ufrs7u_I!>FsE7t&F&~}iza(?A>4dpf#|3Y|ELI=y>%k?OY4F< zoyzpjr+7m`KBO(qz2ho^2RPwRV)=71ftWoX<)vuS7ld$i3+1xXLR?+e?w^3~M65@g zeLOm|FG6!+$vakI+`ktW(@cO*z^_&}h6BojyAdOdnN|%!6TDf17uHJ@J1n67t^ECk zpa@77qD$9BVi7FIC_udT1L?a})i|6m=fiNlsSGP3xvxnOBl=w&=F7i+u!J5KgsjC#K>qub)RMl$82dm1jz3c@p0!h?w1j#t zqj-_5eoxQ`|L%++mI~X9D}webJr`zRH|oz==Nel!0@m-Sv`6RLuQxBiND}5PaEl{Y z5*EoCYzM~8`zy0c{*5YQGiq=4f*X;<#Vd$TtSy13-kRafWCn6r@4|fYF?U|!jx98W>D2j@5bvm&y+pC0Vrcq!@e9^(89Ff|NG4( zf3Q6SvE#O8PT4n2SGy;`I?NJR!N8&fSEvm)%BagLoi_4quN43YJ4h zS{0^(5O-;Bh}#M$Mvt>EggC6@fdU-4BJ2&ursG{S4afzEBH+L?)I~mtxR{im2?HAf zyRv=0p2rtWGw?;z`tVHzD(;au8oowh%qW5G2w^maP4DUp^9tCZvoV$A6QO=^XzWqKB-Y<$y`kYn_?NK2cPW;7dU7UuLg!;a zj=fd-DJnTc2hSANEog$b$1g?yz13*s8f17R;E^SV5o%aNdV`h}cfC2US7=W|Gl0o) zS5e=4v;8Hs6M&qaeKQFuDLdeRO#Vc1YYDt8dy=L0xm*Nkt)gdjZ1ZzX2XwheVmlNG6@e&% ziT2XHXl2>I%tjzTI;%x3%%RAvyv^rJwIqKm)>+10fuG+Xm-(9vn;UNRAnDfbatxB^ za=L0{eyvB|F+V0DP$hn7>H<(8XiXt$(SsSOiK02}LU^$o3q@GEJbbMvKS9kbq@4ZP z=dMEzraYLPAyX6B`dkmn)-N5H{F-Xs706zQcdU%n$T}rO2W;$ml2)UUZ{Mzpo=6W3 zf_))oVHO9E3gu&)@gQ{2+s4$OHI3s{bJ@263easIm)(jKHMSYQkdSn`G(pM*)?gH3 z1RJu3Ki*M7wjayxvbcHI0#-movzVpNJ0bWuNVJ14OaPv+lj3+Na6&L{+_Zp+-u9SB zw7*8{D<#zgGKb?sNmZkAbpMn_gfCapWSg}l*OU}(#hYs5{??F^K7n3{NDF;^$WR+q z{l1VdIg}Scuqv<|Nzv+*>YB5g?7^;rlJ=N(slF&!l0=v-gSrL#d>E!t~% z>rcMOj^fCIGHt!5+|wv$uZ-%8gGIEwt1TmmtE9J}A--FO&e(6x#&CEpZcb@>iaP*@ zjsS_pKvWBYeY8^Pa{sVuJyrnl!0WA*d3*YKnu?4{Y@Pg|HvvP@Q;ts^JZMgZjiX{M z+ss{=wWQ0G)XzaRcn1x-UK^_yk8JjsM8x18^{bHMF40(PjE+JeI_8dor$Epw_4vtEw3h+9VGYFKCz1+XKQ#p zw(yKwLo6Dl<-?okxO9pJ5V>JOat~RcHCGXZ-ijf%XfHqj5;ga#e@^!Fx&YebW@wYO z_K%p}J_6xI%_)tufV5>4AWJjr)A~LdOrB_;&GQatGU(%+C8FS?LG6S%4oiUG1o?>9 zL-9Ip-qgg@yaxn|Qy}QQ9mVNa-H545T|-@$x3n? z;Dc#@7^eJuoRqJv)F%wohQ`fn0-m-{MceXS@;6KY%q39kRuFAF_A0bKlVn_p;c6`G z-4JP-L4D^D{nG)-Aw==^AeTT^;G~dwO%QHh{nH{v{}x6B3NBV2h_P2{x`4o1jC?`g zE~s-H=Ax0OnH@nG2z-MJI&;Ngv^V#wc*HSB`KUaw7t@Q#{4_~JIwL@0>aX)i$SbM8 zAkTUMe_Y^b{oV}=qtK7_sBGo|Pctdm%$>-ym(i#$59+Ol`JSl-$n!vP8&^*bb0CO| zs_83`->tjfKY;Ec$Y1Ge#*7b~(iknCnJ%rNL{Rd>k+9n3o%U+k~(_!F?+ zLU;{W=g~ki@@rp+#!O-Dk3vGP0rZasmGm4u4+`KF;f1C%v5>_^wD}v22doH}#^Ees zC)XQChMbF zo@Lxe@;#EN1vCGZd)=9*8sBil&na$;WDj6t6x|GJ{#ql=5v##nG}hVC{gWF*Sfdki zXb)T1vu3yXjOX!rDGM`f-rZhFXKX1N_cy2uCk%SXY0cS|dzgxnh|RhK{p?A;ZOw*Q zquF1Ag1Eaf(p9g-4p?)=d{~#^Z6Y!^sKJjyW=rzJ0=_vNRQWVWTKLSYS)ibLxnU`-BFK4LIC^V%`q-#GYiIdMx#tqWfdv#!Br15*1A-lk9^iW%~>u0;b{mRx}!B})~l=@AbkN6CdR|zP&^(;3tnAN z_=*jy>tJ7z{qSFSM~lctV(pFG=*9TU9DfME-oEK_+CY7}WhE7WQ>i6k*5jGZZFVwT z7TpTn3(!tQE`-wU@Me)?E6P~VyZVbu$4b{x!=z7u608|;PNXC(8h(^tFl1i}A{$5S zxfWT(Kw?zo%WmV-9gvPX7JI^%t|INV{OpKb)WHd}A;@i6?c_;AIAlfMS)At@|4B3WCze6d}rh z37PDhh%5+b_lOosdiHc*$gUSJ$*}L%{0M6pq@j3CL$T$>l6^#0j~T)ShZms7ZwBZz zJIR8si#`M_kmsK*Q z#Z&+ug`Bp_nKHO0B}rO3niHVX#CIE2ylGG;!s-*vf6S}ij@B*A3e@^F;;r4~hd|Rt<>`3hmGQX3riC%kqJ~}tP{b;I07JS#F=fY zsip4qaj=OxakjWgt$Q{UQHfq=>GX-0V#R*MjOoTFgzy?FLgkq4wo?M`u7<;^v7ihm zwu@w+aEcLIK8N?fX-6%c1QPYk@{ZaN9(=Q+9S{WwF%5Rqj-}Tfwb;Qyd-6yWb{X!J z@$qV8MiXs^TfSTv^6=O&I5P)K1_*n!`TCfh3GRW|e=Yn&-Wznir_TOS=5HWt{6G ziW=#O*T7V>iuw#nguql$mgbV^6;T`e7bx;d%hX<2g`TSv>pF1Mqv&eeFgcP z#|PXu5+C9$=w)Ac7F1M~wd8ElYVSBe2o)|`!wRSWOhPS&iX|XoE+O6C|I&z^>Cu1s zk)k=nSqtWx7hZV8mkdm5URa&;X*j-vBi;K%=v+5>P2!AJ;d}yk?U|lu%jl- z#3R&$acxNDWdVuGxG}jr-Z6Osz0aQGUgzN82?IKZ29$_=s2Mb>@Ucu`!Z@!pYF;gm zv&GG;yNR9N>B>6IG0(CKKt;~{v3#Y^=|I4;{N?k2ZEEXVp*SfZ9|`8Te|x<3aLC#4 zr-`^4nu#vI85}cq!jF?TBl2Tc{ae)5t`H92_w$kJMS`L?Q1bokd|Gy+krBWh;VJKU zl3Mgtph_r@=aF)mm*S!5^FN5kj~WN!#%IyYl%hn#J}3Nu+MEQHT9?idV4t$NA#MYR zH+0PEz|m?l841{rNnfD&C<%gBeu}QYk_SRX%E6bQc9;Go`GdB|iYDQ~G@XC`qVhuT zdfJm2`S!X!cWQcTzeQuHu_jv9#P zg5|x;R2nR$1)UgAUlDZ4LOov1$cNMNA6H5l{XNe+Wx0QU@Ctbuk{s13O{m)uq`oq|S{SR1^XY(k;}HnH+`#!*#!V1ECLU3oI#3!Wno ziIU>ulX^=N`4`Dw*x&X4zL579!jZx5M(vq|Nihc^+6nd9@kHCwPWOn|z$hgI1;CFAgdHp=S0GvGJ z*Fiuv6QW?`G?5$}E}sb*+JO9iWJ`fLg7r7bS5kQ;kET9^CVaUEE#f_yDFu2H$K>df zMjgd9=uK`Sl96R>ImSS8ml$dNDon%0SRv)KK8z9OgJL#G2tL?1*E>ogZtMr&A^Hn; zoDh2;Plqw${Vo`Ii)GuBY#3Vk$E=EPFUm3RrGB-M~onJ zr*Qm2y3}VTmf(|2K)@vu0WuJj5HJ}CxP+p+MS}u)h|HrwI;S=S|H4T2(8!Aasl1d6 z(Y*frBKoE1^%cO2AoCmZDI{o>t)0i>LNFZV2@Y_@g|U;_li7&L33d7i5rYuhC2Of| zuSRm`I{;}1VwZZYTWlwkcXWA9?#J_Ydd}g zg)r9BEntJTdzADnbSoS(naljn zdOp8gLMSNQ?d*7GpZi9Mttj0QBV0uN;5>ml9TFN2@=yDNE(ieocy~%2|MGUc#Kv4n z@_m?Tq3m!}#MHb=dursI+`_sH`-$0V7`{9z9yt>g_#{~;BJRg)zb_o}!(5EH1~lQS zFwS;FDH_1#f;9Jr{A`lv_ywa{qPYV)^4}0~YG2NW_Hu!4)1styBkRjx867``Dij@t zu$NIZy{=J8yywUD23GXNx7}Pf#n+u;vB0;uLYR(KQa?chM%$9N7GpH^4WD4^4ci63z2T6dISbGlDCy~1xL{W@_*t7-G9tFN}# ztZ$6c0dmo0*N=nnI7~5RWn2T7_Gy|9ucYZNIN-R*Lxp^DfY+6)L_luMp+AEu7JqYBv?LYDiIN3;`?1_F)lr-d29bV*;<@)V;so^|Ar z=*wgCkuXGYtclkl=%>`Dq)x&T8K6L3e)}0}yA3v!FWC>a4)Jj;-Oxz)BhSqr2=9;X zoc$?C(%*o(y-%x+~Rem}aauw!M-UhRt4}c)r6nCxe!9qO)^9;@z|+J#lEXa2iAp}} z6a1Zcr;?h2d7gNWlKvFWo-*VxvNj{1Dbh8~hfh(`(~u%Q zmwF_>w$i3Rhqw^0XkO$y1s6i2w8Qu$!H`B+rNjBM4Pn-@4sS_zFwGL#;HEWln_Bk* zutLoAg+EE)Lkl^$K)ZQd$n#cK1n%?R)i`&;L~o)CSD$nKgbhkcqn_Uc^mJ!V>K&j4 zH|QW{1qs%RxKu|;)c}!RqO<;h46e}WR9Ih7;ZX#H7gTs36@)A>8LKV=Vdg!*Kc@Oa z$-%g?^bUIK$5bTWgLooK#O_CToYPmXX$f>B+ju#J*J%~b;sG1#YU`UNP&fn2WBnT% zK^`F<9Ztx>EoR^5#q)#6u|9P`wPpivJWA`vd}&hbYgUdt0Nm7sVjibbd3n$~wp5}C1QVZ4=Q?5s+%QO|&l zn!FSjTaT|SN?zy{$@9<+HeSa@$4qIoM{x;Xq0qh(CE~{QiuGNm(W zB*s@-UxmiWZM0_KFKrv~2q^5gB|8e$_@pi8A%nj9W1YzbaTv)yUKo4!7}nXynFLLn zBXuICQ{tqq>TTF6u!+gy&3j94!1+euJNN%x_yHY zpbKEOu#qXkyUEVD7gn@+VP-PS`~k|+cR{*RYO?!p5M(V9!7Q#+MWU91H{q(MnE9#L zvm$AFGWZNJt4b=w34anU?u)6H>_!lrXGOp&-SH^J_Su8^igD{~R72!l8Cs`UP}zD^ zw*Ct95?bHF3C|I>IlZ+mrb3Bz*(IP3YBPXK4D=&?lJIdLMueiTZ>Hck_Ltp+9UfR4 z)NvE&ksRCEsmO!Nsv0Q0P(NI(H6TDmLr_ZsOK)>nm~5KVH3SQtt0Spa)q>!%$R_3C zmKx>9?G^j%fiRPawFn0>^VBHf>ORvCLM8ndGURsz=*o5FyKVk$)_635QkZUi#}P#P zD(U{n@ibwt;+Z%X0-9jOT$EF?4Mzi}Y`6BIO@2SreIIb%Pugy6bl!gik--SBXydq% zD&b|bM|17dK&FhWYeUvgP({9t8SjFI@$9pfaxS2L2vFM#TeBwvUZc&P!$bKgWqyN` z4^#4byg#r}-%*4T)5V-yBLJ361}VvNWnJecry&U=7r6X>i@wEYt)^!ICOlw#^9sYl zXJK)_4|_Pl6#47ANWL%Gy#OE=9LqZXOdG-f;@h|rI zJpUr!7jZ})wQ*N!8ctS_x?-OW4$jjxEx_*^Rr}dXntcaf(xH<>LeS7zBJ5xEm-pA* z(1rj?xqjoLsdD{xmuij_>o-Kv-v{9^S9~xWa}|&Sf`6FL`**tM{Rg0Nv$pZq!JyBV z-0^E#VJ7?kn)b<(8|;mo&|35M{rq2I1zuenO8(w{98e7M_K)yF*?-Ub1*icm6Ze@@ z8;uQ1c81W)5@=TRwOyDZ182-m_FwX5E_WnnOm$X`tuzKwr00VMaTMy0OBxy%ql6rd z{WCGSRV@Pt5i*sBT0~?1jWSS1zTbmQSOlPe--JyAE^nEzMoIlQa&nujU*JdjvpoJ7 zefMlA5G57hMc)y``yx(%*{4tx^_f|XM(dI{L%7~*$wB&?jA1)+Z!T&~ZsgeAJj)7y zeDC@_9}m40P(;m=Fxp(-jB!MbX^kI6mAfXF%~BR4ehRyz!OWb)`jO(fL!QQavCL!n zVvpdn3s`s2&SSTiG4mqx?1VY~(NJ;#PzwneHA-<(^+0xbl#HZ1%c91ep*rLKaMYZP zvl%!pP^{?72?G88**(s!aOcww9D5=l==>IGzZ{57}Yel4T69F+Gu z#4dT*fov3UyzEN)CwP*#@hGVkc!)M9!u}$fY&x$%F~rtA)F>bMR+ipDMa*fl0cqo- zA#EB|axz|s>z?uN@Z{tBI+3Qb8s)p|{Cli&G=h_)I14q5o_B9Y*`x(+w;3ta4! zV??N6widbO?d6f|+<_=nnLU?Et&5ruK7yWrx06L#Xu-)@dq}-`XSsa`#$E|CZBnQ4 zd{kf6jDkLx!McDB(*h-j1_)NJrXThvBQ&$H6ScFT(32-b_m|+bct4unBCSk{B~4-R zgN7bK)uLpd=P=#485k#S$s_Nj6EY9d=Kza!=KYP>rqOrc92;F=T%WnKDPd$m5BYd? zT)Tx(rV~)gz98>UlJ_~`N;C8JAnlzEqjk`Omtdk7f#P<=PF>V!Z$+Itd{K4~NrTv! zE@mrpGW7FXO$lv!kwbyWsn}W1QZy)NDB$=%33S0vI2&J9 zwI9&{Y%9Pq!3>5SJwoKgSV^%*u0&H%1h!qWl-)sgpQj<;L7t0HS=5ZITX>1A3*&Ha z*6-FGL=^`MxClPCYQEpdy8Ej@M!{lsa)@P*68k{K$@LIgb3LonG^b*Hj-+H)y zB;nLWVRau^LxM#c%=8z)O+-a97aXnq4bOnGrpfNZ`@2N9D-pR5_%;K+%LIHSkXe`} zt^a94&eJn8w0hhj;sFx(Ezqp>N$$t(VU;%874Tqct^hx7)|CB|?(`?K9g`{v9rhci zEzZ54gLd^p0br|6Upw2gUW=RaaOic_GL+2z2^HWhEZC4Ix)ufvH6{%*K`XFz)@Q$U zF6FY3gSa0NRxgb-kof{{1(d#-OS7hD-M5Owl&5*9j_o5M(7Uh_cjnX8=hJZ_E)&Hv zutZt<5^B#R{8pxe^br>IN%kGxjp zfdDBbV0LPkfG z@3%)oFIW*|LJ!g!>vs^0bUN@<$}(?nLOrhojOalg9W9}j7C~U_VOjS!F18Y~Zac;m zeU@ed%Rktcl#&eD!D5iE!~^PzpnyngMW3VLaIvTodzmcByu|2GzWHNdL{?)L$6x8| zCa6}Y#NMH@7TF*Y`n{N0g8o*nGn1kB+%6;Zwea87p@>J`okrjbdB@-rNCJFHx!~7U z;=mD0zFLA~QLs4r91|TC6X1IU9>CvD(2+%gb4nzcN@X-kMMjV#N$acM2feBYz3N|yDe+;UM}!3pe5*NiHaP!AVbRRL z+We0dcpup`FRnlH2vS8_4K;#gGr1ccYM~RU-)RkOu}@=i(oS(mXai=ODil6t|7ysr4c`q9G=%!fQwNE9U%heH|RfDouBxHY`;6olKVvP0X zHxPrF%l;eYfkS}Wd2WEUKhq#XN@^!yjTfBwB>vCaTfO)XZ)X4D+i~oaHQ52dZ^AA* z9lTOP=iy-&t=#R%3Sk#HhR}=l)Hv4L9_>-kpUT$I>F(e}`(AqprY)Pk?q&NVF}Kzng5+5s z+-H3QNt}zOvrFUzU7yW<1-azy;cE7K;%5h~tEd7vs1M79ZhXk}G5vpqzpk~yACOM0 z5%<9X**@(CXg}3l%$u?Ovybn>+88(I;a*g_T1u;>(d>m3raKlM^XvDN`;s^=NVh?t z?ii3R$a|ZH6~Y_YM?uS2oL9kig}Doxf0sQ9!^C+$94EpBQ`u|KIJIL$%Q3SL$wNFh zw!z@L)Bl*?-s{p3_*Aedd}Qz``KI&L02HG!e}V|lxR7QuLbG{>Gn-QwPWGn|cx;if zHx^UcN@0#u%B~X^+vk4@?F0Caajd|14)Lwv_>bX$k>Aykw_cL^C3{Km&#fN*SzzV) zNBBv=RdCSz=a0hGeJ zzI{I5si|-|US900!Aj!{HS=R`iERNVwoYvE%<4#$P$%Pkb{wL6)p#_`qJVTBHhJ4( z6+5slL1edzm^LbjzTEHXq|RdqoA2|}7p4%xL>Jkdz$UKKilcGrb`ThqV+80_jkP$# z^rp0&3o2?#^8}wZ09c@L`s~xGJ|#uV7{9lXe9))UDwh)9#3pT)qOVL)1eJ7N(rs|Y zTdSxEAwv0X8uUZT7=ahKDCYKQP^!#RzU03_Ds)?~d)8~mY+ndBD*6PsG7Auz>Gn~{ zyAz<#+&4;UI*L9=K#~8P?1$NOJYCc9-6~welg2s;;9~uYYB-B6YzHOv9b`-Up$_&# z9V?|p$Rt1J0==t`lKvi^@cGxW?0&39u~CabW4l!-rM3iR?d5(Mi#D!At07C0&nv)z ze;&(6fZi8KD1$3iTm_^p#v}G(L_Sd8aoB+5( z=%JQmW*rHT(;XxYwev_S)PMne12z>muOedvqk+EbnhL^sP-wYb;^!^AT~!*vd7tXHQv&mDk>m)LUQ7Cg85Q_WZigEXE|opn zOJdUkdly)tYwdPDcC~}zVMHcM8gOoyxD}sUp1`yVL0@72RBp(QMh78ZvdqrNjKRb^ z(dxPyB{d(+wfqJMiG!(aS|!(|eGfdt{thA};Uja{pPE0t2@B4bmf-`Lt$yW+8xSA1 z&X22Bx3^=UvpW1|&pyham2^L}&#ekct51NFl`i?A3SM18&NaB6Xx|WW%sv(T-(EbP zGzP?qrzE^EB&_M0mG)vsxxrZ8C5Nry3&6QmbcvIbu@ZNPF+W6&7p!rpCm?ZENxDUl zPjaC6rO!GIk6}Y<$y%a%4_k2^W?F$LFw?78S9Z@PXA%L~iRDiBca;Ae@+tPk)ieki zAQ?mS*t^DoKZi8V!6~TeR_m=SKEsP^;HdE5zPK<#1lgfU#ka>H3P-vuu!2JF<4Zmx zha>zPplIB&{SF`m=WR=#Y41S%1PM~=Y<+gI>Rrl;^`h91TM6HXynp-NcXGM?wRaS0 zZ{t>yfKS^FiBAY2Wy9+sTI)jnBrC|>lD!WE0z5s1$pnEC3ZQ?ob(1MqI9~1Rr8cO6 zJx(n>fU>;K)j8oYq>sGaQz*<>FL*a}1MdL0fYo3ZCp_TYbd2E1p0eLYHxj<@f~FaJCMWvPHMzjv#R5JtLqc(H z^}r^*@#z~;iErl=pejpGLk440yO~t$tx&B>ns)sidHVQUpMyzj7q;S9ky^h)9g(67 z?L=w<#DPeiolmXI*Z4hB&Qg;G%3Ov4@UP3TU@l?ADRukYTugs@GJ==foTHaJ`54L} zo*0rrd1#%r54#5rSk_yfhdhkd^T<`Zo&Qrm&!1uUfqWHbmY|DO7(VOapN_JBI$8

-mc2-}@U^c+G^2s17UqN~T?`5CPKNM9mE6bV?( z&rzBdbe777pfGYO3XM!9|>M(pW}g<;k3tzpA+#--%We;cNU{4cF`)bQCxdb z63vVpAI+4E*Sl_2GEYIW#{9UX0m`Im4_(GI!WC$q{d^@wc74JO?*RsU_KA$)D0T!J z-Qp|cJ;Yi^6x&=u{a{~h54(4M-Hgh~H`z6c?b-lh(86$yo*?WkKd(&n*L+gfJ{A3o zKbo0_xU1s%zmp+EQMwNe0Ql@1pv0k?>p6#EnVL@u9rFYAw$9OM`wG>-ZRWc!Ra+09 z=HGPt`dcbGsb5@VIVcwCT3A|*J*P#A{maOfMg6%2$ZL52Fruh_1Y~g%*v)9w-^8MT z>}hKN{`{}_YqH5Vpn@5u$AJQb0KzGc9hhf{*t_YU4(Okp&_8q=9rVv(!jaTJi0p`s z*&&#twh?G{=dKt1gVJNNdRH)+rFF`_*Bu~Q(I9Thf?4tjQV2&(Wac(;eeZtKWZXmc zHaJK-+3iH7;BjqG6lzkka&kA%*$<-!K4a%Vx+QMB&%;|yp&eq3$q58Xmjm}>e(Qd8 z411?T@V$9=H3kN_L}jE{%%OyW^ZKN zb@)!fs9XW&p7vTn?lSB#g~(&94HSN%#l7rFIPqHieF%Ij3!bNQaL$i>dcA#OYmE0& z)BI<7K60;2Dctu{0G_)s=Yr?>kB+53&@w1ZT&GReZZUn*%l%A5!9L>`^hd6r6-)<* zR+r&d2n`bT%kTu_lvdT)pAIV6KT?MDHH%r#512niZVxKK+5lcm4%nB&YzSn31;Idv z3h@xk{!lyw?Q_u#g_Z+Wt1}YNO-{P z;)W4te&86slzN(p6Q`;oAIoRwU>D0=2 zgVjGjX#8Ck87qopNsOsRaooHl`)efQ2Am%JDb^nPn!i_sevQNSDXQKcAnSW;7M348 zq8DH@JLn1*@K@Zt!0a2zYS^b7Y7U54$rJGX4Ah|`#g8!x@Tt4Dp#7@eH86RWesCap zKrnIDlLE<+>?l^TH=EiHFx{uW6VPN!zmokePA(In&{lwqI-@ZpnU$-vciG1}FL zwNcV^44a9);A2zbLNa-yyu92J21K-VU$t)*ARuQ)B*o6;Q<~BC;B5V+yZ$ z0g8jT`*{Kv%jFkv;DekFe3vR0z9hRG(IgOZ*$433lOM6C&|5*2 z)6o?+1gNV9*;NhrhAuy7Kv(dj)0R&yNt9D%HzSVHO|-Xe5=ONXsa&|{Z`NUjKXAVF z)CABkLRIFz5j7P^zxl5|Epj%@eLj(?!zqDw3iX0dtkS$h&kdaawPmrN^T*E|>R|Ug(tOdy}JPX&8f1mi9%#m101hirz)W7#=9xS(HTs66N>;gf)?e>XNEf<06jEi*@UrTbYMedPkfN4@qw| zVn?lU1#0jen@+ddc}_}6ky9@JlzxqidO$ss-&qgP$P2iQ$k(m+v!ej@2gVqXL8#-; zVL0=D25K;F$r%XTk}8dNOkq`O4d@QWM7OI8dhJTXJ?y=8)6%P`)K2QX^mkamVnrzl z@t6#t{QX>P1MQ%37&+YIp5LE{ntd}Wjz0zFjKbb`Ap18GU04F(A(&k)9uU9Z7Yq-d zKI+$-vjP-DDpnZE(nm10P7q>8U+{&`_QaI0h<5Zv0nE?!;3i6SGcB(~jSe3q0cPM@ zT6_ef9VKCUj>CT<*zsC`Q4c{4Y5!gpZ@{b~Qbla_(@dqyQN|jE4zMP%O7ROu!{>16 zyw(wF40o=;MGYHwA3sgb%VzC{{Pd-+K)w7^x*a90ChaSM)bUb2vnlnPI+VzRyzRGu7{4IJ*Kl|*$7yaamzV`6K7bSS1 zca~7dYdvk%=VR*V^S;Dy0S9O;=A@Jq{8ahDBsVxM(u4>OKsA)`*}ui8M2>{_r$;Z_ z>^;{>wcWbhm@{VU8qDCamOTq)kJ=@>y^d*ljrEuOz9c>wf|a6iXay}1ij&7Xp>6xB z)+#2o_Umlu7R?<;hAyq!D4yt#e(cVzB~zMmzK5Ku z^{~_)YBf6T$NuQIe+?a%{7-6#n)s2+kK%imn&yEA(V0%u+tCn0m2k5o$1mY7&8eVq zZ75MYLUslwCyFLp>+#)n%(FaY^U z^uv9Uy?i1=Nu60BB2XvqMY%pILRs6SyJMOZL_8z{COJADY1f*h;n0rz1i*97Q*yLD zhF*_!GL+QKp4VEWYMcFCj(5PvO`-348^yO!fkz=E7!>MFm?2aWNOSkCo<+4}etMlxVpx-UFFCbm$+F%{jv*LH$rx~_ z5w|r2G0(7A+h9pqyr%ndJ_50x6X&nv#;bfUH0ziSbOJ4MxX=6%=o5}%BP*$kH#Z=C z5N9$x`YcVn{WT}g-6`Q<1^a~j3li+yusED#^wX<-v;~T96DA@b%^Tf}$CJ1KT)cD{ zRIX|>T@(;hV!NWoZaQwRuXPXA_K5$(`SG~%F*(+-fGE;#;T^pzi9A^TBW5Hu-1Qr~kXmDEKj;CN8!mQ_qT=~`lrnTW%I2a;6tbWUPPxL-RP z?P|5XHMJLbaGIho2rU5E_+BZrJIoT)N*)IdZr_Io>v0sNk4X0NealPaI=Mc9FSmKW zZ;7QU4kBl-LPVtujiIjr;(LvxF81zWSXJx+1$tTc%kNvFB%FWQIq022q7GzLj0-@K zZ#j&cs6r(325N&@K9b}9SJwuV^bTZ_o2F_Ho`V*<2hhq%ReP}f zRno0^%_2dKOhIYdFQoQI;B_@#|EKdB)g!e5i`HID&ek%dvbQ1BhENFT-pF1rALOSr z`9pe4^VvB-27gMAJEe~Z0qb=46^;&H4rQTMs{v9LS&Nz=^Dg@aQsT}i8%`QrDu`Qp zfXT9%H&|~&9$-XVua@h{9gA+~%U%Br@K_F&6^HGEpU@WO^Nqfnq7#1~5__VHNET?=_p-!s!E=1~15FG4_|W ztD|}cc5QS0=O-rR!sOKU<(Xj|F+;gs0*XI{=zSFVZU@XiRnYnXN}u4+`P@MTofmRV z8|>me_Uqmf8?A*gR!;MaV^z08Z1yKs${ibDQ%2!|*kF->(a z@6fL?C3eWz607Kn`FHrUvB*C9jAL-#xd;R+uCKn;H}80qCj&urgS$uTpqX!FT~Aqb zYxng7+G99l#9u1<50`{&xBTe0_D&X;vKFg+V2nO;WQ?yexpD8(g%o z_`>5TDb(=oPfVj{YuYON4e(fyB@Rbeu0(j6nCl9+HUo9fG>tc^Rx_4 zK$*C<86O<+DMM;%@E>0xsR_XoB)md6TPQ;Da0zXVNa0g?Dyd6cir>~mYZ2a1Pkxdx zCV;;vHH5I;b%4#E5h^1e8jChlvZqueyY`_Y6qT7%Zhk+m^p@(wX(e7S-? zJf`6o7VZhCdJ?j!wj9%l@3VsLU!pS=Mak!RO~D7GlC2%$VZlqcS#fQ!1wtl7zPada6MCMfAkz)pOq7VS^Zu6=^s#3Bv{Cq$x=Z#AR3 zR>$|?)ETp8uOzo#bl_xs@ey}gnA4ioF&bf}DzZ^sIJYJ#L0uAZYm!G?=_pNJDY&c+}wTT-f>x z`Adrr;*NQ=jFo5BZ9cR94ysT)Zk4_iAHwCeUpQsu`S!d&gFa6BX+EBVg|hCA=Xjc| z1$`^xu&2zfYN-Q3PRd*cm%4xcMcA82_QA%CcB07#AES|$d4nmlR9{Vi6eWuh%O0h0 z5yiZ`QGXK`L*PRa@O-sJ_9@?MjpFZrw1hf6JM^twmiaC^#CT#K) zK<0#anb*w5y-6^}8bN>}K0sMYjsgK62;!8O05BF=Gw*ohVq1V-3m}#B1Uyu2v&P{E zU><0tpr7Q~OV;~vkifVcfiu_iJim|o0=^3R+=lb#+AH-MmSr|T<$r5v;y>8 za9$t$?3YKf`qJS=D3kT7aZh=3{7yJ_TAK>WbNrAvKM&n6eA{JCEqmE+N(Q&YjT`VYe>|L=Ah=ozd zaYW7gTYImStgPHKIPdd3@B4iIfA`JJJ?DGYS$plZ`#$HMyCII}3m|(>Uri%M`nlOb z?~eGk=55O6Gj7E0<`+>Or~2mp*X1+f_3u-C$Hi0p9%0Ga<$Y;2md2ELp5Q+*Y{Dv9 zs}Y;)KCIv9Z!M7akkuEcsP53Sk4f=I@IA7%vCtR! z+5U4h)o+*RwPfqSx(;~8qO0TIqsB_W1k}i9@W3UU;ic*}V={_wgm}B};@kP51;_FI z){c*OU73k@)II#0HowH{bxr*Pb%~PF*utamTul60sZSanAaExNYqJLkJlpZK56Bn3 zzEYjV!vesb@CCnHhW&ipf&zUn&X$B&>LCE#lZMugG%;GkR#eY$m?z6`kcvflOJw?y>*cLo2Gcmm&_92&N z*ZK~$oF5=q}fM4<}IUD7HmzvPAdb2}6i)aSm?F25u;zPS$bwP$lj{Bq)@ z_{knTN;?&gJ^N%-U#}gWeQu)GtE9bSx>Gd12@LIDw(vpq$3s}s<^Nlyo>;F$+nVF!1yzl`4j$?x;>pjYrsK%YMy zGjW&X_H8<5PR#DO{X~rQTfN$`)A(02aoNe*u{VBC3H~-unamtRb zhf}`5DZYIhoL@imIXs>Ri+qXaFuSN3NE_&XYw~FWDjtI+kHeC6buS_3dgtZumX!{0kr7uF;;&f1w9n z`HSo{Q;=Ugdxm}%FsGfj*slRjm-~&qqC7S|@AA9<(la@Wvf$I^zmXF4 zs7o3w45Ylr#c9d^<&*Mh0J?lqp>Ma*LCCGW;rpF<_$#f+`wUpVFMarDjs+kOxuo{Z z&-ZEOw6|aF4VPwXy3vCDaDNZOnG`eDApP|ax+8J(B3$Q7c=RZhd$|?V-=9Y}DNgfC z3bYblH-Ue?vgL)1#Qx~oA#3R*k5sWFEx$o~iV*{ptd$SSCR z9o0Oi{%1C0%43GJo)EQ&v?ZVMY4md$X-_Rjc%1|I0qQE8)NesQ6sv2@LC zw>f=6{of|kpB#tvSX=)pF&0m==uHLX>y4MKCxf5Hoh@sy8R{in?Adtx-Z-4*5OL;w2$n2zBI(A1XKeF;Z?<*)Ae+iv^I)XbL$Ul-MkUf*mK z#y6+5-O8>tEiCLfX66ObLTMVrJ~ipVEItoyZl3<=b(4Pc)<6dKW)4L zGPvXLJ*;Qr%h0F)Q1>@D;%M*tW{(a)KRFgfmF`F)&yi~XFd-hi%TH+aYWWjd^b1nG zaE=VZR4M( zcKjOo{_U|oLTlus{D%69?5JC4-KjMttmPW{=GF!HmR@J6>*0~~X)95CG1d*Yx!|fm zYuxX$x~iwpL@B)>y_?@c6hEBZhW${QT2v{kkSx zAAXw(Sq6O{V-Ys-+J)pu&mFe1XE2|8e6k-zjLEXID> zveeL14eL7Vf`l}nKcz1Wui5y_h1BbLWqHHtk+$PUY))M2mkz_cq{%(ASKzt$C~#zW z4W^t2*B|};z-4Q~qr&ksg!rn(SNQm)VCk=ICY-wmH}u9nk2$ zo0uIc7+r`*Ya15hAMK5_a$oV7zeew;jXl~@=itpdY52yUu?UKR$^dj1u$3PAUZ2xB ze?*rAuCk12w>&>i1M%g!I8%RceDhuy%uy7Z`}&K|XtYVR4%Y)A@bu_7IhRhu?@8m0 zFFB0H2VZkRC)U!Dbg2ZFpy0HX7vP=%6#4V!LGWQ@mD}9Mk3W2lHP2Wo152N5D8Pbu z$Mg1wd`|t>2QNSRQ{-L+Rh6$2xD{(_9a<|CPkN{_I{`nANKc?b!NXH^)^yIT|HtMX zK{|tA8;^OTZqq+&WuVU6P$HokS98Cq|Kfg1WI5Ajzf&{*Q%k=^@nNwro^g|3&$K#po8Z1E9)nJoScVRo8dX+>Yk1+ngrzpM0*r zY#=Vm!m>PAW-cOO=9@xSjyj$}kCN~$SBtAho6f}{-0(?1Vdmr8d|mjs(${R?3hf3j zHI-o0>$Jpn+|zu!=@%HDB%2RG**X*>(#e_23krQ*p*&x8zIPwx2yQsSnRGWpM;~GS zi2QaPm(d-?Ewv&44)JYvB}$h(OBO$Sn5@ml99gcst))i7x7m#oXRh}r#6uRtbI)u{ z|M0)m=(I4m$#L%>HCSJuYd}L9=W`r0wSX6#NA76W0-pQs#nzRmgJ$ynX9 zId{isMd0Ov<=O{WGL!3sPpe-(Y)md) zorM&-aBqJLKTx$BOHFlilci=C#I|j+%vcJRhp1GpO@04=D%W0X%C&yzuT_41bWV%> zdhxwx`PKG+d465?|6P7jR4Tu2c=x}QUoFdN>Tets@RjzZPcBmP3E$*w`o|C4=xy4J zt=~3>T;a#B;rGRVz$5!GiWrCS?wZ8G_}U4&f=_7~Zfh8J_!}ldS9JOs^y(X>EaB&M zu|9|v;QX^G-Z7-WAH#y%md&mGrtVARyfEB25+~6NYiB?7{dLeQjS1UyHJ%dQxEI#5 zuzrMV+5Yl9Wj-RM5AJeM!O(qp;*AZ{uIYXSs>SsV93zESw6HwU)O+Il)%<(!{?dNh_>PZs$FQan->l;qub)eJ^CNsg z147P2H@4#=tyW3tpr2T+f4ikmn_{Q&m0JIhoWy0i^IHgB;er8v^&2MC|EtMADy}9M`TUuJB_W!bk{OR+UJ$ZWvK>E; z**M+7cs`YU)!o0?NDY4G?EG_C`(HLLG$2Vq^mZis7e_?ZLuwwDl% zKeF^Zcer}d(c9f>{AzI@y!yI_@PzQgao+2V=f3E-9`nbaYowyJ>GLxj`+L&kZzZ99 z-DmCtytDEC3^DHM{^q4Vb6;Y=FSajm-+J<$``-NnY^&eA(oQbs&$*T?b@fMci1kYV`iuAci3^Kopuz1T?!L#K@owFFWcBQ|S8wrG zEH`iZjG4u=N;;=a*lt2cH+lQXm8n^&Sw|h+-NkzLYScAP>&ohq)w)d=iX$s4qhnT= zu4B7&U7of4rY;#hCdCfT>fO3cmN#G(pVYJ0r1C?%boon{iIcJp?a~#G+>b48)EsNB znM5Fvl_df_dnth|MBTF&{L5;>vr$3y|UV7-M3d(n+d%Nk9RK39pR32m$^T<%iR_3O7}-s?}oXP+z7YC?T@D* zUE~gOE8R`FMf+^LQ`{w}uNS)w4YS=*xY2M!L-W@hcfDtG@xR<1>*l!%H{VrauL|c@ zyM0}T>xlc`I=SuL4sJ(xoEz?Tay#QYVeMRdcZ?hD#vsO#i19u*%KgRVy3^fkv($lm?)E@ia2Q&II8sg$YyAJ8p`)9d)3E$#+)qq_y^_!D&8 z($M^MtGnH^xh;;&h9|4toej-j7s4hYbKPAnta%Xfl%hM)ir($+are5vx(nT7?s4~o zdlGHyI;;gxcQf2fSL|ltVtzNbpL@owbtUduH`JYio?d=O5c zf6is>&@pqTPTTKDPHWp^w;o+^H&K4)8Hcv-dgQKYZeGgx?c5x9qMHlR#VDn&vYgIB zI1)DwOx^deJ-fLDc(zGk=^f~^g#Hb3eR^m0bbIxp{R0jhIcoph;lm0J8F%p5iefi& za#7)wNk<=ZRNcZwiK^=3YHIhGh5}lFfK!ji!6s7U_AbR<#gKu!qae+nzE9tN{hb?p z(C7g}DFT<05=%ivKxow}HP$?&rqIhDOhLPa&^i^V2aDmqKPMHB{Y^;?yQ!&-8#qP+ zI7S<>7(QaO0TBu*kcn_*OFb29S-NOwxfRLLdG&H2* zi%YF>19A^n_{JT^FbgrNILBS;aLH#Q%xo7y*PpTn|>vWmJKiFcPSU3>JNc0^VzHgxC#2aP$jV3Kcr zv!+e!+3PTFfU{y9GDAPMYnQA6`|dYkVj=ZwSpyE7SlEC6sr^UgRy3t(T9+ihWrwAK8T?!Il<)+-%#r7vm<{f~O3yDbgddZoK>@LSpc{*~^&#-pz7tA8_^ zj`}*lebqq!qh9Im%Lb~^Up7R)(ox?xH*9VgjL)c7I$D4s=&OdfFB)ho{HLw(qWyHY zsbO2Mbhoi#Td#DCBlblPN&ll>>F)D}ZN1XnXAQ&f{&%l*_i4knUg_?WhN#zYK9=r2 zZrIi<9izk%?xP0!AN5LaHbxxTY){6H>F&dZZN1W4jN6)z;%G13z2DICwLiwOO*GxT z*AVp@#mCa!yA9iVrMq_;qFx8^v2^!#!`lr9`v0_*?3M1`YWVlBgHR6N^!5GChBr~) z>3_>tx_hHxTd&_%-+xP+@M^=hUg_?YhL*4X&1k6aFK?s1ulMzReM9t%>ibI#FKwf~ zzu2&?S5uqtf^QSTe`yhhINDEl&o^xAmF}Kvc&=eT|DU#!z0w{z`YxpuRuT z@b6yfZe7E+UZI{oy^VVMRKvDj>27U9%NNzJCYtV^Y}nQ--96E;tyj8xykT3fboW@p zwq7*sp^3-8d#B(yT^9a#GXHOnk#4$#OLy?LQE}iVPRw~7X1z2AZyq;2N|2^B^rr3K z@)rB(n=~1Ccf?!RZ#nk|}*B%v4T zBj(zu^=(lL+h82u4fD&cE{-*uJus5r6|;}+FbCNM+cfjp8S7OUm~rfeS2!;frA*H2 zjx)R9yxnnLN1W3h@-z?XjGA3sQ!;lzR?g%x`2$MJW|ve|&Mu#$4Jw*jR#O%)uZ>q$ z#pjk)RL6@K6qi>N&#EYk&#tP$^9^vQsyb0#Rf$!I-^1@7_&?qQ^RZ$)-&NstoL}Xk zm79fF%(WbGqFNjk9FSjux@-MR(Jk{HA`BtybmkQ58#T>BUqt)-o1hK zrjPM`ip}mT_oMrl`_;9Lb%^a4+a)1E3 zZ)4w4C-r|okiPc+kEERXKN#tMXZHM0+DYTh|E};qY3F~JjihJEe}git>HBe`RYl(^ z!e5JkXB8#ots^)+^*xy$`l@d-PETV@#_4Gg$#_}>r=M0xCLhJOgD}m7Y{-bv(=mc) zM(`aXc&7+X&zr{|#%j%j=&@Yn=^P!Rxaf(Jx4sZPG^f)+IL-5PpvMAR-E@4X2)=U! zrym|krl)fR-xb{YhT(P>`${Ibdf z4$P~pT3Fdc;@x}JcGvP@j2&=!<$~gh@?_^HlL`!mjqF)EG7RwJJ!{EQ0tP5twt-#=TuhtoDq+4ihI^d0_Rqhm*9-1)HMS^ytqOH*c#a_ zpDkPPOVbXeT^-Q7wN-UBB`6||4lSvgkK>K0p*fSBT3S{OwU{qern!Cx#+%n%8D!N zs`WYXimIx4#dA?!n~uu)!7;y}FuWn!ULr$4r_yc1CXA=&9py zp)-w>5qD{n+PI6y#d?>9L}(W@X3l)%Yk9wl^2#z4WXdI)H74SOC6OxRKC*1 zmBsVROHf9=d&(>0$5RoWLG?OOHe*)Z?Ac{Cz58rSob34zg%>BvYN2>macMlnf`))2 z587Cu#?{u8Bx=gaP%sCeup*|t67kvPXa#1MV=moPe&XR!6^cqYL@j}opmXmD7T8Gs1^s^BQr^)S^jzh!Z&=m^+}jE>Y#B9o&YNoU49qC`y!X$QQrRfg)R$ za8(OX=*mmWM#AaEwY6w@=qz**wTtJ^s;VGq)t;B4@Q#f4?7w%d+m4bJ4`r{GTwPUJ zTaMa_Y$)-KQE28>1SCF}S~~iq_KPKY)*=!~@T9}?CLcbzpeT=%*R!@i@`Q7zXQ@l; zk=BFCQI9m&zpA3tg(F&On9s?Y?6D=QbKg zZqLul$<3SGsC!Ns>NcuhsrNitqvVSw7fdP2Davb<4%QBkSVBfg(hDa~8l5w`V0=N* z5nOXhs;U>qsiX0o^IUYr$e7uvUjh$GbF-?dsC8`0uQ)0z^}V!kwb%T;4)Xi7R|1Ih z_o_q{_|MN;jI+?M*UTs>t|*y-uDK3nre`TE7=!i=4ItW5j5^AEv5yy{%7-f5;+&eY z3f~rolNaOOkx`*I9O$~?Hjq*Ha|a%Po6Wi%;NmBqh(@_rFZ`Px$DLbo+?_T`Iz@KO zfw=c%zMDERXF}eL$$8`Ra;D@-@|-vt8IUNOQ&!{VmMwCj)t1qSJLsT;ntEQ`$bxD? z9d#{AS$yH#@{+mnxy7~dy2|-w3G`WLn(*PfxU$NUa+GD9lIFS}?Ra!hR=EI$()W(& z$SUj5nE0W93yE|=yYv0O^Bq5WN2+S5PBc_$>}Oo#D8MJQrVNV8E6aVqfZl)_Ip45_ zEy`FB))g3^0vmb!u-E*m(z=Q=oLF3e>R!5-ng?`bXx0}?0rFZBHH*0!5FI2LN-qm? zdg8t$#OI@DiVm+9ZBo1(xxh`uoSLe-YOd{K zsu(ZhGxC#YOJdN(s`&ikM9EzE!}qIx91EwTUaWE zP#?y4B@+tA9|15qXW}>#Ijmqx!RYa{74*=?MEpB^(&SwJm~rUTNocx?W=x%!cj#0f z(fGV66g7R!5H@ad9$L7`z`WIXWX$+UQ}SjM=1k5b&68kw<4)crvU?Jpl{1kd6m1hH z6}hb9l9Dovv;AZPwG~qu{GXqgQGvGEg`zwILm}if>RDCg3_2)0WL7AtGte2;EXHBd zz{tx|y-Xsauoq(yj?u^73~^r89tIt(&2N;_zPBEqL12DyIU29Zx`6$bcZ_eIaBgYXX!H!97RLN+QE1S@ z4h{CPMNXwnG;n^vA5zRaZb5l%`K0-cNRVcf#1 zno@soa#?9z2{lBB4f9wuQZ;D4&~e0j`|&rXv3*AR@pcy20dXfuCAE}L7ZO3c!Dn0y ze2PO}I^4WT$-oD!2xBxZOvM${csGp+sMGYsZ=g$IIfsb_x2$xS%ZM*8#T6BmRSXvM zbR2VFhcvic^fP|K92)-k{Bn%HkXRT?2~LzD1sK!H^(UWaX?ir~y8vqZ{HQJ-a@#`y zOzbcn@EU07oxsQ|^bi~y%1-Ep(U&CVmic3i190w(&>&*C8$3rFek$c*JkBEs^1k%4 zv>iIvF#7ggE^VUMr4RJ9^btBrbm`@@!;H)KkF?n%L>2lJ5)GXt9rFDpZTK#eHYk7T zQ-%XjTMf5%3lU;I>Kk<$s^Uurrf+TRTI(ts=WTHePHQmlD#Ng;X9-3-v$s7{qpX7e zcv3_e*f_)U4N<&b zTr&;Tb+vQ*&7w-v7*(V;KZ`7bBWh$4NwvFV9%g(r*mj|Bn!)WGclcb)!V(RYQHSsVT2c)DGYo*?@|9B^X98sKWBk zqS-X4FYArMharYXd-wHAS~C(&pJNNg=f(H#6IK%9@F$%_l?j${CeaKOU4B{)W=I$Z zlw%xQu{hp1e)p5d{o}cl;^>3odAS8e{e1~)K8bKJtAGCi{rhtwO48hn36pZCqATqY zh6g^mNbsOEJcPR$^heSxN^=ADMv>hce*@AS=9uxL;G1Jy&kD?L1}?(KB3Syk8d6Z%$rqL zUQsGJ)2{*(xVqvwW&IP2u=-P5H>(x{Vw#_KKZKiyq!Cw?&o2)Oo2L2g8>g7?3>Pct zNT9o-!MCJGiE-zGr6qlw8x81aJiAeI5+x{!n5Xy^mBurZi-p!FjE>2kNmbRg-QxLS z8isKsYL}k?VgBV;O)*=*+^f16Gh5%lpbB$aC!^?6$6KMDUr=6CMO`zd;$gN;3l&Hj zdZDI63yN#X{hbI%VAB{Bg^d;%!{9o!%dErKOh5dcMWb=*QqcZ~gN_c4j91pppM|`J zC%DRTw1q*|@IL1D{ zP+=~D_LAqUG)ojc{=_gLqS(T@6=);je`;UQ-BM*nSHf1-HVI2Arg$%6T3Q<_QJO2F z$#a|t7Po2b0o&*^a(UW=m2KZMP@j?8xNhl1ri59b+V%y(?-yY47E?d9O*1I$Vk%MS z7l}iR@%VV|Wid+WxpxVcLy@_0EDr_y`d~Q&EBNNxN={{I4Yho|_uF^akbMUajnDGS z_9*lvs#KJgN&hjH{Ger;^fp#B5<503Yqn@CjGjvO!mekBe4=Tuc8@52}f zYYp=UB;a^-bLEu-Dk>Jt?}yTPEX`+U4H+?P_V7Ui_ZwJJwqNP6frADP9XxB;@WF$I z4K6DkG-Os;+3*p=XAK+C#~X`(JMu>C_{lD|C^OcjL)&&Ma8YACcvn7l;O^MS$;cd? z(Rp-6d~`>8;X5Q(R~^Uc{=t9v{0wi>1!H1MQ&QgbQ34Ie`#m~_ za4B7+X^bx?qc@CPDn^fr(Y`i!U>xFf9f-p9^bhAk_ri>Jd7L8pK8ADjYs?gO2_K#n zGNbzuDUe(#GyZUKutmJ{0k)O>uZjJ1-jysphk)AbBWRnlj5Pqcr`< z$0qWz97+h%bVf>vPm-^=afdZMq@OQLZYv*2wvc7NX1&Nqw(*RV*(%Q|Jtwm4MO1!+ zU&m#vN+riqRyTTf6>RnCXZbHlccXmBh>MkY9EZu5@3Fj3 zW19lm-hnSRzeAvTKL4pnecZQ=!&&xy%4c5$Oxw6VMOV7i%Tkinl)Q}fIDb4;oW=So z=!WB#`f@Xt#G2{rzg;qYIS>nN!dtBGCi?sh`p#>eOkeO-7Tsu#Ae{!at;3l;Pvr={ zN?KnZN^M@uAxeHu@VQrDo6l`3$LC5p4sowyS-St4LLBeAncYRem+O=oU$7IQu8@6i zu}t%JOxlysVWGFMO}{T2J96XQjrEhh-puynvYIr#S*CqL+e78Bl+V40^`S4hfC?g& z!zFx-v&;9nE14Ze@?(A9gX)M4?9%&ga}Kd}%;*QDC{VobF}sw&!Cucf6mJ~6Kk~8L z=veUK9PhmpG$BBgPhDvPf$p8L`7}$i2{}jYUOvlSM<+Cv2lPSI*S0yQ^|`(UPdSMO z4{`6j&}t5ZIQjQ1K7UcO^CiDRvzbz)^2@h$1HC_<|H1%{ z>2r6aFA*THxIecyGc89C7q@bSNmyx;a~By#`E?GnCrN3@lgFi;+|0+Mob-msL(Ixa z-n55DNrQz$qI1*3!c0KcM#1V+y$E=GdA&t*7n@r66Z=O%3Pd^{?{klIk z&6o3`5N$^fiUj*Qb2e{6vV7{fqcq$xomE z%xoT!{LOq!$|Q~3A7ZBc6$gKf`D|>HAJD1N*!XA}TaxWRvdqG!x{Zp7G-I5SBDSX% z$E@*`=R-S?Vtg-#bU?q!^Kltl;?4T1Z_|=zI;Cp~>)MADB4p#elG!J=Z$(>@i@_|K z6P|Irm_jp=rX~f=B+e&azQsEJfNkXIhFEBFT^zgL^RYMSnD>vLJG>zNA-g(LKa3z{ zt~a*(GP{L*hVz=nOeuxFy78cCJPuD|S>G{aEKz@)%W&Ays&EouOET`Nj zaUt3fg}kv-q7syab35~Z!}q7n?L1rTq`HvJa{JJDvSq%YF3f6{&mCJOcN&$sb66Kw zP49zM%zEND1u9#2GaE>qQL;EUbZZvp4@nCH=H)2d6mKi~hd_0Qf-nEfd|L`eY3gvT+WxN&?M&?yFiDF~q&>egA>%r!2d^rQYi# zFR9FR#qmt~!W+VL`sc@9VQ4v%%f&!GUPH&5+jy+#>Wf3uSnjl@vPb3I&wW#;Vship zMRARX_UbH_pU3h`Q&P)gh?Cl~>-pHx*rxnOTYe-pbW~2)@Ui3hm}-*}-X0Wa%Das$ zcO8w3Tb3EyejJ*#pN16GtD)OdWX|nQ?F7;h>J{2ys#h|_ZPj9mJCO3Yn$JCx6g2Z+ znYhpUgwl2;%Pwyro3d1dXX4nCEcb@(FTy&NNn6T_WHk^%DVHQWke887uqX@j4WF%xl+edB3Rf>2BU zn&oY^WEb-GNZHP#vQJfW8K1|^n(yx}WA>o+m)P9At-*4^aCp*>JLA4Q2458BCgW&> zsE+>3aXg1@F2`I)v7U0Jn&99t+1VFA=SM--`=~BtGdq*YUQ}J^+_El^z7zS}W!R=b z?avBk?>Dsre?~iiTnlaFYCcYJb2((2&q#rnz1Pt+I7;7pEcws+|rX?>n*#{@%)K=wlq42&AWuJzsv_|-%6nNkMvE1e4XkTOf z`WWhPN|jVw$`L9bSF)_1vtU1t_iAR(W1G(Bb??Vz>`M9m8q2&xGNDX1mFruZmuu=9 zT6HEt=iagTl(hX!y*g=Kg9qc#QOLTY?4xugSca#hz8^b_*&rNm?w5Ju7VneQEXT_` zo;|70#px8sTP6--Uozva(9eDG6=NTMq5r{GVID+fl>4%jbuG*Hc!-bUb049Ev@BD( z8LOL*@hjRVD?M2Ih2JS3&S8DGV!O!}v}s&lcnxK_8m?mWiwcOYw{ZXqLgn!-)-{54 z$++OWl=)H|@zgv7E?hUUT(Z8rq($t|L2TVzLtuRd2it zc|qb$Y`3U;&orfZC=Q>wOJ;4v(It>(%A*ZFV;$};gKRACT=?*UGFW_}vDFIU(+ACnd0OR59+>j~K0 zi1ik)pY>qJhhI7bKG*2KjQPwU=3;z2jyVqLspkDweEbDW3Mt-!O9J=<^TWLTZ5r(s z`=?_rNP1-6A$oA9hS#&6_4s^)t{*VACHaJjHy6iR}ypGKS;0NNX{uH>MCt!0C=WpS|f%~x`HrsQ$);tjSec{7>j)+K4 z;o|}Lu^KjCV!na7A9sPzWIq(~`C?~2%Wru*9Pn)*HZMS5P5M{-EpYK?8#sh`_2+^6 zx`|E7H+u5JYU<+=@@Y2^pZWRj6Lg^UvGG4w*M@{2XH=a;r#XOKH{OV zC;53roMOfLp#P8S{E(-3d-J~7a|iZ`-^}`jKZN`xKG4WNjr0;9ZukIS9}zDN!YQz$ zm*bQCyrwu{&VDzK^=AhRoguX1@+NA8pUT|#xe%3n><N6h?aetz0JiLCV`EpWarkkmtyyLEQD`axybJfUlVkVLhwaj>}m8N33T9 zw_~E`LiXEC<|nb9Ma(y_J;KX6g!E=-1;L+K{tb?I4cjU9pN4jx{Ii-D0p*^8(^${U zZb88Ylp6|oXq}fY#3zN`Z2#qOIOSvZpuoArIATYGbWxemGSML30dwR5BCpLA_=dH#>4$1iu66O(wr9@+%qt zdxW0W5%MRX-Akrt4DvS_?*P6%{5dc;nBSdKkpq_{lm9Tnp2tvLJ1IX)PCS5(WO`;t z@a`yA$>cYIcS8PVa(UyawM$32^!CpWhVRPuFNdAPmrw_Xz{Sx$2tCBNR0S^bFEP)o z4t#d_a62mR~)@|2KwsE5nEDj&enIW^xB0vWcdP?e}(nC>;OdnHSD)+ZV3IgEr?8IJ!|d_^3wlOG4T3t3VeO|aL2NI z;a>w-&iowC-|E`}IG*`w=%+}}ikkzFe)d@Sjray`_fVaE_=l8dmiO!6II@7{*FPTQ zME(rsD;^2luQ6hC8T(<$gMs^XPi+2x_JQKfWIJhXhC*-l{{~K%U&{sG!1AlOVfJgz z;N2jfEZ^@#IZ0N2u4X^1K9*v0cm{h2x3Znp^TNKrj*ZQ}h&QSJ2!095b29lGQ4W*w zBO}_wpWy#w@@r6jlJOHF^zSF-_N|bvU&4ob0iVhA435zAXauKbCz+lN5q@}p{hYaf zFk~s)Q;bh459@~na6R({Y=3;e0N!98NB(;Gkpb++d>)sRYOdG*K0+M(mE|*856tu7 zWUfc}aRwj!eL~oxahtCf2L`?%eBfE3qUxVg;NbAIt~%2B?No+ZqA_~Jg`cvoDqj~q? zYt|DtoYF_}4m9!BaQjewVL1Pi@Zt97`nzi10Lqw8;(S^2Y5>nOzZ?0Rto*zN`DFF? z8RQpnoaTdk-XBpPmqqBmHllofj&e@vb!_M598VsXlO^*5;3XTE#eP`D@=^|uim2C* z!=cI2yGKO*x+a3Z5y7`Z{wCAE7aHnh{2kbzjQwKBX{^Q9&&^l8xz60lDyfWA^D}1;wIlu6%5FaGJ;>a(ue+7?o&`tQT z7XOK_;(V8MUB&f!1?$<$@`ps^`CjUr;{NxBbM?~23 zI?8`C{ZB`v>zjypZ;8;eDuN%(Xm_Wv*ku`IoWbS;3tL;cLU0mF6S`M2bu>bD3qT77B&-I%XuUdZK8_*zcal8b_%zsCieyK=m7=F?bD0k_YEHwMs$ z`7Z3Y4PyeB$oy=sFPW?dyFRRBdj<{;`;4*E7;DN%LDNDM`5#$^{im|;Vgd_%g0&& zGUmgWSFa6V7v?n1rFmsLq=UlE;lo{t^ip|{x^eTc;D`q3A^H1QPUMH6UJ!4T=i{wV zkBH9{KQcctq8+|CqWxSR!9QTXt>X5Lv&}uiy!zM>q3{V(4rc}~<{4C+|kN9T< z%Wo(N@`r^Fx6b>gy}y5j5R&ObFP1MX4f|3b?}UG-JmBYzd?*heZY}dIqXYPo`JT*I zu|3%J;V{m}RXonTm-B5$jyHRDkn{I6W3wj=^YP9Nd{Ovt|AhU-3+DuI9rLkhCyCGG z@nJ3VUs%sT_5)WN_mq@d<}kyDVr)?P5x>aiy!^dz8vM1!n#&F zj!!;EA>L$uxEXS!KYRCZg8$AKHqT-n=X5<84!iH*AF4;CG@yeYhA zctybO6XxU}8q$cKFCz4RXY?FQ4ng?Q@Lc9?$uS7xH(7V@z+CKv(TdygPg->3Y@Zm+Lbh z8@_=XobQz$ZGUI9R}{qlu!kSgV@{{(a#&>Kr5q-dJk?*R*C#5j{l8T4BE)fbrx5d5 z%q8EcU#D=Xk$;HguQu`poZcG@zl_s=8*^KJ9yIbdu>2au$^R0bV=n%Y_UbLgb$V%? zoPwlF+Pl9oxAt@xMbBw&StA{YRc1}}Vm$wW%GInHd=3>8$TTfMbwExdldZ;~@`YYe5C3`00E&amdMqb+g zPZihg2HkH!LF~!)dl*+RC;#YnqZJQOtsmMm7d>PXh0e^ap5cnmgq)gN+DR0?5!+w$B>zN;6^t{0O zFJ^A@@jAtIKmIOrO0OQDw`YCgAGvQxz8gzCfw%aF?hm9O^3w13Hhd))(7_RWgyEvU zSaDrGs}$Giy4rBD|4)i*`~Rvq=@C00H(d14`UVB-=QkAB_M}n)VR_<`uD;A|`5A7w zl%E44_yp#*{7g0SnQR|jm#07QeZ#8wP`5}tatxBT*K%=J>k1r2qF7;a0-2tQxair97p$!x ziX!;Z2!3Y-e~-D8t53LIePlRY7o@P+aFO3)`1vgVli?!YVE92CZ-*U2Jd|I09dB2~ zpTRNl&mPRh{<-0F*TZmG580bJ`SSv$XHbOxkw%ZquMaX@=GPOMOTQ`e>nTQF=GVtC zxAq*X_=U>O#50kpGjC*X8g&#fzXz+ToX&i$90+n&U<#ul4+(xYpBQCn!Y_ zJ+h9vJ#(q2Qtx&#@^u_eFZ$<2=&v^N*R%fP4HrF2BJ`YYt+{%?$Yob~?@ zpFK$mw2BrT+;Odb6X!@HS&_Kw~TxV`}t$TCBHUC==sXXpUir`XKu?wJ8nQ^Jday2 zeAtsYov!v&Izi1&0OFY#VzQ7` zMdy10`7p5A=jXW>vWB7T@M;k8J{U;eN*Zs>3|CRNe$(+pA z<4JjDgZNX%)hk(E_zF(%70fBUdR%>Ng#JGF{7*W;Gk zn2X<}|9#NN%edtUBQN(~J!AM&?Em%5ZMpip(y#segV95IO`$d4zia*6l{rPH^>kw{ z>AIiShX+RJ8L9XJ=#uhQsPvQHc=+m$iQuJ%b1`-`hVyM;Zi(Skt|^>ncvisfa>M&F z|BK<|Ckkr}7d=lKE_z-woYG9;L&Jv#>^@hVo*^NA`(AO_ff-17lr2{_$!7>K5jBx(zR7_ZU5RmLp+kdg<;nf z#={2bU4yrjpZRg@Ac(x^PsBZL3WJe?Vpdg$iHCZ zCEnKzmv}cZCq0kiEqcB&^5XvvJdU>ZbYf0=N|c_?5%Rk$d2N4|kr(^-FBQJVhH(d05Z@Adg zu{)F^NPY<)s<H1c2oxi^*uE!y*_&z(aU#|PKXD;It8FzIy@-pt)-N?)J?=0r6P+au5ae&do%OLI` z#kKvD6{oyi#q+77443N#a}Ces@?2}U#Jf~+9q&1cQ@o>C&!vX5d)-xrOZmLlaMDE~ zy;t}Y{|nzoac$53ifemD8$L9sb@_%%dZ#I_#|bkO*YTdHxR$?6ak5A92!Uv4*C z^5p@=b-a%$uH#*&xQ_P~!zJDi4VQQ~E3V`H7xPv~)8%+e``mu7;8@8o(bLgzxt_JF z;bKoO!zEw#Q#_&K%~M?ap-6FUe~sc=&xwj_znyNl*mxVCe(;yT{P z4VQRdGF;+)$8ho67Q;n;EAv+HCz7g^x z4WC3tAdEA7e86sk;W92QHeAwM&fKQAHbQ=};ga4{443q-RQh##FOQJF-*B<>F{Nh> z(kgyi7a{+m;bP}&hKrq_M(_s1#h$i(g2S!fIx)B9WEaE5p4|->dj=`}+Hb=mue>^#nJv2$qz|HyDDpMNu4%I7bJi~iKTgP+BpVoz7YCB6M4_z31U zzp^9b#~Cj1PBL8VERW#l7%p~R5y5X{ZtYwhA^%sy#mZ+vo)Z<<={l7;rE|HGKg-Bx;TVOLhRgWyZlz}> zisO8@POQ<`MH^H;-VUh|6L`g@w~`{85+ ziC6r&i{awWJrvh|>!Y~#+hE1XPSJmW;i5lRajpLl#kKy)ij#h6PmVTR+Mja6b1Cr% z3B$$C(+n3o>lN2_u2fvx`A5aIA8s~W^#4V1t^WbVwf@Hx*M4}_aPh+i!^IC@8ZPCk zU;p4IDks{Wp^9sJ3YpvbGL5;dFY^@F^`*|}d58=^I9dCg_ar94ZzZdCHRAGuS> z>w59H;yS<98!q|vrsCQ^A1ki?vsrPi{|CcG|1XLskbY@r+70mTXso}I-j0gvbnT=# z#VhU1-iA~DP#D0R_Lt)=@#YzMiFbmMU!&v?kB~pca4DZ9hD*I(r1a~2JUK%CT*b8? zZd9E7Aoky`^lSU?i;#cBaIybM!^Qr$lzwgh2NCjLDX#7RnRyy)r}2`kYo!dt4uX__ zY5&_Y7x}3?0HWXSp+Nb2AKsF`J1IT7yzQyDEG{ zIO!mJDa+w$wb2@(|-jd$M5%MdU+ji^&5#pr+m@()$FUdzFvHd(y#BAxJ7Xt?`p-#|I)AB!(7rO_2@|>FZJjd zBcGEAWeDq;ll>RqE$RJP>CyJI9ZY9&IgT~SXE3*Z>#XE2#Cf9s4(3!ow~|5*Zz%a! z!9@P=ioc=wuZrvb^ync$q18V(f}h8n{5ctKYEvj&Y`8o>?@Ghjo$dza)(?MD@>8H! z%Fq4GZTWdZab14iQCz3D)lhG4WBV!hM|D&@0TJ=%u8J3dOF8LbxZFS7FMT=Y*? zT$i82nM=79Kg?!s{ZOsA_QO)8zX`2D`0NxU7gaS?OCGa@xv31`FLi8`~^z>LY40~D0xbk5A+0-f6hR`>EnOy_=ZZ^!~`)rZ;6c5`#cor*|*KXX2Q|JDRy|C&w|j@gAo1T&(oW zR9we z-4)k<=*L|AoX>tfSjlTWCCtfhuPXf&M$ff7;UL19N{^2B93#JuDPWcUvcfXhZMhD+4DMcDTi4&M&TpFWq!9s@mk19x_)6U zcAi2BM`+CxG}>K(x5)3#T;xw>`R+;s;jm zPBc6VaZotRaPiNThV!nw&hVi@jl0WmD$^9!87}%?H(ca57%uw%rnsJ8|3h)oA?f|a zaNc#T4)A9A@~`tfBZBXwcmk(NzVFAJ;?wOf&Bw`# zYdhyCuG_s@=3;*?Ct$JRazD&c!)4uXh2i5_&*g^aGr!*O&dl#nT<6!l%*Ah#Uu&7$ z{CY`o?T5`uKh-a(kL?Z$29TbaiVtN@{?Yb~U~cWnS9)~$nXI_Br%G`h@0rYPyyq~t z@m`_y=y-2XT*v!_;yT{yGu44iD3OaINM|2u4+FIV{YRe z%iQLBq2fB;dCVzY`ujK+G8g@S?g#;dKW6)n7WQ1rT;%5lF?S1dvPZ9jt!8fhc^`Ap zBj0~~*l_v2t6O} z59ZdMy_FuSk20PdX}F9(^9&dHV#CkO4E7xx!E2e5Jq>tEJFtkk*#A?zpywK+M}8;v z2IiD6YlEo&f18n)=Q*#AkpHWZU%~c2Xyh5YHO$4%HoWfry3#}TbY+{~G4kD5{zK;E z2R+XGLg}IUBKH4FalQWBc65k{%ER4w%kz;s87_KuVorXWjJKq#tCH9D4`5Dq*5NJr zwO@pMK?I-7ocyNq>p13Q&sMx8{88!A>Af+6|3z^s&kH$W_ZpsH{)FKtGXIb{rB}CO zzcQD6m+^e+m|!u$K=AUq*vOpA-TaL;(uw!hB3G8*nvh~ z>hI_X`2r&^?brk(&&Axmqqwej|6tw<=IVJzue@MCrHk4P$}3mPdGee1r}MaQp7>Mzv!~(W=gG{e{M?PV_-%RwpR4ptf&7o$pUyYDUuv*p8FQO2 z=ST3%Blv@guTgfs$Xxt(C)@Le;bPDCN{`Opt<1>}x*d=oq8I(r4s^^9>7#V%c3@Y< zbvtk?bE&7|=hv0|Oz09muAoW3=4Ub&J{WrmCVZH9|I zKQR~oNPD&Oq+qAmBjx`_<~Cot7ABYP&z$sAyHr6N2r~_*-v^~|mf`m>Pos;J2sYjo z5&U-M={QHX!%s!Xk0K!itA7b|v3~>GbG6~A6cNHhhF{k{@Fxuadgs9RB&Q&V{x5b4 z`$dM!bLy`#Ji&S%HvBQ>J$Y~@`bRKdX?Qp0pD?$6_!o2Wr}R_XO%3*1`C$?KSmso& zp21tnRTXowQ`+;Bm7a^0{8@@GP<$hEDYv(E!a;yO%lTi}qVT8uTDo{~yR)^!&vF=BSWvTkm#^;G+#+lo`&?kKmIGmwEjOim!!=4nd7OmpSDZHObQ7 z{Z(;lN{``qA7gIQ^}UfFz~kypM~8@{JQT5>9?Wfh+?TnOlXg767-{sBv!1br%XNVX zhReFg5r&`5dddvHnE7#r%lM(5xwU_#k^h$UT&3i7yRn|Rq*s0i>vf~&I@a?yrAN0L zKN2tB77`G;Blq6qm_ zM*c;Xzs>NsnBQgiN6gno=zmek7pio9rsOXKmv(;p=^@?ZPd$Gh$6Wl`hWptfC9m^+ zx{)8j^`%-?=(T-$T4(UZ-3?pE?z&%;Vyr}s4_ul0AH5z;H^I)wG_&D@r&BE_le z7QYoM{)*zq8T~u6-i{>$+e{l^)3(Z9^_ zRc!zHhWCap3YX9HAC2SouG@$G$C=xBKZxKzDNaqA*x9`pI|$Yf{S6m?jx?O|j6$B_ zLj!i>71#G^9I1E_WGNjKN(>(ru=_J}sV{GEeR*2R>+$OIMt(ST1PHG(r}%WaeP8hf zI41u2Rp}=?B_GpfVFy9{CjQyea7ot?!$r?X!$r?{=5)T!uS<+P*+k(Q!^QtME3W;2 zuj1POj~Fig|I%=Y_n(GKyuT{0`lRkj(11HCEihni{J7M7rz~CxacV{T5Szk}go{~m^mo}Pw_o%r}(V{*{J{ zA66MIcCKMgdRO8tRj z{;6S3>DBe|F(WVOT4%VV>m$QO|3<^b{vQpO^lmpNxgRGJ);@S`U8ZLGo z#9aF2*5nX`W0=#f9?vgPT>I?`#jn6QQhqiV{exNm7luz~zUy3yJ(O>)f2iVGe;ISJ zU-VZQF8WVnPUUT~k171SNOA4A>kRL}=iI5d{yy~+itBuNMR6VPCyMKMzcXCoO(_os zNPXFn?b$wpXBnQw@&gT*@|??@vSTIQl8=WNdC@c3aM80QLQj1JUt#pb+0H8r@6G&1 z!(|+Phv5TR{z1ccVg9(`oteL2IAiyg;qCaq-o5l>T#+{*6lhRmFc*T-(`W9)u9cPOYaOb6d{GD0!W(eCBD;L+d$`uEUic zovvcVb-I=qJ^flk8A83`!CHKdD#y}egn&IRr0z#r&f4(G|rd5WBHDTmoe|kobpk}+k-i!>ob+!la#!U z_jIFQ?%z1i@KZS6tCSuc?{!9A(tER#*YVzM^^^b`YfeOZjZioc#YJ-cqgx8+q}=FeR`3aFCIgeE*Y@*Y$cmbKCyB zZuCe!{Z#4E_4I4Sbv@0fq|}CSi0%jXS6q*a#zydC6kh{<;-8Zge_8PXRoFowf5u`> z^7|{^EZzt{UGX*0CGjp&T*rH@;xm=}YUb9@_b`|8Abx&Q>Ct|EQE~0(Pn3Qd7g4$? zd~5VS!{zp$N{=o-4MzSgmfy8H=p#E1#XGZG*zch@wdc~$_GV6YX#IngJdM+4;!R;# z1Rte1>6d;vM{&}#I+L_GcL;NeSNGRbjQmUzMmR>v(~`X8?`$J4`Y&Qm`AG5Jnu&i1 zS1CQOU|;myrSy>fa{tv@#kKvQFgFxxJ z8*kxvMDPcgOSzT%-_{u}_o2OFxcK2c#kC(kWls6{va%;$gB=8kSH@jEnUnkqyv6?g zjl7iqY$dPDXTFh_@_(q|67La8kB+z6$VA2ncMt2in-V+^{d3_5r58A zdbB@ljJ)`Bq2k)kWlE3sbG?$EqU^sw$!kAfYven$!AS_WEBQL?OZmJ@$!mM=i{P&) zJ_UNj4{tIje`-H`VdTXRKPh>g-UcHt`PDW7#RxXP_GB*kRhk*(dKx~L`TmAiFwZl* zn)wCH)1h{2Q0@P3Wlr|2#9RE?kDQA@{4l(Q&sKbm;x|O_=b1~o=CM7Sm`nRJb$cj7 z_*&`F{{L5md~52w5y(zG4%u08y7VXZ4^jLT#S58>J$rF^J5tHNt>i0=yx4!7lGpYx zj*vfH$!q%`GV+7jo{kG)1OlaZ4c?NjLCnQ|v1dOeukFc+ke{IB-&FdiE3W-{vEtgF z4@B^nnOi&GQ1aT&4K;B)mIFc zaqmtiH`%ZCcZ=YAGq?H&8ZP=DWNz#AtIQ?6KXQ71jgUY3lwhaCJEL9LKi=?*m@i{a z@lx58_TecbFaCMia2fxk?p?XcnDI9)k_$02^ zA*U-|gkv&pDK%WiC*{n=o`<>ptY%K}U4XavXQ9%g<2_BuyI7NaeT4i)O8!En{|`!@ z?62YmVx!^mJf{6Dut z(7Vp?^~^s|de*6UKUZA$n(ppWd=@n$fWc*k(OJ29ttb-NLd(9=`t(eVz6kRPt( zX`HZt;~mG`rgtgxbjZ>;vp4tq3(vt0f-OHcNAUg5O)fttf?pEB-(+sf^NHsL{o+r# zj&mw=vU3IAQXW<_r*v%%r~3bIFem-g&PY4(VFdr&aA^lp&JRj$xy?{~Ekrs5G1ry3 z*f0IyHA-HW|363YzZyL$$l!rVt*!emIyZA_hWAJ{h$aw)^N%9S&HlY%DyPX zYyCDpf=^{Gev|YbX}I`vp5Y>2W4QR|BIeefs}-LNllum<-HnEKr4tbjq{4w<^_;_8 z+70=AyOqo(U2+}pd}?G7D8G)uTk`9E#a~nWF~#*f^c}_DRr0?oeud&)F2N3h*dyz} zapq*tWq6A{eT=-U1CKWR9&RTmDLuNsD>CvAu>289UdMa9;(t)~oN4sD!g?-J@;ctj zjJ&jytCYNMC+}xY`Ah9pSG*}aYxMNkA@J9fo~MDtZ+}yIioj+3nR#hAuSI=iPVthw zjNft$mwGoz@w*`}@gAkPZg0z(OTJ5e`6z;a&fK<#T`7|gM9;_U|6a^Vo|+=DC&Ap- zmn9Lr-sqS5eyibP|DA?QeSe5K*`wRTw-tX`+4+&;Zz|rF3LgULc@l3)*Devf2Xpby zx9pz*O1@6%8OL1mUCPNs!=*eNWw?}w(+n3qTbSGOw)5pM0zu-Het*vh-pg=_ceLWV z9FAu$e#mGW;ycW6xsHDnbMiA~h4{I|$jf#7rOa))I@icg;d*+Z(mzY-|CG7)Pg`m< z5y+l<@fLe_P`p&}MT)8K?d}Fxi`94BVn?E8k2x9-i ztS8-Y(UZxX{H*Qi!JNvKZvRIaJ<|S+>x7c6L+}5v)BluO!#sAW7UuU?q+rKim@%Fx&tZ6yE8XCb5U~c0b zZMejHIddEDs}cG?jNluMeo60FhD*F#BY5jol-j0pEB#l;RsTY}jTCgB8Ns~zvI>}5YlQcnOhua}al>jX#AU=%9r5jKJ z6bKh(Ky(KIja(!^fo$Xw6ds~@-1VX0S?m3MSF-YLe}A3#d8RY(XV$FW`d!|4-pr(J z!c*(n^6W)!@t-EQ_(RAo{wTPPgMWWKKH?`uydG}j|4kfsr@454KL0kwpM&@oayx!k zx;&4irq^c=#b1g%-*xf6-AgEb5b-}GxAV_cE{|`wMDh0ib(4$t?f#77?fvUsayx%M z=<@h>|KQxu*DDc!E8_3N^|)RtH+vud&QD}VHk-$LFg|^7T_?U@8=P;H=j^=kmx%9s zgJuus86STWoX<;tgKM4l$jv^-+w-TICHy>lirm-Z`f3qe>-?qMte&!q|3KWfH{qIJ z$HA_D-i!D@$Zgzqy)k6eJR9U@?Vbkbe*IrK*ZKFGLLQD^aC2~tKg;Dm2F~-f$i?61 z;!kqk?R+Ji$N72}-{9h(bn*W4y+6RM9{c^hahFGbB(?GRvvXh1F1JXKY}(%jxmo-% zaIMp~y9mzh*1J5u-7}s0cDtSHC84!@16=1t*IRx&`9rop!>!%Nw-5eTmuFbW^8C~J zTIX}uhu3kxc7t1f8_)gVIzGN%2RrxuI+yaij5;rH@xIRQJNI>-|DT~wtw%p6vG0r5 zkXMGV)X(ACFFn5O--+4?=lOjfuH&rvEzh>M%8qOtUj^s*gCg4fu}ooF9kt;kFJhM#C4A_rZTg zZtM0}8JbJo1?P50;nuF@ zc{P&fU2=U0lePMjQACBJ07bsFIU64o}0;O7+q~aGZt)Mpx!s9~@Ag2bhvN@|^ZGwF62FAvteuf zm#vc*BEFM;*d!Z|&ytA$4sPwHa9({KZvC>)X%{>k@|$l!{MX=?ryhPO#lH?;3)k@( zk(;fbhbev(@tet?gYQ?KS{0_lC@#xI)`3L+9&W8l^=``%;`xqZLW3Fq;=)cH%U-9hJm{BMc) zi_Xg~&%4fjp1F@nkZfGfUJ+m5yezM?@%f7LKR7=NZsYS9=DnZX#_dXSJCEJz@?Y!n zzX8|zDms79`BHKF|MCvfFJ)z$Bew>*S^X!%HIHAnUx!=$cHQ`Gm&dRF70&(p#d&Z$ z9_|09zL4_U|9}0}-$)^{X+8JI&Az{w`(LVC`u~ae(IZ=re=g#w--dXt^Mmj(`SSp{ z)}!NT-*pc4FlZztW{p57K zU;o!Te?~%VJ>2cwueWz2KKH5V{Li{Pdpck1ycW*md^()RIUVs9avSFho%?aV&beRb zKY{NkH7=2xt@9zcjMU=Hh++vz?Dg+qO>5aqjc4bME7>g>%1daPhv~yPf+yk2v@3PQdv* z_AcDowfWub@~m_H+V1zVBb$!1pWn|r*Gmi=hb}m;=T}_(qb`2dsO-q5`O9*%Jp047 zPJLe<&^Hs=YF)fuN?ZJK&i%Zv#OpM_KkmAm>szAbxzo8H&nF_j+tc!5*)+dDZyX1= zu*yePlt<7&6=doGQ0rx#{*dmuG|QTRpS%V3tkmY>=Dzei2^`=W+NN+{VF<-?Lnv zbuNF4b3ZSa!EJq7J=eH+zpj4k;)^c-v(A@_+q#=R4Ofntw0iCFf-qe~)uLfX{k)&_qBJI(=J)4~Z$`WUZtdF7O&N0gd9#cBUwbCarPh$!&mGso z?YwP2r(93*AOA$i^B(!$@Y(u9tZZ7RzK`3_*Hv(xcRydBb6%F`Z2T8F_wfxbzh8%I zo$GqL2=$a)9>0F>j`%4X<;Ak``g|E~<9|8wzwP3E{#{=Vc{JYF`AImB!|4&f+_}%c z*5%j!UWa-{$nEo-XCryGdnMG#>u}eIe+q8nVC$`#+}7vk$!|iPOW-^XIp<|5&DO(Z zl*c|FxRTu3eT@77v^(nZ`|;f7)i4g)FMWTv&u@2iuH$?Z^6UfG`hA{5oj)(nS^dXG ze5v!Yi*Ix8&r7S}TBkq0e&FJLyEi)b`R{e^;~#PPwZA8#zfZY%-`~GdynWs~XIx$^ z8`pWnc*4o?<=b5p@nz1-@=_bmcISS4{po&H;r%BJh5EH~>{wR7LEL*P7~$Gdpn?wQVg{;YE!zuM*3{$|kMi(I_# z?@uV+=6!>6zdqk|d3?Knjd;atQiN_pZ{yl%aYH=IqlrX_rh)7S7973 zaq)f}u5s@3+!*l(o%?!5o%?>h4Ci@&-^KfOcl?udQZ^p9dCq-&O~k+Cye#=_+`j4D z=jn#qxY>EQkKE4NYv8jbx4*8wg5vG^ssz`5t#kF<>fB#nJx_V;-^JP(@&9&t23`Jl zDZUohr8~SXL9$tY?fQ0i=cmZ?wfiPvscN{^@7K@%E?$p2`~PKDlGpDV@)TU2VIiBB zUbv3u6V5Mo@&5Y%dzAmqPlWvIT)ck8YWbg~cpJ|bBL0fYT^`@=XDR+Fw0pdZ_w8n#U+L;Om-3t&%1&MA;-7QzS3383ZjAVS z&iy)n49>^P<8T`v`+jXKl4stVp**{~_{xncV6;DdP2T9)|{szXJI$aPfW~ucP>T5dU)*@7ME_&i!%m zBIU8;>ophekFP&d{QYQmvy1ob&YhSZXW#C=&V76hoR7Q1;5ILI+#MImb27z0ggTod z@z=oZxTwc*@hasxdymkcH(eh8z7U?3f5TfI==GSre^uZK^CR)TR!M$5yo&r(cs2Ro z5I8^LwGm$!@w$jFj=1(wH|v+xvn=oy-VpKDi032T6Y;)?_eXpn;)CR8VEjwuUGVkf zYv4oVZ|)vonEWd{2Pl)z{#bw!avSH-h>t~lJmM1(pN#mXh$j;+&)Ir-Z~G8fp&*<2 z)!T*rO7i{C-zxH4MToB^e-QEW$+w*w;%mum+!jW>j{K#{kY_P@2KCpIkHMFb-;eqm z$iI*HR`N@5{>hVD{XG%yi+F#;2O>Tg@lwRsliU0bk-vj}4U>0azRKhm=m}r85po-c z(TIich(v&`3FE`6mp>Jriu~(8mg#K2M-;MF9Cb#ut z|8Ae=lMGFZ`k>t{8(I1){|d= z_+{iao(<$nP-iRokB~o4o`v_2zm7b8lSnf$%a1Ro(^fI3IXUqzlV^0(pR3ugtdBtIEmMZOGPP2LQjPo9U@l0OSyNPZQ(j{KkS z#pL^bJJerK-UnYsem%T_{5E(i`Cafl`3XIt-5&C6Z}2|yGrkkNKjH)Aw;|6U`MvNG z`JDd<`PY+w20lc70(_YK-0y}w<%o|&d^F-?5g(8E1o;`LbCP^Hd=vTe=ZE@J_<7FO z{|^vfK|TntB) z&JpsR^_Q4r8zrxXkCC^+$H~8UPslS7@k#P;B7PHj9-i7hG#; zfLD`$_Wsb`eDXZJmVD!Ih+jy)4qg}W#SyQM__ByMM7)*U>dceBfPUHEH??to|AEl2 zK8kOBFnE8&2gtWa{2+NXyhLv8t|$N7FG9OR5g#T$jU zljP^3&Q0W5xcxm*o0pH^75Mzme5Z#)e=Es91+OCCh&G9Kqxku6g*=PNE#AH- zv^+na2=U7(-n@al5Am(!_rmiL?}>O{#QP&Y5b;6smrzfM{2h41zMF`AioekNPZc-M7|cjp1cGfBEJBM<82R(?aq?H;6Xb8hC&~W~-$ec)Jhk7<`JJM&1l>AYTP_*ht<6Xc(Q zPm&)9-$efJ@YJVguK%yYE65w+mE<{i75R7J)#L;4`Q+E({98+Y1L7Bw-vO^9e*nIi z{5SA=@)zLC$lroDkpCUtO8y}{Pd;aE7~dZ9o#B1td%*k2FUR-{kbfHSgXA^v68Vwv z_2i4-L*ysJhsiHRJ!SG`h#w)(z(>jR@G)}x-h7<=Lc~vye;+;YXJ)Sd z^U$vf^1BdUNq#T9iu`_fHTfg(`Q-Q7`X~Pl;_LRGS!V^}7n4`Q>&f?mFC*U<-ax)T z-2NY-S<<{-|Jd(i=PBNifHf*8@~J z_wzeH;$?E1_tA*A>V(T?^KR>*C*qZ}XU5y_sa8ka{~m(YpTh46_}?o~xAo(HPe6SK z#QX34)jtle+(vd}v-)ja%_pxyd>y&1=Vj#kAwExj5WJt<&XXnb!x8Vlch>s92>0J3 zs~-pV-wUhTc{Mdhc4V{uE=GJ6xgB@4o9WUF;j%+p#cHXEaxAVqAayxI-liT}ID|sGu_K~lK50ak? z_uoTl{TIUh_e$z^zVhD_sb7KkYI&@i9%lOahHZH~Ft6J?z(ec{0*sT_9vWaCj(5v5 zdRXu}^1j1^FC{O*?R;W+hT!K>d>LLMFMU4b-#}h@L~#3kJj-7V-(5jA^VE@Hzk$4R zVemENd3XxPujLuV_s+YMPr~gyWAT+ohx|(^z64)O-tg}seu#V=K2F~7#Sp)ld@Imr%_%L~0bI9`~c|F{|kFYu?;hQObAQSRb;{wIv>so@JOkTet_!{z5 zYjFEK+4A(kH&Xln+&%}k_!4{$uJ6o;;8o;hxLw~_{3zT$cQqe}FQq(_@K*9vTj-a) zuUei;_yEOM!*3^_gqO)v=Y;(B`^%O;53j)Q6`BvhPaw~)40#5~YukgbC$ERw?*&`_ zKKLlbm*DS^r#eFZ3Vfbtd8*-cn3{cUrrX@G*+7#2e{m@;>-N zeBNVuQiV{@#pIRveUd@)I`~HN+P;uy6Zt57-p9i8*6z>+VZWAq9DWx0z(pbccJhYH zf>+|_SIeLOVeqraC-pCZ$yOxKUm3haUU^mU4dm7Eaq>R+yj{ZUte&B@VgCg3`gOqv z$osAdek1t+e3-lpuc(~a?qn(K&m&L$BzP@(1Kj?7KC8d}<`6$X@qO@z$S2_wOD{l|}7MY$I@)XI- z_XaPK*WVX>gnS%+@NVIG%U{OtA=vLJoA*5!;)W=`9^dazkPqPd>-ybi=C}X9zMp*b z(GYhXx&3=MsXb=qDLoeUYsvG!4t@gp0KAX9dL+cJB_D!sARqW`h#w~(g;(wwp0{xu zdLryMke8ndULvpjeeie4?ceu18GrBG@>f3{;)~?TKei`NmB>rag!m2QW%wBRz_TH~ z0w17QyZPsWFD0*kK6np#^;qyVBV)JlbPTXVXxP-vWfKGoZsUf$Kxk}0G+i;Yby)9sBtnkwCqS)E#uDP}sl zQ-xfvsI`Yu1k)<%gsj$?&*vMH4osugKfR~rCwtO(M^7=;+$2eh8F`eHJ^e`AO7=Q( zt(j~-JgzBZvW+#PPAqnVhml5kuXWKd@T6UTZa+M1%``U4gxdOG(()u|kKcu`3(uZfec7HDzXy7HJ`wp0;GT+B)Pund5ZwP&0-HQlq4n zAx#!$SCc->Hzs$QL>{EmJu=!lr-i0)*P-_<`L1GTs->;aDQluLm2C|7HOo6Y!@PH7 z3WZLcs}3DAd6H(6LcsacB#OlUEhYVNJh93028F`3c3|n_&wo5db#dK#=V@G;2rX5BoN6E~*{;sknL*8&tekUZT2mpT(-+QC;iWpi+P~IZHaS30QD&7ao}}dISr^k; z&E|3|yYjMp^e_*PrK_?eq~E$4in+WdoN+2t)7R?k=($4<>S@4?CN?$v$zC!F&0X#J zR3WoM4yo`OnO;5o@?q@4*oP-JZ^=+OJ+`UeJ5Pd+-d(bWk1Gch#jtColTWL)IrQ*3P0 z(?fF732n;6$y@7`O)W$p6V@6eDYz?}Mdeu;wZ_iQOra>}ineU%c~(wSQ=Qhw@}m6m z!b+L*WcBcY5?+<*=WqfBNI4VC$h3uqAxO({(wZFCQf;T4N1Iwh2bwd>yH=!{!d*B5aRsG5 zwS3(3Iz?_boY7^lb}?`m>Y))^ipW2@5=`t2}T(&3sSc})_T zkz*`xgXDsde2XNSdFrs4PE*XSSRvaK)`}#z_fowovKUllP*I7Ja6s zMa~8@L-eV(6*J8aT6qyHr z`HB!YwQOcQlhlFJj=q_<6f&qKd89{E@*tU>K;h>-dB;fFm%~OLNLXWD&(kSsu-Q+h z?#c+|+d_D9S(jW~%DRS4uYZB0pstS2#_mjbg}z7C=pV8lmae?t%NyWI*-wIX{Ba@- zpu?J6OE;y`Cw?O>7uDf`1U995+LJ{VR=0a7FVc&}RF9rv;yykE{Bn}NDJALV=7yJwKnFUiTCZFr9Ss-bqUb{ec?c}LX)`p+#|Ns76B%j-E zvy~J-x0oALRBJ&liFZ8y~+gGPt^K}2XuldyYWq6I-2P2y|4?fH_Y3z3?c3*i_H@ut zv)U>tTyt{$lLv=L`+VA7&*Rq?Y2RLtuV3utQ+>5QKP27MmTIRW!h_9d|HtH9|6KWA z&&-EjbI8_o%h-YxD3N(yKP9|=2%o1}ZX18wZ -#include -#include -#include "include/defex_caches.h" - -extern struct defex_file_cache_list file_cache; - -static void defex_file_cache_update_test(struct test *test) -{ - /* EXPECT_EQ(test, 1, defex_file_cache_update()); */ -} - - -static void defex_file_cache_init_test(struct test *test) -{ - struct defex_file_cache_list copy_file_cache; - - /* save current attribute status */ - memcpy(©_file_cache, &file_cache, sizeof(copy_file_cache)); - - defex_file_cache_init(); - ASSERT_NOT_ERR_OR_NULL(test, &file_cache); - EXPECT_EQ(test, file_cache.first_entry, 0); - EXPECT_EQ(test, file_cache.last_entry, FILE_CACHE_SIZE - 1); - - /* restore saved attribute status */ - memcpy(&file_cache, ©_file_cache, sizeof(copy_file_cache)); -} - - -static void defex_file_cache_find_test(struct test *test) -{ - /* EXPECT_EQ(test, 1, defex_file_cache_find()); */ -} - - -static void defex_file_cache_delete_test(struct test *test) -{ - /* EXPECT_EQ(test, 1, defex_file_cache_delete()); */ -} - - -static void defex_file_cache_add_test(struct test *test) -{ - /* EXPECT_EQ(test, 1, defex_file_cache_add()); */ -} - - -static void defex_caches_lock_test(struct test *test) -{ - /* EXPECT_EQ(test, 1, defex_caches_lock()); */ -} - - -static int defex_caches_test_init(struct test *test) -{ - return 0; -} - -static void defex_caches_test_exit(struct test *test) -{ -} - -static struct test_case defex_caches_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(defex_file_cache_update_test), - TEST_CASE(defex_file_cache_init_test), - TEST_CASE(defex_file_cache_find_test), - TEST_CASE(defex_file_cache_delete_test), - TEST_CASE(defex_file_cache_add_test), - TEST_CASE(defex_caches_lock_test), - {}, -}; - -static struct test_module defex_caches_test_module = { - .name = "defex_caches_test", - .init = defex_caches_test_init, - .exit = defex_caches_test_exit, - .test_cases = defex_caches_test_cases, -}; -module_test(defex_caches_test_module); - diff --git a/security/samsung/defex_lsm/catch_engine/kunit_test/defex_catch_list_compat_test.c b/security/samsung/defex_lsm/catch_engine/kunit_test/defex_catch_list_compat_test.c deleted file mode 100755 index 9ae8755b96c7..000000000000 --- a/security/samsung/defex_lsm/catch_engine/kunit_test/defex_catch_list_compat_test.c +++ /dev/null @@ -1,1030 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include "include/defex_catch_list.h" - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0) -#define __COMPAT_SYSCALL_NR -#include -#else -#ifdef __NR_clone3 -#define __NR_compat_syscalls (__NR_clone3 + 10) -#elif defined(__NR_rseq) -#define __NR_compat_syscalls (__NR_rseq + 10) -#elif defined(__NR_seccomp) -#define __NR_compat_syscalls (__NR_seccomp + 10) -#else -#define __NR_compat_syscalls 400 -#endif -#endif /* < KERNEL_VERSION(4, 0, 0) */ - -#ifdef DEFEX_KUNIT_ENABLED -#ifndef __NR_syscalls -#define __NR_syscalls 436 -#endif -#endif - -#define DEFEX_CATCH_COUNT __NR_syscalls - -#include "catch_engine/defex_catch_list.inc" - -static void get_local_syscall_compat_test(struct test *test) -{ - const struct local_syscall_struct *l_syscall; - - /* T1: syscall_no >= __NR_compat_syscalls */ - EXPECT_EQ(test, NULL, get_local_syscall_compat(__NR_compat_syscalls)); - EXPECT_EQ(test, NULL, get_local_syscall_compat(__NR_compat_syscalls + 1)); - - /* T2/T3: If defined, return syscall. If not, return syscall_catch_arr[0] */ -#ifdef __NR_rmdir - l_syscall = get_local_syscall_compat(__NR_rmdir); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_rmdir); -#endif -#ifdef __NR_utimes - l_syscall = get_local_syscall(__NR_utimes); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_utimes); -#endif -#ifdef __NR_stat - l_syscall = get_local_syscall(__NR_stat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_stat); -#endif -#ifdef __NR_lstat - l_syscall = get_local_syscall(__NR_lstat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_lstat); -#endif -#ifdef __NR_umount - l_syscall = get_local_syscall(__NR_umount); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_umount); -#endif -#ifdef __NR_utime - l_syscall = get_local_syscall(__NR_utime); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_utime); -#endif -#ifdef __NR_futimesat - l_syscall = get_local_syscall(__NR_futimesat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_futimesat); -#endif -#ifdef __NR_uselib - l_syscall = get_local_syscall(__NR_uselib); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_uselib); -#endif -#ifdef __NR_send - l_syscall = get_local_syscall(__NR_send); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_send); -#endif -#ifdef __NR_ustat - l_syscall = get_local_syscall(__NR_ustat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_ustat); -#endif -#ifdef __NR_getdents - l_syscall = get_local_syscall(__NR_getdents); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_getdents); -#endif -#ifdef __NR_recv - l_syscall = get_local_syscall(__NR_recv); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_recv); -#endif -#ifdef __NR_fork - l_syscall = get_local_syscall(__NR_fork); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fork); -#endif -#ifdef __NR_vfork - l_syscall = get_local_syscall(__NR_vfork); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_vfork); -#endif -#ifdef __NR_sigprocmask - l_syscall = get_local_syscall(__NR_sigprocmask); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_sigprocmask); -#endif -#ifdef __NR_sigpending - l_syscall = get_local_syscall(__NR_sigpending); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_sigpending); -#endif -#ifdef __NR_sigaction - l_syscall = get_local_syscall(__NR_sigaction); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_sigaction); -#endif -#ifdef __NR_sigaltstack - l_syscall = get_local_syscall(__NR_sigaltstack); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_sigaltstack); -#endif -#ifdef __NR_sigsuspend - l_syscall = get_local_syscall(__NR_sigsuspend); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_sigsuspend); -#endif -#ifdef __NR_truncate64 - l_syscall = get_local_syscall(__NR_truncate64); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_truncate64); -#endif -#ifdef __NR_ftruncate64 - l_syscall = get_local_syscall(__NR_ftruncate64); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_ftruncate64); -#endif -#ifdef __NR_fstat64 - l_syscall = get_local_syscall(__NR_fstat64); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fstat64); -#endif -#ifdef __NR_fstatat64 - l_syscall = get_local_syscall(__NR_fstatat64); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fstatat64); -#endif -#ifdef __NR_statfs64 - l_syscall = get_local_syscall(__NR_statfs64); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_statfs64); -#endif -#ifdef __NR_stat64 - l_syscall = get_local_syscall(__NR_stat64); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_stat64); -#endif -#ifdef __NR_lstat64 - l_syscall = get_local_syscall(__NR_lstat64); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_lstat64); -#endif -#ifdef __NR_eventfd - l_syscall = get_local_syscall(__NR_eventfd); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_eventfd); -#endif -#ifdef __NR_epoll_create - l_syscall = get_local_syscall(__NR_epoll_create); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_epoll_create); -#endif -#ifdef __NR_shmget - l_syscall = get_local_syscall(__NR_shmget); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_shmget); -#endif -#ifdef __NR_shmctl - l_syscall = get_local_syscall(__NR_shmctl); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_shmctl); -#endif -#ifdef __NR_semctl - l_syscall = get_local_syscall(__NR_semctl); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_semctl); -#endif -#ifdef __NR_move_pages - l_syscall = get_local_syscall(__NR_move_pages); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_move_pages); -#endif -#ifdef __NR_lookup_dcookie - l_syscall = get_local_syscall(__NR_lookup_dcookie); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_lookup_dcookie); -#endif -#ifdef __NR_truncate - l_syscall = get_local_syscall(__NR_truncate); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_truncate); -#endif -#ifdef __NR_ftruncate - l_syscall = get_local_syscall(__NR_ftruncate); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_ftruncate); -#endif -#ifdef __NR_chdir - l_syscall = get_local_syscall(__NR_chdir); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_chdir); -#endif -#ifdef __NR_chroot - l_syscall = get_local_syscall(__NR_chroot); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_chroot); -#endif -#ifdef __NR_fchmod - l_syscall = get_local_syscall(__NR_fchmod); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fchmod); -#endif -#ifdef __NR_fchmodat - l_syscall = get_local_syscall(__NR_fchmodat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fchmodat); -#endif -#ifdef __NR_fchownat - l_syscall = get_local_syscall(__NR_fchownat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fchownat); -#endif -#ifdef __NR_fchown - l_syscall = get_local_syscall(__NR_fchown); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fchown); -#endif -#ifdef __NR_open - l_syscall = get_local_syscall(__NR_open); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_open); -#endif -#ifdef __NR_openat - l_syscall = get_local_syscall(__NR_openat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_openat); -#endif -#ifdef __NR_write - l_syscall = get_local_syscall(__NR_write); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_write); -#endif -#ifdef __NR_writev - l_syscall = get_local_syscall(__NR_writev); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_writev); -#endif -#ifdef __NR_pwrite64 - l_syscall = get_local_syscall(__NR_pwrite64); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_pwrite64); -#endif -#ifdef __NR_pwritev - l_syscall = get_local_syscall(__NR_pwritev); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_pwritev); -#endif -#ifdef __NR_sendfile - l_syscall = get_local_syscall(__NR_sendfile); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_sendfile); -#endif -#ifdef __NR_signalfd4 - l_syscall = get_local_syscall(__NR_signalfd4); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_signalfd4); -#endif -#ifdef __NR_vmsplice - l_syscall = get_local_syscall(__NR_vmsplice); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_vmsplice); -#endif -#ifdef __NR_splice - l_syscall = get_local_syscall(__NR_splice); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_splice); -#endif -#ifdef __NR_tee - l_syscall = get_local_syscall(__NR_tee); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_tee); -#endif -#ifdef __NR_fsync - l_syscall = get_local_syscall(__NR_fsync); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fsync); -#endif -#ifdef __NR_fdatasync - l_syscall = get_local_syscall(__NR_fdatasync); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fdatasync); -#endif -#ifdef __NR_sync_file_range - l_syscall = get_local_syscall(__NR_sync_file_range); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_sync_file_range); -#endif -#ifdef __NR_acct - l_syscall = get_local_syscall(__NR_acct); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_acct); -#endif -#ifdef __NR_sched_setparam - l_syscall = get_local_syscall(__NR_sched_setparam); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_sched_setparam); -#endif -#ifdef __NR_sched_setscheduler - l_syscall = get_local_syscall(__NR_sched_setscheduler); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_sched_setscheduler); -#endif -#ifdef __NR_sched_setaffinity - l_syscall = get_local_syscall(__NR_sched_setaffinity); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_sched_setaffinity); -#endif -#ifdef __NR_reboot - l_syscall = get_local_syscall(__NR_reboot); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_reboot); -#endif -#ifdef __NR_mq_timedsend - l_syscall = get_local_syscall(__NR_mq_timedsend); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_mq_timedsend); -#endif -#ifdef __NR_mq_timedreceive - l_syscall = get_local_syscall(__NR_mq_timedreceive); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_mq_timedreceive); -#endif -#ifdef __NR_msgrcv - l_syscall = get_local_syscall(__NR_msgrcv); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_msgrcv); -#endif -#ifdef __NR_msgsnd - l_syscall = get_local_syscall(__NR_msgsnd); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_msgsnd); -#endif -#ifdef __NR_semtimedop - l_syscall = get_local_syscall(__NR_semtimedop); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_semtimedop); -#endif -#ifdef __NR_add_key - l_syscall = get_local_syscall(__NR_add_key); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_add_key); -#endif -#ifdef __NR_request_key - l_syscall = get_local_syscall(__NR_request_key); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_request_key); -#endif -#ifdef __NR_keyctl - l_syscall = get_local_syscall(__NR_keyctl); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_keyctl); -#endif -#ifdef __NR_mmap - l_syscall = get_local_syscall(__NR_mmap); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_mmap); -#endif -#ifdef __NR_mincore - l_syscall = get_local_syscall(__NR_mincore); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_mincore); -#endif -#ifdef __NR_mbind - l_syscall = get_local_syscall(__NR_mbind); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_mbind); -#endif -#ifdef __NR_set_mempolicy - l_syscall = get_local_syscall(__NR_set_mempolicy); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_set_mempolicy); -#endif -#ifdef __NR_migrate_pages - l_syscall = get_local_syscall(__NR_migrate_pages); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_migrate_pages); -#endif -#ifdef __NR_accept4 - l_syscall = get_local_syscall(__NR_accept4); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_accept4); -#endif -#ifdef __NR_recvmmsg - l_syscall = get_local_syscall(__NR_recvmmsg); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_recvmmsg); -#endif -#ifdef __NR_link - l_syscall = get_local_syscall(__NR_link); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_link); -#endif -#ifdef __NR_unlink - l_syscall = get_local_syscall(__NR_unlink); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_unlink); -#endif -#ifdef __NR_mknod - l_syscall = get_local_syscall(__NR_mknod); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_mknod); -#endif -#ifdef __NR_chmod - l_syscall = get_local_syscall(__NR_chmod); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_chmod); -#endif -#ifdef __NR_chown - l_syscall = get_local_syscall(__NR_chown); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_chown); -#endif -#ifdef __NR_mknodat - l_syscall = get_local_syscall(__NR_mknodat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_mknodat); -#endif -#ifdef __NR_mkdirat - l_syscall = get_local_syscall(__NR_mkdirat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_mkdirat); -#endif -#ifdef __NR_unlinkat - l_syscall = get_local_syscall(__NR_unlinkat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_unlinkat); -#endif -#ifdef __NR_symlinkat - l_syscall = get_local_syscall(__NR_symlinkat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_symlinkat); -#endif -#ifdef __NR_linkat - l_syscall = get_local_syscall(__NR_linkat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_linkat); -#endif -#ifdef __NR_mkdir - l_syscall = get_local_syscall(__NR_mkdir); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_mkdir); -#endif -#ifdef __NR_lchown - l_syscall = get_local_syscall(__NR_lchown); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_lchown); -#endif -#ifdef __NR_rename - l_syscall = get_local_syscall(__NR_rename); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_rename); -#endif -#ifdef __NR_epoll_wait - l_syscall = get_local_syscall(__NR_epoll_wait); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_epoll_wait); -#endif -#ifdef __NR_sysctl - l_syscall = get_local_syscall(__NR_sysctl); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_sysctl); -#endif -#ifdef __NR_renameat - l_syscall = get_local_syscall(__NR_renameat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_renameat); -#endif -#ifdef __NR_umount2 - l_syscall = get_local_syscall(__NR_umount2); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_umount2); -#endif -#ifdef __NR_mount - l_syscall = get_local_syscall(__NR_mount); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_mount); -#endif -#ifdef __NR_pivot_root - l_syscall = get_local_syscall(__NR_pivot_root); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_pivot_root); -#endif -#ifdef __NR_utimensat - l_syscall = get_local_syscall(__NR_utimensat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_utimensat); -#endif -#ifdef __NR_fcntl - l_syscall = get_local_syscall(__NR_fcntl); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fcntl); -#endif -#ifdef __NR_kexec_load - l_syscall = get_local_syscall(__NR_kexec_load); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_kexec_load); -#endif -#ifdef __NR_ptrace - l_syscall = get_local_syscall(__NR_ptrace); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_ptrace); -#endif -#ifdef __NR_setgroups - l_syscall = get_local_syscall(__NR_setgroups); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setgroups); -#endif -#ifdef __NR_settimeofday - l_syscall = get_local_syscall(__NR_settimeofday); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_settimeofday); -#endif -#ifdef __NR_delete_module - l_syscall = get_local_syscall(__NR_delete_module); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_delete_module); -#endif -#ifdef __NR_init_module - l_syscall = get_local_syscall(__NR_init_module); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_init_module); -#endif -#ifdef __NR_capset - l_syscall = get_local_syscall(__NR_capset); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_capset); -#endif -#ifdef __NR_setpriority - l_syscall = get_local_syscall(__NR_setpriority); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setpriority); -#endif -#ifdef __NR_setregid - l_syscall = get_local_syscall(__NR_setregid); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setregid); -#endif -#ifdef __NR_setgid - l_syscall = get_local_syscall(__NR_setgid); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setgid); -#endif -#ifdef __NR_setreuid - l_syscall = get_local_syscall(__NR_setreuid); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setreuid); -#endif -#ifdef __NR_setuid - l_syscall = get_local_syscall(__NR_setuid); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setuid); -#endif -#ifdef __NR_setresuid - l_syscall = get_local_syscall(__NR_setresuid); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setresuid); -#endif -#ifdef __NR_setresgid - l_syscall = get_local_syscall(__NR_setresgid); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setresgid); -#endif -#ifdef __NR_setpgid - l_syscall = get_local_syscall(__NR_setpgid); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setpgid); -#endif -#ifdef __NR_setfsuid - l_syscall = get_local_syscall(__NR_setfsuid); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setfsuid); -#endif -#ifdef __NR_setfsgid - l_syscall = get_local_syscall(__NR_setfsgid); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setfsgid); -#endif -#ifdef __NR_getsid - l_syscall = get_local_syscall(__NR_getsid); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_getsid); -#endif -#ifdef __NR_setsid - l_syscall = get_local_syscall(__NR_setsid); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setsid); -#endif -#ifdef __NR_sethostname - l_syscall = get_local_syscall(__NR_sethostname); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_sethostname); -#endif -#ifdef __NR_setdomainname - l_syscall = get_local_syscall(__NR_setdomainname); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setdomainname); -#endif -#ifdef __NR_setrlimit - l_syscall = get_local_syscall(__NR_setrlimit); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setrlimit); -#endif -#ifdef __NR_umask - l_syscall = get_local_syscall(__NR_umask); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_umask); -#endif -#ifdef __NR_prctl - l_syscall = get_local_syscall(__NR_prctl); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_prctl); -#endif -#ifdef __NR_getcpu - l_syscall = get_local_syscall(__NR_getcpu); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_getcpu); -#endif -#ifdef __NR_kill - l_syscall = get_local_syscall(__NR_kill); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_kill); -#endif -#ifdef __NR_tgkill - l_syscall = get_local_syscall(__NR_tgkill); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_tgkill); -#endif -#ifdef __NR_tkill - l_syscall = get_local_syscall(__NR_tkill); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_tkill); -#endif -#ifdef __NR_rt_tgsigqueueinfo - l_syscall = get_local_syscall(__NR_rt_tgsigqueueinfo); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_rt_tgsigqueueinfo); -#endif -#ifdef __NR_rt_sigqueueinfo - l_syscall = get_local_syscall(__NR_rt_sigqueueinfo); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_rt_sigqueueinfo); -#endif -#ifdef __NR_listen - l_syscall = get_local_syscall(__NR_listen); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_listen); -#endif -#ifdef __NR_accept - l_syscall = get_local_syscall(__NR_accept); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_accept); -#endif -#ifdef __NR_shutdown - l_syscall = get_local_syscall(__NR_shutdown); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_shutdown); -#endif -#ifdef __NR_shmat - l_syscall = get_local_syscall(__NR_shmat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_shmat); -#endif -#ifdef __NR_shmdt - l_syscall = get_local_syscall(__NR_shmdt); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_shmdt); -#endif -#ifdef __NR_semget - l_syscall = get_local_syscall(__NR_semget); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_semget); -#endif -#ifdef __NR_semop - l_syscall = get_local_syscall(__NR_semop); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_semop); -#endif -#ifdef __NR_faccessat - l_syscall = get_local_syscall(__NR_faccessat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_faccessat); -#endif -#ifdef __NR_fchdir - l_syscall = get_local_syscall(__NR_fchdir); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fchdir); -#endif -#ifdef __NR_fstat - l_syscall = get_local_syscall(__NR_fstat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fstat); -#endif -#ifdef __NR_readlinkat - l_syscall = get_local_syscall(__NR_readlinkat); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_readlinkat); -#endif -#ifdef __NR_statfs - l_syscall = get_local_syscall(__NR_statfs); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_statfs); -#endif -#ifdef __NR_fstatfs - l_syscall = get_local_syscall(__NR_fstatfs); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fstatfs); -#endif -#ifdef __NR_getcwd - l_syscall = get_local_syscall(__NR_getcwd); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_getcwd); -#endif -#ifdef __NR_futex - l_syscall = get_local_syscall(__NR_futex); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_futex); -#endif -#ifdef __NR_perf_event_open - l_syscall = get_local_syscall(__NR_perf_event_open); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_perf_event_open); -#endif -#ifdef __NR_socket - l_syscall = get_local_syscall(__NR_socket); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_socket); -#endif -#ifdef __NR_bind - l_syscall = get_local_syscall(__NR_bind); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_bind); -#endif -#ifdef __NR_connect - l_syscall = get_local_syscall(__NR_connect); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_connect); -#endif -#ifdef __NR_sendto - l_syscall = get_local_syscall(__NR_sendto); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_sendto); -#endif -#ifdef __NR_mprotect - l_syscall = get_local_syscall(__NR_mprotect); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_mprotect); -#endif -#ifdef __NR_mremap - l_syscall = get_local_syscall(__NR_mremap); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_mremap); -#endif -#ifdef __NR_pselect6 - l_syscall = get_local_syscall(__NR_pselect6); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_pselect6); -#endif -#ifdef __NR_ioctl - l_syscall = get_local_syscall(__NR_ioctl); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_ioctl); -#endif -#ifdef __NR_ioprio_set - l_syscall = get_local_syscall(__NR_ioprio_set); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_ioprio_set); -#endif -#ifdef __NR_pipe2 - l_syscall = get_local_syscall(__NR_pipe2); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_pipe2); -#endif -#ifdef __NR_getdents64 - l_syscall = get_local_syscall(__NR_getdents64); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_getdents64); -#endif -#ifdef __NR_setitimer - l_syscall = get_local_syscall(__NR_setitimer); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setitimer); -#endif -#ifdef __NR_capget - l_syscall = get_local_syscall(__NR_capget); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_capget); -#endif -#ifdef __NR_getresuid - l_syscall = get_local_syscall(__NR_getresuid); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_getresuid); -#endif -#ifdef __NR_getresgid - l_syscall = get_local_syscall(__NR_getresgid); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_getresgid); -#endif -#ifdef __NR_rt_sigprocmask - l_syscall = get_local_syscall(__NR_rt_sigprocmask); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_rt_sigprocmask); -#endif -#ifdef __NR_socketpair - l_syscall = get_local_syscall(__NR_socketpair); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_socketpair); -#endif -#ifdef __NR_getsockname - l_syscall = get_local_syscall(__NR_getsockname); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_getsockname); -#endif -#ifdef __NR_getpeername - l_syscall = get_local_syscall(__NR_getpeername); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_getpeername); -#endif -#ifdef __NR_recvfrom - l_syscall = get_local_syscall(__NR_recvfrom); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_recvfrom); -#endif -#ifdef __NR_setsockopt - l_syscall = get_local_syscall(__NR_setsockopt); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setsockopt); -#endif -#ifdef __NR_sendmsg - l_syscall = get_local_syscall(__NR_sendmsg); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_sendmsg); -#endif -#ifdef __NR_recvmsg - l_syscall = get_local_syscall(__NR_recvmsg); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_recvmsg); -#endif -#ifdef __NR_socketcall - l_syscall = get_local_syscall(__NR_socketcall); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_socketcall); -#endif -#ifdef __NR_rt_sigsuspend - l_syscall = get_local_syscall(__NR_rt_sigsuspend); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_rt_sigsuspend); -#endif -#ifdef __NR_rt_sigpending - l_syscall = get_local_syscall(__NR_rt_sigpending); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_rt_sigpending); -#endif -#ifdef __NR_rt_sigaction - l_syscall = get_local_syscall(__NR_rt_sigaction); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_rt_sigaction); -#endif -#ifdef __NR_signal - l_syscall = get_local_syscall(__NR_signal); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_signal); -#endif -#ifdef __NR_remap_file_pages - l_syscall = get_local_syscall(__NR_remap_file_pages); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_remap_file_pages); -#endif -#ifdef __NR_ppoll - l_syscall = get_local_syscall(__NR_ppoll); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_ppoll); -#endif -#ifdef __NR_dup - l_syscall = get_local_syscall(__NR_dup); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_dup); -#endif -#ifdef __NR_dup3 - l_syscall = get_local_syscall(__NR_dup3); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_dup3); -#endif -#ifdef __NR_eventfd2 - l_syscall = get_local_syscall(__NR_eventfd2); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_eventfd2); -#endif -#ifdef __NR_timerfd_create - l_syscall = get_local_syscall(__NR_timerfd_create); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_timerfd_create); -#endif -#ifdef __NR_timerfd_gettime - l_syscall = get_local_syscall(__NR_timerfd_gettime); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_timerfd_gettime); -#endif -#ifdef __NR_timerfd_settime - l_syscall = get_local_syscall(__NR_timerfd_settime); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_timerfd_settime); -#endif -#ifdef __NR_epoll_create1 - l_syscall = get_local_syscall(__NR_epoll_create1); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_epoll_create1); -#endif -#ifdef __NR_epoll_ctl - l_syscall = get_local_syscall(__NR_epoll_ctl); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_epoll_ctl); -#endif -#ifdef __NR_epoll_pwait - l_syscall = get_local_syscall(__NR_epoll_pwait); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_epoll_pwait); -#endif -#ifdef __NR_rt_sigtimedwait - l_syscall = get_local_syscall(__NR_rt_sigtimedwait); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_rt_sigtimedwait); -#endif -#ifdef __NR_clone - l_syscall = get_local_syscall(__NR_clone); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_clone); -#endif -#ifdef __NR_execve - l_syscall = get_local_syscall(__NR_execve); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_execve); -#endif -#ifdef __NR_setxattr - l_syscall = get_local_syscall(__NR_setxattr); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_setxattr); -#endif -#ifdef __NR_lsetxattr - l_syscall = get_local_syscall(__NR_lsetxattr); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_lsetxattr); -#endif -#ifdef __NR_fsetxattr - l_syscall = get_local_syscall(__NR_fsetxattr); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fsetxattr); -#endif -#ifdef __NR_removexattr - l_syscall = get_local_syscall(__NR_removexattr); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_removexattr); -#endif -#ifdef __NR_lremovexattr - l_syscall = get_local_syscall(__NR_lremovexattr); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_lremovexattr); -#endif -#ifdef __NR_fremovexattr - l_syscall = get_local_syscall(__NR_fremovexattr); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_fremovexattr); -#endif -#ifdef __NR_inotify_init1 - l_syscall = get_local_syscall(__NR_inotify_init1); - EXPECT_NE(test, l_syscall, NULL); - EXPECT_EQ(test, l_syscall->local_syscall, __DEFEX_inotify_init1); -#endif -} - - -static int defex_catch_list_compat_test_init(struct test *test) -{ - return 0; -} - -static void defex_catch_list_compat_test_exit(struct test *test) -{ -} - -static struct test_case defex_catch_list_compat_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(get_local_syscall_compat_test), - {}, -}; - -static struct test_module defex_catch_list_compat_test_module = { - .name = "defex_catch_list_compat_test", - .init = defex_catch_list_compat_test_init, - .exit = defex_catch_list_compat_test_exit, - .test_cases = defex_catch_list_compat_test_cases, -}; -module_test(defex_catch_list_compat_test_module); - diff --git a/security/samsung/defex_lsm/catch_engine/kunit_test/defex_catch_list_test.c b/security/samsung/defex_lsm/catch_engine/kunit_test/defex_catch_list_test.c deleted file mode 100755 index fe13560c1e77..000000000000 --- a/security/samsung/defex_lsm/catch_engine/kunit_test/defex_catch_list_test.c +++ /dev/null @@ -1,1235 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "include/defex_catch_list.h" - -/* General test functions created by Generate_KUnit.sh */ - -static void syscall_local2global_test(struct test *test) -{ - /* Index too high, should fail with zero */ - EXPECT_EQ(test, syscall_local2global(__NR_syscalls), 0); - /* Special case should return zero too */ - EXPECT_EQ(test, syscall_local2global(__DEFEX_empty), 0); - /* Should succeed, but expected indices below depend on current configuration */ -#ifdef __NR_rmdir - EXPECT_EQ(test, syscall_local2global(__NR_rmdir), 1); -#endif -#ifdef __NR_utimes - EXPECT_EQ(test, syscall_local2global(__NR_utimes), 2); -#endif -#ifdef __NR_stat - EXPECT_EQ(test, syscall_local2global(__NR_stat), 3); -#endif -#ifdef __NR_lstat - EXPECT_EQ(test, syscall_local2global(__NR_lstat), 4); -#endif -#ifdef __NR_umount - EXPECT_EQ(test, syscall_local2global(__NR_umount), 5); -#endif -#ifdef __NR_utime - EXPECT_EQ(test, syscall_local2global(__NR_utime), 6); -#endif -} - - -static void get_local_syscall_test(struct test *test) -{ - const struct local_syscall_struct *lss; - - EXPECT_EQ(test, get_local_syscall(__NR_syscalls), NULL); - -#ifdef __NR_rmdir - lss = get_local_syscall(__NR_rmdir); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_rmdir); -#endif -#ifdef __NR_utimes - lss = get_local_syscall(__NR_utimes); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_utimes); -#endif -#ifdef __NR_stat - lss = get_local_syscall(__NR_stat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_stat); -#endif -#ifdef __NR_lstat - lss = get_local_syscall(__NR_lstat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_lstat); -#endif -#ifdef __NR_umount - lss = get_local_syscall(__NR_umount); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_umount); -#endif -#ifdef __NR_utime - lss = get_local_syscall(__NR_utime); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_utime); -#endif -#ifdef __NR_futimesat - lss = get_local_syscall(__NR_futimesat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_futimesat); -#endif -#ifdef __NR_uselib - lss = get_local_syscall(__NR_uselib); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_uselib); -#endif -#ifdef __NR_send - lss = get_local_syscall(__NR_send); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_send); -#endif -#ifdef __NR_ustat - lss = get_local_syscall(__NR_ustat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_ustat); -#endif -#ifdef __NR_getdents - lss = get_local_syscall(__NR_getdents); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_getdents); -#endif -#ifdef __NR_recv - lss = get_local_syscall(__NR_recv); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_recv); -#endif -#ifdef __NR_fork - lss = get_local_syscall(__NR_fork); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fork); -#endif -#ifdef __NR_vfork - lss = get_local_syscall(__NR_vfork); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_vfork); -#endif -#ifdef __NR_sigprocmask - lss = get_local_syscall(__NR_sigprocmask); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_sigprocmask); -#endif -#ifdef __NR_sigpending - lss = get_local_syscall(__NR_sigpending); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_sigpending); -#endif -#ifdef __NR_sigaction - lss = get_local_syscall(__NR_sigaction); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_sigaction); -#endif -#ifdef __NR_sigaltstack - lss = get_local_syscall(__NR_sigaltstack); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_sigaltstack); -#endif -#ifdef __NR_sigsuspend - lss = get_local_syscall(__NR_sigsuspend); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_sigsuspend); -#endif -#ifdef __NR_truncate64 - lss = get_local_syscall(__NR_truncate64); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_truncate64); -#endif -#ifdef __NR_ftruncate64 - lss = get_local_syscall(__NR_ftruncate64); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_ftruncate64); -#endif -#ifdef __NR_fstat64 - lss = get_local_syscall(__NR_fstat64); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fstat64); -#endif -#ifdef __NR_fstatat64 - lss = get_local_syscall(__NR_fstatat64); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fstatat64); -#endif -#ifdef __NR_statfs64 - lss = get_local_syscall(__NR_statfs64); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_statfs64); -#endif -#ifdef __NR_stat64 - lss = get_local_syscall(__NR_stat64); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_stat64); -#endif -#ifdef __NR_lstat64 - lss = get_local_syscall(__NR_lstat64); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_lstat64); -#endif -#ifdef __NR_eventfd - lss = get_local_syscall(__NR_eventfd); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_eventfd); -#endif -#ifdef __NR_epoll_create - lss = get_local_syscall(__NR_epoll_create); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_epoll_create); -#endif -#ifdef __NR_shmget - lss = get_local_syscall(__NR_shmget); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_shmget); -#endif -#ifdef __NR_shmctl - lss = get_local_syscall(__NR_shmctl); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_shmctl); -#endif -#ifdef __NR_semctl - lss = get_local_syscall(__NR_semctl); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_semctl); -#endif -#ifdef __NR_move_pages - lss = get_local_syscall(__NR_move_pages); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_move_pages); -#endif -#ifdef __NR_lookup_dcookie - lss = get_local_syscall(__NR_lookup_dcookie); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_lookup_dcookie); -#endif -#ifdef __NR_truncate - lss = get_local_syscall(__NR_truncate); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_truncate); -#endif -#ifdef __NR_ftruncate - lss = get_local_syscall(__NR_ftruncate); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_ftruncate); -#endif -#ifdef __NR_chdir - lss = get_local_syscall(__NR_chdir); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_chdir); -#endif -#ifdef __NR_chroot - lss = get_local_syscall(__NR_chroot); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_chroot); -#endif -#ifdef __NR_fchmod - lss = get_local_syscall(__NR_fchmod); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fchmod); -#endif -#ifdef __NR_fchmodat - lss = get_local_syscall(__NR_fchmodat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fchmodat); -#endif -#ifdef __NR_fchownat - lss = get_local_syscall(__NR_fchownat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fchownat); -#endif -#ifdef __NR_fchown - lss = get_local_syscall(__NR_fchown); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fchown); -#endif -#ifdef __NR_open - lss = get_local_syscall(__NR_open); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_open); -#endif -#ifdef __NR_openat - lss = get_local_syscall(__NR_openat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_openat); -#endif -#ifdef __NR_write - lss = get_local_syscall(__NR_write); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_write); -#endif -#ifdef __NR_writev - lss = get_local_syscall(__NR_writev); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_writev); -#endif -#ifdef __NR_pwrite64 - lss = get_local_syscall(__NR_pwrite64); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_pwrite64); -#endif -#ifdef __NR_pwritev - lss = get_local_syscall(__NR_pwritev); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_pwritev); -#endif -#ifdef __NR_sendfile - lss = get_local_syscall(__NR_sendfile); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_sendfile); -#endif -#ifdef __NR_signalfd4 - lss = get_local_syscall(__NR_signalfd4); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_signalfd4); -#endif -#ifdef __NR_vmsplice - lss = get_local_syscall(__NR_vmsplice); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_vmsplice); -#endif -#ifdef __NR_splice - lss = get_local_syscall(__NR_splice); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_splice); -#endif -#ifdef __NR_tee - lss = get_local_syscall(__NR_tee); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_tee); -#endif -#ifdef __NR_fsync - lss = get_local_syscall(__NR_fsync); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fsync); -#endif -#ifdef __NR_fdatasync - lss = get_local_syscall(__NR_fdatasync); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fdatasync); -#endif -#ifdef __NR_sync_file_range - lss = get_local_syscall(__NR_sync_file_range); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_sync_file_range); -#endif -#ifdef __NR_acct - lss = get_local_syscall(__NR_acct); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_acct); -#endif -#ifdef __NR_sched_setparam - lss = get_local_syscall(__NR_sched_setparam); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_sched_setparam); -#endif -#ifdef __NR_sched_setscheduler - lss = get_local_syscall(__NR_sched_setscheduler); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_sched_setscheduler); -#endif -#ifdef __NR_sched_setaffinity - lss = get_local_syscall(__NR_sched_setaffinity); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_sched_setaffinity); -#endif -#ifdef __NR_reboot - lss = get_local_syscall(__NR_reboot); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_reboot); -#endif -#ifdef __NR_mq_timedsend - lss = get_local_syscall(__NR_mq_timedsend); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_mq_timedsend); -#endif -#ifdef __NR_mq_timedreceive - lss = get_local_syscall(__NR_mq_timedreceive); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_mq_timedreceive); -#endif -#ifdef __NR_msgrcv - lss = get_local_syscall(__NR_msgrcv); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_msgrcv); -#endif -#ifdef __NR_msgsnd - lss = get_local_syscall(__NR_msgsnd); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_msgsnd); -#endif -#ifdef __NR_semtimedop - lss = get_local_syscall(__NR_semtimedop); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_semtimedop); -#endif -#ifdef __NR_add_key - lss = get_local_syscall(__NR_add_key); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_add_key); -#endif -#ifdef __NR_request_key - lss = get_local_syscall(__NR_request_key); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_request_key); -#endif -#ifdef __NR_keyctl - lss = get_local_syscall(__NR_keyctl); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_keyctl); -#endif -#ifdef __NR_mmap - lss = get_local_syscall(__NR_mmap); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_mmap); -#endif -#ifdef __NR_mincore - lss = get_local_syscall(__NR_mincore); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_mincore); -#endif -#ifdef __NR_mbind - lss = get_local_syscall(__NR_mbind); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_mbind); -#endif -#ifdef __NR_set_mempolicy - lss = get_local_syscall(__NR_set_mempolicy); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_set_mempolicy); -#endif -#ifdef __NR_migrate_pages - lss = get_local_syscall(__NR_migrate_pages); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_migrate_pages); -#endif -#ifdef __NR_accept4 - lss = get_local_syscall(__NR_accept4); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_accept4); -#endif -#ifdef __NR_recvmmsg - lss = get_local_syscall(__NR_recvmmsg); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_recvmmsg); -#endif -#ifdef __NR_link - lss = get_local_syscall(__NR_link); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_link); -#endif -#ifdef __NR_unlink - lss = get_local_syscall(__NR_unlink); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_unlink); -#endif -#ifdef __NR_mknod - lss = get_local_syscall(__NR_mknod); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_mknod); -#endif -#ifdef __NR_chmod - lss = get_local_syscall(__NR_chmod); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_chmod); -#endif -#ifdef __NR_chown - lss = get_local_syscall(__NR_chown); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_chown); -#endif -#ifdef __NR_mknodat - lss = get_local_syscall(__NR_mknodat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_mknodat); -#endif -#ifdef __NR_mkdirat - lss = get_local_syscall(__NR_mkdirat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_mkdirat); -#endif -#ifdef __NR_unlinkat - lss = get_local_syscall(__NR_unlinkat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_unlinkat); -#endif -#ifdef __NR_symlinkat - lss = get_local_syscall(__NR_symlinkat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_symlinkat); -#endif -#ifdef __NR_linkat - lss = get_local_syscall(__NR_linkat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_linkat); -#endif -#ifdef __NR_mkdir - lss = get_local_syscall(__NR_mkdir); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_mkdir); -#endif -#ifdef __NR_lchown - lss = get_local_syscall(__NR_lchown); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_lchown); -#endif -#ifdef __NR_rename - lss = get_local_syscall(__NR_rename); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_rename); -#endif -#ifdef __NR_epoll_wait - lss = get_local_syscall(__NR_epoll_wait); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_epoll_wait); -#endif -#ifdef __NR_sysctl - lss = get_local_syscall(__NR_sysctl); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_sysctl); -#endif -#ifdef __NR_renameat - lss = get_local_syscall(__NR_renameat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_renameat); -#endif -#ifdef __NR_umount2 - lss = get_local_syscall(__NR_umount2); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_umount2); -#endif -#ifdef __NR_mount - lss = get_local_syscall(__NR_mount); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_mount); -#endif -#ifdef __NR_pivot_root - lss = get_local_syscall(__NR_pivot_root); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_pivot_root); -#endif -#ifdef __NR_utimensat - lss = get_local_syscall(__NR_utimensat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_utimensat); -#endif -#ifdef __NR_fcntl - lss = get_local_syscall(__NR_fcntl); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fcntl); -#endif -#ifdef __NR_kexec_load - lss = get_local_syscall(__NR_kexec_load); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_kexec_load); -#endif -#ifdef __NR_ptrace - lss = get_local_syscall(__NR_ptrace); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_ptrace); -#endif -#ifdef __NR_setgroups - lss = get_local_syscall(__NR_setgroups); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setgroups); -#endif -#ifdef __NR_settimeofday - lss = get_local_syscall(__NR_settimeofday); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_settimeofday); -#endif -#ifdef __NR_delete_module - lss = get_local_syscall(__NR_delete_module); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_delete_module); -#endif -#ifdef __NR_init_module - lss = get_local_syscall(__NR_init_module); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_init_module); -#endif -#ifdef __NR_capset - lss = get_local_syscall(__NR_capset); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_capset); -#endif -#ifdef __NR_setpriority - lss = get_local_syscall(__NR_setpriority); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setpriority); -#endif -#ifdef __NR_setregid - lss = get_local_syscall(__NR_setregid); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setregid); -#endif -#ifdef __NR_setgid - lss = get_local_syscall(__NR_setgid); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setgid); -#endif -#ifdef __NR_setreuid - lss = get_local_syscall(__NR_setreuid); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setreuid); -#endif -#ifdef __NR_setuid - lss = get_local_syscall(__NR_setuid); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setuid); -#endif -#ifdef __NR_setresuid - lss = get_local_syscall(__NR_setresuid); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setresuid); -#endif -#ifdef __NR_setresgid - lss = get_local_syscall(__NR_setresgid); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setresgid); -#endif -#ifdef __NR_setpgid - lss = get_local_syscall(__NR_setpgid); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setpgid); -#endif -#ifdef __NR_setfsuid - lss = get_local_syscall(__NR_setfsuid); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setfsuid); -#endif -#ifdef __NR_setfsgid - lss = get_local_syscall(__NR_setfsgid); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setfsgid); -#endif -#ifdef __NR_getsid - lss = get_local_syscall(__NR_getsid); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_getsid); -#endif -#ifdef __NR_setsid - lss = get_local_syscall(__NR_setsid); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setsid); -#endif -#ifdef __NR_sethostname - lss = get_local_syscall(__NR_sethostname); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_sethostname); -#endif -#ifdef __NR_setdomainname - lss = get_local_syscall(__NR_setdomainname); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setdomainname); -#endif -#ifdef __NR_setrlimit - lss = get_local_syscall(__NR_setrlimit); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setrlimit); -#endif -#ifdef __NR_umask - lss = get_local_syscall(__NR_umask); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_umask); -#endif -#ifdef __NR_prctl - lss = get_local_syscall(__NR_prctl); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_prctl); -#endif -#ifdef __NR_getcpu - lss = get_local_syscall(__NR_getcpu); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_getcpu); -#endif -#ifdef __NR_kill - lss = get_local_syscall(__NR_kill); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_kill); -#endif -#ifdef __NR_tgkill - lss = get_local_syscall(__NR_tgkill); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_tgkill); -#endif -#ifdef __NR_tkill - lss = get_local_syscall(__NR_tkill); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_tkill); -#endif -#ifdef __NR_rt_tgsigqueueinfo - lss = get_local_syscall(__NR_rt_tgsigqueueinfo); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_rt_tgsigqueueinfo); -#endif -#ifdef __NR_rt_sigqueueinfo - lss = get_local_syscall(__NR_rt_sigqueueinfo); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_rt_sigqueueinfo); -#endif -#ifdef __NR_listen - lss = get_local_syscall(__NR_listen); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_listen); -#endif -#ifdef __NR_accept - lss = get_local_syscall(__NR_accept); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_accept); -#endif -#ifdef __NR_shutdown - lss = get_local_syscall(__NR_shutdown); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_shutdown); -#endif -#ifdef __NR_shmat - lss = get_local_syscall(__NR_shmat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_shmat); -#endif -#ifdef __NR_shmdt - lss = get_local_syscall(__NR_shmdt); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_shmdt); -#endif -#ifdef __NR_semget - lss = get_local_syscall(__NR_semget); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_semget); -#endif -#ifdef __NR_semop - lss = get_local_syscall(__NR_semop); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_semop); -#endif -#ifdef __NR_faccessat - lss = get_local_syscall(__NR_faccessat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_faccessat); -#endif -#ifdef __NR_fchdir - lss = get_local_syscall(__NR_fchdir); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fchdir); -#endif -#ifdef __NR_fstat - lss = get_local_syscall(__NR_fstat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fstat); -#endif -#ifdef __NR_readlinkat - lss = get_local_syscall(__NR_readlinkat); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_readlinkat); -#endif -#ifdef __NR_statfs - lss = get_local_syscall(__NR_statfs); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_statfs); -#endif -#ifdef __NR_fstatfs - lss = get_local_syscall(__NR_fstatfs); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fstatfs); -#endif -#ifdef __NR_getcwd - lss = get_local_syscall(__NR_getcwd); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_getcwd); -#endif -#ifdef __NR_futex - lss = get_local_syscall(__NR_futex); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_futex); -#endif -#ifdef __NR_perf_event_open - lss = get_local_syscall(__NR_perf_event_open); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_perf_event_open); -#endif -#ifdef __NR_socket - lss = get_local_syscall(__NR_socket); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_socket); -#endif -#ifdef __NR_bind - lss = get_local_syscall(__NR_bind); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_bind); -#endif -#ifdef __NR_connect - lss = get_local_syscall(__NR_connect); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_connect); -#endif -#ifdef __NR_sendto - lss = get_local_syscall(__NR_sendto); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_sendto); -#endif -#ifdef __NR_mprotect - lss = get_local_syscall(__NR_mprotect); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_mprotect); -#endif -#ifdef __NR_mremap - lss = get_local_syscall(__NR_mremap); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_mremap); -#endif -#ifdef __NR_pselect6 - lss = get_local_syscall(__NR_pselect6); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_pselect6); -#endif -#ifdef __NR_ioctl - lss = get_local_syscall(__NR_ioctl); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_ioctl); -#endif -#ifdef __NR_ioprio_set - lss = get_local_syscall(__NR_ioprio_set); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_ioprio_set); -#endif -#ifdef __NR_pipe2 - lss = get_local_syscall(__NR_pipe2); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_pipe2); -#endif -#ifdef __NR_getdents64 - lss = get_local_syscall(__NR_getdents64); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_getdents64); -#endif -#ifdef __NR_setitimer - lss = get_local_syscall(__NR_setitimer); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setitimer); -#endif -#ifdef __NR_capget - lss = get_local_syscall(__NR_capget); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_capget); -#endif -#ifdef __NR_getresuid - lss = get_local_syscall(__NR_getresuid); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_getresuid); -#endif -#ifdef __NR_getresgid - lss = get_local_syscall(__NR_getresgid); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_getresgid); -#endif -#ifdef __NR_rt_sigprocmask - lss = get_local_syscall(__NR_rt_sigprocmask); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_rt_sigprocmask); -#endif -#ifdef __NR_socketpair - lss = get_local_syscall(__NR_socketpair); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_socketpair); -#endif -#ifdef __NR_getsockname - lss = get_local_syscall(__NR_getsockname); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_getsockname); -#endif -#ifdef __NR_getpeername - lss = get_local_syscall(__NR_getpeername); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_getpeername); -#endif -#ifdef __NR_recvfrom - lss = get_local_syscall(__NR_recvfrom); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_recvfrom); -#endif -#ifdef __NR_setsockopt - lss = get_local_syscall(__NR_setsockopt); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setsockopt); -#endif -#ifdef __NR_sendmsg - lss = get_local_syscall(__NR_sendmsg); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_sendmsg); -#endif -#ifdef __NR_recvmsg - lss = get_local_syscall(__NR_recvmsg); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_recvmsg); -#endif -#ifdef __NR_socketcall - lss = get_local_syscall(__NR_socketcall); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_socketcall); -#endif -#ifdef __NR_rt_sigsuspend - lss = get_local_syscall(__NR_rt_sigsuspend); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_rt_sigsuspend); -#endif -#ifdef __NR_rt_sigpending - lss = get_local_syscall(__NR_rt_sigpending); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_rt_sigpending); -#endif -#ifdef __NR_rt_sigaction - lss = get_local_syscall(__NR_rt_sigaction); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_rt_sigaction); -#endif -#ifdef __NR_signal - lss = get_local_syscall(__NR_signal); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_signal); -#endif -#ifdef __NR_remap_file_pages - lss = get_local_syscall(__NR_remap_file_pages); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_remap_file_pages); -#endif -#ifdef __NR_ppoll - lss = get_local_syscall(__NR_ppoll); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_ppoll); -#endif -#ifdef __NR_dup - lss = get_local_syscall(__NR_dup); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_dup); -#endif -#ifdef __NR_dup3 - lss = get_local_syscall(__NR_dup3); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_dup3); -#endif -#ifdef __NR_eventfd2 - lss = get_local_syscall(__NR_eventfd2); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_eventfd2); -#endif -#ifdef __NR_timerfd_create - lss = get_local_syscall(__NR_timerfd_create); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_timerfd_create); -#endif -#ifdef __NR_timerfd_gettime - lss = get_local_syscall(__NR_timerfd_gettime); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_timerfd_gettime); -#endif -#ifdef __NR_timerfd_settime - lss = get_local_syscall(__NR_timerfd_settime); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_timerfd_settime); -#endif -#ifdef __NR_epoll_create1 - lss = get_local_syscall(__NR_epoll_create1); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_epoll_create1); -#endif -#ifdef __NR_epoll_ctl - lss = get_local_syscall(__NR_epoll_ctl); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_epoll_ctl); -#endif -#ifdef __NR_epoll_pwait - lss = get_local_syscall(__NR_epoll_pwait); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_epoll_pwait); -#endif -#ifdef __NR_rt_sigtimedwait - lss = get_local_syscall(__NR_rt_sigtimedwait); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_rt_sigtimedwait); -#endif -#ifdef __NR_clone - lss = get_local_syscall(__NR_clone); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_clone); -#endif -#ifdef __NR_execve - lss = get_local_syscall(__NR_execve); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_execve); -#endif -#ifdef __NR_setxattr - lss = get_local_syscall(__NR_setxattr); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_setxattr); -#endif -#ifdef __NR_lsetxattr - lss = get_local_syscall(__NR_lsetxattr); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_lsetxattr); -#endif -#ifdef __NR_fsetxattr - lss = get_local_syscall(__NR_fsetxattr); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fsetxattr); -#endif -#ifdef __NR_removexattr - lss = get_local_syscall(__NR_removexattr); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_removexattr); -#endif -#ifdef __NR_lremovexattr - lss = get_local_syscall(__NR_lremovexattr); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_lremovexattr); -#endif -#ifdef __NR_fremovexattr - lss = get_local_syscall(__NR_fremovexattr); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_fremovexattr); -#endif -#ifdef __NR_inotify_init1 - lss = get_local_syscall(__NR_inotify_init1); - EXPECT_NE(test, lss, NULL); - if (lss != NULL) - EXPECT_EQ(test, lss->local_syscall, __DEFEX_inotify_init1); -#endif -} - - -static int defex_catch_list_test_init(struct test *test) -{ - /* - * test->priv = a_struct_pointer; - * if (!test->priv) - * return -ENOMEM; - */ - - return 0; -} - -static void defex_catch_list_test_exit(struct test *test) -{ -} - -static struct test_case defex_catch_list_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(syscall_local2global_test), - TEST_CASE(get_local_syscall_test), - {}, -}; - -static struct test_module defex_catch_list_test_module = { - .name = "defex_catch_list_test", - .init = defex_catch_list_test_init, - .exit = defex_catch_list_test_exit, - .test_cases = defex_catch_list_test_cases, -}; -module_test(defex_catch_list_test_module); - diff --git a/security/samsung/defex_lsm/catch_engine/kunit_test/defex_ht_test.c b/security/samsung/defex_lsm/catch_engine/kunit_test/defex_ht_test.c deleted file mode 100755 index 47222c822bf1..000000000000 --- a/security/samsung/defex_lsm/catch_engine/kunit_test/defex_ht_test.c +++ /dev/null @@ -1,623 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include "include/defex_internal.h" - -#define NEGATIVE_ID (0-1) -#define MAX_PID_32 32768 -#define DEFEX_MEM_CACHE_SIZE 32 -#define TEST_PID_MAIN 42000 -#define TEST_PID_FORK 43000 -#define TEST_UID 1000 -#define TEST_FSUID 1000 -#define TEST_EGID 1000 -#define TEST_FLAGS 0 - -#define DEFEX_MEM_CACHE_COUNT 3 -#define CACHE_CRED_DATA 0 -#define CACHE_CRED_DATA_ID 1 -#define CACHE_HTABLE_ITEM 2 - -struct id_set { - unsigned int uid, fsuid, egid; -}; - -struct proc_cred_data { - unsigned short cred_flags; - unsigned short tcnt; - struct id_set default_ids; - struct id_set main_ids[]; -}; - -struct mem_cache_list { - atomic_t count; - char name[8]; - struct kmem_cache *allocator; - void *mem_cache_array[DEFEX_MEM_CACHE_SIZE]; -}; - -#ifdef DEFEX_PED_ENABLE -extern struct hlist_head creds_hash[1 << 15]; -extern spinlock_t creds_hash_update_lock; -extern struct mem_cache_list mem_cache[DEFEX_MEM_CACHE_COUNT]; - -extern struct proc_cred_data *get_cred_data(int id); -extern struct proc_cred_data **get_cred_ptr(int id); -extern void set_cred_data(int id, struct proc_cred_data **cred_ptr, struct proc_cred_data *cred_data); -extern void *mem_cache_get(int cache_number); -extern void *mem_cache_reclaim(int cache_number, void *ptr); -extern void mem_cache_alloc(void); -#endif /* DEFEX_PED_ENABLE */ - -struct task_struct *main_task, *fork_task; - -static void set_task_creds_tcnt_test(struct test *test) -{ -#ifdef DEFEX_PED_ENABLE - int i; - unsigned int uid = TEST_UID, fsuid = TEST_FSUID, egid = TEST_EGID; - unsigned short cred_flags = TEST_FLAGS; - - ASSERT_TRUE(test, hash_empty(creds_hash)); - - /* First, we need to allocate DEFEX_MEM_CACHE_SIZE so we can fill up the cache later on. - * We will also need a pair of tasks which will be freed when the cache is full. - */ - ASSERT_SUCCESS(test, set_task_creds(main_task, TEST_UID, TEST_FSUID, TEST_EGID, TEST_FLAGS)); - ASSERT_SUCCESS(test, set_task_creds(fork_task, TEST_UID, TEST_FSUID, TEST_EGID, TEST_FLAGS)); - for(i = 0; i < (DEFEX_MEM_CACHE_SIZE / 2); i++) { - main_task->pid += 1; - main_task->tgid += 1; - fork_task->pid += 1; - fork_task->tgid += 1; - ASSERT_SUCCESS(test, set_task_creds(main_task, TEST_UID, TEST_FSUID, TEST_EGID, TEST_FLAGS)); - ASSERT_SUCCESS(test, set_task_creds(fork_task, TEST_UID, TEST_FSUID, TEST_EGID, TEST_FLAGS)); - } - - /* Now we set the thread count to zero -> memory will be put in cache until it's full. */ - for(i = 0; i < (DEFEX_MEM_CACHE_SIZE / 2); i++) { - set_task_creds_tcnt(fork_task, -1); - set_task_creds_tcnt(main_task, -1); - main_task->pid -= 1; - main_task->tgid -= 1; - fork_task->pid -= 1; - fork_task->tgid -= 1; - } - - /* CACHE_CRED_DATA and CACHE_HTABLE_ITEM caches should be full now. */ - ASSERT_EQ(test, atomic_read(&mem_cache[CACHE_CRED_DATA].count), DEFEX_MEM_CACHE_SIZE); - ASSERT_EQ(test, atomic_read(&mem_cache[CACHE_HTABLE_ITEM].count), DEFEX_MEM_CACHE_SIZE); - - /* Let's reclaim that last pair so it triggers kfree */ - set_task_creds_tcnt(fork_task, -1); - set_task_creds_tcnt(main_task, -1); - - /* Let's verify there is no cred data in cache */ - get_task_creds(main_task, &uid, &fsuid, &egid, &cred_flags); - EXPECT_EQ(test, uid, 0); - EXPECT_EQ(test, fsuid, 0); - EXPECT_EQ(test, egid, 0); - EXPECT_EQ(test, cred_flags, CRED_FLAGS_PROOT); - - uid = TEST_UID; - fsuid = TEST_FSUID; - egid = TEST_EGID; - cred_flags = TEST_FLAGS; - - get_task_creds(fork_task, &uid, &fsuid, &egid, &cred_flags); - EXPECT_EQ(test, uid, 0); - EXPECT_EQ(test, fsuid, 0); - EXPECT_EQ(test, egid, 0); - EXPECT_EQ(test, cred_flags, CRED_FLAGS_PROOT); - - EXPECT_TRUE(test, hash_empty(creds_hash)); - -#else - set_task_creds_tcnt(NULL, 0); -#endif /* DEFEX_PED_ENABLE */ - SUCCEED(test); -} - - -static void set_task_creds_test(struct test *test) -{ -#ifdef DEFEX_PED_ENABLE - struct proc_cred_data *query; - unsigned long flags; - - ASSERT_TRUE(test, hash_empty(creds_hash)); - - /* T1: Main process initial data */ - EXPECT_EQ(test, set_task_creds(main_task, TEST_UID, TEST_FSUID, TEST_EGID, TEST_FLAGS), 0); - spin_lock_irqsave(&creds_hash_update_lock, flags); - query = get_cred_data(TEST_PID_MAIN); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - ASSERT_NOT_NULL(test, query); - EXPECT_EQ(test, query->cred_flags, 0); - EXPECT_EQ(test, query->default_ids.uid, TEST_UID); - EXPECT_EQ(test, query->default_ids.fsuid, TEST_FSUID); - EXPECT_EQ(test, query->default_ids.egid, TEST_EGID); - EXPECT_EQ(test, query->tcnt, 1); - - /* T2: Fork task data */ - set_task_creds_tcnt(main_task, 1); - EXPECT_EQ(test, set_task_creds(fork_task, TEST_UID, TEST_FSUID, TEST_EGID, TEST_FLAGS), 0); - - spin_lock_irqsave(&creds_hash_update_lock, flags); - query = get_cred_data(TEST_PID_MAIN); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - ASSERT_NOT_NULL(test, query); - EXPECT_EQ(test, query->cred_flags, CRED_FLAGS_SUB_UPDATED); - - spin_lock_irqsave(&creds_hash_update_lock, flags); - query = get_cred_data(TEST_PID_FORK); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - ASSERT_NOT_NULL(test, query); - EXPECT_EQ(test, query->cred_flags, 0); - EXPECT_EQ(test, query->tcnt, 0); - EXPECT_EQ(test, query->default_ids.uid, TEST_UID); - EXPECT_EQ(test, query->default_ids.fsuid, TEST_FSUID); - EXPECT_EQ(test, query->default_ids.egid, TEST_EGID); - - /* T3: Update Main process cred */ - EXPECT_EQ(test, set_task_creds(main_task, TEST_UID + 1, TEST_FSUID + 1, TEST_EGID + 1, TEST_FLAGS), 0); - - spin_lock_irqsave(&creds_hash_update_lock, flags); - query = get_cred_data(TEST_PID_MAIN); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - ASSERT_NOT_NULL(test, query); - EXPECT_EQ(test, query->cred_flags, CRED_FLAGS_SUB_UPDATED | CRED_FLAGS_MAIN_UPDATED); - EXPECT_EQ(test, query->tcnt, 2); - EXPECT_EQ(test, query->default_ids.uid, TEST_UID); - EXPECT_EQ(test, query->default_ids.fsuid, TEST_FSUID); - EXPECT_EQ(test, query->default_ids.egid, TEST_EGID); - EXPECT_EQ(test, query->main_ids[0].uid, TEST_UID + 1); - EXPECT_EQ(test, query->main_ids[0].fsuid, TEST_FSUID + 1); - EXPECT_EQ(test, query->main_ids[0].egid, TEST_EGID + 1); - - /* Cleanup */ - set_task_creds_tcnt(fork_task, -1); - set_task_creds_tcnt(main_task, -1); - ASSERT_TRUE(test, hash_empty(creds_hash)); - -#endif /* DEFEX_PED_ENABLE */ - SUCCEED(test); -} - - -static void set_cred_data_test(struct test *test) -{ -#ifdef DEFEX_PED_ENABLED - struct proc_cred_data *cred_data, *new_creds, **cred_data_ptr; - unsigned int task_uid, task_fsuid, task_egid; - unsigned long flags; - - ASSERT_TRUE(test, hash_empty(creds_hash)); - - /* T1: negative ID */ - set_cred_data(-TEST_PID_MAIN, NULL, NULL); - - /* T2: inexistent data */ - spin_lock_irqsave(&creds_hash_update_lock, flags); - set_cred_data(TEST_PID_MAIN, NULL, NULL); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - - /* Alloc new space in cache and add put cred data. */ - mem_cache_alloc(); - spin_lock_irqsave(&creds_hash_update_lock, flags); - cred_data = mem_cache_get(CACHE_CRED_DATA); - if (!cred_data) { - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - FAIL(test, "Test failed in getting cred_data"); - } - cred_data->cred_flags = 0; - cred_data->tcnt = 1; - cred_data->default_ids.uid = TEST_UID; - cred_data->default_ids.fsuid = TEST_FSUID; - cred_data->default_ids.egid = TEST_EGID; - - /* T3: Insert new data */ - set_cred_data(TEST_PID_MAIN, NULL, cred_data); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - mem_cache_alloc(); - - /* Verify inserted data */ - get_task_creds(main_task, &task_uid, &task_fsuid, &task_egid, &task_cred_flags); - EXPECT_EQ(test, task_uid, TEST_UID); - EXPECT_EQ(test, task_fsuid, TEST_FSUID); - EXPECT_EQ(test, task_egid, TEST_EGID); - EXPECT_EQ(test, task_cred_flags, 0); - - /* Allocate new data to change main_task data */ - new_creds = kmem_cache_alloc(mem_cache[CACHE_CRED_DATA].allocator, - in_atomic() ? GFP_ATOMIC:GFP_KERNEL); - ASSERT_NOT_NULL(test, new_creds); - new_creds->cred_flags = CRED_FLAGS_PROOT; - new_creds->tcnt = 1; - new_creds->default_ids.uid = TEST_UID + 1; - new_creds->default_ids.fsuid = TEST_FSUID + 1; - new_creds->default_ids.egid = TEST_EGID + 1; - - /* T4: existing cred_ptr */ - spin_lock_irqsave(&creds_hash_update_lock, flags); - cred_data_ptr = get_cred_ptr(TEST_PID_MAIN); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - ASSERT_NOT_NULL(test, cred_data_ptr); - - spin_lock_irqsave(&creds_hash_update_lock, flags); - set_cred_data(TEST_PID_MAIN, cred_data_ptr, new_creds); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - - /* Verify inserted data */ - spin_lock_irqsave(&creds_hash_update_lock, flags); - get_task_creds(main_task, &task_uid, &task_fsuid, &task_egid, &task_cred_flags); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - EXPECT_EQ(test, task_uid, TEST_UID + 1); - EXPECT_EQ(test, task_fsuid, TEST_FSUID + 1); - EXPECT_EQ(test, task_egid, TEST_EGID + 1); - EXPECT_EQ(test, task_cred_flags, CRED_FLAGS_PROOT); - - /* Cleanup */ - set_task_creds_tcnt(main_task, -1); - ASSERT_TRUE(test, hash_empty(creds_hash)); - kmem_cache_free(mem_cache[CACHE_CRED_DATA].allocator, cred_data); - -#endif /* DEFEX_PED_ENABLE */ - SUCCEED(test); -} - - -static void mem_cache_reclaim_test(struct test *test) -{ -#ifdef DEFEX_PED_ENABLED - void *cache; - int count_backup; - - ASSERT_TRUE(test, hash_empty(creds_hash)); - - spin_lock_irqsave(&creds_hash_update_lock, flags); - cache = mem_cache_get(CACHE_CRED_DATA); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - ASSERT_NOT_NULL(test, cache); - count_backup = atomic_read(&mem_cache[CACHE_CRED_DATA].count); - - /* T1: count >= DEFEX_MEM_CACHE_SIZE -> cache not reclaimed. */ - atomic_write(&mem_cache[CACHE_CRED_DATA].count, DEFEX_MEM_CACHE_SIZE); - spin_lock_irqsave(&creds_hash_update_lock, flags); - cache = mem_cache_reclaim(CACHE_CRED_DATA, cache); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - EXPECT_NOT_NULL(test, cache); - EXPECT_EQ(test, atomic_read(&mem_cache[CACHE_CRED_DATA].count), DEFEX_MEM_CACHE_SIZE); - - /* T2: count < DEFEX_MEM_CACHE_SIZE -> cache reclaimed. */ - atomic_write(&mem_cache[CACHE_CRED_DATA].count, count_backup); - spin_lock_irqsave(&creds_hash_update_lock, flags); - cache = mem_cache_reclaim(CACHE_CRED_DATA, cache); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - EXPECT_NULL(test, cache); - EXPECT_EQ(test, atomic_read(&mem_cache[CACHE_CRED_DATA].count), count_backup + 1); - -#endif /* DEFEX_PED_ENABLE */ - SUCCEED(test); -} - - -static void mem_cache_get_test(struct test *test) -{ -#ifdef DEFEX_PED_ENABLED - void *cache[DEFEX_MEM_CACHE_SIZE], *cache_mem; - int index; - - ASSERT_TRUE(test, hash_empty(creds_hash)); - - /* At initialization, only half cache is initialized */ - for(index = 0; index < (DEFEX_MEM_CACHE_SIZE / 2); index++) { - spin_lock_irqsave(&creds_hash_update_lock, flags); - cache[index] = mem_cache_get(CACHE_CRED_DATA); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - EXPECT_NOT_NULL(test, cache[index]); - } - - EXPECT_EQ(test, atomic_read(&mem_cache[CACHE_CRED_DATA].count), 0); - spin_lock_irqsave(&creds_hash_update_lock, flags); - cache_mem = mem_cache_get(CACHE_CRED_DATA); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - EXPECT_NULL(test, cache[index]); - - /* Clean up */ - for(index = 0; index < (DEFEX_MEM_CACHE_SIZE / 2); index++) { - spin_lock_irqsave(&creds_hash_update_lock, flags); - cache_mem = mem_cache_reclaim(0, cache[index]); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - ASSERT_NULL(test, cache_mem); - } -#endif /* DEFEX_PED_ENABLE */ - SUCCEED(test); -} - - -static void mem_cache_alloc_test(struct test *test) -{ -#ifdef DEFEX_PED_ENABLED - int count_backup_cache[DEFEX_MEM_CACHE_COUNT], count_allocations = 0; - void *cache_allocated_memory[DEFEX_MEM_CACHE_COUNT]; - int count_backup; - - ASSERT_TRUE(test, hash_empty(creds_hash)); - - /* At initial state, the cache already has DEFEX_MEM_CACHE_SIZE /2 positions - * allocated, so no new allocations are made. - */ - count_backup = atomic_read(&mem_cache[CACHE_CRED_DATA].count); - mem_cache_alloc(); - EXPECT_EQ(test, count_backup, atomic_read(&mem_cache[CACHE_CRED_DATA].count)); - - /* Now we get some pointers to force memory allocation. */ - for (i = 0; i < DEFEX_MEM_CACHE_COUNT; i++) { - spin_lock_irqsave(&creds_hash_update_lock, flags); - cache_allocated_memory[i] = mem_cache_get(i); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - ASSERT_NOT_NULL(test, cache_allocated_memory[i]); - } - mem_cache_alloc(); - - /* Clean up */ - for (i = 0; i < DEFEX_MEM_CACHE_COUNT; i++) { - spin_lock_irqsave(&creds_hash_update_lock, flags); - cache_allocated_memory[i] = mem_cache_reclaim(i, cache_allocated_memory[i]); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - ASSERT_NULL(test, cache_allocated_memory[i]); - } - -#endif /* DEFEX_PED_ENABLED */ - SUCCEED(test); -} - - -static void is_task_creds_ready_test(struct test *test) -{ - EXPECT_EQ(test, 1, is_task_creds_ready()); -} - - -static void get_task_creds_test(struct test *test) -{ -#ifdef DEFEX_PED_ENABLE - - unsigned int task_uid, task_fsuid, task_egid; - unsigned short task_cred_flags; - - ASSERT_TRUE(test, hash_empty(creds_hash)); - - /* T1: inexistent data */ - task_uid = TEST_UID; - task_fsuid = TEST_FSUID; - task_egid = TEST_EGID; - - get_task_creds(main_task, &task_uid, &task_fsuid, &task_egid, &task_cred_flags); - EXPECT_EQ(test, task_uid, 0); - EXPECT_EQ(test, task_fsuid, 0); - EXPECT_EQ(test, task_egid, 0); - EXPECT_EQ(test, task_cred_flags, CRED_FLAGS_PROOT); - - /* T2: existent main task data */ - ASSERT_SUCCESS(test, set_task_creds(main_task, TEST_UID, TEST_FSUID, TEST_EGID, TEST_FLAGS)); - get_task_creds(main_task, &task_uid, &task_fsuid, &task_egid, &task_cred_flags); - EXPECT_EQ(test, task_uid, TEST_UID); - EXPECT_EQ(test, task_fsuid, TEST_FSUID); - EXPECT_EQ(test, task_egid, TEST_EGID); - EXPECT_EQ(test, task_cred_flags, 0); - - /* T3: Fork task data */ - set_task_creds_tcnt(main_task, 1); - ASSERT_SUCCESS(test, set_task_creds(fork_task, TEST_UID, TEST_FSUID, TEST_EGID, TEST_FLAGS)); - get_task_creds(main_task, &task_uid, &task_fsuid, &task_egid, &task_cred_flags); - EXPECT_EQ(test, task_cred_flags, CRED_FLAGS_SUB_UPDATED); - get_task_creds(fork_task, &task_uid, &task_fsuid, &task_egid, &task_cred_flags); - EXPECT_EQ(test, task_uid, TEST_UID); - EXPECT_EQ(test, task_fsuid, TEST_FSUID); - EXPECT_EQ(test, task_egid, TEST_EGID); - EXPECT_EQ(test, task_cred_flags, 0); - - /* T4: Update main task data */ - ASSERT_SUCCESS(test, set_task_creds(main_task, TEST_UID + 1, TEST_FSUID + 1, TEST_EGID + 1, TEST_FLAGS)); - get_task_creds(main_task, &task_uid, &task_fsuid, &task_egid, &task_cred_flags); - EXPECT_EQ(test, task_uid, TEST_UID + 1); - EXPECT_EQ(test, task_fsuid, TEST_FSUID + 1); - EXPECT_EQ(test, task_egid, TEST_EGID + 1); - EXPECT_EQ(test, task_cred_flags, CRED_FLAGS_MAIN_UPDATED | CRED_FLAGS_SUB_UPDATED); - - /* Cleanup */ - set_task_creds_tcnt(fork_task, -1); - set_task_creds_tcnt(main_task, -1); - ASSERT_TRUE(test, hash_empty(creds_hash)); - -#endif /* DEFEX_PED_ENABLE */ - SUCCEED(test); -} - - -static void get_cred_ptr_test(struct test *test) -{ -#ifdef DEFEX_PED_ENABLE - struct proc_cred_data **cred_ptr; - unsigned long flags; - - ASSERT_TRUE(test, hash_empty(creds_hash)); - - /* T1: negative ID */ - get_cred_ptr(NEGATIVE_ID); - - /* Add cred data with ID < MAX_PID_32 */ - fork_task->pid = MAX_PID_32 - 1; - fork_task->tgid = MAX_PID_32 - 1; - ASSERT_SUCCESS(test, set_task_creds(fork_task, TEST_UID, TEST_FSUID, TEST_EGID, TEST_FLAGS)); - - /* T2: ID < MAX_PID_32 */ - spin_lock_irqsave(&creds_hash_update_lock, flags); - cred_ptr = get_cred_ptr(MAX_PID_32 - 1); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - EXPECT_NOT_NULL(test, cred_ptr); - EXPECT_EQ(test, (*cred_ptr)->cred_flags, TEST_FLAGS); - EXPECT_EQ(test, (*cred_ptr)->tcnt, 1); - EXPECT_EQ(test, (*cred_ptr)->default_ids.uid, TEST_UID); - EXPECT_EQ(test, (*cred_ptr)->default_ids.fsuid, TEST_FSUID); - EXPECT_EQ(test, (*cred_ptr)->default_ids.egid, TEST_EGID); - - /* T3a: id > MAX_PID_32, inexistent data */ - spin_lock_irqsave(&creds_hash_update_lock, flags); - cred_ptr = get_cred_ptr(main_task->pid); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - EXPECT_NULL(test, cred_ptr); - - /* Add cred data with ID > MAX_PID_32 */ - ASSERT_SUCCESS(test, set_task_creds(main_task, TEST_UID, TEST_FSUID, TEST_EGID, TEST_FLAGS)); - - /* T3b: ID > MAX_PID_32 */ - spin_lock_irqsave(&creds_hash_update_lock, flags); - cred_ptr = get_cred_ptr(main_task->pid); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - EXPECT_NOT_NULL(test, cred_ptr); - EXPECT_EQ(test, (*cred_ptr)->cred_flags, TEST_FLAGS); - EXPECT_EQ(test, (*cred_ptr)->tcnt, 1); - EXPECT_EQ(test, (*cred_ptr)->default_ids.uid, TEST_UID); - EXPECT_EQ(test, (*cred_ptr)->default_ids.fsuid, TEST_FSUID); - EXPECT_EQ(test, (*cred_ptr)->default_ids.egid, TEST_EGID); - - /* Cleanup */ - set_task_creds_tcnt(fork_task, -1); - set_task_creds_tcnt(main_task, -1); - ASSERT_TRUE(test, hash_empty(creds_hash)); - fork_task->pid = TEST_PID_FORK; - fork_task->tgid = TEST_PID_MAIN; -#endif /* DEFEX_PED_ENABLE */ - SUCCEED(test); -} - - -static void get_cred_data_test(struct test *test) -{ -#ifdef DEFEX_PED_ENABLE - struct proc_cred_data *cred_data, **cred_ptr; - unsigned long flags; - - ASSERT_TRUE(test, hash_empty(creds_hash)); - - /* T1: negative ID */ - get_cred_data(NEGATIVE_ID); - - /* Add cred data with ID < MAX_PID_32 */ - fork_task->pid = MAX_PID_32 - 1; - fork_task->tgid = MAX_PID_32 - 1; - ASSERT_SUCCESS(test, set_task_creds(fork_task, TEST_UID, TEST_FSUID, TEST_EGID, TEST_FLAGS)); - - /* T2: id < MAX_PID_32, get from vector */ - spin_lock_irqsave(&creds_hash_update_lock, flags); - cred_data = get_cred_data(MAX_PID_32 - 1); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - EXPECT_NOT_NULL(test, cred_data); - EXPECT_EQ(test, cred_data->cred_flags, TEST_FLAGS); - EXPECT_EQ(test, cred_data->tcnt, 1); - EXPECT_EQ(test, cred_data->default_ids.uid, TEST_UID); - EXPECT_EQ(test, cred_data->default_ids.fsuid, TEST_FSUID); - EXPECT_EQ(test, cred_data->default_ids.egid, TEST_EGID); - - /* T3a: id > MAX_PID_32, inexistent data */ - spin_lock_irqsave(&creds_hash_update_lock, flags); - cred_ptr = get_cred_ptr(main_task->pid); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - EXPECT_NULL(test, cred_ptr); - - /* Add cred data with ID > MAX_PID_32 */ - ASSERT_SUCCESS(test, set_task_creds(main_task, TEST_UID, TEST_FSUID, TEST_EGID, TEST_FLAGS)); - - /* T3b: id > MAX_PID_32, get from vector */ - spin_lock_irqsave(&creds_hash_update_lock, flags); - cred_data = get_cred_data(main_task->pid); - spin_unlock_irqrestore(&creds_hash_update_lock, flags); - EXPECT_NOT_NULL(test, cred_data); - EXPECT_EQ(test, cred_data->cred_flags, TEST_FLAGS); - EXPECT_EQ(test, cred_data->tcnt, 1); - EXPECT_EQ(test, cred_data->default_ids.uid, TEST_UID); - EXPECT_EQ(test, cred_data->default_ids.fsuid, TEST_FSUID); - EXPECT_EQ(test, cred_data->default_ids.egid, TEST_EGID); - - /* Cleanup */ - set_task_creds_tcnt(fork_task, -1); - set_task_creds_tcnt(main_task, -1); - ASSERT_TRUE(test, hash_empty(creds_hash)); - fork_task->pid = TEST_PID_FORK; - fork_task->tgid = TEST_PID_MAIN; - -#endif /* DEFEX_PED_ENABLE */ - SUCCEED(test); -} - - -static void creds_fast_hash_init_test(struct test *test) -{ - /* __init function */ - SUCCEED(test); -} - - -static int defex_ht_test_init(struct test *test) -{ - main_task = kzalloc(sizeof(*main_task), GFP_KERNEL); - if(!main_task) { - return -ENOMEM; - } - fork_task = kzalloc(sizeof(*fork_task), GFP_KERNEL); - if(!fork_task) { - kfree(main_task); - return -ENOMEM; - } - main_task->pid = TEST_PID_MAIN; - main_task->tgid = TEST_PID_MAIN; - fork_task->pid = TEST_PID_FORK; - fork_task->tgid = TEST_PID_MAIN; - return 0; -} - -static void defex_ht_test_exit(struct test *test) -{ - if(main_task) - kfree(main_task); - if(fork_task) - kfree(fork_task); -} - -static struct test_case defex_ht_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(set_task_creds_tcnt_test), - TEST_CASE(set_task_creds_test), - TEST_CASE(set_cred_data_test), - TEST_CASE(mem_cache_reclaim_test), - TEST_CASE(mem_cache_get_test), - TEST_CASE(mem_cache_alloc_test), - TEST_CASE(is_task_creds_ready_test), - TEST_CASE(get_task_creds_test), - TEST_CASE(get_cred_ptr_test), - TEST_CASE(get_cred_data_test), - TEST_CASE(creds_fast_hash_init_test), - {}, -}; - -static struct test_module defex_ht_test_module = { - .name = "defex_ht_test", - .init = defex_ht_test_init, - .exit = defex_ht_test_exit, - .test_cases = defex_ht_test_cases, -}; -module_test(defex_ht_test_module); - diff --git a/security/samsung/defex_lsm/cert/defex_sign.c b/security/samsung/defex_lsm/cert/defex_sign.c index b84c6aa813fd..8a957a9fe0b6 100755 --- a/security/samsung/defex_lsm/cert/defex_sign.c +++ b/security/samsung/defex_lsm/cert/defex_sign.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "include/defex_debug.h" #include "include/defex_sign.h" @@ -71,6 +72,9 @@ __visible_for_testing int defex_keyring_init(void) const struct cred *cred = current_cred(); static const char keyring_name[] = "defex_keyring"; + if (defex_keyring) + return err; + defex_keyring = defex_keyring_alloc(keyring_name, KUIDT_INIT(0), KGIDT_INIT(0), cred, KEY_ALLOC_NOT_IN_QUOTA); if (!defex_keyring) { @@ -93,20 +97,27 @@ __visible_for_testing int defex_public_key_verify_signature(unsigned char *pub_k key_ref_t key_ref; struct key *key; struct public_key_signature pks; + static const char key_name[] = "defex_key"; if (defex_keyring_init() != 0) return ret; - key_ref = key_create_or_update(make_key_ref(defex_keyring, 1), - "asymmetric", - NULL, - pub_key, - pub_key_size, - ((KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_VIEW | KEY_USR_READ), - KEY_ALLOC_NOT_IN_QUOTA); - +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 3, 0) + key_ref = keyring_search(make_key_ref(defex_keyring, 1), &key_type_asymmetric, key_name); +#else + key_ref = keyring_search(make_key_ref(defex_keyring, 1), &key_type_asymmetric, key_name, true); +#endif + if (IS_ERR(key_ref)) { + key_ref = key_create_or_update(make_key_ref(defex_keyring, 1), + "asymmetric", + key_name, + pub_key, + pub_key_size, + ((KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_VIEW | KEY_USR_READ), + KEY_ALLOC_NOT_IN_QUOTA); + } if (IS_ERR(key_ref)) { - printk(KERN_INFO "Invalid key reference\n"); + printk(KERN_INFO "Invalid key reference (%ld)\n", PTR_ERR(key_ref)); return ret; } @@ -137,7 +148,6 @@ __visible_for_testing int defex_public_key_verify_signature(unsigned char *pub_k ret = verify_signature(key, &pks); #endif key_ref_put(key_ref); - keyring_clear(defex_keyring); return ret; } #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0) */ diff --git a/security/samsung/defex_lsm/cert/kunit_test/Makefile b/security/samsung/defex_lsm/cert/kunit_test/Makefile deleted file mode 100755 index 08418262d8d9..000000000000 --- a/security/samsung/defex_lsm/cert/kunit_test/Makefile +++ /dev/null @@ -1,121 +0,0 @@ -# -# Makefile for the Defex kunit tests -# - -# Features to Enable -PED_ENABLE=true -SAFEPLACE_ENABLE=true -IMMUTABLE_ENABLE=true -LP_ENABLE=true -UMH_RESTRICTION_ENABLE=true - -ifneq ($(wildcard $(srctree)/include/crypto/internal/rsa.h),) - $(warning [DEFEX] INTEGRITY_ENABLE) - INTEGRITY_ENABLE=true -endif - -# caches to enable -CACHES_ENABLE=true - -# OEM Unlock dependency -OEM_UNLOCK_DEPENDENCY=true - -# use the ramdisk or system_root to store rules file -RAMDISK_ENABLE=true - -# do signing for rules -SIGN_ENABLE=true - -# Immutable Feature is applied with permissive mode first. -DEFEX_DEFINES := -DDEFEX_PERMISSIVE_IM - -ifeq ($(CONFIG_DEFEX_KERNEL_ONLY), y) - DEFEX_DEFINES += -DDEFEX_KERNEL_ONLY - ifeq ($(CONFIG_SAMSUNG_PRODUCT_SHIP), y) - $(warning [DEFEX-KUNIT] Kernel_only & Ship) - else - $(warning [DEFEX-KUNIT] Kernel_only & Noship) - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_SP - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_IM - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_LP - DEFEX_DEFINES += -DDEFEX_DEBUG_ENABLE - endif -endif - -ifeq ($(CONFIG_SEC_FACTORY), y) - DEFEX_DEFINES += -DDEFEX_FACTORY_ENABLE -endif - -ifeq ($(PED_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_PED_ENABLE -endif - -ifeq ($(SAFEPLACE_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_SAFEPLACE_ENABLE -endif - -ifeq ($(INTEGRITY_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_INTEGRITY_ENABLE -endif - -ifeq ($(IMMUTABLE_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_IMMUTABLE_ENABLE -endif - -ifeq ($(LP_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_LP_ENABLE -endif - -ifeq ($(UMH_RESTRICTION_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_UMH_RESTRICTION_ENABLE -endif - -ifeq ($(CACHES_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_CACHES_ENABLE -endif - -ifeq ($(OEM_UNLOCK_DEPENDENCY), true) - DEFEX_DEFINES += -DDEFEX_DEPENDING_ON_OEMUNLOCK -endif - -ifeq ($(RAMDISK_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_RAMDISK_ENABLE -ifeq ($(SIGN_ENABLE), true) - defex-y += defex_sign_test.o - DEFEX_DEFINES += -DDEFEX_SIGN_ENABLE -endif -endif - -ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_SP - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_IM - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_LP - DEFEX_DEFINES += -DDEFEX_DEBUG_ENABLE - DEFEX_DEFINES += -DDEFEX_SYSFS_ENABLE -else - ifeq ($(CONFIG_SECURITY_DSMS), y) - DEFEX_DEFINES += -DDEFEX_DSMS_ENABLE - endif -endif - -# kunit tests options: -ifeq ($(CONFIG_KUNIT), y) - DEFEX_DEFINES += -DDEFEX_KUNIT_ENABLED -else - DEFEX_DEFINES += -D__visible_for_testing=static -endif - -ccflags-y := -Wformat - -EXTRA_CFLAGS += -I$(srctree)/$(src)/../.. -EXTRA_AFLAGS += -Isecurity/samsung/defex_lsm -EXTRA_CFLAGS += -I$(srctree)/$(src)/../../cert -EXTRA_AFLAGS += -Isecurity/samsung/defex_lsm/cert - -ifneq ($(wildcard $(srctree)/$(src)/../../pack_rules.c),) - DEFEX_DEFINES += -DDEFEX_USE_PACKED_RULES -endif -EXTRA_CFLAGS += $(DEFEX_DEFINES) -EXTRA_AFLAGS += $(DEFEX_DEFINES) - -obj-$(CONFIG_SECURITY_DEFEX) := $(defex-y) diff --git a/security/samsung/defex_lsm/cert/kunit_test/defex_sign_test.c b/security/samsung/defex_lsm/cert/kunit_test/defex_sign_test.c deleted file mode 100755 index 2cf858007e4b..000000000000 --- a/security/samsung/defex_lsm/cert/kunit_test/defex_sign_test.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2020-2021 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include -#include -#include - -static void defex_rules_signature_check_test(struct test *test) -{ - /* __init function */ - SUCCEED(test); -} - - -static void defex_public_key_verify_signature_test(struct test *test) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0) - /* __init function */ -#else - /* Skip signature check at kernel version < 3.7.0 */ -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0) */ - SUCCEED(test); -} - - -static void defex_keyring_init_test(struct test *test) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0) - /* __init function */ -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0) */ - SUCCEED(test); -} - - -static void defex_keyring_alloc_test(struct test *test) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0) - /* __init function */ -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0) */ - SUCCEED(test); -} - - -static void defex_calc_hash_test(struct test *test) -{ - /* __init function */ - SUCCEED(test); -} - - -static void blob_test(struct test *test) -{ -#ifdef DEFEX_DEBUG_ENABLE - /* __init function */ -#endif /* DEFEX_DEBUG_ENABLE */ - SUCCEED(test); -} - - -static int defex_sign_test_init(struct test *test) -{ - return 0; -} - -static void defex_sign_test_exit(struct test *test) -{ -} - -static struct test_case defex_sign_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(defex_rules_signature_check_test), - TEST_CASE(defex_public_key_verify_signature_test), - TEST_CASE(defex_keyring_init_test), - TEST_CASE(defex_keyring_alloc_test), - TEST_CASE(defex_calc_hash_test), - TEST_CASE(blob_test), - {}, -}; - -static struct test_module defex_sign_test_module = { - .name = "defex_sign_test", - .init = defex_sign_test_init, - .exit = defex_sign_test_exit, - .test_cases = defex_sign_test_cases, -}; -module_test(defex_sign_test_module); - diff --git a/security/samsung/defex_lsm/core/defex_common.c b/security/samsung/defex_lsm/core/defex_common.c index 07659b274166..e9ea1bae880c 100755 --- a/security/samsung/defex_lsm/core/defex_common.c +++ b/security/samsung/defex_lsm/core/defex_common.c @@ -236,9 +236,11 @@ struct file *defex_get_source_file(struct task_struct *p) return NULL; if (self) #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0) - down_read(&proc_mm->mmap_sem); + if (!down_read_trylock(&proc_mm->mmap_sem)) + return NULL; #else - down_read(&proc_mm->mmap_lock); + if (!down_read_trylock(&proc_mm->mmap_lock)) + return NULL; #endif if (file_addr != proc_mm->exe_file) { file_addr = proc_mm->exe_file; diff --git a/security/samsung/defex_lsm/core/defex_get_mode.c b/security/samsung/defex_lsm/core/defex_get_mode.c index 8b6fb0eae7e9..89b9797f018a 100755 --- a/security/samsung/defex_lsm/core/defex_get_mode.c +++ b/security/samsung/defex_lsm/core/defex_get_mode.c @@ -29,6 +29,17 @@ int defex_get_features(void) #endif /* DEFEX_PERMISSIVE_PED */ #endif /* DEFEX_PED_ENABLE */ +#ifdef DEFEX_INTEGRITY_ENABLE +#if !defined(DEFEX_PERMISSIVE_INT) + features |= GLOBAL_INTEGRITY_STATUS; +#else + if (global_integrity_status != 0) + features |= FEATURE_INTEGRITY; + if (global_integrity_status == 2) + features |= FEATURE_INTEGRITY_SOFT; +#endif /* DEFEX_PERMISSIVE_INT */ +#endif /* DEFEX_INTEGRITY_ENABLE */ + #ifdef DEFEX_SAFEPLACE_ENABLE #if !defined(DEFEX_PERMISSIVE_SP) features |= GLOBAL_SAFEPLACE_STATUS; @@ -40,6 +51,17 @@ int defex_get_features(void) #endif /* DEFEX_PERMISSIVE_SP */ #endif /* DEFEX_SAFEPLACE_ENABLE */ +#ifdef DEFEX_TRUSTED_MAP_ENABLE +#if !defined(DEFEX_PERMISSIVE_TM) + features |= GLOBAL_TRUSTED_MAP_STATUS; +#else + if (global_trusted_map_status != 0) + features |= FEATURE_TRUSTED_MAP; + if (global_trusted_map_status & DEFEX_TM_PERMISSIVE_MODE) + features |= FEATURE_TRUSTED_MAP_SOFT; +#endif /* DEFEX_PERMISSIVE_TM */ +#endif /* DEFEX_TRUSTED_MAP_ENABLE */ + #ifdef DEFEX_IMMUTABLE_ENABLE #if !defined(DEFEX_PERMISSIVE_IM) features |= GLOBAL_IMMUTABLE_STATUS; diff --git a/security/samsung/defex_lsm/core/defex_main.c b/security/samsung/defex_lsm/core/defex_main.c index ca5b86f460b4..22a1583319bd 100755 --- a/security/samsung/defex_lsm/core/defex_main.c +++ b/security/samsung/defex_lsm/core/defex_main.c @@ -117,7 +117,7 @@ __visible_for_testing void defex_report_violation(const char *violation, uint64_ } #endif /* DEFEX_DSMS_ENABLE */ -#ifdef DEFEX_SAFEPLACE_ENABLE +#if defined(DEFEX_SAFEPLACE_ENABLE) || defined(DEFEX_TRUSTED_MAP_ENABLE) __visible_for_testing long kill_process(struct task_struct *p) { read_lock(&tasklist_lock); @@ -125,7 +125,7 @@ __visible_for_testing long kill_process(struct task_struct *p) read_unlock(&tasklist_lock); return 0; } -#endif /* DEFEX_SAFEPLACE_ENABLE */ +#endif /* DEFEX_SAFEPLACE_ENABLE || DEFEX_TRUSTED_MAP_ENABLE */ #ifdef DEFEX_PED_ENABLE __visible_for_testing long kill_process_group(struct task_struct *p, int tgid, int pid) @@ -144,8 +144,9 @@ __visible_for_testing int task_defex_is_secured(struct defex_context *dc) { struct file *exe_file = get_dc_process_file(dc); struct task_struct *p = dc->task->group_leader; + struct task_struct *task = dc->task; char *proc_name = get_dc_process_name(dc); - int is_secured = 1; + int is_secured = 0; if (!get_dc_process_dpath(dc)) return is_secured; @@ -158,6 +159,10 @@ __visible_for_testing int task_defex_is_secured(struct defex_context *dc) return DEFEX_ALLOW; } + if (!strncmp(task->comm, "FinalizerDaemon", strlen(task->comm))) { + return DEFEX_ALLOW; + } + is_secured = !rules_lookup(proc_name, feature_ped_exception, exe_file); return is_secured; } @@ -364,6 +369,34 @@ exit: } #endif /* DEFEX_PED_ENABLE */ +#ifdef DEFEX_INTEGRITY_ENABLE +__visible_for_testing int task_defex_integrity(struct defex_context *dc) +{ + int ret = DEFEX_ALLOW, is_violation = 0; + char *proc_file, *new_file; + struct task_struct *p = dc->task; + + if (!get_dc_target_dpath(dc)) + goto out; + + new_file = get_dc_target_name(dc); + is_violation = rules_lookup(new_file, feature_integrity_check, dc->target_file); + + if (is_violation == DEFEX_INTEGRITY_FAIL) { + ret = -DEFEX_DENY; + proc_file = get_dc_process_name(dc); + + pr_crit("defex: integrity violation [task=%s (%s), child=%s, uid=%d]\n", + p->comm, proc_file, new_file, uid_get_value(dc->cred.uid)); +#ifdef DEFEX_DSMS_ENABLE + defex_report_violation(INTEGRITY_VIOLATION, 0, dc, 0, 0, 0, 0); +#endif /* DEFEX_DSMS_ENABLE */ + } +out: + return ret; +} +#endif /* DEFEX_INTEGRITY_ENABLE */ + #ifdef DEFEX_SAFEPLACE_ENABLE /* Safeplace feature decision function */ __visible_for_testing int task_defex_safeplace(struct defex_context *dc) @@ -379,44 +412,48 @@ __visible_for_testing int task_defex_safeplace(struct defex_context *dc) goto out; new_file = get_dc_target_name(dc); - is_violation = rules_lookup(new_file, feature_safeplace_path, dc->target_file); -#ifdef DEFEX_INTEGRITY_ENABLE - if (is_violation != DEFEX_INTEGRITY_FAIL) -#endif /* DEFEX_INTEGRITY_ENABLE */ - is_violation = !is_violation; + is_violation = !rules_lookup(new_file, feature_safeplace_path, dc->target_file); if (is_violation) { ret = -DEFEX_DENY; proc_file = get_dc_process_name(dc); -#ifdef DEFEX_INTEGRITY_ENABLE - if (is_violation == DEFEX_INTEGRITY_FAIL) { - pr_crit("defex: integrity violation [task=%s (%s), child=%s, uid=%d]\n", - p->comm, proc_file, new_file, uid_get_value(dc->cred.uid)); -#ifdef DEFEX_DSMS_ENABLE - defex_report_violation(INTEGRITY_VIOLATION, 0, dc, 0, 0, 0, 0); -#endif /* DEFEX_DSMS_ENABLE */ - - /* Temporary make permissive mode for tereble - * system image is changed as google's and defex might not work - */ - ret = DEFEX_ALLOW; - } - else -#endif /* DEFEX_INTEGRITY_ENABLE */ - { - pr_crit("defex: safeplace violation [task=%s (%s), child=%s, uid=%d]\n", - p->comm, proc_file, new_file, uid_get_value(dc->cred.uid)); + pr_crit("defex: safeplace violation [task=%s (%s), child=%s, uid=%d]\n", + p->comm, proc_file, new_file, uid_get_value(dc->cred.uid)); #ifdef DEFEX_DSMS_ENABLE defex_report_violation(SAFEPLACE_VIOLATION, 0, dc, 0, 0, 0, 0); #endif /* DEFEX_DSMS_ENABLE */ - } } out: return ret; } #endif /* DEFEX_SAFEPLACE_ENABLE */ +#ifdef DEFEX_TRUSTED_MAP_ENABLE +/* Trusted map feature decision function */ +__visible_for_testing int task_defex_trusted_map(struct defex_context *dc, va_list ap) +{ + int ret = DEFEX_ALLOW, argc; + void *argv; + + if (!CHECK_ROOT_CREDS(&dc->cred)) + goto out; + + argc = va_arg(ap, int); + argv = va_arg(ap, void *); +#ifdef DEFEX_DEBUG_ENABLE + if (argc <= 0) + pr_crit("[DEFEX][DTM] Invalid trusted map arguments - check integration on fs/exec.c (argc %d)", argc); +#endif + + ret = defex_trusted_map_lookup(dc, argc, argv); + if (defex_tm_mode_enabled(DEFEX_TM_PERMISSIVE_MODE)) + ret = DEFEX_ALLOW; +out: + return ret; +} +#endif /* DEFEX_TRUSTED_MAP_ENABLE */ + #ifdef DEFEX_IMMUTABLE_ENABLE /* Immutable feature decision function */ @@ -468,12 +505,15 @@ out: #endif /* DEFEX_IMMUTABLE_ENABLE */ /* Main decision function */ -int task_defex_enforce(struct task_struct *p, struct file *f, int syscall) +int task_defex_enforce(struct task_struct *p, struct file *f, int syscall, ...) { int ret = DEFEX_ALLOW; int feature_flag; const struct local_syscall_struct *item; struct defex_context dc; +#ifdef DEFEX_TRUSTED_MAP_ENABLE + va_list ap; +#endif if (boot_state_unlocked) return ret; @@ -511,6 +551,23 @@ int task_defex_enforce(struct task_struct *p, struct file *f, int syscall) } #endif /* DEFEX_PED_ENABLE */ +#ifdef DEFEX_INTEGRITY_ENABLE + /* Integrity feature */ + if (feature_flag & FEATURE_INTEGRITY) { + if (syscall == __DEFEX_execve) { + ret = task_defex_integrity(&dc); + if (ret == -DEFEX_DENY) { + if (!(feature_flag & FEATURE_INTEGRITY_SOFT)) { + release_defex_context(&dc); + put_task_struct(p); + kill_process(p); + return -DEFEX_DENY; + } + } + } + } +#endif /* DEFEX_INTEGRITY_ENABLE */ + #ifdef DEFEX_SAFEPLACE_ENABLE /* Safeplace feature */ if (feature_flag & FEATURE_SAFEPLACE) { @@ -542,6 +599,23 @@ int task_defex_enforce(struct task_struct *p, struct file *f, int syscall) } } #endif /* DEFEX_IMMUTABLE_ENABLE */ + +#ifdef DEFEX_TRUSTED_MAP_ENABLE + /* Trusted map feature */ + if (feature_flag & FEATURE_TRUSTED_MAP) { + if (syscall == __DEFEX_execve) { + va_start(ap, syscall); + ret = task_defex_trusted_map(&dc, ap); + va_end(ap); + if (ret == -DEFEX_DENY) { + if (!(feature_flag & FEATURE_TRUSTED_MAP_SOFT)) { + kill_process(p); + goto do_deny; + } + } + } + } +#endif /* DEFEX_TRUSTED_MAP_ENABLE */ do_allow: release_defex_context(&dc); put_task_struct(p); diff --git a/security/samsung/defex_lsm/core/defex_rules_proc.c b/security/samsung/defex_lsm/core/defex_rules_proc.c index 7a81175a1343..3751d97ada28 100755 --- a/security/samsung/defex_lsm/core/defex_rules_proc.c +++ b/security/samsung/defex_lsm/core/defex_rules_proc.c @@ -18,6 +18,10 @@ #include "include/defex_internal.h" #include "include/defex_rules.h" #include "include/defex_sign.h" +#ifdef DEFEX_TRUSTED_MAP_ENABLE +#include "include/defex_tailer.h" +#include "include/ptree.h" +#endif #define LOAD_FLAG_DPOLICY 0x01 #define LOAD_FLAG_DPOLICY_SYSTEM 0x02 @@ -58,9 +62,16 @@ __visible_for_testing unsigned char packed_rules_primary[DEFEX_RULES_ARRAY_SIZE] __visible_for_testing unsigned char packed_rules_primary[DEFEX_RULES_ARRAY_SIZE] __ro_after_init = {0}; #endif /* DEFEX_KERNEL_ONLY */ static unsigned char *packed_rules_secondary; +#ifdef DEFEX_TRUSTED_MAP_ENABLE +struct PPTree dtm_tree; +#endif #endif /* DEFEX_RAMDISK_ENABLE */ +#ifdef DEFEX_TRUSTED_MAP_ENABLE +/* In loaded policy, title of DTM's section; set by tailer -t in buildscript/build_external/defex. */ +#define DEFEX_DTM_SECTION_NAME "dtm_rules" +#endif #ifdef DEFEX_INTEGRITY_ENABLE @@ -238,6 +249,13 @@ __visible_for_testing int defex_integrity_default(const char *file_path) #if defined(DEFEX_RAMDISK_ENABLE) +#ifdef DEFEX_TRUSTED_MAP_ENABLE +static const unsigned char *find_policy_section(const char *name, const char *data, int data_size, long *section_size) +{ + return data_size > 0 ? defex_tailerp_find(data, data_size, name, section_size) : 0; +} +#endif + __visible_for_testing int load_rules_common(struct file *f, int flags) { int res = -1, data_size, rules_size; @@ -269,20 +287,29 @@ __visible_for_testing int load_rules_common(struct file *f, int flags) #endif if (!res) { + const unsigned char *policy_data = NULL; /* where additional features like DTM could look for policy data */ if (!(load_flags & (LOAD_FLAG_DPOLICY | LOAD_FLAG_DPOLICY_SYSTEM))) { if (rules_size > sizeof(packed_rules_primary)) { res = -1; goto do_clean; } memcpy(packed_rules_primary, data_buff, rules_size); + policy_data = packed_rules_primary; if (flags & LOAD_FLAG_DPOLICY_SYSTEM) load_flags |= LOAD_FLAG_SYSTEM_FIRST; } else { if (rules_size > 0) { - packed_rules_secondary = data_buff; + policy_data = packed_rules_secondary = data_buff; data_buff = NULL; } } +#ifdef DEFEX_TRUSTED_MAP_ENABLE + if (policy_data && !dtm_tree.data) { /* DTM not yet initialized */ + const unsigned char *dtm_section = find_policy_section(DEFEX_DTM_SECTION_NAME, policy_data, rules_size, 0); + if (dtm_section) + pptree_set_data(&dtm_tree, dtm_section); + } +#endif load_flags |= flags; res = rules_size; } @@ -504,7 +531,8 @@ try_not_system: if (cur_item->feature_type & attribute) { #ifdef DEFEX_INTEGRITY_ENABLE /* Integrity acceptable only for files */ - if ((cur_item->feature_type & feature_is_file) && f) { + if ((cur_item->feature_type & feature_integrity_check) && + (cur_item->feature_type & feature_is_file) && f) { if (defex_integrity_default(file_path) && defex_check_integrity(f, cur_item->integrity)) return DEFEX_INTEGRITY_FAIL; diff --git a/security/samsung/defex_lsm/core/defex_tailer.c b/security/samsung/defex_lsm/core/defex_tailer.c new file mode 100755 index 000000000000..20799337bcb4 --- /dev/null +++ b/security/samsung/defex_lsm/core/defex_tailer.c @@ -0,0 +1,98 @@ +/* Routines for handling archival-like files where each new contents is + * appended and linked backwards - memory-only variants. + */ + +#include +#include "include/defex_tailer.h" + +/* Reads int from 4-byte big-endian */ +static int be2int(const unsigned char *p) +{ + return (*p << 24) + (p[1] << 16) + (p[2] << 8) + p[3]; +} + +long defex_tailerp_has_suffix(const unsigned char *p, long size) +{ + return !p || size < TAIL_MAGIC_LEN + 8 + 1 + 2 || + memcmp(p + size - TAIL_MAGIC_LEN, TAIL_MAGIC, TAIL_MAGIC_LEN) + ? 0 : size - TAIL_MAGIC_LEN; +} + +int defex_tailerp_iterate(const unsigned char *p, long size, + int (*task)(const char *title, int titleLen, + const unsigned char *start, long size, + void *data), + void *data) +{ + long start, offset = defex_tailerp_has_suffix(p, size); + char buffer[TAIL_MAX_TITLE_LENGTH]; + + if (!offset) + return 0; + for (offset -= 2; ; offset = start - 2) { + int i, ttlLength; + long size; + + /* Possibly change behavior depending on version + * (p[offset] and p[offset + 1]) + */ + ttlLength = p[--offset]; + if (offset - 4 - 4 - ttlLength < 0) + return -1; + memcpy(buffer, p + (offset -= ttlLength), ttlLength); + size = be2int(p + (offset -= 4)); + start = be2int(p + (offset -= 4)); + if (task) { + i = (*task)(buffer, ttlLength, + p + start, size, data); + if (i < 0) + return i; + } + if (!start) + break; + } + return 0; +} + +/* Auxiliary data for finding an entry */ +struct find_data { + const char *title; + int titleLen; + int found; + const unsigned char *start; + long size; +}; + +static int tailerp_iteratefind(const char *title, int titleLen, + const unsigned char *start, long size, + void *data) +{ + struct find_data *fd = (struct find_data *)data; + + if (fd->titleLen == titleLen && + !memcmp(title, fd->title, titleLen)) { + fd->found = 1; + fd->start = start; + fd->size = size; + return -1; + } + return 0; +} + +const unsigned char *defex_tailerp_find(const unsigned char *p, long size, + const char *title, long *sizep) +{ + struct find_data fd; + + fd.title = title; + fd.titleLen = strlen(title); + fd.found = 0; + if (!defex_tailerp_iterate(p, size, tailerp_iteratefind, &fd)) + return 0; + if (fd.found) { + if (sizep) + *sizep = fd.size; + return fd.start; + } + return 0; +} diff --git a/security/samsung/defex_lsm/core/kunit_test/Makefile b/security/samsung/defex_lsm/core/kunit_test/Makefile deleted file mode 100755 index f303649940d9..000000000000 --- a/security/samsung/defex_lsm/core/kunit_test/Makefile +++ /dev/null @@ -1,126 +0,0 @@ -# -# Makefile for the Defex kunit tests -# - -# Features to Enable -PED_ENABLE=true -SAFEPLACE_ENABLE=true -IMMUTABLE_ENABLE=true -LP_ENABLE=true -UMH_RESTRICTION_ENABLE=true - -ifneq ($(wildcard $(srctree)/include/crypto/internal/rsa.h),) - $(warning [DEFEX] INTEGRITY_ENABLE) - INTEGRITY_ENABLE=true -endif - -# caches to enable -CACHES_ENABLE=true - -# OEM Unlock dependency -OEM_UNLOCK_DEPENDENCY=true - -# use the ramdisk or system_root to store rules file -RAMDISK_ENABLE=true - -# do signing for rules -SIGN_ENABLE=true - -defex-y := defex_common_test.o -defex-y += defex_lsm_test.o -defex-y += defex_main_test.o -defex-y += defex_get_mode_test.o -defex-y += defex_rules_proc_test.o - -# Immutable Feature is applied with permissive mode first. -DEFEX_DEFINES := -DDEFEX_PERMISSIVE_IM - -ifeq ($(CONFIG_DEFEX_KERNEL_ONLY), y) - DEFEX_DEFINES += -DDEFEX_KERNEL_ONLY - ifeq ($(CONFIG_SAMSUNG_PRODUCT_SHIP), y) - $(warning [DEFEX-KUNIT] Kernel_only & Ship) - else - $(warning [DEFEX-KUNIT] Kernel_only & Noship) - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_SP - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_IM - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_LP - DEFEX_DEFINES += -DDEFEX_DEBUG_ENABLE - endif -endif - -ifeq ($(CONFIG_SEC_FACTORY), y) - DEFEX_DEFINES += -DDEFEX_FACTORY_ENABLE -endif - -ifeq ($(PED_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_PED_ENABLE -endif - -ifeq ($(SAFEPLACE_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_SAFEPLACE_ENABLE -endif - -ifeq ($(INTEGRITY_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_INTEGRITY_ENABLE -endif - -ifeq ($(IMMUTABLE_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_IMMUTABLE_ENABLE -endif - -ifeq ($(LP_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_LP_ENABLE -endif - -ifeq ($(UMH_RESTRICTION_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_UMH_RESTRICTION_ENABLE -endif - -ifeq ($(CACHES_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_CACHES_ENABLE -endif - -ifeq ($(OEM_UNLOCK_DEPENDENCY), true) - DEFEX_DEFINES += -DDEFEX_DEPENDING_ON_OEMUNLOCK -endif - -ifeq ($(RAMDISK_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_RAMDISK_ENABLE -ifeq ($(SIGN_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_SIGN_ENABLE -endif -endif - -ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_SP - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_IM - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_LP - DEFEX_DEFINES += -DDEFEX_DEBUG_ENABLE - DEFEX_DEFINES += -DDEFEX_SYSFS_ENABLE -else - ifeq ($(CONFIG_SECURITY_DSMS), y) - DEFEX_DEFINES += -DDEFEX_DSMS_ENABLE - endif -endif - -# kunit tests options: -ifeq ($(CONFIG_KUNIT), y) - DEFEX_DEFINES += -DDEFEX_KUNIT_ENABLED -else - DEFEX_DEFINES += -D__visible_for_testing=static -endif - -ccflags-y := -Wformat - -EXTRA_CFLAGS += -I$(srctree)/$(src)/../.. -EXTRA_AFLAGS += -Isecurity/samsung/defex_lsm -EXTRA_CFLAGS += -I$(srctree)/$(src)/../../cert -EXTRA_AFLAGS += -Isecurity/samsung/defex_lsm/cert - -ifneq ($(wildcard $(srctree)/$(src)/../../pack_rules.c),) - DEFEX_DEFINES += -DDEFEX_USE_PACKED_RULES -endif -EXTRA_CFLAGS += $(DEFEX_DEFINES) -EXTRA_AFLAGS += $(DEFEX_DEFINES) - -obj-$(CONFIG_SECURITY_DEFEX) := $(defex-y) diff --git a/security/samsung/defex_lsm/core/kunit_test/defex_common_test.c b/security/samsung/defex_lsm/core/kunit_test/defex_common_test.c deleted file mode 100755 index f79ed003dcd7..000000000000 --- a/security/samsung/defex_lsm/core/kunit_test/defex_common_test.c +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "include/defex_caches.h" -#include "include/defex_catch_list.h" -#include "include/defex_config.h" -#include "include/defex_internal.h" -#include "include/defex_rules.h" -#include "include/defex_test.h" - -#define ROOT_PATH "/" - -static int kunit_mock_thread_function() -{ - while (!kthread_should_stop()); - return 42; -} - -/* General test functions created by Generate_KUnit.sh */ - -static void release_defex_context_test(struct test *test) -{ - struct defex_context dc; - - init_defex_context(&dc, __DEFEX_execve, current, NULL); - release_defex_context(&dc); -} - - -static void local_fread_test(struct test *test) -{ - struct file *f; - loff_t offset = 0; - - f = local_fopen(ROOT_PATH, O_RDONLY, 0); - ASSERT_FALSE(test, IS_ERR_OR_NULL(f)); - EXPECT_EQ(test, local_fread(f, offset, NULL, 0), -EISDIR); - filp_close(f, NULL); - - /* Missing test case in which a file is opened for read without error */ -} - - -static void local_fopen_test(struct test *test) -{ - struct file *f; - - f = local_fopen(ROOT_PATH, O_RDONLY, 0); - EXPECT_FALSE(test, IS_ERR_OR_NULL(f)); - if (!IS_ERR_OR_NULL(f)) - filp_close(f, NULL); -} - - -static void init_defex_context_test(struct test *test) -{ - struct defex_context dc; - struct task_struct *mock_task; - - mock_task = kthread_run(kunit_mock_thread_function, NULL, "defex_common_test_thread"); - get_task_struct(mock_task); - ssleep(1); - - init_defex_context(&dc, __DEFEX_execve, mock_task, NULL); - EXPECT_EQ(test, dc.syscall_no, __DEFEX_execve); - EXPECT_EQ(test, dc.task, mock_task); - EXPECT_EQ(test, dc.process_file, NULL); - EXPECT_EQ(test, dc.process_dpath, NULL); - EXPECT_EQ(test, dc.process_name, NULL); - EXPECT_EQ(test, dc.target_file, NULL); - EXPECT_EQ(test, dc.target_dpath, NULL); - EXPECT_EQ(test, dc.target_name, NULL); - EXPECT_EQ(test, dc.process_name_buff, NULL); - EXPECT_EQ(test, dc.target_name_buff, NULL); - EXPECT_EQ(test, dc.cred.uid.val, mock_task->cred->uid.val); - EXPECT_EQ(test, dc.cred.gid.val, mock_task->cred->gid.val); - EXPECT_EQ(test, dc.cred.suid.val, mock_task->cred->suid.val); - EXPECT_EQ(test, dc.cred.sgid.val, mock_task->cred->sgid.val); - EXPECT_EQ(test, dc.cred.euid.val, mock_task->cred->euid.val); - EXPECT_EQ(test, dc.cred.egid.val, mock_task->cred->egid.val); - EXPECT_EQ(test, dc.cred.fsuid.val, mock_task->cred->fsuid.val); - EXPECT_EQ(test, dc.cred.fsgid.val, mock_task->cred->fsgid.val); - - /* Finalize */ - release_defex_context(&dc); - kthread_stop(mock_task); - put_task_struct(mock_task); -} - - -static void get_dc_target_name_test(struct test *test) -{ - struct defex_context dc; - struct file *test_file; - char * process_name; - - test_file = local_fopen(ROOT_PATH, O_RDONLY, 0); - ASSERT_FALSE(test, IS_ERR_OR_NULL(test_file)); - - /* Target name != "" */ - init_defex_context(&dc, __DEFEX_execve, current, test_file); - process_name = get_dc_target_name(&dc); - EXPECT_NE(test, strncmp(process_name, "", 18), 0); - release_defex_context(&dc); - filp_close(test_file, NULL); - - /* Target name == "" */ - init_defex_context(&dc, __DEFEX_execve, current, NULL); - process_name = get_dc_target_name(&dc); - EXPECT_EQ(test, strncmp(process_name, "", 18), 0); - release_defex_context(&dc); -} - - -static void get_dc_target_dpath_test(struct test *test) -{ - struct defex_context dc; - struct file *test_file; - - test_file = local_fopen(ROOT_PATH, O_RDONLY, 0); - ASSERT_FALSE(test, IS_ERR_OR_NULL(test_file)); - - /* With target file, get_dc_target_dpath != NULL */ - init_defex_context(&dc, __DEFEX_execve, current, test_file); - EXPECT_NE(test, get_dc_target_dpath(&dc), NULL); - release_defex_context(&dc); - filp_close(test_file, NULL); - - /* Without target file, get_dc_target_dpath == NULL */ - init_defex_context(&dc, __DEFEX_execve, current, NULL); - EXPECT_EQ(test, get_dc_target_dpath(&dc), NULL); - release_defex_context(&dc); -} - - -static void get_dc_process_name_test(struct test *test) -{ - struct defex_context dc; - char *process_name; - - init_defex_context(&dc, __DEFEX_execve, current, NULL); - process_name = get_dc_process_name(&dc); - EXPECT_EQ(test, strncmp(process_name, "", 18), 0); - release_defex_context(&dc); -} - - -static void get_dc_process_file_test(struct test *test) -{ - struct defex_context dc; - - init_defex_context(&dc, __DEFEX_execve, current, NULL); - EXPECT_EQ(test, get_dc_process_file(&dc), NULL); - release_defex_context(&dc); -} - - -static void get_dc_process_dpath_test(struct test *test) -{ - struct defex_context dc; - - init_defex_context(&dc, __DEFEX_execve, current, NULL); - EXPECT_EQ(test, get_dc_process_dpath(&dc), NULL); - release_defex_context(&dc); - - /* Need a situation in which get_dc_process_dpath != NULL to increase coverage */ -} - - -static void defex_resolve_filename_test(struct test *test) -{ - char *filename = NULL; - char *buff = NULL; - - filename = defex_resolve_filename("/test.txt", &buff); - EXPECT_EQ(test, filename, NULL); - - /* Missing case where dpath in defex_resolve_filename returns != NULL */ -} - - -static void defex_get_source_file_test(struct test *test) -{ - EXPECT_EQ(test, defex_get_source_file(current), NULL); - /* Not able to test a source file != NULL */ -} - - -static void defex_get_filename_test(struct test *test) -{ - char *filename; - - filename = defex_get_filename(current); - EXPECT_EQ(test, strncmp(filename, "", 18), 0); - - /* Could not set up a situation where defex_get_source_file is != NULL */ -} - - -static void defex_files_identical_test(struct test *test) -{ - /* EXPECT_EQ(test, 1, defex_files_identical()); */ -} - - -static void __vfs_read_test(struct test *test) -{ - /* EXPECT_EQ(test, 1, __vfs_read()); */ -} - - -static int defex_common_test_init(struct test *test) -{ - /* - * test->priv = a_struct_pointer; - * if (!test->priv) - * return -ENOMEM; - */ - - return 0; -} - -static void defex_common_test_exit(struct test *test) -{ -} - -static struct test_case defex_common_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(release_defex_context_test), - TEST_CASE(local_fread_test), - TEST_CASE(local_fopen_test), - TEST_CASE(init_defex_context_test), - TEST_CASE(get_dc_target_name_test), - TEST_CASE(get_dc_target_dpath_test), - TEST_CASE(get_dc_process_name_test), - TEST_CASE(get_dc_process_file_test), - TEST_CASE(get_dc_process_dpath_test), - TEST_CASE(defex_resolve_filename_test), - TEST_CASE(defex_get_source_file_test), - TEST_CASE(defex_get_filename_test), - TEST_CASE(defex_files_identical_test), - TEST_CASE(__vfs_read_test), - {}, -}; - -static struct test_module defex_common_test_module = { - .name = "defex_common_test", - .init = defex_common_test_init, - .exit = defex_common_test_exit, - .test_cases = defex_common_test_cases, -}; -module_test(defex_common_test_module); - diff --git a/security/samsung/defex_lsm/core/kunit_test/defex_get_mode_test.c b/security/samsung/defex_lsm/core/kunit_test/defex_get_mode_test.c deleted file mode 100755 index 6b9a4b5ef4d6..000000000000 --- a/security/samsung/defex_lsm/core/kunit_test/defex_get_mode_test.c +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include -#include -#include "include/defex_internal.h" - -/* Helper methods for testing */ - -int get_current_ped_features(void) -{ - int ped_features = 0; -#if defined(DEFEX_PED_ENABLE) && defined(DEFEX_PERMISSIVE_PED) - if (global_privesc_status != 0) - ped_features |= FEATURE_CHECK_CREDS; - if (global_privesc_status == 2) - ped_features |= FEATURE_CHECK_CREDS_SOFT; -#elif defined(DEFEX_PED_ENABLE) - ped_features |= GLOBAL_PED_STATUS; -#endif /* DEFEX_PERMISSIVE_PED */ - return ped_features; -} - -int get_current_safeplace_features(void) -{ - int safeplace_features = 0; -#if defined(DEFEX_SAFEPLACE_ENABLE) && defined(DEFEX_PERMISSIVE_SP) - if (global_safeplace_status != 0) - safeplace_features |= FEATURE_SAFEPLACE; - if (global_safeplace_status == 2) - safeplace_features |= FEATURE_SAFEPLACE_SOFT; -#elif defined(DEFEX_SAFEPLACE_ENABLE) - safeplace_features |= GLOBAL_SAFEPLACE_STATUS; -#endif - return safeplace_features; -} - -int get_current_immutable_features(void) -{ - int immutable_features = 0; -#if defined(DEFEX_IMMUTABLE_ENABLE) && defined(DEFEX_PERMISSIVE_IM) - if (global_immutable_status != 0) - immutable_features |= FEATURE_IMMUTABLE; - if (global_immutable_status == 2) - immutable_features |= FEATURE_IMMUTABLE_SOFT; -#elif defined(DEFEX_IMMUTABLE_ENABLE) - immutable_features |= GLOBAL_IMMUTABLE_STATUS; -#endif - return immutable_features; -} - -static void defex_get_mode_test(struct test *test) -{ - int expected_features; -#if defined(DEFEX_PED_ENABLE) && defined(DEFEX_PERMISSIVE_PED) - unsigned int ped_status_backup; -#endif -#if defined DEFEX_SAFEPLACE_ENABLE && defined DEFEX_PERMISSIVE_SP - unsigned int safeplace_status_backup; -#endif -#if defined DEFEX_IMMUTABLE_ENABLE && defined DEFEX_PERMISSIVE_IM - unsigned int immutable_status_backup; -#endif - -#ifdef DEFEX_PED_ENABLE - expected_features = 0; - expected_features |= get_current_safeplace_features(); - expected_features |= get_current_immutable_features(); - -#ifdef DEFEX_PERMISSIVE_PED - ped_status_backup = global_privesc_status; - - global_privesc_status = 1; - expected_features |= FEATURE_CHECK_CREDS; - EXPECT_EQ(test, defex_get_features(), expected_features); - - global_privesc_status = 2; - expected_features |= FEATURE_CHECK_CREDS_SOFT; - EXPECT_EQ(test, defex_get_features(), expected_features); - - global_privesc_status = ped_status_backup; - -#else - expected_features |= GLOBAL_PED_STATUS; - EXPECT_EQ(test, defex_get_features(), expected_features); - -#endif /* DEFEX_PERMISSIVE_PED */ -#endif /* DEFEX_PED_ENABLE */ -/*-------------------------------------------------------------------*/ -#ifdef DEFEX_SAFEPLACE_ENABLE - expected_features = 0; - expected_features |= get_current_ped_features(); - expected_features |= get_current_immutable_features(); - -#ifdef DEFEX_PERMISSIVE_SP - safeplace_status_backup = global_safeplace_status; - - global_safeplace_status = 1; - expected_features |= FEATURE_SAFEPLACE; - EXPECT_EQ(test, defex_get_features(), expected_features); - - global_safeplace_status = 2; - expected_features |= FEATURE_SAFEPLACE_SOFT; - EXPECT_EQ(test, defex_get_features(), expected_features); - - global_safeplace_status = safeplace_status_backup; -#else - expected_features |= GLOBAL_SAFEPLACE_STATUS; - EXPECT_EQ(test, defex_get_features(), expected_features); -#endif /* DEFEX_PERMISSIVE_SP */ -#endif /* DEFEX_SAFEPLACE_ENABLE */ -/*-------------------------------------------------------------------*/ -#ifdef DEFEX_IMMUTABLE_ENABLE - expected_features = 0; - expected_features |= get_current_ped_features(); - expected_features |= get_current_safeplace_features(); - -#ifdef DEFEX_PERMISSIVE_IM - immutable_status_backup = global_immutable_status; - - global_immutable_status = 1; - expected_features |= FEATURE_IMMUTABLE; - EXPECT_EQ(test, defex_get_features(), expected_features); - - global_immutable_status = 2; - expected_features |= FEATURE_IMMUTABLE_SOFT; - EXPECT_EQ(test, defex_get_features(), expected_features); - - global_immutable_status = immutable_status_backup; -#else - expected_features |= GLOBAL_IMMUTABLE_STATUS; - EXPECT_EQ(test, defex_get_features(), expected_features); -#endif /* DEFEX_PERMISSIVE_IM */ -#endif /* DEFEX_IMMUTABLE_ENABLE */ - SUCCEED(test); -} - -static int defex_get_mode_test_init(struct test *test) -{ - return 0; -} - -static void defex_get_mode_test_exit(struct test *test) -{ -} - -static struct test_case defex_get_mode_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(defex_get_mode_test), - {}, -}; - -static struct test_module defex_get_mode_test_module = { - .name = "defex_get_mode_test", - .init = defex_get_mode_test_init, - .exit = defex_get_mode_test_exit, - .test_cases = defex_get_mode_test_cases, -}; -module_test(defex_get_mode_test_module); - diff --git a/security/samsung/defex_lsm/core/kunit_test/defex_lsm_test.c b/security/samsung/defex_lsm/core/kunit_test/defex_lsm_test.c deleted file mode 100755 index 0b377bc30806..000000000000 --- a/security/samsung/defex_lsm/core/kunit_test/defex_lsm_test.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2020-2021 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include - -static void defex_syscall_enter_test(struct test *test) -{ - struct pt_regs *regs = task_pt_regs(current); - - EXPECT_EQ(test, defex_syscall_enter(__NR_syscalls + 1, regs), 0); -#ifdef __NR_write - EXPECT_EQ(test, defex_syscall_enter(__NR_write, regs), 0); -#endif -} - - -static void defex_syscall_catch_enter_test(struct test *test) -{ - /* EXPECT_EQ(test, 1, defex_syscall_catch_enter()); */ -} - - -static void defex_lsm_init_test(struct test *test) -{ - /* __init function */ - SUCCEED(test); -} - -static void defex_lsm_load_test(struct test *test) -{ - /* __init function */ - SUCCEED(test); -} - -static int defex_lsm_test_init(struct test *test) -{ - return 0; -} - -static void defex_lsm_test_exit(struct test *test) -{ -} - -static struct test_case defex_lsm_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(defex_syscall_enter_test), - TEST_CASE(defex_syscall_catch_enter_test), - TEST_CASE(defex_lsm_init_test), - TEST_CASE(defex_lsm_load_test), - {}, -}; - -static struct test_module defex_lsm_test_module = { - .name = "defex_lsm_test", - .init = defex_lsm_test_init, - .exit = defex_lsm_test_exit, - .test_cases = defex_lsm_test_cases, -}; -module_test(defex_lsm_test_module); - diff --git a/security/samsung/defex_lsm/core/kunit_test/defex_main_test.c b/security/samsung/defex_lsm/core/kunit_test/defex_main_test.c deleted file mode 100755 index 1110f965b6fd..000000000000 --- a/security/samsung/defex_lsm/core/kunit_test/defex_main_test.c +++ /dev/null @@ -1,590 +0,0 @@ -/* - * Copyright (c) 2020-2021 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "include/defex_internal.h" -#include "include/defex_test.h" -#include "include/defex_rules.h" -#include "include/defex_catch_list.h" - -#define SAMPLE_PATH "/system/bin/umh/dsms" -#define DUMMY_FILE "/dummy.txt" -#define SHELL_PATH "/system/bin/sh" -#define ROOT_PATH "/" -#define REBOOT_PATH "/system/bin/reboot" -#define dead_uid 0xDEADBEAF - -static int kunit_mock_thread_function() -{ - while (!kthread_should_stop()); - return 42; -} - -/* General test functions created by Generate_KUnit.sh */ - -static void verifiedboot_state_setup_test(struct test *test) -{ - /* EXPECT_EQ(test, 1, verifiedboot_state_setup()); */ - SUCCEED(test); -} - - -static void task_defex_zero_creds_test(struct test *test) -{ - struct task_struct *mock_task; - unsigned int backup_flags; - - mock_task = kthread_run(kunit_mock_thread_function, NULL, "task_defex_zero_creds_test_thread"); - get_task_struct(mock_task); - ASSERT_FALSE(test, IS_ERR_OR_NULL(mock_task)); - ssleep(1); - - /* tsk->flags & (PF_KTHREAD | PF_WQ_WORKER) */ - EXPECT_EQ(test, task_defex_zero_creds(current), 0); - - backup_flags = mock_task->flags; - mock_task->flags &= ~PF_KTHREAD; - mock_task->flags &= ~PF_WQ_WORKER; -#ifdef TASK_NEW - /* is_fork = 0 (mock_task->state & TASK_NEW) == true */ - mock_task->state |= TASK_NEW; -#endif - EXPECT_EQ(test, task_defex_zero_creds(mock_task), 0); - mock_task->flags = backup_flags; - - /* Finalize */ - kthread_stop(mock_task); - put_task_struct(mock_task); -} - - -static void task_defex_user_exec_test(struct test *test) -{ -#ifdef DEFEX_UMH_RESTRICTION_ENABLE - /* Non-existant file */ - EXPECT_EQ(test, task_defex_user_exec(DUMMY_FILE), DEFEX_DENY); - /* /system/bin/sh is a violation */ - EXPECT_EQ(test, task_defex_user_exec(SHELL_PATH), DEFEX_DENY); - /* /system/bin/umh/dsms is not a violation ONLY after first boot*/ - //It's not clear what to expect with automated testing - //EXPECT_EQ(test, task_defex_user_exec(SAMPLE_PATH), DEFEX_ALLOW); -#ifdef DEFEX_FACTORY_ENABLE - EXPECT_EQ(test, task_defex_user_exec(REBOOT_PATH), DEFEX_DENY); -#endif /* DEFEX_FACTORY_ENABLE */ -#else - SUCCEED(test); -#endif /* DEFEX_UMH_RESTRICTION_ENABLE */ -} - - -static void task_defex_src_exception_test(struct test *test) -{ -#ifdef DEFEX_IMMUTABLE_ENABLE - struct defex_context dc; - - init_defex_context(&dc, 0, current, NULL); - EXPECT_EQ(test, task_defex_src_exception(&dc), 1); - release_defex_context(&dc); - /* Need a situation in which get_dc_process_dpath != NULL to increase coverage */ -#else - SUCCEED(test); -#endif -} - - -static void task_defex_safeplace_test(struct test *test) -{ -#ifdef DEFEX_SAFEPLACE_ENABLE - struct defex_context dc; - struct task_struct *mock_task; - struct cred mock_creds; - struct file *test_file; - struct cred backup_creds; - - mock_task = kthread_run(kunit_mock_thread_function, NULL, "task_defex_safeplace_test_thread"); - get_task_struct(mock_task); - ASSERT_FALSE(test, IS_ERR_OR_NULL(mock_task)); - ssleep(1); - test_file = local_fopen(ROOT_PATH, O_RDONLY, 0); - ASSERT_FALSE(test, IS_ERR_OR_NULL(test_file)); - - init_defex_context(&dc, 0, mock_task, test_file); - - /* Create fake, non-root creds */ - mock_creds.uid.val = 1000; - mock_creds.gid.val = 1000; - mock_creds.suid.val = 1000; - mock_creds.sgid.val = 1000; - mock_creds.euid.val = 1000; - mock_creds.egid.val = 1000; - mock_creds.fsuid.val = 1000; - mock_creds.fsgid.val = 1000; - - /* "/" path is a violation, but only after first boot. */ - EXPECT_EQ(test, task_defex_safeplace(&dc), -DEFEX_DENY); - - /* if dc->cred not root, allow */ - memcpy(&backup_creds, &dc.cred, sizeof(struct cred)); - memcpy(&dc.cred, &mock_creds, sizeof(struct cred)); - EXPECT_EQ(test, task_defex_safeplace(&dc), DEFEX_ALLOW); - release_defex_context(&dc); - filp_close(test_file, NULL); - - /* Another context with no file */ - init_defex_context(&dc, 0, mock_task, NULL); - EXPECT_EQ(test, task_defex_safeplace(&dc), DEFEX_ALLOW); - release_defex_context(&dc); - - /* Finalize */ - kthread_stop(mock_task); - put_task_struct(mock_task); -#else - SUCCEED(test); -#endif -} - - -static void task_defex_is_secured_test(struct test *test) -{ -#ifdef DEFEX_PED_ENABLE - struct defex_context dc; - struct file *test_file; - - /* The only thing verified in context is dc->target_dpath */ - /* Everything else is not important */ - init_defex_context(&dc, 0, current, NULL); - - /* Returns 1 with NULL target_dpath */ - EXPECT_EQ(test, task_defex_is_secured(&dc), 1); - release_defex_context(&dc); - - /* Could not get a situation which dc->target_dpath != NULL */ - test_file = local_fopen(ROOT_PATH, O_RDONLY, 0); - ASSERT_FALSE(test, IS_ERR(test_file)); - ASSERT_FALSE(test, IS_ERR_OR_NULL(test_file)); - - init_defex_context(&dc, 0, current, test_file); - EXPECT_EQ(test, task_defex_is_secured(&dc), 1); - release_defex_context(&dc); -#else - SUCCEED(test); -#endif -} - - -static void task_defex_immutable_test(struct test *test) -{ -#ifdef DEFEX_IMMUTABLE_ENABLE - struct defex_context dc; - struct file *f; - - /* Allow case - get_dc_target_dpath() == NULL */ - init_defex_context(&dc, 0, current, NULL); - EXPECT_EQ(test, task_defex_immutable(&dc, 0), DEFEX_ALLOW); - release_defex_context(&dc); - - f = local_fopen(SHELL_PATH, O_RDONLY, 0); - ASSERT_FALSE(test, IS_ERR_OR_NULL(f)); - - /* Allow case - feature_immutable_path_open && task_defex_src_exception == 1 */ - init_defex_context(&dc, 0, current, f); - EXPECT_EQ(test, task_defex_immutable(&dc, feature_immutable_path_open), DEFEX_ALLOW); - - /* Deny case - !feature_immutable_path_open */ - EXPECT_EQ(test, task_defex_immutable(&dc, feature_immutable_path_write), -DEFEX_DENY); - - /* Finalize */ - release_defex_context(&dc); - filp_close(f, NULL); -#else - SUCCEED(test); -#endif -} - - -static void task_defex_enforce_test(struct test *test) -{ -#if defined DEFEX_SAFEPLACE_ENABLE || defined DEFEX_IMMUTABLE_ENABLE - struct file *test_file = NULL; -#endif - struct task_struct *mock_task = NULL; - int aux_integer; - pid_t backup_pid; - - mock_task = kthread_run(kunit_mock_thread_function, NULL, "task_defex_enforce_test_thread"); - get_task_struct(mock_task); - ASSERT_FALSE(test, IS_ERR_OR_NULL(mock_task)); - ssleep(1); - - /* p == NULL -> DEFEX_ALLOW */ - EXPECT_EQ(test, task_defex_enforce(NULL, NULL, 0), DEFEX_ALLOW); - - /* p->mm == NULL -> DEFEX_ALLOW */ - EXPECT_EQ(test, task_defex_enforce(mock_task, NULL, 0), DEFEX_ALLOW); - - /* pid = 1 -> DEFEX_ALLOW */ - backup_pid = mock_task->pid; - mock_task->pid = 1; - EXPECT_EQ(test, task_defex_enforce(mock_task, NULL, 0), DEFEX_ALLOW); - mock_task->pid = backup_pid; - - /* syscall < 0 && (-syscall >= __NR_syscalls) -> DEFEX_ALLOW */ - aux_integer = -(__NR_syscalls + 1); - EXPECT_EQ(test, task_defex_enforce(mock_task, NULL, aux_integer), DEFEX_ALLOW); - - /* No checks -> DEFEX_ALLOW */ - EXPECT_EQ(test, task_defex_enforce(mock_task, NULL, __DEFEX_stat), DEFEX_ALLOW); - kthread_stop(mock_task); - put_task_struct(mock_task); - -#ifdef DEFEX_PED_ENABLE - /* if task_defex_check_creds(&dc) != 0, kill process group. */ - /* Need to build test that results in violation */ -#endif - -#ifdef DEFEX_SAFEPLACE_ENABLE - mock_task = kthread_run(kunit_mock_thread_function, NULL, "task_defex_enforce_test_thread"); - get_task_struct(mock_task); - ASSERT_FALSE(test, IS_ERR_OR_NULL(mock_task)); - ssleep(1); - - /* If task_defex_safeplace == -DEFEX_DENY and FEATURE_SAFEPLACE_SOFT disabled, kill process */ - /* Open file that will trigger a violation */ - test_file = local_fopen(ROOT_PATH, O_RDONLY, 0); - ASSERT_FALSE(test, IS_ERR_OR_NULL(test_file)); - - /* If FEATURE_SAFEPLACE_SOFT not set, the process is killed */ - if (!(defex_get_features() & FEATURE_SAFEPLACE_SOFT)) { - EXPECT_EQ(test, task_defex_enforce(mock_task, test_file, __DEFEX_execve), -DEFEX_DENY); - put_task_struct(mock_task); - } - else{ - EXPECT_EQ(test, task_defex_enforce(mock_task, test_file, __DEFEX_execve), DEFEX_ALLOW); - kthread_stop(mock_task); - put_task_struct(mock_task); - } - filp_close(test_file, 0); - -#endif -#ifdef DEFEX_IMMUTABLE_ENABLE - mock_task = kthread_run(kunit_mock_thread_function, NULL, "task_defex_enforce_test_thread"); - get_task_struct(mock_task); - ASSERT_FALSE(test, IS_ERR_OR_NULL(mock_task)); - ssleep(1); - - test_file = local_fopen(SHELL_PATH, O_RDONLY, 0); - ASSERT_FALSE(test, IS_ERR_OR_NULL(test_file)); - - /* Immutable path write returns -DEFEX_DENY */ - /* if FEATURE_IMMUTABLE_SOFT enabled, return DEFEX_ALLOW */ - if (defex_get_features() & FEATURE_IMMUTABLE_SOFT) - EXPECT_EQ(test, task_defex_enforce(mock_task, test_file, __DEFEX_write), DEFEX_ALLOW); - else - EXPECT_EQ(test, task_defex_enforce(mock_task, test_file, __DEFEX_write), -DEFEX_DENY); - - filp_close(test_file, 0); - kthread_stop(mock_task); - put_task_struct(mock_task); -#endif -} - - -static void task_defex_check_creds_test(struct test *test) -{ -#ifdef DEFEX_PED_ENABLE - int i; - const struct cred *backup_cred_ptr; - struct cred mock_creds, backup_cred; - struct defex_context dc; - struct task_struct *mock_task; - struct task_struct *backup_parent; - pid_t backup_pid; - - /* Creates a mock task */ - mock_task = kthread_run(kunit_mock_thread_function, NULL, "task_defex_check_creds_test_thread"); - get_task_struct(mock_task); - ASSERT_FALSE(test, IS_ERR_OR_NULL(mock_task)); - ssleep(1); - init_defex_context(&dc, 0, mock_task, NULL); - - /* Create fake, non-root creds */ - mock_creds.uid.val = 2000; - mock_creds.gid.val = 2000; - mock_creds.suid.val = 2000; - mock_creds.sgid.val = 2000; - mock_creds.euid.val = 2000; - mock_creds.egid.val = 2000; - mock_creds.fsuid.val = 500; - mock_creds.fsgid.val = 500; - - /* dc->task->cred = NULL */ - backup_cred_ptr = mock_task->cred; - mock_task->cred = NULL; - EXPECT_EQ(test, task_defex_check_creds(&dc), DEFEX_ALLOW); - mock_task->cred = backup_cred_ptr; - - /* mock_task->uid == 0 && (mock_task->tgid != mock_task->pid && mock_task->tgid != 1) --> -DEFEX_DENY */ - backup_pid = mock_task->pid; - mock_task->pid = mock_task->pid + 1000; - EXPECT_EQ(test, task_defex_check_creds(&dc), -DEFEX_DENY); - mock_task->pid = backup_pid; - - /* Allow case: uid = 0, parent is root, dc.cred is root */ - EXPECT_EQ(test, task_defex_check_creds(&dc), DEFEX_ALLOW); - - memcpy(&backup_cred, &dc.cred, sizeof(struct cred)); - memcpy(&dc.cred, &mock_creds, sizeof(struct cred)); - - /* Allow case: uid = 0, parent is root, dc.cred not root */ - EXPECT_EQ(test, task_defex_check_creds(&dc), DEFEX_ALLOW); - - /* Allow case: uid = 0, no parent, dc.cred not root */ - i = set_task_creds(mock_task, 0, 0, 0, 0); - ASSERT_EQ(test, i, 0); - backup_parent = mock_task->parent; - mock_task->parent = NULL; - EXPECT_EQ(test, task_defex_check_creds(&dc), DEFEX_ALLOW); - mock_task->parent = backup_parent; - - /* mock_task->uid = 1 -> mock_task receives dc.cred if not root */ - i = set_task_creds(mock_task, 1, 0, 0, 0); - ASSERT_EQ(test, i, 0); - /* Task will receive root creds because of its root parent -> No violation. */ - EXPECT_EQ(test, task_defex_check_creds(&dc), DEFEX_ALLOW); - - /* Deny case: uid = dead_uid */ - i = set_task_creds(mock_task, dead_uid, 0, 0, 0); - ASSERT_EQ(test, i, 0); - EXPECT_EQ(test, task_defex_check_creds(&dc), -DEFEX_DENY); - - /* uid != 0, uid != 1, uid != dead_uid */ - i = set_task_creds(mock_task, 2000, 20000, 2000, 0); - ASSERT_EQ(test, i, 0); - EXPECT_EQ(test, task_defex_check_creds(&dc), -DEFEX_DENY); - - /* uid != 0, uid != 1, uid != dead_uid, check deeper, dc.cred is not root*/ - i = set_task_creds(mock_task, 2000, 20000, 2000, 0); - ASSERT_EQ(test, i, 0); - backup_pid = mock_task->pid; - mock_task->pid = mock_task->pid + 1000; - EXPECT_EQ(test, task_defex_check_creds(&dc), -DEFEX_DENY); - - /* uid != 0, uid != 1, uid != dead_uid, check deeper, dc.cred is root*/ - i = set_task_creds(mock_task, 2000, 20000, 2000, 0); - ASSERT_EQ(test, i, 0); - memcpy(&dc.cred, &backup_cred, sizeof(struct cred)); - EXPECT_EQ(test, task_defex_check_creds(&dc), -DEFEX_DENY); - mock_task->pid = backup_pid; - - /* mock_task->uid = 1, no parent, dc.cred is root */ - i = set_task_creds(mock_task, 1, 0, 0, 0); - ASSERT_EQ(test, i, 0); - backup_parent = mock_task->parent; - mock_task->parent = NULL; - EXPECT_EQ(test, task_defex_check_creds(&dc), DEFEX_ALLOW); - mock_task->parent = backup_parent; - - /* Finalize */ - release_defex_context(&dc); - kthread_stop(mock_task); - put_task_struct(mock_task); -#else - SUCCEED(test); -#endif -} - - -static void lower_adb_permission_test(struct test *test) -{ -/* NOTE: code encapsulated by DEFEX_PERMISSIVE_LP in defex_main is not covered. */ -#if defined DEFEX_PED_ENABLE && defined DEFEX_LP_ENABLE - struct defex_context dc; - struct task_struct *parent_backup; - - /* The only thing verified in context is dc->p->parent */ - /* Everything else is not important */ - init_defex_context(&dc, 0, current, NULL); - EXPECT_EQ(test, lower_adb_permission(&dc, 0), 0); - - parent_backup = current->parent; - current->parent = NULL; - EXPECT_EQ(test, lower_adb_permission(&dc, 0), 0); - - current->parent = parent_backup; - release_defex_context(&dc); -#else - SUCCEED(test); -#endif -} - - -static void kill_process_group_test(struct test *test) -{ - /* EXPECT_EQ(test, 1, kill_process_group()); */ -} - - -static void kill_process_test(struct test *test) -{ -#ifdef DEFEX_SAFEPLACE_ENABLE - struct task_struct *mock_task; - - /* Let's create a new task to kill */ - mock_task = kthread_run(kunit_mock_thread_function, NULL, "kill_process_test_thread"); - get_task_struct(mock_task); - ASSERT_FALSE(test, IS_ERR_OR_NULL(mock_task)); - ssleep(1); - ASSERT_NE(test, mock_task, NULL); - EXPECT_EQ(test, kill_process(mock_task), 0); -#else - SUCCEED(test); -#endif -} - - -static void get_warranty_bit_test(struct test *test) -{ - /* EXPECT_EQ(test, 1, get_warranty_bit()); */ -} - - -static void get_parent_task_test(struct test *test) -{ - static struct task_struct DUMMY_TASK; - struct task_struct *mock_task = &DUMMY_TASK; - mock_task->pid = 9787; - - /* No parent first */ - mock_task->parent = NULL; - EXPECT_EQ(test, get_parent_task(mock_task), NULL); - - /* Real parent now */ - mock_task->parent = current; - EXPECT_EQ(test, get_parent_task(mock_task)->pid, current->pid); -} - - -static void defex_report_violation_test(struct test *test) -{ -#ifdef DEFEX_DSMS_ENABLE -#define PED_VIOLATION "DFX1" /* from defex_main.c */ - struct defex_context dc; - - init_defex_context(&dc, __NR_uname, current, NULL); - /* Check if the object was created successfully */ - ASSERT_EQ(test, dc.syscall_no, __NR_uname); - ASSERT_EQ(test, dc.task->pid, current->pid); - - defex_report_violation(PED_VIOLATION, 1234, &dc, - get_current_cred()->uid.val + 10000, - get_current_cred()->fsuid.val, - get_current_cred()->egid.val + 2000, - 0 /* ? */); - release_defex_context(&dc); -#else - SUCCEED(test); -#endif -} - - -static void at_same_group_gid_test(struct test *test) -{ -#ifdef DEFEX_PED_ENABLE - /* allow the weaken privilege (gid1 >= 10000 && gid2 < 10000) */ - EXPECT_EQ(test, at_same_group_gid(11000, 5000), 1); - /* allow traverse in the same class ((gid1 / 1000) == (gid2 / 1000)) */ - EXPECT_EQ(test, at_same_group_gid(11010, 11230), 1); - /* allow traverse to isolated ranges (gid1 >= 90000) */ - EXPECT_EQ(test, at_same_group_gid(100000, 0), 1); - /* allow LoD process (LoD_base = 0x61A8) */ - EXPECT_EQ(test, at_same_group_gid(0x61A80010u, 0x61A80100u), 1); - /* allow LoD process (LoD_base = 0x61A8) */ - EXPECT_EQ(test, at_same_group_gid(3003, 0x61A80100u), 1); - /* deny test */ - EXPECT_EQ(test, at_same_group_gid(500, 20000), 0); -#else - SUCCEED(test); -#endif -} - - -static void at_same_group_test(struct test *test) -{ -#ifdef DEFEX_PED_ENABLE - /* allow the weaken privilege (uid1 >= 10000 && uid2 < 10000) */ - EXPECT_EQ(test, at_same_group(11000, 5000), 1); - /* allow traverse in the same class ((uid1 / 1000) == (uid2 / 1000)) */ - EXPECT_EQ(test, at_same_group(11010, 11230), 1); - /* allow traverse to isolated ranges (uid1 >= 90000) */ - EXPECT_EQ(test, at_same_group(100000, 0), 1); - /* allow LoD process (LoD_base = 0x61A8) */ - EXPECT_EQ(test, at_same_group(0x61A80010, 0x61A80100), 1); - /* deny test */ - EXPECT_EQ(test, at_same_group(500, 20000), 0); -#else - SUCCEED(test); -#endif -} - - -static int defex_main_test_init(struct test *test) -{ - /* - * test->priv = a_struct_pointer; - * if (!test->priv) - * return -ENOMEM; - */ - - return 0; -} - -static void defex_main_test_exit(struct test *test) -{ -} - -static struct test_case defex_main_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(verifiedboot_state_setup_test), - TEST_CASE(task_defex_zero_creds_test), - TEST_CASE(task_defex_user_exec_test), - TEST_CASE(task_defex_src_exception_test), - TEST_CASE(task_defex_safeplace_test), - TEST_CASE(task_defex_is_secured_test), - TEST_CASE(task_defex_immutable_test), - TEST_CASE(task_defex_enforce_test), - TEST_CASE(task_defex_check_creds_test), - TEST_CASE(lower_adb_permission_test), - TEST_CASE(kill_process_group_test), - TEST_CASE(kill_process_test), - TEST_CASE(get_warranty_bit_test), - TEST_CASE(get_parent_task_test), - TEST_CASE(defex_report_violation_test), - TEST_CASE(at_same_group_gid_test), - TEST_CASE(at_same_group_test), - {}, -}; - -static struct test_module defex_main_test_module = { - .name = "defex_main_test", - .init = defex_main_test_init, - .exit = defex_main_test_exit, - .test_cases = defex_main_test_cases, -}; -module_test(defex_main_test_module); - diff --git a/security/samsung/defex_lsm/core/kunit_test/defex_rules_proc_test.c b/security/samsung/defex_lsm/core/kunit_test/defex_rules_proc_test.c deleted file mode 100755 index 7443cdb52ea0..000000000000 --- a/security/samsung/defex_lsm/core/kunit_test/defex_rules_proc_test.c +++ /dev/null @@ -1,535 +0,0 @@ -/* - * Copyright (c) 2020-2021 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "include/defex_internal.h" -#include "include/defex_rules.h" - -#define DEFEX_RULES_FILE "/dpolicy" -#define DUMMY_DIR "/dummy" -#define ROOT_PATH "/" -#define INTEGRITY_DEFAULT "/system/bin/install-recovery.sh" -#define NOT_A_PATH "not_a_path" -#define SYSTEM_ROOT "/system_root" - - -#ifdef DEFEX_USE_PACKED_RULES -extern struct rule_item_struct *lookup_dir(struct rule_item_struct *base, const char *name, int l, int for_recovery, - char *base_start); -extern int lookup_tree(const char *file_path, int attribute, struct file *f); -#ifdef DEFEX_RAMDISK_ENABLE -extern unsigned char packed_rules_primary[]; -#endif /* DEFEX_RAMDISK_ENABLE */ -#endif /* DEFEX_USE_PACKED_RULES */ - -#if defined(DEFEX_RAMDISK_ENABLE) && defined(DEFEX_KERNEL_ONLY) -extern int load_rules_late(void); -#endif /* DEFEX_RAMDISK_ENABLE && DEFEX_KERNEL_ONLY */ - -#ifdef DEFEX_INTEGRITY_ENABLE -#define SHA256_DIGEST_SIZE 32 -extern int defex_check_integrity(struct file *f, unsigned char *hash); -extern int defex_integrity_default(const char *file_path); -#endif /* DEFEX_INTEGRITY_ENABLE */ - -extern int check_system_mount(void); - -/* --------------------------------------------------------------------------*/ -/* Auxiliary functions to find possible examples in the policy. */ -/* --------------------------------------------------------------------------*/ - -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) -static int rule_lookup_performed = 0; - -char first_file[PATH_MAX]; -int first_file_attr; -char second_file[PATH_MAX]; -char existing_directory_no_features[PATH_MAX]; -char existing_directory_path_open[PATH_MAX]; -char existing_directory_path_write[PATH_MAX]; - -/* get_first_feature() - Get the first feature from an integer */ -int get_first_feature(int feature_type) -{ -#define TEST_FEATURE(ft) \ - if(feature_type & ft) { \ - return ft; \ - } - TEST_FEATURE(feature_is_file); - TEST_FEATURE(feature_for_recovery); - TEST_FEATURE(feature_ped_path); - TEST_FEATURE(feature_ped_exception); - TEST_FEATURE(feature_ped_status); - TEST_FEATURE(feature_safeplace_path); - TEST_FEATURE(feature_safeplace_status); - TEST_FEATURE(feature_immutable_path_open); - TEST_FEATURE(feature_immutable_path_write); - TEST_FEATURE(feature_immutable_src_exception); - TEST_FEATURE(feature_immutable_status); - TEST_FEATURE(feature_umhbin_path); - - return 0; -} - -/** - * find_paths() - Find example paths to be used in the test. - * @node: The rule tree node being analyzed. - * @current_path: The walked path so far. - * @path_len: The path size so far. - * - * The method reads the packed_rules_primary policy array and find path and file - * examples that are in the policy so the test can be performed correctly. The - * lookup is done recursively, first horizontally and then vertically. This tree - * walking strategy is done to make path string construction easier. - * - * The method finds and stores in static variables: - * - Two different files that can be opened by the kunit without erros; - *- A directory with no features; - *- A directory with feature_immutable_path_open set; - *- A directory with feature_immutable_path_write set. - */ -static void find_paths(struct rule_item_struct *node, char *current_path, size_t path_len) -{ - int attr; - struct file *file_ptr; - - if (node->next_file) { - find_paths(GET_ITEM_PTR(node->next_file, packed_rules_primary), current_path, path_len); - } - - if (!strncmp(node->name, "tmp", node->size)) - return; - - /* If no more space in current_path is available, stop looking here. */ - if (PATH_MAX - path_len < node->size + 1) - return; - /* Append name to path */ - memset(current_path + path_len, 0, PATH_MAX - path_len); - strncpy(current_path + path_len, "/", 1); - strncpy(current_path + path_len + 1, node->name, node->size); - path_len += node->size + 1; - - if (!(node->feature_type & feature_is_file)) { - if (strlen(existing_directory_path_open) == 0 && - node->feature_type & feature_immutable_path_open) { - strncpy(existing_directory_path_open, current_path, path_len); - } - if (strlen(existing_directory_path_write) == 0 && - node->feature_type & feature_immutable_path_write) { - strncpy(existing_directory_path_write, current_path, path_len); - } - if (strlen(existing_directory_no_features) == 0 && - node->feature_type == 0) { - strncpy(existing_directory_no_features, current_path, path_len); - } - } - else { - /* feature_is_file set */ - attr = get_first_feature(node->feature_type & feature_is_file); - if (attr) { - file_ptr = local_fopen(current_path, O_RDONLY, 0); - if (!IS_ERR_OR_NULL(file_ptr)) { - /* File with other feature */ - if (strlen(first_file) == 0) { - strncpy(first_file, current_path, - strlen(current_path)); - first_file_attr = attr; - } - else if (strlen(second_file) == 0) { - strncpy(second_file, current_path, - strlen(current_path)); - } - filp_close(file_ptr, 0); - } - } - } - if (node->next_level) { - find_paths(GET_ITEM_PTR(node->next_level, packed_rules_primary), current_path, path_len); - } -} - -/* Triggers the lookup process if DEFEX policy is loaded. */ -static void find_rules_for_test(void) -{ - struct rule_item_struct *base; - char *path; - - base = (struct rule_item_struct *)packed_rules_primary; - if (!base || !base->data_size) - /* Rules are not loaded --- can't find any paths */ - return; - - path = kzalloc(PATH_MAX, GFP_KERNEL); - if (!path) - return; - - find_paths(GET_ITEM_PTR(base->next_level, packed_rules_primary), path, 0); - - pr_info("kunit defex_rules_proc_test: Path results:"); - pr_info("kunit defex_rules_proc_test: first_file: %s", first_file); - pr_info("kunit defex_rules_proc_test: second_file: %s", second_file); - pr_info("kunit defex_rules_proc_test: existing_directory_no_features: %s", - existing_directory_no_features); - pr_info("kunit defex_rules_proc_test: existing_directory_path_open: %s", - existing_directory_path_open); - pr_info("kunit defex_rules_proc_test: existing_directory_path_write: %s", - existing_directory_path_write); - - rule_lookup_performed = 1; - kfree(path); -} -#endif /* DEFEX_USE_PACKED_RULES && DEFEX_RAMDISK_ENABLE */ - - -static void rules_lookup_test(struct test *test) -{ -#if (defined(DEFEX_SAFEPLACE_ENABLE) || defined(DEFEX_IMMUTABLE_ENABLE) || defined(DEFEX_PED_ENABLE)) - -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) - /* If packed rules are being used, they need to be loaded before the test. */ - if (check_rules_ready() == 0) { - test_info(test, "DEFEX policy not loaded: skip test."); - return; - } - - if (check_system_mount() == 1) - EXPECT_EQ(test, 0, rules_lookup(SYSTEM_ROOT, 0, NULL)); - else - EXPECT_EQ(test, 0, rules_lookup(NULL, 0, NULL)); -#else - /* Not able to build without packed rules --- Nothing to test for now. */ -#endif /* DEFEX_USE_PACKED_RULES && DEFEX_RAMDISK_ENABLE*/ -#endif /* DEFEX_SAFEPLACE_ENABLE || DEFEX_IMMUTABLE_ENABLE || DEFEX_PED_ENABLE */ - SUCCEED(test); -} - - -static void lookup_tree_test(struct test *test) -{ -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) - struct file *file_one, *file_two; - - /* If packed rules are being used, they need to be loaded before the test. */ - if (check_rules_ready() == 0) { - test_info(test, "DEFEX policy not loaded: skip test."); - return; - } - - if (rule_lookup_performed == 0) - /* If lookup not done yet, trigger it. */ - find_rules_for_test(); - - /* T1: file_path = NULL or file_path[0] != '/' */ - EXPECT_EQ(test, 0, lookup_tree(NULL, 0, NULL)); - EXPECT_EQ(test, 0, lookup_tree(NOT_A_PATH, 0, NULL)); - - if (strlen(first_file) > 0 && strlen(second_file) > 0) { - /* Policy lookup fond examples. */ - file_one = local_fopen(first_file, O_RDONLY, 0); - if (IS_ERR_OR_NULL(file_one)) - goto test_four; - file_two = local_fopen(second_file, O_RDONLY, 0); - if (IS_ERR_OR_NULL(file_two)) { - filp_close(file_one, 0); - goto test_four; - } - - /* T2: file with attribute other than feature_is_file */ - EXPECT_EQ(test, 1, lookup_tree(first_file, first_file_attr, file_one)); - - /* T3: file with different contents */ - EXPECT_EQ(test, DEFEX_INTEGRITY_FAIL, lookup_tree(first_file, first_file_attr, file_two)); - - filp_close(file_one, 0); - filp_close(file_two, 0); - } -test_four: - /* T4: Root path -> Does not look into the tree. */ - EXPECT_EQ(test, 0, lookup_tree(ROOT_PATH, 0, NULL)); - - if (strlen(existing_directory_path_open) > 0) { - /* T5: Path with feature_immutable_path_open */ - EXPECT_EQ(test, 0, lookup_tree(existing_directory_path_open, feature_immutable_path_open, NULL)); - - /* T6: with other separator */ - existing_directory_path_open[strlen(existing_directory_path_open)] = '/'; - EXPECT_EQ(test, 0, lookup_tree(existing_directory_path_open, feature_immutable_path_open, NULL)); - existing_directory_path_open[strlen(existing_directory_path_open) - 1] = '\0'; - } - - if (strlen(existing_directory_path_write) > 0) { - /* T7: Path with feature_immutable_path_write */ - EXPECT_EQ(test, 0, lookup_tree(existing_directory_path_write, feature_immutable_path_write, NULL)); - - /* T8: with other separator */ - existing_directory_path_write[strlen(existing_directory_path_write)] = '/'; - EXPECT_EQ(test, 0, lookup_tree(existing_directory_path_write, feature_immutable_path_write, NULL)); - existing_directory_path_write[strlen(existing_directory_path_write) - 1] = '\0'; - } - - /* T9: Path not present in policy */ - EXPECT_EQ(test, 0, lookup_tree(DUMMY_DIR, feature_immutable_path_open, NULL)); - -#endif /* DEFEX_USE_PACKED_RULES && DEFEX_RAMDISK_ENABLE*/ - SUCCEED(test); -} - - -static void lookup_dir_test(struct test *test) -{ -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) - - struct rule_item_struct *policy_item = NULL; - struct rule_item_struct *policy_base = (struct rule_item_struct *)packed_rules_primary; - char *path, *next_separator; - int size; - - /* If packed rules are being used, they need to be loaded before the test. */ - if (check_rules_ready() == 0) { - test_info(test, "DEFEX policy not loaded: skip test."); - return; - } - - if (rule_lookup_performed == 0) - /* If lookup not done yet, trigger it. */ - find_rules_for_test(); - - /* T1: !base || !base->next_level -> return NULL */ - EXPECT_EQ(test, NULL, lookup_dir(NULL, NULL, 0, 0, packed_rules_primary)); - - /* T2: Existing directory */ - if (strlen(existing_directory_no_features) > 0) { - /* Policy parse found directory */ - path = existing_directory_no_features + 1; - /* Since we have the entire path, - * we need to iterate over each dir - */ - do { - next_separator = strchr(path, '/'); - if (!next_separator) - size = strlen(path); - else - size = next_separator - path; - if (!size) - FAIL(test, "Error in lookup: existing_directory_no_features"); - policy_item = lookup_dir(policy_base, path, size, 0, packed_rules_primary); - ASSERT_NOT_NULL(test, policy_item); - EXPECT_EQ(test, 0, strncmp(policy_item->name, path, size)); - policy_base = policy_item; - path += size; - if (next_separator) - path++; - } while(*path); - } - - /* T3: Non-existing directory */ - EXPECT_EQ(test, NULL, lookup_dir(policy_base, DUMMY_DIR, strlen(DUMMY_DIR), 0, packed_rules_primary)); - -#endif /* DEFEX_USE_PACKED_RULES && DEFEX_RAMDISK_ENABLE*/ - SUCCEED(test); -} - - -static void load_rules_late_test(struct test *test) -{ -#if defined(DEFEX_RAMDISK_ENABLE) && defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_KERNEL_ONLY) - - /* The test cannot try to load the policy by its own, - * since it can compromise the system. - */ - -#endif /* DEFEX_RAMDISK_ENABLE && DEFEX_USE_PACKED_RULES && DEFEX_KERNEL_ONLY */ - SUCCEED(test); -} - - -static void do_load_rules_test(struct test *test) -{ - /* __init function */ - SUCCEED(test); -} - - -static void defex_load_rules_test(struct test *test) -{ - /* __init function */ - SUCCEED(test); -} - - -static void defex_integrity_default_test(struct test *test) -{ -#ifdef DEFEX_INTEGRITY_ENABLE - EXPECT_EQ(test, 0, defex_integrity_default(INTEGRITY_DEFAULT)); - EXPECT_NE(test, 0, defex_integrity_default(DUMMY_DIR)); -#endif - SUCCEED(test); -} - - -static void defex_init_rules_proc_test(struct test *test) -{ - /* __init function */ - SUCCEED(test); -} - - -static void defex_check_integrity_test(struct test *test) -{ -#ifdef DEFEX_INTEGRITY_ENABLE - unsigned char hash[SHA256_DIGEST_SIZE] = {0}; - struct file *test_file; -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) - struct rule_item_struct *policy_item = NULL; - struct rule_item_struct *policy_base = (struct rule_item_struct *)packed_rules_primary; - char *path, *next_separator; - int size; -#endif - /* T1: hash zero - no check is done */ - EXPECT_EQ(test, 0, defex_check_integrity(NULL, hash)); - - /* 'random' hash */ - memcpy((void *) hash, "A32CharacterStringForTestingThis", SHA256_DIGEST_SIZE); - - /* T2: file pointer is error */ - EXPECT_EQ(test, -1, defex_check_integrity(ERR_PTR(-1), hash)); - - /* T3: Wrong hash */ - test_file = local_fopen(DEFEX_RULES_FILE, O_RDONLY, 0); - if (!IS_ERR_OR_NULL(test_file)) { - EXPECT_NE(test, 0, defex_check_integrity(test_file, hash)); - filp_close(test_file, NULL); - } - -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) - /* T4: Right hash */ - if (strlen(first_file) > 0) { - /* Find policy item for first file */ - path = first_file + 1; - /* Since we have the entire path, - * we need to iterate over each dir - */ - do { - next_separator = strchr(path, '/'); - if (!next_separator) - size = strlen(path); - else - size = next_separator - path; - if (!size) - FAIL(test, "Error in lookup: existing_directory_no_features"); - policy_item = lookup_dir(policy_base, path, size, 0, packed_rules_primary); - ASSERT_NOT_NULL(test, policy_item); - ASSERT_EQ(test, 0, strncmp(policy_item->name, path, size)); - policy_base = policy_item; - path += size; - if (next_separator) - path++; - } while(*path); - - test_file = local_fopen(first_file, O_RDONLY, 0); - ASSERT_FALSE(test, IS_ERR_OR_NULL(test_file)); - EXPECT_EQ(test, 0, defex_check_integrity(test_file, policy_item->integrity)); - filp_close(test_file, NULL); - } -#else - /* Not able to build without packed rules --- Nothing to test for now. */ -#endif /* DEFEX_USE_PACKED_RULES && DEFEX_RAMDISK_ENABLE*/ -#endif /* DEFEX_INTEGRITY_ENABLE */ - SUCCEED(test); -} - - -static void check_system_mount_test(struct test *test) -{ - struct file *fp; - fp = local_fopen(SYSTEM_ROOT, O_DIRECTORY | O_PATH, 0); - - if (!IS_ERR(fp)) { - filp_close(fp, NULL); - EXPECT_EQ(test, check_system_mount(), 1); - } else { - EXPECT_EQ(test, check_system_mount(), 0); - } - SUCCEED(test); -} - - -static void check_rules_ready_test(struct test *test) -{ -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) - struct rule_item_struct *base_struct = (struct rule_item_struct *)packed_rules_primary; - - if (!base_struct || !base_struct->data_size) - EXPECT_EQ(test, 0, check_rules_ready()); - else - EXPECT_EQ(test, 1, check_rules_ready()); - -#endif /* DEFEX_USE_PACKED_RULES && DEFEX_RAMDISK_ENABLE*/ - SUCCEED(test); -} - - -static void bootmode_setup_test(struct test *test) -{ - /* __init function */ - SUCCEED(test); -} - - -static int defex_rules_proc_test_init(struct test *test) -{ -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) - if(!rule_lookup_performed) { - memset(first_file, 0, PATH_MAX); - memset(second_file, 0, PATH_MAX); - memset(existing_directory_no_features, 0, PATH_MAX); - memset(existing_directory_path_open, 0, PATH_MAX); - memset(existing_directory_path_write, 0, PATH_MAX); - - find_rules_for_test(); - } -#endif /* DEFEX_USE_PACKED_RULES && DEFEX_RAMDISK_ENABLE */ - return 0; -} - -static void defex_rules_proc_test_exit(struct test *test) -{ -} - -static struct test_case defex_rules_proc_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(rules_lookup_test), - TEST_CASE(lookup_tree_test), - TEST_CASE(lookup_dir_test), - TEST_CASE(load_rules_late_test), - TEST_CASE(do_load_rules_test), - TEST_CASE(defex_load_rules_test), - TEST_CASE(defex_integrity_default_test), - TEST_CASE(defex_init_rules_proc_test), - TEST_CASE(defex_check_integrity_test), - TEST_CASE(check_system_mount_test), - TEST_CASE(check_rules_ready_test), - TEST_CASE(bootmode_setup_test), - {}, -}; - -static struct test_module defex_rules_proc_test_module = { - .name = "defex_rules_proc_test", - .init = defex_rules_proc_test_init, - .exit = defex_rules_proc_test_exit, - .test_cases = defex_rules_proc_test_cases, -}; -module_test(defex_rules_proc_test_module); - diff --git a/security/samsung/defex_lsm/core/kunit_test/defex_sysfs_test.c b/security/samsung/defex_lsm/core/kunit_test/defex_sysfs_test.c deleted file mode 100755 index bb188fc9fe97..000000000000 --- a/security/samsung/defex_lsm/core/kunit_test/defex_sysfs_test.c +++ /dev/null @@ -1,534 +0,0 @@ -/* - * Copyright (c) 2020-2021 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "include/defex_internal.h" -#include "include/defex_rules.h" - -#define DEFEX_RULES_FILE "/dpolicy" -#define DUMMY_DIR "/dummy" -#define ROOT_PATH "/" -#define INTEGRITY_DEFAULT "/system/bin/install-recovery.sh" -#define NOT_A_PATH "not_a_path" -#define SYSTEM_ROOT "/system_root" - - -#ifdef DEFEX_USE_PACKED_RULES -extern struct rule_item_struct *lookup_dir(struct rule_item_struct *base, const char *name, int l, int for_recovery); -extern int lookup_tree(const char *file_path, int attribute, struct file *f); -#ifdef DEFEX_RAMDISK_ENABLE -extern unsigned char defex_packed_rules[]; -#endif /* DEFEX_RAMDISK_ENABLE */ -#endif /* DEFEX_USE_PACKED_RULES */ - -#if defined(DEFEX_RAMDISK_ENABLE) && defined(DEFEX_KERNEL_ONLY) -extern int load_rules_late(void); -#endif /* DEFEX_RAMDISK_ENABLE && DEFEX_KERNEL_ONLY */ - -#ifdef DEFEX_INTEGRITY_ENABLE -#define SHA256_DIGEST_SIZE 32 -extern int defex_check_integrity(struct file *f, unsigned char *hash); -extern int defex_integrity_default(const char *file_path); -#endif /* DEFEX_INTEGRITY_ENABLE */ - -extern int check_system_mount(void); - -/* --------------------------------------------------------------------------*/ -/* Auxiliary functions to find possible examples in the policy. */ -/* --------------------------------------------------------------------------*/ - -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) -static int rule_lookup_performed = 0; - -char first_file[PATH_MAX]; -int first_file_attr; -char second_file[PATH_MAX]; -char existing_directory_no_features[PATH_MAX]; -char existing_directory_path_open[PATH_MAX]; -char existing_directory_path_write[PATH_MAX]; - -/* get_first_feature() - Get the first feature from an integer */ -int get_first_feature(int feature_type) -{ -#define TEST_FEATURE(ft) \ - if(feature_type & ft) { \ - return ft; \ - } - TEST_FEATURE(feature_is_file); - TEST_FEATURE(feature_for_recovery); - TEST_FEATURE(feature_ped_path); - TEST_FEATURE(feature_ped_exception); - TEST_FEATURE(feature_ped_status); - TEST_FEATURE(feature_safeplace_path); - TEST_FEATURE(feature_safeplace_status); - TEST_FEATURE(feature_immutable_path_open); - TEST_FEATURE(feature_immutable_path_write); - TEST_FEATURE(feature_immutable_src_exception); - TEST_FEATURE(feature_immutable_status); - TEST_FEATURE(feature_umhbin_path); - - return 0; -} - -/** - * find_paths() - Find example paths to be used in the test. - * @node: The rule tree node being analyzed. - * @current_path: The walked path so far. - * @path_len: The path size so far. - * - * The method reads the defex_packed_rules policy array and find path and file - * examples that are in the policy so the test can be performed correctly. The - * lookup is done recursively, first horizontally and then vertically. This tree - * walking strategy is done to make path string construction easier. - * - * The method finds and stores in static variables: - * - Two different files that can be opened by the kunit without erros; - *- A directory with no features; - *- A directory with feature_immutable_path_open set; - *- A directory with feature_immutable_path_write set. - */ -static void find_paths(struct rule_item_struct *node, char *current_path, size_t path_len) -{ - int attr; - struct file *file_ptr; - - if (node->next_file) { - find_paths(GET_ITEM_PTR(node->next_file), current_path, path_len); - } - - if (!strncmp(node->name, "tmp", node->size)) - return; - - /* If no more space in current_path is available, stop looking here. */ - if (PATH_MAX - path_len < node->size + 1) - return; - /* Append name to path */ - memset(current_path + path_len, 0, PATH_MAX - path_len); - strncpy(current_path + path_len, "/", 1); - strncpy(current_path + path_len + 1, node->name, node->size); - path_len += node->size + 1; - - if (!(node->feature_type & feature_is_file)) { - if (strlen(existing_directory_path_open) == 0 && - node->feature_type & feature_immutable_path_open) { - strncpy(existing_directory_path_open, current_path, path_len); - } - if (strlen(existing_directory_path_write) == 0 && - node->feature_type & feature_immutable_path_write) { - strncpy(existing_directory_path_write, current_path, path_len); - } - if (strlen(existing_directory_no_features) == 0 && - node->feature_type == 0) { - strncpy(existing_directory_no_features, current_path, path_len); - } - } - else { - /* feature_is_file set */ - attr = get_first_feature(node->feature_type & feature_is_file); - if (attr) { - file_ptr = local_fopen(current_path, O_RDONLY, 0); - if (!IS_ERR_OR_NULL(file_ptr)) { - /* File with other feature */ - if (strlen(first_file) == 0) { - strncpy(first_file, current_path, - strlen(current_path)); - first_file_attr = attr; - } - else if (strlen(second_file) == 0) { - strncpy(second_file, current_path, - strlen(current_path)); - } - filp_close(file_ptr, 0); - } - } - } - if (node->next_level) { - find_paths(GET_ITEM_PTR(node->next_level), current_path, path_len); - } -} - -/* Triggers the lookup process if DEFEX policy is loaded. */ -static void find_rules_for_test(void) -{ - struct rule_item_struct *base; - char *path; - - base = (struct rule_item_struct *)defex_packed_rules; - if (!base || !base->data_size) - /* Rules are not loaded --- can't find any paths */ - return; - - path = kzalloc(PATH_MAX, GFP_KERNEL); - if (!path) - return; - - find_paths(GET_ITEM_PTR(base->next_level), path, 0); - - pr_info("kunit defex_sysfs_test: Path results:"); - pr_info("kunit defex_sysfs_test: first_file: %s", first_file); - pr_info("kunit defex_sysfs_test: second_file: %s", second_file); - pr_info("kunit defex_sysfs_test: existing_directory_no_features: %s", - existing_directory_no_features); - pr_info("kunit defex_sysfs_test: existing_directory_path_open: %s", - existing_directory_path_open); - pr_info("kunit defex_sysfs_test: existing_directory_path_write: %s", - existing_directory_path_write); - - rule_lookup_performed = 1; - kfree(path); -} -#endif /* DEFEX_USE_PACKED_RULES && DEFEX_RAMDISK_ENABLE */ - - -static void rules_lookup_test(struct test *test) -{ -#if (defined(DEFEX_SAFEPLACE_ENABLE) || defined(DEFEX_IMMUTABLE_ENABLE) || defined(DEFEX_PED_ENABLE)) - -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) - /* If packed rules are being used, they need to be loaded before the test. */ - if (check_rules_ready() == 0) { - test_info(test, "DEFEX policy not loaded: skip test."); - return; - } - - if (check_system_mount() == 1) - EXPECT_EQ(test, 0, rules_lookup(SYSTEM_ROOT, 0, NULL)); - else - EXPECT_EQ(test, 0, rules_lookup(NULL, 0, NULL)); -#else - /* Not able to build without packed rules --- Nothing to test for now. */ -#endif /* DEFEX_USE_PACKED_RULES && DEFEX_RAMDISK_ENABLE*/ -#endif /* DEFEX_SAFEPLACE_ENABLE || DEFEX_IMMUTABLE_ENABLE || DEFEX_PED_ENABLE */ - SUCCEED(test); -} - - -static void lookup_tree_test(struct test *test) -{ -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) - struct file *file_one, *file_two; - - /* If packed rules are being used, they need to be loaded before the test. */ - if (check_rules_ready() == 0) { - test_info(test, "DEFEX policy not loaded: skip test."); - return; - } - - if (rule_lookup_performed == 0) - /* If lookup not done yet, trigger it. */ - find_rules_for_test(); - - /* T1: file_path = NULL or file_path[0] != '/' */ - EXPECT_EQ(test, 0, lookup_tree(NULL, 0, NULL)); - EXPECT_EQ(test, 0, lookup_tree(NOT_A_PATH, 0, NULL)); - - if (strlen(first_file) > 0 && strlen(second_file) > 0) { - /* Policy lookup fond examples. */ - file_one = local_fopen(first_file, O_RDONLY, 0); - if (IS_ERR_OR_NULL(file_one)) - goto test_four; - file_two = local_fopen(second_file, O_RDONLY, 0); - if (IS_ERR_OR_NULL(file_two)) { - filp_close(file_one, 0); - goto test_four; - } - - /* T2: file with attribute other than feature_is_file */ - EXPECT_EQ(test, 1, lookup_tree(first_file, first_file_attr, file_one)); - - /* T3: file with different contents */ - EXPECT_EQ(test, DEFEX_INTEGRITY_FAIL, lookup_tree(first_file, first_file_attr, file_two)); - - filp_close(file_one, 0); - filp_close(file_two, 0); - } -test_four: - /* T4: Root path -> Does not look into the tree. */ - EXPECT_EQ(test, 0, lookup_tree(ROOT_PATH, 0, NULL)); - - if (strlen(existing_directory_path_open) > 0) { - /* T5: Path with feature_immutable_path_open */ - EXPECT_EQ(test, 0, lookup_tree(existing_directory_path_open, feature_immutable_path_open, NULL)); - - /* T6: with other separator */ - existing_directory_path_open[strlen(existing_directory_path_open)] = '/'; - EXPECT_EQ(test, 0, lookup_tree(existing_directory_path_open, feature_immutable_path_open, NULL)); - existing_directory_path_open[strlen(existing_directory_path_open) - 1] = '\0'; - } - - if (strlen(existing_directory_path_write) > 0) { - /* T7: Path with feature_immutable_path_write */ - EXPECT_EQ(test, 0, lookup_tree(existing_directory_path_write, feature_immutable_path_write, NULL)); - - /* T8: with other separator */ - existing_directory_path_write[strlen(existing_directory_path_write)] = '/'; - EXPECT_EQ(test, 0, lookup_tree(existing_directory_path_write, feature_immutable_path_write, NULL)); - existing_directory_path_write[strlen(existing_directory_path_write) - 1] = '\0'; - } - - /* T9: Path not present in policy */ - EXPECT_EQ(test, 0, lookup_tree(DUMMY_DIR, feature_immutable_path_open, NULL)); - -#endif /* DEFEX_USE_PACKED_RULES && DEFEX_RAMDISK_ENABLE*/ - SUCCEED(test); -} - - -static void lookup_dir_test(struct test *test) -{ -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) - - struct rule_item_struct *policy_item = NULL; - struct rule_item_struct *policy_base = (struct rule_item_struct *)defex_packed_rules; - char *path, *next_separator; - int size; - - /* If packed rules are being used, they need to be loaded before the test. */ - if (check_rules_ready() == 0) { - test_info(test, "DEFEX policy not loaded: skip test."); - return; - } - - if (rule_lookup_performed == 0) - /* If lookup not done yet, trigger it. */ - find_rules_for_test(); - - /* T1: !base || !base->next_level -> return NULL */ - EXPECT_EQ(test, NULL, lookup_dir(NULL, NULL, 0, 0)); - - /* T2: Existing directory */ - if (strlen(existing_directory_no_features) > 0) { - /* Policy parse found directory */ - path = existing_directory_no_features + 1; - /* Since we have the entire path, - * we need to iterate over each dir - */ - do { - next_separator = strchr(path, '/'); - if (!next_separator) - size = strlen(path); - else - size = next_separator - path; - if (!size) - FAIL(test, "Error in lookup: existing_directory_no_features"); - policy_item = lookup_dir(policy_base, path, size, 0); - ASSERT_NOT_NULL(test, policy_item); - EXPECT_EQ(test, 0, strncmp(policy_item->name, path, size)); - policy_base = policy_item; - path += size; - if (next_separator) - path++; - } while(*path); - } - - /* T3: Non-existing directory */ - EXPECT_EQ(test, NULL, lookup_dir(policy_base, DUMMY_DIR, strlen(DUMMY_DIR), 0)); - -#endif /* DEFEX_USE_PACKED_RULES && DEFEX_RAMDISK_ENABLE*/ - SUCCEED(test); -} - - -static void load_rules_late_test(struct test *test) -{ -#if defined(DEFEX_RAMDISK_ENABLE) && defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_KERNEL_ONLY) - - /* The test cannot try to load the policy by its own, - * since it can compromise the system. - */ - -#endif /* DEFEX_RAMDISK_ENABLE && DEFEX_USE_PACKED_RULES && DEFEX_KERNEL_ONLY */ - SUCCEED(test); -} - - -static void do_load_rules_test(struct test *test) -{ - /* __init function */ - SUCCEED(test); -} - - -static void defex_load_rules_test(struct test *test) -{ - /* __init function */ - SUCCEED(test); -} - - -static void defex_integrity_default_test(struct test *test) -{ -#ifdef DEFEX_INTEGRITY_ENABLE - EXPECT_EQ(test, 0, defex_integrity_default(INTEGRITY_DEFAULT)); - EXPECT_NE(test, 0, defex_integrity_default(DUMMY_DIR)); -#endif - SUCCEED(test); -} - - -static void defex_init_sysfs_test(struct test *test) -{ - /* __init function */ - SUCCEED(test); -} - - -static void defex_check_integrity_test(struct test *test) -{ -#ifdef DEFEX_INTEGRITY_ENABLE - unsigned char hash[SHA256_DIGEST_SIZE] = {0}; - struct file *test_file; -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) - struct rule_item_struct *policy_item = NULL; - struct rule_item_struct *policy_base = (struct rule_item_struct *)defex_packed_rules; - char *path, *next_separator; - int size; -#endif - /* T1: hash zero - no check is done */ - EXPECT_EQ(test, 0, defex_check_integrity(NULL, hash)); - - /* 'random' hash */ - memcpy((void *) hash, "A32CharacterStringForTestingThis", SHA256_DIGEST_SIZE); - - /* T2: file pointer is error */ - EXPECT_EQ(test, -1, defex_check_integrity(ERR_PTR(-1), hash)); - - /* T3: Wrong hash */ - test_file = local_fopen(DEFEX_RULES_FILE, O_RDONLY, 0); - if (!IS_ERR_OR_NULL(test_file)) { - EXPECT_NE(test, 0, defex_check_integrity(test_file, hash)); - filp_close(test_file, NULL); - } - -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) - /* T4: Right hash */ - if (strlen(first_file) > 0) { - /* Find policy item for first file */ - path = first_file + 1; - /* Since we have the entire path, - * we need to iterate over each dir - */ - do { - next_separator = strchr(path, '/'); - if (!next_separator) - size = strlen(path); - else - size = next_separator - path; - if (!size) - FAIL(test, "Error in lookup: existing_directory_no_features"); - policy_item = lookup_dir(policy_base, path, size, 0); - ASSERT_NOT_NULL(test, policy_item); - ASSERT_EQ(test, 0, strncmp(policy_item->name, path, size)); - policy_base = policy_item; - path += size; - if (next_separator) - path++; - } while(*path); - - test_file = local_fopen(first_file, O_RDONLY, 0); - ASSERT_FALSE(test, IS_ERR_OR_NULL(test_file)); - EXPECT_EQ(test, 0, defex_check_integrity(test_file, policy_item->integrity)); - filp_close(test_file, NULL); - } -#else - /* Not able to build without packed rules --- Nothing to test for now. */ -#endif /* DEFEX_USE_PACKED_RULES && DEFEX_RAMDISK_ENABLE*/ -#endif /* DEFEX_INTEGRITY_ENABLE */ - SUCCEED(test); -} - - -static void check_system_mount_test(struct test *test) -{ - struct file *fp; - fp = local_fopen(SYSTEM_ROOT, O_DIRECTORY | O_PATH, 0); - - if (!IS_ERR(fp)) { - filp_close(fp, NULL); - EXPECT_EQ(test, check_system_mount(), 1); - } else { - EXPECT_EQ(test, check_system_mount(), 0); - } - SUCCEED(test); -} - - -static void check_rules_ready_test(struct test *test) -{ -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) - struct rule_item_struct *base_struct = (struct rule_item_struct *)defex_packed_rules; - - if (!base_struct || !base_struct->data_size) - EXPECT_EQ(test, 0, check_rules_ready()); - else - EXPECT_EQ(test, 1, check_rules_ready()); - -#endif /* DEFEX_USE_PACKED_RULES && DEFEX_RAMDISK_ENABLE*/ - SUCCEED(test); -} - - -static void bootmode_setup_test(struct test *test) -{ - /* __init function */ - SUCCEED(test); -} - - -static int defex_sysfs_test_init(struct test *test) -{ -#if defined(DEFEX_USE_PACKED_RULES) && defined(DEFEX_RAMDISK_ENABLE) - if(!rule_lookup_performed) { - memset(first_file, 0, PATH_MAX); - memset(second_file, 0, PATH_MAX); - memset(existing_directory_no_features, 0, PATH_MAX); - memset(existing_directory_path_open, 0, PATH_MAX); - memset(existing_directory_path_write, 0, PATH_MAX); - - find_rules_for_test(); - } -#endif /* DEFEX_USE_PACKED_RULES && DEFEX_RAMDISK_ENABLE */ - return 0; -} - -static void defex_sysfs_test_exit(struct test *test) -{ -} - -static struct test_case defex_sysfs_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(rules_lookup_test), - TEST_CASE(lookup_tree_test), - TEST_CASE(lookup_dir_test), - TEST_CASE(load_rules_late_test), - TEST_CASE(do_load_rules_test), - TEST_CASE(defex_load_rules_test), - TEST_CASE(defex_integrity_default_test), - TEST_CASE(defex_init_sysfs_test), - TEST_CASE(defex_check_integrity_test), - TEST_CASE(check_system_mount_test), - TEST_CASE(check_rules_ready_test), - TEST_CASE(bootmode_setup_test), - {}, -}; - -static struct test_module defex_sysfs_test_module = { - .name = "defex_sysfs_test", - .init = defex_sysfs_test_init, - .exit = defex_sysfs_test_exit, - .test_cases = defex_sysfs_test_cases, -}; -module_test(defex_sysfs_test_module); - diff --git a/security/samsung/defex_lsm/debug/defex_debug.c b/security/samsung/defex_lsm/debug/defex_debug.c index 04a6117f9a5b..f46b38f45931 100755 --- a/security/samsung/defex_lsm/debug/defex_debug.c +++ b/security/samsung/defex_lsm/debug/defex_debug.c @@ -50,7 +50,7 @@ void blob(const char *buffer, const size_t bufLen, const int lineSize) offset += snprintf(stringToPrint + offset, MAX_DATA_LEN - offset, " "); } - snprintf(stringToPrint + offset, MAX_DATA_LEN - offset, " |"); + offset += snprintf(stringToPrint + offset, MAX_DATA_LEN - offset, " |"); pr_info("%s\n", stringToPrint); memset(stringToPrint, 0, MAX_DATA_LEN); i += line; @@ -137,7 +137,8 @@ __visible_for_testing ssize_t debug_store(struct kobject *kobj, struct kobj_attr "gid=", "pe_status=", "im_status=", - "sp_status=" + "sp_status=", + "int_status=" }; if (!buf || !p) @@ -167,6 +168,9 @@ __visible_for_testing ssize_t debug_store(struct kobject *kobj, struct kobj_attr case DBG_SET_SP_STATUS: safeplace_status_store(buf + l); break; + case DBG_SET_INT_STATUS: + integrity_status_store(buf + l); + break; default: break; } diff --git a/security/samsung/defex_lsm/debug/kunit_test/Makefile b/security/samsung/defex_lsm/debug/kunit_test/Makefile deleted file mode 100755 index 0f1ae83938c8..000000000000 --- a/security/samsung/defex_lsm/debug/kunit_test/Makefile +++ /dev/null @@ -1,121 +0,0 @@ -# -# Makefile for the Defex kunit tests -# - -# Features to Enable -PED_ENABLE=true -SAFEPLACE_ENABLE=true -IMMUTABLE_ENABLE=true -LP_ENABLE=true -UMH_RESTRICTION_ENABLE=true - -ifneq ($(wildcard $(srctree)/include/crypto/internal/rsa.h),) - $(warning [DEFEX] INTEGRITY_ENABLE) - INTEGRITY_ENABLE=true -endif - -# caches to enable -CACHES_ENABLE=true - -# OEM Unlock dependency -OEM_UNLOCK_DEPENDENCY=true - -# use the ramdisk or system_root to store rules file -RAMDISK_ENABLE=true - -# do signing for rules -SIGN_ENABLE=true - -# Immutable Feature is applied with permissive mode first. -DEFEX_DEFINES := -DDEFEX_PERMISSIVE_IM - -ifeq ($(CONFIG_DEFEX_KERNEL_ONLY), y) - DEFEX_DEFINES += -DDEFEX_KERNEL_ONLY - ifeq ($(CONFIG_SAMSUNG_PRODUCT_SHIP), y) - $(warning [DEFEX-KUNIT] Kernel_only & Ship) - else - $(warning [DEFEX-KUNIT] Kernel_only & Noship) - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_SP - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_IM - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_LP - DEFEX_DEFINES += -DDEFEX_DEBUG_ENABLE - endif -endif - -ifeq ($(CONFIG_SEC_FACTORY), y) - DEFEX_DEFINES += -DDEFEX_FACTORY_ENABLE -endif - -ifeq ($(PED_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_PED_ENABLE -endif - -ifeq ($(SAFEPLACE_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_SAFEPLACE_ENABLE -endif - -ifeq ($(INTEGRITY_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_INTEGRITY_ENABLE -endif - -ifeq ($(IMMUTABLE_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_IMMUTABLE_ENABLE -endif - -ifeq ($(LP_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_LP_ENABLE -endif - -ifeq ($(UMH_RESTRICTION_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_UMH_RESTRICTION_ENABLE -endif - -ifeq ($(CACHES_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_CACHES_ENABLE -endif - -ifeq ($(OEM_UNLOCK_DEPENDENCY), true) - DEFEX_DEFINES += -DDEFEX_DEPENDING_ON_OEMUNLOCK -endif - -ifeq ($(RAMDISK_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_RAMDISK_ENABLE -ifeq ($(SIGN_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_SIGN_ENABLE -endif -endif - -ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) - defex-y += defex_debug_test.o - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_SP - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_IM - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_LP - DEFEX_DEFINES += -DDEFEX_DEBUG_ENABLE - DEFEX_DEFINES += -DDEFEX_SYSFS_ENABLE -else - ifeq ($(CONFIG_SECURITY_DSMS), y) - DEFEX_DEFINES += -DDEFEX_DSMS_ENABLE - endif -endif - -# kunit tests options: -ifeq ($(CONFIG_KUNIT), y) - DEFEX_DEFINES += -DDEFEX_KUNIT_ENABLED -else - DEFEX_DEFINES += -D__visible_for_testing=static -endif - -ccflags-y := -Wformat - -EXTRA_CFLAGS += -I$(srctree)/$(src)/../.. -EXTRA_AFLAGS += -Isecurity/samsung/defex_lsm -EXTRA_CFLAGS += -I$(srctree)/$(src)/../../cert -EXTRA_AFLAGS += -Isecurity/samsung/defex_lsm/cert - -ifneq ($(wildcard $(srctree)/$(src)/../../pack_rules.c),) - DEFEX_DEFINES += -DDEFEX_USE_PACKED_RULES -endif -EXTRA_CFLAGS += $(DEFEX_DEFINES) -EXTRA_AFLAGS += $(DEFEX_DEFINES) - -obj-$(CONFIG_SECURITY_DEFEX) := $(defex-y) diff --git a/security/samsung/defex_lsm/debug/kunit_test/defex_debug_test.c b/security/samsung/defex_lsm/debug/kunit_test/defex_debug_test.c deleted file mode 100755 index 217781c592c1..000000000000 --- a/security/samsung/defex_lsm/debug/kunit_test/defex_debug_test.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include "include/defex_debug.h" -#include "include/defex_internal.h" -#include "include/defex_test.h" - -/* General test functions created by Generate_KUnit.sh */ - -static void set_user_test(struct test *test) -{ - struct cred *cred_test = (struct cred *) current_cred(); - struct user_namespace *ns = current_user_ns(); - kuid_t kuid; - - ASSERT_NOT_ERR_OR_NULL(test, cred_test); - - /* invalid uid first */ - kuid = make_kuid(ns, -1); - cred_test->uid = kuid; - EXPECT_EQ(test, set_user(cred_test), 0); - - /* Valid ID */ - kuid = make_kuid(ns, 1000); - cred_test->uid = kuid; - EXPECT_EQ(test, set_user(cred_test), 0); - ASSERT_EQ(test, cred_test->user->uid.val, 1000); -} - - -static void set_cred_test(struct test *test) -{ - /* uid, valid */ - EXPECT_EQ(test, set_cred(0, 1000), 0); - - /* uid, invalid */ - EXPECT_EQ(test, set_cred(0, -1), -EPERM); - - /* fsuid, valid */ - EXPECT_EQ(test, set_cred(1, 1000), 0); - - /* fsuid, invalid */ - EXPECT_EQ(test, set_cred(1, -1), -EPERM); - - /* guid, valid */ - EXPECT_EQ(test, set_cred(2, 1000), 0); - - /* guid, invalid */ - EXPECT_EQ(test, set_cred(2, -1), -EPERM); -} - - -static void defex_create_debug_test(struct test *test) -{ - struct kset *defex_kset = kset_create_and_add("defex_create_debug_test", NULL, NULL); - - ASSERT_NOT_ERR_OR_NULL(test, defex_kset); - EXPECT_EQ(test, defex_create_debug(defex_kset), DEFEX_OK); - - /* free resources */ - kset_unregister(defex_kset); -} - - -static void debug_store_test(struct test *test) -{ - char *invalid_prefix = "test"; - char *incomplete_prefix = "uid="; - char *valid_prefix = "uid=2000"; - - /* buffer null */ - EXPECT_EQ(test, debug_store(NULL, NULL, NULL, 0), -EINVAL); - /* invalid prefix */ - EXPECT_EQ(test, debug_store(NULL, NULL, invalid_prefix, 1), -EINVAL); - /* incomplete prefix */ - EXPECT_EQ(test, debug_store(NULL, NULL, incomplete_prefix, 1), -EINVAL); - /* valid prefix */ - EXPECT_EQ(test, debug_store(NULL, NULL, valid_prefix, 10), 10); -} - - -static void debug_show_test(struct test *test) -{ - struct task_struct *p = current; - struct kset *defex_kset = kset_create_and_add("debug_show_test", NULL, NULL); - char expected_output[MAX_LEN + 1]; - char buff[MAX_LEN + 1]; - int res = 0; - - ASSERT_NOT_ERR_OR_NULL(test, defex_kset); - ASSERT_EQ(test, defex_create_debug(defex_kset), DEFEX_OK); - - /* Make a command so last_cmd has a valid value */ - res = debug_store(NULL, NULL, "uid=1000", 10); - ASSERT_EQ(test, res, 10); - - res = snprintf(expected_output, MAX_LEN + 1, "pid=%d\nuid=%d\ngid=%d\neuid=%d\negid=%d\n", - p->pid, - uid_get_value(p->cred->uid), - uid_get_value(p->cred->gid), - uid_get_value(p->cred->euid), - uid_get_value(p->cred->egid)); - - EXPECT_EQ(test, res, debug_show(NULL, NULL, buff)); - EXPECT_TRUE(test, !strcmp(buff, expected_output)); - - /* free resources */ - kset_unregister(defex_kset); -} - - -static void debug_attribute_test(struct test *test) -{ - /* EXPECT_EQ(test, 1, debug_attribute()); */ -} - - -static int defex_debug_test_init(struct test *test) -{ - /* - * test->priv = a_struct_pointer; - * if (!test->priv) - * return -ENOMEM; - */ - - return 0; -} - -static void defex_debug_test_exit(struct test *test) -{ -} - -static struct test_case defex_debug_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(set_user_test), - TEST_CASE(set_cred_test), - TEST_CASE(defex_create_debug_test), - TEST_CASE(debug_store_test), - TEST_CASE(debug_show_test), - TEST_CASE(debug_attribute_test), - {}, -}; - -static struct test_module defex_debug_test_module = { - .name = "defex_debug_test", - .init = defex_debug_test_init, - .exit = defex_debug_test_exit, - .test_cases = defex_debug_test_cases, -}; -module_test(defex_debug_test_module); - diff --git a/security/samsung/defex_lsm/defex_packed_rules.bin b/security/samsung/defex_lsm/defex_packed_rules.bin new file mode 100755 index 0000000000000000000000000000000000000000..5781a87c5b62b3b7ebe42741e70055ae38469f63 GIT binary patch literal 12449 zcmb_iYm8l06<#w;Y3YMfN*}hg&b33^X}Py$+Ca2MTIe*`AR$Tf*K;x)c6Da_CEJ9Q`)XQ zGtQ4bzqR(-YpuPW=MMVXL82Ro`8hs)V){Yv{ip7o{(yJlz4uNB^jD&hYZ)q1U8QC6 z8T#_h$LJakT#r(sXX!d(*%s}zDiqP?kx9UrpP-%ON((KCUR_fe9b@1WrI98&HsTCz z1Gm24p=`H8rc27vc~ZfAUz=2 zoBCNHn=;O2QBzH#&yQ9{*K$((g-}h;Sjs5pr;8&oy7?C*<2^yv+l_`SaFbovRA?n9 zRgkJgs2QUBfF5JfDuGKr3MeZ`sQgxKHWcu)ZvwxXV{P$r&Jz3?1Zy~g2Hd?RC2WAZ zt{-!_Yg39?H-UZ+(5pE9QHmE8$AC8hXPqa?fczYgqb%c`=*LbHm z4_+;#(r{3sJu4gx73H`0kMV%tz>D9*56?LRx-pI}PFm2=_g7R#*#{o0rih7N0bABg zNf3HrrUlWaYaMQzv_jQ$%M-w}ZfWs7x10e1d(Bjuc=HuNS(kx>5xoE;dr3HXm}Ds! z{|9jP?HM=%aR~gLl@&hMs74T}7Sa7HE2FIYnt;~@R~`t*eF8xCcE(#pLqghLx$xCK z(SHGCV_Q4*i*61b?_1?yxY^9Sbpa^*(mJv}8_AA$y4%RKG~xWyE+;e!iKqVqK-ugs zr%XH~`U}9UA1NQ2UU!`XayEeOjsnSMt69;G^&q@K# z0y&3Z^=p7xlLiqS#h~8=nvEkt$+@=L;m!D2nuZU2yvbe-Mq%(w%{F|Hcm!#5_necx}BEjF3{|Q z&V}}ynMwUm0nYkbE6wISzbR7GEkxhBzCxQg?awFi3h8IFvgmGHdl6@iakR=7;dice za3G~R0#7yqmQ}uAhhe_}BrAXj4D@+GSxxq@Mzj`cVe8VQWvt|xRv_{x)*agA(7(*e zG{}nkz}u~V>8$%W9tRu!n;lqxox?-w(MvdCHz%J+gCdK9S`+cIgRD|(tNPK~YPVIDEM_BL);gk@WkeG= zdKbs6l(ROYqanX2%a2ag4)*yGo!eHSiKTEd)fPmX$LeVawFnEKM^(x*J*Bn4A3@DN z09e}h+B!m+{BF1kpG*>suwd&fqL)Fz=Bm=hL<(Rw_Yd6(cCxoP?;@2Bb?zC9nisO} zMhBN49;9TdvO?Lzo(3suVTG`zMbv=?U$qPs!I=GuAsLs)wZBx9T^U{M65 zXKt#{W)3>!o@YuAgUUBt&MDL4i-5AG6uJ;TR5b>n*eWnoK^^Lu0+y|F>>#a+AnF0l ziUGCzrph_%!dmy^-$~>WmUWrQi7tS(Tj}w;%?=4h1S&6b-`I1D!?QNkgpI?!l7i?o zglB`(fQ;ztE_gfp32im{k_$c&E$Nl`HMlj~#4D5gdjv;7z+Rx9hy8Lv1J6c_j)*j- z5QW#0U5wMT31{b>B$Gb6h_Wg86fDACB?@90$PoQ9(JBzI@yI^OBq$rQce)$_uvZQ@ ziRvI=OT8A}%a^t~jt=&|&B0CO;r<=}0Rhj%Ibhj}$Ye5uw|T>hQY{;%1Sfh8)MH%kX(+Q4 z*n%pKy+ITtBA+6f2AE9=XiN*+m};Qe3VztIy$(2Qtd8lFgRB9`AG&!t_2+_8b{`yz zZ5}YFH1(sZb_y(RWKl&4OY}jIvQlHkfTklWkorCeJgdSaO3UPa5$J84A(N<4V7BkY zvLXDgm(}a2r?jvo*y~Uddz@;jwlZUuNub#PSw@;(c8GU6Tt7sFH~kV$IJZor4f+{m z${owI|J1OR*#=f)oSMsNT!XK|9_up`UeuAUC6i2XHku#g>&l8tA~EEqkuBAY%)ovh()f3fM=~ z%l`Ix5U%G;JUDO0pS4~@#$M43QL3ep zs{Ow2Nf*Mw6)_)5Wo&QxDhRha>83}tu+KUG-y2^Nc{LVI^tok}ZGjCtf}JORujaKk zcmlMJeImT696niAX3X~NI~-i2*DrgCNU;n+rM&@EY~ve8DO83je;75;D}#j13@R15 zYG&Hkh$SBb1*?;KRzzt-sTf0zIP^3Yv1U8;;aiqQYqtIumvQddC7=87uCMNK7^RzP z?Tfo!!vKzbU1rqSkK3jgcn(DW*I;It?wWXXg7_ypUltX#5L({{vc*WlMs19y(OP)m z{>;Sgy;x2g{#W~%FB7~}+12HRMTj-NL}MEVHQ9od@G{PA9P~#xmsJNU%(!dULPXnc zT_nN3al*!{>CXJ0A4`#XP@Ac!y)d%hP3+n2P_l=r9Q7lR>~WZV_u*(zBK-+ltBi5N z&Dos%T}Z>$T5(h_MB2jY*F|>oxm5`_CS;i-nsw0n5Z#HJvgm;*DbQ@^GZf`}dmWhf zM0sJ)Z}t%{3YZ6NU;h(9X)(`~4e@9M>+R5fmGzOmuS{am!C5{a>>Z_k6v$M+=_a^N@_Y6_wI3e?UQH?H|9YN*KqZRqk@9ba9l{ie z#HInY%xUl;zHI8z9?9w-HF$?YYx=?IyH7oE>@IwHTT-wK$nuP8DJ@zUsG5Dby$|~E z*;@IzfGt;lh!$~al;6ggY+IWJW))msiuHvoC@|TTrV#%9ts|qXS4L)zzoP1b%tE4f z0m(M+*48M9uwSvCwV2OrSt8XgLhNHg)Y!HlKT{hSwTaPO{7OIlVsNnGwMW;oWNzUy z^$m#4K5J8|+jXc}*_+3=7a}Z<$~?h`K(+cx0{8zNY9DOAe|EryAPWZsFV;rJZ4&Eq zyWH<@QO)pM*M+*d<-o}J;uSquQXD-ze{0U z9~>FCQEEQ@rGM_N=9NfPJ8cZt^E&oxt;WLJ?f}Dsmom8Y?^j|tkh7zbg>2#C<7`S> P_&uB -#include -#include "include/defex_internal.h" -#include "include/defex_test.h" - -static void immutable_status_store_test(struct test *test) -{ - char *invalid_prefix = "test"; - char *over_range_prefix = "5"; - char *valid_prefix = "2"; - - /* buffer null */ - EXPECT_EQ(test, immutable_status_store(NULL), -EINVAL); - /* invalid prefix */ - EXPECT_EQ(test, immutable_status_store(invalid_prefix), -EINVAL); - /* over range prefix */ - EXPECT_EQ(test, immutable_status_store(over_range_prefix), -EINVAL); - /* valid prefix */ - EXPECT_EQ(test, immutable_status_store(valid_prefix), 0); -} - -static int defex_immutable_test_init(struct test *test) -{ - return 0; -} - -static void defex_immutable_test_exit(struct test *test) -{ -} - -static struct test_case defex_immutable_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(immutable_status_store_test), - {}, -}; - -static struct test_module defex_immutable_test_module = { - .name = "defex_immutable_test", - .init = defex_immutable_test_init, - .exit = defex_immutable_test_exit, - .test_cases = defex_immutable_test_cases, -}; -module_test(defex_immutable_test_module); diff --git a/security/samsung/defex_lsm/feature_privilege_escalation_detection/kunit_test/Makefile b/security/samsung/defex_lsm/feature_privilege_escalation_detection/kunit_test/Makefile deleted file mode 100755 index aa82cba211c8..000000000000 --- a/security/samsung/defex_lsm/feature_privilege_escalation_detection/kunit_test/Makefile +++ /dev/null @@ -1,121 +0,0 @@ -# -# Makefile for the Defex kunit tests -# - -# Features to Enable -PED_ENABLE=true -SAFEPLACE_ENABLE=true -IMMUTABLE_ENABLE=true -LP_ENABLE=true -UMH_RESTRICTION_ENABLE=true - -ifneq ($(wildcard $(srctree)/include/crypto/internal/rsa.h),) - $(warning [DEFEX] INTEGRITY_ENABLE) - INTEGRITY_ENABLE=true -endif - -# caches to enable -CACHES_ENABLE=true - -# OEM Unlock dependency -OEM_UNLOCK_DEPENDENCY=true - -# use the ramdisk or system_root to store rules file -RAMDISK_ENABLE=true - -# do signing for rules -SIGN_ENABLE=true - -# Immutable Feature is applied with permissive mode first. -DEFEX_DEFINES := -DDEFEX_PERMISSIVE_IM - -ifeq ($(CONFIG_DEFEX_KERNEL_ONLY), y) - DEFEX_DEFINES += -DDEFEX_KERNEL_ONLY - ifeq ($(CONFIG_SAMSUNG_PRODUCT_SHIP), y) - $(warning [DEFEX-KUNIT] Kernel_only & Ship) - else - $(warning [DEFEX-KUNIT] Kernel_only & Noship) - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_SP - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_IM - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_LP - DEFEX_DEFINES += -DDEFEX_DEBUG_ENABLE - endif -endif - -ifeq ($(CONFIG_SEC_FACTORY), y) - DEFEX_DEFINES += -DDEFEX_FACTORY_ENABLE -endif - -ifeq ($(PED_ENABLE), true) - defex-y += defex_priv_test.o - DEFEX_DEFINES += -DDEFEX_PED_ENABLE -endif - -ifeq ($(SAFEPLACE_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_SAFEPLACE_ENABLE -endif - -ifeq ($(INTEGRITY_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_INTEGRITY_ENABLE -endif - -ifeq ($(IMMUTABLE_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_IMMUTABLE_ENABLE -endif - -ifeq ($(LP_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_LP_ENABLE -endif - -ifeq ($(UMH_RESTRICTION_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_UMH_RESTRICTION_ENABLE -endif - -ifeq ($(CACHES_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_CACHES_ENABLE -endif - -ifeq ($(OEM_UNLOCK_DEPENDENCY), true) - DEFEX_DEFINES += -DDEFEX_DEPENDING_ON_OEMUNLOCK -endif - -ifeq ($(RAMDISK_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_RAMDISK_ENABLE -ifeq ($(SIGN_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_SIGN_ENABLE -endif -endif - -ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_SP - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_IM - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_LP - DEFEX_DEFINES += -DDEFEX_DEBUG_ENABLE - DEFEX_DEFINES += -DDEFEX_SYSFS_ENABLE -else - ifeq ($(CONFIG_SECURITY_DSMS), y) - DEFEX_DEFINES += -DDEFEX_DSMS_ENABLE - endif -endif - -# kunit tests options: -ifeq ($(CONFIG_KUNIT), y) - DEFEX_DEFINES += -DDEFEX_KUNIT_ENABLED -else - DEFEX_DEFINES += -D__visible_for_testing=static -endif - -ccflags-y := -Wformat - -EXTRA_CFLAGS += -I$(srctree)/$(src)/../.. -EXTRA_AFLAGS += -Isecurity/samsung/defex_lsm -EXTRA_CFLAGS += -I$(srctree)/$(src)/../../cert -EXTRA_AFLAGS += -Isecurity/samsung/defex_lsm/cert - -ifneq ($(wildcard $(srctree)/$(src)/../../pack_rules.c),) - DEFEX_DEFINES += -DDEFEX_USE_PACKED_RULES -endif -EXTRA_CFLAGS += $(DEFEX_DEFINES) -EXTRA_AFLAGS += $(DEFEX_DEFINES) - -obj-$(CONFIG_SECURITY_DEFEX) := $(defex-y) diff --git a/security/samsung/defex_lsm/feature_privilege_escalation_detection/kunit_test/defex_priv_test.c b/security/samsung/defex_lsm/feature_privilege_escalation_detection/kunit_test/defex_priv_test.c deleted file mode 100755 index ca8e52a72b24..000000000000 --- a/security/samsung/defex_lsm/feature_privilege_escalation_detection/kunit_test/defex_priv_test.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include -#include -#include "include/defex_internal.h" -#include "include/defex_test.h" - -static void privesc_status_store_test(struct test *test) -{ - char *invalid_prefix = "test"; - char *over_range_prefix = "5"; - char *valid_prefix = "2"; - - /* buffer null */ - EXPECT_EQ(test, privesc_status_store(NULL), -EINVAL); - /* invalid prefix */ - EXPECT_EQ(test, privesc_status_store(invalid_prefix), -EINVAL); - /* over range prefix */ - EXPECT_EQ(test, privesc_status_store(over_range_prefix), -EINVAL); - /* valid prefix */ - EXPECT_EQ(test, privesc_status_store(valid_prefix), 0); -} - -static int defex_privesc_test_init(struct test *test) -{ - return 0; -} - -static void defex_privesc_test_exit(struct test *test) -{ -} - -static struct test_case defex_privesc_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(privesc_status_store_test), - {}, -}; - -static struct test_module defex_privesc_test_module = { - .name = "defex_privesc_test", - .init = defex_privesc_test_init, - .exit = defex_privesc_test_exit, - .test_cases = defex_privesc_test_cases, -}; -module_test(defex_privesc_test_module); diff --git a/security/samsung/defex_lsm/feature_safeplace/defex_integrity.c b/security/samsung/defex_lsm/feature_safeplace/defex_integrity.c new file mode 100755 index 000000000000..aaf3ba11fdf4 --- /dev/null +++ b/security/samsung/defex_lsm/feature_safeplace/defex_integrity.c @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include "include/defex_internal.h" + +#ifdef DEFEX_PERMISSIVE_INT +unsigned char global_integrity_status = 2; +#else +unsigned char global_integrity_status = 1; +#endif /* DEFEX_PERMISSIVE_INT */ + +int integrity_status_store(const char *status_str) +{ + int ret; + unsigned int status; + + if (!status_str) + return -EINVAL; + + ret = kstrtouint(status_str, 10, &status); + if (ret != 0 || status > 2) + return -EINVAL; + + global_integrity_status = status; + + return 0; +} diff --git a/security/samsung/defex_lsm/feature_safeplace/kunit_test/Makefile b/security/samsung/defex_lsm/feature_safeplace/kunit_test/Makefile deleted file mode 100755 index 76b3cf4e4542..000000000000 --- a/security/samsung/defex_lsm/feature_safeplace/kunit_test/Makefile +++ /dev/null @@ -1,121 +0,0 @@ -# -# Makefile for the Defex kunit tests -# - -# Features to Enable -PED_ENABLE=true -SAFEPLACE_ENABLE=true -IMMUTABLE_ENABLE=true -LP_ENABLE=true -UMH_RESTRICTION_ENABLE=true - -ifneq ($(wildcard $(srctree)/include/crypto/internal/rsa.h),) - $(warning [DEFEX] INTEGRITY_ENABLE) - INTEGRITY_ENABLE=true -endif - -# caches to enable -CACHES_ENABLE=true - -# OEM Unlock dependency -OEM_UNLOCK_DEPENDENCY=true - -# use the ramdisk or system_root to store rules file -RAMDISK_ENABLE=true - -# do signing for rules -SIGN_ENABLE=true - -# Immutable Feature is applied with permissive mode first. -DEFEX_DEFINES := -DDEFEX_PERMISSIVE_IM - -ifeq ($(CONFIG_DEFEX_KERNEL_ONLY), y) - DEFEX_DEFINES += -DDEFEX_KERNEL_ONLY - ifeq ($(CONFIG_SAMSUNG_PRODUCT_SHIP), y) - $(warning [DEFEX-KUNIT] Kernel_only & Ship) - else - $(warning [DEFEX-KUNIT] Kernel_only & Noship) - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_SP - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_IM - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_LP - DEFEX_DEFINES += -DDEFEX_DEBUG_ENABLE - endif -endif - -ifeq ($(CONFIG_SEC_FACTORY), y) - DEFEX_DEFINES += -DDEFEX_FACTORY_ENABLE -endif - -ifeq ($(PED_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_PED_ENABLE -endif - -ifeq ($(SAFEPLACE_ENABLE), true) - defex-y += defex_safeplace_test.o - DEFEX_DEFINES += -DDEFEX_SAFEPLACE_ENABLE -endif - -ifeq ($(INTEGRITY_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_INTEGRITY_ENABLE -endif - -ifeq ($(IMMUTABLE_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_IMMUTABLE_ENABLE -endif - -ifeq ($(LP_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_LP_ENABLE -endif - -ifeq ($(UMH_RESTRICTION_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_UMH_RESTRICTION_ENABLE -endif - -ifeq ($(CACHES_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_CACHES_ENABLE -endif - -ifeq ($(OEM_UNLOCK_DEPENDENCY), true) - DEFEX_DEFINES += -DDEFEX_DEPENDING_ON_OEMUNLOCK -endif - -ifeq ($(RAMDISK_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_RAMDISK_ENABLE -ifeq ($(SIGN_ENABLE), true) - DEFEX_DEFINES += -DDEFEX_SIGN_ENABLE -endif -endif - -ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_SP - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_IM - DEFEX_DEFINES += -DDEFEX_PERMISSIVE_LP - DEFEX_DEFINES += -DDEFEX_DEBUG_ENABLE - DEFEX_DEFINES += -DDEFEX_SYSFS_ENABLE -else - ifeq ($(CONFIG_SECURITY_DSMS), y) - DEFEX_DEFINES += -DDEFEX_DSMS_ENABLE - endif -endif - -# kunit tests options: -ifeq ($(CONFIG_KUNIT), y) - DEFEX_DEFINES += -DDEFEX_KUNIT_ENABLED -else - DEFEX_DEFINES += -D__visible_for_testing=static -endif - -ccflags-y := -Wformat - -EXTRA_CFLAGS += -I$(srctree)/$(src)/../.. -EXTRA_AFLAGS += -Isecurity/samsung/defex_lsm -EXTRA_CFLAGS += -I$(srctree)/$(src)/../../cert -EXTRA_AFLAGS += -Isecurity/samsung/defex_lsm/cert - -ifneq ($(wildcard $(srctree)/$(src)/../../pack_rules.c),) - DEFEX_DEFINES += -DDEFEX_USE_PACKED_RULES -endif -EXTRA_CFLAGS += $(DEFEX_DEFINES) -EXTRA_AFLAGS += $(DEFEX_DEFINES) - -obj-$(CONFIG_SECURITY_DEFEX) := $(defex-y) diff --git a/security/samsung/defex_lsm/feature_safeplace/kunit_test/defex_safeplace_test.c b/security/samsung/defex_lsm/feature_safeplace/kunit_test/defex_safeplace_test.c deleted file mode 100755 index a3ef1473b0a9..000000000000 --- a/security/samsung/defex_lsm/feature_safeplace/kunit_test/defex_safeplace_test.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include -#include -#include "include/defex_internal.h" -#include "include/defex_test.h" - -static void safeplace_status_store_test(struct test *test) -{ - char *invalid_prefix = "test"; - char *over_range_prefix = "5"; - char *valid_prefix = "2"; - - /* buffer null */ - EXPECT_EQ(test, safeplace_status_store(NULL), -EINVAL); - /* invalid prefix */ - EXPECT_EQ(test, safeplace_status_store(invalid_prefix), -EINVAL); - /* over range prefix */ - EXPECT_EQ(test, safeplace_status_store(over_range_prefix), -EINVAL); - /* valid prefix */ - EXPECT_EQ(test, safeplace_status_store(valid_prefix), 0); -} - -static int defex_safeplace_test_init(struct test *test) -{ - return 0; -} - -static void defex_safeplace_test_exit(struct test *test) -{ -} - -static struct test_case defex_safeplace_test_cases[] = { - /* TEST FUNC DEFINES */ - TEST_CASE(safeplace_status_store_test), - {}, -}; - -static struct test_module defex_safeplace_test_module = { - .name = "defex_safeplace_test", - .init = defex_safeplace_test_init, - .exit = defex_safeplace_test_exit, - .test_cases = defex_safeplace_test_cases, -}; -module_test(defex_safeplace_test_module); diff --git a/security/samsung/defex_lsm/feature_trusted_map/defex_trusted_map.c b/security/samsung/defex_lsm/feature_trusted_map/defex_trusted_map.c new file mode 100755 index 000000000000..c59d28eafe0b --- /dev/null +++ b/security/samsung/defex_lsm/feature_trusted_map/defex_trusted_map.c @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include "include/defex_internal.h" + +unsigned char global_trusted_map_status = DEFEX_TM_ENFORCING_MODE +#ifdef DEFEX_PERMISSIVE_TM + | DEFEX_TM_PERMISSIVE_MODE +#endif + | DEFEX_TM_DEBUG_VIOLATIONS + ; diff --git a/security/samsung/defex_lsm/feature_trusted_map/dtm.c b/security/samsung/defex_lsm/feature_trusted_map/dtm.c new file mode 100755 index 000000000000..cd6cd09e62ac --- /dev/null +++ b/security/samsung/defex_lsm/feature_trusted_map/dtm.c @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2020-2022 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) +#include +#endif + +#include "include/dtm.h" +#include "include/dtm_engine.h" +#include "include/dtm_log.h" +#include "include/dtm_utils.h" + +/* From fs/exec.c: SM8150_Q, SM8250_Q, SM8250_R, exynos9820, exynos9830 */ +struct user_arg_ptr { +#ifdef CONFIG_COMPAT + bool is_compat; +#endif + union { + const char __user *const __user *native; +#ifdef CONFIG_COMPAT + const compat_uptr_t __user *compat; +#endif + } ptr; +}; + +/* From fs/exec.c: SM8150_Q, SM8250_Q, SM8250_R, exynos9820, exynos9830 */ +static const char __user *get_user_arg_ptr(struct user_arg_ptr argv, int nr) +{ + const char __user *native; + +#ifdef CONFIG_COMPAT + if (unlikely(argv.is_compat)) { + compat_uptr_t compat; + + if (get_user(compat, argv.ptr.compat + nr)) + return ERR_PTR(-EFAULT); + + return compat_ptr(compat); + } +#endif + + if (get_user(native, argv.ptr.native + nr)) + return ERR_PTR(-EFAULT); + + return native; +} + +static void dtm_kfree_args(struct dtm_context *context) +{ + const char **argv; + int arg, to_free; + + if (unlikely(!is_dtm_context_valid(context))) + return; + argv = context->callee_argv; + arg = min_t(int, context->callee_argc, DTM_MAX_ARGC); + to_free = context->callee_copied_argc; + context->callee_copied_argc = 0; + while (--arg >= 0 && to_free > 0) { + if (!argv[arg]) + continue; + kfree(argv[arg]); + to_free--; + } +} + +/* + * Gets call argument value, copying from user if needed. + */ +const char *dtm_get_callee_arg(struct dtm_context *context, int arg_index) +{ + struct user_arg_ptr argv; + const char __user *user_str; + char *copy; + int max_argc, arg_len, copy_len; + + if (unlikely(!is_dtm_context_valid(context))) + return NULL; + max_argc = min_t(int, context->callee_argc, DTM_MAX_ARGC); + if (unlikely((arg_index < 0) || (arg_index >= max_argc))) + return NULL; + if (context->callee_argv[arg_index]) + return context->callee_argv[arg_index]; + + argv = *(struct user_arg_ptr *)context->callee_argv_ref; + user_str = get_user_arg_ptr(argv, arg_index); + if (IS_ERR(user_str)) + return NULL; + + arg_len = strnlen_user(user_str, MAX_ARG_STRLEN); + if (unlikely(!arg_len)) + return NULL; + + copy_len = min_t(int, arg_len, DTM_MAX_ARG_STRLEN); + copy = kzalloc(copy_len, GFP_KERNEL); + if (unlikely(!copy)) + return NULL; + + if (unlikely(copy_from_user(copy, user_str, copy_len))) + goto out_free_copy; + copy[copy_len - 1] = '\0'; + + context->callee_argv[arg_index] = copy; + context->callee_copied_argc++; + context->callee_copied_args_len += copy_len; + context->callee_total_args_len += arg_len; + return copy; + +out_free_copy: + kfree(copy); + return NULL; +} + +/* + * Initializes dtm context data structure. + */ +__visible_for_testing bool dtm_context_get(struct dtm_context *context, + struct defex_context *defex_context, + int callee_argc, + void *callee_argv_ref) +{ + memset(context, 0, sizeof(*context)); + context->defex_context = defex_context; + context->callee_argc = callee_argc; + context->callee_argv_ref = callee_argv_ref; + return true; +} + +/* + * Releases resources associated to dtm context. + */ +__visible_for_testing void dtm_context_put(struct dtm_context *context) +{ + dtm_kfree_args(context); +} + +/* + * Gets program name for current call. + */ +const char *dtm_get_program_name(struct dtm_context *context) +{ + if (unlikely(!is_dtm_context_valid(context))) + return NULL; + if (context->program_name) + return context->program_name; + context->program_name = dtm_get_callee_arg(context, 0); + if (context->program_name == NULL) + context->program_name = DTM_UNKNOWN; + return context->program_name; +} + +/** + * Gets stdin mode bit for current call. + */ +int dtm_get_stdin_mode_bit(struct dtm_context *context) +{ + if (unlikely(!context)) + return DTM_FD_MODE_ERROR; + if (!context->stdin_mode_bit) + context->stdin_mode_bit = dtm_get_fd_mode_bit(0); + return context->stdin_mode_bit; +} + +/** + * Gets stdin mode for current call. + */ +const char *dtm_get_stdin_mode(struct dtm_context *context) +{ + if (unlikely(!context)) + return NULL; + if (!context->stdin_mode) + context->stdin_mode = dtm_get_fd_mode_bit_name( + dtm_get_stdin_mode_bit(context)); + return context->stdin_mode; +} + +int defex_trusted_map_lookup(struct defex_context *defex_context, + int callee_argc, void *callee_argv_ref) +{ + int ret = DTM_DENY; + struct dtm_context context; + + if (unlikely(!defex_context || !(defex_context->task))) + goto out; + if (unlikely(!dtm_context_get(&context, defex_context, callee_argc, callee_argv_ref))) + goto out; + ret = dtm_enforce(&context); + dtm_context_put(&context); +out: + return ret; +} diff --git a/security/samsung/defex_lsm/feature_trusted_map/dtm_engine.c b/security/samsung/defex_lsm/feature_trusted_map/dtm_engine.c new file mode 100755 index 000000000000..4f125ad3d9d1 --- /dev/null +++ b/security/samsung/defex_lsm/feature_trusted_map/dtm_engine.c @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2020-2022 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include +#include +#include + +#include "include/defex_rules.h" +#include "include/dtm.h" +#include "include/dtm_engine.h" +#include "include/dtm_log.h" +#include "include/dtm_utils.h" +#include "include/ptree.h" + +#define DTM_ANY_VALUE "*" /* wildcard value for files and arguments */ +#if defined(DEFEX_TM_DEFAULT_POLICY_ENABLE) || defined(DEFEX_KERNEL_ONLY) +/* Kernel-only builds don't use DEFEX's dynamic policy loading mechanism. */ +#define USE_EMBEDDED_POLICY +static struct PPTree embedded_header; +/* File with hardcoded policy */ +#include "dtm_engine_defaultpolicy.h" +#endif + +#ifdef DEFEX_KUNIT_ENABLED +static struct PPTree override_header, *pptree_override; + +void dtm_engine_override_data(const unsigned char *p) +{ + if (p) { + pr_warn("[DEFEX] dtm_engine data overridden."); + pptree_set_data(pptree_override = &override_header, p); + } else { + pr_warn("[DEFEX] dtm_engine override data back to normal."); + pptree_override = 0; + } +} +#endif + +static int dtm_check_stdin(struct dtm_context *context, int allowed_stdin_modes) +{ + if (unlikely(!(dtm_get_stdin_mode_bit(context) & allowed_stdin_modes))) { + dtm_report_violation(DTM_STDIN_VIOLATION, context); + return DTM_DENY; + } + return DTM_ALLOW; +} + +/* + * Enforces DTM policy for an exec system call. + */ +int dtm_enforce(struct dtm_context *context) +{ + const char *callee_path, *caller_path; + const char *program_name; + int ret, argc, call_argc; + const char *argument_value; + struct PPTree *pptree; /* effective header of policy rules */ + struct PPTreeContext pp_ctx; /* context for policy search */ + static char first_run = 1; /* flag for one-time policy actions */ + + if (first_run) { + if (dtm_tree.data) + pr_info("[DEFEX] DTM engine: policy found."); + else + pr_warn("[DEFEX] DTM engine: dynamic policy not loaded."); + first_run = 0; +#ifdef USE_EMBEDDED_POLICY + pptree_set_data(&embedded_header, dtm_engine_defaultpolicy); +#endif + } + + pr_info("[DEFEX] pid : %d %d", current->tgid, current->pid); + + if (!context || unlikely(!is_dtm_context_valid(context))) { + pr_info("(0) [DEFEX] TMED no or invalid context."); + return DTM_DENY; + } + /* Check callee */ + callee_path = dtm_get_callee_path(context); + if (unlikely(!callee_path)) { + pr_info("(1) [DEFEX] TMED null callee."); + return DTM_DENY; + } + +#ifdef DEFEX_KUNIT_ENABLED + if (pptree_override) /* test code has opportunity to use test policy instead */ + pptree = pptree_override; + else +#endif +#ifdef USE_EMBEDDED_POLICY /* try dynamic policy first, use embedded if not found */ + pptree = dtm_tree.data ? &dtm_tree : &embedded_header; +#else /* only dynamically loaded policy is acceptable */ + pptree = &dtm_tree; +#endif + if (!pptree->data) { /* Should never happen */ + pr_warn("(0) [DEFEX] DTM engine: neither dynamic nor hardcoded rules loaded."); + return DTM_ALLOW; + } + memset(&pp_ctx, 0, sizeof(pp_ctx)); + if (!(pptree_find_path(pptree, + *callee_path == '/' ? + callee_path + 1 : callee_path, '/', &pp_ctx) && + (pp_ctx.types & PTREE_DATA_PATH))) { + pr_info("(2) [DEFEX] TME callee '%s' not found.", callee_path); + return DTM_ALLOW; + } + /* Check caller */ + caller_path = dtm_get_caller_path(context); + if (unlikely(!caller_path)) { + pr_info("(3) [DEFEX] TMED callee '%s': null caller.", callee_path); + return DTM_DENY; + } + if (!(pptree_find_path(pptree, caller_path + 1, '/', &pp_ctx) && + (pp_ctx.types & PTREE_DATA_PATH))) { + pr_info("(4) [DEFEX] TMED callee '%s': caller '%s' not found.", + callee_path, caller_path); + dtm_report_violation(DTM_CALLER_VIOLATION, context); + return DTM_DENY; + } + /* Check program, if any */ + program_name = dtm_get_program_name(context); + if (!program_name) { + pr_info("(5) [DEFEX] TMED callee '%s', caller '%s': null program.", + callee_path, caller_path); + return DTM_DENY; + } + pp_ctx.types |= PTREE_FIND_PEEK; + if (pptree_child_count(pptree, &pp_ctx) == 1 && + pptree_find_path(pptree, DTM_ANY_VALUE, 0, &pp_ctx)) { + pr_info("[DEFEX] TME callee '%s', caller '%s': program may be '*...'.", + callee_path, caller_path); + pp_ctx.types |= PTREE_FIND_PEEKED; + pptree_find_path(pptree, 0, 0, &pp_ctx); + } else { + pp_ctx.types &= ~PTREE_FIND_PEEK; + if (!(pptree_find_path(pptree, program_name, 0, &pp_ctx) && + (pp_ctx.types & PTREE_DATA_INT2))) { + pr_info("(6) [DEFEX] TMED callee '%s', caller '%s': program '%s' not found.", + callee_path, caller_path, program_name); + dtm_report_violation(DTM_PROGRAM_VIOLATION, context); + return DTM_DENY; + } + } + /* Check standard input mode */ + if (pp_ctx.types & PTREE_DATA_INT2) { + ret = dtm_check_stdin(context, pp_ctx.value.int2); + if (unlikely(ret != DTM_ALLOW)) { + pr_info("(7) [DEFEX] TMED callee '%s', caller '%s', program '%s': stdin mode %d, should be %d.", + callee_path, caller_path, + program_name ? program_name : "(null)", + dtm_get_stdin_mode_bit(context), pp_ctx.value.int2); + return ret; + } + } + /* Check program arguments, if any */ + pp_ctx.types |= PTREE_FIND_CONTINUE; + for (call_argc = context->callee_argc, argc = 1; + argc <= call_argc && pptree_child_count(pptree, &pp_ctx); + ++argc) { + pp_ctx.types |= PTREE_FIND_PEEK; + if (pptree_find_path(pptree, DTM_ANY_VALUE, 0, &pp_ctx)) { + pr_info("(8) [DEFEX] TME callee '%s', caller '%s', program '%s': any arguments accepted.", + callee_path, caller_path, program_name); + return DTM_ALLOW; + } + pp_ctx.types &= PTREE_FIND_PEEKED; + pp_ctx.types |= PTREE_FIND_CONTINUE; + argument_value = dtm_get_callee_arg(context, argc); + if (!pptree_find_path(pptree, argument_value, 0, &pp_ctx)) { + pr_info("(9) [DEFEX] TMED callee '%s', caller '%s', program '%s': argument '%s' (%d of %d) not found.", + callee_path, caller_path, program_name, + argument_value ? argument_value : "(null)", + argc, call_argc); + dtm_report_violation(DTM_ARGUMENTS_VIOLATION, context); + return DTM_DENY; + } + if (pp_ctx.value.bits) { + pr_info("(10) [DEFEX] TME callee '%s', caller '%s', program '%s': argument '%s' accepts '*'.", + callee_path, caller_path, program_name, + argument_value ? argument_value : "(null)"); + return DTM_ALLOW; + } + } + if (call_argc && argc > call_argc) + pr_info("[DEFEX] TME callee '%s', caller '%s', program '%s': all %d argument(s) checked.", + callee_path, caller_path, program_name, call_argc); + return DTM_ALLOW; +} diff --git a/security/samsung/defex_lsm/feature_trusted_map/dtm_engine_defaultpolicy.h b/security/samsung/defex_lsm/feature_trusted_map/dtm_engine_defaultpolicy.h new file mode 100755 index 000000000000..4730bfb61073 --- /dev/null +++ b/security/samsung/defex_lsm/feature_trusted_map/dtm_engine_defaultpolicy.h @@ -0,0 +1,4 @@ +static unsigned char dtm_engine_defaultpolicy[] = { +80,80,84,114,101,101,45,1,0,0,0,0,1,0,0,0,0,1,0,0,0, +0,1,0,0,0,0,1,0,1,1,0,0, +}; diff --git a/security/samsung/defex_lsm/feature_trusted_map/dtm_log.c b/security/samsung/defex_lsm/feature_trusted_map/dtm_log.c new file mode 100755 index 000000000000..939808581c1d --- /dev/null +++ b/security/samsung/defex_lsm/feature_trusted_map/dtm_log.c @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2020-2022 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include + +#include "include/dtm.h" +#include "include/dtm_log.h" +#include "include/dtm_utils.h" + +#define DTM_MAX_LOG_SIZE (1024) +#define DTM_MAX_DETAIL_SIZE (1024) + +#ifdef DEFEX_DSMS_ENABLE +#include +#else +#define DSMS_SUCCESS (0) +#define dsms_send_message(feature_code, message, value) (DSMS_SUCCESS) +#endif + +static inline bool should_send_dsms_event(void) +{ +#ifdef DEFEX_DSMS_ENABLE + return IS_ENABLED(CONFIG_SECURITY_DSMS); +#else + return false; +#endif +} + +__visible_for_testing void dtm_append_argv(char *message, size_t size, + char separator, + int argc, const char **argv) +{ + const char *from; + char *to; + size_t len; + int arg, available; + + if (!message || size <= 0 || !separator) + return; + if (argc <= 0 || !argv || !argv[0]) + return; + + arg = 0; + len = strnlen(message, size); + available = size - len - 1; + to = message + len; + while (arg < argc && available > 0) { + from = argv[arg++]; + if (!from) + from = "(null)"; + len = strnlen(from, available); + strncpy(to, from, len); + to += len; + available -= len; + if (available-- > 0) + *to++ = separator; + } + *to = 0; +} + +__visible_for_testing void dtm_prepare_message(char *message, size_t size, + const char *where, const char *sep, + struct dtm_context *context) +{ + int total_argc, max_argc, arg; + + /* load all arguments to update attributes and fill arg values */ + total_argc = context->callee_argc; + max_argc = min_t(int, total_argc, ARRAY_SIZE(context->callee_argv)); + if (context->callee_copied_argc != max_argc) + for (arg = 0; arg < max_argc; arg++) + if (!context->callee_argv[arg]) + dtm_get_callee_arg(context, arg); + + snprintf(message, size, "%s%s%d:%d:%ld:%ld:%s:%s:%s:", where, sep, + context->callee_copied_argc, total_argc, + context->callee_copied_args_len, context->callee_total_args_len, + dtm_get_caller_path(context), dtm_get_callee_path(context), + dtm_get_stdin_mode(context)); + dtm_append_argv(message, size, ':', max_argc, context->callee_argv); +} + +#ifdef DEFEX_DEBUG_ENABLE +void dtm_debug_call(const char *where, struct dtm_context *context) +{ + char message[DTM_MAX_LOG_SIZE]; + + dtm_prepare_message(message, sizeof(message), where, ": ", context); + DTM_LOG_DEBUG("%s", message); +} +#endif + +noinline void dtm_report_violation(const char *feature_code, + struct dtm_context *context) +{ + char message[DTM_MAX_DETAIL_SIZE + 1]; + int ret; + + dtm_prepare_message(message, sizeof(message), "", "", context); + DTM_DEBUG(VIOLATIONS, "[%s]%s", feature_code, message); + if (should_send_dsms_event()) { + ret = dsms_send_message(feature_code, message, 0); + if (unlikely(ret != DSMS_SUCCESS)) + DTM_LOG_ERROR("Error %d while sending DSMS report", ret); + } +} diff --git a/security/samsung/defex_lsm/feature_trusted_map/dtm_utils.c b/security/samsung/defex_lsm/feature_trusted_map/dtm_utils.c new file mode 100755 index 000000000000..799321a41b52 --- /dev/null +++ b/security/samsung/defex_lsm/feature_trusted_map/dtm_utils.c @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2020-2022 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) +#include +#endif + +#include "include/dtm.h" +#include "include/dtm_log.h" +#include "include/dtm_utils.h" + +const char * const DTM_UNKNOWN = ""; + +static inline int dtm_get_file_attr(struct path *path, struct kstat *stat) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) + return vfs_getattr(path, stat, STATX_BASIC_STATS, 0); +#else + return vfs_getattr(path, stat); +#endif +} + +/* + * Gets mode bit value for a file status. + */ +int dtm_get_stat_mode_bit(struct kstat *stat) +{ + int mode, mode_bit; + + if (!stat) + return DTM_FD_MODE_ERROR; + + mode = (stat->mode) & S_IFMT; + switch (mode) { + case S_IFBLK: + mode_bit = DTM_FD_MODE_BLK; + break; + case S_IFCHR: + mode_bit = DTM_FD_MODE_CHR; + break; + case S_IFDIR: + mode_bit = DTM_FD_MODE_DIR; + break; + case S_IFIFO: + mode_bit = DTM_FD_MODE_FIFO; + break; + case S_IFLNK: + mode_bit = DTM_FD_MODE_LNK; + break; + case S_IFREG: + mode_bit = DTM_FD_MODE_REG; + break; + case S_IFSOCK: + mode_bit = DTM_FD_MODE_SOCK; + break; + default: + mode_bit = DTM_FD_MODE_UNKNOWN; + DTM_LOG_ERROR("Unknown stat mode %d", mode); + } + return mode_bit; +} + +/* + * Gets mode bit value for a file descriptor. + */ +int dtm_get_fd_mode_bit(int fd) +{ + struct kstat stat; + struct fd sf; + int error; + + if (fd < 0) + return DTM_FD_MODE_ERROR; + + sf = fdget_raw(fd); + if (unlikely(!sf.file)) + return DTM_FD_MODE_CLOSED; + + error = dtm_get_file_attr(&sf.file->f_path, &stat); + fdput(sf); + if (unlikely(error < 0)) + return DTM_FD_MODE_ERROR; + + return dtm_get_stat_mode_bit(&stat); +} + +/* + * Gets printable name for a fd mode bit value. + */ +const char *dtm_get_fd_mode_bit_name(int mode_bit) +{ + switch (mode_bit) { + case DTM_FD_MODE_NONE: + return "NONE"; + case DTM_FD_MODE_BLK: + return "BLK"; + case DTM_FD_MODE_CHR: + return "CHR"; + case DTM_FD_MODE_DIR: + return "DIR"; + case DTM_FD_MODE_FIFO: + return "FIFO"; + case DTM_FD_MODE_LNK: + return "LNK"; + case DTM_FD_MODE_REG: + return "REG"; + case DTM_FD_MODE_SOCK: + return "SOCK"; + case DTM_FD_MODE_CLOSED: + return "CLOSED"; + case DTM_FD_MODE_ERROR: + return "ERROR"; + case DTM_FD_MODE_UNKNOWN: + return "UNKNOWN"; + } + DTM_LOG_ERROR("Unexpected mode bit %d", mode_bit); + return "INVALID"; +} diff --git a/security/samsung/defex_lsm/feature_trusted_map/include/dtm.h b/security/samsung/defex_lsm/feature_trusted_map/include/dtm.h new file mode 100755 index 000000000000..c4412b5c0b41 --- /dev/null +++ b/security/samsung/defex_lsm/feature_trusted_map/include/dtm.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2020-2022 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#ifndef _INCLUDE_DTM_H +#define _INCLUDE_DTM_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dtm_utils.h" +#include "include/defex_internal.h" + +// DTM Kernel Interface + +#define DTM_CALLER_VIOLATION "DTM1" +#define DTM_PROGRAM_VIOLATION "DTM2" +#define DTM_STDIN_VIOLATION "DTM3" +#define DTM_ARGUMENTS_VIOLATION "DTM4" + +enum dtm_result_code { + DTM_ALLOW = DEFEX_ALLOW, + DTM_DENY = -DEFEX_DENY, +}; + +enum dtm_constants { + DTM_MAX_ARGC = 5, // max args checked (incl. program name) + DTM_MAX_ARG_STRLEN = 100, // max arg len checked (including '\0') +}; + +struct dtm_context { + struct defex_context *defex_context; + void *callee_argv_ref; + const char *callee_argv[DTM_MAX_ARGC]; + int callee_argc; + int callee_copied_argc; + long callee_copied_args_len; + long callee_total_args_len; + const char *program_name; + const char *stdin_mode; + int stdin_mode_bit; +}; + +/* Verifies if a dtm_context was properly initialized */ +static inline bool is_dtm_context_valid(struct dtm_context *context) +{ + return !ZERO_OR_NULL_PTR(context) + && !ZERO_OR_NULL_PTR(context->defex_context) + && !ZERO_OR_NULL_PTR(context->defex_context->task) + && !ZERO_OR_NULL_PTR(context->callee_argv_ref); +} + +/* Gets caller path for current call */ +static inline const char *dtm_get_caller_path(struct dtm_context *context) +{ + return get_dc_process_name(context->defex_context); +} + +/* Gets callee path for current call */ +static inline const char *dtm_get_callee_path(struct dtm_context *context) +{ + return get_dc_target_name(context->defex_context); +} + +/* Gets program name for current call */ +const char *dtm_get_program_name(struct dtm_context *context); +/* Gets stdin mode bit for current call */ +int dtm_get_stdin_mode_bit(struct dtm_context *context); +/* Gets stdin mode for current call */ +const char *dtm_get_stdin_mode(struct dtm_context *context); +/* Gets call argument value, copying from user if needed */ +const char *dtm_get_callee_arg(struct dtm_context *context, int arg_index); + +#endif /* _INCLUDE_DTM_H */ diff --git a/security/samsung/defex_lsm/feature_trusted_map/include/dtm_engine.h b/security/samsung/defex_lsm/feature_trusted_map/include/dtm_engine.h new file mode 100755 index 000000000000..af9f858ccf53 --- /dev/null +++ b/security/samsung/defex_lsm/feature_trusted_map/include/dtm_engine.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2020-2022 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#ifndef _INCLUDE_DTM_ENGINE_H +#define _INCLUDE_DTM_ENGINE_H + +#include "dtm.h" + +/* Enforces DTM policy for an exec system call */ +extern int dtm_enforce(struct dtm_context *context); +#ifdef DEFEX_KUNIT_ENABLED +/* Replaces DTM policy (use NULL to return to normal) */ +extern void dtm_engine_override_data(const unsigned char *); +#endif + +#endif /* _INCLUDE_DTM_ENGINE_H */ diff --git a/security/samsung/defex_lsm/feature_trusted_map/include/dtm_log.h b/security/samsung/defex_lsm/feature_trusted_map/include/dtm_log.h new file mode 100755 index 000000000000..17f9d95ba115 --- /dev/null +++ b/security/samsung/defex_lsm/feature_trusted_map/include/dtm_log.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020-2022 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#ifndef _INCLUDE_DTM_LOG_H +#define _INCLUDE_DTM_LOG_H + +#define DTM_TAG "[DTM] " +#define DTM_LOG_INFO(format, ...) pr_info(DTM_TAG format, ##__VA_ARGS__) +#define DTM_LOG_ERROR(format, ...) pr_err(DTM_TAG format, ##__VA_ARGS__) +#define DTM_LOG_DEBUG(format, ...) pr_debug(DTM_TAG format, ##__VA_ARGS__) + +struct dtm_context; + +extern noinline void dtm_report_violation(const char *feature_code, + struct dtm_context *context); + +#ifdef DEFEX_DEBUG_ENABLE + +#define DTM_DEBUG(mode, format, ...) \ + do { \ + if (defex_tm_mode_enabled(DEFEX_TM_DEBUG_##mode)) \ + DTM_LOG_DEBUG(format, ##__VA_ARGS__); \ + } while (0) + +#define DTM_DEBUG_CALL(message, context) \ + do { \ + if (defex_tm_mode_enabled(DEFEX_TM_DEBUG_CALLS)) \ + dtm_debug_call("dtm_enforce", context); \ + } while (0) + +extern void dtm_debug_call(const char *where, struct dtm_context *context); + +#else +#define DTM_DEBUG(mode, format, ...) (0) +#define DTM_DEBUG_CALL(message, context) (0) +#endif /* DEFEX_DEBUG_ENABLE */ + +#endif /* _INCLUDE_DTM_LOG_H */ diff --git a/security/samsung/defex_lsm/feature_trusted_map/include/dtm_utils.h b/security/samsung/defex_lsm/feature_trusted_map/include/dtm_utils.h new file mode 100755 index 000000000000..15022cbeea8b --- /dev/null +++ b/security/samsung/defex_lsm/feature_trusted_map/include/dtm_utils.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020-2022 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#ifndef _INCLUDE_DTM_UTILS_H +#define _INCLUDE_DTM_UTILS_H + +#include +#include +#include +#include +#include + +#include "../../include/defex_internal.h" + +enum dtm_stdin_descriptor_allow { + DTM_FD_MODE_NONE = 0, + DTM_FD_MODE_BLK = 1, + DTM_FD_MODE_CHR = 2, + DTM_FD_MODE_DIR = 4, + DTM_FD_MODE_FIFO = 8, + DTM_FD_MODE_LNK = 16, + DTM_FD_MODE_REG = 32, + DTM_FD_MODE_SOCK = 64, + DTM_FD_MODE_CLOSED = 128, + DTM_FD_MODE_ERROR = 256, + DTM_FD_MODE_UNKNOWN = 512, +}; + +extern const char * const DTM_UNKNOWN; + +/* Gets mode bit value for a file status */ +int dtm_get_stat_mode_bit(struct kstat *stat); + +/* Gets mode bit value for a file descriptor */ +extern int dtm_get_fd_mode_bit(int fd); + +/* Gets printable name for a fd mode bit value */ +const char *dtm_get_fd_mode_bit_name(int mode_bit); + +#endif /* _INCLUDE_DTM_UTILS_H */ diff --git a/security/samsung/defex_lsm/feature_trusted_map/kunit_test/Makefile b/security/samsung/defex_lsm/feature_trusted_map/kunit_test/Makefile deleted file mode 100755 index e84c292353f9..000000000000 --- a/security/samsung/defex_lsm/feature_trusted_map/kunit_test/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -EXTRA_CFLAGS += -Isecurity/samsung/defex_lsm/include -I$(srctree)/$(src)/feature_trusted_map/include -defex-y += dtm_engine_test.o \ No newline at end of file diff --git a/security/samsung/defex_lsm/feature_trusted_map/ptree.c b/security/samsung/defex_lsm/feature_trusted_map/ptree.c new file mode 100755 index 000000000000..6284696ffc9a --- /dev/null +++ b/security/samsung/defex_lsm/feature_trusted_map/ptree.c @@ -0,0 +1,476 @@ +/* + * Copyright (c) 2021-2022 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include +#include +#include "include/ptree.h" + +/* Functions for "using" (i.e., loading and searching) p-tree in portable + * variant. + */ + +/* Big-endian uchar -> int */ +static unsigned int charp2UInt(const unsigned char *p, int size) +{ + unsigned int i = *p; + + if (size > 1) { + i = (i << 8) | p[1]; + if (size > 2) { + i = (i << 8) | p[2]; + if (size > 3) + i = (i << 8) | p[3]; + } + } + return i; +} + +/* Checks magic number, loads important constants from prologue + */ +static int pptree_set_header(struct PPTree *tree) +{ + const unsigned char *pp = tree->data; + + /* Only PPTREE_MAGIC_FIXEDSIZE bytes are mandatory, remaining + * two can encode version information for compatibility + */ + if (strncmp((char *)pp, PPTREE_MAGIC, PPTREE_MAGIC_FIXEDSIZE)) { + pr_warn("Ptree: Bad magic number\n"); + return -1; + } + pp += PPTREE_MAGIC_FIXEDSIZE + 2; + tree->sTable.fullSize = charp2UInt(pp, UPPER_COUNT_SIZE); + pp += UPPER_COUNT_SIZE; + tree->sTable.size = charp2UInt(pp, UPPER_COUNT_SIZE); + pp += UPPER_COUNT_SIZE; + tree->sTable.indexSize = charp2UInt(pp++, 1); + tree->sTable.table = pp; + pp += tree->sTable.fullSize; + + tree->bTable.fullSize = charp2UInt(pp, UPPER_COUNT_SIZE); + pp += UPPER_COUNT_SIZE; + tree->bTable.size = charp2UInt(pp, UPPER_COUNT_SIZE); + pp += UPPER_COUNT_SIZE; + tree->bTable.indexSize = charp2UInt(pp++, 1); + tree->bTable.table = pp; + pp += tree->bTable.fullSize; + + tree->nodes.childCountSize = charp2UInt(pp++, 1); + tree->nodes.offsetSize = charp2UInt(pp++, 1); + tree->nodes.root = pp; + return 0; +} + +int pptree_set_data(struct PPTree *tree, const unsigned char *data) +{ + tree->data = data; + tree->allocated = 0; + return pptree_set_header(tree); +} + +void pptree_free(struct PPTree *tree) +{ + if (tree->allocated && tree->data) { + kfree((void *)tree->data); + tree->data = 0; + tree->allocated = 0; + } +} + +/* Gets a string (either a component of a search key or data associated + * with an item) given index + */ +static const unsigned char *pptree_string(const struct PPTree *tree, int i) +{ + const unsigned char *sTable = tree->sTable.table; + int index, bcs = tree->sTable.indexSize; + + if (i < 0 || i >= tree->sTable.size) { + pr_warn("Ptree: bad string index: %d (max %d)\n", i, + tree->sTable.size); + return 0; + } + index = charp2UInt(sTable + i * bcs, bcs); + return sTable + (1 + tree->sTable.size) * bcs + index; +} + +/* Gets a bytearray given index */ +static const unsigned char *pptree_bytearray(const struct PPTree *tree, int i, + int *length) +{ + const unsigned char *bTable = tree->bTable.table; + int index, indexNext, bcs = tree->bTable.indexSize; + + if (i < 0 || i >= tree->bTable.size) { + pr_warn("Ptree: Bad bytearray index: %d (max %d)\n", i, + tree->bTable.size); + if (length) + *length = 0; + return ""; + } + index = charp2UInt(bTable + i * bcs, bcs); + if (length) { + indexNext = charp2UInt(bTable + (i + 1) * bcs, bcs); + *length = indexNext - index; + } + return bTable + (1 + tree->bTable.size) * bcs + index; +} + +/* Given a pointer to the start of a tree node, load important values + * and advance pointer to the start of item index. + */ +static void load_node_prologue(const struct PPTree *tree, + const unsigned char **p, + unsigned int *itemSize, + unsigned int *dataTypes, + unsigned int *childCount) +{ + /* is the |-ing of data masks of all items in this node, + * thus all possible data types associated to items. + * By extension, it determines , which is the size in bytes + * of all items in this node. + */ + int dtTypes = charp2UInt((*p)++, 1), + itSize = tree->sTable.indexSize + tree->nodes.offsetSize; + if (dtTypes && itSize) { + ++itSize; + if (dtTypes & PTREE_DATA_BYTES) + itSize += tree->bTable.indexSize; + if (dtTypes & PTREE_DATA_STRING) + itSize += tree->sTable.indexSize; + if (dtTypes & PTREE_DATA_INT1) + itSize++; + if (dtTypes & PTREE_DATA_INT2) + itSize += 2; + if (dtTypes & PTREE_DATA_INT4) + itSize += 4; + if (dtTypes & PTREE_DATA_PATH) + itSize += tree->nodes.offsetSize; + } + if (childCount) + *childCount = charp2UInt(*p, tree->nodes.childCountSize); + *p += tree->nodes.childCountSize; + if (dataTypes) + *dataTypes = dtTypes; + if (itemSize) + *itemSize = itSize; +} + +/* Calculate offset from root node. It depends on a previous search, if any */ +static int pptree_get_offset(const struct PPTree *tree, + struct PPTreeContext *ctx) +{ + return ctx ? + /* Continue from the result of a previous search? */ + (ctx->types & PTREE_FIND_CONTINUE) && ctx->last ? + ctx->last - tree->nodes.root : + /* Continue from subpath of a previous search, if any? */ + ctx->types & PTREE_DATA_PATH ? + ctx->value.childPath : + 0 : + 0; /* No context, use root itself */ +} + +/* Load item-related data.

should be pointing to data type byte */ +static const unsigned char *pptree_get_itemData(const struct PPTree *tree, + const unsigned char *p, + int dataTypes, + struct PPTreeContext *ctx) +{ + memset(&ctx->value, 0, sizeof(ctx->value)); + ctx->types = (ctx->types & ~PTREE_DATA_MASK) | charp2UInt(p++, 1); + if (dataTypes & PTREE_DATA_BYTES) { + if (ctx->types & PTREE_DATA_BYTES) + ctx->value.bytearray.bytes = + pptree_bytearray(tree, + charp2UInt(p, + tree->bTable.indexSize), + &ctx->value.bytearray.length); + p += tree->bTable.indexSize; + } + if (dataTypes & PTREE_DATA_STRING) { + if (ctx->types & PTREE_DATA_STRING) + ctx->value.string = + (const char *) + pptree_string(tree, + charp2UInt(p, + tree->sTable.indexSize)); + p += tree->sTable.indexSize; + } + if (dataTypes & PTREE_DATA_BITA) + ctx->value.bits = (ctx->types & PTREE_DATA_BITA) && + (ctx->types & PTREE_DATA_BITA_MASK) + ? 1 : 0; + if (dataTypes & PTREE_DATA_INT1) { + if (ctx->types & PTREE_DATA_INT1) + ctx->value.int1 = charp2UInt(p, 1); + ++p; + } + if (dataTypes & PTREE_DATA_INT2) { + if (ctx->types & PTREE_DATA_INT2) + ctx->value.int2 = charp2UInt(p, 2); + p += 2; + } + if (dataTypes & PTREE_DATA_INT4) { + if (ctx->types & PTREE_DATA_INT4) + ctx->value.int4 = charp2UInt(p, 4); + p += 4; + } + if (dataTypes & PTREE_DATA_PATH) { + if (ctx->types & PTREE_DATA_PATH) + ctx->value.childPath = + charp2UInt(p, tree->nodes.offsetSize); + p += tree->nodes.offsetSize; + } + return p; +} + +int pptree_find(const struct PPTree *tree, const char **path, int pathLen, + struct PPTreeContext *ctx) +{ + int depth; + unsigned int dataTypes = 0; + const unsigned char *pFound = 0, + *p = tree->nodes.root + pptree_get_offset(tree, ctx); + + if (ctx->types & PTREE_FIND_PEEKED) { + /* If a previous call used PTREE_FIND_PEEK ignore , + * only advance context's offset + */ + if (ctx->lastPeeked) { + ctx->last = ctx->lastPeeked; + ctx->lastPeeked = 0; + return 1; + } + ctx->types &= ~(PTREE_FIND_PEEK | PTREE_FIND_PEEKED); + } + if (pathLen < 1) + return 0; + for (depth = 0; depth < pathLen; ++depth) { + const char *s; + int rCmp, sIndex, i; + unsigned int itemSize, childCount; + + load_node_prologue(tree, &p, &itemSize, &dataTypes, &childCount); + rCmp = -1; + if (childCount < 5) { /* linear ordered search */ + for (i = 0; i < childCount; ++i) { + sIndex = charp2UInt(p + i * itemSize, + tree->sTable.indexSize); + rCmp = strncmp(path[depth], + (const char *) + pptree_string(tree, sIndex), + PTREE_FINDPATH_MAX); + if (!rCmp) + break; + if (rCmp < 0) + return 0; + } + if (i == childCount) + return 0; + } else { /* binary search */ + int l = 0, r = childCount - 1; + + while (l <= r) { + i = l + (r - l) / 2; + sIndex = charp2UInt(p + i * itemSize, + tree->sTable.indexSize); + s = (const char *)pptree_string(tree, sIndex); + rCmp = strncmp(path[depth], s, + PTREE_FINDPATH_MAX); + if (rCmp < 0) + r = i - 1; + else + if (rCmp) + l = i + 1; + else + break; + } + if (rCmp) + return 0; + } + pFound = p + i * itemSize + tree->sTable.indexSize; + p = tree->nodes.root + charp2UInt(pFound, + tree->nodes.offsetSize); + } + if (ctx) { + if (ctx->types & PTREE_FIND_PEEK) + /* Don't advance context, just store it here */ + ctx->lastPeeked = p; + else { + ctx->last = p; + ctx->lastPeeked = 0; + } + if (dataTypes) + pptree_get_itemData(tree, + pFound + tree->nodes.offsetSize, + dataTypes, ctx); + else + /* Clear all bits for associated data */ + ctx->types &= ~PTREE_DATA_MASK; + } + return 1; +} + +int pptree_find_path(const struct PPTree *tree, const char *path, char delim, + struct PPTreeContext *ctx) +{ + int i, itemCount, findRes, flags = ctx->types; + char *ppath, *p, **pathItems; + const char *q, *pathItems1[1]; + + if (!path) + return 0; + /* Convenience: split in components, invoke pptree_find */ + if (ctx->types & PTREE_FIND_PEEKED) { + /* No path array to fill, just use last result */ + pathItems = 0; + itemCount = 0; + } else { + if (!delim) { + /* Special case, consider the whole string as + * a single component + */ + pathItems = (char **)pathItems1; + pathItems1[0] = path; + itemCount = 1; + } else { + ppath = kstrndup(path, PTREE_FINDPATH_MAX, GFP_KERNEL); + if (!ppath) + return 0; + for (itemCount = *path ? 1 : 0, q = path; *q; ++q) + if (*q == delim) + ++itemCount; + pathItems = kmalloc((itemCount ? itemCount : 1) * + sizeof(const char *), + GFP_KERNEL); + if (!pathItems) { + kfree((void *)ppath); + return 0; + } + *pathItems = ppath; + for (i = 1, p = ppath; *p; ++p) + if (*p == delim) { + *p = 0; + if (i < itemCount) + pathItems[i++] = p + 1; + } + } + } + findRes = pptree_find(tree, (const char **)pathItems, itemCount, ctx); + if (!(flags & PTREE_FIND_PEEKED) && delim) { + kfree((void *) pathItems); + kfree((void *) ppath); + } + return findRes; +} + +int pptree_child_count(const struct PPTree *tree, + struct PPTreeContext *ctx) +{ + const unsigned char *p = tree->nodes.root + + pptree_get_offset(tree, ctx); + unsigned int childCount; + + load_node_prologue(tree, &p, 0, 0, &childCount); + return childCount; +} + +int pptree_iterate_children(const struct PPTree *tree, + struct PPTreeContext *ctx, + int (*f)(const struct PPTree *tree, + const char *name, + const struct PPTreeContext *itemData, + void *data), + void *data) +{ + const unsigned char *p; + unsigned int i, childCount, itemSize, dataTypes, sIndex; + int ret; + + if (!f) + return 0; + p = tree->nodes.root + pptree_get_offset(tree, ctx); + load_node_prologue(tree, &p, &itemSize, &dataTypes, &childCount); + for (ret = i = 0; i < childCount; ++i) { + struct PPTreeContext itemData; + + sIndex = charp2UInt(p, tree->sTable.indexSize); + if (dataTypes) + pptree_get_itemData(tree, + p + tree->nodes.offsetSize + + tree->nodes.offsetSize, + dataTypes, &itemData); + else + itemData.types = 0; + ret = (*f)(tree, (const char *)pptree_string(tree, sIndex), + &itemData, data); + if (ret < 0) + return ret; + p += itemSize; + } + return ret; +} + +/* Recursively traverses all children in subpath of a node given + * by +, invoking on all paths ending on a leaf. + * Returns last result of . Stops prematurely if returns nonzero. + */ +static int pptree_iterate_subpaths(const struct PPTree *tree, + int offset, int pathDepth, + int (*f)(const struct PPTree *tree, + const char **path, + int pathLen, void *data), + const char **path, int maxDepth, + void *data) +{ + const unsigned char *p = tree->nodes.root + offset; + unsigned int i, childCount, itemSize, dataTypes; + + load_node_prologue(tree, &p, &itemSize, &dataTypes, &childCount); + for (i = 0; i < childCount; ++i) { + const unsigned char *pp = p + i * itemSize; + int sIndex, childIndex, j; + + sIndex = charp2UInt(pp, tree->sTable.indexSize); + pp += tree->sTable.indexSize; + childIndex = charp2UInt(pp, tree->nodes.offsetSize); + pp += tree->nodes.offsetSize; + path[pathDepth] = (const char *)pptree_string(tree, sIndex); + if (childIndex) { + if (pathDepth < maxDepth) { + j = pptree_iterate_subpaths(tree, childIndex, + pathDepth + 1, f, + path, maxDepth, + data); + if (j) + return j; + } + } else + if (f) { + int j = (*f)(tree, path, pathDepth + 1, data); + + if (j) + return j; + } + } + return 0; +} + +int pptree_iterate_paths(const struct PPTree *tree, + struct PPTreeContext *ctx, + int (*f)(const struct PPTree *tree, + const char **path, + int pathLen, void *data), + const char **path, int maxPathLen, + void *data) +{ + return pptree_iterate_subpaths(tree, pptree_get_offset(tree, ctx), + 0, f, path, maxPathLen, data); +} + diff --git a/security/samsung/defex_lsm/include/defex_config.h b/security/samsung/defex_lsm/include/defex_config.h index 6731b9b2c4ed..54df331bf360 100755 --- a/security/samsung/defex_lsm/include/defex_config.h +++ b/security/samsung/defex_lsm/include/defex_config.h @@ -20,12 +20,24 @@ #define GLOBAL_PED_STATUS FEATURE_CHECK_CREDS #endif +#ifdef DEFEX_PERMISSIVE_INT +#define GLOBAL_INTEGRITY_STATUS (FEATURE_INTEGRITY | FEATURE_INTEGRITY_SOFT) +#else +#define GLOBAL_INTEGRITY_STATUS FEATURE_INTEGRITY +#endif + #ifdef DEFEX_PERMISSIVE_SP #define GLOBAL_SAFEPLACE_STATUS (FEATURE_SAFEPLACE | FEATURE_SAFEPLACE_SOFT) #else #define GLOBAL_SAFEPLACE_STATUS FEATURE_SAFEPLACE #endif +#ifdef DEFEX_PERMISSIVE_TM +#define GLOBAL_TRUSTED_MAP_STATUS (FEATURE_TRUSTED_MAP | FEATURE_TRUSTED_MAP_SOFT) +#else +#define GLOBAL_TRUSTED_MAP_STATUS FEATURE_TRUSTED_MAP +#endif + #ifdef DEFEX_PERMISSIVE_IM #define GLOBAL_IMMUTABLE_STATUS (FEATURE_IMMUTABLE | FEATURE_IMMUTABLE_SOFT) #else @@ -35,9 +47,9 @@ /* Uncomment for Kernels, that require it */ #define STRICT_UID_TYPE_CHECKS 1 -#if defined(DEFEX_PED_ENABLE) || defined(DEFEX_SAFEPLACE_ENABLE) || defined(DEFEX_IMMUTABLE_ENABLE) +#if defined(DEFEX_PED_ENABLE) || defined(DEFEX_SAFEPLACE_ENABLE) || defined(DEFEX_TRUSTED_MAP_ENABLE) || defined(DEFEX_IMMUTABLE_ENABLE) #define DEFEX_FEATURE_ENABLE -#endif /* DEFEX_PED_ENABLE || DEFEX_SAFEPLACE_ENABLE || DEFEX_IMMUTABLE_ENABLE */ +#endif /* DEFEX_PED_ENABLE || DEFEX_SAFEPLACE_ENABLE || DEFEX_TRUSTED_MAP_ENABLE || DEFEX_IMMUTABLE_ENABLE */ int defex_get_features(void); diff --git a/security/samsung/defex_lsm/include/defex_debug.h b/security/samsung/defex_lsm/include/defex_debug.h index 2c89f7d85e36..45fbca1779c2 100755 --- a/security/samsung/defex_lsm/include/defex_debug.h +++ b/security/samsung/defex_lsm/include/defex_debug.h @@ -16,6 +16,7 @@ #define DBG_SET_PE_STATUS 3 #define DBG_SET_IM_STATUS 4 #define DBG_SET_SP_STATUS 5 +#define DBG_SET_INT_STATUS 6 #define MAX_DATA_LEN 300 diff --git a/security/samsung/defex_lsm/include/defex_internal.h b/security/samsung/defex_lsm/include/defex_internal.h index 9d0a5be410c3..eba544267e12 100755 --- a/security/samsung/defex_lsm/include/defex_internal.h +++ b/security/samsung/defex_lsm/include/defex_internal.h @@ -42,6 +42,10 @@ #define FEATURE_SAFEPLACE_SOFT (1 << 9) #define FEATURE_FIVE (1 << 10) /* reserved for future use */ #define FEATURE_FIVE_SOFT (1 << 11) /* reserved for future use */ +#define FEATURE_TRUSTED_MAP (1 << 12) +#define FEATURE_TRUSTED_MAP_SOFT (1 << 13) +#define FEATURE_INTEGRITY (1 << 14) +#define FEATURE_INTEGRITY_SOFT (1 << 15) #define FEATURE_CLEAR_ALL (0xFF0000) @@ -109,6 +113,12 @@ int set_task_creds(struct task_struct *p, unsigned int uid, unsigned int fsuid, void set_task_creds_tcnt(struct task_struct *p, int addition); int is_task_creds_ready(void); +/* -------------------------------------------------------------------------- */ +/* Integrity feature */ +/* -------------------------------------------------------------------------- */ + +extern unsigned char global_integrity_status; + /* -------------------------------------------------------------------------- */ /* SafePlace feature */ /* -------------------------------------------------------------------------- */ @@ -121,6 +131,28 @@ extern unsigned char global_safeplace_status; extern unsigned char global_immutable_status; +/* -------------------------------------------------------------------------- */ +/* Trusted Map feature */ +/* -------------------------------------------------------------------------- */ + +extern unsigned char global_trusted_map_status; + +enum trusted_map_status { + DEFEX_TM_ENFORCING_MODE = (1 << 0), + DEFEX_TM_PERMISSIVE_MODE = (1 << 1), + DEFEX_TM_DEBUG_VIOLATIONS = (1 << 2), + DEFEX_TM_DEBUG_CALLS = (1 << 3), + DEFEX_TM_LAST_STATUS = (1 << 4) - 1 +}; + +static inline int defex_tm_mode_enabled(int mode_flag) +{ + return global_trusted_map_status & mode_flag; +} + +struct defex_context; +int defex_trusted_map_lookup(struct defex_context *dc, int argc, void *argv); + /* -------------------------------------------------------------------------- */ /* Common Helper API */ /* -------------------------------------------------------------------------- */ @@ -184,6 +216,7 @@ int __init do_load_rules(void); int immutable_status_store(const char *status_str); int privesc_status_store(const char *status_str); int safeplace_status_store(const char *status_str); +int integrity_status_store(const char *status_str); extern bool boot_state_recovery __ro_after_init; #ifdef DEFEX_DEPENDING_ON_OEMUNLOCK diff --git a/security/samsung/defex_lsm/include/defex_rules.h b/security/samsung/defex_lsm/include/defex_rules.h index d1d2683a4696..64a8fb272c48 100755 --- a/security/samsung/defex_lsm/include/defex_rules.h +++ b/security/samsung/defex_lsm/include/defex_rules.h @@ -9,6 +9,10 @@ #ifndef __DEFEX_RULES_H #define __DEFEX_RULES_H +#ifdef DEFEX_TRUSTED_MAP_ENABLE +#include "ptree.h" +#endif + #define STATIC_RULES_MAX_STR 32 #define INTEGRITY_LENGTH 32 #define FEATURE_NAME_MAX_STR 32 @@ -28,7 +32,9 @@ enum feature_types { feature_immutable_path_write = 256, feature_immutable_src_exception = 512, feature_immutable_status = 1024, - feature_umhbin_path = 2048 + feature_umhbin_path = 2048, + feature_trusted_map_status = 4096, + feature_integrity_check = 8192 }; struct feature_match_entry { @@ -59,4 +65,9 @@ struct rule_item_struct { int check_rules_ready(void); +#ifdef DEFEX_TRUSTED_MAP_ENABLE +/* "Header" for DTM's dynamically loaded policy */ +extern struct PPTree dtm_tree; +#endif + #endif /* __DEFEX_RULES_H */ diff --git a/security/samsung/defex_lsm/include/defex_tailer.h b/security/samsung/defex_lsm/include/defex_tailer.h new file mode 100755 index 000000000000..9478491e28e8 --- /dev/null +++ b/security/samsung/defex_lsm/include/defex_tailer.h @@ -0,0 +1,57 @@ +#ifndef __INCLUDE_TAILER_H__ +#define __INCLUDE_TAILER_H__ + +/* Functions for managing a "tailer file", which is similar to a tar + * archive but, in order to support ordinary unadorned files + * - stores metainformation after each archived file + * - stores a single magic number at the very end. + */ + +/* Magic number, occurs only once at the end of tailer file. Should it + * change, be sure to update TAIL_MAGIC_LEN + */ +#define TAIL_MAGIC "#TAIL_GUARD#" +#define TAIL_MAGIC_LEN 12 +/* Maximum length of title associated with a stored file. Arbitrary, but + * should it increase, metainfo size (currently 1 byte) must change + * accordingly + */ +#define TAIL_MAX_TITLE_LENGTH 255 + +/* Each file's metainfo entry comprises (version 1,0): + * - offset where actual contents start: 4-byte big-endian + * - size of contents in bytes: 4-byte big-endian + * - title, up to TAIL_MAX_TITLE_LENGTH bytes, non 0-terminated + * - title length, 1 byte + * - major/minor version number, 1 byte each + * + * A tailer file is either an unadorned one or a linked list of content+ + * metainfo entries which goes backwards from the magic number. + */ + +/* Functions for handling tailer data as memory buffers */ + +/* If a memory buffer

with given ends with the tailer magic + * suffix, returns its offset, else returns -1 + */ +extern long defex_tailerp_has_suffix(const unsigned char *p, long size); +/* Given buffer

of given, returns address of last occurrence + * of contents of given (and if <sizep> sets *<sizep> to + * contents size), or 0 if <p> is unadorned has no such + * occurrences + */ +extern const unsigned char *defex_tailerp_find(const unsigned char *p, long size, + const char *title, long *sizep); +/* Given buffer <p> with <size> bytes, returns 0 if unadorned. Else, + * executes <task> for each entry, from last to first, passing arguments + * <title> (unterminated), title length, absolute <start> address and + * <size> in bytes, plus <data>. Terminates immediately if <task> returns + * negative. Returns last result of <task>. + */ +extern int defex_tailerp_iterate(const unsigned char *p, long size, + int (*task)(const char *title, int titleLen, + const unsigned char *start, + long size, void *data), + void *data); + +#endif diff --git a/security/samsung/defex_lsm/include/ptree.h b/security/samsung/defex_lsm/include/ptree.h new file mode 100755 index 000000000000..cfc3610e1c12 --- /dev/null +++ b/security/samsung/defex_lsm/include/ptree.h @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2021-2022 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#ifndef __PTREE_H__ + +/* A "P-tree" is a n-ary search tree whose keys are strings. A p-tree + * node may be associated with data like a string, a byte array or + * an entry point for an additional search (unrelated to the node's + * children). + * + * P-trees are represented in two variants: + * - a "build" data structure with traditional structs and pointers, used for + * building, converting, merging or exporting + * - a "portable" format packed with integer indices instead of pointers, + * stored as a byte array and used (read-only) by target applications. + * In both, all strings are stored at a dictionary and represented in nodes + * by indices, therefore child data have constant size; in addition, child + * lists are sorted, allowing efficient search. + */ + +/* Masks for data types. Should any be created, PTREE_DATA_MASK must + * be updated accordingly + */ +#define PTREE_DATA_BYTES 1 /* byte array */ +#define PTREE_DATA_STRING 2 /* zero-terminated string */ +#define PTREE_DATA_PATH 4 /* subpath */ +#define PTREE_DATA_INT1 8 /* byte */ +#define PTREE_DATA_INT2 16 /* 2-byte short */ +#define PTREE_DATA_INT4 32 /* 4-byte int */ +#define PTREE_DATA_BITA 64 /* bit */ +/* Bit A is stored directly in the bit below */ +#define PTREE_DATA_BITA_MASK 128 + +#define PTREE_DATA_MASK 255 /* ORs all PTREE_DATA masks */ + +/* Modifiers for search behavior */ +#define PTREE_FIND_CONTINUE 256 /* pptree_find should continue from + * previous result, if any + */ +#define PTREE_FIND_PEEK 512 /* a successful search does not advance + * the context, therefore the next search + * will start from the same point + */ +#define PTREE_FIND_PEEKED 1024 /* go to where a previous search would have + * gone had it not used PTREE_FIND_PEEKED + */ + +/* *************************************************************************** + * Declarations needed for _using_ exported P-trees + * ***************************************************************************/ + +/* Header for portable P-tree. This is not the binary format, rather after + * loading it caches the tree's details. + */ +struct PPTree { + const unsigned char *data; + struct { + int fullSize; + int size; + char indexSize; + const unsigned char *table; + } sTable; + struct { + int fullSize; + int size; + char indexSize; + const unsigned char *table; + } bTable; + struct { + char offsetSize; + char childCountSize; + const unsigned char *root; + } nodes; + char allocated; +}; + +/* Magic number (fixed portion, plus two version bytes) */ +#define PPTREE_MAGIC "PPTree-\1\0" +#define PPTREE_MAGIC_FIXEDSIZE 7 + +/* Sets a byte array as a p-tree's data. Returns 0 if successful. */ +extern int pptree_set_data(struct PPTree *tree, const unsigned char *data); +/* Releases pptree data, if needed */ +extern void pptree_free(struct PPTree *tree); + +/* Context data for portable p-tree operations, especially searching. + * Used for both input (key data) and output (result's place and data) + * Search starts from root, or, + * if .types is PPTREE_DATA_PATH and there's a subpath, from .value.childPath + * if .types is PPTREE_FIND_CONTINUE, from latest sucessful search + * If .types contains PTREE_DATA_PEEK, context does not advance even if + * search is successful. It will advance (and no search will be done) if next + * search include PTREE_DATA_PEEKED. + */ +struct PPTreeContext { + int types; + struct { + struct { + const unsigned char *bytes; + int length; + } bytearray; + const char *string; + int childPath; + int int1; + int int2; + int int4; + unsigned char bits; + } value; + const unsigned char *last, *lastPeeked; + unsigned int childCount; +}; +/* Search for given path. Return 0 if not found, 1 otherwise + * (and fills in *ctx). + * See PPTreeContext for where the search starts. + */ +extern int pptree_find(const struct PPTree *tree, + const char **path, int pathLen, + struct PPTreeContext *ctx); +/* Maximum key length, mostly an arbitrary limit against DoS */ +#define PTREE_FINDPATH_MAX 8000 +/* Search for a given path. + * Similar to pptree_find, but splits <path> at every occurrence of <delim> + * (unless delim is 0). In kernelspace, returns 0 if <path> length exceeds + * PTREE_FINDPATH_MAX. + */ +extern int pptree_find_path(const struct PPTree *tree, const char *path, + char delim, struct PPTreeContext *ctx); +/* Returns number of children. + * See PPTreeContext for which is the parent node. + */ +extern int pptree_child_count(const struct PPTree *tree, + struct PPTreeContext *ctx); +/* Iterates on immediate children. + * See PPTreeContext for iteration root. + * Executes <f> for all children until <f> returns nonzero. Returns + * last return of <f>. + */ +extern int pptree_iterate_children(const struct PPTree *tree, + struct PPTreeContext *ctx, + int (*f)(const struct PPTree *tree, + const char *name, + const struct PPTreeContext *itemData, + void *data), + void *data); + +/* Iterate on subpaths. + * See PPTreeContext for iteration root. + * Executes <f> for all subpaths ending on a leaf, stopping if <f> + * returns nonzero. + * Returns last result of <f> + */ +extern int pptree_iterate_paths(const struct PPTree *tree, + struct PPTreeContext *ctx, + int (*f)(const struct PPTree *tree, + const char **path, + int pathLen, void *data), + const char **path, int maxDepth, + void *data); +/* Dumps to stdout in human-readable format */ +extern void pptree_dump(const struct PPTree *tree); + +/* Maximum number of bytes for counters (practical reasonable limit) */ +#define UPPER_COUNT_SIZE 4 + +#define __PTREE_H__ +#endif diff --git a/security/samsung/defex_lsm/pack_rules b/security/samsung/defex_lsm/pack_rules new file mode 100755 index 0000000000000000000000000000000000000000..bb97e612a4ba93b2e591018feccfc69b867ceeb0 GIT binary patch literal 19248 zcmbtc4SZD9mA?}bgaDbKV6C?66HE&hCLw%-+6-jyu}u_#R9mIvWM)D}lbLir6kOAW zCRoM+OI>xl+wC@M?XJ7qUzcqyMQW1(DM{68^vAEw?phly?Y^mWHzLc%R?Ys;x%a+# zGi0>8y)bj$J@<UwbMHO(W8Tf@eGQvRTrQzgiMU=+ZsaP1QFZ(+#P~+_08l5^h*|jl zu((1@N4}JCvb;_h{GefLiNtF-LuSP^K;nBsl|NBpaEXQ=;+zl~Y6}SxUoIKyQNriu z%B+T>Qs#-T44)BIuIs1a7DLi$=;Wh18nv?A*eVG%>{W(oSjac9T=ESBC7*_45-o0j zQ9UR-$sMGxM(L|j`ZVlP`ZU!3-1@6zi2U+?c8<-F`ji;4Me#kY@K4V%m_WnlB)QN~ z`~GI|k)8k7MEvv_RP8>f+Fe6K3Di*Qt8R-luUb*v7FyaCiKccf-L+=b(p4)wiI}IB z<&pcSPB+}x#1g1~DHWVA_C-7wPf>UYaK;q)1x4`J7s1~O{8aM&Mev~__`8bWJBr}% zE`q<W2)?HX{(&O+FBQQ*S_J>KBKXIP;J;M_|J@?^qebw?i{PIvf`6$9{$GpWUoC>q z7Qw$!1W&!y#s5n1bm6~gQ{afoh0g?Js_-FFmq%ujtP*r=!ae-uM=?yNi3;lINCYUR z61*IryyW*|lm-2XWFVgOw+A9o;rH)sk3|*6FZ`RgH~K^2cz9<dkqpPTH*Rc;MZ?<z z&23>>Hf2dL(AE|Uitw&TQnUoyVu`S53CCJQ%g%5zAzES`;izcoh)1GH;5t%-i-$pT zPdt(gi}rAPu)Tvp$8G}cvAY?Y2q%T&iif3&L{uRX$#}3eE&$pf93V<E7(xg^g~y|y zN>e0RC2nZgykVoi)>G?QX+JMpK|VUP&0tqi%u}x9{1FG<8E>qhq`wGM&hbC)!0R?6 zK@$$Vn-DsM41OXxG=J$d!-1z*rBkH??~KovIq;WiVnD-z|9}I($bonElNtwpmV<tc z13%w^uXErl9C*`#zrumv;=s>!;BR%{%N_VT9C$q!QgN#Tj{#w)4hQ}+8!N;v2Y#Ld z-{ruoDUwU~Iq)BJ&>wW*sm*lyiUU7eBLQjrI#WwHkW9tH{zRZ9+|d>YhW#CZWNVJX zz@w(=2#5UPUBPfiG7^jCNCf#o(?r_aQ%M@1EXU7djYzwS)5u{*MCj-j%1Ok7POUIs z)1=y4n<LQzgGmky(li+4;hh-QyZyn|aFAv-l?)-sU%^;3ku*}#L}X_)95RBffw&P0 zw}f{=Z165rIG$<?CvMweTxa}QxhP*4j)o#FM)fsDy>FB6R{vISWBulBpYZ!`^loVI z8P`;omy39qB1Xs{&UHprqFhub+dHZWj}Yf5Sb{=Xp4g4>)?O_ZMp~lKKBaI-zOgDH zW|F{#Ac81O*VN$K=J#&h>iv{|+vZREX3ne%fhN+D6IJiq&~$^cQpie(>Oe<$SGDL| zB5v_+y>au6H>@-2spf{PIoqEwk_e4PBw>WxJCeJvDi>Q}Lv=?y7D@$^)uJk~WC5A9 zq+BS6uq~T5H~2)&uBw{aT}7*HEZVvlT&$6uY(Q!-oJd5XJB?H_(uPL!ls9ej-r!qT z4o6+Pv9bPo<Jv7=_<Y;-<r`z|?SW`0v98=OmUb9RjV)*|WphiUEo>xXMzR$E_Ipqm z540!N8P{&RscGv*pPvk5VH-c;t5><(ws<+WVe^fQ*+G)yki0dF%7&e?7s)n8zriGf zri&&G(wSIXRMS>pebYu;)wQJG->`Yx_UqAK#L~EsJ<8kEupOO9EbS1T>&tWPvM~@f zqOqjGvrZt1TA^m7u?^Y{%v$Yend*2rh>jQET`j8bMn8?ktHnJ@vBW@0EQZDs)v}*q zI3c&7lltEjN`jc(l!|Eh9xWYX#dXEB^}~P^$L1kuod&E2oQH8+iXglM@HAip;2?s2 z8|4w?_Y*|W`W9e4g70%w4tNG|I~E7CF{VQw20!5TE5Q%ga~1djS1bTO;KP95qWnVe zQ~o312ORt;__6pty$Jk($)(^2oaX^Q;5k%#KVW?=_yL~;JV)iQos#R`t-`gd(sjk` zi)I{jT~tYUTCXg^B=<2QP-$v<DM!=896J$i1wJE?^D<$*6_xjwY@9Q_<Y&+%b!-Rv zAOsgHPojJa{CNrdWb;p}aFGC#|1g!q&u8<>e`}XNiSimW)-8GETkY~wDDObKd>+u2 zUvjT)-#MU1P<|k<e4kxT?Oun;x;#&QnJs?>@HJ@X*Ye7LZkKN-JlcH$IZpd$+J{SY z{gNoJM1OcJPyg3!{STwO7v-PMD{r#PpG5f>%D<Xd{-|Ak3gvegLfnr2kkfz5G_C&} z$zLeMV!&Ma)wccfVE3V`g_xgLUTK%Fpz<oTajBC(Q>x`}N4as05MM^IEx%;HZC?`Q zy(oVvPySDA`46M~jwM3)0B!zhb?m=-pq>Q&AjUzM<Zq~`{8Gt=ipw6H=BqFcly0b4 zw7<-(sJVZ-S+S=3qQ;84c*PoTMUA&&(S`~GbfDi*F@wj++mLeva!5^KTK3z`=@&m^ zre8C=Pmgce-f*Dofj<$#JTT`H2G>1}_Me=8co{~W`$`z~=85O>Qqz%<pdrlb_&fcp z<OhzB26OK~a?Xx^LQak`-;NV44EqSzWbXM-#b6$Lcbb_VH;-8#H(e*q7vD|Jw<XNV zNf4U9>$(qafP&Nqn#}aCtj|qOPM$2g2pHFn6UsjKm35-U<G!+ot4d@$UQgRLQ{L=8 zW0>jAiFE3m+1)uI+<R#yG32B1B9@)clvZ7~@+y(`oi>Aw=gd9F5Tb+`oX1$x^-Nkm zfovYgx(8fo`DA8hR}HMVN@RSe(?h1~Ei>I{nVCkbWyo6s0sMrXpit;j8Q(d|?DI}1 z07YbmnSSA@0cdT&$m;GqC)_=>o;EW+%PeC{GN}nO*mTZJ4_O}2a7p)|K@O;cYq@?k zsNcAmPFd-u)8>$G1QG=5I*z*1suVmUX4*HA{W@nltxW2)_3FEmlR%E3aJ;2^4M@@U zl2p~qTs#a*$6L~_>}R;Blq*a)_xI<T!Dmd@FeHpZ!e~qPt`gXe;R_Kq-KhKfH<#oH zvoE0m*_b>Hqb+G~iMA1N!t5TbDO$gD;~1(q3Pq}lJr%4}*Fsfzlq>wBe0wgm+x>mB zwEI<8_ggR?a}?DdMiZ`taE~1CIy*`KUvs$+KeN7Z%)QsEsScad*EgPa@2z1(CmJ8F zkZl%3Go(*i55l9})Zy}M!r;<sO45y|w7W8mr_%5!HPmQ#=P7XAPTm^wO@N*llv{G0 z-F>BQ|2k^_bm|PKX~x%%p&cX`$K8E1y5FjH_pljCVD=xVb9P_LO$udE&<@F-O%m`( zqk>XDb;CY!&?T&&pl_P!|J3gtyoepb?0;yE0f-nXtnY!YAJ$K%eFN4JV(S05S+cZ` zjIu&+Q%6vOR3|jcU=hUo#>`CTSRYmb!rIRY;n(iYQ5Z>EJ}R_mkfeQsS=IFDg6I{C zhk@$u9MlfiHSL#N=;^7kOw(Yd@r?EOJKXt)A$J($H|JAW-z4+WJ}M@)OS#xL%pK#$ zu9h_VN9P&z7}|=%!K$Ey3g~1<@D~+8$VjGf5RYSK@I~3WV^XT_wqv<^Yqqg28jj~_ zfJzw?fYkhTh>LctbBur8{^=&GpbN+WX?KCWY;msDX|Fltdz)>37vFzKn@n8Bt#m<~ zj068(ZQ|7R5bNs9HHl@-&H0>~qzn|<5R*y&E^Iu*qg08ZzLNcfD*t2Lyb#?~xgg_v zTRGV|pQ!m`935}GZviw~=dntLN(&8Xp%-ADq+Wo4tvWD5L8m22pOvK4=3^k8CrQUn zDh>+DG%97w=Z|%S_=6PR>-KfN>ptvzw|k<-y`L76GPBnGC2CC0ST*~6li5$|?1a}z zxXDSlnh2>sOCbR#VT+US79zx~B~JP#CqX<(0a?eJ8a>~b=_aZgCYl~P?vb_J>ul*~ z2~EzaV&_me>~WU=6P4>Ji{>es8;@mO=GtL*_ZKBIT;Dii9(xrr_}Uqkg>kXZ_Y0ba z%uEyT6r1mx>#|<pf>+#!Q@_~r?j%^{0EO|dT*uiw!?3d;C;Z~rSgHGP<0~^U*P$+% z)X2WlS{OWHx8_JTB)bSzKz0$#PI7&t=HEMV@plYFR3RCMhkOH^N7u0q$(W<ZO<pjj zJr|TBj&+Xq(a9{j*CFfM*iE3ChfLQoEEi<wdckUyaz^0n5mfPN(wFHR>AMjR)@{T> zk&7@}3A0&Z20%{ZN;T5}9(z!{>^!Noo_vb~p6;f!1kL!)K=&AC@Y0#bThcd|N&&jJ z4=evr;MGf+p}smWn(1e(Q?N1Zd%C;xY3RwT>0_YC#YoxjyE|b{PZ#l0{i&kXf_#f; z0dk>5nZ^O_7{qpS&q=kUda90OrBhFs>F3d`PgwOu?YS6~IeX9sV{o62w|Bfpyq$o2 zbU=F!vxa<QkcDviG6BR`o<Q9_qyc1<(`!bocTR#aWN?iq%)UQSvm@rtA7cv&HvoCC z9OXz@5CH!#zz_LO69P-l^-`ewz%P;S?tB^kTZbnz2>YL6!IVS40pciksKv*z)-=;U zHIK&U7%1e4x(!07`Nn9@eNRprz`@jMjK7+6=P51db!9b{E-=urWo3LX(>fX7oiA7F z>62=7N->y6wTa*xg@csSlnc2%P)QbYIy(o$PgYURW+cfwm81tDNxE)vu8O;DWS{NN z5vUC)d`7MG`!*?&Y2R}w-ay4NvRwsV*$u5X1{8hLL$a@~0_`#ku%h!b#Y^rlssYK! zzDa~{>sc&m(lpXgo=J^czegS&Pz8yeCRUAk$H0U2H&nQkh6hbP7%CW`qu3l+rt3uj zNJ))0V5QKo_@ue`EE>!ru;;jp9M4<d20tvIEW9gM*;B43D%oB#lE$tzT^cp6{K10^ z%SxWaKvPaMugRb_6;1bGWkI}D@-fcJykM3iu5-fbL`&y<^Un~O_MKZcK>MP7zBk=H zA0uK^kQcO`@3{6goptxng3?AB?uU;9`+)B(7#{Gw`GiX?CD1vU$`0!j*>A8mURc3E z-cPD{UdQvB-en+on|+t49%b#871d!}&1DcZnVpN12^rBSrrrTUn(iJs*7e5Z`D5CU zmw9*CG-~z_Bn=ovYimHuOLBR)z)PR+5t&V5oshe=F$z#>IluP+OX?gm`%=odqthYI zx=1PR`48maP7wS^_3fiGiQw1hc{~xL1r@<<S^_ubk2JwIZG!n)0#3t(^|&UWIYg@X zZ#BA(lKED*CJ5RDEm{RjXx0Q9Y=Vqd!L{&ef~#zTPAy?JsW245-o5D1(gy7ZtB3a& zRC8T1jA|<iECw5b@ezbxxs|6U3d@HGVsLXla@OQle!+ScI}CJBHQDa<uq~yM8awi* zskncsvI}A32N*E@)EO`bTQqvmU?a3;V)@Wa5bD?fta7j^h`hwgu=6XEGyjm;r@O|{ zI;v?4X+fMS<bA`8oR_?3Pkx~e7K7@&HP9@X9^whXs{BKwQjn4puXGWtVAFpC)6d%K z-$?JNhx%+OElsHJ52EIUi|Q%%D?>gD;vwI{d`5EJ2i|nl0tYgd8TqlS;&A35=~&-% z#=Z9kMTsbg!h-Rqq${bq&r>|Ln$c&-G!OuH+<Fap9&NGrk)^u^qO5MI7v+pf(`gEg z`%@?wwp>yHR$hcVZtc+u;AW~JPiAjtv2m3#LZhtgI~dy+I;#tWdcCdUB~5&HszGAC zI13d@`*gs)P0K}x8#mV@M&7>$D9)8phh$oP7+|=2uq@<KjwUnRJ!K@|tMqjg)Y$(& zjrPFE650Eil9cyo<=gX>hd_Y^4{=~2Li-RE2LA|Cs5?7NK^F0mrxJS$%=;sA&zW8- zQ%7L5CBbrns;mO|kdKbeX;D6);1P!Tas6-0Nrn&8cqc86(R$Q_Nlf<gQWRlJXZFSB z7{n?p{1QXdM?if9)a<;|2>&1(vkqhJ%JG%agM{uM!I252z8ZYVVSN*V@yXJvN;+o& z-+<+TP~v+ef5y0v<u(mqI(XP18EVFGlMUR5Sx*z|(InPqk!2&Q^6?*>Kwsz|cv4D2 zs8KSH3Sg|?OPl&nA(NxB&W%q_VyhrG7Q@y`4x|`Mox^ekbTuPR!5i3P^xO;+<;lqn z{6vRY*WoEw0kiKi?a7(YC~HAO1EXiy?Ej^jOAt`+#B7m$g=W7a+J!I!3wvKLtLUj> zE*16~N4tvzRo@eQs8&FJswjD{)7Xb*8PEdv+zxA?`VcC52o;?V97fn7%%cR%GR(+a zE^AM_efbpTC-MW0Q?4YoB`gIo<SXd22i5T$iAnqRWqG}F<UZvkMuC&m>@)j+ulxf+ zU%~$7pqV}fSA84{Gg-+yb4q%(k}fm-$S(9|d%*-fdpoFm<2NZ`I#fxl)W*+d|5@b# zDC{ybEJx~m7IQVa!4b3X1x<2P_b8b3Hi~64(OVEqNcHZ!P7#CTUzr51>2Z+sntjJ| zB!{&U^17M+VQXPE?wGO~j8)a3XEVc`X5Rz0SC7MhTOnP#JCiz+Yjvv<?#$9brP`d3 z_15dslmY8CJY*VQPB*?yM*@2Wd!cB@3AKJSC>Ra-&X97P6kg;$KoJrG#<9&hV@3w9 zrtDJ(XBvQb!agniyfuko%p;*^At8%UW^OjpO?mUk8J=3sWFJBu^X3tpAUT)!_4a&H zH$||t4`HS_yKpRj?<FI13!>SuRENn{7mD)3WP_yE=d8$yY%P(=<FF-EPhOzff%S69 zF#rk*!_4tN#D<TaRXRtkX(*T?RPJGcI27t1pa_N}7uTmLg6Bfzr%{k2u^vT8w5PAV zJZ;+i)?&mSK9V0r7sY9wz$VMV`@7#_1VyO-k+!U#`&lQg0tT$-|BL0)??$K!Hc?Re zNUmFd34vMnEqMfjP)Pn5uzFxG3q)?%x|^)WfsWOVhg_#CzTd1<-9YU+(X_nI0vv+| znh8f098qwXAbuSyb?+~iPi5{0+4(2YTtmJ=D$n?Ecs|jcEy3B`fwzE=CI)?j=CQHa zICnT_5E=JptTb@e-hCWD|C}{5E5_-EE?SdWe@W9(5NG1YUY(6|0Gs8RlV4Da&B46` zn1|gxAB8B^kns(4TP}CciabP#yT?a}9i(we8}N%<_T%qSI)dNq#<KWPttdYZ@Eb>! z4TC()2D9p19?Q&KGt9n^s9188Lcc}tK5#et7zw4ZK+DZc)2Q_Y1QIHd>#WbBShZ2M zhe@$gVtMoP<Xx-fts){hyE;UVK=iQnKj)pIDVl51i}B3X^B1oLGc{&^<!l25d;m0y zTNk!XPTHs6_OGYUJ?Fi}`^nAepLv_S_^r6=Qk-)%nFp2<+~!TcvpIdfVKM!_I>S8n z&NOQyM4Eeln>3dFyFNc}NdK-OeZD^ZU*5@iFPq&baIE|D)Ninin{nF?@9o|l-p_db zCl2O<)SD-$nvj<%TZ<WxepoJ<#O7;o#tDh%CpMnHCRf%j#4pxW^qvXrFD9!f-%4fK zF{)J6HIzpsMRtVq3n))*l^x*x<&>XB`9qw)nDQ8ABHPRPa?0~SILP@D$|LrRY!~N$ zw*Yy}6e3G=>15Se%Fm$u9i0CS<!4fU3+G>>JPomI9q0dz^0O#k!}*sePf;~%aQ+#} zV>czTm7G6LdD>EB1?P`ao;GROaRjQ#s_#&q*Un>{|3}JG=*f<7{xQm<{ZN0-{}ttF zv5`H*`G+V^3zuv!=O3Uvt#h&mIsXO9Qy<HAA>XyYz$1E+g5+pQ6A}nwbS82Xr9~GR z49QWHXi-dw97X9e2?WJkO1CQd5}6f?)WbBD9|;=#M21t+dZ?i&StSNTax^6^pBk3Z z?CAzWY8Xl%R2BK}cPD9oD8|bS0)mz(loo9@7+%5O{0bvK(Gr%DzW+f#*HF^+q=u!G ztTPx=!&2I>^5c_I-#(=eE@u4$DvuWCy!Nx?{=>iZJ&{6=!%F{21%ImGuN6G6;B>FS ztd}bI5d~K%xJkiJD%hgn-3s2X;G+uuoq~rIJgMMM75ue==M|j3!4Q-#Rj?rvy(=7F zXEZd_8_Sk?YCN^ZqUz>Uq%G8pSLo<HPJA{k-*l&UjnTY(?dp~_%W78D1jDOBt813k ztf*~Xy{2~A>e_H<+4AOac+J{1&8ycg7T#zm9*cyGMXOe>UcRz+h0z>H;6>0_)QB%% zvwUq$ZS!Iy*cQNxk9dDCfwyaI-L1)FM`B%dHC}Zj37(y?*iO7?7)!;2VNWpDUY(4^ z+VIwDBwF3pc6a+yyhC|sIGFrD*d}h+xN)7asHr&>O{R?1o|T@OrOQ*CTlTqSYdke8 z7E3Jqso0kb1*PH*`c*71QU7#_ONAa!x{&&PiI^iQ7Z@7F(4+8m1$eK*>-eCVZoz{K zqpvq)FpBJ;)Pj#o%(cf2Bk^?rAJVJii^l&Y9$a{HUXMeKHxU<HCG*9wiU%5h1P@cy z_eU(}GNI4ggdsV8uJLMlBI+dG()d$`L@4mK#y^>lpNk4oef5?|%m1jxD?iZ6h|+rC zslGMq4bFd=ze&c__Wvo%nJxBJNP0ysrn4U|Y)6_2OG*%RRC|Gp)8CVVk`G+a?)ys# zf1#hhuJDEN<PhU85rz0$A^&33tE0|feOhmq!jD`f@wB#~^hJdiiaspS;x82b&~*l5 zd`i$?18-oq83;<eA{Rddey%7NT{9(~%%eo_w9+J4m|g+Catb-G18)=(BmX;=Q(?z* zn*?@UEZlZn*Z7NpH+04UJw@<MEN2ehYm{94(<1nS8eb*x{7xzGpH+C{V-nBrasvN3 zh3{G{@ieX|Wf(7?o!<{B`T^BXwBBz3KNtO(Px`>1{rQx_(~Cir^n6F}{!ZoR7nOXW z?D;%%3GvG!^uJ;G<wEb6X}nRIQ271j2IsXsv!+e0x3UQSQsAjxbiz(a+ixg5olR5H z@@tC7SycpoeGz<p5&Y&N_$`c|BgSi_J^U^#?D8vo*VPiw?;rzzr^0VpA@TffEbxD( z@Vy_Ecz)*?_%AXZ4+ZJLBKSv&;J;P`|2XjEXML3CReHY5^mD|BihKMHEz0^7J#V3r z*ZzNA;q^Oe8vk>aQ(!!@r<MG!l?E5i$GD|5QG}ipQM~G1WiTDT6O5-h3cp49|EpXo z#MKI4S1suuQ}|lOtBeDzSM-%jB|X1Wjq*)J=o>ZtHIkm+;RgL}Md+K0;O{Jgj~Bt; zTLiy{@#u%DzI33%$wN1I;vK?+`wwA{cf;nT$-qwG3GI$1cDD=9&S=V`)=YUBe_Uo; z1Bq5ijf;1lc(^S<tm>(wEs3XCD3A;YPq@|Jf=eP{e`^SoIww3y+?Eiq0+$IrxO5W{ z9%iFQe;^(Y?3RW48PWsoks!3kz#v5@+x@tP7!CXRW)v4mA<c<|pjBKuZjcBMDg*++ zR@@SlPZEk?Jef$QT3S3o+>pdANWMDa_lw-sNWa#Rz=a!mThf8@`$IAR&bC-{pv@mj z#^MQoAhip3pV~Xx!pU&RvwGFqHIO_7kv~^YKa7m;#$8ErQYh8lz8fr#oS%Fo-JnS6 zB9Xj61;g87fe@tOW*A*s@!S)O--UagaY2`&JRNjDM>y#1;y7QvQBtt>W}ZBxO`1T> z;A6V*<G{uJ$(UbV2ZO<zaDB*!n^5&|pSph<Or*G)!XIk$ql?6Xxc@?TP?M3MzaxUH zrhG%yNzUDYZ>&-a>+%~KZrb2&@ZYp)(>C9B|8}|(Mt4|mLU{-m)lyjVYaw}eUY#-u zF2J%PWgWM?vi$#bF%~VHi1}Nwm%#nmKu9$QT_4Kj`1&8paP2)@OTH9=L@*K|C$@&s zXXM3Kc}GY#C-aBG&8eM!zH;V|pnC<A5!{-^1+;>jbn;d%hEyCR+^T*aVD>#-c^$Dm zkPNokm-sm6Peks`zsRfmlCXP~KN!O<=6$dD=66N(%-CJ24u2?utGV*g7N`;Ii1)l1 z98I;gVFak#hK{bxk0damtfO8o^IRi!gIHaD!)<5Vkr>I++s^Jz_vvuU3;i^diiQHw zBrY}v;xy_Rok%s)pmJPH)?<QhA*(yexM8Q;6UaZ{#&R+qK?sZc+gi|n9m8CY3kM1p z&xF7JQ#X1WH*eH2{EvV%t<nd}GEVyMb?Cq2@garRKuyCs%jZ9IcBA<ROAId4e-A?D z7{y<hhVl}f7ttAy=GW&wmO}I@NIFQjUgzoapeuo+GZxLS&tdkJp#W)(1Om$jPMS`` zCBV{|jm{608B8~z`1LuL)?aA<dQjsu*XGyfPUDJS`%mlF_OlXv`S77KtzVyO%~l6t z`dmxX7y7>u1!R-v*XMML$Y3OGf1!TuKic0r`SrQot%~1yZbxmU?brMP;K-(0d?<Cz zG!$eY))qKSZJT8wz9aY$zqVihof7@`OP;eS<wJouaZdri-dFFV6IUc!uRD{rU*q=R zf%NNhN4>Are^=%)x+>vFh4z0DWlny5PMB1VC!aY}q5ZV4bMotR#r=w3pRZ~eh5UbB zz~5VEFln#i?;_!jRA~QKQ0B%*yGfse>c2Zv=r5hu@Nw{xt2Mtq-&v$Ogr)-tC!N>u z5U}KX&9BcP^xw<T_N(q__di{ar@%{9)cpGIIviRKB$B3+xm^F%`93^2`Sp2({yRVK z$3IxWug~E|lzy#8LtSs3KlMKRBbrdbLVh~;BAl+jKBwzlAsOx~5Kvg3*FZ+~uaV^T zx90y)LI2TN4POU`9=kR(9tKv*T!%84;vk*9Yx{NlcoR5nyX27HHP=hXH#8gtTCYaE UgNLd3SJKajNKX|Em_q*l1#K8)rT_o{ literal 0 HcmV?d00001 diff --git a/security/samsung/defex_lsm/pack_rules.c b/security/samsung/defex_lsm/pack_rules.c index 13e51439e535..ab59686b26ed 100755 --- a/security/samsung/defex_lsm/pack_rules.c +++ b/security/samsung/defex_lsm/pack_rules.c @@ -21,6 +21,7 @@ const struct feature_match_entry feature_match[] = { {"feature_immutable_path_write", feature_immutable_path_write}, {"feature_immutable_src_exception", feature_immutable_src_exception}, {"feature_umhbin_path", feature_umhbin_path}, + {"feature_integrity_check", feature_integrity_check}, }; const int feature_match_size = sizeof(feature_match) / sizeof(feature_match[0]); diff --git a/security/samsung/dsms/Makefile b/security/samsung/dsms/Makefile index 2cacda35fbfd..05c8dab557d7 100755 --- a/security/samsung/dsms/Makefile +++ b/security/samsung/dsms/Makefile @@ -23,5 +23,4 @@ endif ifeq ($(CONFIG_KUNIT), y) GCOV_PROFILE := y ccflags-y += -DDSMS_KUNIT_ENABLED - obj-$(CONFIG_SECURITY_DSMS) += kunit_test/ endif diff --git a/security/samsung/dsms/dsms_policy.c b/security/samsung/dsms/dsms_policy.c index 61c2ffebc2b2..93e428d9664e 100755 --- a/security/samsung/dsms/dsms_policy.c +++ b/security/samsung/dsms/dsms_policy.c @@ -14,6 +14,9 @@ // vvvvv DO NOT CHANGE THESE LINES! vvvvv struct dsms_policy_entry dsms_policy[] = { +{ "security/samsung/defex_lsm/core/defex_main.c", "defex_report_violation" }, +{ "security/samsung/five/five_audit.c", "five_audit_sign_err" }, +{ "security/samsung/five/five_dsms.c", "five_dsms_msg" }, }; // dsms_policy // ^^^^^ DO NOT CHANGE THESE LINES! ^^^^^ diff --git a/security/samsung/dsms/kunit_test/Makefile b/security/samsung/dsms/kunit_test/Makefile deleted file mode 100755 index 8dce9bcfb63b..000000000000 --- a/security/samsung/dsms/kunit_test/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -# -# Makefile for the DSMS -# -DSMS_PREBOOT_BUFFER = true - -ccflags-y := -Wformat -ccflags-y += -DDSMS_ALLOWLIST_IGNORE_NAME_SUFFIXES_ENABLE -ccflags-y += -DDSMS_KUNIT_ENABLED -ccflags-y += -I$(srctree)/$(src)/.. -ccflags-y += -I$(srctree)/$(src) - -obj-y += dsms_test_utils.o -obj-y += security_dsms_access_control_test.o -obj-y += security_dsms_debug_test.o -obj-y += security_dsms_init_test.o -obj-y += security_dsms_kernel_api_test.o -obj-y += security_dsms_netlink_test.o -obj-y += security_dsms_policy_test.o -ifeq ($(DSMS_PREBOOT_BUFFER), true) - ccflags-y += -DDSMS_PREBOOT_BUFFER_ENABLE - obj-y += security_dsms_preboot_buffer_test.o -endif -obj-y += security_dsms_rate_limit_test.o -obj-y += security_dsms_test_utils_test.o diff --git a/security/samsung/dsms/kunit_test/dsms_test_utils.c b/security/samsung/dsms/kunit_test/dsms_test_utils.c deleted file mode 100755 index d74fdfe3da2a..000000000000 --- a/security/samsung/dsms/kunit_test/dsms_test_utils.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include <kunit/mock.h> -#include <kunit/test.h> -#include <linux/slab.h> -#include <linux/types.h> -#include "dsms_test_utils.h" - -/* test utils "sees" actual kmalloc and kmalloc_array */ -#undef kmalloc -#undef kmalloc_array - -/* -------------------------------------------------------------------------- */ -/* General test functions: kmalloc and kmalloc_array mock function */ -/* -------------------------------------------------------------------------- */ - -/* each bit indicates if kmalloc or kmalloc_array mock should return fail (NULL) */ -static uint64_t dsms_test_kmalloc_fail_requests; - -void *security_dsms_test_all_kmalloc_mock(size_t n, size_t size, gfp_t flags, bool is_kmalloc) -{ - bool fail; - - fail = dsms_test_kmalloc_fail_requests & 1ul; - dsms_test_kmalloc_fail_requests >>= 1; - if (is_kmalloc) - return fail ? NULL : kmalloc(size, flags); - else - return fail ? NULL : kmalloc_array(n, size, flags); -} - -void *security_dsms_test_kmalloc_mock(size_t size, gfp_t flags) -{ - return security_dsms_test_all_kmalloc_mock(0, size, flags, 1); -} - -void *security_dsms_test_kmalloc_array_mock(size_t n, size_t size, gfp_t flags) -{ - return security_dsms_test_all_kmalloc_mock(n, size, flags, 0); -} - -/* Requests that kmalloc or kmalloc_array fails in the attempt given by argument (1 for next) */ -void security_dsms_test_request_kmalloc_fail_at(int attempt_no) -{ - if (attempt_no > 0) - dsms_test_kmalloc_fail_requests |= (1ul << (attempt_no-1)); -} - -/* Cancels all kmalloc or kmalloc_array fail requests */ -void security_dsms_test_cancel_kmalloc_fail_requests(void) -{ - dsms_test_kmalloc_fail_requests = 0; -} diff --git a/security/samsung/dsms/kunit_test/dsms_test_utils.h b/security/samsung/dsms/kunit_test/dsms_test_utils.h deleted file mode 100755 index 03ac90aee8bc..000000000000 --- a/security/samsung/dsms/kunit_test/dsms_test_utils.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#ifndef _SECURITY_DSMS_TEST_UTILS_H -#define _SECURITY_DSMS_TEST_UTILS_H - -/* -------------------------------------------------------------------------- */ -/* General test functions: kmalloc mock function */ -/* -------------------------------------------------------------------------- */ - -/* Requests that kmalloc fails in the attempt given by argument (1 for next) */ -void security_dsms_test_request_kmalloc_fail_at(int attempt_no); - -/* Cancels all kmalloc fail requests */ -void security_dsms_test_cancel_kmalloc_fail_requests(void); - -#endif /* _SECURITY_DSMS_TEST_UTILS_H */ diff --git a/security/samsung/dsms/kunit_test/security_dsms_access_control_test.c b/security/samsung/dsms/kunit_test/security_dsms_access_control_test.c deleted file mode 100755 index cdd4171a3cf4..000000000000 --- a/security/samsung/dsms/kunit_test/security_dsms_access_control_test.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include <kunit/mock.h> -#include <kunit/test.h> -#include <linux/dsms.h> -#include "dsms_access_control.h" -#include "dsms_test.h" - -/* ------------------------------------------------------------------------- */ -/* Test Module - dsms_access_control.c */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: compare_policy_entries */ -/* ------------------------------------------------------------------------- */ - -/* - * compare_policy_entries_test() - * Test the lexicographic comparison: - * + Positive number if str1 > str2 - * + Negative number if str1 < str2 - * + Zero if str1 == str2 - * Expected: Right Lexicographic comparison. - */ -static void security_dsms_compare_policy_entries_test(struct test *test) -{ - struct dsms_policy_entry entry; - - entry.file_path = "/path/test"; - entry.function_name = "myfunction"; - EXPECT_GT(test, compare_policy_entries("myfunction1", &entry), 0); - EXPECT_EQ(test, compare_policy_entries("myfunction", &entry), 0); - EXPECT_LT(test, compare_policy_entries("myfunct", &entry), 0); - entry.function_name = "myfunction1"; - EXPECT_EQ(test, compare_policy_entries("myfunction1", &entry), 0); - EXPECT_LT(test, compare_policy_entries("Myfunction", &entry), 0); -} - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: find_policy_entry */ -/* ------------------------------------------------------------------------- */ - -/* - * find_policy_entry_test() - * Use a function name that is not in dsms policy. - * Expected: No policy should be returned. - */ -static void security_dsms_find_policy_entry_failure_test(struct test *test) -{ - EXPECT_EQ(test, NULL, find_policy_entry("test")); -} - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: dsms_policy_size */ -/* ------------------------------------------------------------------------- */ - -/* - * security_dsms_policy_size_test() - * Test DSMS policy size. It may vary in size, depending on build type and model. - * Expect: At least one rule, but no more than a few entries. - */ -static void security_dsms_policy_size_valid_value_test(struct test *test) -{ - EXPECT_LT(test, 0, dsms_policy_size()); - EXPECT_GT(test, 10, dsms_policy_size()); -} - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: dsms_verify_access */ -/* ------------------------------------------------------------------------- */ - -/* - * dsms_verify_access_test() - * Testcase with null address as input. - * Expected: Function should check input and return DSMS_DENY when wrong input - * is inserted. - */ -static void security_dsms_verify_access_test(struct test *test) -{ - EXPECT_EQ(test, DSMS_DENY, dsms_verify_access(NULL)); -} - -/* - * verify_access_address_not_in_kallsyms_test() - * Caller address not in kallsyms. Test the case where the address passed to - * dsms_verify_access is not null and is not in the kallsyms. - * Expected: Function returns DSMS_DENY. - */ -static void security_dsms_verify_access_address_not_in_kallsyms_test( - struct test *test) -{ - EXPECT_EQ(test, DSMS_DENY, dsms_verify_access((const void *)0x1)); -} - -/* ------------------------------------------------------------------------- */ -/* Tests - dsms_access_control.h */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: should_ignore_allowlist_suffix */ -/* ------------------------------------------------------------------------- */ - -/* - * should_ignore_allowlist_suffix_test() - * Call should_ignore_allowlist_suffix() function. - * Expected: Should return 0 or 1. - */ -static void security_dsms_should_ignore_allowlist_suffix_test(struct test *test) -{ - unsigned int result; - - result = should_ignore_allowlist_suffix(); - result &= ~1UL; - EXPECT_EQ(test, 0UL, result); -} - -/* ------------------------------------------------------------------------- */ -/* Module Definition */ -/* ------------------------------------------------------------------------- */ - -static struct test_case security_dsms_access_control_test_cases[] = { - TEST_CASE(security_dsms_compare_policy_entries_test), - TEST_CASE(security_dsms_find_policy_entry_failure_test), - TEST_CASE(security_dsms_policy_size_valid_value_test), - TEST_CASE(security_dsms_verify_access_test), - TEST_CASE(security_dsms_verify_access_address_not_in_kallsyms_test), - TEST_CASE(security_dsms_should_ignore_allowlist_suffix_test), - {}, -}; - -static struct test_module security_dsms_access_control_test_module = { - .name = "security-dsms-access-control-test", - .test_cases = security_dsms_access_control_test_cases, -}; -module_test(security_dsms_access_control_test_module); diff --git a/security/samsung/dsms/kunit_test/security_dsms_debug_test.c b/security/samsung/dsms/kunit_test/security_dsms_debug_test.c deleted file mode 100755 index 2b3cd5a623a4..000000000000 --- a/security/samsung/dsms/kunit_test/security_dsms_debug_test.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include <kunit/test.h> -#include <linux/dsms.h> -#include "dsms_kernel_api.h" -#include "dsms_test.h" - -/* ------------------------------------------------------------------------- */ -/* Module test functions */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* File: dsms_kernel_api.h */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: DSMS_LOG_INFO */ -/* ------------------------------------------------------------------------- */ - -static void security_dsms_debug_success_test(struct test *test) -{ - DSMS_LOG_INFO("DSMS Debug unit test %x\n", 0xdeadbeef); - SUCCEED(test); -} - -/* ------------------------------------------------------------------------- */ -/* Module definition */ -/* ------------------------------------------------------------------------- */ - -static struct test_case security_dsms_debug_test_cases[] = { - TEST_CASE(security_dsms_debug_success_test), - {}, -}; - -static struct test_module security_dsms_debug_test_module = { - .name = "security-dsms-debug-test", - .test_cases = security_dsms_debug_test_cases, -}; -module_test(security_dsms_debug_test_module); diff --git a/security/samsung/dsms/kunit_test/security_dsms_init_test.c b/security/samsung/dsms/kunit_test/security_dsms_init_test.c deleted file mode 100755 index 274ec2df50d2..000000000000 --- a/security/samsung/dsms/kunit_test/security_dsms_init_test.c +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2020-2021 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include <kunit/mock.h> -#include <kunit/test.h> -#include "dsms_init.h" -#include "dsms_test.h" - -/* ------------------------------------------------------------------------- */ -/* Module test functions */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* File: dsms_init.c */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: dsms_is_initialized */ -/* ------------------------------------------------------------------------- */ - -/* - * is_initialized_test() - * Test if dsms was initialized by checking the value of - * is_dsms_initialized_flag. - * Expected: Function should return True value. - */ -static void security_dsms_is_initialized_test(struct test *test) -{ - EXPECT_TRUE(test, dsms_is_initialized()); -} - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: dsms_init */ -/* ------------------------------------------------------------------------- */ - -/* - * dsms_init_test() - * Test dsms init module. - * Expected: Function returns 0 if executed correctly, any other value if an - * error is triggered. - */ -static void security_dsms_init_test(struct test *test) -{ - EXPECT_EQ(test, dsms_init(), 0); -} - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: dsms_exit */ -/* ------------------------------------------------------------------------- */ - -/* - * dsms_exit_test() - * Test dsms init module. - * Expected: After execution dsms_is_initialized must be 0 (false). - */ -static void security_dsms_exit_test(struct test *test) -{ - ASSERT_TRUE(test, dsms_is_initialized()); -// dsms_exit(); -// EXPECT_FALSE(test, dsms_is_initialized()); -// /* restore DSMS to continue tests */ -// EXPECT_EQ(test, dsms_init(), 0); - EXPECT_TRUE(test, dsms_is_initialized()); -} - -/* ------------------------------------------------------------------------- */ -/* Module definition */ -/* ------------------------------------------------------------------------- */ - -static struct test_case security_dsms_init_test_cases[] = { - TEST_CASE(security_dsms_is_initialized_test), - TEST_CASE(security_dsms_init_test), - TEST_CASE(security_dsms_exit_test), - {}, -}; - -static struct test_module security_dsms_init_test_module = { - .name = "security-dsms-init-test", - .test_cases = security_dsms_init_test_cases, -}; -module_test(security_dsms_init_test_module); diff --git a/security/samsung/dsms/kunit_test/security_dsms_kernel_api_test.c b/security/samsung/dsms/kunit_test/security_dsms_kernel_api_test.c deleted file mode 100755 index 0863c28c36ed..000000000000 --- a/security/samsung/dsms/kunit_test/security_dsms_kernel_api_test.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include <kunit/mock.h> -#include <kunit/test.h> -#include <linux/dsms.h> -#include <linux/slab.h> -#include <linux/types.h> -#include "dsms_kernel_api.h" -#include "dsms_test.h" -#include "dsms_test_utils.h" - -/* ------------------------------------------------------------------------- */ -/* Module test functions */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* File: dsms_kernel_api.c */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: dsms_send_message */ -/* ------------------------------------------------------------------------- */ - -/* - * security_dsms_send_message() - * Helper function to send messages during tests, whitelisted on eng builds. - */ -static noinline int security_dsms_test_send_message(const char *feature_code, - const char *detail, - int64_t value) -{ - return dsms_send_message(feature_code, detail, value); -} - -/* - * security_dsms_send_message_success_test() - * Error-free test case when sending a dsms message, which means that the - * message was created and processed successfully. - * Expected: Function should return 0. - */ -static void security_dsms_send_message_success_test(struct test *test) -{ - EXPECT_EQ(test, 0, security_dsms_test_send_message("KATS", "kunit test", 0)); -} - -/* - * security_dsms_send_message_allowlist_block_test() - * Error-free test case when sending a dsms message, but failing to pass - * allowlist verification. - * Expected: Function should return 0. - */ -static void security_dsms_send_message_allowlist_block_test(struct test *test) -{ - EXPECT_EQ(test, DSMS_DENY, dsms_send_message("KATB", "kunit test", 0)); -} - -/* - * send_message_null_feature_code_test() - * Trigger error case for NULL feature code. - * Expected: Function should return -EINVAL for invalid value error. - */ -static void security_dsms_send_message_null_feature_code_test( - struct test *test) -{ - EXPECT_EQ(test, -EINVAL, security_dsms_test_send_message(NULL, "kunit test", 0)); -} - -/* - * _send_message_rate_limit_deny_test() - * Trigger error case when checking the message rate limit by setting the - * message counter to max value per round. - * Expected: Function should return DSMS_DENY. - */ -static void security_dsms_send_message_rate_limit_deny_test(struct test *test) -{ - int old_count; - - old_count = dsms_message_count; - dsms_message_count = dsms_get_max_messages_per_round(); - EXPECT_EQ(test, DSMS_DENY, security_dsms_test_send_message("KATR", "kunit test", 0)); - dsms_message_count = old_count; -} - -/* Function dsms_send_message has other error cases that are difficult to - * trigger, possibly needing to mock certain functions. - * TODO: Test Case when dsms_is_initialized returns False - * TODO: Test Case when dsms_verify_access returns DSMS_DENY - * TODO: Test Case when dsms_check_message_rate_limit returns DSMS_DENY - */ - -/* ------------------------------------------------------------------------- */ -/* Module definition */ -/* ------------------------------------------------------------------------- */ - -static struct test_case security_dsms_kernel_api_test_cases[] = { - TEST_CASE(security_dsms_send_message_success_test), - TEST_CASE(security_dsms_send_message_allowlist_block_test), - TEST_CASE(security_dsms_send_message_null_feature_code_test), - TEST_CASE(security_dsms_send_message_rate_limit_deny_test), - {}, -}; - -static struct test_module security_dsms_kernel_api_module = { - .name = "security-dsms-kernel-api", - .test_cases = security_dsms_kernel_api_test_cases, -}; -module_test(security_dsms_kernel_api_module); diff --git a/security/samsung/dsms/kunit_test/security_dsms_netlink_test.c b/security/samsung/dsms/kunit_test/security_dsms_netlink_test.c deleted file mode 100755 index 6887818216ab..000000000000 --- a/security/samsung/dsms/kunit_test/security_dsms_netlink_test.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2020-2021 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ -#include <linux/llist.h> -#include <kunit/mock.h> -#include <kunit/test.h> -#include "dsms_kernel_api.h" -#include "dsms_netlink.h" -#include "dsms_test.h" -#include "dsms_test_utils.h" - -/* ------------------------------------------------------------------------- */ -/* Module test functions */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* File: dsms_netlink.c */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: dsms_daemon_ready */ -/* ------------------------------------------------------------------------- */ - -/* - * security_dsms_daemon_ready_success_test() - * Daemon ready test. - * Expected: Function should return whether daemon is ready. - */ -static void security_dsms_daemon_ready_success_test(struct test *test) -{ - int ready; - - ready = atomic_read(&daemon_ready); - EXPECT_EQ(test, dsms_daemon_ready(), ready); -} - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: dsms_send_netlink_message */ -/* ------------------------------------------------------------------------- */ - -/* - * send_netlink_message_test() - * Check if a message can be sent. - * Expected: Function should return 0. - */ -static void security_dsms_send_netlink_message_success_test(struct test *test) -{ - EXPECT_EQ(test, dsms_send_netlink_message("KNIT", "kunit test", 0), 0); -} - -/* Function dsms_send_netlink_message has error cases that are - * difficult to trigger, possibly needing to mock certain functions. - * TODO: Case when genlmsg_new returns NULL - * TODO: Case when genlmsg_put returns NULL - * TODO: Cases when nla_put returns error (for value, feature code and detail) - * TODO: Case when genlmsg_multicast returns error - */ - -/* ------------------------------------------------------------------------- */ -/* Module definition */ -/* ------------------------------------------------------------------------- */ - -static struct test_case security_dsms_netlink_test_cases[] = { - TEST_CASE(security_dsms_daemon_ready_success_test), - TEST_CASE(security_dsms_send_netlink_message_success_test), - {}, -}; - -static struct test_module security_dsms_netlink_module = { - .name = "security-dsms-netlink", - .test_cases = security_dsms_netlink_test_cases, -}; -module_test(security_dsms_netlink_module); diff --git a/security/samsung/dsms/kunit_test/security_dsms_policy_test.c b/security/samsung/dsms/kunit_test/security_dsms_policy_test.c deleted file mode 100755 index 59305eefc7b3..000000000000 --- a/security/samsung/dsms/kunit_test/security_dsms_policy_test.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include <kunit/test.h> -#include <linux/dsms.h> -#include <linux/kallsyms.h> -#include <linux/string.h> -#include "dsms_access_control.h" -#include "dsms_test.h" - -/* ------------------------------------------------------------------------- */ -/* Module test functions */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* File: dsms_policy.c */ -/* ------------------------------------------------------------------------- */ - -static void security_dsms_policy_test(struct test *test) -{ - size_t i; - - // Check whether policy entries are sorted by function_name - for (i = dsms_policy_size(); i > 1; --i) - EXPECT_TRUE(test, - strncmp(dsms_policy[i - 2].function_name, - dsms_policy[i - 1].function_name, - KSYM_NAME_LEN) <= 0); -} - -/* ------------------------------------------------------------------------- */ -/* Module definition */ -/* ------------------------------------------------------------------------- */ - -static struct test_case security_dsms_policy_test_cases[] = { - TEST_CASE(security_dsms_policy_test), - {}, -}; - -static struct test_module security_dsms_policy_test_module = { - .name = "security-dsms-policy-test", - .test_cases = security_dsms_policy_test_cases, -}; -module_test(security_dsms_policy_test_module); diff --git a/security/samsung/dsms/kunit_test/security_dsms_preboot_buffer_test.c b/security/samsung/dsms/kunit_test/security_dsms_preboot_buffer_test.c deleted file mode 100755 index 186f7236c728..000000000000 --- a/security/samsung/dsms/kunit_test/security_dsms_preboot_buffer_test.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include <kunit/mock.h> -#include <kunit/test.h> -#include <linux/dsms.h> -#include <linux/slab.h> -#include <linux/types.h> -#include "dsms_kernel_api.h" -#include "dsms_preboot_buffer.h" -#include "dsms_test.h" -#include "dsms_test_utils.h" - -#define MESSAGE_COUNT_LIMIT (50) - -struct dsms_message_node { - struct dsms_message *message; - struct llist_node llist; -}; - -/* ------------------------------------------------------------------------- */ -/* Module test functions */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* File: dsms_preboot_buffer.c */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: create_message */ -/* ------------------------------------------------------------------------- */ - -/* - * create_message_test() - * Create a dsms message and check if correct values are set. - * Expected: Dsms message should be allocated and parameters correctly set. - */ -static void security_dsms_create_message_success_test(struct test *test) -{ - struct dsms_message *message; - - message = create_message("KATC", "kunit test", 0); - EXPECT_NOT_NULL(test, message); - if (message != NULL) { - EXPECT_STREQ(test, message->feature_code, "KATC"); - EXPECT_STREQ(test, message->detail, "kunit test"); - EXPECT_EQ(test, message->value, 0); - destroy_message(message); - } -} - -/* - * create_message_memory_error_test() - * Trigger memory error case when allocating the dsms message struct. - * Expected: Function should return NULL. - */ -static void security_dsms_create_message_memory_error_test(struct test *test) -{ - struct dsms_message *message; - - security_dsms_test_request_kmalloc_fail_at(1); - message = create_message("KATM", "kunit test", 0); - security_dsms_test_cancel_kmalloc_fail_requests(); - EXPECT_NULL(test, message); - if (message != NULL) - destroy_message(message); -} - -/* - * create_message_feature_code_memory_error_test() - * Trigger memory error case when allocating the feature code. - * Expected: Function should return NULL. - */ -static void security_dsms_create_message_feature_code_memory_error_test( - struct test *test) -{ - struct dsms_message *message; - - security_dsms_test_request_kmalloc_fail_at(2); - message = create_message("KATF", "kunit test", 0); - security_dsms_test_cancel_kmalloc_fail_requests(); - EXPECT_NULL(test, message); - if (message != NULL) - destroy_message(message); -} - -/* - * create_message_detail_memory_error_test() - * Trigger memory error case when allocating the detail. - * Expected: Function should return NULL. - */ -static void security_dsms_create_message_detail_memory_error_test( - struct test *test) -{ - struct dsms_message *message; - - security_dsms_test_request_kmalloc_fail_at(3); - message = create_message("KATD", "kunit test", 0); - security_dsms_test_cancel_kmalloc_fail_requests(); - EXPECT_NULL(test, message); - if (message != NULL) - destroy_message(message); -} - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: create_node */ -/* ------------------------------------------------------------------------- */ - -/* - * security_dsms_create_node_success_test() - * Create a node and check if correct values are set. - * Expected: node should be allocated and parameters correctly set. - */ -static void security_dsms_create_node_success_test(struct test *test) -{ - struct dsms_message *message; - struct dsms_message_node *node; - - message = create_message("KATC", "kunit test", 0); - EXPECT_NOT_NULL(test, message); - if (message != NULL) { - node = create_node(message); - EXPECT_NOT_NULL(test, node); - if (node != NULL) { - EXPECT_EQ(test, node->message, message); - EXPECT_STREQ(test, node->message->feature_code, "KATC"); - EXPECT_STREQ(test, node->message->detail, "kunit test"); - EXPECT_EQ(test, node->message->value, 0); - destroy_node(node); - } - destroy_message(message); - } -} - -/* - * security_dsms_create_node_fail_test() - * Trigger memory error case when allocating the node struct. - * Expected: Function should return NULL. - */ -static void security_dsms_create_node_fail_test(struct test *test) -{ - struct dsms_message *message; - struct dsms_message_node *node; - - message = create_message("KATC", "kunit test", 0); - EXPECT_NOT_NULL(test, message); - if (message != NULL) { - security_dsms_test_request_kmalloc_fail_at(1); - node = create_node(message); - security_dsms_test_cancel_kmalloc_fail_requests(); - EXPECT_NULL(test, node); - if (node != NULL) - destroy_node(node); - destroy_message(message); - } -} - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: dsms_preboot_buffer_add */ -/* ------------------------------------------------------------------------- */ - -/* - * security_dsms_preboot_buffer_add_success_test() - * Add to preboot buffer and check if correct value is returned. - * Expected: Success should return 0. - */ -static void security_dsms_preboot_buffer_add_success_test(struct test *test) -{ - int ret; - - ret = dsms_preboot_buffer_add("KATC", "kunit test", 0); - EXPECT_EQ(test, ret, 0); -} - -/* - * security_dsms_preboot_buffer_add_count_error_test() - * Trigger count during add to preboot buffer. - * Expected: Count error should return -EBUSY. - */ -static void security_dsms_preboot_buffer_add_count_error_test(struct test *test) -{ - int ret; - int old_message_counter; - - old_message_counter = atomic_read(&message_counter); - atomic_set(&message_counter, MESSAGE_COUNT_LIMIT); - ret = dsms_preboot_buffer_add("KATC", "kunit test", 0); - atomic_set(&message_counter, old_message_counter); - EXPECT_EQ(test, ret, -EBUSY); -} - -/* - * security_dsms_preboot_buffer_add_message_error_test() - * Trigger memory error at message allocation during add to preboot buffer. - * Expected: Error at message allocation should return -ENOMEM. - */ -static void security_dsms_preboot_buffer_add_message_error_test(struct test *test) -{ - int ret; - - security_dsms_test_request_kmalloc_fail_at(1); - ret = dsms_preboot_buffer_add("KATC", "kunit test", 0); - security_dsms_test_cancel_kmalloc_fail_requests(); - EXPECT_EQ(test, ret, -ENOMEM); -} - -/* - * security_dsms_preboot_buffer_add_node_error_test() - * Trigger memory error at node allocation during add to preboot buffer. - * Expected: Error at node allocation should return -ENOMEM. - */ -static void security_dsms_preboot_buffer_add_node_error_test(struct test *test) -{ - int ret; - - security_dsms_test_request_kmalloc_fail_at(4); - ret = dsms_preboot_buffer_add("KATC", "kunit test", 0); - security_dsms_test_cancel_kmalloc_fail_requests(); - EXPECT_EQ(test, ret, -ENOMEM); -} - -/* ------------------------------------------------------------------------- */ -/* Module definition */ -/* ------------------------------------------------------------------------- */ - -static struct test_case security_dsms_preboot_buffer_test_cases[] = { - TEST_CASE(security_dsms_create_message_success_test), - TEST_CASE(security_dsms_create_message_memory_error_test), - TEST_CASE(security_dsms_create_message_feature_code_memory_error_test), - TEST_CASE(security_dsms_create_message_detail_memory_error_test), - TEST_CASE(security_dsms_create_node_success_test), - TEST_CASE(security_dsms_create_node_fail_test), - TEST_CASE(security_dsms_preboot_buffer_add_success_test), - TEST_CASE(security_dsms_preboot_buffer_add_count_error_test), - TEST_CASE(security_dsms_preboot_buffer_add_message_error_test), - TEST_CASE(security_dsms_preboot_buffer_add_node_error_test), - {}, -}; - -static struct test_module security_dsms_preboot_buffer_module = { - .name = "security-dsms-preboot-buffer", - .test_cases = security_dsms_preboot_buffer_test_cases, -}; -module_test(security_dsms_preboot_buffer_module); diff --git a/security/samsung/dsms/kunit_test/security_dsms_rate_limit_test.c b/security/samsung/dsms/kunit_test/security_dsms_rate_limit_test.c deleted file mode 100755 index 6b100c54cffa..000000000000 --- a/security/samsung/dsms/kunit_test/security_dsms_rate_limit_test.c +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include <kunit/mock.h> -#include <kunit/test.h> -#include <linux/dsms.h> -#include <linux/errno.h> -#include "dsms_rate_limit.h" -#include "dsms_test.h" - -/* Must have the same values as defined in dsms_rate_limit.c */ -#define ROUND_DURATION_MS ((u64)(1000L)) -#define MAX_MESSAGES_PER_ROUND (50) - -static u64 start_ms; - -/* ------------------------------------------------------------------------- */ -/* Module test functions */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* File: dsms_rate_limit.c */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: dsms_get_max_messages_per_round */ -/* ------------------------------------------------------------------------- */ - -/* - * get_max_messages_per_round_test() - * Check the correct return value for max messages per round. - * Expected: Function should return value of MAX_MESSAGES_PER_ROUND. - */ -static void security_dsms_get_max_messages_per_round_test(struct test *test) -{ - EXPECT_TRUE(test, dsms_get_max_messages_per_round() > 0); - EXPECT_EQ(test, MAX_MESSAGES_PER_ROUND, dsms_get_max_messages_per_round()); -} - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: round_end_ms */ -/* ------------------------------------------------------------------------- */ - -/* - * round_end_ms_test() - * Verify if round end time is correctly calculated. - * Expected: Function should return the round end time, which is equal - * to the start time plus the round duration. - */ -static void security_dsms_round_end_ms_test(struct test *test) -{ - EXPECT_EQ(test, start_ms + ROUND_DURATION_MS, round_end_ms(start_ms)); -} - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: is_new_round */ -/* ------------------------------------------------------------------------- */ - -/* - * is_new_round_test() - * Check the correct return of the function for the test cases when a new - * round has started or not. - * Expected: Function should return 0 if a new round has not started, else should - * return 1. - */ -static void security_dsms_is_new_round_test(struct test *test) -{ - u64 now_ms = dsms_get_time_ms(); - - EXPECT_EQ(test, 0, is_new_round(now_ms, start_ms)); - EXPECT_EQ(test, 1, is_new_round(start_ms + ROUND_DURATION_MS + 1, start_ms)); -} - -/* ------------------------------------------------------------------------- */ -/* Function to be tested: dsms_check_message_rate_limit */ -/* ------------------------------------------------------------------------- */ - -/* - * check_message_rate_limit_deny_test() - * Test case when the message rate is higher than the max rate per round. - * Expected: Function should return DSMS_DENY if the rate limit is reached. - */ -static void security_dsms_check_message_rate_limit_deny_test(struct test *test) -{ - int failed = 0, i; - - for (i = dsms_get_max_messages_per_round(); i >= 0; --i) - if (dsms_check_message_rate_limit() == DSMS_DENY) - failed = 1; - EXPECT_TRUE(test, failed); -} - -/* - * check_message_rate_limit_success_test() - * Test case when the message rate is lower than the max rate per round. - * Expected: Function should return DSMS_SUCCESS if the rate limit is not - * reached. - */ -static void security_dsms_check_message_rate_limit_success_test(struct test *test) -{ - EXPECT_EQ(test, DSMS_SUCCESS, dsms_check_message_rate_limit()); -} - -/* - * check_message_rate_limit_boundary_test() - * Test boundary cases (simulate clock wrapped, too many messages). - * Expected: Function should return DSMS_SUCCESS and reset the message count - * to zero. - */ -static void security_dsms_check_message_rate_limit_boundary_test(struct test *test) -{ - int old_count; - - dsms_round_start_ms -= 10; - EXPECT_EQ(test, DSMS_SUCCESS, dsms_check_message_rate_limit()); - old_count = dsms_message_count; - dsms_round_start_ms = 0; - dsms_message_count = dsms_get_max_messages_per_round() + 1; - EXPECT_EQ(test, DSMS_SUCCESS, dsms_check_message_rate_limit()); - EXPECT_EQ(test, dsms_message_count, 0); - dsms_message_count = old_count; -} - -/* - * dsms_check_message_rate_limit_reset_test - * This test sets the "dsms_round_start_ms" variable to the maximum value - * of an unsigned 64 bit type (2^64 - 1). Such modification triggers the - * "[rate limit] RESET" case on "dsms_check_message_rate_limit" function. - * Expected: Function should return DSMS_SUCCESS and reset the message count - * to zero. - */ -static void security_dsms_check_message_rate_limit_reset_test(struct test *test) -{ - dsms_round_start_ms = -1; - EXPECT_EQ(test, DSMS_SUCCESS, dsms_check_message_rate_limit()); - EXPECT_EQ(test, dsms_message_count, 1); -} - -/* ------------------------------------------------------------------------- */ -/* Module initialization and exit functions */ -/* ------------------------------------------------------------------------- */ - -static int security_dsms_rate_test_init(struct test *test) -{ - dsms_rate_limit_init(); - start_ms = dsms_get_time_ms(); - return 0; -} - -/* ------------------------------------------------------------------------- */ -/* Module definition */ -/* ------------------------------------------------------------------------- */ - -static struct test_case security_dsms_rate_test_cases[] = { - TEST_CASE(security_dsms_get_max_messages_per_round_test), - TEST_CASE(security_dsms_round_end_ms_test), - TEST_CASE(security_dsms_is_new_round_test), - TEST_CASE(security_dsms_check_message_rate_limit_deny_test), - TEST_CASE(security_dsms_check_message_rate_limit_success_test), - TEST_CASE(security_dsms_check_message_rate_limit_boundary_test), - TEST_CASE(security_dsms_check_message_rate_limit_reset_test), - {}, -}; - -static struct test_module security_dsms_rate_test_module = { - .name = "security-dsms-rate-limit-test", - .init = security_dsms_rate_test_init, - .test_cases = security_dsms_rate_test_cases, -}; -module_test(security_dsms_rate_test_module); diff --git a/security/samsung/dsms/kunit_test/security_dsms_test_utils_test.c b/security/samsung/dsms/kunit_test/security_dsms_test_utils_test.c deleted file mode 100755 index 808b4b55cfc5..000000000000 --- a/security/samsung/dsms/kunit_test/security_dsms_test_utils_test.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ - -#include <kunit/test.h> -#include <kunit/mock.h> -#include <linux/slab.h> -#include <linux/types.h> -#include "dsms_test.h" -#include "dsms_test_utils.h" - -/* ------------------------------------------------------------------------- */ -/* Module test functions */ -/* ------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------- */ -/* File: test_utils.c */ -/* ------------------------------------------------------------------------- */ - -/* By default kmalloc is defined as kmalloc_mock in dsms_test.h*/ -static void security_dsms_test_kmalloc_mock_test(struct test *test) -{ - void *p; - - security_dsms_test_request_kmalloc_fail_at(1); - security_dsms_test_request_kmalloc_fail_at(3); - /* kmalloc must call security_dsms_test_kmalloc_mock */ - EXPECT_EQ(test, p = kmalloc(1, GFP_KERNEL), NULL); - kfree(p); - EXPECT_NE(test, p = kmalloc(1, GFP_KERNEL), NULL); - kfree(p); - EXPECT_EQ(test, p = kmalloc(1, GFP_KERNEL), NULL); - kfree(p); - EXPECT_NE(test, p = kmalloc(1, GFP_KERNEL), NULL); - kfree(p); -} - -/* ------------------------------------------------------------------------- */ -/* Module initialization and exit functions */ -/* ------------------------------------------------------------------------- */ - -static int security_dsms_test_utils_init(struct test *test) -{ - security_dsms_test_cancel_kmalloc_fail_requests(); - return 0; -} - -static void security_dsms_test_utils_exit(struct test *test) -{ - security_dsms_test_cancel_kmalloc_fail_requests(); -} - -/* ------------------------------------------------------------------------- */ -/* Module definition */ -/* ------------------------------------------------------------------------- */ - -static struct test_case security_dsms_test_utils_test_cases[] = { - TEST_CASE(security_dsms_test_kmalloc_mock_test), - {}, -}; - -static struct test_module security_dsms_test_utils_module = { - .name = "security-dsms-test-utils-test", - .init = security_dsms_test_utils_init, - .exit = security_dsms_test_utils_exit, - .test_cases = security_dsms_test_utils_test_cases, -}; -module_test(security_dsms_test_utils_module); diff --git a/security/samsung/five/Makefile b/security/samsung/five/Makefile index ed475ea86a4d..8c548f526579 100755 --- a/security/samsung/five/Makefile +++ b/security/samsung/five/Makefile @@ -31,8 +31,6 @@ endif # kunit tests options: ifeq ($(CONFIG_SEC_KUNIT)$(CONFIG_UML), yy) GCOV_PROFILE := y - subdir-$(CONFIG_FIVE) += kunit_test - obj-$(CONFIG_FIVE) += kunit_test/ five-$(CONFIG_FIVE) += five_dsms.o EXTRA_CFLAGS += -DFIVE_KUNIT_ENABLED endif diff --git a/security/samsung/five/five_appraise.c b/security/samsung/five/five_appraise.c index 93aeab3d074a..5253c6f172a3 100755 --- a/security/samsung/five/five_appraise.c +++ b/security/samsung/five/five_appraise.c @@ -243,7 +243,8 @@ static bool bad_fs(struct inode *inode) { if (inode->i_sb->s_magic == EXT4_SUPER_MAGIC || inode->i_sb->s_magic == F2FS_SUPER_MAGIC || - inode->i_sb->s_magic == OVERLAYFS_SUPER_MAGIC) + inode->i_sb->s_magic == OVERLAYFS_SUPER_MAGIC || + inode->i_sb->s_magic == EROFS_SUPER_MAGIC_V1) return false; return true; diff --git a/security/samsung/five/five_cache.h b/security/samsung/five/five_cache.h index c1fc87b2098c..d3cf579fb8e7 100755 --- a/security/samsung/five/five_cache.h +++ b/security/samsung/five/five_cache.h @@ -20,7 +20,7 @@ #ifndef __LINUX_FIVE_CACHE_H #define __LINUX_FIVE_CACHE_H -#include "../../../security/integrity/integrity.h" +#include "../../integrity/integrity.h" enum five_file_integrity five_get_cache_status( const struct integrity_iint_cache *iint); diff --git a/security/samsung/five/five_crypto.c b/security/samsung/five/five_crypto.c index 5f8ae7d122df..699275fd4bb1 100755 --- a/security/samsung/five/five_crypto.c +++ b/security/samsung/five/five_crypto.c @@ -33,7 +33,7 @@ #include "five.h" #include "five_crypto_comp.h" #include "five_porting.h" -#include "../../../security/integrity/integrity.h" +#include "../../integrity/integrity.h" struct ahash_completion { struct completion completion; diff --git a/security/samsung/five/five_dmverity.c b/security/samsung/five/five_dmverity.c index bc9da531ed80..bf40d64f01b1 100755 --- a/security/samsung/five/five_dmverity.c +++ b/security/samsung/five/five_dmverity.c @@ -22,7 +22,7 @@ #include "five_testing.h" #include "../../../drivers/md/dm.h" -#include "../../../drivers/block/loop.h" +#include "./../../drivers/block/loop.h" #ifdef CONFIG_FIVE_DEBUG #include <linux/debugfs.h> diff --git a/security/samsung/five/five_main.c b/security/samsung/five/five_main.c index b6f068b51d21..2b8af0e1282b 100755 --- a/security/samsung/five/five_main.c +++ b/security/samsung/five/five_main.c @@ -30,6 +30,7 @@ #include <linux/debugfs.h> #include <linux/fs.h> #include <linux/shmem_fs.h> +#include <linux/version.h> #include "five.h" #include "five_audit.h" @@ -42,6 +43,12 @@ #include "five_dsms.h" #include "five_testing.h" +/* crash_dump in Android 12 uses this request even if Kernel doesn't + * support it */ +#ifndef PTRACE_PEEKMTETAGS +#define PTRACE_PEEKMTETAGS 33 +#endif + static const bool check_dex2oat_binary = true; static const bool check_memfd_file = true; @@ -706,7 +713,7 @@ int five_file_mmap(struct file *file, unsigned long prot) * * On success return 0. */ -int five_bprm_check(struct linux_binprm *bprm) +int __five_bprm_check(struct linux_binprm *bprm, int depth) { int rc = 0; struct task_struct *task = current; @@ -715,7 +722,7 @@ int five_bprm_check(struct linux_binprm *bprm) if (unlikely(task->ptrace)) return rc; - if (bprm->recursion_depth > 0) { + if (depth > 0) { rc = push_file_event_bunch(task, bprm->file, MMAP_CHECK); } else { struct task_integrity *tint = task_integrity_alloc(); @@ -733,6 +740,18 @@ int five_bprm_check(struct linux_binprm *bprm) return rc; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) +int five_bprm_check(struct linux_binprm *bprm, int depth) +{ + return __five_bprm_check(bprm, depth); +} +#else +int five_bprm_check(struct linux_binprm *bprm) +{ + return __five_bprm_check(bprm, bprm->recursion_depth); +} +#endif + /** * This function handles two situations: * 1. Device had been rebooted before five_sign finished. @@ -953,6 +972,7 @@ int five_ptrace(struct task_struct *task, long request) case PTRACE_PEEKSIGINFO: case PTRACE_GETSIGMASK: case PTRACE_GETEVENTMSG: + case PTRACE_PEEKMTETAGS: #if defined(CONFIG_ARM64) || defined(KUNIT_UML) case COMPAT_PTRACE_GETREGS: case COMPAT_PTRACE_GET_THREAD_AREA: diff --git a/security/samsung/five/five_porting.h b/security/samsung/five/five_porting.h index 743807a44409..3aa89e190d7e 100755 --- a/security/samsung/five/five_porting.h +++ b/security/samsung/five/five_porting.h @@ -26,6 +26,11 @@ #define OVERLAYFS_SUPER_MAGIC 0x794c7630 #endif +/* EROFS_SUPER_MAGIC_V1 is defined since v5.4 */ +#ifndef EROFS_SUPER_MAGIC_V1 +#define EROFS_SUPER_MAGIC_V1 0xE0F5E1E2 +#endif + #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 21) /* d_backing_inode is absent on some Linux Kernel 3.x. but it back porting for * few Samsung kernels: @@ -104,16 +109,29 @@ static inline ssize_t __vfs_getxattr(struct dentry *dentry, struct inode *inode, } #endif -#if defined(CONFIG_ANDROID) && LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0) +#if defined(CONFIG_ANDROID) && (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0) \ + || LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) /* * __vfs_getxattr was changed in Android Kernel v5.4 * https://android.googlesource.com/kernel/common/+/3484eba91d6b529cc606486a2db79513f3db6c67 + * and was reverted in Android Kernel v5.15 + * https://android.googlesource.com/kernel/common/+/e884438aa554219a6d0df3a18ff0b23ea678c36c */ #define XATTR_NOSECURITY 0x4 /* get value, do not involve security check */ #define __vfs_getxattr(dentry, inode, name, value, size, flags) \ __vfs_getxattr(dentry, inode, name, value, size) #endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0) +#define vfs_getxattr_alloc(dentry, name, xattr_value, size, flags) \ + vfs_getxattr_alloc(&init_user_ns, dentry, name, xattr_value, \ + size, flags) +#define __vfs_setxattr_noperm(dentry, name, value, size, flags) \ + __vfs_setxattr_noperm(&init_user_ns, dentry, name, value, size, flags) +#define __vfs_removexattr(dentry, name) \ + __vfs_removexattr(&init_user_ns, dentry, name) +#endif + #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0) /* __GFP_WAIT was changed to __GFP_RECLAIM in * https://lore.kernel.org/patchwork/patch/592262/ diff --git a/security/samsung/five/five_testing.h b/security/samsung/five/five_testing.h index abb9f0eb8913..d058cbce81ee 100755 --- a/security/samsung/five/five_testing.h +++ b/security/samsung/five/five_testing.h @@ -1,10 +1,7 @@ #ifndef __LINUX_FIVE_TESTING_H #define __LINUX_FIVE_TESTING_H -#ifndef FIVE_KUNIT_ENABLED -#define __mockable -#define __visible_for_testing static -#else // FIVE_KUNIT_ENABLED +#if defined(FIVE_KUNIT_ENABLED) || defined(PROCA_KUNIT_ENABLED) #define KUNIT_UML // this define should be used for adding UML-specific modifications #define __mockable __weak #define __visible_for_testing @@ -22,6 +19,9 @@ static inline int dsms_send_message(const char *feature_code, #define COMPAT_PTRACE_GETVFPREGS 27 #define COMPAT_PTRACE_GETHBPREGS 29 #endif -#endif // FIVE_KUNIT_ENABLED +#else +#define __mockable +#define __visible_for_testing static +#endif // FIVE_KUNIT_ENABLED || PROCA_KUNIT_ENABLED #endif // __LINUX_FIVE_TESTING_H diff --git a/security/samsung/five/gki/five_appraise.c b/security/samsung/five/gki/five_appraise.c index 370bf9f0479a..8f00e7d8492a 100755 --- a/security/samsung/five/gki/five_appraise.c +++ b/security/samsung/five/gki/five_appraise.c @@ -245,7 +245,8 @@ static bool bad_fs(struct inode *inode) { if (inode->i_sb->s_magic == EXT4_SUPER_MAGIC || inode->i_sb->s_magic == F2FS_SUPER_MAGIC || - inode->i_sb->s_magic == OVERLAYFS_SUPER_MAGIC) + inode->i_sb->s_magic == OVERLAYFS_SUPER_MAGIC || + inode->i_sb->s_magic == EROFS_SUPER_MAGIC_V1) return false; return true; @@ -440,7 +441,8 @@ int five_appraise_measurement(struct task_struct *task, int func, out: if (status == FIVE_FILE_FAIL || status == FIVE_FILE_UNKNOWN) { - task_integrity_set_reset_reason(TASK_INTEGRITY(task), cause, file); + task_integrity_set_reset_reason(TASK_INTEGRITY(task), + cause, file); five_audit_verbose(task, file, five_get_string_fn(func), prev_integrity, prev_integrity, tint_reset_cause_to_string(cause), rc); @@ -741,7 +743,7 @@ int five_fcntl_sign(struct file *file, struct integrity_label __user *label) } } else { enum task_integrity_value tint = - task_integrity_read(TASK_INTEGRITY(current)); + task_integrity_read(TASK_INTEGRITY(current)); five_audit_err(current, file, "fcntl_sign", tint, tint, "sign:no-perm", -EPERM); diff --git a/security/samsung/five/kunit_test/Makefile b/security/samsung/five/kunit_test/Makefile deleted file mode 100755 index 392730bab715..000000000000 --- a/security/samsung/five/kunit_test/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -ccflags-y += -I$(srctree) -ccflags-y += -I$(srctree)/security/samsung/five - -KBUILD_CFLAGS := $(subst -Werror=strict-prototypes,,$(KBUILD_CFLAGS)) - -obj-y += five_dsms_test.o -obj-y += five_lv_test.o -obj-y += five_crypto_test.o -obj-y += five_cache_test.o -obj-y += five_file.o -obj-y += five_dmverity_test.o -obj-y += five_keyring_test.o -obj-y += five_pa_test.o -obj-y += task_integrity_test.o -obj-y += five_cert_test.o -obj-y += five_audit_test.o -obj-y += five_state_test.o \ No newline at end of file diff --git a/security/samsung/five/kunit_test/five_audit_test.c b/security/samsung/five/kunit_test/five_audit_test.c deleted file mode 100755 index 9f9b4f8be8c2..000000000000 --- a/security/samsung/five/kunit_test/five_audit_test.c +++ /dev/null @@ -1,121 +0,0 @@ -#include <kunit/test.h> -#include <kunit/mock.h> -#include <linux/fs.h> -#include <linux/task_integrity.h> -#include "five_audit.h" - -#define FILE_ADDR 0xABCD - -static const uint8_t cause[] = "cause", op[] = "op"; - -DEFINE_FUNCTION_MOCK_VOID_RETURN(five_audit_msg, PARAMS(struct task_struct *, - struct file *, const char *, enum task_integrity_value, - enum task_integrity_value, const char *, int)) - -DEFINE_FUNCTION_MOCK_VOID_RETURN(call_five_dsms_reset_integrity, - PARAMS(const char *, int, const char *)) - -DEFINE_FUNCTION_MOCK_VOID_RETURN(call_five_dsms_sign_err, - PARAMS(const char *, int)) - -static void five_audit_info_test(struct test *test) -{ - struct file *file; - int result = 0xab; - struct task_struct *task = current; - - file = (struct file *)FILE_ADDR; - - Returns(EXPECT_CALL(five_audit_msg(ptr_eq(test, task), - ptr_eq(test, file), streq(test, op), int_eq(test, INTEGRITY_NONE), - int_eq(test, INTEGRITY_NONE), streq(test, cause), - int_eq(test, result))), int_return(test, 0)); - - five_audit_info(task, file, - op, INTEGRITY_NONE, INTEGRITY_NONE, cause, result); -} - -static void five_audit_err_test_1(struct test *test) -{ - struct file *file; - struct task_struct *task = current; - int result = 1; - - file = (struct file *)FILE_ADDR; - Times(1, Returns(EXPECT_CALL(five_audit_msg(ptr_eq(test, task), - ptr_eq(test, file), streq(test, op), - int_eq(test, INTEGRITY_NONE), int_eq(test, INTEGRITY_NONE), - streq(test, cause), int_eq(test, result))), - int_return(test, 0))); - - Times(0, Returns(EXPECT_CALL(call_five_dsms_reset_integrity(any(test), - any(test), any(test))), int_return(test, 0))); - - five_audit_err(task, file, - op, INTEGRITY_NONE, INTEGRITY_NONE, cause, result); -} - -static void five_audit_err_test_2(struct test *test) -{ - struct file *file; - struct task_struct *task = current; - char comm[TASK_COMM_LEN]; - int result = 0; - - file = (struct file *)FILE_ADDR; - Returns(EXPECT_CALL(five_audit_msg(ptr_eq(test, task), - ptr_eq(test, file), streq(test, op), - int_eq(test, INTEGRITY_NONE), int_eq(test, INTEGRITY_NONE), - streq(test, cause), int_eq(test, result))), - int_return(test, 0)); - - get_task_comm(comm, current); - Returns(EXPECT_CALL(call_five_dsms_reset_integrity(streq(test, comm), - int_eq(test, 0), streq(test, op))), int_return(test, 0)); - - five_audit_err(task, file, - op, INTEGRITY_NONE, INTEGRITY_NONE, cause, result); -} - -static void five_audit_sign_err_test(struct test *test) -{ - struct file *file; - struct task_struct *task = current; - char comm[TASK_COMM_LEN]; - int result = 0xab; - - file = (struct file *)FILE_ADDR; - - get_task_comm(comm, current); - Returns(EXPECT_CALL(call_five_dsms_sign_err(streq(test, comm), - int_eq(test, result))), int_return(test, 0)); - - five_audit_sign_err(task, file, - op, INTEGRITY_NONE, INTEGRITY_NONE, cause, result); -} - -static int security_five_test_init(struct test *test) -{ - return 0; -} - -static void security_five_test_exit(struct test *test) -{ - return; -} - -static struct test_case security_five_test_cases[] = { - TEST_CASE(five_audit_info_test), - TEST_CASE(five_audit_err_test_1), - TEST_CASE(five_audit_err_test_2), - TEST_CASE(five_audit_sign_err_test), - {}, -}; - -static struct test_module security_five_test_module = { - .name = "five-audit-test", - .init = security_five_test_init, - .exit = security_five_test_exit, - .test_cases = security_five_test_cases, -}; -module_test(security_five_test_module); diff --git a/security/samsung/five/kunit_test/five_cache_test.c b/security/samsung/five/kunit_test/five_cache_test.c deleted file mode 100755 index 882b86ce9137..000000000000 --- a/security/samsung/five/kunit_test/five_cache_test.c +++ /dev/null @@ -1,73 +0,0 @@ -#include <kunit/test.h> -#include "five_cache.h" -#include "five_porting.h" - -static void five_get_cache_status_test(struct test *test) -{ - struct integrity_iint_cache *iint; - enum five_file_integrity status; - - iint = test_kzalloc(test, sizeof(struct integrity_iint_cache), - GFP_NOFS); - ASSERT_NOT_ERR_OR_NULL(test, iint); - memset(iint, 0xab, sizeof(struct integrity_iint_cache)); - iint->inode = test_kzalloc(test, sizeof(struct inode), GFP_NOFS); - ASSERT_NOT_ERR_OR_NULL(test, iint->inode); - memset(iint->inode, 0xcd, sizeof(struct inode)); - iint->version = inode_query_iversion(iint->inode); - iint->five_status = FIVE_FILE_DMVERITY; - - status = five_get_cache_status(iint); - EXPECT_EQ(test, status, FIVE_FILE_DMVERITY); - - status = five_get_cache_status(NULL); - EXPECT_EQ(test, status, FIVE_FILE_UNKNOWN); - - iint->version = 555; - status = five_get_cache_status(iint); - EXPECT_EQ(test, status, FIVE_FILE_UNKNOWN); -} - -static void five_set_cache_status_test(struct test *test) -{ - struct integrity_iint_cache *iint; - enum five_file_integrity status = FIVE_FILE_DMVERITY; - - iint = test_kzalloc(test, sizeof(struct integrity_iint_cache), - GFP_NOFS); - ASSERT_NOT_ERR_OR_NULL(test, iint); - memset(iint, 0xab, sizeof(struct integrity_iint_cache)); - iint->inode = test_kzalloc(test, sizeof(struct inode), GFP_NOFS); - ASSERT_NOT_ERR_OR_NULL(test, iint->inode); - memset(iint->inode, 0xcd, sizeof(struct inode)); - - five_set_cache_status(iint, status); - EXPECT_EQ(test, iint->five_status, FIVE_FILE_DMVERITY); - EXPECT_TRUE(test, inode_eq_iversion(iint->inode, iint->version)); - - five_set_cache_status(NULL, status); -} - -static int security_five_test_init(struct test *test) -{ - return 0; -} - -static void security_five_test_exit(struct test *test) -{ - return; -} - -static struct test_case security_five_test_cases[] = { - TEST_CASE(five_get_cache_status_test), - TEST_CASE(five_set_cache_status_test), - {}, -}; - -static struct test_module security_five_test_module = { - .name = "five-cache-test", - .init = security_five_test_init, - .exit = security_five_test_exit, - .test_cases = security_five_test_cases, -}; -module_test(security_five_test_module); diff --git a/security/samsung/five/kunit_test/five_cert_test.c b/security/samsung/five/kunit_test/five_cert_test.c deleted file mode 100755 index c352b0b66678..000000000000 --- a/security/samsung/five/kunit_test/five_cert_test.c +++ /dev/null @@ -1,285 +0,0 @@ -#include <kunit/test.h> -#include <crypto/hash_info.h> -#include "five_cert.h" - -const static uint8_t hdr[] = {0x01, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}; -static uint8_t hsh[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13}; -static uint8_t lbl[] = {0x01, 0x02, 0x03, 0x04, 0x05}; -static uint8_t sgn[] = {0xab, 0xbc, 0xcd, 0xde, 0xef, 0xf0, 0x01, 0x12, - 0x23, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40}; -static uint8_t cert_data[sizeof(hdr) + sizeof(hsh) + sizeof(lbl) + - + sizeof(struct lv) * 3] = {0}; -static uint8_t cert_data_signed[sizeof(hdr) + sizeof(hsh) + sizeof(lbl) + - sizeof(sgn) + sizeof(struct lv) * 4] = {0}; -const static uint8_t cert_hash[] = {0xae, 0x72, 0xc3, 0xd6, - 0x7e, 0x47, 0x20, 0x7a, 0xec, 0xdb, 0xd5, 0x90, - 0xcb, 0xd2, 0xe4, 0xbe, 0x92, 0x43, 0xf2, 0x46}; - -static void five_cert_body_alloc_test(struct test *test) -{ - uint8_t *raw_cert; - size_t raw_cert_len; - int rc = -1; - int pos = 0; - uint16_t size; - struct five_cert_header header = { - .version = FIVE_CERT_VERSION1, - .privilege = FIVE_PRIV_DEFAULT, - .hash_algo = HASH_ALGO_SHA1, - .signature_type = FIVE_XATTR_HMAC }; - - rc = five_cert_body_alloc(&header, hsh, sizeof(hsh), lbl, - sizeof(lbl), &raw_cert, &raw_cert_len); - - size = *((uint16_t *)&raw_cert[pos]); - EXPECT_EQ(test, size, sizeof(hdr)); - pos += sizeof(struct lv); - rc = memcmp(raw_cert + pos, hdr, sizeof(hdr)); - EXPECT_EQ(test, rc, 0); - pos += sizeof(hdr); - - size = *((uint16_t *)&raw_cert[pos]); - EXPECT_EQ(test, size, sizeof(hsh)); - pos += sizeof(struct lv); - rc = memcmp(raw_cert + pos, hsh, sizeof(hsh)); - EXPECT_EQ(test, rc, 0); - pos += sizeof(hsh); - - size = *((uint16_t *)&raw_cert[pos]); - EXPECT_EQ(test, size, sizeof(lbl)); - pos += sizeof(struct lv); - rc = memcmp(raw_cert + pos, lbl, sizeof(lbl)); - EXPECT_EQ(test, rc, 0); - - rc = five_cert_body_alloc(NULL, hsh, sizeof(hsh), lbl, - sizeof(lbl), &raw_cert, &raw_cert_len); - EXPECT_EQ(test, rc, -EINVAL); - - rc = five_cert_body_alloc(&header, hsh, sizeof(hsh), lbl, - sizeof(lbl), NULL, &raw_cert_len); - EXPECT_EQ(test, rc, -EINVAL); - - rc = five_cert_body_alloc(&header, hsh, sizeof(hsh), lbl, - sizeof(lbl), &raw_cert, NULL); - EXPECT_EQ(test, rc, -EINVAL); - - rc = five_cert_body_alloc(&header, hsh, FIVE_MAX_CERTIFICATE_SIZE, lbl, - sizeof(lbl), &raw_cert, NULL); - EXPECT_EQ(test, rc, -EINVAL); -} - -static void five_cert_free_test(struct test *test) -{ - uint8_t *raw_cert; - - raw_cert = kzalloc(sizeof(cert_data), GFP_NOFS); - ASSERT_NOT_ERR_OR_NULL(test, raw_cert); - - memcpy(raw_cert, cert_data, sizeof(cert_data)); - - five_cert_free(raw_cert); - - SUCCEED(test); -} - -static void five_cert_append_signature_test(struct test *test) -{ - uint8_t *raw_cert; - size_t raw_cert_len = 0; - uint8_t signature[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, - 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff}; - uint16_t *size; - int rc = -1; - - raw_cert = test_kzalloc(test, sizeof(cert_data), GFP_NOFS); - ASSERT_NOT_NULL(test, raw_cert); - - memcpy(raw_cert, cert_data, sizeof(cert_data)); - raw_cert_len = sizeof(cert_data); - - rc = five_cert_append_signature((void **)&raw_cert, &raw_cert_len, - signature, sizeof(signature)); - - EXPECT_EQ(test, rc, 0); - size = (uint16_t *)&raw_cert[sizeof(cert_data)]; - EXPECT_EQ(test, *size, sizeof(signature)); - rc = memcmp(raw_cert + sizeof(cert_data) + sizeof(struct lv), - signature, sizeof(signature)); - EXPECT_EQ(test, rc, 0); - - rc = five_cert_append_signature(NULL, &raw_cert_len, - signature, sizeof(signature)); - EXPECT_EQ(test, rc, -EINVAL); - - rc = five_cert_append_signature((void **)&raw_cert, NULL, - signature, sizeof(signature)); - EXPECT_EQ(test, rc, -EINVAL); - - rc = five_cert_append_signature((void **)&raw_cert, &raw_cert_len, - NULL, sizeof(signature)); - EXPECT_EQ(test, rc, -EINVAL); - - rc = five_cert_append_signature((void **)&raw_cert, &raw_cert_len, - signature, FIVE_MAX_CERTIFICATE_SIZE); - EXPECT_EQ(test, rc, -EINVAL); -} - -static void five_cert_body_fillout_test(struct test *test) -{ - struct five_cert_body body_cert = {0}; - struct five_cert_header *header = NULL; - int rc = -1; - - rc = five_cert_body_fillout(&body_cert, cert_data, sizeof(cert_data)); - - EXPECT_EQ(test, rc, 0); - rc = memcmp(body_cert.header->value, hdr, body_cert.header->length); - EXPECT_EQ(test, rc, 0); - rc = memcmp(body_cert.hash->value, hsh, body_cert.hash->length); - EXPECT_EQ(test, rc, 0); - rc = memcmp(body_cert.label->value, lbl, body_cert.label->length); - EXPECT_EQ(test, rc, 0); - - rc = five_cert_body_fillout(NULL, cert_data, sizeof(cert_data)); - EXPECT_EQ(test, rc, -EINVAL); - - rc = five_cert_body_fillout(&body_cert, NULL, sizeof(cert_data)); - EXPECT_EQ(test, rc, -EINVAL); - - rc = five_cert_body_fillout(&body_cert, cert_data, - FIVE_MAX_CERTIFICATE_SIZE + 1); - EXPECT_EQ(test, rc, -EINVAL); - - rc = five_cert_body_fillout(&body_cert, cert_data, 0); - EXPECT_EQ(test, rc, -EINVAL); - - rc = five_cert_body_fillout(&body_cert, cert_data, - sizeof(cert_data) - 10); - EXPECT_EQ(test, rc, -EINVAL); - - header = (struct five_cert_header *)body_cert.header->value; - header->version = FIVE_CERT_VERSION1 + 1; - rc = five_cert_body_fillout(&body_cert, cert_data, sizeof(cert_data)); - EXPECT_EQ(test, rc, -EINVAL); - - body_cert.header->length = sizeof(*hdr) + 1; - rc = five_cert_body_fillout(&body_cert, cert_data, sizeof(cert_data)); - EXPECT_EQ(test, rc, -EINVAL); -} - -static void five_cert_fillout_test(struct test *test) -{ - struct five_cert cert; - int rc = -1; - - rc = five_cert_fillout(&cert, - cert_data_signed, sizeof(cert_data_signed)); - - EXPECT_EQ(test, rc, 0); - rc = memcmp(cert.body.header->value, hdr, cert.body.header->length); - EXPECT_EQ(test, rc, 0); - rc = memcmp(cert.body.hash->value, hsh, cert.body.hash->length); - EXPECT_EQ(test, rc, 0); - rc = memcmp(cert.body.label->value, lbl, cert.body.label->length); - EXPECT_EQ(test, rc, 0); - rc = memcmp(cert.signature->value, sgn, cert.signature->length); - EXPECT_EQ(test, rc, 0); - - rc = five_cert_fillout(NULL, cert_data, sizeof(cert_data)); - EXPECT_EQ(test, rc, -EINVAL); - - rc = five_cert_fillout(&cert, NULL, sizeof(cert_data)); - EXPECT_EQ(test, rc, -EINVAL); - - rc = five_cert_fillout(&cert, cert_data, - FIVE_MAX_CERTIFICATE_SIZE + 1); - EXPECT_EQ(test, rc, -EINVAL); -} - -static void five_cert_calc_hash_test(struct test *test) -{ - struct five_cert_body body_cert = {0}; - uint8_t out_hash[FIVE_MAX_DIGEST_SIZE] = {0}; - size_t out_hash_len = sizeof(out_hash); - int rc = -1; - - rc = five_cert_body_fillout(&body_cert, cert_data, sizeof(cert_data)); - EXPECT_EQ(test, rc, 0); - rc = five_cert_calc_hash(&body_cert, out_hash, &out_hash_len); - - EXPECT_EQ(test, rc, 0); - EXPECT_EQ(test, out_hash_len, sizeof(cert_hash)); - - rc = memcmp(out_hash, cert_hash, out_hash_len); - EXPECT_EQ(test, rc, 0); - - rc = five_cert_calc_hash(NULL, out_hash, &out_hash_len); - EXPECT_EQ(test, rc, -EINVAL); - - rc = five_cert_calc_hash(&body_cert, NULL, &out_hash_len); - EXPECT_EQ(test, rc, -EINVAL); - - rc = five_cert_calc_hash(&body_cert, out_hash, NULL); - EXPECT_EQ(test, rc, -EINVAL); - - body_cert.header->length = FIVE_MAX_CERTIFICATE_SIZE + 1; - rc = five_cert_calc_hash(&body_cert, out_hash, &out_hash_len); - EXPECT_EQ(test, rc, -EINVAL); -} - -static int security_five_test_init(struct test *test) -{ - int pos = 0; - uint16_t *size; - - size = (uint16_t *)&cert_data[pos]; - *size = sizeof(hdr); - pos += sizeof(*size); - memcpy(cert_data + pos, hdr, sizeof(hdr)); - pos += sizeof(hdr); - - size = (uint16_t *)&cert_data[pos]; - *size = sizeof(hsh); - pos += sizeof(*size); - memcpy(cert_data + pos, hsh, sizeof(hsh)); - pos += sizeof(hsh); - - size = (uint16_t *)&cert_data[pos]; - *size = sizeof(lbl); - pos += sizeof(*size); - memcpy(cert_data + pos, lbl, sizeof(lbl)); - pos += sizeof(lbl); - - memcpy(cert_data_signed, cert_data, sizeof(cert_data)); - size = (uint16_t *)&cert_data_signed[pos]; - *size = sizeof(sgn); - pos += sizeof(*size); - memcpy(cert_data_signed + pos, sgn, sizeof(sgn)); - - return 0; -} - -static void security_five_test_exit(struct test *test) -{ - return; -} - -static struct test_case security_five_test_cases[] = { - TEST_CASE(five_cert_body_alloc_test), - TEST_CASE(five_cert_free_test), - TEST_CASE(five_cert_body_fillout_test), - TEST_CASE(five_cert_fillout_test), - TEST_CASE(five_cert_append_signature_test), - TEST_CASE(five_cert_calc_hash_test), - {}, -}; - -static struct test_module security_five_test_module = { - .name = "five-cert-test", - .init = security_five_test_init, - .exit = security_five_test_exit, - .test_cases = security_five_test_cases, -}; -module_test(security_five_test_module); diff --git a/security/samsung/five/kunit_test/five_crypto_test.c b/security/samsung/five/kunit_test/five_crypto_test.c deleted file mode 100755 index 4a07d0230903..000000000000 --- a/security/samsung/five/kunit_test/five_crypto_test.c +++ /dev/null @@ -1,131 +0,0 @@ -#include <kunit/test.h> -#include <crypto/hash_info.h> -#include <linux/fs.h> -#include "five_crypto.h" -#include "five_file.h" - -static uint8_t test_str[] = "hash_test_string"; -static uint8_t file_hash_sha512[] = { - 0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd, - 0xf1, 0x54, 0x28, 0x50, 0xd6, 0x6d, 0x80, 0x07, - 0xd6, 0x20, 0xe4, 0x05, 0x0b, 0x57, 0x15, 0xdc, - 0x83, 0xf4, 0xa9, 0x21, 0xd3, 0x6c, 0xe9, 0xce, - 0x47, 0xd0, 0xd1, 0x3c, 0x5d, 0x85, 0xf2, 0xb0, - 0xff, 0x83, 0x18, 0xd2, 0x87, 0x7e, 0xec, 0x2f, - 0x63, 0xb9, 0x31, 0xbd, 0x47, 0x41, 0x7a, 0x81, - 0xa5, 0x38, 0x32, 0x7a, 0xf9, 0x27, 0xda, 0x3e}; -static uint8_t file_hash_sha256[] = { - 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, - 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, - 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, - 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}; -static uint8_t file_hash_sha1[] = { - 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, - 0x32, 0x55, 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, - 0xaf, 0xd8, 0x07, 0x09}; -static uint8_t cert_hash_sha1[] = { - 0x7a, 0x18, 0x6b, 0x28, 0xd2, 0xf8, 0xac, 0x24, - 0xfa, 0x56, 0xa3, 0x5a, 0xe4, 0x81, 0x0d, 0xea, - 0xd4, 0x56, 0x42, 0xe5}; -static uint8_t filename[] = "/testfile"; - -static void five_calc_file_hash_sha1_test(struct test *test) -{ - struct file *file; - uint8_t hash[SHA1_DIGEST_SIZE]; - size_t hash_len = -1; - int rc = -1; - - file = test_open_file(filename); - ASSERT_NOT_ERR_OR_NULL(test, file); - vfs_write(file, test_str, sizeof(test_str), 0); - - rc = five_calc_file_hash(file, HASH_ALGO_SHA1, hash, &hash_len); - - EXPECT_EQ(test, rc, 0); - EXPECT_EQ(test, hash_len, SHA1_DIGEST_SIZE); - rc = memcmp(hash, file_hash_sha1, SHA1_DIGEST_SIZE); - test_close_file(file); - EXPECT_EQ(test, rc, 0); -} - -static void five_calc_file_hash_sha256_test(struct test *test) -{ - struct file *file; - uint8_t hash[SHA256_DIGEST_SIZE]; - size_t hash_len = -1; - int rc = -1; - - file = test_open_file(filename); - ASSERT_NOT_ERR_OR_NULL(test, file); - vfs_write(file, test_str, sizeof(test_str), 0); - - rc = five_calc_file_hash(file, HASH_ALGO_SHA256, hash, &hash_len); - - EXPECT_EQ(test, rc, 0); - EXPECT_EQ(test, hash_len, SHA256_DIGEST_SIZE); - rc = memcmp(hash, file_hash_sha256, SHA256_DIGEST_SIZE); - test_close_file(file); - EXPECT_EQ(test, rc, 0); -} - -static void five_calc_file_hash_sha512_test(struct test *test) -{ - struct file *file; - uint8_t hash[SHA512_DIGEST_SIZE]; - size_t hash_len = -1; - int rc = -1; - - file = test_open_file(filename); - ASSERT_NOT_ERR_OR_NULL(test, file); - vfs_write(file, test_str, sizeof(test_str), 0); - - rc = five_calc_file_hash(file, HASH_ALGO_SHA512, hash, &hash_len); - - EXPECT_EQ(test, rc, 0); - EXPECT_EQ(test, hash_len, SHA512_DIGEST_SIZE); - rc = memcmp(hash, file_hash_sha512, SHA512_DIGEST_SIZE); - test_close_file(file); - EXPECT_EQ(test, rc, 0); -} - -static void five_calc_data_hash_test(struct test *test) -{ - uint8_t hash[SHA1_DIGEST_SIZE]; - size_t hash_len = -1; - int rc = -1; - - rc = five_calc_data_hash(test_str, sizeof(test_str), HASH_ALGO_SHA1, - hash, &hash_len); - - EXPECT_EQ(test, rc, 0); - EXPECT_EQ(test, hash_len, SHA1_DIGEST_SIZE); - rc = memcmp(hash, cert_hash_sha1, SHA1_DIGEST_SIZE); - EXPECT_EQ(test, rc, 0); -} - -static int security_five_test_init(struct test *test) -{ - return 0; -} - -static void security_five_test_exit(struct test *test) -{ - return; -} - -static struct test_case security_five_test_cases[] = { - TEST_CASE(five_calc_file_hash_sha1_test), - TEST_CASE(five_calc_file_hash_sha256_test), - TEST_CASE(five_calc_file_hash_sha512_test), - TEST_CASE(five_calc_data_hash_test), - {}, -}; - -static struct test_module security_five_test_module = { - .name = "five-crypto-test", - .init = security_five_test_init, - .exit = security_five_test_exit, - .test_cases = security_five_test_cases, -}; -module_test(security_five_test_module); diff --git a/security/samsung/five/kunit_test/five_dmverity_test.c b/security/samsung/five/kunit_test/five_dmverity_test.c deleted file mode 100755 index 35e46883e007..000000000000 --- a/security/samsung/five/kunit_test/five_dmverity_test.c +++ /dev/null @@ -1,703 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ -#include "drivers/md/dm.h" -#include "drivers/md/dm-core.h" -#include "drivers/block/loop.h" - -#include "five_dmverity.h" -#include "test_helpers.h" - -bool is_loop_device(const struct file *file); -enum five_dmverity_codes is_dmverity_partition(const struct file *file); -enum five_dmverity_codes is_dmverity_loop(const struct file *file); -bool five_is_dmverity_protected(const struct file *file); -#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) || defined(CONFIG_FIVE_DEBUG) -extern bool check_prebuilt_paths_dmverity; -#endif - -#define MAJOR_INV(dev) ((unsigned int) ((dev) << MINORBITS)) - -// any random dev different from MAJOR_INV(LOOP_MAJOR) -#define RANDOM_DEV (LOOP_MAJOR + 1) -#define SRCU_IDX 2020 // any int number -#define S_DEV 2019 // any int number - -DEFINE_FUNCTION_MOCK( - METHOD(call_dm_get_md), RETURNS(struct mapped_device *), PARAMS(dev_t)); - -DEFINE_FUNCTION_MOCK( - METHOD(call_dm_get_live_table), RETURNS(struct dm_table *), - PARAMS(struct mapped_device *, int *)); - -DEFINE_FUNCTION_MOCK( - METHOD(call_dm_table_get_mode), RETURNS(fmode_t), - PARAMS(struct dm_table *)); - -DEFINE_FUNCTION_MOCK( - METHOD(call_dm_table_get_num_targets), RETURNS(unsigned int), - PARAMS(struct dm_table *)); - -DEFINE_FUNCTION_MOCK( - METHOD(call_dm_table_get_target), RETURNS(struct dm_target *), - PARAMS(struct dm_table *, unsigned int)); - -DEFINE_FUNCTION_MOCK( - METHOD(call_blkdev_get_by_dev), RETURNS(struct block_device *), - PARAMS(dev_t, fmode_t, void *)); - -DEFINE_FUNCTION_MOCK_VOID_RETURN( - METHOD(call_dm_put_live_table), PARAMS(struct mapped_device *, int)); - -DEFINE_FUNCTION_MOCK_VOID_RETURN( - METHOD(call_dm_put), PARAMS(struct mapped_device *)); - -DEFINE_FUNCTION_MOCK_VOID_RETURN( - METHOD(call_blkdev_put), PARAMS(struct block_device *, fmode_t)); - -#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) || defined(CONFIG_FIVE_DEBUG) -DECLARE_FUNCTION_MOCK( - METHOD(five_d_path), RETURNS(const char *), - PARAMS(const struct path *, char **, char *)); -#endif - -typedef struct {int foo; } fake_dm_table_t; - -static struct file *create_file_obj(struct test *test) -{ - DECLARE_NEW(test, struct file, foo); - - foo->f_inode = NEW(test, struct inode); - foo->f_inode->i_sb = NEW(test, struct super_block); - return foo; -} - -static struct mapped_device *create_mapped_device_obj( - struct test *test, int policy, char *disk_name) -{ - DECLARE_NEW(test, struct mapped_device, foo); - - foo->disk = NEW(test, struct gendisk); - foo->disk->part0.policy = policy; - if (strlen(disk_name) < DISK_NAME_LEN) - strncpy(foo->disk->disk_name, disk_name, strlen(disk_name) + 1); - return foo; -} - -static void five_dmverity_is_loop_device_null_inode_test(struct test *test) -{ - DECLARE_NEW(test, struct file, p_file); - - p_file->f_inode = NULL; - EXPECT_FALSE(test, is_loop_device(p_file)); -} - -static void five_dmverity_is_loop_device_null_sb_test(struct test *test) -{ - DECLARE_NEW(test, struct file, p_file); - - p_file->f_inode = NEW(test, struct inode);; - p_file->f_inode->i_sb = NULL; - - EXPECT_FALSE(test, is_loop_device(p_file)); -} - -static void five_dmverity_is_loop_device_wrong_s_dev_test(struct test *test) -{ - struct file *p_file = create_file_obj(test); - - p_file->f_inode->i_sb->s_dev = RANDOM_DEV; - - EXPECT_FALSE(test, is_loop_device(p_file)); -} - -static void five_dmverity_is_loop_device_correct_s_dev_test(struct test *test) -{ - struct file *p_file = create_file_obj(test); - - p_file->f_inode->i_sb->s_dev = MAJOR_INV(LOOP_MAJOR); - - EXPECT_TRUE(test, is_loop_device(p_file)); -} - -static void five_dmverity_is_dmverity_partition_null_inode_test( - struct test *test) -{ - DECLARE_NEW(test, struct file, p_file); - - p_file->f_inode = NULL; - - EXPECT_EQ(test, is_dmverity_partition(p_file), FIVE_DMV_BAD_INPUT); -} - -static void five_dmverity_is_dmverity_partition_null_sb_test( - struct test *test) -{ - DECLARE_NEW(test, struct file, p_file); - - p_file->f_inode = NEW(test, struct inode); - p_file->f_inode->i_sb = NULL; - - EXPECT_EQ(test, is_dmverity_partition(p_file), FIVE_DMV_BAD_INPUT); -} - -static void five_dmverity_is_dmverity_partition_null_md_test( - struct test *test) -{ - struct file *p_file = create_file_obj(test); - - p_file->f_inode->i_sb->s_dev = RANDOM_DEV; - Returns(EXPECT_CALL( - call_dm_get_md( - int_eq(test, RANDOM_DEV))), ptr_return(test, NULL)); - - EXPECT_EQ(test, is_dmverity_partition(p_file), FIVE_DMV_NO_DM_DEVICE); -} - -static void five_dmverity_is_dmverity_partition_null_disc_test( - struct test *test) -{ - DECLARE_NEW(test, struct mapped_device, md); - struct file *p_file = create_file_obj(test); - - md->disk = NULL; - - Returns(EXPECT_CALL(call_dm_get_md(any(test))), ptr_return(test, md)); - Returns(EXPECT_CALL( - call_dm_put(ptr_eq(test, md))), int_return(test, 0)); - - EXPECT_EQ(test, is_dmverity_partition(p_file), FIVE_DMV_NO_DM_DISK); -} - -static void five_dmverity_is_dmverity_partition_not_ro_disc_test( - struct test *test) -{ - struct file *p_file = create_file_obj(test); - struct mapped_device *md = create_mapped_device_obj(test, 0, ""); - - Returns(EXPECT_CALL(call_dm_get_md(any(test))), ptr_return(test, md)); - Returns(EXPECT_CALL( - call_dm_put(ptr_eq(test, md))), int_return(test, 0)); - - EXPECT_EQ(test, - is_dmverity_partition(p_file), FIVE_DMV_NOT_READONLY_DM_DISK); -} - -static void five_dmverity_is_dmverity_partition_bad_prefix_test( - struct test *test) -{ - struct file *p_file = create_file_obj(test); - struct mapped_device *md = create_mapped_device_obj(test, !0, "xxxxx"); - - Returns(EXPECT_CALL(call_dm_get_md(any(test))), ptr_return(test, md)); - Returns(EXPECT_CALL( - call_dm_put(ptr_eq(test, md))), int_return(test, 0)); - - EXPECT_EQ(test, - is_dmverity_partition(p_file), FIVE_DMV_BAD_DM_PREFIX_NAME); -} - -static void five_dmverity_is_dmverity_partition_no_table_test( - struct test *test) -{ - struct file *p_file = create_file_obj(test); - struct mapped_device *md = create_mapped_device_obj(test, !0, "dm-xxx"); - - Returns(EXPECT_CALL(call_dm_get_md( - any(test))), ptr_return(test, md)); - Returns(EXPECT_CALL(call_dm_get_live_table( - ptr_eq(test, md), any(test))), ptr_return(test, NULL)); - Returns(EXPECT_CALL( - call_dm_put(ptr_eq(test, md))), int_return(test, 0)); - - EXPECT_EQ(test, is_dmverity_partition(p_file), FIVE_DMV_NO_DM_TABLE); -} - -static fake_dm_table_t *fke_table; -void *dm_get_live_table_action( - struct mock_action *this, const void **params, int len) -{ - const int **foo; - - if (2 != len) { - pr_err("Wrong number of params!"); - return NULL; - } - foo = (const int **)params[1]; - *(int *)(*foo) = SRCU_IDX; - return &fke_table; -} - -static void five_dmverity_is_dmverity_partition_not_ro_table_test( - struct test *test) -{ - struct file *p_file = create_file_obj(test); - struct mapped_device *md = create_mapped_device_obj(test, !0, "dm-xxx"); - - fke_table = NEW(test, fake_dm_table_t); - - Returns(EXPECT_CALL(call_dm_get_md(any(test))), ptr_return(test, md)); - ActionOnMatch(EXPECT_CALL(call_dm_get_live_table( - any(test), any(test))), - new_mock_action(test, dm_get_live_table_action)); - Returns(EXPECT_CALL(call_dm_table_get_mode( - ptr_eq(test, fke_table))), int_return(test, 2)); - Returns(EXPECT_CALL(call_dm_put_live_table( - ptr_eq(test, md), int_eq(test, SRCU_IDX))), - int_return(test, 0)); - Returns(EXPECT_CALL( - call_dm_put(ptr_eq(test, md))), int_return(test, 0)); - - EXPECT_EQ(test, - is_dmverity_partition(p_file), FIVE_DMV_NOT_READONLY_DM_TABLE); -} - -static void five_dmverity_is_dmverity_partition_no_target_test( - struct test *test) -{ - struct file *p_file = create_file_obj(test); - struct mapped_device *md = create_mapped_device_obj(test, !0, "dm-xxx"); - fake_dm_table_t *fake_table = NEW(test, fake_dm_table_t); - - Returns(EXPECT_CALL(call_dm_get_md(any(test))), ptr_return(test, md)); - Returns(EXPECT_CALL(call_dm_get_live_table( - any(test), any(test))), - ptr_return(test, fake_table)); - Returns(EXPECT_CALL(call_dm_table_get_mode(any(test))), - int_return(test, 1)); // return any value <= 1 - Returns(EXPECT_CALL(call_dm_table_get_num_targets( - ptr_eq(test, fake_table))), - int_return(test, 8841)); // any value. Won't be analyzed. - Returns(EXPECT_CALL(call_dm_table_get_target( - any(test), int_eq(test, 0))), - ptr_return(test, NULL)); - Returns(EXPECT_CALL(call_dm_put_live_table( - ptr_eq(test, md), any(test))), int_return(test, 0)); - Returns(EXPECT_CALL( - call_dm_put(ptr_eq(test, md))), int_return(test, 0)); - - EXPECT_EQ(test, is_dmverity_partition(p_file), FIVE_DMV_NO_DM_TARGET); -} - -static void five_dmverity_is_dmverity_partition_not_single_target_test( - struct test *test) -{ - struct file *p_file = create_file_obj(test); - struct mapped_device *md = create_mapped_device_obj(test, !0, "dm-xxx"); - fake_dm_table_t *fake_table = NEW(test, fake_dm_table_t); - struct dm_target *target = NEW(test, struct dm_target); - - Returns(EXPECT_CALL(call_dm_get_md(any(test))), ptr_return(test, md)); - Returns(EXPECT_CALL(call_dm_get_live_table( - any(test), any(test))), - ptr_return(test, fake_table)); - Returns(EXPECT_CALL(call_dm_table_get_mode(any(test))), - int_return(test, 1)); // return any value <= 1 - Returns(EXPECT_CALL(call_dm_table_get_num_targets(any(test))), - int_return(test, 2020)); // any value. Won't be analyzed. - Returns(EXPECT_CALL(call_dm_table_get_target( - any(test), int_eq(test, 0))), - ptr_return(test, target)); - Returns(EXPECT_CALL(call_dm_put_live_table( - ptr_eq(test, md), any(test))), int_return(test, 0)); - Returns(EXPECT_CALL( - call_dm_put(ptr_eq(test, md))), int_return(test, 0)); - - EXPECT_EQ(test, - is_dmverity_partition(p_file), FIVE_DMV_NOT_SINGLE_TARGET); -} - -static void five_dmverity_is_dmverity_partition_no_target_name_test( - struct test *test) -{ - const char target_name[] = "wrong name"; - struct file *p_file = create_file_obj(test); - struct mapped_device *md = create_mapped_device_obj(test, !0, "dm-xxx"); - fake_dm_table_t *fake_table = NEW(test, fake_dm_table_t); - struct dm_target *target = NEW(test, struct dm_target); - - target->type = NEW(test, struct target_type); - target->type->name = target_name; - - Returns(EXPECT_CALL(call_dm_get_md(any(test))), ptr_return(test, md)); - Returns(EXPECT_CALL(call_dm_get_live_table( - any(test), any(test))), - ptr_return(test, fake_table)); - Returns(EXPECT_CALL(call_dm_table_get_mode(any(test))), - int_return(test, 1)); // return any value <= 1 - Returns(EXPECT_CALL(call_dm_table_get_num_targets(any(test))), - int_return(test, 1)); // any value equal to 1 - Returns(EXPECT_CALL(call_dm_table_get_target( - any(test), int_eq(test, 0))), - ptr_return(test, target)); - Returns(EXPECT_CALL(call_dm_put_live_table( - ptr_eq(test, md), any(test))), int_return(test, 0)); - Returns(EXPECT_CALL( - call_dm_put(ptr_eq(test, md))), int_return(test, 0)); - - EXPECT_EQ(test, - is_dmverity_partition(p_file), FIVE_DMV_NO_DM_TARGET_NAME); -} - -static void five_dmverity_is_dmverity_partition_verity_test(struct test *test) -{ - const char target_name[] = "verity"; - struct file *p_file = create_file_obj(test); - struct mapped_device *md = create_mapped_device_obj(test, !0, "dm-xxx"); - fake_dm_table_t *fake_table = NEW(test, fake_dm_table_t); - struct dm_target *target = NEW(test, struct dm_target); - - target->type = NEW(test, struct target_type); - target->type->name = target_name; - - Returns(EXPECT_CALL(call_dm_get_md(any(test))), ptr_return(test, md)); - Returns(EXPECT_CALL(call_dm_get_live_table( - any(test), any(test))), - ptr_return(test, fake_table)); - Returns(EXPECT_CALL(call_dm_table_get_mode(any(test))), - int_return(test, 1)); // return any value <= 1 - Returns(EXPECT_CALL(call_dm_table_get_num_targets(any(test))), - int_return(test, 1)); // any value equal to 1 - Returns(EXPECT_CALL(call_dm_table_get_target( - any(test), int_eq(test, 0))), - ptr_return(test, target)); - Returns(EXPECT_CALL(call_dm_put_live_table( - ptr_eq(test, md), any(test))), int_return(test, 0)); - Returns(EXPECT_CALL( - call_dm_put(ptr_eq(test, md))), int_return(test, 0)); - - EXPECT_EQ(test, is_dmverity_partition(p_file), FIVE_DMV_PARTITION); -} - -static void five_dmverity_is_dmverity_partition_verity_fec_test( - struct test *test) -{ - const char target_name[] = "verity-fec"; - struct file *p_file = create_file_obj(test); - struct mapped_device *md = create_mapped_device_obj(test, !0, "dm-xxx"); - fake_dm_table_t *fake_table = NEW(test, fake_dm_table_t); - struct dm_target *target = NEW(test, struct dm_target); - - target->type = NEW(test, struct target_type); - target->type->name = target_name; - - Returns(EXPECT_CALL(call_dm_get_md(any(test))), ptr_return(test, md)); - Returns(EXPECT_CALL(call_dm_get_live_table( - any(test), any(test))), - ptr_return(test, fake_table)); - Returns(EXPECT_CALL(call_dm_table_get_mode(any(test))), - int_return(test, 1)); // return any value <= 1 - Returns(EXPECT_CALL(call_dm_table_get_num_targets(any(test))), - int_return(test, 1)); // any value equal to 1 - Returns(EXPECT_CALL(call_dm_table_get_target( - any(test), int_eq(test, 0))), - ptr_return(test, target)); - Returns(EXPECT_CALL(call_dm_put_live_table( - ptr_eq(test, md), any(test))), int_return(test, 0)); - Returns(EXPECT_CALL( - call_dm_put(ptr_eq(test, md))), int_return(test, 0)); - - EXPECT_EQ(test, - is_dmverity_partition(p_file), FIVE_DMV_PARTITION); -} - -static void five_dmverity_is_dmverity_loop_wrong_bdev_test( - struct test *test) -{ - struct file *p_file = create_file_obj(test); - - p_file->f_inode->i_sb->s_dev = MAJOR_INV(LOOP_MAJOR); - - Returns(EXPECT_CALL(call_blkdev_get_by_dev( - int_eq(test, p_file->f_inode->i_sb->s_dev), - int_eq(test, FMODE_READ), ptr_eq(test, NULL))), - ptr_return(test, NULL)); - - EXPECT_EQ(test, is_dmverity_loop(p_file), FIVE_DMV_NO_BD_LOOP_DEVICE); -} - -static void five_dmverity_is_dmverity_loop_wrong_bd_dev_test( - struct test *test) -{ - struct file *p_file = create_file_obj(test); - struct block_device *bdev = NEW(test, struct block_device); - - p_file->f_inode->i_sb->s_dev = MAJOR_INV(LOOP_MAJOR); - bdev->bd_dev = RANDOM_DEV; - - Returns(EXPECT_CALL(call_blkdev_get_by_dev( - int_eq(test, p_file->f_inode->i_sb->s_dev), - int_eq(test, FMODE_READ), ptr_eq(test, NULL))), - ptr_return(test, bdev)); - - EXPECT_EQ(test, is_dmverity_loop(p_file), FIVE_DMV_NO_BD_LOOP_DEVICE); -} - -static void five_dmverity_is_dmverity_loop_null_bd_disk_test( - struct test *test) -{ - struct file *p_file = create_file_obj(test); - struct block_device *bdev = NEW(test, struct block_device); - - p_file->f_inode->i_sb->s_dev = MAJOR_INV(LOOP_MAJOR); - bdev->bd_dev = MAJOR_INV(LOOP_MAJOR); - bdev->bd_disk = NULL; - - Returns(EXPECT_CALL(call_blkdev_get_by_dev( - int_eq(test, p_file->f_inode->i_sb->s_dev), - int_eq(test, FMODE_READ), ptr_eq(test, NULL))), - ptr_return(test, bdev)); - Returns(EXPECT_CALL(call_blkdev_put( - ptr_eq(test, bdev), - int_eq(test, FMODE_READ))), int_return(test, 0)); - - EXPECT_EQ(test, is_dmverity_loop(p_file), FIVE_DMV_NO_BD_DISK); -} - -static void five_dmverity_is_dmverity_loop_null_private_data_test( - struct test *test) -{ - struct file *p_file = create_file_obj(test); - struct block_device *bdev = NEW(test, struct block_device); - - p_file->f_inode->i_sb->s_dev = MAJOR_INV(LOOP_MAJOR); - bdev->bd_dev = MAJOR_INV(LOOP_MAJOR); - bdev->bd_disk = NEW(test, struct gendisk); - bdev->bd_disk->private_data = NULL; - - Returns(EXPECT_CALL(call_blkdev_get_by_dev( - int_eq(test, p_file->f_inode->i_sb->s_dev), - int_eq(test, FMODE_READ), ptr_eq(test, NULL))), - ptr_return(test, bdev)); - Returns(EXPECT_CALL(call_blkdev_put( - ptr_eq(test, bdev), - int_eq(test, FMODE_READ))), int_return(test, 0)); - - EXPECT_EQ(test, is_dmverity_loop(p_file), FIVE_DMV_NO_LOOP_DEV); -} - -static void five_dmverity_is_dmverity_loop_null_back_file_test( - struct test *test) -{ - struct loop_device *p_loop_device; - struct file *p_file = create_file_obj(test); - struct block_device *bdev = NEW(test, struct block_device); - - p_file->f_inode->i_sb->s_dev = MAJOR_INV(LOOP_MAJOR); - bdev->bd_dev = MAJOR_INV(LOOP_MAJOR); - bdev->bd_disk = NEW(test, struct gendisk); - bdev->bd_disk->private_data = NEW(test, struct loop_device); - p_loop_device = bdev->bd_disk->private_data; - p_loop_device->lo_backing_file = NULL; - - Returns(EXPECT_CALL(call_blkdev_get_by_dev( - int_eq(test, p_file->f_inode->i_sb->s_dev), - int_eq(test, FMODE_READ), ptr_eq(test, NULL))), - ptr_return(test, bdev)); - Returns(EXPECT_CALL(call_blkdev_put( - ptr_eq(test, bdev), - int_eq(test, FMODE_READ))), int_return(test, 0)); - - EXPECT_EQ(test, is_dmverity_loop(p_file), FIVE_DMV_NO_LOOP_BACK_FILE); -} - -static void five_dmverity_is_dmverity_loop_correct_back_file_test( - struct test *test) -{ - struct loop_device *p_loop_device; - struct file *p_file = create_file_obj(test); - struct block_device *bdev = NEW(test, struct block_device); - - p_file->f_inode->i_sb->s_dev = MAJOR_INV(LOOP_MAJOR); - bdev->bd_dev = MAJOR_INV(LOOP_MAJOR); - bdev->bd_disk = NEW(test, struct gendisk); - bdev->bd_disk->private_data = NEW(test, struct loop_device); - p_loop_device = bdev->bd_disk->private_data; - p_loop_device->lo_backing_file = NEW(test, struct file); - p_loop_device->lo_backing_file->f_inode = NULL; - - Returns(EXPECT_CALL(call_blkdev_get_by_dev( - int_eq(test, p_file->f_inode->i_sb->s_dev), - int_eq(test, FMODE_READ), ptr_eq(test, NULL))), - ptr_return(test, bdev)); - Returns(EXPECT_CALL(call_blkdev_put( - ptr_eq(test, bdev), - int_eq(test, FMODE_READ))), int_return(test, 0)); - - EXPECT_EQ(test, is_dmverity_loop(p_file), FIVE_DMV_BAD_INPUT); -} - -static void five_dmverity_is_dmverity_protected_null_file_test( - struct test *test) -{ - EXPECT_FALSE(test, five_is_dmverity_protected(NULL)); -} - -#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) || defined(CONFIG_FIVE_DEBUG) -static void five_check_prebuilt_paths_false_test( - struct test *test) -{ - char pathname[] = "xxx"; - DECLARE_NEW(test, struct file, p_file); - - check_prebuilt_paths_dmverity = true; - - Returns(EXPECT_CALL(five_d_path( - ptr_eq(test, &p_file->f_path), - any(test), any(test))), - ptr_return(test, pathname)); - - EXPECT_FALSE(test, five_is_dmverity_protected(p_file)); - check_prebuilt_paths_dmverity = false; -} - -static void five_check_prebuilt_paths_true_test( - struct test *test) -{ - char pathname[] = "/apex/"; - DECLARE_NEW(test, struct file, p_file); - - check_prebuilt_paths_dmverity = true; - - Returns(EXPECT_CALL(five_d_path( - ptr_eq(test, &p_file->f_path), - any(test), any(test))), - ptr_return(test, pathname)); - - EXPECT_TRUE(test, five_is_dmverity_protected(p_file)); - - check_prebuilt_paths_dmverity = false; -} -#endif - -static void five_dmverity_is_dmverity_protected_loop_device_test( - struct test *test) -{ - struct file *p_file = create_file_obj(test); -#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) || defined(CONFIG_FIVE_DEBUG) - char pathname[] = "xxx"; - - Returns(EXPECT_CALL(five_d_path( - ptr_eq(test, &p_file->f_path), - any(test), any(test))), - ptr_return(test, pathname)); -#endif - - p_file->f_inode->i_sb->s_dev = MAJOR_INV(LOOP_MAJOR); - Returns(EXPECT_CALL(call_blkdev_get_by_dev( - int_eq(test, p_file->f_inode->i_sb->s_dev), - int_eq(test, FMODE_READ), ptr_eq(test, NULL))), - ptr_return(test, NULL)); - - EXPECT_FALSE(test, five_is_dmverity_protected(p_file)); -} - -static void five_dmvrt_is_dmverity_protected_non_loop_device_false_test( - struct test *test) -{ - struct file *p_file = create_file_obj(test); -#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) || defined(CONFIG_FIVE_DEBUG) - char pathname[] = "xxx"; - - Returns(EXPECT_CALL(five_d_path( - ptr_eq(test, &p_file->f_path), - any(test), any(test))), - ptr_return(test, pathname)); -#endif - - p_file->f_inode->i_sb->s_dev = RANDOM_DEV; - Returns(EXPECT_CALL(call_dm_get_md( - int_eq(test, p_file->f_inode->i_sb->s_dev))), - ptr_return(test, NULL)); - - EXPECT_FALSE(test, five_is_dmverity_protected(p_file)); -} - -static void five_dmvrt_is_dmverity_protected_non_loop_device_true_test( - struct test *test) -{ - const char target_name[] = "verity"; - struct file *p_file = create_file_obj(test); - struct mapped_device *md = create_mapped_device_obj(test, !0, "dm-xxx"); - struct fake_dm_table {} *fake_table = NEW(test, struct fake_dm_table); - struct dm_target *target = NEW(test, struct dm_target); - - target->type = NEW(test, struct target_type); - target->type->name = target_name; - - Returns(EXPECT_CALL(call_dm_get_md(any(test))), ptr_return(test, md)); - Returns(EXPECT_CALL(call_dm_get_live_table( - any(test), any(test))), - ptr_return(test, fake_table)); - Returns(EXPECT_CALL(call_dm_table_get_mode(any(test))), - int_return(test, 1)); // return any value <= 1 - Returns(EXPECT_CALL(call_dm_table_get_num_targets(any(test))), - int_return(test, 1)); // any value equal to 1 - Returns(EXPECT_CALL(call_dm_table_get_target( - any(test), int_eq(test, 0))), - ptr_return(test, target)); - Returns(EXPECT_CALL(call_dm_put_live_table( - ptr_eq(test, md), any(test))), int_return(test, 0)); - Returns(EXPECT_CALL( - call_dm_put(ptr_eq(test, md))), int_return(test, 0)); - - EXPECT_TRUE(test, five_is_dmverity_protected(p_file)); -} - -static struct test_case five_dmverity_test_cases[] = { - TEST_CASE(five_dmverity_is_loop_device_null_inode_test), - TEST_CASE(five_dmverity_is_loop_device_null_sb_test), - TEST_CASE(five_dmverity_is_loop_device_wrong_s_dev_test), - TEST_CASE(five_dmverity_is_loop_device_correct_s_dev_test), - TEST_CASE(five_dmverity_is_dmverity_partition_null_inode_test), - TEST_CASE(five_dmverity_is_dmverity_partition_null_sb_test), - TEST_CASE(five_dmverity_is_dmverity_partition_null_md_test), - TEST_CASE(five_dmverity_is_dmverity_partition_null_disc_test), - TEST_CASE(five_dmverity_is_dmverity_partition_not_ro_disc_test), - TEST_CASE(five_dmverity_is_dmverity_partition_bad_prefix_test), - TEST_CASE(five_dmverity_is_dmverity_partition_no_table_test), - TEST_CASE(five_dmverity_is_dmverity_partition_not_ro_table_test), - TEST_CASE(five_dmverity_is_dmverity_partition_no_target_test), - TEST_CASE(five_dmverity_is_dmverity_partition_not_single_target_test), - TEST_CASE(five_dmverity_is_dmverity_partition_no_target_name_test), - TEST_CASE(five_dmverity_is_dmverity_partition_verity_test), - TEST_CASE(five_dmverity_is_dmverity_partition_verity_fec_test), - TEST_CASE(five_dmverity_is_dmverity_loop_wrong_bdev_test), - TEST_CASE(five_dmverity_is_dmverity_loop_wrong_bd_dev_test), - TEST_CASE(five_dmverity_is_dmverity_loop_null_bd_disk_test), - TEST_CASE(five_dmverity_is_dmverity_loop_null_private_data_test), - TEST_CASE(five_dmverity_is_dmverity_loop_null_back_file_test), - TEST_CASE(five_dmverity_is_dmverity_loop_correct_back_file_test), - TEST_CASE(five_dmverity_is_dmverity_protected_null_file_test), -#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) || defined(CONFIG_FIVE_DEBUG) - TEST_CASE(five_check_prebuilt_paths_false_test), - TEST_CASE(five_check_prebuilt_paths_true_test), -#endif - TEST_CASE(five_dmverity_is_dmverity_protected_loop_device_test), - TEST_CASE(five_dmvrt_is_dmverity_protected_non_loop_device_false_test), - TEST_CASE(five_dmvrt_is_dmverity_protected_non_loop_device_true_test), - {}, -}; - -static int five_dmverity_test_init(struct test *test) -{ - return 0; -} - -static void five_dmverity_test_exit(struct test *test) -{ - return; -} - -static struct test_module five_dmverity_test_module = { - .name = "five_dmverity_test", - .init = five_dmverity_test_init, - .exit = five_dmverity_test_exit, - .test_cases = five_dmverity_test_cases, -}; - -module_test(five_dmverity_test_module); diff --git a/security/samsung/five/kunit_test/five_dsms_test.c b/security/samsung/five/kunit_test/five_dsms_test.c deleted file mode 100755 index 9d997413ed90..000000000000 --- a/security/samsung/five/kunit_test/five_dsms_test.c +++ /dev/null @@ -1,285 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ -#include <kunit/test.h> -#include <kunit/mock.h> - -#include "five.h" - -void five_dsms_sign_err(const char *app, int result); -void five_dsms_reset_integrity(const char *task_name, int result, - const char *file_name); -void five_dsms_init(const char *version, int result); - -#define MAX_FIV1_NUM 16 -#define FIV3_FIRST 1 -#define FIV3_FEW 20 -#define FIV3_LOT 100 -#define MAX_FIV2_NUM 96 - -#define MESSAGE_BUFFER_SIZE 600 -#define LARGE_FILE_NAME_SIZE (2*MESSAGE_BUFFER_SIZE) -#define LARGE_COMM_SIZE (2*MESSAGE_BUFFER_SIZE) -#define PARAM_COMM_RAND 5 -#define PARAM_RESULT_RAND 10 -#define PARAM_EVENT_COUNT_RAND 2020 -#define CRC_VALUE_NO_MATTER 37 // any uint16 -#define FILE_NAME_0 "foo/bar" -#define FILE_NAME_1 "bar/qux" -#define FILE_NAME_2 "foo" - -DEFINE_FUNCTION_MOCK_VOID_RETURN(five_dsms_msg, PARAMS(char *, char *)) - -DEFINE_FUNCTION_MOCK( - METHOD(call_crc16), RETURNS(u16), PARAMS(u16, u8 const *, size_t)); - -static char comm[TASK_COMM_LEN]; -static int result; -static char dsms_msg[MESSAGE_BUFFER_SIZE]; - -static struct mock_expectation *setup_expect_call(struct test *test, - char *comm, int result, int event_count, int n_calls) -{ - snprintf(dsms_msg, MESSAGE_BUFFER_SIZE, "%s res = %d count = %d", - comm, result, event_count); // generate appropriate gold msg - return Times(n_calls, Returns(EXPECT_CALL(five_dsms_msg( - streq(test, "FIV3"), streq(test, dsms_msg))), int_return(test, 0))); -} - -static void init_param(int comm_offs, int res, char *comm, int *p_result) -{ - int i; - *p_result = res; // randomly init result - for (i = 0; i < TASK_COMM_LEN-1; ++i) // randomly init char message - comm[i] = (char)(comm_offs + i); - comm[TASK_COMM_LEN-1] = '\0'; -} - -static void five_dsms_sign_err_first0_test(struct test *test) -{ - init_param(PARAM_COMM_RAND, PARAM_RESULT_RAND, comm, &result); - setup_expect_call(test, comm, result, FIV3_FIRST, 1); - five_dsms_sign_err(comm, result); -} - -static void five_dsms_sign_err_first1_test(struct test *test) -{ - int i; - - setup_expect_call(test, comm, result, PARAM_EVENT_COUNT_RAND, 0); - for (i = FIV3_FIRST + 1; i < FIV3_FEW; ++i) - five_dsms_sign_err(comm, result); -} - -static void five_dsms_sign_err_few0_test(struct test *test) -{ - setup_expect_call(test, comm, result, FIV3_FEW, 1); - five_dsms_sign_err(comm, result); -} - -static void five_dsms_sign_err_few1_test(struct test *test) -{ - int i; - - setup_expect_call(test, comm, result, PARAM_EVENT_COUNT_RAND, 0); - for (i = FIV3_FEW + 1; i < FIV3_LOT; ++i) - five_dsms_sign_err(comm, result); -} - -static void five_dsms_sign_err_lot0_test(struct test *test) -{ - setup_expect_call(test, comm, result, FIV3_LOT, 1); - five_dsms_sign_err(comm, result); -} - -static void five_dsms_sign_err_lot1_test(struct test *test) -{ - int i; - - setup_expect_call(test, comm, result, PARAM_EVENT_COUNT_RAND, 0); - for (i = FIV3_LOT + 1; i < 2*FIV3_LOT; ++i) - five_dsms_sign_err(comm, result); -} - -static void five_dsms_sign_err_all_events_test(struct test *test) -{ - int i; - - Times(MAX_FIV1_NUM-1, Returns(EXPECT_CALL(five_dsms_msg( - streq(test, "FIV3"), any(test))), int_return(test, 0))); - init_param(PARAM_COMM_RAND, PARAM_RESULT_RAND + 1, comm, &result); - five_dsms_sign_err(comm, result); - init_param(PARAM_COMM_RAND + 1, PARAM_RESULT_RAND, comm, &result); - five_dsms_sign_err(comm, result); - for (i = 2; i < MAX_FIV1_NUM-1; ++i) { - init_param(PARAM_COMM_RAND + i, - PARAM_RESULT_RAND + i, comm, &result); - five_dsms_sign_err(comm, result); - } -} - -static void five_dsms_sign_err_send_overflow_test(struct test *test) -{ - Returns(EXPECT_CALL(five_dsms_msg(streq(test, "FIV3"), - streq(test, "data buffer overflow"))), int_return(test, 0)); - init_param(PARAM_COMM_RAND, PARAM_RESULT_RAND + MAX_FIV1_NUM, comm, - &result); - five_dsms_sign_err(comm, result); -} - -static void five_dsms_sign_err_dont_send_overflow_test(struct test *test) -{ - Times(0, Returns(EXPECT_CALL(five_dsms_msg( - streq(test, "FIV3"), any(test))), int_return(test, 0))); - init_param(PARAM_COMM_RAND, PARAM_RESULT_RAND + MAX_FIV1_NUM, comm, - &result); - five_dsms_sign_err(comm, result); - init_param(PARAM_COMM_RAND, PARAM_RESULT_RAND + MAX_FIV1_NUM + 1, comm, - &result); - five_dsms_sign_err(comm, result); -} - -static void five_dsms_reset_integrity_send_msg0_test(struct test *test) -{ - char *file_name = FILE_NAME_0; - - init_param(PARAM_COMM_RAND, PARAM_RESULT_RAND, comm, &result); - snprintf(dsms_msg, MESSAGE_BUFFER_SIZE, "%s|%d|%s", comm, result, - file_name ? kbasename(file_name) : ""); - Returns(EXPECT_CALL(five_dsms_msg( - streq(test, "FIV2"), streq(test, dsms_msg))), int_return(test, 0)); - Returns(EXPECT_CALL(call_crc16(int_eq(test, 0), streq(test, dsms_msg), - int_lt(test, MESSAGE_BUFFER_SIZE))), - u32_return(test, CRC_VALUE_NO_MATTER)); - five_dsms_reset_integrity(comm, result, file_name); -} - -static void five_dsms_reset_integrity_send_msg1_test(struct test *test) -{ - char *file_name = FILE_NAME_0; - - init_param(PARAM_COMM_RAND + 1, PARAM_RESULT_RAND, comm, &result); - snprintf(dsms_msg, MESSAGE_BUFFER_SIZE, "%s|%d|%s", comm, result, - file_name ? kbasename(file_name) : ""); - Returns(EXPECT_CALL(five_dsms_msg( - streq(test, "FIV2"), streq(test, dsms_msg))), int_return(test, 0)); - Returns(EXPECT_CALL(call_crc16(int_eq(test, 0), streq(test, dsms_msg), - int_lt(test, MESSAGE_BUFFER_SIZE))), - u32_return(test, CRC_VALUE_NO_MATTER + 1)); - five_dsms_reset_integrity(comm, result, file_name); -} - -static void five_dsms_reset_integrity_send_msg2_test(struct test *test) -{ - char *file_name = FILE_NAME_0; - - init_param(PARAM_COMM_RAND, PARAM_RESULT_RAND + 1, comm, &result); - snprintf(dsms_msg, MESSAGE_BUFFER_SIZE, "%s|%d|%s", comm, result, - file_name ? kbasename(file_name) : ""); - Returns(EXPECT_CALL(five_dsms_msg( - streq(test, "FIV2"), streq(test, dsms_msg))), int_return(test, 0)); - Returns(EXPECT_CALL(call_crc16(int_eq(test, 0), streq(test, dsms_msg), - int_lt(test, MESSAGE_BUFFER_SIZE))), - u32_return(test, CRC_VALUE_NO_MATTER + 2)); - five_dsms_reset_integrity(comm, result, file_name); -} - -static void five_dsms_reset_integrity_two_same_msg_test(struct test *test) -{ - char *file_name = FILE_NAME_1; - - init_param(PARAM_COMM_RAND, PARAM_RESULT_RAND, comm, &result); - Returns(EXPECT_CALL(five_dsms_msg( - streq(test, "FIV2"), any(test))), int_return(test, 0)); - Times(2, Returns(EXPECT_CALL(call_crc16( - int_eq(test, 0), any(test), int_lt(test, MESSAGE_BUFFER_SIZE))), - u32_return(test, CRC_VALUE_NO_MATTER + 3))); - five_dsms_reset_integrity(comm, result, file_name); - five_dsms_reset_integrity(comm, result, file_name); -} - -static void five_dsms_reset_integrity_large_filename_test(struct test *test) -{ - int i; - char large_file_name[LARGE_FILE_NAME_SIZE]; - - // create wrong filename (too large size) - for (i = 0; i < LARGE_FILE_NAME_SIZE-1; ++i) - large_file_name[i] = 97; // init message with randomly chosen chars - large_file_name[LARGE_FILE_NAME_SIZE-1] = '\0'; - // create correct comm[] and result - init_param(PARAM_COMM_RAND, PARAM_RESULT_RAND, comm, &result); - snprintf(dsms_msg, MESSAGE_BUFFER_SIZE, "%s|%d|%s", comm, result, - kbasename(large_file_name)); - - Returns(EXPECT_CALL(five_dsms_msg( - streq(test, "FIV2"), streq(test, dsms_msg))), int_return(test, 0)); - Returns(EXPECT_CALL(call_crc16(int_eq(test, 0), streq(test, dsms_msg), - int_lt(test, MESSAGE_BUFFER_SIZE))), - u32_return(test, CRC_VALUE_NO_MATTER + 4)); - - five_dsms_reset_integrity(comm, result, large_file_name); -} - -static void five_dsms_reset_integrity_large_comm_test(struct test *test) -{ - int i; - char file_name[] = FILE_NAME_2; // correct filename - char large_comm[LARGE_COMM_SIZE]; - - result = PARAM_RESULT_RAND; // randomly init result - // create wrong comm[] (too large size) - for (i = 0; i < LARGE_COMM_SIZE-1; ++i) - large_comm[i] = 98; // init char message with randomly chosen symbol - large_comm[LARGE_COMM_SIZE-1] = '\0'; - snprintf(dsms_msg, MESSAGE_BUFFER_SIZE, "%s|%d|%s", large_comm, result, - kbasename(file_name)); - - Returns(EXPECT_CALL(five_dsms_msg( - streq(test, "FIV2"), streq(test, dsms_msg))), int_return(test, 0)); - Returns(EXPECT_CALL(call_crc16(int_eq(test, 0), streq(test, dsms_msg), - int_lt(test, MESSAGE_BUFFER_SIZE))), - u32_return(test, CRC_VALUE_NO_MATTER + 5)); - - five_dsms_reset_integrity(large_comm, result, file_name); -} - -static int five_dsms_test_init(struct test *test) -{ - return 0; -} - -static void five_dsms_test_exit(struct test *test) -{ -} - -static struct test_case five_dsms_test_cases[] = { - TEST_CASE(five_dsms_sign_err_first0_test), - TEST_CASE(five_dsms_sign_err_first1_test), - TEST_CASE(five_dsms_sign_err_few0_test), - TEST_CASE(five_dsms_sign_err_few1_test), - TEST_CASE(five_dsms_sign_err_lot0_test), - TEST_CASE(five_dsms_sign_err_lot1_test), - TEST_CASE(five_dsms_sign_err_all_events_test), - TEST_CASE(five_dsms_sign_err_send_overflow_test), - TEST_CASE(five_dsms_sign_err_dont_send_overflow_test), - TEST_CASE(five_dsms_reset_integrity_send_msg0_test), - TEST_CASE(five_dsms_reset_integrity_send_msg1_test), - TEST_CASE(five_dsms_reset_integrity_send_msg2_test), - TEST_CASE(five_dsms_reset_integrity_two_same_msg_test), - TEST_CASE(five_dsms_reset_integrity_large_filename_test), - TEST_CASE(five_dsms_reset_integrity_large_comm_test), - {}, -}; - -static struct test_module five_dsms_test_module = { - .name = "five_dsms_test", - .init = five_dsms_test_init, - .exit = five_dsms_test_exit, - .test_cases = five_dsms_test_cases, -}; -module_test(five_dsms_test_module); diff --git a/security/samsung/five/kunit_test/five_file.c b/security/samsung/five/kunit_test/five_file.c deleted file mode 100755 index ea09ed3b953a..000000000000 --- a/security/samsung/five/kunit_test/five_file.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <linux/fs.h> -#include <linux/shmem_fs.h> -#include <linux/buffer_head.h> - -struct file *test_open_file(const char *filename) -{ - return shmem_kernel_file_setup(filename, 0, VM_NORESERVE); -} - -void test_close_file(struct file *file) -{ - fput(file); -} diff --git a/security/samsung/five/kunit_test/five_file.h b/security/samsung/five/kunit_test/five_file.h deleted file mode 100755 index cf55866ee4ea..000000000000 --- a/security/samsung/five/kunit_test/five_file.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef __LINUX_FIVE_FILE_H -#define __LINUX_FIVE_FILE_H - -struct file *test_open_file(const char *filename); -void test_close_file(struct file *file); - -#endif // __LINUX_FIVE_FILE_H diff --git a/security/samsung/five/kunit_test/five_keyring_test.c b/security/samsung/five/kunit_test/five_keyring_test.c deleted file mode 100755 index b7d5278fc198..000000000000 --- a/security/samsung/five/kunit_test/five_keyring_test.c +++ /dev/null @@ -1,312 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ -#include <linux/key-type.h> -#include <crypto/public_key.h> -#include <crypto/hash_info.h> -#include "five.h" -#include "five_lv.h" -#include "five_cert.h" -#include "test_helpers.h" - -struct key *five_request_asymmetric_key(uint32_t keyid); -int __init five_load_x509_from_mem(const char *data, size_t size); - -DEFINE_FUNCTION_MOCK( - METHOD(call_keyring_search), RETURNS(key_ref_t), - PARAMS(key_ref_t, struct key_type *, const char *, bool)); - -DEFINE_FUNCTION_MOCK( - METHOD(call_request_key), RETURNS(struct key *), - PARAMS(struct key_type *, const char *, const char *)); - -DEFINE_FUNCTION_MOCK_VOID_RETURN( - METHOD(call_key_put), PARAMS(struct key *)); - -DEFINE_FUNCTION_MOCK( - METHOD(call_five_verify_signature), RETURNS(int), - PARAMS(struct key *, struct public_key_signature *, - struct five_cert *, struct five_cert_header *)); - -#define DIGEST_SIZE 155 -#define VERIFY_SIGNATURE_RET 88 -#define KEY_ID 77 -#define SIZEOF_FIVE_CERT_HEADER (4 + 4) -#define CORRECT_SIZE 55 -#define WRONG_SIZE 0 -#define SUCCESS_CODE 0 -#define CORRECT_PTR 2 -#define WRONG_PTR -2 -#define FIVE_KEYRING_ALLOC_PERM_MASK ((KEY_POS_ALL & ~KEY_POS_SETATTR) | \ - KEY_USR_VIEW | KEY_USR_READ | KEY_USR_SEARCH) - -extern const char *five_keyring_name; -extern struct key *five_keyring; - -// test 'NULL five_keyring' scenario -static void five_keyring_request_asymmetric_key_wo_five_keyring_test( - struct test *test) -{ - struct key *five_keyring_tmp = five_keyring; - - five_keyring = NULL; - - EXPECT_EQ(test, five_request_asymmetric_key(KEY_ID), ERR_PTR(-ENOKEY)); - EXPECT_EQ(test, five_request_asymmetric_key(KEY_ID), ERR_PTR(-ENOKEY)); - five_keyring = five_keyring_tmp; -} - -// test 'non-NULL five_keyring', 'keyring_search returns error' scenario -static void five_keyring_keyring_search_returns_error_test( - struct test *test) -{ - char name[12]; - struct key foo_keyring; - - five_keyring = &foo_keyring; - snprintf(name, sizeof(name), "id:%08x", KEY_ID); - - Returns(EXPECT_CALL(call_keyring_search( - ptr_eq(test, make_key_ref(five_keyring, 1)), - any(test), - streq(test, name), - bool_eq(test, true) - )), - ptr_return(test, (void *)WRONG_PTR)); - - EXPECT_EQ(test, - five_request_asymmetric_key(KEY_ID), (void *)WRONG_PTR); -} - -// test 'non-NULL five_keyring', 'keyring_search returns specific error' scenario -static void five_keyring_keyring_search_returns_error_eacces_test( - struct test *test) -{ - char name[12]; - struct key foo_keyring; - - five_keyring = &foo_keyring; - snprintf(name, sizeof(name), "id:%08x", KEY_ID); - - Returns(EXPECT_CALL(call_keyring_search( - ptr_eq(test, make_key_ref(five_keyring, 1)), - any(test), - streq(test, name), - bool_eq(test, true) - )), - ptr_return(test, (void *)-EACCES)); - - EXPECT_EQ(test, five_request_asymmetric_key(KEY_ID), ERR_PTR(-ENOKEY)); -} - -// test 'non-NULL five_keyring', 'keyring_search returns specific error' scenario -static void five_keyring_keyring_search_returns_error_enotdir_test( - struct test *test) -{ - char name[12]; - struct key foo_keyring; - - five_keyring = &foo_keyring; - snprintf(name, sizeof(name), "id:%08x", KEY_ID); - - Returns(EXPECT_CALL(call_keyring_search( - ptr_eq(test, make_key_ref(five_keyring, 1)), - any(test), - streq(test, name), - bool_eq(test, true) - )), - ptr_return(test, (void *)-ENOTDIR)); - - EXPECT_EQ(test, five_request_asymmetric_key(KEY_ID), ERR_PTR(-ENOKEY)); -} - -// test 'non-NULL five_keyring', 'keyring_search returns specific error' scenario -static void five_keyring_keyring_search_returns_error_eagain_test( - struct test *test) -{ - char name[12]; - struct key foo_keyring; - - five_keyring = &foo_keyring; - snprintf(name, sizeof(name), "id:%08x", KEY_ID); - - Returns(EXPECT_CALL(call_keyring_search( - ptr_eq(test, make_key_ref(five_keyring, 1)), - any(test), - streq(test, name), - bool_eq(test, true) - )), - ptr_return(test, (void *)-EAGAIN)); - - EXPECT_EQ(test, five_request_asymmetric_key(KEY_ID), ERR_PTR(-ENOKEY)); -} - -static void five_keyring_load_x509_wrong_five_keyring_test(struct test *test) -{ - five_keyring = NULL; - EXPECT_EQ(test, five_load_x509_from_mem(NULL, CORRECT_SIZE), -EINVAL); -} - -static void five_keyring_load_x509_wrong_size_test(struct test *test) -{ - struct key foo_keyring; - - five_keyring = &foo_keyring; - EXPECT_EQ(test, five_load_x509_from_mem(NULL, WRONG_SIZE), -EINVAL); -} - -static void five_keyring_request_key_returns_err_test(struct test *test) -{ - five_keyring = NULL; - Returns(EXPECT_CALL(call_request_key( - any(test), - streq(test, five_keyring_name), - ptr_eq(test, NULL) - )), - ptr_return(test, (void *)WRONG_PTR)); - EXPECT_EQ(test, five_digsig_verify(NULL, NULL, 0), WRONG_PTR); - EXPECT_EQ(test, five_keyring, NULL); -} - -// test 'request_key returns correct key' and 'wrong_hash_algo' scenario -static void five_keyring_request_key_returns_success_test( - struct test *test) -{ - struct five_cert_header *header; - struct { - uint16_t length; - uint8_t value[SIZEOF_FIVE_CERT_HEADER]; - } __packed header_lv; - DECLARE_NEW(test, struct five_cert, cert); - - cert->body.header = (struct lv *)&header_lv; - header = (struct five_cert_header *)cert->body.header->value; - header->hash_algo = HASH_ALGO__LAST; - five_keyring = NULL; - - Returns(EXPECT_CALL(call_request_key( - any(test), - streq(test, five_keyring_name), - ptr_eq(test, NULL) - )), - ptr_return(test, (void *)CORRECT_PTR)); - EXPECT_EQ(test, five_digsig_verify(cert, NULL, 0), -ENOPKG); - EXPECT_EQ(test, five_keyring, (void *)CORRECT_PTR); -} - -// test 'asymmetric_verify with existing five_keyring' and 'request_asymmetric_key returns error' scenario -static void five_keyring_request_asymmetric_key_return_error_test( - struct test *test) -{ - struct key foo_keyring; - struct five_cert_header *header; - struct { - uint16_t length; - uint8_t value[SIZEOF_FIVE_CERT_HEADER]; - } __packed header_lv; - DECLARE_NEW(test, struct five_cert, cert); - char name[12]; - - cert->body.header = (struct lv *)&header_lv; - header = (struct five_cert_header *)cert->body.header->value; - header->hash_algo = HASH_ALGO__LAST - 1; - header->key_id = KEY_ID; - snprintf(name, sizeof(name), "id:%08x", __be32_to_cpu(header->key_id)); - five_keyring = &foo_keyring; - - Returns(EXPECT_CALL(call_keyring_search( - ptr_eq(test, make_key_ref(five_keyring, 1)), - any(test), - streq(test, name), - bool_eq(test, true) - )), - ptr_return(test, (void *)WRONG_PTR)); - - EXPECT_EQ(test, five_digsig_verify(cert, NULL, 0), WRONG_PTR); -} - -// test 'asymmetric_verify with existing five_keyring' and 'request_asymmetric_key returns success' scenario -static void five_keyring_request_asymmetric_key_returns_success_test( - struct test *test) -{ - char digest[] = "didgest"; - struct public_key_signature pks; - struct key foo_keyring; - struct five_cert_header *header; - struct { - uint16_t length; - uint8_t value[SIZEOF_FIVE_CERT_HEADER]; - } __packed header_lv; - DECLARE_NEW(test, struct five_cert, cert); - char name[12]; - - cert->body.header = (struct lv *)&header_lv; - header = (struct five_cert_header *)cert->body.header->value; - header->hash_algo = HASH_ALGO__LAST - 1; - header->key_id = KEY_ID; - snprintf(name, sizeof(name), "id:%08x", __be32_to_cpu(header->key_id)); - five_keyring = &foo_keyring; - memset(&pks, 0, sizeof(pks)); - pks.digest = (u8 *)digest; - pks.digest_size = DIGEST_SIZE; - - Returns(EXPECT_CALL(call_keyring_search( - ptr_eq(test, make_key_ref(five_keyring, 1)), - any(test), - streq(test, name), - bool_eq(test, true) - )), - ptr_return(test, (void *)CORRECT_PTR)); - - Returns(EXPECT_CALL(call_five_verify_signature( - ptr_eq(test, (void *)CORRECT_PTR), - memeq(test, (void *)&pks, sizeof(pks)), - ptr_eq(test, cert), - ptr_eq(test, header) - )), - int_return(test, VERIFY_SIGNATURE_RET)); - - Returns(EXPECT_CALL(call_key_put( - ptr_eq(test, (void *)CORRECT_PTR))), int_return(test, 0)); - - EXPECT_EQ(test, five_digsig_verify( - cert, digest, DIGEST_SIZE), VERIFY_SIGNATURE_RET); -} - -static struct test_case five_keyring_test_cases[] = { - TEST_CASE(five_keyring_request_asymmetric_key_wo_five_keyring_test), - TEST_CASE(five_keyring_keyring_search_returns_error_test), - TEST_CASE(five_keyring_keyring_search_returns_error_eacces_test), - TEST_CASE(five_keyring_keyring_search_returns_error_enotdir_test), - TEST_CASE(five_keyring_keyring_search_returns_error_eagain_test), - TEST_CASE(five_keyring_load_x509_wrong_five_keyring_test), - TEST_CASE(five_keyring_load_x509_wrong_size_test), - TEST_CASE(five_keyring_request_key_returns_err_test), - TEST_CASE(five_keyring_request_key_returns_success_test), - TEST_CASE(five_keyring_request_asymmetric_key_return_error_test), - TEST_CASE(five_keyring_request_asymmetric_key_returns_success_test), - {}, -}; - -static int five_keyring_test_init(struct test *test) -{ - return 0; -} - -static void five_keyring_test_exit(struct test *test) -{ - return; -} - -static struct test_module five_keyring_test_module = { - .name = "five_keyring_test", - .init = five_keyring_test_init, - .exit = five_keyring_test_exit, - .test_cases = five_keyring_test_cases, -}; - -module_test(five_keyring_test_module); diff --git a/security/samsung/five/kunit_test/five_lv_test.c b/security/samsung/five/kunit_test/five_lv_test.c deleted file mode 100755 index 0f8c01ddd5e0..000000000000 --- a/security/samsung/five/kunit_test/five_lv_test.c +++ /dev/null @@ -1,108 +0,0 @@ -#include <kunit/test.h> -#include "five_lv.h" - -static uint8_t value_1[] = {0x01, 0x02, 0x03, 0x04, 0x05}; -static uint8_t value_2[] = {0x0A, 0x09, 0x08, 0x07, 0x06, 0x07}; -static uint8_t value_3[] = {0x0A, 0x09, 0x08, 0x07, 0x06, 0x07, 0x08}; - -static void lv_test(struct test *test) -{ - size_t data_len; - uint8_t *data; - struct lv *next; - const void *end; - int rc = 0; - - data_len = sizeof(value_1) + sizeof(value_2) + sizeof(value_3) + - sizeof(struct lv) * 3; - - data = test_kzalloc(test, data_len, GFP_NOFS); - ASSERT_NOT_ERR_OR_NULL(test, data); - - next = (struct lv *)data; - end = data + data_len; - - rc = lv_set(next, value_1, sizeof(value_1), end); - EXPECT_EQ(test, rc, 0); - next = lv_get_next(next, end); - ASSERT_NOT_ERR_OR_NULL(test, next); - - rc = lv_set(next, value_2, sizeof(value_2), end); - EXPECT_EQ(test, rc, 0); - next = lv_get_next(next, end); - ASSERT_NOT_ERR_OR_NULL(test, next); - - rc = lv_set(next, value_3, sizeof(value_3), end); - EXPECT_EQ(test, rc, 0); -} - -static void lv_test_negative(struct test *test) -{ - size_t data_len; - uint8_t *data; - struct lv *next; - struct lv *tmp_next; - const void *end; - int rc = 0; - - data_len = sizeof(value_1) + sizeof(value_2) + sizeof(value_3) + - sizeof(struct lv) * 3 - 1; - - data = test_kzalloc(test, data_len, GFP_NOFS); - ASSERT_NOT_ERR_OR_NULL(test, data); - - next = (struct lv *)data; - end = data + data_len; - - rc = lv_set(next, value_1, sizeof(value_1), end); - EXPECT_EQ(test, rc, 0); - next = lv_get_next(next, end); - ASSERT_NOT_ERR_OR_NULL(test, next); - - tmp_next = lv_get_next(NULL, end); - EXPECT_NULL(test, tmp_next); - tmp_next = lv_get_next(next, NULL); - EXPECT_NULL(test, tmp_next); - tmp_next = lv_get_next(NULL, NULL); - EXPECT_NULL(test, tmp_next); - - rc = lv_set(NULL, value_2, sizeof(value_2), end); - EXPECT_EQ(test, rc, -EINVAL); - rc = lv_set(next, value_2, sizeof(value_2), NULL); - EXPECT_EQ(test, rc, -EINVAL); - rc = lv_set(next, NULL, sizeof(value_2), end); - EXPECT_EQ(test, rc, -EINVAL); - rc = lv_set(next, value_2, data_len + 10, end); - EXPECT_EQ(test, rc, -EINVAL); - rc = lv_set(next, value_2, sizeof(value_2), end); - EXPECT_EQ(test, rc, 0); - - next = lv_get_next(next, end); - ASSERT_NOT_ERR_OR_NULL(test, next); - rc = lv_set(next, value_3, sizeof(value_3), end); - EXPECT_EQ(test, rc, -EINVAL); -} - -static int security_five_test_init(struct test *test) -{ - return 0; -} - -static void security_five_test_exit(struct test *test) -{ - return; -} - -static struct test_case security_five_test_cases[] = { - TEST_CASE(lv_test), - TEST_CASE(lv_test_negative), - {}, -}; - -static struct test_module security_five_test_module = { - .name = "five-lv-test", - .init = security_five_test_init, - .exit = security_five_test_exit, - .test_cases = security_five_test_cases, -}; -module_test(security_five_test_module); diff --git a/security/samsung/five/kunit_test/five_pa_test.c b/security/samsung/five/kunit_test/five_pa_test.c deleted file mode 100755 index 8b95b5467c20..000000000000 --- a/security/samsung/five/kunit_test/five_pa_test.c +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ -#include <linux/key-type.h> -#include <linux/file.h> -#include <linux/module.h> -#include <linux/task_integrity.h> -#include <linux/proca.h> -#include <linux/xattr.h> -#include "five.h" -#include "five_pa.h" -#include "five_hooks.h" -#include "five_lv.h" -#include "five_porting.h" -#include "test_helpers.h" - -#ifdef CONFIG_FIVE_GKI_10 -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) -#define F_SIGNATURE(file) ((file)->android_oem_data1) -#define F_SIGNATURE_ASSIGN(file, ptr) ((file)->android_oem_data1 = (u64)ptr) -#else -#define F_SIGNATURE(file) ((file)->android_vendor_data1) -#define F_SIGNATURE_ASSIGN(file, ptr) ((file)->android_vendor_data1 = (u64)ptr) -#endif -#else -#define F_SIGNATURE(file) ((file)->f_signature) -#define F_SIGNATURE_ASSIGN(file, ptr) ((file)->f_signature = (void *)ptr) -#endif - -void pa_process_file(struct task_struct *task, struct file *file); -int proca_fcntl_setxattr(struct file *file, void __user *lv_xattr); - -DEFINE_FUNCTION_MOCK( - METHOD(call_five_read_xattr), RETURNS(int), - PARAMS(struct dentry *, char **)); - -DEFINE_FUNCTION_MOCK( - METHOD(call_task_integrity_allow_sign), RETURNS(bool), - PARAMS(struct task_integrity *)); - -DEFINE_FUNCTION_MOCK( - METHOD(call_vfs_setxattr_noperm), RETURNS(int), - PARAMS(struct dentry *, const char *, const void *, size_t, int)); - -#define CORRECT_PTR 2 -#define NOT_S_IFREG 11 -#define OVERLENGTH (PAGE_SIZE + 1) -#define LV_XATTR_SIZE 12 -#define XATTR_VALUE 22 - -static void five_pa_process_file_no_file_test(struct test *test) -{ - pa_process_file(NULL, NULL); -} - -static void five_pa_process_file_no_imode_test(struct test *test) -{ - DECLARE_NEW(test, struct file, p_file); - - p_file->f_inode = NEW(test, struct inode); - p_file->f_inode->i_mode = NOT_S_IFREG; - - pa_process_file(NULL, p_file); -} - -static void five_pa_process_file_has_sign_test(struct test *test) -{ - DECLARE_NEW(test, struct file, p_file); - - p_file->f_inode = NEW(test, struct inode); - p_file->f_inode->i_mode = S_IFREG; - - F_SIGNATURE_ASSIGN(p_file, CORRECT_PTR); - - pa_process_file(NULL, p_file); -} - -static char xattr_val[] = "xyz"; -static int ret; -static void *five_read_xattr_action( - struct mock_action *this, const void **params, int len) -{ - void *foo; - - if (2 != len) { - pr_err("Wrong number of params!"); - return NULL; - } - foo = (void *)params[1]; - *(char **)(*(void **)foo) = xattr_val; - ret = 0; - return &ret; -} - -static void five_pa_process_file_no_sign_test(struct test *test) -{ - DECLARE_NEW(test, struct file, p_file); - - p_file->f_inode = NEW(test, struct inode); - p_file->f_path.dentry = NEW(test, struct dentry); - p_file->f_inode->i_mode = S_IFREG; - p_file->f_path.dentry->d_flags = 0; - - F_SIGNATURE_ASSIGN(p_file, NULL); - - ActionOnMatch(EXPECT_CALL(call_five_read_xattr( - ptr_eq(test, p_file->f_path.dentry), any(test))), - new_mock_action(test, five_read_xattr_action)); - - pa_process_file(NULL, p_file); - - EXPECT_EQ(test, F_SIGNATURE(p_file), (u64)xattr_val); -} - -static void five_pafsignature_free_test(struct test *test) -{ - // This memory should be released in tested function. Pointer type doesn't matter here - struct file *p_fake_sign = kzalloc(sizeof(struct file), GFP_KERNEL); - - DECLARE_NEW(test, struct file, p_file); - - F_SIGNATURE_ASSIGN(p_file, p_fake_sign); - - fivepa_fsignature_free(p_file); - - EXPECT_EQ(test, F_SIGNATURE(p_file), (u64)NULL); -} - -static void five_pa_proca_fcntl_setxattr_no_file_test(struct test *test) -{ - struct lv lv_hdr = {0}; - - EXPECT_EQ(test, proca_fcntl_setxattr(NULL, &lv_hdr), -EINVAL); -} - -static void five_pa_proca_fcntl_setxattr_no_lv_xattr_test(struct test *test) -{ - DECLARE_NEW(test, struct file, p_file); - - EXPECT_EQ(test, proca_fcntl_setxattr(p_file, NULL), -EINVAL); -} - -static void five_pa_proca_fcntl_setxattr_overlength_test(struct test *test) -{ - DECLARE_NEW(test, struct file, p_file); - struct lv lv_hdr = {OVERLENGTH}; - - p_file->f_inode = NEW(test, struct inode); - EXPECT_EQ(test, proca_fcntl_setxattr(p_file, &lv_hdr), -EINVAL); -} - -static int fake_flush_ret_1(struct file *p_file, fl_owner_t id) -{ - return 1; -} - -static void five_pa_proca_fcntl_setxattr_flush_returns_error_test( - struct test *test) -{ - struct { - uint16_t length; - uint8_t value[LV_XATTR_SIZE]; - } __packed header_lv; - - DECLARE_NEW(test, struct file, p_file); - DECLARE_NEW(test, struct file_operations, p_file_operations); - - header_lv.length = LV_XATTR_SIZE; - p_file->f_inode = NEW(test, struct inode); - p_file_operations->flush = fake_flush_ret_1; - p_file->f_op = p_file_operations; - - EXPECT_EQ(test, proca_fcntl_setxattr(p_file, &header_lv), -EOPNOTSUPP); -} - -static int fake_flush_ret_0(struct file *p_file, fl_owner_t id) -{ - return 0; -} - -static void five_pa_proca_fcntl_setxattr_allow_sign_test( - struct test *test) -{ - int i; - struct { - uint16_t length; - uint8_t value[LV_XATTR_SIZE]; - } __packed header_lv; - - DECLARE_NEW(test, struct file, p_file); - DECLARE_NEW(test, struct file_operations, p_file_operations); - - header_lv.length = LV_XATTR_SIZE; - for (i = 0; i < LV_XATTR_SIZE; ++i) - header_lv.value[i] = i+1; - - p_file->f_inode = NEW(test, struct inode); - p_file->f_path.dentry = NEW(test, struct dentry); - p_file_operations->flush = fake_flush_ret_0; - p_file->f_op = p_file_operations; - p_file->f_path.dentry->d_flags = 0; - - Returns(EXPECT_CALL(call_task_integrity_allow_sign( - ptr_eq(test, TASK_INTEGRITY(current)))), - bool_return(test, 1)); - - Returns(EXPECT_CALL(call_vfs_setxattr_noperm( - ptr_eq(test, d_real_comp(p_file->f_path.dentry)), - streq(test, XATTR_NAME_PA), - memeq(test, header_lv.value, header_lv.length), - int_eq(test, LV_XATTR_SIZE), int_eq(test, 0))), - int_return(test, XATTR_VALUE)); - - EXPECT_EQ(test, proca_fcntl_setxattr(p_file, &header_lv), XATTR_VALUE); -} - -static void five_pa_proca_fcntl_setxattr_not_allow_sign_test( - struct test *test) -{ - struct { - uint16_t length; - uint8_t value[LV_XATTR_SIZE]; - } __packed header_lv; - - DECLARE_NEW(test, struct file, p_file); - - header_lv.length = LV_XATTR_SIZE; - p_file->f_inode = NEW(test, struct inode); - p_file->f_path.dentry = NEW(test, struct dentry); - p_file->f_path.dentry->d_flags = 0; - - Returns(EXPECT_CALL(call_task_integrity_allow_sign( - ptr_eq(test, TASK_INTEGRITY(current)))), - bool_return(test, 0)); - - EXPECT_EQ(test, proca_fcntl_setxattr(p_file, &header_lv), -EPERM); -} - -static struct test_case five_pa_test_cases[] = { - TEST_CASE(five_pa_process_file_no_file_test), - TEST_CASE(five_pa_process_file_no_imode_test), - TEST_CASE(five_pa_process_file_no_sign_test), - TEST_CASE(five_pa_process_file_has_sign_test), - TEST_CASE(five_pafsignature_free_test), - TEST_CASE(five_pa_proca_fcntl_setxattr_no_file_test), - TEST_CASE(five_pa_proca_fcntl_setxattr_no_lv_xattr_test), - TEST_CASE(five_pa_proca_fcntl_setxattr_overlength_test), - TEST_CASE(five_pa_proca_fcntl_setxattr_flush_returns_error_test), - TEST_CASE(five_pa_proca_fcntl_setxattr_allow_sign_test), - TEST_CASE(five_pa_proca_fcntl_setxattr_not_allow_sign_test), - {}, -}; - -static int five_pa_test_init(struct test *test) -{ - return 0; -} - -static void five_pa_test_exit(struct test *test) -{ - return; -} - -static struct test_module five_pa_test_module = { - .name = "five_pa_test", - .init = five_pa_test_init, - .exit = five_pa_test_exit, - .test_cases = five_pa_test_cases, -}; - -module_test(five_pa_test_module); diff --git a/security/samsung/five/kunit_test/five_state_test.c b/security/samsung/five/kunit_test/five_state_test.c deleted file mode 100755 index 6b9eaf9d50ac..000000000000 --- a/security/samsung/five/kunit_test/five_state_test.c +++ /dev/null @@ -1,612 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ -#include <linux/task_integrity.h> -#include "five_cache.h" -#include "five_state.h" -#include "five_hooks.h" -#include "test_helpers.h" - -enum task_integrity_state_cause { - STATE_CAUSE_UNKNOWN, - STATE_CAUSE_DIGSIG, - STATE_CAUSE_DMV_PROTECTED, - STATE_CAUSE_TRUSTED, - STATE_CAUSE_HMAC, - STATE_CAUSE_SYSTEM_LABEL, - STATE_CAUSE_NOCERT, - STATE_CAUSE_TAMPERED, - STATE_CAUSE_MISMATCH_LABEL, - STATE_CAUSE_FSV_PROTECTED -}; - -struct task_verification_result { - enum task_integrity_value new_tint; - enum task_integrity_value prev_tint; - enum task_integrity_state_cause cause; -}; - -#define LABEL_SIZE 10 -#define FAKE_ITEGRITY_VALUE (INTEGRITY_PRELOAD + 21) -#define MESSAGE_BUFFER_SIZE 600 // from five_dsms.c -#define CRC_VALUE_NO_MATTER 37 // any uint16 -#define FIVE_RESULT 7 - -DECLARE_FUNCTION_MOCK( - METHOD(call_crc16), RETURNS(u16), PARAMS(u16, u8 const *, size_t)); - -DEFINE_FUNCTION_MOCK_VOID_RETURN(five_audit_verbose, - PARAMS(struct task_struct *, - struct file *, const char *, enum task_integrity_value, - enum task_integrity_value, const char *, int)); - -DEFINE_FUNCTION_MOCK( - METHOD(five_d_path), RETURNS(const char *), - PARAMS(const struct path *, char **, char *)); - -DEFINE_FUNCTION_MOCK_VOID_RETURN(five_hook_integrity_reset, - PARAMS(struct task_struct *, - struct file *, - enum task_integrity_reset_cause)) - -const char *task_integrity_state_str(enum task_integrity_state_cause cause); -int is_system_label(struct integrity_label *label); - -enum task_integrity_reset_cause state_to_reason_cause( - enum task_integrity_state_cause cause); - -int integrity_label_cmp(struct integrity_label *l1, - struct integrity_label *l2); - -int verify_or_update_label(struct task_integrity *intg, - struct integrity_iint_cache *iint); - -bool set_first_state(struct integrity_iint_cache *iint, - struct task_integrity *integrity, - struct task_verification_result *result); - -bool set_next_state(struct integrity_iint_cache *iint, - struct task_integrity *integrity, - struct task_verification_result *result); - -static void five_state_task_integrity_state_str_test(struct test *test) -{ - EXPECT_STREQ(test, task_integrity_state_str( - STATE_CAUSE_FSV_PROTECTED + 100), "unknown"); -} - -static void five_state_to_reason_cause_test(struct test *test) -{ - EXPECT_EQ(test, state_to_reason_cause(CAUSE_MAX + 100), CAUSE_UNSET); -} - -static void five_state_is_system_label_test(struct test *test) -{ - DECLARE_NEW(test, struct integrity_label, label); - - EXPECT_EQ(test, is_system_label(NULL), 0); - label->len = LABEL_SIZE; - EXPECT_EQ(test, is_system_label(label), 0); - label->len = 0; - EXPECT_EQ(test, is_system_label(label), 1); -} - -static void five_state_integrity_label_cmp_test(struct test *test) -{ - DECLARE_NEW(test, struct integrity_label, l1); - DECLARE_NEW(test, struct integrity_label, l2); - - EXPECT_EQ(test, integrity_label_cmp(l1, l2), 0); -} - -static void five_state_verify_or_update_label_test(struct test *test) -{ - int i; - struct integrity_label { - uint16_t len; - uint8_t data[LABEL_SIZE]; - } __packed int_l; - - DECLARE_NEW(test, struct task_integrity, intg); - DECLARE_NEW(test, struct integrity_iint_cache, iint); - DECLARE_NEW(test, struct integrity_label, intg_label); - - for (i = 0; i < LABEL_SIZE; ++i) - int_l.data[i] = i+1; - iint->five_label = NULL; - EXPECT_EQ(test, verify_or_update_label(NULL, iint), 0); - - iint->five_label = (void *)&int_l; - int_l.len = 0; - EXPECT_EQ(test, verify_or_update_label(NULL, iint), 0); - - int_l.len = LABEL_SIZE; - intg->label = (void *)intg_label; - EXPECT_EQ(test, verify_or_update_label(intg, iint), 0); - EXPECT_EQ(test, intg->label->len, 0); - - intg->label = NULL; - EXPECT_EQ(test, verify_or_update_label(intg, iint), 0); - EXPECT_EQ(test, intg->label->len, LABEL_SIZE); - for (i = 0; i < LABEL_SIZE; ++i) - EXPECT_EQ(test, intg->label->data[i], i+1); -} - -#define EXPECT_EQ_RESULT(intg_value, res_cause, res_prevtint, res_newtint) do {\ - EXPECT_EQ(test, task_integrity_read(intg), intg_value);\ - EXPECT_EQ(test, result->cause, res_cause);\ - EXPECT_EQ(test, result->prev_tint, res_prevtint);\ - EXPECT_EQ(test, result->new_tint, res_newtint);\ - } while (0) - -static void five_state_set_first_state_test(struct test *test) -{ - DECLARE_NEW(test, struct task_integrity, intg); - DECLARE_NEW(test, struct integrity_iint_cache, iint); - DECLARE_NEW(test, struct task_verification_result, result); - - iint->inode = NEW(test, struct inode); - iint->version = 0; - iint->inode->i_version.counter = 0; - - iint->five_status = FIVE_FILE_RSA; - iint->five_flags = (unsigned long)-1; - task_integrity_set(intg, FAKE_ITEGRITY_VALUE); - EXPECT_TRUE(test, set_first_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_PRELOAD_ALLOW_SIGN, STATE_CAUSE_TRUSTED, - FAKE_ITEGRITY_VALUE, INTEGRITY_PRELOAD_ALLOW_SIGN); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_RSA; - iint->five_flags = 0; - task_integrity_set(intg, FAKE_ITEGRITY_VALUE + 1); - EXPECT_TRUE(test, set_first_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_PRELOAD, STATE_CAUSE_DIGSIG, - FAKE_ITEGRITY_VALUE + 1, INTEGRITY_PRELOAD); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_FSVERITY; - iint->five_flags = (unsigned long)-1; - task_integrity_set(intg, FAKE_ITEGRITY_VALUE + 2); - EXPECT_TRUE(test, set_first_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_DMVERITY_ALLOW_SIGN, STATE_CAUSE_TRUSTED, - FAKE_ITEGRITY_VALUE + 2, INTEGRITY_DMVERITY_ALLOW_SIGN); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_FSVERITY; - iint->five_flags = 0; - task_integrity_set(intg, FAKE_ITEGRITY_VALUE + 3); - EXPECT_TRUE(test, set_first_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_DMVERITY, STATE_CAUSE_FSV_PROTECTED, - FAKE_ITEGRITY_VALUE + 3, INTEGRITY_DMVERITY); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_DMVERITY; - iint->five_flags = (unsigned long)-1; - task_integrity_set(intg, FAKE_ITEGRITY_VALUE + 4); - EXPECT_TRUE(test, set_first_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_DMVERITY_ALLOW_SIGN, STATE_CAUSE_TRUSTED, - FAKE_ITEGRITY_VALUE + 4, INTEGRITY_DMVERITY_ALLOW_SIGN); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_DMVERITY; - iint->five_flags = 0; - task_integrity_set(intg, FAKE_ITEGRITY_VALUE + 5); - EXPECT_TRUE(test, set_first_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_DMVERITY, STATE_CAUSE_DMV_PROTECTED, - FAKE_ITEGRITY_VALUE + 5, INTEGRITY_DMVERITY); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_HMAC; - task_integrity_set(intg, FAKE_ITEGRITY_VALUE + 6); - EXPECT_TRUE(test, set_first_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_MIXED, STATE_CAUSE_HMAC, - FAKE_ITEGRITY_VALUE + 6, INTEGRITY_MIXED); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_HMAC; - task_integrity_set(intg, FAKE_ITEGRITY_VALUE + 7); - EXPECT_TRUE(test, set_first_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_MIXED, STATE_CAUSE_HMAC, - FAKE_ITEGRITY_VALUE + 7, INTEGRITY_MIXED); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_FAIL; - task_integrity_set(intg, FAKE_ITEGRITY_VALUE + 8); - EXPECT_TRUE(test, set_first_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_NONE, STATE_CAUSE_TAMPERED, - FAKE_ITEGRITY_VALUE + 8, INTEGRITY_NONE); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_UNKNOWN + 100; - task_integrity_set(intg, FAKE_ITEGRITY_VALUE + 9); - EXPECT_TRUE(test, set_first_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_NONE, STATE_CAUSE_NOCERT, - FAKE_ITEGRITY_VALUE + 9, INTEGRITY_NONE); -} - -static void five_state_set_next_state_test(struct test *test) -{ - DECLARE_NEW(test, struct task_integrity, intg); - DECLARE_NEW(test, struct integrity_iint_cache, iint); - DECLARE_NEW(test, struct task_verification_result, result); - - iint->inode = NEW(test, struct inode); - iint->version = 0; - iint->inode->i_version.counter = 0; - - iint->five_status = FIVE_FILE_RSA; - task_integrity_set(intg, FAKE_ITEGRITY_VALUE); - EXPECT_FALSE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(FAKE_ITEGRITY_VALUE, 0, - FAKE_ITEGRITY_VALUE, FAKE_ITEGRITY_VALUE); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_UNKNOWN; - task_integrity_set(intg, FAKE_ITEGRITY_VALUE + 1); - EXPECT_TRUE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_NONE, STATE_CAUSE_NOCERT, - FAKE_ITEGRITY_VALUE + 1, INTEGRITY_NONE); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_FAIL; - task_integrity_set(intg, FAKE_ITEGRITY_VALUE + 2); - EXPECT_TRUE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_NONE, STATE_CAUSE_TAMPERED, - FAKE_ITEGRITY_VALUE + 2, INTEGRITY_NONE); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_DMVERITY; - task_integrity_set(intg, INTEGRITY_PRELOAD_ALLOW_SIGN); - EXPECT_TRUE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_DMVERITY_ALLOW_SIGN, - STATE_CAUSE_DMV_PROTECTED, INTEGRITY_PRELOAD_ALLOW_SIGN, - INTEGRITY_DMVERITY_ALLOW_SIGN); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_FSVERITY; - task_integrity_set(intg, INTEGRITY_PRELOAD_ALLOW_SIGN); - EXPECT_TRUE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_DMVERITY_ALLOW_SIGN, - STATE_CAUSE_FSV_PROTECTED, INTEGRITY_PRELOAD_ALLOW_SIGN, - INTEGRITY_DMVERITY_ALLOW_SIGN); - - iint->five_label = NEW(test, struct integrity_label); - iint->five_label->len = 0; - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_HMAC; - task_integrity_set(intg, INTEGRITY_PRELOAD_ALLOW_SIGN); - EXPECT_TRUE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_MIXED_ALLOW_SIGN, STATE_CAUSE_SYSTEM_LABEL, - INTEGRITY_PRELOAD_ALLOW_SIGN, INTEGRITY_MIXED_ALLOW_SIGN); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_label->len = 1; - iint->five_status = FIVE_FILE_HMAC; - task_integrity_set(intg, INTEGRITY_PRELOAD_ALLOW_SIGN); - EXPECT_TRUE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_MIXED, STATE_CAUSE_HMAC, - INTEGRITY_PRELOAD_ALLOW_SIGN, INTEGRITY_MIXED); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_DMVERITY; - task_integrity_set(intg, INTEGRITY_PRELOAD); - EXPECT_TRUE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_DMVERITY, STATE_CAUSE_DMV_PROTECTED, - INTEGRITY_PRELOAD, INTEGRITY_DMVERITY); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_FSVERITY; - task_integrity_set(intg, INTEGRITY_PRELOAD); - EXPECT_TRUE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_DMVERITY, STATE_CAUSE_FSV_PROTECTED, - INTEGRITY_PRELOAD, INTEGRITY_DMVERITY); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_HMAC; - task_integrity_set(intg, INTEGRITY_PRELOAD); - EXPECT_TRUE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_MIXED, STATE_CAUSE_HMAC, - INTEGRITY_PRELOAD, INTEGRITY_MIXED); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_label->len = 0; - iint->five_status = FIVE_FILE_HMAC; - task_integrity_set(intg, INTEGRITY_PRELOAD); - EXPECT_TRUE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_MIXED, STATE_CAUSE_HMAC, - INTEGRITY_PRELOAD, INTEGRITY_MIXED); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_label->len = 1; - iint->five_status = FIVE_FILE_HMAC; - task_integrity_set(intg, INTEGRITY_MIXED_ALLOW_SIGN); - EXPECT_TRUE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_MIXED, STATE_CAUSE_HMAC, - INTEGRITY_MIXED_ALLOW_SIGN, INTEGRITY_MIXED); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_label->len = 0; - iint->five_status = FIVE_FILE_HMAC; - task_integrity_set(intg, INTEGRITY_MIXED_ALLOW_SIGN); - EXPECT_FALSE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_MIXED_ALLOW_SIGN, 0, - INTEGRITY_MIXED_ALLOW_SIGN, INTEGRITY_MIXED_ALLOW_SIGN); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_label->len = 1; - iint->five_status = FIVE_FILE_DMVERITY; - task_integrity_set(intg, INTEGRITY_MIXED_ALLOW_SIGN); - EXPECT_FALSE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_MIXED_ALLOW_SIGN, 0, - INTEGRITY_MIXED_ALLOW_SIGN, INTEGRITY_MIXED_ALLOW_SIGN); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_label->len = 1; - iint->five_status = FIVE_FILE_FSVERITY; - task_integrity_set(intg, INTEGRITY_MIXED_ALLOW_SIGN); - EXPECT_FALSE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_MIXED_ALLOW_SIGN, 0, - INTEGRITY_MIXED_ALLOW_SIGN, INTEGRITY_MIXED_ALLOW_SIGN); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_HMAC; - task_integrity_set(intg, INTEGRITY_DMVERITY); - EXPECT_TRUE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_MIXED, STATE_CAUSE_HMAC, - INTEGRITY_DMVERITY, INTEGRITY_MIXED); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_DMVERITY; - task_integrity_set(intg, INTEGRITY_DMVERITY); - EXPECT_FALSE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_DMVERITY, 0, - INTEGRITY_DMVERITY, INTEGRITY_DMVERITY); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_FSVERITY; - task_integrity_set(intg, INTEGRITY_DMVERITY); - EXPECT_FALSE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_DMVERITY, 0, - INTEGRITY_DMVERITY, INTEGRITY_DMVERITY); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_label->len = 0; - iint->five_status = FIVE_FILE_HMAC; - task_integrity_set(intg, INTEGRITY_DMVERITY_ALLOW_SIGN); - EXPECT_TRUE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_MIXED_ALLOW_SIGN, STATE_CAUSE_SYSTEM_LABEL, - INTEGRITY_DMVERITY_ALLOW_SIGN, INTEGRITY_MIXED_ALLOW_SIGN); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_label->len = 1; - iint->five_status = FIVE_FILE_HMAC; - task_integrity_set(intg, INTEGRITY_DMVERITY_ALLOW_SIGN); - EXPECT_TRUE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_MIXED, STATE_CAUSE_HMAC, - INTEGRITY_DMVERITY_ALLOW_SIGN, INTEGRITY_MIXED); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_DMVERITY; - task_integrity_set(intg, INTEGRITY_DMVERITY_ALLOW_SIGN); - EXPECT_FALSE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_DMVERITY_ALLOW_SIGN, 0, - INTEGRITY_DMVERITY_ALLOW_SIGN, INTEGRITY_DMVERITY_ALLOW_SIGN); - - memset(result, 0, sizeof(struct task_verification_result)); - iint->five_status = FIVE_FILE_FSVERITY; - task_integrity_set(intg, INTEGRITY_DMVERITY_ALLOW_SIGN); - EXPECT_FALSE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_DMVERITY_ALLOW_SIGN, 0, - INTEGRITY_DMVERITY_ALLOW_SIGN, INTEGRITY_DMVERITY_ALLOW_SIGN); - - memset(result, 0, sizeof(struct task_verification_result)); - task_integrity_set(intg, INTEGRITY_MIXED); - EXPECT_FALSE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_MIXED, 0, - INTEGRITY_MIXED, INTEGRITY_MIXED); - - memset(result, 0, sizeof(struct task_verification_result)); - task_integrity_set(intg, INTEGRITY_NONE); - EXPECT_FALSE(test, set_next_state(iint, intg, result)); - EXPECT_EQ_RESULT(INTEGRITY_NONE, 0, - INTEGRITY_NONE, INTEGRITY_NONE); -} - -static void five_state_proceed_no_iint_test(struct test *test) -{ - DECLARE_NEW(test, struct file_verification_result, file_result); - - file_result->iint = NULL; - - five_state_proceed(NULL, file_result); -} - -static void five_state_proceed_set_next_state_returns_false_test( - struct test *test) -{ - DECLARE_NEW(test, struct task_integrity, intg); - DECLARE_NEW(test, struct integrity_iint_cache, iint); - DECLARE_NEW(test, struct file_verification_result, file_result); - - iint->inode = NEW(test, struct inode); - iint->version = 0; - iint->inode->i_version.counter = 0; - iint->five_status = FIVE_FILE_RSA; // set_next_state() returns false - - file_result->iint = iint; - file_result->fn = MMAP_CHECK; - - five_state_proceed(intg, file_result); -} - -static void five_state_proceed_set_first_state_not_ret_intg_none_test( - struct test *test) -{ - DECLARE_NEW(test, struct task_integrity, intg); - DECLARE_NEW(test, struct integrity_iint_cache, iint); - DECLARE_NEW(test, struct file_verification_result, file_result); - - task_integrity_set(intg, INTEGRITY_NONE); - - iint->inode = NEW(test, struct inode); - iint->version = 0; - iint->inode->i_version.counter = 0; - // set_first_state() updates tint = INTEGRITY_MIXED - iint->five_status = FIVE_FILE_HMAC; - - file_result->iint = iint; - file_result->fn = BPRM_CHECK; - file_result->task = NEW(test, struct task_struct); - file_result->file = NEW(test, struct file); - file_result->five_result = FIVE_RESULT; - - Returns(EXPECT_CALL(five_audit_verbose( - ptr_eq(test, file_result->task), - ptr_eq(test, file_result->file), - streq(test, five_get_string_fn(file_result->fn)), - any(test), any(test), any(test), - int_eq(test, file_result->five_result))), - ptr_return(test, 0)); - - five_state_proceed(intg, file_result); -} - -static void five_state_proceed_set_first_state_returns_intg_none_test( - struct test *test) -{ - DECLARE_NEW(test, struct task_integrity, intg); - DECLARE_NEW(test, struct integrity_iint_cache, iint); - DECLARE_NEW(test, struct file_verification_result, file_result); - - task_integrity_set(intg, INTEGRITY_NONE); - intg->reset_cause = CAUSE_UNSET; - - iint->inode = NEW(test, struct inode); - iint->version = 0; - iint->inode->i_version.counter = 0; - // set_first_state() updates tint = INTEGRITY_NONE - iint->five_status = FIVE_FILE_UNKNOWN; - - file_result->iint = iint; - file_result->fn = BPRM_CHECK; - file_result->task = NEW(test, struct task_struct); - file_result->file = NEW(test, struct file); - file_result->five_result = FIVE_RESULT; - - Returns(EXPECT_CALL(five_hook_integrity_reset( - ptr_eq(test, file_result->task), - ptr_eq(test, file_result->file), - int_eq(test, CAUSE_NO_CERT))), - int_return(test, 0)); - - Returns(EXPECT_CALL(five_audit_verbose( - ptr_eq(test, file_result->task), - ptr_eq(test, file_result->file), - streq(test, five_get_string_fn(file_result->fn)), - any(test), any(test), any(test), - int_eq(test, file_result->five_result))), - ptr_return(test, 0)); - - five_state_proceed(intg, file_result); - - EXPECT_EQ(test, - intg->reset_cause, state_to_reason_cause(STATE_CAUSE_NOCERT)); -} - -static void five_state_proceed_set_next_state_returns_intg_none_test( - struct test *test) -{ - char pathname[] = "yyy"; - char comm[TASK_COMM_LEN] = "zzz"; - char dsms_msg[MESSAGE_BUFFER_SIZE] = "bbb"; - DECLARE_NEW(test, struct task_integrity, intg); - DECLARE_NEW(test, struct integrity_iint_cache, iint); - DECLARE_NEW(test, struct file_verification_result, file_result); - int msg_size = snprintf(dsms_msg, MESSAGE_BUFFER_SIZE, "%s|%d|%s", - comm, STATE_CAUSE_TAMPERED, kbasename(pathname)); - - task_integrity_set(intg, INTEGRITY_NONE); - intg->reset_cause = CAUSE_UNSET; - - iint->inode = NEW(test, struct inode); - iint->version = 0; - iint->inode->i_version.counter = 0; - // set_next_state() updates tint = INTEGRITY_NONE - iint->five_status = FIVE_FILE_FAIL; - - file_result->iint = iint; - file_result->fn = MMAP_CHECK; - file_result->task = NEW(test, struct task_struct); - strncpy(file_result->task->comm, comm, TASK_COMM_LEN); - file_result->file = NEW(test, struct file); - file_result->five_result = FIVE_RESULT; - - Returns(EXPECT_CALL(five_hook_integrity_reset( - ptr_eq(test, file_result->task), - ptr_eq(test, file_result->file), - int_eq(test, CAUSE_TAMPERED))), - int_return(test, 0)); - - Returns(EXPECT_CALL(five_audit_verbose( - ptr_eq(test, file_result->task), - ptr_eq(test, file_result->file), - streq(test, five_get_string_fn(file_result->fn)), - any(test), any(test), any(test), - int_eq(test, file_result->five_result))), - ptr_return(test, 0)); - - Returns(EXPECT_CALL(five_d_path( - ptr_eq(test, &file_result->file->f_path), - any(test), any(test))), - ptr_return(test, pathname)); - - Returns(EXPECT_CALL(call_crc16( - int_eq(test, 0), streq(test, dsms_msg), - int_eq(test, msg_size))), - u32_return(test, CRC_VALUE_NO_MATTER)); - - five_state_proceed(intg, file_result); - - EXPECT_EQ(test, intg->reset_cause, - state_to_reason_cause(STATE_CAUSE_TAMPERED)); -} - -static struct test_case five_state_test_cases[] = { - TEST_CASE(five_state_task_integrity_state_str_test), - TEST_CASE(five_state_to_reason_cause_test), - TEST_CASE(five_state_is_system_label_test), - TEST_CASE(five_state_integrity_label_cmp_test), - TEST_CASE(five_state_verify_or_update_label_test), - TEST_CASE(five_state_set_first_state_test), - TEST_CASE(five_state_set_next_state_test), - TEST_CASE(five_state_proceed_no_iint_test), - TEST_CASE(five_state_proceed_set_next_state_returns_false_test), - TEST_CASE(five_state_proceed_set_first_state_not_ret_intg_none_test), - TEST_CASE(five_state_proceed_set_first_state_returns_intg_none_test), - TEST_CASE(five_state_proceed_set_next_state_returns_intg_none_test), - {}, -}; - -static int five_state_test_init(struct test *test) -{ - return 0; -} - -static void five_state_test_exit(struct test *test) -{ -} - -static struct test_module five_state_test_module = { - .name = "five_state_test", - .init = five_state_test_init, - .exit = five_state_test_exit, - .test_cases = five_state_test_cases, -}; - -module_test(five_state_test_module); diff --git a/security/samsung/five/kunit_test/task_integrity_test.c b/security/samsung/five/kunit_test/task_integrity_test.c deleted file mode 100755 index 73841dc8c7ff..000000000000 --- a/security/samsung/five/kunit_test/task_integrity_test.c +++ /dev/null @@ -1,285 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - */ -#include <linux/key-type.h> -#include <linux/file.h> -#include <linux/module.h> -#include <linux/task_integrity.h> -#include <linux/proca.h> -#include <linux/xattr.h> -#include <linux/fs.h> -#include "test_helpers.h" - -void init_once(void *foo); -int copy_label(struct task_integrity *from, struct task_integrity *to); - -#define USAGE_COUNT_VAL 4 -#define USAGE_VALUE_VAL (INTEGRITY_NONE + 3) -#define LABEL_LEN 17 - -static void task_integrity_check_init_once_test(struct test *test) -{ - int i; - char *p_intg; - DECLARE_NEW(test, struct task_integrity, intg); - - memset(intg, 1, sizeof(*intg)); - init_once(intg); - p_intg = (char *)intg; - for (i = 0; i < sizeof(*intg); ++i) { - int foo = 0; - - EXPECT_EQ(test, p_intg[i], foo); - } -} - -static void task_integrity_free_test(struct test *test) -{ - DECLARE_NEW(test, struct task_integrity, intg); - - // This memory should be released in tested function. - intg->label = kzalloc(sizeof(struct integrity_label), GFP_KERNEL); - intg->reset_file = NEW(test, struct file); - - task_integrity_free(intg); - - EXPECT_EQ(test, intg->label, NULL); - EXPECT_EQ(test, intg->value, INTEGRITY_NONE); - EXPECT_EQ(test, intg->user_value, INTEGRITY_NONE); - EXPECT_EQ(test, intg->usage_count.counter, 0); - EXPECT_EQ(test, intg->reset_cause, CAUSE_UNSET); - EXPECT_EQ(test, intg->reset_file, NULL); -} - -static void task_integrity_clear_test(struct test *test) -{ - DECLARE_NEW(test, struct task_integrity, intg); - - // This memory should be released in tested function. - intg->label = kzalloc(sizeof(struct integrity_label), GFP_KERNEL); - intg->reset_file = NEW(test, struct file); - intg->user_value = USAGE_VALUE_VAL; - atomic_set(&intg->usage_count, USAGE_COUNT_VAL); - - task_integrity_clear(intg); - - EXPECT_EQ(test, intg->label, NULL); - EXPECT_EQ(test, intg->value, INTEGRITY_NONE); - EXPECT_EQ(test, intg->user_value, USAGE_VALUE_VAL); - EXPECT_EQ(test, intg->usage_count.counter, USAGE_COUNT_VAL); - EXPECT_EQ(test, intg->reset_cause, CAUSE_UNSET); - EXPECT_EQ(test, intg->reset_file, NULL); -} - -static void task_integrity_copy_label_no_value_test(struct test *test) -{ - struct task_integrity *to = NULL; - DECLARE_NEW(test, struct task_integrity, from); - - task_integrity_set(from, INTEGRITY_NONE); - from->label = NEW(test, struct integrity_label); - - EXPECT_EQ(test, copy_label(from, to), 0); -} - -static void task_integrity_copy_label_no_label_test(struct test *test) -{ - struct task_integrity *to = NULL; - DECLARE_NEW(test, struct task_integrity, from); - - task_integrity_set(from, INTEGRITY_MIXED); - from->label = NULL; - - EXPECT_EQ(test, copy_label(from, to), 0); -} - -static void task_integrity_copy_label_test(struct test *test) -{ - int i; - struct { - uint16_t len; - uint8_t data[LABEL_LEN]; - } __packed integrity_label_inst; - - DECLARE_NEW(test, struct task_integrity, from); - DECLARE_NEW(test, struct task_integrity, to); - - task_integrity_set(from, INTEGRITY_MIXED); - from->label = (struct integrity_label *)&integrity_label_inst; - from->label->len = LABEL_LEN; - for (i = 0; i < LABEL_LEN; ++i) - from->label->data[i] = i + 1; - - EXPECT_EQ(test, copy_label(from, to), 0); - - for (i = 0; i < LABEL_LEN; ++i) { - int foo = i+1; - - EXPECT_EQ(test, to->label->data[i], foo); - } - EXPECT_EQ(test, to->label->len, LABEL_LEN); - kfree(to->label); -} - -static void task_integrity_copy_list_is_empty_test(struct test *test) -{ - int i; - struct { - uint16_t len; - uint8_t data[LABEL_LEN]; - } __packed integrity_label_inst; - - DECLARE_NEW(test, struct task_integrity, from); - DECLARE_NEW(test, struct task_integrity, to); - DECLARE_NEW(test, struct file, reset_file); - - from->reset_file = NULL; - from->reset_cause = CAUSE_MISMATCH_LABEL; - task_integrity_set(from, INTEGRITY_MIXED); - from->label = (struct integrity_label *)&integrity_label_inst; - from->label->len = LABEL_LEN; - for (i = 0; i < LABEL_LEN; ++i) - from->label->data[i] = i + 1; - to->user_value = INTEGRITY_DMVERITY_ALLOW_SIGN; - to->reset_file = reset_file; - - EXPECT_EQ(test, task_integrity_copy(from, to), 0); - - for (i = 0; i < LABEL_LEN; ++i) { - int foo = i+1; - - EXPECT_EQ(test, to->label->data[i], foo); - } - EXPECT_EQ(test, to->label->len, LABEL_LEN); - EXPECT_EQ(test, task_integrity_read(from), task_integrity_read(to)); - EXPECT_EQ(test, to->user_value, INTEGRITY_DMVERITY_ALLOW_SIGN); - EXPECT_EQ(test, to->reset_cause, CAUSE_MISMATCH_LABEL); - EXPECT_EQ(test, to->reset_file, reset_file); - - kfree(to->label); -} - -static void task_integrity_copy_list_not_empty_test(struct test *test) -{ - int i; - struct { - uint16_t len; - uint8_t data[LABEL_LEN]; - } __packed integrity_label_inst; - - DECLARE_NEW(test, struct task_integrity, from); - DECLARE_NEW(test, struct task_integrity, to); - DECLARE_NEW(test, struct file, reset_file); - - from->reset_file = reset_file; - from->reset_cause = CAUSE_MISMATCH_LABEL; - task_integrity_set(from, INTEGRITY_MIXED); - from->label = (struct integrity_label *)&integrity_label_inst; - from->label->len = LABEL_LEN; - for (i = 0; i < LABEL_LEN; ++i) - from->label->data[i] = i + 1; - from->events.list.next = &from->events.list; - - to->user_value = INTEGRITY_DMVERITY_ALLOW_SIGN; - to->reset_file = NULL; - - EXPECT_EQ(test, task_integrity_copy(from, to), 0); - - for (i = 0; i < LABEL_LEN; ++i) { - int foo = i+1; - - EXPECT_EQ(test, to->label->data[i], foo); - } - EXPECT_EQ(test, to->label->len, LABEL_LEN); - EXPECT_EQ(test, task_integrity_read(from), task_integrity_read(to)); - EXPECT_EQ(test, to->user_value, INTEGRITY_MIXED); - EXPECT_EQ(test, to->reset_cause, CAUSE_MISMATCH_LABEL); - EXPECT_EQ(test, to->reset_file, reset_file); - - kfree(to->label); -} - -static void task_integrity_copy_reset_cause_to_string_test(struct test *test) -{ - EXPECT_STREQ(test, - tint_reset_cause_to_string(CAUSE_MAX+1), "incorrect-cause"); -} - -static void task_integrity_set_reset_reason_non_cause_unset_test( - struct test *test) -{ - DECLARE_NEW(test, struct task_integrity, intg); - DECLARE_NEW(test, struct file, reset_file); - - intg->reset_file = NULL; - intg->reset_cause = CAUSE_UNKNOWN; - task_integrity_set_reset_reason( - intg, CAUSE_MISMATCH_LABEL, reset_file); - EXPECT_EQ(test, intg->reset_cause, CAUSE_UNKNOWN); - EXPECT_EQ(test, intg->reset_file, NULL); -} - -static void task_integrity_set_reset_reason_no_file_test( - struct test *test) -{ - DECLARE_NEW(test, struct task_integrity, intg); - DECLARE_NEW(test, struct file, reset_file); - - intg->reset_file = reset_file; - intg->reset_cause = CAUSE_UNSET; - task_integrity_set_reset_reason(intg, CAUSE_MISMATCH_LABEL, NULL); - EXPECT_EQ(test, intg->reset_cause, CAUSE_MISMATCH_LABEL); - EXPECT_EQ(test, intg->reset_file, reset_file); -} - -static void task_integrity_set_reset_reason_test( - struct test *test) -{ - DECLARE_NEW(test, struct task_integrity, intg); - DECLARE_NEW(test, struct file, reset_file); - - intg->reset_file = NULL; - intg->reset_cause = CAUSE_UNSET; - task_integrity_set_reset_reason(intg, CAUSE_MISMATCH_LABEL, reset_file); - EXPECT_EQ(test, intg->reset_cause, CAUSE_MISMATCH_LABEL); - EXPECT_EQ(test, intg->reset_file, reset_file); -} - -static struct test_case task_integrity_test_cases[] = { - TEST_CASE(task_integrity_check_init_once_test), - TEST_CASE(task_integrity_free_test), - TEST_CASE(task_integrity_clear_test), - TEST_CASE(task_integrity_copy_label_no_value_test), - TEST_CASE(task_integrity_copy_label_no_label_test), - TEST_CASE(task_integrity_copy_label_test), - TEST_CASE(task_integrity_copy_list_is_empty_test), - TEST_CASE(task_integrity_copy_list_not_empty_test), - TEST_CASE(task_integrity_copy_reset_cause_to_string_test), - TEST_CASE(task_integrity_set_reset_reason_non_cause_unset_test), - TEST_CASE(task_integrity_set_reset_reason_no_file_test), - TEST_CASE(task_integrity_set_reset_reason_test), - {}, -}; - -static int task_integrity_test_init(struct test *test) -{ - return 0; -} - -static void task_integrity_test_exit(struct test *test) -{ - return; -} - -static struct test_module task_integrity_test_module = { - .name = "task_integrity_test", - .init = task_integrity_test_init, - .exit = task_integrity_test_exit, - .test_cases = task_integrity_test_cases, -}; - -module_test(task_integrity_test_module); diff --git a/security/samsung/five/kunit_test/test_helpers.h b/security/samsung/five/kunit_test/test_helpers.h deleted file mode 100755 index 67c0e648b1d9..000000000000 --- a/security/samsung/five/kunit_test/test_helpers.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef __LINUX_TEST_HELPERS_H -#define __LINUX_TEST_HELPERS_H - -#include <kunit/test.h> -#include <kunit/mock.h> - -#define DECLARE_NEW(test, type, ptr) \ - type *ptr = (type *)test_kzalloc(test, sizeof(type), GFP_KERNEL) - -#define NEW(test, type) \ - ((type *)test_kzalloc(test, sizeof(type), GFP_KERNEL)) - -// Create MOCK action object, initialize with action function -static inline struct mock_action *new_mock_action( - struct test *test, void *action_func_ptr) -{ - DECLARE_NEW(test, struct mock_action, action_ptr); - - action_ptr->do_action = action_func_ptr; - return action_ptr; -} - -#endif // __LINUX_TEST_HELPERS_H diff --git a/security/samsung/five/s_os/five_appraise.c b/security/samsung/five/s_os/five_appraise.c index 8b457cab9ccd..a731272f0fed 100755 --- a/security/samsung/five/s_os/five_appraise.c +++ b/security/samsung/five/s_os/five_appraise.c @@ -48,7 +48,8 @@ static bool bad_fs(struct inode *inode) { if (inode->i_sb->s_magic == EXT4_SUPER_MAGIC || inode->i_sb->s_magic == F2FS_SUPER_MAGIC || - inode->i_sb->s_magic == OVERLAYFS_SUPER_MAGIC) + inode->i_sb->s_magic == OVERLAYFS_SUPER_MAGIC || + inode->i_sb->s_magic == EROFS_SUPER_MAGIC_V1) return false; return true; diff --git a/security/samsung/five/s_os/five_main.c b/security/samsung/five/s_os/five_main.c index df81e7a2d4a5..a176e9577527 100755 --- a/security/samsung/five/s_os/five_main.c +++ b/security/samsung/five/s_os/five_main.c @@ -42,6 +42,12 @@ #include "five_dsms.h" #include "five_testing.h" +/* crash_dump in Android 12 uses this request even if Kernel doesn't + * support it */ +#ifndef PTRACE_PEEKMTETAGS +#define PTRACE_PEEKMTETAGS 33 +#endif + static const bool check_memfd_file = true; static struct file *memfd_file __ro_after_init; @@ -859,6 +865,7 @@ int five_ptrace(struct task_struct *task, long request) case PTRACE_PEEKSIGINFO: case PTRACE_GETSIGMASK: case PTRACE_GETEVENTMSG: + case PTRACE_PEEKMTETAGS: #if defined(CONFIG_ARM64) || defined(KUNIT_UML) case COMPAT_PTRACE_GETREGS: case COMPAT_PTRACE_GET_THREAD_AREA: diff --git a/security/samsung/mz/Kconfig b/security/samsung/mz/Kconfig new file mode 100755 index 000000000000..789f591d17e2 --- /dev/null +++ b/security/samsung/mz/Kconfig @@ -0,0 +1,26 @@ +# +# MZ configuration +# + +config MEMORY_ZEROISATION + bool "Support memory zeroisation" + default n + help + Support memory zeroisation feature which does zeroing of free pages. + The purpose of this is to zeroise specific memory + when target process exit. + +config MZ_PAGE_V2 + bool "Page functions version" + default n + help + MZ page management code have dependency on kernel. + This version need to be change when kernel page code is changed. + +config MZ_USE_QSEECOM + tristate "MZ Crypto TEE Driver" + help + Enable MZ crypto Trusted Execution Environment support + MZ use crypto function and it will be works in tee + if it's supported + This driver is interface for MZ NWd and MZ ta diff --git a/security/samsung/mz/Makefile b/security/samsung/mz/Makefile new file mode 100755 index 000000000000..6e9ddf6d91f1 --- /dev/null +++ b/security/samsung/mz/Makefile @@ -0,0 +1,21 @@ +$(info MZ kernel makefile main $$CONFIG_MEMORY_ZEROISATION is [${CONFIG_MEMORY_ZEROISATION}]) +obj-$(CONFIG_MEMORY_ZEROISATION) += mz_ioctl.o mz.o mz_crypto.o mz_mem.o mz_log.o +ccflags-$(CONFIG_MEMORY_ZEROISATION) += -Wno-error \ + -Wno-unused \ + -DMZ_TA + +ifneq (,$(filter $(CONFIG_SOC_S5E9925) $(CONFIG_SOC_S5E8825) $(CONFIG_MZ_PAGE_V2), y)) + obj-$(CONFIG_MEMORY_ZEROISATION) += mz_page_v5_10.o +else + obj-$(CONFIG_MEMORY_ZEROISATION) += mz_page.o +endif + +ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) + ccflags-$(CONFIG_MEMORY_ZEROISATION) += -DMZ_DEBUG -DDEBUG +endif + +ifeq ($(CONFIG_SEC_KUNIT), y) + GCOV_PROFILE := y + ccflags-y += -DMEZ_KUNIT_ENABLED + obj-$(CONFIG_MEMORY_ZEROISATION) += test/ +endif diff --git a/security/samsung/mz/include/linux/mz.h b/security/samsung/mz/include/linux/mz.h new file mode 100755 index 000000000000..c613289a1a71 --- /dev/null +++ b/security/samsung/mz/include/linux/mz.h @@ -0,0 +1,31 @@ +#ifndef _LINUX_MZ_H +#define _LINUX_MZ_H + +typedef enum { + MZ_SUCCESS = 1, + MZ_GENERAL_ERROR = 0, + MZ_MALLOC_ERROR = -1, + MZ_IOCTL_OPEN_ERROR = -2, + MZ_INVALID_INPUT_ERROR = -3, + MZ_TA_FAIL = -4, + MZ_NO_TARGET = -5, + MZ_DRIVER_FAIL = -6, + MZ_PROC_NAME_GET_ERROR = -7, + MZ_GET_TS_ERROR = -8, + MZ_LOCK_FAIL = -9, + MZ_PAGE_FAIL = -10, + MZ_CRYPTO_FAIL = -11, +} MzResult; + +MzResult mz_exit(void); + +struct mz_tee_driver_fns { + MzResult (*encrypt)(uint8_t *pt, uint8_t *ct, uint8_t *iv); +}; +MzResult register_mz_tee_crypto_driver( + struct mz_tee_driver_fns *tee_driver_fns); +void unregister_mz_tee_crypto_driver(void); +extern MzResult (*load_trusted_app)(void); +extern void (*unload_trusted_app)(void); + +#endif /* _LINUX_MZ_H */ diff --git a/security/samsung/mz/mz.c b/security/samsung/mz/mz.c new file mode 100755 index 000000000000..432c8c66ce02 --- /dev/null +++ b/security/samsung/mz/mz.c @@ -0,0 +1,441 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include <linux/highmem.h> +#include <linux/kernel.h> +#include <linux/page-isolation.h> +#include <linux/workqueue.h> +#include <trace/hooks/mz.h> +#include "mz_internal.h" +#include "mz_log.h" +#include "mz_page.h" + +static DEFINE_MUTEX(pid_list_lock); + +struct mztarget_t mz_pt_list[PRLIMIT]; +struct mutex crypto_list_lock; +struct mutex page_list_lock; +uint64_t *addr_list; +static int addr_list_count; +int addr_list_count_max; + +#ifndef CONFIG_SEC_KUNIT +static bool is_mz_target(pid_t tgid); +static bool is_mz_all_zero_target(pid_t tgid); +static MzResult mz_add_new_target(pid_t tgid); +static MzResult remove_target_from_all_list(pid_t tgid); +static struct task_struct *findts(pid_t tgid); +static void compact_addr_list(void); +static void update_list(void); +#endif /* CONFIG_SEC_KUNIT */ +static void unload_trusted_app_wq(struct work_struct *work); + +static DECLARE_WORK(mz_ta_unload_work, unload_trusted_app_wq); + +static int add_count; + +MzResult mz_exit(void) +{ + pid_t cur_tgid = current->pid; + + if (!is_mz_target(cur_tgid)) { + mz_pt_list[cur_tgid].is_ta_fail_target = false; + return MZ_SUCCESS; + } + + MZ_LOG(err_level_debug, "[MZ DEBUG] %s %d %d\n", __func__, current->tgid, current->pid); + + mz_pt_list[cur_tgid].target = false; + + remove_target_from_all_list(cur_tgid); +#ifdef MZ_TA + unload_trusted_app(); +#endif /* MZ_TA */ + + return MZ_SUCCESS; +} + +static void vh_mz_exit(void *data, struct task_struct *p) +{ + pid_t cur_tgid = p->pid; + bool ret; + + if (!is_mz_target(cur_tgid)) { + mz_pt_list[cur_tgid].is_ta_fail_target = false; + return; + } + + MZ_LOG(err_level_debug, "[MZ DEBUG] %s %d %d\n", __func__, p->tgid, p->pid); + + mz_pt_list[cur_tgid].target = false; + + remove_target_from_all_list(cur_tgid); +#ifdef MZ_TA +#ifdef CONFIG_MZ_USE_QSEECOM + ret = queue_work(system_long_wq, &mz_ta_unload_work); + if (!ret) + MZ_LOG(err_level_error, "%s unload_trusted_app workqueue fail %d\n", __func__, ret); +#else + unload_trusted_app(); +#endif +#endif /* MZ_TA */ +} + +static void unload_trusted_app_wq(struct work_struct *work) +{ + unload_trusted_app(); +} + +__visible_for_testing bool is_mz_target(pid_t tgid) +{ + if (tgid >= PRLIMIT || tgid <= 0) + return false; + + if (mz_pt_list[tgid].target) + return true; + return false; +} + +__visible_for_testing bool is_mz_all_zero_target(pid_t tgid) +{ + if (tgid >= PRLIMIT || tgid <= 0) + return false; + + if (mz_pt_list[tgid].is_ta_fail_target) + return true; + return false; +} + +MzResult mz_all_zero_set(pid_t tgid) +{ + MzResult mz_ret; + + mz_ret = mz_add_new_target(tgid); + if (mz_ret != MZ_SUCCESS) { + MZ_LOG(err_level_error, "MZ %s new target all zero set fail\n", __func__); + return mz_ret; + } + + mz_pt_list[tgid].is_ta_fail_target = true; + return mz_ret; +} + +static void compact_addr_list(void) +{ + uint64_t i = 1; + struct pid_node_t *pid_node, *tp; + struct pfn_node_encrypted_t *cur_encrypted, *t_e; + +#ifdef MZ_DEBUG + for (i = 3 ; i < addr_list_count ; i += 2) + MZ_LOG(err_level_debug, "[MZ DEBUG] %s start %d %llx %d\n", + __func__, addr_list[0], addr_list[i], addr_list[i+1]); +#endif /* MZ_DEBUG */ + + for (i = 3 ; i < addr_list[0] ; i += 2) { + if (addr_list[i] == 0) { + addr_list[i] = addr_list[addr_list_count - 1]; + addr_list[i + 1] = addr_list[addr_list_count]; + + mutex_lock(&pid_list_lock); + list_for_each_entry_safe(pid_node, tp, &pid_list, list) { + mutex_lock(&crypto_list_lock); + + list_for_each_entry_safe(cur_encrypted, t_e, + &(mz_pt_list[pid_node->tgid].mz_list_head_crypto), list) { + if (cur_encrypted->pa_index == addr_list_count - 1) + cur_encrypted->pa_index = i; + } + + mutex_unlock(&crypto_list_lock); + } + mutex_unlock(&pid_list_lock); + + memset(&(addr_list[addr_list_count - 1]), MZ_PAGE_POISON, sizeof(uint64_t) * 2); + addr_list_count -= 2; + i -= 2; + } + } + addr_list[0] = addr_list_count; + +#ifdef MZ_DEBUG + for (i = 3 ; i < addr_list_count ; i += 2) + MZ_LOG(err_level_debug, "[MZ DEBUG] %s end %d %llx %d\n", + __func__, addr_list[0], addr_list[i], addr_list[i+1]); +#endif /* MZ_DEBUG */ +} + +MzResult remove_target_from_all_list(pid_t tgid) +{ + struct pid_node_t *curp, *tp; + struct pfn_node_encrypted_t *cur_encrypted, *t_e; + page_node *cur_page, *t_p; + + if (tgid >= PRLIMIT || tgid <= 0) + return MZ_INVALID_INPUT_ERROR; + + mutex_lock(&crypto_list_lock); + list_for_each_entry_safe(cur_encrypted, t_e, &(mz_pt_list[tgid].mz_list_head_crypto), list) { + list_del(&(cur_encrypted->list)); + addr_list[cur_encrypted->pa_index] = 0; + kfree(cur_encrypted); + cur_encrypted = NULL; + } + mutex_unlock(&crypto_list_lock); + + mutex_lock(&page_list_lock); + list_for_each_entry_safe(cur_page, t_p, &(mz_pt_list[tgid].mz_list_head_page), list) { + list_del(&(cur_page->list)); + kfree(cur_page->mz_page); + kfree(cur_page); + cur_page = NULL; + } + mutex_unlock(&page_list_lock); + + mutex_lock( &pid_list_lock ); + list_for_each_entry_safe(curp, tp, &pid_list, list) { + if (curp->tgid == tgid) { + list_del(&(curp->list)); + kfree(curp); + curp = NULL; + MZ_LOG(err_level_debug, "%s %d\n", __func__, tgid); + } + } + mutex_unlock( &pid_list_lock ); + + compact_addr_list(); + + return MZ_SUCCESS; +} + +__visible_for_testing MzResult mz_add_new_target(pid_t tgid) +{ + struct pid_node_t *pid_node; + MzResult mz_ret = MZ_SUCCESS; + + if (tgid >= PRLIMIT || tgid <= 0) + return MZ_INVALID_INPUT_ERROR; + + if (is_mz_target(tgid)) { + return mz_ret; + } + + pid_node = kmalloc(sizeof(*pid_node), GFP_KERNEL); +#ifdef CONFIG_SEC_KUNIT + if (tgid == MALLOC_FAIL_PID && pid_node) { + kfree(pid_node); + pid_node = NULL; + } +#endif /* CONFIG_SEC_KUNIT */ + if (!pid_node) { + MZ_LOG(err_level_error, "%s pid_node kmalloc fail\n", __func__); + return MZ_MALLOC_ERROR; + } + + mz_pt_list[tgid].target = true; + mz_pt_list[tgid].is_ta_fail_target = false; + + pid_node->tgid = tgid; + INIT_LIST_HEAD(&(pid_node->list)); + + mutex_lock( &pid_list_lock ); + list_add(&(pid_node->list), &pid_list); + mutex_unlock( &pid_list_lock ); + + MZ_LOG(err_level_debug, "%s %d\n", __func__, tgid); + +#ifdef MZ_TA + mz_ret = load_trusted_app(); + if (mz_ret != MZ_SUCCESS) { + MZ_LOG(err_level_info, "%s ta fail %d, free all memory\n", __func__, mz_ret); + mz_pt_list[tgid].is_ta_fail_target = true; + } +#endif /* MZ_TA */ + + if (!isaddrset()) + set_mz_mem(); + + return mz_ret; +} + +static void update_list(void) +{ + uint64_t *new_addr_list; + + if (addr_list_count != addr_list_count_max - 2) + return; + + addr_list_count_max *= 2; + new_addr_list = kmalloc_array(addr_list_count_max, sizeof(uint64_t), GFP_KERNEL); + if (!new_addr_list) { + MZ_LOG(err_level_error, "%s new_addr_list kmalloc_array fail\n", __func__); + return; + } + memcpy(new_addr_list, addr_list, (sizeof(uint64_t) * addr_list_count) + sizeof(uint64_t)); + memset(addr_list, MZ_PAGE_POISON, (sizeof(uint64_t) * addr_list_count) + sizeof(uint64_t)); + kfree(addr_list); + addr_list = new_addr_list; + set_mz_mem(); +} + +MzResult mz_add_target_pfn(pid_t tgid, unsigned long pfn, unsigned long offset, + unsigned long len, unsigned long va, uint8_t __user *buf) +{ + struct pfn_node_encrypted_t *cur_encrypted; + MzResult mz_ret = MZ_SUCCESS; + struct page *target_page = pfn_to_page(pfn); + uint64_t pa; + uint64_t plain_pa_offset; + unsigned long new_pfn = 0; +#ifdef MZ_TA + uint64_t cipher_pa_offset; + uint8_t *plain_pa_offset_8, cipher_pa_offset_8[8]; +#endif + + if (pfn <= 0) + return MZ_INVALID_INPUT_ERROR; + + mz_ret = mz_add_new_target(tgid); + if (mz_ret != MZ_SUCCESS) { + return mz_ret; + } + + if (is_mz_all_zero_target(tgid)) { + return mz_ret; + } + + cur_encrypted = kmalloc(sizeof(*cur_encrypted), GFP_ATOMIC); +#ifdef CONFIG_SEC_KUNIT + if (tgid == MALLOC_FAIL_CUR && cur_encrypted) { + kfree(cur_encrypted); + cur_encrypted = NULL; + } +#endif /* CONFIG_SEC_KUNIT */ + if (!cur_encrypted) { + MZ_LOG(err_level_error, "%s cur_encrypted kmalloc fail\n", __func__); + return MZ_MALLOC_ERROR; + } + +#ifdef MZ_DEBUG + pa = page_to_phys(target_page); + MZ_LOG(err_level_debug, "%s original addr before migrate/gup %llx\n", __func__, pa + offset); +#endif + +#ifndef CONFIG_SEC_KUNIT + //Migration in case of CMA and pin + mz_ret = mz_migrate_and_pin(target_page, va, buf, &new_pfn, tgid); + if (mz_ret != MZ_SUCCESS) + goto free_alloc; +#endif /* CONFIG_SEC_KUNIT */ + + if (new_pfn != 0) + target_page = pfn_to_page(new_pfn); + pa = page_to_phys(target_page); + MZ_LOG(err_level_debug, "%s original addr after migrate/gup %llx\n", __func__, pa + offset); + + update_list(); + + plain_pa_offset = pa + offset; + +#ifdef MZ_TA + plain_pa_offset_8 = (uint8_t *)&plain_pa_offset; + mz_ret = mz_wb_encrypt(plain_pa_offset_8, cipher_pa_offset_8); + if (mz_ret != MZ_SUCCESS) + goto free_alloc; + cipher_pa_offset = *(uint64_t *)cipher_pa_offset_8; + addr_list[++addr_list_count] = cipher_pa_offset; + + MZ_LOG(err_level_debug, "%s cipher (0x%llx)\n", __func__, (unsigned long long)cipher_pa_offset); +#else + addr_list[++addr_list_count] = plain_pa_offset; +#endif + + addr_list[++addr_list_count] = len; + addr_list[0] = addr_list_count; + cur_encrypted->pa_index = addr_list_count - 1; + + INIT_LIST_HEAD(&(cur_encrypted->list)); + + mutex_lock(&crypto_list_lock); + list_add_tail(&(cur_encrypted->list), &(mz_pt_list[tgid].mz_list_head_crypto)); + mutex_unlock(&crypto_list_lock); + + MZ_LOG(err_level_debug, "%s %d %d %d (0x%llx) (0x%llx) %d\n", + __func__, tgid, ++add_count, addr_list_count, (unsigned long long)pa, offset, len); + + return mz_ret; + +free_alloc: + kfree(cur_encrypted); + return mz_ret; +} + +MzResult mzinit(void) +{ + int i; + for (i = 0 ; i < PRLIMIT ; i++) { + mz_pt_list[i].target = false; + mz_pt_list[i].is_ta_fail_target = false; + INIT_LIST_HEAD(&(mz_pt_list[i].mz_list_head_crypto)); + INIT_LIST_HEAD(&(mz_pt_list[i].mz_list_head_page)); + mutex_init(&crypto_list_lock); + mutex_init(&page_list_lock); + } + + add_count = 0; + addr_list_count = 2; + addr_list_count_max = 0; + + if (mz_addr_init()) + set_mz_mem(); + + register_trace_android_vh_mz_exit(vh_mz_exit, NULL); + + return MZ_SUCCESS; +} + +//Util +MzResult mz_kget_process_name(pid_t tgid, char* name) +{ + MzResult result = MZ_SUCCESS; + int cmdline_size; + struct task_struct *task; + + if (tgid >= PRLIMIT || tgid <= 0) + return MZ_INVALID_INPUT_ERROR; + if (name == NULL) + return MZ_INVALID_INPUT_ERROR; + + task = findts(tgid); + if (!task) + return MZ_GET_TS_ERROR; + if (task->mm == NULL) + return MZ_GET_TS_ERROR; + cmdline_size = get_cmdline(task, name, MAX_PROCESS_NAME); + if (cmdline_size == 0) + result = MZ_PROC_NAME_GET_ERROR; + name[cmdline_size] = 0; + + return result; +} + +__visible_for_testing struct task_struct *findts(pid_t tgid) +{ + struct task_struct *task; + + if (tgid >= PRLIMIT || tgid <= 0) + return NULL; + task = pid_task(find_vpid(tgid), PIDTYPE_PID); + return task; +} + +MzResult (*load_trusted_app)(void) = NULL; +EXPORT_SYMBOL(load_trusted_app); +void (*unload_trusted_app)(void) = NULL; +EXPORT_SYMBOL(unload_trusted_app); + diff --git a/security/samsung/mz/mz.h b/security/samsung/mz/mz.h new file mode 100755 index 000000000000..c613289a1a71 --- /dev/null +++ b/security/samsung/mz/mz.h @@ -0,0 +1,31 @@ +#ifndef _LINUX_MZ_H +#define _LINUX_MZ_H + +typedef enum { + MZ_SUCCESS = 1, + MZ_GENERAL_ERROR = 0, + MZ_MALLOC_ERROR = -1, + MZ_IOCTL_OPEN_ERROR = -2, + MZ_INVALID_INPUT_ERROR = -3, + MZ_TA_FAIL = -4, + MZ_NO_TARGET = -5, + MZ_DRIVER_FAIL = -6, + MZ_PROC_NAME_GET_ERROR = -7, + MZ_GET_TS_ERROR = -8, + MZ_LOCK_FAIL = -9, + MZ_PAGE_FAIL = -10, + MZ_CRYPTO_FAIL = -11, +} MzResult; + +MzResult mz_exit(void); + +struct mz_tee_driver_fns { + MzResult (*encrypt)(uint8_t *pt, uint8_t *ct, uint8_t *iv); +}; +MzResult register_mz_tee_crypto_driver( + struct mz_tee_driver_fns *tee_driver_fns); +void unregister_mz_tee_crypto_driver(void); +extern MzResult (*load_trusted_app)(void); +extern void (*unload_trusted_app)(void); + +#endif /* _LINUX_MZ_H */ diff --git a/security/samsung/mz/mz_crypto.c b/security/samsung/mz/mz_crypto.c new file mode 100755 index 000000000000..e0e0a9b0522b --- /dev/null +++ b/security/samsung/mz/mz_crypto.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include <linux/module.h> +#include "mz_internal.h" +#include "mz_log.h" + +struct mz_tee_driver_fns *g_tee_driver_fn; + +MzResult mz_wb_encrypt(uint8_t *pt, uint8_t *ct) +{ + MzResult mz_ret = MZ_SUCCESS; + uint8_t *iv; + + if (!addr_list) { + MZ_LOG(err_level_error, "%s addr_list null\n", __func__); + return MZ_CRYPTO_FAIL; + } + + iv = (uint8_t *)(&(addr_list[1])); + +#ifdef MZ_TA + //Get key from ta + mz_ret = g_tee_driver_fn->encrypt(pt, ct, iv); +#endif /* MZ_TA */ + + if (mz_ret != MZ_SUCCESS) + MZ_LOG(err_level_error, "%s ta encrypt fail, ta error %d\n", __func__, mz_ret); + + return mz_ret; +} + +//Crypto tee driver +static char is_registered; + +MzResult register_mz_tee_crypto_driver(struct mz_tee_driver_fns *tee_driver_fns) +{ + MzResult mz_ret = MZ_SUCCESS; + g_tee_driver_fn = kmalloc(sizeof(*g_tee_driver_fn), GFP_KERNEL); + if (!g_tee_driver_fn) { + MZ_LOG(err_level_error, "%s kmalloc fail\n", __func__); + mz_ret = MZ_DRIVER_FAIL; + goto exit; + } + + g_tee_driver_fn->encrypt = tee_driver_fns->encrypt; + is_registered = 1; + +exit: + return mz_ret; +} + +void unregister_mz_tee_crypto_driver(void) +{ + if (is_registered) { + kfree(g_tee_driver_fn); + g_tee_driver_fn = NULL; + is_registered = 0; + } +} + +EXPORT_SYMBOL(register_mz_tee_crypto_driver); +EXPORT_SYMBOL(unregister_mz_tee_crypto_driver); diff --git a/security/samsung/mz/mz_internal.h b/security/samsung/mz/mz_internal.h new file mode 100755 index 000000000000..6ef80c452085 --- /dev/null +++ b/security/samsung/mz/mz_internal.h @@ -0,0 +1,100 @@ +#ifndef _LINUX_MZ_INTERNAL_H +#define _LINUX_MZ_INTERNAL_H + +#include <asm/page.h> +#include <asm/tlb.h> + +#include <linux/list.h> +#include <linux/sched.h> + +#if defined(MEZ_KUNIT_ENABLED) +#include <kunit/mock.h> +#endif /* !defined(MEZ_KUNIT_ENABLED) */ + +#include "mz.h" + +#define MZ_PAGE_POISON 0x53 +#define PRLIMIT 32768 +#define MZ_APP_KEY_SIZE 32 +#define PFN_BYTE_LEN 32 +#define MAX_PROCESS_NAME 256 +#define RAND_SIZE 32 + +#ifndef PAGE_SIZE +#define PAGE_SIZE 4096 +#endif + +MzResult mzinit(void); +MzResult mz_add_target_pfn(pid_t tgid, unsigned long pfn, unsigned long offset, + unsigned long len, unsigned long va, uint8_t __user *buf); +MzResult mz_all_zero_set(pid_t tgid); +MzResult mz_kget_process_name(pid_t tgid, char *name); +MzResult mz_wb_encrypt(uint8_t *pt, uint8_t *ct); + +bool isaddrset(void); +int mz_addr_init(void); +int set_mz_mem(void); + +typedef struct pfn_node_encrypted_t { + u8 pfn[PFN_BYTE_LEN]; + int pa_index; + struct list_head list; +} pfn_node_encrypted; + +typedef struct page_node_t { + struct page **mz_page; + struct list_head list; +} page_node; + +typedef struct mztarget_t { + bool target; + struct list_head mz_list_head_crypto; + struct list_head mz_list_head_page; + bool is_ta_fail_target; +} mztarget_s; + +extern struct mutex crypto_list_lock; +extern struct mutex page_list_lock; + +typedef struct vainfo_t { + uint64_t va; + uint64_t len; + uint8_t __user *buf; +} vainfo; + +typedef struct pid_node_t { + pid_t tgid; + struct list_head list; +} pid_node; + +static LIST_HEAD(pid_list); + +#define IOC_MAGIC 'S' +#define IOCTL_MZ_SET_CMD _IOWR(IOC_MAGIC, 1, struct vainfo_t) +#define IOCTL_MZ_ALL_SET_CMD _IOWR(IOC_MAGIC, 2, struct vainfo_t) + +extern struct mztarget_t mz_pt_list[PRLIMIT]; +extern uint64_t *addr_list; +extern int addr_list_count_max; + +#ifdef MEZ_KUNIT_ENABLED +#define MALLOC_FAIL_CUR 2 +#define MALLOC_FAIL_PFN 3 +#define MALLOC_FAIL_PID 4 +#define PANIC_FAIL_PID 5 +__visible_for_testing MzResult mz_add_new_target(pid_t tgid); +__visible_for_testing bool is_mz_target(pid_t tgid); +__visible_for_testing bool is_mz_all_zero_target(pid_t tgid); +__visible_for_testing MzResult remove_target_from_all_list(pid_t tgid); +__visible_for_testing struct task_struct *findts(pid_t tgid); +__visible_for_testing long mz_ioctl(struct file *file, unsigned int cmd, unsigned long arg); +int mz_ioctl_init(void); +void mz_ioctl_exit(void); +#define IOCTL_MZ_FAIL_CMD _IOWR(IOC_MAGIC, 0, struct vainfo_t) +#else +#ifndef __visible_for_testing +#define __visible_for_testing static +#endif +#endif /* MEZ_KUNIT_ENABLED */ + +#endif /* _LINUX_MZ_INTERNAL_H */ diff --git a/security/samsung/mz/mz_ioctl.c b/security/samsung/mz/mz_ioctl.c new file mode 100755 index 000000000000..42acb943ded1 --- /dev/null +++ b/security/samsung/mz/mz_ioctl.c @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include <linux/cdev.h> +#include <linux/kconfig.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include "mz_internal.h" +#include "mz_log.h" +#include "mz_page.h" + +#define MZ_DEV "mz_ioctl" + +static struct class *driver_class, *driver_class_old; +static dev_t mz_ioctl_device_no, mz_ioctl_device_no_old; +static struct cdev mz_ioctl_cdev; + +__visible_for_testing long mz_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int ret = MZ_SUCCESS; +#ifndef CONFIG_SEC_KUNIT + vainfo mzvainfo = { 0, 0}; + + uint64_t ava, va, ptwi = 0, len; + uint64_t cur_len; + unsigned long pfn, old_pfn = 0; +#endif /* CONFIG_SEC_KUNIT */ + struct mm_struct *mm = current->mm; + pid_t cur_tid = current->pid; + uint8_t __user *buf; + uint8_t pname[MAX_PROCESS_NAME] = ""; + + if (!mm) { + MZ_LOG(err_level_error, "%s mm_struct fail\n", __func__); + ret = MZ_GENERAL_ERROR; + return ret; + } + +#ifndef CONFIG_SEC_KUNIT + ret = mz_kget_process_name(current->tgid, pname); + if (ret != MZ_SUCCESS) { + MZ_LOG(err_level_error, "%s get name fail %d %d %d\n", __func__, current->tgid, cur_tid, ret); + return ret; + } +#endif /* CONFIG_SEC_KUNIT */ + MZ_LOG(err_level_info, "%s start %s %d %d", __func__, pname, current->tgid, cur_tid); + + switch (cmd) { + case IOCTL_MZ_SET_CMD: +#if IS_ENABLED(CONFIG_MEMORY_ZEROISATION) +#ifndef CONFIG_SEC_KUNIT + ret = copy_from_user(&mzvainfo, (void *)arg, sizeof(mzvainfo)); + if (ret) + MZ_LOG(err_level_error, "%s copy from user error\n", __func__); + else ret=MZ_SUCCESS; + + va = mzvainfo.va; + len = mzvainfo.len; + buf = mzvainfo.buf; +#endif /* CONFIG_SEC_KUNIT */ + +#ifndef CONFIG_SEC_KUNIT + if (!isaddrset()) { + ret = set_mz_mem(); + if (ret != MZ_SUCCESS) { + MZ_LOG(err_level_error, "%s global list set fail %d\n", __func__, ret); + goto out; + } + } + + while (len > 0) { + ava = va + ptwi; + pfn = mz_ptw(ava, mm); + if (pfn == 0) { + MZ_LOG(err_level_error, "%s mz_ptw fail\n", __func__); + goto out; + } + + //pfn should be different from old one in normal case. It's for checking system error. + if (old_pfn != pfn) { + if (PAGE_SIZE - (ava & (PAGE_SIZE - 1)) < len) + cur_len = (PAGE_SIZE - (ava & (PAGE_SIZE - 1))); + else + cur_len = len; + + MZ_LOG(err_level_debug, "%s %d %llx %d %llx %d\n", + __func__, pfn, va, len, ava, cur_len); + + ret = mz_add_target_pfn(cur_tid, pfn, ava & (PAGE_SIZE - 1), cur_len, ava, buf); + if (ret != MZ_SUCCESS) { + MZ_LOG(err_level_error, "%s fail %d\n", __func__, ret); + goto out; + } + + len -= cur_len; + ptwi += cur_len; + + old_pfn = pfn; + } else { + MZ_LOG(err_level_debug, "%s recheck %d %llx %d %llx %d\n", + __func__, pfn, va, len, ava, cur_len); + ptwi++; + len--; + } + } +#endif /* CONFIG_SEC_KUNIT */ +out: +#endif /* IS_ENABLED(CONFIG_MEMORY_ZEROISATION) */ + break; + case IOCTL_MZ_ALL_SET_CMD: +#if IS_ENABLED(CONFIG_MEMORY_ZEROISATION) + mz_all_zero_set(cur_tid); +#endif /* IS_ENABLED(CONFIG_MEMORY_ZEROISATION) */ + break; + default: + MZ_LOG(err_level_error, "%s unknown cmd\n", __func__); + ret = MZ_INVALID_INPUT_ERROR; + break; + } + MZ_LOG(err_level_info, "%s end %s %d %d\n", __func__, pname, current->tgid, cur_tid); + + return ret; +} + +static const struct file_operations mz_ioctl_fops = { + .owner = THIS_MODULE, + .unlocked_ioctl = mz_ioctl, + .compat_ioctl = mz_ioctl, +}; + +#ifdef CONFIG_SEC_KUNIT +int mz_ioctl_init(void) +#else +static int __init mz_ioctl_init(void) +#endif +{ + int rc; + struct device *class_dev; + + MZ_LOG(err_level_info, "%s mz_ioctl\n", __func__); + + mz_ioctl_device_no_old = mz_ioctl_device_no; + driver_class_old = driver_class; + rc = alloc_chrdev_region(&mz_ioctl_device_no, 0, 1, MZ_DEV); + if (rc < 0) { + MZ_LOG(err_level_error, "%s alloc_chrdev_region failed %d\n", __func__, rc); + return rc; + } + + driver_class = class_create(THIS_MODULE, MZ_DEV); + if (IS_ERR(driver_class)) { + rc = -ENOMEM; + MZ_LOG(err_level_error, "%s class_create failed %d\n", __func__, rc); + goto unregister_chrdev_region; + } + + class_dev = device_create(driver_class, NULL, mz_ioctl_device_no, NULL, MZ_DEV); + if (!class_dev) { + rc = -ENOMEM; + MZ_LOG(err_level_error, "%s class_device_create failed %d\n", __func__, rc); + goto class_destroy; + } + + cdev_init(&mz_ioctl_cdev, &mz_ioctl_fops); + mz_ioctl_cdev.owner = THIS_MODULE; + + rc = cdev_add(&mz_ioctl_cdev, MKDEV(MAJOR(mz_ioctl_device_no), 0), 1); + if (rc < 0) { + MZ_LOG(err_level_error, "%s cdev_add failed %d\n", __func__, rc); + goto class_device_destroy; + } + + mzinit(); + + return 0; + +class_device_destroy: + device_destroy(driver_class, mz_ioctl_device_no); +class_destroy: + class_destroy(driver_class); +unregister_chrdev_region: + if (driver_class_old != NULL) { + device_destroy(driver_class_old, mz_ioctl_device_no_old); + class_destroy(driver_class_old); + driver_class_old = NULL; + unregister_chrdev_region(mz_ioctl_device_no_old, 1); + } + driver_class = NULL; + unregister_chrdev_region(mz_ioctl_device_no, 1); + return rc; +} + +#ifdef CONFIG_SEC_KUNIT +void mz_ioctl_exit(void) +#else +static void __exit mz_ioctl_exit(void) +#endif +{ + MZ_LOG(err_level_info, "%s mz_ioctl\n", __func__); + device_destroy(driver_class, mz_ioctl_device_no); + class_destroy(driver_class); + driver_class = NULL; + unregister_chrdev_region(mz_ioctl_device_no, 1); +} + + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("Samsung MZ Driver"); +MODULE_VERSION("1.00"); + +#ifndef CONFIG_SEC_KUNIT +module_init(mz_ioctl_init); +module_exit(mz_ioctl_exit); +#endif /* CONFIG_SEC_KUNIT */ + + + diff --git a/security/samsung/mz/mz_log.c b/security/samsung/mz/mz_log.c new file mode 100755 index 000000000000..644306c890b8 --- /dev/null +++ b/security/samsung/mz/mz_log.c @@ -0,0 +1,58 @@ +#include <linux/kernel.h> +#include "mz_log.h" + +#define LOG_BUF_SIZE (128 + 100) + +void mz_write_to_log(uint32_t prio, const char *tag, const char *fmt, ...) +{ + va_list ap; + int32_t len = 0; + char buf[LOG_BUF_SIZE]; + int written_amount; + + if (NULL == tag || NULL == fmt) + return; + + switch (prio) { + case err_level_debug: +#ifndef MZ_DEBUG + return; +#endif + len = snprintf(buf, LOG_BUF_SIZE, "%s_D ", tag); break; + + case err_level_info: + len = snprintf(buf, LOG_BUF_SIZE, "%s_I ", tag); break; + + case err_level_error: + len = snprintf(buf, LOG_BUF_SIZE, "%s_E ", tag); break; + + default: + len = snprintf(buf, LOG_BUF_SIZE, "%s ", tag); + break; + } + + if ((len < 0) || (LOG_BUF_SIZE - len < len)) + return; + + va_start(ap, fmt); + written_amount = vsnprintf(buf + len, LOG_BUF_SIZE - len, fmt, ap); + va_end(ap); + + if (written_amount < 0) + return; + + switch (prio) { + case err_level_debug: + pr_debug("%s", buf); break; + + case err_level_info: + pr_info("%s", buf); break; + + case err_level_error: + pr_err("%s", buf); break; + + default: + pr_info("%s", buf); + break; + } +} diff --git a/security/samsung/mz/mz_log.h b/security/samsung/mz/mz_log.h new file mode 100755 index 000000000000..87b3fbe0966c --- /dev/null +++ b/security/samsung/mz/mz_log.h @@ -0,0 +1,18 @@ +#ifndef MZ_LOG_H +#define MZ_LOG_H + +#ifndef LOG_TAG +#define LOG_TAG "MZ" +#endif // ifndef LOG_TAG + +typedef enum _err_reporting_level_t { + err_level_debug, + err_level_info, + err_level_error +} err_reporting_level_t; + +void mz_write_to_log(uint32_t prio, const char *tag, const char *fmt, ...); + +#define MZ_LOG(prio, format, ...) mz_write_to_log(prio, LOG_TAG, format, ## __VA_ARGS__) + +#endif // MZ_LOG_H diff --git a/security/samsung/mz/mz_mem.c b/security/samsung/mz/mz_mem.c new file mode 100755 index 000000000000..fed8c9db5700 --- /dev/null +++ b/security/samsung/mz/mz_mem.c @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include <linux/kconfig.h> +#include <linux/kernel.h> +#include <linux/of_address.h> +#include <linux/random.h> +#include <linux/sched/task.h> +#include "mz_internal.h" +#include "mz_log.h" + +#define ADDR_INIT_SIZE 56 + +#ifdef CONFIG_MZ_USE_TZDEV +static void *list_addr_mz; +#elif IS_ENABLED(CONFIG_MZ_USE_QSEECOM) +static void __iomem *list_addr_mz1; +static void __iomem *list_addr_mz2; +static void __iomem *list_addr_mz3; +#endif + +bool addrset; + +int mz_addr_init(void) +{ + struct device_node *np; +#ifdef CONFIG_MZ_USE_TZDEV + struct resource res; +#endif + addr_list = NULL; + +#ifdef CONFIG_MZ_USE_TZDEV + np = of_find_compatible_node(NULL, NULL, "sboot,mz"); + if (unlikely(!np)) { + MZ_LOG(err_level_error, "unable to find DT imem sboot,mz node\n"); + return -ENODEV; + } + + if (of_address_to_resource(np, 0, &res)) { + MZ_LOG(err_level_error, "%s of_address_to_resource fail\n", __func__); + return -ENODEV; + } + list_addr_mz = phys_to_virt(res.start); +#elif IS_ENABLED(CONFIG_MZ_USE_QSEECOM) + np = of_find_compatible_node(NULL, NULL, "samsung,security_mz1"); + if (unlikely(!np)) { + MZ_LOG(err_level_error, "unable to find DT imem samsung,security_mz1 node\n"); + return -ENODEV; + } + + list_addr_mz1 = of_iomap(np, 0); + if (unlikely(!list_addr_mz1)) { + MZ_LOG(err_level_error, "unable to map imem samsung,security_mz1 offset\n"); + return -ENODEV; + } + + np = of_find_compatible_node(NULL, NULL, "samsung,security_mz2"); + if (unlikely(!np)) { + MZ_LOG(err_level_error, "unable to find DT imem samsung,security_mz2 node\n"); + return -ENODEV; + } + + list_addr_mz2 = of_iomap(np, 0); + if (unlikely(!list_addr_mz2)) { + MZ_LOG(err_level_error, "unable to map imem samsung,security_mz2 offset\n"); + return -ENODEV; + } + + np = of_find_compatible_node(NULL, NULL, "samsung,security_mz3"); + if (unlikely(!np)) { + MZ_LOG(err_level_error, "unable to find DT imem samsung,security_mz3 node\n"); + return -ENODEV; + } + + list_addr_mz3 = of_iomap(np, 0); + if (unlikely(!list_addr_mz3)) { + MZ_LOG(err_level_error, "unable to map imem samsung,security_mz3 offset\n"); + return -ENODEV; + } + + MZ_LOG(err_level_debug, "list addr1 : 0x%pK(0x%llx)\n", list_addr_mz1, + (unsigned long long)virt_to_phys(list_addr_mz1)); + MZ_LOG(err_level_debug, "list addr2 : 0x%pK(0x%llx)\n", list_addr_mz2, + (unsigned long long)virt_to_phys(list_addr_mz2)); + MZ_LOG(err_level_debug, "list addr3 : 0x%pK(0x%llx)\n", list_addr_mz3, + (unsigned long long)virt_to_phys(list_addr_mz3)); +#endif + + addr_list = kmalloc(sizeof(uint64_t) * ADDR_INIT_SIZE, GFP_KERNEL); + + addr_list[0] = 0; + get_random_bytes(&(addr_list[1]), sizeof(addr_list[1]) * 2); + addr_list_count_max = ADDR_INIT_SIZE; + + MZ_LOG(err_level_debug, "%s iv %llx %llx\n", __func__, addr_list[1], addr_list[2]); + + addrset = false; + + return MZ_SUCCESS; +} + +int set_mz_mem(void) +{ + unsigned long long addr_list1, addr_list2; + uint32_t mz_magic = 0x4D5A4D5A; + + MZ_LOG(err_level_debug, "set_mz_mem start\n"); + + if (!addr_list) { + MZ_LOG(err_level_error, "%s list_addr null\n", __func__); + return MZ_GENERAL_ERROR; + } + + addr_list1 = (unsigned long long)virt_to_phys(addr_list); + addr_list2 = addr_list1 >> 32; + +#ifdef CONFIG_MZ_USE_TZDEV + memcpy(list_addr_mz, &addr_list1, 4); + memcpy(list_addr_mz+4, &addr_list2, 4); + memcpy(list_addr_mz+8, &mz_magic, 4); +#elif IS_ENABLED(CONFIG_MZ_USE_QSEECOM) + if (unlikely(!list_addr_mz1) || unlikely(!list_addr_mz2) || unlikely(!list_addr_mz3)) { + MZ_LOG(err_level_error, "list_addr address unmapped\n"); + return MZ_GENERAL_ERROR; + } + __raw_writel(addr_list1, list_addr_mz1); + __raw_writel(addr_list2, list_addr_mz2); + __raw_writel(mz_magic, list_addr_mz3); +#endif + + MZ_LOG(err_level_debug, "addr_list addr : (0x%llx) (0x%llx) (0x%llx)\n", + addr_list1, addr_list2, (unsigned long long)virt_to_phys(addr_list)); + + addrset = true; + + return MZ_SUCCESS; +} + +bool isaddrset(void) +{ + return addrset; +} diff --git a/security/samsung/mz/mz_page.c b/security/samsung/mz/mz_page.c new file mode 100755 index 000000000000..d0ede8ad29b0 --- /dev/null +++ b/security/samsung/mz/mz_page.c @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include <linux/atomic.h> +#include <linux/delay.h> +#include <linux/list.h> +#include <linux/migrate.h> +#include <linux/mmzone.h> +#include <linux/mutex.h> +#include <linux/rmap.h> +#include <linux/sched.h> +#include <linux/spinlock.h> +#include <linux/vmalloc.h> +#include <linux/kernel.h> +#include <linux/sched/mm.h> +#include "mz_internal.h" +#include "mz_log.h" +#include "mz_page.h" + +static inline struct page *mz_migrate_alloc(struct page *page, unsigned long private) +{ + return alloc_page(GFP_KERNEL); +} + +static void mz_migrate_free(struct page *page, unsigned long private) +{ + __free_page(page); +} + +unsigned long mz_get_migratetype(struct page *page) +{ + struct zone *zone; + unsigned long flags; + unsigned long migrate_type; + + // Zone lock must be held to avoid race with + // set_pageblock_migratetype() + zone = page_zone(page); + spin_lock_irqsave(&zone->lock, flags); + migrate_type = get_pageblock_migratetype(page); + spin_unlock_irqrestore(&zone->lock, flags); + + return migrate_type; +} + +void move_page_data(struct page *from, struct page *to) +{ + void *old_page_addr, *new_page_addr; +#ifdef MZ_DEBUG + uint64_t opa, npa; +#endif + + old_page_addr = kmap_atomic(from); + new_page_addr = kmap_atomic(to); + memcpy(new_page_addr, old_page_addr, PAGE_SIZE); + memset(old_page_addr, MZ_PAGE_POISON, PAGE_SIZE); + +#ifdef MZ_DEBUG + opa = page_to_phys(from); + npa = page_to_phys(to); + MZ_LOG(err_level_debug, "%s %llx %llx\n", __func__, opa, npa); +#endif + + kunmap_atomic(old_page_addr); + kunmap_atomic(new_page_addr); +} + + +MzResult mz_migrate_pages(struct page *page) +{ + int res; + MzResult mz_ret = MZ_SUCCESS; + LIST_HEAD(pages_list); + + MZ_LOG(err_level_debug, "%s start\n", __func__); + + migrate_prep(); + + res = isolate_lru_page(page); + if (res < 0) { + MZ_LOG(err_level_error, "%s isolate_lru_page fail %d\n", __func__, res); + return MZ_PAGE_FAIL; + } + + list_add_tail(&page->lru, &pages_list); + put_page(page); + /* page will be refilled with migrated pages later */ + page = NULL; + + res = _mz_migrate_pages(&pages_list, mz_migrate_alloc, mz_migrate_free); + if (res) { + MZ_LOG(err_level_error, "%s migrate fail %d\n", __func__, res); + putback_movable_pages(&pages_list); + mz_ret = MZ_PAGE_FAIL; + } + + MZ_LOG(err_level_debug, "%s end\n", __func__); + + return mz_ret; +} + +static __maybe_unused unsigned int gup_flags(int write, int force) +{ + unsigned int flags = 0; + + if (write) + flags |= FOLL_WRITE; + if (force) + flags |= FOLL_FORCE; + + return flags; +} + +static int mz_verify_migration_page(struct page *page) +{ + unsigned long migrate_type; + + migrate_type = mz_get_migratetype(page); + if (migrate_type == MIGRATE_CMA) + return -EFAULT; + + return 0; +} + +MzResult mz_get_user_pages(struct task_struct *task, struct mm_struct *mm, unsigned long va, + struct page **target_page, int after_mig, uint8_t __user *buf) +{ + int res; + MzResult mz_ret = MZ_SUCCESS; + + MZ_LOG(err_level_debug, "%s start %llx %d %llx\n", __func__, va, after_mig, (unsigned long)buf); + + res = get_user_pages_remote(task, mm, (unsigned long)buf, 1, gup_flags(1, 0), target_page, NULL, NULL); + if (res <= 0) { + MZ_LOG(err_level_error, "%s gup fail %d\n", __func__, res); + mz_ret = MZ_PAGE_FAIL; + goto fail; + } + + if (!after_mig) + atomic64_inc(&(mm->pinned_vm)); + + MZ_LOG(err_level_debug, "%s end\n", __func__); + + return MZ_SUCCESS; + +fail: + put_page(target_page[0]); + + return mz_ret; +} + +MzResult mz_migrate_and_pin(struct page *target_page, unsigned long va, uint8_t __user *buf, + unsigned long *new_pfn, pid_t tgid) +{ + MzResult mz_ret = MZ_SUCCESS; + struct page *mig_temp = NULL; + struct page **new_page; + struct task_struct *task; + struct mm_struct *mm; + int res; + page_node *cur_page; + + task = current; + mm = get_task_mm(task); + if (!mm) { + MZ_LOG(err_level_error, "%s get_task_mm fail\n", __func__); + return MZ_PAGE_FAIL; + } + new_page = kcalloc(1, sizeof(struct page *), GFP_KERNEL); + + /* + * Holding 'mm->mmap_sem' is required to synchronize users who try to register same pages simultaneously. + * Migration is impossible without synchronization due to page refcount holding by both users. + */ + down_write(&mm->mmap_sem); + +#ifdef MZ_DEBUG + if (mz_get_migratetype(target_page) == MIGRATE_CMA) + MZ_LOG(err_level_debug, "%s target_page is CMA\n", __func__); +#endif + + mz_ret = mz_get_user_pages(task, mm, va, &new_page[0], 0, buf); + if (mz_ret != MZ_SUCCESS) + goto out_pfns; + + if (mz_get_migratetype(new_page[0]) == MIGRATE_CMA) { + mig_temp = alloc_page(GFP_KERNEL); + move_page_data(target_page, mig_temp); + + mz_ret = mz_migrate_pages(new_page[0]); + if (mz_ret != MZ_SUCCESS) + goto out_pin; + + mz_ret = mz_get_user_pages(task, mm, va, &new_page[0], 1, buf); + if (mz_ret != MZ_SUCCESS) + goto out_pin; + + res = mz_verify_migration_page(new_page[0]); + if (res != 0) { + MZ_LOG(err_level_error, "%s mz_verify_migration_page fail %d\n", __func__, res); + mz_ret = MZ_PAGE_FAIL; + goto out_pin; + } + + *new_pfn = mz_ptw(va, mm); + if (*new_pfn == 0) { + MZ_LOG(err_level_error, "%s mz_ptw fail\n", __func__); + mz_ret = MZ_PAGE_FAIL; + goto out_pin; + } + + if (mig_temp) { + move_page_data(mig_temp, pfn_to_page(*new_pfn)); + __free_page(mig_temp); + } + } + + up_write(&mm->mmap_sem); + + cur_page = kmalloc(sizeof(*cur_page), GFP_ATOMIC); + cur_page->mz_page = new_page; + INIT_LIST_HEAD(&(cur_page->list)); + + mutex_lock(&page_list_lock); + list_add_tail(&(cur_page->list), &(mz_pt_list[tgid].mz_list_head_page)); + mutex_unlock(&page_list_lock); + + return mz_ret; + +out_pin: + put_page(new_page[0]); + down_write(&mm->mmap_sem); + atomic64_dec(&(mm->pinned_vm)); + up_write(&mm->mmap_sem); +out_pfns: + up_write(&mm->mmap_sem); + kfree(new_page); + mmput(mm); + + return mz_ret; +} + +unsigned long mz_ptw(unsigned long ava, struct mm_struct *mm) +{ + pte_t pte; + pgd_t *pgd; + pud_t *pud; + pmd_t *pmd; + pte_t *ptep = NULL; + unsigned long pfn = 0; + + pgd = pgd_offset(mm, ava); + if (pgd_none(*pgd) || pgd_bad(*pgd)) { + MZ_LOG(err_level_error, "%s pgd_offset fail\n", __func__); + goto out; + } + pud = pud_offset(pgd, ava); + if (pud_none(*pud) || pud_bad(*pud)) { + MZ_LOG(err_level_error, "%s pud_offset fail\n", __func__); + goto out; + } + pmd = pmd_offset(pud, ava); + if (pmd_none(*pmd) || pmd_bad(*pmd)) { + MZ_LOG(err_level_error, "%s pmd_offset fail\n", __func__); + goto out; + } + ptep = pte_offset_map(pmd, ava); + if (!ptep) { + MZ_LOG(err_level_error, "%s pte_offset_map fail\n", __func__); + goto out; + } + + pte = *ptep; + pfn = pte_pfn(pte); + +out: + if (ptep) { + pte_unmap(ptep); + ptep = NULL; + } + + return pfn; +} + diff --git a/security/samsung/mz/mz_page.h b/security/samsung/mz/mz_page.h new file mode 100755 index 000000000000..21e373cd80c5 --- /dev/null +++ b/security/samsung/mz/mz_page.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + + +#ifndef __MZ_PAGE_H__ +#define __MZ_PAGE_H__ + +#include <linux/kernel.h> +#include <linux/migrate.h> +#include <linux/version.h> + +#if KERNEL_VERSION(5, 15, 0) <= LINUX_VERSION_CODE +#define _mz_migrate_pages(list, alloc, free) \ + migrate_pages((list), (alloc), (free), 0, MIGRATE_SYNC, MR_MEMORY_FAILURE, 0) +#else +#define _mz_migrate_pages(list, alloc, free) \ + migrate_pages((list), (alloc), (free), 0, MIGRATE_SYNC, MR_MEMORY_FAILURE) +#endif + +unsigned long mz_get_migratetype(struct page *page); +MzResult mz_migrate_pages(struct page *page); +MzResult mz_get_user_pages(struct task_struct *task, struct mm_struct *mm, unsigned long va, + struct page **target_page, int after_mig, uint8_t __user *buf); +void move_page_data(struct page *from, struct page *to); +MzResult mz_migrate_and_pin(struct page *target_page, unsigned long va, uint8_t __user *buf, + unsigned long *new_pfn, pid_t tgid); +unsigned long mz_ptw(unsigned long va, struct mm_struct *mm); + +#endif /* __MZ_PAGE_H__ */ diff --git a/security/samsung/mz/mz_page_v5_10.c b/security/samsung/mz/mz_page_v5_10.c new file mode 100755 index 000000000000..f2f3e1c692a8 --- /dev/null +++ b/security/samsung/mz/mz_page_v5_10.c @@ -0,0 +1,291 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include <linux/atomic.h> +#include <linux/list.h> +#include <linux/migrate.h> +#include <linux/mmzone.h> +#include <linux/mutex.h> +#include <linux/rmap.h> +#include <linux/sched.h> +#include <linux/spinlock.h> +#include <linux/vmalloc.h> +#include <linux/kernel.h> +#include <linux/sched/mm.h> +#include "mz_internal.h" +#include "mz_log.h" +#include "mz_page.h" + +int isolate_lru_page(struct page *page); + +static inline struct page *mz_migrate_alloc(struct page *page, unsigned long private) +{ + return alloc_page(GFP_KERNEL); +} + +static void mz_migrate_free(struct page *page, unsigned long private) +{ + __free_page(page); +} + +unsigned long mz_get_migratetype(struct page *page) +{ + struct zone *zone; + unsigned long flags; + unsigned long migrate_type; + + // Zone lock must be held to avoid race with + // set_pageblock_migratetype() + zone = page_zone(page); + spin_lock_irqsave(&zone->lock, flags); + migrate_type = get_pageblock_migratetype(page); + spin_unlock_irqrestore(&zone->lock, flags); + + return migrate_type; +} + +void move_page_data(struct page *from, struct page *to) +{ + void *old_page_addr, *new_page_addr; +#ifdef MZ_DEBUG + uint64_t opa, npa; +#endif + + old_page_addr = kmap_atomic(from); + new_page_addr = kmap_atomic(to); + memcpy(new_page_addr, old_page_addr, PAGE_SIZE); + memset(old_page_addr, MZ_PAGE_POISON, PAGE_SIZE); + +#ifdef MZ_DEBUG + opa = page_to_phys(from); + npa = page_to_phys(to); + MZ_LOG(err_level_debug, "%s %llx %llx\n", __func__, opa, npa); +#endif + + kunmap_atomic(old_page_addr); + kunmap_atomic(new_page_addr); +} + + +MzResult mz_migrate_pages(struct page *page) +{ + int res; + MzResult mz_ret = MZ_SUCCESS; + LIST_HEAD(pages_list); + + MZ_LOG(err_level_debug, "%s start\n", __func__); + + lru_add_drain_all(); + + res = isolate_lru_page(page); + if (res < 0) { + MZ_LOG(err_level_error, "%s isolate_lru_page fail %d\n", __func__, res); + return MZ_PAGE_FAIL; + } + + list_add_tail(&page->lru, &pages_list); + put_page(page); + /* page will be refilled with migrated pages later */ + page = NULL; + + res = _mz_migrate_pages(&pages_list, mz_migrate_alloc, mz_migrate_free); + if (res) { + MZ_LOG(err_level_error, "%s migrate fail %d\n", __func__, res); + putback_movable_pages(&pages_list); + mz_ret = MZ_PAGE_FAIL; + } + + MZ_LOG(err_level_debug, "%s end\n", __func__); + + return mz_ret; +} + +static __maybe_unused unsigned int gup_flags(int write, int force) +{ + unsigned int flags = 0; + + if (write) + flags |= FOLL_WRITE; + if (force) + flags |= FOLL_FORCE; + + return flags; +} + +static int mz_verify_migration_page(struct page *page) +{ + unsigned long migrate_type; + + migrate_type = mz_get_migratetype(page); + if (migrate_type == MIGRATE_CMA) + return -EFAULT; + + return 0; +} + +MzResult mz_get_user_pages(struct task_struct *task, struct mm_struct *mm, unsigned long va, + struct page **target_page, int after_mig, uint8_t __user *buf) +{ + int res; + MzResult mz_ret = MZ_SUCCESS; + + MZ_LOG(err_level_debug, "%s start %llx %d %llx\n", __func__, va, after_mig, (unsigned long)buf); + + res = get_user_pages_remote(mm, (unsigned long)buf, 1, gup_flags(1, 0), target_page, NULL, NULL); + if (res <= 0) { + MZ_LOG(err_level_error, "%s gup fail %d\n", __func__, res); + mz_ret = MZ_PAGE_FAIL; + } else if (!after_mig) + atomic64_inc(&(mm->pinned_vm)); + + MZ_LOG(err_level_debug, "%s end\n", __func__); + + return mz_ret; +} + +MzResult mz_migrate_and_pin(struct page *target_page, unsigned long va, uint8_t __user *buf, + unsigned long *new_pfn, pid_t tgid) +{ + MzResult mz_ret = MZ_SUCCESS; + struct page *mig_temp = NULL; + struct page **new_page; + struct task_struct *task; + struct mm_struct *mm; + int res; + page_node *cur_page; + + task = current; + mm = get_task_mm(task); + if (!mm) { + MZ_LOG(err_level_error, "%s get_task_mm fail\n", __func__); + return MZ_PAGE_FAIL; + } + new_page = kcalloc(1, sizeof(struct page *), GFP_KERNEL); + + /* + * Holding 'mm->mmap_lock' is required to synchronize users who try to register same pages simultaneously. + * Migration is impossible without synchronization due to page refcount holding by both users. + */ + down_write(&mm->mmap_lock); + +#ifdef MZ_DEBUG + if (mz_get_migratetype(target_page) == MIGRATE_CMA) + MZ_LOG(err_level_debug, "%s target_page is CMA\n", __func__); +#endif + + //pin + mz_ret = mz_get_user_pages(task, mm, va, &(new_page[0]), 0, buf); + if (mz_ret != MZ_SUCCESS) { + put_page(new_page[0]); + goto out_pfns; + } + + if (mz_get_migratetype(new_page[0]) == MIGRATE_CMA) { + mig_temp = alloc_page(GFP_KERNEL); + if (!mig_temp) { + MZ_LOG(err_level_error, "%s alloc_page fail\n", __func__); + goto out_pin; + } + move_page_data(target_page, mig_temp); + + mz_ret = mz_migrate_pages(new_page[0]); + if (mz_ret != MZ_SUCCESS) + goto out_pin; + + mz_ret = mz_get_user_pages(task, mm, va, &(new_page[0]), 1, buf); + if (mz_ret != MZ_SUCCESS) { + put_page(new_page[0]); + goto out_pin; + } + + res = mz_verify_migration_page(new_page[0]); + if (res != 0) { + MZ_LOG(err_level_error, "%s mz_verify_migration_page fail %d\n", __func__, res); + mz_ret = MZ_PAGE_FAIL; + goto out_pin; + } + + *new_pfn = mz_ptw(va, mm); + if (*new_pfn == 0) { + MZ_LOG(err_level_error, "%s mz_ptw fail\n", __func__); + mz_ret = MZ_PAGE_FAIL; + goto out_pin; + } + + if (mig_temp) { + move_page_data(mig_temp, pfn_to_page(*new_pfn)); + __free_page(mig_temp); + } + } + + up_write(&mm->mmap_lock); + + cur_page = kmalloc(sizeof(*cur_page), GFP_ATOMIC); + cur_page->mz_page = new_page; + INIT_LIST_HEAD(&(cur_page->list)); + + mutex_lock(&page_list_lock); + list_add_tail(&(cur_page->list), &(mz_pt_list[tgid].mz_list_head_page)); + mutex_unlock(&page_list_lock); + + mmput(mm); + + return mz_ret; + +out_pin: + atomic64_dec(&(mm->pinned_vm)); +out_pfns: + up_write(&mm->mmap_lock); + kfree(new_page); + mmput(mm); + + return mz_ret; +} + +unsigned long mz_ptw(unsigned long ava, struct mm_struct *mm) +{ + pgd_t *pgd; + p4d_t *p4d; + pud_t *pud; + pmd_t *pmd; + pte_t *pte = NULL; + unsigned long pfn = 0; + + pgd = pgd_offset(mm, ava); + if (!pgd_present(*pgd)) { + MZ_LOG(err_level_error, "%s pgd_offset fail\n", __func__); + goto out; + } + p4d = p4d_offset(pgd, ava); + if (!p4d_present(*p4d)) { + MZ_LOG(err_level_error, "%s p4d_offset fail\n", __func__); + goto out; + } + pud = pud_offset(p4d, ava); + if (!pud_present(*pud)) { + MZ_LOG(err_level_error, "%s pud_offset fail\n", __func__); + goto out; + } + pmd = pmd_offset(pud, ava); + if (!pmd_present(*pmd)) { + MZ_LOG(err_level_error, "%s pmd_offset fail\n", __func__); + goto out; + } + pte = pte_offset_map(pmd, ava); + + pfn = pte_pfn(*pte); + +out: + if (pte) { + pte_unmap(pte); + pte = NULL; + } + + return pfn; +} + diff --git a/security/samsung/mz/test/Makefile b/security/samsung/mz/test/Makefile new file mode 100755 index 000000000000..cf75b3c2ca4a --- /dev/null +++ b/security/samsung/mz/test/Makefile @@ -0,0 +1 @@ +obj-y = security_mz_test.o diff --git a/security/samsung/mz/test/security_mz_test.c b/security/samsung/mz/test/security_mz_test.c new file mode 100755 index 000000000000..b318514ebcd8 --- /dev/null +++ b/security/samsung/mz/test/security_mz_test.c @@ -0,0 +1,152 @@ +#include <kunit/test.h> +#include <kunit/mock.h> +#include <linux/printk.h> +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/fs.h> +#include <linux/device.h> +#include <linux/unistd.h> +#include <linux/errno.h> +#include <linux/mz.h> + +int test_pid = 10; + +static void security_mz_add_target_pfn_test(struct kunit *test) +{ + pr_info("MZ %s start\n", __func__); + +/* KUNIT_EXPECT_EQ(test, MZ_SUCCESS, mzinit()); + KUNIT_EXPECT_EQ(test, MZ_SUCCESS, mz_add_target_pfn(test_pid, 99999)); + KUNIT_EXPECT_EQ(test, MZ_SUCCESS, mz_all_zero_set(test_pid)); + KUNIT_EXPECT_EQ(test, MZ_SUCCESS, mz_add_target_pfn(test_pid, 100000)); + KUNIT_EXPECT_EQ(test, MZ_INVALID_INPUT_ERROR, mz_add_target_pfn(0, 99999)); + KUNIT_EXPECT_EQ(test, MZ_INVALID_INPUT_ERROR, mz_add_target_pfn(PRLIMIT, 99999)); + KUNIT_EXPECT_EQ(test, MZ_INVALID_INPUT_ERROR, mz_add_target_pfn(test_pid, 0)); + KUNIT_EXPECT_EQ(test, MZ_MALLOC_ERROR, mz_add_target_pfn(MALLOC_FAIL_CUR, 99999)); + KUNIT_EXPECT_EQ(test, MZ_MALLOC_ERROR, mz_add_target_pfn(MALLOC_FAIL_PFN, 99999)); + KUNIT_EXPECT_EQ(test, MZ_SUCCESS, remove_target_from_all_list(test_pid)); + KUNIT_EXPECT_EQ(test, MZ_SUCCESS, remove_target_from_all_list(MALLOC_FAIL_CUR)); + KUNIT_EXPECT_EQ(test, MZ_SUCCESS, remove_target_from_all_list(MALLOC_FAIL_PFN)); //*/ +} + +static void security_mz_add_new_target_test(struct kunit *test) +{ + pr_info("MZ %s start\n", __func__); + +/* KUNIT_EXPECT_EQ(test, MZ_SUCCESS, mz_add_new_target(test_pid)); + KUNIT_EXPECT_EQ(test, MZ_INVALID_INPUT_ERROR, mz_add_new_target(0)); + KUNIT_EXPECT_EQ(test, MZ_INVALID_INPUT_ERROR, mz_add_new_target(PRLIMIT)); + KUNIT_EXPECT_EQ(test, MZ_MALLOC_ERROR, mz_add_new_target(MALLOC_FAIL_PID)); + KUNIT_EXPECT_EQ(test, MZ_SUCCESS, remove_target_from_all_list(test_pid)); //*/ +} + +static void security_mz_is_mz_target_test(struct kunit *test) +{ + pr_info("MZ %s start\n", __func__); + +/* KUNIT_EXPECT_EQ(test, MZ_SUCCESS, mz_add_target_pfn(test_pid, 99999)); + KUNIT_EXPECT_TRUE(test, is_mz_target(test_pid)); + KUNIT_EXPECT_FALSE(test, is_mz_target(999)); + KUNIT_EXPECT_FALSE(test, is_mz_target(0)); + KUNIT_EXPECT_FALSE(test, is_mz_target(PRLIMIT)); + KUNIT_EXPECT_EQ(test, MZ_SUCCESS, remove_target_from_all_list(test_pid)); //*/ +} + +static void security_mz_is_mz_all_zero_target_test(struct kunit *test) +{ + pr_info("MZ %s start\n", __func__); + +/* KUNIT_EXPECT_EQ(test, MZ_SUCCESS, mz_all_zero_set(test_pid)); + KUNIT_EXPECT_TRUE(test, is_mz_all_zero_target(test_pid)); + KUNIT_EXPECT_FALSE(test, is_mz_all_zero_target(999)); + KUNIT_EXPECT_FALSE(test, is_mz_all_zero_target(0)); + KUNIT_EXPECT_FALSE(test, is_mz_all_zero_target(PRLIMIT)); + KUNIT_EXPECT_EQ(test, MZ_SUCCESS, remove_target_from_all_list(test_pid)); //*/ +} + +static void security_mz_all_zero_set_test(struct kunit *test) +{ + pr_info("MZ %s start\n", __func__); + +/* KUNIT_EXPECT_EQ(test, MZ_SUCCESS, mz_all_zero_set(test_pid)); + KUNIT_EXPECT_EQ(test, MZ_INVALID_INPUT_ERROR, mz_all_zero_set(0)); + KUNIT_EXPECT_EQ(test, MZ_INVALID_INPUT_ERROR, mz_all_zero_set(PRLIMIT)); + KUNIT_EXPECT_EQ(test, MZ_SUCCESS, remove_target_from_all_list(test_pid)); //*/ +} + +static void security_mz_remove_target_from_all_list_test(struct kunit *test) +{ + pr_info("MZ %s start\n", __func__); + +/* KUNIT_EXPECT_EQ(test, MZ_SUCCESS, mz_add_target_pfn(test_pid, 1)); + KUNIT_EXPECT_EQ(test, MZ_SUCCESS, remove_target_from_all_list(test_pid)); + KUNIT_EXPECT_EQ(test, MZ_INVALID_INPUT_ERROR, remove_target_from_all_list(0)); + KUNIT_EXPECT_EQ(test, MZ_INVALID_INPUT_ERROR, remove_target_from_all_list(PRLIMIT)); //*/ +} + +static void security_mz_exit_test(struct kunit *test) +{ + pr_info("MZ %s start\n", __func__); + + KUNIT_EXPECT_EQ(test, MZ_SUCCESS, mz_exit()); +} + +static void security_mz_util_test(struct kunit *test) +{ + pr_info("MZ %s start\n", __func__); + +/* KUNIT_EXPECT_EQ(test, MZ_INVALID_INPUT_ERROR, mz_kget_process_name(test_pid, NULL)); + KUNIT_EXPECT_EQ(test, MZ_INVALID_INPUT_ERROR, mz_kget_process_name(0, NULL)); + KUNIT_EXPECT_EQ(test, MZ_INVALID_INPUT_ERROR, mz_kget_process_name(PRLIMIT, NULL)); + KUNIT_EXPECT_NULL(test, findts(0)); + KUNIT_EXPECT_NULL(test, findts(PRLIMIT)); //*/ +} + +static void security_mz_ioctl_test(struct kunit *test) +{ + pr_info("MZ %s start\n", __func__); + +/* KUNIT_EXPECT_EQ(test, 0, mz_ioctl_init()); + KUNIT_EXPECT_EQ(test, -ENOMEM, mz_ioctl_init()); + KUNIT_EXPECT_EQ(test, 0, mz_ioctl_init()); + KUNIT_EXPECT_EQ(test, MZ_GENERAL_ERROR, mz_ioctl(NULL, IOCTL_MZ_SET_CMD, 0)); + KUNIT_EXPECT_EQ(test, MZ_SUCCESS, mz_ioctl(NULL, IOCTL_MZ_ALL_SET_CMD, 0)); + KUNIT_EXPECT_EQ(test, MZ_INVALID_INPUT_ERROR, mz_ioctl(NULL, IOCTL_MZ_FAIL_CMD, 0)); + KUNIT_EXPECT_EQ(test, MZ_SUCCESS, remove_target_from_all_list(current->tgid)); + mz_ioctl_exit(); //*/ +} + +static int security_mz_test_init(struct kunit *test) +{ + return 0; +} + +static void security_mz_test_exit(struct kunit *test) +{ + test_pid++; + if (test_pid >= PRLIMIT) + test_pid = 10; +} + +static struct kunit_case security_mz_test_cases[] = { + KUNIT_CASE(security_mz_add_target_pfn_test), + KUNIT_CASE(security_mz_add_new_target_test), + KUNIT_CASE(security_mz_is_mz_target_test), + KUNIT_CASE(security_mz_is_mz_all_zero_target_test), + KUNIT_CASE(security_mz_all_zero_set_test), + KUNIT_CASE(security_mz_remove_target_from_all_list_test), + KUNIT_CASE(security_mz_exit_test), + KUNIT_CASE(security_mz_util_test), + KUNIT_CASE(security_mz_ioctl_test), + {}, +}; + +static struct kunit_suite security_mz_test_module = { + .name = "security-mz-test", + .init = security_mz_test_init, + .exit = security_mz_test_exit, + .test_cases = security_mz_test_cases, +}; +kunit_test_suites(&security_mz_test_module); + +MODULE_LICENSE("GPL v2"); diff --git a/security/samsung/mz_tee_driver/Kconfig b/security/samsung/mz_tee_driver/Kconfig new file mode 100755 index 000000000000..dbff818f69f1 --- /dev/null +++ b/security/samsung/mz_tee_driver/Kconfig @@ -0,0 +1,48 @@ +# +# TEE Driver configuration +# + +config MZ_TEE_DRIVER + tristate "Crypto TEE Driver" + depends on MEMORY_ZEROISATION + default y + help + Enable MZ crypto Trusted Execution Environment support + MZ use crypto function and it will be works in tee + if it's supported + This driver is interface for MZ NWd and MZ ta + +choice + prompt "MZ Secure OS" + depends on MZ_TEE_DRIVER + default MZ_USE_QSEECOM if QSEECOM + default MZ_USE_TZDEV if TZDEV + default MZ_USE_TRUSTONIC if TRUSTONIC_TEE + default MZ_DEFAULT + help + Select Secure OS for MZ + + config MZ_USE_TRUSTONIC + bool "MZ based on Trustonic Secure OS" + depends on TRUSTONIC_TEE + help + Use Trustonic as base Trusted Execution Environment + + config MZ_USE_TZDEV + bool "MZ based on TEEgris Secure OS" + depends on TZDEV + help + Use TEEgris as base Trusted Execution Environment + + config MZ_USE_QSEECOM + bool "MZ based on Qualcomm Secure OS" + depends on QSEECOM + help + Use Qualcomm as base Trusted Execution Environment + + config MZ_DEFAULT + bool "MZ Disabled" + help + MZ disabled +endchoice + diff --git a/security/samsung/mz_tee_driver/Makefile b/security/samsung/mz_tee_driver/Makefile new file mode 100755 index 000000000000..e8aeeb1fe7b9 --- /dev/null +++ b/security/samsung/mz_tee_driver/Makefile @@ -0,0 +1,18 @@ +# +# Crypto TEE Driver +# + +obj-$(CONFIG_MZ_TEE_DRIVER) += tee_driver.o + +tee_driver-$(CONFIG_MZ_USE_QSEECOM) += mz_tee_driver_qc.o +tee_driver-$(CONFIG_MZ_USE_TZDEV) += mz_tee_driver_teegris.o + +ccflags-$(CONFIG_MZ_TEE_DRIVER) += -I$(srctree)/drivers/security/samsung/mz +ccflags-$(CONFIG_MZ_TEE_DRIVER) += -I$(srctree)/drivers/misc +ccflags-$(CONFIG_MZ_USE_TZDEV) += -I$(srctree)/drivers/misc/tzdev/include + +subdir-ccflags-y := -Wformat + +ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) + ccflags-y += -DMZ_DEBUG -DDEBUG +endif diff --git a/security/samsung/mz_tee_driver/mz_tee_driver.c b/security/samsung/mz_tee_driver/mz_tee_driver.c new file mode 100755 index 000000000000..d028d8ba83fc --- /dev/null +++ b/security/samsung/mz_tee_driver/mz_tee_driver.c @@ -0,0 +1,397 @@ +/* + * TEE Driver + * + * Copyright (C) 2019 Samsung Electronics, Inc. + * An Seongjin, <seongjin.an@samsung.com> + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/module.h> +#include <linux/debugfs.h> +#include <linux/slab.h> +#include <linux/kthread.h> +#include <linux/firmware.h> +#include <linux/mz.h> + +#include "qseecom_kernel.h" + +/////////////////////////////////////////// TA message struct +#define MAX_SHMEM_LEN_BYTES (20 * 1024) +typedef uint32_t tciCommandId_t; +typedef uint32_t tciResponseId_t; +typedef uint32_t tciReturnCode_t; + +/** + * TCI command header. + */ +struct { + tciCommandId_t commandId; /**< Command ID */ +} tciCommandHeader_t; + +/** + * TCI response header. + */ +struct { + tciResponseId_t responseId; /**< Response ID (must be command ID | RSP_ID_MASK )*/ + tciReturnCode_t returnCode; /**< Return code of command */ +} tciResponseHeader_t; + + +struct { + tciCommandHeader_t header; /**< Command header */ + uint32_t number; /**< Length of data to process */ +} cmdTest_t; + +/** + * Response structure Trustlet -> Trustlet Connector. + */ +struct { + tciResponseHeader_t header; /**< Response header */ + int32_t status; + uint32_t value; +} rspTest_t; + +struct { + uint32_t buffer[MAX_SHMEM_LEN_BYTES]; + uint32_t bufferSize; +} msgData_t; + +/** + * TCI message data. + */ +struct { + cmdTest_t command; + rspTest_t response; + msgData_t msgData; +} tciMessage_t; +/////////////////////////////////////////// TA message struct + +#define AES_BLOCK_SIZE_FOR_TZ 1024 +#define CMD_GETKEY 1 +#define CMD_REMOVEKEY 2 +#define QSEE_DEVICE_APP_DIR "/vendor/firmware_mnt/image/" +#define QSEE_APP_NAME "wsm" +#define MZ_PATH_MAX 4096 + +struct tci_msg { + uint32_t cmd; + uint32_t pid; + uint8_t encrypt[AES_BLOCK_SIZE_FOR_TZ]; + uint16_t encrypt_len; +} __packed; + +struct tee_msg { + struct completion *comp; + uint16_t cmd; + uint32_t tgid; + void *encrypt; + uint16_t encrypt_len; + uint16_t rc; + struct list_head queue; +}; + +static int send_cmd(uint16_t cmd, uint32_t tgid, + void *encrypt, + uint16_t encrypt_len); + +static DEFINE_SPINLOCK(tee_msg_lock); +static LIST_HEAD(tee_msg_queue); +struct task_struct *mz_tee_msg_task; +static struct qseecom_handle *session; + +static int tee_msg_thread(void *arg) +{ + for (;;) { + set_current_state(TASK_INTERRUPTIBLE); + if (kthread_should_stop()) { + set_current_state(TASK_RUNNING); + break; + } + if (list_empty(&tee_msg_queue)) + schedule(); + set_current_state(TASK_RUNNING); + + spin_lock(&tee_msg_lock); + while (!list_empty(&tee_msg_queue)) { + struct tee_msg *send_cmd_args; + int rc; + + send_cmd_args = list_entry(tee_msg_queue.next, + struct tee_msg, queue); + list_del_init(&send_cmd_args->queue); + spin_unlock(&tee_msg_lock); + + rc = send_cmd(send_cmd_args->cmd, + send_cmd_args->tgid, + send_cmd_args->encrypt, + send_cmd_args->encrypt_len); + send_cmd_args->rc = rc; + // when processing tee_iovec comp is not NULL + // only for last cmd in array + if (send_cmd_args->comp) + complete(send_cmd_args->comp); + spin_lock(&tee_msg_lock); + } + spin_unlock(&tee_msg_lock); + } + + return 0; +} + +static int send_cmd(uint16_t cmd, + uint32_t tgid, + void *encrypt, + uint16_t encrypt_len) +{ + + int iResult = 0; + tciMessage_t *tci; + tciMessage_t *rsptci; + uint32_t retVal = 0; + struct tci_msg *mzbuffer; + + if (session == NULL) { + pr_err("MZ %s ta session is null\n", __func__); + return -1; + } + + if ((tciMessage_t *)(session)->sbuf == NULL) { + pr_err("MZ %s sbuf is null\n", __func__); + return -1; + } + + tci = (tciMessage_t *)((session)->sbuf); + rsptci = (tciMessage_t *)((session)->sbuf + sizeof(tciMessage_t)); + + memset(tci, 0x00, sizeof(tciMessage_t)); + memset(rsptci, 0x00, sizeof(tciMessage_t)); + + + tci->command.header.commandId = cmd; + tci->msgData.bufferSize = sizeof(struct tci_msg); + + mzbuffer = kmalloc(sizeof(struct tci_msg), GFP_KERNEL); + if (!mzbuffer) + return -1; + + mzbuffer->cmd = cmd; + mzbuffer->pid = tgid; + if (encrypt != NULL) { + memcpy(mzbuffer->encrypt, encrypt, encrypt_len); + mzbuffer->encrypt_len = encrypt_len; + } + + memcpy(tci->msgData.buffer, mzbuffer, sizeof(struct tci_msg)); + + iResult = qseecom_set_bandwidth(session, true); + if (iResult != 0) { + pr_err("MZ %s qseecom_set_bandwidth fail\n", __func__); + return -1; + } + + // send command + iResult = qseecom_send_command(session, + (char *)tci, + sizeof(tciMessage_t), + (char *)rsptci, + sizeof(tciMessage_t)); + if (iResult != 0) { + iResult = qseecom_set_bandwidth(session, false); + if (iResult != 0) { + pr_err("MZ %s qseecom_set_bandwidth fail 2\n", __func__); + return -1; + } + pr_err("MZ %s qseecom_send_command fail\n", __func__); + return -1; + } + + iResult = qseecom_set_bandwidth(session, false); + if (iResult != 0) { + pr_err("MZ %s qseecom_set_bandwidth fail 3\n", __func__); + return -1; + } + + // Check the Trustlet return code + if (rsptci->response.header.returnCode != 0) { + pr_err("MZ %s ta return error %d\n", __func__, rsptci->response.header.returnCode); + return -1; + } + + // Read result from TCI buffer + retVal = rsptci->response.status; + if (retVal != 1) { + pr_err("MZ %s ta return status error %d\n", __func__, retVal); + goto exit_error; + } + + if (rsptci->msgData.bufferSize > MAX_SHMEM_LEN_BYTES) { + pr_err("MZ %s ta return buffer size error\n", __func__); + goto exit_error; + } + + memcpy(mzbuffer, rsptci->msgData.buffer, sizeof(struct tci_msg)); + + if (encrypt != NULL) { + encrypt_len = mzbuffer->encrypt_len; + memcpy(encrypt, mzbuffer->encrypt, encrypt_len); + } + + kfree(mzbuffer); + + return 1; + +exit_error: + memset(tci, 0x00, sizeof(tciMessage_t)); + memset(rsptci, 0x00, sizeof(tciMessage_t)); + + return retVal; +} + +static int send_cmd_kthread(uint16_t cmd, uint32_t tgid, u8 *encrypt, uint16_t encrypt_len) +{ + struct completion cmd_sent; + struct tee_msg cmd_msg; + + init_completion(&cmd_sent); + + cmd_msg.comp = &cmd_sent; + cmd_msg.cmd = cmd; + cmd_msg.tgid = tgid; + cmd_msg.encrypt = encrypt; + cmd_msg.encrypt_len = encrypt_len; + cmd_msg.rc = -EBADMSG; + + spin_lock(&tee_msg_lock); + list_add_tail(&cmd_msg.queue, &tee_msg_queue); + spin_unlock(&tee_msg_lock); + wake_up_process(mz_tee_msg_task); + wait_for_completion(&cmd_sent); + return cmd_msg.rc; +} + +MzResult getkeyt(uint32_t tgid, u8 *key, uint16_t key_len) +{ + MzResult mzret = MZ_SUCCESS; + int taret; + + taret = send_cmd_kthread(CMD_GETKEY, tgid, key, key_len); + if (taret != MZ_TA_SUCCESS) { + pr_err("MZ %s ta return error %d\n", __func__, taret); + mzret = MZ_TA_FAIL; + } + return mzret; +} + +MzResult removekeyt(uint32_t tgid) +{ + MzResult mzret = MZ_SUCCESS; + int taret; + + taret = send_cmd_kthread(CMD_REMOVEKEY, tgid, NULL, 0); + if (taret != MZ_TA_SUCCESS) { + pr_err("MZ %s ta return error %d\n", __func__, taret); + mzret = MZ_TA_FAIL; + } + return mzret; +} + +MzResult load_trusted_app(void) +{ + int qsee_res = 0; + int tci_size = 0; + MzResult mzret = MZ_SUCCESS; + + pr_err("MZ %s target_count %d\n", __func__, target_count); //TODO remove + + if (target_count != 0 && session != NULL) + return mzret; + + if (session != NULL) { + pr_err("MZ %s ta session is not null\n", __func__); + return MZ_TA_FAIL; + } + + session = NULL; + + // Open the QSEE device + tci_size = QSEECOM_ALIGN(2 * sizeof(tciMessage_t)); + qsee_res = qseecom_start_app(&session, QSEE_APP_NAME, tci_size); + if (qsee_res != 0) { + pr_err("MZ %s qseecom_start_app fail %d\n", __func__, qsee_res); + mzret = MZ_TA_FAIL; + } else { + pr_info("MZ ta load\n"); + } + + return mzret; +} + +static int register_tee_driver(void) +{ + struct mz_tee_driver_fns fn = { + .getkey = getkeyt, + .removekey = removekeyt, + }; + + return register_mz_tee_crypto_driver(&fn); +} + +static void unregister_tee_driver(void) +{ + unregister_mz_tee_crypto_driver(); +} + +void unload_trusted_app(void) +{ + int iResult = 0; + + pr_err("MZ %s target_count %d\n", __func__, target_count); //TODO remove + if (target_count != 0 && session != NULL) + return; + + if (session == NULL) { + pr_err("MZ %s ta session is null\n", __func__); + return; + } + + iResult = qseecom_shutdown_app(&session); + session = NULL; + pr_info("MZ ta unload\n"); +} + +static int __init tee_driver_init(void) +{ + int rc = 0; + + mz_tee_msg_task = kthread_run(tee_msg_thread, NULL, "mz_tee_msg_thread"); + if (IS_ERR(mz_tee_msg_task)) { + rc = PTR_ERR(mz_tee_msg_task); + pr_err("MZ Can't create mz_tee_msg_task: %d\n", rc); + goto out; + } + rc = register_tee_driver(); + if (rc != MZ_SUCCESS) { + pr_err("MZ Can't register tee_driver\n"); + goto out; + } + +out: + return rc; +} + +static void __exit tee_driver_exit(void) +{ + unregister_tee_driver(); + kthread_stop(mz_tee_msg_task); +} + +module_init(tee_driver_init); +module_exit(tee_driver_exit); diff --git a/security/samsung/mz_tee_driver/mz_tee_driver_qc.c b/security/samsung/mz_tee_driver/mz_tee_driver_qc.c new file mode 100755 index 000000000000..0fe8e39ac48a --- /dev/null +++ b/security/samsung/mz_tee_driver/mz_tee_driver_qc.c @@ -0,0 +1,393 @@ +/* + * TEE Driver + * + * Copyright (C) 2019 Samsung Electronics, Inc. + * An Seongjin, <seongjin.an@samsung.com> + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/module.h> +#include <linux/debugfs.h> +#include <linux/slab.h> +#include <linux/kthread.h> +#include <linux/firmware.h> +#include <linux/mz.h> + +#include "qseecom_kernel.h" + +int target_count; + +/////////////////////////////////////////// TA message struct +#define MAX_SHMEM_LEN_BYTES 1024 +typedef uint32_t tciCommandId_t; +typedef uint32_t tciResponseId_t; +typedef uint32_t tciReturnCode_t; + +/** + * TCI command header. + */ +typedef struct _tciCommandHeader_t { + tciCommandId_t commandId; /**< Command ID */ +} tciCommandHeader_t; + +/** + * TCI response header. + */ +typedef struct _tciResponseHeader_t { + tciResponseId_t responseId; /**< Response ID (must be command ID | RSP_ID_MASK )*/ + tciReturnCode_t returnCode; /**< Return code of command */ +} tciResponseHeader_t; + + +typedef struct _cmdTest_t { + tciCommandHeader_t header; /**< Command header */ + uint32_t number; /**< Length of data to process */ +} cmdTest_t; + +/** + * Response structure Trustlet -> Trustlet Connector. + */ +typedef struct _rspTest_t { + tciResponseHeader_t header; /**< Response header */ + int32_t status; + uint32_t value; +} rspTest_t; + +typedef struct _msgData_t { + uint32_t buffer[MAX_SHMEM_LEN_BYTES]; + uint32_t bufferSize; +} msgData_t; + +/** + * TCI message data. + */ +typedef struct _tciMessage_t { + cmdTest_t command; + rspTest_t response; + msgData_t msgData; +} tciMessage_t; +/////////////////////////////////////////// TA message struct + +#define AES_BLOCK_SIZE_FOR_TZ 1024 +#define CMD_MZ_WB_ENCRYPT 0x900 +#define CMD_REMOVEKEY 2 +#define QSEE_DEVICE_APP_DIR "/vendor/firmware_mnt/image/" +#define QSEE_APP_NAME "mz" +#define MZ_PATH_MAX 4096 + +struct tci_msg { + uint32_t cmd; + uint32_t pid; + uint8_t encrypt[8]; + uint8_t iv[16]; +} __packed; + +struct tee_msg { + struct completion *comp; + uint16_t cmd; + uint32_t tgid; + void *encrypt; + void *iv; + uint16_t rc; + struct list_head queue; +}; + +static int send_cmd(uint16_t cmd, uint32_t tgid, + void *encrypt, + void *iv); + +static DEFINE_SPINLOCK(tee_msg_lock); +static LIST_HEAD(tee_msg_queue); +struct task_struct *mz_tee_msg_task; +static struct qseecom_handle *session; + +static int tee_msg_thread(void *arg) +{ + for (;;) { + set_current_state(TASK_INTERRUPTIBLE); + if (kthread_should_stop()) { + set_current_state(TASK_RUNNING); + break; + } + if (list_empty(&tee_msg_queue)) + schedule(); + set_current_state(TASK_RUNNING); + + spin_lock(&tee_msg_lock); + while (!list_empty(&tee_msg_queue)) { + struct tee_msg *send_cmd_args; + int rc; + + send_cmd_args = list_entry(tee_msg_queue.next, + struct tee_msg, queue); + list_del_init(&send_cmd_args->queue); + spin_unlock(&tee_msg_lock); + + rc = send_cmd(send_cmd_args->cmd, + send_cmd_args->tgid, + send_cmd_args->encrypt, + send_cmd_args->iv); + send_cmd_args->rc = rc; + // when processing tee_iovec comp is not NULL + // only for last cmd in array + if (send_cmd_args->comp) + complete(send_cmd_args->comp); + spin_lock(&tee_msg_lock); + } + spin_unlock(&tee_msg_lock); + } + + return 0; +} + +static int send_cmd(uint16_t cmd, + uint32_t tgid, + void *encrypt, + void *iv) +{ + + int iResult = 0; + tciMessage_t *tci; + tciMessage_t *rsptci; + uint32_t retVal = 0; + struct tci_msg *mzbuffer; + + if (session == NULL) { + pr_err("MZ %s ta session is null\n", __func__); + return -1; + } + + if ((tciMessage_t *)(session)->sbuf == NULL) { + pr_err("MZ %s sbuf is null\n", __func__); + return -1; + } + + tci = (tciMessage_t *)((session)->sbuf); + rsptci = (tciMessage_t *)((session)->sbuf + sizeof(tciMessage_t)); + + memset(tci, 0x00, sizeof(tciMessage_t)); + memset(rsptci, 0x00, sizeof(tciMessage_t)); + + + tci->command.header.commandId = cmd; + tci->msgData.bufferSize = sizeof(struct tci_msg); + + mzbuffer = kmalloc(sizeof(struct tci_msg), GFP_KERNEL); + if (!mzbuffer) + return -1; + + mzbuffer->cmd = cmd; + mzbuffer->pid = tgid; + if (encrypt != NULL) { + memcpy(mzbuffer->encrypt, encrypt, 8); + memcpy(mzbuffer->iv, iv, 16); + } + + memcpy(tci->msgData.buffer, mzbuffer, sizeof(struct tci_msg)); + + iResult = qseecom_set_bandwidth(session, true); + if (iResult != 0) { + pr_err("MZ %s qseecom_set_bandwidth fail\n", __func__); + return -1; + } + + // send command + iResult = qseecom_send_command(session, + (char *)tci, + sizeof(tciMessage_t), + (char *)rsptci, + sizeof(tciMessage_t)); + if (iResult != 0) { + iResult = qseecom_set_bandwidth(session, false); + if (iResult != 0) { + pr_err("MZ %s qseecom_set_bandwidth fail 2\n", __func__); + return -1; + } + pr_err("MZ %s qseecom_send_command fail\n", __func__); + return -1; + } + + iResult = qseecom_set_bandwidth(session, false); + if (iResult != 0) { + pr_err("MZ %s qseecom_set_bandwidth fail 3\n", __func__); + return -1; + } + + // Check the Trustlet return code + if (rsptci->response.header.returnCode != 0) { + pr_err("MZ %s ta return error %d\n", __func__, rsptci->response.header.returnCode); + return -1; + } + + // Read result from TCI buffer + retVal = rsptci->response.status; + if (retVal != 1) { + pr_err("MZ %s ta return status error %d\n", __func__, retVal); + goto exit_error; + } + + if (rsptci->msgData.bufferSize > MAX_SHMEM_LEN_BYTES) { + pr_err("MZ %s ta return buffer size error\n", __func__); + goto exit_error; + } + + memcpy(mzbuffer, rsptci->msgData.buffer, sizeof(struct tci_msg)); + + if (encrypt != NULL) + memcpy(encrypt, mzbuffer->encrypt, 8); + + kfree(mzbuffer); + + return 1; + +exit_error: + memset(tci, 0x00, sizeof(tciMessage_t)); + memset(rsptci, 0x00, sizeof(tciMessage_t)); + + return retVal; +} + +static int send_cmd_kthread(uint16_t cmd, uint32_t tgid, u8 *encrypt, uint8_t *iv) +{ + struct completion cmd_sent; + struct tee_msg cmd_msg; + + init_completion(&cmd_sent); + + cmd_msg.comp = &cmd_sent; + cmd_msg.cmd = cmd; + cmd_msg.tgid = tgid; + cmd_msg.encrypt = encrypt; + cmd_msg.iv = iv; + cmd_msg.rc = -EBADMSG; + + spin_lock(&tee_msg_lock); + list_add_tail(&cmd_msg.queue, &tee_msg_queue); + spin_unlock(&tee_msg_lock); + wake_up_process(mz_tee_msg_task); + wait_for_completion(&cmd_sent); + return cmd_msg.rc; +} + +MzResult encrypt_impl(uint8_t *pt, uint8_t *ct, uint8_t *iv) +{ + MzResult mzret = MZ_SUCCESS; + int taret; + + taret = send_cmd_kthread(CMD_MZ_WB_ENCRYPT, 0, pt, iv); + if (taret != MZ_TA_SUCCESS) { + pr_err("MZ %s ta return error %d\n", __func__, taret); + mzret = MZ_TA_FAIL; + } + memcpy(ct, pt, 8); + return mzret; +} + +MzResult load_trusted_app(void) +{ + int qsee_res = 0; + int tci_size = 0; + MzResult mzret = MZ_SUCCESS; + + pr_info("MZ %s target_count %d\n", __func__, target_count); + + if (target_count != 0 && session != NULL) { + target_count++; + return mzret; + } + + if (session != NULL) { + pr_err("MZ %s ta session is not null\n", __func__); + return MZ_TA_FAIL; + } + + session = NULL; + + // Open the QSEE device + tci_size = QSEECOM_ALIGN(2 * sizeof(tciMessage_t)); + qsee_res = qseecom_start_app(&session, QSEE_APP_NAME, tci_size); + if (qsee_res != 0) { + pr_err("MZ %s qseecom_start_app fail %d\n", __func__, qsee_res); + mzret = MZ_TA_FAIL; + } else { + target_count++; + pr_info("MZ ta load\n"); + } + + return mzret; +} + +static int register_tee_driver(void) +{ + struct mz_tee_driver_fns fn = { + .encrypt = encrypt_impl, + }; + + return register_mz_tee_crypto_driver(&fn); +} + +static void unregister_tee_driver(void) +{ + unregister_mz_tee_crypto_driver(); +} + +void unload_trusted_app(void) +{ + int iResult = 0; + + pr_info("MZ %s target_count %d\n", __func__, target_count); //TODO remove + if (target_count > 1 && session != NULL) + target_count--; + return; + + if (session == NULL) { + pr_err("MZ %s ta session is null\n", __func__); + return; + } + + iResult = qseecom_shutdown_app(&session); + session = NULL; + target_count--; + pr_info("MZ ta unload\n"); +} + +static int __init tee_driver_init(void) +{ + int rc = 0; + + mz_tee_msg_task = kthread_run(tee_msg_thread, NULL, "mz_tee_msg_thread"); + if (IS_ERR(mz_tee_msg_task)) { + rc = PTR_ERR(mz_tee_msg_task); + pr_err("MZ Can't create mz_tee_msg_task: %d\n", rc); + goto out; + } + rc = register_tee_driver(); + if (rc != MZ_SUCCESS) { + pr_err("MZ Can't register tee_driver\n"); + goto out; + } + +out: + return rc; +} + +static void __exit tee_driver_exit(void) +{ + unregister_tee_driver(); + kthread_stop(mz_tee_msg_task); +} + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("Samsung MZ tee Driver"); +MODULE_VERSION("1.00"); + +module_init(tee_driver_init); +module_exit(tee_driver_exit); diff --git a/security/samsung/mz_tee_driver/mz_tee_driver_teegris.c b/security/samsung/mz_tee_driver/mz_tee_driver_teegris.c new file mode 100755 index 000000000000..02e054928933 --- /dev/null +++ b/security/samsung/mz_tee_driver/mz_tee_driver_teegris.c @@ -0,0 +1,495 @@ +/* + * TEE Driver + * + * Copyright (C) 2021 Samsung Electronics, Inc. + * An Seongjin, <seongjin.an@samsung.com> + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/module.h> +#include <linux/debugfs.h> +#include <linux/slab.h> +#include <linux/kthread.h> +#include <linux/firmware.h> +#include <linux/mz.h> +#include <soc/samsung/exynos-pmu-if.h> +#include <tzdev/tee_client_api.h> + +int target_count; + +/////////////////////////////////////////// TA message struct +#define MAX_SHMEM_LEN_BYTES 1024 +typedef uint32_t tciCommandId_t; +typedef uint32_t tciResponseId_t; +typedef uint32_t tciReturnCode_t; + +/** + * TCI command header. + */ +typedef struct _tciCommandHeader_t { + tciCommandId_t commandId; /**< Command ID */ +} tciCommandHeader_t; + +/** + * TCI response header. + */ +typedef struct _tciResponseHeader_t { + tciResponseId_t responseId; /**< Response ID (must be command ID | RSP_ID_MASK )*/ + tciReturnCode_t returnCode; /**< Return code of command */ +} tciResponseHeader_t; + + +typedef struct _cmdTest_t { + tciCommandHeader_t header; /**< Command header */ + uint32_t number; /**< Length of data to process */ +} cmdTest_t; + +/** + * Response structure Trustlet -> Trustlet Connector. + */ +typedef struct _rspTest_t { + tciResponseHeader_t header; /**< Response header */ + int32_t status; + uint32_t value; +} rspTest_t; + +typedef struct _msgData_t { + uint32_t buffer[MAX_SHMEM_LEN_BYTES]; + uint32_t bufferSize; +} msgData_t; + +/** + * TCI message data. + */ +typedef struct _tciMessage_t { + cmdTest_t command; + rspTest_t response; + msgData_t msgData; +} tciMessage_t; +/////////////////////////////////////////// TA message struct + +#define AES_BLOCK_SIZE_FOR_TZ 1024 +#define CMD_MZ_WB_ENCRYPT 0x900 +#define CMD_REMOVEKEY 2 +#define MZ_PATH_MAX 4096 + +#define MAX_SESS_NUM 1 // tlc sessions nums + +static TEEC_UUID uuid = { + 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x4d, 0x65, 0x6d, 0x5a, 0x72, 0x67} +}; + +typedef struct tlc_struct { + TEEC_Context context; + TEEC_Session session; + TEEC_Operation operation; + TEEC_SharedMemory shmem; + TEEC_UUID uuid; + uint8_t *shmem_buff; +} tlc_struct_t; + +typedef struct tlc_struct_th { + tlc_struct_t tlc_struct_arr[MAX_SESS_NUM]; // thread unsafe struct +} tlc_struct_th_t; + +static tlc_struct_th_t tlc_struct_safe; +static uint8_t is_initialized; // to be checked + +/*! + * \brief returns pointer to first unfilled tlc_sttuct item in massive + * \return pointer to empty tlc_sttuct + */ +static tlc_struct_t *get_empty(void) +{ + return &tlc_struct_safe.tlc_struct_arr[0]; +} + +/*! + * \brief returns pointer to tlc_struct owned by current thread + * \return pointer to empty tlc_sttuct + */ +static tlc_struct_t *mz_get_current(void) +{ + return &tlc_struct_safe.tlc_struct_arr[0]; +} + +/*! + * \brief Performs useful things only at once at zrtp_create + * \ where could be several processes single thread each + * \return operation result, 0 if OK + */ +static int tlc_init(void) +{ + if (is_initialized) + return 0; + + memset(&tlc_struct_safe, 0x00, sizeof(tlc_struct_safe)); + + is_initialized = 1; + return 0; +} + +struct tci_msg { + uint32_t cmd; + uint32_t pid; + uint8_t encrypt[8]; + uint8_t iv[16]; +} __packed; + +struct tee_msg { + struct completion *comp; + uint16_t cmd; + uint32_t tgid; + void *encrypt; + void *iv; + uint16_t rc; + struct list_head queue; +}; + +bool is_TA_session_opened; + +static int send_cmd(uint16_t cmd, uint32_t tgid, + void *encrypt, + void *iv); + +static DEFINE_SPINLOCK(tee_msg_lock); +static LIST_HEAD(tee_msg_queue); +struct task_struct *mz_tee_msg_task; + + +static int tee_msg_thread(void *arg) +{ + for (;;) { + set_current_state(TASK_INTERRUPTIBLE); + if (kthread_should_stop()) { + set_current_state(TASK_RUNNING); + break; + } + if (list_empty(&tee_msg_queue)) + schedule(); + set_current_state(TASK_RUNNING); + + spin_lock(&tee_msg_lock); + while (!list_empty(&tee_msg_queue)) { + struct tee_msg *send_cmd_args; + int rc; + + send_cmd_args = list_entry(tee_msg_queue.next, + struct tee_msg, queue); + list_del_init(&send_cmd_args->queue); + spin_unlock(&tee_msg_lock); + + rc = send_cmd(send_cmd_args->cmd, + send_cmd_args->tgid, + send_cmd_args->encrypt, + send_cmd_args->iv); + send_cmd_args->rc = rc; + // when processing tee_iovec comp is not NULL + // only for last cmd in array + if (send_cmd_args->comp) + complete(send_cmd_args->comp); + spin_lock(&tee_msg_lock); + } + spin_unlock(&tee_msg_lock); + } + + return 0; +} + +static int send_cmd(uint16_t cmd, + uint32_t tgid, + void *encrypt, + void *iv) +{ + tciMessage_t *tci; + uint32_t retVal = 0; + struct tci_msg *mzbuffer; + int res = MZ_SUCCESS; + TEEC_Result result; + tlc_struct_t *tlc_struct = 0; + + if (!is_TA_session_opened) { + pr_err("MZ %s TA session not opened\n", __func__); + return -1; + } + + tlc_struct = mz_get_current(); + tci = (tciMessage_t *)tlc_struct->shmem_buff; + + memset(tci, 0x00, sizeof(tciMessage_t)); + + tci->command.header.commandId = cmd; + tci->msgData.bufferSize = sizeof(struct tci_msg); + + mzbuffer = kmalloc(sizeof(struct tci_msg), GFP_KERNEL); + if (!mzbuffer) + return -1; + + mzbuffer->cmd = cmd; + mzbuffer->pid = tgid; + if (encrypt != NULL) { + memcpy(mzbuffer->encrypt, encrypt, 8); + memcpy(mzbuffer->iv, iv, 16); + } + + memcpy(tci->msgData.buffer, mzbuffer, sizeof(struct tci_msg)); + + result = TEEC_InvokeCommand(&tlc_struct->session, cmd, &tlc_struct->operation, NULL); + if (result == TEEC_ERROR_TARGET_DEAD) { + pr_err("MZ %d, %08x\n", __LINE__, result); + res = -1; + goto exit_error; + } + + if (result != TEEC_SUCCESS) { + pr_err("MZ SendMess: TEEC_InvokeCommand failed with error: %08x\n", result); + res = -1; + goto exit_error; + } + + // Check the Trustlet return code + if (tci->response.header.returnCode != 0) { + pr_err("MZ %s ta return error %d\n", __func__, tci->response.header.returnCode); + return -1; + } + + // Read result from TCI buffer + retVal = tci->response.status; + if (retVal != 1) { + pr_err("MZ %s ta return status error %d\n", __func__, retVal); + goto exit_error; + } + + if (tci->msgData.bufferSize > MAX_SHMEM_LEN_BYTES) { + pr_err("MZ %s ta return buffer size error\n", __func__); + goto exit_error; + } + + memcpy(mzbuffer, tci->msgData.buffer, sizeof(struct tci_msg)); + + if (encrypt != NULL) + memcpy(encrypt, mzbuffer->encrypt, 8); + + kfree(mzbuffer); + + return 1; + +exit_error: + memset(tci, 0x00, sizeof(tciMessage_t)); + + return retVal; +} + +static int send_cmd_kthread(uint16_t cmd, uint32_t tgid, u8 *encrypt, uint8_t *iv) +{ + struct completion cmd_sent; + struct tee_msg cmd_msg; + + init_completion(&cmd_sent); + + cmd_msg.comp = &cmd_sent; + cmd_msg.cmd = cmd; + cmd_msg.tgid = tgid; + cmd_msg.encrypt = encrypt; + cmd_msg.iv = iv; + cmd_msg.rc = -EBADMSG; + + spin_lock(&tee_msg_lock); + list_add_tail(&cmd_msg.queue, &tee_msg_queue); + spin_unlock(&tee_msg_lock); + wake_up_process(mz_tee_msg_task); + wait_for_completion(&cmd_sent); + return cmd_msg.rc; +} + +MzResult encrypt_impl(uint8_t *pt, uint8_t *ct, uint8_t *iv) +{ + MzResult mzret = MZ_SUCCESS; + int taret; + + taret = send_cmd_kthread(CMD_MZ_WB_ENCRYPT, 0, pt, iv); + if (taret != MZ_TA_SUCCESS) { + pr_err("MZ %s ta return error %d\n", __func__, taret); + mzret = MZ_TA_FAIL; + } + memcpy(ct, pt, 8); + return mzret; +} + +MzResult load_trusted_app_teegris(void) +{ + MzResult mzret = MZ_SUCCESS; + TEEC_Result result = 0; + tlc_struct_t *tlc_struct = 0; + + pr_info("MZ %s target_count %d\n", __func__, target_count); + if (target_count != 0) { + target_count++; + return mzret; + } + + if (tlc_init() != 0) + return mzret; + + // Initialize Contex + tlc_struct = get_empty(); + + tlc_struct->uuid = uuid; + + // Initialize TEEC_Context + result = TEEC_InitializeContext(NULL, &tlc_struct->context); + if (result != TEEC_SUCCESS) { + pr_err("MZ TEEC_InitializeContext failed with error: %08x\n", result); + goto exit; + } + pr_debug("MZ TEEC_InitializeContext - OK\n"); + + // register shared memory + tlc_struct->shmem_buff = kmalloc(sizeof(tciMessage_t), GFP_KERNEL); + if (!tlc_struct->shmem_buff) { + result = TEEC_ERROR_OUT_OF_MEMORY; + pr_err("MZ %s shmem kmalloc fail %08x\n", __func__, result); + goto exit; + } + + tlc_struct->shmem.buffer = tlc_struct->shmem_buff; + tlc_struct->shmem.size = sizeof(tciMessage_t); + tlc_struct->shmem.flags = TEEC_MEM_INPUT | TEEC_MEM_OUTPUT; + + result = TEEC_RegisterSharedMemory(&tlc_struct->context, &tlc_struct->shmem); + if (result != TEEC_SUCCESS) { + pr_err("MZ TEEC_RegisterSharedMemory failed with error: %08x\n", result); + goto close_session; + } + pr_debug("MZ TEEC_RegisterSharedMemory - OK\n"); + + // Step 3: Open session + result = TEEC_OpenSession(&tlc_struct->context, &tlc_struct->session, &tlc_struct->uuid, + TEEC_LOGIN_USER, + NULL, // No connection data needed for TEEC_LOGIN_USER. + NULL, // dont use operation + NULL); + if (result != TEEC_SUCCESS) { + pr_err("MZ TEEC_OpenSession failed with error: %08x\n", result); + goto close_context; + } + pr_debug("MZ TEEC_OpenSession - OK\n"); + + tlc_struct->operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + tlc_struct->operation.params[0].memref.parent = &tlc_struct->shmem; + tlc_struct->operation.params[0].memref.size = tlc_struct->shmem.size; + tlc_struct->operation.params[0].memref.offset = 0; + + goto exit; + +close_session: + TEEC_CloseSession(&tlc_struct->session); + +close_context: + TEEC_FinalizeContext(&tlc_struct->context); + kfree(tlc_struct->shmem_buff); + +exit: + if (result == TEEC_SUCCESS) { + mzret = MZ_SUCCESS; + is_TA_session_opened = true; + target_count++; + } else + mzret = MZ_TA_FAIL; + + return mzret; +} + +static int register_tee_driver(void) +{ + struct mz_tee_driver_fns fn = { + .encrypt = encrypt_impl, + }; + + return register_mz_tee_crypto_driver(&fn); +} + +static void unregister_tee_driver(void) +{ + unregister_mz_tee_crypto_driver(); +} + +void unload_trusted_app_teegris(void) +{ + tlc_struct_t *tlc_struct = 0; + + tlc_struct = mz_get_current(); + + pr_info("MZ %s target_count %d\n", __func__, target_count); + if (target_count > 1) { + target_count--; + return; + } + if (target_count != 1) + return; + + pr_debug("MZ TA session is getting closed\n"); + + // TEEC_ReleaseSharedMemory -> void function + TEEC_ReleaseSharedMemory(&tlc_struct->shmem); + kfree(tlc_struct->shmem_buff); + + // TEEC_CloseSession -> void function + TEEC_CloseSession(&tlc_struct->session); + + // TEEC_FinalizeContext -> void function + TEEC_FinalizeContext(&tlc_struct->context); + + memset(tlc_struct, 0x00, sizeof(tlc_struct_t)); + is_TA_session_opened = false; + target_count--; + pr_info("MZ ta unload\n"); +} + +static int __init tee_driver_init(void) +{ + int rc = 0; + + is_initialized = 0; + is_TA_session_opened = false; + target_count = 0; + + mz_tee_msg_task = kthread_run(tee_msg_thread, NULL, "mz_tee_msg_thread"); + if (IS_ERR(mz_tee_msg_task)) { + rc = PTR_ERR(mz_tee_msg_task); + pr_err("MZ Can't create mz_tee_msg_task: %d\n", rc); + goto out; + } + rc = register_tee_driver(); + if (rc != MZ_SUCCESS) { + pr_err("MZ Can't register tee_driver\n"); + goto out; + } + + load_trusted_app = load_trusted_app_teegris; + unload_trusted_app = unload_trusted_app_teegris; + +out: + return rc; +} + +static void __exit tee_driver_exit(void) +{ + unregister_tee_driver(); + kthread_stop(mz_tee_msg_task); +} + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("Samsung MZ tee Driver"); +MODULE_VERSION("1.00"); + +module_init(tee_driver_init); +module_exit(tee_driver_exit); diff --git a/security/samsung/mz_tee_driver/security_mz_tee_driver.py b/security/samsung/mz_tee_driver/security_mz_tee_driver.py new file mode 100755 index 000000000000..bfcd2930e295 --- /dev/null +++ b/security/samsung/mz_tee_driver/security_mz_tee_driver.py @@ -0,0 +1,50 @@ +config = { + "header": { + "uuid": "dd9c76cb-0993-427d-b46d-7ab8b5029fcc", + "type": "SECURITY", + "vendor": "SAMSUNG", + "product": "mz_tee_driver", + "variant": "mz_tee_driver", + "name": "mz_tee_driver", + }, + "build": { + "path": "security/mz_tee_driver", + "file": "security_mz_tee_driver.py", + "location": [ + { + "src": "*.c Makefile:update Kconfig:update", + "dst": "security/samsung/mz_tee_driver/", + }, + ], + }, + "features": [ + { + "label": "BUILD TYPE", + "configs": { + "not set": [ + "# CONFIG_MZ_TEE_DRIVER is not set" + ], + "module": [ + "CONFIG_MZ_TEE_DRIVER=m" + ], + "built-in": [ + "CONFIG_MZ_TEE_DRIVER=y" + ], + }, + "list_value": [ + "not set", + "module", + "built-in", + ], + "type": "list", + "value": "not set", + } + ], +} + + +def load(): + return config + +if __name__ == '__main__': + print(load()) diff --git a/security/samsung/proca/Makefile b/security/samsung/proca/Makefile index 5e09944b962d..a5ffcf2f4f14 100755 --- a/security/samsung/proca/Makefile +++ b/security/samsung/proca/Makefile @@ -50,4 +50,10 @@ else clean-files += proca_certificate.asn1.c proca_certificate.asn1.h endif -subdir-ccflags-y += -Wformat \ No newline at end of file +subdir-ccflags-y += -Wformat + +# kunit tests options: +ifeq ($(CONFIG_SEC_KUNIT)$(CONFIG_UML), yy) + GCOV_PROFILE := y + ccflags-$(CONFIG_PROCA) += -DPROCA_KUNIT_ENABLED +endif diff --git a/security/samsung/proca/gaf/Makefile b/security/samsung/proca/gaf/Makefile index d20735eef478..44edbc2a9a79 100755 --- a/security/samsung/proca/gaf/Makefile +++ b/security/samsung/proca/gaf/Makefile @@ -5,3 +5,10 @@ obj-$(CONFIG_GAF_V5) += gaf_v5.o obj-$(CONFIG_GAF_V6) += gaf_v6.o ccflags-y += -I$(srctree)/security/samsung/proca + +# kunit tests options: +ifeq ($(CONFIG_SEC_KUNIT)$(CONFIG_UML), yy) + GCOV_PROFILE := y + ccflags-$(CONFIG_PROCA) += -DPROCA_KUNIT_ENABLED +endif + diff --git a/security/samsung/proca/gaf/gaf_v6.c b/security/samsung/proca/gaf/gaf_v6.c index 6ec288658a92..1615435a3a37 100755 --- a/security/samsung/proca/gaf/gaf_v6.c +++ b/security/samsung/proca/gaf/gaf_v6.c @@ -22,7 +22,7 @@ #ifdef CONFIG_PROCA_GKI_10 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) #define OFFSETOF_INTEGRITY offsetof(struct task_struct, android_oem_data1[2]) -#define OFFSETOF_F_SIGNATURE offsetof(struct file, android_oem_data1) +#define OFFSETOF_F_SIGNATURE 0 #else #define OFFSETOF_INTEGRITY offsetof(struct task_struct, android_vendor_data1[2]) #define OFFSETOF_F_SIGNATURE offsetof(struct file, android_vendor_data1) @@ -84,7 +84,11 @@ static struct GAForensicINFO { } GAFINFO = { .ver = 0x0600, /* by hryhorii tur 2019 10 21 */ .size = sizeof(GAFINFO), +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0)) + .task_struct_struct_state = offsetof(struct task_struct, __state), +#else .task_struct_struct_state = offsetof(struct task_struct, state), +#endif .task_struct_struct_comm = offsetof(struct task_struct, comm), .task_struct_struct_tasks = offsetof(struct task_struct, tasks), .task_struct_struct_pid = offsetof(struct task_struct, pid), diff --git a/security/samsung/proca/proca_certificate.c b/security/samsung/proca/proca_certificate.c index f9f6e9f9c593..02aef015f2bf 100755 --- a/security/samsung/proca/proca_certificate.c +++ b/security/samsung/proca/proca_certificate.c @@ -19,13 +19,19 @@ #include <linux/err.h> #include <crypto/hash.h> #include <crypto/hash_info.h> -#include <crypto/sha.h> #include <linux/version.h> #include <linux/file.h> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) +#include <crypto/sha1.h> +#include <crypto/sha2.h> +#else +#include <crypto/sha.h> +#endif #include "proca_log.h" #include "proca_certificate.h" #include "five_crypto.h" +#include "five_testing.h" #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 42) #include "proca_certificate.asn1.h" @@ -210,8 +216,9 @@ enum PaFlagBits { PaFlagBits_bitHmac = 2 }; -static bool check_native_pa_id(const struct proca_certificate *parsed_cert, - struct task_struct *task) +__visible_for_testing __mockable +bool check_native_pa_id(const struct proca_certificate *parsed_cert, + struct task_struct *task) { struct file *exe; char *path_buff; @@ -252,7 +259,7 @@ bool is_certificate_relevant_to_task( const char system_server_app_name[] = "/system/framework/services.jar"; const char system_server[] = "system_server"; const size_t max_app_name = 1024; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) || defined(PROCA_KUNIT_ENABLED)) char cmdline[1024 + 1]; #else char cmdline[max_app_name + 1]; diff --git a/security/samsung/proca/proca_config.c b/security/samsung/proca/proca_config.c index af01fb39b6e4..7aa66f515fcd 100755 --- a/security/samsung/proca/proca_config.c +++ b/security/samsung/proca/proca_config.c @@ -75,6 +75,7 @@ static int prepare_sys_ram_ranges(struct proca_config *conf) return ret; } +#ifndef PROCA_KUNIT_ENABLED static void prepare_kernel_constants(struct proca_config *conf) { conf->page_offset = PAGE_OFFSET; @@ -87,6 +88,9 @@ static void prepare_kernel_constants(struct proca_config *conf) conf->kimage_vaddr = get_kimage_vaddr(); conf->kimage_voffset = get_kimage_voffset(); } +#else +static void prepare_kernel_constants(struct proca_config *conf) {} +#endif static void dump_proca_config(const struct proca_config *conf) { diff --git a/security/samsung/proca/proca_porting.h b/security/samsung/proca/proca_porting.h index 3d1d92937dd8..6e8f8753f487 100755 --- a/security/samsung/proca/proca_porting.h +++ b/security/samsung/proca/proca_porting.h @@ -105,6 +105,7 @@ __vfs_getxattr(struct dentry *dentry, struct inode *inode, const char *name, /* * KASLR is backported to 4.4 kernels */ +#ifndef PROCA_KUNIT_ENABLED #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0) static inline uintptr_t get_kimage_vaddr(void) @@ -129,6 +130,7 @@ static inline u64 get_kimage_voffset(void) return kimage_voffset; } #endif +#endif #ifndef OVERLAYFS_SUPER_MAGIC #define OVERLAYFS_SUPER_MAGIC 0x794c7630 @@ -193,14 +195,22 @@ static inline struct file *get_task_exe_file(struct task_struct *task) } #endif -#if defined(CONFIG_ANDROID) && LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0) +#if defined(CONFIG_ANDROID) && (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0) || \ + LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) /* * __vfs_getxattr was changed in Android Kernel v5.4 * https://android.googlesource.com/kernel/common/+/3484eba91d6b529cc606486a2db79513f3db6c67 + * and was reverted in Android Kernel v5.15 + * https://android.googlesource.com/kernel/common/+/e884438aa554219a6d0df3a18ff0b23ea678c36c */ #define XATTR_NOSECURITY 0x4 /* get value, do not involve security check */ #define __vfs_getxattr(dentry, inode, name, value, size, flags) \ __vfs_getxattr(dentry, inode, name, value, size) #endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0) +#define __vfs_setxattr_noperm(dentry, name, value, size, flags) \ + __vfs_setxattr_noperm(&init_user_ns, dentry, name, value, size, flags) +#endif + #endif /* __LINUX_PROCA_PORTING_H */ diff --git a/security/samsung/proca/security_proca.py b/security/samsung/proca/security_proca.py new file mode 100755 index 000000000000..3d20ea4a6f5f --- /dev/null +++ b/security/samsung/proca/security_proca.py @@ -0,0 +1,95 @@ +config = { + "header": { + "uuid": "283df57d-cc04-4f9f-ae5a-9c8140dd1e53", + "type": "SECURITY", + "vendor": "SAMSUNG", + "product": "proca", + "variant": "proca", + "name": "proca", + }, + "build": { + "path": "security/proca", + "file": "security_proca.py", + "location": [ + { + "src": "*.c *.h *.asn1 Makefile Kconfig", + "dst": "security/samsung/proca/", + }, + { + "src": "gaf/*", + "dst": "security/samsung/proca/gaf/", + }, + { + "src": "s_os/*.c s_os/*.h", + "dst": "security/samsung/proca/s_os/", + }, + ], + }, + "features": [ + { + "label": "General", + "type": "boolean", + "configs": { + "True": [], + "False": [], + }, + "value": True, + }, + ], + "kunit_test": { + "build": { + "location": [ + { + "src": "../five/kunit_test/test_helpers.h kunit_test/*.c kunit_test/*.h kunit_test/Makefile:cp", + "dst": "security/samsung/proca/kunit_test/", + }, + { + "src": "../five/*.c ../five/*.h ../five/*.S ../five/*.der ../five/Kconfig kunit_test/five/Makefile", + "dst": "security/samsung/five/", + }, + { + "src": "../five/s_os/*.c", + "dst": "security/samsung/five/s_os/", + }, + ], + }, + "features": [ + { + "label": "default", + "configs": { + "True": [ + "CONFIG_PROCA=y", + "CONFIG_PROCA_DEBUG=y", + "CONFIG_PROCA_S_OS=y", + "CONFIG_GAF_V6=y", + "CONFIG_FIVE=y", + "CONFIG_FIVE_GKI_10=y", + "CONFIG_CRC16=y", + "CONFIG_SECURITY=y", + "CONFIG_NET=y", + "CONFIG_AUDIT=y", + "CONFIG_AUDITSYSCALL=y", + "CONFIG_MD=y", + "CONFIG_BLK_DEV_DM=y", + "CONFIG_BLK_DEV_LOOP=y", + "CONFIG_DM_VERITY=y", + "CONFIG_CRYPTO_SHA256=y", + "CONFIG_DEBUG_KERNEL=y", + "CONFIG_DEBUG_INFO=y", + "CONFIG_GCOV=y" + ], + "False": [], + }, + "type": "boolean", + }, + ] + }, +} + + +def load(): + return config + + +if __name__ == "__main__": + print(load()) diff --git a/security/security.c b/security/security.c index 26be607748a8..709ae3126cbf 100755 --- a/security/security.c +++ b/security/security.c @@ -234,25 +234,25 @@ EXPORT_SYMBOL(unregister_lsm_notifier); /* Security operations */ -int security_binder_set_context_mgr(struct task_struct *mgr) +int security_binder_set_context_mgr(const struct cred *mgr) { return call_int_hook(binder_set_context_mgr, 0, mgr); } -int security_binder_transaction(struct task_struct *from, - struct task_struct *to) +int security_binder_transaction(const struct cred *from, + const struct cred *to) { return call_int_hook(binder_transaction, 0, from, to); } -int security_binder_transfer_binder(struct task_struct *from, - struct task_struct *to) +int security_binder_transfer_binder(const struct cred *from, + const struct cred *to) { return call_int_hook(binder_transfer_binder, 0, from, to); } -int security_binder_transfer_file(struct task_struct *from, - struct task_struct *to, struct file *file) +int security_binder_transfer_file(const struct cred *from, + const struct cred *to, struct file *file) { return call_int_hook(binder_transfer_file, 0, from, to, file); } diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index eecc76da5cdd..a8295ca9987b 100755 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -86,10 +86,6 @@ #include <linux/msg.h> #include <linux/shm.h> #include <linux/bpf.h> - -// [ SEC_SELINUX_PORTING_COMMON -#include <linux/delay.h> -// ] SEC_SELINUX_PORTING_COMMON #include "avc.h" #include "objsec.h" @@ -2318,22 +2314,19 @@ static inline u32 open_file_to_av(struct file *file) /* Hook functions begin here. */ -static int selinux_binder_set_context_mgr(struct task_struct *mgr) +static int selinux_binder_set_context_mgr(const struct cred *mgr) { - u32 mysid = current_sid(); - u32 mgrsid = task_sid(mgr); - return avc_has_perm(&selinux_state, - mysid, mgrsid, SECCLASS_BINDER, + current_sid(), cred_sid(mgr), SECCLASS_BINDER, BINDER__SET_CONTEXT_MGR, NULL); } -static int selinux_binder_transaction(struct task_struct *from, - struct task_struct *to) +static int selinux_binder_transaction(const struct cred *from, + const struct cred *to) { u32 mysid = current_sid(); - u32 fromsid = task_sid(from); - u32 tosid = task_sid(to); + u32 fromsid = cred_sid(from); + u32 tosid = cred_sid(to); int rc; if (mysid != fromsid) { @@ -2344,27 +2337,24 @@ static int selinux_binder_transaction(struct task_struct *from, return rc; } - return avc_has_perm(&selinux_state, - fromsid, tosid, SECCLASS_BINDER, BINDER__CALL, - NULL); + return avc_has_perm(&selinux_state, fromsid, tosid, + SECCLASS_BINDER, BINDER__CALL, NULL); } -static int selinux_binder_transfer_binder(struct task_struct *from, - struct task_struct *to) +static int selinux_binder_transfer_binder(const struct cred *from, + const struct cred *to) { - u32 fromsid = task_sid(from); - u32 tosid = task_sid(to); - return avc_has_perm(&selinux_state, - fromsid, tosid, SECCLASS_BINDER, BINDER__TRANSFER, + cred_sid(from), cred_sid(to), + SECCLASS_BINDER, BINDER__TRANSFER, NULL); } -static int selinux_binder_transfer_file(struct task_struct *from, - struct task_struct *to, +static int selinux_binder_transfer_file(const struct cred *from, + const struct cred *to, struct file *file) { - u32 sid = task_sid(to); + u32 sid = cred_sid(to); struct file_security_struct *fsec = file->f_security; struct dentry *dentry = file->f_path.dentry; struct inode_security_struct *isec; @@ -3340,24 +3330,6 @@ static int selinux_inode_permission(struct inode *inode, int mask) if (IS_ERR(isec)) return PTR_ERR(isec); -// [ SEC_SELINUX_PORTING_COMMON - /* skip sid == 1(kernel), it means first boot time */ - if (isec->initialized != 1 && sid != 1) { - int count = 5; - - while (count-- > 0) { - pr_err("SELinux : inode->i_security is not initialized. waiting...(%d/5)\n", 5-count); - udelay(500); - if (isec->initialized == 1) { - pr_err("SELinux : inode->i_security is INITIALIZED.\n"); - break; - } - } - if (isec->initialized != 1) - pr_err("SELinux : inode->i_security is not initialized. not fixed.\n"); - } -// ] SEC_SELINUX_PORTING_COMMON - rc = avc_has_perm_noaudit(&selinux_state, sid, isec->sid, isec->sclass, perms, 0, &avd); audited = avc_audit_required(perms, &avd, rc, diff --git a/security/selinux/include/classmap.h b/security/selinux/include/classmap.h index 34631690b5f9..97af14ca57eb 100755 --- a/security/selinux/include/classmap.h +++ b/security/selinux/include/classmap.h @@ -115,7 +115,8 @@ struct security_class_mapping secclass_map[] = { { COMMON_IPC_PERMS, NULL } }, { "netlink_route_socket", { COMMON_SOCK_PERMS, - "nlmsg_read", "nlmsg_write", "nlmsg_readpriv", NULL } }, + "nlmsg_read", "nlmsg_write", "nlmsg_readpriv", "nlmsg_getneigh", + NULL } }, { "netlink_tcpdiag_socket", { COMMON_SOCK_PERMS, "nlmsg_read", "nlmsg_write", NULL } }, diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h index e2c0e36e6644..6957b6932e0f 100755 --- a/security/selinux/include/security.h +++ b/security/selinux/include/security.h @@ -104,6 +104,7 @@ struct selinux_state { bool initialized; bool policycap[__POLICYDB_CAPABILITY_MAX]; bool android_netlink_route; + bool android_netlink_getneigh; struct selinux_avc *avc; struct selinux_ss *ss; }; @@ -184,6 +185,13 @@ static inline bool selinux_android_nlroute_getlink(void) return state->android_netlink_route; } +static inline bool selinux_android_nlroute_getneigh(void) +{ + struct selinux_state *state = &selinux_state; + + return state->android_netlink_getneigh; +} + int security_mls_enabled(struct selinux_state *state); int security_load_policy(struct selinux_state *state, void *data, size_t len); diff --git a/security/selinux/nlmsgtab.c b/security/selinux/nlmsgtab.c index 6a93edf01cfb..1c43823719f2 100755 --- a/security/selinux/nlmsgtab.c +++ b/security/selinux/nlmsgtab.c @@ -196,12 +196,12 @@ int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm) return err; } -static void nlmsg_set_getlink_perm(u32 perm) +static void nlmsg_set_perm_for_type(u32 perm, u16 type) { int i; for (i = 0; i < ARRAY_SIZE(nlmsg_route_perms); i++) { - if (nlmsg_route_perms[i].nlmsg_type == RTM_GETLINK) { + if (nlmsg_route_perms[i].nlmsg_type == type) { nlmsg_route_perms[i].perm = perm; break; } @@ -211,11 +211,28 @@ static void nlmsg_set_getlink_perm(u32 perm) /** * Use nlmsg_readpriv as the permission for RTM_GETLINK messages if the * netlink_route_getlink policy capability is set. Otherwise use nlmsg_read. + * Similarly, use nlmsg_getneigh for RTM_GETNEIGH and RTM_GETNEIGHTBL if the + * netlink_route_getneigh policy capability is set. Otherwise use nlmsg_read. */ + void selinux_nlmsg_init(void) { if (selinux_android_nlroute_getlink()) - nlmsg_set_getlink_perm(NETLINK_ROUTE_SOCKET__NLMSG_READPRIV); + nlmsg_set_perm_for_type(NETLINK_ROUTE_SOCKET__NLMSG_READPRIV, + RTM_GETLINK); else - nlmsg_set_getlink_perm(NETLINK_ROUTE_SOCKET__NLMSG_READ); + nlmsg_set_perm_for_type(NETLINK_ROUTE_SOCKET__NLMSG_READ, + RTM_GETLINK); + + if (selinux_android_nlroute_getneigh()) { + nlmsg_set_perm_for_type(NETLINK_ROUTE_SOCKET__NLMSG_GETNEIGH, + RTM_GETNEIGH); + nlmsg_set_perm_for_type(NETLINK_ROUTE_SOCKET__NLMSG_GETNEIGH, + RTM_GETNEIGHTBL); + } else { + nlmsg_set_perm_for_type(NETLINK_ROUTE_SOCKET__NLMSG_READ, + RTM_GETNEIGH); + nlmsg_set_perm_for_type(NETLINK_ROUTE_SOCKET__NLMSG_READ, + RTM_GETNEIGHTBL); + } } diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c index fedd795de719..ef6d2d56ab55 100755 --- a/security/selinux/ss/policydb.c +++ b/security/selinux/ss/policydb.c @@ -2408,7 +2408,11 @@ int policydb_read(struct policydb *p, void *fp) if ((le32_to_cpu(buf[1]) & POLICYDB_CONFIG_ANDROID_NETLINK_ROUTE)) { p->android_netlink_route = 1; } - + + if ((le32_to_cpu(buf[1]) & POLICYDB_CONFIG_ANDROID_NETLINK_GETNEIGH)) { + p->android_netlink_getneigh = 1; + } + if (p->policyvers >= POLICYDB_VERSION_POLCAP) { rc = ebitmap_read(&p->policycaps, fp); if (rc) diff --git a/security/selinux/ss/policydb.h b/security/selinux/ss/policydb.h index dbb0ed57ed8b..9423952faf7b 100755 --- a/security/selinux/ss/policydb.h +++ b/security/selinux/ss/policydb.h @@ -239,6 +239,7 @@ struct genfs { struct policydb { int mls_enabled; int android_netlink_route; + int android_netlink_getneigh; /* symbol tables */ struct symtab symtab[SYM_NUM]; @@ -326,6 +327,7 @@ extern int policydb_write(struct policydb *p, void *fp); #define POLICYDB_CONFIG_MLS 1 #define POLICYDB_CONFIG_ANDROID_NETLINK_ROUTE (1 << 31) +#define POLICYDB_CONFIG_ANDROID_NETLINK_GETNEIGH (1 << 30) /* the config flags related to unknown classes/perms are bits 2 and 3 */ #define REJECT_UNKNOWN 0x00000002 diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index 6b7f11d29345..19f6aebd9f1c 100755 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c @@ -2142,6 +2142,7 @@ static void security_load_policycaps(struct selinux_state *state) } state->android_netlink_route = p->android_netlink_route; + state->android_netlink_getneigh = p->android_netlink_getneigh; selinux_nlmsg_init(); } diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index 6461bc8708f3..c9e7b310874e 100755 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c @@ -1870,7 +1870,11 @@ static int wait_for_avail(struct snd_pcm_substream *substream, long t = runtime->period_size * 2 / runtime->rate; wait_time = max(t, wait_time); } +#if IS_ENABLED(CONFIG_SND_SOC_SAMSUNG_AUDIO) + wait_time = msecs_to_jiffies(wait_time * 100); +#else wait_time = msecs_to_jiffies(wait_time * 1000); +#endif } for (;;) { diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 48cfe3bbd7a4..c1df0b72f3f1 100755 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -1215,4 +1215,7 @@ config SND_SOC_TFA9894 help TFA9894 driver +# DBMDx +source "sound/soc/codecs/dbmdx/Kconfig" + endmenu diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index ce0aaac405ba..525acb02efec 100755 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -485,3 +485,6 @@ obj-$(CONFIG_SND_SOC_MAX9877) += snd-soc-max9877.o obj-$(CONFIG_SND_SOC_MAX98504) += snd-soc-max98504.o obj-$(CONFIG_SND_SOC_TPA6130A2) += snd-soc-tpa6130a2.o obj-$(CONFIG_SND_SOC_RT5510) += snd-soc-rt5510.o + +# DBMDx (Voice wakeup IC) +obj-$(CONFIG_SND_SOC_DBMDX) += dbmdx/ diff --git a/sound/soc/codecs/dbmdx/Kconfig b/sound/soc/codecs/dbmdx/Kconfig new file mode 100755 index 000000000000..736d6c804bf6 --- /dev/null +++ b/sound/soc/codecs/dbmdx/Kconfig @@ -0,0 +1,124 @@ +# +# DBMDX SoC audio configuration +# +# + +# DBMDX SOC enabler. +# y - Enable DSPG VT/VE Chip +# n - Disable DSPG VT/VE Chip +# m - Build as module +config SND_SOC_DBMDX + tristate "DSPG Voice Trigger/Enhancement Chip" + default n + help + DSPG Voice Trigger/Enhancement Chip + y - Enable DSPG VT/VE Chip + n - Disable DSPG VT/VE Chip + m - Build as module + +# Register DBMDX SOC as a separate sound card. +# y - Register DBMDX SOC as separate sound card +# n - Do not register DBMDX SOC as separate sound card +# . +config SND_SOC_DBMDX_SND_CAPTURE + bool "DSPG Capture Device Support" + depends on SND_SOC_DBMDX + default n + help + Register DBMDX SOC as a separate sound card. + . + y - Register DBMDX SOC as separate sound card + n - Do not register DBMDX SOC as separate sound card + +# Noise Suppression Algorithm Support (Only DBMD8 chip) +# . +# y - Enable Noise Suppression Algorithm Support +# n - Do not enable Noise Suppression Algorithm Support +config SND_SOC_DBMDX_VA_NS_SUPPORT + bool "Noise Suppression Algorithm Support (Only DBMD8 chip)" + depends on SND_SOC_DBMDX + default n + help + Noise Suppression Algorithm Support (Only DBMD8 chip). + . + y - Enable Noise Suppression Algorithm Support + n - Do not enable Noise Suppression Algorithm Support + + +# Register DBMDX SOC as a separate sound card. +# . +# . +# . +config SND_SOC_DBMD4_SPI + bool "DSPG Voice Trigger/Enhancement Chip" + default n + help + DSPG Voice Trigger/Enhancement Chip SPI Interface + . + . + . + +# Register DBMDX SOC as a separate sound card. +# . +# . +# . +config SND_SOC_DBMD4_I2C + bool "DSPG Voice Trigger/Enhancement Chip" + default n + help + DSPG Voice Trigger/Enhancement Chip SPI Interface + . + . + . + +# Register DBMDX SOC as a separate sound card. +# . +# . +# . +config SND_SOC_DBMD4_UART + bool "DSPG Voice Trigger/Enhancement Chip" + default n + help + DSPG Voice Trigger/Enhancement Chip SPI Interface + . + . + . + +# Register DBMDX SOC as a separate sound card. +# . +# . +# . +config SND_SOC_DBMD2_SPI + bool "DSPG Voice Trigger/Enhancement Chip" + default n + help + DSPG Voice Trigger/Enhancement Chip SPI Interface + . + . + . + +# Register DBMDX SOC as a separate sound card. +# . +# . +# . +config SND_SOC_DBMD2_I2C + bool "DSPG Voice Trigger/Enhancement Chip" + default n + help + DSPG Voice Trigger/Enhancement Chip SPI Interface + . + . + . + +# Register DBMDX SOC as a separate sound card. +# . +# . +# . +config SND_SOC_DBMD2_UART + bool "DSPG Voice Trigger/Enhancement Chip" + default n + help + DSPG Voice Trigger/Enhancement Chip SPI Interface + . + . + . diff --git a/sound/soc/codecs/dbmdx/Makefile b/sound/soc/codecs/dbmdx/Makefile new file mode 100755 index 000000000000..9a2b96dbc73d --- /dev/null +++ b/sound/soc/codecs/dbmdx/Makefile @@ -0,0 +1,75 @@ +ifeq ($(CONFIG_SND_SOC_DBMDX),y) + obj-$(CONFIG_SND_SOC_DBMDX) := dbmdx.o + obj-$(CONFIG_SND_SOC_DBMDX) += dbmdx-spi.o + obj-$(CONFIG_SND_SOC_DBMDX) += dbmdx-i2c.o + obj-$(CONFIG_SND_SOC_DBMDX) += dbmdx-i2c-d2.o + obj-$(CONFIG_SND_SOC_DBMDX) += dbmdx-i2c-d4.o + obj-$(CONFIG_SND_SOC_DBMDX) += dbmdx-spi-d2.o + obj-$(CONFIG_SND_SOC_DBMDX) += dbmdx-spi-d4.o + obj-$(CONFIG_SND_SOC_DBMDX) += dbmdx-uart-d2.o + obj-$(CONFIG_SND_SOC_DBMDX) += dbmdx-uart-d4.o + obj-$(CONFIG_SND_SOC_DBMDX) += dbmdx-uart.o + obj-$(CONFIG_SND_SOC_DBMDX) += dbmdx-i2s.o + obj-$(CONFIG_SND_SOC_DBMDX) += dbmdx-customer.o + obj-$(CONFIG_SND_SOC_DBMDX) += dbmdx-cdev.o + obj-$(CONFIG_SND_SOC_DBMDX_SND_CAPTURE) += dbmdx-snd.o + obj-$(CONFIG_SND_SOC_DBMDX_SND_CAPTURE) += dbmdx-snd-pcm.o +else + ifeq ($(CONFIG_SND_SOC_DBMDX),m) + KBUILD_CFLAGS += -DCONFIG_SND_SOC_DBMDX_MODULE=1 + + obj-$(CONFIG_SND_SOC_DBMDX) := dbmdx_codec.o + + dbmdx_codec-objs := dbmdx.o dbmdx-customer.o dbmdx-cdev.o dbmdx-i2s.o + + #DBMD4 + ifneq ($(CONFIG_SND_SOC_DBMD4_SPI),) + dbmdx_codec-objs += dbmdx-spi.o + dbmdx_codec-objs += dbmdx-spi-d4.o + endif + + ifneq ($(CONFIG_SND_SOC_DBMD4_I2C),) + dbmdx_codec-objs += dbmdx-i2c.o + dbmdx_codec-objs += dbmdx-i2c-d4.o + endif + + ifneq ($(CONFIG_SND_SOC_DBMD4_UART),) + dbmdx_codec-objs += dbmdx-uart.o + dbmdx_codec-objs += dbmdx-uart-d4.o + endif + + #DBMD2 + ifneq ($(CONFIG_SND_SOC_DBMD2_SPI),) + dbmdx_codec-objs += dbmdx-spi.o + dbmdx_codec-objs += dbmdx-spi-d2.o + endif + + ifneq ($(CONFIG_SND_SOC_DBMD2_I2C),) + dbmdx_codec-objs += dbmdx-i2c.o + dbmdx_codec-objs += dbmdx-i2c-d2.o + endif + + ifneq ($(CONFIG_SND_SOC_DBMD2_UART),) + dbmdx_codec-objs += dbmdx-uart.o + dbmdx_codec-objs += dbmdx-uart-d2.o + endif + + ifeq ($(CONFIG_SND_SOC_DBMDX_SND_CAPTURE),y) + dbmdx_codec-objs += dbmdx-snd.o + dbmdx_codec-objs += dbmdx-snd-pcm.o + endif + endif +endif + +ifneq ($(KERNELRELEASE),) +# kbuild part of makefile +else +# normal makefile +all: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) \ + KBUILD_EXTMOD=$(PWD) \ + modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean +endif diff --git a/sound/soc/codecs/dbmdx/dbmdx-cdev.c b/sound/soc/codecs/dbmdx/dbmdx-cdev.c new file mode 100755 index 000000000000..148145398afb --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-cdev.c @@ -0,0 +1,225 @@ +/* + * DSPG DBMDX codec driver character device interface + * + * Copyright (C) 2014 DSP Group + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/device.h> +#include <linux/platform_device.h> +#include <linux/fs.h> +#include <linux/cdev.h> +#include <linux/module.h> +#include <linux/kfifo.h> +#include <linux/delay.h> + +#include "dbmdx-interface.h" + +static struct dbmdx_private *dbmdx_p; + +static atomic_t cdev_opened = ATOMIC_INIT(0); + +/* Access to the audio buffer is controlled through "audio_owner". Either the + * character device or the ALSA-capture device can be opened. + */ +static int dbmdx_record_open(struct inode *inode, struct file *file) +{ + file->private_data = dbmdx_p; + + if (!atomic_add_unless(&cdev_opened, 1, 1)) + return -EBUSY; + + return 0; +} + +static int dbmdx_record_release(struct inode *inode, struct file *file) +{ + dbmdx_p->lock(dbmdx_p); + dbmdx_p->va_flags.buffering = 0; + dbmdx_p->unlock(dbmdx_p); + + flush_work(&dbmdx_p->sv_work); + + atomic_dec(&cdev_opened); + + return 0; +} + +/* + * read out of the kfifo as much as was requested or if requested more + * as much as is in the FIFO + */ +static ssize_t dbmdx_record_read(struct file *file, char __user *buf, + size_t count_want, loff_t *f_pos) +{ + struct dbmdx_private *p = (struct dbmdx_private *)file->private_data; + size_t not_copied; + ssize_t to_copy = count_want; + int avail; + unsigned int copied; + int ret; + + dev_dbg(p->dbmdx_dev, "%s: count_want:%zu f_pos:%lld\n", + __func__, count_want, *f_pos); + + avail = kfifo_len(&p->detection_samples_kfifo); + + if (avail == 0) + return 0; + + if (count_want > avail) + to_copy = avail; + + ret = kfifo_to_user(&p->detection_samples_kfifo, + buf, to_copy, &copied); + if (ret) + return -EIO; + + not_copied = count_want - copied; + *f_pos = *f_pos + (count_want - not_copied); + + return count_want - not_copied; +} + +static const struct file_operations dbmdx_cdev_fops = { + .owner = THIS_MODULE, + .open = dbmdx_record_open, + .release = dbmdx_record_release, + .read = dbmdx_record_read, +}; + +/* + * read out of the kfifo as much as was requested and block until all + * data is available or a timeout occurs + */ +static ssize_t dbmdx_record_read_blocking(struct file *file, char __user *buf, + size_t count_want, loff_t *f_pos) +{ + struct dbmdx_private *p = (struct dbmdx_private *)file->private_data; + + size_t not_copied; + ssize_t to_copy = count_want; + int avail; + unsigned int copied, total_copied = 0; + int ret; + unsigned long timeout = jiffies + msecs_to_jiffies(500); + + dev_dbg(p->dbmdx_dev, "%s: count_want:%zu f_pos:%lld\n", + __func__, count_want, *f_pos); + + avail = kfifo_len(&p->detection_samples_kfifo); + + while ((total_copied < count_want) && + time_before(jiffies, timeout) && avail) { + to_copy = avail; + if (count_want - total_copied < avail) + to_copy = count_want - total_copied; + + ret = kfifo_to_user(&p->detection_samples_kfifo, + buf + total_copied, to_copy, &copied); + if (ret) + return -EIO; + + total_copied += copied; + + avail = kfifo_len(&p->detection_samples_kfifo); + if (avail == 0 && p->va_flags.buffering) + usleep_range(100000, 110000); + } + + if (avail && (total_copied < count_want)) + dev_err(p->dev, "dbmdx: timeout during reading\n"); + + not_copied = count_want - total_copied; + *f_pos = *f_pos + (count_want - not_copied); + + return count_want - not_copied; +} + +static const struct file_operations dbmdx_cdev_block_fops = { + .owner = THIS_MODULE, + .open = dbmdx_record_open, + .release = dbmdx_record_release, + .read = dbmdx_record_read_blocking, +}; + +int dbmdx_register_cdev(struct dbmdx_private *p) +{ + int ret; + + dbmdx_p = p; + + ret = alloc_chrdev_region(&p->record_chrdev, 0, 2, "dbmdx"); + if (ret) { + dev_err(p->dbmdx_dev, "failed to allocate character device\n"); + return -EINVAL; + } + + cdev_init(&p->record_cdev, &dbmdx_cdev_fops); + cdev_init(&p->record_cdev_block, &dbmdx_cdev_block_fops); + + p->record_cdev.owner = THIS_MODULE; + p->record_cdev_block.owner = THIS_MODULE; + + ret = cdev_add(&p->record_cdev, p->record_chrdev, 1); + if (ret) { + dev_err(p->dbmdx_dev, "failed to add character device\n"); + unregister_chrdev_region(p->record_chrdev, 1); + return -EINVAL; + } + + ret = cdev_add(&p->record_cdev_block, p->record_chrdev + 1, 1); + if (ret) { + dev_err(p->dbmdx_dev, + "failed to add blocking character device\n"); + unregister_chrdev_region(p->record_chrdev, 1); + return -EINVAL; + } + + p->record_dev = device_create(p->ns_class, NULL, + MKDEV(MAJOR(p->record_chrdev), 0), + p, "dbmdx-%d", 0); + if (IS_ERR(p->record_dev)) { + dev_err(p->dev, "could not create device\n"); + unregister_chrdev_region(p->record_chrdev, 1); + cdev_del(&p->record_cdev); + return -EINVAL; + } + + p->record_dev_block = device_create(p->ns_class, NULL, + MKDEV(MAJOR(p->record_chrdev), 1), + p, "dbmdx-%d", 1); + if (IS_ERR(p->record_dev_block)) { + dev_err(p->dev, "could not create device\n"); + unregister_chrdev_region(p->record_chrdev, 1); + cdev_del(&p->record_cdev_block); + return -EINVAL; + } + + return 0; +} +EXPORT_SYMBOL(dbmdx_register_cdev); + +void dbmdx_deregister_cdev(struct dbmdx_private *p) +{ + if (p->record_dev) { + device_unregister(p->record_dev); + cdev_del(&p->record_cdev); + } + if (p->record_dev_block) { + device_unregister(p->record_dev_block); + cdev_del(&p->record_cdev_block); + } + unregister_chrdev_region(p->record_chrdev, 2); + + dbmdx_p = NULL; +} +EXPORT_SYMBOL(dbmdx_deregister_cdev); diff --git a/sound/soc/codecs/dbmdx/dbmdx-customer-def.h b/sound/soc/codecs/dbmdx/dbmdx-customer-def.h new file mode 100755 index 000000000000..ab624bdb0b20 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-customer-def.h @@ -0,0 +1,53 @@ +/* + * dbmdx-customer.h -- DBMDX customer definitions + * + * Copyright (C) 2014 DSP Group + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _DBMDX_CUSTOMER_DEF_H +#define _DBMDX_CUSTOMER_DEF_H + +#define DBMD2_VA_FIRMWARE_NAME "dbmd2_va_fw.bin" +#define DBMD2_VQE_FIRMWARE_NAME "dbmd2_vqe_fw.bin" +#define DBMD2_VQE_OVERLAY_FIRMWARE_NAME "dbmd2_vqe_overlay_fw.bin" + +#define DBMD4_VA_FIRMWARE_NAME "dbmd4_va_fw.bin" + +#define DBMDX_VT_GRAM_NAME "voice_grammar.bin" +#define DBMDX_VT_NET_NAME "voice_net.bin" +#define DBMDX_VT_AMODEL_NAME "voice_amodel.bin" + +#define DBMDX_VC_GRAM_NAME "vc_grammar.bin" +#define DBMDX_VC_NET_NAME "vc_net.bin" +#define DBMDX_VC_AMODEL_NAME "vc_amodel.bin" + +#define DBMDX_VE_GRAM_NAME "voice_grammar.bin" +#define DBMDX_VE_NET_NAME "voice_net.bin" +#define DBMDX_VE_AMODEL_NAME "voice_amodel.bin" + +/* ================ Defines related to kernel vesion ===============*/ + +/* #define DBMDX_VA_NS_SUPPORT 1 */ + +#define USE_ALSA_API_3_10_XX 0 + +#define SOC_BYTES_EXT_HAS_KCONTROL_FIELD 1 + + + +/* ==================================================================*/ + +/* ================ Custom Configuration ===============*/ + +#define DBMDX_DEFER_SND_CARD_LOADING 1 +#define DMBDX_OKG_AMODEL_SUPPORT 1 +#define DBMDX_VERIFY_OKG_SUPPORT_BY_FW 1 +#define DBMDX_USE_ASLA_CONTROLS_WITH_DBMDX_CARD_ONLY 1 + +/* ==================================================================*/ + +#endif diff --git a/sound/soc/codecs/dbmdx/dbmdx-customer.c b/sound/soc/codecs/dbmdx/dbmdx-customer.c new file mode 100755 index 000000000000..b8eb6d8f1e3b --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-customer.c @@ -0,0 +1,58 @@ +/* + * DSPG DBMDX codec driver customer interface + * + * Copyright (C) 2014 DSP Group + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/clk.h> +#include <linux/delay.h> +#include <linux/module.h> + +#include "dbmdx-customer.h" + +unsigned long customer_dbmdx_clk_get_rate( + struct dbmdx_private *p, enum dbmdx_clocks clk) +{ + dev_dbg(p->dev, "%s: %s\n", + __func__, + clk == DBMDX_CLK_CONSTANT ? "constant" : "master"); + return 0; +} +EXPORT_SYMBOL(customer_dbmdx_clk_get_rate); + +long customer_dbmdx_clk_set_rate( + struct dbmdx_private *p, enum dbmdx_clocks clk) +{ + dev_dbg(p->dev, "%s: %s\n", + __func__, + clk == DBMDX_CLK_CONSTANT ? "constant" : "master"); + return 0; +} +EXPORT_SYMBOL(customer_dbmdx_clk_set_rate); + +int customer_dbmdx_clk_enable(struct dbmdx_private *p, enum dbmdx_clocks clk) +{ + dev_dbg(p->dev, "%s: %s\n", + __func__, + clk == DBMDX_CLK_CONSTANT ? "constant" : "master"); + return 0; +} +EXPORT_SYMBOL(customer_dbmdx_clk_enable); + +void customer_dbmdx_clk_disable(struct dbmdx_private *p, enum dbmdx_clocks clk) +{ + dev_dbg(p->dev, "%s: %s\n", + __func__, + clk == DBMDX_CLK_CONSTANT ? "constant" : "master"); +} +EXPORT_SYMBOL(customer_dbmdx_clk_disable); + diff --git a/sound/soc/codecs/dbmdx/dbmdx-customer.h b/sound/soc/codecs/dbmdx/dbmdx-customer.h new file mode 100755 index 000000000000..b4368d1b0330 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-customer.h @@ -0,0 +1,24 @@ +/* + * dbmdx-customer.h -- DBMDX customer api + * + * Copyright (C) 2014 DSP Group + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _DBMDX_CUSTOMER_API_H +#define _DBMDX_CUSTOMER_API_H + +#include "dbmdx-interface.h" + +unsigned long customer_dbmdx_clk_get_rate(struct dbmdx_private *p, + enum dbmdx_clocks clk); +long customer_dbmdx_clk_set_rate(struct dbmdx_private *p, + enum dbmdx_clocks clk); +int customer_dbmdx_clk_enable(struct dbmdx_private *p, enum dbmdx_clocks clk); +void customer_dbmdx_clk_disable(struct dbmdx_private *p, enum dbmdx_clocks clk); +void dbmdx_uart_clk_enable(struct dbmdx_private *p, bool enable); + +#endif diff --git a/sound/soc/codecs/dbmdx/dbmdx-i2c-d2.c b/sound/soc/codecs/dbmdx/dbmdx-i2c-d2.c new file mode 100755 index 000000000000..3b783da935ef --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-i2c-d2.c @@ -0,0 +1,360 @@ +/* + * DSPG DBMD2 I2C interface driver + * + * Copyright (C) 2014 DSP Group + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +/* #define DEBUG */ +#include <linux/kernel.h> +#include <linux/delay.h> +#include <linux/slab.h> +#include <linux/i2c.h> +#include <linux/module.h> +#include <linux/mutex.h> +#include <linux/clk.h> +#include <linux/of.h> +#include <linux/firmware.h> + +#include "dbmdx-interface.h" +#include "dbmdx-va-regmap.h" +#include "dbmdx-vqe-regmap.h" +#include "dbmdx-i2c.h" +#include "dbmdx-i2c-sbl-d2.h" + + +static const u8 clr_crc[] = {0x5A, 0x03, 0x52, 0x0a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00}; + + + +static int dbmd2_i2c_boot(const void *fw_data, size_t fw_size, + struct dbmdx_private *p, const void *checksum, + size_t chksum_len, int load_fw) +{ + int retry = RETRY_COUNT; + int ret = 0; + ssize_t send_bytes; + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s\n", __func__); + + /* change to boot I2C address */ + i2c_p->client->addr = (unsigned short)(i2c_p->pdata->boot_addr); + + do { + + if (p->active_fw == DBMDX_FW_PRE_BOOT) { + + if (!(p->boot_mode & DBMDX_BOOT_MODE_RESET_DISABLED)) { + /* reset DBMD2 chip */ + p->reset_sequence(p); + } else { + /* If failed and reset is disabled, break */ + if (retry != RETRY_COUNT) { + retry = -1; + break; + } + } + + /* delay before sending commands */ + if (p->clk_get_rate(p, DBMDX_CLK_MASTER) <= 32768) + msleep(DBMDX_MSLEEP_I2C_D2_AFTER_RESET_32K); + else + usleep_range(DBMDX_USLEEP_I2C_D2_AFTER_RESET, + DBMDX_USLEEP_I2C_D2_AFTER_RESET + 5000); + + if (!(p->cur_boot_options & + DBMDX_BOOT_OPT_NO_I2C_FREQ_CALLBACK) && + p->set_i2c_freq_callback) { + dev_dbg(p->dev, + "%s: setting master bus to slow freq\n", + __func__); + p->set_i2c_freq_callback( + i2c_p->client->adapter, I2C_FREQ_SLOW); + } + if (!(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_SENT_SBL)) { + + /* send SBL */ + send_bytes = write_i2c_data(p, sbl, + sizeof(sbl)); + if (send_bytes != sizeof(sbl)) { + dev_err(p->dev, + "%s: -------> load SBL error\n", + __func__); + continue; + } + + usleep_range(DBMDX_USLEEP_I2C_D2_AFTER_SBL, + DBMDX_USLEEP_I2C_D2_AFTER_SBL + 1000); + } + + if (!(p->cur_boot_options & + DBMDX_BOOT_OPT_NO_I2C_FREQ_CALLBACK) && + p->set_i2c_freq_callback) { + + msleep(DBMDX_MSLEEP_I2C_D2_CALLBACK); + dev_dbg(p->dev, + "%s: setting master bus to fast freq\n", + __func__); + p->set_i2c_freq_callback( + i2c_p->client->adapter, I2C_FREQ_FAST); + } + + /* verify chip id */ + if (p->cur_boot_options & + DBMDX_BOOT_OPT_VERIFY_CHIP_ID) { + ret = i2c_verify_chip_id(p); + if (ret < 0) { + dev_err(i2c_p->dev, + "%s: couldn't verify chip id\n", + __func__); + continue; + } + } + + if (!(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_CLR_CRC)) { + + /* send CRC clear command */ + ret = write_i2c_data(p, clr_crc, + sizeof(clr_crc)); + if (ret != sizeof(clr_crc)) { + dev_err(p->dev, + "%s: failed to clear CRC\n", + __func__); + continue; + } + } + } else { + /* delay before sending commands */ + if (p->active_fw == DBMDX_FW_VQE) + ret = send_i2c_cmd_vqe(p, + DBMDX_VQE_SET_SWITCH_TO_BOOT_CMD, + NULL); + else if (p->active_fw == DBMDX_FW_VA) + ret = send_i2c_cmd_va(p, + DBMDX_VA_SWITCH_TO_BOOT, + NULL); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to send 'Switch to BOOT' cmd\n", + __func__); + continue; + } + } + + if (!load_fw) + break; + /* Sleep is needed here to ensure that chip is ready */ + msleep(DBMDX_MSLEEP_I2C_D2_AFTER_SBL); + + /* send firmware */ + send_bytes = write_i2c_data(p, fw_data, fw_size - 4); + if (send_bytes != fw_size - 4) { + dev_err(p->dev, + "%s: -----------> load firmware error\n", + __func__); + continue; + } + + msleep(DBMDX_MSLEEP_I2C_D2_BEFORE_FW_CHECKSUM); + + if (checksum && !(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_VERIFY_CRC)) { + ret = i2c_verify_boot_checksum(p, checksum, chksum_len); + if (ret < 0) { + dev_err(i2c_p->dev, + "%s: could not verify checksum\n", + __func__); + continue; + } + } + + dev_info(p->dev, "%s: ---------> firmware loaded\n", + __func__); + break; + } while (--retry); + + /* no retries left, failed to boot */ + if (retry <= 0) { + dev_err(p->dev, "%s: failed to load firmware\n", __func__); + return -EIO; + } + + if (!(p->cur_boot_options & DBMDX_BOOT_OPT_DONT_SEND_START_BOOT)) { + /* send boot command */ + ret = send_i2c_cmd_boot(p, DBMDX_FIRMWARE_BOOT); + if (ret < 0) { + dev_err(p->dev, + "%s: booting the firmware failed\n", __func__); + return -EIO; + } + } + + /* wait some time */ + usleep_range(DBMDX_USLEEP_I2C_D2_AFTER_BOOT, + DBMDX_USLEEP_I2C_D2_AFTER_BOOT + 1000); + + return 0; +} + +#if IS_ENABLED(CONFIG_PM_SLEEP) +static int dbmdx_i2c_suspend(struct device *dev) +{ + struct chip_interface *ci = i2c_get_clientdata(to_i2c_client(dev)); + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)ci->pdata; + + + dev_dbg(dev, "%s\n", __func__); + + i2c_interface_suspend(i2c_p); + + return 0; +} + +static int dbmdx_i2c_resume(struct device *dev) +{ + struct chip_interface *ci = i2c_get_clientdata(to_i2c_client(dev)); + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + i2c_interface_resume(i2c_p); + + return 0; +} +#else +#define dbmdx_i2c_suspend NULL +#define dbmdx_i2c_resume NULL +#endif /* CONFIG_PM_SLEEP */ + +#if IS_ENABLED(CONFIG_PM) +static int dbmdx_i2c_runtime_suspend(struct device *dev) +{ + struct chip_interface *ci = i2c_get_clientdata(to_i2c_client(dev)); + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + + i2c_interface_suspend(i2c_p); + + return 0; +} + +static int dbmdx_i2c_runtime_resume(struct device *dev) +{ + struct chip_interface *ci = i2c_get_clientdata(to_i2c_client(dev)); + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + i2c_interface_resume(i2c_p); + + return 0; +} +#else +#define dbmdx_i2c_runtime_suspend NULL +#define dbmdx_i2c_runtime_resume NULL +#endif /* CONFIG_PM */ + + +static const struct dev_pm_ops dbmdx_i2c_pm = { + SET_SYSTEM_SLEEP_PM_OPS(dbmdx_i2c_suspend, dbmdx_i2c_resume) + SET_RUNTIME_PM_OPS(dbmdx_i2c_runtime_suspend, + dbmdx_i2c_runtime_resume, NULL) +}; + + +static int dbmd2_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + int rc; + struct dbmdx_i2c_private *p; + struct chip_interface *ci; + + rc = i2c_common_probe(client, id); + + if (rc < 0) + return rc; + + ci = i2c_get_clientdata(client); + p = (struct dbmdx_i2c_private *)ci->pdata; + + /* fill in chip interface functions */ + p->chip.boot = dbmd2_i2c_boot; + + return rc; +} + + +static const struct of_device_id dbmd2_i2c_of_match[] = { + { .compatible = "dspg,dbmd2-i2c", }, + {}, +}; +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX) +MODULE_DEVICE_TABLE(of, dbmd2_i2c_of_match); +#endif + +static const struct i2c_device_id dbmd2_i2c_id[] = { + { "dbmdx-i2c", 0 }, + { "dbmd2-i2c", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, dbmd2_i2c_id); + +static struct i2c_driver dbmd2_i2c_driver = { + .driver = { + .name = "dbmd2-i2c", + .owner = THIS_MODULE, +#if IS_ENABLED(CONFIG_OF) + .of_match_table = dbmd2_i2c_of_match, +#endif + .pm = &dbmdx_i2c_pm, + }, + .probe = dbmd2_i2c_probe, + .remove = i2c_common_remove, + .id_table = dbmd2_i2c_id, +}; + +#if (IS_ENABLED(CONFIG_SND_SOC_DBMDX) && !IS_MODULE(CONFIG_SND_SOC_DBMDX)) +static int __init dbmd2_modinit(void) +{ + return i2c_add_driver(&dbmd2_i2c_driver); +} +module_init(dbmd2_modinit); + +static void __exit dbmd2_exit(void) +{ + i2c_del_driver(&dbmd2_i2c_driver); +} +module_exit(dbmd2_exit); +#else +int dbmd2_i2c_init_interface(void) +{ + i2c_add_driver(&dbmd2_i2c_driver); + return 0; +} + +void dbmd2_i2c_deinit_interface(void) +{ + i2c_del_driver(&dbmd2_i2c_driver); +} + +int (*dbmdx_init_interface)(void) = &dbmd2_i2c_init_interface; +void (*dbmdx_deinit_interface)(void) = &dbmd2_i2c_deinit_interface; +#endif + +MODULE_DESCRIPTION("DSPG DBMD2 I2C interface driver"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/dbmdx/dbmdx-i2c-d4.c b/sound/soc/codecs/dbmdx/dbmdx-i2c-d4.c new file mode 100755 index 000000000000..0a91561e22b9 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-i2c-d4.c @@ -0,0 +1,302 @@ +/* + * DSPG DBMD4/DBMD6/DBMD8 I2C interface driver + * + * Copyright (C) 2014 DSP Group + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +/* #define DEBUG */ +#include <linux/kernel.h> +#include <linux/delay.h> +#include <linux/slab.h> +#include <linux/i2c.h> +#include <linux/module.h> +#include <linux/mutex.h> +#include <linux/clk.h> +#include <linux/of.h> +#include <linux/firmware.h> + +#include "dbmdx-interface.h" +#include "dbmdx-va-regmap.h" +#include "dbmdx-i2c.h" + +#define DRIVER_VERSION "1.0" + + +static const u8 clr_crc_cmd[] = {0x5A, 0x0F}; + + + +static int dbmd4_i2c_boot(const void *fw_data, size_t fw_size, + struct dbmdx_private *p, const void *checksum, + size_t chksum_len, int load_fw) +{ + int retry = RETRY_COUNT; + int ret = 0; + ssize_t send_bytes; + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s\n", __func__); + + /* change to boot I2C address */ + i2c_p->client->addr = (unsigned short)(i2c_p->pdata->boot_addr); + + do { + + if (p->active_fw == DBMDX_FW_PRE_BOOT) { + + if (!(p->boot_mode & DBMDX_BOOT_MODE_RESET_DISABLED)) { + /* reset DBMD4 chip */ + p->reset_sequence(p); + } else { + /* If failed and reset is disabled, break */ + if (retry != RETRY_COUNT) { + retry = -1; + break; + } + } + + /* delay before sending commands */ + if (p->clk_get_rate(p, DBMDX_CLK_MASTER) <= 32768) + msleep(DBMDX_MSLEEP_I2C_D4_AFTER_RESET_32K); + else + usleep_range(DBMDX_USLEEP_I2C_D4_AFTER_RESET, + DBMDX_USLEEP_I2C_D4_AFTER_RESET + 5000); + + /* verify chip id */ + if (p->cur_boot_options & + DBMDX_BOOT_OPT_VERIFY_CHIP_ID) { + ret = i2c_verify_chip_id(p); + if (ret < 0) { + dev_err(i2c_p->dev, + "%s: couldn't verify chip id\n", + __func__); + continue; + } + } + + if (!(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_CLR_CRC)) { + + /* send CRC clear command */ + ret = write_i2c_data(p, clr_crc_cmd, + sizeof(clr_crc_cmd)); + if (ret != sizeof(clr_crc_cmd)) { + dev_err(p->dev, + "%s: failed to clear CRC\n", + __func__); + continue; + } + } + } else { + ret = send_i2c_cmd_va(p, + DBMDX_VA_SWITCH_TO_BOOT, + NULL); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to send 'Switch to BOOT' cmd\n", + __func__); + continue; + } + } + + if (!load_fw) + break; + /* Sleep is needed here to ensure that chip is ready */ + msleep(DBMDX_MSLEEP_I2C_D4_AFTER_SBL); + + /* send firmware */ + send_bytes = write_i2c_data(p, fw_data, fw_size - 4); + if (send_bytes != fw_size - 4) { + dev_err(p->dev, + "%s: -----------> load firmware error\n", + __func__); + continue; + } + + msleep(DBMDX_MSLEEP_I2C_D4_BEFORE_FW_CHECKSUM); + + /* verify checksum */ + if (checksum && !(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_VERIFY_CRC)) { + ret = i2c_verify_boot_checksum(p, checksum, chksum_len); + if (ret < 0) { + dev_err(i2c_p->dev, + "%s: could not verify checksum\n", + __func__); + continue; + } + } + + dev_info(p->dev, "%s: ---------> firmware loaded\n", + __func__); + break; + } while (--retry); + + /* no retries left, failed to boot */ + if (retry <= 0) { + dev_err(p->dev, "%s: failed to load firmware\n", __func__); + return -EIO; + } + + if (!(p->cur_boot_options & DBMDX_BOOT_OPT_DONT_SEND_START_BOOT)) { + /* send boot command */ + ret = send_i2c_cmd_boot(p, DBMDX_FIRMWARE_BOOT); + if (ret < 0) { + dev_err(p->dev, + "%s: booting the firmware failed\n", __func__); + return -EIO; + } + } + + /* wait some time */ + usleep_range(DBMDX_USLEEP_I2C_D4_AFTER_BOOT, + DBMDX_USLEEP_I2C_D4_AFTER_BOOT + 1000); + + return 0; +} + +#if IS_ENABLED(CONFIG_PM_SLEEP) +static int dbmdx_i2c_suspend(struct device *dev) +{ + struct chip_interface *ci = i2c_get_clientdata(to_i2c_client(dev)); + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)ci->pdata; + + + dev_dbg(dev, "%s\n", __func__); + + i2c_interface_suspend(i2c_p); + + return 0; +} + +static int dbmdx_i2c_resume(struct device *dev) +{ + struct chip_interface *ci = i2c_get_clientdata(to_i2c_client(dev)); + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + i2c_interface_resume(i2c_p); + + return 0; +} +#else +#define dbmdx_i2c_suspend NULL +#define dbmdx_i2c_resume NULL +#endif /* CONFIG_PM_SLEEP */ + +#if IS_ENABLED(CONFIG_PM) +static int dbmdx_i2c_runtime_suspend(struct device *dev) +{ + struct chip_interface *ci = i2c_get_clientdata(to_i2c_client(dev)); + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + + i2c_interface_suspend(i2c_p); + + return 0; +} + +static int dbmdx_i2c_runtime_resume(struct device *dev) +{ + struct chip_interface *ci = i2c_get_clientdata(to_i2c_client(dev)); + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + i2c_interface_resume(i2c_p); + + return 0; +} +#else +#define dbmdx_i2c_runtime_suspend NULL +#define dbmdx_i2c_runtime_resume NULL +#endif /* CONFIG_PM */ + +static const struct dev_pm_ops dbmdx_i2c_pm = { + SET_SYSTEM_SLEEP_PM_OPS(dbmdx_i2c_suspend, dbmdx_i2c_resume) + SET_RUNTIME_PM_OPS(dbmdx_i2c_runtime_suspend, + dbmdx_i2c_runtime_resume, NULL) +}; + + + +static int dbmd4_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + int rc; + struct dbmdx_i2c_private *p; + struct chip_interface *ci; + + rc = i2c_common_probe(client, id); + + if (rc < 0) + return rc; + + ci = i2c_get_clientdata(client); + p = (struct dbmdx_i2c_private *)ci->pdata; + + /* fill in chip interface functions */ + p->chip.boot = dbmd4_i2c_boot; + + return rc; +} + + +static const struct of_device_id dbmd_4_8_i2c_of_match[] = { + { .compatible = "dspg,dbmd4-i2c", }, + { .compatible = "dspg,dbmd6-i2c", }, + { .compatible = "dspg,dbmd8-i2c", }, + {}, +}; +MODULE_DEVICE_TABLE(of, dbmd_4_8_i2c_of_match); + +static const struct i2c_device_id dbmd_4_8_i2c_id[] = { + { "dbmdx-i2c", 0 }, + { "dbmd4-i2c", 0 }, + { "dbmd6-i2c", 0 }, + { "dbmd8-i2c", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, dbmd_4_8_i2c_id); + +static struct i2c_driver dbmd_4_8_i2c_driver = { + .driver = { + .name = "dbmd_4_8-i2c", + .owner = THIS_MODULE, +#if IS_ENABLED(CONFIG_OF) + .of_match_table = dbmd_4_8_i2c_of_match, +#endif + .pm = &dbmdx_i2c_pm, + }, + .probe = dbmd4_i2c_probe, + .remove = i2c_common_remove, + .id_table = dbmd_4_8_i2c_id, +}; + +static int __init dbmd_4_8_modinit(void) +{ + return i2c_add_driver(&dbmd_4_8_i2c_driver); +} +module_init(dbmd_4_8_modinit); + +static void __exit dbmd_4_8_exit(void) +{ + i2c_del_driver(&dbmd_4_8_i2c_driver); +} +module_exit(dbmd_4_8_exit); + +MODULE_DESCRIPTION("DSPG DBMD4/DBMD6/DBMD8 I2C interface driver"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/dbmdx/dbmdx-i2c-sbl-d2.h b/sound/soc/codecs/dbmdx/dbmdx-i2c-sbl-d2.h new file mode 100755 index 000000000000..cf5a172a22eb --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-i2c-sbl-d2.h @@ -0,0 +1,60 @@ +/* + * dbmdx-i2c-sbl-d2.h -- DBMD2 SBL for I2C + * + * Copyright (C) 2014 DSP Group + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _DBMDX_I2C_SBL_D2_H +#define _DBMDX_I2C_SBL_D2_H + +static unsigned char sbl[] = { +#ifndef DBMDX_I2C_SBL_D2_TYPE_2 + 0x5a, 0x01, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x48, 0xfc, 0x88, 0x01, 0x00, 0x00, + 0x34, 0x1d, 0x23, 0x10, 0x00, 0x00, 0x80, 0x45, + 0xb6, 0xd4, 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, + 0x04, 0x00, 0x40, 0xfa, 0xc1, 0x01, 0x08, 0xfc, + 0x80, 0x01, 0x00, 0x10, 0x00, 0x00, 0x40, 0xfa, + 0xc1, 0x05, 0x4e, 0xfc, 0x89, 0x09, 0x02, 0x00, + 0x10, 0x13, 0x0a, 0x5e, 0x01, 0x00, 0x9b, 0xde, + 0x44, 0x00, 0x49, 0x5e, 0x28, 0x59, 0x0b, 0x59, + 0x4e, 0xfc, 0x88, 0x09, 0x02, 0x00, 0xd4, 0x12, + 0x4b, 0x59, 0x9b, 0xde, 0x3a, 0x00, 0x2b, 0x59, + 0x48, 0x5e, 0x0b, 0x59, 0x00, 0x27, 0x02, 0x23, + 0x10, 0xfe, 0xc1, 0x05, 0x52, 0x0a, 0x48, 0xfc, + 0x82, 0x01, 0x00, 0x01, 0x0c, 0x00, 0x40, 0xfa, + 0xc2, 0x05, 0x05, 0x23, 0x48, 0xfc, 0x82, 0x01, + 0x00, 0x01, 0x10, 0x00, 0x40, 0xfa, 0xc2, 0x05, + 0x03, 0x23, 0x48, 0xfc, 0x82, 0x01, 0x00, 0x01, + 0x18, 0x00, 0x40, 0xfa, 0xc2, 0x05, 0xff, 0x0c, + 0x00, 0x00, 0x48, 0xfc, 0x80, 0x01, 0x00, 0x0a, + 0x00, 0x0a, 0x48, 0xfc, 0x82, 0x01, 0x00, 0x03, + 0x4c, 0x00, 0x40, 0xfa, 0xc2, 0x05, 0x00, 0x5e, + 0xa3, 0x00, 0x48, 0xfc, 0x82, 0x01, 0x00, 0x03, + 0x48, 0x00, 0x40, 0xfa, 0xc2, 0x05, 0x48, 0xfc, + 0x80, 0x01, 0x00, 0x03, 0x08, 0x00, 0x41, 0xfa, + 0xc0, 0x05, 0xd6, 0xd4, 0x80, 0x45, 0x00, 0x00, + 0x80, 0x45, 0x47, 0x5e, 0xf5, 0x58, 0x02, 0x44, + 0xb6, 0xd4, 0x82, 0xd4, 0xd6, 0xd4, 0x67, 0x5e, + 0x01, 0x09, 0x48, 0xfc, 0x80, 0x01, 0xda, 0xba, + 0x01, 0x19, 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, + 0x28, 0x00, 0x40, 0xfa, 0xc1, 0x05, 0x00, 0x5e, + 0x00, 0x01, 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, + 0x2c, 0x00, 0x40, 0xfa, 0xc1, 0x05, 0x90, 0x45, + 0x01, 0x21, 0x5a, 0x0a, 0x00, 0x80, 0x00, 0x00, +#else + 0x5A, 0x04, 0x4c, 0x00, 0x00, 0x03, + 0x00, 0x0A, 0x00, 0x0A, /* IOM1 = 0x0a000a00 */ + 0x5A, 0x04, 0x48, 0x00, 0x00, 0x03, + 0xA3, 0x00, 0x00, 0x00, /* Aux = 0xa3 */ + 0x5A, 0x0D, 0x0c, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, + 0x5A, 0x04, 0x18, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, +#endif +}; + +#endif diff --git a/sound/soc/codecs/dbmdx/dbmdx-i2c.c b/sound/soc/codecs/dbmdx/dbmdx-i2c.c new file mode 100755 index 000000000000..04d34ee12b2e --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-i2c.c @@ -0,0 +1,921 @@ +/* + * DSPG DBMDX I2C interface driver + * + * Copyright (C) 2014 DSP Group + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +/* #define DEBUG */ +#include <linux/kernel.h> +#include <linux/delay.h> +#include <linux/slab.h> +#include <linux/i2c.h> +#if IS_ENABLED(CONFIG_OF) +#include <linux/of.h> +#include <linux/of_gpio.h> +#endif +#include <linux/module.h> +#include <linux/mutex.h> +#include <linux/clk.h> +#include <linux/firmware.h> + +#include "dbmdx-interface.h" +#include "dbmdx-va-regmap.h" +#include "dbmdx-vqe-regmap.h" +#include "dbmdx-i2c.h" + + +#define DEFAULT_I2C_WRITE_CHUNK_SIZE 32 +#define MAX_I2C_WRITE_CHUNK_SIZE 128 +#define DEFAULT_I2C_READ_CHUNK_SIZE 8 +#define MAX_I2C_READ_CHUNK_SIZE 128 + +static DECLARE_WAIT_QUEUE_HEAD(dbmdx_wq); + +ssize_t send_i2c_cmd_vqe(struct dbmdx_private *p, + u32 command, u16 *response) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + u8 send[4]; + u8 recv[4]; + ssize_t ret = 0; + int retries = 10; + + send[0] = (command >> 24) & 0xff; + send[1] = (command >> 16) & 0xff; + send[2] = (command >> 8) & 0xff; + send[3] = command & 0xff; + + ret = i2c_master_send(i2c_p->client, send, 4); + if (ret < 0) { + dev_err(i2c_p->dev, + "%s: cmd:0x%08X - i2c_master_send failed ret:%zd\n", + __func__, command, ret); + return ret; + } + + usleep_range(DBMDX_USLEEP_I2C_VQE_CMD_AFTER_SEND, + DBMDX_USLEEP_I2C_VQE_CMD_AFTER_SEND + 1000); + + if ((command == (DBMDX_VQE_SET_POWER_STATE_CMD | + DBMDX_VQE_SET_POWER_STATE_HIBERNATE)) || + (command == DBMDX_VQE_SET_SWITCH_TO_BOOT_CMD)) + return 0; + + /* we need additional sleep till system is ready */ + if (command == (DBMDX_VQE_SET_SYSTEM_CONFIG_CMD | + DBMDX_VQE_SET_SYSTEM_CONFIG_PRIMARY_CFG)) + msleep(DBMDX_MSLEEP_I2C_VQE_SYS_CFG_CMD); + + /* read response */ + do { + ret = i2c_master_recv(i2c_p->client, recv, 4); + if (ret < 0) { + /* Wait before polling again */ + usleep_range(10000, 11000); + + continue; + } + /* + * Check that the first two bytes of the response match + * (the ack is in those bytes) + */ + if ((send[0] == recv[0]) && (send[1] == recv[1])) { + if (response) + *response = (recv[2] << 8) | recv[3]; + ret = 0; + break; + } + + dev_warn(i2c_p->dev, + "%s: incorrect ack (got 0x%.2x%.2x)\n", + __func__, recv[0], recv[1]); + ret = -EINVAL; + + /* Wait before polling again */ + usleep_range(10000, 11000); + } while (--retries); + + if (!retries) + dev_err(i2c_p->dev, + "%s: cmd:0x%8x - wrong ack, giving up\n", + __func__, command); + + return ret; +} + +ssize_t send_i2c_cmd_va(struct dbmdx_private *p, u32 command, + u16 *response) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + u8 send[3]; + u8 recv[2]; + int ret; + + send[0] = (command >> 16) & 0xff; + send[1] = (command >> 8) & 0xff; + send[2] = (command) & 0xff; + + dev_dbg(i2c_p->dev, "%s: Send 0x%02x\n", __func__, command); + + if (response) { + ret = i2c_master_send(i2c_p->client, send, 1); + if (ret < 0) { + dev_err(i2c_p->dev, + "%s: i2c_master_send failed ret = %d\n", + __func__, ret); + return ret; + } + + usleep_range(DBMDX_USLEEP_I2C_VA_CMD_AFTER_SEND, + DBMDX_USLEEP_I2C_VA_CMD_AFTER_SEND + 1000); + + if (p->va_debug_mode) + msleep(DBMDX_MSLEEP_DBG_MODE_CMD_RX); + + ret = i2c_master_recv(i2c_p->client, recv, 2); + if (ret < 0) { + dev_err(i2c_p->dev, "%s: i2c_master_recv failed\n", + __func__); + return ret; + } + *response = (recv[0] << 8) | recv[1]; + + dev_dbg(i2c_p->dev, "%s: Received 0x%02x\n", __func__, + *response); + + ret = 0; + } else { + ret = i2c_master_send(i2c_p->client, send, 3); + if (ret < 0) { + dev_err(i2c_p->dev, + "%s: i2c_master_send failed ret = %d\n", + __func__, ret); + return ret; + } + + ret = 0; + } + + usleep_range(DBMDX_USLEEP_I2C_VA_CMD_AFTER_SEND_2, + DBMDX_USLEEP_I2C_VA_CMD_AFTER_SEND_2 + 1000); + + if (p->va_debug_mode) + msleep(DBMDX_MSLEEP_DBG_MODE_CMD_TX); + + return ret; +} + +ssize_t read_i2c_data(struct dbmdx_private *p, void *buf, size_t len) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + size_t count = i2c_p->pdata->read_chunk_size; + ssize_t i; + int ret; + u8 *d = (u8 *)buf; + /* if stuck for more than 10s, something is wrong */ + unsigned long timeout = jiffies + msecs_to_jiffies(10000); + + /* We are going to read everything in on chunk */ + if (len < count) { + ret = i2c_master_recv(i2c_p->client, buf, len); + + if (ret < 0) { + dev_err(i2c_p->dev, "%s: i2c_master_recv failed\n", + __func__); + i = -EIO; + goto out; + } + + return len; + } + + for (i = 0; i < len; i += count) { + if ((i + count) > len) + count = len - i; + + ret = i2c_master_recv(i2c_p->client, + i2c_p->pdata->read_buf, count); + if (ret < 0) { + dev_err(i2c_p->dev, "%s: i2c_master_recv failed\n", + __func__); + i = -EIO; + goto out; + } + memcpy(d + i, i2c_p->pdata->read_buf, count); + + if (!time_before(jiffies, timeout)) { + dev_err(i2c_p->dev, + "%s: read data timed out after %zd bytes\n", + __func__, i); + i = -ETIMEDOUT; + goto out; + } + } + + return len; +out: + return i; +} + +ssize_t write_i2c_data(struct dbmdx_private *p, const void *buf, + size_t len) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + ssize_t ret = 0; + const u8 *cmds = (const u8 *)buf; + size_t to_copy = len; + size_t max_size = (size_t)(i2c_p->pdata->write_chunk_size); + + while (to_copy > 0) { + ret = i2c_master_send(i2c_p->client, cmds, + min_t(size_t, to_copy, max_size)); + if (ret < 0) { + dev_err(i2c_p->dev, + "%s: i2c_master_send failed ret=%zd\n", + __func__, ret); + break; + } + to_copy -= ret; + cmds += ret; + } + + return len - to_copy; +} + +int send_i2c_cmd_boot(struct dbmdx_private *p, u32 command) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + u8 send[3]; + int ret = 0; + + dev_info(i2c_p->dev, "%s: command = %x\n", __func__, command); + + send[0] = (command >> 16) & 0xff; + send[1] = (command >> 8) & 0xff; + + ret = i2c_master_send(i2c_p->client, send, 2); + if (ret < 0) { + dev_err(i2c_p->dev, "%s: Failed ret = %d\n", + __func__, ret); + return ret; + } + + /* A host command received will blocked until the current audio frame + * processing is finished, which can take up to 10 ms + */ + usleep_range(DBMDX_USLEEP_I2C_AFTER_BOOT_CMD, + DBMDX_USLEEP_I2C_AFTER_BOOT_CMD + 1000); + + return 0; +} + +int i2c_verify_boot_checksum(struct dbmdx_private *p, + const void *checksum, size_t chksum_len) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + int ret; + u8 rx_checksum[10]; + + if (!checksum) + return 0; + + if (chksum_len > 8) { + dev_err(i2c_p->dev, "%s: illegal checksum length\n", __func__); + return -EINVAL; + } + + ret = send_i2c_cmd_boot(p, DBMDX_READ_CHECKSUM); + + if (ret < 0) { + dev_err(i2c_p->dev, "%s: could not read checksum\n", __func__); + return -EIO; + } + + ret = i2c_master_recv(i2c_p->client, (void *)rx_checksum, + chksum_len + 2); + + if (ret < 0) { + dev_err(i2c_p->dev, "%s: could not read checksum data\n", + __func__); + return -EIO; + } + + ret = p->verify_checksum(p, checksum, &rx_checksum[2], chksum_len); + if (ret) { + dev_err(i2c_p->dev, "%s: checksum mismatch\n", __func__); + return -EILSEQ; + } + + return 0; +} + +int i2c_verify_chip_id(struct dbmdx_private *p) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + int ret; + u8 idr_read_cmd[] = {0x5A, 0x07, 0x68, 0x00, 0x00, 0x03}; + u8 idr_read_result[7] = {0}; + u8 chip_rev_id_low_a = 0; + u8 chip_rev_id_low_b = 0; + u8 chip_rev_id_high = 0; + + u8 recv_chip_rev_id_high = 0; + u8 recv_chip_rev_id_low = 0; + + if (p->cur_firmware_id == DBMDX_FIRMWARE_ID_DBMD2) { + idr_read_cmd[2] = 0x68; + chip_rev_id_high = 0x0d; + chip_rev_id_low_a = 0xb0; + chip_rev_id_low_b = 0xb1; + } else if (p->cur_firmware_id == DBMDX_FIRMWARE_ID_DBMD4) { + idr_read_cmd[2] = 0x74; + chip_rev_id_high = 0xdb; + chip_rev_id_low_a = 0x40; + chip_rev_id_low_b = 0x40; + } else if (p->cur_firmware_id == DBMDX_FIRMWARE_ID_DBMD6) { + idr_read_cmd[2] = 0x74; + chip_rev_id_high = 0xdb; + chip_rev_id_low_a = 0x60; + chip_rev_id_low_b = 0x60; + } else { + idr_read_cmd[2] = 0x74; + chip_rev_id_high = 0xdb; + chip_rev_id_low_a = 0x80; + chip_rev_id_low_b = 0x80; + } + + ret = write_i2c_data(p, idr_read_cmd, 6); + if (ret != sizeof(idr_read_cmd)) { + dev_err(i2c_p->dev, "%s: idr_read_cmd ret = %d\n", + __func__, ret); + return ret; + } + + usleep_range(DBMDX_USLEEP_I2C_AFTER_BOOT_CMD, + DBMDX_USLEEP_I2C_AFTER_BOOT_CMD + 1000); + + ret = i2c_master_recv(i2c_p->client, (void *)idr_read_result, 6); + + if (ret < 0) { + dev_err(i2c_p->dev, "%s: could not idr register data\n", + __func__); + return -EIO; + } + /* Verify answer */ + if ((idr_read_result[0] != idr_read_cmd[0]) || + (idr_read_result[1] != idr_read_cmd[1]) || + (idr_read_result[4] != 0x00) || + (idr_read_result[5] != 0x00)) { + dev_err(i2c_p->dev, "%s: Wrong IDR resp: %x:%x:%x:%x:%x:%x\n", + __func__, + idr_read_result[0], + idr_read_result[1], + idr_read_result[2], + idr_read_result[3], + idr_read_result[4], + idr_read_result[5]); + return -EIO; + } + recv_chip_rev_id_high = idr_read_result[3]; + recv_chip_rev_id_low = idr_read_result[2]; + + if ((recv_chip_rev_id_high != chip_rev_id_high) || + ((recv_chip_rev_id_low != chip_rev_id_low_a) && + (recv_chip_rev_id_low != chip_rev_id_low_b))) { + + dev_err(i2c_p->dev, + "%s: Wrong chip ID: Received 0x%2x%2x Expected: 0x%2x%2x | 0x%2x%2x\n", + __func__, + recv_chip_rev_id_high, + recv_chip_rev_id_low, + chip_rev_id_high, + chip_rev_id_low_a, + chip_rev_id_high, + chip_rev_id_low_b); + return -EILSEQ; + } + + dev_info(i2c_p->dev, + "%s: Chip ID was successfully verified: 0x%2x%2x\n", + __func__, + recv_chip_rev_id_high, + recv_chip_rev_id_low); + return 0; +} + +static int i2c_can_boot(struct dbmdx_private *p) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s\n", __func__); + return 0; +} + +static int i2c_prepare_boot(struct dbmdx_private *p) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s\n", __func__); + return 0; +} + + +static int i2c_finish_boot(struct dbmdx_private *p) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + /* XXX */ + msleep(DBMDX_MSLEEP_I2C_FINISH_BOOT); + + /* change to normal operation I2C address */ + i2c_p->client->addr = (unsigned short)(i2c_p->pdata->operation_addr); + + i2c_set_clientdata(i2c_p->client, &p->chip); + + dev_dbg(i2c_p->dev, "%s\n", __func__); + return 0; +} + +static int i2c_dump_state(struct chip_interface *chip, char *buf) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)chip->pdata; + int off = 0; + + dev_dbg(i2c_p->dev, "%s\n", __func__); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\t===I2C Interface Dump====\n"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tI2C Write Chunk Size:\t\t%d\n", + i2c_p->pdata->write_chunk_size); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tI2C Read Chunk Size:\t\t%d\n", + i2c_p->pdata->read_chunk_size); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tInterface resumed:\t%s\n", + i2c_p->interface_enabled ? "ON" : "OFF"); + + return off; +} + +static int i2c_set_va_firmware_ready(struct dbmdx_private *p) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s\n", __func__); + return 0; +} + + +static int i2c_set_vqe_firmware_ready(struct dbmdx_private *p) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s\n", __func__); + return 0; +} + +static void i2c_transport_enable(struct dbmdx_private *p, bool enable) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + int ret = 0; + + dev_dbg(i2c_p->dev, "%s (%s)\n", __func__, enable ? "ON" : "OFF"); + + if (enable) { + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + if (i2c_p->ps_nosuspend_wl) + __pm_stay_awake(i2c_p->ps_nosuspend_wl); +#endif + + ret = wait_event_interruptible(dbmdx_wq, + i2c_p->interface_enabled); + + if (ret) + dev_dbg(i2c_p->dev, + "%s, waiting for interface was interrupted", + __func__); + else + dev_dbg(i2c_p->dev, "%s, interface is active\n", + __func__); + } + + + if (enable) { + p->wakeup_set(p); + msleep(DBMDX_MSLEEP_I2C_WAKEUP); + } else { +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + if (i2c_p->ps_nosuspend_wl) + __pm_relax(i2c_p->ps_nosuspend_wl); +#endif + p->wakeup_release(p); + } +} + +static void i2c_resume(struct dbmdx_private *p) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s\n", __func__); + + i2c_interface_resume(i2c_p); +} + + +void i2c_interface_resume(struct dbmdx_i2c_private *i2c_p) +{ + dev_dbg(i2c_p->dev, "%s\n", __func__); + + i2c_p->interface_enabled = 1; + wake_up_interruptible(&dbmdx_wq); +} + +static void i2c_suspend(struct dbmdx_private *p) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s\n", __func__); + + i2c_interface_suspend(i2c_p); +} + + +void i2c_interface_suspend(struct dbmdx_i2c_private *i2c_p) +{ + dev_dbg(i2c_p->dev, "%s\n", __func__); + + i2c_p->interface_enabled = 0; +} + + +static int i2c_prepare_buffering(struct dbmdx_private *p) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s\n", __func__); + return 0; +} + +int i2c_read_audio_data(struct dbmdx_private *p, + void *buf, + size_t samples, + bool to_read_metadata, + size_t *available_samples, + size_t *data_offset) +{ + size_t bytes_to_read; + int ret; + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s\n", __func__); + + + + ret = send_i2c_cmd_va(p, DBMDX_VA_READ_AUDIO_BUFFER | samples, NULL); + + if (ret) { + dev_err(p->dev, "%s: failed to request %zu audio samples\n", + __func__, samples); + ret = -1; + goto out; + } + + *available_samples = 0; + + if (to_read_metadata) + *data_offset = 8; + else + *data_offset = 0; + + bytes_to_read = samples * 8 * p->bytes_per_sample + *data_offset; + + ret = read_i2c_data(p, buf, bytes_to_read); + + if (ret != bytes_to_read) { + dev_err(p->dev, + "%s: read audio failed, %zu bytes to read, res(%d)\n", + __func__, + bytes_to_read, + ret); + ret = -1; + goto out; + } + + /* Word #4 contains current number of available samples */ + if (to_read_metadata) + *available_samples = (size_t)(((u16 *)buf)[3]); + else + *available_samples = samples; + + ret = samples; +out: + return ret; +} + +static int i2c_finish_buffering(struct dbmdx_private *p) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s\n", __func__); + + return 0; +} + +static int i2c_prepare_amodel_loading(struct dbmdx_private *p) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s\n", __func__); + return 0; +} + +static int i2c_finish_amodel_loading(struct dbmdx_private *p) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s\n", __func__); + + return 0; +} + +static u32 i2c_get_read_chunk_size(struct dbmdx_private *p) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s I2C read chunk is %u\n", + __func__, i2c_p->pdata->read_chunk_size); + + return i2c_p->pdata->read_chunk_size; +} + +static u32 i2c_get_write_chunk_size(struct dbmdx_private *p) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + dev_dbg(i2c_p->dev, "%s I2C write chunk is %u\n", + __func__, i2c_p->pdata->write_chunk_size); + + return i2c_p->pdata->write_chunk_size; +} + +static int i2c_set_read_chunk_size(struct dbmdx_private *p, u32 size) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + if (size > MAX_I2C_READ_CHUNK_SIZE) { + dev_err(i2c_p->dev, + "%s Error setting I2C read chunk. Max chunk size: %u\n", + __func__, MAX_I2C_READ_CHUNK_SIZE); + return -EINVAL; + } else if ((size % 2) != 0) { + dev_err(i2c_p->dev, + "%s Error setting I2C read chunk. Uneven size\n", + __func__); + return -EINVAL; + } else if (size == 0) + i2c_p->pdata->read_chunk_size = DEFAULT_I2C_READ_CHUNK_SIZE; + else + i2c_p->pdata->read_chunk_size = size; + + dev_dbg(i2c_p->dev, "%s I2C read chunk was set to %u\n", + __func__, i2c_p->pdata->read_chunk_size); + + return 0; +} + +static int i2c_set_write_chunk_size(struct dbmdx_private *p, u32 size) +{ + struct dbmdx_i2c_private *i2c_p = + (struct dbmdx_i2c_private *)p->chip->pdata; + + if (size > MAX_I2C_WRITE_CHUNK_SIZE) { + dev_err(i2c_p->dev, + "%s Error setting I2C write chunk. Max chunk size: %u\n", + __func__, MAX_I2C_WRITE_CHUNK_SIZE); + return -EINVAL; + } else if ((size % 2) != 0) { + dev_err(i2c_p->dev, + "%s Error setting I2C write chunk. Uneven size\n", + __func__); + return -EINVAL; + } else if (size == 0) + i2c_p->pdata->write_chunk_size = DEFAULT_I2C_WRITE_CHUNK_SIZE; + else + i2c_p->pdata->write_chunk_size = size; + + dev_dbg(i2c_p->dev, "%s I2C write chunk was set to %u\n", + __func__, i2c_p->pdata->write_chunk_size); + + return 0; +} +int i2c_common_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ +#if IS_ENABLED(CONFIG_OF) + struct device_node *np; +#endif + int ret; + struct dbmdx_i2c_private *p; + struct dbmdx_i2c_data *pdata; + + dev_dbg(&client->dev, "%s\n", __func__); + + p = kzalloc(sizeof(*p), GFP_KERNEL); + if (p == NULL) + return -ENOMEM; + + p->client = client; + p->dev = &client->dev; + + p->chip.pdata = p; +#if IS_ENABLED(CONFIG_OF) + np = p->dev->of_node; + if (!np) { + dev_err(p->dev, "%s: no devicetree entry\n", __func__); + ret = -EINVAL; + goto out_err_kfree; + } + + pdata = kzalloc(sizeof(struct dbmdx_i2c_data), GFP_KERNEL); + if (!pdata) { + ret = -ENOMEM; + goto out_err_kfree; + } +#else + pdata = dev_get_platdata(&client->dev); + if (pdata == NULL) { + dev_err(p->dev, "%s: dbmdx, no platform data found\n", + __func__); + return -ENODEV; + } +#endif + + /* remember boot address */ + pdata->boot_addr = (u32)(p->client->addr); + +#if IS_ENABLED(CONFIG_OF) + ret = of_property_read_u32(np, "operational-addr", + &(pdata->operation_addr)); + if (ret != 0) { + /* + * operational address not set, assume it is the same as the + * boot address + */ + pdata->operation_addr = pdata->boot_addr; + dev_info(p->dev, "%s: setting operational addr to boot address\n", + __func__); + } +#endif + dev_info(p->dev, "%s: setting operational addr to 0x%2.2x\n", + __func__, pdata->operation_addr); + +#if IS_ENABLED(CONFIG_OF) + ret = of_property_read_u32(np, "read-chunk-size", + &pdata->read_chunk_size); + if (ret != 0) { + /* + * read-chunk-size not set, set it to default + */ + pdata->read_chunk_size = DEFAULT_I2C_READ_CHUNK_SIZE; + dev_info(p->dev, + "%s: Setting i2c read chunk to default val: %u bytes\n", + __func__, pdata->read_chunk_size); + } +#endif + if (pdata->read_chunk_size > MAX_I2C_READ_CHUNK_SIZE) + pdata->read_chunk_size = MAX_I2C_READ_CHUNK_SIZE; + if (pdata->read_chunk_size == 0) + pdata->read_chunk_size = DEFAULT_I2C_READ_CHUNK_SIZE; + + dev_info(p->dev, "%s: Setting i2c read chunk to %u bytes\n", + __func__, pdata->read_chunk_size); + +#if IS_ENABLED(CONFIG_OF) + ret = of_property_read_u32(np, "write-chunk-size", + &pdata->write_chunk_size); + if (ret != 0) { + /* + * write-chunk-size not set, set it to default + */ + pdata->write_chunk_size = DEFAULT_I2C_WRITE_CHUNK_SIZE; + dev_info(p->dev, + "%s: Setting i2c write chunk to default val: %u bytes\n", + __func__, pdata->write_chunk_size); + } +#endif + if (pdata->write_chunk_size > MAX_I2C_WRITE_CHUNK_SIZE) + pdata->write_chunk_size = MAX_I2C_WRITE_CHUNK_SIZE; + if (pdata->write_chunk_size == 0) + pdata->write_chunk_size = DEFAULT_I2C_WRITE_CHUNK_SIZE; + + dev_info(p->dev, "%s: Setting i2c write chunk to %u bytes\n", + __func__, pdata->write_chunk_size); + + p->pdata = pdata; + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + p->ps_nosuspend_wl = + wakeup_source_create("dbmdx_nosuspend_wakelock_i2c"); + + if (p->ps_nosuspend_wl) + wakeup_source_add(p->ps_nosuspend_wl); + else + dev_err(p->dev, + "%s: Error creating WS: dbmdx_nosuspend_wakelock_i2c\n", + __func__); +#endif + + /* fill in chip interface functions */ + p->chip.can_boot = i2c_can_boot; + p->chip.prepare_boot = i2c_prepare_boot; + p->chip.finish_boot = i2c_finish_boot; + p->chip.dump = i2c_dump_state; + p->chip.set_va_firmware_ready = i2c_set_va_firmware_ready; + p->chip.set_vqe_firmware_ready = i2c_set_vqe_firmware_ready; + p->chip.transport_enable = i2c_transport_enable; + p->chip.read = read_i2c_data; + p->chip.write = write_i2c_data; + p->chip.send_cmd_va = send_i2c_cmd_va; + p->chip.send_cmd_vqe = send_i2c_cmd_vqe; + p->chip.send_cmd_boot = send_i2c_cmd_boot; + p->chip.verify_boot_checksum = i2c_verify_boot_checksum; + p->chip.prepare_buffering = i2c_prepare_buffering; + p->chip.read_audio_data = i2c_read_audio_data; + p->chip.finish_buffering = i2c_finish_buffering; + p->chip.prepare_amodel_loading = i2c_prepare_amodel_loading; + p->chip.finish_amodel_loading = i2c_finish_amodel_loading; + p->chip.get_write_chunk_size = i2c_get_write_chunk_size; + p->chip.get_read_chunk_size = i2c_get_read_chunk_size; + p->chip.set_write_chunk_size = i2c_set_write_chunk_size; + p->chip.set_read_chunk_size = i2c_set_read_chunk_size; + p->chip.resume = i2c_resume; + p->chip.suspend = i2c_suspend; + + p->interface_enabled = 1; + + i2c_set_clientdata(client, &p->chip); + + dev_info(&client->dev, "%s: successfully probed\n", __func__); + ret = 0; + goto out; +#if IS_ENABLED(CONFIG_OF) +out_err_kfree: +#endif + kfree(p); +out: + return ret; +} + +int i2c_common_remove(struct i2c_client *client) +{ + struct chip_interface *ci = i2c_get_clientdata(client); + struct dbmdx_i2c_private *p = (struct dbmdx_i2c_private *)ci->pdata; + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + if (p->ps_nosuspend_wl) { + wakeup_source_remove(p->ps_nosuspend_wl); + wakeup_source_destroy(p->ps_nosuspend_wl); + } +#endif + + kfree(p); + + i2c_set_clientdata(client, NULL); + + return 0; +} diff --git a/sound/soc/codecs/dbmdx/dbmdx-i2c.h b/sound/soc/codecs/dbmdx/dbmdx-i2c.h new file mode 100755 index 000000000000..bc8d669e43cd --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-i2c.h @@ -0,0 +1,62 @@ +/* + * dbmdx-i2c.h -- DBMDX I2C interface common functions + * + * Copyright (C) 2014 DSP Group + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _DBMDX_I2C_COMMON_H +#define _DBMDX_I2C_COMMON_H + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) +#include <linux/pm_wakeup.h> +#endif + +#define RETRY_COUNT 5 + +struct dbmdx_i2c_private; + +struct dbmdx_i2c_data { + u32 boot_addr; + u32 operation_addr; + u32 read_chunk_size; + u32 write_chunk_size; + u8 read_buf[MAX_REQ_SIZE]; +}; + + +struct dbmdx_i2c_private { + struct device *dev; + struct dbmdx_i2c_data *pdata; + struct i2c_client *client; + struct chip_interface chip; +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + struct wakeup_source *ps_nosuspend_wl; +#endif + u32 interface_enabled; +}; + +ssize_t write_i2c_data(struct dbmdx_private *p, const void *buf, + size_t len); +ssize_t read_i2c_data(struct dbmdx_private *p, void *buf, size_t len); +ssize_t send_i2c_cmd_va(struct dbmdx_private *p, u32 command, + u16 *response); +ssize_t send_i2c_cmd_vqe(struct dbmdx_private *p, + u32 command, u16 *response); + +int send_i2c_cmd_boot(struct dbmdx_private *p, u32 command); +int i2c_verify_boot_checksum(struct dbmdx_private *p, + const void *checksum, size_t chksum_len); +int i2c_verify_chip_id(struct dbmdx_private *p); +int i2c_common_probe(struct i2c_client *client, + const struct i2c_device_id *id); + +int i2c_common_remove(struct i2c_client *client); +void i2c_interface_resume(struct dbmdx_i2c_private *i2c_p); +void i2c_interface_suspend(struct dbmdx_i2c_private *i2c_p); + + +#endif diff --git a/sound/soc/codecs/dbmdx/dbmdx-i2s.c b/sound/soc/codecs/dbmdx/dbmdx-i2s.c new file mode 100755 index 000000000000..560d620f0e66 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-i2s.c @@ -0,0 +1,239 @@ +/* + * dbmdx-i2s.c -- DBMDX I2S interface + * + * Copyright (C) 2014 DSP Group + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <linux/module.h> +#include <linux/err.h> +#include <sound/core.h> +#include <sound/soc.h> +#include <sound/pcm_params.h> + +static int dbmdx_i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id, + unsigned int freq, int dir) +{ + struct snd_soc_codec *codec = dai->codec; + + dev_dbg(codec->dev, "%s\n", __func__); + + return 0; +} + +static int dbmdx_i2s_set_pll(struct snd_soc_dai *dai, int pll_id, + int source, unsigned int freq_in, + unsigned int freq_out) +{ + struct snd_soc_codec *codec = dai->codec; + + dev_dbg(codec->dev, "%s\n", __func__); + + return 0; +} + +static int dbmdx_i2s_set_clkdiv(struct snd_soc_dai *dai, int div_id, + int div) +{ + struct snd_soc_codec *codec = dai->codec; + + dev_dbg(codec->dev, "%s\n", __func__); + + return 0; +} + +static int dbmdx_i2s_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) +{ + struct snd_soc_codec *codec = dai->codec; + + dev_dbg(codec->dev, "%s\n", __func__); + + return 0; +} + +static int dbmdx_i2s_set_tdm_slot(struct snd_soc_dai *dai, + unsigned int tx_mask, unsigned int rx_mask, + int slots, int slot_width) +{ + struct snd_soc_codec *codec = dai->codec; + + dev_dbg(codec->dev, "%s\n", __func__); + + return 0; +} + +static int dbmdx_i2s_set_channel_map(struct snd_soc_dai *dai, + unsigned int tx_num, unsigned int *tx_slot, + unsigned int rx_num, unsigned int *rx_slot) +{ + struct snd_soc_codec *codec = dai->codec; + + dev_dbg(codec->dev, "%s\n", __func__); + + return 0; +} + +static int dbmdx_i2s_set_tristate(struct snd_soc_dai *dai, int tristate) +{ + struct snd_soc_codec *codec = dai->codec; + + dev_dbg(codec->dev, "%s: dai:%d tristate:%d\n", __func__, + dai->id, tristate); + + /* TODO might check if dai->id is valid */ + return 0; +} + +static int dbmdx_i2s_port_mute(struct snd_soc_dai *dai, int mute) +{ + struct snd_soc_codec *codec = dai->codec; + + dev_dbg(codec->dev, "%s: dai:%d mute:%d\n", __func__, + dai->id, mute); + + /* TODO might check if dai->id is valid */ + return 0; +} + + +static int dbmdx_i2s_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_codec *codec = dai->codec; + + dev_dbg(codec->dev, "%s: dai:%d\n", __func__, dai->id); + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + dev_dbg(codec->dev, "%s: playback stream\n", __func__); + else + dev_dbg(codec->dev, "%s: capture stream\n", __func__); + + return 0; +} + +static void dbmdx_i2s_shutdown(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_codec *codec = dai->codec; + + dev_dbg(codec->dev, "%s: dai:%d\n", __func__, dai->id); + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + dev_dbg(codec->dev, "%s: playback stream\n", __func__); + else + dev_dbg(codec->dev, "%s: capture stream\n", __func__); +} + +static int dbmdx_i2s_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct snd_soc_codec *codec = dai->codec; + + dev_dbg(codec->dev, "%s: dai:%d\n", __func__, dai->id); + /* TODO might check if dai->id is valid */ + + dev_dbg(codec->dev, "%s: params_channels = %d\n", __func__, + params_channels(params)); + + switch (params_channels(params)) { + case 2: + break; + default: + return -EINVAL; + } + + dev_dbg(codec->dev, "%s: params_rate = %d\n", __func__, + params_rate(params)); + switch (params_rate(params)) { + case 8000: + case 16000: + case 48000: + break; + default: + return -EINVAL; + } + + switch (params_format(params)) { + case SNDRV_PCM_FORMAT_S16_LE: + case SNDRV_PCM_FORMAT_S32_LE: + break; + default: + return -EINVAL; + } + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + dev_dbg(codec->dev, "%s: playback stream\n", __func__); + else + dev_dbg(codec->dev, "%s: capture stream\n", __func__); + + return 0; +} + +static int dbmdx_i2s_hw_free(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_codec *codec = dai->codec; + + dev_dbg(codec->dev, "%s: dai:%d\n", __func__, dai->id); + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + dev_dbg(codec->dev, "%s: playback stream\n", __func__); + else + dev_dbg(codec->dev, "%s: capture stream\n", __func__); + + return 0; +} + +static int dbmdx_i2s_prepare(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_codec *codec = dai->codec; + + dev_dbg(codec->dev, "%s: dai:%d\n", __func__, dai->id); + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + dev_dbg(codec->dev, "%s: playback stream\n", __func__); + else + dev_dbg(codec->dev, "%s: capture stream\n", __func__); + + return 0; +} + +static int dbmdx_i2s_trigger(struct snd_pcm_substream *substream, + int cmd, + struct snd_soc_dai *dai) +{ + struct snd_soc_codec *codec = dai->codec; + + dev_dbg(codec->dev, "%s: dai:%d cmd=%d\n", __func__, + dai->id, cmd); + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + dev_dbg(codec->dev, "%s: playback stream\n", __func__); + else + dev_dbg(codec->dev, "%s: capture stream\n", __func__); + + return 0; +} + +struct snd_soc_dai_ops dbmdx_i2s_dai_ops = { + .set_sysclk = dbmdx_i2s_set_sysclk, + .set_pll = dbmdx_i2s_set_pll, + .set_clkdiv = dbmdx_i2s_set_clkdiv, + .set_fmt = dbmdx_i2s_set_dai_fmt, + .set_tdm_slot = dbmdx_i2s_set_tdm_slot, + .set_channel_map = dbmdx_i2s_set_channel_map, + .set_tristate = dbmdx_i2s_set_tristate, + .digital_mute = dbmdx_i2s_port_mute, + .startup = dbmdx_i2s_startup, + .shutdown = dbmdx_i2s_shutdown, + .hw_params = dbmdx_i2s_hw_params, + .hw_free = dbmdx_i2s_hw_free, + .prepare = dbmdx_i2s_prepare, + .trigger = dbmdx_i2s_trigger, +}; +EXPORT_SYMBOL(dbmdx_i2s_dai_ops); diff --git a/sound/soc/codecs/dbmdx/dbmdx-i2s.h b/sound/soc/codecs/dbmdx/dbmdx-i2s.h new file mode 100755 index 000000000000..a1b67ad00050 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-i2s.h @@ -0,0 +1,33 @@ +/* + * dbmdx-i2s.c -- DBMDX I2S interface + * + * Copyright (C) 2014 DSP Group + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _DBMDX_I2S_H +#define _DBMDX_I2S_H + +#include <sound/soc.h> + +#define DBMDX_I2S_RATES \ + (SNDRV_PCM_RATE_8000 | \ + SNDRV_PCM_RATE_16000 | \ + SNDRV_PCM_RATE_48000) + +#define DBMDX_I2S_FORMATS \ + (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE) + +extern struct snd_soc_dai_ops dbmdx_i2s_dai_ops; + +enum dbmdx_i2s_ports { + DBMDX_I2S0 = 1, + DBMDX_I2S1, + DBMDX_I2S2, + DBMDX_I2S3, +}; + +#endif diff --git a/sound/soc/codecs/dbmdx/dbmdx-interface.h b/sound/soc/codecs/dbmdx/dbmdx-interface.h new file mode 100755 index 000000000000..50c2b21b9567 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-interface.h @@ -0,0 +1,694 @@ +/* + * dbmdx-interface.h -- DBMDX interface definitions + * + * Copyright (C) 2014 DSP Group + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _DBMDX_INTERFACE_H +#define _DBMDX_INTERFACE_H + +#include <linux/device.h> +#include <linux/cdev.h> +#include <linux/firmware.h> +#include <linux/module.h> +#include <linux/mutex.h> +#include <linux/workqueue.h> +#include <linux/clk.h> +#include <linux/kfifo.h> +#include <linux/rtc.h> +#include <linux/alarmtimer.h> +#include "dbmdx-customer-def.h" + +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX_COMPAT) +#include "dbmdx-compat.h" +#else +#include <linux/atomic.h> +#endif + +#if IS_ENABLED(CONFIG_DBMDX_NO_DTS_SUPPORT) +#if IS_ENABLED(CONFIG_OF) +#undef CONFIG_OF +#endif /* CONFIG_OF */ +#endif + +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX_VA_NS_SUPPORT) +#if (!IS_ENABLED(DBMDX_VA_NS_SUPPORT)) +#define DBMDX_VA_NS_SUPPORT 1 +#endif +#endif + +#define DBMDX_KEEP_ALIVE_TIMER 1 + +#include <linux/dbmdx.h> +#include <sound/dbmdx-export.h> + +#ifndef DBMD2_VA_FIRMWARE_NAME +#define DBMD2_VA_FIRMWARE_NAME "dbmd2_va_fw.bin" +#endif + +#ifndef DBMD2_VA_PREBOOT_FIRMWARE_NAME +#define DBMD2_VA_PREBOOT_FIRMWARE_NAME "dbmd2_va_preboot_fw.bin" +#endif + +#ifndef DBMD4_VA_ASRP_PARAMS_FIRMWARE_NAME +#define DBMD4_VA_ASRP_PARAMS_FIRMWARE_NAME "dbmd4_va_asrp_fw.bin" +#endif + +#ifndef DBMD2_VQE_FIRMWARE_NAME +#define DBMD2_VQE_FIRMWARE_NAME "dbmd2_vqe_fw.bin" +#endif + +#ifndef DBMD2_VQE_OVERLAY_FIRMWARE_NAME +#define DBMD2_VQE_OVERLAY_FIRMWARE_NAME "dbmd2_vqe_overlay_fw.bin" +#endif + +#ifndef DBMD4_VA_FIRMWARE_NAME +#define DBMD4_VA_FIRMWARE_NAME "dbmd4_va_fw.bin" +#endif + +#ifndef DBMD4_VA_PREBOOT_FIRMWARE_NAME +#define DBMD4_VA_PREBOOT_FIRMWARE_NAME "dbmd4_va_preboot_fw.bin" +#endif + +#ifndef DBMDX_VT_GRAM_NAME +#define DBMDX_VT_GRAM_NAME "voice_grammar.bin" +#endif + +#ifndef DBMDX_VT_NET_NAME +#define DBMDX_VT_NET_NAME "voice_net.bin" +#endif + +#ifndef DBMDX_VT_AMODEL_NAME +#define DBMDX_VT_AMODEL_NAME "voice_amodel.bin" +#endif + +#ifndef DBMDX_VC_GRAM_NAME +#define DBMDX_VC_GRAM_NAME "vc_grammar.bin" +#endif + +#ifndef DBMDX_VC_NET_NAME +#define DBMDX_VC_NET_NAME "vc_net.bin" +#endif + +#ifndef DBMDX_VC_AMODEL_NAME +#define DBMDX_VC_AMODEL_NAME "vc_amodel.bin" +#endif + +#ifndef DBMDX_VC_OKG_NAME +#define DBMDX_VC_OKG_NAME "okg_amodel.bin" +#endif + +#ifndef DBMDX_VE_GRAM_NAME +#define DBMDX_VE_GRAM_NAME "ve_grammar.bin" +#endif + +#ifndef DBMDX_VE_NET_NAME +#define DBMDX_VE_NET_NAME "ve_net.bin" +#endif + +#ifndef DBMDX_VE_AMODEL_NAME +#define DBMDX_VE_AMODEL_NAME "ve_amodel.bin" +#endif + +#define MAX_REQ_SIZE 4096 + +#define DBMDX_AMODEL_HEADER_SIZE 12 +#define DBMDX_AMODEL_MAX_CHUNKS 3 + +#define DBMDX_MSLEEP_WAKEUP 35 +#define DBMDX_MSLEEP_HIBARNATE 20 +#define DBMDX_MSLEEP_CONFIG_VA_MODE_REG 50 +#define DBMDX_MSLEEP_NON_OVERLAY_BOOT 300 +#define DBMDX_MSLEEP_REQUEST_FW_FAIL 200 +#define DBMDX_MSLEEP_ON_SV_INTERRUPT 100 +#define DBMDX_MSLEEP_PCM_STREAMING_WORK 100 +#define DBMDX_MSLEEP_DBG_MODE_CMD_RX 10 +#define DBMDX_MSLEEP_DBG_MODE_CMD_TX 10 +#define DBMDX_MSLEEP_DBG_AFTER_DETECTION 50 +#define DBMDX_MSLEEP_BUFFERING_PAUSED 100 +#define DBMDX_MSLEEP_AFTER_MIC_ENABLED 100 +#define DBMDX_MSLEEP_IS_ALIVE 20 +#define DBMDX_MSLEEP_IF_AUDIO_BUFFER_EMPTY 90 +#define DBMDX_MSLEEP_AFTER_LOAD_ASRP 50 + +#define DBMDX_USLEEP_AFTER_ECHO_CANCELLER 5000 +#define DBMDX_USLEEP_VQE_ALIVE 21000 +#define DBMDX_USLEEP_VQE_ALIVE_ON_FAIL 10000 +#define DBMDX_USLEEP_NO_SAMPLES 10000 +#define DBMDX_USLEEP_SET_MODE 15000 +#define DBMDX_USLEEP_AMODEL_HEADER 2000 +#define DBMDX_USLEEP_AFTER_LOAD_AMODEL 10000 +#define DBMDX_USLEEP_RESET_TOGGLE 10000 +#define DBMDX_USLEEP_BEFORE_INIT_CONFIG 20000 + +#define DBMDX_MSLEEP_UART_PROBE 50 +#define DBMDX_MSLEEP_UART_WAKEUP 50 +#define DBMDX_MSLEEP_UART_WAIT_TILL_ALIVE 100 +#define DBMDX_MSLEEP_UART_WAIT_FOR_CHECKSUM 50 +#define DBMDX_MSLEEP_UART_D2_AFTER_LOAD_FW 50 +#define DBMDX_MSLEEP_UART_D2_AFTER_RESET_32K 275 +#define DBMDX_MSLEEP_UART_D4_AFTER_RESET_32K 80 + +#define DBMDX_USLEEP_UART_AFTER_LOAD_AMODEL 10000 +#define DBMDX_USLEEP_UART_AFTER_WAKEUP_BYTE 100 +#define DBMDX_USLEEP_UART_D2_BEFORE_RESET 10000 +#define DBMDX_USLEEP_UART_D2_AFTER_RESET 15000 +#define DBMDX_USLEEP_UART_D4_AFTER_RESET 15000 +#define DBMDX_USLEEP_UART_D4_AFTER_LOAD_FW 10000 + +#define DBMDX_MSLEEP_SPI_VQE_SYS_CFG_CMD 60 +#define DBMDX_MSLEEP_SPI_FINISH_BOOT_1 10 +#define DBMDX_MSLEEP_SPI_FINISH_BOOT_2 10 +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) +#define DBMDX_MSLEEP_SPI_WAKEUP 100 +#else +#define DBMDX_MSLEEP_SPI_WAKEUP 50 +#endif +#define DBMDX_MSLEEP_SPI_D2_AFTER_RESET_32K 300 +#define DBMDX_MSLEEP_SPI_D2_AFTER_SBL 20 +#define DBMDX_MSLEEP_SPI_D2_BEFORE_FW_CHECKSUM 20 +#define DBMDX_MSLEEP_SPI_D4_AFTER_RESET_32K 85 +#define DBMDX_MSLEEP_SPI_D4_AFTER_PLL_CHANGE 80 +#define DBMDX_MSLEEP_SPI_D2_AFTER_PLL_CHANGE 5 + + +#define DBMDX_USLEEP_SPI_VQE_CMD_AFTER_SEND 20000 +#define DBMDX_USLEEP_SPI_VA_CMD_AFTER_SEND 500 +#define DBMDX_USLEEP_SPI_VA_CMD_AFTER_SEND_2 500 +#define DBMDX_USLEEP_SPI_VA_CMD_AFTER_BOOT 1000 +#define DBMDX_USLEEP_SPI_AFTER_CHUNK_READ 1000 +#define DBMDX_USLEEP_SPI_AFTER_LOAD_AMODEL 10000 +#define DBMDX_USLEEP_SPI_D2_AFTER_RESET 5000 +#define DBMDX_USLEEP_SPI_D2_AFTER_SBL 10000 +#define DBMDX_USLEEP_SPI_D2_AFTER_BOOT 10000 +#define DBMDX_USLEEP_SPI_D4_AFTER_BOOT 15000 +#define DBMDX_USLEEP_SPI_D4_AFTER_RESET 15000 +#define DBMDX_USLEEP_SPI_D4_POST_PLL 2000 + +#define DBMDX_MSLEEP_I2C_FINISH_BOOT 275 +#define DBMDX_MSLEEP_I2C_VQE_SYS_CFG_CMD 60 +#define DBMDX_MSLEEP_I2C_WAKEUP 50 +#define DBMDX_MSLEEP_I2C_D2_AFTER_RESET_32K 300 +#define DBMDX_MSLEEP_I2C_D2_CALLBACK 20 +#define DBMDX_MSLEEP_I2C_D2_AFTER_SBL 20 +#define DBMDX_MSLEEP_I2C_D2_BEFORE_FW_CHECKSUM 20 +#define DBMDX_MSLEEP_I2C_D4_AFTER_RESET_32K 100 +#define DBMDX_MSLEEP_I2C_D4_AFTER_SBL 20 +#define DBMDX_MSLEEP_I2C_D4_BEFORE_FW_CHECKSUM 20 + +#define DBMDX_USLEEP_I2C_VQE_CMD_AFTER_SEND 20000 +#define DBMDX_USLEEP_I2C_VA_CMD_AFTER_SEND 10000 +#define DBMDX_USLEEP_I2C_VA_CMD_AFTER_SEND_2 10000 +#define DBMDX_USLEEP_I2C_AFTER_BOOT_CMD 10000 +#define DBMDX_USLEEP_I2C_AFTER_LOAD_AMODEL 10000 +#define DBMDX_USLEEP_I2C_D2_AFTER_RESET 15000 +#define DBMDX_USLEEP_I2C_D2_AFTER_SBL 10000 +#define DBMDX_USLEEP_I2C_D2_AFTER_BOOT 10000 +#define DBMDX_USLEEP_I2C_D4_AFTER_RESET 15000 +#define DBMDX_USLEEP_I2C_D4_AFTER_BOOT 10000 + +#define DBMDX_DEBUG_MODE_OFF 0x0000 +#define DBMDX_DEBUG_MODE_RECORD 0x0001 +#define DBMDX_DEBUG_MODE_FW_LOG 0x0002 + +#define DBMDX_BOOT_MODE_NORMAL_BOOT 0x0000 +#define DBMDX_BOOT_MODE_RESET_DISABLED 0x0001 + +#define DBMDX_BOOT_OPT_SEND_PREBOOT 0x0001 +#define DBMDX_BOOT_OPT_VA_NO_UART_SYNC 0x0002 +#define DBMDX_BOOT_OPT_NO_I2C_FREQ_CALLBACK 0x0004 +#define DBMDX_BOOT_OPT_DONT_SENT_SBL 0x0008 +#define DBMDX_BOOT_OPT_DONT_SET_PLL 0x0020 +#define DBMDX_BOOT_OPT_DONT_CLR_CRC 0x0040 +#define DBMDX_BOOT_OPT_DONT_VERIFY_CRC 0x0080 +#define DBMDX_BOOT_OPT_DONT_SEND_START_BOOT 0x0100 +#define DBMDX_BOOT_OPT_VERIFY_CHIP_ID 0x0200 +#define DBMDX_BOOT_OPT_SET_GPIO_8_IN 0x0400 + +#define DBMDX_AMODEL_DEFAULT_OPTIONS 0x0000 +#define DBMDX_AMODEL_INCLUDES_HEADERS 0x0001 +#define DBMDX_AMODEL_SVT_ENCODING 0x0002 +#define DBMDX_AMODEL_SINGLE_FILE_NO_HEADER 0x0004 +#define DBMDX_LOAD_AMODEL_FOR_VE 0x0008 +#define DBMDX_VE_SEND_DUMMY_AMODEL_4B 0x0010 + +#define DBMDX_AMODEL_TYPE_PRIMARY 0x0001 +#define DBMDX_AMODEL_TYPE_SECONDARY 0x0002 + +#define DBMDX_NO_MODEL_SELECTED 0x0000 +#define DBMDX_SV_MODEL_SELECTED 0x0001 +#define DBMDX_OKG_MODEL_SELECTED 0x0002 + +#define DBMDX_LOAD_MODEL_NO_DETECTION 0x0001 +#define DBMDX_DO_NOT_RELOAD_MODEL 0x0002 +#define DBMDX_LOAD_MODEL_FROM_MEMORY 0x0004 + +#define DBMDX_NO_EXT_DETECTION_MODE_PARAMS 0x0000 +#define DBMDX_MIC_CONFIG_SOURCE_EXPLICIT 0x0000 + + + +#define DBMDX_ASRP_PARAMS_OPTIONS_DEFAULT 0x0000 +#define DBMDX_ASRP_PARAMS_OPTIONS_ALWAYS_RELOAD 0x0001 + +#define DBMDX_WAKELOCK_IRQ_TIMEOUT_MS 5000 + +struct chip_interface; + +enum dbmdx_firmware_active { + /* firmware pre-boot */ + DBMDX_FW_PRE_BOOT = 0, + /* va firmware was powered off */ + DBMDX_FW_POWER_OFF_VA, + /* voice authentication */ + DBMDX_FW_VA, + /* voice quality enhancement */ + DBMDX_FW_VQE, + /* max supported firmwares */ + DBMDX_FW_MAX +}; + + +enum dbmdx_audio_channel_operation { + AUDIO_CHANNEL_OP_COPY = 0, + AUDIO_CHANNEL_OP_DUPLICATE_1_TO_2, + AUDIO_CHANNEL_OP_DUPLICATE_1_TO_4, + AUDIO_CHANNEL_OP_DUPLICATE_2_TO_4, + AUDIO_CHANNEL_OP_TRUNCATE_2_TO_1, + AUDIO_CHANNEL_OP_TRUNCATE_4_TO_1, + AUDIO_CHANNEL_OP_TRUNCATE_4_TO_2, + AUDIO_CHANNEL_OP_MAX = AUDIO_CHANNEL_OP_TRUNCATE_4_TO_2 +}; + +enum dbmdx_chip { + DBMDX_CHIP_VA = 0, + DBMDX_NR_OF_CHIP_TYPES, +}; + +enum dbmdx_sv_recognition_mode { + SV_RECOGNITION_MODE_DISABLED = 0, + SV_RECOGNITION_MODE_VOICE_PHRASE_OR_CMD = 1, + SV_RECOGNITION_MODE_VOICE_ENERGY = 2, +}; + +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) +enum dbmdx_okg_recognition_mode { + OKG_RECOGNITION_MODE_DISABLED = 0, + OKG_RECOGNITION_MODE_ENABLED = 1, +}; +#endif + +enum dbmdx_detection_after_buffering_mode { + DETECTION_AFTER_BUFFERING_OFF = 0, + DETECTION_AFTER_BUFFERING_MODE_ENABLE_ALL = 1, + DETECTION_AFTER_BUFFERING_MODE_SET_MODE_ONLY = 2, + DETECTION_AFTER_BUFFERING_MODE_MAX, +}; + + +struct va_flags { + int irq_inuse; + int a_model_downloaded_to_fw; + int amodel_len; + enum dbmdx_sv_recognition_mode sv_recognition_mode; +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + int okg_a_model_downloaded_to_fw; + int okg_amodel_len; + bool okg_a_model_enabled; + enum dbmdx_okg_recognition_mode okg_recognition_mode; + u8 okg_amodel_checksum[4]; +#endif +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + const char *va_last_loaded_asrp_params_file_name; + bool va_ns_active; +#endif + int buffering; + int buffering_paused; + int pcm_worker_active; + int pcm_streaming_active; + bool pcm_streaming_pushing_zeroes; + int sleep_not_allowed; + int auto_detection_disabled; + int padded_cmds_disabled; + bool sv_capture_on_detect_disabled; + bool reconfigure_mic_on_vad_change; + bool disabling_mics_not_allowed; + bool microphones_enabled; + int cancel_pm_work; +#if IS_ENABLED(DBMDX_KEEP_ALIVE_TIMER) + int cancel_keep_alive_work; +#endif + unsigned int mode; + bool recovery_requested; + int va_debug_val1; +}; + +struct vqe_flags { + int in_call; + int use_case; + int speaker_volume_level; +}; + +struct vqe_fw_info { + u16 major; + u16 minor; + u16 version; + u16 patch; + u16 debug; + u16 tuning; +}; + +struct amodel_info { + char *amodel_buf; + ssize_t amodel_size; + ssize_t amodel_chunks_size[DBMDX_AMODEL_MAX_CHUNKS]; + int num_of_amodel_chunks; + bool amodel_loaded; + u8 amodel_checksum[4]; +}; + +enum dbmd2_xtal_id { + DBMD2_XTAL_FREQ_24M_IMG1 = 0, + DBMD2_XTAL_FREQ_24M_IMG2, + DBMD2_XTAL_FREQ_24M_IMG3, + DBMD2_XTAL_FREQ_9M_IMG4, + DBMD2_XTAL_FREQ_24M_IMG5, + DBMD2_XTAL_FREQ_19M_IMG6, + DBMD2_XTAL_FREQ_32K_IMG7, + DBMD2_XTAL_FREQ_32K_IMG8, +}; + +enum dbmdx_load_amodel_mode { + LOAD_AMODEL_PRIMARY = 0, + LOAD_AMODEL_2NDARY = 1, + LOAD_AMODEL_CUSTOM, +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + LOAD_AMODEL_OKG = 4, + LOAD_AMODEL_MAX = LOAD_AMODEL_OKG +#else + LOAD_AMODEL_MAX = LOAD_AMODEL_CUSTOM +#endif +}; + +enum dbmdx_states { + DBMDX_IDLE = 0, + DBMDX_DETECTION = 1, +#if IS_ENABLED(DBMDX_FW_BELOW_300) + DBMDX_RESERVED = 2, + DBMDX_BUFFERING = 3, +#else + DBMDX_BUFFERING = 2, + DBMDX_UART_RECORDING = 3, +#endif + DBMDX_SLEEP_PLL_ON = 4, + DBMDX_SLEEP_PLL_OFF = 5, + DBMDX_HIBERNATE = 6, + DBMDX_STREAMING = 7, /* CUSTOM STATE */ + DBMDX_DETECTION_AND_STREAMING = 8, /* CUSTOM STATE */ + DBMDX_NR_OF_STATES, +}; + +enum dbmdx_bus_interface { + DBMDX_INTERFACE_NONE = 0, + DBMDX_INTERFACE_I2C, + DBMDX_INTERFACE_SPI, + DBMDX_INTERFACE_UART, + DBMDX_NR_OF_INTERFACES, +}; + +enum dbmdx_power_modes { + /* + * no firmware is active and the device is booting + */ + DBMDX_PM_BOOTING = 0, + /* + * a firmware is active and the device can be used + */ + DBMDX_PM_ACTIVE, + /* + * a firmware is active and the device is going to sleep + */ + DBMDX_PM_FALLING_ASLEEP, + /* + * chip is sleeping and needs to be woken up to be functional + */ + DBMDX_PM_SLEEPING, + /* number of PM states */ + DBMDX_PM_STATES, +}; + +struct dbmdx_private { + struct dbmdx_platform_data *pdata; + /* lock for private data */ + struct mutex p_lock; +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + struct wakeup_source *ps_nosuspend_wl; +#endif + + enum dbmdx_firmware_active active_fw; + enum dbmdx_firmware_active active_fw_va_chip; + enum dbmdx_power_modes power_mode; + enum dbmdx_bus_interface active_interface; + enum dbmdx_interface_type active_interface_type_va; + enum dbmdx_chip active_chip; + enum dbmdx_chip usr_selected_chip; + int sv_irq; + struct platform_device *pdev; + struct device *dev; + + const struct firmware *va_fw; + const struct firmware *va_preboot_fw; + + const struct firmware *vqe_fw; + const struct firmware *vqe_non_overlay_fw; + struct firmware *dspg_gram; + struct firmware *dspg_net; + bool asleep; + bool device_ready; + struct clk *clocks[DBMDX_NR_OF_CLKS]; + struct regulator *vregulator; + struct work_struct sv_work; + struct work_struct pcm_streaming_work; + struct work_struct uevent_work; + unsigned int audio_mode; + unsigned int clk_type; + unsigned int master_pll_rate; + unsigned int bytes_per_sample; + unsigned int current_pcm_rate; + unsigned int audio_pcm_rate; + unsigned int audio_pcm_channels; + enum dbmdx_audio_channel_operation pcm_achannel_op; + enum dbmdx_audio_channel_operation detection_achannel_op; + unsigned int fw_vad_type; + dev_t record_chrdev; + struct cdev record_cdev; + struct device *record_dev; + struct cdev record_cdev_block; + struct device *record_dev_block; + struct kfifo pcm_kfifo; + struct kfifo detection_samples_kfifo; + void *detection_samples_kfifo_buf; + unsigned int detection_samples_kfifo_buf_size; + atomic_t audio_owner; + struct amodel_info primary_amodel; + struct amodel_info secondary_amodel; +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + struct amodel_info okg_amodel; +#endif + u8 *sbl_data; + struct va_flags va_flags; + struct vqe_flags vqe_flags; + u32 vqe_vc_syscfg; + u32 va_current_mic_config; + u32 va_active_mic_config; + u32 va_detection_mode; + u16 va_detection_mode_custom_params; + u32 va_cur_backlog_length; + u32 va_last_word_id; + bool va_capture_on_detect; +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + bool okg_a_model_support; +#endif + bool sv_a_model_support; + bool sleep_disabled; + bool mic_disabling_blocked; + int va_debug_mode; + +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + bool va_ns_enabled; + int va_ns_cfg_index; + bool va_ns_pcm_streaming_enabled; + u32 va_load_asrp_params_options; +#endif + int va_cur_digital_mic_digital_gain; + int va_cur_analog_mic_analog_gain; + int va_cur_analog_mic_digital_gain; + + int cur_reset_gpio; + int cur_wakeup_gpio; + int cur_wakeup_disabled; + int cur_wakeup_set_value; + int cur_send_wakeup_seq; + int cur_use_gpio_for_wakeup; + int cur_firmware_id; + u32 cur_boot_options; + + u32 boot_mode; + + u32 recovery_times; + + unsigned int num_dais; + struct snd_soc_dai_driver *dais; + int remote_codec_in_use; + + u8 read_audio_buf[MAX_REQ_SIZE + 8]; + struct snd_pcm_substream *active_substream; + + struct delayed_work delayed_pm_work; + struct workqueue_struct *dbmdx_workq; + +#if IS_ENABLED(DBMDX_KEEP_ALIVE_TIMER) + struct alarm keep_alive_timer; + int keep_alive_timer_created; + int keep_alive_timer_started; + int keep_alive_triggers; + struct work_struct keep_alive_work; +#endif + + /* limit request size of audio data from the firmware */ + unsigned long rxsize; + + /* sysfs */ + struct class *ns_class; + struct device *dbmdx_dev; + /* common helper functions */ + void (*reset_set)(struct dbmdx_private *p); + void (*reset_release)(struct dbmdx_private *p); + void (*reset_sequence)(struct dbmdx_private *p); + void (*wakeup_set)(struct dbmdx_private *p); + void (*wakeup_release)(struct dbmdx_private *p); + void (*wakeup_toggle)(struct dbmdx_private *p); + void (*lock)(struct dbmdx_private *p); + void (*unlock)(struct dbmdx_private *p); + int (*verify_checksum)(struct dbmdx_private *p, + const u8 *expect, const u8 *got, size_t size); + int (*va_set_speed)(struct dbmdx_private *p, + enum dbmdx_va_speeds speed); + unsigned long (*clk_get_rate)(struct dbmdx_private *p, + enum dbmdx_clocks clk); + long (*clk_set_rate)(struct dbmdx_private *p, + enum dbmdx_clocks clk); + int (*clk_enable)(struct dbmdx_private *p, enum dbmdx_clocks clk); + int (*clk_disable)(struct dbmdx_private *p, enum dbmdx_clocks clk); + + /* external callbacks */ + set_i2c_freq_cb set_i2c_freq_callback; + event_cb event_callback; + + /* interface to the chip */ + struct chip_interface *chip; + struct chip_interface **interfaces; + enum dbmdx_bus_interface *interface_types; + unsigned int nr_of_interfaces; + +}; + +/* + * main interface between the core layer and the chip + */ +struct chip_interface { + /* wait till booting is allowed */ + int (*can_boot)(struct dbmdx_private *p); + /* prepare booting (e.g. increase speed) */ + int (*prepare_boot)(struct dbmdx_private *p); + /* send firmware to the chip and boot it */ + int (*boot)(const void *fw_data, size_t fw_size, + struct dbmdx_private *p, const void *checksum, + size_t chksum_len, int load_fw); + /* finish booting */ + int (*finish_boot)(struct dbmdx_private *p); + /* dump chip state */ + int (*dump)(struct chip_interface *chip, char *buf); + /* set VA firmware ready, (e.g. lower speed) */ + int (*set_va_firmware_ready)(struct dbmdx_private *p); + /* set VQE firmware ready */ + int (*set_vqe_firmware_ready)(struct dbmdx_private *p); + /* Enable/Disable Transport layer (UART/I2C/SPI) */ + void (*transport_enable)(struct dbmdx_private *p, bool enable); + /* read data from the chip */ + ssize_t (*read)(struct dbmdx_private *p, void *buf, size_t len); + /* write data to the chip */ + ssize_t (*write)(struct dbmdx_private *p, const void *buf, size_t len); + /* send command in VQE protocol format to the chip */ + ssize_t (*send_cmd_vqe)(struct dbmdx_private *p, + u32 command, u16 *response); + /* send command in VA protocol format to the chip */ + ssize_t (*send_cmd_va)(struct dbmdx_private *p, + u32 command, u16 *response); + /* send command in boot protocol format to the chip */ + int (*send_cmd_boot)(struct dbmdx_private *p, u32 command); + /* verify boot checksum */ + int (*verify_boot_checksum)(struct dbmdx_private *p, + const void *checksum, size_t chksum_len); + /* prepare buffering of audio data (e.g. increase speed) */ + int (*prepare_buffering)(struct dbmdx_private *p); + /* read audio data */ + int (*read_audio_data)(struct dbmdx_private *p, + void *buf, + size_t samples, + bool to_read_metadata, + size_t *available_samples, + size_t *data_offset); + /* finish buffering of audio data (e.g. lower speed) */ + int (*finish_buffering)(struct dbmdx_private *p); + /* prepare amodel loading (e.g. increase speed) */ + int (*prepare_amodel_loading)(struct dbmdx_private *p); + /* load acoustic model */ + int (*load_amodel)(struct dbmdx_private *p, const void *data, + size_t size, int num_of_chunks, size_t *chunk_sizes, + const void *checksum, size_t chksum_len, + u16 load_amodel_mode_cmd); + /* finish amodel loading (e.g. lower speed) */ + int (*finish_amodel_loading)(struct dbmdx_private *p); + /* Get Read Chunk Size */ + u32 (*get_read_chunk_size)(struct dbmdx_private *p); + /* Get Write Chunk Size */ + u32 (*get_write_chunk_size)(struct dbmdx_private *p); + /* Set Read Chunk Size */ + int (*set_read_chunk_size)(struct dbmdx_private *p, u32 size); + /* Set Write Chunk Size */ + int (*set_write_chunk_size)(struct dbmdx_private *p, u32 size); + /* Resume Chip Interface */ + void (*resume)(struct dbmdx_private *p); + /* Suspend Chip Interface */ + void (*suspend)(struct dbmdx_private *p); + + /* private data */ + void *pdata; +}; + +/* + * character device + */ +int dbmdx_register_cdev(struct dbmdx_private *p); +void dbmdx_deregister_cdev(struct dbmdx_private *p); +void stream_set_position(struct snd_pcm_substream *substream, + u32 position); +u32 stream_get_position(struct snd_pcm_substream *substream); +int dbmdx_set_pcm_timer_mode(struct snd_pcm_substream *substream, + bool enable_timer); +#if (IS_ENABLED(CONFIG_SND_SOC_DBMDX) && IS_MODULE(CONFIG_SND_SOC_DBMDX)) +extern int (*dbmdx_init_interface)(void); +extern void (*dbmdx_deinit_interface)(void); + +int board_dbmdx_snd_init(void); +void board_dbmdx_snd_exit(void); + +int snd_dbmdx_pcm_init(void); +void snd_dbmdx_pcm_exit(void); +#endif +#endif diff --git a/sound/soc/codecs/dbmdx/dbmdx-snd-pcm.c b/sound/soc/codecs/dbmdx/dbmdx-snd-pcm.c new file mode 100755 index 000000000000..d7f6dde5c923 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-snd-pcm.c @@ -0,0 +1,787 @@ +/* + * snd-dbmdx-pcm.c -- DBMDX ASoC platform driver + * + * Copyright (C) 2014 DSP Group + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + + +#define DEBUG +#include <linux/workqueue.h> +#include <linux/clk.h> +#include <linux/interrupt.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/slab.h> +#include <linux/spinlock.h> +#include <linux/vmalloc.h> +#include <sound/pcm.h> +#include <sound/pcm_params.h> +#include <sound/soc.h> +#include <linux/kthread.h> +#include <linux/delay.h> +#if IS_ENABLED(CONFIG_OF) +#include <linux/of.h> +#endif +#include <linux/dma-mapping.h> +#include "dbmdx-interface.h" + +#define DRV_NAME "dbmdx-snd-soc-platform" + +/* defaults */ +/* must be a multiple of 4 */ +#define MAX_BUFFER_SIZE (131072*4) /* 3 seconds for each channel */ +#define MIN_PERIOD_SIZE 4096 +#define MAX_PERIOD_SIZE (MAX_BUFFER_SIZE / 64) +#define USE_FORMATS (SNDRV_PCM_FMTBIT_S16_LE) + +#if IS_ENABLED(DBMDX_PCM_RATE_8000_SUPPORTED) +#define USE_RATE_MIN 8000 +#else +#define USE_RATE_MIN 16000 +#endif +#define USE_RATE_MAX 48000 +#define USE_CHANNELS_MIN 1 +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) +#define USE_CHANNELS_MAX 4 +#else +#define USE_CHANNELS_MAX 2 +#endif +#define USE_PERIODS_MIN 1 +#define USE_PERIODS_MAX 1024 +/* 3 seconds + 4 bytes for position */ +#define REAL_BUFFER_SIZE (MAX_BUFFER_SIZE + 4) + +u32 dma_bit_mask; + +struct snd_dbmdx { + struct snd_soc_card *card; + struct snd_pcm_hardware pcm_hw; +}; + +struct snd_dbmdx_runtime_data { + struct snd_pcm_substream *substream; + struct timer_list timer; + bool timer_is_active; + struct delayed_work pcm_start_capture_work; + struct delayed_work pcm_stop_capture_work; + struct workqueue_struct *dbmdx_pcm_workq; + unsigned int capture_in_progress; + atomic_t command_in_progress; + atomic_t number_of_cmds_in_progress; +}; + +static struct snd_pcm_hardware dbmdx_pcm_hardware = { + .info = (SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_RESUME | + SNDRV_PCM_INFO_MMAP_VALID | + SNDRV_PCM_INFO_BATCH), + .formats = USE_FORMATS, + .rates = (SNDRV_PCM_RATE_16000 | +#if IS_ENABLED(DBMDX_PCM_RATE_8000_SUPPORTED) + SNDRV_PCM_RATE_8000 | +#endif +#if IS_ENABLED(DBMDX_PCM_RATE_32000_SUPPORTED) + SNDRV_PCM_RATE_32000 | +#endif +#if IS_ENABLED(DBMDX_PCM_RATE_44100_SUPPORTED) + SNDRV_PCM_RATE_44100 | +#endif + SNDRV_PCM_RATE_48000), + .rate_min = USE_RATE_MIN, + .rate_max = USE_RATE_MAX, + .channels_min = USE_CHANNELS_MIN, + .channels_max = USE_CHANNELS_MAX, + .buffer_bytes_max = MAX_BUFFER_SIZE, + .period_bytes_min = MIN_PERIOD_SIZE, + .period_bytes_max = MAX_PERIOD_SIZE, + .periods_min = USE_PERIODS_MIN, + .periods_max = USE_PERIODS_MAX, + .fifo_size = 0, +}; + +static DECLARE_WAIT_QUEUE_HEAD(dbmdx_wq); + +int pcm_command_in_progress(struct snd_dbmdx_runtime_data *prtd, + bool is_command_in_progress) +{ + if (is_command_in_progress) { + if (!atomic_add_unless(&prtd->command_in_progress, 1, 1)) + return -EBUSY; + } else { + atomic_set(&prtd->command_in_progress, 0); + atomic_dec(&prtd->number_of_cmds_in_progress); + wake_up_interruptible(&dbmdx_wq); + } + + return 0; +} + +void wait_for_pcm_commands(struct snd_dbmdx_runtime_data *prtd) +{ + int ret; + + while (1) { + wait_event_interruptible(dbmdx_wq, + !(atomic_read(&prtd->command_in_progress))); + + ret = pcm_command_in_progress(prtd, 1); + if (!ret) + break; + } +} + +u32 stream_get_position(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + + /* pr_debug("%s\n", __func__); */ + + if (runtime == NULL) { + pr_err("%s: NULL ptr runtime\n", __func__); + return 0; + } + + return *(u32 *)&(runtime->dma_area[MAX_BUFFER_SIZE]); +} + +void stream_set_position(struct snd_pcm_substream *substream, + u32 position) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + + /* pr_debug("%s\n", __func__); */ + + if (runtime == NULL) { + pr_err("%s: NULL ptr runtime\n", __func__); + return; + } + + *(u32 *)&(runtime->dma_area[MAX_BUFFER_SIZE]) = position; +} + +static void dbmdx_pcm_timer(struct timer_list *t) +{ + struct snd_dbmdx_runtime_data *prtd = from_timer(prtd, t, timer); + struct snd_pcm_substream *substream = prtd->substream; + struct snd_pcm_runtime *runtime = substream->runtime; + struct timer_list *timer = &(prtd->timer); + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_codec *codec = rtd->codec_dai->codec; + + unsigned int size = snd_pcm_lib_buffer_bytes(substream); + u32 pos; + unsigned long msecs; + unsigned long to_copy; + + msecs = (runtime->period_size * 1000) / runtime->rate; + mod_timer(timer, jiffies + msecs_to_jiffies(msecs)); + /* pr_debug("%s\n", __func__); */ + + + pos = stream_get_position(substream); + to_copy = frames_to_bytes(runtime, runtime->period_size); + + if (dbmdx_get_samples(codec, runtime->dma_area + pos, + runtime->channels * runtime->period_size)) { + memset(runtime->dma_area + pos, 0, to_copy); + pr_debug("%s Inserting %d bytes of silence\n", + __func__, (int)to_copy); + } + + pos += to_copy; + if (pos >= size) + pos = 0; + + stream_set_position(substream, pos); + + snd_pcm_period_elapsed(substream); + +} + +static int dbmdx_pcm_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *hw_params) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + + + pr_debug("%s\n", __func__); + + snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); + + runtime->channels = params_channels(hw_params); + runtime->dma_bytes = params_buffer_bytes(hw_params); + runtime->buffer_size = params_buffer_size(hw_params); + runtime->rate = params_rate(hw_params); + + return 0; +} + +static int dbmdx_pcm_prepare(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + size_t buf_bytes; + size_t period_bytes; + + pr_debug("%s\n", __func__); + + memset(runtime->dma_area, 0, REAL_BUFFER_SIZE); + + buf_bytes = snd_pcm_lib_buffer_bytes(substream); + period_bytes = snd_pcm_lib_period_bytes(substream); + + pr_debug("%s - buffer size =%d period size = %d\n", + __func__, (int)buf_bytes, (int)period_bytes); + + /* We only support buffers that are multiples of the period */ + if (buf_bytes % period_bytes) { + pr_err("%s - buffer=%d not multiple of period=%d\n", + __func__, (int)buf_bytes, (int)period_bytes); + return -EINVAL; + } + + return 0; +} + +static int dbmdx_start_period_timer(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_dbmdx_runtime_data *prtd = runtime->private_data; + struct timer_list *timer = &(prtd->timer); + unsigned long msecs; + + pr_debug("%s\n", __func__); + prtd->timer_is_active = true; + + *(u32 *)&(runtime->dma_area[MAX_BUFFER_SIZE]) = 0; + msecs = (runtime->period_size * 500) / runtime->rate; + mod_timer(timer, jiffies + msecs_to_jiffies(msecs)); + + return 0; +} + +static int dbmdx_stop_period_timer(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_dbmdx_runtime_data *prtd = runtime->private_data; + struct timer_list *timer = &(prtd->timer); + + pr_debug("%s\n", __func__); + + + del_timer_sync(timer); + + prtd->timer_is_active = false; + + return 0; +} + + +int dbmdx_set_pcm_timer_mode(struct snd_pcm_substream *substream, + bool enable_timer) +{ + int ret; + struct snd_pcm_runtime *runtime; + struct snd_dbmdx_runtime_data *prtd; + + if (!substream) { + pr_debug("%s:Substream is NULL\n", __func__); + return -EINVAL; + } + + runtime = substream->runtime; + + if (!runtime) { + pr_debug("%s:Runtime is NULL\n", __func__); + return -EINVAL; + } + + prtd = runtime->private_data; + + if (!prtd) { + pr_debug("%s:Runtime Pr. Data is NULL\n", __func__); + return -EINVAL; + } + + if (enable_timer) { + if (!(prtd->capture_in_progress)) { + pr_debug("%s:Capture is not in progress\n", __func__); + return -EINVAL; + } + + if (prtd->timer_is_active) { + pr_debug("%s:Timer is active\n", __func__); + return 0; + } + + ret = dbmdx_start_period_timer(substream); + if (ret < 0) { + pr_err("%s: failed to start capture device\n", + __func__); + return -EIO; + } + } else { + if (!(prtd->timer_is_active)) { + pr_debug("%s:Timer is not active\n", __func__); + return 0; + } + + ret = dbmdx_stop_period_timer(substream); + if (ret < 0) { + pr_err("%s: failed to stop capture device\n", __func__); + return -EIO; + } + + } + + return 0; +} + + +static void dbmdx_pcm_start_capture_work(struct work_struct *work) +{ + int ret; + struct snd_dbmdx_runtime_data *prtd = container_of( + work, struct snd_dbmdx_runtime_data, + pcm_start_capture_work.work); + struct snd_pcm_substream *substream = prtd->substream; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_codec *codec = rtd->codec_dai->codec; + + + pr_debug("%s:\n", __func__); + + wait_for_pcm_commands(prtd); + + if (prtd->capture_in_progress) { + pr_debug("%s:Capture is already in progress\n", __func__); + goto out; + } + + prtd->capture_in_progress = 1; + + ret = dbmdx_start_pcm_streaming(codec, substream); + if (ret < 0) { + prtd->capture_in_progress = 0; + pr_err("%s: failed to start capture device\n", __func__); + goto out; + } + + msleep(DBMDX_MSLEEP_PCM_STREAMING_WORK); +out: + pcm_command_in_progress(prtd, 0); +} + +static void dbmdx_pcm_stop_capture_work(struct work_struct *work) +{ + int ret; + struct snd_dbmdx_runtime_data *prtd = container_of( + work, struct snd_dbmdx_runtime_data, + pcm_stop_capture_work.work); + struct snd_pcm_substream *substream = prtd->substream; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_codec *codec = rtd->codec_dai->codec; + + pr_debug("%s:\n", __func__); + + wait_for_pcm_commands(prtd); + + if (!(prtd->capture_in_progress)) { + pr_debug("%s:Capture is not in progress\n", __func__); + goto out; + } + + ret = dbmdx_stop_pcm_streaming(codec); + if (ret < 0) + pr_err("%s: failed to stop pcm streaming\n", __func__); + + if (prtd->timer_is_active) { + + ret = dbmdx_stop_period_timer(substream); + if (ret < 0) + pr_err("%s: failed to stop timer\n", __func__); + } + + prtd->capture_in_progress = 0; +out: + pcm_command_in_progress(prtd, 0); +} + +static int dbmdx_pcm_open(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_codec *codec = rtd->codec_dai->codec; + struct snd_dbmdx_runtime_data *prtd; + struct timer_list *timer; + int ret; + + pr_debug("%s\n", __func__); + + if (dbmdx_codec_lock(codec)) { + ret = -EBUSY; + goto out; + } + + prtd = kzalloc(sizeof(struct snd_dbmdx_runtime_data), GFP_KERNEL); + if (prtd == NULL) { + ret = -ENOMEM; + goto out_unlock; + } + + timer = &(prtd->timer); + timer_setup(timer, dbmdx_pcm_timer, 0); + prtd->substream = substream; + atomic_set(&prtd->command_in_progress, 0); + atomic_set(&prtd->number_of_cmds_in_progress, 0); + + INIT_DELAYED_WORK(&prtd->pcm_start_capture_work, + dbmdx_pcm_start_capture_work); + INIT_DELAYED_WORK(&prtd->pcm_stop_capture_work, + dbmdx_pcm_stop_capture_work); + prtd->dbmdx_pcm_workq = create_workqueue("dbmdx-pcm-wq"); + if (!prtd->dbmdx_pcm_workq) { + pr_err("%s: Could not create pcm workqueue\n", __func__); + ret = -EIO; + goto out_free_prtd; + } + + runtime->private_data = prtd; + + snd_soc_set_runtime_hwparams(substream, &dbmdx_pcm_hardware); + + ret = snd_pcm_hw_constraint_integer(runtime, + SNDRV_PCM_HW_PARAM_PERIODS); + if (ret < 0) + pr_debug("%s Error setting pcm constraint int\n", __func__); + + return 0; +out_free_prtd: + kfree(prtd); +out_unlock: + dbmdx_codec_unlock(codec); +out: + return ret; +} + +static int dbmdx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_dbmdx_runtime_data *prtd; + int ret = 0; + int num_of_active_cmds; + + pr_debug("%s: cmd=%d\n", __func__, cmd); + + if (runtime == NULL) { + pr_err("%s: runtime NULL ptr\n", __func__); + return -EFAULT; + } + + prtd = runtime->private_data; + + if (prtd == NULL) { + pr_err("%s: prtd NULL ptr\n", __func__); + return -EFAULT; + } + + num_of_active_cmds = atomic_read(&prtd->number_of_cmds_in_progress); + pr_debug("%s: Number of active commands=%d\n", __func__, + num_of_active_cmds); + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + atomic_inc(&prtd->number_of_cmds_in_progress); + ret = queue_delayed_work(prtd->dbmdx_pcm_workq, + &prtd->pcm_start_capture_work, + msecs_to_jiffies(num_of_active_cmds*100)); + if (!ret) { + pr_debug("%s: Start command is already pending\n", + __func__); + atomic_dec(&prtd->number_of_cmds_in_progress); + } else + pr_debug("%s: Start has been scheduled\n", __func__); + break; + case SNDRV_PCM_TRIGGER_RESUME: + return 0; + case SNDRV_PCM_TRIGGER_STOP: + atomic_inc(&prtd->number_of_cmds_in_progress); + ret = queue_delayed_work(prtd->dbmdx_pcm_workq, + &prtd->pcm_stop_capture_work, + msecs_to_jiffies(num_of_active_cmds*100)); + if (!ret) { + pr_debug("%s: Stop command is already pending\n", + __func__); + atomic_dec(&prtd->number_of_cmds_in_progress); + } else + pr_debug("%s: Stop has been scheduled\n", __func__); + break; + case SNDRV_PCM_TRIGGER_SUSPEND: + return 0; + } + + return ret; +} + +static int dbmdx_pcm_close(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_dbmdx_runtime_data *prtd = runtime->private_data; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_codec *codec = rtd->codec_dai->codec; + + pr_debug("%s\n", __func__); + + flush_delayed_work(&prtd->pcm_start_capture_work); + flush_delayed_work(&prtd->pcm_stop_capture_work); + queue_delayed_work(prtd->dbmdx_pcm_workq, + &prtd->pcm_stop_capture_work, + msecs_to_jiffies(0)); + flush_delayed_work(&prtd->pcm_stop_capture_work); + flush_workqueue(prtd->dbmdx_pcm_workq); + usleep_range(10000, 11000); + destroy_workqueue(prtd->dbmdx_pcm_workq); + kfree(prtd); + prtd = NULL; + + dbmdx_codec_unlock(codec); + + return 0; +} + +static snd_pcm_uframes_t dbmdx_pcm_pointer(struct snd_pcm_substream *substream) +{ + u32 pos; + + /* pr_debug("%s\n", __func__); */ + + + pos = stream_get_position(substream); + return bytes_to_frames(substream->runtime, pos); +} + +static struct snd_pcm_ops dbmdx_pcm_ops = { + .open = dbmdx_pcm_open, + .close = dbmdx_pcm_close, + .ioctl = snd_pcm_lib_ioctl, + .hw_params = dbmdx_pcm_hw_params, + .prepare = dbmdx_pcm_prepare, + .trigger = dbmdx_pcm_trigger, + .pointer = dbmdx_pcm_pointer, +}; + +static int dbmdx_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream) +{ + struct snd_pcm_substream *substream = pcm->streams[stream].substream; + struct snd_dma_buffer *buf = &substream->dma_buffer; + size_t size = MAX_BUFFER_SIZE; + int ret; + + pr_debug("%s\n", __func__); + + + buf->dev.type = SNDRV_DMA_TYPE_DEV; + buf->dev.dev = pcm->card->dev; + buf->private_data = NULL; + + if (dma_bit_mask) { + pr_info("%s: Configuring DMA_BIT_MASK as %d\n", + __func__, dma_bit_mask); + ret = dma_coerce_mask_and_coherent(pcm->card->dev, + DMA_BIT_MASK(dma_bit_mask)); + } + + buf->area = dma_alloc_coherent(pcm->card->dev, + REAL_BUFFER_SIZE, + &buf->addr, + GFP_KERNEL); + if (!buf->area) { + pr_err("%s: Failed to allocate dma memory.\n", __func__); + pr_err("%s: Please increase uncached DMA memory region\n", + __func__); + return -ENOMEM; + } + buf->bytes = size; + + return 0; +} + +static int dbmdx_pcm_probe(struct snd_soc_platform *pt) +{ + struct snd_dbmdx *dbmdx; + + pr_debug("%s\n", __func__); + + + dbmdx = kzalloc(sizeof(*dbmdx), GFP_KERNEL); + if (!dbmdx) + return -ENOMEM; + + dbmdx->card = pt->component.card; + + dbmdx->pcm_hw = dbmdx_pcm_hardware; + snd_soc_platform_set_drvdata(pt, dbmdx); + + return 0; +} + +static int dbmdx_pcm_remove(struct snd_soc_platform *pt) +{ + struct snd_dbmdx *dbmdx; + + pr_debug("%s\n", __func__); + + + dbmdx = snd_soc_platform_get_drvdata(pt); + kfree(dbmdx); + + return 0; +} + +static int dbmdx_pcm_new(struct snd_soc_pcm_runtime *runtime) +{ + struct snd_pcm *pcm; + int ret = 0; + + pr_debug("%s\n", __func__); + + + pcm = runtime->pcm; + if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) { + ret = dbmdx_pcm_preallocate_dma_buffer(pcm, + SNDRV_PCM_STREAM_PLAYBACK); + if (ret) + goto out; + } + + if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) { + ret = dbmdx_pcm_preallocate_dma_buffer(pcm, + SNDRV_PCM_STREAM_CAPTURE); + if (ret) + goto out; + } +out: + return ret; +} + +static void dbmdx_pcm_free(struct snd_pcm *pcm) +{ + struct snd_pcm_substream *substream; + struct snd_dma_buffer *buf; + int stream; + + pr_debug("%s\n", __func__); + + + for (stream = 0; stream < 2; stream++) { + substream = pcm->streams[stream].substream; + if (!substream) + continue; + + buf = &substream->dma_buffer; + if (!buf->area) + continue; + dma_free_coherent(pcm->card->dev, + REAL_BUFFER_SIZE, + (void *)buf->area, + buf->addr); + buf->area = NULL; + } +} + +static struct snd_soc_platform_driver dbmdx_soc_platform = { + .probe = &dbmdx_pcm_probe, + .remove = &dbmdx_pcm_remove, + .ops = &dbmdx_pcm_ops, + .pcm_new = dbmdx_pcm_new, + .pcm_free = dbmdx_pcm_free, +}; + +static int dbmdx_pcm_platform_probe(struct platform_device *pdev) +{ + int err; + int ret; + struct device_node *np = pdev->dev.of_node; + + pr_debug("%s\n", __func__); + + ret = of_property_read_u32(np, "dma_bit_mask", + &dma_bit_mask); + if ((ret && ret != -EINVAL)) { + dev_info(&pdev->dev, "%s: invalid 'dma_bit_mask' using default as 0\n", + __func__); + dma_bit_mask = 0; + } else { + dev_info(&pdev->dev, "%s: 'dma_bit_mask' = %d\n", + __func__, dma_bit_mask); + } + + err = snd_soc_register_platform(&pdev->dev, &dbmdx_soc_platform); + if (err) + dev_err(&pdev->dev, "%s: snd_soc_register_platform() failed", + __func__); + + return err; +} + +static int dbmdx_pcm_platform_remove(struct platform_device *pdev) +{ + snd_soc_unregister_platform(&pdev->dev); + + pr_debug("%s\n", __func__); + + + return 0; +} + +static const struct of_device_id snd_soc_platform_of_ids[] = { + { .compatible = "dspg,dbmdx-snd-soc-platform" }, + { }, +}; + +static struct platform_driver dbmdx_pcm_driver = { + .driver = { + .name = DRV_NAME, + .owner = THIS_MODULE, + .of_match_table = snd_soc_platform_of_ids, + }, + .probe = dbmdx_pcm_platform_probe, + .remove = dbmdx_pcm_platform_remove, +}; + +#if !IS_MODULE(CONFIG_SND_SOC_DBMDX) +static int __init snd_dbmdx_pcm_init(void) +{ + return platform_driver_register(&dbmdx_pcm_driver); +} +module_init(snd_dbmdx_pcm_init); + +static void __exit snd_dbmdx_pcm_exit(void) +{ + platform_driver_unregister(&dbmdx_pcm_driver); +} +module_exit(snd_dbmdx_pcm_exit); +#else +int snd_dbmdx_pcm_init(void) +{ + return platform_driver_register(&dbmdx_pcm_driver); +} + +void snd_dbmdx_pcm_exit(void) +{ + platform_driver_unregister(&dbmdx_pcm_driver); +} +#endif + +MODULE_DESCRIPTION("DBMDX ASoC platform driver"); +MODULE_AUTHOR("DSP Group"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/dbmdx/dbmdx-snd.c b/sound/soc/codecs/dbmdx/dbmdx-snd.c new file mode 100755 index 000000000000..765c082eb1e7 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-snd.c @@ -0,0 +1,223 @@ +/* + * snd-dbmdx.c -- ASoC Machine Driver for DBMDX + * + * Copyright (C) 2014 DSP Group + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* #define DEBUG */ + +#include <linux/clk.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/slab.h> +#include <linux/atomic.h> +#include <sound/core.h> +#include <sound/pcm.h> +#include <sound/soc.h> +#include <sound/soc-dapm.h> +#if IS_ENABLED(CONFIG_OF) +#include <linux/of.h> +#endif + +#include "dbmdx-interface.h" + +#define DRIVER_NAME "snd-dbmdx-mach-drv" +#define CODEC_NAME "dbmdx" /* "dbmdx" */ +#define PLATFORM_DEV_NAME "dbmdx-snd-soc-platform" + +static int board_dai_init(struct snd_soc_pcm_runtime *rtd); + +static struct snd_soc_dai_link board_dbmdx_dai_link[] = { + { + .name = "dbmdx_dai_link.1", + .stream_name = "voice_sv", + /* asoc Cpu-Dai device name */ + .cpu_dai_name = "DBMDX_codec_dai", + /* asoc Codec-Dai device name */ + .codec_dai_name = "DBMDX_codec_dai", + .init = board_dai_init, + }, +}; + +static int board_dai_init(struct snd_soc_pcm_runtime *rtd) +{ + return 0; +} + +static struct snd_soc_card dspg_dbmdx_card = { + .name = "dspg-dbmdx", + .dai_link = board_dbmdx_dai_link, + .num_links = ARRAY_SIZE(board_dbmdx_dai_link), + .set_bias_level = NULL, + .set_bias_level_post = NULL, +}; + +#if IS_ENABLED(CONFIG_OF) +static int dbmdx_init_dai_link(struct snd_soc_card *card) +{ + int cnt; + struct snd_soc_dai_link *dai_link; + struct device_node *codec_node, *platform_node; + + codec_node = of_find_node_by_name(0, CODEC_NAME); + if (!of_device_is_available(codec_node)) + codec_node = of_find_node_by_name(codec_node, CODEC_NAME); + + if (!codec_node) { + pr_err("%s: Codec node not found\n", __func__); + return -EINVAL; + } + + platform_node = of_find_node_by_name(0, PLATFORM_DEV_NAME); + if (!platform_node) { + pr_err("%s: Platform node not found\n", __func__); + return -EINVAL; + } + + for (cnt = 0; cnt < card->num_links; cnt++) { + dai_link = &card->dai_link[cnt]; + dai_link->codec_of_node = codec_node; + dai_link->platform_of_node = platform_node; + } + + return 0; +} +#else +static int dbmdx_init_dai_link(struct snd_soc_card *card) +{ + int cnt; + struct snd_soc_dai_link *dai_link; + + for (cnt = 0; cnt < card->num_links; cnt++) { + dai_link = &card->dai_link[cnt]; + dai_link->codec_name = "dbmdx-codec.0"; + dai_link->platform_name = "dbmdx-snd-soc-platform.0"; + } + + return 0; +} +#endif + +static int dbmdx_snd_probe(struct platform_device *pdev) +{ + int ret = 0; + struct snd_soc_card *card = &dspg_dbmdx_card; + +#if (defined(DBMDX_DEFER_SND_CARD_LOADING) && !IS_MODULE(CONFIG_SND_SOC_DBMDX)) + struct device_node *np = pdev->dev.of_node; + int card_index = 0; +#endif + + /* struct device_node *np = pdev->dev.of_node; */ + + /* note: platform_set_drvdata() here saves pointer to the card's data + * on the device's 'struct device_private *p'->driver_data + */ + dev_dbg(&pdev->dev, "%s:\n", __func__); + +#if (defined(DBMDX_DEFER_SND_CARD_LOADING) && !IS_MODULE(CONFIG_SND_SOC_DBMDX)) + ret = of_property_read_u32(np, "wait_for_card_index", + &card_index); + if ((ret && ret != -EINVAL)) { + dev_info(&pdev->dev, "%s: invalid 'card_index' using default\n", + __func__); + } else { + dev_dbg(&pdev->dev, "%s: 'wait_for_card_index' = %d\n", + __func__, card_index); + } + + if (!snd_cards[card_index] || !(snd_cards[card_index]->id[0])) { + dev_info(&pdev->dev, + "%s: Defering DBMDX SND card probe, wait card[%d]..\n", + __func__, card_index); + return -EPROBE_DEFER; + } +#endif + + card->dev = &pdev->dev; + if (dbmdx_init_dai_link(card) < 0) { + dev_err(&pdev->dev, "%s: Initialization of DAI links failed\n", + __func__); + ret = -1; + goto ERR_CLEAR; + } + + /* Register ASoC sound Card */ + ret = snd_soc_register_card(card); + if (ret) { + dev_err(&pdev->dev, + "%s: registering of sound card failed: %d\n", + __func__, ret); + goto ERR_CLEAR; + } + dev_info(&pdev->dev, "%s: DBMDX ASoC card registered\n", __func__); + + return 0; + +ERR_CLEAR: + return ret; +} + +static int dbmdx_snd_remove(struct platform_device *pdev) +{ + struct snd_soc_card *card = platform_get_drvdata(pdev); + + snd_soc_unregister_card(card); + + dev_info(&pdev->dev, "%s: DBMDX ASoC card unregistered\n", __func__); + + return 0; +} + +static const struct of_device_id snd_dbmdx_of_ids[] = { + { .compatible = "dspg,snd-dbmdx-mach-drv" }, + { }, +}; + +static struct platform_driver board_dbmdx_snd_drv = { + .driver = { + .name = DRIVER_NAME, + .owner = THIS_MODULE, + .of_match_table = snd_dbmdx_of_ids, + .pm = &snd_soc_pm_ops, + }, + .probe = dbmdx_snd_probe, + .remove = dbmdx_snd_remove, +}; + +#if !IS_MODULE(CONFIG_SND_SOC_DBMDX) +static int __init board_dbmdx_mod_init(void) +{ + return platform_driver_register(&board_dbmdx_snd_drv); +} +module_init(board_dbmdx_mod_init); + +static void __exit board_dbmdx_mod_exit(void) +{ + platform_driver_unregister(&board_dbmdx_snd_drv); +} +module_exit(board_dbmdx_mod_exit); +#else +int board_dbmdx_snd_init(void) +{ + return platform_driver_register(&board_dbmdx_snd_drv); +} + +void board_dbmdx_snd_exit(void) +{ + platform_driver_unregister(&board_dbmdx_snd_drv); +} +#endif + +MODULE_DESCRIPTION("ASoC machine driver for DSPG DBMDX"); +MODULE_AUTHOR("DSP Group"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/dbmdx/dbmdx-spi-d2.c b/sound/soc/codecs/dbmdx/dbmdx-spi-d2.c new file mode 100755 index 000000000000..ee8a805b17c1 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-spi-d2.c @@ -0,0 +1,371 @@ +/* + * DSPG DBMD2 SPI interface driver + * + * Copyright (C) 2014 DSP Group + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +/* #define DEBUG */ +#include <linux/kernel.h> +#include <linux/delay.h> +#include <linux/slab.h> +#include <linux/spi/spi.h> +#include <linux/of_gpio.h> +#include <linux/module.h> +#include <linux/mutex.h> +#include <linux/clk.h> +#include <linux/of.h> +#include <linux/firmware.h> + +#include "dbmdx-interface.h" +#include "dbmdx-va-regmap.h" +#include "dbmdx-vqe-regmap.h" +#include "dbmdx-spi.h" + +#define DBMD2_MAX_SPI_BOOT_SPEED 8000000 + +static const u8 clr_crc[] = {0x5A, 0x03, 0x52, 0x0a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00}; +static const u8 chng_pll_cmd[] = {0x5A, 0x13, + 0x3D, 0x10, 0x00, 0x00, + 0x00, 0x16, 0x00, 0x10, + 0xFF, 0xF1, 0x3F, 0x00}; + +static int dbmd2_spi_boot(const void *fw_data, size_t fw_size, + struct dbmdx_private *p, const void *checksum, + size_t chksum_len, int load_fw) +{ + int retry = RETRY_COUNT; + int ret = 0; + ssize_t send_bytes; + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + struct spi_device *spi = spi_p->client; + u8 sbl_spi[] = { + 0x5A, 0x04, 0x4c, 0x00, 0x00, + 0x03, 0x11, 0x55, 0x05, 0x00}; + + + dev_dbg(spi_p->dev, "%s\n", __func__); + + do { + + if (p->active_fw == DBMDX_FW_PRE_BOOT) { + if (!(p->boot_mode & DBMDX_BOOT_MODE_RESET_DISABLED)) { + /* reset DBMD2 chip */ + p->reset_sequence(p); + } else { + /* If failed and reset is disabled, break */ + if (retry != RETRY_COUNT) { + retry = -1; + break; + } + } + + /* delay before sending commands */ + if (p->clk_get_rate(p, DBMDX_CLK_MASTER) <= 32768) + msleep(DBMDX_MSLEEP_SPI_D2_AFTER_RESET_32K); + else + usleep_range(DBMDX_USLEEP_SPI_D2_AFTER_RESET, + DBMDX_USLEEP_SPI_D2_AFTER_RESET + 5000); + + ret = spi_set_speed(p, DBMDX_VA_SPEED_MAX); + if (ret < 0) { + dev_err(spi_p->dev, "%s:failed %x\n", + __func__, ret); + continue; + } + + if ((spi->max_speed_hz > DBMD2_MAX_SPI_BOOT_SPEED) && + !(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_SET_PLL)) { + + ret = spi_set_speed(p, DBMDX_VA_SPEED_NORMAL); + if (ret < 0) { + dev_err(spi_p->dev, "%s:failed %x\n", + __func__, ret); + continue; + } + + /* send Change PLL clear command */ + ret = send_spi_data(p, chng_pll_cmd, + sizeof(chng_pll_cmd)); + if (ret != sizeof(chng_pll_cmd)) { + dev_err(p->dev, + "%s: failed to change PLL\n", + __func__); + continue; + } + msleep(DBMDX_MSLEEP_SPI_D2_AFTER_PLL_CHANGE); + + ret = spi_set_speed(p, DBMDX_VA_SPEED_MAX); + if (ret < 0) { + dev_err(spi_p->dev, "%s:failed %x\n", + __func__, ret); + continue; + } + } + + if (!(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_SENT_SBL)) { + /* send SBL */ + send_bytes = send_spi_data(p, sbl_spi, + sizeof(sbl_spi)); + if (send_bytes != sizeof(sbl_spi)) { + dev_err(p->dev, + "%s: -----------> load SBL error\n", + __func__); + continue; + } + usleep_range(DBMDX_USLEEP_SPI_D2_AFTER_SBL, + DBMDX_USLEEP_SPI_D2_AFTER_SBL + 1000); + } + /* verify chip id */ + if (p->cur_boot_options & + DBMDX_BOOT_OPT_VERIFY_CHIP_ID) { + ret = spi_verify_chip_id(p); + if (ret < 0) { + dev_err(spi_p->dev, + "%s: couldn't verify chip id\n", + __func__); + continue; + } + } + + if (!(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_CLR_CRC)) { + /* send CRC clear command */ + ret = send_spi_data(p, clr_crc, + sizeof(clr_crc)); + if (ret != sizeof(clr_crc)) { + dev_err(p->dev, + "%s: failed to clear CRC\n", + __func__); + continue; + } + } + } else { + /* delay before sending commands */ + if (p->active_fw == DBMDX_FW_VQE) + ret = send_spi_cmd_vqe(p, + DBMDX_VQE_SET_SWITCH_TO_BOOT_CMD, + NULL); + else if (p->active_fw == DBMDX_FW_VA) + ret = send_spi_cmd_va(p, + DBMDX_VA_SWITCH_TO_BOOT, + NULL); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to send 'Switch to BOOT' cmd\n", + __func__); + continue; + } + } + + if (!load_fw) + break; + + /* send firmware */ + send_bytes = send_spi_data(p, fw_data, fw_size - 4); + if (send_bytes != fw_size - 4) { + dev_err(p->dev, + "%s: -----------> load firmware error\n", + __func__); + continue; + } + + /* verify checksum */ + if (checksum && !(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_VERIFY_CRC)) { + ret = spi_verify_boot_checksum(p, checksum, chksum_len); + if (ret < 0) { + dev_err(spi_p->dev, + "%s: could not verify checksum\n", + __func__); + continue; + } + } + dev_dbg(p->dev, "%s: ---------> firmware loaded\n", + __func__); + break; + } while (--retry); + + /* no retries left, failed to boot */ + if (retry <= 0) { + dev_err(p->dev, "%s: failed to load firmware\n", __func__); + return -EIO; + } + + if (!(p->cur_boot_options & DBMDX_BOOT_OPT_DONT_SEND_START_BOOT)) { + /* send boot command */ + ret = send_spi_cmd_boot(p, DBMDX_FIRMWARE_BOOT); + if (ret < 0) { + dev_err(p->dev, + "%s: booting the firmware failed\n", __func__); + return -EIO; + } + } + + ret = spi_set_speed(p, DBMDX_VA_SPEED_NORMAL); + if (ret < 0) + dev_err(spi_p->dev, "%s:failed %x\n", __func__, ret); + + /* wait some time */ + usleep_range(DBMDX_USLEEP_SPI_D2_AFTER_BOOT, + DBMDX_USLEEP_SPI_D2_AFTER_BOOT + 1000); + + return 0; +} + +#if IS_ENABLED(CONFIG_PM_SLEEP) +static int dbmdx_spi_suspend(struct device *dev) +{ + struct chip_interface *ci = spi_get_drvdata(to_spi_device(dev)); + struct dbmdx_spi_private *spi_p = (struct dbmdx_spi_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + + spi_interface_suspend(spi_p); + + return 0; +} + +static int dbmdx_spi_resume(struct device *dev) +{ + struct chip_interface *ci = spi_get_drvdata(to_spi_device(dev)); + struct dbmdx_spi_private *spi_p = (struct dbmdx_spi_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + spi_interface_resume(spi_p); + + return 0; +} +#else +#define dbmdx_spi_suspend NULL +#define dbmdx_spi_resume NULL +#endif /* CONFIG_PM_SLEEP */ + +#if IS_ENABLED(CONFIG_PM) +static int dbmdx_spi_runtime_suspend(struct device *dev) +{ + struct chip_interface *ci = spi_get_drvdata(to_spi_device(dev)); + struct dbmdx_spi_private *spi_p = (struct dbmdx_spi_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + + spi_interface_suspend(spi_p); + + return 0; +} + +static int dbmdx_spi_runtime_resume(struct device *dev) +{ + struct chip_interface *ci = spi_get_drvdata(to_spi_device(dev)); + struct dbmdx_spi_private *spi_p = (struct dbmdx_spi_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + spi_interface_resume(spi_p); + + return 0; +} +#else +#define dbmdx_spi_runtime_suspend NULL +#define dbmdx_spi_runtime_resume NULL +#endif /* CONFIG_PM */ + +static const struct dev_pm_ops dbmdx_spi_pm = { + SET_SYSTEM_SLEEP_PM_OPS(dbmdx_spi_suspend, dbmdx_spi_resume) + SET_RUNTIME_PM_OPS(dbmdx_spi_runtime_suspend, + dbmdx_spi_runtime_resume, NULL) +}; + + +static int dbmd2_spi_probe(struct spi_device *client) +{ + int rc; + struct dbmdx_spi_private *p; + struct chip_interface *ci; + + rc = spi_common_probe(client); + + if (rc < 0) + return rc; + + ci = spi_get_drvdata(client); + p = (struct dbmdx_spi_private *)ci->pdata; + + /* fill in chip interface functions */ + p->chip.boot = dbmd2_spi_boot; + + return rc; +} + + +static const struct of_device_id dbmd2_spi_of_match[] = { + { .compatible = "dspg,dbmd2-spi", }, + {}, +}; +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX) +MODULE_DEVICE_TABLE(of, dbmd2_spi_of_match); +#endif + +static const struct spi_device_id dbmd2_spi_id[] = { + { "dbmdx-spi", 0 }, + { "dbmd2-spi", 0 }, + { } +}; +MODULE_DEVICE_TABLE(spi, dbmd2_spi_id); + +static struct spi_driver dbmd2_spi_driver = { + .driver = { + .name = "dbmd2-spi", + .bus = &spi_bus_type, + .owner = THIS_MODULE, +#if IS_ENABLED(CONFIG_OF) + .of_match_table = dbmd2_spi_of_match, +#endif + .pm = &dbmdx_spi_pm, + }, + .probe = dbmd2_spi_probe, + .remove = spi_common_remove, + .id_table = dbmd2_spi_id, +}; + +#if (IS_ENABLED(CONFIG_SND_SOC_DBMDX) && !IS_MODULE(CONFIG_SND_SOC_DBMDX)) +static int __init dbmd2_modinit(void) +{ + return spi_register_driver(&dbmd2_spi_driver); +} + +module_init(dbmd2_modinit); + +static void __exit dbmd2_exit(void) +{ + spi_unregister_driver(&dbmd2_spi_driver); +} +module_exit(dbmd2_exit); +#else +int dbmd2_spi_init_interface(void) +{ + spi_register_driver(&dbmd2_spi_driver); + return 0; +} + +void dbmd2_spi_deinit_interface(void) +{ + spi_unregister_driver(&dbmd2_spi_driver); +} + +int (*dbmdx_init_interface)(void) = &dbmd2_spi_init_interface; +void (*dbmdx_deinit_interface)(void) = &dbmd2_spi_deinit_interface; +#endif + +MODULE_DESCRIPTION("DSPG DBMD2 spi interface driver"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/dbmdx/dbmdx-spi-d4.c b/sound/soc/codecs/dbmdx/dbmdx-spi-d4.c new file mode 100755 index 000000000000..2b47ac1ee503 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-spi-d4.c @@ -0,0 +1,719 @@ +/* + * DSPG DBMD4/DBMD6/DBMD8 SPI interface driver + * + * Copyright (C) 2014 DSP Group + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +/* #define DEBUG */ +#include <linux/kernel.h> +#include <linux/delay.h> +#include <linux/slab.h> +#include <linux/spi/spi.h> +#include <linux/of_gpio.h> +#include <linux/module.h> +#include <linux/mutex.h> +#include <linux/clk.h> +#include <linux/of.h> +#include <linux/firmware.h> + +#include "dbmdx-interface.h" +#include "dbmdx-va-regmap.h" +#include "dbmdx-vqe-regmap.h" +#include "dbmdx-spi.h" + +#define DBMD4_MAX_SPI_BOOT_SPEED 4000000 + +static const u8 clr_crc_cmd[] = {0x5A, 0x0F}; +static const u8 chng_pll_cmd_32k[] = {0x5A, 0x10, 0x00, 0xEC, 0x0B, 0x00}; +static const u8 chng_pll_cmd_24m[] = {0x5A, 0x10, 0x00, 0x04, 0x00, 0x00}; +static const u8 set_gpio_8_in[] = {0x5A, 0x04, 0x4C, 0x00, 0x00, + 0x03, 0x14, 0x55, 0x00, 0x88}; + + + +static int dbmd4_spi_boot(const void *fw_data, size_t fw_size, + struct dbmdx_private *p, const void *checksum, + size_t chksum_len, int load_fw) +{ + int retry = RETRY_COUNT; + int ret = 0; + ssize_t send_bytes; + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + struct spi_device *spi = spi_p->client; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + do { + + if (p->active_fw == DBMDX_FW_PRE_BOOT) { + + if (!(p->boot_mode & DBMDX_BOOT_MODE_RESET_DISABLED)) { + /* reset DBMD4 chip */ + p->reset_sequence(p); + } else { + /* If failed and reset is disabled, break */ + if (retry != RETRY_COUNT) { + retry = -1; + break; + } + } + + /* Disable GPIO 8 */ + if (p->cur_boot_options & + DBMDX_BOOT_OPT_SET_GPIO_8_IN) { + ret = send_spi_data(p, set_gpio_8_in, + sizeof(set_gpio_8_in)); + if (ret != sizeof(set_gpio_8_in)) { + dev_err(p->dev, + "%s: failed to set gpio 8 to input\n", + __func__); + continue; + } + } + + + /* delay before sending commands */ + if (p->clk_get_rate(p, DBMDX_CLK_MASTER) <= 32768) + msleep(DBMDX_MSLEEP_SPI_D4_AFTER_RESET_32K); + else + usleep_range(DBMDX_USLEEP_SPI_D4_AFTER_RESET, + DBMDX_USLEEP_SPI_D4_AFTER_RESET + 5000); + + ret = spi_set_speed(p, DBMDX_VA_SPEED_MAX); + if (ret < 0) { + dev_err(spi_p->dev, "%s:failed %x\n", + __func__, ret); + continue; + } + + if ((spi->max_speed_hz > DBMD4_MAX_SPI_BOOT_SPEED) && + (p->cur_firmware_id == DBMDX_FIRMWARE_ID_DBMD4) && + !(p->cur_boot_options & DBMDX_BOOT_OPT_DONT_SET_PLL)) { + + ret = spi_set_speed(p, DBMDX_VA_SPEED_NORMAL); + if (ret < 0) { + dev_err(spi_p->dev, "%s:failed %x\n", + __func__, ret); + continue; + } + + /* Send change PLL command */ + if (p->clk_get_rate(p, DBMDX_CLK_MASTER) + <= 32768) { + ret = send_spi_data(p, chng_pll_cmd_32k, + sizeof(chng_pll_cmd_32k)); + if (ret != sizeof(chng_pll_cmd_32k)) { + dev_err(p->dev, + "%s: failed to change PLL\n", + __func__); + continue; + } + } else { + ret = send_spi_data(p, chng_pll_cmd_24m, + sizeof(chng_pll_cmd_24m)); + if (ret != sizeof(chng_pll_cmd_24m)) { + dev_err(p->dev, + "%s: failed to change PLL\n", + __func__); + continue; + } + } + msleep(DBMDX_MSLEEP_SPI_D4_AFTER_PLL_CHANGE); + + ret = spi_set_speed(p, DBMDX_VA_SPEED_MAX); + if (ret < 0) { + dev_err(spi_p->dev, "%s:failed %x\n", + __func__, ret); + continue; + } + } + + /* verify chip id */ + if (p->cur_boot_options & + DBMDX_BOOT_OPT_VERIFY_CHIP_ID) { + ret = spi_verify_chip_id(p); + if (ret < 0) { + dev_err(spi_p->dev, + "%s: couldn't verify chip id\n", + __func__); + continue; + } + } + + if (!(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_CLR_CRC)) { + + /* send CRC clear command */ + ret = send_spi_data(p, clr_crc_cmd, + sizeof(clr_crc_cmd)); + if (ret != sizeof(clr_crc_cmd)) { + dev_err(p->dev, + "%s: failed to clear CRC\n", + __func__); + continue; + } + } + } else { + ret = send_spi_cmd_va(p, + DBMDX_VA_SWITCH_TO_BOOT, + NULL); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to send 'Switch to BOOT' cmd\n", + __func__); + continue; + } + } + + if (!load_fw) + break; + + /* send firmware */ + send_bytes = send_spi_data(p, fw_data, fw_size - 4); + if (send_bytes != fw_size - 4) { + dev_err(p->dev, + "%s: -----------> load firmware error\n", + __func__); + continue; + } + + /* verify checksum */ + if (checksum && !(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_VERIFY_CRC)) { + ret = spi_verify_boot_checksum(p, checksum, chksum_len); + if (ret < 0) { + dev_err(spi_p->dev, + "%s: could not verify checksum\n", + __func__); + continue; + } + } + + + dev_info(p->dev, "%s: ---------> firmware loaded\n", + __func__); + break; + } while (--retry); + + /* no retries left, failed to boot */ + if (retry <= 0) { + dev_err(p->dev, "%s: failed to load firmware\n", __func__); + return -EIO; + } + + if (!(p->cur_boot_options & DBMDX_BOOT_OPT_DONT_SEND_START_BOOT)) { + /* send boot command */ + ret = send_spi_cmd_boot(p, DBMDX_FIRMWARE_BOOT); + if (ret < 0) { + dev_err(p->dev, + "%s: booting the firmware failed\n", __func__); + return -EIO; + } + } + + + ret = spi_set_speed(p, DBMDX_VA_SPEED_NORMAL); + if (ret < 0) + dev_err(spi_p->dev, "%s:failed %x\n", __func__, ret); + + /* wait some time */ + usleep_range(DBMDX_USLEEP_SPI_D4_AFTER_BOOT, + DBMDX_USLEEP_SPI_D4_AFTER_BOOT + 1000); + + return ret; +} + +static int dbmd4_spi_reset_post_pll_divider(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + int ret; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + ret = send_spi_cmd_va(p, + DBMDX_VA_GENERAL_CONFIGURATION_2, + &spi_p->post_pll_div); + + if (ret < 0) { + dev_err(spi_p->dev, + "%s: failed to get post pll divider\n", + __func__); + return ret; + } + + + ret = send_spi_cmd_va(p, + DBMDX_VA_GENERAL_CONFIGURATION_2 | + (spi_p->post_pll_div & ~DBMDX_POST_PLL_DIV_MASK), + NULL); + + if (ret < 0) { + dev_err(spi_p->dev, + "%s: failed to get post pll divider\n", + __func__); + return ret; + } + + usleep_range(DBMDX_USLEEP_SPI_D4_POST_PLL, + DBMDX_USLEEP_SPI_D4_POST_PLL + 1000); + + return 0; +} + +static int dbmd4_spi_restore_post_pll_divider(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + int ret; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + ret = send_spi_cmd_va(p, + DBMDX_VA_GENERAL_CONFIGURATION_2 | + spi_p->post_pll_div, + NULL); + if (ret < 0) { + dev_err(spi_p->dev, + "%s: failed to restore post pll divider\n", + __func__); + return ret; + } + + usleep_range(DBMDX_USLEEP_SPI_D4_POST_PLL, + DBMDX_USLEEP_SPI_D4_POST_PLL + 1000); + + return 0; +} + +static int dbmd4_reconfigure_dsp_clock(struct dbmdx_private *p, int index) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + int ret; + u32 dsp_clock_cfg; + u16 mic1_val; + u16 mic2_val; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + dsp_clock_cfg = p->pdata->va_speed_cfg[index].cfg; + + if (!dsp_clock_cfg) { + dev_dbg(spi_p->dev, + "%s: dsp clock cfg is not set for rate #%d\n", + __func__, index); + return 0; + } + + ret = send_spi_cmd_va(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION, + &mic1_val); + + if (ret < 0) { + dev_err(spi_p->dev, + "%s: failed to get mic1 value\n", + __func__); + return ret; + } + + ret = send_spi_cmd_va(p, + DBMDX_VA_MICROPHONE2_CONFIGURATION, + &mic2_val); + + if (ret < 0) { + dev_err(spi_p->dev, + "%s: failed to get mic2 value\n", + __func__); + return ret; + } + + ret = send_spi_cmd_va(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION, + NULL); + + if (ret < 0) { + dev_err(spi_p->dev, + "%s: failed to reset mic1 value\n", + __func__); + return ret; + } + + ret = send_spi_cmd_va(p, + DBMDX_VA_MICROPHONE2_CONFIGURATION, + NULL); + + if (ret < 0) { + dev_err(spi_p->dev, + "%s: failed to reset mic2 value\n", + __func__); + return ret; + } + + ret = send_spi_cmd_va(p, + DBMDX_VA_CLK_CFG | (dsp_clock_cfg & 0xffff), + NULL); + + if (ret < 0) { + dev_err(spi_p->dev, + "%s: failed to set DBMDX_VA_CLK_CFG\n", + __func__); + return ret; + } + + /* Give to PLL enough time for stabilization */ + msleep(DBMDX_MSLEEP_CONFIG_VA_MODE_REG); + + ret = send_spi_cmd_va(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | mic1_val, + NULL); + + if (ret < 0) { + dev_err(spi_p->dev, + "%s: failed to restore mic1 value\n", + __func__); + return ret; + } + + ret = send_spi_cmd_va(p, + DBMDX_VA_MICROPHONE2_CONFIGURATION | mic2_val, + NULL); + + if (ret < 0) { + dev_err(spi_p->dev, + "%s: failed to restore mic2 value\n", + __func__); + return ret; + } + + return 0; +} + + +static int dbmd4_spi_switch_to_buffering_speed(struct dbmdx_private *p, + bool reconfigure_dsp_clock) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + int ret; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + if (p->cur_firmware_id == DBMDX_FIRMWARE_ID_DBMD4) { + ret = dbmd4_spi_reset_post_pll_divider(p); + + if (ret < 0) { + dev_err(spi_p->dev, + "%s: failed, cannot reset post pll divider\n", + __func__); + return ret; + } + } + if (reconfigure_dsp_clock) { + + ret = dbmd4_reconfigure_dsp_clock(p, DBMDX_VA_SPEED_BUFFERING); + + if (ret < 0) { + dev_err(spi_p->dev, + "%s: failed to reconfigure dsp clock\n", + __func__); + return ret; + } + } + + ret = spi_set_speed(p, DBMDX_VA_SPEED_BUFFERING); + + if (ret < 0) { + dev_err(spi_p->dev, "%s:failed setting speed %x\n", + __func__, ret); + return ret; + } + + return 0; +} + +static int dbmd4_spi_switch_to_normal_speed(struct dbmdx_private *p, + bool reconfigure_dsp_clock) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + int ret; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + ret = spi_set_speed(p, DBMDX_VA_SPEED_NORMAL); + + if (ret < 0) { + dev_err(spi_p->dev, "%s:failed setting speed %x\n", + __func__, ret); + return ret; + } + if (p->cur_firmware_id == DBMDX_FIRMWARE_ID_DBMD4) { + + ret = dbmd4_spi_restore_post_pll_divider(p); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed, cannot restore post pll divider\n", + __func__); + return ret; + } + } + if (reconfigure_dsp_clock) { + + ret = dbmd4_reconfigure_dsp_clock(p, DBMDX_VA_SPEED_NORMAL); + + if (ret < 0) { + dev_err(spi_p->dev, + "%s: failed to reconfigure dsp clock\n", + __func__); + return ret; + } + } + + return 0; +} + +static int dbmd4_spi_prepare_buffering(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + int ret; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + ret = dbmd4_spi_switch_to_buffering_speed(p, false); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to change speed to buffering\n", + __func__); + goto out; + } +out: + return ret; +} + +static int dbmd4_spi_finish_buffering(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + int ret; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + ret = dbmd4_spi_switch_to_normal_speed(p, false); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to change speed to buffering\n", + __func__); + goto out; + } +out: + return ret; +} + + +static int dbmd4_spi_prepare_amodel_loading(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + int ret; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + ret = dbmd4_spi_switch_to_buffering_speed(p, true); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to change speed to buffering\n", + __func__); + goto out; + } + +out: + return ret; +} + +static int dbmd4_spi_finish_amodel_loading(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + int ret; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + ret = dbmd4_spi_switch_to_normal_speed(p, true); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to change speed to buffering\n", + __func__); + goto out; + } +out: + return ret; +} + +#if IS_ENABLED(CONFIG_PM_SLEEP) +static int dbmdx_spi_suspend(struct device *dev) +{ + struct chip_interface *ci = spi_get_drvdata(to_spi_device(dev)); + struct dbmdx_spi_private *spi_p = (struct dbmdx_spi_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + + spi_interface_suspend(spi_p); + + return 0; +} + +static int dbmdx_spi_resume(struct device *dev) +{ + struct chip_interface *ci = spi_get_drvdata(to_spi_device(dev)); + struct dbmdx_spi_private *spi_p = (struct dbmdx_spi_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + spi_interface_resume(spi_p); + + return 0; +} +#else +#define dbmdx_spi_suspend NULL +#define dbmdx_spi_resume NULL +#endif /* CONFIG_PM_SLEEP */ + +#if IS_ENABLED(CONFIG_PM) +static int dbmdx_spi_runtime_suspend(struct device *dev) +{ + struct chip_interface *ci = spi_get_drvdata(to_spi_device(dev)); + struct dbmdx_spi_private *spi_p = (struct dbmdx_spi_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + + spi_interface_suspend(spi_p); + + return 0; +} + +static int dbmdx_spi_runtime_resume(struct device *dev) +{ + struct chip_interface *ci = spi_get_drvdata(to_spi_device(dev)); + struct dbmdx_spi_private *spi_p = (struct dbmdx_spi_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + spi_interface_resume(spi_p); + + return 0; +} +#else +#define dbmdx_spi_runtime_suspend NULL +#define dbmdx_spi_runtime_resume NULL +#endif /* CONFIG_PM */ + +static const struct dev_pm_ops dbmdx_spi_pm = { + SET_SYSTEM_SLEEP_PM_OPS(dbmdx_spi_suspend, dbmdx_spi_resume) + SET_RUNTIME_PM_OPS(dbmdx_spi_runtime_suspend, + dbmdx_spi_runtime_resume, NULL) +}; + +static int dbmd4_spi_probe(struct spi_device *client) +{ + int rc; + struct dbmdx_spi_private *p; + struct chip_interface *ci; + + rc = spi_common_probe(client); + + if (rc < 0) + return rc; + + ci = spi_get_drvdata(client); + p = (struct dbmdx_spi_private *)ci->pdata; + + /* fill in chip interface functions */ + p->chip.prepare_amodel_loading = dbmd4_spi_prepare_amodel_loading; + p->chip.finish_amodel_loading = dbmd4_spi_finish_amodel_loading; + p->chip.prepare_buffering = dbmd4_spi_prepare_buffering; + p->chip.finish_buffering = dbmd4_spi_finish_buffering; + p->chip.boot = dbmd4_spi_boot; + + return rc; +} + +static const struct of_device_id dbmd_4_8_spi_of_match[] = { + { .compatible = "dspg,dbmd4-spi", }, + { .compatible = "dspg,dbmd6-spi", }, + { .compatible = "dspg,dbmd8-spi", }, + {}, +}; + +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX) +MODULE_DEVICE_TABLE(of, dbmd_4_8_spi_of_match); +#endif + +static const struct spi_device_id dbmd_4_8_spi_id[] = { + { "dbmdx-spi", 0 }, + { "dbmd4-spi", 0 }, + { "dbmd6-spi", 0 }, + { "dbmd8-spi", 0 }, + { } +}; +MODULE_DEVICE_TABLE(spi, dbmd_4_8_spi_id); + +static struct spi_driver dbmd_4_8_spi_driver = { + .driver = { + .name = "dbmd_4_8-spi", + .bus = &spi_bus_type, + .owner = THIS_MODULE, +#if IS_ENABLED(CONFIG_OF) + .of_match_table = dbmd_4_8_spi_of_match, +#endif + .pm = &dbmdx_spi_pm, + }, + .probe = dbmd4_spi_probe, + .remove = spi_common_remove, + .id_table = dbmd_4_8_spi_id, +}; + +#if (IS_ENABLED(CONFIG_SND_SOC_DBMDX) && !IS_MODULE(CONFIG_SND_SOC_DBMDX)) +static int __init dbmd_4_8_modinit(void) +{ + return spi_register_driver(&dbmd_4_8_spi_driver); +} +module_init(dbmd_4_8_modinit); + +static void __exit dbmd_4_8_exit(void) +{ + spi_unregister_driver(&dbmd_4_8_spi_driver); +} +module_exit(dbmd_4_8_exit); +#else +int dbmd4_spi_init_interface(void) +{ + spi_register_driver(&dbmd_4_8_spi_driver); + return 0; +} + +void dbmd4_spi_deinit_interface(void) +{ + spi_unregister_driver(&dbmd_4_8_spi_driver); +} + +int (*dbmdx_init_interface)(void) = &dbmd4_spi_init_interface; +void (*dbmdx_deinit_interface)(void) = &dbmd4_spi_deinit_interface; +#endif + +MODULE_DESCRIPTION("DSPG DBMD4/DBMD6/DBMD8 spi interface driver"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/dbmdx/dbmdx-spi.c b/sound/soc/codecs/dbmdx/dbmdx-spi.c new file mode 100755 index 000000000000..9ab53a329790 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-spi.c @@ -0,0 +1,1222 @@ +/* + * DSPG DBMDX SPI interface driver + * + * Copyright (C) 2014 DSP Group + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +/* #define DEBUG */ +#include <linux/kernel.h> +#include <linux/delay.h> +#include <linux/slab.h> +#include <linux/spi/spi.h> +#if IS_ENABLED(CONFIG_OF) +#include <linux/of.h> +#include <linux/of_gpio.h> +#endif +#include <linux/module.h> +#include <linux/mutex.h> +#include <linux/clk.h> +#include <linux/firmware.h> + +#include "dbmdx-interface.h" +#include "dbmdx-va-regmap.h" +#include "dbmdx-vqe-regmap.h" +#include "dbmdx-spi.h" + +#define DEFAULT_SPI_WRITE_CHUNK_SIZE 8 +#define MAX_SPI_WRITE_CHUNK_SIZE 0x40000 +#define DEFAULT_SPI_READ_CHUNK_SIZE 8 +#define MAX_SPI_READ_CHUNK_SIZE 8192 + + +#define DBMDX_USE_EXPIRABLE_WAKELOCK 1 +#define DBMDX_WAKELOCK_TIMEOUT_MS 70*1000 + +static DECLARE_WAIT_QUEUE_HEAD(dbmdx_wq); + +int spi_set_speed(struct dbmdx_private *p, int index) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + struct spi_device *spi = spi_p->client; + int ret = 0; + u32 bits_per_word = 0; + u32 spi_rate = 0; + u16 spi_mode = SPI_MODE_0; + + if (index >= DBMDX_VA_NR_OF_SPEEDS) { + dev_err(spi_p->dev, "%s: Invalid speed index %x\n", + __func__, index); + return -EINVAL; + } + + spi_rate = p->pdata->va_speed_cfg[index].spi_rate - + (p->pdata->va_speed_cfg[index].spi_rate % 1000); + + bits_per_word = p->pdata->va_speed_cfg[index].spi_rate % 100; + + spi_mode = (u16)(((p->pdata->va_speed_cfg[index].spi_rate % 1000) - + bits_per_word) / 100); + + + if (bits_per_word != 8 && bits_per_word != 16 && bits_per_word != 32) + bits_per_word = 8; + + if (spi_mode == 0) + spi_mode = SPI_MODE_0; + else if (spi_mode == 1) + spi_mode = SPI_MODE_1; + else if (spi_mode == 2) + spi_mode = SPI_MODE_2; + else if (spi_mode == 3) + spi_mode = SPI_MODE_3; + else + spi_mode = SPI_MODE_0; + + if (spi->max_speed_hz != spi_rate || spi->mode != spi_mode) { + + spi->max_speed_hz = spi_rate; + spi->mode = spi_mode; + + spi->bits_per_word = bits_per_word; + + spi_p->pdata->bits_per_word = spi->bits_per_word; + spi_p->pdata->bytes_per_word = spi->bits_per_word / 8; + + dev_info(spi_p->dev, + "%s Update SPI Max Speed to %d Hz, bpw: %d, mode: %d\n", + __func__, + spi->max_speed_hz, + spi->bits_per_word, + spi->mode); + + ret = spi_setup(spi); + if (ret < 0) + dev_err(spi_p->dev, "%s:failed %x\n", __func__, ret); + } + + return ret; +} + +ssize_t send_spi_cmd_vqe(struct dbmdx_private *p, + u32 command, u16 *response) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + u8 send[4]; + u8 recv[4]; + ssize_t ret = 0; + int retries = 10; + + send[0] = (command >> 24) & 0xff; + send[1] = (command >> 16) & 0xff; + send[2] = (command >> 8) & 0xff; + send[3] = command & 0xff; + + ret = send_spi_data(p, send, 4); + if (ret < 0) { + dev_err(spi_p->dev, + "%s: cmd:0x%08X - send_spi_data failed ret:%zd\n", + __func__, command, ret); + return ret; + } + + usleep_range(DBMDX_USLEEP_SPI_VQE_CMD_AFTER_SEND, + DBMDX_USLEEP_SPI_VQE_CMD_AFTER_SEND + 1000); + + if ((command == (DBMDX_VQE_SET_POWER_STATE_CMD | + DBMDX_VQE_SET_POWER_STATE_HIBERNATE)) || + (command == DBMDX_VQE_SET_SWITCH_TO_BOOT_CMD)) + return 0; + + /* we need additional sleep till system is ready */ + if (command == (DBMDX_VQE_SET_SYSTEM_CONFIG_CMD | + DBMDX_VQE_SET_SYSTEM_CONFIG_PRIMARY_CFG)) + msleep(DBMDX_MSLEEP_SPI_VQE_SYS_CFG_CMD); + + /* read response */ + do { + ret = spi_read(spi_p->client, recv, 4); + if (ret < 0) { + /* Wait before polling again */ + usleep_range(10000, 11000); + + continue; + } + /* + * Check that the first two bytes of the response match + * (the ack is in those bytes) + */ + if ((send[0] == recv[0]) && (send[1] == recv[1])) { + if (response) + *response = (recv[2] << 8) | recv[3]; + ret = 0; + break; + } + + dev_warn(spi_p->dev, + "%s: incorrect ack (got 0x%.2x%.2x)\n", + __func__, recv[0], recv[1]); + ret = -EINVAL; + + /* Wait before polling again */ + usleep_range(10000, 11000); + } while (--retries); + + if (!retries) + dev_err(spi_p->dev, + "%s: cmd:0x%08X - wrong ack, giving up\n", + __func__, command); + + return ret; +} + +ssize_t send_spi_cmd_va(struct dbmdx_private *p, u32 command, + u16 *response) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + char tmp[3]; + u8 send[7]; + u8 recv[6] = {0, 0, 0, 0, 0, 0}; + int ret; + + dev_dbg(spi_p->dev, "%s: Send 0x%02x\n", __func__, command); + + p->wakeup_toggle(p); + + if (response) { + + ret = snprintf(tmp, 3, "%02x", (command >> 16) & 0xff); + send[0] = 0; + send[1] = tmp[0]; + send[2] = tmp[1]; + send[3] = 'r'; + + ret = send_spi_data(p, send, 4); + if (ret != 4) + goto out; + + usleep_range(DBMDX_USLEEP_SPI_VA_CMD_AFTER_SEND, + DBMDX_USLEEP_SPI_VA_CMD_AFTER_SEND + 100); + + if (p->va_debug_mode & DBMDX_DEBUG_MODE_FW_LOG) + msleep(DBMDX_MSLEEP_DBG_MODE_CMD_RX); + + ret = 0; + + /* The sleep command cannot be acked before the device + * goes to sleep + */ + ret = read_spi_data(p, recv, 5); + if (ret < 0) { + dev_err(spi_p->dev, "%s:spi_read failed =%d\n", + __func__, ret); + return ret; + } + recv[5] = 0; + ret = kstrtou16((const char *)&recv[1], 16, response); + if (ret < 0) { + dev_err(spi_p->dev, "%s failed -%d\n", __func__, ret); + dev_err(spi_p->dev, "%s: %x:%x:%x:%x:\n", + __func__, recv[1], recv[2], + recv[3], recv[4]); + return ret; + } + + dev_dbg(spi_p->dev, "%s: Received 0x%02x\n", __func__, + *response); + + ret = 0; + } else { + ret = snprintf(tmp, 3, "%02x", (command >> 16) & 0xff); + if (ret < 0) + goto out; + send[0] = tmp[0]; + send[1] = tmp[1]; + send[2] = 'w'; + + ret = snprintf(tmp, 3, "%02x", (command >> 8) & 0xff); + if (ret < 0) + goto out; + send[3] = tmp[0]; + send[4] = tmp[1]; + + ret = snprintf(tmp, 3, "%02x", command & 0xff); + if (ret < 0) + goto out; + send[5] = tmp[0]; + send[6] = tmp[1]; + + ret = send_spi_data(p, send, 7); + if (ret != 7) + goto out; + ret = 0; + + } +out: + usleep_range(DBMDX_USLEEP_SPI_VA_CMD_AFTER_SEND_2, + DBMDX_USLEEP_SPI_VA_CMD_AFTER_SEND_2 + 100); + + if (p->va_debug_mode & DBMDX_DEBUG_MODE_FW_LOG) + msleep(DBMDX_MSLEEP_DBG_MODE_CMD_TX); + + return ret; +} + +ssize_t send_spi_cmd_va_padded(struct dbmdx_private *p, + u32 command, + u16 *response) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + char tmp[3]; + u8 send[DBMDX_VA_SPI_CMD_PADDED_SIZE] = {0}; + u8 recv[DBMDX_VA_SPI_CMD_PADDED_SIZE] = {0}; + int ret; + u32 padded_cmd_w_size = spi_p->pdata->dma_min_buffer_size; + u32 padded_cmd_r_size = 5; + + dev_dbg(spi_p->dev, "%s: Send 0x%02x\n", __func__, command); + + p->wakeup_toggle(p); + + if (response) { + + ret = snprintf(tmp, 3, "%02x", (command >> 16) & 0xff); + send[padded_cmd_w_size - 3] = tmp[0]; + send[padded_cmd_w_size - 2] = tmp[1]; + send[padded_cmd_w_size - 1] = 'r'; + + ret = send_spi_data(p, send, padded_cmd_w_size); + if (ret != padded_cmd_w_size) + goto out; + + usleep_range(DBMDX_USLEEP_SPI_VA_CMD_AFTER_SEND, + DBMDX_USLEEP_SPI_VA_CMD_AFTER_SEND + 100); + + if (p->va_debug_mode & DBMDX_DEBUG_MODE_FW_LOG) + msleep(DBMDX_MSLEEP_DBG_MODE_CMD_RX); + + ret = 0; + + /* the sleep command cannot be acked before the device + * goes to sleep + */ + ret = read_spi_data(p, recv, padded_cmd_r_size); + if (ret < 0) { + dev_err(spi_p->dev, "%s:spi_read failed =%d\n", + __func__, ret); + return ret; + } + recv[5] = 0; + ret = kstrtou16((const char *)&recv[1], 16, response); + if (ret < 0) { + dev_err(spi_p->dev, "%s failed -%d\n", __func__, ret); + dev_err(spi_p->dev, "%s: %x:%x:%x:%x:\n", + __func__, recv[1], recv[2], + recv[3], recv[4]); + return ret; + } + + dev_dbg(spi_p->dev, "%s: Received 0x%02x\n", __func__, + *response); + + ret = 0; + } else { + ret = snprintf(tmp, 3, "%02x", (command >> 16) & 0xff); + if (ret < 0) + goto out; + send[padded_cmd_w_size - 7] = tmp[0]; + send[padded_cmd_w_size - 6] = tmp[1]; + send[padded_cmd_w_size - 5] = 'w'; + + ret = snprintf(tmp, 3, "%02x", (command >> 8) & 0xff); + if (ret < 0) + goto out; + send[padded_cmd_w_size - 4] = tmp[0]; + send[padded_cmd_w_size - 3] = tmp[1]; + + ret = snprintf(tmp, 3, "%02x", command & 0xff); + if (ret < 0) + goto out; + send[padded_cmd_w_size - 2] = tmp[0]; + send[padded_cmd_w_size - 1] = tmp[1]; + + ret = send_spi_data(p, send, padded_cmd_w_size); + if (ret != padded_cmd_w_size) + goto out; + ret = 0; + + } +out: + usleep_range(DBMDX_USLEEP_SPI_VA_CMD_AFTER_SEND_2, + DBMDX_USLEEP_SPI_VA_CMD_AFTER_SEND_2 + 100); + + if (p->va_debug_mode & DBMDX_DEBUG_MODE_FW_LOG) + msleep(DBMDX_MSLEEP_DBG_MODE_CMD_TX); + + return ret; +} + +ssize_t read_spi_data(struct dbmdx_private *p, void *buf, size_t len) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + size_t count = spi_p->pdata->read_chunk_size; + u32 bytes_per_word = spi_p->pdata->bytes_per_word; + u8 *recv = spi_p->pdata->recv; + ssize_t i; + size_t pad_size = 0; + int ret; + u8 *d = (u8 *)buf; + /* if stuck for more than 10s, something is wrong */ + unsigned long timeout = jiffies + msecs_to_jiffies(10000); + + for (i = 0; i < len; i += count) { + if ((i + count) > len) { + count = len - i; + if (count % (size_t)bytes_per_word != 0) + pad_size = (size_t)bytes_per_word - + (size_t)(count % (size_t)bytes_per_word); + count = count + pad_size; + } + + ret = spi_read(spi_p->client, recv, count); + if (ret < 0) { + dev_err(spi_p->dev, "%s: spi_read failed\n", + __func__); + i = -EIO; + goto out; + } + memcpy(d + i, recv, count - pad_size); + + if (!time_before(jiffies, timeout)) { + dev_err(spi_p->dev, + "%s: read data timed out after %zd bytes\n", + __func__, i); + i = -ETIMEDOUT; + goto out; + } + } + + return len; +out: + return i; +} + + +ssize_t write_spi_data(struct dbmdx_private *p, const u8 *buf, + size_t len) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + struct spi_device *spi = spi_p->client; + int rc; + + rc = spi_write(spi, buf, len); + if (rc != 0) { + dev_err(spi_p->dev, "%s(): error %d writing SR\n", + __func__, rc); + return rc; + } else + return len; +} + + +ssize_t send_spi_data(struct dbmdx_private *p, const void *buf, + size_t len) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + u32 bytes_per_word = spi_p->pdata->bytes_per_word; + int ret = 0; + const u8 *cmds = (const u8 *)buf; + size_t to_copy = len; + size_t max_size = (size_t)(spi_p->pdata->write_chunk_size); + size_t pad_size = 0; + size_t cur_send_size = 0; + u8 *send = spi_p->pdata->send; + + while (to_copy > 0) { + if (to_copy < max_size) { + memset(send, 0, max_size); + memcpy(send, cmds, to_copy); + + if (to_copy % (size_t)bytes_per_word != 0) + pad_size = (size_t)bytes_per_word - + (size_t)(to_copy % (size_t)bytes_per_word); + + cur_send_size = to_copy + pad_size; + } else { + memcpy(send, cmds, max_size); + cur_send_size = max_size; + } + + ret = write_spi_data(p, send, cur_send_size); + if (ret < 0) { + dev_err(spi_p->dev, "%s: Failed ret=%d\n", + __func__, ret); + break; + } + to_copy -= (ret - pad_size); + cmds += (ret - pad_size); + } + + return len - to_copy; +} + +int send_spi_cmd_boot(struct dbmdx_private *p, u32 command) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + u8 send[4]; + int ret = 0; + + + dev_dbg(spi_p->dev, "%s: command = %x\n", __func__, command); + send[0] = 0; + send[1] = 0; + send[2] = (command >> 16) & 0xff; + send[3] = (command >> 8) & 0xff; + + ret = send_spi_data(p, send, 4); + if (ret < 0) { + dev_err(spi_p->dev, "%s: ret = %d\n", __func__, ret); + return ret; + } + + /* A host command received will blocked until the current audio frame + * processing is finished, which can take up to 10 ms + */ + usleep_range(DBMDX_USLEEP_SPI_VA_CMD_AFTER_BOOT, + DBMDX_USLEEP_SPI_VA_CMD_AFTER_BOOT + 1000); + + return ret; +} + +int spi_verify_boot_checksum(struct dbmdx_private *p, + const void *checksum, size_t chksum_len) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + int ret; + u8 rx_checksum[11] = {0}; + + if (!checksum) + return 0; + + if (chksum_len > 8) { + dev_err(spi_p->dev, "%s: illegal checksum length\n", __func__); + return -EINVAL; + } + + ret = send_spi_cmd_boot(p, DBMDX_READ_CHECKSUM); + + if (ret < 0) { + dev_err(spi_p->dev, "%s: could not read checksum\n", __func__); + return -EIO; + } + + ret = read_spi_data(p, (void *)rx_checksum, chksum_len + 3); + + if (ret < 0) { + dev_err(spi_p->dev, "%s: could not read checksum data\n", + __func__); + return -EIO; + } + + ret = p->verify_checksum(p, checksum, &rx_checksum[3], chksum_len); + if (ret) { + dev_err(spi_p->dev, "%s: checksum mismatch\n", __func__); + return -EILSEQ; + } + + return 0; +} + +int spi_verify_chip_id(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + int ret; + u8 idr_read_cmd[] = {0x5A, 0x07, 0x68, 0x00, 0x00, 0x03}; + u8 idr_read_result[7] = {0}; + u8 chip_rev_id_low_a = 0; + u8 chip_rev_id_low_b = 0; + u8 chip_rev_id_high = 0; + + u8 recv_chip_rev_id_high = 0; + u8 recv_chip_rev_id_low = 0; + + if (p->cur_firmware_id == DBMDX_FIRMWARE_ID_DBMD2) { + idr_read_cmd[2] = 0x68; + chip_rev_id_high = 0x0d; + chip_rev_id_low_a = 0xb0; + chip_rev_id_low_b = 0xb1; + } else if (p->cur_firmware_id == DBMDX_FIRMWARE_ID_DBMD4) { + idr_read_cmd[2] = 0x74; + chip_rev_id_high = 0xdb; + chip_rev_id_low_a = 0x40; + chip_rev_id_low_b = 0x40; + } else if (p->cur_firmware_id == DBMDX_FIRMWARE_ID_DBMD6) { + idr_read_cmd[2] = 0x74; + chip_rev_id_high = 0xdb; + chip_rev_id_low_a = 0x60; + chip_rev_id_low_b = 0x60; + } else { + idr_read_cmd[2] = 0x74; + chip_rev_id_high = 0xdb; + chip_rev_id_low_a = 0x80; + chip_rev_id_low_b = 0x80; + } + + ret = send_spi_data(p, idr_read_cmd, 6); + if (ret < 0) { + dev_err(spi_p->dev, "%s: idr_read_cmd ret = %d\n", + __func__, ret); + return ret; + } + + usleep_range(DBMDX_USLEEP_SPI_VA_CMD_AFTER_BOOT, + DBMDX_USLEEP_SPI_VA_CMD_AFTER_BOOT + 1000); + + ret = read_spi_data(p, (void *)idr_read_result, 7); + + if (ret < 0) { + dev_err(spi_p->dev, "%s: could not idr register data\n", + __func__); + return -EIO; + } + /* Verify answer */ + if ((idr_read_result[1] != idr_read_cmd[0]) || + (idr_read_result[2] != idr_read_cmd[1]) || + (idr_read_result[5] != 0x00) || + (idr_read_result[6] != 0x00)) { + dev_err(spi_p->dev, "%s: Wrong IDR resp: %x:%x:%x:%x:%x:%x\n", + __func__, + idr_read_result[1], + idr_read_result[2], + idr_read_result[3], + idr_read_result[4], + idr_read_result[5], + idr_read_result[6]); + return -EIO; + } + recv_chip_rev_id_high = idr_read_result[4]; + recv_chip_rev_id_low = idr_read_result[3]; + + if ((recv_chip_rev_id_high != chip_rev_id_high) || + ((recv_chip_rev_id_low != chip_rev_id_low_a) && + (recv_chip_rev_id_low != chip_rev_id_low_b))) { + + dev_err(spi_p->dev, + "%s: Wrong chip ID: Received 0x%2x%2x Expected: 0x%2x%2x | 0x%2x%2x\n", + __func__, + recv_chip_rev_id_high, + recv_chip_rev_id_low, + chip_rev_id_high, + chip_rev_id_low_a, + chip_rev_id_high, + chip_rev_id_low_b); + return -EILSEQ; + } + + dev_info(spi_p->dev, + "%s: Chip ID was successfully verified: 0x%2x%2x\n", + __func__, + recv_chip_rev_id_high, + recv_chip_rev_id_low); + return 0; +} + +static int spi_can_boot(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + dev_dbg(spi_p->dev, "%s\n", __func__); + return 0; +} + +static int spi_prepare_boot(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + int ret = 0; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + ret = spi_set_speed(p, DBMDX_VA_SPEED_MAX); + + return ret; +} + +static int spi_finish_boot(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + int ret = 0; + + ret = spi_set_speed(p, DBMDX_VA_SPEED_NORMAL); + if (ret < 0) + dev_err(spi_p->dev, "%s:failed %x\n", __func__, ret); + + return ret; +} + +static int spi_dump_state(struct chip_interface *chip, char *buf) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)chip->pdata; + int off = 0; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\t===SPI Interface Dump====\n"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tSPI Write Chunk Size:\t\t%d\n", + spi_p->pdata->write_chunk_size); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tSPI Read Chunk Size:\t\t%d\n", + spi_p->pdata->read_chunk_size); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tSPI DMA Min Buffer Size:\t\t%d\n", + spi_p->pdata->dma_min_buffer_size); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tInterface resumed:\t%s\n", + spi_p->interface_enabled ? "ON" : "OFF"); + + return off; +} + +static int spi_set_va_firmware_ready(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + dev_dbg(spi_p->dev, "%s\n", __func__); + return 0; +} + + +static int spi_set_vqe_firmware_ready(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + dev_dbg(spi_p->dev, "%s\n", __func__); + return 0; +} + +static void spi_transport_enable(struct dbmdx_private *p, bool enable) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + int ret = 0; + + dev_dbg(spi_p->dev, "%s (%s)\n", __func__, enable ? "ON" : "OFF"); + + if (enable) { + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) +#if IS_ENABLED(DBMDX_USE_EXPIRABLE_WAKELOCK) + if (spi_p->ps_nosuspend_wl) + __pm_wakeup_event(spi_p->ps_nosuspend_wl, + DBMDX_WAKELOCK_TIMEOUT_MS); +#else + if (spi_p->ps_nosuspend_wl) + __pm_stay_awake(spi_p->ps_nosuspend_wl); +#endif +#endif + ret = wait_event_interruptible(dbmdx_wq, + spi_p->interface_enabled); + + if (ret) + dev_dbg(spi_p->dev, + "%s, waiting for interface was interrupted", + __func__); + else + dev_dbg(spi_p->dev, "%s, interface is active\n", + __func__); + } + + if (enable) { + p->wakeup_set(p); + if (p->asleep) + msleep(DBMDX_MSLEEP_SPI_WAKEUP); + } else { +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + if (spi_p->ps_nosuspend_wl) + __pm_relax(spi_p->ps_nosuspend_wl); +#endif + p->wakeup_release(p); + } +} + +static void spi_resume(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + spi_interface_resume(spi_p); +} + + +void spi_interface_resume(struct dbmdx_spi_private *spi_p) +{ + dev_dbg(spi_p->dev, "%s\n", __func__); + + spi_p->interface_enabled = 1; + wake_up_interruptible(&dbmdx_wq); +} + +static void spi_suspend(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + spi_interface_suspend(spi_p); +} + + +void spi_interface_suspend(struct dbmdx_spi_private *spi_p) +{ + dev_dbg(spi_p->dev, "%s\n", __func__); + + spi_p->interface_enabled = 0; +} + +static int spi_prepare_buffering(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + dev_dbg(spi_p->dev, "%s\n", __func__); + return 0; +} + +#define DBMDX_AUDIO_DEBUG_EXT 0 +#define DBMDX_SAMPLE_CHUNK_VERIFICATION_FLAG 0xdbd0 + +static int spi_read_audio_data(struct dbmdx_private *p, + void *buf, + size_t samples, + bool to_read_metadata, + size_t *available_samples, + size_t *data_offset) +{ + size_t bytes_to_read; + int ret; + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + ret = send_spi_cmd_va(p, + DBMDX_VA_READ_AUDIO_BUFFER | samples, NULL); + + if (ret) { + dev_err(p->dev, "%s: failed to request %zu audio samples\n", + __func__, samples); + ret = -1; + goto out; + } + + *available_samples = 0; + + if (to_read_metadata) + *data_offset = 8; + else + *data_offset = 2; + + bytes_to_read = samples * 8 * p->bytes_per_sample + *data_offset; + + ret = read_spi_data(p, buf, bytes_to_read); + + if (ret != bytes_to_read) { + dev_err(p->dev, + "%s: read audio failed, %zu bytes to read, res(%d)\n", + __func__, + bytes_to_read, + ret); + ret = -1; + goto out; + } + + /* Word #4 contains current number of available samples */ + if (to_read_metadata) { + u16 verif_flag; + *available_samples = (size_t)(((u16 *)buf)[3]); + verif_flag = (u16)(((u16 *)buf)[2]); + +#if DBMDX_AUDIO_DEBUG_EXT + dev_err(spi_p->dev, "%s: %x:%x:%x:%x:%x:%x:%x:%x\n", + __func__, + ((u8 *)buf)[0], + ((u8 *)buf)[1], + ((u8 *)buf)[2], + ((u8 *)buf)[3], + ((u8 *)buf)[4], + ((u8 *)buf)[5], + ((u8 *)buf)[6], + ((u8 *)buf)[7]); +#endif + + if (verif_flag != DBMDX_SAMPLE_CHUNK_VERIFICATION_FLAG) { + + *available_samples = 0; + + dev_err(p->dev, + "%s: Flag verificaiton failed %x:%x\n", + __func__, + ((u8 *)buf)[4], + ((u8 *)buf)[5]); + + ret = -1; + goto out; + } + } else + *available_samples = samples; + + ret = samples; + + /* FW performes SPI reset after each chunk transaction + * Thus delay is required + */ + usleep_range(DBMDX_USLEEP_SPI_AFTER_CHUNK_READ, + DBMDX_USLEEP_SPI_AFTER_CHUNK_READ + 100); +out: + return ret; +} + +static int spi_finish_buffering(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + int ret = 0; + + dev_dbg(spi_p->dev, "%s\n", __func__); + + + return ret; +} + +static int spi_prepare_amodel_loading(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + dev_dbg(spi_p->dev, "%s\n", __func__); + return 0; +} + +static int spi_finish_amodel_loading(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + dev_dbg(spi_p->dev, "%s\n", __func__); + /* do the same as for finishing buffering */ + + return 0; +} + +static u32 spi_get_read_chunk_size(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + dev_dbg(spi_p->dev, "%s SPI read chunk is %u\n", + __func__, spi_p->pdata->read_chunk_size); + + return spi_p->pdata->read_chunk_size; +} + +static u32 spi_get_write_chunk_size(struct dbmdx_private *p) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + dev_dbg(spi_p->dev, "%s SPI write chunk is %u\n", + __func__, spi_p->pdata->write_chunk_size); + + return spi_p->pdata->write_chunk_size; +} + +static int spi_set_read_chunk_size(struct dbmdx_private *p, u32 size) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + if (size > MAX_SPI_READ_CHUNK_SIZE) { + dev_err(spi_p->dev, + "%s Error setting SPI read chunk. Max chunk size: %u\n", + __func__, MAX_SPI_READ_CHUNK_SIZE); + return -EINVAL; + } else if ((size % 4) != 0) { + dev_err(spi_p->dev, + "%s Error SPI read chunk should be multiply of 4\n", + __func__); + return -EINVAL; + } else if (size == 0) + spi_p->pdata->read_chunk_size = DEFAULT_SPI_READ_CHUNK_SIZE; + else + spi_p->pdata->read_chunk_size = size; + + dev_dbg(spi_p->dev, "%s SPI read chunk was set to %u\n", + __func__, spi_p->pdata->read_chunk_size); + + return 0; +} + +static int spi_set_write_chunk_size(struct dbmdx_private *p, u32 size) +{ + struct dbmdx_spi_private *spi_p = + (struct dbmdx_spi_private *)p->chip->pdata; + + if (size > MAX_SPI_WRITE_CHUNK_SIZE) { + dev_err(spi_p->dev, + "%s Error setting SPI write chunk. Max chunk size: %u\n", + __func__, MAX_SPI_WRITE_CHUNK_SIZE); + return -EINVAL; + } else if ((size % 4) != 0) { + dev_err(spi_p->dev, + "%s Error SPI write chunk should be multiply of 4\n", + __func__); + return -EINVAL; + } else if (size == 0) + spi_p->pdata->write_chunk_size = DEFAULT_SPI_WRITE_CHUNK_SIZE; + else + spi_p->pdata->write_chunk_size = size; + + dev_dbg(spi_p->dev, "%s SPI write chunk was set to %u\n", + __func__, spi_p->pdata->write_chunk_size); + + return 0; +} + +int spi_common_probe(struct spi_device *client) +{ +#if IS_ENABLED(CONFIG_OF) + struct device_node *np; +#endif + int ret; + struct dbmdx_spi_private *p; + struct dbmdx_spi_data *pdata; + + dev_dbg(&client->dev, "%s(): dbmdx\n", __func__); + + p = kzalloc(sizeof(*p), GFP_KERNEL); + if (p == NULL) + return -ENOMEM; + + p->client = client; + p->dev = &client->dev; + + p->chip.pdata = p; +#if IS_ENABLED(CONFIG_OF) + np = p->dev->of_node; + if (!np) { + dev_err(p->dev, "%s: no devicetree entry\n", __func__); + ret = -EINVAL; + goto out_err_kfree; + } + + pdata = kzalloc(sizeof(struct dbmdx_spi_data), GFP_KERNEL); + if (!pdata) { + ret = -ENOMEM; + goto out_err_kfree; + } +#else + pdata = dev_get_platdata(&client->dev); + if (pdata == NULL) { + dev_err(p->dev, "%s: dbmdx, no platform data found\n", + __func__); + return -ENODEV; + } +#endif + +#if IS_ENABLED(CONFIG_OF) + ret = of_property_read_u32(np, "spi-max-frequency", + &(pdata->spi_speed)); + if (ret && ret != -EINVAL) + pdata->spi_speed = 2000000; +#endif + dev_dbg(p->dev, "%s: spi speed is %u\n", __func__, pdata->spi_speed); + +#if IS_ENABLED(CONFIG_OF) + ret = of_property_read_u32(np, "read-chunk-size", + &pdata->read_chunk_size); + if (ret != 0) { + /* + * read-chunk-size not set, set it to default + */ + pdata->read_chunk_size = DEFAULT_SPI_READ_CHUNK_SIZE; + dev_info(p->dev, + "%s: Setting spi read chunk to default val: %u bytes\n", + __func__, pdata->read_chunk_size); + } +#endif + if (pdata->read_chunk_size % 4 != 0) + pdata->read_chunk_size += (4 - (pdata->read_chunk_size % 4)); + + if (pdata->read_chunk_size > MAX_SPI_READ_CHUNK_SIZE) + pdata->read_chunk_size = MAX_SPI_READ_CHUNK_SIZE; + if (pdata->read_chunk_size == 0) + pdata->read_chunk_size = DEFAULT_SPI_READ_CHUNK_SIZE; + + dev_info(p->dev, "%s: Setting spi read chunk to %u bytes\n", + __func__, pdata->read_chunk_size); + +#if IS_ENABLED(CONFIG_OF) + ret = of_property_read_u32(np, "write-chunk-size", + &pdata->write_chunk_size); + if (ret != 0) { + /* + * write-chunk-size not set, set it to default + */ + pdata->write_chunk_size = DEFAULT_SPI_WRITE_CHUNK_SIZE; + dev_info(p->dev, + "%s: Setting spi write chunk to default val: %u bytes\n", + __func__, pdata->write_chunk_size); + } +#endif + if (pdata->write_chunk_size % 4 != 0) + pdata->write_chunk_size += (4 - (pdata->write_chunk_size % 4)); + + if (pdata->write_chunk_size > MAX_SPI_WRITE_CHUNK_SIZE) + pdata->write_chunk_size = MAX_SPI_WRITE_CHUNK_SIZE; + if (pdata->write_chunk_size == 0) + pdata->write_chunk_size = DEFAULT_SPI_WRITE_CHUNK_SIZE; + + dev_info(p->dev, "%s: Setting spi write chunk to %u bytes\n", + __func__, pdata->write_chunk_size); + +#if IS_ENABLED(CONFIG_OF) + ret = of_property_read_u32(np, "dma_min_buffer_size", + &pdata->dma_min_buffer_size); + if (ret != 0) { + /* + * read-chunk-size not set, set it to default + */ + pdata->dma_min_buffer_size = 0; + dev_info(p->dev, + "%s: Setting Min DMA Cmd Size to default: %u bytes\n", + __func__, pdata->dma_min_buffer_size); + } +#endif + if (pdata->dma_min_buffer_size > DBMDX_VA_SPI_CMD_PADDED_SIZE) + pdata->dma_min_buffer_size = DBMDX_VA_SPI_CMD_PADDED_SIZE; + if (pdata->dma_min_buffer_size < 7 && pdata->dma_min_buffer_size > 0) + pdata->dma_min_buffer_size = 7; + + dev_info(p->dev, "%s: Setting Min DMA Cmd Size to default: %u bytes\n", + __func__, pdata->dma_min_buffer_size); + + p->pdata = pdata; + + pdata->send = kmalloc(MAX_SPI_WRITE_CHUNK_SIZE, GFP_KERNEL | GFP_DMA); + if (!pdata->send) + goto out_err_mem_free; + + pdata->recv = kmalloc(MAX_SPI_READ_CHUNK_SIZE, GFP_KERNEL | GFP_DMA); + if (!pdata->recv) + goto out_err_mem_free1; + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + p->ps_nosuspend_wl = + wakeup_source_create("dbmdx_nosuspend_wakelock_spi"); + + if (p->ps_nosuspend_wl) + wakeup_source_add(p->ps_nosuspend_wl); + else + dev_err(p->dev, + "%s: Error creating WS: dbmdx_nosuspend_wakelock_spi\n", + __func__); +#endif + + /* fill in chip interface functions */ + p->chip.can_boot = spi_can_boot; + p->chip.prepare_boot = spi_prepare_boot; + p->chip.finish_boot = spi_finish_boot; + p->chip.dump = spi_dump_state; + p->chip.set_va_firmware_ready = spi_set_va_firmware_ready; + p->chip.set_vqe_firmware_ready = spi_set_vqe_firmware_ready; + p->chip.transport_enable = spi_transport_enable; + p->chip.read = read_spi_data; + p->chip.write = send_spi_data; + p->chip.send_cmd_vqe = send_spi_cmd_vqe; + p->chip.send_cmd_va = send_spi_cmd_va; + p->chip.send_cmd_boot = send_spi_cmd_boot; + p->chip.verify_boot_checksum = spi_verify_boot_checksum; + p->chip.prepare_buffering = spi_prepare_buffering; + p->chip.read_audio_data = spi_read_audio_data; + p->chip.finish_buffering = spi_finish_buffering; + p->chip.prepare_amodel_loading = spi_prepare_amodel_loading; + p->chip.finish_amodel_loading = spi_finish_amodel_loading; + p->chip.get_write_chunk_size = spi_get_write_chunk_size; + p->chip.get_read_chunk_size = spi_get_read_chunk_size; + p->chip.set_write_chunk_size = spi_set_write_chunk_size; + p->chip.set_read_chunk_size = spi_set_read_chunk_size; + p->chip.resume = spi_resume; + p->chip.suspend = spi_suspend; + + p->interface_enabled = 1; + + spi_set_drvdata(client, &p->chip); + + dev_info(&client->dev, "%s: successfully probed\n", __func__); + ret = 0; + goto out; +out_err_mem_free1: + kfree(pdata->send); +#if IS_ENABLED(CONFIG_OF) +out_err_kfree: +#endif +out_err_mem_free: + kfree(p); +out: + return ret; +} + +int spi_common_remove(struct spi_device *client) +{ + struct chip_interface *ci = spi_get_drvdata(client); + struct dbmdx_spi_private *p = (struct dbmdx_spi_private *)ci->pdata; + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + if (p->ps_nosuspend_wl) { + wakeup_source_remove(p->ps_nosuspend_wl); + wakeup_source_destroy(p->ps_nosuspend_wl); + } +#endif + kfree(p->pdata->send); + kfree(p->pdata->recv); + kfree(p); + + spi_set_drvdata(client, NULL); + + return 0; +} + + diff --git a/sound/soc/codecs/dbmdx/dbmdx-spi.h b/sound/soc/codecs/dbmdx/dbmdx-spi.h new file mode 100755 index 000000000000..a54547105040 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-spi.h @@ -0,0 +1,69 @@ +/* + * dbmdx-spi.h -- DBMDX SPI interface common functions + * + * Copyright (C) 2014 DSP Group + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _DBMDX_SPI_H +#define _DBMDX_SPI_H + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) +#include <linux/pm_wakeup.h> +#endif + +#define RETRY_COUNT 5 + +struct dbmdx_spi_private; +#define DBMDX_VA_SPI_CMD_PADDED_SIZE 150 + +struct dbmdx_spi_data { + u32 spi_speed; + u32 read_chunk_size; + u32 write_chunk_size; + u32 dma_min_buffer_size; + u8 *send; + u8 *recv; + u32 bits_per_word; + u32 bytes_per_word; +}; + + + +struct dbmdx_spi_private { + struct device *dev; + struct dbmdx_spi_data *pdata; + struct spi_device *client; + struct chip_interface chip; +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + struct wakeup_source *ps_nosuspend_wl; +#endif + u16 post_pll_div; + u32 interface_enabled; +}; + + + +ssize_t read_spi_data(struct dbmdx_private *p, void *buf, size_t len); +ssize_t send_spi_data(struct dbmdx_private *p, const void *buf, + size_t len); +ssize_t write_spi_data(struct dbmdx_private *p, const u8 *buf, + size_t len); +int send_spi_cmd_boot(struct dbmdx_private *p, u32 command); +ssize_t send_spi_cmd_va(struct dbmdx_private *p, u32 command, + u16 *response); +ssize_t send_spi_cmd_vqe(struct dbmdx_private *p, + u32 command, u16 *response); +int spi_verify_boot_checksum(struct dbmdx_private *p, + const void *checksum, size_t chksum_len); +int spi_verify_chip_id(struct dbmdx_private *p); +int spi_common_probe(struct spi_device *client); +int spi_common_remove(struct spi_device *client); +int spi_set_speed(struct dbmdx_private *p, int index); +void spi_interface_resume(struct dbmdx_spi_private *spi_p); +void spi_interface_suspend(struct dbmdx_spi_private *spi_p); + +#endif diff --git a/sound/soc/codecs/dbmdx/dbmdx-uart-d2.c b/sound/soc/codecs/dbmdx/dbmdx-uart-d2.c new file mode 100755 index 000000000000..41d424f6236c --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-uart-d2.c @@ -0,0 +1,684 @@ +/* + * DSPG DBMD2 UART interface driver + * + * Copyright (C) 2014 DSP Group + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +/* #define DEBUG */ +#include <linux/kernel.h> +#include <linux/delay.h> +#include <linux/slab.h> +#include <linux/module.h> +#include <linux/mutex.h> +#if IS_ENABLED(CONFIG_OF) +#include <linux/of.h> +#endif +#include <linux/tty.h> +#include <linux/kthread.h> +#include <linux/platform_device.h> +#include <linux/uaccess.h> +#include <linux/firmware.h> + +#include "dbmdx-interface.h" +#include "dbmdx-va-regmap.h" +#include "dbmdx-uart-sbl-d2.h" +#include "dbmdx-uart.h" + +/* baud rate used during fw upload */ +#define UART_TTY_MAX_BAUD_RATE 3000000 +/* baud rate used during boot-up */ +#define UART_TTY_BOOT_BAUD_RATE 115200 +/* baud rate used during fast boot-up */ +#define UART_TTY_FAST_BOOT_BAUD_RATE 230400 +/* baud rate used when in normal command mode */ +#define UART_TTY_NORMAL_BAUD_RATE 57600 +/* number of stop bits during boot-up */ +#define UART_TTY_BOOT_STOP_BITS 2 +/* number of stop bits during normal operation */ +#define UART_TTY_NORMAL_STOP_BITS 1 +/* parity during boot-up */ +#define UART_TTY_BOOT_PARITY 1 +/* parity during normal operation */ +#define UART_TTY_NORMAL_PARITY 0 + + + +#define UART_SYNC_LENGTH 300 /* in msec */ +#define UART_SYNC_MIN_BUFFER_LEN 128 /* in bytes */ + +static const u8 clr_crc[] = {0x5A, 0x03, 0x52, 0x0a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00}; + +static int dbmd2_uart_boot_rate_by_clk(struct dbmdx_private *p, + enum dbmd2_xtal_id clk_id); + + +static int dbmd2_uart_prepare_boot(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + uart_p->boot_baud_rate = dbmd2_uart_boot_rate_by_clk(p, p->clk_type); + uart_p->boot_parity = UART_TTY_BOOT_PARITY; + uart_p->boot_stop_bits = UART_TTY_BOOT_STOP_BITS; + uart_p->normal_parity = UART_TTY_NORMAL_PARITY; + uart_p->normal_stop_bits = UART_TTY_NORMAL_STOP_BITS; + dev_dbg(uart_p->dev, "%s: lookup TTY band rate = %d\n", + __func__, uart_p->boot_baud_rate); + + /* Send init sequence for up to 100ms at 115200baud. + * 1 start bit, 8 data bits, 1 parity bit, 2 stop bits = 12 bits + * FIXME: make sure it is multiple of 8 + */ + uart_p->boot_lock_buffer_size = ((uart_p->boot_baud_rate / 12) * + UART_SYNC_LENGTH) / 1000; + + if (uart_p->boot_lock_buffer_size < UART_SYNC_MIN_BUFFER_LEN) + uart_p->boot_lock_buffer_size = UART_SYNC_MIN_BUFFER_LEN; + + return 0; +} + + +static int dbmd2_uart_sync(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int rc; + char *buf; + int i; + + size_t size = uart_p->boot_lock_buffer_size; + + dev_info(p->dev, "%s: start boot sync\n", __func__); + + buf = kzalloc(size, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + for (i = 0; i < size; i += 8) { + buf[i] = 0x00; + buf[i+1] = 0x00; + buf[i+2] = 0x00; + buf[i+3] = 0x00; + buf[i+4] = 0x00; + buf[i+5] = 0x00; + buf[i+6] = 0x41; + buf[i+7] = 0x63; + } + + if (uart_p->boot_lock_buffer_size == UART_SYNC_MIN_BUFFER_LEN) + rc = uart_write_data(p, (void *)buf, size); + else + rc = uart_write_data_no_sync(p, (void *)buf, size); + + if (rc != size) + dev_err(uart_p->dev, "%s: sync buffer not sent correctly\n", + __func__); + + /* release chip from reset */ + if (p->clk_get_rate(p, DBMDX_CLK_MASTER) > 32768) + p->reset_release(p); + + kfree(buf); + /* check if synchronization succeeded */ + usleep_range(300, 400); + rc = uart_wait_for_ok(p); + if (rc != 0) { + dev_err(p->dev, "%s: boot fail: no sync found err = %d\n", + __func__, rc); + return -EAGAIN; + } + + uart_flush_rx_fifo(uart_p); + + dev_dbg(p->dev, "%s: boot sync successfully\n", __func__); + + return rc; +} + + + +static int dbmd2_uart_reset(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret = 0; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + + /* set baudrate to BOOT baud */ + ret = uart_configure_tty(uart_p, + uart_p->boot_baud_rate, + uart_p->boot_stop_bits, + uart_p->boot_parity, 0); + if (ret) { + dev_err(p->dev, "%s: cannot configure tty to: %us%up%uf%u\n", + __func__, + uart_p->boot_baud_rate, + uart_p->boot_stop_bits, + uart_p->boot_parity, + 0); + return -EIO; + } + + uart_flush_rx_fifo(uart_p); + + usleep_range(DBMDX_USLEEP_UART_D2_BEFORE_RESET, + DBMDX_USLEEP_UART_D2_BEFORE_RESET + 10000); + + dev_dbg(p->dev, "%s: start boot sync\n", __func__); + + /* put chip in reset */ + p->reset_set(p); + + usleep_range(1000, 1100); + /* delay before sending commands */ + + if (p->clk_get_rate(p, DBMDX_CLK_MASTER) <= 32768) { + p->reset_release(p); + msleep(DBMDX_MSLEEP_UART_D2_AFTER_RESET_32K); + } else + usleep_range(DBMDX_USLEEP_UART_D2_AFTER_RESET, + DBMDX_USLEEP_UART_D2_AFTER_RESET + 5000); + + /* check if firmware sync is ok */ + ret = dbmd2_uart_sync(p); + if (ret != 0) { + dev_err(uart_p->dev, "%s: sync failed, no OK from firmware\n", + __func__); + return -EAGAIN; + } + + dev_dbg(p->dev, "%s: boot sync successful\n", __func__); + + uart_flush_rx_fifo(uart_p); + + return 0; +} + + +static int dbmd2_uart_boot_rate_by_clk(struct dbmdx_private *p, + enum dbmd2_xtal_id clk_id) +{ + int ret = BOOT_TTY_BAUD_115200; + int j; + + for (j = 0; j < ARRAY_SIZE(sbl_map); j++) { + if (sbl_map[j].id == clk_id) + return sbl_map[j].boot_tty_rate; + } + + dev_warn(p->dev, + "%s: can't match rate for clk:%d. falling back to dflt\n", + __func__, clk_id); + + return ret; +} + +static int dbmd2_uart_sbl_search(struct dbmdx_private *p, + enum dbmd2_xtal_id clk_id) +{ + int ret = -1; + int j; + + for (j = 0; j < ARRAY_SIZE(sbl_map); j++) { + if (sbl_map[j].id == clk_id) { + dev_dbg(p->dev, "%s: found sbl type %d size %d", + __func__, + sbl_map[j].id, sbl_map[j].img_len); + p->sbl_data = sbl_map[j].img_data; + return sbl_map[j].img_len; + } + } + return ret; +} + +static int dbmd2_uart_load_firmware(const void *fw_data, size_t fw_size, + struct dbmdx_private *p, const void *checksum, + size_t chksum_len) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret = 0; + int sbl_len = 0; + + if (!(p->cur_boot_options & DBMDX_BOOT_OPT_DONT_SENT_SBL)) { + + /* search proper sbl image */ + sbl_len = dbmd2_uart_sbl_search(p, p->clk_type); + if (sbl_len < 0) { + dev_err(p->dev, + "%s: ---------> can not find proper sbl img\n", + __func__); + return -EIO; + } + + /* send SBL */ + ret = uart_write_data(p, (void *)p->sbl_data, sbl_len); + if (ret != sbl_len) { + dev_err(p->dev, "%s: ---------> load sbl error\n", + __func__); + return -EIO; + } + + /* check if SBL is ok */ + ret = uart_wait_for_ok(p); + if (ret != 0) { + dev_err(p->dev, + "%s: sbl does not respond with ok\n", __func__); + return -EIO; + } + } + + /* set baudrate to FW upload speed */ + ret = uart_set_speed_host_only(p, DBMDX_VA_SPEED_MAX); + + if (ret) { + dev_err(p->dev, "%s: failed to send change speed command\n", + __func__); + return -EIO; + } + /* verify chip id */ + if (p->cur_boot_options & DBMDX_BOOT_OPT_VERIFY_CHIP_ID) { + ret = uart_verify_chip_id(p); + if (ret < 0) { + dev_err(p->dev, "%s: couldn't verify chip id\n", + __func__); + return -EIO; + } + } + + if (!(p->cur_boot_options & DBMDX_BOOT_OPT_DONT_CLR_CRC)) { + /* send CRC clear command */ + ret = uart_write_data(p, clr_crc, sizeof(clr_crc)); + if (ret != sizeof(clr_crc)) { + dev_err(p->dev, "%s: failed to clear CRC\n", __func__); + return -EIO; + } + } + + /* send firmware */ + ret = uart_write_data(p, fw_data, fw_size - 4); + if (ret != (fw_size - 4)) { + dev_err(p->dev, "%s: -----------> load firmware error\n", + __func__); + return -EIO; + } + /* verify checksum */ + if (checksum && !(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_VERIFY_CRC)) { + msleep(DBMDX_MSLEEP_UART_WAIT_FOR_CHECKSUM); + ret = uart_verify_boot_checksum(p, checksum, chksum_len); + if (ret < 0) { + dev_err(uart_p->dev, + "%s: could not verify checksum\n", + __func__); + return -EIO; + } + } + + dev_info(p->dev, "%s: ---------> firmware loaded\n", __func__); + + return 0; +} + +static int dbmd2_uart_boot(const void *fw_data, size_t fw_size, + struct dbmdx_private *p, const void *checksum, + size_t chksum_len, int load_fw) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int reset_retry = RETRY_COUNT; + int fw_load_retry = RETRY_COUNT; + int ret; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + do { + if (!(p->boot_mode & DBMDX_BOOT_MODE_RESET_DISABLED)) { + + reset_retry = RETRY_COUNT; + do { + ret = dbmd2_uart_reset(p); + if (ret == 0) + break; + } while (--reset_retry); + + /* Unable to reset device */ + if (reset_retry <= 0) { + dev_err(p->dev, + "%s, reset device err\n", __func__); + return -ENODEV; + } + } else { + /* If failed and reset is disabled, break */ + if (fw_load_retry != RETRY_COUNT) { + fw_load_retry = -1; + break; + } + /* set baudrate to BOOT baud */ + ret = uart_configure_tty(uart_p, + uart_p->boot_baud_rate, + uart_p->boot_stop_bits, + uart_p->boot_parity, 0); + if (ret) { + dev_err(p->dev, + "%s: cannot configure tty to: %us%up%uf%u\n", + __func__, + uart_p->boot_baud_rate, + uart_p->boot_stop_bits, + uart_p->boot_parity, + 0); + return -ENODEV; + } + + uart_flush_rx_fifo(uart_p); + + usleep_range(DBMDX_USLEEP_UART_D2_BEFORE_RESET, + DBMDX_USLEEP_UART_D2_BEFORE_RESET + 10000); + } + + /* stop here if firmware does not need to be reloaded */ + if (load_fw) { + + ret = dbmd2_uart_load_firmware(fw_data, fw_size, p, + checksum, chksum_len); + + if (ret != 0) { + dev_err(p->dev, "%s: failed to load firwmare\n", + __func__); + continue; + } + } + + if (!(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_SEND_START_BOOT)) { + /* send boot command */ + ret = send_uart_cmd_boot(p, DBMDX_FIRMWARE_BOOT); + if (ret) { + dev_err(p->dev, + "%s: booting the firmware failed\n", __func__); + continue; + } + } + + ret = uart_set_speed_host_only(p, DBMDX_VA_SPEED_BUFFERING); + + if (ret) { + dev_err(p->dev, + "%s: failed to send change speed command\n", + __func__); + continue; + } + + msleep(DBMDX_MSLEEP_UART_D2_AFTER_LOAD_FW); + + /* everything went well */ + break; + } while (--fw_load_retry); + + if (fw_load_retry <= 0) { + dev_err(p->dev, "%s: exceeded max attepmts to load fw\n", + __func__); + return -EIO; + } + + return 0; +} + +static int dbmd2_uart_finish_boot(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + return 0; +} + +static int dbmd2_uart_set_vqe_firmware_ready(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + return 0; +} + +static int dbmd2_uart_prepare_buffering(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret = 0; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + if (p->pdata->uart_low_speed_enabled) { + + ret = uart_set_speed(p, DBMDX_VA_SPEED_BUFFERING); + + if (ret) { + dev_err(p->dev, + "%s: failed to send change speed command\n", + __func__); + goto out; + } + } +out: + return ret; +} + +static int dbmd2_uart_finish_buffering(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret = 0; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + if (p->pdata->uart_low_speed_enabled) { + + ret = uart_set_speed(p, DBMDX_VA_SPEED_NORMAL); + if (ret) { + dev_err(p->dev, + "%s: failed to send change speed command\n", + __func__); + goto out; + } + } +out: + return ret; +} + +static int dbmd2_uart_prepare_amodel_loading(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret = 0; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + if (p->pdata->uart_low_speed_enabled) { + + ret = uart_set_speed(p, DBMDX_VA_SPEED_BUFFERING); + + if (ret) { + dev_err(p->dev, + "%s: failed to send change speed command\n", + __func__); + goto out; + } + } + +out: + return ret; +} + +static int dbmd2_uart_finish_amodel_loading(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + /* do the same as for finishing buffering */ + return dbmd2_uart_finish_buffering(p); +} + +#if IS_ENABLED(CONFIG_PM_SLEEP) +static int dbmdx_uart_suspend(struct device *dev) +{ + struct chip_interface *ci = dev_get_drvdata(dev); + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + + uart_interface_suspend(uart_p); + + return 0; +} + +static int dbmdx_uart_resume(struct device *dev) +{ + struct chip_interface *ci = dev_get_drvdata(dev); + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + uart_interface_resume(uart_p); + + return 0; +} +#else +#define dbmdx_uart_suspend NULL +#define dbmdx_uart_resume NULL +#endif /* CONFIG_PM_SLEEP */ + +#if IS_ENABLED(CONFIG_PM) +static int dbmdx_uart_runtime_suspend(struct device *dev) +{ + struct chip_interface *ci = dev_get_drvdata(dev); + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + + uart_interface_suspend(uart_p); + + return 0; +} + +static int dbmdx_uart_runtime_resume(struct device *dev) +{ + struct chip_interface *ci = dev_get_drvdata(dev); + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + uart_interface_resume(uart_p); + + return 0; +} +#else +#define dbmdx_uart_runtime_suspend NULL +#define dbmdx_uart_runtime_resume NULL +#endif /* CONFIG_PM */ + +static const struct dev_pm_ops dbmdx_uart_pm = { + SET_SYSTEM_SLEEP_PM_OPS(dbmdx_uart_suspend, dbmdx_uart_resume) + SET_RUNTIME_PM_OPS(dbmdx_uart_runtime_suspend, + dbmdx_uart_runtime_resume, NULL) +}; + + +static int uart_probe(struct platform_device *pdev) +{ + int rc; + struct dbmdx_uart_private *p; + struct chip_interface *ci; + + rc = uart_common_probe(pdev, "dbmd2 uart probe thread"); + + if (rc < 0) + return rc; + + ci = dev_get_drvdata(&pdev->dev); + p = (struct dbmdx_uart_private *)ci->pdata; + + /* fill in chip interface functions */ + p->chip.prepare_boot = dbmd2_uart_prepare_boot; + p->chip.boot = dbmd2_uart_boot; + p->chip.finish_boot = dbmd2_uart_finish_boot; + p->chip.set_vqe_firmware_ready = dbmd2_uart_set_vqe_firmware_ready; + p->chip.prepare_buffering = dbmd2_uart_prepare_buffering; + p->chip.finish_buffering = dbmd2_uart_finish_buffering; + p->chip.prepare_amodel_loading = dbmd2_uart_prepare_amodel_loading; + p->chip.finish_amodel_loading = dbmd2_uart_finish_amodel_loading; + return rc; +} + + +static const struct of_device_id dbmd2_uart_of_match[] = { + { .compatible = "dspg,dbmd2-uart", }, + {}, +}; +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX) +MODULE_DEVICE_TABLE(of, dbmd2_uart_of_match); +#endif + +static struct platform_driver dbmd2_uart_platform_driver = { + .driver = { + .name = "dbmd2-uart", + .owner = THIS_MODULE, +#if IS_ENABLED(CONFIG_OF) + .of_match_table = dbmd2_uart_of_match, +#endif + .pm = &dbmdx_uart_pm, + }, + .probe = uart_probe, + .remove = uart_common_remove, +}; + +#if (IS_ENABLED(CONFIG_SND_SOC_DBMDX) && !IS_MODULE(CONFIG_SND_SOC_DBMDX)) +static int __init dbmd2_modinit(void) +{ + return platform_driver_register(&dbmd2_uart_platform_driver); +} +module_init(dbmd2_modinit); + +static void __exit dbmd2_exit(void) +{ + platform_driver_unregister(&dbmd2_uart_platform_driver); +} +module_exit(dbmd2_exit); +#else +int dbmd2_uart_init_interface(void) +{ + platform_driver_register(&dbmd2_uart_platform_driver); + return 0; +} + +void dbmd2_uart_deinit_interface(void) +{ + platform_driver_unregister(&dbmd2_uart_platform_driver); +} + +int (*dbmdx_init_interface)(void) = &dbmd2_uart_init_interface; +void (*dbmdx_deinit_interface)(void) = &dbmd2_uart_deinit_interface; +#endif + +MODULE_DESCRIPTION("DSPG DBMD2 UART interface driver"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/dbmdx/dbmdx-uart-d4.c b/sound/soc/codecs/dbmdx/dbmdx-uart-d4.c new file mode 100755 index 000000000000..5d4bf8538a50 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-uart-d4.c @@ -0,0 +1,699 @@ +/* + * DSPG DBMD4/DBMD6/DBMD8 UART interface driver + * + * Copyright (C) 2014 DSP Group + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +/* #define DEBUG */ +#include <linux/kernel.h> +#include <linux/delay.h> +#include <linux/slab.h> +#include <linux/module.h> +#include <linux/mutex.h> +#if IS_ENABLED(CONFIG_OF) +#include <linux/of.h> +#endif +#include <linux/tty.h> +#include <linux/kthread.h> +#include <linux/platform_device.h> +#include <linux/uaccess.h> +#include <linux/firmware.h> + +#include "dbmdx-interface.h" +#include "dbmdx-va-regmap.h" +#include "dbmdx-uart.h" + +/* baud rate used during fw upload */ +#define UART_TTY_MAX_BAUD_RATE 4000000 +/* number of stop bits during boot-up */ +#define UART_TTY_BOOT_STOP_BITS 1 +/* number of stop bits during normal operation */ +#define UART_TTY_NORMAL_STOP_BITS 1 +/* parity during boot-up */ +#define UART_TTY_BOOT_PARITY 0 +/* parity during normal operation */ +#define UART_TTY_NORMAL_PARITY 0 + + +static const u8 read_divider[6] = {0x5a, 0x07, 0x0c, 0x00, 0x00, 0x00}; + + +static int dbmd4_uart_prepare_boot(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + uart_p->boot_baud_rate = UART_TTY_MAX_BAUD_RATE; + uart_p->boot_parity = UART_TTY_BOOT_PARITY; + uart_p->boot_stop_bits = UART_TTY_BOOT_STOP_BITS; + uart_p->normal_parity = UART_TTY_NORMAL_PARITY; + uart_p->normal_stop_bits = UART_TTY_NORMAL_STOP_BITS; + dev_dbg(uart_p->dev, "%s: lookup TTY band rate = %d\n", + __func__, uart_p->boot_baud_rate); + + return 0; +} + + + +#define DBMD4_UART_SYNC_LENGTH 20 + +static int dbmd4_uart_sync(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int rc; + u8 sync_buf[DBMD4_UART_SYNC_LENGTH]; + u8 rx_divider[6]; + u32 divider; + u32 expected_divider; + u32 clock_rate; + + dev_info(p->dev, "%s: start boot sync\n", __func__); + + memset(sync_buf, 0, sizeof(sync_buf)); + memset(rx_divider, 0, sizeof(rx_divider)); + + rc = uart_write_data(p, (void *)sync_buf, DBMD4_UART_SYNC_LENGTH); + + if (rc != DBMD4_UART_SYNC_LENGTH) + dev_err(uart_p->dev, "%s: sync buffer not sent correctly\n", + __func__); + + /* check if synchronization succeeded */ + usleep_range(300, 400); + rc = uart_wait_for_ok(p); + if (rc != 0) { + dev_err(p->dev, "%s: boot fail: no sync found err = %d\n", + __func__, rc); + return -EAGAIN; + } + + uart_flush_rx_fifo(uart_p); + + clock_rate = p->master_pll_rate; + + if (clock_rate == 0) { + dev_info(uart_p->dev, + "%s: No master clock defined, cannot verify divider\n", + __func__); + return 0; + } + + /* Read divider register to verify that baud rate was locked + * successfully + */ + rc = uart_write_data(p, read_divider, sizeof(read_divider)); + if (rc != sizeof(read_divider)) { + dev_err(uart_p->dev, "%s: could not read divider (send)\n", + __func__); + return -EAGAIN; + } + + rc = uart_read_data(p, rx_divider, 6); + if (rc < 0) { + dev_err(uart_p->dev, + "%s: could not read divider data (receive)\n", + __func__); + return -EAGAIN; + } + + if ((rx_divider[0] != read_divider[0]) || + (rx_divider[1] != read_divider[1])) { + dev_err(uart_p->dev, + "%s: could not read divider data (mismatch)\n", + __func__); + dev_err(uart_p->dev, + "%s: %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n", + __func__, rx_divider[0], rx_divider[1], rx_divider[2], + rx_divider[3], rx_divider[4], rx_divider[5]); + return -EAGAIN; + } + + divider = (u32)(rx_divider[2]) + + (((u32)(rx_divider[3]) << 8) & 0x0000ff00) + + (((u32)(rx_divider[4]) << 16) & 0x00ff0000) + + (((u32)(rx_divider[5]) << 24) & 0xff000000); + + + expected_divider = ((u32)(clock_rate / uart_p->normal_baud_rate) % 16); + + if (expected_divider != divider) { + dev_err(uart_p->dev, + "%s: divider mismatch: expected %u, received %u\n", + __func__, expected_divider, divider); + + } + + dev_dbg(p->dev, "%s: boot sync successfully\n", __func__); + + return 0; +} + + + +static int dbmd4_uart_reset(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret = 0; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + + /* set baudrate to FW upload speed */ + ret = uart_set_speed_host_only(p, DBMDX_VA_SPEED_MAX); + + if (ret) { + dev_err(p->dev, "%s: failed configure uart\n", + __func__); + return -EIO; + } + + + uart_flush_rx_fifo(uart_p); + + dev_dbg(p->dev, "%s: start boot sync\n", __func__); + + if (!(p->boot_mode & DBMDX_BOOT_MODE_RESET_DISABLED)) + /* reset the chip */ + p->reset_sequence(p); + + /* delay before sending commands */ + if (p->clk_get_rate(p, DBMDX_CLK_MASTER) <= 32768) + msleep(DBMDX_MSLEEP_UART_D4_AFTER_RESET_32K); + else + usleep_range(DBMDX_USLEEP_UART_D4_AFTER_RESET, + DBMDX_USLEEP_UART_D4_AFTER_RESET + 5000); + + if (!(p->cur_boot_options & DBMDX_BOOT_OPT_VA_NO_UART_SYNC)) { + + /* check if firmware sync is ok */ + ret = dbmd4_uart_sync(p); + if (ret != 0) { + dev_err(uart_p->dev, "%s: sync failed\n", + __func__); + return -EAGAIN; + } + + dev_dbg(p->dev, "%s: boot sync successful\n", __func__); + } + + uart_flush_rx_fifo(uart_p); + + return 0; +} + + +static int dbmd4_uart_load_firmware(const void *fw_data, size_t fw_size, + struct dbmdx_private *p, const void *checksum, + size_t chksum_len) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret; + + /* verify chip id */ + if (p->cur_boot_options & DBMDX_BOOT_OPT_VERIFY_CHIP_ID) { + ret = uart_verify_chip_id(p); + if (ret < 0) { + dev_err(p->dev, "%s: couldn't verify chip id\n", + __func__); + return -EIO; + } + } + + if (!(p->cur_boot_options & DBMDX_BOOT_OPT_DONT_CLR_CRC)) { + /* send CRC clear command */ + ret = send_uart_cmd_boot(p, DBMDX_CLEAR_CHECKSUM); + if (ret) { + dev_err(p->dev, "%s: failed to clear CRC\n", __func__); + return -EIO; + } + } + + /* send firmware */ + ret = uart_write_data(p, fw_data, fw_size - 4); + if (ret != (fw_size - 4)) { + dev_err(p->dev, "%s: -----------> load firmware error\n", + __func__); + return -EIO; + } + + /* verify checksum */ + if (checksum && !(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_VERIFY_CRC)) { + ret = uart_verify_boot_checksum(p, checksum, chksum_len); + if (ret < 0) { + dev_err(uart_p->dev, + "%s: could not verify checksum\n", + __func__); + return -EIO; + } + } + + dev_info(p->dev, "%s: ---------> firmware loaded\n", __func__); + + return 0; +} + +static int dbmd4_uart_boot(const void *fw_data, size_t fw_size, + struct dbmdx_private *p, const void *checksum, + size_t chksum_len, int load_fw) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int reset_retry = RETRY_COUNT; + int fw_load_retry = RETRY_COUNT; + int ret; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + do { + if ((p->boot_mode & DBMDX_BOOT_MODE_RESET_DISABLED) && + (fw_load_retry != RETRY_COUNT)) { + fw_load_retry = -1; + break; + } + + reset_retry = RETRY_COUNT; + do { + ret = dbmd4_uart_reset(p); + if (ret == 0) + break; + } while (--reset_retry); + + /* Unable to reset device */ + if (reset_retry <= 0) { + dev_err(p->dev, "%s, reset device err\n", + __func__); + return -ENODEV; + } + + /* stop here if firmware does not need to be reloaded */ + if (load_fw) { + + ret = dbmd4_uart_load_firmware(fw_data, fw_size, p, + checksum, chksum_len); + + if (ret != 0) { + dev_err(p->dev, "%s: failed to load firwmare\n", + __func__); + continue; + } + } + + if (!(p->cur_boot_options & + DBMDX_BOOT_OPT_DONT_SEND_START_BOOT)) { + /* send boot command */ + ret = send_uart_cmd_boot(p, DBMDX_FIRMWARE_BOOT); + if (ret) { + dev_err(p->dev, + "%s: booting the firmware failed\n", __func__); + continue; + } + } + + usleep_range(DBMDX_USLEEP_UART_D4_AFTER_LOAD_FW, + DBMDX_USLEEP_UART_D4_AFTER_LOAD_FW + 1000); + + /* everything went well */ + break; + } while (--fw_load_retry); + + if (fw_load_retry <= 0) { + dev_err(p->dev, "%s: exceeded max attepmts to load fw\n", + __func__); + return -EIO; + } + + return 0; +} + +static int dbmd4_uart_reset_post_pll_divider(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + ret = send_uart_cmd_va(p, + DBMDX_VA_GENERAL_CONFIGURATION_2, + &uart_p->post_pll_div); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to get post pll divider\n", + __func__); + return ret; + } + + + ret = send_uart_cmd_va(p, + DBMDX_VA_GENERAL_CONFIGURATION_2 | + (uart_p->post_pll_div & ~DBMDX_POST_PLL_DIV_MASK), + NULL); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to get post pll divider\n", + __func__); + return ret; + } + + return 0; +} + +static int dbmd4_uart_restore_post_pll_divider(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + ret = send_uart_cmd_va(p, + DBMDX_VA_GENERAL_CONFIGURATION_2 | + uart_p->post_pll_div, + NULL); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to restore post pll divider\n", + __func__); + return ret; + } + + return 0; +} + +static int dbmd4_uart_switch_to_buffering_speed(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + ret = dbmd4_uart_reset_post_pll_divider(p); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed, cannot reset post pll divider\n", + __func__); + return ret; + } + + ret = uart_set_speed(p, DBMDX_VA_SPEED_BUFFERING); + + if (ret < 0) { + dev_err(uart_p->dev, "%s:failed setting speed %x\n", + __func__, ret); + return ret; + } + + return 0; +} + +static int dbmd4_uart_switch_to_normal_speed(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + ret = uart_set_speed(p, DBMDX_VA_SPEED_NORMAL); + + if (ret < 0) { + dev_err(uart_p->dev, "%s:failed setting speed %x\n", + __func__, ret); + return ret; + } + + + ret = dbmd4_uart_restore_post_pll_divider(p); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed, cannot restore post pll divider\n", + __func__); + return ret; + } + + return 0; +} + +static int dbmd4_uart_prepare_buffering(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret = 0; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + if (p->pdata->uart_low_speed_enabled) { + + ret = dbmd4_uart_switch_to_buffering_speed(p); + + if (ret) { + dev_err(p->dev, + "%s: failed to send change speed command\n", + __func__); + goto out; + } + } + +out: + return ret; +} + +static int dbmd4_uart_finish_buffering(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret = 0; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + if (p->pdata->uart_low_speed_enabled) { + + ret = dbmd4_uart_switch_to_normal_speed(p); + + if (ret) { + dev_err(p->dev, + "%s: failed to send change speed command\n", + __func__); + goto out; + } + } + +out: + return ret; +} + + +static int dbmd4_uart_prepare_amodel_loading(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret = 0; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + if (p->pdata->uart_low_speed_enabled) { + + ret = dbmd4_uart_switch_to_buffering_speed(p); + + if (ret) { + dev_err(p->dev, + "%s: failed to send change speed command\n", + __func__); + goto out; + } + } + +out: + return ret; + +} + +static int dbmd4_uart_finish_amodel_loading(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret = 0; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + if (p->pdata->uart_low_speed_enabled) { + + ret = dbmd4_uart_switch_to_normal_speed(p); + + if (ret) { + dev_err(p->dev, + "%s: failed to send change speed command\n", + __func__); + goto out; + } + } + +out: + return ret; +} + +#if IS_ENABLED(CONFIG_PM_SLEEP) +static int dbmdx_uart_suspend(struct device *dev) +{ + struct chip_interface *ci = dev_get_drvdata(dev); + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + + uart_interface_suspend(uart_p); + + return 0; +} + +static int dbmdx_uart_resume(struct device *dev) +{ + struct chip_interface *ci = dev_get_drvdata(dev); + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + uart_interface_resume(uart_p); + + return 0; +} +#else +#define dbmdx_uart_suspend NULL +#define dbmdx_uart_resume NULL +#endif /* CONFIG_PM_SLEEP */ + +#if IS_ENABLED(CONFIG_PM) +static int dbmdx_uart_runtime_suspend(struct device *dev) +{ + struct chip_interface *ci = dev_get_drvdata(dev); + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + + uart_interface_suspend(uart_p); + + return 0; +} + +static int dbmdx_uart_runtime_resume(struct device *dev) +{ + struct chip_interface *ci = dev_get_drvdata(dev); + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)ci->pdata; + + dev_dbg(dev, "%s\n", __func__); + uart_interface_resume(uart_p); + + return 0; +} +#else +#define dbmdx_uart_runtime_suspend NULL +#define dbmdx_uart_runtime_resume NULL +#endif /* CONFIG_PM */ + + +static const struct dev_pm_ops dbmdx_uart_pm = { + SET_SYSTEM_SLEEP_PM_OPS(dbmdx_uart_suspend, dbmdx_uart_resume) + SET_RUNTIME_PM_OPS(dbmdx_uart_runtime_suspend, + dbmdx_uart_runtime_resume, NULL) +}; + +static int dbmd4_uart_probe(struct platform_device *pdev) +{ + int rc; + struct dbmdx_uart_private *p; + struct chip_interface *ci; + + rc = uart_common_probe(pdev, "dbmd4 uart probe thread"); + + if (rc < 0) + return rc; + + ci = dev_get_drvdata(&pdev->dev); + p = (struct dbmdx_uart_private *)ci->pdata; + + /* fill in chip interface functions */ + p->chip.prepare_boot = dbmd4_uart_prepare_boot; + p->chip.prepare_amodel_loading = dbmd4_uart_prepare_amodel_loading; + p->chip.finish_amodel_loading = dbmd4_uart_finish_amodel_loading; + p->chip.prepare_buffering = dbmd4_uart_prepare_buffering; + p->chip.finish_buffering = dbmd4_uart_finish_buffering; + p->chip.boot = dbmd4_uart_boot; + + return rc; +} + + +static const struct of_device_id dbmd_4_8_uart_of_match[] = { + { .compatible = "dspg,dbmdx-uart", }, + { .compatible = "dspg,dbmd4-uart", }, + { .compatible = "dspg,dbmd6-uart", }, + { .compatible = "dspg,dbmd8-uart", }, + {}, +}; +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX) +MODULE_DEVICE_TABLE(of, dbmd_4_8_uart_of_match); +#endif + +static struct platform_driver dbmd_4_8_uart_platform_driver = { + .driver = { + .name = "dbmd_4_8-uart", + .owner = THIS_MODULE, +#if IS_ENABLED(CONFIG_OF) + .of_match_table = dbmd_4_8_uart_of_match, +#endif + .pm = &dbmdx_uart_pm, + }, + .probe = dbmd4_uart_probe, + .remove = uart_common_remove, +}; + +#if (IS_ENABLED(CONFIG_SND_SOC_DBMDX) && !IS_MODULE(CONFIG_SND_SOC_DBMDX)) +static int __init dbmd_4_8_modinit(void) +{ + return platform_driver_register(&dbmd_4_8_uart_platform_driver); +} +module_init(dbmd_4_8_modinit); + +static void __exit dbmd_4_8_exit(void) +{ + platform_driver_unregister(&dbmd_4_8_uart_platform_driver); +} +module_exit(dbmd_4_8_exit); +#else +int dbmd4_uart_init_interface(void) +{ + return platform_driver_register(&dbmd_4_8_uart_platform_driver); +} + +void dbmd4_uart_deinit_interface(void) +{ + platform_driver_unregister(&dbmd_4_8_uart_platform_driver); +} + +int (*dbmdx_init_interface)(void) = &dbmd4_uart_init_interface; +void (*dbmdx_deinit_interface)(void) = &dbmd4_uart_deinit_interface; +#endif + +MODULE_DESCRIPTION("DSPG DBMD4/DBMD6/DBMD8 UART interface driver"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/dbmdx/dbmdx-uart-sbl-d2.h b/sound/soc/codecs/dbmdx/dbmdx-uart-sbl-d2.h new file mode 100755 index 000000000000..9044ec75129c --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-uart-sbl-d2.h @@ -0,0 +1,398 @@ +/* + * dbmdx-uart-sbl-d2.h -- DBMD2 SBL for UART + * + * Copyright (C) 2014 DSP Group + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _DBMDX_UART_SBL_D2_H +#define _DBMDX_UART_SBL_D2_H + +#include "dbmdx-interface.h" + +#define BOOT_TTY_BAUD_115200 115200 +#define BOOT_TTY_BAUD_57600 57600 +#define BOOT_TTY_BAUD_300 300 + +#define SBL_SET_IMG(en, x, y) \ + { .id = en, \ + .img_data = x, \ + .img_len = ARRAY_SIZE(x), \ + .boot_tty_rate = y \ + } + +struct sbl_record { + enum dbmd2_xtal_id id; + unsigned char *img_data; + int img_len; + int boot_tty_rate; +}; + + +static unsigned char sbl_24m_img1[] = { + 0x5a, 0x01, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x43, 0x5e, 0x4f, 0x23, 0xb6, 0xd4, + 0x2c, 0x27, 0x40, 0xfa, 0xc1, 0x05, 0x4b, 0x23, + 0x40, 0xfa, 0xc1, 0x05, 0x00, 0x23, 0x40, 0xfa, + 0xc1, 0x05, 0x24, 0x23, 0x43, 0xfa, 0xc0, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x0a, + 0x80, 0x17, 0x0b, 0x5e, 0x01, 0x00, 0x9b, 0xde, + 0x60, 0x00, 0x2f, 0x31, 0x4b, 0x59, 0x03, 0x59, + 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, 0x04, 0x00, + 0x40, 0xfa, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0x80, 0x01, 0xff, 0xef, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x40, 0xfa, + 0xc1, 0x05, 0x00, 0x5e, 0x00, 0x04, 0x1c, 0x27, + 0x40, 0xfa, 0xc1, 0x05, 0x14, 0x23, 0x43, 0xfa, + 0xc0, 0x05, 0x48, 0xfc, 0x81, 0x01, 0x00, 0x02, + 0x20, 0x00, 0x40, 0xfa, 0xc1, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0xfc, 0x80, 0x01, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xfa, 0xc1, 0x05, 0x48, 0xfc, 0x80, 0x01, + 0x00, 0x00, 0x64, 0x80, 0x10, 0xfe, 0xc3, 0x05, + 0xd9, 0x09, 0x10, 0xfe, 0xc0, 0x05, 0xcc, 0x09, + 0x08, 0x27, 0x03, 0x23, 0x40, 0xfa, 0xc1, 0x05, + 0x01, 0x23, 0x0c, 0x27, 0x40, 0xfa, 0xc1, 0x05, + 0x04, 0x23, 0x43, 0xfa, 0xc0, 0x05, 0x00, 0x00, + 0xd6, 0xd4, 0x90, 0x45, 0x63, 0x5e, 0xb6, 0xd4, + 0x8b, 0xd4, 0xd6, 0xd4, 0x80, 0x45, 0x00, 0x00, + 0x80, 0x45, 0x48, 0xfc, 0x80, 0x01, 0xda, 0xba, + 0x01, 0x19, 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, + 0x28, 0x00, 0x40, 0xfa, 0xc1, 0x05, 0x00, 0x5e, + 0x00, 0x01, 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, + 0x2c, 0x00, 0x40, 0xfa, 0xc1, 0x05, 0x90, 0x45, + 0x01, 0x21, 0xd8, 0xfc, 0x89, 0x09, 0xe0, 0x6f, + 0xc8, 0x96, 0x88, 0xfb, 0x89, 0x03, 0x00, 0x10, + 0x00, 0x00, 0xaa, 0x91, 0x8b, 0xff, 0x9b, 0x0f, + 0x8f, 0xff, 0x80, 0xef, 0x48, 0xfc, 0x82, 0x01, + 0x00, 0x03, 0x00, 0x00, 0x08, 0xfc, 0x80, 0x01, + 0x00, 0x00, 0x00, 0x10, 0x09, 0xf9, 0x99, 0x01, + 0x40, 0xfa, 0xc2, 0x05, 0x48, 0xfc, 0x80, 0x01, + 0x00, 0x03, 0x04, 0x00, 0x41, 0xfa, 0xc0, 0x05, + 0x48, 0xfc, 0x80, 0x01, 0x08, 0x00, 0xf4, 0x21, + 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, 0x18, 0x00, + 0x40, 0xfa, 0xc1, 0x05, 0x80, 0x45, 0x5a, 0x0a, + 0x00, 0x80, 0x00, 0x00, +}; + + + +/* change_uart_speed_3M_none1_stop_mode_from_24M.bin */ +/* OLD ROM 24.0Mhz clock */ + +static unsigned char sbl_24m_img2[] = { + 0x5a, 0x01, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x43, 0x5e, 0x4f, 0x23, 0xb6, 0xd4, + 0x2c, 0x27, 0x40, 0xfa, 0xc1, 0x05, 0x4b, 0x23, + 0x40, 0xfa, 0xc1, 0x05, 0x00, 0x23, 0x40, 0xfa, + 0xc1, 0x05, 0x40, 0xfa, 0xc1, 0x05, 0x40, 0xfa, + 0xc1, 0x05, 0x24, 0x23, 0x43, 0xfa, 0xc0, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x0a, + 0x80, 0x17, 0x0b, 0x5e, 0x01, 0x00, 0x9b, 0xde, + 0x62, 0x00, 0x2f, 0x31, 0x4b, 0x59, 0x03, 0x59, + 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, 0x04, 0x00, + 0x40, 0xfa, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0x80, 0x01, 0xff, 0xef, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x40, 0xfa, + 0xc1, 0x05, 0x00, 0x5e, 0x00, 0x04, 0x1c, 0x27, + 0x40, 0xfa, 0xc1, 0x05, 0x14, 0x23, 0x43, 0xfa, + 0xc0, 0x05, 0x48, 0xfc, 0x81, 0x01, 0x00, 0x02, + 0x20, 0x00, 0x40, 0xfa, 0xc1, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0xfc, 0x80, 0x01, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xfa, 0xc1, 0x05, 0x48, 0xfc, 0x80, 0x01, + 0x00, 0x00, 0x6a, 0x80, 0x10, 0xfe, 0xc3, 0x05, + 0xd9, 0x09, 0x10, 0xfe, 0xc0, 0x05, 0xcc, 0x09, + 0x08, 0x27, 0x03, 0x23, 0x40, 0xfa, 0xc1, 0x05, + 0x01, 0x23, 0x0c, 0x27, 0x40, 0xfa, 0xc1, 0x05, + 0x00, 0x5e, 0x80, 0x00, 0x04, 0x27, 0x40, 0xfa, + 0xc1, 0x05, 0x00, 0x00, 0xd6, 0xd4, 0x90, 0x45, + 0x63, 0x5e, 0xb6, 0xd4, 0x8b, 0xd4, 0xd6, 0xd4, + 0x80, 0x45, 0x00, 0x00, 0x80, 0x45, 0x48, 0xfc, + 0x80, 0x01, 0xda, 0xba, 0x01, 0x19, 0x48, 0xfc, + 0x81, 0x01, 0x00, 0x03, 0x28, 0x00, 0x40, 0xfa, + 0xc1, 0x05, 0x00, 0x5e, 0x00, 0x01, 0x48, 0xfc, + 0x81, 0x01, 0x00, 0x03, 0x2c, 0x00, 0x40, 0xfa, + 0xc1, 0x05, 0x90, 0x45, 0x01, 0x21, 0xd8, 0xfc, + 0x89, 0x09, 0xe0, 0x6f, 0xc8, 0x96, 0x88, 0xfb, + 0x89, 0x03, 0x00, 0x10, 0x00, 0x00, 0xaa, 0x91, + 0x8b, 0xff, 0x9b, 0x0f, 0x8f, 0xff, 0x80, 0xef, + 0x48, 0xfc, 0x82, 0x01, 0x00, 0x03, 0x00, 0x00, + 0x08, 0xfc, 0x80, 0x01, 0x00, 0x00, 0x00, 0x10, + 0x09, 0xf9, 0x99, 0x01, 0x40, 0xfa, 0xc2, 0x05, + 0x48, 0xfc, 0x80, 0x01, 0x00, 0x03, 0x04, 0x00, + 0x41, 0xfa, 0xc0, 0x05, 0x48, 0xfc, 0x80, 0x01, + 0x08, 0x00, 0xf4, 0x21, 0x48, 0xfc, 0x81, 0x01, + 0x00, 0x03, 0x18, 0x00, 0x40, 0xfa, 0xc1, 0x05, + 0x80, 0x45, 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, + 0x04, 0x00, 0x40, 0xfa, 0xc1, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x80, 0x01, + 0xff, 0xef, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xfa, 0xc1, 0x05, 0x48, 0xfc, 0x81, 0x01, + 0x00, 0x03, 0x18, 0x00, 0x40, 0xfa, 0xc1, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xfe, + 0xb0, 0x03, 0x40, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x45, 0x5a, 0x0a, 0x00, 0x80, 0x00, 0x00, +}; + +/* ROM2_change_UART_to_3M_use_24.5M.bin */ +/* NEW ROM DBD1 this is for main clock 24576000Hz */ +static unsigned char sbl_24m_img3[] = { + 0x5a, 0x01, 0x76, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x43, 0x5e, 0x4f, 0x23, 0xb6, 0xd4, + 0x2c, 0x27, 0x40, 0xfa, 0xc1, 0x05, 0x4b, 0x23, + 0x40, 0xfa, 0xc1, 0x05, 0x00, 0x23, 0x40, 0xfa, + 0xc1, 0x05, 0x40, 0xfa, 0xc1, 0x05, 0x40, 0xfa, + 0xc1, 0x05, 0x24, 0x23, 0x43, 0xfa, 0xc0, 0x01, + 0x73, 0x0a, 0xb0, 0x17, 0x48, 0xfc, 0x80, 0x01, + 0x02, 0x00, 0x10, 0x13, 0x0b, 0x5e, 0x01, 0x00, + 0x40, 0x5e, 0x9b, 0xde, 0x3c, 0x00, 0x4b, 0x59, + 0x03, 0x59, 0x30, 0x31, 0x48, 0xfc, 0x80, 0x01, + 0x02, 0x00, 0xd4, 0x12, 0x63, 0x59, 0x43, 0x59, + 0x9b, 0xde, 0x31, 0x00, 0x23, 0x59, 0x03, 0x59, + 0x40, 0x5e, 0x00, 0x5e, 0x00, 0x04, 0x1c, 0x27, + 0x40, 0xfa, 0xc1, 0x05, 0x14, 0x23, 0x43, 0xfa, + 0xc0, 0x05, 0x48, 0xfc, 0x81, 0x01, 0x00, 0x02, + 0x20, 0x00, 0x40, 0xfa, 0xc1, 0x01, 0x08, 0xfc, + 0x80, 0x01, 0x00, 0x00, 0x00, 0x80, 0x40, 0xfa, + 0xc1, 0x05, 0x48, 0xfc, 0x80, 0x01, 0x00, 0x00, + 0x62, 0x80, 0x10, 0xfe, 0xc3, 0x05, 0x52, 0x0a, + 0x10, 0xfe, 0xc0, 0x05, 0x1e, 0x0a, 0x04, 0x23, + 0x43, 0xfa, 0xc0, 0x05, 0x03, 0x23, 0x08, 0x27, + 0x40, 0xfa, 0xc1, 0x05, 0x01, 0x23, 0x0c, 0x27, + 0x40, 0xfa, 0xc1, 0x05, 0xd6, 0xd4, 0x90, 0x45, + 0x63, 0x5e, 0x00, 0x00, 0x80, 0x45, 0x47, 0x5e, + 0xf5, 0x58, 0x02, 0x44, 0xb6, 0xd4, 0x82, 0xd4, + 0xd6, 0xd4, 0x67, 0x5e, 0x01, 0x09, 0x48, 0xfc, + 0x80, 0x01, 0xda, 0xba, 0x01, 0x19, 0x48, 0xfc, + 0x81, 0x01, 0x00, 0x03, 0x28, 0x00, 0x40, 0xfa, + 0xc1, 0x05, 0x00, 0x5e, 0x00, 0x01, 0x48, 0xfc, + 0x81, 0x01, 0x00, 0x03, 0x2c, 0x00, 0x40, 0xfa, + 0xc1, 0x05, 0x90, 0x45, 0x01, 0x21, 0x5a, 0x0a, + 0x00, 0x80, 0x00, 0x00, +}; + +/* ROM2_change_UART_to_3M_use_9.6M.bin */ +/* new ROM for main clock 9.6 Mhz */ +static unsigned char sbl_9m_img4[] = { + 0x5a, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x43, 0x5e, 0x4f, 0x23, 0xb6, 0xd4, + 0x2c, 0x27, 0x40, 0xfa, 0xc1, 0x05, 0x4b, 0x23, + 0x40, 0xfa, 0xc1, 0x05, 0x00, 0x23, 0x40, 0xfa, + 0xc1, 0x05, 0x40, 0xfa, 0xc1, 0x05, 0x40, 0xfa, + 0xc1, 0x05, 0x24, 0x23, 0x43, 0xfa, 0xc0, 0x01, + 0x73, 0x0a, 0xb0, 0x17, 0x48, 0xfc, 0x81, 0x01, + 0x00, 0x03, 0x04, 0x00, 0x40, 0xfa, 0xc1, 0x01, + 0x08, 0xfc, 0x80, 0x01, 0x00, 0x10, 0x00, 0x00, + 0x40, 0xfa, 0xc1, 0x05, 0x48, 0xfc, 0x80, 0x01, + 0x02, 0x00, 0x10, 0x13, 0x0b, 0x5e, 0x01, 0x00, + 0x40, 0x5e, 0x9b, 0xde, 0x3c, 0x00, 0x4b, 0x59, + 0x03, 0x59, 0x7c, 0x31, 0x48, 0xfc, 0x80, 0x01, + 0x02, 0x00, 0xd4, 0x12, 0x63, 0x59, 0x43, 0x59, + 0x9b, 0xde, 0x31, 0x00, 0x23, 0x59, 0x03, 0x59, + 0x40, 0x5e, 0x00, 0x5e, 0x00, 0x04, 0x1c, 0x27, + 0x40, 0xfa, 0xc1, 0x05, 0x14, 0x23, 0x43, 0xfa, + 0xc0, 0x05, 0x48, 0xfc, 0x81, 0x01, 0x00, 0x02, + 0x20, 0x00, 0x40, 0xfa, 0xc1, 0x01, 0x08, 0xfc, + 0x80, 0x01, 0x00, 0x00, 0x00, 0x80, 0x40, 0xfa, + 0xc1, 0x05, 0x48, 0xfc, 0x80, 0x01, 0x00, 0x00, + 0x6e, 0x80, 0x10, 0xfe, 0xc3, 0x05, 0x52, 0x0a, + 0x10, 0xfe, 0xc0, 0x05, 0x1e, 0x0a, 0x04, 0x23, + 0x43, 0xfa, 0xc0, 0x05, 0x03, 0x23, 0x08, 0x27, + 0x40, 0xfa, 0xc1, 0x05, 0x01, 0x23, 0x0c, 0x27, + 0x40, 0xfa, 0xc1, 0x05, 0xd6, 0xd4, 0x90, 0x45, + 0x63, 0x5e, 0x00, 0x00, 0x80, 0x45, 0x47, 0x5e, + 0xf5, 0x58, 0x02, 0x44, 0xb6, 0xd4, 0x82, 0xd4, + 0xd6, 0xd4, 0x67, 0x5e, 0x01, 0x09, 0x48, 0xfc, + 0x80, 0x01, 0xda, 0xba, 0x01, 0x19, 0x48, 0xfc, + 0x81, 0x01, 0x00, 0x03, 0x28, 0x00, 0x40, 0xfa, + 0xc1, 0x05, 0x00, 0x5e, 0x00, 0x01, 0x48, 0xfc, + 0x81, 0x01, 0x00, 0x03, 0x2c, 0x00, 0x40, 0xfa, + 0xc1, 0x05, 0x90, 0x45, 0x01, 0x21, 0x5a, 0x0a, + 0x00, 0x80, 0x00, 0x00, +}; + + +/* ROM2_change_UART_to_3M_use_24.0M.bin */ +/* new ROM dbd1 main clcok 24.0 Mhz */ +static unsigned char sbl_24m_img5[] = { + 0x5a, 0x01, 0x76, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x43, 0x5e, 0x4f, 0x23, 0xb6, 0xd4, + 0x2c, 0x27, 0x40, 0xfa, 0xc1, 0x05, 0x4b, 0x23, + 0x40, 0xfa, 0xc1, 0x05, 0x00, 0x23, 0x40, 0xfa, + 0xc1, 0x05, 0x40, 0xfa, 0xc1, 0x05, 0x40, 0xfa, + 0xc1, 0x05, 0x24, 0x23, 0x43, 0xfa, 0xc0, 0x01, + 0x73, 0x0a, 0xb0, 0x17, 0x48, 0xfc, 0x80, 0x01, + 0x02, 0x00, 0x10, 0x13, 0x0b, 0x5e, 0x01, 0x00, + 0x40, 0x5e, 0x9b, 0xde, 0x3c, 0x00, 0x4b, 0x59, + 0x03, 0x59, 0x31, 0x31, 0x48, 0xfc, 0x80, 0x01, + 0x02, 0x00, 0xd4, 0x12, 0x63, 0x59, 0x43, 0x59, + 0x9b, 0xde, 0x31, 0x00, 0x23, 0x59, 0x03, 0x59, + 0x40, 0x5e, 0x00, 0x5e, 0x00, 0x04, 0x1c, 0x27, + 0x40, 0xfa, 0xc1, 0x05, 0x14, 0x23, 0x43, 0xfa, + 0xc0, 0x05, 0x48, 0xfc, 0x81, 0x01, 0x00, 0x02, + 0x20, 0x00, 0x40, 0xfa, 0xc1, 0x01, 0x08, 0xfc, + 0x80, 0x01, 0x00, 0x00, 0x00, 0x80, 0x40, 0xfa, + 0xc1, 0x05, 0x48, 0xfc, 0x80, 0x01, 0x00, 0x00, + 0x62, 0x80, 0x10, 0xfe, 0xc3, 0x05, 0x52, 0x0a, + 0x10, 0xfe, 0xc0, 0x05, 0x1e, 0x0a, 0x04, 0x23, + 0x43, 0xfa, 0xc0, 0x05, 0x03, 0x23, 0x08, 0x27, + 0x40, 0xfa, 0xc1, 0x05, 0x01, 0x23, 0x0c, 0x27, + 0x40, 0xfa, 0xc1, 0x05, 0xd6, 0xd4, 0x90, 0x45, + 0x63, 0x5e, 0x00, 0x00, 0x80, 0x45, 0x47, 0x5e, + 0xf5, 0x58, 0x02, 0x44, 0xb6, 0xd4, 0x82, 0xd4, + 0xd6, 0xd4, 0x67, 0x5e, 0x01, 0x09, 0x48, 0xfc, + 0x80, 0x01, 0xda, 0xba, 0x01, 0x19, 0x48, 0xfc, + 0x81, 0x01, 0x00, 0x03, 0x28, 0x00, 0x40, 0xfa, + 0xc1, 0x05, 0x00, 0x5e, 0x00, 0x01, 0x48, 0xfc, + 0x81, 0x01, 0x00, 0x03, 0x2c, 0x00, 0x40, 0xfa, + 0xc1, 0x05, 0x90, 0x45, 0x01, 0x21, 0x5a, 0x0a, + 0x00, 0x80, 0x00, 0x00, +}; + +/* ROM2_change_UART_to_3M_use_19.2M.bin */ +/* NEW ROM DBD1 main clock 19.2 MHz */ +static unsigned char sbl_19m_img6[] = { + 0x5a, 0x01, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x43, 0x5e, 0x4f, 0x23, 0xb6, 0xd4, + 0x2c, 0x27, 0x40, 0xfa, 0xc1, 0x05, 0x4b, 0x23, + 0x40, 0xfa, 0xc1, 0x05, 0x00, 0x23, 0x40, 0xfa, + 0xc1, 0x05, 0x40, 0xfa, 0xc1, 0x05, 0x40, 0xfa, + 0xc1, 0x05, 0x24, 0x23, 0x43, 0xfa, 0xc0, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x0a, + 0x80, 0x17, 0x48, 0xfc, 0x80, 0x01, 0x02, 0x00, + 0x10, 0x13, 0x0b, 0x5e, 0x01, 0x00, 0x40, 0x5e, + 0x9b, 0xde, 0x42, 0x00, 0x4b, 0x59, 0x03, 0x59, + 0x3d, 0x31, 0x48, 0xfc, 0x80, 0x01, 0x02, 0x00, + 0xd4, 0x12, 0x63, 0x59, 0x43, 0x59, 0x9b, 0xde, + 0x37, 0x00, 0x23, 0x59, 0x03, 0x59, 0x40, 0x5e, + 0x00, 0x5e, 0x00, 0x04, 0x1c, 0x27, 0x40, 0xfa, + 0xc1, 0x05, 0x14, 0x23, 0x43, 0xfa, 0xc0, 0x05, + 0x48, 0xfc, 0x81, 0x01, 0x00, 0x02, 0x20, 0x00, + 0x40, 0xfa, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0xfc, 0x80, 0x01, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0xfa, + 0xc1, 0x05, 0x48, 0xfc, 0x80, 0x01, 0x00, 0x00, + 0x6b, 0x80, 0x10, 0xfe, 0xc3, 0x05, 0x52, 0x0a, + 0x10, 0xfe, 0xc0, 0x05, 0x1e, 0x0a, 0x04, 0x23, + 0x43, 0xfa, 0xc0, 0x05, 0x03, 0x23, 0x08, 0x27, + 0x40, 0xfa, 0xc1, 0x05, 0x01, 0x23, 0x0c, 0x27, + 0x40, 0xfa, 0xc1, 0x05, 0x00, 0x00, 0xd6, 0xd4, + 0x90, 0x45, 0x63, 0x5e, 0x00, 0x00, 0x80, 0x45, + 0x47, 0x5e, 0xf5, 0x58, 0x02, 0x44, 0xb6, 0xd4, + 0x82, 0xd4, 0xd6, 0xd4, 0x67, 0x5e, 0x01, 0x09, + 0x48, 0xfc, 0x80, 0x01, 0xda, 0xba, 0x01, 0x19, + 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, 0x28, 0x00, + 0x40, 0xfa, 0xc1, 0x05, 0x00, 0x5e, 0x00, 0x01, + 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, 0x2c, 0x00, + 0x40, 0xfa, 0xc1, 0x05, 0x90, 0x45, 0x01, 0x21, + 0x5a, 0x0a, 0x00, 0x80, 0x00, 0x00, +}; + +/* ROM2_change_UART_to_1M_use_32768_clk.h */ +static unsigned char sbl_32k_img7[] = { + 0x5a, 0x01, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x48, 0xfc, 0x88, 0x01, 0x00, 0x00, + 0xaf, 0x0b, 0x23, 0x10, 0x00, 0x00, 0x80, 0x45, + 0x43, 0x5e, 0xb6, 0xd4, 0x4f, 0x23, 0x2c, 0x2b, + 0x40, 0xfa, 0xc2, 0x05, 0x4b, 0x23, 0x40, 0xfa, + 0xc2, 0x05, 0x00, 0x23, 0x40, 0xfa, 0xc2, 0x05, + 0x40, 0xfa, 0xc2, 0x05, 0x40, 0xfa, 0xc2, 0x05, + 0x24, 0x23, 0x43, 0xfa, 0xc0, 0x01, 0x73, 0x0a, + 0xb0, 0x17, 0x48, 0xfc, 0x82, 0x01, 0x00, 0x03, + 0x04, 0x00, 0x40, 0xfa, 0xc2, 0x01, 0x08, 0xfc, + 0x80, 0x01, 0x00, 0x10, 0x00, 0x00, 0x40, 0xfa, + 0xc2, 0x05, 0x48, 0xfc, 0x80, 0x01, 0x02, 0x00, + 0x10, 0x13, 0x63, 0x59, 0x40, 0x5e, 0x9b, 0xde, + 0x43, 0x00, 0x0a, 0x5e, 0x01, 0x00, 0x28, 0x59, + 0x03, 0x59, 0x48, 0xfc, 0x80, 0x01, 0x00, 0x03, + 0x08, 0x00, 0x43, 0xfa, 0xc0, 0x05, 0x48, 0xfc, + 0x80, 0x01, 0x02, 0x00, 0xd4, 0x12, 0x63, 0x59, + 0x40, 0x5e, 0x9b, 0xde, 0x31, 0x00, 0x43, 0x59, + 0x23, 0x59, 0x03, 0x59, 0x00, 0x5e, 0x00, 0x04, + 0x1c, 0x27, 0x40, 0xfa, 0xc1, 0x05, 0x14, 0x2b, + 0x43, 0xfa, 0xc2, 0x05, 0x48, 0xfc, 0x81, 0x01, + 0x00, 0x02, 0x20, 0x00, 0x40, 0xfa, 0xc1, 0x01, + 0x08, 0xfc, 0x80, 0x01, 0x00, 0x00, 0x00, 0x80, + 0x40, 0xfa, 0xc1, 0x05, 0x48, 0xfc, 0x80, 0x01, + 0x00, 0x00, 0x7b, 0x80, 0x10, 0xfe, 0xc3, 0x05, + 0x52, 0x0a, 0x10, 0xfe, 0xc0, 0x05, 0x1e, 0x0a, + 0x04, 0x23, 0x43, 0xfa, 0xc0, 0x05, 0x03, 0x23, + 0x08, 0x27, 0x40, 0xfa, 0xc1, 0x05, 0x01, 0x23, + 0x0c, 0x2b, 0x40, 0xfa, 0xc2, 0x05, 0xd6, 0xd4, + 0x90, 0x45, 0x63, 0x5e, 0x00, 0x00, 0x80, 0x45, + 0x47, 0x5e, 0xf5, 0x58, 0x02, 0x44, 0xb6, 0xd4, + 0x82, 0xd4, 0xd6, 0xd4, 0x67, 0x5e, 0x01, 0x09, + 0x48, 0xfc, 0x80, 0x01, 0xda, 0xba, 0x01, 0x19, + 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, 0x28, 0x00, + 0x40, 0xfa, 0xc1, 0x05, 0x00, 0x5e, 0x00, 0x01, + 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, 0x2c, 0x00, + 0x40, 0xfa, 0xc1, 0x05, 0x90, 0x45, 0x01, 0x21, + 0x5a, 0x0a, 0x00, 0x80, 0x00, 0x00, +}; + +/* ROM2_change_UART_to_300_use_32768_clk.h */ +static unsigned char sbl_32k_img8[] = { + 0x5a, 0x01, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x48, 0xfc, 0x88, 0x01, 0x00, 0x00, + 0xaf, 0x0b, 0x23, 0x10, 0x00, 0x00, 0x80, 0x45, + 0x43, 0x5e, 0xb6, 0xd4, 0x4f, 0x23, 0x2c, 0x2b, + 0x40, 0xfa, 0xc2, 0x05, 0x4b, 0x23, 0x40, 0xfa, + 0xc2, 0x05, 0x00, 0x23, 0x40, 0xfa, 0xc2, 0x05, + 0x40, 0xfa, 0xc2, 0x05, 0x40, 0xfa, 0xc2, 0x05, + 0x24, 0x23, 0x43, 0xfa, 0xc0, 0x01, 0x73, 0x0a, + 0xb0, 0x17, 0x48, 0xfc, 0x82, 0x01, 0x00, 0x03, + 0x04, 0x00, 0x40, 0xfa, 0xc2, 0x01, 0x08, 0xfc, + 0x80, 0x01, 0x00, 0x10, 0x00, 0x00, 0x40, 0xfa, + 0xc2, 0x05, 0x48, 0xfc, 0x80, 0x01, 0x02, 0x00, + 0x10, 0x13, 0x63, 0x59, 0x40, 0x5e, 0x9b, 0xde, + 0x43, 0x00, 0x0a, 0x5e, 0x01, 0x00, 0x28, 0x59, + 0x20, 0x21, 0x48, 0xfc, 0x80, 0x01, 0x00, 0x03, + 0x08, 0x00, 0x43, 0xfa, 0xc0, 0x05, 0x48, 0xfc, + 0x80, 0x01, 0x02, 0x00, 0xd4, 0x12, 0x63, 0x59, + 0x40, 0x5e, 0x9b, 0xde, 0x31, 0x00, 0x43, 0x59, + 0x23, 0x59, 0x03, 0x59, 0x00, 0x5e, 0x00, 0x04, + 0x1c, 0x27, 0x40, 0xfa, 0xc1, 0x05, 0x14, 0x2b, + 0x43, 0xfa, 0xc2, 0x05, 0x48, 0xfc, 0x81, 0x01, + 0x00, 0x02, 0x20, 0x00, 0x40, 0xfa, 0xc1, 0x01, + 0x08, 0xfc, 0x80, 0x01, 0x00, 0x00, 0x00, 0x80, + 0x40, 0xfa, 0xc1, 0x05, 0x48, 0xfc, 0x80, 0x01, + 0x00, 0x00, 0x7b, 0x80, 0x10, 0xfe, 0xc3, 0x05, + 0x52, 0x0a, 0x10, 0xfe, 0xc0, 0x05, 0x1e, 0x0a, + 0x04, 0x23, 0x43, 0xfa, 0xc0, 0x05, 0x03, 0x23, + 0x08, 0x27, 0x40, 0xfa, 0xc1, 0x05, 0x01, 0x23, + 0x0c, 0x2b, 0x40, 0xfa, 0xc2, 0x05, 0xd6, 0xd4, + 0x90, 0x45, 0x63, 0x5e, 0x00, 0x00, 0x80, 0x45, + 0x47, 0x5e, 0xf5, 0x58, 0x02, 0x44, 0xb6, 0xd4, + 0x82, 0xd4, 0xd6, 0xd4, 0x67, 0x5e, 0x01, 0x09, + 0x48, 0xfc, 0x80, 0x01, 0xda, 0xba, 0x01, 0x19, + 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, 0x28, 0x00, + 0x40, 0xfa, 0xc1, 0x05, 0x00, 0x5e, 0x00, 0x01, + 0x48, 0xfc, 0x81, 0x01, 0x00, 0x03, 0x2c, 0x00, + 0x40, 0xfa, 0xc1, 0x05, 0x90, 0x45, 0x01, 0x21, + 0x5a, 0x0a, 0x00, 0x80, 0x00, 0x00, +}; + +static struct sbl_record sbl_map[] = { + SBL_SET_IMG(DBMD2_XTAL_FREQ_24M_IMG1, sbl_24m_img1, + BOOT_TTY_BAUD_115200), + SBL_SET_IMG(DBMD2_XTAL_FREQ_24M_IMG2, sbl_24m_img2, + BOOT_TTY_BAUD_115200), + SBL_SET_IMG(DBMD2_XTAL_FREQ_24M_IMG3, sbl_24m_img3, + BOOT_TTY_BAUD_115200), + SBL_SET_IMG(DBMD2_XTAL_FREQ_9M_IMG4, sbl_9m_img4, + BOOT_TTY_BAUD_57600), + SBL_SET_IMG(DBMD2_XTAL_FREQ_24M_IMG5, sbl_24m_img5, + BOOT_TTY_BAUD_115200), + SBL_SET_IMG(DBMD2_XTAL_FREQ_19M_IMG6, sbl_19m_img6, + BOOT_TTY_BAUD_115200), + SBL_SET_IMG(DBMD2_XTAL_FREQ_32K_IMG7, sbl_32k_img7, + BOOT_TTY_BAUD_115200), + SBL_SET_IMG(DBMD2_XTAL_FREQ_32K_IMG8, sbl_32k_img8, + BOOT_TTY_BAUD_300), +}; + +#endif diff --git a/sound/soc/codecs/dbmdx/dbmdx-uart.c b/sound/soc/codecs/dbmdx/dbmdx-uart.c new file mode 100755 index 000000000000..4fe1cb145d08 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-uart.c @@ -0,0 +1,1491 @@ +/* + * DSPG DBMDX UART interface driver + * + * Copyright (C) 2014 DSP Group + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +/* #define DEBUG */ +#include <linux/kernel.h> +#include <linux/delay.h> +#include <linux/slab.h> +#include <linux/module.h> +#include <linux/mutex.h> +#if IS_ENABLED(CONFIG_OF) +#include <linux/of.h> +#endif +#include <linux/tty.h> +#include <linux/kthread.h> +#include <linux/platform_device.h> +#include <linux/uaccess.h> +#include <linux/firmware.h> + +#include "dbmdx-interface.h" +#include "dbmdx-va-regmap.h" +#include "dbmdx-uart.h" + +/* baud rate for wakeup sequence */ +#define UART_TTY_WAKEUP_SEQ_BAUD_RATE 2400 + +#define DEFAULT_UART_WRITE_CHUNK_SIZE 8 +#define MAX_UART_WRITE_CHUNK_SIZE 0x20000 +#define DEFAULT_UART_READ_CHUNK_SIZE 8 +#define MAX_UART_READ_CHUNK_SIZE 4096 + +#ifndef INIT_COMPLETION +#define INIT_COMPLETION(x) reinit_completion(&x) +#endif + +static DECLARE_WAIT_QUEUE_HEAD(dbmdx_wq); + +static void uart_transport_enable(struct dbmdx_private *p, bool enable); + +#ifndef NEED_FILE_TTY +static inline struct tty_struct *file_tty(struct file *file) +{ + return ((struct tty_file_private *)file->private_data)->tty; +} +#endif + +static int uart_open_file(struct dbmdx_uart_private *p) +{ + long err = 0; + struct file *fp; + int attempt = 0; + unsigned long timeout = jiffies + msecs_to_jiffies(60000); + struct filename fname; + + if (p->uart_open) + goto out_ok; + + fname.name = p->pdata->uart_dev; + /* + * Wait for the device node to appear in the filesystem. This can take + * some time if the kernel is still booting up and filesystems are + * being mounted. + */ + do { + msleep(DBMDX_MSLEEP_UART_PROBE); + dev_dbg(p->dev, + "%s(): probing for tty on %s (attempt %d)\n", + __func__, p->pdata->uart_dev, ++attempt); + + fp = file_open_name(&fname, O_RDWR | O_NONBLOCK | O_NOCTTY, 0); + + err = PTR_ERR(fp); + } while (time_before(jiffies, timeout) && (err == -ENOENT) && + (atomic_read(&p->stop_uart_probing) == 0)); + + if (atomic_read(&p->stop_uart_probing)) { + dev_dbg(p->dev, "%s: UART probe thread stopped\n", __func__); + atomic_set(&p->stop_uart_probing, 0); + err = -EIO; + goto out; + } + + if (IS_ERR_OR_NULL(fp)) { + dev_err(p->dev, "%s: UART device node open failed\n", __func__); + err = -ENODEV; + goto out; + } + + /* set uart_dev members */ + p->fp = fp; + p->tty = file_tty(fp); + p->ldisc = tty_ldisc_ref(p->tty); + p->uart_open = 1; + err = 0; + + dev_dbg(p->dev, "%s: UART successfully opened\n", __func__); +out_ok: + /* finish probe */ + complete(&p->uart_done); +out: + return err; +} + +static int uart_open_file_noprobe(struct dbmdx_uart_private *p) +{ + long err = 0; + struct file *fp; + int attempt = 0; + unsigned long timeout = jiffies + msecs_to_jiffies(1000); + struct filename fname; + + if (p->uart_open) + goto out; + + fname.name = p->pdata->uart_dev; + + /* + * Wait for the device node to appear in the filesystem. This can take + * some time if the kernel is still booting up and filesystems are + * being mounted. + */ + do { + if (attempt > 0) + msleep(DBMDX_MSLEEP_UART_PROBE); + dev_dbg(p->dev, + "%s(): probing for tty on %s (attempt %d)\n", + __func__, p->pdata->uart_dev, ++attempt); + + fp = file_open_name(&fname, O_RDWR | O_NONBLOCK | O_NOCTTY, 0); + err = PTR_ERR(fp); + } while (time_before(jiffies, timeout) && IS_ERR_OR_NULL(fp)); + + + if (IS_ERR_OR_NULL(fp)) { + dev_err(p->dev, "%s: UART device node open failed, err=%d\n", + __func__, + (int)err); + err = -ENODEV; + goto out; + } + + /* set uart_dev members */ + p->fp = fp; + p->tty = file_tty(fp); + p->ldisc = tty_ldisc_ref(p->tty); + p->uart_open = 1; + + err = 0; + dev_dbg(p->dev, "%s: UART successfully opened\n", __func__); + +out: + return err; +} + + +static void uart_close_file(struct dbmdx_uart_private *p) +{ + if (p->uart_probe_thread) { + atomic_inc(&p->stop_uart_probing); + kthread_stop(p->uart_probe_thread); + p->uart_probe_thread = NULL; + } + if (p->uart_open) { + tty_ldisc_deref(p->ldisc); + filp_close(p->fp, 0); + p->uart_open = 0; + } + atomic_set(&p->stop_uart_probing, 0); +} + +void uart_flush_rx_fifo(struct dbmdx_uart_private *p) +{ + dev_dbg(p->dev, "%s\n", __func__); + + if (!p->uart_open) { + dev_err(p->dev, "%s: UART is not opened !!!\n", __func__); + return; + } + + tty_ldisc_flush(p->tty); +} + +int uart_configure_tty(struct dbmdx_uart_private *p, u32 bps, int stop, + int parity, int flow) +{ + int rc = 0; + struct ktermios termios; + + if (!p->uart_open) { + dev_err(p->dev, "%s: UART is not opened !!!\n", __func__); + return -EIO; + } + + memcpy(&termios, &(p->tty->termios), sizeof(termios)); + + tty_wait_until_sent(p->tty, 0); + usleep_range(50, 60); + + /* clear csize, baud */ + termios.c_cflag &= ~(CBAUD | CSIZE | PARENB | CSTOPB); + termios.c_cflag |= BOTHER; /* allow arbitrary baud */ + termios.c_cflag |= CS8; + termios.c_cflag |= CREAD; + if (parity) + termios.c_cflag |= PARENB; + + if (stop == 2) + termios.c_cflag |= CSTOPB; + + /* set uart port to raw mode (see termios man page for flags) */ + termios.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP + | INLCR | IGNCR | ICRNL | IXON | IXOFF); + + if (flow && p->pdata->software_flow_control) + termios.c_iflag |= IXOFF; /* enable XON/OFF for input */ + + termios.c_oflag &= ~(OPOST); + termios.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); + + /* set baud rate */ + termios.c_ospeed = bps; + termios.c_ispeed = bps; + + rc = tty_set_termios(p->tty, &termios); + return rc; +} + +ssize_t uart_read_data(struct dbmdx_private *p, void *buf, size_t len) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + size_t count = uart_p->pdata->read_chunk_size; + u8 *d = (u8 *)buf; + mm_segment_t oldfs; + int rc; + int i = 0; + size_t bytes_to_read = len; + unsigned long timeout; + + /* if stuck for more than 10s, something is wrong */ + timeout = jiffies + msecs_to_jiffies(1000); + + if (!uart_p->uart_open) { + dev_err(p->dev, "%s: UART is not opened !!!\n", __func__); + return -EIO; + } + + oldfs = get_fs(); + set_fs(KERNEL_DS); + + do { + if (count > bytes_to_read) + count = bytes_to_read; + + rc = uart_p->ldisc->ops->read(uart_p->tty, + uart_p->fp, + uart_p->pdata->read_buf, + count); + if (rc > 0) { + memcpy(d + i, uart_p->pdata->read_buf, rc); + bytes_to_read -= rc; + i += rc; + } else if (rc == 0 || rc == -EAGAIN) { + usleep_range(2000, 2100); + } else + dev_err(p->dev, + "%s: Failed to read err= %d bytes to read=%zu\n", + __func__, + rc, bytes_to_read); + } while (time_before(jiffies, timeout) && bytes_to_read); + + /* restore old fs context */ + set_fs(oldfs); + + if (bytes_to_read) { + dev_err(uart_p->dev, + "%s: timeout: unread %zu bytes ,requested %zu\n", + __func__, bytes_to_read, len); + return -EIO; + } + + return len; +} + +ssize_t uart_write_data_no_sync(struct dbmdx_private *p, const void *buf, + size_t len) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret = 0; + const u8 *cmds = (const u8 *)buf; + size_t to_copy = len; + size_t max_size = (size_t)(uart_p->pdata->write_chunk_size); + mm_segment_t oldfs; + unsigned int count; + + if (!uart_p->uart_open) { + dev_err(p->dev, "%s: UART is not opened !!!\n", __func__); + return -EIO; + } + + oldfs = get_fs(); + set_fs(KERNEL_DS); + + while (to_copy > 0) { + if (to_copy > max_size) + count = max_size; + else + count = to_copy; + /* block until tx buffer space is available */ + do { + ret = tty_write_room(uart_p->tty); + usleep_range(100, 110); + } while (ret <= 0); + + if (ret < count) + count = ret; + + ret = uart_p->ldisc->ops->write(uart_p->tty, + uart_p->fp, + cmds, + min_t(size_t, + count, max_size)); + if (ret < 0) { + dev_err(uart_p->dev, "%s: Failed ret=%d\n", + __func__, ret); + break; + } + to_copy -= ret; + cmds += ret; + } + + /* restore old fs context */ + set_fs(oldfs); + return len - to_copy; +} + +ssize_t uart_write_data(struct dbmdx_private *p, const void *buf, + size_t len) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + ssize_t bytes_wr; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + if (!uart_p->uart_open) { + dev_err(p->dev, "%s: UART is not opened !!!\n", __func__); + return -EIO; + } + + bytes_wr = uart_write_data_no_sync(p, buf, len); + + tty_wait_until_sent(uart_p->tty, 0); + usleep_range(50, 60); + + return bytes_wr; +} + +ssize_t send_uart_cmd_vqe(struct dbmdx_private *p, u32 command, + u16 *response) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + char tmp[3]; + u8 send[7]; + u8 recv[6] = {0, 0, 0, 0, 0, 0}; + int ret; + + dev_dbg(uart_p->dev, "%s: Send 0x%04x\n", __func__, command); + + if (response) + uart_flush_rx_fifo(uart_p); + + ret = snprintf(tmp, 3, "%02x", (command >> 16) & 0xff); + if (ret < 0) + goto out; + send[0] = tmp[0]; + send[1] = tmp[1]; + send[2] = 'w'; + + ret = snprintf(tmp, 3, "%02x", (command >> 8) & 0xff); + if (ret < 0) + goto out; + send[3] = tmp[0]; + send[4] = tmp[1]; + + ret = snprintf(tmp, 3, "%02x", command & 0xff); + if (ret < 0) + goto out; + send[5] = tmp[0]; + send[6] = tmp[1]; + + ret = uart_write_data(p, send, 7); + if (ret != 7) + goto out; + + ret = 0; + + /* the sleep command cannot be acked before the device goes to sleep */ + if (command == DBMDX_VA_SET_POWER_STATE_SLEEP) + goto out; + + if (!response) + goto out; + + ret = uart_read_data(p, recv, 5); + if (ret < 0) + goto out; + ret = kstrtou16(recv, 16, response); + if (ret < 0) { + dev_err(uart_p->dev, "%s: %2.2x:%2.2x:%2.2x:%2.2x\n", + __func__, recv[0], recv[1], recv[2], recv[3]); + goto out; + } + ret = 0; +out: + return ret; +} + +ssize_t send_uart_cmd_va(struct dbmdx_private *p, u32 command, + u16 *response) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + char tmp[3]; + u8 send[7]; + u8 recv[6] = {0, 0, 0, 0, 0, 0}; + int ret; + + dev_dbg(uart_p->dev, "%s: Send 0x%02x\n", __func__, command); + + /*Send wakeup byte*/ + if (p->pdata->send_wakeup_seq) { + send[0] = 0; + ret = uart_write_data(p, send, 1); + if (ret != 1) + goto out; + + usleep_range(DBMDX_USLEEP_UART_AFTER_WAKEUP_BYTE, + DBMDX_USLEEP_UART_AFTER_WAKEUP_BYTE + 10); + } + + if (response) { + uart_flush_rx_fifo(uart_p); + + ret = snprintf(tmp, 3, "%02x", (command >> 16) & 0xff); + send[0] = tmp[0]; + send[1] = tmp[1]; + send[2] = 'r'; + + ret = uart_write_data(p, send, 3); + if (ret != 3) + goto out; + + ret = 0; + + /* The sleep command cannot be ack'ed before the device goes + * to sleep + */ + if (command == DBMDX_VA_SET_POWER_STATE_SLEEP) + goto out; + + ret = uart_read_data(p, recv, 5); + if (ret < 0) + goto out; + ret = kstrtou16(recv, 16, response); + if (ret < 0) { + dev_err(uart_p->dev, "%s: %2.2x:%2.2x:%2.2x:%2.2x\n", + __func__, recv[0], recv[1], recv[2], recv[3]); + goto out; + } + + dev_dbg(uart_p->dev, + "%s: Received 0x%02x\n", __func__, *response); + + ret = 0; + } else { + ret = snprintf(tmp, 3, "%02x", (command >> 16) & 0xff); + if (ret < 0) + goto out; + send[0] = tmp[0]; + send[1] = tmp[1]; + send[2] = 'w'; + + ret = snprintf(tmp, 3, "%02x", (command >> 8) & 0xff); + if (ret < 0) + goto out; + send[3] = tmp[0]; + send[4] = tmp[1]; + + ret = snprintf(tmp, 3, "%02x", command & 0xff); + if (ret < 0) + goto out; + send[5] = tmp[0]; + send[6] = tmp[1]; + + ret = uart_write_data(p, send, 7); + if (ret != 7) + goto out; + ret = 0; + + } +out: + return ret; +} + +int send_uart_cmd_boot(struct dbmdx_private *p, u32 command) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + u8 send[3]; + int ret; + + dev_info(uart_p->dev, "%s: command = %x\n", __func__, command); + + send[0] = (command >> 16) & 0xff; + send[1] = (command >> 8) & 0xff; + + uart_flush_rx_fifo(uart_p); + ret = uart_write_data(p, send, 2); + + if (ret != 2) { + dev_err(uart_p->dev, "%s: ret = %d\n", __func__, ret); + return ret; + } + + return 0; +} + +int uart_verify_boot_checksum(struct dbmdx_private *p, + const void *checksum, size_t chksum_len) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret; + u8 rx_checksum[10]; + + if (!checksum) + return 0; + + if (chksum_len > 8) { + dev_err(uart_p->dev, "%s: illegal checksum length\n", __func__); + return -EINVAL; + } + + uart_flush_rx_fifo(uart_p); + + ret = send_uart_cmd_boot(p, DBMDX_READ_CHECKSUM); + + if (ret < 0) { + dev_err(uart_p->dev, "%s: could not read checksum\n", __func__); + return -EIO; + } + + ret = uart_read_data(p, (void *)rx_checksum, chksum_len + 2); + + if (ret < 0) { + dev_err(uart_p->dev, "%s: could not read checksum data\n", + __func__); + return -EIO; + } + + ret = p->verify_checksum(p, checksum, &rx_checksum[2], chksum_len); + if (ret) { + dev_err(uart_p->dev, "%s: checksum mismatch\n", __func__); + return -EILSEQ; + } + + return 0; +} + +int uart_verify_chip_id(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + int ret; + u8 idr_read_cmd[] = {0x5A, 0x07, 0x68, 0x00, 0x00, 0x03}; + u8 idr_read_result[7] = {0}; + u8 chip_rev_id_low_a = 0; + u8 chip_rev_id_low_b = 0; + u8 chip_rev_id_high = 0; + + u8 recv_chip_rev_id_high = 0; + u8 recv_chip_rev_id_low = 0; + + if (p->cur_firmware_id == DBMDX_FIRMWARE_ID_DBMD2) { + idr_read_cmd[2] = 0x68; + chip_rev_id_high = 0x0d; + chip_rev_id_low_a = 0xb0; + chip_rev_id_low_b = 0xb1; + } else if (p->cur_firmware_id == DBMDX_FIRMWARE_ID_DBMD4) { + idr_read_cmd[2] = 0x74; + chip_rev_id_high = 0xdb; + chip_rev_id_low_a = 0x40; + chip_rev_id_low_b = 0x40; + } else if (p->cur_firmware_id == DBMDX_FIRMWARE_ID_DBMD6) { + idr_read_cmd[2] = 0x74; + chip_rev_id_high = 0xdb; + chip_rev_id_low_a = 0x60; + chip_rev_id_low_b = 0x60; + } else { + idr_read_cmd[2] = 0x74; + chip_rev_id_high = 0xdb; + chip_rev_id_low_a = 0x80; + chip_rev_id_low_b = 0x80; + } + + ret = uart_write_data(p, idr_read_cmd, 6); + if (ret != sizeof(idr_read_cmd)) { + dev_err(uart_p->dev, "%s: idr_read_cmd ret = %d\n", + __func__, ret); + return ret; + } + + usleep_range(1000, 2000); + + ret = uart_read_data(p, (void *)idr_read_result, 6); + + if (ret < 0) { + dev_err(uart_p->dev, "%s: could not idr register data\n", + __func__); + return -EIO; + } + /* Verify answer */ + if ((idr_read_result[0] != idr_read_cmd[0]) || + (idr_read_result[1] != idr_read_cmd[1]) || + (idr_read_result[4] != 0x00) || + (idr_read_result[5] != 0x00)) { + dev_err(uart_p->dev, "%s: Wrong IDR resp: %x:%x:%x:%x:%x:%x\n", + __func__, + idr_read_result[0], + idr_read_result[1], + idr_read_result[2], + idr_read_result[3], + idr_read_result[4], + idr_read_result[5]); + return -EIO; + } + recv_chip_rev_id_high = idr_read_result[3]; + recv_chip_rev_id_low = idr_read_result[2]; + + if ((recv_chip_rev_id_high != chip_rev_id_high) || + ((recv_chip_rev_id_low != chip_rev_id_low_a) && + (recv_chip_rev_id_low != chip_rev_id_low_b))) { + + dev_err(uart_p->dev, + "%s: Wrong chip ID: Received 0x%2x%2x Expected: 0x%2x%2x | 0x%2x%2x\n", + __func__, + recv_chip_rev_id_high, + recv_chip_rev_id_low, + chip_rev_id_high, + chip_rev_id_low_a, + chip_rev_id_high, + chip_rev_id_low_b); + return -EILSEQ; + } + + dev_info(uart_p->dev, + "%s: Chip ID was successfully verified: 0x%2x%2x\n", + __func__, + recv_chip_rev_id_high, + recv_chip_rev_id_low); + return 0; +} + +static int uart_can_boot(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + unsigned long remaining_time; + int retries = RETRY_COUNT; + int ret = -EBUSY; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + /* + * do additional waiting until UART device is really + * available + */ + do { + remaining_time = + wait_for_completion_timeout(&uart_p->uart_done, HZ); + } while (!remaining_time && retries--); + + if (uart_p->uart_probe_thread) { + atomic_inc(&uart_p->stop_uart_probing); + kthread_stop(uart_p->uart_probe_thread); + uart_p->uart_probe_thread = NULL; + } + + INIT_COMPLETION(uart_p->uart_done); + + if (retries == 0) { + dev_err(p->dev, "%s: UART not available\n", __func__); + goto out; + } + + uart_transport_enable(p, true); + + ret = 0; + +out: + return ret; +} + +static int uart_prepare_boot(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + return 0; +} + +int uart_wait_for_ok(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + u8 resp[5] = {0, 0, 0, 0, 0}; + const char match[] = "OK\n\r"; + int ret; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + ret = uart_read_data(p, resp, 3); + if (ret < 0) { + dev_err(uart_p->dev, "%s: failed to read OK from uart: %d\n", + __func__, ret); + goto out; + } + ret = strncmp(match, resp, 2); + if (ret) + dev_err(uart_p->dev, + "%s: result = %d : %2.2x:%2.2x:%2.2x\n", + __func__, ret, resp[0], resp[1], resp[2]); + if (ret) + ret = strncmp(match + 1, resp, 2); + if (ret) + ret = strncmp(match, resp + 1, 2); +out: + return ret; +} + +static int uart_boot(const void *fw_data, size_t fw_size, + struct dbmdx_private *p, const void *checksum, + size_t chksum_len, int load_fw) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + + return 0; +} + +static int uart_finish_boot(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + return 0; +} + +static int uart_dump_state(struct chip_interface *chip, char *buf) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)chip->pdata; + int off = 0; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\t===UART Interface Dump====\n"); + + off += snprintf(buf + off, PAGE_SIZE - off, "\tUart Interface:\t%s\n", + uart_p->uart_open ? "Open" : "Closed"); + + off += snprintf(buf + off, PAGE_SIZE - off, "\tUart Device:\t%s\n", + uart_p->pdata->uart_dev); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tUART Write Chunk Size:\t\t%d\n", + uart_p->pdata->write_chunk_size); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tUART Read Chunk Size:\t\t%d\n", + uart_p->pdata->read_chunk_size); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tInterface resumed:\t%s\n", + uart_p->interface_enabled ? "ON" : "OFF"); + + return off; +} + +static int uart_set_va_firmware_ready(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret = 0; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + if (p->pdata->uart_low_speed_enabled) + ret = uart_set_speed(p, DBMDX_VA_SPEED_NORMAL); + else + ret = uart_set_speed(p, DBMDX_VA_SPEED_BUFFERING); + + if (ret) { + dev_err(p->dev, "%s: failed to send change speed command\n", + __func__); + return -EIO; + } + + return 0; +} + +static int uart_set_vqe_firmware_ready(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + return 0; +} + +static void uart_transport_enable(struct dbmdx_private *p, bool enable) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret; + u32 uart_baud; + + dev_dbg(uart_p->dev, "%s (%s)\n", __func__, enable ? "ON" : "OFF"); + + if (enable) { + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + if (uart_p->ps_nosuspend_wl) + __pm_stay_awake(uart_p->ps_nosuspend_wl); +#endif + ret = wait_event_interruptible(dbmdx_wq, + uart_p->interface_enabled); + + if (ret) + dev_dbg(uart_p->dev, + "%s, waiting for interface was interrupted", + __func__); + else + dev_dbg(uart_p->dev, "%s, interface is active\n", + __func__); + } + + if (enable) { + + p->wakeup_set(p); + + if (uart_p->uart_open) + return; + ret = uart_open_file_noprobe(uart_p); + if (ret < 0) { + dev_err(uart_p->dev, "%s: failed to enable UART: %d\n", + __func__, ret); + return; + } + if (p->pdata->uart_low_speed_enabled) + uart_baud = p->pdata->va_speed_cfg[0].uart_baud; + else + uart_baud = p->pdata->va_speed_cfg[1].uart_baud; + + /* Send wakeup byte */ + if (p->pdata->send_wakeup_seq && + p->power_mode == DBMDX_PM_SLEEPING) { + + u8 send[2] = {0, 0}; + + ret = uart_configure_tty(uart_p, + UART_TTY_WAKEUP_SEQ_BAUD_RATE, + uart_p->normal_stop_bits, + uart_p->normal_parity, + 0); + + if (ret) { + dev_err(uart_p->dev, + "%s: cannot configure tty to: %us%up%uf%u\n", + __func__, + UART_TTY_WAKEUP_SEQ_BAUD_RATE, + uart_p->normal_parity, + uart_p->normal_stop_bits, 0); + return; + } + uart_write_data(p, send, 1); + } + + if (p->power_mode == DBMDX_PM_SLEEPING) + /* It takes up to 100ms + * to PLL to stabilize after hibernation + */ + msleep(DBMDX_MSLEEP_UART_WAKEUP); + + ret = uart_configure_tty(uart_p, + uart_baud, + uart_p->normal_stop_bits, + uart_p->normal_parity, + 0); + if (ret) { + dev_err(uart_p->dev, + "%s: cannot configure tty to: %us%up%uf%u\n", + __func__, + uart_baud, + uart_p->normal_parity, + uart_p->normal_stop_bits, 0); + return; + } + /* Send wakeup in detection mode byte */ + if (p->pdata->send_wakeup_seq && + p->va_flags.mode == DBMDX_DETECTION) { + + u8 send[2] = {0, 0}; + + uart_write_data(p, send, 1); + + } + + } else { +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + if (uart_p->ps_nosuspend_wl) + __pm_relax(uart_p->ps_nosuspend_wl); +#endif + p->wakeup_release(p); + + if (!uart_p->uart_open) + return; + uart_close_file(uart_p); + } +} + +static void uart_resume(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + uart_interface_resume(uart_p); +} + + +void uart_interface_resume(struct dbmdx_uart_private *uart_p) +{ + dev_dbg(uart_p->dev, "%s\n", __func__); + + uart_p->interface_enabled = 1; + wake_up_interruptible(&dbmdx_wq); +} + +static void uart_suspend(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + uart_interface_suspend(uart_p); +} + + +void uart_interface_suspend(struct dbmdx_uart_private *uart_p) +{ + dev_dbg(uart_p->dev, "%s\n", __func__); + + uart_p->interface_enabled = 0; +} + +int uart_wait_till_alive(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + int ret = 0; + u16 response; + unsigned long stimeout = jiffies + msecs_to_jiffies(1000); + + uart_flush_rx_fifo(uart_p); + + /* Poll to wait for firmware completing its wakeup procedure: + * Read the firmware ID number + */ + do { + /* check if chip is alive */ + ret = send_uart_cmd_va(p, DBMDX_VA_FW_ID, &response); + if (ret) + continue; + + if (response == (u16)(p->pdata->firmware_id)) + ret = 0; + else + ret = -1; + } while (time_before(jiffies, stimeout) && ret != 0); + + if (ret != 0) + dev_err(p->dev, "%s: failed to read firmware id\n", __func__); + ret = (ret >= 0 ? 1 : 0); + + if (!ret) + dev_err(p->dev, "%s(): failed = 0x%x\n", __func__, ret); + + return ret; +} + +/* This function sets the uart speed and also can set the software flow + * control according to the define + */ +int uart_set_speed_host_only(struct dbmdx_private *p, int index) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret; + + ret = uart_configure_tty(uart_p, + p->pdata->va_speed_cfg[index].uart_baud, + uart_p->normal_stop_bits, + uart_p->normal_parity, + 0); + if (ret) { + dev_err(p->dev, "%s: cannot configure tty to: %us%up%uf%u\n", + __func__, + p->pdata->va_speed_cfg[index].uart_baud, + uart_p->normal_parity, + uart_p->normal_stop_bits, + 0); + goto out; + } + + dev_info(p->dev, "%s: Configure tty to: %us%up%uf%u\n", + __func__, + p->pdata->va_speed_cfg[index].uart_baud, + uart_p->normal_parity, + uart_p->normal_stop_bits, + 0); + + uart_p->normal_baud_rate = p->pdata->va_speed_cfg[index].uart_baud; + uart_flush_rx_fifo(uart_p); +out: + return ret; +} + +/* this set the uart speed no flow control */ + +int uart_set_speed(struct dbmdx_private *p, int index) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + int ret; + + ret = send_uart_cmd_va(p, + DBMDX_VA_UART_SPEED | + p->pdata->va_speed_cfg[index].uart_baud/100, + NULL); + if (ret) { + dev_err(p->dev, + "%s: failed to send UART change speed command\n", + __func__); + goto out; + } + + /* set baudrate to FW baud (common case) */ + ret = uart_configure_tty(uart_p, + p->pdata->va_speed_cfg[index].uart_baud, + uart_p->normal_stop_bits, + uart_p->normal_parity, + 0); + if (ret) { + dev_err(p->dev, "%s: cannot configure tty to: %us%up%uf%u\n", + __func__, + p->pdata->va_speed_cfg[index].uart_baud, + uart_p->normal_parity, + uart_p->normal_stop_bits, + 0); + goto out; + } + + dev_info(p->dev, "%s: Configure tty to: %us%up%uf%u\n", + __func__, + p->pdata->va_speed_cfg[index].uart_baud, + uart_p->normal_parity, + uart_p->normal_stop_bits, + 0); + + uart_p->normal_baud_rate = p->pdata->va_speed_cfg[index].uart_baud; + uart_flush_rx_fifo(uart_p); + + ret = uart_wait_till_alive(p); + + if (!ret) { + dev_err(p->dev, "%s: device not responding\n", __func__); + goto out; + } + ret = 0; + goto out; + +out: + return ret; +} + +static int uart_prepare_buffering(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + return 0; +} + +static int uart_read_audio_data(struct dbmdx_private *p, + void *buf, + size_t samples, + bool to_read_metadata, + size_t *available_samples, + size_t *data_offset) +{ + size_t bytes_to_read; + int ret; + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + mm_segment_t oldfs; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + oldfs = get_fs(); + set_fs(KERNEL_DS); + + ret = send_uart_cmd_va(p, DBMDX_VA_READ_AUDIO_BUFFER | samples, NULL); + + if (ret) { + dev_err(p->dev, "%s: failed to request %zu audio samples\n", + __func__, samples); + ret = -1; + goto out; + } + + *available_samples = 0; + + if (to_read_metadata) + *data_offset = 8; + else + *data_offset = 0; + + bytes_to_read = samples * 8 * p->bytes_per_sample + *data_offset; + + ret = uart_read_data(p, buf, bytes_to_read); + + if (ret != bytes_to_read) { + dev_err(p->dev, + "%s: read audio failed, %zu bytes to read, res(%d)\n", + __func__, + bytes_to_read, + ret); + ret = -1; + goto out; + } + + /* Word #4 contains current number of available samples */ + if (to_read_metadata) + *available_samples = (size_t)(((u16 *)buf)[3]); + else + *available_samples = samples; + + ret = samples; + +out: + /* restore old fs context */ + set_fs(oldfs); + return ret; +} + +static int uart_finish_buffering(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + return 0; +} + +static int uart_prepare_amodel_loading(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + return 0; +} + +static int uart_finish_amodel_loading(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s\n", __func__); + + /* do the same as for finishing buffering */ + return uart_finish_buffering(p); +} + +static int uart_open_thread(void *data) +{ + int ret; + struct dbmdx_uart_private *p = (struct dbmdx_uart_private *)data; + + ret = uart_open_file(p); + while (!kthread_should_stop()) + usleep_range(10000, 11000); + return ret; +} + +static u32 uart_get_read_chunk_size(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s UART read chunk is %u\n", + __func__, uart_p->pdata->read_chunk_size); + + return uart_p->pdata->read_chunk_size; +} + +static u32 uart_get_write_chunk_size(struct dbmdx_private *p) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + dev_dbg(uart_p->dev, "%s UART write chunk is %u\n", + __func__, uart_p->pdata->write_chunk_size); + + return uart_p->pdata->write_chunk_size; +} + +static int uart_set_read_chunk_size(struct dbmdx_private *p, u32 size) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + if (size > MAX_UART_READ_CHUNK_SIZE) { + dev_err(uart_p->dev, + "%s Error setting UART read chunk. Max chunk size: %u\n", + __func__, MAX_UART_READ_CHUNK_SIZE); + return -EINVAL; + } else if ((size % 2) != 0) { + dev_err(uart_p->dev, + "%s Error setting UART read chunk. Uneven size\n", + __func__); + return -EINVAL; + } else if (size == 0) + uart_p->pdata->read_chunk_size = DEFAULT_UART_READ_CHUNK_SIZE; + else + uart_p->pdata->read_chunk_size = size; + + dev_dbg(uart_p->dev, "%s UART read chunk was set to %u\n", + __func__, uart_p->pdata->read_chunk_size); + + return 0; +} + +static int uart_set_write_chunk_size(struct dbmdx_private *p, u32 size) +{ + struct dbmdx_uart_private *uart_p = + (struct dbmdx_uart_private *)p->chip->pdata; + + if (size > MAX_UART_WRITE_CHUNK_SIZE) { + dev_err(uart_p->dev, + "%s Error setting UART write chunk. Max chunk size: %u\n", + __func__, MAX_UART_WRITE_CHUNK_SIZE); + return -EINVAL; + } else if ((size % 2) != 0) { + dev_err(uart_p->dev, + "%s Error setting UART write chunk. Uneven size\n", + __func__); + return -EINVAL; + } else if (size == 0) + uart_p->pdata->write_chunk_size = DEFAULT_UART_WRITE_CHUNK_SIZE; + else + uart_p->pdata->write_chunk_size = size; + + dev_dbg(uart_p->dev, "%s UART write chunk was set to %u\n", + __func__, uart_p->pdata->write_chunk_size); + + return 0; +} + +int uart_common_probe(struct platform_device *pdev, const char threadnamefmt[]) +{ +#if IS_ENABLED(CONFIG_OF) + struct device_node *np; +#endif + int ret; + struct dbmdx_uart_private *p; + struct dbmdx_uart_data *pdata; + + dev_dbg(&pdev->dev, "%s\n", __func__); + + p = kzalloc(sizeof(*p), GFP_KERNEL); + if (p == NULL) + return -ENOMEM; + + p->pdev = pdev; + p->dev = &pdev->dev; + + p->chip.pdata = p; +#if IS_ENABLED(CONFIG_OF) + np = p->dev->of_node; + if (!np) { + dev_err(p->dev, "%s: no devicetree entry\n", __func__); + ret = -EINVAL; + goto out_err_kfree; + } + + pdata = kzalloc(sizeof(struct dbmdx_uart_data), GFP_KERNEL); + if (!pdata) { + ret = -ENOMEM; + goto out_err_kfree; + } + + ret = of_property_read_string(np, "uart_device", &pdata->uart_dev); + if (ret && ret != -EINVAL) { + dev_err(p->dev, "%s: invalid 'uart_device'\n", __func__); + ret = -EINVAL; + goto out_err_kfree; + } + + /* check for software flow control option */ + if (of_find_property(np, "software-flow-control", NULL)) { + dev_info(p->dev, "%s: Software flow control enabled\n", + __func__); + pdata->software_flow_control = 1; + } else + dev_info(p->dev, "%s: Software flow control disabled\n", + __func__); +#else + pdata = dev_get_platdata(&pdev->dev); +#endif + +#if IS_ENABLED(CONFIG_OF) + ret = of_property_read_u32(np, "read-chunk-size", + &pdata->read_chunk_size); + if (ret != 0) { + /* + * read-chunk-size not set, set it to default + */ + pdata->read_chunk_size = DEFAULT_UART_READ_CHUNK_SIZE; + dev_info(p->dev, + "%s: Setting uart read chunk to default val: %u bytes\n", + __func__, pdata->read_chunk_size); + } +#endif + if (pdata->read_chunk_size > MAX_UART_READ_CHUNK_SIZE) + pdata->read_chunk_size = MAX_UART_READ_CHUNK_SIZE; + if (pdata->read_chunk_size == 0) + pdata->read_chunk_size = DEFAULT_UART_READ_CHUNK_SIZE; + + dev_info(p->dev, "%s: Setting uart read chunk to %u bytes\n", + __func__, pdata->read_chunk_size); + +#if IS_ENABLED(CONFIG_OF) + ret = of_property_read_u32(np, "write-chunk-size", + &pdata->write_chunk_size); + if (ret != 0) { + /* + * write-chunk-size not set, set it to default + */ + pdata->write_chunk_size = DEFAULT_UART_WRITE_CHUNK_SIZE; + dev_info(p->dev, + "%s: Setting uart write chunk to default val: %u bytes\n", + __func__, pdata->write_chunk_size); + } +#endif + if (pdata->write_chunk_size > MAX_UART_WRITE_CHUNK_SIZE) + pdata->write_chunk_size = MAX_UART_WRITE_CHUNK_SIZE; + if (pdata->write_chunk_size == 0) + pdata->write_chunk_size = DEFAULT_UART_WRITE_CHUNK_SIZE; + + dev_info(p->dev, "%s: Setting uart write chunk to %u bytes\n", + __func__, pdata->write_chunk_size); + + p->pdata = pdata; + + init_completion(&p->uart_done); + atomic_set(&p->stop_uart_probing, 0); + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + p->ps_nosuspend_wl = + wakeup_source_create("dbmdx_nosuspend_wakelock_uart"); + + if (p->ps_nosuspend_wl) + wakeup_source_add(p->ps_nosuspend_wl); + else + dev_err(p->dev, + "%s: Err creating WS: dbmdx_nosuspend_wakelock_uart\n", + __func__); +#endif + + /* fill in chip interface functions */ + p->chip.can_boot = uart_can_boot; + p->chip.prepare_boot = uart_prepare_boot; + p->chip.boot = uart_boot; + p->chip.finish_boot = uart_finish_boot; + p->chip.dump = uart_dump_state; + p->chip.set_va_firmware_ready = uart_set_va_firmware_ready; + p->chip.set_vqe_firmware_ready = uart_set_vqe_firmware_ready; + p->chip.transport_enable = uart_transport_enable; + p->chip.read = uart_read_data; + p->chip.write = uart_write_data; + p->chip.send_cmd_vqe = send_uart_cmd_vqe; + p->chip.send_cmd_va = send_uart_cmd_va; + p->chip.send_cmd_boot = send_uart_cmd_boot; + p->chip.verify_boot_checksum = uart_verify_boot_checksum; + p->chip.prepare_buffering = uart_prepare_buffering; + p->chip.read_audio_data = uart_read_audio_data; + p->chip.finish_buffering = uart_finish_buffering; + p->chip.prepare_amodel_loading = uart_prepare_amodel_loading; + p->chip.finish_amodel_loading = uart_finish_amodel_loading; + p->chip.get_write_chunk_size = uart_get_write_chunk_size; + p->chip.get_read_chunk_size = uart_get_read_chunk_size; + p->chip.set_write_chunk_size = uart_set_write_chunk_size; + p->chip.set_read_chunk_size = uart_set_read_chunk_size; + p->chip.resume = uart_resume; + p->chip.suspend = uart_suspend; + + p->interface_enabled = 1; + + dev_set_drvdata(p->dev, &p->chip); + + p->uart_probe_thread = kthread_run(uart_open_thread, + (void *)p, + threadnamefmt); + if (IS_ERR_OR_NULL(p->uart_probe_thread)) { + dev_err(p->dev, + "%s(): can't create dbmd uart probe thread = %p\n", + __func__, p->uart_probe_thread); + ret = -ENOMEM; + goto out_err_kfree; + } + + dev_info(p->dev, "%s: successfully probed\n", __func__); + + ret = 0; + goto out; + +out_err_kfree: + kfree(p); +out: + return ret; +} + +int uart_common_remove(struct platform_device *pdev) +{ + struct chip_interface *ci = dev_get_drvdata(&pdev->dev); + struct dbmdx_uart_private *p = (struct dbmdx_uart_private *)ci->pdata; + + dev_set_drvdata(p->dev, NULL); + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + if (p->ps_nosuspend_wl) { + wakeup_source_remove(p->ps_nosuspend_wl); + wakeup_source_destroy(p->ps_nosuspend_wl); + } +#endif + + uart_close_file(p); + kfree(p); + + return 0; +} diff --git a/sound/soc/codecs/dbmdx/dbmdx-uart.h b/sound/soc/codecs/dbmdx/dbmdx-uart.h new file mode 100755 index 000000000000..5da1490d7a40 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-uart.h @@ -0,0 +1,81 @@ +/* + * dbmdx-uart-common.h -- DBMDX UART interface common functions + * + * Copyright (C) 2014 DSP Group + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _DBMDX_UART_COMMON_H +#define _DBMDX_UART_COMMON_H + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) +#include <linux/pm_wakeup.h> +#endif + +#define RETRY_COUNT 5 + +struct dbmdx_uart_data { + const char *uart_dev; + unsigned int software_flow_control; + u32 read_chunk_size; + u32 write_chunk_size; + u8 read_buf[MAX_REQ_SIZE]; +}; + +struct dbmdx_uart_private { + struct platform_device *pdev; + struct dbmdx_uart_data *pdata; + struct device *dev; + struct chip_interface chip; +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + struct wakeup_source *ps_nosuspend_wl; +#endif + struct tty_struct *tty; + struct file *fp; + struct tty_ldisc *ldisc; + unsigned int boot_baud_rate; + int boot_stop_bits; + int boot_parity; + unsigned int normal_baud_rate; + int normal_stop_bits; + int normal_parity; + unsigned int boot_lock_buffer_size; + int uart_open; + atomic_t stop_uart_probing; + struct task_struct *uart_probe_thread; + struct completion uart_done; + u16 post_pll_div; + u32 interface_enabled; +}; + + +void uart_flush_rx_fifo(struct dbmdx_uart_private *p); +int uart_configure_tty(struct dbmdx_uart_private *p, u32 bps, int stop, + int parity, int flow); +ssize_t uart_read_data(struct dbmdx_private *p, void *buf, size_t len); +ssize_t uart_write_data_no_sync(struct dbmdx_private *p, const void *buf, + size_t len); +ssize_t uart_write_data(struct dbmdx_private *p, const void *buf, + size_t len); +ssize_t send_uart_cmd_vqe(struct dbmdx_private *p, u32 command, + u16 *response); +ssize_t send_uart_cmd_va(struct dbmdx_private *p, u32 command, + u16 *response); +int send_uart_cmd_boot(struct dbmdx_private *p, u32 command); +int uart_verify_boot_checksum(struct dbmdx_private *p, + const void *checksum, size_t chksum_len); +int uart_verify_chip_id(struct dbmdx_private *p); +int uart_wait_for_ok(struct dbmdx_private *p); +int uart_wait_till_alive(struct dbmdx_private *p); +int uart_set_speed_host_only(struct dbmdx_private *p, int index); +int uart_set_speed(struct dbmdx_private *p, int index); +int uart_common_probe(struct platform_device *pdev, const char threadnamefmt[]); +int uart_common_remove(struct platform_device *pdev); +void uart_set_private_callbacks(struct dbmdx_uart_private *p); +void uart_interface_resume(struct dbmdx_uart_private *uart_p); +void uart_interface_suspend(struct dbmdx_uart_private *uart_p); + +#endif diff --git a/sound/soc/codecs/dbmdx/dbmdx-va-regmap.h b/sound/soc/codecs/dbmdx/dbmdx-va-regmap.h new file mode 100755 index 000000000000..2b62ed709bfa --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-va-regmap.h @@ -0,0 +1,135 @@ +/* + * dbmdx-va-regmap.h -- DBMDX VA register mapping + * + * Copyright (C) 2014 DSP Group + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _DBMDX_VA_REGMAP_H +#define _DBMDX_VA_REGMAP_H + +/* DBMDX commands and values */ +#define DBMDX_VA_SYNC_POLLING 0x80000000 +#define DBMDX_VA_CMD_MASK 0x80000000 + +#define DBMDX_VA_SET_POWER_STATE_SLEEP 0x80170001 + +#define DBMDX_VA_GET_FW_VER 0x80000000 +#define DBMDX_VA_OPR_MODE 0x80010000 +#define DBMDX_VA_PRIMARY_AMODEL_SIZE 0x80020000 +#define DBMDX_VA_SECONDARY_AMODEL_SIZE 0x80030000 +#define DBMDX_VA_DIGITAL_GAIN 0x80040000 +#define DBMDX_VA_IO_PORT_ADDR_LO 0x80050000 +#define DBMDX_VA_IO_PORT_ADDR_HI 0x80060000 +#define DBMDX_VA_IO_PORT_VALUE_LO 0x80070000 +#define DBMDX_VA_IO_PORT_VALUE_HI 0x80080000 +#define DBMDX_VA_AUDIO_BUFFER_SIZE 0x80090000 +#define DBMDX_VA_NUM_OF_SMP_IN_BUF 0x800A0000 +#define DBMDX_VA_LAST_MAX_SMP_VALUE 0x800B0000 +#define DBMDX_VA_UART_SPEED 0x800C0000 +#define DBMDX_VA_LOAD_NEW_ACUSTIC_MODEL 0x800F0000 +#define DBMDX_VA_CLK_CFG 0x80100000 +#define DBMDX_VA_AUDIO_PROC_ROUTING 0x80110000 +#define DBMDX_VA_AUDIO_BUFFER_CONVERSION 0x80120000 +#define DBMDX_VA_AUDIO_HISTORY 0x80120000 +#define DBMDX_VA_UART_XOFF 0x80130000 +#define DBMDX_VA_OKG_INTERFACE 0x80140000 +#define DBMDX_VA_ANALOG_MIC_GAIN 0x80160000 +#define DBMDX_VA_DEBUG_1 0x80180000 +#define DBMDX_VA_SWITCH_TO_BOOT 0x80180015 +#define DBMDX_VA_FW_ID 0x80190000 +#define DBMDX_VA_HPF_ENABLE 0x801A0000 +#define DBMDX_VA_MASTER_CLK_FREQ 0x801B0000 +#define DBMDX_VA_TDM0_SCLK_FREQ 0x801D0000 +#define DBMDX_VA_DSP_CLOCK_CONFIG_EXT 0x801E0000 +#define DBMDX_VA_AUDIO_ROUTING_CONFIG 0x801F0000 +#define DBMDX_VA_READ_AUDIO_BUFFER 0x80200000 +#define DBMDX_VA_POST_DETECTION_CLK_CFG 0x80210000 + +#define DBMDX_VA_GENERAL_CONFIGURATION_1 0x80220000 +#define DBMDX_VA_GENERAL_CONFIGURATION_2 0x80230000 +#define DBMDX_VA_MICROPHONE1_CONFIGURATION 0x80240000 +#define DBMDX_VA_MICROPHONE2_CONFIGURATION 0x80250000 +#ifndef DBMDX_FW_BELOW_280 +#define DBMDX_VA_MICROPHONE3_CONFIGURATION 0x80260000 +#define DBMDX_VA_MICROPHONE4_CONFIGURATION 0x80270000 +#endif +#define DBMDX_VA_HOST_INTERFACE_SUPPORT 0x80290000 + +#ifndef DBMDX_FW_BELOW_280 +#define DBMDX_VA_SET_PARAM_ADDR 0x803D0000 +#define DBMDX_VA_GET_PARAM 0x803F0000 +#define DBMDX_VA_SET_PARAM 0x803E0000 +#else +#define DBMDX_VA_SET_PARAM_ADDR 0x801C0000 +#define DBMDX_VA_GET_PARAM 0x80270000 +#define DBMDX_VA_SET_PARAM 0x80260000 +#endif + +#define DBMDX_VA_AUDIO_STREAMING_SRC_SELECT 0x80130000 +#define DBMDX_VA_FEATURE_SUPPORT 0x80350000 +#define DBMDX_VA_TDM_ACTIVATION_CTL 0x80310000 +#define DBMDX_VA_AUDIO_PROC_CONFIG 0x80340000 +#define DBMDX_VA_TDM_RX_CONFIG 0x80360000 +#define DBMDX_VA_TDM_TX_CONFIG 0x80370000 + +#define DBMDX_VA_SENS_RECOGNITION_MODE 0x80400000 +#define DBMDX_VA_SENS_INITIALIZED 0x80410000 +#define DBMDX_VA_SENS_TG_THRESHOLD 0x80470000 +#define DBMDX_VA_SENS_VERIF_THRESHOLD 0x80480000 +#define DBMDX_VA_SENS_WORDID 0x805B0000 +#define DBMDX_VA_SENS_ALTWORDID 0x805C0000 +#define DBMDX_VA_SENS_FINAL_SCORE 0x805D0000 +#define DBMDX_VA_SENS_SV_SCORE 0x805E0000 + +#define DBMDX_VA_ASRP_LIB_VER 0x0100 +#define DBMDX_VA_ASRP_PARAM_SIZE 0x0101 +#define DBMDX_VA_ASRP_FORCE_INIT_STATE 0x0102 +#define DBMDX_VA_ASRP_NUM_OF_WARNINGS 0x0103 +#define DBMDX_VA_ASRP_NUM_OF_ERRORS 0x0104 +#define DBMDX_VA_ASRP_ERROR_NUMBER 0x0105 +#define DBMDX_VA_ASRP_MIC_REF_DELAY 0x0107 + + +#define DBMDX_VA_ASRP_CONTROL 0x0120 +#define DBMDX_VA_ASRP_DELAY_IN_BYPASS_MODE 0x0121 +#define DBMDX_VA_ASRP_IN_TO_OUT_IN_BYPASS_MODE 0x0122 +#define DBMDX_VA_ASRP_BLK_ID_LOW 0x0124 +#define DBMDX_VA_ASRP_BLK_ID_HI 0x0125 +#define DBMDX_VA_ASRP_PARAM_OFFSET 0x0126 +#define DBMDX_VA_ASRP_PARAM_VALUE 0x0127 + +#define DBMDX_VA_ASRP_QED_BASE 0x0140 +#define DBMDX_VA_ASRP_QED_OUT_DETECTION (DBMDX_VA_ASRP_QED_BASE + 3) +#define DBMDX_VA_ASRP_QED_ENABLE (DBMDX_VA_ASRP_QED_BASE + 6) +#define DBMDX_VA_ASRP_QED_NO_SIGNAL_FRAMES (DBMDX_VA_ASRP_QED_BASE + 7) +#define DBMDX_VA_ASRP_QED_QUERY_HYP_MIN_FRAMES (DBMDX_VA_ASRP_QED_BASE + 8) +#define DBMDX_VA_ASRP_QED_EXPIRATION_FRAMES (DBMDX_VA_ASRP_QED_BASE + 9) + + +#define DBMDX_READ_CHECKSUM 0x805A0E00 +#define DBMDX_FIRMWARE_BOOT 0x805A0B00 +#define DBMDX_CLEAR_CHECKSUM 0x805A0F00 + +#define DBMDX_VA_USLEEP_FLAG 0x0aaa +#define DBMDX_VA_MSLEEP_FLAG 0x0aab + +#define DBMDX_UNDEFINED_REGISTER 0xeeee + +#define DBMDX_FIRMWARE_ID_DBMD2 0xdbd2 +#define DBMDX_FIRMWARE_ID_DBMD4 0xdbd4 +#define DBMDX_FIRMWARE_ID_DBMD6 0xdbd6 +#define DBMDX_FIRMWARE_ID_DBMD8 0xdbd8 + +#define DBMDX_MIC_DISABLE_VAL 0x0200 + +#define DBMDX_POST_PLL_DIV_MASK 0x0007 +#define DBMDX_OKG_AMODEL_SUPPORT_MASK 0x0100 +#define DBMDX_SV_AMODEL_SUPPORT_MASK 0x0001 +#define DBMDX_SVT_AMODEL_SUPPORT_MASK 0x0004 +#define OKG_EVENT_ID 0x10 +#define LOAD_AMODEL_OKG_FW_CMD 0x2 +#endif diff --git a/sound/soc/codecs/dbmdx/dbmdx-vqe-regmap.h b/sound/soc/codecs/dbmdx/dbmdx-vqe-regmap.h new file mode 100755 index 000000000000..dfea70f8cb5a --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx-vqe-regmap.h @@ -0,0 +1,80 @@ +/* + * dbmdx-vqe-regmap.h -- DBMDX VQE register mapping + * + * Copyright (C) 2014 DSP Group + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _DBMDX_VQE_REGMAP_H +#define _DBMDX_VQE_REGMAP_H + +#define DBMDX_VQE_SET_CMD_OFFSET (0x00010000) + +#define DBMDX_VQE_SET_RESET_CMD (0x00010000) +#define DBMDX_VQE_SET_PING_CMD (0x00030000) +#define DBMDX_VQE_GET_POWER_STATE_CMD (0x00040000) +#define DBMDX_VQE_SET_POWER_STATE_CMD (0x00050000) +#define DBMDX_VQE_GET_SYSTEM_CONFIG_CMD (0x00060000) +#define DBMDX_VQE_SET_SYSTEM_CONFIG_CMD (0x00070000) +#define DBMDX_VQE_GET_USE_CASE_CMD (0x00080000) +#define DBMDX_VQE_SET_USE_CASE_CMD (0x00090000) +#define DBMDX_VQE_GET_HW_TDM_BYPASS_CMD (0x000A0000) +#define DBMDX_VQE_SET_HW_TDM_BYPASS_CMD (0x000B0000) +#define DBMDX_VQE_SET_FADE_IN_OUT_CMD (0x000D0000) +#define DBMDX_VQE_GET_SPK_VOL_LVL_CMD (0x000E0000) +#define DBMDX_VQE_SET_SPK_VOL_LVL_CMD (0x000F0000) +#define DBMDX_VQE_SET_SWITCH_TO_BOOT_CMD (0x00110000) + +#define DBMDX_VQE_SET_ALE_GAIN_MAX_CMD (0x08010000) +#define DBMDX_VQE_SET_ALE_FRM_SNR_MAX_CMD (0x08030000) + +#define DBMDX_VQE_GET_HOST_STATUS_CMD (0x10000000) +#define DBMDX_VQE_SET_HOST_STATUS_CMD (0x10010000) +#define DBMDX_VQE_GET_HIBERNATE_ENABLE_CMD (0x10060000) +#define DBMDX_VQE_SET_HIBERNATE_ENABLE_CMD (0x10070000) +#define DBMDX_VQE_SET_LOG_VERSION_INFO_CMD (0x10090000) + +#define DBMDX_VQE_SET_MSG_WORD_SET_IND_CMD (0x18010000) +#define DBMDX_VQE_GET_MSG_WORD_DATA_CMD (0x18020000) +#define DBMDX_VQE_SET_MSG_WORD_DATA_CMD (0x18030000) + +#define DBMDX_VQE_SET_INDIRECT_REG_ADDR_ACCESS_CMD (0x18150000) +#define DBMDX_VQE_GET_INDIRECT_REG_DATA_ACCESS_CMD (0x18160000) +#define DBMDX_VQE_SET_INDIRECT_REG_DATA_ACCESS_CMD (0x18170000) + +#define DBMDX_VQE_GET_APB_READ_ACCESS_CMD (0x181A0000) +#define DBMDX_VQE_SET_APB_READ_ACCESS_CMD (0x181B0000) +#define DBMDX_VQE_GET_AHB_READ_ACCESS_CMD (0x181C0000) +#define DBMDX_VQE_SET_AHB_READ_ACCESS_CMD (0x181D0000) + +#define DBMDX_VQE_HOST_STATUS_CMD_PRODUCT_MAJOR_VER (0x3400) +#define DBMDX_VQE_HOST_STATUS_CMD_PRODUCT_MINOR_VER (0x3401) +#define DBMDX_VQE_HOST_STATUS_CMD_FW_VER (0x3402) +#define DBMDX_VQE_HOST_STATUS_CMD_PATCH_VER (0x3403) +#define DBMDX_VQE_HOST_STATUS_CMD_DEBUG_VER (0x3404) +#define DBMDX_VQE_HOST_STATUS_CMD_TUNING_VER (0x3405) + + +#define DBMDX_VQE_SET_USE_CASE_CMD_IDLE (0x0000) +#define DBMDX_VQE_SET_USE_CASE_DE_ACT_MASK (0xff00) +#define DBMDX_VQE_SET_USE_CASE_ACT_MASK (0x00ff) + + +#define DBMDX_VQE_SET_SYSTEM_CONFIG_PRIMARY_CFG (0x0000) +#define DBMDX_VQE_SET_SYSTEM_CONFIG_SECONDARY_CFG (0x0001) +#define DBMDX_VQE_SET_SYSTEM_CONFIG_DIAGNOSTICS_CFG (0x0002) + +#define DBMDX_VQE_SET_POWER_STATE_HIBERNATE (0x0001) + +#define DBMDX_VQE_SET_FADE_IN_OUT_FADE_IN_EN (0x0001) +#define DBMDX_VQE_SET_FADE_IN_OUT_FADE_OUT_EN (0x0002) + +#define DBMDX_VQE_SET_HW_TDM_BYPASS_FIRST_PAIR_EN (0x0001) +#define DBMDX_VQE_SET_HW_TDM_BYPASS_SECOND_PAIR_EN (0x0002) +#define DBMDX_VQE_SET_HW_TDM_BYPASS_MODE_0 (0x0000) +#define DBMDX_VQE_SET_HW_TDM_BYPASS_MODE_1 (0x0004) + +#endif diff --git a/sound/soc/codecs/dbmdx/dbmdx.c b/sound/soc/codecs/dbmdx/dbmdx.c new file mode 100755 index 000000000000..500516e99676 --- /dev/null +++ b/sound/soc/codecs/dbmdx/dbmdx.c @@ -0,0 +1,16979 @@ +/* + * DSPG DBMDX codec driver + * + * Copyright (C) 2014 DSP Group + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#define DEBUG + +#include <linux/delay.h> +#include <linux/firmware.h> +#include <linux/gpio.h> +#include <linux/module.h> +#include <linux/mutex.h> +#include <linux/slab.h> +#include <linux/workqueue.h> +#include <linux/clk.h> +#if IS_ENABLED(CONFIG_OF) +#include <linux/of.h> +#if IS_ENABLED(CONFIG_OF_I2C) +#include <linux/of_i2c.h> +#endif /* CONFIG_OF_I2C */ +#include <linux/of_gpio.h> +#endif /* CONFIG_OF */ +#include <linux/kfifo.h> +#include <linux/vmalloc.h> +#include <sound/core.h> +#include <sound/pcm.h> +#include <sound/pcm_params.h> +#include <sound/soc.h> +#include <sound/initval.h> +#include <sound/tlv.h> +#include <linux/i2c.h> +#include <linux/spi/spi.h> +#include <linux/platform_device.h> +#include <linux/regulator/consumer.h> +#include <linux/kthread.h> +#include <linux/version.h> + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) +#include <linux/pm_wakeup.h> +#endif + +#include "dbmdx-interface.h" +#include "dbmdx-customer.h" +#include "dbmdx-va-regmap.h" +#include "dbmdx-vqe-regmap.h" +#include "dbmdx-i2s.h" +#include <sound/dbmdx-export.h> + +/* Size must be power of 2 */ +#define MAX_KFIFO_BUFFER_SIZE_MONO (32768 * 8) /* >8 seconds */ +#define MAX_KFIFO_BUFFER_SIZE_STEREO (MAX_KFIFO_BUFFER_SIZE_MONO * 2) +#define MAX_KFIFO_BUFFER_SIZE_4CH (MAX_KFIFO_BUFFER_SIZE_MONO * 4) + +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) +#define MAX_SUPPORTED_CHANNELS 4 +#define MAX_KFIFO_BUFFER_SIZE MAX_KFIFO_BUFFER_SIZE_4CH +#define VA_MIC_CONFIG_SIZE 5 +#else +#define MAX_SUPPORTED_CHANNELS 2 +#define MAX_KFIFO_BUFFER_SIZE MAX_KFIFO_BUFFER_SIZE_STEREO +#define VA_MIC_CONFIG_SIZE 3 +#endif + +#define MIN_RETRIES_TO_WRITE_TOBUF 5 +#define MAX_RETRIES_TO_WRITE_TOBUF 200 +#define MAX_AMODEL_SIZE (148 * 1024) + +#define DRIVER_VERSION "6.0.0" + +#define DBMDX_AUDIO_MODE_PCM 0 +#define DBMDX_AUDIO_MODE_MU_LAW 1 + +#define DBMDX_SND_PCM_RATE_16000 0x0000 +#define DBMDX_SND_PCM_RATE_32000 0x0100 +#define DBMDX_SND_PCM_RATE_44100 0x0100 +#define DBMDX_SND_PCM_RATE_48000 0x0200 +#define DBMDX_SND_PCM_RATE_8000 0x0300 +#define DBMDX_SND_PCM_RATE_MASK 0xFCFF +#define DBMDX_HW_VAD_MASK 0x0060 + +#define DIGITAL_GAIN_TLV_MIN 0 +#if defined(DBMDX_FW_BELOW_300) || defined(DBMDX_FW_BELOW_280) +#define DIGITAL_GAIN_TLV_MAX 240 +#define DIGITAL_GAIN_TLV_SHIFT 120 +#else +#define DIGITAL_GAIN_TLV_MAX 1920 +#define DIGITAL_GAIN_TLV_SHIFT 860 +#endif +#define MIN_EVENT_PROCESSING_TIME_MS 500 + +#ifndef RETRY_COUNT +#define RETRY_COUNT 5 +#endif + +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX_SND_CAPTURE) && \ + (DBMDX_USE_ASLA_CONTROLS_WITH_DBMDX_CARD_ONLY) +#define SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY 1 +#endif + +#if defined(SND_SOC_BYTES_TLV) +#define EXTERNAL_SOC_AMODEL_LOADING_ENABLED 1 +#endif + +#define DBMDX_ALWAYS_RELOAD_ASRP_PARAMS 1 +#define DBMDX_RECOVERY_TEST_ENABLE 1 + +enum dbmdx_detection_mode { + DETECTION_MODE_OFF = 0, + DETECTION_MODE_PHRASE = 1, + DETECTION_MODE_VOICE_ENERGY, + DETECTION_MODE_VOICE_COMMAND, + DETECTION_MODE_DUAL, + DETECTION_MODE_PHRASE_DONT_LOAD, +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + DETECTION_MODE_OKG, + DETECTION_MODE_MAX = DETECTION_MODE_OKG +#else + DETECTION_MODE_MAX = DETECTION_MODE_PHRASE_DONT_LOAD +#endif +}; + +enum dbmdx_fw_debug_mode { + FW_DEBUG_OUTPUT_UART = 0, + FW_DEBUG_RECORD_NO_FW_LOG, + FW_DEBUG_OUTPUT_NONE +}; + +#define VA_MIXER_REG(cmd) \ + (((cmd) >> 16) & 0x7fff) +#define VQE_MIXER_REG(cmd) \ + (((cmd) >> 16) & 0xffff) + + +static const char *dbmdx_power_mode_names[DBMDX_PM_STATES] = { + "BOOTING", + "ACTIVE", + "FALLING_ASLEEP", + "SLEEPING", +}; + +static const char *dbmdx_state_names[DBMDX_NR_OF_STATES] = { + "IDLE", + "DETECTION", +#if IS_ENABLED(DBMDX_FW_BELOW_300) + "RESERVED_2", + "BUFFERING", +#else + "BUFFERING", + "UART_RECORDING", +#endif + "SLEEP_PLL_ON", + "SLEEP_PLL_OFF", + "HIBERNATE", + "PCM_STREAMING", + "DETECTION_AND_STREAMING", +}; + +static const char *dbmdx_of_clk_names[DBMDX_NR_OF_CLKS] = { + "dbmdx_constant_clk", + "dbmdx_master_clk", +}; + +#if IS_ENABLED(CONFIG_OF) +static const char *dbmdx_of_clk_rate_names[DBMDX_NR_OF_CLKS] = { + "constant-clk-rate", + "master-clk-rate", +}; +#endif + +static const char *dbmdx_fw_names[DBMDX_FW_MAX] = { + [DBMDX_FW_PRE_BOOT] = "PRE_BOOT", + [DBMDX_FW_VA] = "VA", + [DBMDX_FW_VQE] = "VQE", + [DBMDX_FW_POWER_OFF_VA] = "POWER_OFF", +}; + +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) +enum dbmdx_va_ns_config { + VA_NS_CONFIG_DMIC_DETECTION = 0, + VA_NS_CONFIG_AMIC = 1, + VA_NS_CONFIG_DMIC_STREAMING_WITH_NS = 2, + VA_NS_CONFIG_DMIC_STREAMING_WITHOUT_NS = 3, + VA_NS_CONFIG_DISABLE = 4, + VA_NS_CONFIG_MAX = VA_NS_CONFIG_DISABLE +}; +#endif + + +/* Global Variables */ +struct dbmdx_private *dbmdx_data; +struct snd_soc_codec *remote_codec; +void (*g_event_callback)(int) = NULL; +void (*g_set_i2c_freq_callback)(struct i2c_adapter*, enum i2c_freq_t) = NULL; + +/* Forward declarations */ +#if IS_ENABLED(DBMDX_KEEP_ALIVE_TIMER) +static void cancel_keep_alive_timer(struct dbmdx_private *p); +static int arm_keep_alive_timer(struct dbmdx_private *p); +#endif + +static int dbmdx_va_amodel_update(struct dbmdx_private *p, int val); +static int dbmdx_perform_recovery(struct dbmdx_private *p); +static int dbmdx_disable_microphones(struct dbmdx_private *p); +static int dbmdx_restore_microphones(struct dbmdx_private *p); +static int dbmdx_restore_fw_vad_settings(struct dbmdx_private *p); +static int dbmdx_disable_hw_vad(struct dbmdx_private *p); +static int dbmdx_read_fw_vad_settings(struct dbmdx_private *p); +static int dbmdx_set_power_mode( + struct dbmdx_private *p, enum dbmdx_power_modes mode); +static int dbmdx_va_amodel_load_file(struct dbmdx_private *p, + int num_of_amodel_files, + const char **amodel_fnames, + u32 gram_addr, + char *amodel_buf, + ssize_t *amodel_size, + int *num_of_amodel_chunks, + ssize_t *amodel_chunks_size); +static int dbmdx_va_amodel_load_dummy_model(struct dbmdx_private *p, + u32 gram_addr, + char *amodel_buf, + ssize_t *amodel_size, + int *num_of_amodel_chunks, + ssize_t *amodel_chunks_size); + +static int dbmdx_shutdown(struct dbmdx_private *p); +static int dbmdx_set_sv_recognition_mode(struct dbmdx_private *p, + enum dbmdx_sv_recognition_mode mode); +static int dbmdx_va_amodel_send(struct dbmdx_private *p, const void *data, + size_t size, int num_of_chunks, size_t *chunk_sizes, + const void *checksum, size_t chksum_len, + u16 load_amodel_mode_cmd); +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) +static int dbmdx_set_okg_recognition_mode(struct dbmdx_private *p, + enum dbmdx_okg_recognition_mode mode); +#endif + +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) +static int dbmdx_configure_ns(struct dbmdx_private *p, int mode, bool enable); +#endif + +#if IS_ENABLED(CONFIG_OF) +static int dbmdx_get_fw_interfaces(struct dbmdx_private *p, + const char *tag, + int *iarray); +#endif + +static int dbmdx_schedule_work(struct dbmdx_private *p, + struct work_struct *work) +{ +#if IS_ENABLED(USE_DEDICATED_WORKQUEUE) + return queue_work(p->dbmdx_workq, work); +#else + return schedule_work(work); +#endif +} + +static const char *dbmdx_fw_type_to_str(int fw_type) +{ + if (fw_type >= DBMDX_FW_MAX) + return "ERROR"; + return dbmdx_fw_names[fw_type]; +} + +static int dbmdx_set_active_interface(struct dbmdx_private *p, + int interface_idx) +{ + if (p == NULL) { + pr_err("%s: DBMDX platform was not initialized (p==NULL)\n", + __func__); + return -ENODEV; + } + + if (interface_idx < 0) { + dev_err(p->dev, "%s: Interface is not supported\n", __func__); + return -EINVAL; + } + + if (interface_idx >= p->nr_of_interfaces) { + dev_err(p->dev, + "%s: Invalid interface index: %d (index range[0:%d]\n", + __func__, interface_idx, p->nr_of_interfaces - 1); + return -EINVAL; + } + + p->chip = p->interfaces[interface_idx]; + p->active_interface = p->interface_types[interface_idx]; + + dev_info(p->dev, "%s: switched to interface#: %d\n", + __func__, interface_idx); + + return 0; +} + +static int dbmdx_switch_to_va_chip_interface(struct dbmdx_private *p, + enum dbmdx_interface_type interface_type) + +{ + int ret = 0; + /* set VA as active firmware */ + p->active_fw = p->active_fw_va_chip; + + ret = dbmdx_set_active_interface(p, + p->pdata->va_interfaces[interface_type]); + + if (ret) { + dev_err(p->dev, "%s: failed to set interface\n", __func__); + return ret; + } + + p->active_interface_type_va = interface_type; + p->cur_reset_gpio = p->pdata->gpio_reset; + p->cur_wakeup_gpio = p->pdata->gpio_wakeup; + p->cur_wakeup_disabled = p->pdata->wakeup_disabled; + p->cur_wakeup_set_value = p->pdata->wakeup_set_value; + p->cur_send_wakeup_seq = p->pdata->send_wakeup_seq; + p->cur_use_gpio_for_wakeup = p->pdata->use_gpio_for_wakeup; + p->cur_firmware_id = p->pdata->firmware_id; + p->cur_boot_options = p->pdata->boot_options; + + p->active_chip = DBMDX_CHIP_VA; + + return ret; +} + + +static void dbmdx_set_va_active(struct dbmdx_private *p) +{ + /* set VA as active firmware */ + p->active_fw_va_chip = DBMDX_FW_VA; + /* reset all flags */ + memset(&p->va_flags, 0, sizeof(p->va_flags)); + memset(&p->vqe_flags, 0, sizeof(p->vqe_flags)); +} + +static void dbmdx_set_vqe_active(struct dbmdx_private *p) +{ + /* set VQE as active firmware */ + p->active_fw_va_chip = DBMDX_FW_PRE_BOOT; + /* reset all flags */ + memset(&p->va_flags, 0, sizeof(p->va_flags)); + memset(&p->vqe_flags, 0, sizeof(p->vqe_flags)); +} + +static void dbmdx_set_boot_active(struct dbmdx_private *p) +{ + /* set nothing as active firmware */ + p->active_fw_va_chip = DBMDX_FW_PRE_BOOT; + p->device_ready = false; + p->asleep = false; +} + +static void dbmdx_reset_set(struct dbmdx_private *p) +{ + if (p->pdata->gpio_d2strap1 >= 0) + gpio_direction_output(p->pdata->gpio_d2strap1, + p->pdata->gpio_d2strap1_rst_val); + + dev_dbg(p->dev, "%s: %d==>gpio%d\n", __func__, 0, p->cur_reset_gpio); + + gpio_set_value(p->cur_reset_gpio, 0); +} + +static void dbmdx_reset_release(struct dbmdx_private *p) +{ + dev_dbg(p->dev, "%s: %d==>gpio%d\n", __func__, 1, p->cur_reset_gpio); + + gpio_set_value(p->cur_reset_gpio, 1); + + if (p->pdata->gpio_d2strap1 >= 0) + gpio_direction_input(p->pdata->gpio_d2strap1); +} + +static void dbmdx_reset_sequence(struct dbmdx_private *p) +{ + dbmdx_reset_set(p); + usleep_range(DBMDX_USLEEP_RESET_TOGGLE, + DBMDX_USLEEP_RESET_TOGGLE + 100); + dbmdx_reset_release(p); +} + +static int dbmdx_can_wakeup(struct dbmdx_private *p) +{ + if (p->cur_wakeup_disabled) + return 0; + + /* If use_gpio_for_wakeup equals zero than transmit operation + * itself will wakeup the chip + */ + if (!p->cur_use_gpio_for_wakeup) + return 1; + + return p->cur_wakeup_gpio < 0 ? 0 : 1; +} + +static void dbmdx_wakeup_set(struct dbmdx_private *p) +{ + /* If use_gpio_for_wakeup equals zero than transmit operation + * itself will wakeup the chip + */ + if (p->cur_wakeup_disabled || p->cur_wakeup_gpio < 0 || + !p->cur_use_gpio_for_wakeup) + return; + + dev_dbg(p->dev, "%s: %d==>gpio%d\n", __func__, + p->cur_wakeup_set_value, p->cur_wakeup_gpio); + + gpio_set_value(p->cur_wakeup_gpio, p->cur_wakeup_set_value); +} + +static void dbmdx_wakeup_release(struct dbmdx_private *p) +{ + /* If use_gpio_for_wakeup equals zero than transmit operation + * itself will wakeup the chip + */ + if (p->cur_wakeup_disabled || p->cur_wakeup_gpio < 0 || + !p->cur_use_gpio_for_wakeup) + return; + + dev_dbg(p->dev, "%s: %d==>gpio%d\n", __func__, + !(p->cur_wakeup_set_value), p->cur_wakeup_gpio); + + gpio_set_value(p->cur_wakeup_gpio, !(p->cur_wakeup_set_value)); +} + +static void dbmdx_wakeup_toggle(struct dbmdx_private *p) +{ + /* If use_gpio_for_wakeup equals zero than transmit operation + * itself will wakeup the chip + */ + if (p->cur_wakeup_disabled || p->cur_wakeup_gpio < 0 || + !p->cur_use_gpio_for_wakeup) + return; + + gpio_set_value(p->cur_wakeup_gpio, p->cur_wakeup_set_value); + usleep_range(1000, 1100); + gpio_set_value(p->cur_wakeup_gpio, !(p->cur_wakeup_set_value)); + usleep_range(1000, 1100); +} + +static long dbmdx_clk_set_rate(struct dbmdx_private *p, + enum dbmdx_clocks dbmdx_clk) +{ + struct clk *clk = p->clocks[dbmdx_clk]; + int rate = p->pdata->clock_rates[dbmdx_clk]; + + if (clk && (rate != -1)) + return clk_set_rate(clk, rate); + + return customer_dbmdx_clk_set_rate(p, dbmdx_clk); +} + +static unsigned long dbmdx_clk_get_rate(struct dbmdx_private *p, + enum dbmdx_clocks dbmdx_clk) +{ + struct clk *clk = p->clocks[dbmdx_clk]; + int rate = p->pdata->clock_rates[dbmdx_clk]; + + if (clk) + return clk_get_rate(clk); + + if (rate) + return rate; + + return customer_dbmdx_clk_get_rate(p, dbmdx_clk); +} + +static int dbmdx_clk_enable(struct dbmdx_private *p, + enum dbmdx_clocks dbmdx_clk) +{ + int ret = 0; + struct clk *clk = p->clocks[dbmdx_clk]; + + if (clk) + ret = clk_prepare_enable(clk); + else + ret = customer_dbmdx_clk_enable(p, dbmdx_clk); + + if (ret < 0) + dev_err(p->dev, "%s: %s clock enable failed\n", + __func__, + dbmdx_of_clk_names[dbmdx_clk]); + else + ret = 0; + + return ret; +} + +static int dbmdx_clk_disable(struct dbmdx_private *p, + enum dbmdx_clocks dbmdx_clk) +{ + struct clk *clk = p->clocks[dbmdx_clk]; + + if (clk) + clk_disable_unprepare(clk); + else + customer_dbmdx_clk_disable(p, dbmdx_clk); + + return 0; +} + +static void dbmdx_lock(struct dbmdx_private *p) +{ + mutex_lock(&p->p_lock); +} + +static void dbmdx_unlock(struct dbmdx_private *p) +{ + mutex_unlock(&p->p_lock); +} + +static int dbmdx_verify_checksum(struct dbmdx_private *p, + const u8 *expect, const u8 *got, size_t size) +{ + int ret; + + ret = memcmp(expect, got, size); + if (ret) { + switch (size) { + case 4: + dev_info(p->dev, + "%s: Got: 0x%02x 0x%02x 0x%02x 0x%02x\n", + __func__, + got[0], got[1], got[2], got[3]); + dev_info(p->dev, + "%s: Expected: 0x%02x 0x%02x 0x%02x 0x%02x\n", + __func__, + expect[0], expect[1], expect[2], expect[3]); + break; + default: + break; + } + } + return ret; +} + +static ssize_t dbmdx_send_data(struct dbmdx_private *p, const void *buf, + size_t len) +{ + return p->chip->write(p, buf, len); +} + +static int dbmdx_send_cmd(struct dbmdx_private *p, u32 command, u16 *response) +{ + int ret; + + switch (p->active_fw) { + case DBMDX_FW_VA: + ret = p->chip->send_cmd_va(p, command, response); + break; + case DBMDX_FW_VQE: + ret = p->chip->send_cmd_vqe(p, command, response); + break; + default: + dev_err(p->dev, "%s: Don't know how to handle fw type %d\n", + __func__, p->active_fw); + ret = -EIO; + break; + } + return ret; +} + +static int dbmdx_va_alive(struct dbmdx_private *p) +{ + u16 result = 0; + int ret = 0; + unsigned long stimeout = jiffies + + msecs_to_jiffies(DBMDX_MSLEEP_IS_ALIVE); + + do { + + /* check if VA firmware is still alive */ + ret = dbmdx_send_cmd(p, DBMDX_VA_FW_ID, &result); + if (ret < 0) + continue; + if (result == p->cur_firmware_id) + ret = 0; + else + ret = -1; + } while (time_before(jiffies, stimeout) && ret != 0); + + if (ret != 0) + dev_err(p->dev, "%s: VA firmware dead\n", __func__); + + return ret; +} + +static int dbmdx_va_alive_with_lock(struct dbmdx_private *p) +{ + int ret = 0; + + p->lock(p); + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + ret = dbmdx_va_alive(p); + + p->unlock(p); + + return ret; +} + +/* Place audio samples to kfifo according to operation flag + * AUDIO_CHANNEL_OP_COPY - copy samples directly to kfifo + * AUDIO_CHANNEL_OP_DUPLICATE_X_TO_Y - dupl. X to ch to Y (e.g.dual mono) + * AUDIO_CHANNEL_OP_TRUNCATE_Y_TO_X - take samples from primary channel set + */ +static int dbmdx_add_audio_samples_to_kfifo(struct dbmdx_private *p, + struct kfifo *fifo, + const u8 *buf, + unsigned int buf_length, + enum dbmdx_audio_channel_operation audio_channel_op) +{ + + if (audio_channel_op == AUDIO_CHANNEL_OP_COPY) + kfifo_in(fifo, buf, buf_length); + else if (audio_channel_op == AUDIO_CHANNEL_OP_DUPLICATE_1_TO_2) { + unsigned int i; + u8 cur_sample_buf[4]; + + for (i = 0; i < buf_length - 1; i += 2) { + cur_sample_buf[0] = buf[i]; + cur_sample_buf[1] = buf[i+1]; + cur_sample_buf[2] = buf[i]; + cur_sample_buf[3] = buf[i+1]; + kfifo_in(fifo, cur_sample_buf, 4); + } +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + } else if (audio_channel_op == AUDIO_CHANNEL_OP_DUPLICATE_1_TO_4) { + unsigned int i; + u8 cur_sample_buf[8]; + + for (i = 0; i < buf_length - 1; i += 2) { + cur_sample_buf[0] = buf[i]; + cur_sample_buf[1] = buf[i+1]; + cur_sample_buf[2] = buf[i]; + cur_sample_buf[3] = buf[i+1]; + cur_sample_buf[4] = buf[i]; + cur_sample_buf[5] = buf[i+1]; + cur_sample_buf[6] = buf[i]; + cur_sample_buf[7] = buf[i+1]; + kfifo_in(fifo, cur_sample_buf, 8); + } + } else if (audio_channel_op == AUDIO_CHANNEL_OP_DUPLICATE_2_TO_4) { + unsigned int i; + u8 cur_sample_buf[8]; + + for (i = 0; i < buf_length - 3; i += 4) { + cur_sample_buf[0] = buf[i]; + cur_sample_buf[1] = buf[i+1]; + cur_sample_buf[2] = buf[i+2]; + cur_sample_buf[3] = buf[i+3]; + cur_sample_buf[4] = buf[i]; + cur_sample_buf[5] = buf[i+1]; + cur_sample_buf[6] = buf[i+2]; + cur_sample_buf[7] = buf[i+3]; + kfifo_in(fifo, cur_sample_buf, 8); + } +#endif + } else if (audio_channel_op == AUDIO_CHANNEL_OP_TRUNCATE_2_TO_1) { + unsigned int i; + u8 cur_sample_buf[2]; + + for (i = 0; i < buf_length - 1; i += 4) { + cur_sample_buf[0] = buf[i]; + cur_sample_buf[1] = buf[i+1]; + kfifo_in(fifo, cur_sample_buf, 2); + } +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + } else if (audio_channel_op == AUDIO_CHANNEL_OP_TRUNCATE_4_TO_1) { + unsigned int i; + u8 cur_sample_buf[2]; + + for (i = 0; i < buf_length - 1; i += 8) { + cur_sample_buf[0] = buf[i]; + cur_sample_buf[1] = buf[i+1]; + kfifo_in(fifo, cur_sample_buf, 2); + } + } else if (audio_channel_op == AUDIO_CHANNEL_OP_TRUNCATE_4_TO_2) { + unsigned int i; + u8 cur_sample_buf[4]; + + for (i = 0; i < buf_length - 3; i += 8) { + cur_sample_buf[0] = buf[i]; + cur_sample_buf[1] = buf[i+1]; + cur_sample_buf[2] = buf[i+2]; + cur_sample_buf[3] = buf[i+3]; + kfifo_in(fifo, cur_sample_buf, 4); + } +#endif + } else { + dev_err(p->dev, "%s: Undefined audio channel operation\n", + __func__); + return -EIO; + } + + return 0; +} +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX_SND_CAPTURE) + +static int dbmdx_suspend_pcm_streaming_work(struct dbmdx_private *p) +{ + int ret; + + p->va_flags.pcm_worker_active = 0; + + flush_work(&p->pcm_streaming_work); + + if (p->va_flags.pcm_streaming_active) { + + p->va_flags.pcm_streaming_pushing_zeroes = true; + + ret = dbmdx_set_pcm_timer_mode(p->active_substream, true); + if (ret < 0) { + dev_err(p->dev, + "%s: Error switching to pcm timer mode\n", + __func__); + return -EIO; + } + dev_dbg(p->dev, + "%s: Switched to pcm timer mode (pushing zeroes)\n", + __func__); + } + + return 0; +} + +#else +static int dbmdx_suspend_pcm_streaming_work(struct dbmdx_private *p) +{ + return 0; +} +#endif + +static int dbmdx_vqe_alive(struct dbmdx_private *p) +{ + unsigned long timeout; + int ret = -EIO; + u16 resp; + + usleep_range(DBMDX_USLEEP_VQE_ALIVE, + DBMDX_USLEEP_VQE_ALIVE + 1000); + + timeout = jiffies + msecs_to_jiffies(1000); + while (time_before(jiffies, timeout)) { + ret = dbmdx_send_cmd(p, + DBMDX_VQE_SET_PING_CMD | 0xaffe, + &resp); + if (ret == 0 && resp == 0xaffe) + break; + usleep_range(DBMDX_USLEEP_VQE_ALIVE_ON_FAIL, + DBMDX_USLEEP_VQE_ALIVE_ON_FAIL + 1000); + } + if (ret != 0) + dev_dbg(p->dev, "%s: VQE firmware dead\n", __func__); + + if (resp != 0xaffe) + ret = -EIO; + + return ret; +} + +static int dbmdx_vqe_mode_valid(struct dbmdx_private *p, unsigned int mode) +{ + unsigned int i; + + if (p->pdata->vqe_modes_values == 0) + return 1; + + for (i = 0; i < p->pdata->vqe_modes_values; i++) { + if (mode == p->pdata->vqe_modes_value[i]) + return 1; + } + + dev_dbg(p->dev, "%s: Invalid VQE mode: 0x%x\n", __func__, mode); + + return 0; +} + + +static int dbmdx_va_set_speed(struct dbmdx_private *p, + enum dbmdx_va_speeds speed) +{ + int ret; + + dev_info(p->dev, "%s: set speed to %u\n", + __func__, speed); + + ret = dbmdx_send_cmd( + p, + DBMDX_VA_CLK_CFG | p->pdata->va_speed_cfg[speed].cfg, + NULL); + if (ret != 0) + ret = -EIO; + return ret; +} + +static int dbmdx_buf_to_int(const char *buf) +{ + unsigned long val; + int ret; + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + return (int)val; +} + +static int dbmdx_set_backlog_len(struct dbmdx_private *p, u32 history) +{ + int ret; + unsigned short val; + u16 cur_backlog_size; + u16 backlog_size_to_set; +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + bool okg_model_selected = false; + u16 cur_okg_backlog_size; + + okg_model_selected = ((history & 0x1000) >> 12); +#endif + + history &= ~(1 << 12); + + dev_info(p->dev, "%s: history 0x%x\n", __func__, (u32)history); + + /* If history is specified in ms, we should verify that + * FW audio buffer size in large enough to contain the history + */ + if (history > 2) { + + u32 min_buffer_size_in_bytes; + u32 min_buffer_size_in_chunks; + u32 audio_buffer_size_in_bytes; + + ret = dbmdx_send_cmd(p, DBMDX_VA_AUDIO_BUFFER_SIZE, &val); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to read DBMDX_VA_AUDIO_BUFFER_SIZE\n", + __func__); + return ret; + } + + min_buffer_size_in_bytes = + (p->pdata->va_buffering_pcm_rate / 1000) * + ((u32)history + MIN_EVENT_PROCESSING_TIME_MS) * + p->pdata->va_audio_channels * + p->bytes_per_sample; + + min_buffer_size_in_chunks = + min_buffer_size_in_bytes / (8 * p->bytes_per_sample); + + audio_buffer_size_in_bytes = (u32)val * 8 * p->bytes_per_sample; + + if (audio_buffer_size_in_bytes < min_buffer_size_in_bytes) { + + dev_err(p->dev, + "%s: FW Audio buffer size is not enough\t" + "for requested backlog size\t" + "FW buffer size: %u bytes (%u smp. chunks)\t" + "Min req. buffer size: %u bytes (%u smp. chunks)\n", + __func__, + audio_buffer_size_in_bytes, + (u32)val, + min_buffer_size_in_bytes, + min_buffer_size_in_chunks); + + return -EIO; + } + + dev_dbg(p->dev, + "%s: FW Audio buffer size was verified\t" + "FW buffer size: %u bytes (%u smp. chunks)\t" + "Min req. buffer size: %u bytes (%u smp. chunks)\n", + __func__, + audio_buffer_size_in_bytes, + (u32)val, + min_buffer_size_in_bytes, + min_buffer_size_in_chunks); + } + + cur_backlog_size = (u16)(p->pdata->va_backlog_length); + +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + cur_okg_backlog_size = (u16)(p->pdata->va_backlog_length_okg); + if (okg_model_selected) + p->pdata->va_backlog_length_okg = history; + else + p->pdata->va_backlog_length = history; + + /* Configure largest from two backlogs */ + if (p->pdata->va_backlog_length_okg > p->pdata->va_backlog_length) + backlog_size_to_set = p->pdata->va_backlog_length_okg; + else + backlog_size_to_set = p->pdata->va_backlog_length; +#else + p->pdata->va_backlog_length = history; + backlog_size_to_set = history; +#endif + + ret = dbmdx_send_cmd(p, + DBMDX_VA_AUDIO_HISTORY | backlog_size_to_set, + NULL); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set backlog size\n", __func__); + p->pdata->va_backlog_length = cur_backlog_size; +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + p->pdata->va_backlog_length_okg = cur_okg_backlog_size; +#endif + return ret; + } + + return 0; +} + +static int dbmdx_sleeping(struct dbmdx_private *p) +{ + return p->asleep; +} + +static int dbmdx_amodel_loaded(struct dbmdx_private *p) +{ + int model_loaded = p->va_flags.a_model_downloaded_to_fw; + +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + model_loaded = (model_loaded || + p->va_flags.okg_a_model_downloaded_to_fw); +#endif + + return model_loaded; +} + +#ifndef ALSA_SOC_INTERFACE_NOT_SUPPORTED +static int dbmdx_vqe_set_tdm_bypass(struct dbmdx_private *p, int onoff) +{ + int ret; + + ret = dbmdx_send_cmd(p, + DBMDX_VQE_SET_HW_TDM_BYPASS_CMD | + p->pdata->vqe_tdm_bypass_config, + NULL); + if (ret != 0) + dev_err(p->dev, + "%s: failed to %s TDM bypass (%x)\n", + __func__, + (onoff ? "enable" : "disable"), + p->pdata->vqe_tdm_bypass_config); + return 0; +} +#endif + +static int dbmdx_force_wake(struct dbmdx_private *p) +{ + int ret = 0; + u16 resp = 0xffff; + + /* assert wake pin */ + p->wakeup_set(p); + + if (p->active_fw == DBMDX_FW_VQE) { + p->clk_enable(p, DBMDX_CLK_CONSTANT); + usleep_range(1000, 2000); + } + + p->chip->transport_enable(p, true); + + if (p->active_fw == DBMDX_FW_VA) { + /* test if VA firmware is up */ + ret = dbmdx_va_alive(p); + if (ret < 0) { + dev_err(p->dev, "%s: VA fw did not wakeup\n", + __func__); + ret = -EIO; + goto out; + } + + /* get operation mode register */ + ret = dbmdx_send_cmd(p, DBMDX_VA_OPR_MODE, &resp); + if (ret < 0) { + dev_err(p->dev, "%s: failed to get operation mode\n", + __func__); + goto out; + } + p->va_flags.mode = resp; + } else { + /* test if VQE firmware is up */ + ret = dbmdx_vqe_alive(p); + if (ret != 0) { + dev_err(p->dev, "%s: VQE fw did not wakeup\n", + __func__); + ret = -EIO; + goto out; + } + /* default mode is idle mode */ + } + + p->power_mode = DBMDX_PM_ACTIVE; + + /* make it not sleeping */ + p->asleep = false; + + dev_dbg(p->dev, "%s: woke up\n", __func__); +out: + return ret; +} + +static int dbmdx_wake(struct dbmdx_private *p) +{ + + /* if chip not sleeping there is nothing to do */ + if (!dbmdx_sleeping(p) && p->va_flags.mode != DBMDX_DETECTION) + return 0; + + return dbmdx_force_wake(p); +} + +static int dbmdx_set_power_mode( + struct dbmdx_private *p, enum dbmdx_power_modes mode) +{ + int ret = 0; + enum dbmdx_power_modes new_mode = p->power_mode; + + dev_dbg(p->dev, "%s: would move %s -> %s (%2.2d -> %2.2d)\n", + __func__, + dbmdx_power_mode_names[p->power_mode], + dbmdx_power_mode_names[mode], + p->power_mode, + mode); + + switch (p->power_mode) { + case DBMDX_PM_BOOTING: + switch (mode) { + case DBMDX_PM_FALLING_ASLEEP: + /* queue delayed work to set the chip to sleep*/ + queue_delayed_work(p->dbmdx_workq, + &p->delayed_pm_work, + msecs_to_jiffies(100)); + new_mode = mode; + break; + case DBMDX_PM_BOOTING: + /* Fall through */ + case DBMDX_PM_ACTIVE: + new_mode = mode; + break; + + default: + goto illegal_transition; + } + break; + + case DBMDX_PM_ACTIVE: + switch (mode) { + case DBMDX_PM_ACTIVE: + if (p->va_flags.mode == DBMDX_BUFFERING || + p->va_flags.mode == DBMDX_DETECTION) + ret = dbmdx_wake(p); + break; + + case DBMDX_PM_FALLING_ASLEEP: + if (p->va_flags.mode == DBMDX_DETECTION) { + dev_dbg(p->dev, + "%s: no sleep during detection\n", + __func__); + p->chip->transport_enable(p, false); + } else if (p->va_flags.mode == DBMDX_BUFFERING || + p->va_flags.mode == DBMDX_STREAMING || + p->va_flags.mode == + DBMDX_DETECTION_AND_STREAMING || + p->vqe_flags.in_call) { + dev_dbg(p->dev, + "%s: no sleep during buff/in call\n", + __func__); + } else if (p->va_flags.sleep_not_allowed || + p->sleep_disabled) { + dev_dbg(p->dev, + "%s: Sleep mode is blocked\n", + __func__); + } else { + /* queue delay_work to set the chip to sleep */ + queue_delayed_work(p->dbmdx_workq, + &p->delayed_pm_work, + msecs_to_jiffies(200)); + new_mode = mode; + } + break; + + case DBMDX_PM_BOOTING: + new_mode = mode; + break; + + default: + goto illegal_transition; + } + break; + + case DBMDX_PM_FALLING_ASLEEP: + switch (mode) { + case DBMDX_PM_BOOTING: + /* Fall through */ + case DBMDX_PM_ACTIVE: + /* + * flush queue if going to active + */ + p->va_flags.cancel_pm_work = true; + p->unlock(p); + cancel_delayed_work_sync(&p->delayed_pm_work); + p->va_flags.cancel_pm_work = false; + p->lock(p); + new_mode = mode; + /* wakeup chip */ + ret = dbmdx_wake(p); + break; + + case DBMDX_PM_FALLING_ASLEEP: + break; + + default: + goto illegal_transition; + } + break; + + case DBMDX_PM_SLEEPING: + /* + * wakeup the chip if going to active/booting + */ + switch (mode) { + case DBMDX_PM_FALLING_ASLEEP: + dev_dbg(p->dev, + "%s: already sleeping; leave it this way...", + __func__); + new_mode = DBMDX_PM_SLEEPING; + break; + case DBMDX_PM_ACTIVE: + /* Fall through */ + case DBMDX_PM_BOOTING: + ret = dbmdx_wake(p); + if (ret) { + dev_err(p->dev, + "%s: failed to wake the chip up!\n", + __func__); + return ret; + } + new_mode = mode; + break; + case DBMDX_PM_SLEEPING: + new_mode = mode; + break; + default: + goto illegal_transition; + } + break; + + default: + dev_err(p->dev, "%s: unknown power mode: %d", + __func__, p->power_mode); + return -EINVAL; + } + + dev_dbg(p->dev, "%s: has moved %s -> %s (%2.2d -> %2.2d)\n", + __func__, + dbmdx_power_mode_names[p->power_mode], + dbmdx_power_mode_names[new_mode], + p->power_mode, + new_mode); + + p->power_mode = new_mode; + + return 0; + +illegal_transition: + dev_err(p->dev, "%s: can't move %s -> %s\n", __func__, + dbmdx_power_mode_names[p->power_mode], + dbmdx_power_mode_names[mode]); + return -EINVAL; +} + + +static int dbmdx_set_mode(struct dbmdx_private *p, int mode) +{ + int ret = 0; + unsigned int cur_opmode = p->va_flags.mode; + int required_mode = mode; + int new_effective_mode = mode; + int send_set_mode_cmd = 1; + enum dbmdx_power_modes new_power_mode = p->power_mode; + + if (mode >= 0 && mode < DBMDX_NR_OF_STATES) { + dev_dbg(p->dev, "%s: new requested mode: %d (%s)\n", + __func__, mode, dbmdx_state_names[mode]); + } else { + dev_dbg(p->dev, "%s: mode: %d (invalid)\n", __func__, mode); + return -EINVAL; + } + + mode &= 0xffff; + + /* + * transform HIBERNATE to SLEEP in case no wakeup pin + * is available + */ + if (!dbmdx_can_wakeup(p) && mode == DBMDX_HIBERNATE) + mode = DBMDX_SLEEP_PLL_ON; + if ((!dbmdx_can_wakeup(p) || p->va_flags.sleep_not_allowed || + p->sleep_disabled) && + (mode == DBMDX_SLEEP_PLL_ON || mode == DBMDX_HIBERNATE)) + mode = DBMDX_IDLE; + + p->va_flags.buffering = 0; + + p->va_flags.irq_inuse = 0; + +#if IS_ENABLED(DBMDX_KEEP_ALIVE_TIMER) + dev_dbg(p->dev, "%s: Cancelling Keep Alive timer\n", __func__); + p->va_flags.cancel_keep_alive_work = true; + cancel_keep_alive_timer(p); + dev_dbg(p->dev, "%s: Cancelled Keep Alive timer\n", __func__); +#endif + + /* wake up if asleep */ + ret = dbmdx_wake(p); + if (ret < 0) { + dev_err(p->dev, "%s: unable to wake\n", __func__); + goto out; + } + + /* Select new power mode */ + switch (mode) { + case DBMDX_IDLE: + /* set power state to FALLING ASLEEP */ + if (p->va_flags.pcm_streaming_active || + p->va_flags.sleep_not_allowed || p->sleep_disabled) + new_power_mode = DBMDX_PM_ACTIVE; + else + new_power_mode = DBMDX_PM_FALLING_ASLEEP; + break; + + case DBMDX_DETECTION: + p->va_flags.irq_inuse = 1; + /* switch to ACTIVE */ + new_power_mode = DBMDX_PM_ACTIVE; + break; + case DBMDX_BUFFERING: + /* Fall through */ + case DBMDX_STREAMING: + /* Fall through */ + case DBMDX_DETECTION_AND_STREAMING: + /* switch to ACTIVE */ + new_power_mode = DBMDX_PM_ACTIVE; + break; + + case DBMDX_SLEEP_PLL_OFF: + /* Fall through */ + case DBMDX_SLEEP_PLL_ON: + /* Fall through */ + case DBMDX_HIBERNATE: + p->asleep = true; + break; + } + + if (mode == DBMDX_IDLE) + /* Stop PCM streaming work */ + p->va_flags.pcm_worker_active = 0; + else if (mode == DBMDX_DETECTION) { + + if (!dbmdx_amodel_loaded(p) && + p->va_flags.sv_recognition_mode != + SV_RECOGNITION_MODE_VOICE_ENERGY) { + /* Passphrase/CMD rec. mode but no a-model loaded */ + dev_err(p->dev, + "%s: can't set detection, a-model not loaded\n", + __func__); + p->va_flags.irq_inuse = 0; + ret = -1; + goto out; + } + if (p->sv_a_model_support) { + ret = dbmdx_set_sv_recognition_mode(p, + p->va_flags.sv_recognition_mode); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set SV model mode\n", + __func__); + p->va_flags.irq_inuse = 0; + goto out; + } + } +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + if (p->okg_a_model_support) { + ret = dbmdx_set_okg_recognition_mode(p, + p->va_flags.okg_recognition_mode); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set OKG model mode\n", + __func__); + p->va_flags.irq_inuse = 0; + goto out; + } + } +#endif + + if (p->va_flags.pcm_streaming_active) { + new_effective_mode = DBMDX_DETECTION_AND_STREAMING; + + ret = dbmdx_disable_hw_vad(p); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to disable fw vad settings\n", + __func__); + p->va_flags.irq_inuse = 0; + goto out; + } + } else { + ret = dbmdx_restore_fw_vad_settings(p); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to restore fw vad settings\n", + __func__); + p->va_flags.irq_inuse = 0; + goto out; + } + } +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + if (p->pdata->va_ns_supported) { + ret = dbmdx_configure_ns(p, mode, p->va_ns_enabled); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to enable NS\n", + __func__); + goto out; + } + } +#endif + } else if (mode == DBMDX_STREAMING) { + + /* If DBMDX_STREAMING was requested, no passprase recog. + * is required. Thus set recognition mode to 0 + */ + ret = dbmdx_set_sv_recognition_mode(p, + SV_RECOGNITION_MODE_DISABLED); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set SV recognition mode (OFF)\n", + __func__); + goto out; + } +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + ret = dbmdx_set_okg_recognition_mode(p, + OKG_RECOGNITION_MODE_DISABLED); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set OKG recogn. mode (OFF)\n", + __func__); + goto out; + } +#endif + ret = dbmdx_disable_hw_vad(p); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to disable fw vad settings\n", + __func__); + p->va_flags.irq_inuse = 0; + goto out; + } + +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + if (p->pdata->va_ns_supported) { + ret = dbmdx_configure_ns(p, mode, p->va_ns_enabled); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to enable NS\n", + __func__); + goto out; + } + } +#endif + + required_mode = DBMDX_DETECTION; + } else if (mode == DBMDX_DETECTION_AND_STREAMING) { + + send_set_mode_cmd = 1; + required_mode = DBMDX_DETECTION; + + /* We must go trough IDLE mode do disable HW VAD */ + ret = dbmdx_send_cmd(p, + DBMDX_VA_OPR_MODE | DBMDX_IDLE, + NULL); + if (ret < 0) { + dev_err(p->dev, "%s: failed to set mode 0x%x\n", + __func__, mode); + p->va_flags.irq_inuse = 0; + goto out; + } + if (cur_opmode == DBMDX_DETECTION) + usleep_range(DBMDX_USLEEP_SET_MODE, + DBMDX_USLEEP_SET_MODE + 1000); + + ret = dbmdx_disable_hw_vad(p); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to disable fw vad settings\n", + __func__); + p->va_flags.irq_inuse = 0; + goto out; + } + p->va_flags.irq_inuse = 1; + + } else if (mode == DBMDX_BUFFERING) { + /* Stop PCM streaming work */ + p->va_flags.pcm_worker_active = 0; +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + if (p->pdata->va_ns_supported) { + ret = dbmdx_configure_ns(p, mode, p->va_ns_enabled); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to enable NS\n", + __func__); + goto out; + } + } +#endif + } + + if (new_power_mode == DBMDX_PM_ACTIVE && required_mode != DBMDX_IDLE) { + + ret = dbmdx_restore_microphones(p); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to restore microphones\n", + __func__); + goto out; + } + } + + if (send_set_mode_cmd) { + /* set operation mode register */ + ret = dbmdx_send_cmd(p, + DBMDX_VA_OPR_MODE | required_mode, + NULL); + if (ret < 0) { + dev_err(p->dev, "%s: failed to set mode 0x%x\n", + __func__, mode); + p->va_flags.irq_inuse = 0; + goto out; + } + } + + p->va_flags.mode = new_effective_mode; + /* Verify that mode was set */ + if (!p->asleep && send_set_mode_cmd) { + unsigned short new_mode; + int retry = 10; + +#if IS_ENABLED(DBMDX_RECOVERY_TEST_ENABLE) + if (p->va_flags.va_debug_val1 == 3) { + + dev_err(p->dev, + "%s: Emulating Mode verification failed\n", + __func__); + ret = -EIO; + p->va_flags.recovery_requested = true; + p->va_flags.mode = cur_opmode; + goto out; + } +#endif + usleep_range(DBMDX_USLEEP_SET_MODE, + DBMDX_USLEEP_SET_MODE + 1000); + + while (retry--) { + + usleep_range(DBMDX_USLEEP_SET_MODE, + DBMDX_USLEEP_SET_MODE + 1000); + + ret = dbmdx_send_cmd(p, DBMDX_VA_OPR_MODE, &new_mode); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to read DBMDX_VA_OPR_MODE\n", + __func__); + p->va_flags.mode = cur_opmode; + goto out; + } + + if (required_mode == new_mode) + break; + } + + /* no retries left, failed to verify mode */ + if (retry < 0) { + dev_err(p->dev, + "%s: Mode verification failed: got %d, expected %d\n", + __func__, new_mode, required_mode); + ret = -EIO; + p->va_flags.recovery_requested = true; + p->va_flags.mode = cur_opmode; + goto out; + } + } else + usleep_range(DBMDX_USLEEP_SET_MODE, + DBMDX_USLEEP_SET_MODE + 1000); + +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + if (p->pdata->va_ns_supported && + !(p->asleep) && (new_power_mode != DBMDX_PM_ACTIVE)) { + ret = dbmdx_configure_ns(p, mode, p->va_ns_enabled); + if (ret < 0) { + dev_err(p->dev, "%s: failed to disable NS\n", + __func__); + goto out; + } + } +#endif + if ((p->va_flags.disabling_mics_not_allowed == false) && + !(p->asleep) && (new_power_mode != DBMDX_PM_ACTIVE)) { + + ret = dbmdx_disable_microphones(p); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to disable microphones\n", + __func__); + goto out; + } + + } + + if (new_power_mode != p->power_mode) { + ret = dbmdx_set_power_mode(p, new_power_mode); + if (ret) { + dev_err(p->dev, "%s: Failed to set power mode\n", + __func__); + goto out; + } + } + + if (required_mode == DBMDX_BUFFERING) { + p->va_flags.buffering_paused = 0; + p->va_flags.buffering = 1; + p->va_cur_backlog_length = 0; + dbmdx_schedule_work(p, &p->sv_work); +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX_SND_CAPTURE) + } else if (new_effective_mode == DBMDX_DETECTION_AND_STREAMING || + new_effective_mode == DBMDX_STREAMING) { + p->va_flags.pcm_worker_active = 1; + dbmdx_schedule_work(p, &p->pcm_streaming_work); +#endif + } + + ret = 0; + dev_dbg(p->dev, + "%s: Successful mode transition from %d to mode is %d\n", + __func__, cur_opmode, p->va_flags.mode); + goto out; + +out: + return ret; +} + +static int dbmdx_trigger_detection(struct dbmdx_private *p) +{ + int ret = 0; + + if (!dbmdx_amodel_loaded(p) && + p->va_detection_mode != DETECTION_MODE_VOICE_ENERGY) { + dev_err(p->dev, "%s: a-model not loaded!\n", __func__); + return -EINVAL; + } +#ifndef DBMDX_VA_NS_SUPPORT + p->va_flags.disabling_mics_not_allowed = true; +#endif + p->va_flags.sleep_not_allowed = true; + + /* set chip to idle mode before entering detection mode */ + ret = dbmdx_set_mode(p, DBMDX_IDLE); + + p->va_flags.disabling_mics_not_allowed = false; + p->va_flags.sleep_not_allowed = false; + + if (ret) { + dev_err(p->dev, "%s: failed to set device to idle mode\n", + __func__); + return -EIO; + } + + ret = dbmdx_set_mode(p, DBMDX_DETECTION); + if (ret) { + dev_err(p->dev, + "%s: failed to set device to detection mode\n", + __func__); + return -EIO; + } + + /* disable transport (if configured) so the FW goes into best power + * saving mode (only if no active pcm streaming in background) + */ + if (p->va_flags.mode != DBMDX_STREAMING && + p->va_flags.mode != DBMDX_DETECTION_AND_STREAMING) { + p->chip->transport_enable(p, false); +#if IS_ENABLED(DBMDX_KEEP_ALIVE_TIMER) + if (p->pdata->retrigger_interval_sec && + p->keep_alive_timer_created) { + ret = arm_keep_alive_timer(p); + dev_dbg(p->dev, "%s:Retrigger is scheduled in %u sec\n", + __func__, + p->pdata->retrigger_interval_sec); + } +#endif + } + + return 0; +} + +static int dbmdx_set_fw_debug_mode(struct dbmdx_private *p, + enum dbmdx_fw_debug_mode mode) +{ + int ret = 0; + u16 cur_val = 0; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + if (p->active_fw != DBMDX_FW_VA) { + dev_err(p->dev, "%s: VA FW is no active\n", __func__); + return -EAGAIN; + } + + p->lock(p); + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + switch (mode) { + case FW_DEBUG_OUTPUT_UART: + if (p->active_interface == DBMDX_INTERFACE_UART) { + dev_err(p->dev, "%s: Not supported in UART mode\n", + __func__); + ret = -EIO; + goto out_pm_mode; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_HOST_INTERFACE_SUPPORT, + &cur_val); + if (ret < 0) { + dev_err(p->dev, "%s: failed to read reg\n", __func__); + ret = -EIO; + goto out_pm_mode; + } + + ret = dbmdx_send_cmd(p, + (DBMDX_VA_HOST_INTERFACE_SUPPORT | cur_val | 0x1000), + NULL); + if (ret < 0) { + dev_err(p->dev, "%s: failed to send cmd\n", __func__); + ret = -EIO; + goto out_pm_mode; + } + + p->va_debug_mode = + (DBMDX_DEBUG_MODE_RECORD | DBMDX_DEBUG_MODE_FW_LOG); + + break; + case FW_DEBUG_RECORD_NO_FW_LOG: + if (p->active_interface == DBMDX_INTERFACE_UART) { + dev_err(p->dev, "%s: Not supported in UART mode\n", + __func__); + ret = -EIO; + goto out_pm_mode; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_HOST_INTERFACE_SUPPORT, + &cur_val); + if (ret < 0) { + dev_err(p->dev, "%s: failed to read reg\n", __func__); + ret = -EIO; + goto out_pm_mode; + } + + ret = dbmdx_send_cmd(p, + (DBMDX_VA_HOST_INTERFACE_SUPPORT | cur_val | 0x1000), + NULL); + if (ret < 0) { + dev_err(p->dev, "%s: failed to send cmd\n", __func__); + ret = -EIO; + goto out_pm_mode; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_DEBUG_1 | 0x5, NULL); + if (ret < 0) { + dev_err(p->dev, "%s: failed to send cmd\n", __func__); + ret = -EIO; + goto out_pm_mode; + } + + p->va_debug_mode = DBMDX_DEBUG_MODE_RECORD; + + break; + case FW_DEBUG_OUTPUT_NONE: + if (p->active_interface == DBMDX_INTERFACE_UART) { + dev_err(p->dev, "%s: Not supported in UART mode\n", + __func__); + ret = -EIO; + goto out_pm_mode; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_HOST_INTERFACE_SUPPORT, + &cur_val); + if (ret < 0) { + dev_err(p->dev, "%s: failed to read reg\n", __func__); + ret = -EIO; + goto out_pm_mode; + } + + cur_val &= 0xEFFF; /* Reset Debug support bit */ + + ret = dbmdx_send_cmd(p, + (DBMDX_VA_HOST_INTERFACE_SUPPORT | cur_val), NULL); + if (ret < 0) { + dev_err(p->dev, "%s: failed to send cmd\n", __func__); + ret = -EIO; + goto out_pm_mode; + } + + p->va_debug_mode = DBMDX_DEBUG_MODE_OFF; + + break; + default: + dev_err(p->dev, "%s: Unsupported FW Debug mode 0x%x\n", + __func__, mode); + ret = -EINVAL; + goto out_pm_mode; + } + + +out_pm_mode: + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + p->unlock(p); + return ret; +} + + +static void dbmdx_delayed_pm_work_hibernate(struct work_struct *work) +{ + int ret; + struct dbmdx_private *p = + container_of(work, struct dbmdx_private, + delayed_pm_work.work); + + dev_dbg(p->dev, "%s\n", __func__); + + p->lock(p); + if (p->va_flags.cancel_pm_work) { + dev_dbg(p->dev, + "%s: the work has been just canceled\n", + __func__); + goto out; + } + + if (p->active_fw == DBMDX_FW_VA) { + p->wakeup_release(p); + ret = dbmdx_set_mode(p, DBMDX_HIBERNATE); + } else { + /* VQE */ + + /* Activate HW TDM bypass + * FIXME: make it conditional + */ + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_HW_TDM_BYPASS_CMD | + DBMDX_VQE_SET_HW_TDM_BYPASS_MODE_1 | + DBMDX_VQE_SET_HW_TDM_BYPASS_FIRST_PAIR_EN, + NULL); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to activate HW TDM bypass\n", + __func__); + } + + p->wakeup_release(p); + + ret = dbmdx_send_cmd( + p, DBMDX_VQE_SET_POWER_STATE_CMD | + DBMDX_VQE_SET_POWER_STATE_HIBERNATE, NULL); + } + + if (ret) { + p->wakeup_set(p); + p->power_mode = DBMDX_PM_ACTIVE; + + dev_err(p->dev, "%s: fail to set to HIBERNATE - %d\n", + __func__, ret); + goto out; + } + + msleep(DBMDX_MSLEEP_HIBARNATE); + + p->asleep = true; + p->power_mode = DBMDX_PM_SLEEPING; + + if (p->active_fw == DBMDX_FW_VQE) + p->clk_disable(p, DBMDX_CLK_CONSTANT); + + p->chip->transport_enable(p, false); + +out: + dev_dbg(p->dev, "%s: current power mode: %s\n", + __func__, dbmdx_power_mode_names[p->power_mode]); + p->unlock(p); +} + +#if IS_ENABLED(DBMDX_KEEP_ALIVE_TIMER) + +static void cancel_keep_alive_timer(struct dbmdx_private *p) +{ + int ret; + + if (!p->keep_alive_timer_created) { + p->va_flags.cancel_keep_alive_work = false; + return; + } + + if (!p->keep_alive_timer_started) { + p->va_flags.cancel_keep_alive_work = false; + return; + } + + ret = alarm_cancel(&p->keep_alive_timer); + + if (ret) + dev_dbg(p->dev, "%s: Keep Alive Timer was canceled\n", + __func__); + else + dev_dbg(p->dev, "%s: Keep Alive Timer was not active\n", + __func__); + + p->va_flags.cancel_keep_alive_work = false; + + p->keep_alive_timer_started = false; + +} + +static int arm_keep_alive_timer(struct dbmdx_private *p) +{ + ktime_t interval_time; + + if (!p->keep_alive_timer_created) { + dev_dbg(p->dev, "%s: Keep Alive Timer is not supported\n", + __func__); + return 0; + } + + if (!p->pdata->retrigger_interval_sec) { + dev_dbg(p->dev, "%s: Keep alive timer is disabled\n", __func__); + return 0; + } + + if (p->keep_alive_timer_started) { + p->va_flags.cancel_keep_alive_work = true; + cancel_keep_alive_timer(p); + } + + interval_time = ktime_set(p->pdata->retrigger_interval_sec, 0); + + alarm_start_relative(&p->keep_alive_timer, interval_time); + + p->keep_alive_timer_started = true; + + return 0; +} + +static void dbmdx_keep_alive_work(struct work_struct *work) +{ + struct dbmdx_private *p = container_of( + work, struct dbmdx_private, keep_alive_work); + + int ret = 0; + int current_mode; + + + dev_dbg(p->dev, "%s\n", __func__); + + p->lock(p); + + p->keep_alive_timer_started = false; + + p->keep_alive_triggers++; + + dev_dbg(p->dev, "%s Keep Alive Triggers: %d\n", + __func__, p->keep_alive_triggers); + + current_mode = p->va_flags.mode; + + if (p->va_flags.cancel_keep_alive_work) { + dev_dbg(p->dev, + "%s: the work has been just canceled\n", + __func__); + p->va_flags.cancel_keep_alive_work = false; + goto out_unlock; + } + + if (current_mode != DBMDX_DETECTION) { + dev_dbg(p->dev, + "%s: Current mode is not detection (%d)\n", + __func__, current_mode); + goto out_unlock; + } + +#if IS_ENABLED(DBMDX_RECOVERY_TEST_ENABLE) + if (p->va_flags.va_debug_val1 == 2) { + dev_err(p->dev, "%s: Emulating Dead Chip during keep alive\n", + __func__); + ret = -EIO; + p->va_flags.recovery_requested = true; + goto out_unlock; + } +#endif + + ret = dbmdx_trigger_detection(p); + if (ret) { + dev_err(p->dev, "%s: failed to trigger detection\n", + __func__); + goto out_unlock; + } + +out_unlock: + p->unlock(p); + + if (ret < 0 && !p->pdata->va_recovery_disabled) { + + int recovery_res; + + if (!(p->va_flags.recovery_requested) && + (p->device_ready && + (dbmdx_va_alive_with_lock(p) == 0))) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + goto out; + } + + dev_err(p->dev, "%s: Performing recovery #1\n", __func__); + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + ret = -EIO; + goto out; + } + + p->lock(p); + + ret = dbmdx_trigger_detection(p); + + p->unlock(p); + + if (ret == 0) { + dev_err(p->dev, + "%s: Set detection after succesfull recovery\n", + __func__); + goto out; + } + + if (p->device_ready && (dbmdx_va_alive_with_lock(p) == 0)) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + goto out; + } + + dev_err(p->dev, "%s: Performing recovery #2\n", __func__); + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + goto out; + } + } +out: + return; +} + + +static enum alarmtimer_restart keep_alive_timer_func(struct alarm *alarm, + ktime_t now) +{ + struct dbmdx_private *p = (struct dbmdx_private *)alarm->data; + + if (!p) { + dev_warn(p->dev, "%s Timer doesn't contain data field\n", + __func__); + return ALARMTIMER_NORESTART; + } + + dev_dbg(p->dev, "%s\n", __func__); + + if (p->va_flags.cancel_keep_alive_work) { + dev_dbg(p->dev, + "%s: the work has been just canceled\n", + __func__); + p->va_flags.cancel_keep_alive_work = false; + return ALARMTIMER_NORESTART; + } + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + if (p->ps_nosuspend_wl) + __pm_wakeup_event(p->ps_nosuspend_wl, + DBMDX_WAKELOCK_IRQ_TIMEOUT_MS); +#endif + dbmdx_schedule_work(p, &p->keep_alive_work); + + return ALARMTIMER_NORESTART; +} + +#endif + +#ifndef ALSA_SOC_INTERFACE_NOT_SUPPORTED +static int dbmdx_vqe_set_use_case(struct dbmdx_private *p, unsigned int uc) +{ + int ret = 0; + + uc &= 0xffff; + + if (uc == 0) { + /* if already sleeping we are already idle */ + if (dbmdx_sleeping(p)) + goto out; + /* enable TDM bypass */ + dbmdx_vqe_set_tdm_bypass(p, 1); + } else { + if (dbmdx_sleeping(p)) { + ret = dbmdx_wake(p); + if (ret) + goto out; + } + /* stop TDM bypass */ + dbmdx_vqe_set_tdm_bypass(p, 0); + } + + ret = dbmdx_send_cmd(p, + DBMDX_VQE_SET_USE_CASE_CMD | uc, + NULL); + if (ret < 0) + dev_err(p->dev, "%s: write 0x%x to 0x%x error\n", + __func__, uc, DBMDX_VQE_SET_USE_CASE_CMD); + +out: + return ret; +} +#endif + +/* Microphone modes */ +enum dbmdx_microphone_mode { + DBMDX_MIC_MODE_DIGITAL_LEFT = 0, + DBMDX_MIC_MODE_DIGITAL_RIGHT, + DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_LEFT, + DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_RIGHT, + DBMDX_MIC_MODE_ANALOG, + DBMDX_MIC_MODE_ANALOG_DUAL, +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + DBMDX_MIC_MODE_DIGITAL_4CH, +#endif + DBMDX_MIC_MODE_DISABLE, +}; + +enum dbmdx_microphone_type { + DBMDX_MIC_TYPE_MIC0 = 0, + DBMDX_MIC_TYPE_MIC1, + DBMDX_MIC_TYPE_MIC2, + +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + DBMDX_MIC_TYPE_MIC3, + DBMDX_MIC_TYPE_MIC4, +#endif +}; + +enum dbmdx_microphone_gain { + DBMDX_DIGITAL_MIC_DIGITAL_GAIN = 0, + DBMDX_ANALOG_MIC_ANALOG_GAIN, + DBMDX_ANALOG_MIC_DIGITAL_GAIN, +}; + +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) +static int dbmdx_update_microphone_mode_ns_config_by_usecase( + struct dbmdx_private *p, + enum dbmdx_microphone_mode mode) +{ + unsigned int new_detection_kfifo_size; + + dev_dbg(p->dev, "%s: mode: %d\n", __func__, mode); + + + p->va_current_mic_config = mode; + + if (p->va_current_mic_config != DBMDX_MIC_MODE_DISABLE) + p->va_active_mic_config = p->va_current_mic_config; + + new_detection_kfifo_size = p->detection_samples_kfifo_buf_size; + + p->pdata->va_audio_channels = 1; + if (p->pdata->detection_buffer_channels == 0 || + p->pdata->detection_buffer_channels == 1) { + p->detection_achannel_op = AUDIO_CHANNEL_OP_COPY; + new_detection_kfifo_size = MAX_KFIFO_BUFFER_SIZE_MONO; + } else { + p->detection_achannel_op = + AUDIO_CHANNEL_OP_DUPLICATE_1_TO_2; + new_detection_kfifo_size = MAX_KFIFO_BUFFER_SIZE_STEREO; + } + + if (p->audio_pcm_channels == 1) + p->pcm_achannel_op = AUDIO_CHANNEL_OP_COPY; + else + p->pcm_achannel_op = AUDIO_CHANNEL_OP_DUPLICATE_1_TO_2; + + + if (new_detection_kfifo_size != p->detection_samples_kfifo_buf_size) { + p->detection_samples_kfifo_buf_size = new_detection_kfifo_size; + kfifo_init(&p->detection_samples_kfifo, + p->detection_samples_kfifo_buf, + new_detection_kfifo_size); + } + + return 0; +} + +static int dbmdx_update_microphone_mode_ns_with_config(struct dbmdx_private *p, + enum dbmdx_microphone_mode mode) +{ + int ret = 0; + unsigned int new_detection_kfifo_size; + + dev_dbg(p->dev, "%s: current mode: %d requested mode: %d\n", __func__, p->va_current_mic_config, mode); + + /* first disable both mics */ + switch (p->va_current_mic_config) { + case DBMDX_MIC_MODE_DISABLE: + break; + case DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_LEFT: + case DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_RIGHT: + case DBMDX_MIC_MODE_ANALOG_DUAL: + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE2_CONFIGURATION | DBMDX_MIC_DISABLE_VAL, + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set microphone mode 0x%x\n", + __func__, mode); + ret = -EINVAL; + goto out; + } + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | DBMDX_MIC_DISABLE_VAL, + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set microphone mode 0x%x\n", + __func__, mode); + ret = -EINVAL; + goto out; + } + /* Fall through */ + case DBMDX_MIC_MODE_DIGITAL_LEFT: + /* Fall through */ + case DBMDX_MIC_MODE_DIGITAL_RIGHT: + /* Fall through */ + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | DBMDX_MIC_DISABLE_VAL, + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set microphone mode 0x%x\n", + __func__, mode); + ret = -EINVAL; + goto out; + } + break; + case DBMDX_MIC_MODE_ANALOG: + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION , NULL); + if (ret < 0) { + dev_err(p->dev, "%s: failed to set microphone mode 0x%x\n", + __func__, mode); + ret = -EINVAL; + goto out; + } + break; + default: + dev_err(p->dev, "%s: Unsupported microphone mode 0x%x\n", + __func__, mode); + ret = -EINVAL; + goto out; + } + + switch (mode) { + case DBMDX_MIC_MODE_DISABLE: + break; + case DBMDX_MIC_MODE_DIGITAL_LEFT: + /* Fall through */ + case DBMDX_MIC_MODE_DIGITAL_RIGHT: + /* Fall through */ + case DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_LEFT: + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC0], + NULL); + + if (ret < 0) + break; + + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE2_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC1], + NULL); + break; + case DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_RIGHT: + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC1], + NULL); + + if (ret < 0) + break; + + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE2_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC0], + NULL); + break; + case DBMDX_MIC_MODE_ANALOG: + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC2], NULL); + break; + case DBMDX_MIC_MODE_ANALOG_DUAL: + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC0], NULL); + if (ret < 0) + break; + + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE2_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC1], + NULL); + break; + default: + dev_err(p->dev, "%s: Unsupported microphone mode 0x%x\n", + __func__, mode); + ret = -EINVAL; + goto out; + } + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set microphone mode 0x%x\n", + __func__, mode); + ret = -EINVAL; + goto out; + } + + p->va_current_mic_config = mode; + + + if (p->va_current_mic_config != DBMDX_MIC_MODE_DISABLE) + p->va_active_mic_config = p->va_current_mic_config; + + new_detection_kfifo_size = p->detection_samples_kfifo_buf_size; + + p->pdata->va_audio_channels = 1; + if (p->pdata->detection_buffer_channels == 0 || + p->pdata->detection_buffer_channels == 1) { + p->detection_achannel_op = AUDIO_CHANNEL_OP_COPY; + new_detection_kfifo_size = MAX_KFIFO_BUFFER_SIZE_MONO; + } else { + p->detection_achannel_op = AUDIO_CHANNEL_OP_DUPLICATE_1_TO_2; + new_detection_kfifo_size = MAX_KFIFO_BUFFER_SIZE_STEREO; + } + + if (p->audio_pcm_channels == 1) + p->pcm_achannel_op = AUDIO_CHANNEL_OP_COPY; + else + p->pcm_achannel_op = AUDIO_CHANNEL_OP_DUPLICATE_1_TO_2; + + + if (new_detection_kfifo_size != p->detection_samples_kfifo_buf_size) { + p->detection_samples_kfifo_buf_size = new_detection_kfifo_size; + kfifo_init(&p->detection_samples_kfifo, + p->detection_samples_kfifo_buf, + new_detection_kfifo_size); + } + +out: + return ret; +} + + +static int dbmdx_update_microphone_mode(struct dbmdx_private *p, + enum dbmdx_microphone_mode mode) +{ + if (p->pdata->mic_config_source == DBMDX_MIC_CONFIG_SOURCE_EXPLICIT) + return dbmdx_update_microphone_mode_ns_with_config(p, mode); + else + return dbmdx_update_microphone_mode_ns_config_by_usecase(p, + mode); +} + +#else + +static int dbmdx_update_microphone_mode(struct dbmdx_private *p, + enum dbmdx_microphone_mode mode) +{ + int ret = 0; + unsigned int new_detection_kfifo_size; + + dev_dbg(p->dev, "%s: mode: %d\n", __func__, mode); + + /* first disable both mics */ +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE4_CONFIGURATION | DBMDX_MIC_DISABLE_VAL, + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set microphone mode 0x%x\n", + __func__, mode); + ret = -EINVAL; + goto out; + } + + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE3_CONFIGURATION | DBMDX_MIC_DISABLE_VAL, + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set microphone mode 0x%x\n", + __func__, mode); + ret = -EINVAL; + goto out; + } +#endif + + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE2_CONFIGURATION | DBMDX_MIC_DISABLE_VAL, + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set microphone mode 0x%x\n", + __func__, mode); + ret = -EINVAL; + goto out; + } + + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | DBMDX_MIC_DISABLE_VAL, + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set microphone mode 0x%x\n", + __func__, mode); + ret = -EINVAL; + goto out; + } + + switch (mode) { + case DBMDX_MIC_MODE_DISABLE: + break; + case DBMDX_MIC_MODE_DIGITAL_LEFT: + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC0], + NULL); + break; + case DBMDX_MIC_MODE_DIGITAL_RIGHT: + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC1], + NULL); + break; + case DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_LEFT: + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC0], + NULL); + + if (ret < 0) + break; + + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE2_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC1], + NULL); + break; + case DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_RIGHT: + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC1], + NULL); + + if (ret < 0) + break; + + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE2_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC0], + NULL); + break; + case DBMDX_MIC_MODE_ANALOG: + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC2], NULL); + break; + case DBMDX_MIC_MODE_ANALOG_DUAL: + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC0], NULL); + + if (ret < 0) + break; + + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE2_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC1], + NULL); + break; +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + case DBMDX_MIC_MODE_DIGITAL_4CH: + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE1_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC0], + NULL); + + if (ret < 0) + break; + + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE2_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC1], + NULL); + + if (ret < 0) + break; + + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE3_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC3], + NULL); + + if (ret < 0) + break; + + ret = dbmdx_send_cmd(p, + DBMDX_VA_MICROPHONE4_CONFIGURATION | + p->pdata->va_mic_config[DBMDX_MIC_TYPE_MIC4], + NULL); + break; +#endif + default: + dev_err(p->dev, "%s: Unsupported microphone mode 0x%x\n", + __func__, mode); + ret = -EINVAL; + goto out; + } + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set microphone mode 0x%x\n", + __func__, mode); + ret = -EINVAL; + goto out; + } + + p->va_current_mic_config = mode; + + if (p->va_current_mic_config != DBMDX_MIC_MODE_DISABLE) + p->va_active_mic_config = p->va_current_mic_config; + + new_detection_kfifo_size = p->detection_samples_kfifo_buf_size; + + switch (mode) { + case DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_LEFT: + case DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_RIGHT: + case DBMDX_MIC_MODE_ANALOG_DUAL: + p->pdata->va_audio_channels = 2; + if (p->pdata->detection_buffer_channels == 0 || + p->pdata->detection_buffer_channels == 2) { + p->detection_achannel_op = AUDIO_CHANNEL_OP_COPY; + new_detection_kfifo_size = MAX_KFIFO_BUFFER_SIZE_STEREO; +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + } else if (p->pdata->detection_buffer_channels == 4) { + p->detection_achannel_op = + AUDIO_CHANNEL_OP_DUPLICATE_2_TO_4; + new_detection_kfifo_size = MAX_KFIFO_BUFFER_SIZE_4CH; +#endif + } else { + p->detection_achannel_op = + AUDIO_CHANNEL_OP_TRUNCATE_2_TO_1; + new_detection_kfifo_size = MAX_KFIFO_BUFFER_SIZE_MONO; + } + + if (p->audio_pcm_channels == 2) + p->pcm_achannel_op = AUDIO_CHANNEL_OP_COPY; +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + else if (p->audio_pcm_channels == 4) + p->pcm_achannel_op = AUDIO_CHANNEL_OP_DUPLICATE_2_TO_4; +#endif + else + p->pcm_achannel_op = + AUDIO_CHANNEL_OP_TRUNCATE_2_TO_1; + break; + case DBMDX_MIC_MODE_DIGITAL_LEFT: + case DBMDX_MIC_MODE_DIGITAL_RIGHT: + case DBMDX_MIC_MODE_ANALOG: + p->pdata->va_audio_channels = 1; + if (p->pdata->detection_buffer_channels == 0 || + p->pdata->detection_buffer_channels == 1) { + p->detection_achannel_op = AUDIO_CHANNEL_OP_COPY; + new_detection_kfifo_size = MAX_KFIFO_BUFFER_SIZE_MONO; +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + } else if (p->pdata->detection_buffer_channels == 4) { + p->detection_achannel_op = + AUDIO_CHANNEL_OP_DUPLICATE_1_TO_4; + new_detection_kfifo_size = MAX_KFIFO_BUFFER_SIZE_4CH; +#endif + } else { + p->detection_achannel_op = + AUDIO_CHANNEL_OP_DUPLICATE_1_TO_2; + new_detection_kfifo_size = MAX_KFIFO_BUFFER_SIZE_STEREO; + } + + if (p->audio_pcm_channels == 1) + p->pcm_achannel_op = AUDIO_CHANNEL_OP_COPY; +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + else if (p->audio_pcm_channels == 4) + p->pcm_achannel_op = AUDIO_CHANNEL_OP_DUPLICATE_1_TO_4; +#endif + else + p->pcm_achannel_op = + AUDIO_CHANNEL_OP_DUPLICATE_1_TO_2; + + break; +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + case DBMDX_MIC_MODE_DIGITAL_4CH: + p->pdata->va_audio_channels = 4; + if (p->pdata->detection_buffer_channels == 0 || + p->pdata->detection_buffer_channels == 4) { + p->detection_achannel_op = AUDIO_CHANNEL_OP_COPY; + new_detection_kfifo_size = MAX_KFIFO_BUFFER_SIZE_4CH; + } else if (p->pdata->detection_buffer_channels == 1) { + p->detection_achannel_op = + AUDIO_CHANNEL_OP_TRUNCATE_4_TO_1; + new_detection_kfifo_size = MAX_KFIFO_BUFFER_SIZE_MONO; + } else { + p->detection_achannel_op = + AUDIO_CHANNEL_OP_TRUNCATE_4_TO_2; + new_detection_kfifo_size = MAX_KFIFO_BUFFER_SIZE_STEREO; + } + + if (p->audio_pcm_channels == 4) + p->pcm_achannel_op = AUDIO_CHANNEL_OP_COPY; + else if (p->audio_pcm_channels == 2) + p->pcm_achannel_op = AUDIO_CHANNEL_OP_TRUNCATE_4_TO_2; + else + p->pcm_achannel_op = + AUDIO_CHANNEL_OP_TRUNCATE_4_TO_1; + + break; +#endif + default: + break; + } + + if (new_detection_kfifo_size != p->detection_samples_kfifo_buf_size) { + p->detection_samples_kfifo_buf_size = new_detection_kfifo_size; + kfifo_init(&p->detection_samples_kfifo, + p->detection_samples_kfifo_buf, + new_detection_kfifo_size); + } + +out: + return ret; +} +#endif + +static int dbmdx_reconfigure_microphones(struct dbmdx_private *p, + enum dbmdx_microphone_mode mode) +{ + int ret; + int current_mode; + int current_audio_channels; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + if (p->active_fw != DBMDX_FW_VA) { + dev_err(p->dev, "%s: VA firmware not active, error\n", + __func__); + return -EAGAIN; + } + + + dev_dbg(p->dev, "%s: val - %d\n", __func__, (int)mode); + +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + if ((mode == DBMDX_MIC_MODE_DIGITAL_LEFT) || + (mode == DBMDX_MIC_MODE_DIGITAL_RIGHT)) { + mode = DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_LEFT; + dev_info(p->dev, "%s: Enforcing Mic config: 2\n", __func__); + } +#endif + + /* flush pending buffering works if any */ + p->va_flags.buffering = 0; + flush_work(&p->sv_work); + + p->va_flags.reconfigure_mic_on_vad_change = true; + + ret = dbmdx_suspend_pcm_streaming_work(p); + if (ret < 0) + dev_err(p->dev, "%s: Failed to suspend PCM Streaming Work\n", + __func__); + + p->lock(p); + + current_mode = p->va_flags.mode; + current_audio_channels = p->pdata->va_audio_channels; + + ret = dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + if (ret < 0) { + dev_err(p->dev, "%s: failed to set PM_ACTIVE\n", __func__); + ret = -EINVAL; + goto out_unlock; + } + + if (p->va_flags.microphones_enabled == true) { + p->va_flags.sleep_not_allowed = true; + + p->va_flags.disabling_mics_not_allowed = true; + + /* set chip to idle mode */ + ret = dbmdx_set_mode(p, DBMDX_IDLE); + + p->va_flags.disabling_mics_not_allowed = false; + + if (ret) { + dev_err(p->dev, "%s: failed to set device to idle mode\n", + __func__); + p->va_flags.sleep_not_allowed = false; + goto out_unlock; + } + + ret = dbmdx_update_microphone_mode(p, mode); + + p->va_flags.sleep_not_allowed = false; + + if (ret < 0) { + dev_err(p->dev, "%s: set microphone mode error\n", + __func__); + goto out_pm_mode; + } + } else { + p->va_active_mic_config = mode; + } + + ret = 0; + + if (mode != DBMDX_MIC_MODE_DISABLE) { + if (mode != DBMDX_MIC_MODE_ANALOG) { + if (p->va_cur_digital_mic_digital_gain != 0x1000 && + p->va_cur_analog_mic_digital_gain != + p->va_cur_digital_mic_digital_gain) { + ret = dbmdx_send_cmd(p, + DBMDX_VA_DIGITAL_GAIN | + (p->va_cur_digital_mic_digital_gain & 0xffff), + NULL); + } + } else { + if (p->va_cur_analog_mic_digital_gain != 0x1000 && + p->va_cur_analog_mic_digital_gain != + p->va_cur_digital_mic_digital_gain) { + ret = dbmdx_send_cmd(p, + DBMDX_VA_DIGITAL_GAIN | + (p->va_cur_analog_mic_digital_gain & 0xffff), + NULL); + } + } + } + + if (ret < 0) { + dev_err(p->dev, "%s: set gain error\n", __func__); + goto out_pm_mode; + } + + if (current_mode == DBMDX_DETECTION || + current_mode == DBMDX_DETECTION_AND_STREAMING) { + + ret = dbmdx_trigger_detection(p); + if (ret) { + dev_err(p->dev, + "%s: failed to trigger detection\n", + __func__); + goto out_pm_mode; + } + + } else if (current_mode == DBMDX_STREAMING) { + ret = dbmdx_set_mode(p, DBMDX_STREAMING); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set DBMDX_STREAMING mode\n", + __func__); + goto out_pm_mode; + } + } else + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + + dev_dbg(p->dev, "%s: Microphone was set to mode:- %d\n", + __func__, (int)mode); +out_pm_mode: + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); +out_unlock: + p->unlock(p); + return ret; +} + +static int dbmdx_disable_microphones(struct dbmdx_private *p) +{ + int ret = 0; + +#ifndef DBMDX_FW_MANAGES_MIC_DISABLING + if ((p->cur_firmware_id != DBMDX_FIRMWARE_ID_DBMD4) && + (p->cur_firmware_id != DBMDX_FIRMWARE_ID_DBMD6) && + (p->cur_firmware_id != DBMDX_FIRMWARE_ID_DBMD8)) + return 0; + + if (p->va_current_mic_config == DBMDX_MIC_MODE_DISABLE || + p->va_flags.disabling_mics_not_allowed == true || + p->mic_disabling_blocked == true) + return 0; + + p->va_active_mic_config = p->va_current_mic_config; + + ret = dbmdx_update_microphone_mode(p, DBMDX_MIC_MODE_DISABLE); + + p->va_flags.microphones_enabled = false; + + dev_dbg(p->dev, "%s: Microphones were (disabled)\n", __func__); +#endif + + return ret; +} + +static int dbmdx_restore_microphones(struct dbmdx_private *p) +{ + int ret = 0; + +#ifndef DBMDX_FW_MANAGES_MIC_DISABLING + if ((p->cur_firmware_id != DBMDX_FIRMWARE_ID_DBMD4) && + (p->cur_firmware_id != DBMDX_FIRMWARE_ID_DBMD6) && + (p->cur_firmware_id != DBMDX_FIRMWARE_ID_DBMD8)) + return 0; + + //if (p->va_current_mic_config != DBMDX_MIC_MODE_DISABLE) + // return 0; + + ret = dbmdx_update_microphone_mode(p, p->va_active_mic_config); + + p->va_flags.microphones_enabled = true; + + msleep(DBMDX_MSLEEP_AFTER_MIC_ENABLED); + + dev_dbg(p->dev, "%s: Microphones were restored (enabled)\n", __func__); +#else + msleep(DBMDX_MSLEEP_AFTER_MIC_ENABLED); +#endif + + return ret; +} + +static int dbmdx_set_pcm_rate(struct dbmdx_private *p, + unsigned int pcm_rate) +{ + u16 cur_config = 0xffff; + int rate_mask; + int ret = 0; + + if (p->current_pcm_rate == pcm_rate) + return 0; + + switch (pcm_rate) { +#if IS_ENABLED(DBMDX_PCM_RATE_8000_SUPPORTED) + case 8000: + rate_mask = DBMDX_SND_PCM_RATE_8000; + break; +#endif + case 16000: + rate_mask = DBMDX_SND_PCM_RATE_16000; + break; +#if IS_ENABLED(DBMDX_PCM_RATE_32000_SUPPORTED) + case 32000: + rate_mask = DBMDX_SND_PCM_RATE_32000; + break; +#endif +#if IS_ENABLED(DBMDX_PCM_RATE_44100_SUPPORTED) + case 44100: + rate_mask = DBMDX_SND_PCM_RATE_44100; + break; +#endif + case 48000: + rate_mask = DBMDX_SND_PCM_RATE_48000; + break; + default: + dev_err(p->dev, "%s: Unsupported rate %u\n", + __func__, pcm_rate); + return -EINVAL; + } + + dev_dbg(p->dev, "%s: set pcm rate: %u\n", __func__, pcm_rate); + + p->current_pcm_rate = pcm_rate; + + /* read configuration */ + ret = dbmdx_send_cmd(p, + DBMDX_VA_GENERAL_CONFIGURATION_2, + &cur_config); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to read DBMDX_VA_GENERAL_CONFIGURATION_2\n", + __func__); + return ret; + } + + cur_config &= DBMDX_SND_PCM_RATE_MASK; + cur_config |= rate_mask; + + ret = dbmdx_send_cmd(p, + DBMDX_VA_GENERAL_CONFIGURATION_2 | cur_config, + NULL); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set DBMDX_VA_GENERAL_CONFIGURATION_2\n", + __func__); + return ret; + } + + /* Do not restore mics if they are disabled */ + if (p->va_current_mic_config == DBMDX_MIC_MODE_DISABLE) + return 0; + + return dbmdx_update_microphone_mode(p, p->va_active_mic_config); + +} + +static int dbmdx_read_fw_vad_settings(struct dbmdx_private *p) +{ + u16 cur_config = 0xffff; + int ret = 0; + + /* read configuration */ + ret = dbmdx_send_cmd(p, + DBMDX_VA_GENERAL_CONFIGURATION_2, + &cur_config); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to read DBMDX_VA_GENERAL_CONFIGURATION_2\n", + __func__); + return ret; + } + + cur_config &= DBMDX_HW_VAD_MASK; + p->fw_vad_type = ((cur_config >> 5) & 0x3); + + dev_dbg(p->dev, "%s: FW Vad is set to 0x%08x\n", + __func__, p->fw_vad_type); + + return 0; +} + +static int dbmdx_verify_model_support(struct dbmdx_private *p) +{ +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + u16 cur_config = 0; + + p->okg_a_model_support = false; + p->sv_a_model_support = false; + + if (dbmdx_send_cmd(p, DBMDX_VA_FEATURE_SUPPORT, &cur_config) < 0) { + dev_err(p->dev, + "%s: failed to read DBMDX_VA_FEATURE_SUPPORT\n", + __func__); + return -EIO; + } + + if (cur_config == DBMDX_UNDEFINED_REGISTER) { + dev_dbg(p->dev, + "%s: Amodel type support verification is not supported in FW\n", + __func__); + p->sv_a_model_support = true; + return 0; + + } +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + if (cur_config & DBMDX_OKG_AMODEL_SUPPORT_MASK) { + p->okg_a_model_support = true; + dev_dbg(p->dev, "%s: OKG FW Support was verified\n", __func__); + } else + p->va_flags.okg_a_model_enabled = false; +#else + p->okg_a_model_support = true; + dev_dbg(p->dev, + "%s: Assuming OKG is supported by FW\n", __func__); +#endif + + if (cur_config & DBMDX_SV_AMODEL_SUPPORT_MASK) { + p->sv_a_model_support = true; + dev_dbg(p->dev, "%s: SV FW Support was verified\n", __func__); + } else if (cur_config & DBMDX_SVT_AMODEL_SUPPORT_MASK) { + p->sv_a_model_support = true; + dev_dbg(p->dev, "%s: SVT FW Support was verified\n", __func__); + } + + /* FW doesn't support model support verification */ + if (!p->sv_a_model_support && !p->okg_a_model_support) { + dev_dbg(p->dev, + "%s: Amodel type support wasn't verified, setting default\n", + __func__); + p->sv_a_model_support = true; + } +#else + p->sv_a_model_support = true; +#endif + return 0; +} + +static int dbmdx_disable_hw_vad(struct dbmdx_private *p) +{ + u16 cur_config = 0xffff; + u16 cur_fw_vad_config = 0; + int ret = 0; + + if ((p->cur_firmware_id != DBMDX_FIRMWARE_ID_DBMD4) && + (p->cur_firmware_id != DBMDX_FIRMWARE_ID_DBMD6) && + (p->cur_firmware_id != DBMDX_FIRMWARE_ID_DBMD8)) + return 0; + + /* read configuration */ + ret = dbmdx_send_cmd(p, + DBMDX_VA_GENERAL_CONFIGURATION_2, + &cur_config); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to read DBMDX_VA_GENERAL_CONFIGURATION_2\n", + __func__); + return ret; + } + + cur_fw_vad_config = cur_config & DBMDX_HW_VAD_MASK; + + if (!cur_fw_vad_config) { + dev_dbg(p->dev, + "%s: The HW VAD is already disabled, do nothing\n", + __func__); + return 0; + } + + cur_config &= (~(DBMDX_HW_VAD_MASK) & 0xffff); + + ret = dbmdx_send_cmd(p, + DBMDX_VA_GENERAL_CONFIGURATION_2 | cur_config, + NULL); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set DBMDX_VA_GENERAL_CONFIGURATION_2\n", + __func__); + return ret; + } + + if (p->va_flags.reconfigure_mic_on_vad_change) { + + if (p->va_flags.microphones_enabled) { + ret = dbmdx_update_microphone_mode(p, + p->va_active_mic_config); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to restore microphones\n", + __func__); + } + } + p->va_flags.reconfigure_mic_on_vad_change = false; + } + + dev_dbg(p->dev, "%s: HW Vad is disabled reg 0x23 is set to 0x%08x\n", + __func__, cur_config); + + return 0; +} + +static int dbmdx_restore_fw_vad_settings(struct dbmdx_private *p) +{ + u16 cur_config = 0xffff; + int ret = 0; + + if ((p->cur_firmware_id != DBMDX_FIRMWARE_ID_DBMD4) && + (p->cur_firmware_id != DBMDX_FIRMWARE_ID_DBMD6) && + (p->cur_firmware_id != DBMDX_FIRMWARE_ID_DBMD8)) + return 0; + + if (!(p->fw_vad_type)) { + dev_dbg(p->dev, + "%s: The HW VAD is already disabled, do nothing\n", + __func__); + return 0; + } + + /* read configuration */ + ret = dbmdx_send_cmd(p, + DBMDX_VA_GENERAL_CONFIGURATION_2, + &cur_config); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to read DBMDX_VA_GENERAL_CONFIGURATION_2\n", + __func__); + return ret; + } + + cur_config |= ((p->fw_vad_type << 5) & DBMDX_HW_VAD_MASK); + + ret = dbmdx_send_cmd(p, + DBMDX_VA_GENERAL_CONFIGURATION_2 | cur_config, + NULL); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set DBMDX_VA_GENERAL_CONFIGURATION_2\n", + __func__); + return ret; + } + + if (p->va_flags.reconfigure_mic_on_vad_change) { + + if (p->va_flags.microphones_enabled) { + ret = dbmdx_update_microphone_mode(p, + p->va_active_mic_config); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to restore microphones\n", + __func__); + } + } + p->va_flags.reconfigure_mic_on_vad_change = false; + } + + dev_dbg(p->dev, "%s: HW Vad is restored reg 0x23 is set to 0x%08x\n", + __func__, cur_config); + + return 0; +} + +static int dbmdx_set_pcm_streaming_mode(struct dbmdx_private *p, u16 mode) +{ + u16 cur_config = 0xffff; + int ret = 0; + + /* read configuration */ + ret = dbmdx_send_cmd(p, + DBMDX_VA_GENERAL_CONFIGURATION_2, + &cur_config); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to read DBMDX_VA_GENERAL_CONFIGURATION_2\n", + __func__); + return ret; + } + + if (mode > 1) + mode = 1; + + cur_config &= ~(1 << 12); + cur_config |= (mode << 12); + + ret = dbmdx_send_cmd(p, + DBMDX_VA_GENERAL_CONFIGURATION_2 | cur_config, + NULL); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set DBMDX_VA_GENERAL_CONFIGURATION_2\n", + __func__); + return ret; + } + + dev_dbg(p->dev, "%s: PCM Streaming mode: %d, Reg 0x23: (0x%08x)\n", + __func__, mode, cur_config); + + return 0; +} + +static int dbmdx_calc_amodel_checksum(struct dbmdx_private *p, + const char *amodel, + unsigned long len, unsigned long *chksum) +{ + unsigned long sum = 0; + u16 val; + unsigned long i; + u32 pos = 0, chunk_len; + int err = -1; + + *chksum = 0; + + while (pos < len) { + val = *(u16 *)(&amodel[pos]); + pos += 2; + if (pos >= len) { + dev_dbg(p->dev, "%s:%d %u", __func__, + __LINE__, pos); + return err; + } + + if (val == 0x025a) { + sum += 0x5a + 0x02; + + chunk_len = *(u32 *)(&amodel[pos]); + pos += 4; + if (pos >= len) { + dev_dbg(p->dev, "%s:%d %u", __func__, + __LINE__, pos); + return err; + } + + sum += chunk_len; + + sum += *(u32 *)(&amodel[pos]); + pos += 4; + + if ((pos + (chunk_len * 2)) > len) { + dev_dbg(p->dev, "%s:%d %u, %u", + __func__, __LINE__, pos, chunk_len); + return err; + } + + for (i = 0; i < chunk_len; i++) { + sum += *(u16 *)(&amodel[pos]); + pos += 2; + } + } else + continue; + } + + sum += 0x5A + 0x0e; + *chksum = sum; + + return 0; +} + +static ssize_t dbmdx_acoustic_model_build_gram_net_no_headers( + struct dbmdx_private *p, + const u8 *gram_data, + size_t gram_size, + u32 gram_addr, + const u8 *net_data, + size_t net_size, + char *amodel_buf, + ssize_t *amodel_size) +{ + unsigned char head[DBMDX_AMODEL_HEADER_SIZE] = { 0 }; + size_t pos; + unsigned long checksum; + int ret; + u32 net_addr = 0x2; + ssize_t head_size = DBMDX_AMODEL_HEADER_SIZE; + + pos = 0; + if (gram_addr == 0x1) { + head[0] = 0x0; + head[1] = 0x0; + head[2] = 0x5A; + head[3] = 0x02; + head[4] = (gram_size/2) & 0xff; + head[5] = ((gram_size/2) >> 8) & 0xff; + head[6] = ((gram_size/2) >> 16) & 0xff; + head[7] = ((gram_size/2) >> 24) & 0xff; + head[8] = (gram_addr) & 0xff; + head[9] = ((gram_addr) >> 8) & 0xff; + head[10] = ((gram_addr) >> 16) & 0xff; + head[11] = ((gram_addr) >> 24) & 0xff; + } else { + head[0] = 0x5A; + head[1] = 0x02; + head[2] = ((gram_size/2)+1) & 0xff; + head[3] = (((gram_size/2)+1) >> 8) & 0xff; + head[4] = (((gram_size/2)+1) >> 16) & 0xff; + head[5] = (((gram_size/2)+1) >> 24) & 0xff; + head[6] = (gram_addr) & 0xff; + head[7] = ((gram_addr) >> 8) & 0xff; + head[8] = ((gram_addr) >> 16) & 0xff; + head[9] = ((gram_addr) >> 24) & 0xff; + head[10] = (gram_size/2) & 0xff; + head[11] = ((gram_size/2) >> 8) & 0xff; + } + + memcpy(amodel_buf, head, head_size); + + pos += head_size; + + if (pos + gram_size > MAX_AMODEL_SIZE) { + dev_err(p->dev, + "%s: adding gram exceeds max size %zd>%d\n", + __func__, pos + gram_size + 6, MAX_AMODEL_SIZE); + ret = -EINVAL; + goto out; + } + + memcpy(amodel_buf + pos, gram_data, gram_size); + + pos += gram_size; + + if (gram_addr != 0x1) + net_addr = gram_addr + (gram_size)/2 + 1; + + if (gram_addr == 0x1) { + head[0] = 0x0; + head[1] = 0x0; + head[2] = 0x5A; + head[3] = 0x02; + head[4] = (net_size/2) & 0xff; + head[5] = ((net_size/2) >> 8) & 0xff; + head[6] = ((net_size/2) >> 16) & 0xff; + head[7] = ((net_size/2) >> 24) & 0xff; + head[8] = (net_addr) & 0xff; + head[9] = ((net_addr) >> 8) & 0xff; + head[10] = ((net_addr) >> 16) & 0xff; + head[11] = ((net_addr) >> 24) & 0xff; + } else { + head[0] = 0x5A; + head[1] = 0x02; + head[2] = ((net_size/2)+1) & 0xff; + head[3] = (((net_size/2)+1) >> 8) & 0xff; + head[4] = (((net_size/2)+1) >> 16) & 0xff; + head[5] = (((net_size/2)+1) >> 24) & 0xff; + head[6] = (net_addr) & 0xff; + head[7] = ((net_addr) >> 8) & 0xff; + head[8] = ((net_addr) >> 16) & 0xff; + head[9] = ((net_addr) >> 24) & 0xff; + head[10] = (net_size/2) & 0xff; + head[11] = ((net_size/2) >> 8) & 0xff; + } + + memcpy(amodel_buf + pos, head, head_size); + + pos += head_size; + + if (pos + net_size + 6 > MAX_AMODEL_SIZE) { + dev_err(p->dev, + "%s: adding net exceeds max size %zd>%d\n", + __func__, pos + net_size + 6, MAX_AMODEL_SIZE); + ret = -EINVAL; + goto out; + } + + memcpy(amodel_buf + pos, net_data, net_size); + + ret = dbmdx_calc_amodel_checksum(p, + (char *)amodel_buf, + pos + net_size, + &checksum); + if (ret) { + dev_err(p->dev, "%s: failed to calculate Amodel checksum\n", + __func__); + ret = -EINVAL; + goto out; + } + + *(unsigned long *)(amodel_buf + pos + net_size) = checksum; + + *amodel_size = (ssize_t)(pos + net_size + 4); + + ret = *amodel_size; + +out: + return ret; +} +static ssize_t dbmdx_acoustic_model_build_single_no_headers( + struct dbmdx_private *p, + const u8 *model_data, + size_t model_size, + u32 addr, + char *amodel_buf, + ssize_t *amodel_size) +{ + unsigned char head[DBMDX_AMODEL_HEADER_SIZE] = { 0 }; + size_t pos; + unsigned long checksum; + int ret; + ssize_t head_size = DBMDX_AMODEL_HEADER_SIZE; + + pos = 0; + head[0] = 0x0; + head[1] = 0x0; + head[2] = 0x5A; + head[3] = 0x02; + head[4] = (model_size/2) & 0xff; + head[5] = ((model_size/2) >> 8) & 0xff; + head[6] = ((model_size/2) >> 16) & 0xff; + head[7] = ((model_size/2) >> 24) & 0xff; + head[8] = (addr) & 0xff; + head[9] = ((addr) >> 8) & 0xff; + head[10] = ((addr) >> 16) & 0xff; + head[11] = ((addr) >> 24) & 0xff; + + memcpy(amodel_buf, head, head_size); + + pos += head_size; + + if (pos + model_size > MAX_AMODEL_SIZE) { + dev_err(p->dev, + "%s: model exceeds max size %zd>%d\n", + __func__, pos + model_size + 6, MAX_AMODEL_SIZE); + ret = -EINVAL; + goto out; + } + + memcpy(amodel_buf + pos, model_data, model_size); + + pos += model_size; + + ret = dbmdx_calc_amodel_checksum(p, + (char *)amodel_buf, + pos, + &checksum); + if (ret) { + dev_err(p->dev, "%s: failed to calculate Amodel checksum\n", + __func__); + ret = -EINVAL; + goto out; + } + + *(unsigned long *)(amodel_buf + pos) = checksum; + + *amodel_size = (ssize_t)(pos + 4); + + ret = *amodel_size; + +out: + return ret; +} + + +static ssize_t dbmdx_acoustic_model_build_from_multichunk_file( + struct dbmdx_private *p, + const u8 *file_data, + ssize_t file_size, + char *amodel_buf, + ssize_t *amodel_size, + int *num_of_amodel_chunks, + ssize_t *amodel_chunks_size) +{ + unsigned char head[DBMDX_AMODEL_HEADER_SIZE] = { 0 }; + size_t target_pos, src_pos; + unsigned long checksum; + int ret; + ssize_t head_size = DBMDX_AMODEL_HEADER_SIZE; + ssize_t enc_head_size = DBMDX_AMODEL_HEADER_SIZE - 2; + size_t encoded_size; + + src_pos = 0; + target_pos = 0; + *num_of_amodel_chunks = 0; + + while (src_pos < file_size) { + + if ((file_size - src_pos) < enc_head_size) + break; + + if (*num_of_amodel_chunks >= DBMDX_AMODEL_MAX_CHUNKS) { + dev_warn(p->dev, + "%s: Reached Max number of Amodel chunks\n", + __func__); + break; + } + + if (file_data[src_pos] != 0x5A || + file_data[src_pos+1] != 0x02) { + src_pos += 2; + continue; + } + + head[0] = 0x0; + head[1] = 0x0; + + memcpy(head + 2, file_data + src_pos, enc_head_size); + + encoded_size = (size_t)(head[4] | (head[5]<<8) | + (head[6]<<16) | (head[7]<<24)) * 2; + + src_pos += enc_head_size; + + if (encoded_size > (file_size - src_pos)) { + dev_err(p->dev, "%s: Encoded size > File size\n", + __func__); + ret = -EINVAL; + goto out; + } + + memcpy(amodel_buf + target_pos, head, head_size); + + target_pos += head_size; + + if (target_pos + encoded_size + 6 > MAX_AMODEL_SIZE) { + dev_err(p->dev, + "%s: adding chunk exceeds max size %zd>%d\n", + __func__, + target_pos + encoded_size + 6, MAX_AMODEL_SIZE); + ret = -EINVAL; + goto out; + } + + memcpy(amodel_buf + target_pos, file_data + src_pos, + encoded_size); + + + src_pos += encoded_size; + target_pos += encoded_size; + amodel_chunks_size[*num_of_amodel_chunks] = encoded_size; + + dev_info(p->dev, + "%s: Added chunk #%d, (%d bytes), target_pos=%d\n", + __func__, *num_of_amodel_chunks, + (int)encoded_size, (int)target_pos); + + *num_of_amodel_chunks = *num_of_amodel_chunks + 1; + + } + + ret = dbmdx_calc_amodel_checksum(p, + (char *)amodel_buf, + target_pos, + &checksum); + if (ret) { + dev_err(p->dev, "%s: failed to calculate Amodel checksum\n", + __func__); + ret = -EINVAL; + goto out; + } + + *(unsigned long *)(amodel_buf + target_pos) = checksum; + + *amodel_size = (ssize_t)(target_pos + 4); + + ret = *amodel_size; + +out: + return ret; +} + +static ssize_t dbmdx_acoustic_model_build_from_svt_multichunk_file( + struct dbmdx_private *p, + const u8 *file_data, + ssize_t file_size, + char *amodel_buf, + ssize_t *amodel_size, + int *num_of_amodel_chunks, + ssize_t *amodel_chunks_size) +{ + unsigned char head[DBMDX_AMODEL_HEADER_SIZE] = { 0 }; + size_t target_pos; + unsigned long checksum; + int ret; + ssize_t head_size = DBMDX_AMODEL_HEADER_SIZE; + size_t gram_size, net_size; + u32 gram_addr = 0x1; + u32 net_addr = 0x2; + int i = 0; + + target_pos = 0; + + if (file_size < 4) { + dev_err(p->dev, "%s: File size is too small\n", __func__); + ret = -EINVAL; + goto out; + } + + /* Check if it is special file that contains all zeroes for loading + * dummy model + */ + for (i = 0; i < file_size; i++) + if (file_data[i]) + break; + + if (i == file_size) { + dev_info(p->dev, "%s: Detected svt dummy model file\n", + __func__); + return dbmdx_va_amodel_load_dummy_model(p, + 0x1, + amodel_buf, + amodel_size, + num_of_amodel_chunks, + amodel_chunks_size); + } + + /* File format is: + * 4 bytes net_size + net_data + 4 bytes gram_size + gram_data + */ + + /* The size is encoded in bytes */ + net_size = (size_t)(file_data[0] | (file_data[1]<<8) | + (file_data[2]<<16) | (file_data[3]<<24)); + + /* File size should be at least: + * net_data_size + 4 bytes net_size + 4 bytes gram_size + */ + if (net_size > (file_size - 8)) { + dev_err(p->dev, "%s: Net Encoded size > File size\n", __func__); + ret = -EINVAL; + goto out; + } + + gram_size = (size_t)(file_data[net_size+4] | + (file_data[net_size+5]<<8) | + (file_data[net_size+6]<<16) | + (file_data[net_size+7]<<24)); + + /* File size should be at least: + * gram_data_size + net_data_size + 4 bytes net_size + 4 bytes gram_size + */ + if ((net_size + gram_size + 8) > file_size) { + dev_err(p->dev, "%s: Encoded size > File size\n", __func__); + ret = -EINVAL; + goto out; + } + + if (net_size + gram_size + + DBMDX_AMODEL_HEADER_SIZE*2 > MAX_AMODEL_SIZE) { + dev_err(p->dev, + "%s: Amodel exceeds max amodel size %zd>%d\n", + __func__, + net_size + gram_size + + DBMDX_AMODEL_HEADER_SIZE*2, MAX_AMODEL_SIZE); + ret = -EINVAL; + goto out; + } + + *num_of_amodel_chunks = 2; + + head[0] = 0x0; + head[1] = 0x0; + head[2] = 0x5A; + head[3] = 0x02; + head[4] = (gram_size/2) & 0xff; + head[5] = ((gram_size/2) >> 8) & 0xff; + head[6] = ((gram_size/2) >> 16) & 0xff; + head[7] = ((gram_size/2) >> 24) & 0xff; + head[8] = (gram_addr) & 0xff; + head[9] = ((gram_addr) >> 8) & 0xff; + head[10] = ((gram_addr) >> 16) & 0xff; + head[11] = ((gram_addr) >> 24) & 0xff; + + memcpy(amodel_buf + target_pos, head, head_size); + + target_pos += head_size; + + memcpy(amodel_buf + target_pos, file_data + net_size + 8, gram_size); + + target_pos += gram_size; + + head[0] = 0x0; + head[1] = 0x0; + head[2] = 0x5A; + head[3] = 0x02; + head[4] = (net_size/2) & 0xff; + head[5] = ((net_size/2) >> 8) & 0xff; + head[6] = ((net_size/2) >> 16) & 0xff; + head[7] = ((net_size/2) >> 24) & 0xff; + head[8] = (net_addr) & 0xff; + head[9] = ((net_addr) >> 8) & 0xff; + head[10] = ((net_addr) >> 16) & 0xff; + head[11] = ((net_addr) >> 24) & 0xff; + + memcpy(amodel_buf + target_pos, head, head_size); + + target_pos += head_size; + + memcpy(amodel_buf + target_pos, file_data + 4, net_size); + + target_pos += net_size; + + amodel_chunks_size[0] = gram_size; + amodel_chunks_size[1] = net_size; + + ret = dbmdx_calc_amodel_checksum(p, + (char *)amodel_buf, + target_pos, + &checksum); + if (ret) { + dev_err(p->dev, "%s: failed to calculate Amodel checksum\n", + __func__); + ret = -EINVAL; + goto out; + } + + *(unsigned long *)(amodel_buf + target_pos) = checksum; + + *amodel_size = (ssize_t)(target_pos + 4); + + ret = *amodel_size; + +out: + return ret; +} + +static int dbmdx_acoustic_model_build(struct dbmdx_private *p, + int num_of_amodel_files, + const u8 **amodel_files_data, + ssize_t *amodel_files_size, + u32 gram_addr, + char *amodel_buf, + ssize_t *amodel_size, + int *num_of_amodel_chunks, + ssize_t *amodel_chunks_size) +{ + if (p->pdata->amodel_options & DBMDX_AMODEL_INCLUDES_HEADERS) { + if (p->pdata->amodel_options & DBMDX_AMODEL_SVT_ENCODING) + return + dbmdx_acoustic_model_build_from_svt_multichunk_file(p, + amodel_files_data[0], + amodel_files_size[0], + amodel_buf, + amodel_size, + num_of_amodel_chunks, + amodel_chunks_size); + else + return + dbmdx_acoustic_model_build_from_multichunk_file(p, + amodel_files_data[0], + amodel_files_size[0], + amodel_buf, + amodel_size, + num_of_amodel_chunks, + amodel_chunks_size); + + } else { + if (p->pdata->amodel_options & + DBMDX_AMODEL_SINGLE_FILE_NO_HEADER) { + *num_of_amodel_chunks = 1; + amodel_chunks_size[0] = amodel_files_size[0]; + return dbmdx_acoustic_model_build_single_no_headers( + p, + amodel_files_data[0], + amodel_files_size[0], + gram_addr, + amodel_buf, + amodel_size); + } else { + *num_of_amodel_chunks = 2; + amodel_chunks_size[0] = amodel_files_size[0]; + amodel_chunks_size[1] = amodel_files_size[1]; + return dbmdx_acoustic_model_build_gram_net_no_headers( + p, + amodel_files_data[0], + amodel_files_size[0], + gram_addr, + amodel_files_data[1], + amodel_files_size[1], + amodel_buf, + amodel_size); + } + } + +} + +#if IS_ENABLED(EXTERNAL_SOC_AMODEL_LOADING_ENABLED) +static int dbmdx_acoustic_model_build_from_external(struct dbmdx_private *p, + const u8 *amodel_data, + unsigned int size) +{ + enum dbmdx_load_amodel_mode amode; + int cur_val; + int amodel_options; + int num_of_amodel_files; + const u8 *files_data[DBMDX_AMODEL_MAX_CHUNKS]; + ssize_t amodel_files_size[DBMDX_AMODEL_MAX_CHUNKS]; + int chunk_idx; + size_t off = 0; + struct amodel_info *cur_amodel = NULL; + unsigned int cur_amodel_options; + int ret = 0; + + if (!p) + return -EAGAIN; + + cur_amodel_options = p->pdata->amodel_options; + cur_val = amodel_data[0]; + off += 1; + + if (cur_val > LOAD_AMODEL_MAX) { + dev_err(p->dev, "%s: invalid loading mode %d\n", __func__, + cur_val); + ret = -EINVAL; + goto out; + } + + amode = (enum dbmdx_load_amodel_mode)cur_val; + dev_dbg(p->dev, "%s: Loading mode %d (%d)\n", __func__, + cur_val, amode); + + amodel_options = amodel_data[off]; + off += 1; + dev_dbg(p->dev, "%s: Amodel options %d\n", __func__, amodel_options); + + num_of_amodel_files = amodel_data[off]; + off += 1; + + dev_dbg(p->dev, "%s: Num Of Amodel files %d\n", __func__, + num_of_amodel_files); + + for (chunk_idx = 0; chunk_idx < num_of_amodel_files; chunk_idx++) + files_data[chunk_idx] = NULL; + + for (chunk_idx = 0; chunk_idx < num_of_amodel_files; chunk_idx++) { + + /* The size is encoded in bytes */ + amodel_files_size[chunk_idx] = (ssize_t)(amodel_data[off] | + (amodel_data[off+1]<<8) | + (amodel_data[off+2]<<16) | + (amodel_data[off+3]<<24)); + off += 4; + dev_dbg(p->dev, "%s: Chunk size %d\n", __func__, + (int)(amodel_files_size[chunk_idx])); + + /* File size should be at least: + * net_data_size + 4 bytes net_size + 4 bytes gram_size + */ + if (amodel_files_size[chunk_idx] > (size - off)) { + dev_err(p->dev, "%s: Chunk size exceeds buffer size\n", + __func__); + ret = -EINVAL; + goto out; + } + + if (amodel_files_size[chunk_idx] == 0) { + dev_warn(p->dev, "%s Chunk size is 0. Ignore...\n", + __func__); + ret = -ENOENT; + goto out; + } + + files_data[chunk_idx] = &(amodel_data[off]); + off += amodel_files_size[chunk_idx]; + + dev_dbg(p->dev, "%s Chunk #%d size=%zu bytes\n", + __func__, chunk_idx, amodel_files_size[chunk_idx]); + } + + if (amode == LOAD_AMODEL_PRIMARY) { + cur_amodel = &(p->primary_amodel); + p->pdata->amodel_options = amodel_options; + } else if (amode == LOAD_AMODEL_2NDARY) { + cur_amodel = &(p->secondary_amodel); + p->pdata->amodel_options = amodel_options; + } +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + else if (amode == LOAD_AMODEL_OKG) { + cur_amodel = &(p->okg_amodel); + p->pdata->amodel_options = DBMDX_AMODEL_INCLUDES_HEADERS; + } +#endif + + if (cur_amodel == NULL) { + dev_err(p->dev, "%s: amodel loading mode is not supported\n", + __func__); + ret = -EINVAL; + goto out; + } + + if (cur_amodel->amodel_buf == NULL) { + cur_amodel->amodel_buf = vmalloc(MAX_AMODEL_SIZE); + if (!cur_amodel->amodel_buf) { + ret = -ENOMEM; + goto out; + } + } + + cur_amodel->amodel_loaded = false; + + ret = dbmdx_acoustic_model_build(p, + num_of_amodel_files, + files_data, + amodel_files_size, + 0x1, + cur_amodel->amodel_buf, + &cur_amodel->amodel_size, + &cur_amodel->num_of_amodel_chunks, + cur_amodel->amodel_chunks_size); + + p->pdata->amodel_options = cur_amodel_options; + + if (ret <= 0) { + dev_err(p->dev, "%s: amodel build failed: %d\n", + __func__, ret); + ret = -EIO; + goto out; + } + + ret = 0; + + cur_amodel->amodel_loaded = true; + + memcpy(&(cur_amodel->amodel_checksum), + &(cur_amodel->amodel_buf[cur_amodel->amodel_size - 4]), 4); + +out: + return ret; +} +#endif + +static void dbmdx_get_firmware_version(const char *data, size_t size, + char *buf, size_t buf_size) +{ + int i, j; + + buf[0] = 0; + i = size - 58; + if ((data[i] == 0x10) && (data[i+1] == 0x32) && + (data[i+2] == 0x1a) && (data[i+3] == 0xd2)) { + /* VQE FW */ + buf += snprintf(buf, buf_size, + "Product %X%X%X%X Ver V%X.%X.%X%X%X%X.%X%X", + /* PRODUCT */ + (int)(data[i+1]), (int)(data[i]), + (int)(data[i+3]), (int)(data[i+2]), + /* VERSION */ + (int)(data[i+5]), (int)(data[i+4]), + (int)(data[i+7]), (int)(data[i+6]), + (int)(data[i+9]), (int)(data[i+8]), + (int)(data[i+11]), (int)(data[i+10])); + + snprintf(buf, buf_size, + "Compiled at %c%c%c%c%c%c%c%c%c%c%c %c%c%c%c%c%c%c%c", + /* DATE */ + (int)(data[i+12]), (int)(data[i+14]), + (int)(data[i+16]), (int)(data[i+18]), + (int)(data[i+20]), (int)(data[i+22]), + (int)(data[i+24]), (int)(data[i+26]), + (int)(data[i+28]), (int)(data[i+30]), + (int)(data[i+32]), + /* TIME */ + (int)(data[i+36]), (int)(data[i+38]), + (int)(data[i+40]), (int) (data[i+42]), + (int)(data[i+44]), (int)(data[i+46]), + (int)(data[i+48]), (int)(data[i+50])); + } else { + /* VA FW */ + for (i = size - 13; i > 0; i--) { + if ((data[i] == 'v') && (data[i+2] == 'e') && + (data[i+4] == 'r') && (data[i+6] == 's') && + (data[i+8] == 'i') && (data[i+10] == 'o')) { + for (j = 0; i + j < size; j++) { + if (j == buf_size - 1) + break; + buf[j] = data[i]; + i += 2; + if (((buf[j] > 0) && (buf[j] < 32)) + || (buf[j] > 126)) + return; + if (buf[j] == 0) + buf[j] = ' '; + } + buf[j] = 0; + return; + } + } + } +} + +static int dbmdx_firmware_ready(const struct firmware *fw, + struct dbmdx_private *p) +{ + const u8 *fw_file_checksum; + char fw_version[200]; + int ret; + + if (!fw) { + dev_err(p->dev, "%s: firmware request failed\n", __func__); + return -EIO; + } + + if (fw->size <= 4) { + dev_err(p->dev, "%s: firmware size (%zu) invalid\n", + __func__, fw->size); + goto out_err; + } + + fw_file_checksum = &fw->data[fw->size - 4]; + + /* + * read firmware version from file, not sure if this is the same + * for VA and VQE firmware + */ + memset(fw_version, 0, 200); + dbmdx_get_firmware_version(fw->data, fw->size, fw_version, 200); + if (strlen(fw_version) > 15) + dev_info(p->dev, "%s: firmware: %s\n", __func__, fw_version); + + /* check if the chip interface is ready to boot */ + ret = p->chip->can_boot(p); + if (ret) + goto out_err; + + /* prepare boot if required */ + ret = p->chip->prepare_boot(p); + if (ret) + goto out_err; + + /* enable high speed clock for boot */ + p->clk_enable(p, DBMDX_CLK_MASTER); + + /* boot */ + ret = p->chip->boot(fw->data, fw->size, p, fw_file_checksum, 4, 1); + if (ret) + goto out_disable_hs_clk; + + /* disable high speed clock after boot */ + p->clk_disable(p, DBMDX_CLK_MASTER); + + /* finish boot if required */ + ret = p->chip->finish_boot(p); + if (ret) + goto out_err; + + ret = 0; + goto out; + +out_disable_hs_clk: + p->clk_disable(p, DBMDX_CLK_MASTER); +out_err: + dev_err(p->dev, "%s: firmware request failed\n", __func__); + ret = -EIO; +out: + return ret; +} + +int dbmdx_indirect_register_read(struct dbmdx_private *p, + u16 addr, u16 *presult) +{ + u16 val; + int ret = 0; + + + if (!p) + return -EAGAIN; + + dev_dbg(p->dev, "%s\n", __func__); + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + *presult = 0; + + if (p->active_fw == DBMDX_FW_VQE) + ret = dbmdx_send_cmd(p, + DBMDX_VQE_SET_INDIRECT_REG_ADDR_ACCESS_CMD | (u32)addr, + NULL); + else + ret = dbmdx_send_cmd(p, + DBMDX_VA_SET_PARAM_ADDR | (u32)addr, + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: set_param_addr error(1)\n", __func__); + ret = -EIO; + goto out; + } + + if (p->active_fw == DBMDX_FW_VQE) + ret = dbmdx_send_cmd(p, + DBMDX_VQE_GET_INDIRECT_REG_DATA_ACCESS_CMD, + &val); + else + ret = dbmdx_send_cmd(p, DBMDX_VA_GET_PARAM, &val); + + if (ret < 0) { + dev_err(p->dev, "%s: get param error\n", __func__); + ret = -EIO; + goto out; + } + + *presult = val; +out: + return ret; +} + +int dbmdx_indirect_register_write(struct dbmdx_private *p, + u16 addr, u16 val) +{ + int ret = 0; + + if (!p) + return -EAGAIN; + + dev_dbg(p->dev, "%s\n", __func__); + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + if (p->active_fw == DBMDX_FW_VQE) + ret = dbmdx_send_cmd(p, + DBMDX_VQE_SET_INDIRECT_REG_ADDR_ACCESS_CMD | (u32)addr, + NULL); + else + ret = dbmdx_send_cmd(p, + DBMDX_VA_SET_PARAM_ADDR | (u32)addr, + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: set_param_addr error(1)\n", __func__); + ret = -EIO; + goto out; + } + + if (p->active_fw == DBMDX_FW_VQE) + ret = dbmdx_send_cmd(p, + DBMDX_VQE_GET_INDIRECT_REG_DATA_ACCESS_CMD | (u32)val, + NULL); + else + ret = dbmdx_send_cmd(p, DBMDX_VA_SET_PARAM | (u32)val, NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: set param error\n", __func__); + ret = -EIO; + goto out; + } +out: + return ret; +} + +int dbmdx_io_register_read(struct dbmdx_private *p, + u32 addr, u32 *presult) +{ + u16 val; + u32 result; + int ret = 0; + + if (!p) + return -EAGAIN; + + dev_dbg(p->dev, "%s\n", __func__); + + *presult = 0; + + ret = dbmdx_send_cmd(p, DBMDX_VA_IO_PORT_ADDR_LO | (addr & 0xffff), + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: io_addr_read error(1)\n", __func__); + ret = -1; + goto out; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_IO_PORT_ADDR_HI | (addr >> 16), NULL); + if (ret < 0) { + dev_err(p->dev, "%s: io_addr_read error(2)\n", __func__); + ret = -1; + goto out; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_IO_PORT_VALUE_LO, &val); + if (ret < 0) { + dev_err(p->dev, "%s: get reg %u error\n", + __func__, DBMDX_VA_IO_PORT_VALUE_LO); + ret = -1; + goto out; + } + + result = (u32)(val & 0xffff); + + val = 0; + ret = dbmdx_send_cmd(p, DBMDX_VA_IO_PORT_VALUE_HI, &val); + if (ret < 0) { + dev_err(p->dev, "%s: get reg %u error\n", + __func__, DBMDX_VA_IO_PORT_VALUE_HI); + ret = -1; + goto out; + } + + result += ((u32)val << 16); + + *presult = result; + + dev_dbg(p->dev, "%s: addr=0x%08x, val = 0x%08x\n", + __func__, addr, result); + +out: + return ret; +} + +int dbmdx_io_register_write(struct dbmdx_private *p, + u32 addr, u32 value) +{ + int ret = 0; + + if (!p) + return -EAGAIN; + + dev_dbg(p->dev, "%s\n", __func__); + + ret = dbmdx_send_cmd(p, DBMDX_VA_IO_PORT_ADDR_LO | (addr & 0xffff), + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: io_addr_write error(1)\n", __func__); + ret = -1; + goto out; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_IO_PORT_ADDR_HI | (addr >> 16), NULL); + if (ret < 0) { + dev_err(p->dev, "%s: io_addr_write error(2)\n", __func__); + ret = -1; + goto out; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_IO_PORT_VALUE_LO | (value & 0xffff), + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: io_addr_write error(3)\n", __func__); + ret = -1; + goto out; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_IO_PORT_VALUE_HI | (value >> 16), + NULL); + if (ret < 0) { + dev_err(p->dev, "%s: io_addr_write error(4)\n", __func__); + ret = -1; + goto out; + } + + dev_dbg(p->dev, "%s: addr=0x%08x was set to 0x%08x\n", + __func__, addr, value); +out: + return ret; +} + +static int dbmdx_config_va_mode(struct dbmdx_private *p) +{ + unsigned int i; + int ret, val; + u16 fwver = 0xffff; + u16 cur_reg; + u16 cur_val; + u32 cur_mic_config; + + dev_dbg(p->dev, "%s\n", __func__); +#if IS_ENABLED(DBMDX_FW_BELOW_280) + if (p->va_debug_mode && (p->active_interface != DBMDX_INTERFACE_UART)) { + ret = dbmdx_send_cmd(p, DBMDX_VA_DEBUG_1 | 0x5, NULL); + if (ret < 0) { + dev_err(p->dev, "%s: failed to send cmd\n", __func__); + ret = -EIO; + goto out; + } + } +#endif + /* Ensure that wakeup line is not toggled during initial config */ + p->cur_wakeup_disabled = 1; + + ret = dbmdx_send_cmd(p, DBMDX_VA_FW_ID, &cur_val); + if (ret < 0) { + dev_err(p->dev, "%s: could not read Firmware ID\n", + __func__); + ret = -EIO; + goto out; + } + + dev_info(p->dev, "%s: Reported FW ID is: 0x%x\n", __func__, cur_val); + + usleep_range(DBMDX_USLEEP_BEFORE_INIT_CONFIG, + DBMDX_USLEEP_BEFORE_INIT_CONFIG + 1000); + + for (i = 0; i < p->pdata->va_cfg_values; i++) { + + cur_reg = (u16)((p->pdata->va_cfg_value[i] >> 16) & 0x0fff); + cur_val = (u16)((p->pdata->va_cfg_value[i]) & 0xffff); + + if (cur_reg == 0) + continue; + else if (cur_reg == DBMDX_VA_USLEEP_FLAG) { + usleep_range(cur_val, cur_val + 100); + continue; + } else if (cur_reg == DBMDX_VA_MSLEEP_FLAG) { + msleep(cur_val); + continue; + } +#if IS_ENABLED(DBMDX_FW_BELOW_280) + if (p->va_debug_mode && + (p->active_interface != DBMDX_INTERFACE_UART) && + (cur_reg == + (u16)((DBMDX_VA_HOST_INTERFACE_SUPPORT >> 16) & 0xff))) + continue; +#else + if ((p->va_debug_mode != DBMDX_DEBUG_MODE_OFF) && + (p->active_interface != DBMDX_INTERFACE_UART) && + (cur_reg == + (u16)((DBMDX_VA_HOST_INTERFACE_SUPPORT >> 16) & 0xff))) { + ret = dbmdx_send_cmd(p, + (p->pdata->va_cfg_value[i] | 0x1000), NULL); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to send cmd\n", __func__); + ret = -EIO; + goto out; + } + + if (!(p->va_debug_mode & DBMDX_DEBUG_MODE_FW_LOG)) { + ret = dbmdx_send_cmd(p, + DBMDX_VA_DEBUG_1 | 0x5, NULL); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to send cmd\n", + __func__); + ret = -EIO; + goto out; + } + } + + continue; + } +#endif + ret = dbmdx_send_cmd(p, p->pdata->va_cfg_value[i], NULL); + if (ret < 0) { + dev_err(p->dev, "%s: failed to send cmd\n", __func__); + ret = -EIO; + goto out; + } + } + + /* Give to PLL enough time for stabilization */ + msleep(DBMDX_MSLEEP_CONFIG_VA_MODE_REG); + + p->cur_wakeup_disabled = p->pdata->wakeup_disabled; + + p->chip->transport_enable(p, true); + + /* Set Backlog */ + ret = dbmdx_set_backlog_len(p, p->pdata->va_backlog_length); + + if (ret < 0) { + dev_err(p->dev, + "%s: could not set backlog history configuration\n", + __func__); + goto out; + } + + /* read firmware version */ + ret = dbmdx_send_cmd(p, DBMDX_VA_GET_FW_VER, &fwver); + if (ret < 0) { + dev_err(p->dev, "%s: could not read firmware version\n", + __func__); + goto out; + } + + /* Enusre that PCM rate will be reconfigured */ + p->current_pcm_rate = 0; + p->va_flags.microphones_enabled = false; + cur_mic_config = p->va_active_mic_config; + p->va_active_mic_config = DBMDX_MIC_MODE_DISABLE; + + /* Set pcm rate and configure microphones*/ + ret = dbmdx_set_pcm_rate(p, p->pdata->va_buffering_pcm_rate); + + p->va_active_mic_config = cur_mic_config; + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set pcm rate\n", __func__); + goto out; + } + + if (p->va_cur_analog_mic_analog_gain != 0x1000) { + + ret = dbmdx_send_cmd(p, + DBMDX_VA_ANALOG_MIC_GAIN | + (p->va_cur_analog_mic_analog_gain & 0xffff), + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: write 0x%x to 0x%x error\n", + __func__, p->va_cur_analog_mic_analog_gain, + DBMDX_VA_ANALOG_MIC_GAIN); + goto out; + } + } + + if (p->va_active_mic_config != DBMDX_MIC_MODE_ANALOG) + val = (int)p->va_cur_digital_mic_digital_gain; + else + val = (int)p->va_cur_analog_mic_digital_gain; + + if (val != 0x1000) { + ret = dbmdx_send_cmd(p, + DBMDX_VA_DIGITAL_GAIN | + (val & 0xffff), + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: write 0x%x to 0x%x error\n", + __func__, val, + DBMDX_VA_DIGITAL_GAIN); + goto out; + } + } + + ret = dbmdx_read_fw_vad_settings(p); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to read fw vad settings\n", + __func__); + goto out; + } +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + /* read fw register & set OKG algorithm enable/disable */ + p->va_flags.okg_a_model_downloaded_to_fw = 0; + p->va_flags.okg_a_model_enabled = true; +#endif + ret = dbmdx_verify_model_support(p); + if (ret < 0) { + dev_err(p->dev, "%s: failed to verify amodel support\n", + __func__); + goto out; + } + + ret = dbmdx_set_pcm_streaming_mode(p, + (u16)(p->pdata->pcm_streaming_mode)); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set pcm streaming mode\n", + __func__); + goto out; + } + + dev_info(p->dev, "%s: VA firmware 0x%x ready\n", __func__, fwver); + + ret = dbmdx_set_mode(p, DBMDX_IDLE); + if (ret < 0) { + dev_err(p->dev, "%s: could not set to idle\n", __func__); + goto out; + } + + ret = 0; +out: + return ret; +} + +static int dbmdx_va_firmware_ready(struct dbmdx_private *p) +{ + int ret; + + dev_dbg(p->dev, "%s\n", __func__); + + p->boot_mode = DBMDX_BOOT_MODE_NORMAL_BOOT; + + /* Ensure that wakeup line is not toggled during initial config */ + p->cur_wakeup_disabled = 1; + + /* Ensure that interface is enabled */ + p->chip->transport_enable(p, true); + + /* Boot VA chip */ + if (p->pdata->boot_options & DBMDX_BOOT_OPT_SEND_PREBOOT) { + + ret = dbmdx_switch_to_va_chip_interface(p, + DBMDX_PREBOOT_INTERFACE); + if (ret) { + dev_err(p->dev, + "%s Error switching to (VA) interface\n", + __func__); + goto out_fail; + } + + dbmdx_reset_sequence(p); + + msleep(DBMDX_MSLEEP_I2C_D2_AFTER_RESET_32K); + + /* preboot */ + ret = p->chip->write(p, p->va_preboot_fw->data, + p->va_preboot_fw->size); + + if (ret != p->va_preboot_fw->size) { + dev_err(p->dev, + "%s Error sending the Preboot FW (VA)\n", + __func__); + ret = -EIO; + goto out_fail; + } + + dev_err(p->dev, "%s Preboot was sent successfully (VA)\n", + __func__); + + p->boot_mode = DBMDX_BOOT_MODE_RESET_DISABLED; + } + + ret = dbmdx_switch_to_va_chip_interface(p, DBMDX_BOOT_INTERFACE); + if (ret) { + dev_err(p->dev, + "%s Error switching to (VA) BOOT interface\n", + __func__); + p->boot_mode = DBMDX_BOOT_MODE_NORMAL_BOOT; + goto out_fail; + } + + /* common boot */ + ret = dbmdx_firmware_ready(p->va_fw, p); + if (ret != 0) { + dev_err(p->dev, "%s: could not load VA firmware\n", __func__); + ret = -EIO; + goto out_fail; + } + + p->boot_mode = DBMDX_BOOT_MODE_NORMAL_BOOT; + + dbmdx_set_va_active(p); + + ret = dbmdx_switch_to_va_chip_interface(p, DBMDX_CMD_INTERFACE); + if (ret) { + dev_err(p->dev, + "%s Error switching to (VA) CMD interface\n", + __func__); + goto out_fail; + } + + ret = dbmdx_config_va_mode(p); + if (ret != 0) { + dev_err(p->dev, "%s: could not configure VA firmware\n", + __func__); + ret = -EIO; + goto out_fail; + } + + ret = p->chip->set_va_firmware_ready(p); + if (ret) { + dev_err(p->dev, "%s: could not set to ready VA firmware\n", + __func__); + ret = -EIO; + goto out_fail; + } + + return 0; +out_fail: + p->cur_wakeup_disabled = p->pdata->wakeup_disabled; + p->chip->transport_enable(p, false); + return ret; +} + +static int dbmdx_vqe_read_version(struct dbmdx_private *p, + struct vqe_fw_info *info) +{ + int ret; + + /* read firmware version */ + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_HOST_STATUS_CMD | + DBMDX_VQE_HOST_STATUS_CMD_PRODUCT_MAJOR_VER, + &info->major); + if (ret < 0) { + dev_err(p->dev, "%s: could not read firmware version\n", + __func__); + goto out; + } + + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_HOST_STATUS_CMD | + DBMDX_VQE_HOST_STATUS_CMD_PRODUCT_MINOR_VER, + &info->minor); + if (ret < 0) { + dev_err(p->dev, "%s: could not read firmware version\n", + __func__); + goto out; + } + + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_HOST_STATUS_CMD | + DBMDX_VQE_HOST_STATUS_CMD_FW_VER, + &info->version); + if (ret < 0) { + dev_err(p->dev, "%s: could not read firmware version\n", + __func__); + goto out; + } + + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_HOST_STATUS_CMD | + DBMDX_VQE_HOST_STATUS_CMD_PATCH_VER, + &info->patch); + if (ret < 0) { + dev_err(p->dev, "%s: could not read firmware version\n", + __func__); + goto out; + } + + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_HOST_STATUS_CMD | + DBMDX_VQE_HOST_STATUS_CMD_DEBUG_VER, + &info->debug); + if (ret < 0) { + dev_err(p->dev, "%s: could not read firmware version\n", + __func__); + goto out; + } + + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_HOST_STATUS_CMD | + DBMDX_VQE_HOST_STATUS_CMD_TUNING_VER, + &info->tuning); + if (ret < 0) { + dev_err(p->dev, "%s: could not read firmware version\n", + __func__); + goto out; + } + ret = 0; + +out: + return ret; + +} + + +static int dbmdx_vqe_get_version(struct dbmdx_private *p) +{ + int ret; + struct vqe_fw_info info; + + ret = dbmdx_vqe_read_version(p, &info); + if (ret) + goto out; + + dev_info(p->dev, "%s: firmware product major: 0x%x\n", + __func__, info.major); + dev_info(p->dev, "%s: firmware product minor: 0x%x\n", + __func__, info.minor); + dev_info(p->dev, "%s: firmware version: 0x%x\n", + __func__, info.version); + dev_info(p->dev, "%s: firmware patch version: 0x%x\n", + __func__, info.patch); + dev_info(p->dev, "%s: firmware debug version: 0x%x\n", + __func__, info.debug); + dev_info(p->dev, "%s: firmware tuning version: 0x%x\n", + __func__, info.tuning); +out: + return ret; +} + +static int dbmdx_config_vqe_mode(struct dbmdx_private *p) +{ + unsigned int i; + int ret; + + dev_dbg(p->dev, "%s\n", __func__); + + ret = dbmdx_vqe_alive(p); + if (ret != 0) { + dev_err(p->dev, "%s: VQE firmware not ready\n", __func__); + goto out; + } + + for (i = 0; i < p->pdata->vqe_cfg_values; i++) + (void)dbmdx_send_cmd(p, p->pdata->vqe_cfg_value[i], NULL); + + + ret = 0; + +out: + return ret; +} + +static int dbmdx_vqe_firmware_ready(struct dbmdx_private *p, + int vqe, int load_non_overlay) +{ + int ret; + + dev_dbg(p->dev, "%s: non-overlay: %d\n", __func__, load_non_overlay); + +#if IS_ENABLED(DBMDX_OVERLAY_BOOT_SUPPORTED) + /* check if non-overlay firmware is available */ + if (p->vqe_non_overlay_fw && load_non_overlay) { + ssize_t send; + + /* VA firmware must be active for this */ + if (p->active_fw != DBMDX_FW_VA) { + dev_err(p->dev, + "%s: VA firmware must be active for non-overlay loading\n", + __func__); + return -EIO; + } + /* change to high speed */ + ret = dbmdx_va_set_high_speed(p); + if (ret != 0) { + dev_err(p->dev, + "%s: could not change to high speed\n", + __func__); + return -EIO; + } + + msleep(DBMDX_MSLEEP_NON_OVERLAY_BOOT); + + /* restore AHB memory */ + ret = dbmdx_send_cmd(p, + DBMDX_VA_LOAD_NEW_ACUSTIC_MODEL | 2, + NULL); + if (ret != 0) { + dev_err(p->dev, + "%s: could not prepare non-overlay loading\n", + __func__); + return -EIO; + } + usleep_range(10000, 11000); + + /* check if firmware is still alive */ + ret = dbmdx_va_alive(p); + if (ret) + return ret; + + /* reset the chip */ + p->reset_sequence(p); + + msleep(DBMDX_MSLEEP_NON_OVERLAY_BOOT); + + /* send non-overlay part */ + send = dbmdx_send_data(p, + p->vqe_non_overlay_fw->data, + p->vqe_non_overlay_fw->size); + if (send != p->vqe_non_overlay_fw->size) { + dev_err(p->dev, + "%s: failed to send non-overlay VQE firmware: %zu\n", + __func__, + send); + return -EIO; + } + usleep_range(10000, 11000); + } +#endif + if (!vqe) + return 0; + + /* + * common boot + */ + ret = dbmdx_firmware_ready(p->vqe_fw, p); + if (ret != 0) { + dev_err(p->dev, "%s: could not load VQE firmware\n", + __func__); + return -EIO; + } + dbmdx_set_vqe_active(p); + + ret = p->chip->set_vqe_firmware_ready(p); + if (ret) { + dev_err(p->dev, "%s: could not set to ready VQE firmware\n", + __func__); + return -EIO; + } + + /* special setups for the VQE firmware */ + ret = dbmdx_config_vqe_mode(p); + if (ret != 0) { + dev_err(p->dev, "%s: could not configure VQE firmware\n", + __func__); + return -EIO; + } + + return 0; +} + +static int dbmdx_switch_to_va_firmware(struct dbmdx_private *p, bool do_reset) +{ + int ret = 0; + int retry = RETRY_COUNT; + + if (p->active_fw == DBMDX_FW_VA) + return 0; + + if (!p->pdata->feature_va) { + dev_err(p->dev, "%s: VA feature not enabled\n", __func__); + return -EINVAL; + } + + if (do_reset) + dbmdx_set_boot_active(p); + + dbmdx_set_power_mode(p, DBMDX_PM_BOOTING); + + dev_dbg(p->dev, "%s: switching to VA firmware\n", __func__); + + p->device_ready = false; + + while (retry--) { + ret = dbmdx_va_firmware_ready(p); + if (!ret) + break; + + dbmdx_set_boot_active(p); + } + + if (ret) + return ret; + + p->device_ready = true; + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + return 0; +} + +static int dbmdx_switch_to_vqe_firmware(struct dbmdx_private *p, bool do_reset) +{ + int ret; + + if (p->active_fw == DBMDX_FW_VQE) + return 0; + + if (!p->pdata->feature_vqe) { + dev_err(p->dev, "%s: VQE feature not enabled\n", __func__); + return -EINVAL; + } + if (do_reset) + dbmdx_set_boot_active(p); + + dbmdx_set_power_mode(p, DBMDX_PM_BOOTING); + + dev_dbg(p->dev, "%s: switching to VQE firmware\n", __func__); + + p->device_ready = false; + + ret = dbmdx_vqe_firmware_ready(p, 1, 0); + if (ret) + return ret; + + p->device_ready = true; + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + return 0; +} + +static int dbmdx_request_and_load_fw(struct dbmdx_private *p, + int va, int vqe, int vqe_non_overlay) +{ + int ret; + int retries = 15; + + dev_dbg(p->dev, "%s %s/%s\n", + __func__, va ? "VA" : "-", vqe ? "VQE" : "-"); + + p->lock(p); + + dbmdx_set_boot_active(p); + + if (va && p->va_fw) { + release_firmware(p->va_fw); + p->va_fw = NULL; + } + + if (va && p->va_preboot_fw) { + release_firmware(p->va_preboot_fw); + p->va_preboot_fw = NULL; + } + + if (vqe && p->vqe_fw) { + release_firmware(p->vqe_fw); + p->vqe_fw = NULL; + } + + if (p->vqe_non_overlay_fw && vqe_non_overlay) { + release_firmware(p->vqe_non_overlay_fw); + p->vqe_non_overlay_fw = NULL; + } + + ret = dbmdx_set_power_mode(p, DBMDX_PM_BOOTING); + if (ret != 0) { + dev_err(p->dev, "%s: could not change to DBMDX_PM_BOOTING\n", + __func__); + goto out; + } + + if (p->pdata->feature_va && va) { + /* request VA firmware */ + do { + dev_info(p->dev, "%s: request VA firmware - %s\n", + __func__, p->pdata->va_firmware_name); + ret = + request_firmware((const struct firmware **)&p->va_fw, + p->pdata->va_firmware_name, + p->dev); + if (ret != 0) { + dev_err(p->dev, + "%s: failed to request VA firmware\n", + __func__); + msleep(DBMDX_MSLEEP_REQUEST_FW_FAIL); + continue; + } + if (p->pdata->boot_options & + DBMDX_BOOT_OPT_SEND_PREBOOT) { + dev_info(p->dev, + "%s: request VA preboot firmware - %s\n", + __func__, + p->pdata->va_preboot_firmware_name); + + ret = request_firmware( + (const struct firmware **)&p->va_preboot_fw, + p->pdata->va_preboot_firmware_name, p->dev); + + if (ret != 0) { + dev_err(p->dev, + "%s: failed to request VA preboot fw\n", + __func__); + retries = 0; + break; + } + } + break; + } while (--retries); + + if (retries == 0) { + dev_err(p->dev, "%s: failed to request VA firmware\n", + __func__); + ret = -EIO; + goto out; + } + + } + + if (p->pdata->feature_vqe && vqe) { + /* request VQE firmware */ + do { + + dev_info(p->dev, "%s: request VQE firmware - %s\n", + __func__, p->pdata->vqe_firmware_name); + ret = + request_firmware((const struct firmware **)&p->vqe_fw, + p->pdata->vqe_firmware_name, + p->dev); + if (ret != 0) { + dev_err(p->dev, + "%s: failed to request VQE firmware\n", + __func__); + msleep(DBMDX_MSLEEP_REQUEST_FW_FAIL); + continue; + } + break; + } while (--retries); + + if (retries == 0) { + dev_err(p->dev, "%s: failed to request VQE firmware\n", + __func__); + ret = -EIO; + goto out; + } + + if (p->pdata->feature_fw_overlay) { + dev_info(p->dev, + "%s: request VQE non-overlay firmware - %s\n", + __func__, + p->pdata->vqe_non_overlay_firmware_name); + ret = request_firmware( + (const struct firmware **)&p->vqe_non_overlay_fw, + p->pdata->vqe_non_overlay_firmware_name, + p->dev); + if (ret != 0) { + dev_err(p->dev, + "%s: failed to request VQE non-overlay firmware\n", + __func__); + ret = -EIO; + goto out_err; + } + } + } + + if (p->pdata->feature_vqe && (vqe || vqe_non_overlay)) { + ret = dbmdx_switch_to_vqe_firmware(p, 1); + if (ret != 0) { + dev_err(p->dev, "%s: failed to boot VQE firmware\n", + __func__); + ret = -EIO; + goto out_err; + } + dbmdx_vqe_get_version(p); + } else if (p->pdata->feature_va && va) { + ret = dbmdx_switch_to_va_chip_interface(p, + DBMDX_BOOT_INTERFACE); + if (ret) { + dev_err(p->dev, + "%s Error switching to (VA) BOOT interface\n", + __func__); + ret = -EIO; + goto out_err; + } + + ret = dbmdx_switch_to_va_firmware(p, 1); + if (ret != 0) { + dev_err(p->dev, "%s: failed to boot VA firmware\n", + __func__); + ret = -EIO; + goto out_err; + } + } + /* fall asleep by default after boot */ + ret = dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + if (ret != 0) { + dev_err(p->dev, + "%s: could not change to DBMDX_PM_FALLING_ASLEEP\n", + __func__); + goto out_err; + } + p->device_ready = true; + ret = 0; + goto out; + +out_err: + if (p->vqe_fw) { + release_firmware(p->vqe_fw); + p->vqe_fw = NULL; + } + if (p->vqe_non_overlay_fw) { + release_firmware(p->vqe_non_overlay_fw); + p->vqe_non_overlay_fw = NULL; + } + if (p->va_fw) { + release_firmware(p->va_fw); + p->va_fw = NULL; + } +out: + p->unlock(p); + return ret; +} + +/* ------------------------------------------------------------------------ + * sysfs attributes + * ------------------------------------------------------------------------ + */ +static ssize_t dbmdx_reg_show(struct device *dev, u32 command, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + u16 val = 0; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + dev_dbg(p->dev, "%s: get reg %x\n", __func__, command); + + if ((p->active_fw == DBMDX_FW_VQE) && (command & DBMDX_VA_CMD_MASK)) { + dev_err(p->dev, "%s: VA mode is not active\n", __func__); + return -ENODEV; + } + + if ((p->active_fw == DBMDX_FW_VA) && !(command & DBMDX_VA_CMD_MASK)) { + dev_err(p->dev, "%s: VQE mode is not active\n", __func__); + return -ENODEV; + } + + p->lock(p); + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + ret = dbmdx_send_cmd(p, command, &val); + if (ret < 0) { + dev_err(p->dev, "%s: get reg %x error\n", + __func__, command); + goto out_unlock; + } + + if (command == DBMDX_VA_AUDIO_HISTORY) + val = val & 0x0fff; + + ret = snprintf(buf, PAGE_SIZE, "0x%x\n", val); + +out_unlock: + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + + p->unlock(p); + return ret; +} + +static ssize_t dbmdx_reg_show_long(struct device *dev, + u32 command, u32 command1, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + u16 val = 0; + u32 result; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + p->lock(p); + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + ret = dbmdx_send_cmd(p, command1, &val); + if (ret < 0) { + dev_err(p->dev, "%s: get reg %u error\n", + __func__, command); + goto out_unlock; + } + + result = (u32)(val & 0xffff); + dev_dbg(p->dev, "%s: val = 0x%08x\n", __func__, result); + + val = 0; + ret = dbmdx_send_cmd(p, command, &val); + if (ret < 0) { + dev_err(p->dev, "%s: get reg %u error\n", + __func__, command1); + goto out_unlock; + } + + result += ((u32)val << 16); + dev_dbg(p->dev, "%s: val = 0x%08x\n", __func__, result); + + ret = snprintf(buf, PAGE_SIZE, "0x%x\n", result); + +out_unlock: + + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + + p->unlock(p); + return ret; +} + +static ssize_t dbmdx_reg_store(struct device *dev, u32 command, + struct device_attribute *attr, + const char *buf, size_t size, int fw) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret = 0; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + p->lock(p); + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + if (fw != p->active_fw) { + if (fw == DBMDX_FW_VA) + ret = dbmdx_switch_to_va_firmware(p, 0); + if (fw == DBMDX_FW_VQE) + ret = dbmdx_switch_to_vqe_firmware(p, 0); + if (ret) + goto out_unlock; + } + + if (p->active_fw == DBMDX_FW_VA) { + if (command == DBMDX_VA_OPR_MODE) { + if (val == 1) { + /* default detection mode - VT, i.e. PHRASE */ + p->va_detection_mode = DETECTION_MODE_PHRASE; + ret = dbmdx_trigger_detection(p); + } else + ret = dbmdx_set_mode(p, val); + if (ret) + size = ret; + + if ((val == 0 || val == 6) && + p->va_flags.pcm_streaming_active) { + + p->unlock(p); + ret = dbmdx_suspend_pcm_streaming_work(p); + if (ret < 0) + dev_err(p->dev, + "%s: Failed to suspend PCM Streaming Work\n", + __func__); + p->lock(p); + } + goto out_unlock; + } + + if (command == DBMDX_VA_AUDIO_HISTORY) { + ret = dbmdx_set_backlog_len(p, val); + if (ret < 0) { + dev_err(p->dev, "%s: set history error\n", + __func__); + size = ret; + } + goto out_pm_mode; + } + + ret = dbmdx_send_cmd(p, command | (u32)val, NULL); + if (ret < 0) { + dev_err(p->dev, "%s: set VA reg error\n", __func__); + size = ret; + goto out_pm_mode; + } + + if (command == DBMDX_VA_DIGITAL_GAIN) { + if (p->va_active_mic_config != DBMDX_MIC_MODE_ANALOG) + p->va_cur_digital_mic_digital_gain = (int)val; + else + p->va_cur_analog_mic_digital_gain = (int)val; + } else if (command == DBMDX_VA_ANALOG_MIC_GAIN) + p->va_cur_analog_mic_analog_gain = (int)val; + } + + if (p->active_fw == DBMDX_FW_VQE) { + ret = dbmdx_send_cmd(p, command | (u32)val, NULL); + if (ret < 0) { + dev_err(p->dev, "%s: set VQE reg error\n", __func__); + size = ret; + goto out_pm_mode; + } + } + +out_pm_mode: + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + +out_unlock: + p->unlock(p); + return size; +} + +static ssize_t dbmdx_reg_store_long(struct device *dev, u32 command, + u32 command1, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + dev_err(p->dev, "%s: val = %u\n", __func__, (int)val); + + p->lock(p); + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + ret = dbmdx_send_cmd(p, command1 | (val & 0xffff), NULL); + if (ret < 0) { + dev_err(p->dev, "%s: set reg error\n", __func__); + size = ret; + goto out_unlock; + } + + ret = dbmdx_send_cmd(p, command | (val >> 16), NULL); + if (ret < 0) { + dev_err(p->dev, "%s: set reg error\n", __func__); + size = ret; + goto out_unlock; + } + +out_unlock: + + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + + p->unlock(p); + return size; +} + +static ssize_t dbmdx_fw_ver_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + ssize_t off = 0; + int ret; + struct vqe_fw_info info; + + if (!p) + return -EAGAIN; + + if (p->active_fw == DBMDX_FW_VQE) { + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + p->lock(p); + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + ret = dbmdx_vqe_read_version(p, &info); + + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + + p->unlock(p); + + if (ret) + return snprintf(buf, PAGE_SIZE, + "error reading firmware info\n"); + + off += snprintf(buf + off, PAGE_SIZE - off, + "%s version information\n", + dbmdx_fw_type_to_str(p->active_fw)); + off += snprintf(buf + off, PAGE_SIZE - off, + "===============================\n"); + off += snprintf(buf + off, PAGE_SIZE - off, + "product major: 0x%x\n", info.major); + off += snprintf(buf + off, PAGE_SIZE - off, + "product minor: 0x%x\n", info.minor); + off += snprintf(buf + off, PAGE_SIZE - off, + "version: 0x%x\n", info.version); + off += snprintf(buf + off, PAGE_SIZE - off, + "patch version: 0x%x\n", info.patch); + off += snprintf(buf + off, PAGE_SIZE - off, + "debug version: 0x%x\n", info.debug); + off += snprintf(buf + off, PAGE_SIZE - off, + "tuning version: 0x%x\n", info.tuning); + return off; + } else if (p->pdata->feature_va && p->active_fw == DBMDX_FW_VA) + return dbmdx_reg_show(dev, DBMDX_VA_GET_FW_VER, attr, buf); + + return snprintf(buf, PAGE_SIZE, + "Unknown firmware (%d) loaded\n", p->active_fw); +} + +static ssize_t dbmdx_va_opmode_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return dbmdx_reg_show(dev, DBMDX_VA_OPR_MODE, attr, buf); +} + +static ssize_t dbmdx_opr_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return dbmdx_reg_store(dev, DBMDX_VA_OPR_MODE, attr, + buf, size, DBMDX_FW_VA); +} + +static ssize_t dbmdx_va_clockcfg_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return dbmdx_reg_show(dev, DBMDX_VA_CLK_CFG, attr, buf); +} + +static ssize_t dbmdx_va_clockcfg_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return dbmdx_reg_store(dev, DBMDX_VA_CLK_CFG, attr, + buf, size, DBMDX_FW_VA); +} + + +static ssize_t dbmdx_reboot_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int va = 0; + int vqe = 0; + int non_overlay = 0; + int shutdown = 0; + int va_resume = 0; + int va_debug = DBMDX_DEBUG_MODE_OFF; + int ret = 0; + + if (!strncmp(buf, "shutdown", min_t(int, size, 8))) + shutdown = 1; + else if (!strncmp(buf, "va_resume", min_t(int, size, 8))) { + va = 1; + va_resume = 1; + } else if (!strncmp(buf, "va_debug", min_t(int, size, 7))) { + va = 1; + va_debug = (DBMDX_DEBUG_MODE_RECORD | DBMDX_DEBUG_MODE_FW_LOG); + } else if (!strncmp(buf, "va_record", min_t(int, size, 9))) { + va = 1; + va_debug = DBMDX_DEBUG_MODE_RECORD; + } else if (!strncmp(buf, "va", min_t(int, size, 2))) + va = 1; + else if (!strncmp(buf, "vqe", min_t(int, size, 3))) + vqe = 1; + else if (!strncmp(buf, "help", min_t(int, size, 4))) { + dev_info(p->dev, + "%s: Commands: shutdown | va | va_resume | va_debug | vqe | help\n", + __func__); + return size; + } + + if (shutdown) { + dev_info(p->dev, "%s: Shutting down DBMDX...\n", __func__); + ret = dbmdx_shutdown(p); + if (ret != 0) { + dev_err(p->dev, "%s: Error shutting down DBMDX\n", + __func__); + return -EIO; + } + dev_info(p->dev, "%s: DBMDX was shut down\n", __func__); + return size; + } + + if (!va && !vqe) { + dev_warn(p->dev, "%s: not valid mode requested: %s\n", + __func__, buf); + return size; + } + + if (va && !p->pdata->feature_va) { + dev_dbg(p->dev, "%s: VA feature not enabled\n", __func__); + va = 0; + } + + if (vqe && !p->pdata->feature_vqe) { + dev_dbg(p->dev, "%s: VQE feature not enabled\n", __func__); + vqe = 0; + } + + if (va_resume) { + if (p->active_fw == DBMDX_FW_POWER_OFF_VA) { + dev_info(p->dev, "%s: DBMDX Resume Start\n", __func__); + ret = dbmdx_perform_recovery(p); + if (ret) { + dev_err(p->dev, "%s: DBMDX resume failed\n", + __func__); + return -EIO; + } + dev_info(p->dev, "%s: Resume Done\n", __func__); + return size; + } + } + + dev_info(p->dev, "%s: Reboot Start\n", __func__); + + /* + * if VQE needs to be loaded and not VA but both features are enabled + * the VA firmware needs to be loaded first in order to load the non + * overlay part + */ + if (!va && vqe && + (p->pdata->feature_va && p->pdata->feature_vqe && + p->pdata->feature_fw_overlay)) { + va = 1; + non_overlay = 1; + } + + if (va && !vqe && + (p->pdata->feature_va && p->pdata->feature_vqe && + p->pdata->feature_fw_overlay)) + non_overlay = 1; + + /* flush pending buffering work if any */ + p->va_flags.buffering = 0; + flush_work(&p->sv_work); + p->va_flags.pcm_worker_active = 0; + flush_work(&p->pcm_streaming_work); + + p->wakeup_release(p); + + p->va_debug_mode = va_debug; + + ret = dbmdx_request_and_load_fw(p, va, vqe, non_overlay); + if (ret != 0) + return -EIO; + + return size; +} + +static ssize_t dbmdx_va_debug_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret = -EINVAL; + + if (!strncmp(buf, "uart_dbg", min_t(int, size, 8))) + ret = dbmdx_set_fw_debug_mode(p, FW_DEBUG_OUTPUT_UART); + else if (!strncmp(buf, "uart_record", min_t(int, size, 11))) + ret = dbmdx_set_fw_debug_mode(p, FW_DEBUG_RECORD_NO_FW_LOG); + else if (!strncmp(buf, "disable_dbg", min_t(int, size, 11))) + ret = dbmdx_set_fw_debug_mode(p, FW_DEBUG_OUTPUT_NONE); + else if (!strncmp(buf, "mic_disable_on", min_t(int, size, 14))) { + p->mic_disabling_blocked = false; + ret = 0; + } else if (!strncmp(buf, "mic_disable_off", min_t(int, size, 15))) { + p->mic_disabling_blocked = true; + ret = 0; + } else if (!strncmp(buf, "pm_suspend", min_t(int, size, 10))) { + if (p->chip->suspend) + p->chip->suspend(p); + ret = 0; + } else if (!strncmp(buf, "pm_resume", min_t(int, size, 9))) { + if (p->chip->resume) + p->chip->resume(p); + ret = 0; + } else if (!strncmp(buf, "disable_sleep", min_t(int, size, 13))) { + p->sleep_disabled = true; + ret = 0; + } else if (!strncmp(buf, "enable_sleep", min_t(int, size, 12))) { + p->sleep_disabled = false; + ret = 0; + } else if (!strncmp(buf, "test_recovery1", min_t(int, size, 14))) { + p->va_flags.va_debug_val1 = 1; + ret = 0; + } else if (!strncmp(buf, "test_recovery2", min_t(int, size, 14))) { + p->va_flags.va_debug_val1 = 2; + ret = 0; + } else if (!strncmp(buf, "test_recovery3", min_t(int, size, 14))) { + p->va_flags.va_debug_val1 = 3; + ret = 0; + } else if (!strncmp(buf, "help", min_t(int, size, 4))) { + dev_info(p->dev, + "%s: Commands: clk_output | uart_dbg | clk_uart_output | disable_dbg | pm_suspend | pm_resume | disable_sleep | enable_sleep | help\n", + __func__); + ret = 0; + } + + + if (ret) + return ret; + + return size; +} + +static ssize_t dbmdx_va_debug_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + int ret; + + ret = snprintf(buf, PAGE_SIZE, + "Supported Commands: [ clk_output | uart_dbg | clk_uart_output | disable_dbg | pm_suspend | pm_resume | disable_sleep | enable_sleep | mic_disable_on | mic_disable_off | help ]\n"); + + return ret; +} + +static ssize_t dbmdx_vqe_debug_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret = -EINVAL; + + if (!strncmp(buf, "disable_sleep", min_t(int, size, 13))) { + p->sleep_disabled = true; + ret = 0; + } else if (!strncmp(buf, "enable_sleep", min_t(int, size, 12))) { + p->sleep_disabled = false; + ret = 0; + } else if (!strncmp(buf, "help", min_t(int, size, 4))) { + dev_info(p->dev, + "%s: Commands: disable_sleep | enable_sleep | help\n", + __func__); + ret = 0; + } + + + if (ret) + return ret; + + return size; +} + +static ssize_t dbmdx_vqe_debug_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + int ret; + + ret = snprintf(buf, PAGE_SIZE, + "Supported Commands: [ disable_sleep | enable_sleep | help ]\n"); + + return ret; +} + +static ssize_t dbmdx_va_speed_cfg_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + struct dbmdx_platform_data *pdata; + char *str_p; + char *args = (char *)buf; + unsigned long val; + u32 index = 0; + u32 type = 0; + u32 new_value = 0; + bool index_set = false, type_set = false, value_set = false; + int i; + + int ret = -EINVAL; + + if (!p) + return -EAGAIN; + + pdata = p->pdata; + + while ((str_p = strsep(&args, " \t")) != NULL) { + + if (!*str_p) + continue; + + if (strncmp(str_p, "index=", 6) == 0) { + ret = kstrtoul((str_p+6), 0, &val); + if (ret) { + dev_err(p->dev, "%s: bad index\n", __func__); + ret = -EINVAL; + goto print_usage; + } else if (val > 2) { + dev_err(p->dev, "%s: index out of range: %d\n", + __func__, (int)val); + ret = -EINVAL; + goto print_usage; + } + index = (u32)val; + index_set = true; + continue; + } + if (strncmp(str_p, "type=", 5) == 0) { + if (strncmp(str_p+5, "cfg", 3) == 0) + type = 0; + else if (strncmp(str_p+5, "uart", 4) == 0) + type = 1; + else if (strncmp(str_p+5, "i2c", 3) == 0) + type = 2; + else if (strncmp(str_p+5, "spi", 3) == 0) + type = 3; + else { + dev_err(p->dev, "%s: invalid type\n", + __func__); + ret = -EINVAL; + goto print_usage; + } + type_set = true; + continue; + } + if (strncmp(str_p, "value=", 6) == 0) { + ret = kstrtoul((str_p+6), 0, &val); + if (ret) { + dev_err(p->dev, "%s: bad value\n", __func__); + ret = -EINVAL; + goto print_usage; + } + + new_value = (u32)val; + value_set = true; + continue; + } + } + + if (!index_set) { + dev_err(p->dev, "%s: index is not set\n", __func__); + ret = -EINVAL; + goto print_usage; + } else if (!type_set) { + dev_err(p->dev, "%s: type is not set\n", __func__); + ret = -EINVAL; + goto print_usage; + } else if (!value_set) { + dev_err(p->dev, "%s: value is not set\n", __func__); + ret = -EINVAL; + goto print_usage; + } + + p->lock(p); + + if (type == 0) { + p->pdata->va_speed_cfg[index].cfg = new_value; + dev_info(p->dev, "%s: va_speed_cfg[%u].cfg was set to %8.8x\n", + __func__, index, new_value); + } else if (type == 1) { + p->pdata->va_speed_cfg[index].uart_baud = new_value; + dev_info(p->dev, "%s: va_speed_cfg[%u].uart_baud was set to %u\n", + __func__, index, new_value); + } else if (type == 2) { + p->pdata->va_speed_cfg[index].i2c_rate = new_value; + dev_info(p->dev, "%s: va_speed_cfg[%u].i2c_rate was set to %u\n", + __func__, index, new_value); + } else if (type == 3) { + p->pdata->va_speed_cfg[index].spi_rate = new_value; + dev_info(p->dev, "%s: va_speed_cfg[%u].spi_rate was set to %u\n", + __func__, index, new_value); + } + + p->unlock(p); + + for (i = 0; i < DBMDX_VA_NR_OF_SPEEDS; i++) + dev_info(dev, "%s: VA speed cfg %8.8x: 0x%8.8x %u %u %u\n", + __func__, + i, + pdata->va_speed_cfg[i].cfg, + pdata->va_speed_cfg[i].uart_baud, + pdata->va_speed_cfg[i].i2c_rate, + pdata->va_speed_cfg[i].spi_rate); + + return size; +print_usage: + dev_info(p->dev, + "%s: Usage: index=[0/1/2] type=[cfg/uart/i2c/spi] value=newval\n", + __func__); + return ret; +} + +static ssize_t dbmdx_va_speed_cfg_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int off = 0; + struct dbmdx_platform_data *pdata; + int i; + + if (!p) + return -EAGAIN; + + pdata = p->pdata; + + for (i = 0; i < DBMDX_VA_NR_OF_SPEEDS; i++) + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA speed cfg %8.8x: 0x%8.8x %u %u %u\n", + i, + pdata->va_speed_cfg[i].cfg, + pdata->va_speed_cfg[i].uart_baud, + pdata->va_speed_cfg[i].i2c_rate, + pdata->va_speed_cfg[i].spi_rate); + + return off; +} + +static ssize_t dbmdx_va_cfg_values_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + struct dbmdx_platform_data *pdata; + char *str_p; + char *args = (char *)buf; + unsigned long val; + u32 index = 0; + u32 new_value = 0; + bool index_set = false, value_set = false; + int i; + + int ret = -EINVAL; + + if (!p) + return -EAGAIN; + + pdata = p->pdata; + + while ((str_p = strsep(&args, " \t")) != NULL) { + + if (!*str_p) + continue; + + if (strncmp(str_p, "index=", 6) == 0) { + ret = kstrtoul((str_p+6), 0, &val); + if (ret) { + dev_err(p->dev, "%s: bad index\n", __func__); + ret = -EINVAL; + goto print_usage; + } else if (val >= pdata->va_cfg_values) { + dev_err(p->dev, "%s: index out of range: %d\n", + __func__, (int)val); + ret = -EINVAL; + goto print_usage; + } + index = (u32)val; + index_set = true; + continue; + } + if (strncmp(str_p, "value=", 6) == 0) { + ret = kstrtoul((str_p+6), 0, &val); + if (ret) { + dev_err(p->dev, "%s: bad value\n", __func__); + ret = -EINVAL; + goto print_usage; + } + + new_value = (u32)val; + value_set = true; + continue; + } + } + + if (!index_set) { + dev_err(p->dev, "%s: index is not set\n", __func__); + ret = -EINVAL; + goto print_usage; + } else if (!value_set) { + dev_err(p->dev, "%s: value is not set\n", __func__); + ret = -EINVAL; + goto print_usage; + } + p->lock(p); + + p->pdata->va_cfg_value[index] = new_value; + + dev_info(p->dev, "%s: va_cfg_value[%u] was set to %u\n", + __func__, index, new_value); + + p->unlock(p); + + for (i = 0; i < pdata->va_cfg_values; i++) + dev_dbg(dev, "%s: VA cfg %8.8x: 0x%8.8x\n", + __func__, i, pdata->va_cfg_value[i]); + + return size; +print_usage: + dev_info(p->dev, + "%s: Usage: index=[0-%u] value=newval\n", + __func__, (u32)(pdata->va_cfg_values)); + return ret; +} + + +static ssize_t dbmdx_va_cfg_values_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int off = 0; + struct dbmdx_platform_data *pdata; + int i; + + if (!p) + return -EAGAIN; + + pdata = p->pdata; + + for (i = 0; i < pdata->va_cfg_values; i++) + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA cfg %8.8x: 0x%8.8x\n", + i, pdata->va_cfg_value[i]); + + return off; +} +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) +static ssize_t dbmdx_va_ns_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = snprintf(buf, PAGE_SIZE, "VA_NS enabled: %d\n", p->va_ns_enabled); + + return ret; +} + +static ssize_t dbmdx_va_ns_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + if (!p) + return -EAGAIN; + + if (val > 2) { + dev_err(p->dev, "%s: invalid value - supported values: [0/1]\n", + __func__); + return -EINVAL; + } + + p->va_ns_enabled = (bool)val; + + return size; +} + +static ssize_t dbmdx_va_ns_pcm_streaming_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = snprintf(buf, PAGE_SIZE, + "VA_NS processing on PCM Streaming enabled: %d\n", + p->va_ns_pcm_streaming_enabled); + + return ret; +} + +static ssize_t dbmdx_va_ns_pcm_streaming_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + if (!p) + return -EAGAIN; + + if (val > 2) { + dev_err(p->dev, "%s: invalid value - supported values: [0/1]\n", + __func__); + return -EINVAL; + } + + p->va_ns_pcm_streaming_enabled = (bool)val; + + return size; +} + +static ssize_t dbmdx_va_ns_cfg_values_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + struct dbmdx_platform_data *pdata; + char *str_p; + char *args = (char *)buf; + unsigned long val; + u32 index = 0; + u32 new_value = 0; + u32 cfg_index = 0; + bool cfg_index_set = false, index_set = false, value_set = false; + int i, j; + u32 *cur_cfg_arr; + + int ret = -EINVAL; + + if (!p) + return -EAGAIN; + + pdata = p->pdata; + + if (!(pdata->va_ns_supported)) { + dev_err(p->dev, "%s: VA_NS is not supported\n", __func__); + return -EINVAL; + } + + while ((str_p = strsep(&args, " \t")) != NULL) { + + if (!*str_p) + continue; + + if (strncmp(str_p, "cfg_index=", 10) == 0) { + ret = kstrtoul((str_p+10), 0, &val); + if (ret) { + dev_err(p->dev, "%s: bad index\n", __func__); + ret = -EINVAL; + goto print_usage; + } else if (val >= pdata->va_ns_num_of_configs) { + dev_err(p->dev, "%s: index out of range: %d\n", + __func__, (int)val); + ret = -EINVAL; + goto print_usage; + } + cfg_index = (u32)val; + cfg_index_set = true; + continue; + } + if (strncmp(str_p, "index=", 6) == 0) { + ret = kstrtoul((str_p+6), 0, &val); + if (ret) { + dev_err(p->dev, "%s: bad index\n", __func__); + ret = -EINVAL; + goto print_usage; + } else if (val >= pdata->va_ns_cfg_values) { + dev_err(p->dev, "%s: index out of range: %d\n", + __func__, (int)val); + ret = -EINVAL; + goto print_usage; + } + index = (u32)val; + index_set = true; + continue; + } + if (strncmp(str_p, "value=", 6) == 0) { + ret = kstrtoul((str_p+6), 0, &val); + if (ret) { + dev_err(p->dev, "%s: bad value\n", __func__); + ret = -EINVAL; + goto print_usage; + } + + new_value = (u32)val; + value_set = true; + continue; + } + } + + if (!cfg_index_set) { + dev_err(p->dev, "%s: config. index is not set\n", __func__); + ret = -EINVAL; + goto print_usage; + } else if (!index_set) { + dev_err(p->dev, "%s: index is not set\n", __func__); + ret = -EINVAL; + goto print_usage; + } else if (!value_set) { + dev_err(p->dev, "%s: value is not set\n", __func__); + ret = -EINVAL; + goto print_usage; + } + + p->lock(p); + + cur_cfg_arr = (u32 *)(&(pdata->va_ns_cfg_value[cfg_index* + pdata->va_ns_cfg_values])); + + cur_cfg_arr[index] = new_value; + + dev_info(p->dev, "%s: va_ns_cfg_value[%u][%u] was set to %u\n", + __func__, cfg_index, index, new_value); + + p->unlock(p); + + for (j = 0; j < pdata->va_ns_num_of_configs; j++) { + + dev_info(dev, "%s:\n===== VA_NS configuration #%d =====\n", + __func__, j); + + cur_cfg_arr = (u32 *)(&(pdata->va_ns_cfg_value[j* + pdata->va_ns_cfg_values])); + + for (i = 0; i < pdata->va_ns_cfg_values; i++) { + dev_dbg(dev, "%s:\tVA_NS cfg %8.8x: 0x%8.8x\n", + __func__, i, cur_cfg_arr[i]); + } + + } + + return size; +print_usage: + dev_info(p->dev, + "%s: Usage: cfg_index=[0-%u] index=[0-%u] value=newval\n", + __func__, + (u32)(pdata->va_ns_num_of_configs - 1), + (u32)(pdata->va_ns_cfg_values) - 1); + return ret; +} + + +static ssize_t dbmdx_va_ns_cfg_values_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int off = 0; + struct dbmdx_platform_data *pdata; + int i; + + if (!p) + return -EAGAIN; + + pdata = p->pdata; + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA_NS supported %d\n", pdata->va_ns_supported); + + if (pdata->va_ns_supported) { + int j; + u32 *cur_cfg_arr; + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA_NS enabled %d\n", p->va_ns_enabled); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA_NS on PCM Streaming enabled %d\n", + p->va_ns_pcm_streaming_enabled); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA_NS active cfg index %d\n", + p->va_ns_cfg_index); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tNumber of VA_NS Configs %d\n", + pdata->va_ns_num_of_configs); + + for (j = 0; j < pdata->va_ns_num_of_configs; j++) { + + off += snprintf(buf + off, PAGE_SIZE - off, + "\n\t===== VA_NS configuration #%d =====\n", j); + + cur_cfg_arr = (u32 *)(&(pdata->va_ns_cfg_value[j* + pdata->va_ns_cfg_values])); + + for (i = 0; i < pdata->va_ns_cfg_values; i++) + off += snprintf(buf + off, + PAGE_SIZE - off, + "\t\tVA_NS cfg %8.8x: 0x%8.8x\n", + i, cur_cfg_arr[i]); + } + } + + return off; +} +#endif + +static ssize_t dbmdx_va_mic_cfg_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + struct dbmdx_platform_data *pdata; + char *str_p; + char *args = (char *)buf; + unsigned long val; + u32 index = 0; + u32 new_value = 0; + bool index_set = false, value_set = false; + int i; + + int ret = -EINVAL; + + if (!p) + return -EAGAIN; + + pdata = p->pdata; + + while ((str_p = strsep(&args, " \t")) != NULL) { + + if (!*str_p) + continue; + + if (strncmp(str_p, "index=", 6) == 0) { + ret = kstrtoul((str_p+6), 0, &val); + if (ret) { + dev_err(p->dev, "%s: bad index\n", __func__); + ret = -EINVAL; + goto print_usage; + } else if (val > (VA_MIC_CONFIG_SIZE - 1)) { + dev_err(p->dev, "%s: index out of range: %d\n", + __func__, (int)val); + ret = -EINVAL; + goto print_usage; + } + index = (u32)val; + index_set = true; + continue; + } + if (strncmp(str_p, "value=", 6) == 0) { + ret = kstrtoul((str_p+6), 0, &val); + if (ret) { + dev_err(p->dev, "%s: bad value\n", __func__); + ret = -EINVAL; + goto print_usage; + } + + new_value = (u32)val; + value_set = true; + continue; + } + } + + if (!index_set) { + dev_err(p->dev, "%s: index is not set\n", __func__); + ret = -EINVAL; + goto print_usage; + } else if (!value_set) { + dev_err(p->dev, "%s: value is not set\n", __func__); + ret = -EINVAL; + goto print_usage; + } + p->lock(p); + + p->pdata->va_mic_config[index] = new_value; + + dev_info(p->dev, "%s: va_mic_config[%u] was set to %u\n", + __func__, index, new_value); + + p->unlock(p); + + for (i = 0; i < VA_MIC_CONFIG_SIZE; i++) + dev_dbg(dev, "%s: VA mic cfg %8.8x: 0x%8.8x\n", + __func__, i, pdata->va_mic_config[i]); + + return size; +print_usage: + dev_info(p->dev, + "%s: Usage: index=[0-%d] value=newval\n", + __func__, (VA_MIC_CONFIG_SIZE - 1)); + return ret; +} + + +static ssize_t dbmdx_va_mic_cfg_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int off = 0; + struct dbmdx_platform_data *pdata; + int i; + + if (!p) + return -EAGAIN; + + pdata = p->pdata; + + for (i = 0; i < VA_MIC_CONFIG_SIZE; i++) + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA mic cfg %8.8x: 0x%8.8x\n", + i, pdata->va_mic_config[i]); + + return off; +} + + +static ssize_t dbmdx_va_trigger_level_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return dbmdx_reg_show(dev, DBMDX_VA_SENS_TG_THRESHOLD, attr, buf); +} + +static ssize_t dbmdx_va_trigger_level_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return dbmdx_reg_store(dev, DBMDX_VA_SENS_TG_THRESHOLD, attr, + buf, size, DBMDX_FW_VA); +} + +static ssize_t dbmdx_va_verification_level_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return dbmdx_reg_show(dev, DBMDX_VA_SENS_VERIF_THRESHOLD, attr, buf); +} + +static ssize_t dbmdx_va_verification_level_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return dbmdx_reg_store(dev, DBMDX_VA_SENS_VERIF_THRESHOLD, attr, buf, + size, DBMDX_FW_VA); +} + +static ssize_t dbmdx_va_digital_gain_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return dbmdx_reg_show(dev, DBMDX_VA_DIGITAL_GAIN, attr, buf); +} + +static ssize_t dbmdx_va_digital_gain_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return dbmdx_reg_store(dev, DBMDX_VA_DIGITAL_GAIN, attr, + buf, size, DBMDX_FW_VA); +} + +static ssize_t dbmdx_io_addr_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return dbmdx_reg_show_long(dev, DBMDX_VA_IO_PORT_ADDR_HI, + DBMDX_VA_IO_PORT_ADDR_LO, attr, buf); +} + +static ssize_t dbmdx_io_addr_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return dbmdx_reg_store_long(dev, DBMDX_VA_IO_PORT_ADDR_HI, + DBMDX_VA_IO_PORT_ADDR_LO, attr, buf, size); +} + +static int dbmdx_set_sv_recognition_mode(struct dbmdx_private *p, + enum dbmdx_sv_recognition_mode mode) +{ + + u16 cur_val = 0; + + if (!p->sv_a_model_support) { + dev_warn(p->dev, "%s: SV model isn't supported.\n", + __func__); + return 0; + } + if ((p->va_detection_mode_custom_params != + DBMDX_NO_EXT_DETECTION_MODE_PARAMS) && + (mode != SV_RECOGNITION_MODE_DISABLED)) + cur_val = p->va_detection_mode_custom_params; + else if (mode == SV_RECOGNITION_MODE_VOICE_PHRASE_OR_CMD) + cur_val = 1; + else if (mode == SV_RECOGNITION_MODE_VOICE_ENERGY) + cur_val = 2; + + if (dbmdx_send_cmd(p, DBMDX_VA_SENS_RECOGNITION_MODE | cur_val, + NULL) < 0) { + dev_err(p->dev, + "%s: failed to set DBMDX_VA_SENS_RECOGNITION_MODE to %d\n", + __func__, cur_val); + return -EIO; + } + + p->va_flags.sv_recognition_mode = mode; + + dev_info(p->dev, "%s: SV amodel mode was set to %d\n", + __func__, cur_val); + + return 0; + +} + +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) +static int dbmdx_set_okg_recognition_mode(struct dbmdx_private *p, + enum dbmdx_okg_recognition_mode mode) +{ + u16 cur_val = 0; + + if (!p->okg_a_model_support) { + dev_warn(p->dev, "%s: OKG model isn't supported.\n", + __func__); + return 0; + } + if (!p->va_flags.okg_a_model_enabled && + mode == OKG_RECOGNITION_MODE_ENABLED) { + dev_warn(p->dev, "%s: OKG model is disabled.\n", + __func__); + return 0; + } + + if (mode == OKG_RECOGNITION_MODE_ENABLED) + cur_val = 1; + + if (dbmdx_send_cmd(p, DBMDX_VA_OKG_INTERFACE | cur_val, NULL) < 0) { + dev_err(p->dev, + "%s: failed to set DBMDX_VA_OKG_INTERFACE\n", + __func__); + return -EIO; + } + + p->va_flags.okg_recognition_mode = mode; + + dev_info(p->dev, "%s: OKG amodel enabled:\t%s\n", __func__, + (p->va_flags.okg_recognition_mode == + OKG_RECOGNITION_MODE_ENABLED) ? "Yes" : "No"); + + return 0; +} + +static ssize_t dbmdx_va_okg_amodel_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int off = 0; + + if (!p) + return -EAGAIN; + + off += snprintf(buf + off, PAGE_SIZE - off, "OKG fw supported:\t%s\n", + p->okg_a_model_support ? "Yes" : "No"); + off += snprintf(buf + off, PAGE_SIZE - off, "OKG amodel loaded:\t%s\n", + p->va_flags.okg_a_model_downloaded_to_fw ? + "Yes" : "No"); + off += snprintf(buf + off, PAGE_SIZE - off, "OKG amodel enable:\t%s\n", + p->va_flags.okg_a_model_enabled ? "Yes" : "No"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tOKG Recognition mode:\t\t%s\n", + p->va_flags.okg_recognition_mode == + OKG_RECOGNITION_MODE_ENABLED ? + "Enabled" : "Disabled"); + + return off; +} + +static ssize_t dbmdx_okg_amodel_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret = -EINVAL; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + if (!p->okg_a_model_support) { + dev_warn(p->dev, "%s: OKG model isn't supported: %s\n", + __func__, buf); + return -EINVAL; + } + + ret = kstrtol(buf, 0, &val); + if (ret) + return -EINVAL; + + if (!p->sv_a_model_support && !val) { + dev_warn(p->dev, + "%s: OKG is the only supported model, cannot disable\n", + __func__); + return -EINVAL; + } + + if (val == 0) { + + p->lock(p); + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + ret = dbmdx_set_okg_recognition_mode(p, + OKG_RECOGNITION_MODE_DISABLED); + + p->va_flags.okg_a_model_enabled = false; + + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + + p->unlock(p); + + } else if (val == 1) { + + p->lock(p); + + p->va_flags.okg_a_model_enabled = true; + + p->unlock(p); + + } else { + dev_warn(p->dev, "%s: illegal value: %s\n", + __func__, buf); + return -EINVAL; + } + + return size; +} + +static int dbmdx_va_amodel_okg_load_file(struct dbmdx_private *p, + const char *dbmdx_okg_name, + char *amodel_buf, + ssize_t *amodel_size, + int *num_of_amodel_chunks, + ssize_t *amodel_chunks_size) +{ + int ret; + struct firmware *va_okg_fw = NULL; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + if (!dbmdx_okg_name[0]) { + dev_err(p->dev, "%s: Unknown amodel file name\n", + __func__); + return -ENOENT; + } + + dev_dbg(p->dev, "%s: loading %s\n", __func__, dbmdx_okg_name); + + ret = request_firmware((const struct firmware **)&va_okg_fw, + dbmdx_okg_name, + p->dbmdx_dev); + if (ret < 0) { + dev_err(p->dev, "%s: failed to request VA OKG firmware(%d)\n", + __func__, ret); + return -ENOENT; + } + if (!va_okg_fw) { + dev_err(p->dev, "%s: VA OKG firmware is not available\n", + __func__); + return -EINVAL; + } + + dev_info(p->dev, "%s: OKG firmware requested\n", __func__); + + dev_dbg(p->dev, "%s OKG=%zu bytes\n", + __func__, va_okg_fw->size); + + if (!va_okg_fw->size) { + dev_warn(p->dev, "%s OKG size is 0. Ignore...\n", + __func__); + ret = -EIO; + goto release; + } + + if (va_okg_fw->size > MAX_AMODEL_SIZE) { + dev_err(p->dev, + "%s: model exceeds max size %zd>%d\n", + __func__, va_okg_fw->size, MAX_AMODEL_SIZE); + ret = -EINVAL; + goto release; + } + + ret = dbmdx_acoustic_model_build_from_multichunk_file(p, + va_okg_fw->data, + va_okg_fw->size, + amodel_buf, + amodel_size, + num_of_amodel_chunks, + amodel_chunks_size); + +release: + if (va_okg_fw) + release_firmware(va_okg_fw); + + return ret; +} + +static int dbmdx_va_amodel_okg_load(struct dbmdx_private *p, + const char *dbmdx_okg_name, + bool to_load_from_memory) +{ + int ret, ret2; + u16 load_result = 0; + struct amodel_info *cur_amodel = NULL; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + cur_amodel = &(p->okg_amodel); + + if (to_load_from_memory && !(p->okg_amodel.amodel_loaded)) { + + dev_err(p->dev, "%s: OKG model was not loaded to memory\n", + __func__); + return -EAGAIN; + } + + if (!to_load_from_memory) { + if (cur_amodel->amodel_buf == NULL) { + cur_amodel->amodel_buf = vmalloc(MAX_AMODEL_SIZE); + if (!cur_amodel->amodel_buf) + return -ENOMEM; + } + + ret = dbmdx_va_amodel_okg_load_file(p, + dbmdx_okg_name, + cur_amodel->amodel_buf, + &cur_amodel->amodel_size, + &cur_amodel->num_of_amodel_chunks, + cur_amodel->amodel_chunks_size); + if (ret < 0) { + dev_err(p->dev, "%s: failed to load OKG amodel(%d)\n", + __func__, ret); + ret = -EFAULT; + goto out; + } + + cur_amodel->amodel_loaded = true; + + memcpy(&(cur_amodel->amodel_checksum), + &(cur_amodel->amodel_buf[cur_amodel->amodel_size - 4]), + 4); + + } + + if (p->va_flags.okg_a_model_downloaded_to_fw) { + /* Check if loaded amodel checksum matches to the one loaded */ + ret = memcmp(&(p->va_flags.okg_amodel_checksum), + &(cur_amodel->amodel_checksum), 4); + if (!ret) { + dev_info(p->dev, + "%s: OKG model has been already loaded\n", + __func__); + return 0; + } + + dev_info(p->dev, + "%s: OKG model was changed and should be reloaded\n", + __func__); + } + + p->va_flags.okg_amodel_len = cur_amodel->amodel_size; + + p->device_ready = false; + + /* set chip to idle mode */ + ret = dbmdx_set_mode(p, DBMDX_IDLE); + if (ret) { + dev_err(p->dev, "%s: failed to set device to idle mode\n", + __func__); + ret = -EIO; + goto out; + } + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + /* prepare the chip interface for A-Model loading */ + ret = p->chip->prepare_amodel_loading(p); + if (ret != 0) { + dev_err(p->dev, "%s: failed to prepare A-Model loading\n", + __func__); + p->device_ready = true; + ret = -EIO; + goto out; + } + + p->va_flags.okg_a_model_downloaded_to_fw = 0; + + if (p->chip->load_amodel) + /* load A-Model and verify checksum */ + ret = p->chip->load_amodel(p, + cur_amodel->amodel_buf, + cur_amodel->amodel_size - 4, + cur_amodel->num_of_amodel_chunks, + cur_amodel->amodel_chunks_size, + &(cur_amodel->amodel_buf[cur_amodel->amodel_size - 4]), + 4, + LOAD_AMODEL_OKG_FW_CMD); + else + ret = dbmdx_va_amodel_send(p, + cur_amodel->amodel_buf, + cur_amodel->amodel_size - 4, + cur_amodel->num_of_amodel_chunks, + cur_amodel->amodel_chunks_size, + &(cur_amodel->amodel_buf[cur_amodel->amodel_size - 4]), + 4, + LOAD_AMODEL_OKG_FW_CMD); + + if (ret) { + dev_err(p->dev, "%s: sending amodel failed\n", + __func__); + ret = -EIO; + goto out_finish_loading; + } + + ret = dbmdx_va_alive(p); + if (ret) { + dev_err(p->dev, "%s: fw is dead\n", __func__); + ret = -EIO; + goto out_finish_loading; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_OKG_INTERFACE, &load_result); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to get okg loading module result\n", + __func__); + ret = -EIO; + goto out_finish_loading; + } + + load_result = (load_result & 0x0002) >> 1; + + if (!load_result) { + dev_err(p->dev, + "%s: OKG Module load result is wrong %d (expected 2)\n", + __func__, (int)load_result); + ret = -EIO; + goto out_finish_loading; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_OKG_INTERFACE | 1, NULL); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set okg fw to receive new amodel\n", + __func__); + ret = -EIO; + goto out_finish_loading; + } + + dev_info(p->dev, "%s: OKG acoustic model sent successfully\n", + __func__); + + p->va_flags.okg_a_model_downloaded_to_fw = 1; + + memcpy(&(p->va_flags.okg_amodel_checksum), + &(cur_amodel->amodel_checksum), 4); + +out_finish_loading: + /* finish A-Model loading */ + ret2 = p->chip->finish_amodel_loading(p); + if (ret2 != 0) + dev_err(p->dev, "%s: failed to finish A-Model loading\n", + __func__); + + p->device_ready = true; + +out: + return ret; +} +#endif /* DMBDX_OKG_AMODEL_SUPPORT */ + +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) +static int dbmdx_send_asrp_params_buf(struct dbmdx_private *p, + const void *data, + size_t size) +{ + int retry = RETRY_COUNT; + int ret; + ssize_t send_bytes; + + if (!p) + return -EAGAIN; + + dev_dbg(p->dev, "%s\n", __func__); + + while (retry--) { + + if (size == 0 || data == NULL) { + dev_err(p->dev, + "%s: Illegal size of asrp params file\n", + __func__); + retry = -1; + break; + } + + ret = dbmdx_send_cmd(p, + DBMDX_VA_LOAD_NEW_ACUSTIC_MODEL | 4, + NULL); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set fw to receive new asrp params\n", + __func__); + continue; + } + + dev_dbg(p->dev, "%s, size = %d\n", __func__, (int)size); + + dev_info(p->dev, + "%s: ---------> ASRP Params download start\n", + __func__); + + /* Send ASRP Data */ + send_bytes = p->chip->write(p, data, size); + if (send_bytes != size) { + dev_err(p->dev, + "%s: sending of Asrp params data failed\n", + __func__); + + ret = p->chip->send_cmd_boot(p, DBMDX_FIRMWARE_BOOT); + if (ret < 0) + dev_err(p->dev, + "%s: booting the firmware failed\n", + __func__); + + continue; + } + + dev_info(p->dev, + "%s: ---------> ASRP Params download done.\n", + __func__); + + break; + } + + /* no retries left, failed to load acoustic */ + if (retry < 0) { + dev_err(p->dev, "%s: failed to send ASRP Params\n", + __func__); + return -EIO; + } + + /* wait some time */ + msleep(DBMDX_MSLEEP_AFTER_LOAD_ASRP); + + return 0; +} + +static int dbmdx_load_asrp_params_file(struct dbmdx_private *p, + const char *dbmdx_asrp_name, + char *asrp_buf, + ssize_t *asrp_buf_size) +{ + int ret; + struct firmware *va_asrp_fw = NULL; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + if (!dbmdx_asrp_name[0]) { + dev_err(p->dev, "%s: Unknown ASRP Params file name\n", + __func__); + return -ENOENT; + } + + dev_dbg(p->dev, "%s: loading %s\n", __func__, dbmdx_asrp_name); + + ret = request_firmware((const struct firmware **)&va_asrp_fw, + dbmdx_asrp_name, + p->dbmdx_dev); + if (ret < 0) { + dev_err(p->dev, "%s: failed to request ASRP Params(%d)\n", + __func__, ret); + return -ENOENT; + } + if (!va_asrp_fw) { + dev_err(p->dev, "%s: ASRP Params is not available\n", + __func__); + return -EINVAL; + } + + dev_info(p->dev, "%s: ASRP Params requested\n", __func__); + + dev_dbg(p->dev, "%s ASRP=%zu bytes\n", + __func__, va_asrp_fw->size); + + if (!va_asrp_fw->size) { + dev_warn(p->dev, "%s ASRP size is 0. Ignore...\n", + __func__); + ret = -EIO; + goto release; + } + + if (va_asrp_fw->size > MAX_AMODEL_SIZE) { + dev_err(p->dev, + "%s: model exceeds max size %zd>%d\n", + __func__, va_asrp_fw->size, MAX_AMODEL_SIZE); + ret = -EINVAL; + goto release; + } + + memcpy(asrp_buf, va_asrp_fw->data, va_asrp_fw->size); + + *asrp_buf_size = va_asrp_fw->size; + +release: + if (va_asrp_fw) + release_firmware(va_asrp_fw); + + return ret; +} + + +static int dbmdx_va_load_asrp_params(struct dbmdx_private *p, + const char *dbmdx_asrp_name) +{ + int ret, ret2; + char *data_buf_asrp = NULL; + ssize_t asrp_bin_size = 0; + u16 val; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + dev_dbg(p->dev, "%s:\n", __func__); + + data_buf_asrp = vmalloc(MAX_AMODEL_SIZE); + if (!data_buf_asrp) + return -ENOMEM; + + ret = dbmdx_load_asrp_params_file(p, + dbmdx_asrp_name, + data_buf_asrp, + &asrp_bin_size); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to load ASRP amodel(%d)\n", + __func__, ret); + goto out_mem; + } + + p->device_ready = false; + + /* prepare the chip interface for A-Model loading */ + ret = p->chip->prepare_amodel_loading(p); + if (ret != 0) { + dev_err(p->dev, "%s: failed to prepare A-Model loading\n", + __func__); + p->device_ready = true; + goto out_mem; + } + + ret = dbmdx_send_asrp_params_buf(p, data_buf_asrp, asrp_bin_size); + + if (ret) { + dev_err(p->dev, "%s: sending ASRP params failed\n", + __func__); + ret = -EIO; + goto out_finish_loading; + } + + ret = dbmdx_va_alive(p); + if (ret) { + dev_err(p->dev, "%s: fw is dead\n", __func__); + ret = -EIO; + goto out_finish_loading; + } + + p->device_ready = true; + + ret = dbmdx_indirect_register_read(p, DBMDX_VA_ASRP_PARAM_SIZE, &val); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to read ASRP size after loading params\n", + __func__); + ret = -EIO; + goto out_finish_loading; + } + + if (val == 0 || val == 0xffff) { + dev_err(p->dev, + "%s: Reported ASRP params size is invalid: %d\n", + __func__, (int)val); + ret = -EIO; + goto out_finish_loading; + } + + ret = dbmdx_indirect_register_read(p, DBMDX_VA_ASRP_CONTROL, &val); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to read ASRP control register\n", + __func__); + ret = -EIO; + goto out_finish_loading; + } + + dev_info(p->dev, "%s: ASRP Control: 0x%x\n", __func__, val); + + dev_info(p->dev, "%s: ASRP Params sent successfully\n", + __func__); + +out_finish_loading: + /* finish A-Model loading */ + ret2 = p->chip->finish_amodel_loading(p); + if (ret2 != 0) + dev_err(p->dev, "%s: failed to finish A-Model loading\n", + __func__); + + p->device_ready = true; +out_mem: + vfree(data_buf_asrp); + return ret; +} + +static int dbmdx_configure_ns(struct dbmdx_private *p, int mode, bool enable) +{ + int ret = 0; + u16 cur_reg; + u16 cur_val; + u16 bypass_val = 0; + int i; + u32 *cur_cfg_arr; + bool to_load_asrp_fw = false; + bool to_set_idle_mode = false; + bool to_set_bypass = false; + int retry = 10; + + + if (!p) + return -EAGAIN; + + dev_dbg(p->dev, "%s: mode=%d, enable=%d\n", + __func__, mode, (int)enable); + + if (mode == DBMDX_IDLE && !(p->va_flags.va_ns_active)) { + dev_dbg(p->dev, "%s VA_NS is not active", __func__); + return 0; + } + + if (!enable) + bypass_val = 1; + + if (p->pdata->va_ns_num_of_configs <= VA_NS_CONFIG_MAX) { + dev_err(p->dev, "%s: NS Configuration Set is Incomplete", + __func__); + return -EINVAL; + } + + if (mode == DBMDX_IDLE) { + to_load_asrp_fw = false; + to_set_idle_mode = false; + to_set_bypass = false; + p->va_ns_cfg_index = VA_NS_CONFIG_DISABLE; + } else if (p->va_active_mic_config == DBMDX_MIC_MODE_ANALOG) { + to_set_idle_mode = true; + to_load_asrp_fw = false; + to_set_bypass = false; + p->va_ns_cfg_index = VA_NS_CONFIG_AMIC; + } else if (mode == DBMDX_STREAMING || mode == DBMDX_BUFFERING) { + + to_set_idle_mode = true; + to_set_bypass = true; + + if (p->va_ns_pcm_streaming_enabled) { + to_load_asrp_fw = true; + p->va_ns_cfg_index = + VA_NS_CONFIG_DMIC_STREAMING_WITH_NS; + } else { + to_load_asrp_fw = false; + p->va_ns_cfg_index = + VA_NS_CONFIG_DMIC_STREAMING_WITHOUT_NS; + } + } else if (mode == DBMDX_DETECTION || + mode == DBMDX_DETECTION_AND_STREAMING) { + to_set_bypass = true; + to_set_idle_mode = true; + p->va_ns_cfg_index = VA_NS_CONFIG_DMIC_DETECTION; + to_load_asrp_fw = true; + /* Set Bypass mode for Voice Energy */ + if (p->va_detection_mode == DETECTION_MODE_VOICE_ENERGY) + bypass_val = 1; + } else { + to_load_asrp_fw = false; + to_set_idle_mode = false; + to_set_bypass = false; + dev_warn(p->dev, "%s: Unexpected mode", __func__); + p->va_ns_cfg_index = VA_NS_CONFIG_DISABLE; + } + + /* We must go trough IDLE mode */ + if (to_set_idle_mode) { + ret = dbmdx_send_cmd(p, DBMDX_VA_OPR_MODE | DBMDX_IDLE, NULL); + if (ret < 0) { + dev_err(p->dev, "%s: failed to set IDLE mode\n", + __func__); + ret = -EIO; + goto out; + } + + while (retry--) { + + usleep_range(DBMDX_USLEEP_SET_MODE, + DBMDX_USLEEP_SET_MODE + 1000); + + ret = dbmdx_send_cmd(p, DBMDX_VA_OPR_MODE, &cur_val); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to read DBMDX_VA_OPR_MODE\n", + __func__); + ret = -EIO; + goto out; + } + + if (cur_val == DBMDX_IDLE) + break; + } + + /* no retries left, failed to verify mode */ + if (retry < 0) + dev_err(p->dev, + "%s: Mode verification failed: got %d, expected %d\n", + __func__, cur_val, DBMDX_IDLE); + } + + if (!to_load_asrp_fw) { + dev_dbg(p->dev, + "%s VA ASRP params loading is not required\n", + __func__); + + } else if (!(p->va_load_asrp_params_options & + DBMDX_ASRP_PARAMS_OPTIONS_ALWAYS_RELOAD) && + p->va_flags.va_last_loaded_asrp_params_file_name && + !strcmp(p->va_flags.va_last_loaded_asrp_params_file_name, + p->pdata->va_asrp_params_firmware_name)) { + dev_dbg(p->dev, + "%s VA ASRP params have been already loaded\n", + __func__); + + } else { + + ret = dbmdx_send_cmd(p, DBMDX_VA_AUDIO_PROC_CONFIG, &cur_val); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to read APC\n", __func__); + ret = -EIO; + goto out; + } + + if (cur_val != 0) { + ret = dbmdx_send_cmd(p, DBMDX_VA_AUDIO_PROC_CONFIG, + NULL); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to config APC\n", __func__); + ret = -EIO; + goto out; + } + + usleep_range(DBMDX_USLEEP_AFTER_ECHO_CANCELLER, + DBMDX_USLEEP_AFTER_ECHO_CANCELLER + + 1000); + } + + ret = dbmdx_va_load_asrp_params(p, + p->pdata->va_asrp_params_firmware_name); + if (ret < 0) { + dev_err(p->dev, "%s: failed to update VA ASRP params\n", + __func__); + ret = -EIO; + goto out; + } + dev_dbg(p->dev, + "%s VA ASRP params were successfully updated.\n", + __func__); + + p->va_flags.va_last_loaded_asrp_params_file_name = + p->pdata->va_asrp_params_firmware_name; + } + + cur_cfg_arr = (u32 *)(&(p->pdata->va_ns_cfg_value[p->va_ns_cfg_index* + p->pdata->va_ns_cfg_values])); + + dev_dbg(p->dev, "%s: Loading VA_NS Configuration set #%d\n", + __func__, p->va_ns_cfg_index); + + for (i = 0; i < p->pdata->va_ns_cfg_values; i++) { + + cur_reg = (u16)((cur_cfg_arr[i] >> 16) & 0x0fff); + cur_val = (u16)((cur_cfg_arr[i]) & 0xffff); + + if (cur_reg == 0) + continue; + else if (cur_reg == DBMDX_VA_USLEEP_FLAG) { + usleep_range(cur_val, cur_val + 100); + continue; + } else if (cur_reg == DBMDX_VA_MSLEEP_FLAG) { + msleep(cur_val); + continue; + } + + ret = dbmdx_send_cmd(p, cur_cfg_arr[i], NULL); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to config VA_NS register\n", + __func__); + ret = -EIO; + goto out; + } + } + + if (mode == DBMDX_IDLE) + p->va_flags.va_ns_active = false; + else + p->va_flags.va_ns_active = true; + + if (to_set_bypass) { + ret = dbmdx_indirect_register_write(p, + DBMDX_VA_ASRP_IN_TO_OUT_IN_BYPASS_MODE, bypass_val); + if (ret < 0) { + dev_err(p->dev, "%s: failed to set ASRP bypass value\n", + __func__); + ret = -EIO; + goto out; + } + } + +out: + return ret; +} + +#endif + +static int dbmdx_va_amodel_load_file(struct dbmdx_private *p, + int num_of_amodel_files, + const char **amodel_fnames, + u32 gram_addr, + char *amodel_buf, + ssize_t *amodel_size, + int *num_of_amodel_chunks, + ssize_t *amodel_chunks_size) +{ + int ret; + struct firmware *amodel_chunk_fw[DBMDX_AMODEL_MAX_CHUNKS]; + const u8 *files_data[DBMDX_AMODEL_MAX_CHUNKS]; + ssize_t amodel_files_size[DBMDX_AMODEL_MAX_CHUNKS]; + int chunk_idx; + + if (!p) + return -EAGAIN; + for (chunk_idx = 0; chunk_idx < num_of_amodel_files; chunk_idx++) + amodel_chunk_fw[chunk_idx] = NULL; + + for (chunk_idx = 0; chunk_idx < num_of_amodel_files; chunk_idx++) { + + dev_dbg(p->dev, "%s: loading %s\n", __func__, + amodel_fnames[chunk_idx]); + + ret = request_firmware( + (const struct firmware **)(&amodel_chunk_fw[chunk_idx]), + amodel_fnames[chunk_idx], + p->dbmdx_dev); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to request Amodel firmware(%d)\n", + __func__, ret); + ret = -ENOENT; + goto release; + } + + dev_dbg(p->dev, "%s: %s firmware successfully requested\n", + __func__, amodel_fnames[chunk_idx]); + + dev_dbg(p->dev, "%s FW size=%zu bytes\n", + __func__, amodel_chunk_fw[chunk_idx]->size); + + if (!amodel_chunk_fw[chunk_idx]->size) { + dev_warn(p->dev, "%s FW size is 0. Ignore...\n", + __func__); + ret = -ENOENT; + goto release; + } + files_data[chunk_idx] = amodel_chunk_fw[chunk_idx]->data; + amodel_files_size[chunk_idx] = + (ssize_t)amodel_chunk_fw[chunk_idx]->size; + } + + ret = dbmdx_acoustic_model_build(p, + num_of_amodel_files, + files_data, + amodel_files_size, + gram_addr, + amodel_buf, + amodel_size, + num_of_amodel_chunks, + amodel_chunks_size); + + if (ret <= 0) { + dev_err(p->dev, "%s: amodel build failed: %d\n", + __func__, ret); + ret = -EIO; + goto release; + } + +release: + for (chunk_idx = 0; chunk_idx < num_of_amodel_files; chunk_idx++) { + if (amodel_chunk_fw[chunk_idx]) + release_firmware(amodel_chunk_fw[chunk_idx]); + } + + return ret; +} + +#define DUMMY_MODEL_DATA_SIZE 4 +static int dbmdx_va_amodel_load_dummy_model(struct dbmdx_private *p, + u32 gram_addr, + char *amodel_buf, + ssize_t *amodel_size, + int *num_of_amodel_chunks, + ssize_t *amodel_chunks_size) +{ + unsigned char head[DBMDX_AMODEL_HEADER_SIZE] = { 0 }; + unsigned char dummy_data[DUMMY_MODEL_DATA_SIZE] = { 0 }; + size_t target_pos = 0; + unsigned long checksum; + int ret = 0; + ssize_t head_size = DBMDX_AMODEL_HEADER_SIZE; + size_t gram_size = DUMMY_MODEL_DATA_SIZE; + + dev_dbg(p->dev, "%s\n", __func__); + + *num_of_amodel_chunks = 1; + + head[0] = 0x0; + head[1] = 0x0; + head[2] = 0x5A; + head[3] = 0x02; + head[4] = (gram_size/2) & 0xff; + head[5] = ((gram_size/2) >> 8) & 0xff; + head[6] = ((gram_size/2) >> 16) & 0xff; + head[7] = ((gram_size/2) >> 24) & 0xff; + head[8] = (gram_addr) & 0xff; + head[9] = ((gram_addr) >> 8) & 0xff; + head[10] = ((gram_addr) >> 16) & 0xff; + head[11] = ((gram_addr) >> 24) & 0xff; + + memcpy(amodel_buf + target_pos, head, head_size); + + target_pos += head_size; + + memcpy(amodel_buf + target_pos, dummy_data, gram_size); + + target_pos += gram_size; + + amodel_chunks_size[0] = gram_size; + + ret = dbmdx_calc_amodel_checksum(p, + (char *)amodel_buf, + target_pos, + &checksum); + if (ret) { + dev_err(p->dev, "%s: failed to calculate Amodel checksum\n", + __func__); + ret = -EINVAL; + goto out; + } + + *(unsigned long *)(amodel_buf + target_pos) = checksum; + + *amodel_size = (ssize_t)(target_pos + 4); + + ret = *amodel_size; + +out: + return ret; +} + +static int dbmdx_va_amodel_send(struct dbmdx_private *p, const void *data, + size_t size, int num_of_chunks, size_t *chunk_sizes, + const void *checksum, size_t chksum_len, + u16 load_amodel_mode_cmd) +{ + int retry = RETRY_COUNT; + int ret; + ssize_t send_bytes; + size_t cur_pos; + size_t cur_size; + bool fw_in_boot_mode = false; + int chunk_ind; + + if (!p) + return -EAGAIN; + + dev_dbg(p->dev, "%s\n", __func__); + + while (retry--) { + + if (fw_in_boot_mode) { + /* send boot command */ + ret = p->chip->send_cmd_boot(p, DBMDX_FIRMWARE_BOOT); + if (ret < 0) { + dev_err(p->dev, + "%s: booting the firmware failed\n", + __func__); + continue; + } + fw_in_boot_mode = false; + } + + ret = dbmdx_send_cmd( + p, + DBMDX_VA_LOAD_NEW_ACUSTIC_MODEL | + load_amodel_mode_cmd, + NULL); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set fw to receive new amodel\n", + __func__); + continue; + } + + fw_in_boot_mode = true; + + dev_info(p->dev, + "%s: ---------> acoustic model download start\n", + __func__); + + cur_pos = 0; + ret = 0; + + p->wakeup_toggle(p); + + for (chunk_ind = 0; chunk_ind < num_of_chunks; chunk_ind++) { + dev_info(p->dev, + "%s: Sending amodel chunk %d (%d bytes)\n", + __func__, chunk_ind, (int)chunk_sizes[chunk_ind]); + + if (chunk_sizes[chunk_ind] == 0) + continue; + + cur_size = DBMDX_AMODEL_HEADER_SIZE; + + /* Send Gram Header */ + send_bytes = p->chip->write(p, data + cur_pos, + cur_size); + + if (send_bytes != cur_size) { + dev_err(p->dev, + "%s: sending of acoustic model data failed\n", + __func__); + ret = -1; + break; + } + + /* wait for FW to process the header */ + usleep_range(DBMDX_USLEEP_AMODEL_HEADER, + DBMDX_USLEEP_AMODEL_HEADER + 1000); + + cur_pos += DBMDX_AMODEL_HEADER_SIZE; + cur_size = chunk_sizes[chunk_ind]; + + /* Send Gram Data */ + send_bytes = p->chip->write(p, + data + cur_pos, cur_size); + + if (send_bytes != cur_size) { + dev_err(p->dev, + "%s: sending of acoustic model data failed\n", + __func__); + ret = -1; + break; + } + + cur_pos += cur_size; + } + + /* Check if error occurred during acoustic model transfer */ + if (ret < 0) + continue; + + /* verify checksum */ + if (checksum) { + ret = p->chip->verify_boot_checksum(p, checksum, + chksum_len); + if (ret < 0) { + dev_err(p->dev, + "%s: could not verify checksum\n", + __func__); + continue; + } + } + break; + } + + if (fw_in_boot_mode) { + /* send boot command */ + ret = p->chip->send_cmd_boot(p, DBMDX_FIRMWARE_BOOT); + if (ret < 0) { + dev_err(p->dev, + "%s: booting the firmware failed\n", __func__); + return -EIO; + } + } + + /* no retries left, failed to load acoustic */ + if (retry < 0) { + dev_err(p->dev, "%s: failed to load acoustic model\n", + __func__); + return -EIO; + } + + /* wait some time */ + usleep_range(DBMDX_USLEEP_AFTER_LOAD_AMODEL, + DBMDX_USLEEP_AFTER_LOAD_AMODEL + 1000); + + return 0; +} + +static int dbmdx_va_amodel_load_single(struct dbmdx_private *p, + int num_of_amodel_files, + const char **amodel_fnames, + enum dbmdx_load_amodel_mode amode, + bool to_load_from_memory) +{ + int ret, ret2; + size_t model_size; + int model_size_fw; + u16 val; + int chunk_idx; + struct amodel_info *cur_amodel = NULL; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + if (to_load_from_memory && !(p->primary_amodel.amodel_loaded)) { + + dev_err(p->dev, "%s: Primary model was not loaded to memory\n", + __func__); + return -EAGAIN; + } + + cur_amodel = &(p->primary_amodel); + + if (!to_load_from_memory) { + if (cur_amodel->amodel_buf == NULL) { + cur_amodel->amodel_buf = vmalloc(MAX_AMODEL_SIZE); + if (!cur_amodel->amodel_buf) + return -ENOMEM; + } + + if (p->pdata->amodel_options & DBMDX_VE_SEND_DUMMY_AMODEL_4B && + p->va_detection_mode == DETECTION_MODE_VOICE_ENERGY) + ret = dbmdx_va_amodel_load_dummy_model(p, + 0x1, + cur_amodel->amodel_buf, + &cur_amodel->amodel_size, + &cur_amodel->num_of_amodel_chunks, + cur_amodel->amodel_chunks_size); + else + ret = dbmdx_va_amodel_load_file(p, + num_of_amodel_files, + amodel_fnames, + 0x1, + cur_amodel->amodel_buf, + &cur_amodel->amodel_size, + &cur_amodel->num_of_amodel_chunks, + cur_amodel->amodel_chunks_size); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to load amodel(%d)\n", + __func__, ret); + ret = -EFAULT; + goto out; + } + + cur_amodel->amodel_loaded = true; + + memcpy(&(cur_amodel->amodel_checksum), + &(cur_amodel->amodel_buf[cur_amodel->amodel_size - 4]), + 4); + + } + + p->va_flags.amodel_len = cur_amodel->amodel_size; + + p->device_ready = false; + + /* set chip to idle mode */ + ret = dbmdx_set_mode(p, DBMDX_IDLE); + if (ret) { + dev_err(p->dev, "%s: failed to set device to idle mode\n", + __func__); + ret = -EIO; + goto out; + } + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + /* prepare the chip interface for A-Model loading */ + ret = p->chip->prepare_amodel_loading(p); + if (ret != 0) { + dev_err(p->dev, "%s: failed to prepare A-Model loading\n", + __func__); + p->device_ready = true; + ret = -EIO; + goto out; + } + + p->va_flags.a_model_downloaded_to_fw = 0; + + model_size = 0; + + for (chunk_idx = 0; chunk_idx < cur_amodel->num_of_amodel_chunks; + chunk_idx++) + model_size += (cur_amodel->amodel_chunks_size[chunk_idx] + + DBMDX_AMODEL_HEADER_SIZE); + + model_size_fw = (int)(model_size / 16) + 1; + +#if IS_ENABLED(DBMDX_FW_BELOW_380) + ret = dbmdx_send_cmd(p, DBMDX_VA_PRIMARY_AMODEL_SIZE | model_size_fw, + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set primary amodel size\n", + __func__); + ret = -EIO; + goto out_finish_loading; + } +#endif + /* load A-Model and verify checksum */ + if (p->chip->load_amodel) + ret = p->chip->load_amodel(p, + cur_amodel->amodel_buf, + cur_amodel->amodel_size - 4, + cur_amodel->num_of_amodel_chunks, + cur_amodel->amodel_chunks_size, + &(cur_amodel->amodel_buf[cur_amodel->amodel_size - 4]), + 4, + amode); + else + ret = dbmdx_va_amodel_send(p, + cur_amodel->amodel_buf, + cur_amodel->amodel_size - 4, + cur_amodel->num_of_amodel_chunks, + cur_amodel->amodel_chunks_size, + &(cur_amodel->amodel_buf[cur_amodel->amodel_size - 4]), + 4, + amode); + + if (ret) { + dev_err(p->dev, "%s: sending amodel failed\n", + __func__); + ret = -EIO; + goto out_finish_loading; + } + + ret = dbmdx_va_alive(p); + if (ret) { + dev_err(p->dev, "%s: fw is dead\n", __func__); + ret = -EIO; + goto out_finish_loading; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_SENS_INITIALIZED, &val); + if (ret < 0) { + dev_err(p->dev, "%s: Error reading status\n", __func__); + ret = -EIO; + goto out_finish_loading; + } + + if (val != 1) { + dev_err(p->dev, + "%s: Error reported by FW after loading amodel\n", + __func__); + ret = -EIO; + goto out_finish_loading; + } + + dev_info(p->dev, "%s: acoustic model sent successfully\n", __func__); + + p->va_flags.a_model_downloaded_to_fw = 1; + +out_finish_loading: + /* finish A-Model loading */ + ret2 = p->chip->finish_amodel_loading(p); + if (ret2 != 0) + dev_err(p->dev, "%s: failed to finish A-Model loading\n", + __func__); + + p->device_ready = true; + +out: + return ret; +} + +static int dbmdx_va_amodel_load_dual(struct dbmdx_private *p, + int num_of_amodel_files, + const char **amodel_fnames, + int num_of_amodel_files_sec, + const char **amodel_fnames_sec, + bool to_load_from_memory) +{ + int ret, ret2; + int model_size_fw; + size_t model_size; + u16 val; + int chunk_idx; + struct amodel_info *cur_amodel = NULL; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + if (to_load_from_memory) { + + if (!(p->primary_amodel.amodel_loaded)) { + dev_err(p->dev, + "%s: Primary model wasn't loaded to memory\n", + __func__); + return -EAGAIN; + } + if (!(p->secondary_amodel.amodel_loaded)) { + dev_err(p->dev, + "%s: Secondary model wasn't loaded to memory\n", + __func__); + return -EAGAIN; + } + } + if (!to_load_from_memory) { + + cur_amodel = &(p->primary_amodel); + + if (cur_amodel->amodel_buf == NULL) { + cur_amodel->amodel_buf = vmalloc(MAX_AMODEL_SIZE); + if (!cur_amodel->amodel_buf) + return -ENOMEM; + } + + ret = dbmdx_va_amodel_load_file(p, + num_of_amodel_files, + amodel_fnames, + 0x1, + cur_amodel->amodel_buf, + &cur_amodel->amodel_size, + &cur_amodel->num_of_amodel_chunks, + cur_amodel->amodel_chunks_size); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to load primary amodel(%d)\n", + __func__, ret); + ret = -EFAULT; + goto out; + } + + cur_amodel->amodel_loaded = true; + + memcpy(&(cur_amodel->amodel_checksum), + &(cur_amodel->amodel_buf[cur_amodel->amodel_size - 4]), + 4); + + + cur_amodel = &(p->secondary_amodel); + + if (cur_amodel->amodel_buf == NULL) { + cur_amodel->amodel_buf = vmalloc(MAX_AMODEL_SIZE); + if (!cur_amodel->amodel_buf) { + ret = -ENOMEM; + goto out; + } + } + + ret = dbmdx_va_amodel_load_file(p, + num_of_amodel_files_sec, + amodel_fnames_sec, + 0x1, + cur_amodel->amodel_buf, + &cur_amodel->amodel_size, + &cur_amodel->num_of_amodel_chunks, + cur_amodel->amodel_chunks_size); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to load secondary amodel(%d)\n", + __func__, ret); + ret = -EFAULT; + goto out; + } + + cur_amodel->amodel_loaded = true; + + memcpy(&(cur_amodel->amodel_checksum), + &(cur_amodel->amodel_buf[cur_amodel->amodel_size - 4]), + 4); + + } + + cur_amodel = &(p->primary_amodel); + + p->va_flags.amodel_len = cur_amodel->amodel_size; + + p->device_ready = false; + + /* set chip to idle mode */ + ret = dbmdx_set_mode(p, DBMDX_IDLE); + if (ret) { + dev_err(p->dev, "%s: failed to set device to idle mode\n", + __func__); + ret = -EIO; + goto out; + } + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + /* prepare the chip interface for A-Model loading */ + ret = p->chip->prepare_amodel_loading(p); + if (ret != 0) { + dev_err(p->dev, "%s: failed to prepare A-Model loading\n", + __func__); + p->device_ready = true; + ret = -EIO; + goto out; + } + + p->va_flags.a_model_downloaded_to_fw = 0; + + model_size = 0; + + for (chunk_idx = 0; chunk_idx < cur_amodel->num_of_amodel_chunks; + chunk_idx++) + model_size += (cur_amodel->amodel_chunks_size[chunk_idx] + + DBMDX_AMODEL_HEADER_SIZE); + + model_size_fw = (int)(model_size / 16) + 1; + +#if IS_ENABLED(DBMDX_FW_BELOW_380) + ret = dbmdx_send_cmd(p, DBMDX_VA_PRIMARY_AMODEL_SIZE | model_size_fw, + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set primary amodel size\n", + __func__); + ret = -EIO; + goto out_finish_loading; + } +#endif + cur_amodel = &(p->secondary_amodel); + + model_size = 0; + + for (chunk_idx = 0; chunk_idx < cur_amodel->num_of_amodel_chunks; + chunk_idx++) + model_size += (cur_amodel->amodel_chunks_size[chunk_idx] + + DBMDX_AMODEL_HEADER_SIZE); + + model_size_fw = (int)(model_size / 16) + 1; + +#if IS_ENABLED(DBMDX_FW_BELOW_380) + ret = dbmdx_send_cmd(p, DBMDX_VA_SECONDARY_AMODEL_SIZE | model_size_fw, + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set secondary amodel size\n", + __func__); + ret = -EIO; + goto out_finish_loading; + } +#endif + + if (p->chip->load_amodel) + ret = p->chip->load_amodel(p, + cur_amodel->amodel_buf, + cur_amodel->amodel_size - 4, + cur_amodel->num_of_amodel_chunks, + cur_amodel->amodel_chunks_size, + &(cur_amodel->amodel_buf[cur_amodel->amodel_size - 4]), + 4, + LOAD_AMODEL_2NDARY); + else + ret = dbmdx_va_amodel_send(p, + cur_amodel->amodel_buf, + cur_amodel->amodel_size - 4, + cur_amodel->num_of_amodel_chunks, + cur_amodel->amodel_chunks_size, + &(cur_amodel->amodel_buf[cur_amodel->amodel_size - 4]), + 4, + LOAD_AMODEL_2NDARY); + + if (ret) { + dev_err(p->dev, "%s: sending amodel failed\n", + __func__); + ret = -EIO; + goto out_finish_loading; + } + + cur_amodel = &(p->primary_amodel); + + /* load A-Model and verify checksum */ + if (p->chip->load_amodel) + ret = p->chip->load_amodel(p, + cur_amodel->amodel_buf, + cur_amodel->amodel_size - 4, + cur_amodel->num_of_amodel_chunks, + cur_amodel->amodel_chunks_size, + &(cur_amodel->amodel_buf[cur_amodel->amodel_size - 4]), + 4, + LOAD_AMODEL_PRIMARY); + else + ret = dbmdx_va_amodel_send(p, + cur_amodel->amodel_buf, + cur_amodel->amodel_size - 4, + cur_amodel->num_of_amodel_chunks, + cur_amodel->amodel_chunks_size, + &(cur_amodel->amodel_buf[cur_amodel->amodel_size - 4]), + 4, + LOAD_AMODEL_PRIMARY); + + if (ret) { + dev_err(p->dev, "%s: sending amodel failed\n", + __func__); + ret = -EIO; + goto out_finish_loading; + } + + ret = dbmdx_va_alive(p); + if (ret) { + dev_err(p->dev, "%s: fw is dead\n", __func__); + ret = -EIO; + goto out_finish_loading; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_SENS_INITIALIZED, &val); + if (ret < 0) { + dev_err(p->dev, "%s: Error reading status\n", __func__); + ret = -EIO; + goto out_finish_loading; + } + + if (val != 1) { + dev_err(p->dev, + "%s: Error reported by FW after loading amodel\n", + __func__); + ret = -EIO; + goto out_finish_loading; + } + + dev_info(p->dev, "%s: acoustic model sent successfully\n", __func__); + + p->va_flags.a_model_downloaded_to_fw = 1; + +out_finish_loading: + /* finish A-Model loading */ + ret2 = p->chip->finish_amodel_loading(p); + if (ret2 != 0) + dev_err(p->dev, "%s: failed to finish A-Model loading\n", + __func__); + + p->device_ready = true; + +out: + return ret; +} + + + +static int dbmdx_va_amodel_update(struct dbmdx_private *p, int val) +{ + int ret; + const char *amodel_fnames[DBMDX_AMODEL_MAX_CHUNKS]; + const char *amodel_fnames_sec[DBMDX_AMODEL_MAX_CHUNKS]; + int num_of_amodel_files = 2; + int num_of_amodel_files_sec = 0; + enum dbmdx_detection_mode detection_mode; + unsigned int model_select_mask = 0; + unsigned int model_options_mask = 0; + unsigned int model_custom_params = 0; + bool do_not_reload_model = false; + bool do_not_set_detection_mode = false; + bool load_model_from_memory = false; + bool sv_model_selected = false; + bool sv_model_was_loaded = false; + unsigned int cur_opmode = p->va_flags.mode; +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + bool load_okg_model = false; + bool okg_model_selected = false; +#endif + + if (((unsigned int)val & 0x0f) > DETECTION_MODE_MAX) { + dev_err(p->dev, + "%s: Unsupported detection mode:%d\n", __func__, + ((unsigned int)val & 0x0f)); + return -EINVAL; + } + + detection_mode = (enum dbmdx_detection_mode)((unsigned int)val & 0x0f); + + model_select_mask = (((unsigned int)val & 0x30) >> 4); + + model_options_mask = (((unsigned int)val & 0xf00) >> 8); + + model_custom_params = (((unsigned int)val & 0xf000) >> 12); + + if (model_options_mask & DBMDX_LOAD_MODEL_NO_DETECTION) + do_not_set_detection_mode = true; + + if (model_options_mask & DBMDX_DO_NOT_RELOAD_MODEL) + do_not_reload_model = true; + + if (model_options_mask & DBMDX_LOAD_MODEL_FROM_MEMORY) + load_model_from_memory = true; + + if (model_custom_params == 0) + model_custom_params = DBMDX_NO_EXT_DETECTION_MODE_PARAMS; + + dev_dbg(p->dev, + "%s:Det.mode: %d\tSelected: 0x%x\tOptions: 0x%x\tParams 0x%x\n", + __func__, detection_mode, model_select_mask, + model_options_mask, model_custom_params); + + if (model_select_mask == DBMDX_NO_MODEL_SELECTED) { + if (p->sv_a_model_support) + sv_model_selected = true; +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + if (p->okg_a_model_support && p->va_flags.okg_a_model_enabled) + okg_model_selected = true; +#endif + } else { + if (p->sv_a_model_support) + sv_model_selected = + model_select_mask & DBMDX_SV_MODEL_SELECTED; +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + if (p->okg_a_model_support && p->va_flags.okg_a_model_enabled) + okg_model_selected = + model_select_mask & DBMDX_OKG_MODEL_SELECTED; +#endif + } + + if (detection_mode == DETECTION_MODE_OFF && + model_select_mask == DBMDX_NO_MODEL_SELECTED) { + + if (p->active_fw != DBMDX_FW_VA) { + dev_err(p->dev, "%s: VA firmware not active, error\n", + __func__); + return -EAGAIN; + } + /* flush pending sv work if any */ + p->va_flags.buffering = 0; + flush_work(&p->sv_work); + + ret = dbmdx_suspend_pcm_streaming_work(p); + if (ret < 0) + dev_err(p->dev, + "%s: Failed to suspend PCM Streaming Work\n", + __func__); + + p->lock(p); + + ret = dbmdx_set_mode(p, DBMDX_IDLE); + if (ret) { + dev_err(p->dev, + "%s: failed to set device to idle mode\n", + __func__); + p->unlock(p); + return -EIO; + } + + if (sv_model_selected) { + p->va_detection_mode_custom_params = + DBMDX_NO_EXT_DETECTION_MODE_PARAMS; + + ret = dbmdx_set_sv_recognition_mode(p, + SV_RECOGNITION_MODE_DISABLED); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set SV model mode\n", + __func__); + p->unlock(p); + return -EIO; + } + } + +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + if (okg_model_selected) { + ret = dbmdx_set_okg_recognition_mode(p, + OKG_RECOGNITION_MODE_DISABLED); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set OKG model mode\n", + __func__); + p->unlock(p); + return -EIO; + } + } +#endif + if (p->va_flags.pcm_streaming_active) { + + ret = dbmdx_set_mode(p, DBMDX_STREAMING); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set DBMDX_STREAMING mode\n", + __func__); + p->unlock(p); + return -EIO; + } + + } + + p->unlock(p); + + return 0; + } else if (detection_mode == DETECTION_MODE_OFF) { + + if (p->active_fw != DBMDX_FW_VA) { + dev_err(p->dev, "%s: VA firmware not active, error\n", + __func__); + return -EAGAIN; + } + + p->lock(p); + /* wake up if asleep */ + ret = dbmdx_wake(p); + if (ret < 0) { + dev_err(p->dev, "%s: unable to wake\n", __func__); + p->unlock(p); + return -EIO; + } + + if (sv_model_selected) { + p->va_detection_mode_custom_params = + DBMDX_NO_EXT_DETECTION_MODE_PARAMS; + ret = dbmdx_set_sv_recognition_mode(p, + SV_RECOGNITION_MODE_DISABLED); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set SV model mode\n", + __func__); + p->unlock(p); + return -EIO; + } + } + +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + if (okg_model_selected) { + ret = dbmdx_set_okg_recognition_mode(p, + OKG_RECOGNITION_MODE_DISABLED); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set OKG model mode\n", + __func__); + p->unlock(p); + return -EIO; + } + } +#endif + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + + p->unlock(p); + + return 0; + } + + if (p->active_fw == DBMDX_FW_VQE) { + if (p->vqe_flags.in_call) { + dev_err(p->dev, + "%s: Switching to VA is not allowed when in CALL\n", + __func__); + return -EAGAIN; + } + + dev_info(p->dev, "%s: VA firmware not active, switching\n", + __func__); + + p->lock(p); + ret = dbmdx_switch_to_va_firmware(p, 0); + p->unlock(p); + if (ret != 0) { + dev_err(p->dev, "%s: Error switching to VA firmware\n", + __func__); + return -EIO; + } + } + + /* flush pending sv work if any */ + p->va_flags.buffering = 0; + flush_work(&p->sv_work); + + ret = dbmdx_suspend_pcm_streaming_work(p); + if (ret < 0) + dev_err(p->dev, "%s: Failed to suspend PCM Streaming Work\n", + __func__); + + p->lock(p); + + switch (detection_mode) { + case DETECTION_MODE_VOICE_COMMAND: + if (!p->sv_a_model_support) { + p->unlock(p); + dev_err(p->dev, "%s: SV Model is not supported\n", + __func__); + return -EINVAL; + } + if (!do_not_set_detection_mode) { + p->va_flags.sv_recognition_mode = + SV_RECOGNITION_MODE_VOICE_PHRASE_OR_CMD; + p->va_detection_mode_custom_params = + model_custom_params; + } + p->va_flags.sv_capture_on_detect_disabled = true; + p->va_detection_mode = detection_mode; + if (p->pdata->amodel_options & DBMDX_AMODEL_INCLUDES_HEADERS) { + num_of_amodel_files = 1; + amodel_fnames[0] = DBMDX_VC_AMODEL_NAME; + } else { + if (p->pdata->amodel_options & + DBMDX_AMODEL_SINGLE_FILE_NO_HEADER) { + num_of_amodel_files = 1; + amodel_fnames[0] = DBMDX_VC_AMODEL_NAME; + } else { + num_of_amodel_files = 2; + amodel_fnames[0] = DBMDX_VC_GRAM_NAME; + amodel_fnames[1] = DBMDX_VC_NET_NAME; + } + } + break; + case DETECTION_MODE_DUAL: + if (!p->sv_a_model_support) { + p->unlock(p); + dev_err(p->dev, "%s: SV Model is not supported\n", + __func__); + return -EINVAL; + } + if (!do_not_set_detection_mode) { + p->va_flags.sv_recognition_mode = + SV_RECOGNITION_MODE_VOICE_PHRASE_OR_CMD; + p->va_detection_mode_custom_params = + model_custom_params; + } + p->va_flags.sv_capture_on_detect_disabled = true; + p->va_detection_mode = detection_mode; + if (p->pdata->amodel_options & DBMDX_AMODEL_INCLUDES_HEADERS) { + num_of_amodel_files = 1; + amodel_fnames[0] = DBMDX_VT_AMODEL_NAME; + num_of_amodel_files_sec = 1; + amodel_fnames_sec[0] = DBMDX_VC_AMODEL_NAME; + } else { + if (p->pdata->amodel_options & + DBMDX_AMODEL_SINGLE_FILE_NO_HEADER) { + num_of_amodel_files = 1; + amodel_fnames[0] = DBMDX_VT_AMODEL_NAME; + num_of_amodel_files_sec = 1; + amodel_fnames_sec[0] = DBMDX_VC_AMODEL_NAME; + } else { + num_of_amodel_files = 2; + amodel_fnames[0] = DBMDX_VT_GRAM_NAME; + amodel_fnames[1] = DBMDX_VT_NET_NAME; + num_of_amodel_files_sec = 2; + amodel_fnames_sec[0] = DBMDX_VC_GRAM_NAME; + amodel_fnames_sec[1] = DBMDX_VC_NET_NAME; + } + + } + + break; + case DETECTION_MODE_VOICE_ENERGY: + if (!p->sv_a_model_support) { + p->unlock(p); + dev_err(p->dev, "%s: SV Model is not supported\n", + __func__); + return -EINVAL; + } + + p->va_detection_mode = detection_mode; + p->va_flags.sv_capture_on_detect_disabled = false; + + if (!do_not_set_detection_mode) { + p->va_flags.sv_recognition_mode = + SV_RECOGNITION_MODE_VOICE_ENERGY; + p->va_detection_mode_custom_params = + model_custom_params; + } + + if (p->pdata->amodel_options & DBMDX_LOAD_AMODEL_FOR_VE) { + if (p->pdata->amodel_options & + DBMDX_AMODEL_INCLUDES_HEADERS) { + num_of_amodel_files = 1; + amodel_fnames[0] = DBMDX_VE_AMODEL_NAME; + } else { + if (p->pdata->amodel_options & + DBMDX_AMODEL_SINGLE_FILE_NO_HEADER) { + num_of_amodel_files = 1; + amodel_fnames[0] = DBMDX_VE_AMODEL_NAME; + } else { + num_of_amodel_files = 2; + amodel_fnames[0] = DBMDX_VE_GRAM_NAME; + amodel_fnames[1] = DBMDX_VE_NET_NAME; + } + } + + } else { + if (!do_not_set_detection_mode) { + ret = dbmdx_trigger_detection(p); + p->unlock(p); + return ret; + } + } + break; + case DETECTION_MODE_PHRASE: + p->va_flags.sv_capture_on_detect_disabled = false; + if (p->pdata->amodel_options & DBMDX_AMODEL_INCLUDES_HEADERS) { + num_of_amodel_files = 1; + amodel_fnames[0] = DBMDX_VT_AMODEL_NAME; + } else { + if (p->pdata->amodel_options & + DBMDX_AMODEL_SINGLE_FILE_NO_HEADER) { + num_of_amodel_files = 1; + amodel_fnames[0] = DBMDX_VT_AMODEL_NAME; + } else { + num_of_amodel_files = 2; + amodel_fnames[0] = DBMDX_VT_GRAM_NAME; + amodel_fnames[1] = DBMDX_VT_NET_NAME; + } + } + p->va_detection_mode = detection_mode; + if (!do_not_set_detection_mode) { + if (sv_model_selected) { + p->va_flags.sv_recognition_mode = + SV_RECOGNITION_MODE_VOICE_PHRASE_OR_CMD; + p->va_detection_mode_custom_params = + model_custom_params; + } +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + if (okg_model_selected) + p->va_flags.okg_recognition_mode = + OKG_RECOGNITION_MODE_ENABLED; +#endif + + } + break; + case DETECTION_MODE_PHRASE_DONT_LOAD: + /* + * special case - don't load a-model, simply enforce detection + * and exit + */ + dev_info(p->dev, "%s: direct detection requisted\n", __func__); + /*p->va_detection_mode = DETECTION_MODE_PHRASE; */ + if (sv_model_selected) { + p->va_flags.sv_recognition_mode = + (p->va_detection_mode == + DETECTION_MODE_VOICE_ENERGY) ? + SV_RECOGNITION_MODE_VOICE_ENERGY : + SV_RECOGNITION_MODE_VOICE_PHRASE_OR_CMD; + p->va_detection_mode_custom_params = + model_custom_params; + } +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + if (okg_model_selected) { + p->va_flags.okg_recognition_mode = + OKG_RECOGNITION_MODE_ENABLED; + if (!sv_model_selected) + p->va_detection_mode = DETECTION_MODE_PHRASE; + } +#endif + ret = dbmdx_trigger_detection(p); + p->unlock(p); + return ret; + default: + dev_err(p->dev, + "%s: Error unknown detection mode:%d", __func__, val); + p->unlock(p); + return -EINVAL; + } + + if (p->va_detection_mode == DETECTION_MODE_DUAL) { + if (!p->sv_a_model_support) { + dev_err(p->dev, + "%s: SV acoustic model is not supported", + __func__); + p->unlock(p); + return -EINVAL; + } + if (!do_not_reload_model) { + ret = dbmdx_va_amodel_load_dual(p, + num_of_amodel_files, amodel_fnames, + num_of_amodel_files_sec, amodel_fnames_sec, + load_model_from_memory); + if (ret < 0) { + dev_err(p->dev, + "%s: Error loading dual acoustic model:%d\n", + __func__, val); + p->unlock(p); + return ret; + } + sv_model_was_loaded = true; + } + } else if (sv_model_selected) { + if (!p->sv_a_model_support) { + dev_err(p->dev, + "%s: SV acoustic model is not supported", + __func__); + p->unlock(p); + return -EINVAL; + } + if (!do_not_reload_model) { + ret = dbmdx_va_amodel_load_single(p, + num_of_amodel_files, amodel_fnames, + LOAD_AMODEL_PRIMARY, load_model_from_memory); + if (ret < 0) { + dev_err(p->dev, + "%s: Error loading acoustic model:%d\n", + __func__, val); + p->unlock(p); + return ret; + } + sv_model_was_loaded = true; + } + } +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + /* Check whether to load OKG model + * If SV amodel was loaded it is required to reload the OKG amodel + */ + load_okg_model = + p->okg_a_model_support && p->va_flags.okg_a_model_enabled && + ((sv_model_was_loaded && + p->va_flags.okg_a_model_downloaded_to_fw) || + ((p->va_detection_mode == DETECTION_MODE_PHRASE) && + okg_model_selected && !do_not_reload_model)); + + if (load_okg_model) { + + /* Reset the flag to ensure that the model will be reloaded */ + if (sv_model_was_loaded && + p->va_flags.okg_a_model_downloaded_to_fw) + p->va_flags.okg_a_model_downloaded_to_fw = 0; + + ret = dbmdx_va_amodel_okg_load(p, DBMDX_VC_OKG_NAME, + load_model_from_memory); + if (ret < 0) { + dev_err(p->dev, + "%s: Error loading acoustic model:%d\n", + __func__, val); + p->unlock(p); + return ret; + } + } else if (sv_model_was_loaded) + p->va_flags.okg_a_model_downloaded_to_fw = 0; +#endif + if (p->pdata->auto_detection && !p->va_flags.auto_detection_disabled && + !do_not_set_detection_mode) { + dev_info(p->dev, "%s: enforcing DETECTION opmode\n", + __func__); + ret = dbmdx_trigger_detection(p); + if (ret) { + dev_err(p->dev, + "%s: failed to trigger detection\n", + __func__); + p->unlock(p); + return ret; + } + } else { /* Do not set detection */ + if (sv_model_selected) { + p->va_detection_mode_custom_params = + DBMDX_NO_EXT_DETECTION_MODE_PARAMS; + ret = dbmdx_set_sv_recognition_mode(p, + SV_RECOGNITION_MODE_DISABLED); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set SV model mode\n", + __func__); + p->unlock(p); + return -EIO; + } + } + +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + if (okg_model_selected) { + ret = dbmdx_set_okg_recognition_mode(p, + OKG_RECOGNITION_MODE_DISABLED); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set OKG model mode\n", + __func__); + p->unlock(p); + return -EIO; + } + } +#endif + /* Restore mode if needed */ + if (cur_opmode == DBMDX_DETECTION || + cur_opmode == DBMDX_DETECTION_AND_STREAMING) { +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + /* If OKG or SV were in detection mode were not, + * reloaded, put it back in detection mode + */ + if ((sv_model_selected && + (p->va_flags.okg_recognition_mode != + OKG_RECOGNITION_MODE_DISABLED)) || + (okg_model_selected && + (p->va_flags.sv_recognition_mode != + SV_RECOGNITION_MODE_DISABLED))) { + ret = dbmdx_trigger_detection(p); + if (ret) + dev_err(p->dev, + "%s: failed to trigger detection\n", + __func__); + p->unlock(p); + return ret; + } +#endif + } + if (p->va_flags.pcm_streaming_active) { + ret = dbmdx_set_mode(p, DBMDX_STREAMING); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set DBMDX_STREAMING mode\n", + __func__); + p->unlock(p); + return -EIO; + } + } else + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + + } + + p->unlock(p); + return ret; +} + + +static ssize_t dbmdx_va_acoustic_model_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + int val = dbmdx_buf_to_int(buf); + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = dbmdx_va_amodel_update(p, val); + + if (ret < 0 && ret != -EINVAL && ret != -ENOENT && + !p->pdata->va_recovery_disabled) { + int recovery_res; + + if (!(p->va_flags.recovery_requested) && + (p->device_ready && + (dbmdx_va_alive_with_lock(p) == 0))) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + goto out; + } + + dev_err(p->dev, "%s: Performing recovery #1\n", __func__); + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + goto out; + } + + ret = dbmdx_va_amodel_update(p, val); + + if (ret == 0) { + dev_err(p->dev, + "%s: Amodel was loaded after succesfull recovery\n", + __func__); + goto out; + } + + if (p->device_ready && (dbmdx_va_alive_with_lock(p) == 0)) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + goto out; + } + + dev_err(p->dev, "%s: Performing recovery #2\n", __func__); + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + goto out; + } + + } +out: + return ret < 0 ? ret : size; +} + +static ssize_t dbmdx_va_max_sample_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return dbmdx_reg_show(dev, DBMDX_VA_LAST_MAX_SMP_VALUE, attr, buf); +} + +static ssize_t dbmdx_io_value_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return dbmdx_reg_show_long(dev, DBMDX_VA_IO_PORT_VALUE_HI, + DBMDX_VA_IO_PORT_VALUE_LO, attr, buf); +} + +static ssize_t dbmdx_io_value_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return dbmdx_reg_store_long(dev, DBMDX_VA_IO_PORT_VALUE_HI, + DBMDX_VA_IO_PORT_VALUE_LO, attr, buf, size); +} + +static ssize_t dbmdx_va_buffer_size_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return dbmdx_reg_show(dev, DBMDX_VA_AUDIO_BUFFER_SIZE, attr, buf); +} + +static ssize_t dbmdx_va_buffer_size_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return dbmdx_reg_store(dev, + DBMDX_VA_AUDIO_BUFFER_SIZE, + attr, + buf, + size, + DBMDX_FW_VA); +} + +static ssize_t dbmdx_va_buffsmps_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return dbmdx_reg_show(dev, DBMDX_VA_NUM_OF_SMP_IN_BUF, attr, buf); +} + +static ssize_t dbmdx_va_capture_on_detect_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = snprintf(buf, PAGE_SIZE, "%d\n", p->va_capture_on_detect); + + return ret; +} + +static ssize_t dbmdx_va_capture_on_detect_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + if (!p) + return -EAGAIN; + + if (val > 2) { + dev_err(p->dev, "%s: invalid captute on detection mode\n", + __func__); + return -EINVAL; + } + + p->va_capture_on_detect = (bool)val; + + return size; +} + +static ssize_t dbmdx_va_detection_after_buffering_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = snprintf(buf, PAGE_SIZE, "%d\n", + p->pdata->detection_after_buffering); + + return ret; +} + +static ssize_t dbmdx_va_detection_after_buffering_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + if (!p) + return -EAGAIN; + + if (val >= DETECTION_AFTER_BUFFERING_MODE_MAX) { + dev_err(p->dev, "%s: invalid detection_after_buffering mode\n", + __func__); + return -EINVAL; + } + + p->pdata->detection_after_buffering = val; + + return size; +} + +static ssize_t dbmdx_va_disable_recovery_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = snprintf(buf, PAGE_SIZE, "\tVA Disable Recovery:\t%s\n", + p->pdata->va_recovery_disabled ? "ON" : "OFF"); + + return ret; +} + +static ssize_t dbmdx_va_disable_recovery_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + if (!p) + return -EAGAIN; + + if (val != 1 && val != 0) { + dev_err(p->dev, "%s: invalid recovery disable mode\n", + __func__); + return -EINVAL; + } + + p->pdata->va_recovery_disabled = (unsigned int)val; + + return size; +} + +static ssize_t dbmdx_va_boot_options_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + + if (!p) + return -EAGAIN; + + ret = snprintf(buf, PAGE_SIZE, "VA Boot options: 0x%x\n", + p->pdata->boot_options); + + return ret; +} + +static ssize_t dbmdx_va_boot_options_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + if (!p) + return -EAGAIN; + + p->pdata->boot_options = val; + + return size; +} + +static ssize_t dbmdx_va_amodel_options_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + + if (!p) + return -EAGAIN; + + ret = snprintf(buf, PAGE_SIZE, "amodel_options: 0x%x\n", + p->pdata->amodel_options); + + return ret; +} + +static ssize_t dbmdx_va_amodel_options_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + if (!p) + return -EAGAIN; + + p->pdata->amodel_options = val; + + return size; +} + +static ssize_t dbmdx_va_audio_conv_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return dbmdx_reg_show(dev, DBMDX_VA_AUDIO_BUFFER_CONVERSION, attr, buf); +} + +static ssize_t dbmdx_va_audio_conv_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return dbmdx_reg_store(dev, DBMDX_VA_AUDIO_BUFFER_CONVERSION, attr, buf, + size, DBMDX_FW_VA); +} + +static ssize_t dbmdx_va_analog_micgain_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return dbmdx_reg_show(dev, DBMDX_VA_ANALOG_MIC_GAIN, attr, buf); +} + +static ssize_t dbmdx_va_analog_micgain_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return dbmdx_reg_store(dev, DBMDX_VA_ANALOG_MIC_GAIN, attr, + buf, size, DBMDX_FW_VA); +} + +static ssize_t dbmdx_va_backlog_size_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + ssize_t off = 0; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + off += snprintf(buf + off, PAGE_SIZE - off, + "Backlog length: %d\n", + p->pdata->va_backlog_length); + +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + off += snprintf(buf + off, PAGE_SIZE - off, + "OKG Backlog length: %d\n", + p->pdata->va_backlog_length_okg); +#endif + off += snprintf(buf + off, PAGE_SIZE - off, + "Current FW Configuration:\n"); + + off += dbmdx_reg_show(dev, DBMDX_VA_AUDIO_HISTORY, attr, buf + off); + + return off; +} + +static ssize_t dbmdx_va_backlog_size_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t size) +{ + return dbmdx_reg_store(dev, DBMDX_VA_AUDIO_HISTORY, attr, buf, + size, DBMDX_FW_VA); +} + +static ssize_t dbmdx_reset_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + unsigned long val; + + if (!p) + return -EAGAIN; + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + dev_dbg(p->dev, "%s: Val = %d\n", __func__, (int)val); + + if (val == 0) { + ret = dbmdx_perform_recovery(p); + if (ret) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + return -EIO; + } + } else if (val == 1) { + p->va_flags.buffering = 0; + flush_work(&p->sv_work); + + ret = dbmdx_suspend_pcm_streaming_work(p); + if (ret < 0) + dev_err(p->dev, + "%s: Failed to suspend PCM Streaming Work\n", + __func__); + + p->device_ready = false; + + dbmdx_reset_set(p); + + dev_info(p->dev, "%s: DBMDX Chip is in Reset state\n", + __func__); + + } else + return -EINVAL; + + return size; +} + +static ssize_t dbmdx_param_addr_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + p->lock(p); + ret = dbmdx_wake(p); + if (ret < 0) { + dev_err(p->dev, "%s: unable to wake\n", __func__); + p->unlock(p); + return ret; + } + + if (p->active_fw == DBMDX_FW_VQE) + ret = dbmdx_send_cmd(p, + DBMDX_VQE_SET_INDIRECT_REG_ADDR_ACCESS_CMD | (u32)val, + NULL); + else + ret = dbmdx_send_cmd(p, + DBMDX_VA_SET_PARAM_ADDR | (u32)val, + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: set paramaddr error\n", __func__); + p->unlock(p); + return ret; + } + + p->unlock(p); + return size; +} + +static ssize_t dbmdx_param_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + u16 val; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + p->lock(p); + ret = dbmdx_wake(p); + if (ret < 0) { + dev_err(p->dev, "%s: unable to wake\n", __func__); + p->unlock(p); + return ret; + } + + if (p->active_fw == DBMDX_FW_VQE) + ret = dbmdx_send_cmd(p, + DBMDX_VQE_GET_INDIRECT_REG_DATA_ACCESS_CMD, + &val); + else + ret = dbmdx_send_cmd(p, DBMDX_VA_GET_PARAM, &val); + + if (ret < 0) { + dev_err(p->dev, "%s: get param error\n", __func__); + p->unlock(p); + return ret; + } + + p->unlock(p); + return snprintf(buf, PAGE_SIZE, "%d\n", (s16)val); +} + +static ssize_t dbmdx_param_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = kstrtol(buf, 0, &val); + if (ret) + return -EINVAL; + + p->lock(p); + ret = dbmdx_wake(p); + if (ret < 0) { + dev_err(p->dev, "%s: unable to wake\n", __func__); + p->unlock(p); + return ret; + } + + if (p->active_fw == DBMDX_FW_VQE) + ret = dbmdx_send_cmd(p, + DBMDX_VQE_SET_INDIRECT_REG_DATA_ACCESS_CMD | (u32)val, + NULL); + else + ret = dbmdx_send_cmd(p, DBMDX_VA_SET_PARAM | (u32)val, NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: set param error\n", __func__); + p->unlock(p); + return ret; + } + + p->unlock(p); + return size; +} + +static ssize_t dbmdx_va_direct_write_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + char *str_p; + char *args = (char *)buf; + u32 reg = 0; + u32 new_value = 0; + bool reg_set = false, value_set = false; + u32 value_to_send = 0; + + int ret = -EINVAL; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + while ((str_p = strsep(&args, " \t")) != NULL) { + + if (!*str_p) + continue; + + if (strncmp(str_p, "reg=", 4) == 0) { + ret = kstrtoul((str_p+4), 0, &val); + if (ret) { + dev_err(p->dev, "%s: bad reg\n", __func__); + ret = -EINVAL; + goto print_usage; + } + reg = (u32)val; + reg_set = true; + continue; + } + if (strncmp(str_p, "value=", 6) == 0) { + ret = kstrtoul((str_p+6), 0, &val); + if (ret) { + dev_err(p->dev, "%s: bad value\n", __func__); + ret = -EINVAL; + goto print_usage; + } + + new_value = (u32)val; + value_set = true; + continue; + } + } + + if (!reg_set) { + dev_err(p->dev, "%s: reg is not set\n", __func__); + ret = -EINVAL; + goto print_usage; + } else if (!value_set) { + dev_err(p->dev, "%s: value is not set\n", __func__); + ret = -EINVAL; + goto print_usage; + } + + p->lock(p); + ret = dbmdx_wake(p); + if (ret < 0) { + dev_err(p->dev, "%s: unable to wake\n", __func__); + p->unlock(p); + return ret; + } + if (reg > 0x00ff) + ret = dbmdx_indirect_register_write(p, reg, (u16)new_value); + else { + value_to_send = DBMDX_VA_CMD_MASK | + ((reg & 0xff) << 16) | (new_value & 0xffff); + + ret = dbmdx_send_cmd(p, (u32)value_to_send, NULL); + } + + if (ret < 0) { + dev_err(p->dev, "%s: direct write error\n", __func__); + p->unlock(p); + return ret; + } + + p->unlock(p); + + dev_dbg(dev, "%s: Reg 0x%04x was set to 0x%04x\n", + __func__, reg, new_value); + + return size; +print_usage: + dev_info(p->dev, + "%s: Usage: reg=regaddr value=newval\n", __func__); + return ret; +} + +static ssize_t dbmdx_va_direct_read_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + char *str_p; + char *args = (char *)buf; + u32 reg = 0; + bool reg_set = false; + u32 value_to_send = 0; + u16 resp; + + int ret = -EINVAL; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + while ((str_p = strsep(&args, " \t")) != NULL) { + + if (!*str_p) + continue; + + if (strncmp(str_p, "reg=", 4) == 0) { + ret = kstrtoul((str_p+4), 0, &val); + if (ret) { + dev_err(p->dev, "%s: bad reg\n", __func__); + ret = -EINVAL; + goto print_usage; + } + reg = (u32)val; + reg_set = true; + continue; + } + } + + if (!reg_set) { + dev_err(p->dev, "%s: reg is not set\n", __func__); + ret = -EINVAL; + goto print_usage; + } + + p->lock(p); + ret = dbmdx_wake(p); + if (ret < 0) { + dev_err(p->dev, "%s: unable to wake\n", __func__); + p->unlock(p); + return ret; + } + + if (reg > 0x00ff) + ret = dbmdx_indirect_register_read(p, reg, &resp); + else { + value_to_send = DBMDX_VA_CMD_MASK | ((reg & 0xff) << 16); + + ret = dbmdx_send_cmd(p, (u32)value_to_send, &resp); + } + + if (ret < 0) { + dev_err(p->dev, "%s: direct read error\n", __func__); + p->unlock(p); + return ret; + } + + p->unlock(p); + + dev_dbg(dev, "%s: Reg 0x%04x value is 0x%04x\n", + __func__, reg, resp); + + return size; +print_usage: + dev_info(p->dev, + "%s: Usage: reg=regaddr\n", __func__); + return ret; +} + +static ssize_t dbmdx_va_mic_mode_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = snprintf(buf, PAGE_SIZE, "%d\n", p->va_active_mic_config); + + return ret; +} + +static ssize_t dbmdx_va_mic_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret = kstrtol(buf, 0, &val); + if (ret) + return -EINVAL; + + dev_dbg(p->dev, "%s: val - %d\n", __func__, (int)val); + + + switch (val) { + case DBMDX_MIC_MODE_DIGITAL_LEFT: + case DBMDX_MIC_MODE_DIGITAL_RIGHT: + case DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_LEFT: + case DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_RIGHT: + case DBMDX_MIC_MODE_ANALOG: + case DBMDX_MIC_MODE_ANALOG_DUAL: +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + case DBMDX_MIC_MODE_DIGITAL_4CH: +#endif + case DBMDX_MIC_MODE_DISABLE: + ret = dbmdx_reconfigure_microphones(p, (int)(val)); + break; + default: + dev_err(p->dev, "%s: unsupported microphone mode %d\n", + __func__, (int)(val)); + ret = -EINVAL; + break; + } + + if (ret < 0) { + dev_err(p->dev, "%s: set microphone mode error\n", __func__); + size = ret; + } + + return size; +} + +static ssize_t dbmdx_va_detection_buffer_channels_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = snprintf(buf, PAGE_SIZE, "%d\n", + p->pdata->detection_buffer_channels); + + return ret; +} + +static ssize_t dbmdx_va_detection_buffer_channels_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret = kstrtol(buf, 0, &val); + if (ret) + return -EINVAL; + + dev_dbg(p->dev, "%s: val - %d\n", __func__, (int)val); + + if (val > MAX_SUPPORTED_CHANNELS) { + dev_err(p->dev, + "%s: invalid detection_buffer_channels value %d\n", + __func__, (int)(val)); + + return -EINVAL; + } + + if (val == p->pdata->detection_buffer_channels) + return size; + + p->pdata->detection_buffer_channels = val; + + ret = dbmdx_reconfigure_microphones(p, p->va_active_mic_config); + + if (ret < 0) { + dev_err(p->dev, "%s: set microphone mode error\n", __func__); + size = ret; + } + + return size; +} + +static ssize_t dbmdx_va_min_samples_chunk_size_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = snprintf(buf, PAGE_SIZE, "%u\n", + p->pdata->min_samples_chunk_size); + + return ret; +} + +static ssize_t dbmdx_va_min_samples_chunk_size_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret = kstrtol(buf, 0, &val); + if (ret) + return -EINVAL; + + dev_dbg(p->dev, "%s: val - %d\n", __func__, (int)val); + + p->pdata->min_samples_chunk_size = (u32)val; + + return size; +} + +static ssize_t dbmdx_va_max_detection_buffer_size_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = snprintf(buf, PAGE_SIZE, "%u\n", + p->pdata->max_detection_buffer_size); + + return ret; +} + +static ssize_t dbmdx_va_max_detection_buffer_size_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret = kstrtol(buf, 0, &val); + if (ret) + return -EINVAL; + + dev_dbg(p->dev, "%s: val - %d\n", __func__, (int)val); + + p->pdata->max_detection_buffer_size = (u32)val; + + return size; +} + +static ssize_t dbmdx_va_retrigger_interval_sec_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = snprintf(buf, PAGE_SIZE, "%u\n", + p->pdata->retrigger_interval_sec); + + return ret; +} + +static ssize_t dbmdx_va_retrigger_interval_sec_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret = kstrtol(buf, 0, &val); + if (ret) + return -EINVAL; + + dev_dbg(p->dev, "%s: val - %d\n", __func__, (int)val); + + p->pdata->retrigger_interval_sec = (u32)val; + + return size; +} + + + +static ssize_t dbmdx_dump_state(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int off = 0; + struct dbmdx_platform_data *pdata; + int i; + + if (!p) + return -EAGAIN; + + pdata = p->pdata; + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tDBMDX Driver Ver:\t%s\n", DRIVER_VERSION); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\t=======Interfaces Dump======\n"); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tMulti Interface Support:\t%s\n", + p->pdata->multi_interface_support ? "ON" : "OFF"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tNumber of supported interfaces:\t%d\n", + p->nr_of_interfaces); + + for (i = 0; i < p->nr_of_interfaces; i++) { + off += snprintf(buf + off, PAGE_SIZE - off, + "\tInterface #%d:\n", + i); + if (p->interfaces[i]->dump) + off += p->interfaces[i]->dump(p->interfaces[i], + buf + off); + } + + if (p->pdata->multi_interface_support) { + off += snprintf(buf + off, PAGE_SIZE - off, + "\t=======VA Interfaces======\n"); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tPreboot:\t%d\n\tBoot:\t%d\n\tCommand:\t%d\n\tDebug:\t%d\n", + p->pdata->va_interfaces[DBMDX_PREBOOT_INTERFACE], + p->pdata->va_interfaces[DBMDX_BOOT_INTERFACE], + p->pdata->va_interfaces[DBMDX_CMD_INTERFACE], + p->pdata->va_interfaces[DBMDX_DEBUG_INTERFACE]); + } + + + /* check for features */ + if (p->pdata->feature_va) { + off += snprintf(buf + off, PAGE_SIZE - off, + "\t=======Initial VA Configuration======\n"); + + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA feature activated\n"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA firmware name: %s\n", pdata->va_firmware_name); + + for (i = 0; i < pdata->va_cfg_values; i++) + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA cfg %8.8x: 0x%8.8x\n", + i, pdata->va_cfg_value[i]); +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + off += snprintf(buf + off, PAGE_SIZE - off, "\n"); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA_NS supported %d\n", pdata->va_ns_supported); + + if (pdata->va_ns_supported) { + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA_NS enabled %d\n", p->va_ns_enabled); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA_NS mic config source: %d\n", + p->pdata->mic_config_source); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA_NS on PCM Streaming enabled %d\n", + p->va_ns_pcm_streaming_enabled); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA_NS active cfg index %d\n", + p->va_ns_cfg_index); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tNumber of VA_NS Configs %d\n", + pdata->va_ns_num_of_configs); + } + + off += snprintf(buf + off, PAGE_SIZE - off, "\n"); + +#endif + for (i = 0; i < VA_MIC_CONFIG_SIZE; i++) + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA mic cfg %8.8x: 0x%8.8x\n", + i, pdata->va_mic_config[i]); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA default mic config: 0x%8.8x\n", + pdata->va_initial_mic_config); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA init digital mic digital gain:\t0x%04X\n", + pdata->va_mic_gain_config[DBMDX_DIGITAL_MIC_DIGITAL_GAIN]); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA init analog mic analog gain:\t\t0x%04X\n", + pdata->va_mic_gain_config[DBMDX_ANALOG_MIC_ANALOG_GAIN]); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA init analog mic digital gain:\t0x%04X\n", + pdata->va_mic_gain_config[DBMDX_ANALOG_MIC_DIGITAL_GAIN]); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tDefault backlog length of %d\n", + pdata->va_backlog_length); + +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + off += snprintf(buf + off, PAGE_SIZE - off, + "\tDefault OKG backlog length of %d\n", + pdata->va_backlog_length_okg); +#endif + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tauto_buffering %d\n", pdata->auto_buffering); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tauto_detection %d\n", pdata->auto_detection); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tdetection_after_buffering %d\n", + pdata->detection_after_buffering); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tsend_uevent_on_detection %d\n", + pdata->send_uevent_on_detection); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tsend_uevent_after_buffering %d\n", + pdata->send_uevent_after_buffering); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tbuffering_timeout %d\n", + pdata->buffering_timeout); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tretrigger interval %d sec\n", + pdata->retrigger_interval_sec); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tpcm streaming mode %d\n", + pdata->pcm_streaming_mode); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tmax_detection_buffer_size %d\n", + pdata->max_detection_buffer_size); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tmin_samples_chunk_size %d\n", + pdata->min_samples_chunk_size); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tdetection_buffer_channels %d\n", + pdata->detection_buffer_channels); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tva_buffering_pcm_rate %u\n", + pdata->va_buffering_pcm_rate); + + } else + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA feature not activated\n"); + + if (pdata->feature_vqe) { + + off += snprintf(buf + off, PAGE_SIZE - off, + "\t=======Initial VQE Configuration======\n"); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVQE feature activated\n"); + + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVQE firmware name: %s\n", + pdata->vqe_firmware_name); + + if (pdata->feature_fw_overlay) + off += snprintf(buf + off, PAGE_SIZE - off, + "\tFirmware overlay activated\n"); + else + off += snprintf(buf + off, PAGE_SIZE - off, + "\tFirmware overlay not activated\n"); + + for (i = 0; i < pdata->vqe_cfg_values; i++) + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVQE cfg %8.8x: 0x%8.8x\n", + i, pdata->vqe_cfg_value[i]); + + for (i = 0; i < pdata->vqe_modes_values; i++) + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVQE mode %8.8x: 0x%8.8x\n", + i, pdata->vqe_modes_value[i]); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVQE TDM bypass config: 0x%8.8x\n", + pdata->vqe_tdm_bypass_config); + + } else + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVQE feature not activated\n"); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\t=======Common Configuration======\n"); + + for (i = 0; i < DBMDX_VA_NR_OF_SPEEDS; i++) + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA speed cfg %8.8x: 0x%8.8x %u %u %u\n", + i, + pdata->va_speed_cfg[i].cfg, + pdata->va_speed_cfg[i].uart_baud, + pdata->va_speed_cfg[i].i2c_rate, + pdata->va_speed_cfg[i].spi_rate); + + + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tmaster-clk-rate of %dHZ\n", + (int)(p->clk_get_rate(p, DBMDX_CLK_MASTER))); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tuart_low_speed_enabled %d\n", + pdata->uart_low_speed_enabled); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tBoot options 0x%8x\n", pdata->boot_options); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tAmodel options 0x%8x\n", pdata->amodel_options); + + off += snprintf(buf + off, PAGE_SIZE - off, "\tVA firmware_id 0x%8x\n", + p->pdata->firmware_id); + + + off += snprintf(buf + off, PAGE_SIZE - off, + "\t=======GPIO======\n"); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\t=====VA GPIO====\n"); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tReset GPIO: 0x%8x\n", p->pdata->gpio_reset); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tWakeup GPIO: 0x%8x\n", p->pdata->gpio_wakeup); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tSV GPIO: 0x%8x\n", p->pdata->gpio_sv); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\twakeup_disabled %d\n", + pdata->wakeup_disabled); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tuse_gpio_for_wakeup %d\n", + pdata->use_gpio_for_wakeup); + + off += snprintf(buf + off, PAGE_SIZE - off, "\tsend_wakeup_seq %d\n", + pdata->send_wakeup_seq); + + off += snprintf(buf + off, PAGE_SIZE - off, "\twakeup_set_value %d\n", + pdata->wakeup_set_value); + + + + return off; +} + +static ssize_t dbmdx_dump_current_state(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int off = 0; + struct dbmdx_platform_data *pdata; + + if (!p) + return -EAGAIN; + + pdata = p->pdata; + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tDBMDX Driver Ver:\t%s\n", DRIVER_VERSION); + + off += snprintf(buf + off, PAGE_SIZE - off, "\tActive firmware:\t%s\n", + p->active_fw == DBMDX_FW_VQE ? + "VQE" : + p->active_fw == DBMDX_FW_VA ? + "VA" : "PRE_BOOT"); + + off += snprintf(buf + off, PAGE_SIZE - off, "\tPower mode:\t\t%s\n", + dbmdx_power_mode_names[p->power_mode]); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tActive Interface :\t%s\n", + p->active_interface == DBMDX_INTERFACE_I2C ? + "I2C" : + p->active_interface == + DBMDX_INTERFACE_SPI ? + "SPI" : + p->active_interface == + DBMDX_INTERFACE_UART ? + "UART" : "NONE"); + + off += snprintf(buf + off, PAGE_SIZE - off, "\tVA Device Ready:\t%s\n", + p->device_ready ? "Yes" : "No"); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA Debug Mode:\t%s\n", + p->va_debug_mode ? "ON" : "OFF"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA Sleep disabled:\t%s\n", + p->sleep_disabled ? "ON" : "OFF"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tRecovery Disabled:\t%s\n", + p->pdata->va_recovery_disabled ? "ON" : "OFF"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tRecovery Times:\t%u\n", + p->recovery_times); +#if IS_ENABLED(DBMDX_KEEP_ALIVE_TIMER) + off += snprintf(buf + off, PAGE_SIZE - off, + "\tKeep Alive Triggers: %d\n", + p->keep_alive_triggers); +#endif + if (p->pdata->feature_va) { + off += snprintf(buf + off, PAGE_SIZE - off, + "\t=======VA Dump==========\n"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\t-------VA Current Settings------\n"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA Backlog_length\t%d\n", + p->pdata->va_backlog_length); +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA OKG Backlog_length\t%d\n", + p->pdata->va_backlog_length_okg); +#endif + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA Active Microphone conf:\t%d\n", + p->va_active_mic_config); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA Cur Microphone conf:\t%d\n", + p->va_current_mic_config); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA Microphones Enabled:\t%s\n", + p->va_flags.microphones_enabled ? "ON" : "OFF"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA Disabling Mics Not Allowed:\t%s\n", + p->va_flags.disabling_mics_not_allowed ? "ON" : "OFF"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA Disabling Mics Blocked:\t%s\n", + p->mic_disabling_blocked ? "ON" : "OFF"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA Audio Channels:\t%d\n", + p->pdata->va_audio_channels); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA PCM Audio Channels:\t%d\n", + p->audio_pcm_channels); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA PCM Channel Operation:\t%d\n", + p->pcm_achannel_op); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA Detection Channel Operation:\t%d\n", + p->detection_achannel_op); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA Detection KFIFO size:\t%d\n", + p->detection_samples_kfifo_buf_size); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA Detection mode:\t%s\n", + p->va_detection_mode == DETECTION_MODE_PHRASE ? + "PASSPHRASE" : + p->va_detection_mode == + DETECTION_MODE_VOICE_ENERGY ? + "VOICE_ENERGY" : + p->va_detection_mode == + DETECTION_MODE_VOICE_COMMAND ? + "VOICE_COMMAND" : "VOICE_DUAL"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA Capture On Detect:\t%s\n", + p->va_capture_on_detect ? "ON" : "OFF"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tSample size:\t\t%d\n", p->audio_mode); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA current digital mic digital gain:\t0x%04X\n", + p->va_cur_digital_mic_digital_gain); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA current analog mic analog gain:\t0x%04X\n", + p->va_cur_analog_mic_analog_gain); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA current analog mic digital gain:\t0x%04X\n", + p->va_cur_analog_mic_digital_gain); + + off += snprintf(buf + off, PAGE_SIZE - off, + "\t-------VA Status------\n"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVA Operational mode:\t%s\n", + dbmdx_state_names[p->va_flags.mode]); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tSV Amodel Support:\t%s\n", + p->sv_a_model_support ? "ON" : "OFF"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tAcoustic model:\t\t%s\n", + p->va_flags.a_model_downloaded_to_fw == 1 ? + "Loaded" : "None"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tAcoustic model size\t%d bytes\n", + p->va_flags.amodel_len); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tSV Recognition mode:\t\t%s\n", + p->va_flags.sv_recognition_mode == + SV_RECOGNITION_MODE_DISABLED ? + "Disabled" : + p->va_flags.sv_recognition_mode == + SV_RECOGNITION_MODE_VOICE_ENERGY ? + "Voice Energy" : "Passphrase/CMD"); +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + off += snprintf(buf + off, PAGE_SIZE - off, + "\tOKG Amodel Support:\t%s\n", + p->okg_a_model_support ? "ON" : "OFF"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tOKG Amodel Enabled:\t%s\n", + p->va_flags.okg_a_model_enabled ? "ON" : "OFF"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tOKG Acoustic model:\t\t%s\n", + p->va_flags.okg_a_model_downloaded_to_fw == 1 ? + "Loaded" : "None"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tOKG Recognition mode:\t\t%s\n", + p->va_flags.okg_recognition_mode == + OKG_RECOGNITION_MODE_ENABLED ? + "Enabled" : "Disabled"); +#endif + off += snprintf(buf + off, PAGE_SIZE - off, + "\tFW VAD TYPE:\t\t%d\n", p->fw_vad_type); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tCurrent PCM rate:\t\t%d\n", + p->current_pcm_rate); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tBuffering:\t\t%s\n", + p->va_flags.buffering ? "ON" : "OFF"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tPCM Streaming Active:\t%s\n", + p->va_flags.pcm_streaming_active ? "ON" : "OFF"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tPCM Worker Active: \t%s\n", + p->va_flags.pcm_worker_active ? "ON" : "OFF"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tIRQ In USE:\t\t%s\n", + p->va_flags.irq_inuse ? "ON" : "OFF"); + } + if (p->pdata->feature_vqe) { + off += snprintf(buf + off, PAGE_SIZE - off, + "\t=======VQE Dump==========\n"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tIn Call:\t\t%s\n", + p->vqe_flags.in_call ? "Yes" : "No"); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVQE Use Case:\t\t%d\n", + p->vqe_flags.use_case); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVQE Speaker Vol Lvl:\t%d\n", + p->vqe_flags.speaker_volume_level); + off += snprintf(buf + off, PAGE_SIZE - off, + "\tVQE VC syscfg:\t\t%d\n", p->vqe_vc_syscfg); + } + + return off; +} + +#define MAX_REGS_NUM 112 /*0x6F + 1*/ +static ssize_t dbmdx_dump_reg_show(struct device *dev, u16 *reg_buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret, i; + u16 val = 0; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + p->lock(p); + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + for (i = 0; i < MAX_REGS_NUM; i++) { + ret = dbmdx_send_cmd(p, (DBMDX_VA_CMD_MASK | i<<16), &val); + if (ret < 0) { + dev_err(p->dev, "%s: get reg %x error\n", + __func__, DBMDX_VA_CMD_MASK | i); + goto out_unlock; + } + + reg_buf[i] = val; + } + +out_unlock: + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + + p->unlock(p); + return ret; +} + +static ssize_t dbmdx_va_regs_dump_state(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int off = 0; + int i; + struct dbmdx_platform_data *pdata; + u16 reg_buf[MAX_REGS_NUM]; + + if (!p) + return -EAGAIN; + + pdata = p->pdata; + + dbmdx_dump_reg_show(dev, ®_buf[0]); + + off += snprintf(buf + off, PAGE_SIZE - off, "\n\n"); + off += snprintf(buf + off, PAGE_SIZE - off, "dbmdx:\n"); + off += snprintf(buf + off, PAGE_SIZE - off, "Registers Dump:\n"); + off += snprintf(buf + off, PAGE_SIZE - off, + "register HEX(dec) : value HEX\n"); + off += snprintf(buf + off, PAGE_SIZE - off, "\n"); + + for (i = 0; i < MAX_REGS_NUM; i++) { + + if (i == 0x40) + off += snprintf(buf + off, PAGE_SIZE - off, + "\nSV parameters direct access registers:\n"); + + off += snprintf(buf + off, PAGE_SIZE - off, + "0x%02X(%02i) : 0x%04X ", i, i, reg_buf[i]); + + if (!((i+1)%4)) + off += snprintf(buf + off, PAGE_SIZE - off, "\n"); + } + + off += snprintf(buf + off, PAGE_SIZE - off, "\n\n"); + + return off; +} + +static ssize_t dbmdx_va_rxsize_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%lu\n", p->rxsize); +} + +static ssize_t dbmdx_va_rxsize_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + unsigned long val; + struct dbmdx_private *p = dev_get_drvdata(dev); + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + if (val % 16 != 0) + return -EINVAL; + + p->rxsize = val; + + return size; +} + +static ssize_t dbmdx_va_rsize_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + + if (!p) + return -EAGAIN; + + return snprintf(buf, PAGE_SIZE, "%u\n", + p->chip->get_read_chunk_size(p)); + +} + +static ssize_t dbmdx_va_rsize_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + unsigned long val; + struct dbmdx_private *p = dev_get_drvdata(dev); + + if (!p) + return -EAGAIN; + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + p->lock(p); + ret = p->chip->set_read_chunk_size(p, (u32)val); + p->unlock(p); + + if (ret < 0) + return -EINVAL; + + return size; +} + +static ssize_t dbmdx_va_wsize_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + + if (!p) + return -EAGAIN; + + + return snprintf(buf, PAGE_SIZE, "%u\n", + p->chip->get_write_chunk_size(p)); +} + +static ssize_t dbmdx_va_wsize_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + unsigned long val; + struct dbmdx_private *p = dev_get_drvdata(dev); + + if (!p) + return -EAGAIN; + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + p->lock(p); + ret = p->chip->set_write_chunk_size(p, (u32)val); + p->unlock(p); + + if (ret < 0) + return -EINVAL; + + return size; +} + +static ssize_t dbmdx_power_mode_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s: %s (%d)\n", + p->active_fw == DBMDX_FW_VA ? "VA" : "VQE", + dbmdx_power_mode_names[p->power_mode], + p->power_mode); +} + +static ssize_t dbmdx_cur_opmode_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s (%x)\n", + dbmdx_state_names[p->va_flags.mode], + p->va_flags.mode); +} + +static ssize_t dbmdx_vqe_ping_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + dev_dbg(p->dev, "%s\n", __func__); + + if (p->active_fw != DBMDX_FW_VQE) + return snprintf(buf, PAGE_SIZE, "VQE firmware not loaded\n"); + + p->lock(p); + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + ret = dbmdx_vqe_alive(p); + + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + + p->unlock(p); + + if (ret != 0) + ret = snprintf(buf, PAGE_SIZE, "VQE firmware dead\n"); + else + ret = snprintf(buf, PAGE_SIZE, "VQE firmware alive\n"); + return ret; +} + +static ssize_t dbmdx_vqe_use_case_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + if (p->active_fw == DBMDX_FW_VQE) { + if (!p->vqe_flags.in_call) + /* special value as used to terminate call */ + return snprintf(buf, PAGE_SIZE, "0x100"); + + return dbmdx_reg_show(dev, + DBMDX_VQE_GET_USE_CASE_CMD, + attr, + buf); + } + + dev_err(p->dev, "%s: VQE firmware not active\n", __func__); + return -EIO; +} + +static int dbmdx_vqe_activate_call(struct dbmdx_private *p, unsigned long val) +{ + int ret; + + dev_dbg(p->dev, "%s: val: 0x%04x\n", __func__, (u16)val); + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_SYSTEM_CONFIG_CMD | + p->vqe_vc_syscfg, + NULL); + if (ret < 0) { + dev_err(p->dev, "%s: error\n", __func__); + goto out_fail; + } + + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_USE_CASE_CMD | val, NULL); + if (ret < 0) { + dev_err(p->dev, "%s: error\n", __func__); + goto out_fail; + } + + p->vqe_flags.in_call = 1; + p->vqe_flags.use_case = val; + +out_fail: + return ret; +} + +static int dbmdx_vqe_change_call_use_case( + struct dbmdx_private *p, unsigned long val) +{ + int ret; + + dev_dbg(p->dev, "%s: val: 0x%04x\n", __func__, (u16)val); + + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_FADE_IN_OUT_CMD | + DBMDX_VQE_SET_FADE_IN_OUT_FADE_OUT_EN, + NULL); + if (ret < 0) { + dev_err(p->dev, "%s: error\n", __func__); + goto out_fail; + } + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_USE_CASE_CMD | val, NULL); + if (ret < 0) { + dev_err(p->dev, "%s: error\n", __func__); + goto out_fail; + } + + p->vqe_flags.use_case = val; + +out_fail: + return ret; +} + +static int dbmdx_vqe_terminate_call(struct dbmdx_private *p, unsigned long val) +{ + int ret; + + dev_dbg(p->dev, "%s: val: 0x%04x\n", __func__, (u16)val); + + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_FADE_IN_OUT_CMD | + DBMDX_VQE_SET_FADE_IN_OUT_FADE_OUT_EN, + NULL); + if (ret < 0) { + dev_err(p->dev, "%s: error FADE_OUT_EN\n", __func__); + goto out_fail; + } + + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_USE_CASE_CMD | + DBMDX_VQE_SET_USE_CASE_CMD_IDLE, + NULL); + if (ret < 0) { + dev_err(p->dev, "%s: error USE_CASE_CMD_IDLE\n", __func__); + goto out_fail; + } + + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_SYSTEM_CONFIG_CMD | + DBMDX_VQE_SET_SYSTEM_CONFIG_PRIMARY_CFG, + NULL); + if (ret < 0) { + dev_err(p->dev, "%s: error _CONFIG_PRIMARY_CFG\n", __func__); + goto out_fail; + } + + ret = dbmdx_send_cmd(p, DBMDX_VQE_SET_HW_TDM_BYPASS_CMD | + DBMDX_VQE_SET_HW_TDM_BYPASS_MODE_1 | + DBMDX_VQE_SET_HW_TDM_BYPASS_FIRST_PAIR_EN, + NULL); + if (ret < 0) { + dev_err(p->dev, + "%s: HW_TDM_BYPASS_MODE_1: sys is not ready\n", + __func__); + goto out_fail; + } + + p->vqe_flags.in_call = 0; + + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + +out_fail: + return ret; +} + +static ssize_t dbmdx_vqe_use_case_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + if (!p) + return -EAGAIN; + + ret = dbmdx_vqe_mode_valid(p, (u32)val); + if (!ret) { + dev_err(p->dev, "%s: Invalid VQE mode 0x%x\n", + __func__, (u32)val); + return -EINVAL; + } + + if (p->active_fw != DBMDX_FW_VQE) { + dev_info(p->dev, "%s: VQE firmware not active, switching\n", + __func__); + if (p->va_flags.mode != DBMDX_IDLE) { + p->lock(p); + ret = dbmdx_set_mode(p, DBMDX_IDLE); + p->unlock(p); + if (ret) + dev_err(p->dev, + "%s: failed to set device to idle mode\n", + __func__); + } + p->lock(p); + ret = dbmdx_switch_to_vqe_firmware(p, 0); + p->unlock(p); + if (ret != 0) { + dev_err(p->dev, "%s: failed switching to VQE mode\n", + __func__); + return -EIO; + } + + } + + dev_info(p->dev, "%s: VQE firmware use case: %lu\n", __func__, val); + + p->lock(p); + + /*Check required operation: Call Activation or Deactivation */ + if (val & DBMDX_VQE_SET_USE_CASE_DE_ACT_MASK) { + if (p->vqe_flags.in_call) + ret = dbmdx_vqe_terminate_call(p, val); + else + /* simply re-ensure the sleep mode */ + ret = dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + } else if (p->vqe_flags.in_call) + /* already in call */ + ret = dbmdx_vqe_change_call_use_case(p, val); + else { + ret = dbmdx_vqe_activate_call(p, val); + } + + if (ret < 0) { + dev_err(p->dev, "%s: error\n", __func__); + goto out_unlock; + } + + ret = size; + +out_unlock: + p->unlock(p); + return ret; +} + + + +static ssize_t dbmdx_vqe_d2syscfg_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return dbmdx_reg_show(dev, DBMDX_VQE_GET_SYSTEM_CONFIG_CMD, + attr, buf); +} + +static ssize_t dbmdx_vqe_d2syscfg_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return dbmdx_reg_store(dev, DBMDX_VQE_SET_SYSTEM_CONFIG_CMD, attr, + buf, size, DBMDX_FW_VQE); +} + +static ssize_t dbmdx_vqe_vc_syscfg_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = snprintf(buf, PAGE_SIZE, "%d\n", p->vqe_vc_syscfg); + + return ret; +} + + +static ssize_t dbmdx_vqe_vc_syscfg_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 0, &val); + if (ret) + return -EINVAL; + + if (!p) + return -EAGAIN; + + if (val > 2) { + dev_err(p->dev, "%s: invalid vqe vc system config value [0,1,2]\n", + __func__); + return -EINVAL; + } + + p->vqe_vc_syscfg = (u32)val; + + return size; +} + + +static ssize_t dbmdx_vqe_hwbypass_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return dbmdx_reg_store(dev, DBMDX_VQE_SET_HW_TDM_BYPASS_CMD, attr, + buf, size, DBMDX_FW_VQE); +} + +static ssize_t dbmdx_vqe_spkvollvl_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return dbmdx_reg_show(dev, DBMDX_VQE_GET_SPK_VOL_LVL_CMD, + attr, buf); +} + +static ssize_t dbmdx_vqe_spkvollvl_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + return dbmdx_reg_store(dev, DBMDX_VQE_SET_SPK_VOL_LVL_CMD, attr, + buf, size, DBMDX_FW_VQE); +} + +static ssize_t dbmdx_wakeup_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + int ret; + int gpio_val; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + if (!dbmdx_can_wakeup(p)) + ret = snprintf(buf, PAGE_SIZE, "No WakeUp GPIO\n"); + else { + gpio_val = gpio_get_value(p->pdata->gpio_wakeup); + ret = snprintf(buf, PAGE_SIZE, "WakeUp GPIO: %d\n", gpio_val); + } + + return ret; +} + +static ssize_t dbmdx_wakeup_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + + dbmdx_force_wake(p); + + return size; +} + +static ssize_t dbmdx_raw_cmd_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + ssize_t read, i, ret = 0; +#define __MAX_RAW_READ 16 + u8 values[__MAX_RAW_READ]; + + read = p->chip->read(p, values, __MAX_RAW_READ); + + if (read > 0) { + for (i = 0; i < read; i++) + ret += snprintf(&buf[ret], PAGE_SIZE, + " %02x", values[i]); + } + + ret += snprintf(&buf[ret], PAGE_SIZE, "\n"); + return ret; +#undef __MAX_RAW_READ +} + +static ssize_t dbmdx_raw_cmd_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct dbmdx_private *p = dev_get_drvdata(dev); + const char *s = " "; + char *mbuf; + char *tok; + ssize_t i = 0, o; + int ret = 0; +#define __RAW_CMD_INPUT 500 + u8 values[__RAW_CMD_INPUT]; + + + if (size > (__RAW_CMD_INPUT * 3)) { + dev_err(p->dev, "%s: too much input (limit is %u bytes)\n", + __func__, __RAW_CMD_INPUT * 3); + return -EINVAL; + } + + mbuf = kstrndup(buf, __RAW_CMD_INPUT * 3, GFP_KERNEL); + if (!mbuf) + return -ENOMEM; + + do { + tok = strsep(&mbuf, s); + if (tok) { + ret = kstrtou8(tok, 16, &values[i]); + if (ret) + break; + i++; + } + } while (tok); + + if (ret == 0) { + o = dbmdx_send_data(p, values, i); + if (o != i) { + dev_err(p->dev, "%s: send %zd/%zd bytes\n", + __func__, o, i); + } + } + return size; +#undef __RAW_CMD_INPUT +} + + +static DEVICE_ATTR(fwver, 0444, + dbmdx_fw_ver_show, NULL); +static DEVICE_ATTR(paramaddr, 0200, + NULL, dbmdx_param_addr_store); +static DEVICE_ATTR(param, 0644, + dbmdx_param_show, dbmdx_param_store); +static DEVICE_ATTR(dump, 0444, + dbmdx_dump_state, NULL); +static DEVICE_ATTR(dump_cur_state, 0444, + dbmdx_dump_current_state, NULL); +static DEVICE_ATTR(io_addr, 0644, + dbmdx_io_addr_show, dbmdx_io_addr_store); +static DEVICE_ATTR(io_value, 0644, + dbmdx_io_value_show, dbmdx_io_value_store); +static DEVICE_ATTR(direct_write, 0200, + NULL, dbmdx_va_direct_write_store); +static DEVICE_ATTR(direct_read, 0200, + NULL, dbmdx_va_direct_read_store); +static DEVICE_ATTR(power_mode, 0444, + dbmdx_power_mode_show, NULL); +static DEVICE_ATTR(reboot, 0200, + NULL, dbmdx_reboot_store); +static DEVICE_ATTR(reset, 0200, + NULL, dbmdx_reset_store); +static DEVICE_ATTR(va_dump_regs, 0444, + dbmdx_va_regs_dump_state, NULL); +static DEVICE_ATTR(va_debug, 0644, + dbmdx_va_debug_show, dbmdx_va_debug_store); +static DEVICE_ATTR(vqe_debug, 0644, + dbmdx_vqe_debug_show, dbmdx_vqe_debug_store); +static DEVICE_ATTR(va_speed_cfg, 0644, + dbmdx_va_speed_cfg_show, dbmdx_va_speed_cfg_store); +static DEVICE_ATTR(va_cfg_values, 0644, + dbmdx_va_cfg_values_show, dbmdx_va_cfg_values_store); +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) +static DEVICE_ATTR(va_ns_enable, 0644, + dbmdx_va_ns_enable_show, + dbmdx_va_ns_enable_store); +static DEVICE_ATTR(va_ns_pcm_streaming_enable, 0644, + dbmdx_va_ns_pcm_streaming_enable_show, + dbmdx_va_ns_pcm_streaming_enable_store); +static DEVICE_ATTR(va_ns_cfg_values, 0644, + dbmdx_va_ns_cfg_values_show, dbmdx_va_ns_cfg_values_store); +#endif +static DEVICE_ATTR(va_mic_cfg, 0644, + dbmdx_va_mic_cfg_show, dbmdx_va_mic_cfg_store); +static DEVICE_ATTR(va_audioconv, 0644, + dbmdx_va_audio_conv_show, dbmdx_va_audio_conv_store); +static DEVICE_ATTR(va_backlog_size, 0644, + dbmdx_va_backlog_size_show, dbmdx_va_backlog_size_store); +static DEVICE_ATTR(va_buffsize, 0644, + dbmdx_va_buffer_size_show, dbmdx_va_buffer_size_store); +static DEVICE_ATTR(va_buffsmps, 0444, + dbmdx_va_buffsmps_show, NULL); +static DEVICE_ATTR(va_capture_on_detect, 0644, + dbmdx_va_capture_on_detect_show, + dbmdx_va_capture_on_detect_store); +static DEVICE_ATTR(va_detection_after_buffering, 0644, + dbmdx_va_detection_after_buffering_show, + dbmdx_va_detection_after_buffering_store); +static DEVICE_ATTR(va_disable_recovery, 0644, + dbmdx_va_disable_recovery_show, + dbmdx_va_disable_recovery_store); +static DEVICE_ATTR(va_digital_gain, 0644, + dbmdx_va_digital_gain_show, + dbmdx_va_digital_gain_store); +static DEVICE_ATTR(va_load_amodel, 0644, + NULL, dbmdx_va_acoustic_model_store); +static DEVICE_ATTR(va_max_sample, 0444, + dbmdx_va_max_sample_show, NULL); +static DEVICE_ATTR(va_analog_micgain, 0644, + dbmdx_va_analog_micgain_show, dbmdx_va_analog_micgain_store); +static DEVICE_ATTR(va_opmode, 0644, + dbmdx_va_opmode_show, dbmdx_opr_mode_store); +static DEVICE_ATTR(va_cur_opmode, 0444, + dbmdx_cur_opmode_show, NULL); +static DEVICE_ATTR(va_mic_mode, 0644, + dbmdx_va_mic_mode_show, dbmdx_va_mic_mode_store); +static DEVICE_ATTR(va_clockcfg, 0644, + dbmdx_va_clockcfg_show, dbmdx_va_clockcfg_store); +static DEVICE_ATTR(va_rsize, 0644, + dbmdx_va_rsize_show, dbmdx_va_rsize_store); +static DEVICE_ATTR(va_rxsize, 0644, + dbmdx_va_rxsize_show, dbmdx_va_rxsize_store); +static DEVICE_ATTR(va_trigger_level, 0644, + dbmdx_va_trigger_level_show, dbmdx_va_trigger_level_store); +static DEVICE_ATTR(va_verif_level, 0644, + dbmdx_va_verification_level_show, + dbmdx_va_verification_level_store); +static DEVICE_ATTR(va_wsize, 0644, + dbmdx_va_wsize_show, dbmdx_va_wsize_store); +static DEVICE_ATTR(va_detection_buffer_channels, 0644, + dbmdx_va_detection_buffer_channels_show, + dbmdx_va_detection_buffer_channels_store); +static DEVICE_ATTR(va_min_samples_chunk_size, 0644, + dbmdx_va_min_samples_chunk_size_show, + dbmdx_va_min_samples_chunk_size_store); +static DEVICE_ATTR(va_max_detection_buffer_size, 0644, + dbmdx_va_max_detection_buffer_size_show, + dbmdx_va_max_detection_buffer_size_store); +static DEVICE_ATTR(va_retrigger_interval_sec, 0644, + dbmdx_va_retrigger_interval_sec_show, + dbmdx_va_retrigger_interval_sec_store); +static DEVICE_ATTR(vqe_ping, 0444, + dbmdx_vqe_ping_show, NULL); +static DEVICE_ATTR(vqe_use_case, 0644, + dbmdx_vqe_use_case_show, dbmdx_vqe_use_case_store); +static DEVICE_ATTR(vqe_d2syscfg, 0644, + dbmdx_vqe_d2syscfg_show, dbmdx_vqe_d2syscfg_store); +static DEVICE_ATTR(vqe_vc_syscfg, 0644, + dbmdx_vqe_vc_syscfg_show, dbmdx_vqe_vc_syscfg_store); +static DEVICE_ATTR(vqe_hwbypass, 0200, + NULL, dbmdx_vqe_hwbypass_store); +static DEVICE_ATTR(vqe_spkvollvl, 0644, + dbmdx_vqe_spkvollvl_show, dbmdx_vqe_spkvollvl_store); +static DEVICE_ATTR(wakeup, 0644, + dbmdx_wakeup_show, dbmdx_wakeup_store); +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) +static DEVICE_ATTR(va_okg_amodel_enable, 0644, + dbmdx_va_okg_amodel_enable_show, dbmdx_okg_amodel_enable_store); +#endif +static DEVICE_ATTR(raw_cmd, 0644, + dbmdx_raw_cmd_show, dbmdx_raw_cmd_store); +static DEVICE_ATTR(va_boot_options, 0644, + dbmdx_va_boot_options_show, + dbmdx_va_boot_options_store); +static DEVICE_ATTR(va_amodel_options, 0644, + dbmdx_va_amodel_options_show, + dbmdx_va_amodel_options_store); + +static struct attribute *dbmdx_va_attributes[] = { + &dev_attr_io_addr.attr, + &dev_attr_io_value.attr, + &dev_attr_direct_write.attr, + &dev_attr_direct_read.attr, + &dev_attr_va_debug.attr, + &dev_attr_va_dump_regs.attr, + &dev_attr_va_cfg_values.attr, +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + &dev_attr_va_ns_cfg_values.attr, + &dev_attr_va_ns_enable.attr, + &dev_attr_va_ns_pcm_streaming_enable.attr, +#endif + &dev_attr_va_mic_cfg.attr, + &dev_attr_va_audioconv.attr, + &dev_attr_va_backlog_size.attr, + &dev_attr_va_buffsize.attr, + &dev_attr_va_buffsmps.attr, + &dev_attr_va_capture_on_detect.attr, + &dev_attr_va_detection_after_buffering.attr, + &dev_attr_va_digital_gain.attr, + &dev_attr_va_load_amodel.attr, + &dev_attr_va_max_sample.attr, + &dev_attr_va_analog_micgain.attr, + &dev_attr_va_opmode.attr, + &dev_attr_va_cur_opmode.attr, + &dev_attr_va_mic_mode.attr, + &dev_attr_va_clockcfg.attr, + &dev_attr_va_rsize.attr, + &dev_attr_va_rxsize.attr, + &dev_attr_va_trigger_level.attr, + &dev_attr_va_verif_level.attr, + &dev_attr_va_wsize.attr, + &dev_attr_va_detection_buffer_channels.attr, + &dev_attr_va_min_samples_chunk_size.attr, + &dev_attr_va_max_detection_buffer_size.attr, + &dev_attr_va_retrigger_interval_sec.attr, + &dev_attr_va_amodel_options.attr, +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + &dev_attr_va_okg_amodel_enable.attr, +#endif + NULL, +}; + +static struct attribute *dbmdx_vqe_attributes[] = { + &dev_attr_vqe_ping.attr, + &dev_attr_vqe_use_case.attr, + &dev_attr_vqe_vc_syscfg.attr, + &dev_attr_vqe_d2syscfg.attr, + &dev_attr_vqe_hwbypass.attr, + &dev_attr_vqe_spkvollvl.attr, + &dev_attr_vqe_debug.attr, + NULL, +}; + +static struct attribute *dbmdx_common_attributes[] = { + &dev_attr_fwver.attr, + &dev_attr_paramaddr.attr, + &dev_attr_param.attr, + &dev_attr_dump.attr, + &dev_attr_dump_cur_state.attr, + &dev_attr_power_mode.attr, + &dev_attr_reboot.attr, + &dev_attr_reset.attr, + &dev_attr_va_speed_cfg.attr, + &dev_attr_va_disable_recovery.attr, + &dev_attr_wakeup.attr, + &dev_attr_raw_cmd.attr, + &dev_attr_va_boot_options.attr, + NULL, +}; + + +static const struct attribute_group dbmdx_common_attribute_group = { + .attrs = dbmdx_common_attributes, +}; + +static const struct attribute_group dbmdx_va_attribute_group = { + /* .name = "VA", */ + .attrs = dbmdx_va_attributes, +}; + +static const struct attribute_group dbmdx_vqe_attribute_group = { + /* .name = "VQE", */ + .attrs = dbmdx_vqe_attributes, +}; + +static int dbmdx_shutdown(struct dbmdx_private *p) +{ + int ret = 0; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return 0; + } + + /* flush pending sv work if any */ + p->va_flags.buffering = 0; + flush_work(&p->sv_work); + + ret = dbmdx_suspend_pcm_streaming_work(p); + if (ret < 0) + dev_err(p->dev, "%s: Failed to suspend PCM Streaming Work\n", + __func__); + + p->lock(p); + + p->device_ready = false; + + p->asleep = false; + + p->active_fw = DBMDX_FW_POWER_OFF_VA; + + p->unlock(p); + + return 0; +} + +static int dbmdx_perform_recovery(struct dbmdx_private *p) +{ + int ret = 0; + int active_fw = p->active_fw; + int current_mode = p->va_flags.mode; + int current_audio_channels; + struct va_flags saved_va_flags; + + dev_info(p->dev, "%s: active FW - %s\n", __func__, + dbmdx_fw_type_to_str(active_fw)); + + p->va_flags.recovery_requested = false; + + p->recovery_times++; + + if (active_fw == DBMDX_FW_VA) { + current_mode = p->va_flags.mode; + current_audio_channels = p->pdata->va_audio_channels; + p->va_flags.buffering = 0; + flush_work(&p->sv_work); + + ret = dbmdx_suspend_pcm_streaming_work(p); + if (ret < 0) + dev_err(p->dev, + "%s: Failed to suspend PCM Streaming Work\n", + __func__); + + memcpy(&saved_va_flags, &(p->va_flags), sizeof(saved_va_flags)); + p->wakeup_release(p); + ret = dbmdx_request_and_load_fw(p, 1, 0, 0); + + } else if (active_fw == DBMDX_FW_POWER_OFF_VA) { + current_mode = p->va_flags.mode; + current_audio_channels = p->pdata->va_audio_channels; + + memcpy(&saved_va_flags, &(p->va_flags), sizeof(saved_va_flags)); + p->wakeup_release(p); + ret = dbmdx_request_and_load_fw(p, 1, 0, 0); + + } else if (active_fw == DBMDX_FW_VQE) { + p->wakeup_release(p); + ret = dbmdx_request_and_load_fw(p, 0, 1, 0); + } else { + p->wakeup_release(p); + ret = dbmdx_request_and_load_fw(p, 0, 1, 0); + } + + if (ret != 0) { + dev_err(p->dev, "%s: Recovery failure\n", __func__); + p->chip->transport_enable(p, false); + return -EIO; + } + + p->wakeup_release(p); + + p->lock(p); + + active_fw = p->active_fw; + + if (active_fw == DBMDX_FW_VA) { + + bool sv_a_model_loaded = saved_va_flags.amodel_len > 0 && + saved_va_flags.a_model_downloaded_to_fw; +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + bool okg_a_model_downloaded_to_fw = + saved_va_flags.okg_a_model_enabled && + saved_va_flags.okg_amodel_len > 0 && + saved_va_flags.okg_a_model_downloaded_to_fw; + bool model_loaded = (sv_a_model_loaded || + okg_a_model_downloaded_to_fw); + + p->va_flags.okg_a_model_enabled = + saved_va_flags.okg_a_model_enabled; + + if (p->va_flags.okg_a_model_enabled) + p->va_flags.okg_a_model_downloaded_to_fw = + saved_va_flags.okg_a_model_downloaded_to_fw; + p->va_flags.okg_recognition_mode = + saved_va_flags.okg_recognition_mode; +#else + bool model_loaded = sv_a_model_loaded; +#endif + p->va_flags.sv_recognition_mode = + saved_va_flags.sv_recognition_mode; + + p->va_flags.pcm_streaming_active = + saved_va_flags.pcm_streaming_active; + + p->va_flags.pcm_streaming_pushing_zeroes = + saved_va_flags.pcm_streaming_pushing_zeroes; + + if (model_loaded) { + int amodel_mode = 0; + unsigned int model_select_mask = 0; + unsigned int model_options_mask = 0; + unsigned int model_custom_params = + p->va_detection_mode_custom_params; + p->unlock(p); + + p->va_flags.auto_detection_disabled = true; +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + /* If SV model is not loaded OKG model should be + * reloaded explicitly, otherwise it will be loaded + * after SV model is reloaded + */ + if (!sv_a_model_loaded) { + amodel_mode = DETECTION_MODE_PHRASE; + model_select_mask = DBMDX_OKG_MODEL_SELECTED; + model_options_mask = + DBMDX_LOAD_MODEL_NO_DETECTION; + if (p->okg_amodel.amodel_loaded) + model_options_mask |= + DBMDX_LOAD_MODEL_FROM_MEMORY; + + amodel_mode |= + ((model_select_mask << 4) & 0x30); + + amodel_mode |= + ((model_options_mask << 8) & 0xf00); + + ret = dbmdx_va_amodel_update(p, amodel_mode); + } else { + amodel_mode = p->va_detection_mode; + model_select_mask = DBMDX_SV_MODEL_SELECTED; + if (okg_a_model_downloaded_to_fw) + model_select_mask |= + DBMDX_OKG_MODEL_SELECTED; + model_options_mask = + DBMDX_LOAD_MODEL_NO_DETECTION; + if (p->primary_amodel.amodel_loaded) + model_options_mask |= + DBMDX_LOAD_MODEL_FROM_MEMORY; + + amodel_mode |= + ((model_select_mask << 4) & 0x30); + + amodel_mode |= + ((model_options_mask << 8) & 0xf00); + + amodel_mode |= + ((model_custom_params << 12) & 0xf000); + + ret = dbmdx_va_amodel_update(p, amodel_mode); + } +#else + amodel_mode = p->va_detection_mode; + model_select_mask = DBMDX_SV_MODEL_SELECTED; + model_options_mask = DBMDX_LOAD_MODEL_NO_DETECTION; + if (p->primary_amodel.amodel_loaded) + model_options_mask |= + DBMDX_LOAD_MODEL_FROM_MEMORY; + + amodel_mode |= ((model_select_mask << 4) & 0x30); + + amodel_mode |= ((model_options_mask << 8) & 0xf00); + + amodel_mode |= ((model_custom_params << 12) & 0xf000); + + ret = dbmdx_va_amodel_update(p, amodel_mode); +#endif + p->va_flags.auto_detection_disabled = false; + + if (ret != 0) { + dev_err(p->dev, + "%s: Failed to reload amodel\n", + __func__); + } + + p->lock(p); + if (current_mode == DBMDX_DETECTION || + current_mode == DBMDX_DETECTION_AND_STREAMING) { + + amodel_mode = p->va_detection_mode; + model_select_mask = 0; + if (saved_va_flags.sv_recognition_mode != + SV_RECOGNITION_MODE_DISABLED) + model_select_mask |= + DBMDX_SV_MODEL_SELECTED; +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + if (saved_va_flags.okg_recognition_mode != + OKG_RECOGNITION_MODE_DISABLED) + model_select_mask |= + DBMDX_OKG_MODEL_SELECTED; +#endif + model_options_mask = + DBMDX_DO_NOT_RELOAD_MODEL; + + amodel_mode |= + ((model_select_mask << 4) & 0x30); + + amodel_mode |= + ((model_options_mask << 8) & 0xf00); + + amodel_mode |= + ((model_custom_params << 12) & 0xf000); + + p->unlock(p); + + ret = dbmdx_va_amodel_update(p, amodel_mode); + + p->lock(p); + + if (ret) { + dev_err(p->dev, + "%s: Failed to trigger detection\n", + __func__); + } + + } else if (current_mode == DBMDX_STREAMING) { + ret = dbmdx_set_mode(p, DBMDX_STREAMING); + + if (ret < 0) { + dev_err(p->dev, + "%s: Failed to set DBMDX_STREAMING mode\n", + __func__); + } + } else + dbmdx_set_power_mode(p, + DBMDX_PM_FALLING_ASLEEP); + } + + } else if (active_fw == DBMDX_FW_VQE) { + + if (p->vqe_flags.in_call && + p->vqe_flags.use_case) { + ret = dbmdx_vqe_activate_call(p, p->vqe_flags.use_case); + if (ret) { + dev_err(p->dev, + "%s: failed to activate call\n", + __func__); + goto out; + } + } + } + + p->device_ready = true; + + ret = dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + if (ret) { + p->chip->transport_enable(p, false); + goto out; + } + +out: + p->unlock(p); + return ret; +} + +#ifndef ALSA_SOC_INTERFACE_NOT_SUPPORTED +/* ------------------------------------------------------------------------ + * Interface functions for platform driver + * ------------------------------------------------------------------------ + */ + +int dbmdx_get_samples(struct snd_soc_codec *codec, char *buffer, + unsigned int samples) +{ +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX_SND_CAPTURE) + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + int avail = kfifo_len(&p->pcm_kfifo); + int samples_avail = avail / p->bytes_per_sample; + int ret; + int err = -1; + +#if IS_ENABLED(DBMDX_VV_DEBUG) + pr_debug("%s Requested %u, Available %d\n", __func__, samples, avail); +#endif + if (p->va_flags.pcm_streaming_pushing_zeroes) + return err; + + if (samples_avail < samples) + return err; + + ret = kfifo_out(&p->pcm_kfifo, + buffer, + samples * p->bytes_per_sample); + + return ret == samples * p->bytes_per_sample ? 0 : err; +} +EXPORT_SYMBOL(dbmdx_get_samples); + +int dbmdx_codec_lock(struct snd_soc_codec *codec) +{ +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX_SND_CAPTURE) + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + + if (!p) + return -EAGAIN; + + if (!atomic_add_unless(&p->audio_owner, 1, 1)) + return -EBUSY; + + return 0; +} +EXPORT_SYMBOL(dbmdx_codec_lock); + +int dbmdx_codec_unlock(struct snd_soc_codec *codec) +{ +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX_SND_CAPTURE) + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + + if (!p) + return -EAGAIN; + + atomic_dec(&p->audio_owner); + return 0; +} +EXPORT_SYMBOL(dbmdx_codec_unlock); + +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX_SND_CAPTURE) + +int dbmdx_start_pcm_streaming(struct snd_soc_codec *codec, + struct snd_pcm_substream *substream) +{ + int ret; + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); + int required_mode = DBMDX_STREAMING; + + if (!p) + return -EAGAIN; + + if (!p->pdata->auto_buffering) { + dev_err(p->dev, "%s: auto_buffering is disabled\n", __func__); + return -EIO; + } + + /* Do not interfere buffering mode, wait till the end + * Just set the flag + */ + if (p->va_flags.mode == DBMDX_BUFFERING) { + dev_dbg(p->dev, "%s: Buffering mode\n", __func__); + p->va_flags.pcm_streaming_active = 1; + p->active_substream = substream; + dev_dbg(p->dev, + "%s: FW in Buffering mode, set the flag and leave\n", + __func__); + return 0; + } + + p->lock(p); + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + ret = -EAGAIN; + goto out_unlock; + } + + if (p->active_fw != DBMDX_FW_VA) { + dev_dbg(p->dev, "%s: VA firmware not active\n", __func__); + ret = -EAGAIN; + p->unlock(p); + goto out; + } + + dev_dbg(p->dev, "%s:\n", __func__); + + p->va_flags.pcm_streaming_active = 0; + + p->unlock(p); + + /* Do not interfere buffering mode , wait till the end + * Just set the flag + */ + if (p->va_flags.mode == DBMDX_BUFFERING) { + p->va_flags.pcm_streaming_active = 1; + p->active_substream = substream; + dev_dbg(p->dev, + "%s: FW in Buffering mode, set the flag and leave\n", + __func__); + return 0; + } else if (p->va_flags.mode == DBMDX_DETECTION) + required_mode = DBMDX_DETECTION_AND_STREAMING; + else + required_mode = DBMDX_STREAMING; + + dev_dbg(p->dev, + "%s: New required streaming mode is %d\n", + __func__, required_mode); + + /* flush pending buffering work if any */ + p->va_flags.buffering = 0; + flush_work(&p->sv_work); + p->va_flags.pcm_worker_active = 0; + flush_work(&p->pcm_streaming_work); + + p->lock(p); + + ret = dbmdx_wake(p); + + if (ret < 0) { + dev_err(p->dev, "%s: unable to wake\n", __func__); + ret = -EINVAL; + goto out_unlock; + } + + ret = dbmdx_set_pcm_rate(p, p->audio_pcm_rate); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set pcm rate\n", __func__); + ret = -EINVAL; + goto out_unlock; + } + + p->va_flags.pcm_streaming_active = 1; + p->active_substream = substream; + + ret = dbmdx_set_mode(p, required_mode); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set mode %d\n", + __func__, required_mode); + + dbmdx_set_pcm_rate(p, p->pdata->va_buffering_pcm_rate); + p->va_flags.pcm_streaming_active = 0; + ret = -EINVAL; + goto out_unlock; + } + +out_unlock: + p->unlock(p); + + if (ret < 0 && !p->pdata->va_recovery_disabled) { + + int recovery_res; + + if (!(p->va_flags.recovery_requested) && + (p->device_ready && + (dbmdx_va_alive_with_lock(p) == 0))) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + goto out; + } + + dev_err(p->dev, "%s: Performing recovery #1\n", __func__); + p->va_flags.pcm_streaming_active = 0; + p->active_substream = NULL; + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + goto out; + } + + p->lock(p); + + ret = dbmdx_set_pcm_rate(p, p->audio_pcm_rate); + + if (ret == 0) { + + p->va_flags.pcm_streaming_active = 1; + p->active_substream = substream; + + ret = dbmdx_set_mode(p, required_mode); + + if (ret == 0) { + dev_err(p->dev, + "%s: PCM Streaming was started after succesfull recovery\n", + __func__); + p->unlock(p); + goto out; + } + + } + + p->unlock(p); + + if (dbmdx_va_alive_with_lock(p) == 0) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + goto out; + } + + dev_err(p->dev, "%s: Performing recovery #2\n", __func__); + + p->va_flags.pcm_streaming_active = 0; + p->active_substream = NULL; + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + goto out; + } + + } + +out: + return ret; +} +EXPORT_SYMBOL(dbmdx_start_pcm_streaming); + +int dbmdx_stop_pcm_streaming(struct snd_soc_codec *codec) +{ + int ret; + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); + int required_mode; + + if (!p) + return -EAGAIN; + + if (!p->pdata->auto_buffering) { + dev_err(p->dev, "%s: auto_buffering is disabled\n", __func__); + return -EIO; + } + + /* Treat special case when buffering is active before lock */ + if (p->va_flags.mode == DBMDX_BUFFERING) { + dev_dbg(p->dev, "%s: Buffering case\n", __func__); + p->va_flags.pcm_streaming_active = 0; + p->va_flags.pcm_worker_active = 0; + flush_work(&p->pcm_streaming_work); + p->active_substream = NULL; + dev_dbg(p->dev, + "%s: FW in Buffering mode, set the flag and leave\n", + __func__); + return 0; + } + + p->lock(p); + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + ret = -EAGAIN; + goto out_unlock; + } + + if (p->active_fw != DBMDX_FW_VA) { + dev_dbg(p->dev, "%s: VA firmware not active\n", __func__); + ret = -EAGAIN; + p->unlock(p); + return ret; + } + + dev_dbg(p->dev, "%s:\n", __func__); + + p->va_flags.pcm_streaming_active = 0; + + p->unlock(p); + + /* flush pending work if any */ + p->va_flags.pcm_worker_active = 0; + flush_work(&p->pcm_streaming_work); + p->active_substream = NULL; + + p->lock(p); + + /* Do not interfere buffering mode, wait till the end + * Just set the flag + */ + if (p->va_flags.mode == DBMDX_BUFFERING) { + p->va_flags.pcm_streaming_active = 0; + dev_dbg(p->dev, + "%s: FW in Buffering mode, set the flag and leave\n", + __func__); + ret = 0; + goto out_unlock; + } else if (p->va_flags.mode == DBMDX_DETECTION_AND_STREAMING) + required_mode = DBMDX_DETECTION; + else + required_mode = DBMDX_IDLE; + + dev_dbg(p->dev, + "%s: New required mode after streaming is stopped is %d\n", + __func__, required_mode); + + + ret = dbmdx_set_mode(p, required_mode); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set mode %d\n", __func__, required_mode); + dbmdx_set_pcm_rate(p, p->pdata->va_buffering_pcm_rate); + ret = -EINVAL; + goto out_unlock; + } + + ret = dbmdx_set_pcm_rate(p, p->pdata->va_buffering_pcm_rate); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set pcm rate\n", __func__); + ret = -EINVAL; + goto out_unlock; + } + + /* disable transport (if configured) so the FW goes into best power + * saving mode (only if no active pcm streaming in background) + */ + if (required_mode == DBMDX_DETECTION) { + p->chip->transport_enable(p, false); +#if IS_ENABLED(DBMDX_KEEP_ALIVE_TIMER) + if (p->pdata->retrigger_interval_sec && + p->keep_alive_timer_created) { + ret = arm_keep_alive_timer(p); + dev_dbg(p->dev, "%s:Retrigger is scheduled in %u sec\n", + __func__, + p->pdata->retrigger_interval_sec); + } +#endif + } + +out_unlock: + p->unlock(p); + return ret; +} +EXPORT_SYMBOL(dbmdx_stop_pcm_streaming); + +#endif + +/* ------------------------------------------------------------------------ + * Codec driver section + * ------------------------------------------------------------------------ + */ + +#define DUMMY_REGISTER 0 + +static int dbmdx_dai_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + int ret = 0; + struct snd_soc_codec *codec = dai->codec; + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); + + int channels; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + ret = -EAGAIN; + goto out; + } + + if (p->active_fw != DBMDX_FW_VA) { + dev_dbg(p->dev, "%s: VA firmware not active\n", __func__); + ret = -EAGAIN; + goto out; + } + + dev_dbg(p->dev, "%s:\n", __func__); + + channels = params_channels(params); + p->audio_pcm_channels = channels; + + if (channels == p->pdata->va_audio_channels) + p->pcm_achannel_op = AUDIO_CHANNEL_OP_COPY; + else { + if (channels == 1 && p->pdata->va_audio_channels == 2) + p->pcm_achannel_op = + AUDIO_CHANNEL_OP_TRUNCATE_2_TO_1; + else if (channels == 2 && p->pdata->va_audio_channels == 1) + p->pcm_achannel_op = + AUDIO_CHANNEL_OP_DUPLICATE_1_TO_2; +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + else if (channels == 1 && p->pdata->va_audio_channels == 4) + p->pcm_achannel_op = + AUDIO_CHANNEL_OP_TRUNCATE_4_TO_1; + else if (channels == 2 && p->pdata->va_audio_channels == 4) + p->pcm_achannel_op = + AUDIO_CHANNEL_OP_TRUNCATE_4_TO_2; + else if (channels == 4 && p->pdata->va_audio_channels == 1) + p->pcm_achannel_op = + AUDIO_CHANNEL_OP_DUPLICATE_1_TO_4; + else if (channels == 4 && p->pdata->va_audio_channels == 2) + p->pcm_achannel_op = + AUDIO_CHANNEL_OP_DUPLICATE_2_TO_4; +#endif + else { + dev_err(p->dev, + "%s: DAI channels %d not matching hw channels %d\n", + __func__, channels, p->pdata->va_audio_channels); + ret = -EINVAL; + goto out; + } + } + + dev_info(p->dev, "%s: DAI channels %d, Channel operation set to %d\n", + __func__, channels, p->pcm_achannel_op); + + switch (params_format(params)) { + case SNDRV_PCM_FORMAT_S16_LE: + dev_dbg(p->dev, "%s: set pcm format: SNDRV_PCM_FORMAT_S16_LE\n", + __func__); + break; + default: + ret = -EINVAL; + } + + if (ret) { + dev_err(p->dev, "%s: failed to set pcm format\n", + __func__); + goto out; + } + + switch (params_rate(params)) { +#if IS_ENABLED(DBMDX_PCM_RATE_8000_SUPPORTED) + case 8000: + /* Fall through */ +#endif + case 16000: + /* Fall through */ +#if IS_ENABLED(DBMDX_PCM_RATE_32000_SUPPORTED) + case 32000: + /* Fall through */ +#endif +#if IS_ENABLED(DBMDX_PCM_RATE_44100_SUPPORTED) + case 44100: + /* Fall through */ +#endif + case 48000: + p->audio_pcm_rate = params_rate(params); + dev_dbg(p->dev, "%s: set pcm rate: %u\n", + __func__, params_rate(params)); + break; + default: + ret = -EINVAL; + } + + if (ret) { + dev_err(p->dev, "%s: failed to set pcm rate: %u\n", + __func__, params_rate(params)); + goto out; + } + +out: + return ret; +} + +static struct snd_soc_dai_ops dbmdx_dai_ops = { + .hw_params = dbmdx_dai_hw_params, +}; + +/* DBMDX codec DAI: */ +static struct snd_soc_dai_driver dbmdx_va_dais[] = { + { + .name = "DBMDX_codec_dai", + .capture = { + .stream_name = "vs_buffer", + .channels_min = 1, + .channels_max = MAX_SUPPORTED_CHANNELS, + .rates = +#if IS_ENABLED(DBMDX_PCM_RATE_8000_SUPPORTED) + SNDRV_PCM_RATE_8000 | +#endif + SNDRV_PCM_RATE_16000 | +#if IS_ENABLED(DBMDX_PCM_RATE_32000_SUPPORTED) + SNDRV_PCM_RATE_32000 | +#endif +#if IS_ENABLED(DBMDX_PCM_RATE_32000_SUPPORTED) + SNDRV_PCM_RATE_44100 | +#endif + SNDRV_PCM_RATE_48000, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + }, + .ops = &dbmdx_dai_ops, + }, +}; + +static struct snd_soc_dai_driver dbmdx_vqe_dais[] = { + { + .name = "dbmdx_i2s0", + .id = DBMDX_I2S0, + .playback = { + .stream_name = "I2S0 Playback", + .channels_min = 2, + .channels_max = 2, + .rates = DBMDX_I2S_RATES, + .formats = DBMDX_I2S_FORMATS, + }, + .capture = { + .stream_name = "I2S0 Capture", + .channels_min = 2, + .channels_max = 2, + .rates = DBMDX_I2S_RATES, + .formats = DBMDX_I2S_FORMATS, + }, + .ops = &dbmdx_i2s_dai_ops, + }, + { + .name = "dbmdx_i2s1", + .id = DBMDX_I2S1, + .playback = { + .stream_name = "I2S1 Playback", + .channels_min = 2, + .channels_max = 2, + .rates = DBMDX_I2S_RATES, + .formats = DBMDX_I2S_FORMATS, + }, + .capture = { + .stream_name = "I2S1 Capture", + .channels_min = 2, + .channels_max = 2, + .rates = DBMDX_I2S_RATES, + .formats = DBMDX_I2S_FORMATS, + }, + .ops = &dbmdx_i2s_dai_ops, + }, + { + .name = "dbmdx_i2s2", + .id = DBMDX_I2S2, + .playback = { + .stream_name = "I2S2 Playback", + .channels_min = 2, + .channels_max = 2, + .rates = DBMDX_I2S_RATES, + .formats = DBMDX_I2S_FORMATS, + }, + .capture = { + .stream_name = "I2S2 Capture", + .channels_min = 2, + .channels_max = 2, + .rates = DBMDX_I2S_RATES, + .formats = DBMDX_I2S_FORMATS, + }, + .ops = &dbmdx_i2s_dai_ops, + }, + { + .name = "dbmdx_i2s3", + .id = DBMDX_I2S3, + .playback = { + .stream_name = "I2S3 Playback", + .channels_min = 2, + .channels_max = 2, + .rates = DBMDX_I2S_RATES, + .formats = DBMDX_I2S_FORMATS, + }, + .capture = { + .stream_name = "I2S3 Capture", + .channels_min = 2, + .channels_max = 2, + .rates = DBMDX_I2S_RATES, + .formats = DBMDX_I2S_FORMATS, + }, + .ops = &dbmdx_i2s_dai_ops, + }, +}; + +/* ASoC controls */ +static unsigned int dbmdx_dev_read(struct snd_soc_codec *codec, + unsigned int reg) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + int ret; + u16 val = 0; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + p->lock(p); + + /* VA controls */ + if (p->active_fw != DBMDX_FW_VA) + goto out_unlock; + + if (reg == DUMMY_REGISTER) + goto out_unlock; + + /* just return 0 - the user needs to wakeup first */ + if (dbmdx_sleeping(p)) { + dev_err(p->dev, "%s: device sleeping\n", __func__); + goto out_unlock; + } + + if (p->va_flags.mode == DBMDX_DETECTION) { + dev_dbg(p->dev, "%s: device in detection state\n", __func__); + goto out_unlock; + } + + dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + + ret = dbmdx_send_cmd(p, reg, &val); + if (ret < 0) + dev_err(p->dev, "%s: read 0x%x error\n", __func__, reg); + + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + +out_unlock: + p->unlock(p); + return (unsigned int)val; +} + +static int dbmdx_dev_write(struct snd_soc_codec *codec, unsigned int reg, + unsigned int val) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + int ret = -EIO; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + dev_dbg(p->dev, "%s: ------- VA control ------\n", __func__); + if (p->active_fw != DBMDX_FW_VA) { + dev_dbg(p->dev, "%s: VA firmware not active\n", __func__); + goto out; + } + + p->lock(p); + + ret = dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + if (reg == DUMMY_REGISTER) + goto out_unlock; + + ret = dbmdx_send_cmd(p, (reg << 16) | (val & 0xffff), NULL); + if (ret < 0) + dev_err(p->dev, "%s: write 0x%x to 0x%x error\n", + __func__, val, reg); + +out_unlock: + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + p->unlock(p); +out: + return ret; +} + +static int dbmdx_va_control_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + unsigned short val, reg = mc->reg; + int max = mc->max; + int mask = (1 << fls(max)) - 1; + int ret; + unsigned int va_reg = DBMDX_VA_CMD_MASK | ((reg & 0xff) << 16); +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + p->lock(p); + + /* VA controls */ + if (p->active_fw != DBMDX_FW_VA) { + ucontrol->value.integer.value[0] = 0; + dev_dbg(p->dev, "%s: VA firmware not active\n", __func__); + goto out_unlock; + } + + ret = dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + if (ret < 0) { + dev_err(p->dev, "%s: failed to set PM_ACTIVE\n", __func__); + ret = -EINVAL; + goto out_unlock; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_CMD_MASK | ((reg & 0xff) << 16), + &val); + if (ret < 0) + dev_err(p->dev, "%s: read 0x%x error\n", __func__, reg); + + val &= mask; + + if (va_reg == DBMDX_VA_DIGITAL_GAIN) + val = (unsigned short)((short)val + DIGITAL_GAIN_TLV_SHIFT); + + ucontrol->value.integer.value[0] = val; + +out_unlock: + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + p->unlock(p); + + return 0; +} + +static int dbmdx_va_update_reg(struct dbmdx_private *p, + unsigned short reg, unsigned short val) +{ + int ret; + unsigned int va_reg = DBMDX_VA_CMD_MASK | ((reg & 0xff) << 16); + + p->lock(p); + + ret = dbmdx_set_power_mode(p, DBMDX_PM_ACTIVE); + if (ret < 0) { + dev_err(p->dev, "%s: failed to set PM_ACTIVE\n", __func__); + ret = -EINVAL; + goto out_unlock; + } + + if (va_reg == DBMDX_VA_AUDIO_HISTORY) { + ret = dbmdx_set_backlog_len(p, val); + if (ret < 0) { + dev_err(p->dev, "%s: set history error\n", __func__); + ret = -EINVAL; + goto out_unlock; + } + } else if (va_reg == DBMDX_VA_DIGITAL_GAIN) { + short sval = ((short)val - DIGITAL_GAIN_TLV_SHIFT) & 0x0fff; + + ret = dbmdx_send_cmd(p, va_reg | sval, NULL); + if (ret < 0) { + dev_err(p->dev, "%s: write 0x%x to 0x%x error\n", + __func__, val, reg); + ret = -EINVAL; + goto out_unlock; + } + + if (p->va_active_mic_config != DBMDX_MIC_MODE_ANALOG) + p->va_cur_digital_mic_digital_gain = (int)sval; + else + p->va_cur_analog_mic_digital_gain = (int)sval; + + } else if (va_reg == DBMDX_VA_ANALOG_MIC_GAIN) { + ret = dbmdx_send_cmd(p, va_reg | (val & 0xffff), NULL); + if (ret < 0) { + dev_err(p->dev, "%s: write 0x%x to 0x%x error\n", + __func__, val, reg); + ret = -EINVAL; + goto out_unlock; + } + p->va_cur_analog_mic_analog_gain = (int)val; + } else { + ret = dbmdx_send_cmd(p, va_reg | (val & 0xffff), NULL); + if (ret < 0) { + dev_err(p->dev, "%s: write 0x%x to 0x%x error\n", + __func__, val, reg); + ret = -EINVAL; + goto out_unlock; + } + } + + ret = 0; + +out_unlock: + dbmdx_set_power_mode(p, DBMDX_PM_FALLING_ASLEEP); + p->unlock(p); + return ret; +} + + +static int dbmdx_va_control_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + unsigned short val = ucontrol->value.integer.value[0]; + unsigned short reg = mc->reg; + int max = mc->max; + int mask = (1 << fls(max)) - 1; + int ret; +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + dev_dbg(p->dev, "%s: ------- VA control ------\n", __func__); + if (p->active_fw != DBMDX_FW_VA) { + dev_dbg(p->dev, "%s: VA firmware not active\n", __func__); + return -EAGAIN; + } + + val &= mask; + + ret = dbmdx_va_update_reg(p, reg, val); + + if (ret < 0 && !p->pdata->va_recovery_disabled) { + + int recovery_res; + + if (!(p->va_flags.recovery_requested) && + (p->device_ready && + (dbmdx_va_alive_with_lock(p) == 0))) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + goto out; + } + + dev_err(p->dev, "%s: Performing recovery #1\n", __func__); + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + goto out; + } + + ret = dbmdx_va_update_reg(p, reg, val); + + if (ret == 0) { + dev_err(p->dev, + "%s: Reg. was updated after succesfull recovery\n", + __func__); + goto out; + } + + if (dbmdx_va_alive_with_lock(p) == 0) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + goto out; + } + + dev_err(p->dev, "%s: Performing recovery #2\n", __func__); + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + goto out; + } + + } +out: + return ret; +} + +static int dbmdx_vqe_use_case_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + unsigned short val; + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + p->lock(p); + + if (p->active_fw != DBMDX_FW_VQE) { + ucontrol->value.integer.value[0] = 5; + dev_dbg(p->dev, "%s: VQE firmware not active\n", __func__); + goto out_unlock; + } + + if (dbmdx_sleeping(p)) { + dev_dbg(p->dev, "%s: device sleeping\n", __func__); + goto out_unlock; + } + + ret = dbmdx_send_cmd(p, DBMDX_VQE_GET_USE_CASE_CMD, &val); + if (ret < 0) + dev_err(p->dev, "%s: read 0x%x error\n", + __func__, DBMDX_VQE_GET_USE_CASE_CMD); + + /* TODO: check this */ + ucontrol->value.integer.value[0] = (val == 0xffff ? 0 : val); + +out_unlock: + p->unlock(p); + return 0; +} + +static int dbmdx_vqe_use_case_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + unsigned short val = ucontrol->value.integer.value[0]; + int ret; + int reg = 0; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = dbmdx_vqe_mode_valid(p, (u32)val); + if (!ret) { + dev_err(p->dev, "%s: Invalid VQE mode 0x%x\n", + __func__, (u32)val); + return -EINVAL; + } + + if (p->active_fw != DBMDX_FW_VQE) { + dev_info(p->dev, "%s: VQE firmware not active, switching\n", + __func__); + p->lock(p); + ret = dbmdx_switch_to_vqe_firmware(p, 0); + p->unlock(p); + if (ret != 0) { + dev_info(p->dev, + "%s: Error switching to VQE firmware\n", + __func__); + return -EIO; + } + + } + + reg += (DBMDX_VQE_SET_CMD_OFFSET >> 16); + + p->lock(p); + + ret = dbmdx_vqe_set_use_case(p, val); + if (ret == 0) + ucontrol->value.integer.value[0] = val; + + p->unlock(p); + + return 0; +} + +/* Operation modes */ +static int dbmdx_operation_mode_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + unsigned short val; + int ret = 0; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + p->lock(p); + + if (p->active_fw != DBMDX_FW_VA) { + ucontrol->value.integer.value[0] = 6; + dev_dbg(p->dev, "%s: VA firmware not active\n", __func__); + goto out_unlock; + } + + val = p->va_flags.mode; + + if (dbmdx_sleeping(p)) + goto out_report_mode; + + if (p->va_flags.mode == DBMDX_DETECTION) { + dev_dbg(p->dev, "%s: device in detection state\n", __func__); + goto out_report_mode; + } + + if (p->va_flags.mode == DBMDX_STREAMING || + p->va_flags.mode == DBMDX_DETECTION_AND_STREAMING) { + dev_dbg(p->dev, "%s: Device in streaming mode\n", __func__); + val = DBMDX_DETECTION; + goto out_report_mode; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_OPR_MODE, &val); + if (ret < 0) { + dev_err(p->dev, "%s: failed to read DBMDX_VA_OPR_MODE\n", + __func__); + goto out_unlock; + } + + +out_report_mode: + if (val == DBMDX_SLEEP_PLL_ON) + ucontrol->value.integer.value[0] = 1; + else if (val == DBMDX_SLEEP_PLL_OFF) + ucontrol->value.integer.value[0] = 2; + else if (val == DBMDX_HIBERNATE) + ucontrol->value.integer.value[0] = 3; + else if (val == DBMDX_DETECTION) + ucontrol->value.integer.value[0] = 4; + else if (val == DBMDX_BUFFERING) + ucontrol->value.integer.value[0] = 5; + else if (val == DBMDX_IDLE) + ucontrol->value.integer.value[0] = 0; + else + dev_err(p->dev, "%s: unknown operation mode: %u\n", + __func__, val); + +out_unlock: + p->unlock(p); + + return ret; +} + +static int dbmdx_operation_mode_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + int ret = 0; + bool to_suspend_pcm_streaming = true; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + dev_dbg(p->dev, "%s: ------- VA control ------\n", __func__); + if (p->active_fw != DBMDX_FW_VA) { + dev_dbg(p->dev, "%s: VA firmware not active\n", __func__); + goto out; + } + + /* flush pending sv work if any */ + p->va_flags.buffering = 0; + flush_work(&p->sv_work); + + p->lock(p); + + if (ucontrol->value.integer.value[0] == 0) + ret = dbmdx_set_mode(p, DBMDX_IDLE); + else if (ucontrol->value.integer.value[0] == 1) + ret = dbmdx_set_mode(p, DBMDX_SLEEP_PLL_ON); + else if (ucontrol->value.integer.value[0] == 2) + ret = dbmdx_set_mode(p, DBMDX_SLEEP_PLL_OFF); + else if (ucontrol->value.integer.value[0] == 3) + ret = dbmdx_set_mode(p, DBMDX_HIBERNATE); + else if (ucontrol->value.integer.value[0] == 4) { + /* default detection mode - VT, i.e. PHRASE */ + p->va_detection_mode = DETECTION_MODE_PHRASE; + to_suspend_pcm_streaming = false; + ret = dbmdx_trigger_detection(p); + } else if (ucontrol->value.integer.value[0] == 5) { + ret = dbmdx_set_mode(p, DBMDX_BUFFERING); + to_suspend_pcm_streaming = false; + } else { + ret = -EINVAL; + p->unlock(p); + return ret; + } + + p->unlock(p); + + if (to_suspend_pcm_streaming) { + + int ret1; + + ret1 = dbmdx_suspend_pcm_streaming_work(p); + + if (ret < 0) + dev_err(p->dev, + "%s: Failed to suspend PCM Streaming Work\n", + __func__); + } + + if (ret < 0 && !p->pdata->va_recovery_disabled) { + + int recovery_res; + + if (!(p->va_flags.recovery_requested) && + (p->device_ready && + (dbmdx_va_alive_with_lock(p) == 0))) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + goto out; + } + + dev_err(p->dev, "%s: Performing recovery #1\n", __func__); + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + goto out; + } + + p->lock(p); + + if (ucontrol->value.integer.value[0] == 0) + ret = dbmdx_set_mode(p, DBMDX_IDLE); + else if (ucontrol->value.integer.value[0] == 1) + ret = dbmdx_set_mode(p, DBMDX_SLEEP_PLL_ON); + else if (ucontrol->value.integer.value[0] == 2) + ret = dbmdx_set_mode(p, DBMDX_SLEEP_PLL_OFF); + else if (ucontrol->value.integer.value[0] == 3) + ret = dbmdx_set_mode(p, DBMDX_HIBERNATE); + else if (ucontrol->value.integer.value[0] == 4) { + /* default detection mode - VT, i.e. PHRASE */ + p->va_detection_mode = DETECTION_MODE_PHRASE; + ret = dbmdx_trigger_detection(p); + } else if (ucontrol->value.integer.value[0] == 5) + ret = dbmdx_set_mode(p, DBMDX_BUFFERING); + + p->unlock(p); + + if (ret == 0) { + dev_err(p->dev, + "%s: Op. Mode was updated after succesfull recovery\n", + __func__); + goto out; + } + + if (dbmdx_va_alive_with_lock(p) == 0) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + goto out; + } + + dev_err(p->dev, "%s: Performing recovery #2\n", __func__); + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + goto out; + } + + } +out: + return ret; +} + +static const char *const dbmdx_vqe_use_case_texts[] = { + "Idle", + "HS_NB", + "HS_WB", + "HF_NB", + "HF_WB", + "Not_active", +}; + +static const struct soc_enum dbmdx_vqe_use_case_enum = + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dbmdx_vqe_use_case_texts), + dbmdx_vqe_use_case_texts); + +static const char *const dbmdx_operation_mode_texts[] = { + "Idle", + "Sleep_pll_on", + "Sleep_pll_off", + "Hibernate", + "Detection", + "Buffering", + "Not_active", +}; + +static const struct soc_enum dbmdx_operation_mode_enum = + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dbmdx_operation_mode_texts), + dbmdx_operation_mode_texts); + +static const unsigned int dbmdx_digital_gain_tlv[] = { + TLV_DB_RANGE_HEAD(1), + DIGITAL_GAIN_TLV_MIN, DIGITAL_GAIN_TLV_MAX, + TLV_DB_SCALE_ITEM(-6000, 50, 0), +}; + +static int dbmdx_amodel_load_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + ucontrol->value.integer.value[0] = DETECTION_MODE_MAX + 1; + return 0; +} + +static int dbmdx_amodel_load_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + unsigned short value = ucontrol->value.integer.value[0]; + int ret; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + ret = dbmdx_va_amodel_update(p, value); + + if (ret < 0 && ret != -EINVAL && ret != -ENOENT && + !p->pdata->va_recovery_disabled) { + int recovery_res; + + if (!(p->va_flags.recovery_requested) && + (p->device_ready && + (dbmdx_va_alive_with_lock(p) == 0))) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + goto out; + } + + dev_err(p->dev, "%s: Performing recovery #1\n", __func__); + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + goto out; + } + + ret = dbmdx_va_amodel_update(p, value); + + if (ret == 0) { + dev_err(p->dev, + "%s: Amodel was loaded after succesfull recovery\n", + __func__); + goto out; + } + + if (p->device_ready && (dbmdx_va_alive_with_lock(p) == 0)) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + goto out; + } + + dev_err(p->dev, "%s: Performing recovery #2\n", __func__); + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + goto out; + } + + } +out: + return ret; +} + +#if IS_ENABLED(EXTERNAL_SOC_AMODEL_LOADING_ENABLED) +#if IS_ENABLED(SOC_BYTES_EXT_HAS_KCONTROL_FIELD) +static int dbmdx_external_amodel_put(struct snd_kcontrol *kcontrol, + const unsigned int __user *bytes, + unsigned int size) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif +#else /* SOC_BYTES_EXT_HAS_KCONTROL_FIELD */ +static int dbmdx_external_amodel_put(const unsigned int __user *bytes, + unsigned int size) +{ + struct dbmdx_private *p = dbmdx_data; +#endif /* SOC_BYTES_EXT_HAS_KCONTROL_FIELD */ + int ret = 0; + char *data_buf; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + /* Buffer format is: + * 8B:TLV Header + 1B:Model type + 1B:Model Options + 1B:Number of files + * 4B:1st File Len + 1st File Data + [4B:2nd File Len + 2nd File Data].. + */ +#if IS_ENABLED(SOC_TLV_HEADER_ENABLED) + if (size < 15) { +#else + if (size < 9) { +#endif + dev_err(p->dev, "%s: Header is too short\n", __func__); + return -EINVAL; + } + + if (size > MAX_AMODEL_SIZE) { + dev_err(p->dev, "%s: Size exceeds max amodel size\n", __func__); + return -EINVAL; + } + + data_buf = vmalloc(MAX_AMODEL_SIZE); + + if (!data_buf) { + dev_err(p->dev, "%s: no data_buf\n", __func__); + ret = -ENOMEM; + goto out_mem; + } + + dev_info(p->dev, "%s: Buffer size is %d\n", __func__, size); + +#if IS_ENABLED(SOC_TLV_HEADER_ENABLED) + /* Skips the TLV header. */ + bytes += 2; +#endif + if (copy_from_user(data_buf, bytes, size)) { + dev_err(p->dev, + "%s: Error during copying data from user\n", __func__); + ret = -EFAULT; + goto out_mem; + } + + ret = dbmdx_acoustic_model_build_from_external(p, data_buf, size); + if (ret < 0) { + dev_err(p->dev, + "%s: Error building amodel from provided buffer\n", + __func__); + return -EFAULT; + } + +out_mem: + vfree(data_buf); + return ret; + +} +#endif + +static int dbmdx_wordid_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + int ret = 0; + + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + + /* VA controls */ + if (p->active_fw != DBMDX_FW_VA) { + ucontrol->value.integer.value[0] = 0; + dev_dbg(p->dev, "%s: VA firmware not active\n", __func__); + goto out; + } + + ucontrol->value.integer.value[0] = p->va_last_word_id; +out: + return ret; +} + +static int dbmdx_wordid_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + dev_err(p->dev, "%s: WORDID is not writable register\n", __func__); + + return -EIO; +} + +static int dbmdx_microphone_mode_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + int ret = 0; + + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + + /* VA controls */ + if (p->active_fw != DBMDX_FW_VA) { + ucontrol->value.integer.value[0] = DBMDX_MIC_MODE_DISABLE; + dev_dbg(p->dev, "%s: VA firmware not active\n", __func__); + goto out; + } + + ucontrol->value.integer.value[0] = p->va_active_mic_config; +out: + return ret; +} + +static int dbmdx_microphone_mode_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + int ret = 0; + + dev_info(p->dev, "%s: value:%lu\n", __func__, + ucontrol->value.integer.value[0]); + + switch (ucontrol->value.integer.value[0]) { + case DBMDX_MIC_MODE_DIGITAL_LEFT: + case DBMDX_MIC_MODE_DIGITAL_RIGHT: + case DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_LEFT: + case DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_RIGHT: + case DBMDX_MIC_MODE_ANALOG: + case DBMDX_MIC_MODE_ANALOG_DUAL: +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + case DBMDX_MIC_MODE_DIGITAL_4CH: +#endif + case DBMDX_MIC_MODE_DISABLE: + ret = dbmdx_reconfigure_microphones( + p, ucontrol->value.integer.value[0]); + break; + default: + dev_err(p->dev, "%s: unsupported microphone mode %d\n", + __func__, (int)(ucontrol->value.integer.value[0])); + ret = -EINVAL; + break; + } + + if (ret < 0 && !p->pdata->va_recovery_disabled) { + + int recovery_res; + + if (!(p->va_flags.recovery_requested) && + (p->device_ready && + (dbmdx_va_alive_with_lock(p) == 0))) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + goto out; + } + + dev_err(p->dev, "%s: Performing recovery #1\n", __func__); + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + goto out; + } + + ret = dbmdx_reconfigure_microphones( + p, ucontrol->value.integer.value[0]); + + if (ret == 0) { + dev_err(p->dev, + "%s:Mic settings updated after succesfull recovery\n", + __func__); + goto out; + } + + if (dbmdx_va_alive_with_lock(p) == 0) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + goto out; + } + + dev_err(p->dev, "%s: Performing recovery #2\n", __func__); + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + goto out; + } + + } +out: + + return ret; +} + +static int dbmdx_va_capture_on_detect_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + int ret = 0; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + p->lock(p); + ucontrol->value.integer.value[0] = p->va_capture_on_detect; + p->unlock(p); + + return ret; +} + +static int dbmdx_va_capture_on_detect_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + int ret = 0; + + p->lock(p); + p->va_capture_on_detect = ucontrol->value.integer.value[0]; + p->unlock(p); + + return ret; +} + +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + +static int dbmdx_va_pcm_streaming_ns_enable_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + int ret = 0; + + if (!p) + return -EAGAIN; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return -EAGAIN; + } + + p->lock(p); + ucontrol->value.integer.value[0] = p->va_ns_pcm_streaming_enabled; + p->unlock(p); + + return ret; +} + +static int dbmdx_va_pcm_streaming_ns_enable_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct dbmdx_private *p = snd_soc_codec_get_drvdata(codec); +#else + struct dbmdx_private *p = dbmdx_data; +#endif + int ret = 0; + + p->lock(p); + p->va_ns_pcm_streaming_enabled = ucontrol->value.integer.value[0]; + p->unlock(p); + + return ret; +} +#endif + +static const char * const dbmdx_microphone_mode_texts[] = { + "DigitalLeft", + "DigitalRight", + "DigitalStereoTrigOnLeft", + "DigitalStereoTrigOnRight", + "Analog", +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + "Digital4Channels", +#endif + "Disable", +}; + +static const struct soc_enum dbmdx_microphone_mode_enum = + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dbmdx_microphone_mode_texts), + dbmdx_microphone_mode_texts); + +static const char * const dbmdx_va_off_on_texts[] = { + "OFF", + "ON", +}; + +static const struct soc_enum dbmdx_va_off_on_enum = + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dbmdx_va_off_on_texts), + dbmdx_va_off_on_texts); + +static const struct snd_kcontrol_new dbmdx_va_snd_controls[] = { + /* + * VA mixer controls + */ + SOC_ENUM_EXT("Operation mode", dbmdx_operation_mode_enum, + dbmdx_operation_mode_get, dbmdx_operation_mode_set), + SOC_SINGLE_EXT_TLV("Digital gain", 0x04, 0, DIGITAL_GAIN_TLV_MAX, 0, + dbmdx_va_control_get, dbmdx_va_control_put, + dbmdx_digital_gain_tlv), + SOC_SINGLE_EXT("Analog gain", 0x16, 0, 0xff, 0, + dbmdx_va_control_get, dbmdx_va_control_put), + SOC_SINGLE_EXT("Load acoustic model", 0, 0, 0xFFFF, 0, + dbmdx_amodel_load_get, dbmdx_amodel_load_set), + SOC_SINGLE_EXT("Word ID", 0, 0, 0x0fff, 0, + dbmdx_wordid_get, dbmdx_wordid_put), + SOC_SINGLE("Trigger Level", + VA_MIXER_REG(DBMDX_VA_SENS_TG_THRESHOLD), + 0, 0xffff, 0), + SOC_SINGLE("Verification Level", + VA_MIXER_REG(DBMDX_VA_SENS_VERIF_THRESHOLD), + 0, 0xffff, 0), + SOC_SINGLE_EXT("Backlog size", 0x12, 0, 0x1fff, 0, + dbmdx_va_control_get, dbmdx_va_control_put), + SOC_ENUM_EXT("Microphone mode", dbmdx_microphone_mode_enum, + dbmdx_microphone_mode_get, dbmdx_microphone_mode_set), + SOC_ENUM_EXT("Capture on detection", dbmdx_va_off_on_enum, + dbmdx_va_capture_on_detect_get, dbmdx_va_capture_on_detect_set), +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + SOC_ENUM_EXT("Streaming NS", dbmdx_va_off_on_enum, + dbmdx_va_pcm_streaming_ns_enable_get, + dbmdx_va_pcm_streaming_ns_enable_set), +#endif +#if IS_ENABLED(EXTERNAL_SOC_AMODEL_LOADING_ENABLED) + SND_SOC_BYTES_TLV("Acoustic Model", MAX_AMODEL_SIZE, NULL, + dbmdx_external_amodel_put), +#endif +}; + +static const struct snd_kcontrol_new dbmdx_vqe_snd_controls[] = { + /* + * VQE mixer controls + */ + SOC_SINGLE_EXT("Use case", + VQE_MIXER_REG(DBMDX_VQE_GET_USE_CASE_CMD), + 0, 15, 0, + dbmdx_vqe_use_case_get, + dbmdx_vqe_use_case_put), +}; + +static int dbmdx_set_bias_level(struct snd_soc_codec *codec, + enum snd_soc_bias_level level) +{ + dev_dbg(codec->dev, "%s: level %d\n", __func__, (int)level); + switch (level) { + case SND_SOC_BIAS_ON: + break; + case SND_SOC_BIAS_PREPARE: + break; + case SND_SOC_BIAS_STANDBY: + break; + case SND_SOC_BIAS_OFF: + break; + default: + return -EINVAL; + } + + /* change to new state , removed in 4.x kernel */ + /* codec->dapm.bias_level = level; */ + + return 0; +} + +static int dbmdx_get_dai_drivers(struct dbmdx_private *p) +{ + struct snd_soc_dai_driver *dais; + unsigned int num_dais = 0; + int ret = 0; + + /* construct dai driver array depending of features */ + if (p->pdata->feature_va) + num_dais += ARRAY_SIZE(dbmdx_va_dais); + if (p->pdata->feature_vqe) + num_dais += ARRAY_SIZE(dbmdx_vqe_dais); + + dais = devm_kzalloc(p->dev, + num_dais * sizeof(*dais), + GFP_KERNEL); + + if (!dais) { + dev_err(p->dev, "%s: out of memory\n", __func__); + ret = -ENOMEM; + goto out_err; + } + + dev_err(p->dev, "%s: num DAIs: %u\n", __func__, num_dais); + + p->num_dais = num_dais; + p->dais = dais; + num_dais = 0; + + if (p->pdata->feature_va) { + memcpy(dais, dbmdx_va_dais, sizeof(dbmdx_va_dais)); + num_dais += ARRAY_SIZE(dbmdx_va_dais); + } + if (p->pdata->feature_vqe) { + memcpy(dais + num_dais, + dbmdx_vqe_dais, + sizeof(dbmdx_vqe_dais)); + num_dais += ARRAY_SIZE(dbmdx_vqe_dais); + } + +out_err: + return ret; +} + +static int dbmdx_dev_probe(struct snd_soc_codec *codec) +{ + int ret; + +#if defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) + struct dbmdx_private *p = dev_get_drvdata(codec->dev); + + if (p->pdata->feature_va) { + ret = snd_soc_add_codec_controls(codec, + dbmdx_va_snd_controls, + ARRAY_SIZE(dbmdx_va_snd_controls)); + if (ret) { + dev_err(codec->dev, + "%s: failed to register VA controls\n", + __func__); + goto out_err; + } + dev_info(codec->dev, + "%s: %d VA controls registered\n", + __func__, (int)(ARRAY_SIZE(dbmdx_va_snd_controls))); + } + + if (p->pdata->feature_vqe) { + ret = snd_soc_add_codec_controls(codec, + dbmdx_vqe_snd_controls, + ARRAY_SIZE(dbmdx_vqe_snd_controls)); + if (ret) { + dev_err(codec->dev, + "%s: failed to register VQE controls\n", + __func__); + goto out_err; + } + dev_info(codec->dev, + "%s: %d VQE controls registered\n", + __func__, (int)(ARRAY_SIZE(dbmdx_vqe_snd_controls))); + } +#endif + ret = 0; + + dev_info(codec->dev, "%s: success\n", __func__); + +out_err: + return ret; +} + +static int dbmdx_dev_remove(struct snd_soc_codec *codec) +{ + dev_dbg(codec->dev, "%s\n", __func__); + return 0; +} + +#if IS_ENABLED(CONFIG_PM) +static int dbmdx_dev_suspend(struct snd_soc_codec *codec) +{ + dev_dbg(codec->dev, "%s\n", __func__); + return 0; +} + +static int dbmdx_dev_resume(struct snd_soc_codec *codec) +{ + dev_dbg(codec->dev, "%s\n", __func__); + return 0; +} +#else +#define dbmdx_dev_suspend NULL +#define dbmdx_dev_resume NULL +#endif + + +static struct snd_soc_codec_driver soc_codec_dev_dbmdx = { + .probe = dbmdx_dev_probe, + .remove = dbmdx_dev_remove, + .suspend = dbmdx_dev_suspend, + .resume = dbmdx_dev_resume, + .set_bias_level = dbmdx_set_bias_level, + .read = dbmdx_dev_read, + .write = dbmdx_dev_write, +}; + + +#if !defined(SOC_CONTROLS_FOR_DBMDX_CODEC_ONLY) +int dbmdx_remote_add_codec_controls(struct snd_soc_codec *codec) +{ + int ret = 0; + int rc; + struct dbmdx_private *p = dbmdx_data; + + if (!p || !p->pdata) { + remote_codec = codec; + return 0; + } + + remote_codec = codec; + + dev_dbg(codec->dev, "%s start\n", __func__); + if (p->pdata->feature_va) { + rc = snd_soc_add_codec_controls(codec, dbmdx_va_snd_controls, + ARRAY_SIZE(dbmdx_va_snd_controls)); + if (rc) { + dev_err(codec->dev, "%s(): adding VA controls failed\n", + __func__); + ret = -EIO; + } + dev_info(codec->dev, + "%s: %d VA controls added\n", + __func__, (int)(ARRAY_SIZE(dbmdx_va_snd_controls))); + } + if (p->pdata->feature_vqe) { + rc = snd_soc_add_codec_controls(codec, dbmdx_vqe_snd_controls, + ARRAY_SIZE(dbmdx_vqe_snd_controls)); + if (rc) { + dev_err(codec->dev, + "%s(): adding VQE controls failed\n", __func__); + ret = -EIO; + } + dev_info(codec->dev, + "%s: %d VQE controls added\n", + __func__, (int)(ARRAY_SIZE(dbmdx_vqe_snd_controls))); + } + + p->remote_codec_in_use = 1; + + return ret; +} +#else +int dbmdx_remote_add_codec_controls(struct snd_soc_codec *codec) +{ + dev_dbg(codec->dev, "%s\n", __func__); + + return 0; +} +EXPORT_SYMBOL(dbmdx_remote_add_codec_controls); +#endif + +#endif /* ALSA_SOC_INTERFACE_NOT_SUPPORTED */ + +void dbmdx_remote_register_event_callback(event_cb func) +{ + if (dbmdx_data) + dbmdx_data->event_callback = func; + else + g_event_callback = func; +} +EXPORT_SYMBOL(dbmdx_remote_register_event_callback); + +void dbmdx_remote_register_set_i2c_freq_callback(set_i2c_freq_cb func) +{ + if (dbmdx_data) + dbmdx_data->set_i2c_freq_callback = func; + else + g_set_i2c_freq_callback = func; +} +EXPORT_SYMBOL(dbmdx_remote_register_set_i2c_freq_callback); + +static int dbmdx_process_detection_irq(struct dbmdx_private *p, + bool to_start_buffering) +{ + u16 event_id = 23; + u16 score = 0; +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + bool okg_passphrase_detected = false; +#endif + bool sv_passphrase_detected = false; + int ret; + + p->chip->transport_enable(p, true); + + if (p->va_debug_mode) + msleep(DBMDX_MSLEEP_DBG_AFTER_DETECTION); + + /* Stop PCM streaming work */ + ret = dbmdx_suspend_pcm_streaming_work(p); + if (ret < 0) + dev_err(p->dev, "%s: Failed to suspend PCM Streaming Work\n", + __func__); + + /* flush pending sv work if any */ + p->va_flags.buffering = 0; + flush_work(&p->sv_work); + +#if IS_ENABLED(DBMDX_KEEP_ALIVE_TIMER) + dev_dbg(p->dev, "%s: Cancelling Keep Alive timer\n", __func__); + p->va_flags.cancel_keep_alive_work = true; + cancel_keep_alive_timer(p); + dev_dbg(p->dev, "%s: Cancelled Keep Alive timer\n", __func__); +#endif + + p->lock(p); + +#if IS_ENABLED(DBMDX_RECOVERY_TEST_ENABLE) + if (p->va_flags.va_debug_val1 == 1) { + dev_err(p->dev, "%s: Emulating Dead Chip during irq\n", + __func__); + ret = -EIO; + p->va_flags.recovery_requested = true; + goto out_unlock; + } +#endif + + if ((p->va_detection_mode == DETECTION_MODE_VOICE_ENERGY) && + (p->va_flags.sv_recognition_mode == + SV_RECOGNITION_MODE_VOICE_ENERGY)) { + dev_info(p->dev, "%s: VOICE ENERGY\n", __func__); + event_id = 0; + sv_passphrase_detected = true; + } else if (p->va_detection_mode == DETECTION_MODE_PHRASE) { + dev_info(p->dev, "%s: PASSPHRASE\n", __func__); +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + if (p->va_flags.okg_recognition_mode == + OKG_RECOGNITION_MODE_ENABLED) { + ret = dbmdx_send_cmd(p, DBMDX_VA_OKG_INTERFACE, + &event_id); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to read OKG Event ID\n", + __func__); + ret = -EIO; + goto out_unlock; + } + + if (event_id & OKG_EVENT_ID) { + dev_info(p->dev, + "%s: OKG PASSPHRASE detected\n", + __func__); + ret = dbmdx_send_cmd(p, + DBMDX_VA_OKG_INTERFACE | + (event_id ^ OKG_EVENT_ID), + NULL); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to reset OKG Event ID\n", + __func__); + ret = -EIO; + goto out_unlock; + } + + okg_passphrase_detected = true; + sv_passphrase_detected = false; + event_id = OKG_EVENT_ID; + p->va_cur_backlog_length = + p->pdata->va_backlog_length_okg; + } + } + + if (okg_passphrase_detected == false) { +#endif + + ret = dbmdx_send_cmd(p, DBMDX_VA_SENS_ALTWORDID, + &event_id); + + if (ret < 0) { + dev_err(p->dev, "%s: failed reading WordID\n", + __func__); + ret = -EIO; + goto out_unlock; + } + + sv_passphrase_detected = true; + + dev_info(p->dev, "%s: last WordID: %d, EventID: %d\n", + __func__, event_id, (event_id & 0xff)); + + event_id = (event_id & 0xff); + + if (event_id == 3) { + /* as per SV Algo implementer's recommendation + * --> it 1 + */ + dev_dbg(p->dev, "%s: fixing to 1\n", __func__); + event_id = 1; + } + p->va_cur_backlog_length = + p->pdata->va_backlog_length; + +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + } +#endif + } else if (p->va_detection_mode == DETECTION_MODE_VOICE_COMMAND) { + dev_info(p->dev, "%s: VOICE_COMMAND\n", __func__); + + ret = dbmdx_send_cmd(p, DBMDX_VA_SENS_WORDID, &event_id); + + if (ret < 0) { + dev_err(p->dev, "%s: failed reading WordID\n", + __func__); + ret = -EIO; + goto out_unlock; + } + + event_id = (event_id & 0xff); + sv_passphrase_detected = true; + + /*for determining voice command, mask should be up to 0x100 */ + event_id += 0x100; + dev_info(p->dev, "%s: last WordID:%d\n", __func__, event_id); + } else if (p->va_detection_mode == DETECTION_MODE_DUAL) { + dev_info(p->dev, "%s: VOICE_DUAL\n", __func__); + + ret = dbmdx_send_cmd(p, DBMDX_VA_SENS_WORDID, &event_id); + + if (ret < 0) { + dev_err(p->dev, "%s: failed reading WordID\n", + __func__); + ret = -EIO; + goto out_unlock; + } + + dev_info(p->dev, "%s: last WordID: %d, EventID: %d\n", + __func__, event_id, (event_id & 0xff)); + + event_id = (event_id & 0xff); + sv_passphrase_detected = true; + } + + ret = dbmdx_send_cmd(p, DBMDX_VA_SENS_FINAL_SCORE, &score); + + if (ret < 0) { + dev_err(p->dev, "%s: failed reading Score\n", __func__); + ret = -EIO; + goto out_unlock; + } + + dev_info(p->dev, "%s: Score:%d\n", __func__, score); + + p->va_last_word_id = event_id; + + if (p->pdata->detection_after_buffering != + DETECTION_AFTER_BUFFERING_MODE_ENABLE_ALL) { +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + if (okg_passphrase_detected) { + ret = dbmdx_set_okg_recognition_mode(p, + OKG_RECOGNITION_MODE_DISABLED); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set OKG model mode\n", + __func__); + ret = -EIO; + goto out_unlock; + } + } +#endif + + if (sv_passphrase_detected) { + ret = dbmdx_set_sv_recognition_mode(p, + SV_RECOGNITION_MODE_DISABLED); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set SV model mode\n", + __func__); + ret = -EIO; + goto out_unlock; + } + } + + } + /* Start Buffering before sending events */ + if (to_start_buffering) { + /* flush fifo */ + kfifo_reset(&p->detection_samples_kfifo); + + p->va_flags.buffering_paused = 0; + p->va_flags.buffering = 1; + dbmdx_schedule_work(p, &p->sv_work); + } + + p->unlock(p); + + if (p->event_callback) + p->event_callback(event_id); + + if (p->pdata->send_uevent_on_detection) { + char uevent_buf[100]; + char * const envp[] = { uevent_buf, NULL }; + + snprintf(uevent_buf, sizeof(uevent_buf), + "VOICE_WAKEUP EVENT_TYPE=Detection EVENT_ID=%d SCORE=%d", + event_id, score); + + dev_info(p->dev, "%s: Sending uevent: %s\n", + __func__, uevent_buf); + + ret = kobject_uevent_env(&p->dev->kobj, KOBJ_CHANGE, + (char **)envp); + + if (ret) + dev_err(p->dev, "%s: Sending uevent failed %d\n", + __func__, ret); + } + + return 0; + +out_unlock: + p->unlock(p); + + if (ret < 0 && !p->pdata->va_recovery_disabled) { + + int recovery_res; + + if (!(p->va_flags.recovery_requested) && + (p->device_ready && + (dbmdx_va_alive_with_lock(p) == 0))) { + dev_err(p->dev, + "%s: DBMDX response has been verified\n", + __func__); + return ret; + } + + dev_err(p->dev, "%s: Performing recovery #1\n", __func__); + + recovery_res = dbmdx_perform_recovery(p); + + if (recovery_res) { + dev_err(p->dev, "%s: recovery failed\n", __func__); + return ret; + } + } + + return ret; +} + +static void dbmdx_uevent_work(struct work_struct *work) +{ + struct dbmdx_private *p = container_of( + work, struct dbmdx_private, uevent_work); + int ret; + + if (!p->device_ready) { + dev_err(p->dev, "%s: device not ready\n", __func__); + return; + } + + ret = dbmdx_process_detection_irq(p, true); + + if (ret < 0) + dev_err(p->dev, + "%s: Error occurred during processing detection IRQ\n", + __func__); + +} + +#define DBMDX_FW_AUDIO_BUFFER_MIN_SIZE 60 + +static void dbmdx_sv_work(struct work_struct *work) +{ + struct dbmdx_private *p = container_of( + work, struct dbmdx_private, sv_work); + int ret; + int bytes_per_sample = p->bytes_per_sample; + unsigned int bytes_to_read; + u16 nr_samples, nr_samples_in_fw; + size_t avail_samples; + unsigned int total = 0; + int kfifo_space = 0; + int retries = 0; + size_t data_offset; + + /*no need for wakeup at this stage usually*/ + p->cur_wakeup_disabled = 1; + + dev_dbg(p->dev, + "%s HW Channels %d, Channel operation: %d\n", + __func__, + p->pdata->va_audio_channels, + p->detection_achannel_op); + + if (p->va_detection_mode == DETECTION_MODE_DUAL) { + dev_dbg(p->dev, + "%s:dual mode: ->voice_command mode\n", + __func__); + return; + } + + p->chip->transport_enable(p, true); + + if (p->va_debug_mode) + msleep(DBMDX_MSLEEP_DBG_AFTER_DETECTION); + + p->va_flags.irq_inuse = 0; + + /* Stop PCM streaming work */ + ret = dbmdx_suspend_pcm_streaming_work(p); + if (ret < 0) + dev_err(p->dev, "%s: Failed to suspend PCM Streaming Work\n", + __func__); + + if (!p->va_capture_on_detect || + p->va_flags.sv_capture_on_detect_disabled) { + dev_dbg(p->dev, "%s: no capture requested, exit..\n", __func__); + goto out; + } + + p->lock(p); + + /* flush fifo */ + kfifo_reset(&p->detection_samples_kfifo); + + /* prepare anything if needed (e.g. increase speed) */ + ret = p->chip->prepare_buffering(p); + if (ret) + goto out_fail_unlock; + + ret = dbmdx_set_pcm_streaming_mode(p, 0); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set pcm streaming mode\n", + __func__); + goto out_fail_unlock; + } + + /* Reset position to backlog start */ + ret = dbmdx_send_cmd(p, + DBMDX_VA_AUDIO_HISTORY | + (p->va_cur_backlog_length | 0x1000), + NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: failed start pcm streaming\n", __func__); + goto out_fail_unlock; + } + + p->unlock(p); + + p->va_flags.mode = DBMDX_BUFFERING; + + do { + if (p->pdata->max_detection_buffer_size > 0 && + total >= p->pdata->max_detection_buffer_size) { + dev_info(p->dev, + "%s: buffering mode ended - reached requested max buffer size", + __func__); + break; + } + + if (p->va_flags.buffering_paused) { + msleep(DBMDX_MSLEEP_BUFFERING_PAUSED); + dev_dbg(p->dev, "%s: buffering is paused...", + __func__); + continue; + } + + + p->lock(p); + bytes_to_read = 0; + /* read number of samples available in audio buffer */ + if (dbmdx_send_cmd(p, + DBMDX_VA_NUM_OF_SMP_IN_BUF, + &nr_samples) < 0) { + dev_err(p->dev, + "%s: failed to read DBMDX_VA_NUM_OF_SMP_IN_BUF\n", + __func__); + p->unlock(p); + goto out; + } + + if (nr_samples == 0xffff) { + dev_info(p->dev, + "%s: buffering mode ended - fw in idle mode", + __func__); + p->unlock(p); + break; + } + +#if DBMDX_FW_AUDIO_BUFFER_MIN_SIZE + /* Do not go below the low border - can cause clicks */ + if (nr_samples < DBMDX_FW_AUDIO_BUFFER_MIN_SIZE) + nr_samples = 0; + else + nr_samples -= DBMDX_FW_AUDIO_BUFFER_MIN_SIZE; +#endif + + nr_samples_in_fw = nr_samples; + + p->unlock(p); + + /* Now fill the kfifo. The user can access the data in + * parallel. The kfifo is safe for concurrent access of one + * reader (ALSA-capture/character device) and one writer (this + * work-queue). + */ + if (nr_samples) { + bytes_to_read = nr_samples * 8 * bytes_per_sample; + + /* limit transaction size (no software flow control ) */ + if (bytes_to_read > p->rxsize && p->rxsize) + bytes_to_read = p->rxsize; + + kfifo_space = kfifo_avail(&p->detection_samples_kfifo); + + if (p->detection_achannel_op == + AUDIO_CHANNEL_OP_DUPLICATE_1_TO_2) + kfifo_space = kfifo_space / 2; +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + else if (p->detection_achannel_op == + AUDIO_CHANNEL_OP_DUPLICATE_1_TO_4) + kfifo_space = kfifo_space / 4; + else if (p->detection_achannel_op == + AUDIO_CHANNEL_OP_DUPLICATE_2_TO_4) + kfifo_space = kfifo_space / 2; +#endif + if (bytes_to_read > kfifo_space) + bytes_to_read = kfifo_space; + + /* recalculate number of samples */ + nr_samples = bytes_to_read / (8 * bytes_per_sample); + + if (!nr_samples) { + /* not enough samples, wait some time */ + usleep_range(DBMDX_USLEEP_NO_SAMPLES, + DBMDX_USLEEP_NO_SAMPLES + 1000); + retries++; + if (retries > p->pdata->buffering_timeout) + break; + continue; + } + /* get audio samples */ + p->lock(p); + ret = p->chip->read_audio_data(p, + p->read_audio_buf, nr_samples, + false, &avail_samples, &data_offset); + if (ret < 0) { + dev_err(p->dev, + "%s: failed to read block of audio data: %d\n", + __func__, ret); + p->unlock(p); + break; + } else if (ret > 0) { + total += bytes_to_read; + + ret = dbmdx_add_audio_samples_to_kfifo(p, + &p->detection_samples_kfifo, + p->read_audio_buf + data_offset, + bytes_to_read, + p->detection_achannel_op); + } + + retries = 0; + + p->unlock(p); + +#if DBMDX_MSLEEP_IF_AUDIO_BUFFER_EMPTY + if (nr_samples == nr_samples_in_fw) + msleep(DBMDX_MSLEEP_IF_AUDIO_BUFFER_EMPTY); +#endif + + } else { + usleep_range(DBMDX_USLEEP_NO_SAMPLES, + DBMDX_USLEEP_NO_SAMPLES + 1000); + retries++; + if (retries > p->pdata->buffering_timeout) + break; + } + + } while (p->va_flags.buffering); + + dev_info(p->dev, "%s: audio buffer read, total of %u bytes\n", + __func__, total); + +out: + p->lock(p); + p->va_flags.buffering = 0; + p->va_flags.mode = DBMDX_IDLE; + ret = dbmdx_set_mode(p, DBMDX_IDLE); + if (ret) { + dev_err(p->dev, "%s: failed to set device to idle mode\n", + __func__); + goto out_fail_unlock; + } + + /* finish audio buffering (e.g. reduce speed) */ + ret = p->chip->finish_buffering(p); + if (ret) { + dev_err(p->dev, "%s: failed to finish buffering\n", __func__); + goto out_fail_unlock; + } + + if (p->pdata->send_uevent_after_buffering) { + char uevent_buf[100]; + char * const envp[] = { uevent_buf, NULL }; + + snprintf(uevent_buf, sizeof(uevent_buf), + "VOICE_WAKEUP EVENT_TYPE=BufferingDone"); + + dev_info(p->dev, "%s: Sending uevent: %s\n", + __func__, uevent_buf); + + ret = kobject_uevent_env(&p->dev->kobj, KOBJ_CHANGE, + (char **)envp); + + if (ret) + dev_err(p->dev, + "%s: Sending uevent failed %d\n", + __func__, ret); + } + + if (p->pdata->detection_after_buffering != + DETECTION_AFTER_BUFFERING_OFF) { + + ret = dbmdx_trigger_detection(p); + if (ret) { + dev_err(p->dev, + "%s: failed to trigger detection\n", __func__); + goto out_fail_unlock; + } + + } else if (p->va_flags.pcm_streaming_active) { + + ret = dbmdx_set_mode(p, DBMDX_STREAMING); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to set DBMDX_STREAMING mode\n", + __func__); + goto out_fail_unlock; + } + + } + +out_fail_unlock: + p->cur_wakeup_disabled = p->pdata->wakeup_disabled; + p->unlock(p); + dev_dbg(p->dev, "%s done\n", __func__); +} + +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX_SND_CAPTURE) + +static void dbmdx_pcm_streaming_work_mod_0(struct work_struct *work) +{ + struct dbmdx_private *p = container_of( + work, struct dbmdx_private, pcm_streaming_work); + int ret; + int bytes_per_sample = p->bytes_per_sample; + unsigned int bytes_to_read; + u16 nr_samples; + size_t avail_samples; + unsigned int total = 0; + int kfifo_space = 0; + int retries = 0; + struct snd_pcm_substream *substream = p->active_substream; + struct snd_soc_pcm_runtime *rtd; + struct snd_soc_codec *codec; + struct snd_pcm_runtime *runtime; + unsigned long frame_in_bytes; + u32 samples_chunk_size; + bool direct_copy_enabled = false; + u8 *local_samples_buf; + u8 *read_samples_buf; + unsigned int stream_buf_size; + u32 pos; + u32 missing_samples; + u32 sleep_time_ms; + size_t data_offset; + + if (substream == NULL) { + dev_err(p->dev, "%s Error No Active Substream\n", __func__); + return; + } + + rtd = substream->private_data; + codec = rtd->codec_dai->codec; + + dev_dbg(p->dev, + "%s PCM Channels %d, HW Channels %d, Channel operation: %d\n", + __func__, + p->audio_pcm_channels, + p->pdata->va_audio_channels, + p->pcm_achannel_op); + + ret = dbmdx_set_pcm_timer_mode(substream, false); + + if (ret < 0) + dev_err(p->dev, "%s Failed to stop timer mode\n", __func__); + + p->va_flags.pcm_streaming_pushing_zeroes = false; + + runtime = substream->runtime; + frame_in_bytes = frames_to_bytes(runtime, runtime->period_size); + stream_buf_size = snd_pcm_lib_buffer_bytes(substream); + + samples_chunk_size = + (u32)(frame_in_bytes * p->pdata->va_audio_channels) / + (8 * bytes_per_sample * runtime->channels); + + if (((u32)(frame_in_bytes * p->pdata->va_audio_channels) % + (8 * bytes_per_sample * runtime->channels))) + samples_chunk_size++; + else if (p->pcm_achannel_op == AUDIO_CHANNEL_OP_COPY) + direct_copy_enabled = true; + + bytes_to_read = samples_chunk_size * 8 * bytes_per_sample; + + dev_dbg(p->dev, + "%s Frame Size: %d, Dir. Copy Mode: %d, Samples TX Thr.: %d\n", + __func__, + (int)frame_in_bytes, + (int)direct_copy_enabled, + (int)samples_chunk_size); + + local_samples_buf = kmalloc(bytes_to_read + 8, GFP_KERNEL); + if (!local_samples_buf) + return; + + read_samples_buf = local_samples_buf; + + p->lock(p); + + /* flush fifo */ + kfifo_reset(&p->pcm_kfifo); + + /* prepare anything if needed (e.g. increase speed) */ + ret = p->chip->prepare_buffering(p); + if (ret) + goto out_fail_unlock; + + /* Delay streaming start to stabilize the PLL and microphones */ + msleep(DBMDX_MSLEEP_PCM_STREAMING_WORK); + + ret = dbmdx_set_pcm_streaming_mode(p, 0); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set pcm streaming mode\n", + __func__); + goto out_fail_unlock; + } + + /* Start PCM streaming, FW should be in detection mode */ + ret = dbmdx_send_cmd(p, DBMDX_VA_AUDIO_HISTORY | 0x1000, NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: failed start pcm streaming\n", __func__); + goto out_fail_unlock; + } + + p->unlock(p); + + do { + p->lock(p); + + if (!(p->va_flags.pcm_worker_active)) { + p->unlock(p); + break; + } + + /* read number of samples available in audio buffer */ + if (dbmdx_send_cmd(p, + DBMDX_VA_NUM_OF_SMP_IN_BUF, + &nr_samples) < 0) { + dev_err(p->dev, + "%s: failed to read DBMDX_VA_NUM_OF_SMP_IN_BUF\n", + __func__); + p->unlock(p); + goto out; + } + + if (nr_samples == 0xffff) { + dev_info(p->dev, + "%s: buffering mode ended - fw in idle mode", + __func__); + p->unlock(p); + break; + } + + p->unlock(p); + + /* Now fill the kfifo. The user can access the data in + * parallel. The kfifo is safe for concurrent access of one + * reader (ALSA-capture/character device) and one writer (this + * work-queue). + */ + if (nr_samples >= samples_chunk_size) { + + if (nr_samples >= 2*samples_chunk_size) + sleep_time_ms = 0; + else { + missing_samples = 2*samples_chunk_size - + nr_samples; + sleep_time_ms = + (u32)(missing_samples * 8 * 1000) / + p->current_pcm_rate; + } + + nr_samples = samples_chunk_size; + + if (!direct_copy_enabled) { + kfifo_space = kfifo_avail(&p->pcm_kfifo); + + if (p->detection_achannel_op == + AUDIO_CHANNEL_OP_DUPLICATE_1_TO_2) + kfifo_space = kfifo_space / 2; +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + else if (p->detection_achannel_op == + AUDIO_CHANNEL_OP_DUPLICATE_1_TO_4) + kfifo_space = kfifo_space / 4; + else if (p->detection_achannel_op == + AUDIO_CHANNEL_OP_DUPLICATE_2_TO_4) + kfifo_space = kfifo_space / 2; +#endif + if (bytes_to_read > kfifo_space) + nr_samples = 0; + } + + if (!nr_samples) { + /* not enough samples, wait some time */ + usleep_range(DBMDX_USLEEP_NO_SAMPLES, + DBMDX_USLEEP_NO_SAMPLES + 1000); + retries++; + if (retries > p->pdata->buffering_timeout) + break; + continue; + } + /* get audio samples */ + p->lock(p); + + ret = p->chip->read_audio_data(p, + local_samples_buf, nr_samples, + false, &avail_samples, &data_offset); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to read block of audio data: %d\n", + __func__, ret); + p->unlock(p); + break; + } else if (ret > 0) { + total += bytes_to_read; + + pos = stream_get_position(substream); + read_samples_buf = runtime->dma_area + pos; + + if (direct_copy_enabled) + memcpy(read_samples_buf, + local_samples_buf + data_offset, + bytes_to_read); + else { + + ret = + dbmdx_add_audio_samples_to_kfifo(p, + &p->pcm_kfifo, + local_samples_buf + data_offset, + bytes_to_read, + p->pcm_achannel_op); + + ret = + dbmdx_get_samples(codec, + read_samples_buf, + runtime->channels * + runtime->period_size); + if (ret) { + memset(read_samples_buf, + 0, + frame_in_bytes); + pr_debug("%s Inserting %d bytes of silence\n", + __func__, (int)bytes_to_read); + } + } + + pos += frame_in_bytes; + if (pos >= stream_buf_size) + pos = 0; + + stream_set_position(substream, pos); + + snd_pcm_period_elapsed(substream); + } + + retries = 0; + + p->unlock(p); + + if (sleep_time_ms > 0) + msleep(sleep_time_ms); + + } else { + u32 missing_samples = samples_chunk_size - nr_samples; + u32 sleep_time_ms = (u32)(missing_samples * 8 * 1100) / + p->current_pcm_rate; + + msleep(sleep_time_ms); + + retries++; + if (retries > p->pdata->buffering_timeout) + break; + } + + } while (p->va_flags.pcm_worker_active); + + dev_info(p->dev, "%s: audio buffer read, total of %u bytes\n", + __func__, total); + +out: + p->lock(p); + p->va_flags.pcm_worker_active = 0; + /* finish audio buffering (e.g. reduce speed) */ + ret = p->chip->finish_buffering(p); + if (ret) { + dev_err(p->dev, "%s: failed to finish buffering\n", __func__); + goto out_fail_unlock; + } +out_fail_unlock: + kfree(local_samples_buf); + + p->unlock(p); + dev_dbg(p->dev, "%s done\n", __func__); +} + + +#define DBMDX_EXTENDED_STREAMIN_DBG_INFO 0 +#define DBMDX_MIN_SAMPLES_IN_FW 64 + +static void dbmdx_pcm_streaming_work_mod_1(struct work_struct *work) +{ + struct dbmdx_private *p = container_of( + work, struct dbmdx_private, pcm_streaming_work); + int ret; + int bytes_per_sample = p->bytes_per_sample; + unsigned int bytes_to_read; + size_t avail_samples; + unsigned int total = 0; + int bytes_in_kfifo; + int retries = 0; + struct snd_pcm_substream *substream = p->active_substream; + struct snd_soc_pcm_runtime *rtd; + struct snd_soc_codec *codec; + struct snd_pcm_runtime *runtime; + unsigned long frame_in_bytes; + u32 samples_chunk_size; + bool direct_copy_enabled = false; + u8 *local_samples_buf; + u8 *read_samples_buf; + unsigned int stream_buf_size; + u32 pos; + u32 missing_samples; + u32 sleep_time_ms; + size_t data_offset; + + if (substream == NULL) { + dev_err(p->dev, "%s Error No Active Substream\n", __func__); + return; + } + + rtd = substream->private_data; + codec = rtd->codec_dai->codec; + + dev_dbg(p->dev, + "%s PCM Channels %d, HW Channels %d, Channel operation: %d\n", + __func__, + p->audio_pcm_channels, + p->pdata->va_audio_channels, + p->pcm_achannel_op); + + ret = dbmdx_set_pcm_timer_mode(substream, false); + + if (ret < 0) + dev_err(p->dev, "%s Failed to stop timer mode\n", __func__); + + p->va_flags.pcm_streaming_pushing_zeroes = false; + + runtime = substream->runtime; + frame_in_bytes = frames_to_bytes(runtime, runtime->period_size); + stream_buf_size = snd_pcm_lib_buffer_bytes(substream); + + samples_chunk_size = + (u32)(frame_in_bytes * p->pdata->va_audio_channels) / + (8 * bytes_per_sample * runtime->channels); + + if (((u32)(frame_in_bytes * p->pdata->va_audio_channels) % + (8 * bytes_per_sample * runtime->channels))) + samples_chunk_size++; + else if (p->pcm_achannel_op == AUDIO_CHANNEL_OP_COPY) + direct_copy_enabled = true; + + bytes_to_read = samples_chunk_size * 8 * bytes_per_sample; + + if (p->pdata->va_audio_channels > 1 || runtime->channels > 1) + p->va_flags.padded_cmds_disabled = true; + + dev_dbg(p->dev, + "%s Frame Size: %d, Dir. Copy Mode: %d, Samples TX Thr.: %d\n", + __func__, + (int)frame_in_bytes, + (int)direct_copy_enabled, + (int)samples_chunk_size); + + /* Ensure that there enough space for metadata , add 8 bytes */ + local_samples_buf = kmalloc(bytes_to_read + 8, GFP_KERNEL); + if (!local_samples_buf) + return; + + read_samples_buf = local_samples_buf; + + p->lock(p); + + /* flush fifo */ + kfifo_reset(&p->pcm_kfifo); + + /* prepare anything if needed (e.g. increase speed) */ + ret = p->chip->prepare_buffering(p); + if (ret) + goto out_fail_unlock; + + /* Delay streaming start to stabilize the PLL and microphones */ + msleep(DBMDX_MSLEEP_PCM_STREAMING_WORK); + + ret = dbmdx_set_pcm_streaming_mode(p, 1); + + if (ret < 0) { + dev_err(p->dev, "%s: failed to set pcm streaming mode\n", + __func__); + goto out_fail_unlock; + } + + /* Start PCM streaming, FW should be in detection mode */ + ret = dbmdx_send_cmd(p, DBMDX_VA_AUDIO_HISTORY | 0x1000, NULL); + + if (ret < 0) { + dev_err(p->dev, "%s: failed start pcm streaming\n", __func__); + goto out_fail_unlock; + } + + p->unlock(p); + + /* Ensure that we will sleep till the first chunk is available */ + avail_samples = 0; + + do { + bytes_in_kfifo = kfifo_len(&p->pcm_kfifo); + + if (bytes_in_kfifo >= frame_in_bytes) { + +#if DBMDX_EXTENDED_STREAMIN_DBG_INFO + dev_dbg(p->dev, + "%s Bytes in KFIFO (%d) >= Frame Size(%d)\n", + __func__, + (int)bytes_in_kfifo, + (int)frame_in_bytes); +#endif + pos = stream_get_position(substream); + + read_samples_buf = runtime->dma_area + pos; + + ret = dbmdx_get_samples(codec, read_samples_buf, + runtime->channels * + runtime->period_size); + + pos += frame_in_bytes; + if (pos >= stream_buf_size) + pos = 0; + + stream_set_position(substream, pos); + + snd_pcm_period_elapsed(substream); + + continue; + } + + samples_chunk_size = + (u32)((frame_in_bytes - bytes_in_kfifo) * + p->pdata->va_audio_channels) / + (8 * bytes_per_sample * runtime->channels); + + if (((u32)((frame_in_bytes - bytes_in_kfifo) * + p->pdata->va_audio_channels) % + (8 * bytes_per_sample * runtime->channels))) + samples_chunk_size++; + + bytes_to_read = samples_chunk_size * 8 * bytes_per_sample; + + if (avail_samples >= samples_chunk_size + + DBMDX_MIN_SAMPLES_IN_FW) + sleep_time_ms = 0; + else { + missing_samples = samples_chunk_size + + DBMDX_MIN_SAMPLES_IN_FW - + avail_samples; + + sleep_time_ms = + (u32)(missing_samples * 8 * 1000) / + p->current_pcm_rate; + } + +#if DBMDX_EXTENDED_STREAMIN_DBG_INFO + dev_dbg(p->dev, + "%s Frame Size(%d), Kfifo Bytes (%d), Samples Chunk (%d), Bytes to Read (%d), Avail. Samples (%d), Sleep Time (%d)ms\n", + __func__, + (int)frame_in_bytes, + (int)bytes_in_kfifo, + (int)samples_chunk_size, + (int)bytes_to_read, + (int)avail_samples, + (int)sleep_time_ms); +#endif + + if (sleep_time_ms > 0) + msleep(sleep_time_ms); + + /* get audio samples */ + p->lock(p); + + if (!(p->va_flags.pcm_worker_active)) { + p->unlock(p); + break; + } + + ret = p->chip->read_audio_data(p, + local_samples_buf, samples_chunk_size, + true, &avail_samples, &data_offset); + + p->unlock(p); + + if (ret < 0) { + dev_err(p->dev, + "%s: failed to read block of audio data: %d\n", + __func__, ret); + break; + } + + if (avail_samples == 0xffff) { + dev_info(p->dev, + "%s: buffering mode ended - fw in idle mode", + __func__); + break; + } else if (avail_samples >= samples_chunk_size) { + + /* If all requested samples were read */ + +#if DBMDX_EXTENDED_STREAMIN_DBG_INFO + dev_dbg(p->dev, + "%s Chunk was read (big enough): Avail. Samples (%d),Samples Chunk (%d), Kfifo Bytes (%d)\n", + __func__, + (int)avail_samples, + (int)samples_chunk_size, + (int)bytes_in_kfifo); +#endif + total += bytes_to_read; + + pos = stream_get_position(substream); + read_samples_buf = runtime->dma_area + pos; + + if (direct_copy_enabled && !bytes_in_kfifo) + memcpy(read_samples_buf, + local_samples_buf + data_offset, + bytes_to_read); + else { + ret = dbmdx_add_audio_samples_to_kfifo(p, + &p->pcm_kfifo, + local_samples_buf + data_offset, + bytes_to_read, + p->pcm_achannel_op); + + ret = dbmdx_get_samples(codec, read_samples_buf, + runtime->channels * + runtime->period_size); + if (ret) { + memset(read_samples_buf, + 0, + frame_in_bytes); + pr_debug("%s Inserting %d bytes of silence\n", + __func__, (int)bytes_to_read); + } + } + + pos += frame_in_bytes; + if (pos >= stream_buf_size) + pos = 0; + + stream_set_position(substream, pos); + + snd_pcm_period_elapsed(substream); + + avail_samples -= samples_chunk_size; + + retries = 0; + + } else if (avail_samples > 0) { + u32 bytes_read; +#if DBMDX_EXTENDED_STREAMIN_DBG_INFO + dev_dbg(p->dev, + "%s Chunk was read (not big enough): Avail. Samples (%d),Samples Chunk (%d), Kfifo Bytes (%d)\n", + __func__, + (int)avail_samples, + (int)samples_chunk_size, + (int)bytes_in_kfifo); +#endif + + bytes_read = + (u32)(avail_samples * 8 * bytes_per_sample); + + total += bytes_read; + + ret = dbmdx_add_audio_samples_to_kfifo(p, + &p->pcm_kfifo, + local_samples_buf + data_offset, + bytes_read, + p->pcm_achannel_op); + avail_samples = 0; + + retries = 0; + + } else { + +#if DBMDX_EXTENDED_STREAMIN_DBG_INFO + dev_dbg(p->dev, + "%s Chunk was read (no samples): Avail. Samples (%d),Samples Chunk (%d), Kfifo Bytes (%d), Retries (%d)\n", + __func__, + (int)avail_samples, + (int)samples_chunk_size, + (int)bytes_in_kfifo, + (int)retries+1); +#endif + + retries++; + if (retries > p->pdata->buffering_timeout) + break; + } + + } while (p->va_flags.pcm_worker_active); + + dev_info(p->dev, "%s: audio buffer read, total of %u bytes\n", + __func__, total); + + p->lock(p); + p->va_flags.pcm_worker_active = 0; + /* finish audio buffering (e.g. reduce speed) */ + ret = p->chip->finish_buffering(p); + if (ret) { + dev_err(p->dev, "%s: failed to finish buffering\n", __func__); + goto out_fail_unlock; + } +out_fail_unlock: + kfree(local_samples_buf); + p->va_flags.padded_cmds_disabled = false; + p->unlock(p); + dev_dbg(p->dev, "%s done\n", __func__); +} +#endif + +static irqreturn_t dbmdx_sv_interrupt_hard(int irq, void *dev) +{ + struct dbmdx_private *p = (struct dbmdx_private *)dev; + + if (p && (p->device_ready) && (p->va_flags.irq_inuse)) + + return IRQ_WAKE_THREAD; + + return IRQ_HANDLED; +} + + +static irqreturn_t dbmdx_sv_interrupt_soft(int irq, void *dev) +{ + struct dbmdx_private *p = (struct dbmdx_private *)dev; + + dev_dbg(p->dev, "%s\n", __func__); + + if ((p->device_ready) && (p->va_flags.irq_inuse)) { + +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + if (p->ps_nosuspend_wl) + __pm_wakeup_event(p->ps_nosuspend_wl, + DBMDX_WAKELOCK_IRQ_TIMEOUT_MS); +#endif + +#if IS_ENABLED(DBMDX_PROCESS_DETECTION_IRQ_WITHOUT_WORKER) + dbmdx_process_detection_irq(p, true); +#else + dbmdx_schedule_work(p, &p->uevent_work); +#endif + + dev_info(p->dev, "%s - SV EVENT\n", __func__); + } + + return IRQ_HANDLED; +} + +static int dbmdx_fw_load_thread(void *data) +{ + struct dbmdx_private *p = (struct dbmdx_private *)data; + + if (p->pdata->feature_va && p->pdata->feature_vqe && + p->pdata->feature_fw_overlay) + return dbmdx_request_and_load_fw(p, 1, 0, 1); + else if (p->pdata->feature_va && p->pdata->feature_vqe) + return dbmdx_request_and_load_fw(p, 1, 1, 0); + else if (p->pdata->feature_vqe) + return dbmdx_request_and_load_fw(p, 0, 1, 0); + else if (p->pdata->feature_va) + return dbmdx_request_and_load_fw(p, 1, 0, 0); + return -EINVAL; +} + +static int dbmdx_get_va_resources(struct dbmdx_private *p) +{ + int ret; + + dev_dbg(p->dev, "%s\n", __func__); + + atomic_set(&p->audio_owner, 0); + +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX_SND_CAPTURE) + if (p->pdata->pcm_streaming_mode == 0) + INIT_WORK(&p->pcm_streaming_work, + dbmdx_pcm_streaming_work_mod_0); + else + INIT_WORK(&p->pcm_streaming_work, + dbmdx_pcm_streaming_work_mod_1); + +#endif + + INIT_WORK(&p->sv_work, dbmdx_sv_work); + INIT_WORK(&p->uevent_work, dbmdx_uevent_work); + +#if IS_ENABLED(DBMDX_KEEP_ALIVE_TIMER) + INIT_WORK(&p->keep_alive_work, dbmdx_keep_alive_work); +#endif + + ret = kfifo_alloc(&p->pcm_kfifo, MAX_KFIFO_BUFFER_SIZE_MONO, + GFP_KERNEL); + + if (ret) { + dev_err(p->dev, "%s: no kfifo memory\n", __func__); + ret = -ENOMEM; + goto err; + } + + p->detection_samples_kfifo_buf_size = MAX_KFIFO_BUFFER_SIZE; + + p->detection_samples_kfifo_buf = + kmalloc(MAX_KFIFO_BUFFER_SIZE, GFP_KERNEL); + + if (!p->detection_samples_kfifo_buf) { + ret = -ENOMEM; + goto err_kfifo_pcm_free; + } + + kfifo_init(&p->detection_samples_kfifo, + p->detection_samples_kfifo_buf, MAX_KFIFO_BUFFER_SIZE); + + p->primary_amodel.amodel_loaded = false; + p->primary_amodel.amodel_buf = NULL; + p->secondary_amodel.amodel_loaded = false; + p->secondary_amodel.amodel_buf = NULL; + +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + p->okg_amodel.amodel_loaded = false; + p->okg_amodel.amodel_buf = NULL; +#endif + + /* Switch ON capture backlog by default */ + p->va_capture_on_detect = true; + + /* default mode is PCM mode */ + p->audio_mode = DBMDX_AUDIO_MODE_PCM; + p->audio_pcm_rate = 16000; + p->bytes_per_sample = 2; + + p->va_flags.irq_inuse = 0; + if (p->sv_irq != -1) { + ret = request_threaded_irq(p->sv_irq, + dbmdx_sv_interrupt_hard, + dbmdx_sv_interrupt_soft, + IRQF_TRIGGER_RISING, + "dbmdx_sv", p); + + if (ret < 0) { + dev_err(p->dev, "%s: cannot get irq\n", __func__); + goto err_kfifo_free; + } + + ret = irq_set_irq_wake(p->sv_irq, 1); + if (ret < 0) + dev_err(p->dev, "%s: cannot set irq_set_irq_wake\n", + __func__); + } + + ret = sysfs_create_group(&p->dbmdx_dev->kobj, + &dbmdx_va_attribute_group); + if (ret) { + dev_err(p->dbmdx_dev, "%s: failed to create VA sysfs group\n", + __func__); + goto err_free_irq; + } +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + p->ps_nosuspend_wl = wakeup_source_create("dbmdx_nosuspend_wakelock"); + + if (p->ps_nosuspend_wl) + wakeup_source_add(p->ps_nosuspend_wl); + else + dev_err(p->dbmdx_dev, + "%s: Error creating WS: dbmdx_nosuspend_wakelock\n", + __func__); +#endif + + return 0; +err_free_irq: + p->va_flags.irq_inuse = 0; + irq_set_irq_wake(p->sv_irq, 0); + free_irq(p->sv_irq, p); +err_kfifo_free: + kfifo_free(&p->detection_samples_kfifo); +err_kfifo_pcm_free: + kfifo_free(&p->pcm_kfifo); +err: + return ret; +} + +static void dbmdx_free_va_resources(struct dbmdx_private *p) +{ + dev_dbg(p->dev, "%s\n", __func__); + if (p->primary_amodel.amodel_buf) + vfree(p->primary_amodel.amodel_buf); + if (p->secondary_amodel.amodel_buf) + vfree(p->secondary_amodel.amodel_buf); +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + if (p->okg_amodel.amodel_buf) + vfree(p->okg_amodel.amodel_buf); +#endif + kfifo_free(&p->pcm_kfifo); + kfifo_free(&p->detection_samples_kfifo); + p->va_flags.irq_inuse = 0; + if (p->sv_irq != -1) { + irq_set_irq_wake(p->sv_irq, 0); + free_irq(p->sv_irq, p); + } + sysfs_remove_group(&p->dev->kobj, &dbmdx_va_attribute_group); +#if IS_ENABLED(CONFIG_PM_WAKELOCKS) + if (p->ps_nosuspend_wl) { + wakeup_source_remove(p->ps_nosuspend_wl); + wakeup_source_destroy(p->ps_nosuspend_wl); + } +#endif + +} + +static int dbmdx_get_vqe_resources(struct dbmdx_private *p) +{ + int ret; + + dev_dbg(p->dev, "%s\n", __func__); + + ret = sysfs_create_group(&p->dbmdx_dev->kobj, + &dbmdx_vqe_attribute_group); + if (ret) { + dev_err(p->dbmdx_dev, "%s: failed to create VQE sysfs group\n", + __func__); + return ret; + } + + return 0; +} + +static void dbmdx_free_vqe_resources(struct dbmdx_private *p) +{ + sysfs_remove_group(&p->dev->kobj, &dbmdx_vqe_attribute_group); +} + + +static int dbmdx_common_probe(struct dbmdx_private *p) +{ +#if IS_ENABLED(CONFIG_OF) + struct device_node *np = p->dev->of_node; +#endif + struct task_struct *boot_thread; + int ret = 0; + int fclk; + + dbmdx_data = p; + dev_set_drvdata(p->dev, p); + +#if IS_ENABLED(CONFIG_OF) + if (!np) { + dev_err(p->dev, "%s: error no devicetree entry\n", __func__); + ret = -ENODEV; + goto err; + } +#endif + + /* enable constant clock */ + p->clk_enable(p, DBMDX_CLK_CONSTANT); + + /* enable regulator if defined */ + if (p->vregulator) { + ret = regulator_enable(p->vregulator); + if (ret != 0) { + dev_err(p->dev, "%s: Failed to enable regulator: %d\n", + __func__, ret); + goto err_clk_off; + } + } + +#if IS_ENABLED(CONFIG_OF) + /* reset */ + p->pdata->gpio_reset = of_get_named_gpio(np, "reset-gpio", 0); +#endif + if (!gpio_is_valid(p->pdata->gpio_reset)) { + dev_err(p->dev, "%s: reset gpio invalid\n", __func__); + ret = -EINVAL; + goto err_clk_off; + } + + ret = gpio_request(p->pdata->gpio_reset, "DBMDX reset"); + if (ret < 0) { + dev_err(p->dev, "%s: error requesting reset gpio\n", __func__); + goto err_clk_off; + } + gpio_direction_output(p->pdata->gpio_reset, 0); + gpio_set_value(p->pdata->gpio_reset, 0); + + /* sv */ +#if IS_ENABLED(CONFIG_OF) + p->pdata->gpio_sv = of_get_named_gpio(np, "sv-gpio", 0); +#endif + if (!gpio_is_valid(p->pdata->gpio_sv)) { + p->pdata->gpio_sv = -1; + p->sv_irq = -1; + dev_err(p->dev, "%s: sv gpio not available\n", __func__); + } else { + ret = gpio_request(p->pdata->gpio_sv, "DBMDX sv"); + if (ret < 0) { + dev_err(p->dev, "%s: error requesting sv gpio\n", + __func__); + goto err_gpio_free; + } + gpio_direction_input(p->pdata->gpio_sv); + + /* interrupt gpio */ + p->sv_irq = ret = gpio_to_irq(p->pdata->gpio_sv); + if (ret < 0) { + dev_err(p->dev, "%s: cannot map gpio to irq\n", + __func__); + goto err_gpio_free; + } + } + /* d2 strap 1 - only on some boards */ +#if IS_ENABLED(CONFIG_OF) + p->pdata->gpio_d2strap1 = of_get_named_gpio(np, "d2-strap1", 0); +#endif + if (gpio_is_valid(p->pdata->gpio_d2strap1)) { + dev_info(p->dev, + "%s: valid d2 strap1 gpio: %d\n", + __func__, + p->pdata->gpio_d2strap1); + ret = gpio_request(p->pdata->gpio_d2strap1, "DBMDX STRAP 1"); + if (ret < 0) { + dev_err(p->dev, "%s: error requesting d2 strap1 gpio\n", + __func__); + goto err_gpio_free; + } else { + /* keep it as input */ + if (gpio_direction_input(p->pdata->gpio_d2strap1)) { + dev_err(p->dev, + "%s: error setting d2 strap1 gpio to input\n", + __func__); + goto err_gpio_free; + } +#if IS_ENABLED(CONFIG_OF) + ret = of_property_read_u32(np, "d2-strap1-rst-val", + &p->pdata->gpio_d2strap1_rst_val); + if (ret) { + dev_dbg(p->dev, + "%s: no d2-strap1-rst-val in dts\n", + __func__); + p->pdata->gpio_d2strap1_rst_val = 0; + } + + /* normalize */ + if (p->pdata->gpio_d2strap1_rst_val > 1) + p->pdata->gpio_d2strap1_rst_val = 1; +#endif + } + } else { + dev_info(p->dev, + "%s: missing or invalid d2 strap1 gpio: %d\n", + __func__, + p->pdata->gpio_d2strap1); + p->pdata->gpio_d2strap1 = -1; + } + + /* wakeup */ +#if IS_ENABLED(CONFIG_OF) + p->pdata->gpio_wakeup = of_get_named_gpio(np, "wakeup-gpio", 0); +#endif + if (!gpio_is_valid(p->pdata->gpio_wakeup)) { + dev_info(p->dev, "%s: wakeup gpio not specified\n", __func__); + p->pdata->gpio_wakeup = -1; + } else { + ret = gpio_request(p->pdata->gpio_wakeup, "DBMDX wakeup"); + if (ret < 0) { + dev_err(p->dev, "%s: error requesting wakeup gpio\n", + __func__); + goto err_gpio_free; + } + /* keep the wakeup pin high */ + gpio_direction_output(p->pdata->gpio_wakeup, 1); + } + + /* lock init */ + mutex_init(&p->p_lock); + + /* set clock rates */ + if (p->clk_set_rate(p, DBMDX_CLK_MASTER) < 0) { + dev_err(p->dev, + "%s: could not set rate for master clock\n", + __func__); + goto err_gpio_free; + } + + if (p->clk_set_rate(p, DBMDX_CLK_CONSTANT) < 0) { + dev_err(p->dev, + "%s: could not set rate for constant clock\n", + __func__); + goto err_gpio_free; + } + + fclk = p->clk_get_rate(p, DBMDX_CLK_MASTER); + + p->master_pll_rate = (unsigned int)((fclk / 6) * 17); + + switch (fclk) { + case 32768: + p->clk_type = DBMD2_XTAL_FREQ_32K_IMG7; + p->master_pll_rate = 60000000; + break; + case 9600000: + p->clk_type = DBMD2_XTAL_FREQ_9M_IMG4; + break; + case 24000000: + default: + p->clk_type = DBMD2_XTAL_FREQ_24M_IMG1; + } + + p->ns_class = class_create(THIS_MODULE, "voicep"); + if (IS_ERR(p->ns_class)) { + dev_err(p->dev, "%s: failed to create class\n", __func__); + goto err_gpio_free; + } + + p->dbmdx_dev = device_create(p->ns_class, NULL, 0, p, "dbmdx"); + if (IS_ERR(p->dbmdx_dev)) { + dev_err(p->dev, "%s: could not create device\n", __func__); + goto err_class_destroy; + } + + ret = sysfs_create_group(&p->dbmdx_dev->kobj, + &dbmdx_common_attribute_group); + if (ret) { + dev_err(p->dbmdx_dev, "%s: failed to create sysfs group\n", + __func__); + goto err_device_unregister; + } + + if (p->pdata->feature_va) { + ret = dbmdx_get_va_resources(p); + if (ret) { + dev_err(p->dev, + "%s: could not get VA resources\n", __func__); + goto err_sysfs_remove_group; + } + } + + if (p->pdata->feature_vqe) { + ret = dbmdx_get_vqe_resources(p); + if (ret) { + dev_err(p->dev, + "%s: could not get VQE resources\n", __func__); + goto err_free_resources; + } + } + + p->cur_reset_gpio = p->pdata->gpio_reset; + p->cur_wakeup_gpio = p->pdata->gpio_wakeup; + + ret = dbmdx_register_cdev(p); + if (ret) + goto err_free_resources; +#ifndef ALSA_SOC_INTERFACE_NOT_SUPPORTED + ret = dbmdx_get_dai_drivers(p); + if (ret) + goto err_deregister_cdev; + + /* register the codec */ + ret =snd_soc_register_codec(p->dev, + &soc_codec_dev_dbmdx, + p->dais, + p->num_dais); + if (ret != 0) { + dev_err(p->dev, + "%s: Failed to register codec codec and its DAI: %d\n", + __func__, ret); + goto err_free_dais; + } +#endif + boot_thread = kthread_run(dbmdx_fw_load_thread, + (void *)p, + "dbmdx probe thread"); + if (IS_ERR_OR_NULL(boot_thread)) { + dev_err(p->dev, + "%s: Cannot create DBMDX boot thread\n", __func__); + ret = -EIO; +#ifndef ALSA_SOC_INTERFACE_NOT_SUPPORTED + goto err_codec_unregister; +#else + goto err_deregister_cdev; +#endif + } + + dev_info(p->dev, "%s: registered DBMDX codec driver version = %s\n", + __func__, DRIVER_VERSION); + + return 0; + +#ifndef ALSA_SOC_INTERFACE_NOT_SUPPORTED +err_codec_unregister: + snd_soc_unregister_codec(p->dev); +err_free_dais: + devm_kfree(p->dev, p->dais); +#endif +err_deregister_cdev: + dbmdx_deregister_cdev(p); +err_free_resources: + if (p->pdata->feature_va) + dbmdx_free_va_resources(p); + if (p->pdata->feature_vqe) + dbmdx_free_vqe_resources(p); +err_sysfs_remove_group: + sysfs_remove_group(&p->dev->kobj, &dbmdx_common_attribute_group); +err_class_destroy: + class_destroy(p->ns_class); +err_device_unregister: + device_unregister(p->dbmdx_dev); +err_gpio_free: + if (p->pdata->gpio_wakeup >= 0) + gpio_free(p->pdata->gpio_wakeup); + if (p->pdata->gpio_d2strap1 >= 0) + gpio_free(p->pdata->gpio_d2strap1); + if (p->pdata->gpio_sv >= 0) + gpio_free(p->pdata->gpio_sv); + gpio_free(p->pdata->gpio_reset); +err_clk_off: + /* disable constant clock */ + p->clk_disable(p, DBMDX_CLK_CONSTANT); +#if IS_ENABLED(CONFIG_OF) +err: +#endif + return ret; +} + +static void dbmdx_common_remove(struct dbmdx_private *p) +{ + int i; + + if (p->pdata->feature_va) + dbmdx_free_va_resources(p); + if (p->pdata->feature_vqe) + dbmdx_free_vqe_resources(p); + +#if IS_MODULE(CONFIG_SND_SOC_DBMDX) + dbmdx_deinit_interface(); +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX_SND_CAPTURE) + snd_dbmdx_pcm_exit(); + board_dbmdx_snd_exit(); +#endif +#endif + + flush_workqueue(p->dbmdx_workq); + destroy_workqueue(p->dbmdx_workq); +#ifndef ALSA_SOC_INTERFACE_NOT_SUPPORTED + snd_soc_unregister_codec(p->dev); +#endif + dbmdx_deregister_cdev(p); + sysfs_remove_group(&p->dev->kobj, &dbmdx_common_attribute_group); + device_unregister(p->dbmdx_dev); + class_destroy(p->ns_class); + if (p->pdata->gpio_wakeup >= 0) + gpio_free(p->pdata->gpio_wakeup); + gpio_free(p->pdata->gpio_reset); + if (p->pdata->gpio_sv >= 0) + gpio_free(p->pdata->gpio_sv); +#if IS_ENABLED(CONFIG_OF) + if (p->pdata->vqe_cfg_values) + kfree(p->pdata->vqe_cfg_value); + if (p->pdata->vqe_modes_values) + kfree(p->pdata->vqe_modes_value); + if (p->pdata->va_cfg_values) + kfree(p->pdata->va_cfg_value); +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + if (p->pdata->va_ns_cfg_values) + kfree(p->pdata->va_ns_cfg_value); +#endif +#endif + /* disable constant clock */ + p->clk_disable(p, DBMDX_CLK_CONSTANT); + for (i = 0; i < DBMDX_NR_OF_CLKS; i++) + if (p->clocks[i]) + clk_put(p->clocks[i]); + devm_kfree(p->dev, p->dais); + kfree(p); +} + +#if IS_ENABLED(CONFIG_OF) +static int of_dev_node_match(struct device *dev, void *data) +{ + return dev->of_node == data; +} + +/* must call put_device() when done with returned i2c_client device */ +struct platform_device *of_find_platform_device_by_node( + struct device_node *node) +{ + struct device *dev; + + dev = bus_find_device(&platform_bus_type, NULL, node, + of_dev_node_match); + if (!dev) + return NULL; + + return container_of(dev, struct platform_device, dev); +} + +static struct spi_device *of_find_spi_device_by_node(struct device_node *node) +{ + struct device *dev; + + dev = bus_find_device(&spi_bus_type, NULL, node, of_dev_node_match); + + if (!dev) + return NULL; + + return to_spi_device(dev); +} + +static int dbmdx_of_get_clk_info(struct dbmdx_private *p, + struct device_node *np, + enum dbmdx_clocks dbmdx_clk) +{ + int ret; + int rate, rrate; + struct clk *clk; + + ret = of_property_read_u32(np, + dbmdx_of_clk_rate_names[dbmdx_clk], + &rate); + if (ret != 0) { + dev_dbg(p->dev, + "%s: no %s definition in device-tree\n", + __func__, + dbmdx_of_clk_rate_names[dbmdx_clk]); + rate = -1; + } else + dev_dbg(p->dev, + "%s: using %s at %dHZ from device-tree\n", + __func__, + dbmdx_of_clk_names[dbmdx_clk], + rate); + + clk = clk_get(p->dev, dbmdx_of_clk_names[dbmdx_clk]); + if (IS_ERR(clk)) { + dev_dbg(p->dev, + "%s: no %s definition in device-tree\n", + __func__, + dbmdx_of_clk_names[dbmdx_clk]); + /* nothing in the device tree */ + clk = NULL; + } else { + /* If clock rate not specified in dts, try to detect */ + if (rate == -1) { + rate = clk_get_rate(clk); + dev_dbg(p->dev, + "%s: using %s at %dHZ\n", + __func__, + dbmdx_of_clk_names[dbmdx_clk], + rate); + } else { + /* verify which rate can be set */ + rrate = clk_round_rate(clk, rate); + if (rrate != rate) { + dev_dbg(p->dev, + "%s: rounded rate %d to %d\n", + __func__, + rate, rrate); + rate = rrate; + } + } + } + p->clocks[dbmdx_clk] = clk; + p->pdata->clock_rates[dbmdx_clk] = rate; + + return 0; +} +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) +static int dbmdx_get_va_ns_devtree_pdata(struct device *dev, + struct dbmdx_private *p) +{ + struct dbmdx_platform_data *pdata = p->pdata; + struct device_node *np; + struct property *property = NULL; + int ret = 0; + int i, j; + u32 *cur_cfg_arr; + int min_arr_size; + + np = dev->of_node; + + ret = of_property_read_u32(np, "va_ns_supported", + &pdata->va_ns_supported); + if ((ret && ret != -EINVAL) || + (p->pdata->va_ns_supported != 0 && + p->pdata->va_ns_supported != 1)) { + dev_err(p->dev, "%s: invalid 'va_ns_supported'\n", + __func__); + return -EINVAL; + } + + dev_dbg(p->dev, "%s: using va_ns_supported of %d\n", + __func__, pdata->va_ns_supported); + + if (!(pdata->va_ns_supported)) + return 0; + + ret = of_property_read_u32(np, "mic_config_source", + &pdata->mic_config_source); + if (ret && ret != -EINVAL) { + dev_err(p->dev, "%s: invalid 'mic_config_source'\n", + __func__); + return -EINVAL; + } else if (ret == -EINVAL) { + pdata->mic_config_source = DBMDX_MIC_CONFIG_SOURCE_EXPLICIT; + dev_dbg(p->dev, "%s: using default mic_config_source of %u\n", + __func__, pdata->mic_config_source); + } else { + dev_dbg(p->dev, "%s: using mic_config_source of %u\n", + __func__, pdata->mic_config_source); + } + + ret = of_property_read_u32(np, "va_ns-num_of_configs", + &pdata->va_ns_num_of_configs); + if ((ret && ret != -EINVAL)) { + dev_err(p->dev, "%s: invalid 'va_ns-num_of_configs'\n", + __func__); + return -EINVAL; + } else if (ret == -EINVAL) { + dev_dbg(p->dev, + "%s: no va_ns-num_of_configs, setting to 1\n", + __func__); + pdata->va_ns_num_of_configs = 1; + } + + property = of_find_property(np, "va-ns-config", + &pdata->va_ns_cfg_values); + if (!property) { + pdata->va_ns_cfg_values = 0; + pdata->va_ns_num_of_configs = 0; + return 0; + } + + pdata->va_ns_cfg_values /= sizeof(u32); + + min_arr_size = (pdata->va_ns_cfg_values + + (pdata->va_ns_cfg_values % + pdata->va_ns_num_of_configs)) * sizeof(u32); + + pdata->va_ns_cfg_value = kzalloc(min_arr_size, GFP_KERNEL); + + if (!pdata->va_ns_cfg_value) + return -ENOMEM; + + if (pdata->va_ns_num_of_configs == 1) { + ret = of_property_read_u32_array(np, + "va-ns-config", + pdata->va_ns_cfg_value, + pdata->va_ns_cfg_values); + if (ret) { + dev_err(dev, "%s: Couldn't read VA_NS config\n", + __func__); + kfree(pdata->va_ns_cfg_value); + return -EIO; + } + } else { + u32 *tmp_arr; + int cfg_arr_len; + int cur_idx = 0; + int cur_val_ind; + + tmp_arr = kzalloc(min_arr_size, GFP_KERNEL); + + if (!tmp_arr) { + kfree(pdata->va_ns_cfg_value); + return -ENOMEM; + } + + ret = of_property_read_u32_array(np, + "va-ns-config", + tmp_arr, + pdata->va_ns_cfg_values); + + if (ret) { + dev_err(dev, "%s: Couldn't read VA_NS config\n", + __func__); + kfree(pdata->va_ns_cfg_value); + kfree(tmp_arr); + return -EIO; + } + + cfg_arr_len = (int)(pdata->va_ns_cfg_values / + pdata->va_ns_num_of_configs); + + for (i = 0; i < pdata->va_ns_cfg_values; + i += pdata->va_ns_num_of_configs) { + for (j = 0; j < pdata->va_ns_num_of_configs; j++) { + cur_val_ind = (cfg_arr_len * j) + cur_idx; + pdata->va_ns_cfg_value[cur_val_ind] = + tmp_arr[i+j]; + } + cur_idx++; + } + + pdata->va_ns_cfg_values = cfg_arr_len; + kfree(tmp_arr); + } + dev_dbg(dev, "%s: using %u VA_NS config values from dev-tree\n", + __func__, pdata->va_cfg_values); + + for (j = 0; j < pdata->va_ns_num_of_configs; j++) { + + dev_dbg(dev, "%s:\n===== VA_NS configuration #%d =====\n", + __func__, j); + + cur_cfg_arr = (u32 *)(&(pdata->va_ns_cfg_value[j* + pdata->va_ns_cfg_values])); + + for (i = 0; i < pdata->va_ns_cfg_values; i++) { + dev_dbg(dev, "%s:\tVA_NS cfg %8.8x: 0x%8.8x\n", + __func__, i, cur_cfg_arr[i]); + } + + } + + return 0; +} +#endif + +static int dbmdx_get_va_devtree_pdata(struct device *dev, + struct dbmdx_private *p) +{ + struct dbmdx_platform_data *pdata = p->pdata; + struct device_node *np; + struct property *property = NULL; + int ret = 0; + int i; + + np = dev->of_node; + + if (!pdata->feature_va) + return 0; + + /* read file names for the various firmwares */ + /* read name of VA firmware */ + ret = of_property_read_string(np, + "va-firmware-name", + &pdata->va_firmware_name); + if (ret != 0) { + /* set default name */ + pdata->va_firmware_name = DBMD2_VA_FIRMWARE_NAME; + dev_dbg(dev, "%s: using default VA firmware name: %s\n", + __func__, pdata->va_firmware_name); + } else + dev_dbg(dev, "%s: using device-tree VA firmware name: %s\n", + __func__, pdata->va_firmware_name); + + ret = of_property_read_string(np, + "va-preboot-firmware-name", + &pdata->va_preboot_firmware_name); + if (ret != 0) { + /* set default name */ + pdata->va_preboot_firmware_name = + DBMD4_VA_PREBOOT_FIRMWARE_NAME; + dev_dbg(dev, + "%s: using default VA preboot firmware name: %s\n", + __func__, pdata->va_preboot_firmware_name); + } else + dev_dbg(dev, + "%s: using device-tree VA preboot firmware name: %s\n", + __func__, pdata->va_preboot_firmware_name); + +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + ret = of_property_read_string(np, + "va-asrp-params-firmware-name", + &pdata->va_asrp_params_firmware_name); + + if (ret != 0) { + /* set default name */ + pdata->va_asrp_params_firmware_name = + DBMD4_VA_ASRP_PARAMS_FIRMWARE_NAME; + dev_dbg(dev, + "%s: using default VA ASRP firmware name: %s\n", + __func__, pdata->va_asrp_params_firmware_name); + } else + dev_dbg(dev, + "%s: using device-tree VA ASRP firmware name: %s\n", + __func__, pdata->va_asrp_params_firmware_name); +#endif + + ret = of_property_read_u32(np, "auto_buffering", + &p->pdata->auto_buffering); + + if ((ret && ret != -EINVAL) || (p->pdata->auto_buffering != 0 && + p->pdata->auto_buffering != 1)) { + dev_err(p->dev, "%s: invalid 'auto_buffering'\n", __func__); + ret = -EINVAL; + goto out_err; + } + + ret = of_property_read_u32(np, "auto_detection", + &p->pdata->auto_detection); + if ((ret && ret != -EINVAL) || (p->pdata->auto_detection != 0 && + p->pdata->auto_detection != 1)) { + dev_err(p->dev, "%s: invalid 'auto_detection'\n", __func__); + ret = -EINVAL; + goto out_err; + } + + ret = of_property_read_u32(np, "detection_after_buffering", + &p->pdata->detection_after_buffering); + if ((ret && ret != -EINVAL) || + (p->pdata->detection_after_buffering >= + DETECTION_AFTER_BUFFERING_MODE_MAX)) { + dev_err(p->dev, "%s: invalid 'detection_after_buffering'\n", + __func__); + ret = -EINVAL; + goto out_err; + } + + ret = of_property_read_u32(np, "send_uevent_on_detection", + &p->pdata->send_uevent_on_detection); + if ((ret && ret != -EINVAL) || + (p->pdata->send_uevent_on_detection != 0 && + p->pdata->send_uevent_on_detection != 1)) { + dev_err(p->dev, "%s: invalid 'send_uevent_on_detection'\n", + __func__); + ret = -EINVAL; + goto out_err; + } + + ret = of_property_read_u32(np, "send_uevent_after_buffering", + &p->pdata->send_uevent_after_buffering); + if ((ret && ret != -EINVAL) || + (p->pdata->send_uevent_after_buffering != 0 && + p->pdata->send_uevent_after_buffering != 1)) { + dev_err(p->dev, "%s: invalid 'send_uevent_after_buffering'\n", + __func__); + ret = -EINVAL; + goto out_err; + } + + ret = of_property_read_u32(np, "retrigger_interval_sec", + &p->pdata->retrigger_interval_sec); + if ((ret && ret != -EINVAL)) { + dev_err(p->dev, "%s: retrigger_interval_sec'\n", __func__); + ret = -EINVAL; + goto out_err; + } + + dev_dbg(p->dev, "%s: using retrigger_interval_sec of %d\n", + __func__, p->pdata->retrigger_interval_sec); + + ret = of_property_read_u32(np, "buffering_timeout", + &p->pdata->buffering_timeout); + if (ret && ret != -EINVAL) { + dev_err(p->dev, "%s: invalid 'buffering_timeout'\n", + __func__); + ret = -EINVAL; + goto out_err; + } else if (ret == -EINVAL) { + dev_dbg(p->dev, + "%s: no buffering_timeout, setting to %d\n", + __func__, MAX_RETRIES_TO_WRITE_TOBUF); + p->pdata->buffering_timeout = MAX_RETRIES_TO_WRITE_TOBUF; + } else { + + if (p->pdata->buffering_timeout < MIN_RETRIES_TO_WRITE_TOBUF) + p->pdata->buffering_timeout = + MIN_RETRIES_TO_WRITE_TOBUF; + + dev_dbg(p->dev, + "%s: using buffering_timeout of %u from dev tree\n", + __func__, p->pdata->buffering_timeout); + } + + ret = of_property_read_u32(np, "detection_buffer_channels", + &p->pdata->detection_buffer_channels); + if ((ret && ret != -EINVAL) || + (p->pdata->detection_buffer_channels > + MAX_SUPPORTED_CHANNELS)) { + dev_err(p->dev, "%s: detection_buffer_channels'\n", __func__); + ret = -EINVAL; + goto out_err; + } + + ret = of_property_read_u32(np, "min_samples_chunk_size", + &p->pdata->min_samples_chunk_size); + if ((ret && ret != -EINVAL)) { + dev_err(p->dev, "%s: min_samples_chunk_size'\n", __func__); + ret = -EINVAL; + goto out_err; + } + + dev_dbg(p->dev, "%s: using min_samples_chunk_size of %d\n", + __func__, p->pdata->min_samples_chunk_size); + + ret = of_property_read_u32(np, "max_detection_buffer_size", + &p->pdata->max_detection_buffer_size); + if ((ret && ret != -EINVAL)) { + dev_err(p->dev, "%s: max_detection_buffer_size'\n", __func__); + ret = -EINVAL; + goto out_err; + } + + dev_dbg(p->dev, "%s: using max_detection_buffer_size of %d\n", + __func__, p->pdata->max_detection_buffer_size); + + + ret = of_property_read_u32(np, "va_buffering_pcm_rate", + &p->pdata->va_buffering_pcm_rate); + if (ret && ret != -EINVAL) { + dev_err(p->dev, "%s: invalid 'va_buffering_pcm_rate'\n", + __func__); + ret = -EINVAL; + goto out_err; + } else if (ret == -EINVAL) { + dev_dbg(p->dev, + "%s: no va buffering pcm rate, setting to 16000\n", + __func__); + p->pdata->va_buffering_pcm_rate = 16000; + } else { + if (p->pdata->va_buffering_pcm_rate != 16000 && + p->pdata->va_buffering_pcm_rate != 32000) + p->pdata->va_buffering_pcm_rate = 16000; + + dev_dbg(p->dev, + "%s: using va_buffering_pcm_rate of %u from dev tree\n", + __func__, p->pdata->va_buffering_pcm_rate); + } + + property = of_find_property(np, "va-config", &pdata->va_cfg_values); + if (property) { + pdata->va_cfg_value = kzalloc(pdata->va_cfg_values, GFP_KERNEL); + if (!pdata->va_cfg_value) { + ret = -ENOMEM; + goto out_err; + } + pdata->va_cfg_values /= sizeof(u32); + ret = of_property_read_u32_array(np, + "va-config", + pdata->va_cfg_value, + pdata->va_cfg_values); + if (ret) { + dev_err(dev, "%s: Could not read VA configuration\n", + __func__); + ret = -EIO; + goto out_free_va_resources; + } + dev_dbg(dev, + "%s: using %u VA configuration values from dev-tree\n", + __func__, pdata->va_cfg_values); + for (i = 0; i < pdata->va_cfg_values; i++) + dev_dbg(dev, "%s: VA cfg %8.8x: 0x%8.8x\n", + __func__, i, pdata->va_cfg_value[i]); + } +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + ret = dbmdx_get_va_ns_devtree_pdata(dev, p); + if (ret) { + dev_err(p->dev, "%s: Error getting VA NS Dev Tree data\n", + __func__); + ret = -EINVAL; + goto out_err; + } +#endif + ret = of_property_read_u32_array(np, + "va-mic-config", + pdata->va_mic_config, + VA_MIC_CONFIG_SIZE); + if (ret != 0) { + dev_err(p->dev, "%s: invalid or missing 'va-mic-config'\n", + __func__); + goto out_free_va_resources; + } + dev_dbg(dev, + "%s: using %u VA mic configuration values from device-tree\n", + __func__, VA_MIC_CONFIG_SIZE); + for (i = 0; i < VA_MIC_CONFIG_SIZE; i++) + dev_dbg(dev, "%s: VA mic cfg %8.8x: 0x%8.8x\n", + __func__, i, pdata->va_mic_config[i]); + + ret = of_property_read_u32(np, + "va-mic-mode", + &pdata->va_initial_mic_config); + if (ret != 0) { + dev_err(p->dev, "%s: invalid or missing 'va-mic-mode'\n", + __func__); + goto out_free_va_resources; + } + dev_dbg(dev, "%s: VA default mic config: 0x%8.8x\n", + __func__, pdata->va_initial_mic_config); + + + ret = of_property_read_u32(np, + "digital_mic_digital_gain", + &pdata->va_mic_gain_config[DBMDX_DIGITAL_MIC_DIGITAL_GAIN]); + if (ret != 0) + pdata->va_mic_gain_config[DBMDX_DIGITAL_MIC_DIGITAL_GAIN] + = 0x1000; + else { + dev_dbg(dev, + "%s: using digital mic gain config 0x%04X from device-tree\n", + __func__, + pdata->va_mic_gain_config[DBMDX_DIGITAL_MIC_DIGITAL_GAIN]); + } + + ret = of_property_read_u32(np, + "analog_mic_analog_gain", + &pdata->va_mic_gain_config[DBMDX_ANALOG_MIC_ANALOG_GAIN]); + if (ret != 0) + pdata->va_mic_gain_config[DBMDX_ANALOG_MIC_ANALOG_GAIN] + = 0x1000; + else { + dev_dbg(dev, + "%s: using analog mic gain config 0x%04X from device-tree\n", + __func__, + pdata->va_mic_gain_config[DBMDX_ANALOG_MIC_ANALOG_GAIN]); + } + + ret = of_property_read_u32(np, + "analog_mic_digital_gain", + &pdata->va_mic_gain_config[DBMDX_ANALOG_MIC_DIGITAL_GAIN]); + if (ret != 0) + pdata->va_mic_gain_config[DBMDX_ANALOG_MIC_DIGITAL_GAIN] + = 0x1000; + else { + dev_dbg(dev, + "%s: using analog mic digital gain 0x%04X from device-tree\n", + __func__, + pdata->va_mic_gain_config[DBMDX_ANALOG_MIC_DIGITAL_GAIN]); + } + + ret = of_property_read_u32(np, + "va_backlog_length", + &p->pdata->va_backlog_length); + if (ret != 0) { + dev_dbg(dev, + "%s: no va_backlog_length definition in device-tree\n", + __func__); + p->pdata->va_backlog_length = 1; + } else { + if (p->pdata->va_backlog_length > 0xfff) + p->pdata->va_backlog_length = 0xfff; + dev_dbg(dev, + "%s: using backlog length of %d from device-tree\n", + __func__, p->pdata->va_backlog_length); + } + +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + ret = of_property_read_u32(np, + "va_backlog_length_okg", + &p->pdata->va_backlog_length_okg); + if (ret != 0) { + dev_dbg(dev, + "%s: no va_backlog_length_okg def. in device-tree\n", + __func__); + p->pdata->va_backlog_length_okg = 1000; + } else { + if (p->pdata->va_backlog_length_okg > 0xfff) + p->pdata->va_backlog_length_okg = 0xfff; + dev_dbg(dev, + "%s: using OKG backlog length of %d from device-tree\n", + __func__, p->pdata->va_backlog_length_okg); + } +#endif + + ret = of_property_read_u32(np, "pcm_streaming_mode", + &p->pdata->pcm_streaming_mode); + if ((ret && ret != -EINVAL) || + (p->pdata->pcm_streaming_mode != 0 && + p->pdata->pcm_streaming_mode != 1)) { + dev_err(p->dev, "%s: invalid 'pcm_streaming_mode'\n", __func__); + goto out_free_va_resources; + } + + ret = dbmdx_get_fw_interfaces(p, "va-interfaces", + p->pdata->va_interfaces); + if (ret) + goto out_free_va_resources; + + return 0; + +out_free_va_resources: + if (pdata->va_cfg_values) + kfree(pdata->va_cfg_value); + pdata->va_cfg_values = 0; +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + if (pdata->va_ns_cfg_values) + kfree(pdata->va_ns_cfg_value); + pdata->va_ns_cfg_values = 0; +#endif +out_err: + return ret; +} + +static int dbmdx_get_vqe_devtree_pdata(struct device *dev, + struct dbmdx_private *p) +{ + struct dbmdx_platform_data *pdata = p->pdata; + struct device_node *np; + struct property *property = NULL; + int ret = 0; + int i; + + np = dev->of_node; + + if (!pdata->feature_vqe) + return 0; + + /* read name of VQE firmware, overlay */ + ret = of_property_read_string(np, "vqe-firmware-name", + &pdata->vqe_firmware_name); + if (ret != 0) { + /* set default name */ + pdata->vqe_firmware_name = DBMD2_VQE_FIRMWARE_NAME; + dev_info(dev, "%s: using default VQE firmware name: %s\n", + __func__, pdata->vqe_firmware_name); + } else + dev_info(dev, "%s: using device-tree VQE firmware name: %s\n", + __func__, pdata->vqe_firmware_name); + + /* read name of VQE firmware, non-overlay */ + ret = of_property_read_string(np, + "vqe-non-overlay-firmware-name", + &pdata->vqe_non_overlay_firmware_name); + if (ret != 0) { + /* set default name */ + pdata->vqe_non_overlay_firmware_name = DBMD2_VQE_FIRMWARE_NAME; + dev_info(dev, + "%s: using default VQE non-overlay firmware name: %s\n", + __func__, pdata->vqe_non_overlay_firmware_name); + } else + dev_info(dev, + "%s: using device-tree VQE non-overlay firmware name: %s\n", + __func__, pdata->vqe_non_overlay_firmware_name); + + property = of_find_property(np, "vqe-config", &pdata->vqe_cfg_values); + if (property) { + pdata->vqe_cfg_value = kzalloc(pdata->vqe_cfg_values, + GFP_KERNEL); + + if (!pdata->vqe_cfg_value) { + ret = -ENOMEM; + goto out_err; + } + + pdata->vqe_cfg_values /= sizeof(u32); + ret = of_property_read_u32_array(np, + "vqe-config", + pdata->vqe_cfg_value, + pdata->vqe_cfg_values); + if (ret) { + dev_err(dev, "%s: Could not read VQE configuration\n", + __func__); + ret = -EIO; + goto out_free_vqe_resources; + } + + dev_info(dev, + "%s: using %u VQE configuration values from device-tree\n", + __func__, pdata->vqe_cfg_values); + + for (i = 0; i < pdata->vqe_cfg_values; i++) + dev_dbg(dev, "%s: VQE cfg %8.8x: 0x%8.8x\n", + __func__, i, pdata->vqe_cfg_value[i]); + } + + property = of_find_property(np, "vqe-modes", &pdata->vqe_modes_values); + + if (property) { + pdata->vqe_modes_value = + kzalloc(pdata->vqe_modes_values, GFP_KERNEL); + + if (!pdata->vqe_modes_value) { + ret = -ENOMEM; + goto out_free_vqe_resources; + } + + pdata->vqe_modes_values /= sizeof(u32); + ret = of_property_read_u32_array(np, + "vqe-modes", + pdata->vqe_modes_value, + pdata->vqe_modes_values); + if (ret) { + dev_err(dev, "%s: Could not read VQE modes\n", + __func__); + ret = -EIO; + goto out_free_vqe_resources_2; + } + dev_info(dev, + "%s: using %u VQE modes values from device-tree\n", + __func__, pdata->vqe_modes_values); + + for (i = 0; i < pdata->vqe_modes_values; i++) + dev_dbg(dev, "%s: VQE mode %8.8x: 0x%8.8x\n", + __func__, i, pdata->vqe_modes_value[i]); + } + + of_property_read_u32(np, "vqe-tdm-bypass-config", + &pdata->vqe_tdm_bypass_config); + dev_info(dev, "%s: VQE TDM bypass config: 0x%8.8x\n", __func__, + pdata->vqe_tdm_bypass_config); + pdata->vqe_tdm_bypass_config &= 0x7; + + ret = dbmdx_get_fw_interfaces(p, "vqe-interfaces", + p->pdata->vqe_interfaces); + if (ret) + goto out_free_vqe_resources_2; + + return 0; + +out_free_vqe_resources_2: + if (pdata->vqe_modes_values) + kfree(pdata->vqe_modes_value); + pdata->vqe_modes_values = 0; +out_free_vqe_resources: + if (pdata->vqe_cfg_values) + kfree(pdata->vqe_cfg_value); + pdata->vqe_cfg_values = 0; +out_err: + return ret; +} + + +static int dbmdx_get_devtree_pdata(struct device *dev, + struct dbmdx_private *p) +{ + struct dbmdx_platform_data *pdata = p->pdata; + struct property *property = NULL; + struct device_node *np; + int ret = 0; + int len = 0; + int i = 0; + + np = dev->of_node; + + /* check for features */ + if (of_find_property(np, "feature-va", NULL)) { + dev_dbg(dev, "%s: VA feature activated\n", __func__); + pdata->feature_va = 1; + } + if (of_find_property(np, "feature-vqe", NULL)) { + dev_dbg(dev, "%s: VQE feature activated\n", __func__); + pdata->feature_vqe = 1; + } + if (of_find_property(np, "feature-firmware-overlay", NULL)) { + dev_dbg(dev, "%s: Firmware overlay activated\n", __func__); + pdata->feature_fw_overlay = 1; + } + + /* check if enabled features make sense */ + if (!pdata->feature_va && !pdata->feature_vqe) { + dev_err(dev, "%s: No feature activated\n", __func__); + ret = -EINVAL; + goto out_err; + } + + if (of_find_property(np, "multi-interface-support", NULL)) { + dev_dbg(dev, "%s: Multi Interface Probe is supported\n", + __func__); + pdata->multi_interface_support = 1; + } else { + dev_dbg(dev, "%s: Multi Interface Probe is not supported\n", + __func__); + pdata->multi_interface_support = 0; + } + + if (pdata->feature_va) { + /* read VA devtree data */ + ret = dbmdx_get_va_devtree_pdata(dev, p); + if (ret != 0) { + dev_err(dev, "%s: Error reading VA device tree data\n", + __func__); + ret = -EINVAL; + goto out_err; + } + } + + if (pdata->feature_vqe) { + /* read VQE devtree data */ + ret = dbmdx_get_vqe_devtree_pdata(dev, p); + if (ret != 0) { + dev_err(dev, "%s: Error reading VQE device tree data\n", + __func__); + ret = -EINVAL; + goto out_err; + } + } + + property = of_find_property(np, "va-speeds", &len); + if (property) { + if (len < DBMDX_VA_NR_OF_SPEEDS * 4) { + dev_err(dev, + "%s: VA speed configuration table too short\n", + __func__); + ret = -EINVAL; + goto out_err; + } + ret = of_property_read_u32_array(np, + "va-speeds", + (u32 *)&pdata->va_speed_cfg, + DBMDX_VA_NR_OF_SPEEDS * 4); + if (ret) { + dev_err(dev, + "%s: Could not read VA speed configuration\n", + __func__); + ret = -EINVAL; + goto out_err; + } + dev_dbg(dev, + "%s: using %u VA speed configuration values from device-tree\n", + __func__, + DBMDX_VA_NR_OF_SPEEDS); + for (i = 0; i < DBMDX_VA_NR_OF_SPEEDS; i++) + dev_dbg(dev, "%s: VA speed cfg %8.8x: 0x%8.8x %u %u %u\n", + __func__, + i, + pdata->va_speed_cfg[i].cfg, + pdata->va_speed_cfg[i].uart_baud, + pdata->va_speed_cfg[i].i2c_rate, + pdata->va_speed_cfg[i].spi_rate); + } + + ret = of_property_read_u32(np, "wakeup_disabled", + &p->pdata->wakeup_disabled); + if ((ret && ret != -EINVAL)) { + dev_err(p->dev, "%s: invalid 'wakeup_disabled'\n", + __func__); + ret = -EINVAL; + goto out_err; + } else if (ret == -EINVAL) { + dev_dbg(p->dev, + "%s: no wakeup_disabled definition in dev-tree\n", + __func__); + p->pdata->wakeup_disabled = 0; + } else { + + if (p->pdata->wakeup_disabled > 1) + p->pdata->wakeup_disabled = 1; + + dev_dbg(p->dev, + "%s: using wakeup_disabled of %d from dev-tree\n", + __func__, p->pdata->wakeup_disabled); + + } + + ret = of_property_read_u32(np, "use_gpio_for_wakeup", + &p->pdata->use_gpio_for_wakeup); + if ((ret && ret != -EINVAL)) { + dev_err(p->dev, "%s: invalid 'use_gpio_for_wakeup'\n", + __func__); + ret = -EINVAL; + goto out_err; + } else if (ret == -EINVAL) { + dev_dbg(p->dev, + "%s: no use_gpio_for_wakeup definition in dev-tree\n", + __func__); + p->pdata->use_gpio_for_wakeup = 1; + } else { + + if (p->pdata->use_gpio_for_wakeup > 1) + p->pdata->use_gpio_for_wakeup = 1; + + dev_dbg(p->dev, + "%s: using use_gpio_for_wakeup of %d from dev-tree\n", + __func__, p->pdata->use_gpio_for_wakeup); + + } + + ret = of_property_read_u32(np, "send_wakeup_seq", + &p->pdata->send_wakeup_seq); + if ((ret && ret != -EINVAL)) { + dev_err(p->dev, "%s: invalid 'send_wakeup_seq'\n", + __func__); + ret = -EINVAL; + goto out_err; + } else if (ret == -EINVAL) { + dev_dbg(p->dev, + "%s: no send_wakeup_seq definition in device-tree\n", + __func__); + p->pdata->send_wakeup_seq = 0; + } else { + + if (p->pdata->send_wakeup_seq > 1) + p->pdata->send_wakeup_seq = 1; + + dev_dbg(p->dev, + "%s: using send_wakeup_seq of %d from device-tree\n", + __func__, p->pdata->send_wakeup_seq); + + } + + ret = of_property_read_u32(np, "wakeup_set_value", + &p->pdata->wakeup_set_value); + if ((ret && ret != -EINVAL)) { + dev_err(p->dev, "%s: invalid 'wakeup_set_value'\n", + __func__); + ret = -EINVAL; + goto out_err; + } else if (ret == -EINVAL) { + dev_dbg(p->dev, + "%s: no wakeup_set_value definition in device-tree\n", + __func__); + p->pdata->wakeup_set_value = 1; + } else { + + if (p->pdata->wakeup_set_value > 1) + p->pdata->wakeup_set_value = 1; + + dev_dbg(p->dev, + "%s: using wakeup_set_value of %d from device-tree\n", + __func__, p->pdata->wakeup_set_value); + + } + + ret = of_property_read_u32(np, "firmware_id", + &p->pdata->firmware_id); + if (ret && ret != -EINVAL) { + dev_err(p->dev, "%s: invalid 'firmware_id'\n", __func__); + ret = -EINVAL; + goto out_err; + } else if (ret == -EINVAL) { + dev_dbg(p->dev, + "%s: no firmware_id definition in device-tree. assuming d2\n", + __func__); + p->pdata->firmware_id = DBMDX_FIRMWARE_ID_DBMD2; + } else { + dev_dbg(p->dev, + "%s: using firmware_id of 0x%8x from device-tree\n", + __func__, p->pdata->firmware_id); + } + + ret = of_property_read_u32(np, "boot_options", + &p->pdata->boot_options); + if (ret && ret != -EINVAL) { + dev_err(p->dev, "%s: invalid 'boot_options'\n", __func__); + ret = -EINVAL; + goto out_err; + } else if (ret == -EINVAL) { + dev_dbg(p->dev, + "%s: no boot_options definition in device-tree.\n", + __func__); + p->pdata->boot_options = DBMDX_BOOT_MODE_NORMAL_BOOT; + } + + ret = of_property_read_u32(np, "amodel_options", + &p->pdata->amodel_options); + if (ret && ret != -EINVAL) { + dev_err(p->dev, "%s: invalid 'amodel_options'\n", __func__); + ret = -EINVAL; + goto out_err; + } else if (ret == -EINVAL) { + dev_dbg(p->dev, + "%s: no amodel_options definition in device-tree.\n", + __func__); + p->pdata->amodel_options = DBMDX_AMODEL_DEFAULT_OPTIONS; + } + + ret = of_property_read_u32(np, "disable_recovery", + &p->pdata->va_recovery_disabled); + if ((ret && ret != -EINVAL) || + (p->pdata->va_recovery_disabled != 0 && + p->pdata->va_recovery_disabled != 1)) { + dev_err(p->dev, "%s: invalid 'va_recovery_disabled'\n", + __func__); + ret = -EINVAL; + goto out_err; + } + + ret = of_property_read_u32(np, "uart_low_speed_enabled", + &p->pdata->uart_low_speed_enabled); + if ((ret && ret != -EINVAL) || + (p->pdata->uart_low_speed_enabled != 0 && + p->pdata->uart_low_speed_enabled != 1)) { + dev_err(p->dev, "%s: invalid 'uart_low_speed_enabled'\n", + __func__); + ret = -EINVAL; + goto out_err; + } + + if (dbmdx_of_get_clk_info(p, np, DBMDX_CLK_MASTER)) { + dev_err(dev, + "%s: failed to get master clock information\n", + __func__); + } + + if (dbmdx_of_get_clk_info(p, np, DBMDX_CLK_CONSTANT)) { + dev_err(dev, + "%s: failed to get constant clock information\n", + __func__); + } + + return 0; +out_err: + return ret; +} + +static int dbmdx_find_chip_interface(struct device_node *np, + struct chip_interface **chip, + enum dbmdx_bus_interface *active_interface) +{ + struct spi_device *spi_dev; + struct i2c_client *i2c_client; + struct platform_device *uart_client; + struct chip_interface *c = NULL; + + *active_interface = DBMDX_INTERFACE_NONE; + + i2c_client = of_find_i2c_device_by_node(np); + if (i2c_client) { + /* got I2C command interface */ + c = i2c_get_clientdata(i2c_client); + if (!c) + return -EPROBE_DEFER; + + *active_interface = DBMDX_INTERFACE_I2C; + } + + uart_client = of_find_platform_device_by_node(np); + if (uart_client) { + /* got UART command interface */ + c = dev_get_drvdata(&uart_client->dev); + if (!c) + return -EPROBE_DEFER; + *active_interface = DBMDX_INTERFACE_UART; + } + + spi_dev = of_find_spi_device_by_node(np); + if (spi_dev) { + /* got spi command interface */ + c = spi_get_drvdata(spi_dev); + if (!c) + return -EPROBE_DEFER; + + *active_interface = DBMDX_INTERFACE_SPI; + } + + *chip = c; + + return c ? 0 : -EINVAL; +} + +static int dbmdx_get_fw_interfaces(struct dbmdx_private *p, + const char *tag, + int *iarray) +{ + struct device_node *np = p->dev->of_node; + struct property *property; + int ret, i, nr_interfaces = 0; + + for (i = 0; i < DBMDX_MAX_INTERFACES; i++) + iarray[i] = -1; + + /* If multiinterface is not supported just set all interfaces to 0 */ + if (!p->pdata->multi_interface_support) { + for (i = 0; i < DBMDX_MAX_INTERFACES; i++) + iarray[i] = 0; + return 0; + } + + property = of_find_property(np, tag, &nr_interfaces); + if (!property) { + dev_err(p->dev, + "%s: no valid %s entry in devicetree\n", + __func__, tag); + return -EINVAL; + } + nr_interfaces /= sizeof(u32); + if (nr_interfaces > DBMDX_MAX_INTERFACES || + nr_interfaces == 0) { + dev_err(p->dev, + "%s: %s min entries is %d, max is %d\n", + __func__, tag, 1, DBMDX_MAX_INTERFACES); + return -EINVAL; + } + + ret = of_property_read_u32_array(np, tag, iarray, nr_interfaces); + if (ret) { + dev_err(p->dev, + "%s: could not read %s\n", __func__, tag); + return -EIO; + } + + dev_dbg(p->dev, + "%s: %s uses %d interfaces from device-tree\n", + __func__, tag, nr_interfaces); + + for (i = 0; i < DBMDX_MAX_INTERFACES; i++) { + /* make sure all interfaces have a valid index */ + if (iarray[i] == -1) + iarray[i] = iarray[0]; + dev_dbg(p->dev, "%s: interface %2.2x: 0x%2.2x\n", + __func__, i, iarray[i]); + } + + return 0; +} + +static int dbmdx_interface_probe_single(struct dbmdx_private *p) +{ + int ret = 0; + struct device_node *np = p->dev->of_node; + struct device_node *interface_np; + struct chip_interface *chip; + enum dbmdx_bus_interface active_interface = DBMDX_INTERFACE_NONE; + + interface_np = of_parse_phandle(np, "cmd-interface", 0); + if (!interface_np) { + dev_err(p->dev, "%s: invalid command interface node\n", + __func__); + ret = -EINVAL; + goto out; + } + + ret = dbmdx_find_chip_interface(interface_np, &chip, &active_interface); + if (ret == -EPROBE_DEFER) + goto out; + if (ret != 0) { + dev_err(p->dev, "%s: invalid interface phandle\n", __func__); + goto out; + } + + p->nr_of_interfaces = 1; + + p->interfaces = kzalloc(sizeof(struct chip_interface *), GFP_KERNEL); + + if (!(p->interfaces)) { + dev_err(p->dev, "%s: no memory for interfaces\n", __func__); + goto out; + } + + p->interface_types = kzalloc(sizeof(enum dbmdx_bus_interface), + GFP_KERNEL); + + if (!(p->interface_types)) { + dev_err(p->dev, "%s: no memory for interface types\n", + __func__); + goto out; + } + + p->interfaces[0] = chip; + p->interface_types[0] = active_interface; + + /* set chip interface */ + p->chip = chip; + + p->active_interface = active_interface; + + return 0; +out: + kfree(p->interfaces); + kfree(p->interface_types); + return ret; +} + +static int dbmdx_interface_probe_multi(struct dbmdx_private *p) +{ + int ret = 0; + unsigned int nr_interfaces = 0; + int i = 0; + struct device_node *np = p->dev->of_node; + struct device_node *interface_np; + struct chip_interface *chip; + struct chip_interface **interfaces = NULL; + enum dbmdx_bus_interface *interface_types = NULL; + enum dbmdx_bus_interface *new_interface_types; + struct chip_interface **new_interfaces; + enum dbmdx_bus_interface active_interface = DBMDX_INTERFACE_NONE; + + do { + interface_np = of_parse_phandle(np, "cd-interfaces", i++); + if (!interface_np) + continue; + + ret = dbmdx_find_chip_interface(interface_np, &chip, + &active_interface); + if (ret == -EPROBE_DEFER) + goto out; + if (ret != 0) { + dev_err(p->dev, "%s: invalid interface phandle\n", + __func__); + goto out; + } + + new_interfaces = krealloc(interfaces, + sizeof(struct chip_interface *) * + (nr_interfaces + 1), + GFP_KERNEL); + if (!new_interfaces) { + dev_err(p->dev, "%s: no memory for interfaces\n", + __func__); + goto out; + } + + new_interface_types = krealloc(interface_types, + sizeof(enum dbmdx_bus_interface) * + (nr_interfaces + 1), + GFP_KERNEL); + if (!new_interface_types) { + dev_err(p->dev, "%s: no memory for interface types\n", + __func__); + goto out; + } + + interfaces = new_interfaces; + interfaces[nr_interfaces] = chip; + interface_types = new_interface_types; + interface_types[nr_interfaces] = active_interface; + nr_interfaces++; + + } while (interface_np); + + if (!nr_interfaces) { + dev_err(p->dev, "%s: invalid nr of interfaces\n", + __func__); + ret = -EINVAL; + goto out_free_interfaces; + } + + p->nr_of_interfaces = nr_interfaces; + p->interfaces = interfaces; + p->interface_types = interface_types; + + dev_info(p->dev, "%s: found %u interfaces\n", __func__, nr_interfaces); + + + return 0; +out_free_interfaces: + kfree(interfaces); + kfree(interface_types); +out: + return ret; +} + +static int dbmdx_interface_probe(struct dbmdx_private *p) +{ + /* check for features */ + if (p->pdata->multi_interface_support) + return dbmdx_interface_probe_multi(p); + + return dbmdx_interface_probe_single(p); +} + +#else +static int dbmdx_name_match(struct device *dev, void *dev_name) +{ + struct platform_device *pdev = to_platform_device(dev); + + if (!pdev || !pdev->name) + return 0; + + return !strcmp(pdev->name, dev_name); +} + +static int dbmdx_spi_name_match(struct device *dev, void *dev_name) +{ + struct spi_device *spi_dev = to_spi_device(dev); + + if (!spi_dev || !spi_dev->modalias) + return 0; + + return !strcmp(spi_dev->modalias, dev_name); +} + +static int dbmdx_i2c_name_match(struct device *dev, void *dev_name) +{ + struct i2c_client *i2c_dev = to_i2c_client(dev); + + if (!i2c_dev || !i2c_dev->name) + return 0; + + return !strcmp(i2c_dev->name, dev_name); +} + +struct i2c_client *dbmdx_find_i2c_device_by_name(const char *dev_name) +{ + struct device *dev; + + dev = bus_find_device(&i2c_bus_type, NULL, (void *)dev_name, + dbmdx_i2c_name_match); + + return dev ? to_i2c_client(dev) : NULL; +} + +struct spi_device *dbmdx_find_spi_device_by_name(const char *dev_name) +{ + struct device *dev; + + dev = bus_find_device(&spi_bus_type, NULL, + (void *)dev_name, dbmdx_spi_name_match); + return dev ? to_spi_device(dev) : NULL; +} + +struct platform_device *dbmdx_find_platform_device_by_name(const char *dev_name) +{ + struct device *dev; + + dev = bus_find_device(&platform_bus_type, NULL, + (void *)dev_name, dbmdx_name_match); + return dev ? to_platform_device(dev) : NULL; +} + + +static int dbmdx_platform_get_clk_info(struct dbmdx_private *p, + enum dbmdx_clocks dbmdx_clk) +{ + int rate, rrate; + struct clk *clk; + struct dbmdx_platform_data *pdata = p->pdata; + + rate = pdata->clock_rates[dbmdx_clk]; + dev_info(p->dev, + "%s: using %s at %dHZ\n", + __func__, + dbmdx_of_clk_names[dbmdx_clk], + rate); + + clk = clk_get(p->dev, dbmdx_of_clk_names[dbmdx_clk]); + if (IS_ERR(clk)) { + dev_info(p->dev, + "%s: no %s definition\n", + __func__, + dbmdx_of_clk_names[dbmdx_clk]); + /* nothing in the device tree */ + clk = NULL; + } else { + /* If clock rate not specified in dts, try to detect */ + if (rate == -1) { + rate = clk_get_rate(clk); + dev_info(p->dev, + "%s: using %s at %dHZ\n", + __func__, + dbmdx_of_clk_names[dbmdx_clk], + rate); + } else { + /* verify which rate can be set */ + rrate = clk_round_rate(clk, rate); + if (rrate != rate) { + dev_info(p->dev, + "%s: rounded rate %d to %d\n", + __func__, + rate, rrate); + rate = rrate; + } + } + } + p->clocks[dbmdx_clk] = clk; + p->pdata->clock_rates[dbmdx_clk] = rate; + + return 0; +} + + +static int verify_platform_data(struct device *dev, + struct dbmdx_private *p) +{ + struct dbmdx_platform_data *pdata = p->pdata; + int i; + + /* check for features */ + if (pdata->feature_va) + dev_info(dev, "%s: VA feature activated\n", __func__); + else + dev_info(dev, "%s: VA feature not activated\n", __func__); + + if (pdata->feature_vqe) + dev_info(dev, "%s: VQE feature activated\n", __func__); + else + dev_info(dev, "%s: VQE feature not activated\n", __func__); + + if (pdata->feature_fw_overlay) + dev_info(dev, "%s: Firmware overlay activated\n", __func__); + else + dev_info(dev, "%s: Firmware overlay not activated\n", __func__); + + /* check if enabled features make sense */ + if (!pdata->feature_va && !pdata->feature_vqe) { + dev_err(dev, "%s: No feature activated\n", __func__); + return -EINVAL; + } + if (pdata->multi_interface_support > 1) + pdata->multi_interface_support = 1; + + if (pdata->multi_interface_support) + dev_info(dev, "%s: Multi Interface Probe is supported\n", + __func__); + else + dev_info(dev, "%s: Multi Interface Probe is not supported\n", + __func__); + + if (pdata->feature_va) { + dev_info(dev, "%s: VA firmware name: %s\n", + __func__, pdata->va_firmware_name); + + dev_info(dev, "%s: VA preboot firmware name: %s\n", + __func__, pdata->va_preboot_firmware_name); +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + dev_info(dev, "%s: VA ASRP firmware name: %s\n", + __func__, pdata->va_asrp_params_firmware_name); +#endif + + if (pdata->auto_buffering != 0 && + pdata->auto_buffering != 1) + pdata->auto_buffering = 0; + + dev_info(dev, "%s: using auto_buffering of %d\n", + __func__, pdata->auto_buffering); + + if (pdata->auto_detection != 0 && + pdata->auto_detection != 1) + pdata->auto_detection = 1; + + dev_info(dev, "%s: using auto_detection of %d\n", + __func__, pdata->auto_detection); + + if (pdata->detection_after_buffering < 0 || + pdata->detection_after_buffering >= + DETECTION_AFTER_BUFFERING_MODE_MAX) + pdata->detection_after_buffering = + DETECTION_AFTER_BUFFERING_OFF; + + dev_info(dev, "%s: using detection_after_buffering of %d\n", + __func__, pdata->detection_after_buffering); + + if (pdata->send_uevent_on_detection != 0 && + pdata->send_uevent_on_detection != 1) + pdata->send_uevent_on_detection = 0; + + dev_info(dev, "%s: using send_uevent_on_detection of %d\n", + __func__, pdata->send_uevent_on_detection); + + if (pdata->send_uevent_after_buffering != 0 && + pdata->send_uevent_after_buffering != 1) + pdata->send_uevent_after_buffering = 0; + + dev_info(dev, "%s: using send_uevent_after_buffering of %d\n", + __func__, pdata->send_uevent_after_buffering); + + if (p->pdata->buffering_timeout < MIN_RETRIES_TO_WRITE_TOBUF) + p->pdata->buffering_timeout = + MIN_RETRIES_TO_WRITE_TOBUF; + + dev_info(p->dev, + "%s: using buffering_timeout of %u\n", + __func__, p->pdata->buffering_timeout); + + dev_info(p->dev, + "%s: using retrigger interval of %u sec\n", + __func__, p->pdata->retrigger_interval_sec); + + if (pdata->detection_buffer_channels < 0 || + pdata->detection_buffer_channels > MAX_SUPPORTED_CHANNELS) + pdata->detection_buffer_channels = 0; + + dev_info(p->dev, "%s: using detection_buffer_channels of %d\n", + __func__, pdata->detection_buffer_channels); + + dev_info(p->dev, "%s: using min_samples_chunk_size of %d\n", + __func__, pdata->min_samples_chunk_size); + + dev_info(p->dev, "%s: using max_detection_buffer_size of %d\n", + __func__, pdata->max_detection_buffer_size); + + if (pdata->va_buffering_pcm_rate != 16000 && + pdata->va_buffering_pcm_rate != 32000) + pdata->va_buffering_pcm_rate = 16000; + + dev_info(p->dev, "%s: using va_buffering_pcm_rate of %u\n", + __func__, pdata->va_buffering_pcm_rate); + + for (i = 0; i < pdata->va_cfg_values; i++) + dev_dbg(dev, "%s: VA cfg %8.8x: 0x%8.8x\n", + __func__, i, pdata->va_cfg_value[i]); + + for (i = 0; i < VA_MIC_CONFIG_SIZE; i++) + dev_dbg(dev, "%s: VA mic cfg %8.8x: 0x%8.8x\n", + __func__, i, pdata->va_mic_config[i]); + + dev_info(dev, "%s: VA default mic config: 0x%8.8x\n", + __func__, pdata->va_initial_mic_config); + + for (i = 0; i < 3; i++) + dev_dbg(dev, "%s: VA mic gain cfg %i: 0x%04X\n", + __func__, i, pdata->va_mic_gain_config[i]); + + if (pdata->va_backlog_length > 0xfff) + pdata->va_backlog_length = 0xfff; + + dev_info(dev, "%s: using backlog length of %d\n", + __func__, pdata->va_backlog_length); + +#if IS_ENABLED(DMBDX_OKG_AMODEL_SUPPORT) + if (pdata->va_backlog_length_okg > 0xfff) + pdata->va_backlog_length_okg = 0xfff; + + dev_info(dev, "%s: using OKG backlog length of %d\n", + __func__, pdata->va_backlog_length_okg); +#endif + + if (pdata->pcm_streaming_mode != 0 && + pdata->pcm_streaming_mode != 1) + pdata->pcm_streaming_mode = 0; + + dev_info(dev, "%s: using pcm_streaming_mode of %d\n", + __func__, pdata->pcm_streaming_mode); + + dev_dbg(p->dev, "va-interfaces:\n"); + + for (i = 0; i < DBMDX_MAX_INTERFACES; i++) + dev_dbg(p->dev, "%s: interface %d: %d\n", + __func__, i, p->pdata->va_interfaces[i]); + } + + if (pdata->feature_vqe) { + dev_info(dev, "%s: VQE firmware name: %s\n", + __func__, pdata->vqe_firmware_name); + + dev_info(dev, "%s: VQE non-overlay firmware name: %s\n", + __func__, pdata->vqe_non_overlay_firmware_name); + for (i = 0; i < pdata->vqe_cfg_values; i++) + dev_dbg(dev, "%s: VQE cfg %8.8x: 0x%8.8x\n", + __func__, i, pdata->vqe_cfg_value[i]); + + for (i = 0; i < pdata->vqe_modes_values; i++) + dev_dbg(dev, "%s: VQE mode %8.8x: 0x%8.8x\n", + __func__, i, pdata->vqe_modes_value[i]); + + dev_info(dev, "%s: VQE TDM bypass config: 0x%8.8x\n", + __func__, + pdata->vqe_tdm_bypass_config); + + dev_dbg(p->dev, "vqe-interfaces:\n"); + + for (i = 0; i < DBMDX_MAX_INTERFACES; i++) { + dev_dbg(p->dev, "%s: interface %d: %d\n", + __func__, i, p->pdata->vqe_interfaces[i]); + } + + + pdata->vqe_tdm_bypass_config &= 0x7; + } +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + if (pdata->va_ns_supported > 1) + pdata->va_ns_supported = 1; + + dev_info(dev, "%s: using va_ns_supported of %d\n", + __func__, pdata->va_ns_supported); + + if (pdata->va_ns_supported) { + int j; + + dev_info(dev, "%s: using mic_config_source of %d\n", + __func__, pdata->mic_config_source); + + dev_info(dev, "%s: using va_ns-num_of_configs of %d\n", + __func__, pdata->va_ns_num_of_configs); + + for (j = 0; j < pdata->va_ns_num_of_configs; j++) { + dev_info(dev, + "%s:\n===== VA_NS configuration #%d =====\n", + __func__, j); + + for (i = 0; i < pdata->va_ns_cfg_values; i++) + dev_dbg(dev, "%s:\tVA_NS cfg %8.8x: 0x%8.8x\n", + __func__, i, + pdata->va_ns_cfg_value[j][i]); + } + } +#endif + for (i = 0; i < DBMDX_VA_NR_OF_SPEEDS; i++) + dev_dbg(dev, "%s: VA speed cfg %8.8x: 0x%8.8x %u %u %u\n", + __func__, + i, + pdata->va_speed_cfg[i].cfg, + pdata->va_speed_cfg[i].uart_baud, + pdata->va_speed_cfg[i].i2c_rate, + pdata->va_speed_cfg[i].spi_rate); + + if (pdata->wakeup_disabled > 1) + pdata->wakeup_disabled = 1; + + dev_info(dev, "%s: using wakeup_disabled of %d\n", + __func__, pdata->wakeup_disabled); + + + if (pdata->use_gpio_for_wakeup > 1) + pdata->use_gpio_for_wakeup = 1; + + dev_info(dev, "%s: using use_gpio_for_wakeup of %d\n", + __func__, pdata->use_gpio_for_wakeup); + + if (pdata->send_wakeup_seq > 1) + pdata->send_wakeup_seq = 1; + + dev_info(dev, "%s: using send_wakeup_seq of %d\n", + __func__, pdata->send_wakeup_seq); + + if (pdata->wakeup_set_value > 1) + pdata->wakeup_set_value = 1; + + dev_info(dev, "%s: using wakeup_set_value of %d\n", + __func__, pdata->wakeup_set_value); + + dev_info(dev, "%s: using firmware_id of 0x%8x\n", + __func__, pdata->firmware_id); + + dev_info(dev, "%s: using boot_options of 0x%8x\n", + __func__, pdata->boot_options); + + dev_info(dev, "%s: using amodel_options of 0x%8x\n", + __func__, pdata->amodel_options); + + if (pdata->va_recovery_disabled != 0 && + pdata->va_recovery_disabled != 1) + pdata->va_recovery_disabled = 0; + + dev_info(dev, + "%s: using va_recovery_disabled of %d\n", + __func__, pdata->va_recovery_disabled); + + if (pdata->uart_low_speed_enabled != 0 && + pdata->uart_low_speed_enabled != 1) + pdata->uart_low_speed_enabled = 0; + + dev_info(p->dev, + "%s: using uart_low_speed_enabled of %d\n", + __func__, pdata->uart_low_speed_enabled); + + dev_info(p->dev, + "%s: using min_samples_chunk_size of %d\n", + __func__, pdata->min_samples_chunk_size); + + dev_info(p->dev, + "%s: using max_detection_buffer_size of %d\n", + __func__, pdata->max_detection_buffer_size); + + + if (dbmdx_platform_get_clk_info(p, DBMDX_CLK_MASTER)) { + dev_err(dev, + "%s: failed to get master clock information\n", + __func__); + } + + if (dbmdx_platform_get_clk_info(p, DBMDX_CLK_CONSTANT)) { + dev_err(dev, + "%s: failed to get constant clock information\n", + __func__); + } + + + return 0; +} + +static int dbmdx_find_chip_interface(struct chip_interface **chip, + enum dbmdx_bus_interface *active_interface) +{ + struct spi_device *spi_dev; + struct i2c_client *i2c_client; + struct platform_device *uart_client; + struct chip_interface *c = NULL; + + *active_interface = DBMDX_INTERFACE_NONE; + + i2c_client = dbmdx_find_i2c_device_by_name("dbmdx-i2c"); + + if (!i2c_client) + i2c_client = dbmdx_find_i2c_device_by_name("dbmd_4_6-i2c"); + + if (!i2c_client) + i2c_client = dbmdx_find_i2c_device_by_name("dbmd6-i2c"); + + if (!i2c_client) + i2c_client = dbmdx_find_i2c_device_by_name("dbmd4-i2c"); + + if (!i2c_client) + i2c_client = dbmdx_find_i2c_device_by_name("dbmd2-i2c"); + + if (i2c_client) { + /* got I2C command interface */ + c = i2c_get_clientdata(i2c_client); + if (!c) + return -EPROBE_DEFER; + + *active_interface = DBMDX_INTERFACE_I2C; + } + + uart_client = dbmdx_find_platform_device_by_name("dbmdx-uart"); + + if (!uart_client) + uart_client = + dbmdx_find_platform_device_by_name("dbmd_4_6-uart"); + + if (!uart_client) + uart_client = dbmdx_find_platform_device_by_name("dbmd6-uart"); + + if (!uart_client) + uart_client = dbmdx_find_platform_device_by_name("dbmd4-uart"); + + if (!uart_client) + uart_client = dbmdx_find_platform_device_by_name("dbmd2-uart"); + + if (uart_client) { + /* got UART command interface */ + c = dev_get_drvdata(&uart_client->dev); + if (!c) + return -EPROBE_DEFER; + *active_interface = DBMDX_INTERFACE_UART; + } + + spi_dev = dbmdx_find_spi_device_by_name("dbmdx-spi"); + + if (!spi_dev) + spi_dev = dbmdx_find_spi_device_by_name("dbmd_4_6-spi"); + + if (!spi_dev) + spi_dev = dbmdx_find_spi_device_by_name("dbmd6-spi"); + + if (!spi_dev) + spi_dev = dbmdx_find_spi_device_by_name("dbmd4-spi"); + + if (!spi_dev) + spi_dev = dbmdx_find_spi_device_by_name("dbmd2-spi"); + + if (spi_dev) { + /* got spi command interface */ + dev_info(&spi_dev->dev, "%s: spi interface node %p\n", + __func__, spi_dev); + + /* got spi command interface */ + c = spi_get_drvdata(spi_dev); + if (!c) + return -EPROBE_DEFER; + + *active_interface = DBMDX_INTERFACE_SPI; + } + + *chip = c; + + return c ? 0 : -EINVAL; +} +static int dbmdx_find_chip_interface_by_name(const char *iface_name, + struct chip_interface **chip, + enum dbmdx_bus_interface *active_interface) +{ + struct spi_device *spi_dev; + struct i2c_client *i2c_client; + struct platform_device *uart_client; + struct chip_interface *c = NULL; + + *active_interface = DBMDX_INTERFACE_NONE; + + i2c_client = dbmdx_find_i2c_device_by_name(iface_name); + + if (i2c_client) { + /* got I2C command interface */ + c = i2c_get_clientdata(i2c_client); + if (!c) + return -EPROBE_DEFER; + + *active_interface = DBMDX_INTERFACE_I2C; + goto out; + } + + uart_client = dbmdx_find_platform_device_by_name(iface_name); + + if (uart_client) { + /* got UART command interface */ + c = dev_get_drvdata(&uart_client->dev); + if (!c) + return -EPROBE_DEFER; + *active_interface = DBMDX_INTERFACE_UART; + goto out; + } + + spi_dev = dbmdx_find_spi_device_by_name(iface_name); + + if (spi_dev) { + /* got spi command interface */ + dev_info(&spi_dev->dev, "%s: spi interface node %p\n", + __func__, spi_dev); + + /* got spi command interface */ + c = spi_get_drvdata(spi_dev); + if (!c) + return -EPROBE_DEFER; + + *active_interface = DBMDX_INTERFACE_SPI; + goto out; + } +out: + *chip = c; + + return c ? 0 : -EINVAL; +} + +static int dbmdx_interface_probe_single(struct dbmdx_private *p) +{ + int ret = 0; + struct chip_interface *chip; + enum dbmdx_bus_interface active_interface = DBMDX_INTERFACE_NONE; + + ret = dbmdx_find_chip_interface(&chip, &active_interface); + if (ret == -EPROBE_DEFER) + goto out; + if (ret != 0) { + dev_err(p->dev, "%s: invalid interface phandle\n", __func__); + goto out; + } + + p->nr_of_interfaces = 1; + + p->interfaces = kzalloc(sizeof(struct chip_interface *), GFP_KERNEL); + + if (!(p->interfaces)) { + dev_err(p->dev, "%s: no memory for interfaces\n", __func__); + goto out; + } + + p->interface_types = kzalloc(sizeof(enum dbmdx_bus_interface), + GFP_KERNEL); + + if (!(p->interface_types)) { + dev_err(p->dev, "%s: no memory for interface types\n", + __func__); + goto out; + } + + p->interfaces[0] = chip; + p->interface_types[0] = active_interface; + + /* set chip interface */ + p->chip = chip; + + p->active_interface = active_interface; + + return 0; +out: + kfree(p->interfaces); + kfree(p->interface_types); + return ret; +} + +static int dbmdx_interface_probe_multi(struct dbmdx_private *p) +{ + int ret = 0; + unsigned int nr_interfaces = 0; + int interface_ind; + struct chip_interface *chip; + struct chip_interface **interfaces = NULL; + enum dbmdx_bus_interface *interface_types = NULL; + enum dbmdx_bus_interface *new_interface_types; + struct chip_interface **new_interfaces; + enum dbmdx_bus_interface active_interface = DBMDX_INTERFACE_NONE; + + if (!p->pdata->cd_interfaces) { + dev_err(p->dev, "%s: invalid interfaces array\n", __func__); + ret = -EINVAL; + goto out; + } + + for (interface_ind = 0; p->pdata->cd_interfaces[interface_ind]; + ++interface_ind) { + + const char *interface_name = + p->pdata->cd_interfaces[interface_ind]; + + if (!interface_name) + break; + + ret = dbmdx_find_chip_interface_by_name(interface_name, &chip, + &active_interface); + if (ret == -EPROBE_DEFER) + goto out; + if (ret != 0) { + dev_err(p->dev, "%s: invalid interface phandle [%s]\n", + __func__, interface_name); + goto out; + } + + new_interfaces = krealloc(interfaces, + sizeof(struct chip_interface *) * + (nr_interfaces + 1), + GFP_KERNEL); + if (!new_interfaces) { + dev_err(p->dev, "%s: no memory for interfaces\n", + __func__); + goto out; + } + + new_interface_types = krealloc(interface_types, + sizeof(enum dbmdx_bus_interface) * + (nr_interfaces + 1), + GFP_KERNEL); + if (!new_interface_types) { + dev_err(p->dev, "%s: no memory for interface types\n", + __func__); + goto out; + } + + interfaces = new_interfaces; + interfaces[nr_interfaces] = chip; + interface_types = new_interface_types; + interface_types[nr_interfaces] = active_interface; + nr_interfaces++; + + } + + if (!nr_interfaces) { + dev_err(p->dev, "%s: invalid nr of interfaces\n", + __func__); + ret = -EINVAL; + goto out_free_interfaces; + } + + p->nr_of_interfaces = nr_interfaces; + p->interfaces = interfaces; + p->interface_types = interface_types; + + dev_info(p->dev, "%s: found %u interfaces\n", __func__, nr_interfaces); + + + return 0; +out_free_interfaces: + kfree(interfaces); + kfree(interface_types); +out: + return ret; +} + + +static int dbmdx_interface_probe(struct dbmdx_private *p) +{ + /* check for features */ + if (p->pdata->multi_interface_support) + return dbmdx_interface_probe_multi(p); + + return dbmdx_interface_probe_single(p); +} +#endif + +static int dbmdx_platform_probe(struct platform_device *pdev) +{ + struct dbmdx_platform_data *pdata; + struct dbmdx_private *p; + int ret = 0; + +#if (defined(DBMDX_DEFER_SND_CARD_LOADING) && IS_MODULE(CONFIG_SND_SOC_DBMDX)) + struct device_node *np = pdev->dev.of_node; + int card_index = 0; +#endif + + dev_info(&pdev->dev, "%s: DBMDX codec driver version = %s\n", + __func__, DRIVER_VERSION); + +#if (defined(DBMDX_DEFER_SND_CARD_LOADING) && IS_MODULE(CONFIG_SND_SOC_DBMDX)) + ret = of_property_read_u32(np, "wait_for_card_index", + &card_index); + if ((ret && ret != -EINVAL)) { + dev_info(&pdev->dev, "%s: invalid 'card_index' using default\n", + __func__); + } else { + dev_info(&pdev->dev, "%s: 'wait_for_card_index' = %d\n", + __func__, card_index); + } + if (!snd_cards[card_index] || !(snd_cards[card_index]->id[0])) { + dev_info(&pdev->dev, + "%s: Defering DBMDX platform probe, wait primary [%d] card...\n", + __func__, card_index); + return -EPROBE_DEFER; + } +#endif + + p = kzalloc(sizeof(*p), GFP_KERNEL); + if (p == NULL) { + ret = -ENOMEM; + goto out; + } + + p->dev = &pdev->dev; + +#if IS_ENABLED(CONFIG_OF) + pdata = kzalloc(sizeof(struct dbmdx_platform_data), GFP_KERNEL); + if (!pdata) { + ret = -ENOMEM; + goto out_err_free_private; + } + + p->pdata = pdata; + + ret = dbmdx_get_devtree_pdata(p->dev, p); + if (ret) { + dev_err(p->dev, "%s: failed to read device tree data\n", + __func__); + goto out_err_free_pdata; + } +#else + pdata = dev_get_platdata(p->dev); + + if (pdata == NULL) { + ret = -ENODEV; + dev_err(&pdev->dev, "%s: Failed to get platform data\n", + __func__); + goto out_err_free_private; + } + + p->pdata = pdata; + + ret = verify_platform_data(p->dev, p); + if (ret) { + dev_err(p->dev, "%s: Failed to verify platform data\n", + __func__); + goto out_err_free_pdata; + } +#endif + +#if IS_MODULE(CONFIG_SND_SOC_DBMDX) + dbmdx_init_interface(); +#endif + + ret = dbmdx_interface_probe(p); + if (ret) { + dev_info(&pdev->dev, + "%s: Defering DBMDX platform probe, wait for valid interface handle...\n", + __func__); + ret = -EPROBE_DEFER; + goto out_err_free_pdata; + } + + + p->dev = &pdev->dev; + + p->vregulator = devm_regulator_get(p->dev, "dbmdx_regulator"); + if (IS_ERR(p->vregulator)) { + dev_info(p->dev, "%s: Can't get voltage regulator\n", + __func__); + p->vregulator = NULL; + } + + /* set initial mic as it appears in the platform data */ + p->va_current_mic_config = pdata->va_initial_mic_config; + p->va_active_mic_config = pdata->va_initial_mic_config; + + if ((pdata->va_initial_mic_config == DBMDX_MIC_MODE_DIGITAL_LEFT) || + (pdata->va_initial_mic_config == + DBMDX_MIC_MODE_DIGITAL_RIGHT) || + (pdata->va_initial_mic_config == DBMDX_MIC_MODE_ANALOG)) { + + p->pdata->va_audio_channels = 1; + + } else if (pdata->va_initial_mic_config == + DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_LEFT || + pdata->va_initial_mic_config == + DBMDX_MIC_MODE_DIGITAL_STEREO_TRIG_ON_RIGHT) { + +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + p->pdata->va_audio_channels = 1; +#else + p->pdata->va_audio_channels = 2; +#endif + +#if IS_ENABLED(DBMDX_4CHANNELS_SUPPORT) + } else if (pdata->va_initial_mic_config == DBMDX_MIC_MODE_DIGITAL_4CH) { + + p->pdata->va_audio_channels = 4; + +#endif + } + + p->va_cur_digital_mic_digital_gain = + pdata->va_mic_gain_config[DBMDX_DIGITAL_MIC_DIGITAL_GAIN]; + p->va_cur_analog_mic_analog_gain = + pdata->va_mic_gain_config[DBMDX_ANALOG_MIC_ANALOG_GAIN]; + /* analog mic gain is a sum of analog gain & digital gain*/ + p->va_cur_analog_mic_digital_gain = + pdata->va_mic_gain_config[DBMDX_ANALOG_MIC_DIGITAL_GAIN]; + + p->vqe_vc_syscfg = DBMDX_VQE_SET_SYSTEM_CONFIG_SECONDARY_CFG; + +#if IS_ENABLED(DBMDX_VA_NS_SUPPORT) + p->va_ns_enabled = true; + p->va_ns_pcm_streaming_enabled = false; + +#if IS_ENABLED(DBMDX_ALWAYS_RELOAD_ASRP_PARAMS) + p->va_load_asrp_params_options = + DBMDX_ASRP_PARAMS_OPTIONS_ALWAYS_RELOAD; +#endif + +#endif + /* initialize delayed pm work */ + INIT_DELAYED_WORK(&p->delayed_pm_work, + dbmdx_delayed_pm_work_hibernate); + +#if IS_ENABLED(DBMDX_KEEP_ALIVE_TIMER) + if (alarmtimer_get_rtcdev()) { + alarm_init(&p->keep_alive_timer, ALARM_BOOTTIME, + keep_alive_timer_func); + p->keep_alive_timer_created = true; + p->keep_alive_timer.data = (void *)p; + dev_info(p->dev, "%s: Keep Alive Timer was created\n", + __func__); + } else { + p->keep_alive_timer_created = false; + dev_info(p->dev, "%s: Keep Alive Timer isn't supported\n", + __func__); + } +#endif + p->dbmdx_workq = create_workqueue("dbmdx-wq"); + if (!p->dbmdx_workq) { + dev_err(p->dev, "%s: Could not create workqueue\n", + __func__); + ret = -EIO; + goto out_err_free_pdata; + } + + /* set helper functions */ + p->reset_set = dbmdx_reset_set; + p->reset_release = dbmdx_reset_release; + p->reset_sequence = dbmdx_reset_sequence; + p->wakeup_set = dbmdx_wakeup_set; + p->wakeup_release = dbmdx_wakeup_release; + p->wakeup_toggle = dbmdx_wakeup_toggle; + p->lock = dbmdx_lock; + p->unlock = dbmdx_unlock; + p->verify_checksum = dbmdx_verify_checksum; + p->va_set_speed = dbmdx_va_set_speed; + p->clk_get_rate = dbmdx_clk_get_rate; + p->clk_set_rate = dbmdx_clk_set_rate; + p->clk_enable = dbmdx_clk_enable; + p->clk_disable = dbmdx_clk_disable; + + /* set callbacks (if already set externally) */ + if (g_set_i2c_freq_callback) + p->set_i2c_freq_callback = g_set_i2c_freq_callback; + if (g_event_callback) + p->event_callback = g_event_callback; + + p->rxsize = MAX_REQ_SIZE; + + ret = dbmdx_common_probe(p); + if (ret < 0) { + dev_err(p->dev, "%s: probe failed\n", __func__); + goto out_err_destroy_workqueue; + } +#ifndef ALSA_SOC_INTERFACE_NOT_SUPPORTED + if (remote_codec && p->remote_codec_in_use == 0) + dbmdx_remote_add_codec_controls(remote_codec); + +#if IS_MODULE(CONFIG_SND_SOC_DBMDX) +#if IS_ENABLED(CONFIG_SND_SOC_DBMDX_SND_CAPTURE) + board_dbmdx_snd_init(); + snd_dbmdx_pcm_init(); +#endif +#endif +#endif + + dev_info(p->dev, "%s: successfully probed\n", __func__); + return 0; + +out_err_destroy_workqueue: + destroy_workqueue(p->dbmdx_workq); +out_err_free_pdata: +#if IS_ENABLED(CONFIG_OF) + kfree(pdata); +#endif +out_err_free_private: + kfree(p); +out: + return ret; +} + +static int dbmdx_platform_remove(struct platform_device *pdev) +{ + struct dbmdx_private *p = platform_get_drvdata(pdev); + + dbmdx_common_remove(p); + + return 0; +} + +#if IS_ENABLED(CONFIG_OF) +static const struct of_device_id dbmdx_of_match[] = { + { .compatible = "dspg,dbmdx-codec", }, + {} +}; +MODULE_DEVICE_TABLE(of, dbmdx_of_match); +#endif + +static struct platform_driver dbmdx_platform_driver = { + .driver = { + .name = "dbmdx-codec", + .owner = THIS_MODULE, +#if IS_ENABLED(CONFIG_OF) + .of_match_table = dbmdx_of_match, +#endif + }, + .probe = dbmdx_platform_probe, + .remove = dbmdx_platform_remove, +}; + +static int __init dbmdx_modinit(void) +{ + return platform_driver_register(&dbmdx_platform_driver); +} +module_init(dbmdx_modinit); + +static void __exit dbmdx_exit(void) +{ + platform_driver_unregister(&dbmdx_platform_driver); +} +module_exit(dbmdx_exit); + +MODULE_VERSION(DRIVER_VERSION); +MODULE_DESCRIPTION("DSPG DBMDX codec driver"); +MODULE_LICENSE("GPL"); diff --git a/techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.c b/techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.c index 33b9100f2ec2..722463b0fa79 100755 --- a/techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.c +++ b/techpack/audio/4.0/asoc/codecs/wcd-mbhc-adc.c @@ -52,7 +52,6 @@ static int wcd_mbhc_get_micbias(struct wcd_mbhc *mbhc) __func__, vout_ctl, micbias); return micbias; - } static int wcd_get_voltage_from_adc(u8 val, int micbias) @@ -599,6 +598,10 @@ static void wcd_mbhc_adc_detect_plug_type(struct wcd_mbhc *mbhc) /* disable MIC_CLAMP */ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MIC_CLAMP_CTL, 0); + /* disable surge protection */ + WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_EN_SURGE_PROTECTION_HPHL, 0); + WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_EN_SURGE_PROTECTION_HPHR, 0); + WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 0); if (mbhc->mbhc_cb->mbhc_micbias_control) { @@ -716,10 +719,10 @@ static int wcd_mbhc_get_plug_from_adc(struct wcd_mbhc *mbhc, int adc_result) #ifdef CONFIG_SEC_FACTORY plug_type = MBHC_PLUG_TYPE_HEADSET; #else - plug_type = MBHC_PLUG_TYPE_HIGH_HPH; + plug_type = MBHC_PLUG_TYPE_HIGH_HPH; #endif - else - plug_type = MBHC_PLUG_TYPE_HEADSET; + else + plug_type = MBHC_PLUG_TYPE_HEADSET; } else plug_type = MBHC_PLUG_TYPE_HEADSET; pr_info("%s: plug type is %d found\n", __func__, plug_type); @@ -931,7 +934,7 @@ correct_plug_type: #ifdef CONFIG_SEC_FACTORY plug_type = MBHC_PLUG_TYPE_HEADSET; #else - plug_type = MBHC_PLUG_TYPE_HIGH_HPH; + plug_type = MBHC_PLUG_TYPE_HIGH_HPH; #endif else plug_type = MBHC_PLUG_TYPE_HEADSET; @@ -1087,6 +1090,9 @@ exit: if (mbhc->mbhc_cb->hph_pull_down_ctrl) mbhc->mbhc_cb->hph_pull_down_ctrl(codec, true); + /* enable surge protection */ + WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_EN_SURGE_PROTECTION_HPHL, 1); + WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_EN_SURGE_PROTECTION_HPHR, 1); mbhc->mbhc_cb->lock_sleep(mbhc, false); pr_debug("%s: leave\n", __func__); diff --git a/techpack/audio/4.0/asoc/codecs/wcd-mbhc-v2.c b/techpack/audio/4.0/asoc/codecs/wcd-mbhc-v2.c index f44e7a94bc75..9c785306fe37 100755 --- a/techpack/audio/4.0/asoc/codecs/wcd-mbhc-v2.c +++ b/techpack/audio/4.0/asoc/codecs/wcd-mbhc-v2.c @@ -88,8 +88,7 @@ static void wcd_program_hs_vref(struct wcd_mbhc *mbhc) struct snd_soc_codec *codec = mbhc->codec; u32 reg_val; - plug_type_cfg = WCD_MBHC_CAL_PLUG_TYPE_PTR( - mbhc->mbhc_cfg->calibration); + plug_type_cfg = WCD_MBHC_CAL_PLUG_TYPE_PTR(mbhc->mbhc_cfg->calibration); reg_val = ((plug_type_cfg->v_hs_max - HS_VREF_MIN_VAL) / 100); dev_dbg(codec->dev, "%s: reg_val = %x\n", __func__, reg_val); diff --git a/techpack/audio/4.0/asoc/codecs/wcd938x/internal.h b/techpack/audio/4.0/asoc/codecs/wcd938x/internal.h index 65490f88f173..e29bfc987afb 100755 --- a/techpack/audio/4.0/asoc/codecs/wcd938x/internal.h +++ b/techpack/audio/4.0/asoc/codecs/wcd938x/internal.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 The Linux Foundation. All rights reserved. */ #ifndef _WCD938X_INTERNAL_H @@ -55,6 +55,7 @@ struct wcd938x_priv { struct device_node *wcd_rst_np; struct mutex micb_lock; + struct mutex wakeup_lock; s32 dmic_0_1_clk_cnt; s32 dmic_2_3_clk_cnt; s32 dmic_4_5_clk_cnt; @@ -66,6 +67,7 @@ struct wcd938x_priv { struct wcd938x_mbhc *mbhc; u32 hph_mode; + u32 cfilt_val; u32 tx_mode[TX_ADC_MAX]; bool comp1_enable; bool comp2_enable; @@ -101,6 +103,7 @@ struct wcd938x_priv { int flyback_cur_det_disable; int ear_rx_path; bool dev_up; + int micb_enabled[WCD938X_MAX_MICBIAS]; }; struct wcd938x_micbias_setting { diff --git a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-mbhc.c b/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-mbhc.c index d09501d9dadb..d6c32054ce3f 100755 --- a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-mbhc.c +++ b/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x-mbhc.c @@ -556,12 +556,6 @@ static void wcd938x_wcd_mbhc_calc_impedance(struct wcd_mbhc *mbhc, uint32_t *zl, regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MBHC_MECH, 0x01, 0x00); - /* Disable surge protection before impedance detection. - * This is done to give correct value for high impedance. - */ - regmap_update_bits(wcd938x->regmap, - WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0x00); - /* First get impedance on Left */ d1 = d1_a[1]; zdet_param_ptr = &zdet_param[1]; @@ -689,9 +683,6 @@ right_ch_impedance: mbhc->hph_type = WCD_MBHC_HPH_MONO; } - /* Enable surge protection again after impedance detection */ - regmap_update_bits(wcd938x->regmap, - WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0xC0); zdet_complete: snd_soc_write(codec, WCD938X_ANA_MBHC_BTN5, reg0); snd_soc_write(codec, WCD938X_ANA_MBHC_BTN6, reg1); diff --git a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x.c b/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x.c index 9120abc6db80..83adf9d8fb8f 100755 --- a/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x.c +++ b/techpack/audio/4.0/asoc/codecs/wcd938x/wcd938x.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 The Linux Foundation. All rights reserved. */ #include <linux/module.h> @@ -41,6 +41,10 @@ #define ADC_MODE_VAL_ULP2 0x0B #define NUM_ATTEMPTS 5 +#define DAPM_MICBIAS1_STANDALONE "MIC BIAS1 Standalone" +#define DAPM_MICBIAS2_STANDALONE "MIC BIAS2 Standalone" +#define DAPM_MICBIAS3_STANDALONE "MIC BIAS3 Standalone" +#define DAPM_MICBIAS4_STANDALONE "MIC BIAS4 Standalone" enum { CODEC_TX = 0, @@ -2145,6 +2149,54 @@ static int wcd938x_codec_enable_micbias_pullup(struct snd_soc_dapm_widget *w, return __wcd938x_codec_enable_micbias_pullup(w, event); } +static int wcd938x_wakeup(void *handle, bool enable) +{ + struct wcd938x_priv *priv; + int ret = 0; + + if (!handle) { + pr_err("%s: NULL handle\n", __func__); + return -EINVAL; + } + priv = (struct wcd938x_priv *)handle; + if (!priv->tx_swr_dev) { + pr_err("%s: tx swr dev is NULL\n", __func__); + return -EINVAL; + } + mutex_lock(&priv->wakeup_lock); + if (enable) + ret = swr_device_wakeup_vote(priv->tx_swr_dev); + else + ret = swr_device_wakeup_unvote(priv->tx_swr_dev); + mutex_unlock(&priv->wakeup_lock); + + return ret; +} + +static int wcd938x_codec_force_enable_micbias(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, + int event) +{ + int ret = 0; + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); + + switch (event) { + case SND_SOC_DAPM_PRE_PMU: + wcd938x_wakeup(wcd938x, true); + ret = __wcd938x_codec_enable_micbias(w, SND_SOC_DAPM_PRE_PMU); + wcd938x_wakeup(wcd938x, false); + break; + case SND_SOC_DAPM_POST_PMD: + wcd938x_wakeup(wcd938x, true); + ret = __wcd938x_codec_enable_micbias(w, SND_SOC_DAPM_POST_PMD); + wcd938x_wakeup(wcd938x, false); + break; + } + + return ret; +} + static inline int wcd938x_tx_path_get(const char *wname, unsigned int *path_num) { @@ -2243,6 +2295,34 @@ static int wcd938x_tx_mode_put(struct snd_kcontrol *kcontrol, return 0; } +static int wcd938x_micb2_cfilt_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *component = snd_soc_kcontrol_codec(kcontrol); + struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(component); + + ucontrol->value.integer.value[0] = wcd938x->cfilt_val; + return 0; +} + +static int wcd938x_micb2_cfilt_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *component = snd_soc_kcontrol_codec(kcontrol); + struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(component); + u32 cfilt_val; + + cfilt_val = ucontrol->value.enumerated.item[0]; + + if (cfilt_val) + snd_soc_update_bits(component, WCD938X_MICB2_TEST_CTL_3, 0xFF, 0x24); + else + snd_soc_update_bits(component, WCD938X_MICB2_TEST_CTL_3, 0xFF, 0xA4); + + wcd938x->cfilt_val = cfilt_val; + return 0; +} + static int wcd938x_rx_hph_mode_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { @@ -2462,6 +2542,99 @@ static int wcd938x_bcs_put(struct snd_kcontrol *kcontrol, return 0; } +/* + * wcd938x_codec_enable_standalone_micbias - enable micbias standalone + * @codec: pointer to codec instance + * @micb_num: number of micbias to be enabled + * @enable: true to enable micbias or false to disable + * + * This function is used to enable micbias (1, 2, 3 or 4) during + * standalone independent of whether TX use-case is running or not + * + * Return: error code in case of failure or 0 for success + */ + +int wcd938x_codec_enable_standalone_micbias(struct snd_soc_codec *codec, + int micb_num, + bool enable) +{ + const char * const micb_names[] = { + DAPM_MICBIAS1_STANDALONE, DAPM_MICBIAS2_STANDALONE, + DAPM_MICBIAS3_STANDALONE, DAPM_MICBIAS4_STANDALONE + }; + int micb_index = micb_num - 1; + int rc; + + if (!codec) { + pr_err("%s: Codec memory is NULL\n", __func__); + return -EINVAL; + } + + if ((micb_index < 0) || (micb_index > WCD938X_MAX_MICBIAS - 1)) { + dev_err(codec->dev, "%s: Invalid micbias index, micb_ind:%d\n", + __func__, micb_index); + return -EINVAL; + } + + if (enable) + rc = snd_soc_dapm_force_enable_pin_unlocked( + snd_soc_codec_get_dapm(codec), + micb_names[micb_index]); + else + rc = snd_soc_dapm_disable_pin_unlocked( + snd_soc_codec_get_dapm(codec), + micb_names[micb_index]); + + if (!rc) + snd_soc_dapm_sync(snd_soc_codec_get_dapm(codec)); + else + dev_err(codec->dev, "%s: micbias%d force %s pin failed\n", + __func__, micb_num, (enable ? "enable" : "disable")); + + return rc; +} +EXPORT_SYMBOL(wcd938x_codec_enable_standalone_micbias); + +static int wcd938x_codec_get_micb(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + int micb_num = ((struct soc_multi_mixer_control *) + kcontrol->private_value)->shift; + struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.integer.value[0] = wcd938x->micb_enabled[micb_num - 1]; + return 0; +} + +static int wcd938x_codec_set_micb(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + int micb_num = ((struct soc_multi_mixer_control *) + kcontrol->private_value)->shift; + int value = ucontrol->value.integer.value[0]; + bool enable; + int ret; + struct wcd938x_priv *wcd938x = snd_soc_codec_get_drvdata(codec); + + if ((micb_num != MIC_BIAS_1) && (micb_num != MIC_BIAS_2) && + (micb_num != MIC_BIAS_3) && (micb_num != MIC_BIAS_4)) + return -EINVAL; + + enable = !!value; + ret = wcd938x_codec_enable_standalone_micbias(codec, micb_num, + enable); + if (ret) { + dev_err(codec->dev, "%s: Failed to enable standalone micb:%d\n", + __func__, micb_num); + return ret; + } + + wcd938x->micb_enabled[micb_num - 1] = enable; + return ret; +} + static const char * const tx_mode_mux_text_wcd9380[] = { "ADC_INVALID", "ADC_HIFI", "ADC_LO_HIF", "ADC_NORMAL", "ADC_LP", }; @@ -2485,6 +2658,10 @@ static const char * const rx_hph_mode_mux_text_wcd9380[] = { "CLS_AB_LOHIFI", }; +static const char * const micb2_cfilt_en_mux_text_wcd9380[] = { + "Enable", "Disable", +}; + static const char * const wcd938x_ear_pa_gain_text[] = { "G_6_DB", "G_4P5_DB", "G_3_DB", "G_1P5_DB", "G_0_DB", "G_M1P5_DB", "G_M3_DB", "G_M4P5_DB", @@ -2493,6 +2670,10 @@ static const char * const wcd938x_ear_pa_gain_text[] = { "G_M15_DB", "G_M16P5_DB", "G_M18_DB", }; +static const struct soc_enum micb2_cfilt_en_mux_enum_wcd9380 = + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(micb2_cfilt_en_mux_text_wcd9380), + micb2_cfilt_en_mux_text_wcd9380); + static const struct soc_enum rx_hph_mode_mux_enum_wcd9380 = SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text_wcd9380), rx_hph_mode_mux_text_wcd9380); @@ -2516,6 +2697,9 @@ static const struct snd_kcontrol_new wcd9380_snd_controls[] = { SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum_wcd9380, wcd938x_rx_hph_mode_get, wcd938x_rx_hph_mode_put), + SOC_ENUM_EXT("MICB2 CFILT EN", micb2_cfilt_en_mux_enum_wcd9380, + wcd938x_micb2_cfilt_get, wcd938x_micb2_cfilt_put), + SOC_ENUM_EXT("TX0 MODE", tx_mode_mux_enum_wcd9380, wcd938x_tx_mode_get, wcd938x_tx_mode_put), SOC_ENUM_EXT("TX1 MODE", tx_mode_mux_enum_wcd9380, @@ -2561,6 +2745,14 @@ static const struct snd_kcontrol_new wcd938x_snd_controls[] = { analog_gain), SOC_SINGLE_TLV("ADC4 Volume", WCD938X_ANA_TX_CH4, 0, 20, 0, analog_gain), + SOC_SINGLE_EXT("MIC BIAS1 Standalone", SND_SOC_NOPM, MIC_BIAS_1, 1, 0, + wcd938x_codec_get_micb, wcd938x_codec_set_micb), + SOC_SINGLE_EXT("MIC BIAS2 Standalone", SND_SOC_NOPM, MIC_BIAS_2, 1, 0, + wcd938x_codec_get_micb, wcd938x_codec_set_micb), + SOC_SINGLE_EXT("MIC BIAS3 Standalone", SND_SOC_NOPM, MIC_BIAS_3, 1, 0, + wcd938x_codec_get_micb, wcd938x_codec_set_micb), + SOC_SINGLE_EXT("MIC BIAS4 Standalone", SND_SOC_NOPM, MIC_BIAS_4, 1, 0, + wcd938x_codec_get_micb, wcd938x_codec_set_micb), }; static const struct snd_kcontrol_new adc1_switch[] = { @@ -2833,6 +3025,19 @@ static const struct snd_soc_dapm_widget wcd938x_dapm_widgets[] = { SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), + SND_SOC_DAPM_SUPPLY(DAPM_MICBIAS1_STANDALONE, SND_SOC_NOPM, 0, 0, + wcd938x_codec_force_enable_micbias, + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), + SND_SOC_DAPM_SUPPLY(DAPM_MICBIAS2_STANDALONE, SND_SOC_NOPM, 0, 0, + wcd938x_codec_force_enable_micbias, + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), + SND_SOC_DAPM_SUPPLY(DAPM_MICBIAS3_STANDALONE, SND_SOC_NOPM, 0, 0, + wcd938x_codec_force_enable_micbias, + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), + SND_SOC_DAPM_SUPPLY(DAPM_MICBIAS4_STANDALONE, SND_SOC_NOPM, 0, 0, + wcd938x_codec_force_enable_micbias, + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), + SND_SOC_DAPM_SUPPLY("VDD_BUCK", SND_SOC_NOPM, 0, 0, wcd938x_codec_enable_vdd_buck, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), @@ -3761,25 +3966,6 @@ static int wcd938x_add_slave_codecs(struct device *dev, return 0; } -static int wcd938x_wakeup(void *handle, bool enable) -{ - struct wcd938x_priv *priv; - - if (!handle) { - pr_err("%s: NULL handle\n", __func__); - return -EINVAL; - } - priv = (struct wcd938x_priv *)handle; - if (!priv->tx_swr_dev) { - pr_err("%s: tx swr dev is NULL\n", __func__); - return -EINVAL; - } - if (enable) - return swr_device_wakeup_vote(priv->tx_swr_dev); - else - return swr_device_wakeup_unvote(priv->tx_swr_dev); -} - static int wcd938x_probe(struct platform_device *pdev) { struct component_match *match = NULL; @@ -3857,6 +4043,7 @@ static int wcd938x_probe(struct platform_device *pdev) goto err; } + mutex_init(&wcd938x->wakeup_lock); mutex_init(&wcd938x->micb_lock); ret = wcd938x_add_slave_codecs(dev, &match); if (ret) @@ -3871,6 +4058,7 @@ static int wcd938x_probe(struct platform_device *pdev) err_lock_init: mutex_destroy(&wcd938x->micb_lock); + mutex_destroy(&wcd938x->wakeup_lock); err: return ret; } @@ -3882,6 +4070,7 @@ static int wcd938x_remove(struct platform_device *pdev) wcd938x = platform_get_drvdata(pdev); component_master_del(&pdev->dev, &wcd938x_comp_ops); mutex_destroy(&wcd938x->micb_lock); + mutex_destroy(&wcd938x->wakeup_lock); dev_set_drvdata(&pdev->dev, NULL); return 0; diff --git a/techpack/audio/4.0/config/sm7125_gta4xlve.conf b/techpack/audio/4.0/config/sm7125_gta4xlve.conf new file mode 100755 index 000000000000..88c6260bf181 --- /dev/null +++ b/techpack/audio/4.0/config/sm7125_gta4xlve.conf @@ -0,0 +1,52 @@ +CONFIG_PINCTRL_LPI=y +CONFIG_AUDIO_EXT_CLK=y +CONFIG_SND_SOC_WCD9XXX_V2=y +CONFIG_SND_SOC_WCD_MBHC=y +#CONFIG_SND_SOC_WSA881X=y +#CONFIG_WCD9XXX_CODEC_CORE=y +CONFIG_WCD9XXX_CODEC_CORE_V2=y +CONFIG_MSM_CDC_PINCTRL=y +CONFIG_MSM_QDSP6V2_CODECS=y +#CONFIG_MSM_ULTRASOUND=y +CONFIG_MSM_QDSP6_APRV2_RPMSG=y +CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y +CONFIG_MSM_ADSP_LOADER=y +CONFIG_REGMAP_SWR=y +CONFIG_MSM_QDSP6_SSR=y +CONFIG_MSM_QDSP6_PDR=y +CONFIG_MSM_QDSP6_NOTIFIER=y +CONFIG_SND_SOC_MSM_HOSTLESS_PCM=y +CONFIG_SOUNDWIRE=y +CONFIG_SOUNDWIRE_MSTR_CTRL=y +CONFIG_SND_SOC_WCD_MBHC_ADC=y +CONFIG_SND_SOC_QDSP6V2=y +CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=y +CONFIG_QTI_PP=y +CONFIG_SND_HWDEP_ROUTING=y +CONFIG_SND_SOC_MSM_STUB=y +CONFIG_MSM_AVTIMER=y +CONFIG_SND_SOC_BOLERO=y +#CONFIG_WSA_MACRO=y +CONFIG_VA_MACRO=y +CONFIG_RX_MACRO=y +CONFIG_TX_MACRO=y +CONFIG_SND_SOC_WCD_IRQ=y +#CONFIG_SND_SOC_WCD937X=y +#CONFIG_SND_SOC_WCD937X_SLAVE=y +CONFIG_SND_SOC_WCD938X=y +CONFIG_SND_SOC_WCD938X_SLAVE=y +CONFIG_SND_SOC_ATOLL=y +CONFIG_SND_EVENT=y +CONFIG_TDM_DISABLE=y +#CONFIG_MI2S_DISABLE=y +CONFIG_AUXPCM_DISABLE=y +CONFIG_DIGITAL_CDC_RSC_MGR=y +CONFIG_PLATFORM_QCOM=y +CONFIG_SND_SOC_TAS256x=y +CONFIG_TAS25XX_ALGO=y +CONFIG_TAS256X_REGMAP=y +CONFIG_TAS256X_CODEC=y +CONFIG_TAS256X_MISC=y +CONFIG_TAS25XX_CALIB_VAL_BIG=y +CONFIG_SEC_SND_PRIMARY=y +CONFIG_SEC_SND_ADAPTATION=y diff --git a/techpack/audio/4.0/config/sm7125_gta4xlve.h b/techpack/audio/4.0/config/sm7125_gta4xlve.h new file mode 100755 index 000000000000..92f47ed43060 --- /dev/null +++ b/techpack/audio/4.0/config/sm7125_gta4xlve.h @@ -0,0 +1,58 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. + */ + +#define CONFIG_PINCTRL_LPI 1 +#define CONFIG_AUDIO_EXT_CLK 1 +#define CONFIG_SND_SOC_WCD9XXX_V2 1 +#define CONFIG_SND_SOC_WCD_MBHC 1 +//#define CONFIG_SND_SOC_WSA881X 1 +//#define CONFIG_WCD9XXX_CODEC_CORE 1 +#define CONFIG_WCD9XXX_CODEC_CORE_V2 1 +#define CONFIG_MSM_CDC_PINCTRL 1 +#define CONFIG_MSM_QDSP6V2_CODECS 1 +//#define CONFIG_MSM_ULTRASOUND 1 +#define CONFIG_MSM_QDSP6_APRV2_RPMSG 1 +#define CONFIG_SND_SOC_MSM_QDSP6V2_INTF 1 +#define CONFIG_MSM_ADSP_LOADER 1 +#define CONFIG_REGMAP_SWR 1 +#define CONFIG_MSM_QDSP6_SSR 1 +#define CONFIG_MSM_QDSP6_PDR 1 +#define CONFIG_MSM_QDSP6_NOTIFIER 1 +#define CONFIG_SND_SOC_MSM_HOSTLESS_PCM 1 +#define CONFIG_SOUNDWIRE 1 +#define CONFIG_SOUNDWIRE_MSTR_CTRL 1 +#define CONFIG_SND_SOC_WCD_MBHC_ADC 1 +#define CONFIG_SND_SOC_QDSP6V2 1 +#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 +#define CONFIG_QTI_PP 1 +#define CONFIG_SND_HWDEP_ROUTING 1 +#define CONFIG_SND_SOC_MSM_STUB 1 +#define CONFIG_MSM_AVTIMER 1 +#define CONFIG_SND_SOC_BOLERO 1 +//#define CONFIG_WSA_MACRO 1 +#define CONFIG_VA_MACRO 1 +#define CONFIG_RX_MACRO 1 +#define CONFIG_TX_MACRO 1 +#define CONFIG_SND_SOC_WCD_IRQ 1 +//#define CONFIG_SND_SOC_WCD937X 1 +//#define CONFIG_SND_SOC_WCD937X_SLAVE 1 +#define CONFIG_SND_SOC_WCD938X 1 +#define CONFIG_SND_SOC_WCD938X_SLAVE 1 +#define CONFIG_SND_SOC_ATOLL 1 +#define CONFIG_SND_EVENT 1 +#define CONFIG_TDM_DISABLE 1 +//#define CONFIG_MI2S_DISABLE 1 +#define CONFIG_AUXPCM_DISABLE 1 +#define CONFIG_DIGITAL_CDC_RSC_MGR 1 +#define CONFIG_SND_SOC_WCD_MBHC_SLOW_DET 1 +#define CONFIG_SND_SOC_IMPED_SENSING 1 +#define CONFIG_SND_SOC_TAS256x 1 +#define CONFIG_TAS25XX_ALGO 1 +#define CONFIG_PLATFORM_QCOM 1 +#define CONFIG_TAS256X_REGMAP 1 +#define CONFIG_TAS256X_MISC 1 +#define CONFIG_TAS256X_CODEC 1 +#define CONFIG_TAS25XX_CALIB_VAL_BIG 1 +#define CONFIG_SEC_SND_PRIMARY 1 +#define CONFIG_SEC_SND_ADAPTATION 1 diff --git a/techpack/audio/4.0/dsp/q6audio_adaptation.c b/techpack/audio/4.0/dsp/q6audio_adaptation.c index c154ab9e026d..165320394b18 100755 --- a/techpack/audio/4.0/dsp/q6audio_adaptation.c +++ b/techpack/audio/4.0/dsp/q6audio_adaptation.c @@ -2511,6 +2511,100 @@ done: return ret; } +static int sec_voice_voice_isolation_cmd(struct voice_data *v, int mode) +{ + struct cvp_set_voice_isolation_cmd cvp_voice_isolation_cmd; + int ret = 0; + u16 cvp_handle; + + if (v == NULL) { + pr_err("%s: v is NULL\n", __func__); + return -EINVAL; + } + + if (this_cvp.apr == NULL) { + this_cvp.apr = apr_register("ADSP", "CVP", + q6audio_adaptation_cvp_callback, + SEC_ADAPTATAION_VOICE_SRC_PORT, + &this_cvp); + } + cvp_handle = voice_get_cvp_handle(v); + + /* fill in the header */ + cvp_voice_isolation_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, + APR_HDR_LEN(APR_HDR_SIZE), + APR_PKT_VER); + cvp_voice_isolation_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, + sizeof(cvp_voice_isolation_cmd) - APR_HDR_SIZE); + cvp_voice_isolation_cmd.hdr.src_port = SEC_ADAPTATAION_VOICE_SRC_PORT; + cvp_voice_isolation_cmd.hdr.dest_port = cvp_handle; + cvp_voice_isolation_cmd.hdr.token = 0; + cvp_voice_isolation_cmd.hdr.opcode = + q6common_is_instance_id_supported() ? VSS_ICOMMON_CMD_SET_UI_PROPERTY_V2 : + VSS_ICOMMON_CMD_SET_UI_PROPERTY; + cvp_voice_isolation_cmd.cvp_set_voice_isolation.module_id = + VOICE_MODULE_LVVEFQ_TX; + cvp_voice_isolation_cmd.cvp_set_voice_isolation.instance_id = + 0x8000; + cvp_voice_isolation_cmd.cvp_set_voice_isolation.param_id = + ENHANCED_VT_CALL_DYNAMIC_PARAM; + cvp_voice_isolation_cmd.cvp_set_voice_isolation.param_size = 4; + cvp_voice_isolation_cmd.cvp_set_voice_isolation.reserved = 0; + cvp_voice_isolation_cmd.cvp_set_voice_isolation.enable = mode; + cvp_voice_isolation_cmd.cvp_set_voice_isolation.reserved_field = 0; + + pr_info("%s: voice isolation info = %d\n", + __func__, cvp_voice_isolation_cmd.cvp_set_voice_isolation.enable); + + atomic_set(&this_cvp.state, 1); + ret = apr_send_pkt(this_cvp.apr, (uint32_t *) &cvp_voice_isolation_cmd); + if (ret < 0) { + pr_err("%s: Failed to send cvp_voice_isolation_cmd\n", + __func__); + goto fail; + } + + ret = wait_event_timeout(this_cvp.wait, + (atomic_read(&this_cvp.state) == 0), + msecs_to_jiffies(TIMEOUT_MS)); + if (!ret) { + pr_err("%s: wait_event timeout\n", __func__); + goto fail; + } + return 0; + +fail: + return ret; +} + +int sec_voice_isolation_mode(short mode) +{ + struct voice_data *v = NULL; + int ret = 0; + struct voice_session_itr itr; + + pr_debug("%s: mode is %d\n", __func__, mode); + + voice_itr_init(&itr, ALL_SESSION_VSID); + while (voice_itr_get_next_session(&itr, &v)) { + if (v != NULL) { + mutex_lock(&v->lock); + if (is_voc_state_active(v->voc_state) && + (v->lch_mode != VOICE_LCH_START) && + !v->disable_topology) + ret = sec_voice_voice_isolation_cmd(v, mode); + mutex_unlock(&v->lock); + } else { + pr_err("%s: invalid session\n", __func__); + ret = -EINVAL; + break; + } + } + pr_debug("%s: Exit, ret=%d\n", __func__, ret); + + return ret; +} + int sec_voice_get_loopback_enable(void) { return loopback_mode; @@ -2740,6 +2834,30 @@ static int sec_remote_mic_vol_put(struct snd_kcontrol *kcontrol, return sec_afe_remote_mic_vol(volumeindex); } +static const char * const voice_isolate[] = { + "Standard", "VoiceFocus", "AllSound" +}; + +static const struct soc_enum sec_voice_isolation_enum[] = { + SOC_ENUM_SINGLE_EXT(3, voice_isolate), +}; + +static int sec_voice_isolation_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return 0; +} + +static int sec_voice_isolation_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int mode = ucontrol->value.integer.value[0]; + + pr_debug("%s: mode = %d\n", __func__, mode); + + return sec_voice_isolation_mode(mode); +} + /*******************************************************/ /*/////////////////////// COMMON //////////////////////*/ /*******************************************************/ @@ -2813,6 +2931,9 @@ static const struct snd_kcontrol_new samsung_solution_mixer_controls[] = { SOC_SINGLE_EXT("Listenback Enable", SND_SOC_NOPM, 0, 65535, 0, sec_audio_sa_listenback_enable_get, sec_audio_sa_listenback_enable_put), + SOC_ENUM_EXT("Voice Isolation Mode", sec_voice_isolation_enum[0], + sec_voice_isolation_get, + sec_voice_isolation_put), }; static int q6audio_adaptation_platform_probe(struct snd_soc_platform *platform) diff --git a/techpack/audio/4.0/include/dsp/sec_adaptation.h b/techpack/audio/4.0/include/dsp/sec_adaptation.h index 644b918095cb..b10402d8402c 100755 --- a/techpack/audio/4.0/include/dsp/sec_adaptation.h +++ b/techpack/audio/4.0/include/dsp/sec_adaptation.h @@ -204,6 +204,7 @@ int afe_set_remote_mic_vol(int port_id, int vol_index); #define TX_VOICE_SOLOMONVOICE 0x100010A0 #define VOICE_ECHO_REF_LCH_MUTE_PARAM 0x10001028 #define VOICE_NREC_MODE_DYNAMIC_PARAM 0x10001029 +#define ENHANCED_VT_CALL_DYNAMIC_PARAM 0x1000102A #define VOICE_MODULE_SET_DEVICE 0x10041000 #define VOICE_MODULE_SET_DEVICE_PARAM 0x10041001 @@ -358,6 +359,11 @@ struct cvp_set_voice_remote_mic_cmd { struct vss_icommon_cmd_set_ui_property_v2_t cvp_set_voice_remote_mic; } __packed; +struct cvp_set_voice_isolation_cmd { + struct apr_hdr hdr; + struct vss_icommon_cmd_set_ui_property_v2_t cvp_set_voice_isolation; +} __packed; + void voice_sec_loopback_start_cmd(u32 session_id); void voice_sec_loopback_end_cmd(u32 session_id); diff --git a/techpack/audio/Makefile b/techpack/audio/Makefile index 6a6e5cbc5a74..e40bb9ec7942 100755 --- a/techpack/audio/Makefile +++ b/techpack/audio/Makefile @@ -30,6 +30,8 @@ else ifeq ($(PROJECT_NAME),$(filter $(PROJECT_NAME),m42q)) include $(srctree)/techpack/audio/4.0/config/sm7125_m42.conf else ifeq ($(PROJECT_NAME),$(filter $(PROJECT_NAME),a72q)) include $(srctree)/techpack/audio/4.0/config/sm7125_a72.conf +else ifeq ($(PROJECT_NAME),$(filter $(PROJECT_NAME),gta4xlve gta4xlvewifi)) +include $(srctree)/techpack/audio/4.0/config/sm7125_gta4xlve.conf else include $(srctree)/techpack/audio/4.0/config/atollauto.conf endif @@ -116,6 +118,9 @@ LINUXINCLUDE += \ else ifeq ($(PROJECT_NAME),$(filter $(PROJECT_NAME),a72q)) LINUXINCLUDE += \ -include $(srctree)/techpack/audio/4.0/config/sm7125_a72.h +else ifeq ($(PROJECT_NAME),$(filter $(PROJECT_NAME),gta4xlve gta4xlvewifi)) +LINUXINCLUDE += \ + -include $(srctree)/techpack/audio/4.0/config/sm7125_gta4xlve.h else LINUXINCLUDE += \ -include $(srctree)/techpack/audio/4.0/config/atollautoconf.h